From d58fbdd97ac8e13d84b93bd0613cee920654ce49 Mon Sep 17 00:00:00 2001 From: TheophileDiot Date: Wed, 22 Jul 2026 17:29:58 +0200 Subject: [PATCH 01/25] fix(backup): support MySQL 9 and MariaDB 12 Use compatible clients, TLS handling, and privilege defaults across database versions. --- CHANGELOG.md | 1 + docs/advanced.md | 68 ++----------------- docs/concepts.md | 14 ++-- docs/de/advanced.md | 68 ++----------------- docs/de/concepts.md | 14 ++-- docs/es/advanced.md | 68 ++----------------- docs/es/concepts.md | 14 ++-- docs/fr/advanced.md | 68 ++----------------- docs/fr/concepts.md | 14 ++-- docs/zh/advanced.md | 68 ++----------------- docs/zh/concepts.md | 14 ++-- src/common/core/backup/backup.py | 52 ++++++++++---- tests/core/backup/docker-compose.mariadb.yml | 3 +- tests/core/backup/docker-compose.mysql.yml | 3 +- tests/core/backup/docker-compose.postgres.yml | 2 +- tests/core/backup/main.py | 8 +++ 16 files changed, 105 insertions(+), 374 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 699b5f4a70..9872565c2a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,7 @@ ## v1.6.14~rc1 - 2026/07/?? - [BUGFIX] `mtls`: the Scheduler now validates the client CA bundle and CRL, caches them, and distributes them to every instance instead of shipping the raw configured path straight into the NGINX configuration, so a Scheduler-only mount works as documented instead of causing "cannot load certificate" errors on instances that cannot read that path. Adds `MTLS_CA_CERTIFICATE_DATA` and `MTLS_CRL_DATA` to supply either file inline as base64 or plaintext PEM. +- [BUGFIX] `backup`: support MySQL 9 and MariaDB 12 backup/restore with current authentication, TLS, and privilege defaults while preserving compatibility with older servers; refresh the documented database compatibility matrix, including PostgreSQL 18. - [BUGFIX] `ui`: fix plugin hook loading and chaining, and purge unavailable PRO plugin pages after license loss. - [BUGFIX] `letsencrypt`: quarantine broken renewal lineages and persist the cleaned cache before Certbot runs. (Fixes #3733) - [UI] Reports and Bans pages: show unknown countries as not applicable, and make exports and bulk actions honor active filters. (Fixes #3683, #3685) diff --git a/docs/advanced.md b/docs/advanced.md index 147c653c15..1ed0c5560b 100644 --- a/docs/advanced.md +++ b/docs/advanced.md @@ -3262,39 +3262,9 @@ You can also specify a custom S3 bucket for the backup by providing the `BACKUP_ docker exec -it -e BACKUP_S3_BUCKET=your-bucket-name bwcli plugin backup_s3 save ``` -!!! note "Specifications for MariaDB/MySQL" +!!! note "MariaDB/MySQL client compatibility" - In case you are using MariaDB/MySQL, you may encounter the following error when trying to backup your database: - - ```bash - caching_sha2_password could not be loaded: Error loading shared library /usr/lib/mariadb/plugin/caching_sha2_password.so - ``` - - To resolve this issue, you can execute the following command to change the authentication plugin to `mysql_native_password`: - - ```sql - ALTER USER 'yourusername'@'localhost' IDENTIFIED WITH mysql_native_password BY 'youpassword'; - ``` - - If you're using the Docker integration, you can add the following command to the `docker-compose.yml` file to automatically change the authentication plugin: - - === "MariaDB" - - ```yaml - bw-db: - image: mariadb: - command: --default-authentication-plugin=mysql_native_password --max-allowed-packet=67108864 - ... - ``` - - === "MySQL" - - ```yaml - bw-db: - image: mysql: - command: --default-authentication-plugin=mysql_native_password --max-allowed-packet=67108864 - ... - ``` + BunkerWeb's Docker images include the MariaDB Connector/C authentication plugins required by MySQL's `caching_sha2_password`. On Linux, if the client reports that `caching_sha2_password` could not be loaded, install your distribution's MariaDB Connector/C authentication plugins or a compatible MySQL client. Do not downgrade the database account to `mysql_native_password`, which is unavailable in MySQL `v9`. #### Manual restore @@ -3513,39 +3483,9 @@ To manually create a migration file, execute the following command: This command will create a backup of your database and store it in the backup directory specified in the command. -!!! note "Specifications for MariaDB/MySQL" +!!! note "MariaDB/MySQL client compatibility" - In case you are using MariaDB/MySQL, you may encounter the following error when trying to backup your database: - - ```bash - caching_sha2_password could not be loaded: Error loading shared library /usr/lib/mariadb/plugin/caching_sha2_password.so - ``` - - To resolve this issue, you can execute the following command to change the authentication plugin to `mysql_native_password`: - - ```sql - ALTER USER 'yourusername'@'localhost' IDENTIFIED WITH mysql_native_password BY 'youpassword'; - ``` - - If you're using the Docker integration, you can add the following command to the `docker-compose.yml` file to automatically change the authentication plugin: - - === "MariaDB" - - ```yaml - bw-db: - image: mariadb: - command: --default-authentication-plugin=mysql_native_password --max-allowed-packet=67108864 - ... - ``` - - === "MySQL" - - ```yaml - bw-db: - image: mysql: - command: --default-authentication-plugin=mysql_native_password --max-allowed-packet=67108864 - ... - ``` + BunkerWeb's Docker images include the MariaDB Connector/C authentication plugins required by MySQL's `caching_sha2_password`. On Linux, if the client reports that `caching_sha2_password` could not be loaded, install your distribution's MariaDB Connector/C authentication plugins or a compatible MySQL client. Do not downgrade the database account to `mysql_native_password`, which is unavailable in MySQL `v9`. ### Initialize a migration diff --git a/docs/concepts.md b/docs/concepts.md index 08f62c844f..a1d591fd69 100644 --- a/docs/concepts.md +++ b/docs/concepts.md @@ -163,15 +163,15 @@ By specifying the appropriate database URI in the configuration, you can seamles ### Database compatibility matrix -| Integration | PostgreSQL | MariaDB | MySQL | SQLite | -| :----------------- | :---------------------------------------- | :------------------ | :----------------- | :---------- | -| **Docker** | ✅ `v18` and earlier (all-in-one: ✅ `v17`) | ✅ `v11` and earlier | ✅ `v9` and earlier | ✅ Supported | -| **Kubernetes** | ✅ `v18` and earlier | ✅ `v11` and earlier | ✅ `v9` and earlier | ✅ Supported | -| **Autoconf** | ✅ `v18` and earlier | ✅ `v11` and earlier | ✅ `v9` and earlier | ✅ Supported | -| **Linux packages** | See notes below | See notes below | See notes below | ✅ Supported | +| Integration | PostgreSQL | MariaDB | MySQL | SQLite | +| :----------------- | :------------------ | :------------------ | :----------------- | :---------- | +| **Docker** | ✅ `v18` and earlier | ✅ `v12` and earlier | ✅ `v9` and earlier | ✅ Supported | +| **Kubernetes** | ✅ `v18` and earlier | ✅ `v12` and earlier | ✅ `v9` and earlier | ✅ Supported | +| **Autoconf** | ✅ `v18` and earlier | ✅ `v12` and earlier | ✅ `v9` and earlier | ✅ Supported | +| **Linux packages** | See notes below | See notes below | See notes below | ✅ Supported | !!! info "Notes" - - **PostgreSQL**: Alpine packages now ship with the `v18` client, so `v18` and earlier are supported out of the box; the all-in-one image still embeds `v17`, so `v18` is unsupported there. + - **PostgreSQL**: Alpine-based images, including all-in-one, now ship with the `v18` client, so `v18` and earlier are supported out of the box. - **Linux**: Support depends on your distribution's packages. If needed, you can install database clients manually from vendor repositories (RHEL typically requires this). - **SQLite**: Ships with the packages and is ready to use. diff --git a/docs/de/advanced.md b/docs/de/advanced.md index d9d760f0b5..99285d6098 100644 --- a/docs/de/advanced.md +++ b/docs/de/advanced.md @@ -3261,39 +3261,9 @@ Sie können auch einen benutzerdefinierten S3-Bucket für die Sicherung angeben, docker exec -it -e BACKUP_S3_BUCKET=your-bucket-name bwcli plugin backup_s3 save ``` -!!! note "Spezifikationen für MariaDB/MySQL" +!!! note "MariaDB/MySQL-Client-Kompatibilität" - Falls Sie MariaDB/MySQL verwenden, kann beim Versuch, Ihre Datenbank zu sichern, der folgende Fehler auftreten: - - ```bash - caching_sha2_password could not be loaded: Error loading shared library /usr/lib/mariadb/plugin/caching_sha2_password.so - ``` - - Um dieses Problem zu lösen, können Sie den folgenden Befehl ausführen, um das Authentifizierungs-Plugin auf `mysql_native_password` zu ändern: - - ```sql - ALTER USER 'yourusername'@'localhost' IDENTIFIED WITH mysql_native_password BY 'youpassword'; - ``` - - Wenn Sie die Docker-Integration verwenden, können Sie den folgenden Befehl zur `docker-compose.yml`-Datei hinzufügen, um das Authentifizierungs-Plugin automatisch zu ändern: - - === "MariaDB" - - ```yaml - bw-db: - image: mariadb: - command: --default-authentication-plugin=mysql_native_password --max-allowed-packet=67108864 - ... - ``` - - === "MySQL" - - ```yaml - bw-db: - image: mysql: - command: --default-authentication-plugin=mysql_native_password --max-allowed-packet=67108864 - ... - ``` + Die Docker-Images von BunkerWeb enthalten die von MySQLs `caching_sha2_password` benötigten Authentifizierungs-Plugins von MariaDB Connector/C. Wenn der Client unter Linux meldet, dass `caching_sha2_password` nicht geladen werden konnte, installieren Sie die MariaDB Connector/C-Authentifizierungs-Plugins Ihrer Distribution oder einen kompatiblen MySQL-Client. Stellen Sie das Datenbankkonto nicht auf `mysql_native_password` um, da dieses Plugin in MySQL `v9` nicht verfügbar ist. #### Manuelle Wiederherstellung @@ -3523,39 +3493,9 @@ Um eine Migrationsdatei manuell zu erstellen, führen Sie den folgenden Befehl a Dieser Befehl erstellt eine Sicherung Ihrer Datenbank und speichert sie im im Befehl angegebenen Sicherungsverzeichnis. -!!! note "Spezifikationen für MariaDB/MySQL" +!!! note "MariaDB/MySQL-Client-Kompatibilität" - Falls Sie MariaDB/MySQL verwenden, kann beim Versuch, Ihre Datenbank zu sichern, der folgende Fehler auftreten: - - ```bash - caching_sha2_password could not be loaded: Error loading shared library /usr/lib/mariadb/plugin/caching_sha2_password.so - ``` - - Um dieses Problem zu lösen, können Sie den folgenden Befehl ausführen, um das Authentifizierungs-Plugin auf `mysql_native_password` zu ändern: - - ```sql - ALTER USER 'yourusername'@'localhost' IDENTIFIED WITH mysql_native_password BY 'youpassword'; - ``` - - Wenn Sie die Docker-Integration verwenden, können Sie den folgenden Befehl zur `docker-compose.yml`-Datei hinzufügen, um das Authentifizierungs-Plugin automatisch zu ändern: - - === "MariaDB" - - ```yaml - bw-db: - image: mariadb: - command: --default-authentication-plugin=mysql_native_password --max-allowed-packet=67108864 - ... - ``` - - === "MySQL" - - ```yaml - bw-db: - image: mysql: - command: --default-authentication-plugin=mysql_native_password --max-allowed-packet=67108864 - ... - ``` + Die Docker-Images von BunkerWeb enthalten die von MySQLs `caching_sha2_password` benötigten Authentifizierungs-Plugins von MariaDB Connector/C. Wenn der Client unter Linux meldet, dass `caching_sha2_password` nicht geladen werden konnte, installieren Sie die MariaDB Connector/C-Authentifizierungs-Plugins Ihrer Distribution oder einen kompatiblen MySQL-Client. Stellen Sie das Datenbankkonto nicht auf `mysql_native_password` um, da dieses Plugin in MySQL `v9` nicht verfügbar ist. ### Eine Migration initialisieren diff --git a/docs/de/concepts.md b/docs/de/concepts.md index dcb6db878c..f2ee4b6dc0 100644 --- a/docs/de/concepts.md +++ b/docs/de/concepts.md @@ -163,15 +163,15 @@ Durch Angabe des entsprechenden Datenbank-URI in der Konfiguration können Sie B ### Datenbank-Kompatibilitätsmatrix -| Integration | PostgreSQL | MariaDB | MySQL | SQLite | -| :--------------- | :--------------------------------------- | :------------------- | :------------------- | :------------ | -| **Docker** | ✅ `v18` und früher (all-in-one: ✅ `v17`) | ✅ `v11` und früher | ✅ `v9` und früher | ✅ Unterstützt | -| **Kubernetes** | ✅ `v18` und früher | ✅ `v11` und früher | ✅ `v9` und früher | ✅ Unterstützt | -| **Autoconf** | ✅ `v18` und früher | ✅ `v11` und früher | ✅ `v9` und früher | ✅ Unterstützt | -| **Linux-Pakete** | Siehe Hinweise unten | Siehe Hinweise unten | Siehe Hinweise unten | ✅ Unterstützt | +| Integration | PostgreSQL | MariaDB | MySQL | SQLite | +| :--------------- | :----------------- | :------------------- | :------------------- | :------------ | +| **Docker** | ✅ `v18` und früher | ✅ `v12` und früher | ✅ `v9` und früher | ✅ Unterstützt | +| **Kubernetes** | ✅ `v18` und früher | ✅ `v12` und früher | ✅ `v9` und früher | ✅ Unterstützt | +| **Autoconf** | ✅ `v18` und früher | ✅ `v12` und früher | ✅ `v9` und früher | ✅ Unterstützt | +| **Linux-Pakete** | Siehe Hinweise unten | Siehe Hinweise unten | Siehe Hinweise unten | ✅ Unterstützt | !!! info "Hinweise" - - **PostgreSQL**: Alpine-basierte Pakete enthalten jetzt den `v18`-Client, daher werden `v18` und frühere Versionen standardmäßig unterstützt; das all-in-one-Image enthält weiterhin den `v17`-Client, daher wird `v18` dort nicht unterstützt. + - **PostgreSQL**: Alpine-basierte Images, einschließlich des all-in-one-Images, enthalten jetzt den `v18`-Client; daher werden `v18` und frühere Versionen standardmäßig unterstützt. - **Linux**: Die Unterstützung hängt von den Paketen Ihrer Distribution ab. Bei Bedarf können Sie Datenbank-Clients manuell aus den Hersteller-Repositorys installieren (dies ist bei RHEL normalerweise erforderlich). - **SQLite**: Wird mit den Paketen ausgeliefert und ist sofort einsatzbereit. diff --git a/docs/es/advanced.md b/docs/es/advanced.md index cf55436696..534128f13e 100644 --- a/docs/es/advanced.md +++ b/docs/es/advanced.md @@ -3261,39 +3261,9 @@ También puedes especificar un bucket S3 personalizado para la copia de segurida docker exec -it -e BACKUP_S3_BUCKET=your-bucket-name bwcli plugin backup_s3 save ``` -!!! note "Especificaciones para MariaDB/MySQL" +!!! note "Compatibilidad del cliente MariaDB/MySQL" - En caso de que estés usando MariaDB/MySQL, puedes encontrar el siguiente error al intentar hacer una copia de seguridad de tu base de datos: - - ```bash - caching_sha2_password could not be loaded: Error loading shared library /usr/lib/mariadb/plugin/caching_sha2_password.so - ``` - - Para resolver este problema, puedes ejecutar el siguiente comando para cambiar el plugin de autenticación a `mysql_native_password`: - - ```sql - ALTER USER 'yourusername'@'localhost' IDENTIFIED WITH mysql_native_password BY 'youpassword'; - ``` - - Si estás usando la integración de Docker, puedes agregar el siguiente comando al archivo `docker-compose.yml` para cambiar automáticamente el plugin de autenticación: - - === "MariaDB" - - ```yaml - bw-db: - image: mariadb: - command: --default-authentication-plugin=mysql_native_password --max-allowed-packet=67108864 - ... - ``` - - === "MySQL" - - ```yaml - bw-db: - image: mysql: - command: --default-authentication-plugin=mysql_native_password --max-allowed-packet=67108864 - ... - ``` + Las imágenes Docker de BunkerWeb incluyen los plugins de autenticación de MariaDB Connector/C que requiere `caching_sha2_password` de MySQL. En Linux, si el cliente indica que no se pudo cargar `caching_sha2_password`, instala los plugins de autenticación de MariaDB Connector/C de tu distribución o un cliente MySQL compatible. No cambies la cuenta de la base de datos a `mysql_native_password`, ya que no está disponible en MySQL `v9`. #### Restauración manual @@ -3523,39 +3493,9 @@ Para crear manualmente un archivo de migración, ejecuta el siguiente comando: Este comando creará una copia de seguridad de tu base de datos y la almacenará en el directorio de copia de seguridad especificado en el comando. -!!! note "Especificaciones para MariaDB/MySQL" +!!! note "Compatibilidad del cliente MariaDB/MySQL" - En caso de que estés usando MariaDB/MySQL, puedes encontrar el siguiente error al intentar hacer una copia de seguridad de tu base de datos: - - ```bash - caching_sha2_password could not be loaded: Error loading shared library /usr/lib/mariadb/plugin/caching_sha2_password.so - ``` - - Para resolver este problema, puedes ejecutar el siguiente comando para cambiar el plugin de autenticación a `mysql_native_password`: - - ```sql - ALTER USER 'yourusername'@'localhost' IDENTIFIED WITH mysql_native_password BY 'youpassword'; - ``` - - Si estás usando la integración de Docker, puedes agregar el siguiente comando al archivo `docker-compose.yml` para cambiar automáticamente el plugin de autenticación: - - === "MariaDB" - - ```yaml - bw-db: - image: mariadb: - command: --default-authentication-plugin=mysql_native_password --max-allowed-packet=67108864 - ... - ``` - - === "MySQL" - - ```yaml - bw-db: - image: mysql: - command: --default-authentication-plugin=mysql_native_password --max-allowed-packet=67108864 - ... - ``` + Las imágenes Docker de BunkerWeb incluyen los plugins de autenticación de MariaDB Connector/C que requiere `caching_sha2_password` de MySQL. En Linux, si el cliente indica que no se pudo cargar `caching_sha2_password`, instala los plugins de autenticación de MariaDB Connector/C de tu distribución o un cliente MySQL compatible. No cambies la cuenta de la base de datos a `mysql_native_password`, ya que no está disponible en MySQL `v9`. ### Iniciar una migración diff --git a/docs/es/concepts.md b/docs/es/concepts.md index 194c18cb11..b1ac33c102 100644 --- a/docs/es/concepts.md +++ b/docs/es/concepts.md @@ -163,15 +163,15 @@ Al especificar el URI de la base de datos apropiado en la configuración, puedes ### Matriz de compatibilidad de bases de datos -| Integración | PostgreSQL | MariaDB | MySQL | SQLite | -| :----------------- | :----------------------------------------- | :----------------------- | :----------------------- | :----------- | -| **Docker** | ✅ `v18` y anteriores (all-in-one: ✅ `v17`) | ✅ `v11` y anteriores | ✅ `v9` y anteriores | ✅ Compatible | -| **Kubernetes** | ✅ `v18` y anteriores | ✅ `v11` y anteriores | ✅ `v9` y anteriores | ✅ Compatible | -| **Autoconf** | ✅ `v18` y anteriores | ✅ `v11` y anteriores | ✅ `v9` y anteriores | ✅ Compatible | -| **Paquetes Linux** | Ver notas a continuación | Ver notas a continuación | Ver notas a continuación | ✅ Compatible | +| Integración | PostgreSQL | MariaDB | MySQL | SQLite | +| :----------------- | :-------------------- | :----------------------- | :----------------------- | :----------- | +| **Docker** | ✅ `v18` y anteriores | ✅ `v12` y anteriores | ✅ `v9` y anteriores | ✅ Compatible | +| **Kubernetes** | ✅ `v18` y anteriores | ✅ `v12` y anteriores | ✅ `v9` y anteriores | ✅ Compatible | +| **Autoconf** | ✅ `v18` y anteriores | ✅ `v12` y anteriores | ✅ `v9` y anteriores | ✅ Compatible | +| **Paquetes Linux** | Ver notas a continuación | Ver notas a continuación | Ver notas a continuación | ✅ Compatible | !!! info "Notas" - - **PostgreSQL**: Los paquetes basados en Alpine ahora incluyen el cliente `v18`, por lo que `v18` y versiones anteriores son compatibles de forma predeterminada; la imagen all-in-one sigue usando el cliente `v17`, por lo que `v18` no es compatible allí. + - **PostgreSQL**: Las imágenes basadas en Alpine, incluida all-in-one, incluyen ahora el cliente `v18`, por lo que `v18` y versiones anteriores son compatibles de forma predeterminada. - **Linux**: La compatibilidad depende de los paquetes de tu distribución. Si es necesario, puedes instalar los clientes de la base de datos manualmente desde los repositorios del proveedor (esto suele ser necesario en RHEL). - **SQLite**: Se entrega con los paquetes y está listo para usar. diff --git a/docs/fr/advanced.md b/docs/fr/advanced.md index 22532d8724..3a9a852936 100644 --- a/docs/fr/advanced.md +++ b/docs/fr/advanced.md @@ -3260,39 +3260,9 @@ Vous pouvez également spécifier un compartiment S3 personnalisé pour la sauve docker exec -it -e BACKUP_S3_BUCKET=your-bucket-name bwcli plugin backup_s3 save ``` -!!! note "Spécifications pour MariaDB/MySQL" +!!! note "Compatibilité du client MariaDB/MySQL" - Si vous utilisez MariaDB/MySQL, vous pouvez rencontrer l'erreur suivante lors de la sauvegarde de votre base de données : - - ```bash - caching_sha2_password could not be loaded: Error loading shared library /usr/lib/mariadb/plugin/caching_sha2_password.so - ``` - - Pour résoudre ce problème, vous pouvez exécuter la commande suivante pour changer le plugin d'authentification en `mysql_native_password` : - - ```sql - ALTER USER 'yourusername'@'localhost' IDENTIFIED WITH mysql_native_password BY 'youpassword'; - ``` - - Si vous utilisez l'intégration Docker, vous pouvez ajouter la commande suivante au fichier `docker-compose.yml` pour changer automatiquement le plugin d'authentification : - - === "MariaDB" - - ```yaml - bw-db: - image: mariadb: - command: --default-authentication-plugin=mysql_native_password --max-allowed-packet=67108864 - ... - ``` - - === "MySQL" - - ```yaml - bw-db: - image: mysql: - command: --default-authentication-plugin=mysql_native_password --max-allowed-packet=67108864 - ... - ``` + Les images Docker de BunkerWeb incluent les plugins d'authentification de MariaDB Connector/C requis par `caching_sha2_password` de MySQL. Sous Linux, si le client indique que `caching_sha2_password` n'a pas pu être chargé, installez les plugins d'authentification MariaDB Connector/C de votre distribution ou un client MySQL compatible. Ne basculez pas le compte de base de données vers `mysql_native_password`, qui n'est pas disponible dans MySQL `v9`. #### Restauration manuelle @@ -3522,39 +3492,9 @@ Pour créer manuellement un fichier de migration, exécutez la commande suivante Cette commande créera une sauvegarde de votre base de données et la stockera dans le répertoire de sauvegarde spécifié dans la commande. -!!! note "Spécifications pour MariaDB/MySQL" +!!! note "Compatibilité du client MariaDB/MySQL" - Si vous utilisez MariaDB/MySQL, vous pouvez rencontrer l'erreur suivante lors de la sauvegarde de votre base de données : - - ```bash - caching_sha2_password could not be loaded: Error loading shared library /usr/lib/mariadb/plugin/caching_sha2_password.so - ``` - - Pour résoudre ce problème, vous pouvez exécuter la commande suivante pour changer le plugin d'authentification en `mysql_native_password` : - - ```sql - ALTER USER 'yourusername'@'localhost' IDENTIFIED WITH mysql_native_password BY 'youpassword'; - ``` - - Si vous utilisez l'intégration Docker, vous pouvez ajouter la commande suivante au fichier `docker-compose.yml` pour changer automatiquement le plugin d'authentification : - - === "MariaDB" - - ```yaml - bw-db: - image: mariadb: - command: --default-authentication-plugin=mysql_native_password --max-allowed-packet=67108864 - ... - ``` - - === "MySQL" - - ```yaml - bw-db: - image: mysql: - command: --default-authentication-plugin=mysql_native_password --max-allowed-packet=67108864 - ... - ``` + Les images Docker de BunkerWeb incluent les plugins d'authentification de MariaDB Connector/C requis par `caching_sha2_password` de MySQL. Sous Linux, si le client indique que `caching_sha2_password` n'a pas pu être chargé, installez les plugins d'authentification MariaDB Connector/C de votre distribution ou un client MySQL compatible. Ne basculez pas le compte de base de données vers `mysql_native_password`, qui n'est pas disponible dans MySQL `v9`. ### Initialiser une migration diff --git a/docs/fr/concepts.md b/docs/fr/concepts.md index ebc58f7d34..95a547d6f8 100644 --- a/docs/fr/concepts.md +++ b/docs/fr/concepts.md @@ -163,15 +163,15 @@ En spécifiant l'URI de base de données appropriée dans la configuration, vous ### Matrice de compatibilité des bases de données -| Integration | PostgreSQL | MariaDB | MySQL | SQLite | -| :---------------- | :-------------------------------------------- | :------------------------ | :------------------------ | :--------------- | -| **Docker** | ✅ `v18` et antérieures (all-in-one : ✅ `v17`) | ✅ `v11` et antérieures | ✅ `v9` et antérieures | ✅ Pris en charge | -| **Kubernetes** | ✅ `v18` et antérieures | ✅ `v11` et antérieures | ✅ `v9` et antérieures | ✅ Pris en charge | -| **Autoconf** | ✅ `v18` et antérieures | ✅ `v11` et antérieures | ✅ `v9` et antérieures | ✅ Pris en charge | -| **Paquets Linux** | Voir les notes ci-dessous | Voir les notes ci-dessous | Voir les notes ci-dessous | ✅ Pris en charge | +| Integration | PostgreSQL | MariaDB | MySQL | SQLite | +| :---------------- | :----------------------- | :------------------------ | :------------------------ | :--------------- | +| **Docker** | ✅ `v18` et antérieures | ✅ `v12` et antérieures | ✅ `v9` et antérieures | ✅ Pris en charge | +| **Kubernetes** | ✅ `v18` et antérieures | ✅ `v12` et antérieures | ✅ `v9` et antérieures | ✅ Pris en charge | +| **Autoconf** | ✅ `v18` et antérieures | ✅ `v12` et antérieures | ✅ `v9` et antérieures | ✅ Pris en charge | +| **Paquets Linux** | Voir les notes ci-dessous | Voir les notes ci-dessous | Voir les notes ci-dessous | ✅ Pris en charge | !!! info "Remarques" - - **PostgreSQL** : les paquets basés sur Alpine incluent désormais le client `v18`, donc `v18` et les versions antérieures sont pris en charge par défaut ; l'image all-in-one embarque toujours le client `v17`, donc `v18` n'y est pas pris en charge. + - **PostgreSQL** : les images basées sur Alpine, y compris all-in-one, incluent désormais le client `v18` ; `v18` et les versions antérieures sont donc pris en charge par défaut. - **Linux** : La prise en charge dépend des paquets de votre distribution. Si nécessaire, vous pouvez installer les clients de base de données manuellement à partir des dépôts des fournisseurs (cela est généralement nécessaire pour RHEL). - **SQLite** : Est livré avec les paquets et est prêt à l'emploi. diff --git a/docs/zh/advanced.md b/docs/zh/advanced.md index 269e9e28c7..87bd9f0bda 100644 --- a/docs/zh/advanced.md +++ b/docs/zh/advanced.md @@ -3258,39 +3258,9 @@ S3 备份工具可以无缝地自动化数据保护,类似于社区备份插 docker exec -it -e BACKUP_S3_BUCKET=your-bucket-name bwcli plugin backup_s3 save ``` -!!! note "MariaDB/MySQL 的特别说明" +!!! note "MariaDB/MySQL 客户端兼容性" - 如果您正在使用 MariaDB/MySQL,在尝试备份数据库时可能会遇到以下错误: - - ```bash - caching_sha2_password could not be loaded: Error loading shared library /usr/lib/mariadb/plugin/caching_sha2_password.so - ``` - - 要解决此问题,您可以执行以下命令将身份验证插件更改为 `mysql_native_password`: - - ```sql - ALTER USER 'yourusername'@'localhost' IDENTIFIED WITH mysql_native_password BY 'youpassword'; - ``` - - 如果您正在使用 Docker 集成,可以将以下命令添加到 `docker-compose.yml` 文件中,以自动更改身份验证插件: - - === "MariaDB" - - ```yaml - bw-db: - image: mariadb: - command: --default-authentication-plugin=mysql_native_password --max-allowed-packet=67108864 - ... - ``` - - === "MySQL" - - ```yaml - bw-db: - image: mysql: - command: --default-authentication-plugin=mysql_native_password --max-allowed-packet=67108864 - ... - ``` + BunkerWeb 的 Docker 镜像包含 MySQL `caching_sha2_password` 所需的 MariaDB Connector/C 身份验证插件。在 Linux 上,如果客户端报告无法加载 `caching_sha2_password`,请安装发行版提供的 MariaDB Connector/C 身份验证插件或兼容的 MySQL 客户端。不要将数据库帐户降级为 `mysql_native_password`,因为 MySQL `v9` 已不再提供该插件。 #### 手动恢复 @@ -3520,39 +3490,9 @@ STREAM 支持 :white_check_mark: 此命令将创建您的数据库备份,并将其存储在命令中指定的备份目录中。 -!!! note "MariaDB/MySQL 的特别说明" +!!! note "MariaDB/MySQL 客户端兼容性" - 如果您正在使用 MariaDB/MySQL,在尝试备份数据库时可能会遇到以下错误: - - ```bash - caching_sha2_password could not be loaded: Error loading shared library /usr/lib/mariadb/plugin/caching_sha2_password.so - ``` - - 要解决此问题,您可以执行以下命令将身份验证插件更改为 `mysql_native_password`: - - ```sql - ALTER USER 'yourusername'@'localhost' IDENTIFIED WITH mysql_native_password BY 'youpassword'; - ``` - - 如果您正在使用 Docker 集成,可以将以下命令添加到 `docker-compose.yml` 文件中,以自动更改身份验证插件: - - === "MariaDB" - - ```yaml - bw-db: - image: mariadb: - command: --default-authentication-plugin=mysql_native_password --max-allowed-packet=67108864 - ... - ``` - - === "MySQL" - - ```yaml - bw-db: - image: mysql: - command: --default-authentication-plugin=mysql_native_password --max-allowed-packet=67108864 - ... - ``` + BunkerWeb 的 Docker 镜像包含 MySQL `caching_sha2_password` 所需的 MariaDB Connector/C 身份验证插件。在 Linux 上,如果客户端报告无法加载 `caching_sha2_password`,请安装发行版提供的 MariaDB Connector/C 身份验证插件或兼容的 MySQL 客户端。不要将数据库帐户降级为 `mysql_native_password`,因为 MySQL `v9` 已不再提供该插件。 ### 初始化迁移 diff --git a/docs/zh/concepts.md b/docs/zh/concepts.md index 14ca334bad..5c7852f3b5 100644 --- a/docs/zh/concepts.md +++ b/docs/zh/concepts.md @@ -163,15 +163,15 @@ BunkerWeb 将其当前配置安全地存储在后端数据库中,该数据库 ### 数据库兼容性矩阵 -| 集成 | PostgreSQL | MariaDB | MySQL | SQLite | -| :--------------- | :---------------------------------------- | :----------------- | :---------------- | :----- | -| **Docker** | ✅ `v18` 及更早版本(all-in-one:✅ `v17`) | ✅ `v11` 及更早版本 | ✅ `v9` 及更早版本 | ✅ 支持 | -| **Kubernetes** | ✅ `v18` 及更早版本 | ✅ `v11` 及更早版本 | ✅ `v9` 及更早版本 | ✅ 支持 | -| **Autoconf** | ✅ `v18` 及更早版本 | ✅ `v11` 及更早版本 | ✅ `v9` 及更早版本 | ✅ 支持 | -| **Linux 软件包** | 见下方说明 | 见下方说明 | 见下方说明 | ✅ 支持 | +| 集成 | PostgreSQL | MariaDB | MySQL | SQLite | +| :--------------- | :----------------- | :----------------- | :---------------- | :----- | +| **Docker** | ✅ `v18` 及更早版本 | ✅ `v12` 及更早版本 | ✅ `v9` 及更早版本 | ✅ 支持 | +| **Kubernetes** | ✅ `v18` 及更早版本 | ✅ `v12` 及更早版本 | ✅ `v9` 及更早版本 | ✅ 支持 | +| **Autoconf** | ✅ `v18` 及更早版本 | ✅ `v12` 及更早版本 | ✅ `v9` 及更早版本 | ✅ 支持 | +| **Linux 软件包** | 见下方说明 | 见下方说明 | 见下方说明 | ✅ 支持 | !!! info "说明" - - **PostgreSQL**: 基于 Alpine 的软件包现在包含 `v18` 客户端,因此默认支持 `v18` 及更早版本;all-in-one 镜像仍然使用 `v17` 客户端,因此 `v18` 在该镜像中尚不受支持。 + - **PostgreSQL**: 基于 Alpine 的镜像(包括 all-in-one)现已包含 `v18` 客户端,因此默认支持 `v18` 及更早版本。 - **Linux**: 支持情况取决于您的发行版软件包。如果需要,您可以从供应商仓库手动安装数据库客户端(RHEL 通常需要这样做)。 - **SQLite**: 随软件包一起提供,可立即使用。 diff --git a/src/common/core/backup/backup.py b/src/common/core/backup/backup.py index 874bae745f..e6a71f340a 100644 --- a/src/common/core/backup/backup.py +++ b/src/common/core/backup/backup.py @@ -30,6 +30,38 @@ DB_LOCK_FILE = Path(sep, "var", "lib", "bunkerweb", "db.lock") +def mysql_client_command(operation: Literal["dump", "restore"]) -> tuple[str, bool]: + mariadb_command = "mariadb-dump" if operation == "dump" else "mariadb" + if which(mariadb_command): + return mariadb_command, True + return ("mysqldump" if operation == "dump" else "mysql"), False + + +def mysql_connection_args(query_args, mariadb_client: bool) -> list[str]: + args = [] + ssl = query_args.get("ssl") + if isinstance(ssl, tuple): + ssl = ssl[-1] + ssl = str(ssl).lower() if ssl is not None else None + + if ssl == "true": + args.append("--ssl") + elif ssl == "false": + args.append("--skip-ssl") + elif mariadb_client: + # MariaDB clients verify opportunistic TLS by default. MySQL's generated + # certificate is self-signed, so keep encryption but skip verification + # unless DATABASE_URI explicitly requests SSL. + args.append("--skip-ssl-verify-server-cert") + + charset = query_args.get("charset") + if isinstance(charset, tuple): + charset = charset[-1] + if charset: + args.extend(["--default-character-set", str(charset)]) + return args + + def acquire_db_lock(): """Acquire the database lock to prevent concurrent access to the database.""" current_time = datetime.now().astimezone() @@ -97,7 +129,7 @@ def backup_database(current_time: datetime, db: Database = None, backup_dir: Pat if database in ("mariadb", "mysql"): LOGGER.info("Creating a backup for the MariaDB/MySQL database ...") - dump_bin = "mariadb-dump" if which("mariadb-dump") else "mysqldump" + dump_bin, mariadb_client = mysql_client_command("dump") cmd = [ dump_bin, "-h", @@ -116,6 +148,7 @@ def backup_database(current_time: datetime, db: Database = None, backup_dir: Pat "--routines", # Include stored procedures and functions "--triggers", # Include triggers "--events", # Include events + "--no-tablespaces", # Avoid requiring the global PROCESS privilege "--max_allowed_packet=2147483648", # 2GB max packet size "--quick", # Retrieve rows one at a time "--lock-tables=false", # Don't lock tables @@ -127,12 +160,7 @@ def backup_database(current_time: datetime, db: Database = None, backup_dir: Pat # Avoid --set-gtid-purged for broad compatibility (MariaDB variant doesn't support it) - # Apply additional arguments from query parameters - for key, value in db_query_args.items(): - if key == "ssl" and value == "true": - cmd.append("--ssl") - elif key == "charset": - cmd.extend(["--default-character-set", value]) + cmd.extend(mysql_connection_args(db_query_args, mariadb_client)) proc = run( cmd, @@ -246,16 +274,12 @@ def restore_database(backup_file: Path, db: Database = None) -> Database: if database in ("mariadb", "mysql"): LOGGER.info("Restoring the MariaDB/MySQL database ...") - cmd = ["mysql", "-h", db_host, "-u", db_user, db_database_name] + restore_bin, mariadb_client = mysql_client_command("restore") + cmd = [restore_bin, "-h", db_host, "-u", db_user, db_database_name] if db_port: cmd.extend(["-P", db_port]) - # Apply additional arguments from query parameters - for key, value in db_query_args.items(): - if key == "ssl" and value == "true": - cmd.append("--ssl") - elif key == "charset": - cmd.extend(["--default-character-set", value]) + cmd.extend(mysql_connection_args(db_query_args, mariadb_client)) with ZipFile(backup_file, "r") as zipf: proc = run( diff --git a/tests/core/backup/docker-compose.mariadb.yml b/tests/core/backup/docker-compose.mariadb.yml index fc12e345a7..37c6337a9e 100644 --- a/tests/core/backup/docker-compose.mariadb.yml +++ b/tests/core/backup/docker-compose.mariadb.yml @@ -2,8 +2,7 @@ version: "3.5" services: bw-db: - image: mariadb:10.10 - command: --default-authentication-plugin=mysql_native_password + image: mariadb:12 environment: - MYSQL_RANDOM_ROOT_PASSWORD=yes - MYSQL_DATABASE=db diff --git a/tests/core/backup/docker-compose.mysql.yml b/tests/core/backup/docker-compose.mysql.yml index e971edbf2a..8abe0a47e1 100644 --- a/tests/core/backup/docker-compose.mysql.yml +++ b/tests/core/backup/docker-compose.mysql.yml @@ -2,8 +2,7 @@ version: "3.5" services: bw-db: - image: mysql:8.0 - command: --default-authentication-plugin=mysql_native_password + image: mysql:9 environment: - MYSQL_RANDOM_ROOT_PASSWORD=yes - MYSQL_DATABASE=db diff --git a/tests/core/backup/docker-compose.postgres.yml b/tests/core/backup/docker-compose.postgres.yml index 45b2b033bb..fe8cbf293b 100644 --- a/tests/core/backup/docker-compose.postgres.yml +++ b/tests/core/backup/docker-compose.postgres.yml @@ -2,7 +2,7 @@ version: "3.5" services: bw-db: - image: postgres:15.1 + image: postgres:18-alpine environment: - POSTGRES_USER=bunkerweb - POSTGRES_PASSWORD=secret diff --git a/tests/core/backup/main.py b/tests/core/backup/main.py index f9652711fd..9ea33c54eb 100644 --- a/tests/core/backup/main.py +++ b/tests/core/backup/main.py @@ -126,6 +126,14 @@ def exec_command(command: Union[str, List[str]]) -> Tuple[int, str, str]: print(f"❌ Backup files count is not as expected, the rotation failed:\nstdout={result[1]}\nstderr={result[2]}", flush=True) exit(1) + latest_backup = sorted(backup_files)[-1] + print(f"ℹ️ Restoring latest backup: {latest_backup}", flush=True) + + result = exec_command(["bwcli", "plugin", "backup", "restore", str(Path(backup_dir, latest_backup))]) + if result[0] != 0: + print(f"❌ Backup restore failed:\nstdout={result[1]}\nstderr={result[2]}", flush=True) + exit(1) + print("✅ Backup tests completed successfully", flush=True) except SystemExit as se: exit(se.code) From 9506cad9fb2f2e5a438740833c6f2bf5236724e2 Mon Sep 17 00:00:00 2001 From: TheophileDiot Date: Thu, 23 Jul 2026 08:26:59 +0200 Subject: [PATCH 02/25] Update Fedora builds to NGINX 1.30.4 --- CHANGELOG.md | 3 +- docs/de/integrations.md | 4 +- docs/es/integrations.md | 4 +- docs/fr/integrations.md | 4 +- docs/integrations.md | 4 +- docs/zh/integrations.md | 4 +- src/deps/deps.json | 7 - src/deps/install.sh | 10 +- src/deps/src/nginx-1.30.3/.gitignore | 3 - src/deps/src/nginx-1.30.3/CODE_OF_CONDUCT.md | 126 - src/deps/src/nginx-1.30.3/CONTRIBUTING.md | 128 - src/deps/src/nginx-1.30.3/LICENSE | 24 - src/deps/src/nginx-1.30.3/README.md | 232 - src/deps/src/nginx-1.30.3/SECURITY.md | 103 - src/deps/src/nginx-1.30.3/SUPPORT.md | 48 - src/deps/src/nginx-1.30.3/auto/cc/acc | 14 - src/deps/src/nginx-1.30.3/auto/cc/bcc | 71 - src/deps/src/nginx-1.30.3/auto/cc/ccc | 46 - src/deps/src/nginx-1.30.3/auto/cc/clang | 90 - src/deps/src/nginx-1.30.3/auto/cc/conf | 254 - src/deps/src/nginx-1.30.3/auto/cc/gcc | 171 - src/deps/src/nginx-1.30.3/auto/cc/icc | 109 - src/deps/src/nginx-1.30.3/auto/cc/msvc | 167 - src/deps/src/nginx-1.30.3/auto/cc/name | 103 - src/deps/src/nginx-1.30.3/auto/cc/owc | 103 - src/deps/src/nginx-1.30.3/auto/cc/sunc | 156 - src/deps/src/nginx-1.30.3/auto/configure | 121 - src/deps/src/nginx-1.30.3/auto/define | 12 - src/deps/src/nginx-1.30.3/auto/endianness | 50 - src/deps/src/nginx-1.30.3/auto/feature | 123 - src/deps/src/nginx-1.30.3/auto/have | 12 - src/deps/src/nginx-1.30.3/auto/have_headers | 12 - src/deps/src/nginx-1.30.3/auto/headers | 13 - src/deps/src/nginx-1.30.3/auto/include | 58 - src/deps/src/nginx-1.30.3/auto/init | 53 - src/deps/src/nginx-1.30.3/auto/install | 220 - src/deps/src/nginx-1.30.3/auto/lib/conf | 54 - src/deps/src/nginx-1.30.3/auto/lib/geoip/conf | 114 - .../auto/lib/google-perftools/conf | 78 - .../src/nginx-1.30.3/auto/lib/libatomic/conf | 43 - .../src/nginx-1.30.3/auto/lib/libatomic/make | 21 - src/deps/src/nginx-1.30.3/auto/lib/libgd/conf | 112 - .../src/nginx-1.30.3/auto/lib/libxslt/conf | 165 - src/deps/src/nginx-1.30.3/auto/lib/make | 24 - .../src/nginx-1.30.3/auto/lib/openssl/conf | 196 - .../src/nginx-1.30.3/auto/lib/openssl/make | 79 - .../auto/lib/openssl/makefile.bcc | 18 - .../auto/lib/openssl/makefile.msvc | 21 - src/deps/src/nginx-1.30.3/auto/lib/pcre/conf | 235 - src/deps/src/nginx-1.30.3/auto/lib/pcre/make | 171 - .../nginx-1.30.3/auto/lib/pcre/makefile.bcc | 27 - .../nginx-1.30.3/auto/lib/pcre/makefile.msvc | 23 - .../nginx-1.30.3/auto/lib/pcre/makefile.owc | 25 - src/deps/src/nginx-1.30.3/auto/lib/perl/conf | 83 - src/deps/src/nginx-1.30.3/auto/lib/perl/make | 46 - src/deps/src/nginx-1.30.3/auto/lib/zlib/conf | 79 - src/deps/src/nginx-1.30.3/auto/lib/zlib/make | 135 - .../nginx-1.30.3/auto/lib/zlib/makefile.bcc | 17 - .../nginx-1.30.3/auto/lib/zlib/makefile.msvc | 17 - .../nginx-1.30.3/auto/lib/zlib/makefile.owc | 14 - src/deps/src/nginx-1.30.3/auto/make | 674 -- src/deps/src/nginx-1.30.3/auto/module | 178 - src/deps/src/nginx-1.30.3/auto/modules | 1556 ---- src/deps/src/nginx-1.30.3/auto/nohave | 12 - src/deps/src/nginx-1.30.3/auto/options | 653 -- src/deps/src/nginx-1.30.3/auto/os/conf | 144 - src/deps/src/nginx-1.30.3/auto/os/darwin | 136 - src/deps/src/nginx-1.30.3/auto/os/freebsd | 105 - src/deps/src/nginx-1.30.3/auto/os/linux | 298 - src/deps/src/nginx-1.30.3/auto/os/solaris | 61 - src/deps/src/nginx-1.30.3/auto/os/win32 | 39 - src/deps/src/nginx-1.30.3/auto/sources | 261 - src/deps/src/nginx-1.30.3/auto/stubs | 8 - src/deps/src/nginx-1.30.3/auto/summary | 82 - src/deps/src/nginx-1.30.3/auto/threads | 21 - src/deps/src/nginx-1.30.3/auto/types/sizeof | 76 - src/deps/src/nginx-1.30.3/auto/types/typedef | 82 - .../src/nginx-1.30.3/auto/types/uintptr_t | 50 - src/deps/src/nginx-1.30.3/auto/types/value | 12 - src/deps/src/nginx-1.30.3/auto/unix | 1034 --- src/deps/src/nginx-1.30.3/conf/fastcgi.conf | 26 - src/deps/src/nginx-1.30.3/conf/fastcgi_params | 25 - src/deps/src/nginx-1.30.3/conf/koi-utf | 109 - src/deps/src/nginx-1.30.3/conf/koi-win | 103 - src/deps/src/nginx-1.30.3/conf/mime.types | 99 - src/deps/src/nginx-1.30.3/conf/nginx.conf | 115 - src/deps/src/nginx-1.30.3/conf/scgi_params | 17 - src/deps/src/nginx-1.30.3/conf/uwsgi_params | 17 - src/deps/src/nginx-1.30.3/conf/win-utf | 126 - src/deps/src/nginx-1.30.3/contrib/README | 21 - .../src/nginx-1.30.3/contrib/geo2nginx.pl | 58 - .../contrib/unicode2nginx/koi-utf | 131 - .../contrib/unicode2nginx/unicode-to-nginx.pl | 48 - .../contrib/unicode2nginx/win-utf | 130 - .../contrib/vim/ftdetect/nginx.vim | 4 - .../contrib/vim/ftplugin/nginx.vim | 1 - .../nginx-1.30.3/contrib/vim/indent/nginx.vim | 11 - .../nginx-1.30.3/contrib/vim/syntax/nginx.vim | 1979 ----- src/deps/src/nginx-1.30.3/misc/GNUmakefile | 149 - src/deps/src/nginx-1.30.3/misc/README | 13 - src/deps/src/nginx-1.30.3/src/core/nginx.c | 1676 ---- src/deps/src/nginx-1.30.3/src/core/nginx.h | 26 - .../src/nginx-1.30.3/src/core/ngx_array.c | 141 - .../src/nginx-1.30.3/src/core/ngx_array.h | 53 - src/deps/src/nginx-1.30.3/src/core/ngx_bpf.c | 143 - src/deps/src/nginx-1.30.3/src/core/ngx_bpf.h | 43 - src/deps/src/nginx-1.30.3/src/core/ngx_buf.c | 314 - src/deps/src/nginx-1.30.3/src/core/ngx_buf.h | 167 - .../src/nginx-1.30.3/src/core/ngx_conf_file.c | 1486 ---- .../src/nginx-1.30.3/src/core/ngx_conf_file.h | 295 - .../src/nginx-1.30.3/src/core/ngx_config.h | 145 - .../nginx-1.30.3/src/core/ngx_connection.c | 1657 ---- .../nginx-1.30.3/src/core/ngx_connection.h | 239 - src/deps/src/nginx-1.30.3/src/core/ngx_core.h | 121 - .../src/nginx-1.30.3/src/core/ngx_cpuinfo.c | 139 - src/deps/src/nginx-1.30.3/src/core/ngx_crc.h | 39 - .../src/nginx-1.30.3/src/core/ngx_crc32.c | 129 - .../src/nginx-1.30.3/src/core/ngx_crc32.h | 79 - .../src/nginx-1.30.3/src/core/ngx_crypt.c | 270 - .../src/nginx-1.30.3/src/core/ngx_crypt.h | 20 - .../src/nginx-1.30.3/src/core/ngx_cycle.c | 1482 ---- .../src/nginx-1.30.3/src/core/ngx_cycle.h | 149 - src/deps/src/nginx-1.30.3/src/core/ngx_file.c | 1128 --- src/deps/src/nginx-1.30.3/src/core/ngx_file.h | 164 - src/deps/src/nginx-1.30.3/src/core/ngx_hash.c | 1013 --- src/deps/src/nginx-1.30.3/src/core/ngx_hash.h | 125 - src/deps/src/nginx-1.30.3/src/core/ngx_inet.c | 1499 ---- src/deps/src/nginx-1.30.3/src/core/ngx_inet.h | 132 - src/deps/src/nginx-1.30.3/src/core/ngx_list.c | 63 - src/deps/src/nginx-1.30.3/src/core/ngx_list.h | 83 - src/deps/src/nginx-1.30.3/src/core/ngx_log.c | 752 -- src/deps/src/nginx-1.30.3/src/core/ngx_log.h | 271 - src/deps/src/nginx-1.30.3/src/core/ngx_md5.c | 283 - src/deps/src/nginx-1.30.3/src/core/ngx_md5.h | 28 - .../src/nginx-1.30.3/src/core/ngx_module.c | 360 - .../src/nginx-1.30.3/src/core/ngx_module.h | 288 - .../nginx-1.30.3/src/core/ngx_murmurhash.c | 52 - .../nginx-1.30.3/src/core/ngx_murmurhash.h | 19 - .../src/core/ngx_open_file_cache.c | 1253 --- .../src/core/ngx_open_file_cache.h | 129 - .../nginx-1.30.3/src/core/ngx_output_chain.c | 820 -- .../src/nginx-1.30.3/src/core/ngx_palloc.c | 430 - .../src/nginx-1.30.3/src/core/ngx_palloc.h | 92 - .../src/nginx-1.30.3/src/core/ngx_parse.c | 283 - .../src/nginx-1.30.3/src/core/ngx_parse.h | 21 - .../nginx-1.30.3/src/core/ngx_parse_time.c | 277 - .../nginx-1.30.3/src/core/ngx_parse_time.h | 22 - .../src/core/ngx_proxy_protocol.c | 614 -- .../src/core/ngx_proxy_protocol.h | 37 - .../src/nginx-1.30.3/src/core/ngx_queue.c | 106 - .../src/nginx-1.30.3/src/core/ngx_queue.h | 115 - .../nginx-1.30.3/src/core/ngx_radix_tree.c | 488 -- .../nginx-1.30.3/src/core/ngx_radix_tree.h | 55 - .../src/nginx-1.30.3/src/core/ngx_rbtree.c | 404 - .../src/nginx-1.30.3/src/core/ngx_rbtree.h | 87 - .../src/nginx-1.30.3/src/core/ngx_regex.c | 804 -- .../src/nginx-1.30.3/src/core/ngx_regex.h | 78 - .../src/nginx-1.30.3/src/core/ngx_resolver.c | 4741 ----------- .../src/nginx-1.30.3/src/core/ngx_resolver.h | 242 - .../src/nginx-1.30.3/src/core/ngx_rwlock.c | 117 - .../src/nginx-1.30.3/src/core/ngx_rwlock.h | 22 - src/deps/src/nginx-1.30.3/src/core/ngx_sha1.c | 294 - src/deps/src/nginx-1.30.3/src/core/ngx_sha1.h | 28 - .../src/nginx-1.30.3/src/core/ngx_shmtx.c | 310 - .../src/nginx-1.30.3/src/core/ngx_shmtx.h | 49 - src/deps/src/nginx-1.30.3/src/core/ngx_slab.c | 817 -- src/deps/src/nginx-1.30.3/src/core/ngx_slab.h | 72 - .../src/nginx-1.30.3/src/core/ngx_spinlock.c | 53 - .../src/nginx-1.30.3/src/core/ngx_string.c | 2130 ----- .../src/nginx-1.30.3/src/core/ngx_string.h | 239 - .../src/nginx-1.30.3/src/core/ngx_syslog.c | 410 - .../src/nginx-1.30.3/src/core/ngx_syslog.h | 36 - .../nginx-1.30.3/src/core/ngx_thread_pool.c | 641 -- .../nginx-1.30.3/src/core/ngx_thread_pool.h | 36 - .../src/nginx-1.30.3/src/core/ngx_times.c | 460 -- .../src/nginx-1.30.3/src/core/ngx_times.h | 52 - .../src/event/modules/ngx_devpoll_module.c | 561 -- .../src/event/modules/ngx_epoll_module.c | 1051 --- .../src/event/modules/ngx_eventport_module.c | 650 -- .../src/event/modules/ngx_iocp_module.c | 379 - .../src/event/modules/ngx_iocp_module.h | 22 - .../src/event/modules/ngx_kqueue_module.c | 731 -- .../src/event/modules/ngx_poll_module.c | 416 - .../src/event/modules/ngx_select_module.c | 424 - .../src/event/modules/ngx_win32_poll_module.c | 436 - .../event/modules/ngx_win32_select_module.c | 408 - .../src/nginx-1.30.3/src/event/ngx_event.c | 1373 ---- .../src/nginx-1.30.3/src/event/ngx_event.h | 533 -- .../nginx-1.30.3/src/event/ngx_event_accept.c | 589 -- .../src/event/ngx_event_acceptex.c | 229 - .../src/event/ngx_event_connect.c | 435 - .../src/event/ngx_event_connect.h | 85 - .../src/event/ngx_event_connectex.c | 206 - .../src/event/ngx_event_openssl.c | 6626 --------------- .../src/event/ngx_event_openssl.h | 416 - .../src/event/ngx_event_openssl_cache.c | 1267 --- .../src/event/ngx_event_openssl_stapling.c | 2830 ------- .../nginx-1.30.3/src/event/ngx_event_pipe.c | 1146 --- .../nginx-1.30.3/src/event/ngx_event_pipe.h | 107 - .../nginx-1.30.3/src/event/ngx_event_posted.c | 60 - .../nginx-1.30.3/src/event/ngx_event_posted.h | 50 - .../nginx-1.30.3/src/event/ngx_event_timer.c | 126 - .../nginx-1.30.3/src/event/ngx_event_timer.h | 90 - .../nginx-1.30.3/src/event/ngx_event_udp.c | 590 -- .../nginx-1.30.3/src/event/ngx_event_udp.h | 66 - .../nginx-1.30.3/src/event/quic/bpf/bpfgen.sh | 113 - .../nginx-1.30.3/src/event/quic/bpf/makefile | 30 - .../quic/bpf/ngx_quic_reuseport_helper.c | 140 - .../src/event/quic/ngx_event_quic.c | 1522 ---- .../src/event/quic/ngx_event_quic.h | 145 - .../src/event/quic/ngx_event_quic_ack.c | 1456 ---- .../src/event/quic/ngx_event_quic_ack.h | 31 - .../src/event/quic/ngx_event_quic_bpf.c | 657 -- .../src/event/quic/ngx_event_quic_bpf_code.c | 93 - .../event/quic/ngx_event_quic_connection.h | 326 - .../src/event/quic/ngx_event_quic_connid.c | 502 -- .../src/event/quic/ngx_event_quic_connid.h | 29 - .../src/event/quic/ngx_event_quic_frames.c | 895 -- .../src/event/quic/ngx_event_quic_frames.h | 45 - .../src/event/quic/ngx_event_quic_migration.c | 1007 --- .../src/event/quic/ngx_event_quic_migration.h | 45 - .../quic/ngx_event_quic_openssl_compat.c | 652 -- .../quic/ngx_event_quic_openssl_compat.h | 51 - .../src/event/quic/ngx_event_quic_output.c | 1406 ---- .../src/event/quic/ngx_event_quic_output.h | 40 - .../event/quic/ngx_event_quic_protection.c | 1268 --- .../event/quic/ngx_event_quic_protection.h | 118 - .../src/event/quic/ngx_event_quic_socket.c | 237 - .../src/event/quic/ngx_event_quic_socket.h | 28 - .../src/event/quic/ngx_event_quic_ssl.c | 991 --- .../src/event/quic/ngx_event_quic_ssl.h | 19 - .../src/event/quic/ngx_event_quic_streams.c | 1828 ----- .../src/event/quic/ngx_event_quic_streams.h | 44 - .../src/event/quic/ngx_event_quic_tokens.c | 265 - .../src/event/quic/ngx_event_quic_tokens.h | 34 - .../src/event/quic/ngx_event_quic_transport.c | 2215 ----- .../src/event/quic/ngx_event_quic_transport.h | 398 - .../src/event/quic/ngx_event_quic_udp.c | 420 - .../src/http/modules/ngx_http_access_module.c | 463 -- .../modules/ngx_http_addition_filter_module.c | 254 - .../http/modules/ngx_http_auth_basic_module.c | 433 - .../modules/ngx_http_auth_request_module.c | 450 - .../http/modules/ngx_http_autoindex_module.c | 1072 --- .../http/modules/ngx_http_browser_module.c | 712 -- .../modules/ngx_http_charset_filter_module.c | 1687 ---- .../modules/ngx_http_chunked_filter_module.c | 343 - .../src/http/modules/ngx_http_dav_module.c | 1186 --- .../modules/ngx_http_degradation_module.c | 243 - .../http/modules/ngx_http_empty_gif_module.c | 140 - .../http/modules/ngx_http_fastcgi_module.c | 3949 --------- .../src/http/modules/ngx_http_flv_module.c | 261 - .../src/http/modules/ngx_http_geo_module.c | 1696 ---- .../src/http/modules/ngx_http_geoip_module.c | 925 --- .../src/http/modules/ngx_http_grpc_module.c | 5212 ------------ .../modules/ngx_http_gunzip_filter_module.c | 697 -- .../modules/ngx_http_gzip_filter_module.c | 1185 --- .../modules/ngx_http_gzip_static_module.c | 335 - .../modules/ngx_http_headers_filter_module.c | 918 --- .../modules/ngx_http_image_filter_module.c | 1675 ---- .../src/http/modules/ngx_http_index_module.c | 540 -- .../http/modules/ngx_http_limit_conn_module.c | 758 -- .../http/modules/ngx_http_limit_req_module.c | 1102 --- .../src/http/modules/ngx_http_log_module.c | 1909 ----- .../src/http/modules/ngx_http_map_module.c | 589 -- .../http/modules/ngx_http_memcached_module.c | 736 -- .../src/http/modules/ngx_http_mirror_module.c | 264 - .../src/http/modules/ngx_http_mp4_module.c | 3987 --------- .../ngx_http_not_modified_filter_module.c | 266 - .../src/http/modules/ngx_http_proxy_module.c | 5389 ------------ .../src/http/modules/ngx_http_proxy_module.h | 127 - .../http/modules/ngx_http_proxy_v2_module.c | 4210 ---------- .../modules/ngx_http_random_index_module.c | 317 - .../modules/ngx_http_range_filter_module.c | 999 --- .../src/http/modules/ngx_http_realip_module.c | 621 -- .../http/modules/ngx_http_referer_module.c | 682 -- .../http/modules/ngx_http_rewrite_module.c | 1020 --- .../src/http/modules/ngx_http_scgi_module.c | 2138 ----- .../modules/ngx_http_secure_link_module.c | 366 - .../modules/ngx_http_slice_filter_module.c | 550 -- .../modules/ngx_http_split_clients_module.c | 246 - .../http/modules/ngx_http_ssi_filter_module.c | 2964 ------- .../http/modules/ngx_http_ssi_filter_module.h | 115 - .../src/http/modules/ngx_http_ssl_module.c | 1523 ---- .../src/http/modules/ngx_http_ssl_module.h | 75 - .../src/http/modules/ngx_http_static_module.c | 297 - .../modules/ngx_http_stub_status_module.c | 226 - .../http/modules/ngx_http_sub_filter_module.c | 1022 --- .../http/modules/ngx_http_try_files_module.c | 404 - .../modules/ngx_http_upstream_hash_module.c | 787 -- .../ngx_http_upstream_ip_hash_module.c | 307 - .../ngx_http_upstream_keepalive_module.c | 621 -- .../ngx_http_upstream_least_conn_module.c | 342 - .../modules/ngx_http_upstream_random_module.c | 569 -- .../modules/ngx_http_upstream_sticky_module.c | 1513 ---- .../modules/ngx_http_upstream_zone_module.c | 1034 --- .../modules/ngx_http_userid_filter_module.c | 924 --- .../src/http/modules/ngx_http_uwsgi_module.c | 2759 ------- .../modules/ngx_http_xslt_filter_module.c | 1157 --- .../src/http/modules/perl/Makefile.PL | 35 - .../src/http/modules/perl/nginx.pm | 140 - .../src/http/modules/perl/nginx.xs | 1187 --- .../http/modules/perl/ngx_http_perl_module.c | 1135 --- .../http/modules/perl/ngx_http_perl_module.h | 73 - .../src/http/modules/perl/typemap | 3 - src/deps/src/nginx-1.30.3/src/http/ngx_http.c | 2200 ----- src/deps/src/nginx-1.30.3/src/http/ngx_http.h | 201 - .../nginx-1.30.3/src/http/ngx_http_cache.h | 210 - .../nginx-1.30.3/src/http/ngx_http_config.h | 75 - .../src/http/ngx_http_copy_filter_module.c | 397 - .../src/http/ngx_http_core_module.c | 5439 ------------ .../src/http/ngx_http_core_module.h | 599 -- .../src/http/ngx_http_file_cache.c | 2799 ------- .../src/http/ngx_http_header_filter_module.c | 741 -- .../src/http/ngx_http_huff_decode.c | 2714 ------ .../src/http/ngx_http_huff_encode.c | 254 - .../nginx-1.30.3/src/http/ngx_http_parse.c | 2469 ------ .../http/ngx_http_postpone_filter_module.c | 259 - .../nginx-1.30.3/src/http/ngx_http_request.c | 4140 ---------- .../nginx-1.30.3/src/http/ngx_http_request.h | 632 -- .../src/http/ngx_http_request_body.c | 1385 ---- .../nginx-1.30.3/src/http/ngx_http_script.c | 1907 ----- .../nginx-1.30.3/src/http/ngx_http_script.h | 269 - .../src/http/ngx_http_special_response.c | 865 -- .../nginx-1.30.3/src/http/ngx_http_upstream.c | 7305 ----------------- .../nginx-1.30.3/src/http/ngx_http_upstream.h | 464 -- .../src/http/ngx_http_upstream_round_robin.c | 1267 --- .../src/http/ngx_http_upstream_round_robin.h | 275 - .../src/http/ngx_http_variables.c | 2890 ------- .../src/http/ngx_http_variables.h | 117 - .../src/http/ngx_http_write_filter_module.c | 371 - .../nginx-1.30.3/src/http/v2/ngx_http_v2.c | 5030 ------------ .../nginx-1.30.3/src/http/v2/ngx_http_v2.h | 423 - .../src/http/v2/ngx_http_v2_encode.c | 62 - .../src/http/v2/ngx_http_v2_filter_module.c | 1769 ---- .../src/http/v2/ngx_http_v2_module.c | 498 -- .../src/http/v2/ngx_http_v2_module.h | 28 - .../src/http/v2/ngx_http_v2_table.c | 363 - .../nginx-1.30.3/src/http/v3/ngx_http_v3.c | 111 - .../nginx-1.30.3/src/http/v3/ngx_http_v3.h | 160 - .../src/http/v3/ngx_http_v3_encode.c | 304 - .../src/http/v3/ngx_http_v3_encode.h | 34 - .../src/http/v3/ngx_http_v3_filter_module.c | 1002 --- .../src/http/v3/ngx_http_v3_module.c | 393 - .../src/http/v3/ngx_http_v3_parse.c | 1942 ----- .../src/http/v3/ngx_http_v3_parse.h | 146 - .../src/http/v3/ngx_http_v3_request.c | 1741 ---- .../src/http/v3/ngx_http_v3_table.c | 715 -- .../src/http/v3/ngx_http_v3_table.h | 58 - .../src/http/v3/ngx_http_v3_uni.c | 622 -- .../src/http/v3/ngx_http_v3_uni.h | 34 - src/deps/src/nginx-1.30.3/src/mail/ngx_mail.c | 485 -- src/deps/src/nginx-1.30.3/src/mail/ngx_mail.h | 425 - .../src/mail/ngx_mail_auth_http_module.c | 1662 ---- .../src/mail/ngx_mail_core_module.c | 728 -- .../nginx-1.30.3/src/mail/ngx_mail_handler.c | 1022 --- .../src/mail/ngx_mail_imap_handler.c | 477 -- .../src/mail/ngx_mail_imap_module.c | 258 - .../src/mail/ngx_mail_imap_module.h | 39 - .../nginx-1.30.3/src/mail/ngx_mail_parse.c | 974 --- .../src/mail/ngx_mail_pop3_handler.c | 544 -- .../src/mail/ngx_mail_pop3_module.c | 323 - .../src/mail/ngx_mail_pop3_module.h | 38 - .../src/mail/ngx_mail_proxy_module.c | 1411 ---- .../src/mail/ngx_mail_realip_module.c | 269 - .../src/mail/ngx_mail_smtp_handler.c | 983 --- .../src/mail/ngx_mail_smtp_module.c | 312 - .../src/mail/ngx_mail_smtp_module.h | 45 - .../src/mail/ngx_mail_ssl_module.c | 714 -- .../src/mail/ngx_mail_ssl_module.h | 66 - .../src/misc/ngx_cpp_test_module.cpp | 31 - .../src/misc/ngx_google_perftools_module.c | 126 - .../src/nginx-1.30.3/src/os/unix/ngx_alloc.c | 90 - .../src/nginx-1.30.3/src/os/unix/ngx_alloc.h | 45 - .../src/nginx-1.30.3/src/os/unix/ngx_atomic.h | 313 - .../nginx-1.30.3/src/os/unix/ngx_channel.c | 253 - .../nginx-1.30.3/src/os/unix/ngx_channel.h | 34 - .../src/nginx-1.30.3/src/os/unix/ngx_daemon.c | 71 - .../src/nginx-1.30.3/src/os/unix/ngx_darwin.h | 23 - .../src/os/unix/ngx_darwin_config.h | 100 - .../src/os/unix/ngx_darwin_init.c | 204 - .../src/os/unix/ngx_darwin_sendfile_chain.c | 206 - .../src/nginx-1.30.3/src/os/unix/ngx_dlopen.c | 28 - .../src/nginx-1.30.3/src/os/unix/ngx_dlopen.h | 31 - .../src/nginx-1.30.3/src/os/unix/ngx_errno.c | 210 - .../src/nginx-1.30.3/src/os/unix/ngx_errno.h | 80 - .../src/os/unix/ngx_file_aio_read.c | 216 - .../src/nginx-1.30.3/src/os/unix/ngx_files.c | 956 --- .../src/nginx-1.30.3/src/os/unix/ngx_files.h | 396 - .../nginx-1.30.3/src/os/unix/ngx_freebsd.h | 25 - .../src/os/unix/ngx_freebsd_config.h | 129 - .../src/os/unix/ngx_freebsd_init.c | 262 - .../src/os/unix/ngx_freebsd_sendfile_chain.c | 308 - .../src/os/unix/ngx_gcc_atomic_amd64.h | 82 - .../src/os/unix/ngx_gcc_atomic_ppc.h | 155 - .../src/os/unix/ngx_gcc_atomic_sparc64.h | 82 - .../src/os/unix/ngx_gcc_atomic_x86.h | 127 - .../src/nginx-1.30.3/src/os/unix/ngx_linux.h | 16 - .../src/os/unix/ngx_linux_aio_read.c | 148 - .../src/os/unix/ngx_linux_config.h | 136 - .../nginx-1.30.3/src/os/unix/ngx_linux_init.c | 60 - .../src/os/unix/ngx_linux_sendfile_chain.c | 436 - .../src/nginx-1.30.3/src/os/unix/ngx_os.h | 102 - .../src/os/unix/ngx_posix_config.h | 151 - .../nginx-1.30.3/src/os/unix/ngx_posix_init.c | 147 - .../nginx-1.30.3/src/os/unix/ngx_process.c | 648 -- .../nginx-1.30.3/src/os/unix/ngx_process.h | 90 - .../src/os/unix/ngx_process_cycle.c | 1191 --- .../src/os/unix/ngx_process_cycle.h | 61 - .../src/os/unix/ngx_readv_chain.c | 252 - .../src/nginx-1.30.3/src/os/unix/ngx_recv.c | 203 - .../src/nginx-1.30.3/src/os/unix/ngx_send.c | 73 - .../src/os/unix/ngx_setaffinity.c | 53 - .../src/os/unix/ngx_setaffinity.h | 37 - .../src/os/unix/ngx_setproctitle.c | 135 - .../src/os/unix/ngx_setproctitle.h | 52 - .../src/nginx-1.30.3/src/os/unix/ngx_shmem.c | 126 - .../src/nginx-1.30.3/src/os/unix/ngx_shmem.h | 29 - .../src/nginx-1.30.3/src/os/unix/ngx_socket.c | 116 - .../src/nginx-1.30.3/src/os/unix/ngx_socket.h | 73 - .../nginx-1.30.3/src/os/unix/ngx_solaris.h | 16 - .../src/os/unix/ngx_solaris_config.h | 112 - .../src/os/unix/ngx_solaris_init.c | 77 - .../src/os/unix/ngx_solaris_sendfilev_chain.c | 228 - .../src/os/unix/ngx_sunpro_amd64.il | 43 - .../src/os/unix/ngx_sunpro_atomic_sparc64.h | 61 - .../src/os/unix/ngx_sunpro_sparc64.il | 36 - .../src/os/unix/ngx_sunpro_x86.il | 44 - .../src/nginx-1.30.3/src/os/unix/ngx_thread.h | 71 - .../src/os/unix/ngx_thread_cond.c | 76 - .../nginx-1.30.3/src/os/unix/ngx_thread_id.c | 70 - .../src/os/unix/ngx_thread_mutex.c | 165 - .../src/nginx-1.30.3/src/os/unix/ngx_time.c | 104 - .../src/nginx-1.30.3/src/os/unix/ngx_time.h | 66 - .../nginx-1.30.3/src/os/unix/ngx_udp_recv.c | 72 - .../nginx-1.30.3/src/os/unix/ngx_udp_send.c | 56 - .../src/os/unix/ngx_udp_sendmsg_chain.c | 432 - .../src/nginx-1.30.3/src/os/unix/ngx_user.c | 84 - .../src/nginx-1.30.3/src/os/unix/ngx_user.h | 24 - .../src/os/unix/ngx_writev_chain.c | 216 - .../src/nginx-1.30.3/src/os/win32/nginx.ico | Bin 1350 -> 0 bytes .../src/nginx-1.30.3/src/os/win32/nginx.rc | 6 - .../src/os/win32/nginx_icon16.xpm | 24 - .../src/os/win32/nginx_icon32.xpm | 39 - .../src/os/win32/nginx_icon48.xpm | 55 - .../src/nginx-1.30.3/src/os/win32/ngx_alloc.c | 44 - .../src/nginx-1.30.3/src/os/win32/ngx_alloc.h | 27 - .../nginx-1.30.3/src/os/win32/ngx_atomic.h | 69 - .../nginx-1.30.3/src/os/win32/ngx_dlopen.c | 22 - .../nginx-1.30.3/src/os/win32/ngx_dlopen.h | 32 - .../src/nginx-1.30.3/src/os/win32/ngx_errno.c | 60 - .../src/nginx-1.30.3/src/os/win32/ngx_errno.h | 72 - .../nginx-1.30.3/src/os/win32/ngx_event_log.c | 99 - .../src/nginx-1.30.3/src/os/win32/ngx_files.c | 1459 ---- .../src/nginx-1.30.3/src/os/win32/ngx_files.h | 272 - .../src/nginx-1.30.3/src/os/win32/ngx_os.h | 68 - .../nginx-1.30.3/src/os/win32/ngx_process.c | 238 - .../nginx-1.30.3/src/os/win32/ngx_process.h | 80 - .../src/os/win32/ngx_process_cycle.c | 1044 --- .../src/os/win32/ngx_process_cycle.h | 44 - .../nginx-1.30.3/src/os/win32/ngx_service.c | 134 - .../src/nginx-1.30.3/src/os/win32/ngx_shmem.c | 161 - .../src/nginx-1.30.3/src/os/win32/ngx_shmem.h | 33 - .../nginx-1.30.3/src/os/win32/ngx_socket.c | 49 - .../nginx-1.30.3/src/os/win32/ngx_socket.h | 255 - .../src/nginx-1.30.3/src/os/win32/ngx_stat.c | 34 - .../nginx-1.30.3/src/os/win32/ngx_thread.c | 30 - .../nginx-1.30.3/src/os/win32/ngx_thread.h | 27 - .../src/nginx-1.30.3/src/os/win32/ngx_time.c | 83 - .../src/nginx-1.30.3/src/os/win32/ngx_time.h | 51 - .../src/os/win32/ngx_udp_wsarecv.c | 149 - .../src/nginx-1.30.3/src/os/win32/ngx_user.c | 23 - .../src/nginx-1.30.3/src/os/win32/ngx_user.h | 25 - .../src/os/win32/ngx_win32_config.h | 291 - .../src/os/win32/ngx_win32_init.c | 329 - .../nginx-1.30.3/src/os/win32/ngx_wsarecv.c | 215 - .../src/os/win32/ngx_wsarecv_chain.c | 147 - .../nginx-1.30.3/src/os/win32/ngx_wsasend.c | 185 - .../src/os/win32/ngx_wsasend_chain.c | 296 - .../src/nginx-1.30.3/src/stream/ngx_stream.c | 1176 --- .../src/nginx-1.30.3/src/stream/ngx_stream.h | 384 - .../src/stream/ngx_stream_access_module.c | 453 - .../src/stream/ngx_stream_core_module.c | 1523 ---- .../src/stream/ngx_stream_geo_module.c | 1624 ---- .../src/stream/ngx_stream_geoip_module.c | 814 -- .../src/stream/ngx_stream_handler.c | 389 - .../src/stream/ngx_stream_limit_conn_module.c | 737 -- .../src/stream/ngx_stream_log_module.c | 1596 ---- .../src/stream/ngx_stream_map_module.c | 588 -- .../src/stream/ngx_stream_pass_module.c | 336 - .../src/stream/ngx_stream_proxy_module.c | 2683 ------ .../src/stream/ngx_stream_realip_module.c | 401 - .../src/stream/ngx_stream_return_module.c | 218 - .../src/stream/ngx_stream_script.c | 1021 --- .../src/stream/ngx_stream_script.h | 137 - .../src/stream/ngx_stream_set_module.c | 226 - .../stream/ngx_stream_split_clients_module.c | 244 - .../src/stream/ngx_stream_ssl_module.c | 1784 ---- .../src/stream/ngx_stream_ssl_module.h | 75 - .../stream/ngx_stream_ssl_preread_module.c | 715 -- .../src/stream/ngx_stream_upstream.c | 868 -- .../src/stream/ngx_stream_upstream.h | 165 - .../stream/ngx_stream_upstream_hash_module.c | 755 -- .../ngx_stream_upstream_least_conn_module.c | 322 - .../ngx_stream_upstream_random_module.c | 531 -- .../stream/ngx_stream_upstream_round_robin.c | 1075 --- .../stream/ngx_stream_upstream_round_robin.h | 232 - .../stream/ngx_stream_upstream_zone_module.c | 1005 --- .../src/stream/ngx_stream_variables.c | 1340 --- .../src/stream/ngx_stream_variables.h | 113 - .../stream/ngx_stream_write_filter_module.c | 306 - src/linux/Dockerfile-fedora-43 | 2 +- src/linux/Dockerfile-fedora-44 | 2 +- src/linux/fpm-fedora-43 | 2 +- src/linux/fpm-fedora-44 | 2 +- tests/linux/Dockerfile-fedora-43 | 2 +- tests/linux/Dockerfile-fedora-44 | 2 +- 516 files changed, 19 insertions(+), 261401 deletions(-) delete mode 100644 src/deps/src/nginx-1.30.3/.gitignore delete mode 100644 src/deps/src/nginx-1.30.3/CODE_OF_CONDUCT.md delete mode 100644 src/deps/src/nginx-1.30.3/CONTRIBUTING.md delete mode 100644 src/deps/src/nginx-1.30.3/LICENSE delete mode 100644 src/deps/src/nginx-1.30.3/README.md delete mode 100644 src/deps/src/nginx-1.30.3/SECURITY.md delete mode 100644 src/deps/src/nginx-1.30.3/SUPPORT.md delete mode 100644 src/deps/src/nginx-1.30.3/auto/cc/acc delete mode 100644 src/deps/src/nginx-1.30.3/auto/cc/bcc delete mode 100644 src/deps/src/nginx-1.30.3/auto/cc/ccc delete mode 100644 src/deps/src/nginx-1.30.3/auto/cc/clang delete mode 100644 src/deps/src/nginx-1.30.3/auto/cc/conf delete mode 100644 src/deps/src/nginx-1.30.3/auto/cc/gcc delete mode 100644 src/deps/src/nginx-1.30.3/auto/cc/icc delete mode 100644 src/deps/src/nginx-1.30.3/auto/cc/msvc delete mode 100644 src/deps/src/nginx-1.30.3/auto/cc/name delete mode 100644 src/deps/src/nginx-1.30.3/auto/cc/owc delete mode 100644 src/deps/src/nginx-1.30.3/auto/cc/sunc delete mode 100755 src/deps/src/nginx-1.30.3/auto/configure delete mode 100644 src/deps/src/nginx-1.30.3/auto/define delete mode 100644 src/deps/src/nginx-1.30.3/auto/endianness delete mode 100644 src/deps/src/nginx-1.30.3/auto/feature delete mode 100644 src/deps/src/nginx-1.30.3/auto/have delete mode 100644 src/deps/src/nginx-1.30.3/auto/have_headers delete mode 100644 src/deps/src/nginx-1.30.3/auto/headers delete mode 100644 src/deps/src/nginx-1.30.3/auto/include delete mode 100644 src/deps/src/nginx-1.30.3/auto/init delete mode 100644 src/deps/src/nginx-1.30.3/auto/install delete mode 100644 src/deps/src/nginx-1.30.3/auto/lib/conf delete mode 100644 src/deps/src/nginx-1.30.3/auto/lib/geoip/conf delete mode 100644 src/deps/src/nginx-1.30.3/auto/lib/google-perftools/conf delete mode 100644 src/deps/src/nginx-1.30.3/auto/lib/libatomic/conf delete mode 100644 src/deps/src/nginx-1.30.3/auto/lib/libatomic/make delete mode 100644 src/deps/src/nginx-1.30.3/auto/lib/libgd/conf delete mode 100644 src/deps/src/nginx-1.30.3/auto/lib/libxslt/conf delete mode 100644 src/deps/src/nginx-1.30.3/auto/lib/make delete mode 100644 src/deps/src/nginx-1.30.3/auto/lib/openssl/conf delete mode 100644 src/deps/src/nginx-1.30.3/auto/lib/openssl/make delete mode 100644 src/deps/src/nginx-1.30.3/auto/lib/openssl/makefile.bcc delete mode 100644 src/deps/src/nginx-1.30.3/auto/lib/openssl/makefile.msvc delete mode 100644 src/deps/src/nginx-1.30.3/auto/lib/pcre/conf delete mode 100644 src/deps/src/nginx-1.30.3/auto/lib/pcre/make delete mode 100644 src/deps/src/nginx-1.30.3/auto/lib/pcre/makefile.bcc delete mode 100644 src/deps/src/nginx-1.30.3/auto/lib/pcre/makefile.msvc delete mode 100644 src/deps/src/nginx-1.30.3/auto/lib/pcre/makefile.owc delete mode 100644 src/deps/src/nginx-1.30.3/auto/lib/perl/conf delete mode 100644 src/deps/src/nginx-1.30.3/auto/lib/perl/make delete mode 100644 src/deps/src/nginx-1.30.3/auto/lib/zlib/conf delete mode 100644 src/deps/src/nginx-1.30.3/auto/lib/zlib/make delete mode 100644 src/deps/src/nginx-1.30.3/auto/lib/zlib/makefile.bcc delete mode 100644 src/deps/src/nginx-1.30.3/auto/lib/zlib/makefile.msvc delete mode 100644 src/deps/src/nginx-1.30.3/auto/lib/zlib/makefile.owc delete mode 100644 src/deps/src/nginx-1.30.3/auto/make delete mode 100644 src/deps/src/nginx-1.30.3/auto/module delete mode 100644 src/deps/src/nginx-1.30.3/auto/modules delete mode 100644 src/deps/src/nginx-1.30.3/auto/nohave delete mode 100644 src/deps/src/nginx-1.30.3/auto/options delete mode 100644 src/deps/src/nginx-1.30.3/auto/os/conf delete mode 100644 src/deps/src/nginx-1.30.3/auto/os/darwin delete mode 100644 src/deps/src/nginx-1.30.3/auto/os/freebsd delete mode 100644 src/deps/src/nginx-1.30.3/auto/os/linux delete mode 100644 src/deps/src/nginx-1.30.3/auto/os/solaris delete mode 100644 src/deps/src/nginx-1.30.3/auto/os/win32 delete mode 100644 src/deps/src/nginx-1.30.3/auto/sources delete mode 100644 src/deps/src/nginx-1.30.3/auto/stubs delete mode 100644 src/deps/src/nginx-1.30.3/auto/summary delete mode 100644 src/deps/src/nginx-1.30.3/auto/threads delete mode 100644 src/deps/src/nginx-1.30.3/auto/types/sizeof delete mode 100644 src/deps/src/nginx-1.30.3/auto/types/typedef delete mode 100644 src/deps/src/nginx-1.30.3/auto/types/uintptr_t delete mode 100644 src/deps/src/nginx-1.30.3/auto/types/value delete mode 100644 src/deps/src/nginx-1.30.3/auto/unix delete mode 100644 src/deps/src/nginx-1.30.3/conf/fastcgi.conf delete mode 100644 src/deps/src/nginx-1.30.3/conf/fastcgi_params delete mode 100644 src/deps/src/nginx-1.30.3/conf/koi-utf delete mode 100644 src/deps/src/nginx-1.30.3/conf/koi-win delete mode 100644 src/deps/src/nginx-1.30.3/conf/mime.types delete mode 100644 src/deps/src/nginx-1.30.3/conf/nginx.conf delete mode 100644 src/deps/src/nginx-1.30.3/conf/scgi_params delete mode 100644 src/deps/src/nginx-1.30.3/conf/uwsgi_params delete mode 100644 src/deps/src/nginx-1.30.3/conf/win-utf delete mode 100644 src/deps/src/nginx-1.30.3/contrib/README delete mode 100644 src/deps/src/nginx-1.30.3/contrib/geo2nginx.pl delete mode 100644 src/deps/src/nginx-1.30.3/contrib/unicode2nginx/koi-utf delete mode 100755 src/deps/src/nginx-1.30.3/contrib/unicode2nginx/unicode-to-nginx.pl delete mode 100644 src/deps/src/nginx-1.30.3/contrib/unicode2nginx/win-utf delete mode 100644 src/deps/src/nginx-1.30.3/contrib/vim/ftdetect/nginx.vim delete mode 100644 src/deps/src/nginx-1.30.3/contrib/vim/ftplugin/nginx.vim delete mode 100644 src/deps/src/nginx-1.30.3/contrib/vim/indent/nginx.vim delete mode 100644 src/deps/src/nginx-1.30.3/contrib/vim/syntax/nginx.vim delete mode 100644 src/deps/src/nginx-1.30.3/misc/GNUmakefile delete mode 100644 src/deps/src/nginx-1.30.3/misc/README delete mode 100644 src/deps/src/nginx-1.30.3/src/core/nginx.c delete mode 100644 src/deps/src/nginx-1.30.3/src/core/nginx.h delete mode 100644 src/deps/src/nginx-1.30.3/src/core/ngx_array.c delete mode 100644 src/deps/src/nginx-1.30.3/src/core/ngx_array.h delete mode 100644 src/deps/src/nginx-1.30.3/src/core/ngx_bpf.c delete mode 100644 src/deps/src/nginx-1.30.3/src/core/ngx_bpf.h delete mode 100644 src/deps/src/nginx-1.30.3/src/core/ngx_buf.c delete mode 100644 src/deps/src/nginx-1.30.3/src/core/ngx_buf.h delete mode 100644 src/deps/src/nginx-1.30.3/src/core/ngx_conf_file.c delete mode 100644 src/deps/src/nginx-1.30.3/src/core/ngx_conf_file.h delete mode 100644 src/deps/src/nginx-1.30.3/src/core/ngx_config.h delete mode 100644 src/deps/src/nginx-1.30.3/src/core/ngx_connection.c delete mode 100644 src/deps/src/nginx-1.30.3/src/core/ngx_connection.h delete mode 100644 src/deps/src/nginx-1.30.3/src/core/ngx_core.h delete mode 100644 src/deps/src/nginx-1.30.3/src/core/ngx_cpuinfo.c delete mode 100644 src/deps/src/nginx-1.30.3/src/core/ngx_crc.h delete mode 100644 src/deps/src/nginx-1.30.3/src/core/ngx_crc32.c delete mode 100644 src/deps/src/nginx-1.30.3/src/core/ngx_crc32.h delete mode 100644 src/deps/src/nginx-1.30.3/src/core/ngx_crypt.c delete mode 100644 src/deps/src/nginx-1.30.3/src/core/ngx_crypt.h delete mode 100644 src/deps/src/nginx-1.30.3/src/core/ngx_cycle.c delete mode 100644 src/deps/src/nginx-1.30.3/src/core/ngx_cycle.h delete mode 100644 src/deps/src/nginx-1.30.3/src/core/ngx_file.c delete mode 100644 src/deps/src/nginx-1.30.3/src/core/ngx_file.h delete mode 100644 src/deps/src/nginx-1.30.3/src/core/ngx_hash.c delete mode 100644 src/deps/src/nginx-1.30.3/src/core/ngx_hash.h delete mode 100644 src/deps/src/nginx-1.30.3/src/core/ngx_inet.c delete mode 100644 src/deps/src/nginx-1.30.3/src/core/ngx_inet.h delete mode 100644 src/deps/src/nginx-1.30.3/src/core/ngx_list.c delete mode 100644 src/deps/src/nginx-1.30.3/src/core/ngx_list.h delete mode 100644 src/deps/src/nginx-1.30.3/src/core/ngx_log.c delete mode 100644 src/deps/src/nginx-1.30.3/src/core/ngx_log.h delete mode 100644 src/deps/src/nginx-1.30.3/src/core/ngx_md5.c delete mode 100644 src/deps/src/nginx-1.30.3/src/core/ngx_md5.h delete mode 100644 src/deps/src/nginx-1.30.3/src/core/ngx_module.c delete mode 100644 src/deps/src/nginx-1.30.3/src/core/ngx_module.h delete mode 100644 src/deps/src/nginx-1.30.3/src/core/ngx_murmurhash.c delete mode 100644 src/deps/src/nginx-1.30.3/src/core/ngx_murmurhash.h delete mode 100644 src/deps/src/nginx-1.30.3/src/core/ngx_open_file_cache.c delete mode 100644 src/deps/src/nginx-1.30.3/src/core/ngx_open_file_cache.h delete mode 100644 src/deps/src/nginx-1.30.3/src/core/ngx_output_chain.c delete mode 100644 src/deps/src/nginx-1.30.3/src/core/ngx_palloc.c delete mode 100644 src/deps/src/nginx-1.30.3/src/core/ngx_palloc.h delete mode 100644 src/deps/src/nginx-1.30.3/src/core/ngx_parse.c delete mode 100644 src/deps/src/nginx-1.30.3/src/core/ngx_parse.h delete mode 100644 src/deps/src/nginx-1.30.3/src/core/ngx_parse_time.c delete mode 100644 src/deps/src/nginx-1.30.3/src/core/ngx_parse_time.h delete mode 100644 src/deps/src/nginx-1.30.3/src/core/ngx_proxy_protocol.c delete mode 100644 src/deps/src/nginx-1.30.3/src/core/ngx_proxy_protocol.h delete mode 100644 src/deps/src/nginx-1.30.3/src/core/ngx_queue.c delete mode 100644 src/deps/src/nginx-1.30.3/src/core/ngx_queue.h delete mode 100644 src/deps/src/nginx-1.30.3/src/core/ngx_radix_tree.c delete mode 100644 src/deps/src/nginx-1.30.3/src/core/ngx_radix_tree.h delete mode 100644 src/deps/src/nginx-1.30.3/src/core/ngx_rbtree.c delete mode 100644 src/deps/src/nginx-1.30.3/src/core/ngx_rbtree.h delete mode 100644 src/deps/src/nginx-1.30.3/src/core/ngx_regex.c delete mode 100644 src/deps/src/nginx-1.30.3/src/core/ngx_regex.h delete mode 100644 src/deps/src/nginx-1.30.3/src/core/ngx_resolver.c delete mode 100644 src/deps/src/nginx-1.30.3/src/core/ngx_resolver.h delete mode 100644 src/deps/src/nginx-1.30.3/src/core/ngx_rwlock.c delete mode 100644 src/deps/src/nginx-1.30.3/src/core/ngx_rwlock.h delete mode 100644 src/deps/src/nginx-1.30.3/src/core/ngx_sha1.c delete mode 100644 src/deps/src/nginx-1.30.3/src/core/ngx_sha1.h delete mode 100644 src/deps/src/nginx-1.30.3/src/core/ngx_shmtx.c delete mode 100644 src/deps/src/nginx-1.30.3/src/core/ngx_shmtx.h delete mode 100644 src/deps/src/nginx-1.30.3/src/core/ngx_slab.c delete mode 100644 src/deps/src/nginx-1.30.3/src/core/ngx_slab.h delete mode 100644 src/deps/src/nginx-1.30.3/src/core/ngx_spinlock.c delete mode 100644 src/deps/src/nginx-1.30.3/src/core/ngx_string.c delete mode 100644 src/deps/src/nginx-1.30.3/src/core/ngx_string.h delete mode 100644 src/deps/src/nginx-1.30.3/src/core/ngx_syslog.c delete mode 100644 src/deps/src/nginx-1.30.3/src/core/ngx_syslog.h delete mode 100644 src/deps/src/nginx-1.30.3/src/core/ngx_thread_pool.c delete mode 100644 src/deps/src/nginx-1.30.3/src/core/ngx_thread_pool.h delete mode 100644 src/deps/src/nginx-1.30.3/src/core/ngx_times.c delete mode 100644 src/deps/src/nginx-1.30.3/src/core/ngx_times.h delete mode 100644 src/deps/src/nginx-1.30.3/src/event/modules/ngx_devpoll_module.c delete mode 100644 src/deps/src/nginx-1.30.3/src/event/modules/ngx_epoll_module.c delete mode 100644 src/deps/src/nginx-1.30.3/src/event/modules/ngx_eventport_module.c delete mode 100644 src/deps/src/nginx-1.30.3/src/event/modules/ngx_iocp_module.c delete mode 100644 src/deps/src/nginx-1.30.3/src/event/modules/ngx_iocp_module.h delete mode 100644 src/deps/src/nginx-1.30.3/src/event/modules/ngx_kqueue_module.c delete mode 100644 src/deps/src/nginx-1.30.3/src/event/modules/ngx_poll_module.c delete mode 100644 src/deps/src/nginx-1.30.3/src/event/modules/ngx_select_module.c delete mode 100644 src/deps/src/nginx-1.30.3/src/event/modules/ngx_win32_poll_module.c delete mode 100644 src/deps/src/nginx-1.30.3/src/event/modules/ngx_win32_select_module.c delete mode 100644 src/deps/src/nginx-1.30.3/src/event/ngx_event.c delete mode 100644 src/deps/src/nginx-1.30.3/src/event/ngx_event.h delete mode 100644 src/deps/src/nginx-1.30.3/src/event/ngx_event_accept.c delete mode 100644 src/deps/src/nginx-1.30.3/src/event/ngx_event_acceptex.c delete mode 100644 src/deps/src/nginx-1.30.3/src/event/ngx_event_connect.c delete mode 100644 src/deps/src/nginx-1.30.3/src/event/ngx_event_connect.h delete mode 100644 src/deps/src/nginx-1.30.3/src/event/ngx_event_connectex.c delete mode 100644 src/deps/src/nginx-1.30.3/src/event/ngx_event_openssl.c delete mode 100644 src/deps/src/nginx-1.30.3/src/event/ngx_event_openssl.h delete mode 100644 src/deps/src/nginx-1.30.3/src/event/ngx_event_openssl_cache.c delete mode 100644 src/deps/src/nginx-1.30.3/src/event/ngx_event_openssl_stapling.c delete mode 100644 src/deps/src/nginx-1.30.3/src/event/ngx_event_pipe.c delete mode 100644 src/deps/src/nginx-1.30.3/src/event/ngx_event_pipe.h delete mode 100644 src/deps/src/nginx-1.30.3/src/event/ngx_event_posted.c delete mode 100644 src/deps/src/nginx-1.30.3/src/event/ngx_event_posted.h delete mode 100644 src/deps/src/nginx-1.30.3/src/event/ngx_event_timer.c delete mode 100644 src/deps/src/nginx-1.30.3/src/event/ngx_event_timer.h delete mode 100644 src/deps/src/nginx-1.30.3/src/event/ngx_event_udp.c delete mode 100644 src/deps/src/nginx-1.30.3/src/event/ngx_event_udp.h delete mode 100644 src/deps/src/nginx-1.30.3/src/event/quic/bpf/bpfgen.sh delete mode 100644 src/deps/src/nginx-1.30.3/src/event/quic/bpf/makefile delete mode 100644 src/deps/src/nginx-1.30.3/src/event/quic/bpf/ngx_quic_reuseport_helper.c delete mode 100644 src/deps/src/nginx-1.30.3/src/event/quic/ngx_event_quic.c delete mode 100644 src/deps/src/nginx-1.30.3/src/event/quic/ngx_event_quic.h delete mode 100644 src/deps/src/nginx-1.30.3/src/event/quic/ngx_event_quic_ack.c delete mode 100644 src/deps/src/nginx-1.30.3/src/event/quic/ngx_event_quic_ack.h delete mode 100644 src/deps/src/nginx-1.30.3/src/event/quic/ngx_event_quic_bpf.c delete mode 100644 src/deps/src/nginx-1.30.3/src/event/quic/ngx_event_quic_bpf_code.c delete mode 100644 src/deps/src/nginx-1.30.3/src/event/quic/ngx_event_quic_connection.h delete mode 100644 src/deps/src/nginx-1.30.3/src/event/quic/ngx_event_quic_connid.c delete mode 100644 src/deps/src/nginx-1.30.3/src/event/quic/ngx_event_quic_connid.h delete mode 100644 src/deps/src/nginx-1.30.3/src/event/quic/ngx_event_quic_frames.c delete mode 100644 src/deps/src/nginx-1.30.3/src/event/quic/ngx_event_quic_frames.h delete mode 100644 src/deps/src/nginx-1.30.3/src/event/quic/ngx_event_quic_migration.c delete mode 100644 src/deps/src/nginx-1.30.3/src/event/quic/ngx_event_quic_migration.h delete mode 100644 src/deps/src/nginx-1.30.3/src/event/quic/ngx_event_quic_openssl_compat.c delete mode 100644 src/deps/src/nginx-1.30.3/src/event/quic/ngx_event_quic_openssl_compat.h delete mode 100644 src/deps/src/nginx-1.30.3/src/event/quic/ngx_event_quic_output.c delete mode 100644 src/deps/src/nginx-1.30.3/src/event/quic/ngx_event_quic_output.h delete mode 100644 src/deps/src/nginx-1.30.3/src/event/quic/ngx_event_quic_protection.c delete mode 100644 src/deps/src/nginx-1.30.3/src/event/quic/ngx_event_quic_protection.h delete mode 100644 src/deps/src/nginx-1.30.3/src/event/quic/ngx_event_quic_socket.c delete mode 100644 src/deps/src/nginx-1.30.3/src/event/quic/ngx_event_quic_socket.h delete mode 100644 src/deps/src/nginx-1.30.3/src/event/quic/ngx_event_quic_ssl.c delete mode 100644 src/deps/src/nginx-1.30.3/src/event/quic/ngx_event_quic_ssl.h delete mode 100644 src/deps/src/nginx-1.30.3/src/event/quic/ngx_event_quic_streams.c delete mode 100644 src/deps/src/nginx-1.30.3/src/event/quic/ngx_event_quic_streams.h delete mode 100644 src/deps/src/nginx-1.30.3/src/event/quic/ngx_event_quic_tokens.c delete mode 100644 src/deps/src/nginx-1.30.3/src/event/quic/ngx_event_quic_tokens.h delete mode 100644 src/deps/src/nginx-1.30.3/src/event/quic/ngx_event_quic_transport.c delete mode 100644 src/deps/src/nginx-1.30.3/src/event/quic/ngx_event_quic_transport.h delete mode 100644 src/deps/src/nginx-1.30.3/src/event/quic/ngx_event_quic_udp.c delete mode 100644 src/deps/src/nginx-1.30.3/src/http/modules/ngx_http_access_module.c delete mode 100644 src/deps/src/nginx-1.30.3/src/http/modules/ngx_http_addition_filter_module.c delete mode 100644 src/deps/src/nginx-1.30.3/src/http/modules/ngx_http_auth_basic_module.c delete mode 100644 src/deps/src/nginx-1.30.3/src/http/modules/ngx_http_auth_request_module.c delete mode 100644 src/deps/src/nginx-1.30.3/src/http/modules/ngx_http_autoindex_module.c delete mode 100644 src/deps/src/nginx-1.30.3/src/http/modules/ngx_http_browser_module.c delete mode 100644 src/deps/src/nginx-1.30.3/src/http/modules/ngx_http_charset_filter_module.c delete mode 100644 src/deps/src/nginx-1.30.3/src/http/modules/ngx_http_chunked_filter_module.c delete mode 100644 src/deps/src/nginx-1.30.3/src/http/modules/ngx_http_dav_module.c delete mode 100644 src/deps/src/nginx-1.30.3/src/http/modules/ngx_http_degradation_module.c delete mode 100644 src/deps/src/nginx-1.30.3/src/http/modules/ngx_http_empty_gif_module.c delete mode 100644 src/deps/src/nginx-1.30.3/src/http/modules/ngx_http_fastcgi_module.c delete mode 100644 src/deps/src/nginx-1.30.3/src/http/modules/ngx_http_flv_module.c delete mode 100644 src/deps/src/nginx-1.30.3/src/http/modules/ngx_http_geo_module.c delete mode 100644 src/deps/src/nginx-1.30.3/src/http/modules/ngx_http_geoip_module.c delete mode 100644 src/deps/src/nginx-1.30.3/src/http/modules/ngx_http_grpc_module.c delete mode 100644 src/deps/src/nginx-1.30.3/src/http/modules/ngx_http_gunzip_filter_module.c delete mode 100644 src/deps/src/nginx-1.30.3/src/http/modules/ngx_http_gzip_filter_module.c delete mode 100644 src/deps/src/nginx-1.30.3/src/http/modules/ngx_http_gzip_static_module.c delete mode 100644 src/deps/src/nginx-1.30.3/src/http/modules/ngx_http_headers_filter_module.c delete mode 100644 src/deps/src/nginx-1.30.3/src/http/modules/ngx_http_image_filter_module.c delete mode 100644 src/deps/src/nginx-1.30.3/src/http/modules/ngx_http_index_module.c delete mode 100644 src/deps/src/nginx-1.30.3/src/http/modules/ngx_http_limit_conn_module.c delete mode 100644 src/deps/src/nginx-1.30.3/src/http/modules/ngx_http_limit_req_module.c delete mode 100644 src/deps/src/nginx-1.30.3/src/http/modules/ngx_http_log_module.c delete mode 100644 src/deps/src/nginx-1.30.3/src/http/modules/ngx_http_map_module.c delete mode 100644 src/deps/src/nginx-1.30.3/src/http/modules/ngx_http_memcached_module.c delete mode 100644 src/deps/src/nginx-1.30.3/src/http/modules/ngx_http_mirror_module.c delete mode 100644 src/deps/src/nginx-1.30.3/src/http/modules/ngx_http_mp4_module.c delete mode 100644 src/deps/src/nginx-1.30.3/src/http/modules/ngx_http_not_modified_filter_module.c delete mode 100644 src/deps/src/nginx-1.30.3/src/http/modules/ngx_http_proxy_module.c delete mode 100644 src/deps/src/nginx-1.30.3/src/http/modules/ngx_http_proxy_module.h delete mode 100644 src/deps/src/nginx-1.30.3/src/http/modules/ngx_http_proxy_v2_module.c delete mode 100644 src/deps/src/nginx-1.30.3/src/http/modules/ngx_http_random_index_module.c delete mode 100644 src/deps/src/nginx-1.30.3/src/http/modules/ngx_http_range_filter_module.c delete mode 100644 src/deps/src/nginx-1.30.3/src/http/modules/ngx_http_realip_module.c delete mode 100644 src/deps/src/nginx-1.30.3/src/http/modules/ngx_http_referer_module.c delete mode 100644 src/deps/src/nginx-1.30.3/src/http/modules/ngx_http_rewrite_module.c delete mode 100644 src/deps/src/nginx-1.30.3/src/http/modules/ngx_http_scgi_module.c delete mode 100644 src/deps/src/nginx-1.30.3/src/http/modules/ngx_http_secure_link_module.c delete mode 100644 src/deps/src/nginx-1.30.3/src/http/modules/ngx_http_slice_filter_module.c delete mode 100644 src/deps/src/nginx-1.30.3/src/http/modules/ngx_http_split_clients_module.c delete mode 100644 src/deps/src/nginx-1.30.3/src/http/modules/ngx_http_ssi_filter_module.c delete mode 100644 src/deps/src/nginx-1.30.3/src/http/modules/ngx_http_ssi_filter_module.h delete mode 100644 src/deps/src/nginx-1.30.3/src/http/modules/ngx_http_ssl_module.c delete mode 100644 src/deps/src/nginx-1.30.3/src/http/modules/ngx_http_ssl_module.h delete mode 100644 src/deps/src/nginx-1.30.3/src/http/modules/ngx_http_static_module.c delete mode 100644 src/deps/src/nginx-1.30.3/src/http/modules/ngx_http_stub_status_module.c delete mode 100644 src/deps/src/nginx-1.30.3/src/http/modules/ngx_http_sub_filter_module.c delete mode 100644 src/deps/src/nginx-1.30.3/src/http/modules/ngx_http_try_files_module.c delete mode 100644 src/deps/src/nginx-1.30.3/src/http/modules/ngx_http_upstream_hash_module.c delete mode 100644 src/deps/src/nginx-1.30.3/src/http/modules/ngx_http_upstream_ip_hash_module.c delete mode 100644 src/deps/src/nginx-1.30.3/src/http/modules/ngx_http_upstream_keepalive_module.c delete mode 100644 src/deps/src/nginx-1.30.3/src/http/modules/ngx_http_upstream_least_conn_module.c delete mode 100644 src/deps/src/nginx-1.30.3/src/http/modules/ngx_http_upstream_random_module.c delete mode 100644 src/deps/src/nginx-1.30.3/src/http/modules/ngx_http_upstream_sticky_module.c delete mode 100644 src/deps/src/nginx-1.30.3/src/http/modules/ngx_http_upstream_zone_module.c delete mode 100644 src/deps/src/nginx-1.30.3/src/http/modules/ngx_http_userid_filter_module.c delete mode 100644 src/deps/src/nginx-1.30.3/src/http/modules/ngx_http_uwsgi_module.c delete mode 100644 src/deps/src/nginx-1.30.3/src/http/modules/ngx_http_xslt_filter_module.c delete mode 100644 src/deps/src/nginx-1.30.3/src/http/modules/perl/Makefile.PL delete mode 100644 src/deps/src/nginx-1.30.3/src/http/modules/perl/nginx.pm delete mode 100644 src/deps/src/nginx-1.30.3/src/http/modules/perl/nginx.xs delete mode 100644 src/deps/src/nginx-1.30.3/src/http/modules/perl/ngx_http_perl_module.c delete mode 100644 src/deps/src/nginx-1.30.3/src/http/modules/perl/ngx_http_perl_module.h delete mode 100644 src/deps/src/nginx-1.30.3/src/http/modules/perl/typemap delete mode 100644 src/deps/src/nginx-1.30.3/src/http/ngx_http.c delete mode 100644 src/deps/src/nginx-1.30.3/src/http/ngx_http.h delete mode 100644 src/deps/src/nginx-1.30.3/src/http/ngx_http_cache.h delete mode 100644 src/deps/src/nginx-1.30.3/src/http/ngx_http_config.h delete mode 100644 src/deps/src/nginx-1.30.3/src/http/ngx_http_copy_filter_module.c delete mode 100644 src/deps/src/nginx-1.30.3/src/http/ngx_http_core_module.c delete mode 100644 src/deps/src/nginx-1.30.3/src/http/ngx_http_core_module.h delete mode 100644 src/deps/src/nginx-1.30.3/src/http/ngx_http_file_cache.c delete mode 100644 src/deps/src/nginx-1.30.3/src/http/ngx_http_header_filter_module.c delete mode 100644 src/deps/src/nginx-1.30.3/src/http/ngx_http_huff_decode.c delete mode 100644 src/deps/src/nginx-1.30.3/src/http/ngx_http_huff_encode.c delete mode 100644 src/deps/src/nginx-1.30.3/src/http/ngx_http_parse.c delete mode 100644 src/deps/src/nginx-1.30.3/src/http/ngx_http_postpone_filter_module.c delete mode 100644 src/deps/src/nginx-1.30.3/src/http/ngx_http_request.c delete mode 100644 src/deps/src/nginx-1.30.3/src/http/ngx_http_request.h delete mode 100644 src/deps/src/nginx-1.30.3/src/http/ngx_http_request_body.c delete mode 100644 src/deps/src/nginx-1.30.3/src/http/ngx_http_script.c delete mode 100644 src/deps/src/nginx-1.30.3/src/http/ngx_http_script.h delete mode 100644 src/deps/src/nginx-1.30.3/src/http/ngx_http_special_response.c delete mode 100644 src/deps/src/nginx-1.30.3/src/http/ngx_http_upstream.c delete mode 100644 src/deps/src/nginx-1.30.3/src/http/ngx_http_upstream.h delete mode 100644 src/deps/src/nginx-1.30.3/src/http/ngx_http_upstream_round_robin.c delete mode 100644 src/deps/src/nginx-1.30.3/src/http/ngx_http_upstream_round_robin.h delete mode 100644 src/deps/src/nginx-1.30.3/src/http/ngx_http_variables.c delete mode 100644 src/deps/src/nginx-1.30.3/src/http/ngx_http_variables.h delete mode 100644 src/deps/src/nginx-1.30.3/src/http/ngx_http_write_filter_module.c delete mode 100644 src/deps/src/nginx-1.30.3/src/http/v2/ngx_http_v2.c delete mode 100644 src/deps/src/nginx-1.30.3/src/http/v2/ngx_http_v2.h delete mode 100644 src/deps/src/nginx-1.30.3/src/http/v2/ngx_http_v2_encode.c delete mode 100644 src/deps/src/nginx-1.30.3/src/http/v2/ngx_http_v2_filter_module.c delete mode 100644 src/deps/src/nginx-1.30.3/src/http/v2/ngx_http_v2_module.c delete mode 100644 src/deps/src/nginx-1.30.3/src/http/v2/ngx_http_v2_module.h delete mode 100644 src/deps/src/nginx-1.30.3/src/http/v2/ngx_http_v2_table.c delete mode 100644 src/deps/src/nginx-1.30.3/src/http/v3/ngx_http_v3.c delete mode 100644 src/deps/src/nginx-1.30.3/src/http/v3/ngx_http_v3.h delete mode 100644 src/deps/src/nginx-1.30.3/src/http/v3/ngx_http_v3_encode.c delete mode 100644 src/deps/src/nginx-1.30.3/src/http/v3/ngx_http_v3_encode.h delete mode 100644 src/deps/src/nginx-1.30.3/src/http/v3/ngx_http_v3_filter_module.c delete mode 100644 src/deps/src/nginx-1.30.3/src/http/v3/ngx_http_v3_module.c delete mode 100644 src/deps/src/nginx-1.30.3/src/http/v3/ngx_http_v3_parse.c delete mode 100644 src/deps/src/nginx-1.30.3/src/http/v3/ngx_http_v3_parse.h delete mode 100644 src/deps/src/nginx-1.30.3/src/http/v3/ngx_http_v3_request.c delete mode 100644 src/deps/src/nginx-1.30.3/src/http/v3/ngx_http_v3_table.c delete mode 100644 src/deps/src/nginx-1.30.3/src/http/v3/ngx_http_v3_table.h delete mode 100644 src/deps/src/nginx-1.30.3/src/http/v3/ngx_http_v3_uni.c delete mode 100644 src/deps/src/nginx-1.30.3/src/http/v3/ngx_http_v3_uni.h delete mode 100644 src/deps/src/nginx-1.30.3/src/mail/ngx_mail.c delete mode 100644 src/deps/src/nginx-1.30.3/src/mail/ngx_mail.h delete mode 100644 src/deps/src/nginx-1.30.3/src/mail/ngx_mail_auth_http_module.c delete mode 100644 src/deps/src/nginx-1.30.3/src/mail/ngx_mail_core_module.c delete mode 100644 src/deps/src/nginx-1.30.3/src/mail/ngx_mail_handler.c delete mode 100644 src/deps/src/nginx-1.30.3/src/mail/ngx_mail_imap_handler.c delete mode 100644 src/deps/src/nginx-1.30.3/src/mail/ngx_mail_imap_module.c delete mode 100644 src/deps/src/nginx-1.30.3/src/mail/ngx_mail_imap_module.h delete mode 100644 src/deps/src/nginx-1.30.3/src/mail/ngx_mail_parse.c delete mode 100644 src/deps/src/nginx-1.30.3/src/mail/ngx_mail_pop3_handler.c delete mode 100644 src/deps/src/nginx-1.30.3/src/mail/ngx_mail_pop3_module.c delete mode 100644 src/deps/src/nginx-1.30.3/src/mail/ngx_mail_pop3_module.h delete mode 100644 src/deps/src/nginx-1.30.3/src/mail/ngx_mail_proxy_module.c delete mode 100644 src/deps/src/nginx-1.30.3/src/mail/ngx_mail_realip_module.c delete mode 100644 src/deps/src/nginx-1.30.3/src/mail/ngx_mail_smtp_handler.c delete mode 100644 src/deps/src/nginx-1.30.3/src/mail/ngx_mail_smtp_module.c delete mode 100644 src/deps/src/nginx-1.30.3/src/mail/ngx_mail_smtp_module.h delete mode 100644 src/deps/src/nginx-1.30.3/src/mail/ngx_mail_ssl_module.c delete mode 100644 src/deps/src/nginx-1.30.3/src/mail/ngx_mail_ssl_module.h delete mode 100644 src/deps/src/nginx-1.30.3/src/misc/ngx_cpp_test_module.cpp delete mode 100644 src/deps/src/nginx-1.30.3/src/misc/ngx_google_perftools_module.c delete mode 100644 src/deps/src/nginx-1.30.3/src/os/unix/ngx_alloc.c delete mode 100644 src/deps/src/nginx-1.30.3/src/os/unix/ngx_alloc.h delete mode 100644 src/deps/src/nginx-1.30.3/src/os/unix/ngx_atomic.h delete mode 100644 src/deps/src/nginx-1.30.3/src/os/unix/ngx_channel.c delete mode 100644 src/deps/src/nginx-1.30.3/src/os/unix/ngx_channel.h delete mode 100644 src/deps/src/nginx-1.30.3/src/os/unix/ngx_daemon.c delete mode 100644 src/deps/src/nginx-1.30.3/src/os/unix/ngx_darwin.h delete mode 100644 src/deps/src/nginx-1.30.3/src/os/unix/ngx_darwin_config.h delete mode 100644 src/deps/src/nginx-1.30.3/src/os/unix/ngx_darwin_init.c delete mode 100644 src/deps/src/nginx-1.30.3/src/os/unix/ngx_darwin_sendfile_chain.c delete mode 100644 src/deps/src/nginx-1.30.3/src/os/unix/ngx_dlopen.c delete mode 100644 src/deps/src/nginx-1.30.3/src/os/unix/ngx_dlopen.h delete mode 100644 src/deps/src/nginx-1.30.3/src/os/unix/ngx_errno.c delete mode 100644 src/deps/src/nginx-1.30.3/src/os/unix/ngx_errno.h delete mode 100644 src/deps/src/nginx-1.30.3/src/os/unix/ngx_file_aio_read.c delete mode 100644 src/deps/src/nginx-1.30.3/src/os/unix/ngx_files.c delete mode 100644 src/deps/src/nginx-1.30.3/src/os/unix/ngx_files.h delete mode 100644 src/deps/src/nginx-1.30.3/src/os/unix/ngx_freebsd.h delete mode 100644 src/deps/src/nginx-1.30.3/src/os/unix/ngx_freebsd_config.h delete mode 100644 src/deps/src/nginx-1.30.3/src/os/unix/ngx_freebsd_init.c delete mode 100644 src/deps/src/nginx-1.30.3/src/os/unix/ngx_freebsd_sendfile_chain.c delete mode 100644 src/deps/src/nginx-1.30.3/src/os/unix/ngx_gcc_atomic_amd64.h delete mode 100644 src/deps/src/nginx-1.30.3/src/os/unix/ngx_gcc_atomic_ppc.h delete mode 100644 src/deps/src/nginx-1.30.3/src/os/unix/ngx_gcc_atomic_sparc64.h delete mode 100644 src/deps/src/nginx-1.30.3/src/os/unix/ngx_gcc_atomic_x86.h delete mode 100644 src/deps/src/nginx-1.30.3/src/os/unix/ngx_linux.h delete mode 100644 src/deps/src/nginx-1.30.3/src/os/unix/ngx_linux_aio_read.c delete mode 100644 src/deps/src/nginx-1.30.3/src/os/unix/ngx_linux_config.h delete mode 100644 src/deps/src/nginx-1.30.3/src/os/unix/ngx_linux_init.c delete mode 100644 src/deps/src/nginx-1.30.3/src/os/unix/ngx_linux_sendfile_chain.c delete mode 100644 src/deps/src/nginx-1.30.3/src/os/unix/ngx_os.h delete mode 100644 src/deps/src/nginx-1.30.3/src/os/unix/ngx_posix_config.h delete mode 100644 src/deps/src/nginx-1.30.3/src/os/unix/ngx_posix_init.c delete mode 100644 src/deps/src/nginx-1.30.3/src/os/unix/ngx_process.c delete mode 100644 src/deps/src/nginx-1.30.3/src/os/unix/ngx_process.h delete mode 100644 src/deps/src/nginx-1.30.3/src/os/unix/ngx_process_cycle.c delete mode 100644 src/deps/src/nginx-1.30.3/src/os/unix/ngx_process_cycle.h delete mode 100644 src/deps/src/nginx-1.30.3/src/os/unix/ngx_readv_chain.c delete mode 100644 src/deps/src/nginx-1.30.3/src/os/unix/ngx_recv.c delete mode 100644 src/deps/src/nginx-1.30.3/src/os/unix/ngx_send.c delete mode 100644 src/deps/src/nginx-1.30.3/src/os/unix/ngx_setaffinity.c delete mode 100644 src/deps/src/nginx-1.30.3/src/os/unix/ngx_setaffinity.h delete mode 100644 src/deps/src/nginx-1.30.3/src/os/unix/ngx_setproctitle.c delete mode 100644 src/deps/src/nginx-1.30.3/src/os/unix/ngx_setproctitle.h delete mode 100644 src/deps/src/nginx-1.30.3/src/os/unix/ngx_shmem.c delete mode 100644 src/deps/src/nginx-1.30.3/src/os/unix/ngx_shmem.h delete mode 100644 src/deps/src/nginx-1.30.3/src/os/unix/ngx_socket.c delete mode 100644 src/deps/src/nginx-1.30.3/src/os/unix/ngx_socket.h delete mode 100644 src/deps/src/nginx-1.30.3/src/os/unix/ngx_solaris.h delete mode 100644 src/deps/src/nginx-1.30.3/src/os/unix/ngx_solaris_config.h delete mode 100644 src/deps/src/nginx-1.30.3/src/os/unix/ngx_solaris_init.c delete mode 100644 src/deps/src/nginx-1.30.3/src/os/unix/ngx_solaris_sendfilev_chain.c delete mode 100644 src/deps/src/nginx-1.30.3/src/os/unix/ngx_sunpro_amd64.il delete mode 100644 src/deps/src/nginx-1.30.3/src/os/unix/ngx_sunpro_atomic_sparc64.h delete mode 100644 src/deps/src/nginx-1.30.3/src/os/unix/ngx_sunpro_sparc64.il delete mode 100644 src/deps/src/nginx-1.30.3/src/os/unix/ngx_sunpro_x86.il delete mode 100644 src/deps/src/nginx-1.30.3/src/os/unix/ngx_thread.h delete mode 100644 src/deps/src/nginx-1.30.3/src/os/unix/ngx_thread_cond.c delete mode 100644 src/deps/src/nginx-1.30.3/src/os/unix/ngx_thread_id.c delete mode 100644 src/deps/src/nginx-1.30.3/src/os/unix/ngx_thread_mutex.c delete mode 100644 src/deps/src/nginx-1.30.3/src/os/unix/ngx_time.c delete mode 100644 src/deps/src/nginx-1.30.3/src/os/unix/ngx_time.h delete mode 100644 src/deps/src/nginx-1.30.3/src/os/unix/ngx_udp_recv.c delete mode 100644 src/deps/src/nginx-1.30.3/src/os/unix/ngx_udp_send.c delete mode 100644 src/deps/src/nginx-1.30.3/src/os/unix/ngx_udp_sendmsg_chain.c delete mode 100644 src/deps/src/nginx-1.30.3/src/os/unix/ngx_user.c delete mode 100644 src/deps/src/nginx-1.30.3/src/os/unix/ngx_user.h delete mode 100644 src/deps/src/nginx-1.30.3/src/os/unix/ngx_writev_chain.c delete mode 100644 src/deps/src/nginx-1.30.3/src/os/win32/nginx.ico delete mode 100644 src/deps/src/nginx-1.30.3/src/os/win32/nginx.rc delete mode 100644 src/deps/src/nginx-1.30.3/src/os/win32/nginx_icon16.xpm delete mode 100644 src/deps/src/nginx-1.30.3/src/os/win32/nginx_icon32.xpm delete mode 100644 src/deps/src/nginx-1.30.3/src/os/win32/nginx_icon48.xpm delete mode 100644 src/deps/src/nginx-1.30.3/src/os/win32/ngx_alloc.c delete mode 100644 src/deps/src/nginx-1.30.3/src/os/win32/ngx_alloc.h delete mode 100644 src/deps/src/nginx-1.30.3/src/os/win32/ngx_atomic.h delete mode 100644 src/deps/src/nginx-1.30.3/src/os/win32/ngx_dlopen.c delete mode 100644 src/deps/src/nginx-1.30.3/src/os/win32/ngx_dlopen.h delete mode 100644 src/deps/src/nginx-1.30.3/src/os/win32/ngx_errno.c delete mode 100644 src/deps/src/nginx-1.30.3/src/os/win32/ngx_errno.h delete mode 100644 src/deps/src/nginx-1.30.3/src/os/win32/ngx_event_log.c delete mode 100644 src/deps/src/nginx-1.30.3/src/os/win32/ngx_files.c delete mode 100644 src/deps/src/nginx-1.30.3/src/os/win32/ngx_files.h delete mode 100644 src/deps/src/nginx-1.30.3/src/os/win32/ngx_os.h delete mode 100644 src/deps/src/nginx-1.30.3/src/os/win32/ngx_process.c delete mode 100644 src/deps/src/nginx-1.30.3/src/os/win32/ngx_process.h delete mode 100644 src/deps/src/nginx-1.30.3/src/os/win32/ngx_process_cycle.c delete mode 100644 src/deps/src/nginx-1.30.3/src/os/win32/ngx_process_cycle.h delete mode 100644 src/deps/src/nginx-1.30.3/src/os/win32/ngx_service.c delete mode 100644 src/deps/src/nginx-1.30.3/src/os/win32/ngx_shmem.c delete mode 100644 src/deps/src/nginx-1.30.3/src/os/win32/ngx_shmem.h delete mode 100644 src/deps/src/nginx-1.30.3/src/os/win32/ngx_socket.c delete mode 100644 src/deps/src/nginx-1.30.3/src/os/win32/ngx_socket.h delete mode 100644 src/deps/src/nginx-1.30.3/src/os/win32/ngx_stat.c delete mode 100644 src/deps/src/nginx-1.30.3/src/os/win32/ngx_thread.c delete mode 100644 src/deps/src/nginx-1.30.3/src/os/win32/ngx_thread.h delete mode 100644 src/deps/src/nginx-1.30.3/src/os/win32/ngx_time.c delete mode 100644 src/deps/src/nginx-1.30.3/src/os/win32/ngx_time.h delete mode 100644 src/deps/src/nginx-1.30.3/src/os/win32/ngx_udp_wsarecv.c delete mode 100644 src/deps/src/nginx-1.30.3/src/os/win32/ngx_user.c delete mode 100644 src/deps/src/nginx-1.30.3/src/os/win32/ngx_user.h delete mode 100644 src/deps/src/nginx-1.30.3/src/os/win32/ngx_win32_config.h delete mode 100644 src/deps/src/nginx-1.30.3/src/os/win32/ngx_win32_init.c delete mode 100644 src/deps/src/nginx-1.30.3/src/os/win32/ngx_wsarecv.c delete mode 100644 src/deps/src/nginx-1.30.3/src/os/win32/ngx_wsarecv_chain.c delete mode 100644 src/deps/src/nginx-1.30.3/src/os/win32/ngx_wsasend.c delete mode 100644 src/deps/src/nginx-1.30.3/src/os/win32/ngx_wsasend_chain.c delete mode 100644 src/deps/src/nginx-1.30.3/src/stream/ngx_stream.c delete mode 100644 src/deps/src/nginx-1.30.3/src/stream/ngx_stream.h delete mode 100644 src/deps/src/nginx-1.30.3/src/stream/ngx_stream_access_module.c delete mode 100644 src/deps/src/nginx-1.30.3/src/stream/ngx_stream_core_module.c delete mode 100644 src/deps/src/nginx-1.30.3/src/stream/ngx_stream_geo_module.c delete mode 100644 src/deps/src/nginx-1.30.3/src/stream/ngx_stream_geoip_module.c delete mode 100644 src/deps/src/nginx-1.30.3/src/stream/ngx_stream_handler.c delete mode 100644 src/deps/src/nginx-1.30.3/src/stream/ngx_stream_limit_conn_module.c delete mode 100644 src/deps/src/nginx-1.30.3/src/stream/ngx_stream_log_module.c delete mode 100644 src/deps/src/nginx-1.30.3/src/stream/ngx_stream_map_module.c delete mode 100644 src/deps/src/nginx-1.30.3/src/stream/ngx_stream_pass_module.c delete mode 100644 src/deps/src/nginx-1.30.3/src/stream/ngx_stream_proxy_module.c delete mode 100644 src/deps/src/nginx-1.30.3/src/stream/ngx_stream_realip_module.c delete mode 100644 src/deps/src/nginx-1.30.3/src/stream/ngx_stream_return_module.c delete mode 100644 src/deps/src/nginx-1.30.3/src/stream/ngx_stream_script.c delete mode 100644 src/deps/src/nginx-1.30.3/src/stream/ngx_stream_script.h delete mode 100644 src/deps/src/nginx-1.30.3/src/stream/ngx_stream_set_module.c delete mode 100644 src/deps/src/nginx-1.30.3/src/stream/ngx_stream_split_clients_module.c delete mode 100644 src/deps/src/nginx-1.30.3/src/stream/ngx_stream_ssl_module.c delete mode 100644 src/deps/src/nginx-1.30.3/src/stream/ngx_stream_ssl_module.h delete mode 100644 src/deps/src/nginx-1.30.3/src/stream/ngx_stream_ssl_preread_module.c delete mode 100644 src/deps/src/nginx-1.30.3/src/stream/ngx_stream_upstream.c delete mode 100644 src/deps/src/nginx-1.30.3/src/stream/ngx_stream_upstream.h delete mode 100644 src/deps/src/nginx-1.30.3/src/stream/ngx_stream_upstream_hash_module.c delete mode 100644 src/deps/src/nginx-1.30.3/src/stream/ngx_stream_upstream_least_conn_module.c delete mode 100644 src/deps/src/nginx-1.30.3/src/stream/ngx_stream_upstream_random_module.c delete mode 100644 src/deps/src/nginx-1.30.3/src/stream/ngx_stream_upstream_round_robin.c delete mode 100644 src/deps/src/nginx-1.30.3/src/stream/ngx_stream_upstream_round_robin.h delete mode 100644 src/deps/src/nginx-1.30.3/src/stream/ngx_stream_upstream_zone_module.c delete mode 100644 src/deps/src/nginx-1.30.3/src/stream/ngx_stream_variables.c delete mode 100644 src/deps/src/nginx-1.30.3/src/stream/ngx_stream_variables.h delete mode 100644 src/deps/src/nginx-1.30.3/src/stream/ngx_stream_write_filter_module.c diff --git a/CHANGELOG.md b/CHANGELOG.md index 9872565c2a..6762c162d6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,10 +6,11 @@ - [BUGFIX] `backup`: support MySQL 9 and MariaDB 12 backup/restore with current authentication, TLS, and privilege defaults while preserving compatibility with older servers; refresh the documented database compatibility matrix, including PostgreSQL 18. - [BUGFIX] `ui`: fix plugin hook loading and chaining, and purge unavailable PRO plugin pages after license loss. - [BUGFIX] `letsencrypt`: quarantine broken renewal lineages and persist the cleaned cache before Certbot runs. (Fixes #3733) -- [UI] Reports and Bans pages: show unknown countries as not applicable, and make exports and bulk actions honor active filters. (Fixes #3683, #3685) - [FEATURE] `metrics`: buffer reports during Redis OOM events, make list and facet updates atomic, and add the `METRICS_REDIS_TTL` setting. - [FEATURE] `headers`: deny Chrome built-in AI APIs in the default `PERMISSIONS_POLICY`. - [FEATURE] `misc`: allow the `QUERY` HTTP method by default in `ALLOWED_METHODS` and bundled service templates. +- [LINUX] Updated the NGINX version to v1.30.4 for Fedora 43 and 44 now that it is available in their repositories. +- [UI] Reports and Bans pages: show unknown countries as not applicable, and make exports and bulk actions honor active filters. (Fixes #3683, #3685) ## v1.6.13 - 2026/07/16 diff --git a/docs/de/integrations.md b/docs/de/integrations.md index 070c98f18f..ea371d2ddd 100644 --- a/docs/de/integrations.md +++ b/docs/de/integrations.md @@ -2340,10 +2340,10 @@ Bitte stellen Sie sicher, dass Sie **NGINX 1.30.4 installiert haben, bevor Sie B sudo dnf config-manager setopt updates-testing.enabled=1 ``` - Fedora stellt bereits NGINX 1.30.3 zur Verfügung, das wir unterstützen + Fedora stellt bereits NGINX 1.30.4 zur Verfügung, das wir unterstützen ```shell - sudo dnf install -y --allowerasing nginx-1.30.3 + sudo dnf install -y --allowerasing nginx-1.30.4 ``` !!! example "Einrichtungsassistenten deaktivieren" diff --git a/docs/es/integrations.md b/docs/es/integrations.md index 77e873bc5d..9b06c485d1 100644 --- a/docs/es/integrations.md +++ b/docs/es/integrations.md @@ -2341,10 +2341,10 @@ Asegúrate de tener **NGINX 1.30.4 instalado antes de instalar BunkerWeb**. Para sudo dnf config-manager setopt updates-testing.enabled=1 ``` - Fedora ya proporciona NGINX 1.30.3 que soportamos + Fedora ya proporciona NGINX 1.30.4 que soportamos ```shell - sudo dnf install -y --allowerasing nginx-1.30.3 + sudo dnf install -y --allowerasing nginx-1.30.4 ``` !!! example "Deshabilitar el asistente de configuración" diff --git a/docs/fr/integrations.md b/docs/fr/integrations.md index 0337d0475e..9a43ea8599 100644 --- a/docs/fr/integrations.md +++ b/docs/fr/integrations.md @@ -2343,10 +2343,10 @@ Veuillez vous assurer que **NGINX 1.30.4 est installé avant d'installer BunkerW sudo dnf config-manager setopt updates-testing.enabled=1 ``` - Fedora fournit déjà NGINX 1.30.3, que nous prenons en charge + Fedora fournit déjà NGINX 1.30.4, que nous prenons en charge ```shell - sudo dnf install -y --allowerasing nginx-1.30.3 + sudo dnf install -y --allowerasing nginx-1.30.4 ``` !!! example "Désactiver l'assistant d'installation" diff --git a/docs/integrations.md b/docs/integrations.md index 8d7891eefa..00124a4c71 100644 --- a/docs/integrations.md +++ b/docs/integrations.md @@ -2456,10 +2456,10 @@ Please ensure that you have **NGINX 1.30.4 installed before installing BunkerWeb sudo dnf config-manager setopt updates-testing.enabled=1 ``` - Fedora already provides NGINX 1.30.3 that we support + Fedora already provides NGINX 1.30.4 that we support ```shell - sudo dnf install -y --allowerasing nginx-1.30.3 + sudo dnf install -y --allowerasing nginx-1.30.4 ``` !!! example "Disable the setup wizard" diff --git a/docs/zh/integrations.md b/docs/zh/integrations.md index 99df22a579..c778982045 100644 --- a/docs/zh/integrations.md +++ b/docs/zh/integrations.md @@ -2340,10 +2340,10 @@ sudo ./install-bunkerweb.sh --yes --api sudo dnf config-manager setopt updates-testing.enabled=1 ``` - Fedora 已经提供了我们支持的 NGINX 1.30.3 + Fedora 已经提供了我们支持的 NGINX 1.30.4 ```shell - sudo dnf install -y --allowerasing nginx-1.30.3 + sudo dnf install -y --allowerasing nginx-1.30.4 ``` !!! example "禁用设置向导" diff --git a/src/deps/deps.json b/src/deps/deps.json index 6ce6abf015..107a39c27e 100644 --- a/src/deps/deps.json +++ b/src/deps/deps.json @@ -254,13 +254,6 @@ "commit": "017cf98dcce217946572a896f0992370475e189f", "post_install": "rm -r src/deps/src/nginx/docs" }, - { - "id": "nginx-1.30.3", - "name": "Nginx v1.30.3", - "url": "https://github.com/nginx/nginx.git", - "commit": "47c3628d23efaa1bfb1a32afbe9e3d013f860c2c", - "post_install": "rm -r src/deps/src/nginx-1.30.3/docs" - }, { "id": "nginx-1.28.0", "name": "Nginx v1.28.0", diff --git a/src/deps/install.sh b/src/deps/install.sh index c05619a41f..5d241d0cae 100644 --- a/src/deps/install.sh +++ b/src/deps/install.sh @@ -218,15 +218,7 @@ fi # Set CFALGS export CFLAGS="$CFLAGS -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=1" -# Fedora ships nginx from its own repos (1.30.3), one patch release behind the -# source-built target (1.30.4). Dynamic modules must be compiled against the -# matching nginx source tree or they fail to load, so select the 1.30.3 tree here. -if [ "$OS" = "fedora" ] ; then - NGINX_SRC_DIR="/tmp/bunkerweb/deps/src/nginx-1.30.3" -else - NGINX_SRC_DIR="/tmp/bunkerweb/deps/src/nginx" -fi -export CHANGE_DIR="$NGINX_SRC_DIR" +export CHANGE_DIR="/tmp/bunkerweb/deps/src/nginx" do_and_check_cmd mv auto/configure ./ echo '#!/bin/bash' > "${CHANGE_DIR}/configure-fix.sh" echo "./configure $CONFARGS --add-dynamic-module=/tmp/bunkerweb/deps/src/headers-more-nginx-module --add-dynamic-module=/tmp/bunkerweb/deps/src/nginx_cookie_flag_module --add-dynamic-module=/tmp/bunkerweb/deps/src/lua-nginx-module --add-dynamic-module=/tmp/bunkerweb/deps/src/ngx_brotli --add-dynamic-module=/tmp/bunkerweb/deps/src/ngx_devel_kit --add-dynamic-module=/tmp/bunkerweb/deps/src/stream-lua-nginx-module" --add-dynamic-module=/tmp/bunkerweb/deps/src/modsecurity-nginx --add-dynamic-module=/tmp/bunkerweb/deps/src/lua-upstream-nginx-module >> "${CHANGE_DIR}/configure-fix.sh" diff --git a/src/deps/src/nginx-1.30.3/.gitignore b/src/deps/src/nginx-1.30.3/.gitignore deleted file mode 100644 index 7e5088682b..0000000000 --- a/src/deps/src/nginx-1.30.3/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -/Makefile -/objs/ -/tmp/ diff --git a/src/deps/src/nginx-1.30.3/CODE_OF_CONDUCT.md b/src/deps/src/nginx-1.30.3/CODE_OF_CONDUCT.md deleted file mode 100644 index a99d8854a6..0000000000 --- a/src/deps/src/nginx-1.30.3/CODE_OF_CONDUCT.md +++ /dev/null @@ -1,126 +0,0 @@ -# Contributor Covenant Code of Conduct - -## Our Pledge - -We as members, contributors, and leaders pledge to make participation in our -community a harassment-free experience for everyone, regardless of age, body -size, visible or invisible disability, ethnicity, sex characteristics, gender -identity and expression, level of experience, education, socio economic status, -nationality, personal appearance, race, caste, color, religion, or sexual -identity and orientation. - -We pledge to act and interact in ways that contribute to an open, welcoming, -diverse, inclusive, and healthy community. - -## Our Standards - -Examples of behavior that contributes to a positive environment for our -community include: - -- Demonstrating empathy and kindness toward other people -- Being respectful of differing opinions, viewpoints, and experiences -- Giving and gracefully accepting constructive feedback -- Accepting responsibility and apologizing to those affected by our mistakes -and learning from the experience -- Focusing on what is best not just for us as individuals, but for the -overall community - -Examples of unacceptable behavior include: - -- The use of sexualized language or imagery, and sexual attention or advances -of any kind -- Trolling, insulting or derogatory comments, and personal or political attacks -- Public or private harassment -- Publishing others' private information, such as a physical or email address, -without their explicit permission -- Other conduct which could reasonably be considered inappropriate in a -professional setting - -## Enforcement Responsibilities - -Community leaders are responsible for clarifying and enforcing our standards -of acceptable behavior and will take appropriate and fair corrective action -in response to any behavior that they deem inappropriate, threatening, -offensive, or harmful. - -Community leaders have the right and responsibility to remove, edit, or reject -comments, commits, code, wiki edits, issues, and other contributions that are -not aligned to this Code of Conduct, and will communicate reasons for -moderation decisions when appropriate. - -## Scope - -This Code of Conduct applies within all community spaces, and also applies when -an individual is officially representing the community in public spaces. -Examples of representing our community include using an official email address, -posting via an official social media account, or acting as an appointed -representative at an online or offline event. - -## Enforcement - -Instances of abusive, harassing, or otherwise unacceptable behavior may be -reported to the community leaders responsible for enforcement at -. All complaints will be reviewed and investigated -promptly and fairly. - -All community leaders are obligated to respect the privacy and security of the -reporter of any incident. - -## Enforcement Guidelines - -Community leaders will follow these Community Impact Guidelines in determining -the consequences for any action they deem in violation of this Code of Conduct: - -### 1. Correction - -**Community Impact**: Use of inappropriate language or other behavior deemed -unprofessional or unwelcome in the community. - -**Consequence**: A private, written warning from community leaders, providing -clarity around the nature of the violation and an explanation of why the -behavior was inappropriate. A public apology may be requested. - -### 2. Warning - -**Community Impact**: A violation through a single incident or series of actions. - -**Consequence**: A warning with consequences for continued behavior. No -interaction with the people involved, including unsolicited interaction with -those enforcing the Code of Conduct, for a specified period of time. This -includes avoiding interactions in community spaces as well as external -channels like social media. Violating these terms may lead to a temporary or -permanent ban. - -### 3. Temporary Ban - -**Community Impact**: A serious violation of community standards, including -sustained inappropriate behavior. - -**Consequence**: A temporary ban from any sort of interaction or public -communication with the community for a specified period of time. No public or -private interaction with the people involved, including unsolicited interaction -with those enforcing the Code of Conduct, is allowed during this period. -Violating these terms may lead to a permanent ban. - -### 4. Permanent Ban - -**Community Impact**: Demonstrating a pattern of violation of community -standards, including sustained inappropriate behavior, harassment of an -individual, or aggression toward or disparagement of classes of individuals. - -**Consequence**: A permanent ban from any sort of public interaction within -the community. - -## Attribution - -This Code of Conduct is adapted from the -[Contributor Covenant](https://www.contributor-covenant.org), version 2.1, -available at -. - -Community Impact Guidelines were inspired by -[Mozilla's code of conduct enforcement ladder](https://github.com/mozilla/inclusion). - -For answers to common questions about this code of conduct, see the FAQ at -. Translations are available at -. diff --git a/src/deps/src/nginx-1.30.3/CONTRIBUTING.md b/src/deps/src/nginx-1.30.3/CONTRIBUTING.md deleted file mode 100644 index 19033141f9..0000000000 --- a/src/deps/src/nginx-1.30.3/CONTRIBUTING.md +++ /dev/null @@ -1,128 +0,0 @@ -# Contributing Guidelines - -The following is a set of guidelines for contributing to nginx project. -We really appreciate that you are considering contributing! - -## Table of Contents - -- [Report a Bug](#report-a-bug) -- [Suggest a Feature or Enhancement](#suggest-a-feature-or-enhancement) -- [Open a Discussion](#open-a-discussion) -- [Submit a Pull Request](#submit-a-pull-request) -- [Issue Lifecycle](#issue-lifecycle) - -## Report a Bug - -To report a bug, open an issue on GitHub with the label `bug` using the -available [bug report issue form](/.github/ISSUE_TEMPLATE/bug_report.yml). -Please ensure the bug has not already been reported. **If the bug is a -potential security vulnerability, please report it using our -[security policy](/SECURITY.md).** - -## Suggest a Feature or Enhancement - -To suggest a feature or enhancement, please create an issue on GitHub with the -label `enhancement` using the available -[feature request issue form](/.github/ISSUE_TEMPLATE/feature_request.yml). -Please ensure the feature or enhancement has not already been suggested. - -## Open a Discussion - -If you want to engage in a conversation with the community and maintainers, -we encourage you to use -[GitHub Discussions](https://github.com/nginx/nginx/discussions) to discuss -the NGINX codebase or the [NGINX Community forum](https://community.nginx.org) -to chat anything else NGINX (including troubleshooting). - -## Submit a Pull Request - -Follow this plan to contribute a change to NGINX source code: - -- Fork the NGINX repository -- Create a branch -- Implement your changes in this branch -- Submit a pull request (PR) when your changes are tested and ready for review - -Refer to -[NGINX Development Guide](https://nginx.org/en/docs/dev/development_guide.html) -for questions about NGINX programming. - -### Formatting Changes - -- Changes should be formatted according to the -[code style](https://nginx.org/en/docs/dev/development_guide.html#code_style) -used by NGINX; sometimes, there is no clear rule, in which case examine how -existing NGINX sources are formatted and mimic this style; changes will more -likely be accepted if style corresponds to the surrounding code - -- Keep a clean, concise and meaningful commit history on your branch, rebasing -locally and breaking changes logically into commits before submitting a PR - -- Each commit message should have a single-line subject line followed by verbose -description after an empty line - -- Limit the subject line to 67 characters, and the rest of the commit message -to 76 characters - -- Use subject line prefixes for commits that affect a specific portion of the -code; examples include "Upstream:", "QUIC:", or "Core:"; see the commit history -to get an idea of the prefixes used - -- If the commit fixes an open issue then you can use the "Closes:" tag/trailer -to reference it and have GitHub automatically close it once it's been merged. -E.g.: - - `Closes: https://github.com/nginx/nginx/issues/9999` - - That should go at the end of the commit message, separated by a blank line, - along with any other tags. - -### Before Submitting - -- The proposed changes should work properly on a wide range of -[supported platforms](https://nginx.org/en/index.html#tested_os_and_platforms) - -- Try to make it clear why the suggested change is needed, and provide a use -case, if possible - -- Passing your changes through the test suite is a good way to ensure that they -do not cause a regression; the repository with tests can be cloned with the -following command: - -```bash -git clone https://github.com/nginx/nginx-tests.git -``` - -- Submitting a change implies granting project a permission to use it under the -[BSD-2-Clause license](/LICENSE) - -### F5 Contributor License Agreement (CLA) - -F5 requires all contributors to agree to the terms of the F5 CLA -(available [here](https://github.com/f5/f5-cla/blob/main/docs/f5_cla.md)) -before any of their changes can be incorporated into an F5 Open Source -repository (even contributions to the F5 CLA itself!). - -If you have not yet agreed to the F5 CLA terms and submit a PR to this -repository, a bot will prompt you to view and agree to the F5 CLA. -You will have to agree to the F5 CLA terms through a comment in the PR -before any of your changes can be merged. Your agreement signature -will be safely stored by F5 and no longer be required in future PRs. - -## Issue Lifecycle - -To ensure a balance between work carried out by the NGINX engineering team -while encouraging community involvement on this project, we use the following -issue lifecycle: - -- A new issue is created by a community member - -- An owner on the NGINX engineering team is assigned to the issue; this -owner shepherds the issue through the subsequent stages in the issue lifecycle - -- The owner assigns one or more -[labels](https://github.com/nginx/nginx/issues/labels) to the issue - -- The owner, in collaboration with the wider team (product management and -engineering), determines what milestone to attach to an issue; -generally, milestones correspond to product releases diff --git a/src/deps/src/nginx-1.30.3/LICENSE b/src/deps/src/nginx-1.30.3/LICENSE deleted file mode 100644 index 4366554533..0000000000 --- a/src/deps/src/nginx-1.30.3/LICENSE +++ /dev/null @@ -1,24 +0,0 @@ -Copyright (C) 2002-2021 Igor Sysoev -Copyright (C) 2011-2026 Nginx, Inc. -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions -are met: -1. Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. -2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - -THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY -OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF -SUCH DAMAGE. diff --git a/src/deps/src/nginx-1.30.3/README.md b/src/deps/src/nginx-1.30.3/README.md deleted file mode 100644 index d6761842c9..0000000000 --- a/src/deps/src/nginx-1.30.3/README.md +++ /dev/null @@ -1,232 +0,0 @@ - - - - NGINX Banner - - -[![Project Status: Active – The project has reached a stable, usable state and is being actively developed.](https://www.repostatus.org/badges/latest/active.svg)](https://www.repostatus.org/#active) -[![Community Forum](https://img.shields.io/badge/community-forum-009639?logo=discourse&link=https%3A%2F%2Fcommunity.nginx.org)](https://community.nginx.org) -[![License](https://img.shields.io/badge/License-BSD%202--Clause-blue.svg)](/LICENSE) -[![Code of Conduct](https://img.shields.io/badge/Contributor%20Covenant-2.1-4baaaa.svg)](/CODE_OF_CONDUCT.md) - -NGINX (pronounced "engine x" or "en-jin-eks") is the world's most popular Web Server, high performance Load Balancer, Reverse Proxy, API Gateway and Content Cache. - -NGINX is free and open source software, distributed under the terms of a simplified [2-clause BSD-like license](LICENSE). - -Enterprise distributions, commercial support and training are available from [F5, Inc](https://www.f5.com/products/nginx). - -> [!IMPORTANT] -> The goal of this README is to provide a basic, structured introduction to NGINX for novice users. Please refer to the [full NGINX documentation](https://nginx.org/en/docs/) for detailed information on [installing](https://nginx.org/en/docs/install.html), [building](https://nginx.org/en/docs/configure.html), [configuring](https://nginx.org/en/docs/dirindex.html), [debugging](https://nginx.org/en/docs/debugging_log.html), and more. These documentation pages also contain a more detailed [Beginners Guide](https://nginx.org/en/docs/beginners_guide.html), How-Tos, [Development guide](https://nginx.org/en/docs/dev/development_guide.html), and a complete module and [directive reference](https://nginx.org/en/docs/dirindex.html). - -# Table of contents -- [How it works](#how-it-works) - - [Modules](#modules) - - [Configurations](#configurations) - - [Runtime](#runtime) -- [Downloading and installing](#downloading-and-installing) - - [Stable and Mainline binaries](#stable-and-mainline-binaries) - - [Linux binary installation process](#linux-binary-installation-process) - - [FreeBSD installation process](#freebsd-installation-process) - - [Windows executables](#windows-executables) - - [Dynamic modules](#dynamic-modules) -- [Getting started with NGINX](#getting-started-with-nginx) - - [Installing SSL certificates and enabling TLS encryption](#installing-ssl-certificates-and-enabling-tls-encryption) - - [Load Balancing](#load-balancing) - - [Rate limiting](#rate-limiting) - - [Content caching](#content-caching) -- [Building from source](#building-from-source) - - [Installing dependencies](#installing-dependencies) - - [Cloning the NGINX GitHub repository](#cloning-the-nginx-github-repository) - - [Configuring the build](#configuring-the-build) - - [Compiling](#compiling) - - [Location of binary and installation](#location-of-binary-and-installation) - - [Running and testing the installed binary](#running-and-testing-the-installed-binary) -- [Asking questions and reporting issues](#asking-questions-and-reporting-issues) -- [Contributing code](#contributing-code) -- [Additional help and resources](#additional-help-and-resources) -- [Changelog](#changelog) -- [License](#license) - -# How it works -NGINX is installed software with binary packages available for all major operating systems and Linux distributions. See [Tested OS and Platforms](https://nginx.org/en/#tested_os_and_platforms) for a full list of compatible systems. - -> [!IMPORTANT] -> While nearly all popular Linux-based operating systems are distributed with a community version of nginx, we highly advise installation and usage of official [packages](https://nginx.org/en/linux_packages.html) or sources from this repository. Doing so ensures that you're using the most recent release or source code, including the latest feature-set, fixes and security patches. - -## Modules -NGINX is comprised of individual modules, each extending core functionality by providing additional, configurable features. See "Modules reference" at the bottom of [nginx documentation](https://nginx.org/en/docs/) for a complete list of official modules. - -NGINX modules can be built and distributed as static or dynamic modules. Static modules are defined at build-time, compiled, and distributed in the resulting binaries. See [Dynamic Modules](#dynamic-modules) for more information on how they work, as well as, how to obtain, install, and configure them. - -> [!TIP] -> You can issue the following command to see which static modules your NGINX binaries were built with: -```bash -nginx -V -``` -> See [Configuring the build](#configuring-the-build) for information on how to include specific Static modules into your nginx build. - -## Configurations -NGINX is highly flexible and configurable. Provisioning the software is achieved via text-based config file(s) accepting parameters called "[Directives](https://nginx.org/en/docs/dirindex.html)". See [Configuration File's Structure](https://nginx.org/en/docs/beginners_guide.html#conf_structure) for a comprehensive description of how NGINX configuration files work. - -> [!NOTE] -> The set of directives available to your distribution of NGINX is dependent on which [modules](#modules) have been made available to it. - -## Runtime -Rather than running in a single, monolithic process, NGINX is architected to scale beyond Operating System process limitations by operating as a collection of processes. They include: -- A "master" process that maintains worker processes, as well as, reads and evaluates configuration files. -- One or more "worker" processes that process data (eg. HTTP requests). - -The number of [worker processes](https://nginx.org/en/docs/ngx_core_module.html#worker_processes) is defined in the configuration file and may be fixed for a given configuration or automatically adjusted to the number of available CPU cores. In most cases, the latter option optimally balances load across available system resources, as NGINX is designed to efficiently distribute work across all worker processes. - -> [!TIP] -> Processes synchronize data through shared memory. For this reason, many NGINX directives require the allocation of shared memory zones. As an example, when configuring [rate limiting](https://nginx.org/en/docs/http/ngx_http_limit_req_module.html#limit_req), connecting clients may need to be tracked in a [common memory zone](https://nginx.org/en/docs/http/ngx_http_limit_req_module.html#limit_req_zone) so all worker processes can know how many times a particular client has accessed the server in a span of time. - -# Downloading and installing -Follow these steps to download and install precompiled NGINX binaries. You may also choose to [build NGINX locally from source code](#building-from-source). - -## Stable and Mainline binaries -NGINX binaries are built and distributed in two versions: stable and mainline. Stable binaries are built from stable branches and only contain critical fixes backported from the mainline version. Mainline binaries are built from the [master branch](https://github.com/nginx/nginx/tree/master) and contain the latest features and bugfixes. You'll need to [decide which is appropriate for your purposes](https://docs.nginx.com/nginx/admin-guide/installing-nginx/installing-nginx-open-source/#choosing-between-a-stable-or-a-mainline-version). - -## Linux binary installation process -The NGINX binary installation process takes advantage of package managers native to specific Linux distributions. For this reason, first-time installations involve adding the official NGINX package repository to your system's package manager. Follow [these steps](https://nginx.org/en/linux_packages.html) to download, verify, and install NGINX binaries using the package manager appropriate for your Linux distribution. - -### Upgrades -Future upgrades to the latest version can be managed using the same package manager without the need to manually download and verify binaries. - -## FreeBSD installation process -For more information on installing NGINX on FreeBSD system, visit https://nginx.org/en/docs/install.html - -## Windows executables -Windows executables for mainline and stable releases can be found on the main [NGINX download page](https://nginx.org/en/download.html). Note that the current implementation of NGINX for Windows is at the Proof-of-Concept stage and should only be used for development and testing purposes. For additional information, please see [nginx for Windows](https://nginx.org/en/docs/windows.html). - -## Dynamic modules -NGINX version 1.9.11 added support for [Dynamic Modules](https://nginx.org/en/docs/ngx_core_module.html#load_module). Unlike Static modules, dynamically built modules can be downloaded, installed, and configured after the core NGINX binaries have been built. [Official dynamic module binaries](https://nginx.org/en/linux_packages.html#dynmodules) are available from the same package repository as the core NGINX binaries described in previous steps. - -> [!TIP] -> [NGINX JavaScript (njs)](https://github.com/nginx/njs), is a popular NGINX dynamic module that enables the extension of core NGINX functionality using familiar JavaScript syntax. - -> [!IMPORTANT] -> If desired, dynamic modules can also be built statically into NGINX at compile time. - -# Getting started with NGINX -For a gentle introduction to NGINX basics, please see our [Beginner’s Guide](https://nginx.org/en/docs/beginners_guide.html). - -## Installing SSL certificates and enabling TLS encryption -See [Configuring HTTPS servers](https://nginx.org/en/docs/http/configuring_https_servers.html) for a quick guide on how to enable secure traffic to your NGINX installation. - -## Load Balancing -For a quick start guide on configuring NGINX as a Load Balancer, please see [Using nginx as HTTP load balancer](https://nginx.org/en/docs/http/load_balancing.html). - -## Rate limiting -See our [Rate Limiting with NGINX](https://blog.nginx.org/blog/rate-limiting-nginx) blog post for an overview of core concepts for provisioning NGINX as an API Gateway. - -## Content caching -See [A Guide to Caching with NGINX and NGINX Plus](https://blog.nginx.org/blog/nginx-caching-guide) blog post for an overview of how to use NGINX as a content cache (e.g. edge server of a content delivery network). - -# Building from source -The following steps can be used to build NGINX from source code available in this repository. - -## Installing dependencies -Most Linux distributions will require several dependencies to be installed in order to build NGINX. The following instructions are specific to the `apt` package manager, widely available on most Ubuntu/Debian distributions and their derivatives. - -> [!TIP] -> It is always a good idea to update your package repository lists prior to installing new packages. -> ```bash -> sudo apt update -> ``` - -### Installing compiler and make utility -Use the following command to install the GNU C compiler and Make utility. - -```bash -sudo apt install gcc make -``` - -### Installing dependency libraries - -```bash -sudo apt install libpcre3-dev zlib1g-dev -``` - -> [!WARNING] -> This is the minimal set of dependency libraries needed to build NGINX with rewriting and gzip capabilities. Other dependencies may be required if you choose to build NGINX with additional modules. Monitor the output of the `configure` command discussed in the following sections for information on which modules may be missing. For example, if you plan to use SSL certificates to encrypt traffic with TLS, you'll need to install the OpenSSL library. To do so, issue the following command. - ->```bash ->sudo apt install libssl-dev - -## Cloning the NGINX GitHub repository -Using your preferred method, clone the NGINX repository into your development directory. See [Cloning a GitHub Repository](https://docs.github.com/en/repositories/creating-and-managing-repositories/cloning-a-repository) for additional help. - -```bash -git clone https://github.com/nginx/nginx.git -``` - -## Configuring the build -Prior to building NGINX, you must run the `configure` script with [appropriate flags](https://nginx.org/en/docs/configure.html). This will generate a Makefile in your NGINX source root directory that can then be used to compile NGINX with [options specified during configuration](https://nginx.org/en/docs/configure.html). - -From the NGINX source code repository's root directory: - -```bash -auto/configure -``` - -> [!IMPORTANT] -> Configuring the build without any flags will compile NGINX with the default set of options. Please refer to https://nginx.org/en/docs/configure.html for a full list of available build configuration options. - -## Compiling -The `configure` script will generate a `Makefile` in the NGINX source root directory upon successful execution. To compile NGINX into a binary, issue the following command from that same directory: - -```bash -make -``` - -## Location of binary and installation -After successful compilation, a binary will be generated at `/objs/nginx`. To install this binary, issue the following command from the source root directory: - -```bash -sudo make install -``` - -> [!IMPORTANT] -> The binary will be installed into the `/usr/local/nginx/` directory. - -## Running and testing the installed binary -To run the installed binary, issue the following command: - -```bash -sudo /usr/local/nginx/sbin/nginx -``` - -You may test NGINX operation using `curl`. - -```bash -curl localhost -``` - -The output of which should start with: - -```html - - - -Welcome to nginx! -``` - -# Asking questions and reporting issues -See our [Support](SUPPORT.md) guidelines for information on how discuss the codebase, ask troubleshooting questions, and report issues. - -# Contributing code -Please see the [Contributing](CONTRIBUTING.md) guide for information on how to contribute code. - -# Additional help and resources -- See the [NGINX Community Blog](https://blog.nginx.org/) for more tips, tricks and HOW-TOs related to NGINX and related projects. -- Access [nginx.org](https://nginx.org/), your go-to source for all documentation, information and software related to the NGINX suite of projects. - -# Changelog -See our [changelog](https://nginx.org/en/CHANGES) to keep track of updates. - -# License -[2-clause BSD-like license](LICENSE) - ---- -Additional documentation available at: https://nginx.org/en/docs diff --git a/src/deps/src/nginx-1.30.3/SECURITY.md b/src/deps/src/nginx-1.30.3/SECURITY.md deleted file mode 100644 index 8e173ed165..0000000000 --- a/src/deps/src/nginx-1.30.3/SECURITY.md +++ /dev/null @@ -1,103 +0,0 @@ -# Security Policy - -This document provides an overview of security concerns related to nginx -deployments, focusing on confidentiality, integrity, availability, and the -implications of configurations and misconfigurations. - -## Reporting a Vulnerability - -Please report any vulnerabilities via one of the following methods -(in order of preference): - -1. [Report a vulnerability](https://docs.github.com/en/code-security/security-advisories/guidance-on-reporting-and-writing-information-about-vulnerabilities/privately-reporting-a-security-vulnerability) -within this repository. We are using the GitHub workflow that allows us to -manage vulnerabilities in a private manner and interact with reporters -securely. - -2. [Report directly to F5](https://www.f5.com/services/support/report-a-vulnerability). - -3. Report via email to security-alert@nginx.org. -This method will be deprecated in the future. - -### Vulnerability Disclosure and Fix Process - -The nginx team expects that all suspected vulnerabilities be reported -privately via the -[Reporting a Vulnerability](SECURITY.md#reporting-a-vulnerability) guidelines. -If a publicly released vulnerability is reported, we -may request to handle it according to the private disclosure process. -If the reporter agrees, we will follow the private disclosure process. - -Security fixes will be applied to all supported stable releases, as well -as the mainline version, as applicable. We recommend using the most recent -mainline or stable release of nginx. Fixes are created and tested by the core -team using a GitHub private fork for security. If necessary, the reporter -may be invited to contribute to the fork and assist with the solution. - -The nginx team is committed to responsible information disclosure with -sufficient detail, such as the CVSS score and vector. Privately disclosed -vulnerabilities are embargoed by default until the fix is released. -Communications and fixes remain private until made public. As nginx is -supported by F5, we generally follow the -[F5 security vulnerability response policy](https://my.f5.com/manage/s/article/K4602). - -### Vulnerability Disclosure and Fix Service Level Objectives - -- We will acknowledge all vulnerability reports within 1 to 3 days. -- Fixes will be developed and released within 90 days from the date of -disclosure. If an extension is needed, we will work with the disclosing person. -- Publicly disclosed (i.e., Zero-Day vulnerabilities) will be addressed ASAP. - -## Confidentiality, Integrity, and Availability - -### Confidentiality and Integrity - -Vulnerabilities compromising data confidentiality or integrity are considered -the highest priority. Any issue leading to unauthorized data access, leaks, or -manipulation will trigger the security release process. - -### Availability - -Availability issues must meet the following criteria to trigger the security -release process: -- Is present in a standard module included with nginx. -- Arises from traffic that the module is designed to handle. -- Resource exhaustion issues are not mitigated by existing timeout, rate -limiting, or buffer size configurations, or applying changes is impractical. -- Results in highly asymmetric, extreme resource consumption. - -Availability issues excluded from the security release process: -- Local file content or upstream response content resulting only in worker -process termination. -- Issues with experimental features which result only in availability impact. - -## Trusted Configurations and Misconfigurations - -In nginx, configuration files, modules, certificate/key pairs, nginx JavaScript, -and local file content are considered trusted sources. Issues arising from -loading or execution of these trusted components are not considered -vulnerabilities. Operators are responsible for securing and maintaining the -integrity of these sources. Misconfigurations can create vulnerabilities, and -operators should implement configurations according to best practices, review -them regularly, and apply security updates. - -## Data Plane vs. Control Plane - -The data plane handles traffic through nginx, directly interacting with user -data. nginx inherently trusts the content and instructions from upstream -servers. The control plane governs configuration, management, and orchestration. -Misconfigurations or vulnerabilities in the control plane can cause improper -behavior in the data plane. - -## Modules Under Scope - -The policy applies to all nginx modules included in this repository. Security -considerations and attack vectors for each module will be identified, with -recommended configurations to mitigate risks. - -## Debug Logging and Core Files - -Debug logs and core files produced by nginx may contain un-sanitized data, -including sensitive information like client requests, server configurations, -and private key material. These artifacts must be handled carefully to avoid -exposing confidential data. diff --git a/src/deps/src/nginx-1.30.3/SUPPORT.md b/src/deps/src/nginx-1.30.3/SUPPORT.md deleted file mode 100644 index 4e8ab20341..0000000000 --- a/src/deps/src/nginx-1.30.3/SUPPORT.md +++ /dev/null @@ -1,48 +0,0 @@ -# Support - -## Ask a Question - -We use GitHub issues for tracking bugs and feature requests -related to this project. - -If you don't know how something in the codebase works, are curious if NGINX -is capable of achieving your desired functionality or want to discuss the -implementation of an existing or in development feature, please start a -GitHub discussion! - -## NGINX Specific Questions and/or Issues - -This project isn't the right place to get support for NGINX and/or NGINX -troubleshooting questions, but the following resources are available below. -Thanks for your understanding! - -### Community Forum - -We have a [community forum](https://community.nginx.org/)! -If you have any NGINX specific questions and/or issues, -try checking out the [`NGINX category`](https://community.nginx.org/c/projects/nginx/23). -For general discussions around anything tangentially NGINX related, -check out the [`General Discussion category`](https://community.nginx.org/c/general-discussion/34). -Both fellow community members and NGINXers might be able to help you! :) - -### Documentation - -For a comprehensive list of all NGINX directives, check out . - -For a comprehensive list of administration and deployment guides for all -NGINX products, check out . - -## Contributing - -Please see the [contributing guide](/CONTRIBUTING.md) for guidelines -on how to best contribute to this project. - -## Commercial Support - -Commercial support for this project is available. -Please get in touch with [F5 sales](https://www.f5.com/products/get-f5/) -or check your contract details for more information! - -## Community Support - -Community support is offered on a best effort basis through any of our active communities. diff --git a/src/deps/src/nginx-1.30.3/auto/cc/acc b/src/deps/src/nginx-1.30.3/auto/cc/acc deleted file mode 100644 index 64fa6719bd..0000000000 --- a/src/deps/src/nginx-1.30.3/auto/cc/acc +++ /dev/null @@ -1,14 +0,0 @@ - -# Copyright (C) Igor Sysoev -# Copyright (C) Nginx, Inc. - - -# aCC: HP ANSI C++ B3910B A.03.55.02 - -# C89 mode - -CFLAGS="$CFLAGS -Ae" -CC_TEST_FLAGS="-Ae" - -PCRE_OPT="$PCRE_OPT -Ae" -ZLIB_OPT="$ZLIB_OPT -Ae" diff --git a/src/deps/src/nginx-1.30.3/auto/cc/bcc b/src/deps/src/nginx-1.30.3/auto/cc/bcc deleted file mode 100644 index e990a9f73a..0000000000 --- a/src/deps/src/nginx-1.30.3/auto/cc/bcc +++ /dev/null @@ -1,71 +0,0 @@ - -# Copyright (C) Igor Sysoev -# Copyright (C) Nginx, Inc. - - -# Borland C++ 5.5 - -# optimizations - -# maximize speed -CFLAGS="$CFLAGS -O2" - -case $CPU in - pentium) - # optimize for Pentium and Athlon - CPU_OPT="-5" - ;; - - pentiumpro) - # optimize for Pentium Pro, Pentium II and Pentium III - CPU_OPT="-6" - ;; -esac - -# __stdcall -#CPU_OPT="$CPU_OPT -ps" -# __fastcall -#CPU_OPT="$CPU_OPT -pr" - -CFLAGS="$CFLAGS $CPU_OPT" - -# multithreaded -CFLAGS="$CFLAGS -tWM" - -# stop on warning -CFLAGS="$CFLAGS -w!" - -# disable logo -CFLAGS="$CFLAGS -q" - - -# precompiled headers -CORE_DEPS="$CORE_DEPS $NGX_OBJS/ngx_config.csm" -NGX_PCH="$NGX_OBJS/ngx_config.csm" -NGX_BUILD_PCH="-H=$NGX_OBJS/ngx_config.csm" -NGX_USE_PCH="-Hu -H=$NGX_OBJS/ngx_config.csm" - - -# Win32 GUI mode application -#LINK="\$(CC) -laa" - - -# the resource file -NGX_RES="$NGX_OBJS/nginx.res" -NGX_RCC="brcc32 -fo$NGX_OBJS/nginx.res \$(CORE_INCS) $NGX_WIN32_RC" -# the pragma allows to link the resource file using bcc32 and -# to avoid the direct ilink32 calling and the c0w32.obj's WinMain/main problem -NGX_PRAGMA="#pragma resource \"$NGX_OBJS/nginx.res\"" - - -ngx_include_opt="-I" -ngx_objout="-o" -ngx_binout="-e" -ngx_objext="obj" - -ngx_long_start='@&&| - ' -ngx_long_end='|' - -ngx_regex_dirsep='\\' -ngx_dirsep="\\" diff --git a/src/deps/src/nginx-1.30.3/auto/cc/ccc b/src/deps/src/nginx-1.30.3/auto/cc/ccc deleted file mode 100644 index c964045105..0000000000 --- a/src/deps/src/nginx-1.30.3/auto/cc/ccc +++ /dev/null @@ -1,46 +0,0 @@ - -# Copyright (C) Igor Sysoev -# Copyright (C) Nginx, Inc. - - -# Compaq C V6.5-207 - -ngx_include_opt="-I" - -# warnings - -CFLAGS="$CFLAGS -msg_enable level6 -msg_fatal level6" - -CFLAGS="$CFLAGS -msg_disable unknownmacro" -CFLAGS="$CFLAGS -msg_disable unusedincl" -CFLAGS="$CFLAGS -msg_disable unnecincl" -CFLAGS="$CFLAGS -msg_disable nestincl" -CFLAGS="$CFLAGS -msg_disable strctpadding" -CFLAGS="$CFLAGS -msg_disable ansialiascast" -CFLAGS="$CFLAGS -msg_disable inlinestoclsmod" -CFLAGS="$CFLAGS -msg_disable cxxkeyword" -CFLAGS="$CFLAGS -msg_disable longlongsufx" -CFLAGS="$CFLAGS -msg_disable valuepres" - -# STUB -CFLAGS="$CFLAGS -msg_disable truncintcast" -CFLAGS="$CFLAGS -msg_disable trunclongcast" - -CFLAGS="$CFLAGS -msg_disable truncintasn" -CFLAGS="$CFLAGS -msg_disable trunclongint" -CFLAGS="$CFLAGS -msg_disable intconcastsgn" -CFLAGS="$CFLAGS -msg_disable intconstsign" -CFLAGS="$CFLAGS -msg_disable switchlong" -CFLAGS="$CFLAGS -msg_disable subscrbounds2" - -CFLAGS="$CFLAGS -msg_disable hexoctunsign" - -CFLAGS="$CFLAGS -msg_disable ignorecallval" -CFLAGS="$CFLAGS -msg_disable nonstandcast" -CFLAGS="$CFLAGS -msg_disable embedcomment" -CFLAGS="$CFLAGS -msg_disable unreachcode" -CFLAGS="$CFLAGS -msg_disable questcompare2" -CFLAGS="$CFLAGS -msg_disable unusedtop" -CFLAGS="$CFLAGS -msg_disable unrefdecl" - -CFLAGS="$CFLAGS -msg_disable bitnotint" diff --git a/src/deps/src/nginx-1.30.3/auto/cc/clang b/src/deps/src/nginx-1.30.3/auto/cc/clang deleted file mode 100644 index 73b3f94bd0..0000000000 --- a/src/deps/src/nginx-1.30.3/auto/cc/clang +++ /dev/null @@ -1,90 +0,0 @@ - -# Copyright (C) Nginx, Inc. - - -# clang - - -CC_TEST_FLAGS="-pipe" - - -# optimizations - -#NGX_CLANG_OPT="-O2" -#NGX_CLANG_OPT="-Oz" -NGX_CLANG_OPT="-O" - -case $CPU in - pentium) - # optimize for Pentium - CPU_OPT="-march=pentium" - NGX_CPU_CACHE_LINE=32 - ;; - - pentiumpro | pentium3) - # optimize for Pentium Pro, Pentium II and Pentium III - CPU_OPT="-march=pentiumpro" - NGX_CPU_CACHE_LINE=32 - ;; - - pentium4) - # optimize for Pentium 4 - CPU_OPT="-march=pentium4" - NGX_CPU_CACHE_LINE=128 - ;; - - athlon) - # optimize for Athlon - CPU_OPT="-march=athlon" - NGX_CPU_CACHE_LINE=64 - ;; - - opteron) - # optimize for Opteron - CPU_OPT="-march=opteron" - NGX_CPU_CACHE_LINE=64 - ;; - -esac - -CC_AUX_FLAGS="$CC_AUX_FLAGS $CPU_OPT" - - -CFLAGS="$CFLAGS -pipe $CPU_OPT" - -if [ ".$PCRE_OPT" = "." ]; then - PCRE_OPT="-O2 -pipe $CPU_OPT" -else - PCRE_OPT="$PCRE_OPT -pipe" -fi - -if [ ".$ZLIB_OPT" = "." ]; then - ZLIB_OPT="-O2 -pipe $CPU_OPT" -else - ZLIB_OPT="$ZLIB_OPT -pipe" -fi - - -# warnings - -CFLAGS="$CFLAGS $NGX_CLANG_OPT -Wall -Wextra -Wpointer-arith" -CFLAGS="$CFLAGS -Wconditional-uninitialized" -#CFLAGS="$CFLAGS -Wmissing-prototypes" - -# we have a lot of unused function arguments -CFLAGS="$CFLAGS -Wno-unused-parameter" - -# deprecated system OpenSSL library on OS X -if [ "$NGX_SYSTEM" = "Darwin" ]; then - CFLAGS="$CFLAGS -Wno-deprecated-declarations" -fi - -# stop on warning -CFLAGS="$CFLAGS -Werror" - -# debug -CFLAGS="$CFLAGS -g" - -if [ ".$CPP" = "." ]; then - CPP="$CC -E" -fi diff --git a/src/deps/src/nginx-1.30.3/auto/cc/conf b/src/deps/src/nginx-1.30.3/auto/cc/conf deleted file mode 100644 index ba31cb88c9..0000000000 --- a/src/deps/src/nginx-1.30.3/auto/cc/conf +++ /dev/null @@ -1,254 +0,0 @@ - -# Copyright (C) Igor Sysoev -# Copyright (C) Nginx, Inc. - - -LINK="\$(CC)" - -MAIN_LINK= -MODULE_LINK="-shared" - -ngx_include_opt="-I " -ngx_compile_opt="-c" -ngx_pic_opt="-fPIC" -ngx_objout="-o " -ngx_binout="-o " -ngx_objext="o" -ngx_binext= -ngx_modext=".so" - -ngx_long_start= -ngx_long_end= - -ngx_regex_dirsep="\/" -ngx_dirsep='/' - -ngx_regex_cont=' \\\ - ' -ngx_cont=' \ - ' -ngx_tab=' \ - ' -ngx_spacer= - -ngx_long_regex_cont=$ngx_regex_cont -ngx_long_cont=$ngx_cont - -. auto/cc/name - -if test -n "$CFLAGS"; then - - CC_TEST_FLAGS="$CFLAGS $NGX_CC_OPT" - - case $NGX_CC_NAME in - - ccc) - # Compaq C V6.5-207 - - ngx_include_opt="-I" - ;; - - sunc) - - MAIN_LINK= - MODULE_LINK="-G" - - case "$NGX_MACHINE" in - - i86pc) - NGX_AUX=" src/os/unix/ngx_sunpro_x86.il" - ;; - - sun4u | sun4v) - NGX_AUX=" src/os/unix/ngx_sunpro_sparc64.il" - ;; - - esac - - case $CPU in - - amd64) - NGX_AUX=" src/os/unix/ngx_sunpro_amd64.il" - ;; - - esac - ;; - - esac - -else - - case $NGX_CC_NAME in - gcc) - # gcc 2.7.2.3, 2.8.1, 2.95.4, egcs-1.1.2 - # 3.0.4, 3.1.1, 3.2.3, 3.3.2, 3.3.3, 3.3.4, 3.4.0, 3.4.2 - # 4.0.0, 4.0.1, 4.1.0 - - . auto/cc/gcc - ;; - - clang) - # Clang C compiler - - . auto/cc/clang - ;; - - icc) - # Intel C++ compiler 7.1, 8.0, 8.1 - - . auto/cc/icc - ;; - - sunc) - # Sun C 5.7 Patch 117837-04 2005/05/11 - - . auto/cc/sunc - ;; - - ccc) - # Compaq C V6.5-207 - - . auto/cc/ccc - ;; - - acc) - # aCC: HP ANSI C++ B3910B A.03.55.02 - - . auto/cc/acc - ;; - - msvc) - # MSVC++ 6.0 SP2, MSVC++ Toolkit 2003 - - . auto/cc/msvc - ;; - - owc) - # Open Watcom C 1.0, 1.2 - - . auto/cc/owc - ;; - - bcc) - # Borland C++ 5.5 - - . auto/cc/bcc - ;; - - esac - - CC_TEST_FLAGS="$CC_TEST_FLAGS $NGX_CC_OPT" - -fi - -CFLAGS="$CFLAGS $NGX_CC_OPT" -NGX_TEST_LD_OPT="$NGX_LD_OPT" - -if [ "$NGX_PLATFORM" != win32 ]; then - - if test -n "$NGX_LD_OPT"; then - ngx_feature=--with-ld-opt=\"$NGX_LD_OPT\" - ngx_feature_name= - ngx_feature_run=no - ngx_feature_incs= - ngx_feature_path= - ngx_feature_libs= - ngx_feature_test= - . auto/feature - - if [ $ngx_found = no ]; then - echo $0: error: the invalid value in --with-ld-opt=\"$NGX_LD_OPT\" - echo - exit 1 - fi - fi - - - ngx_feature="-Wl,-E switch" - ngx_feature_name= - ngx_feature_run=no - ngx_feature_incs= - ngx_feature_path= - ngx_feature_libs=-Wl,-E - ngx_feature_test= - . auto/feature - - if [ $ngx_found = yes ]; then - MAIN_LINK="-Wl,-E" - fi - - - if [ "$NGX_CC_NAME" = "sunc" ]; then - echo "checking for gcc builtin atomic operations ... disabled" - else - ngx_feature="gcc builtin atomic operations" - ngx_feature_name=NGX_HAVE_GCC_ATOMIC - ngx_feature_run=yes - ngx_feature_incs= - ngx_feature_path= - ngx_feature_libs= - ngx_feature_test="long n = 0; - if (!__sync_bool_compare_and_swap(&n, 0, 1)) - return 1; - if (__sync_fetch_and_add(&n, 1) != 1) - return 1; - if (n != 2) - return 1; - __sync_synchronize();" - . auto/feature - fi - - - if [ "$NGX_CC_NAME" = "ccc" ]; then - echo "checking for C99 variadic macros ... disabled" - else - ngx_feature="C99 variadic macros" - ngx_feature_name="NGX_HAVE_C99_VARIADIC_MACROS" - ngx_feature_run=yes - ngx_feature_incs="#include -#define var(dummy, ...) sprintf(__VA_ARGS__)" - ngx_feature_path= - ngx_feature_libs= - ngx_feature_test="char buf[30]; buf[0] = '0'; - var(0, buf, \"%d\", 1); - if (buf[0] != '1') return 1" - . auto/feature - fi - - - ngx_feature="gcc variadic macros" - ngx_feature_name="NGX_HAVE_GCC_VARIADIC_MACROS" - ngx_feature_run=yes - ngx_feature_incs="#include -#define var(dummy, args...) sprintf(args)" - ngx_feature_path= - ngx_feature_libs= - ngx_feature_test="char buf[30]; buf[0] = '0'; - var(0, buf, \"%d\", 1); - if (buf[0] != '1') return 1" - . auto/feature - - - ngx_feature="gcc builtin 64 bit byteswap" - ngx_feature_name="NGX_HAVE_GCC_BSWAP64" - ngx_feature_run=no - ngx_feature_incs= - ngx_feature_path= - ngx_feature_libs= - ngx_feature_test="if (__builtin_bswap64(0)) return 1" - . auto/feature - - -# ngx_feature="inline" -# ngx_feature_name= -# ngx_feature_run=no -# ngx_feature_incs="int inline f(void) { return 1 }" -# ngx_feature_path= -# ngx_feature_libs= -# ngx_feature_test= -# . auto/feature -# -# if [ $ngx_found = yes ]; then -# fi - -fi diff --git a/src/deps/src/nginx-1.30.3/auto/cc/gcc b/src/deps/src/nginx-1.30.3/auto/cc/gcc deleted file mode 100644 index debd0eb084..0000000000 --- a/src/deps/src/nginx-1.30.3/auto/cc/gcc +++ /dev/null @@ -1,171 +0,0 @@ - -# Copyright (C) Igor Sysoev -# Copyright (C) Nginx, Inc. - - -# gcc 2.7.2.3, 2.8.1, 2.95.4, egcs-1.1.2 -# 3.0.4, 3.1.1, 3.2.3, 3.3.2, 3.3.3, 3.3.4, 3.4.0, 3.4.2 -# 4.0.0, 4.0.1, 4.1.0 - - -# Solaris 7's /usr/ccs/bin/as does not support "-pipe" - -CC_TEST_FLAGS="-pipe" - -ngx_feature="gcc -pipe switch" -ngx_feature_name= -ngx_feature_run=no -ngx_feature_incs= -ngx_feature_path= -ngx_feature_libs= -ngx_feature_test= -. auto/feature - -CC_TEST_FLAGS= - -if [ $ngx_found = yes ]; then - PIPE="-pipe" -fi - - -case "$NGX_MACHINE" in - - sun4u | sun4v | sparc | sparc64 ) - # "-mcpu=v9" enables the "casa" assembler instruction - CFLAGS="$CFLAGS -mcpu=v9" - ;; - -esac - - -# optimizations - -#NGX_GCC_OPT="-O2" -#NGX_GCC_OPT="-Os" -NGX_GCC_OPT="-O" - -#CFLAGS="$CFLAGS -fomit-frame-pointer" - -case $CPU in - pentium) - # optimize for Pentium and Athlon - CPU_OPT="-march=pentium" - NGX_CPU_CACHE_LINE=32 - ;; - - pentiumpro | pentium3) - # optimize for Pentium Pro, Pentium II and Pentium III - CPU_OPT="-march=pentiumpro" - NGX_CPU_CACHE_LINE=32 - ;; - - pentium4) - # optimize for Pentium 4, gcc 3.x - CPU_OPT="-march=pentium4" - NGX_CPU_CACHE_LINE=128 - ;; - - athlon) - # optimize for Athlon, gcc 3.x - CPU_OPT="-march=athlon" - NGX_CPU_CACHE_LINE=64 - ;; - - opteron) - # optimize for Opteron, gcc 3.x - CPU_OPT="-march=opteron" - NGX_CPU_CACHE_LINE=64 - ;; - - sparc32) - # build 32-bit UltraSparc binary - CPU_OPT="-m32" - CORE_LINK="$CORE_LINK -m32" - NGX_CPU_CACHE_LINE=64 - ;; - - sparc64) - # build 64-bit UltraSparc binary - CPU_OPT="-m64" - CORE_LINK="$CORE_LINK -m64" - NGX_CPU_CACHE_LINE=64 - ;; - - ppc64) - # build 64-bit PowerPC binary - CPU_OPT="-m64" - CPU_OPT="$CPU_OPT -falign-functions=32 -falign-labels=32" - CPU_OPT="$CPU_OPT -falign-loops=32 -falign-jumps=32" - CORE_LINK="$CORE_LINK -m64" - NGX_CPU_CACHE_LINE=128 - ;; - -esac - -CC_AUX_FLAGS="$CC_AUX_FLAGS $CPU_OPT" - -case "$NGX_CC_VER" in - 2.7*) - # batch build - CPU_OPT= - ;; -esac - - -CFLAGS="$CFLAGS $PIPE $CPU_OPT" - -if [ ".$PCRE_OPT" = "." ]; then - PCRE_OPT="-O2 -fomit-frame-pointer $PIPE $CPU_OPT" -else - PCRE_OPT="$PCRE_OPT $PIPE" -fi - -if [ ".$ZLIB_OPT" = "." ]; then - ZLIB_OPT="-O2 -fomit-frame-pointer $PIPE $CPU_OPT" -else - ZLIB_OPT="$ZLIB_OPT $PIPE" -fi - - -# warnings - -# -W requires at least -O -CFLAGS="$CFLAGS ${NGX_GCC_OPT:--O} -W" - -CFLAGS="$CFLAGS -Wall -Wpointer-arith" -#CFLAGS="$CFLAGS -Wconversion" -#CFLAGS="$CFLAGS -Winline" -#CFLAGS="$CFLAGS -Wmissing-prototypes" - -case "$NGX_CC_VER" in - 2.*) - # we have a lot of the unused function arguments - CFLAGS="$CFLAGS -Wno-unused" - ;; - - *) - # we have a lot of the unused function arguments - CFLAGS="$CFLAGS -Wno-unused-parameter" - # 4.2.1 shows the warning in wrong places - #CFLAGS="$CFLAGS -Wunreachable-code" - - # deprecated system OpenSSL library on OS X - if [ "$NGX_SYSTEM" = "Darwin" ]; then - CFLAGS="$CFLAGS -Wno-deprecated-declarations" - fi - ;; -esac - - -# stop on warning -CFLAGS="$CFLAGS -Werror" - -# debug -CFLAGS="$CFLAGS -g" - -# DragonFly's gcc3 generates DWARF -#CFLAGS="$CFLAGS -g -gstabs" - -if [ ".$CPP" = "." ]; then - CPP="$CC -E" -fi diff --git a/src/deps/src/nginx-1.30.3/auto/cc/icc b/src/deps/src/nginx-1.30.3/auto/cc/icc deleted file mode 100644 index 96946425b7..0000000000 --- a/src/deps/src/nginx-1.30.3/auto/cc/icc +++ /dev/null @@ -1,109 +0,0 @@ - -# Copyright (C) Igor Sysoev -# Copyright (C) Nginx, Inc. - - -# Intel C++ compiler 7.1, 8.0, 8.1, 9.0, 11.1 - -# optimizations - -CFLAGS="$CFLAGS -O" - -CORE_LINK="$CORE_LINK -opt_report_file=$NGX_OBJS/opt_report_file" - - -case $CPU in - pentium) - # optimize for Pentium and Athlon - CPU_OPT="-march=pentium" - ;; - - pentiumpro) - # optimize for Pentium Pro, Pentium II and Pentium III - CPU_OPT="-mcpu=pentiumpro -march=pentiumpro" - ;; - - pentium4) - # optimize for Pentium 4, default - CPU_OPT="-march=pentium4" - ;; -esac - -CFLAGS="$CFLAGS $CPU_OPT" - -if [ ".$PCRE_OPT" = "." ]; then - PCRE_OPT="-O $CPU_OPT" -fi - -if [ ".$ZLIB_OPT" = "." ]; then - ZLIB_OPT="-O $CPU_OPT" -fi - - -# warnings - -CFLAGS="$CFLAGS -w2" - -# disable some warnings - -# invalid type conversion: "int" to "char *" -CFLAGS="$CFLAGS -wd171" -# argument is incompatible with corresponding format string conversion -CFLAGS="$CFLAGS -wd181" -# zero used for undefined preprocessing identifier -CFLAGS="$CFLAGS -wd193" -# the format string ends before this argument -CFLAGS="$CFLAGS -wd268" -# invalid format string conversion -CFLAGS="$CFLAGS -wd269" -# conversion from "long long" to "size_t" may lose significant bits -CFLAGS="$CFLAGS -wd810" -# parameter was never referenced -CFLAGS="$CFLAGS -wd869" -# attribute "unused" is only allowed in a function definition, warning on pTHX_ -CFLAGS="$CFLAGS -wd1301" - -# STUB -# enumerated type mixed with another type -CFLAGS="$CFLAGS -wd188" -# controlling expression is constant -CFLAGS="$CFLAGS -wd279" -# operands are evaluated in unspecified order -CFLAGS="$CFLAGS -wd981" -# external definition with no prior declaration -CFLAGS="$CFLAGS -wd1418" -# external declaration in primary source file -CFLAGS="$CFLAGS -wd1419" - -case "$NGX_CC_VER" in - 9.*) - # "cc" clobber ignored, warnings for Linux's htonl()/htons() - CFLAGS="$CFLAGS -wd1469" - # explicit conversion of a 64-bit integral type to a smaller - # integral type - CFLAGS="$CFLAGS -wd1683" - # conversion from pointer to same-sized integral type, - # warning on offsetof() - CFLAGS="$CFLAGS -wd1684" - # floating-point equality and inequality comparisons are unreliable, - # warning on SvTRUE() - CFLAGS="$CFLAGS -wd1572" - ;; - - 8.*) - # "cc" clobber ignored, warnings for Linux's htonl()/htons() - CFLAGS="$CFLAGS -wd1469" - # floating-point equality and inequality comparisons are unreliable, - # warning on SvTRUE() - CFLAGS="$CFLAGS -wd1572" - ;; - - *) - ;; -esac - -# stop on warning -CFLAGS="$CFLAGS -Werror" - -# debug -CFLAGS="$CFLAGS -g" diff --git a/src/deps/src/nginx-1.30.3/auto/cc/msvc b/src/deps/src/nginx-1.30.3/auto/cc/msvc deleted file mode 100644 index 1d1854769f..0000000000 --- a/src/deps/src/nginx-1.30.3/auto/cc/msvc +++ /dev/null @@ -1,167 +0,0 @@ - -# Copyright (C) Igor Sysoev -# Copyright (C) Nginx, Inc. - - -# MSVC 6.0 SP2 cl 12.00 -# MSVC Toolkit 2003 (7.1) cl 13.10 -# MSVC 2005 Express Edition SP1 (8.0) cl 14.00 -# MSVC 2008 Express Edition (9.0) cl 15.00 -# MSVC 2010 (10.0) cl 16.00 -# MSVC 2015 (14.0) cl 19.00 - - -ngx_msvc_ver=`echo $NGX_CC_VER | sed -e 's/^\([0-9]*\).*/\1/'` - - -# detect x64 builds - -case "$NGX_CC_VER" in - - *ARM64) - NGX_MACHINE=arm64 - ;; - - *x64) - NGX_MACHINE=amd64 - ;; - - *) - NGX_MACHINE=i386 - ;; - -esac - - -# optimizations - -# maximize speed, equivalent to -Og -Oi -Ot -Oy -Ob2 -Gs -GF -Gy -CFLAGS="$CFLAGS -O2" - -# enable global optimization -#CFLAGS="$CFLAGS -Og" -# enable intrinsic functions -#CFLAGS="$CFLAGS -Oi" - -# disable inline expansion -#CFLAGS="$CFLAGS -Ob0" -# explicit inline expansion -#CFLAGS="$CFLAGS -Ob1" -# explicit and implicit inline expansion -#CFLAGS="$CFLAGS -Ob2" - -# enable frame pointer omission -#CFLAGS="$CFLAGS -Oy" -# disable stack checking calls -#CFLAGS="$CFLAGS -Gs" - -# pools strings as read/write -#CFLAGS="$CFLAGS -Gf" -# pools strings as read-only -#CFLAGS="$CFLAGS -GF" - - -case $CPU in - pentium) - # optimize for Pentium and Athlon - CPU_OPT="-G5" - ;; - - pentiumpro) - # optimize for Pentium Pro, Pentium II and Pentium III - CPU_OPT="-G6" - ;; - - pentium4) - # optimize for Pentium 4, MSVC 7 - CPU_OPT="-G7" - ;; -esac - -# __cdecl, default, must be used with OpenSSL, md5 asm, and sha1 asm -#CPU_OPT="$CPU_OPT -Gd" -# __stdcall -#CPU_OPT="$CPU_OPT -Gz" -# __fastcall -#CPU_OPT="$CPU_OPT -Gr" - - -CFLAGS="$CFLAGS $CPU_OPT" - - -# warnings - -CFLAGS="$CFLAGS -W4" - -# stop on warning -CFLAGS="$CFLAGS -WX" - -# disable logo -CFLAGS="$CFLAGS -nologo" - -# the link flags -CORE_LINK="$CORE_LINK -link -verbose:lib" - -# link with libcmt.lib, multithreaded -LIBC="-MT" -# link with msvcrt.dll -# however, MSVC Toolkit 2003 has no MSVCRT.LIB -#LIBC="-MD" - -CFLAGS="$CFLAGS $LIBC" - -CORE_LIBS="$CORE_LIBS kernel32.lib user32.lib" - -# Win32 GUI mode application -#CORE_LINK="$CORE_LINK -subsystem:windows -entry:mainCRTStartup" - -# debug -# msvc under Wine issues -# C1902: Program database manager mismatch; please check your installation -if [ -z "$NGX_WINE" ]; then - CFLAGS="$CFLAGS -Zi -Fd$NGX_OBJS/nginx.pdb" - CORE_LINK="$CORE_LINK -debug" -fi - - -# MSVC 2005 supports C99 variadic macros -if [ "$ngx_msvc_ver" -ge 14 ]; then - have=NGX_HAVE_C99_VARIADIC_MACROS . auto/have -fi - - -# precompiled headers -CORE_DEPS="$CORE_DEPS $NGX_OBJS/ngx_config.pch" -CORE_LINK="$CORE_LINK $NGX_OBJS/ngx_pch.obj" -NGX_PCH="$NGX_OBJS/ngx_config.pch" -NGX_BUILD_PCH="-Ycngx_config.h -Fp$NGX_OBJS/ngx_config.pch" -NGX_USE_PCH="-Yungx_config.h -Fp$NGX_OBJS/ngx_config.pch" - - -# the resource file -NGX_RES="$NGX_OBJS/nginx.res" -NGX_RCC="rc -fo$NGX_RES \$(CORE_INCS) $NGX_WIN32_RC" -CORE_LINK="$NGX_RES $CORE_LINK" - - -# dynamic modules -#MAIN_LINK="-link -def:$NGX_OBJS/nginx.def" -#MODULE_LINK="-LD $NGX_OBJS/nginx.lib" - - -ngx_pic_opt= -ngx_objout="-Fo" -ngx_binout="-Fe" -ngx_objext="obj" - -ngx_long_start='@<< - ' -ngx_long_end='<<' -ngx_long_regex_cont=' \ - ' -ngx_long_cont=' - ' - -# MSVC understand / in path -#ngx_regex_dirsep='\\' -#ngx_dirsep="\\" diff --git a/src/deps/src/nginx-1.30.3/auto/cc/name b/src/deps/src/nginx-1.30.3/auto/cc/name deleted file mode 100644 index f15a8538c1..0000000000 --- a/src/deps/src/nginx-1.30.3/auto/cc/name +++ /dev/null @@ -1,103 +0,0 @@ - -# Copyright (C) Igor Sysoev -# Copyright (C) Nginx, Inc. - - -if [ "$NGX_PLATFORM" != win32 ]; then - - ngx_feature="C compiler" - ngx_feature_name= - ngx_feature_run=yes - ngx_feature_incs= - ngx_feature_path= - ngx_feature_libs= - ngx_feature_test= - . auto/feature - - if [ $ngx_found = no ]; then - echo - echo $0: error: C compiler $CC is not found - echo - exit 1 - fi - -fi - - -if [ "$CC" = cl ]; then - NGX_CC_NAME=msvc - echo " + using Microsoft Visual C++ compiler" - - NGX_CC_VER=`$NGX_WINE $CC 2>&1 \ - | grep 'C/C++.* [0-9][0-9]*\.[0-9]' 2>&1 \ - | sed -e 's/^.* \([0-9][0-9]*\.[0-9].*\)/\1/'` - echo " + cl version: $NGX_CC_VER" - - have=NGX_COMPILER value="\"cl $NGX_CC_VER\"" . auto/define - -elif [ "$CC" = wcl386 ]; then - NGX_CC_NAME=owc - echo " + using Open Watcom C compiler" - -elif [ "$CC" = bcc32 ]; then - NGX_CC_NAME=bcc - echo " + using Borland C++ compiler" - -elif `$CC -V 2>&1 | grep '^Intel(R) C' >/dev/null 2>&1`; then - NGX_CC_NAME=icc - echo " + using Intel C++ compiler" - - NGX_CC_VER=`$CC -V 2>&1 \ - | sed -n -e 's/^.* Version \([^ ]*\) *Build.*$/\1/p'` - echo " + icc version: $NGX_CC_VER" - - have=NGX_COMPILER value="\"Intel C Compiler $NGX_CC_VER\"" . auto/define - -elif `$CC -v 2>&1 | grep 'gcc version' >/dev/null 2>&1`; then - NGX_CC_NAME=gcc - echo " + using GNU C compiler" - - NGX_CC_VER=`$CC -v 2>&1 | sed -n -e 's/^.*gcc version \(.*\)/\1/p'` - echo " + gcc version: $NGX_CC_VER" - - have=NGX_COMPILER value="\"gcc $NGX_CC_VER\"" . auto/define - -elif `$CC -v 2>&1 | grep 'clang version' >/dev/null 2>&1`; then - NGX_CC_NAME=clang - echo " + using Clang C compiler" - - NGX_CC_VER=`$CC -v 2>&1 | sed -n -e 's/^.*clang version \(.*\)/\1/p'` - echo " + clang version: $NGX_CC_VER" - - have=NGX_COMPILER value="\"clang $NGX_CC_VER\"" . auto/define - -elif `$CC -v 2>&1 | grep 'LLVM version' >/dev/null 2>&1`; then - NGX_CC_NAME=clang - echo " + using Clang C compiler" - - NGX_CC_VER=`$CC -v 2>&1 | sed -n -e 's/^.*LLVM version \(.*\)/\1/p'` - echo " + clang version: $NGX_CC_VER" - - have=NGX_COMPILER value="\"clang $NGX_CC_VER\"" . auto/define - -elif `$CC -V 2>&1 | grep 'Sun C' >/dev/null 2>&1`; then - NGX_CC_NAME=sunc - echo " + using Sun C compiler" - - NGX_CC_VER=`$CC -V 2>&1 | sed -n -e 's/^.* Sun C \(.*\)/\1/p'` - echo " + Sun C version: $NGX_CC_VER" - - have=NGX_COMPILER value="\"Sun C $NGX_CC_VER\"" . auto/define - -elif `$CC -V 2>&1 | grep '^Compaq C' >/dev/null 2>&1`; then - NGX_CC_NAME=ccc - echo " + using Compaq C compiler" - -elif `$CC -V 2>&1 | grep '^aCC: ' >/dev/null 2>&1`; then - NGX_CC_NAME=acc - echo " + using HP aC++ compiler" - -else - NGX_CC_NAME=unknown - -fi diff --git a/src/deps/src/nginx-1.30.3/auto/cc/owc b/src/deps/src/nginx-1.30.3/auto/cc/owc deleted file mode 100644 index f7fd88c9aa..0000000000 --- a/src/deps/src/nginx-1.30.3/auto/cc/owc +++ /dev/null @@ -1,103 +0,0 @@ - -# Copyright (C) Igor Sysoev -# Copyright (C) Nginx, Inc. - - -# Open Watcom C 1.0, 1.2, 1.3 - -# optimizations - -# maximize speed -CFLAGS="$CFLAGS -ot" -# reorder instructions for best pipeline usage -CFLAGS="$CFLAGS -op" -# inline intrinsic functions -CFLAGS="$CFLAGS -oi" -# inline expansion -CFLAGS="$CFLAGS -oe" -# disable stack checking calls -CFLAGS="$CFLAGS -s" - -case $CPU in - pentium) - # optimize for Pentium and Athlon - # register-based arguments passing conventions - CPU_OPT="-5r" - # stack-based arguments passing conventions - #CPU_OPT="-5s" - ;; - - pentiumpro) - # optimize for Pentium Pro, Pentium II and Pentium III - # register-based arguments passing conventions - CPU_OPT="-6r" - # stack-based arguments passing conventions - #CPU_OPT="-6s" - ;; -esac - -CFLAGS="$CFLAGS $CPU_OPT" - - -# warnings - -# maximum level -CFLAGS="$CFLAGS -wx" -#CFLAGS="$CFLAGS -w3" - -# stop on warning -CFLAGS="$CFLAGS -we" - -# built target is NT -CFLAGS="$CFLAGS -bt=nt" - -# multithreaded -CFLAGS="$CFLAGS -bm" - -# debug -CFLAGS="$CFLAGS -d2" - -# quiet -CFLAGS="$CFLAGS -zq" - -# Open Watcom C 1.2 -have=NGX_HAVE_C99_VARIADIC_MACROS . auto/have - - -# the precompiled headers -#CORE_DEPS="$CORE_DEPS $NGX_OBJS/ngx_config.pch" -#NGX_PCH="$NGX_OBJS/ngx_config.pch" -#NGX_BUILD_PCH="-fhq=$NGX_OBJS/ngx_config.pch" -#NGX_USE_PCH="-fh=$NGX_OBJS/ngx_config.pch" - - -# the link flags, built target is NT GUI mode application -#CORE_LINK="$CORE_LINK -l=nt_win" - - -# the resource file -NGX_RCC="wrc \$(CORE_INCS) -fo=$NGX_OBJS/nginx.res " -NGX_RCC="$NGX_RCC $NGX_WIN32_RC $NGX_OBJS/nginx.exe" - - -ngx_include_opt="-i=" -ngx_objout="-fo" -ngx_binout="-fe=" -ngx_objext="obj" - -ngx_regex_dirsep='\\' -ngx_dirsep="\\" - -ngx_long_start=' ' -ngx_long_end=' ' -ngx_long_regex_cont=' \&\ - ' -ngx_long_cont=' & - ' - -ngx_regex_cont=' \&\ - ' -ngx_cont=' & - ' -ngx_tab=' & - ' diff --git a/src/deps/src/nginx-1.30.3/auto/cc/sunc b/src/deps/src/nginx-1.30.3/auto/cc/sunc deleted file mode 100644 index fa668a7eb8..0000000000 --- a/src/deps/src/nginx-1.30.3/auto/cc/sunc +++ /dev/null @@ -1,156 +0,0 @@ - -# Copyright (C) Igor Sysoev -# Copyright (C) Nginx, Inc. - - -# Sun C 5.7 Patch 117837-04 2005/05/11 Sun Studio 10 -# Sun C 5.8 2005/10/13 Sun Studio 11 -# Sun C 5.9 SunOS_i386 2007/05/03 Sun Studio 12 -# Sun C 5.9 SunOS_sparc 2007/05/03 -# Sun C 5.10 SunOS_i386 2009/06/03 Sun Studio 12.1 -# Sun C 5.11 SunOS_i386 2010/08/13 Oracle Solaris Studio 12.2 -# Sun C 5.12 SunOS_i386 2011/11/16 Oracle Solaris Studio 12.3 -# Sun C 5.13 SunOS_i386 2014/10/20 Oracle Solaris Studio 12.4 -# Sun C 5.14 SunOS_i386 2016/05/31 Oracle Developer Studio 12.5 - - -cat << END > $NGX_AUTOTEST.c - -int main(void) { - printf("%d", __SUNPRO_C); - return 0; -} - -END - -eval "$CC -o $NGX_AUTOTEST $NGX_AUTOTEST.c >> $NGX_ERR 2>&1" - -if [ -x $NGX_AUTOTEST ]; then - ngx_sunc_ver=`$NGX_AUTOTEST` -fi - -rm -rf $NGX_AUTOTEST* - -# 1424 == 0x590, Sun Studio 12 - -if [ "$ngx_sunc_ver" -ge 1424 ]; then - ngx_sparc32="-m32" - ngx_sparc64="-m64" - ngx_amd64="-m64" - -else - ngx_sparc32="-xarch=v8plus" - ngx_sparc64="-xarch=v9" - ngx_amd64="-xarch=amd64" -fi - -case "$NGX_MACHINE" in - - i86pc) - NGX_AUX=" src/os/unix/ngx_sunpro_x86.il" - ;; - - sun4u | sun4v) - NGX_AUX=" src/os/unix/ngx_sunpro_sparc64.il" - ;; - -esac - -MAIN_LINK= -MODULE_LINK="-G" - - -# optimizations - -# 20736 == 0x5100, Sun Studio 12.1 - -if [ "$ngx_sunc_ver" -ge 20736 ]; then - ngx_fast="-fast" - -else - # older versions had problems with bit-fields - ngx_fast="-fast -xalias_level=any" -fi - -IPO=-xipo -CFLAGS="$CFLAGS $ngx_fast $IPO" -CORE_LINK="$CORE_LINK $ngx_fast $IPO" - - -case $CPU in - pentium) - # optimize for Pentium and Athlon - CPU_OPT="-xchip=pentium" - ;; - - pentiumpro) - # optimize for Pentium Pro, Pentium II - CPU_OPT="-xchip=pentium_pro" - ;; - - pentium3) - # optimize for Pentium III - CPU_OPT="-xchip=pentium3" - #CPU_OPT="$CPU_OPT -xarch=sse" - CPU_OPT="$CPU_OPT -xcache=16/32/4:256/32/4" - ;; - - pentium4) - # optimize for Pentium 4 - CPU_OPT="-xchip=pentium4" - #CPU_OPT="$CPU_OPT -xarch=sse2" - CPU_OPT="$CPU_OPT -xcache=8/64/4:256/128/8" - ;; - - opteron) - # optimize for Opteron - CPU_OPT="-xchip=opteron" - #CPU_OPT="$CPU_OPT -xarch=sse2" - CPU_OPT="$CPU_OPT -xcache=64/64/2:1024/64/16" - ;; - - sparc32) - # build 32-bit UltraSparc binary - CPU_OPT="$ngx_sparc32" - CORE_LINK="$CORE_LINK $ngx_sparc32" - CC_AUX_FLAGS="$CC_AUX_FLAGS $ngx_sparc32" - NGX_CPU_CACHE_LINE=64 - ;; - - sparc64) - # build 64-bit UltraSparc binary - CPU_OPT="$ngx_sparc64" - CORE_LINK="$CORE_LINK $ngx_sparc64" - CC_AUX_FLAGS="$CC_AUX_FLAGS $ngx_sparc64" - NGX_CPU_CACHE_LINE=64 - ;; - - amd64) - # build 64-bit amd64 binary - CPU_OPT="$ngx_amd64" - CORE_LINK="$CORE_LINK $ngx_amd64" - CC_AUX_FLAGS="$CC_AUX_FLAGS $ngx_amd64" - NGX_AUX=" src/os/unix/ngx_sunpro_amd64.il" - NGX_CPU_CACHE_LINE=64 - ;; - -esac - - -CFLAGS="$CFLAGS $CPU_OPT" - - -if [ ".$PCRE_OPT" = "." ]; then - PCRE_OPT="$ngx_fast $IPO $CPU_OPT" -fi - -if [ ".$ZLIB_OPT" = "." ]; then - ZLIB_OPT="$ngx_fast $IPO $CPU_OPT" -fi - - -# stop on warning -CFLAGS="$CFLAGS -errwarn=%all" - -# debug -CFLAGS="$CFLAGS -g" diff --git a/src/deps/src/nginx-1.30.3/auto/configure b/src/deps/src/nginx-1.30.3/auto/configure deleted file mode 100755 index 5b88ebb4cb..0000000000 --- a/src/deps/src/nginx-1.30.3/auto/configure +++ /dev/null @@ -1,121 +0,0 @@ -#!/bin/sh - -# Copyright (C) Igor Sysoev -# Copyright (C) Nginx, Inc. - - -LC_ALL=C -export LC_ALL - -. auto/options -. auto/init -. auto/sources - -test -d $NGX_OBJS || mkdir -p $NGX_OBJS - -echo > $NGX_AUTO_HEADERS_H -echo > $NGX_AUTOCONF_ERR - -echo "#define NGX_CONFIGURE \"$NGX_CONFIGURE\"" > $NGX_AUTO_CONFIG_H - - -if [ $NGX_DEBUG = YES ]; then - have=NGX_DEBUG . auto/have -fi - - -if test -z "$NGX_PLATFORM"; then - echo "checking for OS" - - NGX_SYSTEM=`uname -s 2>/dev/null` - NGX_RELEASE=`uname -r 2>/dev/null` - NGX_MACHINE=`uname -m 2>/dev/null` - - echo " + $NGX_SYSTEM $NGX_RELEASE $NGX_MACHINE" - - NGX_PLATFORM="$NGX_SYSTEM:$NGX_RELEASE:$NGX_MACHINE"; - - case "$NGX_SYSTEM" in - MINGW32_* | MINGW64_* | MSYS_*) - NGX_PLATFORM=win32 - ;; - esac - -else - echo "building for $NGX_PLATFORM" - NGX_SYSTEM=$NGX_PLATFORM - NGX_MACHINE=i386 -fi - -. auto/cc/conf - -if [ "$NGX_PLATFORM" != win32 ]; then - . auto/headers -fi - -. auto/os/conf - -if [ "$NGX_PLATFORM" != win32 ]; then - . auto/unix -fi - -. auto/threads -. auto/modules -. auto/lib/conf - -case ".$NGX_PREFIX" in - .) - NGX_PREFIX=${NGX_PREFIX:-/usr/local/nginx} - have=NGX_PREFIX value="\"$NGX_PREFIX/\"" . auto/define - ;; - - .!) - NGX_PREFIX= - ;; - - *) - have=NGX_PREFIX value="\"$NGX_PREFIX/\"" . auto/define - ;; -esac - -if [ ".$NGX_CONF_PREFIX" != "." ]; then - have=NGX_CONF_PREFIX value="\"$NGX_CONF_PREFIX/\"" . auto/define -fi - -have=NGX_SBIN_PATH value="\"$NGX_SBIN_PATH\"" . auto/define -have=NGX_CONF_PATH value="\"$NGX_CONF_PATH\"" . auto/define -have=NGX_PID_PATH value="\"$NGX_PID_PATH\"" . auto/define -have=NGX_LOCK_PATH value="\"$NGX_LOCK_PATH\"" . auto/define -have=NGX_ERROR_LOG_PATH value="\"$NGX_ERROR_LOG_PATH\"" . auto/define - -if [ ".$NGX_ERROR_LOG_PATH" = "." ]; then - have=NGX_ERROR_LOG_STDERR . auto/have -fi - -have=NGX_HTTP_LOG_PATH value="\"$NGX_HTTP_LOG_PATH\"" . auto/define -have=NGX_HTTP_CLIENT_TEMP_PATH value="\"$NGX_HTTP_CLIENT_TEMP_PATH\"" -. auto/define -have=NGX_HTTP_PROXY_TEMP_PATH value="\"$NGX_HTTP_PROXY_TEMP_PATH\"" -. auto/define -have=NGX_HTTP_FASTCGI_TEMP_PATH value="\"$NGX_HTTP_FASTCGI_TEMP_PATH\"" -. auto/define -have=NGX_HTTP_UWSGI_TEMP_PATH value="\"$NGX_HTTP_UWSGI_TEMP_PATH\"" -. auto/define -have=NGX_HTTP_SCGI_TEMP_PATH value="\"$NGX_HTTP_SCGI_TEMP_PATH\"" -. auto/define - -. auto/make -. auto/lib/make -. auto/install - -# STUB -. auto/stubs - -have=NGX_USER value="\"$NGX_USER\"" . auto/define -have=NGX_GROUP value="\"$NGX_GROUP\"" . auto/define - -if [ ".$NGX_BUILD" != "." ]; then - have=NGX_BUILD value="\"$NGX_BUILD\"" . auto/define -fi - -. auto/summary diff --git a/src/deps/src/nginx-1.30.3/auto/define b/src/deps/src/nginx-1.30.3/auto/define deleted file mode 100644 index b5a7622590..0000000000 --- a/src/deps/src/nginx-1.30.3/auto/define +++ /dev/null @@ -1,12 +0,0 @@ - -# Copyright (C) Igor Sysoev -# Copyright (C) Nginx, Inc. - - -cat << END >> $NGX_AUTO_CONFIG_H - -#ifndef $have -#define $have $value -#endif - -END diff --git a/src/deps/src/nginx-1.30.3/auto/endianness b/src/deps/src/nginx-1.30.3/auto/endianness deleted file mode 100644 index 1b552b6b37..0000000000 --- a/src/deps/src/nginx-1.30.3/auto/endianness +++ /dev/null @@ -1,50 +0,0 @@ - -# Copyright (C) Igor Sysoev -# Copyright (C) Nginx, Inc. - - -echo $ngx_n "checking for system byte ordering ...$ngx_c" - -cat << END >> $NGX_AUTOCONF_ERR - ----------------------------------------- -checking for system byte ordering - -END - - -cat << END > $NGX_AUTOTEST.c - -int main(void) { - int i = 0x11223344; - char *p; - - p = (char *) &i; - if (*p == 0x44) return 0; - return 1; -} - -END - -ngx_test="$CC $CC_TEST_FLAGS $CC_AUX_FLAGS \ - -o $NGX_AUTOTEST $NGX_AUTOTEST.c $NGX_LD_OPT $ngx_feature_libs" - -eval "$ngx_test >> $NGX_AUTOCONF_ERR 2>&1" - -if [ -x $NGX_AUTOTEST ]; then - if $NGX_AUTOTEST >/dev/null 2>&1; then - echo " little endian" - have=NGX_HAVE_LITTLE_ENDIAN . auto/have - else - echo " big endian" - fi - - rm -rf $NGX_AUTOTEST* - -else - rm -rf $NGX_AUTOTEST* - - echo - echo "$0: error: cannot detect system byte ordering" - exit 1 -fi diff --git a/src/deps/src/nginx-1.30.3/auto/feature b/src/deps/src/nginx-1.30.3/auto/feature deleted file mode 100644 index 3561f5941f..0000000000 --- a/src/deps/src/nginx-1.30.3/auto/feature +++ /dev/null @@ -1,123 +0,0 @@ - -# Copyright (C) Igor Sysoev -# Copyright (C) Nginx, Inc. - - -echo $ngx_n "checking for $ngx_feature ...$ngx_c" - -cat << END >> $NGX_AUTOCONF_ERR - ----------------------------------------- -checking for $ngx_feature - -END - -ngx_found=no - -if test -n "$ngx_feature_name"; then - ngx_have_feature=`echo $ngx_feature_name \ - | tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ` -fi - -if test -n "$ngx_feature_path"; then - for ngx_temp in $ngx_feature_path; do - ngx_feature_inc_path="$ngx_feature_inc_path -I $ngx_temp" - done -fi - -cat << END > $NGX_AUTOTEST.c - -#include -$NGX_INCLUDE_UNISTD_H -$ngx_feature_incs - -int main(void) { - $ngx_feature_test; - return 0; -} - -END - - -ngx_test="$CC $CC_TEST_FLAGS $CC_AUX_FLAGS $ngx_feature_inc_path \ - -o $NGX_AUTOTEST $NGX_AUTOTEST.c $NGX_TEST_LD_OPT $ngx_feature_libs" - -ngx_feature_inc_path= - -eval "/bin/sh -c \"$ngx_test\" >> $NGX_AUTOCONF_ERR 2>&1" - - -if [ -x $NGX_AUTOTEST ]; then - - case "$ngx_feature_run" in - - yes) - # /bin/sh is used to intercept "Killed" or "Abort trap" messages - if /bin/sh -c $NGX_AUTOTEST >> $NGX_AUTOCONF_ERR 2>&1; then - echo " found" - ngx_found=yes - - if test -n "$ngx_feature_name"; then - have=$ngx_have_feature . auto/have - fi - - else - echo " found but is not working" - fi - ;; - - value) - # /bin/sh is used to intercept "Killed" or "Abort trap" messages - if /bin/sh -c $NGX_AUTOTEST >> $NGX_AUTOCONF_ERR 2>&1; then - echo " found" - ngx_found=yes - - cat << END >> $NGX_AUTO_CONFIG_H - -#ifndef $ngx_feature_name -#define $ngx_feature_name `$NGX_AUTOTEST` -#endif - -END - else - echo " found but is not working" - fi - ;; - - bug) - # /bin/sh is used to intercept "Killed" or "Abort trap" messages - if /bin/sh -c $NGX_AUTOTEST >> $NGX_AUTOCONF_ERR 2>&1; then - echo " not found" - - else - echo " found" - ngx_found=yes - - if test -n "$ngx_feature_name"; then - have=$ngx_have_feature . auto/have - fi - fi - ;; - - *) - echo " found" - ngx_found=yes - - if test -n "$ngx_feature_name"; then - have=$ngx_have_feature . auto/have - fi - ;; - - esac - -else - echo " not found" - - echo "----------" >> $NGX_AUTOCONF_ERR - cat $NGX_AUTOTEST.c >> $NGX_AUTOCONF_ERR - echo "----------" >> $NGX_AUTOCONF_ERR - echo $ngx_test >> $NGX_AUTOCONF_ERR - echo "----------" >> $NGX_AUTOCONF_ERR -fi - -rm -rf $NGX_AUTOTEST* diff --git a/src/deps/src/nginx-1.30.3/auto/have b/src/deps/src/nginx-1.30.3/auto/have deleted file mode 100644 index f8e3751c5f..0000000000 --- a/src/deps/src/nginx-1.30.3/auto/have +++ /dev/null @@ -1,12 +0,0 @@ - -# Copyright (C) Igor Sysoev -# Copyright (C) Nginx, Inc. - - -cat << END >> $NGX_AUTO_CONFIG_H - -#ifndef $have -#define $have 1 -#endif - -END diff --git a/src/deps/src/nginx-1.30.3/auto/have_headers b/src/deps/src/nginx-1.30.3/auto/have_headers deleted file mode 100644 index a3a75430aa..0000000000 --- a/src/deps/src/nginx-1.30.3/auto/have_headers +++ /dev/null @@ -1,12 +0,0 @@ - -# Copyright (C) Igor Sysoev -# Copyright (C) Nginx, Inc. - - -cat << END >> $NGX_AUTO_HEADERS_H - -#ifndef $have -#define $have 1 -#endif - -END diff --git a/src/deps/src/nginx-1.30.3/auto/headers b/src/deps/src/nginx-1.30.3/auto/headers deleted file mode 100644 index 5a2e6b9023..0000000000 --- a/src/deps/src/nginx-1.30.3/auto/headers +++ /dev/null @@ -1,13 +0,0 @@ - -# Copyright (C) Igor Sysoev -# Copyright (C) Nginx, Inc. - - -ngx_include="unistd.h"; . auto/include -ngx_include="inttypes.h"; . auto/include -ngx_include="limits.h"; . auto/include -ngx_include="sys/filio.h"; . auto/include -ngx_include="sys/param.h"; . auto/include -ngx_include="sys/mount.h"; . auto/include -ngx_include="sys/statvfs.h"; . auto/include -ngx_include="crypt.h"; . auto/include diff --git a/src/deps/src/nginx-1.30.3/auto/include b/src/deps/src/nginx-1.30.3/auto/include deleted file mode 100644 index c1bd3647b8..0000000000 --- a/src/deps/src/nginx-1.30.3/auto/include +++ /dev/null @@ -1,58 +0,0 @@ - -# Copyright (C) Igor Sysoev -# Copyright (C) Nginx, Inc. - - -echo $ngx_n "checking for $ngx_include ...$ngx_c" - -cat << END >> $NGX_AUTOCONF_ERR - ----------------------------------------- -checking for $ngx_include - -END - - -ngx_found=no - -cat << END > $NGX_AUTOTEST.c - -$NGX_INCLUDE_SYS_PARAM_H -#include <$ngx_include> - -int main(void) { - return 0; -} - -END - - -ngx_test="$CC -o $NGX_AUTOTEST $NGX_AUTOTEST.c" - -eval "$ngx_test >> $NGX_AUTOCONF_ERR 2>&1" - -if [ -x $NGX_AUTOTEST ]; then - - ngx_found=yes - - echo " found" - - ngx_name=`echo $ngx_include \ - | tr abcdefghijklmnopqrstuvwxyz/. ABCDEFGHIJKLMNOPQRSTUVWXYZ__` - - - have=NGX_HAVE_$ngx_name . auto/have_headers - - eval "NGX_INCLUDE_$ngx_name='#include <$ngx_include>'" - -else - echo " not found" - - echo "----------" >> $NGX_AUTOCONF_ERR - cat $NGX_AUTOTEST.c >> $NGX_AUTOCONF_ERR - echo "----------" >> $NGX_AUTOCONF_ERR - echo $ngx_test >> $NGX_AUTOCONF_ERR - echo "----------" >> $NGX_AUTOCONF_ERR -fi - -rm -rf $NGX_AUTOTEST* diff --git a/src/deps/src/nginx-1.30.3/auto/init b/src/deps/src/nginx-1.30.3/auto/init deleted file mode 100644 index f816dfc4d8..0000000000 --- a/src/deps/src/nginx-1.30.3/auto/init +++ /dev/null @@ -1,53 +0,0 @@ - -# Copyright (C) Igor Sysoev -# Copyright (C) Nginx, Inc. - - -NGX_MAKEFILE=$NGX_OBJS/Makefile -NGX_MODULES_C=$NGX_OBJS/ngx_modules.c - -NGX_AUTO_HEADERS_H=$NGX_OBJS/ngx_auto_headers.h -NGX_AUTO_CONFIG_H=$NGX_OBJS/ngx_auto_config.h - -NGX_AUTOTEST=$NGX_OBJS/autotest -NGX_AUTOCONF_ERR=$NGX_OBJS/autoconf.err - -# STUBs -NGX_ERR=$NGX_OBJS/autoconf.err -MAKEFILE=$NGX_OBJS/Makefile - - -NGX_PCH= -NGX_USE_PCH= - - -# check the echo's "-n" option and "\c" capability - -if echo "test\c" | grep c >/dev/null; then - - if echo -n test | grep n >/dev/null; then - ngx_n= - ngx_c= - - else - ngx_n=-n - ngx_c= - fi - -else - ngx_n= - ngx_c='\c' -fi - - -# create Makefile - -cat << END > Makefile - -default: build - -clean: - rm -rf Makefile $NGX_OBJS - -.PHONY: default clean -END diff --git a/src/deps/src/nginx-1.30.3/auto/install b/src/deps/src/nginx-1.30.3/auto/install deleted file mode 100644 index 7f73e4bffd..0000000000 --- a/src/deps/src/nginx-1.30.3/auto/install +++ /dev/null @@ -1,220 +0,0 @@ - -# Copyright (C) Igor Sysoev -# Copyright (C) Nginx, Inc. - - -if [ $USE_PERL != NO ]; then - - cat << END >> $NGX_MAKEFILE - -install_perl_modules: - cd $NGX_OBJS/src/http/modules/perl && \$(MAKE) install -END - - NGX_INSTALL_PERL_MODULES=install_perl_modules - -fi - - -case ".$NGX_SBIN_PATH" in - ./*) - ;; - - *) - NGX_SBIN_PATH=$NGX_PREFIX/$NGX_SBIN_PATH - ;; -esac - - -case ".$NGX_MODULES_PATH" in - ./*) - ;; - - *) - NGX_MODULES_PATH=$NGX_PREFIX/$NGX_MODULES_PATH - ;; -esac - -NGX_MODULES_PATH=`dirname $NGX_MODULES_PATH/.` - - -case ".$NGX_CONF_PATH" in - ./*) - ;; - - *) - NGX_CONF_PATH=$NGX_PREFIX/$NGX_CONF_PATH - ;; -esac - - -NGX_CONF_PREFIX=`dirname $NGX_CONF_PATH` - - -case ".$NGX_PID_PATH" in - ./*) - ;; - - *) - NGX_PID_PATH=$NGX_PREFIX/$NGX_PID_PATH - ;; -esac - - -case ".$NGX_ERROR_LOG_PATH" in - ./* | .) - ;; - - *) - NGX_ERROR_LOG_PATH=$NGX_PREFIX/$NGX_ERROR_LOG_PATH - ;; -esac - - -case ".$NGX_HTTP_LOG_PATH" in - ./*) - ;; - - *) - NGX_HTTP_LOG_PATH=$NGX_PREFIX/$NGX_HTTP_LOG_PATH - ;; -esac - - -if test -f man/nginx.8 ; then - NGX_MAN=man/nginx.8 -else - NGX_MAN=docs/man/nginx.8 -fi - -if test -d html ; then - NGX_HTML=html -else - NGX_HTML=docs/html -fi - -cat << END >> $NGX_MAKEFILE - -manpage: $NGX_OBJS/nginx.8 - -$NGX_OBJS/nginx.8: $NGX_MAN $NGX_AUTO_CONFIG_H - sed -e "s|%%PREFIX%%|$NGX_PREFIX|" \\ - -e "s|%%PID_PATH%%|$NGX_PID_PATH|" \\ - -e "s|%%CONF_PATH%%|$NGX_CONF_PATH|" \\ - -e "s|%%ERROR_LOG_PATH%%|${NGX_ERROR_LOG_PATH:-stderr}|" \\ - < $NGX_MAN > \$@ - -install: build $NGX_INSTALL_PERL_MODULES - test -d '\$(DESTDIR)$NGX_PREFIX' || mkdir -p '\$(DESTDIR)$NGX_PREFIX' - - test -d '\$(DESTDIR)`dirname "$NGX_SBIN_PATH"`' \\ - || mkdir -p '\$(DESTDIR)`dirname "$NGX_SBIN_PATH"`' - test ! -f '\$(DESTDIR)$NGX_SBIN_PATH' \\ - || mv '\$(DESTDIR)$NGX_SBIN_PATH' \\ - '\$(DESTDIR)$NGX_SBIN_PATH.old' - cp $NGX_OBJS/nginx$ngx_binext '\$(DESTDIR)$NGX_SBIN_PATH' - - test -d '\$(DESTDIR)$NGX_CONF_PREFIX' \\ - || mkdir -p '\$(DESTDIR)$NGX_CONF_PREFIX' - - cp conf/koi-win '\$(DESTDIR)$NGX_CONF_PREFIX' - cp conf/koi-utf '\$(DESTDIR)$NGX_CONF_PREFIX' - cp conf/win-utf '\$(DESTDIR)$NGX_CONF_PREFIX' - - test -f '\$(DESTDIR)$NGX_CONF_PREFIX/mime.types' \\ - || cp conf/mime.types '\$(DESTDIR)$NGX_CONF_PREFIX' - cp conf/mime.types '\$(DESTDIR)$NGX_CONF_PREFIX/mime.types.default' - - test -f '\$(DESTDIR)$NGX_CONF_PREFIX/fastcgi_params' \\ - || cp conf/fastcgi_params '\$(DESTDIR)$NGX_CONF_PREFIX' - cp conf/fastcgi_params \\ - '\$(DESTDIR)$NGX_CONF_PREFIX/fastcgi_params.default' - - test -f '\$(DESTDIR)$NGX_CONF_PREFIX/fastcgi.conf' \\ - || cp conf/fastcgi.conf '\$(DESTDIR)$NGX_CONF_PREFIX' - cp conf/fastcgi.conf '\$(DESTDIR)$NGX_CONF_PREFIX/fastcgi.conf.default' - - test -f '\$(DESTDIR)$NGX_CONF_PREFIX/uwsgi_params' \\ - || cp conf/uwsgi_params '\$(DESTDIR)$NGX_CONF_PREFIX' - cp conf/uwsgi_params \\ - '\$(DESTDIR)$NGX_CONF_PREFIX/uwsgi_params.default' - - test -f '\$(DESTDIR)$NGX_CONF_PREFIX/scgi_params' \\ - || cp conf/scgi_params '\$(DESTDIR)$NGX_CONF_PREFIX' - cp conf/scgi_params \\ - '\$(DESTDIR)$NGX_CONF_PREFIX/scgi_params.default' - - test -f '\$(DESTDIR)$NGX_CONF_PATH' \\ - || cp conf/nginx.conf '\$(DESTDIR)$NGX_CONF_PATH' - cp conf/nginx.conf '\$(DESTDIR)$NGX_CONF_PREFIX/nginx.conf.default' - - test -d '\$(DESTDIR)`dirname "$NGX_PID_PATH"`' \\ - || mkdir -p '\$(DESTDIR)`dirname "$NGX_PID_PATH"`' - - test -d '\$(DESTDIR)`dirname "$NGX_HTTP_LOG_PATH"`' \\ - || mkdir -p '\$(DESTDIR)`dirname "$NGX_HTTP_LOG_PATH"`' - - test -d '\$(DESTDIR)$NGX_PREFIX/html' \\ - || cp -R $NGX_HTML '\$(DESTDIR)$NGX_PREFIX' -END - - -if test -n "$NGX_ERROR_LOG_PATH"; then - cat << END >> $NGX_MAKEFILE - - test -d '\$(DESTDIR)`dirname "$NGX_ERROR_LOG_PATH"`' \\ - || mkdir -p '\$(DESTDIR)`dirname "$NGX_ERROR_LOG_PATH"`' -END - -fi - - -if test -n "$DYNAMIC_MODULES"; then - cat << END >> $NGX_MAKEFILE - - test -d '\$(DESTDIR)$NGX_MODULES_PATH' \\ - || mkdir -p '\$(DESTDIR)$NGX_MODULES_PATH' -END - -fi - - -for ngx_module in $DYNAMIC_MODULES -do - ngx_module=$ngx_module$ngx_modext - - cat << END >> $NGX_MAKEFILE - - test ! -f '\$(DESTDIR)$NGX_MODULES_PATH/$ngx_module' \\ - || mv '\$(DESTDIR)$NGX_MODULES_PATH/$ngx_module' \\ - '\$(DESTDIR)$NGX_MODULES_PATH/$ngx_module.old' - cp $NGX_OBJS/$ngx_module '\$(DESTDIR)$NGX_MODULES_PATH/$ngx_module' -END - -done - - -# create Makefile - -cat << END >> Makefile - -build: - \$(MAKE) -f $NGX_MAKEFILE - -install: - \$(MAKE) -f $NGX_MAKEFILE install - -modules: - \$(MAKE) -f $NGX_MAKEFILE modules - -upgrade: - $NGX_SBIN_PATH -t - - kill -USR2 \`cat $NGX_PID_PATH\` - sleep 1 - test -f $NGX_PID_PATH.oldbin - - kill -QUIT \`cat $NGX_PID_PATH.oldbin\` - -.PHONY: build install modules upgrade -END diff --git a/src/deps/src/nginx-1.30.3/auto/lib/conf b/src/deps/src/nginx-1.30.3/auto/lib/conf deleted file mode 100644 index 2c7af10400..0000000000 --- a/src/deps/src/nginx-1.30.3/auto/lib/conf +++ /dev/null @@ -1,54 +0,0 @@ - -# Copyright (C) Igor Sysoev -# Copyright (C) Nginx, Inc. - - -if [ $USE_PCRE = YES -o $PCRE != NONE ]; then - . auto/lib/pcre/conf - -else - if [ $USE_PCRE = DISABLED -a $HTTP = YES -a $HTTP_REWRITE = YES ]; then - -cat << END - -$0: error: the HTTP rewrite module requires the PCRE library. -You can either disable the module by using --without-http_rewrite_module -option or you have to enable the PCRE support. - -END - exit 1 - fi -fi - - -if [ $USE_OPENSSL = YES ]; then - . auto/lib/openssl/conf -fi - -if [ $USE_ZLIB = YES ]; then - . auto/lib/zlib/conf -fi - -if [ $USE_LIBXSLT != NO ]; then - . auto/lib/libxslt/conf -fi - -if [ $USE_LIBGD != NO ]; then - . auto/lib/libgd/conf -fi - -if [ $USE_PERL != NO ]; then - . auto/lib/perl/conf -fi - -if [ $USE_GEOIP != NO ]; then - . auto/lib/geoip/conf -fi - -if [ $NGX_GOOGLE_PERFTOOLS = YES ]; then - . auto/lib/google-perftools/conf -fi - -if [ $NGX_LIBATOMIC != NO ]; then - . auto/lib/libatomic/conf -fi diff --git a/src/deps/src/nginx-1.30.3/auto/lib/geoip/conf b/src/deps/src/nginx-1.30.3/auto/lib/geoip/conf deleted file mode 100644 index 47165b15ba..0000000000 --- a/src/deps/src/nginx-1.30.3/auto/lib/geoip/conf +++ /dev/null @@ -1,114 +0,0 @@ - -# Copyright (C) Igor Sysoev -# Copyright (C) Nginx, Inc. - - - ngx_feature="GeoIP library" - ngx_feature_name= - ngx_feature_run=no - ngx_feature_incs="#include " - ngx_feature_path= - ngx_feature_libs="-lGeoIP" - ngx_feature_test="GeoIP_open(NULL, 0)" - . auto/feature - - -if [ $ngx_found = no ]; then - - # FreeBSD port - - ngx_feature="GeoIP library in /usr/local/" - ngx_feature_path="/usr/local/include" - - if [ $NGX_RPATH = YES ]; then - ngx_feature_libs="-R/usr/local/lib -L/usr/local/lib -lGeoIP" - else - ngx_feature_libs="-L/usr/local/lib -lGeoIP" - fi - - . auto/feature -fi - - -if [ $ngx_found = no ]; then - - # NetBSD port - - ngx_feature="GeoIP library in /usr/pkg/" - ngx_feature_path="/usr/pkg/include" - - if [ $NGX_RPATH = YES ]; then - ngx_feature_libs="-R/usr/pkg/lib -L/usr/pkg/lib -lGeoIP" - else - ngx_feature_libs="-L/usr/pkg/lib -lGeoIP" - fi - - . auto/feature -fi - - -if [ $ngx_found = no ]; then - - # MacPorts - - ngx_feature="GeoIP library in /opt/local/" - ngx_feature_path="/opt/local/include" - - if [ $NGX_RPATH = YES ]; then - ngx_feature_libs="-R/opt/local/lib -L/opt/local/lib -lGeoIP" - else - ngx_feature_libs="-L/opt/local/lib -lGeoIP" - fi - - . auto/feature -fi - - -if [ $ngx_found = no ]; then - - # Homebrew on Apple Silicon - - ngx_feature="GeoIP library in /opt/homebrew/" - ngx_feature_path="/opt/homebrew/include" - - if [ $NGX_RPATH = YES ]; then - ngx_feature_libs="-R/opt/homebrew/lib -L/opt/homebrew/lib -lGeoIP" - else - ngx_feature_libs="-L/opt/homebrew/lib -lGeoIP" - fi - - . auto/feature -fi - - -if [ $ngx_found = yes ]; then - - CORE_INCS="$CORE_INCS $ngx_feature_path" - - if [ $USE_GEOIP = YES ]; then - CORE_LIBS="$CORE_LIBS $ngx_feature_libs" - fi - - NGX_LIB_GEOIP=$ngx_feature_libs - - ngx_feature="GeoIP IPv6 support" - ngx_feature_name="NGX_HAVE_GEOIP_V6" - ngx_feature_run=no - ngx_feature_incs="#include - #include " - #ngx_feature_path= - #ngx_feature_libs= - ngx_feature_test="printf(\"%d\", GEOIP_CITY_EDITION_REV0_V6);" - . auto/feature - -else - -cat << END - -$0: error: the GeoIP module requires the GeoIP library. -You can either do not enable the module or install the library. - -END - - exit 1 -fi diff --git a/src/deps/src/nginx-1.30.3/auto/lib/google-perftools/conf b/src/deps/src/nginx-1.30.3/auto/lib/google-perftools/conf deleted file mode 100644 index 94dadac625..0000000000 --- a/src/deps/src/nginx-1.30.3/auto/lib/google-perftools/conf +++ /dev/null @@ -1,78 +0,0 @@ - -# Copyright (C) Igor Sysoev -# Copyright (C) Nginx, Inc. - - - ngx_feature="Google perftools" - ngx_feature_name= - ngx_feature_run=no - ngx_feature_incs= - ngx_feature_path= - ngx_feature_libs="-lprofiler" - ngx_feature_test="void ProfilerStop(void); - ProfilerStop()" - . auto/feature - - -if [ $ngx_found = no ]; then - - # FreeBSD port - - ngx_feature="Google perftools in /usr/local/" - - if [ $NGX_RPATH = YES ]; then - ngx_feature_libs="-R/usr/local/lib -L/usr/local/lib -lprofiler" - else - ngx_feature_libs="-L/usr/local/lib -lprofiler" - fi - - . auto/feature -fi - - -if [ $ngx_found = no ]; then - - # MacPorts - - ngx_feature="Google perftools in /opt/local/" - - if [ $NGX_RPATH = YES ]; then - ngx_feature_libs="-R/opt/local/lib -L/opt/local/lib -lprofiler" - else - ngx_feature_libs="-L/opt/local/lib -lprofiler" - fi - - . auto/feature -fi - - -if [ $ngx_found = no ]; then - - # Homebrew on Apple Silicon - - ngx_feature="Google perftools in /opt/homebrew/" - - if [ $NGX_RPATH = YES ]; then - ngx_feature_libs="-R/opt/homebrew/lib -L/opt/homebrew/lib -lprofiler" - else - ngx_feature_libs="-L/opt/homebrew/lib -lprofiler" - fi - - . auto/feature -fi - - -if [ $ngx_found = yes ]; then - CORE_LIBS="$CORE_LIBS $ngx_feature_libs" - -else - -cat << END - -$0: error: the Google perftools module requires the Google perftools -library. You can either do not enable the module or install the library. - -END - - exit 1 -fi diff --git a/src/deps/src/nginx-1.30.3/auto/lib/libatomic/conf b/src/deps/src/nginx-1.30.3/auto/lib/libatomic/conf deleted file mode 100644 index dfdc1a6220..0000000000 --- a/src/deps/src/nginx-1.30.3/auto/lib/libatomic/conf +++ /dev/null @@ -1,43 +0,0 @@ - -# Copyright (C) Igor Sysoev -# Copyright (C) Nginx, Inc. - - -if [ $NGX_LIBATOMIC != YES ]; then - - have=NGX_HAVE_LIBATOMIC . auto/have - CORE_INCS="$CORE_INCS $NGX_LIBATOMIC/src" - LINK_DEPS="$LINK_DEPS $NGX_LIBATOMIC/build/lib/libatomic_ops.a" - CORE_LIBS="$CORE_LIBS $NGX_LIBATOMIC/build/lib/libatomic_ops.a" - -else - - ngx_feature="atomic_ops library" - ngx_feature_name=NGX_HAVE_LIBATOMIC - ngx_feature_run=yes - ngx_feature_incs="#define AO_REQUIRE_CAS - #include " - ngx_feature_path= - ngx_feature_libs="-latomic_ops" - ngx_feature_test="AO_t n = 0; - if (!AO_compare_and_swap(&n, 0, 1)) - return 1; - if (AO_fetch_and_add(&n, 1) != 1) - return 1; - if (n != 2) - return 1; - AO_nop();" - . auto/feature - - if [ $ngx_found = yes ]; then - CORE_LIBS="$CORE_LIBS $ngx_feature_libs" - else - -cat << END - -$0: error: libatomic_ops library was not found. - -END - exit 1 - fi -fi diff --git a/src/deps/src/nginx-1.30.3/auto/lib/libatomic/make b/src/deps/src/nginx-1.30.3/auto/lib/libatomic/make deleted file mode 100644 index 530c746a6d..0000000000 --- a/src/deps/src/nginx-1.30.3/auto/lib/libatomic/make +++ /dev/null @@ -1,21 +0,0 @@ - -# Copyright (C) Igor Sysoev -# Copyright (C) Nginx, Inc. - - - case $NGX_LIBATOMIC in - /*) ngx_prefix="$NGX_LIBATOMIC/build" ;; - *) ngx_prefix="$PWD/$NGX_LIBATOMIC/build" ;; - esac - - cat << END >> $NGX_MAKEFILE - -$NGX_LIBATOMIC/build/lib/libatomic_ops.a: $NGX_LIBATOMIC/Makefile - cd $NGX_LIBATOMIC && \$(MAKE) && \$(MAKE) install - -$NGX_LIBATOMIC/Makefile: $NGX_MAKEFILE - cd $NGX_LIBATOMIC \\ - && if [ -f Makefile ]; then \$(MAKE) distclean; fi \\ - && ./configure --prefix=$ngx_prefix - -END diff --git a/src/deps/src/nginx-1.30.3/auto/lib/libgd/conf b/src/deps/src/nginx-1.30.3/auto/lib/libgd/conf deleted file mode 100644 index 07f565677e..0000000000 --- a/src/deps/src/nginx-1.30.3/auto/lib/libgd/conf +++ /dev/null @@ -1,112 +0,0 @@ - -# Copyright (C) Igor Sysoev -# Copyright (C) Nginx, Inc. - - - ngx_feature="GD library" - ngx_feature_name= - ngx_feature_run=no - ngx_feature_incs="#include " - ngx_feature_path= - ngx_feature_libs="-lgd" - ngx_feature_test="gdImagePtr img = gdImageCreateFromGifPtr(1, NULL); - (void) img" - . auto/feature - - -if [ $ngx_found = no ]; then - - # FreeBSD port - - ngx_feature="GD library in /usr/local/" - ngx_feature_path="/usr/local/include" - - if [ $NGX_RPATH = YES ]; then - ngx_feature_libs="-R/usr/local/lib -L/usr/local/lib -lgd" - else - ngx_feature_libs="-L/usr/local/lib -lgd" - fi - - . auto/feature -fi - - -if [ $ngx_found = no ]; then - - # NetBSD port - - ngx_feature="GD library in /usr/pkg/" - ngx_feature_path="/usr/pkg/include" - - if [ $NGX_RPATH = YES ]; then - ngx_feature_libs="-R/usr/pkg/lib -L/usr/pkg/lib -lgd" - else - ngx_feature_libs="-L/usr/pkg/lib -lgd" - fi - - . auto/feature -fi - - -if [ $ngx_found = no ]; then - - # MacPorts - - ngx_feature="GD library in /opt/local/" - ngx_feature_path="/opt/local/include" - - if [ $NGX_RPATH = YES ]; then - ngx_feature_libs="-R/opt/local/lib -L/opt/local/lib -lgd" - else - ngx_feature_libs="-L/opt/local/lib -lgd" - fi - - . auto/feature -fi - - -if [ $ngx_found = no ]; then - - # Homebrew on Apple Silicon - - ngx_feature="GD library in /opt/homebrew/" - ngx_feature_path="/opt/homebrew/include" - - if [ $NGX_RPATH = YES ]; then - ngx_feature_libs="-R/opt/homebrew/lib -L/opt/homebrew/lib -lgd" - else - ngx_feature_libs="-L/opt/homebrew/lib -lgd" - fi - - . auto/feature -fi - - -if [ $ngx_found = yes ]; then - - CORE_INCS="$CORE_INCS $ngx_feature_path" - - if [ $USE_LIBGD = YES ]; then - CORE_LIBS="$CORE_LIBS $ngx_feature_libs" - fi - - NGX_LIB_LIBGD=$ngx_feature_libs - - ngx_feature="GD WebP support" - ngx_feature_name="NGX_HAVE_GD_WEBP" - ngx_feature_test="gdImagePtr img = gdImageCreateFromWebpPtr(1, NULL); - (void) img" - . auto/feature - -else - -cat << END - -$0: error: the HTTP image filter module requires the GD library. -You can either do not enable the module or install the libraries. - -END - - exit 1 - -fi diff --git a/src/deps/src/nginx-1.30.3/auto/lib/libxslt/conf b/src/deps/src/nginx-1.30.3/auto/lib/libxslt/conf deleted file mode 100644 index 3063ac7ce0..0000000000 --- a/src/deps/src/nginx-1.30.3/auto/lib/libxslt/conf +++ /dev/null @@ -1,165 +0,0 @@ - -# Copyright (C) Igor Sysoev -# Copyright (C) Nginx, Inc. - - - ngx_feature="libxslt" - ngx_feature_name= - ngx_feature_run=no - ngx_feature_incs="#include - #include - #include - #include - #include - #include " - ngx_feature_path="/usr/include/libxml2" - ngx_feature_libs="-lxml2 -lxslt" - ngx_feature_test="xmlParserCtxtPtr ctxt = NULL; - xsltStylesheetPtr sheet = NULL; - xmlDocPtr doc = NULL; - xmlParseChunk(ctxt, NULL, 0, 0); - xsltApplyStylesheet(sheet, doc, NULL);" - . auto/feature - - -if [ $ngx_found = no ]; then - - # FreeBSD port - - ngx_feature="libxslt in /usr/local/" - ngx_feature_path="/usr/local/include/libxml2 /usr/local/include" - - if [ $NGX_RPATH = YES ]; then - ngx_feature_libs="-R/usr/local/lib -L/usr/local/lib -lxml2 -lxslt" - else - ngx_feature_libs="-L/usr/local/lib -lxml2 -lxslt" - fi - - . auto/feature -fi - - -if [ $ngx_found = no ]; then - - # NetBSD port - - ngx_feature="libxslt in /usr/pkg/" - ngx_feature_path="/usr/pkg/include/libxml2 /usr/pkg/include" - - if [ $NGX_RPATH = YES ]; then - ngx_feature_libs="-R/usr/pkg/lib -L/usr/pkg/lib -lxml2 -lxslt" - else - ngx_feature_libs="-L/usr/pkg/lib -lxml2 -lxslt" - fi - - . auto/feature -fi - - -if [ $ngx_found = no ]; then - - # MacPorts - - ngx_feature="libxslt in /opt/local/" - ngx_feature_path="/opt/local/include/libxml2 /opt/local/include" - - if [ $NGX_RPATH = YES ]; then - ngx_feature_libs="-R/opt/local/lib -L/opt/local/lib -lxml2 -lxslt" - else - ngx_feature_libs="-L/opt/local/lib -lxml2 -lxslt" - fi - - . auto/feature -fi - - -if [ $ngx_found = yes ]; then - - CORE_INCS="$CORE_INCS $ngx_feature_path" - - if [ $USE_LIBXSLT = YES ]; then - CORE_LIBS="$CORE_LIBS $ngx_feature_libs" - fi - - NGX_LIB_LIBXSLT=$ngx_feature_libs - -else - -cat << END - -$0: error: the HTTP XSLT module requires the libxml2/libxslt -libraries. You can either do not enable the module or install the libraries. - -END - - exit 1 -fi - - - ngx_feature="libexslt" - ngx_feature_name=NGX_HAVE_EXSLT - ngx_feature_run=no - ngx_feature_incs="#include " - ngx_feature_path="/usr/include/libxml2" - ngx_feature_libs="-lexslt" - ngx_feature_test="exsltRegisterAll();" - . auto/feature - -if [ $ngx_found = no ]; then - - # FreeBSD port - - ngx_feature="libexslt in /usr/local/" - ngx_feature_path="/usr/local/include/libxml2 /usr/local/include" - - if [ $NGX_RPATH = YES ]; then - ngx_feature_libs="-R/usr/local/lib -L/usr/local/lib -lexslt" - else - ngx_feature_libs="-L/usr/local/lib -lexslt" - fi - - . auto/feature -fi - - -if [ $ngx_found = no ]; then - - # NetBSD port - - ngx_feature="libexslt in /usr/pkg/" - ngx_feature_path="/usr/pkg/include/libxml2 /usr/local/include" - - if [ $NGX_RPATH = YES ]; then - ngx_feature_libs="-R/usr/pkg/lib -L/usr/pkg/lib -lexslt" - else - ngx_feature_libs="-L/usr/pkg/lib -lexslt" - fi - - . auto/feature -fi - - -if [ $ngx_found = no ]; then - - # MacPorts - - ngx_feature="libexslt in /opt/local/" - ngx_feature_path="/opt/local/include/libxml2 /opt/local/include" - - if [ $NGX_RPATH = YES ]; then - ngx_feature_libs="-R/opt/local/lib -L/opt/local/lib -lexslt" - else - ngx_feature_libs="-L/opt/local/lib -lexslt" - fi - - . auto/feature -fi - - -if [ $ngx_found = yes ]; then - if [ $USE_LIBXSLT = YES ]; then - CORE_LIBS="$CORE_LIBS -lexslt" - fi - - NGX_LIB_LIBXSLT="$NGX_LIB_LIBXSLT -lexslt" -fi diff --git a/src/deps/src/nginx-1.30.3/auto/lib/make b/src/deps/src/nginx-1.30.3/auto/lib/make deleted file mode 100644 index b64e32908c..0000000000 --- a/src/deps/src/nginx-1.30.3/auto/lib/make +++ /dev/null @@ -1,24 +0,0 @@ - -# Copyright (C) Igor Sysoev -# Copyright (C) Nginx, Inc. - - -if [ $PCRE != NONE -a $PCRE != NO -a $PCRE != YES ]; then - . auto/lib/pcre/make -fi - -if [ $OPENSSL != NONE -a $OPENSSL != NO -a $OPENSSL != YES ]; then - . auto/lib/openssl/make -fi - -if [ $ZLIB != NONE -a $ZLIB != NO -a $ZLIB != YES ]; then - . auto/lib/zlib/make -fi - -if [ $NGX_LIBATOMIC != NO -a $NGX_LIBATOMIC != YES ]; then - . auto/lib/libatomic/make -fi - -if [ $USE_PERL != NO ]; then - . auto/lib/perl/make -fi diff --git a/src/deps/src/nginx-1.30.3/auto/lib/openssl/conf b/src/deps/src/nginx-1.30.3/auto/lib/openssl/conf deleted file mode 100644 index 3068cae36b..0000000000 --- a/src/deps/src/nginx-1.30.3/auto/lib/openssl/conf +++ /dev/null @@ -1,196 +0,0 @@ - -# Copyright (C) Igor Sysoev -# Copyright (C) Nginx, Inc. - - -if [ $OPENSSL != NONE ]; then - - have=NGX_OPENSSL . auto/have - have=NGX_SSL . auto/have - - have=NGX_OPENSSL_NO_CONFIG . auto/have - - if [ $USE_OPENSSL_QUIC = YES ]; then - have=NGX_QUIC . auto/have - fi - - case "$CC" in - - cl | bcc32) - CFLAGS="$CFLAGS -DNO_SYS_TYPES_H" - - CORE_INCS="$CORE_INCS $OPENSSL/openssl/include" - CORE_DEPS="$CORE_DEPS $OPENSSL/openssl/include/openssl/ssl.h" - - if [ -f $OPENSSL/ms/do_ms.bat ]; then - # before OpenSSL 1.1.0 - CORE_LIBS="$CORE_LIBS $OPENSSL/openssl/lib/ssleay32.lib" - CORE_LIBS="$CORE_LIBS $OPENSSL/openssl/lib/libeay32.lib" - else - # OpenSSL 1.1.0+ - CORE_LIBS="$CORE_LIBS $OPENSSL/openssl/lib/libssl.lib" - CORE_LIBS="$CORE_LIBS $OPENSSL/openssl/lib/libcrypto.lib" - fi - - # libeay32.lib requires gdi32.lib - CORE_LIBS="$CORE_LIBS gdi32.lib" - # OpenSSL 1.0.0 requires crypt32.lib - CORE_LIBS="$CORE_LIBS crypt32.lib" - ;; - - *) - CORE_INCS="$CORE_INCS $OPENSSL/.openssl/include" - CORE_DEPS="$CORE_DEPS $OPENSSL/.openssl/include/openssl/ssl.h" - CORE_LIBS="$CORE_LIBS $OPENSSL/.openssl/lib/libssl.a" - CORE_LIBS="$CORE_LIBS $OPENSSL/.openssl/lib/libcrypto.a" - CORE_LIBS="$CORE_LIBS $NGX_LIBDL" - CORE_LIBS="$CORE_LIBS $NGX_LIBPTHREAD" - - if [ "$NGX_PLATFORM" = win32 ]; then - CORE_LIBS="$CORE_LIBS -lgdi32 -lcrypt32 -lws2_32" - fi - ;; - esac - -else - - if [ "$NGX_PLATFORM" != win32 ]; then - - OPENSSL=NO - - ngx_feature="OpenSSL library" - ngx_feature_name="NGX_OPENSSL" - ngx_feature_run=no - ngx_feature_incs="#include " - ngx_feature_path= - ngx_feature_libs="-lssl -lcrypto $NGX_LIBDL $NGX_LIBPTHREAD" - ngx_feature_test="SSL_CTX_set_options(NULL, 0)" - . auto/feature - - if [ $ngx_found = no ]; then - - # FreeBSD port - - ngx_feature="OpenSSL library in /usr/local/" - ngx_feature_path="/usr/local/include" - - if [ $NGX_RPATH = YES ]; then - ngx_feature_libs="-R/usr/local/lib -L/usr/local/lib -lssl -lcrypto" - else - ngx_feature_libs="-L/usr/local/lib -lssl -lcrypto" - fi - - ngx_feature_libs="$ngx_feature_libs $NGX_LIBDL $NGX_LIBPTHREAD" - - . auto/feature - fi - - if [ $ngx_found = no ]; then - - # NetBSD port - - ngx_feature="OpenSSL library in /usr/pkg/" - ngx_feature_path="/usr/pkg/include" - - if [ $NGX_RPATH = YES ]; then - ngx_feature_libs="-R/usr/pkg/lib -L/usr/pkg/lib -lssl -lcrypto" - else - ngx_feature_libs="-L/usr/pkg/lib -lssl -lcrypto" - fi - - ngx_feature_libs="$ngx_feature_libs $NGX_LIBDL $NGX_LIBPTHREAD" - - . auto/feature - fi - - if [ $ngx_found = no ]; then - - # MacPorts - - ngx_feature="OpenSSL library in /opt/local/" - ngx_feature_path="/opt/local/include" - - if [ $NGX_RPATH = YES ]; then - ngx_feature_libs="-R/opt/local/lib -L/opt/local/lib -lssl -lcrypto" - else - ngx_feature_libs="-L/opt/local/lib -lssl -lcrypto" - fi - - ngx_feature_libs="$ngx_feature_libs $NGX_LIBDL $NGX_LIBPTHREAD" - - . auto/feature - fi - - if [ $ngx_found = no ]; then - - # Homebrew on Apple Silicon - - ngx_feature="OpenSSL library in /opt/homebrew/" - ngx_feature_path="/opt/homebrew/include" - - if [ $NGX_RPATH = YES ]; then - ngx_feature_libs="-R/opt/homebrew/lib -L/opt/homebrew/lib -lssl -lcrypto" - else - ngx_feature_libs="-L/opt/homebrew/lib -lssl -lcrypto" - fi - - ngx_feature_libs="$ngx_feature_libs $NGX_LIBDL $NGX_LIBPTHREAD" - - . auto/feature - fi - - if [ $ngx_found = yes ]; then - have=NGX_SSL . auto/have - CORE_INCS="$CORE_INCS $ngx_feature_path" - CORE_LIBS="$CORE_LIBS $ngx_feature_libs" - OPENSSL=YES - - if [ $USE_OPENSSL_QUIC = YES ]; then - - ngx_feature="OpenSSL QUIC API" - ngx_feature_name="NGX_QUIC" - ngx_feature_test="SSL_set_quic_tls_cbs(NULL, NULL, NULL)" - . auto/feature - - if [ $ngx_found = no ]; then - ngx_feature="BoringSSL-like QUIC API" - ngx_feature_test="SSL_set_quic_method(NULL, NULL)" - . auto/feature - fi - - if [ $ngx_found = no ]; then - ngx_feature="OpenSSL QUIC compatibility" - ngx_feature_test="SSL_CTX_add_custom_ext(NULL, 0, 0, - NULL, NULL, NULL, NULL, NULL)" - . auto/feature - fi - - if [ $ngx_found = no ]; then -cat << END - -$0: error: certain modules require OpenSSL QUIC support. -You can either do not enable the modules, or install the OpenSSL library with -QUIC support into the system, or build the OpenSSL library with QUIC support -statically from the source with nginx by using --with-openssl= option. - -END - exit 1 - fi - fi - fi - fi - - if [ $OPENSSL != YES ]; then - -cat << END - -$0: error: SSL modules require the OpenSSL library. -You can either do not enable the modules, or install the OpenSSL library -into the system, or build the OpenSSL library statically from the source -with nginx by using --with-openssl= option. - -END - exit 1 - fi - -fi diff --git a/src/deps/src/nginx-1.30.3/auto/lib/openssl/make b/src/deps/src/nginx-1.30.3/auto/lib/openssl/make deleted file mode 100644 index f8480146de..0000000000 --- a/src/deps/src/nginx-1.30.3/auto/lib/openssl/make +++ /dev/null @@ -1,79 +0,0 @@ - -# Copyright (C) Igor Sysoev -# Copyright (C) Nginx, Inc. - - -case "$CC" in - - cl) - - case "$NGX_MACHINE" in - - amd64) - OPENSSL_TARGET=VC-WIN64A - ;; - - arm64) - OPENSSL_TARGET=VC-WIN64-ARM - ;; - - *) - OPENSSL_TARGET=VC-WIN32 - ;; - - esac - - cat << END >> $NGX_MAKEFILE - -$OPENSSL/openssl/include/openssl/ssl.h: $NGX_MAKEFILE - \$(MAKE) -f auto/lib/openssl/makefile.msvc \ - OPENSSL="$OPENSSL" OPENSSL_OPT="$OPENSSL_OPT" \ - OPENSSL_TARGET="$OPENSSL_TARGET" - -END - - ;; - - bcc32) - - ngx_opt=`echo "-DOPENSSL=\"$OPENSSL\" -DOPENSSL_OPT=\"$OPENSSL_OPT\"" \ - | sed -e "s/\//$ngx_regex_dirsep/g"` - - cat << END >> $NGX_MAKEFILE - -`echo "$OPENSSL\\openssl\\lib\\libeay32.lib: \ - $OPENSSL\\openssl\\include\\openssl\\ssl.h" \ - | sed -e "s/\//$ngx_regex_dirsep/g"` - -`echo "$OPENSSL\\openssl\\lib\\ssleay32.lib: \ - $OPENSSL\\openssl\\include\\openssl\\ssl.h" \ - | sed -e "s/\//$ngx_regex_dirsep/g"` - -`echo "$OPENSSL\\openssl\\include\\openssl\\ssl.h: $NGX_MAKEFILE" \ - | sed -e "s/\//$ngx_regex_dirsep/g"` - \$(MAKE) -f auto/lib/openssl/makefile.bcc $ngx_opt - -END - - ;; - - *) - case $OPENSSL in - /*) ngx_prefix="$OPENSSL/.openssl" ;; - *) ngx_prefix="$PWD/$OPENSSL/.openssl" ;; - esac - - cat << END >> $NGX_MAKEFILE - -$OPENSSL/.openssl/include/openssl/ssl.h: $NGX_MAKEFILE - cd $OPENSSL \\ - && if [ -f Makefile ]; then \$(MAKE) clean; fi \\ - && ./config --prefix=$ngx_prefix no-shared no-threads $OPENSSL_OPT \\ - && \$(MAKE) \\ - && \$(MAKE) install_sw LIBDIR=lib - -END - - ;; - -esac diff --git a/src/deps/src/nginx-1.30.3/auto/lib/openssl/makefile.bcc b/src/deps/src/nginx-1.30.3/auto/lib/openssl/makefile.bcc deleted file mode 100644 index 6a94ff7498..0000000000 --- a/src/deps/src/nginx-1.30.3/auto/lib/openssl/makefile.bcc +++ /dev/null @@ -1,18 +0,0 @@ - -# Copyright (C) Igor Sysoev -# Copyright (C) Nginx, Inc. - - -all: - cd $(OPENSSL) - - perl Configure BC-32 no-shared --prefix=openssl $(OPENSSL_OPT) - - ms\do_nasm - - $(MAKE) -f ms\bcb.mak - $(MAKE) -f ms\bcb.mak install - - # Borland's make does not expand "[ch]" in - # copy "inc32\openssl\*.[ch]" "openssl\include\openssl" - copy inc32\openssl\*.h openssl\include\openssl diff --git a/src/deps/src/nginx-1.30.3/auto/lib/openssl/makefile.msvc b/src/deps/src/nginx-1.30.3/auto/lib/openssl/makefile.msvc deleted file mode 100644 index ed17cde08f..0000000000 --- a/src/deps/src/nginx-1.30.3/auto/lib/openssl/makefile.msvc +++ /dev/null @@ -1,21 +0,0 @@ - -# Copyright (C) Igor Sysoev -# Copyright (C) Nginx, Inc. - - -all: - cd $(OPENSSL) - - perl Configure $(OPENSSL_TARGET) no-shared no-threads \ - --prefix="%cd%/openssl" \ - --openssldir="%cd%/openssl/ssl" \ - $(OPENSSL_OPT) - - if exist ms\do_ms.bat ( \ - ms\do_ms \ - && $(MAKE) -f ms\nt.mak \ - && $(MAKE) -f ms\nt.mak install \ - ) else ( \ - $(MAKE) \ - && $(MAKE) install_sw \ - ) diff --git a/src/deps/src/nginx-1.30.3/auto/lib/pcre/conf b/src/deps/src/nginx-1.30.3/auto/lib/pcre/conf deleted file mode 100644 index cdf1809f59..0000000000 --- a/src/deps/src/nginx-1.30.3/auto/lib/pcre/conf +++ /dev/null @@ -1,235 +0,0 @@ - -# Copyright (C) Igor Sysoev -# Copyright (C) Nginx, Inc. - - -if [ $PCRE != NONE ]; then - - if [ -f $PCRE/src/pcre2.h.generic ]; then - - PCRE_LIBRARY=PCRE2 - - have=NGX_PCRE . auto/have - have=NGX_PCRE2 . auto/have - - if [ "$NGX_PLATFORM" = win32 ]; then - have=PCRE2_STATIC . auto/have - fi - - CORE_INCS="$CORE_INCS $PCRE/src/" - CORE_DEPS="$CORE_DEPS $PCRE/src/pcre2.h" - - case "$NGX_CC_NAME" in - - msvc) - LINK_DEPS="$LINK_DEPS $PCRE/src/pcre2-8.lib" - CORE_LIBS="$CORE_LIBS $PCRE/src/pcre2-8.lib" - ;; - - *) - LINK_DEPS="$LINK_DEPS $PCRE/.libs/libpcre2-8.a" - CORE_LIBS="$CORE_LIBS $PCRE/.libs/libpcre2-8.a" - ;; - - esac - - else - - PCRE_LIBRARY=PCRE - - have=NGX_PCRE . auto/have - - if [ "$NGX_PLATFORM" = win32 ]; then - have=PCRE_STATIC . auto/have - fi - - CORE_INCS="$CORE_INCS $PCRE" - CORE_DEPS="$CORE_DEPS $PCRE/pcre.h" - - case "$NGX_CC_NAME" in - - msvc | owc | bcc) - LINK_DEPS="$LINK_DEPS $PCRE/pcre.lib" - CORE_LIBS="$CORE_LIBS $PCRE/pcre.lib" - ;; - - *) - LINK_DEPS="$LINK_DEPS $PCRE/.libs/libpcre.a" - CORE_LIBS="$CORE_LIBS $PCRE/.libs/libpcre.a" - ;; - - esac - fi - - if [ $PCRE_JIT = YES ]; then - have=NGX_HAVE_PCRE_JIT . auto/have - PCRE_CONF_OPT="$PCRE_CONF_OPT --enable-jit" - fi - -else - - if [ "$NGX_PLATFORM" != win32 ]; then - PCRE=NO - fi - - if [ $PCRE = NO -a $PCRE2 != DISABLED ]; then - - ngx_feature="PCRE2 library" - ngx_feature_name="NGX_PCRE2" - ngx_feature_run=no - ngx_feature_incs="#define PCRE2_CODE_UNIT_WIDTH 8 - #include " - ngx_feature_path= - ngx_feature_libs="-lpcre2-8" - ngx_feature_test="pcre2_code *re; - re = pcre2_compile(NULL, 0, 0, NULL, NULL, NULL); - if (re == NULL) return 1" - . auto/feature - - if [ $ngx_found = no ]; then - - # pcre2-config - - ngx_pcre2_prefix=`pcre2-config --prefix 2>/dev/null` - - if [ -n "$ngx_pcre2_prefix" ]; then - ngx_feature="PCRE2 library in $ngx_pcre2_prefix" - ngx_feature_path=`pcre2-config --cflags \ - | sed -n -e 's/.*-I *\([^ ][^ ]*\).*/\1/p'` - ngx_feature_libs=`pcre2-config --libs8` - . auto/feature - fi - fi - - if [ $ngx_found = yes ]; then - have=NGX_PCRE . auto/have - CORE_INCS="$CORE_INCS $ngx_feature_path" - CORE_LIBS="$CORE_LIBS $ngx_feature_libs" - PCRE=YES - PCRE_LIBRARY=PCRE2 - fi - fi - - if [ $PCRE = NO ]; then - - ngx_feature="PCRE library" - ngx_feature_name="NGX_PCRE" - ngx_feature_run=no - ngx_feature_incs="#include " - ngx_feature_path= - ngx_feature_libs="-lpcre" - ngx_feature_test="pcre *re; - re = pcre_compile(NULL, 0, NULL, 0, NULL); - if (re == NULL) return 1" - . auto/feature - - if [ $ngx_found = no ]; then - - # FreeBSD port - - ngx_feature="PCRE library in /usr/local/" - ngx_feature_path="/usr/local/include" - - if [ $NGX_RPATH = YES ]; then - ngx_feature_libs="-R/usr/local/lib -L/usr/local/lib -lpcre" - else - ngx_feature_libs="-L/usr/local/lib -lpcre" - fi - - . auto/feature - fi - - if [ $ngx_found = no ]; then - - # RedHat RPM, Solaris package - - ngx_feature="PCRE library in /usr/include/pcre/" - ngx_feature_path="/usr/include/pcre" - ngx_feature_libs="-lpcre" - - . auto/feature - fi - - if [ $ngx_found = no ]; then - - # NetBSD port - - ngx_feature="PCRE library in /usr/pkg/" - ngx_feature_path="/usr/pkg/include" - - if [ $NGX_RPATH = YES ]; then - ngx_feature_libs="-R/usr/pkg/lib -L/usr/pkg/lib -lpcre" - else - ngx_feature_libs="-L/usr/pkg/lib -lpcre" - fi - - . auto/feature - fi - - if [ $ngx_found = no ]; then - - # MacPorts - - ngx_feature="PCRE library in /opt/local/" - ngx_feature_path="/opt/local/include" - - if [ $NGX_RPATH = YES ]; then - ngx_feature_libs="-R/opt/local/lib -L/opt/local/lib -lpcre" - else - ngx_feature_libs="-L/opt/local/lib -lpcre" - fi - - . auto/feature - fi - - if [ $ngx_found = no ]; then - - # Homebrew on Apple Silicon - - ngx_feature="PCRE library in /opt/homebrew/" - ngx_feature_path="/opt/homebrew/include" - - if [ $NGX_RPATH = YES ]; then - ngx_feature_libs="-R/opt/homebrew/lib -L/opt/homebrew/lib -lpcre" - else - ngx_feature_libs="-L/opt/homebrew/lib -lpcre" - fi - - . auto/feature - fi - - if [ $ngx_found = yes ]; then - CORE_INCS="$CORE_INCS $ngx_feature_path" - CORE_LIBS="$CORE_LIBS $ngx_feature_libs" - PCRE=YES - PCRE_LIBRARY=PCRE - fi - - if [ $PCRE = YES ]; then - ngx_feature="PCRE JIT support" - ngx_feature_name="NGX_HAVE_PCRE_JIT" - ngx_feature_test="int jit = 0; - pcre_free_study(NULL); - pcre_config(PCRE_CONFIG_JIT, &jit); - if (jit != 1) return 1;" - . auto/feature - - if [ $ngx_found = yes ]; then - PCRE_JIT=YES - fi - fi - fi - - if [ $PCRE != YES ]; then -cat << END - -$0: error: the HTTP rewrite module requires the PCRE library. -You can either disable the module by using --without-http_rewrite_module -option, or install the PCRE library into the system, or build the PCRE library -statically from the source with nginx by using --with-pcre= option. - -END - exit 1 - fi - -fi diff --git a/src/deps/src/nginx-1.30.3/auto/lib/pcre/make b/src/deps/src/nginx-1.30.3/auto/lib/pcre/make deleted file mode 100644 index 8a20859c66..0000000000 --- a/src/deps/src/nginx-1.30.3/auto/lib/pcre/make +++ /dev/null @@ -1,171 +0,0 @@ - -# Copyright (C) Igor Sysoev -# Copyright (C) Nginx, Inc. - - -if [ $PCRE_LIBRARY = PCRE2 ]; then - - # PCRE2 - - if [ $NGX_CC_NAME = msvc ]; then - - # With PCRE2, it is not possible to compile all sources. - # Since list of source files changes between versions, we - # test files which might not be present. - - ngx_pcre_srcs="pcre2_auto_possess.c \ - pcre2_chartables.c \ - pcre2_compile.c \ - pcre2_config.c \ - pcre2_context.c \ - pcre2_dfa_match.c \ - pcre2_error.c \ - pcre2_jit_compile.c \ - pcre2_maketables.c \ - pcre2_match.c \ - pcre2_match_data.c \ - pcre2_newline.c \ - pcre2_ord2utf.c \ - pcre2_pattern_info.c \ - pcre2_string_utils.c \ - pcre2_study.c \ - pcre2_substitute.c \ - pcre2_substring.c \ - pcre2_tables.c \ - pcre2_ucd.c \ - pcre2_valid_utf.c \ - pcre2_xclass.c" - - ngx_pcre_test="pcre2_chkdint.c \ - pcre2_compile_cgroup.c \ - pcre2_compile_class.c \ - pcre2_convert.c \ - pcre2_extuni.c \ - pcre2_find_bracket.c \ - pcre2_script_run.c \ - pcre2_serialize.c" - - for ngx_src in $ngx_pcre_test - do - if [ -f $PCRE/src/$ngx_src ]; then - ngx_pcre_srcs="$ngx_pcre_srcs $ngx_src" - fi - done - - ngx_pcre_objs=`echo $ngx_pcre_srcs \ - | sed -e "s#\([^ ]*\.\)c#\1$ngx_objext#g"` - - ngx_pcre_srcs=`echo $ngx_pcre_srcs \ - | sed -e "s/ *\([^ ][^ ]*\)/$ngx_regex_cont\1/g"` - ngx_pcre_objs=`echo $ngx_pcre_objs \ - | sed -e "s/ *\([^ ][^ ]*\)/$ngx_regex_cont\1/g"` - - cat << END >> $NGX_MAKEFILE - -PCRE_CFLAGS = -O2 -Ob1 -Oi -Gs $LIBC $CPU_OPT -PCRE_FLAGS = -DHAVE_CONFIG_H -DPCRE2_STATIC -DPCRE2_CODE_UNIT_WIDTH=8 \\ - -DHAVE_MEMMOVE - -PCRE_SRCS = $ngx_pcre_srcs -PCRE_OBJS = $ngx_pcre_objs - -$PCRE/src/pcre2.h: - cd $PCRE/src \\ - && copy /y config.h.generic config.h \\ - && copy /y pcre2.h.generic pcre2.h \\ - && copy /y pcre2_chartables.c.dist pcre2_chartables.c - -$PCRE/src/pcre2-8.lib: $PCRE/src/pcre2.h $NGX_MAKEFILE - cd $PCRE/src \\ - && cl -nologo -c \$(PCRE_CFLAGS) -I . \$(PCRE_FLAGS) \$(PCRE_SRCS) \\ - && link -lib -out:pcre2-8.lib -verbose:lib \$(PCRE_OBJS) - -END - - else - - cat << END >> $NGX_MAKEFILE - -$PCRE/src/pcre2.h: $PCRE/Makefile - -$PCRE/Makefile: $NGX_MAKEFILE - cd $PCRE \\ - && if [ -f Makefile ]; then \$(MAKE) distclean; fi \\ - && CC="\$(CC)" CFLAGS="$PCRE_OPT" \\ - ./configure --disable-shared $PCRE_CONF_OPT - -$PCRE/.libs/libpcre2-8.a: $PCRE/Makefile - cd $PCRE \\ - && \$(MAKE) libpcre2-8.la - -END - - fi - - -else - - # PCRE - - case "$NGX_CC_NAME" in - - msvc) - ngx_makefile=makefile.msvc - ngx_opt="CPU_OPT=\"$CPU_OPT\" LIBC=$LIBC" - ngx_pcre="PCRE=\"$PCRE\"" - ;; - - owc) - ngx_makefile=makefile.owc - ngx_opt="CPU_OPT=\"$CPU_OPT\"" - ngx_pcre=`echo PCRE=\"$PCRE\" | sed -e "s/\//$ngx_regex_dirsep/g"` - ;; - - bcc) - ngx_makefile=makefile.bcc - ngx_opt="-DCPU_OPT=\"$CPU_OPT\"" - ngx_pcre=`echo \-DPCRE=\"$PCRE\" \ - | sed -e "s/\//$ngx_regex_dirsep/g"` - ;; - - *) - ngx_makefile= - ;; - - esac - - - if [ -n "$ngx_makefile" ]; then - - cat << END >> $NGX_MAKEFILE - -`echo "$PCRE/pcre.lib: $PCRE/pcre.h $NGX_MAKEFILE" \ - | sed -e "s/\//$ngx_regex_dirsep/g"` - \$(MAKE) -f auto/lib/pcre/$ngx_makefile $ngx_pcre $ngx_opt - -`echo "$PCRE/pcre.h:" | sed -e "s/\//$ngx_regex_dirsep/g"` - \$(MAKE) -f auto/lib/pcre/$ngx_makefile $ngx_pcre pcre.h - -END - - else - - cat << END >> $NGX_MAKEFILE - -$PCRE/pcre.h: $PCRE/Makefile - -$PCRE/Makefile: $NGX_MAKEFILE - cd $PCRE \\ - && if [ -f Makefile ]; then \$(MAKE) distclean; fi \\ - && CC="\$(CC)" CFLAGS="$PCRE_OPT" \\ - ./configure --disable-shared $PCRE_CONF_OPT - -$PCRE/.libs/libpcre.a: $PCRE/Makefile - cd $PCRE \\ - && \$(MAKE) libpcre.la - -END - - fi - -fi diff --git a/src/deps/src/nginx-1.30.3/auto/lib/pcre/makefile.bcc b/src/deps/src/nginx-1.30.3/auto/lib/pcre/makefile.bcc deleted file mode 100644 index 7a0f2beafc..0000000000 --- a/src/deps/src/nginx-1.30.3/auto/lib/pcre/makefile.bcc +++ /dev/null @@ -1,27 +0,0 @@ - -# Copyright (C) Igor Sysoev -# Copyright (C) Nginx, Inc. - - -CFLAGS = -q -O2 -tWM -w-8004 $(CPU_OPT) -PCREFLAGS = -DHAVE_CONFIG_H -DPCRE_STATIC -DPOSIX_MALLOC_THRESHOLD=10 \ - -DSUPPORT_PCRE8 -DHAVE_MEMMOVE - - -pcre.lib: - cd $(PCRE) - - bcc32 -c $(CFLAGS) -I. $(PCREFLAGS) pcre_*.c - - copy /y nul pcre.lst - for %n in (*.obj) do @echo +%n ^^& >> pcre.lst - echo + >> pcre.lst - - tlib pcre.lib @pcre.lst - -pcre.h: - cd $(PCRE) - - copy /y pcre.h.generic pcre.h - copy /y config.h.generic config.h - copy /y pcre_chartables.c.dist pcre_chartables.c diff --git a/src/deps/src/nginx-1.30.3/auto/lib/pcre/makefile.msvc b/src/deps/src/nginx-1.30.3/auto/lib/pcre/makefile.msvc deleted file mode 100644 index 07fd9a2853..0000000000 --- a/src/deps/src/nginx-1.30.3/auto/lib/pcre/makefile.msvc +++ /dev/null @@ -1,23 +0,0 @@ - -# Copyright (C) Igor Sysoev -# Copyright (C) Nginx, Inc. - - -CFLAGS = -O2 -Ob1 -Oi -Gs $(LIBC) $(CPU_OPT) -PCREFLAGS = -DHAVE_CONFIG_H -DPCRE_STATIC -DPOSIX_MALLOC_THRESHOLD=10 \ - -DSUPPORT_PCRE8 -DHAVE_MEMMOVE - - -pcre.lib: - cd $(PCRE) - - cl -nologo -c $(CFLAGS) -I . $(PCREFLAGS) pcre_*.c - - link -lib -out:pcre.lib -verbose:lib pcre_*.obj - -pcre.h: - cd $(PCRE) - - copy /y pcre.h.generic pcre.h - copy /y config.h.generic config.h - copy /y pcre_chartables.c.dist pcre_chartables.c diff --git a/src/deps/src/nginx-1.30.3/auto/lib/pcre/makefile.owc b/src/deps/src/nginx-1.30.3/auto/lib/pcre/makefile.owc deleted file mode 100644 index 122fd5b27f..0000000000 --- a/src/deps/src/nginx-1.30.3/auto/lib/pcre/makefile.owc +++ /dev/null @@ -1,25 +0,0 @@ - -# Copyright (C) Igor Sysoev -# Copyright (C) Nginx, Inc. - - -CFLAGS = -c -zq -bt=nt -ot -op -oi -oe -s -bm $(CPU_OPT) -PCREFLAGS = -DHAVE_CONFIG_H -DPCRE_STATIC -DPOSIX_MALLOC_THRESHOLD=10 & - -DSUPPORT_PCRE8 -DHAVE_MEMMOVE - - -pcre.lib: - cd $(PCRE) - - wcl386 $(CFLAGS) -i=. $(PCREFLAGS) pcre_*.c - - dir /b *.obj > pcre.lst - - wlib -n pcre.lib @pcre.lst - -pcre.h: - cd $(PCRE) - - copy /y pcre.h.generic pcre.h - copy /y config.h.generic config.h - copy /y pcre_chartables.c.dist pcre_chartables.c diff --git a/src/deps/src/nginx-1.30.3/auto/lib/perl/conf b/src/deps/src/nginx-1.30.3/auto/lib/perl/conf deleted file mode 100644 index e16a1bc85a..0000000000 --- a/src/deps/src/nginx-1.30.3/auto/lib/perl/conf +++ /dev/null @@ -1,83 +0,0 @@ - -# Copyright (C) Igor Sysoev -# Copyright (C) Nginx, Inc. - - -echo "checking for perl" - - -NGX_PERL_VER=`$NGX_PERL -v 2>&1 | grep '^This is perl' 2>&1 \ - | sed -e 's/^This is perl, \(.*\)/\1/'` - -if test -n "$NGX_PERL_VER"; then - echo " + perl version: $NGX_PERL_VER" - - if [ "`$NGX_PERL -e 'use 5.008006; print "OK"'`" != "OK" ]; then - echo - echo "$0: error: perl 5.8.6 or higher is required" - echo - - exit 1; - fi - - if [ "`$NGX_PERL -MExtUtils::Embed -e 'print "OK"'`" != "OK" ]; then - echo - echo "$0: error: perl module ExtUtils::Embed is required" - echo - - exit 1; - fi - - NGX_PM_CFLAGS=`$NGX_PERL -MExtUtils::Embed -e ccopts` - NGX_PM_LDFLAGS=`$NGX_PERL -MConfig -e 'print $Config{lddlflags}'` - - NGX_PERL_CFLAGS="$CFLAGS `$NGX_PERL -MExtUtils::Embed -e ccopts`" - - # gcc 4.1/4.2 warn about unused values in pTHX_ - NGX_PERL_CFLAGS=`echo $NGX_PERL_CFLAGS \ - | sed -e 's/-Wunused-value/-Wno-unused-value/'` - # icc8 warns 'declaration hides parameter "my_perl"' in ENTER and LEAVE - NGX_PERL_CFLAGS=`echo $NGX_PERL_CFLAGS \ - | sed -e 's/-wd171/-wd171 -wd1599/'` - - ngx_perl_ldopts=`$NGX_PERL -MExtUtils::Embed -e ldopts` - - ngx_perl_dlext=`$NGX_PERL -MConfig -e 'print $Config{dlext}'` - ngx_perl_libdir="src/http/modules/perl/blib/arch/auto" - ngx_perl_module="$ngx_perl_libdir/nginx/nginx.$ngx_perl_dlext" - - if $NGX_PERL -V:usemultiplicity | grep define > /dev/null; then - have=NGX_HAVE_PERL_MULTIPLICITY . auto/have - echo " + perl interpreter multiplicity found" - fi - - if $NGX_PERL -V:useithreads | grep undef > /dev/null; then - # FreeBSD port wants to link with -pthread non-threaded perl - ngx_perl_ldopts=`echo $ngx_perl_ldopts | sed 's/ -pthread//'` - fi - - if [ "$NGX_SYSTEM" = "Darwin" ]; then - # OS X system perl wants to link universal binaries - ngx_perl_ldopts=`echo $ngx_perl_ldopts \ - | sed -e 's/-arch i386//' -e 's/-arch x86_64//'` - fi - - if [ $USE_PERL = YES ]; then - CORE_LINK="$CORE_LINK $ngx_perl_ldopts" - fi - - NGX_LIB_PERL="$ngx_perl_ldopts" - - if test -n "$NGX_PERL_MODULES"; then - have=NGX_PERL_MODULES value="(u_char *) \"$NGX_PERL_MODULES\"" - . auto/define - NGX_PERL_MODULES_MAN=$NGX_PERL_MODULES/man3 - fi - -else - echo - echo "$0: error: perl 5.8.6 or higher is required" - echo - - exit 1; -fi diff --git a/src/deps/src/nginx-1.30.3/auto/lib/perl/make b/src/deps/src/nginx-1.30.3/auto/lib/perl/make deleted file mode 100644 index 74e0f3ad61..0000000000 --- a/src/deps/src/nginx-1.30.3/auto/lib/perl/make +++ /dev/null @@ -1,46 +0,0 @@ - -# Copyright (C) Igor Sysoev -# Copyright (C) Nginx, Inc. - - -cat << END >> $NGX_MAKEFILE - -$NGX_OBJS/src/http/modules/perl/ngx_http_perl_module.o: \\ - $NGX_OBJS/$ngx_perl_module - -$NGX_OBJS/$ngx_perl_module: \\ - \$(CORE_DEPS) \$(HTTP_DEPS) \\ - src/http/modules/perl/ngx_http_perl_module.h \\ - $NGX_OBJS/src/http/modules/perl/Makefile - cd $NGX_OBJS/src/http/modules/perl && \$(MAKE) - - rm -rf $NGX_OBJS/install_perl - - -$NGX_OBJS/src/http/modules/perl/Makefile: \\ - $NGX_AUTO_CONFIG_H \\ - src/core/nginx.h \\ - src/http/modules/perl/Makefile.PL \\ - src/http/modules/perl/nginx.pm \\ - src/http/modules/perl/nginx.xs \\ - src/http/modules/perl/typemap - grep 'define NGINX_VERSION' src/core/nginx.h \\ - | sed -e 's/^.*"\(.*\)".*/\1/' > \\ - $NGX_OBJS/src/http/modules/perl/version - sed "s/%%VERSION%%/\`cat $NGX_OBJS/src/http/modules/perl/version\`/" \\ - src/http/modules/perl/nginx.pm > \\ - $NGX_OBJS/src/http/modules/perl/nginx.pm - cp -p src/http/modules/perl/nginx.xs $NGX_OBJS/src/http/modules/perl/ - cp -p src/http/modules/perl/typemap $NGX_OBJS/src/http/modules/perl/ - cp -p src/http/modules/perl/Makefile.PL $NGX_OBJS/src/http/modules/perl/ - - cd $NGX_OBJS/src/http/modules/perl \\ - && NGX_PM_CFLAGS="\$(NGX_PM_CFLAGS) -g $NGX_CC_OPT" \\ - NGX_PM_LDFLAGS="$NGX_LD_OPT \$(NGX_PM_LDFLAGS)" \\ - NGX_INCS="$CORE_INCS $NGX_OBJS $HTTP_INCS" \\ - NGX_DEPS="\$(CORE_DEPS) \$(HTTP_DEPS)" \\ - $NGX_PERL Makefile.PL \\ - LIB=$NGX_PERL_MODULES \\ - INSTALLSITEMAN3DIR=$NGX_PERL_MODULES_MAN - -END diff --git a/src/deps/src/nginx-1.30.3/auto/lib/zlib/conf b/src/deps/src/nginx-1.30.3/auto/lib/zlib/conf deleted file mode 100644 index 239592e3ca..0000000000 --- a/src/deps/src/nginx-1.30.3/auto/lib/zlib/conf +++ /dev/null @@ -1,79 +0,0 @@ - -# Copyright (C) Igor Sysoev -# Copyright (C) Nginx, Inc. - - -if [ $ZLIB != NONE ]; then - CORE_INCS="$CORE_INCS $ZLIB" - - case "$NGX_CC_NAME" in - - msvc | owc | bcc) - have=NGX_ZLIB . auto/have - LINK_DEPS="$LINK_DEPS $ZLIB/zlib.lib" - CORE_LIBS="$CORE_LIBS $ZLIB/zlib.lib" - ;; - - icc) - have=NGX_ZLIB . auto/have - LINK_DEPS="$LINK_DEPS $ZLIB/libz.a" - - # to allow -ipo optimization we link with the *.o but not library - CORE_LIBS="$CORE_LIBS $ZLIB/adler32.o" - CORE_LIBS="$CORE_LIBS $ZLIB/crc32.o" - CORE_LIBS="$CORE_LIBS $ZLIB/deflate.o" - CORE_LIBS="$CORE_LIBS $ZLIB/trees.o" - CORE_LIBS="$CORE_LIBS $ZLIB/zutil.o" - CORE_LIBS="$CORE_LIBS $ZLIB/compress.o" - - if [ $ZLIB_ASM != NO ]; then - CORE_LIBS="$CORE_LIBS $ZLIB/match.o" - fi - ;; - - *) - have=NGX_ZLIB . auto/have - LINK_DEPS="$LINK_DEPS $ZLIB/libz.a" - CORE_LIBS="$CORE_LIBS $ZLIB/libz.a" - #CORE_LIBS="$CORE_LIBS -L $ZLIB -lz" - ;; - - esac - -else - - if [ "$NGX_PLATFORM" != win32 ]; then - ZLIB=NO - - # FreeBSD, Solaris, Linux - - ngx_feature="zlib library" - ngx_feature_name="NGX_ZLIB" - ngx_feature_run=no - ngx_feature_incs="#include " - ngx_feature_path= - ngx_feature_libs="-lz" - ngx_feature_test="z_stream z; deflate(&z, Z_NO_FLUSH)" - . auto/feature - - - if [ $ngx_found = yes ]; then - CORE_LIBS="$CORE_LIBS $ngx_feature_libs" - ZLIB=YES - ngx_found=no - fi - fi - - if [ $ZLIB != YES ]; then -cat << END - -$0: error: the HTTP gzip module requires the zlib library. -You can either disable the module by using --without-http_gzip_module -option, or install the zlib library into the system, or build the zlib library -statically from the source with nginx by using --with-zlib= option. - -END - exit 1 - fi - -fi diff --git a/src/deps/src/nginx-1.30.3/auto/lib/zlib/make b/src/deps/src/nginx-1.30.3/auto/lib/zlib/make deleted file mode 100644 index 0082ad5846..0000000000 --- a/src/deps/src/nginx-1.30.3/auto/lib/zlib/make +++ /dev/null @@ -1,135 +0,0 @@ - -# Copyright (C) Igor Sysoev -# Copyright (C) Nginx, Inc. - - -case "$NGX_CC_NAME" in - - msvc) - ngx_makefile=makefile.msvc - ngx_opt="CPU_OPT=\"$CPU_OPT\" LIBC=$LIBC" - ngx_zlib="ZLIB=\"$ZLIB\"" - - ;; - - owc) - ngx_makefile=makefile.owc - ngx_opt="CPU_OPT=\"$CPU_OPT\"" - ngx_zlib=`echo ZLIB=\"$ZLIB\" | sed -e "s/\//$ngx_regex_dirsep/g"` - ;; - - bcc) - ngx_makefile=makefile.bcc - ngx_opt="-DCPU_OPT=\"$CPU_OPT\"" - ngx_zlib=`echo \-DZLIB=\"$ZLIB\" | sed -e "s/\//$ngx_regex_dirsep/g"` - ;; - - *) - ngx_makefile= - ;; - -esac - - -done=NO - - -case "$NGX_PLATFORM" in - - win32) - - if [ -n "$ngx_makefile" ]; then - cat << END >> $NGX_MAKEFILE - -`echo "$ZLIB/zlib.lib: $NGX_MAKEFILE" | sed -e "s/\//$ngx_regex_dirsep/g"` - \$(MAKE) -f auto/lib/zlib/$ngx_makefile $ngx_opt $ngx_zlib - -END - - else - - cat << END >> $NGX_MAKEFILE - -$ZLIB/libz.a: $NGX_MAKEFILE - cd $ZLIB \\ - && \$(MAKE) distclean \\ - && \$(MAKE) -f win32/Makefile.gcc \\ - CFLAGS="$ZLIB_OPT" CC="\$(CC)" \\ - libz.a - -END - - fi - - done=YES - ;; - - # FreeBSD: i386 - # Linux: i686 - - *:i386 | *:i686) - case $ZLIB_ASM in - pentium) - - cat << END >> $NGX_MAKEFILE - -$ZLIB/libz.a: $NGX_MAKEFILE - cd $ZLIB \\ - && \$(MAKE) distclean \\ - && cp contrib/asm586/match.S . \\ - && CFLAGS="$ZLIB_OPT -DASMV" CC="\$(CC)" \\ - ./configure \\ - && \$(MAKE) OBJA=match.o libz.a - -END - - done=YES - ;; - - pentiumpro) - - cat << END >> $NGX_MAKEFILE - -$ZLIB/libz.a: $NGX_MAKEFILE - cd $ZLIB \\ - && \$(MAKE) distclean \\ - && cp contrib/asm686/match.S . \\ - && CFLAGS="$ZLIB_OPT -DASMV" CC="\$(CC)" \\ - ./configure \\ - && \$(MAKE) OBJA=match.o libz.a - -END - - done=YES - ;; - - NO) - ;; - - *) - echo "$0: error: invalid --with-zlib-asm=$ZLIB_ASM option." - echo "The valid values are \"pentium\" and \"pentiumpro\" only". - echo - - exit 1; - ;; - esac - ;; - -esac - - -if [ $done = NO ]; then - - cat << END >> $NGX_MAKEFILE - -$ZLIB/libz.a: $NGX_MAKEFILE - cd $ZLIB \\ - && \$(MAKE) distclean \\ - && CFLAGS="$ZLIB_OPT" CC="\$(CC)" \\ - ./configure \\ - && \$(MAKE) libz.a - -END - -fi diff --git a/src/deps/src/nginx-1.30.3/auto/lib/zlib/makefile.bcc b/src/deps/src/nginx-1.30.3/auto/lib/zlib/makefile.bcc deleted file mode 100644 index 97a30ea395..0000000000 --- a/src/deps/src/nginx-1.30.3/auto/lib/zlib/makefile.bcc +++ /dev/null @@ -1,17 +0,0 @@ - -# Copyright (C) Igor Sysoev -# Copyright (C) Nginx, Inc. - - -CFLAGS = -q -O2 -tWM -w-8004 -w-8012 $(CPU_OPT) - -zlib.lib: - cd $(ZLIB) - - bcc32 -c $(CFLAGS) adler32.c crc32.c deflate.c \ - trees.c zutil.c compress.c \ - inflate.c inffast.c inftrees.c - - tlib zlib.lib +adler32.obj +crc32.obj +deflate.obj \ - +trees.obj +zutil.obj +compress.obj \ - +inflate.obj +inffast.obj +inftrees.obj diff --git a/src/deps/src/nginx-1.30.3/auto/lib/zlib/makefile.msvc b/src/deps/src/nginx-1.30.3/auto/lib/zlib/makefile.msvc deleted file mode 100644 index 6fbd6918c2..0000000000 --- a/src/deps/src/nginx-1.30.3/auto/lib/zlib/makefile.msvc +++ /dev/null @@ -1,17 +0,0 @@ - -# Copyright (C) Igor Sysoev -# Copyright (C) Nginx, Inc. - - -CFLAGS = -nologo -O2 -Ob1 -Oi -Gs $(LIBC) $(CPU_OPT) - -zlib.lib: - cd $(ZLIB) - - cl -c $(CFLAGS) adler32.c crc32.c deflate.c \ - trees.c zutil.c compress.c \ - inflate.c inffast.c inftrees.c - - link -lib -out:zlib.lib adler32.obj crc32.obj deflate.obj \ - trees.obj zutil.obj compress.obj \ - inflate.obj inffast.obj inftrees.obj diff --git a/src/deps/src/nginx-1.30.3/auto/lib/zlib/makefile.owc b/src/deps/src/nginx-1.30.3/auto/lib/zlib/makefile.owc deleted file mode 100644 index 9e123be83e..0000000000 --- a/src/deps/src/nginx-1.30.3/auto/lib/zlib/makefile.owc +++ /dev/null @@ -1,14 +0,0 @@ - -# Copyright (C) Igor Sysoev -# Copyright (C) Nginx, Inc. - - -CFLAGS = -zq -bt=nt -ot -op -oi -oe -s -bm $(CPU_OPT) - -zlib.lib: - cd $(ZLIB) - - wcl386 -c $(CFLAGS) adler32.c crc32.c deflate.c trees.c zutil.c & - compress.c inflate.c inffast.c inftrees.c - wlib -n zlib.lib adler32.obj crc32.obj deflate.obj trees.obj & - zutil.obj compress.obj inflate.obj inffast.obj inftrees.obj diff --git a/src/deps/src/nginx-1.30.3/auto/make b/src/deps/src/nginx-1.30.3/auto/make deleted file mode 100644 index 25ee3fb568..0000000000 --- a/src/deps/src/nginx-1.30.3/auto/make +++ /dev/null @@ -1,674 +0,0 @@ - -# Copyright (C) Igor Sysoev -# Copyright (C) Nginx, Inc. - - -echo "creating $NGX_MAKEFILE" - -mkdir -p $NGX_OBJS/src/core $NGX_OBJS/src/event $NGX_OBJS/src/event/modules \ - $NGX_OBJS/src/event/quic \ - $NGX_OBJS/src/os/unix $NGX_OBJS/src/os/win32 \ - $NGX_OBJS/src/http $NGX_OBJS/src/http/v2 $NGX_OBJS/src/http/v3 \ - $NGX_OBJS/src/http/modules $NGX_OBJS/src/http/modules/perl \ - $NGX_OBJS/src/mail \ - $NGX_OBJS/src/stream \ - $NGX_OBJS/src/misc - - -ngx_objs_dir=$NGX_OBJS$ngx_regex_dirsep -ngx_use_pch=`echo $NGX_USE_PCH | sed -e "s/\//$ngx_regex_dirsep/g"` - - -cat << END > $NGX_MAKEFILE - -CC = $CC -CFLAGS = $CFLAGS -CPP = $CPP -LINK = $LINK - -END - - -if test -n "$NGX_PERL_CFLAGS"; then - echo NGX_PERL_CFLAGS = $NGX_PERL_CFLAGS >> $NGX_MAKEFILE - echo NGX_PM_CFLAGS = $NGX_PM_CFLAGS >> $NGX_MAKEFILE - echo NGX_PM_LDFLAGS = $NGX_PM_LDFLAGS >> $NGX_MAKEFILE -fi - - -# ALL_INCS, required by the addons and by OpenWatcom C precompiled headers - -ngx_incs=`echo $CORE_INCS $NGX_OBJS $HTTP_INCS $MAIL_INCS $STREAM_INCS\ - | sed -e "s/ *\([^ ][^ ]*\)/$ngx_regex_cont$ngx_include_opt\1/g" \ - -e "s/\//$ngx_regex_dirsep/g"` - -cat << END >> $NGX_MAKEFILE - -ALL_INCS = $ngx_include_opt$ngx_incs - -END - - -ngx_all_srcs="$CORE_SRCS" - - -# the core dependencies and include paths - -ngx_deps=`echo $CORE_DEPS $NGX_AUTO_CONFIG_H $NGX_PCH \ - | sed -e "s/ *\([^ ][^ ]*\)/$ngx_regex_cont\1/g" \ - -e "s/\//$ngx_regex_dirsep/g"` - -ngx_incs=`echo $CORE_INCS $NGX_OBJS \ - | sed -e "s/ *\([^ ][^ ]*\)/$ngx_regex_cont$ngx_include_opt\1/g" \ - -e "s/\//$ngx_regex_dirsep/g"` - -cat << END >> $NGX_MAKEFILE - -CORE_DEPS = $ngx_deps - - -CORE_INCS = $ngx_include_opt$ngx_incs - -END - - -# the http dependencies and include paths - -if [ $HTTP = YES ]; then - - ngx_all_srcs="$ngx_all_srcs $HTTP_SRCS" - - ngx_deps=`echo $HTTP_DEPS \ - | sed -e "s/ *\([^ ][^ ]*\)/$ngx_regex_cont\1/g" \ - -e "s/\//$ngx_regex_dirsep/g"` - - ngx_incs=`echo $HTTP_INCS \ - | sed -e "s/ *\([^ ][^ ]*\)/$ngx_regex_cont$ngx_include_opt\1/g" \ - -e "s/\//$ngx_regex_dirsep/g"` - - cat << END >> $NGX_MAKEFILE - -HTTP_DEPS = $ngx_deps - - -HTTP_INCS = $ngx_include_opt$ngx_incs - -END - -fi - - -# the mail dependencies and include paths - -if [ $MAIL != NO ]; then - - if [ $MAIL = YES ]; then - ngx_all_srcs="$ngx_all_srcs $MAIL_SRCS" - fi - - ngx_deps=`echo $MAIL_DEPS \ - | sed -e "s/ *\([^ ][^ ]*\)/$ngx_regex_cont\1/g" \ - -e "s/\//$ngx_regex_dirsep/g"` - - ngx_incs=`echo $MAIL_INCS \ - | sed -e "s/ *\([^ ][^ ]*\)/$ngx_regex_cont$ngx_include_opt\1/g" \ - -e "s/\//$ngx_regex_dirsep/g"` - - cat << END >> $NGX_MAKEFILE - -MAIL_DEPS = $ngx_deps - - -MAIL_INCS = $ngx_include_opt$ngx_incs - -END - -fi - - -# the stream dependencies and include paths - -if [ $STREAM != NO ]; then - - if [ $STREAM = YES ]; then - ngx_all_srcs="$ngx_all_srcs $STREAM_SRCS" - fi - - ngx_deps=`echo $STREAM_DEPS \ - | sed -e "s/ *\([^ ][^ ]*\)/$ngx_regex_cont\1/g" \ - -e "s/\//$ngx_regex_dirsep/g"` - - ngx_incs=`echo $STREAM_INCS \ - | sed -e "s/ *\([^ ][^ ]*\)/$ngx_regex_cont$ngx_include_opt\1/g" \ - -e "s/\//$ngx_regex_dirsep/g"` - - cat << END >> $NGX_MAKEFILE - -STREAM_DEPS = $ngx_deps - - -STREAM_INCS = $ngx_include_opt$ngx_incs - -END - -fi - - -ngx_all_srcs="$ngx_all_srcs $MISC_SRCS" - - -if test -n "$NGX_ADDON_SRCS$DYNAMIC_MODULES"; then - -cat << END >> $NGX_MAKEFILE - -ADDON_DEPS = \$(CORE_DEPS) $NGX_ADDON_DEPS - -END - -fi - - -# nginx - -ngx_all_srcs=`echo $ngx_all_srcs | sed -e "s/\//$ngx_regex_dirsep/g"` - -for ngx_src in $NGX_ADDON_SRCS -do - ngx_obj="addon/`basename \`dirname $ngx_src\``" - - test -d $NGX_OBJS/$ngx_obj || mkdir -p $NGX_OBJS/$ngx_obj - - ngx_obj=`echo $ngx_obj/\`basename $ngx_src\` \ - | sed -e "s/\//$ngx_regex_dirsep/g"` - - ngx_all_srcs="$ngx_all_srcs $ngx_obj" -done - -ngx_all_objs=`echo $ngx_all_srcs \ - | sed -e "s#\([^ ]*\.\)cpp#$NGX_OBJS\/\1$ngx_objext#g" \ - -e "s#\([^ ]*\.\)cc#$NGX_OBJS\/\1$ngx_objext#g" \ - -e "s#\([^ ]*\.\)c#$NGX_OBJS\/\1$ngx_objext#g" \ - -e "s#\([^ ]*\.\)S#$NGX_OBJS\/\1$ngx_objext#g"` - -ngx_modules_c=`echo $NGX_MODULES_C | sed -e "s/\//$ngx_regex_dirsep/g"` - -ngx_modules_obj=`echo $ngx_modules_c | sed -e "s/\(.*\.\)c/\1$ngx_objext/"` - - -if test -n "$NGX_RES"; then - ngx_res=$NGX_RES -else - ngx_res="$NGX_RC $NGX_ICONS" - ngx_rcc=`echo $NGX_RCC | sed -e "s/\//$ngx_regex_dirsep/g"` -fi - -ngx_deps=`echo $ngx_all_objs $ngx_modules_obj $ngx_res $LINK_DEPS \ - | sed -e "s/ *\([^ ][^ ]*\)/$ngx_regex_cont\1/g" \ - -e "s/\//$ngx_regex_dirsep/g"` - -ngx_objs=`echo $ngx_all_objs $ngx_modules_obj \ - | sed -e "s/ *\([^ ][^ ]*\)/$ngx_long_regex_cont\1/g" \ - -e "s/\//$ngx_regex_dirsep/g"` - -ngx_libs= -if test -n "$NGX_LD_OPT$CORE_LIBS"; then - ngx_libs=`echo $NGX_LD_OPT $CORE_LIBS \ - | sed -e "s/\//$ngx_regex_dirsep/g" -e "s/^/$ngx_long_regex_cont/"` -fi - -ngx_link=${CORE_LINK:+`echo $CORE_LINK \ - | sed -e "s/\//$ngx_regex_dirsep/g" -e "s/^/$ngx_long_regex_cont/"`} - -ngx_main_link=${MAIN_LINK:+`echo $MAIN_LINK \ - | sed -e "s/\//$ngx_regex_dirsep/g" -e "s/^/$ngx_long_regex_cont/"`} - - -cat << END >> $NGX_MAKEFILE - -build: binary modules manpage - -binary: $NGX_OBJS${ngx_dirsep}nginx$ngx_binext - -$NGX_OBJS${ngx_dirsep}nginx$ngx_binext: $ngx_deps$ngx_spacer - \$(LINK) $ngx_long_start$ngx_binout$NGX_OBJS${ngx_dirsep}nginx$ngx_binext$ngx_long_cont$ngx_objs$ngx_libs$ngx_link$ngx_main_link - $ngx_rcc -$ngx_long_end - -modules: -END - - -# ngx_modules.c - -if test -n "$NGX_PCH"; then - ngx_cc="\$(CC) $ngx_compile_opt \$(CFLAGS) $ngx_use_pch \$(ALL_INCS)" -else - ngx_cc="\$(CC) $ngx_compile_opt \$(CFLAGS) \$(CORE_INCS)" -fi - -cat << END >> $NGX_MAKEFILE - -$ngx_modules_obj: \$(CORE_DEPS)$ngx_cont$ngx_modules_c - $ngx_cc$ngx_tab$ngx_objout$ngx_modules_obj$ngx_tab$ngx_modules_c$NGX_AUX - -END - - -# the core sources - -for ngx_src in $CORE_SRCS -do - ngx_src=`echo $ngx_src | sed -e "s/\//$ngx_regex_dirsep/g"` - ngx_obj=`echo $ngx_src \ - | sed -e "s#^\(.*\.\)cpp\\$#$ngx_objs_dir\1$ngx_objext#g" \ - -e "s#^\(.*\.\)cc\\$#$ngx_objs_dir\1$ngx_objext#g" \ - -e "s#^\(.*\.\)c\\$#$ngx_objs_dir\1$ngx_objext#g" \ - -e "s#^\(.*\.\)S\\$#$ngx_objs_dir\1$ngx_objext#g"` - - cat << END >> $NGX_MAKEFILE - -$ngx_obj: \$(CORE_DEPS)$ngx_cont$ngx_src - $ngx_cc$ngx_tab$ngx_objout$ngx_obj$ngx_tab$ngx_src$NGX_AUX - -END - -done - - -# the http sources - -if [ $HTTP = YES ]; then - - if test -n "$NGX_PCH"; then - ngx_cc="\$(CC) $ngx_compile_opt \$(CFLAGS) $ngx_use_pch \$(ALL_INCS)" - else - ngx_cc="\$(CC) $ngx_compile_opt \$(CFLAGS) \$(CORE_INCS) \$(HTTP_INCS)" - ngx_perl_cc="\$(CC) $ngx_compile_opt \$(NGX_PERL_CFLAGS)" - ngx_perl_cc="$ngx_perl_cc \$(CORE_INCS) \$(HTTP_INCS)" - fi - - for ngx_source in $HTTP_SRCS - do - ngx_src=`echo $ngx_source | sed -e "s/\//$ngx_regex_dirsep/g"` - ngx_obj=`echo $ngx_src \ - | sed -e "s#^\(.*\.\)cpp\\$#$ngx_objs_dir\1$ngx_objext#g" \ - -e "s#^\(.*\.\)cc\\$#$ngx_objs_dir\1$ngx_objext#g" \ - -e "s#^\(.*\.\)c\\$#$ngx_objs_dir\1$ngx_objext#g" \ - -e "s#^\(.*\.\)S\\$#$ngx_objs_dir\1$ngx_objext#g"` - - if [ $ngx_source = src/http/modules/perl/ngx_http_perl_module.c ]; then - - cat << END >> $NGX_MAKEFILE - -$ngx_obj: \$(CORE_DEPS) \$(HTTP_DEPS)$ngx_cont$ngx_src - $ngx_perl_cc$ngx_tab$ngx_objout$ngx_obj$ngx_tab$ngx_src$NGX_AUX - -END - else - - cat << END >> $NGX_MAKEFILE - -$ngx_obj: \$(CORE_DEPS) \$(HTTP_DEPS)$ngx_cont$ngx_src - $ngx_cc$ngx_tab$ngx_objout$ngx_obj$ngx_tab$ngx_src$NGX_AUX - -END - - fi - done - -fi - - -# the mail sources - -if [ $MAIL = YES ]; then - - if test -n "$NGX_PCH"; then - ngx_cc="\$(CC) $ngx_compile_opt \$(CFLAGS) $ngx_use_pch \$(ALL_INCS)" - else - ngx_cc="\$(CC) $ngx_compile_opt \$(CFLAGS) \$(CORE_INCS) \$(MAIL_INCS)" - fi - - for ngx_src in $MAIL_SRCS - do - ngx_src=`echo $ngx_src | sed -e "s/\//$ngx_regex_dirsep/g"` - ngx_obj=`echo $ngx_src \ - | sed -e "s#^\(.*\.\)cpp\\$#$ngx_objs_dir\1$ngx_objext#g" \ - -e "s#^\(.*\.\)cc\\$#$ngx_objs_dir\1$ngx_objext#g" \ - -e "s#^\(.*\.\)c\\$#$ngx_objs_dir\1$ngx_objext#g" \ - -e "s#^\(.*\.\)S\\$#$ngx_objs_dir\1$ngx_objext#g"` - - cat << END >> $NGX_MAKEFILE - -$ngx_obj: \$(CORE_DEPS) \$(MAIL_DEPS)$ngx_cont$ngx_src - $ngx_cc$ngx_tab$ngx_objout$ngx_obj$ngx_tab$ngx_src$NGX_AUX - -END - done - -fi - - -# the stream sources - -if [ $STREAM = YES ]; then - - if test -n "$NGX_PCH"; then - ngx_cc="\$(CC) $ngx_compile_opt \$(CFLAGS) $ngx_use_pch \$(ALL_INCS)" - else - ngx_cc="\$(CC) $ngx_compile_opt \$(CFLAGS) \$(CORE_INCS) \$(STREAM_INCS)" - fi - - for ngx_src in $STREAM_SRCS - do - ngx_src=`echo $ngx_src | sed -e "s/\//$ngx_regex_dirsep/g"` - ngx_obj=`echo $ngx_src \ - | sed -e "s#^\(.*\.\)cpp\\$#$ngx_objs_dir\1$ngx_objext#g" \ - -e "s#^\(.*\.\)cc\\$#$ngx_objs_dir\1$ngx_objext#g" \ - -e "s#^\(.*\.\)c\\$#$ngx_objs_dir\1$ngx_objext#g" \ - -e "s#^\(.*\.\)S\\$#$ngx_objs_dir\1$ngx_objext#g"` - - cat << END >> $NGX_MAKEFILE - -$ngx_obj: \$(CORE_DEPS) \$(STREAM_DEPS)$ngx_cont$ngx_src - $ngx_cc$ngx_tab$ngx_objout$ngx_obj$ngx_tab$ngx_src$NGX_AUX - -END - done - -fi - - -# the misc sources - -if test -n "$MISC_SRCS"; then - - ngx_cc="\$(CC) $ngx_compile_opt \$(CFLAGS) $ngx_use_pch \$(ALL_INCS)" - - for ngx_src in $MISC_SRCS - do - ngx_src=`echo $ngx_src | sed -e "s/\//$ngx_regex_dirsep/g"` - ngx_obj=`echo $ngx_src \ - | sed -e "s#^\(.*\.\)cpp\\$#$ngx_objs_dir\1$ngx_objext#g" \ - -e "s#^\(.*\.\)cc\\$#$ngx_objs_dir\1$ngx_objext#g" \ - -e "s#^\(.*\.\)c\\$#$ngx_objs_dir\1$ngx_objext#g" \ - -e "s#^\(.*\.\)S\\$#$ngx_objs_dir\1$ngx_objext#g"` - - cat << END >> $NGX_MAKEFILE - -$ngx_obj: \$(CORE_DEPS) $ngx_cont$ngx_src - $ngx_cc$ngx_tab$ngx_objout$ngx_obj$ngx_tab$ngx_src$NGX_AUX - -END - done - -fi - - -# the addons sources - -if test -n "$NGX_ADDON_SRCS"; then - - ngx_cc="\$(CC) $ngx_compile_opt \$(CFLAGS) $ngx_use_pch \$(ALL_INCS)" - - for ngx_src in $NGX_ADDON_SRCS - do - ngx_obj="addon/`basename \`dirname $ngx_src\``" - - ngx_obj=`echo $ngx_obj/\`basename $ngx_src\` \ - | sed -e "s/\//$ngx_regex_dirsep/g"` - - ngx_obj=`echo $ngx_obj \ - | sed -e "s#^\(.*\.\)cpp\\$#$ngx_objs_dir\1$ngx_objext#g" \ - -e "s#^\(.*\.\)cc\\$#$ngx_objs_dir\1$ngx_objext#g" \ - -e "s#^\(.*\.\)c\\$#$ngx_objs_dir\1$ngx_objext#g" \ - -e "s#^\(.*\.\)S\\$#$ngx_objs_dir\1$ngx_objext#g"` - - ngx_src=`echo $ngx_src | sed -e "s/\//$ngx_regex_dirsep/g"` - - cat << END >> $NGX_MAKEFILE - -$ngx_obj: \$(ADDON_DEPS)$ngx_cont$ngx_src - $ngx_cc$ngx_tab$ngx_objout$ngx_obj$ngx_tab$ngx_src$NGX_AUX - -END - done - -fi - - -# the addons config.make - -if test -n "$NGX_ADDONS$DYNAMIC_ADDONS"; then - - for ngx_addon_dir in $NGX_ADDONS $DYNAMIC_ADDONS - do - if test -f $ngx_addon_dir/config.make; then - . $ngx_addon_dir/config.make - fi - done -fi - - -# Win32 resource file - -if test -n "$NGX_RES"; then - - ngx_res=`echo "$NGX_RES: $NGX_RC $NGX_ICONS" \ - | sed -e "s/\//$ngx_regex_dirsep/g"` - ngx_rcc=`echo $NGX_RCC | sed -e "s/\//$ngx_regex_dirsep/g"` - - cat << END >> $NGX_MAKEFILE - -$ngx_res - $ngx_rcc - -END - -fi - - -# the precompiled headers - -if test -n "$NGX_PCH"; then - echo "#include " > $NGX_OBJS/ngx_pch.c - - ngx_pch="src/core/ngx_config.h $OS_CONFIG $NGX_OBJS/ngx_auto_config.h" - ngx_pch=`echo "$NGX_PCH: $ngx_pch" | sed -e "s/\//$ngx_regex_dirsep/g"` - - ngx_src="\$(CC) \$(CFLAGS) $NGX_BUILD_PCH $ngx_compile_opt \$(ALL_INCS)" - ngx_src="$ngx_src $ngx_objout$NGX_OBJS/ngx_pch.obj $NGX_OBJS/ngx_pch.c" - ngx_src=`echo $ngx_src | sed -e "s/\//$ngx_regex_dirsep/g"` - - cat << END >> $NGX_MAKEFILE - -$ngx_pch - $ngx_src - -END - -fi - - -# dynamic modules - -if test -n "$NGX_PCH"; then - ngx_cc="\$(CC) $ngx_compile_opt $ngx_pic_opt \$(CFLAGS) $ngx_use_pch \$(ALL_INCS)" -else - ngx_cc="\$(CC) $ngx_compile_opt $ngx_pic_opt \$(CFLAGS) \$(ALL_INCS)" - ngx_perl_cc="\$(CC) $ngx_compile_opt $ngx_pic_opt \$(NGX_PERL_CFLAGS)" - ngx_perl_cc="$ngx_perl_cc \$(ALL_INCS)" -fi - -for ngx_module in $DYNAMIC_MODULES -do - eval ngx_module_srcs="\$${ngx_module}_SRCS" - eval ngx_module_shrd="\$${ngx_module}_SHRD" - eval eval ngx_module_libs="\\\"\$${ngx_module}_LIBS\\\"" - - eval ngx_module_modules="\$${ngx_module}_MODULES" - eval ngx_module_order="\$${ngx_module}_ORDER" - - ngx_modules_c=$NGX_OBJS/${ngx_module}_modules.c - - cat << END > $ngx_modules_c - -#include -#include - -END - - for mod in $ngx_module_modules - do - echo "extern ngx_module_t $mod;" >> $ngx_modules_c - done - - echo >> $ngx_modules_c - echo 'ngx_module_t *ngx_modules[] = {' >> $ngx_modules_c - - for mod in $ngx_module_modules - do - echo " &$mod," >> $ngx_modules_c - done - - cat << END >> $ngx_modules_c - NULL -}; - -END - - echo 'char *ngx_module_names[] = {' >> $ngx_modules_c - - for mod in $ngx_module_modules - do - echo " \"$mod\"," >> $ngx_modules_c - done - - cat << END >> $ngx_modules_c - NULL -}; - -END - - echo 'char *ngx_module_order[] = {' >> $ngx_modules_c - - for mod in $ngx_module_order - do - echo " \"$mod\"," >> $ngx_modules_c - done - - cat << END >> $ngx_modules_c - NULL -}; - -END - - ngx_modules_c=`echo $ngx_modules_c | sed -e "s/\//$ngx_regex_dirsep/g"` - - ngx_modules_obj=`echo $ngx_modules_c \ - | sed -e "s/\(.*\.\)c/\1$ngx_objext/"` - - ngx_module_objs= - for ngx_src in $ngx_module_srcs $ngx_module_shrd - do - case "$ngx_src" in - src/*) - ngx_obj=$ngx_src - ;; - *) - ngx_obj="addon/`basename \`dirname $ngx_src\``" - mkdir -p $NGX_OBJS/$ngx_obj - ngx_obj="$ngx_obj/`basename $ngx_src`" - ;; - esac - - ngx_module_objs="$ngx_module_objs $ngx_obj" - done - - ngx_module_objs=`echo $ngx_module_objs \ - | sed -e "s#\([^ ]*\.\)cpp#$NGX_OBJS\/\1$ngx_objext#g" \ - -e "s#\([^ ]*\.\)cc#$NGX_OBJS\/\1$ngx_objext#g" \ - -e "s#\([^ ]*\.\)c#$NGX_OBJS\/\1$ngx_objext#g" \ - -e "s#\([^ ]*\.\)S#$NGX_OBJS\/\1$ngx_objext#g"` - - ngx_deps=`echo $ngx_module_objs $ngx_modules_obj $LINK_DEPS \ - | sed -e "s/ *\([^ ][^ ]*\)/$ngx_regex_cont\1/g" \ - -e "s/\//$ngx_regex_dirsep/g"` - - ngx_objs=`echo $ngx_module_objs $ngx_modules_obj \ - | sed -e "s/ *\([^ ][^ ]*\)/$ngx_long_regex_cont\1/g" \ - -e "s/\//$ngx_regex_dirsep/g"` - - ngx_obj=$NGX_OBJS$ngx_dirsep$ngx_module$ngx_modext - - if [ "$NGX_PLATFORM" = win32 ]; then - ngx_module_libs="$CORE_LIBS $ngx_module_libs" - fi - - ngx_libs= - if test -n "$NGX_LD_OPT$ngx_module_libs"; then - ngx_libs=`echo $NGX_LD_OPT $ngx_module_libs \ - | sed -e "s/\//$ngx_regex_dirsep/g" -e "s/^/$ngx_long_regex_cont/"` - fi - - ngx_link=${CORE_LINK:+`echo $CORE_LINK \ - | sed -e "s/\//$ngx_regex_dirsep/g" -e "s/^/$ngx_long_regex_cont/"`} - - ngx_module_link=${MODULE_LINK:+`echo $MODULE_LINK \ - | sed -e "s/\//$ngx_regex_dirsep/g" -e "s/^/$ngx_long_regex_cont/"`} - - - cat << END >> $NGX_MAKEFILE - -modules: $ngx_obj - -$ngx_obj: $ngx_deps$ngx_spacer - \$(LINK) $ngx_long_start$ngx_binout$ngx_obj$ngx_long_cont$ngx_objs$ngx_libs$ngx_link$ngx_module_link -$ngx_long_end - -$ngx_modules_obj: \$(CORE_DEPS)$ngx_cont$ngx_modules_c - $ngx_cc$ngx_tab$ngx_objout$ngx_modules_obj$ngx_tab$ngx_modules_c$NGX_AUX - -END - - for ngx_source in $ngx_module_srcs - do - case "$ngx_source" in - src/*) - ngx_obj=`echo $ngx_source | sed -e "s/\//$ngx_regex_dirsep/g"` - ;; - *) - ngx_obj="addon/`basename \`dirname $ngx_source\``" - ngx_obj=`echo $ngx_obj/\`basename $ngx_source\` \ - | sed -e "s/\//$ngx_regex_dirsep/g"` - ;; - esac - - ngx_obj=`echo $ngx_obj \ - | sed -e "s#^\(.*\.\)cpp\\$#$ngx_objs_dir\1$ngx_objext#g" \ - -e "s#^\(.*\.\)cc\\$#$ngx_objs_dir\1$ngx_objext#g" \ - -e "s#^\(.*\.\)c\\$#$ngx_objs_dir\1$ngx_objext#g" \ - -e "s#^\(.*\.\)S\\$#$ngx_objs_dir\1$ngx_objext#g"` - - ngx_src=`echo $ngx_source | sed -e "s/\//$ngx_regex_dirsep/g"` - - if [ $ngx_source = src/http/modules/perl/ngx_http_perl_module.c ]; then - - cat << END >> $NGX_MAKEFILE - -$ngx_obj: \$(ADDON_DEPS)$ngx_cont$ngx_src - $ngx_perl_cc$ngx_tab$ngx_objout$ngx_obj$ngx_tab$ngx_src$NGX_AUX - -END - else - - cat << END >> $NGX_MAKEFILE - -$ngx_obj: \$(ADDON_DEPS)$ngx_cont$ngx_src - $ngx_cc$ngx_tab$ngx_objout$ngx_obj$ngx_tab$ngx_src$NGX_AUX - -END - - fi - done -done diff --git a/src/deps/src/nginx-1.30.3/auto/module b/src/deps/src/nginx-1.30.3/auto/module deleted file mode 100644 index 3857d04ca9..0000000000 --- a/src/deps/src/nginx-1.30.3/auto/module +++ /dev/null @@ -1,178 +0,0 @@ - -# Copyright (C) Ruslan Ermilov -# Copyright (C) Nginx, Inc. - - -case $ngx_module_type in - HTTP_*) ngx_var=HTTP ;; - *) ngx_var=$ngx_module_type ;; -esac - - -if [ "$ngx_module_link" = DYNAMIC ]; then - - for ngx_module in $ngx_module_name; do - # extract the first name - break - done - - DYNAMIC_MODULES="$DYNAMIC_MODULES $ngx_module" - - eval ${ngx_module}_MODULES=\"$ngx_module_name\" - - if [ -z "$ngx_module_order" -a \ - \( "$ngx_module_type" = "HTTP_FILTER" \ - -o "$ngx_module_type" = "HTTP_AUX_FILTER" \) ] - then - eval ${ngx_module}_ORDER=\"$ngx_module_name \ - ngx_http_copy_filter_module\" - else - eval ${ngx_module}_ORDER=\"$ngx_module_order\" - fi - - srcs= - shrd= - for src in $ngx_module_srcs - do - found=no - for old in $DYNAMIC_MODULES_SRCS - do - if [ $src = $old ]; then - found=yes - break - fi - done - - if [ $found = no ]; then - srcs="$srcs $src" - else - shrd="$shrd $src" - fi - done - eval ${ngx_module}_SRCS=\"$srcs\" - eval ${ngx_module}_SHRD=\"$shrd\" - - DYNAMIC_MODULES_SRCS="$DYNAMIC_MODULES_SRCS $srcs" - - if test -n "$ngx_module_incs"; then - CORE_INCS="$CORE_INCS $ngx_module_incs" - fi - - if test -n "$ngx_module_deps"; then - NGX_ADDON_DEPS="$NGX_ADDON_DEPS $ngx_module_deps" - fi - - libs= - for lib in $ngx_module_libs - do - case $lib in - - LIBXSLT | LIBGD | GEOIP | PERL) - libs="$libs \$NGX_LIB_$lib" - - if eval [ "\$USE_${lib}" = NO ] ; then - eval USE_${lib}=DYNAMIC - fi - ;; - - PCRE | OPENSSL | ZLIB) - eval USE_${lib}=YES - ;; - - MD5 | SHA1) - # obsolete - ;; - - *) - libs="$libs $lib" - ;; - - esac - done - eval ${ngx_module}_LIBS=\'$libs\' - -elif [ "$ngx_module_link" = YES ]; then - - eval ${ngx_module_type}_MODULES=\"\$${ngx_module_type}_MODULES \ - $ngx_module_name\" - - eval ${ngx_var}_SRCS=\"\$${ngx_var}_SRCS $ngx_module_srcs\" - - if test -n "$ngx_module_incs"; then - eval ${ngx_var}_INCS=\"\$${ngx_var}_INCS $ngx_module_incs\" - fi - - if test -n "$ngx_module_deps"; then - eval ${ngx_var}_DEPS=\"\$${ngx_var}_DEPS $ngx_module_deps\" - fi - - for lib in $ngx_module_libs - do - case $lib in - - PCRE | OPENSSL | ZLIB | LIBXSLT | LIBGD | PERL | GEOIP) - eval USE_${lib}=YES - ;; - - MD5 | SHA1) - # obsolete - ;; - - *) - CORE_LIBS="$CORE_LIBS $lib" - ;; - - esac - done - -elif [ "$ngx_module_link" = ADDON ]; then - - eval ${ngx_module_type}_MODULES=\"\$${ngx_module_type}_MODULES \ - $ngx_module_name\" - - srcs= - for src in $ngx_module_srcs - do - found=no - for old in $NGX_ADDON_SRCS - do - if [ $src = $old ]; then - found=yes - break - fi - done - - if [ $found = no ]; then - srcs="$srcs $src" - fi - done - - NGX_ADDON_SRCS="$NGX_ADDON_SRCS $srcs" - - if test -n "$ngx_module_incs"; then - eval ${ngx_var}_INCS=\"\$${ngx_var}_INCS $ngx_module_incs\" - fi - - if test -n "$ngx_module_deps"; then - NGX_ADDON_DEPS="$NGX_ADDON_DEPS $ngx_module_deps" - fi - - for lib in $ngx_module_libs - do - case $lib in - - PCRE | OPENSSL | ZLIB | LIBXSLT | LIBGD | PERL | GEOIP) - eval USE_${lib}=YES - ;; - - MD5 | SHA1) - # obsolete - ;; - - *) - CORE_LIBS="$CORE_LIBS $lib" - ;; - - esac - done -fi diff --git a/src/deps/src/nginx-1.30.3/auto/modules b/src/deps/src/nginx-1.30.3/auto/modules deleted file mode 100644 index f02691e168..0000000000 --- a/src/deps/src/nginx-1.30.3/auto/modules +++ /dev/null @@ -1,1556 +0,0 @@ - -# Copyright (C) Igor Sysoev -# Copyright (C) Nginx, Inc. - - -if [ $EVENT_SELECT = NO -a $EVENT_FOUND = NO ]; then - EVENT_SELECT=YES -fi - -if [ $EVENT_SELECT = YES ]; then - have=NGX_HAVE_SELECT . auto/have - CORE_SRCS="$CORE_SRCS $SELECT_SRCS" - EVENT_MODULES="$EVENT_MODULES $SELECT_MODULE" -fi - - -if [ $EVENT_POLL = NO -a $EVENT_FOUND = NO ]; then - EVENT_POLL=YES -fi - -if [ $EVENT_POLL = YES ]; then - have=NGX_HAVE_POLL . auto/have - CORE_SRCS="$CORE_SRCS $POLL_SRCS" - EVENT_MODULES="$EVENT_MODULES $POLL_MODULE" -fi - - -if [ $NGX_TEST_BUILD_DEVPOLL = YES ]; then - have=NGX_HAVE_DEVPOLL . auto/have - have=NGX_TEST_BUILD_DEVPOLL . auto/have - EVENT_MODULES="$EVENT_MODULES $DEVPOLL_MODULE" - CORE_SRCS="$CORE_SRCS $DEVPOLL_SRCS" -fi - - -if [ $NGX_TEST_BUILD_EVENTPORT = YES ]; then - have=NGX_HAVE_EVENTPORT . auto/have - have=NGX_TEST_BUILD_EVENTPORT . auto/have - EVENT_MODULES="$EVENT_MODULES $EVENTPORT_MODULE" - CORE_SRCS="$CORE_SRCS $EVENTPORT_SRCS" -fi - -if [ $NGX_TEST_BUILD_EPOLL = YES ]; then - have=NGX_HAVE_EPOLL . auto/have - have=NGX_HAVE_EPOLLRDHUP . auto/have - have=NGX_HAVE_EPOLLEXCLUSIVE . auto/have - have=NGX_HAVE_EVENTFD . auto/have - have=NGX_TEST_BUILD_EPOLL . auto/have - EVENT_MODULES="$EVENT_MODULES $EPOLL_MODULE" - CORE_SRCS="$CORE_SRCS $EPOLL_SRCS" -fi - -if [ $NGX_TEST_BUILD_SOLARIS_SENDFILEV = YES ]; then - have=NGX_TEST_BUILD_SOLARIS_SENDFILEV . auto/have - CORE_SRCS="$CORE_SRCS $SOLARIS_SENDFILEV_SRCS" -fi - - -if [ $HTTP = YES ]; then - HTTP_MODULES= - HTTP_DEPS= - HTTP_INCS= - - ngx_module_type=HTTP - - if :; then - ngx_module_name="ngx_http_module \ - ngx_http_core_module \ - ngx_http_log_module \ - ngx_http_upstream_module" - ngx_module_incs="src/http src/http/modules" - ngx_module_deps="src/http/ngx_http.h \ - src/http/ngx_http_request.h \ - src/http/ngx_http_config.h \ - src/http/ngx_http_core_module.h \ - src/http/ngx_http_cache.h \ - src/http/ngx_http_variables.h \ - src/http/ngx_http_script.h \ - src/http/ngx_http_upstream.h \ - src/http/ngx_http_upstream_round_robin.h" - ngx_module_srcs="src/http/ngx_http.c \ - src/http/ngx_http_core_module.c \ - src/http/ngx_http_special_response.c \ - src/http/ngx_http_request.c \ - src/http/ngx_http_parse.c \ - src/http/modules/ngx_http_log_module.c \ - src/http/ngx_http_request_body.c \ - src/http/ngx_http_variables.c \ - src/http/ngx_http_script.c \ - src/http/ngx_http_upstream.c \ - src/http/ngx_http_upstream_round_robin.c" - ngx_module_libs= - ngx_module_link=YES - - . auto/module - fi - - - if [ $HTTP_CACHE = YES ]; then - have=NGX_HTTP_CACHE . auto/have - HTTP_SRCS="$HTTP_SRCS $HTTP_FILE_CACHE_SRCS" - fi - - - if [ $HTTP_V2 = YES -o $HTTP_V3 = YES ]; then - HTTP_SRCS="$HTTP_SRCS $HTTP_HUFF_SRCS" - fi - - - # the module order is important - # ngx_http_static_module - # ngx_http_gzip_static_module - # ngx_http_dav_module - # ngx_http_autoindex_module - # ngx_http_index_module - # ngx_http_random_index_module - # - # ngx_http_access_module - # ngx_http_realip_module - # - # - # the filter order is important - # ngx_http_write_filter - # ngx_http_header_filter - # ngx_http_chunked_filter - # ngx_http_v2_filter - # ngx_http_v3_filter - # ngx_http_range_header_filter - # ngx_http_gzip_filter - # ngx_http_postpone_filter - # ngx_http_ssi_filter - # ngx_http_charset_filter - # ngx_http_xslt_filter - # ngx_http_image_filter - # ngx_http_sub_filter - # ngx_http_addition_filter - # ngx_http_gunzip_filter - # ngx_http_userid_filter - # ngx_http_headers_filter - # ngx_http_copy_filter - # ngx_http_range_body_filter - # ngx_http_not_modified_filter - # ngx_http_slice_filter - - ngx_module_type=HTTP_FILTER - HTTP_FILTER_MODULES= - - ngx_module_order="ngx_http_static_module \ - ngx_http_gzip_static_module \ - ngx_http_dav_module \ - ngx_http_autoindex_module \ - ngx_http_index_module \ - ngx_http_random_index_module \ - ngx_http_access_module \ - ngx_http_realip_module \ - ngx_http_write_filter_module \ - ngx_http_header_filter_module \ - ngx_http_chunked_filter_module \ - ngx_http_v2_filter_module \ - ngx_http_v3_filter_module \ - ngx_http_range_header_filter_module \ - ngx_http_gzip_filter_module \ - ngx_http_postpone_filter_module \ - ngx_http_ssi_filter_module \ - ngx_http_charset_filter_module \ - ngx_http_xslt_filter_module \ - ngx_http_image_filter_module \ - ngx_http_sub_filter_module \ - ngx_http_addition_filter_module \ - ngx_http_gunzip_filter_module \ - ngx_http_userid_filter_module \ - ngx_http_headers_filter_module \ - ngx_http_copy_filter_module \ - ngx_http_range_body_filter_module \ - ngx_http_not_modified_filter_module \ - ngx_http_slice_filter_module" - - if :; then - ngx_module_name=ngx_http_write_filter_module - ngx_module_incs= - ngx_module_deps= - ngx_module_srcs=src/http/ngx_http_write_filter_module.c - ngx_module_libs= - ngx_module_link=YES - - . auto/module - fi - - if :; then - ngx_module_name=ngx_http_header_filter_module - ngx_module_incs= - ngx_module_deps= - ngx_module_srcs=src/http/ngx_http_header_filter_module.c - ngx_module_libs= - ngx_module_link=YES - - . auto/module - fi - - if :; then - ngx_module_name=ngx_http_chunked_filter_module - ngx_module_incs= - ngx_module_deps= - ngx_module_srcs=src/http/modules/ngx_http_chunked_filter_module.c - ngx_module_libs= - ngx_module_link=YES - - . auto/module - fi - - if [ $HTTP_V2 = YES ]; then - ngx_module_name=ngx_http_v2_filter_module - ngx_module_incs= - ngx_module_deps= - ngx_module_srcs=src/http/v2/ngx_http_v2_filter_module.c - ngx_module_libs= - ngx_module_link=$HTTP_V2 - - . auto/module - fi - - if [ $HTTP_V3 = YES ]; then - ngx_module_name=ngx_http_v3_filter_module - ngx_module_incs= - ngx_module_deps= - ngx_module_srcs=src/http/v3/ngx_http_v3_filter_module.c - ngx_module_libs= - ngx_module_link=$HTTP_V3 - - . auto/module - fi - - if :; then - ngx_module_name=ngx_http_range_header_filter_module - ngx_module_incs= - ngx_module_deps= - ngx_module_srcs=src/http/modules/ngx_http_range_filter_module.c - ngx_module_libs= - ngx_module_link=YES - - . auto/module - fi - - if [ $HTTP_GZIP = YES ]; then - have=NGX_HTTP_GZIP . auto/have - USE_ZLIB=YES - - ngx_module_name=ngx_http_gzip_filter_module - ngx_module_incs= - ngx_module_deps= - ngx_module_srcs=src/http/modules/ngx_http_gzip_filter_module.c - ngx_module_libs= - ngx_module_link=$HTTP_GZIP - - . auto/module - fi - - if :; then - ngx_module_name=ngx_http_postpone_filter_module - ngx_module_incs= - ngx_module_deps= - ngx_module_srcs=src/http/ngx_http_postpone_filter_module.c - ngx_module_libs= - ngx_module_link=YES - - . auto/module - fi - - if [ $HTTP_SSI = YES ]; then - have=NGX_HTTP_SSI . auto/have - - ngx_module_name=ngx_http_ssi_filter_module - ngx_module_incs= - ngx_module_deps=src/http/modules/ngx_http_ssi_filter_module.h - ngx_module_srcs=src/http/modules/ngx_http_ssi_filter_module.c - ngx_module_libs= - ngx_module_link=$HTTP_SSI - - . auto/module - fi - - if [ $HTTP_CHARSET = YES ]; then - ngx_module_name=ngx_http_charset_filter_module - ngx_module_incs= - ngx_module_deps= - ngx_module_srcs=src/http/modules/ngx_http_charset_filter_module.c - ngx_module_libs= - ngx_module_link=$HTTP_CHARSET - - . auto/module - fi - - if [ $HTTP_XSLT != NO ]; then - ngx_module_name=ngx_http_xslt_filter_module - ngx_module_incs= - ngx_module_deps= - ngx_module_srcs=src/http/modules/ngx_http_xslt_filter_module.c - ngx_module_libs=LIBXSLT - ngx_module_link=$HTTP_XSLT - - . auto/module - fi - - if [ $HTTP_IMAGE_FILTER != NO ]; then - ngx_module_name=ngx_http_image_filter_module - ngx_module_incs= - ngx_module_deps= - ngx_module_srcs=src/http/modules/ngx_http_image_filter_module.c - ngx_module_libs=LIBGD - ngx_module_link=$HTTP_IMAGE_FILTER - - . auto/module - fi - - if [ $HTTP_SUB = YES ]; then - ngx_module_name=ngx_http_sub_filter_module - ngx_module_incs= - ngx_module_deps= - ngx_module_srcs=src/http/modules/ngx_http_sub_filter_module.c - ngx_module_libs= - ngx_module_link=$HTTP_SUB - - . auto/module - fi - - if [ $HTTP_ADDITION = YES ]; then - ngx_module_name=ngx_http_addition_filter_module - ngx_module_incs= - ngx_module_deps= - ngx_module_srcs=src/http/modules/ngx_http_addition_filter_module.c - ngx_module_libs= - ngx_module_link=$HTTP_ADDITION - - . auto/module - fi - - if [ $HTTP_GUNZIP = YES ]; then - have=NGX_HTTP_GZIP . auto/have - USE_ZLIB=YES - - ngx_module_name=ngx_http_gunzip_filter_module - ngx_module_incs= - ngx_module_deps= - ngx_module_srcs=src/http/modules/ngx_http_gunzip_filter_module.c - ngx_module_libs= - ngx_module_link=$HTTP_GUNZIP - - . auto/module - fi - - if [ $HTTP_USERID = YES ]; then - ngx_module_name=ngx_http_userid_filter_module - ngx_module_incs= - ngx_module_deps= - ngx_module_srcs=src/http/modules/ngx_http_userid_filter_module.c - ngx_module_libs= - ngx_module_link=$HTTP_USERID - - . auto/module - fi - - if :; then - ngx_module_name=ngx_http_headers_filter_module - ngx_module_incs= - ngx_module_deps= - ngx_module_srcs=src/http/modules/ngx_http_headers_filter_module.c - ngx_module_libs= - ngx_module_link=YES - - . auto/module - fi - - - ngx_module_type=HTTP_INIT_FILTER - HTTP_INIT_FILTER_MODULES= - - if :; then - ngx_module_name=ngx_http_copy_filter_module - ngx_module_incs= - ngx_module_deps= - ngx_module_srcs=src/http/ngx_http_copy_filter_module.c - ngx_module_libs= - ngx_module_link=YES - - . auto/module - fi - - if :; then - ngx_module_name=ngx_http_range_body_filter_module - ngx_module_incs= - ngx_module_deps= - ngx_module_srcs= - ngx_module_libs= - ngx_module_link=YES - - . auto/module - fi - - if :; then - ngx_module_name=ngx_http_not_modified_filter_module - ngx_module_incs= - ngx_module_deps= - ngx_module_srcs=src/http/modules/ngx_http_not_modified_filter_module.c - ngx_module_libs= - ngx_module_link=YES - - . auto/module - fi - - if [ $HTTP_SLICE = YES ]; then - ngx_module_name=ngx_http_slice_filter_module - ngx_module_incs= - ngx_module_deps= - ngx_module_srcs=src/http/modules/ngx_http_slice_filter_module.c - ngx_module_libs= - ngx_module_link=$HTTP_SLICE - - . auto/module - fi - - - ngx_module_type=HTTP - - if [ $HTTP_V2 = YES ]; then - have=NGX_HTTP_V2 . auto/have - - ngx_module_name=ngx_http_v2_module - ngx_module_incs=src/http/v2 - ngx_module_deps="src/http/v2/ngx_http_v2.h \ - src/http/v2/ngx_http_v2_module.h" - ngx_module_srcs="src/http/v2/ngx_http_v2.c \ - src/http/v2/ngx_http_v2_table.c \ - src/http/v2/ngx_http_v2_encode.c \ - src/http/v2/ngx_http_v2_module.c" - ngx_module_libs= - ngx_module_link=$HTTP_V2 - - . auto/module - fi - - if [ $HTTP_V3 = YES ]; then - USE_OPENSSL_QUIC=YES - HTTP_SSL=YES - - have=NGX_HTTP_V3 . auto/have - - ngx_module_name=ngx_http_v3_module - ngx_module_incs=src/http/v3 - ngx_module_deps="src/http/v3/ngx_http_v3.h \ - src/http/v3/ngx_http_v3_encode.h \ - src/http/v3/ngx_http_v3_parse.h \ - src/http/v3/ngx_http_v3_table.h \ - src/http/v3/ngx_http_v3_uni.h" - ngx_module_srcs="src/http/v3/ngx_http_v3.c \ - src/http/v3/ngx_http_v3_encode.c \ - src/http/v3/ngx_http_v3_parse.c \ - src/http/v3/ngx_http_v3_table.c \ - src/http/v3/ngx_http_v3_uni.c \ - src/http/v3/ngx_http_v3_request.c \ - src/http/v3/ngx_http_v3_module.c" - ngx_module_libs= - ngx_module_link=$HTTP_V3 - - . auto/module - fi - - if :; then - ngx_module_name=ngx_http_static_module - ngx_module_incs= - ngx_module_deps= - ngx_module_srcs=src/http/modules/ngx_http_static_module.c - ngx_module_libs= - ngx_module_link=YES - - . auto/module - fi - - if [ $HTTP_GZIP_STATIC = YES ]; then - have=NGX_HTTP_GZIP . auto/have - - ngx_module_name=ngx_http_gzip_static_module - ngx_module_incs= - ngx_module_deps= - ngx_module_srcs=src/http/modules/ngx_http_gzip_static_module.c - ngx_module_libs= - ngx_module_link=$HTTP_GZIP_STATIC - - . auto/module - fi - - if [ $HTTP_DAV = YES ]; then - have=NGX_HTTP_DAV . auto/have - - ngx_module_name=ngx_http_dav_module - ngx_module_incs= - ngx_module_deps= - ngx_module_srcs=src/http/modules/ngx_http_dav_module.c - ngx_module_libs= - ngx_module_link=$HTTP_DAV - - . auto/module - fi - - if [ $HTTP_AUTOINDEX = YES ]; then - ngx_module_name=ngx_http_autoindex_module - ngx_module_incs= - ngx_module_deps= - ngx_module_srcs=src/http/modules/ngx_http_autoindex_module.c - ngx_module_libs= - ngx_module_link=$HTTP_AUTOINDEX - - . auto/module - fi - - if :; then - ngx_module_name=ngx_http_index_module - ngx_module_incs= - ngx_module_deps= - ngx_module_srcs=src/http/modules/ngx_http_index_module.c - ngx_module_libs= - ngx_module_link=YES - - . auto/module - fi - - if [ $HTTP_RANDOM_INDEX = YES ]; then - ngx_module_name=ngx_http_random_index_module - ngx_module_incs= - ngx_module_deps= - ngx_module_srcs=src/http/modules/ngx_http_random_index_module.c - ngx_module_libs= - ngx_module_link=$HTTP_RANDOM_INDEX - - . auto/module - fi - - if [ $HTTP_MIRROR = YES ]; then - ngx_module_name=ngx_http_mirror_module - ngx_module_incs= - ngx_module_deps= - ngx_module_srcs=src/http/modules/ngx_http_mirror_module.c - ngx_module_libs= - ngx_module_link=$HTTP_MIRROR - - . auto/module - fi - - if :; then - ngx_module_name=ngx_http_try_files_module - ngx_module_incs= - ngx_module_deps= - ngx_module_srcs=src/http/modules/ngx_http_try_files_module.c - ngx_module_libs= - ngx_module_link=YES - - . auto/module - fi - - if [ $HTTP_AUTH_REQUEST = YES ]; then - ngx_module_name=ngx_http_auth_request_module - ngx_module_incs= - ngx_module_deps= - ngx_module_srcs=src/http/modules/ngx_http_auth_request_module.c - ngx_module_libs= - ngx_module_link=$HTTP_AUTH_REQUEST - - . auto/module - fi - - if [ $HTTP_AUTH_BASIC = YES ]; then - have=NGX_CRYPT . auto/have - - ngx_module_name=ngx_http_auth_basic_module - ngx_module_incs= - ngx_module_deps= - ngx_module_srcs=src/http/modules/ngx_http_auth_basic_module.c - ngx_module_libs=$CRYPT_LIB - ngx_module_link=$HTTP_AUTH_BASIC - - . auto/module - fi - - if [ $HTTP_ACCESS = YES ]; then - ngx_module_name=ngx_http_access_module - ngx_module_incs= - ngx_module_deps= - ngx_module_srcs=src/http/modules/ngx_http_access_module.c - ngx_module_libs= - ngx_module_link=$HTTP_ACCESS - - . auto/module - fi - - if [ $HTTP_LIMIT_CONN = YES ]; then - ngx_module_name=ngx_http_limit_conn_module - ngx_module_incs= - ngx_module_deps= - ngx_module_srcs=src/http/modules/ngx_http_limit_conn_module.c - ngx_module_libs= - ngx_module_link=$HTTP_LIMIT_CONN - - . auto/module - fi - - if [ $HTTP_LIMIT_REQ = YES ]; then - ngx_module_name=ngx_http_limit_req_module - ngx_module_incs= - ngx_module_deps= - ngx_module_srcs=src/http/modules/ngx_http_limit_req_module.c - ngx_module_libs= - ngx_module_link=$HTTP_LIMIT_REQ - - . auto/module - fi - - if [ $HTTP_REALIP = YES ]; then - have=NGX_HTTP_REALIP . auto/have - have=NGX_HTTP_X_FORWARDED_FOR . auto/have - - ngx_module_name=ngx_http_realip_module - ngx_module_incs= - ngx_module_deps= - ngx_module_srcs=src/http/modules/ngx_http_realip_module.c - ngx_module_libs= - ngx_module_link=$HTTP_REALIP - - . auto/module - fi - - if [ $HTTP_STATUS = YES ]; then - ngx_module_name=ngx_http_status_module - ngx_module_incs= - ngx_module_deps= - ngx_module_srcs=src/http/modules/ngx_http_status_module.c - ngx_module_libs= - ngx_module_link=$HTTP_STATUS - - . auto/module - fi - - if [ $HTTP_GEO = YES ]; then - have=NGX_HTTP_X_FORWARDED_FOR . auto/have - - ngx_module_name=ngx_http_geo_module - ngx_module_incs= - ngx_module_deps= - ngx_module_srcs=src/http/modules/ngx_http_geo_module.c - ngx_module_libs= - ngx_module_link=$HTTP_GEO - - . auto/module - fi - - if [ $HTTP_GEOIP != NO ]; then - have=NGX_HTTP_X_FORWARDED_FOR . auto/have - - ngx_module_name=ngx_http_geoip_module - ngx_module_incs= - ngx_module_deps= - ngx_module_srcs=src/http/modules/ngx_http_geoip_module.c - ngx_module_libs=GEOIP - ngx_module_link=$HTTP_GEOIP - - . auto/module - fi - - if [ $HTTP_MAP = YES ]; then - ngx_module_name=ngx_http_map_module - ngx_module_incs= - ngx_module_deps= - ngx_module_srcs=src/http/modules/ngx_http_map_module.c - ngx_module_libs= - ngx_module_link=$HTTP_MAP - - . auto/module - fi - - if [ $HTTP_SPLIT_CLIENTS = YES ]; then - ngx_module_name=ngx_http_split_clients_module - ngx_module_incs= - ngx_module_deps= - ngx_module_srcs=src/http/modules/ngx_http_split_clients_module.c - ngx_module_libs= - ngx_module_link=$HTTP_SPLIT_CLIENTS - - . auto/module - fi - - if [ $HTTP_REFERER = YES ]; then - ngx_module_name=ngx_http_referer_module - ngx_module_incs= - ngx_module_deps= - ngx_module_srcs=src/http/modules/ngx_http_referer_module.c - ngx_module_libs= - ngx_module_link=$HTTP_REFERER - - . auto/module - fi - - if [ $HTTP_REWRITE = YES -a $USE_PCRE != DISABLED ]; then - USE_PCRE=YES - - ngx_module_name=ngx_http_rewrite_module - ngx_module_incs= - ngx_module_deps= - ngx_module_srcs=src/http/modules/ngx_http_rewrite_module.c - ngx_module_libs= - ngx_module_link=$HTTP_REWRITE - - . auto/module - fi - - if [ $HTTP_SSL = YES ]; then - USE_OPENSSL=YES - have=NGX_HTTP_SSL . auto/have - - ngx_module_name=ngx_http_ssl_module - ngx_module_incs= - ngx_module_deps=src/http/modules/ngx_http_ssl_module.h - ngx_module_srcs=src/http/modules/ngx_http_ssl_module.c - ngx_module_libs= - ngx_module_link=$HTTP_SSL - - . auto/module - fi - - if [ $HTTP_PROXY = YES ]; then - have=NGX_HTTP_X_FORWARDED_FOR . auto/have - - ngx_module_name=ngx_http_proxy_module - ngx_module_incs= - ngx_module_deps=src/http/modules/ngx_http_proxy_module.h - ngx_module_srcs=src/http/modules/ngx_http_proxy_module.c - ngx_module_libs= - ngx_module_link=$HTTP_PROXY - - . auto/module - fi - - if [ $HTTP_FASTCGI = YES ]; then - ngx_module_name=ngx_http_fastcgi_module - ngx_module_incs= - ngx_module_deps= - ngx_module_srcs=src/http/modules/ngx_http_fastcgi_module.c - ngx_module_libs= - ngx_module_link=$HTTP_FASTCGI - - . auto/module - fi - - if [ $HTTP_UWSGI = YES ]; then - ngx_module_name=ngx_http_uwsgi_module - ngx_module_incs= - ngx_module_deps= - ngx_module_srcs=src/http/modules/ngx_http_uwsgi_module.c - ngx_module_libs= - ngx_module_link=$HTTP_UWSGI - - . auto/module - fi - - if [ $HTTP_SCGI = YES ]; then - ngx_module_name=ngx_http_scgi_module - ngx_module_incs= - ngx_module_deps= - ngx_module_srcs=src/http/modules/ngx_http_scgi_module.c - ngx_module_libs= - ngx_module_link=$HTTP_SCGI - - . auto/module - fi - - if [ $HTTP_GRPC = YES -a $HTTP_V2 = YES ]; then - ngx_module_name=ngx_http_grpc_module - ngx_module_incs= - ngx_module_deps= - ngx_module_srcs=src/http/modules/ngx_http_grpc_module.c - ngx_module_libs= - ngx_module_link=$HTTP_GRPC - - . auto/module - fi - - if [ $HTTP_PROXY = YES -a $HTTP_V2 = YES ]; then - ngx_module_name=ngx_http_proxy_v2_module - ngx_module_incs= - ngx_module_deps= - ngx_module_srcs=src/http/modules/ngx_http_proxy_v2_module.c - ngx_module_libs= - ngx_module_link=$HTTP_V2 - - . auto/module - fi - - if [ $HTTP_PERL != NO ]; then - ngx_module_name=ngx_http_perl_module - ngx_module_incs=src/http/modules/perl - ngx_module_deps=src/http/modules/perl/ngx_http_perl_module.h - ngx_module_srcs=src/http/modules/perl/ngx_http_perl_module.c - ngx_module_libs=PERL - ngx_module_link=$HTTP_PERL - - . auto/module - fi - - if [ $HTTP_MEMCACHED = YES ]; then - ngx_module_name=ngx_http_memcached_module - ngx_module_incs= - ngx_module_deps= - ngx_module_srcs=src/http/modules/ngx_http_memcached_module.c - ngx_module_libs= - ngx_module_link=$HTTP_MEMCACHED - - . auto/module - fi - - if [ $HTTP_EMPTY_GIF = YES ]; then - ngx_module_name=ngx_http_empty_gif_module - ngx_module_incs= - ngx_module_deps= - ngx_module_srcs=src/http/modules/ngx_http_empty_gif_module.c - ngx_module_libs= - ngx_module_link=$HTTP_EMPTY_GIF - - . auto/module - fi - - if [ $HTTP_BROWSER = YES ]; then - ngx_module_name=ngx_http_browser_module - ngx_module_incs= - ngx_module_deps= - ngx_module_srcs=src/http/modules/ngx_http_browser_module.c - ngx_module_libs= - ngx_module_link=$HTTP_BROWSER - - . auto/module - fi - - if [ $HTTP_SECURE_LINK = YES ]; then - ngx_module_name=ngx_http_secure_link_module - ngx_module_incs= - ngx_module_deps= - ngx_module_srcs=src/http/modules/ngx_http_secure_link_module.c - ngx_module_libs= - ngx_module_link=$HTTP_SECURE_LINK - - . auto/module - fi - - if [ $HTTP_DEGRADATION = YES ]; then - have=NGX_HTTP_DEGRADATION . auto/have - - ngx_module_name=ngx_http_degradation_module - ngx_module_incs= - ngx_module_deps= - ngx_module_srcs=src/http/modules/ngx_http_degradation_module.c - ngx_module_libs= - ngx_module_link=$HTTP_DEGRADATION - - . auto/module - fi - - if [ $HTTP_FLV = YES ]; then - ngx_module_name=ngx_http_flv_module - ngx_module_incs= - ngx_module_deps= - ngx_module_srcs=src/http/modules/ngx_http_flv_module.c - ngx_module_libs= - ngx_module_link=$HTTP_FLV - - . auto/module - fi - - if [ $HTTP_MP4 = YES ]; then - ngx_module_name=ngx_http_mp4_module - ngx_module_incs= - ngx_module_deps= - ngx_module_srcs=src/http/modules/ngx_http_mp4_module.c - ngx_module_libs= - ngx_module_link=$HTTP_MP4 - - . auto/module - fi - - if [ $HTTP_UPSTREAM_HASH = YES ]; then - ngx_module_name=ngx_http_upstream_hash_module - ngx_module_incs= - ngx_module_deps= - ngx_module_srcs=src/http/modules/ngx_http_upstream_hash_module.c - ngx_module_libs= - ngx_module_link=$HTTP_UPSTREAM_HASH - - . auto/module - fi - - if [ $HTTP_UPSTREAM_IP_HASH = YES ]; then - ngx_module_name=ngx_http_upstream_ip_hash_module - ngx_module_incs= - ngx_module_deps= - ngx_module_srcs=src/http/modules/ngx_http_upstream_ip_hash_module.c - ngx_module_libs= - ngx_module_link=$HTTP_UPSTREAM_IP_HASH - - . auto/module - fi - - if [ $HTTP_UPSTREAM_LEAST_CONN = YES ]; then - ngx_module_name=ngx_http_upstream_least_conn_module - ngx_module_incs= - ngx_module_deps= - ngx_module_srcs=src/http/modules/ngx_http_upstream_least_conn_module.c - ngx_module_libs= - ngx_module_link=$HTTP_UPSTREAM_LEAST_CONN - - . auto/module - fi - - if [ $HTTP_UPSTREAM_RANDOM = YES ]; then - ngx_module_name=ngx_http_upstream_random_module - ngx_module_incs= - ngx_module_deps= - ngx_module_srcs=src/http/modules/ngx_http_upstream_random_module.c - ngx_module_libs= - ngx_module_link=$HTTP_UPSTREAM_RANDOM - - . auto/module - fi - - if [ $HTTP_UPSTREAM_KEEPALIVE = YES ]; then - ngx_module_name=ngx_http_upstream_keepalive_module - ngx_module_incs= - ngx_module_deps= - ngx_module_srcs=src/http/modules/ngx_http_upstream_keepalive_module.c - ngx_module_libs= - ngx_module_link=$HTTP_UPSTREAM_KEEPALIVE - - . auto/module - fi - - if [ $HTTP_UPSTREAM_ZONE = YES ]; then - have=NGX_HTTP_UPSTREAM_ZONE . auto/have - - ngx_module_name=ngx_http_upstream_zone_module - ngx_module_incs= - ngx_module_deps= - ngx_module_srcs=src/http/modules/ngx_http_upstream_zone_module.c - ngx_module_libs= - ngx_module_link=$HTTP_UPSTREAM_ZONE - - . auto/module - fi - - if [ $HTTP_UPSTREAM_STICKY = YES ]; then - have=NGX_HTTP_UPSTREAM_STICKY . auto/have - have=NGX_HTTP_UPSTREAM_SID . auto/have - - ngx_module_name=ngx_http_upstream_sticky_module - ngx_module_incs= - ngx_module_deps= - ngx_module_srcs=src/http/modules/ngx_http_upstream_sticky_module.c - ngx_module_libs= - ngx_module_link=$HTTP_UPSTREAM_STICKY - - . auto/module - fi - - if [ $HTTP_STUB_STATUS = YES ]; then - have=NGX_STAT_STUB . auto/have - - ngx_module_name=ngx_http_stub_status_module - ngx_module_incs= - ngx_module_deps= - ngx_module_srcs=src/http/modules/ngx_http_stub_status_module.c - ngx_module_libs= - ngx_module_link=$HTTP_STUB_STATUS - - . auto/module - fi -fi - - -if [ $MAIL != NO ]; then - MAIL_MODULES= - MAIL_DEPS= - MAIL_INCS= - - ngx_module_type=MAIL - ngx_module_libs= - ngx_module_link=YES - - ngx_module_order= - - ngx_module_name="ngx_mail_module ngx_mail_core_module" - ngx_module_incs="src/mail" - ngx_module_deps="src/mail/ngx_mail.h" - ngx_module_srcs="src/mail/ngx_mail.c \ - src/mail/ngx_mail_core_module.c \ - src/mail/ngx_mail_handler.c \ - src/mail/ngx_mail_parse.c" - - . auto/module - - ngx_module_incs= - - if [ $MAIL_SSL = YES ]; then - USE_OPENSSL=YES - have=NGX_MAIL_SSL . auto/have - - ngx_module_name=ngx_mail_ssl_module - ngx_module_deps=src/mail/ngx_mail_ssl_module.h - ngx_module_srcs=src/mail/ngx_mail_ssl_module.c - - . auto/module - fi - - if [ $MAIL_POP3 = YES ]; then - ngx_module_name=ngx_mail_pop3_module - ngx_module_deps=src/mail/ngx_mail_pop3_module.h - ngx_module_srcs="src/mail/ngx_mail_pop3_module.c \ - src/mail/ngx_mail_pop3_handler.c" - - . auto/module - fi - - if [ $MAIL_IMAP = YES ]; then - ngx_module_name=ngx_mail_imap_module - ngx_module_deps=src/mail/ngx_mail_imap_module.h - ngx_module_srcs="src/mail/ngx_mail_imap_module.c \ - src/mail/ngx_mail_imap_handler.c" - - . auto/module - fi - - if [ $MAIL_SMTP = YES ]; then - ngx_module_name=ngx_mail_smtp_module - ngx_module_deps=src/mail/ngx_mail_smtp_module.h - ngx_module_srcs="src/mail/ngx_mail_smtp_module.c \ - src/mail/ngx_mail_smtp_handler.c" - - . auto/module - fi - - ngx_module_name=ngx_mail_auth_http_module - ngx_module_deps= - ngx_module_srcs=src/mail/ngx_mail_auth_http_module.c - - . auto/module - - ngx_module_name=ngx_mail_proxy_module - ngx_module_deps= - ngx_module_srcs=src/mail/ngx_mail_proxy_module.c - - . auto/module - - ngx_module_name=ngx_mail_realip_module - ngx_module_deps= - ngx_module_srcs=src/mail/ngx_mail_realip_module.c - - . auto/module -fi - - -if [ $STREAM != NO ]; then - STREAM_MODULES= - STREAM_DEPS= - STREAM_INCS= - - ngx_module_type=STREAM - ngx_module_libs= - ngx_module_link=YES - - ngx_module_order= - - ngx_module_name="ngx_stream_module \ - ngx_stream_core_module \ - ngx_stream_log_module \ - ngx_stream_proxy_module \ - ngx_stream_upstream_module \ - ngx_stream_write_filter_module" - ngx_module_incs="src/stream" - ngx_module_deps="src/stream/ngx_stream.h \ - src/stream/ngx_stream_variables.h \ - src/stream/ngx_stream_script.h \ - src/stream/ngx_stream_upstream.h \ - src/stream/ngx_stream_upstream_round_robin.h" - ngx_module_srcs="src/stream/ngx_stream.c \ - src/stream/ngx_stream_variables.c \ - src/stream/ngx_stream_script.c \ - src/stream/ngx_stream_handler.c \ - src/stream/ngx_stream_core_module.c \ - src/stream/ngx_stream_log_module.c \ - src/stream/ngx_stream_proxy_module.c \ - src/stream/ngx_stream_upstream.c \ - src/stream/ngx_stream_upstream_round_robin.c \ - src/stream/ngx_stream_write_filter_module.c" - - . auto/module - - ngx_module_incs= - - if [ $STREAM_SSL = YES ]; then - USE_OPENSSL=YES - have=NGX_STREAM_SSL . auto/have - - ngx_module_name=ngx_stream_ssl_module - ngx_module_deps=src/stream/ngx_stream_ssl_module.h - ngx_module_srcs=src/stream/ngx_stream_ssl_module.c - ngx_module_libs= - ngx_module_link=$STREAM_SSL - - . auto/module - fi - - if [ $STREAM_REALIP = YES ]; then - ngx_module_name=ngx_stream_realip_module - ngx_module_deps= - ngx_module_srcs=src/stream/ngx_stream_realip_module.c - ngx_module_libs= - ngx_module_link=$STREAM_REALIP - - . auto/module - fi - - if [ $STREAM_LIMIT_CONN = YES ]; then - ngx_module_name=ngx_stream_limit_conn_module - ngx_module_deps= - ngx_module_srcs=src/stream/ngx_stream_limit_conn_module.c - ngx_module_libs= - ngx_module_link=$STREAM_LIMIT_CONN - - . auto/module - fi - - if [ $STREAM_ACCESS = YES ]; then - ngx_module_name=ngx_stream_access_module - ngx_module_deps= - ngx_module_srcs=src/stream/ngx_stream_access_module.c - ngx_module_libs= - ngx_module_link=$STREAM_ACCESS - - . auto/module - fi - - if [ $STREAM_GEO = YES ]; then - ngx_module_name=ngx_stream_geo_module - ngx_module_deps= - ngx_module_srcs=src/stream/ngx_stream_geo_module.c - ngx_module_libs= - ngx_module_link=$STREAM_GEO - - . auto/module - fi - - if [ $STREAM_GEOIP != NO ]; then - ngx_module_name=ngx_stream_geoip_module - ngx_module_deps= - ngx_module_srcs=src/stream/ngx_stream_geoip_module.c - ngx_module_libs=GEOIP - ngx_module_link=$STREAM_GEOIP - - . auto/module - fi - - if [ $STREAM_MAP = YES ]; then - ngx_module_name=ngx_stream_map_module - ngx_module_deps= - ngx_module_srcs=src/stream/ngx_stream_map_module.c - ngx_module_libs= - ngx_module_link=$STREAM_MAP - - . auto/module - fi - - if [ $STREAM_SPLIT_CLIENTS = YES ]; then - ngx_module_name=ngx_stream_split_clients_module - ngx_module_deps= - ngx_module_srcs=src/stream/ngx_stream_split_clients_module.c - ngx_module_libs= - ngx_module_link=$STREAM_SPLIT_CLIENTS - - . auto/module - fi - - if [ $STREAM_RETURN = YES ]; then - ngx_module_name=ngx_stream_return_module - ngx_module_deps= - ngx_module_srcs=src/stream/ngx_stream_return_module.c - ngx_module_libs= - ngx_module_link=$STREAM_RETURN - - . auto/module - fi - - if [ $STREAM_PASS = YES ]; then - ngx_module_name=ngx_stream_pass_module - ngx_module_deps= - ngx_module_srcs=src/stream/ngx_stream_pass_module.c - ngx_module_libs= - ngx_module_link=$STREAM_PASS - - . auto/module - fi - - if [ $STREAM_SET = YES ]; then - ngx_module_name=ngx_stream_set_module - ngx_module_deps= - ngx_module_srcs=src/stream/ngx_stream_set_module.c - ngx_module_libs= - ngx_module_link=$STREAM_SET - - . auto/module - fi - - if [ $STREAM_UPSTREAM_HASH = YES ]; then - ngx_module_name=ngx_stream_upstream_hash_module - ngx_module_deps= - ngx_module_srcs=src/stream/ngx_stream_upstream_hash_module.c - ngx_module_libs= - ngx_module_link=$STREAM_UPSTREAM_HASH - - . auto/module - fi - - if [ $STREAM_UPSTREAM_LEAST_CONN = YES ]; then - ngx_module_name=ngx_stream_upstream_least_conn_module - ngx_module_deps= - ngx_module_srcs=src/stream/ngx_stream_upstream_least_conn_module.c - ngx_module_libs= - ngx_module_link=$STREAM_UPSTREAM_LEAST_CONN - - . auto/module - fi - - if [ $STREAM_UPSTREAM_RANDOM = YES ]; then - ngx_module_name=ngx_stream_upstream_random_module - ngx_module_deps= - ngx_module_srcs=src/stream/ngx_stream_upstream_random_module.c - ngx_module_libs= - ngx_module_link=$STREAM_UPSTREAM_RANDOM - - . auto/module - fi - - if [ $STREAM_UPSTREAM_ZONE = YES ]; then - have=NGX_STREAM_UPSTREAM_ZONE . auto/have - - ngx_module_name=ngx_stream_upstream_zone_module - ngx_module_deps= - ngx_module_srcs=src/stream/ngx_stream_upstream_zone_module.c - ngx_module_libs= - ngx_module_link=$STREAM_UPSTREAM_ZONE - - . auto/module - fi - - if [ $STREAM_SSL_PREREAD = YES ]; then - ngx_module_name=ngx_stream_ssl_preread_module - ngx_module_deps= - ngx_module_srcs=src/stream/ngx_stream_ssl_preread_module.c - ngx_module_libs= - ngx_module_link=$STREAM_SSL_PREREAD - - . auto/module - fi -fi - - -#if [ -r $NGX_OBJS/auto ]; then -# . $NGX_OBJS/auto -#fi - - -if test -n "$NGX_ADDONS"; then - - echo configuring additional modules - - for ngx_addon_dir in $NGX_ADDONS - do - echo "adding module in $ngx_addon_dir" - - ngx_module_type= - ngx_module_name= - ngx_module_incs= - ngx_module_deps= - ngx_module_srcs= - ngx_module_libs= - ngx_module_order= - ngx_module_link=ADDON - - if test -f $ngx_addon_dir/config; then - . $ngx_addon_dir/config - - echo " + $ngx_addon_name was configured" - - else - echo "$0: error: no $ngx_addon_dir/config was found" - exit 1 - fi - done -fi - - -if test -n "$DYNAMIC_ADDONS"; then - - echo configuring additional dynamic modules - - for ngx_addon_dir in $DYNAMIC_ADDONS - do - echo "adding module in $ngx_addon_dir" - - ngx_module_type= - ngx_module_name= - ngx_module_incs= - ngx_module_deps= - ngx_module_srcs= - ngx_module_libs= - ngx_module_order= - ngx_module_link=DYNAMIC - - if test -f $ngx_addon_dir/config; then - . $ngx_addon_dir/config - - echo " + $ngx_addon_name was configured" - - else - echo "$0: error: no $ngx_addon_dir/config was found" - exit 1 - fi - done -fi - - -if [ $USE_OPENSSL = YES ]; then - ngx_module_type=CORE - ngx_module_name="ngx_openssl_module ngx_openssl_cache_module" - ngx_module_incs= - ngx_module_deps=src/event/ngx_event_openssl.h - ngx_module_srcs="src/event/ngx_event_openssl.c - src/event/ngx_event_openssl_cache.c - src/event/ngx_event_openssl_stapling.c" - ngx_module_libs= - ngx_module_link=YES - ngx_module_order= - - . auto/module -fi - - -if [ $USE_OPENSSL_QUIC = YES ]; then - ngx_module_type=CORE - ngx_module_name=ngx_quic_module - ngx_module_incs= - ngx_module_deps="src/event/quic/ngx_event_quic.h \ - src/event/quic/ngx_event_quic_transport.h \ - src/event/quic/ngx_event_quic_protection.h \ - src/event/quic/ngx_event_quic_connection.h \ - src/event/quic/ngx_event_quic_frames.h \ - src/event/quic/ngx_event_quic_connid.h \ - src/event/quic/ngx_event_quic_migration.h \ - src/event/quic/ngx_event_quic_streams.h \ - src/event/quic/ngx_event_quic_ssl.h \ - src/event/quic/ngx_event_quic_tokens.h \ - src/event/quic/ngx_event_quic_ack.h \ - src/event/quic/ngx_event_quic_output.h \ - src/event/quic/ngx_event_quic_socket.h \ - src/event/quic/ngx_event_quic_openssl_compat.h" - ngx_module_srcs="src/event/quic/ngx_event_quic.c \ - src/event/quic/ngx_event_quic_udp.c \ - src/event/quic/ngx_event_quic_transport.c \ - src/event/quic/ngx_event_quic_protection.c \ - src/event/quic/ngx_event_quic_frames.c \ - src/event/quic/ngx_event_quic_connid.c \ - src/event/quic/ngx_event_quic_migration.c \ - src/event/quic/ngx_event_quic_streams.c \ - src/event/quic/ngx_event_quic_ssl.c \ - src/event/quic/ngx_event_quic_tokens.c \ - src/event/quic/ngx_event_quic_ack.c \ - src/event/quic/ngx_event_quic_output.c \ - src/event/quic/ngx_event_quic_socket.c \ - src/event/quic/ngx_event_quic_openssl_compat.c" - - ngx_module_libs= - ngx_module_link=YES - ngx_module_order= - - . auto/module - - if [ $QUIC_BPF = YES -a $SO_COOKIE_FOUND = YES ]; then - ngx_module_type=CORE - ngx_module_name=ngx_quic_bpf_module - ngx_module_incs= - ngx_module_deps= - ngx_module_srcs="src/event/quic/ngx_event_quic_bpf.c \ - src/event/quic/ngx_event_quic_bpf_code.c" - ngx_module_libs= - ngx_module_link=YES - ngx_module_order= - - . auto/module - - have=NGX_QUIC_BPF . auto/have - fi -fi - - -if [ $USE_PCRE = YES ]; then - ngx_module_type=CORE - ngx_module_name=ngx_regex_module - ngx_module_incs= - ngx_module_deps=src/core/ngx_regex.h - ngx_module_srcs=src/core/ngx_regex.c - ngx_module_libs= - ngx_module_link=YES - ngx_module_order= - - . auto/module -fi - - -modules="$CORE_MODULES $EVENT_MODULES" - - -# thread pool module should be initialized after events -if [ $USE_THREADS = YES ]; then - modules="$modules $THREAD_POOL_MODULE" -fi - - -if [ $HTTP = YES ]; then - modules="$modules $HTTP_MODULES $HTTP_FILTER_MODULES \ - $HTTP_AUX_FILTER_MODULES $HTTP_INIT_FILTER_MODULES" - - NGX_ADDON_DEPS="$NGX_ADDON_DEPS \$(HTTP_DEPS)" -fi - - -if [ $MAIL != NO ]; then - - if [ $MAIL = YES ]; then - modules="$modules $MAIL_MODULES" - - elif [ $MAIL = DYNAMIC ]; then - ngx_module_name=$MAIL_MODULES - ngx_module_incs= - ngx_module_deps= - ngx_module_srcs=$MAIL_SRCS - ngx_module_libs= - ngx_module_link=DYNAMIC - - . auto/module - fi - - NGX_ADDON_DEPS="$NGX_ADDON_DEPS \$(MAIL_DEPS)" -fi - - -if [ $STREAM != NO ]; then - - if [ $STREAM = YES ]; then - modules="$modules $STREAM_MODULES" - - elif [ $STREAM = DYNAMIC ]; then - ngx_module_name=$STREAM_MODULES - ngx_module_incs= - ngx_module_deps= - ngx_module_srcs=$STREAM_SRCS - ngx_module_libs= - ngx_module_link=DYNAMIC - - . auto/module - fi - - NGX_ADDON_DEPS="$NGX_ADDON_DEPS \$(STREAM_DEPS)" -fi - - -ngx_module_type=MISC -MISC_MODULES= - -if [ $NGX_GOOGLE_PERFTOOLS = YES ]; then - ngx_module_name=ngx_google_perftools_module - ngx_module_incs= - ngx_module_deps= - ngx_module_srcs=src/misc/ngx_google_perftools_module.c - ngx_module_libs= - ngx_module_link=$NGX_GOOGLE_PERFTOOLS - - . auto/module -fi - -if [ $NGX_CPP_TEST = YES ]; then - ngx_module_name= - ngx_module_incs= - ngx_module_deps= - ngx_module_srcs=src/misc/ngx_cpp_test_module.cpp - ngx_module_libs=-lstdc++ - ngx_module_link=$NGX_CPP_TEST - - . auto/module -fi - -modules="$modules $MISC_MODULES" - - -if [ $NGX_COMPAT = YES ]; then - have=NGX_COMPAT . auto/have - have=NGX_HTTP_GZIP . auto/have - have=NGX_HTTP_DAV . auto/have - have=NGX_HTTP_REALIP . auto/have - have=NGX_HTTP_X_FORWARDED_FOR . auto/have - have=NGX_HTTP_HEADERS . auto/have - have=NGX_HTTP_UPSTREAM_ZONE . auto/have - have=NGX_STREAM_UPSTREAM_ZONE . auto/have -fi - - -cat << END > $NGX_MODULES_C - -#include -#include - -$NGX_PRAGMA - -END - -for mod in $modules -do - echo "extern ngx_module_t $mod;" >> $NGX_MODULES_C -done - -echo >> $NGX_MODULES_C -echo 'ngx_module_t *ngx_modules[] = {' >> $NGX_MODULES_C - -for mod in $modules -do - echo " &$mod," >> $NGX_MODULES_C -done - -cat << END >> $NGX_MODULES_C - NULL -}; - -END - -echo 'char *ngx_module_names[] = {' >> $NGX_MODULES_C - -for mod in $modules -do - echo " \"$mod\"," >> $NGX_MODULES_C -done - -cat << END >> $NGX_MODULES_C - NULL -}; - -END diff --git a/src/deps/src/nginx-1.30.3/auto/nohave b/src/deps/src/nginx-1.30.3/auto/nohave deleted file mode 100644 index dfb171837c..0000000000 --- a/src/deps/src/nginx-1.30.3/auto/nohave +++ /dev/null @@ -1,12 +0,0 @@ - -# Copyright (C) Igor Sysoev -# Copyright (C) Nginx, Inc. - - -cat << END >> $NGX_AUTO_CONFIG_H - -#ifndef $have -#define $have 0 -#endif - -END diff --git a/src/deps/src/nginx-1.30.3/auto/options b/src/deps/src/nginx-1.30.3/auto/options deleted file mode 100644 index 271153a76a..0000000000 --- a/src/deps/src/nginx-1.30.3/auto/options +++ /dev/null @@ -1,653 +0,0 @@ - -# Copyright (C) Igor Sysoev -# Copyright (C) Nginx, Inc. - - -help=no - -NGX_PREFIX= -NGX_SBIN_PATH= -NGX_MODULES_PATH= -NGX_CONF_PREFIX= -NGX_CONF_PATH= -NGX_ERROR_LOG_PATH= -NGX_PID_PATH= -NGX_LOCK_PATH= -NGX_USER= -NGX_GROUP= -NGX_BUILD= - -CC=${CC:-cc} -CPP= -NGX_OBJS=objs - -NGX_DEBUG=NO -NGX_CC_OPT= -NGX_LD_OPT= -CPU=NO - -NGX_RPATH=NO - -NGX_TEST_BUILD_DEVPOLL=NO -NGX_TEST_BUILD_EVENTPORT=NO -NGX_TEST_BUILD_EPOLL=NO -NGX_TEST_BUILD_SOLARIS_SENDFILEV=NO - -NGX_PLATFORM= -NGX_WINE= - -EVENT_FOUND=NO - -EVENT_SELECT=NO -EVENT_POLL=NO - -USE_THREADS=NO - -NGX_FILE_AIO=NO - -QUIC_BPF=NO - -HTTP=YES - -NGX_HTTP_LOG_PATH= -NGX_HTTP_CLIENT_TEMP_PATH= -NGX_HTTP_PROXY_TEMP_PATH= -NGX_HTTP_FASTCGI_TEMP_PATH= -NGX_HTTP_UWSGI_TEMP_PATH= -NGX_HTTP_SCGI_TEMP_PATH= - -HTTP_CACHE=YES -HTTP_CHARSET=YES -HTTP_GZIP=YES -HTTP_SSL=NO -HTTP_V2=NO -HTTP_V3=NO -HTTP_SSI=YES -HTTP_REALIP=NO -HTTP_XSLT=NO -HTTP_IMAGE_FILTER=NO -HTTP_SUB=NO -HTTP_ADDITION=NO -HTTP_DAV=NO -HTTP_ACCESS=YES -HTTP_AUTH_BASIC=YES -HTTP_AUTH_REQUEST=NO -HTTP_MIRROR=YES -HTTP_USERID=YES -HTTP_SLICE=NO -HTTP_AUTOINDEX=YES -HTTP_RANDOM_INDEX=NO -HTTP_STATUS=NO -HTTP_GEO=YES -HTTP_GEOIP=NO -HTTP_MAP=YES -HTTP_SPLIT_CLIENTS=YES -HTTP_REFERER=YES -HTTP_REWRITE=YES -HTTP_PROXY=YES -HTTP_FASTCGI=YES -HTTP_UWSGI=YES -HTTP_SCGI=YES -HTTP_GRPC=YES -HTTP_PERL=NO -HTTP_MEMCACHED=YES -HTTP_LIMIT_CONN=YES -HTTP_LIMIT_REQ=YES -HTTP_EMPTY_GIF=YES -HTTP_BROWSER=YES -HTTP_SECURE_LINK=NO -HTTP_DEGRADATION=NO -HTTP_FLV=NO -HTTP_MP4=NO -HTTP_GUNZIP=NO -HTTP_GZIP_STATIC=NO -HTTP_UPSTREAM_HASH=YES -HTTP_UPSTREAM_IP_HASH=YES -HTTP_UPSTREAM_LEAST_CONN=YES -HTTP_UPSTREAM_RANDOM=YES -HTTP_UPSTREAM_KEEPALIVE=YES -HTTP_UPSTREAM_ZONE=YES -HTTP_UPSTREAM_STICKY=YES - -# STUB -HTTP_STUB_STATUS=NO - -MAIL=NO -MAIL_SSL=NO -MAIL_POP3=YES -MAIL_IMAP=YES -MAIL_SMTP=YES - -STREAM=NO -STREAM_SSL=NO -STREAM_REALIP=NO -STREAM_LIMIT_CONN=YES -STREAM_ACCESS=YES -STREAM_GEO=YES -STREAM_GEOIP=NO -STREAM_MAP=YES -STREAM_SPLIT_CLIENTS=YES -STREAM_RETURN=YES -STREAM_PASS=YES -STREAM_SET=YES -STREAM_UPSTREAM_HASH=YES -STREAM_UPSTREAM_LEAST_CONN=YES -STREAM_UPSTREAM_RANDOM=YES -STREAM_UPSTREAM_ZONE=YES -STREAM_SSL_PREREAD=NO - -DYNAMIC_MODULES= -DYNAMIC_MODULES_SRCS= - -NGX_ADDONS= -NGX_ADDON_SRCS= -NGX_ADDON_DEPS= -DYNAMIC_ADDONS= - -NGX_COMPAT=NO - -USE_PCRE=NO -PCRE=NONE -PCRE_OPT= -PCRE_CONF_OPT= -PCRE_JIT=NO -PCRE2=YES - -USE_OPENSSL=NO -USE_OPENSSL_QUIC=NO -OPENSSL=NONE - -USE_ZLIB=NO -ZLIB=NONE -ZLIB_OPT= -ZLIB_ASM=NO - -USE_PERL=NO -NGX_PERL=perl - -USE_LIBXSLT=NO -USE_LIBGD=NO -USE_GEOIP=NO - -NGX_GOOGLE_PERFTOOLS=NO -NGX_CPP_TEST=NO - -SO_COOKIE_FOUND=NO - -NGX_LIBATOMIC=NO - -NGX_CPU_CACHE_LINE= - -NGX_POST_CONF_MSG= - -opt= - -for option -do - opt="$opt `echo $option | sed -e \"s/\(--[^=]*=\)\(.* .*\)/\1'\2'/\"`" - - case "$option" in - -*=*) value=`echo "$option" | sed -e 's/[-_a-zA-Z0-9]*=//'` ;; - *) value="" ;; - esac - - case "$option" in - --help) help=yes ;; - - --prefix=) NGX_PREFIX="!" ;; - --prefix=*) NGX_PREFIX="$value" ;; - --sbin-path=*) NGX_SBIN_PATH="$value" ;; - --modules-path=*) NGX_MODULES_PATH="$value" ;; - --conf-path=*) NGX_CONF_PATH="$value" ;; - --error-log-path=*) NGX_ERROR_LOG_PATH="$value";; - --pid-path=*) NGX_PID_PATH="$value" ;; - --lock-path=*) NGX_LOCK_PATH="$value" ;; - --user=*) NGX_USER="$value" ;; - --group=*) NGX_GROUP="$value" ;; - - --crossbuild=*) NGX_PLATFORM="$value" ;; - - --build=*) NGX_BUILD="$value" ;; - --builddir=*) NGX_OBJS="$value" ;; - - --with-select_module) EVENT_SELECT=YES ;; - --without-select_module) EVENT_SELECT=NONE ;; - --with-poll_module) EVENT_POLL=YES ;; - --without-poll_module) EVENT_POLL=NONE ;; - - --with-threads) USE_THREADS=YES ;; - - --with-file-aio) NGX_FILE_AIO=YES ;; - - --without-quic_bpf_module) QUIC_BPF=NONE ;; - - --with-ipv6) - NGX_POST_CONF_MSG="$NGX_POST_CONF_MSG -$0: warning: the \"--with-ipv6\" option is deprecated" - ;; - - --without-http) HTTP=NO ;; - --without-http-cache) HTTP_CACHE=NO ;; - - --http-log-path=*) NGX_HTTP_LOG_PATH="$value" ;; - --http-client-body-temp-path=*) NGX_HTTP_CLIENT_TEMP_PATH="$value" ;; - --http-proxy-temp-path=*) NGX_HTTP_PROXY_TEMP_PATH="$value" ;; - --http-fastcgi-temp-path=*) NGX_HTTP_FASTCGI_TEMP_PATH="$value" ;; - --http-uwsgi-temp-path=*) NGX_HTTP_UWSGI_TEMP_PATH="$value" ;; - --http-scgi-temp-path=*) NGX_HTTP_SCGI_TEMP_PATH="$value" ;; - - --with-http_ssl_module) HTTP_SSL=YES ;; - --with-http_v2_module) HTTP_V2=YES ;; - --with-http_v3_module) HTTP_V3=YES ;; - --with-http_realip_module) HTTP_REALIP=YES ;; - --with-http_addition_module) HTTP_ADDITION=YES ;; - --with-http_xslt_module) HTTP_XSLT=YES ;; - --with-http_xslt_module=dynamic) HTTP_XSLT=DYNAMIC ;; - --with-http_image_filter_module) HTTP_IMAGE_FILTER=YES ;; - --with-http_image_filter_module=dynamic) - HTTP_IMAGE_FILTER=DYNAMIC ;; - --with-http_geoip_module) HTTP_GEOIP=YES ;; - --with-http_geoip_module=dynamic) - HTTP_GEOIP=DYNAMIC ;; - --with-http_sub_module) HTTP_SUB=YES ;; - --with-http_dav_module) HTTP_DAV=YES ;; - --with-http_flv_module) HTTP_FLV=YES ;; - --with-http_mp4_module) HTTP_MP4=YES ;; - --with-http_gunzip_module) HTTP_GUNZIP=YES ;; - --with-http_gzip_static_module) HTTP_GZIP_STATIC=YES ;; - --with-http_auth_request_module) HTTP_AUTH_REQUEST=YES ;; - --with-http_random_index_module) HTTP_RANDOM_INDEX=YES ;; - --with-http_secure_link_module) HTTP_SECURE_LINK=YES ;; - --with-http_degradation_module) HTTP_DEGRADATION=YES ;; - --with-http_slice_module) HTTP_SLICE=YES ;; - - --without-http_charset_module) HTTP_CHARSET=NO ;; - --without-http_gzip_module) HTTP_GZIP=NO ;; - --without-http_ssi_module) HTTP_SSI=NO ;; - --without-http_userid_module) HTTP_USERID=NO ;; - --without-http_access_module) HTTP_ACCESS=NO ;; - --without-http_auth_basic_module) HTTP_AUTH_BASIC=NO ;; - --without-http_mirror_module) HTTP_MIRROR=NO ;; - --without-http_autoindex_module) HTTP_AUTOINDEX=NO ;; - --without-http_status_module) HTTP_STATUS=NO ;; - --without-http_geo_module) HTTP_GEO=NO ;; - --without-http_map_module) HTTP_MAP=NO ;; - --without-http_split_clients_module) HTTP_SPLIT_CLIENTS=NO ;; - --without-http_referer_module) HTTP_REFERER=NO ;; - --without-http_rewrite_module) HTTP_REWRITE=NO ;; - --without-http_proxy_module) HTTP_PROXY=NO ;; - --without-http_fastcgi_module) HTTP_FASTCGI=NO ;; - --without-http_uwsgi_module) HTTP_UWSGI=NO ;; - --without-http_scgi_module) HTTP_SCGI=NO ;; - --without-http_grpc_module) HTTP_GRPC=NO ;; - --without-http_memcached_module) HTTP_MEMCACHED=NO ;; - --without-http_limit_conn_module) HTTP_LIMIT_CONN=NO ;; - --without-http_limit_req_module) HTTP_LIMIT_REQ=NO ;; - --without-http_empty_gif_module) HTTP_EMPTY_GIF=NO ;; - --without-http_browser_module) HTTP_BROWSER=NO ;; - --without-http_upstream_hash_module) HTTP_UPSTREAM_HASH=NO ;; - --without-http_upstream_ip_hash_module) HTTP_UPSTREAM_IP_HASH=NO ;; - --without-http_upstream_least_conn_module) - HTTP_UPSTREAM_LEAST_CONN=NO ;; - --without-http_upstream_random_module) - HTTP_UPSTREAM_RANDOM=NO ;; - --without-http_upstream_keepalive_module) HTTP_UPSTREAM_KEEPALIVE=NO ;; - --without-http_upstream_zone_module) HTTP_UPSTREAM_ZONE=NO ;; - --without-http_upstream_sticky) HTTP_UPSTREAM_STICKY=NO ;; - - --with-http_perl_module) HTTP_PERL=YES ;; - --with-http_perl_module=dynamic) HTTP_PERL=DYNAMIC ;; - --with-perl_modules_path=*) NGX_PERL_MODULES="$value" ;; - --with-perl=*) NGX_PERL="$value" ;; - - # STUB - --with-http_stub_status_module) HTTP_STUB_STATUS=YES ;; - - --with-mail) MAIL=YES ;; - --with-mail=dynamic) MAIL=DYNAMIC ;; - --with-mail_ssl_module) MAIL_SSL=YES ;; - # STUB - --with-imap) - MAIL=YES - NGX_POST_CONF_MSG="$NGX_POST_CONF_MSG -$0: warning: the \"--with-imap\" option is deprecated, \ -use the \"--with-mail\" option instead" - ;; - --with-imap_ssl_module) - MAIL_SSL=YES - NGX_POST_CONF_MSG="$NGX_POST_CONF_MSG -$0: warning: the \"--with-imap_ssl_module\" option is deprecated, \ -use the \"--with-mail_ssl_module\" option instead" - ;; - --without-mail_pop3_module) MAIL_POP3=NO ;; - --without-mail_imap_module) MAIL_IMAP=NO ;; - --without-mail_smtp_module) MAIL_SMTP=NO ;; - - --with-stream) STREAM=YES ;; - --with-stream=dynamic) STREAM=DYNAMIC ;; - --with-stream_ssl_module) STREAM_SSL=YES ;; - --with-stream_realip_module) STREAM_REALIP=YES ;; - --with-stream_geoip_module) STREAM_GEOIP=YES ;; - --with-stream_geoip_module=dynamic) - STREAM_GEOIP=DYNAMIC ;; - --with-stream_ssl_preread_module) - STREAM_SSL_PREREAD=YES ;; - --without-stream_limit_conn_module) - STREAM_LIMIT_CONN=NO ;; - --without-stream_access_module) STREAM_ACCESS=NO ;; - --without-stream_geo_module) STREAM_GEO=NO ;; - --without-stream_map_module) STREAM_MAP=NO ;; - --without-stream_split_clients_module) - STREAM_SPLIT_CLIENTS=NO ;; - --without-stream_return_module) STREAM_RETURN=NO ;; - --without-stream_pass_module) STREAM_PASS=NO ;; - --without-stream_set_module) STREAM_SET=NO ;; - --without-stream_upstream_hash_module) - STREAM_UPSTREAM_HASH=NO ;; - --without-stream_upstream_least_conn_module) - STREAM_UPSTREAM_LEAST_CONN=NO ;; - --without-stream_upstream_random_module) - STREAM_UPSTREAM_RANDOM=NO ;; - --without-stream_upstream_zone_module) - STREAM_UPSTREAM_ZONE=NO ;; - - --with-google_perftools_module) NGX_GOOGLE_PERFTOOLS=YES ;; - --with-cpp_test_module) NGX_CPP_TEST=YES ;; - - --add-module=*) NGX_ADDONS="$NGX_ADDONS $value" ;; - --add-dynamic-module=*) DYNAMIC_ADDONS="$DYNAMIC_ADDONS $value" ;; - - --with-compat) NGX_COMPAT=YES ;; - - --with-cc=*) CC="$value" ;; - --with-cpp=*) CPP="$value" ;; - --with-cc-opt=*) NGX_CC_OPT="$value" ;; - --with-ld-opt=*) NGX_LD_OPT="$value" ;; - --with-cpu-opt=*) CPU="$value" ;; - --with-debug) NGX_DEBUG=YES ;; - - --without-pcre) USE_PCRE=DISABLED ;; - --with-pcre) USE_PCRE=YES ;; - --with-pcre=*) PCRE="$value" ;; - --with-pcre-opt=*) PCRE_OPT="$value" ;; - --with-pcre-jit) PCRE_JIT=YES ;; - --without-pcre2) PCRE2=DISABLED ;; - - --with-openssl=*) OPENSSL="$value" ;; - --with-openssl-opt=*) OPENSSL_OPT="$value" ;; - - --with-md5=*) - NGX_POST_CONF_MSG="$NGX_POST_CONF_MSG -$0: warning: the \"--with-md5\" option is deprecated" - ;; - --with-md5-opt=*) - NGX_POST_CONF_MSG="$NGX_POST_CONF_MSG -$0: warning: the \"--with-md5-opt\" option is deprecated" - ;; - --with-md5-asm) - NGX_POST_CONF_MSG="$NGX_POST_CONF_MSG -$0: warning: the \"--with-md5-asm\" option is deprecated" - ;; - - --with-sha1=*) - NGX_POST_CONF_MSG="$NGX_POST_CONF_MSG -$0: warning: the \"--with-sha1\" option is deprecated" - ;; - --with-sha1-opt=*) - NGX_POST_CONF_MSG="$NGX_POST_CONF_MSG -$0: warning: the \"--with-sha1-opt\" option is deprecated" - ;; - --with-sha1-asm) - NGX_POST_CONF_MSG="$NGX_POST_CONF_MSG -$0: warning: the \"--with-sha1-asm\" option is deprecated" - ;; - - --with-zlib=*) ZLIB="$value" ;; - --with-zlib-opt=*) ZLIB_OPT="$value" ;; - --with-zlib-asm=*) ZLIB_ASM="$value" ;; - - --with-libatomic) NGX_LIBATOMIC=YES ;; - --with-libatomic=*) NGX_LIBATOMIC="$value" ;; - - --test-build-devpoll) NGX_TEST_BUILD_DEVPOLL=YES ;; - --test-build-eventport) NGX_TEST_BUILD_EVENTPORT=YES ;; - --test-build-epoll) NGX_TEST_BUILD_EPOLL=YES ;; - --test-build-solaris-sendfilev) NGX_TEST_BUILD_SOLARIS_SENDFILEV=YES ;; - - *) - echo "$0: error: invalid option \"$option\"" - exit 1 - ;; - esac -done - - -NGX_CONFIGURE="$opt" - - -if [ $help = yes ]; then - -cat << END - - --help print this message - - --prefix=PATH set installation prefix - --sbin-path=PATH set nginx binary pathname - --modules-path=PATH set modules path - --conf-path=PATH set nginx.conf pathname - --error-log-path=PATH set error log pathname - --pid-path=PATH set nginx.pid pathname - --lock-path=PATH set nginx.lock pathname - - --user=USER set non-privileged user for - worker processes - --group=GROUP set non-privileged group for - worker processes - - --build=NAME set build name - --builddir=DIR set build directory - - --with-select_module enable select module - --without-select_module disable select module - --with-poll_module enable poll module - --without-poll_module disable poll module - - --with-threads enable thread pool support - - --with-file-aio enable file AIO support - - --without-quic_bpf_module disable ngx_quic_bpf_module - - --with-http_ssl_module enable ngx_http_ssl_module - --with-http_v2_module enable ngx_http_v2_module - --with-http_v3_module enable ngx_http_v3_module - --with-http_realip_module enable ngx_http_realip_module - --with-http_addition_module enable ngx_http_addition_module - --with-http_xslt_module enable ngx_http_xslt_module - --with-http_xslt_module=dynamic enable dynamic ngx_http_xslt_module - --with-http_image_filter_module enable ngx_http_image_filter_module - --with-http_image_filter_module=dynamic - enable dynamic ngx_http_image_filter_module - --with-http_geoip_module enable ngx_http_geoip_module - --with-http_geoip_module=dynamic enable dynamic ngx_http_geoip_module - --with-http_sub_module enable ngx_http_sub_module - --with-http_dav_module enable ngx_http_dav_module - --with-http_flv_module enable ngx_http_flv_module - --with-http_mp4_module enable ngx_http_mp4_module - --with-http_gunzip_module enable ngx_http_gunzip_module - --with-http_gzip_static_module enable ngx_http_gzip_static_module - --with-http_auth_request_module enable ngx_http_auth_request_module - --with-http_random_index_module enable ngx_http_random_index_module - --with-http_secure_link_module enable ngx_http_secure_link_module - --with-http_degradation_module enable ngx_http_degradation_module - --with-http_slice_module enable ngx_http_slice_module - --with-http_stub_status_module enable ngx_http_stub_status_module - - --without-http_charset_module disable ngx_http_charset_module - --without-http_gzip_module disable ngx_http_gzip_module - --without-http_ssi_module disable ngx_http_ssi_module - --without-http_userid_module disable ngx_http_userid_module - --without-http_access_module disable ngx_http_access_module - --without-http_auth_basic_module disable ngx_http_auth_basic_module - --without-http_mirror_module disable ngx_http_mirror_module - --without-http_autoindex_module disable ngx_http_autoindex_module - --without-http_geo_module disable ngx_http_geo_module - --without-http_map_module disable ngx_http_map_module - --without-http_split_clients_module disable ngx_http_split_clients_module - --without-http_referer_module disable ngx_http_referer_module - --without-http_rewrite_module disable ngx_http_rewrite_module - --without-http_proxy_module disable ngx_http_proxy_module - --without-http_fastcgi_module disable ngx_http_fastcgi_module - --without-http_uwsgi_module disable ngx_http_uwsgi_module - --without-http_scgi_module disable ngx_http_scgi_module - --without-http_grpc_module disable ngx_http_grpc_module - --without-http_memcached_module disable ngx_http_memcached_module - --without-http_limit_conn_module disable ngx_http_limit_conn_module - --without-http_limit_req_module disable ngx_http_limit_req_module - --without-http_empty_gif_module disable ngx_http_empty_gif_module - --without-http_browser_module disable ngx_http_browser_module - --without-http_upstream_hash_module - disable ngx_http_upstream_hash_module - --without-http_upstream_ip_hash_module - disable ngx_http_upstream_ip_hash_module - --without-http_upstream_least_conn_module - disable ngx_http_upstream_least_conn_module - --without-http_upstream_random_module - disable ngx_http_upstream_random_module - --without-http_upstream_keepalive_module - disable ngx_http_upstream_keepalive_module - --without-http_upstream_zone_module - disable ngx_http_upstream_zone_module - --without-http_upstream_sticky disable sticky upstream modules - - --with-http_perl_module enable ngx_http_perl_module - --with-http_perl_module=dynamic enable dynamic ngx_http_perl_module - --with-perl_modules_path=PATH set Perl modules path - --with-perl=PATH set perl binary pathname - - --http-log-path=PATH set http access log pathname - --http-client-body-temp-path=PATH set path to store - http client request body temporary files - --http-proxy-temp-path=PATH set path to store - http proxy temporary files - --http-fastcgi-temp-path=PATH set path to store - http fastcgi temporary files - --http-uwsgi-temp-path=PATH set path to store - http uwsgi temporary files - --http-scgi-temp-path=PATH set path to store - http scgi temporary files - - --without-http disable HTTP server - --without-http-cache disable HTTP cache - - --with-mail enable POP3/IMAP4/SMTP proxy module - --with-mail=dynamic enable dynamic POP3/IMAP4/SMTP proxy module - --with-mail_ssl_module enable ngx_mail_ssl_module - --without-mail_pop3_module disable ngx_mail_pop3_module - --without-mail_imap_module disable ngx_mail_imap_module - --without-mail_smtp_module disable ngx_mail_smtp_module - - --with-stream enable TCP/UDP proxy module - --with-stream=dynamic enable dynamic TCP/UDP proxy module - --with-stream_ssl_module enable ngx_stream_ssl_module - --with-stream_realip_module enable ngx_stream_realip_module - --with-stream_geoip_module enable ngx_stream_geoip_module - --with-stream_geoip_module=dynamic enable dynamic ngx_stream_geoip_module - --with-stream_ssl_preread_module enable ngx_stream_ssl_preread_module - --without-stream_limit_conn_module disable ngx_stream_limit_conn_module - --without-stream_access_module disable ngx_stream_access_module - --without-stream_geo_module disable ngx_stream_geo_module - --without-stream_map_module disable ngx_stream_map_module - --without-stream_split_clients_module - disable ngx_stream_split_clients_module - --without-stream_return_module disable ngx_stream_return_module - --without-stream_pass_module disable ngx_stream_pass_module - --without-stream_set_module disable ngx_stream_set_module - --without-stream_upstream_hash_module - disable ngx_stream_upstream_hash_module - --without-stream_upstream_least_conn_module - disable ngx_stream_upstream_least_conn_module - --without-stream_upstream_random_module - disable ngx_stream_upstream_random_module - --without-stream_upstream_zone_module - disable ngx_stream_upstream_zone_module - - --with-google_perftools_module enable ngx_google_perftools_module - --with-cpp_test_module enable ngx_cpp_test_module - - --add-module=PATH enable external module - --add-dynamic-module=PATH enable dynamic external module - - --with-compat dynamic modules compatibility - - --with-cc=PATH set C compiler pathname - --with-cpp=PATH set C preprocessor pathname - --with-cc-opt=OPTIONS set additional C compiler options - --with-ld-opt=OPTIONS set additional linker options - --with-cpu-opt=CPU build for the specified CPU, valid values: - pentium, pentiumpro, pentium3, pentium4, - athlon, opteron, sparc32, sparc64, ppc64 - - --without-pcre disable PCRE library usage - --with-pcre force PCRE library usage - --with-pcre=DIR set path to PCRE library sources - --with-pcre-opt=OPTIONS set additional build options for PCRE - --with-pcre-jit build PCRE with JIT compilation support - --without-pcre2 do not use PCRE2 library - - --with-zlib=DIR set path to zlib library sources - --with-zlib-opt=OPTIONS set additional build options for zlib - --with-zlib-asm=CPU use zlib assembler sources optimized - for the specified CPU, valid values: - pentium, pentiumpro - - --with-libatomic force libatomic_ops library usage - --with-libatomic=DIR set path to libatomic_ops library sources - - --with-openssl=DIR set path to OpenSSL library sources - --with-openssl-opt=OPTIONS set additional build options for OpenSSL - - --with-debug enable debug logging - -END - - exit 1 -fi - - -if [ ".$NGX_PLATFORM" = ".win32" ]; then - NGX_WINE=$WINE -fi - - -NGX_SBIN_PATH=${NGX_SBIN_PATH:-sbin/nginx} -NGX_MODULES_PATH=${NGX_MODULES_PATH:-modules} -NGX_CONF_PATH=${NGX_CONF_PATH:-conf/nginx.conf} -NGX_CONF_PREFIX=`dirname $NGX_CONF_PATH` -NGX_PID_PATH=${NGX_PID_PATH:-logs/nginx.pid} -NGX_LOCK_PATH=${NGX_LOCK_PATH:-logs/nginx.lock} - -if [ ".$NGX_ERROR_LOG_PATH" = ".stderr" ]; then - NGX_ERROR_LOG_PATH= -else - NGX_ERROR_LOG_PATH=${NGX_ERROR_LOG_PATH:-logs/error.log} -fi - -NGX_HTTP_LOG_PATH=${NGX_HTTP_LOG_PATH:-logs/access.log} -NGX_HTTP_CLIENT_TEMP_PATH=${NGX_HTTP_CLIENT_TEMP_PATH:-client_body_temp} -NGX_HTTP_PROXY_TEMP_PATH=${NGX_HTTP_PROXY_TEMP_PATH:-proxy_temp} -NGX_HTTP_FASTCGI_TEMP_PATH=${NGX_HTTP_FASTCGI_TEMP_PATH:-fastcgi_temp} -NGX_HTTP_UWSGI_TEMP_PATH=${NGX_HTTP_UWSGI_TEMP_PATH:-uwsgi_temp} -NGX_HTTP_SCGI_TEMP_PATH=${NGX_HTTP_SCGI_TEMP_PATH:-scgi_temp} - -case ".$NGX_PERL_MODULES" in - ./*) - ;; - - .) - ;; - - *) - NGX_PERL_MODULES=$NGX_PREFIX/$NGX_PERL_MODULES - ;; -esac diff --git a/src/deps/src/nginx-1.30.3/auto/os/conf b/src/deps/src/nginx-1.30.3/auto/os/conf deleted file mode 100644 index bb0ce4ef2b..0000000000 --- a/src/deps/src/nginx-1.30.3/auto/os/conf +++ /dev/null @@ -1,144 +0,0 @@ - -# Copyright (C) Igor Sysoev -# Copyright (C) Nginx, Inc. - - -echo "checking for $NGX_SYSTEM specific features" - -case "$NGX_PLATFORM" in - - FreeBSD:*) - . auto/os/freebsd - ;; - - Linux:*) - . auto/os/linux - ;; - - SunOS:*) - . auto/os/solaris - ;; - - Darwin:*) - . auto/os/darwin - ;; - - win32) - . auto/os/win32 - ;; - - DragonFly:*) - have=NGX_FREEBSD . auto/have_headers - CORE_INCS="$UNIX_INCS" - CORE_DEPS="$UNIX_DEPS $FREEBSD_DEPS" - CORE_SRCS="$UNIX_SRCS $FREEBSD_SRCS" - - echo " + sendfile() found" - have=NGX_HAVE_SENDFILE . auto/have - CORE_SRCS="$CORE_SRCS $FREEBSD_SENDFILE_SRCS" - - ngx_spacer=' -' - ;; - - NetBSD:*) - CORE_INCS="$UNIX_INCS" - CORE_DEPS="$UNIX_DEPS $POSIX_DEPS" - CORE_SRCS="$UNIX_SRCS" - - NGX_RPATH=YES - ;; - - HP-UX:*) - # HP/UX - have=NGX_HPUX . auto/have_headers - CORE_INCS="$UNIX_INCS" - CORE_DEPS="$UNIX_DEPS $POSIX_DEPS" - CORE_SRCS="$UNIX_SRCS" - CC_AUX_FLAGS="$CC_AUX_FLAGS -D_XOPEN_SOURCE -D_XOPEN_SOURCE_EXTENDED=1" - CC_AUX_FLAGS="$CC_AUX_FLAGS -D_HPUX_ALT_XOPEN_SOCKET_API" - ;; - - OSF1:*) - # Tru64 UNIX - have=NGX_TRU64 . auto/have_headers - have=NGX_HAVE_STRERROR_R . auto/nohave - CORE_INCS="$UNIX_INCS" - CORE_DEPS="$UNIX_DEPS $POSIX_DEPS" - CORE_SRCS="$UNIX_SRCS" - ;; - - GNU:*) - # GNU Hurd - have=NGX_GNU_HURD . auto/have_headers - CORE_INCS="$UNIX_INCS" - CORE_DEPS="$UNIX_DEPS $POSIX_DEPS" - CORE_SRCS="$UNIX_SRCS" - CC_AUX_FLAGS="$CC_AUX_FLAGS -D_GNU_SOURCE -D_FILE_OFFSET_BITS=64" - ;; - - *) - CORE_INCS="$UNIX_INCS" - CORE_DEPS="$UNIX_DEPS $POSIX_DEPS" - CORE_SRCS="$UNIX_SRCS" - ;; - -esac - - -case "$NGX_MACHINE" in - - i386 | i686 | i86pc) - have=NGX_HAVE_NONALIGNED . auto/have - NGX_MACH_CACHE_LINE=32 - ;; - - amd64 | x86_64) - have=NGX_HAVE_NONALIGNED . auto/have - NGX_MACH_CACHE_LINE=64 - ;; - - sun4u | sun4v | sparc | sparc64) - have=NGX_ALIGNMENT value=16 . auto/define - # TODO - NGX_MACH_CACHE_LINE=64 - ;; - - ia64 ) - have=NGX_ALIGNMENT value=16 . auto/define - # TODO - NGX_MACH_CACHE_LINE=64 - ;; - - aarch64 | arm64) - have=NGX_ALIGNMENT value=16 . auto/define - NGX_MACH_CACHE_LINE=64 - ;; - - ppc64* | powerpc64*) - have=NGX_ALIGNMENT value=16 . auto/define - NGX_MACH_CACHE_LINE=128 - ;; - - riscv64) - have=NGX_ALIGNMENT value=16 . auto/define - NGX_MACH_CACHE_LINE=64 - ;; - - s390x) - have=NGX_ALIGNMENT value=16 . auto/define - NGX_MACH_CACHE_LINE=256 - ;; - - *) - have=NGX_ALIGNMENT value=16 . auto/define - NGX_MACH_CACHE_LINE=32 - ;; - -esac - -if test -z "$NGX_CPU_CACHE_LINE"; then - NGX_CPU_CACHE_LINE=$NGX_MACH_CACHE_LINE -fi - -have=NGX_CPU_CACHE_LINE value=$NGX_CPU_CACHE_LINE . auto/define diff --git a/src/deps/src/nginx-1.30.3/auto/os/darwin b/src/deps/src/nginx-1.30.3/auto/os/darwin deleted file mode 100644 index 0ede28d0ac..0000000000 --- a/src/deps/src/nginx-1.30.3/auto/os/darwin +++ /dev/null @@ -1,136 +0,0 @@ - -# Copyright (C) Igor Sysoev -# Copyright (C) Nginx, Inc. - - -have=NGX_DARWIN . auto/have_headers - -CORE_INCS="$UNIX_INCS" -CORE_DEPS="$UNIX_DEPS $DARWIN_DEPS" -CORE_SRCS="$UNIX_SRCS $DARWIN_SRCS" - - - -ngx_spacer=' -' - -MAIN_LINK= -MODULE_LINK="-shared -Wl,-undefined,dynamic_lookup" - -CC_AUX_FLAGS="$CC_AUX_FLAGS -D__APPLE_USE_RFC_3542" - - -# kqueue - -echo " + kqueue found" -have=NGX_HAVE_KQUEUE . auto/have -have=NGX_HAVE_CLEAR_EVENT . auto/have -EVENT_MODULES="$EVENT_MODULES $KQUEUE_MODULE" -CORE_SRCS="$CORE_SRCS $KQUEUE_SRCS" -EVENT_FOUND=YES -NGX_KQUEUE_CHECKED=YES - -ngx_feature="kqueue's EVFILT_TIMER" -ngx_feature_name="NGX_HAVE_TIMER_EVENT" -ngx_feature_run=yes -ngx_feature_incs="#include - #include " -ngx_feature_path= -ngx_feature_libs= -ngx_feature_test="int kq; - struct kevent kev; - struct timespec ts; - - if ((kq = kqueue()) == -1) return 1; - - kev.ident = 0; - kev.filter = EVFILT_TIMER; - kev.flags = EV_ADD|EV_ENABLE; - kev.fflags = 0; - kev.data = 1000; - kev.udata = 0; - - ts.tv_sec = 0; - ts.tv_nsec = 0; - - if (kevent(kq, &kev, 1, &kev, 1, &ts) == -1) return 1; - - if (kev.flags & EV_ERROR) return 1;" - -. auto/feature - - -ngx_feature="Darwin 64-bit kqueue millisecond timeout bug" -ngx_feature_name=NGX_DARWIN_KEVENT_BUG -ngx_feature_run=bug -ngx_feature_incs="#include - #include " -ngx_feature_path= -ngx_feature_libs= -ngx_feature_test="int kq; - struct kevent kev; - struct timespec ts; - struct timeval tv, tv0; - - kq = kqueue(); - - ts.tv_sec = 0; - ts.tv_nsec = 999000000; - - gettimeofday(&tv, 0); - kevent(kq, NULL, 0, &kev, 1, &ts); - gettimeofday(&tv0, 0); - timersub(&tv0, &tv, &tv); - - if (tv.tv_sec * 1000000 + tv.tv_usec < 900000) return 1;" - -. auto/feature - - -# sendfile() - -ngx_feature="sendfile()" -ngx_feature_name="NGX_HAVE_SENDFILE" -ngx_feature_run=yes -ngx_feature_incs="#include - #include - #include - #include " -ngx_feature_path= -ngx_feature_libs= -ngx_feature_test="int s = 0, fd = 1; - off_t n; off_t off = 0; - n = sendfile(s, fd, off, &n, NULL, 0); - if (n == -1 && errno == ENOSYS) return 1" -. auto/feature - -if [ $ngx_found = yes ]; then - CORE_SRCS="$CORE_SRCS $DARWIN_SENDFILE_SRCS" -fi - - -ngx_feature="atomic(3)" -ngx_feature_name=NGX_DARWIN_ATOMIC -ngx_feature_run=no -ngx_feature_incs="#include " -ngx_feature_path= -ngx_feature_libs= -ngx_feature_test="int32_t lock = 0; - if (!OSAtomicCompareAndSwap32Barrier(0, 1, &lock)) return 1" -. auto/feature - - -ngx_feature="TCP_KEEPALIVE" -ngx_feature_name="NGX_HAVE_KEEPALIVE_TUNABLE" -ngx_feature_run=no -ngx_feature_incs="#include - #include - #include " -ngx_feature_path= -ngx_feature_libs= -ngx_feature_test="setsockopt(0, IPPROTO_TCP, TCP_KEEPALIVE, NULL, 0); - setsockopt(0, IPPROTO_TCP, TCP_KEEPINTVL, NULL, 0); - setsockopt(0, IPPROTO_TCP, TCP_KEEPCNT, NULL, 0)" -. auto/feature - -NGX_KEEPALIVE_CHECKED=YES diff --git a/src/deps/src/nginx-1.30.3/auto/os/freebsd b/src/deps/src/nginx-1.30.3/auto/os/freebsd deleted file mode 100644 index 870bac4b3e..0000000000 --- a/src/deps/src/nginx-1.30.3/auto/os/freebsd +++ /dev/null @@ -1,105 +0,0 @@ - -# Copyright (C) Igor Sysoev -# Copyright (C) Nginx, Inc. - - -have=NGX_FREEBSD . auto/have_headers - -CORE_INCS="$UNIX_INCS" -CORE_DEPS="$UNIX_DEPS $FREEBSD_DEPS" -CORE_SRCS="$UNIX_SRCS $FREEBSD_SRCS" - -ngx_spacer=' -' - - -# __FreeBSD_version and sysctl kern.osreldate are the best ways -# to determine whether some capability exists and is safe to use. -# __FreeBSD_version is used for the testing of the build environment. -# sysctl kern.osreldate is used for the testing of the kernel capabilities. - -version=`grep "#define __FreeBSD_version" /usr/include/osreldate.h \ - | sed -e 's/^.* \(.*\)$/\1/'` - -osreldate=`/sbin/sysctl -n kern.osreldate` - - -# setproctitle() in libutil - -if [ \( $version -ge 500000 -a $version -lt 500012 \) \ - -o $version -lt 410002 ] -then - echo " + setproctitle() in libutil" - - CORE_LIBS="$CORE_LIBS -lutil" - NGX_SETPROCTITLE_LIB="-lutil" -fi - -# sendfile - -if [ $osreldate -gt 300007 ]; then - echo " + sendfile() found" - - have=NGX_HAVE_SENDFILE . auto/have - CORE_SRCS="$CORE_SRCS $FREEBSD_SENDFILE_SRCS" -fi - -if [ $osreldate -gt 1100093 ]; then - echo " + sendfile()'s SF_NODISKIO found" - - have=NGX_HAVE_SENDFILE_NODISKIO . auto/have -fi - -# POSIX semaphores -# http://www.freebsd.org/cgi/query-pr.cgi?pr=kern/127545 - -if [ $osreldate -ge 701106 ]; then - echo " + POSIX semaphores should work" -else - have=NGX_HAVE_POSIX_SEM . auto/nohave -fi - - -# kqueue - -if [ \( $osreldate -lt 500000 -a $osreldate -ge 410000 \) \ - -o $osreldate -ge 500011 ] -then - echo " + kqueue found" - - have=NGX_HAVE_KQUEUE . auto/have - have=NGX_HAVE_CLEAR_EVENT . auto/have - EVENT_MODULES="$EVENT_MODULES $KQUEUE_MODULE" - CORE_SRCS="$CORE_SRCS $KQUEUE_SRCS" - EVENT_FOUND=YES -fi - - -NGX_KQUEUE_CHECKED=YES - - -# kqueue's NOTE_LOWAT - -if [ \( $version -lt 500000 -a $version -ge 430000 \) \ - -o $version -ge 500018 ] -then - echo " + kqueue's NOTE_LOWAT found" - have=NGX_HAVE_LOWAT_EVENT . auto/have -fi - -# kqueue's EVFILT_TIMER - -if [ \( $version -lt 500000 -a $version -ge 440001 \) \ - -o $version -ge 500023 ] -then - echo " + kqueue's EVFILT_TIMER found" - have=NGX_HAVE_TIMER_EVENT . auto/have -fi - - -# cpuset_setaffinity() - -if [ $version -ge 701000 ]; then - echo " + cpuset_setaffinity() found" - have=NGX_HAVE_CPUSET_SETAFFINITY . auto/have -fi diff --git a/src/deps/src/nginx-1.30.3/auto/os/linux b/src/deps/src/nginx-1.30.3/auto/os/linux deleted file mode 100644 index bc0556b3a1..0000000000 --- a/src/deps/src/nginx-1.30.3/auto/os/linux +++ /dev/null @@ -1,298 +0,0 @@ - -# Copyright (C) Igor Sysoev -# Copyright (C) Nginx, Inc. - - -have=NGX_LINUX . auto/have_headers - -CORE_INCS="$UNIX_INCS" -CORE_DEPS="$UNIX_DEPS $LINUX_DEPS" -CORE_SRCS="$UNIX_SRCS $LINUX_SRCS" - -ngx_spacer=' -' - -cc_aux_flags="$CC_AUX_FLAGS" -CC_AUX_FLAGS="$cc_aux_flags -D_GNU_SOURCE -D_FILE_OFFSET_BITS=64" - - -# Linux kernel version - -version=$((`uname -r \ - | sed -n -e 's/^\([0-9][0-9]*\)\.\([0-9][0-9]*\)\.\([0-9][0-9]*\).*/ \ - \1*256*256+\2*256+\3/p' \ - -e 's/^\([0-9][0-9]*\)\.\([0-9][0-9]*\).*/\1*256*256+\2*256/p'`)) - -version=${version:-0} - - -# posix_fadvise64() had been implemented in 2.5.60 - -if [ $version -lt 132412 ]; then - have=NGX_HAVE_POSIX_FADVISE . auto/nohave -fi - -# epoll, EPOLLET version - -ngx_feature="epoll" -ngx_feature_name="NGX_HAVE_EPOLL" -ngx_feature_run=yes -ngx_feature_incs="#include " -ngx_feature_path= -ngx_feature_libs= -ngx_feature_test="int efd = 0; - struct epoll_event ee; - ee.events = EPOLLIN|EPOLLOUT|EPOLLET; - ee.data.ptr = NULL; - (void) ee; - efd = epoll_create(100); - if (efd == -1) return 1;" -. auto/feature - -if [ $ngx_found = yes ]; then - have=NGX_HAVE_CLEAR_EVENT . auto/have - CORE_SRCS="$CORE_SRCS $EPOLL_SRCS" - EVENT_MODULES="$EVENT_MODULES $EPOLL_MODULE" - EVENT_FOUND=YES - - - # EPOLLRDHUP appeared in Linux 2.6.17, glibc 2.8 - - ngx_feature="EPOLLRDHUP" - ngx_feature_name="NGX_HAVE_EPOLLRDHUP" - ngx_feature_run=no - ngx_feature_incs="#include " - ngx_feature_path= - ngx_feature_libs= - ngx_feature_test="int efd = 0, fd = 0; - struct epoll_event ee; - ee.events = EPOLLIN|EPOLLRDHUP|EPOLLET; - ee.data.ptr = NULL; - epoll_ctl(efd, EPOLL_CTL_ADD, fd, &ee)" - . auto/feature - - - # EPOLLEXCLUSIVE appeared in Linux 4.5, glibc 2.24 - - ngx_feature="EPOLLEXCLUSIVE" - ngx_feature_name="NGX_HAVE_EPOLLEXCLUSIVE" - ngx_feature_run=no - ngx_feature_incs="#include " - ngx_feature_path= - ngx_feature_libs= - ngx_feature_test="int efd = 0, fd = 0; - struct epoll_event ee; - ee.events = EPOLLIN|EPOLLEXCLUSIVE; - ee.data.ptr = NULL; - epoll_ctl(efd, EPOLL_CTL_ADD, fd, &ee)" - . auto/feature - - - # eventfd() - - ngx_feature="eventfd()" - ngx_feature_name="NGX_HAVE_EVENTFD" - ngx_feature_run=no - ngx_feature_incs="#include " - ngx_feature_path= - ngx_feature_libs= - ngx_feature_test="(void) eventfd(0, 0)" - . auto/feature - - if [ $ngx_found = yes ]; then - have=NGX_HAVE_SYS_EVENTFD_H . auto/have - fi - - - if [ $ngx_found = no ]; then - - ngx_feature="eventfd() (SYS_eventfd)" - ngx_feature_incs="#include " - ngx_feature_test="(void) SYS_eventfd" - . auto/feature - fi -fi - - -# O_PATH and AT_EMPTY_PATH were introduced in 2.6.39, glibc 2.14 - -ngx_feature="O_PATH" -ngx_feature_name="NGX_HAVE_O_PATH" -ngx_feature_run=no -ngx_feature_incs="#include - #include - #include " -ngx_feature_path= -ngx_feature_libs= -ngx_feature_test="int fd; struct stat sb; - fd = openat(AT_FDCWD, \".\", O_PATH|O_DIRECTORY|O_NOFOLLOW); - if (fstatat(fd, \"\", &sb, AT_EMPTY_PATH) != 0) return 1" -. auto/feature - - -# sendfile() - -CC_AUX_FLAGS="$cc_aux_flags -D_GNU_SOURCE" -ngx_feature="sendfile()" -ngx_feature_name="NGX_HAVE_SENDFILE" -ngx_feature_run=yes -ngx_feature_incs="#include - #include " -ngx_feature_path= -ngx_feature_libs= -ngx_feature_test="int s = 0, fd = 1; - ssize_t n; off_t off = 0; - n = sendfile(s, fd, &off, 1); - if (n == -1 && errno == ENOSYS) return 1" -. auto/feature - -if [ $ngx_found = yes ]; then - CORE_SRCS="$CORE_SRCS $LINUX_SENDFILE_SRCS" -fi - - -# sendfile64() - -CC_AUX_FLAGS="$cc_aux_flags -D_GNU_SOURCE -D_FILE_OFFSET_BITS=64" -ngx_feature="sendfile64()" -ngx_feature_name="NGX_HAVE_SENDFILE64" -ngx_feature_run=yes -ngx_feature_incs="#include - #include " -ngx_feature_path= -ngx_feature_libs= -ngx_feature_test="int s = 0, fd = 1; - ssize_t n; off_t off = 0; - n = sendfile(s, fd, &off, 1); - if (n == -1 && errno == ENOSYS) return 1" -. auto/feature - - -ngx_include="sys/prctl.h"; . auto/include - -# prctl(PR_SET_DUMPABLE) - -ngx_feature="prctl(PR_SET_DUMPABLE)" -ngx_feature_name="NGX_HAVE_PR_SET_DUMPABLE" -ngx_feature_run=yes -ngx_feature_incs="#include " -ngx_feature_path= -ngx_feature_libs= -ngx_feature_test="if (prctl(PR_SET_DUMPABLE, 1, 0, 0, 0) == -1) return 1" -. auto/feature - - -# prctl(PR_SET_KEEPCAPS) - -ngx_feature="prctl(PR_SET_KEEPCAPS)" -ngx_feature_name="NGX_HAVE_PR_SET_KEEPCAPS" -ngx_feature_run=yes -ngx_feature_incs="#include " -ngx_feature_path= -ngx_feature_libs= -ngx_feature_test="if (prctl(PR_SET_KEEPCAPS, 1, 0, 0, 0) == -1) return 1" -. auto/feature - - -# capabilities - -ngx_feature="capabilities" -ngx_feature_name="NGX_HAVE_CAPABILITIES" -ngx_feature_run=no -ngx_feature_incs="#include - #include " -ngx_feature_path= -ngx_feature_libs= -ngx_feature_test="struct __user_cap_data_struct data; - struct __user_cap_header_struct header; - - header.version = _LINUX_CAPABILITY_VERSION_1; - data.effective = CAP_TO_MASK(CAP_NET_RAW); - data.permitted = 0; - - (void) header; - (void) data; - (void) SYS_capset" -. auto/feature - - -# crypt_r() - -ngx_feature="crypt_r()" -ngx_feature_name="NGX_HAVE_GNU_CRYPT_R" -ngx_feature_run=no -ngx_feature_incs="#include " -ngx_feature_path= -ngx_feature_libs=-lcrypt -ngx_feature_test="struct crypt_data cd; - crypt_r(\"key\", \"salt\", &cd);" -. auto/feature - -if [ $ngx_found = yes ]; then - CRYPT_LIB="-lcrypt" -fi - - -ngx_include="sys/vfs.h"; . auto/include - - -# BPF sockhash - -ngx_feature="BPF sockhash" -ngx_feature_name="NGX_HAVE_BPF" -ngx_feature_run=no -ngx_feature_incs="#include - #include " -ngx_feature_path= -ngx_feature_libs= -ngx_feature_test="union bpf_attr attr = { 0 }; - - attr.map_flags = 0; - attr.map_type = BPF_MAP_TYPE_SOCKHASH; - - syscall(__NR_bpf, 0, &attr, 0);" -. auto/feature - -if [ $ngx_found = yes ]; then - CORE_SRCS="$CORE_SRCS src/core/ngx_bpf.c" - CORE_DEPS="$CORE_DEPS src/core/ngx_bpf.h" - - if [ $QUIC_BPF != NONE ]; then - QUIC_BPF=YES - fi -fi - - -ngx_feature="SO_COOKIE" -ngx_feature_name="NGX_HAVE_SO_COOKIE" -ngx_feature_run=no -ngx_feature_incs="#include - $NGX_INCLUDE_INTTYPES_H" -ngx_feature_path= -ngx_feature_libs= -ngx_feature_test="socklen_t optlen = sizeof(uint64_t); - uint64_t cookie; - getsockopt(0, SOL_SOCKET, SO_COOKIE, &cookie, &optlen)" -. auto/feature - -if [ $ngx_found = yes ]; then - SO_COOKIE_FOUND=YES -fi - - -# UDP segmentation offloading - -ngx_feature="UDP_SEGMENT" -ngx_feature_name="NGX_HAVE_UDP_SEGMENT" -ngx_feature_run=no -ngx_feature_incs="#include - #include " -ngx_feature_path= -ngx_feature_libs= -ngx_feature_test="socklen_t optlen = sizeof(int); - int val; - getsockopt(0, SOL_UDP, UDP_SEGMENT, &val, &optlen)" -. auto/feature - - -CC_AUX_FLAGS="$cc_aux_flags -D_GNU_SOURCE -D_FILE_OFFSET_BITS=64" diff --git a/src/deps/src/nginx-1.30.3/auto/os/solaris b/src/deps/src/nginx-1.30.3/auto/os/solaris deleted file mode 100644 index 1dcfe84620..0000000000 --- a/src/deps/src/nginx-1.30.3/auto/os/solaris +++ /dev/null @@ -1,61 +0,0 @@ - -# Copyright (C) Igor Sysoev -# Copyright (C) Nginx, Inc. - - -have=NGX_SOLARIS . auto/have_headers - -CORE_INCS="$UNIX_INCS" -CORE_DEPS="$UNIX_DEPS $SOLARIS_DEPS" -CORE_SRCS="$UNIX_SRCS $SOLARIS_SRCS " -CORE_LIBS="$CORE_LIBS -lsocket -lnsl" - -NGX_RPATH=YES - -# Solaris's make does not support a blank line between target and rules -ngx_spacer= - -CC_AUX_FLAGS="$CC_AUX_FLAGS -D_FILE_OFFSET_BITS=64 -lsocket -lnsl" - - -if [ $ZLIB_ASM != NO ]; then - echo "$0: error: the --with-zlib-asm=CPU option is not supported" - echo "on that platform" - echo - - exit 1 -fi - - -ngx_feature="sendfilev()" -ngx_feature_name="NGX_HAVE_SENDFILE" -ngx_feature_run=no -ngx_feature_incs="#include " -ngx_feature_path= -ngx_feature_libs="-lsendfile" -ngx_feature_test="int fd = 1; sendfilevec_t vec[1]; - size_t sent; ssize_t n; - n = sendfilev(fd, vec, 1, &sent); - if (n == -1) return 1" -. auto/feature - - -if [ $ngx_found = yes ]; then - CORE_SRCS="$CORE_SRCS $SOLARIS_SENDFILEV_SRCS" - CORE_LIBS="$CORE_LIBS -lsendfile" -fi - - -ngx_feature="event ports" -ngx_feature_name="NGX_HAVE_EVENTPORT" -ngx_feature_run=no -ngx_feature_incs="#include " -ngx_feature_path= -ngx_feature_libs= -ngx_feature_test="(void) port_create()" -. auto/feature - -if [ $ngx_found = yes ]; then - CORE_SRCS="$CORE_SRCS $EVENTPORT_SRCS" - EVENT_MODULES="$EVENT_MODULES $EVENTPORT_MODULE" -fi diff --git a/src/deps/src/nginx-1.30.3/auto/os/win32 b/src/deps/src/nginx-1.30.3/auto/os/win32 deleted file mode 100644 index bce764b54b..0000000000 --- a/src/deps/src/nginx-1.30.3/auto/os/win32 +++ /dev/null @@ -1,39 +0,0 @@ - -# Copyright (C) Igor Sysoev -# Copyright (C) Nginx, Inc. - - -have=NGX_WIN32 . auto/have_headers - -CORE_INCS="$WIN32_INCS" -CORE_DEPS="$WIN32_DEPS" -CORE_SRCS="$WIN32_SRCS $IOCP_SRCS" -OS_CONFIG="$WIN32_CONFIG" -NGX_ICONS="$NGX_WIN32_ICONS" -SELECT_SRCS=$WIN32_SELECT_SRCS -POLL_SRCS=$WIN32_POLL_SRCS - -ngx_pic_opt= -ngx_binext=".exe" - -case "$NGX_CC_NAME" in - - clang | gcc) - CORE_LIBS="$CORE_LIBS -ladvapi32 -lws2_32" - MAIN_LINK="$MAIN_LINK -Wl,--export-all-symbols" - MAIN_LINK="$MAIN_LINK -Wl,--out-implib=$NGX_OBJS/libnginx.a" - MODULE_LINK="-shared -L $NGX_OBJS -lnginx" - ;; - - *) - CORE_LIBS="$CORE_LIBS advapi32.lib ws2_32.lib" - ;; - -esac - -EVENT_MODULES="$EVENT_MODULES $IOCP_MODULE" -#EVENT_FOUND=YES - -have=NGX_HAVE_INET6 . auto/have - -have=NGX_HAVE_IOCP . auto/have diff --git a/src/deps/src/nginx-1.30.3/auto/sources b/src/deps/src/nginx-1.30.3/auto/sources deleted file mode 100644 index 46408ee537..0000000000 --- a/src/deps/src/nginx-1.30.3/auto/sources +++ /dev/null @@ -1,261 +0,0 @@ - -# Copyright (C) Igor Sysoev -# Copyright (C) Nginx, Inc. - - -CORE_MODULES="ngx_core_module ngx_errlog_module ngx_conf_module" - -CORE_INCS="src/core" - -CORE_DEPS="src/core/nginx.h \ - src/core/ngx_config.h \ - src/core/ngx_core.h \ - src/core/ngx_log.h \ - src/core/ngx_palloc.h \ - src/core/ngx_array.h \ - src/core/ngx_list.h \ - src/core/ngx_hash.h \ - src/core/ngx_buf.h \ - src/core/ngx_queue.h \ - src/core/ngx_string.h \ - src/core/ngx_parse.h \ - src/core/ngx_parse_time.h \ - src/core/ngx_inet.h \ - src/core/ngx_file.h \ - src/core/ngx_crc.h \ - src/core/ngx_crc32.h \ - src/core/ngx_murmurhash.h \ - src/core/ngx_md5.h \ - src/core/ngx_sha1.h \ - src/core/ngx_rbtree.h \ - src/core/ngx_radix_tree.h \ - src/core/ngx_rwlock.h \ - src/core/ngx_slab.h \ - src/core/ngx_times.h \ - src/core/ngx_shmtx.h \ - src/core/ngx_connection.h \ - src/core/ngx_cycle.h \ - src/core/ngx_conf_file.h \ - src/core/ngx_module.h \ - src/core/ngx_resolver.h \ - src/core/ngx_open_file_cache.h \ - src/core/ngx_crypt.h \ - src/core/ngx_proxy_protocol.h \ - src/core/ngx_syslog.h" - - -CORE_SRCS="src/core/nginx.c \ - src/core/ngx_log.c \ - src/core/ngx_palloc.c \ - src/core/ngx_array.c \ - src/core/ngx_list.c \ - src/core/ngx_hash.c \ - src/core/ngx_buf.c \ - src/core/ngx_queue.c \ - src/core/ngx_output_chain.c \ - src/core/ngx_string.c \ - src/core/ngx_parse.c \ - src/core/ngx_parse_time.c \ - src/core/ngx_inet.c \ - src/core/ngx_file.c \ - src/core/ngx_crc32.c \ - src/core/ngx_murmurhash.c \ - src/core/ngx_md5.c \ - src/core/ngx_sha1.c \ - src/core/ngx_rbtree.c \ - src/core/ngx_radix_tree.c \ - src/core/ngx_slab.c \ - src/core/ngx_times.c \ - src/core/ngx_shmtx.c \ - src/core/ngx_connection.c \ - src/core/ngx_cycle.c \ - src/core/ngx_spinlock.c \ - src/core/ngx_rwlock.c \ - src/core/ngx_cpuinfo.c \ - src/core/ngx_conf_file.c \ - src/core/ngx_module.c \ - src/core/ngx_resolver.c \ - src/core/ngx_open_file_cache.c \ - src/core/ngx_crypt.c \ - src/core/ngx_proxy_protocol.c \ - src/core/ngx_syslog.c" - - -EVENT_MODULES="ngx_events_module ngx_event_core_module" - -EVENT_INCS="src/event src/event/modules src/event/quic" - -EVENT_DEPS="src/event/ngx_event.h \ - src/event/ngx_event_timer.h \ - src/event/ngx_event_posted.h \ - src/event/ngx_event_connect.h \ - src/event/ngx_event_pipe.h \ - src/event/ngx_event_udp.h" - -EVENT_SRCS="src/event/ngx_event.c \ - src/event/ngx_event_timer.c \ - src/event/ngx_event_posted.c \ - src/event/ngx_event_accept.c \ - src/event/ngx_event_udp.c \ - src/event/ngx_event_connect.c \ - src/event/ngx_event_pipe.c" - - -SELECT_MODULE=ngx_select_module -SELECT_SRCS=src/event/modules/ngx_select_module.c -WIN32_SELECT_SRCS=src/event/modules/ngx_win32_select_module.c - -POLL_MODULE=ngx_poll_module -POLL_SRCS=src/event/modules/ngx_poll_module.c -WIN32_POLL_SRCS=src/event/modules/ngx_win32_poll_module.c - -KQUEUE_MODULE=ngx_kqueue_module -KQUEUE_SRCS=src/event/modules/ngx_kqueue_module.c - -DEVPOLL_MODULE=ngx_devpoll_module -DEVPOLL_SRCS=src/event/modules/ngx_devpoll_module.c - -EVENTPORT_MODULE=ngx_eventport_module -EVENTPORT_SRCS=src/event/modules/ngx_eventport_module.c - -EPOLL_MODULE=ngx_epoll_module -EPOLL_SRCS=src/event/modules/ngx_epoll_module.c - -IOCP_MODULE=ngx_iocp_module -IOCP_SRCS=src/event/modules/ngx_iocp_module.c - -FILE_AIO_SRCS="src/os/unix/ngx_file_aio_read.c" -LINUX_AIO_SRCS="src/os/unix/ngx_linux_aio_read.c" - -UNIX_INCS="$CORE_INCS $EVENT_INCS src/os/unix" - -UNIX_DEPS="$CORE_DEPS $EVENT_DEPS \ - src/os/unix/ngx_time.h \ - src/os/unix/ngx_errno.h \ - src/os/unix/ngx_alloc.h \ - src/os/unix/ngx_files.h \ - src/os/unix/ngx_channel.h \ - src/os/unix/ngx_shmem.h \ - src/os/unix/ngx_process.h \ - src/os/unix/ngx_setaffinity.h \ - src/os/unix/ngx_setproctitle.h \ - src/os/unix/ngx_atomic.h \ - src/os/unix/ngx_gcc_atomic_x86.h \ - src/os/unix/ngx_thread.h \ - src/os/unix/ngx_socket.h \ - src/os/unix/ngx_os.h \ - src/os/unix/ngx_user.h \ - src/os/unix/ngx_dlopen.h \ - src/os/unix/ngx_process_cycle.h" - -# add to UNIX_DEPS -# src/os/unix/ngx_gcc_atomic_amd64.h \ -# src/os/unix/ngx_gcc_atomic_sparc64.h \ -# src/os/unix/ngx_gcc_atomic_ppc.h \ -# src/os/unix/ngx_sunpro_atomic_sparc64.h \ -# src/os/unix/ngx_sunpro_x86.il \ -# src/os/unix/ngx_sunpro_amd64.il \ -# src/os/unix/ngx_sunpro_sparc64.il \ - - -UNIX_SRCS="$CORE_SRCS $EVENT_SRCS \ - src/os/unix/ngx_time.c \ - src/os/unix/ngx_errno.c \ - src/os/unix/ngx_alloc.c \ - src/os/unix/ngx_files.c \ - src/os/unix/ngx_socket.c \ - src/os/unix/ngx_recv.c \ - src/os/unix/ngx_readv_chain.c \ - src/os/unix/ngx_udp_recv.c \ - src/os/unix/ngx_send.c \ - src/os/unix/ngx_writev_chain.c \ - src/os/unix/ngx_udp_send.c \ - src/os/unix/ngx_udp_sendmsg_chain.c \ - src/os/unix/ngx_channel.c \ - src/os/unix/ngx_shmem.c \ - src/os/unix/ngx_process.c \ - src/os/unix/ngx_daemon.c \ - src/os/unix/ngx_setaffinity.c \ - src/os/unix/ngx_setproctitle.c \ - src/os/unix/ngx_posix_init.c \ - src/os/unix/ngx_user.c \ - src/os/unix/ngx_dlopen.c \ - src/os/unix/ngx_process_cycle.c" - -POSIX_DEPS=src/os/unix/ngx_posix_config.h - -THREAD_POOL_MODULE=ngx_thread_pool_module -THREAD_POOL_DEPS=src/core/ngx_thread_pool.h -THREAD_POOL_SRCS="src/core/ngx_thread_pool.c - src/os/unix/ngx_thread_cond.c - src/os/unix/ngx_thread_mutex.c - src/os/unix/ngx_thread_id.c" - -FREEBSD_DEPS="src/os/unix/ngx_freebsd_config.h src/os/unix/ngx_freebsd.h" -FREEBSD_SRCS=src/os/unix/ngx_freebsd_init.c -FREEBSD_SENDFILE_SRCS=src/os/unix/ngx_freebsd_sendfile_chain.c - -LINUX_DEPS="src/os/unix/ngx_linux_config.h src/os/unix/ngx_linux.h" -LINUX_SRCS=src/os/unix/ngx_linux_init.c -LINUX_SENDFILE_SRCS=src/os/unix/ngx_linux_sendfile_chain.c - - -SOLARIS_DEPS="src/os/unix/ngx_solaris_config.h src/os/unix/ngx_solaris.h" -SOLARIS_SRCS=src/os/unix/ngx_solaris_init.c -SOLARIS_SENDFILEV_SRCS=src/os/unix/ngx_solaris_sendfilev_chain.c - - -DARWIN_DEPS="src/os/unix/ngx_darwin_config.h src/os/unix/ngx_darwin.h" -DARWIN_SRCS=src/os/unix/ngx_darwin_init.c -DARWIN_SENDFILE_SRCS=src/os/unix/ngx_darwin_sendfile_chain.c - - -WIN32_INCS="$CORE_INCS $EVENT_INCS src/os/win32" - -WIN32_DEPS="$CORE_DEPS $EVENT_DEPS \ - src/os/win32/ngx_win32_config.h \ - src/os/win32/ngx_time.h \ - src/os/win32/ngx_errno.h \ - src/os/win32/ngx_alloc.h \ - src/os/win32/ngx_files.h \ - src/os/win32/ngx_shmem.h \ - src/os/win32/ngx_process.h \ - src/os/win32/ngx_atomic.h \ - src/os/win32/ngx_thread.h \ - src/os/win32/ngx_socket.h \ - src/os/win32/ngx_os.h \ - src/os/win32/ngx_user.h \ - src/os/win32/ngx_dlopen.h \ - src/os/win32/ngx_process_cycle.h" - -WIN32_CONFIG=src/os/win32/ngx_win32_config.h - -WIN32_SRCS="$CORE_SRCS $EVENT_SRCS \ - src/os/win32/ngx_errno.c \ - src/os/win32/ngx_alloc.c \ - src/os/win32/ngx_files.c \ - src/os/win32/ngx_shmem.c \ - src/os/win32/ngx_time.c \ - src/os/win32/ngx_process.c \ - src/os/win32/ngx_thread.c \ - src/os/win32/ngx_socket.c \ - src/os/win32/ngx_wsarecv.c \ - src/os/win32/ngx_wsarecv_chain.c \ - src/os/win32/ngx_udp_wsarecv.c \ - src/os/win32/ngx_wsasend.c \ - src/os/win32/ngx_wsasend_chain.c \ - src/os/win32/ngx_win32_init.c \ - src/os/win32/ngx_user.c \ - src/os/win32/ngx_dlopen.c \ - src/os/win32/ngx_event_log.c \ - src/os/win32/ngx_process_cycle.c \ - src/event/ngx_event_acceptex.c" - -NGX_WIN32_ICONS="src/os/win32/nginx.ico" -NGX_WIN32_RC="src/os/win32/nginx.rc" - - -HTTP_FILE_CACHE_SRCS=src/http/ngx_http_file_cache.c - -HTTP_HUFF_SRCS="src/http/ngx_http_huff_decode.c - src/http/ngx_http_huff_encode.c" diff --git a/src/deps/src/nginx-1.30.3/auto/stubs b/src/deps/src/nginx-1.30.3/auto/stubs deleted file mode 100644 index d8bc1f0e02..0000000000 --- a/src/deps/src/nginx-1.30.3/auto/stubs +++ /dev/null @@ -1,8 +0,0 @@ - -# Copyright (C) Igor Sysoev -# Copyright (C) Nginx, Inc. - - -have=NGX_SUPPRESS_WARN . auto/have - -have=NGX_SMP . auto/have diff --git a/src/deps/src/nginx-1.30.3/auto/summary b/src/deps/src/nginx-1.30.3/auto/summary deleted file mode 100644 index b3c07eedc2..0000000000 --- a/src/deps/src/nginx-1.30.3/auto/summary +++ /dev/null @@ -1,82 +0,0 @@ - -# Copyright (C) Igor Sysoev -# Copyright (C) Nginx, Inc. - - -echo -echo "Configuration summary" - - -if [ $USE_THREADS = YES ]; then - echo " + using threads" -fi - -if [ $USE_PCRE = DISABLED ]; then - echo " + PCRE library is disabled" - -else - case $PCRE in - YES) echo " + using system $PCRE_LIBRARY library" ;; - NONE) echo " + PCRE library is not used" ;; - *) echo " + using $PCRE_LIBRARY library: $PCRE" ;; - esac -fi - -case $OPENSSL in - YES) echo " + using system OpenSSL library" ;; - NONE) echo " + OpenSSL library is not used" ;; - *) echo " + using OpenSSL library: $OPENSSL" ;; -esac - -case $ZLIB in - YES) echo " + using system zlib library" ;; - NONE) echo " + zlib library is not used" ;; - *) echo " + using zlib library: $ZLIB" ;; -esac - -case $NGX_LIBATOMIC in - YES) echo " + using system libatomic_ops library" ;; - NO) ;; # not used - *) echo " + using libatomic_ops library: $NGX_LIBATOMIC" ;; -esac - -echo - - -cat << END - nginx path prefix: "$NGX_PREFIX" - nginx binary file: "$NGX_SBIN_PATH" - nginx modules path: "$NGX_MODULES_PATH" - nginx configuration prefix: "$NGX_CONF_PREFIX" - nginx configuration file: "$NGX_CONF_PATH" - nginx pid file: "$NGX_PID_PATH" -END - -if test -n "$NGX_ERROR_LOG_PATH"; then - echo " nginx error log file: \"$NGX_ERROR_LOG_PATH\"" -else - echo " nginx logs errors to stderr" -fi - -cat << END - nginx http access log file: "$NGX_HTTP_LOG_PATH" - nginx http client request body temporary files: "$NGX_HTTP_CLIENT_TEMP_PATH" -END - -if [ $HTTP_PROXY = YES ]; then - echo " nginx http proxy temporary files: \"$NGX_HTTP_PROXY_TEMP_PATH\"" -fi - -if [ $HTTP_FASTCGI = YES ]; then - echo " nginx http fastcgi temporary files: \"$NGX_HTTP_FASTCGI_TEMP_PATH\"" -fi - -if [ $HTTP_UWSGI = YES ]; then - echo " nginx http uwsgi temporary files: \"$NGX_HTTP_UWSGI_TEMP_PATH\"" -fi - -if [ $HTTP_SCGI = YES ]; then - echo " nginx http scgi temporary files: \"$NGX_HTTP_SCGI_TEMP_PATH\"" -fi - -echo "$NGX_POST_CONF_MSG" diff --git a/src/deps/src/nginx-1.30.3/auto/threads b/src/deps/src/nginx-1.30.3/auto/threads deleted file mode 100644 index 943127f636..0000000000 --- a/src/deps/src/nginx-1.30.3/auto/threads +++ /dev/null @@ -1,21 +0,0 @@ - -# Copyright (C) Nginx, Inc. - - -if [ $USE_THREADS = YES ]; then - - if [ "$NGX_PLATFORM" = win32 ]; then - cat << END - -$0: --with-threads is not supported on Windows - -END - exit 1 - fi - - have=NGX_THREADS . auto/have - CORE_DEPS="$CORE_DEPS $THREAD_POOL_DEPS" - CORE_SRCS="$CORE_SRCS $THREAD_POOL_SRCS" - CORE_LIBS="$CORE_LIBS -lpthread" - NGX_LIBPTHREAD="-lpthread" -fi diff --git a/src/deps/src/nginx-1.30.3/auto/types/sizeof b/src/deps/src/nginx-1.30.3/auto/types/sizeof deleted file mode 100644 index 480d8cfa49..0000000000 --- a/src/deps/src/nginx-1.30.3/auto/types/sizeof +++ /dev/null @@ -1,76 +0,0 @@ - -# Copyright (C) Igor Sysoev -# Copyright (C) Nginx, Inc. - - -echo $ngx_n "checking for $ngx_type size ...$ngx_c" - -cat << END >> $NGX_AUTOCONF_ERR - ----------------------------------------- -checking for $ngx_type size - -END - -ngx_size= - -cat << END > $NGX_AUTOTEST.c - -#include -#include -$NGX_INCLUDE_UNISTD_H -#include -#include -#include -$NGX_INCLUDE_INTTYPES_H -$NGX_INCLUDE_AUTO_CONFIG_H - -int main(void) { - printf("%d", (int) sizeof($ngx_type)); - return 0; -} - -END - - -ngx_test="$CC $CC_TEST_FLAGS $CC_AUX_FLAGS \ - -o $NGX_AUTOTEST $NGX_AUTOTEST.c $NGX_LD_OPT $ngx_feature_libs" - -eval "$ngx_test >> $NGX_AUTOCONF_ERR 2>&1" - - -if [ -x $NGX_AUTOTEST ]; then - ngx_size=`$NGX_AUTOTEST` - echo " $ngx_size bytes" -fi - - -case $ngx_size in - 4) - ngx_max_value=2147483647 - ngx_max_len='(sizeof("-2147483648") - 1)' - ;; - - 8) - ngx_max_value=9223372036854775807LL - ngx_max_len='(sizeof("-9223372036854775808") - 1)' - ;; - - *) - echo - echo "$0: error: can not detect $ngx_type size" - - echo "----------" >> $NGX_AUTOCONF_ERR - cat $NGX_AUTOTEST.c >> $NGX_AUTOCONF_ERR - echo "----------" >> $NGX_AUTOCONF_ERR - echo $ngx_test >> $NGX_AUTOCONF_ERR - echo "----------" >> $NGX_AUTOCONF_ERR - - rm -rf $NGX_AUTOTEST* - - exit 1 -esac - - -rm -rf $NGX_AUTOTEST* - diff --git a/src/deps/src/nginx-1.30.3/auto/types/typedef b/src/deps/src/nginx-1.30.3/auto/types/typedef deleted file mode 100644 index d54c289786..0000000000 --- a/src/deps/src/nginx-1.30.3/auto/types/typedef +++ /dev/null @@ -1,82 +0,0 @@ - -# Copyright (C) Igor Sysoev -# Copyright (C) Nginx, Inc. - - -echo $ngx_n "checking for $ngx_type ...$ngx_c" - -cat << END >> $NGX_AUTOCONF_ERR - ----------------------------------------- -checking for $ngx_type - -END - -ngx_found=no - -for ngx_try in $ngx_type $ngx_types -do - - cat << END > $NGX_AUTOTEST.c - -#include -#include -#include -#include -#include -#include -$NGX_INCLUDE_INTTYPES_H - -int main(void) { - $ngx_try i = 0; - return (int) i; -} - -END - - ngx_test="$CC $CC_TEST_FLAGS $CC_AUX_FLAGS \ - -o $NGX_AUTOTEST $NGX_AUTOTEST.c $NGX_LD_OPT $ngx_feature_libs" - - eval "$ngx_test >> $NGX_AUTOCONF_ERR 2>&1" - - if [ -x $NGX_AUTOTEST ]; then - if [ $ngx_try = $ngx_type ]; then - echo " found" - ngx_found=yes - else - echo ", $ngx_try used" - ngx_found=$ngx_try - fi - fi - - if [ $ngx_found = no ]; then - if [ $ngx_try = $ngx_type ]; then - echo $ngx_n " $ngx_try not found$ngx_c" - else - echo $ngx_n ", $ngx_try not found$ngx_c" - fi - - echo "----------" >> $NGX_AUTOCONF_ERR - cat $NGX_AUTOTEST.c >> $NGX_AUTOCONF_ERR - echo "----------" >> $NGX_AUTOCONF_ERR - echo $ngx_test >> $NGX_AUTOCONF_ERR - echo "----------" >> $NGX_AUTOCONF_ERR - fi - - rm -rf $NGX_AUTOTEST* - - if [ $ngx_found != no ]; then - break - fi -done - -if [ $ngx_found = no ]; then - echo - echo "$0: error: can not define $ngx_type" - - exit 1 -fi - -if [ $ngx_found != yes ]; then - echo "typedef $ngx_found $ngx_type;" >> $NGX_AUTO_CONFIG_H -fi diff --git a/src/deps/src/nginx-1.30.3/auto/types/uintptr_t b/src/deps/src/nginx-1.30.3/auto/types/uintptr_t deleted file mode 100644 index a33d6d034a..0000000000 --- a/src/deps/src/nginx-1.30.3/auto/types/uintptr_t +++ /dev/null @@ -1,50 +0,0 @@ - -# Copyright (C) Igor Sysoev -# Copyright (C) Nginx, Inc. - - -echo $ngx_n "checking for uintptr_t ...$ngx_c" - -cat << END >> $NGX_AUTOCONF_ERR - ----------------------------------------- -checking for uintptr_t - -END - -found=no - -cat << END > $NGX_AUTOTEST.c - -#include -$NGX_INCLUDE_INTTYPES_H - -int main(void) { - uintptr_t i = 0; - return (int) i; -} - -END - -ngx_test="$CC $CC_TEST_FLAGS $CC_AUX_FLAGS \ - -o $NGX_AUTOTEST $NGX_AUTOTEST.c $NGX_LD_OPT" - -eval "$ngx_test >> $NGX_AUTOCONF_ERR 2>&1" - -if [ -x $NGX_AUTOTEST ]; then - echo " uintptr_t found" - found=yes -else - echo $ngx_n " uintptr_t not found" $ngx_c -fi - -rm -rf $NGX_AUTOTEST* - - -if [ $found = no ]; then - found="uint`expr 8 \* $ngx_ptr_size`_t" - echo ", $found used" - - echo "typedef $found uintptr_t;" >> $NGX_AUTO_CONFIG_H - echo "typedef $found intptr_t;" | sed -e 's/u//g' >> $NGX_AUTO_CONFIG_H -fi diff --git a/src/deps/src/nginx-1.30.3/auto/types/value b/src/deps/src/nginx-1.30.3/auto/types/value deleted file mode 100644 index ac88a3919e..0000000000 --- a/src/deps/src/nginx-1.30.3/auto/types/value +++ /dev/null @@ -1,12 +0,0 @@ - -# Copyright (C) Igor Sysoev -# Copyright (C) Nginx, Inc. - - -cat << END >> $NGX_AUTO_CONFIG_H - -#ifndef $ngx_param -#define $ngx_param $ngx_value -#endif - -END diff --git a/src/deps/src/nginx-1.30.3/auto/unix b/src/deps/src/nginx-1.30.3/auto/unix deleted file mode 100644 index 6087e04fd6..0000000000 --- a/src/deps/src/nginx-1.30.3/auto/unix +++ /dev/null @@ -1,1034 +0,0 @@ - -# Copyright (C) Igor Sysoev -# Copyright (C) Nginx, Inc. - - -NGX_USER=${NGX_USER:-nobody} - -if [ -z "$NGX_GROUP" ]; then - if [ $NGX_USER = nobody ]; then - if grep nobody /etc/group 2>&1 >/dev/null; then - echo "checking for nobody group ... found" - NGX_GROUP=nobody - else - echo "checking for nobody group ... not found" - - if grep nogroup /etc/group 2>&1 >/dev/null; then - echo "checking for nogroup group ... found" - NGX_GROUP=nogroup - else - echo "checking for nogroup group ... not found" - NGX_GROUP=nobody - fi - fi - else - NGX_GROUP=$NGX_USER - fi -fi - - -ngx_feature="poll()" -ngx_feature_name= -ngx_feature_run=no -ngx_feature_incs="#include " -ngx_feature_path= -ngx_feature_libs= -ngx_feature_test="int n; struct pollfd pl; - pl.fd = 0; - pl.events = 0; - pl.revents = 0; - n = poll(&pl, 1, 0); - if (n == -1) return 1" -. auto/feature - -if [ $ngx_found = no ]; then - EVENT_POLL=NONE -fi - - -ngx_feature="/dev/poll" -ngx_feature_name="NGX_HAVE_DEVPOLL" -ngx_feature_run=no -ngx_feature_incs="#include " -ngx_feature_path= -ngx_feature_libs= -ngx_feature_test="int n, dp; struct dvpoll dvp; - dp = 0; - dvp.dp_fds = NULL; - dvp.dp_nfds = 0; - dvp.dp_timeout = 0; - n = ioctl(dp, DP_POLL, &dvp); - if (n == -1) return 1" -. auto/feature - -if [ $ngx_found = yes ]; then - CORE_SRCS="$CORE_SRCS $DEVPOLL_SRCS" - EVENT_MODULES="$EVENT_MODULES $DEVPOLL_MODULE" - EVENT_FOUND=YES -fi - - -if test -z "$NGX_KQUEUE_CHECKED"; then - ngx_feature="kqueue" - ngx_feature_name="NGX_HAVE_KQUEUE" - ngx_feature_run=no - ngx_feature_incs="#include " - ngx_feature_path= - ngx_feature_libs= - ngx_feature_test="(void) kqueue()" - . auto/feature - - if [ $ngx_found = yes ]; then - - have=NGX_HAVE_CLEAR_EVENT . auto/have - EVENT_MODULES="$EVENT_MODULES $KQUEUE_MODULE" - CORE_SRCS="$CORE_SRCS $KQUEUE_SRCS" - EVENT_FOUND=YES - - ngx_feature="kqueue's NOTE_LOWAT" - ngx_feature_name="NGX_HAVE_LOWAT_EVENT" - ngx_feature_run=no - ngx_feature_incs="#include " - ngx_feature_path= - ngx_feature_libs= - ngx_feature_test="struct kevent kev; - kev.fflags = NOTE_LOWAT; - (void) kev" - . auto/feature - - - ngx_feature="kqueue's EVFILT_TIMER" - ngx_feature_name="NGX_HAVE_TIMER_EVENT" - ngx_feature_run=yes - ngx_feature_incs="#include - #include " - ngx_feature_path= - ngx_feature_libs= - ngx_feature_test="int kq; - struct kevent kev; - struct timespec ts; - - if ((kq = kqueue()) == -1) return 1; - - kev.ident = 0; - kev.filter = EVFILT_TIMER; - kev.flags = EV_ADD|EV_ENABLE; - kev.fflags = 0; - kev.data = 1000; - kev.udata = 0; - - ts.tv_sec = 0; - ts.tv_nsec = 0; - - if (kevent(kq, &kev, 1, &kev, 1, &ts) == -1) return 1; - - if (kev.flags & EV_ERROR) return 1;" - - . auto/feature - fi -fi - - -ngx_feature="crypt()" -ngx_feature_name="NGX_HAVE_CRYPT" -ngx_feature_run=no -ngx_feature_incs= -ngx_feature_path= -ngx_feature_libs= -ngx_feature_test="crypt(\"test\", \"salt\");" -. auto/feature - - -if [ $ngx_found = no ]; then - - ngx_feature="crypt() in libcrypt" - ngx_feature_name="NGX_HAVE_CRYPT" - ngx_feature_run=no - ngx_feature_incs= - ngx_feature_path= - ngx_feature_libs=-lcrypt - . auto/feature - - if [ $ngx_found = yes ]; then - CRYPT_LIB="-lcrypt" - fi -fi - - -ngx_feature="F_READAHEAD" -ngx_feature_name="NGX_HAVE_F_READAHEAD" -ngx_feature_run=no -ngx_feature_incs="#include " -ngx_feature_path= -ngx_feature_libs= -ngx_feature_test="fcntl(0, F_READAHEAD, 1);" -. auto/feature - - -ngx_feature="posix_fadvise()" -ngx_feature_name="NGX_HAVE_POSIX_FADVISE" -ngx_feature_run=no -ngx_feature_incs="#include " -ngx_feature_path= -ngx_feature_libs= -ngx_feature_test="posix_fadvise(0, 0, 0, POSIX_FADV_SEQUENTIAL);" -. auto/feature - - -ngx_feature="O_DIRECT" -ngx_feature_name="NGX_HAVE_O_DIRECT" -ngx_feature_run=no -ngx_feature_incs="#include " -ngx_feature_path= -ngx_feature_libs= -ngx_feature_test="fcntl(0, F_SETFL, O_DIRECT);" -. auto/feature - - -if [ $ngx_found = yes -a "$NGX_SYSTEM" = "Linux" ]; then - have=NGX_HAVE_ALIGNED_DIRECTIO . auto/have -fi - -ngx_feature="F_NOCACHE" -ngx_feature_name="NGX_HAVE_F_NOCACHE" -ngx_feature_run=no -ngx_feature_incs="#include " -ngx_feature_path= -ngx_feature_libs= -ngx_feature_test="fcntl(0, F_NOCACHE, 1);" -. auto/feature - - -ngx_feature="directio()" -ngx_feature_name="NGX_HAVE_DIRECTIO" -ngx_feature_run=no -ngx_feature_incs="#include - #include " -ngx_feature_path= -ngx_feature_libs= -ngx_feature_test="directio(0, DIRECTIO_ON);" -. auto/feature - - -ngx_feature="statfs()" -ngx_feature_name="NGX_HAVE_STATFS" -ngx_feature_run=no -ngx_feature_incs="$NGX_INCLUDE_SYS_PARAM_H - $NGX_INCLUDE_SYS_MOUNT_H - $NGX_INCLUDE_SYS_VFS_H" -ngx_feature_path= -ngx_feature_libs= -ngx_feature_test="struct statfs fs; - statfs(\".\", &fs);" -. auto/feature - - -ngx_feature="statvfs()" -ngx_feature_name="NGX_HAVE_STATVFS" -ngx_feature_run=no -ngx_feature_incs="#include - #include " -ngx_feature_path= -ngx_feature_libs= -ngx_feature_test="struct statvfs fs; - statvfs(\".\", &fs);" -. auto/feature - - -ngx_feature="dlopen()" -ngx_feature_name="NGX_HAVE_DLOPEN" -ngx_feature_run=no -ngx_feature_incs="#include " -ngx_feature_path= -ngx_feature_libs= -ngx_feature_test="dlopen(NULL, RTLD_NOW | RTLD_GLOBAL); dlsym(NULL, \"\")" -. auto/feature - - -if [ $ngx_found = no ]; then - - ngx_feature="dlopen() in libdl" - ngx_feature_libs="-ldl" - . auto/feature - - if [ $ngx_found = yes ]; then - CORE_LIBS="$CORE_LIBS -ldl" - NGX_LIBDL="-ldl" - fi -fi - - -ngx_feature="sched_yield()" -ngx_feature_name="NGX_HAVE_SCHED_YIELD" -ngx_feature_run=no -ngx_feature_incs="#include " -ngx_feature_path= -ngx_feature_libs= -ngx_feature_test="sched_yield()" -. auto/feature - - -if [ $ngx_found = no ]; then - - ngx_feature="sched_yield() in librt" - ngx_feature_libs="-lrt" - . auto/feature - - if [ $ngx_found = yes ]; then - CORE_LIBS="$CORE_LIBS -lrt" - fi -fi - - -ngx_feature="sched_setaffinity()" -ngx_feature_name="NGX_HAVE_SCHED_SETAFFINITY" -ngx_feature_run=no -ngx_feature_incs="#include " -ngx_feature_path= -ngx_feature_libs= -ngx_feature_test="cpu_set_t mask; - CPU_ZERO(&mask); - sched_setaffinity(0, sizeof(cpu_set_t), &mask)" -. auto/feature - - -ngx_feature="SO_SETFIB" -ngx_feature_name="NGX_HAVE_SETFIB" -ngx_feature_run=no -ngx_feature_incs="#include " -ngx_feature_path= -ngx_feature_libs= -ngx_feature_test="setsockopt(0, SOL_SOCKET, SO_SETFIB, NULL, 0)" -. auto/feature - - -ngx_feature="SO_REUSEPORT" -ngx_feature_name="NGX_HAVE_REUSEPORT" -ngx_feature_run=no -ngx_feature_incs="#include " -ngx_feature_path= -ngx_feature_libs= -ngx_feature_test="setsockopt(0, SOL_SOCKET, SO_REUSEPORT, NULL, 0)" -. auto/feature - - -ngx_feature="SO_ACCEPTFILTER" -ngx_feature_name="NGX_HAVE_DEFERRED_ACCEPT" -ngx_feature_run=no -ngx_feature_incs="#include " -ngx_feature_path= -ngx_feature_libs= -ngx_feature_test="setsockopt(0, SOL_SOCKET, SO_ACCEPTFILTER, NULL, 0)" -. auto/feature - - -# OpenBSD bind to any address for transparent proxying - -ngx_feature="SO_BINDANY" -ngx_feature_name="NGX_HAVE_TRANSPARENT_PROXY" -ngx_feature_run=no -ngx_feature_incs="#include " -ngx_feature_path= -ngx_feature_libs= -ngx_feature_test="setsockopt(0, SOL_SOCKET, SO_BINDANY, NULL, 0)" -. auto/feature - - -# Linux transparent proxying - -ngx_feature="IP_TRANSPARENT" -ngx_feature_name="NGX_HAVE_TRANSPARENT_PROXY" -ngx_feature_run=no -ngx_feature_incs="#include - #include " -ngx_feature_path= -ngx_feature_libs= -ngx_feature_test="setsockopt(0, IPPROTO_IP, IP_TRANSPARENT, NULL, 0)" -. auto/feature - - -# FreeBSD bind to any address for transparent proxying - -ngx_feature="IP_BINDANY" -ngx_feature_name="NGX_HAVE_TRANSPARENT_PROXY" -ngx_feature_run=no -ngx_feature_incs="#include - #include " -ngx_feature_path= -ngx_feature_libs= -ngx_feature_test="setsockopt(0, IPPROTO_IP, IP_BINDANY, NULL, 0)" -. auto/feature - - -# Linux IP_BIND_ADDRESS_NO_PORT - -ngx_feature="IP_BIND_ADDRESS_NO_PORT" -ngx_feature_name="NGX_HAVE_IP_BIND_ADDRESS_NO_PORT" -ngx_feature_run=no -ngx_feature_incs="#include - #include " -ngx_feature_path= -ngx_feature_libs= -ngx_feature_test="setsockopt(0, IPPROTO_IP, IP_BIND_ADDRESS_NO_PORT, NULL, 0)" -. auto/feature - - -# BSD way to get IPv4 datagram destination address - -ngx_feature="IP_RECVDSTADDR" -ngx_feature_name="NGX_HAVE_IP_RECVDSTADDR" -ngx_feature_run=no -ngx_feature_incs="#include - #include " -ngx_feature_path= -ngx_feature_libs= -ngx_feature_test="setsockopt(0, IPPROTO_IP, IP_RECVDSTADDR, NULL, 0)" -. auto/feature - - -# BSD way to set IPv4 datagram source address - -ngx_feature="IP_SENDSRCADDR" -ngx_feature_name="NGX_HAVE_IP_SENDSRCADDR" -ngx_feature_run=no -ngx_feature_incs="#include - #include " -ngx_feature_path= -ngx_feature_libs= -ngx_feature_test="setsockopt(0, IPPROTO_IP, IP_SENDSRCADDR, NULL, 0)" -. auto/feature - - -# Linux way to get IPv4 datagram destination address - -ngx_feature="IP_PKTINFO" -ngx_feature_name="NGX_HAVE_IP_PKTINFO" -ngx_feature_run=no -ngx_feature_incs="#include - #include " -ngx_feature_path= -ngx_feature_libs= -ngx_feature_test="struct in_pktinfo pkt; - pkt.ipi_spec_dst.s_addr = INADDR_ANY; - (void) pkt; - setsockopt(0, IPPROTO_IP, IP_PKTINFO, NULL, 0)" -. auto/feature - - -# RFC 3542 way to get IPv6 datagram destination address - -ngx_feature="IPV6_RECVPKTINFO" -ngx_feature_name="NGX_HAVE_IPV6_RECVPKTINFO" -ngx_feature_run=no -ngx_feature_incs="#include - #include " -ngx_feature_path= -ngx_feature_libs= -ngx_feature_test="setsockopt(0, IPPROTO_IPV6, IPV6_RECVPKTINFO, NULL, 0)" -. auto/feature - - -# IP packet fragmentation - -ngx_feature="IP_MTU_DISCOVER" -ngx_feature_name="NGX_HAVE_IP_MTU_DISCOVER" -ngx_feature_run=no -ngx_feature_incs="#include - #include " -ngx_feature_path= -ngx_feature_libs= -ngx_feature_test="(void) IP_PMTUDISC_DO; - setsockopt(0, IPPROTO_IP, IP_MTU_DISCOVER, NULL, 0)" -. auto/feature - - -ngx_feature="IPV6_MTU_DISCOVER" -ngx_feature_name="NGX_HAVE_IPV6_MTU_DISCOVER" -ngx_feature_run=no -ngx_feature_incs="#include - #include " -ngx_feature_path= -ngx_feature_libs= -ngx_feature_test="(void) IPV6_PMTUDISC_DO; - setsockopt(0, IPPROTO_IPV6, IPV6_MTU_DISCOVER, NULL, 0)" -. auto/feature - - -ngx_feature="IP_DONTFRAG" -ngx_feature_name="NGX_HAVE_IP_DONTFRAG" -ngx_feature_run=no -ngx_feature_incs="#include - #include " -ngx_feature_path= -ngx_feature_libs= -ngx_feature_test="setsockopt(0, IPPROTO_IP, IP_DONTFRAG, NULL, 0)" -. auto/feature - - -ngx_feature="IPV6_DONTFRAG" -ngx_feature_name="NGX_HAVE_IPV6_DONTFRAG" -ngx_feature_run=no -ngx_feature_incs="#include - #include " -ngx_feature_path= -ngx_feature_libs= -ngx_feature_test="setsockopt(0, IPPROTO_IP, IPV6_DONTFRAG, NULL, 0)" -. auto/feature - - -ngx_feature="TCP_DEFER_ACCEPT" -ngx_feature_name="NGX_HAVE_DEFERRED_ACCEPT" -ngx_feature_run=no -ngx_feature_incs="#include - #include - #include " -ngx_feature_path= -ngx_feature_libs= -ngx_feature_test="setsockopt(0, IPPROTO_TCP, TCP_DEFER_ACCEPT, NULL, 0)" -. auto/feature - - -if test -z "$NGX_KEEPALIVE_CHECKED"; then - ngx_feature="TCP_KEEPIDLE" - ngx_feature_name="NGX_HAVE_KEEPALIVE_TUNABLE" - ngx_feature_run=no - ngx_feature_incs="#include - #include - #include " - ngx_feature_path= - ngx_feature_libs= - ngx_feature_test="setsockopt(0, IPPROTO_TCP, TCP_KEEPIDLE, NULL, 0); - setsockopt(0, IPPROTO_TCP, TCP_KEEPINTVL, NULL, 0); - setsockopt(0, IPPROTO_TCP, TCP_KEEPCNT, NULL, 0)" - . auto/feature -fi - - -ngx_feature="TCP_FASTOPEN" -ngx_feature_name="NGX_HAVE_TCP_FASTOPEN" -ngx_feature_run=no -ngx_feature_incs="#include - #include - #include " -ngx_feature_path= -ngx_feature_libs= -ngx_feature_test="setsockopt(0, IPPROTO_TCP, TCP_FASTOPEN, NULL, 0)" -. auto/feature - - -ngx_feature="TCP_INFO" -ngx_feature_name="NGX_HAVE_TCP_INFO" -ngx_feature_run=no -ngx_feature_incs="#include - #include - #include " -ngx_feature_path= -ngx_feature_libs= -ngx_feature_test="socklen_t optlen = sizeof(struct tcp_info); - struct tcp_info ti; - ti.tcpi_rtt = 0; - ti.tcpi_rttvar = 0; - ti.tcpi_snd_cwnd = 0; - ti.tcpi_rcv_space = 0; - getsockopt(0, IPPROTO_TCP, TCP_INFO, &ti, &optlen)" -. auto/feature - - -ngx_feature="accept4()" -ngx_feature_name="NGX_HAVE_ACCEPT4" -ngx_feature_run=no -ngx_feature_incs="#include " -ngx_feature_path= -ngx_feature_libs= -ngx_feature_test="accept4(0, NULL, NULL, SOCK_NONBLOCK)" -. auto/feature - -if [ $NGX_FILE_AIO = YES ]; then - - ngx_feature="kqueue AIO support" - ngx_feature_name="NGX_HAVE_FILE_AIO" - ngx_feature_run=no - ngx_feature_incs="#include " - ngx_feature_path= - ngx_feature_libs= - ngx_feature_test="struct aiocb iocb; - iocb.aio_sigevent.sigev_notify = SIGEV_KEVENT; - (void) aio_read(&iocb)" - . auto/feature - - if [ $ngx_found = yes ]; then - CORE_SRCS="$CORE_SRCS $FILE_AIO_SRCS" - fi - - if [ $ngx_found = no ]; then - - ngx_feature="Linux AIO support" - ngx_feature_name="NGX_HAVE_FILE_AIO" - ngx_feature_run=no - ngx_feature_incs="#include - #include " - ngx_feature_path= - ngx_feature_libs= - ngx_feature_test="struct iocb iocb; - iocb.aio_lio_opcode = IOCB_CMD_PREAD; - iocb.aio_flags = IOCB_FLAG_RESFD; - iocb.aio_resfd = -1; - (void) iocb; - (void) eventfd(0, 0)" - . auto/feature - - if [ $ngx_found = yes ]; then - have=NGX_HAVE_EVENTFD . auto/have - have=NGX_HAVE_SYS_EVENTFD_H . auto/have - CORE_SRCS="$CORE_SRCS $LINUX_AIO_SRCS" - fi - fi - - if [ $ngx_found = no ]; then - - ngx_feature="Linux AIO support (SYS_eventfd)" - ngx_feature_incs="#include - #include " - ngx_feature_test="struct iocb iocb; - iocb.aio_lio_opcode = IOCB_CMD_PREAD; - iocb.aio_flags = IOCB_FLAG_RESFD; - iocb.aio_resfd = -1; - (void) iocb; - (void) SYS_eventfd" - . auto/feature - - if [ $ngx_found = yes ]; then - have=NGX_HAVE_EVENTFD . auto/have - CORE_SRCS="$CORE_SRCS $LINUX_AIO_SRCS" - fi - fi - - if [ $ngx_found = no ]; then - cat << END - -$0: no supported file AIO was found -Currently file AIO is supported on FreeBSD 4.3+ and Linux 2.6.22+ only - -END - exit 1 - fi -fi - - -have=NGX_HAVE_UNIX_DOMAIN . auto/have - -ngx_feature_libs= - - -# C types - -ngx_type="int"; . auto/types/sizeof - -ngx_type="long"; . auto/types/sizeof - -ngx_type="long long"; . auto/types/sizeof - -ngx_type="void *"; . auto/types/sizeof; ngx_ptr_size=$ngx_size -ngx_param=NGX_PTR_SIZE; ngx_value=$ngx_size; . auto/types/value - - -# POSIX types - -NGX_INCLUDE_AUTO_CONFIG_H="#include \"ngx_auto_config.h\"" - -ngx_type="uint32_t"; ngx_types="u_int32_t"; . auto/types/typedef -ngx_type="uint64_t"; ngx_types="u_int64_t"; . auto/types/typedef - -ngx_type="sig_atomic_t"; ngx_types="int"; . auto/types/typedef -. auto/types/sizeof -ngx_param=NGX_SIG_ATOMIC_T_SIZE; ngx_value=$ngx_size; . auto/types/value - -ngx_type="socklen_t"; ngx_types="int"; . auto/types/typedef - -ngx_type="in_addr_t"; ngx_types="uint32_t u_int32_t"; . auto/types/typedef - -ngx_type="in_port_t"; ngx_types="u_short"; . auto/types/typedef - -ngx_type="rlim_t"; ngx_types="int"; . auto/types/typedef - -. auto/types/uintptr_t - -. auto/endianness - -ngx_type="size_t"; . auto/types/sizeof -ngx_param=NGX_MAX_SIZE_T_VALUE; ngx_value=$ngx_max_value; . auto/types/value -ngx_param=NGX_SIZE_T_LEN; ngx_value=$ngx_max_len; . auto/types/value - -ngx_type="off_t"; . auto/types/sizeof -ngx_param=NGX_MAX_OFF_T_VALUE; ngx_value=$ngx_max_value; . auto/types/value -ngx_param=NGX_OFF_T_LEN; ngx_value=$ngx_max_len; . auto/types/value - -ngx_type="time_t"; . auto/types/sizeof -ngx_param=NGX_TIME_T_SIZE; ngx_value=$ngx_size; . auto/types/value -ngx_param=NGX_TIME_T_LEN; ngx_value=$ngx_max_len; . auto/types/value -ngx_param=NGX_MAX_TIME_T_VALUE; ngx_value=$ngx_max_value; . auto/types/value - - -# syscalls, libc calls and some features - - -ngx_feature="AF_INET6" -ngx_feature_name="NGX_HAVE_INET6" -ngx_feature_run=no -ngx_feature_incs="#include - #include - #include " -ngx_feature_path= -ngx_feature_libs= -ngx_feature_test="struct sockaddr_in6 sin6; - sin6.sin6_family = AF_INET6; - (void) sin6" -. auto/feature - - -ngx_feature="setproctitle()" -ngx_feature_name="NGX_HAVE_SETPROCTITLE" -ngx_feature_run=no -ngx_feature_incs="#include " -ngx_feature_path= -ngx_feature_libs=$NGX_SETPROCTITLE_LIB -ngx_feature_test="setproctitle(\"test\");" -. auto/feature - - -ngx_feature="pread()" -ngx_feature_name="NGX_HAVE_PREAD" -ngx_feature_run=no -ngx_feature_incs= -ngx_feature_path= -ngx_feature_libs= -ngx_feature_test="char buf[1]; ssize_t n; n = pread(0, buf, 1, 0); - if (n == -1) return 1" -. auto/feature - - -ngx_feature="pwrite()" -ngx_feature_name="NGX_HAVE_PWRITE" -ngx_feature_run=no -ngx_feature_incs= -ngx_feature_path= -ngx_feature_libs= -ngx_feature_test="char buf[1]; ssize_t n; n = pwrite(1, buf, 1, 0); - if (n == -1) return 1" -. auto/feature - - -# pwritev() was introduced in FreeBSD 6 and Linux 2.6.30, glibc 2.10 - -ngx_feature="pwritev()" -ngx_feature_name="NGX_HAVE_PWRITEV" -ngx_feature_run=no -ngx_feature_incs='#include ' -ngx_feature_path= -ngx_feature_libs= -ngx_feature_test="char buf[1]; struct iovec vec[1]; ssize_t n; - vec[0].iov_base = buf; - vec[0].iov_len = 1; - n = pwritev(1, vec, 1, 0); - if (n == -1) return 1" -. auto/feature - - -# strerrordesc_np(), introduced in glibc 2.32 - -ngx_feature="strerrordesc_np()" -ngx_feature_name="NGX_HAVE_STRERRORDESC_NP" -ngx_feature_run=no -ngx_feature_incs='#include ' -ngx_feature_path= -ngx_feature_libs= -ngx_feature_test="char *p; p = strerrordesc_np(0); - if (p == NULL) return 1" -. auto/feature - - -if [ $ngx_found = no ]; then - - ngx_feature="sys_nerr" - ngx_feature_name="NGX_SYS_NERR" - ngx_feature_run=value - ngx_feature_incs='#include - #include ' - ngx_feature_path= - ngx_feature_libs= - ngx_feature_test='printf("%d", sys_nerr);' - . auto/feature -fi - - -if [ $ngx_found = no ]; then - - # Cygiwn defines _sys_nerr - ngx_feature="_sys_nerr" - ngx_feature_name="NGX_SYS_NERR" - ngx_feature_run=value - ngx_feature_incs='#include - #include ' - ngx_feature_path= - ngx_feature_libs= - ngx_feature_test='printf("%d", _sys_nerr);' - . auto/feature -fi - - -ngx_feature="localtime_r()" -ngx_feature_name="NGX_HAVE_LOCALTIME_R" -ngx_feature_run=no -ngx_feature_incs="#include " -ngx_feature_path= -ngx_feature_libs= -ngx_feature_test="struct tm t; time_t c=0; localtime_r(&c, &t)" -. auto/feature - - -ngx_feature="clock_gettime(CLOCK_MONOTONIC)" -ngx_feature_name="NGX_HAVE_CLOCK_MONOTONIC" -ngx_feature_run=no -ngx_feature_incs="#include " -ngx_feature_path= -ngx_feature_libs= -ngx_feature_test="struct timespec ts; clock_gettime(CLOCK_MONOTONIC, &ts)" -. auto/feature - - -if [ $ngx_found = no ]; then - - # Linux before glibc 2.17, notably CentOS 6 - - ngx_feature="clock_gettime(CLOCK_MONOTONIC) in librt" - ngx_feature_libs="-lrt" - . auto/feature - - if [ $ngx_found = yes ]; then - CORE_LIBS="$CORE_LIBS -lrt" - fi -fi - - -ngx_feature="posix_memalign()" -ngx_feature_name="NGX_HAVE_POSIX_MEMALIGN" -ngx_feature_run=no -ngx_feature_incs="#include " -ngx_feature_path= -ngx_feature_libs= -ngx_feature_test="void *p; int n; n = posix_memalign(&p, 4096, 4096); - if (n != 0) return 1" -. auto/feature - - -ngx_feature="memalign()" -ngx_feature_name="NGX_HAVE_MEMALIGN" -ngx_feature_run=no -ngx_feature_incs="#include - #include " -ngx_feature_path= -ngx_feature_libs= -ngx_feature_test="void *p; p = memalign(4096, 4096); - if (p == NULL) return 1" -. auto/feature - - -ngx_feature="mmap(MAP_ANON|MAP_SHARED)" -ngx_feature_name="NGX_HAVE_MAP_ANON" -ngx_feature_run=yes -ngx_feature_incs="#include " -ngx_feature_path= -ngx_feature_libs= -ngx_feature_test="void *p; - p = mmap(NULL, 4096, PROT_READ|PROT_WRITE, - MAP_ANON|MAP_SHARED, -1, 0); - if (p == MAP_FAILED) return 1;" -. auto/feature - - -ngx_feature='mmap("/dev/zero", MAP_SHARED)' -ngx_feature_name="NGX_HAVE_MAP_DEVZERO" -ngx_feature_run=yes -ngx_feature_incs="#include - #include - #include " -ngx_feature_path= -ngx_feature_libs= -ngx_feature_test='void *p; int fd; - fd = open("/dev/zero", O_RDWR); - p = mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0); - if (p == MAP_FAILED) return 1;' -. auto/feature - - -ngx_feature="System V shared memory" -ngx_feature_name="NGX_HAVE_SYSVSHM" -ngx_feature_run=yes -ngx_feature_incs="#include - #include " -ngx_feature_path= -ngx_feature_libs= -ngx_feature_test="int id; - id = shmget(IPC_PRIVATE, 4096, (SHM_R|SHM_W|IPC_CREAT)); - if (id == -1) return 1; - shmctl(id, IPC_RMID, NULL);" -. auto/feature - - -ngx_feature="POSIX semaphores" -ngx_feature_name="NGX_HAVE_POSIX_SEM" -ngx_feature_run=yes -ngx_feature_incs="#include " -ngx_feature_path= -ngx_feature_libs= -ngx_feature_test="sem_t sem; - if (sem_init(&sem, 1, 0) == -1) return 1; - sem_destroy(&sem);" -. auto/feature - - -if [ $ngx_found = no ]; then - - # Linux has POSIX semaphores in libpthread - ngx_feature="POSIX semaphores in libpthread" - ngx_feature_libs=-lpthread - . auto/feature - - if [ $ngx_found = yes ]; then - CORE_LIBS="$CORE_LIBS -lpthread" - NGX_LIBPTHREAD="-lpthread" - fi -fi - - -if [ $ngx_found = no ]; then - - # Solaris has POSIX semaphores in librt - ngx_feature="POSIX semaphores in librt" - ngx_feature_libs=-lrt - . auto/feature - - if [ $ngx_found = yes ]; then - CORE_LIBS="$CORE_LIBS -lrt" - fi -fi - - -ngx_feature="struct msghdr.msg_control" -ngx_feature_name="NGX_HAVE_MSGHDR_MSG_CONTROL" -ngx_feature_run=no -ngx_feature_incs="#include - #include " -ngx_feature_path= -ngx_feature_libs= -ngx_feature_test="struct msghdr msg; - printf(\"%d\", (int) sizeof(msg.msg_control))" -. auto/feature - - -ngx_feature="ioctl(FIONBIO)" -ngx_feature_name="NGX_HAVE_FIONBIO" -ngx_feature_run=no -ngx_feature_incs="#include - #include - $NGX_INCLUDE_SYS_FILIO_H" -ngx_feature_path= -ngx_feature_libs= -ngx_feature_test="int i = FIONBIO; printf(\"%d\", i)" -. auto/feature - - -ngx_feature="ioctl(FIONREAD)" -ngx_feature_name="NGX_HAVE_FIONREAD" -ngx_feature_run=no -ngx_feature_incs="#include - #include - $NGX_INCLUDE_SYS_FILIO_H" -ngx_feature_path= -ngx_feature_libs= -ngx_feature_test="int i = FIONREAD; printf(\"%d\", i)" -. auto/feature - - -ngx_feature="struct tm.tm_gmtoff" -ngx_feature_name="NGX_HAVE_GMTOFF" -ngx_feature_run=no -ngx_feature_incs="#include - #include " -ngx_feature_path= -ngx_feature_libs= -ngx_feature_test="struct tm tm; tm.tm_gmtoff = 0; - printf(\"%d\", (int) tm.tm_gmtoff)" -. auto/feature - - -ngx_feature="struct dirent.d_namlen" -ngx_feature_name="NGX_HAVE_D_NAMLEN" -ngx_feature_run=no -ngx_feature_incs="#include - #include " -ngx_feature_path= -ngx_feature_libs= -ngx_feature_test="struct dirent dir; dir.d_namlen = 0; - printf(\"%d\", (int) dir.d_namlen)" -. auto/feature - - -ngx_feature="struct dirent.d_type" -ngx_feature_name="NGX_HAVE_D_TYPE" -ngx_feature_run=no -ngx_feature_incs="#include - #include " -ngx_feature_path= -ngx_feature_libs= -ngx_feature_test="struct dirent dir; dir.d_type = DT_REG; - printf(\"%d\", (int) dir.d_type)" -. auto/feature - - -ngx_feature="sysconf(_SC_NPROCESSORS_ONLN)" -ngx_feature_name="NGX_HAVE_SC_NPROCESSORS_ONLN" -ngx_feature_run=no -ngx_feature_incs= -ngx_feature_path= -ngx_feature_libs= -ngx_feature_test="sysconf(_SC_NPROCESSORS_ONLN)" -. auto/feature - - -ngx_feature="sysconf(_SC_LEVEL1_DCACHE_LINESIZE)" -ngx_feature_name="NGX_HAVE_LEVEL1_DCACHE_LINESIZE" -ngx_feature_run=no -ngx_feature_incs= -ngx_feature_path= -ngx_feature_libs= -ngx_feature_test="sysconf(_SC_LEVEL1_DCACHE_LINESIZE)" -. auto/feature - - -ngx_feature="openat(), fstatat()" -ngx_feature_name="NGX_HAVE_OPENAT" -ngx_feature_run=no -ngx_feature_incs="#include - #include - #include " -ngx_feature_path= -ngx_feature_libs= -ngx_feature_test="struct stat sb; - openat(AT_FDCWD, \".\", O_RDONLY|O_NOFOLLOW); - fstatat(AT_FDCWD, \".\", &sb, AT_SYMLINK_NOFOLLOW);" -. auto/feature - - -ngx_feature="getaddrinfo()" -ngx_feature_name="NGX_HAVE_GETADDRINFO" -ngx_feature_run=no -ngx_feature_incs="#include - #include - #include " -ngx_feature_path= -ngx_feature_libs= -ngx_feature_test='struct addrinfo *res; - if (getaddrinfo("localhost", NULL, NULL, &res) != 0) return 1; - freeaddrinfo(res)' -. auto/feature diff --git a/src/deps/src/nginx-1.30.3/conf/fastcgi.conf b/src/deps/src/nginx-1.30.3/conf/fastcgi.conf deleted file mode 100644 index 091738c603..0000000000 --- a/src/deps/src/nginx-1.30.3/conf/fastcgi.conf +++ /dev/null @@ -1,26 +0,0 @@ - -fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; -fastcgi_param QUERY_STRING $query_string; -fastcgi_param REQUEST_METHOD $request_method; -fastcgi_param CONTENT_TYPE $content_type; -fastcgi_param CONTENT_LENGTH $content_length; - -fastcgi_param SCRIPT_NAME $fastcgi_script_name; -fastcgi_param REQUEST_URI $request_uri; -fastcgi_param DOCUMENT_URI $document_uri; -fastcgi_param DOCUMENT_ROOT $document_root; -fastcgi_param SERVER_PROTOCOL $server_protocol; -fastcgi_param REQUEST_SCHEME $scheme; -fastcgi_param HTTPS $https if_not_empty; - -fastcgi_param GATEWAY_INTERFACE CGI/1.1; -fastcgi_param SERVER_SOFTWARE nginx/$nginx_version; - -fastcgi_param REMOTE_ADDR $remote_addr; -fastcgi_param REMOTE_PORT $remote_port; -fastcgi_param SERVER_ADDR $server_addr; -fastcgi_param SERVER_PORT $server_port; -fastcgi_param SERVER_NAME $server_name; - -# PHP only, required if PHP was built with --enable-force-cgi-redirect -fastcgi_param REDIRECT_STATUS 200; diff --git a/src/deps/src/nginx-1.30.3/conf/fastcgi_params b/src/deps/src/nginx-1.30.3/conf/fastcgi_params deleted file mode 100644 index 28decb9550..0000000000 --- a/src/deps/src/nginx-1.30.3/conf/fastcgi_params +++ /dev/null @@ -1,25 +0,0 @@ - -fastcgi_param QUERY_STRING $query_string; -fastcgi_param REQUEST_METHOD $request_method; -fastcgi_param CONTENT_TYPE $content_type; -fastcgi_param CONTENT_LENGTH $content_length; - -fastcgi_param SCRIPT_NAME $fastcgi_script_name; -fastcgi_param REQUEST_URI $request_uri; -fastcgi_param DOCUMENT_URI $document_uri; -fastcgi_param DOCUMENT_ROOT $document_root; -fastcgi_param SERVER_PROTOCOL $server_protocol; -fastcgi_param REQUEST_SCHEME $scheme; -fastcgi_param HTTPS $https if_not_empty; - -fastcgi_param GATEWAY_INTERFACE CGI/1.1; -fastcgi_param SERVER_SOFTWARE nginx/$nginx_version; - -fastcgi_param REMOTE_ADDR $remote_addr; -fastcgi_param REMOTE_PORT $remote_port; -fastcgi_param SERVER_ADDR $server_addr; -fastcgi_param SERVER_PORT $server_port; -fastcgi_param SERVER_NAME $server_name; - -# PHP only, required if PHP was built with --enable-force-cgi-redirect -fastcgi_param REDIRECT_STATUS 200; diff --git a/src/deps/src/nginx-1.30.3/conf/koi-utf b/src/deps/src/nginx-1.30.3/conf/koi-utf deleted file mode 100644 index e7974ff6ad..0000000000 --- a/src/deps/src/nginx-1.30.3/conf/koi-utf +++ /dev/null @@ -1,109 +0,0 @@ - -# This map is not a full koi8-r <> utf8 map: it does not contain -# box-drawing and some other characters. Besides this map contains -# several koi8-u and Byelorussian letters which are not in koi8-r. -# If you need a full and standard map, use contrib/unicode2nginx/koi-utf -# map instead. - -charset_map koi8-r utf-8 { - - 80 E282AC ; # euro - - 95 E280A2 ; # bullet - - 9A C2A0 ; #   - - 9E C2B7 ; # · - - A3 D191 ; # small yo - A4 D194 ; # small Ukrainian ye - - A6 D196 ; # small Ukrainian i - A7 D197 ; # small Ukrainian yi - - AD D291 ; # small Ukrainian soft g - AE D19E ; # small Byelorussian short u - - B0 C2B0 ; # ° - - B3 D081 ; # capital YO - B4 D084 ; # capital Ukrainian YE - - B6 D086 ; # capital Ukrainian I - B7 D087 ; # capital Ukrainian YI - - B9 E28496 ; # numero sign - - BD D290 ; # capital Ukrainian soft G - BE D18E ; # capital Byelorussian short U - - BF C2A9 ; # (C) - - C0 D18E ; # small yu - C1 D0B0 ; # small a - C2 D0B1 ; # small b - C3 D186 ; # small ts - C4 D0B4 ; # small d - C5 D0B5 ; # small ye - C6 D184 ; # small f - C7 D0B3 ; # small g - C8 D185 ; # small kh - C9 D0B8 ; # small i - CA D0B9 ; # small j - CB D0BA ; # small k - CC D0BB ; # small l - CD D0BC ; # small m - CE D0BD ; # small n - CF D0BE ; # small o - - D0 D0BF ; # small p - D1 D18F ; # small ya - D2 D180 ; # small r - D3 D181 ; # small s - D4 D182 ; # small t - D5 D183 ; # small u - D6 D0B6 ; # small zh - D7 D0B2 ; # small v - D8 D18C ; # small soft sign - D9 D18B ; # small y - DA D0B7 ; # small z - DB D188 ; # small sh - DC D18D ; # small e - DD D189 ; # small shch - DE D187 ; # small ch - DF D18A ; # small hard sign - - E0 D0AE ; # capital YU - E1 D090 ; # capital A - E2 D091 ; # capital B - E3 D0A6 ; # capital TS - E4 D094 ; # capital D - E5 D095 ; # capital YE - E6 D0A4 ; # capital F - E7 D093 ; # capital G - E8 D0A5 ; # capital KH - E9 D098 ; # capital I - EA D099 ; # capital J - EB D09A ; # capital K - EC D09B ; # capital L - ED D09C ; # capital M - EE D09D ; # capital N - EF D09E ; # capital O - - F0 D09F ; # capital P - F1 D0AF ; # capital YA - F2 D0A0 ; # capital R - F3 D0A1 ; # capital S - F4 D0A2 ; # capital T - F5 D0A3 ; # capital U - F6 D096 ; # capital ZH - F7 D092 ; # capital V - F8 D0AC ; # capital soft sign - F9 D0AB ; # capital Y - FA D097 ; # capital Z - FB D0A8 ; # capital SH - FC D0AD ; # capital E - FD D0A9 ; # capital SHCH - FE D0A7 ; # capital CH - FF D0AA ; # capital hard sign -} diff --git a/src/deps/src/nginx-1.30.3/conf/koi-win b/src/deps/src/nginx-1.30.3/conf/koi-win deleted file mode 100644 index 72afabe89b..0000000000 --- a/src/deps/src/nginx-1.30.3/conf/koi-win +++ /dev/null @@ -1,103 +0,0 @@ - -charset_map koi8-r windows-1251 { - - 80 88 ; # euro - - 95 95 ; # bullet - - 9A A0 ; #   - - 9E B7 ; # · - - A3 B8 ; # small yo - A4 BA ; # small Ukrainian ye - - A6 B3 ; # small Ukrainian i - A7 BF ; # small Ukrainian yi - - AD B4 ; # small Ukrainian soft g - AE A2 ; # small Byelorussian short u - - B0 B0 ; # ° - - B3 A8 ; # capital YO - B4 AA ; # capital Ukrainian YE - - B6 B2 ; # capital Ukrainian I - B7 AF ; # capital Ukrainian YI - - B9 B9 ; # numero sign - - BD A5 ; # capital Ukrainian soft G - BE A1 ; # capital Byelorussian short U - - BF A9 ; # (C) - - C0 FE ; # small yu - C1 E0 ; # small a - C2 E1 ; # small b - C3 F6 ; # small ts - C4 E4 ; # small d - C5 E5 ; # small ye - C6 F4 ; # small f - C7 E3 ; # small g - C8 F5 ; # small kh - C9 E8 ; # small i - CA E9 ; # small j - CB EA ; # small k - CC EB ; # small l - CD EC ; # small m - CE ED ; # small n - CF EE ; # small o - - D0 EF ; # small p - D1 FF ; # small ya - D2 F0 ; # small r - D3 F1 ; # small s - D4 F2 ; # small t - D5 F3 ; # small u - D6 E6 ; # small zh - D7 E2 ; # small v - D8 FC ; # small soft sign - D9 FB ; # small y - DA E7 ; # small z - DB F8 ; # small sh - DC FD ; # small e - DD F9 ; # small shch - DE F7 ; # small ch - DF FA ; # small hard sign - - E0 DE ; # capital YU - E1 C0 ; # capital A - E2 C1 ; # capital B - E3 D6 ; # capital TS - E4 C4 ; # capital D - E5 C5 ; # capital YE - E6 D4 ; # capital F - E7 C3 ; # capital G - E8 D5 ; # capital KH - E9 C8 ; # capital I - EA C9 ; # capital J - EB CA ; # capital K - EC CB ; # capital L - ED CC ; # capital M - EE CD ; # capital N - EF CE ; # capital O - - F0 CF ; # capital P - F1 DF ; # capital YA - F2 D0 ; # capital R - F3 D1 ; # capital S - F4 D2 ; # capital T - F5 D3 ; # capital U - F6 C6 ; # capital ZH - F7 C2 ; # capital V - F8 DC ; # capital soft sign - F9 DB ; # capital Y - FA C7 ; # capital Z - FB D8 ; # capital SH - FC DD ; # capital E - FD D9 ; # capital SHCH - FE D7 ; # capital CH - FF DA ; # capital hard sign -} diff --git a/src/deps/src/nginx-1.30.3/conf/mime.types b/src/deps/src/nginx-1.30.3/conf/mime.types deleted file mode 100644 index 1c00d701ae..0000000000 --- a/src/deps/src/nginx-1.30.3/conf/mime.types +++ /dev/null @@ -1,99 +0,0 @@ - -types { - text/html html htm shtml; - text/css css; - text/xml xml; - image/gif gif; - image/jpeg jpeg jpg; - application/javascript js; - application/atom+xml atom; - application/rss+xml rss; - - text/mathml mml; - text/plain txt; - text/vnd.sun.j2me.app-descriptor jad; - text/vnd.wap.wml wml; - text/x-component htc; - - image/avif avif; - image/png png; - image/svg+xml svg svgz; - image/tiff tif tiff; - image/vnd.wap.wbmp wbmp; - image/webp webp; - image/x-icon ico; - image/x-jng jng; - image/x-ms-bmp bmp; - - font/woff woff; - font/woff2 woff2; - - application/java-archive jar war ear; - application/json json; - application/mac-binhex40 hqx; - application/msword doc; - application/pdf pdf; - application/postscript ps eps ai; - application/rtf rtf; - application/vnd.apple.mpegurl m3u8; - application/vnd.google-earth.kml+xml kml; - application/vnd.google-earth.kmz kmz; - application/vnd.ms-excel xls; - application/vnd.ms-fontobject eot; - application/vnd.ms-powerpoint ppt; - application/vnd.oasis.opendocument.graphics odg; - application/vnd.oasis.opendocument.presentation odp; - application/vnd.oasis.opendocument.spreadsheet ods; - application/vnd.oasis.opendocument.text odt; - application/vnd.openxmlformats-officedocument.presentationml.presentation - pptx; - application/vnd.openxmlformats-officedocument.spreadsheetml.sheet - xlsx; - application/vnd.openxmlformats-officedocument.wordprocessingml.document - docx; - application/vnd.wap.wmlc wmlc; - application/wasm wasm; - application/x-7z-compressed 7z; - application/x-cocoa cco; - application/x-java-archive-diff jardiff; - application/x-java-jnlp-file jnlp; - application/x-makeself run; - application/x-perl pl pm; - application/x-pilot prc pdb; - application/x-rar-compressed rar; - application/x-redhat-package-manager rpm; - application/x-sea sea; - application/x-shockwave-flash swf; - application/x-stuffit sit; - application/x-tcl tcl tk; - application/x-x509-ca-cert der pem crt; - application/x-xpinstall xpi; - application/xhtml+xml xhtml; - application/xspf+xml xspf; - application/zip zip; - - application/octet-stream bin exe dll; - application/octet-stream deb; - application/octet-stream dmg; - application/octet-stream iso img; - application/octet-stream msi msp msm; - - audio/midi mid midi kar; - audio/mpeg mp3; - audio/ogg ogg; - audio/x-m4a m4a; - audio/x-realaudio ra; - - video/3gpp 3gpp 3gp; - video/mp2t ts; - video/mp4 mp4; - video/mpeg mpeg mpg; - video/quicktime mov; - video/webm webm; - video/x-flv flv; - video/x-m4v m4v; - video/x-mng mng; - video/x-ms-asf asx asf; - video/x-ms-wmv wmv; - video/x-msvideo avi; -} diff --git a/src/deps/src/nginx-1.30.3/conf/nginx.conf b/src/deps/src/nginx-1.30.3/conf/nginx.conf deleted file mode 100644 index 2315a86637..0000000000 --- a/src/deps/src/nginx-1.30.3/conf/nginx.conf +++ /dev/null @@ -1,115 +0,0 @@ - -#user nobody; -worker_processes 1; - -#error_log logs/error.log; -#error_log logs/error.log notice; -#error_log logs/error.log info; - -#pid logs/nginx.pid; - - -events { - worker_connections 1024; -} - - -http { - include mime.types; - default_type application/octet-stream; - - #log_format main '$remote_addr - $remote_user [$time_local] "$request" ' - # '$status $body_bytes_sent "$http_referer" ' - # '"$http_user_agent" "$http_x_forwarded_for"'; - - #access_log logs/access.log main; - - sendfile on; - #tcp_nopush on; - - #keepalive_timeout 0; - keepalive_timeout 65; - - #gzip on; - - server { - listen 80; - server_name localhost; - - #access_log logs/host.access.log main; - - location / { - root html; - index index.html index.htm; - } - - #error_page 404 /404.html; - - # redirect server error pages to the static page /50x.html - # - error_page 500 502 503 504 /50x.html; - location = /50x.html { - root html; - } - - # proxy the PHP scripts to Apache listening on 127.0.0.1:80 - # - #location ~ \.php$ { - # proxy_pass http://127.0.0.1; - #} - - # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000 - # - #location ~ \.php$ { - # root html; - # fastcgi_pass 127.0.0.1:9000; - # fastcgi_index index.php; - # fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name; - # include fastcgi_params; - #} - - # deny access to .htaccess files, if Apache's document root - # concurs with nginx's one - # - #location ~ /\.ht { - # deny all; - #} - } - - - # another virtual host using mix of IP-, name-, and port-based configuration - # - #server { - # listen 8000; - # listen somename:8080; - # server_name somename alias another.alias; - - # location / { - # root html; - # index index.html index.htm; - # } - #} - - - # HTTPS server - # - #server { - # listen 443 ssl; - # server_name localhost; - - # ssl_certificate cert.pem; - # ssl_certificate_key cert.key; - - # ssl_session_cache shared:SSL:1m; - # ssl_session_timeout 5m; - - # ssl_ciphers HIGH:!aNULL:!MD5; - # ssl_prefer_server_ciphers on; - - # location / { - # root html; - # index index.html index.htm; - # } - #} - -} diff --git a/src/deps/src/nginx-1.30.3/conf/scgi_params b/src/deps/src/nginx-1.30.3/conf/scgi_params deleted file mode 100644 index 6d4ce4f3eb..0000000000 --- a/src/deps/src/nginx-1.30.3/conf/scgi_params +++ /dev/null @@ -1,17 +0,0 @@ - -scgi_param REQUEST_METHOD $request_method; -scgi_param REQUEST_URI $request_uri; -scgi_param QUERY_STRING $query_string; -scgi_param CONTENT_TYPE $content_type; - -scgi_param DOCUMENT_URI $document_uri; -scgi_param DOCUMENT_ROOT $document_root; -scgi_param SCGI 1; -scgi_param SERVER_PROTOCOL $server_protocol; -scgi_param REQUEST_SCHEME $scheme; -scgi_param HTTPS $https if_not_empty; - -scgi_param REMOTE_ADDR $remote_addr; -scgi_param REMOTE_PORT $remote_port; -scgi_param SERVER_PORT $server_port; -scgi_param SERVER_NAME $server_name; diff --git a/src/deps/src/nginx-1.30.3/conf/uwsgi_params b/src/deps/src/nginx-1.30.3/conf/uwsgi_params deleted file mode 100644 index 09c732cd68..0000000000 --- a/src/deps/src/nginx-1.30.3/conf/uwsgi_params +++ /dev/null @@ -1,17 +0,0 @@ - -uwsgi_param QUERY_STRING $query_string; -uwsgi_param REQUEST_METHOD $request_method; -uwsgi_param CONTENT_TYPE $content_type; -uwsgi_param CONTENT_LENGTH $content_length; - -uwsgi_param REQUEST_URI $request_uri; -uwsgi_param PATH_INFO $document_uri; -uwsgi_param DOCUMENT_ROOT $document_root; -uwsgi_param SERVER_PROTOCOL $server_protocol; -uwsgi_param REQUEST_SCHEME $scheme; -uwsgi_param HTTPS $https if_not_empty; - -uwsgi_param REMOTE_ADDR $remote_addr; -uwsgi_param REMOTE_PORT $remote_port; -uwsgi_param SERVER_PORT $server_port; -uwsgi_param SERVER_NAME $server_name; diff --git a/src/deps/src/nginx-1.30.3/conf/win-utf b/src/deps/src/nginx-1.30.3/conf/win-utf deleted file mode 100644 index d0b7116c8a..0000000000 --- a/src/deps/src/nginx-1.30.3/conf/win-utf +++ /dev/null @@ -1,126 +0,0 @@ - -# This map is not a full windows-1251 <> utf8 map: it does not -# contain Serbian and Macedonian letters. If you need a full map, -# use contrib/unicode2nginx/win-utf map instead. - -charset_map windows-1251 utf-8 { - - 82 E2809A ; # single low-9 quotation mark - - 84 E2809E ; # double low-9 quotation mark - 85 E280A6 ; # ellipsis - 86 E280A0 ; # dagger - 87 E280A1 ; # double dagger - 88 E282AC ; # euro - 89 E280B0 ; # per mille - - 91 E28098 ; # left single quotation mark - 92 E28099 ; # right single quotation mark - 93 E2809C ; # left double quotation mark - 94 E2809D ; # right double quotation mark - 95 E280A2 ; # bullet - 96 E28093 ; # en dash - 97 E28094 ; # em dash - - 99 E284A2 ; # trade mark sign - - A0 C2A0 ; #   - A1 D18E ; # capital Byelorussian short U - A2 D19E ; # small Byelorussian short u - - A4 C2A4 ; # currency sign - A5 D290 ; # capital Ukrainian soft G - A6 C2A6 ; # borken bar - A7 C2A7 ; # section sign - A8 D081 ; # capital YO - A9 C2A9 ; # (C) - AA D084 ; # capital Ukrainian YE - AB C2AB ; # left-pointing double angle quotation mark - AC C2AC ; # not sign - AD C2AD ; # soft hyphen - AE C2AE ; # (R) - AF D087 ; # capital Ukrainian YI - - B0 C2B0 ; # ° - B1 C2B1 ; # plus-minus sign - B2 D086 ; # capital Ukrainian I - B3 D196 ; # small Ukrainian i - B4 D291 ; # small Ukrainian soft g - B5 C2B5 ; # micro sign - B6 C2B6 ; # pilcrow sign - B7 C2B7 ; # · - B8 D191 ; # small yo - B9 E28496 ; # numero sign - BA D194 ; # small Ukrainian ye - BB C2BB ; # right-pointing double angle quotation mark - - BF D197 ; # small Ukrainian yi - - C0 D090 ; # capital A - C1 D091 ; # capital B - C2 D092 ; # capital V - C3 D093 ; # capital G - C4 D094 ; # capital D - C5 D095 ; # capital YE - C6 D096 ; # capital ZH - C7 D097 ; # capital Z - C8 D098 ; # capital I - C9 D099 ; # capital J - CA D09A ; # capital K - CB D09B ; # capital L - CC D09C ; # capital M - CD D09D ; # capital N - CE D09E ; # capital O - CF D09F ; # capital P - - D0 D0A0 ; # capital R - D1 D0A1 ; # capital S - D2 D0A2 ; # capital T - D3 D0A3 ; # capital U - D4 D0A4 ; # capital F - D5 D0A5 ; # capital KH - D6 D0A6 ; # capital TS - D7 D0A7 ; # capital CH - D8 D0A8 ; # capital SH - D9 D0A9 ; # capital SHCH - DA D0AA ; # capital hard sign - DB D0AB ; # capital Y - DC D0AC ; # capital soft sign - DD D0AD ; # capital E - DE D0AE ; # capital YU - DF D0AF ; # capital YA - - E0 D0B0 ; # small a - E1 D0B1 ; # small b - E2 D0B2 ; # small v - E3 D0B3 ; # small g - E4 D0B4 ; # small d - E5 D0B5 ; # small ye - E6 D0B6 ; # small zh - E7 D0B7 ; # small z - E8 D0B8 ; # small i - E9 D0B9 ; # small j - EA D0BA ; # small k - EB D0BB ; # small l - EC D0BC ; # small m - ED D0BD ; # small n - EE D0BE ; # small o - EF D0BF ; # small p - - F0 D180 ; # small r - F1 D181 ; # small s - F2 D182 ; # small t - F3 D183 ; # small u - F4 D184 ; # small f - F5 D185 ; # small kh - F6 D186 ; # small ts - F7 D187 ; # small ch - F8 D188 ; # small sh - F9 D189 ; # small shch - FA D18A ; # small hard sign - FB D18B ; # small y - FC D18C ; # small soft sign - FD D18D ; # small e - FE D18E ; # small yu - FF D18F ; # small ya -} diff --git a/src/deps/src/nginx-1.30.3/contrib/README b/src/deps/src/nginx-1.30.3/contrib/README deleted file mode 100644 index fec4b20086..0000000000 --- a/src/deps/src/nginx-1.30.3/contrib/README +++ /dev/null @@ -1,21 +0,0 @@ - -geo2nginx.pl by Andrei Nigmatulin - - The perl script to convert CSV geoip database ( free download - at http://www.maxmind.com/app/geoip_country ) to format, suitable - for use by the ngx_http_geo_module. - - -unicode2nginx by Maxim Dounin - - The perl script to convert unicode mappings ( available - at http://www.unicode.org/Public/MAPPINGS/ ) to the nginx - configuration file format. - Two generated full maps for windows-1251 and koi8-r. - - -vim by Evan Miller - - Syntax highlighting of nginx configuration for vim, to be - placed into ~/.vim/. - diff --git a/src/deps/src/nginx-1.30.3/contrib/geo2nginx.pl b/src/deps/src/nginx-1.30.3/contrib/geo2nginx.pl deleted file mode 100644 index 29243ecf2b..0000000000 --- a/src/deps/src/nginx-1.30.3/contrib/geo2nginx.pl +++ /dev/null @@ -1,58 +0,0 @@ -#!/usr/bin/perl -w - -# (c) Andrei Nigmatulin, 2005 -# -# this script provided "as is", without any warranties. use it at your own risk. -# -# special thanx to Andrew Sitnikov for perl port -# -# this script converts CSV geoip database (free download at http://www.maxmind.com/app/geoip_country) -# to format, suitable for use with nginx_http_geo module (http://sysoev.ru/nginx) -# -# for example, line with ip range -# -# "62.16.68.0","62.16.127.255","1041253376","1041268735","RU","Russian Federation" -# -# will be converted to four subnetworks: -# -# 62.16.68.0/22 RU; -# 62.16.72.0/21 RU; -# 62.16.80.0/20 RU; -# 62.16.96.0/19 RU; - - -use warnings; -use strict; - -while( ){ - if (/"[^"]+","[^"]+","([^"]+)","([^"]+)","([^"]+)"/){ - print_subnets($1, $2, $3); - } -} - -sub print_subnets { - my ($a1, $a2, $c) = @_; - my $l; - while ($a1 <= $a2) { - for ($l = 0; ($a1 & (1 << $l)) == 0 && ($a1 + ((1 << ($l + 1)) - 1)) <= $a2; $l++){}; - print long2ip($a1) . "/" . (32 - $l) . " " . $c . ";\n"; - $a1 += (1 << $l); - } -} - -sub long2ip { - my $ip = shift; - - my $str = 0; - - $str = ($ip & 255); - - $ip >>= 8; - $str = ($ip & 255).".$str"; - - $ip >>= 8; - $str = ($ip & 255).".$str"; - - $ip >>= 8; - $str = ($ip & 255).".$str"; -} diff --git a/src/deps/src/nginx-1.30.3/contrib/unicode2nginx/koi-utf b/src/deps/src/nginx-1.30.3/contrib/unicode2nginx/koi-utf deleted file mode 100644 index 48853af9af..0000000000 --- a/src/deps/src/nginx-1.30.3/contrib/unicode2nginx/koi-utf +++ /dev/null @@ -1,131 +0,0 @@ -charset_map koi8-r utf-8 { - - 80 E29480 ; # BOX DRAWINGS LIGHT HORIZONTAL - 81 E29482 ; # BOX DRAWINGS LIGHT VERTICAL - 82 E2948C ; # BOX DRAWINGS LIGHT DOWN AND RIGHT - 83 E29490 ; # BOX DRAWINGS LIGHT DOWN AND LEFT - 84 E29494 ; # BOX DRAWINGS LIGHT UP AND RIGHT - 85 E29498 ; # BOX DRAWINGS LIGHT UP AND LEFT - 86 E2949C ; # BOX DRAWINGS LIGHT VERTICAL AND RIGHT - 87 E294A4 ; # BOX DRAWINGS LIGHT VERTICAL AND LEFT - 88 E294AC ; # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL - 89 E294B4 ; # BOX DRAWINGS LIGHT UP AND HORIZONTAL - 8A E294BC ; # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL - 8B E29680 ; # UPPER HALF BLOCK - 8C E29684 ; # LOWER HALF BLOCK - 8D E29688 ; # FULL BLOCK - 8E E2968C ; # LEFT HALF BLOCK - 8F E29690 ; # RIGHT HALF BLOCK - 90 E29691 ; # LIGHT SHADE - 91 E29692 ; # MEDIUM SHADE - 92 E29693 ; # DARK SHADE - 93 E28CA0 ; # TOP HALF INTEGRAL - 94 E296A0 ; # BLACK SQUARE - 95 E28899 ; # BULLET OPERATOR - 96 E2889A ; # SQUARE ROOT - 97 E28988 ; # ALMOST EQUAL TO - 98 E289A4 ; # LESS-THAN OR EQUAL TO - 99 E289A5 ; # GREATER-THAN OR EQUAL TO - 9A C2A0 ; # NO-BREAK SPACE - 9B E28CA1 ; # BOTTOM HALF INTEGRAL - 9C C2B0 ; # DEGREE SIGN - 9D C2B2 ; # SUPERSCRIPT TWO - 9E C2B7 ; # MIDDLE DOT - 9F C3B7 ; # DIVISION SIGN - A0 E29590 ; # BOX DRAWINGS DOUBLE HORIZONTAL - A1 E29591 ; # BOX DRAWINGS DOUBLE VERTICAL - A2 E29592 ; # BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE - A3 D191 ; # CYRILLIC SMALL LETTER IO - A4 E29593 ; # BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE - A5 E29594 ; # BOX DRAWINGS DOUBLE DOWN AND RIGHT - A6 E29595 ; # BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE - A7 E29596 ; # BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE - A8 E29597 ; # BOX DRAWINGS DOUBLE DOWN AND LEFT - A9 E29598 ; # BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE - AA E29599 ; # BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE - AB E2959A ; # BOX DRAWINGS DOUBLE UP AND RIGHT - AC E2959B ; # BOX DRAWINGS UP SINGLE AND LEFT DOUBLE - AD E2959C ; # BOX DRAWINGS UP DOUBLE AND LEFT SINGLE - AE E2959D ; # BOX DRAWINGS DOUBLE UP AND LEFT - AF E2959E ; # BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE - B0 E2959F ; # BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE - B1 E295A0 ; # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT - B2 E295A1 ; # BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE - B3 D081 ; # CYRILLIC CAPITAL LETTER IO - B4 E295A2 ; # BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE - B5 E295A3 ; # BOX DRAWINGS DOUBLE VERTICAL AND LEFT - B6 E295A4 ; # BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE - B7 E295A5 ; # BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE - B8 E295A6 ; # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL - B9 E295A7 ; # BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE - BA E295A8 ; # BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE - BB E295A9 ; # BOX DRAWINGS DOUBLE UP AND HORIZONTAL - BC E295AA ; # BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE - BD E295AB ; # BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE - BE E295AC ; # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL - BF C2A9 ; # COPYRIGHT SIGN - C0 D18E ; # CYRILLIC SMALL LETTER YU - C1 D0B0 ; # CYRILLIC SMALL LETTER A - C2 D0B1 ; # CYRILLIC SMALL LETTER BE - C3 D186 ; # CYRILLIC SMALL LETTER TSE - C4 D0B4 ; # CYRILLIC SMALL LETTER DE - C5 D0B5 ; # CYRILLIC SMALL LETTER IE - C6 D184 ; # CYRILLIC SMALL LETTER EF - C7 D0B3 ; # CYRILLIC SMALL LETTER GHE - C8 D185 ; # CYRILLIC SMALL LETTER HA - C9 D0B8 ; # CYRILLIC SMALL LETTER I - CA D0B9 ; # CYRILLIC SMALL LETTER SHORT I - CB D0BA ; # CYRILLIC SMALL LETTER KA - CC D0BB ; # CYRILLIC SMALL LETTER EL - CD D0BC ; # CYRILLIC SMALL LETTER EM - CE D0BD ; # CYRILLIC SMALL LETTER EN - CF D0BE ; # CYRILLIC SMALL LETTER O - D0 D0BF ; # CYRILLIC SMALL LETTER PE - D1 D18F ; # CYRILLIC SMALL LETTER YA - D2 D180 ; # CYRILLIC SMALL LETTER ER - D3 D181 ; # CYRILLIC SMALL LETTER ES - D4 D182 ; # CYRILLIC SMALL LETTER TE - D5 D183 ; # CYRILLIC SMALL LETTER U - D6 D0B6 ; # CYRILLIC SMALL LETTER ZHE - D7 D0B2 ; # CYRILLIC SMALL LETTER VE - D8 D18C ; # CYRILLIC SMALL LETTER SOFT SIGN - D9 D18B ; # CYRILLIC SMALL LETTER YERU - DA D0B7 ; # CYRILLIC SMALL LETTER ZE - DB D188 ; # CYRILLIC SMALL LETTER SHA - DC D18D ; # CYRILLIC SMALL LETTER E - DD D189 ; # CYRILLIC SMALL LETTER SHCHA - DE D187 ; # CYRILLIC SMALL LETTER CHE - DF D18A ; # CYRILLIC SMALL LETTER HARD SIGN - E0 D0AE ; # CYRILLIC CAPITAL LETTER YU - E1 D090 ; # CYRILLIC CAPITAL LETTER A - E2 D091 ; # CYRILLIC CAPITAL LETTER BE - E3 D0A6 ; # CYRILLIC CAPITAL LETTER TSE - E4 D094 ; # CYRILLIC CAPITAL LETTER DE - E5 D095 ; # CYRILLIC CAPITAL LETTER IE - E6 D0A4 ; # CYRILLIC CAPITAL LETTER EF - E7 D093 ; # CYRILLIC CAPITAL LETTER GHE - E8 D0A5 ; # CYRILLIC CAPITAL LETTER HA - E9 D098 ; # CYRILLIC CAPITAL LETTER I - EA D099 ; # CYRILLIC CAPITAL LETTER SHORT I - EB D09A ; # CYRILLIC CAPITAL LETTER KA - EC D09B ; # CYRILLIC CAPITAL LETTER EL - ED D09C ; # CYRILLIC CAPITAL LETTER EM - EE D09D ; # CYRILLIC CAPITAL LETTER EN - EF D09E ; # CYRILLIC CAPITAL LETTER O - F0 D09F ; # CYRILLIC CAPITAL LETTER PE - F1 D0AF ; # CYRILLIC CAPITAL LETTER YA - F2 D0A0 ; # CYRILLIC CAPITAL LETTER ER - F3 D0A1 ; # CYRILLIC CAPITAL LETTER ES - F4 D0A2 ; # CYRILLIC CAPITAL LETTER TE - F5 D0A3 ; # CYRILLIC CAPITAL LETTER U - F6 D096 ; # CYRILLIC CAPITAL LETTER ZHE - F7 D092 ; # CYRILLIC CAPITAL LETTER VE - F8 D0AC ; # CYRILLIC CAPITAL LETTER SOFT SIGN - F9 D0AB ; # CYRILLIC CAPITAL LETTER YERU - FA D097 ; # CYRILLIC CAPITAL LETTER ZE - FB D0A8 ; # CYRILLIC CAPITAL LETTER SHA - FC D0AD ; # CYRILLIC CAPITAL LETTER E - FD D0A9 ; # CYRILLIC CAPITAL LETTER SHCHA - FE D0A7 ; # CYRILLIC CAPITAL LETTER CHE - FF D0AA ; # CYRILLIC CAPITAL LETTER HARD SIGN -} diff --git a/src/deps/src/nginx-1.30.3/contrib/unicode2nginx/unicode-to-nginx.pl b/src/deps/src/nginx-1.30.3/contrib/unicode2nginx/unicode-to-nginx.pl deleted file mode 100755 index d113fede49..0000000000 --- a/src/deps/src/nginx-1.30.3/contrib/unicode2nginx/unicode-to-nginx.pl +++ /dev/null @@ -1,48 +0,0 @@ -#!/usr/bin/perl -w - -# Convert unicode mappings to nginx configuration file format. - -# You may find useful mappings in various places, including -# unicode.org official site: -# -# http://www.unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WINDOWS/CP1251.TXT -# http://www.unicode.org/Public/MAPPINGS/VENDORS/MISC/KOI8-R.TXT - -# Needs perl 5.6 or later. - -# Written by Maxim Dounin, mdounin@mdounin.ru - -############################################################################### - -require 5.006; - -while (<>) { - # Skip comments and empty lines - - next if /^#/; - next if /^\s*$/; - chomp; - - # Convert mappings - - if (/^\s*0x(..)\s*0x(....)\s*(#.*)/) { - # Mapping "#" - my $cs_code = $1; - my $un_code = $2; - my $un_name = $3; - - # Produce UTF-8 sequence from character code; - - my $un_utf8 = join('', - map { sprintf("%02X", $_) } - unpack("U0C*", pack("U", hex($un_code))) - ); - - print " $cs_code $un_utf8 ; $un_name\n"; - - } else { - warn "Unrecognized line: '$_'"; - } -} - -############################################################################### diff --git a/src/deps/src/nginx-1.30.3/contrib/unicode2nginx/win-utf b/src/deps/src/nginx-1.30.3/contrib/unicode2nginx/win-utf deleted file mode 100644 index af9f9aaa50..0000000000 --- a/src/deps/src/nginx-1.30.3/contrib/unicode2nginx/win-utf +++ /dev/null @@ -1,130 +0,0 @@ -charset_map windows-1251 utf-8 { - - 80 D082 ; #CYRILLIC CAPITAL LETTER DJE - 81 D083 ; #CYRILLIC CAPITAL LETTER GJE - 82 E2809A ; #SINGLE LOW-9 QUOTATION MARK - 83 D193 ; #CYRILLIC SMALL LETTER GJE - 84 E2809E ; #DOUBLE LOW-9 QUOTATION MARK - 85 E280A6 ; #HORIZONTAL ELLIPSIS - 86 E280A0 ; #DAGGER - 87 E280A1 ; #DOUBLE DAGGER - 88 E282AC ; #EURO SIGN - 89 E280B0 ; #PER MILLE SIGN - 8A D089 ; #CYRILLIC CAPITAL LETTER LJE - 8B E280B9 ; #SINGLE LEFT-POINTING ANGLE QUOTATION MARK - 8C D08A ; #CYRILLIC CAPITAL LETTER NJE - 8D D08C ; #CYRILLIC CAPITAL LETTER KJE - 8E D08B ; #CYRILLIC CAPITAL LETTER TSHE - 8F D08F ; #CYRILLIC CAPITAL LETTER DZHE - 90 D192 ; #CYRILLIC SMALL LETTER DJE - 91 E28098 ; #LEFT SINGLE QUOTATION MARK - 92 E28099 ; #RIGHT SINGLE QUOTATION MARK - 93 E2809C ; #LEFT DOUBLE QUOTATION MARK - 94 E2809D ; #RIGHT DOUBLE QUOTATION MARK - 95 E280A2 ; #BULLET - 96 E28093 ; #EN DASH - 97 E28094 ; #EM DASH - 99 E284A2 ; #TRADE MARK SIGN - 9A D199 ; #CYRILLIC SMALL LETTER LJE - 9B E280BA ; #SINGLE RIGHT-POINTING ANGLE QUOTATION MARK - 9C D19A ; #CYRILLIC SMALL LETTER NJE - 9D D19C ; #CYRILLIC SMALL LETTER KJE - 9E D19B ; #CYRILLIC SMALL LETTER TSHE - 9F D19F ; #CYRILLIC SMALL LETTER DZHE - A0 C2A0 ; #NO-BREAK SPACE - A1 D08E ; #CYRILLIC CAPITAL LETTER SHORT U - A2 D19E ; #CYRILLIC SMALL LETTER SHORT U - A3 D088 ; #CYRILLIC CAPITAL LETTER JE - A4 C2A4 ; #CURRENCY SIGN - A5 D290 ; #CYRILLIC CAPITAL LETTER GHE WITH UPTURN - A6 C2A6 ; #BROKEN BAR - A7 C2A7 ; #SECTION SIGN - A8 D081 ; #CYRILLIC CAPITAL LETTER IO - A9 C2A9 ; #COPYRIGHT SIGN - AA D084 ; #CYRILLIC CAPITAL LETTER UKRAINIAN IE - AB C2AB ; #LEFT-POINTING DOUBLE ANGLE QUOTATION MARK - AC C2AC ; #NOT SIGN - AD C2AD ; #SOFT HYPHEN - AE C2AE ; #REGISTERED SIGN - AF D087 ; #CYRILLIC CAPITAL LETTER YI - B0 C2B0 ; #DEGREE SIGN - B1 C2B1 ; #PLUS-MINUS SIGN - B2 D086 ; #CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I - B3 D196 ; #CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I - B4 D291 ; #CYRILLIC SMALL LETTER GHE WITH UPTURN - B5 C2B5 ; #MICRO SIGN - B6 C2B6 ; #PILCROW SIGN - B7 C2B7 ; #MIDDLE DOT - B8 D191 ; #CYRILLIC SMALL LETTER IO - B9 E28496 ; #NUMERO SIGN - BA D194 ; #CYRILLIC SMALL LETTER UKRAINIAN IE - BB C2BB ; #RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK - BC D198 ; #CYRILLIC SMALL LETTER JE - BD D085 ; #CYRILLIC CAPITAL LETTER DZE - BE D195 ; #CYRILLIC SMALL LETTER DZE - BF D197 ; #CYRILLIC SMALL LETTER YI - C0 D090 ; #CYRILLIC CAPITAL LETTER A - C1 D091 ; #CYRILLIC CAPITAL LETTER BE - C2 D092 ; #CYRILLIC CAPITAL LETTER VE - C3 D093 ; #CYRILLIC CAPITAL LETTER GHE - C4 D094 ; #CYRILLIC CAPITAL LETTER DE - C5 D095 ; #CYRILLIC CAPITAL LETTER IE - C6 D096 ; #CYRILLIC CAPITAL LETTER ZHE - C7 D097 ; #CYRILLIC CAPITAL LETTER ZE - C8 D098 ; #CYRILLIC CAPITAL LETTER I - C9 D099 ; #CYRILLIC CAPITAL LETTER SHORT I - CA D09A ; #CYRILLIC CAPITAL LETTER KA - CB D09B ; #CYRILLIC CAPITAL LETTER EL - CC D09C ; #CYRILLIC CAPITAL LETTER EM - CD D09D ; #CYRILLIC CAPITAL LETTER EN - CE D09E ; #CYRILLIC CAPITAL LETTER O - CF D09F ; #CYRILLIC CAPITAL LETTER PE - D0 D0A0 ; #CYRILLIC CAPITAL LETTER ER - D1 D0A1 ; #CYRILLIC CAPITAL LETTER ES - D2 D0A2 ; #CYRILLIC CAPITAL LETTER TE - D3 D0A3 ; #CYRILLIC CAPITAL LETTER U - D4 D0A4 ; #CYRILLIC CAPITAL LETTER EF - D5 D0A5 ; #CYRILLIC CAPITAL LETTER HA - D6 D0A6 ; #CYRILLIC CAPITAL LETTER TSE - D7 D0A7 ; #CYRILLIC CAPITAL LETTER CHE - D8 D0A8 ; #CYRILLIC CAPITAL LETTER SHA - D9 D0A9 ; #CYRILLIC CAPITAL LETTER SHCHA - DA D0AA ; #CYRILLIC CAPITAL LETTER HARD SIGN - DB D0AB ; #CYRILLIC CAPITAL LETTER YERU - DC D0AC ; #CYRILLIC CAPITAL LETTER SOFT SIGN - DD D0AD ; #CYRILLIC CAPITAL LETTER E - DE D0AE ; #CYRILLIC CAPITAL LETTER YU - DF D0AF ; #CYRILLIC CAPITAL LETTER YA - E0 D0B0 ; #CYRILLIC SMALL LETTER A - E1 D0B1 ; #CYRILLIC SMALL LETTER BE - E2 D0B2 ; #CYRILLIC SMALL LETTER VE - E3 D0B3 ; #CYRILLIC SMALL LETTER GHE - E4 D0B4 ; #CYRILLIC SMALL LETTER DE - E5 D0B5 ; #CYRILLIC SMALL LETTER IE - E6 D0B6 ; #CYRILLIC SMALL LETTER ZHE - E7 D0B7 ; #CYRILLIC SMALL LETTER ZE - E8 D0B8 ; #CYRILLIC SMALL LETTER I - E9 D0B9 ; #CYRILLIC SMALL LETTER SHORT I - EA D0BA ; #CYRILLIC SMALL LETTER KA - EB D0BB ; #CYRILLIC SMALL LETTER EL - EC D0BC ; #CYRILLIC SMALL LETTER EM - ED D0BD ; #CYRILLIC SMALL LETTER EN - EE D0BE ; #CYRILLIC SMALL LETTER O - EF D0BF ; #CYRILLIC SMALL LETTER PE - F0 D180 ; #CYRILLIC SMALL LETTER ER - F1 D181 ; #CYRILLIC SMALL LETTER ES - F2 D182 ; #CYRILLIC SMALL LETTER TE - F3 D183 ; #CYRILLIC SMALL LETTER U - F4 D184 ; #CYRILLIC SMALL LETTER EF - F5 D185 ; #CYRILLIC SMALL LETTER HA - F6 D186 ; #CYRILLIC SMALL LETTER TSE - F7 D187 ; #CYRILLIC SMALL LETTER CHE - F8 D188 ; #CYRILLIC SMALL LETTER SHA - F9 D189 ; #CYRILLIC SMALL LETTER SHCHA - FA D18A ; #CYRILLIC SMALL LETTER HARD SIGN - FB D18B ; #CYRILLIC SMALL LETTER YERU - FC D18C ; #CYRILLIC SMALL LETTER SOFT SIGN - FD D18D ; #CYRILLIC SMALL LETTER E - FE D18E ; #CYRILLIC SMALL LETTER YU - FF D18F ; #CYRILLIC SMALL LETTER YA -} diff --git a/src/deps/src/nginx-1.30.3/contrib/vim/ftdetect/nginx.vim b/src/deps/src/nginx-1.30.3/contrib/vim/ftdetect/nginx.vim deleted file mode 100644 index 3ae470d249..0000000000 --- a/src/deps/src/nginx-1.30.3/contrib/vim/ftdetect/nginx.vim +++ /dev/null @@ -1,4 +0,0 @@ -au BufRead,BufNewFile *.nginx set ft=nginx -au BufRead,BufNewFile */etc/nginx/* set ft=nginx -au BufRead,BufNewFile */usr/local/nginx/conf/* set ft=nginx -au BufRead,BufNewFile nginx.conf set ft=nginx diff --git a/src/deps/src/nginx-1.30.3/contrib/vim/ftplugin/nginx.vim b/src/deps/src/nginx-1.30.3/contrib/vim/ftplugin/nginx.vim deleted file mode 100644 index 463eea9896..0000000000 --- a/src/deps/src/nginx-1.30.3/contrib/vim/ftplugin/nginx.vim +++ /dev/null @@ -1 +0,0 @@ -setlocal commentstring=#\ %s diff --git a/src/deps/src/nginx-1.30.3/contrib/vim/indent/nginx.vim b/src/deps/src/nginx-1.30.3/contrib/vim/indent/nginx.vim deleted file mode 100644 index 8601366854..0000000000 --- a/src/deps/src/nginx-1.30.3/contrib/vim/indent/nginx.vim +++ /dev/null @@ -1,11 +0,0 @@ -if exists("b:did_indent") - finish -endif -let b:did_indent = 1 - -setlocal indentexpr= - -" cindent actually works for nginx' simple file structure -setlocal cindent -" Just make sure that the comments are not reset as defs would be. -setlocal cinkeys-=0# diff --git a/src/deps/src/nginx-1.30.3/contrib/vim/syntax/nginx.vim b/src/deps/src/nginx-1.30.3/contrib/vim/syntax/nginx.vim deleted file mode 100644 index ea7c58464b..0000000000 --- a/src/deps/src/nginx-1.30.3/contrib/vim/syntax/nginx.vim +++ /dev/null @@ -1,1979 +0,0 @@ -" Vim syntax file -" Language: nginx.conf - -if exists("b:current_syntax") - finish -end - -let s:save_cpo = &cpo -set cpo&vim - -" general syntax - -if has("patch-7.4.1142") - " except control characters, ";", "{", and "}" - syn iskeyword 33-58,60-122,124,126-255 -endif - -syn match ngxName '\([^;{} \t\\]\|\\.\)\+' - \ contains=@ngxDirectives - \ nextgroup=@ngxParams skipwhite skipempty -syn match ngxParam '\(\${\|[^;{ \t\\]\|\\.\)\+' - \ contained - \ contains=ngxVariable - \ nextgroup=@ngxParams skipwhite skipempty -syn region ngxString start=+\z(["']\)+ end=+\z1+ skip=+\\\\\|\\\z1+ - \ contains=ngxVariableString - \ nextgroup=@ngxParams skipwhite skipempty -syn match ngxParamComment '#.*$' - \ nextgroup=@ngxParams skipwhite skipempty -syn match ngxSemicolon ';' contained -syn region ngxBlock start=+{+ end=+}+ contained - \ contains=@ngxTopLevel -syn match ngxComment '#.*$' - -syn match ngxVariable '\$\(\w\+\|{\w\+}\)' contained -syn match ngxVariableString '\$\(\w\+\|{\w\+}\)' contained - -syn cluster ngxTopLevel - \ contains=ngxName,ngxString,ngxComment -syn cluster ngxDirectives - \ contains=ngxDirective,ngxDirectiveBlock,ngxDirectiveImportant - \ add=ngxDirectiveControl,ngxDirectiveError,ngxDirectiveDeprecated - \ add=ngxDirectiveThirdParty,ngxDirectiveThirdPartyDeprecated -syn cluster ngxParams - \ contains=ngxParam,ngxString,ngxParamComment,ngxSemicolon,ngxBlock - -" boolean parameters - -syn keyword ngxBoolean contained on off - \ nextgroup=@ngxParams skipwhite skipempty -syn cluster ngxParams add=ngxBoolean - -" listen directive - -syn cluster ngxTopLevel add=ngxDirectiveListen -syn keyword ngxDirectiveListen listen - \ nextgroup=@ngxListenParams skipwhite skipempty -syn match ngxListenParam '\(\${\|[^;{ \t\\]\|\\.\)\+' - \ contained - \ nextgroup=@ngxListenParams skipwhite skipempty -syn region ngxListenString start=+\z(["']\)+ end=+\z1+ skip=+\\\\\|\\\z1+ - \ contained - \ nextgroup=@ngxListenParams skipwhite skipempty -syn match ngxListenComment '#.*$' - \ contained - \ nextgroup=@ngxListenParams skipwhite skipempty -syn keyword ngxListenOptions contained - \ default_server ssl quic proxy_protocol multipath - \ setfib fastopen backlog rcvbuf sndbuf accept_filter deferred bind - \ ipv6only reuseport so_keepalive - \ nextgroup=@ngxListenParams skipwhite skipempty -syn keyword ngxListenOptionsDeprecated contained - \ http2 - \ nextgroup=@ngxListenParams skipwhite skipempty -syn cluster ngxListenParams - \ contains=ngxListenParam,ngxListenString,ngxListenComment - \ add=ngxListenOptions,ngxListenOptionsDeprecated - -syn keyword ngxDirectiveBlock contained http -syn keyword ngxDirectiveBlock contained stream -syn keyword ngxDirectiveBlock contained mail -syn keyword ngxDirectiveBlock contained events -syn keyword ngxDirectiveBlock contained server -syn keyword ngxDirectiveBlock contained types -syn keyword ngxDirectiveBlock contained location -syn keyword ngxDirectiveBlock contained upstream -syn keyword ngxDirectiveBlock contained charset_map -syn keyword ngxDirectiveBlock contained limit_except -syn keyword ngxDirectiveBlock contained if -syn keyword ngxDirectiveBlock contained geo -syn keyword ngxDirectiveBlock contained map -syn keyword ngxDirectiveBlock contained split_clients - -syn keyword ngxDirectiveImportant contained include -syn keyword ngxDirectiveImportant contained root -syn keyword ngxDirectiveImportant contained server_name -syn keyword ngxDirectiveImportant contained internal -syn keyword ngxDirectiveImportant contained proxy_pass -syn keyword ngxDirectiveImportant contained memcached_pass -syn keyword ngxDirectiveImportant contained fastcgi_pass -syn keyword ngxDirectiveImportant contained scgi_pass -syn keyword ngxDirectiveImportant contained uwsgi_pass -syn keyword ngxDirectiveImportant contained try_files - -syn keyword ngxDirectiveControl contained break -syn keyword ngxDirectiveControl contained return -syn keyword ngxDirectiveControl contained rewrite -syn keyword ngxDirectiveControl contained set - -syn keyword ngxDirectiveError contained error_page -syn keyword ngxDirectiveError contained post_action - -syn keyword ngxDirectiveDeprecated contained proxy_downstream_buffer -syn keyword ngxDirectiveDeprecated contained proxy_upstream_buffer -syn keyword ngxDirectiveDeprecated contained http2_idle_timeout -syn keyword ngxDirectiveDeprecated contained http2_max_field_size -syn keyword ngxDirectiveDeprecated contained http2_max_header_size -syn keyword ngxDirectiveDeprecated contained http2_max_requests -syn keyword ngxDirectiveDeprecated contained http2_recv_timeout - -syn keyword ngxDirective contained absolute_redirect -syn keyword ngxDirective contained accept_mutex -syn keyword ngxDirective contained accept_mutex_delay -syn keyword ngxDirective contained acceptex_read -syn keyword ngxDirective contained access_log -syn keyword ngxDirective contained add_after_body -syn keyword ngxDirective contained add_before_body -syn keyword ngxDirective contained add_header -syn keyword ngxDirective contained add_trailer -syn keyword ngxDirective contained addition_types -syn keyword ngxDirective contained aio -syn keyword ngxDirective contained aio_write -syn keyword ngxDirective contained alias -syn keyword ngxDirective contained allow -syn keyword ngxDirective contained ancient_browser -syn keyword ngxDirective contained ancient_browser_value -syn keyword ngxDirective contained auth_basic -syn keyword ngxDirective contained auth_basic_user_file -syn keyword ngxDirective contained auth_delay -syn keyword ngxDirective contained auth_http -syn keyword ngxDirective contained auth_http_header -syn keyword ngxDirective contained auth_http_pass_client_cert -syn keyword ngxDirective contained auth_http_timeout -syn keyword ngxDirective contained auth_request -syn keyword ngxDirective contained auth_request_set -syn keyword ngxDirective contained autoindex -syn keyword ngxDirective contained autoindex_exact_size -syn keyword ngxDirective contained autoindex_format -syn keyword ngxDirective contained autoindex_localtime -syn keyword ngxDirective contained charset -syn keyword ngxDirective contained charset_types -syn keyword ngxDirective contained chunked_transfer_encoding -syn keyword ngxDirective contained client_body_buffer_size -syn keyword ngxDirective contained client_body_in_file_only -syn keyword ngxDirective contained client_body_in_single_buffer -syn keyword ngxDirective contained client_body_temp_path -syn keyword ngxDirective contained client_body_timeout -syn keyword ngxDirective contained client_header_buffer_size -syn keyword ngxDirective contained client_header_timeout -syn keyword ngxDirective contained client_max_body_size -syn keyword ngxDirective contained connection_pool_size -syn keyword ngxDirective contained create_full_put_path -syn keyword ngxDirective contained daemon -syn keyword ngxDirective contained dav_access -syn keyword ngxDirective contained dav_methods -syn keyword ngxDirective contained debug_connection -syn keyword ngxDirective contained debug_points -syn keyword ngxDirective contained default_type -syn keyword ngxDirective contained degradation -syn keyword ngxDirective contained degrade -syn keyword ngxDirective contained deny -syn keyword ngxDirective contained devpoll_changes -syn keyword ngxDirective contained devpoll_events -syn keyword ngxDirective contained directio -syn keyword ngxDirective contained directio_alignment -syn keyword ngxDirective contained disable_symlinks -syn keyword ngxDirective contained empty_gif -syn keyword ngxDirective contained env -syn keyword ngxDirective contained epoll_events -syn keyword ngxDirective contained error_log -syn keyword ngxDirective contained etag -syn keyword ngxDirective contained eventport_events -syn keyword ngxDirective contained expires -syn keyword ngxDirective contained fastcgi_bind -syn keyword ngxDirective contained fastcgi_buffer_size -syn keyword ngxDirective contained fastcgi_buffering -syn keyword ngxDirective contained fastcgi_buffers -syn keyword ngxDirective contained fastcgi_busy_buffers_size -syn keyword ngxDirective contained fastcgi_cache -syn keyword ngxDirective contained fastcgi_cache_background_update -syn keyword ngxDirective contained fastcgi_cache_bypass -syn keyword ngxDirective contained fastcgi_cache_key -syn keyword ngxDirective contained fastcgi_cache_lock -syn keyword ngxDirective contained fastcgi_cache_lock_age -syn keyword ngxDirective contained fastcgi_cache_lock_timeout -syn keyword ngxDirective contained fastcgi_cache_max_range_offset -syn keyword ngxDirective contained fastcgi_cache_methods -syn keyword ngxDirective contained fastcgi_cache_min_uses -syn keyword ngxDirective contained fastcgi_cache_path -syn keyword ngxDirective contained fastcgi_cache_revalidate -syn keyword ngxDirective contained fastcgi_cache_use_stale -syn keyword ngxDirective contained fastcgi_cache_valid -syn keyword ngxDirective contained fastcgi_catch_stderr -syn keyword ngxDirective contained fastcgi_connect_timeout -syn keyword ngxDirective contained fastcgi_force_ranges -syn keyword ngxDirective contained fastcgi_hide_header -syn keyword ngxDirective contained fastcgi_ignore_client_abort -syn keyword ngxDirective contained fastcgi_ignore_headers -syn keyword ngxDirective contained fastcgi_index -syn keyword ngxDirective contained fastcgi_intercept_errors -syn keyword ngxDirective contained fastcgi_keep_conn -syn keyword ngxDirective contained fastcgi_limit_rate -syn keyword ngxDirective contained fastcgi_max_temp_file_size -syn keyword ngxDirective contained fastcgi_next_upstream -syn keyword ngxDirective contained fastcgi_next_upstream_timeout -syn keyword ngxDirective contained fastcgi_next_upstream_tries -syn keyword ngxDirective contained fastcgi_no_cache -syn keyword ngxDirective contained fastcgi_param -syn keyword ngxDirective contained fastcgi_pass_header -syn keyword ngxDirective contained fastcgi_pass_request_body -syn keyword ngxDirective contained fastcgi_pass_request_headers -syn keyword ngxDirective contained fastcgi_read_timeout -syn keyword ngxDirective contained fastcgi_request_buffering -syn keyword ngxDirective contained fastcgi_send_lowat -syn keyword ngxDirective contained fastcgi_send_timeout -syn keyword ngxDirective contained fastcgi_socket_keepalive -syn keyword ngxDirective contained fastcgi_split_path_info -syn keyword ngxDirective contained fastcgi_store -syn keyword ngxDirective contained fastcgi_store_access -syn keyword ngxDirective contained fastcgi_temp_file_write_size -syn keyword ngxDirective contained fastcgi_temp_path -syn keyword ngxDirective contained flv -syn keyword ngxDirective contained geoip_city -syn keyword ngxDirective contained geoip_country -syn keyword ngxDirective contained geoip_org -syn keyword ngxDirective contained geoip_proxy -syn keyword ngxDirective contained geoip_proxy_recursive -syn keyword ngxDirective contained google_perftools_profiles -syn keyword ngxDirective contained grpc_bind -syn keyword ngxDirective contained grpc_buffer_size -syn keyword ngxDirective contained grpc_connect_timeout -syn keyword ngxDirective contained grpc_hide_header -syn keyword ngxDirective contained grpc_ignore_headers -syn keyword ngxDirective contained grpc_intercept_errors -syn keyword ngxDirective contained grpc_next_upstream -syn keyword ngxDirective contained grpc_next_upstream_timeout -syn keyword ngxDirective contained grpc_next_upstream_tries -syn keyword ngxDirective contained grpc_pass -syn keyword ngxDirective contained grpc_pass_header -syn keyword ngxDirective contained grpc_read_timeout -syn keyword ngxDirective contained grpc_send_timeout -syn keyword ngxDirective contained grpc_set_header -syn keyword ngxDirective contained grpc_socket_keepalive -syn keyword ngxDirective contained grpc_ssl_certificate -syn keyword ngxDirective contained grpc_ssl_certificate_key -syn keyword ngxDirective contained grpc_ssl_ciphers -syn keyword ngxDirective contained grpc_ssl_conf_command -syn keyword ngxDirective contained grpc_ssl_crl -syn keyword ngxDirective contained grpc_ssl_name -syn keyword ngxDirective contained grpc_ssl_password_file -syn keyword ngxDirective contained grpc_ssl_protocols -syn keyword ngxDirective contained grpc_ssl_server_name -syn keyword ngxDirective contained grpc_ssl_session_reuse -syn keyword ngxDirective contained grpc_ssl_trusted_certificate -syn keyword ngxDirective contained grpc_ssl_verify -syn keyword ngxDirective contained grpc_ssl_verify_depth -syn keyword ngxDirective contained gunzip -syn keyword ngxDirective contained gunzip_buffers -syn keyword ngxDirective contained gzip -syn keyword ngxDirective contained gzip_buffers -syn keyword ngxDirective contained gzip_comp_level -syn keyword ngxDirective contained gzip_disable -syn keyword ngxDirective contained gzip_hash -syn keyword ngxDirective contained gzip_http_version -syn keyword ngxDirective contained gzip_min_length -syn keyword ngxDirective contained gzip_no_buffer -syn keyword ngxDirective contained gzip_proxied -syn keyword ngxDirective contained gzip_static -syn keyword ngxDirective contained gzip_types -syn keyword ngxDirective contained gzip_vary -syn keyword ngxDirective contained gzip_window -syn keyword ngxDirective contained hash -syn keyword ngxDirective contained http2 -syn keyword ngxDirective contained http2_body_preread_size -syn keyword ngxDirective contained http2_chunk_size -syn keyword ngxDirective contained http2_max_concurrent_pushes -syn keyword ngxDirective contained http2_max_concurrent_streams -syn keyword ngxDirective contained http2_pool_size -syn keyword ngxDirective contained http2_push -syn keyword ngxDirective contained http2_push_preload -syn keyword ngxDirective contained http2_recv_buffer_size -syn keyword ngxDirective contained http2_streams_index_size -syn keyword ngxDirective contained http3 -syn keyword ngxDirective contained http3_hq -syn keyword ngxDirective contained http3_max_concurrent_streams -syn keyword ngxDirective contained http3_stream_buffer_size -syn keyword ngxDirective contained if_modified_since -syn keyword ngxDirective contained ignore_invalid_headers -syn keyword ngxDirective contained image_filter -syn keyword ngxDirective contained image_filter_buffer -syn keyword ngxDirective contained image_filter_interlace -syn keyword ngxDirective contained image_filter_jpeg_quality -syn keyword ngxDirective contained image_filter_sharpen -syn keyword ngxDirective contained image_filter_transparency -syn keyword ngxDirective contained image_filter_webp_quality -syn keyword ngxDirective contained imap_auth -syn keyword ngxDirective contained imap_capabilities -syn keyword ngxDirective contained imap_client_buffer -syn keyword ngxDirective contained index -syn keyword ngxDirective contained iocp_threads -syn keyword ngxDirective contained ip_hash -syn keyword ngxDirective contained js_access -syn keyword ngxDirective contained js_body_filter -syn keyword ngxDirective contained js_content -syn keyword ngxDirective contained js_fetch_buffer_size -syn keyword ngxDirective contained js_fetch_ciphers -syn keyword ngxDirective contained js_fetch_max_response_buffer_size -syn keyword ngxDirective contained js_fetch_protocols -syn keyword ngxDirective contained js_fetch_timeout -syn keyword ngxDirective contained js_fetch_trusted_certificate -syn keyword ngxDirective contained js_fetch_verify -syn keyword ngxDirective contained js_fetch_verify_depth -syn keyword ngxDirective contained js_filter -syn keyword ngxDirective contained js_header_filter -syn keyword ngxDirective contained js_import -syn keyword ngxDirective contained js_path -syn keyword ngxDirective contained js_preload_object -syn keyword ngxDirective contained js_preread -syn keyword ngxDirective contained js_set -syn keyword ngxDirective contained js_shared_dict_zone -syn keyword ngxDirective contained js_var -syn keyword ngxDirective contained keepalive -syn keyword ngxDirective contained keepalive_disable -syn keyword ngxDirective contained keepalive_requests -syn keyword ngxDirective contained keepalive_time -syn keyword ngxDirective contained keepalive_timeout -syn keyword ngxDirective contained kqueue_changes -syn keyword ngxDirective contained kqueue_events -syn keyword ngxDirective contained large_client_header_buffers -syn keyword ngxDirective contained least_conn -syn keyword ngxDirective contained limit_conn -syn keyword ngxDirective contained limit_conn_dry_run -syn keyword ngxDirective contained limit_conn_log_level -syn keyword ngxDirective contained limit_conn_status -syn keyword ngxDirective contained limit_conn_zone -syn keyword ngxDirective contained limit_rate -syn keyword ngxDirective contained limit_rate_after -syn keyword ngxDirective contained limit_req -syn keyword ngxDirective contained limit_req_dry_run -syn keyword ngxDirective contained limit_req_log_level -syn keyword ngxDirective contained limit_req_status -syn keyword ngxDirective contained limit_req_zone -syn keyword ngxDirective contained lingering_close -syn keyword ngxDirective contained lingering_time -syn keyword ngxDirective contained lingering_timeout -syn keyword ngxDirective contained load_module -syn keyword ngxDirective contained lock_file -syn keyword ngxDirective contained log_format -syn keyword ngxDirective contained log_not_found -syn keyword ngxDirective contained log_subrequest -syn keyword ngxDirective contained map_hash_bucket_size -syn keyword ngxDirective contained map_hash_max_size -syn keyword ngxDirective contained master_process -syn keyword ngxDirective contained max_errors -syn keyword ngxDirective contained max_ranges -syn keyword ngxDirective contained memcached_bind -syn keyword ngxDirective contained memcached_buffer_size -syn keyword ngxDirective contained memcached_connect_timeout -syn keyword ngxDirective contained memcached_gzip_flag -syn keyword ngxDirective contained memcached_next_upstream -syn keyword ngxDirective contained memcached_next_upstream_timeout -syn keyword ngxDirective contained memcached_next_upstream_tries -syn keyword ngxDirective contained memcached_read_timeout -syn keyword ngxDirective contained memcached_send_timeout -syn keyword ngxDirective contained memcached_socket_keepalive -syn keyword ngxDirective contained merge_slashes -syn keyword ngxDirective contained min_delete_depth -syn keyword ngxDirective contained mirror -syn keyword ngxDirective contained mirror_request_body -syn keyword ngxDirective contained modern_browser -syn keyword ngxDirective contained modern_browser_value -syn keyword ngxDirective contained mp4 -syn keyword ngxDirective contained mp4_buffer_size -syn keyword ngxDirective contained mp4_max_buffer_size -syn keyword ngxDirective contained mp4_start_key_frame -syn keyword ngxDirective contained msie_padding -syn keyword ngxDirective contained msie_refresh -syn keyword ngxDirective contained multi_accept -syn keyword ngxDirective contained open_file_cache -syn keyword ngxDirective contained open_file_cache_errors -syn keyword ngxDirective contained open_file_cache_events -syn keyword ngxDirective contained open_file_cache_min_uses -syn keyword ngxDirective contained open_file_cache_valid -syn keyword ngxDirective contained open_log_file_cache -syn keyword ngxDirective contained output_buffers -syn keyword ngxDirective contained override_charset -syn keyword ngxDirective contained pcre_jit -syn keyword ngxDirective contained perl -syn keyword ngxDirective contained perl_modules -syn keyword ngxDirective contained perl_require -syn keyword ngxDirective contained perl_set -syn keyword ngxDirective contained pid -syn keyword ngxDirective contained pop3_auth -syn keyword ngxDirective contained pop3_capabilities -syn keyword ngxDirective contained port_in_redirect -syn keyword ngxDirective contained post_acceptex -syn keyword ngxDirective contained postpone_gzipping -syn keyword ngxDirective contained postpone_output -syn keyword ngxDirective contained preread_buffer_size -syn keyword ngxDirective contained preread_timeout -syn keyword ngxDirective contained protocol -syn keyword ngxDirective contained proxy -syn keyword ngxDirective contained proxy_bind -syn keyword ngxDirective contained proxy_buffer -syn keyword ngxDirective contained proxy_buffer_size -syn keyword ngxDirective contained proxy_buffering -syn keyword ngxDirective contained proxy_buffers -syn keyword ngxDirective contained proxy_busy_buffers_size -syn keyword ngxDirective contained proxy_cache -syn keyword ngxDirective contained proxy_cache_background_update -syn keyword ngxDirective contained proxy_cache_bypass -syn keyword ngxDirective contained proxy_cache_convert_head -syn keyword ngxDirective contained proxy_cache_key -syn keyword ngxDirective contained proxy_cache_lock -syn keyword ngxDirective contained proxy_cache_lock_age -syn keyword ngxDirective contained proxy_cache_lock_timeout -syn keyword ngxDirective contained proxy_cache_max_range_offset -syn keyword ngxDirective contained proxy_cache_methods -syn keyword ngxDirective contained proxy_cache_min_uses -syn keyword ngxDirective contained proxy_cache_path -syn keyword ngxDirective contained proxy_cache_revalidate -syn keyword ngxDirective contained proxy_cache_use_stale -syn keyword ngxDirective contained proxy_cache_valid -syn keyword ngxDirective contained proxy_connect_timeout -syn keyword ngxDirective contained proxy_cookie_domain -syn keyword ngxDirective contained proxy_cookie_flags -syn keyword ngxDirective contained proxy_cookie_path -syn keyword ngxDirective contained proxy_download_rate -syn keyword ngxDirective contained proxy_force_ranges -syn keyword ngxDirective contained proxy_half_close -syn keyword ngxDirective contained proxy_headers_hash_bucket_size -syn keyword ngxDirective contained proxy_headers_hash_max_size -syn keyword ngxDirective contained proxy_hide_header -syn keyword ngxDirective contained proxy_http_version -syn keyword ngxDirective contained proxy_ignore_client_abort -syn keyword ngxDirective contained proxy_ignore_headers -syn keyword ngxDirective contained proxy_intercept_errors -syn keyword ngxDirective contained proxy_limit_rate -syn keyword ngxDirective contained proxy_max_temp_file_size -syn keyword ngxDirective contained proxy_method -syn keyword ngxDirective contained proxy_next_upstream -syn keyword ngxDirective contained proxy_next_upstream_timeout -syn keyword ngxDirective contained proxy_next_upstream_tries -syn keyword ngxDirective contained proxy_no_cache -syn keyword ngxDirective contained proxy_pass_error_message -syn keyword ngxDirective contained proxy_pass_header -syn keyword ngxDirective contained proxy_pass_request_body -syn keyword ngxDirective contained proxy_pass_request_headers -syn keyword ngxDirective contained proxy_protocol -syn keyword ngxDirective contained proxy_protocol_timeout -syn keyword ngxDirective contained proxy_read_timeout -syn keyword ngxDirective contained proxy_redirect -syn keyword ngxDirective contained proxy_request_buffering -syn keyword ngxDirective contained proxy_requests -syn keyword ngxDirective contained proxy_responses -syn keyword ngxDirective contained proxy_send_lowat -syn keyword ngxDirective contained proxy_send_timeout -syn keyword ngxDirective contained proxy_set_body -syn keyword ngxDirective contained proxy_set_header -syn keyword ngxDirective contained proxy_smtp_auth -syn keyword ngxDirective contained proxy_socket_keepalive -syn keyword ngxDirective contained proxy_ssl -syn keyword ngxDirective contained proxy_ssl_certificate -syn keyword ngxDirective contained proxy_ssl_certificate_key -syn keyword ngxDirective contained proxy_ssl_ciphers -syn keyword ngxDirective contained proxy_ssl_conf_command -syn keyword ngxDirective contained proxy_ssl_crl -syn keyword ngxDirective contained proxy_ssl_name -syn keyword ngxDirective contained proxy_ssl_password_file -syn keyword ngxDirective contained proxy_ssl_protocols -syn keyword ngxDirective contained proxy_ssl_server_name -syn keyword ngxDirective contained proxy_ssl_session_reuse -syn keyword ngxDirective contained proxy_ssl_trusted_certificate -syn keyword ngxDirective contained proxy_ssl_verify -syn keyword ngxDirective contained proxy_ssl_verify_depth -syn keyword ngxDirective contained proxy_store -syn keyword ngxDirective contained proxy_store_access -syn keyword ngxDirective contained proxy_temp_file_write_size -syn keyword ngxDirective contained proxy_temp_path -syn keyword ngxDirective contained proxy_timeout -syn keyword ngxDirective contained proxy_upload_rate -syn keyword ngxDirective contained quic_active_connection_id_limit -syn keyword ngxDirective contained quic_bpf -syn keyword ngxDirective contained quic_gso -syn keyword ngxDirective contained quic_host_key -syn keyword ngxDirective contained quic_retry -syn keyword ngxDirective contained random -syn keyword ngxDirective contained random_index -syn keyword ngxDirective contained read_ahead -syn keyword ngxDirective contained real_ip_header -syn keyword ngxDirective contained real_ip_recursive -syn keyword ngxDirective contained recursive_error_pages -syn keyword ngxDirective contained referer_hash_bucket_size -syn keyword ngxDirective contained referer_hash_max_size -syn keyword ngxDirective contained request_pool_size -syn keyword ngxDirective contained reset_timedout_connection -syn keyword ngxDirective contained resolver -syn keyword ngxDirective contained resolver_timeout -syn keyword ngxDirective contained rewrite_log -syn keyword ngxDirective contained satisfy -syn keyword ngxDirective contained scgi_bind -syn keyword ngxDirective contained scgi_buffer_size -syn keyword ngxDirective contained scgi_buffering -syn keyword ngxDirective contained scgi_buffers -syn keyword ngxDirective contained scgi_busy_buffers_size -syn keyword ngxDirective contained scgi_cache -syn keyword ngxDirective contained scgi_cache_background_update -syn keyword ngxDirective contained scgi_cache_bypass -syn keyword ngxDirective contained scgi_cache_key -syn keyword ngxDirective contained scgi_cache_lock -syn keyword ngxDirective contained scgi_cache_lock_age -syn keyword ngxDirective contained scgi_cache_lock_timeout -syn keyword ngxDirective contained scgi_cache_max_range_offset -syn keyword ngxDirective contained scgi_cache_methods -syn keyword ngxDirective contained scgi_cache_min_uses -syn keyword ngxDirective contained scgi_cache_path -syn keyword ngxDirective contained scgi_cache_revalidate -syn keyword ngxDirective contained scgi_cache_use_stale -syn keyword ngxDirective contained scgi_cache_valid -syn keyword ngxDirective contained scgi_connect_timeout -syn keyword ngxDirective contained scgi_force_ranges -syn keyword ngxDirective contained scgi_hide_header -syn keyword ngxDirective contained scgi_ignore_client_abort -syn keyword ngxDirective contained scgi_ignore_headers -syn keyword ngxDirective contained scgi_intercept_errors -syn keyword ngxDirective contained scgi_limit_rate -syn keyword ngxDirective contained scgi_max_temp_file_size -syn keyword ngxDirective contained scgi_next_upstream -syn keyword ngxDirective contained scgi_next_upstream_timeout -syn keyword ngxDirective contained scgi_next_upstream_tries -syn keyword ngxDirective contained scgi_no_cache -syn keyword ngxDirective contained scgi_param -syn keyword ngxDirective contained scgi_pass_header -syn keyword ngxDirective contained scgi_pass_request_body -syn keyword ngxDirective contained scgi_pass_request_headers -syn keyword ngxDirective contained scgi_read_timeout -syn keyword ngxDirective contained scgi_request_buffering -syn keyword ngxDirective contained scgi_send_timeout -syn keyword ngxDirective contained scgi_socket_keepalive -syn keyword ngxDirective contained scgi_store -syn keyword ngxDirective contained scgi_store_access -syn keyword ngxDirective contained scgi_temp_file_write_size -syn keyword ngxDirective contained scgi_temp_path -syn keyword ngxDirective contained secure_link -syn keyword ngxDirective contained secure_link_md5 -syn keyword ngxDirective contained secure_link_secret -syn keyword ngxDirective contained send_lowat -syn keyword ngxDirective contained send_timeout -syn keyword ngxDirective contained sendfile -syn keyword ngxDirective contained sendfile_max_chunk -syn keyword ngxDirective contained server_name_in_redirect -syn keyword ngxDirective contained server_names_hash_bucket_size -syn keyword ngxDirective contained server_names_hash_max_size -syn keyword ngxDirective contained server_tokens -syn keyword ngxDirective contained set_real_ip_from -syn keyword ngxDirective contained slice -syn keyword ngxDirective contained smtp_auth -syn keyword ngxDirective contained smtp_capabilities -syn keyword ngxDirective contained smtp_client_buffer -syn keyword ngxDirective contained smtp_greeting_delay -syn keyword ngxDirective contained source_charset -syn keyword ngxDirective contained ssi -syn keyword ngxDirective contained ssi_ignore_recycled_buffers -syn keyword ngxDirective contained ssi_last_modified -syn keyword ngxDirective contained ssi_min_file_chunk -syn keyword ngxDirective contained ssi_silent_errors -syn keyword ngxDirective contained ssi_types -syn keyword ngxDirective contained ssi_value_length -syn keyword ngxDirective contained ssl_alpn -syn keyword ngxDirective contained ssl_buffer_size -syn keyword ngxDirective contained ssl_certificate -syn keyword ngxDirective contained ssl_certificate_key -syn keyword ngxDirective contained ssl_ciphers -syn keyword ngxDirective contained ssl_client_certificate -syn keyword ngxDirective contained ssl_conf_command -syn keyword ngxDirective contained ssl_crl -syn keyword ngxDirective contained ssl_dhparam -syn keyword ngxDirective contained ssl_early_data -syn keyword ngxDirective contained ssl_ecdh_curve -syn keyword ngxDirective contained ssl_engine -syn keyword ngxDirective contained ssl_handshake_timeout -syn keyword ngxDirective contained ssl_ocsp -syn keyword ngxDirective contained ssl_ocsp_cache -syn keyword ngxDirective contained ssl_ocsp_responder -syn keyword ngxDirective contained ssl_password_file -syn keyword ngxDirective contained ssl_prefer_server_ciphers -syn keyword ngxDirective contained ssl_preread -syn keyword ngxDirective contained ssl_protocols -syn keyword ngxDirective contained ssl_reject_handshake -syn keyword ngxDirective contained ssl_session_cache -syn keyword ngxDirective contained ssl_session_ticket_key -syn keyword ngxDirective contained ssl_session_tickets -syn keyword ngxDirective contained ssl_session_timeout -syn keyword ngxDirective contained ssl_stapling -syn keyword ngxDirective contained ssl_stapling_file -syn keyword ngxDirective contained ssl_stapling_responder -syn keyword ngxDirective contained ssl_stapling_verify -syn keyword ngxDirective contained ssl_trusted_certificate -syn keyword ngxDirective contained ssl_verify_client -syn keyword ngxDirective contained ssl_verify_depth -syn keyword ngxDirective contained starttls -syn keyword ngxDirective contained stub_status -syn keyword ngxDirective contained sub_filter -syn keyword ngxDirective contained sub_filter_last_modified -syn keyword ngxDirective contained sub_filter_once -syn keyword ngxDirective contained sub_filter_types -syn keyword ngxDirective contained subrequest_output_buffer_size -syn keyword ngxDirective contained tcp_nodelay -syn keyword ngxDirective contained tcp_nopush -syn keyword ngxDirective contained thread_pool -syn keyword ngxDirective contained timeout -syn keyword ngxDirective contained timer_resolution -syn keyword ngxDirective contained types_hash_bucket_size -syn keyword ngxDirective contained types_hash_max_size -syn keyword ngxDirective contained underscores_in_headers -syn keyword ngxDirective contained uninitialized_variable_warn -syn keyword ngxDirective contained use -syn keyword ngxDirective contained user -syn keyword ngxDirective contained userid -syn keyword ngxDirective contained userid_domain -syn keyword ngxDirective contained userid_expires -syn keyword ngxDirective contained userid_flags -syn keyword ngxDirective contained userid_mark -syn keyword ngxDirective contained userid_name -syn keyword ngxDirective contained userid_p3p -syn keyword ngxDirective contained userid_path -syn keyword ngxDirective contained userid_service -syn keyword ngxDirective contained uwsgi_bind -syn keyword ngxDirective contained uwsgi_buffer_size -syn keyword ngxDirective contained uwsgi_buffering -syn keyword ngxDirective contained uwsgi_buffers -syn keyword ngxDirective contained uwsgi_busy_buffers_size -syn keyword ngxDirective contained uwsgi_cache -syn keyword ngxDirective contained uwsgi_cache_background_update -syn keyword ngxDirective contained uwsgi_cache_bypass -syn keyword ngxDirective contained uwsgi_cache_key -syn keyword ngxDirective contained uwsgi_cache_lock -syn keyword ngxDirective contained uwsgi_cache_lock_age -syn keyword ngxDirective contained uwsgi_cache_lock_timeout -syn keyword ngxDirective contained uwsgi_cache_max_range_offset -syn keyword ngxDirective contained uwsgi_cache_methods -syn keyword ngxDirective contained uwsgi_cache_min_uses -syn keyword ngxDirective contained uwsgi_cache_path -syn keyword ngxDirective contained uwsgi_cache_revalidate -syn keyword ngxDirective contained uwsgi_cache_use_stale -syn keyword ngxDirective contained uwsgi_cache_valid -syn keyword ngxDirective contained uwsgi_connect_timeout -syn keyword ngxDirective contained uwsgi_force_ranges -syn keyword ngxDirective contained uwsgi_hide_header -syn keyword ngxDirective contained uwsgi_ignore_client_abort -syn keyword ngxDirective contained uwsgi_ignore_headers -syn keyword ngxDirective contained uwsgi_intercept_errors -syn keyword ngxDirective contained uwsgi_limit_rate -syn keyword ngxDirective contained uwsgi_max_temp_file_size -syn keyword ngxDirective contained uwsgi_modifier1 -syn keyword ngxDirective contained uwsgi_modifier2 -syn keyword ngxDirective contained uwsgi_next_upstream -syn keyword ngxDirective contained uwsgi_next_upstream_timeout -syn keyword ngxDirective contained uwsgi_next_upstream_tries -syn keyword ngxDirective contained uwsgi_no_cache -syn keyword ngxDirective contained uwsgi_param -syn keyword ngxDirective contained uwsgi_pass_header -syn keyword ngxDirective contained uwsgi_pass_request_body -syn keyword ngxDirective contained uwsgi_pass_request_headers -syn keyword ngxDirective contained uwsgi_read_timeout -syn keyword ngxDirective contained uwsgi_request_buffering -syn keyword ngxDirective contained uwsgi_send_timeout -syn keyword ngxDirective contained uwsgi_socket_keepalive -syn keyword ngxDirective contained uwsgi_ssl_certificate -syn keyword ngxDirective contained uwsgi_ssl_certificate_key -syn keyword ngxDirective contained uwsgi_ssl_ciphers -syn keyword ngxDirective contained uwsgi_ssl_conf_command -syn keyword ngxDirective contained uwsgi_ssl_crl -syn keyword ngxDirective contained uwsgi_ssl_name -syn keyword ngxDirective contained uwsgi_ssl_password_file -syn keyword ngxDirective contained uwsgi_ssl_protocols -syn keyword ngxDirective contained uwsgi_ssl_server_name -syn keyword ngxDirective contained uwsgi_ssl_session_reuse -syn keyword ngxDirective contained uwsgi_ssl_trusted_certificate -syn keyword ngxDirective contained uwsgi_ssl_verify -syn keyword ngxDirective contained uwsgi_ssl_verify_depth -syn keyword ngxDirective contained uwsgi_store -syn keyword ngxDirective contained uwsgi_store_access -syn keyword ngxDirective contained uwsgi_string -syn keyword ngxDirective contained uwsgi_temp_file_write_size -syn keyword ngxDirective contained uwsgi_temp_path -syn keyword ngxDirective contained valid_referers -syn keyword ngxDirective contained variables_hash_bucket_size -syn keyword ngxDirective contained variables_hash_max_size -syn keyword ngxDirective contained worker_aio_requests -syn keyword ngxDirective contained worker_connections -syn keyword ngxDirective contained worker_cpu_affinity -syn keyword ngxDirective contained worker_priority -syn keyword ngxDirective contained worker_processes -syn keyword ngxDirective contained worker_rlimit_core -syn keyword ngxDirective contained worker_rlimit_nofile -syn keyword ngxDirective contained worker_shutdown_timeout -syn keyword ngxDirective contained working_directory -syn keyword ngxDirective contained xclient -syn keyword ngxDirective contained xml_entities -syn keyword ngxDirective contained xslt_last_modified -syn keyword ngxDirective contained xslt_param -syn keyword ngxDirective contained xslt_string_param -syn keyword ngxDirective contained xslt_stylesheet -syn keyword ngxDirective contained xslt_types -syn keyword ngxDirective contained zone - -" nginx-plus commercial extensions directives - -syn keyword ngxDirectiveBlock contained match -syn keyword ngxDirectiveBlock contained otel_exporter - -syn keyword ngxDirective contained api -syn keyword ngxDirective contained auth_jwt -syn keyword ngxDirective contained auth_jwt_claim_set -syn keyword ngxDirective contained auth_jwt_header_set -syn keyword ngxDirective contained auth_jwt_key_cache -syn keyword ngxDirective contained auth_jwt_key_file -syn keyword ngxDirective contained auth_jwt_key_request -syn keyword ngxDirective contained auth_jwt_leeway -syn keyword ngxDirective contained auth_jwt_require -syn keyword ngxDirective contained auth_jwt_type -syn keyword ngxDirective contained f4f -syn keyword ngxDirective contained f4f_buffer_size -syn keyword ngxDirective contained fastcgi_cache_purge -syn keyword ngxDirective contained health_check -syn keyword ngxDirective contained health_check_timeout -syn keyword ngxDirective contained hls -syn keyword ngxDirective contained hls_buffers -syn keyword ngxDirective contained hls_forward_args -syn keyword ngxDirective contained hls_fragment -syn keyword ngxDirective contained hls_mp4_buffer_size -syn keyword ngxDirective contained hls_mp4_max_buffer_size -syn keyword ngxDirective contained internal_redirect -syn keyword ngxDirective contained keyval -syn keyword ngxDirective contained keyval_zone -syn keyword ngxDirective contained least_time -syn keyword ngxDirective contained mp4_limit_rate -syn keyword ngxDirective contained mp4_limit_rate_after -syn keyword ngxDirective contained mqtt -syn keyword ngxDirective contained mqtt_preread -syn keyword ngxDirective contained mqtt_rewrite_buffer_size -syn keyword ngxDirective contained mqtt_set_connect -syn keyword ngxDirective contained ntlm -syn keyword ngxDirective contained otel_service_name -syn keyword ngxDirective contained otel_span_attr -syn keyword ngxDirective contained otel_span_name -syn keyword ngxDirective contained otel_trace -syn keyword ngxDirective contained otel_trace_context -syn keyword ngxDirective contained proxy_cache_purge -syn keyword ngxDirective contained proxy_session_drop -syn keyword ngxDirective contained queue -syn keyword ngxDirective contained scgi_cache_purge -syn keyword ngxDirective contained session_log -syn keyword ngxDirective contained session_log_format -syn keyword ngxDirective contained session_log_zone -syn keyword ngxDirective contained state -syn keyword ngxDirective contained status -syn keyword ngxDirective contained status_format -syn keyword ngxDirective contained status_zone -syn keyword ngxDirective contained sticky -syn keyword ngxDirective contained uwsgi_cache_purge -syn keyword ngxDirective contained zone_sync -syn keyword ngxDirective contained zone_sync_buffers -syn keyword ngxDirective contained zone_sync_connect_retry_interval -syn keyword ngxDirective contained zone_sync_connect_timeout -syn keyword ngxDirective contained zone_sync_interval -syn keyword ngxDirective contained zone_sync_recv_buffer_size -syn keyword ngxDirective contained zone_sync_server -syn keyword ngxDirective contained zone_sync_ssl -syn keyword ngxDirective contained zone_sync_ssl_certificate -syn keyword ngxDirective contained zone_sync_ssl_certificate_key -syn keyword ngxDirective contained zone_sync_ssl_ciphers -syn keyword ngxDirective contained zone_sync_ssl_conf_command -syn keyword ngxDirective contained zone_sync_ssl_crl -syn keyword ngxDirective contained zone_sync_ssl_name -syn keyword ngxDirective contained zone_sync_ssl_password_file -syn keyword ngxDirective contained zone_sync_ssl_protocols -syn keyword ngxDirective contained zone_sync_ssl_server_name -syn keyword ngxDirective contained zone_sync_ssl_trusted_certificate -syn keyword ngxDirective contained zone_sync_ssl_verify -syn keyword ngxDirective contained zone_sync_ssl_verify_depth -syn keyword ngxDirective contained zone_sync_timeout - -" 3rd party modules list taken from -" https://github.com/freebsd/freebsd-ports/blob/main/www/nginx-devel/Makefile.extmod -" ---------------------------------------------------------------------------------- - -" https://github.com/msva/nginx_ajp_module -syn keyword ngxDirectiveThirdParty contained ajp_buffer_size -syn keyword ngxDirectiveThirdParty contained ajp_buffers -syn keyword ngxDirectiveThirdParty contained ajp_busy_buffers_size -syn keyword ngxDirectiveThirdParty contained ajp_cache -syn keyword ngxDirectiveThirdParty contained ajp_cache_key -syn keyword ngxDirectiveThirdParty contained ajp_cache_lock -syn keyword ngxDirectiveThirdParty contained ajp_cache_lock_timeout -syn keyword ngxDirectiveThirdParty contained ajp_cache_methods -syn keyword ngxDirectiveThirdParty contained ajp_cache_min_uses -syn keyword ngxDirectiveThirdParty contained ajp_cache_path -syn keyword ngxDirectiveThirdParty contained ajp_cache_use_stale -syn keyword ngxDirectiveThirdParty contained ajp_cache_valid -syn keyword ngxDirectiveThirdParty contained ajp_connect_timeout -syn keyword ngxDirectiveThirdParty contained ajp_header_packet_buffer_size -syn keyword ngxDirectiveThirdParty contained ajp_hide_header -syn keyword ngxDirectiveThirdParty contained ajp_ignore_client_abort -syn keyword ngxDirectiveThirdParty contained ajp_ignore_headers -syn keyword ngxDirectiveThirdParty contained ajp_intercept_errors -syn keyword ngxDirectiveThirdParty contained ajp_keep_conn -syn keyword ngxDirectiveThirdParty contained ajp_max_data_packet_size -syn keyword ngxDirectiveThirdParty contained ajp_max_temp_file_size -syn keyword ngxDirectiveThirdParty contained ajp_next_upstream -syn keyword ngxDirectiveThirdParty contained ajp_param -syn keyword ngxDirectiveThirdParty contained ajp_pass -syn keyword ngxDirectiveThirdParty contained ajp_pass_header -syn keyword ngxDirectiveThirdParty contained ajp_pass_request_body -syn keyword ngxDirectiveThirdParty contained ajp_pass_request_headers -syn keyword ngxDirectiveThirdParty contained ajp_read_timeout -syn keyword ngxDirectiveThirdParty contained ajp_script_url -syn keyword ngxDirectiveThirdParty contained ajp_secret -syn keyword ngxDirectiveThirdParty contained ajp_send_lowat -syn keyword ngxDirectiveThirdParty contained ajp_send_timeout -syn keyword ngxDirectiveThirdParty contained ajp_store -syn keyword ngxDirectiveThirdParty contained ajp_store_access -syn keyword ngxDirectiveThirdParty contained ajp_temp_file_write_size -syn keyword ngxDirectiveThirdParty contained ajp_temp_path -syn keyword ngxDirectiveThirdParty contained ajp_upstream_fail_timeout -syn keyword ngxDirectiveThirdParty contained ajp_upstream_max_fails - -" https://github.com/openresty/array-var-nginx-module -syn keyword ngxDirectiveThirdParty contained array_join -syn keyword ngxDirectiveThirdParty contained array_map -syn keyword ngxDirectiveThirdParty contained array_map_op -syn keyword ngxDirectiveThirdParty contained array_split - -" https://github.com/anomalizer/ngx_aws_auth -syn keyword ngxDirectiveThirdParty contained aws_access_key -syn keyword ngxDirectiveThirdParty contained aws_endpoint -syn keyword ngxDirectiveThirdParty contained aws_key_scope -syn keyword ngxDirectiveThirdParty contained aws_s3_bucket -syn keyword ngxDirectiveThirdParty contained aws_sign -syn keyword ngxDirectiveThirdParty contained aws_signing_key - -" https://github.com/google/ngx_brotli -syn keyword ngxDirectiveThirdParty contained brotli -syn keyword ngxDirectiveThirdParty contained brotli_buffers -syn keyword ngxDirectiveThirdParty contained brotli_comp_level -syn keyword ngxDirectiveThirdParty contained brotli_min_length -syn keyword ngxDirectiveThirdParty contained brotli_static -syn keyword ngxDirectiveThirdParty contained brotli_types -syn keyword ngxDirectiveThirdParty contained brotli_window - -" https://github.com/torden/ngx_cache_purge -syn keyword ngxDirectiveThirdParty contained cache_purge_response_type - -" https://github.com/AirisX/nginx_cookie_flag_module -syn keyword ngxDirectiveThirdParty contained set_cookie_flag - -" https://github.com/grahamedgecombe/nginx-ct -syn keyword ngxDirectiveThirdParty contained ssl_ct -syn keyword ngxDirectiveThirdParty contained ssl_ct_static_scts - -" https://github.com/openresty/echo-nginx-module -syn keyword ngxDirectiveThirdParty contained echo -syn keyword ngxDirectiveThirdParty contained echo_abort_parent -syn keyword ngxDirectiveThirdParty contained echo_after_body -syn keyword ngxDirectiveThirdParty contained echo_before_body -syn keyword ngxDirectiveThirdParty contained echo_blocking_sleep -syn keyword ngxDirectiveThirdParty contained echo_duplicate -syn keyword ngxDirectiveThirdParty contained echo_end -syn keyword ngxDirectiveThirdParty contained echo_exec -syn keyword ngxDirectiveThirdParty contained echo_flush -syn keyword ngxDirectiveThirdParty contained echo_foreach_split -syn keyword ngxDirectiveThirdParty contained echo_location -syn keyword ngxDirectiveThirdParty contained echo_location_async -syn keyword ngxDirectiveThirdParty contained echo_read_request_body -syn keyword ngxDirectiveThirdParty contained echo_request_body -syn keyword ngxDirectiveThirdParty contained echo_reset_timer -syn keyword ngxDirectiveThirdParty contained echo_sleep -syn keyword ngxDirectiveThirdParty contained echo_status -syn keyword ngxDirectiveThirdParty contained echo_subrequest -syn keyword ngxDirectiveThirdParty contained echo_subrequest_async - -" https://github.com/openresty/drizzle-nginx-module -syn keyword ngxDirectiveThirdParty contained drizzle_buffer_size -syn keyword ngxDirectiveThirdParty contained drizzle_connect_timeout -syn keyword ngxDirectiveThirdParty contained drizzle_dbname -syn keyword ngxDirectiveThirdParty contained drizzle_keepalive -syn keyword ngxDirectiveThirdParty contained drizzle_module_header -syn keyword ngxDirectiveThirdParty contained drizzle_pass -syn keyword ngxDirectiveThirdParty contained drizzle_query -syn keyword ngxDirectiveThirdParty contained drizzle_recv_cols_timeout -syn keyword ngxDirectiveThirdParty contained drizzle_recv_rows_timeout -syn keyword ngxDirectiveThirdParty contained drizzle_send_query_timeout -syn keyword ngxDirectiveThirdParty contained drizzle_server -syn keyword ngxDirectiveThirdParty contained drizzle_status - -" https://github.com/ZigzagAK/ngx_dynamic_upstream -syn keyword ngxDirectiveThirdParty contained dns_add_down -syn keyword ngxDirectiveThirdParty contained dns_ipv6 -syn keyword ngxDirectiveThirdParty contained dns_update -syn keyword ngxDirectiveThirdParty contained dynamic_state_file -syn keyword ngxDirectiveThirdParty contained dynamic_upstream - -" https://github.com/openresty/encrypted-session-nginx-module -syn keyword ngxDirectiveThirdParty contained encrypted_session_expires -syn keyword ngxDirectiveThirdParty contained encrypted_session_iv -syn keyword ngxDirectiveThirdParty contained encrypted_session_key -syn keyword ngxDirectiveThirdParty contained set_decrypt_session -syn keyword ngxDirectiveThirdParty contained set_encrypt_session - -" https://github.com/calio/form-input-nginx-module -syn keyword ngxDirectiveThirdParty contained set_form_input -syn keyword ngxDirectiveThirdParty contained set_form_input_multi - -" https://github.com/nieoding/nginx-gridfs -syn keyword ngxDirectiveThirdParty contained gridfs -syn keyword ngxDirectiveThirdParty contained mongo - -" https://github.com/openresty/headers-more-nginx-module -syn keyword ngxDirectiveThirdParty contained more_clear_headers -syn keyword ngxDirectiveThirdParty contained more_clear_input_headers -syn keyword ngxDirectiveThirdParty contained more_set_headers -syn keyword ngxDirectiveThirdParty contained more_set_input_headers - -" https://github.com/dvershinin/nginx_accept_language_module -syn keyword ngxDirectiveThirdParty contained set_from_accept_language - -" https://github.com/atomx/nginx-http-auth-digest -syn keyword ngxDirectiveThirdParty contained auth_digest -syn keyword ngxDirectiveThirdParty contained auth_digest_drop_time -syn keyword ngxDirectiveThirdParty contained auth_digest_evasion_time -syn keyword ngxDirectiveThirdParty contained auth_digest_expires -syn keyword ngxDirectiveThirdParty contained auth_digest_maxtries -syn keyword ngxDirectiveThirdParty contained auth_digest_replays -syn keyword ngxDirectiveThirdParty contained auth_digest_shm_size -syn keyword ngxDirectiveThirdParty contained auth_digest_timeout -syn keyword ngxDirectiveThirdParty contained auth_digest_user_file - -" https://github.com/stnoonan/spnego-http-auth-nginx-module -syn keyword ngxDirectiveThirdParty contained auth_gss -syn keyword ngxDirectiveThirdParty contained auth_gss_allow_basic_fallback -syn keyword ngxDirectiveThirdParty contained auth_gss_authorized_principal -syn keyword ngxDirectiveThirdParty contained auth_gss_authorized_principal_regex -syn keyword ngxDirectiveThirdParty contained auth_gss_constrained_delegation -syn keyword ngxDirectiveThirdParty contained auth_gss_delegate_credentials -syn keyword ngxDirectiveThirdParty contained auth_gss_force_realm -syn keyword ngxDirectiveThirdParty contained auth_gss_format_full -syn keyword ngxDirectiveThirdParty contained auth_gss_keytab -syn keyword ngxDirectiveThirdParty contained auth_gss_map_to_local -syn keyword ngxDirectiveThirdParty contained auth_gss_realm -syn keyword ngxDirectiveThirdParty contained auth_gss_service_ccache -syn keyword ngxDirectiveThirdParty contained auth_gss_service_name -syn keyword ngxDirectiveThirdParty contained auth_gss_zone_name - -" https://github.com/kvspb/nginx-auth-ldap -syn keyword ngxDirectiveThirdParty contained auth_ldap -syn keyword ngxDirectiveThirdParty contained auth_ldap_cache_enabled -syn keyword ngxDirectiveThirdParty contained auth_ldap_cache_expiration_time -syn keyword ngxDirectiveThirdParty contained auth_ldap_cache_size -syn keyword ngxDirectiveThirdParty contained auth_ldap_servers -syn keyword ngxDirectiveThirdParty contained auth_ldap_servers_size -syn keyword ngxDirectiveThirdParty contained ldap_server - -" https://github.com/sto/ngx_http_auth_pam_module -syn keyword ngxDirectiveThirdParty contained auth_pam -syn keyword ngxDirectiveThirdParty contained auth_pam_service_name -syn keyword ngxDirectiveThirdParty contained auth_pam_set_pam_env - -" https://github.com/arut/nginx-dav-ext-module -syn keyword ngxDirectiveThirdParty contained dav_ext_lock -syn keyword ngxDirectiveThirdParty contained dav_ext_lock_zone -syn keyword ngxDirectiveThirdParty contained dav_ext_methods - -" https://github.com/openresty/nginx-eval-module -syn keyword ngxDirectiveThirdParty contained eval -syn keyword ngxDirectiveThirdParty contained eval_buffer_size -syn keyword ngxDirectiveThirdParty contained eval_escalate -syn keyword ngxDirectiveThirdParty contained eval_override_content_type -syn keyword ngxDirectiveThirdParty contained eval_subrequest_in_memory - -" https://github.com/aperezdc/ngx-fancyindex -syn keyword ngxDirectiveThirdParty contained fancyindex -syn keyword ngxDirectiveThirdParty contained fancyindex_case_sensitive -syn keyword ngxDirectiveThirdParty contained fancyindex_css_href -syn keyword ngxDirectiveThirdParty contained fancyindex_default_sort -syn keyword ngxDirectiveThirdParty contained fancyindex_directories_first -syn keyword ngxDirectiveThirdParty contained fancyindex_exact_size -syn keyword ngxDirectiveThirdParty contained fancyindex_footer -syn keyword ngxDirectiveThirdParty contained fancyindex_header -syn keyword ngxDirectiveThirdParty contained fancyindex_hide_parent_dir -syn keyword ngxDirectiveThirdParty contained fancyindex_hide_symlinks -syn keyword ngxDirectiveThirdParty contained fancyindex_ignore -syn keyword ngxDirectiveThirdParty contained fancyindex_localtime -syn keyword ngxDirectiveThirdParty contained fancyindex_show_dotfiles -syn keyword ngxDirectiveThirdParty contained fancyindex_show_path -syn keyword ngxDirectiveThirdParty contained fancyindex_time_format - -" https://github.com/alibaba/nginx-http-footer-filter -syn keyword ngxDirectiveThirdParty contained footer -syn keyword ngxDirectiveThirdParty contained footer_types - -" https://github.com/leev/ngx_http_geoip2_module -syn keyword ngxDirectiveThirdParty contained geoip2 -syn keyword ngxDirectiveThirdParty contained geoip2_proxy -syn keyword ngxDirectiveThirdParty contained geoip2_proxy_recursive - -" https://github.com/ip2location/ip2location-nginx -syn keyword ngxDirectiveThirdParty contained ip2location_database -syn keyword ngxDirectiveThirdParty contained ip2location_proxy -syn keyword ngxDirectiveThirdParty contained ip2location_proxy_recursive - -" https://github.com/ip2location/ip2proxy-nginx -syn keyword ngxDirectiveThirdParty contained ip2proxy_database -syn keyword ngxDirectiveThirdParty contained ip2proxy_proxy -syn keyword ngxDirectiveThirdParty contained ip2proxy_proxy_recursive - -" https://github.com/kr/nginx-notice -syn keyword ngxDirectiveThirdParty contained notice -syn keyword ngxDirectiveThirdParty contained notice_type - -" https://github.com/slact/nchan -syn keyword ngxDirectiveThirdParty contained nchan_access_control_allow_credentials -syn keyword ngxDirectiveThirdParty contained nchan_access_control_allow_origin -syn keyword ngxDirectiveThirdParty contained nchan_authorize_request -syn keyword ngxDirectiveThirdParty contained nchan_benchmark -syn keyword ngxDirectiveThirdParty contained nchan_benchmark_channels -syn keyword ngxDirectiveThirdParty contained nchan_benchmark_message_padding_bytes -syn keyword ngxDirectiveThirdParty contained nchan_benchmark_messages_per_channel_per_minute -syn keyword ngxDirectiveThirdParty contained nchan_benchmark_publisher_distribution -syn keyword ngxDirectiveThirdParty contained nchan_benchmark_subscriber_distribution -syn keyword ngxDirectiveThirdParty contained nchan_benchmark_subscribers_per_channel -syn keyword ngxDirectiveThirdParty contained nchan_benchmark_time -syn keyword ngxDirectiveThirdParty contained nchan_channel_event_string -syn keyword ngxDirectiveThirdParty contained nchan_channel_events_channel_id -syn keyword ngxDirectiveThirdParty contained nchan_channel_group -syn keyword ngxDirectiveThirdParty contained nchan_channel_group_accounting -syn keyword ngxDirectiveThirdParty contained nchan_channel_id -syn keyword ngxDirectiveThirdParty contained nchan_channel_id_split_delimiter -syn keyword ngxDirectiveThirdParty contained nchan_channel_timeout -syn keyword ngxDirectiveThirdParty contained nchan_deflate_message_for_websocket -syn keyword ngxDirectiveThirdParty contained nchan_eventsource_event -syn keyword ngxDirectiveThirdParty contained nchan_eventsource_ping_comment -syn keyword ngxDirectiveThirdParty contained nchan_eventsource_ping_data -syn keyword ngxDirectiveThirdParty contained nchan_eventsource_ping_event -syn keyword ngxDirectiveThirdParty contained nchan_eventsource_ping_interval -syn keyword ngxDirectiveThirdParty contained nchan_group_location -syn keyword ngxDirectiveThirdParty contained nchan_group_max_channels -syn keyword ngxDirectiveThirdParty contained nchan_group_max_messages -syn keyword ngxDirectiveThirdParty contained nchan_group_max_messages_disk -syn keyword ngxDirectiveThirdParty contained nchan_group_max_messages_memory -syn keyword ngxDirectiveThirdParty contained nchan_group_max_subscribers -syn keyword ngxDirectiveThirdParty contained nchan_longpoll_multipart_response -syn keyword ngxDirectiveThirdParty contained nchan_max_channel_id_length -syn keyword ngxDirectiveThirdParty contained nchan_max_channel_subscribers -syn keyword ngxDirectiveThirdParty contained nchan_max_reserved_memory -syn keyword ngxDirectiveThirdParty contained nchan_message_buffer_length -syn keyword ngxDirectiveThirdParty contained nchan_message_max_buffer_length -syn keyword ngxDirectiveThirdParty contained nchan_message_temp_path -syn keyword ngxDirectiveThirdParty contained nchan_message_timeout -syn keyword ngxDirectiveThirdParty contained nchan_permessage_deflate_compression_level -syn keyword ngxDirectiveThirdParty contained nchan_permessage_deflate_compression_memlevel -syn keyword ngxDirectiveThirdParty contained nchan_permessage_deflate_compression_strategy -syn keyword ngxDirectiveThirdParty contained nchan_permessage_deflate_compression_window -syn keyword ngxDirectiveThirdParty contained nchan_pub_channel_id -syn keyword ngxDirectiveThirdParty contained nchan_publisher -syn keyword ngxDirectiveThirdParty contained nchan_publisher_channel_id -syn keyword ngxDirectiveThirdParty contained nchan_publisher_location -syn keyword ngxDirectiveThirdParty contained nchan_publisher_upstream_request -syn keyword ngxDirectiveThirdParty contained nchan_pubsub -syn keyword ngxDirectiveThirdParty contained nchan_pubsub_channel_id -syn keyword ngxDirectiveThirdParty contained nchan_pubsub_location -syn keyword ngxDirectiveThirdParty contained nchan_redis_accurate_subscriber_count -syn keyword ngxDirectiveThirdParty contained nchan_redis_cluster_check_interval -syn keyword ngxDirectiveThirdParty contained nchan_redis_cluster_check_interval_backoff -syn keyword ngxDirectiveThirdParty contained nchan_redis_cluster_check_interval_jitter -syn keyword ngxDirectiveThirdParty contained nchan_redis_cluster_check_interval_max -syn keyword ngxDirectiveThirdParty contained nchan_redis_cluster_check_interval_min -syn keyword ngxDirectiveThirdParty contained nchan_redis_cluster_connect_timeout -syn keyword ngxDirectiveThirdParty contained nchan_redis_cluster_max_failing_time -syn keyword ngxDirectiveThirdParty contained nchan_redis_cluster_recovery_delay -syn keyword ngxDirectiveThirdParty contained nchan_redis_cluster_recovery_delay_backoff -syn keyword ngxDirectiveThirdParty contained nchan_redis_cluster_recovery_delay_jitter -syn keyword ngxDirectiveThirdParty contained nchan_redis_cluster_recovery_delay_max -syn keyword ngxDirectiveThirdParty contained nchan_redis_cluster_recovery_delay_min -syn keyword ngxDirectiveThirdParty contained nchan_redis_command_timeout -syn keyword ngxDirectiveThirdParty contained nchan_redis_connect_timeout -syn keyword ngxDirectiveThirdParty contained nchan_redis_discovered_ip_range_blacklist -syn keyword ngxDirectiveThirdParty contained nchan_redis_fakesub_timer_interval -syn keyword ngxDirectiveThirdParty contained nchan_redis_idle_channel_cache_timeout -syn keyword ngxDirectiveThirdParty contained nchan_redis_idle_channel_keepalive_backoff -syn keyword ngxDirectiveThirdParty contained nchan_redis_idle_channel_keepalive_jitter -syn keyword ngxDirectiveThirdParty contained nchan_redis_idle_channel_keepalive_max -syn keyword ngxDirectiveThirdParty contained nchan_redis_idle_channel_keepalive_min -syn keyword ngxDirectiveThirdParty contained nchan_redis_idle_channel_keepalive_safety_margin -syn keyword ngxDirectiveThirdParty contained nchan_redis_load_scripts_unconditionally -syn keyword ngxDirectiveThirdParty contained nchan_redis_namespace -syn keyword ngxDirectiveThirdParty contained nchan_redis_node_connect_timeout -syn keyword ngxDirectiveThirdParty contained nchan_redis_nostore_fastpublish -syn keyword ngxDirectiveThirdParty contained nchan_redis_optimize_target -syn keyword ngxDirectiveThirdParty contained nchan_redis_pass -syn keyword ngxDirectiveThirdParty contained nchan_redis_pass_inheritable -syn keyword ngxDirectiveThirdParty contained nchan_redis_password -syn keyword ngxDirectiveThirdParty contained nchan_redis_ping_interval -syn keyword ngxDirectiveThirdParty contained nchan_redis_publish_msgpacked_max_size -syn keyword ngxDirectiveThirdParty contained nchan_redis_reconnect_delay -syn keyword ngxDirectiveThirdParty contained nchan_redis_reconnect_delay_backoff -syn keyword ngxDirectiveThirdParty contained nchan_redis_reconnect_delay_jitter -syn keyword ngxDirectiveThirdParty contained nchan_redis_reconnect_delay_max -syn keyword ngxDirectiveThirdParty contained nchan_redis_reconnect_delay_min -syn keyword ngxDirectiveThirdParty contained nchan_redis_retry_commands -syn keyword ngxDirectiveThirdParty contained nchan_redis_retry_commands_max_wait -syn keyword ngxDirectiveThirdParty contained nchan_redis_server -syn keyword ngxDirectiveThirdParty contained nchan_redis_ssl -syn keyword ngxDirectiveThirdParty contained nchan_redis_ssl_ciphers -syn keyword ngxDirectiveThirdParty contained nchan_redis_ssl_client_certificate -syn keyword ngxDirectiveThirdParty contained nchan_redis_ssl_client_certificate_key -syn keyword ngxDirectiveThirdParty contained nchan_redis_ssl_server_name -syn keyword ngxDirectiveThirdParty contained nchan_redis_ssl_trusted_certificate -syn keyword ngxDirectiveThirdParty contained nchan_redis_ssl_trusted_certificate_path -syn keyword ngxDirectiveThirdParty contained nchan_redis_ssl_verify_certificate -syn keyword ngxDirectiveThirdParty contained nchan_redis_storage_mode -syn keyword ngxDirectiveThirdParty contained nchan_redis_subscribe_weights -syn keyword ngxDirectiveThirdParty contained nchan_redis_tls -syn keyword ngxDirectiveThirdParty contained nchan_redis_tls_ciphers -syn keyword ngxDirectiveThirdParty contained nchan_redis_tls_client_certificate -syn keyword ngxDirectiveThirdParty contained nchan_redis_tls_server_name -syn keyword ngxDirectiveThirdParty contained nchan_redis_tls_trusted_certificate -syn keyword ngxDirectiveThirdParty contained nchan_redis_tls_trusted_certificate_path -syn keyword ngxDirectiveThirdParty contained nchan_redis_tls_verify_certificate -syn keyword ngxDirectiveThirdParty contained nchan_redis_upstream_stats -syn keyword ngxDirectiveThirdParty contained nchan_redis_upstream_stats_disconnected_timeout -syn keyword ngxDirectiveThirdParty contained nchan_redis_upstream_stats_enabled -syn keyword ngxDirectiveThirdParty contained nchan_redis_url -syn keyword ngxDirectiveThirdParty contained nchan_redis_username -syn keyword ngxDirectiveThirdParty contained nchan_redis_wait_after_connecting -syn keyword ngxDirectiveThirdParty contained nchan_shared_memory_size -syn keyword ngxDirectiveThirdParty contained nchan_storage_engine -syn keyword ngxDirectiveThirdParty contained nchan_store_messages -syn keyword ngxDirectiveThirdParty contained nchan_stub_status -syn keyword ngxDirectiveThirdParty contained nchan_sub_channel_id -syn keyword ngxDirectiveThirdParty contained nchan_subscribe_existing_channels_only -syn keyword ngxDirectiveThirdParty contained nchan_subscribe_request -syn keyword ngxDirectiveThirdParty contained nchan_subscriber -syn keyword ngxDirectiveThirdParty contained nchan_subscriber_channel_id -syn keyword ngxDirectiveThirdParty contained nchan_subscriber_compound_etag_message_id -syn keyword ngxDirectiveThirdParty contained nchan_subscriber_first_message -syn keyword ngxDirectiveThirdParty contained nchan_subscriber_http_raw_stream_separator -syn keyword ngxDirectiveThirdParty contained nchan_subscriber_info -syn keyword ngxDirectiveThirdParty contained nchan_subscriber_info_string -syn keyword ngxDirectiveThirdParty contained nchan_subscriber_last_message_id -syn keyword ngxDirectiveThirdParty contained nchan_subscriber_location -syn keyword ngxDirectiveThirdParty contained nchan_subscriber_message_id_custom_etag_header -syn keyword ngxDirectiveThirdParty contained nchan_subscriber_timeout -syn keyword ngxDirectiveThirdParty contained nchan_unsubscribe_request -syn keyword ngxDirectiveThirdParty contained nchan_use_redis -syn keyword ngxDirectiveThirdParty contained nchan_websocket_client_heartbeat -syn keyword ngxDirectiveThirdParty contained nchan_websocket_ping_interval -syn keyword ngxDirectiveThirdParty contained push_authorized_channels_only -syn keyword ngxDirectiveThirdParty contained push_channel_group -syn keyword ngxDirectiveThirdParty contained push_channel_timeout -syn keyword ngxDirectiveThirdParty contained push_max_channel_id_length -syn keyword ngxDirectiveThirdParty contained push_max_channel_subscribers -syn keyword ngxDirectiveThirdParty contained push_max_message_buffer_length -syn keyword ngxDirectiveThirdParty contained push_max_reserved_memory -syn keyword ngxDirectiveThirdParty contained push_message_buffer_length -syn keyword ngxDirectiveThirdParty contained push_message_timeout -syn keyword ngxDirectiveThirdParty contained push_min_message_buffer_length -syn keyword ngxDirectiveThirdParty contained push_publisher -syn keyword ngxDirectiveThirdParty contained push_store_messages -syn keyword ngxDirectiveThirdParty contained push_subscriber -syn keyword ngxDirectiveThirdParty contained push_subscriber_concurrency -syn keyword ngxDirectiveThirdParty contained push_subscriber_timeout - -" https://github.com/wandenberg/nginx-push-stream-module -syn keyword ngxDirectiveThirdParty contained push_stream_allow_connections_to_events_channel -syn keyword ngxDirectiveThirdParty contained push_stream_allowed_origins -syn keyword ngxDirectiveThirdParty contained push_stream_authorized_channels_only -syn keyword ngxDirectiveThirdParty contained push_stream_channel_deleted_message_text -syn keyword ngxDirectiveThirdParty contained push_stream_channel_inactivity_time -syn keyword ngxDirectiveThirdParty contained push_stream_channel_info_on_publish -syn keyword ngxDirectiveThirdParty contained push_stream_channels_path -syn keyword ngxDirectiveThirdParty contained push_stream_channels_statistics -syn keyword ngxDirectiveThirdParty contained push_stream_events_channel_id -syn keyword ngxDirectiveThirdParty contained push_stream_footer_template -syn keyword ngxDirectiveThirdParty contained push_stream_header_template -syn keyword ngxDirectiveThirdParty contained push_stream_header_template_file -syn keyword ngxDirectiveThirdParty contained push_stream_last_event_id -syn keyword ngxDirectiveThirdParty contained push_stream_last_received_message_tag -syn keyword ngxDirectiveThirdParty contained push_stream_last_received_message_time -syn keyword ngxDirectiveThirdParty contained push_stream_longpolling_connection_ttl -syn keyword ngxDirectiveThirdParty contained push_stream_max_channel_id_length -syn keyword ngxDirectiveThirdParty contained push_stream_max_messages_stored_per_channel -syn keyword ngxDirectiveThirdParty contained push_stream_max_number_of_channels -syn keyword ngxDirectiveThirdParty contained push_stream_max_number_of_wildcard_channels -syn keyword ngxDirectiveThirdParty contained push_stream_max_subscribers_per_channel -syn keyword ngxDirectiveThirdParty contained push_stream_message_template -syn keyword ngxDirectiveThirdParty contained push_stream_message_ttl -syn keyword ngxDirectiveThirdParty contained push_stream_padding_by_user_agent -syn keyword ngxDirectiveThirdParty contained push_stream_ping_message_interval -syn keyword ngxDirectiveThirdParty contained push_stream_ping_message_text -syn keyword ngxDirectiveThirdParty contained push_stream_publisher -syn keyword ngxDirectiveThirdParty contained push_stream_shared_memory_size -syn keyword ngxDirectiveThirdParty contained push_stream_store_messages -syn keyword ngxDirectiveThirdParty contained push_stream_subscriber -syn keyword ngxDirectiveThirdParty contained push_stream_subscriber_connection_ttl -syn keyword ngxDirectiveThirdParty contained push_stream_timeout_with_body -syn keyword ngxDirectiveThirdParty contained push_stream_user_agent -syn keyword ngxDirectiveThirdParty contained push_stream_websocket_allow_publish -syn keyword ngxDirectiveThirdParty contained push_stream_wildcard_channel_max_qtd -syn keyword ngxDirectiveThirdParty contained push_stream_wildcard_channel_prefix - -" https://github.com/yaoweibin/ngx_http_substitutions_filter_module -syn keyword ngxDirectiveThirdParty contained subs_buffers -syn keyword ngxDirectiveThirdParty contained subs_filter -syn keyword ngxDirectiveThirdParty contained subs_filter_bypass -syn keyword ngxDirectiveThirdParty contained subs_filter_types -syn keyword ngxDirectiveThirdParty contained subs_line_buffer_size - -" https://github.com/tarantool/nginx_upstream_module -syn keyword ngxDirectiveThirdParty contained tnt_allowed_indexes -syn keyword ngxDirectiveThirdParty contained tnt_allowed_spaces -syn keyword ngxDirectiveThirdParty contained tnt_buffer_size -syn keyword ngxDirectiveThirdParty contained tnt_connect_timeout -syn keyword ngxDirectiveThirdParty contained tnt_delete -syn keyword ngxDirectiveThirdParty contained tnt_http_methods -syn keyword ngxDirectiveThirdParty contained tnt_http_rest_methods -syn keyword ngxDirectiveThirdParty contained tnt_in_multiplier -syn keyword ngxDirectiveThirdParty contained tnt_insert -syn keyword ngxDirectiveThirdParty contained tnt_method -syn keyword ngxDirectiveThirdParty contained tnt_multireturn_skip_count -syn keyword ngxDirectiveThirdParty contained tnt_next_upstream -syn keyword ngxDirectiveThirdParty contained tnt_next_upstream_timeout -syn keyword ngxDirectiveThirdParty contained tnt_next_upstream_tries -syn keyword ngxDirectiveThirdParty contained tnt_out_multiplier -syn keyword ngxDirectiveThirdParty contained tnt_pass -syn keyword ngxDirectiveThirdParty contained tnt_pass_http_request -syn keyword ngxDirectiveThirdParty contained tnt_pass_http_request_buffer_size -syn keyword ngxDirectiveThirdParty contained tnt_pure_result -syn keyword ngxDirectiveThirdParty contained tnt_read_timeout -syn keyword ngxDirectiveThirdParty contained tnt_replace -syn keyword ngxDirectiveThirdParty contained tnt_select -syn keyword ngxDirectiveThirdParty contained tnt_select_limit_max -syn keyword ngxDirectiveThirdParty contained tnt_send_timeout -syn keyword ngxDirectiveThirdParty contained tnt_set_header -syn keyword ngxDirectiveThirdParty contained tnt_update -syn keyword ngxDirectiveThirdParty contained tnt_upsert - -" https://github.com/fdintino/nginx-upload-module -syn keyword ngxDirectiveThirdParty contained upload_add_header -syn keyword ngxDirectiveThirdParty contained upload_aggregate_form_field -syn keyword ngxDirectiveThirdParty contained upload_buffer_size -syn keyword ngxDirectiveThirdParty contained upload_cleanup -syn keyword ngxDirectiveThirdParty contained upload_empty_fiels_names -syn keyword ngxDirectiveThirdParty contained upload_limit_rate -syn keyword ngxDirectiveThirdParty contained upload_max_file_size -syn keyword ngxDirectiveThirdParty contained upload_max_output_body_len -syn keyword ngxDirectiveThirdParty contained upload_max_part_header_len -syn keyword ngxDirectiveThirdParty contained upload_merge_buffer_size -syn keyword ngxDirectiveThirdParty contained upload_pass -syn keyword ngxDirectiveThirdParty contained upload_pass_args -syn keyword ngxDirectiveThirdParty contained upload_pass_form_field -syn keyword ngxDirectiveThirdParty contained upload_range_header_buffer_size -syn keyword ngxDirectiveThirdParty contained upload_resumable -syn keyword ngxDirectiveThirdParty contained upload_set_form_field -syn keyword ngxDirectiveThirdParty contained upload_state_store -syn keyword ngxDirectiveThirdParty contained upload_store -syn keyword ngxDirectiveThirdParty contained upload_store_access -syn keyword ngxDirectiveThirdParty contained upload_tame_arrays - -" https://github.com/masterzen/nginx-upload-progress-module -syn keyword ngxDirectiveThirdParty contained report_uploads -syn keyword ngxDirectiveThirdParty contained track_uploads -syn keyword ngxDirectiveThirdParty contained upload_progress -syn keyword ngxDirectiveThirdParty contained upload_progress_content_type -syn keyword ngxDirectiveThirdParty contained upload_progress_header -syn keyword ngxDirectiveThirdParty contained upload_progress_java_output -syn keyword ngxDirectiveThirdParty contained upload_progress_json_output -syn keyword ngxDirectiveThirdParty contained upload_progress_jsonp_output -syn keyword ngxDirectiveThirdParty contained upload_progress_jsonp_parameter -syn keyword ngxDirectiveThirdParty contained upload_progress_template - -" https://github.com/yaoweibin/nginx_upstream_check_module -syn keyword ngxDirectiveThirdParty contained check -syn keyword ngxDirectiveThirdParty contained check_fastcgi_param -syn keyword ngxDirectiveThirdParty contained check_http_expect_alive -syn keyword ngxDirectiveThirdParty contained check_http_send -syn keyword ngxDirectiveThirdParty contained check_keepalive_requests -syn keyword ngxDirectiveThirdParty contained check_shm_size -syn keyword ngxDirectiveThirdParty contained check_status - -" https://github.com/jaygooby/nginx-upstream-fair -syn keyword ngxDirectiveThirdParty contained fair -syn keyword ngxDirectiveThirdParty contained upstream_fair_shm_size - -" https://github.com/ayty-adrianomartins/nginx-sticky-module-ng -syn keyword ngxDirectiveThirdParty contained sticky_hide_cookie -syn keyword ngxDirectiveThirdParty contained sticky_no_fallback - -" https://github.com/Novetta/nginx-video-thumbextractor-module -syn keyword ngxDirectiveThirdParty contained video_thumbextractor -syn keyword ngxDirectiveThirdParty contained video_thumbextractor_image_height -syn keyword ngxDirectiveThirdParty contained video_thumbextractor_image_width -syn keyword ngxDirectiveThirdParty contained video_thumbextractor_jpeg_baseline -syn keyword ngxDirectiveThirdParty contained video_thumbextractor_jpeg_dpi -syn keyword ngxDirectiveThirdParty contained video_thumbextractor_jpeg_optimize -syn keyword ngxDirectiveThirdParty contained video_thumbextractor_jpeg_progressive_mode -syn keyword ngxDirectiveThirdParty contained video_thumbextractor_jpeg_quality -syn keyword ngxDirectiveThirdParty contained video_thumbextractor_jpeg_smooth -syn keyword ngxDirectiveThirdParty contained video_thumbextractor_next_time -syn keyword ngxDirectiveThirdParty contained video_thumbextractor_only_keyframe -syn keyword ngxDirectiveThirdParty contained video_thumbextractor_processes_per_worker -syn keyword ngxDirectiveThirdParty contained video_thumbextractor_threads -syn keyword ngxDirectiveThirdParty contained video_thumbextractor_tile_color -syn keyword ngxDirectiveThirdParty contained video_thumbextractor_tile_cols -syn keyword ngxDirectiveThirdParty contained video_thumbextractor_tile_margin -syn keyword ngxDirectiveThirdParty contained video_thumbextractor_tile_max_cols -syn keyword ngxDirectiveThirdParty contained video_thumbextractor_tile_max_rows -syn keyword ngxDirectiveThirdParty contained video_thumbextractor_tile_padding -syn keyword ngxDirectiveThirdParty contained video_thumbextractor_tile_rows -syn keyword ngxDirectiveThirdParty contained video_thumbextractor_tile_sample_interval -syn keyword ngxDirectiveThirdParty contained video_thumbextractor_video_filename -syn keyword ngxDirectiveThirdParty contained video_thumbextractor_video_second - -" https://github.com/calio/iconv-nginx-module -syn keyword ngxDirectiveThirdParty contained iconv_buffer_size -syn keyword ngxDirectiveThirdParty contained iconv_filter -syn keyword ngxDirectiveThirdParty contained set_iconv - -" https://github.com/baysao/nginx-let-module -syn keyword ngxDirectiveThirdParty contained let - -" https://github.com/openresty/lua-nginx-module -syn keyword ngxDirectiveThirdParty contained access_by_lua -syn keyword ngxDirectiveThirdParty contained access_by_lua_block -syn keyword ngxDirectiveThirdParty contained access_by_lua_file -syn keyword ngxDirectiveThirdParty contained access_by_lua_no_postpone -syn keyword ngxDirectiveThirdParty contained balancer_by_lua_block -syn keyword ngxDirectiveThirdParty contained balancer_by_lua_file -syn keyword ngxDirectiveThirdParty contained body_filter_by_lua -syn keyword ngxDirectiveThirdParty contained body_filter_by_lua_block -syn keyword ngxDirectiveThirdParty contained body_filter_by_lua_file -syn keyword ngxDirectiveThirdParty contained content_by_lua -syn keyword ngxDirectiveThirdParty contained content_by_lua_block -syn keyword ngxDirectiveThirdParty contained content_by_lua_file -syn keyword ngxDirectiveThirdParty contained exit_worker_by_lua_block -syn keyword ngxDirectiveThirdParty contained exit_worker_by_lua_file -syn keyword ngxDirectiveThirdParty contained header_filter_by_lua -syn keyword ngxDirectiveThirdParty contained header_filter_by_lua_block -syn keyword ngxDirectiveThirdParty contained header_filter_by_lua_file -syn keyword ngxDirectiveThirdParty contained init_by_lua -syn keyword ngxDirectiveThirdParty contained init_by_lua_block -syn keyword ngxDirectiveThirdParty contained init_by_lua_file -syn keyword ngxDirectiveThirdParty contained init_worker_by_lua -syn keyword ngxDirectiveThirdParty contained init_worker_by_lua_block -syn keyword ngxDirectiveThirdParty contained init_worker_by_lua_file -syn keyword ngxDirectiveThirdParty contained log_by_lua -syn keyword ngxDirectiveThirdParty contained log_by_lua_block -syn keyword ngxDirectiveThirdParty contained log_by_lua_file -syn keyword ngxDirectiveThirdParty contained lua_capture_error_log -syn keyword ngxDirectiveThirdParty contained lua_check_client_abort -syn keyword ngxDirectiveThirdParty contained lua_code_cache -syn keyword ngxDirectiveThirdParty contained lua_fake_shm -syn keyword ngxDirectiveThirdParty contained lua_http10_buffering -syn keyword ngxDirectiveThirdParty contained lua_load_resty_core -syn keyword ngxDirectiveThirdParty contained lua_malloc_trim -syn keyword ngxDirectiveThirdParty contained lua_max_pending_timers -syn keyword ngxDirectiveThirdParty contained lua_max_running_timers -syn keyword ngxDirectiveThirdParty contained lua_need_request_body -syn keyword ngxDirectiveThirdParty contained lua_package_cpath -syn keyword ngxDirectiveThirdParty contained lua_package_path -syn keyword ngxDirectiveThirdParty contained lua_regex_cache_max_entries -syn keyword ngxDirectiveThirdParty contained lua_regex_match_limit -syn keyword ngxDirectiveThirdParty contained lua_sa_restart -syn keyword ngxDirectiveThirdParty contained lua_shared_dict -syn keyword ngxDirectiveThirdParty contained lua_socket_buffer_size -syn keyword ngxDirectiveThirdParty contained lua_socket_connect_timeout -syn keyword ngxDirectiveThirdParty contained lua_socket_keepalive_timeout -syn keyword ngxDirectiveThirdParty contained lua_socket_log_errors -syn keyword ngxDirectiveThirdParty contained lua_socket_pool_size -syn keyword ngxDirectiveThirdParty contained lua_socket_read_timeout -syn keyword ngxDirectiveThirdParty contained lua_socket_send_lowat -syn keyword ngxDirectiveThirdParty contained lua_socket_send_timeout -syn keyword ngxDirectiveThirdParty contained lua_ssl_certificate -syn keyword ngxDirectiveThirdParty contained lua_ssl_certificate_key -syn keyword ngxDirectiveThirdParty contained lua_ssl_ciphers -syn keyword ngxDirectiveThirdParty contained lua_ssl_conf_command -syn keyword ngxDirectiveThirdParty contained lua_ssl_crl -syn keyword ngxDirectiveThirdParty contained lua_ssl_protocols -syn keyword ngxDirectiveThirdParty contained lua_ssl_trusted_certificate -syn keyword ngxDirectiveThirdParty contained lua_ssl_verify_depth -syn keyword ngxDirectiveThirdParty contained lua_thread_cache_max_entries -syn keyword ngxDirectiveThirdParty contained lua_transform_underscores_in_response_headers -syn keyword ngxDirectiveThirdParty contained lua_use_default_type -syn keyword ngxDirectiveThirdParty contained lua_worker_thread_vm_pool_size -syn keyword ngxDirectiveThirdParty contained rewrite_by_lua -syn keyword ngxDirectiveThirdParty contained rewrite_by_lua_block -syn keyword ngxDirectiveThirdParty contained rewrite_by_lua_file -syn keyword ngxDirectiveThirdParty contained rewrite_by_lua_no_postpone -syn keyword ngxDirectiveThirdParty contained server_rewrite_by_lua_block -syn keyword ngxDirectiveThirdParty contained server_rewrite_by_lua_file -syn keyword ngxDirectiveThirdParty contained set_by_lua -syn keyword ngxDirectiveThirdParty contained set_by_lua_block -syn keyword ngxDirectiveThirdParty contained set_by_lua_file -syn keyword ngxDirectiveThirdParty contained ssl_certificate_by_lua_block -syn keyword ngxDirectiveThirdParty contained ssl_certificate_by_lua_file -syn keyword ngxDirectiveThirdParty contained ssl_client_hello_by_lua_block -syn keyword ngxDirectiveThirdParty contained ssl_client_hello_by_lua_file -syn keyword ngxDirectiveThirdParty contained ssl_session_fetch_by_lua_block -syn keyword ngxDirectiveThirdParty contained ssl_session_fetch_by_lua_file -syn keyword ngxDirectiveThirdParty contained ssl_session_store_by_lua_block -syn keyword ngxDirectiveThirdParty contained ssl_session_store_by_lua_file - -" https://github.com/Taymindis/nginx-link-function -syn keyword ngxDirectiveThirdParty contained ngx_link_func_add_prop -syn keyword ngxDirectiveThirdParty contained ngx_link_func_add_req_header -syn keyword ngxDirectiveThirdParty contained ngx_link_func_ca_cert -syn keyword ngxDirectiveThirdParty contained ngx_link_func_call -syn keyword ngxDirectiveThirdParty contained ngx_link_func_download_link_lib -syn keyword ngxDirectiveThirdParty contained ngx_link_func_lib -syn keyword ngxDirectiveThirdParty contained ngx_link_func_shm_size -syn keyword ngxDirectiveThirdParty contained ngx_link_func_subrequest - -" https://github.com/openresty/memc-nginx-module -syn keyword ngxDirectiveThirdParty contained memc_buffer_size -syn keyword ngxDirectiveThirdParty contained memc_cmds_allowed -syn keyword ngxDirectiveThirdParty contained memc_connect_timeout -syn keyword ngxDirectiveThirdParty contained memc_flags_to_last_modified -syn keyword ngxDirectiveThirdParty contained memc_ignore_client_abort -syn keyword ngxDirectiveThirdParty contained memc_next_upstream -syn keyword ngxDirectiveThirdParty contained memc_pass -syn keyword ngxDirectiveThirdParty contained memc_read_timeout -syn keyword ngxDirectiveThirdParty contained memc_send_timeout -syn keyword ngxDirectiveThirdParty contained memc_upstream_fail_timeout -syn keyword ngxDirectiveThirdParty contained memc_upstream_max_fails - -" https://github.com/SpiderLabs/ModSecurity-nginx -syn keyword ngxDirectiveThirdParty contained modsecurity -syn keyword ngxDirectiveThirdParty contained modsecurity_rules -syn keyword ngxDirectiveThirdParty contained modsecurity_rules_file -syn keyword ngxDirectiveThirdParty contained modsecurity_rules_remote -syn keyword ngxDirectiveThirdParty contained modsecurity_transaction_id - -" https://github.com/nbs-system/naxsi -syn keyword ngxDirectiveThirdParty contained BasicRule -syn keyword ngxDirectiveThirdParty contained CheckRule -syn keyword ngxDirectiveThirdParty contained DeniedUrl -syn keyword ngxDirectiveThirdParty contained IgnoreCIDR -syn keyword ngxDirectiveThirdParty contained IgnoreIP -syn keyword ngxDirectiveThirdParty contained LearningMode -syn keyword ngxDirectiveThirdParty contained LibInjectionSql -syn keyword ngxDirectiveThirdParty contained LibInjectionXss -syn keyword ngxDirectiveThirdParty contained MainRule -syn keyword ngxDirectiveThirdParty contained NaxsiLogFile -syn keyword ngxDirectiveThirdParty contained SecRulesDisabled -syn keyword ngxDirectiveThirdParty contained SecRulesEnabled -syn keyword ngxDirectiveThirdParty contained basic_rule -syn keyword ngxDirectiveThirdParty contained check_rule -syn keyword ngxDirectiveThirdParty contained denied_url -syn keyword ngxDirectiveThirdParty contained learning_mode -syn keyword ngxDirectiveThirdParty contained libinjection_sql -syn keyword ngxDirectiveThirdParty contained libinjection_xss -syn keyword ngxDirectiveThirdParty contained main_rule -syn keyword ngxDirectiveThirdParty contained naxsi_log -syn keyword ngxDirectiveThirdParty contained rules_disabled -syn keyword ngxDirectiveThirdParty contained rules_enabled - -" https://github.com/opentracing-contrib/nginx-opentracing -syn keyword ngxDirectiveThirdParty contained opentracing -syn keyword ngxDirectiveThirdParty contained opentracing_fastcgi_propagate_context -syn keyword ngxDirectiveThirdParty contained opentracing_grpc_propagate_context -syn keyword ngxDirectiveThirdParty contained opentracing_load_tracer -syn keyword ngxDirectiveThirdParty contained opentracing_location_operation_name -syn keyword ngxDirectiveThirdParty contained opentracing_operation_name -syn keyword ngxDirectiveThirdParty contained opentracing_propagate_context -syn keyword ngxDirectiveThirdParty contained opentracing_tag -syn keyword ngxDirectiveThirdParty contained opentracing_trace_locations -syn keyword ngxDirectiveThirdParty contained opentracing_trust_incoming_span - -" https://github.com/phusion/passenger -syn keyword ngxDirectiveThirdParty contained passenger_abort_on_startup_error -syn keyword ngxDirectiveThirdParty contained passenger_abort_websockets_on_process_shutdown -syn keyword ngxDirectiveThirdParty contained passenger_admin_panel_auth_type -syn keyword ngxDirectiveThirdParty contained passenger_admin_panel_password -syn keyword ngxDirectiveThirdParty contained passenger_admin_panel_url -syn keyword ngxDirectiveThirdParty contained passenger_admin_panel_username -syn keyword ngxDirectiveThirdParty contained passenger_analytics_log_group -syn keyword ngxDirectiveThirdParty contained passenger_analytics_log_user -syn keyword ngxDirectiveThirdParty contained passenger_anonymous_telemetry_proxy -syn keyword ngxDirectiveThirdParty contained passenger_app_env -syn keyword ngxDirectiveThirdParty contained passenger_app_file_descriptor_ulimit -syn keyword ngxDirectiveThirdParty contained passenger_app_group_name -syn keyword ngxDirectiveThirdParty contained passenger_app_log_file -syn keyword ngxDirectiveThirdParty contained passenger_app_rights -syn keyword ngxDirectiveThirdParty contained passenger_app_root -syn keyword ngxDirectiveThirdParty contained passenger_app_start_command -syn keyword ngxDirectiveThirdParty contained passenger_app_type -syn keyword ngxDirectiveThirdParty contained passenger_base_uri -syn keyword ngxDirectiveThirdParty contained passenger_buffer_response -syn keyword ngxDirectiveThirdParty contained passenger_buffer_size -syn keyword ngxDirectiveThirdParty contained passenger_buffer_upload -syn keyword ngxDirectiveThirdParty contained passenger_buffers -syn keyword ngxDirectiveThirdParty contained passenger_busy_buffers_size -syn keyword ngxDirectiveThirdParty contained passenger_concurrency_model -syn keyword ngxDirectiveThirdParty contained passenger_core_file_descriptor_ulimit -syn keyword ngxDirectiveThirdParty contained passenger_ctl -syn keyword ngxDirectiveThirdParty contained passenger_data_buffer_dir -syn keyword ngxDirectiveThirdParty contained passenger_debug_log_file -syn keyword ngxDirectiveThirdParty contained passenger_debugger -syn keyword ngxDirectiveThirdParty contained passenger_default_group -syn keyword ngxDirectiveThirdParty contained passenger_default_user -syn keyword ngxDirectiveThirdParty contained passenger_direct_instance_request_address -syn keyword ngxDirectiveThirdParty contained passenger_disable_anonymous_telemetry -syn keyword ngxDirectiveThirdParty contained passenger_disable_log_prefix -syn keyword ngxDirectiveThirdParty contained passenger_disable_security_update_check -syn keyword ngxDirectiveThirdParty contained passenger_document_root -syn keyword ngxDirectiveThirdParty contained passenger_dump_config_manifest -syn keyword ngxDirectiveThirdParty contained passenger_enabled -syn keyword ngxDirectiveThirdParty contained passenger_env_var -syn keyword ngxDirectiveThirdParty contained passenger_file_descriptor_log_file -syn keyword ngxDirectiveThirdParty contained passenger_fly_with -syn keyword ngxDirectiveThirdParty contained passenger_force_max_concurrent_requests_per_process -syn keyword ngxDirectiveThirdParty contained passenger_friendly_error_pages -syn keyword ngxDirectiveThirdParty contained passenger_group -syn keyword ngxDirectiveThirdParty contained passenger_headers_hash_bucket_size -syn keyword ngxDirectiveThirdParty contained passenger_headers_hash_max_size -syn keyword ngxDirectiveThirdParty contained passenger_ignore_client_abort -syn keyword ngxDirectiveThirdParty contained passenger_ignore_headers -syn keyword ngxDirectiveThirdParty contained passenger_instance_registry_dir -syn keyword ngxDirectiveThirdParty contained passenger_intercept_errors -syn keyword ngxDirectiveThirdParty contained passenger_load_shell_envvars -syn keyword ngxDirectiveThirdParty contained passenger_log_file -syn keyword ngxDirectiveThirdParty contained passenger_log_level -syn keyword ngxDirectiveThirdParty contained passenger_max_instances -syn keyword ngxDirectiveThirdParty contained passenger_max_instances_per_app -syn keyword ngxDirectiveThirdParty contained passenger_max_pool_size -syn keyword ngxDirectiveThirdParty contained passenger_max_preloader_idle_time -syn keyword ngxDirectiveThirdParty contained passenger_max_request_queue_size -syn keyword ngxDirectiveThirdParty contained passenger_max_request_queue_time -syn keyword ngxDirectiveThirdParty contained passenger_max_request_time -syn keyword ngxDirectiveThirdParty contained passenger_max_requests -syn keyword ngxDirectiveThirdParty contained passenger_memory_limit -syn keyword ngxDirectiveThirdParty contained passenger_meteor_app_settings -syn keyword ngxDirectiveThirdParty contained passenger_min_instances -syn keyword ngxDirectiveThirdParty contained passenger_monitor_log_file -syn keyword ngxDirectiveThirdParty contained passenger_nodejs -syn keyword ngxDirectiveThirdParty contained passenger_pass_header -syn keyword ngxDirectiveThirdParty contained passenger_pool_idle_time -syn keyword ngxDirectiveThirdParty contained passenger_pre_start -syn keyword ngxDirectiveThirdParty contained passenger_preload_bundler -syn keyword ngxDirectiveThirdParty contained passenger_python -syn keyword ngxDirectiveThirdParty contained passenger_read_timeout -syn keyword ngxDirectiveThirdParty contained passenger_request_buffering -syn keyword ngxDirectiveThirdParty contained passenger_request_queue_overflow_status_code -syn keyword ngxDirectiveThirdParty contained passenger_resist_deployment_errors -syn keyword ngxDirectiveThirdParty contained passenger_response_buffer_high_watermark -syn keyword ngxDirectiveThirdParty contained passenger_restart_dir -syn keyword ngxDirectiveThirdParty contained passenger_rolling_restarts -syn keyword ngxDirectiveThirdParty contained passenger_root -syn keyword ngxDirectiveThirdParty contained passenger_ruby -syn keyword ngxDirectiveThirdParty contained passenger_security_update_check_proxy -syn keyword ngxDirectiveThirdParty contained passenger_set_header -syn keyword ngxDirectiveThirdParty contained passenger_show_version_in_header -syn keyword ngxDirectiveThirdParty contained passenger_socket_backlog -syn keyword ngxDirectiveThirdParty contained passenger_spawn_dir -syn keyword ngxDirectiveThirdParty contained passenger_spawn_exception_status_code -syn keyword ngxDirectiveThirdParty contained passenger_spawn_method -syn keyword ngxDirectiveThirdParty contained passenger_start_timeout -syn keyword ngxDirectiveThirdParty contained passenger_startup_file -syn keyword ngxDirectiveThirdParty contained passenger_stat_throttle_rate -syn keyword ngxDirectiveThirdParty contained passenger_sticky_sessions -syn keyword ngxDirectiveThirdParty contained passenger_sticky_sessions_cookie_attributes -syn keyword ngxDirectiveThirdParty contained passenger_sticky_sessions_cookie_name -syn keyword ngxDirectiveThirdParty contained passenger_temp_path -syn keyword ngxDirectiveThirdParty contained passenger_thread_count -syn keyword ngxDirectiveThirdParty contained passenger_turbocaching -syn keyword ngxDirectiveThirdParty contained passenger_use_global_queue -syn keyword ngxDirectiveThirdParty contained passenger_user -syn keyword ngxDirectiveThirdParty contained passenger_user_switching -syn keyword ngxDirectiveThirdParty contained passenger_vary_turbocache_by_cookie -syn keyword ngxDirectiveThirdParty contained rack_env -syn keyword ngxDirectiveThirdParty contained rails_app_spawner_idle_time -syn keyword ngxDirectiveThirdParty contained rails_env -syn keyword ngxDirectiveThirdParty contained rails_framework_spawner_idle_time -syn keyword ngxDirectiveThirdParty contained rails_spawn_method -syn keyword ngxDirectiveThirdParty contained union_station_filter -syn keyword ngxDirectiveThirdParty contained union_station_gateway_address -syn keyword ngxDirectiveThirdParty contained union_station_gateway_cert -syn keyword ngxDirectiveThirdParty contained union_station_gateway_port -syn keyword ngxDirectiveThirdParty contained union_station_key -syn keyword ngxDirectiveThirdParty contained union_station_proxy_address -syn keyword ngxDirectiveThirdParty contained union_station_support - -" https://github.com/konstruxi/ngx_postgres -syn keyword ngxDirectiveThirdParty contained postgres_connect_timeout -syn keyword ngxDirectiveThirdParty contained postgres_escape -syn keyword ngxDirectiveThirdParty contained postgres_keepalive -syn keyword ngxDirectiveThirdParty contained postgres_output -syn keyword ngxDirectiveThirdParty contained postgres_pass -syn keyword ngxDirectiveThirdParty contained postgres_query -syn keyword ngxDirectiveThirdParty contained postgres_result_timeout -syn keyword ngxDirectiveThirdParty contained postgres_rewrite -syn keyword ngxDirectiveThirdParty contained postgres_server -syn keyword ngxDirectiveThirdParty contained postgres_set - -" https://github.com/openresty/rds-csv-nginx-module -syn keyword ngxDirectiveThirdParty contained rds_csv -syn keyword ngxDirectiveThirdParty contained rds_csv_buffer_size -syn keyword ngxDirectiveThirdParty contained rds_csv_content_type -syn keyword ngxDirectiveThirdParty contained rds_csv_field_name_header -syn keyword ngxDirectiveThirdParty contained rds_csv_field_separator -syn keyword ngxDirectiveThirdParty contained rds_csv_row_terminator - -" https://github.com/openresty/rds-json-nginx-module -syn keyword ngxDirectiveThirdParty contained rds_json -syn keyword ngxDirectiveThirdParty contained rds_json_buffer_size -syn keyword ngxDirectiveThirdParty contained rds_json_content_type -syn keyword ngxDirectiveThirdParty contained rds_json_errcode_key -syn keyword ngxDirectiveThirdParty contained rds_json_errstr_key -syn keyword ngxDirectiveThirdParty contained rds_json_format -syn keyword ngxDirectiveThirdParty contained rds_json_ret -syn keyword ngxDirectiveThirdParty contained rds_json_root -syn keyword ngxDirectiveThirdParty contained rds_json_success_property -syn keyword ngxDirectiveThirdParty contained rds_json_user_property - -" https://github.com/openresty/redis2-nginx-module -syn keyword ngxDirectiveThirdParty contained redis2_bind -syn keyword ngxDirectiveThirdParty contained redis2_buffer_size -syn keyword ngxDirectiveThirdParty contained redis2_connect_timeout -syn keyword ngxDirectiveThirdParty contained redis2_literal_raw_query -syn keyword ngxDirectiveThirdParty contained redis2_next_upstream -syn keyword ngxDirectiveThirdParty contained redis2_pass -syn keyword ngxDirectiveThirdParty contained redis2_query -syn keyword ngxDirectiveThirdParty contained redis2_raw_queries -syn keyword ngxDirectiveThirdParty contained redis2_raw_query -syn keyword ngxDirectiveThirdParty contained redis2_read_timeout -syn keyword ngxDirectiveThirdParty contained redis2_send_timeout - -" https://github.com/arut/nginx-rtmp-module -syn keyword ngxDirectiveThirdParty contained ack_window -syn keyword ngxDirectiveThirdParty contained application -syn keyword ngxDirectiveThirdParty contained buffer -syn keyword ngxDirectiveThirdParty contained buflen -syn keyword ngxDirectiveThirdParty contained busy -syn keyword ngxDirectiveThirdParty contained chunk_size -syn keyword ngxDirectiveThirdParty contained dash -syn keyword ngxDirectiveThirdParty contained dash_cleanup -syn keyword ngxDirectiveThirdParty contained dash_fragment -syn keyword ngxDirectiveThirdParty contained dash_nested -syn keyword ngxDirectiveThirdParty contained dash_path -syn keyword ngxDirectiveThirdParty contained dash_playlist_length -syn keyword ngxDirectiveThirdParty contained drop_idle_publisher -syn keyword ngxDirectiveThirdParty contained exec -syn keyword ngxDirectiveThirdParty contained exec_block -syn keyword ngxDirectiveThirdParty contained exec_kill_signal -syn keyword ngxDirectiveThirdParty contained exec_options -syn keyword ngxDirectiveThirdParty contained exec_play -syn keyword ngxDirectiveThirdParty contained exec_play_done -syn keyword ngxDirectiveThirdParty contained exec_publish -syn keyword ngxDirectiveThirdParty contained exec_publish_done -syn keyword ngxDirectiveThirdParty contained exec_pull -syn keyword ngxDirectiveThirdParty contained exec_push -syn keyword ngxDirectiveThirdParty contained exec_record_done -syn keyword ngxDirectiveThirdParty contained exec_static -syn keyword ngxDirectiveThirdParty contained hls_audio_buffer_size -syn keyword ngxDirectiveThirdParty contained hls_base_url -syn keyword ngxDirectiveThirdParty contained hls_cleanup -syn keyword ngxDirectiveThirdParty contained hls_continuous -syn keyword ngxDirectiveThirdParty contained hls_fragment_naming -syn keyword ngxDirectiveThirdParty contained hls_fragment_naming_granularity -syn keyword ngxDirectiveThirdParty contained hls_fragment_slicing -syn keyword ngxDirectiveThirdParty contained hls_fragments_per_key -syn keyword ngxDirectiveThirdParty contained hls_key_path -syn keyword ngxDirectiveThirdParty contained hls_key_url -syn keyword ngxDirectiveThirdParty contained hls_keys -syn keyword ngxDirectiveThirdParty contained hls_max_audio_delay -syn keyword ngxDirectiveThirdParty contained hls_max_fragment -syn keyword ngxDirectiveThirdParty contained hls_muxdelay -syn keyword ngxDirectiveThirdParty contained hls_nested -syn keyword ngxDirectiveThirdParty contained hls_path -syn keyword ngxDirectiveThirdParty contained hls_playlist_length -syn keyword ngxDirectiveThirdParty contained hls_sync -syn keyword ngxDirectiveThirdParty contained hls_type -syn keyword ngxDirectiveThirdParty contained hls_variant -syn keyword ngxDirectiveThirdParty contained idle_streams -syn keyword ngxDirectiveThirdParty contained interleave -syn keyword ngxDirectiveThirdParty contained live -syn keyword ngxDirectiveThirdParty contained max_connections -syn keyword ngxDirectiveThirdParty contained max_message -syn keyword ngxDirectiveThirdParty contained max_streams -syn keyword ngxDirectiveThirdParty contained meta -syn keyword ngxDirectiveThirdParty contained netcall_buffer -syn keyword ngxDirectiveThirdParty contained netcall_timeout -syn keyword ngxDirectiveThirdParty contained notify_method -syn keyword ngxDirectiveThirdParty contained notify_relay_redirect -syn keyword ngxDirectiveThirdParty contained notify_update_strict -syn keyword ngxDirectiveThirdParty contained notify_update_timeout -syn keyword ngxDirectiveThirdParty contained on_connect -syn keyword ngxDirectiveThirdParty contained on_disconnect -syn keyword ngxDirectiveThirdParty contained on_done -syn keyword ngxDirectiveThirdParty contained on_play -syn keyword ngxDirectiveThirdParty contained on_play_done -syn keyword ngxDirectiveThirdParty contained on_publish -syn keyword ngxDirectiveThirdParty contained on_publish_done -syn keyword ngxDirectiveThirdParty contained on_record_done -syn keyword ngxDirectiveThirdParty contained on_update -syn keyword ngxDirectiveThirdParty contained out_cork -syn keyword ngxDirectiveThirdParty contained out_queue -syn keyword ngxDirectiveThirdParty contained ping -syn keyword ngxDirectiveThirdParty contained ping_timeout -syn keyword ngxDirectiveThirdParty contained play -syn keyword ngxDirectiveThirdParty contained play_local_path -syn keyword ngxDirectiveThirdParty contained play_restart -syn keyword ngxDirectiveThirdParty contained play_temp_path -syn keyword ngxDirectiveThirdParty contained play_time_fix -syn keyword ngxDirectiveThirdParty contained publish_notify -syn keyword ngxDirectiveThirdParty contained publish_time_fix -syn keyword ngxDirectiveThirdParty contained pull -syn keyword ngxDirectiveThirdParty contained pull_reconnect -syn keyword ngxDirectiveThirdParty contained push -syn keyword ngxDirectiveThirdParty contained push_reconnect -syn keyword ngxDirectiveThirdParty contained record -syn keyword ngxDirectiveThirdParty contained record_append -syn keyword ngxDirectiveThirdParty contained record_interval -syn keyword ngxDirectiveThirdParty contained record_lock -syn keyword ngxDirectiveThirdParty contained record_max_frames -syn keyword ngxDirectiveThirdParty contained record_max_size -syn keyword ngxDirectiveThirdParty contained record_notify -syn keyword ngxDirectiveThirdParty contained record_path -syn keyword ngxDirectiveThirdParty contained record_suffix -syn keyword ngxDirectiveThirdParty contained record_unique -syn keyword ngxDirectiveThirdParty contained recorder -syn keyword ngxDirectiveThirdParty contained relay_buffer -syn keyword ngxDirectiveThirdParty contained respawn -syn keyword ngxDirectiveThirdParty contained respawn_timeout -syn keyword ngxDirectiveThirdParty contained rtmp -syn keyword ngxDirectiveThirdParty contained rtmp_auto_push -syn keyword ngxDirectiveThirdParty contained rtmp_auto_push_reconnect -syn keyword ngxDirectiveThirdParty contained rtmp_control -syn keyword ngxDirectiveThirdParty contained rtmp_socket_dir -syn keyword ngxDirectiveThirdParty contained rtmp_stat -syn keyword ngxDirectiveThirdParty contained rtmp_stat_stylesheet -syn keyword ngxDirectiveThirdParty contained session_relay -syn keyword ngxDirectiveThirdParty contained so_keepalive -syn keyword ngxDirectiveThirdParty contained stream_buckets -syn keyword ngxDirectiveThirdParty contained sync -syn keyword ngxDirectiveThirdParty contained wait_key -syn keyword ngxDirectiveThirdParty contained wait_video - -" https://github.com/openresty/set-misc-nginx-module -syn keyword ngxDirectiveThirdParty contained set_base32_alphabet -syn keyword ngxDirectiveThirdParty contained set_base32_padding -syn keyword ngxDirectiveThirdParty contained set_decode_base32 -syn keyword ngxDirectiveThirdParty contained set_decode_base64 -syn keyword ngxDirectiveThirdParty contained set_decode_base64url -syn keyword ngxDirectiveThirdParty contained set_decode_hex -syn keyword ngxDirectiveThirdParty contained set_encode_base32 -syn keyword ngxDirectiveThirdParty contained set_encode_base64 -syn keyword ngxDirectiveThirdParty contained set_encode_base64url -syn keyword ngxDirectiveThirdParty contained set_encode_hex -syn keyword ngxDirectiveThirdParty contained set_escape_uri -syn keyword ngxDirectiveThirdParty contained set_formatted_gmt_time -syn keyword ngxDirectiveThirdParty contained set_formatted_local_time -syn keyword ngxDirectiveThirdParty contained set_hashed_upstream -syn keyword ngxDirectiveThirdParty contained set_hmac_sha1 -syn keyword ngxDirectiveThirdParty contained set_hmac_sha256 -syn keyword ngxDirectiveThirdParty contained set_if_empty -syn keyword ngxDirectiveThirdParty contained set_local_today -syn keyword ngxDirectiveThirdParty contained set_md5 -syn keyword ngxDirectiveThirdParty contained set_misc_base32_padding -syn keyword ngxDirectiveThirdParty contained set_quote_json_str -syn keyword ngxDirectiveThirdParty contained set_quote_pgsql_str -syn keyword ngxDirectiveThirdParty contained set_quote_sql_str -syn keyword ngxDirectiveThirdParty contained set_random -syn keyword ngxDirectiveThirdParty contained set_rotate -syn keyword ngxDirectiveThirdParty contained set_secure_random_alphanum -syn keyword ngxDirectiveThirdParty contained set_secure_random_lcalpha -syn keyword ngxDirectiveThirdParty contained set_sha1 -syn keyword ngxDirectiveThirdParty contained set_unescape_uri - -" https://github.com/sflow/nginx-sflow-module -syn keyword ngxDirectiveThirdParty contained sflow - -" https://github.com/nginx-shib/nginx-http-shibboleth -syn keyword ngxDirectiveThirdParty contained shib_request -syn keyword ngxDirectiveThirdParty contained shib_request_set -syn keyword ngxDirectiveThirdParty contained shib_request_use_headers - -" https://github.com/baysao/ngx_slowfs_cache -syn keyword ngxDirectiveThirdParty contained slowfs_big_file_size -syn keyword ngxDirectiveThirdParty contained slowfs_cache -syn keyword ngxDirectiveThirdParty contained slowfs_cache_key -syn keyword ngxDirectiveThirdParty contained slowfs_cache_min_uses -syn keyword ngxDirectiveThirdParty contained slowfs_cache_path -syn keyword ngxDirectiveThirdParty contained slowfs_cache_purge -syn keyword ngxDirectiveThirdParty contained slowfs_cache_valid -syn keyword ngxDirectiveThirdParty contained slowfs_temp_path - -" https://github.com/openresty/srcache-nginx-module -syn keyword ngxDirectiveThirdParty contained srcache_buffer -syn keyword ngxDirectiveThirdParty contained srcache_default_expire -syn keyword ngxDirectiveThirdParty contained srcache_fetch -syn keyword ngxDirectiveThirdParty contained srcache_fetch_skip -syn keyword ngxDirectiveThirdParty contained srcache_header_buffer_size -syn keyword ngxDirectiveThirdParty contained srcache_ignore_content_encoding -syn keyword ngxDirectiveThirdParty contained srcache_max_expire -syn keyword ngxDirectiveThirdParty contained srcache_methods -syn keyword ngxDirectiveThirdParty contained srcache_request_cache_control -syn keyword ngxDirectiveThirdParty contained srcache_response_cache_control -syn keyword ngxDirectiveThirdParty contained srcache_store -syn keyword ngxDirectiveThirdParty contained srcache_store_hide_header -syn keyword ngxDirectiveThirdParty contained srcache_store_max_size -syn keyword ngxDirectiveThirdParty contained srcache_store_no_cache -syn keyword ngxDirectiveThirdParty contained srcache_store_no_store -syn keyword ngxDirectiveThirdParty contained srcache_store_pass_header -syn keyword ngxDirectiveThirdParty contained srcache_store_private -syn keyword ngxDirectiveThirdParty contained srcache_store_ranges -syn keyword ngxDirectiveThirdParty contained srcache_store_skip -syn keyword ngxDirectiveThirdParty contained srcache_store_statuses - -" https://github.com/kaltura/nginx-vod-module -syn keyword ngxDirectiveThirdParty contained vod -syn keyword ngxDirectiveThirdParty contained vod_align_segments_to_key_frames -syn keyword ngxDirectiveThirdParty contained vod_apply_dynamic_mapping -syn keyword ngxDirectiveThirdParty contained vod_base_url -syn keyword ngxDirectiveThirdParty contained vod_bootstrap_segment_durations -syn keyword ngxDirectiveThirdParty contained vod_cache_buffer_size -syn keyword ngxDirectiveThirdParty contained vod_clip_from_param_name -syn keyword ngxDirectiveThirdParty contained vod_clip_to_param_name -syn keyword ngxDirectiveThirdParty contained vod_drm_clear_lead_segment_count -syn keyword ngxDirectiveThirdParty contained vod_drm_enabled -syn keyword ngxDirectiveThirdParty contained vod_drm_info_cache -syn keyword ngxDirectiveThirdParty contained vod_drm_max_info_length -syn keyword ngxDirectiveThirdParty contained vod_drm_request_uri -syn keyword ngxDirectiveThirdParty contained vod_drm_single_key -syn keyword ngxDirectiveThirdParty contained vod_drm_upstream_location -syn keyword ngxDirectiveThirdParty contained vod_dynamic_clip_map_uri -syn keyword ngxDirectiveThirdParty contained vod_dynamic_mapping_cache -syn keyword ngxDirectiveThirdParty contained vod_encryption_iv_seed -syn keyword ngxDirectiveThirdParty contained vod_expires -syn keyword ngxDirectiveThirdParty contained vod_expires_live -syn keyword ngxDirectiveThirdParty contained vod_expires_live_time_dependent -syn keyword ngxDirectiveThirdParty contained vod_fallback_upstream_location -syn keyword ngxDirectiveThirdParty contained vod_force_continuous_timestamps -syn keyword ngxDirectiveThirdParty contained vod_force_playlist_type_vod -syn keyword ngxDirectiveThirdParty contained vod_force_sequence_index -syn keyword ngxDirectiveThirdParty contained vod_gop_look_ahead -syn keyword ngxDirectiveThirdParty contained vod_gop_look_behind -syn keyword ngxDirectiveThirdParty contained vod_ignore_edit_list -syn keyword ngxDirectiveThirdParty contained vod_initial_read_size -syn keyword ngxDirectiveThirdParty contained vod_lang_param_name -syn keyword ngxDirectiveThirdParty contained vod_last_modified -syn keyword ngxDirectiveThirdParty contained vod_last_modified_types -syn keyword ngxDirectiveThirdParty contained vod_live_mapping_cache -syn keyword ngxDirectiveThirdParty contained vod_live_response_cache -syn keyword ngxDirectiveThirdParty contained vod_live_window_duration -syn keyword ngxDirectiveThirdParty contained vod_manifest_duration_policy -syn keyword ngxDirectiveThirdParty contained vod_manifest_segment_durations_mode -syn keyword ngxDirectiveThirdParty contained vod_mapping_cache -syn keyword ngxDirectiveThirdParty contained vod_max_frame_count -syn keyword ngxDirectiveThirdParty contained vod_max_frames_size -syn keyword ngxDirectiveThirdParty contained vod_max_mapping_response_size -syn keyword ngxDirectiveThirdParty contained vod_max_metadata_size -syn keyword ngxDirectiveThirdParty contained vod_max_upstream_headers_size -syn keyword ngxDirectiveThirdParty contained vod_media_set_map_uri -syn keyword ngxDirectiveThirdParty contained vod_media_set_override_json -syn keyword ngxDirectiveThirdParty contained vod_metadata_cache -syn keyword ngxDirectiveThirdParty contained vod_min_single_nalu_per_frame_segment -syn keyword ngxDirectiveThirdParty contained vod_mode -syn keyword ngxDirectiveThirdParty contained vod_multi_uri_suffix -syn keyword ngxDirectiveThirdParty contained vod_notification_uri -syn keyword ngxDirectiveThirdParty contained vod_open_file_thread_pool -syn keyword ngxDirectiveThirdParty contained vod_output_buffer_pool -syn keyword ngxDirectiveThirdParty contained vod_parse_hdlr_name -syn keyword ngxDirectiveThirdParty contained vod_parse_udta_name -syn keyword ngxDirectiveThirdParty contained vod_path_response_postfix -syn keyword ngxDirectiveThirdParty contained vod_path_response_prefix -syn keyword ngxDirectiveThirdParty contained vod_performance_counters -syn keyword ngxDirectiveThirdParty contained vod_proxy_header_name -syn keyword ngxDirectiveThirdParty contained vod_proxy_header_value -syn keyword ngxDirectiveThirdParty contained vod_redirect_segments_url -syn keyword ngxDirectiveThirdParty contained vod_remote_upstream_location -syn keyword ngxDirectiveThirdParty contained vod_response_cache -syn keyword ngxDirectiveThirdParty contained vod_secret_key -syn keyword ngxDirectiveThirdParty contained vod_segment_count_policy -syn keyword ngxDirectiveThirdParty contained vod_segment_duration -syn keyword ngxDirectiveThirdParty contained vod_segment_max_frame_count -syn keyword ngxDirectiveThirdParty contained vod_segments_base_url -syn keyword ngxDirectiveThirdParty contained vod_source_clip_map_uri -syn keyword ngxDirectiveThirdParty contained vod_speed_param_name -syn keyword ngxDirectiveThirdParty contained vod_status -syn keyword ngxDirectiveThirdParty contained vod_time_shift_param_name -syn keyword ngxDirectiveThirdParty contained vod_tracks_param_name -syn keyword ngxDirectiveThirdParty contained vod_upstream_extra_args -syn keyword ngxDirectiveThirdParty contained vod_upstream_location - -" https://github.com/vozlt/nginx-module-vts -syn keyword ngxDirectiveThirdParty contained vhost_traffic_status -syn keyword ngxDirectiveThirdParty contained vhost_traffic_status_average_method -syn keyword ngxDirectiveThirdParty contained vhost_traffic_status_bypass_limit -syn keyword ngxDirectiveThirdParty contained vhost_traffic_status_bypass_stats -syn keyword ngxDirectiveThirdParty contained vhost_traffic_status_display -syn keyword ngxDirectiveThirdParty contained vhost_traffic_status_display_format -syn keyword ngxDirectiveThirdParty contained vhost_traffic_status_display_jsonp -syn keyword ngxDirectiveThirdParty contained vhost_traffic_status_display_sum_key -syn keyword ngxDirectiveThirdParty contained vhost_traffic_status_dump -syn keyword ngxDirectiveThirdParty contained vhost_traffic_status_filter -syn keyword ngxDirectiveThirdParty contained vhost_traffic_status_filter_by_host -syn keyword ngxDirectiveThirdParty contained vhost_traffic_status_filter_by_set_key -syn keyword ngxDirectiveThirdParty contained vhost_traffic_status_filter_check_duplicate -syn keyword ngxDirectiveThirdParty contained vhost_traffic_status_filter_max_node -syn keyword ngxDirectiveThirdParty contained vhost_traffic_status_histogram_buckets -syn keyword ngxDirectiveThirdParty contained vhost_traffic_status_limit -syn keyword ngxDirectiveThirdParty contained vhost_traffic_status_limit_check_duplicate -syn keyword ngxDirectiveThirdParty contained vhost_traffic_status_limit_traffic -syn keyword ngxDirectiveThirdParty contained vhost_traffic_status_limit_traffic_by_set_key -syn keyword ngxDirectiveThirdParty contained vhost_traffic_status_set_by_filter -syn keyword ngxDirectiveThirdParty contained vhost_traffic_status_zone - -" https://github.com/openresty/xss-nginx-module -syn keyword ngxDirectiveThirdParty contained xss_callback_arg -syn keyword ngxDirectiveThirdParty contained xss_check_status -syn keyword ngxDirectiveThirdParty contained xss_get -syn keyword ngxDirectiveThirdParty contained xss_input_types -syn keyword ngxDirectiveThirdParty contained xss_output_type -syn keyword ngxDirectiveThirdParty contained xss_override_status - -" https://github.com/tg123/websockify-nginx-module -syn keyword ngxDirectiveThirdParty contained websockify_buffer_size -syn keyword ngxDirectiveThirdParty contained websockify_connect_timeout -syn keyword ngxDirectiveThirdParty contained websockify_pass -syn keyword ngxDirectiveThirdParty contained websockify_read_timeout -syn keyword ngxDirectiveThirdParty contained websockify_send_timeout - -" https://github.com/vozlt/nginx-module-sts -syn keyword ngxDirectiveThirdParty contained stream_server_traffic_status -syn keyword ngxDirectiveThirdParty contained stream_server_traffic_status_average_method -syn keyword ngxDirectiveThirdParty contained stream_server_traffic_status_display -syn keyword ngxDirectiveThirdParty contained stream_server_traffic_status_display_format -syn keyword ngxDirectiveThirdParty contained stream_server_traffic_status_display_jsonp -syn keyword ngxDirectiveThirdParty contained stream_server_traffic_status_zone - -" highlight - -hi def link ngxComment Comment -hi def link ngxParamComment Comment -hi def link ngxListenComment Comment -hi def link ngxVariable Identifier -hi def link ngxVariableString PreProc -hi def link ngxString String -hi def link ngxListenString String - -hi def link ngxBoolean Boolean -hi def link ngxDirectiveBlock Statement -hi def link ngxDirectiveImportant Type -hi def link ngxDirectiveListen Type -hi def link ngxDirectiveControl Keyword -hi def link ngxDirectiveError Constant -hi def link ngxDirectiveDeprecated Error -hi def link ngxDirective Identifier -hi def link ngxDirectiveThirdParty Special -hi def link ngxDirectiveThirdPartyDeprecated Error - -hi def link ngxListenOptions Keyword -hi def link ngxListenOptionsDeprecated Error - -let &cpo = s:save_cpo -unlet s:save_cpo - -let b:current_syntax = "nginx" diff --git a/src/deps/src/nginx-1.30.3/misc/GNUmakefile b/src/deps/src/nginx-1.30.3/misc/GNUmakefile deleted file mode 100644 index 2211bfeebb..0000000000 --- a/src/deps/src/nginx-1.30.3/misc/GNUmakefile +++ /dev/null @@ -1,149 +0,0 @@ - -VER = $(shell grep 'define NGINX_VERSION' src/core/nginx.h \ - | sed -e 's/^.*"\(.*\)".*/\1/') -NGINX = nginx-$(VER) -TEMP = tmp - -CC = cl -OBJS = objs.msvc8 -OPENSSL = openssl-3.5.7 -ZLIB = zlib-1.3.2 -PCRE = pcre2-10.47 - - -release: export - - mv $(TEMP)/$(NGINX)/auto/configure $(TEMP)/$(NGINX) - - mv $(TEMP)/$(NGINX)/docs/html $(TEMP)/$(NGINX) - mv $(TEMP)/$(NGINX)/docs/man $(TEMP)/$(NGINX) - - $(MAKE) -f docs/GNUmakefile changes - - rm -r $(TEMP)/$(NGINX)/docs - rm -r $(TEMP)/$(NGINX)/misc - - tar -c -z -f $(NGINX).tar.gz --directory $(TEMP) $(NGINX) - - -export: - rm -rf $(TEMP) - git archive --prefix=$(TEMP)/$(NGINX)/ HEAD | tar -x -f - --exclude '.git*' - - -RELEASE: - git commit -m nginx-$(VER)-RELEASE - git tag -m "release-$(VER) tag" release-$(VER) - - $(MAKE) -f misc/GNUmakefile release - - -win32: - ./auto/configure \ - --with-cc=$(CC) \ - --builddir=$(OBJS) \ - --with-debug \ - --prefix= \ - --conf-path=conf/nginx.conf \ - --pid-path=logs/nginx.pid \ - --http-log-path=logs/access.log \ - --error-log-path=logs/error.log \ - --sbin-path=nginx.exe \ - --http-client-body-temp-path=temp/client_body_temp \ - --http-proxy-temp-path=temp/proxy_temp \ - --http-fastcgi-temp-path=temp/fastcgi_temp \ - --http-scgi-temp-path=temp/scgi_temp \ - --http-uwsgi-temp-path=temp/uwsgi_temp \ - --with-cc-opt=-DFD_SETSIZE=1024 \ - --with-pcre=$(OBJS)/lib/$(PCRE) \ - --with-zlib=$(OBJS)/lib/$(ZLIB) \ - --with-http_v2_module \ - --with-http_realip_module \ - --with-http_addition_module \ - --with-http_sub_module \ - --with-http_dav_module \ - --with-http_stub_status_module \ - --with-http_flv_module \ - --with-http_mp4_module \ - --with-http_gunzip_module \ - --with-http_gzip_static_module \ - --with-http_auth_request_module \ - --with-http_random_index_module \ - --with-http_secure_link_module \ - --with-http_slice_module \ - --with-mail \ - --with-stream \ - --with-stream_realip_module \ - --with-stream_ssl_preread_module \ - --with-openssl=$(OBJS)/lib/$(OPENSSL) \ - --with-openssl-opt="no-asm no-tests no-makedepend \ - -D_WIN32_WINNT=0x0501" \ - --with-http_ssl_module \ - --with-mail_ssl_module \ - --with-stream_ssl_module - - -zip: export - rm -f $(NGINX).zip - - mkdir -p $(TEMP)/$(NGINX)/docs.new - mkdir -p $(TEMP)/$(NGINX)/logs - mkdir -p $(TEMP)/$(NGINX)/temp - - sed -i '' -e "s/$$/`printf '\r'`/" $(TEMP)/$(NGINX)/conf/* - - mv $(TEMP)/$(NGINX)/LICENSE $(TEMP)/$(NGINX)/docs.new - mv $(TEMP)/$(NGINX)/*.md $(TEMP)/$(NGINX)/docs.new - mv $(TEMP)/$(NGINX)/docs/html $(TEMP)/$(NGINX) - - rm -r $(TEMP)/$(NGINX)/docs - mv $(TEMP)/$(NGINX)/docs.new $(TEMP)/$(NGINX)/docs - - cp -p $(OBJS)/nginx.exe $(TEMP)/$(NGINX) - - $(MAKE) -f docs/GNUmakefile changes - mv $(TEMP)/$(NGINX)/CHANGES* $(TEMP)/$(NGINX)/docs/ - - cp -p $(OBJS)/lib/$(OPENSSL)/LICENSE.txt \ - $(TEMP)/$(NGINX)/docs/OpenSSL.LICENSE - - cp -p $(OBJS)/lib/$(PCRE)/LICENCE.md \ - $(TEMP)/$(NGINX)/docs/PCRE.LICENCE - - sed -ne '/^ (C) 1995-20/,/^ jloup@gzip\.org/p' \ - $(OBJS)/lib/$(ZLIB)/README \ - > $(TEMP)/$(NGINX)/docs/zlib.LICENSE - - touch -r $(OBJS)/lib/$(ZLIB)/README \ - $(TEMP)/$(NGINX)/docs/zlib.LICENSE - - rm -r $(TEMP)/$(NGINX)/auto - rm -r $(TEMP)/$(NGINX)/misc - rm -r $(TEMP)/$(NGINX)/src - - cd $(TEMP) && zip -r ../$(NGINX).zip $(NGINX) - - -icons: src/os/win32/nginx.ico - -# 48x48, 32x32 and 16x16 icons - -src/os/win32/nginx.ico: src/os/win32/nginx_icon48.xpm \ - src/os/win32/nginx_icon32.xpm \ - src/os/win32/nginx_icon16.xpm - - test -d $(TEMP) || mkdir $(TEMP) - - xpmtoppm --alphaout=$(TEMP)/nginx48.pbm \ - src/os/win32/nginx_icon48.xpm > $(TEMP)/nginx48.ppm - - xpmtoppm --alphaout=$(TEMP)/nginx32.pbm \ - src/os/win32/nginx_icon32.xpm > $(TEMP)/nginx32.ppm - - xpmtoppm --alphaout=$(TEMP)/nginx16.pbm \ - src/os/win32/nginx_icon16.xpm > $(TEMP)/nginx16.ppm - - ppmtowinicon -output src/os/win32/nginx.ico -andpgms \ - $(TEMP)/nginx48.ppm $(TEMP)/nginx48.pbm \ - $(TEMP)/nginx32.ppm $(TEMP)/nginx32.pbm \ - $(TEMP)/nginx16.ppm $(TEMP)/nginx16.pbm diff --git a/src/deps/src/nginx-1.30.3/misc/README b/src/deps/src/nginx-1.30.3/misc/README deleted file mode 100644 index a5a88f2ba9..0000000000 --- a/src/deps/src/nginx-1.30.3/misc/README +++ /dev/null @@ -1,13 +0,0 @@ - -make -f misc/GNUmakefile release - -the required tools: -*) xsltproc to build CHANGES, -*) xslscript.pl ( https://github.com/nginx/xslscript ) to build XSLTs - from XSLScript sources. - - -make -f misc/GNUmakefile icons - -the required tool: -*) netpbm to create Win32 icons from xpm sources. diff --git a/src/deps/src/nginx-1.30.3/src/core/nginx.c b/src/deps/src/nginx-1.30.3/src/core/nginx.c deleted file mode 100644 index 0deb27b7f9..0000000000 --- a/src/deps/src/nginx-1.30.3/src/core/nginx.c +++ /dev/null @@ -1,1676 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#include -#include -#include - - -static void ngx_show_version_info(void); -static ngx_int_t ngx_add_inherited_sockets(ngx_cycle_t *cycle); -static void ngx_cleanup_environment(void *data); -static void ngx_cleanup_environment_variable(void *data); -static ngx_int_t ngx_get_options(int argc, char *const *argv); -static ngx_int_t ngx_process_options(ngx_cycle_t *cycle); -static ngx_int_t ngx_save_argv(ngx_cycle_t *cycle, int argc, char *const *argv); -static void *ngx_core_module_create_conf(ngx_cycle_t *cycle); -static char *ngx_core_module_init_conf(ngx_cycle_t *cycle, void *conf); -static char *ngx_set_user(ngx_conf_t *cf, ngx_command_t *cmd, void *conf); -static char *ngx_set_env(ngx_conf_t *cf, ngx_command_t *cmd, void *conf); -static char *ngx_set_priority(ngx_conf_t *cf, ngx_command_t *cmd, void *conf); -static char *ngx_set_cpu_affinity(ngx_conf_t *cf, ngx_command_t *cmd, - void *conf); -static char *ngx_set_worker_processes(ngx_conf_t *cf, ngx_command_t *cmd, - void *conf); -static char *ngx_load_module(ngx_conf_t *cf, ngx_command_t *cmd, void *conf); -#if (NGX_HAVE_DLOPEN) -static void ngx_unload_module(void *data); -#endif - - -static ngx_conf_enum_t ngx_debug_points[] = { - { ngx_string("stop"), NGX_DEBUG_POINTS_STOP }, - { ngx_string("abort"), NGX_DEBUG_POINTS_ABORT }, - { ngx_null_string, 0 } -}; - - -static ngx_command_t ngx_core_commands[] = { - - { ngx_string("daemon"), - NGX_MAIN_CONF|NGX_DIRECT_CONF|NGX_CONF_FLAG, - ngx_conf_set_flag_slot, - 0, - offsetof(ngx_core_conf_t, daemon), - NULL }, - - { ngx_string("master_process"), - NGX_MAIN_CONF|NGX_DIRECT_CONF|NGX_CONF_FLAG, - ngx_conf_set_flag_slot, - 0, - offsetof(ngx_core_conf_t, master), - NULL }, - - { ngx_string("timer_resolution"), - NGX_MAIN_CONF|NGX_DIRECT_CONF|NGX_CONF_TAKE1, - ngx_conf_set_msec_slot, - 0, - offsetof(ngx_core_conf_t, timer_resolution), - NULL }, - - { ngx_string("pid"), - NGX_MAIN_CONF|NGX_DIRECT_CONF|NGX_CONF_TAKE1, - ngx_conf_set_str_slot, - 0, - offsetof(ngx_core_conf_t, pid), - NULL }, - - { ngx_string("lock_file"), - NGX_MAIN_CONF|NGX_DIRECT_CONF|NGX_CONF_TAKE1, - ngx_conf_set_str_slot, - 0, - offsetof(ngx_core_conf_t, lock_file), - NULL }, - - { ngx_string("worker_processes"), - NGX_MAIN_CONF|NGX_DIRECT_CONF|NGX_CONF_TAKE1, - ngx_set_worker_processes, - 0, - 0, - NULL }, - - { ngx_string("debug_points"), - NGX_MAIN_CONF|NGX_DIRECT_CONF|NGX_CONF_TAKE1, - ngx_conf_set_enum_slot, - 0, - offsetof(ngx_core_conf_t, debug_points), - &ngx_debug_points }, - - { ngx_string("user"), - NGX_MAIN_CONF|NGX_DIRECT_CONF|NGX_CONF_TAKE12, - ngx_set_user, - 0, - 0, - NULL }, - - { ngx_string("worker_priority"), - NGX_MAIN_CONF|NGX_DIRECT_CONF|NGX_CONF_TAKE1, - ngx_set_priority, - 0, - 0, - NULL }, - - { ngx_string("worker_cpu_affinity"), - NGX_MAIN_CONF|NGX_DIRECT_CONF|NGX_CONF_1MORE, - ngx_set_cpu_affinity, - 0, - 0, - NULL }, - - { ngx_string("worker_rlimit_nofile"), - NGX_MAIN_CONF|NGX_DIRECT_CONF|NGX_CONF_TAKE1, - ngx_conf_set_num_slot, - 0, - offsetof(ngx_core_conf_t, rlimit_nofile), - NULL }, - - { ngx_string("worker_rlimit_core"), - NGX_MAIN_CONF|NGX_DIRECT_CONF|NGX_CONF_TAKE1, - ngx_conf_set_off_slot, - 0, - offsetof(ngx_core_conf_t, rlimit_core), - NULL }, - - { ngx_string("worker_shutdown_timeout"), - NGX_MAIN_CONF|NGX_DIRECT_CONF|NGX_CONF_TAKE1, - ngx_conf_set_msec_slot, - 0, - offsetof(ngx_core_conf_t, shutdown_timeout), - NULL }, - - { ngx_string("working_directory"), - NGX_MAIN_CONF|NGX_DIRECT_CONF|NGX_CONF_TAKE1, - ngx_conf_set_str_slot, - 0, - offsetof(ngx_core_conf_t, working_directory), - NULL }, - - { ngx_string("env"), - NGX_MAIN_CONF|NGX_DIRECT_CONF|NGX_CONF_TAKE1, - ngx_set_env, - 0, - 0, - NULL }, - - { ngx_string("load_module"), - NGX_MAIN_CONF|NGX_DIRECT_CONF|NGX_CONF_TAKE1, - ngx_load_module, - 0, - 0, - NULL }, - - ngx_null_command -}; - - -static ngx_core_module_t ngx_core_module_ctx = { - ngx_string("core"), - ngx_core_module_create_conf, - ngx_core_module_init_conf -}; - - -ngx_module_t ngx_core_module = { - NGX_MODULE_V1, - &ngx_core_module_ctx, /* module context */ - ngx_core_commands, /* module directives */ - NGX_CORE_MODULE, /* module type */ - NULL, /* init master */ - NULL, /* init module */ - NULL, /* init process */ - NULL, /* init thread */ - NULL, /* exit thread */ - NULL, /* exit process */ - NULL, /* exit master */ - NGX_MODULE_V1_PADDING -}; - - -static ngx_uint_t ngx_show_help; -static ngx_uint_t ngx_show_version; -static ngx_uint_t ngx_show_configure; -static u_char *ngx_prefix; -static u_char *ngx_error_log; -static u_char *ngx_conf_file; -static u_char *ngx_conf_params; -static char *ngx_signal; - - -static char **ngx_os_environ; - - -int ngx_cdecl -main(int argc, char *const *argv) -{ - ngx_buf_t *b; - ngx_log_t *log; - ngx_uint_t i; - ngx_cycle_t *cycle, init_cycle; - ngx_conf_dump_t *cd; - ngx_core_conf_t *ccf; - - ngx_debug_init(); - - if (ngx_strerror_init() != NGX_OK) { - return 1; - } - - if (ngx_get_options(argc, argv) != NGX_OK) { - return 1; - } - - if (ngx_show_version) { - ngx_show_version_info(); - - if (!ngx_test_config) { - return 0; - } - } - - /* TODO */ ngx_max_sockets = -1; - - ngx_time_init(); - -#if (NGX_PCRE) - ngx_regex_init(); -#endif - - ngx_pid = ngx_getpid(); - ngx_parent = ngx_getppid(); - - log = ngx_log_init(ngx_prefix, ngx_error_log); - if (log == NULL) { - return 1; - } - - /* STUB */ -#if (NGX_OPENSSL) - ngx_ssl_init(log); -#endif - - /* - * init_cycle->log is required for signal handlers and - * ngx_process_options() - */ - - ngx_memzero(&init_cycle, sizeof(ngx_cycle_t)); - init_cycle.log = log; - ngx_cycle = &init_cycle; - - init_cycle.pool = ngx_create_pool(1024, log); - if (init_cycle.pool == NULL) { - return 1; - } - - if (ngx_save_argv(&init_cycle, argc, argv) != NGX_OK) { - return 1; - } - - if (ngx_process_options(&init_cycle) != NGX_OK) { - return 1; - } - - if (ngx_os_init(log) != NGX_OK) { - return 1; - } - - /* - * ngx_crc32_table_init() requires ngx_cacheline_size set in ngx_os_init() - */ - - if (ngx_crc32_table_init() != NGX_OK) { - return 1; - } - - /* - * ngx_slab_sizes_init() requires ngx_pagesize set in ngx_os_init() - */ - - ngx_slab_sizes_init(); - - if (ngx_add_inherited_sockets(&init_cycle) != NGX_OK) { - return 1; - } - - if (ngx_preinit_modules() != NGX_OK) { - return 1; - } - - cycle = ngx_init_cycle(&init_cycle); - if (cycle == NULL) { - if (ngx_test_config) { - ngx_log_stderr(0, "configuration file %s test failed", - init_cycle.conf_file.data); - } - - return 1; - } - - if (ngx_test_config) { - if (!ngx_quiet_mode) { - ngx_log_stderr(0, "configuration file %s test is successful", - cycle->conf_file.data); - } - - if (ngx_dump_config) { - cd = cycle->config_dump.elts; - - for (i = 0; i < cycle->config_dump.nelts; i++) { - - ngx_write_stdout("# configuration file "); - (void) ngx_write_fd(ngx_stdout, cd[i].name.data, - cd[i].name.len); - ngx_write_stdout(":" NGX_LINEFEED); - - b = cd[i].buffer; - - (void) ngx_write_fd(ngx_stdout, b->pos, b->last - b->pos); - ngx_write_stdout(NGX_LINEFEED); - } - } - - return 0; - } - - if (ngx_signal) { - return ngx_signal_process(cycle, ngx_signal); - } - - ngx_os_status(cycle->log); - - ngx_cycle = cycle; - - ccf = (ngx_core_conf_t *) ngx_get_conf(cycle->conf_ctx, ngx_core_module); - - if (ccf->master && ngx_process == NGX_PROCESS_SINGLE) { - ngx_process = NGX_PROCESS_MASTER; - } - -#if !(NGX_WIN32) - - if (ngx_init_signals(cycle->log) != NGX_OK) { - return 1; - } - - if (!ngx_inherited && ccf->daemon) { - if (ngx_daemon(cycle->log) != NGX_OK) { - return 1; - } - - ngx_daemonized = 1; - } - - if (ngx_inherited) { - ngx_daemonized = 1; - } - -#endif - - if (ngx_create_pidfile(&ccf->pid, cycle->log) != NGX_OK) { - return 1; - } - - if (ngx_log_redirect_stderr(cycle) != NGX_OK) { - return 1; - } - - if (log->file->fd != ngx_stderr) { - if (ngx_close_file(log->file->fd) == NGX_FILE_ERROR) { - ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno, - ngx_close_file_n " built-in log failed"); - } - } - - ngx_use_stderr = 0; - - if (ngx_process == NGX_PROCESS_SINGLE) { - ngx_single_process_cycle(cycle); - - } else { - ngx_master_process_cycle(cycle); - } - - return 0; -} - - -static void -ngx_show_version_info(void) -{ - ngx_write_stderr("nginx version: " NGINX_VER_BUILD NGX_LINEFEED); - - if (ngx_show_help) { - ngx_write_stderr( - "Usage: nginx [-?hvVtTq] [-s signal] [-p prefix]" NGX_LINEFEED - " [-e filename] [-c filename] [-g directives]" - NGX_LINEFEED NGX_LINEFEED - "Options:" NGX_LINEFEED - " -?,-h : this help" NGX_LINEFEED - " -v : show version and exit" NGX_LINEFEED - " -V : show version and configure options then exit" - NGX_LINEFEED - " -t : test configuration and exit" NGX_LINEFEED - " -T : test configuration, dump it and exit" - NGX_LINEFEED - " -q : suppress non-error messages " - "during configuration testing" NGX_LINEFEED - " -s signal : send signal to a master process: " - "stop, quit, reopen, reload" NGX_LINEFEED -#ifdef NGX_PREFIX - " -p prefix : set prefix path (default: " NGX_PREFIX ")" - NGX_LINEFEED -#else - " -p prefix : set prefix path (default: NONE)" NGX_LINEFEED -#endif - " -e filename : set error log file (default: " -#ifdef NGX_ERROR_LOG_STDERR - "stderr)" NGX_LINEFEED -#else - NGX_ERROR_LOG_PATH ")" NGX_LINEFEED -#endif - " -c filename : set configuration file (default: " NGX_CONF_PATH - ")" NGX_LINEFEED - " -g directives : set global directives out of configuration " - "file" NGX_LINEFEED NGX_LINEFEED - ); - } - - if (ngx_show_configure) { - -#ifdef NGX_COMPILER - ngx_write_stderr("built by " NGX_COMPILER NGX_LINEFEED); -#endif - -#if (NGX_SSL) - if (ngx_strcmp(ngx_ssl_version(), OPENSSL_VERSION_TEXT) == 0) { - ngx_write_stderr("built with " OPENSSL_VERSION_TEXT NGX_LINEFEED); - } else { - ngx_write_stderr("built with " OPENSSL_VERSION_TEXT - " (running with "); - ngx_write_stderr((char *) (uintptr_t) ngx_ssl_version()); - ngx_write_stderr(")" NGX_LINEFEED); - } -#ifdef SSL_CTRL_SET_TLSEXT_HOSTNAME - ngx_write_stderr("TLS SNI support enabled" NGX_LINEFEED); -#else - ngx_write_stderr("TLS SNI support disabled" NGX_LINEFEED); -#endif -#endif - - ngx_write_stderr("configure arguments:" NGX_CONFIGURE NGX_LINEFEED); - } -} - - -static ngx_int_t -ngx_add_inherited_sockets(ngx_cycle_t *cycle) -{ - u_char *p, *v, *inherited; - ngx_int_t s; - ngx_listening_t *ls; - - inherited = (u_char *) getenv(NGINX_VAR); - - if (inherited == NULL) { - return NGX_OK; - } - - ngx_log_error(NGX_LOG_NOTICE, cycle->log, 0, - "using inherited sockets from \"%s\"", inherited); - - if (ngx_array_init(&cycle->listening, cycle->pool, 10, - sizeof(ngx_listening_t)) - != NGX_OK) - { - return NGX_ERROR; - } - - for (p = inherited, v = p; *p; p++) { - if (*p == ':' || *p == ';') { - s = ngx_atoi(v, p - v); - if (s == NGX_ERROR) { - ngx_log_error(NGX_LOG_EMERG, cycle->log, 0, - "invalid socket number \"%s\" in " NGINX_VAR - " environment variable, ignoring the rest" - " of the variable", v); - break; - } - - v = p + 1; - - ls = ngx_array_push(&cycle->listening); - if (ls == NULL) { - return NGX_ERROR; - } - - ngx_memzero(ls, sizeof(ngx_listening_t)); - - ls->fd = (ngx_socket_t) s; - ls->inherited = 1; - } - } - - if (v != p) { - ngx_log_error(NGX_LOG_EMERG, cycle->log, 0, - "invalid socket number \"%s\" in " NGINX_VAR - " environment variable, ignoring", v); - } - - ngx_inherited = 1; - - return ngx_set_inherited_sockets(cycle); -} - - -char ** -ngx_set_environment(ngx_cycle_t *cycle, ngx_uint_t *last) -{ - char **p, **env, *str; - size_t len; - ngx_str_t *var; - ngx_uint_t i, n; - ngx_core_conf_t *ccf; - ngx_pool_cleanup_t *cln; - - ccf = (ngx_core_conf_t *) ngx_get_conf(cycle->conf_ctx, ngx_core_module); - - if (last == NULL && ccf->environment) { - return ccf->environment; - } - - var = ccf->env.elts; - - for (i = 0; i < ccf->env.nelts; i++) { - if (ngx_strcmp(var[i].data, "TZ") == 0 - || ngx_strncmp(var[i].data, "TZ=", 3) == 0) - { - goto tz_found; - } - } - - var = ngx_array_push(&ccf->env); - if (var == NULL) { - return NULL; - } - - var->len = 2; - var->data = (u_char *) "TZ"; - - var = ccf->env.elts; - -tz_found: - - n = 0; - - for (i = 0; i < ccf->env.nelts; i++) { - - if (var[i].data[var[i].len] == '=') { - n++; - continue; - } - - for (p = ngx_os_environ; *p; p++) { - - if (ngx_strncmp(*p, var[i].data, var[i].len) == 0 - && (*p)[var[i].len] == '=') - { - n++; - break; - } - } - } - - if (last) { - env = ngx_alloc((*last + n + 1) * sizeof(char *), cycle->log); - if (env == NULL) { - return NULL; - } - - *last = n; - - } else { - cln = ngx_pool_cleanup_add(cycle->pool, 0); - if (cln == NULL) { - return NULL; - } - - env = ngx_alloc((n + 1) * sizeof(char *), cycle->log); - if (env == NULL) { - return NULL; - } - - cln->handler = ngx_cleanup_environment; - cln->data = env; - } - - n = 0; - - for (i = 0; i < ccf->env.nelts; i++) { - - if (var[i].data[var[i].len] == '=') { - - if (last) { - env[n++] = (char *) var[i].data; - continue; - } - - cln = ngx_pool_cleanup_add(cycle->pool, 0); - if (cln == NULL) { - return NULL; - } - - len = ngx_strlen(var[i].data) + 1; - - str = ngx_alloc(len, cycle->log); - if (str == NULL) { - return NULL; - } - - ngx_memcpy(str, var[i].data, len); - - cln->handler = ngx_cleanup_environment_variable; - cln->data = str; - - env[n++] = str; - - continue; - } - - for (p = ngx_os_environ; *p; p++) { - - if (ngx_strncmp(*p, var[i].data, var[i].len) == 0 - && (*p)[var[i].len] == '=') - { - env[n++] = *p; - break; - } - } - } - - env[n] = NULL; - - if (last == NULL) { - ccf->environment = env; - environ = env; - } - - return env; -} - - -static void -ngx_cleanup_environment(void *data) -{ - char **env = data; - - if (environ == env) { - - /* - * if the environment is still used, as it happens on exit, - * the only option is to leak it - */ - - return; - } - - ngx_free(env); -} - - -static void -ngx_cleanup_environment_variable(void *data) -{ - char *var = data; - - char **p; - - for (p = environ; *p; p++) { - - /* - * if an environment variable is still used, as it happens on exit, - * the only option is to leak it - */ - - if (*p == var) { - return; - } - } - - ngx_free(var); -} - - -ngx_pid_t -ngx_exec_new_binary(ngx_cycle_t *cycle, char *const *argv) -{ - char **env, *var; - u_char *p; - ngx_uint_t i, n; - ngx_pid_t pid; - ngx_exec_ctx_t ctx; - ngx_core_conf_t *ccf; - ngx_listening_t *ls; - - ngx_memzero(&ctx, sizeof(ngx_exec_ctx_t)); - - ctx.path = argv[0]; - ctx.name = "new binary process"; - ctx.argv = argv; - - n = 2; - env = ngx_set_environment(cycle, &n); - if (env == NULL) { - return NGX_INVALID_PID; - } - - var = ngx_alloc(sizeof(NGINX_VAR) - + cycle->listening.nelts * (NGX_INT32_LEN + 1) + 2, - cycle->log); - if (var == NULL) { - ngx_free(env); - return NGX_INVALID_PID; - } - - p = ngx_cpymem(var, NGINX_VAR "=", sizeof(NGINX_VAR)); - - ls = cycle->listening.elts; - for (i = 0; i < cycle->listening.nelts; i++) { - if (ls[i].ignore) { - continue; - } - p = ngx_sprintf(p, "%ud;", ls[i].fd); - } - - *p = '\0'; - - env[n++] = var; - -#if (NGX_SETPROCTITLE_USES_ENV) - - /* allocate the spare 300 bytes for the new binary process title */ - - env[n++] = "SPARE=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" - "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" - "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" - "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" - "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"; - -#endif - - env[n] = NULL; - -#if (NGX_DEBUG) - { - char **e; - for (e = env; *e; e++) { - ngx_log_debug1(NGX_LOG_DEBUG_CORE, cycle->log, 0, "env: %s", *e); - } - } -#endif - - ctx.envp = (char *const *) env; - - ccf = (ngx_core_conf_t *) ngx_get_conf(cycle->conf_ctx, ngx_core_module); - - if (ngx_rename_file(ccf->pid.data, ccf->oldpid.data) == NGX_FILE_ERROR) { - ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno, - ngx_rename_file_n " %s to %s failed " - "before executing new binary process \"%s\"", - ccf->pid.data, ccf->oldpid.data, argv[0]); - - ngx_free(env); - ngx_free(var); - - return NGX_INVALID_PID; - } - - pid = ngx_execute(cycle, &ctx); - - if (pid == NGX_INVALID_PID) { - if (ngx_rename_file(ccf->oldpid.data, ccf->pid.data) - == NGX_FILE_ERROR) - { - ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno, - ngx_rename_file_n " %s back to %s failed after " - "an attempt to execute new binary process \"%s\"", - ccf->oldpid.data, ccf->pid.data, argv[0]); - } - } - - ngx_free(env); - ngx_free(var); - - return pid; -} - - -static ngx_int_t -ngx_get_options(int argc, char *const *argv) -{ - u_char *p; - ngx_int_t i; - - for (i = 1; i < argc; i++) { - - p = (u_char *) argv[i]; - - if (*p++ != '-') { - ngx_log_stderr(0, "invalid option: \"%s\"", argv[i]); - return NGX_ERROR; - } - - while (*p) { - - switch (*p++) { - - case '?': - case 'h': - ngx_show_version = 1; - ngx_show_help = 1; - break; - - case 'v': - ngx_show_version = 1; - break; - - case 'V': - ngx_show_version = 1; - ngx_show_configure = 1; - break; - - case 't': - ngx_test_config = 1; - break; - - case 'T': - ngx_test_config = 1; - ngx_dump_config = 1; - break; - - case 'q': - ngx_quiet_mode = 1; - break; - - case 'p': - if (*p) { - ngx_prefix = p; - goto next; - } - - if (argv[++i]) { - ngx_prefix = (u_char *) argv[i]; - goto next; - } - - ngx_log_stderr(0, "option \"-p\" requires directory name"); - return NGX_ERROR; - - case 'e': - if (*p) { - ngx_error_log = p; - - } else if (argv[++i]) { - ngx_error_log = (u_char *) argv[i]; - - } else { - ngx_log_stderr(0, "option \"-e\" requires file name"); - return NGX_ERROR; - } - - if (ngx_strcmp(ngx_error_log, "stderr") == 0) { - ngx_error_log = (u_char *) ""; - } - - goto next; - - case 'c': - if (*p) { - ngx_conf_file = p; - goto next; - } - - if (argv[++i]) { - ngx_conf_file = (u_char *) argv[i]; - goto next; - } - - ngx_log_stderr(0, "option \"-c\" requires file name"); - return NGX_ERROR; - - case 'g': - if (*p) { - ngx_conf_params = p; - goto next; - } - - if (argv[++i]) { - ngx_conf_params = (u_char *) argv[i]; - goto next; - } - - ngx_log_stderr(0, "option \"-g\" requires parameter"); - return NGX_ERROR; - - case 's': - if (*p) { - ngx_signal = (char *) p; - - } else if (argv[++i]) { - ngx_signal = argv[i]; - - } else { - ngx_log_stderr(0, "option \"-s\" requires parameter"); - return NGX_ERROR; - } - - if (ngx_strcmp(ngx_signal, "stop") == 0 - || ngx_strcmp(ngx_signal, "quit") == 0 - || ngx_strcmp(ngx_signal, "reopen") == 0 - || ngx_strcmp(ngx_signal, "reload") == 0) - { - ngx_process = NGX_PROCESS_SIGNALLER; - goto next; - } - - ngx_log_stderr(0, "invalid option: \"-s %s\"", ngx_signal); - return NGX_ERROR; - - default: - ngx_log_stderr(0, "invalid option: \"%c\"", *(p - 1)); - return NGX_ERROR; - } - } - - next: - - continue; - } - - return NGX_OK; -} - - -static ngx_int_t -ngx_save_argv(ngx_cycle_t *cycle, int argc, char *const *argv) -{ -#if (NGX_FREEBSD) - - ngx_os_argv = (char **) argv; - ngx_argc = argc; - ngx_argv = (char **) argv; - -#else - size_t len; - ngx_int_t i; - - ngx_os_argv = (char **) argv; - ngx_argc = argc; - - ngx_argv = ngx_alloc((argc + 1) * sizeof(char *), cycle->log); - if (ngx_argv == NULL) { - return NGX_ERROR; - } - - for (i = 0; i < argc; i++) { - len = ngx_strlen(argv[i]) + 1; - - ngx_argv[i] = ngx_alloc(len, cycle->log); - if (ngx_argv[i] == NULL) { - return NGX_ERROR; - } - - (void) ngx_cpystrn((u_char *) ngx_argv[i], (u_char *) argv[i], len); - } - - ngx_argv[i] = NULL; - -#endif - - ngx_os_environ = environ; - - return NGX_OK; -} - - -static ngx_int_t -ngx_process_options(ngx_cycle_t *cycle) -{ - u_char *p; - size_t len; - - if (ngx_prefix) { - len = ngx_strlen(ngx_prefix); - p = ngx_prefix; - - if (len && !ngx_path_separator(p[len - 1])) { - p = ngx_pnalloc(cycle->pool, len + 1); - if (p == NULL) { - return NGX_ERROR; - } - - ngx_memcpy(p, ngx_prefix, len); - p[len++] = '/'; - } - - cycle->conf_prefix.len = len; - cycle->conf_prefix.data = p; - cycle->prefix.len = len; - cycle->prefix.data = p; - - } else { - -#ifndef NGX_PREFIX - - p = ngx_pnalloc(cycle->pool, NGX_MAX_PATH); - if (p == NULL) { - return NGX_ERROR; - } - - if (ngx_getcwd(p, NGX_MAX_PATH) == 0) { - ngx_log_stderr(ngx_errno, "[emerg]: " ngx_getcwd_n " failed"); - return NGX_ERROR; - } - - len = ngx_strlen(p); - - p[len++] = '/'; - - cycle->conf_prefix.len = len; - cycle->conf_prefix.data = p; - cycle->prefix.len = len; - cycle->prefix.data = p; - -#else - -#ifdef NGX_CONF_PREFIX - ngx_str_set(&cycle->conf_prefix, NGX_CONF_PREFIX); -#else - ngx_str_set(&cycle->conf_prefix, NGX_PREFIX); -#endif - ngx_str_set(&cycle->prefix, NGX_PREFIX); - -#endif - } - - if (ngx_conf_file) { - cycle->conf_file.len = ngx_strlen(ngx_conf_file); - cycle->conf_file.data = ngx_conf_file; - - } else { - ngx_str_set(&cycle->conf_file, NGX_CONF_PATH); - } - - if (ngx_conf_full_name(cycle, &cycle->conf_file, 0) != NGX_OK) { - return NGX_ERROR; - } - - for (p = cycle->conf_file.data + cycle->conf_file.len - 1; - p > cycle->conf_file.data; - p--) - { - if (ngx_path_separator(*p)) { - cycle->conf_prefix.len = p - cycle->conf_file.data + 1; - cycle->conf_prefix.data = cycle->conf_file.data; - break; - } - } - - if (ngx_error_log) { - cycle->error_log.len = ngx_strlen(ngx_error_log); - cycle->error_log.data = ngx_error_log; - - } else { - ngx_str_set(&cycle->error_log, NGX_ERROR_LOG_PATH); - } - - if (ngx_conf_params) { - cycle->conf_param.len = ngx_strlen(ngx_conf_params); - cycle->conf_param.data = ngx_conf_params; - } - - if (ngx_test_config) { - cycle->log->log_level = NGX_LOG_INFO; - } - - return NGX_OK; -} - - -static void * -ngx_core_module_create_conf(ngx_cycle_t *cycle) -{ - ngx_core_conf_t *ccf; - - ccf = ngx_pcalloc(cycle->pool, sizeof(ngx_core_conf_t)); - if (ccf == NULL) { - return NULL; - } - - /* - * set by ngx_pcalloc() - * - * ccf->pid = NULL; - * ccf->oldpid = NULL; - * ccf->priority = 0; - * ccf->cpu_affinity_auto = 0; - * ccf->cpu_affinity_n = 0; - * ccf->cpu_affinity = NULL; - */ - - ccf->daemon = NGX_CONF_UNSET; - ccf->master = NGX_CONF_UNSET; - ccf->timer_resolution = NGX_CONF_UNSET_MSEC; - ccf->shutdown_timeout = NGX_CONF_UNSET_MSEC; - - ccf->worker_processes = NGX_CONF_UNSET; - ccf->debug_points = NGX_CONF_UNSET; - - ccf->rlimit_nofile = NGX_CONF_UNSET; - ccf->rlimit_core = NGX_CONF_UNSET; - - ccf->user = (ngx_uid_t) NGX_CONF_UNSET_UINT; - ccf->group = (ngx_gid_t) NGX_CONF_UNSET_UINT; - - if (ngx_array_init(&ccf->env, cycle->pool, 1, sizeof(ngx_str_t)) - != NGX_OK) - { - return NULL; - } - - return ccf; -} - - -static char * -ngx_core_module_init_conf(ngx_cycle_t *cycle, void *conf) -{ - ngx_core_conf_t *ccf = conf; - - ngx_conf_init_value(ccf->daemon, 1); - ngx_conf_init_value(ccf->master, 1); - ngx_conf_init_msec_value(ccf->timer_resolution, 0); - ngx_conf_init_msec_value(ccf->shutdown_timeout, 0); - - ngx_conf_init_value(ccf->worker_processes, 1); - ngx_conf_init_value(ccf->debug_points, 0); - -#if (NGX_HAVE_CPU_AFFINITY) - - if (!ccf->cpu_affinity_auto - && ccf->cpu_affinity_n - && ccf->cpu_affinity_n != 1 - && ccf->cpu_affinity_n != (ngx_uint_t) ccf->worker_processes) - { - ngx_log_error(NGX_LOG_WARN, cycle->log, 0, - "the number of \"worker_processes\" is not equal to " - "the number of \"worker_cpu_affinity\" masks, " - "using last mask for remaining worker processes"); - } - -#endif - - - if (ccf->pid.len == 0) { - ngx_str_set(&ccf->pid, NGX_PID_PATH); - } - - if (ngx_conf_full_name(cycle, &ccf->pid, 0) != NGX_OK) { - return NGX_CONF_ERROR; - } - - ccf->oldpid.len = ccf->pid.len + sizeof(NGX_OLDPID_EXT); - - ccf->oldpid.data = ngx_pnalloc(cycle->pool, ccf->oldpid.len); - if (ccf->oldpid.data == NULL) { - return NGX_CONF_ERROR; - } - - ngx_memcpy(ngx_cpymem(ccf->oldpid.data, ccf->pid.data, ccf->pid.len), - NGX_OLDPID_EXT, sizeof(NGX_OLDPID_EXT)); - - -#if !(NGX_WIN32) - - if (ccf->user == (uid_t) NGX_CONF_UNSET_UINT && geteuid() == 0) { - struct group *grp; - struct passwd *pwd; - - ngx_set_errno(0); - pwd = getpwnam(NGX_USER); - if (pwd == NULL) { - ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno, - "getpwnam(\"" NGX_USER "\") failed"); - return NGX_CONF_ERROR; - } - - ccf->username = NGX_USER; - ccf->user = pwd->pw_uid; - - ngx_set_errno(0); - grp = getgrnam(NGX_GROUP); - if (grp == NULL) { - ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno, - "getgrnam(\"" NGX_GROUP "\") failed"); - return NGX_CONF_ERROR; - } - - ccf->group = grp->gr_gid; - } - - - if (ccf->lock_file.len == 0) { - ngx_str_set(&ccf->lock_file, NGX_LOCK_PATH); - } - - if (ngx_conf_full_name(cycle, &ccf->lock_file, 0) != NGX_OK) { - return NGX_CONF_ERROR; - } - - { - ngx_str_t lock_file; - - lock_file = cycle->old_cycle->lock_file; - - if (lock_file.len) { - lock_file.len--; - - if (ccf->lock_file.len != lock_file.len - || ngx_strncmp(ccf->lock_file.data, lock_file.data, lock_file.len) - != 0) - { - ngx_log_error(NGX_LOG_EMERG, cycle->log, 0, - "\"lock_file\" could not be changed, ignored"); - } - - cycle->lock_file.len = lock_file.len + 1; - lock_file.len += sizeof(".accept"); - - cycle->lock_file.data = ngx_pstrdup(cycle->pool, &lock_file); - if (cycle->lock_file.data == NULL) { - return NGX_CONF_ERROR; - } - - } else { - cycle->lock_file.len = ccf->lock_file.len + 1; - cycle->lock_file.data = ngx_pnalloc(cycle->pool, - ccf->lock_file.len + sizeof(".accept")); - if (cycle->lock_file.data == NULL) { - return NGX_CONF_ERROR; - } - - ngx_memcpy(ngx_cpymem(cycle->lock_file.data, ccf->lock_file.data, - ccf->lock_file.len), - ".accept", sizeof(".accept")); - } - } - -#endif - - return NGX_CONF_OK; -} - - -static char * -ngx_set_user(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) -{ -#if (NGX_WIN32) - - ngx_conf_log_error(NGX_LOG_WARN, cf, 0, - "\"user\" is not supported, ignored"); - - return NGX_CONF_OK; - -#else - - ngx_core_conf_t *ccf = conf; - - char *group; - struct passwd *pwd; - struct group *grp; - ngx_str_t *value; - - if (ccf->user != (uid_t) NGX_CONF_UNSET_UINT) { - return "is duplicate"; - } - - if (geteuid() != 0) { - ngx_conf_log_error(NGX_LOG_WARN, cf, 0, - "the \"user\" directive makes sense only " - "if the master process runs " - "with super-user privileges, ignored"); - return NGX_CONF_OK; - } - - value = cf->args->elts; - - ccf->username = (char *) value[1].data; - - ngx_set_errno(0); - pwd = getpwnam((const char *) value[1].data); - if (pwd == NULL) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, ngx_errno, - "getpwnam(\"%s\") failed", value[1].data); - return NGX_CONF_ERROR; - } - - ccf->user = pwd->pw_uid; - - group = (char *) ((cf->args->nelts == 2) ? value[1].data : value[2].data); - - ngx_set_errno(0); - grp = getgrnam(group); - if (grp == NULL) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, ngx_errno, - "getgrnam(\"%s\") failed", group); - return NGX_CONF_ERROR; - } - - ccf->group = grp->gr_gid; - - return NGX_CONF_OK; - -#endif -} - - -static char * -ngx_set_env(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) -{ - ngx_core_conf_t *ccf = conf; - - ngx_str_t *value, *var; - ngx_uint_t i; - - var = ngx_array_push(&ccf->env); - if (var == NULL) { - return NGX_CONF_ERROR; - } - - value = cf->args->elts; - *var = value[1]; - - for (i = 0; i < value[1].len; i++) { - - if (value[1].data[i] == '=') { - - var->len = i; - - return NGX_CONF_OK; - } - } - - return NGX_CONF_OK; -} - - -static char * -ngx_set_priority(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) -{ - ngx_core_conf_t *ccf = conf; - - ngx_str_t *value; - ngx_uint_t n, minus; - - if (ccf->priority != 0) { - return "is duplicate"; - } - - value = cf->args->elts; - - if (value[1].data[0] == '-') { - n = 1; - minus = 1; - - } else if (value[1].data[0] == '+') { - n = 1; - minus = 0; - - } else { - n = 0; - minus = 0; - } - - ccf->priority = ngx_atoi(&value[1].data[n], value[1].len - n); - if (ccf->priority == NGX_ERROR) { - return "invalid number"; - } - - if (minus) { - ccf->priority = -ccf->priority; - } - - return NGX_CONF_OK; -} - - -static char * -ngx_set_cpu_affinity(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) -{ -#if (NGX_HAVE_CPU_AFFINITY) - ngx_core_conf_t *ccf = conf; - - u_char ch, *p; - ngx_str_t *value; - ngx_uint_t i, n; - ngx_cpuset_t *mask; - - if (ccf->cpu_affinity) { - return "is duplicate"; - } - - mask = ngx_palloc(cf->pool, (cf->args->nelts - 1) * sizeof(ngx_cpuset_t)); - if (mask == NULL) { - return NGX_CONF_ERROR; - } - - ccf->cpu_affinity_n = cf->args->nelts - 1; - ccf->cpu_affinity = mask; - - value = cf->args->elts; - - if (ngx_strcmp(value[1].data, "auto") == 0) { - - if (cf->args->nelts > 3) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "invalid number of arguments in " - "\"worker_cpu_affinity\" directive"); - return NGX_CONF_ERROR; - } - - ccf->cpu_affinity_auto = 1; - - CPU_ZERO(&mask[0]); - for (i = 0; i < (ngx_uint_t) ngx_min(ngx_ncpu, CPU_SETSIZE); i++) { - CPU_SET(i, &mask[0]); - } - - n = 2; - - } else { - n = 1; - } - - for ( /* void */ ; n < cf->args->nelts; n++) { - - if (value[n].len > CPU_SETSIZE) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "\"worker_cpu_affinity\" supports up to %d CPUs only", - CPU_SETSIZE); - return NGX_CONF_ERROR; - } - - i = 0; - CPU_ZERO(&mask[n - 1]); - - for (p = value[n].data + value[n].len - 1; - p >= value[n].data; - p--) - { - ch = *p; - - if (ch == ' ') { - continue; - } - - i++; - - if (ch == '0') { - continue; - } - - if (ch == '1') { - CPU_SET(i - 1, &mask[n - 1]); - continue; - } - - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "invalid character \"%c\" in \"worker_cpu_affinity\"", - ch); - return NGX_CONF_ERROR; - } - } - -#else - - ngx_conf_log_error(NGX_LOG_WARN, cf, 0, - "\"worker_cpu_affinity\" is not supported " - "on this platform, ignored"); -#endif - - return NGX_CONF_OK; -} - - -ngx_cpuset_t * -ngx_get_cpu_affinity(ngx_uint_t n) -{ -#if (NGX_HAVE_CPU_AFFINITY) - ngx_uint_t i, j; - ngx_cpuset_t *mask; - ngx_core_conf_t *ccf; - - static ngx_cpuset_t result; - - ccf = (ngx_core_conf_t *) ngx_get_conf(ngx_cycle->conf_ctx, - ngx_core_module); - - if (ccf->cpu_affinity == NULL) { - return NULL; - } - - if (ccf->cpu_affinity_auto) { - mask = &ccf->cpu_affinity[ccf->cpu_affinity_n - 1]; - - for (i = 0, j = n; /* void */ ; i++) { - - if (CPU_ISSET(i % CPU_SETSIZE, mask) && j-- == 0) { - break; - } - - if (i == CPU_SETSIZE && j == n) { - /* empty mask */ - return NULL; - } - - /* void */ - } - - CPU_ZERO(&result); - CPU_SET(i % CPU_SETSIZE, &result); - - return &result; - } - - if (ccf->cpu_affinity_n > n) { - return &ccf->cpu_affinity[n]; - } - - return &ccf->cpu_affinity[ccf->cpu_affinity_n - 1]; - -#else - - return NULL; - -#endif -} - - -static char * -ngx_set_worker_processes(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) -{ - ngx_str_t *value; - ngx_core_conf_t *ccf; - - ccf = (ngx_core_conf_t *) conf; - - if (ccf->worker_processes != NGX_CONF_UNSET) { - return "is duplicate"; - } - - value = cf->args->elts; - - if (ngx_strcmp(value[1].data, "auto") == 0) { - ccf->worker_processes = ngx_ncpu; - return NGX_CONF_OK; - } - - ccf->worker_processes = ngx_atoi(value[1].data, value[1].len); - - if (ccf->worker_processes == NGX_ERROR) { - return "invalid value"; - } - - return NGX_CONF_OK; -} - - -static char * -ngx_load_module(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) -{ -#if (NGX_HAVE_DLOPEN) - void *handle; - char **names, **order; - ngx_str_t *value, file; - ngx_uint_t i; - ngx_module_t *module, **modules; - ngx_pool_cleanup_t *cln; - - if (cf->cycle->modules_used) { - return "is specified too late"; - } - - value = cf->args->elts; - - file = value[1]; - - if (ngx_conf_full_name(cf->cycle, &file, 0) != NGX_OK) { - return NGX_CONF_ERROR; - } - - cln = ngx_pool_cleanup_add(cf->cycle->pool, 0); - if (cln == NULL) { - return NGX_CONF_ERROR; - } - - handle = ngx_dlopen(file.data); - if (handle == NULL) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - ngx_dlopen_n " \"%s\" failed (%s)", - file.data, ngx_dlerror()); - return NGX_CONF_ERROR; - } - - cln->handler = ngx_unload_module; - cln->data = handle; - - modules = ngx_dlsym(handle, "ngx_modules"); - if (modules == NULL) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - ngx_dlsym_n " \"%V\", \"%s\" failed (%s)", - &value[1], "ngx_modules", ngx_dlerror()); - return NGX_CONF_ERROR; - } - - names = ngx_dlsym(handle, "ngx_module_names"); - if (names == NULL) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - ngx_dlsym_n " \"%V\", \"%s\" failed (%s)", - &value[1], "ngx_module_names", ngx_dlerror()); - return NGX_CONF_ERROR; - } - - order = ngx_dlsym(handle, "ngx_module_order"); - - for (i = 0; modules[i]; i++) { - module = modules[i]; - module->name = names[i]; - - if (ngx_add_module(cf, &file, module, order) != NGX_OK) { - return NGX_CONF_ERROR; - } - - ngx_log_debug2(NGX_LOG_DEBUG_CORE, cf->log, 0, "module: %s i:%ui", - module->name, module->index); - } - - return NGX_CONF_OK; - -#else - - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "\"load_module\" is not supported " - "on this platform"); - return NGX_CONF_ERROR; - -#endif -} - - -#if (NGX_HAVE_DLOPEN) - -static void -ngx_unload_module(void *data) -{ - void *handle = data; - - if (ngx_dlclose(handle) != 0) { - ngx_log_error(NGX_LOG_ALERT, ngx_cycle->log, 0, - ngx_dlclose_n " failed (%s)", ngx_dlerror()); - } -} - -#endif diff --git a/src/deps/src/nginx-1.30.3/src/core/nginx.h b/src/deps/src/nginx-1.30.3/src/core/nginx.h deleted file mode 100644 index 00c38bc558..0000000000 --- a/src/deps/src/nginx-1.30.3/src/core/nginx.h +++ /dev/null @@ -1,26 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#ifndef _NGINX_H_INCLUDED_ -#define _NGINX_H_INCLUDED_ - - -#define nginx_version 1030003 -#define NGINX_VERSION "1.30.3" -#define NGINX_VER "nginx/" NGINX_VERSION - -#ifdef NGX_BUILD -#define NGINX_VER_BUILD NGINX_VER " (" NGX_BUILD ")" -#else -#define NGINX_VER_BUILD NGINX_VER -#endif - -#define NGINX_VAR "NGINX" -#define NGX_OLDPID_EXT ".oldbin" - - -#endif /* _NGINX_H_INCLUDED_ */ diff --git a/src/deps/src/nginx-1.30.3/src/core/ngx_array.c b/src/deps/src/nginx-1.30.3/src/core/ngx_array.c deleted file mode 100644 index 4ea226f068..0000000000 --- a/src/deps/src/nginx-1.30.3/src/core/ngx_array.c +++ /dev/null @@ -1,141 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#include -#include - - -ngx_array_t * -ngx_array_create(ngx_pool_t *p, ngx_uint_t n, size_t size) -{ - ngx_array_t *a; - - a = ngx_palloc(p, sizeof(ngx_array_t)); - if (a == NULL) { - return NULL; - } - - if (ngx_array_init(a, p, n, size) != NGX_OK) { - return NULL; - } - - return a; -} - - -void -ngx_array_destroy(ngx_array_t *a) -{ - ngx_pool_t *p; - - p = a->pool; - - if ((u_char *) a->elts + a->size * a->nalloc == p->d.last) { - p->d.last -= a->size * a->nalloc; - } - - if ((u_char *) a + sizeof(ngx_array_t) == p->d.last) { - p->d.last = (u_char *) a; - } -} - - -void * -ngx_array_push(ngx_array_t *a) -{ - void *elt, *new; - size_t size; - ngx_pool_t *p; - - if (a->nelts == a->nalloc) { - - /* the array is full */ - - size = a->size * a->nalloc; - - p = a->pool; - - if ((u_char *) a->elts + size == p->d.last - && p->d.last + a->size <= p->d.end) - { - /* - * the array allocation is the last in the pool - * and there is space for new allocation - */ - - p->d.last += a->size; - a->nalloc++; - - } else { - /* allocate a new array */ - - new = ngx_palloc(p, 2 * size); - if (new == NULL) { - return NULL; - } - - ngx_memcpy(new, a->elts, size); - a->elts = new; - a->nalloc *= 2; - } - } - - elt = (u_char *) a->elts + a->size * a->nelts; - a->nelts++; - - return elt; -} - - -void * -ngx_array_push_n(ngx_array_t *a, ngx_uint_t n) -{ - void *elt, *new; - size_t size; - ngx_uint_t nalloc; - ngx_pool_t *p; - - size = n * a->size; - - if (a->nelts + n > a->nalloc) { - - /* the array is full */ - - p = a->pool; - - if ((u_char *) a->elts + a->size * a->nalloc == p->d.last - && p->d.last + size <= p->d.end) - { - /* - * the array allocation is the last in the pool - * and there is space for new allocation - */ - - p->d.last += size; - a->nalloc += n; - - } else { - /* allocate a new array */ - - nalloc = 2 * ((n >= a->nalloc) ? n : a->nalloc); - - new = ngx_palloc(p, nalloc * a->size); - if (new == NULL) { - return NULL; - } - - ngx_memcpy(new, a->elts, a->nelts * a->size); - a->elts = new; - a->nalloc = nalloc; - } - } - - elt = (u_char *) a->elts + a->size * a->nelts; - a->nelts += n; - - return elt; -} diff --git a/src/deps/src/nginx-1.30.3/src/core/ngx_array.h b/src/deps/src/nginx-1.30.3/src/core/ngx_array.h deleted file mode 100644 index a0f2a74402..0000000000 --- a/src/deps/src/nginx-1.30.3/src/core/ngx_array.h +++ /dev/null @@ -1,53 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#ifndef _NGX_ARRAY_H_INCLUDED_ -#define _NGX_ARRAY_H_INCLUDED_ - - -#include -#include - - -typedef struct { - void *elts; - ngx_uint_t nelts; - size_t size; - ngx_uint_t nalloc; - ngx_pool_t *pool; -} ngx_array_t; - - -ngx_array_t *ngx_array_create(ngx_pool_t *p, ngx_uint_t n, size_t size); -void ngx_array_destroy(ngx_array_t *a); -void *ngx_array_push(ngx_array_t *a); -void *ngx_array_push_n(ngx_array_t *a, ngx_uint_t n); - - -static ngx_inline ngx_int_t -ngx_array_init(ngx_array_t *array, ngx_pool_t *pool, ngx_uint_t n, size_t size) -{ - /* - * set "array->nelts" before "array->elts", otherwise MSVC thinks - * that "array->nelts" may be used without having been initialized - */ - - array->nelts = 0; - array->size = size; - array->nalloc = n; - array->pool = pool; - - array->elts = ngx_palloc(pool, n * size); - if (array->elts == NULL) { - return NGX_ERROR; - } - - return NGX_OK; -} - - -#endif /* _NGX_ARRAY_H_INCLUDED_ */ diff --git a/src/deps/src/nginx-1.30.3/src/core/ngx_bpf.c b/src/deps/src/nginx-1.30.3/src/core/ngx_bpf.c deleted file mode 100644 index 363a02c7dd..0000000000 --- a/src/deps/src/nginx-1.30.3/src/core/ngx_bpf.c +++ /dev/null @@ -1,143 +0,0 @@ - -/* - * Copyright (C) Nginx, Inc. - */ - - -#include -#include - -#define NGX_BPF_LOGBUF_SIZE (16 * 1024) - - -static ngx_inline int -ngx_bpf(enum bpf_cmd cmd, union bpf_attr *attr, unsigned int size) -{ - return syscall(__NR_bpf, cmd, attr, size); -} - - -void -ngx_bpf_program_link(ngx_bpf_program_t *program, const char *symbol, int fd) -{ - ngx_uint_t i; - ngx_bpf_reloc_t *rl; - - rl = program->relocs; - - for (i = 0; i < program->nrelocs; i++) { - if (ngx_strcmp(rl[i].name, symbol) == 0) { - program->ins[rl[i].offset].src_reg = 1; - program->ins[rl[i].offset].imm = fd; - } - } -} - - -int -ngx_bpf_load_program(ngx_log_t *log, ngx_bpf_program_t *program) -{ - int fd; - union bpf_attr attr; -#if (NGX_DEBUG) - char buf[NGX_BPF_LOGBUF_SIZE]; -#endif - - ngx_memzero(&attr, sizeof(union bpf_attr)); - - attr.license = (uintptr_t) program->license; - attr.prog_type = program->type; - attr.insns = (uintptr_t) program->ins; - attr.insn_cnt = program->nins; - -#if (NGX_DEBUG) - /* for verifier errors */ - attr.log_buf = (uintptr_t) buf; - attr.log_size = NGX_BPF_LOGBUF_SIZE; - attr.log_level = 1; -#endif - - fd = ngx_bpf(BPF_PROG_LOAD, &attr, sizeof(attr)); - if (fd < 0) { - ngx_log_error(NGX_LOG_ALERT, log, ngx_errno, - "failed to load BPF program"); - - ngx_log_debug1(NGX_LOG_DEBUG_CORE, log, 0, - "bpf verifier: %s", buf); - - return -1; - } - - return fd; -} - - -int -ngx_bpf_map_create(ngx_log_t *log, enum bpf_map_type type, int key_size, - int value_size, int max_entries, uint32_t map_flags) -{ - int fd; - union bpf_attr attr; - - ngx_memzero(&attr, sizeof(union bpf_attr)); - - attr.map_type = type; - attr.key_size = key_size; - attr.value_size = value_size; - attr.max_entries = max_entries; - attr.map_flags = map_flags; - - fd = ngx_bpf(BPF_MAP_CREATE, &attr, sizeof(attr)); - if (fd < 0) { - ngx_log_error(NGX_LOG_ALERT, log, ngx_errno, - "failed to create BPF map"); - return NGX_ERROR; - } - - return fd; -} - - -int -ngx_bpf_map_update(int fd, const void *key, const void *value, uint64_t flags) -{ - union bpf_attr attr; - - ngx_memzero(&attr, sizeof(union bpf_attr)); - - attr.map_fd = fd; - attr.key = (uintptr_t) key; - attr.value = (uintptr_t) value; - attr.flags = flags; - - return ngx_bpf(BPF_MAP_UPDATE_ELEM, &attr, sizeof(attr)); -} - - -int -ngx_bpf_map_delete(int fd, const void *key) -{ - union bpf_attr attr; - - ngx_memzero(&attr, sizeof(union bpf_attr)); - - attr.map_fd = fd; - attr.key = (uintptr_t) key; - - return ngx_bpf(BPF_MAP_DELETE_ELEM, &attr, sizeof(attr)); -} - - -int -ngx_bpf_map_lookup(int fd, const void *key, void *value) -{ - union bpf_attr attr; - - ngx_memzero(&attr, sizeof(union bpf_attr)); - - attr.map_fd = fd; - attr.key = (uintptr_t) key; - attr.value = (uintptr_t) value; - - return ngx_bpf(BPF_MAP_LOOKUP_ELEM, &attr, sizeof(attr)); -} diff --git a/src/deps/src/nginx-1.30.3/src/core/ngx_bpf.h b/src/deps/src/nginx-1.30.3/src/core/ngx_bpf.h deleted file mode 100644 index f62a36e11b..0000000000 --- a/src/deps/src/nginx-1.30.3/src/core/ngx_bpf.h +++ /dev/null @@ -1,43 +0,0 @@ - -/* - * Copyright (C) Nginx, Inc. - */ - - -#ifndef _NGX_BPF_H_INCLUDED_ -#define _NGX_BPF_H_INCLUDED_ - - -#include -#include - -#include - - -typedef struct { - char *name; - int offset; -} ngx_bpf_reloc_t; - -typedef struct { - char *license; - enum bpf_prog_type type; - struct bpf_insn *ins; - size_t nins; - ngx_bpf_reloc_t *relocs; - size_t nrelocs; -} ngx_bpf_program_t; - - -void ngx_bpf_program_link(ngx_bpf_program_t *program, const char *symbol, - int fd); -int ngx_bpf_load_program(ngx_log_t *log, ngx_bpf_program_t *program); - -int ngx_bpf_map_create(ngx_log_t *log, enum bpf_map_type type, int key_size, - int value_size, int max_entries, uint32_t map_flags); -int ngx_bpf_map_update(int fd, const void *key, const void *value, - uint64_t flags); -int ngx_bpf_map_delete(int fd, const void *key); -int ngx_bpf_map_lookup(int fd, const void *key, void *value); - -#endif /* _NGX_BPF_H_INCLUDED_ */ diff --git a/src/deps/src/nginx-1.30.3/src/core/ngx_buf.c b/src/deps/src/nginx-1.30.3/src/core/ngx_buf.c deleted file mode 100644 index 811f24d963..0000000000 --- a/src/deps/src/nginx-1.30.3/src/core/ngx_buf.c +++ /dev/null @@ -1,314 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#include -#include - - -ngx_buf_t * -ngx_create_temp_buf(ngx_pool_t *pool, size_t size) -{ - ngx_buf_t *b; - - b = ngx_calloc_buf(pool); - if (b == NULL) { - return NULL; - } - - b->start = ngx_palloc(pool, size); - if (b->start == NULL) { - return NULL; - } - - /* - * set by ngx_calloc_buf(): - * - * b->file_pos = 0; - * b->file_last = 0; - * b->file = NULL; - * b->shadow = NULL; - * b->tag = 0; - * and flags - */ - - b->pos = b->start; - b->last = b->start; - b->end = b->last + size; - b->temporary = 1; - - return b; -} - - -ngx_chain_t * -ngx_alloc_chain_link(ngx_pool_t *pool) -{ - ngx_chain_t *cl; - - cl = pool->chain; - - if (cl) { - pool->chain = cl->next; - return cl; - } - - cl = ngx_palloc(pool, sizeof(ngx_chain_t)); - if (cl == NULL) { - return NULL; - } - - return cl; -} - - -ngx_chain_t * -ngx_create_chain_of_bufs(ngx_pool_t *pool, ngx_bufs_t *bufs) -{ - u_char *p; - ngx_int_t i; - ngx_buf_t *b; - ngx_chain_t *chain, *cl, **ll; - - p = ngx_palloc(pool, bufs->num * bufs->size); - if (p == NULL) { - return NULL; - } - - ll = &chain; - - for (i = 0; i < bufs->num; i++) { - - b = ngx_calloc_buf(pool); - if (b == NULL) { - return NULL; - } - - /* - * set by ngx_calloc_buf(): - * - * b->file_pos = 0; - * b->file_last = 0; - * b->file = NULL; - * b->shadow = NULL; - * b->tag = 0; - * and flags - * - */ - - b->pos = p; - b->last = p; - b->temporary = 1; - - b->start = p; - p += bufs->size; - b->end = p; - - cl = ngx_alloc_chain_link(pool); - if (cl == NULL) { - return NULL; - } - - cl->buf = b; - *ll = cl; - ll = &cl->next; - } - - *ll = NULL; - - return chain; -} - - -ngx_int_t -ngx_chain_add_copy(ngx_pool_t *pool, ngx_chain_t **chain, ngx_chain_t *in) -{ - ngx_chain_t *cl, **ll; - - ll = chain; - - for (cl = *chain; cl; cl = cl->next) { - ll = &cl->next; - } - - while (in) { - cl = ngx_alloc_chain_link(pool); - if (cl == NULL) { - *ll = NULL; - return NGX_ERROR; - } - - cl->buf = in->buf; - *ll = cl; - ll = &cl->next; - in = in->next; - } - - *ll = NULL; - - return NGX_OK; -} - - -ngx_chain_t * -ngx_chain_get_free_buf(ngx_pool_t *p, ngx_chain_t **free) -{ - ngx_chain_t *cl; - - if (*free) { - cl = *free; - *free = cl->next; - cl->next = NULL; - return cl; - } - - cl = ngx_alloc_chain_link(p); - if (cl == NULL) { - return NULL; - } - - cl->buf = ngx_calloc_buf(p); - if (cl->buf == NULL) { - return NULL; - } - - cl->next = NULL; - - return cl; -} - - -void -ngx_chain_update_chains(ngx_pool_t *p, ngx_chain_t **free, ngx_chain_t **busy, - ngx_chain_t **out, ngx_buf_tag_t tag) -{ - ngx_chain_t *cl; - - if (*out) { - if (*busy == NULL) { - *busy = *out; - - } else { - for (cl = *busy; cl->next; cl = cl->next) { /* void */ } - - cl->next = *out; - } - - *out = NULL; - } - - while (*busy) { - cl = *busy; - - if (cl->buf->tag != tag) { - *busy = cl->next; - ngx_free_chain(p, cl); - continue; - } - - if (ngx_buf_size(cl->buf) != 0) { - break; - } - - cl->buf->pos = cl->buf->start; - cl->buf->last = cl->buf->start; - - *busy = cl->next; - cl->next = *free; - *free = cl; - } -} - - -off_t -ngx_chain_coalesce_file(ngx_chain_t **in, off_t limit) -{ - off_t total, size, aligned, fprev; - ngx_fd_t fd; - ngx_chain_t *cl; - - total = 0; - - cl = *in; - fd = cl->buf->file->fd; - - do { - size = cl->buf->file_last - cl->buf->file_pos; - - if (size > limit - total) { - size = limit - total; - - aligned = (cl->buf->file_pos + size + ngx_pagesize - 1) - & ~((off_t) ngx_pagesize - 1); - - if (aligned <= cl->buf->file_last) { - size = aligned - cl->buf->file_pos; - } - - total += size; - break; - } - - total += size; - fprev = cl->buf->file_pos + size; - cl = cl->next; - - } while (cl - && cl->buf->in_file - && total < limit - && fd == cl->buf->file->fd - && fprev == cl->buf->file_pos); - - *in = cl; - - return total; -} - - -ngx_chain_t * -ngx_chain_update_sent(ngx_chain_t *in, off_t sent) -{ - off_t size; - - for ( /* void */ ; in; in = in->next) { - - if (ngx_buf_special(in->buf)) { - continue; - } - - if (sent == 0) { - break; - } - - size = ngx_buf_size(in->buf); - - if (sent >= size) { - sent -= size; - - if (ngx_buf_in_memory(in->buf)) { - in->buf->pos = in->buf->last; - } - - if (in->buf->in_file) { - in->buf->file_pos = in->buf->file_last; - } - - continue; - } - - if (ngx_buf_in_memory(in->buf)) { - in->buf->pos += (size_t) sent; - } - - if (in->buf->in_file) { - in->buf->file_pos += sent; - } - - break; - } - - return in; -} diff --git a/src/deps/src/nginx-1.30.3/src/core/ngx_buf.h b/src/deps/src/nginx-1.30.3/src/core/ngx_buf.h deleted file mode 100644 index fdcd0cddf6..0000000000 --- a/src/deps/src/nginx-1.30.3/src/core/ngx_buf.h +++ /dev/null @@ -1,167 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#ifndef _NGX_BUF_H_INCLUDED_ -#define _NGX_BUF_H_INCLUDED_ - - -#include -#include - - -typedef void * ngx_buf_tag_t; - -typedef struct ngx_buf_s ngx_buf_t; - -struct ngx_buf_s { - u_char *pos; - u_char *last; - off_t file_pos; - off_t file_last; - - u_char *start; /* start of buffer */ - u_char *end; /* end of buffer */ - ngx_buf_tag_t tag; - ngx_file_t *file; - ngx_buf_t *shadow; - - - /* the buf's content could be changed */ - unsigned temporary:1; - - /* - * the buf's content is in a memory cache or in a read only memory - * and must not be changed - */ - unsigned memory:1; - - /* the buf's content is mmap()ed and must not be changed */ - unsigned mmap:1; - - unsigned recycled:1; - unsigned in_file:1; - unsigned flush:1; - unsigned sync:1; - unsigned last_buf:1; - unsigned last_in_chain:1; - - unsigned last_shadow:1; - unsigned temp_file:1; - - /* STUB */ int num; -}; - - -struct ngx_chain_s { - ngx_buf_t *buf; - ngx_chain_t *next; -}; - - -typedef struct { - ngx_int_t num; - size_t size; -} ngx_bufs_t; - - -typedef struct ngx_output_chain_ctx_s ngx_output_chain_ctx_t; - -typedef ngx_int_t (*ngx_output_chain_filter_pt)(void *ctx, ngx_chain_t *in); - -typedef void (*ngx_output_chain_aio_pt)(ngx_output_chain_ctx_t *ctx, - ngx_file_t *file); - -struct ngx_output_chain_ctx_s { - ngx_buf_t *buf; - ngx_chain_t *in; - ngx_chain_t *free; - ngx_chain_t *busy; - - unsigned sendfile:1; - unsigned directio:1; - unsigned unaligned:1; - unsigned need_in_memory:1; - unsigned need_in_temp:1; - unsigned aio:1; - -#if (NGX_HAVE_FILE_AIO || NGX_COMPAT) - ngx_output_chain_aio_pt aio_handler; -#endif - -#if (NGX_THREADS || NGX_COMPAT) - ngx_int_t (*thread_handler)(ngx_thread_task_t *task, - ngx_file_t *file); - ngx_thread_task_t *thread_task; -#endif - - off_t alignment; - - ngx_pool_t *pool; - ngx_int_t allocated; - ngx_bufs_t bufs; - ngx_buf_tag_t tag; - - ngx_output_chain_filter_pt output_filter; - void *filter_ctx; -}; - - -typedef struct { - ngx_chain_t *out; - ngx_chain_t **last; - ngx_connection_t *connection; - ngx_pool_t *pool; - off_t limit; -} ngx_chain_writer_ctx_t; - - -#define NGX_CHAIN_ERROR (ngx_chain_t *) NGX_ERROR - - -#define ngx_buf_in_memory(b) ((b)->temporary || (b)->memory || (b)->mmap) -#define ngx_buf_in_memory_only(b) (ngx_buf_in_memory(b) && !(b)->in_file) - -#define ngx_buf_special(b) \ - (((b)->flush || (b)->last_buf || (b)->sync) \ - && !ngx_buf_in_memory(b) && !(b)->in_file) - -#define ngx_buf_sync_only(b) \ - ((b)->sync && !ngx_buf_in_memory(b) \ - && !(b)->in_file && !(b)->flush && !(b)->last_buf) - -#define ngx_buf_size(b) \ - (ngx_buf_in_memory(b) ? (off_t) ((b)->last - (b)->pos): \ - ((b)->file_last - (b)->file_pos)) - -ngx_buf_t *ngx_create_temp_buf(ngx_pool_t *pool, size_t size); -ngx_chain_t *ngx_create_chain_of_bufs(ngx_pool_t *pool, ngx_bufs_t *bufs); - - -#define ngx_alloc_buf(pool) ngx_palloc(pool, sizeof(ngx_buf_t)) -#define ngx_calloc_buf(pool) ngx_pcalloc(pool, sizeof(ngx_buf_t)) - -ngx_chain_t *ngx_alloc_chain_link(ngx_pool_t *pool); -#define ngx_free_chain(pool, cl) \ - (cl)->next = (pool)->chain; \ - (pool)->chain = (cl) - - - -ngx_int_t ngx_output_chain(ngx_output_chain_ctx_t *ctx, ngx_chain_t *in); -ngx_int_t ngx_chain_writer(void *ctx, ngx_chain_t *in); - -ngx_int_t ngx_chain_add_copy(ngx_pool_t *pool, ngx_chain_t **chain, - ngx_chain_t *in); -ngx_chain_t *ngx_chain_get_free_buf(ngx_pool_t *p, ngx_chain_t **free); -void ngx_chain_update_chains(ngx_pool_t *p, ngx_chain_t **free, - ngx_chain_t **busy, ngx_chain_t **out, ngx_buf_tag_t tag); - -off_t ngx_chain_coalesce_file(ngx_chain_t **in, off_t limit); - -ngx_chain_t *ngx_chain_update_sent(ngx_chain_t *in, off_t sent); - -#endif /* _NGX_BUF_H_INCLUDED_ */ diff --git a/src/deps/src/nginx-1.30.3/src/core/ngx_conf_file.c b/src/deps/src/nginx-1.30.3/src/core/ngx_conf_file.c deleted file mode 100644 index 197704b0f9..0000000000 --- a/src/deps/src/nginx-1.30.3/src/core/ngx_conf_file.c +++ /dev/null @@ -1,1486 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#include -#include - -#define NGX_CONF_BUFFER 4096 - -static ngx_int_t ngx_conf_add_dump(ngx_conf_t *cf, ngx_str_t *filename); -static ngx_int_t ngx_conf_handler(ngx_conf_t *cf, ngx_int_t last); -static ngx_int_t ngx_conf_read_token(ngx_conf_t *cf); -static void ngx_conf_flush_files(ngx_cycle_t *cycle); - - -static ngx_command_t ngx_conf_commands[] = { - - { ngx_string("include"), - NGX_ANY_CONF|NGX_CONF_TAKE1, - ngx_conf_include, - 0, - 0, - NULL }, - - ngx_null_command -}; - - -ngx_module_t ngx_conf_module = { - NGX_MODULE_V1, - NULL, /* module context */ - ngx_conf_commands, /* module directives */ - NGX_CONF_MODULE, /* module type */ - NULL, /* init master */ - NULL, /* init module */ - NULL, /* init process */ - NULL, /* init thread */ - NULL, /* exit thread */ - ngx_conf_flush_files, /* exit process */ - NULL, /* exit master */ - NGX_MODULE_V1_PADDING -}; - - -/* The eight fixed arguments */ - -static ngx_uint_t argument_number[] = { - NGX_CONF_NOARGS, - NGX_CONF_TAKE1, - NGX_CONF_TAKE2, - NGX_CONF_TAKE3, - NGX_CONF_TAKE4, - NGX_CONF_TAKE5, - NGX_CONF_TAKE6, - NGX_CONF_TAKE7 -}; - - -char * -ngx_conf_param(ngx_conf_t *cf) -{ - char *rv; - ngx_str_t *param; - ngx_buf_t b; - ngx_conf_file_t conf_file; - - param = &cf->cycle->conf_param; - - if (param->len == 0) { - return NGX_CONF_OK; - } - - ngx_memzero(&conf_file, sizeof(ngx_conf_file_t)); - - ngx_memzero(&b, sizeof(ngx_buf_t)); - - b.start = param->data; - b.pos = param->data; - b.last = param->data + param->len; - b.end = b.last; - b.temporary = 1; - - conf_file.file.fd = NGX_INVALID_FILE; - conf_file.file.name.data = NULL; - conf_file.line = 0; - - cf->conf_file = &conf_file; - cf->conf_file->buffer = &b; - - rv = ngx_conf_parse(cf, NULL); - - cf->conf_file = NULL; - - return rv; -} - - -static ngx_int_t -ngx_conf_add_dump(ngx_conf_t *cf, ngx_str_t *filename) -{ - off_t size; - u_char *p; - uint32_t hash; - ngx_buf_t *buf; - ngx_str_node_t *sn; - ngx_conf_dump_t *cd; - - hash = ngx_crc32_long(filename->data, filename->len); - - sn = ngx_str_rbtree_lookup(&cf->cycle->config_dump_rbtree, filename, hash); - - if (sn) { - cf->conf_file->dump = NULL; - return NGX_OK; - } - - p = ngx_pstrdup(cf->cycle->pool, filename); - if (p == NULL) { - return NGX_ERROR; - } - - cd = ngx_array_push(&cf->cycle->config_dump); - if (cd == NULL) { - return NGX_ERROR; - } - - size = ngx_file_size(&cf->conf_file->file.info); - - buf = ngx_create_temp_buf(cf->cycle->pool, (size_t) size); - if (buf == NULL) { - return NGX_ERROR; - } - - cd->name.data = p; - cd->name.len = filename->len; - cd->buffer = buf; - - cf->conf_file->dump = buf; - - sn = ngx_palloc(cf->temp_pool, sizeof(ngx_str_node_t)); - if (sn == NULL) { - return NGX_ERROR; - } - - sn->node.key = hash; - sn->str = cd->name; - - ngx_rbtree_insert(&cf->cycle->config_dump_rbtree, &sn->node); - - return NGX_OK; -} - - -char * -ngx_conf_parse(ngx_conf_t *cf, ngx_str_t *filename) -{ - char *rv; - ngx_fd_t fd; - ngx_int_t rc; - ngx_buf_t buf; - ngx_conf_file_t *prev, conf_file; - enum { - parse_file = 0, - parse_block, - parse_param - } type; - -#if (NGX_SUPPRESS_WARN) - fd = NGX_INVALID_FILE; - prev = NULL; -#endif - - if (filename) { - - /* open configuration file */ - - fd = ngx_open_file(filename->data, NGX_FILE_RDONLY, NGX_FILE_OPEN, 0); - - if (fd == NGX_INVALID_FILE) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, ngx_errno, - ngx_open_file_n " \"%s\" failed", - filename->data); - return NGX_CONF_ERROR; - } - - prev = cf->conf_file; - - cf->conf_file = &conf_file; - - if (ngx_fd_info(fd, &cf->conf_file->file.info) == NGX_FILE_ERROR) { - ngx_log_error(NGX_LOG_EMERG, cf->log, ngx_errno, - ngx_fd_info_n " \"%s\" failed", filename->data); - } - - cf->conf_file->buffer = &buf; - - buf.start = ngx_alloc(NGX_CONF_BUFFER, cf->log); - if (buf.start == NULL) { - goto failed; - } - - buf.pos = buf.start; - buf.last = buf.start; - buf.end = buf.last + NGX_CONF_BUFFER; - buf.temporary = 1; - - cf->conf_file->file.fd = fd; - cf->conf_file->file.name.len = filename->len; - cf->conf_file->file.name.data = filename->data; - cf->conf_file->file.offset = 0; - cf->conf_file->file.log = cf->log; - cf->conf_file->line = 1; - - type = parse_file; - - if (ngx_dump_config -#if (NGX_DEBUG) - || 1 -#endif - ) - { - if (ngx_conf_add_dump(cf, filename) != NGX_OK) { - goto failed; - } - - } else { - cf->conf_file->dump = NULL; - } - - } else if (cf->conf_file->file.fd != NGX_INVALID_FILE) { - - type = parse_block; - - } else { - type = parse_param; - } - - - for ( ;; ) { - rc = ngx_conf_read_token(cf); - - /* - * ngx_conf_read_token() may return - * - * NGX_ERROR there is error - * NGX_OK the token terminated by ";" was found - * NGX_CONF_BLOCK_START the token terminated by "{" was found - * NGX_CONF_BLOCK_DONE the "}" was found - * NGX_CONF_FILE_DONE the configuration file is done - */ - - if (rc == NGX_ERROR) { - goto done; - } - - if (rc == NGX_CONF_BLOCK_DONE) { - - if (type != parse_block) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, "unexpected \"}\""); - goto failed; - } - - goto done; - } - - if (rc == NGX_CONF_FILE_DONE) { - - if (type == parse_block) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "unexpected end of file, expecting \"}\""); - goto failed; - } - - goto done; - } - - if (rc == NGX_CONF_BLOCK_START) { - - if (type == parse_param) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "block directives are not supported " - "in -g option"); - goto failed; - } - } - - /* rc == NGX_OK || rc == NGX_CONF_BLOCK_START */ - - if (cf->handler) { - - /* - * the custom handler, i.e., that is used in the http's - * "types { ... }" directive - */ - - if (rc == NGX_CONF_BLOCK_START) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, "unexpected \"{\""); - goto failed; - } - - rv = (*cf->handler)(cf, NULL, cf->handler_conf); - if (rv == NGX_CONF_OK) { - continue; - } - - if (rv == NGX_CONF_ERROR) { - goto failed; - } - - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, "%s", rv); - - goto failed; - } - - - rc = ngx_conf_handler(cf, rc); - - if (rc == NGX_ERROR) { - goto failed; - } - } - -failed: - - rc = NGX_ERROR; - -done: - - if (filename) { - if (cf->conf_file->buffer->start) { - ngx_free(cf->conf_file->buffer->start); - } - - if (ngx_close_file(fd) == NGX_FILE_ERROR) { - ngx_log_error(NGX_LOG_ALERT, cf->log, ngx_errno, - ngx_close_file_n " %s failed", - filename->data); - rc = NGX_ERROR; - } - - cf->conf_file = prev; - } - - if (rc == NGX_ERROR) { - return NGX_CONF_ERROR; - } - - return NGX_CONF_OK; -} - - -static ngx_int_t -ngx_conf_handler(ngx_conf_t *cf, ngx_int_t last) -{ - char *rv; - void *conf, **confp; - ngx_uint_t i, found; - ngx_str_t *name; - ngx_command_t *cmd; - - name = cf->args->elts; - - found = 0; - - for (i = 0; cf->cycle->modules[i]; i++) { - - cmd = cf->cycle->modules[i]->commands; - if (cmd == NULL) { - continue; - } - - for ( /* void */ ; cmd->name.len; cmd++) { - - if (name->len != cmd->name.len) { - continue; - } - - if (ngx_strcmp(name->data, cmd->name.data) != 0) { - continue; - } - - found = 1; - - if (cf->cycle->modules[i]->type != NGX_CONF_MODULE - && cf->cycle->modules[i]->type != cf->module_type) - { - continue; - } - - /* is the directive's location right ? */ - - if (!(cmd->type & cf->cmd_type)) { - continue; - } - - if (!(cmd->type & NGX_CONF_BLOCK) && last != NGX_OK) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "directive \"%s\" is not terminated by \";\"", - name->data); - return NGX_ERROR; - } - - if ((cmd->type & NGX_CONF_BLOCK) && last != NGX_CONF_BLOCK_START) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "directive \"%s\" has no opening \"{\"", - name->data); - return NGX_ERROR; - } - - /* is the directive's argument count right ? */ - - if (!(cmd->type & NGX_CONF_ANY)) { - - if (cmd->type & NGX_CONF_FLAG) { - - if (cf->args->nelts != 2) { - goto invalid; - } - - } else if (cmd->type & NGX_CONF_1MORE) { - - if (cf->args->nelts < 2) { - goto invalid; - } - - } else if (cmd->type & NGX_CONF_2MORE) { - - if (cf->args->nelts < 3) { - goto invalid; - } - - } else if (cf->args->nelts > NGX_CONF_MAX_ARGS) { - - goto invalid; - - } else if (!(cmd->type & argument_number[cf->args->nelts - 1])) - { - goto invalid; - } - } - - /* set up the directive's configuration context */ - - conf = NULL; - - if (cmd->type & NGX_DIRECT_CONF) { - conf = ((void **) cf->ctx)[cf->cycle->modules[i]->index]; - - } else if (cmd->type & NGX_MAIN_CONF) { - conf = &(((void **) cf->ctx)[cf->cycle->modules[i]->index]); - - } else if (cf->ctx) { - confp = *(void **) ((char *) cf->ctx + cmd->conf); - - if (confp) { - conf = confp[cf->cycle->modules[i]->ctx_index]; - } - } - - rv = cmd->set(cf, cmd, conf); - - if (rv == NGX_CONF_OK) { - return NGX_OK; - } - - if (rv == NGX_CONF_ERROR) { - return NGX_ERROR; - } - - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "\"%s\" directive %s", name->data, rv); - - return NGX_ERROR; - } - } - - if (found) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "\"%s\" directive is not allowed here", name->data); - - return NGX_ERROR; - } - - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "unknown directive \"%s\"", name->data); - - return NGX_ERROR; - -invalid: - - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "invalid number of arguments in \"%s\" directive", - name->data); - - return NGX_ERROR; -} - - -static ngx_int_t -ngx_conf_read_token(ngx_conf_t *cf) -{ - u_char *start, ch, *src, *dst; - off_t file_size; - size_t len; - ssize_t n, size; - ngx_uint_t found, need_space, last_space, sharp_comment, variable; - ngx_uint_t quoted, s_quoted, d_quoted, start_line; - ngx_str_t *word; - ngx_buf_t *b, *dump; - - found = 0; - need_space = 0; - last_space = 1; - sharp_comment = 0; - variable = 0; - quoted = 0; - s_quoted = 0; - d_quoted = 0; - - cf->args->nelts = 0; - b = cf->conf_file->buffer; - dump = cf->conf_file->dump; - start = b->pos; - start_line = cf->conf_file->line; - - file_size = ngx_file_size(&cf->conf_file->file.info); - - for ( ;; ) { - - if (b->pos >= b->last) { - - if (cf->conf_file->file.offset >= file_size) { - - if (cf->args->nelts > 0 || !last_space) { - - if (cf->conf_file->file.fd == NGX_INVALID_FILE) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "unexpected end of parameter, " - "expecting \";\""); - return NGX_ERROR; - } - - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "unexpected end of file, " - "expecting \";\" or \"}\""); - return NGX_ERROR; - } - - return NGX_CONF_FILE_DONE; - } - - len = b->pos - start; - - if (len == NGX_CONF_BUFFER) { - cf->conf_file->line = start_line; - - if (d_quoted) { - ch = '"'; - - } else if (s_quoted) { - ch = '\''; - - } else { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "too long parameter \"%*s...\" started", - 10, start); - return NGX_ERROR; - } - - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "too long parameter, probably " - "missing terminating \"%c\" character", ch); - return NGX_ERROR; - } - - if (len) { - ngx_memmove(b->start, start, len); - } - - size = (ssize_t) (file_size - cf->conf_file->file.offset); - - if (size > b->end - (b->start + len)) { - size = b->end - (b->start + len); - } - - n = ngx_read_file(&cf->conf_file->file, b->start + len, size, - cf->conf_file->file.offset); - - if (n == NGX_ERROR) { - return NGX_ERROR; - } - - if (n != size) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - ngx_read_file_n " returned " - "only %z bytes instead of %z", - n, size); - return NGX_ERROR; - } - - b->pos = b->start + len; - b->last = b->pos + n; - start = b->start; - - if (dump) { - dump->last = ngx_cpymem(dump->last, b->pos, size); - } - } - - ch = *b->pos++; - - if (ch == LF) { - cf->conf_file->line++; - - if (sharp_comment) { - sharp_comment = 0; - } - } - - if (sharp_comment) { - continue; - } - - if (quoted) { - quoted = 0; - continue; - } - - if (need_space) { - if (ch == ' ' || ch == '\t' || ch == CR || ch == LF) { - last_space = 1; - need_space = 0; - continue; - } - - if (ch == ';') { - return NGX_OK; - } - - if (ch == '{') { - return NGX_CONF_BLOCK_START; - } - - if (ch == ')') { - last_space = 1; - need_space = 0; - - } else { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "unexpected \"%c\"", ch); - return NGX_ERROR; - } - } - - if (last_space) { - - start = b->pos - 1; - start_line = cf->conf_file->line; - - if (ch == ' ' || ch == '\t' || ch == CR || ch == LF) { - continue; - } - - switch (ch) { - - case ';': - case '{': - if (cf->args->nelts == 0) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "unexpected \"%c\"", ch); - return NGX_ERROR; - } - - if (ch == '{') { - return NGX_CONF_BLOCK_START; - } - - return NGX_OK; - - case '}': - if (cf->args->nelts != 0) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "unexpected \"}\""); - return NGX_ERROR; - } - - return NGX_CONF_BLOCK_DONE; - - case '#': - sharp_comment = 1; - continue; - - case '\\': - quoted = 1; - last_space = 0; - continue; - - case '"': - start++; - d_quoted = 1; - last_space = 0; - continue; - - case '\'': - start++; - s_quoted = 1; - last_space = 0; - continue; - - case '$': - variable = 1; - last_space = 0; - continue; - - default: - last_space = 0; - } - - } else { - if (ch == '{' && variable) { - continue; - } - - variable = 0; - - if (ch == '\\') { - quoted = 1; - continue; - } - - if (ch == '$') { - variable = 1; - continue; - } - - if (d_quoted) { - if (ch == '"') { - d_quoted = 0; - need_space = 1; - found = 1; - } - - } else if (s_quoted) { - if (ch == '\'') { - s_quoted = 0; - need_space = 1; - found = 1; - } - - } else if (ch == ' ' || ch == '\t' || ch == CR || ch == LF - || ch == ';' || ch == '{') - { - last_space = 1; - found = 1; - } - - if (found) { - word = ngx_array_push(cf->args); - if (word == NULL) { - return NGX_ERROR; - } - - word->data = ngx_pnalloc(cf->pool, b->pos - 1 - start + 1); - if (word->data == NULL) { - return NGX_ERROR; - } - - for (dst = word->data, src = start, len = 0; - src < b->pos - 1; - len++) - { - if (*src == '\\') { - switch (src[1]) { - case '"': - case '\'': - case '\\': - src++; - break; - - case 't': - *dst++ = '\t'; - src += 2; - continue; - - case 'r': - *dst++ = '\r'; - src += 2; - continue; - - case 'n': - *dst++ = '\n'; - src += 2; - continue; - } - - } - *dst++ = *src++; - } - *dst = '\0'; - word->len = len; - - if (ch == ';') { - return NGX_OK; - } - - if (ch == '{') { - return NGX_CONF_BLOCK_START; - } - - found = 0; - } - } - } -} - - -char * -ngx_conf_include(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) -{ - char *rv; - ngx_int_t n; - ngx_str_t *value, file, name; - ngx_glob_t gl; - - value = cf->args->elts; - file = value[1]; - - ngx_log_debug1(NGX_LOG_DEBUG_CORE, cf->log, 0, "include %s", file.data); - - if (ngx_conf_full_name(cf->cycle, &file, 1) != NGX_OK) { - return NGX_CONF_ERROR; - } - - if (strpbrk((char *) file.data, "*?[") == NULL) { - - ngx_log_debug1(NGX_LOG_DEBUG_CORE, cf->log, 0, "include %s", file.data); - - return ngx_conf_parse(cf, &file); - } - - ngx_memzero(&gl, sizeof(ngx_glob_t)); - - gl.pattern = file.data; - gl.log = cf->log; - gl.test = 1; - - if (ngx_open_glob(&gl) != NGX_OK) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, ngx_errno, - ngx_open_glob_n " \"%s\" failed", file.data); - return NGX_CONF_ERROR; - } - - rv = NGX_CONF_OK; - - for ( ;; ) { - n = ngx_read_glob(&gl, &name); - - if (n != NGX_OK) { - break; - } - - file.len = name.len++; - file.data = ngx_pstrdup(cf->pool, &name); - if (file.data == NULL) { - return NGX_CONF_ERROR; - } - - ngx_log_debug1(NGX_LOG_DEBUG_CORE, cf->log, 0, "include %s", file.data); - - rv = ngx_conf_parse(cf, &file); - - if (rv != NGX_CONF_OK) { - break; - } - } - - ngx_close_glob(&gl); - - return rv; -} - - -ngx_int_t -ngx_conf_full_name(ngx_cycle_t *cycle, ngx_str_t *name, ngx_uint_t conf_prefix) -{ - ngx_str_t *prefix; - - prefix = conf_prefix ? &cycle->conf_prefix : &cycle->prefix; - - return ngx_get_full_name(cycle->pool, prefix, name); -} - - -ngx_open_file_t * -ngx_conf_open_file(ngx_cycle_t *cycle, ngx_str_t *name) -{ - ngx_str_t full; - ngx_uint_t i; - ngx_list_part_t *part; - ngx_open_file_t *file; - -#if (NGX_SUPPRESS_WARN) - ngx_str_null(&full); -#endif - - if (name->len) { - full = *name; - - if (ngx_conf_full_name(cycle, &full, 0) != NGX_OK) { - return NULL; - } - - part = &cycle->open_files.part; - file = part->elts; - - for (i = 0; /* void */ ; i++) { - - if (i >= part->nelts) { - if (part->next == NULL) { - break; - } - part = part->next; - file = part->elts; - i = 0; - } - - if (full.len != file[i].name.len) { - continue; - } - - if (ngx_strcmp(full.data, file[i].name.data) == 0) { - return &file[i]; - } - } - } - - file = ngx_list_push(&cycle->open_files); - if (file == NULL) { - return NULL; - } - - if (name->len) { - file->fd = NGX_INVALID_FILE; - file->name = full; - - } else { - file->fd = ngx_stderr; - file->name = *name; - } - - file->flush = NULL; - file->data = NULL; - - return file; -} - - -static void -ngx_conf_flush_files(ngx_cycle_t *cycle) -{ - ngx_uint_t i; - ngx_list_part_t *part; - ngx_open_file_t *file; - - ngx_log_debug0(NGX_LOG_DEBUG_CORE, cycle->log, 0, "flush files"); - - part = &cycle->open_files.part; - file = part->elts; - - for (i = 0; /* void */ ; i++) { - - if (i >= part->nelts) { - if (part->next == NULL) { - break; - } - part = part->next; - file = part->elts; - i = 0; - } - - if (file[i].flush) { - file[i].flush(&file[i], cycle->log); - } - } -} - - -void ngx_cdecl -ngx_conf_log_error(ngx_uint_t level, ngx_conf_t *cf, ngx_err_t err, - const char *fmt, ...) -{ - u_char errstr[NGX_MAX_CONF_ERRSTR], *p, *last; - va_list args; - - last = errstr + NGX_MAX_CONF_ERRSTR; - - va_start(args, fmt); - p = ngx_vslprintf(errstr, last, fmt, args); - va_end(args); - - if (err) { - p = ngx_log_errno(p, last, err); - } - - if (cf->conf_file == NULL) { - ngx_log_error(level, cf->log, 0, "%*s", p - errstr, errstr); - return; - } - - if (cf->conf_file->file.fd == NGX_INVALID_FILE) { - ngx_log_error(level, cf->log, 0, "%*s in command line", - p - errstr, errstr); - return; - } - - ngx_log_error(level, cf->log, 0, "%*s in %s:%ui", - p - errstr, errstr, - cf->conf_file->file.name.data, cf->conf_file->line); -} - - -char * -ngx_conf_set_flag_slot(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) -{ - char *p = conf; - - ngx_str_t *value; - ngx_flag_t *fp; - ngx_conf_post_t *post; - - fp = (ngx_flag_t *) (p + cmd->offset); - - if (*fp != NGX_CONF_UNSET) { - return "is duplicate"; - } - - value = cf->args->elts; - - if (ngx_strcasecmp(value[1].data, (u_char *) "on") == 0) { - *fp = 1; - - } else if (ngx_strcasecmp(value[1].data, (u_char *) "off") == 0) { - *fp = 0; - - } else { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "invalid value \"%s\" in \"%s\" directive, " - "it must be \"on\" or \"off\"", - value[1].data, cmd->name.data); - return NGX_CONF_ERROR; - } - - if (cmd->post) { - post = cmd->post; - return post->post_handler(cf, post, fp); - } - - return NGX_CONF_OK; -} - - -char * -ngx_conf_set_str_slot(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) -{ - char *p = conf; - - ngx_str_t *field, *value; - ngx_conf_post_t *post; - - field = (ngx_str_t *) (p + cmd->offset); - - if (field->data) { - return "is duplicate"; - } - - value = cf->args->elts; - - *field = value[1]; - - if (cmd->post) { - post = cmd->post; - return post->post_handler(cf, post, field); - } - - return NGX_CONF_OK; -} - - -char * -ngx_conf_set_str_array_slot(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) -{ - char *p = conf; - - ngx_str_t *value, *s; - ngx_array_t **a; - ngx_conf_post_t *post; - - a = (ngx_array_t **) (p + cmd->offset); - - if (*a == NGX_CONF_UNSET_PTR) { - *a = ngx_array_create(cf->pool, 4, sizeof(ngx_str_t)); - if (*a == NULL) { - return NGX_CONF_ERROR; - } - } - - s = ngx_array_push(*a); - if (s == NULL) { - return NGX_CONF_ERROR; - } - - value = cf->args->elts; - - *s = value[1]; - - if (cmd->post) { - post = cmd->post; - return post->post_handler(cf, post, s); - } - - return NGX_CONF_OK; -} - - -char * -ngx_conf_set_keyval_slot(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) -{ - char *p = conf; - - ngx_str_t *value; - ngx_array_t **a; - ngx_keyval_t *kv; - ngx_conf_post_t *post; - - a = (ngx_array_t **) (p + cmd->offset); - - if (*a == NGX_CONF_UNSET_PTR || *a == NULL) { - *a = ngx_array_create(cf->pool, 4, sizeof(ngx_keyval_t)); - if (*a == NULL) { - return NGX_CONF_ERROR; - } - } - - kv = ngx_array_push(*a); - if (kv == NULL) { - return NGX_CONF_ERROR; - } - - value = cf->args->elts; - - kv->key = value[1]; - kv->value = value[2]; - - if (cmd->post) { - post = cmd->post; - return post->post_handler(cf, post, kv); - } - - return NGX_CONF_OK; -} - - -char * -ngx_conf_set_num_slot(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) -{ - char *p = conf; - - ngx_int_t *np; - ngx_str_t *value; - ngx_conf_post_t *post; - - - np = (ngx_int_t *) (p + cmd->offset); - - if (*np != NGX_CONF_UNSET) { - return "is duplicate"; - } - - value = cf->args->elts; - *np = ngx_atoi(value[1].data, value[1].len); - if (*np == NGX_ERROR) { - return "invalid number"; - } - - if (cmd->post) { - post = cmd->post; - return post->post_handler(cf, post, np); - } - - return NGX_CONF_OK; -} - - -char * -ngx_conf_set_size_slot(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) -{ - char *p = conf; - - size_t *sp; - ngx_str_t *value; - ngx_conf_post_t *post; - - - sp = (size_t *) (p + cmd->offset); - if (*sp != NGX_CONF_UNSET_SIZE) { - return "is duplicate"; - } - - value = cf->args->elts; - - *sp = ngx_parse_size(&value[1]); - if (*sp == (size_t) NGX_ERROR) { - return "invalid value"; - } - - if (cmd->post) { - post = cmd->post; - return post->post_handler(cf, post, sp); - } - - return NGX_CONF_OK; -} - - -char * -ngx_conf_set_off_slot(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) -{ - char *p = conf; - - off_t *op; - ngx_str_t *value; - ngx_conf_post_t *post; - - - op = (off_t *) (p + cmd->offset); - if (*op != NGX_CONF_UNSET) { - return "is duplicate"; - } - - value = cf->args->elts; - - *op = ngx_parse_offset(&value[1]); - if (*op == (off_t) NGX_ERROR) { - return "invalid value"; - } - - if (cmd->post) { - post = cmd->post; - return post->post_handler(cf, post, op); - } - - return NGX_CONF_OK; -} - - -char * -ngx_conf_set_msec_slot(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) -{ - char *p = conf; - - ngx_msec_t *msp; - ngx_str_t *value; - ngx_conf_post_t *post; - - - msp = (ngx_msec_t *) (p + cmd->offset); - if (*msp != NGX_CONF_UNSET_MSEC) { - return "is duplicate"; - } - - value = cf->args->elts; - - *msp = ngx_parse_time(&value[1], 0); - if (*msp == (ngx_msec_t) NGX_ERROR) { - return "invalid value"; - } - - if (cmd->post) { - post = cmd->post; - return post->post_handler(cf, post, msp); - } - - return NGX_CONF_OK; -} - - -char * -ngx_conf_set_sec_slot(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) -{ - char *p = conf; - - time_t *sp; - ngx_str_t *value; - ngx_conf_post_t *post; - - - sp = (time_t *) (p + cmd->offset); - if (*sp != NGX_CONF_UNSET) { - return "is duplicate"; - } - - value = cf->args->elts; - - *sp = ngx_parse_time(&value[1], 1); - if (*sp == (time_t) NGX_ERROR) { - return "invalid value"; - } - - if (cmd->post) { - post = cmd->post; - return post->post_handler(cf, post, sp); - } - - return NGX_CONF_OK; -} - - -char * -ngx_conf_set_bufs_slot(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) -{ - char *p = conf; - - ngx_str_t *value; - ngx_bufs_t *bufs; - - - bufs = (ngx_bufs_t *) (p + cmd->offset); - if (bufs->num) { - return "is duplicate"; - } - - value = cf->args->elts; - - bufs->num = ngx_atoi(value[1].data, value[1].len); - if (bufs->num == NGX_ERROR || bufs->num == 0) { - return "invalid value"; - } - - bufs->size = ngx_parse_size(&value[2]); - if (bufs->size == (size_t) NGX_ERROR || bufs->size == 0) { - return "invalid value"; - } - - return NGX_CONF_OK; -} - - -char * -ngx_conf_set_enum_slot(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) -{ - char *p = conf; - - ngx_uint_t *np, i; - ngx_str_t *value; - ngx_conf_enum_t *e; - - np = (ngx_uint_t *) (p + cmd->offset); - - if (*np != NGX_CONF_UNSET_UINT) { - return "is duplicate"; - } - - value = cf->args->elts; - e = cmd->post; - - for (i = 0; e[i].name.len != 0; i++) { - if (e[i].name.len != value[1].len - || ngx_strcasecmp(e[i].name.data, value[1].data) != 0) - { - continue; - } - - *np = e[i].value; - - return NGX_CONF_OK; - } - - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "invalid value \"%s\"", value[1].data); - - return NGX_CONF_ERROR; -} - - -char * -ngx_conf_set_bitmask_slot(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) -{ - char *p = conf; - - ngx_uint_t *np, i, m; - ngx_str_t *value; - ngx_conf_bitmask_t *mask; - - - np = (ngx_uint_t *) (p + cmd->offset); - value = cf->args->elts; - mask = cmd->post; - - for (i = 1; i < cf->args->nelts; i++) { - for (m = 0; mask[m].name.len != 0; m++) { - - if (mask[m].name.len != value[i].len - || ngx_strcasecmp(mask[m].name.data, value[i].data) != 0) - { - continue; - } - - if (*np & mask[m].mask) { - ngx_conf_log_error(NGX_LOG_WARN, cf, 0, - "duplicate value \"%s\"", value[i].data); - - } else { - *np |= mask[m].mask; - } - - break; - } - - if (mask[m].name.len == 0) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "invalid value \"%s\"", value[i].data); - - return NGX_CONF_ERROR; - } - } - - return NGX_CONF_OK; -} - - -#if 0 - -char * -ngx_conf_unsupported(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) -{ - return "unsupported on this platform"; -} - -#endif - - -char * -ngx_conf_deprecated(ngx_conf_t *cf, void *post, void *data) -{ - ngx_conf_deprecated_t *d = post; - - ngx_conf_log_error(NGX_LOG_WARN, cf, 0, - "the \"%s\" directive is deprecated, " - "use the \"%s\" directive instead", - d->old_name, d->new_name); - - return NGX_CONF_OK; -} - - -char * -ngx_conf_check_num_bounds(ngx_conf_t *cf, void *post, void *data) -{ - ngx_conf_num_bounds_t *bounds = post; - ngx_int_t *np = data; - - if (bounds->high == -1) { - if (*np >= bounds->low) { - return NGX_CONF_OK; - } - - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "value must be equal to or greater than %i", - bounds->low); - - return NGX_CONF_ERROR; - } - - if (*np >= bounds->low && *np <= bounds->high) { - return NGX_CONF_OK; - } - - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "value must be between %i and %i", - bounds->low, bounds->high); - - return NGX_CONF_ERROR; -} diff --git a/src/deps/src/nginx-1.30.3/src/core/ngx_conf_file.h b/src/deps/src/nginx-1.30.3/src/core/ngx_conf_file.h deleted file mode 100644 index ed2d2ba9d6..0000000000 --- a/src/deps/src/nginx-1.30.3/src/core/ngx_conf_file.h +++ /dev/null @@ -1,295 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#ifndef _NGX_CONF_FILE_H_INCLUDED_ -#define _NGX_CONF_FILE_H_INCLUDED_ - - -#include -#include - - -/* - * AAAA number of arguments - * FF command flags - * TT command type, i.e. HTTP "location" or "server" command - */ - -#define NGX_CONF_NOARGS 0x00000001 -#define NGX_CONF_TAKE1 0x00000002 -#define NGX_CONF_TAKE2 0x00000004 -#define NGX_CONF_TAKE3 0x00000008 -#define NGX_CONF_TAKE4 0x00000010 -#define NGX_CONF_TAKE5 0x00000020 -#define NGX_CONF_TAKE6 0x00000040 -#define NGX_CONF_TAKE7 0x00000080 - -#define NGX_CONF_MAX_ARGS 8 - -#define NGX_CONF_TAKE12 (NGX_CONF_TAKE1|NGX_CONF_TAKE2) -#define NGX_CONF_TAKE13 (NGX_CONF_TAKE1|NGX_CONF_TAKE3) - -#define NGX_CONF_TAKE23 (NGX_CONF_TAKE2|NGX_CONF_TAKE3) - -#define NGX_CONF_TAKE123 (NGX_CONF_TAKE1|NGX_CONF_TAKE2|NGX_CONF_TAKE3) -#define NGX_CONF_TAKE1234 (NGX_CONF_TAKE1|NGX_CONF_TAKE2|NGX_CONF_TAKE3 \ - |NGX_CONF_TAKE4) - -#define NGX_CONF_ARGS_NUMBER 0x000000ff -#define NGX_CONF_BLOCK 0x00000100 -#define NGX_CONF_FLAG 0x00000200 -#define NGX_CONF_ANY 0x00000400 -#define NGX_CONF_1MORE 0x00000800 -#define NGX_CONF_2MORE 0x00001000 - -#define NGX_DIRECT_CONF 0x00010000 - -#define NGX_MAIN_CONF 0x01000000 -#define NGX_ANY_CONF 0xFF000000 - - - -#define NGX_CONF_UNSET -1 -#define NGX_CONF_UNSET_UINT (ngx_uint_t) -1 -#define NGX_CONF_UNSET_PTR (void *) -1 -#define NGX_CONF_UNSET_SIZE (size_t) -1 -#define NGX_CONF_UNSET_MSEC (ngx_msec_t) -1 - - -#define NGX_CONF_OK NULL -#define NGX_CONF_ERROR (void *) -1 - -#define NGX_CONF_BLOCK_START 1 -#define NGX_CONF_BLOCK_DONE 2 -#define NGX_CONF_FILE_DONE 3 - -#define NGX_CORE_MODULE 0x45524F43 /* "CORE" */ -#define NGX_CONF_MODULE 0x464E4F43 /* "CONF" */ - - -#define NGX_MAX_CONF_ERRSTR 1024 - - -struct ngx_command_s { - ngx_str_t name; - ngx_uint_t type; - char *(*set)(ngx_conf_t *cf, ngx_command_t *cmd, void *conf); - ngx_uint_t conf; - ngx_uint_t offset; - void *post; -}; - -#define ngx_null_command { ngx_null_string, 0, NULL, 0, 0, NULL } - - -struct ngx_open_file_s { - ngx_fd_t fd; - ngx_str_t name; - - void (*flush)(ngx_open_file_t *file, ngx_log_t *log); - void *data; -}; - - -typedef struct { - ngx_file_t file; - ngx_buf_t *buffer; - ngx_buf_t *dump; - ngx_uint_t line; -} ngx_conf_file_t; - - -typedef struct { - ngx_str_t name; - ngx_buf_t *buffer; -} ngx_conf_dump_t; - - -typedef char *(*ngx_conf_handler_pt)(ngx_conf_t *cf, - ngx_command_t *dummy, void *conf); - - -struct ngx_conf_s { - char *name; - ngx_array_t *args; - - ngx_cycle_t *cycle; - ngx_pool_t *pool; - ngx_pool_t *temp_pool; - ngx_conf_file_t *conf_file; - ngx_log_t *log; - - void *ctx; - ngx_uint_t module_type; - ngx_uint_t cmd_type; - - ngx_conf_handler_pt handler; - void *handler_conf; -}; - - -typedef char *(*ngx_conf_post_handler_pt) (ngx_conf_t *cf, - void *data, void *conf); - -typedef struct { - ngx_conf_post_handler_pt post_handler; -} ngx_conf_post_t; - - -typedef struct { - ngx_conf_post_handler_pt post_handler; - char *old_name; - char *new_name; -} ngx_conf_deprecated_t; - - -typedef struct { - ngx_conf_post_handler_pt post_handler; - ngx_int_t low; - ngx_int_t high; -} ngx_conf_num_bounds_t; - - -typedef struct { - ngx_str_t name; - ngx_uint_t value; -} ngx_conf_enum_t; - - -#define NGX_CONF_BITMASK_SET 1 - -typedef struct { - ngx_str_t name; - ngx_uint_t mask; -} ngx_conf_bitmask_t; - - - -char * ngx_conf_deprecated(ngx_conf_t *cf, void *post, void *data); -char *ngx_conf_check_num_bounds(ngx_conf_t *cf, void *post, void *data); - - -#define ngx_get_conf(conf_ctx, module) conf_ctx[module.index] - - - -#define ngx_conf_init_value(conf, default) \ - if (conf == NGX_CONF_UNSET) { \ - conf = default; \ - } - -#define ngx_conf_init_ptr_value(conf, default) \ - if (conf == NGX_CONF_UNSET_PTR) { \ - conf = default; \ - } - -#define ngx_conf_init_uint_value(conf, default) \ - if (conf == NGX_CONF_UNSET_UINT) { \ - conf = default; \ - } - -#define ngx_conf_init_size_value(conf, default) \ - if (conf == NGX_CONF_UNSET_SIZE) { \ - conf = default; \ - } - -#define ngx_conf_init_msec_value(conf, default) \ - if (conf == NGX_CONF_UNSET_MSEC) { \ - conf = default; \ - } - -#define ngx_conf_merge_value(conf, prev, default) \ - if (conf == NGX_CONF_UNSET) { \ - conf = (prev == NGX_CONF_UNSET) ? default : prev; \ - } - -#define ngx_conf_merge_ptr_value(conf, prev, default) \ - if (conf == NGX_CONF_UNSET_PTR) { \ - conf = (prev == NGX_CONF_UNSET_PTR) ? default : prev; \ - } - -#define ngx_conf_merge_uint_value(conf, prev, default) \ - if (conf == NGX_CONF_UNSET_UINT) { \ - conf = (prev == NGX_CONF_UNSET_UINT) ? default : prev; \ - } - -#define ngx_conf_merge_msec_value(conf, prev, default) \ - if (conf == NGX_CONF_UNSET_MSEC) { \ - conf = (prev == NGX_CONF_UNSET_MSEC) ? default : prev; \ - } - -#define ngx_conf_merge_sec_value(conf, prev, default) \ - if (conf == NGX_CONF_UNSET) { \ - conf = (prev == NGX_CONF_UNSET) ? default : prev; \ - } - -#define ngx_conf_merge_size_value(conf, prev, default) \ - if (conf == NGX_CONF_UNSET_SIZE) { \ - conf = (prev == NGX_CONF_UNSET_SIZE) ? default : prev; \ - } - -#define ngx_conf_merge_off_value(conf, prev, default) \ - if (conf == NGX_CONF_UNSET) { \ - conf = (prev == NGX_CONF_UNSET) ? default : prev; \ - } - -#define ngx_conf_merge_str_value(conf, prev, default) \ - if (conf.data == NULL) { \ - if (prev.data) { \ - conf.len = prev.len; \ - conf.data = prev.data; \ - } else { \ - conf.len = sizeof(default) - 1; \ - conf.data = (u_char *) default; \ - } \ - } - -#define ngx_conf_merge_bufs_value(conf, prev, default_num, default_size) \ - if (conf.num == 0) { \ - if (prev.num) { \ - conf.num = prev.num; \ - conf.size = prev.size; \ - } else { \ - conf.num = default_num; \ - conf.size = default_size; \ - } \ - } - -#define ngx_conf_merge_bitmask_value(conf, prev, default) \ - if (conf == 0) { \ - conf = (prev == 0) ? default : prev; \ - } - - -char *ngx_conf_param(ngx_conf_t *cf); -char *ngx_conf_parse(ngx_conf_t *cf, ngx_str_t *filename); -char *ngx_conf_include(ngx_conf_t *cf, ngx_command_t *cmd, void *conf); - - -ngx_int_t ngx_conf_full_name(ngx_cycle_t *cycle, ngx_str_t *name, - ngx_uint_t conf_prefix); -ngx_open_file_t *ngx_conf_open_file(ngx_cycle_t *cycle, ngx_str_t *name); -void ngx_cdecl ngx_conf_log_error(ngx_uint_t level, ngx_conf_t *cf, - ngx_err_t err, const char *fmt, ...); - - -char *ngx_conf_set_flag_slot(ngx_conf_t *cf, ngx_command_t *cmd, void *conf); -char *ngx_conf_set_str_slot(ngx_conf_t *cf, ngx_command_t *cmd, void *conf); -char *ngx_conf_set_str_array_slot(ngx_conf_t *cf, ngx_command_t *cmd, - void *conf); -char *ngx_conf_set_keyval_slot(ngx_conf_t *cf, ngx_command_t *cmd, void *conf); -char *ngx_conf_set_num_slot(ngx_conf_t *cf, ngx_command_t *cmd, void *conf); -char *ngx_conf_set_size_slot(ngx_conf_t *cf, ngx_command_t *cmd, void *conf); -char *ngx_conf_set_off_slot(ngx_conf_t *cf, ngx_command_t *cmd, void *conf); -char *ngx_conf_set_msec_slot(ngx_conf_t *cf, ngx_command_t *cmd, void *conf); -char *ngx_conf_set_sec_slot(ngx_conf_t *cf, ngx_command_t *cmd, void *conf); -char *ngx_conf_set_bufs_slot(ngx_conf_t *cf, ngx_command_t *cmd, void *conf); -char *ngx_conf_set_enum_slot(ngx_conf_t *cf, ngx_command_t *cmd, void *conf); -char *ngx_conf_set_bitmask_slot(ngx_conf_t *cf, ngx_command_t *cmd, void *conf); - - -#endif /* _NGX_CONF_FILE_H_INCLUDED_ */ diff --git a/src/deps/src/nginx-1.30.3/src/core/ngx_config.h b/src/deps/src/nginx-1.30.3/src/core/ngx_config.h deleted file mode 100644 index 707ab216be..0000000000 --- a/src/deps/src/nginx-1.30.3/src/core/ngx_config.h +++ /dev/null @@ -1,145 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#ifndef _NGX_CONFIG_H_INCLUDED_ -#define _NGX_CONFIG_H_INCLUDED_ - - -#include - - -#if defined __DragonFly__ && !defined __FreeBSD__ -#define __FreeBSD__ 4 -#define __FreeBSD_version 480101 -#endif - - -#if (NGX_FREEBSD) -#include - - -#elif (NGX_LINUX) -#include - - -#elif (NGX_SOLARIS) -#include - - -#elif (NGX_DARWIN) -#include - - -#elif (NGX_WIN32) -#include - - -#else /* POSIX */ -#include - -#endif - - -#ifndef NGX_HAVE_SO_SNDLOWAT -#define NGX_HAVE_SO_SNDLOWAT 1 -#endif - - -#if !(NGX_WIN32) - -#define ngx_signal_helper(n) SIG##n -#define ngx_signal_value(n) ngx_signal_helper(n) - -#define ngx_random random - -/* TODO: #ifndef */ -#define NGX_SHUTDOWN_SIGNAL QUIT -#define NGX_TERMINATE_SIGNAL TERM -#define NGX_NOACCEPT_SIGNAL WINCH -#define NGX_RECONFIGURE_SIGNAL HUP - -#if (NGX_LINUXTHREADS) -#define NGX_REOPEN_SIGNAL INFO -#define NGX_CHANGEBIN_SIGNAL XCPU -#else -#define NGX_REOPEN_SIGNAL USR1 -#define NGX_CHANGEBIN_SIGNAL USR2 -#endif - -#define ngx_cdecl -#define ngx_libc_cdecl - -#endif - -typedef intptr_t ngx_int_t; -typedef uintptr_t ngx_uint_t; -typedef intptr_t ngx_flag_t; - - -#define NGX_INT32_LEN (sizeof("-2147483648") - 1) -#define NGX_INT64_LEN (sizeof("-9223372036854775808") - 1) - -#if (NGX_PTR_SIZE == 4) -#define NGX_INT_T_LEN NGX_INT32_LEN -#define NGX_MAX_INT_T_VALUE 2147483647 - -#else -#define NGX_INT_T_LEN NGX_INT64_LEN -#define NGX_MAX_INT_T_VALUE 9223372036854775807 -#endif - - -#ifndef NGX_ALIGNMENT -#define NGX_ALIGNMENT sizeof(uintptr_t) /* platform word */ -#endif - -#define ngx_align(d, a) (((d) + (a - 1)) & ~(a - 1)) -#define ngx_align_ptr(p, a) \ - (u_char *) (((uintptr_t) (p) + ((uintptr_t) a - 1)) & ~((uintptr_t) a - 1)) - - -#define ngx_abort abort - - -/* TODO: platform specific: array[NGX_INVALID_ARRAY_INDEX] must cause SIGSEGV */ -#define NGX_INVALID_ARRAY_INDEX 0x80000000 - - -/* TODO: auto_conf: ngx_inline inline __inline __inline__ */ -#ifndef ngx_inline -#define ngx_inline inline -#endif - -#ifndef INADDR_NONE /* Solaris */ -#define INADDR_NONE ((unsigned int) -1) -#endif - -#ifdef MAXHOSTNAMELEN -#define NGX_MAXHOSTNAMELEN MAXHOSTNAMELEN -#else -#define NGX_MAXHOSTNAMELEN 256 -#endif - - -#define NGX_MAX_UINT32_VALUE (uint32_t) 0xffffffff -#define NGX_MAX_INT32_VALUE (uint32_t) 0x7fffffff - - -#if (NGX_COMPAT) - -#define NGX_COMPAT_BEGIN(slots) uint64_t spare[slots]; -#define NGX_COMPAT_END - -#else - -#define NGX_COMPAT_BEGIN(slots) -#define NGX_COMPAT_END - -#endif - - -#endif /* _NGX_CONFIG_H_INCLUDED_ */ diff --git a/src/deps/src/nginx-1.30.3/src/core/ngx_connection.c b/src/deps/src/nginx-1.30.3/src/core/ngx_connection.c deleted file mode 100644 index c269a97e61..0000000000 --- a/src/deps/src/nginx-1.30.3/src/core/ngx_connection.c +++ /dev/null @@ -1,1657 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#include -#include -#include - - -ngx_os_io_t ngx_io; - - -static void ngx_drain_connections(ngx_cycle_t *cycle); - - -ngx_listening_t * -ngx_create_listening(ngx_conf_t *cf, struct sockaddr *sockaddr, - socklen_t socklen) -{ - size_t len; - ngx_listening_t *ls; - struct sockaddr *sa; - u_char text[NGX_SOCKADDR_STRLEN]; - - ls = ngx_array_push(&cf->cycle->listening); - if (ls == NULL) { - return NULL; - } - - ngx_memzero(ls, sizeof(ngx_listening_t)); - - sa = ngx_palloc(cf->pool, socklen); - if (sa == NULL) { - return NULL; - } - - ngx_memcpy(sa, sockaddr, socklen); - - ls->sockaddr = sa; - ls->socklen = socklen; - - len = ngx_sock_ntop(sa, socklen, text, NGX_SOCKADDR_STRLEN, 1); - ls->addr_text.len = len; - - switch (ls->sockaddr->sa_family) { -#if (NGX_HAVE_INET6) - case AF_INET6: - ls->addr_text_max_len = NGX_INET6_ADDRSTRLEN; - break; -#endif -#if (NGX_HAVE_UNIX_DOMAIN) - case AF_UNIX: - ls->addr_text_max_len = NGX_UNIX_ADDRSTRLEN; - len++; - break; -#endif - case AF_INET: - ls->addr_text_max_len = NGX_INET_ADDRSTRLEN; - break; - default: - ls->addr_text_max_len = NGX_SOCKADDR_STRLEN; - break; - } - - ls->addr_text.data = ngx_pnalloc(cf->pool, len); - if (ls->addr_text.data == NULL) { - return NULL; - } - - ngx_memcpy(ls->addr_text.data, text, len); - -#if !(NGX_WIN32) - ngx_rbtree_init(&ls->rbtree, &ls->sentinel, ngx_udp_rbtree_insert_value); -#endif - - ls->fd = (ngx_socket_t) -1; - ls->type = SOCK_STREAM; - - ls->backlog = NGX_LISTEN_BACKLOG; - ls->rcvbuf = -1; - ls->sndbuf = -1; - -#if (NGX_HAVE_SETFIB) - ls->setfib = -1; -#endif - -#if (NGX_HAVE_TCP_FASTOPEN) - ls->fastopen = -1; -#endif - - return ls; -} - - -ngx_int_t -ngx_clone_listening(ngx_cycle_t *cycle, ngx_listening_t *ls) -{ -#if (NGX_HAVE_REUSEPORT) - - ngx_int_t n; - ngx_core_conf_t *ccf; - ngx_listening_t ols; - - if (!ls->reuseport || ls->worker != 0) { - return NGX_OK; - } - - ols = *ls; - - ccf = (ngx_core_conf_t *) ngx_get_conf(cycle->conf_ctx, ngx_core_module); - - for (n = 1; n < ccf->worker_processes; n++) { - - /* create a socket for each worker process */ - - ls = ngx_array_push(&cycle->listening); - if (ls == NULL) { - return NGX_ERROR; - } - - *ls = ols; - ls->worker = n; - } - -#endif - - return NGX_OK; -} - - -ngx_int_t -ngx_set_inherited_sockets(ngx_cycle_t *cycle) -{ - size_t len; - ngx_uint_t i; - ngx_listening_t *ls; - socklen_t olen; -#if (NGX_HAVE_DEFERRED_ACCEPT || NGX_HAVE_TCP_FASTOPEN) - ngx_err_t err; -#endif -#if (NGX_HAVE_DEFERRED_ACCEPT && defined SO_ACCEPTFILTER) - struct accept_filter_arg af; -#endif -#if (NGX_HAVE_DEFERRED_ACCEPT && defined TCP_DEFER_ACCEPT) - int timeout; -#endif -#if (NGX_HAVE_REUSEPORT) - int reuseport; -#endif - - ls = cycle->listening.elts; - for (i = 0; i < cycle->listening.nelts; i++) { - - ls[i].sockaddr = ngx_palloc(cycle->pool, sizeof(ngx_sockaddr_t)); - if (ls[i].sockaddr == NULL) { - return NGX_ERROR; - } - - ls[i].socklen = sizeof(ngx_sockaddr_t); - if (getsockname(ls[i].fd, ls[i].sockaddr, &ls[i].socklen) == -1) { - ngx_log_error(NGX_LOG_CRIT, cycle->log, ngx_socket_errno, - "getsockname() of the inherited " - "socket #%d failed", ls[i].fd); - ls[i].ignore = 1; - continue; - } - - if (ls[i].socklen > (socklen_t) sizeof(ngx_sockaddr_t)) { - ls[i].socklen = sizeof(ngx_sockaddr_t); - } - - switch (ls[i].sockaddr->sa_family) { - -#if (NGX_HAVE_INET6) - case AF_INET6: - ls[i].addr_text_max_len = NGX_INET6_ADDRSTRLEN; - len = NGX_INET6_ADDRSTRLEN + sizeof("[]:65535") - 1; - break; -#endif - -#if (NGX_HAVE_UNIX_DOMAIN) - case AF_UNIX: - ls[i].addr_text_max_len = NGX_UNIX_ADDRSTRLEN; - len = NGX_UNIX_ADDRSTRLEN; - break; -#endif - - case AF_INET: - ls[i].addr_text_max_len = NGX_INET_ADDRSTRLEN; - len = NGX_INET_ADDRSTRLEN + sizeof(":65535") - 1; - break; - - default: - ngx_log_error(NGX_LOG_CRIT, cycle->log, ngx_socket_errno, - "the inherited socket #%d has " - "an unsupported protocol family", ls[i].fd); - ls[i].ignore = 1; - continue; - } - - ls[i].addr_text.data = ngx_pnalloc(cycle->pool, len); - if (ls[i].addr_text.data == NULL) { - return NGX_ERROR; - } - - len = ngx_sock_ntop(ls[i].sockaddr, ls[i].socklen, - ls[i].addr_text.data, len, 1); - if (len == 0) { - return NGX_ERROR; - } - - ls[i].addr_text.len = len; - - ls[i].backlog = NGX_LISTEN_BACKLOG; - - olen = sizeof(int); - - if (getsockopt(ls[i].fd, SOL_SOCKET, SO_TYPE, (void *) &ls[i].type, - &olen) - == -1) - { - ngx_log_error(NGX_LOG_CRIT, cycle->log, ngx_socket_errno, - "getsockopt(SO_TYPE) %V failed", &ls[i].addr_text); - ls[i].ignore = 1; - continue; - } - - olen = sizeof(int); - - if (getsockopt(ls[i].fd, SOL_SOCKET, SO_RCVBUF, (void *) &ls[i].rcvbuf, - &olen) - == -1) - { - ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_socket_errno, - "getsockopt(SO_RCVBUF) %V failed, ignored", - &ls[i].addr_text); - - ls[i].rcvbuf = -1; - } - - olen = sizeof(int); - - if (getsockopt(ls[i].fd, SOL_SOCKET, SO_SNDBUF, (void *) &ls[i].sndbuf, - &olen) - == -1) - { - ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_socket_errno, - "getsockopt(SO_SNDBUF) %V failed, ignored", - &ls[i].addr_text); - - ls[i].sndbuf = -1; - } - -#if 0 - /* SO_SETFIB is currently a set only option */ - -#if (NGX_HAVE_SETFIB) - - olen = sizeof(int); - - if (getsockopt(ls[i].fd, SOL_SOCKET, SO_SETFIB, - (void *) &ls[i].setfib, &olen) - == -1) - { - ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_socket_errno, - "getsockopt(SO_SETFIB) %V failed, ignored", - &ls[i].addr_text); - - ls[i].setfib = -1; - } - -#endif -#endif - -#if (NGX_HAVE_REUSEPORT) - - reuseport = 0; - olen = sizeof(int); - -#ifdef SO_REUSEPORT_LB - - if (getsockopt(ls[i].fd, SOL_SOCKET, SO_REUSEPORT_LB, - (void *) &reuseport, &olen) - == -1) - { - ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_socket_errno, - "getsockopt(SO_REUSEPORT_LB) %V failed, ignored", - &ls[i].addr_text); - - } else { - ls[i].reuseport = reuseport ? 1 : 0; - } - -#else - - if (getsockopt(ls[i].fd, SOL_SOCKET, SO_REUSEPORT, - (void *) &reuseport, &olen) - == -1) - { - ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_socket_errno, - "getsockopt(SO_REUSEPORT) %V failed, ignored", - &ls[i].addr_text); - - } else { - ls[i].reuseport = reuseport ? 1 : 0; - } -#endif - -#endif - - if (ls[i].type != SOCK_STREAM) { - continue; - } - -#ifdef SO_PROTOCOL - - olen = sizeof(int); - - if (getsockopt(ls[i].fd, SOL_SOCKET, SO_PROTOCOL, - (void *) &ls[i].protocol, &olen) - == -1) - { - ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_socket_errno, - "getsockopt(SO_PROTOCOL) %V failed, ignored", - &ls[i].addr_text); - ls[i].protocol = 0; - - } else if (ls[i].protocol == IPPROTO_TCP) { - ls[i].protocol = 0; - } - -#endif - -#if (NGX_HAVE_TCP_FASTOPEN) - - olen = sizeof(int); - - if (getsockopt(ls[i].fd, IPPROTO_TCP, TCP_FASTOPEN, - (void *) &ls[i].fastopen, &olen) - == -1) - { - err = ngx_socket_errno; - - if (err != NGX_EOPNOTSUPP && err != NGX_ENOPROTOOPT - && err != NGX_EINVAL) - { - ngx_log_error(NGX_LOG_NOTICE, cycle->log, err, - "getsockopt(TCP_FASTOPEN) %V failed, ignored", - &ls[i].addr_text); - } - - ls[i].fastopen = -1; - } - -#endif - -#if (NGX_HAVE_DEFERRED_ACCEPT && defined SO_ACCEPTFILTER) - - ngx_memzero(&af, sizeof(struct accept_filter_arg)); - olen = sizeof(struct accept_filter_arg); - - if (getsockopt(ls[i].fd, SOL_SOCKET, SO_ACCEPTFILTER, &af, &olen) - == -1) - { - err = ngx_socket_errno; - - if (err == NGX_EINVAL) { - continue; - } - - ngx_log_error(NGX_LOG_NOTICE, cycle->log, err, - "getsockopt(SO_ACCEPTFILTER) for %V failed, ignored", - &ls[i].addr_text); - continue; - } - - if (olen < sizeof(struct accept_filter_arg) || af.af_name[0] == '\0') { - continue; - } - - ls[i].accept_filter = ngx_palloc(cycle->pool, 16); - if (ls[i].accept_filter == NULL) { - return NGX_ERROR; - } - - (void) ngx_cpystrn((u_char *) ls[i].accept_filter, - (u_char *) af.af_name, 16); -#endif - -#if (NGX_HAVE_DEFERRED_ACCEPT && defined TCP_DEFER_ACCEPT) - - timeout = 0; - olen = sizeof(int); - - if (getsockopt(ls[i].fd, IPPROTO_TCP, TCP_DEFER_ACCEPT, &timeout, &olen) - == -1) - { - err = ngx_socket_errno; - - if (err == NGX_EOPNOTSUPP) { - continue; - } - - ngx_log_error(NGX_LOG_NOTICE, cycle->log, err, - "getsockopt(TCP_DEFER_ACCEPT) for %V failed, ignored", - &ls[i].addr_text); - continue; - } - - if (olen < sizeof(int) || timeout == 0) { - continue; - } - - ls[i].deferred_accept = 1; -#endif - } - - return NGX_OK; -} - - -ngx_int_t -ngx_open_listening_sockets(ngx_cycle_t *cycle) -{ - int reuseaddr; - ngx_uint_t i, tries, failed; - ngx_err_t err; - ngx_log_t *log; - ngx_socket_t s; - ngx_listening_t *ls; - - reuseaddr = 1; -#if (NGX_SUPPRESS_WARN) - failed = 0; -#endif - - log = cycle->log; - - /* TODO: configurable try number */ - - for (tries = 5; tries; tries--) { - failed = 0; - - /* for each listening socket */ - - ls = cycle->listening.elts; - for (i = 0; i < cycle->listening.nelts; i++) { - - if (ls[i].ignore) { - continue; - } - -#if (NGX_HAVE_REUSEPORT) - - if (ls[i].add_reuseport || ls[i].change_protocol) { - - /* - * to allow transition from a socket without SO_REUSEPORT - * to multiple sockets with SO_REUSEPORT, we have to set - * SO_REUSEPORT on the old socket before opening new ones - * - * to allow transition between different socket protocols - * (e.g. IPPROTO_MPTCP), SO_REUSEPORT is set on both old - * and new sockets - */ - - int reuseport = 1; - -#ifdef SO_REUSEPORT_LB - - if (setsockopt(ls[i].fd, SOL_SOCKET, SO_REUSEPORT_LB, - (const void *) &reuseport, sizeof(int)) - == -1) - { - ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_socket_errno, - "setsockopt(SO_REUSEPORT_LB) %V failed, " - "ignored", - &ls[i].addr_text); - } - -#else - - if (setsockopt(ls[i].fd, SOL_SOCKET, SO_REUSEPORT, - (const void *) &reuseport, sizeof(int)) - == -1) - { - ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_socket_errno, - "setsockopt(SO_REUSEPORT) %V failed, ignored", - &ls[i].addr_text); - } -#endif - - ls[i].add_reuseport = 0; - } -#endif - - if (ls[i].fd != (ngx_socket_t) -1 && !ls[i].change_protocol) { - continue; - } - - if (ls[i].inherited) { - - /* TODO: close on exit */ - /* TODO: nonblocking */ - /* TODO: deferred accept */ - - continue; - } - - s = ngx_socket(ls[i].sockaddr->sa_family, ls[i].type, - ls[i].protocol); - - if (s == (ngx_socket_t) -1) { - ngx_log_error(NGX_LOG_EMERG, log, ngx_socket_errno, - ngx_socket_n " %V failed", &ls[i].addr_text); - return NGX_ERROR; - } - - if (ls[i].type != SOCK_DGRAM || !ngx_test_config) { - - if (setsockopt(s, SOL_SOCKET, SO_REUSEADDR, - (const void *) &reuseaddr, sizeof(int)) - == -1) - { - ngx_log_error(NGX_LOG_EMERG, log, ngx_socket_errno, - "setsockopt(SO_REUSEADDR) %V failed", - &ls[i].addr_text); - - if (ngx_close_socket(s) == -1) { - ngx_log_error(NGX_LOG_EMERG, log, ngx_socket_errno, - ngx_close_socket_n " %V failed", - &ls[i].addr_text); - } - - return NGX_ERROR; - } - } - -#if (NGX_HAVE_REUSEPORT) - - if ((ls[i].reuseport || ls[i].change_protocol) - && !ngx_test_config) - { - int reuseport; - - reuseport = 1; - -#ifdef SO_REUSEPORT_LB - - if (setsockopt(s, SOL_SOCKET, SO_REUSEPORT_LB, - (const void *) &reuseport, sizeof(int)) - == -1) - { - ngx_log_error(NGX_LOG_EMERG, log, ngx_socket_errno, - "setsockopt(SO_REUSEPORT_LB) %V failed", - &ls[i].addr_text); - - if (ngx_close_socket(s) == -1) { - ngx_log_error(NGX_LOG_EMERG, log, ngx_socket_errno, - ngx_close_socket_n " %V failed", - &ls[i].addr_text); - } - - return NGX_ERROR; - } - -#else - - if (setsockopt(s, SOL_SOCKET, SO_REUSEPORT, - (const void *) &reuseport, sizeof(int)) - == -1) - { - ngx_log_error(NGX_LOG_EMERG, log, ngx_socket_errno, - "setsockopt(SO_REUSEPORT) %V failed", - &ls[i].addr_text); - - if (ngx_close_socket(s) == -1) { - ngx_log_error(NGX_LOG_EMERG, log, ngx_socket_errno, - ngx_close_socket_n " %V failed", - &ls[i].addr_text); - } - - return NGX_ERROR; - } -#endif - } -#endif - -#if (NGX_HAVE_INET6 && defined IPV6_V6ONLY) - - if (ls[i].sockaddr->sa_family == AF_INET6) { - int ipv6only; - - ipv6only = ls[i].ipv6only; - - if (setsockopt(s, IPPROTO_IPV6, IPV6_V6ONLY, - (const void *) &ipv6only, sizeof(int)) - == -1) - { - ngx_log_error(NGX_LOG_EMERG, log, ngx_socket_errno, - "setsockopt(IPV6_V6ONLY) %V failed, ignored", - &ls[i].addr_text); - } - } -#endif - /* TODO: close on exit */ - - if (!(ngx_event_flags & NGX_USE_IOCP_EVENT)) { - if (ngx_nonblocking(s) == -1) { - ngx_log_error(NGX_LOG_EMERG, log, ngx_socket_errno, - ngx_nonblocking_n " %V failed", - &ls[i].addr_text); - - if (ngx_close_socket(s) == -1) { - ngx_log_error(NGX_LOG_EMERG, log, ngx_socket_errno, - ngx_close_socket_n " %V failed", - &ls[i].addr_text); - } - - return NGX_ERROR; - } - } - - ngx_log_debug2(NGX_LOG_DEBUG_CORE, log, 0, - "bind() %V #%d ", &ls[i].addr_text, s); - - if (bind(s, ls[i].sockaddr, ls[i].socklen) == -1) { - err = ngx_socket_errno; - - if (err != NGX_EADDRINUSE || !ngx_test_config) { - ngx_log_error(NGX_LOG_EMERG, log, err, - "bind() to %V failed", &ls[i].addr_text); - } - - if (ngx_close_socket(s) == -1) { - ngx_log_error(NGX_LOG_EMERG, log, ngx_socket_errno, - ngx_close_socket_n " %V failed", - &ls[i].addr_text); - } - - if (err != NGX_EADDRINUSE) { - return NGX_ERROR; - } - - if (!ngx_test_config) { - failed = 1; - } - - continue; - } - -#if (NGX_HAVE_UNIX_DOMAIN) - - if (ls[i].sockaddr->sa_family == AF_UNIX) { - mode_t mode; - u_char *name; - - name = ls[i].addr_text.data + sizeof("unix:") - 1; - mode = (S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH); - - if (chmod((char *) name, mode) == -1) { - ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno, - "chmod() \"%s\" failed", name); - } - - if (ngx_test_config) { - if (ngx_delete_file(name) == NGX_FILE_ERROR) { - ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno, - ngx_delete_file_n " %s failed", name); - } - } - } -#endif - - if (ls[i].type != SOCK_STREAM) { - ls[i].fd = s; - ls[i].open = 1; - continue; - } - - if (listen(s, ls[i].backlog) == -1) { - err = ngx_socket_errno; - - /* - * on OpenVZ after suspend/resume EADDRINUSE - * may be returned by listen() instead of bind(), see - * https://bugs.openvz.org/browse/OVZ-5587 - */ - - if (err != NGX_EADDRINUSE || !ngx_test_config) { - ngx_log_error(NGX_LOG_EMERG, log, err, - "listen() to %V, backlog %d failed", - &ls[i].addr_text, ls[i].backlog); - } - - if (ngx_close_socket(s) == -1) { - ngx_log_error(NGX_LOG_EMERG, log, ngx_socket_errno, - ngx_close_socket_n " %V failed", - &ls[i].addr_text); - } - - if (err != NGX_EADDRINUSE) { - return NGX_ERROR; - } - - if (!ngx_test_config) { - failed = 1; - } - - continue; - } - - ls[i].listen = 1; - - ls[i].fd = s; - ls[i].open = 1; - } - - if (!failed) { - break; - } - - /* TODO: delay configurable */ - - ngx_log_error(NGX_LOG_NOTICE, log, 0, - "try again to bind() after 500ms"); - - ngx_msleep(500); - } - - if (failed) { - ngx_log_error(NGX_LOG_EMERG, log, 0, "still could not bind()"); - return NGX_ERROR; - } - - return NGX_OK; -} - - -void -ngx_configure_listening_sockets(ngx_cycle_t *cycle) -{ - int value; - ngx_uint_t i; - ngx_listening_t *ls; - -#if (NGX_HAVE_DEFERRED_ACCEPT && defined SO_ACCEPTFILTER) - struct accept_filter_arg af; -#endif - - ls = cycle->listening.elts; - for (i = 0; i < cycle->listening.nelts; i++) { - - ls[i].log = *ls[i].logp; - - if (ls[i].rcvbuf != -1) { - if (setsockopt(ls[i].fd, SOL_SOCKET, SO_RCVBUF, - (const void *) &ls[i].rcvbuf, sizeof(int)) - == -1) - { - ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_socket_errno, - "setsockopt(SO_RCVBUF, %d) %V failed, ignored", - ls[i].rcvbuf, &ls[i].addr_text); - } - } - - if (ls[i].sndbuf != -1) { - if (setsockopt(ls[i].fd, SOL_SOCKET, SO_SNDBUF, - (const void *) &ls[i].sndbuf, sizeof(int)) - == -1) - { - ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_socket_errno, - "setsockopt(SO_SNDBUF, %d) %V failed, ignored", - ls[i].sndbuf, &ls[i].addr_text); - } - } - - if (ls[i].keepalive) { - value = (ls[i].keepalive == 1) ? 1 : 0; - - if (setsockopt(ls[i].fd, SOL_SOCKET, SO_KEEPALIVE, - (const void *) &value, sizeof(int)) - == -1) - { - ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_socket_errno, - "setsockopt(SO_KEEPALIVE, %d) %V failed, ignored", - value, &ls[i].addr_text); - } - } - -#if (NGX_HAVE_KEEPALIVE_TUNABLE) - -#if !(NGX_DARWIN) - - if (ls[i].keepidle) { - value = ls[i].keepidle; - -#if (NGX_KEEPALIVE_FACTOR) - value *= NGX_KEEPALIVE_FACTOR; -#endif - - if (setsockopt(ls[i].fd, IPPROTO_TCP, TCP_KEEPIDLE, - (const void *) &value, sizeof(int)) - == -1) - { - ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_socket_errno, - "setsockopt(TCP_KEEPIDLE, %d) %V failed, ignored", - value, &ls[i].addr_text); - } - } - -#endif - - if (ls[i].keepintvl) { - value = ls[i].keepintvl; - -#if (NGX_KEEPALIVE_FACTOR) - value *= NGX_KEEPALIVE_FACTOR; -#endif - - if (setsockopt(ls[i].fd, IPPROTO_TCP, TCP_KEEPINTVL, - (const void *) &value, sizeof(int)) - == -1) - { - ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_socket_errno, - "setsockopt(TCP_KEEPINTVL, %d) %V failed, ignored", - value, &ls[i].addr_text); - } - } - - if (ls[i].keepcnt) { - if (setsockopt(ls[i].fd, IPPROTO_TCP, TCP_KEEPCNT, - (const void *) &ls[i].keepcnt, sizeof(int)) - == -1) - { - ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_socket_errno, - "setsockopt(TCP_KEEPCNT, %d) %V failed, ignored", - ls[i].keepcnt, &ls[i].addr_text); - } - } - -#endif - -#if (NGX_HAVE_SETFIB) - if (ls[i].setfib != -1) { - if (setsockopt(ls[i].fd, SOL_SOCKET, SO_SETFIB, - (const void *) &ls[i].setfib, sizeof(int)) - == -1) - { - ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_socket_errno, - "setsockopt(SO_SETFIB, %d) %V failed, ignored", - ls[i].setfib, &ls[i].addr_text); - } - } -#endif - -#if (NGX_HAVE_TCP_FASTOPEN) - if (ls[i].fastopen != -1) { - if (setsockopt(ls[i].fd, IPPROTO_TCP, TCP_FASTOPEN, - (const void *) &ls[i].fastopen, sizeof(int)) - == -1) - { - ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_socket_errno, - "setsockopt(TCP_FASTOPEN, %d) %V failed, ignored", - ls[i].fastopen, &ls[i].addr_text); - } - } -#endif - -#if 0 - if (1) { - int tcp_nodelay = 1; - - if (setsockopt(ls[i].fd, IPPROTO_TCP, TCP_NODELAY, - (const void *) &tcp_nodelay, sizeof(int)) - == -1) - { - ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_socket_errno, - "setsockopt(TCP_NODELAY) %V failed, ignored", - &ls[i].addr_text); - } - } -#endif - - if (ls[i].listen) { - - /* change backlog via listen() */ - - if (listen(ls[i].fd, ls[i].backlog) == -1) { - ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_socket_errno, - "listen() to %V, backlog %d failed, ignored", - &ls[i].addr_text, ls[i].backlog); - } - } - - /* - * setting deferred mode should be last operation on socket, - * because code may prematurely continue cycle on failure - */ - -#if (NGX_HAVE_DEFERRED_ACCEPT) - -#ifdef SO_ACCEPTFILTER - - if (ls[i].delete_deferred) { - if (setsockopt(ls[i].fd, SOL_SOCKET, SO_ACCEPTFILTER, NULL, 0) - == -1) - { - ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_socket_errno, - "setsockopt(SO_ACCEPTFILTER, NULL) " - "for %V failed, ignored", - &ls[i].addr_text); - - if (ls[i].accept_filter) { - ngx_log_error(NGX_LOG_ALERT, cycle->log, 0, - "could not change the accept filter " - "to \"%s\" for %V, ignored", - ls[i].accept_filter, &ls[i].addr_text); - } - - continue; - } - - ls[i].deferred_accept = 0; - } - - if (ls[i].add_deferred) { - ngx_memzero(&af, sizeof(struct accept_filter_arg)); - (void) ngx_cpystrn((u_char *) af.af_name, - (u_char *) ls[i].accept_filter, 16); - - if (setsockopt(ls[i].fd, SOL_SOCKET, SO_ACCEPTFILTER, - &af, sizeof(struct accept_filter_arg)) - == -1) - { - ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_socket_errno, - "setsockopt(SO_ACCEPTFILTER, \"%s\") " - "for %V failed, ignored", - ls[i].accept_filter, &ls[i].addr_text); - continue; - } - - ls[i].deferred_accept = 1; - } - -#endif - -#ifdef TCP_DEFER_ACCEPT - - if (ls[i].add_deferred || ls[i].delete_deferred) { - - if (ls[i].add_deferred) { - /* - * There is no way to find out how long a connection was - * in queue (and a connection may bypass deferred queue at all - * if syncookies were used), hence we use 1 second timeout - * here. - */ - value = 1; - - } else { - value = 0; - } - - if (setsockopt(ls[i].fd, IPPROTO_TCP, TCP_DEFER_ACCEPT, - &value, sizeof(int)) - == -1) - { - ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_socket_errno, - "setsockopt(TCP_DEFER_ACCEPT, %d) for %V failed, " - "ignored", - value, &ls[i].addr_text); - - continue; - } - } - - if (ls[i].add_deferred) { - ls[i].deferred_accept = 1; - } - -#endif - -#endif /* NGX_HAVE_DEFERRED_ACCEPT */ - -#if (NGX_HAVE_IP_RECVDSTADDR) - - if (ls[i].wildcard - && ls[i].type == SOCK_DGRAM - && ls[i].sockaddr->sa_family == AF_INET) - { - value = 1; - - if (setsockopt(ls[i].fd, IPPROTO_IP, IP_RECVDSTADDR, - (const void *) &value, sizeof(int)) - == -1) - { - ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_socket_errno, - "setsockopt(IP_RECVDSTADDR) " - "for %V failed, ignored", - &ls[i].addr_text); - } - } - -#elif (NGX_HAVE_IP_PKTINFO) - - if (ls[i].wildcard - && ls[i].type == SOCK_DGRAM - && ls[i].sockaddr->sa_family == AF_INET) - { - value = 1; - - if (setsockopt(ls[i].fd, IPPROTO_IP, IP_PKTINFO, - (const void *) &value, sizeof(int)) - == -1) - { - ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_socket_errno, - "setsockopt(IP_PKTINFO) " - "for %V failed, ignored", - &ls[i].addr_text); - } - } - -#endif - -#if (NGX_HAVE_INET6 && NGX_HAVE_IPV6_RECVPKTINFO) - - if (ls[i].wildcard - && ls[i].type == SOCK_DGRAM - && ls[i].sockaddr->sa_family == AF_INET6) - { - value = 1; - - if (setsockopt(ls[i].fd, IPPROTO_IPV6, IPV6_RECVPKTINFO, - (const void *) &value, sizeof(int)) - == -1) - { - ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_socket_errno, - "setsockopt(IPV6_RECVPKTINFO) " - "for %V failed, ignored", - &ls[i].addr_text); - } - } - -#endif - -#if (NGX_HAVE_IP_MTU_DISCOVER) - - if (ls[i].quic && ls[i].sockaddr->sa_family == AF_INET) { - value = IP_PMTUDISC_DO; - - if (setsockopt(ls[i].fd, IPPROTO_IP, IP_MTU_DISCOVER, - (const void *) &value, sizeof(int)) - == -1) - { - ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_socket_errno, - "setsockopt(IP_MTU_DISCOVER) " - "for %V failed, ignored", - &ls[i].addr_text); - } - } - -#elif (NGX_HAVE_IP_DONTFRAG) - - if (ls[i].quic && ls[i].sockaddr->sa_family == AF_INET) { - value = 1; - - if (setsockopt(ls[i].fd, IPPROTO_IP, IP_DONTFRAG, - (const void *) &value, sizeof(int)) - == -1) - { - ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_socket_errno, - "setsockopt(IP_DONTFRAG) " - "for %V failed, ignored", - &ls[i].addr_text); - } - } - -#endif - -#if (NGX_HAVE_INET6) - -#if (NGX_HAVE_IPV6_MTU_DISCOVER) - - if (ls[i].quic && ls[i].sockaddr->sa_family == AF_INET6) { - value = IPV6_PMTUDISC_DO; - - if (setsockopt(ls[i].fd, IPPROTO_IPV6, IPV6_MTU_DISCOVER, - (const void *) &value, sizeof(int)) - == -1) - { - ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_socket_errno, - "setsockopt(IPV6_MTU_DISCOVER) " - "for %V failed, ignored", - &ls[i].addr_text); - } - } - -#elif (NGX_HAVE_IP_DONTFRAG) - - if (ls[i].quic && ls[i].sockaddr->sa_family == AF_INET6) { - value = 1; - - if (setsockopt(ls[i].fd, IPPROTO_IPV6, IPV6_DONTFRAG, - (const void *) &value, sizeof(int)) - == -1) - { - ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_socket_errno, - "setsockopt(IPV6_DONTFRAG) " - "for %V failed, ignored", - &ls[i].addr_text); - } - } - -#endif - -#endif - } - - return; -} - - -void -ngx_close_listening_sockets(ngx_cycle_t *cycle) -{ - ngx_uint_t i; - ngx_listening_t *ls; - ngx_connection_t *c; - - if (ngx_event_flags & NGX_USE_IOCP_EVENT) { - return; - } - - ngx_accept_mutex_held = 0; - ngx_use_accept_mutex = 0; - - ls = cycle->listening.elts; - for (i = 0; i < cycle->listening.nelts; i++) { - -#if (NGX_QUIC) - if (ls[i].quic) { - continue; - } -#endif - - c = ls[i].connection; - - if (c) { - if (c->read->active) { - if (ngx_event_flags & NGX_USE_EPOLL_EVENT) { - - /* - * it seems that Linux-2.6.x OpenVZ sends events - * for closed shared listening sockets unless - * the events was explicitly deleted - */ - - ngx_del_event(c->read, NGX_READ_EVENT, 0); - - } else { - ngx_del_event(c->read, NGX_READ_EVENT, NGX_CLOSE_EVENT); - } - } - - ngx_free_connection(c); - - c->fd = (ngx_socket_t) -1; - } - - ngx_log_debug2(NGX_LOG_DEBUG_CORE, cycle->log, 0, - "close listening %V #%d ", &ls[i].addr_text, ls[i].fd); - - if (ngx_close_socket(ls[i].fd) == -1) { - ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_socket_errno, - ngx_close_socket_n " %V failed", &ls[i].addr_text); - } - -#if (NGX_HAVE_UNIX_DOMAIN) - - if (ls[i].sockaddr->sa_family == AF_UNIX - && ngx_process <= NGX_PROCESS_MASTER - && ngx_new_binary == 0 - && (!ls[i].inherited || ngx_getppid() != ngx_parent)) - { - u_char *name = ls[i].addr_text.data + sizeof("unix:") - 1; - - if (ngx_delete_file(name) == NGX_FILE_ERROR) { - ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_socket_errno, - ngx_delete_file_n " %s failed", name); - } - } - -#endif - - ls[i].fd = (ngx_socket_t) -1; - } - - cycle->listening.nelts = 0; -} - - -ngx_connection_t * -ngx_get_connection(ngx_socket_t s, ngx_log_t *log) -{ - ngx_uint_t instance; - ngx_event_t *rev, *wev; - ngx_connection_t *c; - - /* disable warning: Win32 SOCKET is u_int while UNIX socket is int */ - - if (ngx_cycle->files && (ngx_uint_t) s >= ngx_cycle->files_n) { - ngx_log_error(NGX_LOG_ALERT, log, 0, - "the new socket has number %d, " - "but only %ui files are available", - s, ngx_cycle->files_n); - return NULL; - } - - ngx_drain_connections((ngx_cycle_t *) ngx_cycle); - - c = ngx_cycle->free_connections; - - if (c == NULL) { - ngx_log_error(NGX_LOG_ALERT, log, 0, - "%ui worker_connections are not enough", - ngx_cycle->connection_n); - - return NULL; - } - - ngx_cycle->free_connections = c->data; - ngx_cycle->free_connection_n--; - - if (ngx_cycle->files && ngx_cycle->files[s] == NULL) { - ngx_cycle->files[s] = c; - } - - rev = c->read; - wev = c->write; - - ngx_memzero(c, sizeof(ngx_connection_t)); - - c->read = rev; - c->write = wev; - c->fd = s; - c->log = log; - - instance = rev->instance; - - ngx_memzero(rev, sizeof(ngx_event_t)); - ngx_memzero(wev, sizeof(ngx_event_t)); - - rev->instance = !instance; - wev->instance = !instance; - - rev->index = NGX_INVALID_INDEX; - wev->index = NGX_INVALID_INDEX; - - rev->data = c; - wev->data = c; - - wev->write = 1; - - return c; -} - - -void -ngx_free_connection(ngx_connection_t *c) -{ - c->data = ngx_cycle->free_connections; - ngx_cycle->free_connections = c; - ngx_cycle->free_connection_n++; - - if (ngx_cycle->files && ngx_cycle->files[c->fd] == c) { - ngx_cycle->files[c->fd] = NULL; - } -} - - -void -ngx_close_connection(ngx_connection_t *c) -{ - ngx_err_t err; - ngx_uint_t log_error, level; - ngx_socket_t fd; - - if (c->fd == (ngx_socket_t) -1) { - ngx_log_error(NGX_LOG_ALERT, c->log, 0, "connection already closed"); - return; - } - - if (c->read->timer_set) { - ngx_del_timer(c->read); - } - - if (c->write->timer_set) { - ngx_del_timer(c->write); - } - - if (!c->shared) { - if (ngx_del_conn) { - ngx_del_conn(c, NGX_CLOSE_EVENT); - - } else { - if (c->read->active || c->read->disabled) { - ngx_del_event(c->read, NGX_READ_EVENT, NGX_CLOSE_EVENT); - } - - if (c->write->active || c->write->disabled) { - ngx_del_event(c->write, NGX_WRITE_EVENT, NGX_CLOSE_EVENT); - } - } - } - - if (c->read->posted) { - ngx_delete_posted_event(c->read); - } - - if (c->write->posted) { - ngx_delete_posted_event(c->write); - } - - c->read->closed = 1; - c->write->closed = 1; - - ngx_reusable_connection(c, 0); - - log_error = c->log_error; - - ngx_free_connection(c); - - fd = c->fd; - c->fd = (ngx_socket_t) -1; - - if (c->shared) { - return; - } - - if (ngx_close_socket(fd) == -1) { - - err = ngx_socket_errno; - - if (err == NGX_ECONNRESET || err == NGX_ENOTCONN) { - - switch (log_error) { - - case NGX_ERROR_INFO: - level = NGX_LOG_INFO; - break; - - case NGX_ERROR_ERR: - level = NGX_LOG_ERR; - break; - - default: - level = NGX_LOG_CRIT; - } - - } else { - level = NGX_LOG_CRIT; - } - - ngx_log_error(level, c->log, err, ngx_close_socket_n " %d failed", fd); - } -} - - -void -ngx_reusable_connection(ngx_connection_t *c, ngx_uint_t reusable) -{ - ngx_log_debug1(NGX_LOG_DEBUG_CORE, c->log, 0, - "reusable connection: %ui", reusable); - - if (c->reusable) { - ngx_queue_remove(&c->queue); - ngx_cycle->reusable_connections_n--; - -#if (NGX_STAT_STUB) - (void) ngx_atomic_fetch_add(ngx_stat_waiting, -1); -#endif - } - - c->reusable = reusable; - - if (reusable) { - /* need cast as ngx_cycle is volatile */ - - ngx_queue_insert_head( - (ngx_queue_t *) &ngx_cycle->reusable_connections_queue, &c->queue); - ngx_cycle->reusable_connections_n++; - -#if (NGX_STAT_STUB) - (void) ngx_atomic_fetch_add(ngx_stat_waiting, 1); -#endif - } -} - - -static void -ngx_drain_connections(ngx_cycle_t *cycle) -{ - ngx_uint_t i, n; - ngx_queue_t *q; - ngx_connection_t *c; - - if (cycle->free_connection_n > cycle->connection_n / 16 - || cycle->reusable_connections_n == 0) - { - return; - } - - if (cycle->connections_reuse_time != ngx_time()) { - cycle->connections_reuse_time = ngx_time(); - - ngx_log_error(NGX_LOG_WARN, cycle->log, 0, - "%ui worker_connections are not enough, " - "reusing connections", - cycle->connection_n); - } - - c = NULL; - n = ngx_max(ngx_min(32, cycle->reusable_connections_n / 8), 1); - - for (i = 0; i < n; i++) { - if (ngx_queue_empty(&cycle->reusable_connections_queue)) { - break; - } - - q = ngx_queue_last(&cycle->reusable_connections_queue); - c = ngx_queue_data(q, ngx_connection_t, queue); - - ngx_log_debug0(NGX_LOG_DEBUG_CORE, c->log, 0, - "reusing connection"); - - c->close = 1; - c->read->handler(c->read); - } - - if (cycle->free_connection_n == 0 && c && c->reusable) { - - /* - * if no connections were freed, try to reuse the last - * connection again: this should free it as long as - * previous reuse moved it to lingering close - */ - - ngx_log_debug0(NGX_LOG_DEBUG_CORE, c->log, 0, - "reusing connection again"); - - c->close = 1; - c->read->handler(c->read); - } -} - - -void -ngx_close_idle_connections(ngx_cycle_t *cycle) -{ - ngx_uint_t i; - ngx_connection_t *c; - - c = cycle->connections; - - for (i = 0; i < cycle->connection_n; i++) { - - /* THREAD: lock */ - - if (c[i].fd != (ngx_socket_t) -1 && c[i].idle) { - c[i].close = 1; - c[i].read->handler(c[i].read); - } - } -} - - -ngx_int_t -ngx_connection_local_sockaddr(ngx_connection_t *c, ngx_str_t *s, - ngx_uint_t port) -{ - socklen_t len; - ngx_uint_t addr; - ngx_sockaddr_t sa; - struct sockaddr_in *sin; -#if (NGX_HAVE_INET6) - ngx_uint_t i; - struct sockaddr_in6 *sin6; -#endif - - addr = 0; - - if (c->local_socklen) { - switch (c->local_sockaddr->sa_family) { - -#if (NGX_HAVE_INET6) - case AF_INET6: - sin6 = (struct sockaddr_in6 *) c->local_sockaddr; - - for (i = 0; addr == 0 && i < 16; i++) { - addr |= sin6->sin6_addr.s6_addr[i]; - } - - break; -#endif - -#if (NGX_HAVE_UNIX_DOMAIN) - case AF_UNIX: - addr = 1; - break; -#endif - - default: /* AF_INET */ - sin = (struct sockaddr_in *) c->local_sockaddr; - addr = sin->sin_addr.s_addr; - break; - } - } - - if (addr == 0) { - - len = sizeof(ngx_sockaddr_t); - - if (getsockname(c->fd, &sa.sockaddr, &len) == -1) { - ngx_connection_error(c, ngx_socket_errno, "getsockname() failed"); - return NGX_ERROR; - } - - c->local_sockaddr = ngx_palloc(c->pool, len); - if (c->local_sockaddr == NULL) { - return NGX_ERROR; - } - - ngx_memcpy(c->local_sockaddr, &sa, len); - - c->local_socklen = len; - } - - if (s == NULL) { - return NGX_OK; - } - - s->len = ngx_sock_ntop(c->local_sockaddr, c->local_socklen, - s->data, s->len, port); - - return NGX_OK; -} - - -ngx_int_t -ngx_tcp_nodelay(ngx_connection_t *c) -{ - int tcp_nodelay; - - if (c->tcp_nodelay != NGX_TCP_NODELAY_UNSET) { - return NGX_OK; - } - - ngx_log_debug0(NGX_LOG_DEBUG_CORE, c->log, 0, "tcp_nodelay"); - - tcp_nodelay = 1; - - if (setsockopt(c->fd, IPPROTO_TCP, TCP_NODELAY, - (const void *) &tcp_nodelay, sizeof(int)) - == -1) - { -#if (NGX_SOLARIS) - if (c->log_error == NGX_ERROR_INFO) { - - /* Solaris returns EINVAL if a socket has been shut down */ - c->log_error = NGX_ERROR_IGNORE_EINVAL; - - ngx_connection_error(c, ngx_socket_errno, - "setsockopt(TCP_NODELAY) failed"); - - c->log_error = NGX_ERROR_INFO; - - return NGX_ERROR; - } -#endif - - ngx_connection_error(c, ngx_socket_errno, - "setsockopt(TCP_NODELAY) failed"); - return NGX_ERROR; - } - - c->tcp_nodelay = NGX_TCP_NODELAY_SET; - - return NGX_OK; -} - - -ngx_int_t -ngx_connection_error(ngx_connection_t *c, ngx_err_t err, char *text) -{ - ngx_uint_t level; - - /* Winsock may return NGX_ECONNABORTED instead of NGX_ECONNRESET */ - - if ((err == NGX_ECONNRESET -#if (NGX_WIN32) - || err == NGX_ECONNABORTED -#endif - ) && c->log_error == NGX_ERROR_IGNORE_ECONNRESET) - { - return 0; - } - -#if (NGX_SOLARIS) - if (err == NGX_EINVAL && c->log_error == NGX_ERROR_IGNORE_EINVAL) { - return 0; - } -#endif - - if (err == NGX_EMSGSIZE && c->log_error == NGX_ERROR_IGNORE_EMSGSIZE) { - return 0; - } - - if (err == 0 - || err == NGX_ECONNRESET -#if (NGX_WIN32) - || err == NGX_ECONNABORTED -#else - || err == NGX_EPIPE -#endif - || err == NGX_ENOTCONN - || err == NGX_ETIMEDOUT - || err == NGX_ECONNREFUSED - || err == NGX_ENETDOWN - || err == NGX_ENETUNREACH - || err == NGX_EHOSTDOWN - || err == NGX_EHOSTUNREACH) - { - switch (c->log_error) { - - case NGX_ERROR_IGNORE_EMSGSIZE: - case NGX_ERROR_IGNORE_EINVAL: - case NGX_ERROR_IGNORE_ECONNRESET: - case NGX_ERROR_INFO: - level = NGX_LOG_INFO; - break; - - default: - level = NGX_LOG_ERR; - } - - } else { - level = NGX_LOG_ALERT; - } - - ngx_log_error(level, c->log, err, text); - - return NGX_ERROR; -} diff --git a/src/deps/src/nginx-1.30.3/src/core/ngx_connection.h b/src/deps/src/nginx-1.30.3/src/core/ngx_connection.h deleted file mode 100644 index b7d2368374..0000000000 --- a/src/deps/src/nginx-1.30.3/src/core/ngx_connection.h +++ /dev/null @@ -1,239 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#ifndef _NGX_CONNECTION_H_INCLUDED_ -#define _NGX_CONNECTION_H_INCLUDED_ - - -#include -#include - - -typedef struct ngx_listening_s ngx_listening_t; - -struct ngx_listening_s { - ngx_socket_t fd; - - struct sockaddr *sockaddr; - socklen_t socklen; /* size of sockaddr */ - size_t addr_text_max_len; - ngx_str_t addr_text; - - int type; - int protocol; - - int backlog; - int rcvbuf; - int sndbuf; -#if (NGX_HAVE_KEEPALIVE_TUNABLE) - int keepidle; - int keepintvl; - int keepcnt; -#endif - - /* handler of accepted connection */ - ngx_connection_handler_pt handler; - - void *servers; /* array of ngx_http_in_addr_t, for example */ - - ngx_log_t log; - ngx_log_t *logp; - - size_t pool_size; - /* should be here because of the AcceptEx() preread */ - size_t post_accept_buffer_size; - - ngx_listening_t *previous; - ngx_connection_t *connection; - - ngx_rbtree_t rbtree; - ngx_rbtree_node_t sentinel; - - ngx_uint_t worker; - - unsigned open:1; - unsigned remain:1; - unsigned ignore:1; - - unsigned bound:1; /* already bound */ - unsigned inherited:1; /* inherited from previous process */ - unsigned nonblocking_accept:1; - unsigned listen:1; - unsigned nonblocking:1; - unsigned shared:1; /* shared between threads or processes */ - unsigned addr_ntop:1; - unsigned wildcard:1; - -#if (NGX_HAVE_INET6) - unsigned ipv6only:1; -#endif - unsigned reuseport:1; - unsigned add_reuseport:1; - unsigned keepalive:2; - unsigned quic:1; - - unsigned change_protocol:1; - - unsigned deferred_accept:1; - unsigned delete_deferred:1; - unsigned add_deferred:1; -#if (NGX_HAVE_DEFERRED_ACCEPT && defined SO_ACCEPTFILTER) - char *accept_filter; -#endif -#if (NGX_HAVE_SETFIB) - int setfib; -#endif - -#if (NGX_HAVE_TCP_FASTOPEN) - int fastopen; -#endif - -}; - - -typedef enum { - NGX_ERROR_ALERT = 0, - NGX_ERROR_ERR, - NGX_ERROR_INFO, - NGX_ERROR_IGNORE_ECONNRESET, - NGX_ERROR_IGNORE_EINVAL, - NGX_ERROR_IGNORE_EMSGSIZE -} ngx_connection_log_error_e; - - -typedef enum { - NGX_TCP_NODELAY_UNSET = 0, - NGX_TCP_NODELAY_SET, - NGX_TCP_NODELAY_DISABLED -} ngx_connection_tcp_nodelay_e; - - -typedef enum { - NGX_TCP_NOPUSH_UNSET = 0, - NGX_TCP_NOPUSH_SET, - NGX_TCP_NOPUSH_DISABLED -} ngx_connection_tcp_nopush_e; - - -#define NGX_LOWLEVEL_BUFFERED 0x0f -#define NGX_SSL_BUFFERED 0x01 -#define NGX_HTTP_V2_BUFFERED 0x02 - - -struct ngx_connection_s { - void *data; - ngx_event_t *read; - ngx_event_t *write; - - ngx_socket_t fd; - - ngx_recv_pt recv; - ngx_send_pt send; - ngx_recv_chain_pt recv_chain; - ngx_send_chain_pt send_chain; - - ngx_listening_t *listening; - - off_t sent; - - ngx_log_t *log; - - ngx_pool_t *pool; - - int type; - - struct sockaddr *sockaddr; - socklen_t socklen; - ngx_str_t addr_text; - - ngx_proxy_protocol_t *proxy_protocol; - -#if (NGX_QUIC || NGX_COMPAT) - ngx_quic_stream_t *quic; -#endif - -#if (NGX_SSL || NGX_COMPAT) - ngx_ssl_connection_t *ssl; -#endif - - ngx_udp_connection_t *udp; - - struct sockaddr *local_sockaddr; - socklen_t local_socklen; - - ngx_buf_t *buffer; - - ngx_queue_t queue; - - ngx_atomic_uint_t number; - - ngx_msec_t start_time; - ngx_uint_t requests; - - unsigned buffered:8; - - unsigned log_error:3; /* ngx_connection_log_error_e */ - - unsigned timedout:1; - unsigned error:1; - unsigned destroyed:1; - unsigned pipeline:1; - - unsigned idle:1; - unsigned reusable:1; - unsigned close:1; - unsigned shared:1; - - unsigned sendfile:1; - unsigned sndlowat:1; - unsigned tcp_nodelay:2; /* ngx_connection_tcp_nodelay_e */ - unsigned tcp_nopush:2; /* ngx_connection_tcp_nopush_e */ - - unsigned need_last_buf:1; - unsigned need_flush_buf:1; - -#if (NGX_HAVE_SENDFILE_NODISKIO || NGX_COMPAT) - unsigned busy_count:2; -#endif - -#if (NGX_THREADS || NGX_COMPAT) - ngx_thread_task_t *sendfile_task; -#endif -}; - - -#define ngx_set_connection_log(c, l) \ - \ - c->log->file = l->file; \ - c->log->next = l->next; \ - c->log->writer = l->writer; \ - c->log->wdata = l->wdata; \ - if (!(c->log->log_level & NGX_LOG_DEBUG_CONNECTION)) { \ - c->log->log_level = l->log_level; \ - } - - -ngx_listening_t *ngx_create_listening(ngx_conf_t *cf, struct sockaddr *sockaddr, - socklen_t socklen); -ngx_int_t ngx_clone_listening(ngx_cycle_t *cycle, ngx_listening_t *ls); -ngx_int_t ngx_set_inherited_sockets(ngx_cycle_t *cycle); -ngx_int_t ngx_open_listening_sockets(ngx_cycle_t *cycle); -void ngx_configure_listening_sockets(ngx_cycle_t *cycle); -void ngx_close_listening_sockets(ngx_cycle_t *cycle); -void ngx_close_connection(ngx_connection_t *c); -void ngx_close_idle_connections(ngx_cycle_t *cycle); -ngx_int_t ngx_connection_local_sockaddr(ngx_connection_t *c, ngx_str_t *s, - ngx_uint_t port); -ngx_int_t ngx_tcp_nodelay(ngx_connection_t *c); -ngx_int_t ngx_connection_error(ngx_connection_t *c, ngx_err_t err, char *text); - -ngx_connection_t *ngx_get_connection(ngx_socket_t s, ngx_log_t *log); -void ngx_free_connection(ngx_connection_t *c); - -void ngx_reusable_connection(ngx_connection_t *c, ngx_uint_t reusable); - -#endif /* _NGX_CONNECTION_H_INCLUDED_ */ diff --git a/src/deps/src/nginx-1.30.3/src/core/ngx_core.h b/src/deps/src/nginx-1.30.3/src/core/ngx_core.h deleted file mode 100644 index 02890b843a..0000000000 --- a/src/deps/src/nginx-1.30.3/src/core/ngx_core.h +++ /dev/null @@ -1,121 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#ifndef _NGX_CORE_H_INCLUDED_ -#define _NGX_CORE_H_INCLUDED_ - - -#include - - -typedef struct ngx_module_s ngx_module_t; -typedef struct ngx_conf_s ngx_conf_t; -typedef struct ngx_cycle_s ngx_cycle_t; -typedef struct ngx_pool_s ngx_pool_t; -typedef struct ngx_chain_s ngx_chain_t; -typedef struct ngx_log_s ngx_log_t; -typedef struct ngx_open_file_s ngx_open_file_t; -typedef struct ngx_command_s ngx_command_t; -typedef struct ngx_file_s ngx_file_t; -typedef struct ngx_event_s ngx_event_t; -typedef struct ngx_event_aio_s ngx_event_aio_t; -typedef struct ngx_connection_s ngx_connection_t; -typedef struct ngx_thread_task_s ngx_thread_task_t; -typedef struct ngx_ssl_s ngx_ssl_t; -typedef struct ngx_ssl_cache_s ngx_ssl_cache_t; -typedef struct ngx_proxy_protocol_s ngx_proxy_protocol_t; -typedef struct ngx_quic_stream_s ngx_quic_stream_t; -typedef struct ngx_ssl_connection_s ngx_ssl_connection_t; -typedef struct ngx_udp_connection_s ngx_udp_connection_t; - -typedef void (*ngx_event_handler_pt)(ngx_event_t *ev); -typedef void (*ngx_connection_handler_pt)(ngx_connection_t *c); - - -#define NGX_OK 0 -#define NGX_ERROR -1 -#define NGX_AGAIN -2 -#define NGX_BUSY -3 -#define NGX_DONE -4 -#define NGX_DECLINED -5 -#define NGX_ABORT -6 - - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#if (NGX_PCRE) -#include -#endif -#include -#include -#include -#include -#include -#include -#include -#include -#if (NGX_OPENSSL) -#include -#if (NGX_QUIC) -#include -#endif -#endif -#include -#include -#include -#include -#include -#include -#include -#include -#if (NGX_HAVE_BPF) -#include -#endif - - -#define LF (u_char) '\n' -#define CR (u_char) '\r' -#define CRLF "\r\n" - - -#define ngx_abs(value) (((value) >= 0) ? (value) : - (value)) -#define ngx_max(val1, val2) ((val1 < val2) ? (val2) : (val1)) -#define ngx_min(val1, val2) ((val1 > val2) ? (val2) : (val1)) - -void ngx_cpuinfo(void); - -#if (NGX_HAVE_OPENAT) -#define NGX_DISABLE_SYMLINKS_OFF 0 -#define NGX_DISABLE_SYMLINKS_ON 1 -#define NGX_DISABLE_SYMLINKS_NOTOWNER 2 -#endif - -#endif /* _NGX_CORE_H_INCLUDED_ */ diff --git a/src/deps/src/nginx-1.30.3/src/core/ngx_cpuinfo.c b/src/deps/src/nginx-1.30.3/src/core/ngx_cpuinfo.c deleted file mode 100644 index 72053192ff..0000000000 --- a/src/deps/src/nginx-1.30.3/src/core/ngx_cpuinfo.c +++ /dev/null @@ -1,139 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#include -#include - - -#if (( __i386__ || __amd64__ ) && ( __GNUC__ || __INTEL_COMPILER )) - - -static ngx_inline void ngx_cpuid(uint32_t i, uint32_t *buf); - - -#if ( __i386__ ) - -static ngx_inline void -ngx_cpuid(uint32_t i, uint32_t *buf) -{ - - /* - * we could not use %ebx as output parameter if gcc builds PIC, - * and we could not save %ebx on stack, because %esp is used, - * when the -fomit-frame-pointer optimization is specified. - */ - - __asm__ ( - - " mov %%ebx, %%esi; " - - " cpuid; " - " mov %%eax, (%1); " - " mov %%ebx, 4(%1); " - " mov %%edx, 8(%1); " - " mov %%ecx, 12(%1); " - - " mov %%esi, %%ebx; " - - : : "a" (i), "D" (buf) : "ecx", "edx", "esi", "memory" ); -} - - -#else /* __amd64__ */ - - -static ngx_inline void -ngx_cpuid(uint32_t i, uint32_t *buf) -{ - uint32_t eax, ebx, ecx, edx; - - __asm__ ( - - "cpuid" - - : "=a" (eax), "=b" (ebx), "=c" (ecx), "=d" (edx) : "a" (i) ); - - buf[0] = eax; - buf[1] = ebx; - buf[2] = edx; - buf[3] = ecx; -} - - -#endif - - -/* auto detect the L2 cache line size of modern and widespread CPUs */ - -void -ngx_cpuinfo(void) -{ - u_char *vendor; - uint32_t vbuf[5], cpu[4], model; - - vbuf[0] = 0; - vbuf[1] = 0; - vbuf[2] = 0; - vbuf[3] = 0; - vbuf[4] = 0; - - ngx_cpuid(0, vbuf); - - vendor = (u_char *) &vbuf[1]; - - if (vbuf[0] == 0) { - return; - } - - ngx_cpuid(1, cpu); - - if (ngx_strcmp(vendor, "GenuineIntel") == 0) { - - switch ((cpu[0] & 0xf00) >> 8) { - - /* Pentium */ - case 5: - ngx_cacheline_size = 32; - break; - - /* Pentium Pro, II, III */ - case 6: - ngx_cacheline_size = 32; - - model = ((cpu[0] & 0xf0000) >> 8) | (cpu[0] & 0xf0); - - if (model >= 0xd0) { - /* Intel Core, Core 2, Atom */ - ngx_cacheline_size = 64; - } - - break; - - /* - * Pentium 4, although its cache line size is 64 bytes, - * it prefetches up to two cache lines during memory read - */ - case 15: - ngx_cacheline_size = 128; - break; - } - - } else if (ngx_strcmp(vendor, "AuthenticAMD") == 0) { - ngx_cacheline_size = 64; - } -} - -#else - - -void -ngx_cpuinfo(void) -{ -} - - -#endif diff --git a/src/deps/src/nginx-1.30.3/src/core/ngx_crc.h b/src/deps/src/nginx-1.30.3/src/core/ngx_crc.h deleted file mode 100644 index 35981bc15a..0000000000 --- a/src/deps/src/nginx-1.30.3/src/core/ngx_crc.h +++ /dev/null @@ -1,39 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#ifndef _NGX_CRC_H_INCLUDED_ -#define _NGX_CRC_H_INCLUDED_ - - -#include -#include - - -/* 32-bit crc16 */ - -static ngx_inline uint32_t -ngx_crc(u_char *data, size_t len) -{ - uint32_t sum; - - for (sum = 0; len; len--) { - - /* - * gcc 2.95.2 x86 and icc 7.1.006 compile - * that operator into the single "rol" opcode, - * msvc 6.0sp2 compiles it into four opcodes. - */ - sum = sum >> 1 | sum << 31; - - sum += *data++; - } - - return sum; -} - - -#endif /* _NGX_CRC_H_INCLUDED_ */ diff --git a/src/deps/src/nginx-1.30.3/src/core/ngx_crc32.c b/src/deps/src/nginx-1.30.3/src/core/ngx_crc32.c deleted file mode 100644 index a5b4017b87..0000000000 --- a/src/deps/src/nginx-1.30.3/src/core/ngx_crc32.c +++ /dev/null @@ -1,129 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#include -#include - - -/* - * The code and lookup tables are based on the algorithm - * described at http://www.w3.org/TR/PNG/ - * - * The 256 element lookup table takes 1024 bytes, and it may be completely - * cached after processing about 30-60 bytes of data. So for short data - * we use the 16 element lookup table that takes only 64 bytes and align it - * to CPU cache line size. Of course, the small table adds code inside - * CRC32 loop, but the cache misses overhead is bigger than overhead of - * the additional code. For example, ngx_crc32_short() of 16 bytes of data - * takes half as much CPU clocks than ngx_crc32_long(). - */ - - -static uint32_t ngx_crc32_table16[] = { - 0x00000000, 0x1db71064, 0x3b6e20c8, 0x26d930ac, - 0x76dc4190, 0x6b6b51f4, 0x4db26158, 0x5005713c, - 0xedb88320, 0xf00f9344, 0xd6d6a3e8, 0xcb61b38c, - 0x9b64c2b0, 0x86d3d2d4, 0xa00ae278, 0xbdbdf21c -}; - - -uint32_t ngx_crc32_table256[] = { - 0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, - 0x076dc419, 0x706af48f, 0xe963a535, 0x9e6495a3, - 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988, - 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91, - 0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de, - 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7, - 0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, - 0x14015c4f, 0x63066cd9, 0xfa0f3d63, 0x8d080df5, - 0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172, - 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, - 0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940, - 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59, - 0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116, - 0x21b4f4b5, 0x56b3c423, 0xcfba9599, 0xb8bda50f, - 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924, - 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, - 0x76dc4190, 0x01db7106, 0x98d220bc, 0xefd5102a, - 0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433, - 0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818, - 0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01, - 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e, - 0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457, - 0x65b0d9c6, 0x12b7e950, 0x8bbeb8ea, 0xfcb9887c, - 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65, - 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, - 0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb, - 0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0, - 0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9, - 0x5005713c, 0x270241aa, 0xbe0b1010, 0xc90c2086, - 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f, - 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, - 0x59b33d17, 0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad, - 0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a, - 0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683, - 0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8, - 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1, - 0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe, - 0xf762575d, 0x806567cb, 0x196c3671, 0x6e6b06e7, - 0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc, - 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, - 0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252, - 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b, - 0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60, - 0xdf60efc3, 0xa867df55, 0x316e8eef, 0x4669be79, - 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236, - 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, - 0xc5ba3bbe, 0xb2bd0b28, 0x2bb45a92, 0x5cb36a04, - 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d, - 0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a, - 0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713, - 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38, - 0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, - 0x86d3d2d4, 0xf1d4e242, 0x68ddb3f8, 0x1fda836e, - 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777, - 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, - 0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45, - 0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2, - 0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db, - 0xaed16a4a, 0xd9d65adc, 0x40df0b66, 0x37d83bf0, - 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9, - 0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, - 0xbad03605, 0xcdd70693, 0x54de5729, 0x23d967bf, - 0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94, - 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d -}; - - -uint32_t *ngx_crc32_table_short = ngx_crc32_table16; - - -ngx_int_t -ngx_crc32_table_init(void) -{ - void *p; - - if (((uintptr_t) ngx_crc32_table_short - & ~((uintptr_t) ngx_cacheline_size - 1)) - == (uintptr_t) ngx_crc32_table_short) - { - return NGX_OK; - } - - p = ngx_alloc(16 * sizeof(uint32_t) + ngx_cacheline_size, ngx_cycle->log); - if (p == NULL) { - return NGX_ERROR; - } - - p = ngx_align_ptr(p, ngx_cacheline_size); - - ngx_memcpy(p, ngx_crc32_table16, 16 * sizeof(uint32_t)); - - ngx_crc32_table_short = p; - - return NGX_OK; -} diff --git a/src/deps/src/nginx-1.30.3/src/core/ngx_crc32.h b/src/deps/src/nginx-1.30.3/src/core/ngx_crc32.h deleted file mode 100644 index f6d6865b5a..0000000000 --- a/src/deps/src/nginx-1.30.3/src/core/ngx_crc32.h +++ /dev/null @@ -1,79 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#ifndef _NGX_CRC32_H_INCLUDED_ -#define _NGX_CRC32_H_INCLUDED_ - - -#include -#include - - -extern uint32_t *ngx_crc32_table_short; -extern uint32_t ngx_crc32_table256[]; - - -static ngx_inline uint32_t -ngx_crc32_short(u_char *p, size_t len) -{ - u_char c; - uint32_t crc; - - crc = 0xffffffff; - - while (len--) { - c = *p++; - crc = ngx_crc32_table_short[(crc ^ (c & 0xf)) & 0xf] ^ (crc >> 4); - crc = ngx_crc32_table_short[(crc ^ (c >> 4)) & 0xf] ^ (crc >> 4); - } - - return crc ^ 0xffffffff; -} - - -static ngx_inline uint32_t -ngx_crc32_long(u_char *p, size_t len) -{ - uint32_t crc; - - crc = 0xffffffff; - - while (len--) { - crc = ngx_crc32_table256[(crc ^ *p++) & 0xff] ^ (crc >> 8); - } - - return crc ^ 0xffffffff; -} - - -#define ngx_crc32_init(crc) \ - crc = 0xffffffff - - -static ngx_inline void -ngx_crc32_update(uint32_t *crc, u_char *p, size_t len) -{ - uint32_t c; - - c = *crc; - - while (len--) { - c = ngx_crc32_table256[(c ^ *p++) & 0xff] ^ (c >> 8); - } - - *crc = c; -} - - -#define ngx_crc32_final(crc) \ - crc ^= 0xffffffff - - -ngx_int_t ngx_crc32_table_init(void); - - -#endif /* _NGX_CRC32_H_INCLUDED_ */ diff --git a/src/deps/src/nginx-1.30.3/src/core/ngx_crypt.c b/src/deps/src/nginx-1.30.3/src/core/ngx_crypt.c deleted file mode 100644 index 868dc5deb7..0000000000 --- a/src/deps/src/nginx-1.30.3/src/core/ngx_crypt.c +++ /dev/null @@ -1,270 +0,0 @@ - -/* - * Copyright (C) Maxim Dounin - */ - - -#include -#include -#include -#include -#include - - -#if (NGX_CRYPT) - -static ngx_int_t ngx_crypt_apr1(ngx_pool_t *pool, u_char *key, u_char *salt, - u_char **encrypted); -static ngx_int_t ngx_crypt_plain(ngx_pool_t *pool, u_char *key, u_char *salt, - u_char **encrypted); -static ngx_int_t ngx_crypt_ssha(ngx_pool_t *pool, u_char *key, u_char *salt, - u_char **encrypted); -static ngx_int_t ngx_crypt_sha(ngx_pool_t *pool, u_char *key, u_char *salt, - u_char **encrypted); - - -static u_char *ngx_crypt_to64(u_char *p, uint32_t v, size_t n); - - -ngx_int_t -ngx_crypt(ngx_pool_t *pool, u_char *key, u_char *salt, u_char **encrypted) -{ - if (ngx_strncmp(salt, "$apr1$", sizeof("$apr1$") - 1) == 0) { - return ngx_crypt_apr1(pool, key, salt, encrypted); - - } else if (ngx_strncmp(salt, "{PLAIN}", sizeof("{PLAIN}") - 1) == 0) { - return ngx_crypt_plain(pool, key, salt, encrypted); - - } else if (ngx_strncmp(salt, "{SSHA}", sizeof("{SSHA}") - 1) == 0) { - return ngx_crypt_ssha(pool, key, salt, encrypted); - - } else if (ngx_strncmp(salt, "{SHA}", sizeof("{SHA}") - 1) == 0) { - return ngx_crypt_sha(pool, key, salt, encrypted); - } - - /* fallback to libc crypt() */ - - return ngx_libc_crypt(pool, key, salt, encrypted); -} - - -static ngx_int_t -ngx_crypt_apr1(ngx_pool_t *pool, u_char *key, u_char *salt, u_char **encrypted) -{ - ngx_int_t n; - ngx_uint_t i; - u_char *p, *last, final[16]; - size_t saltlen, keylen; - ngx_md5_t md5, ctx1; - - /* Apache's apr1 crypt is Poul-Henning Kamp's md5 crypt with $apr1$ magic */ - - keylen = ngx_strlen(key); - - /* true salt: no magic, max 8 chars, stop at first $ */ - - salt += sizeof("$apr1$") - 1; - last = salt + 8; - for (p = salt; *p && *p != '$' && p < last; p++) { /* void */ } - saltlen = p - salt; - - /* hash key and salt */ - - ngx_md5_init(&md5); - ngx_md5_update(&md5, key, keylen); - ngx_md5_update(&md5, (u_char *) "$apr1$", sizeof("$apr1$") - 1); - ngx_md5_update(&md5, salt, saltlen); - - ngx_md5_init(&ctx1); - ngx_md5_update(&ctx1, key, keylen); - ngx_md5_update(&ctx1, salt, saltlen); - ngx_md5_update(&ctx1, key, keylen); - ngx_md5_final(final, &ctx1); - - for (n = keylen; n > 0; n -= 16) { - ngx_md5_update(&md5, final, n > 16 ? 16 : n); - } - - ngx_memzero(final, sizeof(final)); - - for (i = keylen; i; i >>= 1) { - if (i & 1) { - ngx_md5_update(&md5, final, 1); - - } else { - ngx_md5_update(&md5, key, 1); - } - } - - ngx_md5_final(final, &md5); - - for (i = 0; i < 1000; i++) { - ngx_md5_init(&ctx1); - - if (i & 1) { - ngx_md5_update(&ctx1, key, keylen); - - } else { - ngx_md5_update(&ctx1, final, 16); - } - - if (i % 3) { - ngx_md5_update(&ctx1, salt, saltlen); - } - - if (i % 7) { - ngx_md5_update(&ctx1, key, keylen); - } - - if (i & 1) { - ngx_md5_update(&ctx1, final, 16); - - } else { - ngx_md5_update(&ctx1, key, keylen); - } - - ngx_md5_final(final, &ctx1); - } - - /* output */ - - *encrypted = ngx_pnalloc(pool, sizeof("$apr1$") - 1 + saltlen + 1 + 22 + 1); - if (*encrypted == NULL) { - return NGX_ERROR; - } - - p = ngx_cpymem(*encrypted, "$apr1$", sizeof("$apr1$") - 1); - p = ngx_copy(p, salt, saltlen); - *p++ = '$'; - - p = ngx_crypt_to64(p, (final[ 0]<<16) | (final[ 6]<<8) | final[12], 4); - p = ngx_crypt_to64(p, (final[ 1]<<16) | (final[ 7]<<8) | final[13], 4); - p = ngx_crypt_to64(p, (final[ 2]<<16) | (final[ 8]<<8) | final[14], 4); - p = ngx_crypt_to64(p, (final[ 3]<<16) | (final[ 9]<<8) | final[15], 4); - p = ngx_crypt_to64(p, (final[ 4]<<16) | (final[10]<<8) | final[ 5], 4); - p = ngx_crypt_to64(p, final[11], 2); - *p = '\0'; - - return NGX_OK; -} - - -static u_char * -ngx_crypt_to64(u_char *p, uint32_t v, size_t n) -{ - static u_char itoa64[] = - "./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; - - while (n--) { - *p++ = itoa64[v & 0x3f]; - v >>= 6; - } - - return p; -} - - -static ngx_int_t -ngx_crypt_plain(ngx_pool_t *pool, u_char *key, u_char *salt, u_char **encrypted) -{ - size_t len; - u_char *p; - - len = ngx_strlen(key); - - *encrypted = ngx_pnalloc(pool, sizeof("{PLAIN}") - 1 + len + 1); - if (*encrypted == NULL) { - return NGX_ERROR; - } - - p = ngx_cpymem(*encrypted, "{PLAIN}", sizeof("{PLAIN}") - 1); - ngx_memcpy(p, key, len + 1); - - return NGX_OK; -} - - -static ngx_int_t -ngx_crypt_ssha(ngx_pool_t *pool, u_char *key, u_char *salt, u_char **encrypted) -{ - size_t len; - ngx_int_t rc; - ngx_str_t encoded, decoded; - ngx_sha1_t sha1; - - /* "{SSHA}" base64(SHA1(key salt) salt) */ - - /* decode base64 salt to find out true salt */ - - encoded.data = salt + sizeof("{SSHA}") - 1; - encoded.len = ngx_strlen(encoded.data); - - len = ngx_max(ngx_base64_decoded_length(encoded.len), 20); - - decoded.data = ngx_pnalloc(pool, len); - if (decoded.data == NULL) { - return NGX_ERROR; - } - - rc = ngx_decode_base64(&decoded, &encoded); - - if (rc != NGX_OK || decoded.len < 20) { - decoded.len = 20; - } - - /* update SHA1 from key and salt */ - - ngx_sha1_init(&sha1); - ngx_sha1_update(&sha1, key, ngx_strlen(key)); - ngx_sha1_update(&sha1, decoded.data + 20, decoded.len - 20); - ngx_sha1_final(decoded.data, &sha1); - - /* encode it back to base64 */ - - len = sizeof("{SSHA}") - 1 + ngx_base64_encoded_length(decoded.len) + 1; - - *encrypted = ngx_pnalloc(pool, len); - if (*encrypted == NULL) { - return NGX_ERROR; - } - - encoded.data = ngx_cpymem(*encrypted, "{SSHA}", sizeof("{SSHA}") - 1); - ngx_encode_base64(&encoded, &decoded); - encoded.data[encoded.len] = '\0'; - - return NGX_OK; -} - - -static ngx_int_t -ngx_crypt_sha(ngx_pool_t *pool, u_char *key, u_char *salt, u_char **encrypted) -{ - size_t len; - ngx_str_t encoded, decoded; - ngx_sha1_t sha1; - u_char digest[20]; - - /* "{SHA}" base64(SHA1(key)) */ - - decoded.len = sizeof(digest); - decoded.data = digest; - - ngx_sha1_init(&sha1); - ngx_sha1_update(&sha1, key, ngx_strlen(key)); - ngx_sha1_final(digest, &sha1); - - len = sizeof("{SHA}") - 1 + ngx_base64_encoded_length(decoded.len) + 1; - - *encrypted = ngx_pnalloc(pool, len); - if (*encrypted == NULL) { - return NGX_ERROR; - } - - encoded.data = ngx_cpymem(*encrypted, "{SHA}", sizeof("{SHA}") - 1); - ngx_encode_base64(&encoded, &decoded); - encoded.data[encoded.len] = '\0'; - - return NGX_OK; -} - -#endif /* NGX_CRYPT */ diff --git a/src/deps/src/nginx-1.30.3/src/core/ngx_crypt.h b/src/deps/src/nginx-1.30.3/src/core/ngx_crypt.h deleted file mode 100644 index 386911428a..0000000000 --- a/src/deps/src/nginx-1.30.3/src/core/ngx_crypt.h +++ /dev/null @@ -1,20 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#ifndef _NGX_CRYPT_H_INCLUDED_ -#define _NGX_CRYPT_H_INCLUDED_ - - -#include -#include - - -ngx_int_t ngx_crypt(ngx_pool_t *pool, u_char *key, u_char *salt, - u_char **encrypted); - - -#endif /* _NGX_CRYPT_H_INCLUDED_ */ diff --git a/src/deps/src/nginx-1.30.3/src/core/ngx_cycle.c b/src/deps/src/nginx-1.30.3/src/core/ngx_cycle.c deleted file mode 100644 index e5fd402853..0000000000 --- a/src/deps/src/nginx-1.30.3/src/core/ngx_cycle.c +++ /dev/null @@ -1,1482 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#include -#include -#include - - -static void ngx_destroy_cycle_pools(ngx_conf_t *conf); -static ngx_int_t ngx_init_zone_pool(ngx_cycle_t *cycle, - ngx_shm_zone_t *shm_zone); -static ngx_int_t ngx_test_lockfile(u_char *file, ngx_log_t *log); -static void ngx_clean_old_cycles(ngx_event_t *ev); -static void ngx_shutdown_timer_handler(ngx_event_t *ev); - - -volatile ngx_cycle_t *ngx_cycle; -ngx_array_t ngx_old_cycles; - -static ngx_pool_t *ngx_temp_pool; -static ngx_event_t ngx_cleaner_event; -static ngx_event_t ngx_shutdown_event; - -ngx_uint_t ngx_test_config; -ngx_uint_t ngx_dump_config; -ngx_uint_t ngx_quiet_mode; - - -/* STUB NAME */ -static ngx_connection_t dumb; -/* STUB */ - - -ngx_cycle_t * -ngx_init_cycle(ngx_cycle_t *old_cycle) -{ - void *rv, *data; - char **senv; - ngx_uint_t i, n; - ngx_log_t *log; - ngx_time_t *tp; - ngx_conf_t conf; - ngx_pool_t *pool; - ngx_cycle_t *cycle, **old; - ngx_shm_zone_t *shm_zone, *oshm_zone; - ngx_list_part_t *part, *opart; - ngx_open_file_t *file; - ngx_listening_t *ls, *nls; - ngx_core_conf_t *ccf, *old_ccf; - ngx_core_module_t *module; - char hostname[NGX_MAXHOSTNAMELEN]; - - ngx_timezone_update(); - - /* force localtime update with a new timezone */ - - tp = ngx_timeofday(); - tp->sec = 0; - - ngx_time_update(); - - - log = old_cycle->log; - - pool = ngx_create_pool(NGX_CYCLE_POOL_SIZE, log); - if (pool == NULL) { - return NULL; - } - pool->log = log; - - cycle = ngx_pcalloc(pool, sizeof(ngx_cycle_t)); - if (cycle == NULL) { - ngx_destroy_pool(pool); - return NULL; - } - - cycle->pool = pool; - cycle->log = log; - cycle->old_cycle = old_cycle; - - cycle->conf_prefix.len = old_cycle->conf_prefix.len; - cycle->conf_prefix.data = ngx_pstrdup(pool, &old_cycle->conf_prefix); - if (cycle->conf_prefix.data == NULL) { - ngx_destroy_pool(pool); - return NULL; - } - - cycle->prefix.len = old_cycle->prefix.len; - cycle->prefix.data = ngx_pstrdup(pool, &old_cycle->prefix); - if (cycle->prefix.data == NULL) { - ngx_destroy_pool(pool); - return NULL; - } - - cycle->error_log.len = old_cycle->error_log.len; - cycle->error_log.data = ngx_pnalloc(pool, old_cycle->error_log.len + 1); - if (cycle->error_log.data == NULL) { - ngx_destroy_pool(pool); - return NULL; - } - ngx_cpystrn(cycle->error_log.data, old_cycle->error_log.data, - old_cycle->error_log.len + 1); - - cycle->conf_file.len = old_cycle->conf_file.len; - cycle->conf_file.data = ngx_pnalloc(pool, old_cycle->conf_file.len + 1); - if (cycle->conf_file.data == NULL) { - ngx_destroy_pool(pool); - return NULL; - } - ngx_cpystrn(cycle->conf_file.data, old_cycle->conf_file.data, - old_cycle->conf_file.len + 1); - - cycle->conf_param.len = old_cycle->conf_param.len; - cycle->conf_param.data = ngx_pstrdup(pool, &old_cycle->conf_param); - if (cycle->conf_param.data == NULL) { - ngx_destroy_pool(pool); - return NULL; - } - - - n = old_cycle->paths.nelts ? old_cycle->paths.nelts : 10; - - if (ngx_array_init(&cycle->paths, pool, n, sizeof(ngx_path_t *)) - != NGX_OK) - { - ngx_destroy_pool(pool); - return NULL; - } - - ngx_memzero(cycle->paths.elts, n * sizeof(ngx_path_t *)); - - - if (ngx_array_init(&cycle->config_dump, pool, 1, sizeof(ngx_conf_dump_t)) - != NGX_OK) - { - ngx_destroy_pool(pool); - return NULL; - } - - ngx_rbtree_init(&cycle->config_dump_rbtree, &cycle->config_dump_sentinel, - ngx_str_rbtree_insert_value); - - if (old_cycle->open_files.part.nelts) { - n = old_cycle->open_files.part.nelts; - for (part = old_cycle->open_files.part.next; part; part = part->next) { - n += part->nelts; - } - - } else { - n = 20; - } - - if (ngx_list_init(&cycle->open_files, pool, n, sizeof(ngx_open_file_t)) - != NGX_OK) - { - ngx_destroy_pool(pool); - return NULL; - } - - - if (old_cycle->shared_memory.part.nelts) { - n = old_cycle->shared_memory.part.nelts; - for (part = old_cycle->shared_memory.part.next; part; part = part->next) - { - n += part->nelts; - } - - } else { - n = 1; - } - - if (ngx_list_init(&cycle->shared_memory, pool, n, sizeof(ngx_shm_zone_t)) - != NGX_OK) - { - ngx_destroy_pool(pool); - return NULL; - } - - n = old_cycle->listening.nelts ? old_cycle->listening.nelts : 10; - - if (ngx_array_init(&cycle->listening, pool, n, sizeof(ngx_listening_t)) - != NGX_OK) - { - ngx_destroy_pool(pool); - return NULL; - } - - ngx_memzero(cycle->listening.elts, n * sizeof(ngx_listening_t)); - - - ngx_queue_init(&cycle->reusable_connections_queue); - - - cycle->conf_ctx = ngx_pcalloc(pool, ngx_max_module * sizeof(void *)); - if (cycle->conf_ctx == NULL) { - ngx_destroy_pool(pool); - return NULL; - } - - - if (gethostname(hostname, NGX_MAXHOSTNAMELEN) == -1) { - ngx_log_error(NGX_LOG_EMERG, log, ngx_errno, "gethostname() failed"); - ngx_destroy_pool(pool); - return NULL; - } - - /* on Linux gethostname() silently truncates name that does not fit */ - - hostname[NGX_MAXHOSTNAMELEN - 1] = '\0'; - cycle->hostname.len = ngx_strlen(hostname); - - cycle->hostname.data = ngx_pnalloc(pool, cycle->hostname.len); - if (cycle->hostname.data == NULL) { - ngx_destroy_pool(pool); - return NULL; - } - - ngx_strlow(cycle->hostname.data, (u_char *) hostname, cycle->hostname.len); - - - if (ngx_cycle_modules(cycle) != NGX_OK) { - ngx_destroy_pool(pool); - return NULL; - } - - - for (i = 0; cycle->modules[i]; i++) { - if (cycle->modules[i]->type != NGX_CORE_MODULE) { - continue; - } - - module = cycle->modules[i]->ctx; - - if (module->create_conf) { - rv = module->create_conf(cycle); - if (rv == NULL) { - ngx_destroy_pool(pool); - return NULL; - } - cycle->conf_ctx[cycle->modules[i]->index] = rv; - } - } - - - senv = environ; - - - ngx_memzero(&conf, sizeof(ngx_conf_t)); - /* STUB: init array ? */ - conf.args = ngx_array_create(pool, 10, sizeof(ngx_str_t)); - if (conf.args == NULL) { - ngx_destroy_pool(pool); - return NULL; - } - - conf.temp_pool = ngx_create_pool(NGX_CYCLE_POOL_SIZE, log); - if (conf.temp_pool == NULL) { - ngx_destroy_pool(pool); - return NULL; - } - - - conf.ctx = cycle->conf_ctx; - conf.cycle = cycle; - conf.pool = pool; - conf.log = log; - conf.module_type = NGX_CORE_MODULE; - conf.cmd_type = NGX_MAIN_CONF; - -#if 0 - log->log_level = NGX_LOG_DEBUG_ALL; -#endif - - if (ngx_conf_param(&conf) != NGX_CONF_OK) { - environ = senv; - ngx_destroy_cycle_pools(&conf); - return NULL; - } - - if (ngx_conf_parse(&conf, &cycle->conf_file) != NGX_CONF_OK) { - environ = senv; - ngx_destroy_cycle_pools(&conf); - return NULL; - } - - if (ngx_test_config && !ngx_quiet_mode) { - ngx_log_stderr(0, "the configuration file %s syntax is ok", - cycle->conf_file.data); - } - - for (i = 0; cycle->modules[i]; i++) { - if (cycle->modules[i]->type != NGX_CORE_MODULE) { - continue; - } - - module = cycle->modules[i]->ctx; - - if (module->init_conf) { - if (module->init_conf(cycle, - cycle->conf_ctx[cycle->modules[i]->index]) - == NGX_CONF_ERROR) - { - environ = senv; - ngx_destroy_cycle_pools(&conf); - return NULL; - } - } - } - - if (ngx_process == NGX_PROCESS_SIGNALLER) { - return cycle; - } - - ccf = (ngx_core_conf_t *) ngx_get_conf(cycle->conf_ctx, ngx_core_module); - - if (ngx_test_config) { - - if (ngx_create_pidfile(&ccf->pid, log) != NGX_OK) { - goto failed; - } - - } else if (!ngx_is_init_cycle(old_cycle)) { - - /* - * we do not create the pid file in the first ngx_init_cycle() call - * because we need to write the demonized process pid - */ - - old_ccf = (ngx_core_conf_t *) ngx_get_conf(old_cycle->conf_ctx, - ngx_core_module); - if (ccf->pid.len != old_ccf->pid.len - || ngx_strcmp(ccf->pid.data, old_ccf->pid.data) != 0) - { - /* new pid file name */ - - if (ngx_create_pidfile(&ccf->pid, log) != NGX_OK) { - goto failed; - } - - ngx_delete_pidfile(old_cycle); - } - } - - - if (ngx_test_lockfile(cycle->lock_file.data, log) != NGX_OK) { - goto failed; - } - - - if (ngx_create_paths(cycle, ccf->user) != NGX_OK) { - goto failed; - } - - - if (ngx_log_open_default(cycle) != NGX_OK) { - goto failed; - } - - /* open the new files */ - - part = &cycle->open_files.part; - file = part->elts; - - for (i = 0; /* void */ ; i++) { - - if (i >= part->nelts) { - if (part->next == NULL) { - break; - } - part = part->next; - file = part->elts; - i = 0; - } - - if (file[i].name.len == 0) { - continue; - } - - file[i].fd = ngx_open_file(file[i].name.data, - NGX_FILE_APPEND, - NGX_FILE_CREATE_OR_OPEN, - NGX_FILE_DEFAULT_ACCESS); - - ngx_log_debug3(NGX_LOG_DEBUG_CORE, log, 0, - "log: %p %d \"%s\"", - &file[i], file[i].fd, file[i].name.data); - - if (file[i].fd == NGX_INVALID_FILE) { - ngx_log_error(NGX_LOG_EMERG, log, ngx_errno, - ngx_open_file_n " \"%s\" failed", - file[i].name.data); - goto failed; - } - -#if !(NGX_WIN32) - if (fcntl(file[i].fd, F_SETFD, FD_CLOEXEC) == -1) { - ngx_log_error(NGX_LOG_EMERG, log, ngx_errno, - "fcntl(FD_CLOEXEC) \"%s\" failed", - file[i].name.data); - goto failed; - } -#endif - } - - cycle->log = &cycle->new_log; - pool->log = &cycle->new_log; - - - /* create shared memory */ - - part = &cycle->shared_memory.part; - shm_zone = part->elts; - - for (i = 0; /* void */ ; i++) { - - if (i >= part->nelts) { - if (part->next == NULL) { - break; - } - part = part->next; - shm_zone = part->elts; - i = 0; - } - - if (shm_zone[i].shm.size == 0) { - ngx_log_error(NGX_LOG_EMERG, log, 0, - "zero size shared memory zone \"%V\"", - &shm_zone[i].shm.name); - goto failed; - } - - shm_zone[i].shm.log = cycle->log; - - opart = &old_cycle->shared_memory.part; - oshm_zone = opart->elts; - - data = NULL; - - for (n = 0; /* void */ ; n++) { - - if (n >= opart->nelts) { - if (opart->next == NULL) { - break; - } - opart = opart->next; - oshm_zone = opart->elts; - n = 0; - } - - if (shm_zone[i].shm.name.len != oshm_zone[n].shm.name.len) { - continue; - } - - if (ngx_strncmp(shm_zone[i].shm.name.data, - oshm_zone[n].shm.name.data, - shm_zone[i].shm.name.len) - != 0) - { - continue; - } - - if (shm_zone[i].tag == oshm_zone[n].tag && shm_zone[i].noreuse) { - data = oshm_zone[n].data; - break; - } - - if (shm_zone[i].tag == oshm_zone[n].tag - && shm_zone[i].shm.size == oshm_zone[n].shm.size) - { - shm_zone[i].shm.addr = oshm_zone[n].shm.addr; -#if (NGX_WIN32) - shm_zone[i].shm.handle = oshm_zone[n].shm.handle; -#endif - - if (shm_zone[i].init(&shm_zone[i], oshm_zone[n].data) - != NGX_OK) - { - goto failed; - } - - goto shm_zone_found; - } - - break; - } - - if (ngx_shm_alloc(&shm_zone[i].shm) != NGX_OK) { - goto failed; - } - - if (ngx_init_zone_pool(cycle, &shm_zone[i]) != NGX_OK) { - goto failed; - } - - if (shm_zone[i].init(&shm_zone[i], data) != NGX_OK) { - goto failed; - } - - shm_zone_found: - - continue; - } - - - /* handle the listening sockets */ - - if (old_cycle->listening.nelts) { - ls = old_cycle->listening.elts; - for (i = 0; i < old_cycle->listening.nelts; i++) { - ls[i].remain = 0; - } - - nls = cycle->listening.elts; - for (n = 0; n < cycle->listening.nelts; n++) { - - for (i = 0; i < old_cycle->listening.nelts; i++) { - if (ls[i].ignore) { - continue; - } - - if (ls[i].remain) { - continue; - } - - if (ls[i].type != nls[n].type) { - continue; - } - - if (ngx_cmp_sockaddr(nls[n].sockaddr, nls[n].socklen, - ls[i].sockaddr, ls[i].socklen, 1) - == NGX_OK) - { - nls[n].fd = ls[i].fd; - nls[n].previous = &ls[i]; - - if (ls[i].protocol != nls[n].protocol) { - nls[n].change_protocol = 1; - - } else { - nls[n].inherited = ls[i].inherited; - ls[i].remain = 1; - } - - if (ls[i].backlog != nls[n].backlog) { - nls[n].listen = 1; - } - -#if (NGX_HAVE_DEFERRED_ACCEPT && defined SO_ACCEPTFILTER) - - /* - * FreeBSD, except the most recent versions, - * could not remove accept filter - */ - nls[n].deferred_accept = ls[i].deferred_accept; - - if (ls[i].accept_filter && nls[n].accept_filter) { - if (ngx_strcmp(ls[i].accept_filter, - nls[n].accept_filter) - != 0) - { - nls[n].delete_deferred = 1; - nls[n].add_deferred = 1; - } - - } else if (ls[i].accept_filter) { - nls[n].delete_deferred = 1; - - } else if (nls[n].accept_filter) { - nls[n].add_deferred = 1; - } -#endif - -#if (NGX_HAVE_DEFERRED_ACCEPT && defined TCP_DEFER_ACCEPT) - - if (ls[i].deferred_accept && !nls[n].deferred_accept) { - nls[n].delete_deferred = 1; - - } else if (ls[i].deferred_accept != nls[n].deferred_accept) - { - nls[n].add_deferred = 1; - } -#endif - -#if (NGX_HAVE_REUSEPORT) - if (nls[n].reuseport && !ls[i].reuseport) { - nls[n].add_reuseport = 1; - } -#endif - - break; - } - } - - if (nls[n].fd == (ngx_socket_t) -1) { -#if (NGX_HAVE_DEFERRED_ACCEPT && defined SO_ACCEPTFILTER) - if (nls[n].accept_filter) { - nls[n].add_deferred = 1; - } -#endif -#if (NGX_HAVE_DEFERRED_ACCEPT && defined TCP_DEFER_ACCEPT) - if (nls[n].deferred_accept) { - nls[n].add_deferred = 1; - } -#endif - } - } - - } else { -#if (NGX_HAVE_DEFERRED_ACCEPT) - ls = cycle->listening.elts; - for (i = 0; i < cycle->listening.nelts; i++) { -#ifdef SO_ACCEPTFILTER - if (ls[i].accept_filter) { - ls[i].add_deferred = 1; - } -#endif -#ifdef TCP_DEFER_ACCEPT - if (ls[i].deferred_accept) { - ls[i].add_deferred = 1; - } -#endif - } -#endif - } - - if (ngx_open_listening_sockets(cycle) != NGX_OK) { - goto failed; - } - - if (!ngx_test_config) { - ngx_configure_listening_sockets(cycle); - } - - - /* commit the new cycle configuration */ - - if (!ngx_use_stderr) { - (void) ngx_log_redirect_stderr(cycle); - } - - pool->log = cycle->log; - - if (ngx_init_modules(cycle) != NGX_OK) { - /* fatal */ - exit(1); - } - - - /* close and delete stuff that lefts from an old cycle */ - - /* free the unnecessary shared memory */ - - opart = &old_cycle->shared_memory.part; - oshm_zone = opart->elts; - - for (i = 0; /* void */ ; i++) { - - if (i >= opart->nelts) { - if (opart->next == NULL) { - goto old_shm_zone_done; - } - opart = opart->next; - oshm_zone = opart->elts; - i = 0; - } - - part = &cycle->shared_memory.part; - shm_zone = part->elts; - - for (n = 0; /* void */ ; n++) { - - if (n >= part->nelts) { - if (part->next == NULL) { - break; - } - part = part->next; - shm_zone = part->elts; - n = 0; - } - - if (oshm_zone[i].shm.name.len != shm_zone[n].shm.name.len) { - continue; - } - - if (ngx_strncmp(oshm_zone[i].shm.name.data, - shm_zone[n].shm.name.data, - oshm_zone[i].shm.name.len) - != 0) - { - continue; - } - - if (oshm_zone[i].tag == shm_zone[n].tag - && oshm_zone[i].shm.size == shm_zone[n].shm.size - && !oshm_zone[i].noreuse) - { - goto live_shm_zone; - } - - break; - } - - ngx_shm_free(&oshm_zone[i].shm); - - live_shm_zone: - - continue; - } - -old_shm_zone_done: - - - /* close the unnecessary listening sockets */ - - ls = old_cycle->listening.elts; - for (i = 0; i < old_cycle->listening.nelts; i++) { - - if (ls[i].remain || ls[i].fd == (ngx_socket_t) -1) { - continue; - } - - if (ngx_close_socket(ls[i].fd) == -1) { - ngx_log_error(NGX_LOG_EMERG, log, ngx_socket_errno, - ngx_close_socket_n " listening socket on %V failed", - &ls[i].addr_text); - } - -#if (NGX_HAVE_UNIX_DOMAIN) - - if (ls[i].sockaddr->sa_family == AF_UNIX) { - u_char *name; - - name = ls[i].addr_text.data + sizeof("unix:") - 1; - - ngx_log_error(NGX_LOG_WARN, cycle->log, 0, - "deleting socket %s", name); - - if (ngx_delete_file(name) == NGX_FILE_ERROR) { - ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_socket_errno, - ngx_delete_file_n " %s failed", name); - } - } - -#endif - } - - - /* close the unnecessary open files */ - - part = &old_cycle->open_files.part; - file = part->elts; - - for (i = 0; /* void */ ; i++) { - - if (i >= part->nelts) { - if (part->next == NULL) { - break; - } - part = part->next; - file = part->elts; - i = 0; - } - - if (file[i].fd == NGX_INVALID_FILE || file[i].fd == ngx_stderr) { - continue; - } - - if (ngx_close_file(file[i].fd) == NGX_FILE_ERROR) { - ngx_log_error(NGX_LOG_EMERG, log, ngx_errno, - ngx_close_file_n " \"%s\" failed", - file[i].name.data); - } - } - - ngx_destroy_pool(conf.temp_pool); - - if (ngx_process == NGX_PROCESS_MASTER || ngx_is_init_cycle(old_cycle)) { - - ngx_destroy_pool(old_cycle->pool); - cycle->old_cycle = NULL; - - return cycle; - } - - - if (ngx_temp_pool == NULL) { - ngx_temp_pool = ngx_create_pool(128, cycle->log); - if (ngx_temp_pool == NULL) { - ngx_log_error(NGX_LOG_EMERG, cycle->log, 0, - "could not create ngx_temp_pool"); - exit(1); - } - - n = 10; - - if (ngx_array_init(&ngx_old_cycles, ngx_temp_pool, n, - sizeof(ngx_cycle_t *)) - != NGX_OK) - { - exit(1); - } - - ngx_memzero(ngx_old_cycles.elts, n * sizeof(ngx_cycle_t *)); - - ngx_cleaner_event.handler = ngx_clean_old_cycles; - ngx_cleaner_event.log = cycle->log; - ngx_cleaner_event.data = &dumb; - dumb.fd = (ngx_socket_t) -1; - } - - ngx_temp_pool->log = cycle->log; - - old = ngx_array_push(&ngx_old_cycles); - if (old == NULL) { - exit(1); - } - *old = old_cycle; - - if (!ngx_cleaner_event.timer_set) { - ngx_add_timer(&ngx_cleaner_event, 30000); - ngx_cleaner_event.timer_set = 1; - } - - return cycle; - - -failed: - - if (!ngx_is_init_cycle(old_cycle)) { - old_ccf = (ngx_core_conf_t *) ngx_get_conf(old_cycle->conf_ctx, - ngx_core_module); - if (old_ccf->environment) { - environ = old_ccf->environment; - } - } - - /* rollback the new cycle configuration */ - - part = &cycle->open_files.part; - file = part->elts; - - for (i = 0; /* void */ ; i++) { - - if (i >= part->nelts) { - if (part->next == NULL) { - break; - } - part = part->next; - file = part->elts; - i = 0; - } - - if (file[i].fd == NGX_INVALID_FILE || file[i].fd == ngx_stderr) { - continue; - } - - if (ngx_close_file(file[i].fd) == NGX_FILE_ERROR) { - ngx_log_error(NGX_LOG_EMERG, log, ngx_errno, - ngx_close_file_n " \"%s\" failed", - file[i].name.data); - } - } - - /* free the newly created shared memory */ - - part = &cycle->shared_memory.part; - shm_zone = part->elts; - - for (i = 0; /* void */ ; i++) { - - if (i >= part->nelts) { - if (part->next == NULL) { - break; - } - part = part->next; - shm_zone = part->elts; - i = 0; - } - - if (shm_zone[i].shm.addr == NULL) { - continue; - } - - opart = &old_cycle->shared_memory.part; - oshm_zone = opart->elts; - - for (n = 0; /* void */ ; n++) { - - if (n >= opart->nelts) { - if (opart->next == NULL) { - break; - } - opart = opart->next; - oshm_zone = opart->elts; - n = 0; - } - - if (shm_zone[i].shm.name.len != oshm_zone[n].shm.name.len) { - continue; - } - - if (ngx_strncmp(shm_zone[i].shm.name.data, - oshm_zone[n].shm.name.data, - shm_zone[i].shm.name.len) - != 0) - { - continue; - } - - if (shm_zone[i].tag == oshm_zone[n].tag - && shm_zone[i].shm.size == oshm_zone[n].shm.size - && !shm_zone[i].noreuse) - { - goto old_shm_zone_found; - } - - break; - } - - ngx_shm_free(&shm_zone[i].shm); - - old_shm_zone_found: - - continue; - } - - if (ngx_test_config) { - ngx_destroy_cycle_pools(&conf); - return NULL; - } - - ls = cycle->listening.elts; - for (i = 0; i < cycle->listening.nelts; i++) { - if (ls[i].fd == (ngx_socket_t) -1 || !ls[i].open) { - continue; - } - - if (ngx_close_socket(ls[i].fd) == -1) { - ngx_log_error(NGX_LOG_EMERG, log, ngx_socket_errno, - ngx_close_socket_n " %V failed", - &ls[i].addr_text); - } - } - - ngx_destroy_cycle_pools(&conf); - - return NULL; -} - - -static void -ngx_destroy_cycle_pools(ngx_conf_t *conf) -{ - ngx_destroy_pool(conf->temp_pool); - ngx_destroy_pool(conf->pool); -} - - -static ngx_int_t -ngx_init_zone_pool(ngx_cycle_t *cycle, ngx_shm_zone_t *zn) -{ - u_char *file; - ngx_slab_pool_t *sp; - - sp = (ngx_slab_pool_t *) zn->shm.addr; - - if (zn->shm.exists) { - - if (sp == sp->addr) { - return NGX_OK; - } - -#if (NGX_WIN32) - - /* remap at the required address */ - - if (ngx_shm_remap(&zn->shm, sp->addr) != NGX_OK) { - return NGX_ERROR; - } - - sp = (ngx_slab_pool_t *) zn->shm.addr; - - if (sp == sp->addr) { - return NGX_OK; - } - -#endif - - ngx_log_error(NGX_LOG_EMERG, cycle->log, 0, - "shared zone \"%V\" has no equal addresses: %p vs %p", - &zn->shm.name, sp->addr, sp); - return NGX_ERROR; - } - - sp->end = zn->shm.addr + zn->shm.size; - sp->min_shift = 3; - sp->addr = zn->shm.addr; - -#if (NGX_HAVE_ATOMIC_OPS) - - file = NULL; - -#else - - file = ngx_pnalloc(cycle->pool, - cycle->lock_file.len + zn->shm.name.len + 1); - if (file == NULL) { - return NGX_ERROR; - } - - (void) ngx_sprintf(file, "%V%V%Z", &cycle->lock_file, &zn->shm.name); - -#endif - - if (ngx_shmtx_create(&sp->mutex, &sp->lock, file) != NGX_OK) { - return NGX_ERROR; - } - - ngx_slab_init(sp); - - return NGX_OK; -} - - -ngx_int_t -ngx_create_pidfile(ngx_str_t *name, ngx_log_t *log) -{ - size_t len; - ngx_int_t rc; - ngx_uint_t create; - ngx_file_t file; - u_char pid[NGX_INT64_LEN + 2]; - - if (ngx_process > NGX_PROCESS_MASTER) { - return NGX_OK; - } - - ngx_memzero(&file, sizeof(ngx_file_t)); - - file.name = *name; - file.log = log; - - create = ngx_test_config ? NGX_FILE_CREATE_OR_OPEN : NGX_FILE_TRUNCATE; - - file.fd = ngx_open_file(file.name.data, NGX_FILE_RDWR, - create, NGX_FILE_DEFAULT_ACCESS); - - if (file.fd == NGX_INVALID_FILE) { - ngx_log_error(NGX_LOG_EMERG, log, ngx_errno, - ngx_open_file_n " \"%s\" failed", file.name.data); - return NGX_ERROR; - } - - rc = NGX_OK; - - if (!ngx_test_config) { - len = ngx_snprintf(pid, NGX_INT64_LEN + 2, "%P%N", ngx_pid) - pid; - - if (ngx_write_file(&file, pid, len, 0) == NGX_ERROR) { - rc = NGX_ERROR; - } - } - - if (ngx_close_file(file.fd) == NGX_FILE_ERROR) { - ngx_log_error(NGX_LOG_ALERT, log, ngx_errno, - ngx_close_file_n " \"%s\" failed", file.name.data); - } - - return rc; -} - - -void -ngx_delete_pidfile(ngx_cycle_t *cycle) -{ - u_char *name; - ngx_core_conf_t *ccf; - - ccf = (ngx_core_conf_t *) ngx_get_conf(cycle->conf_ctx, ngx_core_module); - - name = ngx_new_binary ? ccf->oldpid.data : ccf->pid.data; - - if (ngx_delete_file(name) == NGX_FILE_ERROR) { - ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno, - ngx_delete_file_n " \"%s\" failed", name); - } -} - - -ngx_int_t -ngx_signal_process(ngx_cycle_t *cycle, char *sig) -{ - ssize_t n; - ngx_pid_t pid; - ngx_file_t file; - ngx_core_conf_t *ccf; - u_char buf[NGX_INT64_LEN + 2]; - - ngx_log_error(NGX_LOG_NOTICE, cycle->log, 0, "signal process started"); - - ccf = (ngx_core_conf_t *) ngx_get_conf(cycle->conf_ctx, ngx_core_module); - - ngx_memzero(&file, sizeof(ngx_file_t)); - - file.name = ccf->pid; - file.log = cycle->log; - - file.fd = ngx_open_file(file.name.data, NGX_FILE_RDONLY, - NGX_FILE_OPEN, NGX_FILE_DEFAULT_ACCESS); - - if (file.fd == NGX_INVALID_FILE) { - ngx_log_error(NGX_LOG_ERR, cycle->log, ngx_errno, - ngx_open_file_n " \"%s\" failed", file.name.data); - return 1; - } - - n = ngx_read_file(&file, buf, NGX_INT64_LEN + 2, 0); - - if (ngx_close_file(file.fd) == NGX_FILE_ERROR) { - ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno, - ngx_close_file_n " \"%s\" failed", file.name.data); - } - - if (n == NGX_ERROR) { - return 1; - } - - while (n-- && (buf[n] == CR || buf[n] == LF)) { /* void */ } - - pid = ngx_atoi(buf, ++n); - - if (pid == (ngx_pid_t) NGX_ERROR) { - ngx_log_error(NGX_LOG_ERR, cycle->log, 0, - "invalid PID number \"%*s\" in \"%s\"", - n, buf, file.name.data); - return 1; - } - - return ngx_os_signal_process(cycle, sig, pid); - -} - - -static ngx_int_t -ngx_test_lockfile(u_char *file, ngx_log_t *log) -{ -#if !(NGX_HAVE_ATOMIC_OPS) - ngx_fd_t fd; - - fd = ngx_open_file(file, NGX_FILE_RDWR, NGX_FILE_CREATE_OR_OPEN, - NGX_FILE_DEFAULT_ACCESS); - - if (fd == NGX_INVALID_FILE) { - ngx_log_error(NGX_LOG_EMERG, log, ngx_errno, - ngx_open_file_n " \"%s\" failed", file); - return NGX_ERROR; - } - - if (ngx_close_file(fd) == NGX_FILE_ERROR) { - ngx_log_error(NGX_LOG_ALERT, log, ngx_errno, - ngx_close_file_n " \"%s\" failed", file); - } - - if (ngx_delete_file(file) == NGX_FILE_ERROR) { - ngx_log_error(NGX_LOG_ALERT, log, ngx_errno, - ngx_delete_file_n " \"%s\" failed", file); - } - -#endif - - return NGX_OK; -} - - -void -ngx_reopen_files(ngx_cycle_t *cycle, ngx_uid_t user) -{ - ngx_fd_t fd; - ngx_uint_t i; - ngx_list_part_t *part; - ngx_open_file_t *file; - - part = &cycle->open_files.part; - file = part->elts; - - for (i = 0; /* void */ ; i++) { - - if (i >= part->nelts) { - if (part->next == NULL) { - break; - } - part = part->next; - file = part->elts; - i = 0; - } - - if (file[i].name.len == 0) { - continue; - } - - if (file[i].flush) { - file[i].flush(&file[i], cycle->log); - } - - fd = ngx_open_file(file[i].name.data, NGX_FILE_APPEND, - NGX_FILE_CREATE_OR_OPEN, NGX_FILE_DEFAULT_ACCESS); - - ngx_log_debug3(NGX_LOG_DEBUG_EVENT, cycle->log, 0, - "reopen file \"%s\", old:%d new:%d", - file[i].name.data, file[i].fd, fd); - - if (fd == NGX_INVALID_FILE) { - ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno, - ngx_open_file_n " \"%s\" failed", file[i].name.data); - continue; - } - -#if !(NGX_WIN32) - if (user != (ngx_uid_t) NGX_CONF_UNSET_UINT) { - ngx_file_info_t fi; - - if (ngx_file_info(file[i].name.data, &fi) == NGX_FILE_ERROR) { - ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno, - ngx_file_info_n " \"%s\" failed", - file[i].name.data); - - if (ngx_close_file(fd) == NGX_FILE_ERROR) { - ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno, - ngx_close_file_n " \"%s\" failed", - file[i].name.data); - } - - continue; - } - - if (fi.st_uid != user) { - if (chown((const char *) file[i].name.data, user, -1) == -1) { - ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno, - "chown(\"%s\", %d) failed", - file[i].name.data, user); - - if (ngx_close_file(fd) == NGX_FILE_ERROR) { - ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno, - ngx_close_file_n " \"%s\" failed", - file[i].name.data); - } - - continue; - } - } - - if ((fi.st_mode & (S_IRUSR|S_IWUSR)) != (S_IRUSR|S_IWUSR)) { - - fi.st_mode |= (S_IRUSR|S_IWUSR); - - if (chmod((const char *) file[i].name.data, fi.st_mode) == -1) { - ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno, - "chmod() \"%s\" failed", file[i].name.data); - - if (ngx_close_file(fd) == NGX_FILE_ERROR) { - ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno, - ngx_close_file_n " \"%s\" failed", - file[i].name.data); - } - - continue; - } - } - } - - if (fcntl(fd, F_SETFD, FD_CLOEXEC) == -1) { - ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno, - "fcntl(FD_CLOEXEC) \"%s\" failed", - file[i].name.data); - - if (ngx_close_file(fd) == NGX_FILE_ERROR) { - ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno, - ngx_close_file_n " \"%s\" failed", - file[i].name.data); - } - - continue; - } -#endif - - if (ngx_close_file(file[i].fd) == NGX_FILE_ERROR) { - ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno, - ngx_close_file_n " \"%s\" failed", - file[i].name.data); - } - - file[i].fd = fd; - } - - (void) ngx_log_redirect_stderr(cycle); -} - - -ngx_shm_zone_t * -ngx_shared_memory_add(ngx_conf_t *cf, ngx_str_t *name, size_t size, void *tag) -{ - ngx_uint_t i; - ngx_shm_zone_t *shm_zone; - ngx_list_part_t *part; - - part = &cf->cycle->shared_memory.part; - shm_zone = part->elts; - - for (i = 0; /* void */ ; i++) { - - if (i >= part->nelts) { - if (part->next == NULL) { - break; - } - part = part->next; - shm_zone = part->elts; - i = 0; - } - - if (name->len != shm_zone[i].shm.name.len) { - continue; - } - - if (ngx_strncmp(name->data, shm_zone[i].shm.name.data, name->len) - != 0) - { - continue; - } - - if (tag != shm_zone[i].tag) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "the shared memory zone \"%V\" is " - "already declared for a different use", - &shm_zone[i].shm.name); - return NULL; - } - - if (shm_zone[i].shm.size == 0) { - shm_zone[i].shm.size = size; - } - - if (size && size != shm_zone[i].shm.size) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "the size %uz of shared memory zone \"%V\" " - "conflicts with already declared size %uz", - size, &shm_zone[i].shm.name, shm_zone[i].shm.size); - return NULL; - } - - return &shm_zone[i]; - } - - shm_zone = ngx_list_push(&cf->cycle->shared_memory); - - if (shm_zone == NULL) { - return NULL; - } - - shm_zone->data = NULL; - shm_zone->shm.log = cf->cycle->log; - shm_zone->shm.addr = NULL; - shm_zone->shm.size = size; - shm_zone->shm.name = *name; - shm_zone->shm.exists = 0; - shm_zone->init = NULL; - shm_zone->tag = tag; - shm_zone->noreuse = 0; - - return shm_zone; -} - - -static void -ngx_clean_old_cycles(ngx_event_t *ev) -{ - ngx_uint_t i, n, found, live; - ngx_log_t *log; - ngx_cycle_t **cycle; - - log = ngx_cycle->log; - ngx_temp_pool->log = log; - - ngx_log_debug0(NGX_LOG_DEBUG_CORE, log, 0, "clean old cycles"); - - live = 0; - - cycle = ngx_old_cycles.elts; - for (i = 0; i < ngx_old_cycles.nelts; i++) { - - if (cycle[i] == NULL) { - continue; - } - - found = 0; - - for (n = 0; n < cycle[i]->connection_n; n++) { - if (cycle[i]->connections[n].fd != (ngx_socket_t) -1) { - found = 1; - - ngx_log_debug1(NGX_LOG_DEBUG_CORE, log, 0, "live fd:%ui", n); - - break; - } - } - - if (found) { - live = 1; - continue; - } - - ngx_log_debug1(NGX_LOG_DEBUG_CORE, log, 0, "clean old cycle: %ui", i); - - ngx_destroy_pool(cycle[i]->pool); - cycle[i] = NULL; - } - - ngx_log_debug1(NGX_LOG_DEBUG_CORE, log, 0, "old cycles status: %ui", live); - - if (live) { - ngx_add_timer(ev, 30000); - - } else { - ngx_destroy_pool(ngx_temp_pool); - ngx_temp_pool = NULL; - ngx_old_cycles.nelts = 0; - } -} - - -void -ngx_set_shutdown_timer(ngx_cycle_t *cycle) -{ - ngx_core_conf_t *ccf; - - ccf = (ngx_core_conf_t *) ngx_get_conf(cycle->conf_ctx, ngx_core_module); - - if (ccf->shutdown_timeout) { - ngx_shutdown_event.handler = ngx_shutdown_timer_handler; - ngx_shutdown_event.data = cycle; - ngx_shutdown_event.log = cycle->log; - ngx_shutdown_event.cancelable = 1; - - ngx_add_timer(&ngx_shutdown_event, ccf->shutdown_timeout); - } -} - - -static void -ngx_shutdown_timer_handler(ngx_event_t *ev) -{ - ngx_uint_t i; - ngx_cycle_t *cycle; - ngx_connection_t *c; - - cycle = ev->data; - - c = cycle->connections; - - for (i = 0; i < cycle->connection_n; i++) { - - if (c[i].fd == (ngx_socket_t) -1 - || c[i].read == NULL - || c[i].read->accept - || c[i].read->channel - || c[i].read->resolver) - { - continue; - } - - ngx_log_debug1(NGX_LOG_DEBUG_CORE, ev->log, 0, - "*%uA shutdown timeout", c[i].number); - - c[i].close = 1; - c[i].error = 1; - - c[i].read->handler(c[i].read); - } -} diff --git a/src/deps/src/nginx-1.30.3/src/core/ngx_cycle.h b/src/deps/src/nginx-1.30.3/src/core/ngx_cycle.h deleted file mode 100644 index 0c47f25fe5..0000000000 --- a/src/deps/src/nginx-1.30.3/src/core/ngx_cycle.h +++ /dev/null @@ -1,149 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#ifndef _NGX_CYCLE_H_INCLUDED_ -#define _NGX_CYCLE_H_INCLUDED_ - - -#include -#include - - -#ifndef NGX_CYCLE_POOL_SIZE -#define NGX_CYCLE_POOL_SIZE NGX_DEFAULT_POOL_SIZE -#endif - - -#define NGX_DEBUG_POINTS_STOP 1 -#define NGX_DEBUG_POINTS_ABORT 2 - - -typedef struct ngx_shm_zone_s ngx_shm_zone_t; - -typedef ngx_int_t (*ngx_shm_zone_init_pt) (ngx_shm_zone_t *zone, void *data); - -struct ngx_shm_zone_s { - void *data; - ngx_shm_t shm; - ngx_shm_zone_init_pt init; - void *tag; - void *sync; - ngx_uint_t noreuse; /* unsigned noreuse:1; */ -}; - - -struct ngx_cycle_s { - void ****conf_ctx; - ngx_pool_t *pool; - - ngx_log_t *log; - ngx_log_t new_log; - - ngx_uint_t log_use_stderr; /* unsigned log_use_stderr:1; */ - - ngx_connection_t **files; - ngx_connection_t *free_connections; - ngx_uint_t free_connection_n; - - ngx_module_t **modules; - ngx_uint_t modules_n; - ngx_uint_t modules_used; /* unsigned modules_used:1; */ - - ngx_queue_t reusable_connections_queue; - ngx_uint_t reusable_connections_n; - time_t connections_reuse_time; - - ngx_array_t listening; - ngx_array_t paths; - - ngx_array_t config_dump; - ngx_rbtree_t config_dump_rbtree; - ngx_rbtree_node_t config_dump_sentinel; - - ngx_list_t open_files; - ngx_list_t shared_memory; - - ngx_uint_t connection_n; - ngx_uint_t files_n; - - ngx_connection_t *connections; - ngx_event_t *read_events; - ngx_event_t *write_events; - - ngx_cycle_t *old_cycle; - - ngx_str_t conf_file; - ngx_str_t conf_param; - ngx_str_t conf_prefix; - ngx_str_t prefix; - ngx_str_t error_log; - ngx_str_t lock_file; - ngx_str_t hostname; -}; - - -typedef struct { - ngx_flag_t daemon; - ngx_flag_t master; - - ngx_msec_t timer_resolution; - ngx_msec_t shutdown_timeout; - - ngx_int_t worker_processes; - ngx_int_t debug_points; - - ngx_int_t rlimit_nofile; - off_t rlimit_core; - - int priority; - - ngx_uint_t cpu_affinity_auto; - ngx_uint_t cpu_affinity_n; - ngx_cpuset_t *cpu_affinity; - - char *username; - ngx_uid_t user; - ngx_gid_t group; - - ngx_str_t working_directory; - ngx_str_t lock_file; - - ngx_str_t pid; - ngx_str_t oldpid; - - ngx_array_t env; - char **environment; - - ngx_uint_t transparent; /* unsigned transparent:1; */ -} ngx_core_conf_t; - - -#define ngx_is_init_cycle(cycle) (cycle->conf_ctx == NULL) - - -ngx_cycle_t *ngx_init_cycle(ngx_cycle_t *old_cycle); -ngx_int_t ngx_create_pidfile(ngx_str_t *name, ngx_log_t *log); -void ngx_delete_pidfile(ngx_cycle_t *cycle); -ngx_int_t ngx_signal_process(ngx_cycle_t *cycle, char *sig); -void ngx_reopen_files(ngx_cycle_t *cycle, ngx_uid_t user); -char **ngx_set_environment(ngx_cycle_t *cycle, ngx_uint_t *last); -ngx_pid_t ngx_exec_new_binary(ngx_cycle_t *cycle, char *const *argv); -ngx_cpuset_t *ngx_get_cpu_affinity(ngx_uint_t n); -ngx_shm_zone_t *ngx_shared_memory_add(ngx_conf_t *cf, ngx_str_t *name, - size_t size, void *tag); -void ngx_set_shutdown_timer(ngx_cycle_t *cycle); - - -extern volatile ngx_cycle_t *ngx_cycle; -extern ngx_array_t ngx_old_cycles; -extern ngx_module_t ngx_core_module; -extern ngx_uint_t ngx_test_config; -extern ngx_uint_t ngx_dump_config; -extern ngx_uint_t ngx_quiet_mode; - - -#endif /* _NGX_CYCLE_H_INCLUDED_ */ diff --git a/src/deps/src/nginx-1.30.3/src/core/ngx_file.c b/src/deps/src/nginx-1.30.3/src/core/ngx_file.c deleted file mode 100644 index 63ada85576..0000000000 --- a/src/deps/src/nginx-1.30.3/src/core/ngx_file.c +++ /dev/null @@ -1,1128 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#include -#include - - -static ngx_int_t ngx_test_full_name(ngx_str_t *name); - - -static ngx_atomic_t temp_number = 0; -ngx_atomic_t *ngx_temp_number = &temp_number; -ngx_atomic_int_t ngx_random_number = 123456; - - -ngx_int_t -ngx_get_full_name(ngx_pool_t *pool, ngx_str_t *prefix, ngx_str_t *name) -{ - size_t len; - u_char *p, *n; - ngx_int_t rc; - - rc = ngx_test_full_name(name); - - if (rc == NGX_OK) { - return rc; - } - - len = prefix->len; - -#if (NGX_WIN32) - - if (rc == 2) { - len = rc; - } - -#endif - - n = ngx_pnalloc(pool, len + name->len + 1); - if (n == NULL) { - return NGX_ERROR; - } - - p = ngx_cpymem(n, prefix->data, len); - ngx_cpystrn(p, name->data, name->len + 1); - - name->len += len; - name->data = n; - - return NGX_OK; -} - - -static ngx_int_t -ngx_test_full_name(ngx_str_t *name) -{ -#if (NGX_WIN32) - u_char c0, c1; - - c0 = name->data[0]; - - if (name->len < 2) { - if (c0 == '/') { - return 2; - } - - return NGX_DECLINED; - } - - c1 = name->data[1]; - - if (c1 == ':') { - c0 |= 0x20; - - if ((c0 >= 'a' && c0 <= 'z')) { - return NGX_OK; - } - - return NGX_DECLINED; - } - - if (c1 == '/') { - return NGX_OK; - } - - if (c0 == '/') { - return 2; - } - - return NGX_DECLINED; - -#else - - if (name->data[0] == '/') { - return NGX_OK; - } - - return NGX_DECLINED; - -#endif -} - - -ssize_t -ngx_write_chain_to_temp_file(ngx_temp_file_t *tf, ngx_chain_t *chain) -{ - ngx_int_t rc; - - if (tf->file.fd == NGX_INVALID_FILE) { - rc = ngx_create_temp_file(&tf->file, tf->path, tf->pool, - tf->persistent, tf->clean, tf->access); - - if (rc != NGX_OK) { - return rc; - } - - if (tf->log_level) { - ngx_log_error(tf->log_level, tf->file.log, 0, "%s %V", - tf->warn, &tf->file.name); - } - } - -#if (NGX_THREADS && NGX_HAVE_PWRITEV) - - if (tf->thread_write) { - return ngx_thread_write_chain_to_file(&tf->file, chain, tf->offset, - tf->pool); - } - -#endif - - return ngx_write_chain_to_file(&tf->file, chain, tf->offset, tf->pool); -} - - -ngx_int_t -ngx_create_temp_file(ngx_file_t *file, ngx_path_t *path, ngx_pool_t *pool, - ngx_uint_t persistent, ngx_uint_t clean, ngx_uint_t access) -{ - size_t levels; - u_char *p; - uint32_t n; - ngx_err_t err; - ngx_str_t name; - ngx_uint_t prefix; - ngx_pool_cleanup_t *cln; - ngx_pool_cleanup_file_t *clnf; - - if (file->name.len) { - name = file->name; - levels = 0; - prefix = 1; - - } else { - name = path->name; - levels = path->len; - prefix = 0; - } - - file->name.len = name.len + 1 + levels + 10; - - file->name.data = ngx_pnalloc(pool, file->name.len + 1); - if (file->name.data == NULL) { - return NGX_ERROR; - } - -#if 0 - for (i = 0; i < file->name.len; i++) { - file->name.data[i] = 'X'; - } -#endif - - p = ngx_cpymem(file->name.data, name.data, name.len); - - if (prefix) { - *p = '.'; - } - - p += 1 + levels; - - n = (uint32_t) ngx_next_temp_number(0); - - cln = ngx_pool_cleanup_add(pool, sizeof(ngx_pool_cleanup_file_t)); - if (cln == NULL) { - return NGX_ERROR; - } - - for ( ;; ) { - (void) ngx_sprintf(p, "%010uD%Z", n); - - if (!prefix) { - ngx_create_hashed_filename(path, file->name.data, file->name.len); - } - - ngx_log_debug1(NGX_LOG_DEBUG_CORE, file->log, 0, - "hashed path: %s", file->name.data); - - file->fd = ngx_open_tempfile(file->name.data, persistent, access); - - ngx_log_debug1(NGX_LOG_DEBUG_CORE, file->log, 0, - "temp fd:%d", file->fd); - - if (file->fd != NGX_INVALID_FILE) { - - cln->handler = clean ? ngx_pool_delete_file : ngx_pool_cleanup_file; - clnf = cln->data; - - clnf->fd = file->fd; - clnf->name = file->name.data; - clnf->log = pool->log; - - return NGX_OK; - } - - err = ngx_errno; - - if (err == NGX_EEXIST_FILE) { - n = (uint32_t) ngx_next_temp_number(1); - continue; - } - - if ((path->level[0] == 0) || (err != NGX_ENOPATH)) { - ngx_log_error(NGX_LOG_CRIT, file->log, err, - ngx_open_tempfile_n " \"%s\" failed", - file->name.data); - return NGX_ERROR; - } - - if (ngx_create_path(file, path) == NGX_ERROR) { - return NGX_ERROR; - } - } -} - - -void -ngx_create_hashed_filename(ngx_path_t *path, u_char *file, size_t len) -{ - size_t i, level; - ngx_uint_t n; - - i = path->name.len + 1; - - file[path->name.len + path->len] = '/'; - - for (n = 0; n < NGX_MAX_PATH_LEVEL; n++) { - level = path->level[n]; - - if (level == 0) { - break; - } - - len -= level; - file[i - 1] = '/'; - ngx_memcpy(&file[i], &file[len], level); - i += level + 1; - } -} - - -ngx_int_t -ngx_create_path(ngx_file_t *file, ngx_path_t *path) -{ - size_t pos; - ngx_err_t err; - ngx_uint_t i; - - pos = path->name.len; - - for (i = 0; i < NGX_MAX_PATH_LEVEL; i++) { - if (path->level[i] == 0) { - break; - } - - pos += path->level[i] + 1; - - file->name.data[pos] = '\0'; - - ngx_log_debug1(NGX_LOG_DEBUG_CORE, file->log, 0, - "temp file: \"%s\"", file->name.data); - - if (ngx_create_dir(file->name.data, 0700) == NGX_FILE_ERROR) { - err = ngx_errno; - if (err != NGX_EEXIST) { - ngx_log_error(NGX_LOG_CRIT, file->log, err, - ngx_create_dir_n " \"%s\" failed", - file->name.data); - return NGX_ERROR; - } - } - - file->name.data[pos] = '/'; - } - - return NGX_OK; -} - - -ngx_err_t -ngx_create_full_path(u_char *dir, ngx_uint_t access) -{ - u_char *p, ch; - ngx_err_t err; - - err = 0; - -#if (NGX_WIN32) - p = dir + 3; -#else - p = dir + 1; -#endif - - for ( /* void */ ; *p; p++) { - ch = *p; - - if (ch != '/') { - continue; - } - - *p = '\0'; - - if (ngx_create_dir(dir, access) == NGX_FILE_ERROR) { - err = ngx_errno; - - switch (err) { - case NGX_EEXIST: - err = 0; - case NGX_EACCES: - break; - - default: - return err; - } - } - - *p = '/'; - } - - return err; -} - - -ngx_atomic_uint_t -ngx_next_temp_number(ngx_uint_t collision) -{ - ngx_atomic_uint_t n, add; - - add = collision ? ngx_random_number : 1; - - n = ngx_atomic_fetch_add(ngx_temp_number, add); - - return n + add; -} - - -char * -ngx_conf_set_path_slot(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) -{ - char *p = conf; - - ssize_t level; - ngx_str_t *value; - ngx_uint_t i, n; - ngx_path_t *path, **slot; - - slot = (ngx_path_t **) (p + cmd->offset); - - if (*slot) { - return "is duplicate"; - } - - path = ngx_pcalloc(cf->pool, sizeof(ngx_path_t)); - if (path == NULL) { - return NGX_CONF_ERROR; - } - - value = cf->args->elts; - - path->name = value[1]; - - if (path->name.data[path->name.len - 1] == '/') { - path->name.len--; - } - - if (ngx_conf_full_name(cf->cycle, &path->name, 0) != NGX_OK) { - return NGX_CONF_ERROR; - } - - path->conf_file = cf->conf_file->file.name.data; - path->line = cf->conf_file->line; - - for (i = 0, n = 2; n < cf->args->nelts; i++, n++) { - level = ngx_atoi(value[n].data, value[n].len); - if (level == NGX_ERROR || level == 0) { - return "invalid value"; - } - - path->level[i] = level; - path->len += level + 1; - } - - if (path->len > 10 + i) { - return "invalid value"; - } - - *slot = path; - - if (ngx_add_path(cf, slot) == NGX_ERROR) { - return NGX_CONF_ERROR; - } - - return NGX_CONF_OK; -} - - -char * -ngx_conf_merge_path_value(ngx_conf_t *cf, ngx_path_t **path, ngx_path_t *prev, - ngx_path_init_t *init) -{ - ngx_uint_t i; - - if (*path) { - return NGX_CONF_OK; - } - - if (prev) { - *path = prev; - return NGX_CONF_OK; - } - - *path = ngx_pcalloc(cf->pool, sizeof(ngx_path_t)); - if (*path == NULL) { - return NGX_CONF_ERROR; - } - - (*path)->name = init->name; - - if (ngx_conf_full_name(cf->cycle, &(*path)->name, 0) != NGX_OK) { - return NGX_CONF_ERROR; - } - - for (i = 0; i < NGX_MAX_PATH_LEVEL; i++) { - (*path)->level[i] = init->level[i]; - (*path)->len += init->level[i] + (init->level[i] ? 1 : 0); - } - - if (ngx_add_path(cf, path) != NGX_OK) { - return NGX_CONF_ERROR; - } - - return NGX_CONF_OK; -} - - -char * -ngx_conf_set_access_slot(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) -{ - char *confp = conf; - - u_char *p; - ngx_str_t *value; - ngx_uint_t i, right, shift, *access, user; - - access = (ngx_uint_t *) (confp + cmd->offset); - - if (*access != NGX_CONF_UNSET_UINT) { - return "is duplicate"; - } - - value = cf->args->elts; - - *access = 0; - user = 0600; - - for (i = 1; i < cf->args->nelts; i++) { - - p = value[i].data; - - if (ngx_strncmp(p, "user:", sizeof("user:") - 1) == 0) { - shift = 6; - p += sizeof("user:") - 1; - user = 0; - - } else if (ngx_strncmp(p, "group:", sizeof("group:") - 1) == 0) { - shift = 3; - p += sizeof("group:") - 1; - - } else if (ngx_strncmp(p, "all:", sizeof("all:") - 1) == 0) { - shift = 0; - p += sizeof("all:") - 1; - - } else { - goto invalid; - } - - if (ngx_strcmp(p, "rw") == 0) { - right = 6; - - } else if (ngx_strcmp(p, "r") == 0) { - right = 4; - - } else { - goto invalid; - } - - *access |= right << shift; - } - - *access |= user; - - return NGX_CONF_OK; - -invalid: - - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, "invalid value \"%V\"", &value[i]); - - return NGX_CONF_ERROR; -} - - -ngx_int_t -ngx_add_path(ngx_conf_t *cf, ngx_path_t **slot) -{ - ngx_uint_t i, n; - ngx_path_t *path, **p; - - path = *slot; - - p = cf->cycle->paths.elts; - for (i = 0; i < cf->cycle->paths.nelts; i++) { - if (p[i]->name.len == path->name.len - && ngx_strcmp(p[i]->name.data, path->name.data) == 0) - { - if (p[i]->data != path->data) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "the same path name \"%V\" " - "used in %s:%ui and", - &p[i]->name, p[i]->conf_file, p[i]->line); - return NGX_ERROR; - } - - for (n = 0; n < NGX_MAX_PATH_LEVEL; n++) { - if (p[i]->level[n] != path->level[n]) { - if (path->conf_file == NULL) { - if (p[i]->conf_file == NULL) { - ngx_log_error(NGX_LOG_EMERG, cf->log, 0, - "the default path name \"%V\" has " - "the same name as another default path, " - "but the different levels, you need to " - "redefine one of them in http section", - &p[i]->name); - return NGX_ERROR; - } - - ngx_log_error(NGX_LOG_EMERG, cf->log, 0, - "the path name \"%V\" in %s:%ui has " - "the same name as default path, but " - "the different levels, you need to " - "define default path in http section", - &p[i]->name, p[i]->conf_file, p[i]->line); - return NGX_ERROR; - } - - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "the same path name \"%V\" in %s:%ui " - "has the different levels than", - &p[i]->name, p[i]->conf_file, p[i]->line); - return NGX_ERROR; - } - - if (p[i]->level[n] == 0) { - break; - } - } - - *slot = p[i]; - - return NGX_OK; - } - } - - p = ngx_array_push(&cf->cycle->paths); - if (p == NULL) { - return NGX_ERROR; - } - - *p = path; - - return NGX_OK; -} - - -ngx_int_t -ngx_create_paths(ngx_cycle_t *cycle, ngx_uid_t user) -{ - ngx_err_t err; - ngx_uint_t i; - ngx_path_t **path; - - path = cycle->paths.elts; - for (i = 0; i < cycle->paths.nelts; i++) { - - if (ngx_create_dir(path[i]->name.data, 0700) == NGX_FILE_ERROR) { - err = ngx_errno; - if (err != NGX_EEXIST) { - ngx_log_error(NGX_LOG_EMERG, cycle->log, err, - ngx_create_dir_n " \"%s\" failed", - path[i]->name.data); - return NGX_ERROR; - } - } - - if (user == (ngx_uid_t) NGX_CONF_UNSET_UINT) { - continue; - } - -#if !(NGX_WIN32) - { - ngx_file_info_t fi; - - if (ngx_file_info(path[i]->name.data, &fi) == NGX_FILE_ERROR) { - ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno, - ngx_file_info_n " \"%s\" failed", path[i]->name.data); - return NGX_ERROR; - } - - if (fi.st_uid != user) { - if (chown((const char *) path[i]->name.data, user, -1) == -1) { - ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno, - "chown(\"%s\", %d) failed", - path[i]->name.data, user); - return NGX_ERROR; - } - } - - if ((fi.st_mode & (S_IRUSR|S_IWUSR|S_IXUSR)) - != (S_IRUSR|S_IWUSR|S_IXUSR)) - { - fi.st_mode |= (S_IRUSR|S_IWUSR|S_IXUSR); - - if (chmod((const char *) path[i]->name.data, fi.st_mode) == -1) { - ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno, - "chmod() \"%s\" failed", path[i]->name.data); - return NGX_ERROR; - } - } - } -#endif - } - - return NGX_OK; -} - - -ngx_int_t -ngx_ext_rename_file(ngx_str_t *src, ngx_str_t *to, ngx_ext_rename_file_t *ext) -{ - u_char *name; - ngx_err_t err; - ngx_copy_file_t cf; - -#if !(NGX_WIN32) - - if (ext->access) { - if (ngx_change_file_access(src->data, ext->access) == NGX_FILE_ERROR) { - ngx_log_error(NGX_LOG_CRIT, ext->log, ngx_errno, - ngx_change_file_access_n " \"%s\" failed", src->data); - err = 0; - goto failed; - } - } - -#endif - - if (ext->time != -1) { - if (ngx_set_file_time(src->data, ext->fd, ext->time) != NGX_OK) { - ngx_log_error(NGX_LOG_CRIT, ext->log, ngx_errno, - ngx_set_file_time_n " \"%s\" failed", src->data); - err = 0; - goto failed; - } - } - - if (ngx_rename_file(src->data, to->data) != NGX_FILE_ERROR) { - return NGX_OK; - } - - err = ngx_errno; - - if (err == NGX_ENOPATH) { - - if (!ext->create_path) { - goto failed; - } - - err = ngx_create_full_path(to->data, ngx_dir_access(ext->path_access)); - - if (err) { - ngx_log_error(NGX_LOG_CRIT, ext->log, err, - ngx_create_dir_n " \"%s\" failed", to->data); - err = 0; - goto failed; - } - - if (ngx_rename_file(src->data, to->data) != NGX_FILE_ERROR) { - return NGX_OK; - } - - err = ngx_errno; - } - -#if (NGX_WIN32) - - if (err == NGX_EEXIST || err == NGX_EEXIST_FILE) { - err = ngx_win32_rename_file(src, to, ext->log); - - if (err == 0) { - return NGX_OK; - } - } - -#endif - - if (err == NGX_EXDEV) { - - cf.size = -1; - cf.buf_size = 0; - cf.access = ext->access; - cf.time = ext->time; - cf.log = ext->log; - - name = ngx_alloc(to->len + 1 + 10 + 1, ext->log); - if (name == NULL) { - return NGX_ERROR; - } - - (void) ngx_sprintf(name, "%*s.%010uD%Z", to->len, to->data, - (uint32_t) ngx_next_temp_number(0)); - - if (ngx_copy_file(src->data, name, &cf) == NGX_OK) { - - if (ngx_rename_file(name, to->data) != NGX_FILE_ERROR) { - ngx_free(name); - - if (ngx_delete_file(src->data) == NGX_FILE_ERROR) { - ngx_log_error(NGX_LOG_CRIT, ext->log, ngx_errno, - ngx_delete_file_n " \"%s\" failed", - src->data); - return NGX_ERROR; - } - - return NGX_OK; - } - - ngx_log_error(NGX_LOG_CRIT, ext->log, ngx_errno, - ngx_rename_file_n " \"%s\" to \"%s\" failed", - name, to->data); - - if (ngx_delete_file(name) == NGX_FILE_ERROR) { - ngx_log_error(NGX_LOG_CRIT, ext->log, ngx_errno, - ngx_delete_file_n " \"%s\" failed", name); - - } - } - - ngx_free(name); - - err = 0; - } - -failed: - - if (ext->delete_file) { - if (ngx_delete_file(src->data) == NGX_FILE_ERROR) { - ngx_log_error(NGX_LOG_CRIT, ext->log, ngx_errno, - ngx_delete_file_n " \"%s\" failed", src->data); - } - } - - if (err) { - ngx_log_error(NGX_LOG_CRIT, ext->log, err, - ngx_rename_file_n " \"%s\" to \"%s\" failed", - src->data, to->data); - } - - return NGX_ERROR; -} - - -ngx_int_t -ngx_copy_file(u_char *from, u_char *to, ngx_copy_file_t *cf) -{ - char *buf; - off_t size; - time_t time; - size_t len; - ssize_t n; - ngx_fd_t fd, nfd; - ngx_int_t rc; - ngx_uint_t access; - ngx_file_info_t fi; - - rc = NGX_ERROR; - buf = NULL; - nfd = NGX_INVALID_FILE; - - fd = ngx_open_file(from, NGX_FILE_RDONLY, NGX_FILE_OPEN, 0); - - if (fd == NGX_INVALID_FILE) { - ngx_log_error(NGX_LOG_CRIT, cf->log, ngx_errno, - ngx_open_file_n " \"%s\" failed", from); - goto failed; - } - - if (cf->size != -1 && cf->access != 0 && cf->time != -1) { - size = cf->size; - access = cf->access; - time = cf->time; - - } else { - if (ngx_fd_info(fd, &fi) == NGX_FILE_ERROR) { - ngx_log_error(NGX_LOG_ALERT, cf->log, ngx_errno, - ngx_fd_info_n " \"%s\" failed", from); - - goto failed; - } - - size = (cf->size != -1) ? cf->size : ngx_file_size(&fi); - access = cf->access ? cf->access : ngx_file_access(&fi); - time = (cf->time != -1) ? cf->time : ngx_file_mtime(&fi); - } - - len = cf->buf_size ? cf->buf_size : 65536; - - if ((off_t) len > size) { - len = (size_t) size; - } - - buf = ngx_alloc(len, cf->log); - if (buf == NULL) { - goto failed; - } - - nfd = ngx_open_file(to, NGX_FILE_WRONLY, NGX_FILE_TRUNCATE, access); - - if (nfd == NGX_INVALID_FILE) { - ngx_log_error(NGX_LOG_CRIT, cf->log, ngx_errno, - ngx_open_file_n " \"%s\" failed", to); - goto failed; - } - - while (size > 0) { - - if ((off_t) len > size) { - len = (size_t) size; - } - - n = ngx_read_fd(fd, buf, len); - - if (n == -1) { - ngx_log_error(NGX_LOG_ALERT, cf->log, ngx_errno, - ngx_read_fd_n " \"%s\" failed", from); - goto failed; - } - - if ((size_t) n != len) { - ngx_log_error(NGX_LOG_ALERT, cf->log, 0, - ngx_read_fd_n " has read only %z of %O from %s", - n, size, from); - goto failed; - } - - n = ngx_write_fd(nfd, buf, len); - - if (n == -1) { - ngx_log_error(NGX_LOG_ALERT, cf->log, ngx_errno, - ngx_write_fd_n " \"%s\" failed", to); - goto failed; - } - - if ((size_t) n != len) { - ngx_log_error(NGX_LOG_ALERT, cf->log, 0, - ngx_write_fd_n " has written only %z of %O to %s", - n, size, to); - goto failed; - } - - size -= n; - } - - if (ngx_set_file_time(to, nfd, time) != NGX_OK) { - ngx_log_error(NGX_LOG_ALERT, cf->log, ngx_errno, - ngx_set_file_time_n " \"%s\" failed", to); - goto failed; - } - - rc = NGX_OK; - -failed: - - if (nfd != NGX_INVALID_FILE) { - if (ngx_close_file(nfd) == NGX_FILE_ERROR) { - ngx_log_error(NGX_LOG_ALERT, cf->log, ngx_errno, - ngx_close_file_n " \"%s\" failed", to); - } - } - - if (fd != NGX_INVALID_FILE) { - if (ngx_close_file(fd) == NGX_FILE_ERROR) { - ngx_log_error(NGX_LOG_ALERT, cf->log, ngx_errno, - ngx_close_file_n " \"%s\" failed", from); - } - } - - if (buf) { - ngx_free(buf); - } - - return rc; -} - - -/* - * ctx->init_handler() - see ctx->alloc - * ctx->file_handler() - file handler - * ctx->pre_tree_handler() - handler is called before entering directory - * ctx->post_tree_handler() - handler is called after leaving directory - * ctx->spec_handler() - special (socket, FIFO, etc.) file handler - * - * ctx->data - some data structure, it may be the same on all levels, or - * reallocated if ctx->alloc is nonzero - * - * ctx->alloc - a size of data structure that is allocated at every level - * and is initialized by ctx->init_handler() - * - * ctx->log - a log - * - * on fatal (memory) error handler must return NGX_ABORT to stop walking tree - */ - -ngx_int_t -ngx_walk_tree(ngx_tree_ctx_t *ctx, ngx_str_t *tree) -{ - void *data, *prev; - u_char *p, *name; - size_t len; - ngx_int_t rc; - ngx_err_t err; - ngx_str_t file, buf; - ngx_dir_t dir; - - ngx_str_null(&buf); - - ngx_log_debug1(NGX_LOG_DEBUG_CORE, ctx->log, 0, - "walk tree \"%V\"", tree); - - if (ngx_open_dir(tree, &dir) == NGX_ERROR) { - ngx_log_error(NGX_LOG_CRIT, ctx->log, ngx_errno, - ngx_open_dir_n " \"%s\" failed", tree->data); - return NGX_ERROR; - } - - prev = ctx->data; - - if (ctx->alloc) { - data = ngx_alloc(ctx->alloc, ctx->log); - if (data == NULL) { - goto failed; - } - - if (ctx->init_handler(data, prev) == NGX_ABORT) { - goto failed; - } - - ctx->data = data; - - } else { - data = NULL; - } - - for ( ;; ) { - - ngx_set_errno(0); - - if (ngx_read_dir(&dir) == NGX_ERROR) { - err = ngx_errno; - - if (err == NGX_ENOMOREFILES) { - rc = NGX_OK; - - } else { - ngx_log_error(NGX_LOG_CRIT, ctx->log, err, - ngx_read_dir_n " \"%s\" failed", tree->data); - rc = NGX_ERROR; - } - - goto done; - } - - len = ngx_de_namelen(&dir); - name = ngx_de_name(&dir); - - ngx_log_debug2(NGX_LOG_DEBUG_CORE, ctx->log, 0, - "tree name %uz:\"%s\"", len, name); - - if (len == 1 && name[0] == '.') { - continue; - } - - if (len == 2 && name[0] == '.' && name[1] == '.') { - continue; - } - - file.len = tree->len + 1 + len; - - if (file.len > buf.len) { - - if (buf.len) { - ngx_free(buf.data); - } - - buf.len = tree->len + 1 + len; - - buf.data = ngx_alloc(buf.len + 1, ctx->log); - if (buf.data == NULL) { - goto failed; - } - } - - p = ngx_cpymem(buf.data, tree->data, tree->len); - *p++ = '/'; - ngx_memcpy(p, name, len + 1); - - file.data = buf.data; - - ngx_log_debug1(NGX_LOG_DEBUG_CORE, ctx->log, 0, - "tree path \"%s\"", file.data); - - if (!dir.valid_info) { - if (ngx_de_info(file.data, &dir) == NGX_FILE_ERROR) { - ngx_log_error(NGX_LOG_CRIT, ctx->log, ngx_errno, - ngx_de_info_n " \"%s\" failed", file.data); - continue; - } - } - - if (ngx_de_is_file(&dir)) { - - ngx_log_debug1(NGX_LOG_DEBUG_CORE, ctx->log, 0, - "tree file \"%s\"", file.data); - - ctx->size = ngx_de_size(&dir); - ctx->fs_size = ngx_de_fs_size(&dir); - ctx->access = ngx_de_access(&dir); - ctx->mtime = ngx_de_mtime(&dir); - - if (ctx->file_handler(ctx, &file) == NGX_ABORT) { - goto failed; - } - - } else if (ngx_de_is_dir(&dir)) { - - ngx_log_debug1(NGX_LOG_DEBUG_CORE, ctx->log, 0, - "tree enter dir \"%s\"", file.data); - - ctx->access = ngx_de_access(&dir); - ctx->mtime = ngx_de_mtime(&dir); - - rc = ctx->pre_tree_handler(ctx, &file); - - if (rc == NGX_ABORT) { - goto failed; - } - - if (rc == NGX_DECLINED) { - ngx_log_debug1(NGX_LOG_DEBUG_CORE, ctx->log, 0, - "tree skip dir \"%s\"", file.data); - continue; - } - - if (ngx_walk_tree(ctx, &file) == NGX_ABORT) { - goto failed; - } - - ctx->access = ngx_de_access(&dir); - ctx->mtime = ngx_de_mtime(&dir); - - if (ctx->post_tree_handler(ctx, &file) == NGX_ABORT) { - goto failed; - } - - } else { - - ngx_log_debug1(NGX_LOG_DEBUG_CORE, ctx->log, 0, - "tree special \"%s\"", file.data); - - if (ctx->spec_handler(ctx, &file) == NGX_ABORT) { - goto failed; - } - } - } - -failed: - - rc = NGX_ABORT; - -done: - - if (buf.len) { - ngx_free(buf.data); - } - - if (data) { - ngx_free(data); - ctx->data = prev; - } - - if (ngx_close_dir(&dir) == NGX_ERROR) { - ngx_log_error(NGX_LOG_CRIT, ctx->log, ngx_errno, - ngx_close_dir_n " \"%s\" failed", tree->data); - } - - return rc; -} diff --git a/src/deps/src/nginx-1.30.3/src/core/ngx_file.h b/src/deps/src/nginx-1.30.3/src/core/ngx_file.h deleted file mode 100644 index 320adc2952..0000000000 --- a/src/deps/src/nginx-1.30.3/src/core/ngx_file.h +++ /dev/null @@ -1,164 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#ifndef _NGX_FILE_H_INCLUDED_ -#define _NGX_FILE_H_INCLUDED_ - - -#include -#include - - -struct ngx_file_s { - ngx_fd_t fd; - ngx_str_t name; - ngx_file_info_t info; - - off_t offset; - off_t sys_offset; - - ngx_log_t *log; - -#if (NGX_THREADS || NGX_COMPAT) - ngx_int_t (*thread_handler)(ngx_thread_task_t *task, - ngx_file_t *file); - void *thread_ctx; - ngx_thread_task_t *thread_task; -#endif - -#if (NGX_HAVE_FILE_AIO || NGX_COMPAT) - ngx_event_aio_t *aio; -#endif - - unsigned valid_info:1; - unsigned directio:1; -}; - - -#define NGX_MAX_PATH_LEVEL 3 - - -typedef ngx_msec_t (*ngx_path_manager_pt) (void *data); -typedef ngx_msec_t (*ngx_path_purger_pt) (void *data); -typedef void (*ngx_path_loader_pt) (void *data); - - -typedef struct { - ngx_str_t name; - size_t len; - size_t level[NGX_MAX_PATH_LEVEL]; - - ngx_path_manager_pt manager; - ngx_path_purger_pt purger; - ngx_path_loader_pt loader; - void *data; - - u_char *conf_file; - ngx_uint_t line; -} ngx_path_t; - - -typedef struct { - ngx_str_t name; - size_t level[NGX_MAX_PATH_LEVEL]; -} ngx_path_init_t; - - -typedef struct { - ngx_file_t file; - off_t offset; - ngx_path_t *path; - ngx_pool_t *pool; - char *warn; - - ngx_uint_t access; - - unsigned log_level:8; - unsigned persistent:1; - unsigned clean:1; - unsigned thread_write:1; -} ngx_temp_file_t; - - -typedef struct { - ngx_uint_t access; - ngx_uint_t path_access; - time_t time; - ngx_fd_t fd; - - unsigned create_path:1; - unsigned delete_file:1; - - ngx_log_t *log; -} ngx_ext_rename_file_t; - - -typedef struct { - off_t size; - size_t buf_size; - - ngx_uint_t access; - time_t time; - - ngx_log_t *log; -} ngx_copy_file_t; - - -typedef struct ngx_tree_ctx_s ngx_tree_ctx_t; - -typedef ngx_int_t (*ngx_tree_init_handler_pt) (void *ctx, void *prev); -typedef ngx_int_t (*ngx_tree_handler_pt) (ngx_tree_ctx_t *ctx, ngx_str_t *name); - -struct ngx_tree_ctx_s { - off_t size; - off_t fs_size; - ngx_uint_t access; - time_t mtime; - - ngx_tree_init_handler_pt init_handler; - ngx_tree_handler_pt file_handler; - ngx_tree_handler_pt pre_tree_handler; - ngx_tree_handler_pt post_tree_handler; - ngx_tree_handler_pt spec_handler; - - void *data; - size_t alloc; - - ngx_log_t *log; -}; - - -ngx_int_t ngx_get_full_name(ngx_pool_t *pool, ngx_str_t *prefix, - ngx_str_t *name); - -ssize_t ngx_write_chain_to_temp_file(ngx_temp_file_t *tf, ngx_chain_t *chain); -ngx_int_t ngx_create_temp_file(ngx_file_t *file, ngx_path_t *path, - ngx_pool_t *pool, ngx_uint_t persistent, ngx_uint_t clean, - ngx_uint_t access); -void ngx_create_hashed_filename(ngx_path_t *path, u_char *file, size_t len); -ngx_int_t ngx_create_path(ngx_file_t *file, ngx_path_t *path); -ngx_err_t ngx_create_full_path(u_char *dir, ngx_uint_t access); -ngx_int_t ngx_add_path(ngx_conf_t *cf, ngx_path_t **slot); -ngx_int_t ngx_create_paths(ngx_cycle_t *cycle, ngx_uid_t user); -ngx_int_t ngx_ext_rename_file(ngx_str_t *src, ngx_str_t *to, - ngx_ext_rename_file_t *ext); -ngx_int_t ngx_copy_file(u_char *from, u_char *to, ngx_copy_file_t *cf); -ngx_int_t ngx_walk_tree(ngx_tree_ctx_t *ctx, ngx_str_t *tree); - -ngx_atomic_uint_t ngx_next_temp_number(ngx_uint_t collision); - -char *ngx_conf_set_path_slot(ngx_conf_t *cf, ngx_command_t *cmd, void *conf); -char *ngx_conf_merge_path_value(ngx_conf_t *cf, ngx_path_t **path, - ngx_path_t *prev, ngx_path_init_t *init); -char *ngx_conf_set_access_slot(ngx_conf_t *cf, ngx_command_t *cmd, void *conf); - - -extern ngx_atomic_t *ngx_temp_number; -extern ngx_atomic_int_t ngx_random_number; - - -#endif /* _NGX_FILE_H_INCLUDED_ */ diff --git a/src/deps/src/nginx-1.30.3/src/core/ngx_hash.c b/src/deps/src/nginx-1.30.3/src/core/ngx_hash.c deleted file mode 100644 index 8215c2717b..0000000000 --- a/src/deps/src/nginx-1.30.3/src/core/ngx_hash.c +++ /dev/null @@ -1,1013 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#include -#include - - -void * -ngx_hash_find(ngx_hash_t *hash, ngx_uint_t key, u_char *name, size_t len) -{ - ngx_uint_t i; - ngx_hash_elt_t *elt; - -#if 0 - ngx_log_error(NGX_LOG_ALERT, ngx_cycle->log, 0, "hf:\"%*s\"", len, name); -#endif - - elt = hash->buckets[key % hash->size]; - - if (elt == NULL) { - return NULL; - } - - while (elt->value) { - if (len != (size_t) elt->len) { - goto next; - } - - for (i = 0; i < len; i++) { - if (name[i] != elt->name[i]) { - goto next; - } - } - - return elt->value; - - next: - - elt = (ngx_hash_elt_t *) ngx_align_ptr(&elt->name[0] + elt->len, - sizeof(void *)); - continue; - } - - return NULL; -} - - -void * -ngx_hash_find_wc_head(ngx_hash_wildcard_t *hwc, u_char *name, size_t len) -{ - void *value; - ngx_uint_t i, n, key; - -#if 0 - ngx_log_error(NGX_LOG_ALERT, ngx_cycle->log, 0, "wch:\"%*s\"", len, name); -#endif - - n = len; - - while (n) { - if (name[n - 1] == '.') { - break; - } - - n--; - } - - key = 0; - - for (i = n; i < len; i++) { - key = ngx_hash(key, name[i]); - } - -#if 0 - ngx_log_error(NGX_LOG_ALERT, ngx_cycle->log, 0, "key:\"%ui\"", key); -#endif - - value = ngx_hash_find(&hwc->hash, key, &name[n], len - n); - -#if 0 - ngx_log_error(NGX_LOG_ALERT, ngx_cycle->log, 0, "value:\"%p\"", value); -#endif - - if (value) { - - /* - * the 2 low bits of value have the special meaning: - * 00 - value is data pointer for both "example.com" - * and "*.example.com"; - * 01 - value is data pointer for "*.example.com" only; - * 10 - value is pointer to wildcard hash allowing - * both "example.com" and "*.example.com"; - * 11 - value is pointer to wildcard hash allowing - * "*.example.com" only. - */ - - if ((uintptr_t) value & 2) { - - if (n == 0) { - - /* "example.com" */ - - if ((uintptr_t) value & 1) { - return NULL; - } - - hwc = (ngx_hash_wildcard_t *) - ((uintptr_t) value & (uintptr_t) ~3); - return hwc->value; - } - - hwc = (ngx_hash_wildcard_t *) ((uintptr_t) value & (uintptr_t) ~3); - - value = ngx_hash_find_wc_head(hwc, name, n - 1); - - if (value) { - return value; - } - - return hwc->value; - } - - if ((uintptr_t) value & 1) { - - if (n == 0) { - - /* "example.com" */ - - return NULL; - } - - return (void *) ((uintptr_t) value & (uintptr_t) ~3); - } - - return value; - } - - return hwc->value; -} - - -void * -ngx_hash_find_wc_tail(ngx_hash_wildcard_t *hwc, u_char *name, size_t len) -{ - void *value; - ngx_uint_t i, key; - -#if 0 - ngx_log_error(NGX_LOG_ALERT, ngx_cycle->log, 0, "wct:\"%*s\"", len, name); -#endif - - key = 0; - - for (i = 0; i < len; i++) { - if (name[i] == '.') { - break; - } - - key = ngx_hash(key, name[i]); - } - - if (i == len) { - return NULL; - } - -#if 0 - ngx_log_error(NGX_LOG_ALERT, ngx_cycle->log, 0, "key:\"%ui\"", key); -#endif - - value = ngx_hash_find(&hwc->hash, key, name, i); - -#if 0 - ngx_log_error(NGX_LOG_ALERT, ngx_cycle->log, 0, "value:\"%p\"", value); -#endif - - if (value) { - - /* - * the 2 low bits of value have the special meaning: - * 00 - value is data pointer; - * 11 - value is pointer to wildcard hash allowing "example.*". - */ - - if ((uintptr_t) value & 2) { - - i++; - - hwc = (ngx_hash_wildcard_t *) ((uintptr_t) value & (uintptr_t) ~3); - - value = ngx_hash_find_wc_tail(hwc, &name[i], len - i); - - if (value) { - return value; - } - - return hwc->value; - } - - return value; - } - - return hwc->value; -} - - -void * -ngx_hash_find_combined(ngx_hash_combined_t *hash, ngx_uint_t key, u_char *name, - size_t len) -{ - void *value; - - if (hash->hash.buckets) { - value = ngx_hash_find(&hash->hash, key, name, len); - - if (value) { - return value; - } - } - - if (len == 0) { - return NULL; - } - - if (hash->wc_head && hash->wc_head->hash.buckets) { - value = ngx_hash_find_wc_head(hash->wc_head, name, len); - - if (value) { - return value; - } - } - - if (hash->wc_tail && hash->wc_tail->hash.buckets) { - value = ngx_hash_find_wc_tail(hash->wc_tail, name, len); - - if (value) { - return value; - } - } - - return NULL; -} - - -#define NGX_HASH_ELT_SIZE(name) \ - (sizeof(void *) + ngx_align((name)->key.len + 2, sizeof(void *))) - -ngx_int_t -ngx_hash_init(ngx_hash_init_t *hinit, ngx_hash_key_t *names, ngx_uint_t nelts) -{ - u_char *elts; - size_t len; - u_short *test; - ngx_uint_t i, n, key, size, start, bucket_size; - ngx_hash_elt_t *elt, **buckets; - - if (hinit->max_size == 0) { - ngx_log_error(NGX_LOG_EMERG, hinit->pool->log, 0, - "could not build %s, you should " - "increase %s_max_size: %i", - hinit->name, hinit->name, hinit->max_size); - return NGX_ERROR; - } - - if (hinit->bucket_size > 65536 - ngx_cacheline_size) { - ngx_log_error(NGX_LOG_EMERG, hinit->pool->log, 0, - "could not build %s, too large " - "%s_bucket_size: %i", - hinit->name, hinit->name, hinit->bucket_size); - return NGX_ERROR; - } - - for (n = 0; n < nelts; n++) { - if (names[n].key.data == NULL) { - continue; - } - - if (hinit->bucket_size < NGX_HASH_ELT_SIZE(&names[n]) + sizeof(void *)) - { - ngx_log_error(NGX_LOG_EMERG, hinit->pool->log, 0, - "could not build %s, you should " - "increase %s_bucket_size: %i", - hinit->name, hinit->name, hinit->bucket_size); - return NGX_ERROR; - } - } - - test = ngx_alloc(hinit->max_size * sizeof(u_short), hinit->pool->log); - if (test == NULL) { - return NGX_ERROR; - } - - bucket_size = hinit->bucket_size - sizeof(void *); - - start = nelts / (bucket_size / (2 * sizeof(void *))); - start = start ? start : 1; - - if (hinit->max_size > 10000 && nelts && hinit->max_size / nelts < 100) { - start = hinit->max_size - 1000; - } - - for (size = start; size <= hinit->max_size; size++) { - - ngx_memzero(test, size * sizeof(u_short)); - - for (n = 0; n < nelts; n++) { - if (names[n].key.data == NULL) { - continue; - } - - key = names[n].key_hash % size; - len = test[key] + NGX_HASH_ELT_SIZE(&names[n]); - -#if 0 - ngx_log_error(NGX_LOG_ALERT, hinit->pool->log, 0, - "%ui: %ui %uz \"%V\"", - size, key, len, &names[n].key); -#endif - - if (len > bucket_size) { - goto next; - } - - test[key] = (u_short) len; - } - - goto found; - - next: - - continue; - } - - size = hinit->max_size; - - ngx_log_error(NGX_LOG_WARN, hinit->pool->log, 0, - "could not build optimal %s, you should increase " - "either %s_max_size: %i or %s_bucket_size: %i; " - "ignoring %s_bucket_size", - hinit->name, hinit->name, hinit->max_size, - hinit->name, hinit->bucket_size, hinit->name); - -found: - - for (i = 0; i < size; i++) { - test[i] = sizeof(void *); - } - - for (n = 0; n < nelts; n++) { - if (names[n].key.data == NULL) { - continue; - } - - key = names[n].key_hash % size; - len = test[key] + NGX_HASH_ELT_SIZE(&names[n]); - - if (len > 65536 - ngx_cacheline_size) { - ngx_log_error(NGX_LOG_EMERG, hinit->pool->log, 0, - "could not build %s, you should " - "increase %s_max_size: %i", - hinit->name, hinit->name, hinit->max_size); - ngx_free(test); - return NGX_ERROR; - } - - test[key] = (u_short) len; - } - - len = 0; - - for (i = 0; i < size; i++) { - if (test[i] == sizeof(void *)) { - continue; - } - - test[i] = (u_short) (ngx_align(test[i], ngx_cacheline_size)); - - len += test[i]; - } - - if (hinit->hash == NULL) { - hinit->hash = ngx_pcalloc(hinit->pool, sizeof(ngx_hash_wildcard_t) - + size * sizeof(ngx_hash_elt_t *)); - if (hinit->hash == NULL) { - ngx_free(test); - return NGX_ERROR; - } - - buckets = (ngx_hash_elt_t **) - ((u_char *) hinit->hash + sizeof(ngx_hash_wildcard_t)); - - } else { - buckets = ngx_pcalloc(hinit->pool, size * sizeof(ngx_hash_elt_t *)); - if (buckets == NULL) { - ngx_free(test); - return NGX_ERROR; - } - } - - elts = ngx_palloc(hinit->pool, len + ngx_cacheline_size); - if (elts == NULL) { - ngx_free(test); - return NGX_ERROR; - } - - elts = ngx_align_ptr(elts, ngx_cacheline_size); - - for (i = 0; i < size; i++) { - if (test[i] == sizeof(void *)) { - continue; - } - - buckets[i] = (ngx_hash_elt_t *) elts; - elts += test[i]; - } - - for (i = 0; i < size; i++) { - test[i] = 0; - } - - for (n = 0; n < nelts; n++) { - if (names[n].key.data == NULL) { - continue; - } - - key = names[n].key_hash % size; - elt = (ngx_hash_elt_t *) ((u_char *) buckets[key] + test[key]); - - elt->value = names[n].value; - elt->len = (u_short) names[n].key.len; - - ngx_strlow(elt->name, names[n].key.data, names[n].key.len); - - test[key] = (u_short) (test[key] + NGX_HASH_ELT_SIZE(&names[n])); - } - - for (i = 0; i < size; i++) { - if (buckets[i] == NULL) { - continue; - } - - elt = (ngx_hash_elt_t *) ((u_char *) buckets[i] + test[i]); - - elt->value = NULL; - } - - ngx_free(test); - - hinit->hash->buckets = buckets; - hinit->hash->size = size; - -#if 0 - - for (i = 0; i < size; i++) { - ngx_str_t val; - ngx_uint_t key; - - elt = buckets[i]; - - if (elt == NULL) { - ngx_log_error(NGX_LOG_ALERT, hinit->pool->log, 0, - "%ui: NULL", i); - continue; - } - - while (elt->value) { - val.len = elt->len; - val.data = &elt->name[0]; - - key = hinit->key(val.data, val.len); - - ngx_log_error(NGX_LOG_ALERT, hinit->pool->log, 0, - "%ui: %p \"%V\" %ui", i, elt, &val, key); - - elt = (ngx_hash_elt_t *) ngx_align_ptr(&elt->name[0] + elt->len, - sizeof(void *)); - } - } - -#endif - - return NGX_OK; -} - - -ngx_int_t -ngx_hash_wildcard_init(ngx_hash_init_t *hinit, ngx_hash_key_t *names, - ngx_uint_t nelts) -{ - size_t len, dot_len; - ngx_uint_t i, n, dot; - ngx_array_t curr_names, next_names; - ngx_hash_key_t *name, *next_name; - ngx_hash_init_t h; - ngx_hash_wildcard_t *wdc; - - if (ngx_array_init(&curr_names, hinit->temp_pool, nelts, - sizeof(ngx_hash_key_t)) - != NGX_OK) - { - return NGX_ERROR; - } - - if (ngx_array_init(&next_names, hinit->temp_pool, nelts, - sizeof(ngx_hash_key_t)) - != NGX_OK) - { - return NGX_ERROR; - } - - for (n = 0; n < nelts; n = i) { - -#if 0 - ngx_log_error(NGX_LOG_ALERT, hinit->pool->log, 0, - "wc0: \"%V\"", &names[n].key); -#endif - - dot = 0; - - for (len = 0; len < names[n].key.len; len++) { - if (names[n].key.data[len] == '.') { - dot = 1; - break; - } - } - - name = ngx_array_push(&curr_names); - if (name == NULL) { - return NGX_ERROR; - } - - name->key.len = len; - name->key.data = names[n].key.data; - name->key_hash = hinit->key(name->key.data, name->key.len); - name->value = names[n].value; - -#if 0 - ngx_log_error(NGX_LOG_ALERT, hinit->pool->log, 0, - "wc1: \"%V\" %ui", &name->key, dot); -#endif - - dot_len = len + 1; - - if (dot) { - len++; - } - - next_names.nelts = 0; - - if (names[n].key.len != len) { - next_name = ngx_array_push(&next_names); - if (next_name == NULL) { - return NGX_ERROR; - } - - next_name->key.len = names[n].key.len - len; - next_name->key.data = names[n].key.data + len; - next_name->key_hash = 0; - next_name->value = names[n].value; - -#if 0 - ngx_log_error(NGX_LOG_ALERT, hinit->pool->log, 0, - "wc2: \"%V\"", &next_name->key); -#endif - } - - for (i = n + 1; i < nelts; i++) { - if (ngx_strncmp(names[n].key.data, names[i].key.data, len) != 0) { - break; - } - - if (!dot - && names[i].key.len > len - && names[i].key.data[len] != '.') - { - break; - } - - next_name = ngx_array_push(&next_names); - if (next_name == NULL) { - return NGX_ERROR; - } - - next_name->key.len = names[i].key.len - dot_len; - next_name->key.data = names[i].key.data + dot_len; - next_name->key_hash = 0; - next_name->value = names[i].value; - -#if 0 - ngx_log_error(NGX_LOG_ALERT, hinit->pool->log, 0, - "wc3: \"%V\"", &next_name->key); -#endif - } - - if (next_names.nelts) { - - h = *hinit; - h.hash = NULL; - - if (ngx_hash_wildcard_init(&h, (ngx_hash_key_t *) next_names.elts, - next_names.nelts) - != NGX_OK) - { - return NGX_ERROR; - } - - wdc = (ngx_hash_wildcard_t *) h.hash; - - if (names[n].key.len == len) { - wdc->value = names[n].value; - } - - name->value = (void *) ((uintptr_t) wdc | (dot ? 3 : 2)); - - } else if (dot) { - name->value = (void *) ((uintptr_t) name->value | 1); - } - } - - if (ngx_hash_init(hinit, (ngx_hash_key_t *) curr_names.elts, - curr_names.nelts) - != NGX_OK) - { - return NGX_ERROR; - } - - return NGX_OK; -} - - -ngx_uint_t -ngx_hash_key(u_char *data, size_t len) -{ - ngx_uint_t i, key; - - key = 0; - - for (i = 0; i < len; i++) { - key = ngx_hash(key, data[i]); - } - - return key; -} - - -ngx_uint_t -ngx_hash_key_lc(u_char *data, size_t len) -{ - ngx_uint_t i, key; - - key = 0; - - for (i = 0; i < len; i++) { - key = ngx_hash(key, ngx_tolower(data[i])); - } - - return key; -} - - -ngx_uint_t -ngx_hash_strlow(u_char *dst, u_char *src, size_t n) -{ - ngx_uint_t key; - - key = 0; - - while (n--) { - *dst = ngx_tolower(*src); - key = ngx_hash(key, *dst); - dst++; - src++; - } - - return key; -} - - -ngx_int_t -ngx_hash_keys_array_init(ngx_hash_keys_arrays_t *ha, ngx_uint_t type) -{ - ngx_uint_t asize; - - if (type == NGX_HASH_SMALL) { - asize = 4; - ha->hsize = 107; - - } else { - asize = NGX_HASH_LARGE_ASIZE; - ha->hsize = NGX_HASH_LARGE_HSIZE; - } - - if (ngx_array_init(&ha->keys, ha->temp_pool, asize, sizeof(ngx_hash_key_t)) - != NGX_OK) - { - return NGX_ERROR; - } - - if (ngx_array_init(&ha->dns_wc_head, ha->temp_pool, asize, - sizeof(ngx_hash_key_t)) - != NGX_OK) - { - return NGX_ERROR; - } - - if (ngx_array_init(&ha->dns_wc_tail, ha->temp_pool, asize, - sizeof(ngx_hash_key_t)) - != NGX_OK) - { - return NGX_ERROR; - } - - ha->keys_hash = ngx_pcalloc(ha->temp_pool, sizeof(ngx_array_t) * ha->hsize); - if (ha->keys_hash == NULL) { - return NGX_ERROR; - } - - ha->dns_wc_head_hash = ngx_pcalloc(ha->temp_pool, - sizeof(ngx_array_t) * ha->hsize); - if (ha->dns_wc_head_hash == NULL) { - return NGX_ERROR; - } - - ha->dns_wc_tail_hash = ngx_pcalloc(ha->temp_pool, - sizeof(ngx_array_t) * ha->hsize); - if (ha->dns_wc_tail_hash == NULL) { - return NGX_ERROR; - } - - return NGX_OK; -} - - -ngx_int_t -ngx_hash_add_key(ngx_hash_keys_arrays_t *ha, ngx_str_t *key, void *value, - ngx_uint_t flags) -{ - size_t len; - u_char *p; - ngx_str_t *name; - ngx_uint_t i, k, n, skip, last; - ngx_array_t *keys, *hwc; - ngx_hash_key_t *hk; - - last = key->len; - - if (flags & NGX_HASH_WILDCARD_KEY) { - - /* - * supported wildcards: - * "*.example.com", ".example.com", and "www.example.*" - */ - - n = 0; - - for (i = 0; i < key->len; i++) { - - if (key->data[i] == '*') { - if (++n > 1) { - return NGX_DECLINED; - } - } - - if (key->data[i] == '.' && key->data[i + 1] == '.') { - return NGX_DECLINED; - } - - if (key->data[i] == '\0') { - return NGX_DECLINED; - } - } - - if (key->len > 1 && key->data[0] == '.') { - skip = 1; - goto wildcard; - } - - if (key->len > 2) { - - if (key->data[0] == '*' && key->data[1] == '.') { - skip = 2; - goto wildcard; - } - - if (key->data[i - 2] == '.' && key->data[i - 1] == '*') { - skip = 0; - last -= 2; - goto wildcard; - } - } - - if (n) { - return NGX_DECLINED; - } - } - - /* exact hash */ - - k = 0; - - for (i = 0; i < last; i++) { - if (!(flags & NGX_HASH_READONLY_KEY)) { - key->data[i] = ngx_tolower(key->data[i]); - } - k = ngx_hash(k, key->data[i]); - } - - k %= ha->hsize; - - /* check conflicts in exact hash */ - - name = ha->keys_hash[k].elts; - - if (name) { - for (i = 0; i < ha->keys_hash[k].nelts; i++) { - if (last != name[i].len) { - continue; - } - - if (ngx_strncmp(key->data, name[i].data, last) == 0) { - return NGX_BUSY; - } - } - - } else { - if (ngx_array_init(&ha->keys_hash[k], ha->temp_pool, 4, - sizeof(ngx_str_t)) - != NGX_OK) - { - return NGX_ERROR; - } - } - - name = ngx_array_push(&ha->keys_hash[k]); - if (name == NULL) { - return NGX_ERROR; - } - - *name = *key; - - hk = ngx_array_push(&ha->keys); - if (hk == NULL) { - return NGX_ERROR; - } - - hk->key = *key; - hk->key_hash = ngx_hash_key(key->data, last); - hk->value = value; - - return NGX_OK; - - -wildcard: - - /* wildcard hash */ - - k = ngx_hash_strlow(&key->data[skip], &key->data[skip], last - skip); - - k %= ha->hsize; - - if (skip == 1) { - - /* check conflicts in exact hash for ".example.com" */ - - name = ha->keys_hash[k].elts; - - if (name) { - len = last - skip; - - for (i = 0; i < ha->keys_hash[k].nelts; i++) { - if (len != name[i].len) { - continue; - } - - if (ngx_strncmp(&key->data[1], name[i].data, len) == 0) { - return NGX_BUSY; - } - } - - } else { - if (ngx_array_init(&ha->keys_hash[k], ha->temp_pool, 4, - sizeof(ngx_str_t)) - != NGX_OK) - { - return NGX_ERROR; - } - } - - name = ngx_array_push(&ha->keys_hash[k]); - if (name == NULL) { - return NGX_ERROR; - } - - name->len = last - 1; - name->data = ngx_pnalloc(ha->temp_pool, name->len); - if (name->data == NULL) { - return NGX_ERROR; - } - - ngx_memcpy(name->data, &key->data[1], name->len); - } - - - if (skip) { - - /* - * convert "*.example.com" to "com.example.\0" - * and ".example.com" to "com.example\0" - */ - - p = ngx_pnalloc(ha->temp_pool, last); - if (p == NULL) { - return NGX_ERROR; - } - - len = 0; - n = 0; - - for (i = last - 1; i; i--) { - if (key->data[i] == '.') { - ngx_memcpy(&p[n], &key->data[i + 1], len); - n += len; - p[n++] = '.'; - len = 0; - continue; - } - - len++; - } - - if (len) { - ngx_memcpy(&p[n], &key->data[1], len); - n += len; - } - - p[n] = '\0'; - - hwc = &ha->dns_wc_head; - keys = &ha->dns_wc_head_hash[k]; - - } else { - - /* convert "www.example.*" to "www.example\0" */ - - last++; - - p = ngx_pnalloc(ha->temp_pool, last); - if (p == NULL) { - return NGX_ERROR; - } - - ngx_cpystrn(p, key->data, last); - - hwc = &ha->dns_wc_tail; - keys = &ha->dns_wc_tail_hash[k]; - } - - - /* check conflicts in wildcard hash */ - - name = keys->elts; - - if (name) { - len = last - skip; - - for (i = 0; i < keys->nelts; i++) { - if (len != name[i].len) { - continue; - } - - if (ngx_strncmp(key->data + skip, name[i].data, len) == 0) { - return NGX_BUSY; - } - } - - } else { - if (ngx_array_init(keys, ha->temp_pool, 4, sizeof(ngx_str_t)) != NGX_OK) - { - return NGX_ERROR; - } - } - - name = ngx_array_push(keys); - if (name == NULL) { - return NGX_ERROR; - } - - name->len = last - skip; - name->data = ngx_pnalloc(ha->temp_pool, name->len); - if (name->data == NULL) { - return NGX_ERROR; - } - - ngx_memcpy(name->data, key->data + skip, name->len); - - - /* add to wildcard hash */ - - hk = ngx_array_push(hwc); - if (hk == NULL) { - return NGX_ERROR; - } - - hk->key.len = last - 1; - hk->key.data = p; - hk->key_hash = 0; - hk->value = value; - - return NGX_OK; -} diff --git a/src/deps/src/nginx-1.30.3/src/core/ngx_hash.h b/src/deps/src/nginx-1.30.3/src/core/ngx_hash.h deleted file mode 100644 index 3b57099289..0000000000 --- a/src/deps/src/nginx-1.30.3/src/core/ngx_hash.h +++ /dev/null @@ -1,125 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#ifndef _NGX_HASH_H_INCLUDED_ -#define _NGX_HASH_H_INCLUDED_ - - -#include -#include - - -typedef struct { - void *value; - u_short len; - u_char name[1]; -} ngx_hash_elt_t; - - -typedef struct { - ngx_hash_elt_t **buckets; - ngx_uint_t size; -} ngx_hash_t; - - -typedef struct { - ngx_hash_t hash; - void *value; -} ngx_hash_wildcard_t; - - -typedef struct { - ngx_str_t key; - ngx_uint_t key_hash; - void *value; -} ngx_hash_key_t; - - -typedef ngx_uint_t (*ngx_hash_key_pt) (u_char *data, size_t len); - - -typedef struct { - ngx_hash_t hash; - ngx_hash_wildcard_t *wc_head; - ngx_hash_wildcard_t *wc_tail; -} ngx_hash_combined_t; - - -typedef struct { - ngx_hash_t *hash; - ngx_hash_key_pt key; - - ngx_uint_t max_size; - ngx_uint_t bucket_size; - - char *name; - ngx_pool_t *pool; - ngx_pool_t *temp_pool; -} ngx_hash_init_t; - - -#define NGX_HASH_SMALL 1 -#define NGX_HASH_LARGE 2 - -#define NGX_HASH_LARGE_ASIZE 16384 -#define NGX_HASH_LARGE_HSIZE 10007 - -#define NGX_HASH_WILDCARD_KEY 1 -#define NGX_HASH_READONLY_KEY 2 - - -typedef struct { - ngx_uint_t hsize; - - ngx_pool_t *pool; - ngx_pool_t *temp_pool; - - ngx_array_t keys; - ngx_array_t *keys_hash; - - ngx_array_t dns_wc_head; - ngx_array_t *dns_wc_head_hash; - - ngx_array_t dns_wc_tail; - ngx_array_t *dns_wc_tail_hash; -} ngx_hash_keys_arrays_t; - - -typedef struct ngx_table_elt_s ngx_table_elt_t; - -struct ngx_table_elt_s { - ngx_uint_t hash; - ngx_str_t key; - ngx_str_t value; - u_char *lowcase_key; - ngx_table_elt_t *next; -}; - - -void *ngx_hash_find(ngx_hash_t *hash, ngx_uint_t key, u_char *name, size_t len); -void *ngx_hash_find_wc_head(ngx_hash_wildcard_t *hwc, u_char *name, size_t len); -void *ngx_hash_find_wc_tail(ngx_hash_wildcard_t *hwc, u_char *name, size_t len); -void *ngx_hash_find_combined(ngx_hash_combined_t *hash, ngx_uint_t key, - u_char *name, size_t len); - -ngx_int_t ngx_hash_init(ngx_hash_init_t *hinit, ngx_hash_key_t *names, - ngx_uint_t nelts); -ngx_int_t ngx_hash_wildcard_init(ngx_hash_init_t *hinit, ngx_hash_key_t *names, - ngx_uint_t nelts); - -#define ngx_hash(key, c) ((ngx_uint_t) key * 31 + c) -ngx_uint_t ngx_hash_key(u_char *data, size_t len); -ngx_uint_t ngx_hash_key_lc(u_char *data, size_t len); -ngx_uint_t ngx_hash_strlow(u_char *dst, u_char *src, size_t n); - - -ngx_int_t ngx_hash_keys_array_init(ngx_hash_keys_arrays_t *ha, ngx_uint_t type); -ngx_int_t ngx_hash_add_key(ngx_hash_keys_arrays_t *ha, ngx_str_t *key, - void *value, ngx_uint_t flags); - - -#endif /* _NGX_HASH_H_INCLUDED_ */ diff --git a/src/deps/src/nginx-1.30.3/src/core/ngx_inet.c b/src/deps/src/nginx-1.30.3/src/core/ngx_inet.c deleted file mode 100644 index 2233e617bb..0000000000 --- a/src/deps/src/nginx-1.30.3/src/core/ngx_inet.c +++ /dev/null @@ -1,1499 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#include -#include - - -static ngx_int_t ngx_parse_unix_domain_url(ngx_pool_t *pool, ngx_url_t *u); -static ngx_int_t ngx_parse_inet_url(ngx_pool_t *pool, ngx_url_t *u); -static ngx_int_t ngx_parse_inet6_url(ngx_pool_t *pool, ngx_url_t *u); -static ngx_int_t ngx_inet_add_addr(ngx_pool_t *pool, ngx_url_t *u, - struct sockaddr *sockaddr, socklen_t socklen, ngx_uint_t total); - - -in_addr_t -ngx_inet_addr(u_char *text, size_t len) -{ - u_char *p, c; - in_addr_t addr; - ngx_uint_t octet, n; - - addr = 0; - octet = 0; - n = 0; - - for (p = text; p < text + len; p++) { - c = *p; - - if (c >= '0' && c <= '9') { - octet = octet * 10 + (c - '0'); - - if (octet > 255) { - return INADDR_NONE; - } - - continue; - } - - if (c == '.') { - addr = (addr << 8) + octet; - octet = 0; - n++; - continue; - } - - return INADDR_NONE; - } - - if (n == 3) { - addr = (addr << 8) + octet; - return htonl(addr); - } - - return INADDR_NONE; -} - - -#if (NGX_HAVE_INET6) - -ngx_int_t -ngx_inet6_addr(u_char *p, size_t len, u_char *addr) -{ - u_char c, *zero, *digit, *s, *d; - size_t len4; - ngx_uint_t n, nibbles, word; - - if (len == 0) { - return NGX_ERROR; - } - - zero = NULL; - digit = NULL; - len4 = 0; - nibbles = 0; - word = 0; - n = 8; - - if (p[0] == ':') { - p++; - len--; - } - - for (/* void */; len; len--) { - c = *p++; - - if (c == ':') { - if (nibbles) { - digit = p; - len4 = len; - *addr++ = (u_char) (word >> 8); - *addr++ = (u_char) (word & 0xff); - - if (--n) { - nibbles = 0; - word = 0; - continue; - } - - } else { - if (zero == NULL) { - digit = p; - len4 = len; - zero = addr; - continue; - } - } - - return NGX_ERROR; - } - - if (c == '.' && nibbles) { - if (n < 2 || digit == NULL) { - return NGX_ERROR; - } - - word = ngx_inet_addr(digit, len4 - 1); - if (word == INADDR_NONE) { - return NGX_ERROR; - } - - word = ntohl(word); - *addr++ = (u_char) ((word >> 24) & 0xff); - *addr++ = (u_char) ((word >> 16) & 0xff); - n--; - break; - } - - if (++nibbles > 4) { - return NGX_ERROR; - } - - if (c >= '0' && c <= '9') { - word = word * 16 + (c - '0'); - continue; - } - - c |= 0x20; - - if (c >= 'a' && c <= 'f') { - word = word * 16 + (c - 'a') + 10; - continue; - } - - return NGX_ERROR; - } - - if (nibbles == 0 && zero == NULL) { - return NGX_ERROR; - } - - *addr++ = (u_char) (word >> 8); - *addr++ = (u_char) (word & 0xff); - - if (--n) { - if (zero) { - n *= 2; - s = addr - 1; - d = s + n; - while (s >= zero) { - *d-- = *s--; - } - ngx_memzero(zero, n); - return NGX_OK; - } - - } else { - if (zero == NULL) { - return NGX_OK; - } - } - - return NGX_ERROR; -} - -#endif - - -size_t -ngx_sock_ntop(struct sockaddr *sa, socklen_t socklen, u_char *text, size_t len, - ngx_uint_t port) -{ - u_char *p; -#if (NGX_HAVE_INET6 || NGX_HAVE_UNIX_DOMAIN) - size_t n; -#endif - struct sockaddr_in *sin; -#if (NGX_HAVE_INET6) - struct sockaddr_in6 *sin6; -#endif -#if (NGX_HAVE_UNIX_DOMAIN) - struct sockaddr_un *saun; -#endif - - switch (sa->sa_family) { - - case AF_INET: - - sin = (struct sockaddr_in *) sa; - p = (u_char *) &sin->sin_addr; - - if (port) { - p = ngx_snprintf(text, len, "%ud.%ud.%ud.%ud:%d", - p[0], p[1], p[2], p[3], ntohs(sin->sin_port)); - } else { - p = ngx_snprintf(text, len, "%ud.%ud.%ud.%ud", - p[0], p[1], p[2], p[3]); - } - - return (p - text); - -#if (NGX_HAVE_INET6) - - case AF_INET6: - - sin6 = (struct sockaddr_in6 *) sa; - - n = 0; - - if (port) { - text[n++] = '['; - } - - n = ngx_inet6_ntop(sin6->sin6_addr.s6_addr, &text[n], len); - - if (port) { - n = ngx_sprintf(&text[1 + n], "]:%d", - ntohs(sin6->sin6_port)) - text; - } - - return n; -#endif - -#if (NGX_HAVE_UNIX_DOMAIN) - - case AF_UNIX: - saun = (struct sockaddr_un *) sa; - - /* on Linux sockaddr might not include sun_path at all */ - - if (socklen <= (socklen_t) offsetof(struct sockaddr_un, sun_path)) { - p = ngx_snprintf(text, len, "unix:%Z"); - - } else { - n = ngx_strnlen((u_char *) saun->sun_path, - socklen - offsetof(struct sockaddr_un, sun_path)); - p = ngx_snprintf(text, len, "unix:%*s%Z", n, saun->sun_path); - } - - /* we do not include trailing zero in address length */ - - return (p - text - 1); - -#endif - - default: - return 0; - } -} - - -size_t -ngx_inet_ntop(int family, void *addr, u_char *text, size_t len) -{ - u_char *p; - - switch (family) { - - case AF_INET: - - p = addr; - - return ngx_snprintf(text, len, "%ud.%ud.%ud.%ud", - p[0], p[1], p[2], p[3]) - - text; - -#if (NGX_HAVE_INET6) - - case AF_INET6: - return ngx_inet6_ntop(addr, text, len); - -#endif - - default: - return 0; - } -} - - -#if (NGX_HAVE_INET6) - -size_t -ngx_inet6_ntop(u_char *p, u_char *text, size_t len) -{ - u_char *dst; - size_t max, n; - ngx_uint_t i, zero, last; - - if (len < NGX_INET6_ADDRSTRLEN) { - return 0; - } - - zero = (ngx_uint_t) -1; - last = (ngx_uint_t) -1; - max = 1; - n = 0; - - for (i = 0; i < 16; i += 2) { - - if (p[i] || p[i + 1]) { - - if (max < n) { - zero = last; - max = n; - } - - n = 0; - continue; - } - - if (n++ == 0) { - last = i; - } - } - - if (max < n) { - zero = last; - max = n; - } - - dst = text; - n = 16; - - if (zero == 0) { - - if ((max == 5 && p[10] == 0xff && p[11] == 0xff) - || (max == 6) - || (max == 7 && p[14] != 0 && p[15] != 1)) - { - n = 12; - } - - *dst++ = ':'; - } - - for (i = 0; i < n; i += 2) { - - if (i == zero) { - *dst++ = ':'; - i += (max - 1) * 2; - continue; - } - - dst = ngx_sprintf(dst, "%xd", p[i] * 256 + p[i + 1]); - - if (i < 14) { - *dst++ = ':'; - } - } - - if (n == 12) { - dst = ngx_sprintf(dst, "%ud.%ud.%ud.%ud", p[12], p[13], p[14], p[15]); - } - - return dst - text; -} - -#endif - - -ngx_int_t -ngx_ptocidr(ngx_str_t *text, ngx_cidr_t *cidr) -{ - u_char *addr, *mask, *last; - size_t len; - ngx_int_t shift; -#if (NGX_HAVE_INET6) - ngx_int_t rc; - ngx_uint_t s, i; -#endif - - addr = text->data; - last = addr + text->len; - - mask = ngx_strlchr(addr, last, '/'); - len = (mask ? mask : last) - addr; - - cidr->u.in.addr = ngx_inet_addr(addr, len); - - if (cidr->u.in.addr != INADDR_NONE) { - cidr->family = AF_INET; - - if (mask == NULL) { - cidr->u.in.mask = 0xffffffff; - return NGX_OK; - } - -#if (NGX_HAVE_INET6) - } else if (ngx_inet6_addr(addr, len, cidr->u.in6.addr.s6_addr) == NGX_OK) { - cidr->family = AF_INET6; - - if (mask == NULL) { - ngx_memset(cidr->u.in6.mask.s6_addr, 0xff, 16); - return NGX_OK; - } - -#endif - } else { - return NGX_ERROR; - } - - mask++; - - shift = ngx_atoi(mask, last - mask); - if (shift == NGX_ERROR) { - return NGX_ERROR; - } - - switch (cidr->family) { - -#if (NGX_HAVE_INET6) - case AF_INET6: - if (shift > 128) { - return NGX_ERROR; - } - - addr = cidr->u.in6.addr.s6_addr; - mask = cidr->u.in6.mask.s6_addr; - rc = NGX_OK; - - for (i = 0; i < 16; i++) { - - s = (shift > 8) ? 8 : shift; - shift -= s; - - mask[i] = (u_char) (0xffu << (8 - s)); - - if (addr[i] != (addr[i] & mask[i])) { - rc = NGX_DONE; - addr[i] &= mask[i]; - } - } - - return rc; -#endif - - default: /* AF_INET */ - if (shift > 32) { - return NGX_ERROR; - } - - if (shift) { - cidr->u.in.mask = htonl((uint32_t) (0xffffffffu << (32 - shift))); - - } else { - /* x86 compilers use a shl instruction that shifts by modulo 32 */ - cidr->u.in.mask = 0; - } - - if (cidr->u.in.addr == (cidr->u.in.addr & cidr->u.in.mask)) { - return NGX_OK; - } - - cidr->u.in.addr &= cidr->u.in.mask; - - return NGX_DONE; - } -} - - -ngx_int_t -ngx_cidr_match(struct sockaddr *sa, ngx_array_t *cidrs) -{ -#if (NGX_HAVE_INET6) - u_char *p; -#endif - in_addr_t inaddr; - ngx_cidr_t *cidr; - ngx_uint_t family, i; -#if (NGX_HAVE_INET6) - ngx_uint_t n; - struct in6_addr *inaddr6; -#endif - -#if (NGX_SUPPRESS_WARN) - inaddr = 0; -#if (NGX_HAVE_INET6) - inaddr6 = NULL; -#endif -#endif - - family = sa->sa_family; - - if (family == AF_INET) { - inaddr = ((struct sockaddr_in *) sa)->sin_addr.s_addr; - } - -#if (NGX_HAVE_INET6) - else if (family == AF_INET6) { - inaddr6 = &((struct sockaddr_in6 *) sa)->sin6_addr; - - if (IN6_IS_ADDR_V4MAPPED(inaddr6)) { - family = AF_INET; - - p = inaddr6->s6_addr; - - inaddr = (in_addr_t) p[12] << 24; - inaddr += p[13] << 16; - inaddr += p[14] << 8; - inaddr += p[15]; - - inaddr = htonl(inaddr); - } - } -#endif - - for (cidr = cidrs->elts, i = 0; i < cidrs->nelts; i++) { - if (cidr[i].family != family) { - goto next; - } - - switch (family) { - -#if (NGX_HAVE_INET6) - case AF_INET6: - for (n = 0; n < 16; n++) { - if ((inaddr6->s6_addr[n] & cidr[i].u.in6.mask.s6_addr[n]) - != cidr[i].u.in6.addr.s6_addr[n]) - { - goto next; - } - } - break; -#endif - -#if (NGX_HAVE_UNIX_DOMAIN) - case AF_UNIX: - break; -#endif - - default: /* AF_INET */ - if ((inaddr & cidr[i].u.in.mask) != cidr[i].u.in.addr) { - goto next; - } - break; - } - - return NGX_OK; - - next: - continue; - } - - return NGX_DECLINED; -} - - -ngx_int_t -ngx_parse_addr(ngx_pool_t *pool, ngx_addr_t *addr, u_char *text, size_t len) -{ - in_addr_t inaddr; - ngx_uint_t family; - struct sockaddr_in *sin; -#if (NGX_HAVE_INET6) - struct in6_addr inaddr6; - struct sockaddr_in6 *sin6; - - /* - * prevent MSVC8 warning: - * potentially uninitialized local variable 'inaddr6' used - */ - ngx_memzero(&inaddr6, sizeof(struct in6_addr)); -#endif - - inaddr = ngx_inet_addr(text, len); - - if (inaddr != INADDR_NONE) { - family = AF_INET; - len = sizeof(struct sockaddr_in); - -#if (NGX_HAVE_INET6) - } else if (ngx_inet6_addr(text, len, inaddr6.s6_addr) == NGX_OK) { - family = AF_INET6; - len = sizeof(struct sockaddr_in6); - -#endif - } else { - return NGX_DECLINED; - } - - addr->sockaddr = ngx_pcalloc(pool, len); - if (addr->sockaddr == NULL) { - return NGX_ERROR; - } - - addr->sockaddr->sa_family = (u_char) family; - addr->socklen = len; - - switch (family) { - -#if (NGX_HAVE_INET6) - case AF_INET6: - sin6 = (struct sockaddr_in6 *) addr->sockaddr; - ngx_memcpy(sin6->sin6_addr.s6_addr, inaddr6.s6_addr, 16); - break; -#endif - - default: /* AF_INET */ - sin = (struct sockaddr_in *) addr->sockaddr; - sin->sin_addr.s_addr = inaddr; - break; - } - - return NGX_OK; -} - - -ngx_int_t -ngx_parse_addr_port(ngx_pool_t *pool, ngx_addr_t *addr, u_char *text, - size_t len) -{ - u_char *p, *last; - size_t plen; - ngx_int_t rc, port; - - rc = ngx_parse_addr(pool, addr, text, len); - - if (rc != NGX_DECLINED) { - return rc; - } - - last = text + len; - -#if (NGX_HAVE_INET6) - if (len && text[0] == '[') { - - p = ngx_strlchr(text, last, ']'); - - if (p == last - 1) { - return ngx_parse_addr(pool, addr, text + 1, len - 2); - } - - if (p == NULL || *++p != ':') { - return NGX_DECLINED; - } - - text++; - len -= 2; - - } else -#endif - - { - p = ngx_strlchr(text, last, ':'); - - if (p == NULL) { - return NGX_DECLINED; - } - } - - p++; - plen = last - p; - - port = ngx_atoi(p, plen); - - if (port < 1 || port > 65535) { - return NGX_DECLINED; - } - - len -= plen + 1; - - rc = ngx_parse_addr(pool, addr, text, len); - - if (rc != NGX_OK) { - return rc; - } - - ngx_inet_set_port(addr->sockaddr, (in_port_t) port); - - return NGX_OK; -} - - -ngx_int_t -ngx_parse_url(ngx_pool_t *pool, ngx_url_t *u) -{ - u_char *p; - size_t len; - - p = u->url.data; - len = u->url.len; - - if (len >= 5 && ngx_strncasecmp(p, (u_char *) "unix:", 5) == 0) { - return ngx_parse_unix_domain_url(pool, u); - } - - if (len && p[0] == '[') { - return ngx_parse_inet6_url(pool, u); - } - - return ngx_parse_inet_url(pool, u); -} - - -static ngx_int_t -ngx_parse_unix_domain_url(ngx_pool_t *pool, ngx_url_t *u) -{ -#if (NGX_HAVE_UNIX_DOMAIN) - u_char *path, *uri, *last; - size_t len; - struct sockaddr_un *saun; - - len = u->url.len; - path = u->url.data; - - path += 5; - len -= 5; - - if (u->uri_part) { - - last = path + len; - uri = ngx_strlchr(path, last, ':'); - - if (uri) { - len = uri - path; - uri++; - u->uri.len = last - uri; - u->uri.data = uri; - } - } - - if (len == 0) { - u->err = "no path in the unix domain socket"; - return NGX_ERROR; - } - - u->host.len = len++; - u->host.data = path; - - if (len > sizeof(saun->sun_path)) { - u->err = "too long path in the unix domain socket"; - return NGX_ERROR; - } - - u->socklen = sizeof(struct sockaddr_un); - saun = (struct sockaddr_un *) &u->sockaddr; - saun->sun_family = AF_UNIX; - (void) ngx_cpystrn((u_char *) saun->sun_path, path, len); - - u->addrs = ngx_pcalloc(pool, sizeof(ngx_addr_t)); - if (u->addrs == NULL) { - return NGX_ERROR; - } - - saun = ngx_pcalloc(pool, sizeof(struct sockaddr_un)); - if (saun == NULL) { - return NGX_ERROR; - } - - u->family = AF_UNIX; - u->naddrs = 1; - - saun->sun_family = AF_UNIX; - (void) ngx_cpystrn((u_char *) saun->sun_path, path, len); - - u->addrs[0].sockaddr = (struct sockaddr *) saun; - u->addrs[0].socklen = sizeof(struct sockaddr_un); - u->addrs[0].name.len = len + 4; - u->addrs[0].name.data = u->url.data; - - return NGX_OK; - -#else - - u->err = "the unix domain sockets are not supported on this platform"; - - return NGX_ERROR; - -#endif -} - - -static ngx_int_t -ngx_parse_inet_url(ngx_pool_t *pool, ngx_url_t *u) -{ - u_char *host, *port, *last, *uri, *args, *dash; - size_t len; - ngx_int_t n; - struct sockaddr_in *sin; - - u->socklen = sizeof(struct sockaddr_in); - sin = (struct sockaddr_in *) &u->sockaddr; - sin->sin_family = AF_INET; - - u->family = AF_INET; - - host = u->url.data; - - last = host + u->url.len; - - port = ngx_strlchr(host, last, ':'); - - uri = ngx_strlchr(host, last, '/'); - - args = ngx_strlchr(host, last, '?'); - - if (args) { - if (uri == NULL || args < uri) { - uri = args; - } - } - - if (uri) { - if (u->listen || !u->uri_part) { - u->err = "invalid host"; - return NGX_ERROR; - } - - u->uri.len = last - uri; - u->uri.data = uri; - - last = uri; - - if (uri < port) { - port = NULL; - } - } - - if (port) { - port++; - - len = last - port; - - if (u->listen) { - dash = ngx_strlchr(port, last, '-'); - - if (dash) { - dash++; - - n = ngx_atoi(dash, last - dash); - - if (n < 1 || n > 65535) { - u->err = "invalid port"; - return NGX_ERROR; - } - - u->last_port = (in_port_t) n; - - len = dash - port - 1; - } - } - - n = ngx_atoi(port, len); - - if (n < 1 || n > 65535) { - u->err = "invalid port"; - return NGX_ERROR; - } - - if (u->last_port && n > u->last_port) { - u->err = "invalid port range"; - return NGX_ERROR; - } - - u->port = (in_port_t) n; - sin->sin_port = htons((in_port_t) n); - - u->port_text.len = last - port; - u->port_text.data = port; - - last = port - 1; - - } else { - if (uri == NULL) { - - if (u->listen) { - - /* test value as port only */ - - len = last - host; - - dash = ngx_strlchr(host, last, '-'); - - if (dash) { - dash++; - - n = ngx_atoi(dash, last - dash); - - if (n == NGX_ERROR) { - goto no_port; - } - - if (n < 1 || n > 65535) { - u->err = "invalid port"; - - } else { - u->last_port = (in_port_t) n; - } - - len = dash - host - 1; - } - - n = ngx_atoi(host, len); - - if (n != NGX_ERROR) { - - if (u->err) { - return NGX_ERROR; - } - - if (n < 1 || n > 65535) { - u->err = "invalid port"; - return NGX_ERROR; - } - - if (u->last_port && n > u->last_port) { - u->err = "invalid port range"; - return NGX_ERROR; - } - - u->port = (in_port_t) n; - sin->sin_port = htons((in_port_t) n); - sin->sin_addr.s_addr = INADDR_ANY; - - u->port_text.len = last - host; - u->port_text.data = host; - - u->wildcard = 1; - - return ngx_inet_add_addr(pool, u, &u->sockaddr.sockaddr, - u->socklen, 1); - } - } - } - -no_port: - - u->err = NULL; - u->no_port = 1; - u->port = u->default_port; - sin->sin_port = htons(u->default_port); - u->last_port = 0; - } - - len = last - host; - - if (len == 0) { - u->err = "no host"; - return NGX_ERROR; - } - - u->host.len = len; - u->host.data = host; - - if (u->listen && len == 1 && *host == '*') { - sin->sin_addr.s_addr = INADDR_ANY; - u->wildcard = 1; - return ngx_inet_add_addr(pool, u, &u->sockaddr.sockaddr, u->socklen, 1); - } - - sin->sin_addr.s_addr = ngx_inet_addr(host, len); - - if (sin->sin_addr.s_addr != INADDR_NONE) { - - if (sin->sin_addr.s_addr == INADDR_ANY) { - u->wildcard = 1; - } - - return ngx_inet_add_addr(pool, u, &u->sockaddr.sockaddr, u->socklen, 1); - } - - if (u->no_resolve) { - return NGX_OK; - } - - if (ngx_inet_resolve_host(pool, u) != NGX_OK) { - return NGX_ERROR; - } - - u->family = u->addrs[0].sockaddr->sa_family; - u->socklen = u->addrs[0].socklen; - ngx_memcpy(&u->sockaddr, u->addrs[0].sockaddr, u->addrs[0].socklen); - u->wildcard = ngx_inet_wildcard(&u->sockaddr.sockaddr); - - return NGX_OK; -} - - -static ngx_int_t -ngx_parse_inet6_url(ngx_pool_t *pool, ngx_url_t *u) -{ -#if (NGX_HAVE_INET6) - u_char *p, *host, *port, *last, *uri, *dash; - size_t len; - ngx_int_t n; - struct sockaddr_in6 *sin6; - - u->socklen = sizeof(struct sockaddr_in6); - sin6 = (struct sockaddr_in6 *) &u->sockaddr; - sin6->sin6_family = AF_INET6; - - host = u->url.data + 1; - - last = u->url.data + u->url.len; - - p = ngx_strlchr(host, last, ']'); - - if (p == NULL) { - u->err = "invalid host"; - return NGX_ERROR; - } - - port = p + 1; - - uri = ngx_strlchr(port, last, '/'); - - if (uri) { - if (u->listen || !u->uri_part) { - u->err = "invalid host"; - return NGX_ERROR; - } - - u->uri.len = last - uri; - u->uri.data = uri; - - last = uri; - } - - if (port < last) { - if (*port != ':') { - u->err = "invalid host"; - return NGX_ERROR; - } - - port++; - - len = last - port; - - if (u->listen) { - dash = ngx_strlchr(port, last, '-'); - - if (dash) { - dash++; - - n = ngx_atoi(dash, last - dash); - - if (n < 1 || n > 65535) { - u->err = "invalid port"; - return NGX_ERROR; - } - - u->last_port = (in_port_t) n; - - len = dash - port - 1; - } - } - - n = ngx_atoi(port, len); - - if (n < 1 || n > 65535) { - u->err = "invalid port"; - return NGX_ERROR; - } - - if (u->last_port && n > u->last_port) { - u->err = "invalid port range"; - return NGX_ERROR; - } - - u->port = (in_port_t) n; - sin6->sin6_port = htons((in_port_t) n); - - u->port_text.len = last - port; - u->port_text.data = port; - - } else { - u->no_port = 1; - u->port = u->default_port; - sin6->sin6_port = htons(u->default_port); - } - - len = p - host; - - if (len == 0) { - u->err = "no host"; - return NGX_ERROR; - } - - u->host.len = len + 2; - u->host.data = host - 1; - - if (ngx_inet6_addr(host, len, sin6->sin6_addr.s6_addr) != NGX_OK) { - u->err = "invalid IPv6 address"; - return NGX_ERROR; - } - - if (IN6_IS_ADDR_UNSPECIFIED(&sin6->sin6_addr)) { - u->wildcard = 1; - } - - u->family = AF_INET6; - - return ngx_inet_add_addr(pool, u, &u->sockaddr.sockaddr, u->socklen, 1); - -#else - - u->err = "the INET6 sockets are not supported on this platform"; - - return NGX_ERROR; - -#endif -} - - -#if (NGX_HAVE_GETADDRINFO && NGX_HAVE_INET6) - -ngx_int_t -ngx_inet_resolve_host(ngx_pool_t *pool, ngx_url_t *u) -{ - u_char *host; - ngx_uint_t n; - struct addrinfo hints, *res, *rp; - - host = ngx_alloc(u->host.len + 1, pool->log); - if (host == NULL) { - return NGX_ERROR; - } - - (void) ngx_cpystrn(host, u->host.data, u->host.len + 1); - - ngx_memzero(&hints, sizeof(struct addrinfo)); - hints.ai_family = AF_UNSPEC; - hints.ai_socktype = SOCK_STREAM; -#ifdef AI_ADDRCONFIG - hints.ai_flags = AI_ADDRCONFIG; -#endif - - if (getaddrinfo((char *) host, NULL, &hints, &res) != 0) { - u->err = "host not found"; - ngx_free(host); - return NGX_ERROR; - } - - ngx_free(host); - - for (n = 0, rp = res; rp != NULL; rp = rp->ai_next) { - - switch (rp->ai_family) { - - case AF_INET: - case AF_INET6: - break; - - default: - continue; - } - - n++; - } - - if (n == 0) { - u->err = "host not found"; - goto failed; - } - - /* MP: ngx_shared_palloc() */ - - for (rp = res; rp != NULL; rp = rp->ai_next) { - - switch (rp->ai_family) { - - case AF_INET: - case AF_INET6: - break; - - default: - continue; - } - - if (ngx_inet_add_addr(pool, u, rp->ai_addr, rp->ai_addrlen, n) - != NGX_OK) - { - goto failed; - } - } - - freeaddrinfo(res); - return NGX_OK; - -failed: - - freeaddrinfo(res); - return NGX_ERROR; -} - -#else /* !NGX_HAVE_GETADDRINFO || !NGX_HAVE_INET6 */ - -ngx_int_t -ngx_inet_resolve_host(ngx_pool_t *pool, ngx_url_t *u) -{ - u_char *host; - ngx_uint_t i, n; - struct hostent *h; - struct sockaddr_in sin; - - /* AF_INET only */ - - ngx_memzero(&sin, sizeof(struct sockaddr_in)); - - sin.sin_family = AF_INET; - sin.sin_addr.s_addr = ngx_inet_addr(u->host.data, u->host.len); - - if (sin.sin_addr.s_addr == INADDR_NONE) { - host = ngx_alloc(u->host.len + 1, pool->log); - if (host == NULL) { - return NGX_ERROR; - } - - (void) ngx_cpystrn(host, u->host.data, u->host.len + 1); - - h = gethostbyname((char *) host); - - ngx_free(host); - - if (h == NULL || h->h_addr_list[0] == NULL) { - u->err = "host not found"; - return NGX_ERROR; - } - - for (n = 0; h->h_addr_list[n] != NULL; n++) { /* void */ } - - /* MP: ngx_shared_palloc() */ - - for (i = 0; i < n; i++) { - sin.sin_addr.s_addr = *(in_addr_t *) (h->h_addr_list[i]); - - if (ngx_inet_add_addr(pool, u, (struct sockaddr *) &sin, - sizeof(struct sockaddr_in), n) - != NGX_OK) - { - return NGX_ERROR; - } - } - - } else { - - /* MP: ngx_shared_palloc() */ - - if (ngx_inet_add_addr(pool, u, (struct sockaddr *) &sin, - sizeof(struct sockaddr_in), 1) - != NGX_OK) - { - return NGX_ERROR; - } - } - - return NGX_OK; -} - -#endif /* NGX_HAVE_GETADDRINFO && NGX_HAVE_INET6 */ - - -static ngx_int_t -ngx_inet_add_addr(ngx_pool_t *pool, ngx_url_t *u, struct sockaddr *sockaddr, - socklen_t socklen, ngx_uint_t total) -{ - u_char *p; - size_t len; - ngx_uint_t i, nports; - ngx_addr_t *addr; - struct sockaddr *sa; - - nports = u->last_port ? u->last_port - u->port + 1 : 1; - - if (u->addrs == NULL) { - u->addrs = ngx_palloc(pool, total * nports * sizeof(ngx_addr_t)); - if (u->addrs == NULL) { - return NGX_ERROR; - } - } - - for (i = 0; i < nports; i++) { - sa = ngx_pcalloc(pool, socklen); - if (sa == NULL) { - return NGX_ERROR; - } - - ngx_memcpy(sa, sockaddr, socklen); - - ngx_inet_set_port(sa, u->port + i); - - switch (sa->sa_family) { - -#if (NGX_HAVE_INET6) - case AF_INET6: - len = NGX_INET6_ADDRSTRLEN + sizeof("[]:65536") - 1; - break; -#endif - - default: /* AF_INET */ - len = NGX_INET_ADDRSTRLEN + sizeof(":65535") - 1; - } - - p = ngx_pnalloc(pool, len); - if (p == NULL) { - return NGX_ERROR; - } - - len = ngx_sock_ntop(sa, socklen, p, len, 1); - - addr = &u->addrs[u->naddrs++]; - - addr->sockaddr = sa; - addr->socklen = socklen; - - addr->name.len = len; - addr->name.data = p; - } - - return NGX_OK; -} - - -ngx_int_t -ngx_cmp_sockaddr(struct sockaddr *sa1, socklen_t slen1, - struct sockaddr *sa2, socklen_t slen2, ngx_uint_t cmp_port) -{ - struct sockaddr_in *sin1, *sin2; -#if (NGX_HAVE_INET6) - struct sockaddr_in6 *sin61, *sin62; -#endif -#if (NGX_HAVE_UNIX_DOMAIN) - size_t len; - struct sockaddr_un *saun1, *saun2; -#endif - - if (sa1->sa_family != sa2->sa_family) { - return NGX_DECLINED; - } - - switch (sa1->sa_family) { - -#if (NGX_HAVE_INET6) - case AF_INET6: - - sin61 = (struct sockaddr_in6 *) sa1; - sin62 = (struct sockaddr_in6 *) sa2; - - if (cmp_port && sin61->sin6_port != sin62->sin6_port) { - return NGX_DECLINED; - } - - if (ngx_memcmp(&sin61->sin6_addr, &sin62->sin6_addr, 16) != 0) { - return NGX_DECLINED; - } - - break; -#endif - -#if (NGX_HAVE_UNIX_DOMAIN) - case AF_UNIX: - - saun1 = (struct sockaddr_un *) sa1; - saun2 = (struct sockaddr_un *) sa2; - - if (slen1 < slen2) { - len = slen1 - offsetof(struct sockaddr_un, sun_path); - - } else { - len = slen2 - offsetof(struct sockaddr_un, sun_path); - } - - if (len > sizeof(saun1->sun_path)) { - len = sizeof(saun1->sun_path); - } - - if (ngx_memcmp(&saun1->sun_path, &saun2->sun_path, len) != 0) { - return NGX_DECLINED; - } - - break; -#endif - - default: /* AF_INET */ - - sin1 = (struct sockaddr_in *) sa1; - sin2 = (struct sockaddr_in *) sa2; - - if (cmp_port && sin1->sin_port != sin2->sin_port) { - return NGX_DECLINED; - } - - if (sin1->sin_addr.s_addr != sin2->sin_addr.s_addr) { - return NGX_DECLINED; - } - - break; - } - - return NGX_OK; -} - - -in_port_t -ngx_inet_get_port(struct sockaddr *sa) -{ - struct sockaddr_in *sin; -#if (NGX_HAVE_INET6) - struct sockaddr_in6 *sin6; -#endif - - switch (sa->sa_family) { - -#if (NGX_HAVE_INET6) - case AF_INET6: - sin6 = (struct sockaddr_in6 *) sa; - return ntohs(sin6->sin6_port); -#endif - -#if (NGX_HAVE_UNIX_DOMAIN) - case AF_UNIX: - return 0; -#endif - - default: /* AF_INET */ - sin = (struct sockaddr_in *) sa; - return ntohs(sin->sin_port); - } -} - - -void -ngx_inet_set_port(struct sockaddr *sa, in_port_t port) -{ - struct sockaddr_in *sin; -#if (NGX_HAVE_INET6) - struct sockaddr_in6 *sin6; -#endif - - switch (sa->sa_family) { - -#if (NGX_HAVE_INET6) - case AF_INET6: - sin6 = (struct sockaddr_in6 *) sa; - sin6->sin6_port = htons(port); - break; -#endif - -#if (NGX_HAVE_UNIX_DOMAIN) - case AF_UNIX: - break; -#endif - - default: /* AF_INET */ - sin = (struct sockaddr_in *) sa; - sin->sin_port = htons(port); - break; - } -} - - -ngx_uint_t -ngx_inet_wildcard(struct sockaddr *sa) -{ - struct sockaddr_in *sin; -#if (NGX_HAVE_INET6) - struct sockaddr_in6 *sin6; -#endif - - switch (sa->sa_family) { - - case AF_INET: - sin = (struct sockaddr_in *) sa; - - if (sin->sin_addr.s_addr == INADDR_ANY) { - return 1; - } - - break; - -#if (NGX_HAVE_INET6) - - case AF_INET6: - sin6 = (struct sockaddr_in6 *) sa; - - if (IN6_IS_ADDR_UNSPECIFIED(&sin6->sin6_addr)) { - return 1; - } - - break; - -#endif - } - - return 0; -} diff --git a/src/deps/src/nginx-1.30.3/src/core/ngx_inet.h b/src/deps/src/nginx-1.30.3/src/core/ngx_inet.h deleted file mode 100644 index 19050fc75e..0000000000 --- a/src/deps/src/nginx-1.30.3/src/core/ngx_inet.h +++ /dev/null @@ -1,132 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#ifndef _NGX_INET_H_INCLUDED_ -#define _NGX_INET_H_INCLUDED_ - - -#include -#include - - -#define NGX_INET_ADDRSTRLEN (sizeof("255.255.255.255") - 1) -#define NGX_INET6_ADDRSTRLEN \ - (sizeof("ffff:ffff:ffff:ffff:ffff:ffff:255.255.255.255") - 1) -#define NGX_UNIX_ADDRSTRLEN \ - (sizeof("unix:") - 1 + \ - sizeof(struct sockaddr_un) - offsetof(struct sockaddr_un, sun_path)) - -#if (NGX_HAVE_UNIX_DOMAIN) -#define NGX_SOCKADDR_STRLEN NGX_UNIX_ADDRSTRLEN -#elif (NGX_HAVE_INET6) -#define NGX_SOCKADDR_STRLEN (NGX_INET6_ADDRSTRLEN + sizeof("[]:65535") - 1) -#else -#define NGX_SOCKADDR_STRLEN (NGX_INET_ADDRSTRLEN + sizeof(":65535") - 1) -#endif - -/* compatibility */ -#define NGX_SOCKADDRLEN sizeof(ngx_sockaddr_t) - - -typedef union { - struct sockaddr sockaddr; - struct sockaddr_in sockaddr_in; -#if (NGX_HAVE_INET6) - struct sockaddr_in6 sockaddr_in6; -#endif -#if (NGX_HAVE_UNIX_DOMAIN) - struct sockaddr_un sockaddr_un; -#endif -} ngx_sockaddr_t; - - -typedef struct { - in_addr_t addr; - in_addr_t mask; -} ngx_in_cidr_t; - - -#if (NGX_HAVE_INET6) - -typedef struct { - struct in6_addr addr; - struct in6_addr mask; -} ngx_in6_cidr_t; - -#endif - - -typedef struct { - ngx_uint_t family; - union { - ngx_in_cidr_t in; -#if (NGX_HAVE_INET6) - ngx_in6_cidr_t in6; -#endif - } u; -} ngx_cidr_t; - - -typedef struct { - struct sockaddr *sockaddr; - socklen_t socklen; - ngx_str_t name; -} ngx_addr_t; - - -typedef struct { - ngx_str_t url; - ngx_str_t host; - ngx_str_t port_text; - ngx_str_t uri; - - in_port_t port; - in_port_t default_port; - in_port_t last_port; - int family; - - unsigned listen:1; - unsigned uri_part:1; - unsigned no_resolve:1; - - unsigned no_port:1; - unsigned wildcard:1; - - socklen_t socklen; - ngx_sockaddr_t sockaddr; - - ngx_addr_t *addrs; - ngx_uint_t naddrs; - - char *err; -} ngx_url_t; - - -in_addr_t ngx_inet_addr(u_char *text, size_t len); -#if (NGX_HAVE_INET6) -ngx_int_t ngx_inet6_addr(u_char *p, size_t len, u_char *addr); -size_t ngx_inet6_ntop(u_char *p, u_char *text, size_t len); -#endif -size_t ngx_sock_ntop(struct sockaddr *sa, socklen_t socklen, u_char *text, - size_t len, ngx_uint_t port); -size_t ngx_inet_ntop(int family, void *addr, u_char *text, size_t len); -ngx_int_t ngx_ptocidr(ngx_str_t *text, ngx_cidr_t *cidr); -ngx_int_t ngx_cidr_match(struct sockaddr *sa, ngx_array_t *cidrs); -ngx_int_t ngx_parse_addr(ngx_pool_t *pool, ngx_addr_t *addr, u_char *text, - size_t len); -ngx_int_t ngx_parse_addr_port(ngx_pool_t *pool, ngx_addr_t *addr, - u_char *text, size_t len); -ngx_int_t ngx_parse_url(ngx_pool_t *pool, ngx_url_t *u); -ngx_int_t ngx_inet_resolve_host(ngx_pool_t *pool, ngx_url_t *u); -ngx_int_t ngx_cmp_sockaddr(struct sockaddr *sa1, socklen_t slen1, - struct sockaddr *sa2, socklen_t slen2, ngx_uint_t cmp_port); -in_port_t ngx_inet_get_port(struct sockaddr *sa); -void ngx_inet_set_port(struct sockaddr *sa, in_port_t port); -ngx_uint_t ngx_inet_wildcard(struct sockaddr *sa); - - -#endif /* _NGX_INET_H_INCLUDED_ */ diff --git a/src/deps/src/nginx-1.30.3/src/core/ngx_list.c b/src/deps/src/nginx-1.30.3/src/core/ngx_list.c deleted file mode 100644 index d0eb15930a..0000000000 --- a/src/deps/src/nginx-1.30.3/src/core/ngx_list.c +++ /dev/null @@ -1,63 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#include -#include - - -ngx_list_t * -ngx_list_create(ngx_pool_t *pool, ngx_uint_t n, size_t size) -{ - ngx_list_t *list; - - list = ngx_palloc(pool, sizeof(ngx_list_t)); - if (list == NULL) { - return NULL; - } - - if (ngx_list_init(list, pool, n, size) != NGX_OK) { - return NULL; - } - - return list; -} - - -void * -ngx_list_push(ngx_list_t *l) -{ - void *elt; - ngx_list_part_t *last; - - last = l->last; - - if (last->nelts == l->nalloc) { - - /* the last part is full, allocate a new list part */ - - last = ngx_palloc(l->pool, sizeof(ngx_list_part_t)); - if (last == NULL) { - return NULL; - } - - last->elts = ngx_palloc(l->pool, l->nalloc * l->size); - if (last->elts == NULL) { - return NULL; - } - - last->nelts = 0; - last->next = NULL; - - l->last->next = last; - l->last = last; - } - - elt = (char *) last->elts + l->size * last->nelts; - last->nelts++; - - return elt; -} diff --git a/src/deps/src/nginx-1.30.3/src/core/ngx_list.h b/src/deps/src/nginx-1.30.3/src/core/ngx_list.h deleted file mode 100644 index e0fe6436b1..0000000000 --- a/src/deps/src/nginx-1.30.3/src/core/ngx_list.h +++ /dev/null @@ -1,83 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#ifndef _NGX_LIST_H_INCLUDED_ -#define _NGX_LIST_H_INCLUDED_ - - -#include -#include - - -typedef struct ngx_list_part_s ngx_list_part_t; - -struct ngx_list_part_s { - void *elts; - ngx_uint_t nelts; - ngx_list_part_t *next; -}; - - -typedef struct { - ngx_list_part_t *last; - ngx_list_part_t part; - size_t size; - ngx_uint_t nalloc; - ngx_pool_t *pool; -} ngx_list_t; - - -ngx_list_t *ngx_list_create(ngx_pool_t *pool, ngx_uint_t n, size_t size); - -static ngx_inline ngx_int_t -ngx_list_init(ngx_list_t *list, ngx_pool_t *pool, ngx_uint_t n, size_t size) -{ - list->part.elts = ngx_palloc(pool, n * size); - if (list->part.elts == NULL) { - return NGX_ERROR; - } - - list->part.nelts = 0; - list->part.next = NULL; - list->last = &list->part; - list->size = size; - list->nalloc = n; - list->pool = pool; - - return NGX_OK; -} - - -/* - * - * the iteration through the list: - * - * part = &list.part; - * data = part->elts; - * - * for (i = 0 ;; i++) { - * - * if (i >= part->nelts) { - * if (part->next == NULL) { - * break; - * } - * - * part = part->next; - * data = part->elts; - * i = 0; - * } - * - * ... data[i] ... - * - * } - */ - - -void *ngx_list_push(ngx_list_t *list); - - -#endif /* _NGX_LIST_H_INCLUDED_ */ diff --git a/src/deps/src/nginx-1.30.3/src/core/ngx_log.c b/src/deps/src/nginx-1.30.3/src/core/ngx_log.c deleted file mode 100644 index 0c094265e4..0000000000 --- a/src/deps/src/nginx-1.30.3/src/core/ngx_log.c +++ /dev/null @@ -1,752 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#include -#include - - -static char *ngx_error_log(ngx_conf_t *cf, ngx_command_t *cmd, void *conf); -static char *ngx_log_set_levels(ngx_conf_t *cf, ngx_log_t *log); -static void ngx_log_insert(ngx_log_t *log, ngx_log_t *new_log); - - -#if (NGX_DEBUG) - -static void ngx_log_memory_writer(ngx_log_t *log, ngx_uint_t level, - u_char *buf, size_t len); -static void ngx_log_memory_cleanup(void *data); - - -typedef struct { - u_char *start; - u_char *end; - u_char *pos; - ngx_atomic_t written; -} ngx_log_memory_buf_t; - -#endif - - -static ngx_command_t ngx_errlog_commands[] = { - - { ngx_string("error_log"), - NGX_MAIN_CONF|NGX_CONF_1MORE, - ngx_error_log, - 0, - 0, - NULL }, - - ngx_null_command -}; - - -static ngx_core_module_t ngx_errlog_module_ctx = { - ngx_string("errlog"), - NULL, - NULL -}; - - -ngx_module_t ngx_errlog_module = { - NGX_MODULE_V1, - &ngx_errlog_module_ctx, /* module context */ - ngx_errlog_commands, /* module directives */ - NGX_CORE_MODULE, /* module type */ - NULL, /* init master */ - NULL, /* init module */ - NULL, /* init process */ - NULL, /* init thread */ - NULL, /* exit thread */ - NULL, /* exit process */ - NULL, /* exit master */ - NGX_MODULE_V1_PADDING -}; - - -static ngx_log_t ngx_log; -static ngx_open_file_t ngx_log_file; -ngx_uint_t ngx_use_stderr = 1; - - -static ngx_str_t err_levels[] = { - ngx_null_string, - ngx_string("emerg"), - ngx_string("alert"), - ngx_string("crit"), - ngx_string("error"), - ngx_string("warn"), - ngx_string("notice"), - ngx_string("info"), - ngx_string("debug") -}; - -static const char *debug_levels[] = { - "debug_core", "debug_alloc", "debug_mutex", "debug_event", - "debug_http", "debug_mail", "debug_stream" -}; - - -#if (NGX_HAVE_VARIADIC_MACROS) - -void -ngx_log_error_core(ngx_uint_t level, ngx_log_t *log, ngx_err_t err, - const char *fmt, ...) - -#else - -void -ngx_log_error_core(ngx_uint_t level, ngx_log_t *log, ngx_err_t err, - const char *fmt, va_list args) - -#endif -{ -#if (NGX_HAVE_VARIADIC_MACROS) - va_list args; -#endif - u_char *p, *last, *msg; - ssize_t n; - ngx_uint_t wrote_stderr, debug_connection; - u_char errstr[NGX_MAX_ERROR_STR]; - - last = errstr + NGX_MAX_ERROR_STR; - - p = ngx_cpymem(errstr, ngx_cached_err_log_time.data, - ngx_cached_err_log_time.len); - - p = ngx_slprintf(p, last, " [%V] ", &err_levels[level]); - - /* pid#tid */ - p = ngx_slprintf(p, last, "%P#" NGX_TID_T_FMT ": ", - ngx_log_pid, ngx_log_tid); - - if (log->connection) { - p = ngx_slprintf(p, last, "*%uA ", log->connection); - } - - msg = p; - -#if (NGX_HAVE_VARIADIC_MACROS) - - va_start(args, fmt); - p = ngx_vslprintf(p, last, fmt, args); - va_end(args); - -#else - - p = ngx_vslprintf(p, last, fmt, args); - -#endif - - if (err) { - p = ngx_log_errno(p, last, err); - } - - if (level != NGX_LOG_DEBUG && log->handler) { - p = log->handler(log, p, last - p); - } - - if (p > last - NGX_LINEFEED_SIZE) { - p = last - NGX_LINEFEED_SIZE; - } - - ngx_linefeed(p); - - wrote_stderr = 0; - debug_connection = (log->log_level & NGX_LOG_DEBUG_CONNECTION) != 0; - - while (log) { - - if (log->log_level < level && !debug_connection) { - break; - } - - if (log->writer) { - log->writer(log, level, errstr, p - errstr); - goto next; - } - - if (ngx_time() == log->disk_full_time) { - - /* - * on FreeBSD writing to a full filesystem with enabled softupdates - * may block process for much longer time than writing to non-full - * filesystem, so we skip writing to a log for one second - */ - - goto next; - } - - n = ngx_write_fd(log->file->fd, errstr, p - errstr); - - if (n == -1 && ngx_errno == NGX_ENOSPC) { - log->disk_full_time = ngx_time(); - } - - if (log->file->fd == ngx_stderr) { - wrote_stderr = 1; - } - - next: - - log = log->next; - } - - if (!ngx_use_stderr - || level > NGX_LOG_WARN - || wrote_stderr) - { - return; - } - - msg -= (7 + err_levels[level].len + 3); - - (void) ngx_sprintf(msg, "nginx: [%V] ", &err_levels[level]); - - (void) ngx_write_console(ngx_stderr, msg, p - msg); -} - - -#if !(NGX_HAVE_VARIADIC_MACROS) - -void ngx_cdecl -ngx_log_error(ngx_uint_t level, ngx_log_t *log, ngx_err_t err, - const char *fmt, ...) -{ - va_list args; - - if (log->log_level >= level) { - va_start(args, fmt); - ngx_log_error_core(level, log, err, fmt, args); - va_end(args); - } -} - - -void ngx_cdecl -ngx_log_debug_core(ngx_log_t *log, ngx_err_t err, const char *fmt, ...) -{ - va_list args; - - va_start(args, fmt); - ngx_log_error_core(NGX_LOG_DEBUG, log, err, fmt, args); - va_end(args); -} - -#endif - - -void ngx_cdecl -ngx_log_abort(ngx_err_t err, const char *fmt, ...) -{ - u_char *p; - va_list args; - u_char errstr[NGX_MAX_CONF_ERRSTR]; - - va_start(args, fmt); - p = ngx_vsnprintf(errstr, sizeof(errstr) - 1, fmt, args); - va_end(args); - - ngx_log_error(NGX_LOG_ALERT, ngx_cycle->log, err, - "%*s", p - errstr, errstr); -} - - -void ngx_cdecl -ngx_log_stderr(ngx_err_t err, const char *fmt, ...) -{ - u_char *p, *last; - va_list args; - u_char errstr[NGX_MAX_ERROR_STR]; - - last = errstr + NGX_MAX_ERROR_STR; - - p = ngx_cpymem(errstr, "nginx: ", 7); - - va_start(args, fmt); - p = ngx_vslprintf(p, last, fmt, args); - va_end(args); - - if (err) { - p = ngx_log_errno(p, last, err); - } - - if (p > last - NGX_LINEFEED_SIZE) { - p = last - NGX_LINEFEED_SIZE; - } - - ngx_linefeed(p); - - (void) ngx_write_console(ngx_stderr, errstr, p - errstr); -} - - -u_char * -ngx_log_errno(u_char *buf, u_char *last, ngx_err_t err) -{ - if (buf > last - 50) { - - /* leave a space for an error code */ - - buf = last - 50; - *buf++ = '.'; - *buf++ = '.'; - *buf++ = '.'; - } - -#if (NGX_WIN32) - buf = ngx_slprintf(buf, last, ((unsigned) err < 0x80000000) - ? " (%d: " : " (%Xd: ", err); -#else - buf = ngx_slprintf(buf, last, " (%d: ", err); -#endif - - buf = ngx_strerror(err, buf, last - buf); - - if (buf < last) { - *buf++ = ')'; - } - - return buf; -} - - -ngx_log_t * -ngx_log_init(u_char *prefix, u_char *error_log) -{ - u_char *p, *name; - size_t nlen, plen; - - ngx_log.file = &ngx_log_file; - ngx_log.log_level = NGX_LOG_NOTICE; - - if (error_log == NULL) { - error_log = (u_char *) NGX_ERROR_LOG_PATH; - } - - name = error_log; - nlen = ngx_strlen(name); - - if (nlen == 0) { - ngx_log_file.fd = ngx_stderr; - return &ngx_log; - } - - p = NULL; - -#if (NGX_WIN32) - if (name[1] != ':') { -#else - if (name[0] != '/') { -#endif - - if (prefix) { - plen = ngx_strlen(prefix); - - } else { -#ifdef NGX_PREFIX - prefix = (u_char *) NGX_PREFIX; - plen = ngx_strlen(prefix); -#else - plen = 0; -#endif - } - - if (plen) { - name = malloc(plen + nlen + 2); - if (name == NULL) { - return NULL; - } - - p = ngx_cpymem(name, prefix, plen); - - if (!ngx_path_separator(*(p - 1))) { - *p++ = '/'; - } - - ngx_cpystrn(p, error_log, nlen + 1); - - p = name; - } - } - - ngx_log_file.fd = ngx_open_file(name, NGX_FILE_APPEND, - NGX_FILE_CREATE_OR_OPEN, - NGX_FILE_DEFAULT_ACCESS); - - if (ngx_log_file.fd == NGX_INVALID_FILE) { - ngx_log_stderr(ngx_errno, - "[alert] could not open error log file: " - ngx_open_file_n " \"%s\" failed", name); -#if (NGX_WIN32) - ngx_event_log(ngx_errno, - "could not open error log file: " - ngx_open_file_n " \"%s\" failed", name); -#endif - - ngx_log_file.fd = ngx_stderr; - } - - if (p) { - ngx_free(p); - } - - return &ngx_log; -} - - -ngx_int_t -ngx_log_open_default(ngx_cycle_t *cycle) -{ - ngx_log_t *log; - - if (ngx_log_get_file_log(&cycle->new_log) != NULL) { - return NGX_OK; - } - - if (cycle->new_log.log_level != 0) { - /* there are some error logs, but no files */ - - log = ngx_pcalloc(cycle->pool, sizeof(ngx_log_t)); - if (log == NULL) { - return NGX_ERROR; - } - - } else { - /* no error logs at all */ - log = &cycle->new_log; - } - - log->log_level = NGX_LOG_ERR; - - log->file = ngx_conf_open_file(cycle, &cycle->error_log); - if (log->file == NULL) { - return NGX_ERROR; - } - - if (log != &cycle->new_log) { - ngx_log_insert(&cycle->new_log, log); - } - - return NGX_OK; -} - - -ngx_int_t -ngx_log_redirect_stderr(ngx_cycle_t *cycle) -{ - ngx_fd_t fd; - - if (cycle->log_use_stderr) { - return NGX_OK; - } - - /* file log always exists when we are called */ - fd = ngx_log_get_file_log(cycle->log)->file->fd; - - if (fd != ngx_stderr) { - if (ngx_set_stderr(fd) == NGX_FILE_ERROR) { - ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno, - ngx_set_stderr_n " failed"); - - return NGX_ERROR; - } - } - - return NGX_OK; -} - - -ngx_log_t * -ngx_log_get_file_log(ngx_log_t *head) -{ - ngx_log_t *log; - - for (log = head; log; log = log->next) { - if (log->file != NULL) { - return log; - } - } - - return NULL; -} - - -static char * -ngx_log_set_levels(ngx_conf_t *cf, ngx_log_t *log) -{ - ngx_uint_t i, n, d, found; - ngx_str_t *value; - - if (cf->args->nelts == 2) { - log->log_level = NGX_LOG_ERR; - return NGX_CONF_OK; - } - - value = cf->args->elts; - - for (i = 2; i < cf->args->nelts; i++) { - found = 0; - - for (n = 1; n <= NGX_LOG_DEBUG; n++) { - if (ngx_strcmp(value[i].data, err_levels[n].data) == 0) { - - if (log->log_level != 0) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "duplicate log level \"%V\"", - &value[i]); - return NGX_CONF_ERROR; - } - - log->log_level = n; - found = 1; - break; - } - } - - for (n = 0, d = NGX_LOG_DEBUG_FIRST; d <= NGX_LOG_DEBUG_LAST; d <<= 1) { - if (ngx_strcmp(value[i].data, debug_levels[n++]) == 0) { - if (log->log_level & ~NGX_LOG_DEBUG_ALL) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "invalid log level \"%V\"", - &value[i]); - return NGX_CONF_ERROR; - } - - log->log_level |= d; - found = 1; - break; - } - } - - - if (!found) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "invalid log level \"%V\"", &value[i]); - return NGX_CONF_ERROR; - } - } - - if (log->log_level == NGX_LOG_DEBUG) { - log->log_level = NGX_LOG_DEBUG_ALL; - } - - return NGX_CONF_OK; -} - - -static char * -ngx_error_log(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) -{ - ngx_log_t *dummy; - - dummy = &cf->cycle->new_log; - - return ngx_log_set_log(cf, &dummy); -} - - -char * -ngx_log_set_log(ngx_conf_t *cf, ngx_log_t **head) -{ - ngx_log_t *new_log; - ngx_str_t *value, name; - ngx_syslog_peer_t *peer; - - if (*head != NULL && (*head)->log_level == 0) { - new_log = *head; - - } else { - - new_log = ngx_pcalloc(cf->pool, sizeof(ngx_log_t)); - if (new_log == NULL) { - return NGX_CONF_ERROR; - } - - if (*head == NULL) { - *head = new_log; - } - } - - value = cf->args->elts; - - if (ngx_strcmp(value[1].data, "stderr") == 0) { - ngx_str_null(&name); - cf->cycle->log_use_stderr = 1; - - new_log->file = ngx_conf_open_file(cf->cycle, &name); - if (new_log->file == NULL) { - return NGX_CONF_ERROR; - } - - } else if (ngx_strncmp(value[1].data, "memory:", 7) == 0) { - -#if (NGX_DEBUG) - size_t size, needed; - ngx_pool_cleanup_t *cln; - ngx_log_memory_buf_t *buf; - - value[1].len -= 7; - value[1].data += 7; - - needed = sizeof("MEMLOG :" NGX_LINEFEED) - + cf->conf_file->file.name.len - + NGX_SIZE_T_LEN - + NGX_INT_T_LEN - + NGX_MAX_ERROR_STR; - - size = ngx_parse_size(&value[1]); - - if (size == (size_t) NGX_ERROR || size < needed) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "invalid buffer size \"%V\"", &value[1]); - return NGX_CONF_ERROR; - } - - buf = ngx_pcalloc(cf->pool, sizeof(ngx_log_memory_buf_t)); - if (buf == NULL) { - return NGX_CONF_ERROR; - } - - buf->start = ngx_pnalloc(cf->pool, size); - if (buf->start == NULL) { - return NGX_CONF_ERROR; - } - - buf->end = buf->start + size; - - buf->pos = ngx_slprintf(buf->start, buf->end, "MEMLOG %uz %V:%ui%N", - size, &cf->conf_file->file.name, - cf->conf_file->line); - - ngx_memset(buf->pos, ' ', buf->end - buf->pos); - - cln = ngx_pool_cleanup_add(cf->pool, 0); - if (cln == NULL) { - return NGX_CONF_ERROR; - } - - cln->data = new_log; - cln->handler = ngx_log_memory_cleanup; - - new_log->writer = ngx_log_memory_writer; - new_log->wdata = buf; - -#else - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "nginx was built without debug support"); - return NGX_CONF_ERROR; -#endif - - } else if (ngx_strncmp(value[1].data, "syslog:", 7) == 0) { - peer = ngx_pcalloc(cf->pool, sizeof(ngx_syslog_peer_t)); - if (peer == NULL) { - return NGX_CONF_ERROR; - } - - if (ngx_syslog_process_conf(cf, peer) != NGX_CONF_OK) { - return NGX_CONF_ERROR; - } - - new_log->writer = ngx_syslog_writer; - new_log->wdata = peer; - - } else { - new_log->file = ngx_conf_open_file(cf->cycle, &value[1]); - if (new_log->file == NULL) { - return NGX_CONF_ERROR; - } - } - - if (ngx_log_set_levels(cf, new_log) != NGX_CONF_OK) { - return NGX_CONF_ERROR; - } - - if (*head != new_log) { - ngx_log_insert(*head, new_log); - } - - return NGX_CONF_OK; -} - - -static void -ngx_log_insert(ngx_log_t *log, ngx_log_t *new_log) -{ - ngx_log_t tmp; - - if (new_log->log_level > log->log_level) { - - /* - * list head address is permanent, insert new log after - * head and swap its contents with head - */ - - tmp = *log; - *log = *new_log; - *new_log = tmp; - - log->next = new_log; - return; - } - - while (log->next) { - if (new_log->log_level > log->next->log_level) { - new_log->next = log->next; - log->next = new_log; - return; - } - - log = log->next; - } - - log->next = new_log; -} - - -#if (NGX_DEBUG) - -static void -ngx_log_memory_writer(ngx_log_t *log, ngx_uint_t level, u_char *buf, - size_t len) -{ - u_char *p; - size_t avail, written; - ngx_log_memory_buf_t *mem; - - mem = log->wdata; - - if (mem == NULL) { - return; - } - - written = ngx_atomic_fetch_add(&mem->written, len); - - p = mem->pos + written % (mem->end - mem->pos); - - avail = mem->end - p; - - if (avail >= len) { - ngx_memcpy(p, buf, len); - - } else { - ngx_memcpy(p, buf, avail); - ngx_memcpy(mem->pos, buf + avail, len - avail); - } -} - - -static void -ngx_log_memory_cleanup(void *data) -{ - ngx_log_t *log = data; - - ngx_log_debug0(NGX_LOG_DEBUG_CORE, log, 0, "destroy memory log buffer"); - - log->wdata = NULL; -} - -#endif diff --git a/src/deps/src/nginx-1.30.3/src/core/ngx_log.h b/src/deps/src/nginx-1.30.3/src/core/ngx_log.h deleted file mode 100644 index 78cea2a3bd..0000000000 --- a/src/deps/src/nginx-1.30.3/src/core/ngx_log.h +++ /dev/null @@ -1,271 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#ifndef _NGX_LOG_H_INCLUDED_ -#define _NGX_LOG_H_INCLUDED_ - - -#include -#include - - -#define NGX_LOG_STDERR 0 -#define NGX_LOG_EMERG 1 -#define NGX_LOG_ALERT 2 -#define NGX_LOG_CRIT 3 -#define NGX_LOG_ERR 4 -#define NGX_LOG_WARN 5 -#define NGX_LOG_NOTICE 6 -#define NGX_LOG_INFO 7 -#define NGX_LOG_DEBUG 8 - -#define NGX_LOG_DEBUG_CORE 0x010 -#define NGX_LOG_DEBUG_ALLOC 0x020 -#define NGX_LOG_DEBUG_MUTEX 0x040 -#define NGX_LOG_DEBUG_EVENT 0x080 -#define NGX_LOG_DEBUG_HTTP 0x100 -#define NGX_LOG_DEBUG_MAIL 0x200 -#define NGX_LOG_DEBUG_STREAM 0x400 - -/* - * do not forget to update debug_levels[] in src/core/ngx_log.c - * after the adding a new debug level - */ - -#define NGX_LOG_DEBUG_FIRST NGX_LOG_DEBUG_CORE -#define NGX_LOG_DEBUG_LAST NGX_LOG_DEBUG_STREAM -#define NGX_LOG_DEBUG_CONNECTION 0x80000000 -#define NGX_LOG_DEBUG_ALL 0x7ffffff0 - - -typedef u_char *(*ngx_log_handler_pt) (ngx_log_t *log, u_char *buf, size_t len); -typedef void (*ngx_log_writer_pt) (ngx_log_t *log, ngx_uint_t level, - u_char *buf, size_t len); - - -struct ngx_log_s { - ngx_uint_t log_level; - ngx_open_file_t *file; - - ngx_atomic_uint_t connection; - - time_t disk_full_time; - - ngx_log_handler_pt handler; - void *data; - - ngx_log_writer_pt writer; - void *wdata; - - /* - * we declare "action" as "char *" because the actions are usually - * the static strings and in the "u_char *" case we have to override - * their types all the time - */ - - char *action; - - ngx_log_t *next; - - NGX_COMPAT_BEGIN(5) - NGX_COMPAT_END -}; - - -#define NGX_MAX_ERROR_STR 2048 - - -/*********************************/ - -#if (NGX_HAVE_C99_VARIADIC_MACROS) - -#define NGX_HAVE_VARIADIC_MACROS 1 - -#define ngx_log_error(level, log, ...) \ - if ((log)->log_level >= level) ngx_log_error_core(level, log, __VA_ARGS__) - -void ngx_log_error_core(ngx_uint_t level, ngx_log_t *log, ngx_err_t err, - const char *fmt, ...); - -#define ngx_log_debug(level, log, ...) \ - if ((log)->log_level & level) \ - ngx_log_error_core(NGX_LOG_DEBUG, log, __VA_ARGS__) - -/*********************************/ - -#elif (NGX_HAVE_GCC_VARIADIC_MACROS) - -#define NGX_HAVE_VARIADIC_MACROS 1 - -#define ngx_log_error(level, log, args...) \ - if ((log)->log_level >= level) ngx_log_error_core(level, log, args) - -void ngx_log_error_core(ngx_uint_t level, ngx_log_t *log, ngx_err_t err, - const char *fmt, ...); - -#define ngx_log_debug(level, log, args...) \ - if ((log)->log_level & level) \ - ngx_log_error_core(NGX_LOG_DEBUG, log, args) - -/*********************************/ - -#else /* no variadic macros */ - -#define NGX_HAVE_VARIADIC_MACROS 0 - -void ngx_cdecl ngx_log_error(ngx_uint_t level, ngx_log_t *log, ngx_err_t err, - const char *fmt, ...); -void ngx_log_error_core(ngx_uint_t level, ngx_log_t *log, ngx_err_t err, - const char *fmt, va_list args); -void ngx_cdecl ngx_log_debug_core(ngx_log_t *log, ngx_err_t err, - const char *fmt, ...); - - -#endif /* variadic macros */ - - -/*********************************/ - -#if (NGX_DEBUG) - -#if (NGX_HAVE_VARIADIC_MACROS) - -#define ngx_log_debug0(level, log, err, fmt) \ - ngx_log_debug(level, log, err, fmt) - -#define ngx_log_debug1(level, log, err, fmt, arg1) \ - ngx_log_debug(level, log, err, fmt, arg1) - -#define ngx_log_debug2(level, log, err, fmt, arg1, arg2) \ - ngx_log_debug(level, log, err, fmt, arg1, arg2) - -#define ngx_log_debug3(level, log, err, fmt, arg1, arg2, arg3) \ - ngx_log_debug(level, log, err, fmt, arg1, arg2, arg3) - -#define ngx_log_debug4(level, log, err, fmt, arg1, arg2, arg3, arg4) \ - ngx_log_debug(level, log, err, fmt, arg1, arg2, arg3, arg4) - -#define ngx_log_debug5(level, log, err, fmt, arg1, arg2, arg3, arg4, arg5) \ - ngx_log_debug(level, log, err, fmt, arg1, arg2, arg3, arg4, arg5) - -#define ngx_log_debug6(level, log, err, fmt, \ - arg1, arg2, arg3, arg4, arg5, arg6) \ - ngx_log_debug(level, log, err, fmt, \ - arg1, arg2, arg3, arg4, arg5, arg6) - -#define ngx_log_debug7(level, log, err, fmt, \ - arg1, arg2, arg3, arg4, arg5, arg6, arg7) \ - ngx_log_debug(level, log, err, fmt, \ - arg1, arg2, arg3, arg4, arg5, arg6, arg7) - -#define ngx_log_debug8(level, log, err, fmt, \ - arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8) \ - ngx_log_debug(level, log, err, fmt, \ - arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8) - - -#else /* no variadic macros */ - -#define ngx_log_debug0(level, log, err, fmt) \ - if ((log)->log_level & level) \ - ngx_log_debug_core(log, err, fmt) - -#define ngx_log_debug1(level, log, err, fmt, arg1) \ - if ((log)->log_level & level) \ - ngx_log_debug_core(log, err, fmt, arg1) - -#define ngx_log_debug2(level, log, err, fmt, arg1, arg2) \ - if ((log)->log_level & level) \ - ngx_log_debug_core(log, err, fmt, arg1, arg2) - -#define ngx_log_debug3(level, log, err, fmt, arg1, arg2, arg3) \ - if ((log)->log_level & level) \ - ngx_log_debug_core(log, err, fmt, arg1, arg2, arg3) - -#define ngx_log_debug4(level, log, err, fmt, arg1, arg2, arg3, arg4) \ - if ((log)->log_level & level) \ - ngx_log_debug_core(log, err, fmt, arg1, arg2, arg3, arg4) - -#define ngx_log_debug5(level, log, err, fmt, arg1, arg2, arg3, arg4, arg5) \ - if ((log)->log_level & level) \ - ngx_log_debug_core(log, err, fmt, arg1, arg2, arg3, arg4, arg5) - -#define ngx_log_debug6(level, log, err, fmt, \ - arg1, arg2, arg3, arg4, arg5, arg6) \ - if ((log)->log_level & level) \ - ngx_log_debug_core(log, err, fmt, arg1, arg2, arg3, arg4, arg5, arg6) - -#define ngx_log_debug7(level, log, err, fmt, \ - arg1, arg2, arg3, arg4, arg5, arg6, arg7) \ - if ((log)->log_level & level) \ - ngx_log_debug_core(log, err, fmt, \ - arg1, arg2, arg3, arg4, arg5, arg6, arg7) - -#define ngx_log_debug8(level, log, err, fmt, \ - arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8) \ - if ((log)->log_level & level) \ - ngx_log_debug_core(log, err, fmt, \ - arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8) - -#endif - -#else /* !NGX_DEBUG */ - -#define ngx_log_debug0(level, log, err, fmt) -#define ngx_log_debug1(level, log, err, fmt, arg1) -#define ngx_log_debug2(level, log, err, fmt, arg1, arg2) -#define ngx_log_debug3(level, log, err, fmt, arg1, arg2, arg3) -#define ngx_log_debug4(level, log, err, fmt, arg1, arg2, arg3, arg4) -#define ngx_log_debug5(level, log, err, fmt, arg1, arg2, arg3, arg4, arg5) -#define ngx_log_debug6(level, log, err, fmt, arg1, arg2, arg3, arg4, arg5, arg6) -#define ngx_log_debug7(level, log, err, fmt, arg1, arg2, arg3, arg4, arg5, \ - arg6, arg7) -#define ngx_log_debug8(level, log, err, fmt, arg1, arg2, arg3, arg4, arg5, \ - arg6, arg7, arg8) - -#endif - -/*********************************/ - -ngx_log_t *ngx_log_init(u_char *prefix, u_char *error_log); -void ngx_cdecl ngx_log_abort(ngx_err_t err, const char *fmt, ...); -void ngx_cdecl ngx_log_stderr(ngx_err_t err, const char *fmt, ...); -u_char *ngx_log_errno(u_char *buf, u_char *last, ngx_err_t err); -ngx_int_t ngx_log_open_default(ngx_cycle_t *cycle); -ngx_int_t ngx_log_redirect_stderr(ngx_cycle_t *cycle); -ngx_log_t *ngx_log_get_file_log(ngx_log_t *head); -char *ngx_log_set_log(ngx_conf_t *cf, ngx_log_t **head); - - -/* - * ngx_write_stderr() cannot be implemented as macro, since - * MSVC does not allow to use #ifdef inside macro parameters. - * - * ngx_write_fd() is used instead of ngx_write_console(), since - * CharToOemBuff() inside ngx_write_console() cannot be used with - * read only buffer as destination and CharToOemBuff() is not needed - * for ngx_write_stderr() anyway. - */ -static ngx_inline void -ngx_write_stderr(char *text) -{ - (void) ngx_write_fd(ngx_stderr, text, ngx_strlen(text)); -} - - -static ngx_inline void -ngx_write_stdout(char *text) -{ - (void) ngx_write_fd(ngx_stdout, text, ngx_strlen(text)); -} - - -extern ngx_module_t ngx_errlog_module; -extern ngx_uint_t ngx_use_stderr; - - -#endif /* _NGX_LOG_H_INCLUDED_ */ diff --git a/src/deps/src/nginx-1.30.3/src/core/ngx_md5.c b/src/deps/src/nginx-1.30.3/src/core/ngx_md5.c deleted file mode 100644 index c25d0025d7..0000000000 --- a/src/deps/src/nginx-1.30.3/src/core/ngx_md5.c +++ /dev/null @@ -1,283 +0,0 @@ - -/* - * An internal implementation, based on Alexander Peslyak's - * public domain implementation: - * http://openwall.info/wiki/people/solar/software/public-domain-source-code/md5 - */ - - -#include -#include -#include - - -static const u_char *ngx_md5_body(ngx_md5_t *ctx, const u_char *data, - size_t size); - - -void -ngx_md5_init(ngx_md5_t *ctx) -{ - ctx->a = 0x67452301; - ctx->b = 0xefcdab89; - ctx->c = 0x98badcfe; - ctx->d = 0x10325476; - - ctx->bytes = 0; -} - - -void -ngx_md5_update(ngx_md5_t *ctx, const void *data, size_t size) -{ - size_t used, free; - - used = (size_t) (ctx->bytes & 0x3f); - ctx->bytes += size; - - if (used) { - free = 64 - used; - - if (size < free) { - ngx_memcpy(&ctx->buffer[used], data, size); - return; - } - - ngx_memcpy(&ctx->buffer[used], data, free); - data = (u_char *) data + free; - size -= free; - (void) ngx_md5_body(ctx, ctx->buffer, 64); - } - - if (size >= 64) { - data = ngx_md5_body(ctx, data, size & ~(size_t) 0x3f); - size &= 0x3f; - } - - ngx_memcpy(ctx->buffer, data, size); -} - - -void -ngx_md5_final(u_char result[16], ngx_md5_t *ctx) -{ - size_t used, free; - - used = (size_t) (ctx->bytes & 0x3f); - - ctx->buffer[used++] = 0x80; - - free = 64 - used; - - if (free < 8) { - ngx_memzero(&ctx->buffer[used], free); - (void) ngx_md5_body(ctx, ctx->buffer, 64); - used = 0; - free = 64; - } - - ngx_memzero(&ctx->buffer[used], free - 8); - - ctx->bytes <<= 3; - ctx->buffer[56] = (u_char) ctx->bytes; - ctx->buffer[57] = (u_char) (ctx->bytes >> 8); - ctx->buffer[58] = (u_char) (ctx->bytes >> 16); - ctx->buffer[59] = (u_char) (ctx->bytes >> 24); - ctx->buffer[60] = (u_char) (ctx->bytes >> 32); - ctx->buffer[61] = (u_char) (ctx->bytes >> 40); - ctx->buffer[62] = (u_char) (ctx->bytes >> 48); - ctx->buffer[63] = (u_char) (ctx->bytes >> 56); - - (void) ngx_md5_body(ctx, ctx->buffer, 64); - - result[0] = (u_char) ctx->a; - result[1] = (u_char) (ctx->a >> 8); - result[2] = (u_char) (ctx->a >> 16); - result[3] = (u_char) (ctx->a >> 24); - result[4] = (u_char) ctx->b; - result[5] = (u_char) (ctx->b >> 8); - result[6] = (u_char) (ctx->b >> 16); - result[7] = (u_char) (ctx->b >> 24); - result[8] = (u_char) ctx->c; - result[9] = (u_char) (ctx->c >> 8); - result[10] = (u_char) (ctx->c >> 16); - result[11] = (u_char) (ctx->c >> 24); - result[12] = (u_char) ctx->d; - result[13] = (u_char) (ctx->d >> 8); - result[14] = (u_char) (ctx->d >> 16); - result[15] = (u_char) (ctx->d >> 24); - - ngx_memzero(ctx, sizeof(*ctx)); -} - - -/* - * The basic MD5 functions. - * - * F and G are optimized compared to their RFC 1321 definitions for - * architectures that lack an AND-NOT instruction, just like in - * Colin Plumb's implementation. - */ - -#define F(x, y, z) ((z) ^ ((x) & ((y) ^ (z)))) -#define G(x, y, z) ((y) ^ ((z) & ((x) ^ (y)))) -#define H(x, y, z) ((x) ^ (y) ^ (z)) -#define I(x, y, z) ((y) ^ ((x) | ~(z))) - -/* - * The MD5 transformation for all four rounds. - */ - -#define STEP(f, a, b, c, d, x, t, s) \ - (a) += f((b), (c), (d)) + (x) + (t); \ - (a) = (((a) << (s)) | (((a) & 0xffffffff) >> (32 - (s)))); \ - (a) += (b) - -/* - * SET() reads 4 input bytes in little-endian byte order and stores them - * in a properly aligned word in host byte order. - * - * The check for little-endian architectures that tolerate unaligned - * memory accesses is just an optimization. Nothing will break if it - * does not work. - */ - -#if (NGX_HAVE_LITTLE_ENDIAN && NGX_HAVE_NONALIGNED) - -#define SET(n) (*(uint32_t *) &p[n * 4]) -#define GET(n) (*(uint32_t *) &p[n * 4]) - -#else - -#define SET(n) \ - (block[n] = \ - (uint32_t) p[n * 4] | \ - ((uint32_t) p[n * 4 + 1] << 8) | \ - ((uint32_t) p[n * 4 + 2] << 16) | \ - ((uint32_t) p[n * 4 + 3] << 24)) - -#define GET(n) block[n] - -#endif - - -/* - * This processes one or more 64-byte data blocks, but does not update - * the bit counters. There are no alignment requirements. - */ - -static const u_char * -ngx_md5_body(ngx_md5_t *ctx, const u_char *data, size_t size) -{ - uint32_t a, b, c, d; - uint32_t saved_a, saved_b, saved_c, saved_d; - const u_char *p; -#if !(NGX_HAVE_LITTLE_ENDIAN && NGX_HAVE_NONALIGNED) - uint32_t block[16]; -#endif - - p = data; - - a = ctx->a; - b = ctx->b; - c = ctx->c; - d = ctx->d; - - do { - saved_a = a; - saved_b = b; - saved_c = c; - saved_d = d; - - /* Round 1 */ - - STEP(F, a, b, c, d, SET(0), 0xd76aa478, 7); - STEP(F, d, a, b, c, SET(1), 0xe8c7b756, 12); - STEP(F, c, d, a, b, SET(2), 0x242070db, 17); - STEP(F, b, c, d, a, SET(3), 0xc1bdceee, 22); - STEP(F, a, b, c, d, SET(4), 0xf57c0faf, 7); - STEP(F, d, a, b, c, SET(5), 0x4787c62a, 12); - STEP(F, c, d, a, b, SET(6), 0xa8304613, 17); - STEP(F, b, c, d, a, SET(7), 0xfd469501, 22); - STEP(F, a, b, c, d, SET(8), 0x698098d8, 7); - STEP(F, d, a, b, c, SET(9), 0x8b44f7af, 12); - STEP(F, c, d, a, b, SET(10), 0xffff5bb1, 17); - STEP(F, b, c, d, a, SET(11), 0x895cd7be, 22); - STEP(F, a, b, c, d, SET(12), 0x6b901122, 7); - STEP(F, d, a, b, c, SET(13), 0xfd987193, 12); - STEP(F, c, d, a, b, SET(14), 0xa679438e, 17); - STEP(F, b, c, d, a, SET(15), 0x49b40821, 22); - - /* Round 2 */ - - STEP(G, a, b, c, d, GET(1), 0xf61e2562, 5); - STEP(G, d, a, b, c, GET(6), 0xc040b340, 9); - STEP(G, c, d, a, b, GET(11), 0x265e5a51, 14); - STEP(G, b, c, d, a, GET(0), 0xe9b6c7aa, 20); - STEP(G, a, b, c, d, GET(5), 0xd62f105d, 5); - STEP(G, d, a, b, c, GET(10), 0x02441453, 9); - STEP(G, c, d, a, b, GET(15), 0xd8a1e681, 14); - STEP(G, b, c, d, a, GET(4), 0xe7d3fbc8, 20); - STEP(G, a, b, c, d, GET(9), 0x21e1cde6, 5); - STEP(G, d, a, b, c, GET(14), 0xc33707d6, 9); - STEP(G, c, d, a, b, GET(3), 0xf4d50d87, 14); - STEP(G, b, c, d, a, GET(8), 0x455a14ed, 20); - STEP(G, a, b, c, d, GET(13), 0xa9e3e905, 5); - STEP(G, d, a, b, c, GET(2), 0xfcefa3f8, 9); - STEP(G, c, d, a, b, GET(7), 0x676f02d9, 14); - STEP(G, b, c, d, a, GET(12), 0x8d2a4c8a, 20); - - /* Round 3 */ - - STEP(H, a, b, c, d, GET(5), 0xfffa3942, 4); - STEP(H, d, a, b, c, GET(8), 0x8771f681, 11); - STEP(H, c, d, a, b, GET(11), 0x6d9d6122, 16); - STEP(H, b, c, d, a, GET(14), 0xfde5380c, 23); - STEP(H, a, b, c, d, GET(1), 0xa4beea44, 4); - STEP(H, d, a, b, c, GET(4), 0x4bdecfa9, 11); - STEP(H, c, d, a, b, GET(7), 0xf6bb4b60, 16); - STEP(H, b, c, d, a, GET(10), 0xbebfbc70, 23); - STEP(H, a, b, c, d, GET(13), 0x289b7ec6, 4); - STEP(H, d, a, b, c, GET(0), 0xeaa127fa, 11); - STEP(H, c, d, a, b, GET(3), 0xd4ef3085, 16); - STEP(H, b, c, d, a, GET(6), 0x04881d05, 23); - STEP(H, a, b, c, d, GET(9), 0xd9d4d039, 4); - STEP(H, d, a, b, c, GET(12), 0xe6db99e5, 11); - STEP(H, c, d, a, b, GET(15), 0x1fa27cf8, 16); - STEP(H, b, c, d, a, GET(2), 0xc4ac5665, 23); - - /* Round 4 */ - - STEP(I, a, b, c, d, GET(0), 0xf4292244, 6); - STEP(I, d, a, b, c, GET(7), 0x432aff97, 10); - STEP(I, c, d, a, b, GET(14), 0xab9423a7, 15); - STEP(I, b, c, d, a, GET(5), 0xfc93a039, 21); - STEP(I, a, b, c, d, GET(12), 0x655b59c3, 6); - STEP(I, d, a, b, c, GET(3), 0x8f0ccc92, 10); - STEP(I, c, d, a, b, GET(10), 0xffeff47d, 15); - STEP(I, b, c, d, a, GET(1), 0x85845dd1, 21); - STEP(I, a, b, c, d, GET(8), 0x6fa87e4f, 6); - STEP(I, d, a, b, c, GET(15), 0xfe2ce6e0, 10); - STEP(I, c, d, a, b, GET(6), 0xa3014314, 15); - STEP(I, b, c, d, a, GET(13), 0x4e0811a1, 21); - STEP(I, a, b, c, d, GET(4), 0xf7537e82, 6); - STEP(I, d, a, b, c, GET(11), 0xbd3af235, 10); - STEP(I, c, d, a, b, GET(2), 0x2ad7d2bb, 15); - STEP(I, b, c, d, a, GET(9), 0xeb86d391, 21); - - a += saved_a; - b += saved_b; - c += saved_c; - d += saved_d; - - p += 64; - - } while (size -= 64); - - ctx->a = a; - ctx->b = b; - ctx->c = c; - ctx->d = d; - - return p; -} diff --git a/src/deps/src/nginx-1.30.3/src/core/ngx_md5.h b/src/deps/src/nginx-1.30.3/src/core/ngx_md5.h deleted file mode 100644 index 713b614f87..0000000000 --- a/src/deps/src/nginx-1.30.3/src/core/ngx_md5.h +++ /dev/null @@ -1,28 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#ifndef _NGX_MD5_H_INCLUDED_ -#define _NGX_MD5_H_INCLUDED_ - - -#include -#include - - -typedef struct { - uint64_t bytes; - uint32_t a, b, c, d; - u_char buffer[64]; -} ngx_md5_t; - - -void ngx_md5_init(ngx_md5_t *ctx); -void ngx_md5_update(ngx_md5_t *ctx, const void *data, size_t size); -void ngx_md5_final(u_char result[16], ngx_md5_t *ctx); - - -#endif /* _NGX_MD5_H_INCLUDED_ */ diff --git a/src/deps/src/nginx-1.30.3/src/core/ngx_module.c b/src/deps/src/nginx-1.30.3/src/core/ngx_module.c deleted file mode 100644 index 3e3c50683c..0000000000 --- a/src/deps/src/nginx-1.30.3/src/core/ngx_module.c +++ /dev/null @@ -1,360 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Maxim Dounin - * Copyright (C) Nginx, Inc. - */ - - -#include -#include - - -#define NGX_MAX_DYNAMIC_MODULES 128 - - -static ngx_uint_t ngx_module_index(ngx_cycle_t *cycle); -static ngx_uint_t ngx_module_ctx_index(ngx_cycle_t *cycle, ngx_uint_t type, - ngx_uint_t index); - - -ngx_uint_t ngx_max_module; -static ngx_uint_t ngx_modules_n; - - -ngx_int_t -ngx_preinit_modules(void) -{ - ngx_uint_t i; - - for (i = 0; ngx_modules[i]; i++) { - ngx_modules[i]->index = i; - ngx_modules[i]->name = ngx_module_names[i]; - } - - ngx_modules_n = i; - ngx_max_module = ngx_modules_n + NGX_MAX_DYNAMIC_MODULES; - - return NGX_OK; -} - - -ngx_int_t -ngx_cycle_modules(ngx_cycle_t *cycle) -{ - /* - * create a list of modules to be used for this cycle, - * copy static modules to it - */ - - cycle->modules = ngx_pcalloc(cycle->pool, (ngx_max_module + 1) - * sizeof(ngx_module_t *)); - if (cycle->modules == NULL) { - return NGX_ERROR; - } - - ngx_memcpy(cycle->modules, ngx_modules, - ngx_modules_n * sizeof(ngx_module_t *)); - - cycle->modules_n = ngx_modules_n; - - return NGX_OK; -} - - -ngx_int_t -ngx_init_modules(ngx_cycle_t *cycle) -{ - ngx_uint_t i; - - for (i = 0; cycle->modules[i]; i++) { - if (cycle->modules[i]->init_module) { - if (cycle->modules[i]->init_module(cycle) != NGX_OK) { - return NGX_ERROR; - } - } - } - - return NGX_OK; -} - - -ngx_int_t -ngx_count_modules(ngx_cycle_t *cycle, ngx_uint_t type) -{ - ngx_uint_t i, next, max; - ngx_module_t *module; - - next = 0; - max = 0; - - /* count appropriate modules, set up their indices */ - - for (i = 0; cycle->modules[i]; i++) { - module = cycle->modules[i]; - - if (module->type != type) { - continue; - } - - if (module->ctx_index != NGX_MODULE_UNSET_INDEX) { - - /* if ctx_index was assigned, preserve it */ - - if (module->ctx_index > max) { - max = module->ctx_index; - } - - if (module->ctx_index == next) { - next++; - } - - continue; - } - - /* search for some free index */ - - module->ctx_index = ngx_module_ctx_index(cycle, type, next); - - if (module->ctx_index > max) { - max = module->ctx_index; - } - - next = module->ctx_index + 1; - } - - /* - * make sure the number returned is big enough for previous - * cycle as well, else there will be problems if the number - * will be stored in a global variable (as it's used to be) - * and we'll have to roll back to the previous cycle - */ - - if (cycle->old_cycle && cycle->old_cycle->modules) { - - for (i = 0; cycle->old_cycle->modules[i]; i++) { - module = cycle->old_cycle->modules[i]; - - if (module->type != type) { - continue; - } - - if (module->ctx_index > max) { - max = module->ctx_index; - } - } - } - - /* prevent loading of additional modules */ - - cycle->modules_used = 1; - - return max + 1; -} - - -ngx_int_t -ngx_add_module(ngx_conf_t *cf, ngx_str_t *file, ngx_module_t *module, - char **order) -{ - void *rv; - ngx_uint_t i, m, before; - ngx_core_module_t *core_module; - - if (cf->cycle->modules_n >= ngx_max_module) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "too many modules loaded"); - return NGX_ERROR; - } - - if (module->version != nginx_version) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "module \"%V\" version %ui instead of %ui", - file, module->version, (ngx_uint_t) nginx_version); - return NGX_ERROR; - } - - if (ngx_strcmp(module->signature, NGX_MODULE_SIGNATURE) != 0) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "module \"%V\" is not binary compatible", - file); - return NGX_ERROR; - } - - for (m = 0; cf->cycle->modules[m]; m++) { - if (ngx_strcmp(cf->cycle->modules[m]->name, module->name) == 0) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "module \"%s\" is already loaded", - module->name); - return NGX_ERROR; - } - } - - /* - * if the module wasn't previously loaded, assign an index - */ - - if (module->index == NGX_MODULE_UNSET_INDEX) { - module->index = ngx_module_index(cf->cycle); - - if (module->index >= ngx_max_module) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "too many modules loaded"); - return NGX_ERROR; - } - } - - /* - * put the module into the cycle->modules array - */ - - before = cf->cycle->modules_n; - - if (order) { - for (i = 0; order[i]; i++) { - if (ngx_strcmp(order[i], module->name) == 0) { - i++; - break; - } - } - - for ( /* void */ ; order[i]; i++) { - -#if 0 - ngx_log_debug2(NGX_LOG_DEBUG_CORE, cf->log, 0, - "module: %s before %s", - module->name, order[i]); -#endif - - for (m = 0; m < before; m++) { - if (ngx_strcmp(cf->cycle->modules[m]->name, order[i]) == 0) { - - ngx_log_debug3(NGX_LOG_DEBUG_CORE, cf->log, 0, - "module: %s before %s:%i", - module->name, order[i], m); - - before = m; - break; - } - } - } - } - - /* put the module before modules[before] */ - - if (before != cf->cycle->modules_n) { - ngx_memmove(&cf->cycle->modules[before + 1], - &cf->cycle->modules[before], - (cf->cycle->modules_n - before) * sizeof(ngx_module_t *)); - } - - cf->cycle->modules[before] = module; - cf->cycle->modules_n++; - - if (module->type == NGX_CORE_MODULE) { - - /* - * we are smart enough to initialize core modules; - * other modules are expected to be loaded before - * initialization - e.g., http modules must be loaded - * before http{} block - */ - - core_module = module->ctx; - - if (core_module->create_conf) { - rv = core_module->create_conf(cf->cycle); - if (rv == NULL) { - return NGX_ERROR; - } - - cf->cycle->conf_ctx[module->index] = rv; - } - } - - return NGX_OK; -} - - -static ngx_uint_t -ngx_module_index(ngx_cycle_t *cycle) -{ - ngx_uint_t i, index; - ngx_module_t *module; - - index = 0; - -again: - - /* find an unused index */ - - for (i = 0; cycle->modules[i]; i++) { - module = cycle->modules[i]; - - if (module->index == index) { - index++; - goto again; - } - } - - /* check previous cycle */ - - if (cycle->old_cycle && cycle->old_cycle->modules) { - - for (i = 0; cycle->old_cycle->modules[i]; i++) { - module = cycle->old_cycle->modules[i]; - - if (module->index == index) { - index++; - goto again; - } - } - } - - return index; -} - - -static ngx_uint_t -ngx_module_ctx_index(ngx_cycle_t *cycle, ngx_uint_t type, ngx_uint_t index) -{ - ngx_uint_t i; - ngx_module_t *module; - -again: - - /* find an unused ctx_index */ - - for (i = 0; cycle->modules[i]; i++) { - module = cycle->modules[i]; - - if (module->type != type) { - continue; - } - - if (module->ctx_index == index) { - index++; - goto again; - } - } - - /* check previous cycle */ - - if (cycle->old_cycle && cycle->old_cycle->modules) { - - for (i = 0; cycle->old_cycle->modules[i]; i++) { - module = cycle->old_cycle->modules[i]; - - if (module->type != type) { - continue; - } - - if (module->ctx_index == index) { - index++; - goto again; - } - } - } - - return index; -} diff --git a/src/deps/src/nginx-1.30.3/src/core/ngx_module.h b/src/deps/src/nginx-1.30.3/src/core/ngx_module.h deleted file mode 100644 index a415cd6d9e..0000000000 --- a/src/deps/src/nginx-1.30.3/src/core/ngx_module.h +++ /dev/null @@ -1,288 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Maxim Dounin - * Copyright (C) Nginx, Inc. - */ - - -#ifndef _NGX_MODULE_H_INCLUDED_ -#define _NGX_MODULE_H_INCLUDED_ - - -#include -#include -#include - - -#define NGX_MODULE_UNSET_INDEX (ngx_uint_t) -1 - - -#define NGX_MODULE_SIGNATURE_0 \ - ngx_value(NGX_PTR_SIZE) "," \ - ngx_value(NGX_SIG_ATOMIC_T_SIZE) "," \ - ngx_value(NGX_TIME_T_SIZE) "," - -#if (NGX_HAVE_KQUEUE) -#define NGX_MODULE_SIGNATURE_1 "1" -#else -#define NGX_MODULE_SIGNATURE_1 "0" -#endif - -#if (NGX_HAVE_IOCP) -#define NGX_MODULE_SIGNATURE_2 "1" -#else -#define NGX_MODULE_SIGNATURE_2 "0" -#endif - -#if (NGX_HAVE_FILE_AIO || NGX_COMPAT) -#define NGX_MODULE_SIGNATURE_3 "1" -#else -#define NGX_MODULE_SIGNATURE_3 "0" -#endif - -#if (NGX_HAVE_SENDFILE_NODISKIO || NGX_COMPAT) -#define NGX_MODULE_SIGNATURE_4 "1" -#else -#define NGX_MODULE_SIGNATURE_4 "0" -#endif - -#if (NGX_HAVE_EVENTFD) -#define NGX_MODULE_SIGNATURE_5 "1" -#else -#define NGX_MODULE_SIGNATURE_5 "0" -#endif - -#if (NGX_HAVE_EPOLL) -#define NGX_MODULE_SIGNATURE_6 "1" -#else -#define NGX_MODULE_SIGNATURE_6 "0" -#endif - -#if (NGX_HAVE_KEEPALIVE_TUNABLE) -#define NGX_MODULE_SIGNATURE_7 "1" -#else -#define NGX_MODULE_SIGNATURE_7 "0" -#endif - -#if (NGX_HAVE_INET6) -#define NGX_MODULE_SIGNATURE_8 "1" -#else -#define NGX_MODULE_SIGNATURE_8 "0" -#endif - -#define NGX_MODULE_SIGNATURE_9 "1" -#define NGX_MODULE_SIGNATURE_10 "1" - -#if (NGX_HAVE_DEFERRED_ACCEPT && defined SO_ACCEPTFILTER) -#define NGX_MODULE_SIGNATURE_11 "1" -#else -#define NGX_MODULE_SIGNATURE_11 "0" -#endif - -#define NGX_MODULE_SIGNATURE_12 "1" - -#if (NGX_HAVE_SETFIB) -#define NGX_MODULE_SIGNATURE_13 "1" -#else -#define NGX_MODULE_SIGNATURE_13 "0" -#endif - -#if (NGX_HAVE_TCP_FASTOPEN) -#define NGX_MODULE_SIGNATURE_14 "1" -#else -#define NGX_MODULE_SIGNATURE_14 "0" -#endif - -#if (NGX_HAVE_UNIX_DOMAIN) -#define NGX_MODULE_SIGNATURE_15 "1" -#else -#define NGX_MODULE_SIGNATURE_15 "0" -#endif - -#if (NGX_HAVE_VARIADIC_MACROS) -#define NGX_MODULE_SIGNATURE_16 "1" -#else -#define NGX_MODULE_SIGNATURE_16 "0" -#endif - -#define NGX_MODULE_SIGNATURE_17 "0" - -#if (NGX_QUIC || NGX_COMPAT) -#define NGX_MODULE_SIGNATURE_18 "1" -#else -#define NGX_MODULE_SIGNATURE_18 "0" -#endif - -#if (NGX_HAVE_OPENAT) -#define NGX_MODULE_SIGNATURE_19 "1" -#else -#define NGX_MODULE_SIGNATURE_19 "0" -#endif - -#if (NGX_HAVE_ATOMIC_OPS) -#define NGX_MODULE_SIGNATURE_20 "1" -#else -#define NGX_MODULE_SIGNATURE_20 "0" -#endif - -#if (NGX_HAVE_POSIX_SEM) -#define NGX_MODULE_SIGNATURE_21 "1" -#else -#define NGX_MODULE_SIGNATURE_21 "0" -#endif - -#if (NGX_THREADS || NGX_COMPAT) -#define NGX_MODULE_SIGNATURE_22 "1" -#else -#define NGX_MODULE_SIGNATURE_22 "0" -#endif - -#if (NGX_PCRE) -#define NGX_MODULE_SIGNATURE_23 "1" -#else -#define NGX_MODULE_SIGNATURE_23 "0" -#endif - -#if (NGX_HTTP_SSL || NGX_COMPAT) -#define NGX_MODULE_SIGNATURE_24 "1" -#else -#define NGX_MODULE_SIGNATURE_24 "0" -#endif - -#define NGX_MODULE_SIGNATURE_25 "1" - -#if (NGX_HTTP_GZIP) -#define NGX_MODULE_SIGNATURE_26 "1" -#else -#define NGX_MODULE_SIGNATURE_26 "0" -#endif - -#define NGX_MODULE_SIGNATURE_27 "1" - -#if (NGX_HTTP_X_FORWARDED_FOR) -#define NGX_MODULE_SIGNATURE_28 "1" -#else -#define NGX_MODULE_SIGNATURE_28 "0" -#endif - -#if (NGX_HTTP_REALIP) -#define NGX_MODULE_SIGNATURE_29 "1" -#else -#define NGX_MODULE_SIGNATURE_29 "0" -#endif - -#if (NGX_HTTP_HEADERS) -#define NGX_MODULE_SIGNATURE_30 "1" -#else -#define NGX_MODULE_SIGNATURE_30 "0" -#endif - -#if (NGX_HTTP_DAV) -#define NGX_MODULE_SIGNATURE_31 "1" -#else -#define NGX_MODULE_SIGNATURE_31 "0" -#endif - -#if (NGX_HTTP_CACHE) -#define NGX_MODULE_SIGNATURE_32 "1" -#else -#define NGX_MODULE_SIGNATURE_32 "0" -#endif - -#if (NGX_HTTP_UPSTREAM_ZONE) -#define NGX_MODULE_SIGNATURE_33 "1" -#else -#define NGX_MODULE_SIGNATURE_33 "0" -#endif - -#if (NGX_COMPAT) -#define NGX_MODULE_SIGNATURE_34 "1" -#else -#define NGX_MODULE_SIGNATURE_34 "0" -#endif - -#define NGX_MODULE_SIGNATURE \ - NGX_MODULE_SIGNATURE_0 NGX_MODULE_SIGNATURE_1 NGX_MODULE_SIGNATURE_2 \ - NGX_MODULE_SIGNATURE_3 NGX_MODULE_SIGNATURE_4 NGX_MODULE_SIGNATURE_5 \ - NGX_MODULE_SIGNATURE_6 NGX_MODULE_SIGNATURE_7 NGX_MODULE_SIGNATURE_8 \ - NGX_MODULE_SIGNATURE_9 NGX_MODULE_SIGNATURE_10 NGX_MODULE_SIGNATURE_11 \ - NGX_MODULE_SIGNATURE_12 NGX_MODULE_SIGNATURE_13 NGX_MODULE_SIGNATURE_14 \ - NGX_MODULE_SIGNATURE_15 NGX_MODULE_SIGNATURE_16 NGX_MODULE_SIGNATURE_17 \ - NGX_MODULE_SIGNATURE_18 NGX_MODULE_SIGNATURE_19 NGX_MODULE_SIGNATURE_20 \ - NGX_MODULE_SIGNATURE_21 NGX_MODULE_SIGNATURE_22 NGX_MODULE_SIGNATURE_23 \ - NGX_MODULE_SIGNATURE_24 NGX_MODULE_SIGNATURE_25 NGX_MODULE_SIGNATURE_26 \ - NGX_MODULE_SIGNATURE_27 NGX_MODULE_SIGNATURE_28 NGX_MODULE_SIGNATURE_29 \ - NGX_MODULE_SIGNATURE_30 NGX_MODULE_SIGNATURE_31 NGX_MODULE_SIGNATURE_32 \ - NGX_MODULE_SIGNATURE_33 NGX_MODULE_SIGNATURE_34 - - -#define NGX_MODULE_V1 \ - NGX_MODULE_UNSET_INDEX, NGX_MODULE_UNSET_INDEX, \ - NULL, 0, 0, nginx_version, NGX_MODULE_SIGNATURE - -#define NGX_MODULE_V1_PADDING 0, 0, 0, 0, 0, 0, 0, 0 - - -struct ngx_module_s { - ngx_uint_t ctx_index; - ngx_uint_t index; - - char *name; - - ngx_uint_t spare0; - ngx_uint_t spare1; - - ngx_uint_t version; - const char *signature; - - void *ctx; - ngx_command_t *commands; - ngx_uint_t type; - - ngx_int_t (*init_master)(ngx_log_t *log); - - ngx_int_t (*init_module)(ngx_cycle_t *cycle); - - ngx_int_t (*init_process)(ngx_cycle_t *cycle); - ngx_int_t (*init_thread)(ngx_cycle_t *cycle); - void (*exit_thread)(ngx_cycle_t *cycle); - void (*exit_process)(ngx_cycle_t *cycle); - - void (*exit_master)(ngx_cycle_t *cycle); - - uintptr_t spare_hook0; - uintptr_t spare_hook1; - uintptr_t spare_hook2; - uintptr_t spare_hook3; - uintptr_t spare_hook4; - uintptr_t spare_hook5; - uintptr_t spare_hook6; - uintptr_t spare_hook7; -}; - - -typedef struct { - ngx_str_t name; - void *(*create_conf)(ngx_cycle_t *cycle); - char *(*init_conf)(ngx_cycle_t *cycle, void *conf); -} ngx_core_module_t; - - -ngx_int_t ngx_preinit_modules(void); -ngx_int_t ngx_cycle_modules(ngx_cycle_t *cycle); -ngx_int_t ngx_init_modules(ngx_cycle_t *cycle); -ngx_int_t ngx_count_modules(ngx_cycle_t *cycle, ngx_uint_t type); - - -ngx_int_t ngx_add_module(ngx_conf_t *cf, ngx_str_t *file, - ngx_module_t *module, char **order); - - -extern ngx_module_t *ngx_modules[]; -extern ngx_uint_t ngx_max_module; - -extern char *ngx_module_names[]; - - -#endif /* _NGX_MODULE_H_INCLUDED_ */ diff --git a/src/deps/src/nginx-1.30.3/src/core/ngx_murmurhash.c b/src/deps/src/nginx-1.30.3/src/core/ngx_murmurhash.c deleted file mode 100644 index 5ade658dd0..0000000000 --- a/src/deps/src/nginx-1.30.3/src/core/ngx_murmurhash.c +++ /dev/null @@ -1,52 +0,0 @@ - -/* - * Copyright (C) Austin Appleby - */ - - -#include -#include - - -uint32_t -ngx_murmur_hash2(u_char *data, size_t len) -{ - uint32_t h, k; - - h = 0 ^ len; - - while (len >= 4) { - k = data[0]; - k |= data[1] << 8; - k |= data[2] << 16; - k |= data[3] << 24; - - k *= 0x5bd1e995; - k ^= k >> 24; - k *= 0x5bd1e995; - - h *= 0x5bd1e995; - h ^= k; - - data += 4; - len -= 4; - } - - switch (len) { - case 3: - h ^= data[2] << 16; - /* fall through */ - case 2: - h ^= data[1] << 8; - /* fall through */ - case 1: - h ^= data[0]; - h *= 0x5bd1e995; - } - - h ^= h >> 13; - h *= 0x5bd1e995; - h ^= h >> 15; - - return h; -} diff --git a/src/deps/src/nginx-1.30.3/src/core/ngx_murmurhash.h b/src/deps/src/nginx-1.30.3/src/core/ngx_murmurhash.h deleted file mode 100644 index 54e867d303..0000000000 --- a/src/deps/src/nginx-1.30.3/src/core/ngx_murmurhash.h +++ /dev/null @@ -1,19 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#ifndef _NGX_MURMURHASH_H_INCLUDED_ -#define _NGX_MURMURHASH_H_INCLUDED_ - - -#include -#include - - -uint32_t ngx_murmur_hash2(u_char *data, size_t len); - - -#endif /* _NGX_MURMURHASH_H_INCLUDED_ */ diff --git a/src/deps/src/nginx-1.30.3/src/core/ngx_open_file_cache.c b/src/deps/src/nginx-1.30.3/src/core/ngx_open_file_cache.c deleted file mode 100644 index b23ee78d1d..0000000000 --- a/src/deps/src/nginx-1.30.3/src/core/ngx_open_file_cache.c +++ /dev/null @@ -1,1253 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#include -#include -#include - - -/* - * open file cache caches - * open file handles with stat() info; - * directories stat() info; - * files and directories errors: not found, access denied, etc. - */ - - -#define NGX_MIN_READ_AHEAD (128 * 1024) - - -static void ngx_open_file_cache_cleanup(void *data); -#if (NGX_HAVE_OPENAT) -static ngx_fd_t ngx_openat_file_owner(ngx_fd_t at_fd, const u_char *name, - ngx_int_t mode, ngx_int_t create, ngx_int_t access, ngx_log_t *log); -#if (NGX_HAVE_O_PATH) -static ngx_int_t ngx_file_o_path_info(ngx_fd_t fd, ngx_file_info_t *fi, - ngx_log_t *log); -#endif -#endif -static ngx_fd_t ngx_open_file_wrapper(ngx_str_t *name, - ngx_open_file_info_t *of, ngx_int_t mode, ngx_int_t create, - ngx_int_t access, ngx_log_t *log); -static ngx_int_t ngx_file_info_wrapper(ngx_str_t *name, - ngx_open_file_info_t *of, ngx_file_info_t *fi, ngx_log_t *log); -static ngx_int_t ngx_open_and_stat_file(ngx_str_t *name, - ngx_open_file_info_t *of, ngx_log_t *log); -static void ngx_open_file_add_event(ngx_open_file_cache_t *cache, - ngx_cached_open_file_t *file, ngx_open_file_info_t *of, ngx_log_t *log); -static void ngx_open_file_cleanup(void *data); -static void ngx_close_cached_file(ngx_open_file_cache_t *cache, - ngx_cached_open_file_t *file, ngx_uint_t min_uses, ngx_log_t *log); -static void ngx_open_file_del_event(ngx_cached_open_file_t *file); -static void ngx_expire_old_cached_files(ngx_open_file_cache_t *cache, - ngx_uint_t n, ngx_log_t *log); -static void ngx_open_file_cache_rbtree_insert_value(ngx_rbtree_node_t *temp, - ngx_rbtree_node_t *node, ngx_rbtree_node_t *sentinel); -static ngx_cached_open_file_t * - ngx_open_file_lookup(ngx_open_file_cache_t *cache, ngx_str_t *name, - uint32_t hash); -static void ngx_open_file_cache_remove(ngx_event_t *ev); - - -ngx_open_file_cache_t * -ngx_open_file_cache_init(ngx_pool_t *pool, ngx_uint_t max, time_t inactive) -{ - ngx_pool_cleanup_t *cln; - ngx_open_file_cache_t *cache; - - cache = ngx_palloc(pool, sizeof(ngx_open_file_cache_t)); - if (cache == NULL) { - return NULL; - } - - ngx_rbtree_init(&cache->rbtree, &cache->sentinel, - ngx_open_file_cache_rbtree_insert_value); - - ngx_queue_init(&cache->expire_queue); - - cache->current = 0; - cache->max = max; - cache->inactive = inactive; - - cln = ngx_pool_cleanup_add(pool, 0); - if (cln == NULL) { - return NULL; - } - - cln->handler = ngx_open_file_cache_cleanup; - cln->data = cache; - - return cache; -} - - -static void -ngx_open_file_cache_cleanup(void *data) -{ - ngx_open_file_cache_t *cache = data; - - ngx_queue_t *q; - ngx_cached_open_file_t *file; - - ngx_log_debug0(NGX_LOG_DEBUG_CORE, ngx_cycle->log, 0, - "open file cache cleanup"); - - for ( ;; ) { - - if (ngx_queue_empty(&cache->expire_queue)) { - break; - } - - q = ngx_queue_last(&cache->expire_queue); - - file = ngx_queue_data(q, ngx_cached_open_file_t, queue); - - ngx_queue_remove(q); - - ngx_rbtree_delete(&cache->rbtree, &file->node); - - cache->current--; - - ngx_log_debug1(NGX_LOG_DEBUG_CORE, ngx_cycle->log, 0, - "delete cached open file: %s", file->name); - - if (!file->err && !file->is_dir) { - file->close = 1; - file->count = 0; - ngx_close_cached_file(cache, file, 0, ngx_cycle->log); - - } else { - ngx_free(file->name); - ngx_free(file); - } - } - - if (cache->current) { - ngx_log_error(NGX_LOG_ALERT, ngx_cycle->log, 0, - "%ui items still left in open file cache", - cache->current); - } - - if (cache->rbtree.root != cache->rbtree.sentinel) { - ngx_log_error(NGX_LOG_ALERT, ngx_cycle->log, 0, - "rbtree still is not empty in open file cache"); - - } -} - - -ngx_int_t -ngx_open_cached_file(ngx_open_file_cache_t *cache, ngx_str_t *name, - ngx_open_file_info_t *of, ngx_pool_t *pool) -{ - time_t now; - uint32_t hash; - ngx_int_t rc; - ngx_file_info_t fi; - ngx_pool_cleanup_t *cln; - ngx_cached_open_file_t *file; - ngx_pool_cleanup_file_t *clnf; - ngx_open_file_cache_cleanup_t *ofcln; - - of->fd = NGX_INVALID_FILE; - of->err = 0; - - if (cache == NULL) { - - if (of->test_only) { - - if (ngx_file_info_wrapper(name, of, &fi, pool->log) - == NGX_FILE_ERROR) - { - return NGX_ERROR; - } - - of->uniq = ngx_file_uniq(&fi); - of->mtime = ngx_file_mtime(&fi); - of->size = ngx_file_size(&fi); - of->fs_size = ngx_file_fs_size(&fi); - of->is_dir = ngx_is_dir(&fi); - of->is_file = ngx_is_file(&fi); - of->is_link = ngx_is_link(&fi); - of->is_exec = ngx_is_exec(&fi); - - return NGX_OK; - } - - cln = ngx_pool_cleanup_add(pool, sizeof(ngx_pool_cleanup_file_t)); - if (cln == NULL) { - return NGX_ERROR; - } - - rc = ngx_open_and_stat_file(name, of, pool->log); - - if (rc == NGX_OK && !of->is_dir) { - cln->handler = ngx_pool_cleanup_file; - clnf = cln->data; - - clnf->fd = of->fd; - clnf->name = name->data; - clnf->log = pool->log; - } - - return rc; - } - - cln = ngx_pool_cleanup_add(pool, sizeof(ngx_open_file_cache_cleanup_t)); - if (cln == NULL) { - return NGX_ERROR; - } - - now = ngx_time(); - - hash = ngx_crc32_long(name->data, name->len); - - file = ngx_open_file_lookup(cache, name, hash); - - if (file) { - - file->uses++; - - ngx_queue_remove(&file->queue); - - if (file->fd == NGX_INVALID_FILE && file->err == 0 && !file->is_dir) { - - /* file was not used often enough to keep open */ - - rc = ngx_open_and_stat_file(name, of, pool->log); - - if (rc != NGX_OK && (of->err == 0 || !of->errors)) { - goto failed; - } - - goto add_event; - } - - if (file->use_event - || (file->event == NULL - && (of->uniq == 0 || of->uniq == file->uniq) - && now - file->created < of->valid -#if (NGX_HAVE_OPENAT) - && of->disable_symlinks == file->disable_symlinks - && of->disable_symlinks_from == file->disable_symlinks_from -#endif - )) - { - if (file->err == 0) { - - of->fd = file->fd; - of->uniq = file->uniq; - of->mtime = file->mtime; - of->size = file->size; - - of->is_dir = file->is_dir; - of->is_file = file->is_file; - of->is_link = file->is_link; - of->is_exec = file->is_exec; - of->is_directio = file->is_directio; - - if (!file->is_dir) { - file->count++; - ngx_open_file_add_event(cache, file, of, pool->log); - } - - } else { - of->err = file->err; -#if (NGX_HAVE_OPENAT) - of->failed = file->disable_symlinks ? ngx_openat_file_n - : ngx_open_file_n; -#else - of->failed = ngx_open_file_n; -#endif - } - - goto found; - } - - ngx_log_debug4(NGX_LOG_DEBUG_CORE, pool->log, 0, - "retest open file: %s, fd:%d, c:%d, e:%d", - file->name, file->fd, file->count, file->err); - - if (file->is_dir) { - - /* - * chances that directory became file are very small - * so test_dir flag allows to use a single syscall - * in ngx_file_info() instead of three syscalls - */ - - of->test_dir = 1; - } - - of->fd = file->fd; - of->uniq = file->uniq; - - rc = ngx_open_and_stat_file(name, of, pool->log); - - if (rc != NGX_OK && (of->err == 0 || !of->errors)) { - goto failed; - } - - if (of->is_dir) { - - if (file->is_dir || file->err) { - goto update; - } - - /* file became directory */ - - } else if (of->err == 0) { /* file */ - - if (file->is_dir || file->err) { - goto add_event; - } - - if (of->uniq == file->uniq) { - - if (file->event) { - file->use_event = 1; - } - - of->is_directio = file->is_directio; - - goto update; - } - - /* file was changed */ - - } else { /* error to cache */ - - if (file->err || file->is_dir) { - goto update; - } - - /* file was removed, etc. */ - } - - if (file->count == 0) { - - ngx_open_file_del_event(file); - - if (ngx_close_file(file->fd) == NGX_FILE_ERROR) { - ngx_log_error(NGX_LOG_ALERT, pool->log, ngx_errno, - ngx_close_file_n " \"%V\" failed", name); - } - - goto add_event; - } - - ngx_rbtree_delete(&cache->rbtree, &file->node); - - cache->current--; - - file->close = 1; - - goto create; - } - - /* not found */ - - rc = ngx_open_and_stat_file(name, of, pool->log); - - if (rc != NGX_OK && (of->err == 0 || !of->errors)) { - goto failed; - } - -create: - - if (cache->current >= cache->max) { - ngx_expire_old_cached_files(cache, 0, pool->log); - } - - file = ngx_alloc(sizeof(ngx_cached_open_file_t), pool->log); - - if (file == NULL) { - goto failed; - } - - file->name = ngx_alloc(name->len + 1, pool->log); - - if (file->name == NULL) { - ngx_free(file); - file = NULL; - goto failed; - } - - ngx_cpystrn(file->name, name->data, name->len + 1); - - file->node.key = hash; - - ngx_rbtree_insert(&cache->rbtree, &file->node); - - cache->current++; - - file->uses = 1; - file->count = 0; - file->use_event = 0; - file->event = NULL; - -add_event: - - ngx_open_file_add_event(cache, file, of, pool->log); - -update: - - file->fd = of->fd; - file->err = of->err; -#if (NGX_HAVE_OPENAT) - file->disable_symlinks = of->disable_symlinks; - file->disable_symlinks_from = of->disable_symlinks_from; -#endif - - if (of->err == 0) { - file->uniq = of->uniq; - file->mtime = of->mtime; - file->size = of->size; - - file->close = 0; - - file->is_dir = of->is_dir; - file->is_file = of->is_file; - file->is_link = of->is_link; - file->is_exec = of->is_exec; - file->is_directio = of->is_directio; - - if (!of->is_dir) { - file->count++; - } - } - - file->created = now; - -found: - - file->accessed = now; - - ngx_queue_insert_head(&cache->expire_queue, &file->queue); - - ngx_log_debug5(NGX_LOG_DEBUG_CORE, pool->log, 0, - "cached open file: %s, fd:%d, c:%d, e:%d, u:%d", - file->name, file->fd, file->count, file->err, file->uses); - - if (of->err == 0) { - - if (!of->is_dir) { - cln->handler = ngx_open_file_cleanup; - ofcln = cln->data; - - ofcln->cache = cache; - ofcln->file = file; - ofcln->min_uses = of->min_uses; - ofcln->log = pool->log; - } - - return NGX_OK; - } - - return NGX_ERROR; - -failed: - - if (file) { - ngx_rbtree_delete(&cache->rbtree, &file->node); - - cache->current--; - - if (file->count == 0) { - - if (file->fd != NGX_INVALID_FILE) { - if (ngx_close_file(file->fd) == NGX_FILE_ERROR) { - ngx_log_error(NGX_LOG_ALERT, pool->log, ngx_errno, - ngx_close_file_n " \"%s\" failed", - file->name); - } - } - - ngx_free(file->name); - ngx_free(file); - - } else { - file->close = 1; - } - } - - if (of->fd != NGX_INVALID_FILE) { - if (ngx_close_file(of->fd) == NGX_FILE_ERROR) { - ngx_log_error(NGX_LOG_ALERT, pool->log, ngx_errno, - ngx_close_file_n " \"%V\" failed", name); - } - } - - return NGX_ERROR; -} - - -#if (NGX_HAVE_OPENAT) - -static ngx_fd_t -ngx_openat_file_owner(ngx_fd_t at_fd, const u_char *name, - ngx_int_t mode, ngx_int_t create, ngx_int_t access, ngx_log_t *log) -{ - ngx_fd_t fd; - ngx_err_t err; - ngx_file_info_t fi, atfi; - - /* - * To allow symlinks with the same owner, use openat() (followed - * by fstat()) and fstatat(AT_SYMLINK_NOFOLLOW), and then compare - * uids between fstat() and fstatat(). - * - * As there is a race between openat() and fstatat() we don't - * know if openat() in fact opened symlink or not. Therefore, - * we have to compare uids even if fstatat() reports the opened - * component isn't a symlink (as we don't know whether it was - * symlink during openat() or not). - */ - - fd = ngx_openat_file(at_fd, name, mode, create, access); - - if (fd == NGX_INVALID_FILE) { - return NGX_INVALID_FILE; - } - - if (ngx_file_at_info(at_fd, name, &atfi, AT_SYMLINK_NOFOLLOW) - == NGX_FILE_ERROR) - { - err = ngx_errno; - goto failed; - } - -#if (NGX_HAVE_O_PATH) - if (ngx_file_o_path_info(fd, &fi, log) == NGX_ERROR) { - err = ngx_errno; - goto failed; - } -#else - if (ngx_fd_info(fd, &fi) == NGX_FILE_ERROR) { - err = ngx_errno; - goto failed; - } -#endif - - if (fi.st_uid != atfi.st_uid) { - err = NGX_ELOOP; - goto failed; - } - - return fd; - -failed: - - if (ngx_close_file(fd) == NGX_FILE_ERROR) { - ngx_log_error(NGX_LOG_ALERT, log, ngx_errno, - ngx_close_file_n " \"%s\" failed", name); - } - - ngx_set_errno(err); - - return NGX_INVALID_FILE; -} - - -#if (NGX_HAVE_O_PATH) - -static ngx_int_t -ngx_file_o_path_info(ngx_fd_t fd, ngx_file_info_t *fi, ngx_log_t *log) -{ - static ngx_uint_t use_fstat = 1; - - /* - * In Linux 2.6.39 the O_PATH flag was introduced that allows to obtain - * a descriptor without actually opening file or directory. It requires - * less permissions for path components, but till Linux 3.6 fstat() returns - * EBADF on such descriptors, and fstatat() with the AT_EMPTY_PATH flag - * should be used instead. - * - * Three scenarios are handled in this function: - * - * 1) The kernel is newer than 3.6 or fstat() with O_PATH support was - * backported by vendor. Then fstat() is used. - * - * 2) The kernel is newer than 2.6.39 but older than 3.6. In this case - * the first call of fstat() returns EBADF and we fallback to fstatat() - * with AT_EMPTY_PATH which was introduced at the same time as O_PATH. - * - * 3) The kernel is older than 2.6.39 but nginx was build with O_PATH - * support. Since descriptors are opened with O_PATH|O_RDONLY flags - * and O_PATH is ignored by the kernel then the O_RDONLY flag is - * actually used. In this case fstat() just works. - */ - - if (use_fstat) { - if (ngx_fd_info(fd, fi) != NGX_FILE_ERROR) { - return NGX_OK; - } - - if (ngx_errno != NGX_EBADF) { - return NGX_ERROR; - } - - ngx_log_error(NGX_LOG_NOTICE, log, 0, - "fstat(O_PATH) failed with EBADF, " - "switching to fstatat(AT_EMPTY_PATH)"); - - use_fstat = 0; - } - - if (ngx_file_at_info(fd, "", fi, AT_EMPTY_PATH) != NGX_FILE_ERROR) { - return NGX_OK; - } - - return NGX_ERROR; -} - -#endif - -#endif /* NGX_HAVE_OPENAT */ - - -static ngx_fd_t -ngx_open_file_wrapper(ngx_str_t *name, ngx_open_file_info_t *of, - ngx_int_t mode, ngx_int_t create, ngx_int_t access, ngx_log_t *log) -{ - ngx_fd_t fd; - -#if !(NGX_HAVE_OPENAT) - - fd = ngx_open_file(name->data, mode, create, access); - - if (fd == NGX_INVALID_FILE) { - of->err = ngx_errno; - of->failed = ngx_open_file_n; - return NGX_INVALID_FILE; - } - - return fd; - -#else - - u_char *p, *cp, *end; - ngx_fd_t at_fd; - ngx_str_t at_name; - - if (of->disable_symlinks == NGX_DISABLE_SYMLINKS_OFF) { - fd = ngx_open_file(name->data, mode, create, access); - - if (fd == NGX_INVALID_FILE) { - of->err = ngx_errno; - of->failed = ngx_open_file_n; - return NGX_INVALID_FILE; - } - - return fd; - } - - p = name->data; - end = p + name->len; - - at_name = *name; - - if (of->disable_symlinks_from) { - - cp = p + of->disable_symlinks_from; - - *cp = '\0'; - - at_fd = ngx_open_file(p, NGX_FILE_SEARCH|NGX_FILE_NONBLOCK, - NGX_FILE_OPEN, 0); - - *cp = '/'; - - if (at_fd == NGX_INVALID_FILE) { - of->err = ngx_errno; - of->failed = ngx_open_file_n; - return NGX_INVALID_FILE; - } - - at_name.len = of->disable_symlinks_from; - p = cp + 1; - - } else if (*p == '/') { - - at_fd = ngx_open_file("/", - NGX_FILE_SEARCH|NGX_FILE_NONBLOCK, - NGX_FILE_OPEN, 0); - - if (at_fd == NGX_INVALID_FILE) { - of->err = ngx_errno; - of->failed = ngx_openat_file_n; - return NGX_INVALID_FILE; - } - - at_name.len = 1; - p++; - - } else { - at_fd = NGX_AT_FDCWD; - } - - for ( ;; ) { - cp = ngx_strlchr(p, end, '/'); - if (cp == NULL) { - break; - } - - if (cp == p) { - p++; - continue; - } - - *cp = '\0'; - - if (of->disable_symlinks == NGX_DISABLE_SYMLINKS_NOTOWNER) { - fd = ngx_openat_file_owner(at_fd, p, - NGX_FILE_SEARCH|NGX_FILE_NONBLOCK, - NGX_FILE_OPEN, 0, log); - - } else { - fd = ngx_openat_file(at_fd, p, - NGX_FILE_SEARCH|NGX_FILE_NONBLOCK|NGX_FILE_NOFOLLOW, - NGX_FILE_OPEN, 0); - } - - *cp = '/'; - - if (fd == NGX_INVALID_FILE) { - of->err = ngx_errno; - of->failed = ngx_openat_file_n; - goto failed; - } - - if (at_fd != NGX_AT_FDCWD && ngx_close_file(at_fd) == NGX_FILE_ERROR) { - ngx_log_error(NGX_LOG_ALERT, log, ngx_errno, - ngx_close_file_n " \"%V\" failed", &at_name); - } - - p = cp + 1; - at_fd = fd; - at_name.len = cp - at_name.data; - } - - if (p == end) { - - /* - * If pathname ends with a trailing slash, assume the last path - * component is a directory and reopen it with requested flags; - * if not, fail with ENOTDIR as per POSIX. - * - * We cannot rely on O_DIRECTORY in the loop above to check - * that the last path component is a directory because - * O_DIRECTORY doesn't work on FreeBSD 8. Fortunately, by - * reopening a directory, we don't depend on it at all. - */ - - fd = ngx_openat_file(at_fd, ".", mode, create, access); - goto done; - } - - if (of->disable_symlinks == NGX_DISABLE_SYMLINKS_NOTOWNER - && !(create & (NGX_FILE_CREATE_OR_OPEN|NGX_FILE_TRUNCATE))) - { - fd = ngx_openat_file_owner(at_fd, p, mode, create, access, log); - - } else { - fd = ngx_openat_file(at_fd, p, mode|NGX_FILE_NOFOLLOW, create, access); - } - -done: - - if (fd == NGX_INVALID_FILE) { - of->err = ngx_errno; - of->failed = ngx_openat_file_n; - } - -failed: - - if (at_fd != NGX_AT_FDCWD && ngx_close_file(at_fd) == NGX_FILE_ERROR) { - ngx_log_error(NGX_LOG_ALERT, log, ngx_errno, - ngx_close_file_n " \"%V\" failed", &at_name); - } - - return fd; -#endif -} - - -static ngx_int_t -ngx_file_info_wrapper(ngx_str_t *name, ngx_open_file_info_t *of, - ngx_file_info_t *fi, ngx_log_t *log) -{ - ngx_int_t rc; - -#if !(NGX_HAVE_OPENAT) - - rc = ngx_file_info(name->data, fi); - - if (rc == NGX_FILE_ERROR) { - of->err = ngx_errno; - of->failed = ngx_file_info_n; - return NGX_FILE_ERROR; - } - - return rc; - -#else - - ngx_fd_t fd; - - if (of->disable_symlinks == NGX_DISABLE_SYMLINKS_OFF) { - - rc = ngx_file_info(name->data, fi); - - if (rc == NGX_FILE_ERROR) { - of->err = ngx_errno; - of->failed = ngx_file_info_n; - return NGX_FILE_ERROR; - } - - return rc; - } - - fd = ngx_open_file_wrapper(name, of, NGX_FILE_RDONLY|NGX_FILE_NONBLOCK, - NGX_FILE_OPEN, 0, log); - - if (fd == NGX_INVALID_FILE) { - return NGX_FILE_ERROR; - } - - rc = ngx_fd_info(fd, fi); - - if (rc == NGX_FILE_ERROR) { - of->err = ngx_errno; - of->failed = ngx_fd_info_n; - } - - if (ngx_close_file(fd) == NGX_FILE_ERROR) { - ngx_log_error(NGX_LOG_ALERT, log, ngx_errno, - ngx_close_file_n " \"%V\" failed", name); - } - - return rc; -#endif -} - - -static ngx_int_t -ngx_open_and_stat_file(ngx_str_t *name, ngx_open_file_info_t *of, - ngx_log_t *log) -{ - ngx_fd_t fd; - ngx_file_info_t fi; - - if (of->fd != NGX_INVALID_FILE) { - - if (ngx_file_info_wrapper(name, of, &fi, log) == NGX_FILE_ERROR) { - of->fd = NGX_INVALID_FILE; - return NGX_ERROR; - } - - if (of->uniq == ngx_file_uniq(&fi)) { - goto done; - } - - } else if (of->test_dir) { - - if (ngx_file_info_wrapper(name, of, &fi, log) == NGX_FILE_ERROR) { - of->fd = NGX_INVALID_FILE; - return NGX_ERROR; - } - - if (ngx_is_dir(&fi)) { - goto done; - } - } - - if (!of->log) { - - /* - * Use non-blocking open() not to hang on FIFO files, etc. - * This flag has no effect on a regular files. - */ - - fd = ngx_open_file_wrapper(name, of, NGX_FILE_RDONLY|NGX_FILE_NONBLOCK, - NGX_FILE_OPEN, 0, log); - - } else { - fd = ngx_open_file_wrapper(name, of, NGX_FILE_APPEND, - NGX_FILE_CREATE_OR_OPEN, - NGX_FILE_DEFAULT_ACCESS, log); - } - - if (fd == NGX_INVALID_FILE) { - of->fd = NGX_INVALID_FILE; - return NGX_ERROR; - } - - if (ngx_fd_info(fd, &fi) == NGX_FILE_ERROR) { - ngx_log_error(NGX_LOG_CRIT, log, ngx_errno, - ngx_fd_info_n " \"%V\" failed", name); - - if (ngx_close_file(fd) == NGX_FILE_ERROR) { - ngx_log_error(NGX_LOG_ALERT, log, ngx_errno, - ngx_close_file_n " \"%V\" failed", name); - } - - of->fd = NGX_INVALID_FILE; - - return NGX_ERROR; - } - - if (ngx_is_dir(&fi)) { - if (ngx_close_file(fd) == NGX_FILE_ERROR) { - ngx_log_error(NGX_LOG_ALERT, log, ngx_errno, - ngx_close_file_n " \"%V\" failed", name); - } - - of->fd = NGX_INVALID_FILE; - - } else { - of->fd = fd; - - if (of->read_ahead && ngx_file_size(&fi) > NGX_MIN_READ_AHEAD) { - if (ngx_read_ahead(fd, of->read_ahead) == NGX_ERROR) { - ngx_log_error(NGX_LOG_ALERT, log, ngx_errno, - ngx_read_ahead_n " \"%V\" failed", name); - } - } - - if (of->directio <= ngx_file_size(&fi)) { - if (ngx_directio_on(fd) == NGX_FILE_ERROR) { - ngx_log_error(NGX_LOG_ALERT, log, ngx_errno, - ngx_directio_on_n " \"%V\" failed", name); - - } else { - of->is_directio = 1; - } - } - } - -done: - - of->uniq = ngx_file_uniq(&fi); - of->mtime = ngx_file_mtime(&fi); - of->size = ngx_file_size(&fi); - of->fs_size = ngx_file_fs_size(&fi); - of->is_dir = ngx_is_dir(&fi); - of->is_file = ngx_is_file(&fi); - of->is_link = ngx_is_link(&fi); - of->is_exec = ngx_is_exec(&fi); - - return NGX_OK; -} - - -/* - * we ignore any possible event setting error and - * fallback to usual periodic file retests - */ - -static void -ngx_open_file_add_event(ngx_open_file_cache_t *cache, - ngx_cached_open_file_t *file, ngx_open_file_info_t *of, ngx_log_t *log) -{ - ngx_open_file_cache_event_t *fev; - - if (!(ngx_event_flags & NGX_USE_VNODE_EVENT) - || !of->events - || file->event - || of->fd == NGX_INVALID_FILE - || file->uses < of->min_uses) - { - return; - } - - file->use_event = 0; - - file->event = ngx_calloc(sizeof(ngx_event_t), log); - if (file->event== NULL) { - return; - } - - fev = ngx_alloc(sizeof(ngx_open_file_cache_event_t), log); - if (fev == NULL) { - ngx_free(file->event); - file->event = NULL; - return; - } - - fev->fd = of->fd; - fev->file = file; - fev->cache = cache; - - file->event->handler = ngx_open_file_cache_remove; - file->event->data = fev; - - /* - * although vnode event may be called while ngx_cycle->poll - * destruction, however, cleanup procedures are run before any - * memory freeing and events will be canceled. - */ - - file->event->log = ngx_cycle->log; - - if (ngx_add_event(file->event, NGX_VNODE_EVENT, NGX_ONESHOT_EVENT) - != NGX_OK) - { - ngx_free(file->event->data); - ngx_free(file->event); - file->event = NULL; - return; - } - - /* - * we do not set file->use_event here because there may be a race - * condition: a file may be deleted between opening the file and - * adding event, so we rely upon event notification only after - * one file revalidation on next file access - */ - - return; -} - - -static void -ngx_open_file_cleanup(void *data) -{ - ngx_open_file_cache_cleanup_t *c = data; - - c->file->count--; - - ngx_close_cached_file(c->cache, c->file, c->min_uses, c->log); - - /* drop one or two expired open files */ - ngx_expire_old_cached_files(c->cache, 1, c->log); -} - - -static void -ngx_close_cached_file(ngx_open_file_cache_t *cache, - ngx_cached_open_file_t *file, ngx_uint_t min_uses, ngx_log_t *log) -{ - ngx_log_debug5(NGX_LOG_DEBUG_CORE, log, 0, - "close cached open file: %s, fd:%d, c:%d, u:%d, %d", - file->name, file->fd, file->count, file->uses, file->close); - - if (!file->close) { - - file->accessed = ngx_time(); - - ngx_queue_remove(&file->queue); - - ngx_queue_insert_head(&cache->expire_queue, &file->queue); - - if (file->uses >= min_uses || file->count) { - return; - } - } - - ngx_open_file_del_event(file); - - if (file->count) { - return; - } - - if (file->fd != NGX_INVALID_FILE) { - - if (ngx_close_file(file->fd) == NGX_FILE_ERROR) { - ngx_log_error(NGX_LOG_ALERT, log, ngx_errno, - ngx_close_file_n " \"%s\" failed", file->name); - } - - file->fd = NGX_INVALID_FILE; - } - - if (!file->close) { - return; - } - - ngx_free(file->name); - ngx_free(file); -} - - -static void -ngx_open_file_del_event(ngx_cached_open_file_t *file) -{ - if (file->event == NULL) { - return; - } - - (void) ngx_del_event(file->event, NGX_VNODE_EVENT, - file->count ? NGX_FLUSH_EVENT : NGX_CLOSE_EVENT); - - ngx_free(file->event->data); - ngx_free(file->event); - file->event = NULL; - file->use_event = 0; -} - - -static void -ngx_expire_old_cached_files(ngx_open_file_cache_t *cache, ngx_uint_t n, - ngx_log_t *log) -{ - time_t now; - ngx_queue_t *q; - ngx_cached_open_file_t *file; - - now = ngx_time(); - - /* - * n == 1 deletes one or two inactive files - * n == 0 deletes least recently used file by force - * and one or two inactive files - */ - - while (n < 3) { - - if (ngx_queue_empty(&cache->expire_queue)) { - return; - } - - q = ngx_queue_last(&cache->expire_queue); - - file = ngx_queue_data(q, ngx_cached_open_file_t, queue); - - if (n++ != 0 && now - file->accessed <= cache->inactive) { - return; - } - - ngx_queue_remove(q); - - ngx_rbtree_delete(&cache->rbtree, &file->node); - - cache->current--; - - ngx_log_debug1(NGX_LOG_DEBUG_CORE, log, 0, - "expire cached open file: %s", file->name); - - if (!file->err && !file->is_dir) { - file->close = 1; - ngx_close_cached_file(cache, file, 0, log); - - } else { - ngx_free(file->name); - ngx_free(file); - } - } -} - - -static void -ngx_open_file_cache_rbtree_insert_value(ngx_rbtree_node_t *temp, - ngx_rbtree_node_t *node, ngx_rbtree_node_t *sentinel) -{ - ngx_rbtree_node_t **p; - ngx_cached_open_file_t *file, *file_temp; - - for ( ;; ) { - - if (node->key < temp->key) { - - p = &temp->left; - - } else if (node->key > temp->key) { - - p = &temp->right; - - } else { /* node->key == temp->key */ - - file = (ngx_cached_open_file_t *) node; - file_temp = (ngx_cached_open_file_t *) temp; - - p = (ngx_strcmp(file->name, file_temp->name) < 0) - ? &temp->left : &temp->right; - } - - if (*p == sentinel) { - break; - } - - temp = *p; - } - - *p = node; - node->parent = temp; - node->left = sentinel; - node->right = sentinel; - ngx_rbt_red(node); -} - - -static ngx_cached_open_file_t * -ngx_open_file_lookup(ngx_open_file_cache_t *cache, ngx_str_t *name, - uint32_t hash) -{ - ngx_int_t rc; - ngx_rbtree_node_t *node, *sentinel; - ngx_cached_open_file_t *file; - - node = cache->rbtree.root; - sentinel = cache->rbtree.sentinel; - - while (node != sentinel) { - - if (hash < node->key) { - node = node->left; - continue; - } - - if (hash > node->key) { - node = node->right; - continue; - } - - /* hash == node->key */ - - file = (ngx_cached_open_file_t *) node; - - rc = ngx_strcmp(name->data, file->name); - - if (rc == 0) { - return file; - } - - node = (rc < 0) ? node->left : node->right; - } - - return NULL; -} - - -static void -ngx_open_file_cache_remove(ngx_event_t *ev) -{ - ngx_cached_open_file_t *file; - ngx_open_file_cache_event_t *fev; - - fev = ev->data; - file = fev->file; - - ngx_queue_remove(&file->queue); - - ngx_rbtree_delete(&fev->cache->rbtree, &file->node); - - fev->cache->current--; - - /* NGX_ONESHOT_EVENT was already deleted */ - file->event = NULL; - file->use_event = 0; - - file->close = 1; - - ngx_close_cached_file(fev->cache, file, 0, ev->log); - - /* free memory only when fev->cache and fev->file are already not needed */ - - ngx_free(ev->data); - ngx_free(ev); -} diff --git a/src/deps/src/nginx-1.30.3/src/core/ngx_open_file_cache.h b/src/deps/src/nginx-1.30.3/src/core/ngx_open_file_cache.h deleted file mode 100644 index d119c1296f..0000000000 --- a/src/deps/src/nginx-1.30.3/src/core/ngx_open_file_cache.h +++ /dev/null @@ -1,129 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#include -#include - - -#ifndef _NGX_OPEN_FILE_CACHE_H_INCLUDED_ -#define _NGX_OPEN_FILE_CACHE_H_INCLUDED_ - - -#define NGX_OPEN_FILE_DIRECTIO_OFF NGX_MAX_OFF_T_VALUE - - -typedef struct { - ngx_fd_t fd; - ngx_file_uniq_t uniq; - time_t mtime; - off_t size; - off_t fs_size; - off_t directio; - size_t read_ahead; - - ngx_err_t err; - char *failed; - - time_t valid; - - ngx_uint_t min_uses; - -#if (NGX_HAVE_OPENAT) - size_t disable_symlinks_from; - unsigned disable_symlinks:2; -#endif - - unsigned test_dir:1; - unsigned test_only:1; - unsigned log:1; - unsigned errors:1; - unsigned events:1; - - unsigned is_dir:1; - unsigned is_file:1; - unsigned is_link:1; - unsigned is_exec:1; - unsigned is_directio:1; -} ngx_open_file_info_t; - - -typedef struct ngx_cached_open_file_s ngx_cached_open_file_t; - -struct ngx_cached_open_file_s { - ngx_rbtree_node_t node; - ngx_queue_t queue; - - u_char *name; - time_t created; - time_t accessed; - - ngx_fd_t fd; - ngx_file_uniq_t uniq; - time_t mtime; - off_t size; - ngx_err_t err; - - uint32_t uses; - -#if (NGX_HAVE_OPENAT) - size_t disable_symlinks_from; - unsigned disable_symlinks:2; -#endif - - unsigned count:24; - unsigned close:1; - unsigned use_event:1; - - unsigned is_dir:1; - unsigned is_file:1; - unsigned is_link:1; - unsigned is_exec:1; - unsigned is_directio:1; - - ngx_event_t *event; -}; - - -typedef struct { - ngx_rbtree_t rbtree; - ngx_rbtree_node_t sentinel; - ngx_queue_t expire_queue; - - ngx_uint_t current; - ngx_uint_t max; - time_t inactive; -} ngx_open_file_cache_t; - - -typedef struct { - ngx_open_file_cache_t *cache; - ngx_cached_open_file_t *file; - ngx_uint_t min_uses; - ngx_log_t *log; -} ngx_open_file_cache_cleanup_t; - - -typedef struct { - - /* ngx_connection_t stub to allow use c->fd as event ident */ - void *data; - ngx_event_t *read; - ngx_event_t *write; - ngx_fd_t fd; - - ngx_cached_open_file_t *file; - ngx_open_file_cache_t *cache; -} ngx_open_file_cache_event_t; - - -ngx_open_file_cache_t *ngx_open_file_cache_init(ngx_pool_t *pool, - ngx_uint_t max, time_t inactive); -ngx_int_t ngx_open_cached_file(ngx_open_file_cache_t *cache, ngx_str_t *name, - ngx_open_file_info_t *of, ngx_pool_t *pool); - - -#endif /* _NGX_OPEN_FILE_CACHE_H_INCLUDED_ */ diff --git a/src/deps/src/nginx-1.30.3/src/core/ngx_output_chain.c b/src/deps/src/nginx-1.30.3/src/core/ngx_output_chain.c deleted file mode 100644 index eb467e06a8..0000000000 --- a/src/deps/src/nginx-1.30.3/src/core/ngx_output_chain.c +++ /dev/null @@ -1,820 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#include -#include -#include - - -#if 0 -#define NGX_SENDFILE_LIMIT 4096 -#endif - -/* - * When DIRECTIO is enabled FreeBSD, Solaris, and MacOSX read directly - * to an application memory from a device if parameters are aligned - * to device sector boundary (512 bytes). They fallback to usual read - * operation if the parameters are not aligned. - * Linux allows DIRECTIO only if the parameters are aligned to a filesystem - * sector boundary, otherwise it returns EINVAL. The sector size is - * usually 512 bytes, however, on XFS it may be 4096 bytes. - */ - -#define NGX_NONE 1 - - -static ngx_inline ngx_int_t - ngx_output_chain_as_is(ngx_output_chain_ctx_t *ctx, ngx_buf_t *buf); -static ngx_int_t ngx_output_chain_add_copy(ngx_pool_t *pool, - ngx_chain_t **chain, ngx_chain_t *in); -static ngx_int_t ngx_output_chain_align_file_buf(ngx_output_chain_ctx_t *ctx, - off_t bsize); -static ngx_int_t ngx_output_chain_get_buf(ngx_output_chain_ctx_t *ctx, - off_t bsize); -static ngx_int_t ngx_output_chain_copy_buf(ngx_output_chain_ctx_t *ctx); - - -ngx_int_t -ngx_output_chain(ngx_output_chain_ctx_t *ctx, ngx_chain_t *in) -{ - off_t bsize; - ngx_int_t rc, last; - ngx_chain_t *cl, *out, **last_out; - - if (ctx->in == NULL && ctx->busy == NULL -#if (NGX_HAVE_FILE_AIO || NGX_THREADS) - && !ctx->aio -#endif - ) - { - /* - * the short path for the case when the ctx->in and ctx->busy chains - * are empty, the incoming chain is empty too or has the single buf - * that does not require the copy - */ - - if (in == NULL) { - return ctx->output_filter(ctx->filter_ctx, in); - } - - if (in->next == NULL -#if (NGX_SENDFILE_LIMIT) - && !(in->buf->in_file && in->buf->file_last > NGX_SENDFILE_LIMIT) -#endif - && ngx_output_chain_as_is(ctx, in->buf)) - { - return ctx->output_filter(ctx->filter_ctx, in); - } - } - - /* add the incoming buf to the chain ctx->in */ - - if (in) { - if (ngx_output_chain_add_copy(ctx->pool, &ctx->in, in) == NGX_ERROR) { - return NGX_ERROR; - } - } - - out = NULL; - last_out = &out; - last = NGX_NONE; - - for ( ;; ) { - -#if (NGX_HAVE_FILE_AIO || NGX_THREADS) - if (ctx->aio) { - return NGX_AGAIN; - } -#endif - - while (ctx->in) { - - /* - * cycle while there are the ctx->in bufs - * and there are the free output bufs to copy in - */ - - bsize = ngx_buf_size(ctx->in->buf); - - if (bsize == 0 && !ngx_buf_special(ctx->in->buf)) { - - ngx_log_error(NGX_LOG_ALERT, ctx->pool->log, 0, - "zero size buf in output " - "t:%d r:%d f:%d %p %p-%p %p %O-%O", - ctx->in->buf->temporary, - ctx->in->buf->recycled, - ctx->in->buf->in_file, - ctx->in->buf->start, - ctx->in->buf->pos, - ctx->in->buf->last, - ctx->in->buf->file, - ctx->in->buf->file_pos, - ctx->in->buf->file_last); - - ngx_debug_point(); - - cl = ctx->in; - ctx->in = cl->next; - - ngx_free_chain(ctx->pool, cl); - - continue; - } - - if (bsize < 0) { - - ngx_log_error(NGX_LOG_ALERT, ctx->pool->log, 0, - "negative size buf in output " - "t:%d r:%d f:%d %p %p-%p %p %O-%O", - ctx->in->buf->temporary, - ctx->in->buf->recycled, - ctx->in->buf->in_file, - ctx->in->buf->start, - ctx->in->buf->pos, - ctx->in->buf->last, - ctx->in->buf->file, - ctx->in->buf->file_pos, - ctx->in->buf->file_last); - - ngx_debug_point(); - - return NGX_ERROR; - } - - if (ngx_output_chain_as_is(ctx, ctx->in->buf)) { - - /* move the chain link to the output chain */ - - cl = ctx->in; - ctx->in = cl->next; - - *last_out = cl; - last_out = &cl->next; - cl->next = NULL; - - continue; - } - - if (ctx->buf == NULL) { - - rc = ngx_output_chain_align_file_buf(ctx, bsize); - - if (rc == NGX_ERROR) { - return NGX_ERROR; - } - - if (rc != NGX_OK) { - - if (ctx->free) { - - /* get the free buf */ - - cl = ctx->free; - ctx->buf = cl->buf; - ctx->free = cl->next; - - ngx_free_chain(ctx->pool, cl); - - } else if (out || ctx->allocated == ctx->bufs.num) { - - break; - - } else if (ngx_output_chain_get_buf(ctx, bsize) != NGX_OK) { - return NGX_ERROR; - } - } - } - - rc = ngx_output_chain_copy_buf(ctx); - - if (rc == NGX_ERROR) { - return rc; - } - - if (rc == NGX_AGAIN) { - if (out) { - break; - } - - return rc; - } - - /* delete the completed buf from the ctx->in chain */ - - if (ngx_buf_size(ctx->in->buf) == 0) { - cl = ctx->in; - ctx->in = cl->next; - - ngx_free_chain(ctx->pool, cl); - } - - cl = ngx_alloc_chain_link(ctx->pool); - if (cl == NULL) { - return NGX_ERROR; - } - - cl->buf = ctx->buf; - cl->next = NULL; - *last_out = cl; - last_out = &cl->next; - ctx->buf = NULL; - } - - if (out == NULL && last != NGX_NONE) { - - if (ctx->in) { - return NGX_AGAIN; - } - - return last; - } - - last = ctx->output_filter(ctx->filter_ctx, out); - - if (last == NGX_ERROR || last == NGX_DONE) { - return last; - } - - ngx_chain_update_chains(ctx->pool, &ctx->free, &ctx->busy, &out, - ctx->tag); - last_out = &out; - } -} - - -static ngx_inline ngx_int_t -ngx_output_chain_as_is(ngx_output_chain_ctx_t *ctx, ngx_buf_t *buf) -{ - ngx_uint_t sendfile; - - if (ngx_buf_special(buf)) { - return 1; - } - -#if (NGX_THREADS) - if (buf->in_file) { - buf->file->thread_handler = ctx->thread_handler; - buf->file->thread_ctx = ctx->filter_ctx; - } -#endif - - sendfile = ctx->sendfile; - -#if (NGX_SENDFILE_LIMIT) - - if (buf->in_file && buf->file_pos >= NGX_SENDFILE_LIMIT) { - sendfile = 0; - } - -#endif - -#if !(NGX_HAVE_SENDFILE_NODISKIO) - - /* - * With DIRECTIO, disable sendfile() unless sendfile(SF_NOCACHE) - * is available. - */ - - if (buf->in_file && buf->file->directio) { - sendfile = 0; - } - -#endif - - if (!sendfile) { - - if (!ngx_buf_in_memory(buf)) { - return 0; - } - - buf->in_file = 0; - } - - if (ctx->need_in_memory && !ngx_buf_in_memory(buf)) { - return 0; - } - - if (ctx->need_in_temp && (buf->memory || buf->mmap)) { - return 0; - } - - return 1; -} - - -static ngx_int_t -ngx_output_chain_add_copy(ngx_pool_t *pool, ngx_chain_t **chain, - ngx_chain_t *in) -{ - ngx_chain_t *cl, **ll; -#if (NGX_SENDFILE_LIMIT) - ngx_buf_t *b, *buf; -#endif - - ll = chain; - - for (cl = *chain; cl; cl = cl->next) { - ll = &cl->next; - } - - while (in) { - - cl = ngx_alloc_chain_link(pool); - if (cl == NULL) { - return NGX_ERROR; - } - -#if (NGX_SENDFILE_LIMIT) - - buf = in->buf; - - if (buf->in_file - && buf->file_pos < NGX_SENDFILE_LIMIT - && buf->file_last > NGX_SENDFILE_LIMIT) - { - /* split a file buf on two bufs by the sendfile limit */ - - b = ngx_calloc_buf(pool); - if (b == NULL) { - return NGX_ERROR; - } - - ngx_memcpy(b, buf, sizeof(ngx_buf_t)); - - if (ngx_buf_in_memory(buf)) { - buf->pos += (ssize_t) (NGX_SENDFILE_LIMIT - buf->file_pos); - b->last = buf->pos; - } - - buf->file_pos = NGX_SENDFILE_LIMIT; - b->file_last = NGX_SENDFILE_LIMIT; - - cl->buf = b; - - } else { - cl->buf = buf; - in = in->next; - } - -#else - cl->buf = in->buf; - in = in->next; - -#endif - - cl->next = NULL; - *ll = cl; - ll = &cl->next; - } - - return NGX_OK; -} - - -static ngx_int_t -ngx_output_chain_align_file_buf(ngx_output_chain_ctx_t *ctx, off_t bsize) -{ - size_t size; - ngx_buf_t *in; - - in = ctx->in->buf; - - if (in->file == NULL || !in->file->directio) { - return NGX_DECLINED; - } - - ctx->directio = 1; - - size = (size_t) (in->file_pos - (in->file_pos & ~(ctx->alignment - 1))); - - if (size == 0) { - - if (bsize >= (off_t) ctx->bufs.size) { - return NGX_DECLINED; - } - - size = (size_t) bsize; - - } else { - size = (size_t) ctx->alignment - size; - - if ((off_t) size > bsize) { - size = (size_t) bsize; - } - } - - ctx->buf = ngx_create_temp_buf(ctx->pool, size); - if (ctx->buf == NULL) { - return NGX_ERROR; - } - - /* - * we do not set ctx->buf->tag, because we do not want - * to reuse the buf via ctx->free list - */ - -#if (NGX_HAVE_ALIGNED_DIRECTIO) - ctx->unaligned = 1; -#endif - - return NGX_OK; -} - - -static ngx_int_t -ngx_output_chain_get_buf(ngx_output_chain_ctx_t *ctx, off_t bsize) -{ - size_t size; - ngx_buf_t *b, *in; - ngx_uint_t recycled; - - in = ctx->in->buf; - size = ctx->bufs.size; - recycled = 1; - - if (in->last_in_chain) { - - if (bsize < (off_t) size) { - - /* - * allocate a small temp buf for a small last buf - * or its small last part - */ - - size = (size_t) bsize; - recycled = 0; - - } else if (!ctx->directio - && ctx->bufs.num == 1 - && (bsize < (off_t) (size + size / 4))) - { - /* - * allocate a temp buf that equals to a last buf, - * if there is no directio, the last buf size is lesser - * than 1.25 of bufs.size and the temp buf is single - */ - - size = (size_t) bsize; - recycled = 0; - } - } - - b = ngx_calloc_buf(ctx->pool); - if (b == NULL) { - return NGX_ERROR; - } - - if (ctx->directio) { - - /* - * allocate block aligned to a disk sector size to enable - * userland buffer direct usage conjunctly with directio - */ - - b->start = ngx_pmemalign(ctx->pool, size, (size_t) ctx->alignment); - if (b->start == NULL) { - return NGX_ERROR; - } - - } else { - b->start = ngx_palloc(ctx->pool, size); - if (b->start == NULL) { - return NGX_ERROR; - } - } - - b->pos = b->start; - b->last = b->start; - b->end = b->last + size; - b->temporary = 1; - b->tag = ctx->tag; - b->recycled = recycled; - - ctx->buf = b; - ctx->allocated++; - - return NGX_OK; -} - - -static ngx_int_t -ngx_output_chain_copy_buf(ngx_output_chain_ctx_t *ctx) -{ - off_t size; - ssize_t n; - ngx_buf_t *src, *dst; - ngx_uint_t sendfile; - - src = ctx->in->buf; - dst = ctx->buf; - - size = ngx_buf_size(src); - size = ngx_min(size, dst->end - dst->pos); - - sendfile = ctx->sendfile && !ctx->directio; - -#if (NGX_SENDFILE_LIMIT) - - if (src->in_file && src->file_pos >= NGX_SENDFILE_LIMIT) { - sendfile = 0; - } - -#endif - - if (ngx_buf_in_memory(src)) { - ngx_memcpy(dst->pos, src->pos, (size_t) size); - src->pos += (size_t) size; - dst->last += (size_t) size; - - if (src->in_file) { - - if (sendfile) { - dst->in_file = 1; - dst->file = src->file; - dst->file_pos = src->file_pos; - dst->file_last = src->file_pos + size; - - } else { - dst->in_file = 0; - } - - src->file_pos += size; - - } else { - dst->in_file = 0; - } - - if (src->pos == src->last) { - dst->flush = src->flush; - dst->last_buf = src->last_buf; - dst->last_in_chain = src->last_in_chain; - - } else { - dst->flush = 0; - dst->last_buf = 0; - dst->last_in_chain = 0; - } - - } else { - -#if (NGX_HAVE_ALIGNED_DIRECTIO) - - if (ctx->unaligned) { - if (ngx_directio_off(src->file->fd) == NGX_FILE_ERROR) { - ngx_log_error(NGX_LOG_ALERT, ctx->pool->log, ngx_errno, - ngx_directio_off_n " \"%s\" failed", - src->file->name.data); - } - } - -#endif - -#if (NGX_HAVE_FILE_AIO) - if (ctx->aio_handler) { - n = ngx_file_aio_read(src->file, dst->pos, (size_t) size, - src->file_pos, ctx->pool); - if (n == NGX_AGAIN) { - ctx->aio_handler(ctx, src->file); - return NGX_AGAIN; - } - - } else -#endif -#if (NGX_THREADS) - if (ctx->thread_handler) { - src->file->thread_task = ctx->thread_task; - src->file->thread_handler = ctx->thread_handler; - src->file->thread_ctx = ctx->filter_ctx; - - n = ngx_thread_read(src->file, dst->pos, (size_t) size, - src->file_pos, ctx->pool); - if (n == NGX_AGAIN) { - ctx->thread_task = src->file->thread_task; - return NGX_AGAIN; - } - - } else -#endif - { - n = ngx_read_file(src->file, dst->pos, (size_t) size, - src->file_pos); - } - -#if (NGX_HAVE_ALIGNED_DIRECTIO) - - if (ctx->unaligned) { - ngx_err_t err; - - err = ngx_errno; - - if (ngx_directio_on(src->file->fd) == NGX_FILE_ERROR) { - ngx_log_error(NGX_LOG_ALERT, ctx->pool->log, ngx_errno, - ngx_directio_on_n " \"%s\" failed", - src->file->name.data); - } - - ngx_set_errno(err); - - ctx->unaligned = 0; - } - -#endif - - if (n == NGX_ERROR) { - return (ngx_int_t) n; - } - - if (n != size) { - ngx_log_error(NGX_LOG_ALERT, ctx->pool->log, 0, - ngx_read_file_n " read only %z of %O from \"%s\"", - n, size, src->file->name.data); - return NGX_ERROR; - } - - dst->last += n; - - if (sendfile) { - dst->in_file = 1; - dst->file = src->file; - dst->file_pos = src->file_pos; - dst->file_last = src->file_pos + n; - - } else { - dst->in_file = 0; - } - - src->file_pos += n; - - if (src->file_pos == src->file_last) { - dst->flush = src->flush; - dst->last_buf = src->last_buf; - dst->last_in_chain = src->last_in_chain; - - } else { - dst->flush = 0; - dst->last_buf = 0; - dst->last_in_chain = 0; - } - } - - return NGX_OK; -} - - -ngx_int_t -ngx_chain_writer(void *data, ngx_chain_t *in) -{ - ngx_chain_writer_ctx_t *ctx = data; - - off_t size; - ngx_chain_t *cl, *ln, *chain; - ngx_connection_t *c; - - c = ctx->connection; - - for (size = 0; in; in = in->next) { - - if (ngx_buf_size(in->buf) == 0 && !ngx_buf_special(in->buf)) { - - ngx_log_error(NGX_LOG_ALERT, ctx->pool->log, 0, - "zero size buf in chain writer " - "t:%d r:%d f:%d %p %p-%p %p %O-%O", - in->buf->temporary, - in->buf->recycled, - in->buf->in_file, - in->buf->start, - in->buf->pos, - in->buf->last, - in->buf->file, - in->buf->file_pos, - in->buf->file_last); - - ngx_debug_point(); - - continue; - } - - if (ngx_buf_size(in->buf) < 0) { - - ngx_log_error(NGX_LOG_ALERT, ctx->pool->log, 0, - "negative size buf in chain writer " - "t:%d r:%d f:%d %p %p-%p %p %O-%O", - in->buf->temporary, - in->buf->recycled, - in->buf->in_file, - in->buf->start, - in->buf->pos, - in->buf->last, - in->buf->file, - in->buf->file_pos, - in->buf->file_last); - - ngx_debug_point(); - - return NGX_ERROR; - } - - size += ngx_buf_size(in->buf); - - ngx_log_debug2(NGX_LOG_DEBUG_CORE, c->log, 0, - "chain writer buf fl:%d s:%uO", - in->buf->flush, ngx_buf_size(in->buf)); - - cl = ngx_alloc_chain_link(ctx->pool); - if (cl == NULL) { - return NGX_ERROR; - } - - cl->buf = in->buf; - cl->next = NULL; - *ctx->last = cl; - ctx->last = &cl->next; - } - - ngx_log_debug1(NGX_LOG_DEBUG_CORE, c->log, 0, - "chain writer in: %p", ctx->out); - - for (cl = ctx->out; cl; cl = cl->next) { - - if (ngx_buf_size(cl->buf) == 0 && !ngx_buf_special(cl->buf)) { - - ngx_log_error(NGX_LOG_ALERT, ctx->pool->log, 0, - "zero size buf in chain writer " - "t:%d r:%d f:%d %p %p-%p %p %O-%O", - cl->buf->temporary, - cl->buf->recycled, - cl->buf->in_file, - cl->buf->start, - cl->buf->pos, - cl->buf->last, - cl->buf->file, - cl->buf->file_pos, - cl->buf->file_last); - - ngx_debug_point(); - - continue; - } - - if (ngx_buf_size(cl->buf) < 0) { - - ngx_log_error(NGX_LOG_ALERT, ctx->pool->log, 0, - "negative size buf in chain writer " - "t:%d r:%d f:%d %p %p-%p %p %O-%O", - cl->buf->temporary, - cl->buf->recycled, - cl->buf->in_file, - cl->buf->start, - cl->buf->pos, - cl->buf->last, - cl->buf->file, - cl->buf->file_pos, - cl->buf->file_last); - - ngx_debug_point(); - - return NGX_ERROR; - } - - size += ngx_buf_size(cl->buf); - } - - if (size == 0 && !c->buffered) { - return NGX_OK; - } - - chain = c->send_chain(c, ctx->out, ctx->limit); - - ngx_log_debug1(NGX_LOG_DEBUG_CORE, c->log, 0, - "chain writer out: %p", chain); - - if (chain == NGX_CHAIN_ERROR) { - return NGX_ERROR; - } - - if (chain && c->write->ready) { - ngx_post_event(c->write, &ngx_posted_next_events); - } - - for (cl = ctx->out; cl && cl != chain; /* void */) { - ln = cl; - cl = cl->next; - ngx_free_chain(ctx->pool, ln); - } - - ctx->out = chain; - - if (ctx->out == NULL) { - ctx->last = &ctx->out; - - if (!c->buffered) { - return NGX_OK; - } - } - - return NGX_AGAIN; -} diff --git a/src/deps/src/nginx-1.30.3/src/core/ngx_palloc.c b/src/deps/src/nginx-1.30.3/src/core/ngx_palloc.c deleted file mode 100644 index d3044ac9c5..0000000000 --- a/src/deps/src/nginx-1.30.3/src/core/ngx_palloc.c +++ /dev/null @@ -1,430 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#include -#include - - -static ngx_inline void *ngx_palloc_small(ngx_pool_t *pool, size_t size, - ngx_uint_t align); -static void *ngx_palloc_block(ngx_pool_t *pool, size_t size); -static void *ngx_palloc_large(ngx_pool_t *pool, size_t size); - - -ngx_pool_t * -ngx_create_pool(size_t size, ngx_log_t *log) -{ - ngx_pool_t *p; - - p = ngx_memalign(NGX_POOL_ALIGNMENT, size, log); - if (p == NULL) { - return NULL; - } - - p->d.last = (u_char *) p + sizeof(ngx_pool_t); - p->d.end = (u_char *) p + size; - p->d.next = NULL; - p->d.failed = 0; - - size = size - sizeof(ngx_pool_t); - p->max = (size < NGX_MAX_ALLOC_FROM_POOL) ? size : NGX_MAX_ALLOC_FROM_POOL; - - p->current = p; - p->chain = NULL; - p->large = NULL; - p->cleanup = NULL; - p->log = log; - - return p; -} - - -void -ngx_destroy_pool(ngx_pool_t *pool) -{ - ngx_pool_t *p, *n; - ngx_pool_large_t *l; - ngx_pool_cleanup_t *c; - - for (c = pool->cleanup; c; c = c->next) { - if (c->handler) { - ngx_log_debug1(NGX_LOG_DEBUG_ALLOC, pool->log, 0, - "run cleanup: %p", c); - c->handler(c->data); - } - } - -#if (NGX_DEBUG) - - /* - * we could allocate the pool->log from this pool - * so we cannot use this log while free()ing the pool - */ - - for (l = pool->large; l; l = l->next) { - ngx_log_debug1(NGX_LOG_DEBUG_ALLOC, pool->log, 0, "free: %p", l->alloc); - } - - for (p = pool, n = pool->d.next; /* void */; p = n, n = n->d.next) { - ngx_log_debug2(NGX_LOG_DEBUG_ALLOC, pool->log, 0, - "free: %p, unused: %uz", p, p->d.end - p->d.last); - - if (n == NULL) { - break; - } - } - -#endif - - for (l = pool->large; l; l = l->next) { - if (l->alloc) { - ngx_free(l->alloc); - } - } - - for (p = pool, n = pool->d.next; /* void */; p = n, n = n->d.next) { - ngx_free(p); - - if (n == NULL) { - break; - } - } -} - - -void -ngx_reset_pool(ngx_pool_t *pool) -{ - ngx_pool_t *p; - ngx_pool_large_t *l; - - for (l = pool->large; l; l = l->next) { - if (l->alloc) { - ngx_free(l->alloc); - } - } - - for (p = pool; p; p = p->d.next) { - p->d.last = (u_char *) p + sizeof(ngx_pool_t); - p->d.failed = 0; - } - - pool->current = pool; - pool->chain = NULL; - pool->large = NULL; -} - - -void * -ngx_palloc(ngx_pool_t *pool, size_t size) -{ -#if !(NGX_DEBUG_PALLOC) - if (size <= pool->max) { - return ngx_palloc_small(pool, size, 1); - } -#endif - - return ngx_palloc_large(pool, size); -} - - -void * -ngx_pnalloc(ngx_pool_t *pool, size_t size) -{ -#if !(NGX_DEBUG_PALLOC) - if (size <= pool->max) { - return ngx_palloc_small(pool, size, 0); - } -#endif - - return ngx_palloc_large(pool, size); -} - - -static ngx_inline void * -ngx_palloc_small(ngx_pool_t *pool, size_t size, ngx_uint_t align) -{ - u_char *m; - ngx_pool_t *p; - - p = pool->current; - - do { - m = p->d.last; - - if (align) { - m = ngx_align_ptr(m, NGX_ALIGNMENT); - } - - if ((size_t) (p->d.end - m) >= size) { - p->d.last = m + size; - - return m; - } - - p = p->d.next; - - } while (p); - - return ngx_palloc_block(pool, size); -} - - -static void * -ngx_palloc_block(ngx_pool_t *pool, size_t size) -{ - u_char *m; - size_t psize; - ngx_pool_t *p, *new; - - psize = (size_t) (pool->d.end - (u_char *) pool); - - m = ngx_memalign(NGX_POOL_ALIGNMENT, psize, pool->log); - if (m == NULL) { - return NULL; - } - - new = (ngx_pool_t *) m; - - new->d.end = m + psize; - new->d.next = NULL; - new->d.failed = 0; - - m += sizeof(ngx_pool_data_t); - m = ngx_align_ptr(m, NGX_ALIGNMENT); - new->d.last = m + size; - - for (p = pool->current; p->d.next; p = p->d.next) { - if (p->d.failed++ > 4) { - pool->current = p->d.next; - } - } - - p->d.next = new; - - return m; -} - - -static void * -ngx_palloc_large(ngx_pool_t *pool, size_t size) -{ - void *p; - ngx_uint_t n; - ngx_pool_large_t *large; - - p = ngx_alloc(size, pool->log); - if (p == NULL) { - return NULL; - } - - n = 0; - - for (large = pool->large; large; large = large->next) { - if (large->alloc == NULL) { - large->alloc = p; - return p; - } - - if (n++ > 3) { - break; - } - } - - large = ngx_palloc_small(pool, sizeof(ngx_pool_large_t), 1); - if (large == NULL) { - ngx_free(p); - return NULL; - } - - large->alloc = p; - large->next = pool->large; - pool->large = large; - - return p; -} - - -void * -ngx_pmemalign(ngx_pool_t *pool, size_t size, size_t alignment) -{ - void *p; - ngx_pool_large_t *large; - - p = ngx_memalign(alignment, size, pool->log); - if (p == NULL) { - return NULL; - } - - large = ngx_palloc_small(pool, sizeof(ngx_pool_large_t), 1); - if (large == NULL) { - ngx_free(p); - return NULL; - } - - large->alloc = p; - large->next = pool->large; - pool->large = large; - - return p; -} - - -ngx_int_t -ngx_pfree(ngx_pool_t *pool, void *p) -{ - ngx_pool_large_t *l; - - for (l = pool->large; l; l = l->next) { - if (p == l->alloc) { - ngx_log_debug1(NGX_LOG_DEBUG_ALLOC, pool->log, 0, - "free: %p", l->alloc); - ngx_free(l->alloc); - l->alloc = NULL; - - return NGX_OK; - } - } - - return NGX_DECLINED; -} - - -void * -ngx_pcalloc(ngx_pool_t *pool, size_t size) -{ - void *p; - - p = ngx_palloc(pool, size); - if (p) { - ngx_memzero(p, size); - } - - return p; -} - - -ngx_pool_cleanup_t * -ngx_pool_cleanup_add(ngx_pool_t *p, size_t size) -{ - ngx_pool_cleanup_t *c; - - c = ngx_palloc(p, sizeof(ngx_pool_cleanup_t)); - if (c == NULL) { - return NULL; - } - - if (size) { - c->data = ngx_palloc(p, size); - if (c->data == NULL) { - return NULL; - } - - } else { - c->data = NULL; - } - - c->handler = NULL; - c->next = p->cleanup; - - p->cleanup = c; - - ngx_log_debug1(NGX_LOG_DEBUG_ALLOC, p->log, 0, "add cleanup: %p", c); - - return c; -} - - -void -ngx_pool_run_cleanup_file(ngx_pool_t *p, ngx_fd_t fd) -{ - ngx_pool_cleanup_t *c; - ngx_pool_cleanup_file_t *cf; - - for (c = p->cleanup; c; c = c->next) { - if (c->handler == ngx_pool_cleanup_file) { - - cf = c->data; - - if (cf->fd == fd) { - c->handler(cf); - c->handler = NULL; - return; - } - } - } -} - - -void -ngx_pool_cleanup_file(void *data) -{ - ngx_pool_cleanup_file_t *c = data; - - ngx_log_debug1(NGX_LOG_DEBUG_ALLOC, c->log, 0, "file cleanup: fd:%d", - c->fd); - - if (ngx_close_file(c->fd) == NGX_FILE_ERROR) { - ngx_log_error(NGX_LOG_ALERT, c->log, ngx_errno, - ngx_close_file_n " \"%s\" failed", c->name); - } -} - - -void -ngx_pool_delete_file(void *data) -{ - ngx_pool_cleanup_file_t *c = data; - - ngx_err_t err; - - ngx_log_debug2(NGX_LOG_DEBUG_ALLOC, c->log, 0, "file cleanup: fd:%d %s", - c->fd, c->name); - - if (ngx_delete_file(c->name) == NGX_FILE_ERROR) { - err = ngx_errno; - - if (err != NGX_ENOENT) { - ngx_log_error(NGX_LOG_CRIT, c->log, err, - ngx_delete_file_n " \"%s\" failed", c->name); - } - } - - if (ngx_close_file(c->fd) == NGX_FILE_ERROR) { - ngx_log_error(NGX_LOG_ALERT, c->log, ngx_errno, - ngx_close_file_n " \"%s\" failed", c->name); - } -} - - -#if 0 - -static void * -ngx_get_cached_block(size_t size) -{ - void *p; - ngx_cached_block_slot_t *slot; - - if (ngx_cycle->cache == NULL) { - return NULL; - } - - slot = &ngx_cycle->cache[(size + ngx_pagesize - 1) / ngx_pagesize]; - - slot->tries++; - - if (slot->number) { - p = slot->block; - slot->block = slot->block->next; - slot->number--; - return p; - } - - return NULL; -} - -#endif diff --git a/src/deps/src/nginx-1.30.3/src/core/ngx_palloc.h b/src/deps/src/nginx-1.30.3/src/core/ngx_palloc.h deleted file mode 100644 index 376e012837..0000000000 --- a/src/deps/src/nginx-1.30.3/src/core/ngx_palloc.h +++ /dev/null @@ -1,92 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#ifndef _NGX_PALLOC_H_INCLUDED_ -#define _NGX_PALLOC_H_INCLUDED_ - - -#include -#include - - -/* - * NGX_MAX_ALLOC_FROM_POOL should be (ngx_pagesize - 1), i.e. 4095 on x86. - * On Windows NT it decreases a number of locked pages in a kernel. - */ -#define NGX_MAX_ALLOC_FROM_POOL (ngx_pagesize - 1) - -#define NGX_DEFAULT_POOL_SIZE (16 * 1024) - -#define NGX_POOL_ALIGNMENT 16 -#define NGX_MIN_POOL_SIZE \ - ngx_align((sizeof(ngx_pool_t) + 2 * sizeof(ngx_pool_large_t)), \ - NGX_POOL_ALIGNMENT) - - -typedef void (*ngx_pool_cleanup_pt)(void *data); - -typedef struct ngx_pool_cleanup_s ngx_pool_cleanup_t; - -struct ngx_pool_cleanup_s { - ngx_pool_cleanup_pt handler; - void *data; - ngx_pool_cleanup_t *next; -}; - - -typedef struct ngx_pool_large_s ngx_pool_large_t; - -struct ngx_pool_large_s { - ngx_pool_large_t *next; - void *alloc; -}; - - -typedef struct { - u_char *last; - u_char *end; - ngx_pool_t *next; - ngx_uint_t failed; -} ngx_pool_data_t; - - -struct ngx_pool_s { - ngx_pool_data_t d; - size_t max; - ngx_pool_t *current; - ngx_chain_t *chain; - ngx_pool_large_t *large; - ngx_pool_cleanup_t *cleanup; - ngx_log_t *log; -}; - - -typedef struct { - ngx_fd_t fd; - u_char *name; - ngx_log_t *log; -} ngx_pool_cleanup_file_t; - - -ngx_pool_t *ngx_create_pool(size_t size, ngx_log_t *log); -void ngx_destroy_pool(ngx_pool_t *pool); -void ngx_reset_pool(ngx_pool_t *pool); - -void *ngx_palloc(ngx_pool_t *pool, size_t size); -void *ngx_pnalloc(ngx_pool_t *pool, size_t size); -void *ngx_pcalloc(ngx_pool_t *pool, size_t size); -void *ngx_pmemalign(ngx_pool_t *pool, size_t size, size_t alignment); -ngx_int_t ngx_pfree(ngx_pool_t *pool, void *p); - - -ngx_pool_cleanup_t *ngx_pool_cleanup_add(ngx_pool_t *p, size_t size); -void ngx_pool_run_cleanup_file(ngx_pool_t *p, ngx_fd_t fd); -void ngx_pool_cleanup_file(void *data); -void ngx_pool_delete_file(void *data); - - -#endif /* _NGX_PALLOC_H_INCLUDED_ */ diff --git a/src/deps/src/nginx-1.30.3/src/core/ngx_parse.c b/src/deps/src/nginx-1.30.3/src/core/ngx_parse.c deleted file mode 100644 index d35e60fac8..0000000000 --- a/src/deps/src/nginx-1.30.3/src/core/ngx_parse.c +++ /dev/null @@ -1,283 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#include -#include - - -ssize_t -ngx_parse_size(ngx_str_t *line) -{ - u_char unit; - size_t len; - ssize_t size, scale, max; - - len = line->len; - - if (len == 0) { - return NGX_ERROR; - } - - unit = line->data[len - 1]; - - switch (unit) { - case 'K': - case 'k': - len--; - max = NGX_MAX_SIZE_T_VALUE / 1024; - scale = 1024; - break; - - case 'M': - case 'm': - len--; - max = NGX_MAX_SIZE_T_VALUE / (1024 * 1024); - scale = 1024 * 1024; - break; - - default: - max = NGX_MAX_SIZE_T_VALUE; - scale = 1; - } - - size = ngx_atosz(line->data, len); - if (size == NGX_ERROR || size > max) { - return NGX_ERROR; - } - - size *= scale; - - return size; -} - - -off_t -ngx_parse_offset(ngx_str_t *line) -{ - u_char unit; - off_t offset, scale, max; - size_t len; - - len = line->len; - - if (len == 0) { - return NGX_ERROR; - } - - unit = line->data[len - 1]; - - switch (unit) { - case 'K': - case 'k': - len--; - max = NGX_MAX_OFF_T_VALUE / 1024; - scale = 1024; - break; - - case 'M': - case 'm': - len--; - max = NGX_MAX_OFF_T_VALUE / (1024 * 1024); - scale = 1024 * 1024; - break; - - case 'G': - case 'g': - len--; - max = NGX_MAX_OFF_T_VALUE / (1024 * 1024 * 1024); - scale = 1024 * 1024 * 1024; - break; - - default: - max = NGX_MAX_OFF_T_VALUE; - scale = 1; - } - - offset = ngx_atoof(line->data, len); - if (offset == NGX_ERROR || offset > max) { - return NGX_ERROR; - } - - offset *= scale; - - return offset; -} - - -ngx_int_t -ngx_parse_time(ngx_str_t *line, ngx_uint_t is_sec) -{ - u_char *p, *last; - ngx_int_t value, total, scale; - ngx_int_t max, cutoff, cutlim; - ngx_uint_t valid; - enum { - st_start = 0, - st_year, - st_month, - st_week, - st_day, - st_hour, - st_min, - st_sec, - st_msec, - st_last - } step; - - valid = 0; - value = 0; - total = 0; - cutoff = NGX_MAX_INT_T_VALUE / 10; - cutlim = NGX_MAX_INT_T_VALUE % 10; - step = is_sec ? st_start : st_month; - - p = line->data; - last = p + line->len; - - while (p < last) { - - if (*p >= '0' && *p <= '9') { - if (value >= cutoff && (value > cutoff || *p - '0' > cutlim)) { - return NGX_ERROR; - } - - value = value * 10 + (*p++ - '0'); - valid = 1; - continue; - } - - switch (*p++) { - - case 'y': - if (step > st_start) { - return NGX_ERROR; - } - step = st_year; - max = NGX_MAX_INT_T_VALUE / (60 * 60 * 24 * 365); - scale = 60 * 60 * 24 * 365; - break; - - case 'M': - if (step >= st_month) { - return NGX_ERROR; - } - step = st_month; - max = NGX_MAX_INT_T_VALUE / (60 * 60 * 24 * 30); - scale = 60 * 60 * 24 * 30; - break; - - case 'w': - if (step >= st_week) { - return NGX_ERROR; - } - step = st_week; - max = NGX_MAX_INT_T_VALUE / (60 * 60 * 24 * 7); - scale = 60 * 60 * 24 * 7; - break; - - case 'd': - if (step >= st_day) { - return NGX_ERROR; - } - step = st_day; - max = NGX_MAX_INT_T_VALUE / (60 * 60 * 24); - scale = 60 * 60 * 24; - break; - - case 'h': - if (step >= st_hour) { - return NGX_ERROR; - } - step = st_hour; - max = NGX_MAX_INT_T_VALUE / (60 * 60); - scale = 60 * 60; - break; - - case 'm': - if (p < last && *p == 's') { - if (is_sec || step >= st_msec) { - return NGX_ERROR; - } - p++; - step = st_msec; - max = NGX_MAX_INT_T_VALUE; - scale = 1; - break; - } - - if (step >= st_min) { - return NGX_ERROR; - } - step = st_min; - max = NGX_MAX_INT_T_VALUE / 60; - scale = 60; - break; - - case 's': - if (step >= st_sec) { - return NGX_ERROR; - } - step = st_sec; - max = NGX_MAX_INT_T_VALUE; - scale = 1; - break; - - case ' ': - if (step >= st_sec) { - return NGX_ERROR; - } - step = st_last; - max = NGX_MAX_INT_T_VALUE; - scale = 1; - break; - - default: - return NGX_ERROR; - } - - if (step != st_msec && !is_sec) { - scale *= 1000; - max /= 1000; - } - - if (value > max) { - return NGX_ERROR; - } - - value *= scale; - - if (total > NGX_MAX_INT_T_VALUE - value) { - return NGX_ERROR; - } - - total += value; - - value = 0; - - while (p < last && *p == ' ') { - p++; - } - } - - if (!valid) { - return NGX_ERROR; - } - - if (!is_sec) { - if (value > NGX_MAX_INT_T_VALUE / 1000) { - return NGX_ERROR; - } - - value *= 1000; - } - - if (total > NGX_MAX_INT_T_VALUE - value) { - return NGX_ERROR; - } - - return total + value; -} diff --git a/src/deps/src/nginx-1.30.3/src/core/ngx_parse.h b/src/deps/src/nginx-1.30.3/src/core/ngx_parse.h deleted file mode 100644 index ec093b5a2b..0000000000 --- a/src/deps/src/nginx-1.30.3/src/core/ngx_parse.h +++ /dev/null @@ -1,21 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#ifndef _NGX_PARSE_H_INCLUDED_ -#define _NGX_PARSE_H_INCLUDED_ - - -#include -#include - - -ssize_t ngx_parse_size(ngx_str_t *line); -off_t ngx_parse_offset(ngx_str_t *line); -ngx_int_t ngx_parse_time(ngx_str_t *line, ngx_uint_t is_sec); - - -#endif /* _NGX_PARSE_H_INCLUDED_ */ diff --git a/src/deps/src/nginx-1.30.3/src/core/ngx_parse_time.c b/src/deps/src/nginx-1.30.3/src/core/ngx_parse_time.c deleted file mode 100644 index 232ac91dd4..0000000000 --- a/src/deps/src/nginx-1.30.3/src/core/ngx_parse_time.c +++ /dev/null @@ -1,277 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#include -#include - - -static ngx_uint_t mday[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; - -time_t -ngx_parse_http_time(u_char *value, size_t len) -{ - u_char *p, *end; - ngx_int_t month; - ngx_uint_t day, year, hour, min, sec; - uint64_t time; - enum { - no = 0, - rfc822, /* Tue, 10 Nov 2002 23:50:13 */ - rfc850, /* Tuesday, 10-Dec-02 23:50:13 */ - isoc /* Tue Dec 10 23:50:13 2002 */ - } fmt; - - fmt = 0; - end = value + len; - -#if (NGX_SUPPRESS_WARN) - day = 32; - year = 2038; -#endif - - for (p = value; p < end; p++) { - if (*p == ',') { - break; - } - - if (*p == ' ') { - fmt = isoc; - break; - } - } - - for (p++; p < end; p++) { - if (*p != ' ') { - break; - } - } - - if (end - p < 18) { - return NGX_ERROR; - } - - if (fmt != isoc) { - if (*p < '0' || *p > '9' || *(p + 1) < '0' || *(p + 1) > '9') { - return NGX_ERROR; - } - - day = (*p - '0') * 10 + (*(p + 1) - '0'); - p += 2; - - if (*p == ' ') { - if (end - p < 18) { - return NGX_ERROR; - } - fmt = rfc822; - - } else if (*p == '-') { - fmt = rfc850; - - } else { - return NGX_ERROR; - } - - p++; - } - - switch (*p) { - - case 'J': - month = *(p + 1) == 'a' ? 0 : *(p + 2) == 'n' ? 5 : 6; - break; - - case 'F': - month = 1; - break; - - case 'M': - month = *(p + 2) == 'r' ? 2 : 4; - break; - - case 'A': - month = *(p + 1) == 'p' ? 3 : 7; - break; - - case 'S': - month = 8; - break; - - case 'O': - month = 9; - break; - - case 'N': - month = 10; - break; - - case 'D': - month = 11; - break; - - default: - return NGX_ERROR; - } - - p += 3; - - if ((fmt == rfc822 && *p != ' ') || (fmt == rfc850 && *p != '-')) { - return NGX_ERROR; - } - - p++; - - if (fmt == rfc822) { - if (*p < '0' || *p > '9' || *(p + 1) < '0' || *(p + 1) > '9' - || *(p + 2) < '0' || *(p + 2) > '9' - || *(p + 3) < '0' || *(p + 3) > '9') - { - return NGX_ERROR; - } - - year = (*p - '0') * 1000 + (*(p + 1) - '0') * 100 - + (*(p + 2) - '0') * 10 + (*(p + 3) - '0'); - p += 4; - - } else if (fmt == rfc850) { - if (*p < '0' || *p > '9' || *(p + 1) < '0' || *(p + 1) > '9') { - return NGX_ERROR; - } - - year = (*p - '0') * 10 + (*(p + 1) - '0'); - year += (year < 70) ? 2000 : 1900; - p += 2; - } - - if (fmt == isoc) { - if (*p == ' ') { - p++; - } - - if (*p < '0' || *p > '9') { - return NGX_ERROR; - } - - day = *p++ - '0'; - - if (*p != ' ') { - if (*p < '0' || *p > '9') { - return NGX_ERROR; - } - - day = day * 10 + (*p++ - '0'); - } - - if (end - p < 14) { - return NGX_ERROR; - } - } - - if (*p++ != ' ') { - return NGX_ERROR; - } - - if (*p < '0' || *p > '9' || *(p + 1) < '0' || *(p + 1) > '9') { - return NGX_ERROR; - } - - hour = (*p - '0') * 10 + (*(p + 1) - '0'); - p += 2; - - if (*p++ != ':') { - return NGX_ERROR; - } - - if (*p < '0' || *p > '9' || *(p + 1) < '0' || *(p + 1) > '9') { - return NGX_ERROR; - } - - min = (*p - '0') * 10 + (*(p + 1) - '0'); - p += 2; - - if (*p++ != ':') { - return NGX_ERROR; - } - - if (*p < '0' || *p > '9' || *(p + 1) < '0' || *(p + 1) > '9') { - return NGX_ERROR; - } - - sec = (*p - '0') * 10 + (*(p + 1) - '0'); - - if (fmt == isoc) { - p += 2; - - if (*p++ != ' ') { - return NGX_ERROR; - } - - if (*p < '0' || *p > '9' || *(p + 1) < '0' || *(p + 1) > '9' - || *(p + 2) < '0' || *(p + 2) > '9' - || *(p + 3) < '0' || *(p + 3) > '9') - { - return NGX_ERROR; - } - - year = (*p - '0') * 1000 + (*(p + 1) - '0') * 100 - + (*(p + 2) - '0') * 10 + (*(p + 3) - '0'); - } - - if (hour > 23 || min > 59 || sec > 59) { - return NGX_ERROR; - } - - if (day == 29 && month == 1) { - if ((year & 3) || ((year % 100 == 0) && (year % 400) != 0)) { - return NGX_ERROR; - } - - } else if (day > mday[month]) { - return NGX_ERROR; - } - - /* - * shift new year to March 1 and start months from 1 (not 0), - * it is needed for Gauss' formula - */ - - if (--month <= 0) { - month += 12; - year -= 1; - } - - /* Gauss' formula for Gregorian days since March 1, 1 BC */ - - time = (uint64_t) ( - /* days in years including leap years since March 1, 1 BC */ - - 365 * year + year / 4 - year / 100 + year / 400 - - /* days before the month */ - - + 367 * month / 12 - 30 - - /* days before the day */ - - + day - 1 - - /* - * 719527 days were between March 1, 1 BC and March 1, 1970, - * 31 and 28 days were in January and February 1970 - */ - - - 719527 + 31 + 28) * 86400 + hour * 3600 + min * 60 + sec; - -#if (NGX_TIME_T_SIZE <= 4) - - if (time > 0x7fffffff) { - return NGX_ERROR; - } - -#endif - - return (time_t) time; -} diff --git a/src/deps/src/nginx-1.30.3/src/core/ngx_parse_time.h b/src/deps/src/nginx-1.30.3/src/core/ngx_parse_time.h deleted file mode 100644 index aa542ebf59..0000000000 --- a/src/deps/src/nginx-1.30.3/src/core/ngx_parse_time.h +++ /dev/null @@ -1,22 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#ifndef _NGX_PARSE_TIME_H_INCLUDED_ -#define _NGX_PARSE_TIME_H_INCLUDED_ - - -#include -#include - - -time_t ngx_parse_http_time(u_char *value, size_t len); - -/* compatibility */ -#define ngx_http_parse_time(value, len) ngx_parse_http_time(value, len) - - -#endif /* _NGX_PARSE_TIME_H_INCLUDED_ */ diff --git a/src/deps/src/nginx-1.30.3/src/core/ngx_proxy_protocol.c b/src/deps/src/nginx-1.30.3/src/core/ngx_proxy_protocol.c deleted file mode 100644 index 49888b9869..0000000000 --- a/src/deps/src/nginx-1.30.3/src/core/ngx_proxy_protocol.c +++ /dev/null @@ -1,614 +0,0 @@ - -/* - * Copyright (C) Roman Arutyunyan - * Copyright (C) Nginx, Inc. - */ - - -#include -#include - - -#define NGX_PROXY_PROTOCOL_AF_INET 1 -#define NGX_PROXY_PROTOCOL_AF_INET6 2 - - -#define ngx_proxy_protocol_parse_uint16(p) \ - ( ((uint16_t) (p)[0] << 8) \ - + ( (p)[1]) ) - -#define ngx_proxy_protocol_parse_uint32(p) \ - ( ((uint32_t) (p)[0] << 24) \ - + ( (p)[1] << 16) \ - + ( (p)[2] << 8) \ - + ( (p)[3]) ) - - -typedef struct { - u_char signature[12]; - u_char version_command; - u_char family_transport; - u_char len[2]; -} ngx_proxy_protocol_header_t; - - -typedef struct { - u_char src_addr[4]; - u_char dst_addr[4]; - u_char src_port[2]; - u_char dst_port[2]; -} ngx_proxy_protocol_inet_addrs_t; - - -typedef struct { - u_char src_addr[16]; - u_char dst_addr[16]; - u_char src_port[2]; - u_char dst_port[2]; -} ngx_proxy_protocol_inet6_addrs_t; - - -typedef struct { - u_char type; - u_char len[2]; -} ngx_proxy_protocol_tlv_t; - - -typedef struct { - u_char client; - u_char verify[4]; -} ngx_proxy_protocol_tlv_ssl_t; - - -typedef struct { - ngx_str_t name; - ngx_uint_t type; -} ngx_proxy_protocol_tlv_entry_t; - - -static u_char *ngx_proxy_protocol_read_addr(ngx_connection_t *c, u_char *p, - u_char *last, ngx_str_t *addr); -static u_char *ngx_proxy_protocol_read_port(u_char *p, u_char *last, - in_port_t *port, u_char sep); -static u_char *ngx_proxy_protocol_v2_read(ngx_connection_t *c, u_char *buf, - u_char *last); -static ngx_int_t ngx_proxy_protocol_lookup_tlv(ngx_connection_t *c, - ngx_str_t *tlvs, ngx_uint_t type, ngx_str_t *value); - - -static ngx_proxy_protocol_tlv_entry_t ngx_proxy_protocol_tlv_entries[] = { - { ngx_string("alpn"), 0x01 }, - { ngx_string("authority"), 0x02 }, - { ngx_string("unique_id"), 0x05 }, - { ngx_string("ssl"), 0x20 }, - { ngx_string("netns"), 0x30 }, - { ngx_null_string, 0x00 } -}; - - -static ngx_proxy_protocol_tlv_entry_t ngx_proxy_protocol_tlv_ssl_entries[] = { - { ngx_string("version"), 0x21 }, - { ngx_string("cn"), 0x22 }, - { ngx_string("cipher"), 0x23 }, - { ngx_string("sig_alg"), 0x24 }, - { ngx_string("key_alg"), 0x25 }, - { ngx_null_string, 0x00 } -}; - - -u_char * -ngx_proxy_protocol_read(ngx_connection_t *c, u_char *buf, u_char *last) -{ - size_t len; - u_char *p; - ngx_proxy_protocol_t *pp; - - static const u_char signature[] = "\r\n\r\n\0\r\nQUIT\n"; - - p = buf; - len = last - buf; - - if (len >= sizeof(ngx_proxy_protocol_header_t) - && ngx_memcmp(p, signature, sizeof(signature) - 1) == 0) - { - return ngx_proxy_protocol_v2_read(c, buf, last); - } - - if (len < 8 || ngx_strncmp(p, "PROXY ", 6) != 0) { - goto invalid; - } - - p += 6; - len -= 6; - - if (len >= 7 && ngx_strncmp(p, "UNKNOWN", 7) == 0) { - ngx_log_debug0(NGX_LOG_DEBUG_CORE, c->log, 0, - "PROXY protocol unknown protocol"); - p += 7; - goto skip; - } - - if (len < 5 || ngx_strncmp(p, "TCP", 3) != 0 - || (p[3] != '4' && p[3] != '6') || p[4] != ' ') - { - goto invalid; - } - - p += 5; - - pp = ngx_pcalloc(c->pool, sizeof(ngx_proxy_protocol_t)); - if (pp == NULL) { - return NULL; - } - - p = ngx_proxy_protocol_read_addr(c, p, last, &pp->src_addr); - if (p == NULL) { - goto invalid; - } - - p = ngx_proxy_protocol_read_addr(c, p, last, &pp->dst_addr); - if (p == NULL) { - goto invalid; - } - - p = ngx_proxy_protocol_read_port(p, last, &pp->src_port, ' '); - if (p == NULL) { - goto invalid; - } - - p = ngx_proxy_protocol_read_port(p, last, &pp->dst_port, CR); - if (p == NULL) { - goto invalid; - } - - if (p == last) { - goto invalid; - } - - if (*p++ != LF) { - goto invalid; - } - - ngx_log_debug4(NGX_LOG_DEBUG_CORE, c->log, 0, - "PROXY protocol src: %V %d, dst: %V %d", - &pp->src_addr, pp->src_port, &pp->dst_addr, pp->dst_port); - - c->proxy_protocol = pp; - - return p; - -skip: - - for ( /* void */ ; p < last - 1; p++) { - if (p[0] == CR && p[1] == LF) { - return p + 2; - } - } - -invalid: - - for (p = buf; p < last; p++) { - if (*p == CR || *p == LF) { - break; - } - } - - ngx_log_error(NGX_LOG_ERR, c->log, 0, - "broken header: \"%*s\"", (size_t) (p - buf), buf); - - return NULL; -} - - -static u_char * -ngx_proxy_protocol_read_addr(ngx_connection_t *c, u_char *p, u_char *last, - ngx_str_t *addr) -{ - size_t len; - u_char ch, *pos; - - pos = p; - - for ( ;; ) { - if (p == last) { - return NULL; - } - - ch = *p++; - - if (ch == ' ') { - break; - } - - if (ch != ':' && ch != '.' - && (ch < 'a' || ch > 'f') - && (ch < 'A' || ch > 'F') - && (ch < '0' || ch > '9')) - { - return NULL; - } - } - - len = p - pos - 1; - - addr->data = ngx_pnalloc(c->pool, len); - if (addr->data == NULL) { - return NULL; - } - - ngx_memcpy(addr->data, pos, len); - addr->len = len; - - return p; -} - - -static u_char * -ngx_proxy_protocol_read_port(u_char *p, u_char *last, in_port_t *port, - u_char sep) -{ - size_t len; - u_char *pos; - ngx_int_t n; - - pos = p; - - for ( ;; ) { - if (p == last) { - return NULL; - } - - if (*p++ == sep) { - break; - } - } - - len = p - pos - 1; - - n = ngx_atoi(pos, len); - if (n < 0 || n > 65535) { - return NULL; - } - - *port = (in_port_t) n; - - return p; -} - - -u_char * -ngx_proxy_protocol_write(ngx_connection_t *c, u_char *buf, u_char *last) -{ - ngx_uint_t port, lport; - - if (last - buf < NGX_PROXY_PROTOCOL_V1_MAX_HEADER) { - ngx_log_error(NGX_LOG_ALERT, c->log, 0, - "too small buffer for PROXY protocol"); - return NULL; - } - - if (ngx_connection_local_sockaddr(c, NULL, 0) != NGX_OK) { - return NULL; - } - - switch (c->sockaddr->sa_family) { - - case AF_INET: - buf = ngx_cpymem(buf, "PROXY TCP4 ", sizeof("PROXY TCP4 ") - 1); - break; - -#if (NGX_HAVE_INET6) - case AF_INET6: - buf = ngx_cpymem(buf, "PROXY TCP6 ", sizeof("PROXY TCP6 ") - 1); - break; -#endif - - default: - return ngx_cpymem(buf, "PROXY UNKNOWN" CRLF, - sizeof("PROXY UNKNOWN" CRLF) - 1); - } - - buf += ngx_sock_ntop(c->sockaddr, c->socklen, buf, last - buf, 0); - - *buf++ = ' '; - - buf += ngx_sock_ntop(c->local_sockaddr, c->local_socklen, buf, last - buf, - 0); - - port = ngx_inet_get_port(c->sockaddr); - lport = ngx_inet_get_port(c->local_sockaddr); - - return ngx_slprintf(buf, last, " %ui %ui" CRLF, port, lport); -} - - -static u_char * -ngx_proxy_protocol_v2_read(ngx_connection_t *c, u_char *buf, u_char *last) -{ - u_char *end; - size_t len; - socklen_t socklen; - ngx_uint_t version, command, family, transport; - ngx_sockaddr_t src_sockaddr, dst_sockaddr; - ngx_proxy_protocol_t *pp; - ngx_proxy_protocol_header_t *header; - ngx_proxy_protocol_inet_addrs_t *in; -#if (NGX_HAVE_INET6) - ngx_proxy_protocol_inet6_addrs_t *in6; -#endif - - header = (ngx_proxy_protocol_header_t *) buf; - - buf += sizeof(ngx_proxy_protocol_header_t); - - version = header->version_command >> 4; - - if (version != 2) { - ngx_log_error(NGX_LOG_ERR, c->log, 0, - "unknown PROXY protocol version: %ui", version); - return NULL; - } - - len = ngx_proxy_protocol_parse_uint16(header->len); - - if ((size_t) (last - buf) < len) { - ngx_log_error(NGX_LOG_ERR, c->log, 0, "header is too large"); - return NULL; - } - - end = buf + len; - - command = header->version_command & 0x0f; - - /* only PROXY is supported */ - if (command != 1) { - ngx_log_debug1(NGX_LOG_DEBUG_CORE, c->log, 0, - "PROXY protocol v2 unsupported command %ui", command); - return end; - } - - transport = header->family_transport & 0x0f; - - /* only STREAM is supported */ - if (transport != 1) { - ngx_log_debug1(NGX_LOG_DEBUG_CORE, c->log, 0, - "PROXY protocol v2 unsupported transport %ui", - transport); - return end; - } - - pp = ngx_pcalloc(c->pool, sizeof(ngx_proxy_protocol_t)); - if (pp == NULL) { - return NULL; - } - - family = header->family_transport >> 4; - - switch (family) { - - case NGX_PROXY_PROTOCOL_AF_INET: - - if ((size_t) (end - buf) < sizeof(ngx_proxy_protocol_inet_addrs_t)) { - return NULL; - } - - in = (ngx_proxy_protocol_inet_addrs_t *) buf; - - src_sockaddr.sockaddr_in.sin_family = AF_INET; - src_sockaddr.sockaddr_in.sin_port = 0; - ngx_memcpy(&src_sockaddr.sockaddr_in.sin_addr, in->src_addr, 4); - - dst_sockaddr.sockaddr_in.sin_family = AF_INET; - dst_sockaddr.sockaddr_in.sin_port = 0; - ngx_memcpy(&dst_sockaddr.sockaddr_in.sin_addr, in->dst_addr, 4); - - pp->src_port = ngx_proxy_protocol_parse_uint16(in->src_port); - pp->dst_port = ngx_proxy_protocol_parse_uint16(in->dst_port); - - socklen = sizeof(struct sockaddr_in); - - buf += sizeof(ngx_proxy_protocol_inet_addrs_t); - - break; - -#if (NGX_HAVE_INET6) - - case NGX_PROXY_PROTOCOL_AF_INET6: - - if ((size_t) (end - buf) < sizeof(ngx_proxy_protocol_inet6_addrs_t)) { - return NULL; - } - - in6 = (ngx_proxy_protocol_inet6_addrs_t *) buf; - - src_sockaddr.sockaddr_in6.sin6_family = AF_INET6; - src_sockaddr.sockaddr_in6.sin6_port = 0; - ngx_memcpy(&src_sockaddr.sockaddr_in6.sin6_addr, in6->src_addr, 16); - - dst_sockaddr.sockaddr_in6.sin6_family = AF_INET6; - dst_sockaddr.sockaddr_in6.sin6_port = 0; - ngx_memcpy(&dst_sockaddr.sockaddr_in6.sin6_addr, in6->dst_addr, 16); - - pp->src_port = ngx_proxy_protocol_parse_uint16(in6->src_port); - pp->dst_port = ngx_proxy_protocol_parse_uint16(in6->dst_port); - - socklen = sizeof(struct sockaddr_in6); - - buf += sizeof(ngx_proxy_protocol_inet6_addrs_t); - - break; - -#endif - - default: - ngx_log_debug1(NGX_LOG_DEBUG_CORE, c->log, 0, - "PROXY protocol v2 unsupported address family %ui", - family); - return end; - } - - pp->src_addr.data = ngx_pnalloc(c->pool, NGX_SOCKADDR_STRLEN); - if (pp->src_addr.data == NULL) { - return NULL; - } - - pp->src_addr.len = ngx_sock_ntop(&src_sockaddr.sockaddr, socklen, - pp->src_addr.data, NGX_SOCKADDR_STRLEN, 0); - - pp->dst_addr.data = ngx_pnalloc(c->pool, NGX_SOCKADDR_STRLEN); - if (pp->dst_addr.data == NULL) { - return NULL; - } - - pp->dst_addr.len = ngx_sock_ntop(&dst_sockaddr.sockaddr, socklen, - pp->dst_addr.data, NGX_SOCKADDR_STRLEN, 0); - - ngx_log_debug4(NGX_LOG_DEBUG_CORE, c->log, 0, - "PROXY protocol v2 src: %V %d, dst: %V %d", - &pp->src_addr, pp->src_port, &pp->dst_addr, pp->dst_port); - - if (buf < end) { - pp->tlvs.data = ngx_pnalloc(c->pool, end - buf); - if (pp->tlvs.data == NULL) { - return NULL; - } - - ngx_memcpy(pp->tlvs.data, buf, end - buf); - pp->tlvs.len = end - buf; - } - - c->proxy_protocol = pp; - - return end; -} - - -ngx_int_t -ngx_proxy_protocol_get_tlv(ngx_connection_t *c, ngx_str_t *name, - ngx_str_t *value) -{ - u_char *p; - size_t n; - uint32_t verify; - ngx_str_t ssl, *tlvs; - ngx_int_t rc, type; - ngx_proxy_protocol_tlv_ssl_t *tlv_ssl; - ngx_proxy_protocol_tlv_entry_t *te; - - if (c->proxy_protocol == NULL) { - return NGX_DECLINED; - } - - ngx_log_debug1(NGX_LOG_DEBUG_CORE, c->log, 0, - "PROXY protocol v2 get tlv \"%V\"", name); - - te = ngx_proxy_protocol_tlv_entries; - tlvs = &c->proxy_protocol->tlvs; - - p = name->data; - n = name->len; - - if (n >= 4 && p[0] == 's' && p[1] == 's' && p[2] == 'l' && p[3] == '_') { - - rc = ngx_proxy_protocol_lookup_tlv(c, tlvs, 0x20, &ssl); - if (rc != NGX_OK) { - return rc; - } - - if (ssl.len < sizeof(ngx_proxy_protocol_tlv_ssl_t)) { - return NGX_ERROR; - } - - p += 4; - n -= 4; - - if (n == 6 && ngx_strncmp(p, "verify", 6) == 0) { - - tlv_ssl = (ngx_proxy_protocol_tlv_ssl_t *) ssl.data; - verify = ngx_proxy_protocol_parse_uint32(tlv_ssl->verify); - - value->data = ngx_pnalloc(c->pool, NGX_INT32_LEN); - if (value->data == NULL) { - return NGX_ERROR; - } - - value->len = ngx_sprintf(value->data, "%uD", verify) - - value->data; - return NGX_OK; - } - - ssl.data += sizeof(ngx_proxy_protocol_tlv_ssl_t); - ssl.len -= sizeof(ngx_proxy_protocol_tlv_ssl_t); - - te = ngx_proxy_protocol_tlv_ssl_entries; - tlvs = &ssl; - } - - if (n >= 2 && p[0] == '0' && p[1] == 'x') { - - type = ngx_hextoi(p + 2, n - 2); - if (type == NGX_ERROR) { - ngx_log_error(NGX_LOG_ERR, c->log, 0, - "invalid PROXY protocol TLV \"%V\"", name); - return NGX_ERROR; - } - - return ngx_proxy_protocol_lookup_tlv(c, tlvs, type, value); - } - - for ( /* void */ ; te->type; te++) { - if (te->name.len == n && ngx_strncmp(te->name.data, p, n) == 0) { - return ngx_proxy_protocol_lookup_tlv(c, tlvs, te->type, value); - } - } - - ngx_log_error(NGX_LOG_ERR, c->log, 0, - "unknown PROXY protocol TLV \"%V\"", name); - - return NGX_DECLINED; -} - - -static ngx_int_t -ngx_proxy_protocol_lookup_tlv(ngx_connection_t *c, ngx_str_t *tlvs, - ngx_uint_t type, ngx_str_t *value) -{ - u_char *p; - size_t n, len; - ngx_proxy_protocol_tlv_t *tlv; - - ngx_log_debug1(NGX_LOG_DEBUG_CORE, c->log, 0, - "PROXY protocol v2 lookup tlv:%02xi", type); - - p = tlvs->data; - n = tlvs->len; - - while (n) { - if (n < sizeof(ngx_proxy_protocol_tlv_t)) { - ngx_log_error(NGX_LOG_ERR, c->log, 0, "broken PROXY protocol TLV"); - return NGX_ERROR; - } - - tlv = (ngx_proxy_protocol_tlv_t *) p; - len = ngx_proxy_protocol_parse_uint16(tlv->len); - - p += sizeof(ngx_proxy_protocol_tlv_t); - n -= sizeof(ngx_proxy_protocol_tlv_t); - - if (n < len) { - ngx_log_error(NGX_LOG_ERR, c->log, 0, "broken PROXY protocol TLV"); - return NGX_ERROR; - } - - if (tlv->type == type) { - value->data = p; - value->len = len; - return NGX_OK; - } - - p += len; - n -= len; - } - - return NGX_DECLINED; -} diff --git a/src/deps/src/nginx-1.30.3/src/core/ngx_proxy_protocol.h b/src/deps/src/nginx-1.30.3/src/core/ngx_proxy_protocol.h deleted file mode 100644 index d1749f57bc..0000000000 --- a/src/deps/src/nginx-1.30.3/src/core/ngx_proxy_protocol.h +++ /dev/null @@ -1,37 +0,0 @@ - -/* - * Copyright (C) Roman Arutyunyan - * Copyright (C) Nginx, Inc. - */ - - -#ifndef _NGX_PROXY_PROTOCOL_H_INCLUDED_ -#define _NGX_PROXY_PROTOCOL_H_INCLUDED_ - - -#include -#include - - -#define NGX_PROXY_PROTOCOL_V1_MAX_HEADER 107 -#define NGX_PROXY_PROTOCOL_MAX_HEADER 4096 - - -struct ngx_proxy_protocol_s { - ngx_str_t src_addr; - ngx_str_t dst_addr; - in_port_t src_port; - in_port_t dst_port; - ngx_str_t tlvs; -}; - - -u_char *ngx_proxy_protocol_read(ngx_connection_t *c, u_char *buf, - u_char *last); -u_char *ngx_proxy_protocol_write(ngx_connection_t *c, u_char *buf, - u_char *last); -ngx_int_t ngx_proxy_protocol_get_tlv(ngx_connection_t *c, ngx_str_t *name, - ngx_str_t *value); - - -#endif /* _NGX_PROXY_PROTOCOL_H_INCLUDED_ */ diff --git a/src/deps/src/nginx-1.30.3/src/core/ngx_queue.c b/src/deps/src/nginx-1.30.3/src/core/ngx_queue.c deleted file mode 100644 index 3d1d589884..0000000000 --- a/src/deps/src/nginx-1.30.3/src/core/ngx_queue.c +++ /dev/null @@ -1,106 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#include -#include - - -static void ngx_queue_merge(ngx_queue_t *queue, ngx_queue_t *tail, - ngx_int_t (*cmp)(const ngx_queue_t *, const ngx_queue_t *)); - - -/* - * find the middle queue element if the queue has odd number of elements - * or the first element of the queue's second part otherwise - */ - -ngx_queue_t * -ngx_queue_middle(ngx_queue_t *queue) -{ - ngx_queue_t *middle, *next; - - middle = ngx_queue_head(queue); - - if (middle == ngx_queue_last(queue)) { - return middle; - } - - next = ngx_queue_head(queue); - - for ( ;; ) { - middle = ngx_queue_next(middle); - - next = ngx_queue_next(next); - - if (next == ngx_queue_last(queue)) { - return middle; - } - - next = ngx_queue_next(next); - - if (next == ngx_queue_last(queue)) { - return middle; - } - } -} - - -/* the stable merge sort */ - -void -ngx_queue_sort(ngx_queue_t *queue, - ngx_int_t (*cmp)(const ngx_queue_t *, const ngx_queue_t *)) -{ - ngx_queue_t *q, tail; - - q = ngx_queue_head(queue); - - if (q == ngx_queue_last(queue)) { - return; - } - - q = ngx_queue_middle(queue); - - ngx_queue_split(queue, q, &tail); - - ngx_queue_sort(queue, cmp); - ngx_queue_sort(&tail, cmp); - - ngx_queue_merge(queue, &tail, cmp); -} - - -static void -ngx_queue_merge(ngx_queue_t *queue, ngx_queue_t *tail, - ngx_int_t (*cmp)(const ngx_queue_t *, const ngx_queue_t *)) -{ - ngx_queue_t *q1, *q2; - - q1 = ngx_queue_head(queue); - q2 = ngx_queue_head(tail); - - for ( ;; ) { - if (q1 == ngx_queue_sentinel(queue)) { - ngx_queue_add(queue, tail); - break; - } - - if (q2 == ngx_queue_sentinel(tail)) { - break; - } - - if (cmp(q1, q2) <= 0) { - q1 = ngx_queue_next(q1); - continue; - } - - ngx_queue_remove(q2); - ngx_queue_insert_before(q1, q2); - - q2 = ngx_queue_head(tail); - } -} diff --git a/src/deps/src/nginx-1.30.3/src/core/ngx_queue.h b/src/deps/src/nginx-1.30.3/src/core/ngx_queue.h deleted file mode 100644 index 0f82f173e4..0000000000 --- a/src/deps/src/nginx-1.30.3/src/core/ngx_queue.h +++ /dev/null @@ -1,115 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#include -#include - - -#ifndef _NGX_QUEUE_H_INCLUDED_ -#define _NGX_QUEUE_H_INCLUDED_ - - -typedef struct ngx_queue_s ngx_queue_t; - -struct ngx_queue_s { - ngx_queue_t *prev; - ngx_queue_t *next; -}; - - -#define ngx_queue_init(q) \ - (q)->prev = q; \ - (q)->next = q - - -#define ngx_queue_empty(h) \ - (h == (h)->prev) - - -#define ngx_queue_insert_head(h, x) \ - (x)->next = (h)->next; \ - (x)->next->prev = x; \ - (x)->prev = h; \ - (h)->next = x - - -#define ngx_queue_insert_after ngx_queue_insert_head - - -#define ngx_queue_insert_tail(h, x) \ - (x)->prev = (h)->prev; \ - (x)->prev->next = x; \ - (x)->next = h; \ - (h)->prev = x - - -#define ngx_queue_insert_before ngx_queue_insert_tail - - -#define ngx_queue_head(h) \ - (h)->next - - -#define ngx_queue_last(h) \ - (h)->prev - - -#define ngx_queue_sentinel(h) \ - (h) - - -#define ngx_queue_next(q) \ - (q)->next - - -#define ngx_queue_prev(q) \ - (q)->prev - - -#if (NGX_DEBUG) - -#define ngx_queue_remove(x) \ - (x)->next->prev = (x)->prev; \ - (x)->prev->next = (x)->next; \ - (x)->prev = NULL; \ - (x)->next = NULL - -#else - -#define ngx_queue_remove(x) \ - (x)->next->prev = (x)->prev; \ - (x)->prev->next = (x)->next - -#endif - - -#define ngx_queue_split(h, q, n) \ - (n)->prev = (h)->prev; \ - (n)->prev->next = n; \ - (n)->next = q; \ - (h)->prev = (q)->prev; \ - (h)->prev->next = h; \ - (q)->prev = n; - - -#define ngx_queue_add(h, n) \ - (h)->prev->next = (n)->next; \ - (n)->next->prev = (h)->prev; \ - (h)->prev = (n)->prev; \ - (h)->prev->next = h; - - -#define ngx_queue_data(q, type, link) \ - (type *) ((u_char *) q - offsetof(type, link)) - - -ngx_queue_t *ngx_queue_middle(ngx_queue_t *queue); -void ngx_queue_sort(ngx_queue_t *queue, - ngx_int_t (*cmp)(const ngx_queue_t *, const ngx_queue_t *)); - - -#endif /* _NGX_QUEUE_H_INCLUDED_ */ diff --git a/src/deps/src/nginx-1.30.3/src/core/ngx_radix_tree.c b/src/deps/src/nginx-1.30.3/src/core/ngx_radix_tree.c deleted file mode 100644 index c1d873749b..0000000000 --- a/src/deps/src/nginx-1.30.3/src/core/ngx_radix_tree.c +++ /dev/null @@ -1,488 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#include -#include - - -static ngx_radix_node_t *ngx_radix_alloc(ngx_radix_tree_t *tree); - - -ngx_radix_tree_t * -ngx_radix_tree_create(ngx_pool_t *pool, ngx_int_t preallocate) -{ - uint32_t key, mask, inc; - ngx_radix_tree_t *tree; - - tree = ngx_palloc(pool, sizeof(ngx_radix_tree_t)); - if (tree == NULL) { - return NULL; - } - - tree->pool = pool; - tree->free = NULL; - tree->start = NULL; - tree->size = 0; - - tree->root = ngx_radix_alloc(tree); - if (tree->root == NULL) { - return NULL; - } - - tree->root->right = NULL; - tree->root->left = NULL; - tree->root->parent = NULL; - tree->root->value = NGX_RADIX_NO_VALUE; - - if (preallocate == 0) { - return tree; - } - - /* - * Preallocation of first nodes : 0, 1, 00, 01, 10, 11, 000, 001, etc. - * increases TLB hits even if for first lookup iterations. - * On 32-bit platforms the 7 preallocated bits takes continuous 4K, - * 8 - 8K, 9 - 16K, etc. On 64-bit platforms the 6 preallocated bits - * takes continuous 4K, 7 - 8K, 8 - 16K, etc. There is no sense to - * to preallocate more than one page, because further preallocation - * distributes the only bit per page. Instead, a random insertion - * may distribute several bits per page. - * - * Thus, by default we preallocate maximum - * 6 bits on amd64 (64-bit platform and 4K pages) - * 7 bits on i386 (32-bit platform and 4K pages) - * 7 bits on sparc64 in 64-bit mode (8K pages) - * 8 bits on sparc64 in 32-bit mode (8K pages) - */ - - if (preallocate == -1) { - switch (ngx_pagesize / sizeof(ngx_radix_node_t)) { - - /* amd64 */ - case 128: - preallocate = 6; - break; - - /* i386, sparc64 */ - case 256: - preallocate = 7; - break; - - /* sparc64 in 32-bit mode */ - default: - preallocate = 8; - } - } - - mask = 0; - inc = 0x80000000; - - while (preallocate--) { - - key = 0; - mask >>= 1; - mask |= 0x80000000; - - do { - if (ngx_radix32tree_insert(tree, key, mask, NGX_RADIX_NO_VALUE) - != NGX_OK) - { - return NULL; - } - - key += inc; - - } while (key); - - inc >>= 1; - } - - return tree; -} - - -ngx_int_t -ngx_radix32tree_insert(ngx_radix_tree_t *tree, uint32_t key, uint32_t mask, - uintptr_t value) -{ - uint32_t bit; - ngx_radix_node_t *node, *next; - - bit = 0x80000000; - - node = tree->root; - next = tree->root; - - while (bit & mask) { - if (key & bit) { - next = node->right; - - } else { - next = node->left; - } - - if (next == NULL) { - break; - } - - bit >>= 1; - node = next; - } - - if (next) { - if (node->value != NGX_RADIX_NO_VALUE) { - return NGX_BUSY; - } - - node->value = value; - return NGX_OK; - } - - while (bit & mask) { - next = ngx_radix_alloc(tree); - if (next == NULL) { - return NGX_ERROR; - } - - next->right = NULL; - next->left = NULL; - next->parent = node; - next->value = NGX_RADIX_NO_VALUE; - - if (key & bit) { - node->right = next; - - } else { - node->left = next; - } - - bit >>= 1; - node = next; - } - - node->value = value; - - return NGX_OK; -} - - -ngx_int_t -ngx_radix32tree_delete(ngx_radix_tree_t *tree, uint32_t key, uint32_t mask) -{ - uint32_t bit; - ngx_radix_node_t *node; - - bit = 0x80000000; - node = tree->root; - - while (node && (bit & mask)) { - if (key & bit) { - node = node->right; - - } else { - node = node->left; - } - - bit >>= 1; - } - - if (node == NULL) { - return NGX_ERROR; - } - - if (node->right || node->left) { - if (node->value != NGX_RADIX_NO_VALUE) { - node->value = NGX_RADIX_NO_VALUE; - return NGX_OK; - } - - return NGX_ERROR; - } - - for ( ;; ) { - if (node->parent->right == node) { - node->parent->right = NULL; - - } else { - node->parent->left = NULL; - } - - node->right = tree->free; - tree->free = node; - - node = node->parent; - - if (node->right || node->left) { - break; - } - - if (node->value != NGX_RADIX_NO_VALUE) { - break; - } - - if (node->parent == NULL) { - break; - } - } - - return NGX_OK; -} - - -uintptr_t -ngx_radix32tree_find(ngx_radix_tree_t *tree, uint32_t key) -{ - uint32_t bit; - uintptr_t value; - ngx_radix_node_t *node; - - bit = 0x80000000; - value = NGX_RADIX_NO_VALUE; - node = tree->root; - - while (node) { - if (node->value != NGX_RADIX_NO_VALUE) { - value = node->value; - } - - if (key & bit) { - node = node->right; - - } else { - node = node->left; - } - - bit >>= 1; - } - - return value; -} - - -#if (NGX_HAVE_INET6) - -ngx_int_t -ngx_radix128tree_insert(ngx_radix_tree_t *tree, u_char *key, u_char *mask, - uintptr_t value) -{ - u_char bit; - ngx_uint_t i; - ngx_radix_node_t *node, *next; - - i = 0; - bit = 0x80; - - node = tree->root; - next = tree->root; - - while (bit & mask[i]) { - if (key[i] & bit) { - next = node->right; - - } else { - next = node->left; - } - - if (next == NULL) { - break; - } - - bit >>= 1; - node = next; - - if (bit == 0) { - if (++i == 16) { - break; - } - - bit = 0x80; - } - } - - if (next) { - if (node->value != NGX_RADIX_NO_VALUE) { - return NGX_BUSY; - } - - node->value = value; - return NGX_OK; - } - - while (bit & mask[i]) { - next = ngx_radix_alloc(tree); - if (next == NULL) { - return NGX_ERROR; - } - - next->right = NULL; - next->left = NULL; - next->parent = node; - next->value = NGX_RADIX_NO_VALUE; - - if (key[i] & bit) { - node->right = next; - - } else { - node->left = next; - } - - bit >>= 1; - node = next; - - if (bit == 0) { - if (++i == 16) { - break; - } - - bit = 0x80; - } - } - - node->value = value; - - return NGX_OK; -} - - -ngx_int_t -ngx_radix128tree_delete(ngx_radix_tree_t *tree, u_char *key, u_char *mask) -{ - u_char bit; - ngx_uint_t i; - ngx_radix_node_t *node; - - i = 0; - bit = 0x80; - node = tree->root; - - while (node && (bit & mask[i])) { - if (key[i] & bit) { - node = node->right; - - } else { - node = node->left; - } - - bit >>= 1; - - if (bit == 0) { - if (++i == 16) { - break; - } - - bit = 0x80; - } - } - - if (node == NULL) { - return NGX_ERROR; - } - - if (node->right || node->left) { - if (node->value != NGX_RADIX_NO_VALUE) { - node->value = NGX_RADIX_NO_VALUE; - return NGX_OK; - } - - return NGX_ERROR; - } - - for ( ;; ) { - if (node->parent->right == node) { - node->parent->right = NULL; - - } else { - node->parent->left = NULL; - } - - node->right = tree->free; - tree->free = node; - - node = node->parent; - - if (node->right || node->left) { - break; - } - - if (node->value != NGX_RADIX_NO_VALUE) { - break; - } - - if (node->parent == NULL) { - break; - } - } - - return NGX_OK; -} - - -uintptr_t -ngx_radix128tree_find(ngx_radix_tree_t *tree, u_char *key) -{ - u_char bit; - uintptr_t value; - ngx_uint_t i; - ngx_radix_node_t *node; - - i = 0; - bit = 0x80; - value = NGX_RADIX_NO_VALUE; - node = tree->root; - - while (node) { - if (node->value != NGX_RADIX_NO_VALUE) { - value = node->value; - } - - if (key[i] & bit) { - node = node->right; - - } else { - node = node->left; - } - - bit >>= 1; - - if (bit == 0) { - i++; - bit = 0x80; - } - } - - return value; -} - -#endif - - -static ngx_radix_node_t * -ngx_radix_alloc(ngx_radix_tree_t *tree) -{ - ngx_radix_node_t *p; - - if (tree->free) { - p = tree->free; - tree->free = tree->free->right; - return p; - } - - if (tree->size < sizeof(ngx_radix_node_t)) { - tree->start = ngx_pmemalign(tree->pool, ngx_pagesize, ngx_pagesize); - if (tree->start == NULL) { - return NULL; - } - - tree->size = ngx_pagesize; - } - - p = (ngx_radix_node_t *) tree->start; - tree->start += sizeof(ngx_radix_node_t); - tree->size -= sizeof(ngx_radix_node_t); - - return p; -} diff --git a/src/deps/src/nginx-1.30.3/src/core/ngx_radix_tree.h b/src/deps/src/nginx-1.30.3/src/core/ngx_radix_tree.h deleted file mode 100644 index 4fe06e0147..0000000000 --- a/src/deps/src/nginx-1.30.3/src/core/ngx_radix_tree.h +++ /dev/null @@ -1,55 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#ifndef _NGX_RADIX_TREE_H_INCLUDED_ -#define _NGX_RADIX_TREE_H_INCLUDED_ - - -#include -#include - - -#define NGX_RADIX_NO_VALUE (uintptr_t) -1 - -typedef struct ngx_radix_node_s ngx_radix_node_t; - -struct ngx_radix_node_s { - ngx_radix_node_t *right; - ngx_radix_node_t *left; - ngx_radix_node_t *parent; - uintptr_t value; -}; - - -typedef struct { - ngx_radix_node_t *root; - ngx_pool_t *pool; - ngx_radix_node_t *free; - char *start; - size_t size; -} ngx_radix_tree_t; - - -ngx_radix_tree_t *ngx_radix_tree_create(ngx_pool_t *pool, - ngx_int_t preallocate); - -ngx_int_t ngx_radix32tree_insert(ngx_radix_tree_t *tree, - uint32_t key, uint32_t mask, uintptr_t value); -ngx_int_t ngx_radix32tree_delete(ngx_radix_tree_t *tree, - uint32_t key, uint32_t mask); -uintptr_t ngx_radix32tree_find(ngx_radix_tree_t *tree, uint32_t key); - -#if (NGX_HAVE_INET6) -ngx_int_t ngx_radix128tree_insert(ngx_radix_tree_t *tree, - u_char *key, u_char *mask, uintptr_t value); -ngx_int_t ngx_radix128tree_delete(ngx_radix_tree_t *tree, - u_char *key, u_char *mask); -uintptr_t ngx_radix128tree_find(ngx_radix_tree_t *tree, u_char *key); -#endif - - -#endif /* _NGX_RADIX_TREE_H_INCLUDED_ */ diff --git a/src/deps/src/nginx-1.30.3/src/core/ngx_rbtree.c b/src/deps/src/nginx-1.30.3/src/core/ngx_rbtree.c deleted file mode 100644 index 377b82fcc7..0000000000 --- a/src/deps/src/nginx-1.30.3/src/core/ngx_rbtree.c +++ /dev/null @@ -1,404 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#include -#include - - -/* - * The red-black tree code is based on the algorithm described in - * the "Introduction to Algorithms" by Cormen, Leiserson and Rivest. - */ - - -static ngx_inline void ngx_rbtree_left_rotate(ngx_rbtree_node_t **root, - ngx_rbtree_node_t *sentinel, ngx_rbtree_node_t *node); -static ngx_inline void ngx_rbtree_right_rotate(ngx_rbtree_node_t **root, - ngx_rbtree_node_t *sentinel, ngx_rbtree_node_t *node); - - -void -ngx_rbtree_insert(ngx_rbtree_t *tree, ngx_rbtree_node_t *node) -{ - ngx_rbtree_node_t **root, *temp, *sentinel; - - /* a binary tree insert */ - - root = &tree->root; - sentinel = tree->sentinel; - - if (*root == sentinel) { - node->parent = NULL; - node->left = sentinel; - node->right = sentinel; - ngx_rbt_black(node); - *root = node; - - return; - } - - tree->insert(*root, node, sentinel); - - /* re-balance tree */ - - while (node != *root && ngx_rbt_is_red(node->parent)) { - - if (node->parent == node->parent->parent->left) { - temp = node->parent->parent->right; - - if (ngx_rbt_is_red(temp)) { - ngx_rbt_black(node->parent); - ngx_rbt_black(temp); - ngx_rbt_red(node->parent->parent); - node = node->parent->parent; - - } else { - if (node == node->parent->right) { - node = node->parent; - ngx_rbtree_left_rotate(root, sentinel, node); - } - - ngx_rbt_black(node->parent); - ngx_rbt_red(node->parent->parent); - ngx_rbtree_right_rotate(root, sentinel, node->parent->parent); - } - - } else { - temp = node->parent->parent->left; - - if (ngx_rbt_is_red(temp)) { - ngx_rbt_black(node->parent); - ngx_rbt_black(temp); - ngx_rbt_red(node->parent->parent); - node = node->parent->parent; - - } else { - if (node == node->parent->left) { - node = node->parent; - ngx_rbtree_right_rotate(root, sentinel, node); - } - - ngx_rbt_black(node->parent); - ngx_rbt_red(node->parent->parent); - ngx_rbtree_left_rotate(root, sentinel, node->parent->parent); - } - } - } - - ngx_rbt_black(*root); -} - - -void -ngx_rbtree_insert_value(ngx_rbtree_node_t *temp, ngx_rbtree_node_t *node, - ngx_rbtree_node_t *sentinel) -{ - ngx_rbtree_node_t **p; - - for ( ;; ) { - - p = (node->key < temp->key) ? &temp->left : &temp->right; - - if (*p == sentinel) { - break; - } - - temp = *p; - } - - *p = node; - node->parent = temp; - node->left = sentinel; - node->right = sentinel; - ngx_rbt_red(node); -} - - -void -ngx_rbtree_insert_timer_value(ngx_rbtree_node_t *temp, ngx_rbtree_node_t *node, - ngx_rbtree_node_t *sentinel) -{ - ngx_rbtree_node_t **p; - - for ( ;; ) { - - /* - * Timer values - * 1) are spread in small range, usually several minutes, - * 2) and overflow each 49 days, if milliseconds are stored in 32 bits. - * The comparison takes into account that overflow. - */ - - /* node->key < temp->key */ - - p = ((ngx_rbtree_key_int_t) (node->key - temp->key) < 0) - ? &temp->left : &temp->right; - - if (*p == sentinel) { - break; - } - - temp = *p; - } - - *p = node; - node->parent = temp; - node->left = sentinel; - node->right = sentinel; - ngx_rbt_red(node); -} - - -void -ngx_rbtree_delete(ngx_rbtree_t *tree, ngx_rbtree_node_t *node) -{ - ngx_uint_t red; - ngx_rbtree_node_t **root, *sentinel, *subst, *temp, *w; - - /* a binary tree delete */ - - root = &tree->root; - sentinel = tree->sentinel; - - if (node->left == sentinel) { - temp = node->right; - subst = node; - - } else if (node->right == sentinel) { - temp = node->left; - subst = node; - - } else { - subst = ngx_rbtree_min(node->right, sentinel); - temp = subst->right; - } - - if (subst == *root) { - *root = temp; - ngx_rbt_black(temp); - - /* DEBUG stuff */ - node->left = NULL; - node->right = NULL; - node->parent = NULL; - node->key = 0; - - return; - } - - red = ngx_rbt_is_red(subst); - - if (subst == subst->parent->left) { - subst->parent->left = temp; - - } else { - subst->parent->right = temp; - } - - if (subst == node) { - - temp->parent = subst->parent; - - } else { - - if (subst->parent == node) { - temp->parent = subst; - - } else { - temp->parent = subst->parent; - } - - subst->left = node->left; - subst->right = node->right; - subst->parent = node->parent; - ngx_rbt_copy_color(subst, node); - - if (node == *root) { - *root = subst; - - } else { - if (node == node->parent->left) { - node->parent->left = subst; - } else { - node->parent->right = subst; - } - } - - if (subst->left != sentinel) { - subst->left->parent = subst; - } - - if (subst->right != sentinel) { - subst->right->parent = subst; - } - } - - /* DEBUG stuff */ - node->left = NULL; - node->right = NULL; - node->parent = NULL; - node->key = 0; - - if (red) { - return; - } - - /* a delete fixup */ - - while (temp != *root && ngx_rbt_is_black(temp)) { - - if (temp == temp->parent->left) { - w = temp->parent->right; - - if (ngx_rbt_is_red(w)) { - ngx_rbt_black(w); - ngx_rbt_red(temp->parent); - ngx_rbtree_left_rotate(root, sentinel, temp->parent); - w = temp->parent->right; - } - - if (ngx_rbt_is_black(w->left) && ngx_rbt_is_black(w->right)) { - ngx_rbt_red(w); - temp = temp->parent; - - } else { - if (ngx_rbt_is_black(w->right)) { - ngx_rbt_black(w->left); - ngx_rbt_red(w); - ngx_rbtree_right_rotate(root, sentinel, w); - w = temp->parent->right; - } - - ngx_rbt_copy_color(w, temp->parent); - ngx_rbt_black(temp->parent); - ngx_rbt_black(w->right); - ngx_rbtree_left_rotate(root, sentinel, temp->parent); - temp = *root; - } - - } else { - w = temp->parent->left; - - if (ngx_rbt_is_red(w)) { - ngx_rbt_black(w); - ngx_rbt_red(temp->parent); - ngx_rbtree_right_rotate(root, sentinel, temp->parent); - w = temp->parent->left; - } - - if (ngx_rbt_is_black(w->left) && ngx_rbt_is_black(w->right)) { - ngx_rbt_red(w); - temp = temp->parent; - - } else { - if (ngx_rbt_is_black(w->left)) { - ngx_rbt_black(w->right); - ngx_rbt_red(w); - ngx_rbtree_left_rotate(root, sentinel, w); - w = temp->parent->left; - } - - ngx_rbt_copy_color(w, temp->parent); - ngx_rbt_black(temp->parent); - ngx_rbt_black(w->left); - ngx_rbtree_right_rotate(root, sentinel, temp->parent); - temp = *root; - } - } - } - - ngx_rbt_black(temp); -} - - -static ngx_inline void -ngx_rbtree_left_rotate(ngx_rbtree_node_t **root, ngx_rbtree_node_t *sentinel, - ngx_rbtree_node_t *node) -{ - ngx_rbtree_node_t *temp; - - temp = node->right; - node->right = temp->left; - - if (temp->left != sentinel) { - temp->left->parent = node; - } - - temp->parent = node->parent; - - if (node == *root) { - *root = temp; - - } else if (node == node->parent->left) { - node->parent->left = temp; - - } else { - node->parent->right = temp; - } - - temp->left = node; - node->parent = temp; -} - - -static ngx_inline void -ngx_rbtree_right_rotate(ngx_rbtree_node_t **root, ngx_rbtree_node_t *sentinel, - ngx_rbtree_node_t *node) -{ - ngx_rbtree_node_t *temp; - - temp = node->left; - node->left = temp->right; - - if (temp->right != sentinel) { - temp->right->parent = node; - } - - temp->parent = node->parent; - - if (node == *root) { - *root = temp; - - } else if (node == node->parent->right) { - node->parent->right = temp; - - } else { - node->parent->left = temp; - } - - temp->right = node; - node->parent = temp; -} - - -ngx_rbtree_node_t * -ngx_rbtree_next(ngx_rbtree_t *tree, ngx_rbtree_node_t *node) -{ - ngx_rbtree_node_t *root, *sentinel, *parent; - - sentinel = tree->sentinel; - - if (node->right != sentinel) { - return ngx_rbtree_min(node->right, sentinel); - } - - root = tree->root; - - for ( ;; ) { - parent = node->parent; - - if (node == root) { - return NULL; - } - - if (node == parent->left) { - return parent; - } - - node = parent; - } -} diff --git a/src/deps/src/nginx-1.30.3/src/core/ngx_rbtree.h b/src/deps/src/nginx-1.30.3/src/core/ngx_rbtree.h deleted file mode 100644 index e8c3582139..0000000000 --- a/src/deps/src/nginx-1.30.3/src/core/ngx_rbtree.h +++ /dev/null @@ -1,87 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#ifndef _NGX_RBTREE_H_INCLUDED_ -#define _NGX_RBTREE_H_INCLUDED_ - - -#include -#include - - -typedef ngx_uint_t ngx_rbtree_key_t; -typedef ngx_int_t ngx_rbtree_key_int_t; - - -typedef struct ngx_rbtree_node_s ngx_rbtree_node_t; - -struct ngx_rbtree_node_s { - ngx_rbtree_key_t key; - ngx_rbtree_node_t *left; - ngx_rbtree_node_t *right; - ngx_rbtree_node_t *parent; - u_char color; - u_char data; -}; - - -typedef struct ngx_rbtree_s ngx_rbtree_t; - -typedef void (*ngx_rbtree_insert_pt) (ngx_rbtree_node_t *root, - ngx_rbtree_node_t *node, ngx_rbtree_node_t *sentinel); - -struct ngx_rbtree_s { - ngx_rbtree_node_t *root; - ngx_rbtree_node_t *sentinel; - ngx_rbtree_insert_pt insert; -}; - - -#define ngx_rbtree_init(tree, s, i) \ - ngx_rbtree_sentinel_init(s); \ - (tree)->root = s; \ - (tree)->sentinel = s; \ - (tree)->insert = i - -#define ngx_rbtree_data(node, type, link) \ - (type *) ((u_char *) (node) - offsetof(type, link)) - - -void ngx_rbtree_insert(ngx_rbtree_t *tree, ngx_rbtree_node_t *node); -void ngx_rbtree_delete(ngx_rbtree_t *tree, ngx_rbtree_node_t *node); -void ngx_rbtree_insert_value(ngx_rbtree_node_t *root, ngx_rbtree_node_t *node, - ngx_rbtree_node_t *sentinel); -void ngx_rbtree_insert_timer_value(ngx_rbtree_node_t *root, - ngx_rbtree_node_t *node, ngx_rbtree_node_t *sentinel); -ngx_rbtree_node_t *ngx_rbtree_next(ngx_rbtree_t *tree, - ngx_rbtree_node_t *node); - - -#define ngx_rbt_red(node) ((node)->color = 1) -#define ngx_rbt_black(node) ((node)->color = 0) -#define ngx_rbt_is_red(node) ((node)->color) -#define ngx_rbt_is_black(node) (!ngx_rbt_is_red(node)) -#define ngx_rbt_copy_color(n1, n2) (n1->color = n2->color) - - -/* a sentinel must be black */ - -#define ngx_rbtree_sentinel_init(node) ngx_rbt_black(node) - - -static ngx_inline ngx_rbtree_node_t * -ngx_rbtree_min(ngx_rbtree_node_t *node, ngx_rbtree_node_t *sentinel) -{ - while (node->left != sentinel) { - node = node->left; - } - - return node; -} - - -#endif /* _NGX_RBTREE_H_INCLUDED_ */ diff --git a/src/deps/src/nginx-1.30.3/src/core/ngx_regex.c b/src/deps/src/nginx-1.30.3/src/core/ngx_regex.c deleted file mode 100644 index 5b13c5db38..0000000000 --- a/src/deps/src/nginx-1.30.3/src/core/ngx_regex.c +++ /dev/null @@ -1,804 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#include -#include - - -typedef struct { - ngx_flag_t pcre_jit; - ngx_list_t *studies; -} ngx_regex_conf_t; - - -static ngx_inline void ngx_regex_malloc_init(ngx_pool_t *pool); -static ngx_inline void ngx_regex_malloc_done(void); - -#if (NGX_PCRE2) -static void * ngx_libc_cdecl ngx_regex_malloc(size_t size, void *data); -static void ngx_libc_cdecl ngx_regex_free(void *p, void *data); -#else -static void * ngx_libc_cdecl ngx_regex_malloc(size_t size); -static void ngx_libc_cdecl ngx_regex_free(void *p); -#endif -static void ngx_regex_cleanup(void *data); - -static ngx_int_t ngx_regex_module_init(ngx_cycle_t *cycle); - -static void *ngx_regex_create_conf(ngx_cycle_t *cycle); -static char *ngx_regex_init_conf(ngx_cycle_t *cycle, void *conf); - -static char *ngx_regex_pcre_jit(ngx_conf_t *cf, void *post, void *data); -static ngx_conf_post_t ngx_regex_pcre_jit_post = { ngx_regex_pcre_jit }; - - -static ngx_command_t ngx_regex_commands[] = { - - { ngx_string("pcre_jit"), - NGX_MAIN_CONF|NGX_DIRECT_CONF|NGX_CONF_FLAG, - ngx_conf_set_flag_slot, - 0, - offsetof(ngx_regex_conf_t, pcre_jit), - &ngx_regex_pcre_jit_post }, - - ngx_null_command -}; - - -static ngx_core_module_t ngx_regex_module_ctx = { - ngx_string("regex"), - ngx_regex_create_conf, - ngx_regex_init_conf -}; - - -ngx_module_t ngx_regex_module = { - NGX_MODULE_V1, - &ngx_regex_module_ctx, /* module context */ - ngx_regex_commands, /* module directives */ - NGX_CORE_MODULE, /* module type */ - NULL, /* init master */ - ngx_regex_module_init, /* init module */ - NULL, /* init process */ - NULL, /* init thread */ - NULL, /* exit thread */ - NULL, /* exit process */ - NULL, /* exit master */ - NGX_MODULE_V1_PADDING -}; - - -static ngx_pool_t *ngx_regex_pool; -static ngx_list_t *ngx_regex_studies; -static ngx_uint_t ngx_regex_direct_alloc; - -#if (NGX_PCRE2) -static pcre2_compile_context *ngx_regex_compile_context; -static pcre2_match_data *ngx_regex_match_data; -static ngx_uint_t ngx_regex_match_data_size; -#endif - - -void -ngx_regex_init(void) -{ -#if !(NGX_PCRE2) - pcre_malloc = ngx_regex_malloc; - pcre_free = ngx_regex_free; -#endif -} - - -static ngx_inline void -ngx_regex_malloc_init(ngx_pool_t *pool) -{ - ngx_regex_pool = pool; - ngx_regex_direct_alloc = (pool == NULL) ? 1 : 0; -} - - -static ngx_inline void -ngx_regex_malloc_done(void) -{ - ngx_regex_pool = NULL; - ngx_regex_direct_alloc = 0; -} - - -#if (NGX_PCRE2) - -ngx_int_t -ngx_regex_compile(ngx_regex_compile_t *rc) -{ - int n, errcode; - char *p; - u_char errstr[128]; - size_t erroff; - uint32_t options; - pcre2_code *re; - ngx_regex_elt_t *elt; - pcre2_general_context *gctx; - pcre2_compile_context *cctx; - - if (ngx_regex_compile_context == NULL) { - /* - * Allocate a compile context if not yet allocated. This uses - * direct allocations from heap, so the result can be cached - * even at runtime. - */ - - ngx_regex_malloc_init(NULL); - - gctx = pcre2_general_context_create(ngx_regex_malloc, ngx_regex_free, - NULL); - if (gctx == NULL) { - ngx_regex_malloc_done(); - goto nomem; - } - - cctx = pcre2_compile_context_create(gctx); - if (cctx == NULL) { - pcre2_general_context_free(gctx); - ngx_regex_malloc_done(); - goto nomem; - } - - ngx_regex_compile_context = cctx; - - pcre2_general_context_free(gctx); - ngx_regex_malloc_done(); - } - - options = 0; - - if (rc->options & NGX_REGEX_CASELESS) { - options |= PCRE2_CASELESS; - } - - if (rc->options & NGX_REGEX_MULTILINE) { - options |= PCRE2_MULTILINE; - } - - if (rc->options & ~(NGX_REGEX_CASELESS|NGX_REGEX_MULTILINE)) { - rc->err.len = ngx_snprintf(rc->err.data, rc->err.len, - "regex \"%V\" compilation failed: invalid options", - &rc->pattern) - - rc->err.data; - return NGX_ERROR; - } - - ngx_regex_malloc_init(rc->pool); - - re = pcre2_compile(rc->pattern.data, rc->pattern.len, options, - &errcode, &erroff, ngx_regex_compile_context); - - /* ensure that there is no current pool */ - ngx_regex_malloc_done(); - - if (re == NULL) { - pcre2_get_error_message(errcode, errstr, 128); - - if ((size_t) erroff == rc->pattern.len) { - rc->err.len = ngx_snprintf(rc->err.data, rc->err.len, - "pcre2_compile() failed: %s in \"%V\"", - errstr, &rc->pattern) - - rc->err.data; - - } else { - rc->err.len = ngx_snprintf(rc->err.data, rc->err.len, - "pcre2_compile() failed: %s in \"%V\" at \"%s\"", - errstr, &rc->pattern, rc->pattern.data + erroff) - - rc->err.data; - } - - return NGX_ERROR; - } - - rc->regex = re; - - /* do not study at runtime */ - - if (ngx_regex_studies != NULL) { - elt = ngx_list_push(ngx_regex_studies); - if (elt == NULL) { - goto nomem; - } - - elt->regex = rc->regex; - elt->name = rc->pattern.data; - } - - n = pcre2_pattern_info(re, PCRE2_INFO_CAPTURECOUNT, &rc->captures); - if (n < 0) { - p = "pcre2_pattern_info(\"%V\", PCRE2_INFO_CAPTURECOUNT) failed: %d"; - goto failed; - } - - if (rc->captures == 0) { - return NGX_OK; - } - - n = pcre2_pattern_info(re, PCRE2_INFO_NAMECOUNT, &rc->named_captures); - if (n < 0) { - p = "pcre2_pattern_info(\"%V\", PCRE2_INFO_NAMECOUNT) failed: %d"; - goto failed; - } - - if (rc->named_captures == 0) { - return NGX_OK; - } - - n = pcre2_pattern_info(re, PCRE2_INFO_NAMEENTRYSIZE, &rc->name_size); - if (n < 0) { - p = "pcre2_pattern_info(\"%V\", PCRE2_INFO_NAMEENTRYSIZE) failed: %d"; - goto failed; - } - - n = pcre2_pattern_info(re, PCRE2_INFO_NAMETABLE, &rc->names); - if (n < 0) { - p = "pcre2_pattern_info(\"%V\", PCRE2_INFO_NAMETABLE) failed: %d"; - goto failed; - } - - return NGX_OK; - -failed: - - rc->err.len = ngx_snprintf(rc->err.data, rc->err.len, p, &rc->pattern, n) - - rc->err.data; - return NGX_ERROR; - -nomem: - - rc->err.len = ngx_snprintf(rc->err.data, rc->err.len, - "regex \"%V\" compilation failed: no memory", - &rc->pattern) - - rc->err.data; - return NGX_ERROR; -} - -#else - -ngx_int_t -ngx_regex_compile(ngx_regex_compile_t *rc) -{ - int n, erroff; - char *p; - pcre *re; - const char *errstr; - ngx_uint_t options; - ngx_regex_elt_t *elt; - - options = 0; - - if (rc->options & NGX_REGEX_CASELESS) { - options |= PCRE_CASELESS; - } - - if (rc->options & NGX_REGEX_MULTILINE) { - options |= PCRE_MULTILINE; - } - - if (rc->options & ~(NGX_REGEX_CASELESS|NGX_REGEX_MULTILINE)) { - rc->err.len = ngx_snprintf(rc->err.data, rc->err.len, - "regex \"%V\" compilation failed: invalid options", - &rc->pattern) - - rc->err.data; - return NGX_ERROR; - } - - ngx_regex_malloc_init(rc->pool); - - re = pcre_compile((const char *) rc->pattern.data, (int) options, - &errstr, &erroff, NULL); - - /* ensure that there is no current pool */ - ngx_regex_malloc_done(); - - if (re == NULL) { - if ((size_t) erroff == rc->pattern.len) { - rc->err.len = ngx_snprintf(rc->err.data, rc->err.len, - "pcre_compile() failed: %s in \"%V\"", - errstr, &rc->pattern) - - rc->err.data; - - } else { - rc->err.len = ngx_snprintf(rc->err.data, rc->err.len, - "pcre_compile() failed: %s in \"%V\" at \"%s\"", - errstr, &rc->pattern, rc->pattern.data + erroff) - - rc->err.data; - } - - return NGX_ERROR; - } - - rc->regex = ngx_pcalloc(rc->pool, sizeof(ngx_regex_t)); - if (rc->regex == NULL) { - goto nomem; - } - - rc->regex->code = re; - - /* do not study at runtime */ - - if (ngx_regex_studies != NULL) { - elt = ngx_list_push(ngx_regex_studies); - if (elt == NULL) { - goto nomem; - } - - elt->regex = rc->regex; - elt->name = rc->pattern.data; - } - - n = pcre_fullinfo(re, NULL, PCRE_INFO_CAPTURECOUNT, &rc->captures); - if (n < 0) { - p = "pcre_fullinfo(\"%V\", PCRE_INFO_CAPTURECOUNT) failed: %d"; - goto failed; - } - - if (rc->captures == 0) { - return NGX_OK; - } - - n = pcre_fullinfo(re, NULL, PCRE_INFO_NAMECOUNT, &rc->named_captures); - if (n < 0) { - p = "pcre_fullinfo(\"%V\", PCRE_INFO_NAMECOUNT) failed: %d"; - goto failed; - } - - if (rc->named_captures == 0) { - return NGX_OK; - } - - n = pcre_fullinfo(re, NULL, PCRE_INFO_NAMEENTRYSIZE, &rc->name_size); - if (n < 0) { - p = "pcre_fullinfo(\"%V\", PCRE_INFO_NAMEENTRYSIZE) failed: %d"; - goto failed; - } - - n = pcre_fullinfo(re, NULL, PCRE_INFO_NAMETABLE, &rc->names); - if (n < 0) { - p = "pcre_fullinfo(\"%V\", PCRE_INFO_NAMETABLE) failed: %d"; - goto failed; - } - - return NGX_OK; - -failed: - - rc->err.len = ngx_snprintf(rc->err.data, rc->err.len, p, &rc->pattern, n) - - rc->err.data; - return NGX_ERROR; - -nomem: - - rc->err.len = ngx_snprintf(rc->err.data, rc->err.len, - "regex \"%V\" compilation failed: no memory", - &rc->pattern) - - rc->err.data; - return NGX_ERROR; -} - -#endif - - -#if (NGX_PCRE2) - -ngx_int_t -ngx_regex_exec(ngx_regex_t *re, ngx_str_t *s, int *captures, ngx_uint_t size) -{ - size_t *ov; - ngx_int_t rc; - ngx_uint_t n, i; - - /* - * The pcre2_match() function might allocate memory for backtracking - * frames, typical allocations are from 40k and above. So the allocator - * is configured to do direct allocations from heap during matching. - */ - - ngx_regex_malloc_init(NULL); - - if (ngx_regex_match_data == NULL - || size > ngx_regex_match_data_size) - { - /* - * Allocate a match data if not yet allocated or smaller than - * needed. - */ - - if (ngx_regex_match_data) { - pcre2_match_data_free(ngx_regex_match_data); - } - - ngx_regex_match_data_size = size; - ngx_regex_match_data = pcre2_match_data_create(size / 3, NULL); - - if (ngx_regex_match_data == NULL) { - rc = PCRE2_ERROR_NOMEMORY; - goto failed; - } - } - - rc = pcre2_match(re, s->data, s->len, 0, 0, ngx_regex_match_data, NULL); - - if (rc < 0) { - goto failed; - } - - n = pcre2_get_ovector_count(ngx_regex_match_data); - ov = pcre2_get_ovector_pointer(ngx_regex_match_data); - - if (n > size / 3) { - n = size / 3; - } - - for (i = 0; i < n; i++) { - captures[i * 2] = ov[i * 2]; - captures[i * 2 + 1] = ov[i * 2 + 1]; - } - -failed: - - ngx_regex_malloc_done(); - - return rc; -} - -#else - -ngx_int_t -ngx_regex_exec(ngx_regex_t *re, ngx_str_t *s, int *captures, ngx_uint_t size) -{ - return pcre_exec(re->code, re->extra, (const char *) s->data, s->len, - 0, 0, captures, size); -} - -#endif - - -ngx_int_t -ngx_regex_exec_array(ngx_array_t *a, ngx_str_t *s, ngx_log_t *log) -{ - ngx_int_t n; - ngx_uint_t i; - ngx_regex_elt_t *re; - - re = a->elts; - - for (i = 0; i < a->nelts; i++) { - - n = ngx_regex_exec(re[i].regex, s, NULL, 0); - - if (n == NGX_REGEX_NO_MATCHED) { - continue; - } - - if (n < 0) { - ngx_log_error(NGX_LOG_ALERT, log, 0, - ngx_regex_exec_n " failed: %i on \"%V\" using \"%s\"", - n, s, re[i].name); - return NGX_ERROR; - } - - /* match */ - - return NGX_OK; - } - - return NGX_DECLINED; -} - - -#if (NGX_PCRE2) - -static void * ngx_libc_cdecl -ngx_regex_malloc(size_t size, void *data) -{ - if (ngx_regex_pool) { - return ngx_palloc(ngx_regex_pool, size); - } - - if (ngx_regex_direct_alloc) { - return ngx_alloc(size, ngx_cycle->log); - } - - return NULL; -} - - -static void ngx_libc_cdecl -ngx_regex_free(void *p, void *data) -{ - if (ngx_regex_direct_alloc) { - ngx_free(p); - } - - return; -} - -#else - -static void * ngx_libc_cdecl -ngx_regex_malloc(size_t size) -{ - if (ngx_regex_pool) { - return ngx_palloc(ngx_regex_pool, size); - } - - return NULL; -} - - -static void ngx_libc_cdecl -ngx_regex_free(void *p) -{ - return; -} - -#endif - - -static void -ngx_regex_cleanup(void *data) -{ -#if (NGX_PCRE2 || NGX_HAVE_PCRE_JIT) - ngx_regex_conf_t *rcf = data; - - ngx_uint_t i; - ngx_list_part_t *part; - ngx_regex_elt_t *elts; - - part = &rcf->studies->part; - elts = part->elts; - - for (i = 0; /* void */ ; i++) { - - if (i >= part->nelts) { - if (part->next == NULL) { - break; - } - - part = part->next; - elts = part->elts; - i = 0; - } - - /* - * The PCRE JIT compiler uses mmap for its executable codes, so we - * have to explicitly call the pcre_free_study() function to free - * this memory. In PCRE2, we call the pcre2_code_free() function - * for the same reason. - */ - -#if (NGX_PCRE2) - pcre2_code_free(elts[i].regex); -#else - if (elts[i].regex->extra != NULL) { - pcre_free_study(elts[i].regex->extra); - } -#endif - } -#endif - - /* - * On configuration parsing errors ngx_regex_module_init() will not - * be called. Make sure ngx_regex_studies is properly cleared anyway. - */ - - ngx_regex_studies = NULL; - -#if (NGX_PCRE2) - - /* - * Free compile context and match data. If needed at runtime by - * the new cycle, these will be re-allocated. - */ - - ngx_regex_malloc_init(NULL); - - if (ngx_regex_compile_context) { - pcre2_compile_context_free(ngx_regex_compile_context); - ngx_regex_compile_context = NULL; - } - - if (ngx_regex_match_data) { - pcre2_match_data_free(ngx_regex_match_data); - ngx_regex_match_data = NULL; - ngx_regex_match_data_size = 0; - } - - ngx_regex_malloc_done(); - -#endif -} - - -static ngx_int_t -ngx_regex_module_init(ngx_cycle_t *cycle) -{ - int opt; -#if !(NGX_PCRE2) - const char *errstr; -#endif - ngx_uint_t i; - ngx_list_part_t *part; - ngx_regex_elt_t *elts; - ngx_regex_conf_t *rcf; - - opt = 0; - - rcf = (ngx_regex_conf_t *) ngx_get_conf(cycle->conf_ctx, ngx_regex_module); - -#if (NGX_PCRE2 || NGX_HAVE_PCRE_JIT) - - if (rcf->pcre_jit) { -#if (NGX_PCRE2) - opt = 1; -#else - opt = PCRE_STUDY_JIT_COMPILE; -#endif - } - -#endif - - ngx_regex_malloc_init(cycle->pool); - - part = &rcf->studies->part; - elts = part->elts; - - for (i = 0; /* void */ ; i++) { - - if (i >= part->nelts) { - if (part->next == NULL) { - break; - } - - part = part->next; - elts = part->elts; - i = 0; - } - -#if (NGX_PCRE2) - - if (opt) { - int n; - - n = pcre2_jit_compile(elts[i].regex, PCRE2_JIT_COMPLETE); - - if (n != 0) { - ngx_log_error(NGX_LOG_INFO, cycle->log, 0, - "pcre2_jit_compile() failed: %d in \"%s\", " - "ignored", - n, elts[i].name); - } - } - -#else - - elts[i].regex->extra = pcre_study(elts[i].regex->code, opt, &errstr); - - if (errstr != NULL) { - ngx_log_error(NGX_LOG_ALERT, cycle->log, 0, - "pcre_study() failed: %s in \"%s\"", - errstr, elts[i].name); - } - -#if (NGX_HAVE_PCRE_JIT) - if (opt & PCRE_STUDY_JIT_COMPILE) { - int jit, n; - - jit = 0; - n = pcre_fullinfo(elts[i].regex->code, elts[i].regex->extra, - PCRE_INFO_JIT, &jit); - - if (n != 0 || jit != 1) { - ngx_log_error(NGX_LOG_INFO, cycle->log, 0, - "JIT compiler does not support pattern: \"%s\"", - elts[i].name); - } - } -#endif -#endif - } - - ngx_regex_malloc_done(); - - ngx_regex_studies = NULL; - - return NGX_OK; -} - - -static void * -ngx_regex_create_conf(ngx_cycle_t *cycle) -{ - ngx_regex_conf_t *rcf; - ngx_pool_cleanup_t *cln; - - rcf = ngx_pcalloc(cycle->pool, sizeof(ngx_regex_conf_t)); - if (rcf == NULL) { - return NULL; - } - - rcf->pcre_jit = NGX_CONF_UNSET; - - cln = ngx_pool_cleanup_add(cycle->pool, 0); - if (cln == NULL) { - return NULL; - } - - rcf->studies = ngx_list_create(cycle->pool, 8, sizeof(ngx_regex_elt_t)); - if (rcf->studies == NULL) { - return NULL; - } - - cln->handler = ngx_regex_cleanup; - cln->data = rcf; - - ngx_regex_studies = rcf->studies; - - return rcf; -} - - -static char * -ngx_regex_init_conf(ngx_cycle_t *cycle, void *conf) -{ - ngx_regex_conf_t *rcf = conf; - - ngx_conf_init_value(rcf->pcre_jit, 0); - - return NGX_CONF_OK; -} - - -static char * -ngx_regex_pcre_jit(ngx_conf_t *cf, void *post, void *data) -{ - ngx_flag_t *fp = data; - - if (*fp == 0) { - return NGX_CONF_OK; - } - -#if (NGX_PCRE2) - { - int r; - uint32_t jit; - - jit = 0; - r = pcre2_config(PCRE2_CONFIG_JIT, &jit); - - if (r != 0 || jit != 1) { - ngx_conf_log_error(NGX_LOG_WARN, cf, 0, - "PCRE2 library does not support JIT"); - *fp = 0; - } - } -#elif (NGX_HAVE_PCRE_JIT) - { - int jit, r; - - jit = 0; - r = pcre_config(PCRE_CONFIG_JIT, &jit); - - if (r != 0 || jit != 1) { - ngx_conf_log_error(NGX_LOG_WARN, cf, 0, - "PCRE library does not support JIT"); - *fp = 0; - } - } -#else - ngx_conf_log_error(NGX_LOG_WARN, cf, 0, - "nginx was built without PCRE JIT support"); - *fp = 0; -#endif - - return NGX_CONF_OK; -} diff --git a/src/deps/src/nginx-1.30.3/src/core/ngx_regex.h b/src/deps/src/nginx-1.30.3/src/core/ngx_regex.h deleted file mode 100644 index 182373a22b..0000000000 --- a/src/deps/src/nginx-1.30.3/src/core/ngx_regex.h +++ /dev/null @@ -1,78 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#ifndef _NGX_REGEX_H_INCLUDED_ -#define _NGX_REGEX_H_INCLUDED_ - - -#include -#include - - -#if (NGX_PCRE2) - -#define PCRE2_CODE_UNIT_WIDTH 8 -#include - -#define NGX_REGEX_NO_MATCHED PCRE2_ERROR_NOMATCH /* -1 */ - -typedef pcre2_code ngx_regex_t; - -#else - -#include - -#define NGX_REGEX_NO_MATCHED PCRE_ERROR_NOMATCH /* -1 */ - -typedef struct { - pcre *code; - pcre_extra *extra; -} ngx_regex_t; - -#endif - - -#define NGX_REGEX_CASELESS 0x00000001 -#define NGX_REGEX_MULTILINE 0x00000002 - - -typedef struct { - ngx_str_t pattern; - ngx_pool_t *pool; - ngx_uint_t options; - - ngx_regex_t *regex; - int captures; - int named_captures; - int name_size; - u_char *names; - ngx_str_t err; -} ngx_regex_compile_t; - - -typedef struct { - ngx_regex_t *regex; - u_char *name; -} ngx_regex_elt_t; - - -void ngx_regex_init(void); -ngx_int_t ngx_regex_compile(ngx_regex_compile_t *rc); - -ngx_int_t ngx_regex_exec(ngx_regex_t *re, ngx_str_t *s, int *captures, - ngx_uint_t size); - -#if (NGX_PCRE2) -#define ngx_regex_exec_n "pcre2_match()" -#else -#define ngx_regex_exec_n "pcre_exec()" -#endif - -ngx_int_t ngx_regex_exec_array(ngx_array_t *a, ngx_str_t *s, ngx_log_t *log); - - -#endif /* _NGX_REGEX_H_INCLUDED_ */ diff --git a/src/deps/src/nginx-1.30.3/src/core/ngx_resolver.c b/src/deps/src/nginx-1.30.3/src/core/ngx_resolver.c deleted file mode 100644 index f8f677878a..0000000000 --- a/src/deps/src/nginx-1.30.3/src/core/ngx_resolver.c +++ /dev/null @@ -1,4741 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#include -#include -#include - - -#define NGX_RESOLVER_UDP_SIZE 4096 - -#define NGX_RESOLVER_TCP_RSIZE (2 + 65535) -#define NGX_RESOLVER_TCP_WSIZE 8192 - - -typedef struct { - u_char ident_hi; - u_char ident_lo; - u_char flags_hi; - u_char flags_lo; - u_char nqs_hi; - u_char nqs_lo; - u_char nan_hi; - u_char nan_lo; - u_char nns_hi; - u_char nns_lo; - u_char nar_hi; - u_char nar_lo; -} ngx_resolver_hdr_t; - - -typedef struct { - u_char type_hi; - u_char type_lo; - u_char class_hi; - u_char class_lo; -} ngx_resolver_qs_t; - - -typedef struct { - u_char type_hi; - u_char type_lo; - u_char class_hi; - u_char class_lo; - u_char ttl[4]; - u_char len_hi; - u_char len_lo; -} ngx_resolver_an_t; - - -#define ngx_resolver_node(n) ngx_rbtree_data(n, ngx_resolver_node_t, node) - - -static ngx_int_t ngx_udp_connect(ngx_resolver_connection_t *rec); -static ngx_int_t ngx_tcp_connect(ngx_resolver_connection_t *rec); - - -static void ngx_resolver_cleanup(void *data); -static void ngx_resolver_cleanup_tree(ngx_resolver_t *r, ngx_rbtree_t *tree); -static ngx_int_t ngx_resolve_name_locked(ngx_resolver_t *r, - ngx_resolver_ctx_t *ctx, ngx_str_t *name); -static void ngx_resolver_expire(ngx_resolver_t *r, ngx_rbtree_t *tree, - ngx_queue_t *queue); -static ngx_int_t ngx_resolver_send_query(ngx_resolver_t *r, - ngx_resolver_node_t *rn); -static ngx_int_t ngx_resolver_send_udp_query(ngx_resolver_t *r, - ngx_resolver_connection_t *rec, u_char *query, u_short qlen); -static ngx_int_t ngx_resolver_send_tcp_query(ngx_resolver_t *r, - ngx_resolver_connection_t *rec, u_char *query, u_short qlen); -static ngx_int_t ngx_resolver_create_name_query(ngx_resolver_t *r, - ngx_resolver_node_t *rn, ngx_str_t *name); -static ngx_int_t ngx_resolver_create_srv_query(ngx_resolver_t *r, - ngx_resolver_node_t *rn, ngx_str_t *name); -static ngx_int_t ngx_resolver_create_addr_query(ngx_resolver_t *r, - ngx_resolver_node_t *rn, ngx_resolver_addr_t *addr); -static void ngx_resolver_resend_handler(ngx_event_t *ev); -static time_t ngx_resolver_resend(ngx_resolver_t *r, ngx_rbtree_t *tree, - ngx_queue_t *queue); -static ngx_uint_t ngx_resolver_resend_empty(ngx_resolver_t *r); -static void ngx_resolver_udp_read(ngx_event_t *rev); -static void ngx_resolver_tcp_write(ngx_event_t *wev); -static void ngx_resolver_tcp_read(ngx_event_t *rev); -static void ngx_resolver_process_response(ngx_resolver_t *r, u_char *buf, - size_t n, ngx_uint_t tcp); -static void ngx_resolver_process_a(ngx_resolver_t *r, u_char *buf, size_t n, - ngx_uint_t ident, ngx_uint_t code, ngx_uint_t qtype, - ngx_uint_t nan, ngx_uint_t trunc, ngx_uint_t ans); -static void ngx_resolver_process_srv(ngx_resolver_t *r, u_char *buf, size_t n, - ngx_uint_t ident, ngx_uint_t code, ngx_uint_t nan, - ngx_uint_t trunc, ngx_uint_t ans); -static void ngx_resolver_process_ptr(ngx_resolver_t *r, u_char *buf, size_t n, - ngx_uint_t ident, ngx_uint_t code, ngx_uint_t nan); -static ngx_resolver_node_t *ngx_resolver_lookup_name(ngx_resolver_t *r, - ngx_str_t *name, uint32_t hash); -static ngx_resolver_node_t *ngx_resolver_lookup_srv(ngx_resolver_t *r, - ngx_str_t *name, uint32_t hash); -static ngx_resolver_node_t *ngx_resolver_lookup_addr(ngx_resolver_t *r, - in_addr_t addr); -static void ngx_resolver_rbtree_insert_value(ngx_rbtree_node_t *temp, - ngx_rbtree_node_t *node, ngx_rbtree_node_t *sentinel); -static ngx_int_t ngx_resolver_copy(ngx_resolver_t *r, ngx_str_t *name, - u_char *buf, u_char *src, u_char *last); -static ngx_int_t ngx_resolver_set_timeout(ngx_resolver_t *r, - ngx_resolver_ctx_t *ctx); -static void ngx_resolver_timeout_handler(ngx_event_t *ev); -static void ngx_resolver_free_node(ngx_resolver_t *r, ngx_resolver_node_t *rn); -static void *ngx_resolver_alloc(ngx_resolver_t *r, size_t size); -static void *ngx_resolver_calloc(ngx_resolver_t *r, size_t size); -static void ngx_resolver_free(ngx_resolver_t *r, void *p); -static void ngx_resolver_free_locked(ngx_resolver_t *r, void *p); -static void *ngx_resolver_dup(ngx_resolver_t *r, void *src, size_t size); -static ngx_resolver_addr_t *ngx_resolver_export(ngx_resolver_t *r, - ngx_resolver_node_t *rn, ngx_uint_t rotate); -static void ngx_resolver_report_srv(ngx_resolver_t *r, ngx_resolver_ctx_t *ctx); -static u_char *ngx_resolver_log_error(ngx_log_t *log, u_char *buf, size_t len); -static void ngx_resolver_resolve_srv_names(ngx_resolver_ctx_t *ctx, - ngx_resolver_node_t *rn); -static void ngx_resolver_srv_names_handler(ngx_resolver_ctx_t *ctx); -static ngx_int_t ngx_resolver_cmp_srvs(const void *one, const void *two); - -#if (NGX_HAVE_INET6) -static void ngx_resolver_rbtree_insert_addr6_value(ngx_rbtree_node_t *temp, - ngx_rbtree_node_t *node, ngx_rbtree_node_t *sentinel); -static ngx_resolver_node_t *ngx_resolver_lookup_addr6(ngx_resolver_t *r, - struct in6_addr *addr, uint32_t hash); -#endif - - -ngx_resolver_t * -ngx_resolver_create(ngx_conf_t *cf, ngx_str_t *names, ngx_uint_t n) -{ - ngx_str_t s; - ngx_url_t u; - ngx_uint_t i, j; - ngx_resolver_t *r; - ngx_pool_cleanup_t *cln; - ngx_resolver_connection_t *rec; - - r = ngx_pcalloc(cf->pool, sizeof(ngx_resolver_t)); - if (r == NULL) { - return NULL; - } - - r->event = ngx_pcalloc(cf->pool, sizeof(ngx_event_t)); - if (r->event == NULL) { - return NULL; - } - - cln = ngx_pool_cleanup_add(cf->pool, 0); - if (cln == NULL) { - return NULL; - } - - cln->handler = ngx_resolver_cleanup; - cln->data = r; - - r->ipv4 = 1; - - ngx_rbtree_init(&r->name_rbtree, &r->name_sentinel, - ngx_resolver_rbtree_insert_value); - - ngx_rbtree_init(&r->srv_rbtree, &r->srv_sentinel, - ngx_resolver_rbtree_insert_value); - - ngx_rbtree_init(&r->addr_rbtree, &r->addr_sentinel, - ngx_rbtree_insert_value); - - ngx_queue_init(&r->name_resend_queue); - ngx_queue_init(&r->srv_resend_queue); - ngx_queue_init(&r->addr_resend_queue); - - ngx_queue_init(&r->name_expire_queue); - ngx_queue_init(&r->srv_expire_queue); - ngx_queue_init(&r->addr_expire_queue); - -#if (NGX_HAVE_INET6) - r->ipv6 = 1; - - ngx_rbtree_init(&r->addr6_rbtree, &r->addr6_sentinel, - ngx_resolver_rbtree_insert_addr6_value); - - ngx_queue_init(&r->addr6_resend_queue); - - ngx_queue_init(&r->addr6_expire_queue); -#endif - - r->event->handler = ngx_resolver_resend_handler; - r->event->data = r; - r->event->log = &cf->cycle->new_log; - r->event->cancelable = 1; - r->ident = -1; - - r->resend_timeout = 5; - r->tcp_timeout = 5; - r->expire = 30; - r->valid = 0; - - r->log = &cf->cycle->new_log; - r->log_level = NGX_LOG_ERR; - - if (n) { - if (ngx_array_init(&r->connections, cf->pool, n, - sizeof(ngx_resolver_connection_t)) - != NGX_OK) - { - return NULL; - } - } - - for (i = 0; i < n; i++) { - if (ngx_strncmp(names[i].data, "valid=", 6) == 0) { - s.len = names[i].len - 6; - s.data = names[i].data + 6; - - r->valid = ngx_parse_time(&s, 1); - - if (r->valid == (time_t) NGX_ERROR) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "invalid parameter: %V", &names[i]); - return NULL; - } - - continue; - } - -#if (NGX_HAVE_INET6) - if (ngx_strncmp(names[i].data, "ipv4=", 5) == 0) { - - if (ngx_strcmp(&names[i].data[5], "on") == 0) { - r->ipv4 = 1; - - } else if (ngx_strcmp(&names[i].data[5], "off") == 0) { - r->ipv4 = 0; - - } else { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "invalid parameter: %V", &names[i]); - return NULL; - } - - continue; - } - - if (ngx_strncmp(names[i].data, "ipv6=", 5) == 0) { - - if (ngx_strcmp(&names[i].data[5], "on") == 0) { - r->ipv6 = 1; - - } else if (ngx_strcmp(&names[i].data[5], "off") == 0) { - r->ipv6 = 0; - - } else { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "invalid parameter: %V", &names[i]); - return NULL; - } - - continue; - } -#endif - - ngx_memzero(&u, sizeof(ngx_url_t)); - - u.url = names[i]; - u.default_port = 53; - - if (ngx_parse_url(cf->pool, &u) != NGX_OK) { - if (u.err) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "%s in resolver \"%V\"", - u.err, &u.url); - } - - return NULL; - } - - rec = ngx_array_push_n(&r->connections, u.naddrs); - if (rec == NULL) { - return NULL; - } - - ngx_memzero(rec, u.naddrs * sizeof(ngx_resolver_connection_t)); - - for (j = 0; j < u.naddrs; j++) { - rec[j].sockaddr = u.addrs[j].sockaddr; - rec[j].socklen = u.addrs[j].socklen; - rec[j].server = u.addrs[j].name; - rec[j].resolver = r; - } - } - -#if (NGX_HAVE_INET6) - if (r->ipv4 + r->ipv6 == 0) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "\"ipv4\" and \"ipv6\" cannot both be \"off\""); - return NULL; - } -#endif - - if (n && r->connections.nelts == 0) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, "no name servers defined"); - return NULL; - } - - return r; -} - - -static void -ngx_resolver_cleanup(void *data) -{ - ngx_resolver_t *r = data; - - ngx_uint_t i; - ngx_resolver_connection_t *rec; - - ngx_log_debug0(NGX_LOG_DEBUG_CORE, ngx_cycle->log, 0, "cleanup resolver"); - - ngx_resolver_cleanup_tree(r, &r->name_rbtree); - - ngx_resolver_cleanup_tree(r, &r->srv_rbtree); - - ngx_resolver_cleanup_tree(r, &r->addr_rbtree); - -#if (NGX_HAVE_INET6) - ngx_resolver_cleanup_tree(r, &r->addr6_rbtree); -#endif - - if (r->event->timer_set) { - ngx_del_timer(r->event); - } - - rec = r->connections.elts; - - for (i = 0; i < r->connections.nelts; i++) { - if (rec[i].udp) { - ngx_close_connection(rec[i].udp); - } - - if (rec[i].tcp) { - ngx_close_connection(rec[i].tcp); - } - - if (rec[i].read_buf) { - ngx_resolver_free(r, rec[i].read_buf->start); - ngx_resolver_free(r, rec[i].read_buf); - } - - if (rec[i].write_buf) { - ngx_resolver_free(r, rec[i].write_buf->start); - ngx_resolver_free(r, rec[i].write_buf); - } - } -} - - -static void -ngx_resolver_cleanup_tree(ngx_resolver_t *r, ngx_rbtree_t *tree) -{ - ngx_resolver_ctx_t *ctx, *next; - ngx_resolver_node_t *rn; - - while (tree->root != tree->sentinel) { - - rn = ngx_resolver_node(ngx_rbtree_min(tree->root, tree->sentinel)); - - ngx_queue_remove(&rn->queue); - - for (ctx = rn->waiting; ctx; ctx = next) { - next = ctx->next; - - if (ctx->event) { - if (ctx->event->timer_set) { - ngx_del_timer(ctx->event); - } - - ngx_resolver_free(r, ctx->event); - } - - ngx_resolver_free(r, ctx); - } - - ngx_rbtree_delete(tree, &rn->node); - - ngx_resolver_free_node(r, rn); - } -} - - -ngx_resolver_ctx_t * -ngx_resolve_start(ngx_resolver_t *r, ngx_resolver_ctx_t *temp) -{ - in_addr_t addr; - ngx_resolver_ctx_t *ctx; - - if (temp) { - addr = ngx_inet_addr(temp->name.data, temp->name.len); - - if (addr != INADDR_NONE) { - temp->resolver = r; - temp->state = NGX_OK; - temp->naddrs = 1; - temp->addrs = &temp->addr; - temp->addr.sockaddr = (struct sockaddr *) &temp->sin; - temp->addr.socklen = sizeof(struct sockaddr_in); - ngx_memzero(&temp->sin, sizeof(struct sockaddr_in)); - temp->sin.sin_family = AF_INET; - temp->sin.sin_addr.s_addr = addr; - temp->quick = 1; - - return temp; - } - } - - if (r->connections.nelts == 0) { - return NGX_NO_RESOLVER; - } - - ctx = ngx_resolver_calloc(r, sizeof(ngx_resolver_ctx_t)); - - if (ctx) { - ctx->resolver = r; - } - - return ctx; -} - - -ngx_int_t -ngx_resolve_name(ngx_resolver_ctx_t *ctx) -{ - size_t slen; - ngx_int_t rc; - ngx_str_t name; - ngx_resolver_t *r; - - r = ctx->resolver; - - if (ctx->name.len > 0 && ctx->name.data[ctx->name.len - 1] == '.') { - ctx->name.len--; - } - - ngx_log_debug1(NGX_LOG_DEBUG_CORE, r->log, 0, - "resolve: \"%V\"", &ctx->name); - - if (ctx->quick) { - ctx->handler(ctx); - return NGX_OK; - } - - if (ctx->service.len) { - slen = ctx->service.len; - - if (ngx_strlchr(ctx->service.data, - ctx->service.data + ctx->service.len, '.') - == NULL) - { - slen += sizeof("_._tcp") - 1; - } - - name.len = slen + 1 + ctx->name.len; - - name.data = ngx_resolver_alloc(r, name.len); - if (name.data == NULL) { - goto failed; - } - - if (slen == ctx->service.len) { - ngx_sprintf(name.data, "%V.%V", &ctx->service, &ctx->name); - - } else { - ngx_sprintf(name.data, "_%V._tcp.%V", &ctx->service, &ctx->name); - } - - /* lock name mutex */ - - rc = ngx_resolve_name_locked(r, ctx, &name); - - ngx_resolver_free(r, name.data); - - } else { - /* lock name mutex */ - - rc = ngx_resolve_name_locked(r, ctx, &ctx->name); - } - - if (rc == NGX_OK) { - return NGX_OK; - } - - /* unlock name mutex */ - - if (rc == NGX_AGAIN) { - return NGX_OK; - } - - /* NGX_ERROR */ - - if (ctx->event) { - ngx_resolver_free(r, ctx->event); - } - -failed: - - ngx_resolver_free(r, ctx); - - return NGX_ERROR; -} - - -void -ngx_resolve_name_done(ngx_resolver_ctx_t *ctx) -{ - ngx_uint_t i; - ngx_resolver_t *r; - ngx_resolver_ctx_t *w, **p; - ngx_resolver_node_t *rn; - - r = ctx->resolver; - - ngx_log_debug1(NGX_LOG_DEBUG_CORE, r->log, 0, - "resolve name done: %i", ctx->state); - - if (ctx->quick) { - return; - } - - if (ctx->event && ctx->event->timer_set) { - ngx_del_timer(ctx->event); - } - - /* lock name mutex */ - - if (ctx->nsrvs) { - for (i = 0; i < ctx->nsrvs; i++) { - if (ctx->srvs[i].ctx) { - ngx_resolve_name_done(ctx->srvs[i].ctx); - } - - if (ctx->srvs[i].addrs) { - ngx_resolver_free(r, ctx->srvs[i].addrs->sockaddr); - ngx_resolver_free(r, ctx->srvs[i].addrs); - } - - ngx_resolver_free(r, ctx->srvs[i].name.data); - } - - ngx_resolver_free(r, ctx->srvs); - } - - if (ctx->state == NGX_AGAIN || ctx->state == NGX_RESOLVE_TIMEDOUT) { - - rn = ctx->node; - - if (rn) { - p = &rn->waiting; - w = rn->waiting; - - while (w) { - if (w == ctx) { - *p = w->next; - - goto done; - } - - p = &w->next; - w = w->next; - } - - ngx_log_error(NGX_LOG_ALERT, r->log, 0, - "could not cancel %V resolving", &ctx->name); - } - } - -done: - - if (ctx->service.len) { - ngx_resolver_expire(r, &r->srv_rbtree, &r->srv_expire_queue); - - } else { - ngx_resolver_expire(r, &r->name_rbtree, &r->name_expire_queue); - } - - /* unlock name mutex */ - - /* lock alloc mutex */ - - if (ctx->event) { - ngx_resolver_free_locked(r, ctx->event); - } - - ngx_resolver_free_locked(r, ctx); - - /* unlock alloc mutex */ - - if (r->event->timer_set && ngx_resolver_resend_empty(r)) { - ngx_del_timer(r->event); - } -} - - -static ngx_int_t -ngx_resolve_name_locked(ngx_resolver_t *r, ngx_resolver_ctx_t *ctx, - ngx_str_t *name) -{ - uint32_t hash; - ngx_int_t rc; - ngx_str_t cname; - ngx_uint_t i, naddrs; - ngx_queue_t *resend_queue, *expire_queue; - ngx_rbtree_t *tree; - ngx_resolver_ctx_t *next, *last; - ngx_resolver_addr_t *addrs; - ngx_resolver_node_t *rn; - - ngx_strlow(name->data, name->data, name->len); - - hash = ngx_crc32_short(name->data, name->len); - - if (ctx->service.len) { - rn = ngx_resolver_lookup_srv(r, name, hash); - - tree = &r->srv_rbtree; - resend_queue = &r->srv_resend_queue; - expire_queue = &r->srv_expire_queue; - - } else { - rn = ngx_resolver_lookup_name(r, name, hash); - - tree = &r->name_rbtree; - resend_queue = &r->name_resend_queue; - expire_queue = &r->name_expire_queue; - } - - if (rn) { - - /* ctx can be a list after NGX_RESOLVE_CNAME */ - for (last = ctx; last->next; last = last->next); - - if (rn->valid >= ngx_time()) { - - ngx_log_debug0(NGX_LOG_DEBUG_CORE, r->log, 0, "resolve cached"); - - ngx_queue_remove(&rn->queue); - - rn->expire = ngx_time() + r->expire; - - ngx_queue_insert_head(expire_queue, &rn->queue); - - naddrs = (rn->naddrs == (u_short) -1) ? 0 : rn->naddrs; -#if (NGX_HAVE_INET6) - naddrs += (rn->naddrs6 == (u_short) -1) ? 0 : rn->naddrs6; -#endif - - if (naddrs) { - - if (naddrs == 1 && rn->naddrs == 1) { - addrs = NULL; - - } else { - addrs = ngx_resolver_export(r, rn, 1); - if (addrs == NULL) { - return NGX_ERROR; - } - } - - last->next = rn->waiting; - rn->waiting = NULL; - - /* unlock name mutex */ - - do { - ctx->state = NGX_OK; - ctx->valid = rn->valid; - ctx->naddrs = naddrs; - - if (addrs == NULL) { - ctx->addrs = &ctx->addr; - ctx->addr.sockaddr = (struct sockaddr *) &ctx->sin; - ctx->addr.socklen = sizeof(struct sockaddr_in); - ngx_memzero(&ctx->sin, sizeof(struct sockaddr_in)); - ctx->sin.sin_family = AF_INET; - ctx->sin.sin_addr.s_addr = rn->u.addr; - - } else { - ctx->addrs = addrs; - } - - next = ctx->next; - - ctx->handler(ctx); - - ctx = next; - } while (ctx); - - if (addrs != NULL) { - ngx_resolver_free(r, addrs->sockaddr); - ngx_resolver_free(r, addrs); - } - - return NGX_OK; - } - - if (rn->nsrvs) { - last->next = rn->waiting; - rn->waiting = NULL; - - /* unlock name mutex */ - - do { - next = ctx->next; - - ngx_resolver_resolve_srv_names(ctx, rn); - - ctx = next; - } while (ctx); - - return NGX_OK; - } - - /* NGX_RESOLVE_CNAME */ - - if (ctx->recursion++ < NGX_RESOLVER_MAX_RECURSION) { - - cname.len = rn->cnlen; - cname.data = rn->u.cname; - - return ngx_resolve_name_locked(r, ctx, &cname); - } - - last->next = rn->waiting; - rn->waiting = NULL; - - /* unlock name mutex */ - - do { - ctx->state = NGX_RESOLVE_NXDOMAIN; - ctx->valid = ngx_time() + (r->valid ? r->valid : 10); - next = ctx->next; - - ctx->handler(ctx); - - ctx = next; - } while (ctx); - - return NGX_OK; - } - - if (rn->waiting) { - if (ngx_resolver_set_timeout(r, ctx) != NGX_OK) { - return NGX_ERROR; - } - - last->next = rn->waiting; - rn->waiting = ctx; - ctx->state = NGX_AGAIN; - ctx->async = 1; - - do { - ctx->node = rn; - ctx = ctx->next; - } while (ctx); - - return NGX_AGAIN; - } - - ngx_queue_remove(&rn->queue); - - /* lock alloc mutex */ - - if (rn->query) { - ngx_resolver_free_locked(r, rn->query); - rn->query = NULL; -#if (NGX_HAVE_INET6) - rn->query6 = NULL; -#endif - } - - if (rn->cnlen) { - ngx_resolver_free_locked(r, rn->u.cname); - } - - if (rn->naddrs > 1 && rn->naddrs != (u_short) -1) { - ngx_resolver_free_locked(r, rn->u.addrs); - } - -#if (NGX_HAVE_INET6) - if (rn->naddrs6 > 1 && rn->naddrs6 != (u_short) -1) { - ngx_resolver_free_locked(r, rn->u6.addrs6); - } -#endif - - if (rn->nsrvs) { - for (i = 0; i < (ngx_uint_t) rn->nsrvs; i++) { - if (rn->u.srvs[i].name.data) { - ngx_resolver_free_locked(r, rn->u.srvs[i].name.data); - } - } - - ngx_resolver_free_locked(r, rn->u.srvs); - } - - /* unlock alloc mutex */ - - } else { - - rn = ngx_resolver_alloc(r, sizeof(ngx_resolver_node_t)); - if (rn == NULL) { - return NGX_ERROR; - } - - rn->name = ngx_resolver_dup(r, name->data, name->len); - if (rn->name == NULL) { - ngx_resolver_free(r, rn); - return NGX_ERROR; - } - - rn->node.key = hash; - rn->nlen = (u_short) name->len; - rn->query = NULL; -#if (NGX_HAVE_INET6) - rn->query6 = NULL; -#endif - - ngx_rbtree_insert(tree, &rn->node); - } - - if (ctx->service.len) { - rc = ngx_resolver_create_srv_query(r, rn, name); - - } else { - rc = ngx_resolver_create_name_query(r, rn, name); - } - - if (rc == NGX_ERROR) { - goto failed; - } - - if (rc == NGX_DECLINED) { - ngx_rbtree_delete(tree, &rn->node); - - ngx_resolver_free(r, rn->query); - ngx_resolver_free(r, rn->name); - ngx_resolver_free(r, rn); - - do { - ctx->state = NGX_RESOLVE_NXDOMAIN; - next = ctx->next; - - ctx->handler(ctx); - - ctx = next; - } while (ctx); - - return NGX_OK; - } - - rn->last_connection = r->last_connection++; - if (r->last_connection == r->connections.nelts) { - r->last_connection = 0; - } - - rn->naddrs = r->ipv4 ? (u_short) -1 : 0; - rn->tcp = 0; -#if (NGX_HAVE_INET6) - rn->naddrs6 = r->ipv6 ? (u_short) -1 : 0; - rn->tcp6 = 0; -#endif - rn->nsrvs = 0; - - if (ngx_resolver_send_query(r, rn) != NGX_OK) { - - /* immediately retry once on failure */ - - rn->last_connection++; - if (rn->last_connection == r->connections.nelts) { - rn->last_connection = 0; - } - - (void) ngx_resolver_send_query(r, rn); - } - - if (ngx_resolver_set_timeout(r, ctx) != NGX_OK) { - goto failed; - } - - if (ngx_resolver_resend_empty(r)) { - ngx_add_timer(r->event, (ngx_msec_t) (r->resend_timeout * 1000)); - } - - rn->expire = ngx_time() + r->resend_timeout; - - ngx_queue_insert_head(resend_queue, &rn->queue); - - rn->code = 0; - rn->cnlen = 0; - rn->valid = 0; - rn->ttl = NGX_MAX_UINT32_VALUE; - rn->waiting = ctx; - - ctx->state = NGX_AGAIN; - ctx->async = 1; - - do { - ctx->node = rn; - ctx = ctx->next; - } while (ctx); - - return NGX_AGAIN; - -failed: - - ngx_rbtree_delete(tree, &rn->node); - - if (rn->query) { - ngx_resolver_free(r, rn->query); - } - - ngx_resolver_free(r, rn->name); - - ngx_resolver_free(r, rn); - - return NGX_ERROR; -} - - -ngx_int_t -ngx_resolve_addr(ngx_resolver_ctx_t *ctx) -{ - u_char *name; - in_addr_t addr; - ngx_queue_t *resend_queue, *expire_queue; - ngx_rbtree_t *tree; - ngx_resolver_t *r; - struct sockaddr_in *sin; - ngx_resolver_node_t *rn; -#if (NGX_HAVE_INET6) - uint32_t hash; - struct sockaddr_in6 *sin6; -#endif - -#if (NGX_SUPPRESS_WARN) - addr = 0; -#if (NGX_HAVE_INET6) - hash = 0; - sin6 = NULL; -#endif -#endif - - r = ctx->resolver; - - switch (ctx->addr.sockaddr->sa_family) { - -#if (NGX_HAVE_INET6) - case AF_INET6: - sin6 = (struct sockaddr_in6 *) ctx->addr.sockaddr; - hash = ngx_crc32_short(sin6->sin6_addr.s6_addr, 16); - - /* lock addr mutex */ - - rn = ngx_resolver_lookup_addr6(r, &sin6->sin6_addr, hash); - - tree = &r->addr6_rbtree; - resend_queue = &r->addr6_resend_queue; - expire_queue = &r->addr6_expire_queue; - - break; -#endif - - default: /* AF_INET */ - sin = (struct sockaddr_in *) ctx->addr.sockaddr; - addr = ntohl(sin->sin_addr.s_addr); - - /* lock addr mutex */ - - rn = ngx_resolver_lookup_addr(r, addr); - - tree = &r->addr_rbtree; - resend_queue = &r->addr_resend_queue; - expire_queue = &r->addr_expire_queue; - } - - if (rn) { - - if (rn->valid >= ngx_time()) { - - ngx_log_debug0(NGX_LOG_DEBUG_CORE, r->log, 0, "resolve cached"); - - ngx_queue_remove(&rn->queue); - - rn->expire = ngx_time() + r->expire; - - ngx_queue_insert_head(expire_queue, &rn->queue); - - name = ngx_resolver_dup(r, rn->name, rn->nlen); - if (name == NULL) { - ngx_resolver_free(r, ctx); - return NGX_ERROR; - } - - ctx->name.len = rn->nlen; - ctx->name.data = name; - - /* unlock addr mutex */ - - ctx->state = NGX_OK; - ctx->valid = rn->valid; - - ctx->handler(ctx); - - ngx_resolver_free(r, name); - - return NGX_OK; - } - - if (rn->waiting) { - if (ngx_resolver_set_timeout(r, ctx) != NGX_OK) { - return NGX_ERROR; - } - - ctx->next = rn->waiting; - rn->waiting = ctx; - ctx->state = NGX_AGAIN; - ctx->async = 1; - ctx->node = rn; - - /* unlock addr mutex */ - - return NGX_OK; - } - - ngx_queue_remove(&rn->queue); - - ngx_resolver_free(r, rn->query); - rn->query = NULL; -#if (NGX_HAVE_INET6) - rn->query6 = NULL; -#endif - - } else { - rn = ngx_resolver_alloc(r, sizeof(ngx_resolver_node_t)); - if (rn == NULL) { - goto failed; - } - - switch (ctx->addr.sockaddr->sa_family) { - -#if (NGX_HAVE_INET6) - case AF_INET6: - rn->addr6 = sin6->sin6_addr; - rn->node.key = hash; - break; -#endif - - default: /* AF_INET */ - rn->node.key = addr; - } - - rn->query = NULL; -#if (NGX_HAVE_INET6) - rn->query6 = NULL; -#endif - - ngx_rbtree_insert(tree, &rn->node); - } - - if (ngx_resolver_create_addr_query(r, rn, &ctx->addr) != NGX_OK) { - goto failed; - } - - rn->last_connection = r->last_connection++; - if (r->last_connection == r->connections.nelts) { - r->last_connection = 0; - } - - rn->naddrs = (u_short) -1; - rn->tcp = 0; -#if (NGX_HAVE_INET6) - rn->naddrs6 = (u_short) -1; - rn->tcp6 = 0; -#endif - rn->nsrvs = 0; - - if (ngx_resolver_send_query(r, rn) != NGX_OK) { - - /* immediately retry once on failure */ - - rn->last_connection++; - if (rn->last_connection == r->connections.nelts) { - rn->last_connection = 0; - } - - (void) ngx_resolver_send_query(r, rn); - } - - if (ngx_resolver_set_timeout(r, ctx) != NGX_OK) { - goto failed; - } - - if (ngx_resolver_resend_empty(r)) { - ngx_add_timer(r->event, (ngx_msec_t) (r->resend_timeout * 1000)); - } - - rn->expire = ngx_time() + r->resend_timeout; - - ngx_queue_insert_head(resend_queue, &rn->queue); - - rn->code = 0; - rn->cnlen = 0; - rn->name = NULL; - rn->nlen = 0; - rn->valid = 0; - rn->ttl = NGX_MAX_UINT32_VALUE; - rn->waiting = ctx; - - /* unlock addr mutex */ - - ctx->state = NGX_AGAIN; - ctx->async = 1; - ctx->node = rn; - - return NGX_OK; - -failed: - - if (rn) { - ngx_rbtree_delete(tree, &rn->node); - - if (rn->query) { - ngx_resolver_free(r, rn->query); - } - - ngx_resolver_free(r, rn); - } - - /* unlock addr mutex */ - - if (ctx->event) { - ngx_resolver_free(r, ctx->event); - } - - ngx_resolver_free(r, ctx); - - return NGX_ERROR; -} - - -void -ngx_resolve_addr_done(ngx_resolver_ctx_t *ctx) -{ - ngx_queue_t *expire_queue; - ngx_rbtree_t *tree; - ngx_resolver_t *r; - ngx_resolver_ctx_t *w, **p; - ngx_resolver_node_t *rn; - - r = ctx->resolver; - - switch (ctx->addr.sockaddr->sa_family) { - -#if (NGX_HAVE_INET6) - case AF_INET6: - tree = &r->addr6_rbtree; - expire_queue = &r->addr6_expire_queue; - break; -#endif - - default: /* AF_INET */ - tree = &r->addr_rbtree; - expire_queue = &r->addr_expire_queue; - } - - ngx_log_debug1(NGX_LOG_DEBUG_CORE, r->log, 0, - "resolve addr done: %i", ctx->state); - - if (ctx->event && ctx->event->timer_set) { - ngx_del_timer(ctx->event); - } - - /* lock addr mutex */ - - if (ctx->state == NGX_AGAIN || ctx->state == NGX_RESOLVE_TIMEDOUT) { - - rn = ctx->node; - - if (rn) { - p = &rn->waiting; - w = rn->waiting; - - while (w) { - if (w == ctx) { - *p = w->next; - - goto done; - } - - p = &w->next; - w = w->next; - } - } - - { - u_char text[NGX_SOCKADDR_STRLEN]; - ngx_str_t addrtext; - - addrtext.data = text; - addrtext.len = ngx_sock_ntop(ctx->addr.sockaddr, ctx->addr.socklen, - text, NGX_SOCKADDR_STRLEN, 0); - - ngx_log_error(NGX_LOG_ALERT, r->log, 0, - "could not cancel %V resolving", &addrtext); - } - } - -done: - - ngx_resolver_expire(r, tree, expire_queue); - - /* unlock addr mutex */ - - /* lock alloc mutex */ - - if (ctx->event) { - ngx_resolver_free_locked(r, ctx->event); - } - - ngx_resolver_free_locked(r, ctx); - - /* unlock alloc mutex */ - - if (r->event->timer_set && ngx_resolver_resend_empty(r)) { - ngx_del_timer(r->event); - } -} - - -static void -ngx_resolver_expire(ngx_resolver_t *r, ngx_rbtree_t *tree, ngx_queue_t *queue) -{ - time_t now; - ngx_uint_t i; - ngx_queue_t *q; - ngx_resolver_node_t *rn; - - ngx_log_debug0(NGX_LOG_DEBUG_CORE, r->log, 0, "resolver expire"); - - now = ngx_time(); - - for (i = 0; i < 2; i++) { - if (ngx_queue_empty(queue)) { - return; - } - - q = ngx_queue_last(queue); - - rn = ngx_queue_data(q, ngx_resolver_node_t, queue); - - if (now <= rn->expire) { - return; - } - - ngx_log_debug2(NGX_LOG_DEBUG_CORE, r->log, 0, - "resolver expire \"%*s\"", (size_t) rn->nlen, rn->name); - - ngx_queue_remove(q); - - ngx_rbtree_delete(tree, &rn->node); - - ngx_resolver_free_node(r, rn); - } -} - - -static ngx_int_t -ngx_resolver_send_query(ngx_resolver_t *r, ngx_resolver_node_t *rn) -{ - ngx_int_t rc; - ngx_resolver_connection_t *rec; - - rec = r->connections.elts; - rec = &rec[rn->last_connection]; - - if (rec->log.handler == NULL) { - rec->log = *r->log; - rec->log.handler = ngx_resolver_log_error; - rec->log.data = rec; - rec->log.action = "resolving"; - } - - if (rn->query && rn->naddrs == (u_short) -1) { - rc = rn->tcp ? ngx_resolver_send_tcp_query(r, rec, rn->query, rn->qlen) - : ngx_resolver_send_udp_query(r, rec, rn->query, rn->qlen); - - if (rc != NGX_OK) { - return rc; - } - } - -#if (NGX_HAVE_INET6) - - if (rn->query6 && rn->naddrs6 == (u_short) -1) { - rc = rn->tcp6 - ? ngx_resolver_send_tcp_query(r, rec, rn->query6, rn->qlen) - : ngx_resolver_send_udp_query(r, rec, rn->query6, rn->qlen); - - if (rc != NGX_OK) { - return rc; - } - } - -#endif - - return NGX_OK; -} - - -static ngx_int_t -ngx_resolver_send_udp_query(ngx_resolver_t *r, ngx_resolver_connection_t *rec, - u_char *query, u_short qlen) -{ - ssize_t n; - - if (rec->udp == NULL) { - if (ngx_udp_connect(rec) != NGX_OK) { - return NGX_ERROR; - } - - rec->udp->data = rec; - rec->udp->read->handler = ngx_resolver_udp_read; - rec->udp->read->resolver = 1; - } - - n = ngx_send(rec->udp, query, qlen); - - if (n == NGX_ERROR) { - goto failed; - } - - if ((size_t) n != (size_t) qlen) { - ngx_log_error(NGX_LOG_CRIT, &rec->log, 0, "send() incomplete"); - goto failed; - } - - return NGX_OK; - -failed: - - ngx_close_connection(rec->udp); - rec->udp = NULL; - - return NGX_ERROR; -} - - -static ngx_int_t -ngx_resolver_send_tcp_query(ngx_resolver_t *r, ngx_resolver_connection_t *rec, - u_char *query, u_short qlen) -{ - ngx_buf_t *b; - ngx_int_t rc; - - rc = NGX_OK; - - if (rec->tcp == NULL) { - b = rec->read_buf; - - if (b == NULL) { - b = ngx_resolver_calloc(r, sizeof(ngx_buf_t)); - if (b == NULL) { - return NGX_ERROR; - } - - b->start = ngx_resolver_alloc(r, NGX_RESOLVER_TCP_RSIZE); - if (b->start == NULL) { - ngx_resolver_free(r, b); - return NGX_ERROR; - } - - b->end = b->start + NGX_RESOLVER_TCP_RSIZE; - - rec->read_buf = b; - } - - b->pos = b->start; - b->last = b->start; - - b = rec->write_buf; - - if (b == NULL) { - b = ngx_resolver_calloc(r, sizeof(ngx_buf_t)); - if (b == NULL) { - return NGX_ERROR; - } - - b->start = ngx_resolver_alloc(r, NGX_RESOLVER_TCP_WSIZE); - if (b->start == NULL) { - ngx_resolver_free(r, b); - return NGX_ERROR; - } - - b->end = b->start + NGX_RESOLVER_TCP_WSIZE; - - rec->write_buf = b; - } - - b->pos = b->start; - b->last = b->start; - - rc = ngx_tcp_connect(rec); - if (rc == NGX_ERROR) { - return NGX_ERROR; - } - - rec->tcp->data = rec; - rec->tcp->write->handler = ngx_resolver_tcp_write; - rec->tcp->write->cancelable = 1; - rec->tcp->read->handler = ngx_resolver_tcp_read; - rec->tcp->read->resolver = 1; - - ngx_add_timer(rec->tcp->write, (ngx_msec_t) (r->tcp_timeout * 1000)); - } - - b = rec->write_buf; - - if (b->end - b->last < 2 + qlen) { - ngx_log_error(NGX_LOG_CRIT, &rec->log, 0, "buffer overflow"); - return NGX_ERROR; - } - - *b->last++ = (u_char) (qlen >> 8); - *b->last++ = (u_char) qlen; - b->last = ngx_cpymem(b->last, query, qlen); - - if (rc == NGX_OK) { - ngx_resolver_tcp_write(rec->tcp->write); - } - - return NGX_OK; -} - - -static void -ngx_resolver_resend_handler(ngx_event_t *ev) -{ - time_t timer, atimer, stimer, ntimer; -#if (NGX_HAVE_INET6) - time_t a6timer; -#endif - ngx_resolver_t *r; - - r = ev->data; - - ngx_log_debug0(NGX_LOG_DEBUG_CORE, r->log, 0, - "resolver resend handler"); - - /* lock name mutex */ - - ntimer = ngx_resolver_resend(r, &r->name_rbtree, &r->name_resend_queue); - - stimer = ngx_resolver_resend(r, &r->srv_rbtree, &r->srv_resend_queue); - - /* unlock name mutex */ - - /* lock addr mutex */ - - atimer = ngx_resolver_resend(r, &r->addr_rbtree, &r->addr_resend_queue); - - /* unlock addr mutex */ - -#if (NGX_HAVE_INET6) - - /* lock addr6 mutex */ - - a6timer = ngx_resolver_resend(r, &r->addr6_rbtree, &r->addr6_resend_queue); - - /* unlock addr6 mutex */ - -#endif - - timer = ntimer; - - if (timer == 0) { - timer = atimer; - - } else if (atimer) { - timer = ngx_min(timer, atimer); - } - - if (timer == 0) { - timer = stimer; - - } else if (stimer) { - timer = ngx_min(timer, stimer); - } - -#if (NGX_HAVE_INET6) - - if (timer == 0) { - timer = a6timer; - - } else if (a6timer) { - timer = ngx_min(timer, a6timer); - } - -#endif - - if (timer) { - ngx_add_timer(r->event, (ngx_msec_t) (timer * 1000)); - } -} - - -static time_t -ngx_resolver_resend(ngx_resolver_t *r, ngx_rbtree_t *tree, ngx_queue_t *queue) -{ - time_t now; - ngx_queue_t *q; - ngx_resolver_node_t *rn; - - now = ngx_time(); - - for ( ;; ) { - if (ngx_queue_empty(queue)) { - return 0; - } - - q = ngx_queue_last(queue); - - rn = ngx_queue_data(q, ngx_resolver_node_t, queue); - - if (now < rn->expire) { - return rn->expire - now; - } - - ngx_log_debug3(NGX_LOG_DEBUG_CORE, r->log, 0, - "resolver resend \"%*s\" %p", - (size_t) rn->nlen, rn->name, rn->waiting); - - ngx_queue_remove(q); - - if (rn->waiting) { - - if (++rn->last_connection == r->connections.nelts) { - rn->last_connection = 0; - } - - (void) ngx_resolver_send_query(r, rn); - - rn->expire = now + r->resend_timeout; - - ngx_queue_insert_head(queue, q); - - continue; - } - - ngx_rbtree_delete(tree, &rn->node); - - ngx_resolver_free_node(r, rn); - } -} - - -static ngx_uint_t -ngx_resolver_resend_empty(ngx_resolver_t *r) -{ - return ngx_queue_empty(&r->name_resend_queue) - && ngx_queue_empty(&r->srv_resend_queue) -#if (NGX_HAVE_INET6) - && ngx_queue_empty(&r->addr6_resend_queue) -#endif - && ngx_queue_empty(&r->addr_resend_queue); -} - - -static void -ngx_resolver_udp_read(ngx_event_t *rev) -{ - ssize_t n; - ngx_connection_t *c; - ngx_resolver_connection_t *rec; - u_char buf[NGX_RESOLVER_UDP_SIZE]; - - c = rev->data; - rec = c->data; - - do { - n = ngx_udp_recv(c, buf, NGX_RESOLVER_UDP_SIZE); - - if (n == NGX_AGAIN) { - break; - } - - if (n == NGX_ERROR) { - goto failed; - } - - ngx_resolver_process_response(rec->resolver, buf, n, 0); - - } while (rev->ready); - - if (ngx_handle_read_event(rev, 0) != NGX_OK) { - goto failed; - } - - return; - -failed: - - ngx_close_connection(rec->udp); - rec->udp = NULL; -} - - -static void -ngx_resolver_tcp_write(ngx_event_t *wev) -{ - off_t sent; - ssize_t n; - ngx_buf_t *b; - ngx_resolver_t *r; - ngx_connection_t *c; - ngx_resolver_connection_t *rec; - - c = wev->data; - rec = c->data; - b = rec->write_buf; - r = rec->resolver; - - if (wev->timedout) { - goto failed; - } - - sent = c->sent; - - while (wev->ready && b->pos < b->last) { - n = ngx_send(c, b->pos, b->last - b->pos); - - if (n == NGX_AGAIN) { - break; - } - - if (n == NGX_ERROR) { - goto failed; - } - - b->pos += n; - } - - if (b->pos != b->start) { - b->last = ngx_movemem(b->start, b->pos, b->last - b->pos); - b->pos = b->start; - } - - if (c->sent != sent) { - ngx_add_timer(wev, (ngx_msec_t) (r->tcp_timeout * 1000)); - } - - if (ngx_handle_write_event(wev, 0) != NGX_OK) { - goto failed; - } - - return; - -failed: - - ngx_close_connection(c); - rec->tcp = NULL; -} - - -static void -ngx_resolver_tcp_read(ngx_event_t *rev) -{ - u_char *p; - size_t size; - ssize_t n; - u_short qlen; - ngx_buf_t *b; - ngx_resolver_t *r; - ngx_connection_t *c; - ngx_resolver_connection_t *rec; - - c = rev->data; - rec = c->data; - b = rec->read_buf; - r = rec->resolver; - - while (rev->ready) { - n = ngx_recv(c, b->last, b->end - b->last); - - if (n == NGX_AGAIN) { - break; - } - - if (n == NGX_ERROR || n == 0) { - goto failed; - } - - b->last += n; - - for ( ;; ) { - p = b->pos; - size = b->last - p; - - if (size < 2) { - break; - } - - qlen = (u_short) *p++ << 8; - qlen += *p++; - - if (size < (size_t) (2 + qlen)) { - break; - } - - ngx_resolver_process_response(r, p, qlen, 1); - - b->pos += 2 + qlen; - } - - if (b->pos != b->start) { - b->last = ngx_movemem(b->start, b->pos, b->last - b->pos); - b->pos = b->start; - } - } - - if (ngx_handle_read_event(rev, 0) != NGX_OK) { - goto failed; - } - - return; - -failed: - - ngx_close_connection(c); - rec->tcp = NULL; -} - - -static void -ngx_resolver_process_response(ngx_resolver_t *r, u_char *buf, size_t n, - ngx_uint_t tcp) -{ - char *err; - ngx_uint_t i, times, ident, qident, flags, code, nqs, nan, trunc, - qtype, qclass; -#if (NGX_HAVE_INET6) - ngx_uint_t qident6; -#endif - ngx_queue_t *q; - ngx_resolver_qs_t *qs; - ngx_resolver_hdr_t *response; - ngx_resolver_node_t *rn; - - if (n < sizeof(ngx_resolver_hdr_t)) { - goto short_response; - } - - response = (ngx_resolver_hdr_t *) buf; - - ident = (response->ident_hi << 8) + response->ident_lo; - flags = (response->flags_hi << 8) + response->flags_lo; - nqs = (response->nqs_hi << 8) + response->nqs_lo; - nan = (response->nan_hi << 8) + response->nan_lo; - trunc = flags & 0x0200; - - ngx_log_debug6(NGX_LOG_DEBUG_CORE, r->log, 0, - "resolver DNS response %ui fl:%04Xi %ui/%ui/%ud/%ud", - ident, flags, nqs, nan, - (response->nns_hi << 8) + response->nns_lo, - (response->nar_hi << 8) + response->nar_lo); - - /* response to a standard query */ - if ((flags & 0xf870) != 0x8000 || (trunc && tcp)) { - ngx_log_error(r->log_level, r->log, 0, - "invalid %s DNS response %ui fl:%04Xi", - tcp ? "TCP" : "UDP", ident, flags); - return; - } - - code = flags & 0xf; - - if (code == NGX_RESOLVE_FORMERR) { - - times = 0; - - for (q = ngx_queue_head(&r->name_resend_queue); - q != ngx_queue_sentinel(&r->name_resend_queue) && times++ < 100; - q = ngx_queue_next(q)) - { - rn = ngx_queue_data(q, ngx_resolver_node_t, queue); - - if (rn->query) { - qident = (rn->query[0] << 8) + rn->query[1]; - - if (qident == ident) { - goto dns_error_name; - } - } - -#if (NGX_HAVE_INET6) - if (rn->query6) { - qident6 = (rn->query6[0] << 8) + rn->query6[1]; - - if (qident6 == ident) { - goto dns_error_name; - } - } -#endif - } - - goto dns_error; - } - - if (code > NGX_RESOLVE_REFUSED) { - goto dns_error; - } - - if (nqs != 1) { - err = "invalid number of questions in DNS response"; - goto done; - } - - i = sizeof(ngx_resolver_hdr_t); - - while (i < (ngx_uint_t) n) { - - if (buf[i] & 0xc0) { - err = "unexpected compression pointer in DNS response"; - goto done; - } - - if (buf[i] == '\0') { - goto found; - } - - i += 1 + buf[i]; - } - - goto short_response; - -found: - - if (i++ == sizeof(ngx_resolver_hdr_t)) { - err = "zero-length domain name in DNS response"; - goto done; - } - - if (i + sizeof(ngx_resolver_qs_t) + nan * (2 + sizeof(ngx_resolver_an_t)) - > (ngx_uint_t) n) - { - goto short_response; - } - - qs = (ngx_resolver_qs_t *) &buf[i]; - - qtype = (qs->type_hi << 8) + qs->type_lo; - qclass = (qs->class_hi << 8) + qs->class_lo; - - ngx_log_debug2(NGX_LOG_DEBUG_CORE, r->log, 0, - "resolver DNS response qt:%ui cl:%ui", qtype, qclass); - - if (qclass != 1) { - ngx_log_error(r->log_level, r->log, 0, - "unknown query class %ui in DNS response", qclass); - return; - } - - switch (qtype) { - - case NGX_RESOLVE_A: -#if (NGX_HAVE_INET6) - case NGX_RESOLVE_AAAA: -#endif - - ngx_resolver_process_a(r, buf, n, ident, code, qtype, nan, trunc, - i + sizeof(ngx_resolver_qs_t)); - - break; - - case NGX_RESOLVE_SRV: - - ngx_resolver_process_srv(r, buf, n, ident, code, nan, trunc, - i + sizeof(ngx_resolver_qs_t)); - - break; - - case NGX_RESOLVE_PTR: - - ngx_resolver_process_ptr(r, buf, n, ident, code, nan); - - break; - - default: - ngx_log_error(r->log_level, r->log, 0, - "unknown query type %ui in DNS response", qtype); - return; - } - - return; - -short_response: - - err = "short DNS response"; - -done: - - ngx_log_error(r->log_level, r->log, 0, err); - - return; - -dns_error_name: - - ngx_log_error(r->log_level, r->log, 0, - "DNS error (%ui: %s), query id:%ui, name:\"%*s\"", - code, ngx_resolver_strerror(code), ident, - (size_t) rn->nlen, rn->name); - return; - -dns_error: - - ngx_log_error(r->log_level, r->log, 0, - "DNS error (%ui: %s), query id:%ui", - code, ngx_resolver_strerror(code), ident); - return; -} - - -static void -ngx_resolver_process_a(ngx_resolver_t *r, u_char *buf, size_t n, - ngx_uint_t ident, ngx_uint_t code, ngx_uint_t qtype, - ngx_uint_t nan, ngx_uint_t trunc, ngx_uint_t ans) -{ - char *err; - u_char *cname; - size_t len; - int32_t ttl; - uint32_t hash; - in_addr_t *addr; - ngx_str_t name; - ngx_uint_t type, class, qident, naddrs, a, i, j, start; -#if (NGX_HAVE_INET6) - struct in6_addr *addr6; -#endif - ngx_resolver_an_t *an; - ngx_resolver_ctx_t *ctx, *next; - ngx_resolver_node_t *rn; - ngx_resolver_addr_t *addrs; - ngx_resolver_connection_t *rec; - - if (ngx_resolver_copy(r, &name, buf, - buf + sizeof(ngx_resolver_hdr_t), buf + n) - != NGX_OK) - { - return; - } - - ngx_log_debug1(NGX_LOG_DEBUG_CORE, r->log, 0, "resolver qs:%V", &name); - - hash = ngx_crc32_short(name.data, name.len); - - /* lock name mutex */ - - rn = ngx_resolver_lookup_name(r, &name, hash); - - if (rn == NULL) { - ngx_log_error(r->log_level, r->log, 0, - "unexpected DNS response for %V", &name); - ngx_resolver_free(r, name.data); - goto failed; - } - - switch (qtype) { - -#if (NGX_HAVE_INET6) - case NGX_RESOLVE_AAAA: - - if (rn->query6 == NULL || rn->naddrs6 != (u_short) -1) { - ngx_log_error(r->log_level, r->log, 0, - "unexpected DNS response for %V", &name); - ngx_resolver_free(r, name.data); - goto failed; - } - - if (trunc && rn->tcp6) { - ngx_resolver_free(r, name.data); - goto failed; - } - - qident = (rn->query6[0] << 8) + rn->query6[1]; - - break; -#endif - - default: /* NGX_RESOLVE_A */ - - if (rn->query == NULL || rn->naddrs != (u_short) -1) { - ngx_log_error(r->log_level, r->log, 0, - "unexpected DNS response for %V", &name); - ngx_resolver_free(r, name.data); - goto failed; - } - - if (trunc && rn->tcp) { - ngx_resolver_free(r, name.data); - goto failed; - } - - qident = (rn->query[0] << 8) + rn->query[1]; - } - - if (ident != qident) { - ngx_log_error(r->log_level, r->log, 0, - "wrong ident %ui in DNS response for %V, expect %ui", - ident, &name, qident); - ngx_resolver_free(r, name.data); - goto failed; - } - - ngx_resolver_free(r, name.data); - - if (trunc) { - - ngx_queue_remove(&rn->queue); - - if (rn->waiting == NULL) { - ngx_rbtree_delete(&r->name_rbtree, &rn->node); - ngx_resolver_free_node(r, rn); - goto next; - } - - rec = r->connections.elts; - rec = &rec[rn->last_connection]; - - switch (qtype) { - -#if (NGX_HAVE_INET6) - case NGX_RESOLVE_AAAA: - - rn->tcp6 = 1; - - (void) ngx_resolver_send_tcp_query(r, rec, rn->query6, rn->qlen); - - break; -#endif - - default: /* NGX_RESOLVE_A */ - - rn->tcp = 1; - - (void) ngx_resolver_send_tcp_query(r, rec, rn->query, rn->qlen); - } - - rn->expire = ngx_time() + r->resend_timeout; - - ngx_queue_insert_head(&r->name_resend_queue, &rn->queue); - - goto next; - } - - if (code == 0 && rn->code) { - code = rn->code; - } - - if (code == 0 && nan == 0) { - -#if (NGX_HAVE_INET6) - switch (qtype) { - - case NGX_RESOLVE_AAAA: - - rn->naddrs6 = 0; - - if (rn->naddrs == (u_short) -1) { - goto next; - } - - if (rn->naddrs) { - goto export; - } - - break; - - default: /* NGX_RESOLVE_A */ - - rn->naddrs = 0; - - if (rn->naddrs6 == (u_short) -1) { - goto next; - } - - if (rn->naddrs6) { - goto export; - } - } -#endif - - code = NGX_RESOLVE_NXDOMAIN; - } - - if (code) { - -#if (NGX_HAVE_INET6) - switch (qtype) { - - case NGX_RESOLVE_AAAA: - - rn->naddrs6 = 0; - - if (rn->naddrs == (u_short) -1) { - rn->code = (u_char) code; - goto next; - } - - break; - - default: /* NGX_RESOLVE_A */ - - rn->naddrs = 0; - - if (rn->naddrs6 == (u_short) -1) { - rn->code = (u_char) code; - goto next; - } - } -#endif - - next = rn->waiting; - rn->waiting = NULL; - - ngx_queue_remove(&rn->queue); - - ngx_rbtree_delete(&r->name_rbtree, &rn->node); - - /* unlock name mutex */ - - while (next) { - ctx = next; - ctx->state = code; - ctx->valid = ngx_time() + (r->valid ? r->valid : 10); - next = ctx->next; - - ctx->handler(ctx); - } - - ngx_resolver_free_node(r, rn); - - return; - } - - i = ans; - naddrs = 0; - cname = NULL; - - for (a = 0; a < nan; a++) { - - start = i; - - while (i < n) { - - if (buf[i] & 0xc0) { - i += 2; - goto found; - } - - if (buf[i] == 0) { - i++; - goto test_length; - } - - i += 1 + buf[i]; - } - - goto short_response; - - test_length: - - if (i - start < 2) { - err = "invalid name in DNS response"; - goto invalid; - } - - found: - - if (i + sizeof(ngx_resolver_an_t) >= n) { - goto short_response; - } - - an = (ngx_resolver_an_t *) &buf[i]; - - type = (an->type_hi << 8) + an->type_lo; - class = (an->class_hi << 8) + an->class_lo; - len = (an->len_hi << 8) + an->len_lo; - ttl = (an->ttl[0] << 24) + (an->ttl[1] << 16) - + (an->ttl[2] << 8) + (an->ttl[3]); - - if (class != 1) { - ngx_log_error(r->log_level, r->log, 0, - "unexpected RR class %ui in DNS response", class); - goto failed; - } - - if (ttl < 0) { - ttl = 0; - } - - rn->ttl = ngx_min(rn->ttl, (uint32_t) ttl); - - i += sizeof(ngx_resolver_an_t); - - switch (type) { - - case NGX_RESOLVE_A: - - if (qtype != NGX_RESOLVE_A) { - err = "unexpected A record in DNS response"; - goto invalid; - } - - if (len != 4) { - err = "invalid A record in DNS response"; - goto invalid; - } - - if (i + 4 > n) { - goto short_response; - } - - naddrs++; - - break; - -#if (NGX_HAVE_INET6) - case NGX_RESOLVE_AAAA: - - if (qtype != NGX_RESOLVE_AAAA) { - err = "unexpected AAAA record in DNS response"; - goto invalid; - } - - if (len != 16) { - err = "invalid AAAA record in DNS response"; - goto invalid; - } - - if (i + 16 > n) { - goto short_response; - } - - naddrs++; - - break; -#endif - - case NGX_RESOLVE_CNAME: - - cname = &buf[i]; - - break; - - case NGX_RESOLVE_DNAME: - - break; - - default: - - ngx_log_error(r->log_level, r->log, 0, - "unexpected RR type %ui in DNS response", type); - } - - i += len; - } - - ngx_log_debug3(NGX_LOG_DEBUG_CORE, r->log, 0, - "resolver naddrs:%ui cname:%p ttl:%uD", - naddrs, cname, rn->ttl); - - if (naddrs) { - - switch (qtype) { - -#if (NGX_HAVE_INET6) - case NGX_RESOLVE_AAAA: - - if (naddrs == 1) { - addr6 = &rn->u6.addr6; - rn->naddrs6 = 1; - - } else { - addr6 = ngx_resolver_alloc(r, naddrs * sizeof(struct in6_addr)); - if (addr6 == NULL) { - goto failed; - } - - rn->u6.addrs6 = addr6; - rn->naddrs6 = (u_short) naddrs; - } - -#if (NGX_SUPPRESS_WARN) - addr = NULL; -#endif - - break; -#endif - - default: /* NGX_RESOLVE_A */ - - if (naddrs == 1) { - addr = &rn->u.addr; - rn->naddrs = 1; - - } else { - addr = ngx_resolver_alloc(r, naddrs * sizeof(in_addr_t)); - if (addr == NULL) { - goto failed; - } - - rn->u.addrs = addr; - rn->naddrs = (u_short) naddrs; - } - -#if (NGX_HAVE_INET6 && NGX_SUPPRESS_WARN) - addr6 = NULL; -#endif - } - - j = 0; - i = ans; - - for (a = 0; a < nan; a++) { - - for ( ;; ) { - - if (buf[i] & 0xc0) { - i += 2; - break; - } - - if (buf[i] == 0) { - i++; - break; - } - - i += 1 + buf[i]; - } - - an = (ngx_resolver_an_t *) &buf[i]; - - type = (an->type_hi << 8) + an->type_lo; - len = (an->len_hi << 8) + an->len_lo; - - i += sizeof(ngx_resolver_an_t); - - if (type == NGX_RESOLVE_A) { - - addr[j] = htonl((buf[i] << 24) + (buf[i + 1] << 16) - + (buf[i + 2] << 8) + (buf[i + 3])); - - if (++j == naddrs) { - -#if (NGX_HAVE_INET6) - if (rn->naddrs6 == (u_short) -1) { - goto next; - } -#endif - - break; - } - } - -#if (NGX_HAVE_INET6) - else if (type == NGX_RESOLVE_AAAA) { - - ngx_memcpy(addr6[j].s6_addr, &buf[i], 16); - - if (++j == naddrs) { - - if (rn->naddrs == (u_short) -1) { - goto next; - } - - break; - } - } -#endif - - i += len; - } - } - - switch (qtype) { - -#if (NGX_HAVE_INET6) - case NGX_RESOLVE_AAAA: - - if (rn->naddrs6 == (u_short) -1) { - rn->naddrs6 = 0; - } - - break; -#endif - - default: /* NGX_RESOLVE_A */ - - if (rn->naddrs == (u_short) -1) { - rn->naddrs = 0; - } - } - - if (rn->naddrs != (u_short) -1 -#if (NGX_HAVE_INET6) - && rn->naddrs6 != (u_short) -1 -#endif - && rn->naddrs -#if (NGX_HAVE_INET6) - + rn->naddrs6 -#endif - > 0) - { - -#if (NGX_HAVE_INET6) - export: -#endif - - naddrs = rn->naddrs; -#if (NGX_HAVE_INET6) - naddrs += rn->naddrs6; -#endif - - if (naddrs == 1 && rn->naddrs == 1) { - addrs = NULL; - - } else { - addrs = ngx_resolver_export(r, rn, 0); - if (addrs == NULL) { - goto failed; - } - } - - ngx_queue_remove(&rn->queue); - - rn->valid = ngx_time() + (r->valid ? r->valid : (time_t) rn->ttl); - rn->expire = ngx_time() + r->expire; - - ngx_queue_insert_head(&r->name_expire_queue, &rn->queue); - - next = rn->waiting; - rn->waiting = NULL; - - /* unlock name mutex */ - - while (next) { - ctx = next; - ctx->state = NGX_OK; - ctx->valid = rn->valid; - ctx->naddrs = naddrs; - - if (addrs == NULL) { - ctx->addrs = &ctx->addr; - ctx->addr.sockaddr = (struct sockaddr *) &ctx->sin; - ctx->addr.socklen = sizeof(struct sockaddr_in); - ngx_memzero(&ctx->sin, sizeof(struct sockaddr_in)); - ctx->sin.sin_family = AF_INET; - ctx->sin.sin_addr.s_addr = rn->u.addr; - - } else { - ctx->addrs = addrs; - } - - next = ctx->next; - - ctx->handler(ctx); - } - - if (addrs != NULL) { - ngx_resolver_free(r, addrs->sockaddr); - ngx_resolver_free(r, addrs); - } - - ngx_resolver_free(r, rn->query); - rn->query = NULL; -#if (NGX_HAVE_INET6) - rn->query6 = NULL; -#endif - - return; - } - - if (cname) { - - /* CNAME only */ - - if (rn->naddrs == (u_short) -1 -#if (NGX_HAVE_INET6) - || rn->naddrs6 == (u_short) -1 -#endif - ) - { - goto next; - } - - if (ngx_resolver_copy(r, &name, buf, cname, buf + n) != NGX_OK) { - goto failed; - } - - ngx_log_debug1(NGX_LOG_DEBUG_CORE, r->log, 0, - "resolver cname:\"%V\"", &name); - - ngx_queue_remove(&rn->queue); - - rn->cnlen = (u_short) name.len; - rn->u.cname = name.data; - - rn->valid = ngx_time() + (r->valid ? r->valid : (time_t) rn->ttl); - rn->expire = ngx_time() + r->expire; - - ngx_queue_insert_head(&r->name_expire_queue, &rn->queue); - - ngx_resolver_free(r, rn->query); - rn->query = NULL; -#if (NGX_HAVE_INET6) - rn->query6 = NULL; -#endif - - ctx = rn->waiting; - rn->waiting = NULL; - - if (ctx) { - - if (ctx->recursion++ >= NGX_RESOLVER_MAX_RECURSION) { - - /* unlock name mutex */ - - do { - ctx->state = NGX_RESOLVE_NXDOMAIN; - next = ctx->next; - - ctx->handler(ctx); - - ctx = next; - } while (ctx); - - return; - } - - for (next = ctx; next; next = next->next) { - next->node = NULL; - } - - (void) ngx_resolve_name_locked(r, ctx, &name); - } - - /* unlock name mutex */ - - return; - } - - ngx_log_error(r->log_level, r->log, 0, - "no A or CNAME types in DNS response"); - return; - -short_response: - - err = "short DNS response"; - -invalid: - - /* unlock name mutex */ - - ngx_log_error(r->log_level, r->log, 0, err); - - return; - -failed: - -next: - - /* unlock name mutex */ - - return; -} - - -static void -ngx_resolver_process_srv(ngx_resolver_t *r, u_char *buf, size_t n, - ngx_uint_t ident, ngx_uint_t code, ngx_uint_t nan, - ngx_uint_t trunc, ngx_uint_t ans) -{ - char *err; - u_char *cname; - size_t len; - int32_t ttl; - uint32_t hash; - ngx_str_t name; - ngx_uint_t type, qident, class, start, nsrvs, a, i, j; - ngx_resolver_an_t *an; - ngx_resolver_ctx_t *ctx, *next; - ngx_resolver_srv_t *srvs; - ngx_resolver_node_t *rn; - ngx_resolver_connection_t *rec; - - if (ngx_resolver_copy(r, &name, buf, - buf + sizeof(ngx_resolver_hdr_t), buf + n) - != NGX_OK) - { - return; - } - - ngx_log_debug1(NGX_LOG_DEBUG_CORE, r->log, 0, "resolver qs:%V", &name); - - hash = ngx_crc32_short(name.data, name.len); - - rn = ngx_resolver_lookup_srv(r, &name, hash); - - if (rn == NULL || rn->query == NULL) { - ngx_log_error(r->log_level, r->log, 0, - "unexpected DNS response for %V", &name); - ngx_resolver_free(r, name.data); - goto failed; - } - - if (trunc && rn->tcp) { - ngx_resolver_free(r, name.data); - goto failed; - } - - qident = (rn->query[0] << 8) + rn->query[1]; - - if (ident != qident) { - ngx_log_error(r->log_level, r->log, 0, - "wrong ident %ui in DNS response for %V, expect %ui", - ident, &name, qident); - ngx_resolver_free(r, name.data); - goto failed; - } - - ngx_resolver_free(r, name.data); - - if (trunc) { - - ngx_queue_remove(&rn->queue); - - if (rn->waiting == NULL) { - ngx_rbtree_delete(&r->srv_rbtree, &rn->node); - ngx_resolver_free_node(r, rn); - return; - } - - rec = r->connections.elts; - rec = &rec[rn->last_connection]; - - rn->tcp = 1; - - (void) ngx_resolver_send_tcp_query(r, rec, rn->query, rn->qlen); - - rn->expire = ngx_time() + r->resend_timeout; - - ngx_queue_insert_head(&r->srv_resend_queue, &rn->queue); - - return; - } - - if (code == 0 && rn->code) { - code = rn->code; - } - - if (code == 0 && nan == 0) { - code = NGX_RESOLVE_NXDOMAIN; - } - - if (code) { - next = rn->waiting; - rn->waiting = NULL; - - ngx_queue_remove(&rn->queue); - - ngx_rbtree_delete(&r->srv_rbtree, &rn->node); - - while (next) { - ctx = next; - ctx->state = code; - ctx->valid = ngx_time() + (r->valid ? r->valid : 10); - next = ctx->next; - - ctx->handler(ctx); - } - - ngx_resolver_free_node(r, rn); - - return; - } - - i = ans; - nsrvs = 0; - cname = NULL; - - for (a = 0; a < nan; a++) { - - start = i; - - while (i < n) { - - if (buf[i] & 0xc0) { - i += 2; - goto found; - } - - if (buf[i] == 0) { - i++; - goto test_length; - } - - i += 1 + buf[i]; - } - - goto short_response; - - test_length: - - if (i - start < 2) { - err = "invalid name DNS response"; - goto invalid; - } - - found: - - if (i + sizeof(ngx_resolver_an_t) >= n) { - goto short_response; - } - - an = (ngx_resolver_an_t *) &buf[i]; - - type = (an->type_hi << 8) + an->type_lo; - class = (an->class_hi << 8) + an->class_lo; - len = (an->len_hi << 8) + an->len_lo; - ttl = (an->ttl[0] << 24) + (an->ttl[1] << 16) - + (an->ttl[2] << 8) + (an->ttl[3]); - - if (class != 1) { - ngx_log_error(r->log_level, r->log, 0, - "unexpected RR class %ui in DNS response", class); - goto failed; - } - - if (ttl < 0) { - ttl = 0; - } - - rn->ttl = ngx_min(rn->ttl, (uint32_t) ttl); - - i += sizeof(ngx_resolver_an_t); - - switch (type) { - - case NGX_RESOLVE_SRV: - - if (i + 6 >= n) { - goto short_response; - } - - if (ngx_resolver_copy(r, NULL, buf, &buf[i + 6], buf + n) - != NGX_OK) - { - goto failed; - } - - nsrvs++; - - break; - - case NGX_RESOLVE_CNAME: - - cname = &buf[i]; - - break; - - case NGX_RESOLVE_DNAME: - - break; - - default: - - ngx_log_error(r->log_level, r->log, 0, - "unexpected RR type %ui in DNS response", type); - } - - i += len; - } - - ngx_log_debug3(NGX_LOG_DEBUG_CORE, r->log, 0, - "resolver nsrvs:%ui cname:%p ttl:%uD", - nsrvs, cname, rn->ttl); - - if (nsrvs) { - - srvs = ngx_resolver_calloc(r, nsrvs * sizeof(ngx_resolver_srv_t)); - if (srvs == NULL) { - goto failed; - } - - rn->u.srvs = srvs; - rn->nsrvs = (u_short) nsrvs; - - j = 0; - i = ans; - - for (a = 0; a < nan; a++) { - - for ( ;; ) { - - if (buf[i] & 0xc0) { - i += 2; - break; - } - - if (buf[i] == 0) { - i++; - break; - } - - i += 1 + buf[i]; - } - - an = (ngx_resolver_an_t *) &buf[i]; - - type = (an->type_hi << 8) + an->type_lo; - len = (an->len_hi << 8) + an->len_lo; - - i += sizeof(ngx_resolver_an_t); - - if (type == NGX_RESOLVE_SRV) { - - srvs[j].priority = (buf[i] << 8) + buf[i + 1]; - srvs[j].weight = (buf[i + 2] << 8) + buf[i + 3]; - - if (srvs[j].weight == 0) { - srvs[j].weight = 1; - } - - srvs[j].port = (buf[i + 4] << 8) + buf[i + 5]; - - if (ngx_resolver_copy(r, &srvs[j].name, buf, &buf[i + 6], - buf + n) - != NGX_OK) - { - goto failed; - } - - j++; - } - - i += len; - } - - ngx_sort(srvs, nsrvs, sizeof(ngx_resolver_srv_t), - ngx_resolver_cmp_srvs); - - ngx_resolver_free(r, rn->query); - rn->query = NULL; - - ngx_queue_remove(&rn->queue); - - rn->valid = ngx_time() + (r->valid ? r->valid : (time_t) rn->ttl); - rn->expire = ngx_time() + r->expire; - - ngx_queue_insert_head(&r->srv_expire_queue, &rn->queue); - - next = rn->waiting; - rn->waiting = NULL; - - while (next) { - ctx = next; - next = ctx->next; - - ngx_resolver_resolve_srv_names(ctx, rn); - } - - return; - } - - rn->nsrvs = 0; - - if (cname) { - - /* CNAME only */ - - if (ngx_resolver_copy(r, &name, buf, cname, buf + n) != NGX_OK) { - goto failed; - } - - ngx_log_debug1(NGX_LOG_DEBUG_CORE, r->log, 0, - "resolver cname:\"%V\"", &name); - - ngx_queue_remove(&rn->queue); - - rn->cnlen = (u_short) name.len; - rn->u.cname = name.data; - - rn->valid = ngx_time() + (r->valid ? r->valid : (time_t) rn->ttl); - rn->expire = ngx_time() + r->expire; - - ngx_queue_insert_head(&r->srv_expire_queue, &rn->queue); - - ngx_resolver_free(r, rn->query); - rn->query = NULL; -#if (NGX_HAVE_INET6) - rn->query6 = NULL; -#endif - - ctx = rn->waiting; - rn->waiting = NULL; - - if (ctx) { - - if (ctx->recursion++ >= NGX_RESOLVER_MAX_RECURSION) { - - /* unlock name mutex */ - - do { - ctx->state = NGX_RESOLVE_NXDOMAIN; - next = ctx->next; - - ctx->handler(ctx); - - ctx = next; - } while (ctx); - - return; - } - - for (next = ctx; next; next = next->next) { - next->node = NULL; - } - - (void) ngx_resolve_name_locked(r, ctx, &name); - } - - /* unlock name mutex */ - - return; - } - - ngx_log_error(r->log_level, r->log, 0, "no SRV type in DNS response"); - - return; - -short_response: - - err = "short DNS response"; - -invalid: - - /* unlock name mutex */ - - ngx_log_error(r->log_level, r->log, 0, err); - - return; - -failed: - - /* unlock name mutex */ - - return; -} - - -static void -ngx_resolver_resolve_srv_names(ngx_resolver_ctx_t *ctx, ngx_resolver_node_t *rn) -{ - ngx_uint_t i; - ngx_resolver_t *r; - ngx_resolver_ctx_t *cctx; - ngx_resolver_srv_name_t *srvs; - - r = ctx->resolver; - - ctx->node = NULL; - ctx->state = NGX_OK; - ctx->valid = rn->valid; - ctx->count = rn->nsrvs; - - srvs = ngx_resolver_calloc(r, rn->nsrvs * sizeof(ngx_resolver_srv_name_t)); - if (srvs == NULL) { - goto failed; - } - - ctx->srvs = srvs; - ctx->nsrvs = rn->nsrvs; - - if (ctx->event && ctx->event->timer_set) { - ngx_del_timer(ctx->event); - } - - for (i = 0; i < (ngx_uint_t) rn->nsrvs; i++) { - srvs[i].name.data = ngx_resolver_alloc(r, rn->u.srvs[i].name.len); - if (srvs[i].name.data == NULL) { - goto failed; - } - - srvs[i].name.len = rn->u.srvs[i].name.len; - ngx_memcpy(srvs[i].name.data, rn->u.srvs[i].name.data, - srvs[i].name.len); - - cctx = ngx_resolve_start(r, NULL); - if (cctx == NULL) { - goto failed; - } - - cctx->name = srvs[i].name; - cctx->handler = ngx_resolver_srv_names_handler; - cctx->data = ctx; - cctx->srvs = &srvs[i]; - cctx->timeout = ctx->timeout; - - srvs[i].priority = rn->u.srvs[i].priority; - srvs[i].weight = rn->u.srvs[i].weight; - srvs[i].port = rn->u.srvs[i].port; - srvs[i].ctx = cctx; - - if (ngx_resolve_name(cctx) == NGX_ERROR) { - srvs[i].ctx = NULL; - goto failed; - } - } - - return; - -failed: - - ctx->state = NGX_ERROR; - ctx->valid = ngx_time() + (r->valid ? r->valid : 10); - - ctx->handler(ctx); -} - - -static void -ngx_resolver_srv_names_handler(ngx_resolver_ctx_t *cctx) -{ - ngx_uint_t i; - ngx_addr_t *addrs; - ngx_resolver_t *r; - ngx_sockaddr_t *sockaddr; - ngx_resolver_ctx_t *ctx; - ngx_resolver_srv_name_t *srv; - - r = cctx->resolver; - ctx = cctx->data; - srv = cctx->srvs; - - ctx->count--; - ctx->async |= cctx->async; - - srv->ctx = NULL; - srv->state = cctx->state; - - if (cctx->naddrs) { - - ctx->valid = ngx_min(ctx->valid, cctx->valid); - - addrs = ngx_resolver_calloc(r, cctx->naddrs * sizeof(ngx_addr_t)); - if (addrs == NULL) { - srv->state = NGX_ERROR; - goto done; - } - - sockaddr = ngx_resolver_alloc(r, cctx->naddrs * sizeof(ngx_sockaddr_t)); - if (sockaddr == NULL) { - ngx_resolver_free(r, addrs); - srv->state = NGX_ERROR; - goto done; - } - - for (i = 0; i < cctx->naddrs; i++) { - addrs[i].sockaddr = &sockaddr[i].sockaddr; - addrs[i].socklen = cctx->addrs[i].socklen; - - ngx_memcpy(&sockaddr[i], cctx->addrs[i].sockaddr, - addrs[i].socklen); - - ngx_inet_set_port(addrs[i].sockaddr, srv->port); - } - - srv->addrs = addrs; - srv->naddrs = cctx->naddrs; - } - -done: - - ngx_resolve_name_done(cctx); - - if (ctx->count == 0) { - ngx_resolver_report_srv(r, ctx); - } -} - - -static void -ngx_resolver_process_ptr(ngx_resolver_t *r, u_char *buf, size_t n, - ngx_uint_t ident, ngx_uint_t code, ngx_uint_t nan) -{ - char *err; - size_t len; - in_addr_t addr; - int32_t ttl; - ngx_int_t octet; - ngx_str_t name; - ngx_uint_t mask, type, class, qident, a, i, start; - ngx_queue_t *expire_queue; - ngx_rbtree_t *tree; - ngx_resolver_an_t *an; - ngx_resolver_ctx_t *ctx, *next; - ngx_resolver_node_t *rn; -#if (NGX_HAVE_INET6) - uint32_t hash; - ngx_int_t digit; - struct in6_addr addr6; -#endif - - if (ngx_resolver_copy(r, &name, buf, - buf + sizeof(ngx_resolver_hdr_t), buf + n) - != NGX_OK) - { - return; - } - - ngx_log_debug1(NGX_LOG_DEBUG_CORE, r->log, 0, "resolver qs:%V", &name); - - /* AF_INET */ - - addr = 0; - i = sizeof(ngx_resolver_hdr_t); - - for (mask = 0; mask < 32; mask += 8) { - len = buf[i++]; - - octet = ngx_atoi(&buf[i], len); - if (octet == NGX_ERROR || octet > 255) { - goto invalid_in_addr_arpa; - } - - addr += octet << mask; - i += len; - } - - if (ngx_strcasecmp(&buf[i], (u_char *) "\7in-addr\4arpa") == 0) { - i += sizeof("\7in-addr\4arpa"); - - /* lock addr mutex */ - - rn = ngx_resolver_lookup_addr(r, addr); - - tree = &r->addr_rbtree; - expire_queue = &r->addr_expire_queue; - - goto valid; - } - -invalid_in_addr_arpa: - -#if (NGX_HAVE_INET6) - - i = sizeof(ngx_resolver_hdr_t); - - for (octet = 15; octet >= 0; octet--) { - if (buf[i++] != '\1') { - goto invalid_ip6_arpa; - } - - digit = ngx_hextoi(&buf[i++], 1); - if (digit == NGX_ERROR) { - goto invalid_ip6_arpa; - } - - addr6.s6_addr[octet] = (u_char) digit; - - if (buf[i++] != '\1') { - goto invalid_ip6_arpa; - } - - digit = ngx_hextoi(&buf[i++], 1); - if (digit == NGX_ERROR) { - goto invalid_ip6_arpa; - } - - addr6.s6_addr[octet] += (u_char) (digit * 16); - } - - if (ngx_strcasecmp(&buf[i], (u_char *) "\3ip6\4arpa") == 0) { - i += sizeof("\3ip6\4arpa"); - - /* lock addr mutex */ - - hash = ngx_crc32_short(addr6.s6_addr, 16); - rn = ngx_resolver_lookup_addr6(r, &addr6, hash); - - tree = &r->addr6_rbtree; - expire_queue = &r->addr6_expire_queue; - - goto valid; - } - -invalid_ip6_arpa: -#endif - - ngx_log_error(r->log_level, r->log, 0, - "invalid in-addr.arpa or ip6.arpa name in DNS response"); - ngx_resolver_free(r, name.data); - return; - -valid: - - if (rn == NULL || rn->query == NULL) { - ngx_log_error(r->log_level, r->log, 0, - "unexpected DNS response for %V", &name); - ngx_resolver_free(r, name.data); - goto failed; - } - - qident = (rn->query[0] << 8) + rn->query[1]; - - if (ident != qident) { - ngx_log_error(r->log_level, r->log, 0, - "wrong ident %ui in DNS response for %V, expect %ui", - ident, &name, qident); - ngx_resolver_free(r, name.data); - goto failed; - } - - ngx_resolver_free(r, name.data); - - if (code == 0 && nan == 0) { - code = NGX_RESOLVE_NXDOMAIN; - } - - if (code) { - next = rn->waiting; - rn->waiting = NULL; - - ngx_queue_remove(&rn->queue); - - ngx_rbtree_delete(tree, &rn->node); - - /* unlock addr mutex */ - - while (next) { - ctx = next; - ctx->state = code; - ctx->valid = ngx_time() + (r->valid ? r->valid : 10); - next = ctx->next; - - ctx->handler(ctx); - } - - ngx_resolver_free_node(r, rn); - - return; - } - - i += sizeof(ngx_resolver_qs_t); - - for (a = 0; a < nan; a++) { - - start = i; - - while (i < n) { - - if (buf[i] & 0xc0) { - i += 2; - goto found; - } - - if (buf[i] == 0) { - i++; - goto test_length; - } - - i += 1 + buf[i]; - } - - goto short_response; - - test_length: - - if (i - start < 2) { - err = "invalid name in DNS response"; - goto invalid; - } - - found: - - if (i + sizeof(ngx_resolver_an_t) >= n) { - goto short_response; - } - - an = (ngx_resolver_an_t *) &buf[i]; - - type = (an->type_hi << 8) + an->type_lo; - class = (an->class_hi << 8) + an->class_lo; - len = (an->len_hi << 8) + an->len_lo; - ttl = (an->ttl[0] << 24) + (an->ttl[1] << 16) - + (an->ttl[2] << 8) + (an->ttl[3]); - - if (class != 1) { - ngx_log_error(r->log_level, r->log, 0, - "unexpected RR class %ui in DNS response", class); - goto failed; - } - - if (ttl < 0) { - ttl = 0; - } - - ngx_log_debug3(NGX_LOG_DEBUG_CORE, r->log, 0, - "resolver qt:%ui cl:%ui len:%uz", - type, class, len); - - i += sizeof(ngx_resolver_an_t); - - switch (type) { - - case NGX_RESOLVE_PTR: - - goto ptr; - - case NGX_RESOLVE_CNAME: - - break; - - default: - - ngx_log_error(r->log_level, r->log, 0, - "unexpected RR type %ui in DNS response", type); - } - - i += len; - } - - /* unlock addr mutex */ - - ngx_log_error(r->log_level, r->log, 0, - "no PTR type in DNS response"); - return; - -ptr: - - if (ngx_resolver_copy(r, &name, buf, buf + i, buf + n) != NGX_OK) { - goto failed; - } - - ngx_log_debug1(NGX_LOG_DEBUG_CORE, r->log, 0, "resolver an:%V", &name); - - if (name.len != (size_t) rn->nlen - || ngx_strncmp(name.data, rn->name, name.len) != 0) - { - if (rn->nlen) { - ngx_resolver_free(r, rn->name); - } - - rn->nlen = (u_short) name.len; - rn->name = name.data; - - name.data = ngx_resolver_dup(r, rn->name, name.len); - if (name.data == NULL) { - goto failed; - } - } - - ngx_queue_remove(&rn->queue); - - rn->valid = ngx_time() + (r->valid ? r->valid : ttl); - rn->expire = ngx_time() + r->expire; - - ngx_queue_insert_head(expire_queue, &rn->queue); - - next = rn->waiting; - rn->waiting = NULL; - - /* unlock addr mutex */ - - while (next) { - ctx = next; - ctx->state = NGX_OK; - ctx->valid = rn->valid; - ctx->name = name; - next = ctx->next; - - ctx->handler(ctx); - } - - ngx_resolver_free(r, name.data); - - return; - -short_response: - - err = "short DNS response"; - -invalid: - - /* unlock addr mutex */ - - ngx_log_error(r->log_level, r->log, 0, err); - - return; - -failed: - - /* unlock addr mutex */ - - return; -} - - -static ngx_resolver_node_t * -ngx_resolver_lookup_name(ngx_resolver_t *r, ngx_str_t *name, uint32_t hash) -{ - ngx_int_t rc; - ngx_rbtree_node_t *node, *sentinel; - ngx_resolver_node_t *rn; - - node = r->name_rbtree.root; - sentinel = r->name_rbtree.sentinel; - - while (node != sentinel) { - - if (hash < node->key) { - node = node->left; - continue; - } - - if (hash > node->key) { - node = node->right; - continue; - } - - /* hash == node->key */ - - rn = ngx_resolver_node(node); - - rc = ngx_memn2cmp(name->data, rn->name, name->len, rn->nlen); - - if (rc == 0) { - return rn; - } - - node = (rc < 0) ? node->left : node->right; - } - - /* not found */ - - return NULL; -} - - -static ngx_resolver_node_t * -ngx_resolver_lookup_srv(ngx_resolver_t *r, ngx_str_t *name, uint32_t hash) -{ - ngx_int_t rc; - ngx_rbtree_node_t *node, *sentinel; - ngx_resolver_node_t *rn; - - node = r->srv_rbtree.root; - sentinel = r->srv_rbtree.sentinel; - - while (node != sentinel) { - - if (hash < node->key) { - node = node->left; - continue; - } - - if (hash > node->key) { - node = node->right; - continue; - } - - /* hash == node->key */ - - rn = ngx_resolver_node(node); - - rc = ngx_memn2cmp(name->data, rn->name, name->len, rn->nlen); - - if (rc == 0) { - return rn; - } - - node = (rc < 0) ? node->left : node->right; - } - - /* not found */ - - return NULL; -} - - -static ngx_resolver_node_t * -ngx_resolver_lookup_addr(ngx_resolver_t *r, in_addr_t addr) -{ - ngx_rbtree_node_t *node, *sentinel; - - node = r->addr_rbtree.root; - sentinel = r->addr_rbtree.sentinel; - - while (node != sentinel) { - - if (addr < node->key) { - node = node->left; - continue; - } - - if (addr > node->key) { - node = node->right; - continue; - } - - /* addr == node->key */ - - return ngx_resolver_node(node); - } - - /* not found */ - - return NULL; -} - - -#if (NGX_HAVE_INET6) - -static ngx_resolver_node_t * -ngx_resolver_lookup_addr6(ngx_resolver_t *r, struct in6_addr *addr, - uint32_t hash) -{ - ngx_int_t rc; - ngx_rbtree_node_t *node, *sentinel; - ngx_resolver_node_t *rn; - - node = r->addr6_rbtree.root; - sentinel = r->addr6_rbtree.sentinel; - - while (node != sentinel) { - - if (hash < node->key) { - node = node->left; - continue; - } - - if (hash > node->key) { - node = node->right; - continue; - } - - /* hash == node->key */ - - rn = ngx_resolver_node(node); - - rc = ngx_memcmp(addr, &rn->addr6, 16); - - if (rc == 0) { - return rn; - } - - node = (rc < 0) ? node->left : node->right; - } - - /* not found */ - - return NULL; -} - -#endif - - -static void -ngx_resolver_rbtree_insert_value(ngx_rbtree_node_t *temp, - ngx_rbtree_node_t *node, ngx_rbtree_node_t *sentinel) -{ - ngx_rbtree_node_t **p; - ngx_resolver_node_t *rn, *rn_temp; - - for ( ;; ) { - - if (node->key < temp->key) { - - p = &temp->left; - - } else if (node->key > temp->key) { - - p = &temp->right; - - } else { /* node->key == temp->key */ - - rn = ngx_resolver_node(node); - rn_temp = ngx_resolver_node(temp); - - p = (ngx_memn2cmp(rn->name, rn_temp->name, rn->nlen, rn_temp->nlen) - < 0) ? &temp->left : &temp->right; - } - - if (*p == sentinel) { - break; - } - - temp = *p; - } - - *p = node; - node->parent = temp; - node->left = sentinel; - node->right = sentinel; - ngx_rbt_red(node); -} - - -#if (NGX_HAVE_INET6) - -static void -ngx_resolver_rbtree_insert_addr6_value(ngx_rbtree_node_t *temp, - ngx_rbtree_node_t *node, ngx_rbtree_node_t *sentinel) -{ - ngx_rbtree_node_t **p; - ngx_resolver_node_t *rn, *rn_temp; - - for ( ;; ) { - - if (node->key < temp->key) { - - p = &temp->left; - - } else if (node->key > temp->key) { - - p = &temp->right; - - } else { /* node->key == temp->key */ - - rn = ngx_resolver_node(node); - rn_temp = ngx_resolver_node(temp); - - p = (ngx_memcmp(&rn->addr6, &rn_temp->addr6, 16) - < 0) ? &temp->left : &temp->right; - } - - if (*p == sentinel) { - break; - } - - temp = *p; - } - - *p = node; - node->parent = temp; - node->left = sentinel; - node->right = sentinel; - ngx_rbt_red(node); -} - -#endif - - -static ngx_int_t -ngx_resolver_create_name_query(ngx_resolver_t *r, ngx_resolver_node_t *rn, - ngx_str_t *name) -{ - u_char *p, *s; - size_t len, nlen; - ngx_uint_t ident; - ngx_resolver_qs_t *qs; - ngx_resolver_hdr_t *query; - - nlen = name->len ? (1 + name->len + 1) : 1; - - len = sizeof(ngx_resolver_hdr_t) + nlen + sizeof(ngx_resolver_qs_t); - -#if (NGX_HAVE_INET6) - p = ngx_resolver_alloc(r, len * (r->ipv4 + r->ipv6)); -#else - p = ngx_resolver_alloc(r, len); -#endif - if (p == NULL) { - return NGX_ERROR; - } - - rn->qlen = (u_short) len; - rn->query = p; - -#if (NGX_HAVE_INET6) - if (r->ipv6) { - rn->query6 = r->ipv4 ? (p + len) : p; - } -#endif - - query = (ngx_resolver_hdr_t *) p; - - if (r->ipv4) { - ident = ngx_random(); - - ngx_log_debug2(NGX_LOG_DEBUG_CORE, r->log, 0, - "resolve: \"%V\" A %i", name, ident & 0xffff); - - query->ident_hi = (u_char) ((ident >> 8) & 0xff); - query->ident_lo = (u_char) (ident & 0xff); - } - - /* recursion query */ - query->flags_hi = 1; query->flags_lo = 0; - - /* one question */ - query->nqs_hi = 0; query->nqs_lo = 1; - query->nan_hi = 0; query->nan_lo = 0; - query->nns_hi = 0; query->nns_lo = 0; - query->nar_hi = 0; query->nar_lo = 0; - - p += sizeof(ngx_resolver_hdr_t) + nlen; - - qs = (ngx_resolver_qs_t *) p; - - /* query type */ - qs->type_hi = 0; qs->type_lo = NGX_RESOLVE_A; - - /* IN query class */ - qs->class_hi = 0; qs->class_lo = 1; - - /* convert "www.example.com" to "\3www\7example\3com\0" */ - - len = 0; - p--; - *p-- = '\0'; - - if (name->len == 0) { - return NGX_DECLINED; - } - - for (s = name->data + name->len - 1; s >= name->data; s--) { - if (*s != '.') { - *p = *s; - len++; - - } else { - if (len == 0 || len > 255) { - return NGX_DECLINED; - } - - *p = (u_char) len; - len = 0; - } - - p--; - } - - if (len == 0 || len > 255) { - return NGX_DECLINED; - } - - *p = (u_char) len; - -#if (NGX_HAVE_INET6) - if (!r->ipv6) { - return NGX_OK; - } - - p = rn->query6; - - if (r->ipv4) { - ngx_memcpy(p, rn->query, rn->qlen); - } - - query = (ngx_resolver_hdr_t *) p; - - ident = ngx_random(); - - ngx_log_debug2(NGX_LOG_DEBUG_CORE, r->log, 0, - "resolve: \"%V\" AAAA %i", name, ident & 0xffff); - - query->ident_hi = (u_char) ((ident >> 8) & 0xff); - query->ident_lo = (u_char) (ident & 0xff); - - p += sizeof(ngx_resolver_hdr_t) + nlen; - - qs = (ngx_resolver_qs_t *) p; - - qs->type_lo = NGX_RESOLVE_AAAA; -#endif - - return NGX_OK; -} - - -static ngx_int_t -ngx_resolver_create_srv_query(ngx_resolver_t *r, ngx_resolver_node_t *rn, - ngx_str_t *name) -{ - u_char *p, *s; - size_t len, nlen; - ngx_uint_t ident; - ngx_resolver_qs_t *qs; - ngx_resolver_hdr_t *query; - - nlen = name->len ? (1 + name->len + 1) : 1; - - len = sizeof(ngx_resolver_hdr_t) + nlen + sizeof(ngx_resolver_qs_t); - - p = ngx_resolver_alloc(r, len); - if (p == NULL) { - return NGX_ERROR; - } - - rn->qlen = (u_short) len; - rn->query = p; - - query = (ngx_resolver_hdr_t *) p; - - ident = ngx_random(); - - ngx_log_debug2(NGX_LOG_DEBUG_CORE, r->log, 0, - "resolve: \"%V\" SRV %i", name, ident & 0xffff); - - query->ident_hi = (u_char) ((ident >> 8) & 0xff); - query->ident_lo = (u_char) (ident & 0xff); - - /* recursion query */ - query->flags_hi = 1; query->flags_lo = 0; - - /* one question */ - query->nqs_hi = 0; query->nqs_lo = 1; - query->nan_hi = 0; query->nan_lo = 0; - query->nns_hi = 0; query->nns_lo = 0; - query->nar_hi = 0; query->nar_lo = 0; - - p += sizeof(ngx_resolver_hdr_t) + nlen; - - qs = (ngx_resolver_qs_t *) p; - - /* query type */ - qs->type_hi = 0; qs->type_lo = NGX_RESOLVE_SRV; - - /* IN query class */ - qs->class_hi = 0; qs->class_lo = 1; - - /* converts "www.example.com" to "\3www\7example\3com\0" */ - - len = 0; - p--; - *p-- = '\0'; - - if (name->len == 0) { - return NGX_DECLINED; - } - - for (s = name->data + name->len - 1; s >= name->data; s--) { - if (*s != '.') { - *p = *s; - len++; - - } else { - if (len == 0 || len > 255) { - return NGX_DECLINED; - } - - *p = (u_char) len; - len = 0; - } - - p--; - } - - if (len == 0 || len > 255) { - return NGX_DECLINED; - } - - *p = (u_char) len; - - return NGX_OK; -} - - -static ngx_int_t -ngx_resolver_create_addr_query(ngx_resolver_t *r, ngx_resolver_node_t *rn, - ngx_resolver_addr_t *addr) -{ - u_char *p, *d; - size_t len; - in_addr_t inaddr; - ngx_int_t n; - ngx_uint_t ident; - ngx_resolver_hdr_t *query; - struct sockaddr_in *sin; -#if (NGX_HAVE_INET6) - struct sockaddr_in6 *sin6; -#endif - - switch (addr->sockaddr->sa_family) { - -#if (NGX_HAVE_INET6) - case AF_INET6: - len = sizeof(ngx_resolver_hdr_t) - + 64 + sizeof(".ip6.arpa.") - 1 - + sizeof(ngx_resolver_qs_t); - - break; -#endif - - default: /* AF_INET */ - len = sizeof(ngx_resolver_hdr_t) - + sizeof(".255.255.255.255.in-addr.arpa.") - 1 - + sizeof(ngx_resolver_qs_t); - } - - p = ngx_resolver_alloc(r, len); - if (p == NULL) { - return NGX_ERROR; - } - - rn->query = p; - query = (ngx_resolver_hdr_t *) p; - - ident = ngx_random(); - - query->ident_hi = (u_char) ((ident >> 8) & 0xff); - query->ident_lo = (u_char) (ident & 0xff); - - /* recursion query */ - query->flags_hi = 1; query->flags_lo = 0; - - /* one question */ - query->nqs_hi = 0; query->nqs_lo = 1; - query->nan_hi = 0; query->nan_lo = 0; - query->nns_hi = 0; query->nns_lo = 0; - query->nar_hi = 0; query->nar_lo = 0; - - p += sizeof(ngx_resolver_hdr_t); - - switch (addr->sockaddr->sa_family) { - -#if (NGX_HAVE_INET6) - case AF_INET6: - sin6 = (struct sockaddr_in6 *) addr->sockaddr; - - for (n = 15; n >= 0; n--) { - p = ngx_sprintf(p, "\1%xd\1%xd", - sin6->sin6_addr.s6_addr[n] & 0xf, - (sin6->sin6_addr.s6_addr[n] >> 4) & 0xf); - } - - p = ngx_cpymem(p, "\3ip6\4arpa\0", 10); - - break; -#endif - - default: /* AF_INET */ - - sin = (struct sockaddr_in *) addr->sockaddr; - inaddr = ntohl(sin->sin_addr.s_addr); - - for (n = 0; n < 32; n += 8) { - d = ngx_sprintf(&p[1], "%ud", (inaddr >> n) & 0xff); - *p = (u_char) (d - &p[1]); - p = d; - } - - p = ngx_cpymem(p, "\7in-addr\4arpa\0", 14); - } - - /* query type "PTR", IN query class */ - p = ngx_cpymem(p, "\0\14\0\1", 4); - - rn->qlen = (u_short) (p - rn->query); - - return NGX_OK; -} - - -static ngx_int_t -ngx_resolver_copy(ngx_resolver_t *r, ngx_str_t *name, u_char *buf, u_char *src, - u_char *last) -{ - char *err; - u_char *p, *dst; - size_t len; - ngx_uint_t i, n; - - p = src; - len = 0; - - /* - * compression pointers allow to create endless loop, so we set limit; - * 128 pointers should be enough to store 255-byte name - */ - - for (i = 0; i < 128; i++) { - n = *p++; - - if (n == 0) { - goto done; - } - - if (n & 0xc0) { - if ((n & 0xc0) != 0xc0) { - err = "invalid label type in DNS response"; - goto invalid; - } - - if (p >= last) { - err = "name is out of DNS response"; - goto invalid; - } - - n = ((n & 0x3f) << 8) + *p; - p = &buf[n]; - - } else { - len += 1 + n; - p = &p[n]; - } - - if (p >= last) { - err = "name is out of DNS response"; - goto invalid; - } - } - - err = "compression pointers loop in DNS response"; - -invalid: - - ngx_log_error(r->log_level, r->log, 0, err); - - return NGX_ERROR; - -done: - - if (name == NULL) { - return NGX_OK; - } - - if (len == 0) { - ngx_str_null(name); - return NGX_OK; - } - - dst = ngx_resolver_alloc(r, len); - if (dst == NULL) { - return NGX_ERROR; - } - - name->data = dst; - - for ( ;; ) { - n = *src++; - - if (n == 0) { - name->len = dst - name->data - 1; - return NGX_OK; - } - - if (n & 0xc0) { - n = ((n & 0x3f) << 8) + *src; - src = &buf[n]; - - } else { - ngx_strlow(dst, src, n); - dst += n; - src += n; - *dst++ = '.'; - } - } -} - - -static ngx_int_t -ngx_resolver_set_timeout(ngx_resolver_t *r, ngx_resolver_ctx_t *ctx) -{ - if (ctx->event || ctx->timeout == 0) { - return NGX_OK; - } - - ctx->event = ngx_resolver_calloc(r, sizeof(ngx_event_t)); - if (ctx->event == NULL) { - return NGX_ERROR; - } - - ctx->event->handler = ngx_resolver_timeout_handler; - ctx->event->data = ctx; - ctx->event->log = r->log; - ctx->event->cancelable = ctx->cancelable; - ctx->ident = -1; - - ngx_add_timer(ctx->event, ctx->timeout); - - return NGX_OK; -} - - -static void -ngx_resolver_timeout_handler(ngx_event_t *ev) -{ - ngx_resolver_ctx_t *ctx; - - ctx = ev->data; - - ctx->state = NGX_RESOLVE_TIMEDOUT; - - ctx->handler(ctx); -} - - -static void -ngx_resolver_free_node(ngx_resolver_t *r, ngx_resolver_node_t *rn) -{ - ngx_uint_t i; - - /* lock alloc mutex */ - - if (rn->query) { - ngx_resolver_free_locked(r, rn->query); - } - - if (rn->name) { - ngx_resolver_free_locked(r, rn->name); - } - - if (rn->cnlen) { - ngx_resolver_free_locked(r, rn->u.cname); - } - - if (rn->naddrs > 1 && rn->naddrs != (u_short) -1) { - ngx_resolver_free_locked(r, rn->u.addrs); - } - -#if (NGX_HAVE_INET6) - if (rn->naddrs6 > 1 && rn->naddrs6 != (u_short) -1) { - ngx_resolver_free_locked(r, rn->u6.addrs6); - } -#endif - - if (rn->nsrvs) { - for (i = 0; i < (ngx_uint_t) rn->nsrvs; i++) { - if (rn->u.srvs[i].name.data) { - ngx_resolver_free_locked(r, rn->u.srvs[i].name.data); - } - } - - ngx_resolver_free_locked(r, rn->u.srvs); - } - - ngx_resolver_free_locked(r, rn); - - /* unlock alloc mutex */ -} - - -static void * -ngx_resolver_alloc(ngx_resolver_t *r, size_t size) -{ - u_char *p; - - /* lock alloc mutex */ - - p = ngx_alloc(size, r->log); - - /* unlock alloc mutex */ - - return p; -} - - -static void * -ngx_resolver_calloc(ngx_resolver_t *r, size_t size) -{ - u_char *p; - - p = ngx_resolver_alloc(r, size); - - if (p) { - ngx_memzero(p, size); - } - - return p; -} - - -static void -ngx_resolver_free(ngx_resolver_t *r, void *p) -{ - /* lock alloc mutex */ - - ngx_free(p); - - /* unlock alloc mutex */ -} - - -static void -ngx_resolver_free_locked(ngx_resolver_t *r, void *p) -{ - ngx_free(p); -} - - -static void * -ngx_resolver_dup(ngx_resolver_t *r, void *src, size_t size) -{ - void *dst; - - dst = ngx_resolver_alloc(r, size); - - if (dst == NULL) { - return dst; - } - - ngx_memcpy(dst, src, size); - - return dst; -} - - -static ngx_resolver_addr_t * -ngx_resolver_export(ngx_resolver_t *r, ngx_resolver_node_t *rn, - ngx_uint_t rotate) -{ - ngx_uint_t d, i, j, n; - in_addr_t *addr; - ngx_sockaddr_t *sockaddr; - struct sockaddr_in *sin; - ngx_resolver_addr_t *dst; -#if (NGX_HAVE_INET6) - struct in6_addr *addr6; - struct sockaddr_in6 *sin6; -#endif - - n = rn->naddrs; -#if (NGX_HAVE_INET6) - n += rn->naddrs6; -#endif - - dst = ngx_resolver_calloc(r, n * sizeof(ngx_resolver_addr_t)); - if (dst == NULL) { - return NULL; - } - - sockaddr = ngx_resolver_calloc(r, n * sizeof(ngx_sockaddr_t)); - if (sockaddr == NULL) { - ngx_resolver_free(r, dst); - return NULL; - } - - i = 0; - d = rotate ? ngx_random() % n : 0; - - if (rn->naddrs) { - j = rotate ? ngx_random() % rn->naddrs : 0; - - addr = (rn->naddrs == 1) ? &rn->u.addr : rn->u.addrs; - - do { - sin = &sockaddr[d].sockaddr_in; - sin->sin_family = AF_INET; - sin->sin_addr.s_addr = addr[j++]; - dst[d].sockaddr = (struct sockaddr *) sin; - dst[d++].socklen = sizeof(struct sockaddr_in); - - if (d == n) { - d = 0; - } - - if (j == (ngx_uint_t) rn->naddrs) { - j = 0; - } - } while (++i < (ngx_uint_t) rn->naddrs); - } - -#if (NGX_HAVE_INET6) - if (rn->naddrs6) { - j = rotate ? ngx_random() % rn->naddrs6 : 0; - - addr6 = (rn->naddrs6 == 1) ? &rn->u6.addr6 : rn->u6.addrs6; - - do { - sin6 = &sockaddr[d].sockaddr_in6; - sin6->sin6_family = AF_INET6; - ngx_memcpy(sin6->sin6_addr.s6_addr, addr6[j++].s6_addr, 16); - dst[d].sockaddr = (struct sockaddr *) sin6; - dst[d++].socklen = sizeof(struct sockaddr_in6); - - if (d == n) { - d = 0; - } - - if (j == rn->naddrs6) { - j = 0; - } - } while (++i < n); - } -#endif - - return dst; -} - - -static void -ngx_resolver_report_srv(ngx_resolver_t *r, ngx_resolver_ctx_t *ctx) -{ - ngx_uint_t naddrs, nsrvs, nw, i, j, k, l, m, n, w; - ngx_resolver_addr_t *addrs; - ngx_resolver_srv_name_t *srvs; - - srvs = ctx->srvs; - nsrvs = ctx->nsrvs; - - naddrs = 0; - - for (i = 0; i < nsrvs; i++) { - if (srvs[i].state == NGX_ERROR) { - ctx->state = NGX_ERROR; - ctx->valid = ngx_time() + (r->valid ? r->valid : 10); - - ctx->handler(ctx); - return; - } - - naddrs += srvs[i].naddrs; - } - - if (naddrs == 0) { - ctx->state = srvs[0].state; - - for (i = 0; i < nsrvs; i++) { - if (srvs[i].state == NGX_RESOLVE_NXDOMAIN) { - ctx->state = NGX_RESOLVE_NXDOMAIN; - break; - } - } - - ctx->valid = ngx_time() + (r->valid ? r->valid : 10); - - ctx->handler(ctx); - return; - } - - addrs = ngx_resolver_calloc(r, naddrs * sizeof(ngx_resolver_addr_t)); - if (addrs == NULL) { - ctx->state = NGX_ERROR; - ctx->valid = ngx_time() + (r->valid ? r->valid : 10); - - ctx->handler(ctx); - return; - } - - i = 0; - n = 0; - - do { - nw = 0; - - for (j = i; j < nsrvs; j++) { - if (srvs[j].priority != srvs[i].priority) { - break; - } - - nw += srvs[j].naddrs * srvs[j].weight; - } - - if (nw == 0) { - goto next_srv; - } - - w = ngx_random() % nw; - - for (k = i; k < j; k++) { - if (w < srvs[k].naddrs * srvs[k].weight) { - break; - } - - w -= srvs[k].naddrs * srvs[k].weight; - } - - for (l = i; l < j; l++) { - - for (m = 0; m < srvs[k].naddrs; m++) { - addrs[n].socklen = srvs[k].addrs[m].socklen; - addrs[n].sockaddr = srvs[k].addrs[m].sockaddr; - addrs[n].name = srvs[k].name; - addrs[n].priority = srvs[k].priority; - addrs[n].weight = srvs[k].weight; - n++; - } - - if (++k == j) { - k = i; - } - } - -next_srv: - - i = j; - - } while (i < ctx->nsrvs); - - ctx->state = NGX_OK; - ctx->addrs = addrs; - ctx->naddrs = naddrs; - - ctx->handler(ctx); - - ngx_resolver_free(r, addrs); -} - - -char * -ngx_resolver_strerror(ngx_int_t err) -{ - static char *errors[] = { - "Format error", /* FORMERR */ - "Server failure", /* SERVFAIL */ - "Host not found", /* NXDOMAIN */ - "Unimplemented", /* NOTIMP */ - "Operation refused" /* REFUSED */ - }; - - if (err > 0 && err < 6) { - return errors[err - 1]; - } - - if (err == NGX_RESOLVE_TIMEDOUT) { - return "Operation timed out"; - } - - return "Unknown error"; -} - - -static u_char * -ngx_resolver_log_error(ngx_log_t *log, u_char *buf, size_t len) -{ - u_char *p; - ngx_resolver_connection_t *rec; - - p = buf; - - if (log->action) { - p = ngx_snprintf(buf, len, " while %s", log->action); - len -= p - buf; - } - - rec = log->data; - - if (rec) { - p = ngx_snprintf(p, len, ", resolver: %V", &rec->server); - } - - return p; -} - - -static ngx_int_t -ngx_udp_connect(ngx_resolver_connection_t *rec) -{ - int rc; - ngx_int_t event; - ngx_event_t *rev, *wev; - ngx_socket_t s; - ngx_connection_t *c; - - s = ngx_socket(rec->sockaddr->sa_family, SOCK_DGRAM, 0); - - ngx_log_debug1(NGX_LOG_DEBUG_EVENT, &rec->log, 0, "UDP socket %d", s); - - if (s == (ngx_socket_t) -1) { - ngx_log_error(NGX_LOG_ALERT, &rec->log, ngx_socket_errno, - ngx_socket_n " failed"); - return NGX_ERROR; - } - - c = ngx_get_connection(s, &rec->log); - - if (c == NULL) { - if (ngx_close_socket(s) == -1) { - ngx_log_error(NGX_LOG_ALERT, &rec->log, ngx_socket_errno, - ngx_close_socket_n " failed"); - } - - return NGX_ERROR; - } - - if (ngx_nonblocking(s) == -1) { - ngx_log_error(NGX_LOG_ALERT, &rec->log, ngx_socket_errno, - ngx_nonblocking_n " failed"); - - goto failed; - } - - rev = c->read; - wev = c->write; - - rev->log = &rec->log; - wev->log = &rec->log; - - rec->udp = c; - - c->number = ngx_atomic_fetch_add(ngx_connection_counter, 1); - - c->start_time = ngx_current_msec; - - ngx_log_debug3(NGX_LOG_DEBUG_EVENT, &rec->log, 0, - "connect to %V, fd:%d #%uA", &rec->server, s, c->number); - - rc = connect(s, rec->sockaddr, rec->socklen); - - /* TODO: iocp */ - - if (rc == -1) { - ngx_log_error(NGX_LOG_CRIT, &rec->log, ngx_socket_errno, - "connect() failed"); - - goto failed; - } - - /* UDP sockets are always ready to write */ - wev->ready = 1; - - event = (ngx_event_flags & NGX_USE_CLEAR_EVENT) ? - /* kqueue, epoll */ NGX_CLEAR_EVENT: - /* select, poll, /dev/poll */ NGX_LEVEL_EVENT; - /* eventport event type has no meaning: oneshot only */ - - if (ngx_add_event(rev, NGX_READ_EVENT, event) != NGX_OK) { - goto failed; - } - - return NGX_OK; - -failed: - - ngx_close_connection(c); - rec->udp = NULL; - - return NGX_ERROR; -} - - -static ngx_int_t -ngx_tcp_connect(ngx_resolver_connection_t *rec) -{ - int rc; - ngx_int_t event; - ngx_err_t err; - ngx_uint_t level; - ngx_socket_t s; - ngx_event_t *rev, *wev; - ngx_connection_t *c; - - s = ngx_socket(rec->sockaddr->sa_family, SOCK_STREAM, 0); - - ngx_log_debug1(NGX_LOG_DEBUG_EVENT, &rec->log, 0, "TCP socket %d", s); - - if (s == (ngx_socket_t) -1) { - ngx_log_error(NGX_LOG_ALERT, &rec->log, ngx_socket_errno, - ngx_socket_n " failed"); - return NGX_ERROR; - } - - c = ngx_get_connection(s, &rec->log); - - if (c == NULL) { - if (ngx_close_socket(s) == -1) { - ngx_log_error(NGX_LOG_ALERT, &rec->log, ngx_socket_errno, - ngx_close_socket_n " failed"); - } - - return NGX_ERROR; - } - - if (ngx_nonblocking(s) == -1) { - ngx_log_error(NGX_LOG_ALERT, &rec->log, ngx_socket_errno, - ngx_nonblocking_n " failed"); - - goto failed; - } - - rev = c->read; - wev = c->write; - - rev->log = &rec->log; - wev->log = &rec->log; - - rec->tcp = c; - - c->number = ngx_atomic_fetch_add(ngx_connection_counter, 1); - - c->start_time = ngx_current_msec; - - if (ngx_add_conn) { - if (ngx_add_conn(c) == NGX_ERROR) { - goto failed; - } - } - - ngx_log_debug3(NGX_LOG_DEBUG_EVENT, &rec->log, 0, - "connect to %V, fd:%d #%uA", &rec->server, s, c->number); - - rc = connect(s, rec->sockaddr, rec->socklen); - - if (rc == -1) { - err = ngx_socket_errno; - - - if (err != NGX_EINPROGRESS -#if (NGX_WIN32) - /* Winsock returns WSAEWOULDBLOCK (NGX_EAGAIN) */ - && err != NGX_EAGAIN -#endif - ) - { - if (err == NGX_ECONNREFUSED -#if (NGX_LINUX) - /* - * Linux returns EAGAIN instead of ECONNREFUSED - * for unix sockets if listen queue is full - */ - || err == NGX_EAGAIN -#endif - || err == NGX_ECONNRESET - || err == NGX_ENETDOWN - || err == NGX_ENETUNREACH - || err == NGX_EHOSTDOWN - || err == NGX_EHOSTUNREACH) - { - level = NGX_LOG_ERR; - - } else { - level = NGX_LOG_CRIT; - } - - ngx_log_error(level, &rec->log, err, "connect() to %V failed", - &rec->server); - - ngx_close_connection(c); - rec->tcp = NULL; - - return NGX_ERROR; - } - } - - if (ngx_add_conn) { - if (rc == -1) { - - /* NGX_EINPROGRESS */ - - return NGX_AGAIN; - } - - ngx_log_debug0(NGX_LOG_DEBUG_EVENT, &rec->log, 0, "connected"); - - wev->ready = 1; - - return NGX_OK; - } - - if (ngx_event_flags & NGX_USE_IOCP_EVENT) { - - ngx_log_debug1(NGX_LOG_DEBUG_EVENT, &rec->log, ngx_socket_errno, - "connect(): %d", rc); - - if (ngx_blocking(s) == -1) { - ngx_log_error(NGX_LOG_ALERT, &rec->log, ngx_socket_errno, - ngx_blocking_n " failed"); - goto failed; - } - - /* - * FreeBSD's aio allows to post an operation on non-connected socket. - * NT does not support it. - * - * TODO: check in Win32, etc. As workaround we can use NGX_ONESHOT_EVENT - */ - - rev->ready = 1; - wev->ready = 1; - - return NGX_OK; - } - - if (ngx_event_flags & NGX_USE_CLEAR_EVENT) { - - /* kqueue */ - - event = NGX_CLEAR_EVENT; - - } else { - - /* select, poll, /dev/poll */ - - event = NGX_LEVEL_EVENT; - } - - if (ngx_add_event(rev, NGX_READ_EVENT, event) != NGX_OK) { - goto failed; - } - - if (rc == -1) { - - /* NGX_EINPROGRESS */ - - if (ngx_add_event(wev, NGX_WRITE_EVENT, event) != NGX_OK) { - goto failed; - } - - return NGX_AGAIN; - } - - ngx_log_debug0(NGX_LOG_DEBUG_EVENT, &rec->log, 0, "connected"); - - wev->ready = 1; - - return NGX_OK; - -failed: - - ngx_close_connection(c); - rec->tcp = NULL; - - return NGX_ERROR; -} - - -static ngx_int_t -ngx_resolver_cmp_srvs(const void *one, const void *two) -{ - ngx_int_t p1, p2; - ngx_resolver_srv_t *first, *second; - - first = (ngx_resolver_srv_t *) one; - second = (ngx_resolver_srv_t *) two; - - p1 = first->priority; - p2 = second->priority; - - return p1 - p2; -} diff --git a/src/deps/src/nginx-1.30.3/src/core/ngx_resolver.h b/src/deps/src/nginx-1.30.3/src/core/ngx_resolver.h deleted file mode 100644 index 06026b77d6..0000000000 --- a/src/deps/src/nginx-1.30.3/src/core/ngx_resolver.h +++ /dev/null @@ -1,242 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#include -#include - - -#ifndef _NGX_RESOLVER_H_INCLUDED_ -#define _NGX_RESOLVER_H_INCLUDED_ - - -#define NGX_RESOLVE_A 1 -#define NGX_RESOLVE_CNAME 5 -#define NGX_RESOLVE_PTR 12 -#define NGX_RESOLVE_MX 15 -#define NGX_RESOLVE_TXT 16 -#if (NGX_HAVE_INET6) -#define NGX_RESOLVE_AAAA 28 -#endif -#define NGX_RESOLVE_SRV 33 -#define NGX_RESOLVE_DNAME 39 - -#define NGX_RESOLVE_FORMERR 1 -#define NGX_RESOLVE_SERVFAIL 2 -#define NGX_RESOLVE_NXDOMAIN 3 -#define NGX_RESOLVE_NOTIMP 4 -#define NGX_RESOLVE_REFUSED 5 -#define NGX_RESOLVE_TIMEDOUT NGX_ETIMEDOUT - - -#define NGX_NO_RESOLVER (void *) -1 - -#define NGX_RESOLVER_MAX_RECURSION 50 - - -typedef struct ngx_resolver_s ngx_resolver_t; - - -typedef struct { - ngx_connection_t *udp; - ngx_connection_t *tcp; - struct sockaddr *sockaddr; - socklen_t socklen; - ngx_str_t server; - ngx_log_t log; - ngx_buf_t *read_buf; - ngx_buf_t *write_buf; - ngx_resolver_t *resolver; -} ngx_resolver_connection_t; - - -typedef struct ngx_resolver_ctx_s ngx_resolver_ctx_t; - -typedef void (*ngx_resolver_handler_pt)(ngx_resolver_ctx_t *ctx); - - -typedef struct { - struct sockaddr *sockaddr; - socklen_t socklen; - ngx_str_t name; - u_short priority; - u_short weight; -} ngx_resolver_addr_t; - - -typedef struct { - ngx_str_t name; - u_short priority; - u_short weight; - u_short port; -} ngx_resolver_srv_t; - - -typedef struct { - ngx_str_t name; - u_short priority; - u_short weight; - u_short port; - - ngx_resolver_ctx_t *ctx; - ngx_int_t state; - - ngx_uint_t naddrs; - ngx_addr_t *addrs; -} ngx_resolver_srv_name_t; - - -typedef struct { - ngx_rbtree_node_t node; - ngx_queue_t queue; - - /* PTR: resolved name, A: name to resolve */ - u_char *name; - -#if (NGX_HAVE_INET6) - /* PTR: IPv6 address to resolve (IPv4 address is in rbtree node key) */ - struct in6_addr addr6; -#endif - - u_short nlen; - u_short qlen; - - u_char *query; -#if (NGX_HAVE_INET6) - u_char *query6; -#endif - - union { - in_addr_t addr; - in_addr_t *addrs; - u_char *cname; - ngx_resolver_srv_t *srvs; - } u; - - u_char code; - u_short naddrs; - u_short nsrvs; - u_short cnlen; - -#if (NGX_HAVE_INET6) - union { - struct in6_addr addr6; - struct in6_addr *addrs6; - } u6; - - u_short naddrs6; -#endif - - time_t expire; - time_t valid; - uint32_t ttl; - - unsigned tcp:1; -#if (NGX_HAVE_INET6) - unsigned tcp6:1; -#endif - - ngx_uint_t last_connection; - - ngx_resolver_ctx_t *waiting; -} ngx_resolver_node_t; - - -struct ngx_resolver_s { - /* has to be pointer because of "incomplete type" */ - ngx_event_t *event; - void *dummy; - ngx_log_t *log; - - /* event ident must be after 3 pointers as in ngx_connection_t */ - ngx_int_t ident; - - /* simple round robin DNS peers balancer */ - ngx_array_t connections; - ngx_uint_t last_connection; - - ngx_rbtree_t name_rbtree; - ngx_rbtree_node_t name_sentinel; - - ngx_rbtree_t srv_rbtree; - ngx_rbtree_node_t srv_sentinel; - - ngx_rbtree_t addr_rbtree; - ngx_rbtree_node_t addr_sentinel; - - ngx_queue_t name_resend_queue; - ngx_queue_t srv_resend_queue; - ngx_queue_t addr_resend_queue; - - ngx_queue_t name_expire_queue; - ngx_queue_t srv_expire_queue; - ngx_queue_t addr_expire_queue; - - unsigned ipv4:1; - -#if (NGX_HAVE_INET6) - unsigned ipv6:1; - ngx_rbtree_t addr6_rbtree; - ngx_rbtree_node_t addr6_sentinel; - ngx_queue_t addr6_resend_queue; - ngx_queue_t addr6_expire_queue; -#endif - - time_t resend_timeout; - time_t tcp_timeout; - time_t expire; - time_t valid; - - ngx_uint_t log_level; -}; - - -struct ngx_resolver_ctx_s { - ngx_resolver_ctx_t *next; - ngx_resolver_t *resolver; - ngx_resolver_node_t *node; - - /* event ident must be after 3 pointers as in ngx_connection_t */ - ngx_int_t ident; - - ngx_int_t state; - ngx_str_t name; - ngx_str_t service; - - time_t valid; - ngx_uint_t naddrs; - ngx_resolver_addr_t *addrs; - ngx_resolver_addr_t addr; - struct sockaddr_in sin; - - ngx_uint_t count; - ngx_uint_t nsrvs; - ngx_resolver_srv_name_t *srvs; - - ngx_resolver_handler_pt handler; - void *data; - ngx_msec_t timeout; - - unsigned quick:1; - unsigned async:1; - unsigned cancelable:1; - ngx_uint_t recursion; - ngx_event_t *event; -}; - - -ngx_resolver_t *ngx_resolver_create(ngx_conf_t *cf, ngx_str_t *names, - ngx_uint_t n); -ngx_resolver_ctx_t *ngx_resolve_start(ngx_resolver_t *r, - ngx_resolver_ctx_t *temp); -ngx_int_t ngx_resolve_name(ngx_resolver_ctx_t *ctx); -void ngx_resolve_name_done(ngx_resolver_ctx_t *ctx); -ngx_int_t ngx_resolve_addr(ngx_resolver_ctx_t *ctx); -void ngx_resolve_addr_done(ngx_resolver_ctx_t *ctx); -char *ngx_resolver_strerror(ngx_int_t err); - - -#endif /* _NGX_RESOLVER_H_INCLUDED_ */ diff --git a/src/deps/src/nginx-1.30.3/src/core/ngx_rwlock.c b/src/deps/src/nginx-1.30.3/src/core/ngx_rwlock.c deleted file mode 100644 index e7da8a8ec5..0000000000 --- a/src/deps/src/nginx-1.30.3/src/core/ngx_rwlock.c +++ /dev/null @@ -1,117 +0,0 @@ - -/* - * Copyright (C) Ruslan Ermilov - * Copyright (C) Nginx, Inc. - */ - - -#include -#include - - -#if (NGX_HAVE_ATOMIC_OPS) - - -#define NGX_RWLOCK_SPIN 2048 -#define NGX_RWLOCK_WLOCK ((ngx_atomic_uint_t) -1) - - -void -ngx_rwlock_wlock(ngx_atomic_t *lock) -{ - ngx_uint_t i, n; - - for ( ;; ) { - - if (*lock == 0 && ngx_atomic_cmp_set(lock, 0, NGX_RWLOCK_WLOCK)) { - return; - } - - if (ngx_ncpu > 1) { - - for (n = 1; n < NGX_RWLOCK_SPIN; n <<= 1) { - - for (i = 0; i < n; i++) { - ngx_cpu_pause(); - } - - if (*lock == 0 - && ngx_atomic_cmp_set(lock, 0, NGX_RWLOCK_WLOCK)) - { - return; - } - } - } - - ngx_sched_yield(); - } -} - - -void -ngx_rwlock_rlock(ngx_atomic_t *lock) -{ - ngx_uint_t i, n; - ngx_atomic_uint_t readers; - - for ( ;; ) { - readers = *lock; - - if (readers != NGX_RWLOCK_WLOCK - && ngx_atomic_cmp_set(lock, readers, readers + 1)) - { - return; - } - - if (ngx_ncpu > 1) { - - for (n = 1; n < NGX_RWLOCK_SPIN; n <<= 1) { - - for (i = 0; i < n; i++) { - ngx_cpu_pause(); - } - - readers = *lock; - - if (readers != NGX_RWLOCK_WLOCK - && ngx_atomic_cmp_set(lock, readers, readers + 1)) - { - return; - } - } - } - - ngx_sched_yield(); - } -} - - -void -ngx_rwlock_unlock(ngx_atomic_t *lock) -{ - if (*lock == NGX_RWLOCK_WLOCK) { - (void) ngx_atomic_cmp_set(lock, NGX_RWLOCK_WLOCK, 0); - } else { - (void) ngx_atomic_fetch_add(lock, -1); - } -} - - -void -ngx_rwlock_downgrade(ngx_atomic_t *lock) -{ - if (*lock == NGX_RWLOCK_WLOCK) { - *lock = 1; - } -} - - -#else - -#if (NGX_HTTP_UPSTREAM_ZONE || NGX_STREAM_UPSTREAM_ZONE) - -#error ngx_atomic_cmp_set() is not defined! - -#endif - -#endif diff --git a/src/deps/src/nginx-1.30.3/src/core/ngx_rwlock.h b/src/deps/src/nginx-1.30.3/src/core/ngx_rwlock.h deleted file mode 100644 index 41b42aa82d..0000000000 --- a/src/deps/src/nginx-1.30.3/src/core/ngx_rwlock.h +++ /dev/null @@ -1,22 +0,0 @@ - -/* - * Copyright (C) Ruslan Ermilov - * Copyright (C) Nginx, Inc. - */ - - -#ifndef _NGX_RWLOCK_H_INCLUDED_ -#define _NGX_RWLOCK_H_INCLUDED_ - - -#include -#include - - -void ngx_rwlock_wlock(ngx_atomic_t *lock); -void ngx_rwlock_rlock(ngx_atomic_t *lock); -void ngx_rwlock_unlock(ngx_atomic_t *lock); -void ngx_rwlock_downgrade(ngx_atomic_t *lock); - - -#endif /* _NGX_RWLOCK_H_INCLUDED_ */ diff --git a/src/deps/src/nginx-1.30.3/src/core/ngx_sha1.c b/src/deps/src/nginx-1.30.3/src/core/ngx_sha1.c deleted file mode 100644 index f00dc52d68..0000000000 --- a/src/deps/src/nginx-1.30.3/src/core/ngx_sha1.c +++ /dev/null @@ -1,294 +0,0 @@ - -/* - * Copyright (C) Maxim Dounin - * Copyright (C) Nginx, Inc. - * - * An internal SHA1 implementation. - */ - - -#include -#include -#include - - -static const u_char *ngx_sha1_body(ngx_sha1_t *ctx, const u_char *data, - size_t size); - - -void -ngx_sha1_init(ngx_sha1_t *ctx) -{ - ctx->a = 0x67452301; - ctx->b = 0xefcdab89; - ctx->c = 0x98badcfe; - ctx->d = 0x10325476; - ctx->e = 0xc3d2e1f0; - - ctx->bytes = 0; -} - - -void -ngx_sha1_update(ngx_sha1_t *ctx, const void *data, size_t size) -{ - size_t used, free; - - used = (size_t) (ctx->bytes & 0x3f); - ctx->bytes += size; - - if (used) { - free = 64 - used; - - if (size < free) { - ngx_memcpy(&ctx->buffer[used], data, size); - return; - } - - ngx_memcpy(&ctx->buffer[used], data, free); - data = (u_char *) data + free; - size -= free; - (void) ngx_sha1_body(ctx, ctx->buffer, 64); - } - - if (size >= 64) { - data = ngx_sha1_body(ctx, data, size & ~(size_t) 0x3f); - size &= 0x3f; - } - - ngx_memcpy(ctx->buffer, data, size); -} - - -void -ngx_sha1_final(u_char result[20], ngx_sha1_t *ctx) -{ - size_t used, free; - - used = (size_t) (ctx->bytes & 0x3f); - - ctx->buffer[used++] = 0x80; - - free = 64 - used; - - if (free < 8) { - ngx_memzero(&ctx->buffer[used], free); - (void) ngx_sha1_body(ctx, ctx->buffer, 64); - used = 0; - free = 64; - } - - ngx_memzero(&ctx->buffer[used], free - 8); - - ctx->bytes <<= 3; - ctx->buffer[56] = (u_char) (ctx->bytes >> 56); - ctx->buffer[57] = (u_char) (ctx->bytes >> 48); - ctx->buffer[58] = (u_char) (ctx->bytes >> 40); - ctx->buffer[59] = (u_char) (ctx->bytes >> 32); - ctx->buffer[60] = (u_char) (ctx->bytes >> 24); - ctx->buffer[61] = (u_char) (ctx->bytes >> 16); - ctx->buffer[62] = (u_char) (ctx->bytes >> 8); - ctx->buffer[63] = (u_char) ctx->bytes; - - (void) ngx_sha1_body(ctx, ctx->buffer, 64); - - result[0] = (u_char) (ctx->a >> 24); - result[1] = (u_char) (ctx->a >> 16); - result[2] = (u_char) (ctx->a >> 8); - result[3] = (u_char) ctx->a; - result[4] = (u_char) (ctx->b >> 24); - result[5] = (u_char) (ctx->b >> 16); - result[6] = (u_char) (ctx->b >> 8); - result[7] = (u_char) ctx->b; - result[8] = (u_char) (ctx->c >> 24); - result[9] = (u_char) (ctx->c >> 16); - result[10] = (u_char) (ctx->c >> 8); - result[11] = (u_char) ctx->c; - result[12] = (u_char) (ctx->d >> 24); - result[13] = (u_char) (ctx->d >> 16); - result[14] = (u_char) (ctx->d >> 8); - result[15] = (u_char) ctx->d; - result[16] = (u_char) (ctx->e >> 24); - result[17] = (u_char) (ctx->e >> 16); - result[18] = (u_char) (ctx->e >> 8); - result[19] = (u_char) ctx->e; - - ngx_memzero(ctx, sizeof(*ctx)); -} - - -/* - * Helper functions. - */ - -#define ROTATE(bits, word) (((word) << (bits)) | ((word) >> (32 - (bits)))) - -#define F1(b, c, d) (((b) & (c)) | ((~(b)) & (d))) -#define F2(b, c, d) ((b) ^ (c) ^ (d)) -#define F3(b, c, d) (((b) & (c)) | ((b) & (d)) | ((c) & (d))) - -#define STEP(f, a, b, c, d, e, w, t) \ - temp = ROTATE(5, (a)) + f((b), (c), (d)) + (e) + (w) + (t); \ - (e) = (d); \ - (d) = (c); \ - (c) = ROTATE(30, (b)); \ - (b) = (a); \ - (a) = temp; - - -/* - * GET() reads 4 input bytes in big-endian byte order and returns - * them as uint32_t. - */ - -#define GET(n) \ - ((uint32_t) p[n * 4 + 3] | \ - ((uint32_t) p[n * 4 + 2] << 8) | \ - ((uint32_t) p[n * 4 + 1] << 16) | \ - ((uint32_t) p[n * 4] << 24)) - - -/* - * This processes one or more 64-byte data blocks, but does not update - * the bit counters. There are no alignment requirements. - */ - -static const u_char * -ngx_sha1_body(ngx_sha1_t *ctx, const u_char *data, size_t size) -{ - uint32_t a, b, c, d, e, temp; - uint32_t saved_a, saved_b, saved_c, saved_d, saved_e; - uint32_t words[80]; - ngx_uint_t i; - const u_char *p; - - p = data; - - a = ctx->a; - b = ctx->b; - c = ctx->c; - d = ctx->d; - e = ctx->e; - - do { - saved_a = a; - saved_b = b; - saved_c = c; - saved_d = d; - saved_e = e; - - /* Load data block into the words array */ - - for (i = 0; i < 16; i++) { - words[i] = GET(i); - } - - for (i = 16; i < 80; i++) { - words[i] = ROTATE(1, words[i - 3] ^ words[i - 8] ^ words[i - 14] - ^ words[i - 16]); - } - - /* Transformations */ - - STEP(F1, a, b, c, d, e, words[0], 0x5a827999); - STEP(F1, a, b, c, d, e, words[1], 0x5a827999); - STEP(F1, a, b, c, d, e, words[2], 0x5a827999); - STEP(F1, a, b, c, d, e, words[3], 0x5a827999); - STEP(F1, a, b, c, d, e, words[4], 0x5a827999); - STEP(F1, a, b, c, d, e, words[5], 0x5a827999); - STEP(F1, a, b, c, d, e, words[6], 0x5a827999); - STEP(F1, a, b, c, d, e, words[7], 0x5a827999); - STEP(F1, a, b, c, d, e, words[8], 0x5a827999); - STEP(F1, a, b, c, d, e, words[9], 0x5a827999); - STEP(F1, a, b, c, d, e, words[10], 0x5a827999); - STEP(F1, a, b, c, d, e, words[11], 0x5a827999); - STEP(F1, a, b, c, d, e, words[12], 0x5a827999); - STEP(F1, a, b, c, d, e, words[13], 0x5a827999); - STEP(F1, a, b, c, d, e, words[14], 0x5a827999); - STEP(F1, a, b, c, d, e, words[15], 0x5a827999); - STEP(F1, a, b, c, d, e, words[16], 0x5a827999); - STEP(F1, a, b, c, d, e, words[17], 0x5a827999); - STEP(F1, a, b, c, d, e, words[18], 0x5a827999); - STEP(F1, a, b, c, d, e, words[19], 0x5a827999); - - STEP(F2, a, b, c, d, e, words[20], 0x6ed9eba1); - STEP(F2, a, b, c, d, e, words[21], 0x6ed9eba1); - STEP(F2, a, b, c, d, e, words[22], 0x6ed9eba1); - STEP(F2, a, b, c, d, e, words[23], 0x6ed9eba1); - STEP(F2, a, b, c, d, e, words[24], 0x6ed9eba1); - STEP(F2, a, b, c, d, e, words[25], 0x6ed9eba1); - STEP(F2, a, b, c, d, e, words[26], 0x6ed9eba1); - STEP(F2, a, b, c, d, e, words[27], 0x6ed9eba1); - STEP(F2, a, b, c, d, e, words[28], 0x6ed9eba1); - STEP(F2, a, b, c, d, e, words[29], 0x6ed9eba1); - STEP(F2, a, b, c, d, e, words[30], 0x6ed9eba1); - STEP(F2, a, b, c, d, e, words[31], 0x6ed9eba1); - STEP(F2, a, b, c, d, e, words[32], 0x6ed9eba1); - STEP(F2, a, b, c, d, e, words[33], 0x6ed9eba1); - STEP(F2, a, b, c, d, e, words[34], 0x6ed9eba1); - STEP(F2, a, b, c, d, e, words[35], 0x6ed9eba1); - STEP(F2, a, b, c, d, e, words[36], 0x6ed9eba1); - STEP(F2, a, b, c, d, e, words[37], 0x6ed9eba1); - STEP(F2, a, b, c, d, e, words[38], 0x6ed9eba1); - STEP(F2, a, b, c, d, e, words[39], 0x6ed9eba1); - - STEP(F3, a, b, c, d, e, words[40], 0x8f1bbcdc); - STEP(F3, a, b, c, d, e, words[41], 0x8f1bbcdc); - STEP(F3, a, b, c, d, e, words[42], 0x8f1bbcdc); - STEP(F3, a, b, c, d, e, words[43], 0x8f1bbcdc); - STEP(F3, a, b, c, d, e, words[44], 0x8f1bbcdc); - STEP(F3, a, b, c, d, e, words[45], 0x8f1bbcdc); - STEP(F3, a, b, c, d, e, words[46], 0x8f1bbcdc); - STEP(F3, a, b, c, d, e, words[47], 0x8f1bbcdc); - STEP(F3, a, b, c, d, e, words[48], 0x8f1bbcdc); - STEP(F3, a, b, c, d, e, words[49], 0x8f1bbcdc); - STEP(F3, a, b, c, d, e, words[50], 0x8f1bbcdc); - STEP(F3, a, b, c, d, e, words[51], 0x8f1bbcdc); - STEP(F3, a, b, c, d, e, words[52], 0x8f1bbcdc); - STEP(F3, a, b, c, d, e, words[53], 0x8f1bbcdc); - STEP(F3, a, b, c, d, e, words[54], 0x8f1bbcdc); - STEP(F3, a, b, c, d, e, words[55], 0x8f1bbcdc); - STEP(F3, a, b, c, d, e, words[56], 0x8f1bbcdc); - STEP(F3, a, b, c, d, e, words[57], 0x8f1bbcdc); - STEP(F3, a, b, c, d, e, words[58], 0x8f1bbcdc); - STEP(F3, a, b, c, d, e, words[59], 0x8f1bbcdc); - - STEP(F2, a, b, c, d, e, words[60], 0xca62c1d6); - STEP(F2, a, b, c, d, e, words[61], 0xca62c1d6); - STEP(F2, a, b, c, d, e, words[62], 0xca62c1d6); - STEP(F2, a, b, c, d, e, words[63], 0xca62c1d6); - STEP(F2, a, b, c, d, e, words[64], 0xca62c1d6); - STEP(F2, a, b, c, d, e, words[65], 0xca62c1d6); - STEP(F2, a, b, c, d, e, words[66], 0xca62c1d6); - STEP(F2, a, b, c, d, e, words[67], 0xca62c1d6); - STEP(F2, a, b, c, d, e, words[68], 0xca62c1d6); - STEP(F2, a, b, c, d, e, words[69], 0xca62c1d6); - STEP(F2, a, b, c, d, e, words[70], 0xca62c1d6); - STEP(F2, a, b, c, d, e, words[71], 0xca62c1d6); - STEP(F2, a, b, c, d, e, words[72], 0xca62c1d6); - STEP(F2, a, b, c, d, e, words[73], 0xca62c1d6); - STEP(F2, a, b, c, d, e, words[74], 0xca62c1d6); - STEP(F2, a, b, c, d, e, words[75], 0xca62c1d6); - STEP(F2, a, b, c, d, e, words[76], 0xca62c1d6); - STEP(F2, a, b, c, d, e, words[77], 0xca62c1d6); - STEP(F2, a, b, c, d, e, words[78], 0xca62c1d6); - STEP(F2, a, b, c, d, e, words[79], 0xca62c1d6); - - a += saved_a; - b += saved_b; - c += saved_c; - d += saved_d; - e += saved_e; - - p += 64; - - } while (size -= 64); - - ctx->a = a; - ctx->b = b; - ctx->c = c; - ctx->d = d; - ctx->e = e; - - return p; -} diff --git a/src/deps/src/nginx-1.30.3/src/core/ngx_sha1.h b/src/deps/src/nginx-1.30.3/src/core/ngx_sha1.h deleted file mode 100644 index 4a98f71834..0000000000 --- a/src/deps/src/nginx-1.30.3/src/core/ngx_sha1.h +++ /dev/null @@ -1,28 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#ifndef _NGX_SHA1_H_INCLUDED_ -#define _NGX_SHA1_H_INCLUDED_ - - -#include -#include - - -typedef struct { - uint64_t bytes; - uint32_t a, b, c, d, e, f; - u_char buffer[64]; -} ngx_sha1_t; - - -void ngx_sha1_init(ngx_sha1_t *ctx); -void ngx_sha1_update(ngx_sha1_t *ctx, const void *data, size_t size); -void ngx_sha1_final(u_char result[20], ngx_sha1_t *ctx); - - -#endif /* _NGX_SHA1_H_INCLUDED_ */ diff --git a/src/deps/src/nginx-1.30.3/src/core/ngx_shmtx.c b/src/deps/src/nginx-1.30.3/src/core/ngx_shmtx.c deleted file mode 100644 index a255903efe..0000000000 --- a/src/deps/src/nginx-1.30.3/src/core/ngx_shmtx.c +++ /dev/null @@ -1,310 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#include -#include - - -#if (NGX_HAVE_ATOMIC_OPS) - - -static void ngx_shmtx_wakeup(ngx_shmtx_t *mtx); - - -ngx_int_t -ngx_shmtx_create(ngx_shmtx_t *mtx, ngx_shmtx_sh_t *addr, u_char *name) -{ - mtx->lock = &addr->lock; - - if (mtx->spin == (ngx_uint_t) -1) { - return NGX_OK; - } - - mtx->spin = 2048; - -#if (NGX_HAVE_POSIX_SEM) - - mtx->wait = &addr->wait; - - if (sem_init(&mtx->sem, 1, 0) == -1) { - ngx_log_error(NGX_LOG_ALERT, ngx_cycle->log, ngx_errno, - "sem_init() failed"); - } else { - mtx->semaphore = 1; - } - -#endif - - return NGX_OK; -} - - -void -ngx_shmtx_destroy(ngx_shmtx_t *mtx) -{ -#if (NGX_HAVE_POSIX_SEM) - - if (mtx->semaphore) { - if (sem_destroy(&mtx->sem) == -1) { - ngx_log_error(NGX_LOG_ALERT, ngx_cycle->log, ngx_errno, - "sem_destroy() failed"); - } - } - -#endif -} - - -ngx_uint_t -ngx_shmtx_trylock(ngx_shmtx_t *mtx) -{ - return (*mtx->lock == 0 && ngx_atomic_cmp_set(mtx->lock, 0, ngx_pid)); -} - - -void -ngx_shmtx_lock(ngx_shmtx_t *mtx) -{ - ngx_uint_t i, n; - - ngx_log_debug0(NGX_LOG_DEBUG_CORE, ngx_cycle->log, 0, "shmtx lock"); - - for ( ;; ) { - - if (*mtx->lock == 0 && ngx_atomic_cmp_set(mtx->lock, 0, ngx_pid)) { - return; - } - - if (ngx_ncpu > 1) { - - for (n = 1; n < mtx->spin; n <<= 1) { - - for (i = 0; i < n; i++) { - ngx_cpu_pause(); - } - - if (*mtx->lock == 0 - && ngx_atomic_cmp_set(mtx->lock, 0, ngx_pid)) - { - return; - } - } - } - -#if (NGX_HAVE_POSIX_SEM) - - if (mtx->semaphore) { - (void) ngx_atomic_fetch_add(mtx->wait, 1); - - if (*mtx->lock == 0 && ngx_atomic_cmp_set(mtx->lock, 0, ngx_pid)) { - (void) ngx_atomic_fetch_add(mtx->wait, -1); - return; - } - - ngx_log_debug1(NGX_LOG_DEBUG_CORE, ngx_cycle->log, 0, - "shmtx wait %uA", *mtx->wait); - - while (sem_wait(&mtx->sem) == -1) { - ngx_err_t err; - - err = ngx_errno; - - if (err != NGX_EINTR) { - ngx_log_error(NGX_LOG_ALERT, ngx_cycle->log, err, - "sem_wait() failed while waiting on shmtx"); - break; - } - } - - ngx_log_debug0(NGX_LOG_DEBUG_CORE, ngx_cycle->log, 0, - "shmtx awoke"); - - continue; - } - -#endif - - ngx_sched_yield(); - } -} - - -void -ngx_shmtx_unlock(ngx_shmtx_t *mtx) -{ - if (mtx->spin != (ngx_uint_t) -1) { - ngx_log_debug0(NGX_LOG_DEBUG_CORE, ngx_cycle->log, 0, "shmtx unlock"); - } - - if (ngx_atomic_cmp_set(mtx->lock, ngx_pid, 0)) { - ngx_shmtx_wakeup(mtx); - } -} - - -ngx_uint_t -ngx_shmtx_force_unlock(ngx_shmtx_t *mtx, ngx_pid_t pid) -{ - ngx_log_debug0(NGX_LOG_DEBUG_CORE, ngx_cycle->log, 0, - "shmtx forced unlock"); - - if (ngx_atomic_cmp_set(mtx->lock, pid, 0)) { - ngx_shmtx_wakeup(mtx); - return 1; - } - - return 0; -} - - -static void -ngx_shmtx_wakeup(ngx_shmtx_t *mtx) -{ -#if (NGX_HAVE_POSIX_SEM) - ngx_atomic_uint_t wait; - - if (!mtx->semaphore) { - return; - } - - for ( ;; ) { - - wait = *mtx->wait; - - if ((ngx_atomic_int_t) wait <= 0) { - return; - } - - if (ngx_atomic_cmp_set(mtx->wait, wait, wait - 1)) { - break; - } - } - - ngx_log_debug1(NGX_LOG_DEBUG_CORE, ngx_cycle->log, 0, - "shmtx wake %uA", wait); - - if (sem_post(&mtx->sem) == -1) { - ngx_log_error(NGX_LOG_ALERT, ngx_cycle->log, ngx_errno, - "sem_post() failed while wake shmtx"); - } - -#endif -} - - -#else - - -ngx_int_t -ngx_shmtx_create(ngx_shmtx_t *mtx, ngx_shmtx_sh_t *addr, u_char *name) -{ - if (mtx->name) { - - if (ngx_strcmp(name, mtx->name) == 0) { - mtx->name = name; - return NGX_OK; - } - - ngx_shmtx_destroy(mtx); - } - - mtx->fd = ngx_open_file(name, NGX_FILE_RDWR, NGX_FILE_CREATE_OR_OPEN, - NGX_FILE_DEFAULT_ACCESS); - - if (mtx->fd == NGX_INVALID_FILE) { - ngx_log_error(NGX_LOG_EMERG, ngx_cycle->log, ngx_errno, - ngx_open_file_n " \"%s\" failed", name); - return NGX_ERROR; - } - - if (ngx_delete_file(name) == NGX_FILE_ERROR) { - ngx_log_error(NGX_LOG_ALERT, ngx_cycle->log, ngx_errno, - ngx_delete_file_n " \"%s\" failed", name); - } - - mtx->name = name; - - return NGX_OK; -} - - -void -ngx_shmtx_destroy(ngx_shmtx_t *mtx) -{ - if (ngx_close_file(mtx->fd) == NGX_FILE_ERROR) { - ngx_log_error(NGX_LOG_ALERT, ngx_cycle->log, ngx_errno, - ngx_close_file_n " \"%s\" failed", mtx->name); - } -} - - -ngx_uint_t -ngx_shmtx_trylock(ngx_shmtx_t *mtx) -{ - ngx_err_t err; - - err = ngx_trylock_fd(mtx->fd); - - if (err == 0) { - return 1; - } - - if (err == NGX_EAGAIN) { - return 0; - } - -#if __osf__ /* Tru64 UNIX */ - - if (err == NGX_EACCES) { - return 0; - } - -#endif - - ngx_log_abort(err, ngx_trylock_fd_n " %s failed", mtx->name); - - return 0; -} - - -void -ngx_shmtx_lock(ngx_shmtx_t *mtx) -{ - ngx_err_t err; - - err = ngx_lock_fd(mtx->fd); - - if (err == 0) { - return; - } - - ngx_log_abort(err, ngx_lock_fd_n " %s failed", mtx->name); -} - - -void -ngx_shmtx_unlock(ngx_shmtx_t *mtx) -{ - ngx_err_t err; - - err = ngx_unlock_fd(mtx->fd); - - if (err == 0) { - return; - } - - ngx_log_abort(err, ngx_unlock_fd_n " %s failed", mtx->name); -} - - -ngx_uint_t -ngx_shmtx_force_unlock(ngx_shmtx_t *mtx, ngx_pid_t pid) -{ - return 0; -} - -#endif diff --git a/src/deps/src/nginx-1.30.3/src/core/ngx_shmtx.h b/src/deps/src/nginx-1.30.3/src/core/ngx_shmtx.h deleted file mode 100644 index 91e11bebbf..0000000000 --- a/src/deps/src/nginx-1.30.3/src/core/ngx_shmtx.h +++ /dev/null @@ -1,49 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#ifndef _NGX_SHMTX_H_INCLUDED_ -#define _NGX_SHMTX_H_INCLUDED_ - - -#include -#include - - -typedef struct { - ngx_atomic_t lock; -#if (NGX_HAVE_POSIX_SEM) - ngx_atomic_t wait; -#endif -} ngx_shmtx_sh_t; - - -typedef struct { -#if (NGX_HAVE_ATOMIC_OPS) - ngx_atomic_t *lock; -#if (NGX_HAVE_POSIX_SEM) - ngx_atomic_t *wait; - ngx_uint_t semaphore; - sem_t sem; -#endif -#else - ngx_fd_t fd; - u_char *name; -#endif - ngx_uint_t spin; -} ngx_shmtx_t; - - -ngx_int_t ngx_shmtx_create(ngx_shmtx_t *mtx, ngx_shmtx_sh_t *addr, - u_char *name); -void ngx_shmtx_destroy(ngx_shmtx_t *mtx); -ngx_uint_t ngx_shmtx_trylock(ngx_shmtx_t *mtx); -void ngx_shmtx_lock(ngx_shmtx_t *mtx); -void ngx_shmtx_unlock(ngx_shmtx_t *mtx); -ngx_uint_t ngx_shmtx_force_unlock(ngx_shmtx_t *mtx, ngx_pid_t pid); - - -#endif /* _NGX_SHMTX_H_INCLUDED_ */ diff --git a/src/deps/src/nginx-1.30.3/src/core/ngx_slab.c b/src/deps/src/nginx-1.30.3/src/core/ngx_slab.c deleted file mode 100644 index b8577ce753..0000000000 --- a/src/deps/src/nginx-1.30.3/src/core/ngx_slab.c +++ /dev/null @@ -1,817 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - -#include -#include - - -#define NGX_SLAB_PAGE_MASK 3 -#define NGX_SLAB_PAGE 0 -#define NGX_SLAB_BIG 1 -#define NGX_SLAB_EXACT 2 -#define NGX_SLAB_SMALL 3 - -#if (NGX_PTR_SIZE == 4) - -#define NGX_SLAB_PAGE_FREE 0 -#define NGX_SLAB_PAGE_BUSY 0xffffffff -#define NGX_SLAB_PAGE_START 0x80000000 - -#define NGX_SLAB_SHIFT_MASK 0x0000000f -#define NGX_SLAB_MAP_MASK 0xffff0000 -#define NGX_SLAB_MAP_SHIFT 16 - -#define NGX_SLAB_BUSY 0xffffffff - -#else /* (NGX_PTR_SIZE == 8) */ - -#define NGX_SLAB_PAGE_FREE 0 -#define NGX_SLAB_PAGE_BUSY 0xffffffffffffffff -#define NGX_SLAB_PAGE_START 0x8000000000000000 - -#define NGX_SLAB_SHIFT_MASK 0x000000000000000f -#define NGX_SLAB_MAP_MASK 0xffffffff00000000 -#define NGX_SLAB_MAP_SHIFT 32 - -#define NGX_SLAB_BUSY 0xffffffffffffffff - -#endif - - -#define ngx_slab_slots(pool) \ - (ngx_slab_page_t *) ((u_char *) (pool) + sizeof(ngx_slab_pool_t)) - -#define ngx_slab_page_type(page) ((page)->prev & NGX_SLAB_PAGE_MASK) - -#define ngx_slab_page_prev(page) \ - (ngx_slab_page_t *) ((page)->prev & ~NGX_SLAB_PAGE_MASK) - -#define ngx_slab_page_addr(pool, page) \ - ((((page) - (pool)->pages) << ngx_pagesize_shift) \ - + (uintptr_t) (pool)->start) - - -#if (NGX_DEBUG_MALLOC) - -#define ngx_slab_junk(p, size) ngx_memset(p, 0xA5, size) - -#elif (NGX_HAVE_DEBUG_MALLOC) - -#define ngx_slab_junk(p, size) \ - if (ngx_debug_malloc) ngx_memset(p, 0xA5, size) - -#else - -#define ngx_slab_junk(p, size) - -#endif - -static ngx_slab_page_t *ngx_slab_alloc_pages(ngx_slab_pool_t *pool, - ngx_uint_t pages); -static void ngx_slab_free_pages(ngx_slab_pool_t *pool, ngx_slab_page_t *page, - ngx_uint_t pages); -static void ngx_slab_error(ngx_slab_pool_t *pool, ngx_uint_t level, - char *text); - - -static ngx_uint_t ngx_slab_max_size; -static ngx_uint_t ngx_slab_exact_size; -static ngx_uint_t ngx_slab_exact_shift; - - -void -ngx_slab_sizes_init(void) -{ - ngx_uint_t n; - - ngx_slab_max_size = ngx_pagesize / 2; - ngx_slab_exact_size = ngx_pagesize / (8 * sizeof(uintptr_t)); - for (n = ngx_slab_exact_size; n >>= 1; ngx_slab_exact_shift++) { - /* void */ - } -} - - -void -ngx_slab_init(ngx_slab_pool_t *pool) -{ - u_char *p; - size_t size; - ngx_int_t m; - ngx_uint_t i, n, pages; - ngx_slab_page_t *slots, *page; - - pool->min_size = (size_t) 1 << pool->min_shift; - - slots = ngx_slab_slots(pool); - - p = (u_char *) slots; - size = pool->end - p; - - ngx_slab_junk(p, size); - - n = ngx_pagesize_shift - pool->min_shift; - - for (i = 0; i < n; i++) { - /* only "next" is used in list head */ - slots[i].slab = 0; - slots[i].next = &slots[i]; - slots[i].prev = 0; - } - - p += n * sizeof(ngx_slab_page_t); - - pool->stats = (ngx_slab_stat_t *) p; - ngx_memzero(pool->stats, n * sizeof(ngx_slab_stat_t)); - - p += n * sizeof(ngx_slab_stat_t); - - size -= n * (sizeof(ngx_slab_page_t) + sizeof(ngx_slab_stat_t)); - - pages = (ngx_uint_t) (size / (ngx_pagesize + sizeof(ngx_slab_page_t))); - - pool->pages = (ngx_slab_page_t *) p; - ngx_memzero(pool->pages, pages * sizeof(ngx_slab_page_t)); - - page = pool->pages; - - /* only "next" is used in list head */ - pool->free.slab = 0; - pool->free.next = page; - pool->free.prev = 0; - - page->slab = pages; - page->next = &pool->free; - page->prev = (uintptr_t) &pool->free; - - pool->start = ngx_align_ptr(p + pages * sizeof(ngx_slab_page_t), - ngx_pagesize); - - m = pages - (pool->end - pool->start) / ngx_pagesize; - if (m > 0) { - pages -= m; - page->slab = pages; - } - - pool->last = pool->pages + pages; - pool->pfree = pages; - - pool->log_nomem = 1; - pool->log_ctx = &pool->zero; - pool->zero = '\0'; -} - - -void * -ngx_slab_alloc(ngx_slab_pool_t *pool, size_t size) -{ - void *p; - - ngx_shmtx_lock(&pool->mutex); - - p = ngx_slab_alloc_locked(pool, size); - - ngx_shmtx_unlock(&pool->mutex); - - return p; -} - - -void * -ngx_slab_alloc_locked(ngx_slab_pool_t *pool, size_t size) -{ - size_t s; - uintptr_t p, m, mask, *bitmap; - ngx_uint_t i, n, slot, shift, map; - ngx_slab_page_t *page, *prev, *slots; - - if (size > ngx_slab_max_size) { - - ngx_log_debug1(NGX_LOG_DEBUG_ALLOC, ngx_cycle->log, 0, - "slab alloc: %uz", size); - - page = ngx_slab_alloc_pages(pool, (size >> ngx_pagesize_shift) - + ((size % ngx_pagesize) ? 1 : 0)); - if (page) { - p = ngx_slab_page_addr(pool, page); - - } else { - p = 0; - } - - goto done; - } - - if (size > pool->min_size) { - shift = 1; - for (s = size - 1; s >>= 1; shift++) { /* void */ } - slot = shift - pool->min_shift; - - } else { - shift = pool->min_shift; - slot = 0; - } - - pool->stats[slot].reqs++; - - ngx_log_debug2(NGX_LOG_DEBUG_ALLOC, ngx_cycle->log, 0, - "slab alloc: %uz slot: %ui", size, slot); - - slots = ngx_slab_slots(pool); - page = slots[slot].next; - - if (page->next != page) { - - if (shift < ngx_slab_exact_shift) { - - bitmap = (uintptr_t *) ngx_slab_page_addr(pool, page); - - map = (ngx_pagesize >> shift) / (8 * sizeof(uintptr_t)); - - for (n = 0; n < map; n++) { - - if (bitmap[n] != NGX_SLAB_BUSY) { - - for (m = 1, i = 0; m; m <<= 1, i++) { - if (bitmap[n] & m) { - continue; - } - - bitmap[n] |= m; - - i = (n * 8 * sizeof(uintptr_t) + i) << shift; - - p = (uintptr_t) bitmap + i; - - pool->stats[slot].used++; - - if (bitmap[n] == NGX_SLAB_BUSY) { - for (n = n + 1; n < map; n++) { - if (bitmap[n] != NGX_SLAB_BUSY) { - goto done; - } - } - - prev = ngx_slab_page_prev(page); - prev->next = page->next; - page->next->prev = page->prev; - - page->next = NULL; - page->prev = NGX_SLAB_SMALL; - } - - goto done; - } - } - } - - } else if (shift == ngx_slab_exact_shift) { - - for (m = 1, i = 0; m; m <<= 1, i++) { - if (page->slab & m) { - continue; - } - - page->slab |= m; - - if (page->slab == NGX_SLAB_BUSY) { - prev = ngx_slab_page_prev(page); - prev->next = page->next; - page->next->prev = page->prev; - - page->next = NULL; - page->prev = NGX_SLAB_EXACT; - } - - p = ngx_slab_page_addr(pool, page) + (i << shift); - - pool->stats[slot].used++; - - goto done; - } - - } else { /* shift > ngx_slab_exact_shift */ - - mask = ((uintptr_t) 1 << (ngx_pagesize >> shift)) - 1; - mask <<= NGX_SLAB_MAP_SHIFT; - - for (m = (uintptr_t) 1 << NGX_SLAB_MAP_SHIFT, i = 0; - m & mask; - m <<= 1, i++) - { - if (page->slab & m) { - continue; - } - - page->slab |= m; - - if ((page->slab & NGX_SLAB_MAP_MASK) == mask) { - prev = ngx_slab_page_prev(page); - prev->next = page->next; - page->next->prev = page->prev; - - page->next = NULL; - page->prev = NGX_SLAB_BIG; - } - - p = ngx_slab_page_addr(pool, page) + (i << shift); - - pool->stats[slot].used++; - - goto done; - } - } - - ngx_slab_error(pool, NGX_LOG_ALERT, "ngx_slab_alloc(): page is busy"); - ngx_debug_point(); - } - - page = ngx_slab_alloc_pages(pool, 1); - - if (page) { - if (shift < ngx_slab_exact_shift) { - bitmap = (uintptr_t *) ngx_slab_page_addr(pool, page); - - n = (ngx_pagesize >> shift) / ((1 << shift) * 8); - - if (n == 0) { - n = 1; - } - - /* "n" elements for bitmap, plus one requested */ - - for (i = 0; i < (n + 1) / (8 * sizeof(uintptr_t)); i++) { - bitmap[i] = NGX_SLAB_BUSY; - } - - m = ((uintptr_t) 1 << ((n + 1) % (8 * sizeof(uintptr_t)))) - 1; - bitmap[i] = m; - - map = (ngx_pagesize >> shift) / (8 * sizeof(uintptr_t)); - - for (i = i + 1; i < map; i++) { - bitmap[i] = 0; - } - - page->slab = shift; - page->next = &slots[slot]; - page->prev = (uintptr_t) &slots[slot] | NGX_SLAB_SMALL; - - slots[slot].next = page; - - pool->stats[slot].total += (ngx_pagesize >> shift) - n; - - p = ngx_slab_page_addr(pool, page) + (n << shift); - - pool->stats[slot].used++; - - goto done; - - } else if (shift == ngx_slab_exact_shift) { - - page->slab = 1; - page->next = &slots[slot]; - page->prev = (uintptr_t) &slots[slot] | NGX_SLAB_EXACT; - - slots[slot].next = page; - - pool->stats[slot].total += 8 * sizeof(uintptr_t); - - p = ngx_slab_page_addr(pool, page); - - pool->stats[slot].used++; - - goto done; - - } else { /* shift > ngx_slab_exact_shift */ - - page->slab = ((uintptr_t) 1 << NGX_SLAB_MAP_SHIFT) | shift; - page->next = &slots[slot]; - page->prev = (uintptr_t) &slots[slot] | NGX_SLAB_BIG; - - slots[slot].next = page; - - pool->stats[slot].total += ngx_pagesize >> shift; - - p = ngx_slab_page_addr(pool, page); - - pool->stats[slot].used++; - - goto done; - } - } - - p = 0; - - pool->stats[slot].fails++; - -done: - - ngx_log_debug1(NGX_LOG_DEBUG_ALLOC, ngx_cycle->log, 0, - "slab alloc: %p", (void *) p); - - return (void *) p; -} - - -void * -ngx_slab_calloc(ngx_slab_pool_t *pool, size_t size) -{ - void *p; - - ngx_shmtx_lock(&pool->mutex); - - p = ngx_slab_calloc_locked(pool, size); - - ngx_shmtx_unlock(&pool->mutex); - - return p; -} - - -void * -ngx_slab_calloc_locked(ngx_slab_pool_t *pool, size_t size) -{ - void *p; - - p = ngx_slab_alloc_locked(pool, size); - if (p) { - ngx_memzero(p, size); - } - - return p; -} - - -void -ngx_slab_free(ngx_slab_pool_t *pool, void *p) -{ - ngx_shmtx_lock(&pool->mutex); - - ngx_slab_free_locked(pool, p); - - ngx_shmtx_unlock(&pool->mutex); -} - - -void -ngx_slab_free_locked(ngx_slab_pool_t *pool, void *p) -{ - size_t size; - uintptr_t slab, m, *bitmap; - ngx_uint_t i, n, type, slot, shift, map; - ngx_slab_page_t *slots, *page; - - ngx_log_debug1(NGX_LOG_DEBUG_ALLOC, ngx_cycle->log, 0, "slab free: %p", p); - - if ((u_char *) p < pool->start || (u_char *) p > pool->end) { - ngx_slab_error(pool, NGX_LOG_ALERT, "ngx_slab_free(): outside of pool"); - goto fail; - } - - n = ((u_char *) p - pool->start) >> ngx_pagesize_shift; - page = &pool->pages[n]; - slab = page->slab; - type = ngx_slab_page_type(page); - - switch (type) { - - case NGX_SLAB_SMALL: - - shift = slab & NGX_SLAB_SHIFT_MASK; - size = (size_t) 1 << shift; - - if ((uintptr_t) p & (size - 1)) { - goto wrong_chunk; - } - - n = ((uintptr_t) p & (ngx_pagesize - 1)) >> shift; - m = (uintptr_t) 1 << (n % (8 * sizeof(uintptr_t))); - n /= 8 * sizeof(uintptr_t); - bitmap = (uintptr_t *) - ((uintptr_t) p & ~((uintptr_t) ngx_pagesize - 1)); - - if (bitmap[n] & m) { - slot = shift - pool->min_shift; - - if (page->next == NULL) { - slots = ngx_slab_slots(pool); - - page->next = slots[slot].next; - slots[slot].next = page; - - page->prev = (uintptr_t) &slots[slot] | NGX_SLAB_SMALL; - page->next->prev = (uintptr_t) page | NGX_SLAB_SMALL; - } - - bitmap[n] &= ~m; - - n = (ngx_pagesize >> shift) / ((1 << shift) * 8); - - if (n == 0) { - n = 1; - } - - i = n / (8 * sizeof(uintptr_t)); - m = ((uintptr_t) 1 << (n % (8 * sizeof(uintptr_t)))) - 1; - - if (bitmap[i] & ~m) { - goto done; - } - - map = (ngx_pagesize >> shift) / (8 * sizeof(uintptr_t)); - - for (i = i + 1; i < map; i++) { - if (bitmap[i]) { - goto done; - } - } - - ngx_slab_free_pages(pool, page, 1); - - pool->stats[slot].total -= (ngx_pagesize >> shift) - n; - - goto done; - } - - goto chunk_already_free; - - case NGX_SLAB_EXACT: - - m = (uintptr_t) 1 << - (((uintptr_t) p & (ngx_pagesize - 1)) >> ngx_slab_exact_shift); - size = ngx_slab_exact_size; - - if ((uintptr_t) p & (size - 1)) { - goto wrong_chunk; - } - - if (slab & m) { - slot = ngx_slab_exact_shift - pool->min_shift; - - if (slab == NGX_SLAB_BUSY) { - slots = ngx_slab_slots(pool); - - page->next = slots[slot].next; - slots[slot].next = page; - - page->prev = (uintptr_t) &slots[slot] | NGX_SLAB_EXACT; - page->next->prev = (uintptr_t) page | NGX_SLAB_EXACT; - } - - page->slab &= ~m; - - if (page->slab) { - goto done; - } - - ngx_slab_free_pages(pool, page, 1); - - pool->stats[slot].total -= 8 * sizeof(uintptr_t); - - goto done; - } - - goto chunk_already_free; - - case NGX_SLAB_BIG: - - shift = slab & NGX_SLAB_SHIFT_MASK; - size = (size_t) 1 << shift; - - if ((uintptr_t) p & (size - 1)) { - goto wrong_chunk; - } - - m = (uintptr_t) 1 << ((((uintptr_t) p & (ngx_pagesize - 1)) >> shift) - + NGX_SLAB_MAP_SHIFT); - - if (slab & m) { - slot = shift - pool->min_shift; - - if (page->next == NULL) { - slots = ngx_slab_slots(pool); - - page->next = slots[slot].next; - slots[slot].next = page; - - page->prev = (uintptr_t) &slots[slot] | NGX_SLAB_BIG; - page->next->prev = (uintptr_t) page | NGX_SLAB_BIG; - } - - page->slab &= ~m; - - if (page->slab & NGX_SLAB_MAP_MASK) { - goto done; - } - - ngx_slab_free_pages(pool, page, 1); - - pool->stats[slot].total -= ngx_pagesize >> shift; - - goto done; - } - - goto chunk_already_free; - - case NGX_SLAB_PAGE: - - if ((uintptr_t) p & (ngx_pagesize - 1)) { - goto wrong_chunk; - } - - if (!(slab & NGX_SLAB_PAGE_START)) { - ngx_slab_error(pool, NGX_LOG_ALERT, - "ngx_slab_free(): page is already free"); - goto fail; - } - - if (slab == NGX_SLAB_PAGE_BUSY) { - ngx_slab_error(pool, NGX_LOG_ALERT, - "ngx_slab_free(): pointer to wrong page"); - goto fail; - } - - size = slab & ~NGX_SLAB_PAGE_START; - - ngx_slab_free_pages(pool, page, size); - - ngx_slab_junk(p, size << ngx_pagesize_shift); - - return; - } - - /* not reached */ - - return; - -done: - - pool->stats[slot].used--; - - ngx_slab_junk(p, size); - - return; - -wrong_chunk: - - ngx_slab_error(pool, NGX_LOG_ALERT, - "ngx_slab_free(): pointer to wrong chunk"); - - goto fail; - -chunk_already_free: - - ngx_slab_error(pool, NGX_LOG_ALERT, - "ngx_slab_free(): chunk is already free"); - -fail: - - return; -} - - -static ngx_slab_page_t * -ngx_slab_alloc_pages(ngx_slab_pool_t *pool, ngx_uint_t pages) -{ - ngx_slab_page_t *page, *p; - - for (page = pool->free.next; page != &pool->free; page = page->next) { - - if (page->slab >= pages) { - - if (page->slab > pages) { - page[page->slab - 1].prev = (uintptr_t) &page[pages]; - - page[pages].slab = page->slab - pages; - page[pages].next = page->next; - page[pages].prev = page->prev; - - p = (ngx_slab_page_t *) page->prev; - p->next = &page[pages]; - page->next->prev = (uintptr_t) &page[pages]; - - } else { - p = (ngx_slab_page_t *) page->prev; - p->next = page->next; - page->next->prev = page->prev; - } - - page->slab = pages | NGX_SLAB_PAGE_START; - page->next = NULL; - page->prev = NGX_SLAB_PAGE; - - pool->pfree -= pages; - - if (--pages == 0) { - return page; - } - - for (p = page + 1; pages; pages--) { - p->slab = NGX_SLAB_PAGE_BUSY; - p->next = NULL; - p->prev = NGX_SLAB_PAGE; - p++; - } - - return page; - } - } - - if (pool->log_nomem) { - ngx_slab_error(pool, NGX_LOG_CRIT, - "ngx_slab_alloc() failed: no memory"); - } - - return NULL; -} - - -static void -ngx_slab_free_pages(ngx_slab_pool_t *pool, ngx_slab_page_t *page, - ngx_uint_t pages) -{ - ngx_slab_page_t *prev, *join; - - pool->pfree += pages; - - page->slab = pages--; - - if (pages) { - ngx_memzero(&page[1], pages * sizeof(ngx_slab_page_t)); - } - - if (page->next) { - prev = ngx_slab_page_prev(page); - prev->next = page->next; - page->next->prev = page->prev; - } - - join = page + page->slab; - - if (join < pool->last) { - - if (ngx_slab_page_type(join) == NGX_SLAB_PAGE) { - - if (join->next != NULL) { - pages += join->slab; - page->slab += join->slab; - - prev = ngx_slab_page_prev(join); - prev->next = join->next; - join->next->prev = join->prev; - - join->slab = NGX_SLAB_PAGE_FREE; - join->next = NULL; - join->prev = NGX_SLAB_PAGE; - } - } - } - - if (page > pool->pages) { - join = page - 1; - - if (ngx_slab_page_type(join) == NGX_SLAB_PAGE) { - - if (join->slab == NGX_SLAB_PAGE_FREE) { - join = ngx_slab_page_prev(join); - } - - if (join->next != NULL) { - pages += join->slab; - join->slab += page->slab; - - prev = ngx_slab_page_prev(join); - prev->next = join->next; - join->next->prev = join->prev; - - page->slab = NGX_SLAB_PAGE_FREE; - page->next = NULL; - page->prev = NGX_SLAB_PAGE; - - page = join; - } - } - } - - if (pages) { - page[pages].prev = (uintptr_t) page; - } - - page->prev = (uintptr_t) &pool->free; - page->next = pool->free.next; - - page->next->prev = (uintptr_t) page; - - pool->free.next = page; -} - - -static void -ngx_slab_error(ngx_slab_pool_t *pool, ngx_uint_t level, char *text) -{ - ngx_log_error(level, ngx_cycle->log, 0, "%s%s", text, pool->log_ctx); -} diff --git a/src/deps/src/nginx-1.30.3/src/core/ngx_slab.h b/src/deps/src/nginx-1.30.3/src/core/ngx_slab.h deleted file mode 100644 index d1876bbec9..0000000000 --- a/src/deps/src/nginx-1.30.3/src/core/ngx_slab.h +++ /dev/null @@ -1,72 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#ifndef _NGX_SLAB_H_INCLUDED_ -#define _NGX_SLAB_H_INCLUDED_ - - -#include -#include - - -typedef struct ngx_slab_page_s ngx_slab_page_t; - -struct ngx_slab_page_s { - uintptr_t slab; - ngx_slab_page_t *next; - uintptr_t prev; -}; - - -typedef struct { - ngx_uint_t total; - ngx_uint_t used; - - ngx_uint_t reqs; - ngx_uint_t fails; -} ngx_slab_stat_t; - - -typedef struct { - ngx_shmtx_sh_t lock; - - size_t min_size; - size_t min_shift; - - ngx_slab_page_t *pages; - ngx_slab_page_t *last; - ngx_slab_page_t free; - - ngx_slab_stat_t *stats; - ngx_uint_t pfree; - - u_char *start; - u_char *end; - - ngx_shmtx_t mutex; - - u_char *log_ctx; - u_char zero; - - unsigned log_nomem:1; - - void *data; - void *addr; -} ngx_slab_pool_t; - - -void ngx_slab_sizes_init(void); -void ngx_slab_init(ngx_slab_pool_t *pool); -void *ngx_slab_alloc(ngx_slab_pool_t *pool, size_t size); -void *ngx_slab_alloc_locked(ngx_slab_pool_t *pool, size_t size); -void *ngx_slab_calloc(ngx_slab_pool_t *pool, size_t size); -void *ngx_slab_calloc_locked(ngx_slab_pool_t *pool, size_t size); -void ngx_slab_free(ngx_slab_pool_t *pool, void *p); -void ngx_slab_free_locked(ngx_slab_pool_t *pool, void *p); - - -#endif /* _NGX_SLAB_H_INCLUDED_ */ diff --git a/src/deps/src/nginx-1.30.3/src/core/ngx_spinlock.c b/src/deps/src/nginx-1.30.3/src/core/ngx_spinlock.c deleted file mode 100644 index 9c93afaf1b..0000000000 --- a/src/deps/src/nginx-1.30.3/src/core/ngx_spinlock.c +++ /dev/null @@ -1,53 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#include -#include - - -void -ngx_spinlock(ngx_atomic_t *lock, ngx_atomic_int_t value, ngx_uint_t spin) -{ - -#if (NGX_HAVE_ATOMIC_OPS) - - ngx_uint_t i, n; - - for ( ;; ) { - - if (*lock == 0 && ngx_atomic_cmp_set(lock, 0, value)) { - return; - } - - if (ngx_ncpu > 1) { - - for (n = 1; n < spin; n <<= 1) { - - for (i = 0; i < n; i++) { - ngx_cpu_pause(); - } - - if (*lock == 0 && ngx_atomic_cmp_set(lock, 0, value)) { - return; - } - } - } - - ngx_sched_yield(); - } - -#else - -#if (NGX_THREADS) - -#error ngx_spinlock() or ngx_atomic_cmp_set() are not defined ! - -#endif - -#endif - -} diff --git a/src/deps/src/nginx-1.30.3/src/core/ngx_string.c b/src/deps/src/nginx-1.30.3/src/core/ngx_string.c deleted file mode 100644 index 10fe764c36..0000000000 --- a/src/deps/src/nginx-1.30.3/src/core/ngx_string.c +++ /dev/null @@ -1,2130 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#include -#include - - -static u_char *ngx_sprintf_num(u_char *buf, u_char *last, uint64_t ui64, - u_char zero, ngx_uint_t hexadecimal, ngx_uint_t width); -static u_char *ngx_sprintf_str(u_char *buf, u_char *last, u_char *src, - size_t len, ngx_uint_t hexadecimal); -static void ngx_encode_base64_internal(ngx_str_t *dst, ngx_str_t *src, - const u_char *basis, ngx_uint_t padding); -static ngx_int_t ngx_decode_base64_internal(ngx_str_t *dst, ngx_str_t *src, - const u_char *basis); - - -void -ngx_strlow(u_char *dst, u_char *src, size_t n) -{ - while (n) { - *dst = ngx_tolower(*src); - dst++; - src++; - n--; - } -} - - -size_t -ngx_strnlen(u_char *p, size_t n) -{ - size_t i; - - for (i = 0; i < n; i++) { - - if (p[i] == '\0') { - return i; - } - } - - return n; -} - - -u_char * -ngx_cpystrn(u_char *dst, u_char *src, size_t n) -{ - if (n == 0) { - return dst; - } - - while (--n) { - *dst = *src; - - if (*dst == '\0') { - return dst; - } - - dst++; - src++; - } - - *dst = '\0'; - - return dst; -} - - -u_char * -ngx_pstrdup(ngx_pool_t *pool, ngx_str_t *src) -{ - u_char *dst; - - dst = ngx_pnalloc(pool, src->len); - if (dst == NULL) { - return NULL; - } - - ngx_memcpy(dst, src->data, src->len); - - return dst; -} - - -/* - * supported formats: - * %[0][width][x][X]O off_t - * %[0][width]T time_t - * %[0][width][u][x|X]z ssize_t/size_t - * %[0][width][u][x|X]d int/u_int - * %[0][width][u][x|X]l long - * %[0][width|m][u][x|X]i ngx_int_t/ngx_uint_t - * %[0][width][u][x|X]D int32_t/uint32_t - * %[0][width][u][x|X]L int64_t/uint64_t - * %[0][width|m][u][x|X]A ngx_atomic_int_t/ngx_atomic_uint_t - * %[0][width][.width]f double, max valid number fits to %18.15f - * %P ngx_pid_t - * %M ngx_msec_t - * %r rlim_t - * %p void * - * %[x|X]V ngx_str_t * - * %[x|X]v ngx_variable_value_t * - * %[x|X]s null-terminated string - * %*[x|X]s length and string - * %Z '\0' - * %N '\n' - * %c char - * %% % - * - * reserved: - * %t ptrdiff_t - * %S null-terminated wchar string - * %C wchar - */ - - -u_char * ngx_cdecl -ngx_sprintf(u_char *buf, const char *fmt, ...) -{ - u_char *p; - va_list args; - - va_start(args, fmt); - p = ngx_vslprintf(buf, (void *) -1, fmt, args); - va_end(args); - - return p; -} - - -u_char * ngx_cdecl -ngx_snprintf(u_char *buf, size_t max, const char *fmt, ...) -{ - u_char *p; - va_list args; - - va_start(args, fmt); - p = ngx_vslprintf(buf, buf + max, fmt, args); - va_end(args); - - return p; -} - - -u_char * ngx_cdecl -ngx_slprintf(u_char *buf, u_char *last, const char *fmt, ...) -{ - u_char *p; - va_list args; - - va_start(args, fmt); - p = ngx_vslprintf(buf, last, fmt, args); - va_end(args); - - return p; -} - - -u_char * -ngx_vslprintf(u_char *buf, u_char *last, const char *fmt, va_list args) -{ - u_char *p, zero; - int d; - double f; - size_t slen; - int64_t i64; - uint64_t ui64, frac; - ngx_msec_t ms; - ngx_uint_t width, sign, hex, max_width, frac_width, scale, n; - ngx_str_t *v; - ngx_variable_value_t *vv; - - while (*fmt && buf < last) { - - /* - * "buf < last" means that we could copy at least one character: - * the plain character, "%%", "%c", and minus without the checking - */ - - if (*fmt == '%') { - - i64 = 0; - ui64 = 0; - - zero = (u_char) ((*++fmt == '0') ? '0' : ' '); - width = 0; - sign = 1; - hex = 0; - max_width = 0; - frac_width = 0; - slen = (size_t) -1; - - while (*fmt >= '0' && *fmt <= '9') { - width = width * 10 + (*fmt++ - '0'); - } - - - for ( ;; ) { - switch (*fmt) { - - case 'u': - sign = 0; - fmt++; - continue; - - case 'm': - max_width = 1; - fmt++; - continue; - - case 'X': - hex = 2; - sign = 0; - fmt++; - continue; - - case 'x': - hex = 1; - sign = 0; - fmt++; - continue; - - case '.': - fmt++; - - while (*fmt >= '0' && *fmt <= '9') { - frac_width = frac_width * 10 + (*fmt++ - '0'); - } - - break; - - case '*': - slen = va_arg(args, size_t); - fmt++; - continue; - - default: - break; - } - - break; - } - - - switch (*fmt) { - - case 'V': - v = va_arg(args, ngx_str_t *); - - buf = ngx_sprintf_str(buf, last, v->data, v->len, hex); - fmt++; - - continue; - - case 'v': - vv = va_arg(args, ngx_variable_value_t *); - - buf = ngx_sprintf_str(buf, last, vv->data, vv->len, hex); - fmt++; - - continue; - - case 's': - p = va_arg(args, u_char *); - - buf = ngx_sprintf_str(buf, last, p, slen, hex); - fmt++; - - continue; - - case 'O': - i64 = (int64_t) va_arg(args, off_t); - sign = 1; - break; - - case 'P': - i64 = (int64_t) va_arg(args, ngx_pid_t); - sign = 1; - break; - - case 'T': - i64 = (int64_t) va_arg(args, time_t); - sign = 1; - break; - - case 'M': - ms = (ngx_msec_t) va_arg(args, ngx_msec_t); - if ((ngx_msec_int_t) ms == -1) { - sign = 1; - i64 = -1; - } else { - sign = 0; - ui64 = (uint64_t) ms; - } - break; - - case 'z': - if (sign) { - i64 = (int64_t) va_arg(args, ssize_t); - } else { - ui64 = (uint64_t) va_arg(args, size_t); - } - break; - - case 'i': - if (sign) { - i64 = (int64_t) va_arg(args, ngx_int_t); - } else { - ui64 = (uint64_t) va_arg(args, ngx_uint_t); - } - - if (max_width) { - width = NGX_INT_T_LEN; - } - - break; - - case 'd': - if (sign) { - i64 = (int64_t) va_arg(args, int); - } else { - ui64 = (uint64_t) va_arg(args, u_int); - } - break; - - case 'l': - if (sign) { - i64 = (int64_t) va_arg(args, long); - } else { - ui64 = (uint64_t) va_arg(args, u_long); - } - break; - - case 'D': - if (sign) { - i64 = (int64_t) va_arg(args, int32_t); - } else { - ui64 = (uint64_t) va_arg(args, uint32_t); - } - break; - - case 'L': - if (sign) { - i64 = va_arg(args, int64_t); - } else { - ui64 = va_arg(args, uint64_t); - } - break; - - case 'A': - if (sign) { - i64 = (int64_t) va_arg(args, ngx_atomic_int_t); - } else { - ui64 = (uint64_t) va_arg(args, ngx_atomic_uint_t); - } - - if (max_width) { - width = NGX_ATOMIC_T_LEN; - } - - break; - - case 'f': - f = va_arg(args, double); - - if (f < 0) { - *buf++ = '-'; - f = -f; - } - - ui64 = (int64_t) f; - frac = 0; - - if (frac_width) { - - scale = 1; - for (n = frac_width; n; n--) { - scale *= 10; - } - - frac = (uint64_t) ((f - (double) ui64) * scale + 0.5); - - if (frac == scale) { - ui64++; - frac = 0; - } - } - - buf = ngx_sprintf_num(buf, last, ui64, zero, 0, width); - - if (frac_width) { - if (buf < last) { - *buf++ = '.'; - } - - buf = ngx_sprintf_num(buf, last, frac, '0', 0, frac_width); - } - - fmt++; - - continue; - -#if !(NGX_WIN32) - case 'r': - i64 = (int64_t) va_arg(args, rlim_t); - sign = 1; - break; -#endif - - case 'p': - ui64 = (uintptr_t) va_arg(args, void *); - hex = 2; - sign = 0; - zero = '0'; - width = 2 * sizeof(void *); - break; - - case 'c': - d = va_arg(args, int); - *buf++ = (u_char) (d & 0xff); - fmt++; - - continue; - - case 'Z': - *buf++ = '\0'; - fmt++; - - continue; - - case 'N': -#if (NGX_WIN32) - *buf++ = CR; - if (buf < last) { - *buf++ = LF; - } -#else - *buf++ = LF; -#endif - fmt++; - - continue; - - case '%': - *buf++ = '%'; - fmt++; - - continue; - - default: - *buf++ = *fmt++; - - continue; - } - - if (sign) { - if (i64 < 0) { - *buf++ = '-'; - ui64 = (uint64_t) -i64; - - } else { - ui64 = (uint64_t) i64; - } - } - - buf = ngx_sprintf_num(buf, last, ui64, zero, hex, width); - - fmt++; - - } else { - *buf++ = *fmt++; - } - } - - return buf; -} - - -static u_char * -ngx_sprintf_num(u_char *buf, u_char *last, uint64_t ui64, u_char zero, - ngx_uint_t hexadecimal, ngx_uint_t width) -{ - u_char *p, temp[NGX_INT64_LEN + 1]; - /* - * we need temp[NGX_INT64_LEN] only, - * but icc issues the warning - */ - size_t len; - uint32_t ui32; - static u_char hex[] = "0123456789abcdef"; - static u_char HEX[] = "0123456789ABCDEF"; - - p = temp + NGX_INT64_LEN; - - if (hexadecimal == 0) { - - if (ui64 <= (uint64_t) NGX_MAX_UINT32_VALUE) { - - /* - * To divide 64-bit numbers and to find remainders - * on the x86 platform gcc and icc call the libc functions - * [u]divdi3() and [u]moddi3(), they call another function - * in its turn. On FreeBSD it is the qdivrem() function, - * its source code is about 170 lines of the code. - * The glibc counterpart is about 150 lines of the code. - * - * For 32-bit numbers and some divisors gcc and icc use - * a inlined multiplication and shifts. For example, - * unsigned "i32 / 10" is compiled to - * - * (i32 * 0xCCCCCCCD) >> 35 - */ - - ui32 = (uint32_t) ui64; - - do { - *--p = (u_char) (ui32 % 10 + '0'); - } while (ui32 /= 10); - - } else { - do { - *--p = (u_char) (ui64 % 10 + '0'); - } while (ui64 /= 10); - } - - } else if (hexadecimal == 1) { - - do { - - /* the "(uint32_t)" cast disables the BCC's warning */ - *--p = hex[(uint32_t) (ui64 & 0xf)]; - - } while (ui64 >>= 4); - - } else { /* hexadecimal == 2 */ - - do { - - /* the "(uint32_t)" cast disables the BCC's warning */ - *--p = HEX[(uint32_t) (ui64 & 0xf)]; - - } while (ui64 >>= 4); - } - - /* zero or space padding */ - - len = (temp + NGX_INT64_LEN) - p; - - while (len++ < width && buf < last) { - *buf++ = zero; - } - - /* number safe copy */ - - len = (temp + NGX_INT64_LEN) - p; - - if (buf + len > last) { - len = last - buf; - } - - return ngx_cpymem(buf, p, len); -} - - -static u_char * -ngx_sprintf_str(u_char *buf, u_char *last, u_char *src, size_t len, - ngx_uint_t hexadecimal) -{ - static u_char hex[] = "0123456789abcdef"; - static u_char HEX[] = "0123456789ABCDEF"; - - if (hexadecimal == 0) { - - if (len == (size_t) -1) { - while (*src && buf < last) { - *buf++ = *src++; - } - - } else { - len = ngx_min((size_t) (last - buf), len); - buf = ngx_cpymem(buf, src, len); - } - - } else if (hexadecimal == 1) { - - if (len == (size_t) -1) { - - while (*src && buf < last - 1) { - *buf++ = hex[*src >> 4]; - *buf++ = hex[*src++ & 0xf]; - } - - } else { - - while (len-- && buf < last - 1) { - *buf++ = hex[*src >> 4]; - *buf++ = hex[*src++ & 0xf]; - } - } - - } else { /* hexadecimal == 2 */ - - if (len == (size_t) -1) { - - while (*src && buf < last - 1) { - *buf++ = HEX[*src >> 4]; - *buf++ = HEX[*src++ & 0xf]; - } - - } else { - - while (len-- && buf < last - 1) { - *buf++ = HEX[*src >> 4]; - *buf++ = HEX[*src++ & 0xf]; - } - } - } - - return buf; -} - - -/* - * We use ngx_strcasecmp()/ngx_strncasecmp() for 7-bit ASCII strings only, - * and implement our own ngx_strcasecmp()/ngx_strncasecmp() - * to avoid libc locale overhead. Besides, we use the ngx_uint_t's - * instead of the u_char's, because they are slightly faster. - */ - -ngx_int_t -ngx_strcasecmp(u_char *s1, u_char *s2) -{ - ngx_uint_t c1, c2; - - for ( ;; ) { - c1 = (ngx_uint_t) *s1++; - c2 = (ngx_uint_t) *s2++; - - c1 = (c1 >= 'A' && c1 <= 'Z') ? (c1 | 0x20) : c1; - c2 = (c2 >= 'A' && c2 <= 'Z') ? (c2 | 0x20) : c2; - - if (c1 == c2) { - - if (c1) { - continue; - } - - return 0; - } - - return c1 - c2; - } -} - - -ngx_int_t -ngx_strncasecmp(u_char *s1, u_char *s2, size_t n) -{ - ngx_uint_t c1, c2; - - while (n) { - c1 = (ngx_uint_t) *s1++; - c2 = (ngx_uint_t) *s2++; - - c1 = (c1 >= 'A' && c1 <= 'Z') ? (c1 | 0x20) : c1; - c2 = (c2 >= 'A' && c2 <= 'Z') ? (c2 | 0x20) : c2; - - if (c1 == c2) { - - if (c1) { - n--; - continue; - } - - return 0; - } - - return c1 - c2; - } - - return 0; -} - - -u_char * -ngx_strnstr(u_char *s1, char *s2, size_t len) -{ - u_char c1, c2; - size_t n; - - c2 = *(u_char *) s2++; - - n = ngx_strlen(s2); - - do { - do { - if (len-- == 0) { - return NULL; - } - - c1 = *s1++; - - if (c1 == 0) { - return NULL; - } - - } while (c1 != c2); - - if (n > len) { - return NULL; - } - - } while (ngx_strncmp(s1, (u_char *) s2, n) != 0); - - return --s1; -} - - -/* - * ngx_strstrn() and ngx_strcasestrn() are intended to search for static - * substring with known length in null-terminated string. The argument n - * must be length of the second substring - 1. - */ - -u_char * -ngx_strstrn(u_char *s1, char *s2, size_t n) -{ - u_char c1, c2; - - c2 = *(u_char *) s2++; - - do { - do { - c1 = *s1++; - - if (c1 == 0) { - return NULL; - } - - } while (c1 != c2); - - } while (ngx_strncmp(s1, (u_char *) s2, n) != 0); - - return --s1; -} - - -u_char * -ngx_strcasestrn(u_char *s1, char *s2, size_t n) -{ - ngx_uint_t c1, c2; - - c2 = (ngx_uint_t) *s2++; - c2 = (c2 >= 'A' && c2 <= 'Z') ? (c2 | 0x20) : c2; - - do { - do { - c1 = (ngx_uint_t) *s1++; - - if (c1 == 0) { - return NULL; - } - - c1 = (c1 >= 'A' && c1 <= 'Z') ? (c1 | 0x20) : c1; - - } while (c1 != c2); - - } while (ngx_strncasecmp(s1, (u_char *) s2, n) != 0); - - return --s1; -} - - -/* - * ngx_strlcasestrn() is intended to search for static substring - * with known length in string until the argument last. The argument n - * must be length of the second substring - 1. - */ - -u_char * -ngx_strlcasestrn(u_char *s1, u_char *last, u_char *s2, size_t n) -{ - ngx_uint_t c1, c2; - - c2 = (ngx_uint_t) *s2++; - c2 = (c2 >= 'A' && c2 <= 'Z') ? (c2 | 0x20) : c2; - last -= n; - - do { - do { - if (s1 >= last) { - return NULL; - } - - c1 = (ngx_uint_t) *s1++; - - c1 = (c1 >= 'A' && c1 <= 'Z') ? (c1 | 0x20) : c1; - - } while (c1 != c2); - - } while (ngx_strncasecmp(s1, s2, n) != 0); - - return --s1; -} - - -ngx_int_t -ngx_rstrncmp(u_char *s1, u_char *s2, size_t n) -{ - if (n == 0) { - return 0; - } - - n--; - - for ( ;; ) { - if (s1[n] != s2[n]) { - return s1[n] - s2[n]; - } - - if (n == 0) { - return 0; - } - - n--; - } -} - - -ngx_int_t -ngx_rstrncasecmp(u_char *s1, u_char *s2, size_t n) -{ - u_char c1, c2; - - if (n == 0) { - return 0; - } - - n--; - - for ( ;; ) { - c1 = s1[n]; - if (c1 >= 'a' && c1 <= 'z') { - c1 -= 'a' - 'A'; - } - - c2 = s2[n]; - if (c2 >= 'a' && c2 <= 'z') { - c2 -= 'a' - 'A'; - } - - if (c1 != c2) { - return c1 - c2; - } - - if (n == 0) { - return 0; - } - - n--; - } -} - - -ngx_int_t -ngx_memn2cmp(u_char *s1, u_char *s2, size_t n1, size_t n2) -{ - size_t n; - ngx_int_t m, z; - - if (n1 <= n2) { - n = n1; - z = -1; - - } else { - n = n2; - z = 1; - } - - m = ngx_memcmp(s1, s2, n); - - if (m || n1 == n2) { - return m; - } - - return z; -} - - -ngx_int_t -ngx_dns_strcmp(u_char *s1, u_char *s2) -{ - ngx_uint_t c1, c2; - - for ( ;; ) { - c1 = (ngx_uint_t) *s1++; - c2 = (ngx_uint_t) *s2++; - - c1 = (c1 >= 'A' && c1 <= 'Z') ? (c1 | 0x20) : c1; - c2 = (c2 >= 'A' && c2 <= 'Z') ? (c2 | 0x20) : c2; - - if (c1 == c2) { - - if (c1) { - continue; - } - - return 0; - } - - /* in ASCII '.' > '-', but we need '.' to be the lowest character */ - - c1 = (c1 == '.') ? ' ' : c1; - c2 = (c2 == '.') ? ' ' : c2; - - return c1 - c2; - } -} - - -ngx_int_t -ngx_filename_cmp(u_char *s1, u_char *s2, size_t n) -{ - ngx_uint_t c1, c2; - - while (n) { - c1 = (ngx_uint_t) *s1++; - c2 = (ngx_uint_t) *s2++; - -#if (NGX_HAVE_CASELESS_FILESYSTEM) - c1 = tolower(c1); - c2 = tolower(c2); -#endif - - if (c1 == c2) { - - if (c1) { - n--; - continue; - } - - return 0; - } - - /* we need '/' to be the lowest character */ - - if (c1 == 0 || c2 == 0) { - return c1 - c2; - } - - c1 = (c1 == '/') ? 0 : c1; - c2 = (c2 == '/') ? 0 : c2; - - return c1 - c2; - } - - return 0; -} - - -ngx_int_t -ngx_atoi(u_char *line, size_t n) -{ - ngx_int_t value, cutoff, cutlim; - - if (n == 0) { - return NGX_ERROR; - } - - cutoff = NGX_MAX_INT_T_VALUE / 10; - cutlim = NGX_MAX_INT_T_VALUE % 10; - - for (value = 0; n--; line++) { - if (*line < '0' || *line > '9') { - return NGX_ERROR; - } - - if (value >= cutoff && (value > cutoff || *line - '0' > cutlim)) { - return NGX_ERROR; - } - - value = value * 10 + (*line - '0'); - } - - return value; -} - - -/* parse a fixed point number, e.g., ngx_atofp("10.5", 4, 2) returns 1050 */ - -ngx_int_t -ngx_atofp(u_char *line, size_t n, size_t point) -{ - ngx_int_t value, cutoff, cutlim; - ngx_uint_t dot; - - if (n == 0) { - return NGX_ERROR; - } - - cutoff = NGX_MAX_INT_T_VALUE / 10; - cutlim = NGX_MAX_INT_T_VALUE % 10; - - dot = 0; - - for (value = 0; n--; line++) { - - if (point == 0) { - return NGX_ERROR; - } - - if (*line == '.') { - if (dot) { - return NGX_ERROR; - } - - dot = 1; - continue; - } - - if (*line < '0' || *line > '9') { - return NGX_ERROR; - } - - if (value >= cutoff && (value > cutoff || *line - '0' > cutlim)) { - return NGX_ERROR; - } - - value = value * 10 + (*line - '0'); - point -= dot; - } - - while (point--) { - if (value > cutoff) { - return NGX_ERROR; - } - - value = value * 10; - } - - return value; -} - - -ssize_t -ngx_atosz(u_char *line, size_t n) -{ - ssize_t value, cutoff, cutlim; - - if (n == 0) { - return NGX_ERROR; - } - - cutoff = NGX_MAX_SIZE_T_VALUE / 10; - cutlim = NGX_MAX_SIZE_T_VALUE % 10; - - for (value = 0; n--; line++) { - if (*line < '0' || *line > '9') { - return NGX_ERROR; - } - - if (value >= cutoff && (value > cutoff || *line - '0' > cutlim)) { - return NGX_ERROR; - } - - value = value * 10 + (*line - '0'); - } - - return value; -} - - -off_t -ngx_atoof(u_char *line, size_t n) -{ - off_t value, cutoff, cutlim; - - if (n == 0) { - return NGX_ERROR; - } - - cutoff = NGX_MAX_OFF_T_VALUE / 10; - cutlim = NGX_MAX_OFF_T_VALUE % 10; - - for (value = 0; n--; line++) { - if (*line < '0' || *line > '9') { - return NGX_ERROR; - } - - if (value >= cutoff && (value > cutoff || *line - '0' > cutlim)) { - return NGX_ERROR; - } - - value = value * 10 + (*line - '0'); - } - - return value; -} - - -time_t -ngx_atotm(u_char *line, size_t n) -{ - time_t value, cutoff, cutlim; - - if (n == 0) { - return NGX_ERROR; - } - - cutoff = NGX_MAX_TIME_T_VALUE / 10; - cutlim = NGX_MAX_TIME_T_VALUE % 10; - - for (value = 0; n--; line++) { - if (*line < '0' || *line > '9') { - return NGX_ERROR; - } - - if (value >= cutoff && (value > cutoff || *line - '0' > cutlim)) { - return NGX_ERROR; - } - - value = value * 10 + (*line - '0'); - } - - return value; -} - - -ngx_int_t -ngx_hextoi(u_char *line, size_t n) -{ - u_char c, ch; - ngx_int_t value, cutoff; - - if (n == 0) { - return NGX_ERROR; - } - - cutoff = NGX_MAX_INT_T_VALUE / 16; - - for (value = 0; n--; line++) { - if (value > cutoff) { - return NGX_ERROR; - } - - ch = *line; - - if (ch >= '0' && ch <= '9') { - value = value * 16 + (ch - '0'); - continue; - } - - c = (u_char) (ch | 0x20); - - if (c >= 'a' && c <= 'f') { - value = value * 16 + (c - 'a' + 10); - continue; - } - - return NGX_ERROR; - } - - return value; -} - - -u_char * -ngx_hex_dump(u_char *dst, u_char *src, size_t len) -{ - static u_char hex[] = "0123456789abcdef"; - - while (len--) { - *dst++ = hex[*src >> 4]; - *dst++ = hex[*src++ & 0xf]; - } - - return dst; -} - - -void -ngx_encode_base64(ngx_str_t *dst, ngx_str_t *src) -{ - static u_char basis64[] = - "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; - - ngx_encode_base64_internal(dst, src, basis64, 1); -} - - -void -ngx_encode_base64url(ngx_str_t *dst, ngx_str_t *src) -{ - static u_char basis64[] = - "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_"; - - ngx_encode_base64_internal(dst, src, basis64, 0); -} - - -static void -ngx_encode_base64_internal(ngx_str_t *dst, ngx_str_t *src, const u_char *basis, - ngx_uint_t padding) -{ - u_char *d, *s; - size_t len; - - len = src->len; - s = src->data; - d = dst->data; - - while (len > 2) { - *d++ = basis[(s[0] >> 2) & 0x3f]; - *d++ = basis[((s[0] & 3) << 4) | (s[1] >> 4)]; - *d++ = basis[((s[1] & 0x0f) << 2) | (s[2] >> 6)]; - *d++ = basis[s[2] & 0x3f]; - - s += 3; - len -= 3; - } - - if (len) { - *d++ = basis[(s[0] >> 2) & 0x3f]; - - if (len == 1) { - *d++ = basis[(s[0] & 3) << 4]; - if (padding) { - *d++ = '='; - } - - } else { - *d++ = basis[((s[0] & 3) << 4) | (s[1] >> 4)]; - *d++ = basis[(s[1] & 0x0f) << 2]; - } - - if (padding) { - *d++ = '='; - } - } - - dst->len = d - dst->data; -} - - -ngx_int_t -ngx_decode_base64(ngx_str_t *dst, ngx_str_t *src) -{ - static u_char basis64[] = { - 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, - 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, - 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 62, 77, 77, 77, 63, - 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 77, 77, 77, 77, 77, 77, - 77, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, - 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 77, 77, 77, 77, 77, - 77, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, - 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 77, 77, 77, 77, 77, - - 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, - 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, - 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, - 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, - 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, - 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, - 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, - 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77 - }; - - return ngx_decode_base64_internal(dst, src, basis64); -} - - -ngx_int_t -ngx_decode_base64url(ngx_str_t *dst, ngx_str_t *src) -{ - static u_char basis64[] = { - 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, - 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, - 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 62, 77, 77, - 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 77, 77, 77, 77, 77, 77, - 77, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, - 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 77, 77, 77, 77, 63, - 77, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, - 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 77, 77, 77, 77, 77, - - 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, - 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, - 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, - 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, - 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, - 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, - 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, - 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77 - }; - - return ngx_decode_base64_internal(dst, src, basis64); -} - - -static ngx_int_t -ngx_decode_base64_internal(ngx_str_t *dst, ngx_str_t *src, const u_char *basis) -{ - size_t len; - u_char *d, *s; - - for (len = 0; len < src->len; len++) { - if (src->data[len] == '=') { - break; - } - - if (basis[src->data[len]] == 77) { - return NGX_ERROR; - } - } - - if (len % 4 == 1) { - return NGX_ERROR; - } - - s = src->data; - d = dst->data; - - while (len > 3) { - *d++ = (u_char) (basis[s[0]] << 2 | basis[s[1]] >> 4); - *d++ = (u_char) (basis[s[1]] << 4 | basis[s[2]] >> 2); - *d++ = (u_char) (basis[s[2]] << 6 | basis[s[3]]); - - s += 4; - len -= 4; - } - - if (len > 1) { - *d++ = (u_char) (basis[s[0]] << 2 | basis[s[1]] >> 4); - } - - if (len > 2) { - *d++ = (u_char) (basis[s[1]] << 4 | basis[s[2]] >> 2); - } - - dst->len = d - dst->data; - - return NGX_OK; -} - - -/* - * ngx_utf8_decode() decodes two and more bytes UTF sequences only - * the return values: - * 0x80 - 0x10ffff valid character - * 0x110000 - 0xfffffffd invalid sequence - * 0xfffffffe incomplete sequence - * 0xffffffff error - */ - -uint32_t -ngx_utf8_decode(u_char **p, size_t n) -{ - size_t len; - uint32_t u, i, valid; - - u = **p; - - if (u >= 0xf8) { - - (*p)++; - return 0xffffffff; - - } else if (u >= 0xf0) { - - u &= 0x07; - valid = 0xffff; - len = 3; - - } else if (u >= 0xe0) { - - u &= 0x0f; - valid = 0x7ff; - len = 2; - - } else if (u >= 0xc2) { - - u &= 0x1f; - valid = 0x7f; - len = 1; - - } else { - (*p)++; - return 0xffffffff; - } - - if (n - 1 < len) { - return 0xfffffffe; - } - - (*p)++; - - while (len) { - i = *(*p)++; - - if (i < 0x80) { - return 0xffffffff; - } - - u = (u << 6) | (i & 0x3f); - - len--; - } - - if (u > valid) { - return u; - } - - return 0xffffffff; -} - - -size_t -ngx_utf8_length(u_char *p, size_t n) -{ - u_char c, *last; - size_t len; - - last = p + n; - - for (len = 0; p < last; len++) { - - c = *p; - - if (c < 0x80) { - p++; - continue; - } - - if (ngx_utf8_decode(&p, last - p) > 0x10ffff) { - /* invalid UTF-8 */ - return n; - } - } - - return len; -} - - -u_char * -ngx_utf8_cpystrn(u_char *dst, u_char *src, size_t n, size_t len) -{ - u_char c, *next; - - if (n == 0) { - return dst; - } - - while (--n) { - - c = *src; - *dst = c; - - if (c < 0x80) { - - if (c != '\0') { - dst++; - src++; - len--; - - continue; - } - - return dst; - } - - next = src; - - if (ngx_utf8_decode(&next, len) > 0x10ffff) { - /* invalid UTF-8 */ - break; - } - - while (src < next) { - *dst++ = *src++; - len--; - } - } - - *dst = '\0'; - - return dst; -} - - -uintptr_t -ngx_escape_uri(u_char *dst, u_char *src, size_t size, ngx_uint_t type) -{ - u_char prefix; - uint32_t *escape; - ngx_uint_t n; - static u_char hex[] = "0123456789ABCDEF"; - - /* - * Per RFC 3986 only the following chars are allowed in URIs unescaped: - * - * unreserved = ALPHA / DIGIT / "-" / "." / "_" / "~" - * gen-delims = ":" / "/" / "?" / "#" / "[" / "]" / "@" - * sub-delims = "!" / "$" / "&" / "'" / "(" / ")" - * / "*" / "+" / "," / ";" / "=" - * - * And "%" can appear as a part of escaping itself. The following - * characters are not allowed and need to be escaped: %00-%1F, %7F-%FF, - * " ", """, "<", ">", "\", "^", "`", "{", "|", "}". - */ - - /* " ", "#", "%", "?", not allowed */ - - static uint32_t uri[] = { - 0xffffffff, /* 1111 1111 1111 1111 1111 1111 1111 1111 */ - - /* ?>=< ;:98 7654 3210 /.-, +*)( '&%$ #"! */ - 0xd000002d, /* 1101 0000 0000 0000 0000 0000 0010 1101 */ - - /* _^]\ [ZYX WVUT SRQP ONML KJIH GFED CBA@ */ - 0x50000000, /* 0101 0000 0000 0000 0000 0000 0000 0000 */ - - /* ~}| {zyx wvut srqp onml kjih gfed cba` */ - 0xb8000001, /* 1011 1000 0000 0000 0000 0000 0000 0001 */ - - 0xffffffff, /* 1111 1111 1111 1111 1111 1111 1111 1111 */ - 0xffffffff, /* 1111 1111 1111 1111 1111 1111 1111 1111 */ - 0xffffffff, /* 1111 1111 1111 1111 1111 1111 1111 1111 */ - 0xffffffff /* 1111 1111 1111 1111 1111 1111 1111 1111 */ - }; - - /* " ", "#", "%", "&", "+", ";", "?", not allowed */ - - static uint32_t args[] = { - 0xffffffff, /* 1111 1111 1111 1111 1111 1111 1111 1111 */ - - /* ?>=< ;:98 7654 3210 /.-, +*)( '&%$ #"! */ - 0xd800086d, /* 1101 1000 0000 0000 0000 1000 0110 1101 */ - - /* _^]\ [ZYX WVUT SRQP ONML KJIH GFED CBA@ */ - 0x50000000, /* 0101 0000 0000 0000 0000 0000 0000 0000 */ - - /* ~}| {zyx wvut srqp onml kjih gfed cba` */ - 0xb8000001, /* 1011 1000 0000 0000 0000 0000 0000 0001 */ - - 0xffffffff, /* 1111 1111 1111 1111 1111 1111 1111 1111 */ - 0xffffffff, /* 1111 1111 1111 1111 1111 1111 1111 1111 */ - 0xffffffff, /* 1111 1111 1111 1111 1111 1111 1111 1111 */ - 0xffffffff /* 1111 1111 1111 1111 1111 1111 1111 1111 */ - }; - - /* not ALPHA, DIGIT, "-", ".", "_", "~" */ - - static uint32_t uri_component[] = { - 0xffffffff, /* 1111 1111 1111 1111 1111 1111 1111 1111 */ - - /* ?>=< ;:98 7654 3210 /.-, +*)( '&%$ #"! */ - 0xfc009fff, /* 1111 1100 0000 0000 1001 1111 1111 1111 */ - - /* _^]\ [ZYX WVUT SRQP ONML KJIH GFED CBA@ */ - 0x78000001, /* 0111 1000 0000 0000 0000 0000 0000 0001 */ - - /* ~}| {zyx wvut srqp onml kjih gfed cba` */ - 0xb8000001, /* 1011 1000 0000 0000 0000 0000 0000 0001 */ - - 0xffffffff, /* 1111 1111 1111 1111 1111 1111 1111 1111 */ - 0xffffffff, /* 1111 1111 1111 1111 1111 1111 1111 1111 */ - 0xffffffff, /* 1111 1111 1111 1111 1111 1111 1111 1111 */ - 0xffffffff /* 1111 1111 1111 1111 1111 1111 1111 1111 */ - }; - - /* " ", "#", """, "%", "'", not allowed */ - - static uint32_t html[] = { - 0xffffffff, /* 1111 1111 1111 1111 1111 1111 1111 1111 */ - - /* ?>=< ;:98 7654 3210 /.-, +*)( '&%$ #"! */ - 0x500000ad, /* 0101 0000 0000 0000 0000 0000 1010 1101 */ - - /* _^]\ [ZYX WVUT SRQP ONML KJIH GFED CBA@ */ - 0x50000000, /* 0101 0000 0000 0000 0000 0000 0000 0000 */ - - /* ~}| {zyx wvut srqp onml kjih gfed cba` */ - 0xb8000001, /* 1011 1000 0000 0000 0000 0000 0000 0001 */ - - 0xffffffff, /* 1111 1111 1111 1111 1111 1111 1111 1111 */ - 0xffffffff, /* 1111 1111 1111 1111 1111 1111 1111 1111 */ - 0xffffffff, /* 1111 1111 1111 1111 1111 1111 1111 1111 */ - 0xffffffff /* 1111 1111 1111 1111 1111 1111 1111 1111 */ - }; - - /* " ", """, "'", not allowed */ - - static uint32_t refresh[] = { - 0xffffffff, /* 1111 1111 1111 1111 1111 1111 1111 1111 */ - - /* ?>=< ;:98 7654 3210 /.-, +*)( '&%$ #"! */ - 0x50000085, /* 0101 0000 0000 0000 0000 0000 1000 0101 */ - - /* _^]\ [ZYX WVUT SRQP ONML KJIH GFED CBA@ */ - 0x50000000, /* 0101 0000 0000 0000 0000 0000 0000 0000 */ - - /* ~}| {zyx wvut srqp onml kjih gfed cba` */ - 0xd8000001, /* 1011 1000 0000 0000 0000 0000 0000 0001 */ - - 0xffffffff, /* 1111 1111 1111 1111 1111 1111 1111 1111 */ - 0xffffffff, /* 1111 1111 1111 1111 1111 1111 1111 1111 */ - 0xffffffff, /* 1111 1111 1111 1111 1111 1111 1111 1111 */ - 0xffffffff /* 1111 1111 1111 1111 1111 1111 1111 1111 */ - }; - - /* " ", "%", %00-%1F */ - - static uint32_t memcached[] = { - 0xffffffff, /* 1111 1111 1111 1111 1111 1111 1111 1111 */ - - /* ?>=< ;:98 7654 3210 /.-, +*)( '&%$ #"! */ - 0x00000021, /* 0000 0000 0000 0000 0000 0000 0010 0001 */ - - /* _^]\ [ZYX WVUT SRQP ONML KJIH GFED CBA@ */ - 0x00000000, /* 0000 0000 0000 0000 0000 0000 0000 0000 */ - - /* ~}| {zyx wvut srqp onml kjih gfed cba` */ - 0x00000000, /* 0000 0000 0000 0000 0000 0000 0000 0000 */ - - 0x00000000, /* 0000 0000 0000 0000 0000 0000 0000 0000 */ - 0x00000000, /* 0000 0000 0000 0000 0000 0000 0000 0000 */ - 0x00000000, /* 0000 0000 0000 0000 0000 0000 0000 0000 */ - 0x00000000, /* 0000 0000 0000 0000 0000 0000 0000 0000 */ - }; - - /* mail_auth is the same as memcached */ - - /* " ", "+", "=", not allowed */ - - static uint32_t mail_xtext[] = { - 0xffffffff, /* 1111 1111 1111 1111 1111 1111 1111 1111 */ - - /* ?>=< ;:98 7654 3210 /.-, +*)( '&%$ #"! */ - 0x20000801, /* 0010 0000 0000 0000 0000 1000 0000 0001 */ - - /* _^]\ [ZYX WVUT SRQP ONML KJIH GFED CBA@ */ - 0x00000000, /* 0000 0000 0000 0000 0000 0000 0000 0000 */ - - /* ~}| {zyx wvut srqp onml kjih gfed cba` */ - 0x80000000, /* 1000 0000 0000 0000 0000 0000 0000 0000 */ - - 0xffffffff, /* 1111 1111 1111 1111 1111 1111 1111 1111 */ - 0xffffffff, /* 1111 1111 1111 1111 1111 1111 1111 1111 */ - 0xffffffff, /* 1111 1111 1111 1111 1111 1111 1111 1111 */ - 0xffffffff, /* 1111 1111 1111 1111 1111 1111 1111 1111 */ - }; - - static uint32_t *map[] = - { uri, args, uri_component, html, refresh, memcached, memcached, - mail_xtext }; - - static u_char map_char[] = - { '%', '%', '%', '%', '%', '%', '%', '+' }; - - - escape = map[type]; - prefix = map_char[type]; - - if (dst == NULL) { - - /* find the number of the characters to be escaped */ - - n = 0; - - while (size) { - if (escape[*src >> 5] & (1U << (*src & 0x1f))) { - n++; - } - src++; - size--; - } - - return (uintptr_t) n; - } - - while (size) { - if (escape[*src >> 5] & (1U << (*src & 0x1f))) { - *dst++ = prefix; - *dst++ = hex[*src >> 4]; - *dst++ = hex[*src & 0xf]; - src++; - - } else { - *dst++ = *src++; - } - size--; - } - - return (uintptr_t) dst; -} - - -void -ngx_unescape_uri(u_char **dst, u_char **src, size_t size, ngx_uint_t type) -{ - u_char *d, *s, ch, c, decoded; - enum { - sw_usual = 0, - sw_quoted, - sw_quoted_second - } state; - - d = *dst; - s = *src; - - state = 0; - decoded = 0; - - while (size--) { - - ch = *s++; - - switch (state) { - case sw_usual: - if (ch == '?' - && (type & (NGX_UNESCAPE_URI|NGX_UNESCAPE_REDIRECT))) - { - *d++ = ch; - goto done; - } - - if (ch == '%') { - state = sw_quoted; - break; - } - - *d++ = ch; - break; - - case sw_quoted: - - if (ch >= '0' && ch <= '9') { - decoded = (u_char) (ch - '0'); - state = sw_quoted_second; - break; - } - - c = (u_char) (ch | 0x20); - if (c >= 'a' && c <= 'f') { - decoded = (u_char) (c - 'a' + 10); - state = sw_quoted_second; - break; - } - - /* the invalid quoted character */ - - state = sw_usual; - - *d++ = ch; - - break; - - case sw_quoted_second: - - state = sw_usual; - - if (ch >= '0' && ch <= '9') { - ch = (u_char) ((decoded << 4) + (ch - '0')); - - if (type & NGX_UNESCAPE_REDIRECT) { - if (ch > '%' && ch < 0x7f) { - *d++ = ch; - break; - } - - *d++ = '%'; *d++ = *(s - 2); *d++ = *(s - 1); - - break; - } - - *d++ = ch; - - break; - } - - c = (u_char) (ch | 0x20); - if (c >= 'a' && c <= 'f') { - ch = (u_char) ((decoded << 4) + (c - 'a') + 10); - - if (type & NGX_UNESCAPE_URI) { - if (ch == '?') { - *d++ = ch; - goto done; - } - - *d++ = ch; - break; - } - - if (type & NGX_UNESCAPE_REDIRECT) { - if (ch == '?') { - *d++ = ch; - goto done; - } - - if (ch > '%' && ch < 0x7f) { - *d++ = ch; - break; - } - - *d++ = '%'; *d++ = *(s - 2); *d++ = *(s - 1); - break; - } - - *d++ = ch; - - break; - } - - /* the invalid quoted character */ - - break; - } - } - -done: - - *dst = d; - *src = s; -} - - -uintptr_t -ngx_escape_html(u_char *dst, u_char *src, size_t size) -{ - u_char ch; - ngx_uint_t len; - - if (dst == NULL) { - - len = 0; - - while (size) { - switch (*src++) { - - case '<': - len += sizeof("<") - 2; - break; - - case '>': - len += sizeof(">") - 2; - break; - - case '&': - len += sizeof("&") - 2; - break; - - case '"': - len += sizeof(""") - 2; - break; - - default: - break; - } - size--; - } - - return (uintptr_t) len; - } - - while (size) { - ch = *src++; - - switch (ch) { - - case '<': - *dst++ = '&'; *dst++ = 'l'; *dst++ = 't'; *dst++ = ';'; - break; - - case '>': - *dst++ = '&'; *dst++ = 'g'; *dst++ = 't'; *dst++ = ';'; - break; - - case '&': - *dst++ = '&'; *dst++ = 'a'; *dst++ = 'm'; *dst++ = 'p'; - *dst++ = ';'; - break; - - case '"': - *dst++ = '&'; *dst++ = 'q'; *dst++ = 'u'; *dst++ = 'o'; - *dst++ = 't'; *dst++ = ';'; - break; - - default: - *dst++ = ch; - break; - } - size--; - } - - return (uintptr_t) dst; -} - - -uintptr_t -ngx_escape_json(u_char *dst, u_char *src, size_t size) -{ - u_char ch; - ngx_uint_t len; - - if (dst == NULL) { - len = 0; - - while (size) { - ch = *src++; - - if (ch == '\\' || ch == '"') { - len++; - - } else if (ch <= 0x1f) { - - switch (ch) { - case '\n': - case '\r': - case '\t': - case '\b': - case '\f': - len++; - break; - - default: - len += sizeof("\\u001F") - 2; - } - } - - size--; - } - - return (uintptr_t) len; - } - - while (size) { - ch = *src++; - - if (ch > 0x1f) { - - if (ch == '\\' || ch == '"') { - *dst++ = '\\'; - } - - *dst++ = ch; - - } else { - *dst++ = '\\'; - - switch (ch) { - case '\n': - *dst++ = 'n'; - break; - - case '\r': - *dst++ = 'r'; - break; - - case '\t': - *dst++ = 't'; - break; - - case '\b': - *dst++ = 'b'; - break; - - case '\f': - *dst++ = 'f'; - break; - - default: - *dst++ = 'u'; *dst++ = '0'; *dst++ = '0'; - *dst++ = '0' + (ch >> 4); - - ch &= 0xf; - - *dst++ = (ch < 10) ? ('0' + ch) : ('A' + ch - 10); - } - } - - size--; - } - - return (uintptr_t) dst; -} - - -void -ngx_str_rbtree_insert_value(ngx_rbtree_node_t *temp, - ngx_rbtree_node_t *node, ngx_rbtree_node_t *sentinel) -{ - ngx_str_node_t *n, *t; - ngx_rbtree_node_t **p; - - for ( ;; ) { - - n = (ngx_str_node_t *) node; - t = (ngx_str_node_t *) temp; - - if (node->key != temp->key) { - - p = (node->key < temp->key) ? &temp->left : &temp->right; - - } else if (n->str.len != t->str.len) { - - p = (n->str.len < t->str.len) ? &temp->left : &temp->right; - - } else { - p = (ngx_memcmp(n->str.data, t->str.data, n->str.len) < 0) - ? &temp->left : &temp->right; - } - - if (*p == sentinel) { - break; - } - - temp = *p; - } - - *p = node; - node->parent = temp; - node->left = sentinel; - node->right = sentinel; - ngx_rbt_red(node); -} - - -ngx_str_node_t * -ngx_str_rbtree_lookup(ngx_rbtree_t *rbtree, ngx_str_t *val, uint32_t hash) -{ - ngx_int_t rc; - ngx_str_node_t *n; - ngx_rbtree_node_t *node, *sentinel; - - node = rbtree->root; - sentinel = rbtree->sentinel; - - while (node != sentinel) { - - n = (ngx_str_node_t *) node; - - if (hash != node->key) { - node = (hash < node->key) ? node->left : node->right; - continue; - } - - if (val->len != n->str.len) { - node = (val->len < n->str.len) ? node->left : node->right; - continue; - } - - rc = ngx_memcmp(val->data, n->str.data, val->len); - - if (rc < 0) { - node = node->left; - continue; - } - - if (rc > 0) { - node = node->right; - continue; - } - - return n; - } - - return NULL; -} - - -/* ngx_sort() is implemented as insertion sort because we need stable sort */ - -void -ngx_sort(void *base, size_t n, size_t size, - ngx_int_t (*cmp)(const void *, const void *)) -{ - u_char *p1, *p2, *p; - - p = ngx_alloc(size, ngx_cycle->log); - if (p == NULL) { - return; - } - - for (p1 = (u_char *) base + size; - p1 < (u_char *) base + n * size; - p1 += size) - { - ngx_memcpy(p, p1, size); - - for (p2 = p1; - p2 > (u_char *) base && cmp(p2 - size, p) > 0; - p2 -= size) - { - ngx_memcpy(p2, p2 - size, size); - } - - ngx_memcpy(p2, p, size); - } - - ngx_free(p); -} - - -void -ngx_explicit_memzero(void *buf, size_t n) -{ - ngx_memzero(buf, n); - ngx_memory_barrier(); -} - - -#if (NGX_MEMCPY_LIMIT) - -void * -ngx_memcpy(void *dst, const void *src, size_t n) -{ - if (n > NGX_MEMCPY_LIMIT) { - ngx_log_error(NGX_LOG_ALERT, ngx_cycle->log, 0, "memcpy %uz bytes", n); - ngx_debug_point(); - } - - return memcpy(dst, src, n); -} - -#endif diff --git a/src/deps/src/nginx-1.30.3/src/core/ngx_string.h b/src/deps/src/nginx-1.30.3/src/core/ngx_string.h deleted file mode 100644 index 183a20521c..0000000000 --- a/src/deps/src/nginx-1.30.3/src/core/ngx_string.h +++ /dev/null @@ -1,239 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#ifndef _NGX_STRING_H_INCLUDED_ -#define _NGX_STRING_H_INCLUDED_ - - -#include -#include - - -typedef struct { - size_t len; - u_char *data; -} ngx_str_t; - - -typedef struct { - ngx_str_t key; - ngx_str_t value; -} ngx_keyval_t; - - -typedef struct { - unsigned len:28; - - unsigned valid:1; - unsigned no_cacheable:1; - unsigned not_found:1; - unsigned escape:1; - - u_char *data; -} ngx_variable_value_t; - - -#define ngx_string(str) { sizeof(str) - 1, (u_char *) str } -#define ngx_null_string { 0, NULL } -#define ngx_str_set(str, text) \ - (str)->len = sizeof(text) - 1; (str)->data = (u_char *) text -#define ngx_str_null(str) (str)->len = 0; (str)->data = NULL - - -#define ngx_tolower(c) (u_char) ((c >= 'A' && c <= 'Z') ? (c | 0x20) : c) -#define ngx_toupper(c) (u_char) ((c >= 'a' && c <= 'z') ? (c & ~0x20) : c) - -void ngx_strlow(u_char *dst, u_char *src, size_t n); - - -#define ngx_strncmp(s1, s2, n) strncmp((const char *) s1, (const char *) s2, n) - - -/* msvc and icc7 compile strcmp() to inline loop */ -#define ngx_strcmp(s1, s2) strcmp((const char *) s1, (const char *) s2) - - -#define ngx_strstr(s1, s2) strstr((const char *) s1, (const char *) s2) -#define ngx_strlen(s) strlen((const char *) s) - -size_t ngx_strnlen(u_char *p, size_t n); - -#define ngx_strchr(s1, c) strchr((const char *) s1, (int) c) - -static ngx_inline u_char * -ngx_strlchr(u_char *p, u_char *last, u_char c) -{ - while (p < last) { - - if (*p == c) { - return p; - } - - p++; - } - - return NULL; -} - - -/* - * msvc and icc7 compile memset() to the inline "rep stos" - * while ZeroMemory() and bzero() are the calls. - * icc7 may also inline several mov's of a zeroed register for small blocks. - */ -#define ngx_memzero(buf, n) (void) memset(buf, 0, n) -#define ngx_memset(buf, c, n) (void) memset(buf, c, n) - -void ngx_explicit_memzero(void *buf, size_t n); - - -#if (NGX_MEMCPY_LIMIT) - -void *ngx_memcpy(void *dst, const void *src, size_t n); -#define ngx_cpymem(dst, src, n) (((u_char *) ngx_memcpy(dst, src, n)) + (n)) - -#else - -/* - * gcc3, msvc, and icc7 compile memcpy() to the inline "rep movs". - * gcc3 compiles memcpy(d, s, 4) to the inline "mov"es. - * icc8 compile memcpy(d, s, 4) to the inline "mov"es or XMM moves. - */ -#define ngx_memcpy(dst, src, n) (void) memcpy(dst, src, n) -#define ngx_cpymem(dst, src, n) (((u_char *) memcpy(dst, src, n)) + (n)) - -#endif - - -#if ( __INTEL_COMPILER >= 800 ) - -/* - * the simple inline cycle copies the variable length strings up to 16 - * bytes faster than icc8 autodetecting _intel_fast_memcpy() - */ - -static ngx_inline u_char * -ngx_copy(u_char *dst, u_char *src, size_t len) -{ - if (len < 17) { - - while (len) { - *dst++ = *src++; - len--; - } - - return dst; - - } else { - return ngx_cpymem(dst, src, len); - } -} - -#else - -#define ngx_copy ngx_cpymem - -#endif - - -#define ngx_memmove(dst, src, n) (void) memmove(dst, src, n) -#define ngx_movemem(dst, src, n) (((u_char *) memmove(dst, src, n)) + (n)) - - -/* msvc and icc7 compile memcmp() to the inline loop */ -#define ngx_memcmp(s1, s2, n) memcmp(s1, s2, n) - - -u_char *ngx_cpystrn(u_char *dst, u_char *src, size_t n); -u_char *ngx_pstrdup(ngx_pool_t *pool, ngx_str_t *src); -u_char * ngx_cdecl ngx_sprintf(u_char *buf, const char *fmt, ...); -u_char * ngx_cdecl ngx_snprintf(u_char *buf, size_t max, const char *fmt, ...); -u_char * ngx_cdecl ngx_slprintf(u_char *buf, u_char *last, const char *fmt, - ...); -u_char *ngx_vslprintf(u_char *buf, u_char *last, const char *fmt, va_list args); -#define ngx_vsnprintf(buf, max, fmt, args) \ - ngx_vslprintf(buf, buf + (max), fmt, args) - -ngx_int_t ngx_strcasecmp(u_char *s1, u_char *s2); -ngx_int_t ngx_strncasecmp(u_char *s1, u_char *s2, size_t n); - -u_char *ngx_strnstr(u_char *s1, char *s2, size_t n); - -u_char *ngx_strstrn(u_char *s1, char *s2, size_t n); -u_char *ngx_strcasestrn(u_char *s1, char *s2, size_t n); -u_char *ngx_strlcasestrn(u_char *s1, u_char *last, u_char *s2, size_t n); - -ngx_int_t ngx_rstrncmp(u_char *s1, u_char *s2, size_t n); -ngx_int_t ngx_rstrncasecmp(u_char *s1, u_char *s2, size_t n); -ngx_int_t ngx_memn2cmp(u_char *s1, u_char *s2, size_t n1, size_t n2); -ngx_int_t ngx_dns_strcmp(u_char *s1, u_char *s2); -ngx_int_t ngx_filename_cmp(u_char *s1, u_char *s2, size_t n); - -ngx_int_t ngx_atoi(u_char *line, size_t n); -ngx_int_t ngx_atofp(u_char *line, size_t n, size_t point); -ssize_t ngx_atosz(u_char *line, size_t n); -off_t ngx_atoof(u_char *line, size_t n); -time_t ngx_atotm(u_char *line, size_t n); -ngx_int_t ngx_hextoi(u_char *line, size_t n); - -u_char *ngx_hex_dump(u_char *dst, u_char *src, size_t len); - - -#define ngx_base64_encoded_length(len) (((len + 2) / 3) * 4) -#define ngx_base64_decoded_length(len) (((len + 3) / 4) * 3) - -void ngx_encode_base64(ngx_str_t *dst, ngx_str_t *src); -void ngx_encode_base64url(ngx_str_t *dst, ngx_str_t *src); -ngx_int_t ngx_decode_base64(ngx_str_t *dst, ngx_str_t *src); -ngx_int_t ngx_decode_base64url(ngx_str_t *dst, ngx_str_t *src); - -uint32_t ngx_utf8_decode(u_char **p, size_t n); -size_t ngx_utf8_length(u_char *p, size_t n); -u_char *ngx_utf8_cpystrn(u_char *dst, u_char *src, size_t n, size_t len); - - -#define NGX_ESCAPE_URI 0 -#define NGX_ESCAPE_ARGS 1 -#define NGX_ESCAPE_URI_COMPONENT 2 -#define NGX_ESCAPE_HTML 3 -#define NGX_ESCAPE_REFRESH 4 -#define NGX_ESCAPE_MEMCACHED 5 -#define NGX_ESCAPE_MAIL_AUTH 6 -#define NGX_ESCAPE_MAIL_XTEXT 7 - -#define NGX_UNESCAPE_URI 1 -#define NGX_UNESCAPE_REDIRECT 2 - -uintptr_t ngx_escape_uri(u_char *dst, u_char *src, size_t size, - ngx_uint_t type); -void ngx_unescape_uri(u_char **dst, u_char **src, size_t size, ngx_uint_t type); -uintptr_t ngx_escape_html(u_char *dst, u_char *src, size_t size); -uintptr_t ngx_escape_json(u_char *dst, u_char *src, size_t size); - - -typedef struct { - ngx_rbtree_node_t node; - ngx_str_t str; -} ngx_str_node_t; - - -void ngx_str_rbtree_insert_value(ngx_rbtree_node_t *temp, - ngx_rbtree_node_t *node, ngx_rbtree_node_t *sentinel); -ngx_str_node_t *ngx_str_rbtree_lookup(ngx_rbtree_t *rbtree, ngx_str_t *name, - uint32_t hash); - - -void ngx_sort(void *base, size_t n, size_t size, - ngx_int_t (*cmp)(const void *, const void *)); -#define ngx_qsort qsort - - -#define ngx_value_helper(n) #n -#define ngx_value(n) ngx_value_helper(n) - - -#endif /* _NGX_STRING_H_INCLUDED_ */ diff --git a/src/deps/src/nginx-1.30.3/src/core/ngx_syslog.c b/src/deps/src/nginx-1.30.3/src/core/ngx_syslog.c deleted file mode 100644 index bad45bd16b..0000000000 --- a/src/deps/src/nginx-1.30.3/src/core/ngx_syslog.c +++ /dev/null @@ -1,410 +0,0 @@ - -/* - * Copyright (C) Nginx, Inc. - */ - - -#include -#include -#include - - -#define NGX_SYSLOG_MAX_STR \ - NGX_MAX_ERROR_STR + sizeof("<255>Jan 01 00:00:00 ") - 1 \ - + (NGX_MAXHOSTNAMELEN - 1) + 1 /* space */ \ - + 32 /* tag */ + 2 /* colon, space */ - - -static char *ngx_syslog_parse_args(ngx_conf_t *cf, ngx_syslog_peer_t *peer); -static ngx_int_t ngx_syslog_init_peer(ngx_syslog_peer_t *peer); -static void ngx_syslog_cleanup(void *data); -static u_char *ngx_syslog_log_error(ngx_log_t *log, u_char *buf, size_t len); - - -static char *facilities[] = { - "kern", "user", "mail", "daemon", "auth", "intern", "lpr", "news", "uucp", - "clock", "authpriv", "ftp", "ntp", "audit", "alert", "cron", "local0", - "local1", "local2", "local3", "local4", "local5", "local6", "local7", - NULL -}; - -/* note 'error/warn' like in nginx.conf, not 'err/warning' */ -static char *severities[] = { - "emerg", "alert", "crit", "error", "warn", "notice", "info", "debug", NULL -}; - -static ngx_log_t ngx_syslog_dummy_log; -static ngx_event_t ngx_syslog_dummy_event; - - -char * -ngx_syslog_process_conf(ngx_conf_t *cf, ngx_syslog_peer_t *peer) -{ - ngx_pool_cleanup_t *cln; - - peer->facility = NGX_CONF_UNSET_UINT; - peer->severity = NGX_CONF_UNSET_UINT; - - if (ngx_syslog_parse_args(cf, peer) != NGX_CONF_OK) { - return NGX_CONF_ERROR; - } - - if (peer->server.sockaddr == NULL) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "no syslog server specified"); - return NGX_CONF_ERROR; - } - - if (peer->facility == NGX_CONF_UNSET_UINT) { - peer->facility = 23; /* local7 */ - } - - if (peer->severity == NGX_CONF_UNSET_UINT) { - peer->severity = 6; /* info */ - } - - if (peer->tag.data == NULL) { - ngx_str_set(&peer->tag, "nginx"); - } - - peer->hostname = &cf->cycle->hostname; - peer->logp = &cf->cycle->new_log; - - peer->conn.fd = (ngx_socket_t) -1; - - peer->conn.read = &ngx_syslog_dummy_event; - peer->conn.write = &ngx_syslog_dummy_event; - - ngx_syslog_dummy_event.log = &ngx_syslog_dummy_log; - - cln = ngx_pool_cleanup_add(cf->pool, 0); - if (cln == NULL) { - return NGX_CONF_ERROR; - } - - cln->data = peer; - cln->handler = ngx_syslog_cleanup; - - return NGX_CONF_OK; -} - - -static char * -ngx_syslog_parse_args(ngx_conf_t *cf, ngx_syslog_peer_t *peer) -{ - u_char *p, *comma, c; - size_t len; - ngx_str_t *value; - ngx_url_t u; - ngx_uint_t i; - - value = cf->args->elts; - - p = value[1].data + sizeof("syslog:") - 1; - - for ( ;; ) { - comma = (u_char *) ngx_strchr(p, ','); - - if (comma != NULL) { - len = comma - p; - *comma = '\0'; - - } else { - len = value[1].data + value[1].len - p; - } - - if (ngx_strncmp(p, "server=", 7) == 0) { - - if (peer->server.sockaddr != NULL) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "duplicate syslog \"server\""); - return NGX_CONF_ERROR; - } - - ngx_memzero(&u, sizeof(ngx_url_t)); - - u.url.data = p + 7; - u.url.len = len - 7; - u.default_port = 514; - - if (ngx_parse_url(cf->pool, &u) != NGX_OK) { - if (u.err) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "%s in syslog server \"%V\"", - u.err, &u.url); - } - - return NGX_CONF_ERROR; - } - - peer->server = u.addrs[0]; - - } else if (ngx_strncmp(p, "facility=", 9) == 0) { - - if (peer->facility != NGX_CONF_UNSET_UINT) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "duplicate syslog \"facility\""); - return NGX_CONF_ERROR; - } - - for (i = 0; facilities[i] != NULL; i++) { - - if (ngx_strcmp(p + 9, facilities[i]) == 0) { - peer->facility = i; - goto next; - } - } - - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "unknown syslog facility \"%s\"", p + 9); - return NGX_CONF_ERROR; - - } else if (ngx_strncmp(p, "severity=", 9) == 0) { - - if (peer->severity != NGX_CONF_UNSET_UINT) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "duplicate syslog \"severity\""); - return NGX_CONF_ERROR; - } - - for (i = 0; severities[i] != NULL; i++) { - - if (ngx_strcmp(p + 9, severities[i]) == 0) { - peer->severity = i; - goto next; - } - } - - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "unknown syslog severity \"%s\"", p + 9); - return NGX_CONF_ERROR; - - } else if (ngx_strncmp(p, "tag=", 4) == 0) { - - if (peer->tag.data != NULL) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "duplicate syslog \"tag\""); - return NGX_CONF_ERROR; - } - - /* - * RFC 3164: the TAG is a string of ABNF alphanumeric characters - * that MUST NOT exceed 32 characters. - */ - if (len - 4 > 32) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "syslog tag length exceeds 32"); - return NGX_CONF_ERROR; - } - - for (i = 4; i < len; i++) { - c = ngx_tolower(p[i]); - - if (c < '0' || (c > '9' && c < 'a' && c != '_') || c > 'z') { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "syslog \"tag\" only allows " - "alphanumeric characters " - "and underscore"); - return NGX_CONF_ERROR; - } - } - - peer->tag.data = p + 4; - peer->tag.len = len - 4; - - } else if (len == 10 && ngx_strncmp(p, "nohostname", 10) == 0) { - peer->nohostname = 1; - - } else { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "unknown syslog parameter \"%s\"", p); - return NGX_CONF_ERROR; - } - - next: - - if (comma == NULL) { - break; - } - - p = comma + 1; - } - - return NGX_CONF_OK; -} - - -u_char * -ngx_syslog_add_header(ngx_syslog_peer_t *peer, u_char *buf) -{ - ngx_uint_t pri; - - pri = peer->facility * 8 + peer->severity; - - if (peer->nohostname) { - return ngx_sprintf(buf, "<%ui>%V %V: ", pri, &ngx_cached_syslog_time, - &peer->tag); - } - - return ngx_sprintf(buf, "<%ui>%V %V %V: ", pri, &ngx_cached_syslog_time, - peer->hostname, &peer->tag); -} - - -void -ngx_syslog_writer(ngx_log_t *log, ngx_uint_t level, u_char *buf, - size_t len) -{ - u_char *p, msg[NGX_SYSLOG_MAX_STR]; - ngx_uint_t head_len; - ngx_syslog_peer_t *peer; - - peer = log->wdata; - - if (peer->busy) { - return; - } - - peer->busy = 1; - peer->severity = level - 1; - - p = ngx_syslog_add_header(peer, msg); - head_len = p - msg; - - len -= NGX_LINEFEED_SIZE; - - if (len > NGX_SYSLOG_MAX_STR - head_len) { - len = NGX_SYSLOG_MAX_STR - head_len; - } - - p = ngx_snprintf(p, len, "%s", buf); - - (void) ngx_syslog_send(peer, msg, p - msg); - - peer->busy = 0; -} - - -ssize_t -ngx_syslog_send(ngx_syslog_peer_t *peer, u_char *buf, size_t len) -{ - ssize_t n; - - if (peer->log.handler == NULL) { - peer->log = *peer->logp; - peer->log.handler = ngx_syslog_log_error; - peer->log.data = peer; - peer->log.action = "logging to syslog"; - } - - if (peer->conn.fd == (ngx_socket_t) -1) { - if (ngx_syslog_init_peer(peer) != NGX_OK) { - return NGX_ERROR; - } - } - - if (ngx_send) { - n = ngx_send(&peer->conn, buf, len); - - } else { - /* event module has not yet set ngx_io */ - n = ngx_os_io.send(&peer->conn, buf, len); - } - - if (n == NGX_ERROR) { - - if (ngx_close_socket(peer->conn.fd) == -1) { - ngx_log_error(NGX_LOG_ALERT, &peer->log, ngx_socket_errno, - ngx_close_socket_n " failed"); - } - - peer->conn.fd = (ngx_socket_t) -1; - } - - return n; -} - - -static ngx_int_t -ngx_syslog_init_peer(ngx_syslog_peer_t *peer) -{ - ngx_socket_t fd; - - fd = ngx_socket(peer->server.sockaddr->sa_family, SOCK_DGRAM, 0); - if (fd == (ngx_socket_t) -1) { - ngx_log_error(NGX_LOG_ALERT, &peer->log, ngx_socket_errno, - ngx_socket_n " failed"); - return NGX_ERROR; - } - - if (ngx_nonblocking(fd) == -1) { - ngx_log_error(NGX_LOG_ALERT, &peer->log, ngx_socket_errno, - ngx_nonblocking_n " failed"); - goto failed; - } - - if (connect(fd, peer->server.sockaddr, peer->server.socklen) == -1) { - ngx_log_error(NGX_LOG_ALERT, &peer->log, ngx_socket_errno, - "connect() failed"); - goto failed; - } - - peer->conn.fd = fd; - peer->conn.log = &peer->log; - - /* UDP sockets are always ready to write */ - peer->conn.write->ready = 1; - - return NGX_OK; - -failed: - - if (ngx_close_socket(fd) == -1) { - ngx_log_error(NGX_LOG_ALERT, &peer->log, ngx_socket_errno, - ngx_close_socket_n " failed"); - } - - return NGX_ERROR; -} - - -static void -ngx_syslog_cleanup(void *data) -{ - ngx_syslog_peer_t *peer = data; - - /* prevents further use of this peer */ - peer->busy = 1; - - if (peer->conn.fd == (ngx_socket_t) -1) { - return; - } - - if (ngx_close_socket(peer->conn.fd) == -1) { - ngx_log_error(NGX_LOG_ALERT, &peer->log, ngx_socket_errno, - ngx_close_socket_n " failed"); - } -} - - -static u_char * -ngx_syslog_log_error(ngx_log_t *log, u_char *buf, size_t len) -{ - u_char *p; - ngx_syslog_peer_t *peer; - - p = buf; - - if (log->action) { - p = ngx_snprintf(buf, len, " while %s", log->action); - len -= p - buf; - } - - peer = log->data; - - if (peer) { - p = ngx_snprintf(p, len, ", server: %V", &peer->server.name); - } - - return p; -} diff --git a/src/deps/src/nginx-1.30.3/src/core/ngx_syslog.h b/src/deps/src/nginx-1.30.3/src/core/ngx_syslog.h deleted file mode 100644 index e2d54acdb8..0000000000 --- a/src/deps/src/nginx-1.30.3/src/core/ngx_syslog.h +++ /dev/null @@ -1,36 +0,0 @@ - -/* - * Copyright (C) Nginx, Inc. - */ - - -#ifndef _NGX_SYSLOG_H_INCLUDED_ -#define _NGX_SYSLOG_H_INCLUDED_ - - -typedef struct { - ngx_uint_t facility; - ngx_uint_t severity; - ngx_str_t tag; - - ngx_str_t *hostname; - - ngx_addr_t server; - ngx_connection_t conn; - - ngx_log_t log; - ngx_log_t *logp; - - unsigned busy:1; - unsigned nohostname:1; -} ngx_syslog_peer_t; - - -char *ngx_syslog_process_conf(ngx_conf_t *cf, ngx_syslog_peer_t *peer); -u_char *ngx_syslog_add_header(ngx_syslog_peer_t *peer, u_char *buf); -void ngx_syslog_writer(ngx_log_t *log, ngx_uint_t level, u_char *buf, - size_t len); -ssize_t ngx_syslog_send(ngx_syslog_peer_t *peer, u_char *buf, size_t len); - - -#endif /* _NGX_SYSLOG_H_INCLUDED_ */ diff --git a/src/deps/src/nginx-1.30.3/src/core/ngx_thread_pool.c b/src/deps/src/nginx-1.30.3/src/core/ngx_thread_pool.c deleted file mode 100644 index 7bf90e958f..0000000000 --- a/src/deps/src/nginx-1.30.3/src/core/ngx_thread_pool.c +++ /dev/null @@ -1,641 +0,0 @@ - -/* - * Copyright (C) Nginx, Inc. - * Copyright (C) Valentin V. Bartenev - * Copyright (C) Ruslan Ermilov - */ - - -#include -#include -#include - - -typedef struct { - ngx_array_t pools; -} ngx_thread_pool_conf_t; - - -typedef struct { - ngx_thread_task_t *first; - ngx_thread_task_t **last; -} ngx_thread_pool_queue_t; - -#define ngx_thread_pool_queue_init(q) \ - (q)->first = NULL; \ - (q)->last = &(q)->first - - -struct ngx_thread_pool_s { - ngx_thread_mutex_t mtx; - ngx_thread_pool_queue_t queue; - ngx_int_t waiting; - ngx_thread_cond_t cond; - - ngx_log_t *log; - - ngx_str_t name; - ngx_uint_t threads; - ngx_int_t max_queue; - - u_char *file; - ngx_uint_t line; -}; - - -static ngx_int_t ngx_thread_pool_init(ngx_thread_pool_t *tp, ngx_log_t *log, - ngx_pool_t *pool); -static void ngx_thread_pool_destroy(ngx_thread_pool_t *tp); -static void ngx_thread_pool_exit_handler(void *data, ngx_log_t *log); - -static void *ngx_thread_pool_cycle(void *data); -static void ngx_thread_pool_handler(ngx_event_t *ev); - -static char *ngx_thread_pool(ngx_conf_t *cf, ngx_command_t *cmd, void *conf); - -static void *ngx_thread_pool_create_conf(ngx_cycle_t *cycle); -static char *ngx_thread_pool_init_conf(ngx_cycle_t *cycle, void *conf); - -static ngx_int_t ngx_thread_pool_init_worker(ngx_cycle_t *cycle); -static void ngx_thread_pool_exit_worker(ngx_cycle_t *cycle); - - -static ngx_command_t ngx_thread_pool_commands[] = { - - { ngx_string("thread_pool"), - NGX_MAIN_CONF|NGX_DIRECT_CONF|NGX_CONF_TAKE23, - ngx_thread_pool, - 0, - 0, - NULL }, - - ngx_null_command -}; - - -static ngx_core_module_t ngx_thread_pool_module_ctx = { - ngx_string("thread_pool"), - ngx_thread_pool_create_conf, - ngx_thread_pool_init_conf -}; - - -ngx_module_t ngx_thread_pool_module = { - NGX_MODULE_V1, - &ngx_thread_pool_module_ctx, /* module context */ - ngx_thread_pool_commands, /* module directives */ - NGX_CORE_MODULE, /* module type */ - NULL, /* init master */ - NULL, /* init module */ - ngx_thread_pool_init_worker, /* init process */ - NULL, /* init thread */ - NULL, /* exit thread */ - ngx_thread_pool_exit_worker, /* exit process */ - NULL, /* exit master */ - NGX_MODULE_V1_PADDING -}; - - -static ngx_str_t ngx_thread_pool_default = ngx_string("default"); - -static ngx_uint_t ngx_thread_pool_task_id; -static ngx_atomic_t ngx_thread_pool_done_lock; -static ngx_thread_pool_queue_t ngx_thread_pool_done; - - -static ngx_int_t -ngx_thread_pool_init(ngx_thread_pool_t *tp, ngx_log_t *log, ngx_pool_t *pool) -{ - int err; - pthread_t tid; - ngx_uint_t n; - pthread_attr_t attr; - - if (ngx_notify == NULL) { - ngx_log_error(NGX_LOG_ALERT, log, 0, - "the configured event method cannot be used with thread pools"); - return NGX_ERROR; - } - - ngx_thread_pool_queue_init(&tp->queue); - - if (ngx_thread_mutex_create(&tp->mtx, log) != NGX_OK) { - return NGX_ERROR; - } - - if (ngx_thread_cond_create(&tp->cond, log) != NGX_OK) { - (void) ngx_thread_mutex_destroy(&tp->mtx, log); - return NGX_ERROR; - } - - tp->log = log; - - err = pthread_attr_init(&attr); - if (err) { - ngx_log_error(NGX_LOG_ALERT, log, err, - "pthread_attr_init() failed"); - return NGX_ERROR; - } - - err = pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); - if (err) { - ngx_log_error(NGX_LOG_ALERT, log, err, - "pthread_attr_setdetachstate() failed"); - return NGX_ERROR; - } - -#if 0 - err = pthread_attr_setstacksize(&attr, PTHREAD_STACK_MIN); - if (err) { - ngx_log_error(NGX_LOG_ALERT, log, err, - "pthread_attr_setstacksize() failed"); - return NGX_ERROR; - } -#endif - - for (n = 0; n < tp->threads; n++) { - err = pthread_create(&tid, &attr, ngx_thread_pool_cycle, tp); - if (err) { - ngx_log_error(NGX_LOG_ALERT, log, err, - "pthread_create() failed"); - return NGX_ERROR; - } - } - - (void) pthread_attr_destroy(&attr); - - return NGX_OK; -} - - -static void -ngx_thread_pool_destroy(ngx_thread_pool_t *tp) -{ - ngx_uint_t n; - ngx_thread_task_t task; - volatile ngx_uint_t lock; - - ngx_memzero(&task, sizeof(ngx_thread_task_t)); - - task.handler = ngx_thread_pool_exit_handler; - task.ctx = (void *) &lock; - - for (n = 0; n < tp->threads; n++) { - lock = 1; - - if (ngx_thread_task_post(tp, &task) != NGX_OK) { - return; - } - - while (lock) { - ngx_sched_yield(); - } - - task.event.active = 0; - } - - (void) ngx_thread_cond_destroy(&tp->cond, tp->log); - - (void) ngx_thread_mutex_destroy(&tp->mtx, tp->log); -} - - -static void -ngx_thread_pool_exit_handler(void *data, ngx_log_t *log) -{ - ngx_uint_t *lock = data; - - *lock = 0; - - pthread_exit(NULL); -} - - -ngx_thread_task_t * -ngx_thread_task_alloc(ngx_pool_t *pool, size_t size) -{ - ngx_thread_task_t *task; - - task = ngx_pcalloc(pool, sizeof(ngx_thread_task_t) + size); - if (task == NULL) { - return NULL; - } - - task->ctx = task + 1; - - return task; -} - - -ngx_int_t -ngx_thread_task_post(ngx_thread_pool_t *tp, ngx_thread_task_t *task) -{ - if (task->event.active) { - ngx_log_error(NGX_LOG_ALERT, tp->log, 0, - "task #%ui already active", task->id); - return NGX_ERROR; - } - - if (ngx_thread_mutex_lock(&tp->mtx, tp->log) != NGX_OK) { - return NGX_ERROR; - } - - if (tp->waiting >= tp->max_queue) { - (void) ngx_thread_mutex_unlock(&tp->mtx, tp->log); - - ngx_log_error(NGX_LOG_ERR, tp->log, 0, - "thread pool \"%V\" queue overflow: %i tasks waiting", - &tp->name, tp->waiting); - return NGX_ERROR; - } - - task->event.active = 1; - - task->id = ngx_thread_pool_task_id++; - task->next = NULL; - - if (ngx_thread_cond_signal(&tp->cond, tp->log) != NGX_OK) { - (void) ngx_thread_mutex_unlock(&tp->mtx, tp->log); - return NGX_ERROR; - } - - *tp->queue.last = task; - tp->queue.last = &task->next; - - tp->waiting++; - - (void) ngx_thread_mutex_unlock(&tp->mtx, tp->log); - - ngx_log_debug2(NGX_LOG_DEBUG_CORE, tp->log, 0, - "task #%ui added to thread pool \"%V\"", - task->id, &tp->name); - - return NGX_OK; -} - - -static void * -ngx_thread_pool_cycle(void *data) -{ - ngx_thread_pool_t *tp = data; - - int err; - sigset_t set; - ngx_thread_task_t *task; - -#if 0 - ngx_time_update(); -#endif - - ngx_log_debug1(NGX_LOG_DEBUG_CORE, tp->log, 0, - "thread in pool \"%V\" started", &tp->name); - - sigfillset(&set); - - sigdelset(&set, SIGILL); - sigdelset(&set, SIGFPE); - sigdelset(&set, SIGSEGV); - sigdelset(&set, SIGBUS); - - err = pthread_sigmask(SIG_BLOCK, &set, NULL); - if (err) { - ngx_log_error(NGX_LOG_ALERT, tp->log, err, "pthread_sigmask() failed"); - return NULL; - } - - for ( ;; ) { - if (ngx_thread_mutex_lock(&tp->mtx, tp->log) != NGX_OK) { - return NULL; - } - - /* the number may become negative */ - tp->waiting--; - - while (tp->queue.first == NULL) { - if (ngx_thread_cond_wait(&tp->cond, &tp->mtx, tp->log) - != NGX_OK) - { - (void) ngx_thread_mutex_unlock(&tp->mtx, tp->log); - return NULL; - } - } - - task = tp->queue.first; - tp->queue.first = task->next; - - if (tp->queue.first == NULL) { - tp->queue.last = &tp->queue.first; - } - - if (ngx_thread_mutex_unlock(&tp->mtx, tp->log) != NGX_OK) { - return NULL; - } - -#if 0 - ngx_time_update(); -#endif - - ngx_log_debug2(NGX_LOG_DEBUG_CORE, tp->log, 0, - "run task #%ui in thread pool \"%V\"", - task->id, &tp->name); - - task->handler(task->ctx, tp->log); - - ngx_log_debug2(NGX_LOG_DEBUG_CORE, tp->log, 0, - "complete task #%ui in thread pool \"%V\"", - task->id, &tp->name); - - task->next = NULL; - - ngx_spinlock(&ngx_thread_pool_done_lock, 1, 2048); - - *ngx_thread_pool_done.last = task; - ngx_thread_pool_done.last = &task->next; - - ngx_memory_barrier(); - - ngx_unlock(&ngx_thread_pool_done_lock); - - (void) ngx_notify(ngx_thread_pool_handler); - } -} - - -static void -ngx_thread_pool_handler(ngx_event_t *ev) -{ - ngx_event_t *event; - ngx_thread_task_t *task; - - ngx_log_debug0(NGX_LOG_DEBUG_CORE, ev->log, 0, "thread pool handler"); - - ngx_spinlock(&ngx_thread_pool_done_lock, 1, 2048); - - task = ngx_thread_pool_done.first; - ngx_thread_pool_done.first = NULL; - ngx_thread_pool_done.last = &ngx_thread_pool_done.first; - - ngx_memory_barrier(); - - ngx_unlock(&ngx_thread_pool_done_lock); - - while (task) { - ngx_log_debug1(NGX_LOG_DEBUG_CORE, ev->log, 0, - "run completion handler for task #%ui", task->id); - - event = &task->event; - task = task->next; - - event->complete = 1; - event->active = 0; - - event->handler(event); - } -} - - -static void * -ngx_thread_pool_create_conf(ngx_cycle_t *cycle) -{ - ngx_thread_pool_conf_t *tcf; - - tcf = ngx_pcalloc(cycle->pool, sizeof(ngx_thread_pool_conf_t)); - if (tcf == NULL) { - return NULL; - } - - if (ngx_array_init(&tcf->pools, cycle->pool, 4, - sizeof(ngx_thread_pool_t *)) - != NGX_OK) - { - return NULL; - } - - return tcf; -} - - -static char * -ngx_thread_pool_init_conf(ngx_cycle_t *cycle, void *conf) -{ - ngx_thread_pool_conf_t *tcf = conf; - - ngx_uint_t i; - ngx_thread_pool_t **tpp; - - tpp = tcf->pools.elts; - - for (i = 0; i < tcf->pools.nelts; i++) { - - if (tpp[i]->threads) { - continue; - } - - if (tpp[i]->name.len == ngx_thread_pool_default.len - && ngx_strncmp(tpp[i]->name.data, ngx_thread_pool_default.data, - ngx_thread_pool_default.len) - == 0) - { - tpp[i]->threads = 32; - tpp[i]->max_queue = 65536; - continue; - } - - ngx_log_error(NGX_LOG_EMERG, cycle->log, 0, - "unknown thread pool \"%V\" in %s:%ui", - &tpp[i]->name, tpp[i]->file, tpp[i]->line); - - return NGX_CONF_ERROR; - } - - return NGX_CONF_OK; -} - - -static char * -ngx_thread_pool(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) -{ - ngx_str_t *value; - ngx_uint_t i; - ngx_thread_pool_t *tp; - - value = cf->args->elts; - - tp = ngx_thread_pool_add(cf, &value[1]); - - if (tp == NULL) { - return NGX_CONF_ERROR; - } - - if (tp->threads) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "duplicate thread pool \"%V\"", &tp->name); - return NGX_CONF_ERROR; - } - - tp->max_queue = 65536; - - for (i = 2; i < cf->args->nelts; i++) { - - if (ngx_strncmp(value[i].data, "threads=", 8) == 0) { - - tp->threads = ngx_atoi(value[i].data + 8, value[i].len - 8); - - if (tp->threads == (ngx_uint_t) NGX_ERROR || tp->threads == 0) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "invalid threads value \"%V\"", &value[i]); - return NGX_CONF_ERROR; - } - - continue; - } - - if (ngx_strncmp(value[i].data, "max_queue=", 10) == 0) { - - tp->max_queue = ngx_atoi(value[i].data + 10, value[i].len - 10); - - if (tp->max_queue == NGX_ERROR) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "invalid max_queue value \"%V\"", &value[i]); - return NGX_CONF_ERROR; - } - - continue; - } - } - - if (tp->threads == 0) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "\"%V\" must have \"threads\" parameter", - &cmd->name); - return NGX_CONF_ERROR; - } - - return NGX_CONF_OK; -} - - -ngx_thread_pool_t * -ngx_thread_pool_add(ngx_conf_t *cf, ngx_str_t *name) -{ - ngx_thread_pool_t *tp, **tpp; - ngx_thread_pool_conf_t *tcf; - - if (name == NULL) { - name = &ngx_thread_pool_default; - } - - tp = ngx_thread_pool_get(cf->cycle, name); - - if (tp) { - return tp; - } - - tp = ngx_pcalloc(cf->pool, sizeof(ngx_thread_pool_t)); - if (tp == NULL) { - return NULL; - } - - tp->name = *name; - tp->file = cf->conf_file->file.name.data; - tp->line = cf->conf_file->line; - - tcf = (ngx_thread_pool_conf_t *) ngx_get_conf(cf->cycle->conf_ctx, - ngx_thread_pool_module); - - tpp = ngx_array_push(&tcf->pools); - if (tpp == NULL) { - return NULL; - } - - *tpp = tp; - - return tp; -} - - -ngx_thread_pool_t * -ngx_thread_pool_get(ngx_cycle_t *cycle, ngx_str_t *name) -{ - ngx_uint_t i; - ngx_thread_pool_t **tpp; - ngx_thread_pool_conf_t *tcf; - - tcf = (ngx_thread_pool_conf_t *) ngx_get_conf(cycle->conf_ctx, - ngx_thread_pool_module); - - tpp = tcf->pools.elts; - - for (i = 0; i < tcf->pools.nelts; i++) { - - if (tpp[i]->name.len == name->len - && ngx_strncmp(tpp[i]->name.data, name->data, name->len) == 0) - { - return tpp[i]; - } - } - - return NULL; -} - - -static ngx_int_t -ngx_thread_pool_init_worker(ngx_cycle_t *cycle) -{ - ngx_uint_t i; - ngx_thread_pool_t **tpp; - ngx_thread_pool_conf_t *tcf; - - if (ngx_process != NGX_PROCESS_WORKER - && ngx_process != NGX_PROCESS_SINGLE) - { - return NGX_OK; - } - - tcf = (ngx_thread_pool_conf_t *) ngx_get_conf(cycle->conf_ctx, - ngx_thread_pool_module); - - if (tcf == NULL) { - return NGX_OK; - } - - ngx_thread_pool_queue_init(&ngx_thread_pool_done); - - tpp = tcf->pools.elts; - - for (i = 0; i < tcf->pools.nelts; i++) { - if (ngx_thread_pool_init(tpp[i], cycle->log, cycle->pool) != NGX_OK) { - return NGX_ERROR; - } - } - - return NGX_OK; -} - - -static void -ngx_thread_pool_exit_worker(ngx_cycle_t *cycle) -{ - ngx_uint_t i; - ngx_thread_pool_t **tpp; - ngx_thread_pool_conf_t *tcf; - - if (ngx_process != NGX_PROCESS_WORKER - && ngx_process != NGX_PROCESS_SINGLE) - { - return; - } - - tcf = (ngx_thread_pool_conf_t *) ngx_get_conf(cycle->conf_ctx, - ngx_thread_pool_module); - - if (tcf == NULL) { - return; - } - - tpp = tcf->pools.elts; - - for (i = 0; i < tcf->pools.nelts; i++) { - ngx_thread_pool_destroy(tpp[i]); - } -} diff --git a/src/deps/src/nginx-1.30.3/src/core/ngx_thread_pool.h b/src/deps/src/nginx-1.30.3/src/core/ngx_thread_pool.h deleted file mode 100644 index 5e5adf624d..0000000000 --- a/src/deps/src/nginx-1.30.3/src/core/ngx_thread_pool.h +++ /dev/null @@ -1,36 +0,0 @@ - -/* - * Copyright (C) Nginx, Inc. - * Copyright (C) Valentin V. Bartenev - */ - - -#ifndef _NGX_THREAD_POOL_H_INCLUDED_ -#define _NGX_THREAD_POOL_H_INCLUDED_ - - -#include -#include -#include - - -struct ngx_thread_task_s { - ngx_thread_task_t *next; - ngx_uint_t id; - void *ctx; - void (*handler)(void *data, ngx_log_t *log); - ngx_event_t event; -}; - - -typedef struct ngx_thread_pool_s ngx_thread_pool_t; - - -ngx_thread_pool_t *ngx_thread_pool_add(ngx_conf_t *cf, ngx_str_t *name); -ngx_thread_pool_t *ngx_thread_pool_get(ngx_cycle_t *cycle, ngx_str_t *name); - -ngx_thread_task_t *ngx_thread_task_alloc(ngx_pool_t *pool, size_t size); -ngx_int_t ngx_thread_task_post(ngx_thread_pool_t *tp, ngx_thread_task_t *task); - - -#endif /* _NGX_THREAD_POOL_H_INCLUDED_ */ diff --git a/src/deps/src/nginx-1.30.3/src/core/ngx_times.c b/src/deps/src/nginx-1.30.3/src/core/ngx_times.c deleted file mode 100644 index b0057d2abf..0000000000 --- a/src/deps/src/nginx-1.30.3/src/core/ngx_times.c +++ /dev/null @@ -1,460 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#include -#include - - -static ngx_msec_t ngx_monotonic_time(time_t sec, ngx_uint_t msec); - - -/* - * The time may be updated by signal handler or by several threads. - * The time update operations are rare and require to hold the ngx_time_lock. - * The time read operations are frequent, so they are lock-free and get time - * values and strings from the current slot. Thus thread may get the corrupted - * values only if it is preempted while copying and then it is not scheduled - * to run more than NGX_TIME_SLOTS seconds. - */ - -#define NGX_TIME_SLOTS 64 - -static ngx_uint_t slot; -static ngx_atomic_t ngx_time_lock; - -volatile ngx_msec_t ngx_current_msec; -volatile ngx_time_t *ngx_cached_time; -volatile ngx_str_t ngx_cached_err_log_time; -volatile ngx_str_t ngx_cached_http_time; -volatile ngx_str_t ngx_cached_http_log_time; -volatile ngx_str_t ngx_cached_http_log_iso8601; -volatile ngx_str_t ngx_cached_syslog_time; - -#if !(NGX_WIN32) - -/* - * localtime() and localtime_r() are not Async-Signal-Safe functions, therefore, - * they must not be called by a signal handler, so we use the cached - * GMT offset value. Fortunately the value is changed only two times a year. - */ - -static ngx_int_t cached_gmtoff; -#endif - -static ngx_time_t cached_time[NGX_TIME_SLOTS]; -static u_char cached_err_log_time[NGX_TIME_SLOTS] - [sizeof("1970/09/28 12:00:00")]; -static u_char cached_http_time[NGX_TIME_SLOTS] - [sizeof("Mon, 28 Sep 1970 06:00:00 GMT")]; -static u_char cached_http_log_time[NGX_TIME_SLOTS] - [sizeof("28/Sep/1970:12:00:00 +0600")]; -static u_char cached_http_log_iso8601[NGX_TIME_SLOTS] - [sizeof("1970-09-28T12:00:00+06:00")]; -static u_char cached_syslog_time[NGX_TIME_SLOTS] - [sizeof("Sep 28 12:00:00")]; - - -static char *week[] = { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" }; -static char *months[] = { "Jan", "Feb", "Mar", "Apr", "May", "Jun", - "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" }; - -void -ngx_time_init(void) -{ - ngx_cached_err_log_time.len = sizeof("1970/09/28 12:00:00") - 1; - ngx_cached_http_time.len = sizeof("Mon, 28 Sep 1970 06:00:00 GMT") - 1; - ngx_cached_http_log_time.len = sizeof("28/Sep/1970:12:00:00 +0600") - 1; - ngx_cached_http_log_iso8601.len = sizeof("1970-09-28T12:00:00+06:00") - 1; - ngx_cached_syslog_time.len = sizeof("Sep 28 12:00:00") - 1; - - ngx_cached_time = &cached_time[0]; - - ngx_time_update(); -} - - -void -ngx_time_update(void) -{ - u_char *p0, *p1, *p2, *p3, *p4; - ngx_tm_t tm, gmt; - time_t sec; - ngx_uint_t msec; - ngx_time_t *tp; - struct timeval tv; - - if (!ngx_trylock(&ngx_time_lock)) { - return; - } - - ngx_gettimeofday(&tv); - - sec = tv.tv_sec; - msec = tv.tv_usec / 1000; - - ngx_current_msec = ngx_monotonic_time(sec, msec); - - tp = &cached_time[slot]; - - if (tp->sec == sec) { - tp->msec = msec; - ngx_unlock(&ngx_time_lock); - return; - } - - if (slot == NGX_TIME_SLOTS - 1) { - slot = 0; - } else { - slot++; - } - - tp = &cached_time[slot]; - - tp->sec = sec; - tp->msec = msec; - - ngx_gmtime(sec, &gmt); - - - p0 = &cached_http_time[slot][0]; - - (void) ngx_sprintf(p0, "%s, %02d %s %4d %02d:%02d:%02d GMT", - week[gmt.ngx_tm_wday], gmt.ngx_tm_mday, - months[gmt.ngx_tm_mon - 1], gmt.ngx_tm_year, - gmt.ngx_tm_hour, gmt.ngx_tm_min, gmt.ngx_tm_sec); - -#if (NGX_HAVE_GETTIMEZONE) - - tp->gmtoff = ngx_gettimezone(); - ngx_gmtime(sec + tp->gmtoff * 60, &tm); - -#elif (NGX_HAVE_GMTOFF) - - ngx_localtime(sec, &tm); - cached_gmtoff = (ngx_int_t) (tm.ngx_tm_gmtoff / 60); - tp->gmtoff = cached_gmtoff; - -#else - - ngx_localtime(sec, &tm); - cached_gmtoff = ngx_timezone(tm.ngx_tm_isdst); - tp->gmtoff = cached_gmtoff; - -#endif - - - p1 = &cached_err_log_time[slot][0]; - - (void) ngx_sprintf(p1, "%4d/%02d/%02d %02d:%02d:%02d", - tm.ngx_tm_year, tm.ngx_tm_mon, - tm.ngx_tm_mday, tm.ngx_tm_hour, - tm.ngx_tm_min, tm.ngx_tm_sec); - - - p2 = &cached_http_log_time[slot][0]; - - (void) ngx_sprintf(p2, "%02d/%s/%d:%02d:%02d:%02d %c%02i%02i", - tm.ngx_tm_mday, months[tm.ngx_tm_mon - 1], - tm.ngx_tm_year, tm.ngx_tm_hour, - tm.ngx_tm_min, tm.ngx_tm_sec, - tp->gmtoff < 0 ? '-' : '+', - ngx_abs(tp->gmtoff / 60), ngx_abs(tp->gmtoff % 60)); - - p3 = &cached_http_log_iso8601[slot][0]; - - (void) ngx_sprintf(p3, "%4d-%02d-%02dT%02d:%02d:%02d%c%02i:%02i", - tm.ngx_tm_year, tm.ngx_tm_mon, - tm.ngx_tm_mday, tm.ngx_tm_hour, - tm.ngx_tm_min, tm.ngx_tm_sec, - tp->gmtoff < 0 ? '-' : '+', - ngx_abs(tp->gmtoff / 60), ngx_abs(tp->gmtoff % 60)); - - p4 = &cached_syslog_time[slot][0]; - - (void) ngx_sprintf(p4, "%s %2d %02d:%02d:%02d", - months[tm.ngx_tm_mon - 1], tm.ngx_tm_mday, - tm.ngx_tm_hour, tm.ngx_tm_min, tm.ngx_tm_sec); - - ngx_memory_barrier(); - - ngx_cached_time = tp; - ngx_cached_http_time.data = p0; - ngx_cached_err_log_time.data = p1; - ngx_cached_http_log_time.data = p2; - ngx_cached_http_log_iso8601.data = p3; - ngx_cached_syslog_time.data = p4; - - ngx_unlock(&ngx_time_lock); -} - - -static ngx_msec_t -ngx_monotonic_time(time_t sec, ngx_uint_t msec) -{ -#if (NGX_HAVE_CLOCK_MONOTONIC) - struct timespec ts; - - clock_gettime(CLOCK_MONOTONIC, &ts); - - sec = ts.tv_sec; - msec = ts.tv_nsec / 1000000; - -#endif - - return (ngx_msec_t) sec * 1000 + msec; -} - - -#if !(NGX_WIN32) - -void -ngx_time_sigsafe_update(void) -{ - u_char *p, *p2; - ngx_tm_t tm; - time_t sec; - ngx_time_t *tp; - struct timeval tv; - - if (!ngx_trylock(&ngx_time_lock)) { - return; - } - - ngx_gettimeofday(&tv); - - sec = tv.tv_sec; - - tp = &cached_time[slot]; - - if (tp->sec == sec) { - ngx_unlock(&ngx_time_lock); - return; - } - - if (slot == NGX_TIME_SLOTS - 1) { - slot = 0; - } else { - slot++; - } - - tp = &cached_time[slot]; - - tp->sec = 0; - - ngx_gmtime(sec + cached_gmtoff * 60, &tm); - - p = &cached_err_log_time[slot][0]; - - (void) ngx_sprintf(p, "%4d/%02d/%02d %02d:%02d:%02d", - tm.ngx_tm_year, tm.ngx_tm_mon, - tm.ngx_tm_mday, tm.ngx_tm_hour, - tm.ngx_tm_min, tm.ngx_tm_sec); - - p2 = &cached_syslog_time[slot][0]; - - (void) ngx_sprintf(p2, "%s %2d %02d:%02d:%02d", - months[tm.ngx_tm_mon - 1], tm.ngx_tm_mday, - tm.ngx_tm_hour, tm.ngx_tm_min, tm.ngx_tm_sec); - - ngx_memory_barrier(); - - ngx_cached_err_log_time.data = p; - ngx_cached_syslog_time.data = p2; - - ngx_unlock(&ngx_time_lock); -} - -#endif - - -u_char * -ngx_http_time(u_char *buf, time_t t) -{ - ngx_tm_t tm; - - ngx_gmtime(t, &tm); - - return ngx_sprintf(buf, "%s, %02d %s %4d %02d:%02d:%02d GMT", - week[tm.ngx_tm_wday], - tm.ngx_tm_mday, - months[tm.ngx_tm_mon - 1], - tm.ngx_tm_year, - tm.ngx_tm_hour, - tm.ngx_tm_min, - tm.ngx_tm_sec); -} - - -u_char * -ngx_http_cookie_time(u_char *buf, time_t t) -{ - ngx_tm_t tm; - - ngx_gmtime(t, &tm); - - /* - * Netscape 3.x does not understand 4-digit years at all and - * 2-digit years more than "37" - */ - - return ngx_sprintf(buf, - (tm.ngx_tm_year > 2037) ? - "%s, %02d-%s-%d %02d:%02d:%02d GMT": - "%s, %02d-%s-%02d %02d:%02d:%02d GMT", - week[tm.ngx_tm_wday], - tm.ngx_tm_mday, - months[tm.ngx_tm_mon - 1], - (tm.ngx_tm_year > 2037) ? tm.ngx_tm_year: - tm.ngx_tm_year % 100, - tm.ngx_tm_hour, - tm.ngx_tm_min, - tm.ngx_tm_sec); -} - - -void -ngx_gmtime(time_t t, ngx_tm_t *tp) -{ - ngx_int_t yday; - ngx_uint_t sec, min, hour, mday, mon, year, wday, days, leap; - - /* the calculation is valid for positive time_t only */ - - if (t < 0) { - t = 0; - } - - days = t / 86400; - sec = t % 86400; - - /* - * no more than 4 year digits supported, - * truncate to December 31, 9999, 23:59:59 - */ - - if (days > 2932896) { - days = 2932896; - sec = 86399; - } - - /* January 1, 1970 was Thursday */ - - wday = (4 + days) % 7; - - hour = sec / 3600; - sec %= 3600; - min = sec / 60; - sec %= 60; - - /* - * the algorithm based on Gauss' formula, - * see src/core/ngx_parse_time.c - */ - - /* days since March 1, 1 BC */ - days = days - (31 + 28) + 719527; - - /* - * The "days" should be adjusted to 1 only, however, some March 1st's go - * to previous year, so we adjust them to 2. This causes also shift of the - * last February days to next year, but we catch the case when "yday" - * becomes negative. - */ - - year = (days + 2) * 400 / (365 * 400 + 100 - 4 + 1); - - yday = days - (365 * year + year / 4 - year / 100 + year / 400); - - if (yday < 0) { - leap = (year % 4 == 0) && (year % 100 || (year % 400 == 0)); - yday = 365 + leap + yday; - year--; - } - - /* - * The empirical formula that maps "yday" to month. - * There are at least 10 variants, some of them are: - * mon = (yday + 31) * 15 / 459 - * mon = (yday + 31) * 17 / 520 - * mon = (yday + 31) * 20 / 612 - */ - - mon = (yday + 31) * 10 / 306; - - /* the Gauss' formula that evaluates days before the month */ - - mday = yday - (367 * mon / 12 - 30) + 1; - - if (yday >= 306) { - - year++; - mon -= 10; - - /* - * there is no "yday" in Win32 SYSTEMTIME - * - * yday -= 306; - */ - - } else { - - mon += 2; - - /* - * there is no "yday" in Win32 SYSTEMTIME - * - * yday += 31 + 28 + leap; - */ - } - - tp->ngx_tm_sec = (ngx_tm_sec_t) sec; - tp->ngx_tm_min = (ngx_tm_min_t) min; - tp->ngx_tm_hour = (ngx_tm_hour_t) hour; - tp->ngx_tm_mday = (ngx_tm_mday_t) mday; - tp->ngx_tm_mon = (ngx_tm_mon_t) mon; - tp->ngx_tm_year = (ngx_tm_year_t) year; - tp->ngx_tm_wday = (ngx_tm_wday_t) wday; -} - - -time_t -ngx_next_time(time_t when) -{ - time_t now, next; - struct tm tm; - - now = ngx_time(); - - ngx_libc_localtime(now, &tm); - - tm.tm_hour = (int) (when / 3600); - when %= 3600; - tm.tm_min = (int) (when / 60); - tm.tm_sec = (int) (when % 60); - - next = mktime(&tm); - - if (next == -1) { - return -1; - } - - if (next - now > 0) { - return next; - } - - tm.tm_mday++; - - /* mktime() should normalize a date (Jan 32, etc) */ - - next = mktime(&tm); - - if (next != -1) { - return next; - } - - return -1; -} diff --git a/src/deps/src/nginx-1.30.3/src/core/ngx_times.h b/src/deps/src/nginx-1.30.3/src/core/ngx_times.h deleted file mode 100644 index 49e0a8c48f..0000000000 --- a/src/deps/src/nginx-1.30.3/src/core/ngx_times.h +++ /dev/null @@ -1,52 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#ifndef _NGX_TIMES_H_INCLUDED_ -#define _NGX_TIMES_H_INCLUDED_ - - -#include -#include - - -typedef struct { - time_t sec; - ngx_uint_t msec; - ngx_int_t gmtoff; -} ngx_time_t; - - -void ngx_time_init(void); -void ngx_time_update(void); -void ngx_time_sigsafe_update(void); -u_char *ngx_http_time(u_char *buf, time_t t); -u_char *ngx_http_cookie_time(u_char *buf, time_t t); -void ngx_gmtime(time_t t, ngx_tm_t *tp); - -time_t ngx_next_time(time_t when); -#define ngx_next_time_n "mktime()" - - -extern volatile ngx_time_t *ngx_cached_time; - -#define ngx_time() ngx_cached_time->sec -#define ngx_timeofday() (ngx_time_t *) ngx_cached_time - -extern volatile ngx_str_t ngx_cached_err_log_time; -extern volatile ngx_str_t ngx_cached_http_time; -extern volatile ngx_str_t ngx_cached_http_log_time; -extern volatile ngx_str_t ngx_cached_http_log_iso8601; -extern volatile ngx_str_t ngx_cached_syslog_time; - -/* - * milliseconds elapsed since some unspecified point in the past - * and truncated to ngx_msec_t, used in event timers - */ -extern volatile ngx_msec_t ngx_current_msec; - - -#endif /* _NGX_TIMES_H_INCLUDED_ */ diff --git a/src/deps/src/nginx-1.30.3/src/event/modules/ngx_devpoll_module.c b/src/deps/src/nginx-1.30.3/src/event/modules/ngx_devpoll_module.c deleted file mode 100644 index 590eb28e14..0000000000 --- a/src/deps/src/nginx-1.30.3/src/event/modules/ngx_devpoll_module.c +++ /dev/null @@ -1,561 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#include -#include -#include - - -#if (NGX_TEST_BUILD_DEVPOLL) - -/* Solaris declarations */ - -#ifndef POLLREMOVE -#define POLLREMOVE 0x0800 -#endif -#define DP_POLL 0xD001 -#define DP_ISPOLLED 0xD002 - -struct dvpoll { - struct pollfd *dp_fds; - int dp_nfds; - int dp_timeout; -}; - -#endif - - -typedef struct { - ngx_uint_t changes; - ngx_uint_t events; -} ngx_devpoll_conf_t; - - -static ngx_int_t ngx_devpoll_init(ngx_cycle_t *cycle, ngx_msec_t timer); -static void ngx_devpoll_done(ngx_cycle_t *cycle); -static ngx_int_t ngx_devpoll_add_event(ngx_event_t *ev, ngx_int_t event, - ngx_uint_t flags); -static ngx_int_t ngx_devpoll_del_event(ngx_event_t *ev, ngx_int_t event, - ngx_uint_t flags); -static ngx_int_t ngx_devpoll_set_event(ngx_event_t *ev, ngx_int_t event, - ngx_uint_t flags); -static ngx_int_t ngx_devpoll_process_events(ngx_cycle_t *cycle, - ngx_msec_t timer, ngx_uint_t flags); - -static void *ngx_devpoll_create_conf(ngx_cycle_t *cycle); -static char *ngx_devpoll_init_conf(ngx_cycle_t *cycle, void *conf); - -static int dp = -1; -static struct pollfd *change_list, *event_list; -static ngx_uint_t nchanges, max_changes, nevents; - -static ngx_event_t **change_index; - - -static ngx_str_t devpoll_name = ngx_string("/dev/poll"); - -static ngx_command_t ngx_devpoll_commands[] = { - - { ngx_string("devpoll_changes"), - NGX_EVENT_CONF|NGX_CONF_TAKE1, - ngx_conf_set_num_slot, - 0, - offsetof(ngx_devpoll_conf_t, changes), - NULL }, - - { ngx_string("devpoll_events"), - NGX_EVENT_CONF|NGX_CONF_TAKE1, - ngx_conf_set_num_slot, - 0, - offsetof(ngx_devpoll_conf_t, events), - NULL }, - - ngx_null_command -}; - - -static ngx_event_module_t ngx_devpoll_module_ctx = { - &devpoll_name, - ngx_devpoll_create_conf, /* create configuration */ - ngx_devpoll_init_conf, /* init configuration */ - - { - ngx_devpoll_add_event, /* add an event */ - ngx_devpoll_del_event, /* delete an event */ - ngx_devpoll_add_event, /* enable an event */ - ngx_devpoll_del_event, /* disable an event */ - NULL, /* add an connection */ - NULL, /* delete an connection */ - NULL, /* trigger a notify */ - ngx_devpoll_process_events, /* process the events */ - ngx_devpoll_init, /* init the events */ - ngx_devpoll_done, /* done the events */ - } - -}; - -ngx_module_t ngx_devpoll_module = { - NGX_MODULE_V1, - &ngx_devpoll_module_ctx, /* module context */ - ngx_devpoll_commands, /* module directives */ - NGX_EVENT_MODULE, /* module type */ - NULL, /* init master */ - NULL, /* init module */ - NULL, /* init process */ - NULL, /* init thread */ - NULL, /* exit thread */ - NULL, /* exit process */ - NULL, /* exit master */ - NGX_MODULE_V1_PADDING -}; - - -static ngx_int_t -ngx_devpoll_init(ngx_cycle_t *cycle, ngx_msec_t timer) -{ - size_t n; - ngx_devpoll_conf_t *dpcf; - - dpcf = ngx_event_get_conf(cycle->conf_ctx, ngx_devpoll_module); - - if (dp == -1) { - dp = open("/dev/poll", O_RDWR); - - if (dp == -1) { - ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno, - "open(/dev/poll) failed"); - return NGX_ERROR; - } - } - - if (max_changes < dpcf->changes) { - if (nchanges) { - n = nchanges * sizeof(struct pollfd); - if (write(dp, change_list, n) != (ssize_t) n) { - ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno, - "write(/dev/poll) failed"); - return NGX_ERROR; - } - - nchanges = 0; - } - - if (change_list) { - ngx_free(change_list); - } - - change_list = ngx_alloc(sizeof(struct pollfd) * dpcf->changes, - cycle->log); - if (change_list == NULL) { - return NGX_ERROR; - } - - if (change_index) { - ngx_free(change_index); - } - - change_index = ngx_alloc(sizeof(ngx_event_t *) * dpcf->changes, - cycle->log); - if (change_index == NULL) { - return NGX_ERROR; - } - } - - max_changes = dpcf->changes; - - if (nevents < dpcf->events) { - if (event_list) { - ngx_free(event_list); - } - - event_list = ngx_alloc(sizeof(struct pollfd) * dpcf->events, - cycle->log); - if (event_list == NULL) { - return NGX_ERROR; - } - } - - nevents = dpcf->events; - - ngx_io = ngx_os_io; - - ngx_event_actions = ngx_devpoll_module_ctx.actions; - - ngx_event_flags = NGX_USE_LEVEL_EVENT|NGX_USE_FD_EVENT; - - return NGX_OK; -} - - -static void -ngx_devpoll_done(ngx_cycle_t *cycle) -{ - if (close(dp) == -1) { - ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno, - "close(/dev/poll) failed"); - } - - dp = -1; - - ngx_free(change_list); - ngx_free(event_list); - ngx_free(change_index); - - change_list = NULL; - event_list = NULL; - change_index = NULL; - max_changes = 0; - nchanges = 0; - nevents = 0; -} - - -static ngx_int_t -ngx_devpoll_add_event(ngx_event_t *ev, ngx_int_t event, ngx_uint_t flags) -{ -#if (NGX_DEBUG) - ngx_connection_t *c; -#endif - -#if (NGX_READ_EVENT != POLLIN) - event = (event == NGX_READ_EVENT) ? POLLIN : POLLOUT; -#endif - -#if (NGX_DEBUG) - c = ev->data; - ngx_log_debug2(NGX_LOG_DEBUG_EVENT, ev->log, 0, - "devpoll add event: fd:%d ev:%04Xi", c->fd, event); -#endif - - ev->active = 1; - - return ngx_devpoll_set_event(ev, event, 0); -} - - -static ngx_int_t -ngx_devpoll_del_event(ngx_event_t *ev, ngx_int_t event, ngx_uint_t flags) -{ - ngx_event_t *e; - ngx_connection_t *c; - - c = ev->data; - -#if (NGX_READ_EVENT != POLLIN) - event = (event == NGX_READ_EVENT) ? POLLIN : POLLOUT; -#endif - - ngx_log_debug2(NGX_LOG_DEBUG_EVENT, ev->log, 0, - "devpoll del event: fd:%d ev:%04Xi", c->fd, event); - - if (ngx_devpoll_set_event(ev, POLLREMOVE, flags) == NGX_ERROR) { - return NGX_ERROR; - } - - ev->active = 0; - - if (flags & NGX_CLOSE_EVENT) { - e = (event == POLLIN) ? c->write : c->read; - - if (e) { - e->active = 0; - } - - return NGX_OK; - } - - /* restore the pair event if it exists */ - - if (event == POLLIN) { - e = c->write; - event = POLLOUT; - - } else { - e = c->read; - event = POLLIN; - } - - if (e && e->active) { - return ngx_devpoll_set_event(e, event, 0); - } - - return NGX_OK; -} - - -static ngx_int_t -ngx_devpoll_set_event(ngx_event_t *ev, ngx_int_t event, ngx_uint_t flags) -{ - size_t n; - ngx_connection_t *c; - - c = ev->data; - - ngx_log_debug3(NGX_LOG_DEBUG_EVENT, ev->log, 0, - "devpoll fd:%d ev:%04Xi fl:%04Xi", c->fd, event, flags); - - if (nchanges >= max_changes) { - ngx_log_error(NGX_LOG_WARN, ev->log, 0, - "/dev/pool change list is filled up"); - - n = nchanges * sizeof(struct pollfd); - if (write(dp, change_list, n) != (ssize_t) n) { - ngx_log_error(NGX_LOG_ALERT, ev->log, ngx_errno, - "write(/dev/poll) failed"); - return NGX_ERROR; - } - - nchanges = 0; - } - - change_list[nchanges].fd = c->fd; - change_list[nchanges].events = (short) event; - change_list[nchanges].revents = 0; - - change_index[nchanges] = ev; - ev->index = nchanges; - - nchanges++; - - if (flags & NGX_CLOSE_EVENT) { - n = nchanges * sizeof(struct pollfd); - if (write(dp, change_list, n) != (ssize_t) n) { - ngx_log_error(NGX_LOG_ALERT, ev->log, ngx_errno, - "write(/dev/poll) failed"); - return NGX_ERROR; - } - - nchanges = 0; - } - - return NGX_OK; -} - - -static ngx_int_t -ngx_devpoll_process_events(ngx_cycle_t *cycle, ngx_msec_t timer, - ngx_uint_t flags) -{ - int events, revents, rc; - size_t n; - ngx_fd_t fd; - ngx_err_t err; - ngx_int_t i; - ngx_uint_t level, instance; - ngx_event_t *rev, *wev; - ngx_queue_t *queue; - ngx_connection_t *c; - struct pollfd pfd; - struct dvpoll dvp; - - /* NGX_TIMER_INFINITE == INFTIM */ - - ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0, - "devpoll timer: %M", timer); - - if (nchanges) { - n = nchanges * sizeof(struct pollfd); - if (write(dp, change_list, n) != (ssize_t) n) { - ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno, - "write(/dev/poll) failed"); - return NGX_ERROR; - } - - nchanges = 0; - } - - dvp.dp_fds = event_list; - dvp.dp_nfds = (int) nevents; - dvp.dp_timeout = timer; - events = ioctl(dp, DP_POLL, &dvp); - - err = (events == -1) ? ngx_errno : 0; - - if (flags & NGX_UPDATE_TIME || ngx_event_timer_alarm) { - ngx_time_update(); - } - - if (err) { - if (err == NGX_EINTR) { - - if (ngx_event_timer_alarm) { - ngx_event_timer_alarm = 0; - return NGX_OK; - } - - level = NGX_LOG_INFO; - - } else { - level = NGX_LOG_ALERT; - } - - ngx_log_error(level, cycle->log, err, "ioctl(DP_POLL) failed"); - return NGX_ERROR; - } - - if (events == 0) { - if (timer != NGX_TIMER_INFINITE) { - return NGX_OK; - } - - ngx_log_error(NGX_LOG_ALERT, cycle->log, 0, - "ioctl(DP_POLL) returned no events without timeout"); - return NGX_ERROR; - } - - for (i = 0; i < events; i++) { - - fd = event_list[i].fd; - revents = event_list[i].revents; - - c = ngx_cycle->files[fd]; - - if (c == NULL || c->fd == -1) { - - pfd.fd = fd; - pfd.events = 0; - pfd.revents = 0; - - rc = ioctl(dp, DP_ISPOLLED, &pfd); - - switch (rc) { - - case -1: - ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno, - "ioctl(DP_ISPOLLED) failed for socket %d, event %04Xd", - fd, revents); - break; - - case 0: - ngx_log_error(NGX_LOG_ALERT, cycle->log, 0, - "phantom event %04Xd for closed and removed socket %d", - revents, fd); - break; - - default: - ngx_log_error(NGX_LOG_ALERT, cycle->log, 0, - "unexpected event %04Xd for closed and removed socket %d, " - "ioctl(DP_ISPOLLED) returned rc:%d, fd:%d, event %04Xd", - revents, fd, rc, pfd.fd, pfd.revents); - - pfd.fd = fd; - pfd.events = POLLREMOVE; - pfd.revents = 0; - - if (write(dp, &pfd, sizeof(struct pollfd)) - != (ssize_t) sizeof(struct pollfd)) - { - ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno, - "write(/dev/poll) for %d failed", fd); - } - - if (close(fd) == -1) { - ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno, - "close(%d) failed", fd); - } - - break; - } - - continue; - } - - ngx_log_debug3(NGX_LOG_DEBUG_EVENT, cycle->log, 0, - "devpoll: fd:%d, ev:%04Xd, rev:%04Xd", - fd, event_list[i].events, revents); - - if (revents & (POLLERR|POLLHUP|POLLNVAL)) { - ngx_log_debug3(NGX_LOG_DEBUG_EVENT, cycle->log, 0, - "ioctl(DP_POLL) error fd:%d ev:%04Xd rev:%04Xd", - fd, event_list[i].events, revents); - } - - if (revents & ~(POLLIN|POLLOUT|POLLERR|POLLHUP|POLLNVAL)) { - ngx_log_error(NGX_LOG_ALERT, cycle->log, 0, - "strange ioctl(DP_POLL) events " - "fd:%d ev:%04Xd rev:%04Xd", - fd, event_list[i].events, revents); - } - - if (revents & (POLLERR|POLLHUP|POLLNVAL)) { - - /* - * if the error events were returned, add POLLIN and POLLOUT - * to handle the events at least in one active handler - */ - - revents |= POLLIN|POLLOUT; - } - - rev = c->read; - - if ((revents & POLLIN) && rev->active) { - rev->ready = 1; - rev->available = -1; - - if (flags & NGX_POST_EVENTS) { - queue = rev->accept ? &ngx_posted_accept_events - : &ngx_posted_events; - - ngx_post_event(rev, queue); - - } else { - instance = rev->instance; - - rev->handler(rev); - - if (c->fd == -1 || rev->instance != instance) { - continue; - } - } - } - - wev = c->write; - - if ((revents & POLLOUT) && wev->active) { - wev->ready = 1; - - if (flags & NGX_POST_EVENTS) { - ngx_post_event(wev, &ngx_posted_events); - - } else { - wev->handler(wev); - } - } - } - - return NGX_OK; -} - - -static void * -ngx_devpoll_create_conf(ngx_cycle_t *cycle) -{ - ngx_devpoll_conf_t *dpcf; - - dpcf = ngx_palloc(cycle->pool, sizeof(ngx_devpoll_conf_t)); - if (dpcf == NULL) { - return NULL; - } - - dpcf->changes = NGX_CONF_UNSET; - dpcf->events = NGX_CONF_UNSET; - - return dpcf; -} - - -static char * -ngx_devpoll_init_conf(ngx_cycle_t *cycle, void *conf) -{ - ngx_devpoll_conf_t *dpcf = conf; - - ngx_conf_init_uint_value(dpcf->changes, 32); - ngx_conf_init_uint_value(dpcf->events, 32); - - return NGX_CONF_OK; -} diff --git a/src/deps/src/nginx-1.30.3/src/event/modules/ngx_epoll_module.c b/src/deps/src/nginx-1.30.3/src/event/modules/ngx_epoll_module.c deleted file mode 100644 index 98e3ce7c82..0000000000 --- a/src/deps/src/nginx-1.30.3/src/event/modules/ngx_epoll_module.c +++ /dev/null @@ -1,1051 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#include -#include -#include - - -#if (NGX_TEST_BUILD_EPOLL) - -/* epoll declarations */ - -#define EPOLLIN 0x001 -#define EPOLLPRI 0x002 -#define EPOLLOUT 0x004 -#define EPOLLERR 0x008 -#define EPOLLHUP 0x010 -#define EPOLLRDNORM 0x040 -#define EPOLLRDBAND 0x080 -#define EPOLLWRNORM 0x100 -#define EPOLLWRBAND 0x200 -#define EPOLLMSG 0x400 - -#define EPOLLRDHUP 0x2000 - -#define EPOLLEXCLUSIVE 0x10000000 -#define EPOLLONESHOT 0x40000000 -#define EPOLLET 0x80000000 - -#define EPOLL_CTL_ADD 1 -#define EPOLL_CTL_DEL 2 -#define EPOLL_CTL_MOD 3 - -typedef union epoll_data { - void *ptr; - int fd; - uint32_t u32; - uint64_t u64; -} epoll_data_t; - -struct epoll_event { - uint32_t events; - epoll_data_t data; -}; - - -int epoll_create(int size); - -int epoll_create(int size) -{ - return -1; -} - - -int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event); - -int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event) -{ - return -1; -} - - -int epoll_wait(int epfd, struct epoll_event *events, int nevents, int timeout); - -int epoll_wait(int epfd, struct epoll_event *events, int nevents, int timeout) -{ - return -1; -} - -#if (NGX_HAVE_EVENTFD) -#define SYS_eventfd 323 -#endif - -#if (NGX_HAVE_FILE_AIO) - -#define SYS_io_setup 245 -#define SYS_io_destroy 246 -#define SYS_io_getevents 247 - -typedef u_int aio_context_t; - -struct io_event { - uint64_t data; /* the data field from the iocb */ - uint64_t obj; /* what iocb this event came from */ - int64_t res; /* result code for this event */ - int64_t res2; /* secondary result */ -}; - - -#endif -#endif /* NGX_TEST_BUILD_EPOLL */ - - -typedef struct { - ngx_uint_t events; - ngx_uint_t aio_requests; -} ngx_epoll_conf_t; - - -static ngx_int_t ngx_epoll_init(ngx_cycle_t *cycle, ngx_msec_t timer); -#if (NGX_HAVE_EVENTFD) -static ngx_int_t ngx_epoll_notify_init(ngx_log_t *log); -static void ngx_epoll_notify_handler(ngx_event_t *ev); -#endif -#if (NGX_HAVE_EPOLLRDHUP) -static void ngx_epoll_test_rdhup(ngx_cycle_t *cycle); -#endif -static void ngx_epoll_done(ngx_cycle_t *cycle); -static ngx_int_t ngx_epoll_add_event(ngx_event_t *ev, ngx_int_t event, - ngx_uint_t flags); -static ngx_int_t ngx_epoll_del_event(ngx_event_t *ev, ngx_int_t event, - ngx_uint_t flags); -static ngx_int_t ngx_epoll_add_connection(ngx_connection_t *c); -static ngx_int_t ngx_epoll_del_connection(ngx_connection_t *c, - ngx_uint_t flags); -#if (NGX_HAVE_EVENTFD) -static ngx_int_t ngx_epoll_notify(ngx_event_handler_pt handler); -#endif -static ngx_int_t ngx_epoll_process_events(ngx_cycle_t *cycle, ngx_msec_t timer, - ngx_uint_t flags); - -#if (NGX_HAVE_FILE_AIO) -static void ngx_epoll_eventfd_handler(ngx_event_t *ev); -#endif - -static void *ngx_epoll_create_conf(ngx_cycle_t *cycle); -static char *ngx_epoll_init_conf(ngx_cycle_t *cycle, void *conf); - -static int ep = -1; -static struct epoll_event *event_list; -static ngx_uint_t nevents; - -#if (NGX_HAVE_EVENTFD) -static int notify_fd = -1; -static ngx_event_t notify_event; -static ngx_connection_t notify_conn; -#endif - -#if (NGX_HAVE_FILE_AIO) - -int ngx_eventfd = -1; -aio_context_t ngx_aio_ctx = 0; - -static ngx_event_t ngx_eventfd_event; -static ngx_connection_t ngx_eventfd_conn; - -#endif - -#if (NGX_HAVE_EPOLLRDHUP) -ngx_uint_t ngx_use_epoll_rdhup; -#endif - -static ngx_str_t epoll_name = ngx_string("epoll"); - -static ngx_command_t ngx_epoll_commands[] = { - - { ngx_string("epoll_events"), - NGX_EVENT_CONF|NGX_CONF_TAKE1, - ngx_conf_set_num_slot, - 0, - offsetof(ngx_epoll_conf_t, events), - NULL }, - - { ngx_string("worker_aio_requests"), - NGX_EVENT_CONF|NGX_CONF_TAKE1, - ngx_conf_set_num_slot, - 0, - offsetof(ngx_epoll_conf_t, aio_requests), - NULL }, - - ngx_null_command -}; - - -static ngx_event_module_t ngx_epoll_module_ctx = { - &epoll_name, - ngx_epoll_create_conf, /* create configuration */ - ngx_epoll_init_conf, /* init configuration */ - - { - ngx_epoll_add_event, /* add an event */ - ngx_epoll_del_event, /* delete an event */ - ngx_epoll_add_event, /* enable an event */ - ngx_epoll_del_event, /* disable an event */ - ngx_epoll_add_connection, /* add an connection */ - ngx_epoll_del_connection, /* delete an connection */ -#if (NGX_HAVE_EVENTFD) - ngx_epoll_notify, /* trigger a notify */ -#else - NULL, /* trigger a notify */ -#endif - ngx_epoll_process_events, /* process the events */ - ngx_epoll_init, /* init the events */ - ngx_epoll_done, /* done the events */ - } -}; - -ngx_module_t ngx_epoll_module = { - NGX_MODULE_V1, - &ngx_epoll_module_ctx, /* module context */ - ngx_epoll_commands, /* module directives */ - NGX_EVENT_MODULE, /* module type */ - NULL, /* init master */ - NULL, /* init module */ - NULL, /* init process */ - NULL, /* init thread */ - NULL, /* exit thread */ - NULL, /* exit process */ - NULL, /* exit master */ - NGX_MODULE_V1_PADDING -}; - - -#if (NGX_HAVE_FILE_AIO) - -/* - * We call io_setup(), io_destroy() io_submit(), and io_getevents() directly - * as syscalls instead of libaio usage, because the library header file - * supports eventfd() since 0.3.107 version only. - */ - -static int -io_setup(u_int nr_reqs, aio_context_t *ctx) -{ - return syscall(SYS_io_setup, nr_reqs, ctx); -} - - -static int -io_destroy(aio_context_t ctx) -{ - return syscall(SYS_io_destroy, ctx); -} - - -static int -io_getevents(aio_context_t ctx, long min_nr, long nr, struct io_event *events, - struct timespec *tmo) -{ - return syscall(SYS_io_getevents, ctx, min_nr, nr, events, tmo); -} - - -static void -ngx_epoll_aio_init(ngx_cycle_t *cycle, ngx_epoll_conf_t *epcf) -{ - int n; - struct epoll_event ee; - -#if (NGX_HAVE_SYS_EVENTFD_H) - ngx_eventfd = eventfd(0, 0); -#else - ngx_eventfd = syscall(SYS_eventfd, 0); -#endif - - if (ngx_eventfd == -1) { - ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno, - "eventfd() failed"); - ngx_file_aio = 0; - return; - } - - ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0, - "eventfd: %d", ngx_eventfd); - - n = 1; - - if (ioctl(ngx_eventfd, FIONBIO, &n) == -1) { - ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno, - "ioctl(eventfd, FIONBIO) failed"); - goto failed; - } - - if (io_setup(epcf->aio_requests, &ngx_aio_ctx) == -1) { - ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno, - "io_setup() failed"); - goto failed; - } - - ngx_eventfd_event.data = &ngx_eventfd_conn; - ngx_eventfd_event.handler = ngx_epoll_eventfd_handler; - ngx_eventfd_event.log = cycle->log; - ngx_eventfd_event.active = 1; - ngx_eventfd_conn.fd = ngx_eventfd; - ngx_eventfd_conn.read = &ngx_eventfd_event; - ngx_eventfd_conn.log = cycle->log; - - ee.events = EPOLLIN|EPOLLET; - ee.data.ptr = &ngx_eventfd_conn; - - if (epoll_ctl(ep, EPOLL_CTL_ADD, ngx_eventfd, &ee) != -1) { - return; - } - - ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno, - "epoll_ctl(EPOLL_CTL_ADD, eventfd) failed"); - - if (io_destroy(ngx_aio_ctx) == -1) { - ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno, - "io_destroy() failed"); - } - -failed: - - if (close(ngx_eventfd) == -1) { - ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno, - "eventfd close() failed"); - } - - ngx_eventfd = -1; - ngx_aio_ctx = 0; - ngx_file_aio = 0; -} - -#endif - - -static ngx_int_t -ngx_epoll_init(ngx_cycle_t *cycle, ngx_msec_t timer) -{ - ngx_epoll_conf_t *epcf; - - epcf = ngx_event_get_conf(cycle->conf_ctx, ngx_epoll_module); - - if (ep == -1) { - ep = epoll_create(cycle->connection_n / 2); - - if (ep == -1) { - ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno, - "epoll_create() failed"); - return NGX_ERROR; - } - -#if (NGX_HAVE_EVENTFD) - if (ngx_epoll_notify_init(cycle->log) != NGX_OK) { - ngx_epoll_module_ctx.actions.notify = NULL; - } -#endif - -#if (NGX_HAVE_FILE_AIO) - ngx_epoll_aio_init(cycle, epcf); -#endif - -#if (NGX_HAVE_EPOLLRDHUP) - ngx_epoll_test_rdhup(cycle); -#endif - } - - if (nevents < epcf->events) { - if (event_list) { - ngx_free(event_list); - } - - event_list = ngx_alloc(sizeof(struct epoll_event) * epcf->events, - cycle->log); - if (event_list == NULL) { - return NGX_ERROR; - } - } - - nevents = epcf->events; - - ngx_io = ngx_os_io; - - ngx_event_actions = ngx_epoll_module_ctx.actions; - -#if (NGX_HAVE_CLEAR_EVENT) - ngx_event_flags = NGX_USE_CLEAR_EVENT -#else - ngx_event_flags = NGX_USE_LEVEL_EVENT -#endif - |NGX_USE_GREEDY_EVENT - |NGX_USE_EPOLL_EVENT; - - return NGX_OK; -} - - -#if (NGX_HAVE_EVENTFD) - -static ngx_int_t -ngx_epoll_notify_init(ngx_log_t *log) -{ - struct epoll_event ee; - -#if (NGX_HAVE_SYS_EVENTFD_H) - notify_fd = eventfd(0, 0); -#else - notify_fd = syscall(SYS_eventfd, 0); -#endif - - if (notify_fd == -1) { - ngx_log_error(NGX_LOG_EMERG, log, ngx_errno, "eventfd() failed"); - return NGX_ERROR; - } - - ngx_log_debug1(NGX_LOG_DEBUG_EVENT, log, 0, - "notify eventfd: %d", notify_fd); - - notify_event.handler = ngx_epoll_notify_handler; - notify_event.log = log; - notify_event.active = 1; - - notify_conn.fd = notify_fd; - notify_conn.read = ¬ify_event; - notify_conn.log = log; - - ee.events = EPOLLIN|EPOLLET; - ee.data.ptr = ¬ify_conn; - - if (epoll_ctl(ep, EPOLL_CTL_ADD, notify_fd, &ee) == -1) { - ngx_log_error(NGX_LOG_EMERG, log, ngx_errno, - "epoll_ctl(EPOLL_CTL_ADD, eventfd) failed"); - - if (close(notify_fd) == -1) { - ngx_log_error(NGX_LOG_ALERT, log, ngx_errno, - "eventfd close() failed"); - } - - return NGX_ERROR; - } - - return NGX_OK; -} - - -static void -ngx_epoll_notify_handler(ngx_event_t *ev) -{ - ssize_t n; - uint64_t count; - ngx_err_t err; - ngx_event_handler_pt handler; - - if (++ev->index == NGX_MAX_UINT32_VALUE) { - ev->index = 0; - - n = read(notify_fd, &count, sizeof(uint64_t)); - - err = ngx_errno; - - ngx_log_debug3(NGX_LOG_DEBUG_EVENT, ev->log, 0, - "read() eventfd %d: %z count:%uL", notify_fd, n, count); - - if ((size_t) n != sizeof(uint64_t)) { - ngx_log_error(NGX_LOG_ALERT, ev->log, err, - "read() eventfd %d failed", notify_fd); - } - } - - handler = ev->data; - handler(ev); -} - -#endif - - -#if (NGX_HAVE_EPOLLRDHUP) - -static void -ngx_epoll_test_rdhup(ngx_cycle_t *cycle) -{ - int s[2], events; - struct epoll_event ee; - - if (socketpair(AF_UNIX, SOCK_STREAM, 0, s) == -1) { - ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno, - "socketpair() failed"); - return; - } - - ee.events = EPOLLET|EPOLLIN|EPOLLRDHUP; - - if (epoll_ctl(ep, EPOLL_CTL_ADD, s[0], &ee) == -1) { - ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno, - "epoll_ctl() failed"); - goto failed; - } - - if (close(s[1]) == -1) { - ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno, - "close() failed"); - s[1] = -1; - goto failed; - } - - s[1] = -1; - - events = epoll_wait(ep, &ee, 1, 5000); - - if (events == -1) { - ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno, - "epoll_wait() failed"); - goto failed; - } - - if (events) { - ngx_use_epoll_rdhup = ee.events & EPOLLRDHUP; - - } else { - ngx_log_error(NGX_LOG_ALERT, cycle->log, NGX_ETIMEDOUT, - "epoll_wait() timed out"); - } - - ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0, - "testing the EPOLLRDHUP flag: %s", - ngx_use_epoll_rdhup ? "success" : "fail"); - -failed: - - if (s[1] != -1 && close(s[1]) == -1) { - ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno, - "close() failed"); - } - - if (close(s[0]) == -1) { - ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno, - "close() failed"); - } -} - -#endif - - -static void -ngx_epoll_done(ngx_cycle_t *cycle) -{ - if (close(ep) == -1) { - ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno, - "epoll close() failed"); - } - - ep = -1; - -#if (NGX_HAVE_EVENTFD) - - if (close(notify_fd) == -1) { - ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno, - "eventfd close() failed"); - } - - notify_fd = -1; - -#endif - -#if (NGX_HAVE_FILE_AIO) - - if (ngx_eventfd != -1) { - - if (io_destroy(ngx_aio_ctx) == -1) { - ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno, - "io_destroy() failed"); - } - - if (close(ngx_eventfd) == -1) { - ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno, - "eventfd close() failed"); - } - - ngx_eventfd = -1; - } - - ngx_aio_ctx = 0; - -#endif - - ngx_free(event_list); - - event_list = NULL; - nevents = 0; -} - - -static ngx_int_t -ngx_epoll_add_event(ngx_event_t *ev, ngx_int_t event, ngx_uint_t flags) -{ - int op; - uint32_t events, prev; - ngx_event_t *e; - ngx_connection_t *c; - struct epoll_event ee; - - c = ev->data; - - events = (uint32_t) event; - - if (event == NGX_READ_EVENT) { - e = c->write; - prev = EPOLLOUT; -#if (NGX_READ_EVENT != EPOLLIN|EPOLLRDHUP) - events = EPOLLIN|EPOLLRDHUP; -#endif - - } else { - e = c->read; - prev = EPOLLIN|EPOLLRDHUP; -#if (NGX_WRITE_EVENT != EPOLLOUT) - events = EPOLLOUT; -#endif - } - - if (e->active) { - op = EPOLL_CTL_MOD; - events |= prev; - - } else { - op = EPOLL_CTL_ADD; - } - -#if (NGX_HAVE_EPOLLEXCLUSIVE && NGX_HAVE_EPOLLRDHUP) - if (flags & NGX_EXCLUSIVE_EVENT) { - events &= ~EPOLLRDHUP; - } -#endif - - ee.events = events | (uint32_t) flags; - ee.data.ptr = (void *) ((uintptr_t) c | ev->instance); - - ngx_log_debug3(NGX_LOG_DEBUG_EVENT, ev->log, 0, - "epoll add event: fd:%d op:%d ev:%08XD", - c->fd, op, ee.events); - - if (epoll_ctl(ep, op, c->fd, &ee) == -1) { - ngx_log_error(NGX_LOG_ALERT, ev->log, ngx_errno, - "epoll_ctl(%d, %d) failed", op, c->fd); - return NGX_ERROR; - } - - ev->active = 1; -#if 0 - ev->oneshot = (flags & NGX_ONESHOT_EVENT) ? 1 : 0; -#endif - - return NGX_OK; -} - - -static ngx_int_t -ngx_epoll_del_event(ngx_event_t *ev, ngx_int_t event, ngx_uint_t flags) -{ - int op; - uint32_t prev; - ngx_event_t *e; - ngx_connection_t *c; - struct epoll_event ee; - - /* - * when the file descriptor is closed, the epoll automatically deletes - * it from its queue, so we do not need to delete explicitly the event - * before the closing the file descriptor - */ - - if (flags & NGX_CLOSE_EVENT) { - ev->active = 0; - return NGX_OK; - } - - c = ev->data; - - if (event == NGX_READ_EVENT) { - e = c->write; - prev = EPOLLOUT; - - } else { - e = c->read; - prev = EPOLLIN|EPOLLRDHUP; - } - - if (e->active) { - op = EPOLL_CTL_MOD; - ee.events = prev | (uint32_t) flags; - ee.data.ptr = (void *) ((uintptr_t) c | ev->instance); - - } else { - op = EPOLL_CTL_DEL; - ee.events = 0; - ee.data.ptr = NULL; - } - - ngx_log_debug3(NGX_LOG_DEBUG_EVENT, ev->log, 0, - "epoll del event: fd:%d op:%d ev:%08XD", - c->fd, op, ee.events); - - if (epoll_ctl(ep, op, c->fd, &ee) == -1) { - ngx_log_error(NGX_LOG_ALERT, ev->log, ngx_errno, - "epoll_ctl(%d, %d) failed", op, c->fd); - return NGX_ERROR; - } - - ev->active = 0; - - return NGX_OK; -} - - -static ngx_int_t -ngx_epoll_add_connection(ngx_connection_t *c) -{ - struct epoll_event ee; - - ee.events = EPOLLIN|EPOLLOUT|EPOLLET|EPOLLRDHUP; - ee.data.ptr = (void *) ((uintptr_t) c | c->read->instance); - - ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0, - "epoll add connection: fd:%d ev:%08XD", c->fd, ee.events); - - if (epoll_ctl(ep, EPOLL_CTL_ADD, c->fd, &ee) == -1) { - ngx_log_error(NGX_LOG_ALERT, c->log, ngx_errno, - "epoll_ctl(EPOLL_CTL_ADD, %d) failed", c->fd); - return NGX_ERROR; - } - - c->read->active = 1; - c->write->active = 1; - - return NGX_OK; -} - - -static ngx_int_t -ngx_epoll_del_connection(ngx_connection_t *c, ngx_uint_t flags) -{ - int op; - struct epoll_event ee; - - /* - * when the file descriptor is closed the epoll automatically deletes - * it from its queue so we do not need to delete explicitly the event - * before the closing the file descriptor - */ - - if (flags & NGX_CLOSE_EVENT) { - c->read->active = 0; - c->write->active = 0; - return NGX_OK; - } - - ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, - "epoll del connection: fd:%d", c->fd); - - op = EPOLL_CTL_DEL; - ee.events = 0; - ee.data.ptr = NULL; - - if (epoll_ctl(ep, op, c->fd, &ee) == -1) { - ngx_log_error(NGX_LOG_ALERT, c->log, ngx_errno, - "epoll_ctl(%d, %d) failed", op, c->fd); - return NGX_ERROR; - } - - c->read->active = 0; - c->write->active = 0; - - return NGX_OK; -} - - -#if (NGX_HAVE_EVENTFD) - -static ngx_int_t -ngx_epoll_notify(ngx_event_handler_pt handler) -{ - static uint64_t inc = 1; - - notify_event.data = handler; - - if ((size_t) write(notify_fd, &inc, sizeof(uint64_t)) != sizeof(uint64_t)) { - ngx_log_error(NGX_LOG_ALERT, notify_event.log, ngx_errno, - "write() to eventfd %d failed", notify_fd); - return NGX_ERROR; - } - - return NGX_OK; -} - -#endif - - -static ngx_int_t -ngx_epoll_process_events(ngx_cycle_t *cycle, ngx_msec_t timer, ngx_uint_t flags) -{ - int events; - uint32_t revents; - ngx_int_t instance, i; - ngx_uint_t level; - ngx_err_t err; - ngx_event_t *rev, *wev; - ngx_queue_t *queue; - ngx_connection_t *c; - - /* NGX_TIMER_INFINITE == INFTIM */ - - ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0, - "epoll timer: %M", timer); - - events = epoll_wait(ep, event_list, (int) nevents, timer); - - err = (events == -1) ? ngx_errno : 0; - - if (flags & NGX_UPDATE_TIME || ngx_event_timer_alarm) { - ngx_time_update(); - } - - if (err) { - if (err == NGX_EINTR) { - - if (ngx_event_timer_alarm) { - ngx_event_timer_alarm = 0; - return NGX_OK; - } - - level = NGX_LOG_INFO; - - } else { - level = NGX_LOG_ALERT; - } - - ngx_log_error(level, cycle->log, err, "epoll_wait() failed"); - return NGX_ERROR; - } - - if (events == 0) { - if (timer != NGX_TIMER_INFINITE) { - return NGX_OK; - } - - ngx_log_error(NGX_LOG_ALERT, cycle->log, 0, - "epoll_wait() returned no events without timeout"); - return NGX_ERROR; - } - - for (i = 0; i < events; i++) { - c = event_list[i].data.ptr; - - instance = (uintptr_t) c & 1; - c = (ngx_connection_t *) ((uintptr_t) c & (uintptr_t) ~1); - - rev = c->read; - - if (c->fd == -1 || rev->instance != instance) { - - /* - * the stale event from a file descriptor - * that was just closed in this iteration - */ - - ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0, - "epoll: stale event %p", c); - continue; - } - - revents = event_list[i].events; - - ngx_log_debug3(NGX_LOG_DEBUG_EVENT, cycle->log, 0, - "epoll: fd:%d ev:%04XD d:%p", - c->fd, revents, event_list[i].data.ptr); - - if (revents & (EPOLLERR|EPOLLHUP)) { - ngx_log_debug2(NGX_LOG_DEBUG_EVENT, cycle->log, 0, - "epoll_wait() error on fd:%d ev:%04XD", - c->fd, revents); - - /* - * if the error events were returned, add EPOLLIN and EPOLLOUT - * to handle the events at least in one active handler - */ - - revents |= EPOLLIN|EPOLLOUT; - } - -#if 0 - if (revents & ~(EPOLLIN|EPOLLOUT|EPOLLERR|EPOLLHUP)) { - ngx_log_error(NGX_LOG_ALERT, cycle->log, 0, - "strange epoll_wait() events fd:%d ev:%04XD", - c->fd, revents); - } -#endif - - if ((revents & EPOLLIN) && rev->active) { - -#if (NGX_HAVE_EPOLLRDHUP) - if (revents & EPOLLRDHUP) { - rev->pending_eof = 1; - } -#endif - - rev->ready = 1; - rev->available = -1; - - if (flags & NGX_POST_EVENTS) { - queue = rev->accept ? &ngx_posted_accept_events - : &ngx_posted_events; - - ngx_post_event(rev, queue); - - } else { - rev->handler(rev); - } - } - - wev = c->write; - - if ((revents & EPOLLOUT) && wev->active) { - - if (c->fd == -1 || wev->instance != instance) { - - /* - * the stale event from a file descriptor - * that was just closed in this iteration - */ - - ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0, - "epoll: stale event %p", c); - continue; - } - - wev->ready = 1; -#if (NGX_THREADS) - wev->complete = 1; -#endif - - if (flags & NGX_POST_EVENTS) { - ngx_post_event(wev, &ngx_posted_events); - - } else { - wev->handler(wev); - } - } - } - - return NGX_OK; -} - - -#if (NGX_HAVE_FILE_AIO) - -static void -ngx_epoll_eventfd_handler(ngx_event_t *ev) -{ - int n, events; - long i; - uint64_t ready; - ngx_err_t err; - ngx_event_t *e; - ngx_event_aio_t *aio; - struct io_event event[64]; - struct timespec ts; - - ngx_log_debug0(NGX_LOG_DEBUG_EVENT, ev->log, 0, "eventfd handler"); - - n = read(ngx_eventfd, &ready, 8); - - err = ngx_errno; - - ngx_log_debug1(NGX_LOG_DEBUG_EVENT, ev->log, 0, "eventfd: %d", n); - - if (n != 8) { - if (n == -1) { - if (err == NGX_EAGAIN) { - return; - } - - ngx_log_error(NGX_LOG_ALERT, ev->log, err, "read(eventfd) failed"); - return; - } - - ngx_log_error(NGX_LOG_ALERT, ev->log, 0, - "read(eventfd) returned only %d bytes", n); - return; - } - - ts.tv_sec = 0; - ts.tv_nsec = 0; - - while (ready) { - - events = io_getevents(ngx_aio_ctx, 1, 64, event, &ts); - - ngx_log_debug1(NGX_LOG_DEBUG_EVENT, ev->log, 0, - "io_getevents: %d", events); - - if (events > 0) { - ready -= events; - - for (i = 0; i < events; i++) { - - ngx_log_debug4(NGX_LOG_DEBUG_EVENT, ev->log, 0, - "io_event: %XL %XL %L %L", - event[i].data, event[i].obj, - event[i].res, event[i].res2); - - e = (ngx_event_t *) (uintptr_t) event[i].data; - - e->complete = 1; - e->active = 0; - e->ready = 1; - - aio = e->data; - aio->res = event[i].res; - - ngx_post_event(e, &ngx_posted_events); - } - - continue; - } - - if (events == 0) { - return; - } - - /* events == -1 */ - ngx_log_error(NGX_LOG_ALERT, ev->log, ngx_errno, - "io_getevents() failed"); - return; - } -} - -#endif - - -static void * -ngx_epoll_create_conf(ngx_cycle_t *cycle) -{ - ngx_epoll_conf_t *epcf; - - epcf = ngx_palloc(cycle->pool, sizeof(ngx_epoll_conf_t)); - if (epcf == NULL) { - return NULL; - } - - epcf->events = NGX_CONF_UNSET; - epcf->aio_requests = NGX_CONF_UNSET; - - return epcf; -} - - -static char * -ngx_epoll_init_conf(ngx_cycle_t *cycle, void *conf) -{ - ngx_epoll_conf_t *epcf = conf; - - ngx_conf_init_uint_value(epcf->events, 512); - ngx_conf_init_uint_value(epcf->aio_requests, 32); - - return NGX_CONF_OK; -} diff --git a/src/deps/src/nginx-1.30.3/src/event/modules/ngx_eventport_module.c b/src/deps/src/nginx-1.30.3/src/event/modules/ngx_eventport_module.c deleted file mode 100644 index d304e1c910..0000000000 --- a/src/deps/src/nginx-1.30.3/src/event/modules/ngx_eventport_module.c +++ /dev/null @@ -1,650 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#include -#include -#include - - -#if (NGX_TEST_BUILD_EVENTPORT) - -#define ushort_t u_short -#define uint_t u_int - -#ifndef CLOCK_REALTIME -#define CLOCK_REALTIME 0 -typedef int clockid_t; -typedef void * timer_t; -#elif (NGX_DARWIN) -typedef void * timer_t; -#endif - -/* Solaris declarations */ - -#define PORT_SOURCE_AIO 1 -#define PORT_SOURCE_TIMER 2 -#define PORT_SOURCE_USER 3 -#define PORT_SOURCE_FD 4 -#define PORT_SOURCE_ALERT 5 -#define PORT_SOURCE_MQ 6 - -#ifndef ETIME -#define ETIME 64 -#endif - -#define SIGEV_PORT 4 - -typedef struct { - int portev_events; /* event data is source specific */ - ushort_t portev_source; /* event source */ - ushort_t portev_pad; /* port internal use */ - uintptr_t portev_object; /* source specific object */ - void *portev_user; /* user cookie */ -} port_event_t; - -typedef struct port_notify { - int portnfy_port; /* bind request(s) to port */ - void *portnfy_user; /* user defined */ -} port_notify_t; - -#if (__FreeBSD__ && __FreeBSD_version < 700005) || (NGX_DARWIN) - -typedef struct itimerspec { /* definition per POSIX.4 */ - struct timespec it_interval;/* timer period */ - struct timespec it_value; /* timer expiration */ -} itimerspec_t; - -#endif - -int port_create(void); - -int port_create(void) -{ - return -1; -} - - -int port_associate(int port, int source, uintptr_t object, int events, - void *user); - -int port_associate(int port, int source, uintptr_t object, int events, - void *user) -{ - return -1; -} - - -int port_dissociate(int port, int source, uintptr_t object); - -int port_dissociate(int port, int source, uintptr_t object) -{ - return -1; -} - - -int port_getn(int port, port_event_t list[], uint_t max, uint_t *nget, - struct timespec *timeout); - -int port_getn(int port, port_event_t list[], uint_t max, uint_t *nget, - struct timespec *timeout) -{ - return -1; -} - -int port_send(int port, int events, void *user); - -int port_send(int port, int events, void *user) -{ - return -1; -} - - -int timer_create(clockid_t clock_id, struct sigevent *evp, timer_t *timerid); - -int timer_create(clockid_t clock_id, struct sigevent *evp, timer_t *timerid) -{ - return -1; -} - - -int timer_settime(timer_t timerid, int flags, const struct itimerspec *value, - struct itimerspec *ovalue); - -int timer_settime(timer_t timerid, int flags, const struct itimerspec *value, - struct itimerspec *ovalue) -{ - return -1; -} - - -int timer_delete(timer_t timerid); - -int timer_delete(timer_t timerid) -{ - return -1; -} - -#endif - - -typedef struct { - ngx_uint_t events; -} ngx_eventport_conf_t; - - -static ngx_int_t ngx_eventport_init(ngx_cycle_t *cycle, ngx_msec_t timer); -static void ngx_eventport_done(ngx_cycle_t *cycle); -static ngx_int_t ngx_eventport_add_event(ngx_event_t *ev, ngx_int_t event, - ngx_uint_t flags); -static ngx_int_t ngx_eventport_del_event(ngx_event_t *ev, ngx_int_t event, - ngx_uint_t flags); -static ngx_int_t ngx_eventport_notify(ngx_event_handler_pt handler); -static ngx_int_t ngx_eventport_process_events(ngx_cycle_t *cycle, - ngx_msec_t timer, ngx_uint_t flags); - -static void *ngx_eventport_create_conf(ngx_cycle_t *cycle); -static char *ngx_eventport_init_conf(ngx_cycle_t *cycle, void *conf); - -static int ep = -1; -static port_event_t *event_list; -static ngx_uint_t nevents; -static timer_t event_timer = (timer_t) -1; -static ngx_event_t notify_event; - -static ngx_str_t eventport_name = ngx_string("eventport"); - - -static ngx_command_t ngx_eventport_commands[] = { - - { ngx_string("eventport_events"), - NGX_EVENT_CONF|NGX_CONF_TAKE1, - ngx_conf_set_num_slot, - 0, - offsetof(ngx_eventport_conf_t, events), - NULL }, - - ngx_null_command -}; - - -static ngx_event_module_t ngx_eventport_module_ctx = { - &eventport_name, - ngx_eventport_create_conf, /* create configuration */ - ngx_eventport_init_conf, /* init configuration */ - - { - ngx_eventport_add_event, /* add an event */ - ngx_eventport_del_event, /* delete an event */ - ngx_eventport_add_event, /* enable an event */ - ngx_eventport_del_event, /* disable an event */ - NULL, /* add an connection */ - NULL, /* delete an connection */ - ngx_eventport_notify, /* trigger a notify */ - ngx_eventport_process_events, /* process the events */ - ngx_eventport_init, /* init the events */ - ngx_eventport_done, /* done the events */ - } - -}; - -ngx_module_t ngx_eventport_module = { - NGX_MODULE_V1, - &ngx_eventport_module_ctx, /* module context */ - ngx_eventport_commands, /* module directives */ - NGX_EVENT_MODULE, /* module type */ - NULL, /* init master */ - NULL, /* init module */ - NULL, /* init process */ - NULL, /* init thread */ - NULL, /* exit thread */ - NULL, /* exit process */ - NULL, /* exit master */ - NGX_MODULE_V1_PADDING -}; - - -static ngx_int_t -ngx_eventport_init(ngx_cycle_t *cycle, ngx_msec_t timer) -{ - port_notify_t pn; - struct itimerspec its; - struct sigevent sev; - ngx_eventport_conf_t *epcf; - - epcf = ngx_event_get_conf(cycle->conf_ctx, ngx_eventport_module); - - if (ep == -1) { - ep = port_create(); - - if (ep == -1) { - ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno, - "port_create() failed"); - return NGX_ERROR; - } - - notify_event.active = 1; - notify_event.log = cycle->log; - } - - if (nevents < epcf->events) { - if (event_list) { - ngx_free(event_list); - } - - event_list = ngx_alloc(sizeof(port_event_t) * epcf->events, - cycle->log); - if (event_list == NULL) { - return NGX_ERROR; - } - } - - ngx_event_flags = NGX_USE_EVENTPORT_EVENT; - - if (timer) { - ngx_memzero(&pn, sizeof(port_notify_t)); - pn.portnfy_port = ep; - - ngx_memzero(&sev, sizeof(struct sigevent)); - sev.sigev_notify = SIGEV_PORT; - sev.sigev_value.sival_ptr = &pn; - - if (timer_create(CLOCK_REALTIME, &sev, &event_timer) == -1) { - ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno, - "timer_create() failed"); - return NGX_ERROR; - } - - its.it_interval.tv_sec = timer / 1000; - its.it_interval.tv_nsec = (timer % 1000) * 1000000; - its.it_value.tv_sec = timer / 1000; - its.it_value.tv_nsec = (timer % 1000) * 1000000; - - if (timer_settime(event_timer, 0, &its, NULL) == -1) { - ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno, - "timer_settime() failed"); - return NGX_ERROR; - } - - ngx_event_flags |= NGX_USE_TIMER_EVENT; - } - - nevents = epcf->events; - - ngx_io = ngx_os_io; - - ngx_event_actions = ngx_eventport_module_ctx.actions; - - return NGX_OK; -} - - -static void -ngx_eventport_done(ngx_cycle_t *cycle) -{ - if (event_timer != (timer_t) -1) { - if (timer_delete(event_timer) == -1) { - ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno, - "timer_delete() failed"); - } - - event_timer = (timer_t) -1; - } - - if (close(ep) == -1) { - ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno, - "close() event port failed"); - } - - ep = -1; - - ngx_free(event_list); - - event_list = NULL; - nevents = 0; -} - - -static ngx_int_t -ngx_eventport_add_event(ngx_event_t *ev, ngx_int_t event, ngx_uint_t flags) -{ - ngx_int_t events, prev; - ngx_event_t *e; - ngx_connection_t *c; - - c = ev->data; - - events = event; - - if (event == NGX_READ_EVENT) { - e = c->write; - prev = POLLOUT; -#if (NGX_READ_EVENT != POLLIN) - events = POLLIN; -#endif - - } else { - e = c->read; - prev = POLLIN; -#if (NGX_WRITE_EVENT != POLLOUT) - events = POLLOUT; -#endif - } - - if (e->oneshot) { - events |= prev; - } - - ngx_log_debug2(NGX_LOG_DEBUG_EVENT, ev->log, 0, - "eventport add event: fd:%d ev:%04Xi", c->fd, events); - - if (port_associate(ep, PORT_SOURCE_FD, c->fd, events, - (void *) ((uintptr_t) ev | ev->instance)) - == -1) - { - ngx_log_error(NGX_LOG_ALERT, ev->log, ngx_errno, - "port_associate() failed"); - return NGX_ERROR; - } - - ev->active = 1; - ev->oneshot = 1; - - return NGX_OK; -} - - -static ngx_int_t -ngx_eventport_del_event(ngx_event_t *ev, ngx_int_t event, ngx_uint_t flags) -{ - ngx_event_t *e; - ngx_connection_t *c; - - /* - * when the file descriptor is closed, the event port automatically - * dissociates it from the port, so we do not need to dissociate explicitly - * the event before the closing the file descriptor - */ - - if (flags & NGX_CLOSE_EVENT) { - ev->active = 0; - ev->oneshot = 0; - return NGX_OK; - } - - c = ev->data; - - if (event == NGX_READ_EVENT) { - e = c->write; - event = POLLOUT; - - } else { - e = c->read; - event = POLLIN; - } - - if (e->oneshot) { - ngx_log_debug2(NGX_LOG_DEBUG_EVENT, ev->log, 0, - "eventport change event: fd:%d ev:%04Xi", c->fd, event); - - if (port_associate(ep, PORT_SOURCE_FD, c->fd, event, - (void *) ((uintptr_t) ev | ev->instance)) - == -1) - { - ngx_log_error(NGX_LOG_ALERT, ev->log, ngx_errno, - "port_associate() failed"); - return NGX_ERROR; - } - - } else if (ev->active) { - ngx_log_debug1(NGX_LOG_DEBUG_EVENT, ev->log, 0, - "eventport del event: fd:%d", c->fd); - - if (port_dissociate(ep, PORT_SOURCE_FD, c->fd) == -1) { - ngx_log_error(NGX_LOG_ALERT, ev->log, ngx_errno, - "port_dissociate() failed"); - return NGX_ERROR; - } - } - - ev->active = 0; - ev->oneshot = 0; - - return NGX_OK; -} - - -static ngx_int_t -ngx_eventport_notify(ngx_event_handler_pt handler) -{ - notify_event.handler = handler; - - if (port_send(ep, 0, ¬ify_event) != 0) { - ngx_log_error(NGX_LOG_ALERT, notify_event.log, ngx_errno, - "port_send() failed"); - return NGX_ERROR; - } - - return NGX_OK; -} - - -static ngx_int_t -ngx_eventport_process_events(ngx_cycle_t *cycle, ngx_msec_t timer, - ngx_uint_t flags) -{ - int n, revents; - u_int events; - ngx_err_t err; - ngx_int_t instance; - ngx_uint_t i, level; - ngx_event_t *ev, *rev, *wev; - ngx_queue_t *queue; - ngx_connection_t *c; - struct timespec ts, *tp; - - if (timer == NGX_TIMER_INFINITE) { - tp = NULL; - - } else { - ts.tv_sec = timer / 1000; - ts.tv_nsec = (timer % 1000) * 1000000; - tp = &ts; - } - - ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0, - "eventport timer: %M", timer); - - events = 1; - - n = port_getn(ep, event_list, (u_int) nevents, &events, tp); - - err = ngx_errno; - - if (flags & NGX_UPDATE_TIME) { - ngx_time_update(); - } - - if (n == -1) { - if (err == ETIME) { - if (timer != NGX_TIMER_INFINITE) { - return NGX_OK; - } - - ngx_log_error(NGX_LOG_ALERT, cycle->log, 0, - "port_getn() returned no events without timeout"); - return NGX_ERROR; - } - - level = (err == NGX_EINTR) ? NGX_LOG_INFO : NGX_LOG_ALERT; - ngx_log_error(level, cycle->log, err, "port_getn() failed"); - return NGX_ERROR; - } - - if (events == 0) { - if (timer != NGX_TIMER_INFINITE) { - return NGX_OK; - } - - ngx_log_error(NGX_LOG_ALERT, cycle->log, 0, - "port_getn() returned no events without timeout"); - return NGX_ERROR; - } - - for (i = 0; i < events; i++) { - - if (event_list[i].portev_source == PORT_SOURCE_TIMER) { - ngx_time_update(); - continue; - } - - ev = event_list[i].portev_user; - - switch (event_list[i].portev_source) { - - case PORT_SOURCE_FD: - - instance = (uintptr_t) ev & 1; - ev = (ngx_event_t *) ((uintptr_t) ev & (uintptr_t) ~1); - - if (ev->closed || ev->instance != instance) { - - /* - * the stale event from a file descriptor - * that was just closed in this iteration - */ - - ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0, - "eventport: stale event %p", ev); - continue; - } - - revents = event_list[i].portev_events; - - ngx_log_debug2(NGX_LOG_DEBUG_EVENT, cycle->log, 0, - "eventport: fd:%d, ev:%04Xd", - (int) event_list[i].portev_object, revents); - - if (revents & (POLLERR|POLLHUP|POLLNVAL)) { - ngx_log_debug2(NGX_LOG_DEBUG_EVENT, cycle->log, 0, - "port_getn() error fd:%d ev:%04Xd", - (int) event_list[i].portev_object, revents); - } - - if (revents & ~(POLLIN|POLLOUT|POLLERR|POLLHUP|POLLNVAL)) { - ngx_log_error(NGX_LOG_ALERT, cycle->log, 0, - "strange port_getn() events fd:%d ev:%04Xd", - (int) event_list[i].portev_object, revents); - } - - if (revents & (POLLERR|POLLHUP|POLLNVAL)) { - - /* - * if the error events were returned, add POLLIN and POLLOUT - * to handle the events at least in one active handler - */ - - revents |= POLLIN|POLLOUT; - } - - c = ev->data; - rev = c->read; - wev = c->write; - - rev->active = 0; - wev->active = 0; - - if (revents & POLLIN) { - rev->ready = 1; - rev->available = -1; - - if (flags & NGX_POST_EVENTS) { - queue = rev->accept ? &ngx_posted_accept_events - : &ngx_posted_events; - - ngx_post_event(rev, queue); - - } else { - rev->handler(rev); - - if (ev->closed || ev->instance != instance) { - continue; - } - } - - if (rev->accept) { - if (ngx_use_accept_mutex) { - ngx_accept_events = 1; - continue; - } - - if (port_associate(ep, PORT_SOURCE_FD, c->fd, POLLIN, - (void *) ((uintptr_t) ev | ev->instance)) - == -1) - { - ngx_log_error(NGX_LOG_ALERT, ev->log, ngx_errno, - "port_associate() failed"); - return NGX_ERROR; - } - } - } - - if (revents & POLLOUT) { - wev->ready = 1; - - if (flags & NGX_POST_EVENTS) { - ngx_post_event(wev, &ngx_posted_events); - - } else { - wev->handler(wev); - } - } - - continue; - - case PORT_SOURCE_USER: - - ev->handler(ev); - - continue; - - default: - ngx_log_error(NGX_LOG_ALERT, cycle->log, 0, - "unexpected eventport object %d", - (int) event_list[i].portev_object); - continue; - } - } - - return NGX_OK; -} - - -static void * -ngx_eventport_create_conf(ngx_cycle_t *cycle) -{ - ngx_eventport_conf_t *epcf; - - epcf = ngx_palloc(cycle->pool, sizeof(ngx_eventport_conf_t)); - if (epcf == NULL) { - return NULL; - } - - epcf->events = NGX_CONF_UNSET; - - return epcf; -} - - -static char * -ngx_eventport_init_conf(ngx_cycle_t *cycle, void *conf) -{ - ngx_eventport_conf_t *epcf = conf; - - ngx_conf_init_uint_value(epcf->events, 32); - - return NGX_CONF_OK; -} diff --git a/src/deps/src/nginx-1.30.3/src/event/modules/ngx_iocp_module.c b/src/deps/src/nginx-1.30.3/src/event/modules/ngx_iocp_module.c deleted file mode 100644 index dca5cedff4..0000000000 --- a/src/deps/src/nginx-1.30.3/src/event/modules/ngx_iocp_module.c +++ /dev/null @@ -1,379 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#include -#include -#include -#include - - -static ngx_int_t ngx_iocp_init(ngx_cycle_t *cycle, ngx_msec_t timer); -static ngx_thread_value_t __stdcall ngx_iocp_timer(void *data); -static void ngx_iocp_done(ngx_cycle_t *cycle); -static ngx_int_t ngx_iocp_add_event(ngx_event_t *ev, ngx_int_t event, - ngx_uint_t key); -static ngx_int_t ngx_iocp_del_connection(ngx_connection_t *c, ngx_uint_t flags); -static ngx_int_t ngx_iocp_process_events(ngx_cycle_t *cycle, ngx_msec_t timer, - ngx_uint_t flags); -static void *ngx_iocp_create_conf(ngx_cycle_t *cycle); -static char *ngx_iocp_init_conf(ngx_cycle_t *cycle, void *conf); - - -static ngx_str_t iocp_name = ngx_string("iocp"); - -static ngx_command_t ngx_iocp_commands[] = { - - { ngx_string("iocp_threads"), - NGX_EVENT_CONF|NGX_CONF_TAKE1, - ngx_conf_set_num_slot, - 0, - offsetof(ngx_iocp_conf_t, threads), - NULL }, - - { ngx_string("post_acceptex"), - NGX_EVENT_CONF|NGX_CONF_TAKE1, - ngx_conf_set_num_slot, - 0, - offsetof(ngx_iocp_conf_t, post_acceptex), - NULL }, - - { ngx_string("acceptex_read"), - NGX_EVENT_CONF|NGX_CONF_FLAG, - ngx_conf_set_flag_slot, - 0, - offsetof(ngx_iocp_conf_t, acceptex_read), - NULL }, - - ngx_null_command -}; - - -static ngx_event_module_t ngx_iocp_module_ctx = { - &iocp_name, - ngx_iocp_create_conf, /* create configuration */ - ngx_iocp_init_conf, /* init configuration */ - - { - ngx_iocp_add_event, /* add an event */ - NULL, /* delete an event */ - NULL, /* enable an event */ - NULL, /* disable an event */ - NULL, /* add an connection */ - ngx_iocp_del_connection, /* delete an connection */ - NULL, /* trigger a notify */ - ngx_iocp_process_events, /* process the events */ - ngx_iocp_init, /* init the events */ - ngx_iocp_done /* done the events */ - } - -}; - -ngx_module_t ngx_iocp_module = { - NGX_MODULE_V1, - &ngx_iocp_module_ctx, /* module context */ - ngx_iocp_commands, /* module directives */ - NGX_EVENT_MODULE, /* module type */ - NULL, /* init master */ - NULL, /* init module */ - NULL, /* init process */ - NULL, /* init thread */ - NULL, /* exit thread */ - NULL, /* exit process */ - NULL, /* exit master */ - NGX_MODULE_V1_PADDING -}; - - -ngx_os_io_t ngx_iocp_io = { - ngx_overlapped_wsarecv, - NULL, - ngx_udp_overlapped_wsarecv, - NULL, - NULL, - NULL, - ngx_overlapped_wsasend_chain, - 0 -}; - - -static HANDLE iocp; -static ngx_tid_t timer_thread; -static ngx_msec_t msec; - - -static ngx_int_t -ngx_iocp_init(ngx_cycle_t *cycle, ngx_msec_t timer) -{ - ngx_iocp_conf_t *cf; - - cf = ngx_event_get_conf(cycle->conf_ctx, ngx_iocp_module); - - if (iocp == NULL) { - iocp = CreateIoCompletionPort(INVALID_HANDLE_VALUE, NULL, 0, - cf->threads); - } - - if (iocp == NULL) { - ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno, - "CreateIoCompletionPort() failed"); - return NGX_ERROR; - } - - ngx_io = ngx_iocp_io; - - ngx_event_actions = ngx_iocp_module_ctx.actions; - - ngx_event_flags = NGX_USE_IOCP_EVENT; - - if (timer == 0) { - return NGX_OK; - } - - /* - * The waitable timer could not be used, because - * GetQueuedCompletionStatus() does not set a thread to alertable state - */ - - if (timer_thread == NULL) { - - msec = timer; - - if (ngx_create_thread(&timer_thread, ngx_iocp_timer, &msec, cycle->log) - != 0) - { - return NGX_ERROR; - } - } - - ngx_event_flags |= NGX_USE_TIMER_EVENT; - - return NGX_OK; -} - - -static ngx_thread_value_t __stdcall -ngx_iocp_timer(void *data) -{ - ngx_msec_t timer = *(ngx_msec_t *) data; - - ngx_log_debug2(NGX_LOG_DEBUG_EVENT, ngx_cycle->log, 0, - "THREAD %p %p", &msec, data); - - for ( ;; ) { - Sleep(timer); - - ngx_time_update(); -#if 1 - ngx_log_debug0(NGX_LOG_DEBUG_EVENT, ngx_cycle->log, 0, "timer"); -#endif - } - -#if defined(__WATCOMC__) || defined(__GNUC__) - return 0; -#endif -} - - -static void -ngx_iocp_done(ngx_cycle_t *cycle) -{ - if (CloseHandle(iocp) == -1) { - ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno, - "iocp CloseHandle() failed"); - } - - iocp = NULL; -} - - -static ngx_int_t -ngx_iocp_add_event(ngx_event_t *ev, ngx_int_t event, ngx_uint_t key) -{ - ngx_connection_t *c; - - c = (ngx_connection_t *) ev->data; - - c->read->active = 1; - c->write->active = 1; - - ngx_log_debug3(NGX_LOG_DEBUG_EVENT, ev->log, 0, - "iocp add: fd:%d k:%ui ov:%p", c->fd, key, &ev->ovlp); - - if (CreateIoCompletionPort((HANDLE) c->fd, iocp, key, 0) == NULL) { - ngx_log_error(NGX_LOG_ALERT, c->log, ngx_errno, - "CreateIoCompletionPort() failed"); - return NGX_ERROR; - } - - return NGX_OK; -} - - -static ngx_int_t -ngx_iocp_del_connection(ngx_connection_t *c, ngx_uint_t flags) -{ -#if 0 - if (flags & NGX_CLOSE_EVENT) { - return NGX_OK; - } - - if (CancelIo((HANDLE) c->fd) == 0) { - ngx_log_error(NGX_LOG_ALERT, c->log, ngx_errno, "CancelIo() failed"); - return NGX_ERROR; - } -#endif - - return NGX_OK; -} - - -static ngx_int_t -ngx_iocp_process_events(ngx_cycle_t *cycle, ngx_msec_t timer, ngx_uint_t flags) -{ - int rc; - u_int key; - u_long bytes; - ngx_err_t err; - ngx_msec_t delta; - ngx_event_t *ev; - ngx_event_ovlp_t *ovlp; - - if (timer == NGX_TIMER_INFINITE) { - timer = INFINITE; - } - - ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0, "iocp timer: %M", timer); - - rc = GetQueuedCompletionStatus(iocp, &bytes, (PULONG_PTR) &key, - (LPOVERLAPPED *) &ovlp, (u_long) timer); - - if (rc == 0) { - err = ngx_errno; - } else { - err = 0; - } - - delta = ngx_current_msec; - - if (flags & NGX_UPDATE_TIME) { - ngx_time_update(); - } - - ngx_log_debug4(NGX_LOG_DEBUG_EVENT, cycle->log, 0, - "iocp: %d b:%d k:%d ov:%p", rc, bytes, key, ovlp); - - if (timer != INFINITE) { - delta = ngx_current_msec - delta; - - ngx_log_debug2(NGX_LOG_DEBUG_EVENT, cycle->log, 0, - "iocp timer: %M, delta: %M", timer, delta); - } - - if (err) { - if (ovlp == NULL) { - if (err != WAIT_TIMEOUT) { - ngx_log_error(NGX_LOG_ALERT, cycle->log, err, - "GetQueuedCompletionStatus() failed"); - - return NGX_ERROR; - } - - return NGX_OK; - } - - ovlp->error = err; - } - - if (ovlp == NULL) { - ngx_log_error(NGX_LOG_ALERT, cycle->log, 0, - "GetQueuedCompletionStatus() returned no operation"); - return NGX_ERROR; - } - - - ev = ovlp->event; - - ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, err, "iocp event:%p", ev); - - - if (err == ERROR_NETNAME_DELETED /* the socket was closed */ - || err == ERROR_OPERATION_ABORTED /* the operation was canceled */) - { - - /* - * the WSA_OPERATION_ABORTED completion notification - * for a file descriptor that was closed - */ - - ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, err, - "iocp: aborted event %p", ev); - - return NGX_OK; - } - - if (err) { - ngx_log_error(NGX_LOG_ALERT, cycle->log, err, - "GetQueuedCompletionStatus() returned operation error"); - } - - switch (key) { - - case NGX_IOCP_ACCEPT: - if (bytes) { - ev->ready = 1; - } - break; - - case NGX_IOCP_IO: - ev->complete = 1; - ev->ready = 1; - break; - - case NGX_IOCP_CONNECT: - ev->ready = 1; - } - - ev->available = bytes; - - ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0, - "iocp event handler: %p", ev->handler); - - ev->handler(ev); - - return NGX_OK; -} - - -static void * -ngx_iocp_create_conf(ngx_cycle_t *cycle) -{ - ngx_iocp_conf_t *cf; - - cf = ngx_palloc(cycle->pool, sizeof(ngx_iocp_conf_t)); - if (cf == NULL) { - return NULL; - } - - cf->threads = NGX_CONF_UNSET; - cf->post_acceptex = NGX_CONF_UNSET; - cf->acceptex_read = NGX_CONF_UNSET; - - return cf; -} - - -static char * -ngx_iocp_init_conf(ngx_cycle_t *cycle, void *conf) -{ - ngx_iocp_conf_t *cf = conf; - - ngx_conf_init_value(cf->threads, 0); - ngx_conf_init_value(cf->post_acceptex, 10); - ngx_conf_init_value(cf->acceptex_read, 1); - - return NGX_CONF_OK; -} diff --git a/src/deps/src/nginx-1.30.3/src/event/modules/ngx_iocp_module.h b/src/deps/src/nginx-1.30.3/src/event/modules/ngx_iocp_module.h deleted file mode 100644 index dc73983409..0000000000 --- a/src/deps/src/nginx-1.30.3/src/event/modules/ngx_iocp_module.h +++ /dev/null @@ -1,22 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#ifndef _NGX_IOCP_MODULE_H_INCLUDED_ -#define _NGX_IOCP_MODULE_H_INCLUDED_ - - -typedef struct { - int threads; - int post_acceptex; - int acceptex_read; -} ngx_iocp_conf_t; - - -extern ngx_module_t ngx_iocp_module; - - -#endif /* _NGX_IOCP_MODULE_H_INCLUDED_ */ diff --git a/src/deps/src/nginx-1.30.3/src/event/modules/ngx_kqueue_module.c b/src/deps/src/nginx-1.30.3/src/event/modules/ngx_kqueue_module.c deleted file mode 100644 index 0c905eff3d..0000000000 --- a/src/deps/src/nginx-1.30.3/src/event/modules/ngx_kqueue_module.c +++ /dev/null @@ -1,731 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#include -#include -#include - - -/* NetBSD up to 10.0 incompatibly defines kevent.udata as "intptr_t" */ - -#if (__NetBSD__ && __NetBSD_Version__ < 1000000000) -#define NGX_KQUEUE_UDATA_T -#else -#define NGX_KQUEUE_UDATA_T (void *) -#endif - - -typedef struct { - ngx_uint_t changes; - ngx_uint_t events; -} ngx_kqueue_conf_t; - - -static ngx_int_t ngx_kqueue_init(ngx_cycle_t *cycle, ngx_msec_t timer); -#ifdef EVFILT_USER -static ngx_int_t ngx_kqueue_notify_init(ngx_log_t *log); -#endif -static void ngx_kqueue_done(ngx_cycle_t *cycle); -static ngx_int_t ngx_kqueue_add_event(ngx_event_t *ev, ngx_int_t event, - ngx_uint_t flags); -static ngx_int_t ngx_kqueue_del_event(ngx_event_t *ev, ngx_int_t event, - ngx_uint_t flags); -static ngx_int_t ngx_kqueue_set_event(ngx_event_t *ev, ngx_int_t filter, - ngx_uint_t flags); -#ifdef EVFILT_USER -static ngx_int_t ngx_kqueue_notify(ngx_event_handler_pt handler); -#endif -static ngx_int_t ngx_kqueue_process_events(ngx_cycle_t *cycle, ngx_msec_t timer, - ngx_uint_t flags); -static ngx_inline void ngx_kqueue_dump_event(ngx_log_t *log, - struct kevent *kev); - -static void *ngx_kqueue_create_conf(ngx_cycle_t *cycle); -static char *ngx_kqueue_init_conf(ngx_cycle_t *cycle, void *conf); - - -int ngx_kqueue = -1; - -static struct kevent *change_list; -static struct kevent *event_list; -static ngx_uint_t max_changes, nchanges, nevents; - -#ifdef EVFILT_USER -static ngx_event_t notify_event; -static struct kevent notify_kev; -#endif - - -static ngx_str_t kqueue_name = ngx_string("kqueue"); - -static ngx_command_t ngx_kqueue_commands[] = { - - { ngx_string("kqueue_changes"), - NGX_EVENT_CONF|NGX_CONF_TAKE1, - ngx_conf_set_num_slot, - 0, - offsetof(ngx_kqueue_conf_t, changes), - NULL }, - - { ngx_string("kqueue_events"), - NGX_EVENT_CONF|NGX_CONF_TAKE1, - ngx_conf_set_num_slot, - 0, - offsetof(ngx_kqueue_conf_t, events), - NULL }, - - ngx_null_command -}; - - -static ngx_event_module_t ngx_kqueue_module_ctx = { - &kqueue_name, - ngx_kqueue_create_conf, /* create configuration */ - ngx_kqueue_init_conf, /* init configuration */ - - { - ngx_kqueue_add_event, /* add an event */ - ngx_kqueue_del_event, /* delete an event */ - ngx_kqueue_add_event, /* enable an event */ - ngx_kqueue_del_event, /* disable an event */ - NULL, /* add an connection */ - NULL, /* delete an connection */ -#ifdef EVFILT_USER - ngx_kqueue_notify, /* trigger a notify */ -#else - NULL, /* trigger a notify */ -#endif - ngx_kqueue_process_events, /* process the events */ - ngx_kqueue_init, /* init the events */ - ngx_kqueue_done /* done the events */ - } - -}; - -ngx_module_t ngx_kqueue_module = { - NGX_MODULE_V1, - &ngx_kqueue_module_ctx, /* module context */ - ngx_kqueue_commands, /* module directives */ - NGX_EVENT_MODULE, /* module type */ - NULL, /* init master */ - NULL, /* init module */ - NULL, /* init process */ - NULL, /* init thread */ - NULL, /* exit thread */ - NULL, /* exit process */ - NULL, /* exit master */ - NGX_MODULE_V1_PADDING -}; - - -static ngx_int_t -ngx_kqueue_init(ngx_cycle_t *cycle, ngx_msec_t timer) -{ - ngx_kqueue_conf_t *kcf; - struct timespec ts; -#if (NGX_HAVE_TIMER_EVENT) - struct kevent kev; -#endif - - kcf = ngx_event_get_conf(cycle->conf_ctx, ngx_kqueue_module); - - if (ngx_kqueue == -1) { - ngx_kqueue = kqueue(); - - if (ngx_kqueue == -1) { - ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno, - "kqueue() failed"); - return NGX_ERROR; - } - -#ifdef EVFILT_USER - if (ngx_kqueue_notify_init(cycle->log) != NGX_OK) { - return NGX_ERROR; - } -#endif - } - - if (max_changes < kcf->changes) { - if (nchanges) { - ts.tv_sec = 0; - ts.tv_nsec = 0; - - if (kevent(ngx_kqueue, change_list, (int) nchanges, NULL, 0, &ts) - == -1) - { - ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno, - "kevent() failed"); - return NGX_ERROR; - } - nchanges = 0; - } - - if (change_list) { - ngx_free(change_list); - } - - change_list = ngx_alloc(kcf->changes * sizeof(struct kevent), - cycle->log); - if (change_list == NULL) { - return NGX_ERROR; - } - } - - max_changes = kcf->changes; - - if (nevents < kcf->events) { - if (event_list) { - ngx_free(event_list); - } - - event_list = ngx_alloc(kcf->events * sizeof(struct kevent), cycle->log); - if (event_list == NULL) { - return NGX_ERROR; - } - } - - ngx_event_flags = NGX_USE_ONESHOT_EVENT - |NGX_USE_KQUEUE_EVENT - |NGX_USE_VNODE_EVENT; - -#if (NGX_HAVE_TIMER_EVENT) - - if (timer) { - kev.ident = 0; - kev.filter = EVFILT_TIMER; - kev.flags = EV_ADD|EV_ENABLE; - kev.fflags = 0; - kev.data = timer; - kev.udata = NGX_KQUEUE_UDATA_T (uintptr_t) 0; - - ts.tv_sec = 0; - ts.tv_nsec = 0; - - if (kevent(ngx_kqueue, &kev, 1, NULL, 0, &ts) == -1) { - ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno, - "kevent(EVFILT_TIMER) failed"); - return NGX_ERROR; - } - - ngx_event_flags |= NGX_USE_TIMER_EVENT; - } - -#endif - -#if (NGX_HAVE_CLEAR_EVENT) - ngx_event_flags |= NGX_USE_CLEAR_EVENT; -#else - ngx_event_flags |= NGX_USE_LEVEL_EVENT; -#endif - -#if (NGX_HAVE_LOWAT_EVENT) - ngx_event_flags |= NGX_USE_LOWAT_EVENT; -#endif - - nevents = kcf->events; - - ngx_io = ngx_os_io; - - ngx_event_actions = ngx_kqueue_module_ctx.actions; - - return NGX_OK; -} - - -#ifdef EVFILT_USER - -static ngx_int_t -ngx_kqueue_notify_init(ngx_log_t *log) -{ - notify_kev.ident = 0; - notify_kev.filter = EVFILT_USER; - notify_kev.data = 0; - notify_kev.flags = EV_ADD|EV_CLEAR; - notify_kev.fflags = 0; - notify_kev.udata = NGX_KQUEUE_UDATA_T (uintptr_t) 0; - - if (kevent(ngx_kqueue, ¬ify_kev, 1, NULL, 0, NULL) == -1) { - ngx_log_error(NGX_LOG_ALERT, log, ngx_errno, - "kevent(EVFILT_USER, EV_ADD) failed"); - return NGX_ERROR; - } - - notify_event.active = 1; - notify_event.log = log; - - notify_kev.flags = 0; - notify_kev.fflags = NOTE_TRIGGER; - notify_kev.udata = NGX_KQUEUE_UDATA_T ((uintptr_t) ¬ify_event); - - return NGX_OK; -} - -#endif - - -static void -ngx_kqueue_done(ngx_cycle_t *cycle) -{ - if (close(ngx_kqueue) == -1) { - ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno, - "kqueue close() failed"); - } - - ngx_kqueue = -1; - - ngx_free(change_list); - ngx_free(event_list); - - change_list = NULL; - event_list = NULL; - max_changes = 0; - nchanges = 0; - nevents = 0; -} - - -static ngx_int_t -ngx_kqueue_add_event(ngx_event_t *ev, ngx_int_t event, ngx_uint_t flags) -{ - ngx_int_t rc; -#if 0 - ngx_event_t *e; - ngx_connection_t *c; -#endif - - ev->active = 1; - ev->disabled = 0; - ev->oneshot = (flags & NGX_ONESHOT_EVENT) ? 1 : 0; - -#if 0 - - if (ev->index < nchanges - && ((uintptr_t) change_list[ev->index].udata & (uintptr_t) ~1) - == (uintptr_t) ev) - { - if (change_list[ev->index].flags == EV_DISABLE) { - - /* - * if the EV_DISABLE is still not passed to a kernel - * we will not pass it - */ - - ngx_log_debug2(NGX_LOG_DEBUG_EVENT, ev->log, 0, - "kevent activated: %d: ft:%i", - ngx_event_ident(ev->data), event); - - if (ev->index < --nchanges) { - e = (ngx_event_t *) - ((uintptr_t) change_list[nchanges].udata & (uintptr_t) ~1); - change_list[ev->index] = change_list[nchanges]; - e->index = ev->index; - } - - return NGX_OK; - } - - c = ev->data; - - ngx_log_error(NGX_LOG_ALERT, ev->log, 0, - "previous event on #%d were not passed in kernel", c->fd); - - return NGX_ERROR; - } - -#endif - - rc = ngx_kqueue_set_event(ev, event, EV_ADD|EV_ENABLE|flags); - - return rc; -} - - -static ngx_int_t -ngx_kqueue_del_event(ngx_event_t *ev, ngx_int_t event, ngx_uint_t flags) -{ - ngx_int_t rc; - ngx_event_t *e; - - ev->active = 0; - ev->disabled = 0; - - if (ev->index < nchanges - && ((uintptr_t) change_list[ev->index].udata & (uintptr_t) ~1) - == (uintptr_t) ev) - { - ngx_log_debug2(NGX_LOG_DEBUG_EVENT, ev->log, 0, - "kevent deleted: %d: ft:%i", - ngx_event_ident(ev->data), event); - - /* if the event is still not passed to a kernel we will not pass it */ - - nchanges--; - - if (ev->index < nchanges) { - e = (ngx_event_t *) - ((uintptr_t) change_list[nchanges].udata & (uintptr_t) ~1); - change_list[ev->index] = change_list[nchanges]; - e->index = ev->index; - } - - return NGX_OK; - } - - /* - * when the file descriptor is closed the kqueue automatically deletes - * its filters so we do not need to delete explicitly the event - * before the closing the file descriptor. - */ - - if (flags & NGX_CLOSE_EVENT) { - return NGX_OK; - } - - if (flags & NGX_DISABLE_EVENT) { - ev->disabled = 1; - - } else { - flags |= EV_DELETE; - } - - rc = ngx_kqueue_set_event(ev, event, flags); - - return rc; -} - - -static ngx_int_t -ngx_kqueue_set_event(ngx_event_t *ev, ngx_int_t filter, ngx_uint_t flags) -{ - struct kevent *kev; - struct timespec ts; - ngx_connection_t *c; - - c = ev->data; - - ngx_log_debug3(NGX_LOG_DEBUG_EVENT, ev->log, 0, - "kevent set event: %d: ft:%i fl:%04Xi", - c->fd, filter, flags); - - if (nchanges >= max_changes) { - ngx_log_error(NGX_LOG_WARN, ev->log, 0, - "kqueue change list is filled up"); - - ts.tv_sec = 0; - ts.tv_nsec = 0; - - if (kevent(ngx_kqueue, change_list, (int) nchanges, NULL, 0, &ts) - == -1) - { - ngx_log_error(NGX_LOG_ALERT, ev->log, ngx_errno, "kevent() failed"); - return NGX_ERROR; - } - - nchanges = 0; - } - - kev = &change_list[nchanges]; - - kev->ident = c->fd; - kev->filter = (short) filter; - kev->flags = (u_short) flags; - kev->udata = NGX_KQUEUE_UDATA_T ((uintptr_t) ev | ev->instance); - - if (filter == EVFILT_VNODE) { - kev->fflags = NOTE_DELETE|NOTE_WRITE|NOTE_EXTEND - |NOTE_ATTRIB|NOTE_RENAME -#if (__FreeBSD__ == 4 && __FreeBSD_version >= 430000) \ - || __FreeBSD_version >= 500018 - |NOTE_REVOKE -#endif - ; - kev->data = 0; - - } else { -#if (NGX_HAVE_LOWAT_EVENT) - if (flags & NGX_LOWAT_EVENT) { - kev->fflags = NOTE_LOWAT; - kev->data = ev->available; - - } else { - kev->fflags = 0; - kev->data = 0; - } -#else - kev->fflags = 0; - kev->data = 0; -#endif - } - - ev->index = nchanges; - nchanges++; - - if (flags & NGX_FLUSH_EVENT) { - ts.tv_sec = 0; - ts.tv_nsec = 0; - - ngx_log_debug0(NGX_LOG_DEBUG_EVENT, ev->log, 0, "kevent flush"); - - if (kevent(ngx_kqueue, change_list, (int) nchanges, NULL, 0, &ts) - == -1) - { - ngx_log_error(NGX_LOG_ALERT, ev->log, ngx_errno, "kevent() failed"); - return NGX_ERROR; - } - - nchanges = 0; - } - - return NGX_OK; -} - - -#ifdef EVFILT_USER - -static ngx_int_t -ngx_kqueue_notify(ngx_event_handler_pt handler) -{ - notify_event.handler = handler; - - if (kevent(ngx_kqueue, ¬ify_kev, 1, NULL, 0, NULL) == -1) { - ngx_log_error(NGX_LOG_ALERT, notify_event.log, ngx_errno, - "kevent(EVFILT_USER, NOTE_TRIGGER) failed"); - return NGX_ERROR; - } - - return NGX_OK; -} - -#endif - - -static ngx_int_t -ngx_kqueue_process_events(ngx_cycle_t *cycle, ngx_msec_t timer, - ngx_uint_t flags) -{ - int events, n; - ngx_int_t i, instance; - ngx_uint_t level; - ngx_err_t err; - ngx_event_t *ev; - ngx_queue_t *queue; - struct timespec ts, *tp; - - n = (int) nchanges; - nchanges = 0; - - if (timer == NGX_TIMER_INFINITE) { - tp = NULL; - - } else { - - ts.tv_sec = timer / 1000; - ts.tv_nsec = (timer % 1000) * 1000000; - - /* - * 64-bit Darwin kernel has the bug: kernel level ts.tv_nsec is - * the int32_t while user level ts.tv_nsec is the long (64-bit), - * so on the big endian PowerPC all nanoseconds are lost. - */ - -#if (NGX_DARWIN_KEVENT_BUG) - ts.tv_nsec <<= 32; -#endif - - tp = &ts; - } - - ngx_log_debug2(NGX_LOG_DEBUG_EVENT, cycle->log, 0, - "kevent timer: %M, changes: %d", timer, n); - - events = kevent(ngx_kqueue, change_list, n, event_list, (int) nevents, tp); - - err = (events == -1) ? ngx_errno : 0; - - if (flags & NGX_UPDATE_TIME || ngx_event_timer_alarm) { - ngx_time_update(); - } - - ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0, - "kevent events: %d", events); - - if (err) { - if (err == NGX_EINTR) { - - if (ngx_event_timer_alarm) { - ngx_event_timer_alarm = 0; - return NGX_OK; - } - - level = NGX_LOG_INFO; - - } else { - level = NGX_LOG_ALERT; - } - - ngx_log_error(level, cycle->log, err, "kevent() failed"); - return NGX_ERROR; - } - - if (events == 0) { - if (timer != NGX_TIMER_INFINITE) { - return NGX_OK; - } - - ngx_log_error(NGX_LOG_ALERT, cycle->log, 0, - "kevent() returned no events without timeout"); - return NGX_ERROR; - } - - for (i = 0; i < events; i++) { - - ngx_kqueue_dump_event(cycle->log, &event_list[i]); - - if (event_list[i].flags & EV_ERROR) { - ngx_log_error(NGX_LOG_ALERT, cycle->log, event_list[i].data, - "kevent() error on %d filter:%d flags:%04Xd", - (int) event_list[i].ident, event_list[i].filter, - event_list[i].flags); - continue; - } - -#if (NGX_HAVE_TIMER_EVENT) - - if (event_list[i].filter == EVFILT_TIMER) { - ngx_time_update(); - continue; - } - -#endif - - ev = (ngx_event_t *) event_list[i].udata; - - switch (event_list[i].filter) { - - case EVFILT_READ: - case EVFILT_WRITE: - - instance = (uintptr_t) ev & 1; - ev = (ngx_event_t *) ((uintptr_t) ev & (uintptr_t) ~1); - - if (ev->closed || ev->instance != instance) { - - /* - * the stale event from a file descriptor - * that was just closed in this iteration - */ - - ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0, - "kevent: stale event %p", ev); - continue; - } - - if (ev->log && (ev->log->log_level & NGX_LOG_DEBUG_CONNECTION)) { - ngx_kqueue_dump_event(ev->log, &event_list[i]); - } - - if (ev->oneshot) { - ev->active = 0; - } - - ev->available = event_list[i].data; - - if (event_list[i].flags & EV_EOF) { - ev->pending_eof = 1; - ev->kq_errno = event_list[i].fflags; - } - - ev->ready = 1; - - break; - - case EVFILT_VNODE: - ev->kq_vnode = 1; - - break; - - case EVFILT_AIO: - ev->complete = 1; - ev->ready = 1; - - break; - -#ifdef EVFILT_USER - case EVFILT_USER: - break; -#endif - - default: - ngx_log_error(NGX_LOG_ALERT, cycle->log, 0, - "unexpected kevent() filter %d", - event_list[i].filter); - continue; - } - - if (flags & NGX_POST_EVENTS) { - queue = ev->accept ? &ngx_posted_accept_events - : &ngx_posted_events; - - ngx_post_event(ev, queue); - - continue; - } - - ev->handler(ev); - } - - return NGX_OK; -} - - -static ngx_inline void -ngx_kqueue_dump_event(ngx_log_t *log, struct kevent *kev) -{ - if (kev->ident > 0x8000000 && kev->ident != (unsigned) -1) { - ngx_log_debug6(NGX_LOG_DEBUG_EVENT, log, 0, - "kevent: %p: ft:%d fl:%04Xd ff:%08Xd d:%d ud:%p", - (void *) kev->ident, kev->filter, - kev->flags, kev->fflags, - (int) kev->data, kev->udata); - - } else { - ngx_log_debug6(NGX_LOG_DEBUG_EVENT, log, 0, - "kevent: %d: ft:%d fl:%04Xd ff:%08Xd d:%d ud:%p", - (int) kev->ident, kev->filter, - kev->flags, kev->fflags, - (int) kev->data, kev->udata); - } -} - - -static void * -ngx_kqueue_create_conf(ngx_cycle_t *cycle) -{ - ngx_kqueue_conf_t *kcf; - - kcf = ngx_palloc(cycle->pool, sizeof(ngx_kqueue_conf_t)); - if (kcf == NULL) { - return NULL; - } - - kcf->changes = NGX_CONF_UNSET; - kcf->events = NGX_CONF_UNSET; - - return kcf; -} - - -static char * -ngx_kqueue_init_conf(ngx_cycle_t *cycle, void *conf) -{ - ngx_kqueue_conf_t *kcf = conf; - - ngx_conf_init_uint_value(kcf->changes, 512); - ngx_conf_init_uint_value(kcf->events, 512); - - return NGX_CONF_OK; -} diff --git a/src/deps/src/nginx-1.30.3/src/event/modules/ngx_poll_module.c b/src/deps/src/nginx-1.30.3/src/event/modules/ngx_poll_module.c deleted file mode 100644 index c16f0242e4..0000000000 --- a/src/deps/src/nginx-1.30.3/src/event/modules/ngx_poll_module.c +++ /dev/null @@ -1,416 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#include -#include -#include - - -static ngx_int_t ngx_poll_init(ngx_cycle_t *cycle, ngx_msec_t timer); -static void ngx_poll_done(ngx_cycle_t *cycle); -static ngx_int_t ngx_poll_add_event(ngx_event_t *ev, ngx_int_t event, - ngx_uint_t flags); -static ngx_int_t ngx_poll_del_event(ngx_event_t *ev, ngx_int_t event, - ngx_uint_t flags); -static ngx_int_t ngx_poll_process_events(ngx_cycle_t *cycle, ngx_msec_t timer, - ngx_uint_t flags); -static char *ngx_poll_init_conf(ngx_cycle_t *cycle, void *conf); - - -static struct pollfd *event_list; -static ngx_uint_t nevents; - - -static ngx_str_t poll_name = ngx_string("poll"); - -static ngx_event_module_t ngx_poll_module_ctx = { - &poll_name, - NULL, /* create configuration */ - ngx_poll_init_conf, /* init configuration */ - - { - ngx_poll_add_event, /* add an event */ - ngx_poll_del_event, /* delete an event */ - ngx_poll_add_event, /* enable an event */ - ngx_poll_del_event, /* disable an event */ - NULL, /* add an connection */ - NULL, /* delete an connection */ - NULL, /* trigger a notify */ - ngx_poll_process_events, /* process the events */ - ngx_poll_init, /* init the events */ - ngx_poll_done /* done the events */ - } - -}; - -ngx_module_t ngx_poll_module = { - NGX_MODULE_V1, - &ngx_poll_module_ctx, /* module context */ - NULL, /* module directives */ - NGX_EVENT_MODULE, /* module type */ - NULL, /* init master */ - NULL, /* init module */ - NULL, /* init process */ - NULL, /* init thread */ - NULL, /* exit thread */ - NULL, /* exit process */ - NULL, /* exit master */ - NGX_MODULE_V1_PADDING -}; - - - -static ngx_int_t -ngx_poll_init(ngx_cycle_t *cycle, ngx_msec_t timer) -{ - struct pollfd *list; - - if (event_list == NULL) { - nevents = 0; - } - - if (ngx_process >= NGX_PROCESS_WORKER - || cycle->old_cycle == NULL - || cycle->old_cycle->connection_n < cycle->connection_n) - { - list = ngx_alloc(sizeof(struct pollfd) * cycle->connection_n, - cycle->log); - if (list == NULL) { - return NGX_ERROR; - } - - if (event_list) { - ngx_memcpy(list, event_list, sizeof(struct pollfd) * nevents); - ngx_free(event_list); - } - - event_list = list; - } - - ngx_io = ngx_os_io; - - ngx_event_actions = ngx_poll_module_ctx.actions; - - ngx_event_flags = NGX_USE_LEVEL_EVENT|NGX_USE_FD_EVENT; - - return NGX_OK; -} - - -static void -ngx_poll_done(ngx_cycle_t *cycle) -{ - ngx_free(event_list); - - event_list = NULL; -} - - -static ngx_int_t -ngx_poll_add_event(ngx_event_t *ev, ngx_int_t event, ngx_uint_t flags) -{ - ngx_event_t *e; - ngx_connection_t *c; - - c = ev->data; - - ev->active = 1; - - if (ev->index != NGX_INVALID_INDEX) { - ngx_log_error(NGX_LOG_ALERT, ev->log, 0, - "poll event fd:%d ev:%i is already set", c->fd, event); - return NGX_OK; - } - - if (event == NGX_READ_EVENT) { - e = c->write; -#if (NGX_READ_EVENT != POLLIN) - event = POLLIN; -#endif - - } else { - e = c->read; -#if (NGX_WRITE_EVENT != POLLOUT) - event = POLLOUT; -#endif - } - - ngx_log_debug2(NGX_LOG_DEBUG_EVENT, ev->log, 0, - "poll add event: fd:%d ev:%i", c->fd, event); - - if (e == NULL || e->index == NGX_INVALID_INDEX) { - event_list[nevents].fd = c->fd; - event_list[nevents].events = (short) event; - event_list[nevents].revents = 0; - - ev->index = nevents; - nevents++; - - } else { - ngx_log_debug1(NGX_LOG_DEBUG_EVENT, ev->log, 0, - "poll add index: %i", e->index); - - event_list[e->index].events |= (short) event; - ev->index = e->index; - } - - return NGX_OK; -} - - -static ngx_int_t -ngx_poll_del_event(ngx_event_t *ev, ngx_int_t event, ngx_uint_t flags) -{ - ngx_event_t *e; - ngx_connection_t *c; - - c = ev->data; - - ev->active = 0; - - if (ev->index == NGX_INVALID_INDEX) { - ngx_log_error(NGX_LOG_ALERT, ev->log, 0, - "poll event fd:%d ev:%i is already deleted", - c->fd, event); - return NGX_OK; - } - - if (event == NGX_READ_EVENT) { - e = c->write; -#if (NGX_READ_EVENT != POLLIN) - event = POLLIN; -#endif - - } else { - e = c->read; -#if (NGX_WRITE_EVENT != POLLOUT) - event = POLLOUT; -#endif - } - - ngx_log_debug2(NGX_LOG_DEBUG_EVENT, ev->log, 0, - "poll del event: fd:%d ev:%i", c->fd, event); - - if (e == NULL || e->index == NGX_INVALID_INDEX) { - nevents--; - - if (ev->index < nevents) { - - ngx_log_debug2(NGX_LOG_DEBUG_EVENT, ev->log, 0, - "index: copy event %ui to %i", nevents, ev->index); - - event_list[ev->index] = event_list[nevents]; - - c = ngx_cycle->files[event_list[nevents].fd]; - - if (c->fd == -1) { - ngx_log_error(NGX_LOG_ALERT, ev->log, 0, - "unexpected last event"); - - } else { - if (c->read->index == nevents) { - c->read->index = ev->index; - } - - if (c->write->index == nevents) { - c->write->index = ev->index; - } - } - } - - } else { - ngx_log_debug1(NGX_LOG_DEBUG_EVENT, ev->log, 0, - "poll del index: %i", e->index); - - event_list[e->index].events &= (short) ~event; - } - - ev->index = NGX_INVALID_INDEX; - - return NGX_OK; -} - - -static ngx_int_t -ngx_poll_process_events(ngx_cycle_t *cycle, ngx_msec_t timer, ngx_uint_t flags) -{ - int ready, revents; - ngx_err_t err; - ngx_uint_t i, found, level; - ngx_event_t *ev; - ngx_queue_t *queue; - ngx_connection_t *c; - - /* NGX_TIMER_INFINITE == INFTIM */ - -#if (NGX_DEBUG0) - if (cycle->log->log_level & NGX_LOG_DEBUG_ALL) { - for (i = 0; i < nevents; i++) { - ngx_log_debug3(NGX_LOG_DEBUG_EVENT, cycle->log, 0, - "poll: %ui: fd:%d ev:%04Xd", - i, event_list[i].fd, event_list[i].events); - } - } -#endif - - ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0, "poll timer: %M", timer); - - ready = poll(event_list, (u_int) nevents, (int) timer); - - err = (ready == -1) ? ngx_errno : 0; - - if (flags & NGX_UPDATE_TIME || ngx_event_timer_alarm) { - ngx_time_update(); - } - - ngx_log_debug2(NGX_LOG_DEBUG_EVENT, cycle->log, 0, - "poll ready %d of %ui", ready, nevents); - - if (err) { - if (err == NGX_EINTR) { - - if (ngx_event_timer_alarm) { - ngx_event_timer_alarm = 0; - return NGX_OK; - } - - level = NGX_LOG_INFO; - - } else { - level = NGX_LOG_ALERT; - } - - ngx_log_error(level, cycle->log, err, "poll() failed"); - return NGX_ERROR; - } - - if (ready == 0) { - if (timer != NGX_TIMER_INFINITE) { - return NGX_OK; - } - - ngx_log_error(NGX_LOG_ALERT, cycle->log, 0, - "poll() returned no events without timeout"); - return NGX_ERROR; - } - - for (i = 0; i < nevents && ready; i++) { - - revents = event_list[i].revents; - -#if 1 - ngx_log_debug4(NGX_LOG_DEBUG_EVENT, cycle->log, 0, - "poll: %ui: fd:%d ev:%04Xd rev:%04Xd", - i, event_list[i].fd, event_list[i].events, revents); -#else - if (revents) { - ngx_log_debug4(NGX_LOG_DEBUG_EVENT, cycle->log, 0, - "poll: %ui: fd:%d ev:%04Xd rev:%04Xd", - i, event_list[i].fd, event_list[i].events, revents); - } -#endif - - if (revents & POLLNVAL) { - ngx_log_error(NGX_LOG_ALERT, cycle->log, 0, - "poll() error fd:%d ev:%04Xd rev:%04Xd", - event_list[i].fd, event_list[i].events, revents); - } - - if (revents & ~(POLLIN|POLLOUT|POLLERR|POLLHUP|POLLNVAL)) { - ngx_log_error(NGX_LOG_ALERT, cycle->log, 0, - "strange poll() events fd:%d ev:%04Xd rev:%04Xd", - event_list[i].fd, event_list[i].events, revents); - } - - if (event_list[i].fd == -1) { - /* - * the disabled event, a workaround for our possible bug, - * see the comment below - */ - continue; - } - - c = ngx_cycle->files[event_list[i].fd]; - - if (c->fd == -1) { - ngx_log_error(NGX_LOG_ALERT, cycle->log, 0, "unexpected event"); - - /* - * it is certainly our fault and it should be investigated, - * in the meantime we disable this event to avoid a CPU spinning - */ - - if (i == nevents - 1) { - nevents--; - } else { - event_list[i].fd = -1; - } - - continue; - } - - if (revents & (POLLERR|POLLHUP|POLLNVAL)) { - - /* - * if the error events were returned, add POLLIN and POLLOUT - * to handle the events at least in one active handler - */ - - revents |= POLLIN|POLLOUT; - } - - found = 0; - - if ((revents & POLLIN) && c->read->active) { - found = 1; - - ev = c->read; - ev->ready = 1; - ev->available = -1; - - queue = ev->accept ? &ngx_posted_accept_events - : &ngx_posted_events; - - ngx_post_event(ev, queue); - } - - if ((revents & POLLOUT) && c->write->active) { - found = 1; - - ev = c->write; - ev->ready = 1; - - ngx_post_event(ev, &ngx_posted_events); - } - - if (found) { - ready--; - continue; - } - } - - if (ready != 0) { - ngx_log_error(NGX_LOG_ALERT, cycle->log, 0, "poll ready != events"); - } - - return NGX_OK; -} - - -static char * -ngx_poll_init_conf(ngx_cycle_t *cycle, void *conf) -{ - ngx_event_conf_t *ecf; - - ecf = ngx_event_get_conf(cycle->conf_ctx, ngx_event_core_module); - - if (ecf->use != ngx_poll_module.ctx_index) { - return NGX_CONF_OK; - } - - return NGX_CONF_OK; -} diff --git a/src/deps/src/nginx-1.30.3/src/event/modules/ngx_select_module.c b/src/deps/src/nginx-1.30.3/src/event/modules/ngx_select_module.c deleted file mode 100644 index b9fceb3b64..0000000000 --- a/src/deps/src/nginx-1.30.3/src/event/modules/ngx_select_module.c +++ /dev/null @@ -1,424 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#include -#include -#include - - -static ngx_int_t ngx_select_init(ngx_cycle_t *cycle, ngx_msec_t timer); -static void ngx_select_done(ngx_cycle_t *cycle); -static ngx_int_t ngx_select_add_event(ngx_event_t *ev, ngx_int_t event, - ngx_uint_t flags); -static ngx_int_t ngx_select_del_event(ngx_event_t *ev, ngx_int_t event, - ngx_uint_t flags); -static ngx_int_t ngx_select_process_events(ngx_cycle_t *cycle, ngx_msec_t timer, - ngx_uint_t flags); -static void ngx_select_repair_fd_sets(ngx_cycle_t *cycle); -static char *ngx_select_init_conf(ngx_cycle_t *cycle, void *conf); - - -static fd_set master_read_fd_set; -static fd_set master_write_fd_set; -static fd_set work_read_fd_set; -static fd_set work_write_fd_set; - -static ngx_int_t max_fd; -static ngx_uint_t nevents; - -static ngx_event_t **event_index; - - -static ngx_str_t select_name = ngx_string("select"); - -static ngx_event_module_t ngx_select_module_ctx = { - &select_name, - NULL, /* create configuration */ - ngx_select_init_conf, /* init configuration */ - - { - ngx_select_add_event, /* add an event */ - ngx_select_del_event, /* delete an event */ - ngx_select_add_event, /* enable an event */ - ngx_select_del_event, /* disable an event */ - NULL, /* add an connection */ - NULL, /* delete an connection */ - NULL, /* trigger a notify */ - ngx_select_process_events, /* process the events */ - ngx_select_init, /* init the events */ - ngx_select_done /* done the events */ - } - -}; - -ngx_module_t ngx_select_module = { - NGX_MODULE_V1, - &ngx_select_module_ctx, /* module context */ - NULL, /* module directives */ - NGX_EVENT_MODULE, /* module type */ - NULL, /* init master */ - NULL, /* init module */ - NULL, /* init process */ - NULL, /* init thread */ - NULL, /* exit thread */ - NULL, /* exit process */ - NULL, /* exit master */ - NGX_MODULE_V1_PADDING -}; - - -static ngx_int_t -ngx_select_init(ngx_cycle_t *cycle, ngx_msec_t timer) -{ - ngx_event_t **index; - - if (event_index == NULL) { - FD_ZERO(&master_read_fd_set); - FD_ZERO(&master_write_fd_set); - nevents = 0; - } - - if (ngx_process >= NGX_PROCESS_WORKER - || cycle->old_cycle == NULL - || cycle->old_cycle->connection_n < cycle->connection_n) - { - index = ngx_alloc(sizeof(ngx_event_t *) * 2 * cycle->connection_n, - cycle->log); - if (index == NULL) { - return NGX_ERROR; - } - - if (event_index) { - ngx_memcpy(index, event_index, sizeof(ngx_event_t *) * nevents); - ngx_free(event_index); - } - - event_index = index; - } - - ngx_io = ngx_os_io; - - ngx_event_actions = ngx_select_module_ctx.actions; - - ngx_event_flags = NGX_USE_LEVEL_EVENT; - - max_fd = -1; - - return NGX_OK; -} - - -static void -ngx_select_done(ngx_cycle_t *cycle) -{ - ngx_free(event_index); - - event_index = NULL; -} - - -static ngx_int_t -ngx_select_add_event(ngx_event_t *ev, ngx_int_t event, ngx_uint_t flags) -{ - ngx_connection_t *c; - - c = ev->data; - - ngx_log_debug2(NGX_LOG_DEBUG_EVENT, ev->log, 0, - "select add event fd:%d ev:%i", c->fd, event); - - if (ev->index != NGX_INVALID_INDEX) { - ngx_log_error(NGX_LOG_ALERT, ev->log, 0, - "select event fd:%d ev:%i is already set", c->fd, event); - return NGX_OK; - } - - if ((event == NGX_READ_EVENT && ev->write) - || (event == NGX_WRITE_EVENT && !ev->write)) - { - ngx_log_error(NGX_LOG_ALERT, ev->log, 0, - "invalid select %s event fd:%d ev:%i", - ev->write ? "write" : "read", c->fd, event); - return NGX_ERROR; - } - - if (event == NGX_READ_EVENT) { - FD_SET(c->fd, &master_read_fd_set); - - } else if (event == NGX_WRITE_EVENT) { - FD_SET(c->fd, &master_write_fd_set); - } - - if (max_fd != -1 && max_fd < c->fd) { - max_fd = c->fd; - } - - ev->active = 1; - - event_index[nevents] = ev; - ev->index = nevents; - nevents++; - - return NGX_OK; -} - - -static ngx_int_t -ngx_select_del_event(ngx_event_t *ev, ngx_int_t event, ngx_uint_t flags) -{ - ngx_event_t *e; - ngx_connection_t *c; - - c = ev->data; - - ev->active = 0; - - if (ev->index == NGX_INVALID_INDEX) { - return NGX_OK; - } - - ngx_log_debug2(NGX_LOG_DEBUG_EVENT, ev->log, 0, - "select del event fd:%d ev:%i", c->fd, event); - - if (event == NGX_READ_EVENT) { - FD_CLR(c->fd, &master_read_fd_set); - - } else if (event == NGX_WRITE_EVENT) { - FD_CLR(c->fd, &master_write_fd_set); - } - - if (max_fd == c->fd) { - max_fd = -1; - } - - if (ev->index < --nevents) { - e = event_index[nevents]; - event_index[ev->index] = e; - e->index = ev->index; - } - - ev->index = NGX_INVALID_INDEX; - - return NGX_OK; -} - - -static ngx_int_t -ngx_select_process_events(ngx_cycle_t *cycle, ngx_msec_t timer, - ngx_uint_t flags) -{ - int ready, nready; - ngx_err_t err; - ngx_uint_t i, found; - ngx_event_t *ev; - ngx_queue_t *queue; - struct timeval tv, *tp; - ngx_connection_t *c; - - if (max_fd == -1) { - for (i = 0; i < nevents; i++) { - c = event_index[i]->data; - if (max_fd < c->fd) { - max_fd = c->fd; - } - } - - ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0, - "change max_fd: %i", max_fd); - } - -#if (NGX_DEBUG) - if (cycle->log->log_level & NGX_LOG_DEBUG_ALL) { - for (i = 0; i < nevents; i++) { - ev = event_index[i]; - c = ev->data; - ngx_log_debug2(NGX_LOG_DEBUG_EVENT, cycle->log, 0, - "select event: fd:%d wr:%d", c->fd, ev->write); - } - - ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0, - "max_fd: %i", max_fd); - } -#endif - - if (timer == NGX_TIMER_INFINITE) { - tp = NULL; - - } else { - tv.tv_sec = (long) (timer / 1000); - tv.tv_usec = (long) ((timer % 1000) * 1000); - tp = &tv; - } - - ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0, - "select timer: %M", timer); - - work_read_fd_set = master_read_fd_set; - work_write_fd_set = master_write_fd_set; - - ready = select(max_fd + 1, &work_read_fd_set, &work_write_fd_set, NULL, tp); - - err = (ready == -1) ? ngx_errno : 0; - - if (flags & NGX_UPDATE_TIME || ngx_event_timer_alarm) { - ngx_time_update(); - } - - ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0, - "select ready %d", ready); - - if (err) { - ngx_uint_t level; - - if (err == NGX_EINTR) { - - if (ngx_event_timer_alarm) { - ngx_event_timer_alarm = 0; - return NGX_OK; - } - - level = NGX_LOG_INFO; - - } else { - level = NGX_LOG_ALERT; - } - - ngx_log_error(level, cycle->log, err, "select() failed"); - - if (err == NGX_EBADF) { - ngx_select_repair_fd_sets(cycle); - } - - return NGX_ERROR; - } - - if (ready == 0) { - if (timer != NGX_TIMER_INFINITE) { - return NGX_OK; - } - - ngx_log_error(NGX_LOG_ALERT, cycle->log, 0, - "select() returned no events without timeout"); - return NGX_ERROR; - } - - nready = 0; - - for (i = 0; i < nevents; i++) { - ev = event_index[i]; - c = ev->data; - found = 0; - - if (ev->write) { - if (FD_ISSET(c->fd, &work_write_fd_set)) { - found = 1; - ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0, - "select write %d", c->fd); - } - - } else { - if (FD_ISSET(c->fd, &work_read_fd_set)) { - found = 1; - ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0, - "select read %d", c->fd); - } - } - - if (found) { - ev->ready = 1; - ev->available = -1; - - queue = ev->accept ? &ngx_posted_accept_events - : &ngx_posted_events; - - ngx_post_event(ev, queue); - - nready++; - } - } - - if (ready != nready) { - ngx_log_error(NGX_LOG_ALERT, cycle->log, 0, - "select ready != events: %d:%d", ready, nready); - - ngx_select_repair_fd_sets(cycle); - } - - return NGX_OK; -} - - -static void -ngx_select_repair_fd_sets(ngx_cycle_t *cycle) -{ - int n; - socklen_t len; - ngx_err_t err; - ngx_socket_t s; - - for (s = 0; s <= max_fd; s++) { - - if (FD_ISSET(s, &master_read_fd_set) == 0) { - continue; - } - - len = sizeof(int); - - if (getsockopt(s, SOL_SOCKET, SO_TYPE, &n, &len) == -1) { - err = ngx_socket_errno; - - ngx_log_error(NGX_LOG_ALERT, cycle->log, err, - "invalid descriptor #%d in read fd_set", s); - - FD_CLR(s, &master_read_fd_set); - } - } - - for (s = 0; s <= max_fd; s++) { - - if (FD_ISSET(s, &master_write_fd_set) == 0) { - continue; - } - - len = sizeof(int); - - if (getsockopt(s, SOL_SOCKET, SO_TYPE, &n, &len) == -1) { - err = ngx_socket_errno; - - ngx_log_error(NGX_LOG_ALERT, cycle->log, err, - "invalid descriptor #%d in write fd_set", s); - - FD_CLR(s, &master_write_fd_set); - } - } - - max_fd = -1; -} - - -static char * -ngx_select_init_conf(ngx_cycle_t *cycle, void *conf) -{ - ngx_event_conf_t *ecf; - - ecf = ngx_event_get_conf(cycle->conf_ctx, ngx_event_core_module); - - if (ecf->use != ngx_select_module.ctx_index) { - return NGX_CONF_OK; - } - - /* disable warning: the default FD_SETSIZE is 1024U in FreeBSD 5.x */ - - if (cycle->connection_n > FD_SETSIZE) { - ngx_log_error(NGX_LOG_EMERG, cycle->log, 0, - "the maximum number of files " - "supported by select() is %ud", FD_SETSIZE); - return NGX_CONF_ERROR; - } - - return NGX_CONF_OK; -} diff --git a/src/deps/src/nginx-1.30.3/src/event/modules/ngx_win32_poll_module.c b/src/deps/src/nginx-1.30.3/src/event/modules/ngx_win32_poll_module.c deleted file mode 100644 index 2fbc1b376a..0000000000 --- a/src/deps/src/nginx-1.30.3/src/event/modules/ngx_win32_poll_module.c +++ /dev/null @@ -1,436 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Maxim Dounin - * Copyright (C) Nginx, Inc. - */ - - -#include -#include -#include - - -static ngx_int_t ngx_poll_init(ngx_cycle_t *cycle, ngx_msec_t timer); -static void ngx_poll_done(ngx_cycle_t *cycle); -static ngx_int_t ngx_poll_add_event(ngx_event_t *ev, ngx_int_t event, - ngx_uint_t flags); -static ngx_int_t ngx_poll_del_event(ngx_event_t *ev, ngx_int_t event, - ngx_uint_t flags); -static ngx_int_t ngx_poll_process_events(ngx_cycle_t *cycle, ngx_msec_t timer, - ngx_uint_t flags); -static char *ngx_poll_init_conf(ngx_cycle_t *cycle, void *conf); - - -static struct pollfd *event_list; -static ngx_connection_t **event_index; -static ngx_uint_t nevents; - - -static ngx_str_t poll_name = ngx_string("poll"); - -static ngx_event_module_t ngx_poll_module_ctx = { - &poll_name, - NULL, /* create configuration */ - ngx_poll_init_conf, /* init configuration */ - - { - ngx_poll_add_event, /* add an event */ - ngx_poll_del_event, /* delete an event */ - ngx_poll_add_event, /* enable an event */ - ngx_poll_del_event, /* disable an event */ - NULL, /* add an connection */ - NULL, /* delete an connection */ - NULL, /* trigger a notify */ - ngx_poll_process_events, /* process the events */ - ngx_poll_init, /* init the events */ - ngx_poll_done /* done the events */ - } - -}; - -ngx_module_t ngx_poll_module = { - NGX_MODULE_V1, - &ngx_poll_module_ctx, /* module context */ - NULL, /* module directives */ - NGX_EVENT_MODULE, /* module type */ - NULL, /* init master */ - NULL, /* init module */ - NULL, /* init process */ - NULL, /* init thread */ - NULL, /* exit thread */ - NULL, /* exit process */ - NULL, /* exit master */ - NGX_MODULE_V1_PADDING -}; - - - -static ngx_int_t -ngx_poll_init(ngx_cycle_t *cycle, ngx_msec_t timer) -{ - struct pollfd *list; - ngx_connection_t **index; - - if (event_list == NULL) { - nevents = 0; - } - - if (ngx_process >= NGX_PROCESS_WORKER - || cycle->old_cycle == NULL - || cycle->old_cycle->connection_n < cycle->connection_n) - { - list = ngx_alloc(sizeof(struct pollfd) * cycle->connection_n, - cycle->log); - if (list == NULL) { - return NGX_ERROR; - } - - if (event_list) { - ngx_memcpy(list, event_list, sizeof(struct pollfd) * nevents); - ngx_free(event_list); - } - - event_list = list; - - index = ngx_alloc(sizeof(ngx_connection_t *) * cycle->connection_n, - cycle->log); - if (index == NULL) { - return NGX_ERROR; - } - - if (event_index) { - ngx_memcpy(index, event_index, - sizeof(ngx_connection_t *) * nevents); - ngx_free(event_index); - } - - event_index = index; - } - - ngx_io = ngx_os_io; - - ngx_event_actions = ngx_poll_module_ctx.actions; - - ngx_event_flags = NGX_USE_LEVEL_EVENT; - - return NGX_OK; -} - - -static void -ngx_poll_done(ngx_cycle_t *cycle) -{ - ngx_free(event_list); - ngx_free(event_index); - - event_list = NULL; - event_index = NULL; -} - - -static ngx_int_t -ngx_poll_add_event(ngx_event_t *ev, ngx_int_t event, ngx_uint_t flags) -{ - ngx_event_t *e; - ngx_connection_t *c; - - c = ev->data; - - ev->active = 1; - - if (ev->index != NGX_INVALID_INDEX) { - ngx_log_error(NGX_LOG_ALERT, ev->log, 0, - "poll event fd:%d ev:%i is already set", c->fd, event); - return NGX_OK; - } - - if (event == NGX_READ_EVENT) { - e = c->write; -#if (NGX_READ_EVENT != POLLIN) - event = POLLIN; -#endif - - } else { - e = c->read; -#if (NGX_WRITE_EVENT != POLLOUT) - event = POLLOUT; -#endif - } - - ngx_log_debug2(NGX_LOG_DEBUG_EVENT, ev->log, 0, - "poll add event: fd:%d ev:%i", c->fd, event); - - if (e == NULL || e->index == NGX_INVALID_INDEX) { - - event_list[nevents].fd = c->fd; - event_list[nevents].events = (short) event; - event_list[nevents].revents = 0; - - event_index[nevents] = c; - - ev->index = nevents; - nevents++; - - } else { - ngx_log_debug1(NGX_LOG_DEBUG_EVENT, ev->log, 0, - "poll add index: %i", e->index); - - event_list[e->index].events |= (short) event; - ev->index = e->index; - } - - return NGX_OK; -} - - -static ngx_int_t -ngx_poll_del_event(ngx_event_t *ev, ngx_int_t event, ngx_uint_t flags) -{ - ngx_event_t *e; - ngx_connection_t *c; - - c = ev->data; - - ev->active = 0; - - if (ev->index == NGX_INVALID_INDEX) { - ngx_log_error(NGX_LOG_ALERT, ev->log, 0, - "poll event fd:%d ev:%i is already deleted", - c->fd, event); - return NGX_OK; - } - - if (event == NGX_READ_EVENT) { - e = c->write; -#if (NGX_READ_EVENT != POLLIN) - event = POLLIN; -#endif - - } else { - e = c->read; -#if (NGX_WRITE_EVENT != POLLOUT) - event = POLLOUT; -#endif - } - - ngx_log_debug2(NGX_LOG_DEBUG_EVENT, ev->log, 0, - "poll del event: fd:%d ev:%i", c->fd, event); - - if (e == NULL || e->index == NGX_INVALID_INDEX) { - nevents--; - - if (ev->index < nevents) { - - ngx_log_debug2(NGX_LOG_DEBUG_EVENT, ev->log, 0, - "index: copy event %ui to %i", nevents, ev->index); - - event_list[ev->index] = event_list[nevents]; - event_index[ev->index] = event_index[nevents]; - - c = event_index[ev->index]; - - if (c->fd == (ngx_socket_t) -1) { - ngx_log_error(NGX_LOG_ALERT, ev->log, 0, - "unexpected last event"); - - } else { - if (c->read->index == nevents) { - c->read->index = ev->index; - } - - if (c->write->index == nevents) { - c->write->index = ev->index; - } - } - } - - } else { - ngx_log_debug1(NGX_LOG_DEBUG_EVENT, ev->log, 0, - "poll del index: %i", e->index); - - event_list[e->index].events &= (short) ~event; - } - - ev->index = NGX_INVALID_INDEX; - - return NGX_OK; -} - - -static ngx_int_t -ngx_poll_process_events(ngx_cycle_t *cycle, ngx_msec_t timer, ngx_uint_t flags) -{ - int ready, revents; - ngx_err_t err; - ngx_uint_t i, found; - ngx_event_t *ev; - ngx_queue_t *queue; - ngx_connection_t *c; - - /* NGX_TIMER_INFINITE == INFTIM */ - -#if (NGX_DEBUG0) - if (cycle->log->log_level & NGX_LOG_DEBUG_ALL) { - for (i = 0; i < nevents; i++) { - ngx_log_debug3(NGX_LOG_DEBUG_EVENT, cycle->log, 0, - "poll: %ui: fd:%d ev:%04Xd", - i, event_list[i].fd, event_list[i].events); - } - } -#endif - - ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0, "poll timer: %M", timer); - - ready = WSAPoll(event_list, (u_int) nevents, (int) timer); - - err = (ready == -1) ? ngx_errno : 0; - - if (flags & NGX_UPDATE_TIME || ngx_event_timer_alarm) { - ngx_time_update(); - } - - ngx_log_debug2(NGX_LOG_DEBUG_EVENT, cycle->log, 0, - "poll ready %d of %ui", ready, nevents); - - if (err) { - ngx_log_error(NGX_LOG_ALERT, cycle->log, err, "WSAPoll() failed"); - return NGX_ERROR; - } - - if (ready == 0) { - if (timer != NGX_TIMER_INFINITE) { - return NGX_OK; - } - - ngx_log_error(NGX_LOG_ALERT, cycle->log, 0, - "WSAPoll() returned no events without timeout"); - return NGX_ERROR; - } - - for (i = 0; i < nevents && ready; i++) { - - revents = event_list[i].revents; - -#if 1 - ngx_log_debug4(NGX_LOG_DEBUG_EVENT, cycle->log, 0, - "poll: %ui: fd:%d ev:%04Xd rev:%04Xd", - i, event_list[i].fd, event_list[i].events, revents); -#else - if (revents) { - ngx_log_debug4(NGX_LOG_DEBUG_EVENT, cycle->log, 0, - "poll: %ui: fd:%d ev:%04Xd rev:%04Xd", - i, event_list[i].fd, event_list[i].events, revents); - } -#endif - - if (revents & POLLNVAL) { - ngx_log_error(NGX_LOG_ALERT, cycle->log, 0, - "poll() error fd:%d ev:%04Xd rev:%04Xd", - event_list[i].fd, event_list[i].events, revents); - } - - if (revents & ~(POLLIN|POLLOUT|POLLERR|POLLHUP|POLLNVAL)) { - ngx_log_error(NGX_LOG_ALERT, cycle->log, 0, - "strange poll() events fd:%d ev:%04Xd rev:%04Xd", - event_list[i].fd, event_list[i].events, revents); - } - - if (event_list[i].fd == (ngx_socket_t) -1) { - /* - * the disabled event, a workaround for our possible bug, - * see the comment below - */ - continue; - } - - c = event_index[i]; - - if (c->fd == (ngx_socket_t) -1) { - ngx_log_error(NGX_LOG_ALERT, cycle->log, 0, "unexpected event"); - - /* - * it is certainly our fault and it should be investigated, - * in the meantime we disable this event to avoid a CPU spinning - */ - - if (i == nevents - 1) { - nevents--; - } else { - event_list[i].fd = (ngx_socket_t) -1; - } - - continue; - } - - if (revents & (POLLERR|POLLHUP|POLLNVAL)) { - - /* - * if the error events were returned, add POLLIN and POLLOUT - * to handle the events at least in one active handler - */ - - revents |= POLLIN|POLLOUT; - } - - found = 0; - - if ((revents & POLLIN) && c->read->active) { - found = 1; - - ev = c->read; - ev->ready = 1; - ev->available = -1; - - queue = ev->accept ? &ngx_posted_accept_events - : &ngx_posted_events; - - ngx_post_event(ev, queue); - } - - if ((revents & POLLOUT) && c->write->active) { - found = 1; - - ev = c->write; - ev->ready = 1; - - ngx_post_event(ev, &ngx_posted_events); - } - - if (found) { - ready--; - continue; - } - } - - if (ready != 0) { - ngx_log_error(NGX_LOG_ALERT, cycle->log, 0, "poll ready != events"); - } - - return NGX_OK; -} - - -static char * -ngx_poll_init_conf(ngx_cycle_t *cycle, void *conf) -{ - ngx_event_conf_t *ecf; - - ecf = ngx_event_get_conf(cycle->conf_ctx, ngx_event_core_module); - - if (ecf->use != ngx_poll_module.ctx_index) { - return NGX_CONF_OK; - } - -#if (NGX_LOAD_WSAPOLL) - - if (!ngx_have_wsapoll) { - ngx_log_error(NGX_LOG_EMERG, cycle->log, 0, - "poll is not available on this platform"); - return NGX_CONF_ERROR; - } - -#endif - - return NGX_CONF_OK; -} diff --git a/src/deps/src/nginx-1.30.3/src/event/modules/ngx_win32_select_module.c b/src/deps/src/nginx-1.30.3/src/event/modules/ngx_win32_select_module.c deleted file mode 100644 index 962514a366..0000000000 --- a/src/deps/src/nginx-1.30.3/src/event/modules/ngx_win32_select_module.c +++ /dev/null @@ -1,408 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#include -#include -#include - - -static ngx_int_t ngx_select_init(ngx_cycle_t *cycle, ngx_msec_t timer); -static void ngx_select_done(ngx_cycle_t *cycle); -static ngx_int_t ngx_select_add_event(ngx_event_t *ev, ngx_int_t event, - ngx_uint_t flags); -static ngx_int_t ngx_select_del_event(ngx_event_t *ev, ngx_int_t event, - ngx_uint_t flags); -static ngx_int_t ngx_select_process_events(ngx_cycle_t *cycle, ngx_msec_t timer, - ngx_uint_t flags); -static void ngx_select_repair_fd_sets(ngx_cycle_t *cycle); -static char *ngx_select_init_conf(ngx_cycle_t *cycle, void *conf); - - -static fd_set master_read_fd_set; -static fd_set master_write_fd_set; -static fd_set work_read_fd_set; -static fd_set work_write_fd_set; -static fd_set work_except_fd_set; - -static ngx_uint_t max_read; -static ngx_uint_t max_write; -static ngx_uint_t nevents; - -static ngx_event_t **event_index; - - -static ngx_str_t select_name = ngx_string("select"); - -static ngx_event_module_t ngx_select_module_ctx = { - &select_name, - NULL, /* create configuration */ - ngx_select_init_conf, /* init configuration */ - - { - ngx_select_add_event, /* add an event */ - ngx_select_del_event, /* delete an event */ - ngx_select_add_event, /* enable an event */ - ngx_select_del_event, /* disable an event */ - NULL, /* add an connection */ - NULL, /* delete an connection */ - NULL, /* trigger a notify */ - ngx_select_process_events, /* process the events */ - ngx_select_init, /* init the events */ - ngx_select_done /* done the events */ - } - -}; - -ngx_module_t ngx_select_module = { - NGX_MODULE_V1, - &ngx_select_module_ctx, /* module context */ - NULL, /* module directives */ - NGX_EVENT_MODULE, /* module type */ - NULL, /* init master */ - NULL, /* init module */ - NULL, /* init process */ - NULL, /* init thread */ - NULL, /* exit thread */ - NULL, /* exit process */ - NULL, /* exit master */ - NGX_MODULE_V1_PADDING -}; - - -static ngx_int_t -ngx_select_init(ngx_cycle_t *cycle, ngx_msec_t timer) -{ - ngx_event_t **index; - - if (event_index == NULL) { - FD_ZERO(&master_read_fd_set); - FD_ZERO(&master_write_fd_set); - nevents = 0; - } - - if (ngx_process >= NGX_PROCESS_WORKER - || cycle->old_cycle == NULL - || cycle->old_cycle->connection_n < cycle->connection_n) - { - index = ngx_alloc(sizeof(ngx_event_t *) * 2 * cycle->connection_n, - cycle->log); - if (index == NULL) { - return NGX_ERROR; - } - - if (event_index) { - ngx_memcpy(index, event_index, sizeof(ngx_event_t *) * nevents); - ngx_free(event_index); - } - - event_index = index; - } - - ngx_io = ngx_os_io; - - ngx_event_actions = ngx_select_module_ctx.actions; - - ngx_event_flags = NGX_USE_LEVEL_EVENT; - - max_read = 0; - max_write = 0; - - return NGX_OK; -} - - -static void -ngx_select_done(ngx_cycle_t *cycle) -{ - ngx_free(event_index); - - event_index = NULL; -} - - -static ngx_int_t -ngx_select_add_event(ngx_event_t *ev, ngx_int_t event, ngx_uint_t flags) -{ - ngx_connection_t *c; - - c = ev->data; - - ngx_log_debug2(NGX_LOG_DEBUG_EVENT, ev->log, 0, - "select add event fd:%d ev:%i", c->fd, event); - - if (ev->index != NGX_INVALID_INDEX) { - ngx_log_error(NGX_LOG_ALERT, ev->log, 0, - "select event fd:%d ev:%i is already set", c->fd, event); - return NGX_OK; - } - - if ((event == NGX_READ_EVENT && ev->write) - || (event == NGX_WRITE_EVENT && !ev->write)) - { - ngx_log_error(NGX_LOG_ALERT, ev->log, 0, - "invalid select %s event fd:%d ev:%i", - ev->write ? "write" : "read", c->fd, event); - return NGX_ERROR; - } - - if ((event == NGX_READ_EVENT && max_read >= FD_SETSIZE) - || (event == NGX_WRITE_EVENT && max_write >= FD_SETSIZE)) - { - ngx_log_error(NGX_LOG_ERR, ev->log, 0, - "maximum number of descriptors " - "supported by select() is %d", FD_SETSIZE); - return NGX_ERROR; - } - - if (event == NGX_READ_EVENT) { - FD_SET(c->fd, &master_read_fd_set); - max_read++; - - } else if (event == NGX_WRITE_EVENT) { - FD_SET(c->fd, &master_write_fd_set); - max_write++; - } - - ev->active = 1; - - event_index[nevents] = ev; - ev->index = nevents; - nevents++; - - return NGX_OK; -} - - -static ngx_int_t -ngx_select_del_event(ngx_event_t *ev, ngx_int_t event, ngx_uint_t flags) -{ - ngx_event_t *e; - ngx_connection_t *c; - - c = ev->data; - - ev->active = 0; - - if (ev->index == NGX_INVALID_INDEX) { - return NGX_OK; - } - - ngx_log_debug2(NGX_LOG_DEBUG_EVENT, ev->log, 0, - "select del event fd:%d ev:%i", c->fd, event); - - if (event == NGX_READ_EVENT) { - FD_CLR(c->fd, &master_read_fd_set); - max_read--; - - } else if (event == NGX_WRITE_EVENT) { - FD_CLR(c->fd, &master_write_fd_set); - max_write--; - } - - if (ev->index < --nevents) { - e = event_index[nevents]; - event_index[ev->index] = e; - e->index = ev->index; - } - - ev->index = NGX_INVALID_INDEX; - - return NGX_OK; -} - - -static ngx_int_t -ngx_select_process_events(ngx_cycle_t *cycle, ngx_msec_t timer, - ngx_uint_t flags) -{ - int ready, nready; - ngx_err_t err; - ngx_uint_t i, found; - ngx_event_t *ev; - ngx_queue_t *queue; - struct timeval tv, *tp; - ngx_connection_t *c; - -#if (NGX_DEBUG) - if (cycle->log->log_level & NGX_LOG_DEBUG_ALL) { - for (i = 0; i < nevents; i++) { - ev = event_index[i]; - c = ev->data; - ngx_log_debug2(NGX_LOG_DEBUG_EVENT, cycle->log, 0, - "select event: fd:%d wr:%d", c->fd, ev->write); - } - } -#endif - - if (timer == NGX_TIMER_INFINITE) { - tp = NULL; - - } else { - tv.tv_sec = (long) (timer / 1000); - tv.tv_usec = (long) ((timer % 1000) * 1000); - tp = &tv; - } - - ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0, - "select timer: %M", timer); - - work_read_fd_set = master_read_fd_set; - work_write_fd_set = master_write_fd_set; - work_except_fd_set = master_write_fd_set; - - if (max_read || max_write) { - ready = select(0, &work_read_fd_set, &work_write_fd_set, - &work_except_fd_set, tp); - - } else { - - /* - * Winsock select() requires that at least one descriptor set must be - * be non-null, and any non-null descriptor set must contain at least - * one handle to a socket. Otherwise select() returns WSAEINVAL. - */ - - ngx_msleep(timer); - - ready = 0; - } - - err = (ready == -1) ? ngx_socket_errno : 0; - - if (flags & NGX_UPDATE_TIME) { - ngx_time_update(); - } - - ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0, - "select ready %d", ready); - - if (err) { - ngx_log_error(NGX_LOG_ALERT, cycle->log, err, "select() failed"); - - if (err == WSAENOTSOCK) { - ngx_select_repair_fd_sets(cycle); - } - - return NGX_ERROR; - } - - if (ready == 0) { - if (timer != NGX_TIMER_INFINITE) { - return NGX_OK; - } - - ngx_log_error(NGX_LOG_ALERT, cycle->log, 0, - "select() returned no events without timeout"); - return NGX_ERROR; - } - - nready = 0; - - for (i = 0; i < nevents; i++) { - ev = event_index[i]; - c = ev->data; - found = 0; - - if (ev->write) { - if (FD_ISSET(c->fd, &work_write_fd_set)) { - found++; - ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0, - "select write %d", c->fd); - } - - if (FD_ISSET(c->fd, &work_except_fd_set)) { - found++; - ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0, - "select except %d", c->fd); - } - - } else { - if (FD_ISSET(c->fd, &work_read_fd_set)) { - found++; - ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0, - "select read %d", c->fd); - } - } - - if (found) { - ev->ready = 1; - ev->available = -1; - - queue = ev->accept ? &ngx_posted_accept_events - : &ngx_posted_events; - - ngx_post_event(ev, queue); - - nready += found; - } - } - - if (ready != nready) { - ngx_log_error(NGX_LOG_ALERT, cycle->log, 0, - "select ready != events: %d:%d", ready, nready); - - ngx_select_repair_fd_sets(cycle); - } - - return NGX_OK; -} - - -static void -ngx_select_repair_fd_sets(ngx_cycle_t *cycle) -{ - int n; - u_int i; - socklen_t len; - ngx_err_t err; - ngx_socket_t s; - - for (i = 0; i < master_read_fd_set.fd_count; i++) { - - s = master_read_fd_set.fd_array[i]; - len = sizeof(int); - - if (getsockopt(s, SOL_SOCKET, SO_TYPE, (char *) &n, &len) == -1) { - err = ngx_socket_errno; - - ngx_log_error(NGX_LOG_ALERT, cycle->log, err, - "invalid descriptor #%d in read fd_set", s); - - FD_CLR(s, &master_read_fd_set); - } - } - - for (i = 0; i < master_write_fd_set.fd_count; i++) { - - s = master_write_fd_set.fd_array[i]; - len = sizeof(int); - - if (getsockopt(s, SOL_SOCKET, SO_TYPE, (char *) &n, &len) == -1) { - err = ngx_socket_errno; - - ngx_log_error(NGX_LOG_ALERT, cycle->log, err, - "invalid descriptor #%d in write fd_set", s); - - FD_CLR(s, &master_write_fd_set); - } - } -} - - -static char * -ngx_select_init_conf(ngx_cycle_t *cycle, void *conf) -{ - ngx_event_conf_t *ecf; - - ecf = ngx_event_get_conf(cycle->conf_ctx, ngx_event_core_module); - - if (ecf->use != ngx_select_module.ctx_index) { - return NGX_CONF_OK; - } - - return NGX_CONF_OK; -} diff --git a/src/deps/src/nginx-1.30.3/src/event/ngx_event.c b/src/deps/src/nginx-1.30.3/src/event/ngx_event.c deleted file mode 100644 index ef525d93b6..0000000000 --- a/src/deps/src/nginx-1.30.3/src/event/ngx_event.c +++ /dev/null @@ -1,1373 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#include -#include -#include - - -#define DEFAULT_CONNECTIONS 512 - - -extern ngx_module_t ngx_kqueue_module; -extern ngx_module_t ngx_eventport_module; -extern ngx_module_t ngx_devpoll_module; -extern ngx_module_t ngx_epoll_module; -extern ngx_module_t ngx_select_module; - - -static char *ngx_event_init_conf(ngx_cycle_t *cycle, void *conf); -static ngx_int_t ngx_event_module_init(ngx_cycle_t *cycle); -static ngx_int_t ngx_event_process_init(ngx_cycle_t *cycle); -static char *ngx_events_block(ngx_conf_t *cf, ngx_command_t *cmd, void *conf); - -static char *ngx_event_connections(ngx_conf_t *cf, ngx_command_t *cmd, - void *conf); -static char *ngx_event_use(ngx_conf_t *cf, ngx_command_t *cmd, void *conf); -static char *ngx_event_debug_connection(ngx_conf_t *cf, ngx_command_t *cmd, - void *conf); - -static void *ngx_event_core_create_conf(ngx_cycle_t *cycle); -static char *ngx_event_core_init_conf(ngx_cycle_t *cycle, void *conf); - - -static ngx_uint_t ngx_timer_resolution; -sig_atomic_t ngx_event_timer_alarm; - -static ngx_uint_t ngx_event_max_module; - -ngx_uint_t ngx_event_flags; -ngx_event_actions_t ngx_event_actions; - - -static ngx_atomic_t connection_counter = 1; -ngx_atomic_t *ngx_connection_counter = &connection_counter; - - -ngx_atomic_t *ngx_accept_mutex_ptr; -ngx_shmtx_t ngx_accept_mutex; -ngx_uint_t ngx_use_accept_mutex; -ngx_uint_t ngx_accept_events; -ngx_uint_t ngx_accept_mutex_held; -ngx_msec_t ngx_accept_mutex_delay; -ngx_int_t ngx_accept_disabled; -ngx_uint_t ngx_use_exclusive_accept; - - -#if (NGX_STAT_STUB) - -static ngx_atomic_t ngx_stat_accepted0; -ngx_atomic_t *ngx_stat_accepted = &ngx_stat_accepted0; -static ngx_atomic_t ngx_stat_handled0; -ngx_atomic_t *ngx_stat_handled = &ngx_stat_handled0; -static ngx_atomic_t ngx_stat_requests0; -ngx_atomic_t *ngx_stat_requests = &ngx_stat_requests0; -static ngx_atomic_t ngx_stat_active0; -ngx_atomic_t *ngx_stat_active = &ngx_stat_active0; -static ngx_atomic_t ngx_stat_reading0; -ngx_atomic_t *ngx_stat_reading = &ngx_stat_reading0; -static ngx_atomic_t ngx_stat_writing0; -ngx_atomic_t *ngx_stat_writing = &ngx_stat_writing0; -static ngx_atomic_t ngx_stat_waiting0; -ngx_atomic_t *ngx_stat_waiting = &ngx_stat_waiting0; - -#endif - - - -static ngx_command_t ngx_events_commands[] = { - - { ngx_string("events"), - NGX_MAIN_CONF|NGX_CONF_BLOCK|NGX_CONF_NOARGS, - ngx_events_block, - 0, - 0, - NULL }, - - ngx_null_command -}; - - -static ngx_core_module_t ngx_events_module_ctx = { - ngx_string("events"), - NULL, - ngx_event_init_conf -}; - - -ngx_module_t ngx_events_module = { - NGX_MODULE_V1, - &ngx_events_module_ctx, /* module context */ - ngx_events_commands, /* module directives */ - NGX_CORE_MODULE, /* module type */ - NULL, /* init master */ - NULL, /* init module */ - NULL, /* init process */ - NULL, /* init thread */ - NULL, /* exit thread */ - NULL, /* exit process */ - NULL, /* exit master */ - NGX_MODULE_V1_PADDING -}; - - -static ngx_str_t event_core_name = ngx_string("event_core"); - - -static ngx_command_t ngx_event_core_commands[] = { - - { ngx_string("worker_connections"), - NGX_EVENT_CONF|NGX_CONF_TAKE1, - ngx_event_connections, - 0, - 0, - NULL }, - - { ngx_string("use"), - NGX_EVENT_CONF|NGX_CONF_TAKE1, - ngx_event_use, - 0, - 0, - NULL }, - - { ngx_string("multi_accept"), - NGX_EVENT_CONF|NGX_CONF_FLAG, - ngx_conf_set_flag_slot, - 0, - offsetof(ngx_event_conf_t, multi_accept), - NULL }, - - { ngx_string("accept_mutex"), - NGX_EVENT_CONF|NGX_CONF_FLAG, - ngx_conf_set_flag_slot, - 0, - offsetof(ngx_event_conf_t, accept_mutex), - NULL }, - - { ngx_string("accept_mutex_delay"), - NGX_EVENT_CONF|NGX_CONF_TAKE1, - ngx_conf_set_msec_slot, - 0, - offsetof(ngx_event_conf_t, accept_mutex_delay), - NULL }, - - { ngx_string("debug_connection"), - NGX_EVENT_CONF|NGX_CONF_TAKE1, - ngx_event_debug_connection, - 0, - 0, - NULL }, - - ngx_null_command -}; - - -static ngx_event_module_t ngx_event_core_module_ctx = { - &event_core_name, - ngx_event_core_create_conf, /* create configuration */ - ngx_event_core_init_conf, /* init configuration */ - - { NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL } -}; - - -ngx_module_t ngx_event_core_module = { - NGX_MODULE_V1, - &ngx_event_core_module_ctx, /* module context */ - ngx_event_core_commands, /* module directives */ - NGX_EVENT_MODULE, /* module type */ - NULL, /* init master */ - ngx_event_module_init, /* init module */ - ngx_event_process_init, /* init process */ - NULL, /* init thread */ - NULL, /* exit thread */ - NULL, /* exit process */ - NULL, /* exit master */ - NGX_MODULE_V1_PADDING -}; - - -void -ngx_process_events_and_timers(ngx_cycle_t *cycle) -{ - ngx_uint_t flags; - ngx_msec_t timer, delta; - - if (ngx_timer_resolution) { - timer = NGX_TIMER_INFINITE; - flags = 0; - - } else { - timer = ngx_event_find_timer(); - flags = NGX_UPDATE_TIME; - -#if (NGX_WIN32) - - /* handle signals from master in case of network inactivity */ - - if (timer == NGX_TIMER_INFINITE || timer > 500) { - timer = 500; - } - -#endif - } - - if (ngx_use_accept_mutex) { - if (ngx_accept_disabled > 0) { - ngx_accept_disabled--; - - } else { - if (ngx_trylock_accept_mutex(cycle) == NGX_ERROR) { - return; - } - - if (ngx_accept_mutex_held) { - flags |= NGX_POST_EVENTS; - - } else { - if (timer == NGX_TIMER_INFINITE - || timer > ngx_accept_mutex_delay) - { - timer = ngx_accept_mutex_delay; - } - } - } - } - - if (!ngx_queue_empty(&ngx_posted_next_events)) { - ngx_event_move_posted_next(cycle); - timer = 0; - } - - delta = ngx_current_msec; - - (void) ngx_process_events(cycle, timer, flags); - - delta = ngx_current_msec - delta; - - ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0, - "timer delta: %M", delta); - - ngx_event_process_posted(cycle, &ngx_posted_accept_events); - - if (ngx_accept_mutex_held) { - ngx_shmtx_unlock(&ngx_accept_mutex); - } - - ngx_event_expire_timers(); - - ngx_event_process_posted(cycle, &ngx_posted_events); -} - - -ngx_int_t -ngx_handle_read_event(ngx_event_t *rev, ngx_uint_t flags) -{ -#if (NGX_QUIC) - - ngx_connection_t *c; - - c = rev->data; - - if (c->quic) { - return NGX_OK; - } - -#endif - - if (ngx_event_flags & NGX_USE_CLEAR_EVENT) { - - /* kqueue, epoll */ - - if (!rev->active && !rev->ready) { - if (ngx_add_event(rev, NGX_READ_EVENT, NGX_CLEAR_EVENT) - == NGX_ERROR) - { - return NGX_ERROR; - } - } - - return NGX_OK; - - } else if (ngx_event_flags & NGX_USE_LEVEL_EVENT) { - - /* select, poll, /dev/poll */ - - if (!rev->active && !rev->ready) { - if (ngx_add_event(rev, NGX_READ_EVENT, NGX_LEVEL_EVENT) - == NGX_ERROR) - { - return NGX_ERROR; - } - - return NGX_OK; - } - - if (rev->active && (rev->ready || (flags & NGX_CLOSE_EVENT))) { - if (ngx_del_event(rev, NGX_READ_EVENT, NGX_LEVEL_EVENT | flags) - == NGX_ERROR) - { - return NGX_ERROR; - } - - return NGX_OK; - } - - } else if (ngx_event_flags & NGX_USE_EVENTPORT_EVENT) { - - /* event ports */ - - if (!rev->active && !rev->ready) { - if (ngx_add_event(rev, NGX_READ_EVENT, 0) == NGX_ERROR) { - return NGX_ERROR; - } - - return NGX_OK; - } - - if (rev->oneshot && rev->ready) { - if (ngx_del_event(rev, NGX_READ_EVENT, 0) == NGX_ERROR) { - return NGX_ERROR; - } - - return NGX_OK; - } - } - - /* iocp */ - - return NGX_OK; -} - - -ngx_int_t -ngx_handle_write_event(ngx_event_t *wev, size_t lowat) -{ - ngx_connection_t *c; - - c = wev->data; - -#if (NGX_QUIC) - if (c->quic) { - return NGX_OK; - } -#endif - - if (lowat) { - if (ngx_send_lowat(c, lowat) == NGX_ERROR) { - return NGX_ERROR; - } - } - - if (ngx_event_flags & NGX_USE_CLEAR_EVENT) { - - /* kqueue, epoll */ - - if (!wev->active && !wev->ready) { - if (ngx_add_event(wev, NGX_WRITE_EVENT, - NGX_CLEAR_EVENT | (lowat ? NGX_LOWAT_EVENT : 0)) - == NGX_ERROR) - { - return NGX_ERROR; - } - } - - return NGX_OK; - - } else if (ngx_event_flags & NGX_USE_LEVEL_EVENT) { - - /* select, poll, /dev/poll */ - - if (!wev->active && !wev->ready) { - if (ngx_add_event(wev, NGX_WRITE_EVENT, NGX_LEVEL_EVENT) - == NGX_ERROR) - { - return NGX_ERROR; - } - - return NGX_OK; - } - - if (wev->active && wev->ready) { - if (ngx_del_event(wev, NGX_WRITE_EVENT, NGX_LEVEL_EVENT) - == NGX_ERROR) - { - return NGX_ERROR; - } - - return NGX_OK; - } - - } else if (ngx_event_flags & NGX_USE_EVENTPORT_EVENT) { - - /* event ports */ - - if (!wev->active && !wev->ready) { - if (ngx_add_event(wev, NGX_WRITE_EVENT, 0) == NGX_ERROR) { - return NGX_ERROR; - } - - return NGX_OK; - } - - if (wev->oneshot && wev->ready) { - if (ngx_del_event(wev, NGX_WRITE_EVENT, 0) == NGX_ERROR) { - return NGX_ERROR; - } - - return NGX_OK; - } - } - - /* iocp */ - - return NGX_OK; -} - - -static char * -ngx_event_init_conf(ngx_cycle_t *cycle, void *conf) -{ -#if (NGX_HAVE_REUSEPORT) - ngx_uint_t i; - ngx_core_conf_t *ccf; - ngx_listening_t *ls; -#endif - - if (ngx_get_conf(cycle->conf_ctx, ngx_events_module) == NULL) { - ngx_log_error(NGX_LOG_EMERG, cycle->log, 0, - "no \"events\" section in configuration"); - return NGX_CONF_ERROR; - } - - if (cycle->connection_n < cycle->listening.nelts + 1) { - - /* - * there should be at least one connection for each listening - * socket, plus an additional connection for channel - */ - - ngx_log_error(NGX_LOG_EMERG, cycle->log, 0, - "%ui worker_connections are not enough " - "for %ui listening sockets", - cycle->connection_n, cycle->listening.nelts); - - return NGX_CONF_ERROR; - } - -#if (NGX_HAVE_REUSEPORT) - - ccf = (ngx_core_conf_t *) ngx_get_conf(cycle->conf_ctx, ngx_core_module); - - if (!ngx_test_config && ccf->master) { - - ls = cycle->listening.elts; - for (i = 0; i < cycle->listening.nelts; i++) { - - if (!ls[i].reuseport || ls[i].worker != 0) { - continue; - } - - if (ngx_clone_listening(cycle, &ls[i]) != NGX_OK) { - return NGX_CONF_ERROR; - } - - /* cloning may change cycle->listening.elts */ - - ls = cycle->listening.elts; - } - } - -#endif - - return NGX_CONF_OK; -} - - -static ngx_int_t -ngx_event_module_init(ngx_cycle_t *cycle) -{ - void ***cf; - u_char *shared; - size_t size, cl; - ngx_shm_t shm; - ngx_time_t *tp; - ngx_core_conf_t *ccf; - ngx_event_conf_t *ecf; - - cf = ngx_get_conf(cycle->conf_ctx, ngx_events_module); - ecf = (*cf)[ngx_event_core_module.ctx_index]; - - if (!ngx_test_config && ngx_process <= NGX_PROCESS_MASTER) { - ngx_log_error(NGX_LOG_NOTICE, cycle->log, 0, - "using the \"%s\" event method", ecf->name); - } - - ccf = (ngx_core_conf_t *) ngx_get_conf(cycle->conf_ctx, ngx_core_module); - - ngx_timer_resolution = ccf->timer_resolution; - -#if !(NGX_WIN32) - { - ngx_int_t limit; - struct rlimit rlmt; - - if (getrlimit(RLIMIT_NOFILE, &rlmt) == -1) { - ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno, - "getrlimit(RLIMIT_NOFILE) failed, ignored"); - - } else { - if (ecf->connections > (ngx_uint_t) rlmt.rlim_cur - && (ccf->rlimit_nofile == NGX_CONF_UNSET - || ecf->connections > (ngx_uint_t) ccf->rlimit_nofile)) - { - limit = (ccf->rlimit_nofile == NGX_CONF_UNSET) ? - (ngx_int_t) rlmt.rlim_cur : ccf->rlimit_nofile; - - ngx_log_error(NGX_LOG_WARN, cycle->log, 0, - "%ui worker_connections exceed " - "open file resource limit: %i", - ecf->connections, limit); - } - } - } -#endif /* !(NGX_WIN32) */ - - - if (ccf->master == 0) { - return NGX_OK; - } - - if (ngx_accept_mutex_ptr) { - return NGX_OK; - } - - - /* cl should be equal to or greater than cache line size */ - - cl = 128; - - size = cl /* ngx_accept_mutex */ - + cl /* ngx_connection_counter */ - + cl; /* ngx_temp_number */ - -#if (NGX_STAT_STUB) - - size += cl /* ngx_stat_accepted */ - + cl /* ngx_stat_handled */ - + cl /* ngx_stat_requests */ - + cl /* ngx_stat_active */ - + cl /* ngx_stat_reading */ - + cl /* ngx_stat_writing */ - + cl; /* ngx_stat_waiting */ - -#endif - - shm.size = size; - ngx_str_set(&shm.name, "nginx_shared_zone"); - shm.log = cycle->log; - - if (ngx_shm_alloc(&shm) != NGX_OK) { - return NGX_ERROR; - } - - shared = shm.addr; - - ngx_accept_mutex_ptr = (ngx_atomic_t *) shared; - ngx_accept_mutex.spin = (ngx_uint_t) -1; - - if (ngx_shmtx_create(&ngx_accept_mutex, (ngx_shmtx_sh_t *) shared, - cycle->lock_file.data) - != NGX_OK) - { - return NGX_ERROR; - } - - ngx_connection_counter = (ngx_atomic_t *) (shared + 1 * cl); - - (void) ngx_atomic_cmp_set(ngx_connection_counter, 0, 1); - - ngx_log_debug2(NGX_LOG_DEBUG_EVENT, cycle->log, 0, - "counter: %p, %uA", - ngx_connection_counter, *ngx_connection_counter); - - ngx_temp_number = (ngx_atomic_t *) (shared + 2 * cl); - - tp = ngx_timeofday(); - - ngx_random_number = (tp->msec << 16) + ngx_pid; - -#if (NGX_STAT_STUB) - - ngx_stat_accepted = (ngx_atomic_t *) (shared + 3 * cl); - ngx_stat_handled = (ngx_atomic_t *) (shared + 4 * cl); - ngx_stat_requests = (ngx_atomic_t *) (shared + 5 * cl); - ngx_stat_active = (ngx_atomic_t *) (shared + 6 * cl); - ngx_stat_reading = (ngx_atomic_t *) (shared + 7 * cl); - ngx_stat_writing = (ngx_atomic_t *) (shared + 8 * cl); - ngx_stat_waiting = (ngx_atomic_t *) (shared + 9 * cl); - -#endif - - return NGX_OK; -} - - -#if !(NGX_WIN32) - -static void -ngx_timer_signal_handler(int signo) -{ - ngx_event_timer_alarm = 1; - -#if 1 - ngx_log_debug0(NGX_LOG_DEBUG_EVENT, ngx_cycle->log, 0, "timer signal"); -#endif -} - -#endif - - -static ngx_int_t -ngx_event_process_init(ngx_cycle_t *cycle) -{ - ngx_uint_t m, i; - ngx_event_t *rev, *wev; - ngx_listening_t *ls; - ngx_connection_t *c, *next, *old; - ngx_core_conf_t *ccf; - ngx_event_conf_t *ecf; - ngx_event_module_t *module; - - ccf = (ngx_core_conf_t *) ngx_get_conf(cycle->conf_ctx, ngx_core_module); - ecf = ngx_event_get_conf(cycle->conf_ctx, ngx_event_core_module); - - if (ccf->master && ccf->worker_processes > 1 && ecf->accept_mutex) { - ngx_use_accept_mutex = 1; - ngx_accept_mutex_held = 0; - ngx_accept_mutex_delay = ecf->accept_mutex_delay; - - } else { - ngx_use_accept_mutex = 0; - } - -#if (NGX_WIN32) - - /* - * disable accept mutex on win32 as it may cause deadlock if - * grabbed by a process which can't accept connections - */ - - ngx_use_accept_mutex = 0; - -#endif - - ngx_use_exclusive_accept = 0; - - ngx_queue_init(&ngx_posted_accept_events); - ngx_queue_init(&ngx_posted_next_events); - ngx_queue_init(&ngx_posted_events); - - if (ngx_event_timer_init(cycle->log) == NGX_ERROR) { - return NGX_ERROR; - } - - for (m = 0; cycle->modules[m]; m++) { - if (cycle->modules[m]->type != NGX_EVENT_MODULE) { - continue; - } - - if (cycle->modules[m]->ctx_index != ecf->use) { - continue; - } - - module = cycle->modules[m]->ctx; - - if (module->actions.init(cycle, ngx_timer_resolution) != NGX_OK) { - /* fatal */ - exit(2); - } - - break; - } - -#if !(NGX_WIN32) - - if (ngx_timer_resolution && !(ngx_event_flags & NGX_USE_TIMER_EVENT)) { - struct sigaction sa; - struct itimerval itv; - - ngx_memzero(&sa, sizeof(struct sigaction)); - sa.sa_handler = ngx_timer_signal_handler; - sigemptyset(&sa.sa_mask); - - if (sigaction(SIGALRM, &sa, NULL) == -1) { - ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno, - "sigaction(SIGALRM) failed"); - return NGX_ERROR; - } - - itv.it_interval.tv_sec = ngx_timer_resolution / 1000; - itv.it_interval.tv_usec = (ngx_timer_resolution % 1000) * 1000; - itv.it_value.tv_sec = ngx_timer_resolution / 1000; - itv.it_value.tv_usec = (ngx_timer_resolution % 1000 ) * 1000; - - if (setitimer(ITIMER_REAL, &itv, NULL) == -1) { - ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno, - "setitimer() failed"); - } - } - - if (ngx_event_flags & NGX_USE_FD_EVENT) { - struct rlimit rlmt; - - if (getrlimit(RLIMIT_NOFILE, &rlmt) == -1) { - ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno, - "getrlimit(RLIMIT_NOFILE) failed"); - return NGX_ERROR; - } - - cycle->files_n = (ngx_uint_t) rlmt.rlim_cur; - - cycle->files = ngx_calloc(sizeof(ngx_connection_t *) * cycle->files_n, - cycle->log); - if (cycle->files == NULL) { - return NGX_ERROR; - } - } - -#else - - if (ngx_timer_resolution && !(ngx_event_flags & NGX_USE_TIMER_EVENT)) { - ngx_log_error(NGX_LOG_WARN, cycle->log, 0, - "the \"timer_resolution\" directive is not supported " - "with the configured event method, ignored"); - ngx_timer_resolution = 0; - } - -#endif - - cycle->connections = - ngx_alloc(sizeof(ngx_connection_t) * cycle->connection_n, cycle->log); - if (cycle->connections == NULL) { - return NGX_ERROR; - } - - c = cycle->connections; - - cycle->read_events = ngx_alloc(sizeof(ngx_event_t) * cycle->connection_n, - cycle->log); - if (cycle->read_events == NULL) { - return NGX_ERROR; - } - - rev = cycle->read_events; - for (i = 0; i < cycle->connection_n; i++) { - rev[i].closed = 1; - rev[i].instance = 1; - } - - cycle->write_events = ngx_alloc(sizeof(ngx_event_t) * cycle->connection_n, - cycle->log); - if (cycle->write_events == NULL) { - return NGX_ERROR; - } - - wev = cycle->write_events; - for (i = 0; i < cycle->connection_n; i++) { - wev[i].closed = 1; - } - - i = cycle->connection_n; - next = NULL; - - do { - i--; - - c[i].data = next; - c[i].read = &cycle->read_events[i]; - c[i].write = &cycle->write_events[i]; - c[i].fd = (ngx_socket_t) -1; - - next = &c[i]; - } while (i); - - cycle->free_connections = next; - cycle->free_connection_n = cycle->connection_n; - - /* for each listening socket */ - - ls = cycle->listening.elts; - for (i = 0; i < cycle->listening.nelts; i++) { - -#if (NGX_HAVE_REUSEPORT) - if (ls[i].reuseport && ls[i].worker != ngx_worker) { - continue; - } -#endif - - c = ngx_get_connection(ls[i].fd, cycle->log); - - if (c == NULL) { - return NGX_ERROR; - } - - c->type = ls[i].type; - c->log = &ls[i].log; - - c->listening = &ls[i]; - ls[i].connection = c; - - rev = c->read; - - rev->log = c->log; - rev->accept = 1; - -#if (NGX_HAVE_DEFERRED_ACCEPT) - rev->deferred_accept = ls[i].deferred_accept; -#endif - - if (!(ngx_event_flags & NGX_USE_IOCP_EVENT) - && cycle->old_cycle) - { - if (ls[i].previous) { - - /* - * delete the old accept events that were bound to - * the old cycle read events array - */ - - old = ls[i].previous->connection; - - if (ngx_del_event(old->read, NGX_READ_EVENT, NGX_CLOSE_EVENT) - == NGX_ERROR) - { - return NGX_ERROR; - } - - old->fd = (ngx_socket_t) -1; - } - } - -#if (NGX_WIN32) - - if (ngx_event_flags & NGX_USE_IOCP_EVENT) { - ngx_iocp_conf_t *iocpcf; - - rev->handler = ngx_event_acceptex; - - if (ngx_use_accept_mutex) { - continue; - } - - if (ngx_add_event(rev, 0, NGX_IOCP_ACCEPT) == NGX_ERROR) { - return NGX_ERROR; - } - - ls[i].log.handler = ngx_acceptex_log_error; - - iocpcf = ngx_event_get_conf(cycle->conf_ctx, ngx_iocp_module); - if (ngx_event_post_acceptex(&ls[i], iocpcf->post_acceptex) - == NGX_ERROR) - { - return NGX_ERROR; - } - - } else { - rev->handler = ngx_event_accept; - - if (ngx_use_accept_mutex) { - continue; - } - - if (ngx_add_event(rev, NGX_READ_EVENT, 0) == NGX_ERROR) { - return NGX_ERROR; - } - } - -#else - - if (c->type == SOCK_STREAM) { - rev->handler = ngx_event_accept; - -#if (NGX_QUIC) - } else if (ls[i].quic) { - rev->handler = ngx_quic_recvmsg; -#endif - } else { - rev->handler = ngx_event_recvmsg; - } - -#if (NGX_HAVE_REUSEPORT) - - if (ls[i].reuseport) { - if (ngx_add_event(rev, NGX_READ_EVENT, 0) == NGX_ERROR) { - return NGX_ERROR; - } - - continue; - } - -#endif - - if (ngx_use_accept_mutex) { - continue; - } - -#if (NGX_HAVE_EPOLLEXCLUSIVE) - - if ((ngx_event_flags & NGX_USE_EPOLL_EVENT) - && ccf->worker_processes > 1) - { - ngx_use_exclusive_accept = 1; - - if (ngx_add_event(rev, NGX_READ_EVENT, NGX_EXCLUSIVE_EVENT) - == NGX_ERROR) - { - return NGX_ERROR; - } - - continue; - } - -#endif - - if (ngx_add_event(rev, NGX_READ_EVENT, 0) == NGX_ERROR) { - return NGX_ERROR; - } - -#endif - - } - - return NGX_OK; -} - - -ngx_int_t -ngx_send_lowat(ngx_connection_t *c, size_t lowat) -{ - int sndlowat; - -#if (NGX_HAVE_LOWAT_EVENT) - - if (ngx_event_flags & NGX_USE_KQUEUE_EVENT) { - c->write->available = lowat; - return NGX_OK; - } - -#endif - - if (lowat == 0 || c->sndlowat) { - return NGX_OK; - } - - sndlowat = (int) lowat; - - if (setsockopt(c->fd, SOL_SOCKET, SO_SNDLOWAT, - (const void *) &sndlowat, sizeof(int)) - == -1) - { - ngx_connection_error(c, ngx_socket_errno, - "setsockopt(SO_SNDLOWAT) failed"); - return NGX_ERROR; - } - - c->sndlowat = 1; - - return NGX_OK; -} - - -static char * -ngx_events_block(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) -{ - char *rv; - void ***ctx; - ngx_uint_t i; - ngx_conf_t pcf; - ngx_event_module_t *m; - - if (*(void **) conf) { - return "is duplicate"; - } - - /* count the number of the event modules and set up their indices */ - - ngx_event_max_module = ngx_count_modules(cf->cycle, NGX_EVENT_MODULE); - - ctx = ngx_pcalloc(cf->pool, sizeof(void *)); - if (ctx == NULL) { - return NGX_CONF_ERROR; - } - - *ctx = ngx_pcalloc(cf->pool, ngx_event_max_module * sizeof(void *)); - if (*ctx == NULL) { - return NGX_CONF_ERROR; - } - - *(void **) conf = ctx; - - for (i = 0; cf->cycle->modules[i]; i++) { - if (cf->cycle->modules[i]->type != NGX_EVENT_MODULE) { - continue; - } - - m = cf->cycle->modules[i]->ctx; - - if (m->create_conf) { - (*ctx)[cf->cycle->modules[i]->ctx_index] = - m->create_conf(cf->cycle); - if ((*ctx)[cf->cycle->modules[i]->ctx_index] == NULL) { - return NGX_CONF_ERROR; - } - } - } - - pcf = *cf; - cf->ctx = ctx; - cf->module_type = NGX_EVENT_MODULE; - cf->cmd_type = NGX_EVENT_CONF; - - rv = ngx_conf_parse(cf, NULL); - - *cf = pcf; - - if (rv != NGX_CONF_OK) { - return rv; - } - - for (i = 0; cf->cycle->modules[i]; i++) { - if (cf->cycle->modules[i]->type != NGX_EVENT_MODULE) { - continue; - } - - m = cf->cycle->modules[i]->ctx; - - if (m->init_conf) { - rv = m->init_conf(cf->cycle, - (*ctx)[cf->cycle->modules[i]->ctx_index]); - if (rv != NGX_CONF_OK) { - return rv; - } - } - } - - return NGX_CONF_OK; -} - - -static char * -ngx_event_connections(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) -{ - ngx_event_conf_t *ecf = conf; - - ngx_str_t *value; - - if (ecf->connections != NGX_CONF_UNSET_UINT) { - return "is duplicate"; - } - - value = cf->args->elts; - ecf->connections = ngx_atoi(value[1].data, value[1].len); - if (ecf->connections == (ngx_uint_t) NGX_ERROR) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "invalid number \"%V\"", &value[1]); - - return NGX_CONF_ERROR; - } - - cf->cycle->connection_n = ecf->connections; - - return NGX_CONF_OK; -} - - -static char * -ngx_event_use(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) -{ - ngx_event_conf_t *ecf = conf; - - ngx_int_t m; - ngx_str_t *value; - ngx_event_conf_t *old_ecf; - ngx_event_module_t *module; - - if (ecf->use != NGX_CONF_UNSET_UINT) { - return "is duplicate"; - } - - value = cf->args->elts; - - if (cf->cycle->old_cycle->conf_ctx) { - old_ecf = ngx_event_get_conf(cf->cycle->old_cycle->conf_ctx, - ngx_event_core_module); - } else { - old_ecf = NULL; - } - - - for (m = 0; cf->cycle->modules[m]; m++) { - if (cf->cycle->modules[m]->type != NGX_EVENT_MODULE) { - continue; - } - - module = cf->cycle->modules[m]->ctx; - if (module->name->len == value[1].len) { - if (ngx_strcmp(module->name->data, value[1].data) == 0) { - ecf->use = cf->cycle->modules[m]->ctx_index; - ecf->name = module->name->data; - - if (ngx_process == NGX_PROCESS_SINGLE - && old_ecf - && old_ecf->use != ecf->use) - { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "when the server runs without a master process " - "the \"%V\" event type must be the same as " - "in previous configuration - \"%s\" " - "and it cannot be changed on the fly, " - "to change it you need to stop server " - "and start it again", - &value[1], old_ecf->name); - - return NGX_CONF_ERROR; - } - - return NGX_CONF_OK; - } - } - } - - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "invalid event type \"%V\"", &value[1]); - - return NGX_CONF_ERROR; -} - - -static char * -ngx_event_debug_connection(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) -{ -#if (NGX_DEBUG) - ngx_event_conf_t *ecf = conf; - - ngx_int_t rc; - ngx_str_t *value; - ngx_url_t u; - ngx_cidr_t c, *cidr; - ngx_uint_t i; - struct sockaddr_in *sin; -#if (NGX_HAVE_INET6) - struct sockaddr_in6 *sin6; -#endif - - value = cf->args->elts; - -#if (NGX_HAVE_UNIX_DOMAIN) - - if (ngx_strcmp(value[1].data, "unix:") == 0) { - cidr = ngx_array_push(&ecf->debug_connection); - if (cidr == NULL) { - return NGX_CONF_ERROR; - } - - cidr->family = AF_UNIX; - return NGX_CONF_OK; - } - -#endif - - rc = ngx_ptocidr(&value[1], &c); - - if (rc != NGX_ERROR) { - if (rc == NGX_DONE) { - ngx_conf_log_error(NGX_LOG_WARN, cf, 0, - "low address bits of %V are meaningless", - &value[1]); - } - - cidr = ngx_array_push(&ecf->debug_connection); - if (cidr == NULL) { - return NGX_CONF_ERROR; - } - - *cidr = c; - - return NGX_CONF_OK; - } - - ngx_memzero(&u, sizeof(ngx_url_t)); - u.host = value[1]; - - if (ngx_inet_resolve_host(cf->pool, &u) != NGX_OK) { - if (u.err) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "%s in debug_connection \"%V\"", - u.err, &u.host); - } - - return NGX_CONF_ERROR; - } - - cidr = ngx_array_push_n(&ecf->debug_connection, u.naddrs); - if (cidr == NULL) { - return NGX_CONF_ERROR; - } - - ngx_memzero(cidr, u.naddrs * sizeof(ngx_cidr_t)); - - for (i = 0; i < u.naddrs; i++) { - cidr[i].family = u.addrs[i].sockaddr->sa_family; - - switch (cidr[i].family) { - -#if (NGX_HAVE_INET6) - case AF_INET6: - sin6 = (struct sockaddr_in6 *) u.addrs[i].sockaddr; - cidr[i].u.in6.addr = sin6->sin6_addr; - ngx_memset(cidr[i].u.in6.mask.s6_addr, 0xff, 16); - break; -#endif - - default: /* AF_INET */ - sin = (struct sockaddr_in *) u.addrs[i].sockaddr; - cidr[i].u.in.addr = sin->sin_addr.s_addr; - cidr[i].u.in.mask = 0xffffffff; - break; - } - } - -#else - - ngx_conf_log_error(NGX_LOG_WARN, cf, 0, - "\"debug_connection\" is ignored, you need to rebuild " - "nginx using --with-debug option to enable it"); - -#endif - - return NGX_CONF_OK; -} - - -static void * -ngx_event_core_create_conf(ngx_cycle_t *cycle) -{ - ngx_event_conf_t *ecf; - - ecf = ngx_palloc(cycle->pool, sizeof(ngx_event_conf_t)); - if (ecf == NULL) { - return NULL; - } - - ecf->connections = NGX_CONF_UNSET_UINT; - ecf->use = NGX_CONF_UNSET_UINT; - ecf->multi_accept = NGX_CONF_UNSET; - ecf->accept_mutex = NGX_CONF_UNSET; - ecf->accept_mutex_delay = NGX_CONF_UNSET_MSEC; - ecf->name = (void *) NGX_CONF_UNSET; - -#if (NGX_DEBUG) - - if (ngx_array_init(&ecf->debug_connection, cycle->pool, 4, - sizeof(ngx_cidr_t)) == NGX_ERROR) - { - return NULL; - } - -#endif - - return ecf; -} - - -static char * -ngx_event_core_init_conf(ngx_cycle_t *cycle, void *conf) -{ - ngx_event_conf_t *ecf = conf; - -#if (NGX_HAVE_EPOLL) && !(NGX_TEST_BUILD_EPOLL) - int fd; -#endif - ngx_int_t i; - ngx_module_t *module; - ngx_event_module_t *event_module; - - module = NULL; - -#if (NGX_HAVE_EPOLL) && !(NGX_TEST_BUILD_EPOLL) - - fd = epoll_create(100); - - if (fd != -1) { - (void) close(fd); - module = &ngx_epoll_module; - - } else if (ngx_errno != NGX_ENOSYS) { - module = &ngx_epoll_module; - } - -#endif - -#if (NGX_HAVE_DEVPOLL) && !(NGX_TEST_BUILD_DEVPOLL) - - module = &ngx_devpoll_module; - -#endif - -#if (NGX_HAVE_KQUEUE) - - module = &ngx_kqueue_module; - -#endif - -#if (NGX_HAVE_SELECT) - - if (module == NULL) { - module = &ngx_select_module; - } - -#endif - - if (module == NULL) { - for (i = 0; cycle->modules[i]; i++) { - - if (cycle->modules[i]->type != NGX_EVENT_MODULE) { - continue; - } - - event_module = cycle->modules[i]->ctx; - - if (ngx_strcmp(event_module->name->data, event_core_name.data) == 0) - { - continue; - } - - module = cycle->modules[i]; - break; - } - } - - if (module == NULL) { - ngx_log_error(NGX_LOG_EMERG, cycle->log, 0, "no events module found"); - return NGX_CONF_ERROR; - } - - ngx_conf_init_uint_value(ecf->connections, DEFAULT_CONNECTIONS); - cycle->connection_n = ecf->connections; - - ngx_conf_init_uint_value(ecf->use, module->ctx_index); - - event_module = module->ctx; - ngx_conf_init_ptr_value(ecf->name, event_module->name->data); - - ngx_conf_init_value(ecf->multi_accept, 0); - ngx_conf_init_value(ecf->accept_mutex, 0); - ngx_conf_init_msec_value(ecf->accept_mutex_delay, 500); - - return NGX_CONF_OK; -} diff --git a/src/deps/src/nginx-1.30.3/src/event/ngx_event.h b/src/deps/src/nginx-1.30.3/src/event/ngx_event.h deleted file mode 100644 index deac04e7b9..0000000000 --- a/src/deps/src/nginx-1.30.3/src/event/ngx_event.h +++ /dev/null @@ -1,533 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#ifndef _NGX_EVENT_H_INCLUDED_ -#define _NGX_EVENT_H_INCLUDED_ - - -#include -#include - - -#define NGX_INVALID_INDEX 0xd0d0d0d0 - - -#if (NGX_HAVE_IOCP) - -typedef struct { - WSAOVERLAPPED ovlp; - ngx_event_t *event; - int error; -} ngx_event_ovlp_t; - -#endif - - -struct ngx_event_s { - void *data; - - unsigned write:1; - - unsigned accept:1; - - /* used to detect the stale events in kqueue and epoll */ - unsigned instance:1; - - /* - * the event was passed or would be passed to a kernel; - * in aio mode - operation was posted. - */ - unsigned active:1; - - unsigned disabled:1; - - /* the ready event; in aio mode 0 means that no operation can be posted */ - unsigned ready:1; - - unsigned oneshot:1; - - /* aio operation is complete */ - unsigned complete:1; - - unsigned eof:1; - unsigned error:1; - - unsigned timedout:1; - unsigned timer_set:1; - - unsigned delayed:1; - - unsigned deferred_accept:1; - - /* the pending eof reported by kqueue, epoll or in aio chain operation */ - unsigned pending_eof:1; - - unsigned posted:1; - - unsigned closed:1; - - /* to test on worker exit */ - unsigned channel:1; - unsigned resolver:1; - - unsigned cancelable:1; - -#if (NGX_HAVE_KQUEUE) - unsigned kq_vnode:1; - - /* the pending errno reported by kqueue */ - int kq_errno; -#endif - - /* - * kqueue only: - * accept: number of sockets that wait to be accepted - * read: bytes to read when event is ready - * or lowat when event is set with NGX_LOWAT_EVENT flag - * write: available space in buffer when event is ready - * or lowat when event is set with NGX_LOWAT_EVENT flag - * - * iocp: TODO - * - * otherwise: - * accept: 1 if accept many, 0 otherwise - * read: bytes to read when event is ready, -1 if not known - */ - - int available; - - ngx_event_handler_pt handler; - - -#if (NGX_HAVE_IOCP) - ngx_event_ovlp_t ovlp; -#endif - - ngx_uint_t index; - - ngx_log_t *log; - - ngx_rbtree_node_t timer; - - /* the posted queue */ - ngx_queue_t queue; - -#if 0 - - /* the threads support */ - - /* - * the event thread context, we store it here - * if $(CC) does not understand __thread declaration - * and pthread_getspecific() is too costly - */ - - void *thr_ctx; - -#if (NGX_EVENT_T_PADDING) - - /* event should not cross cache line in SMP */ - - uint32_t padding[NGX_EVENT_T_PADDING]; -#endif -#endif -}; - - -#if (NGX_HAVE_FILE_AIO) - -struct ngx_event_aio_s { - void *data; - ngx_event_handler_pt handler; - ngx_file_t *file; - - ngx_fd_t fd; - -#if (NGX_HAVE_EVENTFD) - int64_t res; -#endif - -#if !(NGX_HAVE_EVENTFD) || (NGX_TEST_BUILD_EPOLL) - ngx_err_t err; - size_t nbytes; -#endif - - ngx_aiocb_t aiocb; - ngx_event_t event; -}; - -#endif - - -typedef struct { - ngx_int_t (*add)(ngx_event_t *ev, ngx_int_t event, ngx_uint_t flags); - ngx_int_t (*del)(ngx_event_t *ev, ngx_int_t event, ngx_uint_t flags); - - ngx_int_t (*enable)(ngx_event_t *ev, ngx_int_t event, ngx_uint_t flags); - ngx_int_t (*disable)(ngx_event_t *ev, ngx_int_t event, ngx_uint_t flags); - - ngx_int_t (*add_conn)(ngx_connection_t *c); - ngx_int_t (*del_conn)(ngx_connection_t *c, ngx_uint_t flags); - - ngx_int_t (*notify)(ngx_event_handler_pt handler); - - ngx_int_t (*process_events)(ngx_cycle_t *cycle, ngx_msec_t timer, - ngx_uint_t flags); - - ngx_int_t (*init)(ngx_cycle_t *cycle, ngx_msec_t timer); - void (*done)(ngx_cycle_t *cycle); -} ngx_event_actions_t; - - -extern ngx_event_actions_t ngx_event_actions; -#if (NGX_HAVE_EPOLLRDHUP) -extern ngx_uint_t ngx_use_epoll_rdhup; -#endif - - -/* - * The event filter requires to read/write the whole data: - * select, poll, /dev/poll, kqueue, epoll. - */ -#define NGX_USE_LEVEL_EVENT 0x00000001 - -/* - * The event filter is deleted after a notification without an additional - * syscall: kqueue, epoll. - */ -#define NGX_USE_ONESHOT_EVENT 0x00000002 - -/* - * The event filter notifies only the changes and an initial level: - * kqueue, epoll. - */ -#define NGX_USE_CLEAR_EVENT 0x00000004 - -/* - * The event filter has kqueue features: the eof flag, errno, - * available data, etc. - */ -#define NGX_USE_KQUEUE_EVENT 0x00000008 - -/* - * The event filter supports low water mark: kqueue's NOTE_LOWAT. - * kqueue in FreeBSD 4.1-4.2 has no NOTE_LOWAT so we need a separate flag. - */ -#define NGX_USE_LOWAT_EVENT 0x00000010 - -/* - * The event filter requires to do i/o operation until EAGAIN: epoll. - */ -#define NGX_USE_GREEDY_EVENT 0x00000020 - -/* - * The event filter is epoll. - */ -#define NGX_USE_EPOLL_EVENT 0x00000040 - -/* - * Obsolete. - */ -#define NGX_USE_RTSIG_EVENT 0x00000080 - -/* - * Obsolete. - */ -#define NGX_USE_AIO_EVENT 0x00000100 - -/* - * Need to add socket or handle only once: i/o completion port. - */ -#define NGX_USE_IOCP_EVENT 0x00000200 - -/* - * The event filter has no opaque data and requires file descriptors table: - * poll, /dev/poll. - */ -#define NGX_USE_FD_EVENT 0x00000400 - -/* - * The event module handles periodic or absolute timer event by itself: - * kqueue in FreeBSD 4.4, NetBSD 2.0, and MacOSX 10.4, Solaris 10's event ports. - */ -#define NGX_USE_TIMER_EVENT 0x00000800 - -/* - * All event filters on file descriptor are deleted after a notification: - * Solaris 10's event ports. - */ -#define NGX_USE_EVENTPORT_EVENT 0x00001000 - -/* - * The event filter support vnode notifications: kqueue. - */ -#define NGX_USE_VNODE_EVENT 0x00002000 - - -/* - * The event filter is deleted just before the closing file. - * Has no meaning for select and poll. - * kqueue, epoll, eventport: allows to avoid explicit delete, - * because filter automatically is deleted - * on file close, - * - * /dev/poll: we need to flush POLLREMOVE event - * before closing file. - */ -#define NGX_CLOSE_EVENT 1 - -/* - * disable temporarily event filter, this may avoid locks - * in kernel malloc()/free(): kqueue. - */ -#define NGX_DISABLE_EVENT 2 - -/* - * event must be passed to kernel right now, do not wait until batch processing. - */ -#define NGX_FLUSH_EVENT 4 - - -/* these flags have a meaning only for kqueue */ -#define NGX_LOWAT_EVENT 0 -#define NGX_VNODE_EVENT 0 - - -#if (NGX_HAVE_EPOLL) && !(NGX_HAVE_EPOLLRDHUP) -#define EPOLLRDHUP 0 -#endif - - -#if (NGX_HAVE_KQUEUE) - -#define NGX_READ_EVENT EVFILT_READ -#define NGX_WRITE_EVENT EVFILT_WRITE - -#undef NGX_VNODE_EVENT -#define NGX_VNODE_EVENT EVFILT_VNODE - -/* - * NGX_CLOSE_EVENT, NGX_LOWAT_EVENT, and NGX_FLUSH_EVENT are the module flags - * and they must not go into a kernel so we need to choose the value - * that must not interfere with any existent and future kqueue flags. - * kqueue has such values - EV_FLAG1, EV_EOF, and EV_ERROR: - * they are reserved and cleared on a kernel entrance. - */ -#undef NGX_CLOSE_EVENT -#define NGX_CLOSE_EVENT EV_EOF - -#undef NGX_LOWAT_EVENT -#define NGX_LOWAT_EVENT EV_FLAG1 - -#undef NGX_FLUSH_EVENT -#define NGX_FLUSH_EVENT EV_ERROR - -#define NGX_LEVEL_EVENT 0 -#define NGX_ONESHOT_EVENT EV_ONESHOT -#define NGX_CLEAR_EVENT EV_CLEAR - -#undef NGX_DISABLE_EVENT -#define NGX_DISABLE_EVENT EV_DISABLE - - -#elif (NGX_HAVE_DEVPOLL && !(NGX_TEST_BUILD_DEVPOLL)) \ - || (NGX_HAVE_EVENTPORT && !(NGX_TEST_BUILD_EVENTPORT)) - -#define NGX_READ_EVENT POLLIN -#define NGX_WRITE_EVENT POLLOUT - -#define NGX_LEVEL_EVENT 0 -#define NGX_ONESHOT_EVENT 1 - - -#elif (NGX_HAVE_EPOLL) && !(NGX_TEST_BUILD_EPOLL) - -#define NGX_READ_EVENT (EPOLLIN|EPOLLRDHUP) -#define NGX_WRITE_EVENT EPOLLOUT - -#define NGX_LEVEL_EVENT 0 -#define NGX_CLEAR_EVENT EPOLLET -#define NGX_ONESHOT_EVENT 0x70000000 -#if 0 -#define NGX_ONESHOT_EVENT EPOLLONESHOT -#endif - -#if (NGX_HAVE_EPOLLEXCLUSIVE) -#define NGX_EXCLUSIVE_EVENT EPOLLEXCLUSIVE -#endif - -#elif (NGX_HAVE_POLL) - -#define NGX_READ_EVENT POLLIN -#define NGX_WRITE_EVENT POLLOUT - -#define NGX_LEVEL_EVENT 0 -#define NGX_ONESHOT_EVENT 1 - - -#else /* select */ - -#define NGX_READ_EVENT 0 -#define NGX_WRITE_EVENT 1 - -#define NGX_LEVEL_EVENT 0 -#define NGX_ONESHOT_EVENT 1 - -#endif /* NGX_HAVE_KQUEUE */ - - -#if (NGX_HAVE_IOCP) -#define NGX_IOCP_ACCEPT 0 -#define NGX_IOCP_IO 1 -#define NGX_IOCP_CONNECT 2 -#endif - - -#if (NGX_TEST_BUILD_EPOLL) -#define NGX_EXCLUSIVE_EVENT 0 -#endif - - -#ifndef NGX_CLEAR_EVENT -#define NGX_CLEAR_EVENT 0 /* dummy declaration */ -#endif - - -#define ngx_process_events ngx_event_actions.process_events -#define ngx_done_events ngx_event_actions.done - -#define ngx_add_event ngx_event_actions.add -#define ngx_del_event ngx_event_actions.del -#define ngx_add_conn ngx_event_actions.add_conn -#define ngx_del_conn ngx_event_actions.del_conn - -#define ngx_notify ngx_event_actions.notify - -#define ngx_add_timer ngx_event_add_timer -#define ngx_del_timer ngx_event_del_timer - - -extern ngx_os_io_t ngx_io; - -#define ngx_recv ngx_io.recv -#define ngx_recv_chain ngx_io.recv_chain -#define ngx_udp_recv ngx_io.udp_recv -#define ngx_send ngx_io.send -#define ngx_send_chain ngx_io.send_chain -#define ngx_udp_send ngx_io.udp_send -#define ngx_udp_send_chain ngx_io.udp_send_chain - - -#define NGX_EVENT_MODULE 0x544E5645 /* "EVNT" */ -#define NGX_EVENT_CONF 0x02000000 - - -typedef struct { - ngx_uint_t connections; - ngx_uint_t use; - - ngx_flag_t multi_accept; - ngx_flag_t accept_mutex; - - ngx_msec_t accept_mutex_delay; - - u_char *name; - -#if (NGX_DEBUG) - ngx_array_t debug_connection; -#endif -} ngx_event_conf_t; - - -typedef struct { - ngx_str_t *name; - - void *(*create_conf)(ngx_cycle_t *cycle); - char *(*init_conf)(ngx_cycle_t *cycle, void *conf); - - ngx_event_actions_t actions; -} ngx_event_module_t; - - -extern ngx_atomic_t *ngx_connection_counter; - -extern ngx_atomic_t *ngx_accept_mutex_ptr; -extern ngx_shmtx_t ngx_accept_mutex; -extern ngx_uint_t ngx_use_accept_mutex; -extern ngx_uint_t ngx_accept_events; -extern ngx_uint_t ngx_accept_mutex_held; -extern ngx_msec_t ngx_accept_mutex_delay; -extern ngx_int_t ngx_accept_disabled; -extern ngx_uint_t ngx_use_exclusive_accept; - - -#if (NGX_STAT_STUB) - -extern ngx_atomic_t *ngx_stat_accepted; -extern ngx_atomic_t *ngx_stat_handled; -extern ngx_atomic_t *ngx_stat_requests; -extern ngx_atomic_t *ngx_stat_active; -extern ngx_atomic_t *ngx_stat_reading; -extern ngx_atomic_t *ngx_stat_writing; -extern ngx_atomic_t *ngx_stat_waiting; - -#endif - - -#define NGX_UPDATE_TIME 1 -#define NGX_POST_EVENTS 2 - - -extern sig_atomic_t ngx_event_timer_alarm; -extern ngx_uint_t ngx_event_flags; -extern ngx_module_t ngx_events_module; -extern ngx_module_t ngx_event_core_module; - - -#define ngx_event_get_conf(conf_ctx, module) \ - (*(ngx_get_conf(conf_ctx, ngx_events_module))) [module.ctx_index] - - - -void ngx_event_accept(ngx_event_t *ev); -ngx_int_t ngx_trylock_accept_mutex(ngx_cycle_t *cycle); -ngx_int_t ngx_enable_accept_events(ngx_cycle_t *cycle); -u_char *ngx_accept_log_error(ngx_log_t *log, u_char *buf, size_t len); -#if (NGX_DEBUG) -void ngx_debug_accepted_connection(ngx_event_conf_t *ecf, ngx_connection_t *c); -#endif - - -void ngx_process_events_and_timers(ngx_cycle_t *cycle); -ngx_int_t ngx_handle_read_event(ngx_event_t *rev, ngx_uint_t flags); -ngx_int_t ngx_handle_write_event(ngx_event_t *wev, size_t lowat); - - -#if (NGX_WIN32) -void ngx_event_acceptex(ngx_event_t *ev); -ngx_int_t ngx_event_post_acceptex(ngx_listening_t *ls, ngx_uint_t n); -u_char *ngx_acceptex_log_error(ngx_log_t *log, u_char *buf, size_t len); -#endif - - -ngx_int_t ngx_send_lowat(ngx_connection_t *c, size_t lowat); - - -/* used in ngx_log_debugX() */ -#define ngx_event_ident(p) ((ngx_connection_t *) (p))->fd - - -#include -#include -#include - -#if (NGX_WIN32) -#include -#endif - - -#endif /* _NGX_EVENT_H_INCLUDED_ */ diff --git a/src/deps/src/nginx-1.30.3/src/event/ngx_event_accept.c b/src/deps/src/nginx-1.30.3/src/event/ngx_event_accept.c deleted file mode 100644 index 033d7e021e..0000000000 --- a/src/deps/src/nginx-1.30.3/src/event/ngx_event_accept.c +++ /dev/null @@ -1,589 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#include -#include -#include - - -static ngx_int_t ngx_disable_accept_events(ngx_cycle_t *cycle, ngx_uint_t all); -#if (NGX_HAVE_EPOLLEXCLUSIVE) -static void ngx_reorder_accept_events(ngx_listening_t *ls); -#endif -static void ngx_close_accepted_connection(ngx_connection_t *c); - - -void -ngx_event_accept(ngx_event_t *ev) -{ - socklen_t socklen; - ngx_err_t err; - ngx_log_t *log; - ngx_uint_t level; - ngx_socket_t s; - ngx_event_t *rev, *wev; - ngx_sockaddr_t sa; - ngx_listening_t *ls; - ngx_connection_t *c, *lc; - ngx_event_conf_t *ecf; -#if (NGX_HAVE_ACCEPT4) - static ngx_uint_t use_accept4 = 1; -#endif - - if (ev->timedout) { - if (ngx_enable_accept_events((ngx_cycle_t *) ngx_cycle) != NGX_OK) { - return; - } - - ev->timedout = 0; - } - - ecf = ngx_event_get_conf(ngx_cycle->conf_ctx, ngx_event_core_module); - - if (!(ngx_event_flags & NGX_USE_KQUEUE_EVENT)) { - ev->available = ecf->multi_accept; - } - - lc = ev->data; - ls = lc->listening; - ev->ready = 0; - - ngx_log_debug2(NGX_LOG_DEBUG_EVENT, ev->log, 0, - "accept on %V, ready: %d", &ls->addr_text, ev->available); - - do { - socklen = sizeof(ngx_sockaddr_t); - -#if (NGX_HAVE_ACCEPT4) - if (use_accept4) { - s = accept4(lc->fd, &sa.sockaddr, &socklen, SOCK_NONBLOCK); - } else { - s = accept(lc->fd, &sa.sockaddr, &socklen); - } -#else - s = accept(lc->fd, &sa.sockaddr, &socklen); -#endif - - if (s == (ngx_socket_t) -1) { - err = ngx_socket_errno; - - if (err == NGX_EAGAIN) { - ngx_log_debug0(NGX_LOG_DEBUG_EVENT, ev->log, err, - "accept() not ready"); - return; - } - - level = NGX_LOG_ALERT; - - if (err == NGX_ECONNABORTED) { - level = NGX_LOG_ERR; - - } else if (err == NGX_EMFILE || err == NGX_ENFILE) { - level = NGX_LOG_CRIT; - } - -#if (NGX_HAVE_ACCEPT4) - ngx_log_error(level, ev->log, err, - use_accept4 ? "accept4() failed" : "accept() failed"); - - if (use_accept4 && err == NGX_ENOSYS) { - use_accept4 = 0; - ngx_inherited_nonblocking = 0; - continue; - } -#else - ngx_log_error(level, ev->log, err, "accept() failed"); -#endif - - if (err == NGX_ECONNABORTED) { - if (ngx_event_flags & NGX_USE_KQUEUE_EVENT) { - ev->available--; - } - - if (ev->available) { - continue; - } - } - - if (err == NGX_EMFILE || err == NGX_ENFILE) { - if (ngx_disable_accept_events((ngx_cycle_t *) ngx_cycle, 1) - != NGX_OK) - { - return; - } - - if (ngx_use_accept_mutex) { - if (ngx_accept_mutex_held) { - ngx_shmtx_unlock(&ngx_accept_mutex); - ngx_accept_mutex_held = 0; - } - - ngx_accept_disabled = 1; - - } else { - ngx_add_timer(ev, ecf->accept_mutex_delay); - } - } - - return; - } - -#if (NGX_STAT_STUB) - (void) ngx_atomic_fetch_add(ngx_stat_accepted, 1); -#endif - - ngx_accept_disabled = ngx_cycle->connection_n / 8 - - ngx_cycle->free_connection_n; - - c = ngx_get_connection(s, ev->log); - - if (c == NULL) { - if (ngx_close_socket(s) == -1) { - ngx_log_error(NGX_LOG_ALERT, ev->log, ngx_socket_errno, - ngx_close_socket_n " failed"); - } - - return; - } - - c->type = SOCK_STREAM; - -#if (NGX_STAT_STUB) - (void) ngx_atomic_fetch_add(ngx_stat_active, 1); -#endif - - c->pool = ngx_create_pool(ls->pool_size, ev->log); - if (c->pool == NULL) { - ngx_close_accepted_connection(c); - return; - } - - if (socklen > (socklen_t) sizeof(ngx_sockaddr_t)) { - socklen = sizeof(ngx_sockaddr_t); - } - - c->sockaddr = ngx_palloc(c->pool, socklen); - if (c->sockaddr == NULL) { - ngx_close_accepted_connection(c); - return; - } - - ngx_memcpy(c->sockaddr, &sa, socklen); - - log = ngx_palloc(c->pool, sizeof(ngx_log_t)); - if (log == NULL) { - ngx_close_accepted_connection(c); - return; - } - - /* set a blocking mode for iocp and non-blocking mode for others */ - - if (ngx_inherited_nonblocking) { - if (ngx_event_flags & NGX_USE_IOCP_EVENT) { - if (ngx_blocking(s) == -1) { - ngx_log_error(NGX_LOG_ALERT, ev->log, ngx_socket_errno, - ngx_blocking_n " failed"); - ngx_close_accepted_connection(c); - return; - } - } - - } else { - if (!(ngx_event_flags & NGX_USE_IOCP_EVENT)) { - if (ngx_nonblocking(s) == -1) { - ngx_log_error(NGX_LOG_ALERT, ev->log, ngx_socket_errno, - ngx_nonblocking_n " failed"); - ngx_close_accepted_connection(c); - return; - } - } - } - -#if (NGX_HAVE_KEEPALIVE_TUNABLE && NGX_DARWIN) - - /* Darwin doesn't inherit TCP_KEEPALIVE from a listening socket */ - - if (ls->keepidle) { - if (setsockopt(s, IPPROTO_TCP, TCP_KEEPALIVE, - (const void *) &ls->keepidle, sizeof(int)) - == -1) - { - ngx_log_error(NGX_LOG_ALERT, ev->log, ngx_socket_errno, - "setsockopt(TCP_KEEPALIVE, %d) failed, ignored", - ls->keepidle); - } - } - -#endif - - *log = ls->log; - - c->recv = ngx_recv; - c->send = ngx_send; - c->recv_chain = ngx_recv_chain; - c->send_chain = ngx_send_chain; - - c->log = log; - c->pool->log = log; - - c->socklen = socklen; - c->listening = ls; - c->local_sockaddr = ls->sockaddr; - c->local_socklen = ls->socklen; - -#if (NGX_HAVE_UNIX_DOMAIN) - if (c->sockaddr->sa_family == AF_UNIX) { - c->tcp_nopush = NGX_TCP_NOPUSH_DISABLED; - c->tcp_nodelay = NGX_TCP_NODELAY_DISABLED; -#if (NGX_SOLARIS) - /* Solaris's sendfilev() supports AF_NCA, AF_INET, and AF_INET6 */ - c->sendfile = 0; -#endif - } -#endif - - rev = c->read; - wev = c->write; - - wev->ready = 1; - - if (ngx_event_flags & NGX_USE_IOCP_EVENT) { - rev->ready = 1; - } - - if (ev->deferred_accept) { - rev->ready = 1; -#if (NGX_HAVE_KQUEUE || NGX_HAVE_EPOLLRDHUP) - rev->available = 1; -#endif - } - - rev->log = log; - wev->log = log; - - /* - * TODO: MT: - ngx_atomic_fetch_add() - * or protection by critical section or light mutex - * - * TODO: MP: - allocated in a shared memory - * - ngx_atomic_fetch_add() - * or protection by critical section or light mutex - */ - - c->number = ngx_atomic_fetch_add(ngx_connection_counter, 1); - - c->start_time = ngx_current_msec; - -#if (NGX_STAT_STUB) - (void) ngx_atomic_fetch_add(ngx_stat_handled, 1); -#endif - - if (ls->addr_ntop) { - c->addr_text.data = ngx_pnalloc(c->pool, ls->addr_text_max_len); - if (c->addr_text.data == NULL) { - ngx_close_accepted_connection(c); - return; - } - - c->addr_text.len = ngx_sock_ntop(c->sockaddr, c->socklen, - c->addr_text.data, - ls->addr_text_max_len, 0); - if (c->addr_text.len == 0) { - ngx_close_accepted_connection(c); - return; - } - } - -#if (NGX_DEBUG) - { - ngx_str_t addr; - u_char text[NGX_SOCKADDR_STRLEN]; - - ngx_debug_accepted_connection(ecf, c); - - if (log->log_level & NGX_LOG_DEBUG_EVENT) { - addr.data = text; - addr.len = ngx_sock_ntop(c->sockaddr, c->socklen, text, - NGX_SOCKADDR_STRLEN, 1); - - ngx_log_debug3(NGX_LOG_DEBUG_EVENT, log, 0, - "*%uA accept: %V fd:%d", c->number, &addr, s); - } - - } -#endif - - if (ngx_add_conn && (ngx_event_flags & NGX_USE_EPOLL_EVENT) == 0) { - if (ngx_add_conn(c) == NGX_ERROR) { - ngx_close_accepted_connection(c); - return; - } - } - - log->data = NULL; - log->handler = NULL; - - ls->handler(c); - - if (ngx_event_flags & NGX_USE_KQUEUE_EVENT) { - ev->available--; - } - - } while (ev->available); - -#if (NGX_HAVE_EPOLLEXCLUSIVE) - ngx_reorder_accept_events(ls); -#endif -} - - -ngx_int_t -ngx_trylock_accept_mutex(ngx_cycle_t *cycle) -{ - if (ngx_shmtx_trylock(&ngx_accept_mutex)) { - - ngx_log_debug0(NGX_LOG_DEBUG_EVENT, cycle->log, 0, - "accept mutex locked"); - - if (ngx_accept_mutex_held && ngx_accept_events == 0) { - return NGX_OK; - } - - if (ngx_enable_accept_events(cycle) == NGX_ERROR) { - ngx_shmtx_unlock(&ngx_accept_mutex); - return NGX_ERROR; - } - - ngx_accept_events = 0; - ngx_accept_mutex_held = 1; - - return NGX_OK; - } - - ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0, - "accept mutex lock failed: %ui", ngx_accept_mutex_held); - - if (ngx_accept_mutex_held) { - if (ngx_disable_accept_events(cycle, 0) == NGX_ERROR) { - return NGX_ERROR; - } - - ngx_accept_mutex_held = 0; - } - - return NGX_OK; -} - - -ngx_int_t -ngx_enable_accept_events(ngx_cycle_t *cycle) -{ - ngx_uint_t i; - ngx_listening_t *ls; - ngx_connection_t *c; - - ls = cycle->listening.elts; - for (i = 0; i < cycle->listening.nelts; i++) { - - c = ls[i].connection; - - if (c == NULL || c->read->active) { - continue; - } - - if (ngx_add_event(c->read, NGX_READ_EVENT, 0) == NGX_ERROR) { - return NGX_ERROR; - } - } - - return NGX_OK; -} - - -static ngx_int_t -ngx_disable_accept_events(ngx_cycle_t *cycle, ngx_uint_t all) -{ - ngx_uint_t i; - ngx_listening_t *ls; - ngx_connection_t *c; - - ls = cycle->listening.elts; - for (i = 0; i < cycle->listening.nelts; i++) { - - c = ls[i].connection; - - if (c == NULL || !c->read->active) { - continue; - } - -#if (NGX_HAVE_REUSEPORT) - - /* - * do not disable accept on worker's own sockets - * when disabling accept events due to accept mutex - */ - - if (ls[i].reuseport && !all) { - continue; - } - -#endif - - if (ngx_del_event(c->read, NGX_READ_EVENT, NGX_DISABLE_EVENT) - == NGX_ERROR) - { - return NGX_ERROR; - } - } - - return NGX_OK; -} - - -#if (NGX_HAVE_EPOLLEXCLUSIVE) - -static void -ngx_reorder_accept_events(ngx_listening_t *ls) -{ - ngx_connection_t *c; - - /* - * Linux with EPOLLEXCLUSIVE usually notifies only the process which - * was first to add the listening socket to the epoll instance. As - * a result most of the connections are handled by the first worker - * process. To fix this, we re-add the socket periodically, so other - * workers will get a chance to accept connections. - */ - - if (!ngx_use_exclusive_accept) { - return; - } - -#if (NGX_HAVE_REUSEPORT) - - if (ls->reuseport) { - return; - } - -#endif - - c = ls->connection; - - if (c->requests++ % 16 != 0 - && ngx_accept_disabled <= 0) - { - return; - } - - if (ngx_del_event(c->read, NGX_READ_EVENT, NGX_DISABLE_EVENT) - == NGX_ERROR) - { - return; - } - - if (ngx_add_event(c->read, NGX_READ_EVENT, NGX_EXCLUSIVE_EVENT) - == NGX_ERROR) - { - return; - } -} - -#endif - - -static void -ngx_close_accepted_connection(ngx_connection_t *c) -{ - ngx_socket_t fd; - - ngx_free_connection(c); - - fd = c->fd; - c->fd = (ngx_socket_t) -1; - - if (ngx_close_socket(fd) == -1) { - ngx_log_error(NGX_LOG_ALERT, c->log, ngx_socket_errno, - ngx_close_socket_n " failed"); - } - - if (c->pool) { - ngx_destroy_pool(c->pool); - } - -#if (NGX_STAT_STUB) - (void) ngx_atomic_fetch_add(ngx_stat_active, -1); -#endif -} - - -u_char * -ngx_accept_log_error(ngx_log_t *log, u_char *buf, size_t len) -{ - return ngx_snprintf(buf, len, " while accepting new connection on %V", - log->data); -} - - -#if (NGX_DEBUG) - -void -ngx_debug_accepted_connection(ngx_event_conf_t *ecf, ngx_connection_t *c) -{ - struct sockaddr_in *sin; - ngx_cidr_t *cidr; - ngx_uint_t i; -#if (NGX_HAVE_INET6) - struct sockaddr_in6 *sin6; - ngx_uint_t n; -#endif - - cidr = ecf->debug_connection.elts; - for (i = 0; i < ecf->debug_connection.nelts; i++) { - if (cidr[i].family != (ngx_uint_t) c->sockaddr->sa_family) { - goto next; - } - - switch (cidr[i].family) { - -#if (NGX_HAVE_INET6) - case AF_INET6: - sin6 = (struct sockaddr_in6 *) c->sockaddr; - for (n = 0; n < 16; n++) { - if ((sin6->sin6_addr.s6_addr[n] - & cidr[i].u.in6.mask.s6_addr[n]) - != cidr[i].u.in6.addr.s6_addr[n]) - { - goto next; - } - } - break; -#endif - -#if (NGX_HAVE_UNIX_DOMAIN) - case AF_UNIX: - break; -#endif - - default: /* AF_INET */ - sin = (struct sockaddr_in *) c->sockaddr; - if ((sin->sin_addr.s_addr & cidr[i].u.in.mask) - != cidr[i].u.in.addr) - { - goto next; - } - break; - } - - c->log->log_level = NGX_LOG_DEBUG_CONNECTION|NGX_LOG_DEBUG_ALL; - break; - - next: - continue; - } -} - -#endif diff --git a/src/deps/src/nginx-1.30.3/src/event/ngx_event_acceptex.c b/src/deps/src/nginx-1.30.3/src/event/ngx_event_acceptex.c deleted file mode 100644 index f4a1c4b2b9..0000000000 --- a/src/deps/src/nginx-1.30.3/src/event/ngx_event_acceptex.c +++ /dev/null @@ -1,229 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#include -#include -#include - - -static void ngx_close_posted_connection(ngx_connection_t *c); - - -void -ngx_event_acceptex(ngx_event_t *rev) -{ - ngx_listening_t *ls; - ngx_connection_t *c; - - c = rev->data; - ls = c->listening; - - c->log->handler = ngx_accept_log_error; - - ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, "AcceptEx: %d", c->fd); - - if (rev->ovlp.error) { - ngx_log_error(NGX_LOG_CRIT, c->log, rev->ovlp.error, - "AcceptEx() %V failed", &ls->addr_text); - return; - } - - /* SO_UPDATE_ACCEPT_CONTEXT is required for shutdown() to work */ - - if (setsockopt(c->fd, SOL_SOCKET, SO_UPDATE_ACCEPT_CONTEXT, - (char *) &ls->fd, sizeof(ngx_socket_t)) - == -1) - { - ngx_log_error(NGX_LOG_CRIT, c->log, ngx_socket_errno, - "setsockopt(SO_UPDATE_ACCEPT_CONTEXT) failed for %V", - &c->addr_text); - /* TODO: close socket */ - return; - } - - ngx_getacceptexsockaddrs(c->buffer->pos, - ls->post_accept_buffer_size, - ls->socklen + 16, - ls->socklen + 16, - &c->local_sockaddr, &c->local_socklen, - &c->sockaddr, &c->socklen); - - if (ls->post_accept_buffer_size) { - c->buffer->last += rev->available; - c->buffer->end = c->buffer->start + ls->post_accept_buffer_size; - - } else { - c->buffer = NULL; - } - - if (ls->addr_ntop) { - c->addr_text.data = ngx_pnalloc(c->pool, ls->addr_text_max_len); - if (c->addr_text.data == NULL) { - /* TODO: close socket */ - return; - } - - c->addr_text.len = ngx_sock_ntop(c->sockaddr, c->socklen, - c->addr_text.data, - ls->addr_text_max_len, 0); - if (c->addr_text.len == 0) { - /* TODO: close socket */ - return; - } - } - - ngx_event_post_acceptex(ls, 1); - - c->number = ngx_atomic_fetch_add(ngx_connection_counter, 1); - - c->start_time = ngx_current_msec; - - ls->handler(c); - - return; - -} - - -ngx_int_t -ngx_event_post_acceptex(ngx_listening_t *ls, ngx_uint_t n) -{ - u_long rcvd; - ngx_err_t err; - ngx_log_t *log; - ngx_uint_t i; - ngx_event_t *rev, *wev; - ngx_socket_t s; - ngx_connection_t *c; - - for (i = 0; i < n; i++) { - - /* TODO: look up reused sockets */ - - s = ngx_socket(ls->sockaddr->sa_family, ls->type, 0); - - ngx_log_debug1(NGX_LOG_DEBUG_EVENT, &ls->log, 0, - ngx_socket_n " s:%d", s); - - if (s == (ngx_socket_t) -1) { - ngx_log_error(NGX_LOG_ALERT, &ls->log, ngx_socket_errno, - ngx_socket_n " failed"); - - return NGX_ERROR; - } - - c = ngx_get_connection(s, &ls->log); - - if (c == NULL) { - return NGX_ERROR; - } - - c->pool = ngx_create_pool(ls->pool_size, &ls->log); - if (c->pool == NULL) { - ngx_close_posted_connection(c); - return NGX_ERROR; - } - - log = ngx_palloc(c->pool, sizeof(ngx_log_t)); - if (log == NULL) { - ngx_close_posted_connection(c); - return NGX_ERROR; - } - - c->buffer = ngx_create_temp_buf(c->pool, ls->post_accept_buffer_size - + 2 * (ls->socklen + 16)); - if (c->buffer == NULL) { - ngx_close_posted_connection(c); - return NGX_ERROR; - } - - c->local_sockaddr = ngx_palloc(c->pool, ls->socklen); - if (c->local_sockaddr == NULL) { - ngx_close_posted_connection(c); - return NGX_ERROR; - } - - c->sockaddr = ngx_palloc(c->pool, ls->socklen); - if (c->sockaddr == NULL) { - ngx_close_posted_connection(c); - return NGX_ERROR; - } - - *log = ls->log; - c->log = log; - - c->recv = ngx_recv; - c->send = ngx_send; - c->recv_chain = ngx_recv_chain; - c->send_chain = ngx_send_chain; - - c->listening = ls; - - rev = c->read; - wev = c->write; - - rev->ovlp.event = rev; - wev->ovlp.event = wev; - rev->handler = ngx_event_acceptex; - - rev->ready = 1; - wev->ready = 1; - - rev->log = c->log; - wev->log = c->log; - - if (ngx_add_event(rev, 0, NGX_IOCP_IO) == NGX_ERROR) { - ngx_close_posted_connection(c); - return NGX_ERROR; - } - - if (ngx_acceptex(ls->fd, s, c->buffer->pos, ls->post_accept_buffer_size, - ls->socklen + 16, ls->socklen + 16, - &rcvd, (LPOVERLAPPED) &rev->ovlp) - == 0) - { - err = ngx_socket_errno; - if (err != WSA_IO_PENDING) { - ngx_log_error(NGX_LOG_ALERT, &ls->log, err, - "AcceptEx() %V failed", &ls->addr_text); - - ngx_close_posted_connection(c); - return NGX_ERROR; - } - } - } - - return NGX_OK; -} - - -static void -ngx_close_posted_connection(ngx_connection_t *c) -{ - ngx_socket_t fd; - - ngx_free_connection(c); - - fd = c->fd; - c->fd = (ngx_socket_t) -1; - - if (ngx_close_socket(fd) == -1) { - ngx_log_error(NGX_LOG_ALERT, c->log, ngx_socket_errno, - ngx_close_socket_n " failed"); - } - - if (c->pool) { - ngx_destroy_pool(c->pool); - } -} - - -u_char * -ngx_acceptex_log_error(ngx_log_t *log, u_char *buf, size_t len) -{ - return ngx_snprintf(buf, len, " while posting AcceptEx() on %V", log->data); -} diff --git a/src/deps/src/nginx-1.30.3/src/event/ngx_event_connect.c b/src/deps/src/nginx-1.30.3/src/event/ngx_event_connect.c deleted file mode 100644 index 668084a7bb..0000000000 --- a/src/deps/src/nginx-1.30.3/src/event/ngx_event_connect.c +++ /dev/null @@ -1,435 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#include -#include -#include -#include - - -#if (NGX_HAVE_TRANSPARENT_PROXY) -static ngx_int_t ngx_event_connect_set_transparent(ngx_peer_connection_t *pc, - ngx_socket_t s); -#endif - - -ngx_int_t -ngx_event_connect_peer(ngx_peer_connection_t *pc) -{ - int rc, type, value; -#if (NGX_HAVE_IP_BIND_ADDRESS_NO_PORT || NGX_LINUX) - in_port_t port; -#endif - ngx_int_t event; - ngx_err_t err; - ngx_uint_t level; - ngx_socket_t s; - ngx_event_t *rev, *wev; - ngx_connection_t *c; - - rc = pc->get(pc, pc->data); - if (rc != NGX_OK) { - return rc; - } - - type = (pc->type ? pc->type : SOCK_STREAM); - - s = ngx_socket(pc->sockaddr->sa_family, type, 0); - - ngx_log_debug2(NGX_LOG_DEBUG_EVENT, pc->log, 0, "%s socket %d", - (type == SOCK_STREAM) ? "stream" : "dgram", s); - - if (s == (ngx_socket_t) -1) { - ngx_log_error(NGX_LOG_ALERT, pc->log, ngx_socket_errno, - ngx_socket_n " failed"); - return NGX_ERROR; - } - - - c = ngx_get_connection(s, pc->log); - - if (c == NULL) { - if (ngx_close_socket(s) == -1) { - ngx_log_error(NGX_LOG_ALERT, pc->log, ngx_socket_errno, - ngx_close_socket_n " failed"); - } - - return NGX_ERROR; - } - - c->type = type; - - if (pc->rcvbuf) { - if (setsockopt(s, SOL_SOCKET, SO_RCVBUF, - (const void *) &pc->rcvbuf, sizeof(int)) == -1) - { - ngx_log_error(NGX_LOG_ALERT, pc->log, ngx_socket_errno, - "setsockopt(SO_RCVBUF) failed"); - goto failed; - } - } - - if (pc->so_keepalive) { - value = 1; - - if (setsockopt(s, SOL_SOCKET, SO_KEEPALIVE, - (const void *) &value, sizeof(int)) - == -1) - { - ngx_log_error(NGX_LOG_ALERT, pc->log, ngx_socket_errno, - "setsockopt(SO_KEEPALIVE) failed, ignored"); - } - } - - if (ngx_nonblocking(s) == -1) { - ngx_log_error(NGX_LOG_ALERT, pc->log, ngx_socket_errno, - ngx_nonblocking_n " failed"); - - goto failed; - } - - if (pc->local) { - -#if (NGX_HAVE_TRANSPARENT_PROXY) - if (pc->transparent) { - if (ngx_event_connect_set_transparent(pc, s) != NGX_OK) { - goto failed; - } - } -#endif - -#if (NGX_HAVE_IP_BIND_ADDRESS_NO_PORT || NGX_LINUX) - port = ngx_inet_get_port(pc->local->sockaddr); -#endif - -#if (NGX_HAVE_IP_BIND_ADDRESS_NO_PORT) - - if (pc->sockaddr->sa_family != AF_UNIX && port == 0) { - static int bind_address_no_port = 1; - - if (bind_address_no_port) { - if (setsockopt(s, IPPROTO_IP, IP_BIND_ADDRESS_NO_PORT, - (const void *) &bind_address_no_port, - sizeof(int)) == -1) - { - err = ngx_socket_errno; - - if (err != NGX_EOPNOTSUPP && err != NGX_ENOPROTOOPT) { - ngx_log_error(NGX_LOG_ALERT, pc->log, err, - "setsockopt(IP_BIND_ADDRESS_NO_PORT) " - "failed, ignored"); - - } else { - bind_address_no_port = 0; - } - } - } - } - -#endif - -#if (NGX_LINUX) - - if (pc->type == SOCK_DGRAM && port != 0) { - int reuse_addr = 1; - - if (setsockopt(s, SOL_SOCKET, SO_REUSEADDR, - (const void *) &reuse_addr, sizeof(int)) - == -1) - { - ngx_log_error(NGX_LOG_ALERT, pc->log, ngx_socket_errno, - "setsockopt(SO_REUSEADDR) failed"); - goto failed; - } - } - -#endif - - if (bind(s, pc->local->sockaddr, pc->local->socklen) == -1) { - ngx_log_error(NGX_LOG_CRIT, pc->log, ngx_socket_errno, - "bind(%V) failed", &pc->local->name); - - goto failed; - } - } - - if (type == SOCK_STREAM) { - c->recv = ngx_recv; - c->send = ngx_send; - c->recv_chain = ngx_recv_chain; - c->send_chain = ngx_send_chain; - - c->sendfile = 1; - - if (pc->sockaddr->sa_family == AF_UNIX) { - c->tcp_nopush = NGX_TCP_NOPUSH_DISABLED; - c->tcp_nodelay = NGX_TCP_NODELAY_DISABLED; - -#if (NGX_SOLARIS) - /* Solaris's sendfilev() supports AF_NCA, AF_INET, and AF_INET6 */ - c->sendfile = 0; -#endif - } - - } else { /* type == SOCK_DGRAM */ - c->recv = ngx_udp_recv; - c->send = ngx_send; - c->send_chain = ngx_udp_send_chain; - - c->need_flush_buf = 1; - } - - c->log_error = pc->log_error; - - rev = c->read; - wev = c->write; - - rev->log = pc->log; - wev->log = pc->log; - - pc->connection = c; - - c->number = ngx_atomic_fetch_add(ngx_connection_counter, 1); - - c->start_time = ngx_current_msec; - - if (ngx_add_conn) { - if (ngx_add_conn(c) == NGX_ERROR) { - goto failed; - } - } - - ngx_log_debug3(NGX_LOG_DEBUG_EVENT, pc->log, 0, - "connect to %V, fd:%d #%uA", pc->name, s, c->number); - - rc = connect(s, pc->sockaddr, pc->socklen); - - if (rc == -1) { - err = ngx_socket_errno; - - - if (err != NGX_EINPROGRESS -#if (NGX_WIN32) - /* Winsock returns WSAEWOULDBLOCK (NGX_EAGAIN) */ - && err != NGX_EAGAIN -#endif - ) - { - if (err == NGX_ECONNREFUSED -#if (NGX_LINUX) - /* - * Linux returns EAGAIN instead of ECONNREFUSED - * for unix sockets if listen queue is full - */ - || err == NGX_EAGAIN -#endif - || err == NGX_ECONNRESET - || err == NGX_ENETDOWN - || err == NGX_ENETUNREACH - || err == NGX_EHOSTDOWN - || err == NGX_EHOSTUNREACH) - { - level = NGX_LOG_ERR; - - } else { - level = NGX_LOG_CRIT; - } - - ngx_log_error(level, c->log, err, "connect() to %V failed", - pc->name); - - ngx_close_connection(c); - pc->connection = NULL; - - return NGX_DECLINED; - } - } - - if (ngx_add_conn) { - if (rc == -1) { - - /* NGX_EINPROGRESS */ - - return NGX_AGAIN; - } - - ngx_log_debug0(NGX_LOG_DEBUG_EVENT, pc->log, 0, "connected"); - - wev->ready = 1; - - return NGX_OK; - } - - if (ngx_event_flags & NGX_USE_IOCP_EVENT) { - - ngx_log_debug1(NGX_LOG_DEBUG_EVENT, pc->log, ngx_socket_errno, - "connect(): %d", rc); - - if (ngx_blocking(s) == -1) { - ngx_log_error(NGX_LOG_ALERT, pc->log, ngx_socket_errno, - ngx_blocking_n " failed"); - goto failed; - } - - /* - * FreeBSD's aio allows to post an operation on non-connected socket. - * NT does not support it. - * - * TODO: check in Win32, etc. As workaround we can use NGX_ONESHOT_EVENT - */ - - rev->ready = 1; - wev->ready = 1; - - return NGX_OK; - } - - if (ngx_event_flags & NGX_USE_CLEAR_EVENT) { - - /* kqueue */ - - event = NGX_CLEAR_EVENT; - - } else { - - /* select, poll, /dev/poll */ - - event = NGX_LEVEL_EVENT; - } - - if (ngx_add_event(rev, NGX_READ_EVENT, event) != NGX_OK) { - goto failed; - } - - if (rc == -1) { - - /* NGX_EINPROGRESS */ - - if (ngx_add_event(wev, NGX_WRITE_EVENT, event) != NGX_OK) { - goto failed; - } - - return NGX_AGAIN; - } - - ngx_log_debug0(NGX_LOG_DEBUG_EVENT, pc->log, 0, "connected"); - - wev->ready = 1; - - return NGX_OK; - -failed: - - ngx_close_connection(c); - pc->connection = NULL; - - return NGX_ERROR; -} - - -#if (NGX_HAVE_TRANSPARENT_PROXY) - -static ngx_int_t -ngx_event_connect_set_transparent(ngx_peer_connection_t *pc, ngx_socket_t s) -{ - int value; - - value = 1; - -#if defined(SO_BINDANY) - - if (setsockopt(s, SOL_SOCKET, SO_BINDANY, - (const void *) &value, sizeof(int)) == -1) - { - ngx_log_error(NGX_LOG_ALERT, pc->log, ngx_socket_errno, - "setsockopt(SO_BINDANY) failed"); - return NGX_ERROR; - } - -#else - - switch (pc->local->sockaddr->sa_family) { - - case AF_INET: - -#if defined(IP_TRANSPARENT) - - if (setsockopt(s, IPPROTO_IP, IP_TRANSPARENT, - (const void *) &value, sizeof(int)) == -1) - { - ngx_log_error(NGX_LOG_ALERT, pc->log, ngx_socket_errno, - "setsockopt(IP_TRANSPARENT) failed"); - return NGX_ERROR; - } - -#elif defined(IP_BINDANY) - - if (setsockopt(s, IPPROTO_IP, IP_BINDANY, - (const void *) &value, sizeof(int)) == -1) - { - ngx_log_error(NGX_LOG_ALERT, pc->log, ngx_socket_errno, - "setsockopt(IP_BINDANY) failed"); - return NGX_ERROR; - } - -#endif - - break; - -#if (NGX_HAVE_INET6) - - case AF_INET6: - -#if defined(IPV6_TRANSPARENT) - - if (setsockopt(s, IPPROTO_IPV6, IPV6_TRANSPARENT, - (const void *) &value, sizeof(int)) == -1) - { - ngx_log_error(NGX_LOG_ALERT, pc->log, ngx_socket_errno, - "setsockopt(IPV6_TRANSPARENT) failed"); - return NGX_ERROR; - } - -#elif defined(IPV6_BINDANY) - - if (setsockopt(s, IPPROTO_IPV6, IPV6_BINDANY, - (const void *) &value, sizeof(int)) == -1) - { - ngx_log_error(NGX_LOG_ALERT, pc->log, ngx_socket_errno, - "setsockopt(IPV6_BINDANY) failed"); - return NGX_ERROR; - } - -#else - - ngx_log_error(NGX_LOG_ALERT, pc->log, 0, - "could not enable transparent proxying for IPv6 " - "on this platform"); - - return NGX_ERROR; - -#endif - - break; - -#endif /* NGX_HAVE_INET6 */ - - } - -#endif /* SO_BINDANY */ - - return NGX_OK; -} - -#endif - - -ngx_int_t -ngx_event_get_peer(ngx_peer_connection_t *pc, void *data) -{ - return NGX_OK; -} diff --git a/src/deps/src/nginx-1.30.3/src/event/ngx_event_connect.h b/src/deps/src/nginx-1.30.3/src/event/ngx_event_connect.h deleted file mode 100644 index e428e73765..0000000000 --- a/src/deps/src/nginx-1.30.3/src/event/ngx_event_connect.h +++ /dev/null @@ -1,85 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#ifndef _NGX_EVENT_CONNECT_H_INCLUDED_ -#define _NGX_EVENT_CONNECT_H_INCLUDED_ - - -#include -#include -#include - - -#define NGX_PEER_KEEPALIVE 1 -#define NGX_PEER_NEXT 2 -#define NGX_PEER_FAILED 4 - - -typedef struct ngx_peer_connection_s ngx_peer_connection_t; - -typedef ngx_int_t (*ngx_event_get_peer_pt)(ngx_peer_connection_t *pc, - void *data); -typedef void (*ngx_event_free_peer_pt)(ngx_peer_connection_t *pc, void *data, - ngx_uint_t state); -typedef void (*ngx_event_notify_peer_pt)(ngx_peer_connection_t *pc, - void *data, ngx_uint_t type); -typedef ngx_int_t (*ngx_event_set_peer_session_pt)(ngx_peer_connection_t *pc, - void *data); -typedef void (*ngx_event_save_peer_session_pt)(ngx_peer_connection_t *pc, - void *data); - - -struct ngx_peer_connection_s { - ngx_connection_t *connection; - - struct sockaddr *sockaddr; - socklen_t socklen; - ngx_str_t *name; - - ngx_uint_t tries; - ngx_msec_t start_time; - - ngx_event_get_peer_pt get; - ngx_event_free_peer_pt free; - ngx_event_notify_peer_pt notify; - void *data; - -#if (NGX_SSL || NGX_COMPAT) - ngx_event_set_peer_session_pt set_session; - ngx_event_save_peer_session_pt save_session; -#endif - - ngx_addr_t *local; - - int type; - int rcvbuf; - - ngx_log_t *log; - -#if (NGX_HTTP_UPSTREAM_SID || NGX_COMPAT) - ngx_str_t *hint; - ngx_str_t *sid; -#endif - - unsigned cached:1; - unsigned transparent:1; - unsigned so_keepalive:1; - unsigned down:1; - - /* ngx_connection_log_error_e */ - unsigned log_error:2; - - NGX_COMPAT_BEGIN(1) - NGX_COMPAT_END -}; - - -ngx_int_t ngx_event_connect_peer(ngx_peer_connection_t *pc); -ngx_int_t ngx_event_get_peer(ngx_peer_connection_t *pc, void *data); - - -#endif /* _NGX_EVENT_CONNECT_H_INCLUDED_ */ diff --git a/src/deps/src/nginx-1.30.3/src/event/ngx_event_connectex.c b/src/deps/src/nginx-1.30.3/src/event/ngx_event_connectex.c deleted file mode 100644 index 36b151424b..0000000000 --- a/src/deps/src/nginx-1.30.3/src/event/ngx_event_connectex.c +++ /dev/null @@ -1,206 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#include -#include -#include - - -#define NGX_MAX_PENDING_CONN 10 - - -static CRITICAL_SECTION connect_lock; -static int nconnects; -static ngx_connection_t pending_connects[NGX_MAX_PENDING_CONN]; - -static HANDLE pending_connect_event; - -__declspec(thread) int nevents = 0; -__declspec(thread) WSAEVENT events[WSA_MAXIMUM_WAIT_EVENTS + 1]; -__declspec(thread) ngx_connection_t *conn[WSA_MAXIMUM_WAIT_EVENTS + 1]; - - - -int ngx_iocp_wait_connect(ngx_connection_t *c) -{ - for ( ;; ) { - EnterCriticalSection(&connect_lock); - - if (nconnects < NGX_MAX_PENDING_CONN) { - pending_connects[--nconnects] = c; - LeaveCriticalSection(&connect_lock); - - if (SetEvent(pending_connect_event) == 0) { - ngx_log_error(NGX_LOG_ALERT, c->log, ngx_errno, - "SetEvent() failed"); - return NGX_ERROR; - - break; - } - - LeaveCriticalSection(&connect_lock); - ngx_log_error(NGX_LOG_NOTICE, c->log, 0, - "max number of pending connect()s is %d", - NGX_MAX_PENDING_CONN); - msleep(100); - } - - if (!started) { - if (ngx_iocp_new_thread(1) == NGX_ERROR) { - return NGX_ERROR; - } - started = 1; - } - - return NGX_OK; -} - - -int ngx_iocp_new_thread(int main) -{ - u_int id; - - if (main) { - pending_connect_event = CreateEvent(NULL, 0, 1, NULL); - if (pending_connect_event == INVALID_HANDLE_VALUE) { - ngx_log_error(NGX_LOG_ALERT, c->log, ngx_errno, - "CreateThread() failed"); - return NGX_ERROR; - } - } - - if (CreateThread(NULL, 0, ngx_iocp_wait_events, main, 0, &id) - == INVALID_HANDLE_VALUE) - { - ngx_log_error(NGX_LOG_ALERT, c->log, ngx_errno, - "CreateThread() failed"); - return NGX_ERROR; - } - - SetEvent(event) { - ngx_log_error(NGX_LOG_ALERT, c->log, ngx_errno, - "SetEvent() failed"); - return NGX_ERROR; - } - - return NGX_OK; -} - - -int ngx_iocp_new_connect() -{ - EnterCriticalSection(&connect_lock); - c = pending_connects[--nconnects]; - LeaveCriticalSection(&connect_lock); - - conn[nevents] = c; - - events[nevents] = WSACreateEvent(); - if (events[nevents] == INVALID_HANDLE_VALUE) { - ngx_log_error(NGX_LOG_ALERT, c->log, ngx_socket_errno, - "WSACreateEvent() failed"); - return NGX_ERROR; - } - - if (WSAEventSelect(c->fd, events[nevents], FD_CONNECT) == -1) - ngx_log_error(NGX_LOG_ALERT, c->log, ngx_socket_errno, - "WSAEventSelect() failed"); - return NGX_ERROR; - } - - nevents++; - - return NGX_OK; -} - - -void ngx_iocp_wait_events(int main) -{ - WSANETWORKEVENTS ne; - - nevents = 1; - events[0] = pending_connect_event; - conn[0] = NULL; - - for ( ;; ) { - offset = (nevents == WSA_MAXIMUM_WAIT_EVENTS + 1) ? 1 : 0; - timeout = (nevents == 1 && !first) ? 60000 : INFINITE; - - n = WSAWaitForMultipleEvents(nevents - offset, events[offset], - 0, timeout, 0); - if (n == WAIT_FAILED) { - ngx_log_error(NGX_LOG_ALERT, log, ngx_socket_errno, - "WSAWaitForMultipleEvents() failed"); - continue; - } - - if (n == WAIT_TIMEOUT) { - if (nevents == 2 && !main) { - ExitThread(0); - } - - ngx_log_error(NGX_LOG_ALERT, log, 0, - "WSAWaitForMultipleEvents() " - "returned unexpected WAIT_TIMEOUT"); - continue; - } - - n -= WSA_WAIT_EVENT_0; - - if (events[n] == NULL) { - - /* the pending_connect_event */ - - if (nevents == WSA_MAXIMUM_WAIT_EVENTS) { - ngx_iocp_new_thread(0); - } else { - ngx_iocp_new_connect(); - } - - continue; - } - - if (WSAEnumNetworkEvents(c[n].fd, events[n], &ne) == -1) { - ngx_log_error(NGX_LOG_ALERT, log, ngx_socket_errno, - "WSAEnumNetworkEvents() failed"); - continue; - } - - if (ne.lNetworkEvents & FD_CONNECT) { - conn[n].write->ovlp.error = ne.iErrorCode[FD_CONNECT_BIT]; - - if (PostQueuedCompletionStatus(iocp, 0, NGX_IOCP_CONNECT, - &conn[n].write->ovlp) == 0) - { - ngx_log_error(NGX_LOG_ALERT, log, ngx_socket_errno, - "PostQueuedCompletionStatus() failed"); - continue; - } - - if (n < nevents) { - conn[n] = conn[nevents]; - events[n] = events[nevents]; - } - - nevents--; - continue; - } - - if (ne.lNetworkEvents & FD_ACCEPT) { - - /* CHECK ERROR ??? */ - - ngx_event_post_acceptex(conn[n].listening, 1); - continue; - } - - ngx_log_error(NGX_LOG_ALERT, c[n].log, 0, - "WSAWaitForMultipleEvents() " - "returned unexpected network event %ul", - ne.lNetworkEvents); - } -} diff --git a/src/deps/src/nginx-1.30.3/src/event/ngx_event_openssl.c b/src/deps/src/nginx-1.30.3/src/event/ngx_event_openssl.c deleted file mode 100644 index 99ec654449..0000000000 --- a/src/deps/src/nginx-1.30.3/src/event/ngx_event_openssl.c +++ /dev/null @@ -1,6626 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#include -#include -#include - -#if (NGX_ZLIB && defined TLSEXT_cert_compression_zlib) -#include -#endif - - -#define NGX_SSL_PASSWORD_BUFFER_SIZE 4096 - - -typedef struct { - ngx_uint_t engine; /* unsigned engine:1; */ -} ngx_openssl_conf_t; - - -static ngx_inline ngx_int_t ngx_ssl_cert_already_in_hash(void); -#if (NGX_ZLIB && defined TLSEXT_cert_compression_zlib) -static int ngx_ssl_cert_compression_callback(ngx_ssl_conn_t *ssl_conn, - CBB *out, const uint8_t *in, size_t in_len); -static void *ngx_ssl_cert_compression_alloc(void *opaque, u_int items, - u_int size); -static void ngx_ssl_cert_compression_free(void *opaque, void *address); -#endif -static int ngx_ssl_verify_callback(int ok, X509_STORE_CTX *x509_store); -static void ngx_ssl_info_callback(const ngx_ssl_conn_t *ssl_conn, int where, - int ret); -static int ngx_ssl_cmp_x509_name(const X509_NAME *const *a, - const X509_NAME *const *b); -static void ngx_ssl_passwords_cleanup(void *data); -static int ngx_ssl_new_client_session(ngx_ssl_conn_t *ssl_conn, - ngx_ssl_session_t *sess); -#ifdef SSL_READ_EARLY_DATA_SUCCESS -static ngx_int_t ngx_ssl_try_early_data(ngx_connection_t *c); -#endif -static void ngx_ssl_handshake_handler(ngx_event_t *ev); -#ifdef SSL_READ_EARLY_DATA_SUCCESS -static ssize_t ngx_ssl_recv_early(ngx_connection_t *c, u_char *buf, - size_t size); -#endif -static ngx_int_t ngx_ssl_handle_recv(ngx_connection_t *c, int n); -static void ngx_ssl_write_handler(ngx_event_t *wev); -#ifdef SSL_READ_EARLY_DATA_SUCCESS -static ssize_t ngx_ssl_write_early(ngx_connection_t *c, u_char *data, - size_t size); -#endif -static ssize_t ngx_ssl_sendfile(ngx_connection_t *c, ngx_buf_t *file, - size_t size); -static void ngx_ssl_read_handler(ngx_event_t *rev); -static void ngx_ssl_shutdown_handler(ngx_event_t *ev); -static void ngx_ssl_clear_error(ngx_log_t *log); - -static ngx_int_t ngx_ssl_session_id_context(ngx_ssl_t *ssl, - ngx_str_t *sess_ctx, ngx_array_t *certificates); -static int ngx_ssl_new_session(ngx_ssl_conn_t *ssl_conn, - ngx_ssl_session_t *sess); -static ngx_ssl_session_t *ngx_ssl_get_cached_session(ngx_ssl_conn_t *ssl_conn, -#if OPENSSL_VERSION_NUMBER >= 0x10100003L - const -#endif - u_char *id, int len, int *copy); -static void ngx_ssl_remove_session(SSL_CTX *ssl, ngx_ssl_session_t *sess); -static void ngx_ssl_expire_sessions(ngx_ssl_session_cache_t *cache, - ngx_slab_pool_t *shpool, ngx_uint_t n); -static void ngx_ssl_session_rbtree_insert_value(ngx_rbtree_node_t *temp, - ngx_rbtree_node_t *node, ngx_rbtree_node_t *sentinel); - -#ifdef SSL_CTRL_SET_TLSEXT_TICKET_KEY_CB -static int ngx_ssl_ticket_key_callback(ngx_ssl_conn_t *ssl_conn, - unsigned char *name, unsigned char *iv, EVP_CIPHER_CTX *ectx, - HMAC_CTX *hctx, int enc); -static ngx_int_t ngx_ssl_rotate_ticket_keys(SSL_CTX *ssl_ctx, ngx_log_t *log); -static void ngx_ssl_ticket_keys_cleanup(void *data); -#endif - -#ifndef X509_CHECK_FLAG_ALWAYS_CHECK_SUBJECT -static ngx_int_t ngx_ssl_check_name(ngx_str_t *name, ASN1_STRING *str); -#endif - -static time_t ngx_ssl_parse_time( -#if OPENSSL_VERSION_NUMBER > 0x10100000L - const -#endif - ASN1_TIME *asn1time, ngx_log_t *log); - -static void *ngx_openssl_create_conf(ngx_cycle_t *cycle); -static char *ngx_openssl_engine(ngx_conf_t *cf, ngx_command_t *cmd, void *conf); -static void ngx_openssl_exit(ngx_cycle_t *cycle); - - -static ngx_command_t ngx_openssl_commands[] = { - - { ngx_string("ssl_engine"), - NGX_MAIN_CONF|NGX_DIRECT_CONF|NGX_CONF_TAKE1, - ngx_openssl_engine, - 0, - 0, - NULL }, - - ngx_null_command -}; - - -static ngx_core_module_t ngx_openssl_module_ctx = { - ngx_string("openssl"), - ngx_openssl_create_conf, - NULL -}; - - -ngx_module_t ngx_openssl_module = { - NGX_MODULE_V1, - &ngx_openssl_module_ctx, /* module context */ - ngx_openssl_commands, /* module directives */ - NGX_CORE_MODULE, /* module type */ - NULL, /* init master */ - NULL, /* init module */ - NULL, /* init process */ - NULL, /* init thread */ - NULL, /* exit thread */ - NULL, /* exit process */ - ngx_openssl_exit, /* exit master */ - NGX_MODULE_V1_PADDING -}; - - -int ngx_ssl_connection_index; -int ngx_ssl_server_conf_index; -int ngx_ssl_session_cache_index; -int ngx_ssl_ticket_keys_index; -int ngx_ssl_ocsp_index; -int ngx_ssl_index; -int ngx_ssl_certificate_name_index; -int ngx_ssl_certificate_comp_index; -int ngx_ssl_client_hello_arg_index; - - -u_char ngx_ssl_session_buffer[NGX_SSL_MAX_SESSION_SIZE]; - - -ngx_int_t -ngx_ssl_init(ngx_log_t *log) -{ -#if (OPENSSL_INIT_LOAD_CONFIG && !defined LIBRESSL_VERSION_NUMBER) - - uint64_t opts; - OPENSSL_INIT_SETTINGS *init; - - opts = OPENSSL_INIT_LOAD_CONFIG; - -#if (NGX_OPENSSL_NO_CONFIG) - - if (getenv("OPENSSL_CONF") == NULL) { - opts = OPENSSL_INIT_NO_LOAD_CONFIG; - } - -#endif - - init = OPENSSL_INIT_new(); - if (init == NULL) { - ngx_ssl_error(NGX_LOG_ALERT, log, 0, "OPENSSL_INIT_new() failed"); - return NGX_ERROR; - } - -#ifndef OPENSSL_NO_STDIO - if (OPENSSL_INIT_set_config_appname(init, "nginx") == 0) { - ngx_ssl_error(NGX_LOG_ALERT, log, 0, - "OPENSSL_INIT_set_config_appname() failed"); - return NGX_ERROR; - } -#endif - - if (OPENSSL_init_ssl(opts, init) == 0) { - ngx_ssl_error(NGX_LOG_ALERT, log, 0, "OPENSSL_init_ssl() failed"); - return NGX_ERROR; - } - - OPENSSL_INIT_free(init); - - /* - * OPENSSL_init_ssl() may leave errors in the error queue - * while returning success - */ - - ERR_clear_error(); - -#else - -#if (NGX_OPENSSL_NO_CONFIG) - - if (getenv("OPENSSL_CONF") == NULL) { - OPENSSL_no_config(); - } - -#endif - - OPENSSL_config("nginx"); - - SSL_library_init(); - SSL_load_error_strings(); - - OpenSSL_add_all_algorithms(); - -#endif - -#ifndef SSL_OP_NO_COMPRESSION - { - /* - * Disable gzip compression in OpenSSL prior to 1.0.0 version, - * this saves about 522K per connection. - */ - int n; - STACK_OF(SSL_COMP) *ssl_comp_methods; - - ssl_comp_methods = SSL_COMP_get_compression_methods(); - n = sk_SSL_COMP_num(ssl_comp_methods); - - while (n--) { - (void) sk_SSL_COMP_pop(ssl_comp_methods); - } - } -#endif - - ngx_ssl_connection_index = SSL_get_ex_new_index(0, NULL, NULL, NULL, NULL); - - if (ngx_ssl_connection_index == -1) { - ngx_ssl_error(NGX_LOG_ALERT, log, 0, "SSL_get_ex_new_index() failed"); - return NGX_ERROR; - } - - ngx_ssl_server_conf_index = SSL_CTX_get_ex_new_index(0, NULL, NULL, NULL, - NULL); - if (ngx_ssl_server_conf_index == -1) { - ngx_ssl_error(NGX_LOG_ALERT, log, 0, - "SSL_CTX_get_ex_new_index() failed"); - return NGX_ERROR; - } - - ngx_ssl_session_cache_index = SSL_CTX_get_ex_new_index(0, NULL, NULL, NULL, - NULL); - if (ngx_ssl_session_cache_index == -1) { - ngx_ssl_error(NGX_LOG_ALERT, log, 0, - "SSL_CTX_get_ex_new_index() failed"); - return NGX_ERROR; - } - - ngx_ssl_ticket_keys_index = SSL_CTX_get_ex_new_index(0, NULL, NULL, NULL, - NULL); - if (ngx_ssl_ticket_keys_index == -1) { - ngx_ssl_error(NGX_LOG_ALERT, log, 0, - "SSL_CTX_get_ex_new_index() failed"); - return NGX_ERROR; - } - - ngx_ssl_ocsp_index = SSL_CTX_get_ex_new_index(0, NULL, NULL, NULL, NULL); - if (ngx_ssl_ocsp_index == -1) { - ngx_ssl_error(NGX_LOG_ALERT, log, 0, - "SSL_CTX_get_ex_new_index() failed"); - return NGX_ERROR; - } - - ngx_ssl_index = SSL_CTX_get_ex_new_index(0, NULL, NULL, NULL, NULL); - - if (ngx_ssl_index == -1) { - ngx_ssl_error(NGX_LOG_ALERT, log, 0, - "SSL_CTX_get_ex_new_index() failed"); - return NGX_ERROR; - } - - ngx_ssl_certificate_name_index = X509_get_ex_new_index(0, NULL, NULL, NULL, - NULL); - - if (ngx_ssl_certificate_name_index == -1) { - ngx_ssl_error(NGX_LOG_ALERT, log, 0, "X509_get_ex_new_index() failed"); - return NGX_ERROR; - } - - ngx_ssl_certificate_comp_index = X509_get_ex_new_index(0, NULL, NULL, NULL, - NULL); - if (ngx_ssl_certificate_comp_index == -1) { - ngx_ssl_error(NGX_LOG_ALERT, log, 0, "X509_get_ex_new_index() failed"); - return NGX_ERROR; - } - - ngx_ssl_client_hello_arg_index = SSL_CTX_get_ex_new_index(0, NULL, NULL, - NULL, NULL); - if (ngx_ssl_client_hello_arg_index == -1) { - ngx_ssl_error(NGX_LOG_ALERT, log, 0, - "SSL_CTX_get_ex_new_index() failed"); - return NGX_ERROR; - } - - return NGX_OK; -} - - -ngx_int_t -ngx_ssl_create(ngx_ssl_t *ssl, ngx_uint_t protocols, void *data) -{ - ssl->ctx = SSL_CTX_new(SSLv23_method()); - - if (ssl->ctx == NULL) { - ngx_ssl_error(NGX_LOG_EMERG, ssl->log, 0, "SSL_CTX_new() failed"); - return NGX_ERROR; - } - - if (SSL_CTX_set_ex_data(ssl->ctx, ngx_ssl_server_conf_index, data) == 0) { - ngx_ssl_error(NGX_LOG_EMERG, ssl->log, 0, - "SSL_CTX_set_ex_data() failed"); - return NGX_ERROR; - } - - if (SSL_CTX_set_ex_data(ssl->ctx, ngx_ssl_index, ssl) == 0) { - ngx_ssl_error(NGX_LOG_EMERG, ssl->log, 0, - "SSL_CTX_set_ex_data() failed"); - return NGX_ERROR; - } - - ngx_rbtree_init(&ssl->staple_rbtree, &ssl->staple_sentinel, - ngx_rbtree_insert_value); - - ssl->buffer_size = NGX_SSL_BUFSIZE; - - /* client side options */ - -#ifdef SSL_OP_MICROSOFT_SESS_ID_BUG - SSL_CTX_set_options(ssl->ctx, SSL_OP_MICROSOFT_SESS_ID_BUG); -#endif - -#ifdef SSL_OP_NETSCAPE_CHALLENGE_BUG - SSL_CTX_set_options(ssl->ctx, SSL_OP_NETSCAPE_CHALLENGE_BUG); -#endif - - /* server side options */ - -#ifdef SSL_OP_SSLREF2_REUSE_CERT_TYPE_BUG - SSL_CTX_set_options(ssl->ctx, SSL_OP_SSLREF2_REUSE_CERT_TYPE_BUG); -#endif - -#ifdef SSL_OP_MICROSOFT_BIG_SSLV3_BUFFER - SSL_CTX_set_options(ssl->ctx, SSL_OP_MICROSOFT_BIG_SSLV3_BUFFER); -#endif - -#ifdef SSL_OP_SSLEAY_080_CLIENT_DH_BUG - SSL_CTX_set_options(ssl->ctx, SSL_OP_SSLEAY_080_CLIENT_DH_BUG); -#endif - -#ifdef SSL_OP_TLS_D5_BUG - SSL_CTX_set_options(ssl->ctx, SSL_OP_TLS_D5_BUG); -#endif - -#ifdef SSL_OP_TLS_BLOCK_PADDING_BUG - SSL_CTX_set_options(ssl->ctx, SSL_OP_TLS_BLOCK_PADDING_BUG); -#endif - -#ifdef SSL_OP_DONT_INSERT_EMPTY_FRAGMENTS - SSL_CTX_set_options(ssl->ctx, SSL_OP_DONT_INSERT_EMPTY_FRAGMENTS); -#endif - - SSL_CTX_set_options(ssl->ctx, SSL_OP_SINGLE_DH_USE); - -#if OPENSSL_VERSION_NUMBER >= 0x009080dfL - /* only in 0.9.8m+ */ - SSL_CTX_clear_options(ssl->ctx, - SSL_OP_NO_SSLv2|SSL_OP_NO_SSLv3|SSL_OP_NO_TLSv1); -#endif - - if (!(protocols & NGX_SSL_SSLv2)) { - SSL_CTX_set_options(ssl->ctx, SSL_OP_NO_SSLv2); - } - if (!(protocols & NGX_SSL_SSLv3)) { - SSL_CTX_set_options(ssl->ctx, SSL_OP_NO_SSLv3); - } - if (!(protocols & NGX_SSL_TLSv1)) { - SSL_CTX_set_options(ssl->ctx, SSL_OP_NO_TLSv1); - } -#ifdef SSL_OP_NO_TLSv1_1 - SSL_CTX_clear_options(ssl->ctx, SSL_OP_NO_TLSv1_1); - if (!(protocols & NGX_SSL_TLSv1_1)) { - SSL_CTX_set_options(ssl->ctx, SSL_OP_NO_TLSv1_1); - } -#endif -#ifdef SSL_OP_NO_TLSv1_2 - SSL_CTX_clear_options(ssl->ctx, SSL_OP_NO_TLSv1_2); - if (!(protocols & NGX_SSL_TLSv1_2)) { - SSL_CTX_set_options(ssl->ctx, SSL_OP_NO_TLSv1_2); - } -#endif -#ifdef SSL_OP_NO_TLSv1_3 - SSL_CTX_clear_options(ssl->ctx, SSL_OP_NO_TLSv1_3); - if (!(protocols & NGX_SSL_TLSv1_3)) { - SSL_CTX_set_options(ssl->ctx, SSL_OP_NO_TLSv1_3); - } -#endif - -#ifdef SSL_CTX_set_min_proto_version - SSL_CTX_set_min_proto_version(ssl->ctx, 0); - SSL_CTX_set_max_proto_version(ssl->ctx, TLS1_2_VERSION); -#endif - -#ifdef TLS1_3_VERSION - SSL_CTX_set_min_proto_version(ssl->ctx, 0); - SSL_CTX_set_max_proto_version(ssl->ctx, TLS1_3_VERSION); -#endif - -#ifdef SSL_OP_NO_COMPRESSION - SSL_CTX_set_options(ssl->ctx, SSL_OP_NO_COMPRESSION); -#endif - -#ifdef SSL_OP_NO_TX_CERTIFICATE_COMPRESSION - SSL_CTX_set_options(ssl->ctx, SSL_OP_NO_TX_CERTIFICATE_COMPRESSION); - SSL_CTX_set_options(ssl->ctx, SSL_OP_NO_RX_CERTIFICATE_COMPRESSION); -#endif - -#ifdef SSL_OP_NO_ANTI_REPLAY - SSL_CTX_set_options(ssl->ctx, SSL_OP_NO_ANTI_REPLAY); -#endif - -#ifdef SSL_OP_NO_CLIENT_RENEGOTIATION - SSL_CTX_set_options(ssl->ctx, SSL_OP_NO_CLIENT_RENEGOTIATION); -#endif - -#ifdef SSL_OP_IGNORE_UNEXPECTED_EOF - SSL_CTX_set_options(ssl->ctx, SSL_OP_IGNORE_UNEXPECTED_EOF); -#endif - -#ifdef SSL_MODE_RELEASE_BUFFERS - SSL_CTX_set_mode(ssl->ctx, SSL_MODE_RELEASE_BUFFERS); -#endif - -#ifdef SSL_MODE_NO_AUTO_CHAIN - SSL_CTX_set_mode(ssl->ctx, SSL_MODE_NO_AUTO_CHAIN); -#endif - - SSL_CTX_set_read_ahead(ssl->ctx, 1); - - SSL_CTX_set_info_callback(ssl->ctx, ngx_ssl_info_callback); - - return NGX_OK; -} - - -ngx_int_t -ngx_ssl_certificates(ngx_conf_t *cf, ngx_ssl_t *ssl, ngx_array_t *certs, - ngx_array_t *keys, ngx_array_t *passwords) -{ - ngx_str_t *cert, *key; - ngx_uint_t i; - - cert = certs->elts; - key = keys->elts; - - for (i = 0; i < certs->nelts; i++) { - - if (ngx_ssl_certificate(cf, ssl, &cert[i], &key[i], passwords) - != NGX_OK) - { - return NGX_ERROR; - } - } - - return NGX_OK; -} - - -ngx_int_t -ngx_ssl_certificate(ngx_conf_t *cf, ngx_ssl_t *ssl, ngx_str_t *cert, - ngx_str_t *key, ngx_array_t *passwords) -{ - char *err; - X509 *x509, **elm; - u_long n; - EVP_PKEY *pkey; - ngx_uint_t mask; - STACK_OF(X509) *chain; - - mask = 0; - elm = NULL; - -retry: - - chain = ngx_ssl_cache_fetch(cf, NGX_SSL_CACHE_CERT | mask, - &err, cert, NULL); - if (chain == NULL) { - if (err != NULL) { - ngx_ssl_error(NGX_LOG_EMERG, ssl->log, 0, - "cannot load certificate \"%s\": %s", - cert->data, err); - } - - return NGX_ERROR; - } - - x509 = sk_X509_shift(chain); - - if (SSL_CTX_use_certificate(ssl->ctx, x509) == 0) { - ngx_ssl_error(NGX_LOG_EMERG, ssl->log, 0, - "SSL_CTX_use_certificate(\"%s\") failed", cert->data); - X509_free(x509); - sk_X509_pop_free(chain, X509_free); - return NGX_ERROR; - } - - if (X509_set_ex_data(x509, ngx_ssl_certificate_name_index, cert->data) - == 0) - { - ngx_ssl_error(NGX_LOG_EMERG, ssl->log, 0, "X509_set_ex_data() failed"); - X509_free(x509); - sk_X509_pop_free(chain, X509_free); - return NGX_ERROR; - } - - if (ssl->certs.elts == NULL) { - if (ngx_array_init(&ssl->certs, cf->pool, 1, sizeof(X509 *)) - != NGX_OK) - { - X509_free(x509); - sk_X509_pop_free(chain, X509_free); - return NGX_ERROR; - } - } - - if (elm == NULL) { - elm = ngx_array_push(&ssl->certs); - if (elm == NULL) { - X509_free(x509); - sk_X509_pop_free(chain, X509_free); - return NGX_ERROR; - } - - } else { - X509_free(*elm); - } - - *elm = x509; - - /* - * Note that x509 is not freed here, but will be instead freed in - * ngx_ssl_cleanup_ctx(). This is because we need to preserve all - * certificates to be able to iterate all of them through ssl->certs, - * while OpenSSL can free a certificate if it is replaced with another - * certificate of the same type. - */ - -#ifdef SSL_CTX_set0_chain - - if (SSL_CTX_set0_chain(ssl->ctx, chain) == 0) { - ngx_ssl_error(NGX_LOG_EMERG, ssl->log, 0, - "SSL_CTX_set0_chain(\"%s\") failed", cert->data); - sk_X509_pop_free(chain, X509_free); - return NGX_ERROR; - } - -#else - - /* SSL_CTX_set0_chain() is only available in OpenSSL 1.0.2+ */ - -#ifdef SSL_CTRL_CLEAR_EXTRA_CHAIN_CERTS - /* OpenSSL 1.0.1+ */ - SSL_CTX_clear_extra_chain_certs(ssl->ctx); -#else - - if (ssl->ctx->extra_certs) { - sk_X509_pop_free(ssl->ctx->extra_certs, X509_free); - ssl->ctx->extra_certs = NULL; - } - -#endif - - n = sk_X509_num(chain); - - while (n--) { - x509 = sk_X509_shift(chain); - - if (SSL_CTX_add_extra_chain_cert(ssl->ctx, x509) == 0) { - ngx_ssl_error(NGX_LOG_EMERG, ssl->log, 0, - "SSL_CTX_add_extra_chain_cert(\"%s\") failed", - cert->data); - sk_X509_pop_free(chain, X509_free); - return NGX_ERROR; - } - } - - sk_X509_free(chain); - -#endif - - pkey = ngx_ssl_cache_fetch(cf, NGX_SSL_CACHE_PKEY | mask, - &err, key, passwords); - if (pkey == NULL) { - if (err != NULL) { - ngx_ssl_error(NGX_LOG_EMERG, ssl->log, 0, - "cannot load certificate key \"%s\": %s", - key->data, err); - } - - return NGX_ERROR; - } - - if (SSL_CTX_use_PrivateKey(ssl->ctx, pkey) == 0) { - EVP_PKEY_free(pkey); - - /* there can be mismatched pairs on uneven cache update */ - - n = ERR_peek_last_error(); - - if (ERR_GET_LIB(n) == ERR_LIB_X509 - && ERR_GET_REASON(n) == X509_R_KEY_VALUES_MISMATCH - && mask == 0) - { - ERR_clear_error(); - mask = NGX_SSL_CACHE_INVALIDATE; - goto retry; - } - - ngx_ssl_error(NGX_LOG_EMERG, ssl->log, 0, - "SSL_CTX_use_PrivateKey(\"%s\") failed", key->data); - return NGX_ERROR; - } - - EVP_PKEY_free(pkey); - - return NGX_OK; -} - - -ngx_int_t -ngx_ssl_connection_certificate(ngx_connection_t *c, ngx_pool_t *pool, - ngx_str_t *cert, ngx_str_t *key, ngx_ssl_cache_t *cache, - ngx_array_t *passwords) -{ - char *err; - X509 *x509; - u_long n; - EVP_PKEY *pkey; - ngx_uint_t mask; - STACK_OF(X509) *chain; - - mask = 0; - -retry: - - chain = ngx_ssl_cache_connection_fetch(cache, pool, - NGX_SSL_CACHE_CERT | mask, - &err, cert, NULL); - if (chain == NULL) { - if (err != NULL) { - ngx_ssl_error(NGX_LOG_ERR, c->log, 0, - "cannot load certificate \"%s\": %s", - cert->data, err); - } - - return NGX_ERROR; - } - - x509 = sk_X509_shift(chain); - - if (SSL_use_certificate(c->ssl->connection, x509) == 0) { - ngx_ssl_error(NGX_LOG_ERR, c->log, 0, - "SSL_use_certificate(\"%s\") failed", cert->data); - X509_free(x509); - sk_X509_pop_free(chain, X509_free); - return NGX_ERROR; - } - - X509_free(x509); - -#ifdef SSL_set0_chain - - /* - * SSL_set0_chain() is only available in OpenSSL 1.0.2+, - * but this function is only called via certificate callback, - * which is only available in OpenSSL 1.0.2+ as well - */ - - if (SSL_set0_chain(c->ssl->connection, chain) == 0) { - ngx_ssl_error(NGX_LOG_ERR, c->log, 0, - "SSL_set0_chain(\"%s\") failed", cert->data); - sk_X509_pop_free(chain, X509_free); - return NGX_ERROR; - } - -#endif - - pkey = ngx_ssl_cache_connection_fetch(cache, pool, - NGX_SSL_CACHE_PKEY | mask, - &err, key, passwords); - if (pkey == NULL) { - if (err != NULL) { - ngx_ssl_error(NGX_LOG_ERR, c->log, 0, - "cannot load certificate key \"%s\": %s", - key->data, err); - } - - return NGX_ERROR; - } - - if (SSL_use_PrivateKey(c->ssl->connection, pkey) == 0) { - EVP_PKEY_free(pkey); - - /* there can be mismatched pairs on uneven cache update */ - - n = ERR_peek_last_error(); - - if (ERR_GET_LIB(n) == ERR_LIB_X509 - && ERR_GET_REASON(n) == X509_R_KEY_VALUES_MISMATCH - && mask == 0) - { - ERR_clear_error(); - mask = NGX_SSL_CACHE_INVALIDATE; - goto retry; - } - - ngx_ssl_error(NGX_LOG_ERR, c->log, 0, - "SSL_use_PrivateKey(\"%s\") failed", key->data); - return NGX_ERROR; - } - - EVP_PKEY_free(pkey); - - return NGX_OK; -} - - -ngx_int_t -ngx_ssl_certificate_compression(ngx_conf_t *cf, ngx_ssl_t *ssl, - ngx_uint_t enable) -{ - if (!enable) { - return NGX_OK; - } - -#ifdef SSL_OP_NO_TX_CERTIFICATE_COMPRESSION - - if (SSL_CTX_compress_certs(ssl->ctx, 0) == 0) { - ngx_ssl_error(NGX_LOG_WARN, ssl->log, 0, - "SSL_CTX_compress_certs() failed, ignored"); - return NGX_OK; - } - - SSL_CTX_clear_options(ssl->ctx, SSL_OP_NO_TX_CERTIFICATE_COMPRESSION); - -#elif (NGX_ZLIB && defined TLSEXT_cert_compression_zlib) - - if (SSL_CTX_add_cert_compression_alg(ssl->ctx, TLSEXT_cert_compression_zlib, - ngx_ssl_cert_compression_callback, - NULL) - == 0) - { - ngx_ssl_error(NGX_LOG_EMERG, ssl->log, 0, - "SSL_CTX_add_cert_compression_alg() failed"); - return NGX_ERROR; - } - -#else - - ngx_log_error(NGX_LOG_WARN, ssl->log, 0, - "\"ssl_certificate_compression\" is not supported " - "on this platform, ignored"); - -#endif - - return NGX_OK; -} - - -#if (NGX_ZLIB && defined TLSEXT_cert_compression_zlib) - -static int -ngx_ssl_cert_compression_callback(ngx_ssl_conn_t *ssl_conn, CBB *out, - const uint8_t *in, size_t in_len) -{ - int rc; - X509 *cert; - u_char *p; - z_stream zstream; - ngx_str_t *comp, tmp; - ngx_pool_t *pool; - ngx_connection_t *c; - -#ifdef OPENSSL_IS_BORINGSSL - { - SSL_CTX *ssl_ctx; - ngx_ssl_t *ssl; - - /* BoringSSL doesn't have certificate slots, we take the last set */ - - ssl_ctx = SSL_get_SSL_CTX(ssl_conn); - ssl = SSL_CTX_get_ex_data(ssl_ctx, ngx_ssl_index); - cert = ((X509 **) ssl->certs.elts)[ssl->certs.nelts - 1]; - } -#else - - /* - * AWS-LC saves leaf certificate in SSL to associate with SSL_CTX, - * see https://github.com/aws/aws-lc/commit/e1ba2b3e5 - */ - - cert = SSL_get_certificate(ssl_conn); - -#endif - - comp = X509_get_ex_data(cert, ngx_ssl_certificate_comp_index); - - if (comp != NULL) { - return CBB_add_bytes(out, comp->data, comp->len); - } - - c = ngx_ssl_get_connection(ssl_conn); - - pool = ngx_create_pool(256, c->log); - if (pool == NULL) { - return 0; - } - - pool->log = c->log; - - ngx_memzero(&zstream, sizeof(z_stream)); - - zstream.zalloc = ngx_ssl_cert_compression_alloc; - zstream.zfree = ngx_ssl_cert_compression_free; - zstream.opaque = pool; - - rc = deflateInit(&zstream, Z_DEFAULT_COMPRESSION); - - if (rc != Z_OK) { - ngx_log_error(NGX_LOG_ALERT, c->log, 0, "deflateInit() failed: %d", rc); - goto error; - } - - tmp.len = deflateBound(&zstream, in_len); - tmp.data = ngx_palloc(pool, tmp.len); - if (tmp.data == NULL) { - goto error; - } - - zstream.next_in = (u_char *) in; - zstream.avail_in = in_len; - zstream.next_out = tmp.data; - zstream.avail_out = tmp.len; - - rc = deflate(&zstream, Z_FINISH); - - if (rc != Z_STREAM_END) { - ngx_log_error(NGX_LOG_ALERT, c->log, 0, - "deflate(Z_FINISH) failed: %d", rc); - goto error; - } - - tmp.len -= zstream.avail_out; - - rc = deflateEnd(&zstream); - - if (rc != Z_OK) { - ngx_log_error(NGX_LOG_ALERT, c->log, 0, "deflateEnd() failed: %d", rc); - goto error; - } - - p = ngx_alloc(sizeof(ngx_str_t) + tmp.len, c->log); - if (p == NULL) { - goto error; - } - - comp = (ngx_str_t *) p; - - comp->len = tmp.len; - comp->data = p + sizeof(ngx_str_t); - - ngx_memcpy(comp->data, tmp.data, tmp.len); - - if (X509_set_ex_data(cert, ngx_ssl_certificate_comp_index, p) == 0) { - ngx_ssl_error(NGX_LOG_ALERT, c->log, 0, "X509_set_ex_data() failed"); - ngx_free(p); - } - - rc = CBB_add_bytes(out, tmp.data, tmp.len); - - ngx_destroy_pool(pool); - - return rc; - -error: - - ngx_destroy_pool(pool); - - return 0; -} - - -static void * -ngx_ssl_cert_compression_alloc(void *opaque, u_int items, u_int size) -{ - ngx_pool_t *pool = opaque; - - ngx_log_debug2(NGX_LOG_DEBUG_EVENT, pool->log, 0, - "cert compression alloc: n:%ud s:%ud", items, size); - - return ngx_palloc(pool, items * size); -} - - -static void -ngx_ssl_cert_compression_free(void *opaque, void *address) -{ -#if 0 - ngx_pool_t *pool = opaque; - - ngx_log_debug1(NGX_LOG_DEBUG_EVENT, pool->log, 0, - "cert compression free: %p", address); -#endif -} - -#endif - - -ngx_int_t -ngx_ssl_ciphers(ngx_conf_t *cf, ngx_ssl_t *ssl, ngx_str_t *ciphers, - ngx_uint_t prefer_server_ciphers) -{ - if (SSL_CTX_set_cipher_list(ssl->ctx, (char *) ciphers->data) == 0) { - ngx_ssl_error(NGX_LOG_EMERG, ssl->log, 0, - "SSL_CTX_set_cipher_list(\"%V\") failed", - ciphers); - return NGX_ERROR; - } - - if (prefer_server_ciphers) { - SSL_CTX_set_options(ssl->ctx, SSL_OP_CIPHER_SERVER_PREFERENCE); - } - - return NGX_OK; -} - - -ngx_int_t -ngx_ssl_client_certificate(ngx_conf_t *cf, ngx_ssl_t *ssl, ngx_str_t *cert, - ngx_int_t depth) -{ - int n, i; - char *err; - X509 *x509; - X509_NAME *name; -#if (OPENSSL_VERSION_NUMBER >= 0x40000000L) - const -#endif - X509_NAME *sname; - X509_STORE *store; - STACK_OF(X509) *chain; - STACK_OF(X509_NAME) *list; - - SSL_CTX_set_verify(ssl->ctx, SSL_VERIFY_PEER, ngx_ssl_verify_callback); - - SSL_CTX_set_verify_depth(ssl->ctx, depth); - - if (cert->len == 0) { - return NGX_OK; - } - - list = sk_X509_NAME_new(ngx_ssl_cmp_x509_name); - if (list == NULL) { - return NGX_ERROR; - } - - store = SSL_CTX_get_cert_store(ssl->ctx); - - if (store == NULL) { - ngx_ssl_error(NGX_LOG_EMERG, ssl->log, 0, - "SSL_CTX_get_cert_store() failed"); - return NGX_ERROR; - } - - chain = ngx_ssl_cache_fetch(cf, NGX_SSL_CACHE_CA, &err, cert, NULL); - if (chain == NULL) { - if (err != NULL) { - ngx_ssl_error(NGX_LOG_EMERG, ssl->log, 0, - "cannot load certificate \"%s\": %s", - cert->data, err); - } - - sk_X509_NAME_pop_free(list, X509_NAME_free); - return NGX_ERROR; - } - - n = sk_X509_num(chain); - - for (i = 0; i < n; i++) { - x509 = sk_X509_value(chain, i); - - if (X509_STORE_add_cert(store, x509) != 1) { - - if (ngx_ssl_cert_already_in_hash()) { - continue; - } - - ngx_ssl_error(NGX_LOG_EMERG, ssl->log, 0, - "X509_STORE_add_cert(\"%s\") failed", cert->data); - sk_X509_NAME_pop_free(list, X509_NAME_free); - sk_X509_pop_free(chain, X509_free); - return NGX_ERROR; - } - - sname = X509_get_subject_name(x509); - if (sname == NULL) { - ngx_ssl_error(NGX_LOG_EMERG, ssl->log, 0, - "X509_get_subject_name(\"%s\") failed", cert->data); - sk_X509_NAME_pop_free(list, X509_NAME_free); - sk_X509_pop_free(chain, X509_free); - return NGX_ERROR; - } - - name = X509_NAME_dup(sname); - if (name == NULL) { - sk_X509_NAME_pop_free(list, X509_NAME_free); - sk_X509_pop_free(chain, X509_free); - return NGX_ERROR; - } - -#ifdef OPENSSL_IS_BORINGSSL - if (sk_X509_NAME_find(list, NULL, name) > 0) { -#else - if (sk_X509_NAME_find(list, name) >= 0) { -#endif - X509_NAME_free(name); - continue; - } - - if (sk_X509_NAME_push(list, name) == 0) { - sk_X509_NAME_pop_free(list, X509_NAME_free); - sk_X509_pop_free(chain, X509_free); - X509_NAME_free(name); - return NGX_ERROR; - } - } - - sk_X509_pop_free(chain, X509_free); - - SSL_CTX_set_client_CA_list(ssl->ctx, list); - - return NGX_OK; -} - - -ngx_int_t -ngx_ssl_trusted_certificate(ngx_conf_t *cf, ngx_ssl_t *ssl, ngx_str_t *cert, - ngx_int_t depth) -{ - int i, n; - char *err; - X509 *x509; - X509_STORE *store; - STACK_OF(X509) *chain; - - SSL_CTX_set_verify(ssl->ctx, SSL_CTX_get_verify_mode(ssl->ctx), - ngx_ssl_verify_callback); - - SSL_CTX_set_verify_depth(ssl->ctx, depth); - - if (cert->len == 0) { - return NGX_OK; - } - - store = SSL_CTX_get_cert_store(ssl->ctx); - - if (store == NULL) { - ngx_ssl_error(NGX_LOG_EMERG, ssl->log, 0, - "SSL_CTX_get_cert_store() failed"); - return NGX_ERROR; - } - - chain = ngx_ssl_cache_fetch(cf, NGX_SSL_CACHE_CA, &err, cert, NULL); - if (chain == NULL) { - if (err != NULL) { - ngx_ssl_error(NGX_LOG_EMERG, ssl->log, 0, - "cannot load certificate \"%s\": %s", - cert->data, err); - } - - return NGX_ERROR; - } - - n = sk_X509_num(chain); - - for (i = 0; i < n; i++) { - x509 = sk_X509_value(chain, i); - - if (X509_STORE_add_cert(store, x509) != 1) { - - if (ngx_ssl_cert_already_in_hash()) { - continue; - } - - ngx_ssl_error(NGX_LOG_EMERG, ssl->log, 0, - "X509_STORE_add_cert(\"%s\") failed", cert->data); - sk_X509_pop_free(chain, X509_free); - return NGX_ERROR; - } - } - - sk_X509_pop_free(chain, X509_free); - - return NGX_OK; -} - - -ngx_int_t -ngx_ssl_crl(ngx_conf_t *cf, ngx_ssl_t *ssl, ngx_str_t *crl) -{ - int n, i; - char *err; - X509_CRL *x509; - X509_STORE *store; - STACK_OF(X509_CRL) *chain; - - if (crl->len == 0) { - return NGX_OK; - } - - store = SSL_CTX_get_cert_store(ssl->ctx); - - if (store == NULL) { - ngx_ssl_error(NGX_LOG_EMERG, ssl->log, 0, - "SSL_CTX_get_cert_store() failed"); - return NGX_ERROR; - } - - chain = ngx_ssl_cache_fetch(cf, NGX_SSL_CACHE_CRL, &err, crl, NULL); - if (chain == NULL) { - if (err != NULL) { - ngx_ssl_error(NGX_LOG_EMERG, ssl->log, 0, - "cannot load CRL \"%s\": %s", crl->data, err); - } - - return NGX_ERROR; - } - - n = sk_X509_CRL_num(chain); - - for (i = 0; i < n; i++) { - x509 = sk_X509_CRL_value(chain, i); - - if (X509_STORE_add_crl(store, x509) != 1) { - - if (ngx_ssl_cert_already_in_hash()) { - continue; - } - - ngx_ssl_error(NGX_LOG_EMERG, ssl->log, 0, - "X509_STORE_add_crl(\"%s\") failed", crl->data); - sk_X509_CRL_pop_free(chain, X509_CRL_free); - return NGX_ERROR; - } - } - - sk_X509_CRL_pop_free(chain, X509_CRL_free); - - X509_STORE_set_flags(store, - X509_V_FLAG_CRL_CHECK|X509_V_FLAG_CRL_CHECK_ALL); - - return NGX_OK; -} - - -static ngx_inline ngx_int_t -ngx_ssl_cert_already_in_hash(void) -{ -#if !(OPENSSL_VERSION_NUMBER >= 0x1010009fL \ - || LIBRESSL_VERSION_NUMBER >= 0x3050000fL) - u_long error; - - /* - * OpenSSL prior to 1.1.0i doesn't ignore duplicate certificate entries, - * see https://github.com/openssl/openssl/commit/c0452248 - */ - - error = ERR_peek_last_error(); - - if (ERR_GET_LIB(error) == ERR_LIB_X509 - && ERR_GET_REASON(error) == X509_R_CERT_ALREADY_IN_HASH_TABLE) - { - ERR_clear_error(); - return 1; - } -#endif - - return 0; -} - - -static int -ngx_ssl_verify_callback(int ok, X509_STORE_CTX *x509_store) -{ -#if (NGX_DEBUG) - char *subject, *issuer; - int err, depth; - X509 *cert; -#if (OPENSSL_VERSION_NUMBER >= 0x40000000L) - const -#endif - X509_NAME *sname, *iname; - ngx_connection_t *c; - ngx_ssl_conn_t *ssl_conn; - - ssl_conn = X509_STORE_CTX_get_ex_data(x509_store, - SSL_get_ex_data_X509_STORE_CTX_idx()); - - c = ngx_ssl_get_connection(ssl_conn); - - if (!(c->log->log_level & NGX_LOG_DEBUG_EVENT)) { - return 1; - } - - cert = X509_STORE_CTX_get_current_cert(x509_store); - err = X509_STORE_CTX_get_error(x509_store); - depth = X509_STORE_CTX_get_error_depth(x509_store); - - sname = X509_get_subject_name(cert); - - if (sname) { - subject = X509_NAME_oneline(sname, NULL, 0); - if (subject == NULL) { - ngx_ssl_error(NGX_LOG_ALERT, c->log, 0, - "X509_NAME_oneline() failed"); - } - - } else { - subject = NULL; - } - - iname = X509_get_issuer_name(cert); - - if (iname) { - issuer = X509_NAME_oneline(iname, NULL, 0); - if (issuer == NULL) { - ngx_ssl_error(NGX_LOG_ALERT, c->log, 0, - "X509_NAME_oneline() failed"); - } - - } else { - issuer = NULL; - } - - ngx_log_debug5(NGX_LOG_DEBUG_EVENT, c->log, 0, - "verify:%d, error:%d, depth:%d, " - "subject:\"%s\", issuer:\"%s\"", - ok, err, depth, - subject ? subject : "(none)", - issuer ? issuer : "(none)"); - - if (subject) { - OPENSSL_free(subject); - } - - if (issuer) { - OPENSSL_free(issuer); - } -#endif - - return 1; -} - - -static void -ngx_ssl_info_callback(const ngx_ssl_conn_t *ssl_conn, int where, int ret) -{ - BIO *rbio, *wbio; - ngx_connection_t *c; - -#if (!defined SSL_OP_NO_RENEGOTIATION \ - && !defined SSL_OP_NO_CLIENT_RENEGOTIATION) - - if ((where & SSL_CB_HANDSHAKE_START) - && SSL_is_server((ngx_ssl_conn_t *) ssl_conn)) - { - c = ngx_ssl_get_connection((ngx_ssl_conn_t *) ssl_conn); - - if (c->ssl->handshaked) { - c->ssl->renegotiation = 1; - ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0, "SSL renegotiation"); - } - } - -#endif - -#ifdef TLS1_3_VERSION - - if ((where & SSL_CB_ACCEPT_LOOP) == SSL_CB_ACCEPT_LOOP - && SSL_version(ssl_conn) == TLS1_3_VERSION) - { - time_t now, time, timeout, conf_timeout; - SSL_SESSION *sess; - - /* - * OpenSSL with TLSv1.3 updates the session creation time on - * session resumption and keeps the session timeout unmodified, - * making it possible to maintain the session forever, bypassing - * client certificate expiration and revocation. To make sure - * session timeouts are actually used, we now update the session - * creation time and reduce the session timeout accordingly. - * - * BoringSSL with TLSv1.3 ignores configured session timeouts - * and uses a hardcoded timeout instead, 7 days. So we update - * session timeout to the configured value as soon as a session - * is created. - */ - - c = ngx_ssl_get_connection((ngx_ssl_conn_t *) ssl_conn); - sess = SSL_get0_session(ssl_conn); - - if (!c->ssl->session_timeout_set && sess) { - c->ssl->session_timeout_set = 1; - - now = ngx_time(); - time = SSL_SESSION_get_time(sess); - timeout = SSL_SESSION_get_timeout(sess); - conf_timeout = SSL_CTX_get_timeout(c->ssl->session_ctx); - - timeout = ngx_min(timeout, conf_timeout); - - if (now - time >= timeout) { - SSL_SESSION_set1_id_context(sess, (unsigned char *) "", 0); - - } else { - SSL_SESSION_set_time(sess, now); - SSL_SESSION_set_timeout(sess, timeout - (now - time)); - } - } - } - -#endif - - if ((where & SSL_CB_ACCEPT_LOOP) == SSL_CB_ACCEPT_LOOP) { - c = ngx_ssl_get_connection((ngx_ssl_conn_t *) ssl_conn); - - if (!c->ssl->handshake_buffer_set) { - /* - * By default OpenSSL uses 4k buffer during a handshake, - * which is too low for long certificate chains and might - * result in extra round-trips. - * - * To adjust a buffer size we detect that buffering was added - * to write side of the connection by comparing rbio and wbio. - * If they are different, we assume that it's due to buffering - * added to wbio, and set buffer size. - */ - - rbio = SSL_get_rbio(ssl_conn); - wbio = SSL_get_wbio(ssl_conn); - - if (rbio != wbio) { - (void) BIO_set_write_buffer_size(wbio, NGX_SSL_BUFSIZE); - c->ssl->handshake_buffer_set = 1; - } - } - } -} - - -static int -ngx_ssl_cmp_x509_name(const X509_NAME *const *a, const X509_NAME *const *b) -{ - return (X509_NAME_cmp(*a, *b)); -} - - -ngx_array_t * -ngx_ssl_read_password_file(ngx_conf_t *cf, ngx_str_t *file) -{ - u_char *p, *last, *end; - size_t len; - ssize_t n; - ngx_fd_t fd; - ngx_str_t *pwd; - ngx_array_t *passwords; - ngx_pool_cleanup_t *cln; - u_char buf[NGX_SSL_PASSWORD_BUFFER_SIZE]; - - if (ngx_conf_full_name(cf->cycle, file, 1) != NGX_OK) { - return NULL; - } - - passwords = ngx_array_create(cf->temp_pool, 4, sizeof(ngx_str_t)); - if (passwords == NULL) { - return NULL; - } - - cln = ngx_pool_cleanup_add(cf->temp_pool, 0); - if (cln == NULL) { - return NULL; - } - - cln->handler = ngx_ssl_passwords_cleanup; - cln->data = passwords; - - fd = ngx_open_file(file->data, NGX_FILE_RDONLY, NGX_FILE_OPEN, 0); - - if (fd == NGX_INVALID_FILE) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, ngx_errno, - ngx_open_file_n " \"%s\" failed", file->data); - return NULL; - } - - len = 0; - last = buf; - - do { - n = ngx_read_fd(fd, last, NGX_SSL_PASSWORD_BUFFER_SIZE - len); - - if (n == -1) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, ngx_errno, - ngx_read_fd_n " \"%s\" failed", file->data); - passwords = NULL; - goto cleanup; - } - - end = last + n; - - if (len && n == 0) { - *end++ = LF; - } - - p = buf; - - for ( ;; ) { - last = ngx_strlchr(last, end, LF); - - if (last == NULL) { - break; - } - - len = last++ - p; - - if (len && p[len - 1] == CR) { - len--; - } - - if (len) { - pwd = ngx_array_push(passwords); - if (pwd == NULL) { - passwords = NULL; - goto cleanup; - } - - pwd->len = len; - pwd->data = ngx_pnalloc(cf->temp_pool, len); - - if (pwd->data == NULL) { - passwords->nelts--; - passwords = NULL; - goto cleanup; - } - - ngx_memcpy(pwd->data, p, len); - } - - p = last; - } - - len = end - p; - - if (len == NGX_SSL_PASSWORD_BUFFER_SIZE) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "too long line in \"%s\"", file->data); - passwords = NULL; - goto cleanup; - } - - ngx_memmove(buf, p, len); - last = buf + len; - - } while (n != 0); - - if (passwords->nelts == 0) { - pwd = ngx_array_push(passwords); - if (pwd == NULL) { - passwords = NULL; - goto cleanup; - } - - ngx_memzero(pwd, sizeof(ngx_str_t)); - } - -cleanup: - - if (ngx_close_file(fd) == NGX_FILE_ERROR) { - ngx_conf_log_error(NGX_LOG_ALERT, cf, ngx_errno, - ngx_close_file_n " \"%s\" failed", file->data); - } - - ngx_explicit_memzero(buf, NGX_SSL_PASSWORD_BUFFER_SIZE); - - return passwords; -} - - -ngx_array_t * -ngx_ssl_preserve_passwords(ngx_conf_t *cf, ngx_array_t *passwords) -{ - ngx_str_t *opwd, *pwd; - ngx_uint_t i; - ngx_array_t *pwds; - ngx_pool_cleanup_t *cln; - static ngx_array_t empty_passwords; - - if (passwords == NULL) { - - /* - * If there are no passwords, an empty array is used - * to make sure OpenSSL's default password callback - * won't block on reading from stdin. - */ - - return &empty_passwords; - } - - /* - * Passwords are normally allocated from the temporary pool - * and cleared after parsing configuration. To be used at - * runtime they have to be copied to the configuration pool. - */ - - pwds = ngx_array_create(cf->pool, passwords->nelts, sizeof(ngx_str_t)); - if (pwds == NULL) { - return NULL; - } - - cln = ngx_pool_cleanup_add(cf->pool, 0); - if (cln == NULL) { - return NULL; - } - - cln->handler = ngx_ssl_passwords_cleanup; - cln->data = pwds; - - opwd = passwords->elts; - - for (i = 0; i < passwords->nelts; i++) { - - pwd = ngx_array_push(pwds); - if (pwd == NULL) { - return NULL; - } - - pwd->len = opwd[i].len; - pwd->data = ngx_pnalloc(cf->pool, pwd->len); - - if (pwd->data == NULL) { - pwds->nelts--; - return NULL; - } - - ngx_memcpy(pwd->data, opwd[i].data, opwd[i].len); - } - - return pwds; -} - - -static void -ngx_ssl_passwords_cleanup(void *data) -{ - ngx_array_t *passwords = data; - - ngx_str_t *pwd; - ngx_uint_t i; - - pwd = passwords->elts; - - for (i = 0; i < passwords->nelts; i++) { - ngx_explicit_memzero(pwd[i].data, pwd[i].len); - } -} - - -ngx_int_t -ngx_ssl_dhparam(ngx_conf_t *cf, ngx_ssl_t *ssl, ngx_str_t *file) -{ -#ifndef OPENSSL_NO_DH - - BIO *bio; - - if (file->len == 0) { - return NGX_OK; - } - - if (ngx_conf_full_name(cf->cycle, file, 1) != NGX_OK) { - return NGX_ERROR; - } - - bio = BIO_new_file((char *) file->data, "r"); - if (bio == NULL) { - ngx_ssl_error(NGX_LOG_EMERG, ssl->log, 0, - "BIO_new_file(\"%s\") failed", file->data); - return NGX_ERROR; - } - -#ifdef SSL_CTX_set_tmp_dh - { - DH *dh; - - dh = PEM_read_bio_DHparams(bio, NULL, NULL, NULL); - if (dh == NULL) { - ngx_ssl_error(NGX_LOG_EMERG, ssl->log, 0, - "PEM_read_bio_DHparams(\"%s\") failed", file->data); - BIO_free(bio); - return NGX_ERROR; - } - - if (SSL_CTX_set_tmp_dh(ssl->ctx, dh) != 1) { - ngx_ssl_error(NGX_LOG_EMERG, ssl->log, 0, - "SSL_CTX_set_tmp_dh(\"%s\") failed", file->data); - DH_free(dh); - BIO_free(bio); - return NGX_ERROR; - } - - DH_free(dh); - } -#else - { - EVP_PKEY *dh; - - /* - * PEM_read_bio_DHparams() and SSL_CTX_set_tmp_dh() - * are deprecated in OpenSSL 3.0 - */ - - dh = PEM_read_bio_Parameters(bio, NULL); - if (dh == NULL) { - ngx_ssl_error(NGX_LOG_EMERG, ssl->log, 0, - "PEM_read_bio_Parameters(\"%s\") failed", file->data); - BIO_free(bio); - return NGX_ERROR; - } - - if (SSL_CTX_set0_tmp_dh_pkey(ssl->ctx, dh) != 1) { - ngx_ssl_error(NGX_LOG_EMERG, ssl->log, 0, - "SSL_CTX_set0_tmp_dh_pkey(\"%s\") failed", file->data); -#if (OPENSSL_VERSION_NUMBER >= 0x30000010L) - EVP_PKEY_free(dh); -#endif - BIO_free(bio); - return NGX_ERROR; - } - } -#endif - - BIO_free(bio); - -#endif - - return NGX_OK; -} - - -ngx_int_t -ngx_ssl_ech_files(ngx_conf_t *cf, ngx_ssl_t *ssl, ngx_array_t *filenames) -{ -#ifdef SSL_OP_ECH_GREASE - int numkeys; - BIO *in; - ngx_int_t rc; - ngx_str_t *filename; - ngx_uint_t i; - OSSL_ECHSTORE *es; - - if (filenames == NULL) { - return NGX_OK; - } - - es = OSSL_ECHSTORE_new(NULL, NULL); - if (es == NULL) { - ngx_ssl_error(NGX_LOG_EMERG, ssl->log, 0, "OSSL_ECHSTORE_new() failed"); - return NGX_ERROR; - } - - rc = NGX_ERROR; - filename = filenames->elts; - - for (i = 0; i < filenames->nelts; i++) { - - if (ngx_conf_full_name(cf->cycle, &filename[i], 1) != NGX_OK) { - goto cleanup; - } - - in = BIO_new_file((char *) filename[i].data, "r"); - if (in == NULL) { - ngx_ssl_error(NGX_LOG_EMERG, ssl->log, 0, - "BIO_new_file(\"%s\") failed", filename[i].data); - goto cleanup; - } - - /* - * We only set the ECHConfigList from the first file read to use - * in ECH retry-configs. - * - * That allows many sensible key rotation schemes so that the - * values sent in ECH retry-configs are smaller and current. - * For example, if the first file name has the current ECH - * private key, and a second one has the previously used key - * that some clients may still use due to DNS caching. - */ - - if (OSSL_ECHSTORE_read_pem(es, in, i ? OSSL_ECH_NO_RETRY - : OSSL_ECH_FOR_RETRY) - != 1) - { - ngx_ssl_error(NGX_LOG_EMERG, ssl->log, 0, - "OSSL_ECHSTORE_read_pem(%s) failed", - filename[i].data); - BIO_free(in); - goto cleanup; - } - - BIO_free(in); - } - - /* - * load the ECH store after checking there's at least one ECH - * private key in there (the PEM file spec allows zero or one - * private key per file) - */ - - if (OSSL_ECHSTORE_num_keys(es, &numkeys) != 1) { - ngx_ssl_error(NGX_LOG_EMERG, ssl->log, 0, - "OSSL_ECHSTORE_num_keys(%s) failed"); - goto cleanup; - } - - if (numkeys > 0 && SSL_CTX_set1_echstore(ssl->ctx, es) != 1) { - ngx_ssl_error(NGX_LOG_EMERG, ssl->log, 0, - "SSL_CTX_set1_echstore() failed"); - goto cleanup; - } - - rc = NGX_OK; - -cleanup: - - OSSL_ECHSTORE_free(es); - return rc; - -#else - if (filenames != NULL) { - ngx_log_error(NGX_LOG_WARN, ssl->log, 0, - "\"ssl_ech_file\" is not supported on this platform, " - "ignored"); - } - - return NGX_OK; -#endif -} - - -ngx_int_t -ngx_ssl_ecdh_curve(ngx_conf_t *cf, ngx_ssl_t *ssl, ngx_str_t *name) -{ -#ifndef OPENSSL_NO_ECDH - - /* - * Elliptic-Curve Diffie-Hellman parameters are either "named curves" - * from RFC 4492 section 5.1.1, or explicitly described curves over - * binary fields. OpenSSL only supports the "named curves", which provide - * maximum interoperability. - */ - -#if (defined SSL_CTX_set1_curves_list || defined SSL_CTRL_SET_CURVES_LIST) - - /* - * OpenSSL 1.0.2+ allows configuring a curve list instead of a single - * curve previously supported. By default an internal list is used, - * with prime256v1 being preferred by server in OpenSSL 1.0.2b+ - * and X25519 in OpenSSL 1.1.0+. - * - * By default a curve preferred by the client will be used for - * key exchange. The SSL_OP_CIPHER_SERVER_PREFERENCE option can - * be used to prefer server curves instead, similar to what it - * does for ciphers. - */ - - SSL_CTX_set_options(ssl->ctx, SSL_OP_SINGLE_ECDH_USE); - -#ifdef SSL_CTRL_SET_ECDH_AUTO - /* not needed in OpenSSL 1.1.0+ */ - (void) SSL_CTX_set_ecdh_auto(ssl->ctx, 1); -#endif - - if (ngx_strcmp(name->data, "auto") == 0) { - return NGX_OK; - } - - if (SSL_CTX_set1_curves_list(ssl->ctx, (char *) name->data) == 0) { - ngx_ssl_error(NGX_LOG_EMERG, ssl->log, 0, - "SSL_CTX_set1_curves_list(\"%s\") failed", name->data); - return NGX_ERROR; - } - -#else - - int nid; - char *curve; - EC_KEY *ecdh; - - if (ngx_strcmp(name->data, "auto") == 0) { - curve = "prime256v1"; - - } else { - curve = (char *) name->data; - } - - nid = OBJ_sn2nid(curve); - if (nid == 0) { - ngx_ssl_error(NGX_LOG_EMERG, ssl->log, 0, - "OBJ_sn2nid(\"%s\") failed: unknown curve", curve); - return NGX_ERROR; - } - - ecdh = EC_KEY_new_by_curve_name(nid); - if (ecdh == NULL) { - ngx_ssl_error(NGX_LOG_EMERG, ssl->log, 0, - "EC_KEY_new_by_curve_name(\"%s\") failed", curve); - return NGX_ERROR; - } - - SSL_CTX_set_options(ssl->ctx, SSL_OP_SINGLE_ECDH_USE); - - SSL_CTX_set_tmp_ecdh(ssl->ctx, ecdh); - - EC_KEY_free(ecdh); -#endif -#endif - - return NGX_OK; -} - - -ngx_int_t -ngx_ssl_early_data(ngx_conf_t *cf, ngx_ssl_t *ssl, ngx_uint_t enable) -{ - if (!enable) { - return NGX_OK; - } - -#ifdef SSL_ERROR_EARLY_DATA_REJECTED - - /* BoringSSL */ - - SSL_CTX_set_early_data_enabled(ssl->ctx, 1); - -#elif defined SSL_READ_EARLY_DATA_SUCCESS - - /* OpenSSL */ - - SSL_CTX_set_max_early_data(ssl->ctx, NGX_SSL_BUFSIZE); - -#else - ngx_log_error(NGX_LOG_WARN, ssl->log, 0, - "\"ssl_early_data\" is not supported on this platform, " - "ignored"); -#endif - - return NGX_OK; -} - - -ngx_int_t -ngx_ssl_conf_commands(ngx_conf_t *cf, ngx_ssl_t *ssl, ngx_array_t *commands) -{ - if (commands == NULL) { - return NGX_OK; - } - -#ifdef SSL_CONF_FLAG_FILE - { - int type; - u_char *key, *value; - ngx_uint_t i; - ngx_keyval_t *cmd; - SSL_CONF_CTX *cctx; - - cctx = SSL_CONF_CTX_new(); - if (cctx == NULL) { - ngx_ssl_error(NGX_LOG_EMERG, ssl->log, 0, - "SSL_CONF_CTX_new() failed"); - return NGX_ERROR; - } - - SSL_CONF_CTX_set_flags(cctx, SSL_CONF_FLAG_FILE); - SSL_CONF_CTX_set_flags(cctx, SSL_CONF_FLAG_SERVER); - SSL_CONF_CTX_set_flags(cctx, SSL_CONF_FLAG_CLIENT); - SSL_CONF_CTX_set_flags(cctx, SSL_CONF_FLAG_CERTIFICATE); - SSL_CONF_CTX_set_flags(cctx, SSL_CONF_FLAG_SHOW_ERRORS); - - SSL_CONF_CTX_set_ssl_ctx(cctx, ssl->ctx); - - cmd = commands->elts; - for (i = 0; i < commands->nelts; i++) { - - key = cmd[i].key.data; - type = SSL_CONF_cmd_value_type(cctx, (char *) key); - - if (type == SSL_CONF_TYPE_FILE || type == SSL_CONF_TYPE_DIR) { - if (ngx_conf_full_name(cf->cycle, &cmd[i].value, 1) != NGX_OK) { - SSL_CONF_CTX_free(cctx); - return NGX_ERROR; - } - } - - value = cmd[i].value.data; - - if (SSL_CONF_cmd(cctx, (char *) key, (char *) value) <= 0) { - ngx_ssl_error(NGX_LOG_EMERG, ssl->log, 0, - "SSL_CONF_cmd(\"%s\", \"%s\") failed", key, value); - SSL_CONF_CTX_free(cctx); - return NGX_ERROR; - } - } - - if (SSL_CONF_CTX_finish(cctx) != 1) { - ngx_ssl_error(NGX_LOG_EMERG, ssl->log, 0, - "SSL_CONF_finish() failed"); - SSL_CONF_CTX_free(cctx); - return NGX_ERROR; - } - - SSL_CONF_CTX_free(cctx); - - return NGX_OK; - } -#else - ngx_log_error(NGX_LOG_EMERG, ssl->log, 0, - "SSL_CONF_cmd() is not available on this platform"); - return NGX_ERROR; -#endif -} - - -ngx_int_t -ngx_ssl_client_session_cache(ngx_conf_t *cf, ngx_ssl_t *ssl, ngx_uint_t enable) -{ - if (!enable) { - return NGX_OK; - } - - SSL_CTX_set_session_cache_mode(ssl->ctx, - SSL_SESS_CACHE_CLIENT - |SSL_SESS_CACHE_NO_INTERNAL); - - SSL_CTX_sess_set_new_cb(ssl->ctx, ngx_ssl_new_client_session); - - return NGX_OK; -} - - -static int -ngx_ssl_new_client_session(ngx_ssl_conn_t *ssl_conn, ngx_ssl_session_t *sess) -{ - ngx_connection_t *c; - - c = ngx_ssl_get_connection(ssl_conn); - - if (c->ssl->save_session) { - c->ssl->session = sess; - - c->ssl->save_session(c); - - c->ssl->session = NULL; - } - - return 0; -} - - -ngx_int_t -ngx_ssl_set_client_hello_callback(ngx_ssl_t *ssl, ngx_ssl_client_hello_arg *cb) -{ -#ifdef SSL_CLIENT_HELLO_SUCCESS - - SSL_CTX_set_client_hello_cb(ssl->ctx, ngx_ssl_client_hello_callback, NULL); - - if (SSL_CTX_set_ex_data(ssl->ctx, ngx_ssl_client_hello_arg_index, cb) == 0) - { - ngx_ssl_error(NGX_LOG_EMERG, ssl->log, 0, - "SSL_CTX_set_ex_data() failed"); - return NGX_ERROR; - } - -#elif defined OPENSSL_IS_BORINGSSL - - SSL_CTX_set_select_certificate_cb(ssl->ctx, ngx_ssl_select_certificate); - - if (SSL_CTX_set_ex_data(ssl->ctx, ngx_ssl_client_hello_arg_index, cb) == 0) - { - ngx_ssl_error(NGX_LOG_EMERG, ssl->log, 0, - "SSL_CTX_set_ex_data() failed"); - return NGX_ERROR; - } - -#endif - - return NGX_OK; -} - - -#ifdef SSL_CLIENT_HELLO_SUCCESS - -int -ngx_ssl_client_hello_callback(ngx_ssl_conn_t *ssl_conn, int *ad, void *arg) -{ - u_char *p; - size_t len; - ngx_int_t rc; - ngx_str_t host; - ngx_connection_t *c; - ngx_ssl_client_hello_arg *cb; - - c = ngx_ssl_get_connection(ssl_conn); - cb = SSL_CTX_get_ex_data(c->ssl->session_ctx, - ngx_ssl_client_hello_arg_index); - - if (SSL_client_hello_get0_ext(ssl_conn, TLSEXT_TYPE_server_name, - (const unsigned char **) &p, &len) - == 0) - { - ngx_str_null(&host); - goto done; - } - - /* - * RFC 6066 mandates non-zero HostName length, we follow OpenSSL. - * No more than one ServerName is expected. - */ - - if (len < 5 - || (size_t) (p[0] << 8) + p[1] + 2 != len - || p[2] != TLSEXT_NAMETYPE_host_name - || (size_t) (p[3] << 8) + p[4] + 2 + 3 != len) - { - *ad = SSL_AD_DECODE_ERROR; - return SSL_CLIENT_HELLO_ERROR; - } - - len -= 5; - p += 5; - - if (len > TLSEXT_MAXLEN_host_name || ngx_strlchr(p, p + len, '\0')) { - *ad = SSL_AD_UNRECOGNIZED_NAME; - return SSL_CLIENT_HELLO_ERROR; - } - - host.len = len; - host.data = p; - -done: - - rc = cb->servername(ssl_conn, ad, &host); - - if (rc == SSL_TLSEXT_ERR_ALERT_FATAL) { - return SSL_CLIENT_HELLO_ERROR; - } - - return SSL_CLIENT_HELLO_SUCCESS; -} - -#elif defined OPENSSL_IS_BORINGSSL - -enum ssl_select_cert_result_t ngx_ssl_select_certificate( - const SSL_CLIENT_HELLO *client_hello) -{ - int ad; - ngx_int_t rc; - ngx_ssl_conn_t *ssl_conn; - ngx_connection_t *c; - ngx_ssl_client_hello_arg *cb; - - ssl_conn = client_hello->ssl; - c = ngx_ssl_get_connection(ssl_conn); - cb = SSL_CTX_get_ex_data(c->ssl->session_ctx, - ngx_ssl_client_hello_arg_index); - - /* - * BoringSSL sends a hardcoded "handshake_failure" alert on errors, - * we use it to map SSL_AD_INTERNAL_ERROR. To preserve other alert - * values, error handling is postponed to the servername callback. - */ - - rc = cb->servername(ssl_conn, &ad, NULL); - - if (rc == SSL_TLSEXT_ERR_ALERT_FATAL && ad == SSL_AD_INTERNAL_ERROR) { - return ssl_select_cert_error; - } - - return ssl_select_cert_success; -} - -#endif - - -ngx_int_t -ngx_ssl_create_connection(ngx_ssl_t *ssl, ngx_connection_t *c, ngx_uint_t flags) -{ - ngx_ssl_connection_t *sc; - - sc = ngx_pcalloc(c->pool, sizeof(ngx_ssl_connection_t)); - if (sc == NULL) { - return NGX_ERROR; - } - - sc->buffer = ((flags & NGX_SSL_BUFFER) != 0); - sc->buffer_size = ssl->buffer_size; - - sc->session_ctx = ssl->ctx; - -#ifdef SSL_READ_EARLY_DATA_SUCCESS - if (SSL_CTX_get_max_early_data(ssl->ctx)) { - sc->try_early_data = 1; - } -#endif - - sc->connection = SSL_new(ssl->ctx); - - if (sc->connection == NULL) { - ngx_ssl_error(NGX_LOG_ALERT, c->log, 0, "SSL_new() failed"); - return NGX_ERROR; - } - - if (SSL_set_fd(sc->connection, c->fd) == 0) { - ngx_ssl_error(NGX_LOG_ALERT, c->log, 0, "SSL_set_fd() failed"); - return NGX_ERROR; - } - - if (flags & NGX_SSL_CLIENT) { - SSL_set_connect_state(sc->connection); - - } else { - SSL_set_accept_state(sc->connection); - -#ifdef SSL_OP_NO_RENEGOTIATION - SSL_set_options(sc->connection, SSL_OP_NO_RENEGOTIATION); -#endif - } - - if (SSL_set_ex_data(sc->connection, ngx_ssl_connection_index, c) == 0) { - ngx_ssl_error(NGX_LOG_ALERT, c->log, 0, "SSL_set_ex_data() failed"); - return NGX_ERROR; - } - - c->ssl = sc; - - return NGX_OK; -} - - -ngx_ssl_session_t * -ngx_ssl_get_session(ngx_connection_t *c) -{ -#ifdef TLS1_3_VERSION - if (c->ssl->session) { - SSL_SESSION_up_ref(c->ssl->session); - return c->ssl->session; - } -#endif - - return SSL_get1_session(c->ssl->connection); -} - - -ngx_ssl_session_t * -ngx_ssl_get0_session(ngx_connection_t *c) -{ - if (c->ssl->session) { - return c->ssl->session; - } - - return SSL_get0_session(c->ssl->connection); -} - - -ngx_int_t -ngx_ssl_set_session(ngx_connection_t *c, ngx_ssl_session_t *session) -{ - if (session) { - if (SSL_set_session(c->ssl->connection, session) == 0) { - ngx_ssl_error(NGX_LOG_ALERT, c->log, 0, "SSL_set_session() failed"); - return NGX_ERROR; - } - } - - return NGX_OK; -} - - -ngx_int_t -ngx_ssl_handshake(ngx_connection_t *c) -{ - int n, sslerr; - ngx_err_t err; - ngx_int_t rc; - -#ifdef SSL_READ_EARLY_DATA_SUCCESS - if (c->ssl->try_early_data) { - return ngx_ssl_try_early_data(c); - } -#endif - - if (c->ssl->in_ocsp) { - return ngx_ssl_ocsp_validate(c); - } - - ngx_ssl_clear_error(c->log); - - n = SSL_do_handshake(c->ssl->connection); - - ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, "SSL_do_handshake: %d", n); - - if (n == 1) { - - if (ngx_handle_read_event(c->read, 0) != NGX_OK) { - return NGX_ERROR; - } - - if (ngx_handle_write_event(c->write, 0) != NGX_OK) { - return NGX_ERROR; - } - -#if (NGX_DEBUG) - ngx_ssl_handshake_log(c); -#endif - - c->recv = ngx_ssl_recv; - c->send = ngx_ssl_write; - c->recv_chain = ngx_ssl_recv_chain; - c->send_chain = ngx_ssl_send_chain; - - c->read->ready = 1; - c->write->ready = 1; - -#if (!defined SSL_OP_NO_RENEGOTIATION \ - && !defined SSL_OP_NO_CLIENT_RENEGOTIATION \ - && defined SSL3_FLAGS_NO_RENEGOTIATE_CIPHERS \ - && OPENSSL_VERSION_NUMBER < 0x10100000L) - - /* initial handshake done, disable renegotiation (CVE-2009-3555) */ - if (c->ssl->connection->s3 && SSL_is_server(c->ssl->connection)) { - c->ssl->connection->s3->flags |= SSL3_FLAGS_NO_RENEGOTIATE_CIPHERS; - } - -#endif - -#if (defined BIO_get_ktls_send && !NGX_WIN32) - - if (BIO_get_ktls_send(SSL_get_wbio(c->ssl->connection)) == 1) { - ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0, - "BIO_get_ktls_send(): 1"); - c->ssl->sendfile = 1; - } - -#endif - - rc = ngx_ssl_ocsp_validate(c); - - if (rc == NGX_ERROR) { - return NGX_ERROR; - } - - if (rc == NGX_AGAIN) { - c->read->handler = ngx_ssl_handshake_handler; - c->write->handler = ngx_ssl_handshake_handler; - return NGX_AGAIN; - } - - c->ssl->handshaked = 1; - - return NGX_OK; - } - - sslerr = SSL_get_error(c->ssl->connection, n); - - ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, "SSL_get_error: %d", sslerr); - - if (sslerr == SSL_ERROR_WANT_READ) { - c->read->ready = 0; - c->read->handler = ngx_ssl_handshake_handler; - c->write->handler = ngx_ssl_handshake_handler; - - if (ngx_handle_read_event(c->read, 0) != NGX_OK) { - return NGX_ERROR; - } - - if (ngx_handle_write_event(c->write, 0) != NGX_OK) { - return NGX_ERROR; - } - - return NGX_AGAIN; - } - - if (sslerr == SSL_ERROR_WANT_WRITE) { - c->write->ready = 0; - c->read->handler = ngx_ssl_handshake_handler; - c->write->handler = ngx_ssl_handshake_handler; - - if (ngx_handle_read_event(c->read, 0) != NGX_OK) { - return NGX_ERROR; - } - - if (ngx_handle_write_event(c->write, 0) != NGX_OK) { - return NGX_ERROR; - } - - return NGX_AGAIN; - } - - err = (sslerr == SSL_ERROR_SYSCALL) ? ngx_errno : 0; - - c->ssl->no_wait_shutdown = 1; - c->ssl->no_send_shutdown = 1; - c->read->eof = 1; - - if (sslerr == SSL_ERROR_ZERO_RETURN || ERR_peek_error() == 0) { - ngx_connection_error(c, err, - "peer closed connection in SSL handshake"); - - return NGX_ERROR; - } - - if (c->ssl->handshake_rejected) { - ngx_connection_error(c, err, "handshake rejected"); - ERR_clear_error(); - - return NGX_ERROR; - } - - c->read->error = 1; - - ngx_ssl_connection_error(c, sslerr, err, "SSL_do_handshake() failed"); - - return NGX_ERROR; -} - - -#ifdef SSL_READ_EARLY_DATA_SUCCESS - -static ngx_int_t -ngx_ssl_try_early_data(ngx_connection_t *c) -{ - int n, sslerr; - u_char buf; - size_t readbytes; - ngx_err_t err; - ngx_int_t rc; - - ngx_ssl_clear_error(c->log); - - readbytes = 0; - - n = SSL_read_early_data(c->ssl->connection, &buf, 1, &readbytes); - - ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0, - "SSL_read_early_data: %d, %uz", n, readbytes); - - if (n == SSL_READ_EARLY_DATA_FINISH) { - c->ssl->try_early_data = 0; - return ngx_ssl_handshake(c); - } - - if (n == SSL_READ_EARLY_DATA_SUCCESS) { - - if (ngx_handle_read_event(c->read, 0) != NGX_OK) { - return NGX_ERROR; - } - - if (ngx_handle_write_event(c->write, 0) != NGX_OK) { - return NGX_ERROR; - } - -#if (NGX_DEBUG) - ngx_ssl_handshake_log(c); -#endif - - c->ssl->try_early_data = 0; - - c->ssl->early_buf = buf; - c->ssl->early_preread = 1; - - c->ssl->in_early = 1; - - c->recv = ngx_ssl_recv; - c->send = ngx_ssl_write; - c->recv_chain = ngx_ssl_recv_chain; - c->send_chain = ngx_ssl_send_chain; - - c->read->ready = 1; - c->write->ready = 1; - -#if (defined BIO_get_ktls_send && !NGX_WIN32) - - if (BIO_get_ktls_send(SSL_get_wbio(c->ssl->connection)) == 1) { - ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0, - "BIO_get_ktls_send(): 1"); - c->ssl->sendfile = 1; - } - -#endif - - rc = ngx_ssl_ocsp_validate(c); - - if (rc == NGX_ERROR) { - return NGX_ERROR; - } - - if (rc == NGX_AGAIN) { - c->read->handler = ngx_ssl_handshake_handler; - c->write->handler = ngx_ssl_handshake_handler; - return NGX_AGAIN; - } - - c->ssl->handshaked = 1; - - return NGX_OK; - } - - /* SSL_READ_EARLY_DATA_ERROR */ - - sslerr = SSL_get_error(c->ssl->connection, n); - - ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, "SSL_get_error: %d", sslerr); - - if (sslerr == SSL_ERROR_WANT_READ) { - c->read->ready = 0; - c->read->handler = ngx_ssl_handshake_handler; - c->write->handler = ngx_ssl_handshake_handler; - - if (ngx_handle_read_event(c->read, 0) != NGX_OK) { - return NGX_ERROR; - } - - if (ngx_handle_write_event(c->write, 0) != NGX_OK) { - return NGX_ERROR; - } - - return NGX_AGAIN; - } - - if (sslerr == SSL_ERROR_WANT_WRITE) { - c->write->ready = 0; - c->read->handler = ngx_ssl_handshake_handler; - c->write->handler = ngx_ssl_handshake_handler; - - if (ngx_handle_read_event(c->read, 0) != NGX_OK) { - return NGX_ERROR; - } - - if (ngx_handle_write_event(c->write, 0) != NGX_OK) { - return NGX_ERROR; - } - - return NGX_AGAIN; - } - - err = (sslerr == SSL_ERROR_SYSCALL) ? ngx_errno : 0; - - c->ssl->no_wait_shutdown = 1; - c->ssl->no_send_shutdown = 1; - c->read->eof = 1; - - if (sslerr == SSL_ERROR_ZERO_RETURN || ERR_peek_error() == 0) { - ngx_connection_error(c, err, - "peer closed connection in SSL handshake"); - - return NGX_ERROR; - } - - c->read->error = 1; - - ngx_ssl_connection_error(c, sslerr, err, "SSL_read_early_data() failed"); - - return NGX_ERROR; -} - -#endif - - -#if (NGX_DEBUG) - -void -ngx_ssl_handshake_log(ngx_connection_t *c) -{ - char buf[129], *s, *d; -#if OPENSSL_VERSION_NUMBER >= 0x10000000L - const -#endif - SSL_CIPHER *cipher; - - if (!(c->log->log_level & NGX_LOG_DEBUG_EVENT)) { - return; - } - - cipher = SSL_get_current_cipher(c->ssl->connection); - - if (cipher) { - SSL_CIPHER_description(cipher, &buf[1], 128); - - for (s = &buf[1], d = buf; *s; s++) { - if (*s == ' ' && *d == ' ') { - continue; - } - - if (*s == LF || *s == CR) { - continue; - } - - *++d = *s; - } - - if (*d != ' ') { - d++; - } - - *d = '\0'; - - ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0, - "SSL: %s, cipher: \"%s\"", - SSL_get_version(c->ssl->connection), &buf[1]); - - if (SSL_session_reused(c->ssl->connection)) { - ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0, - "SSL reused session"); - } - - } else { - ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0, - "SSL no shared ciphers"); - } -} - -#endif - - -static void -ngx_ssl_handshake_handler(ngx_event_t *ev) -{ - ngx_connection_t *c; - - c = ev->data; - - ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, - "SSL handshake handler: %d", ev->write); - - if (ev->timedout) { - c->ssl->handler(c); - return; - } - - if (ngx_ssl_handshake(c) == NGX_AGAIN) { - return; - } - - c->ssl->handler(c); -} - - -ssize_t -ngx_ssl_recv_chain(ngx_connection_t *c, ngx_chain_t *cl, off_t limit) -{ - u_char *last; - ssize_t n, bytes, size; - ngx_buf_t *b; - - bytes = 0; - - b = cl->buf; - last = b->last; - - for ( ;; ) { - size = b->end - last; - - if (limit) { - if (bytes >= limit) { - return bytes; - } - - if (bytes + size > limit) { - size = (ssize_t) (limit - bytes); - } - } - - n = ngx_ssl_recv(c, last, size); - - if (n > 0) { - last += n; - bytes += n; - - if (!c->read->ready) { - return bytes; - } - - if (last == b->end) { - cl = cl->next; - - if (cl == NULL) { - return bytes; - } - - b = cl->buf; - last = b->last; - } - - continue; - } - - if (bytes) { - - if (n == 0 || n == NGX_ERROR) { - c->read->ready = 1; - } - - return bytes; - } - - return n; - } -} - - -ssize_t -ngx_ssl_recv(ngx_connection_t *c, u_char *buf, size_t size) -{ - int n, bytes; - -#ifdef SSL_READ_EARLY_DATA_SUCCESS - if (c->ssl->in_early) { - return ngx_ssl_recv_early(c, buf, size); - } -#endif - - if (c->ssl->last == NGX_ERROR) { - c->read->ready = 0; - c->read->error = 1; - return NGX_ERROR; - } - - if (c->ssl->last == NGX_DONE) { - c->read->ready = 0; - c->read->eof = 1; - return 0; - } - - bytes = 0; - - ngx_ssl_clear_error(c->log); - - /* - * SSL_read() may return data in parts, so try to read - * until SSL_read() would return no data - */ - - for ( ;; ) { - - n = SSL_read(c->ssl->connection, buf, size); - - ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, "SSL_read: %d", n); - - if (n > 0) { - bytes += n; - } - - c->ssl->last = ngx_ssl_handle_recv(c, n); - - if (c->ssl->last == NGX_OK) { - - size -= n; - - if (size == 0) { - c->read->ready = 1; - - if (c->read->available >= 0) { - c->read->available -= bytes; - - /* - * there can be data buffered at SSL layer, - * so we post an event to continue reading on the next - * iteration of the event loop - */ - - if (c->read->available < 0) { - c->read->available = 0; - c->read->ready = 0; - - if (c->read->posted) { - ngx_delete_posted_event(c->read); - } - - ngx_post_event(c->read, &ngx_posted_next_events); - } - - ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, - "SSL_read: avail:%d", c->read->available); - - } else { - -#if (NGX_HAVE_FIONREAD) - - if (ngx_socket_nread(c->fd, &c->read->available) == -1) { - c->read->ready = 0; - c->read->error = 1; - ngx_connection_error(c, ngx_socket_errno, - ngx_socket_nread_n " failed"); - return NGX_ERROR; - } - - ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, - "SSL_read: avail:%d", c->read->available); - -#endif - } - - return bytes; - } - - buf += n; - - continue; - } - - if (bytes) { - if (c->ssl->last != NGX_AGAIN) { - c->read->ready = 1; - } - - return bytes; - } - - switch (c->ssl->last) { - - case NGX_DONE: - c->read->ready = 0; - c->read->eof = 1; - return 0; - - case NGX_ERROR: - c->read->ready = 0; - c->read->error = 1; - - /* fall through */ - - case NGX_AGAIN: - return c->ssl->last; - } - } -} - - -#ifdef SSL_READ_EARLY_DATA_SUCCESS - -static ssize_t -ngx_ssl_recv_early(ngx_connection_t *c, u_char *buf, size_t size) -{ - int n, bytes; - size_t readbytes; - - if (c->ssl->last == NGX_ERROR) { - c->read->ready = 0; - c->read->error = 1; - return NGX_ERROR; - } - - if (c->ssl->last == NGX_DONE) { - c->read->ready = 0; - c->read->eof = 1; - return 0; - } - - bytes = 0; - - ngx_ssl_clear_error(c->log); - - if (c->ssl->early_preread) { - - if (size == 0) { - c->read->ready = 0; - c->read->eof = 1; - return 0; - } - - *buf = c->ssl->early_buf; - - c->ssl->early_preread = 0; - - bytes = 1; - size -= 1; - buf += 1; - } - - if (c->ssl->write_blocked) { - return NGX_AGAIN; - } - - /* - * SSL_read_early_data() may return data in parts, so try to read - * until SSL_read_early_data() would return no data - */ - - for ( ;; ) { - - readbytes = 0; - - n = SSL_read_early_data(c->ssl->connection, buf, size, &readbytes); - - ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0, - "SSL_read_early_data: %d, %uz", n, readbytes); - - if (n == SSL_READ_EARLY_DATA_SUCCESS) { - - c->ssl->last = ngx_ssl_handle_recv(c, 1); - - bytes += readbytes; - size -= readbytes; - - if (size == 0) { - c->read->ready = 1; - return bytes; - } - - buf += readbytes; - - continue; - } - - if (n == SSL_READ_EARLY_DATA_FINISH) { - - c->ssl->last = ngx_ssl_handle_recv(c, 1); - c->ssl->in_early = 0; - - if (bytes) { - c->read->ready = 1; - return bytes; - } - - return ngx_ssl_recv(c, buf, size); - } - - /* SSL_READ_EARLY_DATA_ERROR */ - - c->ssl->last = ngx_ssl_handle_recv(c, 0); - - if (bytes) { - if (c->ssl->last != NGX_AGAIN) { - c->read->ready = 1; - } - - return bytes; - } - - switch (c->ssl->last) { - - case NGX_DONE: - c->read->ready = 0; - c->read->eof = 1; - return 0; - - case NGX_ERROR: - c->read->ready = 0; - c->read->error = 1; - - /* fall through */ - - case NGX_AGAIN: - return c->ssl->last; - } - } -} - -#endif - - -static ngx_int_t -ngx_ssl_handle_recv(ngx_connection_t *c, int n) -{ - int sslerr; - ngx_err_t err; - -#if (!defined SSL_OP_NO_RENEGOTIATION \ - && !defined SSL_OP_NO_CLIENT_RENEGOTIATION) - - if (c->ssl->renegotiation) { - /* - * disable renegotiation (CVE-2009-3555): - * OpenSSL (at least up to 0.9.8l) does not handle disabled - * renegotiation gracefully, so drop connection here - */ - - ngx_log_error(NGX_LOG_NOTICE, c->log, 0, "SSL renegotiation disabled"); - - while (ERR_peek_error()) { - ngx_ssl_error(NGX_LOG_DEBUG, c->log, 0, - "ignoring stale global SSL error"); - } - - ERR_clear_error(); - - c->ssl->no_wait_shutdown = 1; - c->ssl->no_send_shutdown = 1; - - return NGX_ERROR; - } - -#endif - - if (n > 0) { - - if (c->ssl->saved_write_handler) { - - c->write->handler = c->ssl->saved_write_handler; - c->ssl->saved_write_handler = NULL; - c->write->ready = 1; - - if (ngx_handle_write_event(c->write, 0) != NGX_OK) { - return NGX_ERROR; - } - - ngx_post_event(c->write, &ngx_posted_events); - } - - return NGX_OK; - } - - sslerr = SSL_get_error(c->ssl->connection, n); - - err = (sslerr == SSL_ERROR_SYSCALL) ? ngx_errno : 0; - - ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, "SSL_get_error: %d", sslerr); - - if (sslerr == SSL_ERROR_WANT_READ) { - - if (c->ssl->saved_write_handler) { - - c->write->handler = c->ssl->saved_write_handler; - c->ssl->saved_write_handler = NULL; - c->write->ready = 1; - - if (ngx_handle_write_event(c->write, 0) != NGX_OK) { - return NGX_ERROR; - } - - ngx_post_event(c->write, &ngx_posted_events); - } - - c->read->ready = 0; - return NGX_AGAIN; - } - - if (sslerr == SSL_ERROR_WANT_WRITE) { - - ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0, - "SSL_read: want write"); - - c->write->ready = 0; - - if (ngx_handle_write_event(c->write, 0) != NGX_OK) { - return NGX_ERROR; - } - - /* - * we do not set the timer because there is already the read event timer - */ - - if (c->ssl->saved_write_handler == NULL) { - c->ssl->saved_write_handler = c->write->handler; - c->write->handler = ngx_ssl_write_handler; - } - - return NGX_AGAIN; - } - - c->ssl->no_wait_shutdown = 1; - c->ssl->no_send_shutdown = 1; - - if (sslerr == SSL_ERROR_ZERO_RETURN || ERR_peek_error() == 0) { - ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0, - "peer shutdown SSL cleanly"); - return NGX_DONE; - } - - ngx_ssl_connection_error(c, sslerr, err, "SSL_read() failed"); - - return NGX_ERROR; -} - - -static void -ngx_ssl_write_handler(ngx_event_t *wev) -{ - ngx_connection_t *c; - - c = wev->data; - - ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0, "SSL write handler"); - - c->read->handler(c->read); -} - - -/* - * OpenSSL has no SSL_writev() so we copy several bufs into our 16K buffer - * before the SSL_write() call to decrease a SSL overhead. - * - * Besides for protocols such as HTTP it is possible to always buffer - * the output to decrease a SSL overhead some more. - */ - -ngx_chain_t * -ngx_ssl_send_chain(ngx_connection_t *c, ngx_chain_t *in, off_t limit) -{ - int n; - ngx_uint_t flush; - ssize_t send, size, file_size; - ngx_buf_t *buf; - ngx_chain_t *cl; - - if (!c->ssl->buffer) { - - while (in) { - if (ngx_buf_special(in->buf)) { - in = in->next; - continue; - } - - n = ngx_ssl_write(c, in->buf->pos, in->buf->last - in->buf->pos); - - if (n == NGX_ERROR) { - return NGX_CHAIN_ERROR; - } - - if (n == NGX_AGAIN) { - return in; - } - - in->buf->pos += n; - - if (in->buf->pos == in->buf->last) { - in = in->next; - } - } - - return in; - } - - - /* the maximum limit size is the maximum int32_t value - the page size */ - - if (limit == 0 || limit > (off_t) (NGX_MAX_INT32_VALUE - ngx_pagesize)) { - limit = NGX_MAX_INT32_VALUE - ngx_pagesize; - } - - buf = c->ssl->buf; - - if (buf == NULL) { - buf = ngx_create_temp_buf(c->pool, c->ssl->buffer_size); - if (buf == NULL) { - return NGX_CHAIN_ERROR; - } - - c->ssl->buf = buf; - } - - if (buf->start == NULL) { - buf->start = ngx_palloc(c->pool, c->ssl->buffer_size); - if (buf->start == NULL) { - return NGX_CHAIN_ERROR; - } - - buf->pos = buf->start; - buf->last = buf->start; - buf->end = buf->start + c->ssl->buffer_size; - } - - send = buf->last - buf->pos; - flush = (in == NULL) ? 1 : buf->flush; - - for ( ;; ) { - - while (in && buf->last < buf->end && send < limit) { - if (in->buf->last_buf || in->buf->flush) { - flush = 1; - } - - if (ngx_buf_special(in->buf)) { - in = in->next; - continue; - } - - if (in->buf->in_file && c->ssl->sendfile) { - flush = 1; - break; - } - - size = in->buf->last - in->buf->pos; - - if (size > buf->end - buf->last) { - size = buf->end - buf->last; - } - - if (send + size > limit) { - size = (ssize_t) (limit - send); - } - - ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, - "SSL buf copy: %z", size); - - ngx_memcpy(buf->last, in->buf->pos, size); - - buf->last += size; - in->buf->pos += size; - send += size; - - if (in->buf->pos == in->buf->last) { - in = in->next; - } - } - - if (!flush && send < limit && buf->last < buf->end) { - break; - } - - size = buf->last - buf->pos; - - if (size == 0) { - - if (in && in->buf->in_file && send < limit) { - - /* coalesce the neighbouring file bufs */ - - cl = in; - file_size = (size_t) ngx_chain_coalesce_file(&cl, limit - send); - - n = ngx_ssl_sendfile(c, in->buf, file_size); - - if (n == NGX_ERROR) { - return NGX_CHAIN_ERROR; - } - - if (n == NGX_AGAIN) { - break; - } - - in = ngx_chain_update_sent(in, n); - - send += n; - flush = 0; - - continue; - } - - buf->flush = 0; - c->buffered &= ~NGX_SSL_BUFFERED; - - return in; - } - - n = ngx_ssl_write(c, buf->pos, size); - - if (n == NGX_ERROR) { - return NGX_CHAIN_ERROR; - } - - if (n == NGX_AGAIN) { - break; - } - - buf->pos += n; - - if (n < size) { - break; - } - - flush = 0; - - buf->pos = buf->start; - buf->last = buf->start; - - if (in == NULL || send >= limit) { - break; - } - } - - buf->flush = flush; - - if (buf->pos < buf->last) { - c->buffered |= NGX_SSL_BUFFERED; - - } else { - c->buffered &= ~NGX_SSL_BUFFERED; - } - - return in; -} - - -ssize_t -ngx_ssl_write(ngx_connection_t *c, u_char *data, size_t size) -{ - int n, sslerr; - ngx_err_t err; - -#ifdef SSL_READ_EARLY_DATA_SUCCESS - if (c->ssl->in_early) { - return ngx_ssl_write_early(c, data, size); - } -#endif - - ngx_ssl_clear_error(c->log); - - ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, "SSL to write: %uz", size); - - n = SSL_write(c->ssl->connection, data, size); - - ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, "SSL_write: %d", n); - - if (n > 0) { - - if (c->ssl->saved_read_handler) { - - c->read->handler = c->ssl->saved_read_handler; - c->ssl->saved_read_handler = NULL; - c->read->ready = 1; - - if (ngx_handle_read_event(c->read, 0) != NGX_OK) { - return NGX_ERROR; - } - - ngx_post_event(c->read, &ngx_posted_events); - } - - c->sent += n; - - return n; - } - - sslerr = SSL_get_error(c->ssl->connection, n); - - if (sslerr == SSL_ERROR_ZERO_RETURN) { - - /* - * OpenSSL 1.1.1 fails to return SSL_ERROR_SYSCALL if an error - * happens during SSL_write() after close_notify alert from the - * peer, and returns SSL_ERROR_ZERO_RETURN instead, - * https://git.openssl.org/?p=openssl.git;a=commitdiff;h=8051ab2 - */ - - sslerr = SSL_ERROR_SYSCALL; - } - - err = (sslerr == SSL_ERROR_SYSCALL) ? ngx_errno : 0; - - ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, "SSL_get_error: %d", sslerr); - - if (sslerr == SSL_ERROR_WANT_WRITE) { - - if (c->ssl->saved_read_handler) { - - c->read->handler = c->ssl->saved_read_handler; - c->ssl->saved_read_handler = NULL; - c->read->ready = 1; - - if (ngx_handle_read_event(c->read, 0) != NGX_OK) { - return NGX_ERROR; - } - - ngx_post_event(c->read, &ngx_posted_events); - } - - c->write->ready = 0; - return NGX_AGAIN; - } - - if (sslerr == SSL_ERROR_WANT_READ) { - - ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0, - "SSL_write: want read"); - - c->read->ready = 0; - - if (ngx_handle_read_event(c->read, 0) != NGX_OK) { - return NGX_ERROR; - } - - /* - * we do not set the timer because there is already - * the write event timer - */ - - if (c->ssl->saved_read_handler == NULL) { - c->ssl->saved_read_handler = c->read->handler; - c->read->handler = ngx_ssl_read_handler; - } - - return NGX_AGAIN; - } - - c->ssl->no_wait_shutdown = 1; - c->ssl->no_send_shutdown = 1; - c->write->error = 1; - - ngx_ssl_connection_error(c, sslerr, err, "SSL_write() failed"); - - return NGX_ERROR; -} - - -#ifdef SSL_READ_EARLY_DATA_SUCCESS - -static ssize_t -ngx_ssl_write_early(ngx_connection_t *c, u_char *data, size_t size) -{ - int n, sslerr; - size_t written; - ngx_err_t err; - - ngx_ssl_clear_error(c->log); - - ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, "SSL to write: %uz", size); - - written = 0; - - n = SSL_write_early_data(c->ssl->connection, data, size, &written); - - ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0, - "SSL_write_early_data: %d, %uz", n, written); - - if (n > 0) { - - if (c->ssl->saved_read_handler) { - - c->read->handler = c->ssl->saved_read_handler; - c->ssl->saved_read_handler = NULL; - c->read->ready = 1; - - if (ngx_handle_read_event(c->read, 0) != NGX_OK) { - return NGX_ERROR; - } - - ngx_post_event(c->read, &ngx_posted_events); - } - - if (c->ssl->write_blocked) { - c->ssl->write_blocked = 0; - ngx_post_event(c->read, &ngx_posted_events); - } - - c->sent += written; - - return written; - } - - sslerr = SSL_get_error(c->ssl->connection, n); - - err = (sslerr == SSL_ERROR_SYSCALL) ? ngx_errno : 0; - - ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, "SSL_get_error: %d", sslerr); - - if (sslerr == SSL_ERROR_WANT_WRITE) { - - ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0, - "SSL_write_early_data: want write"); - - if (c->ssl->saved_read_handler) { - - c->read->handler = c->ssl->saved_read_handler; - c->ssl->saved_read_handler = NULL; - c->read->ready = 1; - - if (ngx_handle_read_event(c->read, 0) != NGX_OK) { - return NGX_ERROR; - } - - ngx_post_event(c->read, &ngx_posted_events); - } - - /* - * OpenSSL 1.1.1a fails to handle SSL_read_early_data() - * if an SSL_write_early_data() call blocked on writing, - * see https://github.com/openssl/openssl/issues/7757 - */ - - c->ssl->write_blocked = 1; - - c->write->ready = 0; - return NGX_AGAIN; - } - - if (sslerr == SSL_ERROR_WANT_READ) { - - ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0, - "SSL_write_early_data: want read"); - - c->read->ready = 0; - - if (ngx_handle_read_event(c->read, 0) != NGX_OK) { - return NGX_ERROR; - } - - /* - * we do not set the timer because there is already - * the write event timer - */ - - if (c->ssl->saved_read_handler == NULL) { - c->ssl->saved_read_handler = c->read->handler; - c->read->handler = ngx_ssl_read_handler; - } - - return NGX_AGAIN; - } - - c->ssl->no_wait_shutdown = 1; - c->ssl->no_send_shutdown = 1; - c->write->error = 1; - - ngx_ssl_connection_error(c, sslerr, err, "SSL_write_early_data() failed"); - - return NGX_ERROR; -} - -#endif - - -static ssize_t -ngx_ssl_sendfile(ngx_connection_t *c, ngx_buf_t *file, size_t size) -{ -#if (defined BIO_get_ktls_send && !NGX_WIN32) - - int sslerr, flags; - ssize_t n; - ngx_err_t err; - - ngx_ssl_clear_error(c->log); - - ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0, - "SSL to sendfile: @%O %uz", - file->file_pos, size); - - ngx_set_errno(0); - -#if (NGX_HAVE_SENDFILE_NODISKIO) - - flags = (c->busy_count <= 2) ? SF_NODISKIO : 0; - - if (file->file->directio) { - flags |= SF_NOCACHE; - } - -#else - flags = 0; -#endif - - n = SSL_sendfile(c->ssl->connection, file->file->fd, file->file_pos, - size, flags); - - ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, "SSL_sendfile: %z", n); - - if (n > 0) { - - if (c->ssl->saved_read_handler) { - - c->read->handler = c->ssl->saved_read_handler; - c->ssl->saved_read_handler = NULL; - c->read->ready = 1; - - if (ngx_handle_read_event(c->read, 0) != NGX_OK) { - return NGX_ERROR; - } - - ngx_post_event(c->read, &ngx_posted_events); - } - -#if (NGX_HAVE_SENDFILE_NODISKIO) - c->busy_count = 0; -#endif - - c->sent += n; - - return n; - } - - if (n == 0) { - - /* - * if sendfile returns zero, then someone has truncated the file, - * so the offset became beyond the end of the file - */ - - ngx_log_error(NGX_LOG_ALERT, c->log, 0, - "SSL_sendfile() reported that \"%s\" was truncated at %O", - file->file->name.data, file->file_pos); - - return NGX_ERROR; - } - - sslerr = SSL_get_error(c->ssl->connection, n); - - if (sslerr == SSL_ERROR_ZERO_RETURN) { - - /* - * OpenSSL fails to return SSL_ERROR_SYSCALL if an error - * happens during writing after close_notify alert from the - * peer, and returns SSL_ERROR_ZERO_RETURN instead - */ - - sslerr = SSL_ERROR_SYSCALL; - } - - if (sslerr == SSL_ERROR_SSL - && ERR_GET_REASON(ERR_peek_error()) == SSL_R_UNINITIALIZED - && ngx_errno != 0) - { - /* - * OpenSSL fails to return SSL_ERROR_SYSCALL if an error - * happens in sendfile(), and returns SSL_ERROR_SSL with - * SSL_R_UNINITIALIZED reason instead - */ - - sslerr = SSL_ERROR_SYSCALL; - } - - err = (sslerr == SSL_ERROR_SYSCALL) ? ngx_errno : 0; - - ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, "SSL_get_error: %d", sslerr); - - if (sslerr == SSL_ERROR_WANT_WRITE) { - - if (c->ssl->saved_read_handler) { - - c->read->handler = c->ssl->saved_read_handler; - c->ssl->saved_read_handler = NULL; - c->read->ready = 1; - - if (ngx_handle_read_event(c->read, 0) != NGX_OK) { - return NGX_ERROR; - } - - ngx_post_event(c->read, &ngx_posted_events); - } - -#if (NGX_HAVE_SENDFILE_NODISKIO) - - if (ngx_errno == EBUSY) { - c->busy_count++; - - ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, - "SSL_sendfile() busy, count:%d", c->busy_count); - - if (c->write->posted) { - ngx_delete_posted_event(c->write); - } - - ngx_post_event(c->write, &ngx_posted_next_events); - } - -#endif - - c->write->ready = 0; - return NGX_AGAIN; - } - - if (sslerr == SSL_ERROR_WANT_READ) { - - ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0, - "SSL_sendfile: want read"); - - c->read->ready = 0; - - if (ngx_handle_read_event(c->read, 0) != NGX_OK) { - return NGX_ERROR; - } - - /* - * we do not set the timer because there is already - * the write event timer - */ - - if (c->ssl->saved_read_handler == NULL) { - c->ssl->saved_read_handler = c->read->handler; - c->read->handler = ngx_ssl_read_handler; - } - - return NGX_AGAIN; - } - - c->ssl->no_wait_shutdown = 1; - c->ssl->no_send_shutdown = 1; - c->write->error = 1; - - ngx_ssl_connection_error(c, sslerr, err, "SSL_sendfile() failed"); - -#else - ngx_log_error(NGX_LOG_ALERT, c->log, 0, - "SSL_sendfile() not available"); -#endif - - return NGX_ERROR; -} - - -static void -ngx_ssl_read_handler(ngx_event_t *rev) -{ - ngx_connection_t *c; - - c = rev->data; - - ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0, "SSL read handler"); - - c->write->handler(c->write); -} - - -void -ngx_ssl_free_buffer(ngx_connection_t *c) -{ - if (c->ssl->buf && c->ssl->buf->start) { - if (ngx_pfree(c->pool, c->ssl->buf->start) == NGX_OK) { - c->ssl->buf->start = NULL; - } - } -} - - -ngx_int_t -ngx_ssl_shutdown(ngx_connection_t *c) -{ - int n, sslerr, mode; - ngx_int_t rc; - ngx_err_t err; - ngx_uint_t tries; - -#if (NGX_QUIC) - if (c->quic) { - /* QUIC streams inherit SSL object */ - return NGX_OK; - } -#endif - - rc = NGX_OK; - - ngx_ssl_ocsp_cleanup(c); - - if (SSL_in_init(c->ssl->connection)) { - /* - * OpenSSL 1.0.2f complains if SSL_shutdown() is called during - * an SSL handshake, while previous versions always return 0. - * Avoid calling SSL_shutdown() if handshake wasn't completed. - */ - - goto done; - } - - if (c->timedout || c->error || c->buffered) { - mode = SSL_RECEIVED_SHUTDOWN|SSL_SENT_SHUTDOWN; - SSL_set_quiet_shutdown(c->ssl->connection, 1); - - } else { - mode = SSL_get_shutdown(c->ssl->connection); - - if (c->ssl->no_wait_shutdown) { - mode |= SSL_RECEIVED_SHUTDOWN; - } - - if (c->ssl->no_send_shutdown) { - mode |= SSL_SENT_SHUTDOWN; - } - - if (c->ssl->no_wait_shutdown && c->ssl->no_send_shutdown) { - SSL_set_quiet_shutdown(c->ssl->connection, 1); - } - } - - SSL_set_shutdown(c->ssl->connection, mode); - - ngx_ssl_clear_error(c->log); - - tries = 2; - - for ( ;; ) { - - /* - * For bidirectional shutdown, SSL_shutdown() needs to be called - * twice: first call sends the "close notify" alert and returns 0, - * second call waits for the peer's "close notify" alert. - */ - - n = SSL_shutdown(c->ssl->connection); - - ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, "SSL_shutdown: %d", n); - - if (n == 1) { - goto done; - } - - if (n == 0 && tries-- > 1) { - continue; - } - - /* before 0.9.8m SSL_shutdown() returned 0 instead of -1 on errors */ - - sslerr = SSL_get_error(c->ssl->connection, n); - - ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, - "SSL_get_error: %d", sslerr); - - if (sslerr == SSL_ERROR_WANT_READ || sslerr == SSL_ERROR_WANT_WRITE) { - c->read->handler = ngx_ssl_shutdown_handler; - c->write->handler = ngx_ssl_shutdown_handler; - - if (sslerr == SSL_ERROR_WANT_READ) { - c->read->ready = 0; - - } else { - c->write->ready = 0; - } - - if (ngx_handle_read_event(c->read, 0) != NGX_OK) { - goto failed; - } - - if (ngx_handle_write_event(c->write, 0) != NGX_OK) { - goto failed; - } - - ngx_add_timer(c->read, 3000); - - return NGX_AGAIN; - } - - if (sslerr == SSL_ERROR_ZERO_RETURN || ERR_peek_error() == 0) { - goto done; - } - - err = (sslerr == SSL_ERROR_SYSCALL) ? ngx_errno : 0; - - ngx_ssl_connection_error(c, sslerr, err, "SSL_shutdown() failed"); - - break; - } - -failed: - - rc = NGX_ERROR; - -done: - - if (c->ssl->shutdown_without_free) { - c->ssl->shutdown_without_free = 0; - c->recv = ngx_recv; - return rc; - } - - SSL_free(c->ssl->connection); - c->ssl = NULL; - c->recv = ngx_recv; - - return rc; -} - - -static void -ngx_ssl_shutdown_handler(ngx_event_t *ev) -{ - ngx_connection_t *c; - ngx_connection_handler_pt handler; - - c = ev->data; - handler = c->ssl->handler; - - if (ev->timedout) { - c->timedout = 1; - } - - ngx_log_debug0(NGX_LOG_DEBUG_EVENT, ev->log, 0, "SSL shutdown handler"); - - if (ngx_ssl_shutdown(c) == NGX_AGAIN) { - return; - } - - handler(c); -} - - -void -ngx_ssl_connection_error(ngx_connection_t *c, int sslerr, ngx_err_t err, - char *text) -{ - int n; - ngx_uint_t level; - - level = NGX_LOG_CRIT; - - if (sslerr == SSL_ERROR_SYSCALL) { - - if (err == NGX_ECONNRESET -#if (NGX_WIN32) - || err == NGX_ECONNABORTED -#endif - || err == NGX_EPIPE - || err == NGX_ENOTCONN - || err == NGX_ETIMEDOUT - || err == NGX_ECONNREFUSED - || err == NGX_ENETDOWN - || err == NGX_ENETUNREACH - || err == NGX_EHOSTDOWN - || err == NGX_EHOSTUNREACH) - { - switch (c->log_error) { - - case NGX_ERROR_IGNORE_ECONNRESET: - case NGX_ERROR_INFO: - level = NGX_LOG_INFO; - break; - - case NGX_ERROR_ERR: - level = NGX_LOG_ERR; - break; - - default: - break; - } - } - - } else if (sslerr == SSL_ERROR_SSL) { - - n = ERR_GET_REASON(ERR_peek_last_error()); - - /* handshake failures */ - if (n == SSL_R_BAD_CHANGE_CIPHER_SPEC /* 103 */ -#ifdef SSL_R_NO_SUITABLE_KEY_SHARE - || n == SSL_R_NO_SUITABLE_KEY_SHARE /* 101 */ -#endif -#ifdef SSL_R_BAD_ALERT - || n == SSL_R_BAD_ALERT /* 102 */ -#endif -#ifdef SSL_R_BAD_KEY_SHARE - || n == SSL_R_BAD_KEY_SHARE /* 108 */ -#endif -#ifdef SSL_R_BAD_EXTENSION - || n == SSL_R_BAD_EXTENSION /* 110 */ -#endif - || n == SSL_R_BAD_DIGEST_LENGTH /* 111 */ -#ifdef SSL_R_MISSING_SIGALGS_EXTENSION - || n == SSL_R_MISSING_SIGALGS_EXTENSION /* 112 */ -#endif - || n == SSL_R_BAD_PACKET_LENGTH /* 115 */ -#ifdef SSL_R_NO_SUITABLE_SIGNATURE_ALGORITHM - || n == SSL_R_NO_SUITABLE_SIGNATURE_ALGORITHM /* 118 */ -#endif -#ifdef SSL_R_BAD_KEY_UPDATE - || n == SSL_R_BAD_KEY_UPDATE /* 122 */ -#endif - || n == SSL_R_BLOCK_CIPHER_PAD_IS_WRONG /* 129 */ - || n == SSL_R_CCS_RECEIVED_EARLY /* 133 */ -#ifdef SSL_R_DECODE_ERROR - || n == SSL_R_DECODE_ERROR /* 137 */ -#endif -#ifdef SSL_R_DATA_BETWEEN_CCS_AND_FINISHED - || n == SSL_R_DATA_BETWEEN_CCS_AND_FINISHED /* 145 */ -#endif - || n == SSL_R_DATA_LENGTH_TOO_LONG /* 146 */ - || n == SSL_R_DIGEST_CHECK_FAILED /* 149 */ - || n == SSL_R_ENCRYPTED_LENGTH_TOO_LONG /* 150 */ - || n == SSL_R_ERROR_IN_RECEIVED_CIPHER_LIST /* 151 */ - || n == SSL_R_EXCESSIVE_MESSAGE_SIZE /* 152 */ -#ifdef SSL_R_GOT_A_FIN_BEFORE_A_CCS - || n == SSL_R_GOT_A_FIN_BEFORE_A_CCS /* 154 */ -#endif - || n == SSL_R_HTTPS_PROXY_REQUEST /* 155 */ - || n == SSL_R_HTTP_REQUEST /* 156 */ - || n == SSL_R_LENGTH_MISMATCH /* 159 */ -#ifdef SSL_R_LENGTH_TOO_SHORT - || n == SSL_R_LENGTH_TOO_SHORT /* 160 */ -#endif -#ifdef SSL_R_NO_RENEGOTIATION - || n == SSL_R_NO_RENEGOTIATION /* 182 */ -#endif -#ifdef SSL_R_NO_CIPHERS_PASSED - || n == SSL_R_NO_CIPHERS_PASSED /* 182 */ -#endif - || n == SSL_R_NO_CIPHERS_SPECIFIED /* 183 */ -#ifdef SSL_R_BAD_CIPHER - || n == SSL_R_BAD_CIPHER /* 186 */ -#endif - || n == SSL_R_NO_COMPRESSION_SPECIFIED /* 187 */ - || n == SSL_R_NO_SHARED_CIPHER /* 193 */ -#ifdef SSL_R_PACKET_LENGTH_TOO_LONG - || n == SSL_R_PACKET_LENGTH_TOO_LONG /* 198 */ -#endif - || n == SSL_R_RECORD_LENGTH_MISMATCH /* 213 */ -#ifdef SSL_R_TOO_MANY_WARNING_ALERTS - || n == SSL_R_TOO_MANY_WARNING_ALERTS /* 220 */ -#endif -#ifdef SSL_R_CLIENTHELLO_TLSEXT - || n == SSL_R_CLIENTHELLO_TLSEXT /* 226 */ -#endif -#ifdef SSL_R_PARSE_TLSEXT - || n == SSL_R_PARSE_TLSEXT /* 227 */ -#endif -#ifdef SSL_R_CALLBACK_FAILED - || n == SSL_R_CALLBACK_FAILED /* 234 */ -#endif -#ifdef SSL_R_TLS_RSA_ENCRYPTED_VALUE_LENGTH_IS_WRONG - || n == SSL_R_TLS_RSA_ENCRYPTED_VALUE_LENGTH_IS_WRONG /* 234 */ -#endif -#ifdef SSL_R_NO_APPLICATION_PROTOCOL - || n == SSL_R_NO_APPLICATION_PROTOCOL /* 235 */ -#endif - || n == SSL_R_UNEXPECTED_MESSAGE /* 244 */ - || n == SSL_R_UNEXPECTED_RECORD /* 245 */ - || n == SSL_R_UNKNOWN_ALERT_TYPE /* 246 */ - || n == SSL_R_UNKNOWN_PROTOCOL /* 252 */ -#ifdef SSL_R_NO_COMMON_SIGNATURE_ALGORITHMS - || n == SSL_R_NO_COMMON_SIGNATURE_ALGORITHMS /* 253 */ -#endif -#ifdef SSL_R_INVALID_COMPRESSION_LIST - || n == SSL_R_INVALID_COMPRESSION_LIST /* 256 */ -#endif -#ifdef SSL_R_MISSING_KEY_SHARE - || n == SSL_R_MISSING_KEY_SHARE /* 258 */ -#endif - || n == SSL_R_UNSUPPORTED_PROTOCOL /* 258 */ -#ifdef SSL_R_NO_SHARED_GROUP - || n == SSL_R_NO_SHARED_GROUP /* 266 */ -#endif - || n == SSL_R_WRONG_VERSION_NUMBER /* 267 */ -#ifdef SSL_R_TOO_MUCH_SKIPPED_EARLY_DATA - || n == SSL_R_TOO_MUCH_SKIPPED_EARLY_DATA /* 270 */ -#endif - || n == SSL_R_BAD_LENGTH /* 271 */ - || n == SSL_R_DECRYPTION_FAILED_OR_BAD_RECORD_MAC /* 281 */ -#ifdef SSL_R_APPLICATION_DATA_AFTER_CLOSE_NOTIFY - || n == SSL_R_APPLICATION_DATA_AFTER_CLOSE_NOTIFY /* 291 */ -#endif -#ifdef SSL_R_APPLICATION_DATA_ON_SHUTDOWN - || n == SSL_R_APPLICATION_DATA_ON_SHUTDOWN /* 291 */ -#endif -#ifdef SSL_R_BAD_LEGACY_VERSION - || n == SSL_R_BAD_LEGACY_VERSION /* 292 */ -#endif -#ifdef SSL_R_MIXED_HANDSHAKE_AND_NON_HANDSHAKE_DATA - || n == SSL_R_MIXED_HANDSHAKE_AND_NON_HANDSHAKE_DATA /* 293 */ -#endif -#ifdef SSL_R_RECORD_TOO_SMALL - || n == SSL_R_RECORD_TOO_SMALL /* 298 */ -#endif -#ifdef SSL_R_SSL3_SESSION_ID_TOO_LONG - || n == SSL_R_SSL3_SESSION_ID_TOO_LONG /* 300 */ -#endif -#ifdef SSL_R_BAD_ECPOINT - || n == SSL_R_BAD_ECPOINT /* 306 */ -#endif -#ifdef SSL_R_RENEGOTIATE_EXT_TOO_LONG - || n == SSL_R_RENEGOTIATE_EXT_TOO_LONG /* 335 */ - || n == SSL_R_RENEGOTIATION_ENCODING_ERR /* 336 */ - || n == SSL_R_RENEGOTIATION_MISMATCH /* 337 */ -#endif -#ifdef SSL_R_UNSAFE_LEGACY_RENEGOTIATION_DISABLED - || n == SSL_R_UNSAFE_LEGACY_RENEGOTIATION_DISABLED /* 338 */ -#endif -#ifdef SSL_R_SCSV_RECEIVED_WHEN_RENEGOTIATING - || n == SSL_R_SCSV_RECEIVED_WHEN_RENEGOTIATING /* 345 */ -#endif -#ifdef SSL_R_INAPPROPRIATE_FALLBACK - || n == SSL_R_INAPPROPRIATE_FALLBACK /* 373 */ -#endif -#ifdef SSL_R_NO_SHARED_SIGNATURE_ALGORITHMS - || n == SSL_R_NO_SHARED_SIGNATURE_ALGORITHMS /* 376 */ -#endif -#ifdef SSL_R_NO_SHARED_SIGATURE_ALGORITHMS - || n == SSL_R_NO_SHARED_SIGATURE_ALGORITHMS /* 376 */ -#endif -#ifdef SSL_R_CERT_CB_ERROR - || n == SSL_R_CERT_CB_ERROR /* 377 */ -#endif -#ifdef SSL_R_VERSION_TOO_LOW - || n == SSL_R_VERSION_TOO_LOW /* 396 */ -#endif -#ifdef SSL_R_TOO_MANY_WARN_ALERTS - || n == SSL_R_TOO_MANY_WARN_ALERTS /* 409 */ -#endif -#ifdef SSL_R_BAD_RECORD_TYPE - || n == SSL_R_BAD_RECORD_TYPE /* 443 */ -#endif - || n == 1000 /* SSL_R_SSLV3_ALERT_CLOSE_NOTIFY */ -#ifdef SSL_R_SSLV3_ALERT_UNEXPECTED_MESSAGE - || n == SSL_R_SSLV3_ALERT_UNEXPECTED_MESSAGE /* 1010 */ - || n == SSL_R_SSLV3_ALERT_BAD_RECORD_MAC /* 1020 */ - || n == SSL_R_TLSV1_ALERT_DECRYPTION_FAILED /* 1021 */ - || n == SSL_R_TLSV1_ALERT_RECORD_OVERFLOW /* 1022 */ - || n == SSL_R_SSLV3_ALERT_DECOMPRESSION_FAILURE /* 1030 */ - || n == SSL_R_SSLV3_ALERT_HANDSHAKE_FAILURE /* 1040 */ - || n == SSL_R_SSLV3_ALERT_NO_CERTIFICATE /* 1041 */ - || n == SSL_R_SSLV3_ALERT_BAD_CERTIFICATE /* 1042 */ - || n == SSL_R_SSLV3_ALERT_UNSUPPORTED_CERTIFICATE /* 1043 */ - || n == SSL_R_SSLV3_ALERT_CERTIFICATE_REVOKED /* 1044 */ - || n == SSL_R_SSLV3_ALERT_CERTIFICATE_EXPIRED /* 1045 */ - || n == SSL_R_SSLV3_ALERT_CERTIFICATE_UNKNOWN /* 1046 */ - || n == SSL_R_SSLV3_ALERT_ILLEGAL_PARAMETER /* 1047 */ - || n == SSL_R_TLSV1_ALERT_UNKNOWN_CA /* 1048 */ - || n == SSL_R_TLSV1_ALERT_ACCESS_DENIED /* 1049 */ - || n == SSL_R_TLSV1_ALERT_DECODE_ERROR /* 1050 */ - || n == SSL_R_TLSV1_ALERT_DECRYPT_ERROR /* 1051 */ - || n == SSL_R_TLSV1_ALERT_EXPORT_RESTRICTION /* 1060 */ - || n == SSL_R_TLSV1_ALERT_PROTOCOL_VERSION /* 1070 */ - || n == SSL_R_TLSV1_ALERT_INSUFFICIENT_SECURITY /* 1071 */ - || n == SSL_R_TLSV1_ALERT_INTERNAL_ERROR /* 1080 */ - || n == SSL_R_TLSV1_ALERT_USER_CANCELLED /* 1090 */ - || n == SSL_R_TLSV1_ALERT_NO_RENEGOTIATION /* 1100 */ -#endif - || n == 1121 /* SSL_R_TLSV1_ALERT_ECH_REQUIRED */ - ) - { - switch (c->log_error) { - - case NGX_ERROR_IGNORE_ECONNRESET: - case NGX_ERROR_INFO: - level = NGX_LOG_INFO; - break; - - case NGX_ERROR_ERR: - level = NGX_LOG_ERR; - break; - - default: - break; - } - } - } - - ngx_ssl_error(level, c->log, err, text); -} - - -static void -ngx_ssl_clear_error(ngx_log_t *log) -{ - while (ERR_peek_error()) { - ngx_ssl_error(NGX_LOG_ALERT, log, 0, "ignoring stale global SSL error"); - } - - ERR_clear_error(); -} - - -void ngx_cdecl -ngx_ssl_error(ngx_uint_t level, ngx_log_t *log, ngx_err_t err, char *fmt, ...) -{ - int flags; - u_long n; - va_list args; - u_char *p, *last; - u_char errstr[NGX_MAX_CONF_ERRSTR]; - const char *data; - - last = errstr + NGX_MAX_CONF_ERRSTR; - - va_start(args, fmt); - p = ngx_vslprintf(errstr, last - 1, fmt, args); - va_end(args); - - if (ERR_peek_error()) { - p = ngx_cpystrn(p, (u_char *) " (SSL:", last - p); - - for ( ;; ) { - - n = ERR_peek_error_data(&data, &flags); - - if (n == 0) { - break; - } - - /* ERR_error_string_n() requires at least one byte */ - - if (p >= last - 1) { - goto next; - } - - *p++ = ' '; - - ERR_error_string_n(n, (char *) p, last - p); - - while (p < last && *p) { - p++; - } - - if (p < last && *data && (flags & ERR_TXT_STRING)) { - *p++ = ':'; - p = ngx_cpystrn(p, (u_char *) data, last - p); - } - - next: - - (void) ERR_get_error(); - } - - if (p < last) { - *p++ = ')'; - } - } - - ngx_log_error(level, log, err, "%*s", p - errstr, errstr); -} - - -ngx_int_t -ngx_ssl_session_cache(ngx_ssl_t *ssl, ngx_str_t *sess_ctx, - ngx_array_t *certificates, ssize_t builtin_session_cache, - ngx_shm_zone_t *shm_zone, time_t timeout) -{ - long cache_mode; - - SSL_CTX_set_timeout(ssl->ctx, (long) timeout); - - if (ngx_ssl_session_id_context(ssl, sess_ctx, certificates) != NGX_OK) { - return NGX_ERROR; - } - - if (builtin_session_cache == NGX_SSL_NO_SCACHE) { - SSL_CTX_set_session_cache_mode(ssl->ctx, SSL_SESS_CACHE_OFF); - return NGX_OK; - } - - if (builtin_session_cache == NGX_SSL_NONE_SCACHE) { - - /* - * If the server explicitly says that it does not support - * session reuse (see SSL_SESS_CACHE_OFF above), then - * Outlook Express fails to upload a sent email to - * the Sent Items folder on the IMAP server via a separate IMAP - * connection in the background. Therefore we have a special - * mode (SSL_SESS_CACHE_SERVER|SSL_SESS_CACHE_NO_INTERNAL_STORE) - * where the server pretends that it supports session reuse, - * but it does not actually store any session. - */ - - SSL_CTX_set_session_cache_mode(ssl->ctx, - SSL_SESS_CACHE_SERVER - |SSL_SESS_CACHE_NO_AUTO_CLEAR - |SSL_SESS_CACHE_NO_INTERNAL_STORE); - - SSL_CTX_sess_set_cache_size(ssl->ctx, 1); - - return NGX_OK; - } - - cache_mode = SSL_SESS_CACHE_SERVER; - - if (shm_zone && builtin_session_cache == NGX_SSL_NO_BUILTIN_SCACHE) { - cache_mode |= SSL_SESS_CACHE_NO_INTERNAL; - } - - SSL_CTX_set_session_cache_mode(ssl->ctx, cache_mode); - - if (builtin_session_cache != NGX_SSL_NO_BUILTIN_SCACHE) { - - if (builtin_session_cache != NGX_SSL_DFLT_BUILTIN_SCACHE) { - SSL_CTX_sess_set_cache_size(ssl->ctx, builtin_session_cache); - } - } - - if (shm_zone) { - SSL_CTX_sess_set_new_cb(ssl->ctx, ngx_ssl_new_session); - SSL_CTX_sess_set_get_cb(ssl->ctx, ngx_ssl_get_cached_session); - SSL_CTX_sess_set_remove_cb(ssl->ctx, ngx_ssl_remove_session); - - if (SSL_CTX_set_ex_data(ssl->ctx, ngx_ssl_session_cache_index, shm_zone) - == 0) - { - ngx_ssl_error(NGX_LOG_EMERG, ssl->log, 0, - "SSL_CTX_set_ex_data() failed"); - return NGX_ERROR; - } - } - - return NGX_OK; -} - - -static ngx_int_t -ngx_ssl_session_id_context(ngx_ssl_t *ssl, ngx_str_t *sess_ctx, - ngx_array_t *certificates) -{ - int n, i; - X509 *cert; - X509_NAME *name; - ngx_str_t *certs; - ngx_uint_t k; - EVP_MD_CTX *md; - unsigned int len; - STACK_OF(X509_NAME) *list; - u_char buf[EVP_MAX_MD_SIZE]; - - /* - * Session ID context is set based on the string provided, - * the server certificates, and the client CA list. - */ - - md = EVP_MD_CTX_create(); - if (md == NULL) { - return NGX_ERROR; - } - - if (EVP_DigestInit_ex(md, EVP_sha1(), NULL) == 0) { - ngx_ssl_error(NGX_LOG_EMERG, ssl->log, 0, - "EVP_DigestInit_ex() failed"); - goto failed; - } - - if (EVP_DigestUpdate(md, sess_ctx->data, sess_ctx->len) == 0) { - ngx_ssl_error(NGX_LOG_EMERG, ssl->log, 0, - "EVP_DigestUpdate() failed"); - goto failed; - } - - for (k = 0; k < ssl->certs.nelts; k++) { - cert = ((X509 **) ssl->certs.elts)[k]; - - if (X509_digest(cert, EVP_sha1(), buf, &len) == 0) { - ngx_ssl_error(NGX_LOG_EMERG, ssl->log, 0, - "X509_digest() failed"); - goto failed; - } - - if (EVP_DigestUpdate(md, buf, len) == 0) { - ngx_ssl_error(NGX_LOG_EMERG, ssl->log, 0, - "EVP_DigestUpdate() failed"); - goto failed; - } - } - - if (ssl->certs.nelts == 0 && certificates != NULL) { - /* - * If certificates are loaded dynamically, we use certificate - * names as specified in the configuration (with variables). - */ - - certs = certificates->elts; - for (k = 0; k < certificates->nelts; k++) { - - if (EVP_DigestUpdate(md, certs[k].data, certs[k].len) == 0) { - ngx_ssl_error(NGX_LOG_EMERG, ssl->log, 0, - "EVP_DigestUpdate() failed"); - goto failed; - } - } - } - - list = SSL_CTX_get_client_CA_list(ssl->ctx); - - if (list != NULL) { - n = sk_X509_NAME_num(list); - - for (i = 0; i < n; i++) { - name = sk_X509_NAME_value(list, i); - - if (X509_NAME_digest(name, EVP_sha1(), buf, &len) == 0) { - ngx_ssl_error(NGX_LOG_EMERG, ssl->log, 0, - "X509_NAME_digest() failed"); - goto failed; - } - - if (EVP_DigestUpdate(md, buf, len) == 0) { - ngx_ssl_error(NGX_LOG_EMERG, ssl->log, 0, - "EVP_DigestUpdate() failed"); - goto failed; - } - } - } - - if (EVP_DigestFinal_ex(md, buf, &len) == 0) { - ngx_ssl_error(NGX_LOG_EMERG, ssl->log, 0, - "EVP_DigestFinal_ex() failed"); - goto failed; - } - - EVP_MD_CTX_destroy(md); - - if (SSL_CTX_set_session_id_context(ssl->ctx, buf, len) == 0) { - ngx_ssl_error(NGX_LOG_EMERG, ssl->log, 0, - "SSL_CTX_set_session_id_context() failed"); - return NGX_ERROR; - } - - return NGX_OK; - -failed: - - EVP_MD_CTX_destroy(md); - - return NGX_ERROR; -} - - -ngx_int_t -ngx_ssl_session_cache_init(ngx_shm_zone_t *shm_zone, void *data) -{ - size_t len; - ngx_slab_pool_t *shpool; - ngx_ssl_session_cache_t *cache; - - if (data) { - shm_zone->data = data; - return NGX_OK; - } - - shpool = (ngx_slab_pool_t *) shm_zone->shm.addr; - - if (shm_zone->shm.exists) { - shm_zone->data = shpool->data; - return NGX_OK; - } - - cache = ngx_slab_alloc(shpool, sizeof(ngx_ssl_session_cache_t)); - if (cache == NULL) { - return NGX_ERROR; - } - - shpool->data = cache; - shm_zone->data = cache; - - ngx_rbtree_init(&cache->session_rbtree, &cache->sentinel, - ngx_ssl_session_rbtree_insert_value); - - ngx_queue_init(&cache->expire_queue); - - cache->ticket_keys[0].expire = 0; - cache->ticket_keys[1].expire = 0; - cache->ticket_keys[2].expire = 0; - - cache->fail_time = 0; - - len = sizeof(" in SSL session shared cache \"\"") + shm_zone->shm.name.len; - - shpool->log_ctx = ngx_slab_alloc(shpool, len); - if (shpool->log_ctx == NULL) { - return NGX_ERROR; - } - - ngx_sprintf(shpool->log_ctx, " in SSL session shared cache \"%V\"%Z", - &shm_zone->shm.name); - - shpool->log_nomem = 0; - - return NGX_OK; -} - - -/* - * The length of the session id is 16 bytes for SSLv2 sessions and - * between 1 and 32 bytes for SSLv3 and TLS, typically 32 bytes. - * Typical length of the external ASN1 representation of a session - * is about 150 bytes plus SNI server name. - * - * On 32-bit platforms we allocate an rbtree node, a session id, and - * an ASN1 representation in a single allocation, it typically takes - * 256 bytes. - * - * On 64-bit platforms we allocate separately an rbtree node + session_id, - * and an ASN1 representation, they take accordingly 128 and 256 bytes. - * - * OpenSSL's i2d_SSL_SESSION() and d2i_SSL_SESSION are slow, - * so they are outside the code locked by shared pool mutex - */ - -static int -ngx_ssl_new_session(ngx_ssl_conn_t *ssl_conn, ngx_ssl_session_t *sess) -{ - int len; - u_char *p, *session_id; - size_t n; - uint32_t hash; - SSL_CTX *ssl_ctx; - unsigned int session_id_length; - ngx_shm_zone_t *shm_zone; - ngx_connection_t *c; - ngx_slab_pool_t *shpool; - ngx_ssl_sess_id_t *sess_id; - ngx_ssl_session_cache_t *cache; - -#ifdef TLS1_3_VERSION - - /* - * OpenSSL tries to save TLSv1.3 sessions into session cache - * even when using tickets for stateless session resumption, - * "because some applications just want to know about the creation - * of a session"; do not cache such sessions - */ - - if (SSL_version(ssl_conn) == TLS1_3_VERSION - && (SSL_get_options(ssl_conn) & SSL_OP_NO_TICKET) == 0) - { - return 0; - } - -#endif - - len = i2d_SSL_SESSION(sess, NULL); - - /* do not cache too big session */ - - if (len > NGX_SSL_MAX_SESSION_SIZE) { - return 0; - } - - p = ngx_ssl_session_buffer; - i2d_SSL_SESSION(sess, &p); - - session_id = (u_char *) SSL_SESSION_get_id(sess, &session_id_length); - - /* do not cache sessions with too long session id */ - - if (session_id_length > 32) { - return 0; - } - - c = ngx_ssl_get_connection(ssl_conn); - - ssl_ctx = c->ssl->session_ctx; - shm_zone = SSL_CTX_get_ex_data(ssl_ctx, ngx_ssl_session_cache_index); - - cache = shm_zone->data; - shpool = (ngx_slab_pool_t *) shm_zone->shm.addr; - - ngx_shmtx_lock(&shpool->mutex); - - /* drop one or two expired sessions */ - ngx_ssl_expire_sessions(cache, shpool, 1); - -#if (NGX_PTR_SIZE == 8) - n = sizeof(ngx_ssl_sess_id_t); -#else - n = offsetof(ngx_ssl_sess_id_t, session) + len; -#endif - - sess_id = ngx_slab_alloc_locked(shpool, n); - - if (sess_id == NULL) { - - /* drop the oldest non-expired session and try once more */ - - ngx_ssl_expire_sessions(cache, shpool, 0); - - sess_id = ngx_slab_alloc_locked(shpool, n); - - if (sess_id == NULL) { - goto failed; - } - } - -#if (NGX_PTR_SIZE == 8) - - sess_id->session = ngx_slab_alloc_locked(shpool, len); - - if (sess_id->session == NULL) { - - /* drop the oldest non-expired session and try once more */ - - ngx_ssl_expire_sessions(cache, shpool, 0); - - sess_id->session = ngx_slab_alloc_locked(shpool, len); - - if (sess_id->session == NULL) { - goto failed; - } - } - -#endif - - ngx_memcpy(sess_id->session, ngx_ssl_session_buffer, len); - ngx_memcpy(sess_id->id, session_id, session_id_length); - - hash = ngx_crc32_short(session_id, session_id_length); - - ngx_log_debug3(NGX_LOG_DEBUG_EVENT, c->log, 0, - "ssl new session: %08XD:%ud:%d", - hash, session_id_length, len); - - sess_id->node.key = hash; - sess_id->node.data = (u_char) session_id_length; - sess_id->len = len; - - sess_id->expire = ngx_time() + SSL_CTX_get_timeout(ssl_ctx); - - ngx_queue_insert_head(&cache->expire_queue, &sess_id->queue); - - ngx_rbtree_insert(&cache->session_rbtree, &sess_id->node); - - ngx_shmtx_unlock(&shpool->mutex); - - return 0; - -failed: - - if (sess_id) { - ngx_slab_free_locked(shpool, sess_id); - } - - ngx_shmtx_unlock(&shpool->mutex); - - if (cache->fail_time != ngx_time()) { - cache->fail_time = ngx_time(); - ngx_log_error(NGX_LOG_WARN, c->log, 0, - "could not allocate new session%s", shpool->log_ctx); - } - - return 0; -} - - -static ngx_ssl_session_t * -ngx_ssl_get_cached_session(ngx_ssl_conn_t *ssl_conn, -#if OPENSSL_VERSION_NUMBER >= 0x10100003L - const -#endif - u_char *id, int len, int *copy) -{ - size_t slen; - uint32_t hash; - ngx_int_t rc; - const u_char *p; - ngx_shm_zone_t *shm_zone; - ngx_slab_pool_t *shpool; - ngx_connection_t *c; - ngx_rbtree_node_t *node, *sentinel; - ngx_ssl_session_t *sess; - ngx_ssl_sess_id_t *sess_id; - ngx_ssl_session_cache_t *cache; - - hash = ngx_crc32_short((u_char *) (uintptr_t) id, (size_t) len); - *copy = 0; - - c = ngx_ssl_get_connection(ssl_conn); - - ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0, - "ssl get session: %08XD:%d", hash, len); - - shm_zone = SSL_CTX_get_ex_data(c->ssl->session_ctx, - ngx_ssl_session_cache_index); - - cache = shm_zone->data; - - sess = NULL; - - shpool = (ngx_slab_pool_t *) shm_zone->shm.addr; - - ngx_shmtx_lock(&shpool->mutex); - - node = cache->session_rbtree.root; - sentinel = cache->session_rbtree.sentinel; - - while (node != sentinel) { - - if (hash < node->key) { - node = node->left; - continue; - } - - if (hash > node->key) { - node = node->right; - continue; - } - - /* hash == node->key */ - - sess_id = (ngx_ssl_sess_id_t *) node; - - rc = ngx_memn2cmp((u_char *) (uintptr_t) id, sess_id->id, - (size_t) len, (size_t) node->data); - - if (rc == 0) { - - if (sess_id->expire > ngx_time()) { - slen = sess_id->len; - - ngx_memcpy(ngx_ssl_session_buffer, sess_id->session, slen); - - ngx_shmtx_unlock(&shpool->mutex); - - p = ngx_ssl_session_buffer; - sess = d2i_SSL_SESSION(NULL, &p, slen); - - return sess; - } - - ngx_queue_remove(&sess_id->queue); - - ngx_rbtree_delete(&cache->session_rbtree, node); - - ngx_explicit_memzero(sess_id->session, sess_id->len); - -#if (NGX_PTR_SIZE == 8) - ngx_slab_free_locked(shpool, sess_id->session); -#endif - ngx_slab_free_locked(shpool, sess_id); - - sess = NULL; - - goto done; - } - - node = (rc < 0) ? node->left : node->right; - } - -done: - - ngx_shmtx_unlock(&shpool->mutex); - - return sess; -} - - -void -ngx_ssl_remove_cached_session(SSL_CTX *ssl, ngx_ssl_session_t *sess) -{ - SSL_CTX_remove_session(ssl, sess); - - ngx_ssl_remove_session(ssl, sess); -} - - -static void -ngx_ssl_remove_session(SSL_CTX *ssl, ngx_ssl_session_t *sess) -{ - u_char *id; - uint32_t hash; - ngx_int_t rc; - unsigned int len; - ngx_shm_zone_t *shm_zone; - ngx_slab_pool_t *shpool; - ngx_rbtree_node_t *node, *sentinel; - ngx_ssl_sess_id_t *sess_id; - ngx_ssl_session_cache_t *cache; - - shm_zone = SSL_CTX_get_ex_data(ssl, ngx_ssl_session_cache_index); - - if (shm_zone == NULL) { - return; - } - - cache = shm_zone->data; - - id = (u_char *) SSL_SESSION_get_id(sess, &len); - - hash = ngx_crc32_short(id, len); - - ngx_log_debug2(NGX_LOG_DEBUG_EVENT, ngx_cycle->log, 0, - "ssl remove session: %08XD:%ud", hash, len); - - shpool = (ngx_slab_pool_t *) shm_zone->shm.addr; - - ngx_shmtx_lock(&shpool->mutex); - - node = cache->session_rbtree.root; - sentinel = cache->session_rbtree.sentinel; - - while (node != sentinel) { - - if (hash < node->key) { - node = node->left; - continue; - } - - if (hash > node->key) { - node = node->right; - continue; - } - - /* hash == node->key */ - - sess_id = (ngx_ssl_sess_id_t *) node; - - rc = ngx_memn2cmp(id, sess_id->id, len, (size_t) node->data); - - if (rc == 0) { - - ngx_queue_remove(&sess_id->queue); - - ngx_rbtree_delete(&cache->session_rbtree, node); - - ngx_explicit_memzero(sess_id->session, sess_id->len); - -#if (NGX_PTR_SIZE == 8) - ngx_slab_free_locked(shpool, sess_id->session); -#endif - ngx_slab_free_locked(shpool, sess_id); - - goto done; - } - - node = (rc < 0) ? node->left : node->right; - } - -done: - - ngx_shmtx_unlock(&shpool->mutex); -} - - -static void -ngx_ssl_expire_sessions(ngx_ssl_session_cache_t *cache, - ngx_slab_pool_t *shpool, ngx_uint_t n) -{ - time_t now; - ngx_queue_t *q; - ngx_ssl_sess_id_t *sess_id; - - now = ngx_time(); - - while (n < 3) { - - if (ngx_queue_empty(&cache->expire_queue)) { - return; - } - - q = ngx_queue_last(&cache->expire_queue); - - sess_id = ngx_queue_data(q, ngx_ssl_sess_id_t, queue); - - if (n++ != 0 && sess_id->expire > now) { - return; - } - - ngx_queue_remove(q); - - ngx_log_debug1(NGX_LOG_DEBUG_EVENT, ngx_cycle->log, 0, - "expire session: %08Xi", sess_id->node.key); - - ngx_rbtree_delete(&cache->session_rbtree, &sess_id->node); - - ngx_explicit_memzero(sess_id->session, sess_id->len); - -#if (NGX_PTR_SIZE == 8) - ngx_slab_free_locked(shpool, sess_id->session); -#endif - ngx_slab_free_locked(shpool, sess_id); - } -} - - -static void -ngx_ssl_session_rbtree_insert_value(ngx_rbtree_node_t *temp, - ngx_rbtree_node_t *node, ngx_rbtree_node_t *sentinel) -{ - ngx_rbtree_node_t **p; - ngx_ssl_sess_id_t *sess_id, *sess_id_temp; - - for ( ;; ) { - - if (node->key < temp->key) { - - p = &temp->left; - - } else if (node->key > temp->key) { - - p = &temp->right; - - } else { /* node->key == temp->key */ - - sess_id = (ngx_ssl_sess_id_t *) node; - sess_id_temp = (ngx_ssl_sess_id_t *) temp; - - p = (ngx_memn2cmp(sess_id->id, sess_id_temp->id, - (size_t) node->data, (size_t) temp->data) - < 0) ? &temp->left : &temp->right; - } - - if (*p == sentinel) { - break; - } - - temp = *p; - } - - *p = node; - node->parent = temp; - node->left = sentinel; - node->right = sentinel; - ngx_rbt_red(node); -} - - -#ifdef SSL_CTRL_SET_TLSEXT_TICKET_KEY_CB - -ngx_int_t -ngx_ssl_session_ticket_keys(ngx_conf_t *cf, ngx_ssl_t *ssl, ngx_array_t *paths) -{ - u_char buf[80]; - size_t size; - ssize_t n; - ngx_str_t *path; - ngx_file_t file; - ngx_uint_t i; - ngx_array_t *keys; - ngx_file_info_t fi; - ngx_pool_cleanup_t *cln; - ngx_ssl_ticket_key_t *key; - - if (paths == NULL - && SSL_CTX_get_ex_data(ssl->ctx, ngx_ssl_session_cache_index) == NULL) - { - return NGX_OK; - } - - keys = ngx_array_create(cf->pool, paths ? paths->nelts : 3, - sizeof(ngx_ssl_ticket_key_t)); - if (keys == NULL) { - return NGX_ERROR; - } - - cln = ngx_pool_cleanup_add(cf->pool, 0); - if (cln == NULL) { - return NGX_ERROR; - } - - cln->handler = ngx_ssl_ticket_keys_cleanup; - cln->data = keys; - - if (SSL_CTX_set_ex_data(ssl->ctx, ngx_ssl_ticket_keys_index, keys) == 0) { - ngx_ssl_error(NGX_LOG_EMERG, ssl->log, 0, - "SSL_CTX_set_ex_data() failed"); - return NGX_ERROR; - } - - if (SSL_CTX_set_tlsext_ticket_key_cb(ssl->ctx, ngx_ssl_ticket_key_callback) - == 0) - { - ngx_log_error(NGX_LOG_WARN, cf->log, 0, - "nginx was built with Session Tickets support, however, " - "now it is linked dynamically to an OpenSSL library " - "which has no tlsext support, therefore Session Tickets " - "are not available"); - return NGX_OK; - } - - if (paths == NULL) { - - /* placeholder for keys in shared memory */ - - key = ngx_array_push_n(keys, 3); - key[0].shared = 1; - key[0].expire = 0; - key[1].shared = 1; - key[1].expire = 0; - key[2].shared = 1; - key[2].expire = 0; - - return NGX_OK; - } - - path = paths->elts; - for (i = 0; i < paths->nelts; i++) { - - if (ngx_conf_full_name(cf->cycle, &path[i], 1) != NGX_OK) { - return NGX_ERROR; - } - - ngx_memzero(&file, sizeof(ngx_file_t)); - file.name = path[i]; - file.log = cf->log; - - file.fd = ngx_open_file(file.name.data, NGX_FILE_RDONLY, - NGX_FILE_OPEN, 0); - - if (file.fd == NGX_INVALID_FILE) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, ngx_errno, - ngx_open_file_n " \"%V\" failed", &file.name); - return NGX_ERROR; - } - - if (ngx_fd_info(file.fd, &fi) == NGX_FILE_ERROR) { - ngx_conf_log_error(NGX_LOG_CRIT, cf, ngx_errno, - ngx_fd_info_n " \"%V\" failed", &file.name); - goto failed; - } - - size = ngx_file_size(&fi); - - if (size != 48 && size != 80) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "\"%V\" must be 48 or 80 bytes", &file.name); - goto failed; - } - - n = ngx_read_file(&file, buf, size, 0); - - if (n == NGX_ERROR) { - ngx_conf_log_error(NGX_LOG_CRIT, cf, ngx_errno, - ngx_read_file_n " \"%V\" failed", &file.name); - goto failed; - } - - if ((size_t) n != size) { - ngx_conf_log_error(NGX_LOG_CRIT, cf, 0, - ngx_read_file_n " \"%V\" returned only " - "%z bytes instead of %uz", &file.name, n, size); - goto failed; - } - - key = ngx_array_push(keys); - if (key == NULL) { - goto failed; - } - - key->shared = 0; - key->expire = 1; - - if (size == 48) { - key->size = 48; - ngx_memcpy(key->name, buf, 16); - ngx_memcpy(key->aes_key, buf + 16, 16); - ngx_memcpy(key->hmac_key, buf + 32, 16); - - } else { - key->size = 80; - ngx_memcpy(key->name, buf, 16); - ngx_memcpy(key->hmac_key, buf + 16, 32); - ngx_memcpy(key->aes_key, buf + 48, 32); - } - - if (ngx_close_file(file.fd) == NGX_FILE_ERROR) { - ngx_log_error(NGX_LOG_ALERT, cf->log, ngx_errno, - ngx_close_file_n " \"%V\" failed", &file.name); - } - - ngx_explicit_memzero(&buf, 80); - } - - return NGX_OK; - -failed: - - if (ngx_close_file(file.fd) == NGX_FILE_ERROR) { - ngx_log_error(NGX_LOG_ALERT, cf->log, ngx_errno, - ngx_close_file_n " \"%V\" failed", &file.name); - } - - ngx_explicit_memzero(&buf, 80); - - return NGX_ERROR; -} - - -static int -ngx_ssl_ticket_key_callback(ngx_ssl_conn_t *ssl_conn, - unsigned char *name, unsigned char *iv, EVP_CIPHER_CTX *ectx, - HMAC_CTX *hctx, int enc) -{ - size_t size; - SSL_CTX *ssl_ctx; - ngx_uint_t i; - ngx_array_t *keys; - ngx_connection_t *c; - ngx_ssl_ticket_key_t *key; - const EVP_MD *digest; - const EVP_CIPHER *cipher; - - c = ngx_ssl_get_connection(ssl_conn); - ssl_ctx = c->ssl->session_ctx; - - if (ngx_ssl_rotate_ticket_keys(ssl_ctx, c->log) != NGX_OK) { - return -1; - } - -#ifdef OPENSSL_NO_SHA256 - digest = EVP_sha1(); -#else - digest = EVP_sha256(); -#endif - - keys = SSL_CTX_get_ex_data(ssl_ctx, ngx_ssl_ticket_keys_index); - if (keys == NULL) { - return -1; - } - - key = keys->elts; - - if (enc == 1) { - /* encrypt session ticket */ - - ngx_log_debug3(NGX_LOG_DEBUG_EVENT, c->log, 0, - "ssl ticket encrypt, key: \"%*xs\" (%s session)", - (size_t) 16, key[0].name, - SSL_session_reused(ssl_conn) ? "reused" : "new"); - - if (key[0].size == 48) { - cipher = EVP_aes_128_cbc(); - size = 16; - - } else { - cipher = EVP_aes_256_cbc(); - size = 32; - } - - if (RAND_bytes(iv, EVP_CIPHER_iv_length(cipher)) != 1) { - ngx_ssl_error(NGX_LOG_ALERT, c->log, 0, "RAND_bytes() failed"); - return -1; - } - - if (EVP_EncryptInit_ex(ectx, cipher, NULL, key[0].aes_key, iv) != 1) { - ngx_ssl_error(NGX_LOG_ALERT, c->log, 0, - "EVP_EncryptInit_ex() failed"); - return -1; - } - -#if OPENSSL_VERSION_NUMBER >= 0x10000000L - if (HMAC_Init_ex(hctx, key[0].hmac_key, size, digest, NULL) != 1) { - ngx_ssl_error(NGX_LOG_ALERT, c->log, 0, "HMAC_Init_ex() failed"); - return -1; - } -#else - HMAC_Init_ex(hctx, key[0].hmac_key, size, digest, NULL); -#endif - - ngx_memcpy(name, key[0].name, 16); - - return 1; - - } else { - /* decrypt session ticket */ - - for (i = 0; i < keys->nelts; i++) { - if (ngx_memcmp(name, key[i].name, 16) == 0) { - goto found; - } - } - - ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0, - "ssl ticket decrypt, key: \"%*xs\" not found", - (size_t) 16, name); - - return 0; - - found: - - ngx_log_debug3(NGX_LOG_DEBUG_EVENT, c->log, 0, - "ssl ticket decrypt, key: \"%*xs\"%s", - (size_t) 16, key[i].name, (i == 0) ? " (default)" : ""); - - if (key[i].size == 48) { - cipher = EVP_aes_128_cbc(); - size = 16; - - } else { - cipher = EVP_aes_256_cbc(); - size = 32; - } - -#if OPENSSL_VERSION_NUMBER >= 0x10000000L - if (HMAC_Init_ex(hctx, key[i].hmac_key, size, digest, NULL) != 1) { - ngx_ssl_error(NGX_LOG_ALERT, c->log, 0, "HMAC_Init_ex() failed"); - return -1; - } -#else - HMAC_Init_ex(hctx, key[i].hmac_key, size, digest, NULL); -#endif - - if (EVP_DecryptInit_ex(ectx, cipher, NULL, key[i].aes_key, iv) != 1) { - ngx_ssl_error(NGX_LOG_ALERT, c->log, 0, - "EVP_DecryptInit_ex() failed"); - return -1; - } - - /* renew if TLSv1.3 */ - -#ifdef TLS1_3_VERSION - if (SSL_version(ssl_conn) == TLS1_3_VERSION) { - return 2; - } -#endif - - /* renew if non-default key */ - - if (i != 0 && key[i].expire) { - return 2; - } - - return 1; - } -} - - -static ngx_int_t -ngx_ssl_rotate_ticket_keys(SSL_CTX *ssl_ctx, ngx_log_t *log) -{ - time_t now, expire; - ngx_array_t *keys; - ngx_shm_zone_t *shm_zone; - ngx_slab_pool_t *shpool; - ngx_ssl_ticket_key_t *key; - ngx_ssl_session_cache_t *cache; - u_char buf[80]; - - keys = SSL_CTX_get_ex_data(ssl_ctx, ngx_ssl_ticket_keys_index); - if (keys == NULL) { - return NGX_OK; - } - - key = keys->elts; - - if (!key[0].shared) { - return NGX_OK; - } - - /* - * if we don't need to update expiration of the current key - * and the previous key is still needed, don't sync with shared - * memory to save some work; in the worst case other worker process - * will switch to the next key, but this process will still be able - * to decrypt tickets encrypted with it - */ - - now = ngx_time(); - expire = now + SSL_CTX_get_timeout(ssl_ctx); - - if (key[0].expire >= expire && key[1].expire >= now) { - return NGX_OK; - } - - shm_zone = SSL_CTX_get_ex_data(ssl_ctx, ngx_ssl_session_cache_index); - - cache = shm_zone->data; - shpool = (ngx_slab_pool_t *) shm_zone->shm.addr; - - ngx_shmtx_lock(&shpool->mutex); - - key = cache->ticket_keys; - - if (key[0].expire == 0) { - - /* initialize the current key */ - - if (RAND_bytes(buf, 80) != 1) { - ngx_ssl_error(NGX_LOG_ALERT, log, 0, "RAND_bytes() failed"); - ngx_shmtx_unlock(&shpool->mutex); - return NGX_ERROR; - } - - key[0].shared = 1; - key[0].expire = expire; - key[0].size = 80; - ngx_memcpy(key[0].name, buf, 16); - ngx_memcpy(key[0].hmac_key, buf + 16, 32); - ngx_memcpy(key[0].aes_key, buf + 48, 32); - - ngx_explicit_memzero(&buf, 80); - - ngx_log_debug2(NGX_LOG_DEBUG_EVENT, log, 0, - "ssl ticket key: \"%*xs\"", - (size_t) 16, key[0].name); - - /* - * copy the current key to the next key, as initialization of - * the previous key will replace the current key with the next - * key - */ - - key[2] = key[0]; - } - - if (key[1].expire < now) { - - /* - * if the previous key is no longer needed (or not initialized), - * replace it with the current key, replace the current key with - * the next key, and generate new next key - */ - - key[1] = key[0]; - key[0] = key[2]; - - if (RAND_bytes(buf, 80) != 1) { - ngx_ssl_error(NGX_LOG_ALERT, log, 0, "RAND_bytes() failed"); - ngx_shmtx_unlock(&shpool->mutex); - return NGX_ERROR; - } - - key[2].shared = 1; - key[2].expire = 0; - key[2].size = 80; - ngx_memcpy(key[2].name, buf, 16); - ngx_memcpy(key[2].hmac_key, buf + 16, 32); - ngx_memcpy(key[2].aes_key, buf + 48, 32); - - ngx_explicit_memzero(&buf, 80); - - ngx_log_debug2(NGX_LOG_DEBUG_EVENT, log, 0, - "ssl ticket key: \"%*xs\"", - (size_t) 16, key[2].name); - } - - /* - * update expiration of the current key: it is going to be needed - * at least till the session being created expires - */ - - if (expire > key[0].expire) { - key[0].expire = expire; - } - - /* sync keys to the worker process memory */ - - ngx_memcpy(keys->elts, cache->ticket_keys, - 2 * sizeof(ngx_ssl_ticket_key_t)); - - ngx_shmtx_unlock(&shpool->mutex); - - return NGX_OK; -} - - -static void -ngx_ssl_ticket_keys_cleanup(void *data) -{ - ngx_array_t *keys = data; - - ngx_explicit_memzero(keys->elts, - keys->nelts * sizeof(ngx_ssl_ticket_key_t)); -} - -#else - -ngx_int_t -ngx_ssl_session_ticket_keys(ngx_conf_t *cf, ngx_ssl_t *ssl, ngx_array_t *paths) -{ - if (paths) { - ngx_log_error(NGX_LOG_WARN, ssl->log, 0, - "\"ssl_session_ticket_key\" ignored, not supported"); - } - - return NGX_OK; -} - -#endif - - -void -ngx_ssl_cleanup_ctx(void *data) -{ - ngx_ssl_t *ssl = data; - - X509 *cert; - u_char *p; - ngx_uint_t i; - - for (i = 0; i < ssl->certs.nelts; i++) { - cert = ((X509 **) ssl->certs.elts)[i]; - - p = X509_get_ex_data(cert, ngx_ssl_certificate_comp_index); - - if (p) { - ngx_free(p); - X509_set_ex_data(cert, ngx_ssl_certificate_comp_index, NULL); - } - - X509_free(cert); - } - - SSL_CTX_free(ssl->ctx); -} - - -ngx_int_t -ngx_ssl_check_host(ngx_connection_t *c, ngx_str_t *name) -{ - X509 *cert; - - cert = SSL_get_peer_certificate(c->ssl->connection); - if (cert == NULL) { - return NGX_ERROR; - } - -#ifdef X509_CHECK_FLAG_ALWAYS_CHECK_SUBJECT - - /* X509_check_host() is only available in OpenSSL 1.0.2+ */ - - if (name->len == 0) { - goto failed; - } - - if (X509_check_host(cert, (char *) name->data, name->len, 0, NULL) != 1) { - ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0, - "X509_check_host(): no match"); - goto failed; - } - - ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0, - "X509_check_host(): match"); - - goto found; - -#else - { - int n, i; - X509_NAME *sname; - ASN1_STRING *str; - X509_NAME_ENTRY *entry; - GENERAL_NAME *altname; - STACK_OF(GENERAL_NAME) *altnames; - - /* - * As per RFC6125 and RFC2818, we check subjectAltName extension, - * and if it's not present - commonName in Subject is checked. - */ - - altnames = X509_get_ext_d2i(cert, NID_subject_alt_name, NULL, NULL); - - if (altnames) { - n = sk_GENERAL_NAME_num(altnames); - - for (i = 0; i < n; i++) { - altname = sk_GENERAL_NAME_value(altnames, i); - - if (altname->type != GEN_DNS) { - continue; - } - - str = altname->d.dNSName; - - ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0, - "SSL subjectAltName: \"%*s\"", - ASN1_STRING_length(str), ASN1_STRING_data(str)); - - if (ngx_ssl_check_name(name, str) == NGX_OK) { - ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0, - "SSL subjectAltName: match"); - GENERAL_NAMES_free(altnames); - goto found; - } - } - - ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0, - "SSL subjectAltName: no match"); - - GENERAL_NAMES_free(altnames); - goto failed; - } - - /* - * If there is no subjectAltName extension, check commonName - * in Subject. While RFC2818 requires to only check "most specific" - * CN, both Apache and OpenSSL check all CNs, and so do we. - */ - - sname = X509_get_subject_name(cert); - - if (sname == NULL) { - goto failed; - } - - i = -1; - for ( ;; ) { - i = X509_NAME_get_index_by_NID(sname, NID_commonName, i); - - if (i < 0) { - break; - } - - entry = X509_NAME_get_entry(sname, i); - str = X509_NAME_ENTRY_get_data(entry); - - ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0, - "SSL commonName: \"%*s\"", - ASN1_STRING_length(str), ASN1_STRING_data(str)); - - if (ngx_ssl_check_name(name, str) == NGX_OK) { - ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0, - "SSL commonName: match"); - goto found; - } - } - - ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0, - "SSL commonName: no match"); - } -#endif - -failed: - - X509_free(cert); - return NGX_ERROR; - -found: - - X509_free(cert); - return NGX_OK; -} - - -#ifndef X509_CHECK_FLAG_ALWAYS_CHECK_SUBJECT - -static ngx_int_t -ngx_ssl_check_name(ngx_str_t *name, ASN1_STRING *pattern) -{ - u_char *s, *p, *end; - size_t slen, plen; - - s = name->data; - slen = name->len; - - p = ASN1_STRING_data(pattern); - plen = ASN1_STRING_length(pattern); - - if (slen == plen && ngx_strncasecmp(s, p, plen) == 0) { - return NGX_OK; - } - - if (plen > 2 && p[0] == '*' && p[1] == '.') { - plen -= 1; - p += 1; - - end = s + slen; - s = ngx_strlchr(s, end, '.'); - - if (s == NULL) { - return NGX_ERROR; - } - - slen = end - s; - - if (plen == slen && ngx_strncasecmp(s, p, plen) == 0) { - return NGX_OK; - } - } - - return NGX_ERROR; -} - -#endif - - -ngx_int_t -ngx_ssl_get_protocol(ngx_connection_t *c, ngx_pool_t *pool, ngx_str_t *s) -{ - s->data = (u_char *) SSL_get_version(c->ssl->connection); - return NGX_OK; -} - - -ngx_int_t -ngx_ssl_get_cipher_name(ngx_connection_t *c, ngx_pool_t *pool, ngx_str_t *s) -{ - s->data = (u_char *) SSL_get_cipher_name(c->ssl->connection); - return NGX_OK; -} - - -ngx_int_t -ngx_ssl_get_ciphers(ngx_connection_t *c, ngx_pool_t *pool, ngx_str_t *s) -{ -#ifdef SSL_CTRL_GET_RAW_CIPHERLIST - - int n, i, bytes; - size_t len; - u_char *ciphers, *p; - const SSL_CIPHER *cipher; - - bytes = SSL_get0_raw_cipherlist(c->ssl->connection, NULL); - n = SSL_get0_raw_cipherlist(c->ssl->connection, &ciphers); - - if (n <= 0) { - s->len = 0; - return NGX_OK; - } - - len = 0; - n /= bytes; - - for (i = 0; i < n; i++) { - cipher = SSL_CIPHER_find(c->ssl->connection, ciphers + i * bytes); - - if (cipher) { - len += ngx_strlen(SSL_CIPHER_get_name(cipher)); - - } else { - len += sizeof("0x") - 1 + bytes * (sizeof("00") - 1); - } - - len += sizeof(":") - 1; - } - - s->data = ngx_pnalloc(pool, len); - if (s->data == NULL) { - return NGX_ERROR; - } - - p = s->data; - - for (i = 0; i < n; i++) { - cipher = SSL_CIPHER_find(c->ssl->connection, ciphers + i * bytes); - - if (cipher) { - p = ngx_sprintf(p, "%s", SSL_CIPHER_get_name(cipher)); - - } else { - p = ngx_sprintf(p, "0x"); - p = ngx_hex_dump(p, ciphers + i * bytes, bytes); - } - - *p++ = ':'; - } - - p--; - - s->len = p - s->data; - -#else - - u_char buf[4096]; - - if (SSL_get_shared_ciphers(c->ssl->connection, (char *) buf, 4096) - == NULL) - { - s->len = 0; - return NGX_OK; - } - - s->len = ngx_strlen(buf); - s->data = ngx_pnalloc(pool, s->len); - if (s->data == NULL) { - return NGX_ERROR; - } - - ngx_memcpy(s->data, buf, s->len); - -#endif - - return NGX_OK; -} - - -ngx_int_t -ngx_ssl_get_curve(ngx_connection_t *c, ngx_pool_t *pool, ngx_str_t *s) -{ -#ifdef SSL_get_negotiated_group - - int nid; - const char *name; - - nid = SSL_get_negotiated_group(c->ssl->connection); - - if (nid != NID_undef) { - - if ((nid & TLSEXT_nid_unknown) == 0) { - s->len = ngx_strlen(OBJ_nid2sn(nid)); - s->data = (u_char *) OBJ_nid2sn(nid); - return NGX_OK; - } - - name = SSL_group_to_name(c->ssl->connection, nid); - - s->len = name ? ngx_strlen(name) : sizeof("0x0000") - 1; - s->data = ngx_pnalloc(pool, s->len); - if (s->data == NULL) { - return NGX_ERROR; - } - - if (name) { - ngx_memcpy(s->data, name, s->len); - - } else { - ngx_sprintf(s->data, "0x%04xd", nid & 0xffff); - } - - return NGX_OK; - } - -#endif - - s->len = 0; - return NGX_OK; -} - - -ngx_int_t -ngx_ssl_get_curves(ngx_connection_t *c, ngx_pool_t *pool, ngx_str_t *s) -{ -#ifdef SSL_CTRL_GET_CURVES - - int *curves, n, i, nid; - u_char *p; - size_t len; - const char *name; - - n = SSL_get1_curves(c->ssl->connection, NULL); - - if (n <= 0) { - s->len = 0; - return NGX_OK; - } - - curves = ngx_palloc(pool, n * sizeof(int)); - if (curves == NULL) { - return NGX_ERROR; - } - - n = SSL_get1_curves(c->ssl->connection, curves); - len = 0; - - for (i = 0; i < n; i++) { - nid = curves[i]; - - if (nid & TLSEXT_nid_unknown) { - name = SSL_group_to_name(c->ssl->connection, nid); - - len += name ? ngx_strlen(name) : sizeof("0x0000") - 1; - - } else { - len += ngx_strlen(OBJ_nid2sn(nid)); - } - - len += sizeof(":") - 1; - } - - s->data = ngx_pnalloc(pool, len); - if (s->data == NULL) { - return NGX_ERROR; - } - - p = s->data; - - for (i = 0; i < n; i++) { - nid = curves[i]; - - if (nid & TLSEXT_nid_unknown) { - name = SSL_group_to_name(c->ssl->connection, nid); - - p = name ? ngx_cpymem(p, name, ngx_strlen(name)) - : ngx_sprintf(p, "0x%04xd", nid & 0xffff); - - } else { - p = ngx_sprintf(p, "%s", OBJ_nid2sn(nid)); - } - - *p++ = ':'; - } - - p--; - - s->len = p - s->data; - -#else - - s->len = 0; - -#endif - - return NGX_OK; -} - - -ngx_int_t -ngx_ssl_get_sigalg(ngx_connection_t *c, ngx_pool_t *pool, ngx_str_t *s) -{ -#ifdef SSL_get0_signature_name - - const char *name; - - if (SSL_get0_signature_name(c->ssl->connection, &name)) { - s->len = ngx_strlen(name); - s->data = ngx_pnalloc(pool, s->len); - if (s->data == NULL) { - return NGX_ERROR; - } - - ngx_memcpy(s->data, name, s->len); - - return NGX_OK; - } - -#endif - - s->len = 0; - return NGX_OK; -} - - -ngx_int_t -ngx_ssl_get_session_id(ngx_connection_t *c, ngx_pool_t *pool, ngx_str_t *s) -{ - u_char *buf; - SSL_SESSION *sess; - unsigned int len; - - sess = SSL_get0_session(c->ssl->connection); - if (sess == NULL) { - s->len = 0; - return NGX_OK; - } - - buf = (u_char *) SSL_SESSION_get_id(sess, &len); - - s->len = 2 * len; - s->data = ngx_pnalloc(pool, 2 * len); - if (s->data == NULL) { - return NGX_ERROR; - } - - ngx_hex_dump(s->data, buf, len); - - return NGX_OK; -} - - -ngx_int_t -ngx_ssl_get_session_reused(ngx_connection_t *c, ngx_pool_t *pool, ngx_str_t *s) -{ - if (SSL_session_reused(c->ssl->connection)) { - ngx_str_set(s, "r"); - - } else { - ngx_str_set(s, "."); - } - - return NGX_OK; -} - - -ngx_int_t -ngx_ssl_get_early_data(ngx_connection_t *c, ngx_pool_t *pool, ngx_str_t *s) -{ - s->len = 0; - -#ifdef SSL_ERROR_EARLY_DATA_REJECTED - - /* BoringSSL */ - - if (SSL_in_early_data(c->ssl->connection)) { - ngx_str_set(s, "1"); - } - -#elif defined SSL_READ_EARLY_DATA_SUCCESS - - /* OpenSSL */ - - if (!SSL_is_init_finished(c->ssl->connection)) { - ngx_str_set(s, "1"); - } - -#endif - - return NGX_OK; -} - - -ngx_int_t -ngx_ssl_get_server_name(ngx_connection_t *c, ngx_pool_t *pool, ngx_str_t *s) -{ -#ifdef SSL_CTRL_SET_TLSEXT_HOSTNAME - - size_t len; - const char *name; - - name = SSL_get_servername(c->ssl->connection, TLSEXT_NAMETYPE_host_name); - - if (name) { - len = ngx_strlen(name); - - s->len = len; - s->data = ngx_pnalloc(pool, len); - if (s->data == NULL) { - return NGX_ERROR; - } - - ngx_memcpy(s->data, name, len); - - return NGX_OK; - } - -#endif - - s->len = 0; - return NGX_OK; -} - - -ngx_int_t -ngx_ssl_get_alpn_protocol(ngx_connection_t *c, ngx_pool_t *pool, ngx_str_t *s) -{ -#ifdef TLSEXT_TYPE_application_layer_protocol_negotiation - - unsigned int len; - const unsigned char *data; - - SSL_get0_alpn_selected(c->ssl->connection, &data, &len); - - if (len > 0) { - - s->data = ngx_pnalloc(pool, len); - if (s->data == NULL) { - return NGX_ERROR; - } - - ngx_memcpy(s->data, data, len); - s->len = len; - - return NGX_OK; - } - -#endif - - s->len = 0; - return NGX_OK; -} - - -ngx_int_t -ngx_ssl_get_ech_status(ngx_connection_t *c, ngx_pool_t *pool, ngx_str_t *s) -{ -#ifdef SSL_OP_ECH_GREASE - int echrv; - char *inner_sni, *outer_sni; - - inner_sni = NULL; - outer_sni = NULL; - - echrv = SSL_ech_get1_status(c->ssl->connection, &inner_sni, &outer_sni); - - switch (echrv) { - case SSL_ECH_STATUS_NOT_TRIED: - ngx_str_set(s, "NOT_TRIED"); - break; - case SSL_ECH_STATUS_SUCCESS: - ngx_str_set(s, "SUCCESS"); - break; - case SSL_ECH_STATUS_GREASE: - ngx_str_set(s, "GREASE"); - break; - case SSL_ECH_STATUS_BACKEND: - ngx_str_set(s, "BACKEND"); - break; - default: - ngx_str_set(s, "FAILED"); - break; - } - - OPENSSL_free(inner_sni); - OPENSSL_free(outer_sni); -#else - s->len = 0; -#endif - return NGX_OK; -} - - -ngx_int_t -ngx_ssl_get_ech_outer_server_name(ngx_connection_t *c, ngx_pool_t *pool, - ngx_str_t *s) -{ -#if defined(SSL_OP_ECH_GREASE) - int echrv; - char *inner_sni, *outer_sni; - - inner_sni = NULL; - outer_sni = NULL; - - echrv = SSL_ech_get1_status(c->ssl->connection, &inner_sni, &outer_sni); - - if (echrv == SSL_ECH_STATUS_SUCCESS && outer_sni) { - s->len = ngx_strlen(outer_sni); - - s->data = ngx_pnalloc(pool, s->len); - if (s->data == NULL) { - return NGX_ERROR; - } - - ngx_memcpy(s->data, outer_sni, s->len); - - } else { - s->len = 0; - } - - OPENSSL_free(inner_sni); - OPENSSL_free(outer_sni); -#else - s->len = 0; -#endif - return NGX_OK; -} - - -ngx_int_t -ngx_ssl_get_raw_certificate(ngx_connection_t *c, ngx_pool_t *pool, ngx_str_t *s) -{ - size_t len; - BIO *bio; - X509 *cert; - - s->len = 0; - - cert = SSL_get_peer_certificate(c->ssl->connection); - if (cert == NULL) { - return NGX_OK; - } - - bio = BIO_new(BIO_s_mem()); - if (bio == NULL) { - ngx_ssl_error(NGX_LOG_ALERT, c->log, 0, "BIO_new() failed"); - X509_free(cert); - return NGX_ERROR; - } - - if (PEM_write_bio_X509(bio, cert) == 0) { - ngx_ssl_error(NGX_LOG_ALERT, c->log, 0, "PEM_write_bio_X509() failed"); - goto failed; - } - - len = BIO_pending(bio); - s->len = len; - - s->data = ngx_pnalloc(pool, len); - if (s->data == NULL) { - goto failed; - } - - BIO_read(bio, s->data, len); - - BIO_free(bio); - X509_free(cert); - - return NGX_OK; - -failed: - - BIO_free(bio); - X509_free(cert); - - return NGX_ERROR; -} - - -ngx_int_t -ngx_ssl_get_certificate(ngx_connection_t *c, ngx_pool_t *pool, ngx_str_t *s) -{ - u_char *p; - size_t len; - ngx_uint_t i; - ngx_str_t cert; - - if (ngx_ssl_get_raw_certificate(c, pool, &cert) != NGX_OK) { - return NGX_ERROR; - } - - if (cert.len == 0) { - s->len = 0; - return NGX_OK; - } - - len = cert.len - 1; - - for (i = 0; i < cert.len - 1; i++) { - if (cert.data[i] == LF) { - len++; - } - } - - s->len = len; - s->data = ngx_pnalloc(pool, len); - if (s->data == NULL) { - return NGX_ERROR; - } - - p = s->data; - - for (i = 0; i < cert.len - 1; i++) { - *p++ = cert.data[i]; - if (cert.data[i] == LF) { - *p++ = '\t'; - } - } - - return NGX_OK; -} - - -ngx_int_t -ngx_ssl_get_escaped_certificate(ngx_connection_t *c, ngx_pool_t *pool, - ngx_str_t *s) -{ - ngx_str_t cert; - uintptr_t n; - - if (ngx_ssl_get_raw_certificate(c, pool, &cert) != NGX_OK) { - return NGX_ERROR; - } - - if (cert.len == 0) { - s->len = 0; - return NGX_OK; - } - - n = ngx_escape_uri(NULL, cert.data, cert.len, NGX_ESCAPE_URI_COMPONENT); - - s->len = cert.len + n * 2; - s->data = ngx_pnalloc(pool, s->len); - if (s->data == NULL) { - return NGX_ERROR; - } - - ngx_escape_uri(s->data, cert.data, cert.len, NGX_ESCAPE_URI_COMPONENT); - - return NGX_OK; -} - - -ngx_int_t -ngx_ssl_get_subject_dn(ngx_connection_t *c, ngx_pool_t *pool, ngx_str_t *s) -{ - BIO *bio; - X509 *cert; -#if (OPENSSL_VERSION_NUMBER >= 0x40000000L) - const -#endif - X509_NAME *name; - - s->len = 0; - - cert = SSL_get_peer_certificate(c->ssl->connection); - if (cert == NULL) { - return NGX_OK; - } - - name = X509_get_subject_name(cert); - if (name == NULL) { - X509_free(cert); - return NGX_ERROR; - } - - bio = BIO_new(BIO_s_mem()); - if (bio == NULL) { - ngx_ssl_error(NGX_LOG_ALERT, c->log, 0, "BIO_new() failed"); - X509_free(cert); - return NGX_ERROR; - } - - if (X509_NAME_print_ex(bio, name, 0, XN_FLAG_RFC2253) < 0) { - ngx_ssl_error(NGX_LOG_ALERT, c->log, 0, "X509_NAME_print_ex() failed"); - goto failed; - } - - s->len = BIO_pending(bio); - s->data = ngx_pnalloc(pool, s->len); - if (s->data == NULL) { - goto failed; - } - - BIO_read(bio, s->data, s->len); - - BIO_free(bio); - X509_free(cert); - - return NGX_OK; - -failed: - - BIO_free(bio); - X509_free(cert); - - return NGX_ERROR; -} - - -ngx_int_t -ngx_ssl_get_issuer_dn(ngx_connection_t *c, ngx_pool_t *pool, ngx_str_t *s) -{ - BIO *bio; - X509 *cert; -#if (OPENSSL_VERSION_NUMBER >= 0x40000000L) - const -#endif - X509_NAME *name; - - s->len = 0; - - cert = SSL_get_peer_certificate(c->ssl->connection); - if (cert == NULL) { - return NGX_OK; - } - - name = X509_get_issuer_name(cert); - if (name == NULL) { - X509_free(cert); - return NGX_ERROR; - } - - bio = BIO_new(BIO_s_mem()); - if (bio == NULL) { - ngx_ssl_error(NGX_LOG_ALERT, c->log, 0, "BIO_new() failed"); - X509_free(cert); - return NGX_ERROR; - } - - if (X509_NAME_print_ex(bio, name, 0, XN_FLAG_RFC2253) < 0) { - ngx_ssl_error(NGX_LOG_ALERT, c->log, 0, "X509_NAME_print_ex() failed"); - goto failed; - } - - s->len = BIO_pending(bio); - s->data = ngx_pnalloc(pool, s->len); - if (s->data == NULL) { - goto failed; - } - - BIO_read(bio, s->data, s->len); - - BIO_free(bio); - X509_free(cert); - - return NGX_OK; - -failed: - - BIO_free(bio); - X509_free(cert); - - return NGX_ERROR; -} - - -ngx_int_t -ngx_ssl_get_subject_dn_legacy(ngx_connection_t *c, ngx_pool_t *pool, - ngx_str_t *s) -{ - char *p; - size_t len; - X509 *cert; -#if (OPENSSL_VERSION_NUMBER >= 0x40000000L) - const -#endif - X509_NAME *name; - - s->len = 0; - - cert = SSL_get_peer_certificate(c->ssl->connection); - if (cert == NULL) { - return NGX_OK; - } - - name = X509_get_subject_name(cert); - if (name == NULL) { - X509_free(cert); - return NGX_ERROR; - } - - p = X509_NAME_oneline(name, NULL, 0); - if (p == NULL) { - ngx_ssl_error(NGX_LOG_ALERT, c->log, 0, "X509_NAME_oneline() failed"); - X509_free(cert); - return NGX_ERROR; - } - - for (len = 0; p[len]; len++) { /* void */ } - - s->len = len; - s->data = ngx_pnalloc(pool, len); - if (s->data == NULL) { - OPENSSL_free(p); - X509_free(cert); - return NGX_ERROR; - } - - ngx_memcpy(s->data, p, len); - - OPENSSL_free(p); - X509_free(cert); - - return NGX_OK; -} - - -ngx_int_t -ngx_ssl_get_issuer_dn_legacy(ngx_connection_t *c, ngx_pool_t *pool, - ngx_str_t *s) -{ - char *p; - size_t len; - X509 *cert; -#if (OPENSSL_VERSION_NUMBER >= 0x40000000L) - const -#endif - X509_NAME *name; - - s->len = 0; - - cert = SSL_get_peer_certificate(c->ssl->connection); - if (cert == NULL) { - return NGX_OK; - } - - name = X509_get_issuer_name(cert); - if (name == NULL) { - X509_free(cert); - return NGX_ERROR; - } - - p = X509_NAME_oneline(name, NULL, 0); - if (p == NULL) { - ngx_ssl_error(NGX_LOG_ALERT, c->log, 0, "X509_NAME_oneline() failed"); - X509_free(cert); - return NGX_ERROR; - } - - for (len = 0; p[len]; len++) { /* void */ } - - s->len = len; - s->data = ngx_pnalloc(pool, len); - if (s->data == NULL) { - OPENSSL_free(p); - X509_free(cert); - return NGX_ERROR; - } - - ngx_memcpy(s->data, p, len); - - OPENSSL_free(p); - X509_free(cert); - - return NGX_OK; -} - - -ngx_int_t -ngx_ssl_get_serial_number(ngx_connection_t *c, ngx_pool_t *pool, ngx_str_t *s) -{ - size_t len; - X509 *cert; - BIO *bio; - - s->len = 0; - - cert = SSL_get_peer_certificate(c->ssl->connection); - if (cert == NULL) { - return NGX_OK; - } - - bio = BIO_new(BIO_s_mem()); - if (bio == NULL) { - ngx_ssl_error(NGX_LOG_ALERT, c->log, 0, "BIO_new() failed"); - X509_free(cert); - return NGX_ERROR; - } - - i2a_ASN1_INTEGER(bio, X509_get_serialNumber(cert)); - len = BIO_pending(bio); - - s->len = len; - s->data = ngx_pnalloc(pool, len); - if (s->data == NULL) { - BIO_free(bio); - X509_free(cert); - return NGX_ERROR; - } - - BIO_read(bio, s->data, len); - BIO_free(bio); - X509_free(cert); - - return NGX_OK; -} - - -ngx_int_t -ngx_ssl_get_fingerprint(ngx_connection_t *c, ngx_pool_t *pool, ngx_str_t *s) -{ - X509 *cert; - unsigned int len; - u_char buf[EVP_MAX_MD_SIZE]; - - s->len = 0; - - cert = SSL_get_peer_certificate(c->ssl->connection); - if (cert == NULL) { - return NGX_OK; - } - - if (!X509_digest(cert, EVP_sha1(), buf, &len)) { - ngx_ssl_error(NGX_LOG_ALERT, c->log, 0, "X509_digest() failed"); - X509_free(cert); - return NGX_ERROR; - } - - s->len = 2 * len; - s->data = ngx_pnalloc(pool, 2 * len); - if (s->data == NULL) { - X509_free(cert); - return NGX_ERROR; - } - - ngx_hex_dump(s->data, buf, len); - - X509_free(cert); - - return NGX_OK; -} - - -ngx_int_t -ngx_ssl_get_client_verify(ngx_connection_t *c, ngx_pool_t *pool, ngx_str_t *s) -{ - X509 *cert; - long rc; - const char *str; - - cert = SSL_get_peer_certificate(c->ssl->connection); - if (cert == NULL) { - ngx_str_set(s, "NONE"); - return NGX_OK; - } - - X509_free(cert); - - rc = SSL_get_verify_result(c->ssl->connection); - - if (rc == X509_V_OK) { - if (ngx_ssl_ocsp_get_status(c, &str) == NGX_OK) { - ngx_str_set(s, "SUCCESS"); - return NGX_OK; - } - - } else { - str = X509_verify_cert_error_string(rc); - } - - s->data = ngx_pnalloc(pool, sizeof("FAILED:") - 1 + ngx_strlen(str)); - if (s->data == NULL) { - return NGX_ERROR; - } - - s->len = ngx_sprintf(s->data, "FAILED:%s", str) - s->data; - - return NGX_OK; -} - - -ngx_int_t -ngx_ssl_get_client_v_start(ngx_connection_t *c, ngx_pool_t *pool, ngx_str_t *s) -{ - BIO *bio; - X509 *cert; - size_t len; - - s->len = 0; - - cert = SSL_get_peer_certificate(c->ssl->connection); - if (cert == NULL) { - return NGX_OK; - } - - bio = BIO_new(BIO_s_mem()); - if (bio == NULL) { - ngx_ssl_error(NGX_LOG_ALERT, c->log, 0, "BIO_new() failed"); - X509_free(cert); - return NGX_ERROR; - } - -#if OPENSSL_VERSION_NUMBER > 0x10100000L - ASN1_TIME_print(bio, X509_get0_notBefore(cert)); -#else - ASN1_TIME_print(bio, X509_get_notBefore(cert)); -#endif - - len = BIO_pending(bio); - - s->len = len; - s->data = ngx_pnalloc(pool, len); - if (s->data == NULL) { - BIO_free(bio); - X509_free(cert); - return NGX_ERROR; - } - - BIO_read(bio, s->data, len); - BIO_free(bio); - X509_free(cert); - - return NGX_OK; -} - - -ngx_int_t -ngx_ssl_get_client_v_end(ngx_connection_t *c, ngx_pool_t *pool, ngx_str_t *s) -{ - BIO *bio; - X509 *cert; - size_t len; - - s->len = 0; - - cert = SSL_get_peer_certificate(c->ssl->connection); - if (cert == NULL) { - return NGX_OK; - } - - bio = BIO_new(BIO_s_mem()); - if (bio == NULL) { - ngx_ssl_error(NGX_LOG_ALERT, c->log, 0, "BIO_new() failed"); - X509_free(cert); - return NGX_ERROR; - } - -#if OPENSSL_VERSION_NUMBER > 0x10100000L - ASN1_TIME_print(bio, X509_get0_notAfter(cert)); -#else - ASN1_TIME_print(bio, X509_get_notAfter(cert)); -#endif - - len = BIO_pending(bio); - - s->len = len; - s->data = ngx_pnalloc(pool, len); - if (s->data == NULL) { - BIO_free(bio); - X509_free(cert); - return NGX_ERROR; - } - - BIO_read(bio, s->data, len); - BIO_free(bio); - X509_free(cert); - - return NGX_OK; -} - - -ngx_int_t -ngx_ssl_get_client_v_remain(ngx_connection_t *c, ngx_pool_t *pool, ngx_str_t *s) -{ - X509 *cert; - time_t now, end; - - s->len = 0; - - cert = SSL_get_peer_certificate(c->ssl->connection); - if (cert == NULL) { - return NGX_OK; - } - -#if OPENSSL_VERSION_NUMBER > 0x10100000L - end = ngx_ssl_parse_time(X509_get0_notAfter(cert), c->log); -#else - end = ngx_ssl_parse_time(X509_get_notAfter(cert), c->log); -#endif - - if (end == (time_t) NGX_ERROR) { - X509_free(cert); - return NGX_OK; - } - - now = ngx_time(); - - if (end < now + 86400) { - ngx_str_set(s, "0"); - X509_free(cert); - return NGX_OK; - } - - s->data = ngx_pnalloc(pool, NGX_TIME_T_LEN); - if (s->data == NULL) { - X509_free(cert); - return NGX_ERROR; - } - - s->len = ngx_sprintf(s->data, "%T", (end - now) / 86400) - s->data; - - X509_free(cert); - - return NGX_OK; -} - - -static time_t -ngx_ssl_parse_time( -#if OPENSSL_VERSION_NUMBER > 0x10100000L - const -#endif - ASN1_TIME *asn1time, ngx_log_t *log) -{ - BIO *bio; - char *value; - size_t len; - time_t time; - - /* - * OpenSSL doesn't provide a way to convert ASN1_TIME - * into time_t. To do this, we use ASN1_TIME_print(), - * which uses the "MMM DD HH:MM:SS YYYY [GMT]" format (e.g., - * "Feb 3 00:55:52 2015 GMT"), and parse the result. - */ - - bio = BIO_new(BIO_s_mem()); - if (bio == NULL) { - ngx_ssl_error(NGX_LOG_ALERT, log, 0, "BIO_new() failed"); - return NGX_ERROR; - } - - /* fake weekday prepended to match C asctime() format */ - - BIO_write(bio, "Tue ", sizeof("Tue ") - 1); - ASN1_TIME_print(bio, asn1time); - len = BIO_get_mem_data(bio, &value); - - time = ngx_parse_http_time((u_char *) value, len); - - BIO_free(bio); - - return time; -} - - -ngx_int_t -ngx_ssl_get_client_sigalg(ngx_connection_t *c, ngx_pool_t *pool, ngx_str_t *s) -{ -#ifdef SSL_get0_peer_signature_name - - const char *name; - - if (SSL_get0_peer_signature_name(c->ssl->connection, &name)) { - s->len = ngx_strlen(name); - s->data = ngx_pnalloc(pool, s->len); - if (s->data == NULL) { - return NGX_ERROR; - } - - ngx_memcpy(s->data, name, s->len); - - return NGX_OK; - } - -#endif - - s->len = 0; - return NGX_OK; -} - - -static void * -ngx_openssl_create_conf(ngx_cycle_t *cycle) -{ - ngx_openssl_conf_t *oscf; - - oscf = ngx_pcalloc(cycle->pool, sizeof(ngx_openssl_conf_t)); - if (oscf == NULL) { - return NULL; - } - - /* - * set by ngx_pcalloc(): - * - * oscf->engine = 0; - */ - - return oscf; -} - - -static char * -ngx_openssl_engine(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) -{ -#ifndef OPENSSL_NO_ENGINE - - ngx_openssl_conf_t *oscf = conf; - - ENGINE *engine; - ngx_str_t *value; - - if (oscf->engine) { - return "is duplicate"; - } - - oscf->engine = 1; - - value = cf->args->elts; - - engine = ENGINE_by_id((char *) value[1].data); - - if (engine == NULL) { - ngx_ssl_error(NGX_LOG_EMERG, cf->log, 0, - "ENGINE_by_id(\"%V\") failed", &value[1]); - return NGX_CONF_ERROR; - } - - if (ENGINE_set_default(engine, ENGINE_METHOD_ALL) == 0) { - ngx_ssl_error(NGX_LOG_EMERG, cf->log, 0, - "ENGINE_set_default(\"%V\", ENGINE_METHOD_ALL) failed", - &value[1]); - - ENGINE_free(engine); - - return NGX_CONF_ERROR; - } - - ENGINE_free(engine); - - return NGX_CONF_OK; - -#else - - return "is not supported"; - -#endif -} - - -static void -ngx_openssl_exit(ngx_cycle_t *cycle) -{ -#if OPENSSL_VERSION_NUMBER < 0x10100003L - - EVP_cleanup(); -#ifndef OPENSSL_NO_ENGINE - ENGINE_cleanup(); -#endif - -#endif -} diff --git a/src/deps/src/nginx-1.30.3/src/event/ngx_event_openssl.h b/src/deps/src/nginx-1.30.3/src/event/ngx_event_openssl.h deleted file mode 100644 index 79ae39503a..0000000000 --- a/src/deps/src/nginx-1.30.3/src/event/ngx_event_openssl.h +++ /dev/null @@ -1,416 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#ifndef _NGX_EVENT_OPENSSL_H_INCLUDED_ -#define _NGX_EVENT_OPENSSL_H_INCLUDED_ - - -#include -#include - -#define OPENSSL_SUPPRESS_DEPRECATED - -#include -#include -#include -#include -#include -#ifndef OPENSSL_NO_DH -#include -#endif -#ifndef OPENSSL_NO_ENGINE -#include -#endif -#include -#include -#ifndef OPENSSL_NO_OCSP -#include -#endif -#include -#include -#include - -#define NGX_SSL_NAME "OpenSSL" - - -#if (defined LIBRESSL_VERSION_NUMBER && OPENSSL_VERSION_NUMBER == 0x20000000L) -#undef OPENSSL_VERSION_NUMBER -#if (LIBRESSL_VERSION_NUMBER >= 0x3050000fL) -#define OPENSSL_VERSION_NUMBER 0x1010000fL -#else -#define OPENSSL_VERSION_NUMBER 0x1000107fL -#endif -#endif - - -#if (OPENSSL_VERSION_NUMBER >= 0x10100001L) - -#define ngx_ssl_version() OpenSSL_version(OPENSSL_VERSION) - -#else - -#define ngx_ssl_version() SSLeay_version(SSLEAY_VERSION) - -#endif - - -#define ngx_ssl_session_t SSL_SESSION -#define ngx_ssl_conn_t SSL - - -#if (OPENSSL_VERSION_NUMBER < 0x10002000L) -#define SSL_is_server(s) (s)->server -#endif - - -#if (OPENSSL_VERSION_NUMBER < 0x1010000fL) -#define ASN1_STRING_get0_data(x) (x)->data -#endif - - -#if (OPENSSL_VERSION_NUMBER >= 0x30000000L && !defined SSL_get_peer_certificate) -#define SSL_get_peer_certificate(s) SSL_get1_peer_certificate(s) -#endif - - -#if (OPENSSL_VERSION_NUMBER < 0x30000000L && !defined ERR_peek_error_data) -#define ERR_peek_error_data(d, f) ERR_peek_error_line_data(NULL, NULL, d, f) -#endif - - -#ifdef OPENSSL_NO_DEPRECATED_3_4 -#define SSL_SESSION_get_time(s) SSL_SESSION_get_time_ex(s) -#define SSL_SESSION_set_time(s, t) SSL_SESSION_set_time_ex(s, t) -#endif - - -#ifdef OPENSSL_NO_DEPRECATED_3_0 -#define EVP_CIPHER_CTX_cipher(c) EVP_CIPHER_CTX_get0_cipher(c) -#endif - - -#if (OPENSSL_VERSION_NUMBER < 0x30000000L) -#define SSL_group_to_name(s, nid) NULL -#endif - - -typedef struct ngx_ssl_ocsp_s ngx_ssl_ocsp_t; - - -struct ngx_ssl_s { - SSL_CTX *ctx; - ngx_log_t *log; - size_t buffer_size; - - ngx_array_t certs; - - ngx_rbtree_t staple_rbtree; - ngx_rbtree_node_t staple_sentinel; -}; - - -struct ngx_ssl_connection_s { - ngx_ssl_conn_t *connection; - SSL_CTX *session_ctx; - - ngx_int_t last; - ngx_buf_t *buf; - size_t buffer_size; - - ngx_connection_handler_pt handler; - - ngx_ssl_session_t *session; - ngx_connection_handler_pt save_session; - - ngx_event_handler_pt saved_read_handler; - ngx_event_handler_pt saved_write_handler; - - ngx_ssl_ocsp_t *ocsp; - - u_char early_buf; - - unsigned handshaked:1; - unsigned handshake_rejected:1; - unsigned renegotiation:1; - unsigned buffer:1; - unsigned sendfile:1; - unsigned no_wait_shutdown:1; - unsigned no_send_shutdown:1; - unsigned shutdown_without_free:1; - unsigned handshake_buffer_set:1; - unsigned session_timeout_set:1; - unsigned try_early_data:1; - unsigned in_early:1; - unsigned in_ocsp:1; - unsigned early_preread:1; - unsigned write_blocked:1; - unsigned sni_accepted:1; -}; - - -#define NGX_SSL_NO_SCACHE -2 -#define NGX_SSL_NONE_SCACHE -3 -#define NGX_SSL_NO_BUILTIN_SCACHE -4 -#define NGX_SSL_DFLT_BUILTIN_SCACHE -5 - - -#define NGX_SSL_MAX_SESSION_SIZE 8192 - -typedef struct ngx_ssl_sess_id_s ngx_ssl_sess_id_t; - -struct ngx_ssl_sess_id_s { - ngx_rbtree_node_t node; - size_t len; - ngx_queue_t queue; - time_t expire; - u_char id[32]; -#if (NGX_PTR_SIZE == 8) - u_char *session; -#else - u_char session[1]; -#endif -}; - - -typedef struct { - u_char name[16]; - u_char hmac_key[32]; - u_char aes_key[32]; - time_t expire; - unsigned size:8; - unsigned shared:1; -} ngx_ssl_ticket_key_t; - - -typedef struct { - ngx_rbtree_t session_rbtree; - ngx_rbtree_node_t sentinel; - ngx_queue_t expire_queue; - ngx_ssl_ticket_key_t ticket_keys[3]; - time_t fail_time; -} ngx_ssl_session_cache_t; - - -typedef int (*ngx_ssl_servername_pt)(ngx_ssl_conn_t *, int *, void *); - -typedef struct { - ngx_ssl_servername_pt servername; -} ngx_ssl_client_hello_arg; - - -#define NGX_SSL_SSLv2 0x0002 -#define NGX_SSL_SSLv3 0x0004 -#define NGX_SSL_TLSv1 0x0008 -#define NGX_SSL_TLSv1_1 0x0010 -#define NGX_SSL_TLSv1_2 0x0020 -#define NGX_SSL_TLSv1_3 0x0040 - - -#if (defined SSL_OP_NO_TLSv1_2 || defined SSL_OP_NO_TLSv1_3) -#define NGX_SSL_DEFAULT_PROTOCOLS (NGX_SSL_TLSv1_2|NGX_SSL_TLSv1_3) -#else -#define NGX_SSL_DEFAULT_PROTOCOLS (NGX_SSL_TLSv1|NGX_SSL_TLSv1_1) -#endif - - -#define NGX_SSL_BUFFER 1 -#define NGX_SSL_CLIENT 2 - -#define NGX_SSL_BUFSIZE 16384 - - -#define NGX_SSL_CACHE_CERT 0 -#define NGX_SSL_CACHE_PKEY 1 -#define NGX_SSL_CACHE_CRL 2 -#define NGX_SSL_CACHE_CA 3 - -#define NGX_SSL_CACHE_INVALIDATE 0x80000000 - - -ngx_int_t ngx_ssl_init(ngx_log_t *log); -ngx_int_t ngx_ssl_create(ngx_ssl_t *ssl, ngx_uint_t protocols, void *data); - -ngx_int_t ngx_ssl_certificates(ngx_conf_t *cf, ngx_ssl_t *ssl, - ngx_array_t *certs, ngx_array_t *keys, ngx_array_t *passwords); -ngx_int_t ngx_ssl_certificate(ngx_conf_t *cf, ngx_ssl_t *ssl, - ngx_str_t *cert, ngx_str_t *key, ngx_array_t *passwords); -ngx_int_t ngx_ssl_connection_certificate(ngx_connection_t *c, ngx_pool_t *pool, - ngx_str_t *cert, ngx_str_t *key, ngx_ssl_cache_t *cache, - ngx_array_t *passwords); -ngx_int_t ngx_ssl_certificate_compression(ngx_conf_t *cf, ngx_ssl_t *ssl, - ngx_uint_t enable); - -ngx_int_t ngx_ssl_ciphers(ngx_conf_t *cf, ngx_ssl_t *ssl, ngx_str_t *ciphers, - ngx_uint_t prefer_server_ciphers); -ngx_int_t ngx_ssl_client_certificate(ngx_conf_t *cf, ngx_ssl_t *ssl, - ngx_str_t *cert, ngx_int_t depth); -ngx_int_t ngx_ssl_trusted_certificate(ngx_conf_t *cf, ngx_ssl_t *ssl, - ngx_str_t *cert, ngx_int_t depth); -ngx_int_t ngx_ssl_crl(ngx_conf_t *cf, ngx_ssl_t *ssl, ngx_str_t *crl); -ngx_int_t ngx_ssl_stapling(ngx_conf_t *cf, ngx_ssl_t *ssl, - ngx_str_t *file, ngx_str_t *responder, ngx_uint_t verify); -ngx_int_t ngx_ssl_stapling_resolver(ngx_conf_t *cf, ngx_ssl_t *ssl, - ngx_resolver_t *resolver, ngx_msec_t resolver_timeout); -ngx_int_t ngx_ssl_ocsp(ngx_conf_t *cf, ngx_ssl_t *ssl, ngx_str_t *responder, - ngx_uint_t depth, ngx_shm_zone_t *shm_zone); -ngx_int_t ngx_ssl_ocsp_resolver(ngx_conf_t *cf, ngx_ssl_t *ssl, - ngx_resolver_t *resolver, ngx_msec_t resolver_timeout); - -ngx_int_t ngx_ssl_ocsp_validate(ngx_connection_t *c); -ngx_int_t ngx_ssl_ocsp_get_status(ngx_connection_t *c, const char **s); -void ngx_ssl_ocsp_cleanup(ngx_connection_t *c); -ngx_int_t ngx_ssl_ocsp_cache_init(ngx_shm_zone_t *shm_zone, void *data); - -ngx_ssl_cache_t *ngx_ssl_cache_init(ngx_pool_t *pool, ngx_uint_t max, - time_t valid, time_t inactive); -void *ngx_ssl_cache_fetch(ngx_conf_t *cf, ngx_uint_t index, char **err, - ngx_str_t *path, void *data); -void *ngx_ssl_cache_connection_fetch(ngx_ssl_cache_t *cache, ngx_pool_t *pool, - ngx_uint_t index, char **err, ngx_str_t *path, void *data); - -ngx_array_t *ngx_ssl_read_password_file(ngx_conf_t *cf, ngx_str_t *file); -ngx_array_t *ngx_ssl_preserve_passwords(ngx_conf_t *cf, - ngx_array_t *passwords); -ngx_int_t ngx_ssl_dhparam(ngx_conf_t *cf, ngx_ssl_t *ssl, ngx_str_t *file); -ngx_int_t ngx_ssl_ech_files(ngx_conf_t *cf, ngx_ssl_t *ssl, - ngx_array_t *filename); -ngx_int_t ngx_ssl_ecdh_curve(ngx_conf_t *cf, ngx_ssl_t *ssl, ngx_str_t *name); -ngx_int_t ngx_ssl_early_data(ngx_conf_t *cf, ngx_ssl_t *ssl, - ngx_uint_t enable); -ngx_int_t ngx_ssl_conf_commands(ngx_conf_t *cf, ngx_ssl_t *ssl, - ngx_array_t *commands); - -ngx_int_t ngx_ssl_client_session_cache(ngx_conf_t *cf, ngx_ssl_t *ssl, - ngx_uint_t enable); -ngx_int_t ngx_ssl_session_cache(ngx_ssl_t *ssl, ngx_str_t *sess_ctx, - ngx_array_t *certificates, ssize_t builtin_session_cache, - ngx_shm_zone_t *shm_zone, time_t timeout); -ngx_int_t ngx_ssl_session_ticket_keys(ngx_conf_t *cf, ngx_ssl_t *ssl, - ngx_array_t *paths); -ngx_int_t ngx_ssl_session_cache_init(ngx_shm_zone_t *shm_zone, void *data); - -ngx_int_t ngx_ssl_set_client_hello_callback(ngx_ssl_t *ssl, - ngx_ssl_client_hello_arg *cb); -#ifdef SSL_CLIENT_HELLO_SUCCESS -int ngx_ssl_client_hello_callback(ngx_ssl_conn_t *ssl_conn, int *ad, void *arg); -#elif defined OPENSSL_IS_BORINGSSL -enum ssl_select_cert_result_t ngx_ssl_select_certificate( - const SSL_CLIENT_HELLO *client_hello); -#endif - -ngx_int_t ngx_ssl_create_connection(ngx_ssl_t *ssl, ngx_connection_t *c, - ngx_uint_t flags); - -void ngx_ssl_remove_cached_session(SSL_CTX *ssl, ngx_ssl_session_t *sess); -ngx_int_t ngx_ssl_set_session(ngx_connection_t *c, ngx_ssl_session_t *session); -ngx_ssl_session_t *ngx_ssl_get_session(ngx_connection_t *c); -ngx_ssl_session_t *ngx_ssl_get0_session(ngx_connection_t *c); -#define ngx_ssl_free_session SSL_SESSION_free -#define ngx_ssl_get_connection(ssl_conn) \ - SSL_get_ex_data(ssl_conn, ngx_ssl_connection_index) -#define ngx_ssl_get_server_conf(ssl_ctx) \ - SSL_CTX_get_ex_data(ssl_ctx, ngx_ssl_server_conf_index) - -#define ngx_ssl_verify_error_optional(n) \ - (n == X509_V_ERR_DEPTH_ZERO_SELF_SIGNED_CERT \ - || n == X509_V_ERR_SELF_SIGNED_CERT_IN_CHAIN \ - || n == X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT_LOCALLY \ - || n == X509_V_ERR_CERT_UNTRUSTED \ - || n == X509_V_ERR_UNABLE_TO_VERIFY_LEAF_SIGNATURE) - -ngx_int_t ngx_ssl_check_host(ngx_connection_t *c, ngx_str_t *name); - - -ngx_int_t ngx_ssl_get_protocol(ngx_connection_t *c, ngx_pool_t *pool, - ngx_str_t *s); -ngx_int_t ngx_ssl_get_cipher_name(ngx_connection_t *c, ngx_pool_t *pool, - ngx_str_t *s); -ngx_int_t ngx_ssl_get_ciphers(ngx_connection_t *c, ngx_pool_t *pool, - ngx_str_t *s); -ngx_int_t ngx_ssl_get_curve(ngx_connection_t *c, ngx_pool_t *pool, - ngx_str_t *s); -ngx_int_t ngx_ssl_get_curves(ngx_connection_t *c, ngx_pool_t *pool, - ngx_str_t *s); -ngx_int_t ngx_ssl_get_sigalg(ngx_connection_t *c, ngx_pool_t *pool, - ngx_str_t *s); -ngx_int_t ngx_ssl_get_session_id(ngx_connection_t *c, ngx_pool_t *pool, - ngx_str_t *s); -ngx_int_t ngx_ssl_get_session_reused(ngx_connection_t *c, ngx_pool_t *pool, - ngx_str_t *s); -ngx_int_t ngx_ssl_get_early_data(ngx_connection_t *c, ngx_pool_t *pool, - ngx_str_t *s); -ngx_int_t ngx_ssl_get_server_name(ngx_connection_t *c, ngx_pool_t *pool, - ngx_str_t *s); -ngx_int_t ngx_ssl_get_ech_status(ngx_connection_t *c, ngx_pool_t *pool, - ngx_str_t *s); -ngx_int_t ngx_ssl_get_ech_outer_server_name(ngx_connection_t *c, - ngx_pool_t *pool, ngx_str_t *s); -ngx_int_t ngx_ssl_get_alpn_protocol(ngx_connection_t *c, ngx_pool_t *pool, - ngx_str_t *s); -ngx_int_t ngx_ssl_get_raw_certificate(ngx_connection_t *c, ngx_pool_t *pool, - ngx_str_t *s); -ngx_int_t ngx_ssl_get_certificate(ngx_connection_t *c, ngx_pool_t *pool, - ngx_str_t *s); -ngx_int_t ngx_ssl_get_escaped_certificate(ngx_connection_t *c, ngx_pool_t *pool, - ngx_str_t *s); -ngx_int_t ngx_ssl_get_subject_dn(ngx_connection_t *c, ngx_pool_t *pool, - ngx_str_t *s); -ngx_int_t ngx_ssl_get_issuer_dn(ngx_connection_t *c, ngx_pool_t *pool, - ngx_str_t *s); -ngx_int_t ngx_ssl_get_subject_dn_legacy(ngx_connection_t *c, ngx_pool_t *pool, - ngx_str_t *s); -ngx_int_t ngx_ssl_get_issuer_dn_legacy(ngx_connection_t *c, ngx_pool_t *pool, - ngx_str_t *s); -ngx_int_t ngx_ssl_get_serial_number(ngx_connection_t *c, ngx_pool_t *pool, - ngx_str_t *s); -ngx_int_t ngx_ssl_get_fingerprint(ngx_connection_t *c, ngx_pool_t *pool, - ngx_str_t *s); -ngx_int_t ngx_ssl_get_client_verify(ngx_connection_t *c, ngx_pool_t *pool, - ngx_str_t *s); -ngx_int_t ngx_ssl_get_client_v_start(ngx_connection_t *c, ngx_pool_t *pool, - ngx_str_t *s); -ngx_int_t ngx_ssl_get_client_v_end(ngx_connection_t *c, ngx_pool_t *pool, - ngx_str_t *s); -ngx_int_t ngx_ssl_get_client_v_remain(ngx_connection_t *c, ngx_pool_t *pool, - ngx_str_t *s); -ngx_int_t ngx_ssl_get_client_sigalg(ngx_connection_t *c, ngx_pool_t *pool, - ngx_str_t *s); - - -ngx_int_t ngx_ssl_handshake(ngx_connection_t *c); -#if (NGX_DEBUG) -void ngx_ssl_handshake_log(ngx_connection_t *c); -#endif -ssize_t ngx_ssl_recv(ngx_connection_t *c, u_char *buf, size_t size); -ssize_t ngx_ssl_write(ngx_connection_t *c, u_char *data, size_t size); -ssize_t ngx_ssl_recv_chain(ngx_connection_t *c, ngx_chain_t *cl, off_t limit); -ngx_chain_t *ngx_ssl_send_chain(ngx_connection_t *c, ngx_chain_t *in, - off_t limit); -void ngx_ssl_free_buffer(ngx_connection_t *c); -ngx_int_t ngx_ssl_shutdown(ngx_connection_t *c); -void ngx_ssl_connection_error(ngx_connection_t *c, int sslerr, ngx_err_t err, - char *text); -void ngx_cdecl ngx_ssl_error(ngx_uint_t level, ngx_log_t *log, ngx_err_t err, - char *fmt, ...); -void ngx_ssl_cleanup_ctx(void *data); - - -extern int ngx_ssl_connection_index; -extern int ngx_ssl_server_conf_index; -extern int ngx_ssl_session_cache_index; -extern int ngx_ssl_ticket_keys_index; -extern int ngx_ssl_ocsp_index; -extern int ngx_ssl_index; -extern int ngx_ssl_certificate_name_index; -extern int ngx_ssl_certificate_comp_index; -extern int ngx_ssl_client_hello_arg_index; - - -extern u_char ngx_ssl_session_buffer[NGX_SSL_MAX_SESSION_SIZE]; - - -#endif /* _NGX_EVENT_OPENSSL_H_INCLUDED_ */ diff --git a/src/deps/src/nginx-1.30.3/src/event/ngx_event_openssl_cache.c b/src/deps/src/nginx-1.30.3/src/event/ngx_event_openssl_cache.c deleted file mode 100644 index 61fceed7b8..0000000000 --- a/src/deps/src/nginx-1.30.3/src/event/ngx_event_openssl_cache.c +++ /dev/null @@ -1,1267 +0,0 @@ - -/* - * Copyright (C) Nginx, Inc. - */ - - -#include -#include -#include - -#ifdef ERR_R_OSSL_STORE_LIB -#include -#include -#endif - - -#define NGX_SSL_CACHE_PATH 0 -#define NGX_SSL_CACHE_DATA 1 -#define NGX_SSL_CACHE_ENGINE 2 -#define NGX_SSL_CACHE_STORE 3 - -#define NGX_SSL_CACHE_DISABLED (ngx_array_t *) (uintptr_t) -1 - - -#define ngx_ssl_cache_get_conf(cycle) \ - (ngx_ssl_cache_t *) ngx_get_conf(cycle->conf_ctx, ngx_openssl_cache_module) - -#define ngx_ssl_cache_get_old_conf(cycle) \ - cycle->old_cycle->conf_ctx ? ngx_ssl_cache_get_conf(cycle->old_cycle) \ - : NULL - - -typedef struct { - unsigned type:2; - unsigned len:30; - u_char *data; -} ngx_ssl_cache_key_t; - - -typedef void *(*ngx_ssl_cache_create_pt)(ngx_ssl_cache_key_t *id, char **err, - void *data); -typedef void (*ngx_ssl_cache_free_pt)(void *data); -typedef void *(*ngx_ssl_cache_ref_pt)(char **err, void *data); - - -typedef struct { - ngx_ssl_cache_create_pt create; - ngx_ssl_cache_free_pt free; - ngx_ssl_cache_ref_pt ref; -} ngx_ssl_cache_type_t; - - -typedef struct { - ngx_rbtree_node_t node; - ngx_queue_t queue; - ngx_ssl_cache_key_t id; - ngx_ssl_cache_type_t *type; - void *value; - - time_t created; - time_t accessed; - - time_t mtime; - ngx_file_uniq_t uniq; -} ngx_ssl_cache_node_t; - - -struct ngx_ssl_cache_s { - ngx_rbtree_t rbtree; - ngx_rbtree_node_t sentinel; - ngx_queue_t expire_queue; - - ngx_flag_t inheritable; - - ngx_uint_t current; - ngx_uint_t max; - time_t valid; - time_t inactive; -}; - - -typedef struct { - ngx_str_t *pwd; - unsigned encrypted:1; -} ngx_ssl_cache_pwd_t; - - -static ngx_int_t ngx_ssl_cache_init_key(ngx_pool_t *pool, ngx_uint_t index, - ngx_str_t *path, ngx_ssl_cache_key_t *id); -static ngx_ssl_cache_node_t *ngx_ssl_cache_lookup(ngx_ssl_cache_t *cache, - ngx_ssl_cache_type_t *type, ngx_ssl_cache_key_t *id, uint32_t hash); -static void ngx_ssl_cache_expire(ngx_ssl_cache_t *cache, ngx_uint_t n, - ngx_log_t *log); - -static void *ngx_ssl_cache_cert_create(ngx_ssl_cache_key_t *id, char **err, - void *data); -static void ngx_ssl_cache_cert_free(void *data); -static void *ngx_ssl_cache_cert_ref(char **err, void *data); - -static void *ngx_ssl_cache_pkey_create(ngx_ssl_cache_key_t *id, char **err, - void *data); -static int ngx_ssl_cache_pkey_password_callback(char *buf, int size, int rwflag, - void *userdata); -static void ngx_ssl_cache_pkey_free(void *data); -static void *ngx_ssl_cache_pkey_ref(char **err, void *data); - -static void *ngx_ssl_cache_crl_create(ngx_ssl_cache_key_t *id, char **err, - void *data); -static void ngx_ssl_cache_crl_free(void *data); -static void *ngx_ssl_cache_crl_ref(char **err, void *data); - -static void *ngx_ssl_cache_ca_create(ngx_ssl_cache_key_t *id, char **err, - void *data); - -static BIO *ngx_ssl_cache_create_bio(ngx_ssl_cache_key_t *id, char **err); - -static void *ngx_openssl_cache_create_conf(ngx_cycle_t *cycle); -static char *ngx_openssl_cache_init_conf(ngx_cycle_t *cycle, void *conf); -static void ngx_ssl_cache_cleanup(void *data); -static void ngx_ssl_cache_node_insert(ngx_rbtree_node_t *temp, - ngx_rbtree_node_t *node, ngx_rbtree_node_t *sentinel); -static void ngx_ssl_cache_node_free(ngx_rbtree_t *rbtree, - ngx_ssl_cache_node_t *cn); - -static ngx_int_t ngx_openssl_cache_init_worker(ngx_cycle_t *cycle); - - -static ngx_command_t ngx_openssl_cache_commands[] = { - - { ngx_string("ssl_object_cache_inheritable"), - NGX_MAIN_CONF|NGX_DIRECT_CONF|NGX_CONF_FLAG, - ngx_conf_set_flag_slot, - 0, - offsetof(ngx_ssl_cache_t, inheritable), - NULL }, - - ngx_null_command -}; - - -static ngx_core_module_t ngx_openssl_cache_module_ctx = { - ngx_string("openssl_cache"), - ngx_openssl_cache_create_conf, - ngx_openssl_cache_init_conf -}; - - -ngx_module_t ngx_openssl_cache_module = { - NGX_MODULE_V1, - &ngx_openssl_cache_module_ctx, /* module context */ - ngx_openssl_cache_commands, /* module directives */ - NGX_CORE_MODULE, /* module type */ - NULL, /* init master */ - NULL, /* init module */ - ngx_openssl_cache_init_worker, /* init process */ - NULL, /* init thread */ - NULL, /* exit thread */ - NULL, /* exit process */ - NULL, /* exit master */ - NGX_MODULE_V1_PADDING -}; - - -static ngx_ssl_cache_type_t ngx_ssl_cache_types[] = { - - /* NGX_SSL_CACHE_CERT */ - { ngx_ssl_cache_cert_create, - ngx_ssl_cache_cert_free, - ngx_ssl_cache_cert_ref }, - - /* NGX_SSL_CACHE_PKEY */ - { ngx_ssl_cache_pkey_create, - ngx_ssl_cache_pkey_free, - ngx_ssl_cache_pkey_ref }, - - /* NGX_SSL_CACHE_CRL */ - { ngx_ssl_cache_crl_create, - ngx_ssl_cache_crl_free, - ngx_ssl_cache_crl_ref }, - - /* NGX_SSL_CACHE_CA */ - { ngx_ssl_cache_ca_create, - ngx_ssl_cache_cert_free, - ngx_ssl_cache_cert_ref } -}; - - -void * -ngx_ssl_cache_fetch(ngx_conf_t *cf, ngx_uint_t index, char **err, - ngx_str_t *path, void *data) -{ - void *value; - time_t mtime; - uint32_t hash; - ngx_int_t rc; - ngx_uint_t invalidate; - ngx_file_uniq_t uniq; - ngx_file_info_t fi; - ngx_ssl_cache_t *cache, *old_cache; - ngx_ssl_cache_key_t id; - ngx_ssl_cache_type_t *type; - ngx_ssl_cache_node_t *cn; - - *err = NULL; - - invalidate = index & NGX_SSL_CACHE_INVALIDATE; - index &= ~NGX_SSL_CACHE_INVALIDATE; - - if (ngx_ssl_cache_init_key(cf->pool, index, path, &id) != NGX_OK) { - return NULL; - } - - if (id.type == NGX_SSL_CACHE_DATA) { - invalidate = 0; - } - - cache = (ngx_ssl_cache_t *) ngx_get_conf(cf->cycle->conf_ctx, - ngx_openssl_cache_module); - - type = &ngx_ssl_cache_types[index]; - hash = ngx_murmur_hash2(id.data, id.len); - - cn = ngx_ssl_cache_lookup(cache, type, &id, hash); - - if (cn != NULL) { - if (!invalidate) { - return type->ref(err, cn->value); - } - - type->free(cn->value); - ngx_rbtree_delete(&cache->rbtree, &cn->node); - } - - value = NULL; - - if (id.type == NGX_SSL_CACHE_PATH - && (rc = ngx_file_info(id.data, &fi)) != NGX_FILE_ERROR) - { - mtime = ngx_file_mtime(&fi); - uniq = ngx_file_uniq(&fi); - - } else { - rc = NGX_FILE_ERROR; - mtime = 0; - uniq = 0; - } - - /* try to use a reference from the old cycle */ - - old_cache = ngx_ssl_cache_get_old_conf(cf->cycle); - - if (old_cache && old_cache->inheritable && !invalidate) { - cn = ngx_ssl_cache_lookup(old_cache, type, &id, hash); - - if (cn != NULL) { - switch (id.type) { - - case NGX_SSL_CACHE_DATA: - value = type->ref(err, cn->value); - break; - - default: - if (rc != NGX_FILE_ERROR - && uniq == cn->uniq && mtime == cn->mtime) - { - value = type->ref(err, cn->value); - } - break; - } - } - } - - if (value == NULL) { - value = type->create(&id, err, &data); - - if (value == NULL || data == NGX_SSL_CACHE_DISABLED) { - return value; - } - } - - cn = ngx_palloc(cf->pool, sizeof(ngx_ssl_cache_node_t) + id.len + 1); - if (cn == NULL) { - type->free(value); - return NULL; - } - - cn->node.key = hash; - cn->id.data = (u_char *)(cn + 1); - cn->id.len = id.len; - cn->id.type = id.type; - cn->type = type; - cn->value = value; - cn->mtime = mtime; - cn->uniq = uniq; - - ngx_cpystrn(cn->id.data, id.data, id.len + 1); - - ngx_queue_init(&cn->queue); - - ngx_rbtree_insert(&cache->rbtree, &cn->node); - - return type->ref(err, cn->value); -} - - -void * -ngx_ssl_cache_connection_fetch(ngx_ssl_cache_t *cache, ngx_pool_t *pool, - ngx_uint_t index, char **err, ngx_str_t *path, void *data) -{ - void *value; - time_t now; - uint32_t hash; - ngx_uint_t invalidate; - ngx_file_info_t fi; - ngx_ssl_cache_key_t id; - ngx_ssl_cache_type_t *type; - ngx_ssl_cache_node_t *cn; - - *err = NULL; - - invalidate = index & NGX_SSL_CACHE_INVALIDATE; - index &= ~NGX_SSL_CACHE_INVALIDATE; - - if (ngx_ssl_cache_init_key(pool, index, path, &id) != NGX_OK) { - return NULL; - } - - type = &ngx_ssl_cache_types[index]; - - if (cache == NULL) { - return type->create(&id, err, &data); - } - - now = ngx_time(); - - hash = ngx_murmur_hash2(id.data, id.len); - - cn = ngx_ssl_cache_lookup(cache, type, &id, hash); - - if (cn != NULL) { - ngx_queue_remove(&cn->queue); - - if (id.type == NGX_SSL_CACHE_DATA) { - goto found; - } - - if (!invalidate && now - cn->created <= cache->valid) { - goto found; - } - - switch (id.type) { - - case NGX_SSL_CACHE_PATH: - - if (ngx_file_info(id.data, &fi) != NGX_FILE_ERROR) { - - if (!invalidate - && ngx_file_uniq(&fi) == cn->uniq - && ngx_file_mtime(&fi) == cn->mtime) - { - break; - } - - cn->mtime = ngx_file_mtime(&fi); - cn->uniq = ngx_file_uniq(&fi); - - } else { - cn->mtime = 0; - cn->uniq = 0; - } - - /* fall through */ - - default: - ngx_log_debug1(NGX_LOG_DEBUG_CORE, pool->log, 0, - "update cached ssl object: %s", cn->id.data); - - type->free(cn->value); - - value = type->create(&id, err, &data); - - if (value == NULL || data == NGX_SSL_CACHE_DISABLED) { - ngx_rbtree_delete(&cache->rbtree, &cn->node); - - cache->current--; - - ngx_free(cn); - - return value; - } - - cn->value = value; - } - - cn->created = now; - - goto found; - } - - value = type->create(&id, err, &data); - - if (value == NULL || data == NGX_SSL_CACHE_DISABLED) { - return value; - } - - cn = ngx_alloc(sizeof(ngx_ssl_cache_node_t) + id.len + 1, pool->log); - if (cn == NULL) { - type->free(value); - return NULL; - } - - cn->node.key = hash; - cn->id.data = (u_char *)(cn + 1); - cn->id.len = id.len; - cn->id.type = id.type; - cn->type = type; - cn->value = value; - cn->created = now; - - ngx_cpystrn(cn->id.data, id.data, id.len + 1); - - if (id.type == NGX_SSL_CACHE_PATH) { - - if (ngx_file_info(id.data, &fi) != NGX_FILE_ERROR) { - cn->mtime = ngx_file_mtime(&fi); - cn->uniq = ngx_file_uniq(&fi); - - } else { - cn->mtime = 0; - cn->uniq = 0; - } - } - - ngx_ssl_cache_expire(cache, 1, pool->log); - - if (cache->current >= cache->max) { - ngx_ssl_cache_expire(cache, 0, pool->log); - } - - ngx_rbtree_insert(&cache->rbtree, &cn->node); - - cache->current++; - -found: - - cn->accessed = now; - - ngx_queue_insert_head(&cache->expire_queue, &cn->queue); - - return type->ref(err, cn->value); -} - - -static ngx_int_t -ngx_ssl_cache_init_key(ngx_pool_t *pool, ngx_uint_t index, ngx_str_t *path, - ngx_ssl_cache_key_t *id) -{ - if (index <= NGX_SSL_CACHE_PKEY - && ngx_strncmp(path->data, "data:", sizeof("data:") - 1) == 0) - { - id->type = NGX_SSL_CACHE_DATA; - - } else if (index == NGX_SSL_CACHE_PKEY - && ngx_strncmp(path->data, "engine:", sizeof("engine:") - 1) == 0) - { - id->type = NGX_SSL_CACHE_ENGINE; - - } else if (index == NGX_SSL_CACHE_PKEY - && ngx_strncmp(path->data, "store:", sizeof("store:") - 1) == 0) - { - id->type = NGX_SSL_CACHE_STORE; - - } else { - if (ngx_get_full_name(pool, (ngx_str_t *) &ngx_cycle->conf_prefix, path) - != NGX_OK) - { - return NGX_ERROR; - } - - id->type = NGX_SSL_CACHE_PATH; - } - - id->len = path->len; - id->data = path->data; - - return NGX_OK; -} - - -static ngx_ssl_cache_node_t * -ngx_ssl_cache_lookup(ngx_ssl_cache_t *cache, ngx_ssl_cache_type_t *type, - ngx_ssl_cache_key_t *id, uint32_t hash) -{ - ngx_int_t rc; - ngx_rbtree_node_t *node, *sentinel; - ngx_ssl_cache_node_t *cn; - - node = cache->rbtree.root; - sentinel = cache->rbtree.sentinel; - - while (node != sentinel) { - - if (hash < node->key) { - node = node->left; - continue; - } - - if (hash > node->key) { - node = node->right; - continue; - } - - /* hash == node->key */ - - cn = (ngx_ssl_cache_node_t *) node; - - if (type < cn->type) { - node = node->left; - continue; - } - - if (type > cn->type) { - node = node->right; - continue; - } - - /* type == cn->type */ - - rc = ngx_memn2cmp(id->data, cn->id.data, id->len, cn->id.len); - - if (rc == 0) { - return cn; - } - - node = (rc < 0) ? node->left : node->right; - } - - return NULL; -} - - -static void -ngx_ssl_cache_expire(ngx_ssl_cache_t *cache, ngx_uint_t n, - ngx_log_t *log) -{ - time_t now; - ngx_queue_t *q; - ngx_ssl_cache_node_t *cn; - - now = ngx_time(); - - while (n < 3) { - - if (ngx_queue_empty(&cache->expire_queue)) { - return; - } - - q = ngx_queue_last(&cache->expire_queue); - - cn = ngx_queue_data(q, ngx_ssl_cache_node_t, queue); - - if (n++ != 0 && now - cn->accessed <= cache->inactive) { - return; - } - - ngx_ssl_cache_node_free(&cache->rbtree, cn); - - cache->current--; - } -} - - -static void * -ngx_ssl_cache_cert_create(ngx_ssl_cache_key_t *id, char **err, void *data) -{ - BIO *bio; - X509 *x509; - u_long n; - STACK_OF(X509) *chain; - - chain = sk_X509_new_null(); - if (chain == NULL) { - *err = "sk_X509_new_null() failed"; - return NULL; - } - - bio = ngx_ssl_cache_create_bio(id, err); - if (bio == NULL) { - sk_X509_pop_free(chain, X509_free); - return NULL; - } - - /* certificate itself */ - - x509 = PEM_read_bio_X509_AUX(bio, NULL, NULL, NULL); - if (x509 == NULL) { - *err = "PEM_read_bio_X509_AUX() failed"; - BIO_free(bio); - sk_X509_pop_free(chain, X509_free); - return NULL; - } - - if (sk_X509_push(chain, x509) == 0) { - *err = "sk_X509_push() failed"; - BIO_free(bio); - X509_free(x509); - sk_X509_pop_free(chain, X509_free); - return NULL; - } - - /* rest of the chain */ - - for ( ;; ) { - - x509 = PEM_read_bio_X509(bio, NULL, NULL, NULL); - if (x509 == NULL) { - n = ERR_peek_last_error(); - - if (ERR_GET_LIB(n) == ERR_LIB_PEM - && ERR_GET_REASON(n) == PEM_R_NO_START_LINE) - { - /* end of file */ - ERR_clear_error(); - break; - } - - /* some real error */ - - *err = "PEM_read_bio_X509() failed"; - BIO_free(bio); - sk_X509_pop_free(chain, X509_free); - return NULL; - } - - if (sk_X509_push(chain, x509) == 0) { - *err = "sk_X509_push() failed"; - BIO_free(bio); - X509_free(x509); - sk_X509_pop_free(chain, X509_free); - return NULL; - } - } - - BIO_free(bio); - - return chain; -} - - -static void -ngx_ssl_cache_cert_free(void *data) -{ - sk_X509_pop_free(data, X509_free); -} - - -static void * -ngx_ssl_cache_cert_ref(char **err, void *data) -{ - int n, i; - X509 *x509; - STACK_OF(X509) *chain; - - chain = sk_X509_dup(data); - if (chain == NULL) { - *err = "sk_X509_dup() failed"; - return NULL; - } - - n = sk_X509_num(chain); - - for (i = 0; i < n; i++) { - x509 = sk_X509_value(chain, i); - -#if (OPENSSL_VERSION_NUMBER >= 0x10100000L) - X509_up_ref(x509); -#else - CRYPTO_add(&x509->references, 1, CRYPTO_LOCK_X509); -#endif - } - - return chain; -} - - -static void * -ngx_ssl_cache_pkey_create(ngx_ssl_cache_key_t *id, char **err, void *data) -{ - ngx_array_t **passwords = data; - - BIO *bio; - EVP_PKEY *pkey; - ngx_uint_t tries; - pem_password_cb *cb; - ngx_ssl_cache_pwd_t cb_data, *pwd; - - if (id->type == NGX_SSL_CACHE_ENGINE) { - -#ifndef OPENSSL_NO_ENGINE - - u_char *p, *last; - ENGINE *engine; - - p = id->data + sizeof("engine:") - 1; - last = (u_char *) ngx_strchr(p, ':'); - - if (last == NULL) { - *err = "invalid syntax"; - return NULL; - } - - *last = '\0'; - - engine = ENGINE_by_id((char *) p); - - *last++ = ':'; - - if (engine == NULL) { - *err = "ENGINE_by_id() failed"; - return NULL; - } - - pkey = ENGINE_load_private_key(engine, (char *) last, NULL, NULL); - - if (pkey == NULL) { - *err = "ENGINE_load_private_key() failed"; - ENGINE_free(engine); - return NULL; - } - - ENGINE_free(engine); - - return pkey; - -#else - - *err = "loading \"engine:...\" certificate keys is not supported"; - return NULL; - -#endif - } - - cb_data.encrypted = 0; - - if (*passwords) { - cb_data.pwd = (*passwords)->elts; - tries = (*passwords)->nelts; - pwd = &cb_data; - cb = ngx_ssl_cache_pkey_password_callback; - - } else { - cb_data.pwd = NULL; - tries = 1; - pwd = NULL; - cb = NULL; - } - - if (id->type == NGX_SSL_CACHE_STORE) { - -#ifdef ERR_R_OSSL_STORE_LIB - - u_char *uri; - UI_METHOD *method; - OSSL_STORE_CTX *store; - OSSL_STORE_INFO *info; - - method = (cb != NULL) ? UI_UTIL_wrap_read_pem_callback(cb, 0) : NULL; - uri = id->data + sizeof("store:") - 1; - - store = OSSL_STORE_open((char *) uri, method, pwd, NULL, NULL); - - if (store == NULL) { - *err = "OSSL_STORE_open() failed"; - - if (method != NULL) { - UI_destroy_method(method); - } - - return NULL; - } - - pkey = NULL; - - while (pkey == NULL && !OSSL_STORE_eof(store)) { - info = OSSL_STORE_load(store); - - if (info == NULL) { - continue; - } - - if (OSSL_STORE_INFO_get_type(info) == OSSL_STORE_INFO_PKEY) { - pkey = OSSL_STORE_INFO_get1_PKEY(info); - } - - OSSL_STORE_INFO_free(info); - } - - OSSL_STORE_close(store); - - if (method != NULL) { - UI_destroy_method(method); - } - - if (pkey == NULL) { - *err = "OSSL_STORE_load() failed"; - return NULL; - } - - if (cb_data.encrypted) { - *passwords = NGX_SSL_CACHE_DISABLED; - } - - return pkey; - -#else - - *err = "loading \"store:...\" certificate keys is not supported"; - return NULL; - -#endif - } - - bio = ngx_ssl_cache_create_bio(id, err); - if (bio == NULL) { - return NULL; - } - - for ( ;; ) { - - pkey = PEM_read_bio_PrivateKey(bio, NULL, cb, pwd); - if (pkey != NULL) { - break; - } - - if (tries-- > 1) { - ERR_clear_error(); - (void) BIO_reset(bio); - cb_data.pwd++; - continue; - } - - *err = "PEM_read_bio_PrivateKey() failed"; - BIO_free(bio); - return NULL; - } - - if (cb_data.encrypted) { - *passwords = NGX_SSL_CACHE_DISABLED; - } - - BIO_free(bio); - - return pkey; -} - - -static int -ngx_ssl_cache_pkey_password_callback(char *buf, int size, int rwflag, - void *userdata) -{ - ngx_ssl_cache_pwd_t *data = userdata; - - ngx_str_t *pwd; - - if (rwflag) { - ngx_log_error(NGX_LOG_ALERT, ngx_cycle->log, 0, - "ngx_ssl_cache_pkey_password_callback() is called " - "for encryption"); - return 0; - } - - data->encrypted = 1; - - pwd = data->pwd; - - if (pwd == NULL) { - return 0; - } - - if (pwd->len > (size_t) size) { - ngx_log_error(NGX_LOG_ERR, ngx_cycle->log, 0, - "password is truncated to %d bytes", size); - } else { - size = pwd->len; - } - - ngx_memcpy(buf, pwd->data, size); - - return size; -} - - -static void -ngx_ssl_cache_pkey_free(void *data) -{ - EVP_PKEY_free(data); -} - - -static void * -ngx_ssl_cache_pkey_ref(char **err, void *data) -{ - EVP_PKEY *pkey = data; - -#if (OPENSSL_VERSION_NUMBER >= 0x10100000L) - EVP_PKEY_up_ref(pkey); -#else - CRYPTO_add(&pkey->references, 1, CRYPTO_LOCK_EVP_PKEY); -#endif - - return data; -} - - -static void * -ngx_ssl_cache_crl_create(ngx_ssl_cache_key_t *id, char **err, void *data) -{ - BIO *bio; - u_long n; - X509_CRL *x509; - STACK_OF(X509_CRL) *chain; - - chain = sk_X509_CRL_new_null(); - if (chain == NULL) { - *err = "sk_X509_CRL_new_null() failed"; - return NULL; - } - - bio = ngx_ssl_cache_create_bio(id, err); - if (bio == NULL) { - sk_X509_CRL_pop_free(chain, X509_CRL_free); - return NULL; - } - - for ( ;; ) { - - x509 = PEM_read_bio_X509_CRL(bio, NULL, NULL, NULL); - if (x509 == NULL) { - n = ERR_peek_last_error(); - - if (ERR_GET_LIB(n) == ERR_LIB_PEM - && ERR_GET_REASON(n) == PEM_R_NO_START_LINE - && sk_X509_CRL_num(chain) > 0) - { - /* end of file */ - ERR_clear_error(); - break; - } - - /* some real error */ - - *err = "PEM_read_bio_X509_CRL() failed"; - BIO_free(bio); - sk_X509_CRL_pop_free(chain, X509_CRL_free); - return NULL; - } - - if (sk_X509_CRL_push(chain, x509) == 0) { - *err = "sk_X509_CRL_push() failed"; - BIO_free(bio); - X509_CRL_free(x509); - sk_X509_CRL_pop_free(chain, X509_CRL_free); - return NULL; - } - } - - BIO_free(bio); - - return chain; -} - - -static void -ngx_ssl_cache_crl_free(void *data) -{ - sk_X509_CRL_pop_free(data, X509_CRL_free); -} - - -static void * -ngx_ssl_cache_crl_ref(char **err, void *data) -{ - int n, i; - X509_CRL *x509; - STACK_OF(X509_CRL) *chain; - - chain = sk_X509_CRL_dup(data); - if (chain == NULL) { - *err = "sk_X509_CRL_dup() failed"; - return NULL; - } - - n = sk_X509_CRL_num(chain); - - for (i = 0; i < n; i++) { - x509 = sk_X509_CRL_value(chain, i); - -#if (OPENSSL_VERSION_NUMBER >= 0x10100000L) - X509_CRL_up_ref(x509); -#else - CRYPTO_add(&x509->references, 1, CRYPTO_LOCK_X509_CRL); -#endif - } - - return chain; -} - - -static void * -ngx_ssl_cache_ca_create(ngx_ssl_cache_key_t *id, char **err, void *data) -{ - BIO *bio; - X509 *x509; - u_long n; - STACK_OF(X509) *chain; - - chain = sk_X509_new_null(); - if (chain == NULL) { - *err = "sk_X509_new_null() failed"; - return NULL; - } - - bio = ngx_ssl_cache_create_bio(id, err); - if (bio == NULL) { - sk_X509_pop_free(chain, X509_free); - return NULL; - } - - for ( ;; ) { - - x509 = PEM_read_bio_X509_AUX(bio, NULL, NULL, NULL); - if (x509 == NULL) { - n = ERR_peek_last_error(); - - if (ERR_GET_LIB(n) == ERR_LIB_PEM - && ERR_GET_REASON(n) == PEM_R_NO_START_LINE - && sk_X509_num(chain) > 0) - { - /* end of file */ - ERR_clear_error(); - break; - } - - /* some real error */ - - *err = "PEM_read_bio_X509_AUX() failed"; - BIO_free(bio); - sk_X509_pop_free(chain, X509_free); - return NULL; - } - - if (sk_X509_push(chain, x509) == 0) { - *err = "sk_X509_push() failed"; - BIO_free(bio); - X509_free(x509); - sk_X509_pop_free(chain, X509_free); - return NULL; - } - } - - BIO_free(bio); - - return chain; -} - - -static BIO * -ngx_ssl_cache_create_bio(ngx_ssl_cache_key_t *id, char **err) -{ - BIO *bio; - - if (id->type == NGX_SSL_CACHE_DATA) { - - bio = BIO_new_mem_buf(id->data + sizeof("data:") - 1, - id->len - (sizeof("data:") - 1)); - if (bio == NULL) { - *err = "BIO_new_mem_buf() failed"; - } - - return bio; - } - - bio = BIO_new_file((char *) id->data, "r"); - if (bio == NULL) { - *err = "BIO_new_file() failed"; - } - - return bio; -} - - -static void * -ngx_openssl_cache_create_conf(ngx_cycle_t *cycle) -{ - ngx_ssl_cache_t *cache; - - cache = ngx_ssl_cache_init(cycle->pool, 0, 0, 0); - if (cache == NULL) { - return NULL; - } - - cache->inheritable = NGX_CONF_UNSET; - - return cache; -} - - -static char * -ngx_openssl_cache_init_conf(ngx_cycle_t *cycle, void *conf) -{ - ngx_ssl_cache_t *cache = conf; - - ngx_conf_init_value(cache->inheritable, 1); - - return NGX_CONF_OK; -} - - -ngx_ssl_cache_t * -ngx_ssl_cache_init(ngx_pool_t *pool, ngx_uint_t max, time_t valid, - time_t inactive) -{ - ngx_ssl_cache_t *cache; - ngx_pool_cleanup_t *cln; - - cache = ngx_pcalloc(pool, sizeof(ngx_ssl_cache_t)); - if (cache == NULL) { - return NULL; - } - - ngx_rbtree_init(&cache->rbtree, &cache->sentinel, - ngx_ssl_cache_node_insert); - - ngx_queue_init(&cache->expire_queue); - - cache->max = max; - cache->valid = valid; - cache->inactive = inactive; - - cln = ngx_pool_cleanup_add(pool, 0); - if (cln == NULL) { - return NULL; - } - - cln->handler = ngx_ssl_cache_cleanup; - cln->data = cache; - - return cache; -} - - -static void -ngx_ssl_cache_cleanup(void *data) -{ - ngx_ssl_cache_t *cache = data; - - ngx_rbtree_t *tree; - ngx_rbtree_node_t *node; - ngx_ssl_cache_node_t *cn; - - tree = &cache->rbtree; - - if (tree->root == tree->sentinel) { - return; - } - - node = ngx_rbtree_min(tree->root, tree->sentinel); - - while (node != NULL) { - cn = ngx_rbtree_data(node, ngx_ssl_cache_node_t, node); - node = ngx_rbtree_next(tree, node); - - ngx_ssl_cache_node_free(tree, cn); - - if (cache->max) { - cache->current--; - } - } - - if (cache->current) { - ngx_log_error(NGX_LOG_ALERT, ngx_cycle->log, 0, - "%ui items still left in ssl cache", - cache->current); - } - - if (!ngx_queue_empty(&cache->expire_queue)) { - ngx_log_error(NGX_LOG_ALERT, ngx_cycle->log, 0, - "queue still is not empty in ssl cache"); - - } -} - - -static void -ngx_ssl_cache_node_free(ngx_rbtree_t *rbtree, ngx_ssl_cache_node_t *cn) -{ - cn->type->free(cn->value); - - ngx_rbtree_delete(rbtree, &cn->node); - - if (!ngx_queue_empty(&cn->queue)) { - ngx_queue_remove(&cn->queue); - - ngx_log_debug1(NGX_LOG_DEBUG_CORE, ngx_cycle->log, 0, - "delete cached ssl object: %s", cn->id.data); - - ngx_free(cn); - } -} - - -static void -ngx_ssl_cache_node_insert(ngx_rbtree_node_t *temp, - ngx_rbtree_node_t *node, ngx_rbtree_node_t *sentinel) -{ - ngx_rbtree_node_t **p; - ngx_ssl_cache_node_t *n, *t; - - for ( ;; ) { - - n = ngx_rbtree_data(node, ngx_ssl_cache_node_t, node); - t = ngx_rbtree_data(temp, ngx_ssl_cache_node_t, node); - - if (node->key != temp->key) { - - p = (node->key < temp->key) ? &temp->left : &temp->right; - - } else if (n->type != t->type) { - - p = (n->type < t->type) ? &temp->left : &temp->right; - - } else { - - p = (ngx_memn2cmp(n->id.data, t->id.data, n->id.len, t->id.len) - < 0) ? &temp->left : &temp->right; - } - - if (*p == sentinel) { - break; - } - - temp = *p; - } - - *p = node; - node->parent = temp; - node->left = sentinel; - node->right = sentinel; - ngx_rbt_red(node); -} - - -static ngx_int_t -ngx_openssl_cache_init_worker(ngx_cycle_t *cycle) -{ -#ifdef ERR_R_OSSL_STORE_LIB - - if (ngx_process != NGX_PROCESS_WORKER) { - return NGX_OK; - } - - UI_set_default_method(UI_null()); - -#endif - - return NGX_OK; -} diff --git a/src/deps/src/nginx-1.30.3/src/event/ngx_event_openssl_stapling.c b/src/deps/src/nginx-1.30.3/src/event/ngx_event_openssl_stapling.c deleted file mode 100644 index 86d8b2c557..0000000000 --- a/src/deps/src/nginx-1.30.3/src/event/ngx_event_openssl_stapling.c +++ /dev/null @@ -1,2830 +0,0 @@ - -/* - * Copyright (C) Maxim Dounin - * Copyright (C) Nginx, Inc. - */ - - -#include -#include -#include -#include - - -#if (!defined OPENSSL_NO_OCSP && defined SSL_CTRL_SET_TLSEXT_STATUS_REQ_CB) - - -typedef struct { - ngx_rbtree_node_t node; - - ngx_str_t staple; - ngx_msec_t timeout; - - ngx_resolver_t *resolver; - ngx_msec_t resolver_timeout; - - ngx_addr_t *addrs; - ngx_uint_t naddrs; - ngx_str_t host; - ngx_str_t uri; - in_port_t port; - - SSL_CTX *ssl_ctx; - - X509 *cert; - X509 *issuer; - STACK_OF(X509) *chain; - - u_char *name; - - time_t valid; - time_t refresh; - - unsigned verify:1; - unsigned loading:1; -} ngx_ssl_stapling_t; - - -typedef struct { - ngx_addr_t *addrs; - ngx_uint_t naddrs; - - ngx_str_t host; - ngx_str_t uri; - in_port_t port; - ngx_uint_t depth; - - ngx_shm_zone_t *shm_zone; - - ngx_resolver_t *resolver; - ngx_msec_t resolver_timeout; -} ngx_ssl_ocsp_conf_t; - - -typedef struct { - ngx_rbtree_t rbtree; - ngx_rbtree_node_t sentinel; - ngx_queue_t expire_queue; -} ngx_ssl_ocsp_cache_t; - - -typedef struct { - ngx_str_node_t node; - ngx_queue_t queue; - int status; - time_t valid; -} ngx_ssl_ocsp_cache_node_t; - - -typedef struct ngx_ssl_ocsp_ctx_s ngx_ssl_ocsp_ctx_t; - - -struct ngx_ssl_ocsp_s { - STACK_OF(X509) *certs; - ngx_uint_t ncert; - - int cert_status; - ngx_int_t status; - - ngx_ssl_ocsp_conf_t *conf; - ngx_ssl_ocsp_ctx_t *ctx; -}; - - -struct ngx_ssl_ocsp_ctx_s { - SSL_CTX *ssl_ctx; - - X509 *cert; - X509 *issuer; - STACK_OF(X509) *chain; - - int status; - time_t valid; - - u_char *name; - - ngx_uint_t naddrs; - ngx_uint_t naddr; - - ngx_addr_t *addrs; - ngx_str_t host; - ngx_str_t uri; - in_port_t port; - - ngx_resolver_t *resolver; - ngx_msec_t resolver_timeout; - ngx_resolver_ctx_t *resolve; - - ngx_msec_t timeout; - - void (*handler)(ngx_ssl_ocsp_ctx_t *ctx); - void *data; - - ngx_str_t key; - ngx_buf_t *request; - ngx_buf_t *response; - ngx_peer_connection_t peer; - - ngx_shm_zone_t *shm_zone; - - ngx_int_t (*process)(ngx_ssl_ocsp_ctx_t *ctx); - - ngx_uint_t state; - - ngx_uint_t code; - ngx_uint_t count; - ngx_uint_t flags; - ngx_uint_t done; - - u_char *header_name_start; - u_char *header_name_end; - u_char *header_start; - u_char *header_end; - - ngx_pool_t *pool; - ngx_log_t *log; -}; - - -static ngx_int_t ngx_ssl_stapling_certificate(ngx_conf_t *cf, ngx_ssl_t *ssl, - X509 *cert, ngx_str_t *file, ngx_str_t *responder, ngx_uint_t verify); -static ngx_int_t ngx_ssl_stapling_file(ngx_conf_t *cf, ngx_ssl_t *ssl, - ngx_ssl_stapling_t *staple, ngx_str_t *file); -static ngx_int_t ngx_ssl_stapling_issuer(ngx_conf_t *cf, ngx_ssl_t *ssl, - ngx_ssl_stapling_t *staple); -static ngx_int_t ngx_ssl_stapling_responder(ngx_conf_t *cf, ngx_ssl_t *ssl, - ngx_ssl_stapling_t *staple, ngx_str_t *responder); - -static int ngx_ssl_certificate_status_callback(ngx_ssl_conn_t *ssl_conn, - void *data); -static ngx_ssl_stapling_t *ngx_ssl_stapling_lookup(ngx_ssl_t *ssl, X509 *cert); -static void ngx_ssl_stapling_update(ngx_ssl_stapling_t *staple); -static void ngx_ssl_stapling_ocsp_handler(ngx_ssl_ocsp_ctx_t *ctx); - -static time_t ngx_ssl_stapling_time(ASN1_GENERALIZEDTIME *asn1time); - -static void ngx_ssl_stapling_cleanup(void *data); - -static void ngx_ssl_ocsp_validate_next(ngx_connection_t *c); -static void ngx_ssl_ocsp_handler(ngx_ssl_ocsp_ctx_t *ctx); -static ngx_int_t ngx_ssl_ocsp_responder(ngx_connection_t *c, - ngx_ssl_ocsp_ctx_t *ctx); - -static ngx_ssl_ocsp_ctx_t *ngx_ssl_ocsp_start(ngx_log_t *log); -static void ngx_ssl_ocsp_done(ngx_ssl_ocsp_ctx_t *ctx); -static void ngx_ssl_ocsp_next(ngx_ssl_ocsp_ctx_t *ctx); -static void ngx_ssl_ocsp_request(ngx_ssl_ocsp_ctx_t *ctx); -static void ngx_ssl_ocsp_resolve_handler(ngx_resolver_ctx_t *resolve); -static void ngx_ssl_ocsp_connect(ngx_ssl_ocsp_ctx_t *ctx); -static void ngx_ssl_ocsp_write_handler(ngx_event_t *wev); -static void ngx_ssl_ocsp_read_handler(ngx_event_t *rev); -static void ngx_ssl_ocsp_dummy_handler(ngx_event_t *ev); - -static ngx_int_t ngx_ssl_ocsp_create_request(ngx_ssl_ocsp_ctx_t *ctx); -static ngx_int_t ngx_ssl_ocsp_process_status_line(ngx_ssl_ocsp_ctx_t *ctx); -static ngx_int_t ngx_ssl_ocsp_parse_status_line(ngx_ssl_ocsp_ctx_t *ctx); -static ngx_int_t ngx_ssl_ocsp_process_headers(ngx_ssl_ocsp_ctx_t *ctx); -static ngx_int_t ngx_ssl_ocsp_parse_header_line(ngx_ssl_ocsp_ctx_t *ctx); -static ngx_int_t ngx_ssl_ocsp_process_body(ngx_ssl_ocsp_ctx_t *ctx); -static ngx_int_t ngx_ssl_ocsp_verify(ngx_ssl_ocsp_ctx_t *ctx); - -static ngx_int_t ngx_ssl_ocsp_cache_lookup(ngx_ssl_ocsp_ctx_t *ctx); -static ngx_int_t ngx_ssl_ocsp_cache_store(ngx_ssl_ocsp_ctx_t *ctx); -static ngx_int_t ngx_ssl_ocsp_create_key(ngx_ssl_ocsp_ctx_t *ctx); - -static u_char *ngx_ssl_ocsp_log_error(ngx_log_t *log, u_char *buf, size_t len); - - -ngx_int_t -ngx_ssl_stapling(ngx_conf_t *cf, ngx_ssl_t *ssl, ngx_str_t *file, - ngx_str_t *responder, ngx_uint_t verify) -{ - X509 *cert; - ngx_uint_t k; - - for (k = 0; k < ssl->certs.nelts; k++) { - cert = ((X509 **) ssl->certs.elts)[k]; - - if (ngx_ssl_stapling_certificate(cf, ssl, cert, file, responder, verify) - != NGX_OK) - { - return NGX_ERROR; - } - } - - SSL_CTX_set_tlsext_status_cb(ssl->ctx, ngx_ssl_certificate_status_callback); - - return NGX_OK; -} - - -static ngx_int_t -ngx_ssl_stapling_certificate(ngx_conf_t *cf, ngx_ssl_t *ssl, X509 *cert, - ngx_str_t *file, ngx_str_t *responder, ngx_uint_t verify) -{ - ngx_int_t rc; - ngx_pool_cleanup_t *cln; - ngx_ssl_stapling_t *staple; - - staple = ngx_pcalloc(cf->pool, sizeof(ngx_ssl_stapling_t)); - if (staple == NULL) { - return NGX_ERROR; - } - - cln = ngx_pool_cleanup_add(cf->pool, 0); - if (cln == NULL) { - return NGX_ERROR; - } - - cln->handler = ngx_ssl_stapling_cleanup; - cln->data = staple; - - staple->node.key = (ngx_rbtree_key_t) cert; - - ngx_rbtree_insert(&ssl->staple_rbtree, &staple->node); - -#ifdef SSL_CTRL_SELECT_CURRENT_CERT - /* OpenSSL 1.0.2+ */ - SSL_CTX_select_current_cert(ssl->ctx, cert); -#endif - -#ifdef SSL_CTRL_GET_EXTRA_CHAIN_CERTS - /* OpenSSL 1.0.1+ */ - SSL_CTX_get_extra_chain_certs(ssl->ctx, &staple->chain); -#else - staple->chain = ssl->ctx->extra_certs; -#endif - - staple->ssl_ctx = ssl->ctx; - staple->timeout = 60000; - staple->verify = verify; - staple->cert = cert; - staple->name = X509_get_ex_data(staple->cert, - ngx_ssl_certificate_name_index); - - if (file->len) { - /* use OCSP response from the file */ - - if (ngx_ssl_stapling_file(cf, ssl, staple, file) != NGX_OK) { - return NGX_ERROR; - } - - return NGX_OK; - } - - rc = ngx_ssl_stapling_issuer(cf, ssl, staple); - - if (rc == NGX_DECLINED) { - return NGX_OK; - } - - if (rc != NGX_OK) { - return NGX_ERROR; - } - - rc = ngx_ssl_stapling_responder(cf, ssl, staple, responder); - - if (rc == NGX_DECLINED) { - return NGX_OK; - } - - if (rc != NGX_OK) { - return NGX_ERROR; - } - - return NGX_OK; -} - - -static ngx_int_t -ngx_ssl_stapling_file(ngx_conf_t *cf, ngx_ssl_t *ssl, - ngx_ssl_stapling_t *staple, ngx_str_t *file) -{ - BIO *bio; - int len; - u_char *p, *buf; - OCSP_RESPONSE *response; - - if (ngx_conf_full_name(cf->cycle, file, 1) != NGX_OK) { - return NGX_ERROR; - } - - bio = BIO_new_file((char *) file->data, "rb"); - if (bio == NULL) { - ngx_ssl_error(NGX_LOG_EMERG, ssl->log, 0, - "BIO_new_file(\"%s\") failed", file->data); - return NGX_ERROR; - } - - response = d2i_OCSP_RESPONSE_bio(bio, NULL); - if (response == NULL) { - ngx_ssl_error(NGX_LOG_EMERG, ssl->log, 0, - "d2i_OCSP_RESPONSE_bio(\"%s\") failed", file->data); - BIO_free(bio); - return NGX_ERROR; - } - - len = i2d_OCSP_RESPONSE(response, NULL); - if (len <= 0) { - ngx_ssl_error(NGX_LOG_EMERG, ssl->log, 0, - "i2d_OCSP_RESPONSE(\"%s\") failed", file->data); - goto failed; - } - - buf = ngx_alloc(len, ssl->log); - if (buf == NULL) { - goto failed; - } - - p = buf; - len = i2d_OCSP_RESPONSE(response, &p); - if (len <= 0) { - ngx_ssl_error(NGX_LOG_EMERG, ssl->log, 0, - "i2d_OCSP_RESPONSE(\"%s\") failed", file->data); - ngx_free(buf); - goto failed; - } - - OCSP_RESPONSE_free(response); - BIO_free(bio); - - staple->staple.data = buf; - staple->staple.len = len; - staple->valid = NGX_MAX_TIME_T_VALUE; - - return NGX_OK; - -failed: - - OCSP_RESPONSE_free(response); - BIO_free(bio); - - return NGX_ERROR; -} - - -static ngx_int_t -ngx_ssl_stapling_issuer(ngx_conf_t *cf, ngx_ssl_t *ssl, - ngx_ssl_stapling_t *staple) -{ - int i, n, rc; - X509 *cert, *issuer; - X509_STORE *store; - X509_STORE_CTX *store_ctx; - - cert = staple->cert; - - n = sk_X509_num(staple->chain); - - ngx_log_debug1(NGX_LOG_DEBUG_EVENT, ssl->log, 0, - "SSL get issuer: %d extra certs", n); - - for (i = 0; i < n; i++) { - issuer = sk_X509_value(staple->chain, i); - if (X509_check_issued(issuer, cert) == X509_V_OK) { -#if OPENSSL_VERSION_NUMBER >= 0x10100001L - X509_up_ref(issuer); -#else - CRYPTO_add(&issuer->references, 1, CRYPTO_LOCK_X509); -#endif - - ngx_log_debug1(NGX_LOG_DEBUG_EVENT, ssl->log, 0, - "SSL get issuer: found %p in extra certs", issuer); - - staple->issuer = issuer; - - return NGX_OK; - } - } - - store = SSL_CTX_get_cert_store(ssl->ctx); - if (store == NULL) { - ngx_ssl_error(NGX_LOG_EMERG, ssl->log, 0, - "SSL_CTX_get_cert_store() failed"); - return NGX_ERROR; - } - - store_ctx = X509_STORE_CTX_new(); - if (store_ctx == NULL) { - ngx_ssl_error(NGX_LOG_EMERG, ssl->log, 0, - "X509_STORE_CTX_new() failed"); - return NGX_ERROR; - } - - if (X509_STORE_CTX_init(store_ctx, store, NULL, NULL) == 0) { - ngx_ssl_error(NGX_LOG_EMERG, ssl->log, 0, - "X509_STORE_CTX_init() failed"); - X509_STORE_CTX_free(store_ctx); - return NGX_ERROR; - } - - rc = X509_STORE_CTX_get1_issuer(&issuer, store_ctx, cert); - - if (rc == -1) { - ngx_ssl_error(NGX_LOG_EMERG, ssl->log, 0, - "X509_STORE_CTX_get1_issuer() failed"); - X509_STORE_CTX_free(store_ctx); - return NGX_ERROR; - } - - if (rc == 0) { - ngx_log_error(NGX_LOG_WARN, ssl->log, 0, - "\"ssl_stapling\" ignored, " - "issuer certificate not found for certificate \"%s\"", - staple->name); - X509_STORE_CTX_free(store_ctx); - return NGX_DECLINED; - } - - X509_STORE_CTX_free(store_ctx); - - ngx_log_debug1(NGX_LOG_DEBUG_EVENT, ssl->log, 0, - "SSL get issuer: found %p in cert store", issuer); - - staple->issuer = issuer; - - return NGX_OK; -} - - -static ngx_int_t -ngx_ssl_stapling_responder(ngx_conf_t *cf, ngx_ssl_t *ssl, - ngx_ssl_stapling_t *staple, ngx_str_t *responder) -{ - char *s; - ngx_str_t rsp; - ngx_url_t u; - STACK_OF(OPENSSL_STRING) *aia; - - if (responder->len == 0) { - - /* extract OCSP responder URL from certificate */ - - aia = X509_get1_ocsp(staple->cert); - if (aia == NULL) { - ngx_log_error(NGX_LOG_WARN, ssl->log, 0, - "\"ssl_stapling\" ignored, " - "no OCSP responder URL in the certificate \"%s\"", - staple->name); - return NGX_DECLINED; - } - -#if OPENSSL_VERSION_NUMBER >= 0x10000000L - s = sk_OPENSSL_STRING_value(aia, 0); -#else - s = sk_value(aia, 0); -#endif - if (s == NULL) { - ngx_log_error(NGX_LOG_WARN, ssl->log, 0, - "\"ssl_stapling\" ignored, " - "no OCSP responder URL in the certificate \"%s\"", - staple->name); - X509_email_free(aia); - return NGX_DECLINED; - } - - responder = &rsp; - - responder->len = ngx_strlen(s); - responder->data = ngx_palloc(cf->pool, responder->len); - if (responder->data == NULL) { - X509_email_free(aia); - return NGX_ERROR; - } - - ngx_memcpy(responder->data, s, responder->len); - X509_email_free(aia); - } - - ngx_memzero(&u, sizeof(ngx_url_t)); - - u.url = *responder; - u.default_port = 80; - u.uri_part = 1; - - if (u.url.len > 7 - && ngx_strncasecmp(u.url.data, (u_char *) "http://", 7) == 0) - { - u.url.len -= 7; - u.url.data += 7; - - } else { - ngx_log_error(NGX_LOG_WARN, ssl->log, 0, - "\"ssl_stapling\" ignored, " - "invalid URL prefix in OCSP responder \"%V\" " - "in the certificate \"%s\"", - &u.url, staple->name); - return NGX_DECLINED; - } - - if (ngx_parse_url(cf->pool, &u) != NGX_OK) { - if (u.err) { - ngx_log_error(NGX_LOG_WARN, ssl->log, 0, - "\"ssl_stapling\" ignored, " - "%s in OCSP responder \"%V\" " - "in the certificate \"%s\"", - u.err, &u.url, staple->name); - return NGX_DECLINED; - } - - return NGX_ERROR; - } - - staple->addrs = u.addrs; - staple->naddrs = u.naddrs; - staple->host = u.host; - staple->uri = u.uri; - staple->port = u.port; - - if (staple->uri.len == 0) { - ngx_str_set(&staple->uri, "/"); - } - - return NGX_OK; -} - - -ngx_int_t -ngx_ssl_stapling_resolver(ngx_conf_t *cf, ngx_ssl_t *ssl, - ngx_resolver_t *resolver, ngx_msec_t resolver_timeout) -{ - ngx_rbtree_t *tree; - ngx_rbtree_node_t *node; - ngx_ssl_stapling_t *staple; - - tree = &ssl->staple_rbtree; - - if (tree->root == tree->sentinel) { - return NGX_OK; - } - - for (node = ngx_rbtree_min(tree->root, tree->sentinel); - node; - node = ngx_rbtree_next(tree, node)) - { - staple = ngx_rbtree_data(node, ngx_ssl_stapling_t, node); - staple->resolver = resolver; - staple->resolver_timeout = resolver_timeout; - } - - return NGX_OK; -} - - -static int -ngx_ssl_certificate_status_callback(ngx_ssl_conn_t *ssl_conn, void *data) -{ - int rc; - X509 *cert; - u_char *p; - SSL_CTX *ssl_ctx; - ngx_ssl_t *ssl; - ngx_connection_t *c; - ngx_ssl_stapling_t *staple; - - c = ngx_ssl_get_connection(ssl_conn); - - ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0, - "SSL certificate status callback"); - - rc = SSL_TLSEXT_ERR_NOACK; - - cert = SSL_get_certificate(ssl_conn); - - if (cert == NULL) { - return rc; - } - - ssl_ctx = SSL_get_SSL_CTX(ssl_conn); - ssl = SSL_CTX_get_ex_data(ssl_ctx, ngx_ssl_index); - - staple = ngx_ssl_stapling_lookup(ssl, cert); - - if (staple == NULL) { - return rc; - } - - if (staple->staple.len - && staple->valid >= ngx_time()) - { - /* we have to copy ocsp response as OpenSSL will free it by itself */ - - p = OPENSSL_malloc(staple->staple.len); - if (p == NULL) { - ngx_ssl_error(NGX_LOG_ALERT, c->log, 0, "OPENSSL_malloc() failed"); - return SSL_TLSEXT_ERR_NOACK; - } - - ngx_memcpy(p, staple->staple.data, staple->staple.len); - - SSL_set_tlsext_status_ocsp_resp(ssl_conn, p, staple->staple.len); - - rc = SSL_TLSEXT_ERR_OK; - } - - ngx_ssl_stapling_update(staple); - - return rc; -} - - -static ngx_ssl_stapling_t * -ngx_ssl_stapling_lookup(ngx_ssl_t *ssl, X509 *cert) -{ - ngx_rbtree_key_t key; - ngx_rbtree_node_t *node, *sentinel; - - node = ssl->staple_rbtree.root; - sentinel = ssl->staple_rbtree.sentinel; - key = (ngx_rbtree_key_t) cert; - - while (node != sentinel) { - - if (key != node->key) { - node = (key < node->key) ? node->left : node->right; - continue; - } - - return ngx_rbtree_data(node, ngx_ssl_stapling_t, node); - } - - return NULL; -} - - -static void -ngx_ssl_stapling_update(ngx_ssl_stapling_t *staple) -{ - ngx_ssl_ocsp_ctx_t *ctx; - - if (staple->host.len == 0 - || staple->loading || staple->refresh >= ngx_time()) - { - return; - } - - staple->loading = 1; - - ctx = ngx_ssl_ocsp_start(ngx_cycle->log); - if (ctx == NULL) { - return; - } - - ctx->ssl_ctx = staple->ssl_ctx; - ctx->cert = staple->cert; - ctx->issuer = staple->issuer; - ctx->chain = staple->chain; - ctx->name = staple->name; - ctx->flags = (staple->verify ? OCSP_TRUSTOTHER : OCSP_NOVERIFY); - - ctx->addrs = staple->addrs; - ctx->naddrs = staple->naddrs; - ctx->host = staple->host; - ctx->uri = staple->uri; - ctx->port = staple->port; - ctx->timeout = staple->timeout; - - ctx->resolver = staple->resolver; - ctx->resolver_timeout = staple->resolver_timeout; - - ctx->handler = ngx_ssl_stapling_ocsp_handler; - ctx->data = staple; - - ngx_ssl_ocsp_request(ctx); - - return; -} - - -static void -ngx_ssl_stapling_ocsp_handler(ngx_ssl_ocsp_ctx_t *ctx) -{ - time_t now; - ngx_str_t response; - ngx_ssl_stapling_t *staple; - - staple = ctx->data; - now = ngx_time(); - - if (ngx_ssl_ocsp_verify(ctx) != NGX_OK) { - goto error; - } - - if (ctx->status != V_OCSP_CERTSTATUS_GOOD) { - ngx_log_error(NGX_LOG_ERR, ctx->log, 0, - "certificate status \"%s\" in the OCSP response", - OCSP_cert_status_str(ctx->status)); - goto error; - } - - /* copy the response to memory not in ctx->pool */ - - response.len = ctx->response->last - ctx->response->pos; - response.data = ngx_alloc(response.len, ctx->log); - - if (response.data == NULL) { - goto error; - } - - ngx_memcpy(response.data, ctx->response->pos, response.len); - - if (staple->staple.data) { - ngx_free(staple->staple.data); - } - - staple->staple = response; - staple->valid = ctx->valid; - - /* - * refresh before the response expires, - * but not earlier than in 5 minutes, and at least in an hour - */ - - staple->loading = 0; - staple->refresh = ngx_max(ngx_min(ctx->valid - 300, now + 3600), now + 300); - - ngx_ssl_ocsp_done(ctx); - return; - -error: - - staple->loading = 0; - staple->refresh = now + 300; - - ngx_ssl_ocsp_done(ctx); -} - - -static time_t -ngx_ssl_stapling_time(ASN1_GENERALIZEDTIME *asn1time) -{ - BIO *bio; - char *value; - size_t len; - time_t time; - - /* - * OpenSSL doesn't provide a way to convert ASN1_GENERALIZEDTIME - * into time_t. To do this, we use ASN1_GENERALIZEDTIME_print(), - * which uses the "MMM DD HH:MM:SS YYYY [GMT]" format (e.g., - * "Feb 3 00:55:52 2015 GMT"), and parse the result. - */ - - bio = BIO_new(BIO_s_mem()); - if (bio == NULL) { - return NGX_ERROR; - } - - /* fake weekday prepended to match C asctime() format */ - - BIO_write(bio, "Tue ", sizeof("Tue ") - 1); - ASN1_GENERALIZEDTIME_print(bio, asn1time); - len = BIO_get_mem_data(bio, &value); - - time = ngx_parse_http_time((u_char *) value, len); - - BIO_free(bio); - - return time; -} - - -static void -ngx_ssl_stapling_cleanup(void *data) -{ - ngx_ssl_stapling_t *staple = data; - - if (staple->issuer) { - X509_free(staple->issuer); - } - - if (staple->staple.data) { - ngx_free(staple->staple.data); - } -} - - -ngx_int_t -ngx_ssl_ocsp(ngx_conf_t *cf, ngx_ssl_t *ssl, ngx_str_t *responder, - ngx_uint_t depth, ngx_shm_zone_t *shm_zone) -{ - ngx_url_t u; - ngx_ssl_ocsp_conf_t *ocf; - - ocf = ngx_pcalloc(cf->pool, sizeof(ngx_ssl_ocsp_conf_t)); - if (ocf == NULL) { - return NGX_ERROR; - } - - ocf->depth = depth; - ocf->shm_zone = shm_zone; - - if (responder->len) { - ngx_memzero(&u, sizeof(ngx_url_t)); - - u.url = *responder; - u.default_port = 80; - u.uri_part = 1; - - if (u.url.len > 7 - && ngx_strncasecmp(u.url.data, (u_char *) "http://", 7) == 0) - { - u.url.len -= 7; - u.url.data += 7; - - } else { - ngx_log_error(NGX_LOG_EMERG, cf->log, 0, - "invalid URL prefix in OCSP responder \"%V\" " - "in \"ssl_ocsp_responder\"", &u.url); - return NGX_ERROR; - } - - if (ngx_parse_url(cf->pool, &u) != NGX_OK) { - if (u.err) { - ngx_log_error(NGX_LOG_EMERG, cf->log, 0, - "%s in OCSP responder \"%V\" " - "in \"ssl_ocsp_responder\"", u.err, &u.url); - } - - return NGX_ERROR; - } - - ocf->addrs = u.addrs; - ocf->naddrs = u.naddrs; - ocf->host = u.host; - ocf->uri = u.uri; - ocf->port = u.port; - } - - if (SSL_CTX_set_ex_data(ssl->ctx, ngx_ssl_ocsp_index, ocf) == 0) { - ngx_ssl_error(NGX_LOG_EMERG, ssl->log, 0, - "SSL_CTX_set_ex_data() failed"); - return NGX_ERROR; - } - - return NGX_OK; -} - - -ngx_int_t -ngx_ssl_ocsp_resolver(ngx_conf_t *cf, ngx_ssl_t *ssl, - ngx_resolver_t *resolver, ngx_msec_t resolver_timeout) -{ - ngx_ssl_ocsp_conf_t *ocf; - - ocf = SSL_CTX_get_ex_data(ssl->ctx, ngx_ssl_ocsp_index); - ocf->resolver = resolver; - ocf->resolver_timeout = resolver_timeout; - - return NGX_OK; -} - - -ngx_int_t -ngx_ssl_ocsp_validate(ngx_connection_t *c) -{ - X509 *cert; - SSL_CTX *ssl_ctx; - ngx_int_t rc; - X509_STORE *store; - X509_STORE_CTX *store_ctx; - STACK_OF(X509) *chain; - ngx_ssl_ocsp_t *ocsp; - ngx_ssl_ocsp_conf_t *ocf; - - if (c->ssl->in_ocsp) { - if (ngx_handle_read_event(c->read, 0) != NGX_OK) { - return NGX_ERROR; - } - - if (ngx_handle_write_event(c->write, 0) != NGX_OK) { - return NGX_ERROR; - } - - return NGX_AGAIN; - } - - ssl_ctx = SSL_get_SSL_CTX(c->ssl->connection); - - ocf = SSL_CTX_get_ex_data(ssl_ctx, ngx_ssl_ocsp_index); - if (ocf == NULL) { - return NGX_OK; - } - - if (SSL_get_verify_result(c->ssl->connection) != X509_V_OK) { - return NGX_OK; - } - - cert = SSL_get_peer_certificate(c->ssl->connection); - if (cert == NULL) { - return NGX_OK; - } - - ocsp = ngx_pcalloc(c->pool, sizeof(ngx_ssl_ocsp_t)); - if (ocsp == NULL) { - X509_free(cert); - return NGX_ERROR; - } - - c->ssl->ocsp = ocsp; - - ocsp->status = NGX_AGAIN; - ocsp->cert_status = V_OCSP_CERTSTATUS_GOOD; - ocsp->conf = ocf; - -#if OPENSSL_VERSION_NUMBER >= 0x10100000L - - ocsp->certs = SSL_get0_verified_chain(c->ssl->connection); - - if (ocsp->certs) { - ocsp->certs = X509_chain_up_ref(ocsp->certs); - if (ocsp->certs == NULL) { - X509_free(cert); - return NGX_ERROR; - } - } - -#endif - - if (ocsp->certs == NULL) { - store = SSL_CTX_get_cert_store(ssl_ctx); - if (store == NULL) { - ngx_ssl_error(NGX_LOG_ERR, c->log, 0, - "SSL_CTX_get_cert_store() failed"); - X509_free(cert); - return NGX_ERROR; - } - - store_ctx = X509_STORE_CTX_new(); - if (store_ctx == NULL) { - ngx_ssl_error(NGX_LOG_ERR, c->log, 0, - "X509_STORE_CTX_new() failed"); - X509_free(cert); - return NGX_ERROR; - } - - chain = SSL_get_peer_cert_chain(c->ssl->connection); - - if (X509_STORE_CTX_init(store_ctx, store, cert, chain) == 0) { - ngx_ssl_error(NGX_LOG_ERR, c->log, 0, - "X509_STORE_CTX_init() failed"); - X509_STORE_CTX_free(store_ctx); - X509_free(cert); - return NGX_ERROR; - } - - rc = X509_verify_cert(store_ctx); - if (rc <= 0) { - ngx_ssl_error(NGX_LOG_ERR, c->log, 0, "X509_verify_cert() failed"); - X509_STORE_CTX_free(store_ctx); - X509_free(cert); - return NGX_ERROR; - } - - ocsp->certs = X509_STORE_CTX_get1_chain(store_ctx); - if (ocsp->certs == NULL) { - ngx_ssl_error(NGX_LOG_ERR, c->log, 0, - "X509_STORE_CTX_get1_chain() failed"); - X509_STORE_CTX_free(store_ctx); - X509_free(cert); - return NGX_ERROR; - } - - X509_STORE_CTX_free(store_ctx); - } - - X509_free(cert); - - ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, - "ssl ocsp validate, certs:%d", sk_X509_num(ocsp->certs)); - - ngx_ssl_ocsp_validate_next(c); - - if (ocsp->status == NGX_AGAIN) { - c->ssl->in_ocsp = 1; - return NGX_AGAIN; - } - - return NGX_OK; -} - - -static void -ngx_ssl_ocsp_validate_next(ngx_connection_t *c) -{ - ngx_int_t rc; - ngx_uint_t n; - ngx_ssl_ocsp_t *ocsp; - ngx_ssl_ocsp_ctx_t *ctx; - ngx_ssl_ocsp_conf_t *ocf; - - ocsp = c->ssl->ocsp; - ocf = ocsp->conf; - - n = sk_X509_num(ocsp->certs); - - for ( ;; ) { - - if (ocsp->ncert == n - 1 || (ocf->depth == 2 && ocsp->ncert == 1)) { - ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, - "ssl ocsp validated, certs:%ui", ocsp->ncert); - rc = NGX_OK; - goto done; - } - - ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, - "ssl ocsp validate cert:%ui", ocsp->ncert); - - ctx = ngx_ssl_ocsp_start(c->log); - if (ctx == NULL) { - rc = NGX_ERROR; - goto done; - } - - ocsp->ctx = ctx; - - ctx->ssl_ctx = SSL_get_SSL_CTX(c->ssl->connection); - ctx->cert = sk_X509_value(ocsp->certs, ocsp->ncert); - ctx->issuer = sk_X509_value(ocsp->certs, ocsp->ncert + 1); - ctx->chain = ocsp->certs; - - ctx->resolver = ocf->resolver; - ctx->resolver_timeout = ocf->resolver_timeout; - - ctx->handler = ngx_ssl_ocsp_handler; - ctx->data = c; - - ctx->shm_zone = ocf->shm_zone; - - ctx->addrs = ocf->addrs; - ctx->naddrs = ocf->naddrs; - ctx->host = ocf->host; - ctx->uri = ocf->uri; - ctx->port = ocf->port; - - rc = ngx_ssl_ocsp_responder(c, ctx); - if (rc != NGX_OK) { - goto done; - } - - if (ctx->uri.len == 0) { - ngx_str_set(&ctx->uri, "/"); - } - - ocsp->ncert++; - - rc = ngx_ssl_ocsp_cache_lookup(ctx); - - if (rc == NGX_ERROR) { - goto done; - } - - if (rc == NGX_DECLINED) { - break; - } - - /* rc == NGX_OK */ - - if (ctx->status != V_OCSP_CERTSTATUS_GOOD) { - ngx_log_debug1(NGX_LOG_DEBUG_EVENT, ctx->log, 0, - "ssl ocsp cached status \"%s\"", - OCSP_cert_status_str(ctx->status)); - ocsp->cert_status = ctx->status; - goto done; - } - - ocsp->ctx = NULL; - ngx_ssl_ocsp_done(ctx); - } - - ngx_ssl_ocsp_request(ctx); - return; - -done: - - ocsp->status = rc; - - if (c->ssl->in_ocsp) { - c->ssl->handshaked = 1; - c->ssl->handler(c); - } -} - - -static void -ngx_ssl_ocsp_handler(ngx_ssl_ocsp_ctx_t *ctx) -{ - ngx_int_t rc; - ngx_ssl_ocsp_t *ocsp; - ngx_connection_t *c; - - c = ctx->data; - ocsp = c->ssl->ocsp; - ocsp->ctx = NULL; - - rc = ngx_ssl_ocsp_verify(ctx); - if (rc != NGX_OK) { - goto done; - } - - rc = ngx_ssl_ocsp_cache_store(ctx); - if (rc != NGX_OK) { - goto done; - } - - if (ctx->status != V_OCSP_CERTSTATUS_GOOD) { - ocsp->cert_status = ctx->status; - goto done; - } - - ngx_ssl_ocsp_done(ctx); - - ngx_ssl_ocsp_validate_next(c); - - return; - -done: - - ocsp->status = rc; - ngx_ssl_ocsp_done(ctx); - - if (c->ssl->in_ocsp) { - c->ssl->handshaked = 1; - c->ssl->handler(c); - } -} - - -static ngx_int_t -ngx_ssl_ocsp_responder(ngx_connection_t *c, ngx_ssl_ocsp_ctx_t *ctx) -{ - char *s; - ngx_str_t responder; - ngx_url_t u; - STACK_OF(OPENSSL_STRING) *aia; - - if (ctx->host.len) { - return NGX_OK; - } - - /* extract OCSP responder URL from certificate */ - - aia = X509_get1_ocsp(ctx->cert); - if (aia == NULL) { - ngx_log_error(NGX_LOG_ERR, c->log, 0, - "no OCSP responder URL in certificate"); - return NGX_ERROR; - } - -#if OPENSSL_VERSION_NUMBER >= 0x10000000L - s = sk_OPENSSL_STRING_value(aia, 0); -#else - s = sk_value(aia, 0); -#endif - if (s == NULL) { - ngx_log_error(NGX_LOG_ERR, c->log, 0, - "no OCSP responder URL in certificate"); - X509_email_free(aia); - return NGX_ERROR; - } - - responder.len = ngx_strlen(s); - responder.data = ngx_palloc(ctx->pool, responder.len); - if (responder.data == NULL) { - X509_email_free(aia); - return NGX_ERROR; - } - - ngx_memcpy(responder.data, s, responder.len); - X509_email_free(aia); - - ngx_memzero(&u, sizeof(ngx_url_t)); - - u.url = responder; - u.default_port = 80; - u.uri_part = 1; - u.no_resolve = 1; - - if (u.url.len > 7 - && ngx_strncasecmp(u.url.data, (u_char *) "http://", 7) == 0) - { - u.url.len -= 7; - u.url.data += 7; - - } else { - ngx_log_error(NGX_LOG_ERR, c->log, 0, - "invalid URL prefix in OCSP responder \"%V\" " - "in certificate", &u.url); - return NGX_ERROR; - } - - if (ngx_parse_url(ctx->pool, &u) != NGX_OK) { - if (u.err) { - ngx_log_error(NGX_LOG_ERR, c->log, 0, - "%s in OCSP responder \"%V\" in certificate", - u.err, &u.url); - } - - return NGX_ERROR; - } - - if (u.host.len == 0) { - ngx_log_error(NGX_LOG_ERR, c->log, 0, - "empty host in OCSP responder in certificate"); - return NGX_ERROR; - } - - ctx->addrs = u.addrs; - ctx->naddrs = u.naddrs; - ctx->host = u.host; - ctx->uri = u.uri; - ctx->port = u.port; - - return NGX_OK; -} - - -ngx_int_t -ngx_ssl_ocsp_get_status(ngx_connection_t *c, const char **s) -{ - ngx_ssl_ocsp_t *ocsp; - - ocsp = c->ssl->ocsp; - if (ocsp == NULL) { - return NGX_OK; - } - - if (ocsp->status == NGX_ERROR) { - *s = "certificate status request failed"; - return NGX_DECLINED; - } - - switch (ocsp->cert_status) { - - case V_OCSP_CERTSTATUS_GOOD: - return NGX_OK; - - case V_OCSP_CERTSTATUS_REVOKED: - *s = "certificate revoked"; - break; - - default: /* V_OCSP_CERTSTATUS_UNKNOWN */ - *s = "certificate status unknown"; - } - - return NGX_DECLINED; -} - - -void -ngx_ssl_ocsp_cleanup(ngx_connection_t *c) -{ - ngx_ssl_ocsp_t *ocsp; - - ocsp = c->ssl->ocsp; - if (ocsp == NULL) { - return; - } - - if (ocsp->ctx) { - ngx_ssl_ocsp_done(ocsp->ctx); - ocsp->ctx = NULL; - } - - if (ocsp->certs) { - sk_X509_pop_free(ocsp->certs, X509_free); - ocsp->certs = NULL; - } -} - - -static ngx_ssl_ocsp_ctx_t * -ngx_ssl_ocsp_start(ngx_log_t *log) -{ - ngx_pool_t *pool; - ngx_ssl_ocsp_ctx_t *ctx; - - pool = ngx_create_pool(2048, log); - if (pool == NULL) { - return NULL; - } - - ctx = ngx_pcalloc(pool, sizeof(ngx_ssl_ocsp_ctx_t)); - if (ctx == NULL) { - ngx_destroy_pool(pool); - return NULL; - } - - log = ngx_palloc(pool, sizeof(ngx_log_t)); - if (log == NULL) { - ngx_destroy_pool(pool); - return NULL; - } - - ctx->pool = pool; - - *log = *ctx->pool->log; - - ctx->pool->log = log; - ctx->log = log; - - log->handler = ngx_ssl_ocsp_log_error; - log->data = ctx; - log->action = "requesting certificate status"; - - return ctx; -} - - -static void -ngx_ssl_ocsp_done(ngx_ssl_ocsp_ctx_t *ctx) -{ - ngx_log_debug0(NGX_LOG_DEBUG_EVENT, ctx->log, 0, - "ssl ocsp done"); - - if (ctx->resolve) { - ngx_resolve_name_done(ctx->resolve); - } - - if (ctx->peer.connection) { - ngx_close_connection(ctx->peer.connection); - } - - ngx_destroy_pool(ctx->pool); -} - - -static void -ngx_ssl_ocsp_error(ngx_ssl_ocsp_ctx_t *ctx) -{ - ngx_log_debug0(NGX_LOG_DEBUG_EVENT, ctx->log, 0, - "ssl ocsp error"); - - ctx->code = 0; - ctx->handler(ctx); -} - - -static void -ngx_ssl_ocsp_next(ngx_ssl_ocsp_ctx_t *ctx) -{ - ngx_log_debug0(NGX_LOG_DEBUG_EVENT, ctx->log, 0, - "ssl ocsp next"); - - if (++ctx->naddr >= ctx->naddrs) { - ngx_ssl_ocsp_error(ctx); - return; - } - - ctx->request->pos = ctx->request->start; - - if (ctx->response) { - ctx->response->last = ctx->response->pos; - } - - if (ctx->peer.connection) { - ngx_close_connection(ctx->peer.connection); - ctx->peer.connection = NULL; - } - - ctx->state = 0; - ctx->count = 0; - ctx->done = 0; - - ngx_ssl_ocsp_connect(ctx); -} - - -static void -ngx_ssl_ocsp_request(ngx_ssl_ocsp_ctx_t *ctx) -{ - ngx_resolver_ctx_t *resolve, temp; - - ngx_log_debug0(NGX_LOG_DEBUG_EVENT, ctx->log, 0, - "ssl ocsp request"); - - if (ngx_ssl_ocsp_create_request(ctx) != NGX_OK) { - ngx_ssl_ocsp_error(ctx); - return; - } - - if (ctx->resolver) { - /* resolve OCSP responder hostname */ - - temp.name = ctx->host; - - resolve = ngx_resolve_start(ctx->resolver, &temp); - if (resolve == NULL) { - ngx_ssl_ocsp_error(ctx); - return; - } - - if (resolve == NGX_NO_RESOLVER) { - if (ctx->naddrs == 0) { - ngx_log_error(NGX_LOG_ERR, ctx->log, 0, - "no resolver defined to resolve %V", &ctx->host); - - ngx_ssl_ocsp_error(ctx); - return; - } - - ngx_log_error(NGX_LOG_WARN, ctx->log, 0, - "no resolver defined to resolve %V", &ctx->host); - goto connect; - } - - resolve->name = ctx->host; - resolve->handler = ngx_ssl_ocsp_resolve_handler; - resolve->data = ctx; - resolve->timeout = ctx->resolver_timeout; - - ctx->resolve = resolve; - - if (ngx_resolve_name(resolve) != NGX_OK) { - ctx->resolve = NULL; - ngx_ssl_ocsp_error(ctx); - return; - } - - return; - } - -connect: - - ngx_ssl_ocsp_connect(ctx); -} - - -static void -ngx_ssl_ocsp_resolve_handler(ngx_resolver_ctx_t *resolve) -{ - ngx_ssl_ocsp_ctx_t *ctx = resolve->data; - - u_char *p; - size_t len; - socklen_t socklen; - ngx_uint_t i; - struct sockaddr *sockaddr; - - ngx_log_debug0(NGX_LOG_DEBUG_EVENT, ctx->log, 0, - "ssl ocsp resolve handler"); - - if (resolve->state) { - ngx_log_error(NGX_LOG_ERR, ctx->log, 0, - "%V could not be resolved (%i: %s)", - &resolve->name, resolve->state, - ngx_resolver_strerror(resolve->state)); - goto failed; - } - -#if (NGX_DEBUG) - { - u_char text[NGX_SOCKADDR_STRLEN]; - ngx_str_t addr; - - addr.data = text; - - for (i = 0; i < resolve->naddrs; i++) { - addr.len = ngx_sock_ntop(resolve->addrs[i].sockaddr, - resolve->addrs[i].socklen, - text, NGX_SOCKADDR_STRLEN, 0); - - ngx_log_debug1(NGX_LOG_DEBUG_EVENT, ctx->log, 0, - "name was resolved to %V", &addr); - - } - } -#endif - - ctx->naddrs = resolve->naddrs; - ctx->addrs = ngx_pcalloc(ctx->pool, ctx->naddrs * sizeof(ngx_addr_t)); - - if (ctx->addrs == NULL) { - goto failed; - } - - for (i = 0; i < resolve->naddrs; i++) { - - socklen = resolve->addrs[i].socklen; - - sockaddr = ngx_palloc(ctx->pool, socklen); - if (sockaddr == NULL) { - goto failed; - } - - ngx_memcpy(sockaddr, resolve->addrs[i].sockaddr, socklen); - ngx_inet_set_port(sockaddr, ctx->port); - - ctx->addrs[i].sockaddr = sockaddr; - ctx->addrs[i].socklen = socklen; - - p = ngx_pnalloc(ctx->pool, NGX_SOCKADDR_STRLEN); - if (p == NULL) { - goto failed; - } - - len = ngx_sock_ntop(sockaddr, socklen, p, NGX_SOCKADDR_STRLEN, 1); - - ctx->addrs[i].name.len = len; - ctx->addrs[i].name.data = p; - } - - ngx_resolve_name_done(resolve); - ctx->resolve = NULL; - - ngx_ssl_ocsp_connect(ctx); - return; - -failed: - - ngx_resolve_name_done(resolve); - ctx->resolve = NULL; - - ngx_ssl_ocsp_error(ctx); -} - - -static void -ngx_ssl_ocsp_connect(ngx_ssl_ocsp_ctx_t *ctx) -{ - ngx_int_t rc; - ngx_addr_t *addr; - - ngx_log_debug2(NGX_LOG_DEBUG_EVENT, ctx->log, 0, - "ssl ocsp connect %ui/%ui", ctx->naddr, ctx->naddrs); - - addr = &ctx->addrs[ctx->naddr]; - - ctx->peer.sockaddr = addr->sockaddr; - ctx->peer.socklen = addr->socklen; - ctx->peer.name = &addr->name; - ctx->peer.get = ngx_event_get_peer; - ctx->peer.log = ctx->log; - ctx->peer.log_error = NGX_ERROR_ERR; - - rc = ngx_event_connect_peer(&ctx->peer); - - ngx_log_debug0(NGX_LOG_DEBUG_EVENT, ctx->log, 0, - "ssl ocsp connect peer done"); - - if (rc == NGX_ERROR) { - ngx_ssl_ocsp_error(ctx); - return; - } - - if (rc == NGX_BUSY || rc == NGX_DECLINED) { - ngx_ssl_ocsp_next(ctx); - return; - } - - ctx->peer.connection->data = ctx; - ctx->peer.connection->pool = ctx->pool; - - ctx->peer.connection->read->handler = ngx_ssl_ocsp_read_handler; - ctx->peer.connection->write->handler = ngx_ssl_ocsp_write_handler; - - ctx->process = ngx_ssl_ocsp_process_status_line; - - if (ctx->timeout) { - ngx_add_timer(ctx->peer.connection->read, ctx->timeout); - ngx_add_timer(ctx->peer.connection->write, ctx->timeout); - } - - if (rc == NGX_OK) { - ngx_ssl_ocsp_write_handler(ctx->peer.connection->write); - return; - } -} - - -static void -ngx_ssl_ocsp_write_handler(ngx_event_t *wev) -{ - ssize_t n, size; - ngx_connection_t *c; - ngx_ssl_ocsp_ctx_t *ctx; - - c = wev->data; - ctx = c->data; - - ngx_log_debug0(NGX_LOG_DEBUG_EVENT, wev->log, 0, - "ssl ocsp write handler"); - - if (wev->timedout) { - ngx_log_error(NGX_LOG_ERR, wev->log, NGX_ETIMEDOUT, - "OCSP responder timed out"); - ngx_ssl_ocsp_next(ctx); - return; - } - - size = ctx->request->last - ctx->request->pos; - - n = ngx_send(c, ctx->request->pos, size); - - if (n == NGX_ERROR) { - ngx_ssl_ocsp_next(ctx); - return; - } - - if (n > 0) { - ctx->request->pos += n; - - if (n == size) { - wev->handler = ngx_ssl_ocsp_dummy_handler; - - if (wev->timer_set) { - ngx_del_timer(wev); - } - - if (ngx_handle_write_event(wev, 0) != NGX_OK) { - ngx_ssl_ocsp_error(ctx); - } - - return; - } - } - - if (!wev->timer_set && ctx->timeout) { - ngx_add_timer(wev, ctx->timeout); - } -} - - -static void -ngx_ssl_ocsp_read_handler(ngx_event_t *rev) -{ - ssize_t n, size; - ngx_int_t rc; - ngx_connection_t *c; - ngx_ssl_ocsp_ctx_t *ctx; - - c = rev->data; - ctx = c->data; - - ngx_log_debug0(NGX_LOG_DEBUG_EVENT, rev->log, 0, - "ssl ocsp read handler"); - - if (rev->timedout) { - ngx_log_error(NGX_LOG_ERR, rev->log, NGX_ETIMEDOUT, - "OCSP responder timed out"); - ngx_ssl_ocsp_next(ctx); - return; - } - - if (ctx->response == NULL) { - ctx->response = ngx_create_temp_buf(ctx->pool, 16384); - if (ctx->response == NULL) { - ngx_ssl_ocsp_error(ctx); - return; - } - } - - for ( ;; ) { - - size = ctx->response->end - ctx->response->last; - - n = ngx_recv(c, ctx->response->last, size); - - if (n > 0) { - ctx->response->last += n; - - rc = ctx->process(ctx); - - if (rc == NGX_ERROR) { - ngx_ssl_ocsp_next(ctx); - return; - } - - continue; - } - - if (n == NGX_AGAIN) { - - if (ngx_handle_read_event(rev, 0) != NGX_OK) { - ngx_ssl_ocsp_error(ctx); - } - - return; - } - - break; - } - - ctx->done = 1; - - rc = ctx->process(ctx); - - if (rc == NGX_DONE) { - /* ctx->handler() was called */ - return; - } - - ngx_log_error(NGX_LOG_ERR, ctx->log, 0, - "OCSP responder prematurely closed connection"); - - ngx_ssl_ocsp_next(ctx); -} - - -static void -ngx_ssl_ocsp_dummy_handler(ngx_event_t *ev) -{ - ngx_log_debug0(NGX_LOG_DEBUG_EVENT, ev->log, 0, - "ssl ocsp dummy handler"); -} - - -static ngx_int_t -ngx_ssl_ocsp_create_request(ngx_ssl_ocsp_ctx_t *ctx) -{ - int len; - u_char *p; - uintptr_t escape; - ngx_str_t binary, base64; - ngx_buf_t *b; - OCSP_CERTID *id; - OCSP_REQUEST *ocsp; - - ocsp = OCSP_REQUEST_new(); - if (ocsp == NULL) { - ngx_ssl_error(NGX_LOG_CRIT, ctx->log, 0, - "OCSP_REQUEST_new() failed"); - return NGX_ERROR; - } - - id = OCSP_cert_to_id(NULL, ctx->cert, ctx->issuer); - if (id == NULL) { - ngx_ssl_error(NGX_LOG_CRIT, ctx->log, 0, - "OCSP_cert_to_id() failed"); - goto failed; - } - - if (OCSP_request_add0_id(ocsp, id) == NULL) { - ngx_ssl_error(NGX_LOG_CRIT, ctx->log, 0, - "OCSP_request_add0_id() failed"); - OCSP_CERTID_free(id); - goto failed; - } - - len = i2d_OCSP_REQUEST(ocsp, NULL); - if (len <= 0) { - ngx_ssl_error(NGX_LOG_CRIT, ctx->log, 0, - "i2d_OCSP_REQUEST() failed"); - goto failed; - } - - binary.len = len; - binary.data = ngx_palloc(ctx->pool, len); - if (binary.data == NULL) { - goto failed; - } - - p = binary.data; - len = i2d_OCSP_REQUEST(ocsp, &p); - if (len <= 0) { - ngx_ssl_error(NGX_LOG_EMERG, ctx->log, 0, - "i2d_OCSP_REQUEST() failed"); - goto failed; - } - - base64.len = ngx_base64_encoded_length(binary.len); - base64.data = ngx_palloc(ctx->pool, base64.len); - if (base64.data == NULL) { - goto failed; - } - - ngx_encode_base64(&base64, &binary); - - escape = ngx_escape_uri(NULL, base64.data, base64.len, - NGX_ESCAPE_URI_COMPONENT); - - ngx_log_debug2(NGX_LOG_DEBUG_EVENT, ctx->log, 0, - "ssl ocsp request length %z, escape %d", - base64.len, (int) escape); - - len = sizeof("GET ") - 1 + ctx->uri.len + sizeof("/") - 1 - + base64.len + 2 * escape + sizeof(" HTTP/1.0" CRLF) - 1 - + sizeof("Host: ") - 1 + ctx->host.len + sizeof(CRLF) - 1 - + sizeof(CRLF) - 1; - - b = ngx_create_temp_buf(ctx->pool, len); - if (b == NULL) { - goto failed; - } - - p = b->last; - - p = ngx_cpymem(p, "GET ", sizeof("GET ") - 1); - p = ngx_cpymem(p, ctx->uri.data, ctx->uri.len); - - if (ctx->uri.data[ctx->uri.len - 1] != '/') { - *p++ = '/'; - } - - if (escape == 0) { - p = ngx_cpymem(p, base64.data, base64.len); - - } else { - p = (u_char *) ngx_escape_uri(p, base64.data, base64.len, - NGX_ESCAPE_URI_COMPONENT); - } - - p = ngx_cpymem(p, " HTTP/1.0" CRLF, sizeof(" HTTP/1.0" CRLF) - 1); - p = ngx_cpymem(p, "Host: ", sizeof("Host: ") - 1); - p = ngx_cpymem(p, ctx->host.data, ctx->host.len); - *p++ = CR; *p++ = LF; - - /* add "\r\n" at the header end */ - *p++ = CR; *p++ = LF; - - b->last = p; - ctx->request = b; - - OCSP_REQUEST_free(ocsp); - - return NGX_OK; - -failed: - - OCSP_REQUEST_free(ocsp); - - return NGX_ERROR; -} - - -static ngx_int_t -ngx_ssl_ocsp_process_status_line(ngx_ssl_ocsp_ctx_t *ctx) -{ - ngx_int_t rc; - - rc = ngx_ssl_ocsp_parse_status_line(ctx); - - if (rc == NGX_OK) { - ngx_log_debug3(NGX_LOG_DEBUG_EVENT, ctx->log, 0, - "ssl ocsp status %ui \"%*s\"", - ctx->code, - ctx->header_end - ctx->header_start, - ctx->header_start); - - ctx->process = ngx_ssl_ocsp_process_headers; - return ctx->process(ctx); - } - - if (rc == NGX_AGAIN) { - return NGX_AGAIN; - } - - /* rc == NGX_ERROR */ - - ngx_log_error(NGX_LOG_ERR, ctx->log, 0, - "OCSP responder sent invalid response"); - - return NGX_ERROR; -} - - -static ngx_int_t -ngx_ssl_ocsp_parse_status_line(ngx_ssl_ocsp_ctx_t *ctx) -{ - u_char ch; - u_char *p; - ngx_buf_t *b; - enum { - sw_start = 0, - sw_H, - sw_HT, - sw_HTT, - sw_HTTP, - sw_first_major_digit, - sw_major_digit, - sw_first_minor_digit, - sw_minor_digit, - sw_status, - sw_space_after_status, - sw_status_text, - sw_almost_done - } state; - - ngx_log_debug0(NGX_LOG_DEBUG_EVENT, ctx->log, 0, - "ssl ocsp process status line"); - - state = ctx->state; - b = ctx->response; - - for (p = b->pos; p < b->last; p++) { - ch = *p; - - switch (state) { - - /* "HTTP/" */ - case sw_start: - switch (ch) { - case 'H': - state = sw_H; - break; - default: - return NGX_ERROR; - } - break; - - case sw_H: - switch (ch) { - case 'T': - state = sw_HT; - break; - default: - return NGX_ERROR; - } - break; - - case sw_HT: - switch (ch) { - case 'T': - state = sw_HTT; - break; - default: - return NGX_ERROR; - } - break; - - case sw_HTT: - switch (ch) { - case 'P': - state = sw_HTTP; - break; - default: - return NGX_ERROR; - } - break; - - case sw_HTTP: - switch (ch) { - case '/': - state = sw_first_major_digit; - break; - default: - return NGX_ERROR; - } - break; - - /* the first digit of major HTTP version */ - case sw_first_major_digit: - if (ch < '1' || ch > '9') { - return NGX_ERROR; - } - - state = sw_major_digit; - break; - - /* the major HTTP version or dot */ - case sw_major_digit: - if (ch == '.') { - state = sw_first_minor_digit; - break; - } - - if (ch < '0' || ch > '9') { - return NGX_ERROR; - } - - break; - - /* the first digit of minor HTTP version */ - case sw_first_minor_digit: - if (ch < '0' || ch > '9') { - return NGX_ERROR; - } - - state = sw_minor_digit; - break; - - /* the minor HTTP version or the end of the request line */ - case sw_minor_digit: - if (ch == ' ') { - state = sw_status; - break; - } - - if (ch < '0' || ch > '9') { - return NGX_ERROR; - } - - break; - - /* HTTP status code */ - case sw_status: - if (ch == ' ') { - break; - } - - if (ch < '0' || ch > '9') { - return NGX_ERROR; - } - - ctx->code = ctx->code * 10 + (ch - '0'); - - if (++ctx->count == 3) { - state = sw_space_after_status; - ctx->header_start = p - 2; - } - - break; - - /* space or end of line */ - case sw_space_after_status: - switch (ch) { - case ' ': - state = sw_status_text; - break; - case '.': /* IIS may send 403.1, 403.2, etc */ - state = sw_status_text; - break; - case CR: - state = sw_almost_done; - break; - case LF: - ctx->header_end = p; - goto done; - default: - return NGX_ERROR; - } - break; - - /* any text until end of line */ - case sw_status_text: - switch (ch) { - case CR: - state = sw_almost_done; - break; - case LF: - ctx->header_end = p; - goto done; - } - break; - - /* end of status line */ - case sw_almost_done: - switch (ch) { - case LF: - ctx->header_end = p - 1; - goto done; - default: - return NGX_ERROR; - } - } - } - - b->pos = p; - ctx->state = state; - - return NGX_AGAIN; - -done: - - b->pos = p + 1; - ctx->state = sw_start; - - return NGX_OK; -} - - -static ngx_int_t -ngx_ssl_ocsp_process_headers(ngx_ssl_ocsp_ctx_t *ctx) -{ - size_t len; - ngx_int_t rc; - - ngx_log_debug0(NGX_LOG_DEBUG_EVENT, ctx->log, 0, - "ssl ocsp process headers"); - - for ( ;; ) { - rc = ngx_ssl_ocsp_parse_header_line(ctx); - - if (rc == NGX_OK) { - - ngx_log_debug4(NGX_LOG_DEBUG_EVENT, ctx->log, 0, - "ssl ocsp header \"%*s: %*s\"", - ctx->header_name_end - ctx->header_name_start, - ctx->header_name_start, - ctx->header_end - ctx->header_start, - ctx->header_start); - - len = ctx->header_name_end - ctx->header_name_start; - - if (len == sizeof("Content-Type") - 1 - && ngx_strncasecmp(ctx->header_name_start, - (u_char *) "Content-Type", - sizeof("Content-Type") - 1) - == 0) - { - len = ctx->header_end - ctx->header_start; - - if (len != sizeof("application/ocsp-response") - 1 - || ngx_strncasecmp(ctx->header_start, - (u_char *) "application/ocsp-response", - sizeof("application/ocsp-response") - 1) - != 0) - { - ngx_log_error(NGX_LOG_ERR, ctx->log, 0, - "OCSP responder sent invalid " - "\"Content-Type\" header: \"%*s\"", - ctx->header_end - ctx->header_start, - ctx->header_start); - return NGX_ERROR; - } - - continue; - } - - /* TODO: honor Content-Length */ - - continue; - } - - if (rc == NGX_DONE) { - break; - } - - if (rc == NGX_AGAIN) { - return NGX_AGAIN; - } - - /* rc == NGX_ERROR */ - - ngx_log_error(NGX_LOG_ERR, ctx->log, 0, - "OCSP responder sent invalid response"); - - return NGX_ERROR; - } - - ctx->process = ngx_ssl_ocsp_process_body; - return ctx->process(ctx); -} - - -static ngx_int_t -ngx_ssl_ocsp_parse_header_line(ngx_ssl_ocsp_ctx_t *ctx) -{ - u_char c, ch, *p; - enum { - sw_start = 0, - sw_name, - sw_space_before_value, - sw_value, - sw_space_after_value, - sw_almost_done, - sw_header_almost_done - } state; - - state = ctx->state; - - for (p = ctx->response->pos; p < ctx->response->last; p++) { - ch = *p; - -#if 0 - ngx_log_debug3(NGX_LOG_DEBUG_EVENT, ctx->log, 0, - "s:%d in:'%02Xd:%c'", state, ch, ch); -#endif - - switch (state) { - - /* first char */ - case sw_start: - - switch (ch) { - case CR: - ctx->header_end = p; - state = sw_header_almost_done; - break; - case LF: - ctx->header_end = p; - goto header_done; - default: - state = sw_name; - ctx->header_name_start = p; - - c = (u_char) (ch | 0x20); - if (c >= 'a' && c <= 'z') { - break; - } - - if (ch >= '0' && ch <= '9') { - break; - } - - return NGX_ERROR; - } - break; - - /* header name */ - case sw_name: - c = (u_char) (ch | 0x20); - if (c >= 'a' && c <= 'z') { - break; - } - - if (ch == ':') { - ctx->header_name_end = p; - state = sw_space_before_value; - break; - } - - if (ch == '-') { - break; - } - - if (ch >= '0' && ch <= '9') { - break; - } - - if (ch == CR) { - ctx->header_name_end = p; - ctx->header_start = p; - ctx->header_end = p; - state = sw_almost_done; - break; - } - - if (ch == LF) { - ctx->header_name_end = p; - ctx->header_start = p; - ctx->header_end = p; - goto done; - } - - return NGX_ERROR; - - /* space* before header value */ - case sw_space_before_value: - switch (ch) { - case ' ': - break; - case CR: - ctx->header_start = p; - ctx->header_end = p; - state = sw_almost_done; - break; - case LF: - ctx->header_start = p; - ctx->header_end = p; - goto done; - default: - ctx->header_start = p; - state = sw_value; - break; - } - break; - - /* header value */ - case sw_value: - switch (ch) { - case ' ': - ctx->header_end = p; - state = sw_space_after_value; - break; - case CR: - ctx->header_end = p; - state = sw_almost_done; - break; - case LF: - ctx->header_end = p; - goto done; - } - break; - - /* space* before end of header line */ - case sw_space_after_value: - switch (ch) { - case ' ': - break; - case CR: - state = sw_almost_done; - break; - case LF: - goto done; - default: - state = sw_value; - break; - } - break; - - /* end of header line */ - case sw_almost_done: - switch (ch) { - case LF: - goto done; - default: - return NGX_ERROR; - } - - /* end of header */ - case sw_header_almost_done: - switch (ch) { - case LF: - goto header_done; - default: - return NGX_ERROR; - } - } - } - - ctx->response->pos = p; - ctx->state = state; - - return NGX_AGAIN; - -done: - - ctx->response->pos = p + 1; - ctx->state = sw_start; - - return NGX_OK; - -header_done: - - ctx->response->pos = p + 1; - ctx->state = sw_start; - - return NGX_DONE; -} - - -static ngx_int_t -ngx_ssl_ocsp_process_body(ngx_ssl_ocsp_ctx_t *ctx) -{ - ngx_log_debug0(NGX_LOG_DEBUG_EVENT, ctx->log, 0, - "ssl ocsp process body"); - - if (ctx->done) { - ctx->handler(ctx); - return NGX_DONE; - } - - return NGX_AGAIN; -} - - -static ngx_int_t -ngx_ssl_ocsp_verify(ngx_ssl_ocsp_ctx_t *ctx) -{ - int n; - size_t len; - X509_STORE *store; - const u_char *p; - OCSP_CERTID *id; - OCSP_RESPONSE *ocsp; - OCSP_BASICRESP *basic; - ASN1_GENERALIZEDTIME *thisupdate, *nextupdate; - - ocsp = NULL; - basic = NULL; - id = NULL; - - if (ctx->code != 200) { - goto error; - } - - /* check the response */ - - len = ctx->response->last - ctx->response->pos; - p = ctx->response->pos; - - ocsp = d2i_OCSP_RESPONSE(NULL, &p, len); - if (ocsp == NULL) { - ngx_ssl_error(NGX_LOG_ERR, ctx->log, 0, - "d2i_OCSP_RESPONSE() failed"); - goto error; - } - - n = OCSP_response_status(ocsp); - - if (n != OCSP_RESPONSE_STATUS_SUCCESSFUL) { - ngx_log_error(NGX_LOG_ERR, ctx->log, 0, - "OCSP response not successful (%d: %s)", - n, OCSP_response_status_str(n)); - goto error; - } - - basic = OCSP_response_get1_basic(ocsp); - if (basic == NULL) { - ngx_ssl_error(NGX_LOG_ERR, ctx->log, 0, - "OCSP_response_get1_basic() failed"); - goto error; - } - - store = SSL_CTX_get_cert_store(ctx->ssl_ctx); - if (store == NULL) { - ngx_ssl_error(NGX_LOG_CRIT, ctx->log, 0, - "SSL_CTX_get_cert_store() failed"); - goto error; - } - - if (OCSP_basic_verify(basic, ctx->chain, store, ctx->flags) != 1) { - ngx_ssl_error(NGX_LOG_ERR, ctx->log, 0, - "OCSP_basic_verify() failed"); - goto error; - } - - id = OCSP_cert_to_id(NULL, ctx->cert, ctx->issuer); - if (id == NULL) { - ngx_ssl_error(NGX_LOG_CRIT, ctx->log, 0, - "OCSP_cert_to_id() failed"); - goto error; - } - - if (OCSP_resp_find_status(basic, id, &ctx->status, NULL, NULL, - &thisupdate, &nextupdate) - != 1) - { - ngx_log_error(NGX_LOG_ERR, ctx->log, 0, - "certificate status not found in the OCSP response"); - goto error; - } - - if (OCSP_check_validity(thisupdate, nextupdate, 300, -1) != 1) { - ngx_ssl_error(NGX_LOG_ERR, ctx->log, 0, - "OCSP_check_validity() failed"); - goto error; - } - - if (nextupdate) { - ctx->valid = ngx_ssl_stapling_time(nextupdate); - if (ctx->valid == (time_t) NGX_ERROR) { - ngx_log_error(NGX_LOG_ERR, ctx->log, 0, - "invalid nextUpdate time in certificate status"); - goto error; - } - - } else { - ctx->valid = NGX_MAX_TIME_T_VALUE; - } - - OCSP_CERTID_free(id); - OCSP_BASICRESP_free(basic); - OCSP_RESPONSE_free(ocsp); - - ngx_log_debug2(NGX_LOG_DEBUG_EVENT, ctx->log, 0, - "ssl ocsp response, %s, %uz", - OCSP_cert_status_str(ctx->status), len); - - return NGX_OK; - -error: - - if (id) { - OCSP_CERTID_free(id); - } - - if (basic) { - OCSP_BASICRESP_free(basic); - } - - if (ocsp) { - OCSP_RESPONSE_free(ocsp); - } - - return NGX_ERROR; -} - - -ngx_int_t -ngx_ssl_ocsp_cache_init(ngx_shm_zone_t *shm_zone, void *data) -{ - size_t len; - ngx_slab_pool_t *shpool; - ngx_ssl_ocsp_cache_t *cache; - - if (data) { - shm_zone->data = data; - return NGX_OK; - } - - shpool = (ngx_slab_pool_t *) shm_zone->shm.addr; - - if (shm_zone->shm.exists) { - shm_zone->data = shpool->data; - return NGX_OK; - } - - cache = ngx_slab_alloc(shpool, sizeof(ngx_ssl_ocsp_cache_t)); - if (cache == NULL) { - return NGX_ERROR; - } - - shpool->data = cache; - shm_zone->data = cache; - - ngx_rbtree_init(&cache->rbtree, &cache->sentinel, - ngx_str_rbtree_insert_value); - - ngx_queue_init(&cache->expire_queue); - - len = sizeof(" in OCSP cache \"\"") + shm_zone->shm.name.len; - - shpool->log_ctx = ngx_slab_alloc(shpool, len); - if (shpool->log_ctx == NULL) { - return NGX_ERROR; - } - - ngx_sprintf(shpool->log_ctx, " in OCSP cache \"%V\"%Z", - &shm_zone->shm.name); - - shpool->log_nomem = 0; - - return NGX_OK; -} - - -static ngx_int_t -ngx_ssl_ocsp_cache_lookup(ngx_ssl_ocsp_ctx_t *ctx) -{ - uint32_t hash; - ngx_shm_zone_t *shm_zone; - ngx_slab_pool_t *shpool; - ngx_ssl_ocsp_cache_t *cache; - ngx_ssl_ocsp_cache_node_t *node; - - shm_zone = ctx->shm_zone; - - if (shm_zone == NULL) { - return NGX_DECLINED; - } - - if (ngx_ssl_ocsp_create_key(ctx) != NGX_OK) { - return NGX_ERROR; - } - - ngx_log_debug0(NGX_LOG_DEBUG_EVENT, ctx->log, 0, "ssl ocsp cache lookup"); - - cache = shm_zone->data; - shpool = (ngx_slab_pool_t *) shm_zone->shm.addr; - hash = ngx_hash_key(ctx->key.data, ctx->key.len); - - ngx_shmtx_lock(&shpool->mutex); - - node = (ngx_ssl_ocsp_cache_node_t *) - ngx_str_rbtree_lookup(&cache->rbtree, &ctx->key, hash); - - if (node) { - if (node->valid > ngx_time()) { - ctx->status = node->status; - ngx_shmtx_unlock(&shpool->mutex); - - ngx_log_debug1(NGX_LOG_DEBUG_EVENT, ctx->log, 0, - "ssl ocsp cache hit, %s", - OCSP_cert_status_str(ctx->status)); - - return NGX_OK; - } - - ngx_queue_remove(&node->queue); - ngx_rbtree_delete(&cache->rbtree, &node->node.node); - ngx_slab_free_locked(shpool, node); - - ngx_shmtx_unlock(&shpool->mutex); - - ngx_log_debug0(NGX_LOG_DEBUG_EVENT, ctx->log, 0, - "ssl ocsp cache expired"); - - return NGX_DECLINED; - } - - ngx_shmtx_unlock(&shpool->mutex); - - ngx_log_debug0(NGX_LOG_DEBUG_EVENT, ctx->log, 0, "ssl ocsp cache miss"); - - return NGX_DECLINED; -} - - -static ngx_int_t -ngx_ssl_ocsp_cache_store(ngx_ssl_ocsp_ctx_t *ctx) -{ - time_t now, valid; - uint32_t hash; - ngx_queue_t *q; - ngx_shm_zone_t *shm_zone; - ngx_slab_pool_t *shpool; - ngx_ssl_ocsp_cache_t *cache; - ngx_ssl_ocsp_cache_node_t *node; - - shm_zone = ctx->shm_zone; - - if (shm_zone == NULL) { - return NGX_OK; - } - - valid = ctx->valid; - - now = ngx_time(); - - if (valid < now) { - return NGX_OK; - } - - if (valid == NGX_MAX_TIME_T_VALUE) { - valid = now + 3600; - } - - ngx_log_debug1(NGX_LOG_DEBUG_EVENT, ctx->log, 0, - "ssl ocsp cache store, valid:%T", valid - now); - - cache = shm_zone->data; - shpool = (ngx_slab_pool_t *) shm_zone->shm.addr; - hash = ngx_hash_key(ctx->key.data, ctx->key.len); - - ngx_shmtx_lock(&shpool->mutex); - - node = ngx_slab_calloc_locked(shpool, - sizeof(ngx_ssl_ocsp_cache_node_t) + ctx->key.len); - if (node == NULL) { - - if (!ngx_queue_empty(&cache->expire_queue)) { - q = ngx_queue_last(&cache->expire_queue); - node = ngx_queue_data(q, ngx_ssl_ocsp_cache_node_t, queue); - - ngx_rbtree_delete(&cache->rbtree, &node->node.node); - ngx_queue_remove(q); - ngx_slab_free_locked(shpool, node); - - node = ngx_slab_alloc_locked(shpool, - sizeof(ngx_ssl_ocsp_cache_node_t) + ctx->key.len); - } - - if (node == NULL) { - ngx_shmtx_unlock(&shpool->mutex); - ngx_log_error(NGX_LOG_ALERT, ctx->log, 0, - "could not allocate new entry%s", shpool->log_ctx); - return NGX_ERROR; - } - } - - node->node.str.len = ctx->key.len; - node->node.str.data = (u_char *) node + sizeof(ngx_ssl_ocsp_cache_node_t); - ngx_memcpy(node->node.str.data, ctx->key.data, ctx->key.len); - node->node.node.key = hash; - node->status = ctx->status; - node->valid = valid; - - ngx_rbtree_insert(&cache->rbtree, &node->node.node); - ngx_queue_insert_head(&cache->expire_queue, &node->queue); - - ngx_shmtx_unlock(&shpool->mutex); - - return NGX_OK; -} - - -static ngx_int_t -ngx_ssl_ocsp_create_key(ngx_ssl_ocsp_ctx_t *ctx) -{ - u_char *p; - ngx_int_t length; - ASN1_INTEGER *serial; - const X509_NAME *name; - - p = ngx_pnalloc(ctx->pool, 60); - if (p == NULL) { - return NGX_ERROR; - } - - ctx->key.data = p; - ctx->key.len = 60; - - name = X509_get_subject_name(ctx->issuer); - if (X509_NAME_digest(name, EVP_sha1(), p, NULL) == 0) { - return NGX_ERROR; - } - - p += 20; - - if (X509_pubkey_digest(ctx->issuer, EVP_sha1(), p, NULL) == 0) { - return NGX_ERROR; - } - - p += 20; - - serial = X509_get_serialNumber(ctx->cert); - length = ASN1_STRING_length(serial); - - if (length > 20) { - return NGX_ERROR; - } - - p = ngx_cpymem(p, ASN1_STRING_get0_data(serial), length); - ngx_memzero(p, 20 - length); - - ngx_log_debug1(NGX_LOG_DEBUG_EVENT, ctx->log, 0, - "ssl ocsp key %xV", &ctx->key); - - return NGX_OK; -} - - -static u_char * -ngx_ssl_ocsp_log_error(ngx_log_t *log, u_char *buf, size_t len) -{ - u_char *p; - ngx_ssl_ocsp_ctx_t *ctx; - - p = buf; - - if (log->action) { - p = ngx_snprintf(buf, len, " while %s", log->action); - len -= p - buf; - buf = p; - } - - ctx = log->data; - - if (ctx) { - p = ngx_snprintf(buf, len, ", responder: %V", &ctx->host); - len -= p - buf; - buf = p; - } - - if (ctx && ctx->peer.name) { - p = ngx_snprintf(buf, len, ", peer: %V", ctx->peer.name); - len -= p - buf; - buf = p; - } - - if (ctx && ctx->name) { - p = ngx_snprintf(buf, len, ", certificate: \"%s\"", ctx->name); - len -= p - buf; - buf = p; - } - - return p; -} - - -#else - - -ngx_int_t -ngx_ssl_stapling(ngx_conf_t *cf, ngx_ssl_t *ssl, ngx_str_t *file, - ngx_str_t *responder, ngx_uint_t verify) -{ - ngx_log_error(NGX_LOG_WARN, ssl->log, 0, - "\"ssl_stapling\" ignored, not supported"); - - return NGX_OK; -} - - -ngx_int_t -ngx_ssl_stapling_resolver(ngx_conf_t *cf, ngx_ssl_t *ssl, - ngx_resolver_t *resolver, ngx_msec_t resolver_timeout) -{ - return NGX_OK; -} - - -ngx_int_t -ngx_ssl_ocsp(ngx_conf_t *cf, ngx_ssl_t *ssl, ngx_str_t *responder, - ngx_uint_t depth, ngx_shm_zone_t *shm_zone) -{ - ngx_log_error(NGX_LOG_EMERG, ssl->log, 0, - "\"ssl_ocsp\" is not supported on this platform"); - - return NGX_ERROR; -} - - -ngx_int_t -ngx_ssl_ocsp_resolver(ngx_conf_t *cf, ngx_ssl_t *ssl, - ngx_resolver_t *resolver, ngx_msec_t resolver_timeout) -{ - return NGX_OK; -} - - -ngx_int_t -ngx_ssl_ocsp_validate(ngx_connection_t *c) -{ - return NGX_OK; -} - - -ngx_int_t -ngx_ssl_ocsp_get_status(ngx_connection_t *c, const char **s) -{ - return NGX_OK; -} - - -void -ngx_ssl_ocsp_cleanup(ngx_connection_t *c) -{ -} - - -ngx_int_t -ngx_ssl_ocsp_cache_init(ngx_shm_zone_t *shm_zone, void *data) -{ - return NGX_OK; -} - - -#endif diff --git a/src/deps/src/nginx-1.30.3/src/event/ngx_event_pipe.c b/src/deps/src/nginx-1.30.3/src/event/ngx_event_pipe.c deleted file mode 100644 index d774903ec6..0000000000 --- a/src/deps/src/nginx-1.30.3/src/event/ngx_event_pipe.c +++ /dev/null @@ -1,1146 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#include -#include -#include -#include - - -static ngx_int_t ngx_event_pipe_read_upstream(ngx_event_pipe_t *p); -static ngx_int_t ngx_event_pipe_write_to_downstream(ngx_event_pipe_t *p); - -static ngx_int_t ngx_event_pipe_write_chain_to_temp_file(ngx_event_pipe_t *p); -static ngx_inline void ngx_event_pipe_remove_shadow_links(ngx_buf_t *buf); -static ngx_int_t ngx_event_pipe_drain_chains(ngx_event_pipe_t *p); - - -ngx_int_t -ngx_event_pipe(ngx_event_pipe_t *p, ngx_int_t do_write) -{ - ngx_int_t rc; - ngx_uint_t flags; - ngx_event_t *rev, *wev; - - for ( ;; ) { - if (do_write) { - p->log->action = "sending to client"; - - rc = ngx_event_pipe_write_to_downstream(p); - - if (rc == NGX_ABORT) { - return NGX_ABORT; - } - - if (rc == NGX_BUSY) { - return NGX_OK; - } - } - - p->read = 0; - p->upstream_blocked = 0; - - p->log->action = "reading upstream"; - - if (ngx_event_pipe_read_upstream(p) == NGX_ABORT) { - return NGX_ABORT; - } - - if (!p->read && !p->upstream_blocked) { - break; - } - - do_write = 1; - } - - if (p->upstream - && p->upstream->fd != (ngx_socket_t) -1) - { - rev = p->upstream->read; - - flags = (rev->eof || rev->error) ? NGX_CLOSE_EVENT : 0; - - if (ngx_handle_read_event(rev, flags) != NGX_OK) { - return NGX_ABORT; - } - - if (!rev->delayed) { - if (rev->active && !rev->ready) { - ngx_add_timer(rev, p->read_timeout); - - } else if (rev->timer_set) { - ngx_del_timer(rev); - } - } - } - - if (p->downstream->fd != (ngx_socket_t) -1 - && p->downstream->data == p->output_ctx) - { - wev = p->downstream->write; - if (ngx_handle_write_event(wev, p->send_lowat) != NGX_OK) { - return NGX_ABORT; - } - - if (!wev->delayed) { - if (wev->active && !wev->ready) { - ngx_add_timer(wev, p->send_timeout); - - } else if (wev->timer_set) { - ngx_del_timer(wev); - } - } - } - - return NGX_OK; -} - - -static ngx_int_t -ngx_event_pipe_read_upstream(ngx_event_pipe_t *p) -{ - off_t limit; - ssize_t n, size; - ngx_int_t rc; - ngx_buf_t *b; - ngx_msec_t delay; - ngx_chain_t *chain, *cl, *ln; - - if (p->upstream_eof || p->upstream_error || p->upstream_done - || p->upstream == NULL) - { - return NGX_OK; - } - -#if (NGX_THREADS) - - if (p->aio) { - ngx_log_debug0(NGX_LOG_DEBUG_EVENT, p->log, 0, - "pipe read upstream: aio"); - return NGX_AGAIN; - } - - if (p->writing) { - ngx_log_debug0(NGX_LOG_DEBUG_EVENT, p->log, 0, - "pipe read upstream: writing"); - - rc = ngx_event_pipe_write_chain_to_temp_file(p); - - if (rc != NGX_OK) { - return rc; - } - } - -#endif - - ngx_log_debug1(NGX_LOG_DEBUG_EVENT, p->log, 0, - "pipe read upstream: %d", p->upstream->read->ready); - - for ( ;; ) { - - if (p->upstream_eof || p->upstream_error || p->upstream_done) { - break; - } - - if (p->preread_bufs == NULL && !p->upstream->read->ready) { - break; - } - - if (p->preread_bufs) { - - /* use the pre-read bufs if they exist */ - - chain = p->preread_bufs; - p->preread_bufs = NULL; - n = p->preread_size; - - ngx_log_debug1(NGX_LOG_DEBUG_EVENT, p->log, 0, - "pipe preread: %z", n); - - if (n) { - p->read = 1; - } - - } else { - -#if (NGX_HAVE_KQUEUE) - - /* - * kqueue notifies about the end of file or a pending error. - * This test allows not to allocate a buf on these conditions - * and not to call c->recv_chain(). - */ - - if (p->upstream->read->available == 0 - && p->upstream->read->pending_eof -#if (NGX_SSL) - && !p->upstream->ssl -#endif - ) - { - p->upstream->read->ready = 0; - p->upstream->read->eof = 1; - p->upstream_eof = 1; - p->read = 1; - - if (p->upstream->read->kq_errno) { - p->upstream->read->error = 1; - p->upstream_error = 1; - p->upstream_eof = 0; - - ngx_log_error(NGX_LOG_ERR, p->log, - p->upstream->read->kq_errno, - "kevent() reported that upstream " - "closed connection"); - } - - break; - } -#endif - - if (p->limit_rate) { - if (p->upstream->read->delayed) { - break; - } - - limit = (off_t) p->limit_rate * (ngx_time() - p->start_sec + 1) - - p->read_length; - - if (limit <= 0) { - p->upstream->read->delayed = 1; - delay = (ngx_msec_t) (- limit * 1000 / p->limit_rate + 1); - ngx_add_timer(p->upstream->read, delay); - break; - } - - } else { - limit = 0; - } - - if (p->free_raw_bufs) { - - /* use the free bufs if they exist */ - - chain = p->free_raw_bufs; - if (p->single_buf) { - p->free_raw_bufs = p->free_raw_bufs->next; - chain->next = NULL; - } else { - p->free_raw_bufs = NULL; - } - - } else if (p->allocated < p->bufs.num) { - - /* allocate a new buf if it's still allowed */ - - b = ngx_create_temp_buf(p->pool, p->bufs.size); - if (b == NULL) { - return NGX_ABORT; - } - - p->allocated++; - - chain = ngx_alloc_chain_link(p->pool); - if (chain == NULL) { - return NGX_ABORT; - } - - chain->buf = b; - chain->next = NULL; - - } else if (!p->cacheable - && p->downstream->data == p->output_ctx - && p->downstream->write->ready - && !p->downstream->write->delayed) - { - /* - * if the bufs are not needed to be saved in a cache and - * a downstream is ready then write the bufs to a downstream - */ - - p->upstream_blocked = 1; - - ngx_log_debug0(NGX_LOG_DEBUG_EVENT, p->log, 0, - "pipe downstream ready"); - - break; - - } else if (p->cacheable - || p->temp_file->offset < p->max_temp_file_size) - { - - /* - * if it is allowed, then save some bufs from p->in - * to a temporary file, and add them to a p->out chain - */ - - rc = ngx_event_pipe_write_chain_to_temp_file(p); - - ngx_log_debug1(NGX_LOG_DEBUG_EVENT, p->log, 0, - "pipe temp offset: %O", p->temp_file->offset); - - if (rc == NGX_BUSY) { - break; - } - - if (rc != NGX_OK) { - return rc; - } - - chain = p->free_raw_bufs; - if (p->single_buf) { - p->free_raw_bufs = p->free_raw_bufs->next; - chain->next = NULL; - } else { - p->free_raw_bufs = NULL; - } - - } else { - - /* there are no bufs to read in */ - - ngx_log_debug0(NGX_LOG_DEBUG_EVENT, p->log, 0, - "no pipe bufs to read in"); - - break; - } - - n = p->upstream->recv_chain(p->upstream, chain, limit); - - ngx_log_debug1(NGX_LOG_DEBUG_EVENT, p->log, 0, - "pipe recv chain: %z", n); - - if (p->free_raw_bufs) { - chain->next = p->free_raw_bufs; - } - p->free_raw_bufs = chain; - - if (n == NGX_ERROR) { - p->upstream_error = 1; - break; - } - - if (n == NGX_AGAIN) { - if (p->single_buf) { - ngx_event_pipe_remove_shadow_links(chain->buf); - } - - break; - } - - p->read = 1; - - if (n == 0) { - p->upstream_eof = 1; - break; - } - } - - delay = p->limit_rate ? (ngx_msec_t) n * 1000 / p->limit_rate : 0; - - p->read_length += n; - cl = chain; - p->free_raw_bufs = NULL; - - while (cl && n > 0) { - - ngx_event_pipe_remove_shadow_links(cl->buf); - - size = cl->buf->end - cl->buf->last; - - if (n >= size) { - cl->buf->last = cl->buf->end; - - /* STUB */ cl->buf->num = p->num++; - - if (p->input_filter(p, cl->buf) == NGX_ERROR) { - return NGX_ABORT; - } - - n -= size; - ln = cl; - cl = cl->next; - ngx_free_chain(p->pool, ln); - - } else { - cl->buf->last += n; - n = 0; - } - } - - if (cl) { - for (ln = cl; ln->next; ln = ln->next) { /* void */ } - - ln->next = p->free_raw_bufs; - p->free_raw_bufs = cl; - } - - if (delay > 0) { - p->upstream->read->delayed = 1; - ngx_add_timer(p->upstream->read, delay); - break; - } - } - -#if (NGX_DEBUG) - - for (cl = p->busy; cl; cl = cl->next) { - ngx_log_debug8(NGX_LOG_DEBUG_EVENT, p->log, 0, - "pipe buf busy s:%d t:%d f:%d " - "%p, pos %p, size: %z " - "file: %O, size: %O", - (cl->buf->shadow ? 1 : 0), - cl->buf->temporary, cl->buf->in_file, - cl->buf->start, cl->buf->pos, - cl->buf->last - cl->buf->pos, - cl->buf->file_pos, - cl->buf->file_last - cl->buf->file_pos); - } - - for (cl = p->out; cl; cl = cl->next) { - ngx_log_debug8(NGX_LOG_DEBUG_EVENT, p->log, 0, - "pipe buf out s:%d t:%d f:%d " - "%p, pos %p, size: %z " - "file: %O, size: %O", - (cl->buf->shadow ? 1 : 0), - cl->buf->temporary, cl->buf->in_file, - cl->buf->start, cl->buf->pos, - cl->buf->last - cl->buf->pos, - cl->buf->file_pos, - cl->buf->file_last - cl->buf->file_pos); - } - - for (cl = p->in; cl; cl = cl->next) { - ngx_log_debug8(NGX_LOG_DEBUG_EVENT, p->log, 0, - "pipe buf in s:%d t:%d f:%d " - "%p, pos %p, size: %z " - "file: %O, size: %O", - (cl->buf->shadow ? 1 : 0), - cl->buf->temporary, cl->buf->in_file, - cl->buf->start, cl->buf->pos, - cl->buf->last - cl->buf->pos, - cl->buf->file_pos, - cl->buf->file_last - cl->buf->file_pos); - } - - for (cl = p->free_raw_bufs; cl; cl = cl->next) { - ngx_log_debug8(NGX_LOG_DEBUG_EVENT, p->log, 0, - "pipe buf free s:%d t:%d f:%d " - "%p, pos %p, size: %z " - "file: %O, size: %O", - (cl->buf->shadow ? 1 : 0), - cl->buf->temporary, cl->buf->in_file, - cl->buf->start, cl->buf->pos, - cl->buf->last - cl->buf->pos, - cl->buf->file_pos, - cl->buf->file_last - cl->buf->file_pos); - } - - ngx_log_debug1(NGX_LOG_DEBUG_EVENT, p->log, 0, - "pipe length: %O", p->length); - -#endif - - if (p->free_raw_bufs && p->length != -1) { - cl = p->free_raw_bufs; - - if (cl->buf->last - cl->buf->pos >= p->length) { - - p->free_raw_bufs = cl->next; - - /* STUB */ cl->buf->num = p->num++; - - if (p->input_filter(p, cl->buf) == NGX_ERROR) { - return NGX_ABORT; - } - - ngx_free_chain(p->pool, cl); - } - } - - if (p->length == 0) { - p->upstream_done = 1; - p->read = 1; - } - - if ((p->upstream_eof || p->upstream_error) && p->free_raw_bufs) { - - /* STUB */ p->free_raw_bufs->buf->num = p->num++; - - if (p->input_filter(p, p->free_raw_bufs->buf) == NGX_ERROR) { - return NGX_ABORT; - } - - p->free_raw_bufs = p->free_raw_bufs->next; - - if (p->free_bufs && p->buf_to_file == NULL) { - for (cl = p->free_raw_bufs; cl; cl = cl->next) { - if (cl->buf->shadow == NULL) { - ngx_pfree(p->pool, cl->buf->start); - } - } - } - } - - if (p->cacheable && (p->in || p->buf_to_file)) { - - ngx_log_debug0(NGX_LOG_DEBUG_EVENT, p->log, 0, - "pipe write chain"); - - rc = ngx_event_pipe_write_chain_to_temp_file(p); - - if (rc != NGX_OK) { - return rc; - } - } - - return NGX_OK; -} - - -static ngx_int_t -ngx_event_pipe_write_to_downstream(ngx_event_pipe_t *p) -{ - u_char *prev; - size_t bsize; - ngx_int_t rc; - ngx_uint_t flush, flushed, prev_last_shadow; - ngx_chain_t *out, **ll, *cl; - ngx_connection_t *downstream; - - downstream = p->downstream; - - ngx_log_debug1(NGX_LOG_DEBUG_EVENT, p->log, 0, - "pipe write downstream: %d", downstream->write->ready); - -#if (NGX_THREADS) - - if (p->writing) { - rc = ngx_event_pipe_write_chain_to_temp_file(p); - - if (rc == NGX_ABORT) { - return NGX_ABORT; - } - } - -#endif - - flushed = 0; - - for ( ;; ) { - if (p->downstream_error) { - return ngx_event_pipe_drain_chains(p); - } - - if (p->upstream_eof || p->upstream_error || p->upstream_done) { - - /* pass the p->out and p->in chains to the output filter */ - - for (cl = p->busy; cl; cl = cl->next) { - cl->buf->recycled = 0; - } - - if (p->out) { - ngx_log_debug0(NGX_LOG_DEBUG_EVENT, p->log, 0, - "pipe write downstream flush out"); - - for (cl = p->out; cl; cl = cl->next) { - cl->buf->recycled = 0; - } - - rc = p->output_filter(p->output_ctx, p->out); - - if (rc == NGX_ERROR) { - p->downstream_error = 1; - return ngx_event_pipe_drain_chains(p); - } - - p->out = NULL; - } - - if (p->writing) { - break; - } - - if (p->in) { - ngx_log_debug0(NGX_LOG_DEBUG_EVENT, p->log, 0, - "pipe write downstream flush in"); - - for (cl = p->in; cl; cl = cl->next) { - cl->buf->recycled = 0; - } - - rc = p->output_filter(p->output_ctx, p->in); - - if (rc == NGX_ERROR) { - p->downstream_error = 1; - return ngx_event_pipe_drain_chains(p); - } - - p->in = NULL; - } - - ngx_log_debug0(NGX_LOG_DEBUG_EVENT, p->log, 0, - "pipe write downstream done"); - - /* TODO: free unused bufs */ - - p->downstream_done = 1; - break; - } - - if (downstream->data != p->output_ctx - || !downstream->write->ready - || downstream->write->delayed) - { - break; - } - - /* bsize is the size of the busy recycled bufs */ - - prev = NULL; - bsize = 0; - - for (cl = p->busy; cl; cl = cl->next) { - - if (cl->buf->recycled) { - if (prev == cl->buf->start) { - continue; - } - - bsize += cl->buf->end - cl->buf->start; - prev = cl->buf->start; - } - } - - ngx_log_debug1(NGX_LOG_DEBUG_EVENT, p->log, 0, - "pipe write busy: %uz", bsize); - - out = NULL; - - if (bsize >= (size_t) p->busy_size) { - flush = 1; - goto flush; - } - - flush = 0; - ll = NULL; - prev_last_shadow = 1; - - for ( ;; ) { - if (p->out) { - cl = p->out; - - if (cl->buf->recycled) { - ngx_log_error(NGX_LOG_ALERT, p->log, 0, - "recycled buffer in pipe out chain"); - } - - p->out = p->out->next; - - } else if (!p->cacheable && !p->writing && p->in) { - cl = p->in; - - ngx_log_debug3(NGX_LOG_DEBUG_EVENT, p->log, 0, - "pipe write buf ls:%d %p %z", - cl->buf->last_shadow, - cl->buf->pos, - cl->buf->last - cl->buf->pos); - - if (cl->buf->recycled && prev_last_shadow) { - if (bsize + cl->buf->end - cl->buf->start > p->busy_size) { - flush = 1; - break; - } - - bsize += cl->buf->end - cl->buf->start; - } - - prev_last_shadow = cl->buf->last_shadow; - - p->in = p->in->next; - - } else { - break; - } - - cl->next = NULL; - - if (out) { - *ll = cl; - } else { - out = cl; - } - ll = &cl->next; - } - - flush: - - ngx_log_debug2(NGX_LOG_DEBUG_EVENT, p->log, 0, - "pipe write: out:%p, f:%ui", out, flush); - - if (out == NULL) { - - if (!flush) { - break; - } - - /* a workaround for AIO */ - if (flushed++ > 10) { - return NGX_BUSY; - } - } - - rc = p->output_filter(p->output_ctx, out); - - ngx_chain_update_chains(p->pool, &p->free, &p->busy, &out, p->tag); - - if (rc == NGX_ERROR) { - p->downstream_error = 1; - return ngx_event_pipe_drain_chains(p); - } - - for (cl = p->free; cl; cl = cl->next) { - - if (cl->buf->temp_file) { - if (p->cacheable || !p->cyclic_temp_file) { - continue; - } - - /* reset p->temp_offset if all bufs had been sent */ - - if (cl->buf->file_last == p->temp_file->offset) { - p->temp_file->offset = 0; - } - } - - /* TODO: free buf if p->free_bufs && upstream done */ - - /* add the free shadow raw buf to p->free_raw_bufs */ - - if (cl->buf->last_shadow) { - if (ngx_event_pipe_add_free_buf(p, cl->buf->shadow) != NGX_OK) { - return NGX_ABORT; - } - - cl->buf->last_shadow = 0; - } - - cl->buf->shadow = NULL; - } - } - - return NGX_OK; -} - - -static ngx_int_t -ngx_event_pipe_write_chain_to_temp_file(ngx_event_pipe_t *p) -{ - ssize_t size, bsize, n; - ngx_buf_t *b; - ngx_uint_t prev_last_shadow; - ngx_chain_t *cl, *tl, *next, *out, **ll, **last_out, **last_free; - -#if (NGX_THREADS) - - if (p->writing) { - - if (p->aio) { - return NGX_AGAIN; - } - - out = p->writing; - p->writing = NULL; - - n = ngx_write_chain_to_temp_file(p->temp_file, NULL); - - if (n == NGX_ERROR) { - return NGX_ABORT; - } - - goto done; - } - -#endif - - if (p->buf_to_file) { - out = ngx_alloc_chain_link(p->pool); - if (out == NULL) { - return NGX_ABORT; - } - - out->buf = p->buf_to_file; - out->next = p->in; - - } else { - out = p->in; - } - - if (!p->cacheable) { - - size = 0; - cl = out; - ll = NULL; - prev_last_shadow = 1; - - ngx_log_debug1(NGX_LOG_DEBUG_EVENT, p->log, 0, - "pipe offset: %O", p->temp_file->offset); - - do { - bsize = cl->buf->last - cl->buf->pos; - - ngx_log_debug4(NGX_LOG_DEBUG_EVENT, p->log, 0, - "pipe buf ls:%d %p, pos %p, size: %z", - cl->buf->last_shadow, cl->buf->start, - cl->buf->pos, bsize); - - if (prev_last_shadow - && ((size + bsize > p->temp_file_write_size) - || (p->temp_file->offset + size + bsize - > p->max_temp_file_size))) - { - break; - } - - prev_last_shadow = cl->buf->last_shadow; - - size += bsize; - ll = &cl->next; - cl = cl->next; - - } while (cl); - - ngx_log_debug1(NGX_LOG_DEBUG_EVENT, p->log, 0, "size: %z", size); - - if (ll == NULL) { - return NGX_BUSY; - } - - if (cl) { - p->in = cl; - *ll = NULL; - - } else { - p->in = NULL; - p->last_in = &p->in; - } - - } else { - p->in = NULL; - p->last_in = &p->in; - } - -#if (NGX_THREADS) - if (p->thread_handler) { - p->temp_file->thread_write = 1; - p->temp_file->file.thread_task = p->thread_task; - p->temp_file->file.thread_handler = p->thread_handler; - p->temp_file->file.thread_ctx = p->thread_ctx; - } -#endif - - n = ngx_write_chain_to_temp_file(p->temp_file, out); - - if (n == NGX_ERROR) { - return NGX_ABORT; - } - -#if (NGX_THREADS) - - if (n == NGX_AGAIN) { - p->writing = out; - p->thread_task = p->temp_file->file.thread_task; - return NGX_AGAIN; - } - -done: - -#endif - - if (p->buf_to_file) { - p->temp_file->offset = p->buf_to_file->last - p->buf_to_file->pos; - n -= p->buf_to_file->last - p->buf_to_file->pos; - p->buf_to_file = NULL; - out = out->next; - } - - if (n > 0) { - /* update previous buffer or add new buffer */ - - if (p->out) { - for (cl = p->out; cl->next; cl = cl->next) { /* void */ } - - b = cl->buf; - - if (b->file_last == p->temp_file->offset) { - p->temp_file->offset += n; - b->file_last = p->temp_file->offset; - goto free; - } - - last_out = &cl->next; - - } else { - last_out = &p->out; - } - - cl = ngx_chain_get_free_buf(p->pool, &p->free); - if (cl == NULL) { - return NGX_ABORT; - } - - b = cl->buf; - - ngx_memzero(b, sizeof(ngx_buf_t)); - - b->tag = p->tag; - - b->file = &p->temp_file->file; - b->file_pos = p->temp_file->offset; - p->temp_file->offset += n; - b->file_last = p->temp_file->offset; - - b->in_file = 1; - b->temp_file = 1; - - *last_out = cl; - } - -free: - - for (last_free = &p->free_raw_bufs; - *last_free != NULL; - last_free = &(*last_free)->next) - { - /* void */ - } - - for (cl = out; cl; cl = next) { - next = cl->next; - - cl->next = p->free; - p->free = cl; - - b = cl->buf; - - if (b->last_shadow) { - - tl = ngx_alloc_chain_link(p->pool); - if (tl == NULL) { - return NGX_ABORT; - } - - tl->buf = b->shadow; - tl->next = NULL; - - *last_free = tl; - last_free = &tl->next; - - b->shadow->pos = b->shadow->start; - b->shadow->last = b->shadow->start; - - ngx_event_pipe_remove_shadow_links(b->shadow); - } - } - - return NGX_OK; -} - - -/* the copy input filter */ - -ngx_int_t -ngx_event_pipe_copy_input_filter(ngx_event_pipe_t *p, ngx_buf_t *buf) -{ - ngx_buf_t *b; - ngx_chain_t *cl; - - if (buf->pos == buf->last) { - return NGX_OK; - } - - if (p->upstream_done) { - ngx_log_debug0(NGX_LOG_DEBUG_EVENT, p->log, 0, - "input data after close"); - return NGX_OK; - } - - if (p->length == 0) { - p->upstream_done = 1; - - ngx_log_error(NGX_LOG_WARN, p->log, 0, - "upstream sent more data than specified in " - "\"Content-Length\" header"); - - return NGX_OK; - } - - cl = ngx_chain_get_free_buf(p->pool, &p->free); - if (cl == NULL) { - return NGX_ERROR; - } - - b = cl->buf; - - ngx_memcpy(b, buf, sizeof(ngx_buf_t)); - b->shadow = buf; - b->tag = p->tag; - b->last_shadow = 1; - b->recycled = 1; - buf->shadow = b; - - ngx_log_debug1(NGX_LOG_DEBUG_EVENT, p->log, 0, "input buf #%d", b->num); - - if (p->in) { - *p->last_in = cl; - } else { - p->in = cl; - } - p->last_in = &cl->next; - - if (p->length == -1) { - return NGX_OK; - } - - if (b->last - b->pos > p->length) { - - ngx_log_error(NGX_LOG_WARN, p->log, 0, - "upstream sent more data than specified in " - "\"Content-Length\" header"); - - b->last = b->pos + p->length; - p->upstream_done = 1; - - return NGX_OK; - } - - p->length -= b->last - b->pos; - - return NGX_OK; -} - - -static ngx_inline void -ngx_event_pipe_remove_shadow_links(ngx_buf_t *buf) -{ - ngx_buf_t *b, *next; - - b = buf->shadow; - - if (b == NULL) { - return; - } - - while (!b->last_shadow) { - next = b->shadow; - - b->temporary = 0; - b->recycled = 0; - - b->shadow = NULL; - b = next; - } - - b->temporary = 0; - b->recycled = 0; - b->last_shadow = 0; - - b->shadow = NULL; - - buf->shadow = NULL; -} - - -ngx_int_t -ngx_event_pipe_add_free_buf(ngx_event_pipe_t *p, ngx_buf_t *b) -{ - ngx_chain_t *cl; - - cl = ngx_alloc_chain_link(p->pool); - if (cl == NULL) { - return NGX_ERROR; - } - - if (p->buf_to_file && b->start == p->buf_to_file->start) { - b->pos = p->buf_to_file->last; - b->last = p->buf_to_file->last; - - } else { - b->pos = b->start; - b->last = b->start; - } - - b->shadow = NULL; - - cl->buf = b; - - if (p->free_raw_bufs == NULL) { - p->free_raw_bufs = cl; - cl->next = NULL; - - return NGX_OK; - } - - if (p->free_raw_bufs->buf->pos == p->free_raw_bufs->buf->last) { - - /* add the free buf to the list start */ - - cl->next = p->free_raw_bufs; - p->free_raw_bufs = cl; - - return NGX_OK; - } - - /* the first free buf is partially filled, thus add the free buf after it */ - - cl->next = p->free_raw_bufs->next; - p->free_raw_bufs->next = cl; - - return NGX_OK; -} - - -static ngx_int_t -ngx_event_pipe_drain_chains(ngx_event_pipe_t *p) -{ - ngx_chain_t *cl, *tl; - - for ( ;; ) { - if (p->busy) { - cl = p->busy; - p->busy = NULL; - - } else if (p->out) { - cl = p->out; - p->out = NULL; - - } else if (p->in) { - cl = p->in; - p->in = NULL; - - } else { - return NGX_OK; - } - - while (cl) { - if (cl->buf->last_shadow) { - if (ngx_event_pipe_add_free_buf(p, cl->buf->shadow) != NGX_OK) { - return NGX_ABORT; - } - - cl->buf->last_shadow = 0; - } - - cl->buf->shadow = NULL; - tl = cl->next; - cl->next = p->free; - p->free = cl; - cl = tl; - } - } -} diff --git a/src/deps/src/nginx-1.30.3/src/event/ngx_event_pipe.h b/src/deps/src/nginx-1.30.3/src/event/ngx_event_pipe.h deleted file mode 100644 index 10a3340277..0000000000 --- a/src/deps/src/nginx-1.30.3/src/event/ngx_event_pipe.h +++ /dev/null @@ -1,107 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#ifndef _NGX_EVENT_PIPE_H_INCLUDED_ -#define _NGX_EVENT_PIPE_H_INCLUDED_ - - -#include -#include -#include - - -typedef struct ngx_event_pipe_s ngx_event_pipe_t; - -typedef ngx_int_t (*ngx_event_pipe_input_filter_pt)(ngx_event_pipe_t *p, - ngx_buf_t *buf); -typedef ngx_int_t (*ngx_event_pipe_output_filter_pt)(void *data, - ngx_chain_t *chain); - - -struct ngx_event_pipe_s { - ngx_connection_t *upstream; - ngx_connection_t *downstream; - - ngx_chain_t *free_raw_bufs; - ngx_chain_t *in; - ngx_chain_t **last_in; - - ngx_chain_t *writing; - - ngx_chain_t *out; - ngx_chain_t *free; - ngx_chain_t *busy; - - /* - * the input filter i.e. that moves HTTP/1.1 chunks - * from the raw bufs to an incoming chain - */ - - ngx_event_pipe_input_filter_pt input_filter; - void *input_ctx; - - ngx_event_pipe_output_filter_pt output_filter; - void *output_ctx; - -#if (NGX_THREADS || NGX_COMPAT) - ngx_int_t (*thread_handler)(ngx_thread_task_t *task, - ngx_file_t *file); - void *thread_ctx; - ngx_thread_task_t *thread_task; -#endif - - unsigned read:1; - unsigned cacheable:1; - unsigned single_buf:1; - unsigned free_bufs:1; - unsigned upstream_done:1; - unsigned upstream_error:1; - unsigned upstream_eof:1; - unsigned upstream_blocked:1; - unsigned downstream_done:1; - unsigned downstream_error:1; - unsigned cyclic_temp_file:1; - unsigned aio:1; - - ngx_int_t allocated; - ngx_bufs_t bufs; - ngx_buf_tag_t tag; - - ssize_t busy_size; - - off_t read_length; - off_t length; - - off_t max_temp_file_size; - ssize_t temp_file_write_size; - - ngx_msec_t read_timeout; - ngx_msec_t send_timeout; - ssize_t send_lowat; - - ngx_pool_t *pool; - ngx_log_t *log; - - ngx_chain_t *preread_bufs; - size_t preread_size; - ngx_buf_t *buf_to_file; - - size_t limit_rate; - time_t start_sec; - - ngx_temp_file_t *temp_file; - - /* STUB */ int num; -}; - - -ngx_int_t ngx_event_pipe(ngx_event_pipe_t *p, ngx_int_t do_write); -ngx_int_t ngx_event_pipe_copy_input_filter(ngx_event_pipe_t *p, ngx_buf_t *buf); -ngx_int_t ngx_event_pipe_add_free_buf(ngx_event_pipe_t *p, ngx_buf_t *b); - - -#endif /* _NGX_EVENT_PIPE_H_INCLUDED_ */ diff --git a/src/deps/src/nginx-1.30.3/src/event/ngx_event_posted.c b/src/deps/src/nginx-1.30.3/src/event/ngx_event_posted.c deleted file mode 100644 index fa575bd87f..0000000000 --- a/src/deps/src/nginx-1.30.3/src/event/ngx_event_posted.c +++ /dev/null @@ -1,60 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#include -#include -#include - - -ngx_queue_t ngx_posted_accept_events; -ngx_queue_t ngx_posted_next_events; -ngx_queue_t ngx_posted_events; - - -void -ngx_event_process_posted(ngx_cycle_t *cycle, ngx_queue_t *posted) -{ - ngx_queue_t *q; - ngx_event_t *ev; - - while (!ngx_queue_empty(posted)) { - - q = ngx_queue_head(posted); - ev = ngx_queue_data(q, ngx_event_t, queue); - - ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0, - "posted event %p", ev); - - ngx_delete_posted_event(ev); - - ev->handler(ev); - } -} - - -void -ngx_event_move_posted_next(ngx_cycle_t *cycle) -{ - ngx_queue_t *q; - ngx_event_t *ev; - - for (q = ngx_queue_head(&ngx_posted_next_events); - q != ngx_queue_sentinel(&ngx_posted_next_events); - q = ngx_queue_next(q)) - { - ev = ngx_queue_data(q, ngx_event_t, queue); - - ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0, - "posted next event %p", ev); - - ev->ready = 1; - ev->available = -1; - } - - ngx_queue_add(&ngx_posted_events, &ngx_posted_next_events); - ngx_queue_init(&ngx_posted_next_events); -} diff --git a/src/deps/src/nginx-1.30.3/src/event/ngx_event_posted.h b/src/deps/src/nginx-1.30.3/src/event/ngx_event_posted.h deleted file mode 100644 index b1a85c4424..0000000000 --- a/src/deps/src/nginx-1.30.3/src/event/ngx_event_posted.h +++ /dev/null @@ -1,50 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#ifndef _NGX_EVENT_POSTED_H_INCLUDED_ -#define _NGX_EVENT_POSTED_H_INCLUDED_ - - -#include -#include -#include - - -#define ngx_post_event(ev, q) \ - \ - if (!(ev)->posted) { \ - (ev)->posted = 1; \ - ngx_queue_insert_tail(q, &(ev)->queue); \ - \ - ngx_log_debug1(NGX_LOG_DEBUG_CORE, (ev)->log, 0, "post event %p", ev);\ - \ - } else { \ - ngx_log_debug1(NGX_LOG_DEBUG_CORE, (ev)->log, 0, \ - "update posted event %p", ev); \ - } - - -#define ngx_delete_posted_event(ev) \ - \ - (ev)->posted = 0; \ - ngx_queue_remove(&(ev)->queue); \ - \ - ngx_log_debug1(NGX_LOG_DEBUG_CORE, (ev)->log, 0, \ - "delete posted event %p", ev); - - - -void ngx_event_process_posted(ngx_cycle_t *cycle, ngx_queue_t *posted); -void ngx_event_move_posted_next(ngx_cycle_t *cycle); - - -extern ngx_queue_t ngx_posted_accept_events; -extern ngx_queue_t ngx_posted_next_events; -extern ngx_queue_t ngx_posted_events; - - -#endif /* _NGX_EVENT_POSTED_H_INCLUDED_ */ diff --git a/src/deps/src/nginx-1.30.3/src/event/ngx_event_timer.c b/src/deps/src/nginx-1.30.3/src/event/ngx_event_timer.c deleted file mode 100644 index 35052bc294..0000000000 --- a/src/deps/src/nginx-1.30.3/src/event/ngx_event_timer.c +++ /dev/null @@ -1,126 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#include -#include -#include - - -ngx_rbtree_t ngx_event_timer_rbtree; -static ngx_rbtree_node_t ngx_event_timer_sentinel; - -/* - * the event timer rbtree may contain the duplicate keys, however, - * it should not be a problem, because we use the rbtree to find - * a minimum timer value only - */ - -ngx_int_t -ngx_event_timer_init(ngx_log_t *log) -{ - ngx_rbtree_init(&ngx_event_timer_rbtree, &ngx_event_timer_sentinel, - ngx_rbtree_insert_timer_value); - - return NGX_OK; -} - - -ngx_msec_t -ngx_event_find_timer(void) -{ - ngx_msec_int_t timer; - ngx_rbtree_node_t *node, *root, *sentinel; - - if (ngx_event_timer_rbtree.root == &ngx_event_timer_sentinel) { - return NGX_TIMER_INFINITE; - } - - root = ngx_event_timer_rbtree.root; - sentinel = ngx_event_timer_rbtree.sentinel; - - node = ngx_rbtree_min(root, sentinel); - - timer = (ngx_msec_int_t) (node->key - ngx_current_msec); - - return (ngx_msec_t) (timer > 0 ? timer : 0); -} - - -void -ngx_event_expire_timers(void) -{ - ngx_event_t *ev; - ngx_rbtree_node_t *node, *root, *sentinel; - - sentinel = ngx_event_timer_rbtree.sentinel; - - for ( ;; ) { - root = ngx_event_timer_rbtree.root; - - if (root == sentinel) { - return; - } - - node = ngx_rbtree_min(root, sentinel); - - /* node->key > ngx_current_msec */ - - if ((ngx_msec_int_t) (node->key - ngx_current_msec) > 0) { - return; - } - - ev = ngx_rbtree_data(node, ngx_event_t, timer); - - ngx_log_debug2(NGX_LOG_DEBUG_EVENT, ev->log, 0, - "event timer del: %d: %M", - ngx_event_ident(ev->data), ev->timer.key); - - ngx_rbtree_delete(&ngx_event_timer_rbtree, &ev->timer); - -#if (NGX_DEBUG) - ev->timer.left = NULL; - ev->timer.right = NULL; - ev->timer.parent = NULL; -#endif - - ev->timer_set = 0; - - ev->timedout = 1; - - ev->handler(ev); - } -} - - -ngx_int_t -ngx_event_no_timers_left(void) -{ - ngx_event_t *ev; - ngx_rbtree_node_t *node, *root, *sentinel; - - sentinel = ngx_event_timer_rbtree.sentinel; - root = ngx_event_timer_rbtree.root; - - if (root == sentinel) { - return NGX_OK; - } - - for (node = ngx_rbtree_min(root, sentinel); - node; - node = ngx_rbtree_next(&ngx_event_timer_rbtree, node)) - { - ev = ngx_rbtree_data(node, ngx_event_t, timer); - - if (!ev->cancelable) { - return NGX_AGAIN; - } - } - - /* only cancelable timers left */ - - return NGX_OK; -} diff --git a/src/deps/src/nginx-1.30.3/src/event/ngx_event_timer.h b/src/deps/src/nginx-1.30.3/src/event/ngx_event_timer.h deleted file mode 100644 index be81b157f4..0000000000 --- a/src/deps/src/nginx-1.30.3/src/event/ngx_event_timer.h +++ /dev/null @@ -1,90 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#ifndef _NGX_EVENT_TIMER_H_INCLUDED_ -#define _NGX_EVENT_TIMER_H_INCLUDED_ - - -#include -#include -#include - - -#define NGX_TIMER_INFINITE (ngx_msec_t) -1 - -#define NGX_TIMER_LAZY_DELAY 300 - - -ngx_int_t ngx_event_timer_init(ngx_log_t *log); -ngx_msec_t ngx_event_find_timer(void); -void ngx_event_expire_timers(void); -ngx_int_t ngx_event_no_timers_left(void); - - -extern ngx_rbtree_t ngx_event_timer_rbtree; - - -static ngx_inline void -ngx_event_del_timer(ngx_event_t *ev) -{ - ngx_log_debug2(NGX_LOG_DEBUG_EVENT, ev->log, 0, - "event timer del: %d: %M", - ngx_event_ident(ev->data), ev->timer.key); - - ngx_rbtree_delete(&ngx_event_timer_rbtree, &ev->timer); - -#if (NGX_DEBUG) - ev->timer.left = NULL; - ev->timer.right = NULL; - ev->timer.parent = NULL; -#endif - - ev->timer_set = 0; -} - - -static ngx_inline void -ngx_event_add_timer(ngx_event_t *ev, ngx_msec_t timer) -{ - ngx_msec_t key; - ngx_msec_int_t diff; - - key = ngx_current_msec + timer; - - if (ev->timer_set) { - - /* - * Use a previous timer value if difference between it and a new - * value is less than NGX_TIMER_LAZY_DELAY milliseconds: this allows - * to minimize the rbtree operations for fast connections. - */ - - diff = (ngx_msec_int_t) (key - ev->timer.key); - - if (ngx_abs(diff) < NGX_TIMER_LAZY_DELAY) { - ngx_log_debug3(NGX_LOG_DEBUG_EVENT, ev->log, 0, - "event timer: %d, old: %M, new: %M", - ngx_event_ident(ev->data), ev->timer.key, key); - return; - } - - ngx_del_timer(ev); - } - - ev->timer.key = key; - - ngx_log_debug3(NGX_LOG_DEBUG_EVENT, ev->log, 0, - "event timer add: %d: %M:%M", - ngx_event_ident(ev->data), timer, ev->timer.key); - - ngx_rbtree_insert(&ngx_event_timer_rbtree, &ev->timer); - - ev->timer_set = 1; -} - - -#endif /* _NGX_EVENT_TIMER_H_INCLUDED_ */ diff --git a/src/deps/src/nginx-1.30.3/src/event/ngx_event_udp.c b/src/deps/src/nginx-1.30.3/src/event/ngx_event_udp.c deleted file mode 100644 index 43fa621b0c..0000000000 --- a/src/deps/src/nginx-1.30.3/src/event/ngx_event_udp.c +++ /dev/null @@ -1,590 +0,0 @@ - -/* - * Copyright (C) Roman Arutyunyan - * Copyright (C) Nginx, Inc. - */ - - -#include -#include -#include - - -#if !(NGX_WIN32) - -static void ngx_close_accepted_udp_connection(ngx_connection_t *c); -static ssize_t ngx_udp_shared_recv(ngx_connection_t *c, u_char *buf, - size_t size); -static ngx_int_t ngx_insert_udp_connection(ngx_connection_t *c); -static ngx_connection_t *ngx_lookup_udp_connection(ngx_listening_t *ls, - struct sockaddr *sockaddr, socklen_t socklen, - struct sockaddr *local_sockaddr, socklen_t local_socklen); - - -void -ngx_event_recvmsg(ngx_event_t *ev) -{ - ssize_t n; - ngx_buf_t buf; - ngx_log_t *log; - ngx_err_t err; - socklen_t socklen, local_socklen; - ngx_event_t *rev, *wev; - struct iovec iov[1]; - struct msghdr msg; - ngx_sockaddr_t sa, lsa; - struct sockaddr *sockaddr, *local_sockaddr; - ngx_listening_t *ls; - ngx_event_conf_t *ecf; - ngx_connection_t *c, *lc; - static u_char buffer[65535]; - -#if (NGX_HAVE_ADDRINFO_CMSG) - u_char msg_control[CMSG_SPACE(sizeof(ngx_addrinfo_t))]; -#endif - - if (ev->timedout) { - if (ngx_enable_accept_events((ngx_cycle_t *) ngx_cycle) != NGX_OK) { - return; - } - - ev->timedout = 0; - } - - ecf = ngx_event_get_conf(ngx_cycle->conf_ctx, ngx_event_core_module); - - if (!(ngx_event_flags & NGX_USE_KQUEUE_EVENT)) { - ev->available = ecf->multi_accept; - } - - lc = ev->data; - ls = lc->listening; - ev->ready = 0; - - ngx_log_debug2(NGX_LOG_DEBUG_EVENT, ev->log, 0, - "recvmsg on %V, ready: %d", &ls->addr_text, ev->available); - - do { - ngx_memzero(&msg, sizeof(struct msghdr)); - - iov[0].iov_base = (void *) buffer; - iov[0].iov_len = sizeof(buffer); - - msg.msg_name = &sa; - msg.msg_namelen = sizeof(ngx_sockaddr_t); - msg.msg_iov = iov; - msg.msg_iovlen = 1; - -#if (NGX_HAVE_ADDRINFO_CMSG) - if (ls->wildcard) { - msg.msg_control = &msg_control; - msg.msg_controllen = sizeof(msg_control); - - ngx_memzero(&msg_control, sizeof(msg_control)); - } -#endif - - n = recvmsg(lc->fd, &msg, 0); - - if (n == -1) { - err = ngx_socket_errno; - - if (err == NGX_EAGAIN) { - ngx_log_debug0(NGX_LOG_DEBUG_EVENT, ev->log, err, - "recvmsg() not ready"); - return; - } - - ngx_log_error(NGX_LOG_ALERT, ev->log, err, "recvmsg() failed"); - - return; - } - -#if (NGX_HAVE_ADDRINFO_CMSG) - if (msg.msg_flags & (MSG_TRUNC|MSG_CTRUNC)) { - ngx_log_error(NGX_LOG_ALERT, ev->log, 0, - "recvmsg() truncated data"); - continue; - } -#endif - - sockaddr = msg.msg_name; - socklen = msg.msg_namelen; - - if (socklen > (socklen_t) sizeof(ngx_sockaddr_t)) { - socklen = sizeof(ngx_sockaddr_t); - } - - if (socklen == 0) { - - /* - * on Linux recvmsg() returns zero msg_namelen - * when receiving packets from unbound AF_UNIX sockets - */ - - socklen = sizeof(struct sockaddr); - ngx_memzero(&sa, sizeof(struct sockaddr)); - sa.sockaddr.sa_family = ls->sockaddr->sa_family; - } - - local_sockaddr = ls->sockaddr; - local_socklen = ls->socklen; - -#if (NGX_HAVE_ADDRINFO_CMSG) - - if (ls->wildcard) { - struct cmsghdr *cmsg; - - ngx_memcpy(&lsa, local_sockaddr, local_socklen); - local_sockaddr = &lsa.sockaddr; - - for (cmsg = CMSG_FIRSTHDR(&msg); - cmsg != NULL; - cmsg = CMSG_NXTHDR(&msg, cmsg)) - { - if (ngx_get_srcaddr_cmsg(cmsg, local_sockaddr) == NGX_OK) { - break; - } - } - } - -#endif - - c = ngx_lookup_udp_connection(ls, sockaddr, socklen, local_sockaddr, - local_socklen); - - if (c) { - -#if (NGX_DEBUG) - if (c->log->log_level & NGX_LOG_DEBUG_EVENT) { - ngx_log_handler_pt handler; - - handler = c->log->handler; - c->log->handler = NULL; - - ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0, - "recvmsg: fd:%d n:%z", c->fd, n); - - c->log->handler = handler; - } -#endif - - ngx_memzero(&buf, sizeof(ngx_buf_t)); - - buf.pos = buffer; - buf.last = buffer + n; - - rev = c->read; - - c->udp->buffer = &buf; - - rev->ready = 1; - rev->active = 0; - - rev->handler(rev); - - if (c->udp) { - c->udp->buffer = NULL; - } - - rev->ready = 0; - rev->active = 1; - - goto next; - } - -#if (NGX_STAT_STUB) - (void) ngx_atomic_fetch_add(ngx_stat_accepted, 1); -#endif - - ngx_accept_disabled = ngx_cycle->connection_n / 8 - - ngx_cycle->free_connection_n; - - c = ngx_get_connection(lc->fd, ev->log); - if (c == NULL) { - return; - } - - c->shared = 1; - c->type = SOCK_DGRAM; - c->socklen = socklen; - -#if (NGX_STAT_STUB) - (void) ngx_atomic_fetch_add(ngx_stat_active, 1); -#endif - - c->pool = ngx_create_pool(ls->pool_size, ev->log); - if (c->pool == NULL) { - ngx_close_accepted_udp_connection(c); - return; - } - - c->sockaddr = ngx_palloc(c->pool, socklen); - if (c->sockaddr == NULL) { - ngx_close_accepted_udp_connection(c); - return; - } - - ngx_memcpy(c->sockaddr, sockaddr, socklen); - - log = ngx_palloc(c->pool, sizeof(ngx_log_t)); - if (log == NULL) { - ngx_close_accepted_udp_connection(c); - return; - } - - *log = ls->log; - - c->recv = ngx_udp_shared_recv; - c->send = ngx_udp_send; - c->send_chain = ngx_udp_send_chain; - - c->need_flush_buf = 1; - - c->log = log; - c->pool->log = log; - c->listening = ls; - - if (local_sockaddr == &lsa.sockaddr) { - local_sockaddr = ngx_palloc(c->pool, local_socklen); - if (local_sockaddr == NULL) { - ngx_close_accepted_udp_connection(c); - return; - } - - ngx_memcpy(local_sockaddr, &lsa, local_socklen); - } - - c->local_sockaddr = local_sockaddr; - c->local_socklen = local_socklen; - - c->buffer = ngx_create_temp_buf(c->pool, n); - if (c->buffer == NULL) { - ngx_close_accepted_udp_connection(c); - return; - } - - c->buffer->last = ngx_cpymem(c->buffer->last, buffer, n); - - rev = c->read; - wev = c->write; - - rev->active = 1; - wev->ready = 1; - - rev->log = log; - wev->log = log; - - /* - * TODO: MT: - ngx_atomic_fetch_add() - * or protection by critical section or light mutex - * - * TODO: MP: - allocated in a shared memory - * - ngx_atomic_fetch_add() - * or protection by critical section or light mutex - */ - - c->number = ngx_atomic_fetch_add(ngx_connection_counter, 1); - - c->start_time = ngx_current_msec; - -#if (NGX_STAT_STUB) - (void) ngx_atomic_fetch_add(ngx_stat_handled, 1); -#endif - - if (ls->addr_ntop) { - c->addr_text.data = ngx_pnalloc(c->pool, ls->addr_text_max_len); - if (c->addr_text.data == NULL) { - ngx_close_accepted_udp_connection(c); - return; - } - - c->addr_text.len = ngx_sock_ntop(c->sockaddr, c->socklen, - c->addr_text.data, - ls->addr_text_max_len, 0); - if (c->addr_text.len == 0) { - ngx_close_accepted_udp_connection(c); - return; - } - } - -#if (NGX_DEBUG) - { - ngx_str_t addr; - u_char text[NGX_SOCKADDR_STRLEN]; - - ngx_debug_accepted_connection(ecf, c); - - if (log->log_level & NGX_LOG_DEBUG_EVENT) { - addr.data = text; - addr.len = ngx_sock_ntop(c->sockaddr, c->socklen, text, - NGX_SOCKADDR_STRLEN, 1); - - ngx_log_debug4(NGX_LOG_DEBUG_EVENT, log, 0, - "*%uA recvmsg: %V fd:%d n:%z", - c->number, &addr, c->fd, n); - } - - } -#endif - - if (ngx_insert_udp_connection(c) != NGX_OK) { - ngx_close_accepted_udp_connection(c); - return; - } - - log->data = NULL; - log->handler = NULL; - - ls->handler(c); - - next: - - if (ngx_event_flags & NGX_USE_KQUEUE_EVENT) { - ev->available -= n; - } - - } while (ev->available); -} - - -static void -ngx_close_accepted_udp_connection(ngx_connection_t *c) -{ - ngx_free_connection(c); - - c->fd = (ngx_socket_t) -1; - - if (c->pool) { - ngx_destroy_pool(c->pool); - } - -#if (NGX_STAT_STUB) - (void) ngx_atomic_fetch_add(ngx_stat_active, -1); -#endif -} - - -static ssize_t -ngx_udp_shared_recv(ngx_connection_t *c, u_char *buf, size_t size) -{ - ssize_t n; - ngx_buf_t *b; - - if (c->udp == NULL || c->udp->buffer == NULL) { - return NGX_AGAIN; - } - - b = c->udp->buffer; - - n = ngx_min(b->last - b->pos, (ssize_t) size); - - ngx_memcpy(buf, b->pos, n); - - c->udp->buffer = NULL; - - c->read->ready = 0; - c->read->active = 1; - - return n; -} - - -void -ngx_udp_rbtree_insert_value(ngx_rbtree_node_t *temp, - ngx_rbtree_node_t *node, ngx_rbtree_node_t *sentinel) -{ - ngx_int_t rc; - ngx_connection_t *c, *ct; - ngx_rbtree_node_t **p; - ngx_udp_connection_t *udp, *udpt; - - for ( ;; ) { - - if (node->key < temp->key) { - - p = &temp->left; - - } else if (node->key > temp->key) { - - p = &temp->right; - - } else { /* node->key == temp->key */ - - udp = (ngx_udp_connection_t *) node; - c = udp->connection; - - udpt = (ngx_udp_connection_t *) temp; - ct = udpt->connection; - - rc = ngx_memn2cmp(udp->key.data, udpt->key.data, - udp->key.len, udpt->key.len); - - if (rc == 0 && c->listening->wildcard) { - rc = ngx_cmp_sockaddr(c->local_sockaddr, c->local_socklen, - ct->local_sockaddr, ct->local_socklen, 1); - } - - p = (rc < 0) ? &temp->left : &temp->right; - } - - if (*p == sentinel) { - break; - } - - temp = *p; - } - - *p = node; - node->parent = temp; - node->left = sentinel; - node->right = sentinel; - ngx_rbt_red(node); -} - - -static ngx_int_t -ngx_insert_udp_connection(ngx_connection_t *c) -{ - uint32_t hash; - ngx_pool_cleanup_t *cln; - ngx_udp_connection_t *udp; - - if (c->udp) { - return NGX_OK; - } - - udp = ngx_pcalloc(c->pool, sizeof(ngx_udp_connection_t)); - if (udp == NULL) { - return NGX_ERROR; - } - - udp->connection = c; - - ngx_crc32_init(hash); - ngx_crc32_update(&hash, (u_char *) c->sockaddr, c->socklen); - - if (c->listening->wildcard) { - ngx_crc32_update(&hash, (u_char *) c->local_sockaddr, c->local_socklen); - } - - ngx_crc32_final(hash); - - udp->node.key = hash; - udp->key.data = (u_char *) c->sockaddr; - udp->key.len = c->socklen; - - cln = ngx_pool_cleanup_add(c->pool, 0); - if (cln == NULL) { - return NGX_ERROR; - } - - cln->data = c; - cln->handler = ngx_delete_udp_connection; - - ngx_rbtree_insert(&c->listening->rbtree, &udp->node); - - c->udp = udp; - - return NGX_OK; -} - - -void -ngx_delete_udp_connection(void *data) -{ - ngx_connection_t *c = data; - - if (c->udp == NULL) { - return; - } - - ngx_rbtree_delete(&c->listening->rbtree, &c->udp->node); - - c->udp = NULL; -} - - -static ngx_connection_t * -ngx_lookup_udp_connection(ngx_listening_t *ls, struct sockaddr *sockaddr, - socklen_t socklen, struct sockaddr *local_sockaddr, socklen_t local_socklen) -{ - uint32_t hash; - ngx_int_t rc; - ngx_connection_t *c; - ngx_rbtree_node_t *node, *sentinel; - ngx_udp_connection_t *udp; - -#if (NGX_HAVE_UNIX_DOMAIN) - - if (sockaddr->sa_family == AF_UNIX) { - struct sockaddr_un *saun = (struct sockaddr_un *) sockaddr; - - if (socklen <= (socklen_t) offsetof(struct sockaddr_un, sun_path) - || saun->sun_path[0] == '\0') - { - ngx_log_debug0(NGX_LOG_DEBUG_EVENT, ngx_cycle->log, 0, - "unbound unix socket"); - return NULL; - } - } - -#endif - - node = ls->rbtree.root; - sentinel = ls->rbtree.sentinel; - - ngx_crc32_init(hash); - ngx_crc32_update(&hash, (u_char *) sockaddr, socklen); - - if (ls->wildcard) { - ngx_crc32_update(&hash, (u_char *) local_sockaddr, local_socklen); - } - - ngx_crc32_final(hash); - - while (node != sentinel) { - - if (hash < node->key) { - node = node->left; - continue; - } - - if (hash > node->key) { - node = node->right; - continue; - } - - /* hash == node->key */ - - udp = (ngx_udp_connection_t *) node; - - c = udp->connection; - - rc = ngx_cmp_sockaddr(sockaddr, socklen, - c->sockaddr, c->socklen, 1); - - if (rc == 0 && ls->wildcard) { - rc = ngx_cmp_sockaddr(local_sockaddr, local_socklen, - c->local_sockaddr, c->local_socklen, 1); - } - - if (rc == 0) { - return c; - } - - node = (rc < 0) ? node->left : node->right; - } - - return NULL; -} - -#else - -void -ngx_delete_udp_connection(void *data) -{ - return; -} - -#endif diff --git a/src/deps/src/nginx-1.30.3/src/event/ngx_event_udp.h b/src/deps/src/nginx-1.30.3/src/event/ngx_event_udp.h deleted file mode 100644 index e5ddf1b317..0000000000 --- a/src/deps/src/nginx-1.30.3/src/event/ngx_event_udp.h +++ /dev/null @@ -1,66 +0,0 @@ - -/* - * Copyright (C) Nginx, Inc. - */ - - -#ifndef _NGX_EVENT_UDP_H_INCLUDED_ -#define _NGX_EVENT_UDP_H_INCLUDED_ - - -#include -#include - - -#if !(NGX_WIN32) - -#if ((NGX_HAVE_MSGHDR_MSG_CONTROL) \ - && (NGX_HAVE_IP_SENDSRCADDR || NGX_HAVE_IP_RECVDSTADDR \ - || NGX_HAVE_IP_PKTINFO \ - || (NGX_HAVE_INET6 && NGX_HAVE_IPV6_RECVPKTINFO))) -#define NGX_HAVE_ADDRINFO_CMSG 1 - -#endif - - -struct ngx_udp_connection_s { - ngx_rbtree_node_t node; - ngx_connection_t *connection; - ngx_buf_t *buffer; - ngx_str_t key; -}; - - -#if (NGX_HAVE_ADDRINFO_CMSG) - -typedef union { -#if (NGX_HAVE_IP_SENDSRCADDR || NGX_HAVE_IP_RECVDSTADDR) - struct in_addr addr; -#endif - -#if (NGX_HAVE_IP_PKTINFO) - struct in_pktinfo pkt; -#endif - -#if (NGX_HAVE_INET6 && NGX_HAVE_IPV6_RECVPKTINFO) - struct in6_pktinfo pkt6; -#endif -} ngx_addrinfo_t; - -size_t ngx_set_srcaddr_cmsg(struct cmsghdr *cmsg, - struct sockaddr *local_sockaddr); -ngx_int_t ngx_get_srcaddr_cmsg(struct cmsghdr *cmsg, - struct sockaddr *local_sockaddr); - -#endif - -void ngx_event_recvmsg(ngx_event_t *ev); -ssize_t ngx_sendmsg(ngx_connection_t *c, struct msghdr *msg, int flags); -void ngx_udp_rbtree_insert_value(ngx_rbtree_node_t *temp, - ngx_rbtree_node_t *node, ngx_rbtree_node_t *sentinel); -#endif - -void ngx_delete_udp_connection(void *data); - - -#endif /* _NGX_EVENT_UDP_H_INCLUDED_ */ diff --git a/src/deps/src/nginx-1.30.3/src/event/quic/bpf/bpfgen.sh b/src/deps/src/nginx-1.30.3/src/event/quic/bpf/bpfgen.sh deleted file mode 100644 index 78cbdac4d9..0000000000 --- a/src/deps/src/nginx-1.30.3/src/event/quic/bpf/bpfgen.sh +++ /dev/null @@ -1,113 +0,0 @@ -#!/bin/bash - -export LANG=C - -set -e - -if [ $# -lt 1 ]; then - echo "Usage: PROGNAME=foo LICENSE=bar $0 " - exit 1 -fi - - -self=$0 -filename=$1 -funcname=$PROGNAME - -generate_head() -{ - cat << END -/* AUTO-GENERATED, DO NOT EDIT. */ - -#include -#include - -#include "ngx_bpf.h" - - -END -} - -generate_tail() -{ - cat << END - -ngx_bpf_program_t $PROGNAME = { - .relocs = bpf_reloc_prog_$funcname, - .nrelocs = sizeof(bpf_reloc_prog_$funcname) - / sizeof(bpf_reloc_prog_$funcname[0]), - .ins = bpf_insn_prog_$funcname, - .nins = sizeof(bpf_insn_prog_$funcname) - / sizeof(bpf_insn_prog_$funcname[0]), - .license = "$LICENSE", - .type = BPF_PROG_TYPE_SK_REUSEPORT, -}; - -END -} - -process_relocations() -{ - echo "static ngx_bpf_reloc_t bpf_reloc_prog_$funcname[] = {" - - objdump -r $filename | awk '{ - - if (enabled && $NF > 0) { - off = strtonum(sprintf("0x%s", $1)); - name = $3; - - printf(" { \"%s\", %d },\n", name, off/8); - } - - if ($1 == "OFFSET") { - enabled=1; - } -}' - echo "};" - echo -} - -process_section() -{ - echo "static struct bpf_insn bpf_insn_prog_$funcname[] = {" - echo " /* opcode dst src offset imm */" - - section_info=$(objdump -h $filename --section=$funcname | grep "1 $funcname") - - # dd doesn't know hex - length=$(printf "%d" 0x$(echo $section_info | cut -d ' ' -f3)) - offset=$(printf "%d" 0x$(echo $section_info | cut -d ' ' -f6)) - - for ins in $(dd if="$filename" bs=1 count=$length skip=$offset status=none | xxd -p -c 8) - do - opcode=0x${ins:0:2} - srcdst=0x${ins:2:2} - - # bytes are dumped in LE order - offset=0x${ins:6:2}${ins:4:2} # short - immedi=0x${ins:14:2}${ins:12:2}${ins:10:2}${ins:8:2} # int - - dst="$(($srcdst & 0xF))" - src="$(($srcdst & 0xF0))" - src="$(($src >> 4))" - - opcode=$(printf "0x%x" $opcode) - dst=$(printf "BPF_REG_%d" $dst) - src=$(printf "BPF_REG_%d" $src) - offset=$(printf "%d" $offset) - immedi=$(printf "0x%x" $immedi) - - printf " { %4s, %11s, %11s, (int16_t) %6s, %10s },\n" $opcode $dst $src $offset $immedi - done - -cat << END -}; - -END -} - -generate_head -process_relocations -process_section -generate_tail - diff --git a/src/deps/src/nginx-1.30.3/src/event/quic/bpf/makefile b/src/deps/src/nginx-1.30.3/src/event/quic/bpf/makefile deleted file mode 100644 index 277aa31516..0000000000 --- a/src/deps/src/nginx-1.30.3/src/event/quic/bpf/makefile +++ /dev/null @@ -1,30 +0,0 @@ -CFLAGS=-O2 -Wall - -LICENSE=BSD - -PROGNAME=ngx_quic_reuseport_helper -RESULT=ngx_event_quic_bpf_code -DEST=../$(RESULT).c - -all: $(RESULT) - -$(RESULT): $(PROGNAME).o - LICENSE=$(LICENSE) PROGNAME=$(PROGNAME) bash ./bpfgen.sh $< > $@ - -DEFS=-DPROGNAME=\"$(PROGNAME)\" \ - -DLICENSE_$(LICENSE) \ - -DLICENSE=\"$(LICENSE)\" \ - -$(PROGNAME).o: $(PROGNAME).c - clang $(CFLAGS) $(DEFS) -target bpf -c $< -o $@ - -install: $(RESULT) - cp $(RESULT) $(DEST) - -clean: - @rm -f $(RESULT) *.o - -debug: $(PROGNAME).o - llvm-objdump -S --no-show-raw-insn $< - -.DELETE_ON_ERROR: diff --git a/src/deps/src/nginx-1.30.3/src/event/quic/bpf/ngx_quic_reuseport_helper.c b/src/deps/src/nginx-1.30.3/src/event/quic/bpf/ngx_quic_reuseport_helper.c deleted file mode 100644 index 51b78f0436..0000000000 --- a/src/deps/src/nginx-1.30.3/src/event/quic/bpf/ngx_quic_reuseport_helper.c +++ /dev/null @@ -1,140 +0,0 @@ -#include -#include -#include -#include -/* - * the bpf_helpers.h is not included into linux-headers, only available - * with kernel sources in "tools/lib/bpf/bpf_helpers.h" or in libbpf. - */ -#include - - -#if !defined(SEC) -#define SEC(NAME) __attribute__((section(NAME), used)) -#endif - - -#if defined(LICENSE_GPL) - -/* - * To see debug: - * - * echo 1 > /sys/kernel/debug/tracing/events/bpf_trace/enable - * cat /sys/kernel/debug/tracing/trace_pipe - * echo 0 > /sys/kernel/debug/tracing/events/bpf_trace/enable - */ - -#define debugmsg(fmt, ...) \ -do { \ - char __buf[] = fmt; \ - bpf_trace_printk(__buf, sizeof(__buf), ##__VA_ARGS__); \ -} while (0) - -#else - -#define debugmsg(fmt, ...) - -#endif - -char _license[] SEC("license") = LICENSE; - -/*****************************************************************************/ - -#define NGX_QUIC_PKT_LONG 0x80 /* header form */ -#define NGX_QUIC_SERVER_CID_LEN 20 - - -#define advance_data(nbytes) \ - offset += nbytes; \ - if (start + offset > end) { \ - debugmsg("cannot read %ld bytes at offset %ld", nbytes, offset); \ - goto failed; \ - } \ - data = start + offset - 1; - - -#define ngx_quic_parse_uint64(p) \ - (((__u64)(p)[0] << 56) | \ - ((__u64)(p)[1] << 48) | \ - ((__u64)(p)[2] << 40) | \ - ((__u64)(p)[3] << 32) | \ - ((__u64)(p)[4] << 24) | \ - ((__u64)(p)[5] << 16) | \ - ((__u64)(p)[6] << 8) | \ - ((__u64)(p)[7])) - -/* - * actual map object is created by the "bpf" system call, - * all pointers to this variable are replaced by the bpf loader - */ -extern int ngx_quic_sockmap; - - -SEC(PROGNAME) -int ngx_quic_select_socket_by_dcid(struct sk_reuseport_md *ctx) -{ - int rc; - __u64 key; - size_t len, offset; - unsigned char *start, *end, *data, *dcid; - - start = ctx->data; - end = (unsigned char *) ctx->data_end; - offset = 0; - - advance_data(sizeof(struct udphdr)); /* data at UDP header */ - advance_data(1); /* data at QUIC flags */ - - if (data[0] & NGX_QUIC_PKT_LONG) { - - advance_data(4); /* data at QUIC version */ - advance_data(1); /* data at DCID len */ - - len = data[0]; /* read DCID length */ - - if (len < 8) { - /* it's useless to search for key in such short DCID */ - return SK_PASS; - } - - } else { - len = NGX_QUIC_SERVER_CID_LEN; - } - - dcid = &data[1]; - advance_data(len); /* we expect the packet to have full DCID */ - - /* make verifier happy */ - if (dcid + sizeof(__u64) > end) { - goto failed; - } - - key = ngx_quic_parse_uint64(dcid); - - rc = bpf_sk_select_reuseport(ctx, &ngx_quic_sockmap, &key, 0); - - switch (rc) { - case 0: - debugmsg("nginx quic socket selected by key 0x%llx", key); - return SK_PASS; - - /* kernel returns positive error numbers, errno.h defines positive */ - case -ENOENT: - debugmsg("nginx quic default route for key 0x%llx", key); - /* let the default reuseport logic decide which socket to choose */ - return SK_PASS; - - default: - debugmsg("nginx quic bpf_sk_select_reuseport err: %d key 0x%llx", - rc, key); - goto failed; - } - -failed: - /* - * SK_DROP will generate ICMP, but we may want to process "invalid" packet - * in userspace quic to investigate further and finally react properly - * (maybe ignore, maybe send something in response or close connection) - */ - return SK_PASS; -} diff --git a/src/deps/src/nginx-1.30.3/src/event/quic/ngx_event_quic.c b/src/deps/src/nginx-1.30.3/src/event/quic/ngx_event_quic.c deleted file mode 100644 index 09ce4b81eb..0000000000 --- a/src/deps/src/nginx-1.30.3/src/event/quic/ngx_event_quic.c +++ /dev/null @@ -1,1522 +0,0 @@ - -/* - * Copyright (C) Nginx, Inc. - */ - - -#include -#include -#include -#include -#include - - -static ngx_quic_connection_t *ngx_quic_new_connection(ngx_connection_t *c, - ngx_quic_conf_t *conf, ngx_quic_header_t *pkt); -static ngx_int_t ngx_quic_handle_stateless_reset(ngx_connection_t *c, - ngx_quic_header_t *pkt); -static void ngx_quic_input_handler(ngx_event_t *rev); -static void ngx_quic_close_handler(ngx_event_t *ev); - -static ngx_int_t ngx_quic_handle_datagram(ngx_connection_t *c, ngx_buf_t *b, - ngx_quic_conf_t *conf); -static ngx_int_t ngx_quic_handle_packet(ngx_connection_t *c, - ngx_quic_conf_t *conf, ngx_quic_header_t *pkt); -static ngx_int_t ngx_quic_handle_payload(ngx_connection_t *c, - ngx_quic_header_t *pkt); -static ngx_int_t ngx_quic_check_csid(ngx_quic_connection_t *qc, - ngx_quic_header_t *pkt); -static ngx_int_t ngx_quic_handle_frames(ngx_connection_t *c, - ngx_quic_header_t *pkt); - -static void ngx_quic_push_handler(ngx_event_t *ev); - - -static ngx_core_module_t ngx_quic_module_ctx = { - ngx_string("quic"), - NULL, - NULL -}; - - -ngx_module_t ngx_quic_module = { - NGX_MODULE_V1, - &ngx_quic_module_ctx, /* module context */ - NULL, /* module directives */ - NGX_CORE_MODULE, /* module type */ - NULL, /* init master */ - NULL, /* init module */ - NULL, /* init process */ - NULL, /* init thread */ - NULL, /* exit thread */ - NULL, /* exit process */ - NULL, /* exit master */ - NGX_MODULE_V1_PADDING -}; - - -#if (NGX_DEBUG) - -void -ngx_quic_connstate_dbg(ngx_connection_t *c) -{ - u_char *p, *last; - ngx_quic_connection_t *qc; - u_char buf[NGX_MAX_ERROR_STR]; - - p = buf; - last = p + sizeof(buf); - - qc = ngx_quic_get_connection(c); - - p = ngx_slprintf(p, last, "state:"); - - if (qc) { - - if (qc->error) { - p = ngx_slprintf(p, last, "%s", qc->error_app ? " app" : ""); - p = ngx_slprintf(p, last, " error:%ui", qc->error); - - if (qc->error_reason) { - p = ngx_slprintf(p, last, " \"%s\"", qc->error_reason); - } - } - - p = ngx_slprintf(p, last, "%s", qc->shutdown ? " shutdown" : ""); - p = ngx_slprintf(p, last, "%s", qc->closing ? " closing" : ""); - p = ngx_slprintf(p, last, "%s", qc->draining ? " draining" : ""); - p = ngx_slprintf(p, last, "%s", qc->key_phase ? " kp" : ""); - - } else { - p = ngx_slprintf(p, last, " early"); - } - - if (c->read->timer_set) { - p = ngx_slprintf(p, last, - qc && qc->send_timer_set ? " send:%M" : " read:%M", - c->read->timer.key - ngx_current_msec); - } - - if (qc) { - - if (qc->push.timer_set) { - p = ngx_slprintf(p, last, " push:%M", - qc->push.timer.key - ngx_current_msec); - } - - if (qc->pto.timer_set) { - p = ngx_slprintf(p, last, " pto:%M", - qc->pto.timer.key - ngx_current_msec); - } - - if (qc->close.timer_set) { - p = ngx_slprintf(p, last, " close:%M", - qc->close.timer.key - ngx_current_msec); - } - } - - ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0, - "quic %*s", p - buf, buf); -} - -#endif - - -ngx_int_t -ngx_quic_apply_transport_params(ngx_connection_t *c, ngx_quic_tp_t *ctp) -{ - ngx_str_t scid; - ngx_quic_connection_t *qc; - - qc = ngx_quic_get_connection(c); - - scid.data = qc->path->cid->id; - scid.len = qc->path->cid->len; - - if (scid.len != ctp->initial_scid.len - || ngx_memcmp(scid.data, ctp->initial_scid.data, scid.len) != 0) - { - qc->error = NGX_QUIC_ERR_TRANSPORT_PARAMETER_ERROR; - qc->error_reason = "invalid initial_source_connection_id"; - - ngx_log_error(NGX_LOG_INFO, c->log, 0, - "quic client initial_source_connection_id mismatch"); - return NGX_ERROR; - } - - if (ctp->max_udp_payload_size < NGX_QUIC_MIN_INITIAL_SIZE - || ctp->max_udp_payload_size > NGX_QUIC_MAX_UDP_PAYLOAD_SIZE) - { - qc->error = NGX_QUIC_ERR_TRANSPORT_PARAMETER_ERROR; - qc->error_reason = "invalid maximum packet size"; - - ngx_log_error(NGX_LOG_INFO, c->log, 0, - "quic maximum packet size is invalid"); - return NGX_ERROR; - } - - if (ctp->active_connection_id_limit < 2) { - qc->error = NGX_QUIC_ERR_TRANSPORT_PARAMETER_ERROR; - qc->error_reason = "invalid active_connection_id_limit"; - - ngx_log_error(NGX_LOG_INFO, c->log, 0, - "quic active_connection_id_limit is invalid"); - return NGX_ERROR; - } - - if (ctp->ack_delay_exponent > 20) { - qc->error = NGX_QUIC_ERR_TRANSPORT_PARAMETER_ERROR; - qc->error_reason = "invalid ack_delay_exponent"; - - ngx_log_error(NGX_LOG_INFO, c->log, 0, - "quic ack_delay_exponent is invalid"); - return NGX_ERROR; - } - - if (ctp->max_ack_delay >= 16384) { - qc->error = NGX_QUIC_ERR_TRANSPORT_PARAMETER_ERROR; - qc->error_reason = "invalid max_ack_delay"; - - ngx_log_error(NGX_LOG_INFO, c->log, 0, - "quic max_ack_delay is invalid"); - return NGX_ERROR; - } - - if (ctp->max_idle_timeout > 0 - && ctp->max_idle_timeout < qc->tp.max_idle_timeout) - { - qc->tp.max_idle_timeout = ctp->max_idle_timeout; - } - - qc->streams.server_max_streams_bidi = ctp->initial_max_streams_bidi; - qc->streams.server_max_streams_uni = ctp->initial_max_streams_uni; - - ngx_memcpy(&qc->ctp, ctp, sizeof(ngx_quic_tp_t)); - - return NGX_OK; -} - - -void -ngx_quic_run(ngx_connection_t *c, ngx_quic_conf_t *conf) -{ - ngx_int_t rc; - ngx_quic_connection_t *qc; - - ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0, "quic run"); - - rc = ngx_quic_handle_datagram(c, c->buffer, conf); - if (rc != NGX_OK) { - ngx_quic_close_connection(c, rc); - return; - } - - /* quic connection is now created */ - qc = ngx_quic_get_connection(c); - - ngx_add_timer(c->read, qc->tp.max_idle_timeout); - - if (!qc->streams.initialized) { - ngx_add_timer(&qc->close, qc->conf->handshake_timeout); - } - - ngx_quic_connstate_dbg(c); - - c->read->handler = ngx_quic_input_handler; - - return; -} - - -static ngx_quic_connection_t * -ngx_quic_new_connection(ngx_connection_t *c, ngx_quic_conf_t *conf, - ngx_quic_header_t *pkt) -{ - ngx_uint_t i; - ngx_quic_tp_t *ctp; - ngx_quic_connection_t *qc; - - qc = ngx_pcalloc(c->pool, sizeof(ngx_quic_connection_t)); - if (qc == NULL) { - return NULL; - } - - qc->keys = ngx_pcalloc(c->pool, sizeof(ngx_quic_keys_t)); - if (qc->keys == NULL) { - return NULL; - } - - qc->version = pkt->version; - - ngx_rbtree_init(&qc->streams.tree, &qc->streams.sentinel, - ngx_quic_rbtree_insert_stream); - - for (i = 0; i < NGX_QUIC_SEND_CTX_LAST; i++) { - ngx_queue_init(&qc->send_ctx[i].frames); - ngx_queue_init(&qc->send_ctx[i].sending); - ngx_queue_init(&qc->send_ctx[i].sent); - qc->send_ctx[i].largest_pn = NGX_QUIC_UNSET_PN; - qc->send_ctx[i].largest_ack = NGX_QUIC_UNSET_PN; - qc->send_ctx[i].largest_range = NGX_QUIC_UNSET_PN; - qc->send_ctx[i].pending_ack = NGX_QUIC_UNSET_PN; - } - - qc->send_ctx[0].level = NGX_QUIC_ENCRYPTION_INITIAL; - qc->send_ctx[1].level = NGX_QUIC_ENCRYPTION_HANDSHAKE; - qc->send_ctx[2].level = NGX_QUIC_ENCRYPTION_APPLICATION; - - ngx_queue_init(&qc->free_frames); - - ngx_quic_init_rtt(qc); - - qc->pto.log = c->log; - qc->pto.data = c; - qc->pto.handler = ngx_quic_pto_handler; - - qc->push.log = c->log; - qc->push.data = c; - qc->push.handler = ngx_quic_push_handler; - - qc->close.log = c->log; - qc->close.data = c; - qc->close.handler = ngx_quic_close_handler; - - qc->path_validation.log = c->log; - qc->path_validation.data = c; - qc->path_validation.handler = ngx_quic_path_handler; - - qc->key_update.log = c->log; - qc->key_update.data = c; - qc->key_update.handler = ngx_quic_keys_update; - - qc->conf = conf; - - if (ngx_quic_init_transport_params(&qc->tp, conf) != NGX_OK) { - return NULL; - } - - ctp = &qc->ctp; - - /* defaults to be used before actual client parameters are received */ - ctp->max_udp_payload_size = NGX_QUIC_MAX_UDP_PAYLOAD_SIZE; - ctp->ack_delay_exponent = NGX_QUIC_DEFAULT_ACK_DELAY_EXPONENT; - ctp->max_ack_delay = NGX_QUIC_DEFAULT_MAX_ACK_DELAY; - ctp->active_connection_id_limit = 2; - - ngx_queue_init(&qc->streams.uninitialized); - ngx_queue_init(&qc->streams.free); - - qc->streams.recv_max_data = qc->tp.initial_max_data; - qc->streams.recv_window = qc->streams.recv_max_data; - - qc->streams.client_max_streams_uni = qc->tp.initial_max_streams_uni; - qc->streams.client_max_streams_bidi = qc->tp.initial_max_streams_bidi; - - qc->congestion.window = ngx_min(10 * NGX_QUIC_MIN_INITIAL_SIZE, - ngx_max(2 * NGX_QUIC_MIN_INITIAL_SIZE, - 14720)); - qc->congestion.ssthresh = (size_t) -1; - qc->congestion.mtu = NGX_QUIC_MIN_INITIAL_SIZE; - qc->congestion.recovery_start = ngx_current_msec - 1; - - qc->max_frames = (conf->max_concurrent_streams_uni - + conf->max_concurrent_streams_bidi) - * conf->stream_buffer_size / 2000; - - if (pkt->validated && pkt->retried) { - qc->tp.retry_scid.len = pkt->dcid.len; - qc->tp.retry_scid.data = ngx_pstrdup(c->pool, &pkt->dcid); - if (qc->tp.retry_scid.data == NULL) { - return NULL; - } - } - - if (ngx_quic_keys_set_initial_secret(qc->keys, &pkt->dcid, c->log) - != NGX_OK) - { - return NULL; - } - - qc->validated = pkt->validated; - - if (ngx_quic_open_sockets(c, qc, pkt) != NGX_OK) { - ngx_quic_keys_cleanup(qc->keys); - return NULL; - } - - c->idle = 1; - ngx_reusable_connection(c, 1); - - ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0, - "quic connection created"); - - return qc; -} - - -static ngx_int_t -ngx_quic_handle_stateless_reset(ngx_connection_t *c, ngx_quic_header_t *pkt) -{ - u_char *tail, ch; - ngx_uint_t i; - ngx_queue_t *q; - ngx_quic_client_id_t *cid; - ngx_quic_connection_t *qc; - - qc = ngx_quic_get_connection(c); - - /* A stateless reset uses an entire UDP datagram */ - if (!pkt->first) { - return NGX_DECLINED; - } - - tail = pkt->raw->last - NGX_QUIC_SR_TOKEN_LEN; - - for (q = ngx_queue_head(&qc->client_ids); - q != ngx_queue_sentinel(&qc->client_ids); - q = ngx_queue_next(q)) - { - cid = ngx_queue_data(q, ngx_quic_client_id_t, queue); - - if (cid->seqnum == 0 || !cid->used) { - /* - * No stateless reset token in initial connection id. - * Don't accept a token from an unused connection id. - */ - continue; - } - - /* constant time comparison */ - - for (ch = 0, i = 0; i < NGX_QUIC_SR_TOKEN_LEN; i++) { - ch |= tail[i] ^ cid->sr_token[i]; - } - - if (ch == 0) { - return NGX_OK; - } - } - - return NGX_DECLINED; -} - - -static void -ngx_quic_input_handler(ngx_event_t *rev) -{ - ngx_int_t rc; - ngx_buf_t *b; - ngx_connection_t *c; - ngx_quic_connection_t *qc; - - ngx_log_debug0(NGX_LOG_DEBUG_EVENT, rev->log, 0, "quic input handler"); - - c = rev->data; - qc = ngx_quic_get_connection(c); - - c->log->action = "handling quic input"; - - if (rev->timedout) { - ngx_log_error(NGX_LOG_INFO, c->log, NGX_ETIMEDOUT, - "quic client timed out"); - ngx_quic_close_connection(c, NGX_DONE); - return; - } - - if (c->close) { - c->close = 0; - - if (!ngx_exiting || !qc->streams.initialized) { - qc->error = NGX_QUIC_ERR_NO_ERROR; - qc->error_reason = "graceful shutdown"; - ngx_quic_close_connection(c, NGX_ERROR); - return; - } - - if (!qc->closing && qc->conf->shutdown) { - qc->conf->shutdown(c); - } - - return; - } - - b = c->udp->buffer; - if (b == NULL) { - return; - } - - rc = ngx_quic_handle_datagram(c, b, NULL); - - if (rc == NGX_ERROR) { - ngx_quic_close_connection(c, NGX_ERROR); - return; - } - - if (rc == NGX_DONE) { - return; - } - - /* rc == NGX_OK */ - - qc->send_timer_set = 0; - ngx_add_timer(rev, qc->tp.max_idle_timeout); - - ngx_quic_connstate_dbg(c); -} - - -void -ngx_quic_close_connection(ngx_connection_t *c, ngx_int_t rc) -{ - ngx_uint_t i; - ngx_pool_t *pool; - ngx_quic_send_ctx_t *ctx; - ngx_quic_connection_t *qc; - - qc = ngx_quic_get_connection(c); - - if (qc == NULL) { - ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, - "quic packet rejected rc:%i, cleanup connection", rc); - goto quic_done; - } - - ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0, - "quic close %s rc:%i", - qc->closing ? "resumed": "initiated", rc); - - if (!qc->closing) { - - /* drop packets from retransmit queues, no ack is expected */ - for (i = 0; i < NGX_QUIC_SEND_CTX_LAST; i++) { - ngx_quic_free_frames(c, &qc->send_ctx[i].frames); - ngx_quic_free_frames(c, &qc->send_ctx[i].sent); - } - - if (qc->close.timer_set) { - ngx_del_timer(&qc->close); - } - - if (rc == NGX_DONE) { - - /* - * RFC 9000, 10.1. Idle Timeout - * - * If a max_idle_timeout is specified by either endpoint in its - * transport parameters (Section 18.2), the connection is silently - * closed and its state is discarded when it remains idle - */ - - /* this case also handles some errors from ngx_quic_run() */ - - ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0, - "quic close silent drain:%d timedout:%d", - qc->draining, c->read->timedout); - } else { - - /* - * RFC 9000, 10.2. Immediate Close - * - * An endpoint sends a CONNECTION_CLOSE frame (Section 19.19) - * to terminate the connection immediately. - */ - - if (qc->error == 0 && rc == NGX_ERROR) { - qc->error = NGX_QUIC_ERR_INTERNAL_ERROR; - qc->error_app = 0; - } - - ngx_log_debug5(NGX_LOG_DEBUG_EVENT, c->log, 0, - "quic close immediate term:%d drain:%d " - "%serror:%ui \"%s\"", - rc == NGX_ERROR ? 1 : 0, qc->draining, - qc->error_app ? "app " : "", qc->error, - qc->error_reason ? qc->error_reason : ""); - - for (i = 0; i < NGX_QUIC_SEND_CTX_LAST; i++) { - ctx = &qc->send_ctx[i]; - - if (!ngx_quic_keys_available(qc->keys, ctx->level, 1)) { - continue; - } - - qc->error_level = ctx->level; - (void) ngx_quic_send_cc(c); - - if (rc == NGX_OK) { - ngx_add_timer(&qc->close, 3 * ngx_quic_pto(c, ctx)); - } - } - } - - qc->closing = 1; - } - - if (rc == NGX_ERROR && qc->close.timer_set) { - /* do not wait for timer in case of fatal error */ - ngx_del_timer(&qc->close); - } - - if (ngx_quic_close_streams(c, qc) == NGX_AGAIN) { - return; - } - - if (qc->push.timer_set) { - ngx_del_timer(&qc->push); - } - - if (qc->pto.timer_set) { - ngx_del_timer(&qc->pto); - } - - if (qc->path_validation.timer_set) { - ngx_del_timer(&qc->path_validation); - } - - if (qc->push.posted) { - ngx_delete_posted_event(&qc->push); - } - - if (qc->key_update.posted) { - ngx_delete_posted_event(&qc->key_update); - } - - if (qc->close.timer_set) { - return; - } - - if (qc->close.posted) { - ngx_delete_posted_event(&qc->close); - } - - ngx_quic_close_sockets(c); - - ngx_quic_keys_cleanup(qc->keys); - - ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0, "quic close completed"); - - /* may be tested from SSL callback during SSL shutdown */ - c->udp = NULL; - -quic_done: - - if (c->ssl) { - (void) ngx_ssl_shutdown(c); - } - - if (c->read->timer_set) { - ngx_del_timer(c->read); - } - -#if (NGX_STAT_STUB) - (void) ngx_atomic_fetch_add(ngx_stat_active, -1); -#endif - - c->destroyed = 1; - - pool = c->pool; - - ngx_close_connection(c); - - ngx_destroy_pool(pool); -} - - -void -ngx_quic_finalize_connection(ngx_connection_t *c, ngx_uint_t err, - const char *reason) -{ - ngx_quic_connection_t *qc; - - qc = ngx_quic_get_connection(c); - - if (qc->closing) { - return; - } - - qc->error = err; - qc->error_reason = reason; - qc->error_app = 1; - qc->error_ftype = 0; - - ngx_post_event(&qc->close, &ngx_posted_events); -} - - -void -ngx_quic_shutdown_connection(ngx_connection_t *c, ngx_uint_t err, - const char *reason) -{ - ngx_quic_connection_t *qc; - - qc = ngx_quic_get_connection(c); - qc->shutdown = 1; - qc->shutdown_code = err; - qc->shutdown_reason = reason; - - ngx_quic_shutdown_quic(c); -} - - -static void -ngx_quic_close_handler(ngx_event_t *ev) -{ - ngx_connection_t *c; - - ngx_log_debug0(NGX_LOG_DEBUG_EVENT, ev->log, 0, "quic close handler"); - - c = ev->data; - - ngx_quic_close_connection(c, NGX_OK); -} - - -static ngx_int_t -ngx_quic_handle_datagram(ngx_connection_t *c, ngx_buf_t *b, - ngx_quic_conf_t *conf) -{ - size_t size; - u_char *p, *start; - ngx_int_t rc; - ngx_uint_t good; - ngx_quic_path_t *path; - ngx_quic_header_t pkt; - ngx_quic_connection_t *qc; - - good = 0; - path = NULL; - - size = b->last - b->pos; - - p = start = b->pos; - - while (p < b->last) { - - ngx_memzero(&pkt, sizeof(ngx_quic_header_t)); - pkt.raw = b; - pkt.data = p; - pkt.len = b->last - p; - pkt.log = c->log; - pkt.first = (p == start) ? 1 : 0; - pkt.path = path; - pkt.flags = p[0]; - pkt.raw->pos++; - - rc = ngx_quic_handle_packet(c, conf, &pkt); - -#if (NGX_DEBUG) - if (pkt.parsed) { - ngx_log_debug5(NGX_LOG_DEBUG_EVENT, c->log, 0, - "quic packet done rc:%i level:%s" - " decr:%d pn:%L perr:%ui", - rc, ngx_quic_level_name(pkt.level), - pkt.decrypted, pkt.pn, pkt.error); - } else { - ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, - "quic packet done rc:%i parse failed", rc); - } -#endif - - if (rc == NGX_ERROR || rc == NGX_DONE) { - return rc; - } - - if (rc == NGX_OK) { - good = 1; - } - - path = pkt.path; /* preserve packet path from 1st packet */ - - /* NGX_OK || NGX_DECLINED */ - - /* - * we get NGX_DECLINED when there are no keys [yet] available - * to decrypt packet. - * Instead of queueing it, we ignore it and rely on the sender's - * retransmission: - * - * RFC 9000, 12.2. Coalescing Packets - * - * For example, if decryption fails (because the keys are - * not available or for any other reason), the receiver MAY either - * discard or buffer the packet for later processing and MUST - * attempt to process the remaining packets. - * - * We also skip packets that don't match connection state - * or cannot be parsed properly. - */ - - /* b->pos is at header end, adjust by actual packet length */ - b->pos = pkt.data + pkt.len; - - p = b->pos; - } - - if (!good) { - return NGX_DONE; - } - - qc = ngx_quic_get_connection(c); - - if (qc) { - qc->received += size; - - if ((uint64_t) (c->sent + qc->received) / 8 > - (qc->streams.sent + qc->streams.recv_last) + 1048576) - { - ngx_log_error(NGX_LOG_INFO, c->log, 0, "quic flood detected"); - - qc->error = NGX_QUIC_ERR_NO_ERROR; - qc->error_reason = "QUIC flood detected"; - return NGX_ERROR; - } - } - - return NGX_OK; -} - - -static ngx_int_t -ngx_quic_handle_packet(ngx_connection_t *c, ngx_quic_conf_t *conf, - ngx_quic_header_t *pkt) -{ - ngx_int_t rc; - ngx_quic_socket_t *qsock; - ngx_quic_connection_t *qc; - - c->log->action = "parsing quic packet"; - - rc = ngx_quic_parse_packet(pkt); - - if (rc == NGX_ERROR) { - return NGX_DECLINED; - } - - pkt->parsed = 1; - - c->log->action = "handling quic packet"; - - ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0, - "quic packet rx dcid len:%uz %xV", - pkt->dcid.len, &pkt->dcid); - -#if (NGX_DEBUG) - if (pkt->level != NGX_QUIC_ENCRYPTION_APPLICATION) { - ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0, - "quic packet rx scid len:%uz %xV", - pkt->scid.len, &pkt->scid); - } - - if (pkt->level == NGX_QUIC_ENCRYPTION_INITIAL) { - ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0, - "quic address validation token len:%uz %xV", - pkt->token.len, &pkt->token); - } -#endif - - qc = ngx_quic_get_connection(c); - - if (qc) { - - if (rc == NGX_ABORT) { - ngx_log_error(NGX_LOG_INFO, c->log, 0, - "quic unsupported version: 0x%xD", pkt->version); - return NGX_DECLINED; - } - - if (pkt->level != NGX_QUIC_ENCRYPTION_APPLICATION) { - - if (pkt->version != qc->version) { - ngx_log_error(NGX_LOG_INFO, c->log, 0, - "quic version mismatch: 0x%xD", pkt->version); - return NGX_DECLINED; - } - - if (pkt->first) { - qsock = ngx_quic_get_socket(c); - - if (ngx_cmp_sockaddr(&qsock->sockaddr.sockaddr, qsock->socklen, - qc->path->sockaddr, qc->path->socklen, 1) - != NGX_OK) - { - /* packet comes from unknown path, possibly migration */ - ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0, - "quic too early migration attempt"); - return NGX_DONE; - } - } - - if (ngx_quic_check_csid(qc, pkt) != NGX_OK) { - return NGX_DECLINED; - } - - } - - rc = ngx_quic_handle_payload(c, pkt); - - if (rc == NGX_DECLINED - && pkt->level == NGX_QUIC_ENCRYPTION_APPLICATION) - { - if (ngx_quic_handle_stateless_reset(c, pkt) == NGX_OK) { - ngx_log_error(NGX_LOG_INFO, c->log, 0, - "quic stateless reset packet detected"); - - qc->draining = 1; - ngx_post_event(&qc->close, &ngx_posted_events); - - return NGX_OK; - } - } - - return rc; - } - - /* packet does not belong to a connection */ - - if (rc == NGX_ABORT) { - return ngx_quic_negotiate_version(c, pkt); - } - - if (pkt->level == NGX_QUIC_ENCRYPTION_APPLICATION) { - return ngx_quic_send_stateless_reset(c, conf, pkt); - } - - if (pkt->level != NGX_QUIC_ENCRYPTION_INITIAL) { - ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0, - "quic expected initial, got handshake"); - return NGX_ERROR; - } - - c->log->action = "handling initial packet"; - - if (pkt->dcid.len < NGX_QUIC_CID_LEN_MIN) { - /* RFC 9000, 7.2. Negotiating Connection IDs */ - ngx_log_error(NGX_LOG_INFO, c->log, 0, - "quic too short dcid in initial" - " packet: len:%i", pkt->dcid.len); - return NGX_ERROR; - } - - /* process retry and initialize connection IDs */ - - if (pkt->token.len) { - - rc = ngx_quic_validate_token(c, conf->av_token_key, pkt); - - if (rc == NGX_ERROR) { - /* internal error */ - return NGX_ERROR; - - } else if (rc == NGX_ABORT) { - /* token cannot be decrypted */ - return ngx_quic_send_early_cc(c, pkt, - NGX_QUIC_ERR_INVALID_TOKEN, - "cannot decrypt token"); - } else if (rc == NGX_DECLINED) { - /* token is invalid */ - - if (pkt->retried) { - /* invalid address validation token */ - return ngx_quic_send_early_cc(c, pkt, - NGX_QUIC_ERR_INVALID_TOKEN, - "invalid address validation token"); - } else if (conf->retry) { - /* invalid NEW_TOKEN */ - return ngx_quic_send_retry(c, conf, pkt); - } - } - - /* NGX_OK */ - - } else if (conf->retry) { - return ngx_quic_send_retry(c, conf, pkt); - - } else { - pkt->odcid = pkt->dcid; - } - - if (ngx_terminate || ngx_exiting) { - if (conf->retry) { - return ngx_quic_send_retry(c, conf, pkt); - } - - return NGX_ERROR; - } - - c->log->action = "creating quic connection"; - - qc = ngx_quic_new_connection(c, conf, pkt); - if (qc == NULL) { - return NGX_ERROR; - } - - return ngx_quic_handle_payload(c, pkt); -} - - -static ngx_int_t -ngx_quic_handle_payload(ngx_connection_t *c, ngx_quic_header_t *pkt) -{ - ngx_int_t rc; - ngx_quic_send_ctx_t *ctx; - ngx_quic_connection_t *qc; - static u_char buf[NGX_QUIC_MAX_UDP_PAYLOAD_SIZE]; - - qc = ngx_quic_get_connection(c); - - qc->error = 0; - qc->error_reason = NULL; - - c->log->action = "decrypting packet"; - - if (!ngx_quic_keys_available(qc->keys, pkt->level, 0)) { - ngx_log_error(NGX_LOG_INFO, c->log, 0, - "quic no %s keys, ignoring packet", - ngx_quic_level_name(pkt->level)); - return NGX_DECLINED; - } - -#if (NGX_QUIC_QUICTLS_API) - /* QuicTLS provides app read keys before completing handshake */ - - if (pkt->level == NGX_QUIC_ENCRYPTION_APPLICATION && !c->ssl->handshaked) { - ngx_log_error(NGX_LOG_INFO, c->log, 0, - "quic no %s keys ready, ignoring packet", - ngx_quic_level_name(pkt->level)); - return NGX_DECLINED; - } -#endif - - pkt->keys = qc->keys; - pkt->key_phase = qc->key_phase; - pkt->plaintext = buf; - - ctx = ngx_quic_get_send_ctx(qc, pkt->level); - - rc = ngx_quic_decrypt(pkt, &ctx->largest_pn); - if (rc != NGX_OK) { - qc->error = pkt->error; - qc->error_reason = "failed to decrypt packet"; - return rc; - } - - pkt->decrypted = 1; - - c->log->action = "handling decrypted packet"; - - if (pkt->path == NULL) { - rc = ngx_quic_set_path(c, pkt); - if (rc != NGX_OK) { - return rc; - } - } - - if (c->ssl == NULL) { - if (ngx_quic_init_connection(c) != NGX_OK) { - return NGX_ERROR; - } - } - - if (pkt->level == NGX_QUIC_ENCRYPTION_HANDSHAKE) { - /* - * RFC 9001, 4.9.1. Discarding Initial Keys - * - * The successful use of Handshake packets indicates - * that no more Initial packets need to be exchanged - */ - ngx_quic_discard_ctx(c, NGX_QUIC_ENCRYPTION_INITIAL); - - if (!qc->path->validated) { - qc->path->validated = 1; - ngx_quic_path_dbg(c, "in handshake", qc->path); - ngx_post_event(&qc->push, &ngx_posted_events); - } - } - - if (pkt->level == NGX_QUIC_ENCRYPTION_APPLICATION) { - /* - * RFC 9001, 4.9.3. Discarding 0-RTT Keys - * - * After receiving a 1-RTT packet, servers MUST discard - * 0-RTT keys within a short time - */ - ngx_quic_keys_discard(qc->keys, NGX_QUIC_ENCRYPTION_EARLY_DATA); - } - - if (qc->closing) { - /* - * RFC 9000, 10.2. Immediate Close - * - * ... delayed or reordered packets are properly discarded. - * - * In the closing state, an endpoint retains only enough information - * to generate a packet containing a CONNECTION_CLOSE frame and to - * identify packets as belonging to the connection. - */ - - qc->error_level = pkt->level; - qc->error = NGX_QUIC_ERR_NO_ERROR; - qc->error_reason = "connection is closing, packet discarded"; - qc->error_ftype = 0; - qc->error_app = 0; - - return ngx_quic_send_cc(c); - } - - pkt->received = ngx_current_msec; - - c->log->action = "handling payload"; - - if (pkt->level != NGX_QUIC_ENCRYPTION_APPLICATION) { - return ngx_quic_handle_frames(c, pkt); - } - - if (!pkt->key_update) { - return ngx_quic_handle_frames(c, pkt); - } - - /* switch keys and generate next on Key Phase change */ - - qc->key_phase ^= 1; - ngx_quic_keys_switch(c, qc->keys); - - rc = ngx_quic_handle_frames(c, pkt); - if (rc != NGX_OK) { - return rc; - } - - ngx_post_event(&qc->key_update, &ngx_posted_events); - - return NGX_OK; -} - - -void -ngx_quic_discard_ctx(ngx_connection_t *c, ngx_uint_t level) -{ - ngx_queue_t *q; - ngx_quic_frame_t *f; - ngx_quic_socket_t *qsock; - ngx_quic_send_ctx_t *ctx; - ngx_quic_connection_t *qc; - - qc = ngx_quic_get_connection(c); - - if (!ngx_quic_keys_available(qc->keys, level, 0) - && !ngx_quic_keys_available(qc->keys, level, 1)) - { - return; - } - - ngx_quic_keys_discard(qc->keys, level); - - qc->pto_count = 0; - - ctx = ngx_quic_get_send_ctx(qc, level); - - ngx_quic_free_buffer(c, &ctx->crypto); - - while (!ngx_queue_empty(&ctx->sent)) { - q = ngx_queue_head(&ctx->sent); - ngx_queue_remove(q); - - f = ngx_queue_data(q, ngx_quic_frame_t, queue); - ngx_quic_congestion_ack(c, f); - ngx_quic_free_frame(c, f); - } - - while (!ngx_queue_empty(&ctx->frames)) { - q = ngx_queue_head(&ctx->frames); - ngx_queue_remove(q); - - f = ngx_queue_data(q, ngx_quic_frame_t, queue); - ngx_quic_free_frame(c, f); - } - - if (level == NGX_QUIC_ENCRYPTION_INITIAL) { - /* close temporary listener with initial dcid */ - qsock = ngx_quic_find_socket(c, NGX_QUIC_UNSET_PN); - if (qsock) { - ngx_quic_close_socket(c, qsock); - } - } - - ctx->send_ack = 0; - - ngx_quic_set_lost_timer(c); -} - - -static ngx_int_t -ngx_quic_check_csid(ngx_quic_connection_t *qc, ngx_quic_header_t *pkt) -{ - ngx_queue_t *q; - ngx_quic_client_id_t *cid; - - for (q = ngx_queue_head(&qc->client_ids); - q != ngx_queue_sentinel(&qc->client_ids); - q = ngx_queue_next(q)) - { - cid = ngx_queue_data(q, ngx_quic_client_id_t, queue); - - if (pkt->scid.len == cid->len - && ngx_memcmp(pkt->scid.data, cid->id, cid->len) == 0) - { - return NGX_OK; - } - } - - ngx_log_error(NGX_LOG_INFO, pkt->log, 0, "quic unexpected quic scid"); - return NGX_ERROR; -} - - -static ngx_int_t -ngx_quic_handle_frames(ngx_connection_t *c, ngx_quic_header_t *pkt) -{ - u_char *end, *p; - ssize_t len; - ngx_buf_t buf; - ngx_uint_t do_close, nonprobing; - ngx_chain_t chain; - ngx_quic_frame_t frame; - ngx_quic_connection_t *qc; - - qc = ngx_quic_get_connection(c); - - p = pkt->payload.data; - end = p + pkt->payload.len; - - do_close = 0; - nonprobing = 0; - - while (p < end) { - - c->log->action = "parsing frames"; - - ngx_memzero(&frame, sizeof(ngx_quic_frame_t)); - ngx_memzero(&buf, sizeof(ngx_buf_t)); - buf.temporary = 1; - - chain.buf = &buf; - chain.next = NULL; - frame.data = &chain; - - len = ngx_quic_parse_frame(pkt, p, end, &frame); - - if (len < 0) { - qc->error = pkt->error; - return NGX_ERROR; - } - - ngx_quic_log_frame(c->log, &frame, 0); - - c->log->action = "handling frames"; - - p += len; - - switch (frame.type) { - /* probing frames */ - case NGX_QUIC_FT_PADDING: - case NGX_QUIC_FT_PATH_CHALLENGE: - case NGX_QUIC_FT_PATH_RESPONSE: - case NGX_QUIC_FT_NEW_CONNECTION_ID: - break; - - /* non-probing frames */ - default: - nonprobing = 1; - break; - } - - switch (frame.type) { - - case NGX_QUIC_FT_ACK: - if (ngx_quic_handle_ack_frame(c, pkt, &frame) != NGX_OK) { - return NGX_ERROR; - } - - continue; - - case NGX_QUIC_FT_PADDING: - /* no action required */ - continue; - - case NGX_QUIC_FT_CONNECTION_CLOSE: - case NGX_QUIC_FT_CONNECTION_CLOSE_APP: - do_close = 1; - continue; - } - - /* got there with ack-eliciting packet */ - pkt->need_ack = 1; - - switch (frame.type) { - - case NGX_QUIC_FT_CRYPTO: - - if (ngx_quic_handle_crypto_frame(c, pkt, &frame) != NGX_OK) { - return NGX_ERROR; - } - - break; - - case NGX_QUIC_FT_PING: - break; - - case NGX_QUIC_FT_STREAM: - - if (ngx_quic_handle_stream_frame(c, pkt, &frame) != NGX_OK) { - return NGX_ERROR; - } - - break; - - case NGX_QUIC_FT_MAX_DATA: - - if (ngx_quic_handle_max_data_frame(c, &frame.u.max_data) != NGX_OK) - { - return NGX_ERROR; - } - - break; - - case NGX_QUIC_FT_STREAMS_BLOCKED: - case NGX_QUIC_FT_STREAMS_BLOCKED2: - - if (ngx_quic_handle_streams_blocked_frame(c, pkt, - &frame.u.streams_blocked) - != NGX_OK) - { - return NGX_ERROR; - } - - break; - - case NGX_QUIC_FT_DATA_BLOCKED: - - if (ngx_quic_handle_data_blocked_frame(c, pkt, - &frame.u.data_blocked) - != NGX_OK) - { - return NGX_ERROR; - } - - break; - - case NGX_QUIC_FT_STREAM_DATA_BLOCKED: - - if (ngx_quic_handle_stream_data_blocked_frame(c, pkt, - &frame.u.stream_data_blocked) - != NGX_OK) - { - return NGX_ERROR; - } - - break; - - case NGX_QUIC_FT_MAX_STREAM_DATA: - - if (ngx_quic_handle_max_stream_data_frame(c, pkt, - &frame.u.max_stream_data) - != NGX_OK) - { - return NGX_ERROR; - } - - break; - - case NGX_QUIC_FT_RESET_STREAM: - - if (ngx_quic_handle_reset_stream_frame(c, pkt, - &frame.u.reset_stream) - != NGX_OK) - { - return NGX_ERROR; - } - - break; - - case NGX_QUIC_FT_STOP_SENDING: - - if (ngx_quic_handle_stop_sending_frame(c, pkt, - &frame.u.stop_sending) - != NGX_OK) - { - return NGX_ERROR; - } - - break; - - case NGX_QUIC_FT_MAX_STREAMS: - case NGX_QUIC_FT_MAX_STREAMS2: - - if (ngx_quic_handle_max_streams_frame(c, pkt, &frame.u.max_streams) - != NGX_OK) - { - return NGX_ERROR; - } - - break; - - case NGX_QUIC_FT_PATH_CHALLENGE: - - if (ngx_quic_handle_path_challenge_frame(c, pkt, - &frame.u.path_challenge) - != NGX_OK) - { - return NGX_ERROR; - } - - break; - - case NGX_QUIC_FT_PATH_RESPONSE: - - if (ngx_quic_handle_path_response_frame(c, &frame.u.path_response) - != NGX_OK) - { - return NGX_ERROR; - } - - break; - - case NGX_QUIC_FT_NEW_CONNECTION_ID: - - if (ngx_quic_handle_new_connection_id_frame(c, &frame.u.ncid) - != NGX_OK) - { - return NGX_ERROR; - } - - break; - - case NGX_QUIC_FT_RETIRE_CONNECTION_ID: - - if (ngx_quic_handle_retire_connection_id_frame(c, - &frame.u.retire_cid) - != NGX_OK) - { - return NGX_ERROR; - } - - break; - - default: - ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0, - "quic missing frame handler"); - return NGX_ERROR; - } - } - - if (p != end) { - ngx_log_error(NGX_LOG_INFO, c->log, 0, - "quic trailing garbage in payload:%ui bytes", end - p); - - qc->error = NGX_QUIC_ERR_FRAME_ENCODING_ERROR; - return NGX_ERROR; - } - - if (do_close) { - qc->draining = 1; - ngx_post_event(&qc->close, &ngx_posted_events); - } - - if (pkt->path != qc->path && nonprobing) { - - /* - * RFC 9000, 9.2. Initiating Connection Migration - * - * An endpoint can migrate a connection to a new local - * address by sending packets containing non-probing frames - * from that address. - */ - if (ngx_quic_handle_migration(c, pkt) != NGX_OK) { - return NGX_ERROR; - } - } - - if (ngx_quic_ack_packet(c, pkt) != NGX_OK) { - return NGX_ERROR; - } - - return NGX_OK; -} - - -static void -ngx_quic_push_handler(ngx_event_t *ev) -{ - ngx_connection_t *c; - - ngx_log_debug0(NGX_LOG_DEBUG_EVENT, ev->log, 0, "quic push handler"); - - c = ev->data; - - if (ngx_quic_output(c) != NGX_OK) { - ngx_quic_close_connection(c, NGX_ERROR); - return; - } - - ngx_quic_connstate_dbg(c); -} - - -void -ngx_quic_shutdown_quic(ngx_connection_t *c) -{ - ngx_quic_connection_t *qc; - - if (c->reusable) { - qc = ngx_quic_get_connection(c); - ngx_quic_finalize_connection(c, qc->shutdown_code, qc->shutdown_reason); - } -} - - -void -ngx_quic_address_hash(struct sockaddr *sockaddr, socklen_t socklen, - ngx_uint_t no_port, u_char *salt, size_t saltlen, u_char buf[20]) -{ - size_t len; - u_char *data; - ngx_sha1_t sha1; - struct sockaddr_in *sin; -#if (NGX_HAVE_INET6) - struct sockaddr_in6 *sin6; -#endif - - len = (size_t) socklen; - data = (u_char *) sockaddr; - - if (no_port) { - switch (sockaddr->sa_family) { - -#if (NGX_HAVE_INET6) - case AF_INET6: - sin6 = (struct sockaddr_in6 *) sockaddr; - - len = sizeof(struct in6_addr); - data = sin6->sin6_addr.s6_addr; - - break; -#endif - - case AF_INET: - sin = (struct sockaddr_in *) sockaddr; - - len = sizeof(in_addr_t); - data = (u_char *) &sin->sin_addr; - - break; - } - } - - ngx_sha1_init(&sha1); - ngx_sha1_update(&sha1, data, len); - - if (salt) { - ngx_sha1_update(&sha1, salt, saltlen); - } - - ngx_sha1_final(buf, &sha1); -} diff --git a/src/deps/src/nginx-1.30.3/src/event/quic/ngx_event_quic.h b/src/deps/src/nginx-1.30.3/src/event/quic/ngx_event_quic.h deleted file mode 100644 index 4f899ec0a5..0000000000 --- a/src/deps/src/nginx-1.30.3/src/event/quic/ngx_event_quic.h +++ /dev/null @@ -1,145 +0,0 @@ - -/* - * Copyright (C) Nginx, Inc. - */ - - -#ifndef _NGX_EVENT_QUIC_H_INCLUDED_ -#define _NGX_EVENT_QUIC_H_INCLUDED_ - - -#include -#include - - -#if (OPENSSL_VERSION_NUMBER >= 0x30500010L) -#define NGX_QUIC_OPENSSL_API 1 - -#elif (defined SSL_R_MISSING_QUIC_TRANSPORT_PARAMETERS_EXTENSION) -#define NGX_QUIC_QUICTLS_API 1 - -#elif (defined OPENSSL_IS_BORINGSSL || defined OPENSSL_IS_AWSLC \ - || defined LIBRESSL_VERSION_NUMBER) -#define NGX_QUIC_BORINGSSL_API 1 - -#else -#define NGX_QUIC_BORINGSSL_API 1 -#define NGX_QUIC_OPENSSL_COMPAT 1 -#endif - - -#define NGX_QUIC_MAX_UDP_PAYLOAD_SIZE 65527 - -#define NGX_QUIC_DEFAULT_ACK_DELAY_EXPONENT 3 -#define NGX_QUIC_DEFAULT_MAX_ACK_DELAY 25 -#define NGX_QUIC_DEFAULT_HOST_KEY_LEN 32 -#define NGX_QUIC_SR_KEY_LEN 32 -#define NGX_QUIC_AV_KEY_LEN 32 - -#define NGX_QUIC_SR_TOKEN_LEN 16 - -#define NGX_QUIC_MIN_INITIAL_SIZE 1200 - -#define NGX_QUIC_STREAM_SERVER_INITIATED 0x01 -#define NGX_QUIC_STREAM_UNIDIRECTIONAL 0x02 - - -typedef ngx_int_t (*ngx_quic_init_pt)(ngx_connection_t *c); -typedef void (*ngx_quic_shutdown_pt)(ngx_connection_t *c); - - -typedef enum { - NGX_QUIC_STREAM_SEND_READY = 0, - NGX_QUIC_STREAM_SEND_SEND, - NGX_QUIC_STREAM_SEND_DATA_SENT, - NGX_QUIC_STREAM_SEND_DATA_RECVD, - NGX_QUIC_STREAM_SEND_RESET_SENT, - NGX_QUIC_STREAM_SEND_RESET_RECVD -} ngx_quic_stream_send_state_e; - - -typedef enum { - NGX_QUIC_STREAM_RECV_RECV = 0, - NGX_QUIC_STREAM_RECV_SIZE_KNOWN, - NGX_QUIC_STREAM_RECV_DATA_RECVD, - NGX_QUIC_STREAM_RECV_DATA_READ, - NGX_QUIC_STREAM_RECV_RESET_RECVD, - NGX_QUIC_STREAM_RECV_RESET_READ -} ngx_quic_stream_recv_state_e; - - -typedef struct { - uint64_t size; - uint64_t offset; - uint64_t last_offset; - ngx_chain_t *chain; - ngx_chain_t *last_chain; -} ngx_quic_buffer_t; - - -typedef struct { - ngx_ssl_t *ssl; - - ngx_flag_t retry; - ngx_flag_t gso_enabled; - ngx_flag_t disable_active_migration; - ngx_msec_t handshake_timeout; - ngx_msec_t idle_timeout; - ngx_str_t host_key; - size_t stream_buffer_size; - ngx_uint_t max_concurrent_streams_bidi; - ngx_uint_t max_concurrent_streams_uni; - ngx_uint_t active_connection_id_limit; - ngx_int_t stream_close_code; - ngx_int_t stream_reject_code_uni; - ngx_int_t stream_reject_code_bidi; - - ngx_quic_init_pt init; - ngx_quic_shutdown_pt shutdown; - - u_char av_token_key[NGX_QUIC_AV_KEY_LEN]; - u_char sr_token_key[NGX_QUIC_SR_KEY_LEN]; -} ngx_quic_conf_t; - - -struct ngx_quic_stream_s { - ngx_rbtree_node_t node; - ngx_queue_t queue; - ngx_connection_t *parent; - ngx_connection_t *connection; - uint64_t id; - uint64_t sent; - uint64_t acked; - uint64_t send_max_data; - uint64_t send_offset; - uint64_t send_final_size; - uint64_t recv_max_data; - uint64_t recv_offset; - uint64_t recv_window; - uint64_t recv_last; - uint64_t recv_final_size; - ngx_quic_buffer_t send; - ngx_quic_buffer_t recv; - ngx_quic_stream_send_state_e send_state; - ngx_quic_stream_recv_state_e recv_state; - unsigned cancelable:1; - unsigned fin_acked:1; -}; - - -void ngx_quic_recvmsg(ngx_event_t *ev); -void ngx_quic_run(ngx_connection_t *c, ngx_quic_conf_t *conf); -ngx_connection_t *ngx_quic_open_stream(ngx_connection_t *c, ngx_uint_t bidi); -void ngx_quic_finalize_connection(ngx_connection_t *c, ngx_uint_t err, - const char *reason); -void ngx_quic_shutdown_connection(ngx_connection_t *c, ngx_uint_t err, - const char *reason); -ngx_int_t ngx_quic_reset_stream(ngx_connection_t *c, ngx_uint_t err); -ngx_int_t ngx_quic_shutdown_stream(ngx_connection_t *c, int how); -void ngx_quic_cancelable_stream(ngx_connection_t *c); -ngx_int_t ngx_quic_get_packet_dcid(ngx_log_t *log, u_char *data, size_t len, - ngx_str_t *dcid); -ngx_int_t ngx_quic_derive_key(ngx_log_t *log, const char *label, - ngx_str_t *secret, ngx_str_t *salt, u_char *out, size_t len); - -#endif /* _NGX_EVENT_QUIC_H_INCLUDED_ */ diff --git a/src/deps/src/nginx-1.30.3/src/event/quic/ngx_event_quic_ack.c b/src/deps/src/nginx-1.30.3/src/event/quic/ngx_event_quic_ack.c deleted file mode 100644 index abd3f7ade9..0000000000 --- a/src/deps/src/nginx-1.30.3/src/event/quic/ngx_event_quic_ack.c +++ /dev/null @@ -1,1456 +0,0 @@ - -/* - * Copyright (C) Nginx, Inc. - */ - - -#include -#include -#include -#include - - -#define NGX_QUIC_MAX_ACK_GAP 2 - -/* RFC 9002, 6.1.1. Packet Threshold: kPacketThreshold */ -#define NGX_QUIC_PKT_THR 3 /* packets */ -/* RFC 9002, 6.1.2. Time Threshold: kGranularity */ -#define NGX_QUIC_TIME_GRANULARITY 1 /* ms */ - -/* RFC 9002, 7.6.1. Duration: kPersistentCongestionThreshold */ -#define NGX_QUIC_PERSISTENT_CONGESTION_THR 3 - -/* CUBIC parameters x10 */ -#define NGX_QUIC_CUBIC_BETA 7 -#define NGX_QUIC_CUBIC_C 4 - - -/* send time of ACK'ed packets */ -typedef struct { - ngx_msec_t max_pn; - ngx_msec_t oldest; - ngx_msec_t newest; -} ngx_quic_ack_stat_t; - - -static ngx_inline ngx_msec_t ngx_quic_time_threshold(ngx_quic_connection_t *qc); -static uint64_t ngx_quic_packet_threshold(ngx_quic_send_ctx_t *ctx); -static void ngx_quic_rtt_sample(ngx_connection_t *c, ngx_quic_ack_frame_t *ack, - ngx_uint_t level, ngx_msec_t send_time); -static ngx_int_t ngx_quic_handle_ack_frame_range(ngx_connection_t *c, - ngx_quic_send_ctx_t *ctx, uint64_t min, uint64_t max, - ngx_quic_ack_stat_t *st); -static size_t ngx_quic_congestion_cubic(ngx_connection_t *c); -static void ngx_quic_drop_ack_ranges(ngx_connection_t *c, - ngx_quic_send_ctx_t *ctx, uint64_t pn); -static ngx_int_t ngx_quic_detect_lost(ngx_connection_t *c, - ngx_quic_ack_stat_t *st); -static ngx_msec_t ngx_quic_congestion_cubic_time(ngx_connection_t *c); -static ngx_msec_t ngx_quic_pcg_duration(ngx_connection_t *c); -static void ngx_quic_persistent_congestion(ngx_connection_t *c); -static ngx_msec_t ngx_quic_oldest_sent_packet(ngx_connection_t *c); -static void ngx_quic_congestion_lost(ngx_connection_t *c, - ngx_quic_frame_t *frame); -static void ngx_quic_lost_handler(ngx_event_t *ev); - - -/* RFC 9002, 6.1.2. Time Threshold: kTimeThreshold, kGranularity */ -static ngx_inline ngx_msec_t -ngx_quic_time_threshold(ngx_quic_connection_t *qc) -{ - ngx_msec_t thr; - - thr = ngx_max(qc->latest_rtt, qc->avg_rtt); - thr += thr >> 3; - - return ngx_max(thr, NGX_QUIC_TIME_GRANULARITY); -} - - -static uint64_t -ngx_quic_packet_threshold(ngx_quic_send_ctx_t *ctx) -{ - uint64_t pkt_thr; - ngx_queue_t *q; - ngx_quic_frame_t *f; - - if (ngx_queue_empty(&ctx->sent)) { - return NGX_QUIC_PKT_THR; - } - - q = ngx_queue_head(&ctx->sent); - f = ngx_queue_data(q, ngx_quic_frame_t, queue); - pkt_thr = (ctx->pnum - f->pnum) / 2; - - if (pkt_thr <= NGX_QUIC_PKT_THR) { - return NGX_QUIC_PKT_THR; - } - - return pkt_thr; -} - - -ngx_int_t -ngx_quic_handle_ack_frame(ngx_connection_t *c, ngx_quic_header_t *pkt, - ngx_quic_frame_t *f) -{ - ssize_t n; - u_char *pos, *end; - uint64_t min, max, gap, range; - ngx_uint_t i; - ngx_quic_ack_stat_t send_time; - ngx_quic_send_ctx_t *ctx; - ngx_quic_ack_frame_t *ack; - ngx_quic_connection_t *qc; - - qc = ngx_quic_get_connection(c); - - ctx = ngx_quic_get_send_ctx(qc, pkt->level); - - ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, - "quic ngx_quic_handle_ack_frame level:%ui", pkt->level); - - ack = &f->u.ack; - - /* - * RFC 9000, 19.3.1. ACK Ranges - * - * If any computed packet number is negative, an endpoint MUST - * generate a connection error of type FRAME_ENCODING_ERROR. - */ - - if (ack->first_range > ack->largest) { - qc->error = NGX_QUIC_ERR_FRAME_ENCODING_ERROR; - ngx_log_error(NGX_LOG_INFO, c->log, 0, - "quic invalid first range in ack frame"); - return NGX_ERROR; - } - - min = ack->largest - ack->first_range; - max = ack->largest; - - send_time.oldest = NGX_TIMER_INFINITE; - send_time.newest = NGX_TIMER_INFINITE; - - if (ngx_quic_handle_ack_frame_range(c, ctx, min, max, &send_time) - != NGX_OK) - { - return NGX_ERROR; - } - - /* RFC 9000, 13.2.4. Limiting Ranges by Tracking ACK Frames */ - if (ctx->largest_ack < max || ctx->largest_ack == NGX_QUIC_UNSET_PN) { - ctx->largest_ack = max; - ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, - "quic updated largest received ack:%uL", max); - - /* - * RFC 9002, 5.1. Generating RTT Samples - * - * An endpoint generates an RTT sample on receiving an - * ACK frame that meets the following two conditions: - * - * - the largest acknowledged packet number is newly acknowledged - * - at least one of the newly acknowledged packets was ack-eliciting. - */ - - if (send_time.max_pn != NGX_TIMER_INFINITE) { - ngx_quic_rtt_sample(c, ack, pkt->level, send_time.max_pn); - } - } - - if (f->data) { - pos = f->data->buf->pos; - end = f->data->buf->last; - - } else { - pos = NULL; - end = NULL; - } - - for (i = 0; i < ack->range_count; i++) { - - n = ngx_quic_parse_ack_range(pkt->log, pos, end, &gap, &range); - if (n == NGX_ERROR) { - return NGX_ERROR; - } - pos += n; - - if (gap + 2 > min) { - qc->error = NGX_QUIC_ERR_FRAME_ENCODING_ERROR; - ngx_log_error(NGX_LOG_INFO, c->log, 0, - "quic invalid range:%ui in ack frame", i); - return NGX_ERROR; - } - - max = min - gap - 2; - - if (range > max) { - qc->error = NGX_QUIC_ERR_FRAME_ENCODING_ERROR; - ngx_log_error(NGX_LOG_INFO, c->log, 0, - "quic invalid range:%ui in ack frame", i); - return NGX_ERROR; - } - - min = max - range; - - if (ngx_quic_handle_ack_frame_range(c, ctx, min, max, &send_time) - != NGX_OK) - { - return NGX_ERROR; - } - } - - return ngx_quic_detect_lost(c, &send_time); -} - - -static void -ngx_quic_rtt_sample(ngx_connection_t *c, ngx_quic_ack_frame_t *ack, - ngx_uint_t level, ngx_msec_t send_time) -{ - ngx_msec_t latest_rtt, ack_delay, adjusted_rtt, rttvar_sample; - ngx_quic_connection_t *qc; - - qc = ngx_quic_get_connection(c); - - latest_rtt = ngx_current_msec - send_time; - qc->latest_rtt = latest_rtt; - - if (qc->min_rtt == NGX_TIMER_INFINITE) { - qc->min_rtt = latest_rtt; - qc->avg_rtt = latest_rtt; - qc->rttvar = latest_rtt / 2; - qc->first_rtt = ngx_current_msec; - - } else { - qc->min_rtt = ngx_min(qc->min_rtt, latest_rtt); - - ack_delay = (ack->delay << qc->ctp.ack_delay_exponent) / 1000; - - if (c->ssl->handshaked) { - ack_delay = ngx_min(ack_delay, qc->ctp.max_ack_delay); - } - - adjusted_rtt = latest_rtt; - - if (qc->min_rtt + ack_delay < latest_rtt) { - adjusted_rtt -= ack_delay; - } - - rttvar_sample = ngx_abs((ngx_msec_int_t) (qc->avg_rtt - adjusted_rtt)); - qc->rttvar += (rttvar_sample >> 2) - (qc->rttvar >> 2); - qc->avg_rtt += (adjusted_rtt >> 3) - (qc->avg_rtt >> 3); - } - - ngx_log_debug4(NGX_LOG_DEBUG_EVENT, c->log, 0, - "quic rtt sample latest:%M min:%M avg:%M var:%M", - latest_rtt, qc->min_rtt, qc->avg_rtt, qc->rttvar); -} - - -static ngx_int_t -ngx_quic_handle_ack_frame_range(ngx_connection_t *c, ngx_quic_send_ctx_t *ctx, - uint64_t min, uint64_t max, ngx_quic_ack_stat_t *st) -{ - ngx_uint_t found; - ngx_queue_t *q; - ngx_quic_frame_t *f; - ngx_quic_connection_t *qc; - - qc = ngx_quic_get_connection(c); - - if (ctx->level == NGX_QUIC_ENCRYPTION_APPLICATION) { - if (ngx_quic_handle_path_mtu(c, qc->path, min, max) != NGX_OK) { - return NGX_ERROR; - } - } - - st->max_pn = NGX_TIMER_INFINITE; - found = 0; - - q = ngx_queue_head(&ctx->sent); - - while (q != ngx_queue_sentinel(&ctx->sent)) { - - f = ngx_queue_data(q, ngx_quic_frame_t, queue); - q = ngx_queue_next(q); - - if (f->pnum > max) { - break; - } - - if (f->pnum >= min) { - ngx_quic_congestion_ack(c, f); - - switch (f->type) { - case NGX_QUIC_FT_ACK: - case NGX_QUIC_FT_ACK_ECN: - ngx_quic_drop_ack_ranges(c, ctx, f->u.ack.largest); - break; - - case NGX_QUIC_FT_STREAM: - case NGX_QUIC_FT_RESET_STREAM: - ngx_quic_handle_stream_ack(c, f); - break; - } - - if (f->pnum == max) { - st->max_pn = f->send_time; - } - - /* save earliest and latest send times of frames ack'ed */ - if (st->oldest == NGX_TIMER_INFINITE || f->send_time < st->oldest) { - st->oldest = f->send_time; - } - - if (st->newest == NGX_TIMER_INFINITE || f->send_time > st->newest) { - st->newest = f->send_time; - } - - ngx_queue_remove(&f->queue); - ngx_quic_free_frame(c, f); - found = 1; - } - } - - if (!found) { - - if (max < ctx->pnum) { - /* duplicate ACK or ACK for non-ack-eliciting frame */ - return NGX_OK; - } - - ngx_log_error(NGX_LOG_INFO, c->log, 0, - "quic ACK for the packet not sent"); - - qc->error = NGX_QUIC_ERR_PROTOCOL_VIOLATION; - qc->error_ftype = NGX_QUIC_FT_ACK; - qc->error_reason = "unknown packet number"; - - return NGX_ERROR; - } - - if (!qc->push.timer_set) { - ngx_post_event(&qc->push, &ngx_posted_events); - } - - qc->pto_count = 0; - - return NGX_OK; -} - - -void -ngx_quic_congestion_ack(ngx_connection_t *c, ngx_quic_frame_t *f) -{ - size_t w_cubic; - ngx_uint_t blocked; - ngx_msec_t now, timer; - ngx_quic_congestion_t *cg; - ngx_quic_connection_t *qc; - - if (f->plen == 0) { - return; - } - - qc = ngx_quic_get_connection(c); - cg = &qc->congestion; - - if (f->pnum < qc->rst_pnum) { - return; - } - - now = ngx_current_msec; - - blocked = (cg->in_flight >= cg->window) ? 1 : 0; - - cg->in_flight -= f->plen; - - /* prevent recovery_start from wrapping */ - - timer = now - cg->recovery_start; - - if ((ngx_msec_int_t) timer < 0) { - cg->recovery_start = ngx_quic_oldest_sent_packet(c) - 1; - } - - timer = f->send_time - cg->recovery_start; - - if ((ngx_msec_int_t) timer <= 0) { - ngx_log_debug3(NGX_LOG_DEBUG_EVENT, c->log, 0, - "quic congestion ack rec t:%M win:%uz if:%uz", - now, cg->window, cg->in_flight); - - goto done; - } - - if (cg->idle) { - ngx_log_debug3(NGX_LOG_DEBUG_EVENT, c->log, 0, - "quic congestion ack idle t:%M win:%uz if:%uz", - now, cg->window, cg->in_flight); - - goto done; - } - - if (cg->window < cg->ssthresh) { - cg->window += f->plen; - - ngx_log_debug4(NGX_LOG_DEBUG_EVENT, c->log, 0, - "quic congestion ack ss t:%M win:%uz ss:%z if:%uz", - now, cg->window, cg->ssthresh, cg->in_flight); - - } else { - - /* RFC 9438, 4.2. Window Increase Function */ - - w_cubic = ngx_quic_congestion_cubic(c); - - if (cg->window < cg->w_prior) { - cg->w_est += (uint64_t) cg->mtu * f->plen - * 3 * (10 - NGX_QUIC_CUBIC_BETA) - / (10 + NGX_QUIC_CUBIC_BETA) / cg->window; - - } else { - cg->w_est += (uint64_t) cg->mtu * f->plen / cg->window; - } - - if (w_cubic < cg->w_est) { - cg->window = cg->w_est; - - ngx_log_debug4(NGX_LOG_DEBUG_EVENT, c->log, 0, - "quic congestion ack reno t:%M win:%uz c:%uz if:%uz", - now, cg->window, w_cubic, cg->in_flight); - - } else if (w_cubic > cg->window) { - - if (w_cubic >= cg->window * 3 / 2) { - cg->window += cg->mtu / 2; - - } else { - cg->window += (uint64_t) cg->mtu * (w_cubic - cg->window) - / cg->window; - } - - ngx_log_debug4(NGX_LOG_DEBUG_EVENT, c->log, 0, - "quic congestion ack cubic t:%M win:%uz c:%uz if:%uz", - now, cg->window, w_cubic, cg->in_flight); - - } else { - ngx_log_debug4(NGX_LOG_DEBUG_EVENT, c->log, 0, - "quic congestion ack skip t:%M win:%uz c:%uz if:%uz", - now, cg->window, w_cubic, cg->in_flight); - } - } - -done: - - if (blocked && cg->in_flight < cg->window) { - ngx_post_event(&qc->push, &ngx_posted_events); - } -} - - -static size_t -ngx_quic_congestion_cubic(ngx_connection_t *c) -{ - int64_t w, t, cc; - ngx_msec_t now; - ngx_quic_congestion_t *cg; - ngx_quic_connection_t *qc; - - qc = ngx_quic_get_connection(c); - cg = &qc->congestion; - - ngx_quic_congestion_idle(c, cg->idle); - - now = ngx_current_msec; - t = (ngx_msec_int_t) (now - cg->k); - - if (t > 1000000) { - w = NGX_MAX_SIZE_T_VALUE; - goto done; - } - - if (t < -1000000) { - w = 0; - goto done; - } - - /* - * RFC 9438, Figure 1 - * - * w_cubic = C * (t_msec / 1000) ^ 3 * mtu + w_max - */ - - cc = 10000000000ll / (int64_t) cg->mtu / NGX_QUIC_CUBIC_C; - w = t * t * t / cc + (int64_t) cg->w_max; - - if (w > NGX_MAX_SIZE_T_VALUE) { - w = NGX_MAX_SIZE_T_VALUE; - } - - if (w < 0) { - w = 0; - } - -done: - - ngx_log_debug3(NGX_LOG_DEBUG_EVENT, c->log, 0, - "quic cubic t:%L w:%L wm:%uz", t, w, cg->w_max); - - return w; -} - - -void -ngx_quic_congestion_idle(ngx_connection_t *c, ngx_uint_t idle) -{ - ngx_msec_t now; - ngx_quic_congestion_t *cg; - ngx_quic_connection_t *qc; - - qc = ngx_quic_get_connection(c); - cg = &qc->congestion; - - ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, - "quic congestion idle:%ui", idle); - - if (cg->window >= cg->ssthresh) { - /* RFC 9438, 5.8. Behavior for Application-Limited Flows */ - - now = ngx_current_msec; - - if (cg->idle) { - cg->k += now - cg->idle_start; - } - - cg->idle_start = now; - } - - cg->idle = idle; -} - - -static void -ngx_quic_drop_ack_ranges(ngx_connection_t *c, ngx_quic_send_ctx_t *ctx, - uint64_t pn) -{ - uint64_t base; - ngx_uint_t i, smallest, largest; - ngx_quic_ack_range_t *r; - - ngx_log_debug4(NGX_LOG_DEBUG_EVENT, c->log, 0, - "quic ngx_quic_drop_ack_ranges pn:%uL largest:%uL" - " fr:%uL nranges:%ui", pn, ctx->largest_range, - ctx->first_range, ctx->nranges); - - base = ctx->largest_range; - - if (base == NGX_QUIC_UNSET_PN) { - return; - } - - if (ctx->pending_ack != NGX_QUIC_UNSET_PN && pn >= ctx->pending_ack) { - ctx->pending_ack = NGX_QUIC_UNSET_PN; - } - - largest = base; - smallest = largest - ctx->first_range; - - if (pn >= largest) { - ctx->largest_range = NGX_QUIC_UNSET_PN; - ctx->first_range = 0; - ctx->nranges = 0; - return; - } - - if (pn >= smallest) { - ctx->first_range = largest - pn - 1; - ctx->nranges = 0; - return; - } - - for (i = 0; i < ctx->nranges; i++) { - r = &ctx->ranges[i]; - - largest = smallest - r->gap - 2; - smallest = largest - r->range; - - if (pn >= largest) { - ctx->nranges = i; - return; - } - if (pn >= smallest) { - r->range = largest - pn - 1; - ctx->nranges = i + 1; - return; - } - } -} - - -static ngx_int_t -ngx_quic_detect_lost(ngx_connection_t *c, ngx_quic_ack_stat_t *st) -{ - uint64_t pkt_thr; - ngx_uint_t i, nlost; - ngx_msec_t now, wait, thr, oldest, newest; - ngx_queue_t *q; - ngx_quic_frame_t *start; - ngx_quic_send_ctx_t *ctx; - ngx_quic_connection_t *qc; - - qc = ngx_quic_get_connection(c); - now = ngx_current_msec; - thr = ngx_quic_time_threshold(qc); - -#if (NGX_SUPPRESS_WARN) - oldest = now; - newest = now; -#endif - - nlost = 0; - - for (i = 0; i < NGX_QUIC_SEND_CTX_LAST; i++) { - - ctx = &qc->send_ctx[i]; - - if (ctx->largest_ack == NGX_QUIC_UNSET_PN) { - continue; - } - - pkt_thr = ngx_quic_packet_threshold(ctx); - - while (!ngx_queue_empty(&ctx->sent)) { - - q = ngx_queue_head(&ctx->sent); - start = ngx_queue_data(q, ngx_quic_frame_t, queue); - - if (start->pnum > ctx->largest_ack) { - break; - } - - wait = start->send_time + thr - now; - - ngx_log_debug5(NGX_LOG_DEBUG_EVENT, c->log, 0, - "quic detect_lost pnum:%uL thr:%M pthr:%uL wait:%i level:%ui", - start->pnum, thr, pkt_thr, (ngx_int_t) wait, start->level); - - if ((ngx_msec_int_t) wait > 0 - && ctx->largest_ack - start->pnum < pkt_thr) - { - break; - } - - if ((ngx_msec_int_t) (start->send_time - qc->first_rtt) > 0) { - - if (nlost == 0 - || (ngx_msec_int_t) (start->send_time - oldest) < 0) - { - oldest = start->send_time; - } - - if (nlost == 0 - || (ngx_msec_int_t) (start->send_time - newest) > 0) - { - newest = start->send_time; - } - - nlost++; - } - - ngx_quic_resend_frames(c, ctx); - } - } - - - /* RFC 9002, 7.6.2. Establishing Persistent Congestion */ - - /* - * Once acknowledged, packets are no longer tracked. Thus no send time - * information is available for such packets. This limits persistent - * congestion algorithm to packets mentioned within ACK ranges of the - * latest ACK frame. - */ - - if (st && nlost >= 2 && ((ngx_msec_int_t) (st->newest - oldest) < 0 - || (ngx_msec_int_t) (st->oldest - newest) > 0)) - { - if (newest - oldest > ngx_quic_pcg_duration(c)) { - ngx_quic_persistent_congestion(c); - } - } - - ngx_quic_set_lost_timer(c); - - return NGX_OK; -} - - -static ngx_msec_t -ngx_quic_pcg_duration(ngx_connection_t *c) -{ - ngx_msec_t duration; - ngx_quic_connection_t *qc; - - qc = ngx_quic_get_connection(c); - - duration = qc->avg_rtt; - duration += ngx_max(4 * qc->rttvar, NGX_QUIC_TIME_GRANULARITY); - duration += qc->ctp.max_ack_delay; - duration *= NGX_QUIC_PERSISTENT_CONGESTION_THR; - - return duration; -} - - -static void -ngx_quic_persistent_congestion(ngx_connection_t *c) -{ - ngx_quic_congestion_t *cg; - ngx_quic_connection_t *qc; - - qc = ngx_quic_get_connection(c); - cg = &qc->congestion; - - cg->mtu = qc->path->mtu; - cg->recovery_start = ngx_quic_oldest_sent_packet(c) - 1; - cg->window = cg->mtu * 2; - - ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0, - "quic congestion persistent t:%M win:%uz", - ngx_current_msec, cg->window); -} - - -static ngx_msec_t -ngx_quic_oldest_sent_packet(ngx_connection_t *c) -{ - ngx_msec_t oldest; - ngx_uint_t i; - ngx_queue_t *q; - ngx_quic_frame_t *start; - ngx_quic_send_ctx_t *ctx; - ngx_quic_connection_t *qc; - - qc = ngx_quic_get_connection(c); - oldest = ngx_current_msec; - - for (i = 0; i < NGX_QUIC_SEND_CTX_LAST; i++) { - ctx = &qc->send_ctx[i]; - - if (!ngx_queue_empty(&ctx->sent)) { - q = ngx_queue_head(&ctx->sent); - start = ngx_queue_data(q, ngx_quic_frame_t, queue); - - if ((ngx_msec_int_t) (start->send_time - oldest) < 0) { - oldest = start->send_time; - } - } - } - - return oldest; -} - - -void -ngx_quic_resend_frames(ngx_connection_t *c, ngx_quic_send_ctx_t *ctx) -{ - uint64_t pnum; - ngx_queue_t *q; - ngx_quic_frame_t *f, *start; - ngx_quic_stream_t *qs; - ngx_quic_connection_t *qc; - - qc = ngx_quic_get_connection(c); - q = ngx_queue_head(&ctx->sent); - start = ngx_queue_data(q, ngx_quic_frame_t, queue); - pnum = start->pnum; - - ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, - "quic resend packet pnum:%uL", start->pnum); - - ngx_quic_congestion_lost(c, start); - - do { - f = ngx_queue_data(q, ngx_quic_frame_t, queue); - - if (f->pnum != pnum) { - break; - } - - q = ngx_queue_next(q); - - ngx_queue_remove(&f->queue); - - switch (f->type) { - case NGX_QUIC_FT_ACK: - case NGX_QUIC_FT_ACK_ECN: - if (ctx->level == NGX_QUIC_ENCRYPTION_APPLICATION) { - /* force generation of most recent acknowledgment */ - ctx->send_ack = NGX_QUIC_MAX_ACK_GAP; - } - - ngx_quic_free_frame(c, f); - break; - - case NGX_QUIC_FT_PING: - case NGX_QUIC_FT_PATH_CHALLENGE: - case NGX_QUIC_FT_PATH_RESPONSE: - case NGX_QUIC_FT_CONNECTION_CLOSE: - ngx_quic_free_frame(c, f); - break; - - case NGX_QUIC_FT_MAX_DATA: - f->u.max_data.max_data = qc->streams.recv_max_data; - ngx_quic_queue_frame(qc, f); - break; - - case NGX_QUIC_FT_MAX_STREAMS: - case NGX_QUIC_FT_MAX_STREAMS2: - f->u.max_streams.limit = f->u.max_streams.bidi - ? qc->streams.client_max_streams_bidi - : qc->streams.client_max_streams_uni; - ngx_quic_queue_frame(qc, f); - break; - - case NGX_QUIC_FT_MAX_STREAM_DATA: - qs = ngx_quic_find_stream(&qc->streams.tree, - f->u.max_stream_data.id); - if (qs == NULL) { - ngx_quic_free_frame(c, f); - break; - } - - f->u.max_stream_data.limit = qs->recv_max_data; - ngx_quic_queue_frame(qc, f); - break; - - case NGX_QUIC_FT_STREAM: - qs = ngx_quic_find_stream(&qc->streams.tree, f->u.stream.stream_id); - - if (qs == NULL - || qs->send_state == NGX_QUIC_STREAM_SEND_RESET_SENT - || qs->send_state == NGX_QUIC_STREAM_SEND_RESET_RECVD) - { - ngx_quic_free_frame(c, f); - break; - } - - /* fall through */ - - default: - ngx_queue_insert_tail(&ctx->frames, &f->queue); - } - - } while (q != ngx_queue_sentinel(&ctx->sent)); - - if (qc->closing) { - return; - } - - ngx_post_event(&qc->push, &ngx_posted_events); -} - - -static void -ngx_quic_congestion_lost(ngx_connection_t *c, ngx_quic_frame_t *f) -{ - ngx_uint_t blocked; - ngx_msec_t now, timer; - ngx_quic_congestion_t *cg; - ngx_quic_connection_t *qc; - - if (f->plen == 0) { - return; - } - - qc = ngx_quic_get_connection(c); - cg = &qc->congestion; - - if (f->pnum < qc->rst_pnum) { - return; - } - - blocked = (cg->in_flight >= cg->window) ? 1 : 0; - - cg->in_flight -= f->plen; - f->plen = 0; - - timer = f->send_time - cg->recovery_start; - - now = ngx_current_msec; - - if ((ngx_msec_int_t) timer <= 0) { - ngx_log_debug3(NGX_LOG_DEBUG_EVENT, c->log, 0, - "quic congestion lost rec t:%M win:%uz if:%uz", - now, cg->window, cg->in_flight); - - goto done; - } - - if (f->ignore_loss) { - ngx_log_debug3(NGX_LOG_DEBUG_EVENT, c->log, 0, - "quic congestion lost ignore t:%M win:%uz if:%uz", - now, cg->window, cg->in_flight); - - goto done; - } - - /* RFC 9438, 4.6. Multiplicative Decrease */ - - cg->mtu = qc->path->mtu; - cg->recovery_start = now; - cg->w_prior = cg->window; - /* RFC 9438, 4.7. Fast Convergence */ - cg->w_max = (cg->window < cg->w_max) - ? cg->window * (10 + NGX_QUIC_CUBIC_BETA) / 20 : cg->window; - cg->ssthresh = cg->in_flight * NGX_QUIC_CUBIC_BETA / 10; - cg->window = ngx_max(cg->ssthresh, cg->mtu * 2); - cg->w_est = cg->window; - cg->k = now + ngx_quic_congestion_cubic_time(c); - cg->idle_start = now; - - ngx_log_debug3(NGX_LOG_DEBUG_EVENT, c->log, 0, - "quic congestion lost t:%M win:%uz if:%uz", - now, cg->window, cg->in_flight); - -done: - - if (blocked && cg->in_flight < cg->window) { - ngx_post_event(&qc->push, &ngx_posted_events); - } -} - - -static ngx_msec_t -ngx_quic_congestion_cubic_time(ngx_connection_t *c) -{ - int64_t v, x, d, cc; - ngx_uint_t n; - ngx_quic_congestion_t *cg; - ngx_quic_connection_t *qc; - - qc = ngx_quic_get_connection(c); - cg = &qc->congestion; - - /* - * RFC 9438, Figure 2 - * - * k_msec = ((w_max - cwnd_epoch) / C / mtu) ^ 1/3 * 1000 - */ - - if (cg->w_max <= cg->window) { - return 0; - } - - cc = 10000000000ll / (int64_t) cg->mtu / NGX_QUIC_CUBIC_C; - v = (int64_t) (cg->w_max - cg->window) * cc; - - /* - * Newton-Raphson method for x ^ 3 = v: - * - * x_next = (2 * x_prev + v / x_prev ^ 2) / 3 - */ - - x = 5000; - - for (n = 1; n <= 10; n++) { - d = (v / x / x - x) / 3; - x += d; - - if (ngx_abs(d) <= 100) { - break; - } - } - - if (x > NGX_MAX_SIZE_T_VALUE) { - return NGX_MAX_SIZE_T_VALUE; - } - - ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0, - "quic cubic time:%L n:%ui", x, n); - - return x; -} - - -void -ngx_quic_set_lost_timer(ngx_connection_t *c) -{ - uint64_t pkt_thr; - ngx_uint_t i; - ngx_msec_t now; - ngx_queue_t *q; - ngx_msec_int_t lost, pto, w; - ngx_quic_frame_t *f; - ngx_quic_send_ctx_t *ctx; - ngx_quic_connection_t *qc; - - qc = ngx_quic_get_connection(c); - now = ngx_current_msec; - - lost = -1; - pto = -1; - - for (i = 0; i < NGX_QUIC_SEND_CTX_LAST; i++) { - ctx = &qc->send_ctx[i]; - - if (ngx_queue_empty(&ctx->sent)) { - continue; - } - - if (ctx->largest_ack != NGX_QUIC_UNSET_PN) { - q = ngx_queue_head(&ctx->sent); - f = ngx_queue_data(q, ngx_quic_frame_t, queue); - w = (ngx_msec_int_t) - (f->send_time + ngx_quic_time_threshold(qc) - now); - - if (f->pnum <= ctx->largest_ack) { - pkt_thr = ngx_quic_packet_threshold(ctx); - - if (w < 0 || ctx->largest_ack - f->pnum >= pkt_thr) { - w = 0; - } - - if (lost == -1 || w < lost) { - lost = w; - } - } - } - - q = ngx_queue_last(&ctx->sent); - f = ngx_queue_data(q, ngx_quic_frame_t, queue); - w = (ngx_msec_int_t) - (f->send_time + (ngx_quic_pto(c, ctx) << qc->pto_count) - now); - - if (w < 0) { - w = 0; - } - - if (pto == -1 || w < pto) { - pto = w; - } - } - - if (qc->pto.timer_set) { - ngx_del_timer(&qc->pto); - } - - if (lost != -1) { - ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, - "quic lost timer lost:%M", lost); - - qc->pto.handler = ngx_quic_lost_handler; - ngx_add_timer(&qc->pto, lost); - return; - } - - if (pto != -1) { - ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, - "quic lost timer pto:%M", pto); - - qc->pto.handler = ngx_quic_pto_handler; - ngx_add_timer(&qc->pto, pto); - return; - } - - ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0, "quic lost timer unset"); -} - - -ngx_msec_t -ngx_quic_pto(ngx_connection_t *c, ngx_quic_send_ctx_t *ctx) -{ - ngx_msec_t duration; - ngx_quic_connection_t *qc; - - qc = ngx_quic_get_connection(c); - - /* RFC 9002, Appendix A.8. Setting the Loss Detection Timer */ - - duration = qc->avg_rtt; - duration += ngx_max(4 * qc->rttvar, NGX_QUIC_TIME_GRANULARITY); - - if (ctx->level == NGX_QUIC_ENCRYPTION_APPLICATION && c->ssl->handshaked) { - duration += qc->ctp.max_ack_delay; - } - - return duration; -} - - -static -void ngx_quic_lost_handler(ngx_event_t *ev) -{ - ngx_connection_t *c; - - ngx_log_debug0(NGX_LOG_DEBUG_EVENT, ev->log, 0, "quic lost timer"); - - c = ev->data; - - if (ngx_quic_detect_lost(c, NULL) != NGX_OK) { - ngx_quic_close_connection(c, NGX_ERROR); - return; - } - - ngx_quic_connstate_dbg(c); -} - - -void -ngx_quic_pto_handler(ngx_event_t *ev) -{ - ngx_uint_t i, n; - ngx_msec_t now; - ngx_queue_t *q; - ngx_msec_int_t w; - ngx_connection_t *c; - ngx_quic_frame_t *f; - ngx_quic_send_ctx_t *ctx; - ngx_quic_connection_t *qc; - - ngx_log_debug0(NGX_LOG_DEBUG_EVENT, ev->log, 0, "quic pto timer"); - - c = ev->data; - qc = ngx_quic_get_connection(c); - now = ngx_current_msec; - - for (i = 0; i < NGX_QUIC_SEND_CTX_LAST; i++) { - - ctx = &qc->send_ctx[i]; - - if (ngx_queue_empty(&ctx->sent)) { - continue; - } - - q = ngx_queue_last(&ctx->sent); - f = ngx_queue_data(q, ngx_quic_frame_t, queue); - w = (ngx_msec_int_t) - (f->send_time + (ngx_quic_pto(c, ctx) << qc->pto_count) - now); - - if (f->pnum <= ctx->largest_ack - && ctx->largest_ack != NGX_QUIC_UNSET_PN) - { - continue; - } - - if (w > 0) { - continue; - } - - ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0, - "quic pto %s pto_count:%ui", - ngx_quic_level_name(ctx->level), qc->pto_count); - - for (n = 0; n < 2; n++) { - - f = ngx_quic_alloc_frame(c); - if (f == NULL) { - goto failed; - } - - f->level = ctx->level; - f->type = NGX_QUIC_FT_PING; - f->ignore_congestion = 1; - - if (ngx_quic_frame_sendto(c, f, 0, qc->path) == NGX_ERROR) { - goto failed; - } - } - } - - qc->pto_count++; - - ngx_quic_set_lost_timer(c); - - ngx_quic_connstate_dbg(c); - - return; - -failed: - - ngx_quic_close_connection(c, NGX_ERROR); - return; -} - - -ngx_int_t -ngx_quic_ack_packet(ngx_connection_t *c, ngx_quic_header_t *pkt) -{ - uint64_t base, largest, smallest, gs, ge, gap, range, pn; - uint64_t prev_pending; - ngx_uint_t i, nr; - ngx_quic_send_ctx_t *ctx; - ngx_quic_ack_range_t *r; - ngx_quic_connection_t *qc; - - c->log->action = "preparing ack"; - - qc = ngx_quic_get_connection(c); - - ctx = ngx_quic_get_send_ctx(qc, pkt->level); - - ngx_log_debug4(NGX_LOG_DEBUG_EVENT, c->log, 0, - "quic ngx_quic_ack_packet pn:%uL largest %L fr:%uL" - " nranges:%ui", pkt->pn, (int64_t) ctx->largest_range, - ctx->first_range, ctx->nranges); - - if (!ngx_quic_keys_available(qc->keys, ctx->level, 1)) { - return NGX_OK; - } - - prev_pending = ctx->pending_ack; - - if (pkt->need_ack) { - - ngx_post_event(&qc->push, &ngx_posted_events); - - if (ctx->send_ack == 0) { - ctx->ack_delay_start = ngx_current_msec; - } - - ctx->send_ack++; - - if (ctx->pending_ack == NGX_QUIC_UNSET_PN - || ctx->pending_ack < pkt->pn) - { - ctx->pending_ack = pkt->pn; - } - } - - base = ctx->largest_range; - pn = pkt->pn; - - if (base == NGX_QUIC_UNSET_PN) { - ctx->largest_range = pn; - ctx->largest_received = pkt->received; - return NGX_OK; - } - - if (base == pn) { - return NGX_OK; - } - - largest = base; - smallest = largest - ctx->first_range; - - if (pn > base) { - - if (pn - base == 1) { - ctx->first_range++; - ctx->largest_range = pn; - ctx->largest_received = pkt->received; - - return NGX_OK; - - } else { - /* new gap in front of current largest */ - - /* no place for new range, send current range as is */ - if (ctx->nranges == NGX_QUIC_MAX_RANGES) { - - if (prev_pending != NGX_QUIC_UNSET_PN) { - if (ngx_quic_send_ack(c, ctx) != NGX_OK) { - return NGX_ERROR; - } - } - - if (prev_pending == ctx->pending_ack || !pkt->need_ack) { - ctx->pending_ack = NGX_QUIC_UNSET_PN; - } - } - - gap = pn - base - 2; - range = ctx->first_range; - - ctx->first_range = 0; - ctx->largest_range = pn; - ctx->largest_received = pkt->received; - - /* packet is out of order, force send */ - if (pkt->need_ack) { - ctx->send_ack = NGX_QUIC_MAX_ACK_GAP; - } - - i = 0; - - goto insert; - } - } - - /* pn < base, perform lookup in existing ranges */ - - /* packet is out of order */ - if (pkt->need_ack) { - ctx->send_ack = NGX_QUIC_MAX_ACK_GAP; - } - - if (pn >= smallest && pn <= largest) { - return NGX_OK; - } - -#if (NGX_SUPPRESS_WARN) - r = NULL; -#endif - - for (i = 0; i < ctx->nranges; i++) { - r = &ctx->ranges[i]; - - ge = smallest - 1; - gs = ge - r->gap; - - if (pn >= gs && pn <= ge) { - - if (gs == ge) { - /* gap size is exactly one packet, now filled */ - - /* data moves to previous range, current is removed */ - - if (i == 0) { - ctx->first_range += r->range + 2; - - } else { - ctx->ranges[i - 1].range += r->range + 2; - } - - nr = ctx->nranges - i - 1; - if (nr) { - ngx_memmove(&ctx->ranges[i], &ctx->ranges[i + 1], - sizeof(ngx_quic_ack_range_t) * nr); - } - - ctx->nranges--; - - } else if (pn == gs) { - /* current gap shrinks from tail (current range grows) */ - r->gap--; - r->range++; - - } else if (pn == ge) { - /* current gap shrinks from head (previous range grows) */ - r->gap--; - - if (i == 0) { - ctx->first_range++; - - } else { - ctx->ranges[i - 1].range++; - } - - } else { - /* current gap is split into two parts */ - - gap = ge - pn - 1; - range = 0; - - if (ctx->nranges == NGX_QUIC_MAX_RANGES) { - if (prev_pending != NGX_QUIC_UNSET_PN) { - if (ngx_quic_send_ack(c, ctx) != NGX_OK) { - return NGX_ERROR; - } - } - - if (prev_pending == ctx->pending_ack || !pkt->need_ack) { - ctx->pending_ack = NGX_QUIC_UNSET_PN; - } - } - - r->gap = pn - gs - 1; - goto insert; - } - - return NGX_OK; - } - - largest = smallest - r->gap - 2; - smallest = largest - r->range; - - if (pn >= smallest && pn <= largest) { - /* this packet number is already known */ - return NGX_OK; - } - - } - - if (pn == smallest - 1) { - /* extend first or last range */ - - if (i == 0) { - ctx->first_range++; - - } else { - r->range++; - } - - return NGX_OK; - } - - /* nothing found, add new range at the tail */ - - if (ctx->nranges == NGX_QUIC_MAX_RANGES) { - /* packet is too old to keep it */ - - if (pkt->need_ack) { - return ngx_quic_send_ack_range(c, ctx, pn, pn); - } - - return NGX_OK; - } - - gap = smallest - 2 - pn; - range = 0; - -insert: - - if (ctx->nranges < NGX_QUIC_MAX_RANGES) { - ctx->nranges++; - } - - ngx_memmove(&ctx->ranges[i + 1], &ctx->ranges[i], - sizeof(ngx_quic_ack_range_t) * (ctx->nranges - i - 1)); - - ctx->ranges[i].gap = gap; - ctx->ranges[i].range = range; - - return NGX_OK; -} - - -ngx_int_t -ngx_quic_generate_ack(ngx_connection_t *c, ngx_quic_send_ctx_t *ctx) -{ - ngx_msec_t delay; - ngx_quic_connection_t *qc; - - if (!ctx->send_ack) { - return NGX_OK; - } - - if (ctx->level == NGX_QUIC_ENCRYPTION_APPLICATION) { - - delay = ngx_current_msec - ctx->ack_delay_start; - qc = ngx_quic_get_connection(c); - - if (ngx_queue_empty(&ctx->frames) - && ctx->send_ack < NGX_QUIC_MAX_ACK_GAP - && delay < qc->tp.max_ack_delay) - { - if (!qc->push.timer_set && !qc->closing) { - ngx_add_timer(&qc->push, - qc->tp.max_ack_delay - delay); - } - - return NGX_OK; - } - } - - if (ngx_quic_send_ack(c, ctx) != NGX_OK) { - return NGX_ERROR; - } - - ctx->send_ack = 0; - - return NGX_OK; -} diff --git a/src/deps/src/nginx-1.30.3/src/event/quic/ngx_event_quic_ack.h b/src/deps/src/nginx-1.30.3/src/event/quic/ngx_event_quic_ack.h deleted file mode 100644 index 4ad59660fd..0000000000 --- a/src/deps/src/nginx-1.30.3/src/event/quic/ngx_event_quic_ack.h +++ /dev/null @@ -1,31 +0,0 @@ - -/* - * Copyright (C) Nginx, Inc. - */ - - -#ifndef _NGX_EVENT_QUIC_ACK_H_INCLUDED_ -#define _NGX_EVENT_QUIC_ACK_H_INCLUDED_ - - -#include -#include - - -ngx_int_t ngx_quic_handle_ack_frame(ngx_connection_t *c, - ngx_quic_header_t *pkt, ngx_quic_frame_t *f); - -void ngx_quic_congestion_ack(ngx_connection_t *c, - ngx_quic_frame_t *frame); -void ngx_quic_congestion_idle(ngx_connection_t *c, ngx_uint_t idle); -void ngx_quic_resend_frames(ngx_connection_t *c, ngx_quic_send_ctx_t *ctx); -void ngx_quic_set_lost_timer(ngx_connection_t *c); -void ngx_quic_pto_handler(ngx_event_t *ev); -ngx_msec_t ngx_quic_pto(ngx_connection_t *c, ngx_quic_send_ctx_t *ctx); - -ngx_int_t ngx_quic_ack_packet(ngx_connection_t *c, - ngx_quic_header_t *pkt); -ngx_int_t ngx_quic_generate_ack(ngx_connection_t *c, - ngx_quic_send_ctx_t *ctx); - -#endif /* _NGX_EVENT_QUIC_ACK_H_INCLUDED_ */ diff --git a/src/deps/src/nginx-1.30.3/src/event/quic/ngx_event_quic_bpf.c b/src/deps/src/nginx-1.30.3/src/event/quic/ngx_event_quic_bpf.c deleted file mode 100644 index ab024ad560..0000000000 --- a/src/deps/src/nginx-1.30.3/src/event/quic/ngx_event_quic_bpf.c +++ /dev/null @@ -1,657 +0,0 @@ - -/* - * Copyright (C) Nginx, Inc. - */ - - -#include -#include - - -#define NGX_QUIC_BPF_VARNAME "NGINX_BPF_MAPS" -#define NGX_QUIC_BPF_VARSEP ';' -#define NGX_QUIC_BPF_ADDRSEP '#' - - -#define ngx_quic_bpf_get_conf(cycle) \ - (ngx_quic_bpf_conf_t *) ngx_get_conf(cycle->conf_ctx, ngx_quic_bpf_module) - -#define ngx_quic_bpf_get_old_conf(cycle) \ - cycle->old_cycle->conf_ctx ? ngx_quic_bpf_get_conf(cycle->old_cycle) \ - : NULL - -#define ngx_core_get_conf(cycle) \ - (ngx_core_conf_t *) ngx_get_conf(cycle->conf_ctx, ngx_core_module) - - -typedef struct { - ngx_queue_t queue; - int map_fd; - - struct sockaddr *sockaddr; - socklen_t socklen; - ngx_uint_t unused; /* unsigned unused:1; */ -} ngx_quic_sock_group_t; - - -typedef struct { - ngx_flag_t enabled; - ngx_uint_t map_size; - ngx_queue_t groups; /* of ngx_quic_sock_group_t */ -} ngx_quic_bpf_conf_t; - - -static void *ngx_quic_bpf_create_conf(ngx_cycle_t *cycle); -static ngx_int_t ngx_quic_bpf_module_init(ngx_cycle_t *cycle); - -static void ngx_quic_bpf_cleanup(void *data); -static ngx_inline void ngx_quic_bpf_close(ngx_log_t *log, int fd, - const char *name); - -static ngx_quic_sock_group_t *ngx_quic_bpf_find_group(ngx_quic_bpf_conf_t *bcf, - ngx_listening_t *ls); -static ngx_quic_sock_group_t *ngx_quic_bpf_alloc_group(ngx_cycle_t *cycle, - struct sockaddr *sa, socklen_t socklen); -static ngx_quic_sock_group_t *ngx_quic_bpf_create_group(ngx_cycle_t *cycle, - ngx_listening_t *ls); -static ngx_quic_sock_group_t *ngx_quic_bpf_get_group(ngx_cycle_t *cycle, - ngx_listening_t *ls); -static ngx_int_t ngx_quic_bpf_group_add_socket(ngx_cycle_t *cycle, - ngx_listening_t *ls); -static uint64_t ngx_quic_bpf_socket_key(ngx_fd_t fd, ngx_log_t *log); - -static ngx_int_t ngx_quic_bpf_export_maps(ngx_cycle_t *cycle); -static ngx_int_t ngx_quic_bpf_import_maps(ngx_cycle_t *cycle); - -extern ngx_bpf_program_t ngx_quic_reuseport_helper; - - -static ngx_command_t ngx_quic_bpf_commands[] = { - - { ngx_string("quic_bpf"), - NGX_MAIN_CONF|NGX_DIRECT_CONF|NGX_CONF_FLAG, - ngx_conf_set_flag_slot, - 0, - offsetof(ngx_quic_bpf_conf_t, enabled), - NULL }, - - ngx_null_command -}; - - -static ngx_core_module_t ngx_quic_bpf_module_ctx = { - ngx_string("quic_bpf"), - ngx_quic_bpf_create_conf, - NULL -}; - - -ngx_module_t ngx_quic_bpf_module = { - NGX_MODULE_V1, - &ngx_quic_bpf_module_ctx, /* module context */ - ngx_quic_bpf_commands, /* module directives */ - NGX_CORE_MODULE, /* module type */ - NULL, /* init master */ - ngx_quic_bpf_module_init, /* init module */ - NULL, /* init process */ - NULL, /* init thread */ - NULL, /* exit thread */ - NULL, /* exit process */ - NULL, /* exit master */ - NGX_MODULE_V1_PADDING -}; - - -static void * -ngx_quic_bpf_create_conf(ngx_cycle_t *cycle) -{ - ngx_quic_bpf_conf_t *bcf; - - bcf = ngx_pcalloc(cycle->pool, sizeof(ngx_quic_bpf_conf_t)); - if (bcf == NULL) { - return NULL; - } - - bcf->enabled = NGX_CONF_UNSET; - bcf->map_size = NGX_CONF_UNSET_UINT; - - ngx_queue_init(&bcf->groups); - - return bcf; -} - - -static ngx_int_t -ngx_quic_bpf_module_init(ngx_cycle_t *cycle) -{ - ngx_uint_t i; - ngx_listening_t *ls; - ngx_core_conf_t *ccf; - ngx_pool_cleanup_t *cln; - ngx_quic_bpf_conf_t *bcf; - - if (ngx_test_config) { - /* - * during config test, SO_REUSEPORT socket option is - * not set, thus making further processing meaningless - */ - return NGX_OK; - } - - ccf = ngx_core_get_conf(cycle); - bcf = ngx_quic_bpf_get_conf(cycle); - - ngx_conf_init_value(bcf->enabled, 0); - - bcf->map_size = ccf->worker_processes * 4; - - cln = ngx_pool_cleanup_add(cycle->pool, 0); - if (cln == NULL) { - goto failed; - } - - cln->data = bcf; - cln->handler = ngx_quic_bpf_cleanup; - - if (ngx_inherited && ngx_is_init_cycle(cycle->old_cycle)) { - if (ngx_quic_bpf_import_maps(cycle) != NGX_OK) { - goto failed; - } - } - - ls = cycle->listening.elts; - - for (i = 0; i < cycle->listening.nelts; i++) { - if (ls[i].quic && ls[i].reuseport) { - if (ngx_quic_bpf_group_add_socket(cycle, &ls[i]) != NGX_OK) { - goto failed; - } - } - } - - if (ngx_quic_bpf_export_maps(cycle) != NGX_OK) { - goto failed; - } - - return NGX_OK; - -failed: - - if (ngx_is_init_cycle(cycle->old_cycle)) { - ngx_log_error(NGX_LOG_EMERG, cycle->log, 0, - "ngx_quic_bpf_module failed to initialize, check limits"); - - /* refuse to start */ - return NGX_ERROR; - } - - /* - * returning error now will lead to master process exiting immediately - * leaving worker processes orphaned, what is really unexpected. - * Instead, just issue a not about failed initialization and try - * to cleanup a bit. Still program can be already loaded to kernel - * for some reuseport groups, and there is no way to revert, so - * behaviour may be inconsistent. - */ - - ngx_log_error(NGX_LOG_EMERG, cycle->log, 0, - "ngx_quic_bpf_module failed to initialize properly, ignored." - "please check limits and note that nginx state now " - "can be inconsistent and restart may be required"); - - return NGX_OK; -} - - -static void -ngx_quic_bpf_cleanup(void *data) -{ - ngx_quic_bpf_conf_t *bcf = (ngx_quic_bpf_conf_t *) data; - - ngx_queue_t *q; - ngx_quic_sock_group_t *grp; - - for (q = ngx_queue_head(&bcf->groups); - q != ngx_queue_sentinel(&bcf->groups); - q = ngx_queue_next(q)) - { - grp = ngx_queue_data(q, ngx_quic_sock_group_t, queue); - - ngx_quic_bpf_close(ngx_cycle->log, grp->map_fd, "map"); - } -} - - -static ngx_inline void -ngx_quic_bpf_close(ngx_log_t *log, int fd, const char *name) -{ - if (close(fd) != -1) { - return; - } - - ngx_log_error(NGX_LOG_EMERG, log, ngx_errno, - "quic bpf close %s fd:%d failed", name, fd); -} - - -static ngx_quic_sock_group_t * -ngx_quic_bpf_find_group(ngx_quic_bpf_conf_t *bcf, ngx_listening_t *ls) -{ - ngx_queue_t *q; - ngx_quic_sock_group_t *grp; - - for (q = ngx_queue_head(&bcf->groups); - q != ngx_queue_sentinel(&bcf->groups); - q = ngx_queue_next(q)) - { - grp = ngx_queue_data(q, ngx_quic_sock_group_t, queue); - - if (ngx_cmp_sockaddr(ls->sockaddr, ls->socklen, - grp->sockaddr, grp->socklen, 1) - == NGX_OK) - { - return grp; - } - } - - return NULL; -} - - -static ngx_quic_sock_group_t * -ngx_quic_bpf_alloc_group(ngx_cycle_t *cycle, struct sockaddr *sa, - socklen_t socklen) -{ - ngx_quic_bpf_conf_t *bcf; - ngx_quic_sock_group_t *grp; - - bcf = ngx_quic_bpf_get_conf(cycle); - - grp = ngx_pcalloc(cycle->pool, sizeof(ngx_quic_sock_group_t)); - if (grp == NULL) { - return NULL; - } - - grp->socklen = socklen; - grp->sockaddr = ngx_palloc(cycle->pool, socklen); - if (grp->sockaddr == NULL) { - return NULL; - } - ngx_memcpy(grp->sockaddr, sa, socklen); - - ngx_queue_insert_tail(&bcf->groups, &grp->queue); - - return grp; -} - - -static ngx_quic_sock_group_t * -ngx_quic_bpf_create_group(ngx_cycle_t *cycle, ngx_listening_t *ls) -{ - int progfd, failed, flags, rc; - ngx_quic_bpf_conf_t *bcf; - ngx_quic_sock_group_t *grp; - - bcf = ngx_quic_bpf_get_conf(cycle); - - if (!bcf->enabled) { - return NULL; - } - - grp = ngx_quic_bpf_alloc_group(cycle, ls->sockaddr, ls->socklen); - if (grp == NULL) { - return NULL; - } - - grp->map_fd = ngx_bpf_map_create(cycle->log, BPF_MAP_TYPE_SOCKHASH, - sizeof(uint64_t), sizeof(uint64_t), - bcf->map_size, 0); - if (grp->map_fd == -1) { - goto failed; - } - - flags = fcntl(grp->map_fd, F_GETFD); - if (flags == -1) { - ngx_log_error(NGX_LOG_EMERG, cycle->log, errno, - "quic bpf getfd failed"); - goto failed; - } - - /* need to inherit map during binary upgrade after exec */ - flags &= ~FD_CLOEXEC; - - rc = fcntl(grp->map_fd, F_SETFD, flags); - if (rc == -1) { - ngx_log_error(NGX_LOG_EMERG, cycle->log, errno, - "quic bpf setfd failed"); - goto failed; - } - - ngx_bpf_program_link(&ngx_quic_reuseport_helper, - "ngx_quic_sockmap", grp->map_fd); - - progfd = ngx_bpf_load_program(cycle->log, &ngx_quic_reuseport_helper); - if (progfd < 0) { - goto failed; - } - - failed = 0; - - if (setsockopt(ls->fd, SOL_SOCKET, SO_ATTACH_REUSEPORT_EBPF, - &progfd, sizeof(int)) - == -1) - { - ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_socket_errno, - "quic bpf setsockopt(SO_ATTACH_REUSEPORT_EBPF) failed"); - failed = 1; - } - - ngx_quic_bpf_close(cycle->log, progfd, "program"); - - if (failed) { - goto failed; - } - - ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0, - "quic bpf sockmap created fd:%d", grp->map_fd); - return grp; - -failed: - - if (grp->map_fd != -1) { - ngx_quic_bpf_close(cycle->log, grp->map_fd, "map"); - } - - ngx_queue_remove(&grp->queue); - - return NULL; -} - - -static ngx_quic_sock_group_t * -ngx_quic_bpf_get_group(ngx_cycle_t *cycle, ngx_listening_t *ls) -{ - ngx_quic_bpf_conf_t *bcf, *old_bcf; - ngx_quic_sock_group_t *grp, *ogrp; - - bcf = ngx_quic_bpf_get_conf(cycle); - - grp = ngx_quic_bpf_find_group(bcf, ls); - if (grp) { - return grp; - } - - old_bcf = ngx_quic_bpf_get_old_conf(cycle); - - if (old_bcf == NULL) { - return ngx_quic_bpf_create_group(cycle, ls); - } - - ogrp = ngx_quic_bpf_find_group(old_bcf, ls); - if (ogrp == NULL) { - return ngx_quic_bpf_create_group(cycle, ls); - } - - grp = ngx_quic_bpf_alloc_group(cycle, ls->sockaddr, ls->socklen); - if (grp == NULL) { - return NULL; - } - - grp->map_fd = dup(ogrp->map_fd); - if (grp->map_fd == -1) { - ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno, - "quic bpf failed to duplicate bpf map descriptor"); - - ngx_queue_remove(&grp->queue); - - return NULL; - } - - ngx_log_debug2(NGX_LOG_DEBUG_EVENT, cycle->log, 0, - "quic bpf sockmap fd duplicated old:%d new:%d", - ogrp->map_fd, grp->map_fd); - - return grp; -} - - -static ngx_int_t -ngx_quic_bpf_group_add_socket(ngx_cycle_t *cycle, ngx_listening_t *ls) -{ - uint64_t cookie; - ngx_quic_bpf_conf_t *bcf; - ngx_quic_sock_group_t *grp; - - bcf = ngx_quic_bpf_get_conf(cycle); - - grp = ngx_quic_bpf_get_group(cycle, ls); - - if (grp == NULL) { - if (!bcf->enabled) { - return NGX_OK; - } - - return NGX_ERROR; - } - - grp->unused = 0; - - cookie = ngx_quic_bpf_socket_key(ls->fd, cycle->log); - if (cookie == (uint64_t) NGX_ERROR) { - return NGX_ERROR; - } - - /* map[cookie] = socket; for use in kernel helper */ - if (ngx_bpf_map_update(grp->map_fd, &cookie, &ls->fd, BPF_ANY) == -1) { - ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno, - "quic bpf failed to update socket map key=%xL", cookie); - return NGX_ERROR; - } - - ngx_log_debug4(NGX_LOG_DEBUG_EVENT, cycle->log, 0, - "quic bpf sockmap fd:%d add socket:%d cookie:0x%xL worker:%ui", - grp->map_fd, ls->fd, cookie, ls->worker); - - /* do not inherit this socket */ - ls->ignore = 1; - - return NGX_OK; -} - - -static uint64_t -ngx_quic_bpf_socket_key(ngx_fd_t fd, ngx_log_t *log) -{ - uint64_t cookie; - socklen_t optlen; - - optlen = sizeof(cookie); - - if (getsockopt(fd, SOL_SOCKET, SO_COOKIE, &cookie, &optlen) == -1) { - ngx_log_error(NGX_LOG_EMERG, log, ngx_socket_errno, - "quic bpf getsockopt(SO_COOKIE) failed"); - - return (ngx_uint_t) NGX_ERROR; - } - - return cookie; -} - - -static ngx_int_t -ngx_quic_bpf_export_maps(ngx_cycle_t *cycle) -{ - u_char *p, *buf; - size_t len; - ngx_str_t *var; - ngx_queue_t *q; - ngx_core_conf_t *ccf; - ngx_quic_bpf_conf_t *bcf; - ngx_quic_sock_group_t *grp; - - ccf = ngx_core_get_conf(cycle); - bcf = ngx_quic_bpf_get_conf(cycle); - - len = sizeof(NGX_QUIC_BPF_VARNAME) + 1; - - q = ngx_queue_head(&bcf->groups); - - while (q != ngx_queue_sentinel(&bcf->groups)) { - - grp = ngx_queue_data(q, ngx_quic_sock_group_t, queue); - - q = ngx_queue_next(q); - - if (grp->unused) { - /* - * map was inherited, but it is not used in this configuration; - * do not pass such map further and drop the group to prevent - * interference with changes during reload - */ - - ngx_quic_bpf_close(cycle->log, grp->map_fd, "map"); - ngx_queue_remove(&grp->queue); - - continue; - } - - len += NGX_INT32_LEN + 1 + NGX_SOCKADDR_STRLEN + 1; - } - - len++; - - buf = ngx_palloc(cycle->pool, len); - if (buf == NULL) { - return NGX_ERROR; - } - - p = ngx_cpymem(buf, NGX_QUIC_BPF_VARNAME "=", - sizeof(NGX_QUIC_BPF_VARNAME)); - - for (q = ngx_queue_head(&bcf->groups); - q != ngx_queue_sentinel(&bcf->groups); - q = ngx_queue_next(q)) - { - grp = ngx_queue_data(q, ngx_quic_sock_group_t, queue); - - p = ngx_sprintf(p, "%ud", grp->map_fd); - - *p++ = NGX_QUIC_BPF_ADDRSEP; - - p += ngx_sock_ntop(grp->sockaddr, grp->socklen, p, - NGX_SOCKADDR_STRLEN, 1); - - *p++ = NGX_QUIC_BPF_VARSEP; - } - - *p = '\0'; - - var = ngx_array_push(&ccf->env); - if (var == NULL) { - return NGX_ERROR; - } - - var->data = buf; - var->len = sizeof(NGX_QUIC_BPF_VARNAME) - 1; - - return NGX_OK; -} - - -static ngx_int_t -ngx_quic_bpf_import_maps(ngx_cycle_t *cycle) -{ - int s; - u_char *inherited, *p, *v; - ngx_uint_t in_fd; - ngx_addr_t tmp; - ngx_quic_bpf_conf_t *bcf; - ngx_quic_sock_group_t *grp; - - inherited = (u_char *) getenv(NGX_QUIC_BPF_VARNAME); - - if (inherited == NULL) { - return NGX_OK; - } - - bcf = ngx_quic_bpf_get_conf(cycle); - -#if (NGX_SUPPRESS_WARN) - s = -1; -#endif - - in_fd = 1; - - for (p = inherited, v = p; *p; p++) { - - switch (*p) { - - case NGX_QUIC_BPF_ADDRSEP: - - if (!in_fd) { - ngx_log_error(NGX_LOG_EMERG, cycle->log, 0, - "quic bpf failed to parse inherited env"); - return NGX_ERROR; - } - in_fd = 0; - - s = ngx_atoi(v, p - v); - if (s == NGX_ERROR) { - ngx_log_error(NGX_LOG_EMERG, cycle->log, 0, - "quic bpf failed to parse inherited map fd"); - return NGX_ERROR; - } - - v = p + 1; - break; - - case NGX_QUIC_BPF_VARSEP: - - if (in_fd) { - ngx_log_error(NGX_LOG_EMERG, cycle->log, 0, - "quic bpf failed to parse inherited env"); - return NGX_ERROR; - } - in_fd = 1; - - grp = ngx_pcalloc(cycle->pool, - sizeof(ngx_quic_sock_group_t)); - if (grp == NULL) { - return NGX_ERROR; - } - - grp->map_fd = s; - - if (ngx_parse_addr_port(cycle->pool, &tmp, v, p - v) - != NGX_OK) - { - ngx_log_error(NGX_LOG_EMERG, cycle->log, 0, - "quic bpf failed to parse inherited" - " address '%*s'", p - v , v); - - ngx_quic_bpf_close(cycle->log, s, "inherited map"); - - return NGX_ERROR; - } - - grp->sockaddr = tmp.sockaddr; - grp->socklen = tmp.socklen; - - grp->unused = 1; - - ngx_queue_insert_tail(&bcf->groups, &grp->queue); - - ngx_log_debug3(NGX_LOG_DEBUG_EVENT, cycle->log, 0, - "quic bpf sockmap inherited with " - "fd:%d address:%*s", - grp->map_fd, p - v, v); - v = p + 1; - break; - - default: - break; - } - } - - return NGX_OK; -} diff --git a/src/deps/src/nginx-1.30.3/src/event/quic/ngx_event_quic_bpf_code.c b/src/deps/src/nginx-1.30.3/src/event/quic/ngx_event_quic_bpf_code.c deleted file mode 100644 index 625f404056..0000000000 --- a/src/deps/src/nginx-1.30.3/src/event/quic/ngx_event_quic_bpf_code.c +++ /dev/null @@ -1,93 +0,0 @@ -/* AUTO-GENERATED, DO NOT EDIT. */ - -#include -#include - -#include "ngx_bpf.h" - - -static ngx_bpf_reloc_t bpf_reloc_prog_ngx_quic_reuseport_helper[] = { - { "ngx_quic_sockmap", 59 }, -}; - -static struct bpf_insn bpf_insn_prog_ngx_quic_reuseport_helper[] = { - /* opcode dst src offset imm */ - { 0x79, BPF_REG_2, BPF_REG_1, (int16_t) 0, 0x0 }, - { 0x79, BPF_REG_3, BPF_REG_1, (int16_t) 8, 0x0 }, - { 0xbf, BPF_REG_6, BPF_REG_2, (int16_t) 0, 0x0 }, - { 0x7, BPF_REG_6, BPF_REG_0, (int16_t) 0, 0x8 }, - { 0x2d, BPF_REG_6, BPF_REG_3, (int16_t) 58, 0x0 }, - { 0xbf, BPF_REG_4, BPF_REG_2, (int16_t) 0, 0x0 }, - { 0x7, BPF_REG_4, BPF_REG_0, (int16_t) 0, 0x9 }, - { 0x2d, BPF_REG_4, BPF_REG_3, (int16_t) 55, 0x0 }, - { 0xb7, BPF_REG_4, BPF_REG_0, (int16_t) 0, 0x8 }, - { 0xb7, BPF_REG_5, BPF_REG_0, (int16_t) 0, 0x14 }, - { 0xb7, BPF_REG_0, BPF_REG_0, (int16_t) 0, 0x9 }, - { 0x71, BPF_REG_6, BPF_REG_6, (int16_t) 0, 0x0 }, - { 0x67, BPF_REG_6, BPF_REG_0, (int16_t) 0, 0x38 }, - { 0xc7, BPF_REG_6, BPF_REG_0, (int16_t) 0, 0x38 }, - { 0x65, BPF_REG_6, BPF_REG_0, (int16_t) 11, 0xffffffff }, - { 0xbf, BPF_REG_5, BPF_REG_2, (int16_t) 0, 0x0 }, - { 0x7, BPF_REG_5, BPF_REG_0, (int16_t) 0, 0xd }, - { 0x2d, BPF_REG_5, BPF_REG_3, (int16_t) 45, 0x0 }, - { 0xbf, BPF_REG_4, BPF_REG_2, (int16_t) 0, 0x0 }, - { 0x7, BPF_REG_4, BPF_REG_0, (int16_t) 0, 0xe }, - { 0x2d, BPF_REG_4, BPF_REG_3, (int16_t) 42, 0x0 }, - { 0xb7, BPF_REG_4, BPF_REG_0, (int16_t) 0, 0xd }, - { 0xb7, BPF_REG_0, BPF_REG_0, (int16_t) 0, 0xe }, - { 0x71, BPF_REG_5, BPF_REG_5, (int16_t) 0, 0x0 }, - { 0xb7, BPF_REG_6, BPF_REG_0, (int16_t) 0, 0x8 }, - { 0x2d, BPF_REG_6, BPF_REG_5, (int16_t) 37, 0x0 }, - { 0xbf, BPF_REG_6, BPF_REG_2, (int16_t) 0, 0x0 }, - { 0xf, BPF_REG_6, BPF_REG_0, (int16_t) 0, 0x0 }, - { 0xf, BPF_REG_6, BPF_REG_5, (int16_t) 0, 0x0 }, - { 0x2d, BPF_REG_6, BPF_REG_3, (int16_t) 33, 0x0 }, - { 0xf, BPF_REG_2, BPF_REG_4, (int16_t) 0, 0x0 }, - { 0xbf, BPF_REG_4, BPF_REG_2, (int16_t) 0, 0x0 }, - { 0x7, BPF_REG_4, BPF_REG_0, (int16_t) 0, 0x9 }, - { 0x2d, BPF_REG_4, BPF_REG_3, (int16_t) 29, 0x0 }, - { 0x71, BPF_REG_4, BPF_REG_2, (int16_t) 1, 0x0 }, - { 0x67, BPF_REG_4, BPF_REG_0, (int16_t) 0, 0x38 }, - { 0x71, BPF_REG_3, BPF_REG_2, (int16_t) 2, 0x0 }, - { 0x67, BPF_REG_3, BPF_REG_0, (int16_t) 0, 0x30 }, - { 0x4f, BPF_REG_3, BPF_REG_4, (int16_t) 0, 0x0 }, - { 0x71, BPF_REG_4, BPF_REG_2, (int16_t) 3, 0x0 }, - { 0x67, BPF_REG_4, BPF_REG_0, (int16_t) 0, 0x28 }, - { 0x4f, BPF_REG_3, BPF_REG_4, (int16_t) 0, 0x0 }, - { 0x71, BPF_REG_4, BPF_REG_2, (int16_t) 4, 0x0 }, - { 0x67, BPF_REG_4, BPF_REG_0, (int16_t) 0, 0x20 }, - { 0x4f, BPF_REG_3, BPF_REG_4, (int16_t) 0, 0x0 }, - { 0x71, BPF_REG_4, BPF_REG_2, (int16_t) 5, 0x0 }, - { 0x67, BPF_REG_4, BPF_REG_0, (int16_t) 0, 0x18 }, - { 0x4f, BPF_REG_3, BPF_REG_4, (int16_t) 0, 0x0 }, - { 0x71, BPF_REG_4, BPF_REG_2, (int16_t) 6, 0x0 }, - { 0x67, BPF_REG_4, BPF_REG_0, (int16_t) 0, 0x10 }, - { 0x4f, BPF_REG_3, BPF_REG_4, (int16_t) 0, 0x0 }, - { 0x71, BPF_REG_4, BPF_REG_2, (int16_t) 7, 0x0 }, - { 0x67, BPF_REG_4, BPF_REG_0, (int16_t) 0, 0x8 }, - { 0x4f, BPF_REG_3, BPF_REG_4, (int16_t) 0, 0x0 }, - { 0x71, BPF_REG_2, BPF_REG_2, (int16_t) 8, 0x0 }, - { 0x4f, BPF_REG_3, BPF_REG_2, (int16_t) 0, 0x0 }, - { 0x7b, BPF_REG_10, BPF_REG_3, (int16_t) 65528, 0x0 }, - { 0xbf, BPF_REG_3, BPF_REG_10, (int16_t) 0, 0x0 }, - { 0x7, BPF_REG_3, BPF_REG_0, (int16_t) 0, 0xfffffff8 }, - { 0x18, BPF_REG_2, BPF_REG_0, (int16_t) 0, 0x0 }, - { 0x0, BPF_REG_0, BPF_REG_0, (int16_t) 0, 0x0 }, - { 0xb7, BPF_REG_4, BPF_REG_0, (int16_t) 0, 0x0 }, - { 0x85, BPF_REG_0, BPF_REG_0, (int16_t) 0, 0x52 }, - { 0xb7, BPF_REG_0, BPF_REG_0, (int16_t) 0, 0x1 }, - { 0x95, BPF_REG_0, BPF_REG_0, (int16_t) 0, 0x0 }, -}; - - -ngx_bpf_program_t ngx_quic_reuseport_helper = { - .relocs = bpf_reloc_prog_ngx_quic_reuseport_helper, - .nrelocs = sizeof(bpf_reloc_prog_ngx_quic_reuseport_helper) - / sizeof(bpf_reloc_prog_ngx_quic_reuseport_helper[0]), - .ins = bpf_insn_prog_ngx_quic_reuseport_helper, - .nins = sizeof(bpf_insn_prog_ngx_quic_reuseport_helper) - / sizeof(bpf_insn_prog_ngx_quic_reuseport_helper[0]), - .license = "BSD", - .type = BPF_PROG_TYPE_SK_REUSEPORT, -}; - diff --git a/src/deps/src/nginx-1.30.3/src/event/quic/ngx_event_quic_connection.h b/src/deps/src/nginx-1.30.3/src/event/quic/ngx_event_quic_connection.h deleted file mode 100644 index efcb632ca3..0000000000 --- a/src/deps/src/nginx-1.30.3/src/event/quic/ngx_event_quic_connection.h +++ /dev/null @@ -1,326 +0,0 @@ -/* - * Copyright (C) Nginx, Inc. - */ - - -#ifndef _NGX_EVENT_QUIC_CONNECTION_H_INCLUDED_ -#define _NGX_EVENT_QUIC_CONNECTION_H_INCLUDED_ - - -#include -#include -#include - - -/* #define NGX_QUIC_DEBUG_PACKETS */ /* dump packet contents */ -/* #define NGX_QUIC_DEBUG_FRAMES */ /* dump frames contents */ -/* #define NGX_QUIC_DEBUG_ALLOC */ /* log frames and bufs alloc */ -/* #define NGX_QUIC_DEBUG_CRYPTO */ - -#define NGX_QUIC_ENCRYPTION_INITIAL 0 -#define NGX_QUIC_ENCRYPTION_EARLY_DATA 1 -#define NGX_QUIC_ENCRYPTION_HANDSHAKE 2 -#define NGX_QUIC_ENCRYPTION_APPLICATION 3 -#define NGX_QUIC_ENCRYPTION_LAST 4 - -#define NGX_QUIC_SEND_CTX_LAST (NGX_QUIC_ENCRYPTION_LAST - 1) - - -typedef struct ngx_quic_connection_s ngx_quic_connection_t; -typedef struct ngx_quic_server_id_s ngx_quic_server_id_t; -typedef struct ngx_quic_client_id_s ngx_quic_client_id_t; -typedef struct ngx_quic_send_ctx_s ngx_quic_send_ctx_t; -typedef struct ngx_quic_socket_s ngx_quic_socket_t; -typedef struct ngx_quic_path_s ngx_quic_path_t; -typedef struct ngx_quic_keys_s ngx_quic_keys_t; - -#if (NGX_QUIC_OPENSSL_COMPAT) -#include -#endif -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - - -/* RFC 9002, 6.2.2. Handshakes and New Paths: kInitialRtt */ -#define NGX_QUIC_INITIAL_RTT 333 /* ms */ - -#define NGX_QUIC_UNSET_PN (uint64_t) -1 - -/* 0-RTT and 1-RTT data exist in the same packet number space, - * so we have 3 packet number spaces: - * - * 0 - Initial - * 1 - Handshake - * 2 - 0-RTT and 1-RTT - */ -#define ngx_quic_get_send_ctx(qc, level) \ - ((level) == NGX_QUIC_ENCRYPTION_INITIAL) ? &((qc)->send_ctx[0]) \ - : (((level) == NGX_QUIC_ENCRYPTION_HANDSHAKE) ? &((qc)->send_ctx[1]) \ - : &((qc)->send_ctx[2])) - -#define ngx_quic_get_connection(c) \ - (((c)->udp) ? (((ngx_quic_socket_t *)((c)->udp))->quic) : NULL) - -#define ngx_quic_get_socket(c) ((ngx_quic_socket_t *)((c)->udp)) - -#define ngx_quic_init_rtt(qc) \ - (qc)->avg_rtt = NGX_QUIC_INITIAL_RTT; \ - (qc)->rttvar = NGX_QUIC_INITIAL_RTT / 2; \ - (qc)->min_rtt = NGX_TIMER_INFINITE; \ - (qc)->first_rtt = NGX_TIMER_INFINITE; \ - (qc)->latest_rtt = 0; - - -typedef enum { - NGX_QUIC_PATH_IDLE = 0, - NGX_QUIC_PATH_VALIDATING, - NGX_QUIC_PATH_WAITING, - NGX_QUIC_PATH_MTUD -} ngx_quic_path_state_e; - - -struct ngx_quic_client_id_s { - ngx_queue_t queue; - uint64_t seqnum; - size_t len; - u_char id[NGX_QUIC_CID_LEN_MAX]; - u_char sr_token[NGX_QUIC_SR_TOKEN_LEN]; - ngx_uint_t used; /* unsigned used:1; */ -}; - - -struct ngx_quic_server_id_s { - uint64_t seqnum; - size_t len; - u_char id[NGX_QUIC_CID_LEN_MAX]; -}; - - -struct ngx_quic_path_s { - ngx_queue_t queue; - struct sockaddr *sockaddr; - ngx_sockaddr_t sa; - socklen_t socklen; - ngx_quic_client_id_t *cid; - ngx_quic_path_state_e state; - ngx_msec_t expires; - ngx_uint_t tries; - ngx_uint_t tag; - size_t mtu; - size_t mtud; - size_t max_mtu; - off_t sent; - off_t received; - u_char challenge[2][8]; - uint64_t seqnum; - uint64_t mtu_pnum[NGX_QUIC_PATH_RETRIES]; - ngx_str_t addr_text; - u_char text[NGX_SOCKADDR_STRLEN]; - unsigned validated:1; - unsigned mtu_unvalidated:1; -}; - - -struct ngx_quic_socket_s { - ngx_udp_connection_t udp; - ngx_quic_connection_t *quic; - ngx_queue_t queue; - ngx_quic_server_id_t sid; - ngx_sockaddr_t sockaddr; - socklen_t socklen; - ngx_uint_t used; /* unsigned used:1; */ -}; - - -typedef struct { - ngx_rbtree_t tree; - ngx_rbtree_node_t sentinel; - - ngx_queue_t uninitialized; - ngx_queue_t free; - - uint64_t sent; - uint64_t recv_offset; - uint64_t recv_window; - uint64_t recv_last; - uint64_t recv_max_data; - uint64_t send_offset; - uint64_t send_max_data; - - uint64_t server_max_streams_uni; - uint64_t server_max_streams_bidi; - uint64_t server_streams_uni; - uint64_t server_streams_bidi; - - uint64_t client_max_streams_uni; - uint64_t client_max_streams_bidi; - uint64_t client_streams_uni; - uint64_t client_streams_bidi; - - ngx_uint_t initialized; - /* unsigned initialized:1; */ -} ngx_quic_streams_t; - - -typedef struct { - size_t in_flight; - size_t window; - size_t ssthresh; - size_t w_max; - size_t w_est; - size_t w_prior; - size_t mtu; - ngx_msec_t recovery_start; - ngx_msec_t idle_start; - ngx_msec_t k; - ngx_uint_t idle; /* unsigned idle:1; */ -} ngx_quic_congestion_t; - - -/* - * RFC 9000, 12.3. Packet Numbers - * - * Conceptually, a packet number space is the context in which a packet - * can be processed and acknowledged. Initial packets can only be sent - * with Initial packet protection keys and acknowledged in packets that - * are also Initial packets. - */ -struct ngx_quic_send_ctx_s { - ngx_uint_t level; - - ngx_quic_buffer_t crypto; - uint64_t crypto_sent; - - uint64_t pnum; /* to be sent */ - uint64_t largest_ack; /* received from peer */ - uint64_t largest_pn; /* received from peer */ - - ngx_queue_t frames; /* generated frames */ - ngx_queue_t sending; /* frames assigned to pkt */ - ngx_queue_t sent; /* frames waiting ACK */ - - uint64_t pending_ack; /* non sent ack-eliciting */ - uint64_t largest_range; - uint64_t first_range; - ngx_msec_t largest_received; - ngx_msec_t ack_delay_start; - ngx_uint_t nranges; - ngx_quic_ack_range_t ranges[NGX_QUIC_MAX_RANGES]; - ngx_uint_t send_ack; -}; - - -struct ngx_quic_connection_s { - uint32_t version; - - ngx_quic_path_t *path; - - ngx_queue_t sockets; - ngx_queue_t paths; - ngx_queue_t client_ids; - ngx_queue_t free_sockets; - ngx_queue_t free_paths; - ngx_queue_t free_client_ids; - - ngx_uint_t nsockets; - ngx_uint_t nclient_ids; - uint64_t max_retired_seqnum; - uint64_t client_seqnum; - uint64_t server_seqnum; - uint64_t path_seqnum; - - ngx_quic_tp_t tp; - ngx_quic_tp_t ctp; - - ngx_quic_send_ctx_t send_ctx[NGX_QUIC_SEND_CTX_LAST]; - - ngx_quic_keys_t *keys; - - ngx_quic_conf_t *conf; - - ngx_event_t push; - ngx_event_t pto; - ngx_event_t close; - ngx_event_t path_validation; - ngx_event_t key_update; - - ngx_msec_t last_cc; - - ngx_msec_t first_rtt; - ngx_msec_t latest_rtt; - ngx_msec_t avg_rtt; - ngx_msec_t min_rtt; - ngx_msec_t rttvar; - - ngx_uint_t pto_count; - - ngx_queue_t free_frames; - ngx_buf_t *free_bufs; - ngx_buf_t *free_shadow_bufs; - - ngx_uint_t nframes; - ngx_uint_t max_frames; -#ifdef NGX_QUIC_DEBUG_ALLOC - ngx_uint_t nbufs; - ngx_uint_t nshadowbufs; -#endif - -#if (NGX_QUIC_OPENSSL_COMPAT) - ngx_quic_compat_t *compat; -#endif - - ngx_quic_streams_t streams; - ngx_quic_congestion_t congestion; - - uint64_t rst_pnum; /* first on validated path */ - - off_t received; - - ngx_uint_t error; - ngx_uint_t error_level; - ngx_uint_t error_ftype; - const char *error_reason; - - ngx_uint_t shutdown_code; - const char *shutdown_reason; - - unsigned error_app:1; - unsigned send_timer_set:1; - unsigned closing:1; - unsigned shutdown:1; - unsigned draining:1; - unsigned key_phase:1; - unsigned validated:1; - unsigned client_tp_done:1; - -#if (NGX_QUIC_OPENSSL_API) - unsigned read_level:2; - unsigned write_level:2; -#endif -}; - - -ngx_int_t ngx_quic_apply_transport_params(ngx_connection_t *c, - ngx_quic_tp_t *ctp); -void ngx_quic_discard_ctx(ngx_connection_t *c, ngx_uint_t level); -void ngx_quic_close_connection(ngx_connection_t *c, ngx_int_t rc); -void ngx_quic_shutdown_quic(ngx_connection_t *c); -void ngx_quic_address_hash(struct sockaddr *sockaddr, socklen_t socklen, - ngx_uint_t no_port, u_char *salt, size_t saltlen, u_char buf[20]); - -#if (NGX_DEBUG) -void ngx_quic_connstate_dbg(ngx_connection_t *c); -#else -#define ngx_quic_connstate_dbg(c) -#endif - -#endif /* _NGX_EVENT_QUIC_CONNECTION_H_INCLUDED_ */ diff --git a/src/deps/src/nginx-1.30.3/src/event/quic/ngx_event_quic_connid.c b/src/deps/src/nginx-1.30.3/src/event/quic/ngx_event_quic_connid.c deleted file mode 100644 index 4e7b8dc220..0000000000 --- a/src/deps/src/nginx-1.30.3/src/event/quic/ngx_event_quic_connid.c +++ /dev/null @@ -1,502 +0,0 @@ - -/* - * Copyright (C) Nginx, Inc. - */ - - -#include -#include -#include -#include - -#define NGX_QUIC_MAX_SERVER_IDS 8 - - -#if (NGX_QUIC_BPF) -static ngx_int_t ngx_quic_bpf_attach_id(ngx_connection_t *c, u_char *id); -#endif -static ngx_int_t ngx_quic_retire_client_id(ngx_connection_t *c, - ngx_quic_client_id_t *cid); -static ngx_quic_client_id_t *ngx_quic_alloc_client_id(ngx_connection_t *c, - ngx_quic_connection_t *qc); -static ngx_int_t ngx_quic_send_server_id(ngx_connection_t *c, - ngx_quic_server_id_t *sid); - - -ngx_int_t -ngx_quic_create_server_id(ngx_connection_t *c, u_char *id) -{ - if (RAND_bytes(id, NGX_QUIC_SERVER_CID_LEN) != 1) { - return NGX_ERROR; - } - -#if (NGX_QUIC_BPF) - if (ngx_quic_bpf_attach_id(c, id) != NGX_OK) { - ngx_log_error(NGX_LOG_ERR, c->log, 0, - "quic bpf failed to generate socket key"); - /* ignore error, things still may work */ - } -#endif - - return NGX_OK; -} - - -#if (NGX_QUIC_BPF) - -static ngx_int_t -ngx_quic_bpf_attach_id(ngx_connection_t *c, u_char *id) -{ - int fd; - uint64_t cookie; - socklen_t optlen; - - fd = c->listening->fd; - - optlen = sizeof(cookie); - - if (getsockopt(fd, SOL_SOCKET, SO_COOKIE, &cookie, &optlen) == -1) { - ngx_log_error(NGX_LOG_ERR, c->log, ngx_socket_errno, - "quic getsockopt(SO_COOKIE) failed"); - - return NGX_ERROR; - } - - ngx_quic_dcid_encode_key(id, cookie); - - return NGX_OK; -} - -#endif - - -ngx_int_t -ngx_quic_handle_new_connection_id_frame(ngx_connection_t *c, - ngx_quic_new_conn_id_frame_t *f) -{ - ngx_str_t id; - ngx_queue_t *q; - ngx_quic_frame_t *frame; - ngx_quic_client_id_t *cid, *item; - ngx_quic_connection_t *qc; - - qc = ngx_quic_get_connection(c); - - if (f->seqnum < qc->max_retired_seqnum) { - /* - * RFC 9000, 19.15. NEW_CONNECTION_ID Frame - * - * An endpoint that receives a NEW_CONNECTION_ID frame with - * a sequence number smaller than the Retire Prior To field - * of a previously received NEW_CONNECTION_ID frame MUST send - * a corresponding RETIRE_CONNECTION_ID frame that retires - * the newly received connection ID, unless it has already - * done so for that sequence number. - */ - - frame = ngx_quic_alloc_frame(c); - if (frame == NULL) { - return NGX_ERROR; - } - - frame->level = NGX_QUIC_ENCRYPTION_APPLICATION; - frame->type = NGX_QUIC_FT_RETIRE_CONNECTION_ID; - frame->u.retire_cid.sequence_number = f->seqnum; - - ngx_quic_queue_frame(qc, frame); - - goto retire; - } - - cid = NULL; - - for (q = ngx_queue_head(&qc->client_ids); - q != ngx_queue_sentinel(&qc->client_ids); - q = ngx_queue_next(q)) - { - item = ngx_queue_data(q, ngx_quic_client_id_t, queue); - - if (item->seqnum == f->seqnum) { - cid = item; - break; - } - } - - if (cid) { - /* - * Transmission errors, timeouts, and retransmissions might cause the - * same NEW_CONNECTION_ID frame to be received multiple times. - */ - - if (cid->len != f->len - || ngx_strncmp(cid->id, f->cid, f->len) != 0 - || ngx_strncmp(cid->sr_token, f->srt, NGX_QUIC_SR_TOKEN_LEN) != 0) - { - /* - * ..if a sequence number is used for different connection IDs, - * the endpoint MAY treat that receipt as a connection error - * of type PROTOCOL_VIOLATION. - */ - qc->error = NGX_QUIC_ERR_PROTOCOL_VIOLATION; - qc->error_reason = "seqnum refers to different connection id/token"; - return NGX_ERROR; - } - - } else { - - id.data = f->cid; - id.len = f->len; - - if (ngx_quic_create_client_id(c, &id, f->seqnum, f->srt) == NULL) { - return NGX_ERROR; - } - } - -retire: - - if (qc->max_retired_seqnum && f->retire <= qc->max_retired_seqnum) { - /* - * Once a sender indicates a Retire Prior To value, smaller values sent - * in subsequent NEW_CONNECTION_ID frames have no effect. A receiver - * MUST ignore any Retire Prior To fields that do not increase the - * largest received Retire Prior To value. - */ - goto done; - } - - qc->max_retired_seqnum = f->retire; - - q = ngx_queue_head(&qc->client_ids); - - while (q != ngx_queue_sentinel(&qc->client_ids)) { - - cid = ngx_queue_data(q, ngx_quic_client_id_t, queue); - q = ngx_queue_next(q); - - if (cid->seqnum >= f->retire) { - continue; - } - - if (ngx_quic_retire_client_id(c, cid) != NGX_OK) { - return NGX_ERROR; - } - } - -done: - - if (qc->nclient_ids > qc->tp.active_connection_id_limit) { - /* - * RFC 9000, 5.1.1. Issuing Connection IDs - * - * After processing a NEW_CONNECTION_ID frame and - * adding and retiring active connection IDs, if the number of active - * connection IDs exceeds the value advertised in its - * active_connection_id_limit transport parameter, an endpoint MUST - * close the connection with an error of type CONNECTION_ID_LIMIT_ERROR. - */ - qc->error = NGX_QUIC_ERR_CONNECTION_ID_LIMIT_ERROR; - qc->error_reason = "too many connection ids received"; - return NGX_ERROR; - } - - return NGX_OK; -} - - -static ngx_int_t -ngx_quic_retire_client_id(ngx_connection_t *c, ngx_quic_client_id_t *cid) -{ - ngx_queue_t *q; - ngx_quic_path_t *path; - ngx_quic_client_id_t *new_cid; - ngx_quic_connection_t *qc; - - qc = ngx_quic_get_connection(c); - - if (!cid->used) { - return ngx_quic_free_client_id(c, cid); - } - - /* we are going to retire client id which is in use */ - - q = ngx_queue_head(&qc->paths); - - while (q != ngx_queue_sentinel(&qc->paths)) { - - path = ngx_queue_data(q, ngx_quic_path_t, queue); - q = ngx_queue_next(q); - - if (path->cid != cid) { - continue; - } - - if (path == qc->path) { - /* this is the active path: update it with new CID */ - new_cid = ngx_quic_next_client_id(c); - if (new_cid == NULL) { - return NGX_ERROR; - } - - qc->path->cid = new_cid; - new_cid->used = 1; - - return ngx_quic_free_client_id(c, cid); - } - - return ngx_quic_free_path(c, path); - } - - return NGX_OK; -} - - -static ngx_quic_client_id_t * -ngx_quic_alloc_client_id(ngx_connection_t *c, ngx_quic_connection_t *qc) -{ - ngx_queue_t *q; - ngx_quic_client_id_t *cid; - - if (!ngx_queue_empty(&qc->free_client_ids)) { - - q = ngx_queue_head(&qc->free_client_ids); - cid = ngx_queue_data(q, ngx_quic_client_id_t, queue); - - ngx_queue_remove(&cid->queue); - - ngx_memzero(cid, sizeof(ngx_quic_client_id_t)); - - } else { - - cid = ngx_pcalloc(c->pool, sizeof(ngx_quic_client_id_t)); - if (cid == NULL) { - return NULL; - } - } - - return cid; -} - - -ngx_quic_client_id_t * -ngx_quic_create_client_id(ngx_connection_t *c, ngx_str_t *id, - uint64_t seqnum, u_char *token) -{ - ngx_quic_client_id_t *cid; - ngx_quic_connection_t *qc; - - qc = ngx_quic_get_connection(c); - - cid = ngx_quic_alloc_client_id(c, qc); - if (cid == NULL) { - return NULL; - } - - cid->seqnum = seqnum; - - cid->len = id->len; - ngx_memcpy(cid->id, id->data, id->len); - - if (token) { - ngx_memcpy(cid->sr_token, token, NGX_QUIC_SR_TOKEN_LEN); - } - - ngx_queue_insert_tail(&qc->client_ids, &cid->queue); - qc->nclient_ids++; - - if (seqnum > qc->client_seqnum) { - qc->client_seqnum = seqnum; - } - - ngx_log_debug5(NGX_LOG_DEBUG_EVENT, c->log, 0, - "quic cid seq:%uL received id:%uz:%xV:%*xs", - cid->seqnum, id->len, id, - (size_t) NGX_QUIC_SR_TOKEN_LEN, cid->sr_token); - - return cid; -} - - -ngx_quic_client_id_t * -ngx_quic_next_client_id(ngx_connection_t *c) -{ - ngx_queue_t *q; - ngx_quic_client_id_t *cid; - ngx_quic_connection_t *qc; - - qc = ngx_quic_get_connection(c); - - for (q = ngx_queue_head(&qc->client_ids); - q != ngx_queue_sentinel(&qc->client_ids); - q = ngx_queue_next(q)) - { - cid = ngx_queue_data(q, ngx_quic_client_id_t, queue); - - if (!cid->used) { - return cid; - } - } - - return NULL; -} - - -ngx_int_t -ngx_quic_handle_retire_connection_id_frame(ngx_connection_t *c, - ngx_quic_retire_cid_frame_t *f) -{ - ngx_quic_socket_t *qsock; - ngx_quic_connection_t *qc; - - qc = ngx_quic_get_connection(c); - - if (f->sequence_number >= qc->server_seqnum) { - /* - * RFC 9000, 19.16. - * - * Receipt of a RETIRE_CONNECTION_ID frame containing a sequence - * number greater than any previously sent to the peer MUST be - * treated as a connection error of type PROTOCOL_VIOLATION. - */ - qc->error = NGX_QUIC_ERR_PROTOCOL_VIOLATION; - qc->error_reason = "sequence number of id to retire was never issued"; - - return NGX_ERROR; - } - - qsock = ngx_quic_get_socket(c); - - if (qsock->sid.seqnum == f->sequence_number) { - - /* - * RFC 9000, 19.16. - * - * The sequence number specified in a RETIRE_CONNECTION_ID frame MUST - * NOT refer to the Destination Connection ID field of the packet in - * which the frame is contained. The peer MAY treat this as a - * connection error of type PROTOCOL_VIOLATION. - */ - - qc->error = NGX_QUIC_ERR_PROTOCOL_VIOLATION; - qc->error_reason = "sequence number of id to retire refers DCID"; - - return NGX_ERROR; - } - - qsock = ngx_quic_find_socket(c, f->sequence_number); - if (qsock == NULL) { - return NGX_OK; - } - - ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, - "quic socket seq:%uL is retired", qsock->sid.seqnum); - - ngx_quic_close_socket(c, qsock); - - /* restore socket count up to a limit after deletion */ - if (ngx_quic_create_sockets(c) != NGX_OK) { - return NGX_ERROR; - } - - return NGX_OK; -} - - -ngx_int_t -ngx_quic_create_sockets(ngx_connection_t *c) -{ - ngx_uint_t n; - ngx_quic_socket_t *qsock; - ngx_quic_connection_t *qc; - - qc = ngx_quic_get_connection(c); - - n = ngx_min(NGX_QUIC_MAX_SERVER_IDS, qc->ctp.active_connection_id_limit); - - ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0, - "quic create sockets has:%ui max:%ui", qc->nsockets, n); - - while (qc->nsockets < n) { - - qsock = ngx_quic_create_socket(c, qc); - if (qsock == NULL) { - return NGX_ERROR; - } - - if (ngx_quic_listen(c, qc, qsock) != NGX_OK) { - return NGX_ERROR; - } - - if (ngx_quic_send_server_id(c, &qsock->sid) != NGX_OK) { - return NGX_ERROR; - } - } - - return NGX_OK; -} - - -static ngx_int_t -ngx_quic_send_server_id(ngx_connection_t *c, ngx_quic_server_id_t *sid) -{ - ngx_str_t dcid; - ngx_quic_frame_t *frame; - ngx_quic_connection_t *qc; - - qc = ngx_quic_get_connection(c); - - dcid.len = sid->len; - dcid.data = sid->id; - - frame = ngx_quic_alloc_frame(c); - if (frame == NULL) { - return NGX_ERROR; - } - - frame->level = NGX_QUIC_ENCRYPTION_APPLICATION; - frame->type = NGX_QUIC_FT_NEW_CONNECTION_ID; - frame->u.ncid.seqnum = sid->seqnum; - frame->u.ncid.retire = 0; - frame->u.ncid.len = NGX_QUIC_SERVER_CID_LEN; - ngx_memcpy(frame->u.ncid.cid, sid->id, NGX_QUIC_SERVER_CID_LEN); - - if (ngx_quic_new_sr_token(c, &dcid, qc->conf->sr_token_key, - frame->u.ncid.srt) - != NGX_OK) - { - return NGX_ERROR; - } - - ngx_quic_queue_frame(qc, frame); - - return NGX_OK; -} - - -ngx_int_t -ngx_quic_free_client_id(ngx_connection_t *c, ngx_quic_client_id_t *cid) -{ - ngx_quic_frame_t *frame; - ngx_quic_connection_t *qc; - - qc = ngx_quic_get_connection(c); - - frame = ngx_quic_alloc_frame(c); - if (frame == NULL) { - return NGX_ERROR; - } - - frame->level = NGX_QUIC_ENCRYPTION_APPLICATION; - frame->type = NGX_QUIC_FT_RETIRE_CONNECTION_ID; - frame->u.retire_cid.sequence_number = cid->seqnum; - - ngx_quic_queue_frame(qc, frame); - - /* we are no longer going to use this client id */ - - ngx_queue_remove(&cid->queue); - ngx_queue_insert_head(&qc->free_client_ids, &cid->queue); - - qc->nclient_ids--; - - return NGX_OK; -} diff --git a/src/deps/src/nginx-1.30.3/src/event/quic/ngx_event_quic_connid.h b/src/deps/src/nginx-1.30.3/src/event/quic/ngx_event_quic_connid.h deleted file mode 100644 index 33e9c65b91..0000000000 --- a/src/deps/src/nginx-1.30.3/src/event/quic/ngx_event_quic_connid.h +++ /dev/null @@ -1,29 +0,0 @@ - -/* - * Copyright (C) Nginx, Inc. - */ - - -#ifndef _NGX_EVENT_QUIC_CONNID_H_INCLUDED_ -#define _NGX_EVENT_QUIC_CONNID_H_INCLUDED_ - - -#include -#include - - -ngx_int_t ngx_quic_handle_retire_connection_id_frame(ngx_connection_t *c, - ngx_quic_retire_cid_frame_t *f); -ngx_int_t ngx_quic_handle_new_connection_id_frame(ngx_connection_t *c, - ngx_quic_new_conn_id_frame_t *f); - -ngx_int_t ngx_quic_create_sockets(ngx_connection_t *c); -ngx_int_t ngx_quic_create_server_id(ngx_connection_t *c, u_char *id); - -ngx_quic_client_id_t *ngx_quic_create_client_id(ngx_connection_t *c, - ngx_str_t *id, uint64_t seqnum, u_char *token); -ngx_quic_client_id_t *ngx_quic_next_client_id(ngx_connection_t *c); -ngx_int_t ngx_quic_free_client_id(ngx_connection_t *c, - ngx_quic_client_id_t *cid); - -#endif /* _NGX_EVENT_QUIC_CONNID_H_INCLUDED_ */ diff --git a/src/deps/src/nginx-1.30.3/src/event/quic/ngx_event_quic_frames.c b/src/deps/src/nginx-1.30.3/src/event/quic/ngx_event_quic_frames.c deleted file mode 100644 index 888e8bda28..0000000000 --- a/src/deps/src/nginx-1.30.3/src/event/quic/ngx_event_quic_frames.c +++ /dev/null @@ -1,895 +0,0 @@ - -/* - * Copyright (C) Nginx, Inc. - */ - - -#include -#include -#include -#include - - -#define NGX_QUIC_BUFFER_SIZE 4096 - -#define ngx_quic_buf_refs(b) (b)->shadow->num -#define ngx_quic_buf_inc_refs(b) ngx_quic_buf_refs(b)++ -#define ngx_quic_buf_dec_refs(b) ngx_quic_buf_refs(b)-- -#define ngx_quic_buf_set_refs(b, v) ngx_quic_buf_refs(b) = v - - -static ngx_buf_t *ngx_quic_alloc_buf(ngx_connection_t *c); -static void ngx_quic_free_buf(ngx_connection_t *c, ngx_buf_t *b); -static ngx_buf_t *ngx_quic_clone_buf(ngx_connection_t *c, ngx_buf_t *b); -static ngx_int_t ngx_quic_split_chain(ngx_connection_t *c, ngx_chain_t *cl, - off_t offset); - - -static ngx_buf_t * -ngx_quic_alloc_buf(ngx_connection_t *c) -{ - u_char *p; - ngx_buf_t *b; - ngx_quic_connection_t *qc; - - qc = ngx_quic_get_connection(c); - - b = qc->free_bufs; - - if (b) { - qc->free_bufs = b->shadow; - p = b->start; - - } else { - b = qc->free_shadow_bufs; - - if (b) { - qc->free_shadow_bufs = b->shadow; - -#ifdef NGX_QUIC_DEBUG_ALLOC - ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0, - "quic use shadow buffer n:%ui %ui", - ++qc->nbufs, --qc->nshadowbufs); -#endif - - } else { - b = ngx_palloc(c->pool, sizeof(ngx_buf_t)); - if (b == NULL) { - return NULL; - } - -#ifdef NGX_QUIC_DEBUG_ALLOC - ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, - "quic new buffer n:%ui", ++qc->nbufs); -#endif - } - - p = ngx_pnalloc(c->pool, NGX_QUIC_BUFFER_SIZE); - if (p == NULL) { - return NULL; - } - } - -#ifdef NGX_QUIC_DEBUG_ALLOC - ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, "quic alloc buffer %p", b); -#endif - - ngx_memzero(b, sizeof(ngx_buf_t)); - - b->tag = (ngx_buf_tag_t) &ngx_quic_alloc_buf; - b->temporary = 1; - b->shadow = b; - - b->start = p; - b->pos = p; - b->last = p; - b->end = p + NGX_QUIC_BUFFER_SIZE; - - ngx_quic_buf_set_refs(b, 1); - - return b; -} - - -static void -ngx_quic_free_buf(ngx_connection_t *c, ngx_buf_t *b) -{ - ngx_buf_t *shadow; - ngx_quic_connection_t *qc; - - qc = ngx_quic_get_connection(c); - - ngx_quic_buf_dec_refs(b); - -#ifdef NGX_QUIC_DEBUG_ALLOC - ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0, - "quic free buffer %p r:%ui", - b, (ngx_uint_t) ngx_quic_buf_refs(b)); -#endif - - shadow = b->shadow; - - if (ngx_quic_buf_refs(b) == 0) { - shadow->shadow = qc->free_bufs; - qc->free_bufs = shadow; - } - - if (b != shadow) { - b->shadow = qc->free_shadow_bufs; - qc->free_shadow_bufs = b; - } - -} - - -static ngx_buf_t * -ngx_quic_clone_buf(ngx_connection_t *c, ngx_buf_t *b) -{ - ngx_buf_t *nb; - ngx_quic_connection_t *qc; - - qc = ngx_quic_get_connection(c); - - nb = qc->free_shadow_bufs; - - if (nb) { - qc->free_shadow_bufs = nb->shadow; - - } else { - nb = ngx_palloc(c->pool, sizeof(ngx_buf_t)); - if (nb == NULL) { - return NULL; - } - -#ifdef NGX_QUIC_DEBUG_ALLOC - ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, - "quic new shadow buffer n:%ui", ++qc->nshadowbufs); -#endif - } - - *nb = *b; - - ngx_quic_buf_inc_refs(b); - -#ifdef NGX_QUIC_DEBUG_ALLOC - ngx_log_debug3(NGX_LOG_DEBUG_EVENT, c->log, 0, - "quic clone buffer %p %p r:%ui", - b, nb, (ngx_uint_t) ngx_quic_buf_refs(b)); -#endif - - return nb; -} - - -static ngx_int_t -ngx_quic_split_chain(ngx_connection_t *c, ngx_chain_t *cl, off_t offset) -{ - ngx_buf_t *b, *tb; - ngx_chain_t *tail; - - b = cl->buf; - - tail = ngx_alloc_chain_link(c->pool); - if (tail == NULL) { - return NGX_ERROR; - } - - tb = ngx_quic_clone_buf(c, b); - if (tb == NULL) { - return NGX_ERROR; - } - - tail->buf = tb; - - tb->pos += offset; - - b->last = tb->pos; - b->last_buf = 0; - - tail->next = cl->next; - cl->next = tail; - - return NGX_OK; -} - - -ngx_quic_frame_t * -ngx_quic_alloc_frame(ngx_connection_t *c) -{ - ngx_queue_t *q; - ngx_quic_frame_t *frame; - ngx_quic_connection_t *qc; - - qc = ngx_quic_get_connection(c); - - if (!ngx_queue_empty(&qc->free_frames)) { - - q = ngx_queue_head(&qc->free_frames); - frame = ngx_queue_data(q, ngx_quic_frame_t, queue); - - ngx_queue_remove(&frame->queue); - -#ifdef NGX_QUIC_DEBUG_ALLOC - ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, - "quic reuse frame n:%ui", qc->nframes); -#endif - - } else if (qc->nframes < qc->max_frames) { - frame = ngx_palloc(c->pool, sizeof(ngx_quic_frame_t)); - if (frame == NULL) { - return NULL; - } - - ++qc->nframes; - -#ifdef NGX_QUIC_DEBUG_ALLOC - ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, - "quic alloc frame n:%ui", qc->nframes); -#endif - - } else { - ngx_log_error(NGX_LOG_INFO, c->log, 0, "quic flood detected"); - return NULL; - } - - ngx_memzero(frame, sizeof(ngx_quic_frame_t)); - - return frame; -} - - -void -ngx_quic_free_frame(ngx_connection_t *c, ngx_quic_frame_t *frame) -{ - ngx_quic_connection_t *qc; - - qc = ngx_quic_get_connection(c); - - if (frame->data) { - ngx_quic_free_chain(c, frame->data); - } - - ngx_queue_insert_head(&qc->free_frames, &frame->queue); - -#ifdef NGX_QUIC_DEBUG_ALLOC - ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, - "quic free frame n:%ui", qc->nframes); -#endif -} - - -void -ngx_quic_free_chain(ngx_connection_t *c, ngx_chain_t *in) -{ - ngx_chain_t *cl; - - while (in) { - cl = in; - in = in->next; - - ngx_quic_free_buf(c, cl->buf); - ngx_free_chain(c->pool, cl); - } -} - - -void -ngx_quic_free_frames(ngx_connection_t *c, ngx_queue_t *frames) -{ - ngx_queue_t *q; - ngx_quic_frame_t *f; - - do { - q = ngx_queue_head(frames); - - if (q == ngx_queue_sentinel(frames)) { - break; - } - - ngx_queue_remove(q); - - f = ngx_queue_data(q, ngx_quic_frame_t, queue); - - ngx_quic_free_frame(c, f); - } while (1); -} - - -void -ngx_quic_queue_frame(ngx_quic_connection_t *qc, ngx_quic_frame_t *frame) -{ - ngx_quic_send_ctx_t *ctx; - - ctx = ngx_quic_get_send_ctx(qc, frame->level); - - ngx_queue_insert_tail(&ctx->frames, &frame->queue); - - frame->len = ngx_quic_create_frame(NULL, frame); - /* always succeeds */ - - if (qc->closing) { - return; - } - - ngx_post_event(&qc->push, &ngx_posted_events); -} - - -ngx_int_t -ngx_quic_split_frame(ngx_connection_t *c, ngx_quic_frame_t *f, size_t len) -{ - size_t shrink; - ngx_chain_t *out; - ngx_quic_frame_t *nf; - ngx_quic_buffer_t qb; - ngx_quic_ordered_frame_t *of, *onf; - - switch (f->type) { - case NGX_QUIC_FT_CRYPTO: - case NGX_QUIC_FT_STREAM: - break; - - default: - return NGX_DECLINED; - } - - if ((size_t) f->len <= len) { - return NGX_OK; - } - - shrink = f->len - len; - - ngx_log_debug3(NGX_LOG_DEBUG_EVENT, c->log, 0, - "quic split frame now:%uz need:%uz shrink:%uz", - f->len, len, shrink); - - of = &f->u.ord; - - if (of->length <= shrink) { - return NGX_DECLINED; - } - - of->length -= shrink; - f->len = ngx_quic_create_frame(NULL, f); - - if ((size_t) f->len > len) { - ngx_log_error(NGX_LOG_ERR, c->log, 0, "could not split QUIC frame"); - return NGX_ERROR; - } - - ngx_memzero(&qb, sizeof(ngx_quic_buffer_t)); - qb.chain = f->data; - - out = ngx_quic_read_buffer(c, &qb, of->length); - if (out == NGX_CHAIN_ERROR) { - return NGX_ERROR; - } - - f->data = out; - - nf = ngx_quic_alloc_frame(c); - if (nf == NULL) { - return NGX_ERROR; - } - - *nf = *f; - onf = &nf->u.ord; - onf->offset += of->length; - onf->length = shrink; - nf->len = ngx_quic_create_frame(NULL, nf); - nf->data = qb.chain; - - if (f->type == NGX_QUIC_FT_STREAM) { - f->u.stream.fin = 0; - } - - ngx_queue_insert_after(&f->queue, &nf->queue); - - return NGX_OK; -} - - -ngx_chain_t * -ngx_quic_copy_buffer(ngx_connection_t *c, u_char *data, size_t len) -{ - ngx_buf_t buf; - ngx_chain_t cl, *out; - ngx_quic_buffer_t qb; - - ngx_memzero(&buf, sizeof(ngx_buf_t)); - - buf.pos = data; - buf.last = buf.pos + len; - buf.temporary = 1; - - cl.buf = &buf; - cl.next = NULL; - - ngx_memzero(&qb, sizeof(ngx_quic_buffer_t)); - - if (ngx_quic_write_buffer(c, &qb, &cl, len, 0) == NGX_CHAIN_ERROR) { - return NGX_CHAIN_ERROR; - } - - out = ngx_quic_read_buffer(c, &qb, len); - if (out == NGX_CHAIN_ERROR) { - return NGX_CHAIN_ERROR; - } - - ngx_quic_free_buffer(c, &qb); - - return out; -} - - -ngx_chain_t * -ngx_quic_read_buffer(ngx_connection_t *c, ngx_quic_buffer_t *qb, uint64_t limit) -{ - uint64_t n; - ngx_buf_t *b; - ngx_chain_t *out, **ll; - - out = qb->chain; - - for (ll = &out; *ll; ll = &(*ll)->next) { - b = (*ll)->buf; - - if (b->sync) { - /* hole */ - break; - } - - if (limit == 0) { - break; - } - - n = b->last - b->pos; - - if (n > limit) { - if (ngx_quic_split_chain(c, *ll, limit) != NGX_OK) { - return NGX_CHAIN_ERROR; - } - - n = limit; - } - - limit -= n; - qb->offset += n; - } - - if (qb->offset >= qb->last_offset) { - qb->last_chain = NULL; - } - - qb->chain = *ll; - *ll = NULL; - - return out; -} - - -void -ngx_quic_skip_buffer(ngx_connection_t *c, ngx_quic_buffer_t *qb, - uint64_t offset) -{ - size_t n; - ngx_buf_t *b; - ngx_chain_t *cl; - - while (qb->chain) { - if (qb->offset >= offset) { - break; - } - - cl = qb->chain; - b = cl->buf; - n = b->last - b->pos; - - if (qb->offset + n > offset) { - n = offset - qb->offset; - b->pos += n; - qb->offset += n; - break; - } - - qb->offset += n; - qb->chain = cl->next; - - cl->next = NULL; - ngx_quic_free_chain(c, cl); - } - - if (qb->chain == NULL) { - qb->offset = offset; - } - - if (qb->offset >= qb->last_offset) { - qb->last_chain = NULL; - } -} - - -ngx_chain_t * -ngx_quic_alloc_chain(ngx_connection_t *c) -{ - ngx_chain_t *cl; - - cl = ngx_alloc_chain_link(c->pool); - if (cl == NULL) { - return NULL; - } - - cl->buf = ngx_quic_alloc_buf(c); - if (cl->buf == NULL) { - return NULL; - } - - return cl; -} - - -ngx_chain_t * -ngx_quic_write_buffer(ngx_connection_t *c, ngx_quic_buffer_t *qb, - ngx_chain_t *in, uint64_t limit, uint64_t offset) -{ - u_char *p; - uint64_t n, base; - ngx_buf_t *b; - ngx_chain_t *cl, **chain; - - if (qb->last_chain && offset >= qb->last_offset) { - base = qb->last_offset; - chain = &qb->last_chain; - - } else { - base = qb->offset; - chain = &qb->chain; - } - - while (in && limit) { - - if (offset < base) { - n = ngx_min((uint64_t) (in->buf->last - in->buf->pos), - ngx_min(base - offset, limit)); - - in->buf->pos += n; - offset += n; - limit -= n; - - if (in->buf->pos == in->buf->last) { - in = in->next; - } - - continue; - } - - cl = *chain; - - if (cl == NULL) { - cl = ngx_quic_alloc_chain(c); - if (cl == NULL) { - return NGX_CHAIN_ERROR; - } - - cl->buf->last = cl->buf->end; - cl->buf->sync = 1; /* hole */ - cl->next = NULL; - *chain = cl; - } - - b = cl->buf; - n = b->last - b->pos; - - if (base + n <= offset) { - base += n; - chain = &cl->next; - continue; - } - - if (b->sync && offset > base) { - if (ngx_quic_split_chain(c, cl, offset - base) != NGX_OK) { - return NGX_CHAIN_ERROR; - } - - continue; - } - - p = b->pos + (offset - base); - - while (in) { - - if (!ngx_buf_in_memory(in->buf) || in->buf->pos == in->buf->last) { - in = in->next; - continue; - } - - if (p == b->last || limit == 0) { - break; - } - - n = ngx_min(b->last - p, in->buf->last - in->buf->pos); - n = ngx_min(n, limit); - - if (b->sync) { - ngx_memcpy(p, in->buf->pos, n); - qb->size += n; - } - - p += n; - in->buf->pos += n; - offset += n; - limit -= n; - } - - if (b->sync && p == b->last) { - b->sync = 0; - continue; - } - - if (b->sync && p != b->pos) { - if (ngx_quic_split_chain(c, cl, p - b->pos) != NGX_OK) { - return NGX_CHAIN_ERROR; - } - - b->sync = 0; - } - } - - qb->last_offset = base; - qb->last_chain = *chain; - - return in; -} - - -void -ngx_quic_free_buffer(ngx_connection_t *c, ngx_quic_buffer_t *qb) -{ - ngx_quic_free_chain(c, qb->chain); - - qb->chain = NULL; - qb->last_chain = NULL; -} - - -#if (NGX_DEBUG) - -void -ngx_quic_log_frame(ngx_log_t *log, ngx_quic_frame_t *f, ngx_uint_t tx) -{ - u_char *p, *last, *pos, *end; - ssize_t n; - uint64_t gap, range, largest, smallest; - ngx_uint_t i; - u_char buf[NGX_MAX_ERROR_STR]; - - p = buf; - last = buf + sizeof(buf); - - switch (f->type) { - - case NGX_QUIC_FT_CRYPTO: - p = ngx_slprintf(p, last, "CRYPTO len:%uL off:%uL", - f->u.crypto.length, f->u.crypto.offset); - -#ifdef NGX_QUIC_DEBUG_FRAMES - { - ngx_chain_t *cl; - - p = ngx_slprintf(p, last, " data:"); - - for (cl = f->data; cl; cl = cl->next) { - p = ngx_slprintf(p, last, "%*xs", - cl->buf->last - cl->buf->pos, cl->buf->pos); - } - } -#endif - - break; - - case NGX_QUIC_FT_PADDING: - p = ngx_slprintf(p, last, "PADDING"); - break; - - case NGX_QUIC_FT_ACK: - case NGX_QUIC_FT_ACK_ECN: - - p = ngx_slprintf(p, last, "ACK n:%ui delay:%uL ", - f->u.ack.range_count, f->u.ack.delay); - - if (f->data) { - pos = f->data->buf->pos; - end = f->data->buf->last; - - } else { - pos = NULL; - end = NULL; - } - - largest = f->u.ack.largest; - smallest = f->u.ack.largest - f->u.ack.first_range; - - if (largest == smallest) { - p = ngx_slprintf(p, last, "%uL", largest); - - } else { - p = ngx_slprintf(p, last, "%uL-%uL", largest, smallest); - } - - for (i = 0; i < f->u.ack.range_count; i++) { - n = ngx_quic_parse_ack_range(log, pos, end, &gap, &range); - if (n == NGX_ERROR) { - break; - } - - pos += n; - - largest = smallest - gap - 2; - smallest = largest - range; - - if (largest == smallest) { - p = ngx_slprintf(p, last, " %uL", largest); - - } else { - p = ngx_slprintf(p, last, " %uL-%uL", largest, smallest); - } - } - - if (f->type == NGX_QUIC_FT_ACK_ECN) { - p = ngx_slprintf(p, last, " ECN counters ect0:%uL ect1:%uL ce:%uL", - f->u.ack.ect0, f->u.ack.ect1, f->u.ack.ce); - } - break; - - case NGX_QUIC_FT_PING: - p = ngx_slprintf(p, last, "PING"); - break; - - case NGX_QUIC_FT_NEW_CONNECTION_ID: - p = ngx_slprintf(p, last, - "NEW_CONNECTION_ID seq:%uL retire:%uL len:%ud", - f->u.ncid.seqnum, f->u.ncid.retire, f->u.ncid.len); - break; - - case NGX_QUIC_FT_RETIRE_CONNECTION_ID: - p = ngx_slprintf(p, last, "RETIRE_CONNECTION_ID seqnum:%uL", - f->u.retire_cid.sequence_number); - break; - - case NGX_QUIC_FT_CONNECTION_CLOSE: - case NGX_QUIC_FT_CONNECTION_CLOSE_APP: - p = ngx_slprintf(p, last, "CONNECTION_CLOSE%s err:%ui", - f->type == NGX_QUIC_FT_CONNECTION_CLOSE ? "" : "_APP", - f->u.close.error_code); - - if (f->u.close.reason.len) { - p = ngx_slprintf(p, last, " %V", &f->u.close.reason); - } - - if (f->type == NGX_QUIC_FT_CONNECTION_CLOSE) { - p = ngx_slprintf(p, last, " ft:%ui", f->u.close.frame_type); - } - - break; - - case NGX_QUIC_FT_STREAM: - p = ngx_slprintf(p, last, "STREAM id:0x%xL", f->u.stream.stream_id); - - if (f->u.stream.off) { - p = ngx_slprintf(p, last, " off:%uL", f->u.stream.offset); - } - - if (f->u.stream.len) { - p = ngx_slprintf(p, last, " len:%uL", f->u.stream.length); - } - - if (f->u.stream.fin) { - p = ngx_slprintf(p, last, " fin:1"); - } - -#ifdef NGX_QUIC_DEBUG_FRAMES - { - ngx_chain_t *cl; - - p = ngx_slprintf(p, last, " data:"); - - for (cl = f->data; cl; cl = cl->next) { - p = ngx_slprintf(p, last, "%*xs", - cl->buf->last - cl->buf->pos, cl->buf->pos); - } - } -#endif - - break; - - case NGX_QUIC_FT_MAX_DATA: - p = ngx_slprintf(p, last, "MAX_DATA max_data:%uL on recv", - f->u.max_data.max_data); - break; - - case NGX_QUIC_FT_RESET_STREAM: - p = ngx_slprintf(p, last, "RESET_STREAM" - " id:0x%xL error_code:0x%xL final_size:0x%xL", - f->u.reset_stream.id, f->u.reset_stream.error_code, - f->u.reset_stream.final_size); - break; - - case NGX_QUIC_FT_STOP_SENDING: - p = ngx_slprintf(p, last, "STOP_SENDING id:0x%xL err:0x%xL", - f->u.stop_sending.id, f->u.stop_sending.error_code); - break; - - case NGX_QUIC_FT_STREAMS_BLOCKED: - case NGX_QUIC_FT_STREAMS_BLOCKED2: - p = ngx_slprintf(p, last, "STREAMS_BLOCKED limit:%uL bidi:%ui", - f->u.streams_blocked.limit, f->u.streams_blocked.bidi); - break; - - case NGX_QUIC_FT_MAX_STREAMS: - case NGX_QUIC_FT_MAX_STREAMS2: - p = ngx_slprintf(p, last, "MAX_STREAMS limit:%uL bidi:%ui", - f->u.max_streams.limit, f->u.max_streams.bidi); - break; - - case NGX_QUIC_FT_MAX_STREAM_DATA: - p = ngx_slprintf(p, last, "MAX_STREAM_DATA id:0x%xL limit:%uL", - f->u.max_stream_data.id, f->u.max_stream_data.limit); - break; - - - case NGX_QUIC_FT_DATA_BLOCKED: - p = ngx_slprintf(p, last, "DATA_BLOCKED limit:%uL", - f->u.data_blocked.limit); - break; - - case NGX_QUIC_FT_STREAM_DATA_BLOCKED: - p = ngx_slprintf(p, last, "STREAM_DATA_BLOCKED id:0x%xL limit:%uL", - f->u.stream_data_blocked.id, - f->u.stream_data_blocked.limit); - break; - - case NGX_QUIC_FT_PATH_CHALLENGE: - p = ngx_slprintf(p, last, "PATH_CHALLENGE data:0x%*xs", - sizeof(f->u.path_challenge.data), - f->u.path_challenge.data); - break; - - case NGX_QUIC_FT_PATH_RESPONSE: - p = ngx_slprintf(p, last, "PATH_RESPONSE data:0x%*xs", - sizeof(f->u.path_challenge.data), - f->u.path_challenge.data); - break; - - case NGX_QUIC_FT_NEW_TOKEN: - p = ngx_slprintf(p, last, "NEW_TOKEN"); - -#ifdef NGX_QUIC_DEBUG_FRAMES - { - ngx_chain_t *cl; - - p = ngx_slprintf(p, last, " token:"); - - for (cl = f->data; cl; cl = cl->next) { - p = ngx_slprintf(p, last, "%*xs", - cl->buf->last - cl->buf->pos, cl->buf->pos); - } - } -#endif - - break; - - case NGX_QUIC_FT_HANDSHAKE_DONE: - p = ngx_slprintf(p, last, "HANDSHAKE DONE"); - break; - - default: - p = ngx_slprintf(p, last, "unknown type 0x%xi", f->type); - break; - } - - ngx_log_debug5(NGX_LOG_DEBUG_EVENT, log, 0, "quic frame %s %s:%uL %*s", - tx ? "tx" : "rx", ngx_quic_level_name(f->level), f->pnum, - p - buf, buf); -} - -#endif diff --git a/src/deps/src/nginx-1.30.3/src/event/quic/ngx_event_quic_frames.h b/src/deps/src/nginx-1.30.3/src/event/quic/ngx_event_quic_frames.h deleted file mode 100644 index 2d55af9de8..0000000000 --- a/src/deps/src/nginx-1.30.3/src/event/quic/ngx_event_quic_frames.h +++ /dev/null @@ -1,45 +0,0 @@ - -/* - * Copyright (C) Nginx, Inc. - */ - - -#ifndef _NGX_EVENT_QUIC_FRAMES_H_INCLUDED_ -#define _NGX_EVENT_QUIC_FRAMES_H_INCLUDED_ - - -#include -#include - - -typedef ngx_int_t (*ngx_quic_frame_handler_pt)(ngx_connection_t *c, - ngx_quic_frame_t *frame, void *data); - - -ngx_quic_frame_t *ngx_quic_alloc_frame(ngx_connection_t *c); -void ngx_quic_free_frame(ngx_connection_t *c, ngx_quic_frame_t *frame); -void ngx_quic_free_frames(ngx_connection_t *c, ngx_queue_t *frames); -void ngx_quic_queue_frame(ngx_quic_connection_t *qc, ngx_quic_frame_t *frame); -ngx_int_t ngx_quic_split_frame(ngx_connection_t *c, ngx_quic_frame_t *f, - size_t len); - -ngx_chain_t *ngx_quic_alloc_chain(ngx_connection_t *c); -void ngx_quic_free_chain(ngx_connection_t *c, ngx_chain_t *in); - -ngx_chain_t *ngx_quic_copy_buffer(ngx_connection_t *c, u_char *data, - size_t len); -ngx_chain_t *ngx_quic_read_buffer(ngx_connection_t *c, ngx_quic_buffer_t *qb, - uint64_t limit); -ngx_chain_t *ngx_quic_write_buffer(ngx_connection_t *c, ngx_quic_buffer_t *qb, - ngx_chain_t *in, uint64_t limit, uint64_t offset); -void ngx_quic_skip_buffer(ngx_connection_t *c, ngx_quic_buffer_t *qb, - uint64_t offset); -void ngx_quic_free_buffer(ngx_connection_t *c, ngx_quic_buffer_t *qb); - -#if (NGX_DEBUG) -void ngx_quic_log_frame(ngx_log_t *log, ngx_quic_frame_t *f, ngx_uint_t tx); -#else -#define ngx_quic_log_frame(log, f, tx) -#endif - -#endif /* _NGX_EVENT_QUIC_FRAMES_H_INCLUDED_ */ diff --git a/src/deps/src/nginx-1.30.3/src/event/quic/ngx_event_quic_migration.c b/src/deps/src/nginx-1.30.3/src/event/quic/ngx_event_quic_migration.c deleted file mode 100644 index bbb105142f..0000000000 --- a/src/deps/src/nginx-1.30.3/src/event/quic/ngx_event_quic_migration.c +++ /dev/null @@ -1,1007 +0,0 @@ - -/* - * Copyright (C) Nginx, Inc. - */ - - -#include -#include -#include -#include - - -#define NGX_QUIC_PATH_MTU_DELAY 100 -#define NGX_QUIC_PATH_MTU_PRECISION 16 - - -static void ngx_quic_set_connection_path(ngx_connection_t *c, - ngx_quic_path_t *path); -static ngx_int_t ngx_quic_validate_path(ngx_connection_t *c, - ngx_quic_path_t *path); -static ngx_int_t ngx_quic_send_path_challenge(ngx_connection_t *c, - ngx_quic_path_t *path); -static void ngx_quic_set_path_timer(ngx_connection_t *c); -static ngx_int_t ngx_quic_expire_path_validation(ngx_connection_t *c, - ngx_quic_path_t *path); -static ngx_int_t ngx_quic_expire_path_mtu_delay(ngx_connection_t *c, - ngx_quic_path_t *path); -static ngx_int_t ngx_quic_expire_path_mtu_discovery(ngx_connection_t *c, - ngx_quic_path_t *path); -static ngx_quic_path_t *ngx_quic_get_path(ngx_connection_t *c, ngx_uint_t tag); -static ngx_int_t ngx_quic_send_path_mtu_probe(ngx_connection_t *c, - ngx_quic_path_t *path); - - -ngx_int_t -ngx_quic_handle_path_challenge_frame(ngx_connection_t *c, - ngx_quic_header_t *pkt, ngx_quic_path_challenge_frame_t *f) -{ - size_t min; - ngx_quic_frame_t *fp; - ngx_quic_connection_t *qc; - - if (pkt->level != NGX_QUIC_ENCRYPTION_APPLICATION || pkt->path_challenged) { - ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0, - "quic ignoring PATH_CHALLENGE"); - return NGX_OK; - } - - pkt->path_challenged = 1; - - qc = ngx_quic_get_connection(c); - - fp = ngx_quic_alloc_frame(c); - if (fp == NULL) { - return NGX_ERROR; - } - - fp->level = NGX_QUIC_ENCRYPTION_APPLICATION; - fp->type = NGX_QUIC_FT_PATH_RESPONSE; - fp->u.path_response = *f; - - /* - * RFC 9000, 8.2.2. Path Validation Responses - * - * A PATH_RESPONSE frame MUST be sent on the network path where the - * PATH_CHALLENGE frame was received. - */ - - /* - * An endpoint MUST expand datagrams that contain a PATH_RESPONSE frame - * to at least the smallest allowed maximum datagram size of 1200 bytes. - * ... - * However, an endpoint MUST NOT expand the datagram containing the - * PATH_RESPONSE if the resulting data exceeds the anti-amplification limit. - */ - - min = (ngx_quic_path_limit(c, pkt->path, 1200) < 1200) ? 0 : 1200; - - if (ngx_quic_frame_sendto(c, fp, min, pkt->path) == NGX_ERROR) { - return NGX_ERROR; - } - - if (pkt->path == qc->path) { - /* - * RFC 9000, 9.3.3. Off-Path Packet Forwarding - * - * An endpoint that receives a PATH_CHALLENGE on an active path SHOULD - * send a non-probing packet in response. - */ - - fp = ngx_quic_alloc_frame(c); - if (fp == NULL) { - return NGX_ERROR; - } - - fp->level = NGX_QUIC_ENCRYPTION_APPLICATION; - fp->type = NGX_QUIC_FT_PING; - - ngx_quic_queue_frame(qc, fp); - } - - return NGX_OK; -} - - -ngx_int_t -ngx_quic_handle_path_response_frame(ngx_connection_t *c, - ngx_quic_path_challenge_frame_t *f) -{ - ngx_uint_t rst; - ngx_queue_t *q; - ngx_quic_path_t *path, *prev; - ngx_quic_send_ctx_t *ctx; - ngx_quic_connection_t *qc; - - qc = ngx_quic_get_connection(c); - - /* - * RFC 9000, 8.2.3. Successful Path Validation - * - * A PATH_RESPONSE frame received on any network path validates the path - * on which the PATH_CHALLENGE was sent. - */ - - for (q = ngx_queue_head(&qc->paths); - q != ngx_queue_sentinel(&qc->paths); - q = ngx_queue_next(q)) - { - path = ngx_queue_data(q, ngx_quic_path_t, queue); - - if (path->state != NGX_QUIC_PATH_VALIDATING) { - continue; - } - - if (ngx_memcmp(path->challenge[0], f->data, sizeof(f->data)) == 0 - || ngx_memcmp(path->challenge[1], f->data, sizeof(f->data)) == 0) - { - goto valid; - } - } - - ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0, - "quic stale PATH_RESPONSE ignored"); - - return NGX_OK; - -valid: - - /* - * RFC 9000, 9.4. Loss Detection and Congestion Control - * - * On confirming a peer's ownership of its new address, - * an endpoint MUST immediately reset the congestion controller - * and round-trip time estimator for the new path to initial values - * unless the only change in the peer's address is its port number. - */ - - rst = 1; - - prev = ngx_quic_get_path(c, NGX_QUIC_PATH_BACKUP); - - if (prev != NULL) { - - if (ngx_cmp_sockaddr(prev->sockaddr, prev->socklen, - path->sockaddr, path->socklen, 0) - == NGX_OK) - { - /* address did not change */ - rst = 0; - - path->mtu = prev->mtu; - path->max_mtu = prev->max_mtu; - path->mtu_unvalidated = 0; - } - } - - if (rst) { - /* prevent old path packets contribution to congestion control */ - - ctx = ngx_quic_get_send_ctx(qc, NGX_QUIC_ENCRYPTION_APPLICATION); - qc->rst_pnum = ctx->pnum; - - ngx_memzero(&qc->congestion, sizeof(ngx_quic_congestion_t)); - - qc->congestion.window = ngx_min(10 * NGX_QUIC_MIN_INITIAL_SIZE, - ngx_max(2 * NGX_QUIC_MIN_INITIAL_SIZE, - 14720)); - qc->congestion.ssthresh = (size_t) -1; - qc->congestion.mtu = NGX_QUIC_MIN_INITIAL_SIZE; - qc->congestion.recovery_start = ngx_current_msec - 1; - - ngx_quic_init_rtt(qc); - } - - path->validated = 1; - - ngx_quic_set_connection_path(c, path); - - if (path->mtu_unvalidated) { - path->mtu_unvalidated = 0; - return ngx_quic_validate_path(c, path); - } - - /* - * RFC 9000, 9.3. Responding to Connection Migration - * - * After verifying a new client address, the server SHOULD - * send new address validation tokens (Section 8) to the client. - */ - - if (ngx_quic_send_new_token(c, path) != NGX_OK) { - return NGX_ERROR; - } - - ngx_log_error(NGX_LOG_INFO, c->log, 0, - "quic path seq:%uL addr:%V successfully validated", - path->seqnum, &path->addr_text); - - ngx_quic_path_dbg(c, "is validated", path); - - ngx_quic_discover_path_mtu(c, path); - - return NGX_OK; -} - - -ngx_quic_path_t * -ngx_quic_new_path(ngx_connection_t *c, - struct sockaddr *sockaddr, socklen_t socklen, ngx_quic_client_id_t *cid) -{ - ngx_queue_t *q; - ngx_quic_path_t *path; - ngx_quic_connection_t *qc; - - qc = ngx_quic_get_connection(c); - - if (!ngx_queue_empty(&qc->free_paths)) { - - q = ngx_queue_head(&qc->free_paths); - path = ngx_queue_data(q, ngx_quic_path_t, queue); - - ngx_queue_remove(&path->queue); - - ngx_memzero(path, sizeof(ngx_quic_path_t)); - - } else { - - path = ngx_pcalloc(c->pool, sizeof(ngx_quic_path_t)); - if (path == NULL) { - return NULL; - } - } - - ngx_queue_insert_tail(&qc->paths, &path->queue); - - path->cid = cid; - cid->used = 1; - - path->seqnum = qc->path_seqnum++; - - path->sockaddr = &path->sa.sockaddr; - path->socklen = socklen; - ngx_memcpy(path->sockaddr, sockaddr, socklen); - - path->addr_text.data = path->text; - path->addr_text.len = ngx_sock_ntop(sockaddr, socklen, path->text, - NGX_SOCKADDR_STRLEN, 1); - - path->mtu = NGX_QUIC_MIN_INITIAL_SIZE; - - ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0, - "quic path seq:%uL created addr:%V", - path->seqnum, &path->addr_text); - return path; -} - - -static ngx_quic_path_t * -ngx_quic_get_path(ngx_connection_t *c, ngx_uint_t tag) -{ - ngx_queue_t *q; - ngx_quic_path_t *path; - ngx_quic_connection_t *qc; - - qc = ngx_quic_get_connection(c); - - for (q = ngx_queue_head(&qc->paths); - q != ngx_queue_sentinel(&qc->paths); - q = ngx_queue_next(q)) - { - path = ngx_queue_data(q, ngx_quic_path_t, queue); - - if (path->tag == tag) { - return path; - } - } - - return NULL; -} - - -ngx_int_t -ngx_quic_set_path(ngx_connection_t *c, ngx_quic_header_t *pkt) -{ - off_t len; - ngx_queue_t *q; - ngx_quic_path_t *path, *probe; - ngx_quic_socket_t *qsock; - ngx_quic_send_ctx_t *ctx; - ngx_quic_client_id_t *cid; - ngx_quic_connection_t *qc; - - qc = ngx_quic_get_connection(c); - qsock = ngx_quic_get_socket(c); - - len = pkt->raw->last - pkt->raw->start; - - if (c->udp->buffer == NULL) { - /* first ever packet in connection, path already exists */ - path = qc->path; - goto update; - } - - probe = NULL; - - for (q = ngx_queue_head(&qc->paths); - q != ngx_queue_sentinel(&qc->paths); - q = ngx_queue_next(q)) - { - path = ngx_queue_data(q, ngx_quic_path_t, queue); - - if (ngx_cmp_sockaddr(&qsock->sockaddr.sockaddr, qsock->socklen, - path->sockaddr, path->socklen, 1) - == NGX_OK) - { - goto update; - } - - if (path->tag == NGX_QUIC_PATH_PROBE) { - probe = path; - } - } - - /* packet from new path, drop current probe, if any */ - - ctx = ngx_quic_get_send_ctx(qc, pkt->level); - - /* - * only accept highest-numbered packets to prevent connection id - * exhaustion by excessive probing packets from unknown paths - */ - if (pkt->pn != ctx->largest_pn) { - return NGX_DONE; - } - - if (probe && ngx_quic_free_path(c, probe) != NGX_OK) { - return NGX_ERROR; - } - - /* new path requires new client id */ - cid = ngx_quic_next_client_id(c); - if (cid == NULL) { - ngx_log_error(NGX_LOG_INFO, c->log, 0, - "quic no available client ids for new path"); - /* stop processing of this datagram */ - return NGX_DONE; - } - - path = ngx_quic_new_path(c, &qsock->sockaddr.sockaddr, qsock->socklen, cid); - if (path == NULL) { - return NGX_ERROR; - } - - path->tag = NGX_QUIC_PATH_PROBE; - - /* - * client arrived using new path and previously seen DCID, - * this indicates NAT rebinding (or bad client) - */ - if (qsock->used) { - pkt->rebound = 1; - } - -update: - - qsock->used = 1; - pkt->path = path; - - /* TODO: this may be too late in some cases; - * for example, if error happens during decrypt(), we cannot - * send CC, if error happens in 1st packet, due to amplification - * limit, because path->received = 0 - * - * should we account garbage as received or only decrypting packets? - */ - path->received += len; - - ngx_log_debug3(NGX_LOG_DEBUG_EVENT, c->log, 0, - "quic packet len:%O via sock seq:%L path seq:%uL", - len, (int64_t) qsock->sid.seqnum, path->seqnum); - ngx_quic_path_dbg(c, "status", path); - - return NGX_OK; -} - - -ngx_int_t -ngx_quic_free_path(ngx_connection_t *c, ngx_quic_path_t *path) -{ - ngx_quic_connection_t *qc; - - qc = ngx_quic_get_connection(c); - - ngx_queue_remove(&path->queue); - ngx_queue_insert_head(&qc->free_paths, &path->queue); - - /* - * invalidate CID that is no longer usable for any other path; - * this also requests new CIDs from client - */ - if (path->cid) { - if (ngx_quic_free_client_id(c, path->cid) != NGX_OK) { - return NGX_ERROR; - } - } - - ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0, - "quic path seq:%uL addr:%V retired", - path->seqnum, &path->addr_text); - - return NGX_OK; -} - - -static void -ngx_quic_set_connection_path(ngx_connection_t *c, ngx_quic_path_t *path) -{ - ngx_memcpy(c->sockaddr, path->sockaddr, path->socklen); - c->socklen = path->socklen; - - if (c->addr_text.data) { - c->addr_text.len = ngx_sock_ntop(c->sockaddr, c->socklen, - c->addr_text.data, - c->listening->addr_text_max_len, 0); - } - - ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0, - "quic send path set to seq:%uL addr:%V", - path->seqnum, &path->addr_text); -} - - -ngx_int_t -ngx_quic_handle_migration(ngx_connection_t *c, ngx_quic_header_t *pkt) -{ - ngx_quic_path_t *next, *bkp; - ngx_quic_send_ctx_t *ctx; - ngx_quic_connection_t *qc; - - /* got non-probing packet via non-active path */ - - qc = ngx_quic_get_connection(c); - - ctx = ngx_quic_get_send_ctx(qc, pkt->level); - - /* - * RFC 9000, 9.3. Responding to Connection Migration - * - * An endpoint only changes the address to which it sends packets in - * response to the highest-numbered non-probing packet. - */ - if (pkt->pn != ctx->largest_pn) { - return NGX_OK; - } - - next = pkt->path; - - /* - * RFC 9000, 9.3.3: - * - * In response to an apparent migration, endpoints MUST validate the - * previously active path using a PATH_CHALLENGE frame. - */ - if (pkt->rebound) { - - /* NAT rebinding: client uses new path with old SID */ - if (ngx_quic_validate_path(c, qc->path) != NGX_OK) { - return NGX_ERROR; - } - } - - if (qc->path->validated) { - - if (next->tag != NGX_QUIC_PATH_BACKUP) { - /* can delete backup path, if any */ - bkp = ngx_quic_get_path(c, NGX_QUIC_PATH_BACKUP); - - if (bkp && ngx_quic_free_path(c, bkp) != NGX_OK) { - return NGX_ERROR; - } - } - - qc->path->tag = NGX_QUIC_PATH_BACKUP; - ngx_quic_path_dbg(c, "is now backup", qc->path); - - } else { - if (ngx_quic_free_path(c, qc->path) != NGX_OK) { - return NGX_ERROR; - } - } - - /* switch active path to migrated */ - qc->path = next; - qc->path->tag = NGX_QUIC_PATH_ACTIVE; - - if (next->validated) { - ngx_quic_set_connection_path(c, next); - - } else if (next->state != NGX_QUIC_PATH_VALIDATING) { - if (ngx_quic_validate_path(c, next) != NGX_OK) { - return NGX_ERROR; - } - } - - ngx_log_error(NGX_LOG_INFO, c->log, 0, - "quic migrated to path seq:%uL addr:%V", - qc->path->seqnum, &qc->path->addr_text); - - ngx_quic_path_dbg(c, "is now active", qc->path); - - return NGX_OK; -} - - -static ngx_int_t -ngx_quic_validate_path(ngx_connection_t *c, ngx_quic_path_t *path) -{ - ngx_msec_t pto; - ngx_quic_send_ctx_t *ctx; - ngx_quic_connection_t *qc; - - qc = ngx_quic_get_connection(c); - - ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, - "quic initiated validation of path seq:%uL", path->seqnum); - - path->tries = 0; - - if (RAND_bytes((u_char *) path->challenge, sizeof(path->challenge)) != 1) { - return NGX_ERROR; - } - - (void) ngx_quic_send_path_challenge(c, path); - - ctx = ngx_quic_get_send_ctx(qc, NGX_QUIC_ENCRYPTION_APPLICATION); - pto = ngx_max(ngx_quic_pto(c, ctx), 1000); - - path->expires = ngx_current_msec + pto; - path->state = NGX_QUIC_PATH_VALIDATING; - - ngx_quic_set_path_timer(c); - - return NGX_OK; -} - - -static ngx_int_t -ngx_quic_send_path_challenge(ngx_connection_t *c, ngx_quic_path_t *path) -{ - size_t min; - ngx_uint_t n; - ngx_quic_frame_t *frame; - - ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0, - "quic path seq:%uL send path_challenge tries:%ui", - path->seqnum, path->tries); - - for (n = 0; n < 2; n++) { - - frame = ngx_quic_alloc_frame(c); - if (frame == NULL) { - return NGX_ERROR; - } - - frame->level = NGX_QUIC_ENCRYPTION_APPLICATION; - frame->type = NGX_QUIC_FT_PATH_CHALLENGE; - - ngx_memcpy(frame->u.path_challenge.data, path->challenge[n], 8); - - /* - * RFC 9000, 8.2.1. Initiating Path Validation - * - * An endpoint MUST expand datagrams that contain a PATH_CHALLENGE frame - * to at least the smallest allowed maximum datagram size of 1200 bytes, - * unless the anti-amplification limit for the path does not permit - * sending a datagram of this size. - */ - - if (path->mtu_unvalidated - || ngx_quic_path_limit(c, path, 1200) < 1200) - { - min = 0; - path->mtu_unvalidated = 1; - - } else { - min = 1200; - } - - if (ngx_quic_frame_sendto(c, frame, min, path) == NGX_ERROR) { - return NGX_ERROR; - } - } - - return NGX_OK; -} - - -void -ngx_quic_discover_path_mtu(ngx_connection_t *c, ngx_quic_path_t *path) -{ - ngx_quic_connection_t *qc; - - qc = ngx_quic_get_connection(c); - - if (path->max_mtu) { - if (path->max_mtu - path->mtu <= NGX_QUIC_PATH_MTU_PRECISION) { - path->state = NGX_QUIC_PATH_IDLE; - ngx_quic_set_path_timer(c); - return; - } - - path->mtud = (path->mtu + path->max_mtu) / 2; - - } else { - path->mtud = path->mtu * 2; - - if (path->mtud >= qc->ctp.max_udp_payload_size) { - path->mtud = qc->ctp.max_udp_payload_size; - path->max_mtu = qc->ctp.max_udp_payload_size; - } - } - - path->state = NGX_QUIC_PATH_WAITING; - path->expires = ngx_current_msec + NGX_QUIC_PATH_MTU_DELAY; - - ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0, - "quic path seq:%uL schedule mtu:%uz", - path->seqnum, path->mtud); - - ngx_quic_set_path_timer(c); -} - - -static void -ngx_quic_set_path_timer(ngx_connection_t *c) -{ - ngx_msec_t now; - ngx_queue_t *q; - ngx_msec_int_t left, next; - ngx_quic_path_t *path; - ngx_quic_connection_t *qc; - - qc = ngx_quic_get_connection(c); - - now = ngx_current_msec; - next = -1; - - for (q = ngx_queue_head(&qc->paths); - q != ngx_queue_sentinel(&qc->paths); - q = ngx_queue_next(q)) - { - path = ngx_queue_data(q, ngx_quic_path_t, queue); - - if (path->state == NGX_QUIC_PATH_IDLE) { - continue; - } - - left = path->expires - now; - left = ngx_max(left, 1); - - if (next == -1 || left < next) { - next = left; - } - } - - if (next != -1) { - ngx_add_timer(&qc->path_validation, next); - - } else if (qc->path_validation.timer_set) { - ngx_del_timer(&qc->path_validation); - } -} - - -void -ngx_quic_path_handler(ngx_event_t *ev) -{ - ngx_msec_t now; - ngx_queue_t *q; - ngx_msec_int_t left; - ngx_quic_path_t *path; - ngx_connection_t *c; - ngx_quic_connection_t *qc; - - c = ev->data; - qc = ngx_quic_get_connection(c); - - now = ngx_current_msec; - - q = ngx_queue_head(&qc->paths); - - while (q != ngx_queue_sentinel(&qc->paths)) { - - path = ngx_queue_data(q, ngx_quic_path_t, queue); - q = ngx_queue_next(q); - - if (path->state == NGX_QUIC_PATH_IDLE) { - continue; - } - - left = path->expires - now; - - if (left > 0) { - continue; - } - - switch (path->state) { - case NGX_QUIC_PATH_VALIDATING: - if (ngx_quic_expire_path_validation(c, path) != NGX_OK) { - goto failed; - } - - break; - - case NGX_QUIC_PATH_WAITING: - if (ngx_quic_expire_path_mtu_delay(c, path) != NGX_OK) { - goto failed; - } - - break; - - case NGX_QUIC_PATH_MTUD: - if (ngx_quic_expire_path_mtu_discovery(c, path) != NGX_OK) { - goto failed; - } - - break; - - default: - break; - } - } - - ngx_quic_set_path_timer(c); - - return; - -failed: - - ngx_quic_close_connection(c, NGX_ERROR); -} - - -static ngx_int_t -ngx_quic_expire_path_validation(ngx_connection_t *c, ngx_quic_path_t *path) -{ - ngx_msec_int_t pto; - ngx_quic_path_t *bkp; - ngx_quic_send_ctx_t *ctx; - ngx_quic_connection_t *qc; - - qc = ngx_quic_get_connection(c); - ctx = ngx_quic_get_send_ctx(qc, NGX_QUIC_ENCRYPTION_APPLICATION); - - if (++path->tries < NGX_QUIC_PATH_RETRIES) { - pto = ngx_max(ngx_quic_pto(c, ctx), 1000) << path->tries; - path->expires = ngx_current_msec + pto; - - (void) ngx_quic_send_path_challenge(c, path); - - return NGX_OK; - } - - ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, - "quic path seq:%uL validation failed", path->seqnum); - - /* found expired path */ - - path->validated = 0; - - - /* RFC 9000, 9.3.2. On-Path Address Spoofing - * - * To protect the connection from failing due to such a spurious - * migration, an endpoint MUST revert to using the last validated - * peer address when validation of a new peer address fails. - */ - - if (qc->path == path) { - /* active path validation failed */ - - bkp = ngx_quic_get_path(c, NGX_QUIC_PATH_BACKUP); - - if (bkp == NULL) { - qc->error = NGX_QUIC_ERR_NO_VIABLE_PATH; - qc->error_reason = "no viable path"; - return NGX_ERROR; - } - - qc->path = bkp; - qc->path->tag = NGX_QUIC_PATH_ACTIVE; - - ngx_log_error(NGX_LOG_INFO, c->log, 0, - "quic path seq:%uL addr:%V is restored from backup", - qc->path->seqnum, &qc->path->addr_text); - - ngx_quic_path_dbg(c, "is active", qc->path); - } - - return ngx_quic_free_path(c, path); -} - - -static ngx_int_t -ngx_quic_expire_path_mtu_delay(ngx_connection_t *c, ngx_quic_path_t *path) -{ - ngx_int_t rc; - ngx_uint_t i; - ngx_msec_t pto; - ngx_quic_send_ctx_t *ctx; - ngx_quic_connection_t *qc; - - qc = ngx_quic_get_connection(c); - ctx = ngx_quic_get_send_ctx(qc, NGX_QUIC_ENCRYPTION_APPLICATION); - - path->tries = 0; - - for ( ;; ) { - - for (i = 0; i < NGX_QUIC_PATH_RETRIES; i++) { - path->mtu_pnum[i] = NGX_QUIC_UNSET_PN; - } - - rc = ngx_quic_send_path_mtu_probe(c, path); - - if (rc == NGX_ERROR) { - return NGX_ERROR; - } - - if (rc == NGX_OK) { - pto = ngx_quic_pto(c, ctx); - path->expires = ngx_current_msec + pto; - path->state = NGX_QUIC_PATH_MTUD; - return NGX_OK; - } - - /* rc == NGX_DECLINED */ - - path->max_mtu = path->mtud; - - if (path->max_mtu - path->mtu <= NGX_QUIC_PATH_MTU_PRECISION) { - path->state = NGX_QUIC_PATH_IDLE; - return NGX_OK; - } - - path->mtud = (path->mtu + path->max_mtu) / 2; - } -} - - -static ngx_int_t -ngx_quic_expire_path_mtu_discovery(ngx_connection_t *c, ngx_quic_path_t *path) -{ - ngx_int_t rc; - ngx_msec_int_t pto; - ngx_quic_send_ctx_t *ctx; - ngx_quic_connection_t *qc; - - qc = ngx_quic_get_connection(c); - ctx = ngx_quic_get_send_ctx(qc, NGX_QUIC_ENCRYPTION_APPLICATION); - - if (++path->tries < NGX_QUIC_PATH_RETRIES) { - rc = ngx_quic_send_path_mtu_probe(c, path); - - if (rc == NGX_ERROR) { - return NGX_ERROR; - } - - if (rc == NGX_OK) { - pto = ngx_quic_pto(c, ctx) << path->tries; - path->expires = ngx_current_msec + pto; - return NGX_OK; - } - - /* rc == NGX_DECLINED */ - } - - ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0, - "quic path seq:%uL expired mtu:%uz", - path->seqnum, path->mtud); - - path->max_mtu = path->mtud; - - ngx_quic_discover_path_mtu(c, path); - - return NGX_OK; -} - - -static ngx_int_t -ngx_quic_send_path_mtu_probe(ngx_connection_t *c, ngx_quic_path_t *path) -{ - size_t mtu; - uint64_t pnum; - ngx_int_t rc; - ngx_uint_t log_error; - ngx_quic_frame_t *frame; - ngx_quic_send_ctx_t *ctx; - ngx_quic_connection_t *qc; - - frame = ngx_quic_alloc_frame(c); - if (frame == NULL) { - return NGX_ERROR; - } - - frame->level = NGX_QUIC_ENCRYPTION_APPLICATION; - frame->type = NGX_QUIC_FT_PING; - frame->ignore_loss = 1; - frame->ignore_congestion = 1; - - qc = ngx_quic_get_connection(c); - ctx = ngx_quic_get_send_ctx(qc, NGX_QUIC_ENCRYPTION_APPLICATION); - pnum = ctx->pnum; - - ngx_log_debug4(NGX_LOG_DEBUG_EVENT, c->log, 0, - "quic path seq:%uL send probe " - "mtu:%uz pnum:%uL tries:%ui", - path->seqnum, path->mtud, ctx->pnum, path->tries); - - log_error = c->log_error; - c->log_error = NGX_ERROR_IGNORE_EMSGSIZE; - - mtu = path->mtu; - path->mtu = path->mtud; - - rc = ngx_quic_frame_sendto(c, frame, path->mtud, path); - - path->mtu = mtu; - c->log_error = log_error; - - if (rc == NGX_OK) { - path->mtu_pnum[path->tries] = pnum; - return NGX_OK; - } - - ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0, - "quic path seq:%uL rejected mtu:%uz", - path->seqnum, path->mtud); - - if (rc == NGX_ERROR) { - if (c->write->error) { - c->write->error = 0; - return NGX_DECLINED; - } - - return NGX_ERROR; - } - - return NGX_OK; -} - - -ngx_int_t -ngx_quic_handle_path_mtu(ngx_connection_t *c, ngx_quic_path_t *path, - uint64_t min, uint64_t max) -{ - uint64_t pnum; - ngx_uint_t i; - - if (path->state != NGX_QUIC_PATH_MTUD) { - return NGX_OK; - } - - for (i = 0; i < NGX_QUIC_PATH_RETRIES; i++) { - pnum = path->mtu_pnum[i]; - - if (pnum == NGX_QUIC_UNSET_PN) { - continue; - } - - if (pnum < min || pnum > max) { - continue; - } - - path->mtu = path->mtud; - - ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0, - "quic path seq:%uL ack mtu:%uz", - path->seqnum, path->mtu); - - ngx_quic_discover_path_mtu(c, path); - - break; - } - - return NGX_OK; -} diff --git a/src/deps/src/nginx-1.30.3/src/event/quic/ngx_event_quic_migration.h b/src/deps/src/nginx-1.30.3/src/event/quic/ngx_event_quic_migration.h deleted file mode 100644 index 270c572ed8..0000000000 --- a/src/deps/src/nginx-1.30.3/src/event/quic/ngx_event_quic_migration.h +++ /dev/null @@ -1,45 +0,0 @@ - -/* - * Copyright (C) Nginx, Inc. - */ - - -#ifndef _NGX_EVENT_QUIC_MIGRATION_H_INCLUDED_ -#define _NGX_EVENT_QUIC_MIGRATION_H_INCLUDED_ - - -#include -#include - -#define NGX_QUIC_PATH_RETRIES 3 - -#define NGX_QUIC_PATH_PROBE 0 -#define NGX_QUIC_PATH_ACTIVE 1 -#define NGX_QUIC_PATH_BACKUP 2 - -#define ngx_quic_path_dbg(c, msg, path) \ - ngx_log_debug7(NGX_LOG_DEBUG_EVENT, c->log, 0, \ - "quic path seq:%uL %s tx:%O rx:%O valid:%d st:%d mtu:%uz", \ - path->seqnum, msg, path->sent, path->received, \ - path->validated, path->state, path->mtu); - -ngx_int_t ngx_quic_handle_path_challenge_frame(ngx_connection_t *c, - ngx_quic_header_t *pkt, ngx_quic_path_challenge_frame_t *f); -ngx_int_t ngx_quic_handle_path_response_frame(ngx_connection_t *c, - ngx_quic_path_challenge_frame_t *f); - -ngx_quic_path_t *ngx_quic_new_path(ngx_connection_t *c, - struct sockaddr *sockaddr, socklen_t socklen, ngx_quic_client_id_t *cid); -ngx_int_t ngx_quic_free_path(ngx_connection_t *c, ngx_quic_path_t *path); - -ngx_int_t ngx_quic_set_path(ngx_connection_t *c, ngx_quic_header_t *pkt); -ngx_int_t ngx_quic_handle_migration(ngx_connection_t *c, - ngx_quic_header_t *pkt); - -void ngx_quic_path_handler(ngx_event_t *ev); - -void ngx_quic_discover_path_mtu(ngx_connection_t *c, ngx_quic_path_t *path); -ngx_int_t ngx_quic_handle_path_mtu(ngx_connection_t *c, - ngx_quic_path_t *path, uint64_t min, uint64_t max); - -#endif /* _NGX_EVENT_QUIC_MIGRATION_H_INCLUDED_ */ diff --git a/src/deps/src/nginx-1.30.3/src/event/quic/ngx_event_quic_openssl_compat.c b/src/deps/src/nginx-1.30.3/src/event/quic/ngx_event_quic_openssl_compat.c deleted file mode 100644 index c5f4a0f74d..0000000000 --- a/src/deps/src/nginx-1.30.3/src/event/quic/ngx_event_quic_openssl_compat.c +++ /dev/null @@ -1,652 +0,0 @@ - -/* - * Copyright (C) Nginx, Inc. - */ - - -#include -#include -#include -#include - - -#if (NGX_QUIC_OPENSSL_COMPAT) - -#define NGX_QUIC_COMPAT_RECORD_SIZE 1024 - -#define NGX_QUIC_COMPAT_SSL_TP_EXT 0x39 - -#define NGX_QUIC_COMPAT_CLIENT_HANDSHAKE "CLIENT_HANDSHAKE_TRAFFIC_SECRET" -#define NGX_QUIC_COMPAT_SERVER_HANDSHAKE "SERVER_HANDSHAKE_TRAFFIC_SECRET" -#define NGX_QUIC_COMPAT_CLIENT_APPLICATION "CLIENT_TRAFFIC_SECRET_0" -#define NGX_QUIC_COMPAT_SERVER_APPLICATION "SERVER_TRAFFIC_SECRET_0" - - -typedef struct { - ngx_quic_secret_t secret; - ngx_uint_t cipher; -} ngx_quic_compat_keys_t; - - -typedef struct { - ngx_log_t *log; - - u_char type; - ngx_str_t payload; - uint64_t number; - ngx_quic_compat_keys_t *keys; -} ngx_quic_compat_record_t; - - -struct ngx_quic_compat_s { - const SSL_QUIC_METHOD *method; - - enum ssl_encryption_level_t write_level; - - uint64_t read_record; - ngx_quic_compat_keys_t keys; - - ngx_str_t tp; - ngx_str_t ctp; -}; - - -static void ngx_quic_compat_keylog_callback(const SSL *ssl, const char *line); -static ngx_int_t ngx_quic_compat_set_encryption_secret(ngx_connection_t *c, - ngx_quic_compat_keys_t *keys, enum ssl_encryption_level_t level, - const SSL_CIPHER *cipher, const uint8_t *secret, size_t secret_len); -static void ngx_quic_compat_cleanup_encryption_secret(void *data); -static int ngx_quic_compat_add_transport_params_callback(SSL *ssl, - unsigned int ext_type, unsigned int context, const unsigned char **out, - size_t *outlen, X509 *x, size_t chainidx, int *al, void *add_arg); -static int ngx_quic_compat_parse_transport_params_callback(SSL *ssl, - unsigned int ext_type, unsigned int context, const unsigned char *in, - size_t inlen, X509 *x, size_t chainidx, int *al, void *parse_arg); -static void ngx_quic_compat_message_callback(int write_p, int version, - int content_type, const void *buf, size_t len, SSL *ssl, void *arg); -static size_t ngx_quic_compat_create_header(ngx_quic_compat_record_t *rec, - u_char *out, ngx_uint_t plain); -static ngx_int_t ngx_quic_compat_create_record(ngx_quic_compat_record_t *rec, - ngx_str_t *res); - - -ngx_int_t -ngx_quic_compat_init(ngx_conf_t *cf, SSL_CTX *ctx) -{ - SSL_CTX_set_keylog_callback(ctx, ngx_quic_compat_keylog_callback); - - if (SSL_CTX_has_client_custom_ext(ctx, NGX_QUIC_COMPAT_SSL_TP_EXT)) { - return NGX_OK; - } - - if (SSL_CTX_add_custom_ext(ctx, NGX_QUIC_COMPAT_SSL_TP_EXT, - SSL_EXT_CLIENT_HELLO - |SSL_EXT_TLS1_3_ENCRYPTED_EXTENSIONS, - ngx_quic_compat_add_transport_params_callback, - NULL, - NULL, - ngx_quic_compat_parse_transport_params_callback, - NULL) - == 0) - { - ngx_log_error(NGX_LOG_EMERG, cf->log, 0, - "SSL_CTX_add_custom_ext() failed"); - return NGX_ERROR; - } - - return NGX_OK; -} - - -static void -ngx_quic_compat_keylog_callback(const SSL *ssl, const char *line) -{ - u_char ch, *p, *start, value; - size_t n; - ngx_uint_t write; - const SSL_CIPHER *cipher; - ngx_quic_compat_t *com; - ngx_connection_t *c; - ngx_quic_connection_t *qc; - enum ssl_encryption_level_t level; - u_char secret[EVP_MAX_MD_SIZE]; - - c = ngx_ssl_get_connection(ssl); - if (c->type != SOCK_DGRAM) { - return; - } - - p = (u_char *) line; - - for (start = p; *p && *p != ' '; p++); - - n = p - start; - - ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0, - "quic compat secret %*s", n, start); - - if (n == sizeof(NGX_QUIC_COMPAT_CLIENT_HANDSHAKE) - 1 - && ngx_strncmp(start, NGX_QUIC_COMPAT_CLIENT_HANDSHAKE, n) == 0) - { - level = ssl_encryption_handshake; - write = 0; - - } else if (n == sizeof(NGX_QUIC_COMPAT_SERVER_HANDSHAKE) - 1 - && ngx_strncmp(start, NGX_QUIC_COMPAT_SERVER_HANDSHAKE, n) == 0) - { - level = ssl_encryption_handshake; - write = 1; - - } else if (n == sizeof(NGX_QUIC_COMPAT_CLIENT_APPLICATION) - 1 - && ngx_strncmp(start, NGX_QUIC_COMPAT_CLIENT_APPLICATION, n) - == 0) - { - level = ssl_encryption_application; - write = 0; - - } else if (n == sizeof(NGX_QUIC_COMPAT_SERVER_APPLICATION) - 1 - && ngx_strncmp(start, NGX_QUIC_COMPAT_SERVER_APPLICATION, n) - == 0) - { - level = ssl_encryption_application; - write = 1; - - } else { - return; - } - - if (*p++ == '\0') { - return; - } - - for ( /* void */ ; *p && *p != ' '; p++); - - if (*p++ == '\0') { - return; - } - - for (n = 0, start = p; *p; p++) { - ch = *p; - - if (ch >= '0' && ch <= '9') { - value = ch - '0'; - goto next; - } - - ch = (u_char) (ch | 0x20); - - if (ch >= 'a' && ch <= 'f') { - value = ch - 'a' + 10; - goto next; - } - - ngx_log_error(NGX_LOG_EMERG, c->log, 0, - "invalid OpenSSL QUIC secret format"); - - return; - - next: - - if ((p - start) % 2) { - secret[n++] += value; - - } else { - if (n >= EVP_MAX_MD_SIZE) { - ngx_log_error(NGX_LOG_EMERG, c->log, 0, - "too big OpenSSL QUIC secret"); - return; - } - - secret[n] = (value << 4); - } - } - - qc = ngx_quic_get_connection(c); - com = qc->compat; - cipher = SSL_get_current_cipher(ssl); - - if (write) { - com->method->set_write_secret((SSL *) ssl, level, cipher, secret, n); - com->write_level = level; - - } else { - com->method->set_read_secret((SSL *) ssl, level, cipher, secret, n); - com->read_record = 0; - - if (ngx_quic_compat_set_encryption_secret(c, &com->keys, level, - cipher, secret, n) - != NGX_OK) - { - qc->error = NGX_QUIC_ERR_INTERNAL_ERROR; - } - } - - ngx_explicit_memzero(secret, n); -} - - -static ngx_int_t -ngx_quic_compat_set_encryption_secret(ngx_connection_t *c, - ngx_quic_compat_keys_t *keys, enum ssl_encryption_level_t level, - const SSL_CIPHER *cipher, const uint8_t *secret, size_t secret_len) -{ - ngx_int_t key_len; - ngx_str_t secret_str; - ngx_uint_t i; - ngx_quic_md_t key; - ngx_quic_hkdf_t seq[2]; - ngx_quic_secret_t *peer_secret; - ngx_quic_ciphers_t ciphers; - ngx_pool_cleanup_t *cln; - - peer_secret = &keys->secret; - - keys->cipher = SSL_CIPHER_get_id(cipher); - - key_len = ngx_quic_ciphers(keys->cipher, &ciphers); - - if (key_len == NGX_ERROR) { - ngx_ssl_error(NGX_LOG_INFO, c->log, 0, "unexpected cipher"); - return NGX_ERROR; - } - - key.len = key_len; - - peer_secret->iv.len = NGX_QUIC_IV_LEN; - - secret_str.len = secret_len; - secret_str.data = (u_char *) secret; - - ngx_quic_hkdf_set(&seq[0], "tls13 key", &key, &secret_str); - ngx_quic_hkdf_set(&seq[1], "tls13 iv", &peer_secret->iv, &secret_str); - - for (i = 0; i < (sizeof(seq) / sizeof(seq[0])); i++) { - if (ngx_quic_hkdf_expand(&seq[i], ciphers.d, c->log) != NGX_OK) { - return NGX_ERROR; - } - } - - /* register cleanup handler once */ - - if (peer_secret->ctx) { - ngx_quic_crypto_cleanup(peer_secret); - - } else { - cln = ngx_pool_cleanup_add(c->pool, 0); - if (cln == NULL) { - return NGX_ERROR; - } - - cln->handler = ngx_quic_compat_cleanup_encryption_secret; - cln->data = peer_secret; - } - - if (ngx_quic_crypto_init(ciphers.c, peer_secret, &key, 1, c->log) - == NGX_ERROR) - { - return NGX_ERROR; - } - - ngx_explicit_memzero(key.data, key.len); - - return NGX_OK; -} - - -static void -ngx_quic_compat_cleanup_encryption_secret(void *data) -{ - ngx_quic_secret_t *secret = data; - - ngx_quic_crypto_cleanup(secret); -} - - -static int -ngx_quic_compat_add_transport_params_callback(SSL *ssl, unsigned int ext_type, - unsigned int context, const unsigned char **out, size_t *outlen, X509 *x, - size_t chainidx, int *al, void *add_arg) -{ - ngx_connection_t *c; - ngx_quic_compat_t *com; - ngx_quic_connection_t *qc; - - c = ngx_ssl_get_connection(ssl); - if (c->type != SOCK_DGRAM) { - return 0; - } - - ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0, - "quic compat add transport params"); - - qc = ngx_quic_get_connection(c); - com = qc->compat; - - *out = com->tp.data; - *outlen = com->tp.len; - - return 1; -} - - -static int -ngx_quic_compat_parse_transport_params_callback(SSL *ssl, unsigned int ext_type, - unsigned int context, const unsigned char *in, size_t inlen, X509 *x, - size_t chainidx, int *al, void *parse_arg) -{ - u_char *p; - ngx_connection_t *c; - ngx_quic_compat_t *com; - ngx_quic_connection_t *qc; - - c = ngx_ssl_get_connection(ssl); - if (c->type != SOCK_DGRAM) { - return 0; - } - - ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0, - "quic compat parse transport params"); - - qc = ngx_quic_get_connection(c); - com = qc->compat; - - p = ngx_pnalloc(c->pool, inlen); - if (p == NULL) { - return 0; - } - - ngx_memcpy(p, in, inlen); - - com->ctp.data = p; - com->ctp.len = inlen; - - return 1; -} - - -int -SSL_set_quic_method(SSL *ssl, const SSL_QUIC_METHOD *quic_method) -{ - BIO *rbio, *wbio; - ngx_connection_t *c; - ngx_quic_compat_t *com; - ngx_quic_connection_t *qc; - - c = ngx_ssl_get_connection(ssl); - - ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0, "quic compat set method"); - - qc = ngx_quic_get_connection(c); - - qc->compat = ngx_pcalloc(c->pool, sizeof(ngx_quic_compat_t)); - if (qc->compat == NULL) { - return 0; - } - - com = qc->compat; - com->method = quic_method; - - rbio = BIO_new(BIO_s_mem()); - if (rbio == NULL) { - return 0; - } - - wbio = BIO_new(BIO_s_null()); - if (wbio == NULL) { - BIO_free(rbio); - return 0; - } - - SSL_set_bio(ssl, rbio, wbio); - - SSL_set_msg_callback(ssl, ngx_quic_compat_message_callback); - - /* early data is not supported */ - SSL_set_max_early_data(ssl, 0); - - return 1; -} - - -static void -ngx_quic_compat_message_callback(int write_p, int version, int content_type, - const void *buf, size_t len, SSL *ssl, void *arg) -{ - ngx_uint_t alert; - ngx_connection_t *c; - ngx_quic_compat_t *com; - ngx_quic_connection_t *qc; - enum ssl_encryption_level_t level; - - if (!write_p) { - return; - } - - c = ngx_ssl_get_connection(ssl); - qc = ngx_quic_get_connection(c); - - if (qc == NULL) { - /* closing */ - return; - } - - com = qc->compat; - level = com->write_level; - - switch (content_type) { - - case SSL3_RT_HANDSHAKE: - ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0, - "quic compat tx level:%d len:%uz", level, len); - - if (com->method->add_handshake_data(ssl, level, buf, len) != 1) { - return; - } - - break; - - case SSL3_RT_ALERT: - if (len >= 2) { - alert = ((u_char *) buf)[1]; - - ngx_log_debug3(NGX_LOG_DEBUG_EVENT, c->log, 0, - "quic compat level:%d alert:%ui len:%uz", - level, alert, len); - - if (com->method->send_alert(ssl, level, alert) != 1) { - return; - } - } - - break; - } - - return; -} - - -int -SSL_provide_quic_data(SSL *ssl, enum ssl_encryption_level_t level, - const uint8_t *data, size_t len) -{ - BIO *rbio; - size_t n; - u_char *p; - ngx_str_t res; - ngx_connection_t *c; - ngx_quic_compat_t *com; - ngx_quic_connection_t *qc; - ngx_quic_compat_record_t rec; - u_char in[NGX_QUIC_COMPAT_RECORD_SIZE + 1]; - u_char out[NGX_QUIC_COMPAT_RECORD_SIZE + 1 - + SSL3_RT_HEADER_LENGTH - + NGX_QUIC_TAG_LEN]; - - c = ngx_ssl_get_connection(ssl); - - ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0, - "quic compat rx level:%d len:%uz", level, len); - - qc = ngx_quic_get_connection(c); - com = qc->compat; - rbio = SSL_get_rbio(ssl); - - while (len) { - ngx_memzero(&rec, sizeof(ngx_quic_compat_record_t)); - - rec.type = SSL3_RT_HANDSHAKE; - rec.log = c->log; - rec.number = com->read_record++; - rec.keys = &com->keys; - - if (level == ssl_encryption_initial) { - n = ngx_min(len, 65535); - - rec.payload.len = n; - rec.payload.data = (u_char *) data; - - ngx_quic_compat_create_header(&rec, out, 1); - - BIO_write(rbio, out, SSL3_RT_HEADER_LENGTH); - BIO_write(rbio, data, n); - -#if defined(NGX_QUIC_DEBUG_CRYPTO) && defined(NGX_QUIC_DEBUG_PACKETS) - ngx_log_debug5(NGX_LOG_DEBUG_EVENT, c->log, 0, - "quic compat record len:%uz %*xs%*xs", - n + SSL3_RT_HEADER_LENGTH, - (size_t) SSL3_RT_HEADER_LENGTH, out, n, data); -#endif - - } else { - n = ngx_min(len, NGX_QUIC_COMPAT_RECORD_SIZE); - - p = ngx_cpymem(in, data, n); - *p++ = SSL3_RT_HANDSHAKE; - - rec.payload.len = p - in; - rec.payload.data = in; - - res.data = out; - - if (ngx_quic_compat_create_record(&rec, &res) != NGX_OK) { - return 0; - } - -#if defined(NGX_QUIC_DEBUG_CRYPTO) && defined(NGX_QUIC_DEBUG_PACKETS) - ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0, - "quic compat record len:%uz %xV", res.len, &res); -#endif - - BIO_write(rbio, res.data, res.len); - } - - data += n; - len -= n; - } - - return 1; -} - - -static size_t -ngx_quic_compat_create_header(ngx_quic_compat_record_t *rec, u_char *out, - ngx_uint_t plain) -{ - u_char type; - size_t len; - - len = rec->payload.len; - - if (plain) { - type = rec->type; - - } else { - type = SSL3_RT_APPLICATION_DATA; - len += NGX_QUIC_TAG_LEN; - } - - out[0] = type; - out[1] = 0x03; - out[2] = 0x03; - out[3] = (len >> 8); - out[4] = len; - - return 5; -} - - -static ngx_int_t -ngx_quic_compat_create_record(ngx_quic_compat_record_t *rec, ngx_str_t *res) -{ - ngx_str_t ad, out; - ngx_quic_secret_t *secret; - u_char nonce[NGX_QUIC_IV_LEN]; - - ad.data = res->data; - ad.len = ngx_quic_compat_create_header(rec, ad.data, 0); - - out.len = rec->payload.len + NGX_QUIC_TAG_LEN; - out.data = res->data + ad.len; - -#ifdef NGX_QUIC_DEBUG_CRYPTO - ngx_log_debug2(NGX_LOG_DEBUG_EVENT, rec->log, 0, - "quic compat ad len:%uz %xV", ad.len, &ad); -#endif - - secret = &rec->keys->secret; - - if (secret->ctx == NULL) { - return NGX_ERROR; - } - - ngx_memcpy(nonce, secret->iv.data, secret->iv.len); - ngx_quic_compute_nonce(nonce, sizeof(nonce), rec->number); - - if (ngx_quic_crypto_seal(secret, &out, nonce, &rec->payload, &ad, rec->log) - != NGX_OK) - { - return NGX_ERROR; - } - - res->len = ad.len + out.len; - - return NGX_OK; -} - - -int -SSL_set_quic_transport_params(SSL *ssl, const uint8_t *params, - size_t params_len) -{ - ngx_connection_t *c; - ngx_quic_compat_t *com; - ngx_quic_connection_t *qc; - - c = ngx_ssl_get_connection(ssl); - qc = ngx_quic_get_connection(c); - com = qc->compat; - - com->tp.len = params_len; - com->tp.data = (u_char *) params; - - return 1; -} - - -void -SSL_get_peer_quic_transport_params(const SSL *ssl, const uint8_t **out_params, - size_t *out_params_len) -{ - ngx_connection_t *c; - ngx_quic_compat_t *com; - ngx_quic_connection_t *qc; - - c = ngx_ssl_get_connection(ssl); - qc = ngx_quic_get_connection(c); - com = qc->compat; - - *out_params = com->ctp.data; - *out_params_len = com->ctp.len; -} - -#endif /* NGX_QUIC_OPENSSL_COMPAT */ diff --git a/src/deps/src/nginx-1.30.3/src/event/quic/ngx_event_quic_openssl_compat.h b/src/deps/src/nginx-1.30.3/src/event/quic/ngx_event_quic_openssl_compat.h deleted file mode 100644 index 89ee41e898..0000000000 --- a/src/deps/src/nginx-1.30.3/src/event/quic/ngx_event_quic_openssl_compat.h +++ /dev/null @@ -1,51 +0,0 @@ - -/* - * Copyright (C) Nginx, Inc. - */ - - -#ifndef _NGX_EVENT_QUIC_OPENSSL_COMPAT_H_INCLUDED_ -#define _NGX_EVENT_QUIC_OPENSSL_COMPAT_H_INCLUDED_ - - -#include -#include - - -typedef struct ngx_quic_compat_s ngx_quic_compat_t; - - -enum ssl_encryption_level_t { - ssl_encryption_initial = 0, - ssl_encryption_early_data, - ssl_encryption_handshake, - ssl_encryption_application -}; - - -typedef struct ssl_quic_method_st { - int (*set_read_secret)(SSL *ssl, enum ssl_encryption_level_t level, - const SSL_CIPHER *cipher, - const uint8_t *rsecret, size_t secret_len); - int (*set_write_secret)(SSL *ssl, enum ssl_encryption_level_t level, - const SSL_CIPHER *cipher, - const uint8_t *wsecret, size_t secret_len); - int (*add_handshake_data)(SSL *ssl, enum ssl_encryption_level_t level, - const uint8_t *data, size_t len); - int (*flush_flight)(SSL *ssl); - int (*send_alert)(SSL *ssl, enum ssl_encryption_level_t level, - uint8_t alert); -} SSL_QUIC_METHOD; - - -ngx_int_t ngx_quic_compat_init(ngx_conf_t *cf, SSL_CTX *ctx); - -int SSL_set_quic_method(SSL *ssl, const SSL_QUIC_METHOD *quic_method); -int SSL_provide_quic_data(SSL *ssl, enum ssl_encryption_level_t level, - const uint8_t *data, size_t len); -int SSL_set_quic_transport_params(SSL *ssl, const uint8_t *params, - size_t params_len); -void SSL_get_peer_quic_transport_params(const SSL *ssl, - const uint8_t **out_params, size_t *out_params_len); - -#endif /* _NGX_EVENT_QUIC_OPENSSL_COMPAT_H_INCLUDED_ */ diff --git a/src/deps/src/nginx-1.30.3/src/event/quic/ngx_event_quic_output.c b/src/deps/src/nginx-1.30.3/src/event/quic/ngx_event_quic_output.c deleted file mode 100644 index f98c834a19..0000000000 --- a/src/deps/src/nginx-1.30.3/src/event/quic/ngx_event_quic_output.c +++ /dev/null @@ -1,1406 +0,0 @@ - -/* - * Copyright (C) Nginx, Inc. - */ - - -#include -#include -#include -#include - - -#define NGX_QUIC_MAX_UDP_SEGMENT_BUF 65487 /* 65K - IPv6 header */ -#define NGX_QUIC_MAX_SEGMENTS 64 /* UDP_MAX_SEGMENTS */ - -#define NGX_QUIC_RETRY_TOKEN_LIFETIME 3 /* seconds */ -#define NGX_QUIC_NEW_TOKEN_LIFETIME 600 /* seconds */ -#define NGX_QUIC_RETRY_BUFFER_SIZE 256 - /* 1 flags + 4 version + 3 x (1 + 20) s/o/dcid + itag + token(64) */ - -/* - * RFC 9000, 10.3. Stateless Reset - * - * Endpoints MUST discard packets that are too small to be valid QUIC - * packets. With the set of AEAD functions defined in [QUIC-TLS], - * short header packets that are smaller than 21 bytes are never valid. - */ -#define NGX_QUIC_MIN_PKT_LEN 41 /* 21 + 20 (server cid length) */ - -#define NGX_QUIC_MIN_SR_PACKET 43 /* 5 rand + 16 srt + 22 padding */ -#define NGX_QUIC_MAX_SR_PACKET 1200 - -#define NGX_QUIC_CC_MIN_INTERVAL 1000 /* 1s */ - -#define NGX_QUIC_SOCKET_RETRY_DELAY 10 /* ms, for NGX_AGAIN on write */ - - -#define ngx_quic_log_packet(log, pkt) \ - ngx_log_debug6(NGX_LOG_DEBUG_EVENT, log, 0, \ - "quic packet tx %s bytes:%ui need_ack:%d" \ - " number:%L encoded nl:%d trunc:0x%xD", \ - ngx_quic_level_name((pkt)->level), (pkt)->payload.len, \ - (pkt)->need_ack, (pkt)->number, (pkt)->num_len, \ - (pkt)->trunc); - - -static ngx_int_t ngx_quic_create_datagrams(ngx_connection_t *c); -static void ngx_quic_commit_send(ngx_connection_t *c); -static void ngx_quic_revert_send(ngx_connection_t *c, - uint64_t preserved_pnum[NGX_QUIC_SEND_CTX_LAST]); -#if ((NGX_HAVE_UDP_SEGMENT) && (NGX_HAVE_MSGHDR_MSG_CONTROL)) -static ngx_uint_t ngx_quic_allow_segmentation(ngx_connection_t *c); -static ngx_int_t ngx_quic_create_segments(ngx_connection_t *c); -static ssize_t ngx_quic_send_segments(ngx_connection_t *c, u_char *buf, - size_t len, struct sockaddr *sockaddr, socklen_t socklen, size_t segment); -#endif -static ssize_t ngx_quic_output_packet(ngx_connection_t *c, - ngx_quic_send_ctx_t *ctx, u_char *data, size_t max, size_t min, - ngx_uint_t ack_only); -static void ngx_quic_init_packet(ngx_connection_t *c, ngx_quic_send_ctx_t *ctx, - ngx_quic_header_t *pkt, ngx_quic_path_t *path); -static ngx_uint_t ngx_quic_get_padding_level(ngx_connection_t *c); -static ssize_t ngx_quic_send(ngx_connection_t *c, u_char *buf, size_t len, - struct sockaddr *sockaddr, socklen_t socklen); -static void ngx_quic_set_packet_number(ngx_quic_header_t *pkt, - ngx_quic_send_ctx_t *ctx); -static ngx_int_t ngx_quic_stateless_reset_filter(ngx_connection_t *c); - - -ngx_int_t -ngx_quic_output(ngx_connection_t *c) -{ - size_t in_flight; - ngx_int_t rc; - ngx_quic_congestion_t *cg; - ngx_quic_connection_t *qc; - - c->log->action = "sending frames"; - - qc = ngx_quic_get_connection(c); - cg = &qc->congestion; - - in_flight = cg->in_flight; - -#if ((NGX_HAVE_UDP_SEGMENT) && (NGX_HAVE_MSGHDR_MSG_CONTROL)) - if (ngx_quic_allow_segmentation(c)) { - rc = ngx_quic_create_segments(c); - } else -#endif - { - rc = ngx_quic_create_datagrams(c); - } - - if (rc != NGX_OK) { - return NGX_ERROR; - } - - if (in_flight == cg->in_flight || qc->closing) { - /* no ack-eliciting data was sent or we are done */ - return NGX_OK; - } - - if (!qc->send_timer_set) { - qc->send_timer_set = 1; - ngx_add_timer(c->read, qc->tp.max_idle_timeout); - } - - ngx_quic_set_lost_timer(c); - - return NGX_OK; -} - - -static ngx_int_t -ngx_quic_create_datagrams(ngx_connection_t *c) -{ - size_t len, min; - ssize_t n; - u_char *p; - uint64_t preserved_pnum[NGX_QUIC_SEND_CTX_LAST]; - ngx_uint_t i, pad; - ngx_quic_path_t *path; - ngx_quic_send_ctx_t *ctx; - ngx_quic_congestion_t *cg; - ngx_quic_connection_t *qc; - static u_char dst[NGX_QUIC_MAX_UDP_PAYLOAD_SIZE]; - - qc = ngx_quic_get_connection(c); - cg = &qc->congestion; - path = qc->path; - -#if (NGX_SUPPRESS_WARN) - ngx_memzero(preserved_pnum, sizeof(preserved_pnum)); -#endif - - do { - p = dst; - - len = ngx_quic_path_limit(c, path, path->mtu); - - pad = ngx_quic_get_padding_level(c); - - for (i = 0; i < NGX_QUIC_SEND_CTX_LAST; i++) { - - ctx = &qc->send_ctx[i]; - - preserved_pnum[i] = ctx->pnum; - - if (ngx_quic_generate_ack(c, ctx) != NGX_OK) { - return NGX_ERROR; - } - - min = (i == pad && p - dst < NGX_QUIC_MIN_INITIAL_SIZE) - ? NGX_QUIC_MIN_INITIAL_SIZE - (p - dst) : 0; - - if (min > len) { - /* padding can't be applied - avoid sending the packet */ - ngx_quic_revert_send(c, preserved_pnum); - return NGX_OK; - } - - n = ngx_quic_output_packet(c, ctx, p, len, min, - cg->in_flight >= cg->window); - if (n == NGX_ERROR) { - return NGX_ERROR; - } - - p += n; - len -= n; - } - - len = p - dst; - if (len == 0) { - break; - } - - n = ngx_quic_send(c, dst, len, path->sockaddr, path->socklen); - - if (n == NGX_ERROR) { - return NGX_ERROR; - } - - if (n == NGX_AGAIN) { - ngx_quic_revert_send(c, preserved_pnum); - ngx_add_timer(&qc->push, NGX_QUIC_SOCKET_RETRY_DELAY); - break; - } - - ngx_quic_commit_send(c); - - path->sent += len; - - } while (cg->in_flight < cg->window); - - return NGX_OK; -} - - -static void -ngx_quic_commit_send(ngx_connection_t *c) -{ - ngx_uint_t i, idle; - ngx_queue_t *q; - ngx_quic_frame_t *f; - ngx_quic_send_ctx_t *ctx; - ngx_quic_congestion_t *cg; - ngx_quic_connection_t *qc; - - qc = ngx_quic_get_connection(c); - cg = &qc->congestion; - - idle = 1; - - for (i = 0; i < NGX_QUIC_SEND_CTX_LAST; i++) { - ctx = &qc->send_ctx[i]; - - if (!ngx_queue_empty(&ctx->frames)) { - idle = 0; - } - - while (!ngx_queue_empty(&ctx->sending)) { - - q = ngx_queue_head(&ctx->sending); - f = ngx_queue_data(q, ngx_quic_frame_t, queue); - - ngx_queue_remove(q); - - if (f->pkt_need_ack && !qc->closing) { - ngx_queue_insert_tail(&ctx->sent, q); - - cg->in_flight += f->plen; - - } else { - ngx_quic_free_frame(c, f); - } - } - } - - ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, - "quic congestion send if:%uz", cg->in_flight); - - ngx_quic_congestion_idle(c, idle); -} - - -static void -ngx_quic_revert_send(ngx_connection_t *c, uint64_t pnum[NGX_QUIC_SEND_CTX_LAST]) -{ - ngx_uint_t i; - ngx_queue_t *q; - ngx_quic_send_ctx_t *ctx; - ngx_quic_connection_t *qc; - - qc = ngx_quic_get_connection(c); - - for (i = 0; i < NGX_QUIC_SEND_CTX_LAST; i++) { - ctx = &qc->send_ctx[i]; - - if (ngx_queue_empty(&ctx->sending)) { - continue; - } - - do { - q = ngx_queue_last(&ctx->sending); - ngx_queue_remove(q); - ngx_queue_insert_head(&ctx->frames, q); - } while (!ngx_queue_empty(&ctx->sending)); - - ctx->pnum = pnum[i]; - } - - ngx_quic_congestion_idle(c, 1); -} - - -#if ((NGX_HAVE_UDP_SEGMENT) && (NGX_HAVE_MSGHDR_MSG_CONTROL)) - -static ngx_uint_t -ngx_quic_allow_segmentation(ngx_connection_t *c) -{ - size_t bytes, len; - ngx_queue_t *q; - ngx_quic_frame_t *f; - ngx_quic_send_ctx_t *ctx; - ngx_quic_connection_t *qc; - - qc = ngx_quic_get_connection(c); - - if (!qc->conf->gso_enabled) { - return 0; - } - - if (!qc->path->validated) { - /* don't even try to be faster on non-validated paths */ - return 0; - } - - ctx = ngx_quic_get_send_ctx(qc, NGX_QUIC_ENCRYPTION_INITIAL); - if (!ngx_queue_empty(&ctx->frames)) { - return 0; - } - - ctx = ngx_quic_get_send_ctx(qc, NGX_QUIC_ENCRYPTION_HANDSHAKE); - if (!ngx_queue_empty(&ctx->frames)) { - return 0; - } - - ctx = ngx_quic_get_send_ctx(qc, NGX_QUIC_ENCRYPTION_APPLICATION); - - bytes = 0; - len = ngx_min(qc->path->mtu, NGX_QUIC_MAX_UDP_SEGMENT_BUF); - - for (q = ngx_queue_head(&ctx->frames); - q != ngx_queue_sentinel(&ctx->frames); - q = ngx_queue_next(q)) - { - f = ngx_queue_data(q, ngx_quic_frame_t, queue); - - bytes += f->len; - - if (qc->congestion.in_flight + bytes >= qc->congestion.window) { - return 0; - } - - if (bytes > len * 3) { - /* require at least ~3 full packets to batch */ - return 1; - } - } - - return 0; -} - - -static ngx_int_t -ngx_quic_create_segments(ngx_connection_t *c) -{ - size_t len, segsize; - ssize_t n; - u_char *p, *end; - ngx_uint_t nseg, level; - ngx_quic_path_t *path; - ngx_quic_send_ctx_t *ctx; - ngx_quic_congestion_t *cg; - ngx_quic_connection_t *qc; - static u_char dst[NGX_QUIC_MAX_UDP_SEGMENT_BUF]; - static uint64_t preserved_pnum[NGX_QUIC_SEND_CTX_LAST]; - - qc = ngx_quic_get_connection(c); - cg = &qc->congestion; - path = qc->path; - - ctx = ngx_quic_get_send_ctx(qc, NGX_QUIC_ENCRYPTION_APPLICATION); - - if (ngx_quic_generate_ack(c, ctx) != NGX_OK) { - return NGX_ERROR; - } - - segsize = ngx_min(path->mtu, NGX_QUIC_MAX_UDP_SEGMENT_BUF); - p = dst; - end = dst + sizeof(dst); - - nseg = 0; - - level = ctx - qc->send_ctx; - preserved_pnum[level] = ctx->pnum; - - for ( ;; ) { - - len = ngx_min(segsize, (size_t) (end - p)); - - if (len && cg->in_flight + (p - dst) < cg->window) { - - n = ngx_quic_output_packet(c, ctx, p, len, len, 0); - if (n == NGX_ERROR) { - return NGX_ERROR; - } - - if (n) { - p += n; - nseg++; - } - - } else { - n = 0; - } - - if (p == dst) { - break; - } - - if (n == 0 || nseg == NGX_QUIC_MAX_SEGMENTS) { - n = ngx_quic_send_segments(c, dst, p - dst, path->sockaddr, - path->socklen, segsize); - if (n == NGX_ERROR) { - return NGX_ERROR; - } - - if (n == NGX_AGAIN) { - ngx_quic_revert_send(c, preserved_pnum); - ngx_add_timer(&qc->push, NGX_QUIC_SOCKET_RETRY_DELAY); - break; - } - - ngx_quic_commit_send(c); - - path->sent += n; - - p = dst; - nseg = 0; - preserved_pnum[level] = ctx->pnum; - } - } - - return NGX_OK; -} - - -static ssize_t -ngx_quic_send_segments(ngx_connection_t *c, u_char *buf, size_t len, - struct sockaddr *sockaddr, socklen_t socklen, size_t segment) -{ - size_t clen; - ssize_t n; - uint16_t *valp; - struct iovec iov; - struct msghdr msg; - struct cmsghdr *cmsg; - -#if (NGX_HAVE_ADDRINFO_CMSG) - char msg_control[CMSG_SPACE(sizeof(uint16_t)) - + CMSG_SPACE(sizeof(ngx_addrinfo_t))]; -#else - char msg_control[CMSG_SPACE(sizeof(uint16_t))]; -#endif - - ngx_memzero(&msg, sizeof(struct msghdr)); - ngx_memzero(msg_control, sizeof(msg_control)); - - iov.iov_len = len; - iov.iov_base = (void *) buf; - - msg.msg_iov = &iov; - msg.msg_iovlen = 1; - - msg.msg_name = sockaddr; - msg.msg_namelen = socklen; - - msg.msg_control = msg_control; - msg.msg_controllen = sizeof(msg_control); - - cmsg = CMSG_FIRSTHDR(&msg); - - cmsg->cmsg_level = SOL_UDP; - cmsg->cmsg_type = UDP_SEGMENT; - cmsg->cmsg_len = CMSG_LEN(sizeof(uint16_t)); - - clen = CMSG_SPACE(sizeof(uint16_t)); - - valp = (void *) CMSG_DATA(cmsg); - *valp = segment; - -#if (NGX_HAVE_ADDRINFO_CMSG) - if (c->listening && c->listening->wildcard && c->local_sockaddr) { - cmsg = CMSG_NXTHDR(&msg, cmsg); - clen += ngx_set_srcaddr_cmsg(cmsg, c->local_sockaddr); - } -#endif - - msg.msg_controllen = clen; - - n = ngx_sendmsg(c, &msg, 0); - if (n < 0) { - return n; - } - - c->sent += n; - - return n; -} - -#endif - - - -static ngx_uint_t -ngx_quic_get_padding_level(ngx_connection_t *c) -{ - ngx_uint_t i; - ngx_queue_t *q; - ngx_quic_frame_t *f; - ngx_quic_send_ctx_t *ctx; - ngx_quic_connection_t *qc; - - /* - * RFC 9000, 14.1. Initial Datagram Size - * - * Similarly, a server MUST expand the payload of all UDP datagrams - * carrying ack-eliciting Initial packets to at least the smallest - * allowed maximum datagram size of 1200 bytes. - */ - - qc = ngx_quic_get_connection(c); - ctx = ngx_quic_get_send_ctx(qc, NGX_QUIC_ENCRYPTION_INITIAL); - - for (q = ngx_queue_head(&ctx->frames); - q != ngx_queue_sentinel(&ctx->frames); - q = ngx_queue_next(q)) - { - f = ngx_queue_data(q, ngx_quic_frame_t, queue); - - if (f->need_ack) { - for (i = 0; i + 1 < NGX_QUIC_SEND_CTX_LAST; i++) { - ctx = &qc->send_ctx[i + 1]; - - if (ngx_queue_empty(&ctx->frames)) { - break; - } - } - - return i; - } - } - - return NGX_QUIC_SEND_CTX_LAST; -} - - -static ssize_t -ngx_quic_output_packet(ngx_connection_t *c, ngx_quic_send_ctx_t *ctx, - u_char *data, size_t max, size_t min, ngx_uint_t ack_only) -{ - size_t len, pad, min_payload, max_payload; - u_char *p; - ssize_t flen; - ngx_str_t res; - ngx_int_t rc; - ngx_uint_t nframes; - ngx_msec_t now; - ngx_queue_t *q; - ngx_quic_frame_t *f; - ngx_quic_header_t pkt; - ngx_quic_connection_t *qc; - static u_char src[NGX_QUIC_MAX_UDP_PAYLOAD_SIZE]; - - if (ngx_queue_empty(&ctx->frames)) { - return 0; - } - - ngx_log_debug3(NGX_LOG_DEBUG_EVENT, c->log, 0, - "quic output %s packet max:%uz min:%uz", - ngx_quic_level_name(ctx->level), max, min); - - qc = ngx_quic_get_connection(c); - - if (!ngx_quic_keys_available(qc->keys, ctx->level, 1)) { - ngx_log_error(NGX_LOG_ALERT, c->log, 0, "quic %s write keys discarded", - ngx_quic_level_name(ctx->level)); - - while (!ngx_queue_empty(&ctx->frames)) { - q = ngx_queue_head(&ctx->frames); - ngx_queue_remove(q); - - f = ngx_queue_data(q, ngx_quic_frame_t, queue); - ngx_quic_free_frame(c, f); - } - - return 0; - } - - ngx_quic_init_packet(c, ctx, &pkt, qc->path); - - min_payload = ngx_quic_payload_size(&pkt, min); - max_payload = ngx_quic_payload_size(&pkt, max); - - /* RFC 9001, 5.4.2. Header Protection Sample */ - pad = 4 - pkt.num_len; - min_payload = ngx_max(min_payload, pad); - - if (min_payload > max_payload) { - return 0; - } - - now = ngx_current_msec; - nframes = 0; - p = src; - len = 0; - - for (q = ngx_queue_head(&ctx->frames); - q != ngx_queue_sentinel(&ctx->frames); - q = ngx_queue_next(q)) - { - f = ngx_queue_data(q, ngx_quic_frame_t, queue); - - if (ack_only && f->type != NGX_QUIC_FT_ACK) { - break; - } - - if (len >= max_payload) { - break; - } - - if (len + f->len > max_payload) { - rc = ngx_quic_split_frame(c, f, max_payload - len); - - if (rc == NGX_ERROR) { - return NGX_ERROR; - } - - if (rc == NGX_DECLINED) { - break; - } - } - - if (f->need_ack) { - pkt.need_ack = 1; - } - - f->pnum = ctx->pnum; - f->send_time = now; - f->plen = 0; - - ngx_quic_log_frame(c->log, f, 1); - - flen = ngx_quic_create_frame(p, f); - if (flen == -1) { - return NGX_ERROR; - } - - len += flen; - p += flen; - - nframes++; - } - - if (nframes == 0) { - return 0; - } - - if (len < min_payload) { - ngx_memset(p, NGX_QUIC_FT_PADDING, min_payload - len); - len = min_payload; - } - - pkt.payload.data = src; - pkt.payload.len = len; - - res.data = data; - - ngx_quic_log_packet(c->log, &pkt); - - if (ngx_quic_encrypt(&pkt, &res) != NGX_OK) { - return NGX_ERROR; - } - - ctx->pnum++; - - if (pkt.need_ack) { - q = ngx_queue_head(&ctx->frames); - f = ngx_queue_data(q, ngx_quic_frame_t, queue); - - f->plen = res.len; - } - - while (nframes--) { - q = ngx_queue_head(&ctx->frames); - f = ngx_queue_data(q, ngx_quic_frame_t, queue); - - f->pkt_need_ack = pkt.need_ack; - - ngx_queue_remove(q); - ngx_queue_insert_tail(&ctx->sending, q); - } - - return res.len; -} - - -static void -ngx_quic_init_packet(ngx_connection_t *c, ngx_quic_send_ctx_t *ctx, - ngx_quic_header_t *pkt, ngx_quic_path_t *path) -{ - ngx_quic_connection_t *qc; - - qc = ngx_quic_get_connection(c); - - ngx_memzero(pkt, sizeof(ngx_quic_header_t)); - - pkt->flags = NGX_QUIC_PKT_FIXED_BIT; - - if (ctx->level == NGX_QUIC_ENCRYPTION_INITIAL) { - pkt->flags |= NGX_QUIC_PKT_LONG | NGX_QUIC_PKT_INITIAL; - - } else if (ctx->level == NGX_QUIC_ENCRYPTION_HANDSHAKE) { - pkt->flags |= NGX_QUIC_PKT_LONG | NGX_QUIC_PKT_HANDSHAKE; - - } else { - if (qc->key_phase) { - pkt->flags |= NGX_QUIC_PKT_KPHASE; - } - } - - pkt->dcid.data = path->cid->id; - pkt->dcid.len = path->cid->len; - - pkt->scid = qc->tp.initial_scid; - - pkt->version = qc->version; - pkt->log = c->log; - pkt->level = ctx->level; - - pkt->keys = qc->keys; - - ngx_quic_set_packet_number(pkt, ctx); -} - - -static ssize_t -ngx_quic_send(ngx_connection_t *c, u_char *buf, size_t len, - struct sockaddr *sockaddr, socklen_t socklen) -{ - ssize_t n; - struct iovec iov; - struct msghdr msg; -#if (NGX_HAVE_ADDRINFO_CMSG) - struct cmsghdr *cmsg; - char msg_control[CMSG_SPACE(sizeof(ngx_addrinfo_t))]; -#endif - - ngx_memzero(&msg, sizeof(struct msghdr)); - - iov.iov_len = len; - iov.iov_base = (void *) buf; - - msg.msg_iov = &iov; - msg.msg_iovlen = 1; - - msg.msg_name = sockaddr; - msg.msg_namelen = socklen; - -#if (NGX_HAVE_ADDRINFO_CMSG) - if (c->listening && c->listening->wildcard && c->local_sockaddr) { - - msg.msg_control = msg_control; - msg.msg_controllen = sizeof(msg_control); - ngx_memzero(msg_control, sizeof(msg_control)); - - cmsg = CMSG_FIRSTHDR(&msg); - - msg.msg_controllen = ngx_set_srcaddr_cmsg(cmsg, c->local_sockaddr); - } -#endif - - n = ngx_sendmsg(c, &msg, 0); - if (n < 0) { - return n; - } - - c->sent += n; - - return n; -} - - -static void -ngx_quic_set_packet_number(ngx_quic_header_t *pkt, ngx_quic_send_ctx_t *ctx) -{ - uint64_t delta; - - delta = ctx->pnum - ctx->largest_ack; - pkt->number = ctx->pnum; - - if (delta <= 0x7F) { - pkt->num_len = 1; - pkt->trunc = ctx->pnum & 0xff; - - } else if (delta <= 0x7FFF) { - pkt->num_len = 2; - pkt->flags |= 0x1; - pkt->trunc = ctx->pnum & 0xffff; - - } else if (delta <= 0x7FFFFF) { - pkt->num_len = 3; - pkt->flags |= 0x2; - pkt->trunc = ctx->pnum & 0xffffff; - - } else { - pkt->num_len = 4; - pkt->flags |= 0x3; - pkt->trunc = ctx->pnum & 0xffffffff; - } -} - - -ngx_int_t -ngx_quic_negotiate_version(ngx_connection_t *c, ngx_quic_header_t *inpkt) -{ - size_t len; - ngx_quic_header_t pkt; - static u_char buf[NGX_QUIC_MAX_UDP_PAYLOAD_SIZE]; - - ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0, - "sending version negotiation packet"); - - pkt.log = c->log; - pkt.flags = NGX_QUIC_PKT_LONG | NGX_QUIC_PKT_FIXED_BIT; - pkt.dcid = inpkt->scid; - pkt.scid = inpkt->dcid; - - len = ngx_quic_create_version_negotiation(&pkt, buf); - -#ifdef NGX_QUIC_DEBUG_PACKETS - ngx_log_debug3(NGX_LOG_DEBUG_EVENT, c->log, 0, - "quic vnego packet to send len:%uz %*xs", len, len, buf); -#endif - - (void) ngx_quic_send(c, buf, len, c->sockaddr, c->socklen); - - return NGX_DONE; -} - - -ngx_int_t -ngx_quic_send_stateless_reset(ngx_connection_t *c, ngx_quic_conf_t *conf, - ngx_quic_header_t *pkt) -{ - u_char *token; - size_t len, max; - uint16_t rndbytes; - ngx_int_t rc; - u_char buf[NGX_QUIC_MAX_SR_PACKET]; - - ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0, - "quic handle stateless reset output"); - - if (pkt->len <= NGX_QUIC_MIN_PKT_LEN) { - return NGX_DECLINED; - } - - rc = ngx_quic_stateless_reset_filter(c); - if (rc != NGX_OK) { - return rc; - } - - if (pkt->len <= NGX_QUIC_MIN_SR_PACKET) { - len = pkt->len - 1; - - } else { - max = ngx_min(NGX_QUIC_MAX_SR_PACKET, pkt->len); - - if (RAND_bytes((u_char *) &rndbytes, sizeof(rndbytes)) != 1) { - return NGX_ERROR; - } - - len = (rndbytes % (max - NGX_QUIC_MIN_SR_PACKET)) - + NGX_QUIC_MIN_SR_PACKET; - } - - if (RAND_bytes(buf, len - NGX_QUIC_SR_TOKEN_LEN) != 1) { - return NGX_ERROR; - } - - buf[0] &= ~NGX_QUIC_PKT_LONG; - buf[0] |= NGX_QUIC_PKT_FIXED_BIT; - - token = &buf[len - NGX_QUIC_SR_TOKEN_LEN]; - - if (ngx_quic_new_sr_token(c, &pkt->dcid, conf->sr_token_key, token) - != NGX_OK) - { - return NGX_ERROR; - } - - (void) ngx_quic_send(c, buf, len, c->sockaddr, c->socklen); - - return NGX_DECLINED; -} - - -static ngx_int_t -ngx_quic_stateless_reset_filter(ngx_connection_t *c) -{ - time_t now; - u_char salt; - ngx_uint_t i, n, m, hit; - u_char hash[20]; - - static time_t t; - static u_char rndbyte; - static uint8_t bitmap[65536]; - - now = ngx_time(); - - if (t != now) { - t = now; - - if (RAND_bytes(&rndbyte, 1) != 1) { - return NGX_ERROR; - } - - ngx_memzero(bitmap, sizeof(bitmap)); - } - - hit = 0; - - for (i = 0; i < 3; i++) { - salt = rndbyte + i; - - ngx_quic_address_hash(c->sockaddr, c->socklen, 0, &salt, 1, hash); - - n = hash[0] | hash[1] << 8; - m = 1 << hash[2] % 8; - - if (!(bitmap[n] & m)) { - bitmap[n] |= m; - - } else { - hit++; - } - } - - if (hit == 3) { - return NGX_DECLINED; - } - - return NGX_OK; -} - - -ngx_int_t -ngx_quic_send_cc(ngx_connection_t *c) -{ - ngx_quic_frame_t *frame; - ngx_quic_connection_t *qc; - - qc = ngx_quic_get_connection(c); - - if (qc->draining) { - return NGX_OK; - } - - if (qc->closing - && ngx_current_msec - qc->last_cc < NGX_QUIC_CC_MIN_INTERVAL) - { - /* dot not send CC too often */ - return NGX_OK; - } - - frame = ngx_quic_alloc_frame(c); - if (frame == NULL) { - return NGX_ERROR; - } - - frame->level = qc->error_level; - frame->type = qc->error_app ? NGX_QUIC_FT_CONNECTION_CLOSE_APP - : NGX_QUIC_FT_CONNECTION_CLOSE; - frame->u.close.error_code = qc->error; - frame->u.close.frame_type = qc->error_ftype; - - if (qc->error_reason) { - frame->u.close.reason.len = ngx_strlen(qc->error_reason); - frame->u.close.reason.data = (u_char *) qc->error_reason; - } - - frame->ignore_congestion = 1; - - qc->last_cc = ngx_current_msec; - - return ngx_quic_frame_sendto(c, frame, 0, qc->path); -} - - -ngx_int_t -ngx_quic_send_early_cc(ngx_connection_t *c, ngx_quic_header_t *inpkt, - ngx_uint_t err, const char *reason) -{ - ssize_t len; - ngx_str_t res; - ngx_quic_keys_t keys; - ngx_quic_frame_t frame; - ngx_quic_header_t pkt; - - static u_char src[NGX_QUIC_MAX_UDP_PAYLOAD_SIZE]; - static u_char dst[NGX_QUIC_MAX_UDP_PAYLOAD_SIZE]; - - ngx_memzero(&frame, sizeof(ngx_quic_frame_t)); - ngx_memzero(&pkt, sizeof(ngx_quic_header_t)); - - frame.level = inpkt->level; - frame.type = NGX_QUIC_FT_CONNECTION_CLOSE; - frame.u.close.error_code = err; - - frame.u.close.reason.data = (u_char *) reason; - frame.u.close.reason.len = ngx_strlen(reason); - - ngx_quic_log_frame(c->log, &frame, 1); - - len = ngx_quic_create_frame(NULL, &frame); - if (len > NGX_QUIC_MAX_UDP_PAYLOAD_SIZE) { - return NGX_ERROR; - } - - len = ngx_quic_create_frame(src, &frame); - if (len == -1) { - return NGX_ERROR; - } - - ngx_memzero(&keys, sizeof(ngx_quic_keys_t)); - - pkt.keys = &keys; - - if (ngx_quic_keys_set_initial_secret(pkt.keys, &inpkt->dcid, c->log) - != NGX_OK) - { - return NGX_ERROR; - } - - pkt.flags = NGX_QUIC_PKT_FIXED_BIT | NGX_QUIC_PKT_LONG - | NGX_QUIC_PKT_INITIAL; - - pkt.num_len = 1; - /* - * pkt.num = 0; - * pkt.trunc = 0; - */ - - pkt.version = inpkt->version; - pkt.log = c->log; - pkt.level = inpkt->level; - pkt.dcid = inpkt->scid; - pkt.scid = inpkt->dcid; - pkt.payload.data = src; - pkt.payload.len = len; - - res.data = dst; - - ngx_quic_log_packet(c->log, &pkt); - - if (ngx_quic_encrypt(&pkt, &res) != NGX_OK) { - ngx_quic_keys_cleanup(pkt.keys); - return NGX_ERROR; - } - - if (ngx_quic_send(c, res.data, res.len, c->sockaddr, c->socklen) < 0) { - ngx_quic_keys_cleanup(pkt.keys); - return NGX_ERROR; - } - - ngx_quic_keys_cleanup(pkt.keys); - - return NGX_DONE; -} - - -ngx_int_t -ngx_quic_send_retry(ngx_connection_t *c, ngx_quic_conf_t *conf, - ngx_quic_header_t *inpkt) -{ - time_t expires; - ssize_t len; - ngx_str_t res, token; - ngx_quic_header_t pkt; - - u_char buf[NGX_QUIC_RETRY_BUFFER_SIZE]; - u_char dcid[NGX_QUIC_SERVER_CID_LEN]; - u_char tbuf[NGX_QUIC_TOKEN_BUF_SIZE]; - - expires = ngx_time() + NGX_QUIC_RETRY_TOKEN_LIFETIME; - - token.data = tbuf; - token.len = NGX_QUIC_TOKEN_BUF_SIZE; - - if (ngx_quic_new_token(c->log, c->sockaddr, c->socklen, conf->av_token_key, - &token, &inpkt->dcid, expires, 1) - != NGX_OK) - { - return NGX_ERROR; - } - - ngx_memzero(&pkt, sizeof(ngx_quic_header_t)); - pkt.flags = NGX_QUIC_PKT_FIXED_BIT | NGX_QUIC_PKT_LONG | NGX_QUIC_PKT_RETRY; - pkt.version = inpkt->version; - pkt.log = c->log; - - pkt.odcid = inpkt->dcid; - pkt.dcid = inpkt->scid; - - /* TODO: generate routable dcid */ - if (RAND_bytes(dcid, NGX_QUIC_SERVER_CID_LEN) != 1) { - return NGX_ERROR; - } - - pkt.scid.len = NGX_QUIC_SERVER_CID_LEN; - pkt.scid.data = dcid; - - pkt.token = token; - - res.data = buf; - - if (ngx_quic_encrypt(&pkt, &res) != NGX_OK) { - return NGX_ERROR; - } - -#ifdef NGX_QUIC_DEBUG_PACKETS - ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0, - "quic packet to send len:%uz %xV", res.len, &res); -#endif - - len = ngx_quic_send(c, res.data, res.len, c->sockaddr, c->socklen); - if (len < 0) { - return NGX_ERROR; - } - - ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, - "quic retry packet sent to %xV", &pkt.dcid); - - /* - * RFC 9000, 17.2.5.1. Sending a Retry Packet - * - * A server MUST NOT send more than one Retry - * packet in response to a single UDP datagram. - * NGX_DONE will stop quic_input() from processing further - */ - return NGX_DONE; -} - - -ngx_int_t -ngx_quic_send_new_token(ngx_connection_t *c, ngx_quic_path_t *path) -{ - time_t expires; - ngx_str_t token; - ngx_chain_t *out; - ngx_quic_frame_t *frame; - ngx_quic_connection_t *qc; - - u_char tbuf[NGX_QUIC_TOKEN_BUF_SIZE]; - - qc = ngx_quic_get_connection(c); - - expires = ngx_time() + NGX_QUIC_NEW_TOKEN_LIFETIME; - - token.data = tbuf; - token.len = NGX_QUIC_TOKEN_BUF_SIZE; - - if (ngx_quic_new_token(c->log, path->sockaddr, path->socklen, - qc->conf->av_token_key, &token, NULL, expires, 0) - != NGX_OK) - { - return NGX_ERROR; - } - - out = ngx_quic_copy_buffer(c, token.data, token.len); - if (out == NGX_CHAIN_ERROR) { - return NGX_ERROR; - } - - frame = ngx_quic_alloc_frame(c); - if (frame == NULL) { - return NGX_ERROR; - } - - frame->level = NGX_QUIC_ENCRYPTION_APPLICATION; - frame->type = NGX_QUIC_FT_NEW_TOKEN; - frame->data = out; - frame->u.token.length = token.len; - - ngx_quic_queue_frame(qc, frame); - - return NGX_OK; -} - - -ngx_int_t -ngx_quic_send_ack(ngx_connection_t *c, ngx_quic_send_ctx_t *ctx) -{ - size_t len, left; - uint64_t ack_delay; - ngx_buf_t *b; - ngx_uint_t i; - ngx_chain_t *cl, **ll; - ngx_quic_frame_t *frame; - ngx_quic_connection_t *qc; - - qc = ngx_quic_get_connection(c); - - ack_delay = ngx_current_msec - ctx->largest_received; - ack_delay *= 1000; - ack_delay >>= qc->tp.ack_delay_exponent; - - frame = ngx_quic_alloc_frame(c); - if (frame == NULL) { - return NGX_ERROR; - } - - ll = &frame->data; - b = NULL; - - for (i = 0; i < ctx->nranges; i++) { - len = ngx_quic_create_ack_range(NULL, ctx->ranges[i].gap, - ctx->ranges[i].range); - - left = b ? b->end - b->last : 0; - - if (left < len) { - cl = ngx_quic_alloc_chain(c); - if (cl == NULL) { - return NGX_ERROR; - } - - *ll = cl; - ll = &cl->next; - - b = cl->buf; - left = b->end - b->last; - - if (left < len) { - return NGX_ERROR; - } - } - - b->last += ngx_quic_create_ack_range(b->last, ctx->ranges[i].gap, - ctx->ranges[i].range); - - frame->u.ack.ranges_length += len; - } - - *ll = NULL; - - frame->level = ctx->level; - frame->type = NGX_QUIC_FT_ACK; - frame->u.ack.largest = ctx->largest_range; - frame->u.ack.delay = ack_delay; - frame->u.ack.range_count = ctx->nranges; - frame->u.ack.first_range = ctx->first_range; - frame->len = ngx_quic_create_frame(NULL, frame); - - ngx_queue_insert_head(&ctx->frames, &frame->queue); - - return NGX_OK; -} - - -ngx_int_t -ngx_quic_send_ack_range(ngx_connection_t *c, ngx_quic_send_ctx_t *ctx, - uint64_t smallest, uint64_t largest) -{ - ngx_quic_frame_t *frame; - ngx_quic_connection_t *qc; - - qc = ngx_quic_get_connection(c); - - frame = ngx_quic_alloc_frame(c); - if (frame == NULL) { - return NGX_ERROR; - } - - frame->level = ctx->level; - frame->type = NGX_QUIC_FT_ACK; - frame->u.ack.largest = largest; - frame->u.ack.delay = 0; - frame->u.ack.range_count = 0; - frame->u.ack.first_range = largest - smallest; - - ngx_quic_queue_frame(qc, frame); - - return NGX_OK; -} - - -ngx_int_t -ngx_quic_frame_sendto(ngx_connection_t *c, ngx_quic_frame_t *frame, - size_t min, ngx_quic_path_t *path) -{ - size_t max, max_payload, min_payload, pad; - ssize_t len, sent; - ngx_str_t res; - ngx_msec_t now; - ngx_quic_header_t pkt; - ngx_quic_send_ctx_t *ctx; - ngx_quic_congestion_t *cg; - ngx_quic_connection_t *qc; - - static u_char src[NGX_QUIC_MAX_UDP_PAYLOAD_SIZE]; - static u_char dst[NGX_QUIC_MAX_UDP_PAYLOAD_SIZE]; - - qc = ngx_quic_get_connection(c); - cg = &qc->congestion; - ctx = ngx_quic_get_send_ctx(qc, frame->level); - - now = ngx_current_msec; - - max = ngx_quic_path_limit(c, path, path->mtu); - - ngx_log_debug3(NGX_LOG_DEBUG_EVENT, c->log, 0, - "quic sendto %s packet max:%uz min:%uz", - ngx_quic_level_name(ctx->level), max, min); - - if (cg->in_flight >= cg->window && !frame->ignore_congestion) { - ngx_quic_free_frame(c, frame); - return NGX_AGAIN; - } - - ngx_quic_init_packet(c, ctx, &pkt, path); - - min_payload = ngx_quic_payload_size(&pkt, min); - max_payload = ngx_quic_payload_size(&pkt, max); - - /* RFC 9001, 5.4.2. Header Protection Sample */ - pad = 4 - pkt.num_len; - min_payload = ngx_max(min_payload, pad); - - if (min_payload > max_payload) { - ngx_quic_free_frame(c, frame); - return NGX_AGAIN; - } - -#if (NGX_DEBUG) - frame->pnum = pkt.number; -#endif - - ngx_quic_log_frame(c->log, frame, 1); - - len = ngx_quic_create_frame(NULL, frame); - if ((size_t) len > max_payload) { - ngx_quic_free_frame(c, frame); - return NGX_AGAIN; - } - - len = ngx_quic_create_frame(src, frame); - if (len == -1) { - ngx_quic_free_frame(c, frame); - return NGX_ERROR; - } - - if (len < (ssize_t) min_payload) { - ngx_memset(src + len, NGX_QUIC_FT_PADDING, min_payload - len); - len = min_payload; - } - - pkt.payload.data = src; - pkt.payload.len = len; - - res.data = dst; - - ngx_quic_log_packet(c->log, &pkt); - - if (ngx_quic_encrypt(&pkt, &res) != NGX_OK) { - ngx_quic_free_frame(c, frame); - return NGX_ERROR; - } - - frame->pnum = ctx->pnum; - frame->send_time = now; - frame->plen = res.len; - - ctx->pnum++; - - sent = ngx_quic_send(c, res.data, res.len, path->sockaddr, path->socklen); - if (sent < 0) { - ngx_quic_free_frame(c, frame); - return sent; - } - - path->sent += sent; - - if (frame->need_ack && !qc->closing) { - ngx_queue_insert_tail(&ctx->sent, &frame->queue); - - cg->in_flight += frame->plen; - - } else { - ngx_quic_free_frame(c, frame); - return NGX_OK; - } - - ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, - "quic congestion send if:%uz", cg->in_flight); - - if (!qc->send_timer_set) { - qc->send_timer_set = 1; - ngx_add_timer(c->read, qc->tp.max_idle_timeout); - } - - ngx_quic_set_lost_timer(c); - - return NGX_OK; -} - - -size_t -ngx_quic_path_limit(ngx_connection_t *c, ngx_quic_path_t *path, size_t size) -{ - off_t max; - - if (!path->validated) { - max = path->received * 3; - max = (path->sent >= max) ? 0 : max - path->sent; - - if ((off_t) size > max) { - return max; - } - } - - return size; -} diff --git a/src/deps/src/nginx-1.30.3/src/event/quic/ngx_event_quic_output.h b/src/deps/src/nginx-1.30.3/src/event/quic/ngx_event_quic_output.h deleted file mode 100644 index 52d8a374f7..0000000000 --- a/src/deps/src/nginx-1.30.3/src/event/quic/ngx_event_quic_output.h +++ /dev/null @@ -1,40 +0,0 @@ - -/* - * Copyright (C) Nginx, Inc. - */ - - -#ifndef _NGX_EVENT_QUIC_OUTPUT_H_INCLUDED_ -#define _NGX_EVENT_QUIC_OUTPUT_H_INCLUDED_ - - -#include -#include - - -ngx_int_t ngx_quic_output(ngx_connection_t *c); - -ngx_int_t ngx_quic_negotiate_version(ngx_connection_t *c, - ngx_quic_header_t *inpkt); - -ngx_int_t ngx_quic_send_stateless_reset(ngx_connection_t *c, - ngx_quic_conf_t *conf, ngx_quic_header_t *pkt); -ngx_int_t ngx_quic_send_cc(ngx_connection_t *c); -ngx_int_t ngx_quic_send_early_cc(ngx_connection_t *c, - ngx_quic_header_t *inpkt, ngx_uint_t err, const char *reason); - -ngx_int_t ngx_quic_send_retry(ngx_connection_t *c, - ngx_quic_conf_t *conf, ngx_quic_header_t *pkt); -ngx_int_t ngx_quic_send_new_token(ngx_connection_t *c, ngx_quic_path_t *path); - -ngx_int_t ngx_quic_send_ack(ngx_connection_t *c, - ngx_quic_send_ctx_t *ctx); -ngx_int_t ngx_quic_send_ack_range(ngx_connection_t *c, - ngx_quic_send_ctx_t *ctx, uint64_t smallest, uint64_t largest); - -ngx_int_t ngx_quic_frame_sendto(ngx_connection_t *c, ngx_quic_frame_t *frame, - size_t min, ngx_quic_path_t *path); -size_t ngx_quic_path_limit(ngx_connection_t *c, ngx_quic_path_t *path, - size_t size); - -#endif /* _NGX_EVENT_QUIC_OUTPUT_H_INCLUDED_ */ diff --git a/src/deps/src/nginx-1.30.3/src/event/quic/ngx_event_quic_protection.c b/src/deps/src/nginx-1.30.3/src/event/quic/ngx_event_quic_protection.c deleted file mode 100644 index 2f28737a26..0000000000 --- a/src/deps/src/nginx-1.30.3/src/event/quic/ngx_event_quic_protection.c +++ /dev/null @@ -1,1268 +0,0 @@ - -/* - * Copyright (C) Nginx, Inc. - */ - - -#include -#include -#include -#include -#if (NGX_QUIC_BORINGSSL_EVP_API) -#include -#include -#else -#include -#endif - - -/* RFC 9001, 5.4.1. Header Protection Application: 5-byte mask */ -#define NGX_QUIC_HP_LEN 5 - -#define NGX_QUIC_AES_128_KEY_LEN 16 - -#define NGX_QUIC_INITIAL_CIPHER TLS1_3_CK_AES_128_GCM_SHA256 - - -#define ngx_quic_md(str) { sizeof(str) - 1, str } - - -static ngx_int_t ngx_hkdf_expand(u_char *out_key, size_t out_len, - const EVP_MD *digest, const u_char *prk, size_t prk_len, - const u_char *info, size_t info_len); -static ngx_int_t ngx_hkdf_extract(u_char *out_key, size_t *out_len, - const EVP_MD *digest, const u_char *secret, size_t secret_len, - const u_char *salt, size_t salt_len); - -static uint64_t ngx_quic_parse_pn(u_char **pos, ngx_int_t len, u_char *mask, - uint64_t *largest_pn); - -static ngx_int_t ngx_quic_crypto_open(ngx_quic_secret_t *s, ngx_str_t *out, - const u_char *nonce, ngx_str_t *in, ngx_str_t *ad, ngx_log_t *log); -#if !(NGX_QUIC_BORINGSSL_EVP_API) -static ngx_int_t ngx_quic_crypto_common(ngx_quic_secret_t *s, ngx_str_t *out, - const u_char *nonce, ngx_str_t *in, ngx_str_t *ad, ngx_log_t *log); -#endif - -static ngx_int_t ngx_quic_crypto_hp_init(const EVP_CIPHER *cipher, - ngx_quic_secret_t *s, ngx_log_t *log); -static ngx_int_t ngx_quic_crypto_hp(ngx_quic_secret_t *s, - u_char *out, u_char *in, ngx_log_t *log); -static void ngx_quic_crypto_hp_cleanup(ngx_quic_secret_t *s); - -static ngx_int_t ngx_quic_create_packet(ngx_quic_header_t *pkt, - ngx_str_t *res); -static ngx_int_t ngx_quic_create_retry_packet(ngx_quic_header_t *pkt, - ngx_str_t *res); - - -ngx_int_t -ngx_quic_ciphers(ngx_uint_t id, ngx_quic_ciphers_t *ciphers) -{ - ngx_int_t len; - - switch (id) { - - case TLS1_3_CK_AES_128_GCM_SHA256: -#if (NGX_QUIC_BORINGSSL_EVP_API) - ciphers->c = EVP_aead_aes_128_gcm(); -#else - ciphers->c = EVP_aes_128_gcm(); -#endif - ciphers->hp = EVP_aes_128_ctr(); - ciphers->d = EVP_sha256(); - len = 16; - break; - - case TLS1_3_CK_AES_256_GCM_SHA384: -#if (NGX_QUIC_BORINGSSL_EVP_API) - ciphers->c = EVP_aead_aes_256_gcm(); -#else - ciphers->c = EVP_aes_256_gcm(); -#endif - ciphers->hp = EVP_aes_256_ctr(); - ciphers->d = EVP_sha384(); - len = 32; - break; - - case TLS1_3_CK_CHACHA20_POLY1305_SHA256: -#if (NGX_QUIC_BORINGSSL_EVP_API) - ciphers->c = EVP_aead_chacha20_poly1305(); -#else - ciphers->c = EVP_chacha20_poly1305(); -#endif -#if (NGX_QUIC_BORINGSSL_EVP_API) - ciphers->hp = (const EVP_CIPHER *) EVP_aead_chacha20_poly1305(); -#else - ciphers->hp = EVP_chacha20(); -#endif - ciphers->d = EVP_sha256(); - len = 32; - break; - -#if !(NGX_QUIC_BORINGSSL_EVP_API) - case TLS1_3_CK_AES_128_CCM_SHA256: - ciphers->c = EVP_aes_128_ccm(); - ciphers->hp = EVP_aes_128_ctr(); - ciphers->d = EVP_sha256(); - len = 16; - break; -#endif - - default: - return NGX_ERROR; - } - - return len; -} - - -ngx_int_t -ngx_quic_keys_set_initial_secret(ngx_quic_keys_t *keys, ngx_str_t *secret, - ngx_log_t *log) -{ - size_t is_len; - uint8_t is[SHA256_DIGEST_LENGTH]; - ngx_str_t iss; - ngx_uint_t i; - const EVP_MD *digest; - ngx_quic_md_t client_key, server_key; - ngx_quic_hkdf_t seq[8]; - ngx_quic_secret_t *client, *server; - ngx_quic_ciphers_t ciphers; - - static const uint8_t salt[20] = { - 0x38, 0x76, 0x2c, 0xf7, 0xf5, 0x59, 0x34, 0xb3, 0x4d, 0x17, - 0x9a, 0xe6, 0xa4, 0xc8, 0x0c, 0xad, 0xcc, 0xbb, 0x7f, 0x0a - }; - - client = &keys->secrets[NGX_QUIC_ENCRYPTION_INITIAL].client; - server = &keys->secrets[NGX_QUIC_ENCRYPTION_INITIAL].server; - - /* - * RFC 9001, section 5. Packet Protection - * - * Initial packets use AEAD_AES_128_GCM. The hash function - * for HKDF when deriving initial secrets and keys is SHA-256. - */ - - digest = EVP_sha256(); - is_len = SHA256_DIGEST_LENGTH; - - if (ngx_hkdf_extract(is, &is_len, digest, secret->data, secret->len, - salt, sizeof(salt)) - != NGX_OK) - { - return NGX_ERROR; - } - - iss.len = is_len; - iss.data = is; - - ngx_log_debug0(NGX_LOG_DEBUG_EVENT, log, 0, - "quic ngx_quic_set_initial_secret"); -#ifdef NGX_QUIC_DEBUG_CRYPTO - ngx_log_debug3(NGX_LOG_DEBUG_EVENT, log, 0, - "quic salt len:%uz %*xs", sizeof(salt), sizeof(salt), salt); - ngx_log_debug3(NGX_LOG_DEBUG_EVENT, log, 0, - "quic initial secret len:%uz %*xs", is_len, is_len, is); -#endif - - client->secret.len = SHA256_DIGEST_LENGTH; - server->secret.len = SHA256_DIGEST_LENGTH; - - client_key.len = NGX_QUIC_AES_128_KEY_LEN; - server_key.len = NGX_QUIC_AES_128_KEY_LEN; - - client->hp.len = NGX_QUIC_AES_128_KEY_LEN; - server->hp.len = NGX_QUIC_AES_128_KEY_LEN; - - client->iv.len = NGX_QUIC_IV_LEN; - server->iv.len = NGX_QUIC_IV_LEN; - - /* labels per RFC 9001, 5.1. Packet Protection Keys */ - ngx_quic_hkdf_set(&seq[0], "tls13 client in", &client->secret, &iss); - ngx_quic_hkdf_set(&seq[1], "tls13 quic key", &client_key, &client->secret); - ngx_quic_hkdf_set(&seq[2], "tls13 quic iv", &client->iv, &client->secret); - ngx_quic_hkdf_set(&seq[3], "tls13 quic hp", &client->hp, &client->secret); - ngx_quic_hkdf_set(&seq[4], "tls13 server in", &server->secret, &iss); - ngx_quic_hkdf_set(&seq[5], "tls13 quic key", &server_key, &server->secret); - ngx_quic_hkdf_set(&seq[6], "tls13 quic iv", &server->iv, &server->secret); - ngx_quic_hkdf_set(&seq[7], "tls13 quic hp", &server->hp, &server->secret); - - for (i = 0; i < (sizeof(seq) / sizeof(seq[0])); i++) { - if (ngx_quic_hkdf_expand(&seq[i], digest, log) != NGX_OK) { - return NGX_ERROR; - } - } - - if (ngx_quic_ciphers(NGX_QUIC_INITIAL_CIPHER, &ciphers) == NGX_ERROR) { - return NGX_ERROR; - } - - if (ngx_quic_crypto_init(ciphers.c, client, &client_key, 0, log) - == NGX_ERROR) - { - return NGX_ERROR; - } - - if (ngx_quic_crypto_init(ciphers.c, server, &server_key, 1, log) - == NGX_ERROR) - { - goto failed; - } - - if (ngx_quic_crypto_hp_init(ciphers.hp, client, log) == NGX_ERROR) { - goto failed; - } - - if (ngx_quic_crypto_hp_init(ciphers.hp, server, log) == NGX_ERROR) { - goto failed; - } - - return NGX_OK; - -failed: - - ngx_quic_keys_cleanup(keys); - - return NGX_ERROR; -} - - -ngx_int_t -ngx_quic_hkdf_expand(ngx_quic_hkdf_t *h, const EVP_MD *digest, ngx_log_t *log) -{ - size_t info_len; - uint8_t *p; - uint8_t info[20]; - - info_len = 2 + 1 + h->label_len + 1; - - info[0] = 0; - info[1] = h->out_len; - info[2] = h->label_len; - - p = ngx_cpymem(&info[3], h->label, h->label_len); - *p = '\0'; - - if (ngx_hkdf_expand(h->out, h->out_len, digest, - h->prk, h->prk_len, info, info_len) - != NGX_OK) - { - ngx_ssl_error(NGX_LOG_INFO, log, 0, - "ngx_hkdf_expand(%*s) failed", h->label_len, h->label); - return NGX_ERROR; - } - -#ifdef NGX_QUIC_DEBUG_CRYPTO - ngx_log_debug5(NGX_LOG_DEBUG_EVENT, log, 0, - "quic expand \"%*s\" len:%uz %*xs", - h->label_len, h->label, h->out_len, h->out_len, h->out); -#endif - - return NGX_OK; -} - - -static ngx_int_t -ngx_hkdf_expand(u_char *out_key, size_t out_len, const EVP_MD *digest, - const uint8_t *prk, size_t prk_len, const u_char *info, size_t info_len) -{ -#if (NGX_QUIC_BORINGSSL_EVP_API) - - if (HKDF_expand(out_key, out_len, digest, prk, prk_len, info, info_len) - == 0) - { - return NGX_ERROR; - } - - return NGX_OK; - -#else - - EVP_PKEY_CTX *pctx; - - pctx = EVP_PKEY_CTX_new_id(EVP_PKEY_HKDF, NULL); - if (pctx == NULL) { - return NGX_ERROR; - } - - if (EVP_PKEY_derive_init(pctx) <= 0) { - goto failed; - } - - if (EVP_PKEY_CTX_hkdf_mode(pctx, EVP_PKEY_HKDEF_MODE_EXPAND_ONLY) <= 0) { - goto failed; - } - - if (EVP_PKEY_CTX_set_hkdf_md(pctx, digest) <= 0) { - goto failed; - } - - if (EVP_PKEY_CTX_set1_hkdf_key(pctx, prk, prk_len) <= 0) { - goto failed; - } - - if (EVP_PKEY_CTX_add1_hkdf_info(pctx, info, info_len) <= 0) { - goto failed; - } - - if (EVP_PKEY_derive(pctx, out_key, &out_len) <= 0) { - goto failed; - } - - EVP_PKEY_CTX_free(pctx); - - return NGX_OK; - -failed: - - EVP_PKEY_CTX_free(pctx); - - return NGX_ERROR; - -#endif -} - - -static ngx_int_t -ngx_hkdf_extract(u_char *out_key, size_t *out_len, const EVP_MD *digest, - const u_char *secret, size_t secret_len, const u_char *salt, - size_t salt_len) -{ -#if (NGX_QUIC_BORINGSSL_EVP_API) - - if (HKDF_extract(out_key, out_len, digest, secret, secret_len, salt, - salt_len) - == 0) - { - return NGX_ERROR; - } - - return NGX_OK; - -#else - - EVP_PKEY_CTX *pctx; - - pctx = EVP_PKEY_CTX_new_id(EVP_PKEY_HKDF, NULL); - if (pctx == NULL) { - return NGX_ERROR; - } - - if (EVP_PKEY_derive_init(pctx) <= 0) { - goto failed; - } - - if (EVP_PKEY_CTX_hkdf_mode(pctx, EVP_PKEY_HKDEF_MODE_EXTRACT_ONLY) <= 0) { - goto failed; - } - - if (EVP_PKEY_CTX_set_hkdf_md(pctx, digest) <= 0) { - goto failed; - } - - if (EVP_PKEY_CTX_set1_hkdf_key(pctx, secret, secret_len) <= 0) { - goto failed; - } - - if (EVP_PKEY_CTX_set1_hkdf_salt(pctx, salt, salt_len) <= 0) { - goto failed; - } - - if (EVP_PKEY_derive(pctx, out_key, out_len) <= 0) { - goto failed; - } - - EVP_PKEY_CTX_free(pctx); - - return NGX_OK; - -failed: - - EVP_PKEY_CTX_free(pctx); - - return NGX_ERROR; - -#endif -} - - -ngx_int_t -ngx_quic_crypto_init(const ngx_quic_cipher_t *cipher, ngx_quic_secret_t *s, - ngx_quic_md_t *key, ngx_int_t enc, ngx_log_t *log) -{ - -#if (NGX_QUIC_BORINGSSL_EVP_API) - EVP_AEAD_CTX *ctx; - - ctx = EVP_AEAD_CTX_new(cipher, key->data, key->len, - EVP_AEAD_DEFAULT_TAG_LENGTH); - if (ctx == NULL) { - ngx_ssl_error(NGX_LOG_INFO, log, 0, "EVP_AEAD_CTX_new() failed"); - return NGX_ERROR; - } -#else - EVP_CIPHER_CTX *ctx; - - ctx = EVP_CIPHER_CTX_new(); - if (ctx == NULL) { - ngx_ssl_error(NGX_LOG_INFO, log, 0, "EVP_CIPHER_CTX_new() failed"); - return NGX_ERROR; - } - - if (EVP_CipherInit_ex(ctx, cipher, NULL, NULL, NULL, enc) != 1) { - EVP_CIPHER_CTX_free(ctx); - ngx_ssl_error(NGX_LOG_INFO, log, 0, "EVP_CipherInit_ex() failed"); - return NGX_ERROR; - } - - if (EVP_CIPHER_mode(cipher) == EVP_CIPH_CCM_MODE - && EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_AEAD_SET_TAG, NGX_QUIC_TAG_LEN, - NULL) - == 0) - { - EVP_CIPHER_CTX_free(ctx); - ngx_ssl_error(NGX_LOG_INFO, log, 0, - "EVP_CIPHER_CTX_ctrl(EVP_CTRL_AEAD_SET_TAG) failed"); - return NGX_ERROR; - } - - if (EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_AEAD_SET_IVLEN, s->iv.len, NULL) - == 0) - { - EVP_CIPHER_CTX_free(ctx); - ngx_ssl_error(NGX_LOG_INFO, log, 0, - "EVP_CIPHER_CTX_ctrl(EVP_CTRL_AEAD_SET_IVLEN) failed"); - return NGX_ERROR; - } - - if (EVP_CipherInit_ex(ctx, NULL, NULL, key->data, NULL, enc) != 1) { - EVP_CIPHER_CTX_free(ctx); - ngx_ssl_error(NGX_LOG_INFO, log, 0, "EVP_CipherInit_ex() failed"); - return NGX_ERROR; - } -#endif - - s->ctx = ctx; - return NGX_OK; -} - - -static ngx_int_t -ngx_quic_crypto_open(ngx_quic_secret_t *s, ngx_str_t *out, const u_char *nonce, - ngx_str_t *in, ngx_str_t *ad, ngx_log_t *log) -{ -#if (NGX_QUIC_BORINGSSL_EVP_API) - if (EVP_AEAD_CTX_open(s->ctx, out->data, &out->len, out->len, nonce, - s->iv.len, in->data, in->len, ad->data, ad->len) - != 1) - { - ngx_ssl_error(NGX_LOG_INFO, log, 0, "EVP_AEAD_CTX_open() failed"); - return NGX_ERROR; - } - - return NGX_OK; -#else - return ngx_quic_crypto_common(s, out, nonce, in, ad, log); -#endif -} - - -ngx_int_t -ngx_quic_crypto_seal(ngx_quic_secret_t *s, ngx_str_t *out, const u_char *nonce, - ngx_str_t *in, ngx_str_t *ad, ngx_log_t *log) -{ -#if (NGX_QUIC_BORINGSSL_EVP_API) - if (EVP_AEAD_CTX_seal(s->ctx, out->data, &out->len, out->len, nonce, - s->iv.len, in->data, in->len, ad->data, ad->len) - != 1) - { - ngx_ssl_error(NGX_LOG_INFO, log, 0, "EVP_AEAD_CTX_seal() failed"); - return NGX_ERROR; - } - - return NGX_OK; -#else - return ngx_quic_crypto_common(s, out, nonce, in, ad, log); -#endif -} - - -#if !(NGX_QUIC_BORINGSSL_EVP_API) - -static ngx_int_t -ngx_quic_crypto_common(ngx_quic_secret_t *s, ngx_str_t *out, - const u_char *nonce, ngx_str_t *in, ngx_str_t *ad, ngx_log_t *log) -{ - int len, enc; - ngx_quic_crypto_ctx_t *ctx; - - ctx = s->ctx; - enc = EVP_CIPHER_CTX_encrypting(ctx); - - if (EVP_CipherInit_ex(ctx, NULL, NULL, NULL, nonce, enc) != 1) { - ngx_ssl_error(NGX_LOG_INFO, log, 0, "EVP_CipherInit_ex() failed"); - return NGX_ERROR; - } - - if (enc == 0) { - in->len -= NGX_QUIC_TAG_LEN; - - if (EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_AEAD_SET_TAG, NGX_QUIC_TAG_LEN, - in->data + in->len) - == 0) - { - ngx_ssl_error(NGX_LOG_INFO, log, 0, - "EVP_CIPHER_CTX_ctrl(EVP_CTRL_AEAD_SET_TAG) failed"); - return NGX_ERROR; - } - } - - if (EVP_CIPHER_mode(EVP_CIPHER_CTX_cipher(ctx)) == EVP_CIPH_CCM_MODE - && EVP_CipherUpdate(ctx, NULL, &len, NULL, in->len) != 1) - { - ngx_ssl_error(NGX_LOG_INFO, log, 0, "EVP_CipherUpdate() failed"); - return NGX_ERROR; - } - - if (EVP_CipherUpdate(ctx, NULL, &len, ad->data, ad->len) != 1) { - ngx_ssl_error(NGX_LOG_INFO, log, 0, "EVP_CipherUpdate() failed"); - return NGX_ERROR; - } - - if (EVP_CipherUpdate(ctx, out->data, &len, in->data, in->len) != 1) { - ngx_ssl_error(NGX_LOG_INFO, log, 0, "EVP_CipherUpdate() failed"); - return NGX_ERROR; - } - - out->len = len; - - if (EVP_CipherFinal_ex(ctx, out->data + out->len, &len) <= 0) { - ngx_ssl_error(NGX_LOG_INFO, log, 0, "EVP_CipherFinal_ex failed"); - return NGX_ERROR; - } - - out->len += len; - - if (enc == 1) { - if (EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_AEAD_GET_TAG, NGX_QUIC_TAG_LEN, - out->data + out->len) - == 0) - { - ngx_ssl_error(NGX_LOG_INFO, log, 0, - "EVP_CIPHER_CTX_ctrl(EVP_CTRL_AEAD_GET_TAG) failed"); - return NGX_ERROR; - } - - out->len += NGX_QUIC_TAG_LEN; - } - - return NGX_OK; -} - -#endif - - -void -ngx_quic_crypto_cleanup(ngx_quic_secret_t *s) -{ - if (s->ctx) { -#if (NGX_QUIC_BORINGSSL_EVP_API) - EVP_AEAD_CTX_free(s->ctx); -#else - EVP_CIPHER_CTX_free(s->ctx); -#endif - s->ctx = NULL; - } -} - - -static ngx_int_t -ngx_quic_crypto_hp_init(const EVP_CIPHER *cipher, ngx_quic_secret_t *s, - ngx_log_t *log) -{ - EVP_CIPHER_CTX *ctx; - -#if (NGX_QUIC_BORINGSSL_EVP_API) - if (cipher == (EVP_CIPHER *) EVP_aead_chacha20_poly1305()) { - /* no EVP interface */ - s->hp_ctx = NULL; - return NGX_OK; - } -#endif - - ctx = EVP_CIPHER_CTX_new(); - if (ctx == NULL) { - ngx_ssl_error(NGX_LOG_INFO, log, 0, "EVP_CIPHER_CTX_new() failed"); - return NGX_ERROR; - } - - if (EVP_EncryptInit_ex(ctx, cipher, NULL, s->hp.data, NULL) != 1) { - EVP_CIPHER_CTX_free(ctx); - ngx_ssl_error(NGX_LOG_INFO, log, 0, "EVP_EncryptInit_ex() failed"); - return NGX_ERROR; - } - - s->hp_ctx = ctx; - return NGX_OK; -} - - -static ngx_int_t -ngx_quic_crypto_hp(ngx_quic_secret_t *s, u_char *out, u_char *in, - ngx_log_t *log) -{ - int outlen; - EVP_CIPHER_CTX *ctx; - - static const u_char zero[NGX_QUIC_HP_LEN]; - - ctx = s->hp_ctx; - -#if (NGX_QUIC_BORINGSSL_EVP_API) - uint32_t cnt; - - if (ctx == NULL) { - ngx_memcpy(&cnt, in, sizeof(uint32_t)); - CRYPTO_chacha_20(out, zero, NGX_QUIC_HP_LEN, s->hp.data, &in[4], cnt); - return NGX_OK; - } -#endif - - if (EVP_EncryptInit_ex(ctx, NULL, NULL, NULL, in) != 1) { - ngx_ssl_error(NGX_LOG_INFO, log, 0, "EVP_EncryptInit_ex() failed"); - return NGX_ERROR; - } - - if (!EVP_EncryptUpdate(ctx, out, &outlen, zero, NGX_QUIC_HP_LEN)) { - ngx_ssl_error(NGX_LOG_INFO, log, 0, "EVP_EncryptUpdate() failed"); - return NGX_ERROR; - } - - if (!EVP_EncryptFinal_ex(ctx, out + NGX_QUIC_HP_LEN, &outlen)) { - ngx_ssl_error(NGX_LOG_INFO, log, 0, "EVP_EncryptFinal_Ex() failed"); - return NGX_ERROR; - } - - return NGX_OK; -} - - -static void -ngx_quic_crypto_hp_cleanup(ngx_quic_secret_t *s) -{ - if (s->hp_ctx) { - EVP_CIPHER_CTX_free(s->hp_ctx); - s->hp_ctx = NULL; - } -} - - -ngx_int_t -ngx_quic_keys_set_encryption_secret(ngx_log_t *log, ngx_uint_t is_write, - ngx_quic_keys_t *keys, ngx_uint_t level, const SSL_CIPHER *cipher, - const uint8_t *secret, size_t secret_len) -{ - ngx_int_t key_len; - ngx_str_t secret_str; - ngx_uint_t i; - ngx_quic_md_t key; - ngx_quic_hkdf_t seq[3]; - ngx_quic_secret_t *peer_secret; - ngx_quic_ciphers_t ciphers; - - peer_secret = is_write ? &keys->secrets[level].server - : &keys->secrets[level].client; - - keys->cipher = SSL_CIPHER_get_id(cipher); - - key_len = ngx_quic_ciphers(keys->cipher, &ciphers); - - if (key_len == NGX_ERROR) { - ngx_ssl_error(NGX_LOG_INFO, log, 0, "unexpected cipher"); - return NGX_ERROR; - } - - if (sizeof(peer_secret->secret.data) < secret_len) { - ngx_log_error(NGX_LOG_ALERT, log, 0, - "unexpected secret len: %uz", secret_len); - return NGX_ERROR; - } - - peer_secret->secret.len = secret_len; - ngx_memcpy(peer_secret->secret.data, secret, secret_len); - - key.len = key_len; - peer_secret->iv.len = NGX_QUIC_IV_LEN; - peer_secret->hp.len = key_len; - - secret_str.len = secret_len; - secret_str.data = (u_char *) secret; - - ngx_quic_hkdf_set(&seq[0], "tls13 quic key", &key, &secret_str); - ngx_quic_hkdf_set(&seq[1], "tls13 quic iv", &peer_secret->iv, &secret_str); - ngx_quic_hkdf_set(&seq[2], "tls13 quic hp", &peer_secret->hp, &secret_str); - - for (i = 0; i < (sizeof(seq) / sizeof(seq[0])); i++) { - if (ngx_quic_hkdf_expand(&seq[i], ciphers.d, log) != NGX_OK) { - return NGX_ERROR; - } - } - - if (ngx_quic_crypto_init(ciphers.c, peer_secret, &key, is_write, log) - == NGX_ERROR) - { - return NGX_ERROR; - } - - if (ngx_quic_crypto_hp_init(ciphers.hp, peer_secret, log) == NGX_ERROR) { - return NGX_ERROR; - } - - ngx_explicit_memzero(key.data, key.len); - - return NGX_OK; -} - - -ngx_uint_t -ngx_quic_keys_available(ngx_quic_keys_t *keys, ngx_uint_t level, - ngx_uint_t is_write) -{ - if (is_write == 0) { - return keys->secrets[level].client.ctx != NULL; - } - - return keys->secrets[level].server.ctx != NULL; -} - - -void -ngx_quic_keys_discard(ngx_quic_keys_t *keys, ngx_uint_t level) -{ - ngx_quic_secret_t *client, *server; - - client = &keys->secrets[level].client; - server = &keys->secrets[level].server; - - ngx_quic_crypto_cleanup(client); - ngx_quic_crypto_cleanup(server); - - ngx_quic_crypto_hp_cleanup(client); - ngx_quic_crypto_hp_cleanup(server); - - if (client->secret.len) { - ngx_explicit_memzero(client->secret.data, client->secret.len); - client->secret.len = 0; - } - - if (server->secret.len) { - ngx_explicit_memzero(server->secret.data, server->secret.len); - server->secret.len = 0; - } -} - - -void -ngx_quic_keys_switch(ngx_connection_t *c, ngx_quic_keys_t *keys) -{ - ngx_quic_secrets_t *current, *next, tmp; - - current = &keys->secrets[NGX_QUIC_ENCRYPTION_APPLICATION]; - next = &keys->next_key; - - ngx_quic_crypto_cleanup(¤t->client); - ngx_quic_crypto_cleanup(¤t->server); - - tmp = *current; - *current = *next; - *next = tmp; -} - - -void -ngx_quic_keys_update(ngx_event_t *ev) -{ - ngx_int_t key_len; - ngx_uint_t i; - ngx_quic_md_t client_key, server_key; - ngx_quic_hkdf_t seq[6]; - ngx_quic_keys_t *keys; - ngx_connection_t *c; - ngx_quic_ciphers_t ciphers; - ngx_quic_secrets_t *current, *next; - ngx_quic_connection_t *qc; - - c = ev->data; - qc = ngx_quic_get_connection(c); - keys = qc->keys; - - current = &keys->secrets[NGX_QUIC_ENCRYPTION_APPLICATION]; - next = &keys->next_key; - - ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0, "quic key update"); - - c->log->action = "updating keys"; - - key_len = ngx_quic_ciphers(keys->cipher, &ciphers); - - if (key_len == NGX_ERROR) { - goto failed; - } - - client_key.len = key_len; - server_key.len = key_len; - - next->client.secret.len = current->client.secret.len; - next->client.iv.len = NGX_QUIC_IV_LEN; - next->client.hp = current->client.hp; - next->client.hp_ctx = current->client.hp_ctx; - - next->server.secret.len = current->server.secret.len; - next->server.iv.len = NGX_QUIC_IV_LEN; - next->server.hp = current->server.hp; - next->server.hp_ctx = current->server.hp_ctx; - - ngx_quic_hkdf_set(&seq[0], "tls13 quic ku", - &next->client.secret, ¤t->client.secret); - ngx_quic_hkdf_set(&seq[1], "tls13 quic key", - &client_key, &next->client.secret); - ngx_quic_hkdf_set(&seq[2], "tls13 quic iv", - &next->client.iv, &next->client.secret); - ngx_quic_hkdf_set(&seq[3], "tls13 quic ku", - &next->server.secret, ¤t->server.secret); - ngx_quic_hkdf_set(&seq[4], "tls13 quic key", - &server_key, &next->server.secret); - ngx_quic_hkdf_set(&seq[5], "tls13 quic iv", - &next->server.iv, &next->server.secret); - - for (i = 0; i < (sizeof(seq) / sizeof(seq[0])); i++) { - if (ngx_quic_hkdf_expand(&seq[i], ciphers.d, c->log) != NGX_OK) { - goto failed; - } - } - - if (ngx_quic_crypto_init(ciphers.c, &next->client, &client_key, 0, c->log) - == NGX_ERROR) - { - goto failed; - } - - if (ngx_quic_crypto_init(ciphers.c, &next->server, &server_key, 1, c->log) - == NGX_ERROR) - { - goto failed; - } - - ngx_explicit_memzero(current->client.secret.data, - current->client.secret.len); - ngx_explicit_memzero(current->server.secret.data, - current->server.secret.len); - - current->client.secret.len = 0; - current->server.secret.len = 0; - - ngx_explicit_memzero(client_key.data, client_key.len); - ngx_explicit_memzero(server_key.data, server_key.len); - - return; - -failed: - - ngx_quic_close_connection(c, NGX_ERROR); -} - - -void -ngx_quic_keys_cleanup(ngx_quic_keys_t *keys) -{ - ngx_uint_t i; - ngx_quic_secrets_t *next; - - for (i = 0; i < NGX_QUIC_ENCRYPTION_LAST; i++) { - ngx_quic_keys_discard(keys, i); - } - - next = &keys->next_key; - - ngx_quic_crypto_cleanup(&next->client); - ngx_quic_crypto_cleanup(&next->server); - - if (next->client.secret.len) { - ngx_explicit_memzero(next->client.secret.data, - next->client.secret.len); - next->client.secret.len = 0; - } - - if (next->server.secret.len) { - ngx_explicit_memzero(next->server.secret.data, - next->server.secret.len); - next->server.secret.len = 0; - } -} - - -static ngx_int_t -ngx_quic_create_packet(ngx_quic_header_t *pkt, ngx_str_t *res) -{ - u_char *pnp, *sample; - ngx_str_t ad, out; - ngx_uint_t i; - ngx_quic_secret_t *secret; - u_char nonce[NGX_QUIC_IV_LEN], mask[NGX_QUIC_HP_LEN]; - - ad.data = res->data; - ad.len = ngx_quic_create_header(pkt, ad.data, &pnp); - - out.len = pkt->payload.len + NGX_QUIC_TAG_LEN; - out.data = res->data + ad.len; - -#ifdef NGX_QUIC_DEBUG_CRYPTO - ngx_log_debug2(NGX_LOG_DEBUG_EVENT, pkt->log, 0, - "quic ad len:%uz %xV", ad.len, &ad); -#endif - - secret = &pkt->keys->secrets[pkt->level].server; - - ngx_memcpy(nonce, secret->iv.data, secret->iv.len); - ngx_quic_compute_nonce(nonce, sizeof(nonce), pkt->number); - - if (ngx_quic_crypto_seal(secret, &out, nonce, &pkt->payload, &ad, pkt->log) - != NGX_OK) - { - return NGX_ERROR; - } - - sample = &out.data[4 - pkt->num_len]; - if (ngx_quic_crypto_hp(secret, mask, sample, pkt->log) != NGX_OK) { - return NGX_ERROR; - } - - /* RFC 9001, 5.4.1. Header Protection Application */ - ad.data[0] ^= mask[0] & ngx_quic_pkt_hp_mask(pkt->flags); - - for (i = 0; i < pkt->num_len; i++) { - pnp[i] ^= mask[i + 1]; - } - - res->len = ad.len + out.len; - - return NGX_OK; -} - - -static ngx_int_t -ngx_quic_create_retry_packet(ngx_quic_header_t *pkt, ngx_str_t *res) -{ - u_char *start; - ngx_str_t ad, itag; - ngx_quic_secret_t secret; - ngx_quic_ciphers_t ciphers; - - /* 5.8. Retry Packet Integrity */ - static ngx_quic_md_t key = ngx_quic_md( - "\xbe\x0c\x69\x0b\x9f\x66\x57\x5a\x1d\x76\x6b\x54\xe3\x68\xc8\x4e"); - static const u_char nonce[NGX_QUIC_IV_LEN] = { - 0x46, 0x15, 0x99, 0xd3, 0x5d, 0x63, 0x2b, 0xf2, 0x23, 0x98, 0x25, 0xbb - }; - static ngx_str_t in = ngx_string(""); - - ad.data = res->data; - ad.len = ngx_quic_create_retry_itag(pkt, ad.data, &start); - - itag.data = ad.data + ad.len; - itag.len = NGX_QUIC_TAG_LEN; - -#ifdef NGX_QUIC_DEBUG_CRYPTO - ngx_log_debug2(NGX_LOG_DEBUG_EVENT, pkt->log, 0, - "quic retry itag len:%uz %xV", ad.len, &ad); -#endif - - if (ngx_quic_ciphers(NGX_QUIC_INITIAL_CIPHER, &ciphers) == NGX_ERROR) { - return NGX_ERROR; - } - - secret.iv.len = NGX_QUIC_IV_LEN; - - if (ngx_quic_crypto_init(ciphers.c, &secret, &key, 1, pkt->log) - == NGX_ERROR) - { - return NGX_ERROR; - } - - if (ngx_quic_crypto_seal(&secret, &itag, nonce, &in, &ad, pkt->log) - != NGX_OK) - { - ngx_quic_crypto_cleanup(&secret); - return NGX_ERROR; - } - - ngx_quic_crypto_cleanup(&secret); - - res->len = itag.data + itag.len - start; - res->data = start; - - return NGX_OK; -} - - -ngx_int_t -ngx_quic_derive_key(ngx_log_t *log, const char *label, ngx_str_t *secret, - ngx_str_t *salt, u_char *out, size_t len) -{ - size_t is_len, info_len; - uint8_t *p; - const EVP_MD *digest; - - uint8_t is[SHA256_DIGEST_LENGTH]; - uint8_t info[20]; - - digest = EVP_sha256(); - is_len = SHA256_DIGEST_LENGTH; - - if (ngx_hkdf_extract(is, &is_len, digest, secret->data, secret->len, - salt->data, salt->len) - != NGX_OK) - { - ngx_ssl_error(NGX_LOG_INFO, log, 0, - "ngx_hkdf_extract(%s) failed", label); - return NGX_ERROR; - } - - info[0] = 0; - info[1] = len; - info[2] = ngx_strlen(label); - - info_len = 2 + 1 + info[2] + 1; - - if (info_len >= 20) { - ngx_log_error(NGX_LOG_INFO, log, 0, - "ngx_quic_create_key label \"%s\" too long", label); - return NGX_ERROR; - } - - p = ngx_cpymem(&info[3], label, info[2]); - *p = '\0'; - - if (ngx_hkdf_expand(out, len, digest, is, is_len, info, info_len) != NGX_OK) - { - ngx_ssl_error(NGX_LOG_INFO, log, 0, - "ngx_hkdf_expand(%s) failed", label); - return NGX_ERROR; - } - - return NGX_OK; -} - - -static uint64_t -ngx_quic_parse_pn(u_char **pos, ngx_int_t len, u_char *mask, - uint64_t *largest_pn) -{ - u_char *p; - uint64_t truncated_pn, expected_pn, candidate_pn; - uint64_t pn_nbits, pn_win, pn_hwin, pn_mask; - - pn_nbits = ngx_min(len * 8, 62); - - p = *pos; - truncated_pn = *p++ ^ *mask++; - - while (--len) { - truncated_pn = (truncated_pn << 8) + (*p++ ^ *mask++); - } - - *pos = p; - - expected_pn = *largest_pn + 1; - pn_win = 1ULL << pn_nbits; - pn_hwin = pn_win / 2; - pn_mask = pn_win - 1; - - candidate_pn = (expected_pn & ~pn_mask) | truncated_pn; - - if ((int64_t) candidate_pn <= (int64_t) (expected_pn - pn_hwin) - && candidate_pn < (1ULL << 62) - pn_win) - { - candidate_pn += pn_win; - - } else if (candidate_pn > expected_pn + pn_hwin - && candidate_pn >= pn_win) - { - candidate_pn -= pn_win; - } - - *largest_pn = ngx_max((int64_t) *largest_pn, (int64_t) candidate_pn); - - return candidate_pn; -} - - -void -ngx_quic_compute_nonce(u_char *nonce, size_t len, uint64_t pn) -{ - nonce[len - 8] ^= (pn >> 56) & 0x3f; - nonce[len - 7] ^= (pn >> 48) & 0xff; - nonce[len - 6] ^= (pn >> 40) & 0xff; - nonce[len - 5] ^= (pn >> 32) & 0xff; - nonce[len - 4] ^= (pn >> 24) & 0xff; - nonce[len - 3] ^= (pn >> 16) & 0xff; - nonce[len - 2] ^= (pn >> 8) & 0xff; - nonce[len - 1] ^= pn & 0xff; -} - - -ngx_int_t -ngx_quic_encrypt(ngx_quic_header_t *pkt, ngx_str_t *res) -{ - if (ngx_quic_pkt_retry(pkt->flags)) { - return ngx_quic_create_retry_packet(pkt, res); - } - - return ngx_quic_create_packet(pkt, res); -} - - -ngx_int_t -ngx_quic_decrypt(ngx_quic_header_t *pkt, uint64_t *largest_pn) -{ - u_char *p, *sample; - size_t len; - uint64_t pn, lpn; - ngx_int_t pnl; - ngx_str_t in, ad; - ngx_uint_t key_phase; - ngx_quic_secret_t *secret; - uint8_t nonce[NGX_QUIC_IV_LEN], mask[NGX_QUIC_HP_LEN]; - - secret = &pkt->keys->secrets[pkt->level].client; - - p = pkt->raw->pos; - len = pkt->data + pkt->len - p; - - /* - * RFC 9001, 5.4.2. Header Protection Sample - * 5.4.3. AES-Based Header Protection - * 5.4.4. ChaCha20-Based Header Protection - * - * the Packet Number field is assumed to be 4 bytes long - * AES and ChaCha20 algorithms sample 16 bytes - */ - - if (len < NGX_QUIC_TAG_LEN + 4) { - return NGX_DECLINED; - } - - sample = p + 4; - - /* header protection */ - - if (ngx_quic_crypto_hp(secret, mask, sample, pkt->log) != NGX_OK) { - return NGX_DECLINED; - } - - pkt->flags ^= mask[0] & ngx_quic_pkt_hp_mask(pkt->flags); - - if (ngx_quic_short_pkt(pkt->flags)) { - key_phase = (pkt->flags & NGX_QUIC_PKT_KPHASE) != 0; - - if (key_phase != pkt->key_phase) { - if (pkt->keys->next_key.client.ctx != NULL) { - secret = &pkt->keys->next_key.client; - pkt->key_update = 1; - - } else { - /* - * RFC 9001, 6.3. Timing of Receive Key Generation. - * - * Trial decryption to avoid timing side-channel. - */ - ngx_log_debug0(NGX_LOG_DEBUG_EVENT, pkt->log, 0, - "quic next key missing"); - } - } - } - - lpn = *largest_pn; - - pnl = (pkt->flags & 0x03) + 1; - pn = ngx_quic_parse_pn(&p, pnl, &mask[1], &lpn); - - pkt->pn = pn; - - ngx_log_debug1(NGX_LOG_DEBUG_EVENT, pkt->log, 0, - "quic packet rx clearflags:%xd", pkt->flags); - ngx_log_debug2(NGX_LOG_DEBUG_EVENT, pkt->log, 0, - "quic packet rx number:%uL len:%xi", pn, pnl); - - /* packet protection */ - - in.data = p; - in.len = len - pnl; - - ad.len = p - pkt->data; - ad.data = pkt->plaintext; - - ngx_memcpy(ad.data, pkt->data, ad.len); - ad.data[0] = pkt->flags; - - do { - ad.data[ad.len - pnl] = pn >> (8 * (pnl - 1)) % 256; - } while (--pnl); - - ngx_memcpy(nonce, secret->iv.data, secret->iv.len); - ngx_quic_compute_nonce(nonce, sizeof(nonce), pn); - -#ifdef NGX_QUIC_DEBUG_CRYPTO - ngx_log_debug2(NGX_LOG_DEBUG_EVENT, pkt->log, 0, - "quic ad len:%uz %xV", ad.len, &ad); -#endif - - pkt->payload.len = in.len - NGX_QUIC_TAG_LEN; - pkt->payload.data = pkt->plaintext + ad.len; - - if (ngx_quic_crypto_open(secret, &pkt->payload, nonce, &in, &ad, pkt->log) - != NGX_OK) - { - return NGX_DECLINED; - } - - if (pkt->payload.len == 0) { - /* - * RFC 9000, 12.4. Frames and Frame Types - * - * An endpoint MUST treat receipt of a packet containing no - * frames as a connection error of type PROTOCOL_VIOLATION. - */ - ngx_log_error(NGX_LOG_INFO, pkt->log, 0, "quic zero-length packet"); - pkt->error = NGX_QUIC_ERR_PROTOCOL_VIOLATION; - return NGX_ERROR; - } - - if (pkt->flags & ngx_quic_pkt_rb_mask(pkt->flags)) { - /* - * RFC 9000, Reserved Bits - * - * An endpoint MUST treat receipt of a packet that has - * a non-zero value for these bits, after removing both - * packet and header protection, as a connection error - * of type PROTOCOL_VIOLATION. - */ - ngx_log_error(NGX_LOG_INFO, pkt->log, 0, - "quic reserved bit set in packet"); - pkt->error = NGX_QUIC_ERR_PROTOCOL_VIOLATION; - return NGX_ERROR; - } - -#if defined(NGX_QUIC_DEBUG_CRYPTO) && defined(NGX_QUIC_DEBUG_PACKETS) - ngx_log_debug2(NGX_LOG_DEBUG_EVENT, pkt->log, 0, - "quic packet payload len:%uz %xV", - pkt->payload.len, &pkt->payload); -#endif - - *largest_pn = lpn; - - return NGX_OK; -} diff --git a/src/deps/src/nginx-1.30.3/src/event/quic/ngx_event_quic_protection.h b/src/deps/src/nginx-1.30.3/src/event/quic/ngx_event_quic_protection.h deleted file mode 100644 index 7c5cf3153e..0000000000 --- a/src/deps/src/nginx-1.30.3/src/event/quic/ngx_event_quic_protection.h +++ /dev/null @@ -1,118 +0,0 @@ - -/* - * Copyright (C) Nginx, Inc. - */ - - -#ifndef _NGX_EVENT_QUIC_PROTECTION_H_INCLUDED_ -#define _NGX_EVENT_QUIC_PROTECTION_H_INCLUDED_ - - -#include -#include - -#include - - -/* RFC 5116, 5.1/5.3 and RFC 8439, 2.3/2.5 for all supported ciphers */ -#define NGX_QUIC_IV_LEN 12 -#define NGX_QUIC_TAG_LEN 16 - -/* largest hash used in TLS is SHA-384 */ -#define NGX_QUIC_MAX_MD_SIZE 48 - - -#if (defined OPENSSL_IS_BORINGSSL || defined OPENSSL_IS_AWSLC) -#define NGX_QUIC_BORINGSSL_EVP_API 1 -#define ngx_quic_cipher_t EVP_AEAD -#define ngx_quic_crypto_ctx_t EVP_AEAD_CTX -#else -#define NGX_QUIC_BORINGSSL_EVP_API 0 -#define ngx_quic_cipher_t EVP_CIPHER -#define ngx_quic_crypto_ctx_t EVP_CIPHER_CTX -#endif - - -typedef struct { - size_t len; - u_char data[NGX_QUIC_MAX_MD_SIZE]; -} ngx_quic_md_t; - - -typedef struct { - size_t len; - u_char data[NGX_QUIC_IV_LEN]; -} ngx_quic_iv_t; - - -typedef struct { - ngx_quic_md_t secret; - ngx_quic_iv_t iv; - ngx_quic_md_t hp; - ngx_quic_crypto_ctx_t *ctx; - EVP_CIPHER_CTX *hp_ctx; -} ngx_quic_secret_t; - - -typedef struct { - ngx_quic_secret_t client; - ngx_quic_secret_t server; -} ngx_quic_secrets_t; - - -struct ngx_quic_keys_s { - ngx_quic_secrets_t secrets[NGX_QUIC_ENCRYPTION_LAST]; - ngx_quic_secrets_t next_key; - ngx_uint_t cipher; -}; - - -typedef struct { - const ngx_quic_cipher_t *c; - const EVP_CIPHER *hp; - const EVP_MD *d; -} ngx_quic_ciphers_t; - - -typedef struct { - size_t out_len; - u_char *out; - - size_t prk_len; - const uint8_t *prk; - - size_t label_len; - const u_char *label; -} ngx_quic_hkdf_t; - -#define ngx_quic_hkdf_set(seq, _label, _out, _prk) \ - (seq)->out_len = (_out)->len; (seq)->out = (_out)->data; \ - (seq)->prk_len = (_prk)->len, (seq)->prk = (_prk)->data, \ - (seq)->label_len = (sizeof(_label) - 1); (seq)->label = (u_char *)(_label); - - -ngx_int_t ngx_quic_keys_set_initial_secret(ngx_quic_keys_t *keys, - ngx_str_t *secret, ngx_log_t *log); -ngx_int_t ngx_quic_keys_set_encryption_secret(ngx_log_t *log, - ngx_uint_t is_write, ngx_quic_keys_t *keys, ngx_uint_t level, - const SSL_CIPHER *cipher, const uint8_t *secret, size_t secret_len); -ngx_uint_t ngx_quic_keys_available(ngx_quic_keys_t *keys, ngx_uint_t level, - ngx_uint_t is_write); -void ngx_quic_keys_discard(ngx_quic_keys_t *keys, ngx_uint_t level); -void ngx_quic_keys_switch(ngx_connection_t *c, ngx_quic_keys_t *keys); -void ngx_quic_keys_update(ngx_event_t *ev); -void ngx_quic_keys_cleanup(ngx_quic_keys_t *keys); -ngx_int_t ngx_quic_encrypt(ngx_quic_header_t *pkt, ngx_str_t *res); -ngx_int_t ngx_quic_decrypt(ngx_quic_header_t *pkt, uint64_t *largest_pn); -void ngx_quic_compute_nonce(u_char *nonce, size_t len, uint64_t pn); -ngx_int_t ngx_quic_ciphers(ngx_uint_t id, ngx_quic_ciphers_t *ciphers); -ngx_int_t ngx_quic_crypto_init(const ngx_quic_cipher_t *cipher, - ngx_quic_secret_t *s, ngx_quic_md_t *key, ngx_int_t enc, ngx_log_t *log); -ngx_int_t ngx_quic_crypto_seal(ngx_quic_secret_t *s, ngx_str_t *out, - const u_char *nonce, ngx_str_t *in, ngx_str_t *ad, ngx_log_t *log); -void ngx_quic_crypto_cleanup(ngx_quic_secret_t *s); -ngx_int_t ngx_quic_hkdf_expand(ngx_quic_hkdf_t *hkdf, const EVP_MD *digest, - ngx_log_t *log); - - -#endif /* _NGX_EVENT_QUIC_PROTECTION_H_INCLUDED_ */ diff --git a/src/deps/src/nginx-1.30.3/src/event/quic/ngx_event_quic_socket.c b/src/deps/src/nginx-1.30.3/src/event/quic/ngx_event_quic_socket.c deleted file mode 100644 index c2bc822a55..0000000000 --- a/src/deps/src/nginx-1.30.3/src/event/quic/ngx_event_quic_socket.c +++ /dev/null @@ -1,237 +0,0 @@ - -/* - * Copyright (C) Nginx, Inc. - */ - - -#include -#include -#include -#include - - -ngx_int_t -ngx_quic_open_sockets(ngx_connection_t *c, ngx_quic_connection_t *qc, - ngx_quic_header_t *pkt) -{ - ngx_quic_socket_t *qsock, *tmp; - ngx_quic_client_id_t *cid; - - /* - * qc->path = NULL - * - * qc->nclient_ids = 0 - * qc->nsockets = 0 - * qc->max_retired_seqnum = 0 - * qc->client_seqnum = 0 - */ - - ngx_queue_init(&qc->sockets); - ngx_queue_init(&qc->free_sockets); - - ngx_queue_init(&qc->paths); - ngx_queue_init(&qc->free_paths); - - ngx_queue_init(&qc->client_ids); - ngx_queue_init(&qc->free_client_ids); - - qc->tp.original_dcid.len = pkt->odcid.len; - qc->tp.original_dcid.data = ngx_pstrdup(c->pool, &pkt->odcid); - if (qc->tp.original_dcid.data == NULL) { - return NGX_ERROR; - } - - /* socket to use for further processing (id auto-generated) */ - qsock = ngx_quic_create_socket(c, qc); - if (qsock == NULL) { - return NGX_ERROR; - } - - /* socket is listening at new server id */ - if (ngx_quic_listen(c, qc, qsock) != NGX_OK) { - return NGX_ERROR; - } - - qsock->used = 1; - - qc->tp.initial_scid.len = qsock->sid.len; - qc->tp.initial_scid.data = ngx_pnalloc(c->pool, qsock->sid.len); - if (qc->tp.initial_scid.data == NULL) { - goto failed; - } - ngx_memcpy(qc->tp.initial_scid.data, qsock->sid.id, qsock->sid.len); - - /* for all packets except first, this is set at udp layer */ - c->udp = &qsock->udp; - - /* ngx_quic_get_connection(c) macro is now usable */ - - /* we have a client identified by scid */ - cid = ngx_quic_create_client_id(c, &pkt->scid, 0, NULL); - if (cid == NULL) { - goto failed; - } - - /* path of the first packet is our initial active path */ - qc->path = ngx_quic_new_path(c, c->sockaddr, c->socklen, cid); - if (qc->path == NULL) { - goto failed; - } - - qc->path->tag = NGX_QUIC_PATH_ACTIVE; - - if (pkt->validated) { - qc->path->validated = 1; - } - - ngx_quic_path_dbg(c, "set active", qc->path); - - tmp = ngx_pcalloc(c->pool, sizeof(ngx_quic_socket_t)); - if (tmp == NULL) { - goto failed; - } - - tmp->sid.seqnum = NGX_QUIC_UNSET_PN; /* temporary socket */ - - ngx_memcpy(tmp->sid.id, pkt->dcid.data, pkt->dcid.len); - tmp->sid.len = pkt->dcid.len; - - if (ngx_quic_listen(c, qc, tmp) != NGX_OK) { - goto failed; - } - - return NGX_OK; - -failed: - - ngx_rbtree_delete(&c->listening->rbtree, &qsock->udp.node); - c->udp = NULL; - - return NGX_ERROR; -} - - -ngx_quic_socket_t * -ngx_quic_create_socket(ngx_connection_t *c, ngx_quic_connection_t *qc) -{ - ngx_queue_t *q; - ngx_quic_socket_t *sock; - - if (!ngx_queue_empty(&qc->free_sockets)) { - - q = ngx_queue_head(&qc->free_sockets); - sock = ngx_queue_data(q, ngx_quic_socket_t, queue); - - ngx_queue_remove(&sock->queue); - - ngx_memzero(sock, sizeof(ngx_quic_socket_t)); - - } else { - - sock = ngx_pcalloc(c->pool, sizeof(ngx_quic_socket_t)); - if (sock == NULL) { - return NULL; - } - } - - sock->sid.len = NGX_QUIC_SERVER_CID_LEN; - if (ngx_quic_create_server_id(c, sock->sid.id) != NGX_OK) { - return NULL; - } - - sock->sid.seqnum = qc->server_seqnum++; - - return sock; -} - - -void -ngx_quic_close_socket(ngx_connection_t *c, ngx_quic_socket_t *qsock) -{ - ngx_quic_connection_t *qc; - - qc = ngx_quic_get_connection(c); - - ngx_queue_remove(&qsock->queue); - ngx_queue_insert_head(&qc->free_sockets, &qsock->queue); - - ngx_rbtree_delete(&c->listening->rbtree, &qsock->udp.node); - qc->nsockets--; - - ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0, - "quic socket seq:%L closed nsock:%ui", - (int64_t) qsock->sid.seqnum, qc->nsockets); -} - - -ngx_int_t -ngx_quic_listen(ngx_connection_t *c, ngx_quic_connection_t *qc, - ngx_quic_socket_t *qsock) -{ - ngx_str_t id; - ngx_quic_server_id_t *sid; - - sid = &qsock->sid; - - id.data = sid->id; - id.len = sid->len; - - qsock->udp.connection = c; - qsock->udp.node.key = ngx_crc32_long(id.data, id.len); - qsock->udp.key = id; - - ngx_rbtree_insert(&c->listening->rbtree, &qsock->udp.node); - - ngx_queue_insert_tail(&qc->sockets, &qsock->queue); - - qc->nsockets++; - qsock->quic = qc; - - ngx_log_debug3(NGX_LOG_DEBUG_EVENT, c->log, 0, - "quic socket seq:%L listening at sid:%xV nsock:%ui", - (int64_t) sid->seqnum, &id, qc->nsockets); - - return NGX_OK; -} - - -void -ngx_quic_close_sockets(ngx_connection_t *c) -{ - ngx_queue_t *q; - ngx_quic_socket_t *qsock; - ngx_quic_connection_t *qc; - - qc = ngx_quic_get_connection(c); - - while (!ngx_queue_empty(&qc->sockets)) { - q = ngx_queue_head(&qc->sockets); - qsock = ngx_queue_data(q, ngx_quic_socket_t, queue); - - ngx_quic_close_socket(c, qsock); - } -} - - -ngx_quic_socket_t * -ngx_quic_find_socket(ngx_connection_t *c, uint64_t seqnum) -{ - ngx_queue_t *q; - ngx_quic_socket_t *qsock; - ngx_quic_connection_t *qc; - - qc = ngx_quic_get_connection(c); - - for (q = ngx_queue_head(&qc->sockets); - q != ngx_queue_sentinel(&qc->sockets); - q = ngx_queue_next(q)) - { - qsock = ngx_queue_data(q, ngx_quic_socket_t, queue); - - if (qsock->sid.seqnum == seqnum) { - return qsock; - } - } - - return NULL; -} diff --git a/src/deps/src/nginx-1.30.3/src/event/quic/ngx_event_quic_socket.h b/src/deps/src/nginx-1.30.3/src/event/quic/ngx_event_quic_socket.h deleted file mode 100644 index 68ecc063d6..0000000000 --- a/src/deps/src/nginx-1.30.3/src/event/quic/ngx_event_quic_socket.h +++ /dev/null @@ -1,28 +0,0 @@ - -/* - * Copyright (C) Nginx, Inc. - */ - - -#ifndef _NGX_EVENT_QUIC_SOCKET_H_INCLUDED_ -#define _NGX_EVENT_QUIC_SOCKET_H_INCLUDED_ - - -#include -#include - - -ngx_int_t ngx_quic_open_sockets(ngx_connection_t *c, - ngx_quic_connection_t *qc, ngx_quic_header_t *pkt); -void ngx_quic_close_sockets(ngx_connection_t *c); - -ngx_quic_socket_t *ngx_quic_create_socket(ngx_connection_t *c, - ngx_quic_connection_t *qc); -ngx_int_t ngx_quic_listen(ngx_connection_t *c, ngx_quic_connection_t *qc, - ngx_quic_socket_t *qsock); -void ngx_quic_close_socket(ngx_connection_t *c, ngx_quic_socket_t *qsock); - -ngx_quic_socket_t *ngx_quic_find_socket(ngx_connection_t *c, uint64_t seqnum); - - -#endif /* _NGX_EVENT_QUIC_SOCKET_H_INCLUDED_ */ diff --git a/src/deps/src/nginx-1.30.3/src/event/quic/ngx_event_quic_ssl.c b/src/deps/src/nginx-1.30.3/src/event/quic/ngx_event_quic_ssl.c deleted file mode 100644 index 18992ae1be..0000000000 --- a/src/deps/src/nginx-1.30.3/src/event/quic/ngx_event_quic_ssl.c +++ /dev/null @@ -1,991 +0,0 @@ - -/* - * Copyright (C) Nginx, Inc. - */ - - -#include -#include -#include -#include - - -/* - * RFC 9000, 7.5. Cryptographic Message Buffering - * - * Implementations MUST support buffering at least 4096 bytes of data - */ -#define NGX_QUIC_MAX_BUFFERED 65535 - - -#if (NGX_QUIC_OPENSSL_API) - -static int ngx_quic_cbs_send(ngx_ssl_conn_t *ssl_conn, - const unsigned char *data, size_t len, size_t *consumed, void *arg); -static int ngx_quic_cbs_recv_rcd(ngx_ssl_conn_t *ssl_conn, - const unsigned char **data, size_t *bytes_read, void *arg); -static int ngx_quic_cbs_release_rcd(ngx_ssl_conn_t *ssl_conn, - size_t bytes_read, void *arg); -static int ngx_quic_cbs_yield_secret(ngx_ssl_conn_t *ssl_conn, uint32_t level, - int direction, const unsigned char *secret, size_t secret_len, void *arg); -static int ngx_quic_cbs_got_transport_params(ngx_ssl_conn_t *ssl_conn, - const unsigned char *params, size_t params_len, void *arg); -static int ngx_quic_cbs_alert(ngx_ssl_conn_t *ssl_conn, unsigned char alert, - void *arg); - -#else /* NGX_QUIC_BORINGSSL_API || NGX_QUIC_QUICTLS_API */ - -static ngx_inline ngx_uint_t ngx_quic_map_encryption_level( - enum ssl_encryption_level_t ssl_level); - -#if (NGX_QUIC_BORINGSSL_API) -static int ngx_quic_set_read_secret(ngx_ssl_conn_t *ssl_conn, - enum ssl_encryption_level_t ssl_level, const SSL_CIPHER *cipher, - const uint8_t *secret, size_t secret_len); -static int ngx_quic_set_write_secret(ngx_ssl_conn_t *ssl_conn, - enum ssl_encryption_level_t ssl_level, const SSL_CIPHER *cipher, - const uint8_t *secret, size_t secret_len); -#else /* NGX_QUIC_QUICTLS_API */ -static int ngx_quic_set_encryption_secrets(ngx_ssl_conn_t *ssl_conn, - enum ssl_encryption_level_t ssl_level, const uint8_t *read_secret, - const uint8_t *write_secret, size_t secret_len); -#endif - -static int ngx_quic_add_handshake_data(ngx_ssl_conn_t *ssl_conn, - enum ssl_encryption_level_t ssl_level, const uint8_t *data, size_t len); -static int ngx_quic_flush_flight(ngx_ssl_conn_t *ssl_conn); -static int ngx_quic_send_alert(ngx_ssl_conn_t *ssl_conn, - enum ssl_encryption_level_t ssl_level, uint8_t alert); - -#endif - -static ngx_int_t ngx_quic_handshake(ngx_connection_t *c); -static ngx_int_t ngx_quic_crypto_provide(ngx_connection_t *c, ngx_uint_t level); - - -#if (NGX_QUIC_OPENSSL_API) - -static int -ngx_quic_cbs_send(ngx_ssl_conn_t *ssl_conn, - const unsigned char *data, size_t len, size_t *consumed, void *arg) -{ - ngx_connection_t *c = arg; - - ngx_chain_t *out; - unsigned int alpn_len; - ngx_quic_frame_t *frame; - const unsigned char *alpn_data; - ngx_quic_send_ctx_t *ctx; - ngx_quic_connection_t *qc; - - ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, - "quic ngx_quic_cbs_send len:%uz", len); - - qc = ngx_quic_get_connection(c); - - *consumed = 0; - - SSL_get0_alpn_selected(ssl_conn, &alpn_data, &alpn_len); - - if (alpn_len == 0) { - qc->error = NGX_QUIC_ERR_CRYPTO(SSL_AD_NO_APPLICATION_PROTOCOL); - qc->error_reason = "missing ALPN extension"; - - ngx_log_error(NGX_LOG_INFO, c->log, 0, - "quic missing ALPN extension"); - return 1; - } - - if (!qc->client_tp_done) { - /* RFC 9001, 8.2. QUIC Transport Parameters Extension */ - qc->error = NGX_QUIC_ERR_CRYPTO(SSL_AD_MISSING_EXTENSION); - qc->error_reason = "missing transport parameters"; - - ngx_log_error(NGX_LOG_INFO, c->log, 0, - "missing transport parameters"); - return 1; - } - - ctx = ngx_quic_get_send_ctx(qc, qc->write_level); - - out = ngx_quic_copy_buffer(c, (u_char *) data, len); - if (out == NGX_CHAIN_ERROR) { - qc->error = NGX_QUIC_ERR_INTERNAL_ERROR; - return 1; - } - - frame = ngx_quic_alloc_frame(c); - if (frame == NULL) { - qc->error = NGX_QUIC_ERR_INTERNAL_ERROR; - return 1; - } - - frame->data = out; - frame->level = qc->write_level; - frame->type = NGX_QUIC_FT_CRYPTO; - frame->u.crypto.offset = ctx->crypto_sent; - frame->u.crypto.length = len; - - ctx->crypto_sent += len; - *consumed = len; - - ngx_quic_queue_frame(qc, frame); - - return 1; -} - - -static int -ngx_quic_cbs_recv_rcd(ngx_ssl_conn_t *ssl_conn, - const unsigned char **data, size_t *bytes_read, void *arg) -{ - ngx_connection_t *c = arg; - - ngx_buf_t *b; - ngx_chain_t *cl; - ngx_quic_send_ctx_t *ctx; - ngx_quic_connection_t *qc; - - ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0, - "quic ngx_quic_cbs_recv_rcd"); - - qc = ngx_quic_get_connection(c); - ctx = ngx_quic_get_send_ctx(qc, qc->read_level); - - for (cl = ctx->crypto.chain; cl; cl = cl->next) { - b = cl->buf; - - if (b->sync) { - /* hole */ - - *bytes_read = 0; - - break; - } - - *data = b->pos; - *bytes_read = b->last - b->pos; - - break; - } - - return 1; -} - - -static int -ngx_quic_cbs_release_rcd(ngx_ssl_conn_t *ssl_conn, size_t bytes_read, void *arg) -{ - ngx_connection_t *c = arg; - - ngx_chain_t *cl; - ngx_quic_send_ctx_t *ctx; - ngx_quic_connection_t *qc; - - ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, - "quic ngx_quic_cbs_release_rcd len:%uz", bytes_read); - - /* already closed on handshake failure */ - - qc = ngx_quic_get_connection(c); - if (qc == NULL) { - return 1; - } - - ctx = ngx_quic_get_send_ctx(qc, qc->read_level); - - cl = ngx_quic_read_buffer(c, &ctx->crypto, bytes_read); - if (cl == NGX_CHAIN_ERROR) { - qc->error = NGX_QUIC_ERR_INTERNAL_ERROR; - return 1; - } - - ngx_quic_free_chain(c, cl); - - return 1; -} - - -static int -ngx_quic_cbs_yield_secret(ngx_ssl_conn_t *ssl_conn, uint32_t ssl_level, - int direction, const unsigned char *secret, size_t secret_len, void *arg) -{ - ngx_connection_t *c = arg; - - ngx_uint_t level; - const SSL_CIPHER *cipher; - ngx_quic_connection_t *qc; - - ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, - "quic ngx_quic_cbs_yield_secret() level:%uD", ssl_level); -#ifdef NGX_QUIC_DEBUG_CRYPTO - ngx_log_debug4(NGX_LOG_DEBUG_EVENT, c->log, 0, - "quic %s secret len:%uz %*xs", - direction ? "write" : "read", secret_len, - secret_len, secret); -#endif - - qc = ngx_quic_get_connection(c); - cipher = SSL_get_current_cipher(ssl_conn); - - switch (ssl_level) { - case OSSL_RECORD_PROTECTION_LEVEL_NONE: - level = NGX_QUIC_ENCRYPTION_INITIAL; - break; - case OSSL_RECORD_PROTECTION_LEVEL_EARLY: - level = NGX_QUIC_ENCRYPTION_EARLY_DATA; - break; - case OSSL_RECORD_PROTECTION_LEVEL_HANDSHAKE: - level = NGX_QUIC_ENCRYPTION_HANDSHAKE; - break; - default: /* OSSL_RECORD_PROTECTION_LEVEL_APPLICATION */ - level = NGX_QUIC_ENCRYPTION_APPLICATION; - break; - } - - if (ngx_quic_keys_set_encryption_secret(c->log, direction, qc->keys, level, - cipher, secret, secret_len) - != NGX_OK) - { - qc->error = NGX_QUIC_ERR_INTERNAL_ERROR; - return 1; - } - - if (direction) { - qc->write_level = level; - - } else { - qc->read_level = level; - } - - return 1; -} - - -static int -ngx_quic_cbs_got_transport_params(ngx_ssl_conn_t *ssl_conn, - const unsigned char *params, size_t params_len, void *arg) -{ - ngx_connection_t *c = arg; - - u_char *p, *end; - ngx_quic_tp_t ctp; - ngx_quic_connection_t *qc; - - ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, - "quic ngx_quic_cbs_got_transport_params() len:%uz", - params_len); - - qc = ngx_quic_get_connection(c); - - /* defaults for parameters not sent by client */ - ngx_memcpy(&ctp, &qc->ctp, sizeof(ngx_quic_tp_t)); - - p = (u_char *) params; - end = p + params_len; - - if (ngx_quic_parse_transport_params(p, end, &ctp, c->log) != NGX_OK) { - qc->error = NGX_QUIC_ERR_TRANSPORT_PARAMETER_ERROR; - qc->error_reason = "failed to process transport parameters"; - - return 1; - } - - if (ngx_quic_apply_transport_params(c, &ctp) != NGX_OK) { - return 1; - } - - qc->client_tp_done = 1; - - return 1; -} - - -static int -ngx_quic_cbs_alert(ngx_ssl_conn_t *ssl_conn, unsigned char alert, void *arg) -{ - ngx_connection_t *c = arg; - - ngx_quic_connection_t *qc; - - ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, - "quic ngx_quic_cbs_alert() alert:%d", (int) alert); - - /* already closed on regular shutdown */ - - qc = ngx_quic_get_connection(c); - if (qc == NULL) { - return 1; - } - - qc->error = NGX_QUIC_ERR_CRYPTO(alert); - qc->error_reason = "handshake failed"; - - return 1; -} - - -#else /* NGX_QUIC_BORINGSSL_API || NGX_QUIC_QUICTLS_API */ - - -static ngx_inline ngx_uint_t -ngx_quic_map_encryption_level(enum ssl_encryption_level_t ssl_level) -{ - switch (ssl_level) { - case ssl_encryption_initial: - return NGX_QUIC_ENCRYPTION_INITIAL; - case ssl_encryption_early_data: - return NGX_QUIC_ENCRYPTION_EARLY_DATA; - case ssl_encryption_handshake: - return NGX_QUIC_ENCRYPTION_HANDSHAKE; - default: /* ssl_encryption_application */ - return NGX_QUIC_ENCRYPTION_APPLICATION; - } -} - - -#if (NGX_QUIC_BORINGSSL_API) - -static int -ngx_quic_set_read_secret(ngx_ssl_conn_t *ssl_conn, - enum ssl_encryption_level_t ssl_level, const SSL_CIPHER *cipher, - const uint8_t *rsecret, size_t secret_len) -{ - ngx_uint_t level; - ngx_connection_t *c; - ngx_quic_connection_t *qc; - - c = ngx_ssl_get_connection(ssl_conn); - qc = ngx_quic_get_connection(c); - level = ngx_quic_map_encryption_level(ssl_level); - - ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, - "quic ngx_quic_set_read_secret() level:%d", ssl_level); -#ifdef NGX_QUIC_DEBUG_CRYPTO - ngx_log_debug3(NGX_LOG_DEBUG_EVENT, c->log, 0, - "quic read secret len:%uz %*xs", secret_len, - secret_len, rsecret); -#endif - - if (ngx_quic_keys_set_encryption_secret(c->log, 0, qc->keys, level, - cipher, rsecret, secret_len) - != NGX_OK) - { - qc->error = NGX_QUIC_ERR_INTERNAL_ERROR; - } - - return 1; -} - - -static int -ngx_quic_set_write_secret(ngx_ssl_conn_t *ssl_conn, - enum ssl_encryption_level_t ssl_level, const SSL_CIPHER *cipher, - const uint8_t *wsecret, size_t secret_len) -{ - ngx_uint_t level; - ngx_connection_t *c; - ngx_quic_connection_t *qc; - - c = ngx_ssl_get_connection(ssl_conn); - qc = ngx_quic_get_connection(c); - level = ngx_quic_map_encryption_level(ssl_level); - - ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, - "quic ngx_quic_set_write_secret() level:%d", ssl_level); -#ifdef NGX_QUIC_DEBUG_CRYPTO - ngx_log_debug3(NGX_LOG_DEBUG_EVENT, c->log, 0, - "quic write secret len:%uz %*xs", secret_len, - secret_len, wsecret); -#endif - - if (ngx_quic_keys_set_encryption_secret(c->log, 1, qc->keys, level, - cipher, wsecret, secret_len) - != NGX_OK) - { - qc->error = NGX_QUIC_ERR_INTERNAL_ERROR; - } - - return 1; -} - -#else /* NGX_QUIC_QUICTLS_API */ - -static int -ngx_quic_set_encryption_secrets(ngx_ssl_conn_t *ssl_conn, - enum ssl_encryption_level_t ssl_level, const uint8_t *rsecret, - const uint8_t *wsecret, size_t secret_len) -{ - ngx_uint_t level; - ngx_connection_t *c; - const SSL_CIPHER *cipher; - ngx_quic_connection_t *qc; - - c = ngx_ssl_get_connection(ssl_conn); - qc = ngx_quic_get_connection(c); - level = ngx_quic_map_encryption_level(ssl_level); - - ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, - "quic ngx_quic_set_encryption_secrets() level:%d", - ssl_level); -#ifdef NGX_QUIC_DEBUG_CRYPTO - ngx_log_debug3(NGX_LOG_DEBUG_EVENT, c->log, 0, - "quic read secret len:%uz %*xs", secret_len, - secret_len, rsecret); -#endif - - cipher = SSL_get_current_cipher(ssl_conn); - - if (ngx_quic_keys_set_encryption_secret(c->log, 0, qc->keys, level, - cipher, rsecret, secret_len) - != NGX_OK) - { - qc->error = NGX_QUIC_ERR_INTERNAL_ERROR; - return 1; - } - - if (level == NGX_QUIC_ENCRYPTION_EARLY_DATA) { - return 1; - } - -#ifdef NGX_QUIC_DEBUG_CRYPTO - ngx_log_debug3(NGX_LOG_DEBUG_EVENT, c->log, 0, - "quic write secret len:%uz %*xs", secret_len, - secret_len, wsecret); -#endif - - if (ngx_quic_keys_set_encryption_secret(c->log, 1, qc->keys, level, - cipher, wsecret, secret_len) - != NGX_OK) - { - qc->error = NGX_QUIC_ERR_INTERNAL_ERROR; - } - - return 1; -} - -#endif - - -static int -ngx_quic_add_handshake_data(ngx_ssl_conn_t *ssl_conn, - enum ssl_encryption_level_t ssl_level, const uint8_t *data, size_t len) -{ - u_char *p, *end; - size_t client_params_len; - ngx_uint_t level; - ngx_chain_t *out; - unsigned int alpn_len; - const uint8_t *client_params; - ngx_quic_tp_t ctp; - ngx_quic_frame_t *frame; - ngx_connection_t *c; - const unsigned char *alpn_data; - ngx_quic_send_ctx_t *ctx; - ngx_quic_connection_t *qc; - - c = ngx_ssl_get_connection(ssl_conn); - qc = ngx_quic_get_connection(c); - level = ngx_quic_map_encryption_level(ssl_level); - - ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0, - "quic ngx_quic_add_handshake_data"); - - if (!qc->client_tp_done) { - /* - * things to do once during handshake: check ALPN and transport - * parameters; we want to break handshake if something is wrong - * here; - */ - - SSL_get0_alpn_selected(ssl_conn, &alpn_data, &alpn_len); - - if (alpn_len == 0) { - if (qc->error == 0) { - qc->error = NGX_QUIC_ERR_CRYPTO(SSL_AD_NO_APPLICATION_PROTOCOL); - qc->error_reason = "missing ALPN extension"; - - ngx_log_error(NGX_LOG_INFO, c->log, 0, - "quic missing ALPN extension"); - } - - return 1; - } - - SSL_get_peer_quic_transport_params(ssl_conn, &client_params, - &client_params_len); - - ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, - "quic SSL_get_peer_quic_transport_params():" - " params_len:%ui", client_params_len); - - if (client_params_len == 0) { - /* RFC 9001, 8.2. QUIC Transport Parameters Extension */ - - if (qc->error == 0) { - qc->error = NGX_QUIC_ERR_CRYPTO(SSL_AD_MISSING_EXTENSION); - qc->error_reason = "missing transport parameters"; - - ngx_log_error(NGX_LOG_INFO, c->log, 0, - "missing transport parameters"); - } - - return 1; - } - - p = (u_char *) client_params; - end = p + client_params_len; - - /* defaults for parameters not sent by client */ - ngx_memcpy(&ctp, &qc->ctp, sizeof(ngx_quic_tp_t)); - - if (ngx_quic_parse_transport_params(p, end, &ctp, c->log) - != NGX_OK) - { - qc->error = NGX_QUIC_ERR_TRANSPORT_PARAMETER_ERROR; - qc->error_reason = "failed to process transport parameters"; - - return 1; - } - - if (ngx_quic_apply_transport_params(c, &ctp) != NGX_OK) { - return 1; - } - - qc->client_tp_done = 1; - } - - ctx = ngx_quic_get_send_ctx(qc, level); - - out = ngx_quic_copy_buffer(c, (u_char *) data, len); - if (out == NGX_CHAIN_ERROR) { - qc->error = NGX_QUIC_ERR_INTERNAL_ERROR; - return 1; - } - - frame = ngx_quic_alloc_frame(c); - if (frame == NULL) { - qc->error = NGX_QUIC_ERR_INTERNAL_ERROR; - return 1; - } - - frame->data = out; - frame->level = level; - frame->type = NGX_QUIC_FT_CRYPTO; - frame->u.crypto.offset = ctx->crypto_sent; - frame->u.crypto.length = len; - - ctx->crypto_sent += len; - - ngx_quic_queue_frame(qc, frame); - - return 1; -} - - -static int -ngx_quic_flush_flight(ngx_ssl_conn_t *ssl_conn) -{ -#if (NGX_DEBUG) - ngx_connection_t *c; - - c = ngx_ssl_get_connection(ssl_conn); - - ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0, - "quic ngx_quic_flush_flight()"); -#endif - return 1; -} - - -static int -ngx_quic_send_alert(ngx_ssl_conn_t *ssl_conn, - enum ssl_encryption_level_t ssl_level, uint8_t alert) -{ - ngx_connection_t *c; - ngx_quic_connection_t *qc; - - c = ngx_ssl_get_connection(ssl_conn); - - ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0, - "quic ngx_quic_send_alert() level:%d alert:%d", - ssl_level, (int) alert); - - /* already closed on regular shutdown */ - - qc = ngx_quic_get_connection(c); - if (qc == NULL) { - return 1; - } - - qc->error = NGX_QUIC_ERR_CRYPTO(alert); - qc->error_reason = "handshake failed"; - - return 1; -} - -#endif - - -ngx_int_t -ngx_quic_handle_crypto_frame(ngx_connection_t *c, ngx_quic_header_t *pkt, - ngx_quic_frame_t *frame) -{ - uint64_t last; - ngx_quic_send_ctx_t *ctx; - ngx_quic_connection_t *qc; - ngx_quic_crypto_frame_t *f; - - qc = ngx_quic_get_connection(c); - - if (!ngx_quic_keys_available(qc->keys, pkt->level, 0)) { - return NGX_OK; - } - - ctx = ngx_quic_get_send_ctx(qc, pkt->level); - f = &frame->u.crypto; - - /* no overflow since both values are 62-bit */ - last = f->offset + f->length; - - if (last > ctx->crypto.offset + NGX_QUIC_MAX_BUFFERED) { - qc->error = NGX_QUIC_ERR_CRYPTO_BUFFER_EXCEEDED; - return NGX_ERROR; - } - - if (last <= ctx->crypto.offset) { - if (pkt->level == NGX_QUIC_ENCRYPTION_INITIAL) { - /* speeding up handshake completion */ - - if (!ngx_queue_empty(&ctx->sent)) { - ngx_quic_resend_frames(c, ctx); - - ctx = ngx_quic_get_send_ctx(qc, NGX_QUIC_ENCRYPTION_HANDSHAKE); - while (!ngx_queue_empty(&ctx->sent)) { - ngx_quic_resend_frames(c, ctx); - } - } - } - - return NGX_OK; - } - - if (ngx_quic_write_buffer(c, &ctx->crypto, frame->data, f->length, - f->offset) - == NGX_CHAIN_ERROR) - { - return NGX_ERROR; - } - - if (ngx_quic_crypto_provide(c, pkt->level) != NGX_OK) { - return NGX_ERROR; - } - - return ngx_quic_handshake(c); -} - - -static ngx_int_t -ngx_quic_handshake(ngx_connection_t *c) -{ - int n, sslerr; - ngx_ssl_conn_t *ssl_conn; - ngx_quic_frame_t *frame; - ngx_quic_connection_t *qc; - - qc = ngx_quic_get_connection(c); - - ssl_conn = c->ssl->connection; - - n = SSL_do_handshake(ssl_conn); - - ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, "SSL_do_handshake: %d", n); - - if (n <= 0) { - sslerr = SSL_get_error(ssl_conn, n); - - ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, "SSL_get_error: %d", - sslerr); - - if (c->ssl->handshake_rejected) { - ngx_connection_error(c, 0, "handshake rejected"); - ERR_clear_error(); - return NGX_ERROR; - } - - if (qc->error) { - ngx_connection_error(c, 0, "SSL_do_handshake() failed"); - ERR_clear_error(); - return NGX_ERROR; - } - - if (sslerr != SSL_ERROR_WANT_READ) { - ngx_ssl_connection_error(c, sslerr, 0, "SSL_do_handshake() failed"); - return NGX_ERROR; - } - } - - if (qc->error) { - ngx_connection_error(c, 0, "SSL_do_handshake() failed"); - return NGX_ERROR; - } - - if (!SSL_is_init_finished(ssl_conn)) { - if (ngx_quic_keys_available(qc->keys, NGX_QUIC_ENCRYPTION_EARLY_DATA, 0) - && qc->client_tp_done) - { - if (ngx_quic_init_streams(c) != NGX_OK) { - return NGX_ERROR; - } - } - - return NGX_OK; - } - -#if (NGX_DEBUG) - ngx_ssl_handshake_log(c); -#endif - - c->ssl->handshaked = 1; - - frame = ngx_quic_alloc_frame(c); - if (frame == NULL) { - return NGX_ERROR; - } - - frame->level = NGX_QUIC_ENCRYPTION_APPLICATION; - frame->type = NGX_QUIC_FT_HANDSHAKE_DONE; - ngx_quic_queue_frame(qc, frame); - - if (qc->conf->retry) { - if (ngx_quic_send_new_token(c, qc->path) != NGX_OK) { - return NGX_ERROR; - } - } - - /* - * RFC 9001, 9.5. Header Protection Timing Side Channels - * - * Generating next keys before a key update is received. - */ - - ngx_post_event(&qc->key_update, &ngx_posted_events); - - /* - * RFC 9001, 4.9.2. Discarding Handshake Keys - * - * An endpoint MUST discard its Handshake keys - * when the TLS handshake is confirmed. - */ - ngx_quic_discard_ctx(c, NGX_QUIC_ENCRYPTION_HANDSHAKE); - - ngx_quic_discover_path_mtu(c, qc->path); - - /* start accepting clients on negotiated number of server ids */ - if (ngx_quic_create_sockets(c) != NGX_OK) { - return NGX_ERROR; - } - - if (ngx_quic_init_streams(c) != NGX_OK) { - return NGX_ERROR; - } - - return NGX_OK; -} - - -static ngx_int_t -ngx_quic_crypto_provide(ngx_connection_t *c, ngx_uint_t level) -{ -#if (NGX_QUIC_BORINGSSL_API || NGX_QUIC_QUICTLS_API) - - ngx_buf_t *b; - ngx_chain_t *out, *cl; - ngx_quic_send_ctx_t *ctx; - ngx_quic_connection_t *qc; - enum ssl_encryption_level_t ssl_level; - - qc = ngx_quic_get_connection(c); - ctx = ngx_quic_get_send_ctx(qc, level); - - out = ngx_quic_read_buffer(c, &ctx->crypto, (uint64_t) -1); - if (out == NGX_CHAIN_ERROR) { - return NGX_ERROR; - } - - switch (level) { - case NGX_QUIC_ENCRYPTION_INITIAL: - ssl_level = ssl_encryption_initial; - break; - case NGX_QUIC_ENCRYPTION_EARLY_DATA: - ssl_level = ssl_encryption_early_data; - break; - case NGX_QUIC_ENCRYPTION_HANDSHAKE: - ssl_level = ssl_encryption_handshake; - break; - default: /* NGX_QUIC_ENCRYPTION_APPLICATION */ - ssl_level = ssl_encryption_application; - break; - } - - for (cl = out; cl; cl = cl->next) { - b = cl->buf; - - if (!SSL_provide_quic_data(c->ssl->connection, ssl_level, b->pos, - b->last - b->pos)) - { - ngx_ssl_error(NGX_LOG_ALERT, c->log, 0, - "SSL_provide_quic_data() failed"); - return NGX_ERROR; - } - } - - ngx_quic_free_chain(c, out); - -#endif - - return NGX_OK; -} - - -ngx_int_t -ngx_quic_init_connection(ngx_connection_t *c) -{ - u_char *p; - size_t clen; - ssize_t len; - ngx_str_t dcid; - ngx_ssl_conn_t *ssl_conn; - ngx_quic_socket_t *qsock; - ngx_quic_connection_t *qc; - -#if (NGX_QUIC_OPENSSL_API) - static const OSSL_DISPATCH qtdis[] = { - - { OSSL_FUNC_SSL_QUIC_TLS_CRYPTO_SEND, - (void (*)(void)) ngx_quic_cbs_send }, - - { OSSL_FUNC_SSL_QUIC_TLS_CRYPTO_RECV_RCD, - (void (*)(void)) ngx_quic_cbs_recv_rcd }, - - { OSSL_FUNC_SSL_QUIC_TLS_CRYPTO_RELEASE_RCD, - (void (*)(void)) ngx_quic_cbs_release_rcd }, - - { OSSL_FUNC_SSL_QUIC_TLS_YIELD_SECRET, - (void (*)(void)) ngx_quic_cbs_yield_secret }, - - { OSSL_FUNC_SSL_QUIC_TLS_GOT_TRANSPORT_PARAMS, - (void (*)(void)) ngx_quic_cbs_got_transport_params }, - - { OSSL_FUNC_SSL_QUIC_TLS_ALERT, - (void (*)(void)) ngx_quic_cbs_alert }, - - { 0, NULL } - }; -#else /* NGX_QUIC_BORINGSSL_API || NGX_QUIC_QUICTLS_API */ - static SSL_QUIC_METHOD quic_method; -#endif - - qc = ngx_quic_get_connection(c); - - if (ngx_ssl_create_connection(qc->conf->ssl, c, 0) != NGX_OK) { - return NGX_ERROR; - } - - c->ssl->no_wait_shutdown = 1; - - ssl_conn = c->ssl->connection; - -#if (NGX_QUIC_OPENSSL_API) - - if (SSL_set_quic_tls_cbs(ssl_conn, qtdis, c) == 0) { - ngx_ssl_error(NGX_LOG_ALERT, c->log, 0, - "quic SSL_set_quic_tls_cbs() failed"); - return NGX_ERROR; - } - - if (SSL_CTX_get_max_early_data(qc->conf->ssl->ctx)) { - SSL_set_quic_tls_early_data_enabled(ssl_conn, 1); - } - -#else /* NGX_QUIC_BORINGSSL_API || NGX_QUIC_QUICTLS_API */ - - if (!quic_method.send_alert) { -#if (NGX_QUIC_BORINGSSL_API) - quic_method.set_read_secret = ngx_quic_set_read_secret; - quic_method.set_write_secret = ngx_quic_set_write_secret; -#else - quic_method.set_encryption_secrets = ngx_quic_set_encryption_secrets; -#endif - quic_method.add_handshake_data = ngx_quic_add_handshake_data; - quic_method.flush_flight = ngx_quic_flush_flight; - quic_method.send_alert = ngx_quic_send_alert; - } - - if (SSL_set_quic_method(ssl_conn, &quic_method) == 0) { - ngx_ssl_error(NGX_LOG_ALERT, c->log, 0, - "quic SSL_set_quic_method() failed"); - return NGX_ERROR; - } - -#if (NGX_QUIC_QUICTLS_API) - if (SSL_CTX_get_max_early_data(qc->conf->ssl->ctx)) { - SSL_set_quic_early_data_enabled(ssl_conn, 1); - } -#endif - -#endif - - qsock = ngx_quic_get_socket(c); - - dcid.data = qsock->sid.id; - dcid.len = qsock->sid.len; - - if (ngx_quic_new_sr_token(c, &dcid, qc->conf->sr_token_key, qc->tp.sr_token) - != NGX_OK) - { - return NGX_ERROR; - } - - len = ngx_quic_create_transport_params(NULL, NULL, &qc->tp, &clen); - /* always succeeds */ - - p = ngx_pnalloc(c->pool, len); - if (p == NULL) { - return NGX_ERROR; - } - - len = ngx_quic_create_transport_params(p, p + len, &qc->tp, NULL); - if (len < 0) { - return NGX_ERROR; - } - -#ifdef NGX_QUIC_DEBUG_PACKETS - ngx_log_debug3(NGX_LOG_DEBUG_EVENT, c->log, 0, - "quic transport parameters len:%uz %*xs", len, len, p); -#endif - -#if (NGX_QUIC_OPENSSL_API) - if (SSL_set_quic_tls_transport_params(ssl_conn, p, len) == 0) { - ngx_ssl_error(NGX_LOG_ALERT, c->log, 0, - "quic SSL_set_quic_tls_transport_params() failed"); - return NGX_ERROR; - } -#else - if (SSL_set_quic_transport_params(ssl_conn, p, len) == 0) { - ngx_ssl_error(NGX_LOG_ALERT, c->log, 0, - "quic SSL_set_quic_transport_params() failed"); - return NGX_ERROR; - } -#endif - -#if (defined OPENSSL_IS_BORINGSSL || defined OPENSSL_IS_AWSLC) - if (SSL_set_quic_early_data_context(ssl_conn, p, clen) == 0) { - ngx_ssl_error(NGX_LOG_ALERT, c->log, 0, - "quic SSL_set_quic_early_data_context() failed"); - return NGX_ERROR; - } -#endif - - return NGX_OK; -} diff --git a/src/deps/src/nginx-1.30.3/src/event/quic/ngx_event_quic_ssl.h b/src/deps/src/nginx-1.30.3/src/event/quic/ngx_event_quic_ssl.h deleted file mode 100644 index ee0aa07c9b..0000000000 --- a/src/deps/src/nginx-1.30.3/src/event/quic/ngx_event_quic_ssl.h +++ /dev/null @@ -1,19 +0,0 @@ - -/* - * Copyright (C) Nginx, Inc. - */ - - -#ifndef _NGX_EVENT_QUIC_SSL_H_INCLUDED_ -#define _NGX_EVENT_QUIC_SSL_H_INCLUDED_ - - -#include -#include - -ngx_int_t ngx_quic_init_connection(ngx_connection_t *c); - -ngx_int_t ngx_quic_handle_crypto_frame(ngx_connection_t *c, - ngx_quic_header_t *pkt, ngx_quic_frame_t *frame); - -#endif /* _NGX_EVENT_QUIC_SSL_H_INCLUDED_ */ diff --git a/src/deps/src/nginx-1.30.3/src/event/quic/ngx_event_quic_streams.c b/src/deps/src/nginx-1.30.3/src/event/quic/ngx_event_quic_streams.c deleted file mode 100644 index 18fffeabe4..0000000000 --- a/src/deps/src/nginx-1.30.3/src/event/quic/ngx_event_quic_streams.c +++ /dev/null @@ -1,1828 +0,0 @@ - -/* - * Copyright (C) Nginx, Inc. - */ - - -#include -#include -#include -#include - - -#define NGX_QUIC_STREAM_GONE (void *) -1 - - -static ngx_int_t ngx_quic_do_reset_stream(ngx_quic_stream_t *qs, - ngx_uint_t err); -static ngx_int_t ngx_quic_shutdown_stream_send(ngx_connection_t *c); -static ngx_int_t ngx_quic_shutdown_stream_recv(ngx_connection_t *c); -static ngx_quic_stream_t *ngx_quic_get_stream(ngx_connection_t *c, uint64_t id); -static ngx_int_t ngx_quic_reject_stream(ngx_connection_t *c, uint64_t id); -static void ngx_quic_init_stream_handler(ngx_event_t *ev); -static void ngx_quic_init_streams_handler(ngx_connection_t *c); -static ngx_int_t ngx_quic_do_init_streams(ngx_connection_t *c); -static ngx_quic_stream_t *ngx_quic_create_stream(ngx_connection_t *c, - uint64_t id); -static void ngx_quic_empty_handler(ngx_event_t *ev); -static ssize_t ngx_quic_stream_recv(ngx_connection_t *c, u_char *buf, - size_t size); -static ssize_t ngx_quic_stream_send(ngx_connection_t *c, u_char *buf, - size_t size); -static ngx_chain_t *ngx_quic_stream_send_chain(ngx_connection_t *c, - ngx_chain_t *in, off_t limit); -static ngx_int_t ngx_quic_stream_flush(ngx_quic_stream_t *qs); -static void ngx_quic_stream_cleanup_handler(void *data); -static ngx_int_t ngx_quic_close_stream(ngx_quic_stream_t *qs); -static ngx_int_t ngx_quic_can_shutdown(ngx_connection_t *c); -static ngx_int_t ngx_quic_control_flow(ngx_quic_stream_t *qs, uint64_t last); -static ngx_int_t ngx_quic_update_flow(ngx_quic_stream_t *qs, uint64_t last); -static ngx_int_t ngx_quic_update_max_stream_data(ngx_quic_stream_t *qs); -static ngx_int_t ngx_quic_update_max_data(ngx_connection_t *c); -static void ngx_quic_set_event(ngx_event_t *ev); - - -ngx_connection_t * -ngx_quic_open_stream(ngx_connection_t *c, ngx_uint_t bidi) -{ - uint64_t id; - ngx_connection_t *pc, *sc; - ngx_quic_stream_t *qs; - ngx_quic_connection_t *qc; - - pc = c->quic ? c->quic->parent : c; - qc = ngx_quic_get_connection(pc); - - if (qc->closing) { - return NULL; - } - - if (bidi) { - if (qc->streams.server_streams_bidi - >= qc->streams.server_max_streams_bidi) - { - ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, - "quic too many server bidi streams:%uL", - qc->streams.server_streams_bidi); - return NULL; - } - - id = (qc->streams.server_streams_bidi << 2) - | NGX_QUIC_STREAM_SERVER_INITIATED; - - ngx_log_debug3(NGX_LOG_DEBUG_EVENT, c->log, 0, - "quic creating server bidi stream" - " streams:%uL max:%uL id:0x%xL", - qc->streams.server_streams_bidi, - qc->streams.server_max_streams_bidi, id); - - qc->streams.server_streams_bidi++; - - } else { - if (qc->streams.server_streams_uni - >= qc->streams.server_max_streams_uni) - { - ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, - "quic too many server uni streams:%uL", - qc->streams.server_streams_uni); - return NULL; - } - - id = (qc->streams.server_streams_uni << 2) - | NGX_QUIC_STREAM_SERVER_INITIATED - | NGX_QUIC_STREAM_UNIDIRECTIONAL; - - ngx_log_debug3(NGX_LOG_DEBUG_EVENT, c->log, 0, - "quic creating server uni stream" - " streams:%uL max:%uL id:0x%xL", - qc->streams.server_streams_uni, - qc->streams.server_max_streams_uni, id); - - qc->streams.server_streams_uni++; - } - - qs = ngx_quic_create_stream(pc, id); - if (qs == NULL) { - return NULL; - } - - sc = qs->connection; - - sc->write->active = 1; - sc->write->ready = 1; - - if (bidi) { - sc->read->active = 1; - } - - return sc; -} - - -void -ngx_quic_rbtree_insert_stream(ngx_rbtree_node_t *temp, - ngx_rbtree_node_t *node, ngx_rbtree_node_t *sentinel) -{ - ngx_rbtree_node_t **p; - ngx_quic_stream_t *qn, *qnt; - - for ( ;; ) { - qn = (ngx_quic_stream_t *) node; - qnt = (ngx_quic_stream_t *) temp; - - p = (qn->id < qnt->id) ? &temp->left : &temp->right; - - if (*p == sentinel) { - break; - } - - temp = *p; - } - - *p = node; - node->parent = temp; - node->left = sentinel; - node->right = sentinel; - ngx_rbt_red(node); -} - - -ngx_quic_stream_t * -ngx_quic_find_stream(ngx_rbtree_t *rbtree, uint64_t id) -{ - ngx_rbtree_node_t *node, *sentinel; - ngx_quic_stream_t *qn; - - node = rbtree->root; - sentinel = rbtree->sentinel; - - while (node != sentinel) { - qn = (ngx_quic_stream_t *) node; - - if (id == qn->id) { - return qn; - } - - node = (id < qn->id) ? node->left : node->right; - } - - return NULL; -} - - -ngx_int_t -ngx_quic_close_streams(ngx_connection_t *c, ngx_quic_connection_t *qc) -{ - ngx_pool_t *pool; - ngx_queue_t *q, posted_events; - ngx_rbtree_t *tree; - ngx_connection_t *sc; - ngx_rbtree_node_t *node; - ngx_quic_stream_t *qs; - - while (!ngx_queue_empty(&qc->streams.uninitialized)) { - q = ngx_queue_head(&qc->streams.uninitialized); - ngx_queue_remove(q); - - qs = ngx_queue_data(q, ngx_quic_stream_t, queue); - pool = qs->connection->pool; - - ngx_close_connection(qs->connection); - ngx_destroy_pool(pool); - } - - tree = &qc->streams.tree; - - if (tree->root == tree->sentinel) { - return NGX_OK; - } - - ngx_queue_init(&posted_events); - - node = ngx_rbtree_min(tree->root, tree->sentinel); - - while (node) { - qs = (ngx_quic_stream_t *) node; - node = ngx_rbtree_next(tree, node); - sc = qs->connection; - - qs->recv_state = NGX_QUIC_STREAM_RECV_RESET_RECVD; - qs->send_state = NGX_QUIC_STREAM_SEND_RESET_SENT; - - if (sc == NULL) { - ngx_quic_close_stream(qs); - continue; - } - - sc->read->error = 1; - sc->read->ready = 1; - sc->write->error = 1; - sc->write->ready = 1; - - sc->close = 1; - - if (sc->read->posted) { - ngx_delete_posted_event(sc->read); - } - - ngx_post_event(sc->read, &posted_events); - } - - ngx_event_process_posted((ngx_cycle_t *) ngx_cycle, &posted_events); - - if (tree->root == tree->sentinel) { - return NGX_OK; - } - - ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0, - "quic connection has active streams"); - - return NGX_AGAIN; -} - - -ngx_int_t -ngx_quic_reset_stream(ngx_connection_t *c, ngx_uint_t err) -{ - return ngx_quic_do_reset_stream(c->quic, err); -} - - -static ngx_int_t -ngx_quic_do_reset_stream(ngx_quic_stream_t *qs, ngx_uint_t err) -{ - ngx_connection_t *pc; - ngx_quic_frame_t *frame; - ngx_quic_connection_t *qc; - - if (qs->send_state == NGX_QUIC_STREAM_SEND_DATA_RECVD - || qs->send_state == NGX_QUIC_STREAM_SEND_RESET_SENT - || qs->send_state == NGX_QUIC_STREAM_SEND_RESET_RECVD) - { - return NGX_OK; - } - - qs->send_state = NGX_QUIC_STREAM_SEND_RESET_SENT; - qs->send_final_size = qs->send_offset; - - if (qs->connection) { - qs->connection->write->error = 1; - } - - pc = qs->parent; - qc = ngx_quic_get_connection(pc); - - ngx_log_debug1(NGX_LOG_DEBUG_EVENT, pc->log, 0, - "quic stream id:0x%xL reset", qs->id); - - frame = ngx_quic_alloc_frame(pc); - if (frame == NULL) { - return NGX_ERROR; - } - - frame->level = NGX_QUIC_ENCRYPTION_APPLICATION; - frame->type = NGX_QUIC_FT_RESET_STREAM; - frame->u.reset_stream.id = qs->id; - frame->u.reset_stream.error_code = err; - frame->u.reset_stream.final_size = qs->send_offset; - - ngx_quic_queue_frame(qc, frame); - - ngx_quic_free_buffer(pc, &qs->send); - - return NGX_OK; -} - - -ngx_int_t -ngx_quic_shutdown_stream(ngx_connection_t *c, int how) -{ - if (how == NGX_RDWR_SHUTDOWN || how == NGX_WRITE_SHUTDOWN) { - if (ngx_quic_shutdown_stream_send(c) != NGX_OK) { - return NGX_ERROR; - } - } - - if (how == NGX_RDWR_SHUTDOWN || how == NGX_READ_SHUTDOWN) { - if (ngx_quic_shutdown_stream_recv(c) != NGX_OK) { - return NGX_ERROR; - } - } - - return NGX_OK; -} - - -static ngx_int_t -ngx_quic_shutdown_stream_send(ngx_connection_t *c) -{ - ngx_quic_stream_t *qs; - - qs = c->quic; - - if (qs->send_state != NGX_QUIC_STREAM_SEND_READY - && qs->send_state != NGX_QUIC_STREAM_SEND_SEND) - { - return NGX_OK; - } - - qs->send_state = NGX_QUIC_STREAM_SEND_SEND; - qs->send_final_size = c->sent; - - ngx_log_debug1(NGX_LOG_DEBUG_EVENT, qs->parent->log, 0, - "quic stream id:0x%xL send shutdown", qs->id); - - return ngx_quic_stream_flush(qs); -} - - -static ngx_int_t -ngx_quic_shutdown_stream_recv(ngx_connection_t *c) -{ - ngx_connection_t *pc; - ngx_quic_frame_t *frame; - ngx_quic_stream_t *qs; - ngx_quic_connection_t *qc; - - qs = c->quic; - - if (qs->recv_state != NGX_QUIC_STREAM_RECV_RECV - && qs->recv_state != NGX_QUIC_STREAM_RECV_SIZE_KNOWN) - { - return NGX_OK; - } - - pc = qs->parent; - qc = ngx_quic_get_connection(pc); - - if (qc->conf->stream_close_code == 0) { - return NGX_OK; - } - - frame = ngx_quic_alloc_frame(pc); - if (frame == NULL) { - return NGX_ERROR; - } - - ngx_log_debug1(NGX_LOG_DEBUG_EVENT, pc->log, 0, - "quic stream id:0x%xL recv shutdown", qs->id); - - frame->level = NGX_QUIC_ENCRYPTION_APPLICATION; - frame->type = NGX_QUIC_FT_STOP_SENDING; - frame->u.stop_sending.id = qs->id; - frame->u.stop_sending.error_code = qc->conf->stream_close_code; - - ngx_quic_queue_frame(qc, frame); - - return NGX_OK; -} - - -static ngx_quic_stream_t * -ngx_quic_get_stream(ngx_connection_t *c, uint64_t id) -{ - uint64_t min_id; - ngx_event_t *rev; - ngx_quic_stream_t *qs; - ngx_quic_connection_t *qc; - - qc = ngx_quic_get_connection(c); - - qs = ngx_quic_find_stream(&qc->streams.tree, id); - - if (qs) { - return qs; - } - - if (qc->shutdown || qc->closing) { - return NGX_QUIC_STREAM_GONE; - } - - ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, - "quic stream id:0x%xL is missing", id); - - if (id & NGX_QUIC_STREAM_UNIDIRECTIONAL) { - - if (id & NGX_QUIC_STREAM_SERVER_INITIATED) { - if ((id >> 2) < qc->streams.server_streams_uni) { - return NGX_QUIC_STREAM_GONE; - } - - qc->error = NGX_QUIC_ERR_STREAM_STATE_ERROR; - return NULL; - } - - if ((id >> 2) < qc->streams.client_streams_uni) { - return NGX_QUIC_STREAM_GONE; - } - - if ((id >> 2) >= qc->streams.client_max_streams_uni) { - qc->error = NGX_QUIC_ERR_STREAM_LIMIT_ERROR; - return NULL; - } - - min_id = (qc->streams.client_streams_uni << 2) - | NGX_QUIC_STREAM_UNIDIRECTIONAL; - qc->streams.client_streams_uni = (id >> 2) + 1; - - } else { - - if (id & NGX_QUIC_STREAM_SERVER_INITIATED) { - if ((id >> 2) < qc->streams.server_streams_bidi) { - return NGX_QUIC_STREAM_GONE; - } - - qc->error = NGX_QUIC_ERR_STREAM_STATE_ERROR; - return NULL; - } - - if ((id >> 2) < qc->streams.client_streams_bidi) { - return NGX_QUIC_STREAM_GONE; - } - - if ((id >> 2) >= qc->streams.client_max_streams_bidi) { - qc->error = NGX_QUIC_ERR_STREAM_LIMIT_ERROR; - return NULL; - } - - min_id = (qc->streams.client_streams_bidi << 2); - qc->streams.client_streams_bidi = (id >> 2) + 1; - } - - /* - * RFC 9000, 2.1. Stream Types and Identifiers - * - * successive streams of each type are created with numerically increasing - * stream IDs. A stream ID that is used out of order results in all - * streams of that type with lower-numbered stream IDs also being opened. - */ - -#if (NGX_SUPPRESS_WARN) - qs = NULL; -#endif - - for ( /* void */ ; min_id <= id; min_id += 0x04) { - - qs = ngx_quic_create_stream(c, min_id); - - if (qs == NULL) { - if (ngx_quic_reject_stream(c, min_id) != NGX_OK) { - return NULL; - } - - continue; - } - - ngx_queue_insert_tail(&qc->streams.uninitialized, &qs->queue); - - rev = qs->connection->read; - rev->handler = ngx_quic_init_stream_handler; - - if (qc->streams.initialized) { - ngx_post_event(rev, &ngx_posted_events); - - if (qc->push.posted) { - /* - * The posted stream can produce output immediately. - * By postponing the push event, we coalesce the stream - * output with queued frames in one UDP datagram. - */ - - ngx_delete_posted_event(&qc->push); - ngx_post_event(&qc->push, &ngx_posted_events); - } - } - } - - if (qs == NULL) { - return NGX_QUIC_STREAM_GONE; - } - - return qs; -} - - -static ngx_int_t -ngx_quic_reject_stream(ngx_connection_t *c, uint64_t id) -{ - uint64_t code; - ngx_quic_frame_t *frame; - ngx_quic_connection_t *qc; - - qc = ngx_quic_get_connection(c); - - code = (id & NGX_QUIC_STREAM_UNIDIRECTIONAL) - ? qc->conf->stream_reject_code_uni - : qc->conf->stream_reject_code_bidi; - - if (code == 0) { - return NGX_DECLINED; - } - - ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0, - "quic stream id:0x%xL reject err:0x%xL", id, code); - - frame = ngx_quic_alloc_frame(c); - if (frame == NULL) { - return NGX_ERROR; - } - - frame->level = NGX_QUIC_ENCRYPTION_APPLICATION; - frame->type = NGX_QUIC_FT_RESET_STREAM; - frame->u.reset_stream.id = id; - frame->u.reset_stream.error_code = code; - frame->u.reset_stream.final_size = 0; - - ngx_quic_queue_frame(qc, frame); - - frame = ngx_quic_alloc_frame(c); - if (frame == NULL) { - return NGX_ERROR; - } - - frame->level = NGX_QUIC_ENCRYPTION_APPLICATION; - frame->type = NGX_QUIC_FT_STOP_SENDING; - frame->u.stop_sending.id = id; - frame->u.stop_sending.error_code = code; - - ngx_quic_queue_frame(qc, frame); - - return NGX_OK; -} - - -static void -ngx_quic_init_stream_handler(ngx_event_t *ev) -{ - ngx_connection_t *c; - ngx_quic_stream_t *qs; - - c = ev->data; - qs = c->quic; - - ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0, "quic init stream"); - - if ((qs->id & NGX_QUIC_STREAM_UNIDIRECTIONAL) == 0) { - c->write->active = 1; - c->write->ready = 1; - } - - c->read->active = 1; - - ngx_queue_remove(&qs->queue); - - c->listening->handler(c); -} - - -ngx_int_t -ngx_quic_init_streams(ngx_connection_t *c) -{ - ngx_int_t rc; - ngx_quic_connection_t *qc; - - qc = ngx_quic_get_connection(c); - - if (qc->streams.initialized) { - return NGX_OK; - } - - rc = ngx_ssl_ocsp_validate(c); - - if (rc == NGX_ERROR) { - return NGX_ERROR; - } - - if (rc == NGX_AGAIN) { - c->ssl->handler = ngx_quic_init_streams_handler; - return NGX_OK; - } - - return ngx_quic_do_init_streams(c); -} - - -static void -ngx_quic_init_streams_handler(ngx_connection_t *c) -{ - if (ngx_quic_do_init_streams(c) != NGX_OK) { - ngx_quic_close_connection(c, NGX_ERROR); - } -} - - -static ngx_int_t -ngx_quic_do_init_streams(ngx_connection_t *c) -{ - ngx_queue_t *q; - ngx_quic_stream_t *qs; - ngx_quic_connection_t *qc; - - ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0, "quic init streams"); - - qc = ngx_quic_get_connection(c); - - if (qc->conf->init) { - if (qc->conf->init(c) != NGX_OK) { - return NGX_ERROR; - } - } - - for (q = ngx_queue_head(&qc->streams.uninitialized); - q != ngx_queue_sentinel(&qc->streams.uninitialized); - q = ngx_queue_next(q)) - { - qs = ngx_queue_data(q, ngx_quic_stream_t, queue); - ngx_post_event(qs->connection->read, &ngx_posted_events); - } - - qc->streams.initialized = 1; - - if (!qc->closing && qc->close.timer_set) { - ngx_del_timer(&qc->close); - } - - return NGX_OK; -} - - -static ngx_quic_stream_t * -ngx_quic_create_stream(ngx_connection_t *c, uint64_t id) -{ - ngx_str_t addr_text; - ngx_log_t *log; - ngx_pool_t *pool; - ngx_uint_t reusable; - ngx_queue_t *q; - struct sockaddr *sockaddr; - ngx_connection_t *sc; - ngx_quic_stream_t *qs; - ngx_pool_cleanup_t *cln; - ngx_quic_connection_t *qc; - - ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, - "quic stream id:0x%xL create", id); - - qc = ngx_quic_get_connection(c); - - if (!ngx_queue_empty(&qc->streams.free)) { - q = ngx_queue_head(&qc->streams.free); - qs = ngx_queue_data(q, ngx_quic_stream_t, queue); - ngx_queue_remove(&qs->queue); - - } else { - /* - * the number of streams is limited by transport - * parameters and application requirements - */ - - qs = ngx_palloc(c->pool, sizeof(ngx_quic_stream_t)); - if (qs == NULL) { - return NULL; - } - } - - ngx_memzero(qs, sizeof(ngx_quic_stream_t)); - - qs->node.key = id; - qs->parent = c; - qs->id = id; - qs->send_final_size = (uint64_t) -1; - qs->recv_final_size = (uint64_t) -1; - - pool = ngx_create_pool(NGX_DEFAULT_POOL_SIZE, c->log); - if (pool == NULL) { - ngx_queue_insert_tail(&qc->streams.free, &qs->queue); - return NULL; - } - - log = ngx_palloc(pool, sizeof(ngx_log_t)); - if (log == NULL) { - ngx_destroy_pool(pool); - ngx_queue_insert_tail(&qc->streams.free, &qs->queue); - return NULL; - } - - *log = *c->log; - pool->log = log; - - sockaddr = ngx_palloc(pool, c->socklen); - if (sockaddr == NULL) { - ngx_destroy_pool(pool); - ngx_queue_insert_tail(&qc->streams.free, &qs->queue); - return NULL; - } - - ngx_memcpy(sockaddr, c->sockaddr, c->socklen); - - if (c->addr_text.data) { - addr_text.data = ngx_pnalloc(pool, c->addr_text.len); - if (addr_text.data == NULL) { - ngx_destroy_pool(pool); - ngx_queue_insert_tail(&qc->streams.free, &qs->queue); - return NULL; - } - - ngx_memcpy(addr_text.data, c->addr_text.data, c->addr_text.len); - addr_text.len = c->addr_text.len; - - } else { - addr_text.len = 0; - addr_text.data = NULL; - } - - reusable = c->reusable; - ngx_reusable_connection(c, 0); - - sc = ngx_get_connection(c->fd, log); - if (sc == NULL) { - ngx_destroy_pool(pool); - ngx_queue_insert_tail(&qc->streams.free, &qs->queue); - ngx_reusable_connection(c, reusable); - return NULL; - } - - qs->connection = sc; - - sc->quic = qs; - sc->shared = 1; - sc->type = SOCK_STREAM; - sc->pool = pool; - sc->ssl = c->ssl; - sc->sockaddr = sockaddr; - sc->socklen = c->socklen; - sc->listening = c->listening; - sc->addr_text = addr_text; - sc->local_sockaddr = c->local_sockaddr; - sc->local_socklen = c->local_socklen; - sc->number = ngx_atomic_fetch_add(ngx_connection_counter, 1); - sc->start_time = c->start_time; - sc->tcp_nodelay = NGX_TCP_NODELAY_DISABLED; - - sc->recv = ngx_quic_stream_recv; - sc->send = ngx_quic_stream_send; - sc->send_chain = ngx_quic_stream_send_chain; - - sc->read->log = log; - sc->write->log = log; - - sc->read->handler = ngx_quic_empty_handler; - sc->write->handler = ngx_quic_empty_handler; - - log->connection = sc->number; - - if (id & NGX_QUIC_STREAM_UNIDIRECTIONAL) { - if (id & NGX_QUIC_STREAM_SERVER_INITIATED) { - qs->send_max_data = qc->ctp.initial_max_stream_data_uni; - qs->recv_state = NGX_QUIC_STREAM_RECV_DATA_READ; - qs->send_state = NGX_QUIC_STREAM_SEND_READY; - - } else { - qs->recv_max_data = qc->tp.initial_max_stream_data_uni; - qs->recv_state = NGX_QUIC_STREAM_RECV_RECV; - qs->send_state = NGX_QUIC_STREAM_SEND_DATA_RECVD; - } - - } else { - if (id & NGX_QUIC_STREAM_SERVER_INITIATED) { - qs->send_max_data = qc->ctp.initial_max_stream_data_bidi_remote; - qs->recv_max_data = qc->tp.initial_max_stream_data_bidi_local; - - } else { - qs->send_max_data = qc->ctp.initial_max_stream_data_bidi_local; - qs->recv_max_data = qc->tp.initial_max_stream_data_bidi_remote; - } - - qs->recv_state = NGX_QUIC_STREAM_RECV_RECV; - qs->send_state = NGX_QUIC_STREAM_SEND_READY; - } - - qs->recv_window = qs->recv_max_data; - - cln = ngx_pool_cleanup_add(pool, 0); - if (cln == NULL) { - ngx_close_connection(sc); - ngx_destroy_pool(pool); - ngx_queue_insert_tail(&qc->streams.free, &qs->queue); - ngx_reusable_connection(c, reusable); - return NULL; - } - - cln->handler = ngx_quic_stream_cleanup_handler; - cln->data = sc; - - ngx_rbtree_insert(&qc->streams.tree, &qs->node); - - return qs; -} - - -void -ngx_quic_cancelable_stream(ngx_connection_t *c) -{ - ngx_connection_t *pc; - ngx_quic_stream_t *qs; - ngx_quic_connection_t *qc; - - qs = c->quic; - pc = qs->parent; - qc = ngx_quic_get_connection(pc); - - if (!qs->cancelable) { - qs->cancelable = 1; - - if (ngx_quic_can_shutdown(pc) == NGX_OK) { - ngx_reusable_connection(pc, 1); - - if (qc->shutdown) { - ngx_quic_shutdown_quic(pc); - } - } - } -} - - -static void -ngx_quic_empty_handler(ngx_event_t *ev) -{ -} - - -static ssize_t -ngx_quic_stream_recv(ngx_connection_t *c, u_char *buf, size_t size) -{ - ssize_t len; - ngx_buf_t *b; - ngx_chain_t *cl, *in; - ngx_event_t *rev; - ngx_connection_t *pc; - ngx_quic_stream_t *qs; - - qs = c->quic; - pc = qs->parent; - rev = c->read; - - if (qs->recv_state == NGX_QUIC_STREAM_RECV_RESET_RECVD - || qs->recv_state == NGX_QUIC_STREAM_RECV_RESET_READ) - { - qs->recv_state = NGX_QUIC_STREAM_RECV_RESET_READ; - return NGX_ERROR; - } - - ngx_log_debug2(NGX_LOG_DEBUG_EVENT, pc->log, 0, - "quic stream id:0x%xL recv buf:%uz", qs->id, size); - - if (size == 0) { - return 0; - } - - in = ngx_quic_read_buffer(pc, &qs->recv, size); - if (in == NGX_CHAIN_ERROR) { - return NGX_ERROR; - } - - len = 0; - - for (cl = in; cl; cl = cl->next) { - b = cl->buf; - len += b->last - b->pos; - buf = ngx_cpymem(buf, b->pos, b->last - b->pos); - } - - ngx_quic_free_chain(pc, in); - - if (len == 0) { - rev->ready = 0; - - if (qs->recv_state == NGX_QUIC_STREAM_RECV_DATA_RECVD - && qs->recv_offset == qs->recv_final_size) - { - qs->recv_state = NGX_QUIC_STREAM_RECV_DATA_READ; - } - - if (qs->recv_state == NGX_QUIC_STREAM_RECV_DATA_READ) { - rev->eof = 1; - return 0; - } - - ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, - "quic stream id:0x%xL recv() not ready", qs->id); - return NGX_AGAIN; - } - - ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0, - "quic stream id:0x%xL recv len:%z", qs->id, len); - - if (ngx_quic_update_flow(qs, qs->recv_offset + len) != NGX_OK) { - return NGX_ERROR; - } - - return len; -} - - -static ssize_t -ngx_quic_stream_send(ngx_connection_t *c, u_char *buf, size_t size) -{ - ngx_buf_t b; - ngx_chain_t cl; - - ngx_memzero(&b, sizeof(ngx_buf_t)); - - b.memory = 1; - b.pos = buf; - b.last = buf + size; - - cl.buf = &b; - cl.next = NULL; - - if (ngx_quic_stream_send_chain(c, &cl, 0) == NGX_CHAIN_ERROR) { - return NGX_ERROR; - } - - if (b.pos == buf) { - return NGX_AGAIN; - } - - return b.pos - buf; -} - - -static ngx_chain_t * -ngx_quic_stream_send_chain(ngx_connection_t *c, ngx_chain_t *in, off_t limit) -{ - uint64_t n, flow; - ngx_event_t *wev; - ngx_connection_t *pc; - ngx_quic_stream_t *qs; - ngx_quic_connection_t *qc; - - qs = c->quic; - pc = qs->parent; - qc = ngx_quic_get_connection(pc); - wev = c->write; - - if (qs->send_state != NGX_QUIC_STREAM_SEND_READY - && qs->send_state != NGX_QUIC_STREAM_SEND_SEND) - { - wev->error = 1; - return NGX_CHAIN_ERROR; - } - - qs->send_state = NGX_QUIC_STREAM_SEND_SEND; - - flow = qs->acked + qc->conf->stream_buffer_size - qs->sent; - - if (flow == 0) { - wev->ready = 0; - return in; - } - - if (limit == 0 || limit > (off_t) flow) { - limit = flow; - } - - n = qs->send.size; - - in = ngx_quic_write_buffer(pc, &qs->send, in, limit, qs->sent); - if (in == NGX_CHAIN_ERROR) { - return NGX_CHAIN_ERROR; - } - - n = qs->send.size - n; - c->sent += n; - qs->sent += n; - qc->streams.sent += n; - - if (flow == n) { - wev->ready = 0; - } - - ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, - "quic send_chain sent:%uL", n); - - if (ngx_quic_stream_flush(qs) != NGX_OK) { - return NGX_CHAIN_ERROR; - } - - return in; -} - - -static ngx_int_t -ngx_quic_stream_flush(ngx_quic_stream_t *qs) -{ - off_t limit, len; - ngx_uint_t last; - ngx_chain_t *out; - ngx_quic_frame_t *frame; - ngx_connection_t *pc; - ngx_quic_connection_t *qc; - - if (qs->send_state != NGX_QUIC_STREAM_SEND_SEND) { - return NGX_OK; - } - - pc = qs->parent; - qc = ngx_quic_get_connection(pc); - - if (qc->streams.send_max_data == 0) { - qc->streams.send_max_data = qc->ctp.initial_max_data; - } - - limit = ngx_min(qc->streams.send_max_data - qc->streams.send_offset, - qs->send_max_data - qs->send_offset); - - ngx_log_debug2(NGX_LOG_DEBUG_EVENT, pc->log, 0, - "quic stream id:0x%xL flush limit:%O", qs->id, limit); - - len = qs->send.offset; - - out = ngx_quic_read_buffer(pc, &qs->send, limit); - if (out == NGX_CHAIN_ERROR) { - return NGX_ERROR; - } - - len = qs->send.offset - len; - last = 0; - - if (qs->send_final_size != (uint64_t) -1 - && qs->send_final_size == qs->send.offset) - { - qs->send_state = NGX_QUIC_STREAM_SEND_DATA_SENT; - last = 1; - } - - if (len == 0 && !last) { - return NGX_OK; - } - - frame = ngx_quic_alloc_frame(pc); - if (frame == NULL) { - return NGX_ERROR; - } - - frame->level = NGX_QUIC_ENCRYPTION_APPLICATION; - frame->type = NGX_QUIC_FT_STREAM; - frame->data = out; - - frame->u.stream.off = 1; - frame->u.stream.len = 1; - frame->u.stream.fin = last; - - frame->u.stream.stream_id = qs->id; - frame->u.stream.offset = qs->send_offset; - frame->u.stream.length = len; - - ngx_quic_queue_frame(qc, frame); - - qs->send_offset += len; - qc->streams.send_offset += len; - - ngx_log_debug3(NGX_LOG_DEBUG_EVENT, pc->log, 0, - "quic stream id:0x%xL flush len:%O last:%ui", - qs->id, len, last); - - if (qs->connection == NULL) { - return ngx_quic_close_stream(qs); - } - - return NGX_OK; -} - - -static void -ngx_quic_stream_cleanup_handler(void *data) -{ - ngx_connection_t *c = data; - - ngx_quic_stream_t *qs; - ngx_quic_connection_t *qc; - - qs = c->quic; - - ngx_log_debug1(NGX_LOG_DEBUG_EVENT, qs->parent->log, 0, - "quic stream id:0x%xL cleanup", qs->id); - - if (ngx_quic_shutdown_stream(c, NGX_RDWR_SHUTDOWN) != NGX_OK) { - qs->connection = NULL; - goto failed; - } - - qs->connection = NULL; - - if (ngx_quic_close_stream(qs) != NGX_OK) { - goto failed; - } - - return; - -failed: - - qc = ngx_quic_get_connection(qs->parent); - qc->error = NGX_QUIC_ERR_INTERNAL_ERROR; - - ngx_post_event(&qc->close, &ngx_posted_events); -} - - -static ngx_int_t -ngx_quic_close_stream(ngx_quic_stream_t *qs) -{ - ngx_connection_t *pc; - ngx_quic_frame_t *frame; - ngx_quic_connection_t *qc; - - pc = qs->parent; - qc = ngx_quic_get_connection(pc); - - if (!qc->closing) { - /* make sure everything is sent and final size is received */ - - if (qs->recv_state == NGX_QUIC_STREAM_RECV_RECV) { - return NGX_OK; - } - - if (qs->send_state != NGX_QUIC_STREAM_SEND_DATA_RECVD - && qs->send_state != NGX_QUIC_STREAM_SEND_RESET_RECVD) - { - return NGX_OK; - } - } - - ngx_log_debug1(NGX_LOG_DEBUG_EVENT, pc->log, 0, - "quic stream id:0x%xL close", qs->id); - - ngx_quic_free_buffer(pc, &qs->send); - ngx_quic_free_buffer(pc, &qs->recv); - - ngx_rbtree_delete(&qc->streams.tree, &qs->node); - ngx_queue_insert_tail(&qc->streams.free, &qs->queue); - - if (qc->closing) { - /* schedule handler call to continue ngx_quic_close_connection() */ - ngx_post_event(&qc->close, &ngx_posted_events); - return NGX_OK; - } - - if (!pc->reusable && ngx_quic_can_shutdown(pc) == NGX_OK) { - ngx_reusable_connection(pc, 1); - } - - if (qc->shutdown) { - ngx_quic_shutdown_quic(pc); - return NGX_OK; - } - - if ((qs->id & NGX_QUIC_STREAM_SERVER_INITIATED) == 0) { - frame = ngx_quic_alloc_frame(pc); - if (frame == NULL) { - return NGX_ERROR; - } - - frame->level = NGX_QUIC_ENCRYPTION_APPLICATION; - frame->type = NGX_QUIC_FT_MAX_STREAMS; - - if (qs->id & NGX_QUIC_STREAM_UNIDIRECTIONAL) { - frame->u.max_streams.limit = ++qc->streams.client_max_streams_uni; - frame->u.max_streams.bidi = 0; - - } else { - frame->u.max_streams.limit = ++qc->streams.client_max_streams_bidi; - frame->u.max_streams.bidi = 1; - } - - ngx_quic_queue_frame(qc, frame); - } - - return NGX_OK; -} - - -static ngx_int_t -ngx_quic_can_shutdown(ngx_connection_t *c) -{ - ngx_rbtree_t *tree; - ngx_rbtree_node_t *node; - ngx_quic_stream_t *qs; - ngx_quic_connection_t *qc; - - qc = ngx_quic_get_connection(c); - - tree = &qc->streams.tree; - - if (tree->root != tree->sentinel) { - for (node = ngx_rbtree_min(tree->root, tree->sentinel); - node; - node = ngx_rbtree_next(tree, node)) - { - qs = (ngx_quic_stream_t *) node; - - if (!qs->cancelable) { - return NGX_DECLINED; - } - } - } - - return NGX_OK; -} - - -ngx_int_t -ngx_quic_handle_stream_frame(ngx_connection_t *c, ngx_quic_header_t *pkt, - ngx_quic_frame_t *frame) -{ - uint64_t last; - ngx_quic_stream_t *qs; - ngx_quic_connection_t *qc; - ngx_quic_stream_frame_t *f; - - qc = ngx_quic_get_connection(c); - f = &frame->u.stream; - - if ((f->stream_id & NGX_QUIC_STREAM_UNIDIRECTIONAL) - && (f->stream_id & NGX_QUIC_STREAM_SERVER_INITIATED)) - { - qc->error = NGX_QUIC_ERR_STREAM_STATE_ERROR; - return NGX_ERROR; - } - - /* no overflow since both values are 62-bit */ - last = f->offset + f->length; - - qs = ngx_quic_get_stream(c, f->stream_id); - - if (qs == NULL) { - return NGX_ERROR; - } - - if (qs == NGX_QUIC_STREAM_GONE) { - return NGX_OK; - } - - if (qs->recv_state != NGX_QUIC_STREAM_RECV_RECV - && qs->recv_state != NGX_QUIC_STREAM_RECV_SIZE_KNOWN) - { - return NGX_OK; - } - - if (ngx_quic_control_flow(qs, last) != NGX_OK) { - return NGX_ERROR; - } - - if (qs->recv_final_size != (uint64_t) -1 && last > qs->recv_final_size) { - qc->error = NGX_QUIC_ERR_FINAL_SIZE_ERROR; - return NGX_ERROR; - } - - if (last < qs->recv_offset) { - return NGX_OK; - } - - if (f->fin) { - if (qs->recv_final_size != (uint64_t) -1 && qs->recv_final_size != last) - { - qc->error = NGX_QUIC_ERR_FINAL_SIZE_ERROR; - return NGX_ERROR; - } - - if (qs->recv_last > last) { - qc->error = NGX_QUIC_ERR_FINAL_SIZE_ERROR; - return NGX_ERROR; - } - - qs->recv_final_size = last; - qs->recv_state = NGX_QUIC_STREAM_RECV_SIZE_KNOWN; - } - - if (ngx_quic_write_buffer(c, &qs->recv, frame->data, f->length, f->offset) - == NGX_CHAIN_ERROR) - { - return NGX_ERROR; - } - - if (qs->recv_state == NGX_QUIC_STREAM_RECV_SIZE_KNOWN - && qs->recv.size == qs->recv_final_size) - { - qs->recv_state = NGX_QUIC_STREAM_RECV_DATA_RECVD; - } - - if (qs->connection == NULL) { - return ngx_quic_close_stream(qs); - } - - if (f->offset <= qs->recv_offset) { - ngx_quic_set_event(qs->connection->read); - } - - return NGX_OK; -} - - -ngx_int_t -ngx_quic_handle_max_data_frame(ngx_connection_t *c, - ngx_quic_max_data_frame_t *f) -{ - ngx_rbtree_t *tree; - ngx_rbtree_node_t *node; - ngx_quic_stream_t *qs; - ngx_quic_connection_t *qc; - - qc = ngx_quic_get_connection(c); - tree = &qc->streams.tree; - - if (f->max_data <= qc->streams.send_max_data) { - return NGX_OK; - } - - if (tree->root == tree->sentinel - || qc->streams.send_offset < qc->streams.send_max_data) - { - /* not blocked on MAX_DATA */ - qc->streams.send_max_data = f->max_data; - return NGX_OK; - } - - qc->streams.send_max_data = f->max_data; - node = ngx_rbtree_min(tree->root, tree->sentinel); - - while (node && qc->streams.send_offset < qc->streams.send_max_data) { - - qs = (ngx_quic_stream_t *) node; - node = ngx_rbtree_next(tree, node); - - if (ngx_quic_stream_flush(qs) != NGX_OK) { - return NGX_ERROR; - } - } - - return NGX_OK; -} - - -ngx_int_t -ngx_quic_handle_streams_blocked_frame(ngx_connection_t *c, - ngx_quic_header_t *pkt, ngx_quic_streams_blocked_frame_t *f) -{ - return NGX_OK; -} - - -ngx_int_t -ngx_quic_handle_data_blocked_frame(ngx_connection_t *c, - ngx_quic_header_t *pkt, ngx_quic_data_blocked_frame_t *f) -{ - return ngx_quic_update_max_data(c); -} - - -ngx_int_t -ngx_quic_handle_stream_data_blocked_frame(ngx_connection_t *c, - ngx_quic_header_t *pkt, ngx_quic_stream_data_blocked_frame_t *f) -{ - ngx_quic_stream_t *qs; - ngx_quic_connection_t *qc; - - qc = ngx_quic_get_connection(c); - - if ((f->id & NGX_QUIC_STREAM_UNIDIRECTIONAL) - && (f->id & NGX_QUIC_STREAM_SERVER_INITIATED)) - { - qc->error = NGX_QUIC_ERR_STREAM_STATE_ERROR; - return NGX_ERROR; - } - - qs = ngx_quic_get_stream(c, f->id); - - if (qs == NULL) { - return NGX_ERROR; - } - - if (qs == NGX_QUIC_STREAM_GONE) { - return NGX_OK; - } - - return ngx_quic_update_max_stream_data(qs); -} - - -ngx_int_t -ngx_quic_handle_max_stream_data_frame(ngx_connection_t *c, - ngx_quic_header_t *pkt, ngx_quic_max_stream_data_frame_t *f) -{ - ngx_quic_stream_t *qs; - ngx_quic_connection_t *qc; - - qc = ngx_quic_get_connection(c); - - if ((f->id & NGX_QUIC_STREAM_UNIDIRECTIONAL) - && (f->id & NGX_QUIC_STREAM_SERVER_INITIATED) == 0) - { - qc->error = NGX_QUIC_ERR_STREAM_STATE_ERROR; - return NGX_ERROR; - } - - qs = ngx_quic_get_stream(c, f->id); - - if (qs == NULL) { - return NGX_ERROR; - } - - if (qs == NGX_QUIC_STREAM_GONE) { - return NGX_OK; - } - - if (f->limit <= qs->send_max_data) { - return NGX_OK; - } - - if (qs->send_offset < qs->send_max_data) { - /* not blocked on MAX_STREAM_DATA */ - qs->send_max_data = f->limit; - return NGX_OK; - } - - qs->send_max_data = f->limit; - - return ngx_quic_stream_flush(qs); -} - - -ngx_int_t -ngx_quic_handle_reset_stream_frame(ngx_connection_t *c, - ngx_quic_header_t *pkt, ngx_quic_reset_stream_frame_t *f) -{ - ngx_event_t *rev; - ngx_quic_stream_t *qs; - ngx_quic_connection_t *qc; - - qc = ngx_quic_get_connection(c); - - if ((f->id & NGX_QUIC_STREAM_UNIDIRECTIONAL) - && (f->id & NGX_QUIC_STREAM_SERVER_INITIATED)) - { - qc->error = NGX_QUIC_ERR_STREAM_STATE_ERROR; - return NGX_ERROR; - } - - qs = ngx_quic_get_stream(c, f->id); - - if (qs == NULL) { - return NGX_ERROR; - } - - if (qs == NGX_QUIC_STREAM_GONE) { - return NGX_OK; - } - - if (qs->recv_state == NGX_QUIC_STREAM_RECV_RESET_RECVD - || qs->recv_state == NGX_QUIC_STREAM_RECV_RESET_READ) - { - return NGX_OK; - } - - qs->recv_state = NGX_QUIC_STREAM_RECV_RESET_RECVD; - - if (ngx_quic_control_flow(qs, f->final_size) != NGX_OK) { - return NGX_ERROR; - } - - if (qs->recv_final_size != (uint64_t) -1 - && qs->recv_final_size != f->final_size) - { - qc->error = NGX_QUIC_ERR_FINAL_SIZE_ERROR; - return NGX_ERROR; - } - - if (qs->recv_last > f->final_size) { - qc->error = NGX_QUIC_ERR_FINAL_SIZE_ERROR; - return NGX_ERROR; - } - - qs->recv_final_size = f->final_size; - - if (ngx_quic_update_flow(qs, qs->recv_final_size) != NGX_OK) { - return NGX_ERROR; - } - - if (qs->connection == NULL) { - return ngx_quic_close_stream(qs); - } - - rev = qs->connection->read; - rev->error = 1; - - ngx_quic_set_event(rev); - - return NGX_OK; -} - - -ngx_int_t -ngx_quic_handle_stop_sending_frame(ngx_connection_t *c, - ngx_quic_header_t *pkt, ngx_quic_stop_sending_frame_t *f) -{ - ngx_quic_stream_t *qs; - ngx_quic_connection_t *qc; - - qc = ngx_quic_get_connection(c); - - if ((f->id & NGX_QUIC_STREAM_UNIDIRECTIONAL) - && (f->id & NGX_QUIC_STREAM_SERVER_INITIATED) == 0) - { - qc->error = NGX_QUIC_ERR_STREAM_STATE_ERROR; - return NGX_ERROR; - } - - qs = ngx_quic_get_stream(c, f->id); - - if (qs == NULL) { - return NGX_ERROR; - } - - if (qs == NGX_QUIC_STREAM_GONE) { - return NGX_OK; - } - - if (ngx_quic_do_reset_stream(qs, f->error_code) != NGX_OK) { - return NGX_ERROR; - } - - if (qs->connection == NULL) { - return ngx_quic_close_stream(qs); - } - - ngx_quic_set_event(qs->connection->write); - - return NGX_OK; -} - - -ngx_int_t -ngx_quic_handle_max_streams_frame(ngx_connection_t *c, - ngx_quic_header_t *pkt, ngx_quic_max_streams_frame_t *f) -{ - ngx_quic_connection_t *qc; - - qc = ngx_quic_get_connection(c); - - if (f->bidi) { - if (qc->streams.server_max_streams_bidi < f->limit) { - qc->streams.server_max_streams_bidi = f->limit; - - ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, - "quic max_streams_bidi:%uL", f->limit); - } - - } else { - if (qc->streams.server_max_streams_uni < f->limit) { - qc->streams.server_max_streams_uni = f->limit; - - ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, - "quic max_streams_uni:%uL", f->limit); - } - } - - return NGX_OK; -} - - -void -ngx_quic_handle_stream_ack(ngx_connection_t *c, ngx_quic_frame_t *f) -{ - uint64_t acked; - ngx_quic_stream_t *qs; - ngx_quic_connection_t *qc; - - qc = ngx_quic_get_connection(c); - - switch (f->type) { - - case NGX_QUIC_FT_RESET_STREAM: - - qs = ngx_quic_find_stream(&qc->streams.tree, f->u.reset_stream.id); - if (qs == NULL) { - return; - } - - qs->send_state = NGX_QUIC_STREAM_SEND_RESET_RECVD; - - ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0, - "quic stream id:0x%xL ack reset final_size:%uL", - qs->id, f->u.reset_stream.final_size); - - break; - - case NGX_QUIC_FT_STREAM: - - qs = ngx_quic_find_stream(&qc->streams.tree, f->u.stream.stream_id); - if (qs == NULL) { - return; - } - - acked = qs->acked; - qs->acked += f->u.stream.length; - - if (f->u.stream.fin) { - qs->fin_acked = 1; - } - - if (qs->send_state == NGX_QUIC_STREAM_SEND_DATA_SENT - && qs->acked == qs->sent && qs->fin_acked) - { - qs->send_state = NGX_QUIC_STREAM_SEND_DATA_RECVD; - } - - ngx_log_debug4(NGX_LOG_DEBUG_EVENT, c->log, 0, - "quic stream id:0x%xL ack len:%uL fin:%d unacked:%uL", - qs->id, f->u.stream.length, f->u.stream.fin, - qs->sent - qs->acked); - - if (qs->connection - && qs->sent - acked == qc->conf->stream_buffer_size - && f->u.stream.length > 0) - { - ngx_quic_set_event(qs->connection->write); - } - - break; - - default: - return; - } - - if (qs->connection == NULL) { - ngx_quic_close_stream(qs); - } -} - - -static ngx_int_t -ngx_quic_control_flow(ngx_quic_stream_t *qs, uint64_t last) -{ - uint64_t len; - ngx_connection_t *pc; - ngx_quic_connection_t *qc; - - pc = qs->parent; - qc = ngx_quic_get_connection(pc); - - if (last <= qs->recv_last) { - return NGX_OK; - } - - len = last - qs->recv_last; - - ngx_log_debug5(NGX_LOG_DEBUG_EVENT, pc->log, 0, - "quic stream id:0x%xL flow control msd:%uL/%uL md:%uL/%uL", - qs->id, last, qs->recv_max_data, qc->streams.recv_last + len, - qc->streams.recv_max_data); - - qs->recv_last += len; - - if (qs->recv_state == NGX_QUIC_STREAM_RECV_RECV - && qs->recv_last > qs->recv_max_data) - { - qc->error = NGX_QUIC_ERR_FLOW_CONTROL_ERROR; - return NGX_ERROR; - } - - qc->streams.recv_last += len; - - if (qc->streams.recv_last > qc->streams.recv_max_data) { - qc->error = NGX_QUIC_ERR_FLOW_CONTROL_ERROR; - return NGX_ERROR; - } - - return NGX_OK; -} - - -static ngx_int_t -ngx_quic_update_flow(ngx_quic_stream_t *qs, uint64_t last) -{ - uint64_t len; - ngx_connection_t *pc; - ngx_quic_connection_t *qc; - - pc = qs->parent; - qc = ngx_quic_get_connection(pc); - - if (last <= qs->recv_offset) { - return NGX_OK; - } - - len = last - qs->recv_offset; - - ngx_log_debug2(NGX_LOG_DEBUG_EVENT, pc->log, 0, - "quic stream id:0x%xL flow update %uL", qs->id, last); - - qs->recv_offset += len; - - if (qs->recv_max_data <= qs->recv_offset + qs->recv_window / 2) { - if (ngx_quic_update_max_stream_data(qs) != NGX_OK) { - return NGX_ERROR; - } - } - - qc->streams.recv_offset += len; - - if (qc->streams.recv_max_data - <= qc->streams.recv_offset + qc->streams.recv_window / 2) - { - if (ngx_quic_update_max_data(pc) != NGX_OK) { - return NGX_ERROR; - } - } - - return NGX_OK; -} - - -static ngx_int_t -ngx_quic_update_max_stream_data(ngx_quic_stream_t *qs) -{ - uint64_t recv_max_data; - ngx_connection_t *pc; - ngx_quic_frame_t *frame; - ngx_quic_connection_t *qc; - - pc = qs->parent; - qc = ngx_quic_get_connection(pc); - - if (qs->recv_state != NGX_QUIC_STREAM_RECV_RECV) { - return NGX_OK; - } - - recv_max_data = qs->recv_offset + qs->recv_window; - - if (qs->recv_max_data == recv_max_data) { - return NGX_OK; - } - - qs->recv_max_data = recv_max_data; - - ngx_log_debug2(NGX_LOG_DEBUG_EVENT, pc->log, 0, - "quic stream id:0x%xL flow update msd:%uL", - qs->id, qs->recv_max_data); - - frame = ngx_quic_alloc_frame(pc); - if (frame == NULL) { - return NGX_ERROR; - } - - frame->level = NGX_QUIC_ENCRYPTION_APPLICATION; - frame->type = NGX_QUIC_FT_MAX_STREAM_DATA; - frame->u.max_stream_data.id = qs->id; - frame->u.max_stream_data.limit = qs->recv_max_data; - - ngx_quic_queue_frame(qc, frame); - - return NGX_OK; -} - - -static ngx_int_t -ngx_quic_update_max_data(ngx_connection_t *c) -{ - uint64_t recv_max_data; - ngx_quic_frame_t *frame; - ngx_quic_connection_t *qc; - - qc = ngx_quic_get_connection(c); - - recv_max_data = qc->streams.recv_offset + qc->streams.recv_window; - - if (qc->streams.recv_max_data == recv_max_data) { - return NGX_OK; - } - - qc->streams.recv_max_data = recv_max_data; - - ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, - "quic flow update md:%uL", qc->streams.recv_max_data); - - frame = ngx_quic_alloc_frame(c); - if (frame == NULL) { - return NGX_ERROR; - } - - frame->level = NGX_QUIC_ENCRYPTION_APPLICATION; - frame->type = NGX_QUIC_FT_MAX_DATA; - frame->u.max_data.max_data = qc->streams.recv_max_data; - - ngx_quic_queue_frame(qc, frame); - - return NGX_OK; -} - - -static void -ngx_quic_set_event(ngx_event_t *ev) -{ - ev->ready = 1; - - if (ev->active) { - ngx_post_event(ev, &ngx_posted_events); - } -} diff --git a/src/deps/src/nginx-1.30.3/src/event/quic/ngx_event_quic_streams.h b/src/deps/src/nginx-1.30.3/src/event/quic/ngx_event_quic_streams.h deleted file mode 100644 index fb6dbbd8f4..0000000000 --- a/src/deps/src/nginx-1.30.3/src/event/quic/ngx_event_quic_streams.h +++ /dev/null @@ -1,44 +0,0 @@ - -/* - * Copyright (C) Nginx, Inc. - */ - - -#ifndef _NGX_EVENT_QUIC_STREAMS_H_INCLUDED_ -#define _NGX_EVENT_QUIC_STREAMS_H_INCLUDED_ - - -#include -#include - - -ngx_int_t ngx_quic_handle_stream_frame(ngx_connection_t *c, - ngx_quic_header_t *pkt, ngx_quic_frame_t *frame); -void ngx_quic_handle_stream_ack(ngx_connection_t *c, - ngx_quic_frame_t *f); -ngx_int_t ngx_quic_handle_max_data_frame(ngx_connection_t *c, - ngx_quic_max_data_frame_t *f); -ngx_int_t ngx_quic_handle_streams_blocked_frame(ngx_connection_t *c, - ngx_quic_header_t *pkt, ngx_quic_streams_blocked_frame_t *f); -ngx_int_t ngx_quic_handle_data_blocked_frame(ngx_connection_t *c, - ngx_quic_header_t *pkt, ngx_quic_data_blocked_frame_t *f); -ngx_int_t ngx_quic_handle_stream_data_blocked_frame(ngx_connection_t *c, - ngx_quic_header_t *pkt, ngx_quic_stream_data_blocked_frame_t *f); -ngx_int_t ngx_quic_handle_max_stream_data_frame(ngx_connection_t *c, - ngx_quic_header_t *pkt, ngx_quic_max_stream_data_frame_t *f); -ngx_int_t ngx_quic_handle_reset_stream_frame(ngx_connection_t *c, - ngx_quic_header_t *pkt, ngx_quic_reset_stream_frame_t *f); -ngx_int_t ngx_quic_handle_stop_sending_frame(ngx_connection_t *c, - ngx_quic_header_t *pkt, ngx_quic_stop_sending_frame_t *f); -ngx_int_t ngx_quic_handle_max_streams_frame(ngx_connection_t *c, - ngx_quic_header_t *pkt, ngx_quic_max_streams_frame_t *f); - -ngx_int_t ngx_quic_init_streams(ngx_connection_t *c); -void ngx_quic_rbtree_insert_stream(ngx_rbtree_node_t *temp, - ngx_rbtree_node_t *node, ngx_rbtree_node_t *sentinel); -ngx_quic_stream_t *ngx_quic_find_stream(ngx_rbtree_t *rbtree, - uint64_t id); -ngx_int_t ngx_quic_close_streams(ngx_connection_t *c, - ngx_quic_connection_t *qc); - -#endif /* _NGX_EVENT_QUIC_STREAMS_H_INCLUDED_ */ diff --git a/src/deps/src/nginx-1.30.3/src/event/quic/ngx_event_quic_tokens.c b/src/deps/src/nginx-1.30.3/src/event/quic/ngx_event_quic_tokens.c deleted file mode 100644 index b78d85a449..0000000000 --- a/src/deps/src/nginx-1.30.3/src/event/quic/ngx_event_quic_tokens.c +++ /dev/null @@ -1,265 +0,0 @@ - -/* - * Copyright (C) Nginx, Inc. - */ - - -#include -#include -#include -#include - - -ngx_int_t -ngx_quic_new_sr_token(ngx_connection_t *c, ngx_str_t *cid, u_char *secret, - u_char *token) -{ - ngx_str_t tmp; - u_char buf[NGX_QUIC_SR_KEY_LEN + sizeof(ngx_uint_t)]; - - ngx_memcpy(buf, secret, NGX_QUIC_SR_KEY_LEN); - ngx_memcpy(buf + NGX_QUIC_SR_KEY_LEN, &ngx_worker, sizeof(ngx_uint_t)); - - tmp.data = buf; - tmp.len = sizeof(buf); - - if (ngx_quic_derive_key(c->log, "sr_token_key", &tmp, cid, token, - NGX_QUIC_SR_TOKEN_LEN) - != NGX_OK) - { - return NGX_ERROR; - } - - ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0, - "quic stateless reset token %*xs", - (size_t) NGX_QUIC_SR_TOKEN_LEN, token); - - return NGX_OK; -} - - -ngx_int_t -ngx_quic_new_token(ngx_log_t *log, struct sockaddr *sockaddr, - socklen_t socklen, u_char *key, ngx_str_t *token, ngx_str_t *odcid, - time_t exp, ngx_uint_t is_retry) -{ - int len, iv_len; - u_char *p, *iv; - EVP_CIPHER_CTX *ctx; - const EVP_CIPHER *cipher; - - u_char in[NGX_QUIC_MAX_TOKEN_SIZE]; - - ngx_quic_address_hash(sockaddr, socklen, !is_retry, NULL, 0, in); - - p = in + 20; - - p = ngx_cpymem(p, &exp, sizeof(time_t)); - - *p++ = is_retry ? 1 : 0; - - if (odcid) { - *p++ = odcid->len; - p = ngx_cpymem(p, odcid->data, odcid->len); - - } else { - *p++ = 0; - } - - len = p - in; - - cipher = EVP_aes_256_gcm(); - iv_len = NGX_QUIC_AES_256_GCM_IV_LEN; - - if ((size_t) (iv_len + len + NGX_QUIC_AES_256_GCM_TAG_LEN) > token->len) { - ngx_log_error(NGX_LOG_ALERT, log, 0, "quic token buffer is too small"); - return NGX_ERROR; - } - - ctx = EVP_CIPHER_CTX_new(); - if (ctx == NULL) { - return NGX_ERROR; - } - - iv = token->data; - - if (RAND_bytes(iv, iv_len) <= 0 - || !EVP_EncryptInit_ex(ctx, cipher, NULL, key, iv)) - { - EVP_CIPHER_CTX_free(ctx); - return NGX_ERROR; - } - - token->len = iv_len; - - if (EVP_EncryptUpdate(ctx, token->data + token->len, &len, in, len) != 1) { - EVP_CIPHER_CTX_free(ctx); - return NGX_ERROR; - } - - token->len += len; - - if (EVP_EncryptFinal_ex(ctx, token->data + token->len, &len) <= 0) { - EVP_CIPHER_CTX_free(ctx); - return NGX_ERROR; - } - - token->len += len; - - if (EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_AEAD_GET_TAG, - NGX_QUIC_AES_256_GCM_TAG_LEN, - token->data + token->len) - == 0) - { - EVP_CIPHER_CTX_free(ctx); - return NGX_ERROR; - } - - token->len += NGX_QUIC_AES_256_GCM_TAG_LEN; - - EVP_CIPHER_CTX_free(ctx); - -#ifdef NGX_QUIC_DEBUG_PACKETS - ngx_log_debug2(NGX_LOG_DEBUG_EVENT, log, 0, - "quic new token len:%uz %xV", token->len, token); -#endif - - return NGX_OK; -} - - -ngx_int_t -ngx_quic_validate_token(ngx_connection_t *c, u_char *key, - ngx_quic_header_t *pkt) -{ - int len, tlen, iv_len; - u_char *iv, *p; - time_t now, exp; - size_t total; - ngx_str_t odcid; - EVP_CIPHER_CTX *ctx; - const EVP_CIPHER *cipher; - - u_char addr_hash[20]; - u_char tdec[NGX_QUIC_MAX_TOKEN_SIZE]; - -#if NGX_SUPPRESS_WARN - ngx_str_null(&odcid); -#endif - - /* Retry token or NEW_TOKEN in a previous connection */ - - cipher = EVP_aes_256_gcm(); - iv = pkt->token.data; - iv_len = NGX_QUIC_AES_256_GCM_IV_LEN; - - /* sanity checks */ - - if (pkt->token.len < (size_t) iv_len + NGX_QUIC_AES_256_GCM_TAG_LEN) { - goto garbage; - } - - if (pkt->token.len > (size_t) iv_len + NGX_QUIC_MAX_TOKEN_SIZE - + NGX_QUIC_AES_256_GCM_TAG_LEN) - { - goto garbage; - } - - ctx = EVP_CIPHER_CTX_new(); - if (ctx == NULL) { - return NGX_ERROR; - } - - if (!EVP_DecryptInit_ex(ctx, cipher, NULL, key, iv)) { - EVP_CIPHER_CTX_free(ctx); - return NGX_ERROR; - } - - p = pkt->token.data + iv_len; - len = pkt->token.len - iv_len - NGX_QUIC_AES_256_GCM_TAG_LEN; - - if (EVP_DecryptUpdate(ctx, tdec, &tlen, p, len) != 1) { - EVP_CIPHER_CTX_free(ctx); - goto garbage; - } - total = tlen; - - if (EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_AEAD_SET_TAG, - NGX_QUIC_AES_256_GCM_TAG_LEN, p + len) - == 0) - { - EVP_CIPHER_CTX_free(ctx); - goto garbage; - } - - if (EVP_DecryptFinal_ex(ctx, tdec + tlen, &tlen) <= 0) { - EVP_CIPHER_CTX_free(ctx); - goto garbage; - } - total += tlen; - - EVP_CIPHER_CTX_free(ctx); - - if (total < (20 + sizeof(time_t) + 2)) { - goto garbage; - } - - p = tdec + 20; - - ngx_memcpy(&exp, p, sizeof(time_t)); - p += sizeof(time_t); - - pkt->retried = (*p++ == 1); - - ngx_quic_address_hash(c->sockaddr, c->socklen, !pkt->retried, NULL, 0, - addr_hash); - - if (ngx_memcmp(tdec, addr_hash, 20) != 0) { - goto bad_token; - } - - odcid.len = *p++; - if (odcid.len) { - if (odcid.len > NGX_QUIC_MAX_CID_LEN) { - goto bad_token; - } - - if ((size_t)(tdec + total - p) < odcid.len) { - goto bad_token; - } - - odcid.data = p; - } - - now = ngx_time(); - - if (now > exp) { - ngx_log_error(NGX_LOG_INFO, c->log, 0, "quic expired token"); - return NGX_DECLINED; - } - - if (odcid.len) { - pkt->odcid.len = odcid.len; - pkt->odcid.data = pkt->odcid_buf; - ngx_memcpy(pkt->odcid.data, odcid.data, odcid.len); - - } else { - pkt->odcid = pkt->dcid; - } - - pkt->validated = 1; - - return NGX_OK; - -garbage: - - ngx_log_error(NGX_LOG_INFO, c->log, 0, "quic garbage token"); - - return NGX_ABORT; - -bad_token: - - ngx_log_error(NGX_LOG_INFO, c->log, 0, "quic invalid token"); - - return NGX_DECLINED; -} diff --git a/src/deps/src/nginx-1.30.3/src/event/quic/ngx_event_quic_tokens.h b/src/deps/src/nginx-1.30.3/src/event/quic/ngx_event_quic_tokens.h deleted file mode 100644 index ee3fe5b9a0..0000000000 --- a/src/deps/src/nginx-1.30.3/src/event/quic/ngx_event_quic_tokens.h +++ /dev/null @@ -1,34 +0,0 @@ - -/* - * Copyright (C) Nginx, Inc. - */ - - -#ifndef _NGX_EVENT_QUIC_TOKENS_H_INCLUDED_ -#define _NGX_EVENT_QUIC_TOKENS_H_INCLUDED_ - - -#include -#include - - -#define NGX_QUIC_MAX_TOKEN_SIZE 64 - /* SHA-1(addr)=20 + sizeof(time_t) + retry(1) + odcid.len(1) + odcid */ - -#define NGX_QUIC_AES_256_GCM_IV_LEN 12 -#define NGX_QUIC_AES_256_GCM_TAG_LEN 16 - -#define NGX_QUIC_TOKEN_BUF_SIZE (NGX_QUIC_AES_256_GCM_IV_LEN \ - + NGX_QUIC_MAX_TOKEN_SIZE \ - + NGX_QUIC_AES_256_GCM_TAG_LEN) - - -ngx_int_t ngx_quic_new_sr_token(ngx_connection_t *c, ngx_str_t *cid, - u_char *secret, u_char *token); -ngx_int_t ngx_quic_new_token(ngx_log_t *log, struct sockaddr *sockaddr, - socklen_t socklen, u_char *key, ngx_str_t *token, ngx_str_t *odcid, - time_t expires, ngx_uint_t is_retry); -ngx_int_t ngx_quic_validate_token(ngx_connection_t *c, - u_char *key, ngx_quic_header_t *pkt); - -#endif /* _NGX_EVENT_QUIC_TOKENS_H_INCLUDED_ */ diff --git a/src/deps/src/nginx-1.30.3/src/event/quic/ngx_event_quic_transport.c b/src/deps/src/nginx-1.30.3/src/event/quic/ngx_event_quic_transport.c deleted file mode 100644 index ba6211c33d..0000000000 --- a/src/deps/src/nginx-1.30.3/src/event/quic/ngx_event_quic_transport.c +++ /dev/null @@ -1,2215 +0,0 @@ - -/* - * Copyright (C) Nginx, Inc. - */ - - -#include -#include -#include -#include - - -#define NGX_QUIC_LONG_DCID_LEN_OFFSET 5 -#define NGX_QUIC_LONG_DCID_OFFSET 6 -#define NGX_QUIC_SHORT_DCID_OFFSET 1 - -#define NGX_QUIC_STREAM_FRAME_FIN 0x01 -#define NGX_QUIC_STREAM_FRAME_LEN 0x02 -#define NGX_QUIC_STREAM_FRAME_OFF 0x04 - - -#if (NGX_HAVE_NONALIGNED) - -#define ngx_quic_parse_uint16(p) ntohs(*(uint16_t *) (p)) -#define ngx_quic_parse_uint32(p) ntohl(*(uint32_t *) (p)) - -#define ngx_quic_write_uint16 ngx_quic_write_uint16_aligned -#define ngx_quic_write_uint32 ngx_quic_write_uint32_aligned - -#else - -#define ngx_quic_parse_uint16(p) ((p)[0] << 8 | (p)[1]) -#define ngx_quic_parse_uint32(p) \ - ((uint32_t) (p)[0] << 24 | (p)[1] << 16 | (p)[2] << 8 | (p)[3]) - -#define ngx_quic_write_uint16(p, s) \ - ((p)[0] = (u_char) ((s) >> 8), \ - (p)[1] = (u_char) (s), \ - (p) + sizeof(uint16_t)) - -#define ngx_quic_write_uint32(p, s) \ - ((p)[0] = (u_char) ((s) >> 24), \ - (p)[1] = (u_char) ((s) >> 16), \ - (p)[2] = (u_char) ((s) >> 8), \ - (p)[3] = (u_char) (s), \ - (p) + sizeof(uint32_t)) - -#endif - -#define ngx_quic_write_uint64(p, s) \ - ((p)[0] = (u_char) ((s) >> 56), \ - (p)[1] = (u_char) ((s) >> 48), \ - (p)[2] = (u_char) ((s) >> 40), \ - (p)[3] = (u_char) ((s) >> 32), \ - (p)[4] = (u_char) ((s) >> 24), \ - (p)[5] = (u_char) ((s) >> 16), \ - (p)[6] = (u_char) ((s) >> 8), \ - (p)[7] = (u_char) (s), \ - (p) + sizeof(uint64_t)) - -#define ngx_quic_write_uint24(p, s) \ - ((p)[0] = (u_char) ((s) >> 16), \ - (p)[1] = (u_char) ((s) >> 8), \ - (p)[2] = (u_char) (s), \ - (p) + 3) - -#define ngx_quic_write_uint16_aligned(p, s) \ - (*(uint16_t *) (p) = htons((uint16_t) (s)), (p) + sizeof(uint16_t)) - -#define ngx_quic_write_uint32_aligned(p, s) \ - (*(uint32_t *) (p) = htonl((uint32_t) (s)), (p) + sizeof(uint32_t)) - -#define ngx_quic_build_int_set(p, value, len, bits) \ - (*(p)++ = ((value >> ((len) * 8)) & 0xff) | ((bits) << 6)) - - -static u_char *ngx_quic_parse_int(u_char *pos, u_char *end, uint64_t *out); -static ngx_uint_t ngx_quic_varint_len(uint64_t value); -static void ngx_quic_build_int(u_char **pos, uint64_t value); - -static u_char *ngx_quic_read_uint8(u_char *pos, u_char *end, uint8_t *value); -static u_char *ngx_quic_read_uint32(u_char *pos, u_char *end, uint32_t *value); -static u_char *ngx_quic_read_bytes(u_char *pos, u_char *end, size_t len, - u_char **out); -static u_char *ngx_quic_copy_bytes(u_char *pos, u_char *end, size_t len, - u_char *dst); - -static ngx_int_t ngx_quic_parse_short_header(ngx_quic_header_t *pkt, - size_t dcid_len); -static ngx_int_t ngx_quic_parse_long_header(ngx_quic_header_t *pkt); -static ngx_int_t ngx_quic_supported_version(uint32_t version); -static ngx_int_t ngx_quic_parse_long_header_v1(ngx_quic_header_t *pkt); - -static size_t ngx_quic_create_long_header(ngx_quic_header_t *pkt, u_char *out, - u_char **pnp); -static size_t ngx_quic_create_short_header(ngx_quic_header_t *pkt, u_char *out, - u_char **pnp); - -static ngx_int_t ngx_quic_frame_allowed(ngx_quic_header_t *pkt, - ngx_uint_t frame_type); -static size_t ngx_quic_create_ping(u_char *p); -static size_t ngx_quic_create_ack(u_char *p, ngx_quic_ack_frame_t *ack, - ngx_chain_t *ranges); -static size_t ngx_quic_create_reset_stream(u_char *p, - ngx_quic_reset_stream_frame_t *rs); -static size_t ngx_quic_create_stop_sending(u_char *p, - ngx_quic_stop_sending_frame_t *ss); -static size_t ngx_quic_create_crypto(u_char *p, - ngx_quic_crypto_frame_t *crypto, ngx_chain_t *data); -static size_t ngx_quic_create_hs_done(u_char *p); -static size_t ngx_quic_create_new_token(u_char *p, - ngx_quic_new_token_frame_t *token, ngx_chain_t *data); -static size_t ngx_quic_create_stream(u_char *p, ngx_quic_stream_frame_t *sf, - ngx_chain_t *data); -static size_t ngx_quic_create_max_streams(u_char *p, - ngx_quic_max_streams_frame_t *ms); -static size_t ngx_quic_create_max_stream_data(u_char *p, - ngx_quic_max_stream_data_frame_t *ms); -static size_t ngx_quic_create_max_data(u_char *p, - ngx_quic_max_data_frame_t *md); -static size_t ngx_quic_create_path_challenge(u_char *p, - ngx_quic_path_challenge_frame_t *pc); -static size_t ngx_quic_create_path_response(u_char *p, - ngx_quic_path_challenge_frame_t *pc); -static size_t ngx_quic_create_new_connection_id(u_char *p, - ngx_quic_new_conn_id_frame_t *rcid); -static size_t ngx_quic_create_retire_connection_id(u_char *p, - ngx_quic_retire_cid_frame_t *rcid); -static size_t ngx_quic_create_close(u_char *p, ngx_quic_frame_t *f); - -static ngx_int_t ngx_quic_parse_transport_param(u_char *p, u_char *end, - uint16_t id, ngx_quic_tp_t *dst); - - -uint32_t ngx_quic_versions[] = { - /* QUICv1 */ - 0x00000001, -}; - -#define NGX_QUIC_NVERSIONS \ - (sizeof(ngx_quic_versions) / sizeof(ngx_quic_versions[0])) - - -static ngx_inline u_char * -ngx_quic_parse_int(u_char *pos, u_char *end, uint64_t *out) -{ - u_char *p; - uint64_t value; - ngx_uint_t len; - - if (pos >= end) { - return NULL; - } - - p = pos; - len = 1 << (*p >> 6); - - value = *p++ & 0x3f; - - if ((size_t)(end - p) < (len - 1)) { - return NULL; - } - - while (--len) { - value = (value << 8) + *p++; - } - - *out = value; - - return p; -} - - -static ngx_inline u_char * -ngx_quic_read_uint8(u_char *pos, u_char *end, uint8_t *value) -{ - if ((size_t)(end - pos) < 1) { - return NULL; - } - - *value = *pos; - - return pos + 1; -} - - -static ngx_inline u_char * -ngx_quic_read_uint32(u_char *pos, u_char *end, uint32_t *value) -{ - if ((size_t)(end - pos) < sizeof(uint32_t)) { - return NULL; - } - - *value = ngx_quic_parse_uint32(pos); - - return pos + sizeof(uint32_t); -} - - -static ngx_inline u_char * -ngx_quic_read_bytes(u_char *pos, u_char *end, size_t len, u_char **out) -{ - if ((size_t)(end - pos) < len) { - return NULL; - } - - *out = pos; - - return pos + len; -} - - -static u_char * -ngx_quic_copy_bytes(u_char *pos, u_char *end, size_t len, u_char *dst) -{ - if ((size_t)(end - pos) < len) { - return NULL; - } - - ngx_memcpy(dst, pos, len); - - return pos + len; -} - - -static ngx_inline ngx_uint_t -ngx_quic_varint_len(uint64_t value) -{ - if (value < (1 << 6)) { - return 1; - } - - if (value < (1 << 14)) { - return 2; - } - - if (value < (1 << 30)) { - return 4; - } - - return 8; -} - - -static ngx_inline void -ngx_quic_build_int(u_char **pos, uint64_t value) -{ - u_char *p; - - p = *pos; - - if (value < (1 << 6)) { - ngx_quic_build_int_set(p, value, 0, 0); - - } else if (value < (1 << 14)) { - ngx_quic_build_int_set(p, value, 1, 1); - ngx_quic_build_int_set(p, value, 0, 0); - - } else if (value < (1 << 30)) { - ngx_quic_build_int_set(p, value, 3, 2); - ngx_quic_build_int_set(p, value, 2, 0); - ngx_quic_build_int_set(p, value, 1, 0); - ngx_quic_build_int_set(p, value, 0, 0); - - } else { - ngx_quic_build_int_set(p, value, 7, 3); - ngx_quic_build_int_set(p, value, 6, 0); - ngx_quic_build_int_set(p, value, 5, 0); - ngx_quic_build_int_set(p, value, 4, 0); - ngx_quic_build_int_set(p, value, 3, 0); - ngx_quic_build_int_set(p, value, 2, 0); - ngx_quic_build_int_set(p, value, 1, 0); - ngx_quic_build_int_set(p, value, 0, 0); - } - - *pos = p; -} - - -ngx_int_t -ngx_quic_parse_packet(ngx_quic_header_t *pkt) -{ - if (!ngx_quic_long_pkt(pkt->flags)) { - pkt->level = NGX_QUIC_ENCRYPTION_APPLICATION; - - if (ngx_quic_parse_short_header(pkt, NGX_QUIC_SERVER_CID_LEN) != NGX_OK) - { - return NGX_ERROR; - } - - return NGX_OK; - } - - if (ngx_quic_parse_long_header(pkt) != NGX_OK) { - return NGX_ERROR; - } - - if (pkt->version == 0) { - /* version negotiation */ - return NGX_ERROR; - } - - if (!ngx_quic_supported_version(pkt->version)) { - return NGX_ABORT; - } - - if (ngx_quic_parse_long_header_v1(pkt) != NGX_OK) { - return NGX_ERROR; - } - - return NGX_OK; -} - - -static ngx_int_t -ngx_quic_parse_short_header(ngx_quic_header_t *pkt, size_t dcid_len) -{ - u_char *p, *end; - - p = pkt->raw->pos; - end = pkt->data + pkt->len; - - ngx_log_debug1(NGX_LOG_DEBUG_EVENT, pkt->log, 0, - "quic packet rx short flags:%xd", pkt->flags); - - if (!(pkt->flags & NGX_QUIC_PKT_FIXED_BIT)) { - ngx_log_error(NGX_LOG_INFO, pkt->log, 0, "quic fixed bit is not set"); - return NGX_ERROR; - } - - pkt->dcid.len = dcid_len; - - p = ngx_quic_read_bytes(p, end, dcid_len, &pkt->dcid.data); - if (p == NULL) { - ngx_log_error(NGX_LOG_INFO, pkt->log, 0, - "quic packet is too small to read dcid"); - return NGX_ERROR; - } - - pkt->raw->pos = p; - - return NGX_OK; -} - - -static ngx_int_t -ngx_quic_parse_long_header(ngx_quic_header_t *pkt) -{ - u_char *p, *end; - uint8_t idlen; - - p = pkt->raw->pos; - end = pkt->data + pkt->len; - - p = ngx_quic_read_uint32(p, end, &pkt->version); - if (p == NULL) { - ngx_log_error(NGX_LOG_INFO, pkt->log, 0, - "quic packet is too small to read version"); - return NGX_ERROR; - } - - ngx_log_debug2(NGX_LOG_DEBUG_EVENT, pkt->log, 0, - "quic packet rx long flags:%xd version:%xD", - pkt->flags, pkt->version); - - if (!(pkt->flags & NGX_QUIC_PKT_FIXED_BIT)) { - ngx_log_error(NGX_LOG_INFO, pkt->log, 0, "quic fixed bit is not set"); - return NGX_ERROR; - } - - p = ngx_quic_read_uint8(p, end, &idlen); - if (p == NULL) { - ngx_log_error(NGX_LOG_INFO, pkt->log, 0, - "quic packet is too small to read dcid len"); - return NGX_ERROR; - } - - if (idlen > NGX_QUIC_CID_LEN_MAX) { - ngx_log_error(NGX_LOG_INFO, pkt->log, 0, - "quic packet dcid is too long"); - return NGX_ERROR; - } - - pkt->dcid.len = idlen; - - p = ngx_quic_read_bytes(p, end, idlen, &pkt->dcid.data); - if (p == NULL) { - ngx_log_error(NGX_LOG_INFO, pkt->log, 0, - "quic packet is too small to read dcid"); - return NGX_ERROR; - } - - p = ngx_quic_read_uint8(p, end, &idlen); - if (p == NULL) { - ngx_log_error(NGX_LOG_INFO, pkt->log, 0, - "quic packet is too small to read scid len"); - return NGX_ERROR; - } - - if (idlen > NGX_QUIC_CID_LEN_MAX) { - ngx_log_error(NGX_LOG_INFO, pkt->log, 0, - "quic packet scid is too long"); - return NGX_ERROR; - } - - pkt->scid.len = idlen; - - p = ngx_quic_read_bytes(p, end, idlen, &pkt->scid.data); - if (p == NULL) { - ngx_log_error(NGX_LOG_INFO, pkt->log, 0, - "quic packet is too small to read scid"); - return NGX_ERROR; - } - - pkt->raw->pos = p; - - return NGX_OK; -} - - -static ngx_int_t -ngx_quic_supported_version(uint32_t version) -{ - ngx_uint_t i; - - for (i = 0; i < NGX_QUIC_NVERSIONS; i++) { - if (ngx_quic_versions[i] == version) { - return 1; - } - } - - return 0; -} - - -static ngx_int_t -ngx_quic_parse_long_header_v1(ngx_quic_header_t *pkt) -{ - u_char *p, *end; - uint64_t varint; - - p = pkt->raw->pos; - end = pkt->raw->last; - - pkt->log->action = "parsing quic long header"; - - if (ngx_quic_pkt_in(pkt->flags)) { - - if (pkt->len < NGX_QUIC_MIN_INITIAL_SIZE) { - ngx_log_error(NGX_LOG_INFO, pkt->log, 0, - "quic UDP datagram is too small for initial packet"); - return NGX_DECLINED; - } - - p = ngx_quic_parse_int(p, end, &varint); - if (p == NULL) { - ngx_log_error(NGX_LOG_INFO, pkt->log, 0, - "quic failed to parse token length"); - return NGX_ERROR; - } - - pkt->token.len = varint; - - p = ngx_quic_read_bytes(p, end, pkt->token.len, &pkt->token.data); - if (p == NULL) { - ngx_log_error(NGX_LOG_INFO, pkt->log, 0, - "quic packet too small to read token data"); - return NGX_ERROR; - } - - pkt->level = NGX_QUIC_ENCRYPTION_INITIAL; - - } else if (ngx_quic_pkt_zrtt(pkt->flags)) { - pkt->level = NGX_QUIC_ENCRYPTION_EARLY_DATA; - - } else if (ngx_quic_pkt_hs(pkt->flags)) { - pkt->level = NGX_QUIC_ENCRYPTION_HANDSHAKE; - - } else { - ngx_log_error(NGX_LOG_INFO, pkt->log, 0, - "quic bad packet type"); - return NGX_DECLINED; - } - - p = ngx_quic_parse_int(p, end, &varint); - if (p == NULL) { - ngx_log_error(NGX_LOG_INFO, pkt->log, 0, "quic bad packet length"); - return NGX_ERROR; - } - - ngx_log_debug2(NGX_LOG_DEBUG_EVENT, pkt->log, 0, - "quic packet rx %s len:%uL", - ngx_quic_level_name(pkt->level), varint); - - if (varint > (uint64_t) ((pkt->data + pkt->len) - p)) { - ngx_log_error(NGX_LOG_INFO, pkt->log, 0, "quic truncated %s packet", - ngx_quic_level_name(pkt->level)); - return NGX_ERROR; - } - - pkt->raw->pos = p; - pkt->len = p + varint - pkt->data; - - return NGX_OK; -} - - -ngx_int_t -ngx_quic_get_packet_dcid(ngx_log_t *log, u_char *data, size_t n, - ngx_str_t *dcid) -{ - size_t len, offset; - - if (n == 0) { - goto failed; - } - - if (ngx_quic_long_pkt(*data)) { - if (n < NGX_QUIC_LONG_DCID_LEN_OFFSET + 1) { - goto failed; - } - - len = data[NGX_QUIC_LONG_DCID_LEN_OFFSET]; - offset = NGX_QUIC_LONG_DCID_OFFSET; - - } else { - len = NGX_QUIC_SERVER_CID_LEN; - offset = NGX_QUIC_SHORT_DCID_OFFSET; - } - - if (n < len + offset) { - goto failed; - } - - dcid->len = len; - dcid->data = &data[offset]; - - return NGX_OK; - -failed: - - ngx_log_debug0(NGX_LOG_DEBUG_EVENT, log, 0, "quic malformed packet"); - - return NGX_ERROR; -} - - -size_t -ngx_quic_create_version_negotiation(ngx_quic_header_t *pkt, u_char *out) -{ - u_char *p, *start; - ngx_uint_t i; - - p = start = out; - - *p++ = pkt->flags; - - /* - * The Version field of a Version Negotiation packet - * MUST be set to 0x00000000 - */ - p = ngx_quic_write_uint32(p, 0); - - *p++ = pkt->dcid.len; - p = ngx_cpymem(p, pkt->dcid.data, pkt->dcid.len); - - *p++ = pkt->scid.len; - p = ngx_cpymem(p, pkt->scid.data, pkt->scid.len); - - for (i = 0; i < NGX_QUIC_NVERSIONS; i++) { - p = ngx_quic_write_uint32(p, ngx_quic_versions[i]); - } - - return p - start; -} - - -/* returns the amount of payload quic packet of "pkt_len" size may fit or 0 */ -size_t -ngx_quic_payload_size(ngx_quic_header_t *pkt, size_t pkt_len) -{ - size_t len; - - if (ngx_quic_short_pkt(pkt->flags)) { - - len = 1 + pkt->dcid.len + pkt->num_len + NGX_QUIC_TAG_LEN; - if (len > pkt_len) { - return 0; - } - - return pkt_len - len; - } - - /* flags, version, dcid and scid with lengths and zero-length token */ - len = 5 + 2 + pkt->dcid.len + pkt->scid.len - + (pkt->level == NGX_QUIC_ENCRYPTION_INITIAL ? 1 : 0); - - if (len > pkt_len) { - return 0; - } - - /* (pkt_len - len) is 'remainder' packet length (see RFC 9000, 17.2) */ - len += ngx_quic_varint_len(pkt_len - len) - + pkt->num_len + NGX_QUIC_TAG_LEN; - - if (len > pkt_len) { - return 0; - } - - return pkt_len - len; -} - - -size_t -ngx_quic_create_header(ngx_quic_header_t *pkt, u_char *out, u_char **pnp) -{ - return ngx_quic_short_pkt(pkt->flags) - ? ngx_quic_create_short_header(pkt, out, pnp) - : ngx_quic_create_long_header(pkt, out, pnp); -} - - -static size_t -ngx_quic_create_long_header(ngx_quic_header_t *pkt, u_char *out, - u_char **pnp) -{ - size_t rem_len; - u_char *p, *start; - - rem_len = pkt->num_len + pkt->payload.len + NGX_QUIC_TAG_LEN; - - if (out == NULL) { - return 5 + 2 + pkt->dcid.len + pkt->scid.len - + ngx_quic_varint_len(rem_len) + pkt->num_len - + (pkt->level == NGX_QUIC_ENCRYPTION_INITIAL ? 1 : 0); - } - - p = start = out; - - *p++ = pkt->flags; - - p = ngx_quic_write_uint32(p, pkt->version); - - *p++ = pkt->dcid.len; - p = ngx_cpymem(p, pkt->dcid.data, pkt->dcid.len); - - *p++ = pkt->scid.len; - p = ngx_cpymem(p, pkt->scid.data, pkt->scid.len); - - if (pkt->level == NGX_QUIC_ENCRYPTION_INITIAL) { - ngx_quic_build_int(&p, 0); - } - - ngx_quic_build_int(&p, rem_len); - - *pnp = p; - - switch (pkt->num_len) { - case 1: - *p++ = pkt->trunc; - break; - case 2: - p = ngx_quic_write_uint16(p, pkt->trunc); - break; - case 3: - p = ngx_quic_write_uint24(p, pkt->trunc); - break; - case 4: - p = ngx_quic_write_uint32(p, pkt->trunc); - break; - } - - return p - start; -} - - -static size_t -ngx_quic_create_short_header(ngx_quic_header_t *pkt, u_char *out, - u_char **pnp) -{ - u_char *p, *start; - - if (out == NULL) { - return 1 + pkt->dcid.len + pkt->num_len; - } - - p = start = out; - - *p++ = pkt->flags; - - p = ngx_cpymem(p, pkt->dcid.data, pkt->dcid.len); - - *pnp = p; - - switch (pkt->num_len) { - case 1: - *p++ = pkt->trunc; - break; - case 2: - p = ngx_quic_write_uint16(p, pkt->trunc); - break; - case 3: - p = ngx_quic_write_uint24(p, pkt->trunc); - break; - case 4: - p = ngx_quic_write_uint32(p, pkt->trunc); - break; - } - - return p - start; -} - - -size_t -ngx_quic_create_retry_itag(ngx_quic_header_t *pkt, u_char *out, - u_char **start) -{ - u_char *p; - - p = out; - - *p++ = pkt->odcid.len; - p = ngx_cpymem(p, pkt->odcid.data, pkt->odcid.len); - - *start = p; - - *p++ = 0xff; - - p = ngx_quic_write_uint32(p, pkt->version); - - *p++ = pkt->dcid.len; - p = ngx_cpymem(p, pkt->dcid.data, pkt->dcid.len); - - *p++ = pkt->scid.len; - p = ngx_cpymem(p, pkt->scid.data, pkt->scid.len); - - p = ngx_cpymem(p, pkt->token.data, pkt->token.len); - - return p - out; -} - - -ssize_t -ngx_quic_parse_frame(ngx_quic_header_t *pkt, u_char *start, u_char *end, - ngx_quic_frame_t *f) -{ - u_char *p; - uint64_t varint; - ngx_buf_t *b; - ngx_uint_t i; - - b = f->data->buf; - - p = start; - - p = ngx_quic_parse_int(p, end, &varint); - if (p == NULL) { - pkt->error = NGX_QUIC_ERR_FRAME_ENCODING_ERROR; - ngx_log_error(NGX_LOG_INFO, pkt->log, 0, - "quic failed to obtain quic frame type"); - return NGX_ERROR; - } - - if (varint > NGX_QUIC_FT_LAST) { - pkt->error = NGX_QUIC_ERR_FRAME_ENCODING_ERROR; - ngx_log_error(NGX_LOG_INFO, pkt->log, 0, - "quic unknown frame type 0x%xL", varint); - return NGX_ERROR; - } - - f->type = varint; - - if (ngx_quic_frame_allowed(pkt, f->type) != NGX_OK) { - pkt->error = NGX_QUIC_ERR_PROTOCOL_VIOLATION; - return NGX_ERROR; - } - - switch (f->type) { - - case NGX_QUIC_FT_CRYPTO: - - p = ngx_quic_parse_int(p, end, &f->u.crypto.offset); - if (p == NULL) { - goto error; - } - - p = ngx_quic_parse_int(p, end, &f->u.crypto.length); - if (p == NULL) { - goto error; - } - - p = ngx_quic_read_bytes(p, end, f->u.crypto.length, &b->pos); - if (p == NULL) { - goto error; - } - - b->last = p; - - break; - - case NGX_QUIC_FT_PADDING: - - while (p < end && *p == NGX_QUIC_FT_PADDING) { - p++; - } - - break; - - case NGX_QUIC_FT_ACK: - case NGX_QUIC_FT_ACK_ECN: - - p = ngx_quic_parse_int(p, end, &f->u.ack.largest); - if (p == NULL) { - goto error; - } - - p = ngx_quic_parse_int(p, end, &f->u.ack.delay); - if (p == NULL) { - goto error; - } - - p = ngx_quic_parse_int(p, end, &f->u.ack.range_count); - if (p == NULL) { - goto error; - } - - p = ngx_quic_parse_int(p, end, &f->u.ack.first_range); - if (p == NULL) { - goto error; - } - - b->pos = p; - - /* process all ranges to get bounds, values are ignored */ - for (i = 0; i < f->u.ack.range_count; i++) { - - p = ngx_quic_parse_int(p, end, &varint); - if (p == NULL) { - goto error; - } - - p = ngx_quic_parse_int(p, end, &varint); - if (p == NULL) { - goto error; - } - } - - b->last = p; - - f->u.ack.ranges_length = b->last - b->pos; - - if (f->type == NGX_QUIC_FT_ACK_ECN) { - - p = ngx_quic_parse_int(p, end, &f->u.ack.ect0); - if (p == NULL) { - goto error; - } - - p = ngx_quic_parse_int(p, end, &f->u.ack.ect1); - if (p == NULL) { - goto error; - } - - p = ngx_quic_parse_int(p, end, &f->u.ack.ce); - if (p == NULL) { - goto error; - } - - ngx_log_debug3(NGX_LOG_DEBUG_EVENT, pkt->log, 0, - "quic ACK ECN counters ect0:%uL ect1:%uL ce:%uL", - f->u.ack.ect0, f->u.ack.ect1, f->u.ack.ce); - } - - break; - - case NGX_QUIC_FT_PING: - break; - - case NGX_QUIC_FT_NEW_CONNECTION_ID: - - p = ngx_quic_parse_int(p, end, &f->u.ncid.seqnum); - if (p == NULL) { - goto error; - } - - p = ngx_quic_parse_int(p, end, &f->u.ncid.retire); - if (p == NULL) { - goto error; - } - - if (f->u.ncid.retire > f->u.ncid.seqnum) { - goto error; - } - - p = ngx_quic_read_uint8(p, end, &f->u.ncid.len); - if (p == NULL) { - goto error; - } - - if (f->u.ncid.len < 1 || f->u.ncid.len > NGX_QUIC_CID_LEN_MAX) { - goto error; - } - - p = ngx_quic_copy_bytes(p, end, f->u.ncid.len, f->u.ncid.cid); - if (p == NULL) { - goto error; - } - - p = ngx_quic_copy_bytes(p, end, NGX_QUIC_SR_TOKEN_LEN, f->u.ncid.srt); - if (p == NULL) { - goto error; - } - - break; - - case NGX_QUIC_FT_RETIRE_CONNECTION_ID: - - p = ngx_quic_parse_int(p, end, &f->u.retire_cid.sequence_number); - if (p == NULL) { - goto error; - } - - break; - - case NGX_QUIC_FT_CONNECTION_CLOSE: - case NGX_QUIC_FT_CONNECTION_CLOSE_APP: - - p = ngx_quic_parse_int(p, end, &f->u.close.error_code); - if (p == NULL) { - goto error; - } - - if (f->type == NGX_QUIC_FT_CONNECTION_CLOSE) { - p = ngx_quic_parse_int(p, end, &f->u.close.frame_type); - if (p == NULL) { - goto error; - } - } - - p = ngx_quic_parse_int(p, end, &varint); - if (p == NULL) { - goto error; - } - - f->u.close.reason.len = varint; - - p = ngx_quic_read_bytes(p, end, f->u.close.reason.len, - &f->u.close.reason.data); - if (p == NULL) { - goto error; - } - - break; - - case NGX_QUIC_FT_STREAM: - case NGX_QUIC_FT_STREAM1: - case NGX_QUIC_FT_STREAM2: - case NGX_QUIC_FT_STREAM3: - case NGX_QUIC_FT_STREAM4: - case NGX_QUIC_FT_STREAM5: - case NGX_QUIC_FT_STREAM6: - case NGX_QUIC_FT_STREAM7: - - f->u.stream.fin = (f->type & NGX_QUIC_STREAM_FRAME_FIN) ? 1 : 0; - - p = ngx_quic_parse_int(p, end, &f->u.stream.stream_id); - if (p == NULL) { - goto error; - } - - if (f->type & NGX_QUIC_STREAM_FRAME_OFF) { - f->u.stream.off = 1; - - p = ngx_quic_parse_int(p, end, &f->u.stream.offset); - if (p == NULL) { - goto error; - } - - } else { - f->u.stream.off = 0; - f->u.stream.offset = 0; - } - - if (f->type & NGX_QUIC_STREAM_FRAME_LEN) { - f->u.stream.len = 1; - - p = ngx_quic_parse_int(p, end, &f->u.stream.length); - if (p == NULL) { - goto error; - } - - } else { - f->u.stream.len = 0; - f->u.stream.length = end - p; /* up to packet end */ - } - - p = ngx_quic_read_bytes(p, end, f->u.stream.length, &b->pos); - if (p == NULL) { - goto error; - } - - b->last = p; - - f->type = NGX_QUIC_FT_STREAM; - break; - - case NGX_QUIC_FT_MAX_DATA: - - p = ngx_quic_parse_int(p, end, &f->u.max_data.max_data); - if (p == NULL) { - goto error; - } - - break; - - case NGX_QUIC_FT_RESET_STREAM: - - p = ngx_quic_parse_int(p, end, &f->u.reset_stream.id); - if (p == NULL) { - goto error; - } - - p = ngx_quic_parse_int(p, end, &f->u.reset_stream.error_code); - if (p == NULL) { - goto error; - } - - p = ngx_quic_parse_int(p, end, &f->u.reset_stream.final_size); - if (p == NULL) { - goto error; - } - - break; - - case NGX_QUIC_FT_STOP_SENDING: - - p = ngx_quic_parse_int(p, end, &f->u.stop_sending.id); - if (p == NULL) { - goto error; - } - - p = ngx_quic_parse_int(p, end, &f->u.stop_sending.error_code); - if (p == NULL) { - goto error; - } - - break; - - case NGX_QUIC_FT_STREAMS_BLOCKED: - case NGX_QUIC_FT_STREAMS_BLOCKED2: - - p = ngx_quic_parse_int(p, end, &f->u.streams_blocked.limit); - if (p == NULL) { - goto error; - } - - if (f->u.streams_blocked.limit > 0x1000000000000000) { - goto error; - } - - f->u.streams_blocked.bidi = - (f->type == NGX_QUIC_FT_STREAMS_BLOCKED) ? 1 : 0; - break; - - case NGX_QUIC_FT_MAX_STREAMS: - case NGX_QUIC_FT_MAX_STREAMS2: - - p = ngx_quic_parse_int(p, end, &f->u.max_streams.limit); - if (p == NULL) { - goto error; - } - - if (f->u.max_streams.limit > 0x1000000000000000) { - goto error; - } - - f->u.max_streams.bidi = (f->type == NGX_QUIC_FT_MAX_STREAMS) ? 1 : 0; - - break; - - case NGX_QUIC_FT_MAX_STREAM_DATA: - - p = ngx_quic_parse_int(p, end, &f->u.max_stream_data.id); - if (p == NULL) { - goto error; - } - - p = ngx_quic_parse_int(p, end, &f->u.max_stream_data.limit); - if (p == NULL) { - goto error; - } - - break; - - case NGX_QUIC_FT_DATA_BLOCKED: - - p = ngx_quic_parse_int(p, end, &f->u.data_blocked.limit); - if (p == NULL) { - goto error; - } - - break; - - case NGX_QUIC_FT_STREAM_DATA_BLOCKED: - - p = ngx_quic_parse_int(p, end, &f->u.stream_data_blocked.id); - if (p == NULL) { - goto error; - } - - p = ngx_quic_parse_int(p, end, &f->u.stream_data_blocked.limit); - if (p == NULL) { - goto error; - } - - break; - - case NGX_QUIC_FT_PATH_CHALLENGE: - - p = ngx_quic_copy_bytes(p, end, 8, f->u.path_challenge.data); - if (p == NULL) { - goto error; - } - - break; - - case NGX_QUIC_FT_PATH_RESPONSE: - - p = ngx_quic_copy_bytes(p, end, 8, f->u.path_response.data); - if (p == NULL) { - goto error; - } - - break; - - default: - ngx_log_error(NGX_LOG_INFO, pkt->log, 0, - "quic unknown frame type 0x%xi", f->type); - return NGX_ERROR; - } - - f->level = pkt->level; -#if (NGX_DEBUG) - f->pnum = pkt->pn; -#endif - - return p - start; - -error: - - pkt->error = NGX_QUIC_ERR_FRAME_ENCODING_ERROR; - - ngx_log_error(NGX_LOG_INFO, pkt->log, 0, - "quic failed to parse frame type:0x%xi", f->type); - - return NGX_ERROR; -} - - -static ngx_int_t -ngx_quic_frame_allowed(ngx_quic_header_t *pkt, ngx_uint_t frame_type) -{ - uint8_t ptype; - - /* - * RFC 9000, 12.4. Frames and Frame Types: Table 3 - * - * Frame permissions per packet: 4 bits: IH01 - */ - static uint8_t ngx_quic_frame_masks[] = { - /* PADDING */ 0xF, - /* PING */ 0xF, - /* ACK */ 0xD, - /* ACK_ECN */ 0xD, - /* RESET_STREAM */ 0x3, - /* STOP_SENDING */ 0x3, - /* CRYPTO */ 0xD, - /* NEW_TOKEN */ 0x0, /* only sent by server */ - /* STREAM */ 0x3, - /* STREAM1 */ 0x3, - /* STREAM2 */ 0x3, - /* STREAM3 */ 0x3, - /* STREAM4 */ 0x3, - /* STREAM5 */ 0x3, - /* STREAM6 */ 0x3, - /* STREAM7 */ 0x3, - /* MAX_DATA */ 0x3, - /* MAX_STREAM_DATA */ 0x3, - /* MAX_STREAMS */ 0x3, - /* MAX_STREAMS2 */ 0x3, - /* DATA_BLOCKED */ 0x3, - /* STREAM_DATA_BLOCKED */ 0x3, - /* STREAMS_BLOCKED */ 0x3, - /* STREAMS_BLOCKED2 */ 0x3, - /* NEW_CONNECTION_ID */ 0x3, - /* RETIRE_CONNECTION_ID */ 0x3, - /* PATH_CHALLENGE */ 0x3, - /* PATH_RESPONSE */ 0x1, - /* CONNECTION_CLOSE */ 0xF, - /* CONNECTION_CLOSE2 */ 0x3, - /* HANDSHAKE_DONE */ 0x0, /* only sent by server */ - }; - - if (ngx_quic_long_pkt(pkt->flags)) { - - if (ngx_quic_pkt_in(pkt->flags)) { - ptype = 8; /* initial */ - - } else if (ngx_quic_pkt_hs(pkt->flags)) { - ptype = 4; /* handshake */ - - } else { - ptype = 2; /* zero-rtt */ - } - - } else { - ptype = 1; /* application data */ - } - - if (ptype & ngx_quic_frame_masks[frame_type]) { - return NGX_OK; - } - - ngx_log_error(NGX_LOG_INFO, pkt->log, 0, - "quic frame type 0x%xi is not " - "allowed in packet with flags 0x%xd", - frame_type, pkt->flags); - - return NGX_DECLINED; -} - - -ssize_t -ngx_quic_parse_ack_range(ngx_log_t *log, u_char *start, u_char *end, - uint64_t *gap, uint64_t *range) -{ - u_char *p; - - p = start; - - p = ngx_quic_parse_int(p, end, gap); - if (p == NULL) { - ngx_log_error(NGX_LOG_INFO, log, 0, - "quic failed to parse ack frame gap"); - return NGX_ERROR; - } - - p = ngx_quic_parse_int(p, end, range); - if (p == NULL) { - ngx_log_error(NGX_LOG_INFO, log, 0, - "quic failed to parse ack frame range"); - return NGX_ERROR; - } - - return p - start; -} - - -size_t -ngx_quic_create_ack_range(u_char *p, uint64_t gap, uint64_t range) -{ - size_t len; - u_char *start; - - if (p == NULL) { - len = ngx_quic_varint_len(gap); - len += ngx_quic_varint_len(range); - return len; - } - - start = p; - - ngx_quic_build_int(&p, gap); - ngx_quic_build_int(&p, range); - - return p - start; -} - - -ssize_t -ngx_quic_create_frame(u_char *p, ngx_quic_frame_t *f) -{ - /* - * RFC 9002, 2. Conventions and Definitions - * - * Ack-eliciting frames: All frames other than ACK, PADDING, and - * CONNECTION_CLOSE are considered ack-eliciting. - */ - f->need_ack = 1; - - switch (f->type) { - case NGX_QUIC_FT_PING: - return ngx_quic_create_ping(p); - - case NGX_QUIC_FT_ACK: - f->need_ack = 0; - return ngx_quic_create_ack(p, &f->u.ack, f->data); - - case NGX_QUIC_FT_RESET_STREAM: - return ngx_quic_create_reset_stream(p, &f->u.reset_stream); - - case NGX_QUIC_FT_STOP_SENDING: - return ngx_quic_create_stop_sending(p, &f->u.stop_sending); - - case NGX_QUIC_FT_CRYPTO: - return ngx_quic_create_crypto(p, &f->u.crypto, f->data); - - case NGX_QUIC_FT_HANDSHAKE_DONE: - return ngx_quic_create_hs_done(p); - - case NGX_QUIC_FT_NEW_TOKEN: - return ngx_quic_create_new_token(p, &f->u.token, f->data); - - case NGX_QUIC_FT_STREAM: - return ngx_quic_create_stream(p, &f->u.stream, f->data); - - case NGX_QUIC_FT_CONNECTION_CLOSE: - case NGX_QUIC_FT_CONNECTION_CLOSE_APP: - f->need_ack = 0; - return ngx_quic_create_close(p, f); - - case NGX_QUIC_FT_MAX_STREAMS: - return ngx_quic_create_max_streams(p, &f->u.max_streams); - - case NGX_QUIC_FT_MAX_STREAM_DATA: - return ngx_quic_create_max_stream_data(p, &f->u.max_stream_data); - - case NGX_QUIC_FT_MAX_DATA: - return ngx_quic_create_max_data(p, &f->u.max_data); - - case NGX_QUIC_FT_PATH_CHALLENGE: - return ngx_quic_create_path_challenge(p, &f->u.path_challenge); - - case NGX_QUIC_FT_PATH_RESPONSE: - return ngx_quic_create_path_response(p, &f->u.path_response); - - case NGX_QUIC_FT_NEW_CONNECTION_ID: - return ngx_quic_create_new_connection_id(p, &f->u.ncid); - - case NGX_QUIC_FT_RETIRE_CONNECTION_ID: - return ngx_quic_create_retire_connection_id(p, &f->u.retire_cid); - - default: - /* BUG: unsupported frame type generated */ - return NGX_ERROR; - } -} - - -static size_t -ngx_quic_create_ping(u_char *p) -{ - u_char *start; - - if (p == NULL) { - return ngx_quic_varint_len(NGX_QUIC_FT_PING); - } - - start = p; - - ngx_quic_build_int(&p, NGX_QUIC_FT_PING); - - return p - start; -} - - -static size_t -ngx_quic_create_ack(u_char *p, ngx_quic_ack_frame_t *ack, ngx_chain_t *ranges) -{ - size_t len; - u_char *start; - ngx_buf_t *b; - - if (p == NULL) { - len = ngx_quic_varint_len(NGX_QUIC_FT_ACK); - len += ngx_quic_varint_len(ack->largest); - len += ngx_quic_varint_len(ack->delay); - len += ngx_quic_varint_len(ack->range_count); - len += ngx_quic_varint_len(ack->first_range); - len += ack->ranges_length; - - return len; - } - - start = p; - - ngx_quic_build_int(&p, NGX_QUIC_FT_ACK); - ngx_quic_build_int(&p, ack->largest); - ngx_quic_build_int(&p, ack->delay); - ngx_quic_build_int(&p, ack->range_count); - ngx_quic_build_int(&p, ack->first_range); - - while (ranges) { - b = ranges->buf; - p = ngx_cpymem(p, b->pos, b->last - b->pos); - ranges = ranges->next; - } - - return p - start; -} - - -static size_t -ngx_quic_create_reset_stream(u_char *p, ngx_quic_reset_stream_frame_t *rs) -{ - size_t len; - u_char *start; - - if (p == NULL) { - len = ngx_quic_varint_len(NGX_QUIC_FT_RESET_STREAM); - len += ngx_quic_varint_len(rs->id); - len += ngx_quic_varint_len(rs->error_code); - len += ngx_quic_varint_len(rs->final_size); - return len; - } - - start = p; - - ngx_quic_build_int(&p, NGX_QUIC_FT_RESET_STREAM); - ngx_quic_build_int(&p, rs->id); - ngx_quic_build_int(&p, rs->error_code); - ngx_quic_build_int(&p, rs->final_size); - - return p - start; -} - - -static size_t -ngx_quic_create_stop_sending(u_char *p, ngx_quic_stop_sending_frame_t *ss) -{ - size_t len; - u_char *start; - - if (p == NULL) { - len = ngx_quic_varint_len(NGX_QUIC_FT_STOP_SENDING); - len += ngx_quic_varint_len(ss->id); - len += ngx_quic_varint_len(ss->error_code); - return len; - } - - start = p; - - ngx_quic_build_int(&p, NGX_QUIC_FT_STOP_SENDING); - ngx_quic_build_int(&p, ss->id); - ngx_quic_build_int(&p, ss->error_code); - - return p - start; -} - - -static size_t -ngx_quic_create_crypto(u_char *p, ngx_quic_crypto_frame_t *crypto, - ngx_chain_t *data) -{ - size_t len; - u_char *start; - ngx_buf_t *b; - - if (p == NULL) { - len = ngx_quic_varint_len(NGX_QUIC_FT_CRYPTO); - len += ngx_quic_varint_len(crypto->offset); - len += ngx_quic_varint_len(crypto->length); - len += crypto->length; - - return len; - } - - start = p; - - ngx_quic_build_int(&p, NGX_QUIC_FT_CRYPTO); - ngx_quic_build_int(&p, crypto->offset); - ngx_quic_build_int(&p, crypto->length); - - while (data) { - b = data->buf; - p = ngx_cpymem(p, b->pos, b->last - b->pos); - data = data->next; - } - - return p - start; -} - - -static size_t -ngx_quic_create_hs_done(u_char *p) -{ - u_char *start; - - if (p == NULL) { - return ngx_quic_varint_len(NGX_QUIC_FT_HANDSHAKE_DONE); - } - - start = p; - - ngx_quic_build_int(&p, NGX_QUIC_FT_HANDSHAKE_DONE); - - return p - start; -} - - -static size_t -ngx_quic_create_new_token(u_char *p, ngx_quic_new_token_frame_t *token, - ngx_chain_t *data) -{ - size_t len; - u_char *start; - ngx_buf_t *b; - - if (p == NULL) { - len = ngx_quic_varint_len(NGX_QUIC_FT_NEW_TOKEN); - len += ngx_quic_varint_len(token->length); - len += token->length; - - return len; - } - - start = p; - - ngx_quic_build_int(&p, NGX_QUIC_FT_NEW_TOKEN); - ngx_quic_build_int(&p, token->length); - - while (data) { - b = data->buf; - p = ngx_cpymem(p, b->pos, b->last - b->pos); - data = data->next; - } - - return p - start; -} - - -static size_t -ngx_quic_create_stream(u_char *p, ngx_quic_stream_frame_t *sf, - ngx_chain_t *data) -{ - size_t len; - u_char *start, type; - ngx_buf_t *b; - - type = NGX_QUIC_FT_STREAM; - - if (sf->off) { - type |= NGX_QUIC_STREAM_FRAME_OFF; - } - - if (sf->len) { - type |= NGX_QUIC_STREAM_FRAME_LEN; - } - - if (sf->fin) { - type |= NGX_QUIC_STREAM_FRAME_FIN; - } - - if (p == NULL) { - len = ngx_quic_varint_len(type); - len += ngx_quic_varint_len(sf->stream_id); - - if (sf->off) { - len += ngx_quic_varint_len(sf->offset); - } - - if (sf->len) { - len += ngx_quic_varint_len(sf->length); - } - - len += sf->length; - - return len; - } - - start = p; - - ngx_quic_build_int(&p, type); - ngx_quic_build_int(&p, sf->stream_id); - - if (sf->off) { - ngx_quic_build_int(&p, sf->offset); - } - - if (sf->len) { - ngx_quic_build_int(&p, sf->length); - } - - while (data) { - b = data->buf; - p = ngx_cpymem(p, b->pos, b->last - b->pos); - data = data->next; - } - - return p - start; -} - - -static size_t -ngx_quic_create_max_streams(u_char *p, ngx_quic_max_streams_frame_t *ms) -{ - size_t len; - u_char *start; - ngx_uint_t type; - - type = ms->bidi ? NGX_QUIC_FT_MAX_STREAMS : NGX_QUIC_FT_MAX_STREAMS2; - - if (p == NULL) { - len = ngx_quic_varint_len(type); - len += ngx_quic_varint_len(ms->limit); - return len; - } - - start = p; - - ngx_quic_build_int(&p, type); - ngx_quic_build_int(&p, ms->limit); - - return p - start; -} - - -static ngx_int_t -ngx_quic_parse_transport_param(u_char *p, u_char *end, uint16_t id, - ngx_quic_tp_t *dst) -{ - uint64_t varint; - ngx_str_t str; - - varint = 0; - ngx_str_null(&str); - - switch (id) { - - case NGX_QUIC_TP_DISABLE_ACTIVE_MIGRATION: - /* zero-length option */ - if (end - p != 0) { - return NGX_ERROR; - } - dst->disable_active_migration = 1; - return NGX_OK; - - case NGX_QUIC_TP_MAX_IDLE_TIMEOUT: - case NGX_QUIC_TP_MAX_UDP_PAYLOAD_SIZE: - case NGX_QUIC_TP_INITIAL_MAX_DATA: - case NGX_QUIC_TP_INITIAL_MAX_STREAM_DATA_BIDI_LOCAL: - case NGX_QUIC_TP_INITIAL_MAX_STREAM_DATA_BIDI_REMOTE: - case NGX_QUIC_TP_INITIAL_MAX_STREAM_DATA_UNI: - case NGX_QUIC_TP_INITIAL_MAX_STREAMS_BIDI: - case NGX_QUIC_TP_INITIAL_MAX_STREAMS_UNI: - case NGX_QUIC_TP_ACK_DELAY_EXPONENT: - case NGX_QUIC_TP_MAX_ACK_DELAY: - case NGX_QUIC_TP_ACTIVE_CONNECTION_ID_LIMIT: - - p = ngx_quic_parse_int(p, end, &varint); - if (p == NULL) { - return NGX_ERROR; - } - break; - - case NGX_QUIC_TP_INITIAL_SCID: - - str.len = end - p; - str.data = p; - break; - - default: - return NGX_DECLINED; - } - - switch (id) { - - case NGX_QUIC_TP_MAX_IDLE_TIMEOUT: - dst->max_idle_timeout = varint; - break; - - case NGX_QUIC_TP_MAX_UDP_PAYLOAD_SIZE: - dst->max_udp_payload_size = varint; - break; - - case NGX_QUIC_TP_INITIAL_MAX_DATA: - dst->initial_max_data = varint; - break; - - case NGX_QUIC_TP_INITIAL_MAX_STREAM_DATA_BIDI_LOCAL: - dst->initial_max_stream_data_bidi_local = varint; - break; - - case NGX_QUIC_TP_INITIAL_MAX_STREAM_DATA_BIDI_REMOTE: - dst->initial_max_stream_data_bidi_remote = varint; - break; - - case NGX_QUIC_TP_INITIAL_MAX_STREAM_DATA_UNI: - dst->initial_max_stream_data_uni = varint; - break; - - case NGX_QUIC_TP_INITIAL_MAX_STREAMS_BIDI: - dst->initial_max_streams_bidi = varint; - break; - - case NGX_QUIC_TP_INITIAL_MAX_STREAMS_UNI: - dst->initial_max_streams_uni = varint; - break; - - case NGX_QUIC_TP_ACK_DELAY_EXPONENT: - dst->ack_delay_exponent = varint; - break; - - case NGX_QUIC_TP_MAX_ACK_DELAY: - dst->max_ack_delay = varint; - break; - - case NGX_QUIC_TP_ACTIVE_CONNECTION_ID_LIMIT: - dst->active_connection_id_limit = varint; - break; - - case NGX_QUIC_TP_INITIAL_SCID: - dst->initial_scid = str; - break; - - default: - return NGX_ERROR; - } - - return NGX_OK; -} - - -ngx_int_t -ngx_quic_parse_transport_params(u_char *p, u_char *end, ngx_quic_tp_t *tp, - ngx_log_t *log) -{ - uint64_t id, len; - ngx_int_t rc; - - while (p < end) { - p = ngx_quic_parse_int(p, end, &id); - if (p == NULL) { - ngx_log_error(NGX_LOG_INFO, log, 0, - "quic failed to parse transport param id"); - return NGX_ERROR; - } - - switch (id) { - case NGX_QUIC_TP_ORIGINAL_DCID: - case NGX_QUIC_TP_PREFERRED_ADDRESS: - case NGX_QUIC_TP_RETRY_SCID: - case NGX_QUIC_TP_SR_TOKEN: - ngx_log_error(NGX_LOG_INFO, log, 0, - "quic client sent forbidden transport param" - " id:0x%xL", id); - return NGX_ERROR; - } - - p = ngx_quic_parse_int(p, end, &len); - if (p == NULL) { - ngx_log_error(NGX_LOG_INFO, log, 0, - "quic failed to parse" - " transport param id:0x%xL length", id); - return NGX_ERROR; - } - - if ((size_t) (end - p) < len) { - ngx_log_error(NGX_LOG_INFO, log, 0, - "quic failed to parse" - " transport param id:0x%xL, data length %uL too long", - id, len); - return NGX_ERROR; - } - - rc = ngx_quic_parse_transport_param(p, p + len, id, tp); - - if (rc == NGX_ERROR) { - ngx_log_error(NGX_LOG_INFO, log, 0, - "quic failed to parse" - " transport param id:0x%xL data", id); - return NGX_ERROR; - } - - if (rc == NGX_DECLINED) { - ngx_log_debug2(NGX_LOG_DEBUG_EVENT, log, 0, - "quic %s transport param id:0x%xL, skipped", - (id % 31 == 27) ? "reserved" : "unknown", id); - } - - p += len; - } - - if (p != end) { - ngx_log_error(NGX_LOG_INFO, log, 0, - "quic trailing garbage in" - " transport parameters: bytes:%ui", - end - p); - return NGX_ERROR; - } - - ngx_log_debug0(NGX_LOG_DEBUG_EVENT, log, 0, - "quic transport parameters parsed ok"); - - ngx_log_debug1(NGX_LOG_DEBUG_EVENT, log, 0, - "quic tp disable active migration: %ui", - tp->disable_active_migration); - - ngx_log_debug1(NGX_LOG_DEBUG_EVENT, log, 0, "quic tp idle_timeout:%ui", - tp->max_idle_timeout); - - ngx_log_debug1(NGX_LOG_DEBUG_EVENT, log, 0, - "quic tp max_udp_payload_size:%ui", - tp->max_udp_payload_size); - - ngx_log_debug1(NGX_LOG_DEBUG_EVENT, log, 0, "quic tp max_data:%ui", - tp->initial_max_data); - - ngx_log_debug1(NGX_LOG_DEBUG_EVENT, log, 0, - "quic tp max_stream_data_bidi_local:%ui", - tp->initial_max_stream_data_bidi_local); - - ngx_log_debug1(NGX_LOG_DEBUG_EVENT, log, 0, - "quic tp max_stream_data_bidi_remote:%ui", - tp->initial_max_stream_data_bidi_remote); - - ngx_log_debug1(NGX_LOG_DEBUG_EVENT, log, 0, - "quic tp max_stream_data_uni:%ui", - tp->initial_max_stream_data_uni); - - ngx_log_debug1(NGX_LOG_DEBUG_EVENT, log, 0, - "quic tp initial_max_streams_bidi:%ui", - tp->initial_max_streams_bidi); - - ngx_log_debug1(NGX_LOG_DEBUG_EVENT, log, 0, - "quic tp initial_max_streams_uni:%ui", - tp->initial_max_streams_uni); - - ngx_log_debug1(NGX_LOG_DEBUG_EVENT, log, 0, - "quic tp ack_delay_exponent:%ui", - tp->ack_delay_exponent); - - ngx_log_debug1(NGX_LOG_DEBUG_EVENT, log, 0, "quic tp max_ack_delay:%ui", - tp->max_ack_delay); - - ngx_log_debug1(NGX_LOG_DEBUG_EVENT, log, 0, - "quic tp active_connection_id_limit:%ui", - tp->active_connection_id_limit); - - ngx_log_debug2(NGX_LOG_DEBUG_EVENT, log, 0, - "quic tp initial source_connection_id len:%uz %xV", - tp->initial_scid.len, &tp->initial_scid); - - return NGX_OK; -} - - -static size_t -ngx_quic_create_max_stream_data(u_char *p, ngx_quic_max_stream_data_frame_t *ms) -{ - size_t len; - u_char *start; - - if (p == NULL) { - len = ngx_quic_varint_len(NGX_QUIC_FT_MAX_STREAM_DATA); - len += ngx_quic_varint_len(ms->id); - len += ngx_quic_varint_len(ms->limit); - return len; - } - - start = p; - - ngx_quic_build_int(&p, NGX_QUIC_FT_MAX_STREAM_DATA); - ngx_quic_build_int(&p, ms->id); - ngx_quic_build_int(&p, ms->limit); - - return p - start; -} - - -static size_t -ngx_quic_create_max_data(u_char *p, ngx_quic_max_data_frame_t *md) -{ - size_t len; - u_char *start; - - if (p == NULL) { - len = ngx_quic_varint_len(NGX_QUIC_FT_MAX_DATA); - len += ngx_quic_varint_len(md->max_data); - return len; - } - - start = p; - - ngx_quic_build_int(&p, NGX_QUIC_FT_MAX_DATA); - ngx_quic_build_int(&p, md->max_data); - - return p - start; -} - - -static size_t -ngx_quic_create_path_challenge(u_char *p, ngx_quic_path_challenge_frame_t *pc) -{ - size_t len; - u_char *start; - - if (p == NULL) { - len = ngx_quic_varint_len(NGX_QUIC_FT_PATH_CHALLENGE); - len += sizeof(pc->data); - return len; - } - - start = p; - - ngx_quic_build_int(&p, NGX_QUIC_FT_PATH_CHALLENGE); - p = ngx_cpymem(p, &pc->data, sizeof(pc->data)); - - return p - start; -} - - -static size_t -ngx_quic_create_path_response(u_char *p, ngx_quic_path_challenge_frame_t *pc) -{ - size_t len; - u_char *start; - - if (p == NULL) { - len = ngx_quic_varint_len(NGX_QUIC_FT_PATH_RESPONSE); - len += sizeof(pc->data); - return len; - } - - start = p; - - ngx_quic_build_int(&p, NGX_QUIC_FT_PATH_RESPONSE); - p = ngx_cpymem(p, &pc->data, sizeof(pc->data)); - - return p - start; -} - - -static size_t -ngx_quic_create_new_connection_id(u_char *p, ngx_quic_new_conn_id_frame_t *ncid) -{ - size_t len; - u_char *start; - - if (p == NULL) { - len = ngx_quic_varint_len(NGX_QUIC_FT_NEW_CONNECTION_ID); - len += ngx_quic_varint_len(ncid->seqnum); - len += ngx_quic_varint_len(ncid->retire); - len++; - len += ncid->len; - len += NGX_QUIC_SR_TOKEN_LEN; - return len; - } - - start = p; - - ngx_quic_build_int(&p, NGX_QUIC_FT_NEW_CONNECTION_ID); - ngx_quic_build_int(&p, ncid->seqnum); - ngx_quic_build_int(&p, ncid->retire); - *p++ = ncid->len; - p = ngx_cpymem(p, ncid->cid, ncid->len); - p = ngx_cpymem(p, ncid->srt, NGX_QUIC_SR_TOKEN_LEN); - - return p - start; -} - - -static size_t -ngx_quic_create_retire_connection_id(u_char *p, - ngx_quic_retire_cid_frame_t *rcid) -{ - size_t len; - u_char *start; - - if (p == NULL) { - len = ngx_quic_varint_len(NGX_QUIC_FT_RETIRE_CONNECTION_ID); - len += ngx_quic_varint_len(rcid->sequence_number); - return len; - } - - start = p; - - ngx_quic_build_int(&p, NGX_QUIC_FT_RETIRE_CONNECTION_ID); - ngx_quic_build_int(&p, rcid->sequence_number); - - return p - start; -} - - -ngx_int_t -ngx_quic_init_transport_params(ngx_quic_tp_t *tp, ngx_quic_conf_t *qcf) -{ - ngx_uint_t nstreams; - - ngx_memzero(tp, sizeof(ngx_quic_tp_t)); - - /* - * set by ngx_memzero(): - * - * tp->disable_active_migration = 0; - * tp->original_dcid = { 0, NULL }; - * tp->initial_scid = { 0, NULL }; - * tp->retry_scid = { 0, NULL }; - * tp->sr_token = { 0 } - * tp->sr_enabled = 0 - * tp->preferred_address = NULL - */ - - tp->max_idle_timeout = qcf->idle_timeout; - - tp->max_udp_payload_size = NGX_QUIC_MAX_UDP_PAYLOAD_SIZE; - - nstreams = qcf->max_concurrent_streams_bidi - + qcf->max_concurrent_streams_uni; - - tp->initial_max_data = nstreams * qcf->stream_buffer_size; - tp->initial_max_stream_data_bidi_local = qcf->stream_buffer_size; - tp->initial_max_stream_data_bidi_remote = qcf->stream_buffer_size; - tp->initial_max_stream_data_uni = qcf->stream_buffer_size; - - tp->initial_max_streams_bidi = qcf->max_concurrent_streams_bidi; - tp->initial_max_streams_uni = qcf->max_concurrent_streams_uni; - - tp->max_ack_delay = NGX_QUIC_DEFAULT_MAX_ACK_DELAY; - tp->ack_delay_exponent = NGX_QUIC_DEFAULT_ACK_DELAY_EXPONENT; - - tp->active_connection_id_limit = qcf->active_connection_id_limit; - tp->disable_active_migration = qcf->disable_active_migration; - - return NGX_OK; -} - - -ssize_t -ngx_quic_create_transport_params(u_char *pos, u_char *end, ngx_quic_tp_t *tp, - size_t *clen) -{ - u_char *p; - size_t len; - -#define ngx_quic_tp_len(id, value) \ - ngx_quic_varint_len(id) \ - + ngx_quic_varint_len(value) \ - + ngx_quic_varint_len(ngx_quic_varint_len(value)) - -#define ngx_quic_tp_vint(id, value) \ - do { \ - ngx_quic_build_int(&p, id); \ - ngx_quic_build_int(&p, ngx_quic_varint_len(value)); \ - ngx_quic_build_int(&p, value); \ - } while (0) - -#define ngx_quic_tp_strlen(id, value) \ - ngx_quic_varint_len(id) \ - + ngx_quic_varint_len(value.len) \ - + value.len - -#define ngx_quic_tp_str(id, value) \ - do { \ - ngx_quic_build_int(&p, id); \ - ngx_quic_build_int(&p, value.len); \ - p = ngx_cpymem(p, value.data, value.len); \ - } while (0) - - len = ngx_quic_tp_len(NGX_QUIC_TP_INITIAL_MAX_DATA, tp->initial_max_data); - - len += ngx_quic_tp_len(NGX_QUIC_TP_INITIAL_MAX_STREAMS_UNI, - tp->initial_max_streams_uni); - - len += ngx_quic_tp_len(NGX_QUIC_TP_INITIAL_MAX_STREAMS_BIDI, - tp->initial_max_streams_bidi); - - len += ngx_quic_tp_len(NGX_QUIC_TP_INITIAL_MAX_STREAM_DATA_BIDI_LOCAL, - tp->initial_max_stream_data_bidi_local); - - len += ngx_quic_tp_len(NGX_QUIC_TP_INITIAL_MAX_STREAM_DATA_BIDI_REMOTE, - tp->initial_max_stream_data_bidi_remote); - - len += ngx_quic_tp_len(NGX_QUIC_TP_INITIAL_MAX_STREAM_DATA_UNI, - tp->initial_max_stream_data_uni); - - len += ngx_quic_tp_len(NGX_QUIC_TP_MAX_IDLE_TIMEOUT, - tp->max_idle_timeout); - - len += ngx_quic_tp_len(NGX_QUIC_TP_MAX_UDP_PAYLOAD_SIZE, - tp->max_udp_payload_size); - - if (tp->disable_active_migration) { - len += ngx_quic_varint_len(NGX_QUIC_TP_DISABLE_ACTIVE_MIGRATION); - len += ngx_quic_varint_len(0); - } - - len += ngx_quic_tp_len(NGX_QUIC_TP_ACTIVE_CONNECTION_ID_LIMIT, - tp->active_connection_id_limit); - - /* transport parameters listed above will be saved in 0-RTT context */ - if (clen) { - *clen = len; - } - - len += ngx_quic_tp_len(NGX_QUIC_TP_MAX_ACK_DELAY, - tp->max_ack_delay); - - len += ngx_quic_tp_len(NGX_QUIC_TP_ACK_DELAY_EXPONENT, - tp->ack_delay_exponent); - - len += ngx_quic_tp_strlen(NGX_QUIC_TP_ORIGINAL_DCID, tp->original_dcid); - len += ngx_quic_tp_strlen(NGX_QUIC_TP_INITIAL_SCID, tp->initial_scid); - - if (tp->retry_scid.len) { - len += ngx_quic_tp_strlen(NGX_QUIC_TP_RETRY_SCID, tp->retry_scid); - } - - len += ngx_quic_varint_len(NGX_QUIC_TP_SR_TOKEN); - len += ngx_quic_varint_len(NGX_QUIC_SR_TOKEN_LEN); - len += NGX_QUIC_SR_TOKEN_LEN; - - if (pos == NULL) { - return len; - } - - p = pos; - - ngx_quic_tp_vint(NGX_QUIC_TP_INITIAL_MAX_DATA, - tp->initial_max_data); - - ngx_quic_tp_vint(NGX_QUIC_TP_INITIAL_MAX_STREAMS_UNI, - tp->initial_max_streams_uni); - - ngx_quic_tp_vint(NGX_QUIC_TP_INITIAL_MAX_STREAMS_BIDI, - tp->initial_max_streams_bidi); - - ngx_quic_tp_vint(NGX_QUIC_TP_INITIAL_MAX_STREAM_DATA_BIDI_LOCAL, - tp->initial_max_stream_data_bidi_local); - - ngx_quic_tp_vint(NGX_QUIC_TP_INITIAL_MAX_STREAM_DATA_BIDI_REMOTE, - tp->initial_max_stream_data_bidi_remote); - - ngx_quic_tp_vint(NGX_QUIC_TP_INITIAL_MAX_STREAM_DATA_UNI, - tp->initial_max_stream_data_uni); - - ngx_quic_tp_vint(NGX_QUIC_TP_MAX_IDLE_TIMEOUT, - tp->max_idle_timeout); - - ngx_quic_tp_vint(NGX_QUIC_TP_MAX_UDP_PAYLOAD_SIZE, - tp->max_udp_payload_size); - - if (tp->disable_active_migration) { - ngx_quic_build_int(&p, NGX_QUIC_TP_DISABLE_ACTIVE_MIGRATION); - ngx_quic_build_int(&p, 0); - } - - ngx_quic_tp_vint(NGX_QUIC_TP_ACTIVE_CONNECTION_ID_LIMIT, - tp->active_connection_id_limit); - - ngx_quic_tp_vint(NGX_QUIC_TP_MAX_ACK_DELAY, - tp->max_ack_delay); - - ngx_quic_tp_vint(NGX_QUIC_TP_ACK_DELAY_EXPONENT, - tp->ack_delay_exponent); - - ngx_quic_tp_str(NGX_QUIC_TP_ORIGINAL_DCID, tp->original_dcid); - ngx_quic_tp_str(NGX_QUIC_TP_INITIAL_SCID, tp->initial_scid); - - if (tp->retry_scid.len) { - ngx_quic_tp_str(NGX_QUIC_TP_RETRY_SCID, tp->retry_scid); - } - - ngx_quic_build_int(&p, NGX_QUIC_TP_SR_TOKEN); - ngx_quic_build_int(&p, NGX_QUIC_SR_TOKEN_LEN); - p = ngx_cpymem(p, tp->sr_token, NGX_QUIC_SR_TOKEN_LEN); - - return p - pos; -} - - -static size_t -ngx_quic_create_close(u_char *p, ngx_quic_frame_t *f) -{ - size_t len; - u_char *start; - ngx_quic_close_frame_t *cl; - - cl = &f->u.close; - - if (p == NULL) { - len = ngx_quic_varint_len(f->type); - len += ngx_quic_varint_len(cl->error_code); - - if (f->type != NGX_QUIC_FT_CONNECTION_CLOSE_APP) { - len += ngx_quic_varint_len(cl->frame_type); - } - - len += ngx_quic_varint_len(cl->reason.len); - len += cl->reason.len; - - return len; - } - - start = p; - - ngx_quic_build_int(&p, f->type); - ngx_quic_build_int(&p, cl->error_code); - - if (f->type != NGX_QUIC_FT_CONNECTION_CLOSE_APP) { - ngx_quic_build_int(&p, cl->frame_type); - } - - ngx_quic_build_int(&p, cl->reason.len); - p = ngx_cpymem(p, cl->reason.data, cl->reason.len); - - return p - start; -} - - -void -ngx_quic_dcid_encode_key(u_char *dcid, uint64_t key) -{ - (void) ngx_quic_write_uint64(dcid, key); -} diff --git a/src/deps/src/nginx-1.30.3/src/event/quic/ngx_event_quic_transport.h b/src/deps/src/nginx-1.30.3/src/event/quic/ngx_event_quic_transport.h deleted file mode 100644 index 656cb09fb5..0000000000 --- a/src/deps/src/nginx-1.30.3/src/event/quic/ngx_event_quic_transport.h +++ /dev/null @@ -1,398 +0,0 @@ - -/* - * Copyright (C) Nginx, Inc. - */ - - -#ifndef _NGX_EVENT_QUIC_TRANSPORT_H_INCLUDED_ -#define _NGX_EVENT_QUIC_TRANSPORT_H_INCLUDED_ - - -#include -#include - - -/* - * RFC 9000, 17.2. Long Header Packets - * 17.3. Short Header Packets - * - * QUIC flags in first byte - */ -#define NGX_QUIC_PKT_LONG 0x80 /* header form */ -#define NGX_QUIC_PKT_FIXED_BIT 0x40 -#define NGX_QUIC_PKT_TYPE 0x30 /* in long packet */ -#define NGX_QUIC_PKT_KPHASE 0x04 /* in short packet */ - -#define ngx_quic_long_pkt(flags) ((flags) & NGX_QUIC_PKT_LONG) -#define ngx_quic_short_pkt(flags) (((flags) & NGX_QUIC_PKT_LONG) == 0) - -/* Long packet types */ -#define NGX_QUIC_PKT_INITIAL 0x00 -#define NGX_QUIC_PKT_ZRTT 0x10 -#define NGX_QUIC_PKT_HANDSHAKE 0x20 -#define NGX_QUIC_PKT_RETRY 0x30 - -#define ngx_quic_pkt_in(flags) \ - (((flags) & NGX_QUIC_PKT_TYPE) == NGX_QUIC_PKT_INITIAL) -#define ngx_quic_pkt_zrtt(flags) \ - (((flags) & NGX_QUIC_PKT_TYPE) == NGX_QUIC_PKT_ZRTT) -#define ngx_quic_pkt_hs(flags) \ - (((flags) & NGX_QUIC_PKT_TYPE) == NGX_QUIC_PKT_HANDSHAKE) -#define ngx_quic_pkt_retry(flags) \ - (((flags) & NGX_QUIC_PKT_TYPE) == NGX_QUIC_PKT_RETRY) - -#define ngx_quic_pkt_rb_mask(flags) \ - (ngx_quic_long_pkt(flags) ? 0x0C : 0x18) -#define ngx_quic_pkt_hp_mask(flags) \ - (ngx_quic_long_pkt(flags) ? 0x0F : 0x1F) - -#define ngx_quic_level_name(lvl) \ - (lvl == NGX_QUIC_ENCRYPTION_APPLICATION) ? "app" \ - : (lvl == NGX_QUIC_ENCRYPTION_INITIAL) ? "init" \ - : (lvl == NGX_QUIC_ENCRYPTION_HANDSHAKE) ? "hs" : "early" - -#define NGX_QUIC_MAX_CID_LEN 20 -#define NGX_QUIC_SERVER_CID_LEN NGX_QUIC_MAX_CID_LEN - -/* 12.4. Frames and Frame Types */ -#define NGX_QUIC_FT_PADDING 0x00 -#define NGX_QUIC_FT_PING 0x01 -#define NGX_QUIC_FT_ACK 0x02 -#define NGX_QUIC_FT_ACK_ECN 0x03 -#define NGX_QUIC_FT_RESET_STREAM 0x04 -#define NGX_QUIC_FT_STOP_SENDING 0x05 -#define NGX_QUIC_FT_CRYPTO 0x06 -#define NGX_QUIC_FT_NEW_TOKEN 0x07 -#define NGX_QUIC_FT_STREAM 0x08 -#define NGX_QUIC_FT_STREAM1 0x09 -#define NGX_QUIC_FT_STREAM2 0x0A -#define NGX_QUIC_FT_STREAM3 0x0B -#define NGX_QUIC_FT_STREAM4 0x0C -#define NGX_QUIC_FT_STREAM5 0x0D -#define NGX_QUIC_FT_STREAM6 0x0E -#define NGX_QUIC_FT_STREAM7 0x0F -#define NGX_QUIC_FT_MAX_DATA 0x10 -#define NGX_QUIC_FT_MAX_STREAM_DATA 0x11 -#define NGX_QUIC_FT_MAX_STREAMS 0x12 -#define NGX_QUIC_FT_MAX_STREAMS2 0x13 -#define NGX_QUIC_FT_DATA_BLOCKED 0x14 -#define NGX_QUIC_FT_STREAM_DATA_BLOCKED 0x15 -#define NGX_QUIC_FT_STREAMS_BLOCKED 0x16 -#define NGX_QUIC_FT_STREAMS_BLOCKED2 0x17 -#define NGX_QUIC_FT_NEW_CONNECTION_ID 0x18 -#define NGX_QUIC_FT_RETIRE_CONNECTION_ID 0x19 -#define NGX_QUIC_FT_PATH_CHALLENGE 0x1A -#define NGX_QUIC_FT_PATH_RESPONSE 0x1B -#define NGX_QUIC_FT_CONNECTION_CLOSE 0x1C -#define NGX_QUIC_FT_CONNECTION_CLOSE_APP 0x1D -#define NGX_QUIC_FT_HANDSHAKE_DONE 0x1E - -#define NGX_QUIC_FT_LAST NGX_QUIC_FT_HANDSHAKE_DONE - -/* 22.5. QUIC Transport Error Codes Registry */ -#define NGX_QUIC_ERR_NO_ERROR 0x00 -#define NGX_QUIC_ERR_INTERNAL_ERROR 0x01 -#define NGX_QUIC_ERR_CONNECTION_REFUSED 0x02 -#define NGX_QUIC_ERR_FLOW_CONTROL_ERROR 0x03 -#define NGX_QUIC_ERR_STREAM_LIMIT_ERROR 0x04 -#define NGX_QUIC_ERR_STREAM_STATE_ERROR 0x05 -#define NGX_QUIC_ERR_FINAL_SIZE_ERROR 0x06 -#define NGX_QUIC_ERR_FRAME_ENCODING_ERROR 0x07 -#define NGX_QUIC_ERR_TRANSPORT_PARAMETER_ERROR 0x08 -#define NGX_QUIC_ERR_CONNECTION_ID_LIMIT_ERROR 0x09 -#define NGX_QUIC_ERR_PROTOCOL_VIOLATION 0x0A -#define NGX_QUIC_ERR_INVALID_TOKEN 0x0B -#define NGX_QUIC_ERR_APPLICATION_ERROR 0x0C -#define NGX_QUIC_ERR_CRYPTO_BUFFER_EXCEEDED 0x0D -#define NGX_QUIC_ERR_KEY_UPDATE_ERROR 0x0E -#define NGX_QUIC_ERR_AEAD_LIMIT_REACHED 0x0F -#define NGX_QUIC_ERR_NO_VIABLE_PATH 0x10 - -#define NGX_QUIC_ERR_CRYPTO_ERROR 0x100 - -#define NGX_QUIC_ERR_CRYPTO(e) (NGX_QUIC_ERR_CRYPTO_ERROR + (e)) - - -/* 22.3. QUIC Transport Parameters Registry */ -#define NGX_QUIC_TP_ORIGINAL_DCID 0x00 -#define NGX_QUIC_TP_MAX_IDLE_TIMEOUT 0x01 -#define NGX_QUIC_TP_SR_TOKEN 0x02 -#define NGX_QUIC_TP_MAX_UDP_PAYLOAD_SIZE 0x03 -#define NGX_QUIC_TP_INITIAL_MAX_DATA 0x04 -#define NGX_QUIC_TP_INITIAL_MAX_STREAM_DATA_BIDI_LOCAL 0x05 -#define NGX_QUIC_TP_INITIAL_MAX_STREAM_DATA_BIDI_REMOTE 0x06 -#define NGX_QUIC_TP_INITIAL_MAX_STREAM_DATA_UNI 0x07 -#define NGX_QUIC_TP_INITIAL_MAX_STREAMS_BIDI 0x08 -#define NGX_QUIC_TP_INITIAL_MAX_STREAMS_UNI 0x09 -#define NGX_QUIC_TP_ACK_DELAY_EXPONENT 0x0A -#define NGX_QUIC_TP_MAX_ACK_DELAY 0x0B -#define NGX_QUIC_TP_DISABLE_ACTIVE_MIGRATION 0x0C -#define NGX_QUIC_TP_PREFERRED_ADDRESS 0x0D -#define NGX_QUIC_TP_ACTIVE_CONNECTION_ID_LIMIT 0x0E -#define NGX_QUIC_TP_INITIAL_SCID 0x0F -#define NGX_QUIC_TP_RETRY_SCID 0x10 - -#define NGX_QUIC_CID_LEN_MIN 8 -#define NGX_QUIC_CID_LEN_MAX 20 - -#define NGX_QUIC_MAX_RANGES 10 - - -typedef struct { - uint64_t gap; - uint64_t range; -} ngx_quic_ack_range_t; - - -typedef struct { - uint64_t largest; - uint64_t delay; - uint64_t range_count; - uint64_t first_range; - uint64_t ect0; - uint64_t ect1; - uint64_t ce; - uint64_t ranges_length; -} ngx_quic_ack_frame_t; - - -typedef struct { - uint64_t seqnum; - uint64_t retire; - uint8_t len; - u_char cid[NGX_QUIC_CID_LEN_MAX]; - u_char srt[NGX_QUIC_SR_TOKEN_LEN]; -} ngx_quic_new_conn_id_frame_t; - - -typedef struct { - uint64_t length; -} ngx_quic_new_token_frame_t; - -/* - * common layout for CRYPTO and STREAM frames; - * conceptually, CRYPTO frame is also a stream - * frame lacking some properties - */ -typedef struct { - uint64_t offset; - uint64_t length; -} ngx_quic_ordered_frame_t; - -typedef ngx_quic_ordered_frame_t ngx_quic_crypto_frame_t; - - -typedef struct { - /* initial fields same as in ngx_quic_ordered_frame_t */ - uint64_t offset; - uint64_t length; - - uint64_t stream_id; - unsigned off:1; - unsigned len:1; - unsigned fin:1; -} ngx_quic_stream_frame_t; - - -typedef struct { - uint64_t max_data; -} ngx_quic_max_data_frame_t; - - -typedef struct { - uint64_t error_code; - uint64_t frame_type; - ngx_str_t reason; -} ngx_quic_close_frame_t; - - -typedef struct { - uint64_t id; - uint64_t error_code; - uint64_t final_size; -} ngx_quic_reset_stream_frame_t; - - -typedef struct { - uint64_t id; - uint64_t error_code; -} ngx_quic_stop_sending_frame_t; - - -typedef struct { - uint64_t limit; - ngx_uint_t bidi; /* unsigned: bidi:1 */ -} ngx_quic_streams_blocked_frame_t; - - -typedef struct { - uint64_t limit; - ngx_uint_t bidi; /* unsigned: bidi:1 */ -} ngx_quic_max_streams_frame_t; - - -typedef struct { - uint64_t id; - uint64_t limit; -} ngx_quic_max_stream_data_frame_t; - - -typedef struct { - uint64_t limit; -} ngx_quic_data_blocked_frame_t; - - -typedef struct { - uint64_t id; - uint64_t limit; -} ngx_quic_stream_data_blocked_frame_t; - - -typedef struct { - uint64_t sequence_number; -} ngx_quic_retire_cid_frame_t; - - -typedef struct { - u_char data[8]; -} ngx_quic_path_challenge_frame_t; - - -typedef struct ngx_quic_frame_s ngx_quic_frame_t; - -struct ngx_quic_frame_s { - ngx_uint_t type; - ngx_uint_t level; - ngx_queue_t queue; - uint64_t pnum; - size_t plen; - ngx_msec_t send_time; - ssize_t len; - unsigned need_ack:1; - unsigned pkt_need_ack:1; - unsigned ignore_congestion:1; - unsigned ignore_loss:1; - - ngx_chain_t *data; - union { - ngx_quic_ack_frame_t ack; - ngx_quic_crypto_frame_t crypto; - ngx_quic_ordered_frame_t ord; - ngx_quic_new_conn_id_frame_t ncid; - ngx_quic_new_token_frame_t token; - ngx_quic_stream_frame_t stream; - ngx_quic_max_data_frame_t max_data; - ngx_quic_close_frame_t close; - ngx_quic_reset_stream_frame_t reset_stream; - ngx_quic_stop_sending_frame_t stop_sending; - ngx_quic_streams_blocked_frame_t streams_blocked; - ngx_quic_max_streams_frame_t max_streams; - ngx_quic_max_stream_data_frame_t max_stream_data; - ngx_quic_data_blocked_frame_t data_blocked; - ngx_quic_stream_data_blocked_frame_t stream_data_blocked; - ngx_quic_retire_cid_frame_t retire_cid; - ngx_quic_path_challenge_frame_t path_challenge; - ngx_quic_path_challenge_frame_t path_response; - } u; -}; - - -typedef struct { - ngx_log_t *log; - ngx_quic_path_t *path; - - ngx_quic_keys_t *keys; - - ngx_msec_t received; - uint64_t number; - uint8_t num_len; - uint32_t trunc; - uint8_t flags; - uint32_t version; - ngx_str_t token; - ngx_uint_t level; - ngx_uint_t error; - - /* filled in by parser */ - ngx_buf_t *raw; /* udp datagram */ - - u_char *data; /* quic packet */ - size_t len; - - /* cleartext fields */ - ngx_str_t odcid; /* retry packet tag */ - u_char odcid_buf[NGX_QUIC_MAX_CID_LEN]; - ngx_str_t dcid; - ngx_str_t scid; - uint64_t pn; - u_char *plaintext; - ngx_str_t payload; /* decrypted data */ - - unsigned need_ack:1; - unsigned key_phase:1; - unsigned key_update:1; - unsigned parsed:1; - unsigned decrypted:1; - unsigned validated:1; - unsigned retried:1; - unsigned first:1; - unsigned rebound:1; - unsigned path_challenged:1; -} ngx_quic_header_t; - - -typedef struct { - ngx_msec_t max_idle_timeout; - ngx_msec_t max_ack_delay; - - size_t max_udp_payload_size; - size_t initial_max_data; - size_t initial_max_stream_data_bidi_local; - size_t initial_max_stream_data_bidi_remote; - size_t initial_max_stream_data_uni; - ngx_uint_t initial_max_streams_bidi; - ngx_uint_t initial_max_streams_uni; - ngx_uint_t ack_delay_exponent; - ngx_uint_t active_connection_id_limit; - ngx_flag_t disable_active_migration; - - ngx_str_t original_dcid; - ngx_str_t initial_scid; - ngx_str_t retry_scid; - u_char sr_token[NGX_QUIC_SR_TOKEN_LEN]; - - /* TODO */ - void *preferred_address; -} ngx_quic_tp_t; - - -ngx_int_t ngx_quic_parse_packet(ngx_quic_header_t *pkt); - -size_t ngx_quic_create_version_negotiation(ngx_quic_header_t *pkt, u_char *out); - -size_t ngx_quic_payload_size(ngx_quic_header_t *pkt, size_t pkt_len); - -size_t ngx_quic_create_header(ngx_quic_header_t *pkt, u_char *out, - u_char **pnp); - -size_t ngx_quic_create_retry_itag(ngx_quic_header_t *pkt, u_char *out, - u_char **start); - -ssize_t ngx_quic_parse_frame(ngx_quic_header_t *pkt, u_char *start, u_char *end, - ngx_quic_frame_t *frame); -ssize_t ngx_quic_create_frame(u_char *p, ngx_quic_frame_t *f); - -ssize_t ngx_quic_parse_ack_range(ngx_log_t *log, u_char *start, - u_char *end, uint64_t *gap, uint64_t *range); -size_t ngx_quic_create_ack_range(u_char *p, uint64_t gap, uint64_t range); - -ngx_int_t ngx_quic_init_transport_params(ngx_quic_tp_t *tp, - ngx_quic_conf_t *qcf); -ngx_int_t ngx_quic_parse_transport_params(u_char *p, u_char *end, - ngx_quic_tp_t *tp, ngx_log_t *log); -ssize_t ngx_quic_create_transport_params(u_char *p, u_char *end, - ngx_quic_tp_t *tp, size_t *clen); - -void ngx_quic_dcid_encode_key(u_char *dcid, uint64_t key); - -#endif /* _NGX_EVENT_QUIC_TRANSPORT_H_INCLUDED_ */ diff --git a/src/deps/src/nginx-1.30.3/src/event/quic/ngx_event_quic_udp.c b/src/deps/src/nginx-1.30.3/src/event/quic/ngx_event_quic_udp.c deleted file mode 100644 index 15b54bc822..0000000000 --- a/src/deps/src/nginx-1.30.3/src/event/quic/ngx_event_quic_udp.c +++ /dev/null @@ -1,420 +0,0 @@ - -/* - * Copyright (C) Roman Arutyunyan - * Copyright (C) Nginx, Inc. - */ - - -#include -#include -#include -#include - - -static void ngx_quic_close_accepted_connection(ngx_connection_t *c); -static ngx_connection_t *ngx_quic_lookup_connection(ngx_listening_t *ls, - ngx_str_t *key, struct sockaddr *local_sockaddr, socklen_t local_socklen); - - -void -ngx_quic_recvmsg(ngx_event_t *ev) -{ - ssize_t n; - ngx_str_t key; - ngx_buf_t buf; - ngx_log_t *log; - ngx_err_t err; - socklen_t socklen, local_socklen; - ngx_event_t *rev, *wev; - struct iovec iov[1]; - struct msghdr msg; - ngx_sockaddr_t sa, lsa; - struct sockaddr *sockaddr, *local_sockaddr; - ngx_listening_t *ls; - ngx_event_conf_t *ecf; - ngx_connection_t *c, *lc; - ngx_quic_socket_t *qsock; - static u_char buffer[NGX_QUIC_MAX_UDP_PAYLOAD_SIZE]; - -#if (NGX_HAVE_ADDRINFO_CMSG) - u_char msg_control[CMSG_SPACE(sizeof(ngx_addrinfo_t))]; -#endif - - if (ev->timedout) { - if (ngx_enable_accept_events((ngx_cycle_t *) ngx_cycle) != NGX_OK) { - return; - } - - ev->timedout = 0; - } - - ecf = ngx_event_get_conf(ngx_cycle->conf_ctx, ngx_event_core_module); - - if (!(ngx_event_flags & NGX_USE_KQUEUE_EVENT)) { - ev->available = ecf->multi_accept; - } - - lc = ev->data; - ls = lc->listening; - ev->ready = 0; - - ngx_log_debug2(NGX_LOG_DEBUG_EVENT, ev->log, 0, - "quic recvmsg on %V, ready: %d", - &ls->addr_text, ev->available); - - do { - ngx_memzero(&msg, sizeof(struct msghdr)); - - iov[0].iov_base = (void *) buffer; - iov[0].iov_len = sizeof(buffer); - - msg.msg_name = &sa; - msg.msg_namelen = sizeof(ngx_sockaddr_t); - msg.msg_iov = iov; - msg.msg_iovlen = 1; - -#if (NGX_HAVE_ADDRINFO_CMSG) - if (ls->wildcard) { - msg.msg_control = &msg_control; - msg.msg_controllen = sizeof(msg_control); - - ngx_memzero(&msg_control, sizeof(msg_control)); - } -#endif - - n = recvmsg(lc->fd, &msg, 0); - - if (n == -1) { - err = ngx_socket_errno; - - if (err == NGX_EAGAIN) { - ngx_log_debug0(NGX_LOG_DEBUG_EVENT, ev->log, err, - "quic recvmsg() not ready"); - return; - } - - ngx_log_error(NGX_LOG_ALERT, ev->log, err, "quic recvmsg() failed"); - - return; - } - -#if (NGX_HAVE_ADDRINFO_CMSG) - if (msg.msg_flags & (MSG_TRUNC|MSG_CTRUNC)) { - ngx_log_error(NGX_LOG_ALERT, ev->log, 0, - "quic recvmsg() truncated data"); - continue; - } -#endif - - sockaddr = msg.msg_name; - socklen = msg.msg_namelen; - - if (socklen > (socklen_t) sizeof(ngx_sockaddr_t)) { - socklen = sizeof(ngx_sockaddr_t); - } - -#if (NGX_HAVE_UNIX_DOMAIN) - - if (sockaddr->sa_family == AF_UNIX) { - struct sockaddr_un *saun = (struct sockaddr_un *) sockaddr; - - if (socklen <= (socklen_t) offsetof(struct sockaddr_un, sun_path) - || saun->sun_path[0] == '\0') - { - ngx_log_debug0(NGX_LOG_DEBUG_EVENT, ngx_cycle->log, 0, - "unbound unix socket"); - goto next; - } - } - -#endif - - local_sockaddr = ls->sockaddr; - local_socklen = ls->socklen; - -#if (NGX_HAVE_ADDRINFO_CMSG) - - if (ls->wildcard) { - struct cmsghdr *cmsg; - - ngx_memcpy(&lsa, local_sockaddr, local_socklen); - local_sockaddr = &lsa.sockaddr; - - for (cmsg = CMSG_FIRSTHDR(&msg); - cmsg != NULL; - cmsg = CMSG_NXTHDR(&msg, cmsg)) - { - if (ngx_get_srcaddr_cmsg(cmsg, local_sockaddr) == NGX_OK) { - break; - } - } - } - -#endif - - if (ngx_quic_get_packet_dcid(ev->log, buffer, n, &key) != NGX_OK) { - goto next; - } - - c = ngx_quic_lookup_connection(ls, &key, local_sockaddr, local_socklen); - - if (c) { - -#if (NGX_DEBUG) - if (c->log->log_level & NGX_LOG_DEBUG_EVENT) { - ngx_log_handler_pt handler; - - handler = c->log->handler; - c->log->handler = NULL; - - ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0, - "quic recvmsg: fd:%d n:%z", c->fd, n); - - c->log->handler = handler; - } -#endif - - ngx_memzero(&buf, sizeof(ngx_buf_t)); - - buf.pos = buffer; - buf.last = buffer + n; - buf.start = buf.pos; - buf.end = buffer + sizeof(buffer); - - qsock = ngx_quic_get_socket(c); - - ngx_memcpy(&qsock->sockaddr, sockaddr, socklen); - qsock->socklen = socklen; - - c->udp->buffer = &buf; - - rev = c->read; - rev->ready = 1; - rev->active = 0; - - rev->handler(rev); - - if (c->udp) { - c->udp->buffer = NULL; - } - - rev->ready = 0; - rev->active = 1; - - goto next; - } - -#if (NGX_STAT_STUB) - (void) ngx_atomic_fetch_add(ngx_stat_accepted, 1); -#endif - - ngx_accept_disabled = ngx_cycle->connection_n / 8 - - ngx_cycle->free_connection_n; - - c = ngx_get_connection(lc->fd, ev->log); - if (c == NULL) { - return; - } - - c->shared = 1; - c->type = SOCK_DGRAM; - c->socklen = socklen; - -#if (NGX_STAT_STUB) - (void) ngx_atomic_fetch_add(ngx_stat_active, 1); -#endif - - c->pool = ngx_create_pool(ls->pool_size, ev->log); - if (c->pool == NULL) { - ngx_quic_close_accepted_connection(c); - return; - } - - c->sockaddr = ngx_palloc(c->pool, NGX_SOCKADDRLEN); - if (c->sockaddr == NULL) { - ngx_quic_close_accepted_connection(c); - return; - } - - ngx_memcpy(c->sockaddr, sockaddr, socklen); - - log = ngx_palloc(c->pool, sizeof(ngx_log_t)); - if (log == NULL) { - ngx_quic_close_accepted_connection(c); - return; - } - - *log = ls->log; - - c->log = log; - c->pool->log = log; - c->listening = ls; - - if (local_sockaddr == &lsa.sockaddr) { - local_sockaddr = ngx_palloc(c->pool, local_socklen); - if (local_sockaddr == NULL) { - ngx_quic_close_accepted_connection(c); - return; - } - - ngx_memcpy(local_sockaddr, &lsa, local_socklen); - } - - c->local_sockaddr = local_sockaddr; - c->local_socklen = local_socklen; - - c->buffer = ngx_create_temp_buf(c->pool, n); - if (c->buffer == NULL) { - ngx_quic_close_accepted_connection(c); - return; - } - - c->buffer->last = ngx_cpymem(c->buffer->last, buffer, n); - - rev = c->read; - wev = c->write; - - rev->active = 1; - wev->ready = 1; - - rev->log = log; - wev->log = log; - - /* - * TODO: MT: - ngx_atomic_fetch_add() - * or protection by critical section or light mutex - * - * TODO: MP: - allocated in a shared memory - * - ngx_atomic_fetch_add() - * or protection by critical section or light mutex - */ - - c->number = ngx_atomic_fetch_add(ngx_connection_counter, 1); - - c->start_time = ngx_current_msec; - -#if (NGX_STAT_STUB) - (void) ngx_atomic_fetch_add(ngx_stat_handled, 1); -#endif - - if (ls->addr_ntop) { - c->addr_text.data = ngx_pnalloc(c->pool, ls->addr_text_max_len); - if (c->addr_text.data == NULL) { - ngx_quic_close_accepted_connection(c); - return; - } - - c->addr_text.len = ngx_sock_ntop(c->sockaddr, c->socklen, - c->addr_text.data, - ls->addr_text_max_len, 0); - if (c->addr_text.len == 0) { - ngx_quic_close_accepted_connection(c); - return; - } - } - -#if (NGX_DEBUG) - { - ngx_str_t addr; - u_char text[NGX_SOCKADDR_STRLEN]; - - ngx_debug_accepted_connection(ecf, c); - - if (log->log_level & NGX_LOG_DEBUG_EVENT) { - addr.data = text; - addr.len = ngx_sock_ntop(c->sockaddr, c->socklen, text, - NGX_SOCKADDR_STRLEN, 1); - - ngx_log_debug4(NGX_LOG_DEBUG_EVENT, log, 0, - "*%uA quic recvmsg: %V fd:%d n:%z", - c->number, &addr, c->fd, n); - } - - } -#endif - - log->data = NULL; - log->handler = NULL; - - ls->handler(c); - - next: - - if (ngx_event_flags & NGX_USE_KQUEUE_EVENT) { - ev->available -= n; - } - - } while (ev->available); -} - - -static void -ngx_quic_close_accepted_connection(ngx_connection_t *c) -{ - ngx_free_connection(c); - - c->fd = (ngx_socket_t) -1; - - if (c->pool) { - ngx_destroy_pool(c->pool); - } - -#if (NGX_STAT_STUB) - (void) ngx_atomic_fetch_add(ngx_stat_active, -1); -#endif -} - - -static ngx_connection_t * -ngx_quic_lookup_connection(ngx_listening_t *ls, ngx_str_t *key, - struct sockaddr *local_sockaddr, socklen_t local_socklen) -{ - uint32_t hash; - ngx_int_t rc; - ngx_connection_t *c; - ngx_rbtree_node_t *node, *sentinel; - ngx_quic_socket_t *qsock; - - if (key->len == 0) { - return NULL; - } - - node = ls->rbtree.root; - sentinel = ls->rbtree.sentinel; - hash = ngx_crc32_long(key->data, key->len); - - while (node != sentinel) { - - if (hash < node->key) { - node = node->left; - continue; - } - - if (hash > node->key) { - node = node->right; - continue; - } - - /* hash == node->key */ - - qsock = (ngx_quic_socket_t *) node; - - rc = ngx_memn2cmp(key->data, qsock->sid.id, key->len, qsock->sid.len); - - c = qsock->udp.connection; - - if (rc == 0 && ls->wildcard) { - rc = ngx_cmp_sockaddr(local_sockaddr, local_socklen, - c->local_sockaddr, c->local_socklen, 1); - } - - if (rc == 0) { - c->udp = &qsock->udp; - return c; - } - - node = (rc < 0) ? node->left : node->right; - } - - return NULL; -} diff --git a/src/deps/src/nginx-1.30.3/src/http/modules/ngx_http_access_module.c b/src/deps/src/nginx-1.30.3/src/http/modules/ngx_http_access_module.c deleted file mode 100644 index ea755200d0..0000000000 --- a/src/deps/src/nginx-1.30.3/src/http/modules/ngx_http_access_module.c +++ /dev/null @@ -1,463 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#include -#include -#include - - -typedef struct { - in_addr_t mask; - in_addr_t addr; - ngx_uint_t deny; /* unsigned deny:1; */ -} ngx_http_access_rule_t; - -#if (NGX_HAVE_INET6) - -typedef struct { - struct in6_addr addr; - struct in6_addr mask; - ngx_uint_t deny; /* unsigned deny:1; */ -} ngx_http_access_rule6_t; - -#endif - -#if (NGX_HAVE_UNIX_DOMAIN) - -typedef struct { - ngx_uint_t deny; /* unsigned deny:1; */ -} ngx_http_access_rule_un_t; - -#endif - -typedef struct { - ngx_array_t *rules; /* array of ngx_http_access_rule_t */ -#if (NGX_HAVE_INET6) - ngx_array_t *rules6; /* array of ngx_http_access_rule6_t */ -#endif -#if (NGX_HAVE_UNIX_DOMAIN) - ngx_array_t *rules_un; /* array of ngx_http_access_rule_un_t */ -#endif -} ngx_http_access_loc_conf_t; - - -static ngx_int_t ngx_http_access_handler(ngx_http_request_t *r); -static ngx_int_t ngx_http_access_inet(ngx_http_request_t *r, - ngx_http_access_loc_conf_t *alcf, in_addr_t addr); -#if (NGX_HAVE_INET6) -static ngx_int_t ngx_http_access_inet6(ngx_http_request_t *r, - ngx_http_access_loc_conf_t *alcf, u_char *p); -#endif -#if (NGX_HAVE_UNIX_DOMAIN) -static ngx_int_t ngx_http_access_unix(ngx_http_request_t *r, - ngx_http_access_loc_conf_t *alcf); -#endif -static ngx_int_t ngx_http_access_found(ngx_http_request_t *r, ngx_uint_t deny); -static char *ngx_http_access_rule(ngx_conf_t *cf, ngx_command_t *cmd, - void *conf); -static void *ngx_http_access_create_loc_conf(ngx_conf_t *cf); -static char *ngx_http_access_merge_loc_conf(ngx_conf_t *cf, - void *parent, void *child); -static ngx_int_t ngx_http_access_init(ngx_conf_t *cf); - - -static ngx_command_t ngx_http_access_commands[] = { - - { ngx_string("allow"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LMT_CONF - |NGX_CONF_TAKE1, - ngx_http_access_rule, - NGX_HTTP_LOC_CONF_OFFSET, - 0, - NULL }, - - { ngx_string("deny"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LMT_CONF - |NGX_CONF_TAKE1, - ngx_http_access_rule, - NGX_HTTP_LOC_CONF_OFFSET, - 0, - NULL }, - - ngx_null_command -}; - - - -static ngx_http_module_t ngx_http_access_module_ctx = { - NULL, /* preconfiguration */ - ngx_http_access_init, /* postconfiguration */ - - NULL, /* create main configuration */ - NULL, /* init main configuration */ - - NULL, /* create server configuration */ - NULL, /* merge server configuration */ - - ngx_http_access_create_loc_conf, /* create location configuration */ - ngx_http_access_merge_loc_conf /* merge location configuration */ -}; - - -ngx_module_t ngx_http_access_module = { - NGX_MODULE_V1, - &ngx_http_access_module_ctx, /* module context */ - ngx_http_access_commands, /* module directives */ - NGX_HTTP_MODULE, /* module type */ - NULL, /* init master */ - NULL, /* init module */ - NULL, /* init process */ - NULL, /* init thread */ - NULL, /* exit thread */ - NULL, /* exit process */ - NULL, /* exit master */ - NGX_MODULE_V1_PADDING -}; - - -static ngx_int_t -ngx_http_access_handler(ngx_http_request_t *r) -{ - struct sockaddr_in *sin; - ngx_http_access_loc_conf_t *alcf; -#if (NGX_HAVE_INET6) - u_char *p; - in_addr_t addr; - struct sockaddr_in6 *sin6; -#endif - - alcf = ngx_http_get_module_loc_conf(r, ngx_http_access_module); - - switch (r->connection->sockaddr->sa_family) { - - case AF_INET: - if (alcf->rules) { - sin = (struct sockaddr_in *) r->connection->sockaddr; - return ngx_http_access_inet(r, alcf, sin->sin_addr.s_addr); - } - break; - -#if (NGX_HAVE_INET6) - - case AF_INET6: - sin6 = (struct sockaddr_in6 *) r->connection->sockaddr; - p = sin6->sin6_addr.s6_addr; - - if (alcf->rules && IN6_IS_ADDR_V4MAPPED(&sin6->sin6_addr)) { - addr = (in_addr_t) p[12] << 24; - addr += p[13] << 16; - addr += p[14] << 8; - addr += p[15]; - return ngx_http_access_inet(r, alcf, htonl(addr)); - } - - if (alcf->rules6) { - return ngx_http_access_inet6(r, alcf, p); - } - - break; - -#endif - -#if (NGX_HAVE_UNIX_DOMAIN) - - case AF_UNIX: - if (alcf->rules_un) { - return ngx_http_access_unix(r, alcf); - } - - break; - -#endif - } - - return NGX_DECLINED; -} - - -static ngx_int_t -ngx_http_access_inet(ngx_http_request_t *r, ngx_http_access_loc_conf_t *alcf, - in_addr_t addr) -{ - ngx_uint_t i; - ngx_http_access_rule_t *rule; - - rule = alcf->rules->elts; - for (i = 0; i < alcf->rules->nelts; i++) { - - ngx_log_debug3(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "access: %08XD %08XD %08XD", - addr, rule[i].mask, rule[i].addr); - - if ((addr & rule[i].mask) == rule[i].addr) { - return ngx_http_access_found(r, rule[i].deny); - } - } - - return NGX_DECLINED; -} - - -#if (NGX_HAVE_INET6) - -static ngx_int_t -ngx_http_access_inet6(ngx_http_request_t *r, ngx_http_access_loc_conf_t *alcf, - u_char *p) -{ - ngx_uint_t n; - ngx_uint_t i; - ngx_http_access_rule6_t *rule6; - - rule6 = alcf->rules6->elts; - for (i = 0; i < alcf->rules6->nelts; i++) { - -#if (NGX_DEBUG) - { - size_t cl, ml, al; - u_char ct[NGX_INET6_ADDRSTRLEN]; - u_char mt[NGX_INET6_ADDRSTRLEN]; - u_char at[NGX_INET6_ADDRSTRLEN]; - - cl = ngx_inet6_ntop(p, ct, NGX_INET6_ADDRSTRLEN); - ml = ngx_inet6_ntop(rule6[i].mask.s6_addr, mt, NGX_INET6_ADDRSTRLEN); - al = ngx_inet6_ntop(rule6[i].addr.s6_addr, at, NGX_INET6_ADDRSTRLEN); - - ngx_log_debug6(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "access: %*s %*s %*s", cl, ct, ml, mt, al, at); - } -#endif - - for (n = 0; n < 16; n++) { - if ((p[n] & rule6[i].mask.s6_addr[n]) != rule6[i].addr.s6_addr[n]) { - goto next; - } - } - - return ngx_http_access_found(r, rule6[i].deny); - - next: - continue; - } - - return NGX_DECLINED; -} - -#endif - - -#if (NGX_HAVE_UNIX_DOMAIN) - -static ngx_int_t -ngx_http_access_unix(ngx_http_request_t *r, ngx_http_access_loc_conf_t *alcf) -{ - ngx_uint_t i; - ngx_http_access_rule_un_t *rule_un; - - rule_un = alcf->rules_un->elts; - for (i = 0; i < alcf->rules_un->nelts; i++) { - - /* TODO: check path */ - if (1) { - return ngx_http_access_found(r, rule_un[i].deny); - } - } - - return NGX_DECLINED; -} - -#endif - - -static ngx_int_t -ngx_http_access_found(ngx_http_request_t *r, ngx_uint_t deny) -{ - ngx_http_core_loc_conf_t *clcf; - - if (deny) { - clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module); - - if (clcf->satisfy == NGX_HTTP_SATISFY_ALL) { - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "access forbidden by rule"); - } - - return NGX_HTTP_FORBIDDEN; - } - - return NGX_OK; -} - - -static char * -ngx_http_access_rule(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) -{ - ngx_http_access_loc_conf_t *alcf = conf; - - ngx_int_t rc; - ngx_uint_t all; - ngx_str_t *value; - ngx_cidr_t cidr; - ngx_http_access_rule_t *rule; -#if (NGX_HAVE_INET6) - ngx_http_access_rule6_t *rule6; -#endif -#if (NGX_HAVE_UNIX_DOMAIN) - ngx_http_access_rule_un_t *rule_un; -#endif - - all = 0; - ngx_memzero(&cidr, sizeof(ngx_cidr_t)); - - value = cf->args->elts; - - if (value[1].len == 3 && ngx_strcmp(value[1].data, "all") == 0) { - all = 1; - -#if (NGX_HAVE_UNIX_DOMAIN) - } else if (value[1].len == 5 && ngx_strcmp(value[1].data, "unix:") == 0) { - cidr.family = AF_UNIX; -#endif - - } else { - rc = ngx_ptocidr(&value[1], &cidr); - - if (rc == NGX_ERROR) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "invalid parameter \"%V\"", &value[1]); - return NGX_CONF_ERROR; - } - - if (rc == NGX_DONE) { - ngx_conf_log_error(NGX_LOG_WARN, cf, 0, - "low address bits of %V are meaningless", &value[1]); - } - } - - if (cidr.family == AF_INET || all) { - - if (alcf->rules == NULL) { - alcf->rules = ngx_array_create(cf->pool, 4, - sizeof(ngx_http_access_rule_t)); - if (alcf->rules == NULL) { - return NGX_CONF_ERROR; - } - } - - rule = ngx_array_push(alcf->rules); - if (rule == NULL) { - return NGX_CONF_ERROR; - } - - rule->mask = cidr.u.in.mask; - rule->addr = cidr.u.in.addr; - rule->deny = (value[0].data[0] == 'd') ? 1 : 0; - } - -#if (NGX_HAVE_INET6) - if (cidr.family == AF_INET6 || all) { - - if (alcf->rules6 == NULL) { - alcf->rules6 = ngx_array_create(cf->pool, 4, - sizeof(ngx_http_access_rule6_t)); - if (alcf->rules6 == NULL) { - return NGX_CONF_ERROR; - } - } - - rule6 = ngx_array_push(alcf->rules6); - if (rule6 == NULL) { - return NGX_CONF_ERROR; - } - - rule6->mask = cidr.u.in6.mask; - rule6->addr = cidr.u.in6.addr; - rule6->deny = (value[0].data[0] == 'd') ? 1 : 0; - } -#endif - -#if (NGX_HAVE_UNIX_DOMAIN) - if (cidr.family == AF_UNIX || all) { - - if (alcf->rules_un == NULL) { - alcf->rules_un = ngx_array_create(cf->pool, 1, - sizeof(ngx_http_access_rule_un_t)); - if (alcf->rules_un == NULL) { - return NGX_CONF_ERROR; - } - } - - rule_un = ngx_array_push(alcf->rules_un); - if (rule_un == NULL) { - return NGX_CONF_ERROR; - } - - rule_un->deny = (value[0].data[0] == 'd') ? 1 : 0; - } -#endif - - return NGX_CONF_OK; -} - - -static void * -ngx_http_access_create_loc_conf(ngx_conf_t *cf) -{ - ngx_http_access_loc_conf_t *conf; - - conf = ngx_pcalloc(cf->pool, sizeof(ngx_http_access_loc_conf_t)); - if (conf == NULL) { - return NULL; - } - - return conf; -} - - -static char * -ngx_http_access_merge_loc_conf(ngx_conf_t *cf, void *parent, void *child) -{ - ngx_http_access_loc_conf_t *prev = parent; - ngx_http_access_loc_conf_t *conf = child; - - if (conf->rules == NULL -#if (NGX_HAVE_INET6) - && conf->rules6 == NULL -#endif -#if (NGX_HAVE_UNIX_DOMAIN) - && conf->rules_un == NULL -#endif - ) { - conf->rules = prev->rules; -#if (NGX_HAVE_INET6) - conf->rules6 = prev->rules6; -#endif -#if (NGX_HAVE_UNIX_DOMAIN) - conf->rules_un = prev->rules_un; -#endif - } - - return NGX_CONF_OK; -} - - -static ngx_int_t -ngx_http_access_init(ngx_conf_t *cf) -{ - ngx_http_handler_pt *h; - ngx_http_core_main_conf_t *cmcf; - - cmcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_core_module); - - h = ngx_array_push(&cmcf->phases[NGX_HTTP_ACCESS_PHASE].handlers); - if (h == NULL) { - return NGX_ERROR; - } - - *h = ngx_http_access_handler; - - return NGX_OK; -} diff --git a/src/deps/src/nginx-1.30.3/src/http/modules/ngx_http_addition_filter_module.c b/src/deps/src/nginx-1.30.3/src/http/modules/ngx_http_addition_filter_module.c deleted file mode 100644 index 040244c7e5..0000000000 --- a/src/deps/src/nginx-1.30.3/src/http/modules/ngx_http_addition_filter_module.c +++ /dev/null @@ -1,254 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#include -#include -#include - - -typedef struct { - ngx_str_t before_body; - ngx_str_t after_body; - - ngx_hash_t types; - ngx_array_t *types_keys; -} ngx_http_addition_conf_t; - - -typedef struct { - ngx_uint_t before_body_sent; -} ngx_http_addition_ctx_t; - - -static void *ngx_http_addition_create_conf(ngx_conf_t *cf); -static char *ngx_http_addition_merge_conf(ngx_conf_t *cf, void *parent, - void *child); -static ngx_int_t ngx_http_addition_filter_init(ngx_conf_t *cf); - - -static ngx_command_t ngx_http_addition_commands[] = { - - { ngx_string("add_before_body"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1, - ngx_conf_set_str_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_addition_conf_t, before_body), - NULL }, - - { ngx_string("add_after_body"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1, - ngx_conf_set_str_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_addition_conf_t, after_body), - NULL }, - - { ngx_string("addition_types"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE, - ngx_http_types_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_addition_conf_t, types_keys), - &ngx_http_html_default_types[0] }, - - ngx_null_command -}; - - -static ngx_http_module_t ngx_http_addition_filter_module_ctx = { - NULL, /* preconfiguration */ - ngx_http_addition_filter_init, /* postconfiguration */ - - NULL, /* create main configuration */ - NULL, /* init main configuration */ - - NULL, /* create server configuration */ - NULL, /* merge server configuration */ - - ngx_http_addition_create_conf, /* create location configuration */ - ngx_http_addition_merge_conf /* merge location configuration */ -}; - - -ngx_module_t ngx_http_addition_filter_module = { - NGX_MODULE_V1, - &ngx_http_addition_filter_module_ctx, /* module context */ - ngx_http_addition_commands, /* module directives */ - NGX_HTTP_MODULE, /* module type */ - NULL, /* init master */ - NULL, /* init module */ - NULL, /* init process */ - NULL, /* init thread */ - NULL, /* exit thread */ - NULL, /* exit process */ - NULL, /* exit master */ - NGX_MODULE_V1_PADDING -}; - - -static ngx_http_output_header_filter_pt ngx_http_next_header_filter; -static ngx_http_output_body_filter_pt ngx_http_next_body_filter; - - -static ngx_int_t -ngx_http_addition_header_filter(ngx_http_request_t *r) -{ - ngx_http_addition_ctx_t *ctx; - ngx_http_addition_conf_t *conf; - - if (r->headers_out.status != NGX_HTTP_OK || r != r->main) { - return ngx_http_next_header_filter(r); - } - - conf = ngx_http_get_module_loc_conf(r, ngx_http_addition_filter_module); - - if (conf->before_body.len == 0 && conf->after_body.len == 0) { - return ngx_http_next_header_filter(r); - } - - if (ngx_http_test_content_type(r, &conf->types) == NULL) { - return ngx_http_next_header_filter(r); - } - - ctx = ngx_pcalloc(r->pool, sizeof(ngx_http_addition_ctx_t)); - if (ctx == NULL) { - return NGX_ERROR; - } - - ngx_http_set_ctx(r, ctx, ngx_http_addition_filter_module); - - ngx_http_clear_content_length(r); - ngx_http_clear_accept_ranges(r); - ngx_http_weak_etag(r); - - r->preserve_body = 1; - - return ngx_http_next_header_filter(r); -} - - -static ngx_int_t -ngx_http_addition_body_filter(ngx_http_request_t *r, ngx_chain_t *in) -{ - ngx_int_t rc; - ngx_uint_t last; - ngx_chain_t *cl; - ngx_http_request_t *sr; - ngx_http_addition_ctx_t *ctx; - ngx_http_addition_conf_t *conf; - - if (in == NULL || r->header_only) { - return ngx_http_next_body_filter(r, in); - } - - ctx = ngx_http_get_module_ctx(r, ngx_http_addition_filter_module); - - if (ctx == NULL) { - return ngx_http_next_body_filter(r, in); - } - - conf = ngx_http_get_module_loc_conf(r, ngx_http_addition_filter_module); - - if (!ctx->before_body_sent) { - ctx->before_body_sent = 1; - - if (conf->before_body.len) { - if (ngx_http_subrequest(r, &conf->before_body, NULL, &sr, NULL, 0) - != NGX_OK) - { - return NGX_ERROR; - } - } - } - - if (conf->after_body.len == 0) { - ngx_http_set_ctx(r, NULL, ngx_http_addition_filter_module); - return ngx_http_next_body_filter(r, in); - } - - last = 0; - - for (cl = in; cl; cl = cl->next) { - if (cl->buf->last_buf) { - cl->buf->last_buf = 0; - cl->buf->last_in_chain = 1; - cl->buf->sync = 1; - last = 1; - } - } - - rc = ngx_http_next_body_filter(r, in); - - if (rc == NGX_ERROR || !last || conf->after_body.len == 0) { - return rc; - } - - if (ngx_http_subrequest(r, &conf->after_body, NULL, &sr, NULL, 0) - != NGX_OK) - { - return NGX_ERROR; - } - - ngx_http_set_ctx(r, NULL, ngx_http_addition_filter_module); - - return ngx_http_send_special(r, NGX_HTTP_LAST); -} - - -static ngx_int_t -ngx_http_addition_filter_init(ngx_conf_t *cf) -{ - ngx_http_next_header_filter = ngx_http_top_header_filter; - ngx_http_top_header_filter = ngx_http_addition_header_filter; - - ngx_http_next_body_filter = ngx_http_top_body_filter; - ngx_http_top_body_filter = ngx_http_addition_body_filter; - - return NGX_OK; -} - - -static void * -ngx_http_addition_create_conf(ngx_conf_t *cf) -{ - ngx_http_addition_conf_t *conf; - - conf = ngx_pcalloc(cf->pool, sizeof(ngx_http_addition_conf_t)); - if (conf == NULL) { - return NULL; - } - - /* - * set by ngx_pcalloc(): - * - * conf->before_body = { 0, NULL }; - * conf->after_body = { 0, NULL }; - * conf->types = { NULL }; - * conf->types_keys = NULL; - */ - - return conf; -} - - -static char * -ngx_http_addition_merge_conf(ngx_conf_t *cf, void *parent, void *child) -{ - ngx_http_addition_conf_t *prev = parent; - ngx_http_addition_conf_t *conf = child; - - ngx_conf_merge_str_value(conf->before_body, prev->before_body, ""); - ngx_conf_merge_str_value(conf->after_body, prev->after_body, ""); - - if (ngx_http_merge_types(cf, &conf->types_keys, &conf->types, - &prev->types_keys, &prev->types, - ngx_http_html_default_types) - != NGX_CONF_OK) - { - return NGX_CONF_ERROR; - } - - return NGX_CONF_OK; -} diff --git a/src/deps/src/nginx-1.30.3/src/http/modules/ngx_http_auth_basic_module.c b/src/deps/src/nginx-1.30.3/src/http/modules/ngx_http_auth_basic_module.c deleted file mode 100644 index 69e8d21611..0000000000 --- a/src/deps/src/nginx-1.30.3/src/http/modules/ngx_http_auth_basic_module.c +++ /dev/null @@ -1,433 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#include -#include -#include -#include - - -#define NGX_HTTP_AUTH_BUF_SIZE 2048 - - -typedef struct { - ngx_http_complex_value_t *realm; - ngx_http_complex_value_t *user_file; -} ngx_http_auth_basic_loc_conf_t; - - -static ngx_int_t ngx_http_auth_basic_handler(ngx_http_request_t *r); -static ngx_int_t ngx_http_auth_basic_crypt_handler(ngx_http_request_t *r, - ngx_str_t *passwd, ngx_str_t *realm); -static ngx_int_t ngx_http_auth_basic_set_realm(ngx_http_request_t *r, - ngx_str_t *realm); -static void *ngx_http_auth_basic_create_loc_conf(ngx_conf_t *cf); -static char *ngx_http_auth_basic_merge_loc_conf(ngx_conf_t *cf, - void *parent, void *child); -static ngx_int_t ngx_http_auth_basic_init(ngx_conf_t *cf); -static char *ngx_http_auth_basic_user_file(ngx_conf_t *cf, ngx_command_t *cmd, - void *conf); - - -static ngx_command_t ngx_http_auth_basic_commands[] = { - - { ngx_string("auth_basic"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LMT_CONF - |NGX_CONF_TAKE1, - ngx_http_set_complex_value_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_auth_basic_loc_conf_t, realm), - NULL }, - - { ngx_string("auth_basic_user_file"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LMT_CONF - |NGX_CONF_TAKE1, - ngx_http_auth_basic_user_file, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_auth_basic_loc_conf_t, user_file), - NULL }, - - ngx_null_command -}; - - -static ngx_http_module_t ngx_http_auth_basic_module_ctx = { - NULL, /* preconfiguration */ - ngx_http_auth_basic_init, /* postconfiguration */ - - NULL, /* create main configuration */ - NULL, /* init main configuration */ - - NULL, /* create server configuration */ - NULL, /* merge server configuration */ - - ngx_http_auth_basic_create_loc_conf, /* create location configuration */ - ngx_http_auth_basic_merge_loc_conf /* merge location configuration */ -}; - - -ngx_module_t ngx_http_auth_basic_module = { - NGX_MODULE_V1, - &ngx_http_auth_basic_module_ctx, /* module context */ - ngx_http_auth_basic_commands, /* module directives */ - NGX_HTTP_MODULE, /* module type */ - NULL, /* init master */ - NULL, /* init module */ - NULL, /* init process */ - NULL, /* init thread */ - NULL, /* exit thread */ - NULL, /* exit process */ - NULL, /* exit master */ - NGX_MODULE_V1_PADDING -}; - - -static ngx_int_t -ngx_http_auth_basic_handler(ngx_http_request_t *r) -{ - off_t offset; - ssize_t n; - ngx_fd_t fd; - ngx_int_t rc; - ngx_err_t err; - ngx_str_t pwd, realm, user_file; - ngx_uint_t i, level, login, left, passwd; - ngx_file_t file; - ngx_http_auth_basic_loc_conf_t *alcf; - u_char buf[NGX_HTTP_AUTH_BUF_SIZE]; - enum { - sw_login, - sw_passwd, - sw_skip - } state; - - alcf = ngx_http_get_module_loc_conf(r, ngx_http_auth_basic_module); - - if (alcf->realm == NULL || alcf->user_file == NULL) { - return NGX_DECLINED; - } - - if (ngx_http_complex_value(r, alcf->realm, &realm) != NGX_OK) { - return NGX_ERROR; - } - - if (realm.len == 3 && ngx_strncmp(realm.data, "off", 3) == 0) { - return NGX_DECLINED; - } - - rc = ngx_http_auth_basic_user(r); - - if (rc == NGX_DECLINED) { - - ngx_log_error(NGX_LOG_INFO, r->connection->log, 0, - "no user/password was provided for basic authentication"); - - return ngx_http_auth_basic_set_realm(r, &realm); - } - - if (rc == NGX_ERROR) { - return NGX_HTTP_INTERNAL_SERVER_ERROR; - } - - if (ngx_http_complex_value(r, alcf->user_file, &user_file) != NGX_OK) { - return NGX_ERROR; - } - - fd = ngx_open_file(user_file.data, NGX_FILE_RDONLY, NGX_FILE_OPEN, 0); - - if (fd == NGX_INVALID_FILE) { - err = ngx_errno; - - if (err == NGX_ENOENT) { - level = NGX_LOG_ERR; - rc = NGX_HTTP_FORBIDDEN; - - } else { - level = NGX_LOG_CRIT; - rc = NGX_HTTP_INTERNAL_SERVER_ERROR; - } - - ngx_log_error(level, r->connection->log, err, - ngx_open_file_n " \"%s\" failed", user_file.data); - - return rc; - } - - ngx_memzero(&file, sizeof(ngx_file_t)); - - file.fd = fd; - file.name = user_file; - file.log = r->connection->log; - - state = sw_login; - passwd = 0; - login = 0; - left = 0; - offset = 0; - - for ( ;; ) { - i = left; - - n = ngx_read_file(&file, buf + left, NGX_HTTP_AUTH_BUF_SIZE - left, - offset); - - if (n == NGX_ERROR) { - rc = NGX_HTTP_INTERNAL_SERVER_ERROR; - goto cleanup; - } - - if (n == 0) { - break; - } - - for (i = left; i < left + n; i++) { - switch (state) { - - case sw_login: - if (login == 0) { - - if (buf[i] == '#' || buf[i] == CR) { - state = sw_skip; - break; - } - - if (buf[i] == LF) { - break; - } - } - - if (buf[i] != r->headers_in.user.data[login]) { - state = sw_skip; - break; - } - - if (login == r->headers_in.user.len) { - state = sw_passwd; - passwd = i + 1; - } - - login++; - - break; - - case sw_passwd: - if (buf[i] == LF || buf[i] == CR || buf[i] == ':') { - buf[i] = '\0'; - - pwd.len = i - passwd; - pwd.data = &buf[passwd]; - - rc = ngx_http_auth_basic_crypt_handler(r, &pwd, &realm); - goto cleanup; - } - - break; - - case sw_skip: - if (buf[i] == LF) { - state = sw_login; - login = 0; - } - - break; - } - } - - if (state == sw_passwd) { - left = left + n - passwd; - ngx_memmove(buf, &buf[passwd], left); - passwd = 0; - - } else { - left = 0; - } - - offset += n; - } - - if (state == sw_passwd) { - pwd.len = i - passwd; - pwd.data = ngx_pnalloc(r->pool, pwd.len + 1); - if (pwd.data == NULL) { - rc = NGX_HTTP_INTERNAL_SERVER_ERROR; - goto cleanup; - } - - ngx_cpystrn(pwd.data, &buf[passwd], pwd.len + 1); - - rc = ngx_http_auth_basic_crypt_handler(r, &pwd, &realm); - goto cleanup; - } - - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "user \"%V\" was not found in \"%s\"", - &r->headers_in.user, user_file.data); - - rc = ngx_http_auth_basic_set_realm(r, &realm); - -cleanup: - - if (ngx_close_file(file.fd) == NGX_FILE_ERROR) { - ngx_log_error(NGX_LOG_ALERT, r->connection->log, ngx_errno, - ngx_close_file_n " \"%s\" failed", user_file.data); - } - - ngx_explicit_memzero(buf, NGX_HTTP_AUTH_BUF_SIZE); - - return rc; -} - - -static ngx_int_t -ngx_http_auth_basic_crypt_handler(ngx_http_request_t *r, ngx_str_t *passwd, - ngx_str_t *realm) -{ - ngx_int_t rc; - u_char *encrypted; - - rc = ngx_crypt(r->pool, r->headers_in.passwd.data, passwd->data, - &encrypted); - - ngx_log_debug3(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "rc: %i user: \"%V\" salt: \"%s\"", - rc, &r->headers_in.user, passwd->data); - - if (rc != NGX_OK) { - return NGX_HTTP_INTERNAL_SERVER_ERROR; - } - - if (ngx_strcmp(encrypted, passwd->data) == 0) { - return NGX_OK; - } - - ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "encrypted: \"%s\"", encrypted); - - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "user \"%V\": password mismatch", - &r->headers_in.user); - - return ngx_http_auth_basic_set_realm(r, realm); -} - - -static ngx_int_t -ngx_http_auth_basic_set_realm(ngx_http_request_t *r, ngx_str_t *realm) -{ - size_t len; - u_char *basic, *p; - - r->headers_out.www_authenticate = ngx_list_push(&r->headers_out.headers); - if (r->headers_out.www_authenticate == NULL) { - return NGX_HTTP_INTERNAL_SERVER_ERROR; - } - - len = sizeof("Basic realm=\"\"") - 1 + realm->len; - - basic = ngx_pnalloc(r->pool, len); - if (basic == NULL) { - r->headers_out.www_authenticate->hash = 0; - r->headers_out.www_authenticate = NULL; - return NGX_HTTP_INTERNAL_SERVER_ERROR; - } - - p = ngx_cpymem(basic, "Basic realm=\"", sizeof("Basic realm=\"") - 1); - p = ngx_cpymem(p, realm->data, realm->len); - *p = '"'; - - r->headers_out.www_authenticate->hash = 1; - r->headers_out.www_authenticate->next = NULL; - ngx_str_set(&r->headers_out.www_authenticate->key, "WWW-Authenticate"); - r->headers_out.www_authenticate->value.data = basic; - r->headers_out.www_authenticate->value.len = len; - - return NGX_HTTP_UNAUTHORIZED; -} - - -static void * -ngx_http_auth_basic_create_loc_conf(ngx_conf_t *cf) -{ - ngx_http_auth_basic_loc_conf_t *conf; - - conf = ngx_pcalloc(cf->pool, sizeof(ngx_http_auth_basic_loc_conf_t)); - if (conf == NULL) { - return NULL; - } - - conf->realm = NGX_CONF_UNSET_PTR; - conf->user_file = NGX_CONF_UNSET_PTR; - - return conf; -} - - -static char * -ngx_http_auth_basic_merge_loc_conf(ngx_conf_t *cf, void *parent, void *child) -{ - ngx_http_auth_basic_loc_conf_t *prev = parent; - ngx_http_auth_basic_loc_conf_t *conf = child; - - ngx_conf_merge_ptr_value(conf->realm, prev->realm, NULL); - ngx_conf_merge_ptr_value(conf->user_file, prev->user_file, NULL); - - return NGX_CONF_OK; -} - - -static ngx_int_t -ngx_http_auth_basic_init(ngx_conf_t *cf) -{ - ngx_http_handler_pt *h; - ngx_http_core_main_conf_t *cmcf; - - cmcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_core_module); - - h = ngx_array_push(&cmcf->phases[NGX_HTTP_ACCESS_PHASE].handlers); - if (h == NULL) { - return NGX_ERROR; - } - - *h = ngx_http_auth_basic_handler; - - return NGX_OK; -} - - -static char * -ngx_http_auth_basic_user_file(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) -{ - ngx_http_auth_basic_loc_conf_t *alcf = conf; - - ngx_str_t *value; - ngx_http_compile_complex_value_t ccv; - - if (alcf->user_file != NGX_CONF_UNSET_PTR) { - return "is duplicate"; - } - - alcf->user_file = ngx_palloc(cf->pool, sizeof(ngx_http_complex_value_t)); - if (alcf->user_file == NULL) { - return NGX_CONF_ERROR; - } - - value = cf->args->elts; - - ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t)); - - ccv.cf = cf; - ccv.value = &value[1]; - ccv.complex_value = alcf->user_file; - ccv.zero = 1; - ccv.conf_prefix = 1; - - if (ngx_http_compile_complex_value(&ccv) != NGX_OK) { - return NGX_CONF_ERROR; - } - - return NGX_CONF_OK; -} diff --git a/src/deps/src/nginx-1.30.3/src/http/modules/ngx_http_auth_request_module.c b/src/deps/src/nginx-1.30.3/src/http/modules/ngx_http_auth_request_module.c deleted file mode 100644 index 8bc98aae64..0000000000 --- a/src/deps/src/nginx-1.30.3/src/http/modules/ngx_http_auth_request_module.c +++ /dev/null @@ -1,450 +0,0 @@ - -/* - * Copyright (C) Maxim Dounin - * Copyright (C) Nginx, Inc. - */ - - -#include -#include -#include - - -typedef struct { - ngx_str_t uri; - ngx_array_t *vars; -} ngx_http_auth_request_conf_t; - - -typedef struct { - ngx_uint_t done; - ngx_uint_t status; - ngx_http_request_t *subrequest; -} ngx_http_auth_request_ctx_t; - - -typedef struct { - ngx_int_t index; - ngx_http_complex_value_t value; - ngx_http_set_variable_pt set_handler; -} ngx_http_auth_request_variable_t; - - -static ngx_int_t ngx_http_auth_request_handler(ngx_http_request_t *r); -static ngx_int_t ngx_http_auth_request_done(ngx_http_request_t *r, - void *data, ngx_int_t rc); -static ngx_int_t ngx_http_auth_request_set_variables(ngx_http_request_t *r, - ngx_http_auth_request_conf_t *arcf, ngx_http_auth_request_ctx_t *ctx); -static ngx_int_t ngx_http_auth_request_variable(ngx_http_request_t *r, - ngx_http_variable_value_t *v, uintptr_t data); -static void *ngx_http_auth_request_create_conf(ngx_conf_t *cf); -static char *ngx_http_auth_request_merge_conf(ngx_conf_t *cf, - void *parent, void *child); -static ngx_int_t ngx_http_auth_request_init(ngx_conf_t *cf); -static char *ngx_http_auth_request(ngx_conf_t *cf, ngx_command_t *cmd, - void *conf); -static char *ngx_http_auth_request_set(ngx_conf_t *cf, ngx_command_t *cmd, - void *conf); - - -static ngx_command_t ngx_http_auth_request_commands[] = { - - { ngx_string("auth_request"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1, - ngx_http_auth_request, - NGX_HTTP_LOC_CONF_OFFSET, - 0, - NULL }, - - { ngx_string("auth_request_set"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE2, - ngx_http_auth_request_set, - NGX_HTTP_LOC_CONF_OFFSET, - 0, - NULL }, - - ngx_null_command -}; - - -static ngx_http_module_t ngx_http_auth_request_module_ctx = { - NULL, /* preconfiguration */ - ngx_http_auth_request_init, /* postconfiguration */ - - NULL, /* create main configuration */ - NULL, /* init main configuration */ - - NULL, /* create server configuration */ - NULL, /* merge server configuration */ - - ngx_http_auth_request_create_conf, /* create location configuration */ - ngx_http_auth_request_merge_conf /* merge location configuration */ -}; - - -ngx_module_t ngx_http_auth_request_module = { - NGX_MODULE_V1, - &ngx_http_auth_request_module_ctx, /* module context */ - ngx_http_auth_request_commands, /* module directives */ - NGX_HTTP_MODULE, /* module type */ - NULL, /* init master */ - NULL, /* init module */ - NULL, /* init process */ - NULL, /* init thread */ - NULL, /* exit thread */ - NULL, /* exit process */ - NULL, /* exit master */ - NGX_MODULE_V1_PADDING -}; - - -static ngx_int_t -ngx_http_auth_request_handler(ngx_http_request_t *r) -{ - ngx_table_elt_t *h, *ho, **ph; - ngx_http_request_t *sr; - ngx_http_post_subrequest_t *ps; - ngx_http_auth_request_ctx_t *ctx; - ngx_http_auth_request_conf_t *arcf; - - arcf = ngx_http_get_module_loc_conf(r, ngx_http_auth_request_module); - - if (arcf->uri.len == 0) { - return NGX_DECLINED; - } - - ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "auth request handler"); - - ctx = ngx_http_get_module_ctx(r, ngx_http_auth_request_module); - - if (ctx != NULL) { - if (!ctx->done) { - return NGX_AGAIN; - } - - /* - * as soon as we are done - explicitly set variables to make - * sure they will be available after internal redirects - */ - - if (ngx_http_auth_request_set_variables(r, arcf, ctx) != NGX_OK) { - return NGX_ERROR; - } - - /* return appropriate status */ - - if (ctx->status == NGX_HTTP_FORBIDDEN) { - return ctx->status; - } - - if (ctx->status == NGX_HTTP_UNAUTHORIZED) { - sr = ctx->subrequest; - - h = sr->headers_out.www_authenticate; - - if (!h && sr->upstream) { - h = sr->upstream->headers_in.www_authenticate; - } - - ph = &r->headers_out.www_authenticate; - - while (h) { - ho = ngx_list_push(&r->headers_out.headers); - if (ho == NULL) { - return NGX_ERROR; - } - - *ho = *h; - ho->next = NULL; - - *ph = ho; - ph = &ho->next; - - h = h->next; - } - - return ctx->status; - } - - if (ctx->status >= NGX_HTTP_OK - && ctx->status < NGX_HTTP_SPECIAL_RESPONSE) - { - return NGX_OK; - } - - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "auth request unexpected status: %ui", ctx->status); - - return NGX_HTTP_INTERNAL_SERVER_ERROR; - } - - ctx = ngx_pcalloc(r->pool, sizeof(ngx_http_auth_request_ctx_t)); - if (ctx == NULL) { - return NGX_ERROR; - } - - ps = ngx_palloc(r->pool, sizeof(ngx_http_post_subrequest_t)); - if (ps == NULL) { - return NGX_ERROR; - } - - ps->handler = ngx_http_auth_request_done; - ps->data = ctx; - - if (ngx_http_subrequest(r, &arcf->uri, NULL, &sr, ps, - NGX_HTTP_SUBREQUEST_WAITED) - != NGX_OK) - { - return NGX_ERROR; - } - - /* - * allocate fake request body to avoid attempts to read it and to make - * sure real body file (if already read) won't be closed by upstream - */ - - sr->request_body = ngx_pcalloc(r->pool, sizeof(ngx_http_request_body_t)); - if (sr->request_body == NULL) { - return NGX_ERROR; - } - - sr->header_only = 1; - - ctx->subrequest = sr; - - ngx_http_set_ctx(r, ctx, ngx_http_auth_request_module); - - return NGX_AGAIN; -} - - -static ngx_int_t -ngx_http_auth_request_done(ngx_http_request_t *r, void *data, ngx_int_t rc) -{ - ngx_http_auth_request_ctx_t *ctx = data; - - ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "auth request done s:%ui", r->headers_out.status); - - ctx->done = 1; - ctx->status = r->headers_out.status; - - return rc; -} - - -static ngx_int_t -ngx_http_auth_request_set_variables(ngx_http_request_t *r, - ngx_http_auth_request_conf_t *arcf, ngx_http_auth_request_ctx_t *ctx) -{ - ngx_str_t val; - ngx_http_variable_t *v; - ngx_http_variable_value_t *vv; - ngx_http_auth_request_variable_t *av, *last; - ngx_http_core_main_conf_t *cmcf; - - ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "auth request set variables"); - - if (arcf->vars == NULL) { - return NGX_OK; - } - - cmcf = ngx_http_get_module_main_conf(r, ngx_http_core_module); - v = cmcf->variables.elts; - - av = arcf->vars->elts; - last = av + arcf->vars->nelts; - - while (av < last) { - /* - * explicitly set new value to make sure it will be available after - * internal redirects - */ - - vv = &r->variables[av->index]; - - if (ngx_http_complex_value(ctx->subrequest, &av->value, &val) - != NGX_OK) - { - return NGX_ERROR; - } - - vv->valid = 1; - vv->not_found = 0; - vv->data = val.data; - vv->len = val.len; - - if (av->set_handler) { - /* - * set_handler only available in cmcf->variables_keys, so we store - * it explicitly - */ - - av->set_handler(r, vv, v[av->index].data); - } - - av++; - } - - return NGX_OK; -} - - -static ngx_int_t -ngx_http_auth_request_variable(ngx_http_request_t *r, - ngx_http_variable_value_t *v, uintptr_t data) -{ - ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "auth request variable"); - - v->not_found = 1; - - return NGX_OK; -} - - -static void * -ngx_http_auth_request_create_conf(ngx_conf_t *cf) -{ - ngx_http_auth_request_conf_t *conf; - - conf = ngx_pcalloc(cf->pool, sizeof(ngx_http_auth_request_conf_t)); - if (conf == NULL) { - return NULL; - } - - /* - * set by ngx_pcalloc(): - * - * conf->uri = { 0, NULL }; - */ - - conf->vars = NGX_CONF_UNSET_PTR; - - return conf; -} - - -static char * -ngx_http_auth_request_merge_conf(ngx_conf_t *cf, void *parent, void *child) -{ - ngx_http_auth_request_conf_t *prev = parent; - ngx_http_auth_request_conf_t *conf = child; - - ngx_conf_merge_str_value(conf->uri, prev->uri, ""); - ngx_conf_merge_ptr_value(conf->vars, prev->vars, NULL); - - return NGX_CONF_OK; -} - - -static ngx_int_t -ngx_http_auth_request_init(ngx_conf_t *cf) -{ - ngx_http_handler_pt *h; - ngx_http_core_main_conf_t *cmcf; - - cmcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_core_module); - - h = ngx_array_push(&cmcf->phases[NGX_HTTP_ACCESS_PHASE].handlers); - if (h == NULL) { - return NGX_ERROR; - } - - *h = ngx_http_auth_request_handler; - - return NGX_OK; -} - - -static char * -ngx_http_auth_request(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) -{ - ngx_http_auth_request_conf_t *arcf = conf; - - ngx_str_t *value; - - if (arcf->uri.data != NULL) { - return "is duplicate"; - } - - value = cf->args->elts; - - if (ngx_strcmp(value[1].data, "off") == 0) { - arcf->uri.len = 0; - arcf->uri.data = (u_char *) ""; - - return NGX_CONF_OK; - } - - arcf->uri = value[1]; - - return NGX_CONF_OK; -} - - -static char * -ngx_http_auth_request_set(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) -{ - ngx_http_auth_request_conf_t *arcf = conf; - - ngx_str_t *value; - ngx_http_variable_t *v; - ngx_http_auth_request_variable_t *av; - ngx_http_compile_complex_value_t ccv; - - value = cf->args->elts; - - if (value[1].data[0] != '$') { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "invalid variable name \"%V\"", &value[1]); - return NGX_CONF_ERROR; - } - - value[1].len--; - value[1].data++; - - if (arcf->vars == NGX_CONF_UNSET_PTR) { - arcf->vars = ngx_array_create(cf->pool, 1, - sizeof(ngx_http_auth_request_variable_t)); - if (arcf->vars == NULL) { - return NGX_CONF_ERROR; - } - } - - av = ngx_array_push(arcf->vars); - if (av == NULL) { - return NGX_CONF_ERROR; - } - - v = ngx_http_add_variable(cf, &value[1], NGX_HTTP_VAR_CHANGEABLE); - if (v == NULL) { - return NGX_CONF_ERROR; - } - - av->index = ngx_http_get_variable_index(cf, &value[1]); - if (av->index == NGX_ERROR) { - return NGX_CONF_ERROR; - } - - if (v->get_handler == NULL) { - v->get_handler = ngx_http_auth_request_variable; - v->data = (uintptr_t) av; - } - - av->set_handler = v->set_handler; - - ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t)); - - ccv.cf = cf; - ccv.value = &value[2]; - ccv.complex_value = &av->value; - - if (ngx_http_compile_complex_value(&ccv) != NGX_OK) { - return NGX_CONF_ERROR; - } - - return NGX_CONF_OK; -} diff --git a/src/deps/src/nginx-1.30.3/src/http/modules/ngx_http_autoindex_module.c b/src/deps/src/nginx-1.30.3/src/http/modules/ngx_http_autoindex_module.c deleted file mode 100644 index 082bcb5e62..0000000000 --- a/src/deps/src/nginx-1.30.3/src/http/modules/ngx_http_autoindex_module.c +++ /dev/null @@ -1,1072 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#include -#include -#include - - -#if 0 - -typedef struct { - ngx_buf_t *buf; - size_t size; - ngx_pool_t *pool; - size_t alloc_size; - ngx_chain_t **last_out; -} ngx_http_autoindex_ctx_t; - -#endif - - -typedef struct { - ngx_str_t name; - size_t utf_len; - size_t escape; - size_t escape_html; - - unsigned dir:1; - unsigned file:1; - - time_t mtime; - off_t size; -} ngx_http_autoindex_entry_t; - - -typedef struct { - ngx_flag_t enable; - ngx_uint_t format; - ngx_flag_t localtime; - ngx_flag_t exact_size; -} ngx_http_autoindex_loc_conf_t; - - -#define NGX_HTTP_AUTOINDEX_HTML 0 -#define NGX_HTTP_AUTOINDEX_JSON 1 -#define NGX_HTTP_AUTOINDEX_JSONP 2 -#define NGX_HTTP_AUTOINDEX_XML 3 - -#define NGX_HTTP_AUTOINDEX_PREALLOCATE 50 - -#define NGX_HTTP_AUTOINDEX_NAME_LEN 50 - - -static ngx_buf_t *ngx_http_autoindex_html(ngx_http_request_t *r, - ngx_array_t *entries); -static ngx_buf_t *ngx_http_autoindex_json(ngx_http_request_t *r, - ngx_array_t *entries, ngx_str_t *callback); -static ngx_int_t ngx_http_autoindex_jsonp_callback(ngx_http_request_t *r, - ngx_str_t *callback); -static ngx_buf_t *ngx_http_autoindex_xml(ngx_http_request_t *r, - ngx_array_t *entries); - -static int ngx_libc_cdecl ngx_http_autoindex_cmp_entries(const void *one, - const void *two); -static ngx_int_t ngx_http_autoindex_error(ngx_http_request_t *r, - ngx_dir_t *dir, ngx_str_t *name); - -static ngx_int_t ngx_http_autoindex_init(ngx_conf_t *cf); -static void *ngx_http_autoindex_create_loc_conf(ngx_conf_t *cf); -static char *ngx_http_autoindex_merge_loc_conf(ngx_conf_t *cf, - void *parent, void *child); - - -static ngx_conf_enum_t ngx_http_autoindex_format[] = { - { ngx_string("html"), NGX_HTTP_AUTOINDEX_HTML }, - { ngx_string("json"), NGX_HTTP_AUTOINDEX_JSON }, - { ngx_string("jsonp"), NGX_HTTP_AUTOINDEX_JSONP }, - { ngx_string("xml"), NGX_HTTP_AUTOINDEX_XML }, - { ngx_null_string, 0 } -}; - - -static ngx_command_t ngx_http_autoindex_commands[] = { - - { ngx_string("autoindex"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG, - ngx_conf_set_flag_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_autoindex_loc_conf_t, enable), - NULL }, - - { ngx_string("autoindex_format"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1, - ngx_conf_set_enum_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_autoindex_loc_conf_t, format), - &ngx_http_autoindex_format }, - - { ngx_string("autoindex_localtime"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG, - ngx_conf_set_flag_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_autoindex_loc_conf_t, localtime), - NULL }, - - { ngx_string("autoindex_exact_size"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG, - ngx_conf_set_flag_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_autoindex_loc_conf_t, exact_size), - NULL }, - - ngx_null_command -}; - - -static ngx_http_module_t ngx_http_autoindex_module_ctx = { - NULL, /* preconfiguration */ - ngx_http_autoindex_init, /* postconfiguration */ - - NULL, /* create main configuration */ - NULL, /* init main configuration */ - - NULL, /* create server configuration */ - NULL, /* merge server configuration */ - - ngx_http_autoindex_create_loc_conf, /* create location configuration */ - ngx_http_autoindex_merge_loc_conf /* merge location configuration */ -}; - - -ngx_module_t ngx_http_autoindex_module = { - NGX_MODULE_V1, - &ngx_http_autoindex_module_ctx, /* module context */ - ngx_http_autoindex_commands, /* module directives */ - NGX_HTTP_MODULE, /* module type */ - NULL, /* init master */ - NULL, /* init module */ - NULL, /* init process */ - NULL, /* init thread */ - NULL, /* exit thread */ - NULL, /* exit process */ - NULL, /* exit master */ - NGX_MODULE_V1_PADDING -}; - - -static ngx_int_t -ngx_http_autoindex_handler(ngx_http_request_t *r) -{ - u_char *last, *filename; - size_t len, allocated, root; - ngx_err_t err; - ngx_buf_t *b; - ngx_int_t rc; - ngx_str_t path, callback; - ngx_dir_t dir; - ngx_uint_t level, format; - ngx_pool_t *pool; - ngx_chain_t out; - ngx_array_t entries; - ngx_http_autoindex_entry_t *entry; - ngx_http_autoindex_loc_conf_t *alcf; - - if (r->uri.data[r->uri.len - 1] != '/') { - return NGX_DECLINED; - } - - if (!(r->method & (NGX_HTTP_GET|NGX_HTTP_HEAD))) { - return NGX_DECLINED; - } - - alcf = ngx_http_get_module_loc_conf(r, ngx_http_autoindex_module); - - if (!alcf->enable) { - return NGX_DECLINED; - } - - rc = ngx_http_discard_request_body(r); - - if (rc != NGX_OK) { - return rc; - } - - last = ngx_http_map_uri_to_path(r, &path, &root, - NGX_HTTP_AUTOINDEX_PREALLOCATE); - if (last == NULL) { - return NGX_HTTP_INTERNAL_SERVER_ERROR; - } - - allocated = path.len; - path.len = last - path.data; - if (path.len > 1) { - path.len--; - } - path.data[path.len] = '\0'; - - ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "http autoindex: \"%s\"", path.data); - - format = alcf->format; - - if (format == NGX_HTTP_AUTOINDEX_JSONP) { - if (ngx_http_autoindex_jsonp_callback(r, &callback) != NGX_OK) { - return NGX_HTTP_BAD_REQUEST; - } - - if (callback.len == 0) { - format = NGX_HTTP_AUTOINDEX_JSON; - } - } - - if (ngx_open_dir(&path, &dir) == NGX_ERROR) { - err = ngx_errno; - - if (err == NGX_ENOENT - || err == NGX_ENOTDIR - || err == NGX_ENAMETOOLONG) - { - level = NGX_LOG_ERR; - rc = NGX_HTTP_NOT_FOUND; - - } else if (err == NGX_EACCES) { - level = NGX_LOG_ERR; - rc = NGX_HTTP_FORBIDDEN; - - } else { - level = NGX_LOG_CRIT; - rc = NGX_HTTP_INTERNAL_SERVER_ERROR; - } - - ngx_log_error(level, r->connection->log, err, - ngx_open_dir_n " \"%s\" failed", path.data); - - return rc; - } - -#if (NGX_SUPPRESS_WARN) - - /* MSVC thinks 'entries' may be used without having been initialized */ - ngx_memzero(&entries, sizeof(ngx_array_t)); - -#endif - - /* TODO: pool should be temporary pool */ - pool = r->pool; - - if (ngx_array_init(&entries, pool, 40, sizeof(ngx_http_autoindex_entry_t)) - != NGX_OK) - { - return ngx_http_autoindex_error(r, &dir, &path); - } - - r->headers_out.status = NGX_HTTP_OK; - - switch (format) { - - case NGX_HTTP_AUTOINDEX_JSON: - ngx_str_set(&r->headers_out.content_type, "application/json"); - break; - - case NGX_HTTP_AUTOINDEX_JSONP: - ngx_str_set(&r->headers_out.content_type, "application/javascript"); - break; - - case NGX_HTTP_AUTOINDEX_XML: - ngx_str_set(&r->headers_out.content_type, "text/xml"); - ngx_str_set(&r->headers_out.charset, "utf-8"); - break; - - default: /* NGX_HTTP_AUTOINDEX_HTML */ - ngx_str_set(&r->headers_out.content_type, "text/html"); - break; - } - - r->headers_out.content_type_len = r->headers_out.content_type.len; - r->headers_out.content_type_lowcase = NULL; - - rc = ngx_http_send_header(r); - - if (rc == NGX_ERROR || rc > NGX_OK || r->header_only) { - if (ngx_close_dir(&dir) == NGX_ERROR) { - ngx_log_error(NGX_LOG_ALERT, r->connection->log, ngx_errno, - ngx_close_dir_n " \"%V\" failed", &path); - } - - return rc; - } - - filename = path.data; - filename[path.len] = '/'; - - for ( ;; ) { - ngx_set_errno(0); - - if (ngx_read_dir(&dir) == NGX_ERROR) { - err = ngx_errno; - - if (err != NGX_ENOMOREFILES) { - ngx_log_error(NGX_LOG_CRIT, r->connection->log, err, - ngx_read_dir_n " \"%V\" failed", &path); - return ngx_http_autoindex_error(r, &dir, &path); - } - - break; - } - - ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "http autoindex file: \"%s\"", ngx_de_name(&dir)); - - len = ngx_de_namelen(&dir); - - if (ngx_de_name(&dir)[0] == '.') { - continue; - } - - if (!dir.valid_info) { - - /* 1 byte for '/' and 1 byte for terminating '\0' */ - - if (path.len + 1 + len + 1 > allocated) { - allocated = path.len + 1 + len + 1 - + NGX_HTTP_AUTOINDEX_PREALLOCATE; - - filename = ngx_pnalloc(pool, allocated); - if (filename == NULL) { - return ngx_http_autoindex_error(r, &dir, &path); - } - - last = ngx_cpystrn(filename, path.data, path.len + 1); - *last++ = '/'; - } - - ngx_cpystrn(last, ngx_de_name(&dir), len + 1); - - if (ngx_de_info(filename, &dir) == NGX_FILE_ERROR) { - err = ngx_errno; - - if (err != NGX_ENOENT && err != NGX_ELOOP) { - ngx_log_error(NGX_LOG_CRIT, r->connection->log, err, - ngx_de_info_n " \"%s\" failed", filename); - - if (err == NGX_EACCES) { - continue; - } - - return ngx_http_autoindex_error(r, &dir, &path); - } - - if (ngx_de_link_info(filename, &dir) == NGX_FILE_ERROR) { - ngx_log_error(NGX_LOG_CRIT, r->connection->log, ngx_errno, - ngx_de_link_info_n " \"%s\" failed", - filename); - return ngx_http_autoindex_error(r, &dir, &path); - } - } - } - - entry = ngx_array_push(&entries); - if (entry == NULL) { - return ngx_http_autoindex_error(r, &dir, &path); - } - - entry->name.len = len; - - entry->name.data = ngx_pnalloc(pool, len + 1); - if (entry->name.data == NULL) { - return ngx_http_autoindex_error(r, &dir, &path); - } - - ngx_cpystrn(entry->name.data, ngx_de_name(&dir), len + 1); - - entry->dir = ngx_de_is_dir(&dir); - entry->file = ngx_de_is_file(&dir); - entry->mtime = ngx_de_mtime(&dir); - entry->size = ngx_de_size(&dir); - } - - if (ngx_close_dir(&dir) == NGX_ERROR) { - ngx_log_error(NGX_LOG_ALERT, r->connection->log, ngx_errno, - ngx_close_dir_n " \"%V\" failed", &path); - } - - if (entries.nelts > 1) { - ngx_qsort(entries.elts, (size_t) entries.nelts, - sizeof(ngx_http_autoindex_entry_t), - ngx_http_autoindex_cmp_entries); - } - - switch (format) { - - case NGX_HTTP_AUTOINDEX_JSON: - b = ngx_http_autoindex_json(r, &entries, NULL); - break; - - case NGX_HTTP_AUTOINDEX_JSONP: - b = ngx_http_autoindex_json(r, &entries, &callback); - break; - - case NGX_HTTP_AUTOINDEX_XML: - b = ngx_http_autoindex_xml(r, &entries); - break; - - default: /* NGX_HTTP_AUTOINDEX_HTML */ - b = ngx_http_autoindex_html(r, &entries); - break; - } - - if (b == NULL) { - return NGX_ERROR; - } - - /* TODO: free temporary pool */ - - if (r == r->main) { - b->last_buf = 1; - } - - b->last_in_chain = 1; - - out.buf = b; - out.next = NULL; - - return ngx_http_output_filter(r, &out); -} - - -static ngx_buf_t * -ngx_http_autoindex_html(ngx_http_request_t *r, ngx_array_t *entries) -{ - u_char *last, scale; - off_t length; - size_t len, entry_len, char_len, escape_html; - ngx_tm_t tm; - ngx_buf_t *b; - ngx_int_t size; - ngx_uint_t i, utf8; - ngx_time_t *tp; - ngx_http_autoindex_entry_t *entry; - ngx_http_autoindex_loc_conf_t *alcf; - - static u_char title[] = - "" CRLF - "Index of " - ; - - static u_char header[] = - "" CRLF - "" CRLF - "

Index of " - ; - - static u_char tail[] = - "" CRLF - "" CRLF - ; - - static char *months[] = { "Jan", "Feb", "Mar", "Apr", "May", "Jun", - "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" }; - - if (r->headers_out.charset.len == 5 - && ngx_strncasecmp(r->headers_out.charset.data, (u_char *) "utf-8", 5) - == 0) - { - utf8 = 1; - - } else { - utf8 = 0; - } - - escape_html = ngx_escape_html(NULL, r->uri.data, r->uri.len); - - len = sizeof(title) - 1 - + r->uri.len + escape_html - + sizeof(header) - 1 - + r->uri.len + escape_html - + sizeof("

") - 1 - + sizeof("
../" CRLF) - 1
-          + sizeof("

") - 1 - + sizeof(tail) - 1; - - entry = entries->elts; - for (i = 0; i < entries->nelts; i++) { - entry[i].escape = 2 * ngx_escape_uri(NULL, entry[i].name.data, - entry[i].name.len, - NGX_ESCAPE_URI_COMPONENT); - - entry[i].escape_html = ngx_escape_html(NULL, entry[i].name.data, - entry[i].name.len); - - if (utf8) { - entry[i].utf_len = ngx_utf8_length(entry[i].name.data, - entry[i].name.len); - } else { - entry[i].utf_len = entry[i].name.len; - } - - entry_len = sizeof("") - 1 - + entry[i].name.len - entry[i].utf_len - + entry[i].escape_html - + NGX_HTTP_AUTOINDEX_NAME_LEN + sizeof(">") - 2 - + sizeof("") - 1 - + sizeof(" 28-Sep-1970 12:00 ") - 1 - + 20 /* the file size */ - + 2; - - if (len > NGX_MAX_SIZE_T_VALUE - entry_len) { - return NULL; - } - - len += entry_len; - } - - b = ngx_create_temp_buf(r->pool, len); - if (b == NULL) { - return NULL; - } - - b->last = ngx_cpymem(b->last, title, sizeof(title) - 1); - - if (escape_html) { - b->last = (u_char *) ngx_escape_html(b->last, r->uri.data, r->uri.len); - b->last = ngx_cpymem(b->last, header, sizeof(header) - 1); - b->last = (u_char *) ngx_escape_html(b->last, r->uri.data, r->uri.len); - - } else { - b->last = ngx_cpymem(b->last, r->uri.data, r->uri.len); - b->last = ngx_cpymem(b->last, header, sizeof(header) - 1); - b->last = ngx_cpymem(b->last, r->uri.data, r->uri.len); - } - - b->last = ngx_cpymem(b->last, "", sizeof("") - 1); - - b->last = ngx_cpymem(b->last, "
../" CRLF,
-                         sizeof("
../" CRLF) - 1);
-
-    alcf = ngx_http_get_module_loc_conf(r, ngx_http_autoindex_module);
-    tp = ngx_timeofday();
-
-    for (i = 0; i < entries->nelts; i++) {
-        b->last = ngx_cpymem(b->last, "last, entry[i].name.data, entry[i].name.len,
-                           NGX_ESCAPE_URI_COMPONENT);
-
-            b->last += entry[i].name.len + entry[i].escape;
-
-        } else {
-            b->last = ngx_cpymem(b->last, entry[i].name.data,
-                                 entry[i].name.len);
-        }
-
-        if (entry[i].dir) {
-            *b->last++ = '/';
-        }
-
-        *b->last++ = '"';
-        *b->last++ = '>';
-
-        len = entry[i].utf_len;
-
-        if (entry[i].name.len != len) {
-            if (len > NGX_HTTP_AUTOINDEX_NAME_LEN) {
-                char_len = NGX_HTTP_AUTOINDEX_NAME_LEN - 3 + 1;
-
-            } else {
-                char_len = NGX_HTTP_AUTOINDEX_NAME_LEN + 1;
-            }
-
-            last = b->last;
-            b->last = ngx_utf8_cpystrn(b->last, entry[i].name.data,
-                                       char_len, entry[i].name.len + 1);
-
-            if (entry[i].escape_html) {
-                b->last = (u_char *) ngx_escape_html(last, entry[i].name.data,
-                                                     b->last - last);
-            }
-
-            last = b->last;
-
-        } else {
-            if (entry[i].escape_html) {
-                if (len > NGX_HTTP_AUTOINDEX_NAME_LEN) {
-                    char_len = NGX_HTTP_AUTOINDEX_NAME_LEN - 3;
-
-                } else {
-                    char_len = len;
-                }
-
-                b->last = (u_char *) ngx_escape_html(b->last,
-                                                  entry[i].name.data, char_len);
-                last = b->last;
-
-            } else {
-                b->last = ngx_cpystrn(b->last, entry[i].name.data,
-                                      NGX_HTTP_AUTOINDEX_NAME_LEN + 1);
-                last = b->last - 3;
-            }
-        }
-
-        if (len > NGX_HTTP_AUTOINDEX_NAME_LEN) {
-            b->last = ngx_cpymem(last, "..>", sizeof("..>") - 1);
-
-        } else {
-            if (entry[i].dir && NGX_HTTP_AUTOINDEX_NAME_LEN - len > 0) {
-                *b->last++ = '/';
-                len++;
-            }
-
-            b->last = ngx_cpymem(b->last, "", sizeof("") - 1);
-
-            if (NGX_HTTP_AUTOINDEX_NAME_LEN - len > 0) {
-                ngx_memset(b->last, ' ', NGX_HTTP_AUTOINDEX_NAME_LEN - len);
-                b->last += NGX_HTTP_AUTOINDEX_NAME_LEN - len;
-            }
-        }
-
-        *b->last++ = ' ';
-
-        ngx_gmtime(entry[i].mtime + tp->gmtoff * 60 * alcf->localtime, &tm);
-
-        b->last = ngx_sprintf(b->last, "%02d-%s-%d %02d:%02d ",
-                              tm.ngx_tm_mday,
-                              months[tm.ngx_tm_mon - 1],
-                              tm.ngx_tm_year,
-                              tm.ngx_tm_hour,
-                              tm.ngx_tm_min);
-
-        if (alcf->exact_size) {
-            if (entry[i].dir) {
-                b->last = ngx_cpymem(b->last,  "                  -",
-                                     sizeof("                  -") - 1);
-            } else {
-                b->last = ngx_sprintf(b->last, "%19O", entry[i].size);
-            }
-
-        } else {
-            if (entry[i].dir) {
-                b->last = ngx_cpymem(b->last,  "      -",
-                                     sizeof("      -") - 1);
-
-            } else {
-                length = entry[i].size;
-
-                if (length > 1024 * 1024 * 1024 - 1) {
-                    size = (ngx_int_t) (length / (1024 * 1024 * 1024));
-                    if ((length % (1024 * 1024 * 1024))
-                                                > (1024 * 1024 * 1024 / 2 - 1))
-                    {
-                        size++;
-                    }
-                    scale = 'G';
-
-                } else if (length > 1024 * 1024 - 1) {
-                    size = (ngx_int_t) (length / (1024 * 1024));
-                    if ((length % (1024 * 1024)) > (1024 * 1024 / 2 - 1)) {
-                        size++;
-                    }
-                    scale = 'M';
-
-                } else if (length > 9999) {
-                    size = (ngx_int_t) (length / 1024);
-                    if (length % 1024 > 511) {
-                        size++;
-                    }
-                    scale = 'K';
-
-                } else {
-                    size = (ngx_int_t) length;
-                    scale = '\0';
-                }
-
-                if (scale) {
-                    b->last = ngx_sprintf(b->last, "%6i%c", size, scale);
-
-                } else {
-                    b->last = ngx_sprintf(b->last, " %6i", size);
-                }
-            }
-        }
-
-        *b->last++ = CR;
-        *b->last++ = LF;
-    }
-
-    b->last = ngx_cpymem(b->last, "

", sizeof("

") - 1); - - b->last = ngx_cpymem(b->last, tail, sizeof(tail) - 1); - - return b; -} - - -static ngx_buf_t * -ngx_http_autoindex_json(ngx_http_request_t *r, ngx_array_t *entries, - ngx_str_t *callback) -{ - size_t len, entry_len; - ngx_buf_t *b; - ngx_uint_t i; - ngx_http_autoindex_entry_t *entry; - - len = sizeof("[" CRLF CRLF "]") - 1; - - if (callback) { - len += sizeof("/* callback */" CRLF "();") - 1 + callback->len; - } - - entry = entries->elts; - - for (i = 0; i < entries->nelts; i++) { - entry[i].escape = ngx_escape_json(NULL, entry[i].name.data, - entry[i].name.len); - - entry_len = sizeof("{ }," CRLF) - 1 - + sizeof("\"name\":\"\"") - 1 - + entry[i].name.len + entry[i].escape - + sizeof(", \"type\":\"directory\"") - 1 - + sizeof(", \"mtime\":\"Wed, 31 Dec 1986 10:00:00 GMT\"") - 1; - - if (entry[i].file) { - entry_len += sizeof(", \"size\":") - 1 + NGX_OFF_T_LEN; - } - - if (len > NGX_MAX_SIZE_T_VALUE - entry_len) { - return NULL; - } - - len += entry_len; - } - - b = ngx_create_temp_buf(r->pool, len); - if (b == NULL) { - return NULL; - } - - if (callback) { - b->last = ngx_cpymem(b->last, "/* callback */" CRLF, - sizeof("/* callback */" CRLF) - 1); - - b->last = ngx_cpymem(b->last, callback->data, callback->len); - - *b->last++ = '('; - } - - *b->last++ = '['; - - for (i = 0; i < entries->nelts; i++) { - b->last = ngx_cpymem(b->last, CRLF "{ \"name\":\"", - sizeof(CRLF "{ \"name\":\"") - 1); - - if (entry[i].escape) { - b->last = (u_char *) ngx_escape_json(b->last, entry[i].name.data, - entry[i].name.len); - } else { - b->last = ngx_cpymem(b->last, entry[i].name.data, - entry[i].name.len); - } - - b->last = ngx_cpymem(b->last, "\", \"type\":\"", - sizeof("\", \"type\":\"") - 1); - - if (entry[i].dir) { - b->last = ngx_cpymem(b->last, "directory", sizeof("directory") - 1); - - } else if (entry[i].file) { - b->last = ngx_cpymem(b->last, "file", sizeof("file") - 1); - - } else { - b->last = ngx_cpymem(b->last, "other", sizeof("other") - 1); - } - - b->last = ngx_cpymem(b->last, "\", \"mtime\":\"", - sizeof("\", \"mtime\":\"") - 1); - - b->last = ngx_http_time(b->last, entry[i].mtime); - - if (entry[i].file) { - b->last = ngx_cpymem(b->last, "\", \"size\":", - sizeof("\", \"size\":") - 1); - b->last = ngx_sprintf(b->last, "%O", entry[i].size); - - } else { - *b->last++ = '"'; - } - - b->last = ngx_cpymem(b->last, " },", sizeof(" },") - 1); - } - - if (i > 0) { - b->last--; /* strip last comma */ - } - - b->last = ngx_cpymem(b->last, CRLF "]", sizeof(CRLF "]") - 1); - - if (callback) { - *b->last++ = ')'; *b->last++ = ';'; - } - - return b; -} - - -static ngx_int_t -ngx_http_autoindex_jsonp_callback(ngx_http_request_t *r, ngx_str_t *callback) -{ - u_char *p, c, ch; - ngx_uint_t i; - - if (ngx_http_arg(r, (u_char *) "callback", 8, callback) != NGX_OK) { - callback->len = 0; - return NGX_OK; - } - - if (callback->len > 128) { - ngx_log_error(NGX_LOG_INFO, r->connection->log, 0, - "client sent too long callback name: \"%V\"", callback); - return NGX_DECLINED; - } - - p = callback->data; - - for (i = 0; i < callback->len; i++) { - ch = p[i]; - - c = (u_char) (ch | 0x20); - if (c >= 'a' && c <= 'z') { - continue; - } - - if ((ch >= '0' && ch <= '9') || ch == '_' || ch == '.') { - continue; - } - - ngx_log_error(NGX_LOG_INFO, r->connection->log, 0, - "client sent invalid callback name: \"%V\"", callback); - - return NGX_DECLINED; - } - - return NGX_OK; -} - - -static ngx_buf_t * -ngx_http_autoindex_xml(ngx_http_request_t *r, ngx_array_t *entries) -{ - size_t len, entry_len; - ngx_tm_t tm; - ngx_buf_t *b; - ngx_str_t type; - ngx_uint_t i; - ngx_http_autoindex_entry_t *entry; - - static u_char head[] = "" CRLF "" CRLF; - static u_char tail[] = "" CRLF; - - len = sizeof(head) - 1 + sizeof(tail) - 1; - - entry = entries->elts; - - for (i = 0; i < entries->nelts; i++) { - entry[i].escape = ngx_escape_html(NULL, entry[i].name.data, - entry[i].name.len); - - entry_len = sizeof("" CRLF) - 1 - + entry[i].name.len + entry[i].escape - + sizeof(" mtime=\"1986-12-31T10:00:00Z\"") - 1; - - if (entry[i].file) { - entry_len += sizeof(" size=\"\"") - 1 + NGX_OFF_T_LEN; - } - - if (len > NGX_MAX_SIZE_T_VALUE - entry_len) { - return NULL; - } - - len += entry_len; - } - - b = ngx_create_temp_buf(r->pool, len); - if (b == NULL) { - return NULL; - } - - b->last = ngx_cpymem(b->last, head, sizeof(head) - 1); - - for (i = 0; i < entries->nelts; i++) { - *b->last++ = '<'; - - if (entry[i].dir) { - ngx_str_set(&type, "directory"); - - } else if (entry[i].file) { - ngx_str_set(&type, "file"); - - } else { - ngx_str_set(&type, "other"); - } - - b->last = ngx_cpymem(b->last, type.data, type.len); - - b->last = ngx_cpymem(b->last, " mtime=\"", sizeof(" mtime=\"") - 1); - - ngx_gmtime(entry[i].mtime, &tm); - - b->last = ngx_sprintf(b->last, "%4d-%02d-%02dT%02d:%02d:%02dZ", - tm.ngx_tm_year, tm.ngx_tm_mon, - tm.ngx_tm_mday, tm.ngx_tm_hour, - tm.ngx_tm_min, tm.ngx_tm_sec); - - if (entry[i].file) { - b->last = ngx_cpymem(b->last, "\" size=\"", - sizeof("\" size=\"") - 1); - b->last = ngx_sprintf(b->last, "%O", entry[i].size); - } - - *b->last++ = '"'; *b->last++ = '>'; - - if (entry[i].escape) { - b->last = (u_char *) ngx_escape_html(b->last, entry[i].name.data, - entry[i].name.len); - } else { - b->last = ngx_cpymem(b->last, entry[i].name.data, - entry[i].name.len); - } - - *b->last++ = '<'; *b->last++ = '/'; - - b->last = ngx_cpymem(b->last, type.data, type.len); - - *b->last++ = '>'; - - *b->last++ = CR; *b->last++ = LF; - } - - b->last = ngx_cpymem(b->last, tail, sizeof(tail) - 1); - - return b; -} - - -static int ngx_libc_cdecl -ngx_http_autoindex_cmp_entries(const void *one, const void *two) -{ - ngx_http_autoindex_entry_t *first = (ngx_http_autoindex_entry_t *) one; - ngx_http_autoindex_entry_t *second = (ngx_http_autoindex_entry_t *) two; - - if (first->dir && !second->dir) { - /* move the directories to the start */ - return -1; - } - - if (!first->dir && second->dir) { - /* move the directories to the start */ - return 1; - } - - return (int) ngx_strcmp(first->name.data, second->name.data); -} - - -#if 0 - -static ngx_buf_t * -ngx_http_autoindex_alloc(ngx_http_autoindex_ctx_t *ctx, size_t size) -{ - ngx_chain_t *cl; - - if (ctx->buf) { - - if ((size_t) (ctx->buf->end - ctx->buf->last) >= size) { - return ctx->buf; - } - - ctx->size += ctx->buf->last - ctx->buf->pos; - } - - ctx->buf = ngx_create_temp_buf(ctx->pool, ctx->alloc_size); - if (ctx->buf == NULL) { - return NULL; - } - - cl = ngx_alloc_chain_link(ctx->pool); - if (cl == NULL) { - return NULL; - } - - cl->buf = ctx->buf; - cl->next = NULL; - - *ctx->last_out = cl; - ctx->last_out = &cl->next; - - return ctx->buf; -} - -#endif - - -static ngx_int_t -ngx_http_autoindex_error(ngx_http_request_t *r, ngx_dir_t *dir, ngx_str_t *name) -{ - if (ngx_close_dir(dir) == NGX_ERROR) { - ngx_log_error(NGX_LOG_ALERT, r->connection->log, ngx_errno, - ngx_close_dir_n " \"%V\" failed", name); - } - - return r->header_sent ? NGX_ERROR : NGX_HTTP_INTERNAL_SERVER_ERROR; -} - - -static void * -ngx_http_autoindex_create_loc_conf(ngx_conf_t *cf) -{ - ngx_http_autoindex_loc_conf_t *conf; - - conf = ngx_palloc(cf->pool, sizeof(ngx_http_autoindex_loc_conf_t)); - if (conf == NULL) { - return NULL; - } - - conf->enable = NGX_CONF_UNSET; - conf->format = NGX_CONF_UNSET_UINT; - conf->localtime = NGX_CONF_UNSET; - conf->exact_size = NGX_CONF_UNSET; - - return conf; -} - - -static char * -ngx_http_autoindex_merge_loc_conf(ngx_conf_t *cf, void *parent, void *child) -{ - ngx_http_autoindex_loc_conf_t *prev = parent; - ngx_http_autoindex_loc_conf_t *conf = child; - - ngx_conf_merge_value(conf->enable, prev->enable, 0); - ngx_conf_merge_uint_value(conf->format, prev->format, - NGX_HTTP_AUTOINDEX_HTML); - ngx_conf_merge_value(conf->localtime, prev->localtime, 0); - ngx_conf_merge_value(conf->exact_size, prev->exact_size, 1); - - return NGX_CONF_OK; -} - - -static ngx_int_t -ngx_http_autoindex_init(ngx_conf_t *cf) -{ - ngx_http_handler_pt *h; - ngx_http_core_main_conf_t *cmcf; - - cmcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_core_module); - - h = ngx_array_push(&cmcf->phases[NGX_HTTP_CONTENT_PHASE].handlers); - if (h == NULL) { - return NGX_ERROR; - } - - *h = ngx_http_autoindex_handler; - - return NGX_OK; -} diff --git a/src/deps/src/nginx-1.30.3/src/http/modules/ngx_http_browser_module.c b/src/deps/src/nginx-1.30.3/src/http/modules/ngx_http_browser_module.c deleted file mode 100644 index f774254842..0000000000 --- a/src/deps/src/nginx-1.30.3/src/http/modules/ngx_http_browser_module.c +++ /dev/null @@ -1,712 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#include -#include -#include - - -/* - * The module can check browser versions conforming to the following formats: - * X, X.X, X.X.X, and X.X.X.X. The maximum values of each format may be - * 4000, 4000.99, 4000.99.99, and 4000.99.99.99. - */ - - -#define NGX_HTTP_MODERN_BROWSER 0 -#define NGX_HTTP_ANCIENT_BROWSER 1 - - -typedef struct { - u_char browser[12]; - size_t skip; - size_t add; - u_char name[12]; -} ngx_http_modern_browser_mask_t; - - -typedef struct { - ngx_uint_t version; - size_t skip; - size_t add; - u_char name[12]; -} ngx_http_modern_browser_t; - - -typedef struct { - ngx_array_t *modern_browsers; - ngx_array_t *ancient_browsers; - ngx_http_variable_value_t *modern_browser_value; - ngx_http_variable_value_t *ancient_browser_value; - - unsigned modern_unlisted_browsers:1; - unsigned netscape4:1; -} ngx_http_browser_conf_t; - - -static ngx_int_t ngx_http_msie_variable(ngx_http_request_t *r, - ngx_http_variable_value_t *v, uintptr_t data); -static ngx_int_t ngx_http_browser_variable(ngx_http_request_t *r, - ngx_http_variable_value_t *v, uintptr_t data); - -static ngx_uint_t ngx_http_browser(ngx_http_request_t *r, - ngx_http_browser_conf_t *cf); - -static ngx_int_t ngx_http_browser_add_variables(ngx_conf_t *cf); -static void *ngx_http_browser_create_conf(ngx_conf_t *cf); -static char *ngx_http_browser_merge_conf(ngx_conf_t *cf, void *parent, - void *child); -static int ngx_libc_cdecl ngx_http_modern_browser_sort(const void *one, - const void *two); -static char *ngx_http_modern_browser(ngx_conf_t *cf, ngx_command_t *cmd, - void *conf); -static char *ngx_http_ancient_browser(ngx_conf_t *cf, ngx_command_t *cmd, - void *conf); -static char *ngx_http_modern_browser_value(ngx_conf_t *cf, ngx_command_t *cmd, - void *conf); -static char *ngx_http_ancient_browser_value(ngx_conf_t *cf, ngx_command_t *cmd, - void *conf); - - -static ngx_command_t ngx_http_browser_commands[] = { - - { ngx_string("modern_browser"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE12, - ngx_http_modern_browser, - NGX_HTTP_LOC_CONF_OFFSET, - 0, - NULL }, - - { ngx_string("ancient_browser"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE, - ngx_http_ancient_browser, - NGX_HTTP_LOC_CONF_OFFSET, - 0, - NULL }, - - { ngx_string("modern_browser_value"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1, - ngx_http_modern_browser_value, - NGX_HTTP_LOC_CONF_OFFSET, - 0, - NULL }, - - { ngx_string("ancient_browser_value"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1, - ngx_http_ancient_browser_value, - NGX_HTTP_LOC_CONF_OFFSET, - 0, - NULL }, - - ngx_null_command -}; - - -static ngx_http_module_t ngx_http_browser_module_ctx = { - ngx_http_browser_add_variables, /* preconfiguration */ - NULL, /* postconfiguration */ - - NULL, /* create main configuration */ - NULL, /* init main configuration */ - - NULL, /* create server configuration */ - NULL, /* merge server configuration */ - - ngx_http_browser_create_conf, /* create location configuration */ - ngx_http_browser_merge_conf /* merge location configuration */ -}; - - -ngx_module_t ngx_http_browser_module = { - NGX_MODULE_V1, - &ngx_http_browser_module_ctx, /* module context */ - ngx_http_browser_commands, /* module directives */ - NGX_HTTP_MODULE, /* module type */ - NULL, /* init master */ - NULL, /* init module */ - NULL, /* init process */ - NULL, /* init thread */ - NULL, /* exit thread */ - NULL, /* exit process */ - NULL, /* exit master */ - NGX_MODULE_V1_PADDING -}; - - -static ngx_http_modern_browser_mask_t ngx_http_modern_browser_masks[] = { - - /* Opera must be the first browser to check */ - - /* - * "Opera/7.50 (X11; FreeBSD i386; U) [en]" - * "Mozilla/5.0 (X11; FreeBSD i386; U) Opera 7.50 [en]" - * "Mozilla/4.0 (compatible; MSIE 6.0; X11; FreeBSD i386) Opera 7.50 [en]" - * "Opera/8.0 (Windows NT 5.1; U; ru)" - * "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; en) Opera 8.0" - * "Opera/9.01 (X11; FreeBSD 6 i386; U; en)" - */ - - { "opera", - 0, - sizeof("Opera ") - 1, - "Opera"}, - - /* "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)" */ - - { "msie", - sizeof("Mozilla/4.0 (compatible; ") - 1, - sizeof("MSIE ") - 1, - "MSIE "}, - - /* - * "Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.0.0) Gecko/20020610" - * "Mozilla/5.0 (Windows; U; Windows NT 5.1; ru-RU; rv:1.5) Gecko/20031006" - * "Mozilla/5.0 (Windows; U; Windows NT 5.1; ru-RU; rv:1.6) Gecko/20040206 - * Firefox/0.8" - * "Mozilla/5.0 (Windows; U; Windows NT 5.1; ru-RU; rv:1.7.8) - * Gecko/20050511 Firefox/1.0.4" - * "Mozilla/5.0 (X11; U; FreeBSD i386; en-US; rv:1.8.0.5) Gecko/20060729 - * Firefox/1.5.0.5" - */ - - { "gecko", - sizeof("Mozilla/5.0 (") - 1, - sizeof("rv:") - 1, - "rv:"}, - - /* - * "Mozilla/5.0 (Macintosh; U; PPC Mac OS X; ru-ru) AppleWebKit/125.2 - * (KHTML, like Gecko) Safari/125.7" - * "Mozilla/5.0 (SymbianOS/9.1; U; en-us) AppleWebKit/413 - * (KHTML, like Gecko) Safari/413" - * "Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en) AppleWebKit/418 - * (KHTML, like Gecko) Safari/417.9.3" - * "Mozilla/5.0 (Macintosh; U; PPC Mac OS X; ru-ru) AppleWebKit/418.8 - * (KHTML, like Gecko) Safari/419.3" - */ - - { "safari", - sizeof("Mozilla/5.0 (") - 1, - sizeof("Safari/") - 1, - "Safari/"}, - - /* - * "Mozilla/5.0 (compatible; Konqueror/3.1; Linux)" - * "Mozilla/5.0 (compatible; Konqueror/3.4; Linux) KHTML/3.4.2 (like Gecko)" - * "Mozilla/5.0 (compatible; Konqueror/3.5; FreeBSD) KHTML/3.5.1 - * (like Gecko)" - */ - - { "konqueror", - sizeof("Mozilla/5.0 (compatible; ") - 1, - sizeof("Konqueror/") - 1, - "Konqueror/"}, - - { "", 0, 0, "" } - -}; - - -static ngx_http_variable_t ngx_http_browser_vars[] = { - - { ngx_string("msie"), NULL, ngx_http_msie_variable, - 0, NGX_HTTP_VAR_CHANGEABLE, 0 }, - - { ngx_string("modern_browser"), NULL, ngx_http_browser_variable, - NGX_HTTP_MODERN_BROWSER, NGX_HTTP_VAR_CHANGEABLE, 0 }, - - { ngx_string("ancient_browser"), NULL, ngx_http_browser_variable, - NGX_HTTP_ANCIENT_BROWSER, NGX_HTTP_VAR_CHANGEABLE, 0 }, - - ngx_http_null_variable -}; - - -static ngx_int_t -ngx_http_browser_variable(ngx_http_request_t *r, ngx_http_variable_value_t *v, - uintptr_t data) -{ - ngx_uint_t rc; - ngx_http_browser_conf_t *cf; - - cf = ngx_http_get_module_loc_conf(r, ngx_http_browser_module); - - rc = ngx_http_browser(r, cf); - - if (data == NGX_HTTP_MODERN_BROWSER && rc == NGX_HTTP_MODERN_BROWSER) { - *v = *cf->modern_browser_value; - return NGX_OK; - } - - if (data == NGX_HTTP_ANCIENT_BROWSER && rc == NGX_HTTP_ANCIENT_BROWSER) { - *v = *cf->ancient_browser_value; - return NGX_OK; - } - - *v = ngx_http_variable_null_value; - return NGX_OK; -} - - -static ngx_uint_t -ngx_http_browser(ngx_http_request_t *r, ngx_http_browser_conf_t *cf) -{ - size_t len; - u_char *name, *ua, *last, c; - ngx_str_t *ancient; - ngx_uint_t i, version, ver, scale; - ngx_http_modern_browser_t *modern; - - if (r->headers_in.user_agent == NULL) { - if (cf->modern_unlisted_browsers) { - return NGX_HTTP_MODERN_BROWSER; - } - - return NGX_HTTP_ANCIENT_BROWSER; - } - - ua = r->headers_in.user_agent->value.data; - len = r->headers_in.user_agent->value.len; - last = ua + len; - - if (cf->modern_browsers) { - modern = cf->modern_browsers->elts; - - for (i = 0; i < cf->modern_browsers->nelts; i++) { - name = ua + modern[i].skip; - - if (name >= last) { - continue; - } - - name = (u_char *) ngx_strstr(name, modern[i].name); - - if (name == NULL) { - continue; - } - - ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "browser: \"%s\"", name); - - name += modern[i].add; - - if (name >= last) { - continue; - } - - ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "version: \"%ui\" \"%s\"", modern[i].version, name); - - version = 0; - ver = 0; - scale = 1000000; - - while (name < last) { - - c = *name++; - - if (c >= '0' && c <= '9') { - ver = ver * 10 + (c - '0'); - continue; - } - - if (c == '.') { - version += ver * scale; - - ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "version: \"%ui\" \"%ui\"", - modern[i].version, version); - - if (version > modern[i].version) { - return NGX_HTTP_MODERN_BROWSER; - } - - ver = 0; - scale /= 100; - continue; - } - - break; - } - - version += ver * scale; - - ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "version: \"%ui\" \"%ui\"", - modern[i].version, version); - - if (version >= modern[i].version) { - return NGX_HTTP_MODERN_BROWSER; - } - - return NGX_HTTP_ANCIENT_BROWSER; - } - - if (!cf->modern_unlisted_browsers) { - return NGX_HTTP_ANCIENT_BROWSER; - } - } - - if (cf->netscape4) { - if (len > sizeof("Mozilla/4.72 ") - 1 - && ngx_strncmp(ua, "Mozilla/", sizeof("Mozilla/") - 1) == 0 - && ua[8] > '0' && ua[8] < '5') - { - return NGX_HTTP_ANCIENT_BROWSER; - } - } - - if (cf->ancient_browsers) { - ancient = cf->ancient_browsers->elts; - - for (i = 0; i < cf->ancient_browsers->nelts; i++) { - if (len >= ancient[i].len - && ngx_strstr(ua, ancient[i].data) != NULL) - { - return NGX_HTTP_ANCIENT_BROWSER; - } - } - } - - if (cf->modern_unlisted_browsers) { - return NGX_HTTP_MODERN_BROWSER; - } - - return NGX_HTTP_ANCIENT_BROWSER; -} - - -static ngx_int_t -ngx_http_msie_variable(ngx_http_request_t *r, ngx_http_variable_value_t *v, - uintptr_t data) -{ - if (r->headers_in.msie) { - *v = ngx_http_variable_true_value; - return NGX_OK; - } - - *v = ngx_http_variable_null_value; - return NGX_OK; -} - - -static ngx_int_t -ngx_http_browser_add_variables(ngx_conf_t *cf) -{ - ngx_http_variable_t *var, *v; - - for (v = ngx_http_browser_vars; v->name.len; v++) { - - var = ngx_http_add_variable(cf, &v->name, v->flags); - if (var == NULL) { - return NGX_ERROR; - } - - var->get_handler = v->get_handler; - var->data = v->data; - } - - return NGX_OK; -} - - -static void * -ngx_http_browser_create_conf(ngx_conf_t *cf) -{ - ngx_http_browser_conf_t *conf; - - conf = ngx_pcalloc(cf->pool, sizeof(ngx_http_browser_conf_t)); - if (conf == NULL) { - return NULL; - } - - /* - * set by ngx_pcalloc(): - * - * conf->modern_browsers = NULL; - * conf->ancient_browsers = NULL; - * conf->modern_browser_value = NULL; - * conf->ancient_browser_value = NULL; - * - * conf->modern_unlisted_browsers = 0; - * conf->netscape4 = 0; - */ - - return conf; -} - - -static char * -ngx_http_browser_merge_conf(ngx_conf_t *cf, void *parent, void *child) -{ - ngx_http_browser_conf_t *prev = parent; - ngx_http_browser_conf_t *conf = child; - - ngx_uint_t i, n; - ngx_http_modern_browser_t *browsers, *opera; - - /* - * At the merge the skip field is used to store the browser slot, - * it will be used in sorting and then will overwritten - * with a real skip value. The zero value means Opera. - */ - - if (conf->modern_browsers == NULL && conf->modern_unlisted_browsers == 0) { - conf->modern_browsers = prev->modern_browsers; - conf->modern_unlisted_browsers = prev->modern_unlisted_browsers; - - } else if (conf->modern_browsers != NULL) { - browsers = conf->modern_browsers->elts; - - for (i = 0; i < conf->modern_browsers->nelts; i++) { - if (browsers[i].skip == 0) { - goto found; - } - } - - /* - * Opera may contain MSIE string, so if Opera was not enumerated - * as modern browsers, then add it and set a unreachable version - */ - - opera = ngx_array_push(conf->modern_browsers); - if (opera == NULL) { - return NGX_CONF_ERROR; - } - - opera->skip = 0; - opera->version = 4001000000U; - - browsers = conf->modern_browsers->elts; - -found: - - ngx_qsort(browsers, (size_t) conf->modern_browsers->nelts, - sizeof(ngx_http_modern_browser_t), - ngx_http_modern_browser_sort); - - for (i = 0; i < conf->modern_browsers->nelts; i++) { - n = browsers[i].skip; - - browsers[i].skip = ngx_http_modern_browser_masks[n].skip; - browsers[i].add = ngx_http_modern_browser_masks[n].add; - (void) ngx_cpystrn(browsers[i].name, - ngx_http_modern_browser_masks[n].name, 12); - } - } - - if (conf->ancient_browsers == NULL && conf->netscape4 == 0) { - conf->ancient_browsers = prev->ancient_browsers; - conf->netscape4 = prev->netscape4; - } - - if (conf->modern_browser_value == NULL) { - conf->modern_browser_value = prev->modern_browser_value; - } - - if (conf->modern_browser_value == NULL) { - conf->modern_browser_value = &ngx_http_variable_true_value; - } - - if (conf->ancient_browser_value == NULL) { - conf->ancient_browser_value = prev->ancient_browser_value; - } - - if (conf->ancient_browser_value == NULL) { - conf->ancient_browser_value = &ngx_http_variable_true_value; - } - - return NGX_CONF_OK; -} - - -static int ngx_libc_cdecl -ngx_http_modern_browser_sort(const void *one, const void *two) -{ - ngx_http_modern_browser_t *first = (ngx_http_modern_browser_t *) one; - ngx_http_modern_browser_t *second = (ngx_http_modern_browser_t *) two; - - return (first->skip - second->skip); -} - - -static char * -ngx_http_modern_browser(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) -{ - ngx_http_browser_conf_t *bcf = conf; - - u_char c; - ngx_str_t *value; - ngx_uint_t i, n, version, ver, scale; - ngx_http_modern_browser_t *browser; - ngx_http_modern_browser_mask_t *mask; - - value = cf->args->elts; - - if (cf->args->nelts == 2) { - if (ngx_strcmp(value[1].data, "unlisted") == 0) { - bcf->modern_unlisted_browsers = 1; - return NGX_CONF_OK; - } - - return NGX_CONF_ERROR; - } - - if (bcf->modern_browsers == NULL) { - bcf->modern_browsers = ngx_array_create(cf->pool, 5, - sizeof(ngx_http_modern_browser_t)); - if (bcf->modern_browsers == NULL) { - return NGX_CONF_ERROR; - } - } - - browser = ngx_array_push(bcf->modern_browsers); - if (browser == NULL) { - return NGX_CONF_ERROR; - } - - mask = ngx_http_modern_browser_masks; - - for (n = 0; mask[n].browser[0] != '\0'; n++) { - if (ngx_strcasecmp(mask[n].browser, value[1].data) == 0) { - goto found; - } - } - - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "unknown browser name \"%V\"", &value[1]); - - return NGX_CONF_ERROR; - -found: - - /* - * at this stage the skip field is used to store the browser slot, - * it will be used in sorting in merge stage and then will overwritten - * with a real value - */ - - browser->skip = n; - - version = 0; - ver = 0; - scale = 1000000; - - for (i = 0; i < value[2].len; i++) { - - c = value[2].data[i]; - - if (c >= '0' && c <= '9') { - ver = ver * 10 + (c - '0'); - continue; - } - - if (c == '.') { - version += ver * scale; - ver = 0; - scale /= 100; - continue; - } - - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "invalid browser version \"%V\"", &value[2]); - - return NGX_CONF_ERROR; - } - - version += ver * scale; - - browser->version = version; - - return NGX_CONF_OK; -} - - -static char * -ngx_http_ancient_browser(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) -{ - ngx_http_browser_conf_t *bcf = conf; - - ngx_str_t *value, *browser; - ngx_uint_t i; - - value = cf->args->elts; - - for (i = 1; i < cf->args->nelts; i++) { - if (ngx_strcmp(value[i].data, "netscape4") == 0) { - bcf->netscape4 = 1; - continue; - } - - if (bcf->ancient_browsers == NULL) { - bcf->ancient_browsers = ngx_array_create(cf->pool, 4, - sizeof(ngx_str_t)); - if (bcf->ancient_browsers == NULL) { - return NGX_CONF_ERROR; - } - } - - browser = ngx_array_push(bcf->ancient_browsers); - if (browser == NULL) { - return NGX_CONF_ERROR; - } - - *browser = value[i]; - } - - return NGX_CONF_OK; -} - - -static char * -ngx_http_modern_browser_value(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) -{ - ngx_http_browser_conf_t *bcf = conf; - - ngx_str_t *value; - - bcf->modern_browser_value = ngx_palloc(cf->pool, - sizeof(ngx_http_variable_value_t)); - if (bcf->modern_browser_value == NULL) { - return NGX_CONF_ERROR; - } - - value = cf->args->elts; - - bcf->modern_browser_value->len = value[1].len; - bcf->modern_browser_value->valid = 1; - bcf->modern_browser_value->no_cacheable = 0; - bcf->modern_browser_value->not_found = 0; - bcf->modern_browser_value->data = value[1].data; - - return NGX_CONF_OK; -} - - -static char * -ngx_http_ancient_browser_value(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) -{ - ngx_http_browser_conf_t *bcf = conf; - - ngx_str_t *value; - - bcf->ancient_browser_value = ngx_palloc(cf->pool, - sizeof(ngx_http_variable_value_t)); - if (bcf->ancient_browser_value == NULL) { - return NGX_CONF_ERROR; - } - - value = cf->args->elts; - - bcf->ancient_browser_value->len = value[1].len; - bcf->ancient_browser_value->valid = 1; - bcf->ancient_browser_value->no_cacheable = 0; - bcf->ancient_browser_value->not_found = 0; - bcf->ancient_browser_value->data = value[1].data; - - return NGX_CONF_OK; -} diff --git a/src/deps/src/nginx-1.30.3/src/http/modules/ngx_http_charset_filter_module.c b/src/deps/src/nginx-1.30.3/src/http/modules/ngx_http_charset_filter_module.c deleted file mode 100644 index e0115e1e44..0000000000 --- a/src/deps/src/nginx-1.30.3/src/http/modules/ngx_http_charset_filter_module.c +++ /dev/null @@ -1,1687 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#include -#include -#include - - -#define NGX_HTTP_CHARSET_OFF -2 -#define NGX_HTTP_NO_CHARSET -3 -#define NGX_HTTP_CHARSET_VAR 0x10000 - -/* 1 byte length and up to 3 bytes for the UTF-8 encoding of the UCS-2 */ -#define NGX_UTF_LEN 4 - -#define NGX_HTML_ENTITY_LEN (sizeof("􏿿") - 1) - - -typedef struct { - u_char **tables; - ngx_str_t name; - - unsigned length:16; - unsigned utf8:1; -} ngx_http_charset_t; - - -typedef struct { - ngx_int_t src; - ngx_int_t dst; -} ngx_http_charset_recode_t; - - -typedef struct { - ngx_int_t src; - ngx_int_t dst; - u_char *src2dst; - u_char *dst2src; -} ngx_http_charset_tables_t; - - -typedef struct { - ngx_array_t charsets; /* ngx_http_charset_t */ - ngx_array_t tables; /* ngx_http_charset_tables_t */ - ngx_array_t recodes; /* ngx_http_charset_recode_t */ -} ngx_http_charset_main_conf_t; - - -typedef struct { - ngx_int_t charset; - ngx_int_t source_charset; - ngx_flag_t override_charset; - - ngx_hash_t types; - ngx_array_t *types_keys; -} ngx_http_charset_loc_conf_t; - - -typedef struct { - u_char *table; - ngx_int_t charset; - ngx_str_t charset_name; - - ngx_chain_t *busy; - ngx_chain_t *free_bufs; - ngx_chain_t *free_buffers; - - size_t saved_len; - u_char saved[NGX_UTF_LEN]; - - unsigned length:16; - unsigned from_utf8:1; - unsigned to_utf8:1; -} ngx_http_charset_ctx_t; - - -typedef struct { - ngx_http_charset_tables_t *table; - ngx_http_charset_t *charset; - ngx_uint_t characters; -} ngx_http_charset_conf_ctx_t; - - -static ngx_int_t ngx_http_destination_charset(ngx_http_request_t *r, - ngx_str_t *name); -static ngx_int_t ngx_http_main_request_charset(ngx_http_request_t *r, - ngx_str_t *name); -static ngx_int_t ngx_http_source_charset(ngx_http_request_t *r, - ngx_str_t *name); -static ngx_int_t ngx_http_get_charset(ngx_http_request_t *r, ngx_str_t *name); -static ngx_inline void ngx_http_set_charset(ngx_http_request_t *r, - ngx_str_t *charset); -static ngx_int_t ngx_http_charset_ctx(ngx_http_request_t *r, - ngx_http_charset_t *charsets, ngx_int_t charset, ngx_int_t source_charset); -static ngx_uint_t ngx_http_charset_recode(ngx_buf_t *b, u_char *table); -static ngx_chain_t *ngx_http_charset_recode_from_utf8(ngx_pool_t *pool, - ngx_buf_t *buf, ngx_http_charset_ctx_t *ctx); -static ngx_chain_t *ngx_http_charset_recode_to_utf8(ngx_pool_t *pool, - ngx_buf_t *buf, ngx_http_charset_ctx_t *ctx); - -static ngx_chain_t *ngx_http_charset_get_buf(ngx_pool_t *pool, - ngx_http_charset_ctx_t *ctx); -static ngx_chain_t *ngx_http_charset_get_buffer(ngx_pool_t *pool, - ngx_http_charset_ctx_t *ctx, size_t size); - -static char *ngx_http_charset_map_block(ngx_conf_t *cf, ngx_command_t *cmd, - void *conf); -static char *ngx_http_charset_map(ngx_conf_t *cf, ngx_command_t *dummy, - void *conf); - -static char *ngx_http_set_charset_slot(ngx_conf_t *cf, ngx_command_t *cmd, - void *conf); -static ngx_int_t ngx_http_add_charset(ngx_array_t *charsets, ngx_str_t *name); - -static void *ngx_http_charset_create_main_conf(ngx_conf_t *cf); -static void *ngx_http_charset_create_loc_conf(ngx_conf_t *cf); -static char *ngx_http_charset_merge_loc_conf(ngx_conf_t *cf, - void *parent, void *child); -static ngx_int_t ngx_http_charset_postconfiguration(ngx_conf_t *cf); - - -static ngx_str_t ngx_http_charset_default_types[] = { - ngx_string("text/html"), - ngx_string("text/xml"), - ngx_string("text/plain"), - ngx_string("text/vnd.wap.wml"), - ngx_string("application/javascript"), - ngx_string("application/rss+xml"), - ngx_null_string -}; - - -static ngx_command_t ngx_http_charset_filter_commands[] = { - - { ngx_string("charset"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF - |NGX_HTTP_LIF_CONF|NGX_CONF_TAKE1, - ngx_http_set_charset_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_charset_loc_conf_t, charset), - NULL }, - - { ngx_string("source_charset"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF - |NGX_HTTP_LIF_CONF|NGX_CONF_TAKE1, - ngx_http_set_charset_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_charset_loc_conf_t, source_charset), - NULL }, - - { ngx_string("override_charset"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF - |NGX_HTTP_LIF_CONF|NGX_CONF_FLAG, - ngx_conf_set_flag_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_charset_loc_conf_t, override_charset), - NULL }, - - { ngx_string("charset_types"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE, - ngx_http_types_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_charset_loc_conf_t, types_keys), - &ngx_http_charset_default_types[0] }, - - { ngx_string("charset_map"), - NGX_HTTP_MAIN_CONF|NGX_CONF_BLOCK|NGX_CONF_TAKE2, - ngx_http_charset_map_block, - NGX_HTTP_MAIN_CONF_OFFSET, - 0, - NULL }, - - ngx_null_command -}; - - -static ngx_http_module_t ngx_http_charset_filter_module_ctx = { - NULL, /* preconfiguration */ - ngx_http_charset_postconfiguration, /* postconfiguration */ - - ngx_http_charset_create_main_conf, /* create main configuration */ - NULL, /* init main configuration */ - - NULL, /* create server configuration */ - NULL, /* merge server configuration */ - - ngx_http_charset_create_loc_conf, /* create location configuration */ - ngx_http_charset_merge_loc_conf /* merge location configuration */ -}; - - -ngx_module_t ngx_http_charset_filter_module = { - NGX_MODULE_V1, - &ngx_http_charset_filter_module_ctx, /* module context */ - ngx_http_charset_filter_commands, /* module directives */ - NGX_HTTP_MODULE, /* module type */ - NULL, /* init master */ - NULL, /* init module */ - NULL, /* init process */ - NULL, /* init thread */ - NULL, /* exit thread */ - NULL, /* exit process */ - NULL, /* exit master */ - NGX_MODULE_V1_PADDING -}; - - -static ngx_http_output_header_filter_pt ngx_http_next_header_filter; -static ngx_http_output_body_filter_pt ngx_http_next_body_filter; - - -static ngx_int_t -ngx_http_charset_header_filter(ngx_http_request_t *r) -{ - ngx_int_t charset, source_charset; - ngx_str_t dst, src; - ngx_http_charset_t *charsets; - ngx_http_charset_main_conf_t *mcf; - - if (r == r->main) { - charset = ngx_http_destination_charset(r, &dst); - - } else { - charset = ngx_http_main_request_charset(r, &dst); - } - - if (charset == NGX_ERROR) { - return NGX_ERROR; - } - - if (charset == NGX_DECLINED) { - return ngx_http_next_header_filter(r); - } - - /* charset: charset index or NGX_HTTP_NO_CHARSET */ - - source_charset = ngx_http_source_charset(r, &src); - - if (source_charset == NGX_ERROR) { - return NGX_ERROR; - } - - /* - * source_charset: charset index, NGX_HTTP_NO_CHARSET, - * or NGX_HTTP_CHARSET_OFF - */ - - ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "charset: \"%V\" > \"%V\"", &src, &dst); - - if (source_charset == NGX_HTTP_CHARSET_OFF) { - ngx_http_set_charset(r, &dst); - - return ngx_http_next_header_filter(r); - } - - if (charset == NGX_HTTP_NO_CHARSET - || source_charset == NGX_HTTP_NO_CHARSET) - { - if (source_charset != charset - || ngx_strncasecmp(dst.data, src.data, dst.len) != 0) - { - goto no_charset_map; - } - - ngx_http_set_charset(r, &dst); - - return ngx_http_next_header_filter(r); - } - - if (source_charset == charset) { - r->headers_out.content_type.len = r->headers_out.content_type_len; - - ngx_http_set_charset(r, &dst); - - return ngx_http_next_header_filter(r); - } - - /* source_charset != charset */ - - if (r->headers_out.content_encoding - && r->headers_out.content_encoding->value.len) - { - return ngx_http_next_header_filter(r); - } - - mcf = ngx_http_get_module_main_conf(r, ngx_http_charset_filter_module); - charsets = mcf->charsets.elts; - - if (charsets[source_charset].tables == NULL - || charsets[source_charset].tables[charset] == NULL) - { - goto no_charset_map; - } - - r->headers_out.content_type.len = r->headers_out.content_type_len; - - ngx_http_set_charset(r, &dst); - - return ngx_http_charset_ctx(r, charsets, charset, source_charset); - -no_charset_map: - - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "no \"charset_map\" between the charsets \"%V\" and \"%V\"", - &src, &dst); - - return ngx_http_next_header_filter(r); -} - - -static ngx_int_t -ngx_http_destination_charset(ngx_http_request_t *r, ngx_str_t *name) -{ - ngx_int_t charset; - ngx_http_charset_t *charsets; - ngx_http_variable_value_t *vv; - ngx_http_charset_loc_conf_t *mlcf; - ngx_http_charset_main_conf_t *mcf; - - if (r->headers_out.content_type.len == 0) { - return NGX_DECLINED; - } - - if (r->headers_out.override_charset - && r->headers_out.override_charset->len) - { - *name = *r->headers_out.override_charset; - - charset = ngx_http_get_charset(r, name); - - if (charset != NGX_HTTP_NO_CHARSET) { - return charset; - } - - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "unknown charset \"%V\" to override", name); - - return NGX_DECLINED; - } - - mlcf = ngx_http_get_module_loc_conf(r, ngx_http_charset_filter_module); - charset = mlcf->charset; - - if (charset == NGX_HTTP_CHARSET_OFF) { - return NGX_DECLINED; - } - - if (r->headers_out.charset.len) { - if (mlcf->override_charset == 0) { - return NGX_DECLINED; - } - - } else { - if (ngx_http_test_content_type(r, &mlcf->types) == NULL) { - return NGX_DECLINED; - } - } - - if (charset < NGX_HTTP_CHARSET_VAR) { - mcf = ngx_http_get_module_main_conf(r, ngx_http_charset_filter_module); - charsets = mcf->charsets.elts; - *name = charsets[charset].name; - return charset; - } - - vv = ngx_http_get_indexed_variable(r, charset - NGX_HTTP_CHARSET_VAR); - - if (vv == NULL || vv->not_found) { - return NGX_ERROR; - } - - name->len = vv->len; - name->data = vv->data; - - return ngx_http_get_charset(r, name); -} - - -static ngx_int_t -ngx_http_main_request_charset(ngx_http_request_t *r, ngx_str_t *src) -{ - ngx_int_t charset; - ngx_str_t *main_charset; - ngx_http_charset_ctx_t *ctx; - - ctx = ngx_http_get_module_ctx(r->main, ngx_http_charset_filter_module); - - if (ctx) { - *src = ctx->charset_name; - return ctx->charset; - } - - main_charset = &r->main->headers_out.charset; - - if (main_charset->len == 0) { - return NGX_DECLINED; - } - - ctx = ngx_pcalloc(r->pool, sizeof(ngx_http_charset_ctx_t)); - if (ctx == NULL) { - return NGX_ERROR; - } - - ngx_http_set_ctx(r->main, ctx, ngx_http_charset_filter_module); - - charset = ngx_http_get_charset(r, main_charset); - - ctx->charset = charset; - ctx->charset_name = *main_charset; - *src = *main_charset; - - return charset; -} - - -static ngx_int_t -ngx_http_source_charset(ngx_http_request_t *r, ngx_str_t *name) -{ - ngx_int_t charset; - ngx_http_charset_t *charsets; - ngx_http_variable_value_t *vv; - ngx_http_charset_loc_conf_t *lcf; - ngx_http_charset_main_conf_t *mcf; - - if (r->headers_out.charset.len) { - *name = r->headers_out.charset; - return ngx_http_get_charset(r, name); - } - - lcf = ngx_http_get_module_loc_conf(r, ngx_http_charset_filter_module); - - charset = lcf->source_charset; - - if (charset == NGX_HTTP_CHARSET_OFF) { - name->len = 0; - return charset; - } - - if (charset < NGX_HTTP_CHARSET_VAR) { - mcf = ngx_http_get_module_main_conf(r, ngx_http_charset_filter_module); - charsets = mcf->charsets.elts; - *name = charsets[charset].name; - return charset; - } - - vv = ngx_http_get_indexed_variable(r, charset - NGX_HTTP_CHARSET_VAR); - - if (vv == NULL || vv->not_found) { - return NGX_ERROR; - } - - name->len = vv->len; - name->data = vv->data; - - return ngx_http_get_charset(r, name); -} - - -static ngx_int_t -ngx_http_get_charset(ngx_http_request_t *r, ngx_str_t *name) -{ - ngx_uint_t i, n; - ngx_http_charset_t *charset; - ngx_http_charset_main_conf_t *mcf; - - mcf = ngx_http_get_module_main_conf(r, ngx_http_charset_filter_module); - - charset = mcf->charsets.elts; - n = mcf->charsets.nelts; - - for (i = 0; i < n; i++) { - if (charset[i].name.len != name->len) { - continue; - } - - if (ngx_strncasecmp(charset[i].name.data, name->data, name->len) == 0) { - return i; - } - } - - return NGX_HTTP_NO_CHARSET; -} - - -static ngx_inline void -ngx_http_set_charset(ngx_http_request_t *r, ngx_str_t *charset) -{ - if (r != r->main) { - return; - } - - if (r->headers_out.status == NGX_HTTP_MOVED_PERMANENTLY - || r->headers_out.status == NGX_HTTP_MOVED_TEMPORARILY) - { - /* - * do not set charset for the redirect because NN 4.x - * use this charset instead of the next page charset - */ - - r->headers_out.charset.len = 0; - return; - } - - r->headers_out.charset = *charset; -} - - -static ngx_int_t -ngx_http_charset_ctx(ngx_http_request_t *r, ngx_http_charset_t *charsets, - ngx_int_t charset, ngx_int_t source_charset) -{ - ngx_http_charset_ctx_t *ctx; - - ctx = ngx_pcalloc(r->pool, sizeof(ngx_http_charset_ctx_t)); - if (ctx == NULL) { - return NGX_ERROR; - } - - ngx_http_set_ctx(r, ctx, ngx_http_charset_filter_module); - - ctx->table = charsets[source_charset].tables[charset]; - ctx->charset = charset; - ctx->charset_name = charsets[charset].name; - ctx->length = charsets[charset].length; - ctx->from_utf8 = charsets[source_charset].utf8; - ctx->to_utf8 = charsets[charset].utf8; - - r->filter_need_in_memory = 1; - - if ((ctx->to_utf8 || ctx->from_utf8) && r == r->main) { - ngx_http_clear_content_length(r); - - } else { - r->filter_need_temporary = 1; - } - - return ngx_http_next_header_filter(r); -} - - -static ngx_int_t -ngx_http_charset_body_filter(ngx_http_request_t *r, ngx_chain_t *in) -{ - ngx_int_t rc; - ngx_buf_t *b; - ngx_chain_t *cl, *out, **ll; - ngx_http_charset_ctx_t *ctx; - - ctx = ngx_http_get_module_ctx(r, ngx_http_charset_filter_module); - - if (ctx == NULL || ctx->table == NULL) { - return ngx_http_next_body_filter(r, in); - } - - if ((ctx->to_utf8 || ctx->from_utf8) || ctx->busy) { - - out = NULL; - ll = &out; - - for (cl = in; cl; cl = cl->next) { - b = cl->buf; - - if (ngx_buf_size(b) == 0) { - - *ll = ngx_alloc_chain_link(r->pool); - if (*ll == NULL) { - return NGX_ERROR; - } - - (*ll)->buf = b; - (*ll)->next = NULL; - - ll = &(*ll)->next; - - continue; - } - - if (ctx->to_utf8) { - *ll = ngx_http_charset_recode_to_utf8(r->pool, b, ctx); - - } else { - *ll = ngx_http_charset_recode_from_utf8(r->pool, b, ctx); - } - - if (*ll == NULL) { - return NGX_ERROR; - } - - while (*ll) { - ll = &(*ll)->next; - } - } - - rc = ngx_http_next_body_filter(r, out); - - if (out) { - if (ctx->busy == NULL) { - ctx->busy = out; - - } else { - for (cl = ctx->busy; cl->next; cl = cl->next) { /* void */ } - cl->next = out; - } - } - - while (ctx->busy) { - - cl = ctx->busy; - b = cl->buf; - - if (ngx_buf_size(b) != 0) { - break; - } - - ctx->busy = cl->next; - - if (b->tag != (ngx_buf_tag_t) &ngx_http_charset_filter_module) { - continue; - } - - if (b->shadow) { - b->shadow->pos = b->shadow->last; - } - - if (b->pos) { - cl->next = ctx->free_buffers; - ctx->free_buffers = cl; - continue; - } - - cl->next = ctx->free_bufs; - ctx->free_bufs = cl; - } - - return rc; - } - - for (cl = in; cl; cl = cl->next) { - (void) ngx_http_charset_recode(cl->buf, ctx->table); - } - - return ngx_http_next_body_filter(r, in); -} - - -static ngx_uint_t -ngx_http_charset_recode(ngx_buf_t *b, u_char *table) -{ - u_char *p, *last; - - last = b->last; - - for (p = b->pos; p < last; p++) { - - if (*p != table[*p]) { - goto recode; - } - } - - return 0; - -recode: - - do { - if (*p != table[*p]) { - *p = table[*p]; - } - - p++; - - } while (p < last); - - b->in_file = 0; - - return 1; -} - - -static ngx_chain_t * -ngx_http_charset_recode_from_utf8(ngx_pool_t *pool, ngx_buf_t *buf, - ngx_http_charset_ctx_t *ctx) -{ - size_t len, size; - u_char c, *p, *src, *dst, *saved, **table; - uint32_t n; - ngx_buf_t *b; - ngx_chain_t *out, *cl, **ll; - - src = buf->pos; - - if (ctx->saved_len == 0) { - - for ( /* void */ ; src < buf->last; src++) { - - if (*src < 0x80) { - continue; - } - - len = src - buf->pos; - - if (len > 512) { - out = ngx_http_charset_get_buf(pool, ctx); - if (out == NULL) { - return NULL; - } - - b = out->buf; - - b->temporary = buf->temporary; - b->memory = buf->memory; - b->mmap = buf->mmap; - b->flush = buf->flush; - - b->pos = buf->pos; - b->last = src; - - out->buf = b; - out->next = NULL; - - size = buf->last - src; - - saved = src; - n = ngx_utf8_decode(&saved, size); - - if (n == 0xfffffffe) { - /* incomplete UTF-8 symbol */ - - ngx_memcpy(ctx->saved, src, size); - ctx->saved_len = size; - - b->shadow = buf; - - return out; - } - - } else { - out = NULL; - size = len + buf->last - src; - src = buf->pos; - } - - if (size < NGX_HTML_ENTITY_LEN) { - size += NGX_HTML_ENTITY_LEN; - } - - cl = ngx_http_charset_get_buffer(pool, ctx, size); - if (cl == NULL) { - return NULL; - } - - if (out) { - out->next = cl; - - } else { - out = cl; - } - - b = cl->buf; - dst = b->pos; - - goto recode; - } - - out = ngx_alloc_chain_link(pool); - if (out == NULL) { - return NULL; - } - - out->buf = buf; - out->next = NULL; - - return out; - } - - /* process incomplete UTF sequence from previous buffer */ - - ngx_log_debug1(NGX_LOG_DEBUG_HTTP, pool->log, 0, - "http charset utf saved: %z", ctx->saved_len); - - len = ngx_min(NGX_UTF_LEN - ctx->saved_len, (size_t) (buf->last - src)); - ngx_memcpy(&ctx->saved[ctx->saved_len], src, len); - len += ctx->saved_len; - - saved = ctx->saved; - n = ngx_utf8_decode(&saved, len); - - c = '\0'; - - if (n < 0x10000) { - table = (u_char **) ctx->table; - p = table[n >> 8]; - - if (p) { - c = p[n & 0xff]; - } - - } else if (n == 0xfffffffe) { - - /* incomplete UTF-8 symbol */ - - if (len < NGX_UTF_LEN) { - out = ngx_http_charset_get_buf(pool, ctx); - if (out == NULL) { - return NULL; - } - - b = out->buf; - - b->pos = buf->pos; - b->last = buf->last; - b->sync = 1; - b->shadow = buf; - - ctx->saved_len = len; - - return out; - } - } - - size = buf->last - buf->pos; - - if (size < NGX_HTML_ENTITY_LEN) { - size += NGX_HTML_ENTITY_LEN; - } - - cl = ngx_http_charset_get_buffer(pool, ctx, size); - if (cl == NULL) { - return NULL; - } - - out = cl; - - b = cl->buf; - dst = b->pos; - - if (c) { - *dst++ = c; - - } else if (n == 0xfffffffe) { - *dst++ = '?'; - - ngx_log_debug0(NGX_LOG_DEBUG_HTTP, pool->log, 0, - "http charset invalid utf 0"); - - saved = &ctx->saved[NGX_UTF_LEN]; - - } else if (n > 0x10ffff) { - *dst++ = '?'; - - ngx_log_debug0(NGX_LOG_DEBUG_HTTP, pool->log, 0, - "http charset invalid utf 1"); - - if (saved < &ctx->saved[ctx->saved_len]) { - saved = &ctx->saved[ctx->saved_len]; - } - - } else { - dst = ngx_sprintf(dst, "&#%uD;", n); - } - - src += (saved - ctx->saved) - ctx->saved_len; - ctx->saved_len = 0; - -recode: - - ll = &cl->next; - - table = (u_char **) ctx->table; - - while (src < buf->last) { - - if ((size_t) (b->end - dst) < NGX_HTML_ENTITY_LEN) { - b->last = dst; - - size = buf->last - src + NGX_HTML_ENTITY_LEN; - - cl = ngx_http_charset_get_buffer(pool, ctx, size); - if (cl == NULL) { - return NULL; - } - - *ll = cl; - ll = &cl->next; - - b = cl->buf; - dst = b->pos; - } - - if (*src < 0x80) { - *dst++ = *src++; - continue; - } - - len = buf->last - src; - - n = ngx_utf8_decode(&src, len); - - if (n < 0x10000) { - - p = table[n >> 8]; - - if (p) { - c = p[n & 0xff]; - - if (c) { - *dst++ = c; - continue; - } - } - - dst = ngx_sprintf(dst, "&#%uD;", n); - - continue; - } - - if (n == 0xfffffffe) { - /* incomplete UTF-8 symbol */ - - ngx_memcpy(ctx->saved, src, len); - ctx->saved_len = len; - - if (b->pos == dst) { - b->sync = 1; - b->temporary = 0; - } - - break; - } - - if (n > 0x10ffff) { - *dst++ = '?'; - - ngx_log_debug0(NGX_LOG_DEBUG_HTTP, pool->log, 0, - "http charset invalid utf 2"); - - continue; - } - - /* n > 0xffff */ - - dst = ngx_sprintf(dst, "&#%uD;", n); - } - - b->last = dst; - - b->last_buf = buf->last_buf; - b->last_in_chain = buf->last_in_chain; - b->flush = buf->flush; - - b->shadow = buf; - - return out; -} - - -static ngx_chain_t * -ngx_http_charset_recode_to_utf8(ngx_pool_t *pool, ngx_buf_t *buf, - ngx_http_charset_ctx_t *ctx) -{ - size_t len, size; - u_char *p, *src, *dst, *table; - ngx_buf_t *b; - ngx_chain_t *out, *cl, **ll; - - table = ctx->table; - - for (src = buf->pos; src < buf->last; src++) { - if (table[*src * NGX_UTF_LEN] == '\1') { - continue; - } - - goto recode; - } - - out = ngx_alloc_chain_link(pool); - if (out == NULL) { - return NULL; - } - - out->buf = buf; - out->next = NULL; - - return out; - -recode: - - /* - * we assume that there are about half of characters to be recoded, - * so we preallocate "size / 2 + size / 2 * ctx->length" - */ - - len = src - buf->pos; - - if (len > 512) { - out = ngx_http_charset_get_buf(pool, ctx); - if (out == NULL) { - return NULL; - } - - b = out->buf; - - b->temporary = buf->temporary; - b->memory = buf->memory; - b->mmap = buf->mmap; - b->flush = buf->flush; - - b->pos = buf->pos; - b->last = src; - - out->buf = b; - out->next = NULL; - - size = buf->last - src; - size = size / 2 + size / 2 * ctx->length; - - } else { - out = NULL; - - size = buf->last - src; - size = len + size / 2 + size / 2 * ctx->length; - - src = buf->pos; - } - - cl = ngx_http_charset_get_buffer(pool, ctx, size); - if (cl == NULL) { - return NULL; - } - - if (out) { - out->next = cl; - - } else { - out = cl; - } - - ll = &cl->next; - - b = cl->buf; - dst = b->pos; - - while (src < buf->last) { - - p = &table[*src++ * NGX_UTF_LEN]; - len = *p++; - - if ((size_t) (b->end - dst) < len) { - b->last = dst; - - size = buf->last - src; - size = len + size / 2 + size / 2 * ctx->length; - - cl = ngx_http_charset_get_buffer(pool, ctx, size); - if (cl == NULL) { - return NULL; - } - - *ll = cl; - ll = &cl->next; - - b = cl->buf; - dst = b->pos; - } - - while (len) { - *dst++ = *p++; - len--; - } - } - - b->last = dst; - - b->last_buf = buf->last_buf; - b->last_in_chain = buf->last_in_chain; - b->flush = buf->flush; - - b->shadow = buf; - - return out; -} - - -static ngx_chain_t * -ngx_http_charset_get_buf(ngx_pool_t *pool, ngx_http_charset_ctx_t *ctx) -{ - ngx_chain_t *cl; - - cl = ctx->free_bufs; - - if (cl) { - ctx->free_bufs = cl->next; - - cl->buf->shadow = NULL; - cl->next = NULL; - - return cl; - } - - cl = ngx_alloc_chain_link(pool); - if (cl == NULL) { - return NULL; - } - - cl->buf = ngx_calloc_buf(pool); - if (cl->buf == NULL) { - return NULL; - } - - cl->next = NULL; - - cl->buf->tag = (ngx_buf_tag_t) &ngx_http_charset_filter_module; - - return cl; -} - - -static ngx_chain_t * -ngx_http_charset_get_buffer(ngx_pool_t *pool, ngx_http_charset_ctx_t *ctx, - size_t size) -{ - ngx_buf_t *b; - ngx_chain_t *cl, **ll; - - for (ll = &ctx->free_buffers, cl = ctx->free_buffers; - cl; - ll = &cl->next, cl = cl->next) - { - b = cl->buf; - - if ((size_t) (b->end - b->start) >= size) { - *ll = cl->next; - cl->next = NULL; - - b->pos = b->start; - b->temporary = 1; - b->shadow = NULL; - - return cl; - } - } - - cl = ngx_alloc_chain_link(pool); - if (cl == NULL) { - return NULL; - } - - cl->buf = ngx_create_temp_buf(pool, size); - if (cl->buf == NULL) { - return NULL; - } - - cl->next = NULL; - - cl->buf->temporary = 1; - cl->buf->tag = (ngx_buf_tag_t) &ngx_http_charset_filter_module; - - return cl; -} - - -static char * -ngx_http_charset_map_block(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) -{ - ngx_http_charset_main_conf_t *mcf = conf; - - char *rv; - u_char *p, *dst2src, **pp; - ngx_int_t src, dst; - ngx_uint_t i, n; - ngx_str_t *value; - ngx_conf_t pvcf; - ngx_http_charset_t *charset; - ngx_http_charset_tables_t *table; - ngx_http_charset_conf_ctx_t ctx; - - value = cf->args->elts; - - src = ngx_http_add_charset(&mcf->charsets, &value[1]); - if (src == NGX_ERROR) { - return NGX_CONF_ERROR; - } - - dst = ngx_http_add_charset(&mcf->charsets, &value[2]); - if (dst == NGX_ERROR) { - return NGX_CONF_ERROR; - } - - if (src == dst) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "\"charset_map\" between the same charsets " - "\"%V\" and \"%V\"", &value[1], &value[2]); - return NGX_CONF_ERROR; - } - - table = mcf->tables.elts; - for (i = 0; i < mcf->tables.nelts; i++) { - if ((src == table->src && dst == table->dst) - || (src == table->dst && dst == table->src)) - { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "duplicate \"charset_map\" between " - "\"%V\" and \"%V\"", &value[1], &value[2]); - return NGX_CONF_ERROR; - } - } - - table = ngx_array_push(&mcf->tables); - if (table == NULL) { - return NGX_CONF_ERROR; - } - - table->src = src; - table->dst = dst; - - if (ngx_strcasecmp(value[2].data, (u_char *) "utf-8") == 0) { - table->src2dst = ngx_pcalloc(cf->pool, 256 * NGX_UTF_LEN); - if (table->src2dst == NULL) { - return NGX_CONF_ERROR; - } - - table->dst2src = ngx_pcalloc(cf->pool, 256 * sizeof(void *)); - if (table->dst2src == NULL) { - return NGX_CONF_ERROR; - } - - dst2src = ngx_pcalloc(cf->pool, 256); - if (dst2src == NULL) { - return NGX_CONF_ERROR; - } - - pp = (u_char **) &table->dst2src[0]; - pp[0] = dst2src; - - for (i = 0; i < 128; i++) { - p = &table->src2dst[i * NGX_UTF_LEN]; - p[0] = '\1'; - p[1] = (u_char) i; - dst2src[i] = (u_char) i; - } - - for (/* void */; i < 256; i++) { - p = &table->src2dst[i * NGX_UTF_LEN]; - p[0] = '\1'; - p[1] = '?'; - } - - } else { - table->src2dst = ngx_palloc(cf->pool, 256); - if (table->src2dst == NULL) { - return NGX_CONF_ERROR; - } - - table->dst2src = ngx_palloc(cf->pool, 256); - if (table->dst2src == NULL) { - return NGX_CONF_ERROR; - } - - for (i = 0; i < 128; i++) { - table->src2dst[i] = (u_char) i; - table->dst2src[i] = (u_char) i; - } - - for (/* void */; i < 256; i++) { - table->src2dst[i] = '?'; - table->dst2src[i] = '?'; - } - } - - charset = mcf->charsets.elts; - - ctx.table = table; - ctx.charset = &charset[dst]; - ctx.characters = 0; - - pvcf = *cf; - cf->ctx = &ctx; - cf->handler = ngx_http_charset_map; - cf->handler_conf = conf; - - rv = ngx_conf_parse(cf, NULL); - - *cf = pvcf; - - if (ctx.characters) { - n = ctx.charset->length; - ctx.charset->length /= ctx.characters; - - if (((n * 10) / ctx.characters) % 10 > 4) { - ctx.charset->length++; - } - } - - return rv; -} - - -static char * -ngx_http_charset_map(ngx_conf_t *cf, ngx_command_t *dummy, void *conf) -{ - u_char *p, *dst2src, **pp; - uint32_t n; - ngx_int_t src, dst; - ngx_str_t *value; - ngx_uint_t i; - ngx_http_charset_tables_t *table; - ngx_http_charset_conf_ctx_t *ctx; - - if (cf->args->nelts != 2) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, "invalid parameters number"); - return NGX_CONF_ERROR; - } - - value = cf->args->elts; - - src = ngx_hextoi(value[0].data, value[0].len); - if (src == NGX_ERROR || src > 255) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "invalid value \"%V\"", &value[0]); - return NGX_CONF_ERROR; - } - - ctx = cf->ctx; - table = ctx->table; - - if (ctx->charset->utf8) { - if (value[1].len / 2 > NGX_UTF_LEN - 1) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "invalid value \"%V\"", &value[1]); - return NGX_CONF_ERROR; - } - - p = &table->src2dst[src * NGX_UTF_LEN]; - - *p++ = (u_char) (value[1].len / 2); - - for (i = 0; i < value[1].len; i += 2) { - dst = ngx_hextoi(&value[1].data[i], 2); - if (dst == NGX_ERROR || dst > 255) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "invalid value \"%V\"", &value[1]); - return NGX_CONF_ERROR; - } - - *p++ = (u_char) dst; - } - - i /= 2; - - ctx->charset->length += i; - ctx->characters++; - - p = &table->src2dst[src * NGX_UTF_LEN] + 1; - - n = ngx_utf8_decode(&p, i); - - if (n > 0xffff) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "invalid value \"%V\"", &value[1]); - return NGX_CONF_ERROR; - } - - pp = (u_char **) &table->dst2src[0]; - - dst2src = pp[n >> 8]; - - if (dst2src == NULL) { - dst2src = ngx_pcalloc(cf->pool, 256); - if (dst2src == NULL) { - return NGX_CONF_ERROR; - } - - pp[n >> 8] = dst2src; - } - - dst2src[n & 0xff] = (u_char) src; - - } else { - dst = ngx_hextoi(value[1].data, value[1].len); - if (dst == NGX_ERROR || dst > 255) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "invalid value \"%V\"", &value[1]); - return NGX_CONF_ERROR; - } - - table->src2dst[src] = (u_char) dst; - table->dst2src[dst] = (u_char) src; - } - - return NGX_CONF_OK; -} - - -static char * -ngx_http_set_charset_slot(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) -{ - char *p = conf; - - ngx_int_t *cp; - ngx_str_t *value, var; - ngx_http_charset_main_conf_t *mcf; - - cp = (ngx_int_t *) (p + cmd->offset); - - if (*cp != NGX_CONF_UNSET) { - return "is duplicate"; - } - - value = cf->args->elts; - - if (cmd->offset == offsetof(ngx_http_charset_loc_conf_t, charset) - && ngx_strcmp(value[1].data, "off") == 0) - { - *cp = NGX_HTTP_CHARSET_OFF; - return NGX_CONF_OK; - } - - - if (value[1].data[0] == '$') { - var.len = value[1].len - 1; - var.data = value[1].data + 1; - - *cp = ngx_http_get_variable_index(cf, &var); - - if (*cp == NGX_ERROR) { - return NGX_CONF_ERROR; - } - - *cp += NGX_HTTP_CHARSET_VAR; - - return NGX_CONF_OK; - } - - mcf = ngx_http_conf_get_module_main_conf(cf, - ngx_http_charset_filter_module); - - *cp = ngx_http_add_charset(&mcf->charsets, &value[1]); - if (*cp == NGX_ERROR) { - return NGX_CONF_ERROR; - } - - return NGX_CONF_OK; -} - - -static ngx_int_t -ngx_http_add_charset(ngx_array_t *charsets, ngx_str_t *name) -{ - ngx_uint_t i; - ngx_http_charset_t *c; - - c = charsets->elts; - for (i = 0; i < charsets->nelts; i++) { - if (name->len != c[i].name.len) { - continue; - } - - if (ngx_strcasecmp(name->data, c[i].name.data) == 0) { - break; - } - } - - if (i < charsets->nelts) { - return i; - } - - c = ngx_array_push(charsets); - if (c == NULL) { - return NGX_ERROR; - } - - c->tables = NULL; - c->name = *name; - c->length = 0; - - if (ngx_strcasecmp(name->data, (u_char *) "utf-8") == 0) { - c->utf8 = 1; - - } else { - c->utf8 = 0; - } - - return i; -} - - -static void * -ngx_http_charset_create_main_conf(ngx_conf_t *cf) -{ - ngx_http_charset_main_conf_t *mcf; - - mcf = ngx_pcalloc(cf->pool, sizeof(ngx_http_charset_main_conf_t)); - if (mcf == NULL) { - return NULL; - } - - if (ngx_array_init(&mcf->charsets, cf->pool, 2, sizeof(ngx_http_charset_t)) - != NGX_OK) - { - return NULL; - } - - if (ngx_array_init(&mcf->tables, cf->pool, 1, - sizeof(ngx_http_charset_tables_t)) - != NGX_OK) - { - return NULL; - } - - if (ngx_array_init(&mcf->recodes, cf->pool, 2, - sizeof(ngx_http_charset_recode_t)) - != NGX_OK) - { - return NULL; - } - - return mcf; -} - - -static void * -ngx_http_charset_create_loc_conf(ngx_conf_t *cf) -{ - ngx_http_charset_loc_conf_t *lcf; - - lcf = ngx_pcalloc(cf->pool, sizeof(ngx_http_charset_loc_conf_t)); - if (lcf == NULL) { - return NULL; - } - - /* - * set by ngx_pcalloc(): - * - * lcf->types = { NULL }; - * lcf->types_keys = NULL; - */ - - lcf->charset = NGX_CONF_UNSET; - lcf->source_charset = NGX_CONF_UNSET; - lcf->override_charset = NGX_CONF_UNSET; - - return lcf; -} - - -static char * -ngx_http_charset_merge_loc_conf(ngx_conf_t *cf, void *parent, void *child) -{ - ngx_http_charset_loc_conf_t *prev = parent; - ngx_http_charset_loc_conf_t *conf = child; - - ngx_uint_t i; - ngx_http_charset_recode_t *recode; - ngx_http_charset_main_conf_t *mcf; - - if (ngx_http_merge_types(cf, &conf->types_keys, &conf->types, - &prev->types_keys, &prev->types, - ngx_http_charset_default_types) - != NGX_CONF_OK) - { - return NGX_CONF_ERROR; - } - - ngx_conf_merge_value(conf->override_charset, prev->override_charset, 0); - ngx_conf_merge_value(conf->charset, prev->charset, NGX_HTTP_CHARSET_OFF); - ngx_conf_merge_value(conf->source_charset, prev->source_charset, - NGX_HTTP_CHARSET_OFF); - - if (conf->charset == NGX_HTTP_CHARSET_OFF - || conf->source_charset == NGX_HTTP_CHARSET_OFF - || conf->charset == conf->source_charset) - { - return NGX_CONF_OK; - } - - if (conf->source_charset >= NGX_HTTP_CHARSET_VAR - || conf->charset >= NGX_HTTP_CHARSET_VAR) - { - return NGX_CONF_OK; - } - - mcf = ngx_http_conf_get_module_main_conf(cf, - ngx_http_charset_filter_module); - recode = mcf->recodes.elts; - for (i = 0; i < mcf->recodes.nelts; i++) { - if (conf->source_charset == recode[i].src - && conf->charset == recode[i].dst) - { - return NGX_CONF_OK; - } - } - - recode = ngx_array_push(&mcf->recodes); - if (recode == NULL) { - return NGX_CONF_ERROR; - } - - recode->src = conf->source_charset; - recode->dst = conf->charset; - - return NGX_CONF_OK; -} - - -static ngx_int_t -ngx_http_charset_postconfiguration(ngx_conf_t *cf) -{ - u_char **src, **dst; - ngx_int_t c; - ngx_uint_t i, t; - ngx_http_charset_t *charset; - ngx_http_charset_recode_t *recode; - ngx_http_charset_tables_t *tables; - ngx_http_charset_main_conf_t *mcf; - - mcf = ngx_http_conf_get_module_main_conf(cf, - ngx_http_charset_filter_module); - - recode = mcf->recodes.elts; - tables = mcf->tables.elts; - charset = mcf->charsets.elts; - - for (i = 0; i < mcf->recodes.nelts; i++) { - - c = recode[i].src; - - for (t = 0; t < mcf->tables.nelts; t++) { - - if (c == tables[t].src && recode[i].dst == tables[t].dst) { - goto next; - } - - if (c == tables[t].dst && recode[i].dst == tables[t].src) { - goto next; - } - } - - ngx_log_error(NGX_LOG_EMERG, cf->log, 0, - "no \"charset_map\" between the charsets \"%V\" and \"%V\"", - &charset[c].name, &charset[recode[i].dst].name); - return NGX_ERROR; - - next: - continue; - } - - - for (t = 0; t < mcf->tables.nelts; t++) { - - src = charset[tables[t].src].tables; - - if (src == NULL) { - src = ngx_pcalloc(cf->pool, sizeof(u_char *) * mcf->charsets.nelts); - if (src == NULL) { - return NGX_ERROR; - } - - charset[tables[t].src].tables = src; - } - - dst = charset[tables[t].dst].tables; - - if (dst == NULL) { - dst = ngx_pcalloc(cf->pool, sizeof(u_char *) * mcf->charsets.nelts); - if (dst == NULL) { - return NGX_ERROR; - } - - charset[tables[t].dst].tables = dst; - } - - src[tables[t].dst] = tables[t].src2dst; - dst[tables[t].src] = tables[t].dst2src; - } - - ngx_http_next_header_filter = ngx_http_top_header_filter; - ngx_http_top_header_filter = ngx_http_charset_header_filter; - - ngx_http_next_body_filter = ngx_http_top_body_filter; - ngx_http_top_body_filter = ngx_http_charset_body_filter; - - return NGX_OK; -} diff --git a/src/deps/src/nginx-1.30.3/src/http/modules/ngx_http_chunked_filter_module.c b/src/deps/src/nginx-1.30.3/src/http/modules/ngx_http_chunked_filter_module.c deleted file mode 100644 index ea5cbe6b34..0000000000 --- a/src/deps/src/nginx-1.30.3/src/http/modules/ngx_http_chunked_filter_module.c +++ /dev/null @@ -1,343 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#include -#include -#include - - -typedef struct { - ngx_chain_t *free; - ngx_chain_t *busy; -} ngx_http_chunked_filter_ctx_t; - - -static ngx_int_t ngx_http_chunked_filter_init(ngx_conf_t *cf); -static ngx_chain_t *ngx_http_chunked_create_trailers(ngx_http_request_t *r, - ngx_http_chunked_filter_ctx_t *ctx); - - -static ngx_http_module_t ngx_http_chunked_filter_module_ctx = { - NULL, /* preconfiguration */ - ngx_http_chunked_filter_init, /* postconfiguration */ - - NULL, /* create main configuration */ - NULL, /* init main configuration */ - - NULL, /* create server configuration */ - NULL, /* merge server configuration */ - - NULL, /* create location configuration */ - NULL /* merge location configuration */ -}; - - -ngx_module_t ngx_http_chunked_filter_module = { - NGX_MODULE_V1, - &ngx_http_chunked_filter_module_ctx, /* module context */ - NULL, /* module directives */ - NGX_HTTP_MODULE, /* module type */ - NULL, /* init master */ - NULL, /* init module */ - NULL, /* init process */ - NULL, /* init thread */ - NULL, /* exit thread */ - NULL, /* exit process */ - NULL, /* exit master */ - NGX_MODULE_V1_PADDING -}; - - -static ngx_http_output_header_filter_pt ngx_http_next_header_filter; -static ngx_http_output_body_filter_pt ngx_http_next_body_filter; - - -static ngx_int_t -ngx_http_chunked_header_filter(ngx_http_request_t *r) -{ - ngx_http_core_loc_conf_t *clcf; - ngx_http_chunked_filter_ctx_t *ctx; - - if (r->headers_out.status == NGX_HTTP_NOT_MODIFIED - || r->headers_out.status == NGX_HTTP_NO_CONTENT - || r->headers_out.status < NGX_HTTP_OK - || r != r->main - || r->method == NGX_HTTP_HEAD - || (r->method == NGX_HTTP_CONNECT - && r->headers_out.status < NGX_HTTP_SPECIAL_RESPONSE)) - { - return ngx_http_next_header_filter(r); - } - - if (r->headers_out.content_length_n == -1 - || r->expect_trailers) - { - clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module); - - if (r->http_version >= NGX_HTTP_VERSION_11 - && clcf->chunked_transfer_encoding) - { - if (r->expect_trailers) { - ngx_http_clear_content_length(r); - } - - r->chunked = 1; - - ctx = ngx_pcalloc(r->pool, sizeof(ngx_http_chunked_filter_ctx_t)); - if (ctx == NULL) { - return NGX_ERROR; - } - - ngx_http_set_ctx(r, ctx, ngx_http_chunked_filter_module); - - } else if (r->headers_out.content_length_n == -1) { - r->keepalive = 0; - } - } - - return ngx_http_next_header_filter(r); -} - - -static ngx_int_t -ngx_http_chunked_body_filter(ngx_http_request_t *r, ngx_chain_t *in) -{ - u_char *chunk; - off_t size; - ngx_int_t rc; - ngx_buf_t *b; - ngx_chain_t *out, *cl, *tl, **ll; - ngx_http_chunked_filter_ctx_t *ctx; - - if (in == NULL || !r->chunked || r->header_only) { - return ngx_http_next_body_filter(r, in); - } - - ctx = ngx_http_get_module_ctx(r, ngx_http_chunked_filter_module); - - out = NULL; - ll = &out; - - size = 0; - cl = in; - - for ( ;; ) { - ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "http chunk: %O", ngx_buf_size(cl->buf)); - - size += ngx_buf_size(cl->buf); - - if (cl->buf->flush - || cl->buf->sync - || ngx_buf_in_memory(cl->buf) - || cl->buf->in_file) - { - tl = ngx_alloc_chain_link(r->pool); - if (tl == NULL) { - return NGX_ERROR; - } - - tl->buf = cl->buf; - *ll = tl; - ll = &tl->next; - } - - if (cl->next == NULL) { - break; - } - - cl = cl->next; - } - - if (size) { - tl = ngx_chain_get_free_buf(r->pool, &ctx->free); - if (tl == NULL) { - return NGX_ERROR; - } - - b = tl->buf; - chunk = b->start; - - if (chunk == NULL) { - /* the "0000000000000000" is 64-bit hexadecimal string */ - - chunk = ngx_palloc(r->pool, sizeof("0000000000000000" CRLF) - 1); - if (chunk == NULL) { - return NGX_ERROR; - } - - b->start = chunk; - b->end = chunk + sizeof("0000000000000000" CRLF) - 1; - } - - b->tag = (ngx_buf_tag_t) &ngx_http_chunked_filter_module; - b->memory = 0; - b->temporary = 1; - b->pos = chunk; - b->last = ngx_sprintf(chunk, "%xO" CRLF, size); - - tl->next = out; - out = tl; - } - - if (cl->buf->last_buf) { - tl = ngx_http_chunked_create_trailers(r, ctx); - if (tl == NULL) { - return NGX_ERROR; - } - - cl->buf->last_buf = 0; - - *ll = tl; - - if (size == 0) { - tl->buf->pos += 2; - } - - } else if (size > 0) { - tl = ngx_chain_get_free_buf(r->pool, &ctx->free); - if (tl == NULL) { - return NGX_ERROR; - } - - b = tl->buf; - - b->tag = (ngx_buf_tag_t) &ngx_http_chunked_filter_module; - b->temporary = 0; - b->memory = 1; - b->pos = (u_char *) CRLF; - b->last = b->pos + 2; - - *ll = tl; - - } else { - *ll = NULL; - } - - rc = ngx_http_next_body_filter(r, out); - - ngx_chain_update_chains(r->pool, &ctx->free, &ctx->busy, &out, - (ngx_buf_tag_t) &ngx_http_chunked_filter_module); - - return rc; -} - - -static ngx_chain_t * -ngx_http_chunked_create_trailers(ngx_http_request_t *r, - ngx_http_chunked_filter_ctx_t *ctx) -{ - size_t len; - ngx_buf_t *b; - ngx_uint_t i; - ngx_chain_t *cl; - ngx_list_part_t *part; - ngx_table_elt_t *header; - - len = 0; - - part = &r->headers_out.trailers.part; - header = part->elts; - - for (i = 0; /* void */; i++) { - - if (i >= part->nelts) { - if (part->next == NULL) { - break; - } - - part = part->next; - header = part->elts; - i = 0; - } - - if (header[i].hash == 0) { - continue; - } - - len += header[i].key.len + sizeof(": ") - 1 - + header[i].value.len + sizeof(CRLF) - 1; - } - - cl = ngx_chain_get_free_buf(r->pool, &ctx->free); - if (cl == NULL) { - return NULL; - } - - b = cl->buf; - - b->tag = (ngx_buf_tag_t) &ngx_http_chunked_filter_module; - b->temporary = 0; - b->memory = 1; - b->last_buf = 1; - - if (len == 0) { - b->pos = (u_char *) CRLF "0" CRLF CRLF; - b->last = b->pos + sizeof(CRLF "0" CRLF CRLF) - 1; - return cl; - } - - len += sizeof(CRLF "0" CRLF CRLF) - 1; - - b->pos = ngx_palloc(r->pool, len); - if (b->pos == NULL) { - return NULL; - } - - b->last = b->pos; - - *b->last++ = CR; *b->last++ = LF; - *b->last++ = '0'; - *b->last++ = CR; *b->last++ = LF; - - part = &r->headers_out.trailers.part; - header = part->elts; - - for (i = 0; /* void */; i++) { - - if (i >= part->nelts) { - if (part->next == NULL) { - break; - } - - part = part->next; - header = part->elts; - i = 0; - } - - if (header[i].hash == 0) { - continue; - } - - ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "http trailer: \"%V: %V\"", - &header[i].key, &header[i].value); - - b->last = ngx_copy(b->last, header[i].key.data, header[i].key.len); - *b->last++ = ':'; *b->last++ = ' '; - - b->last = ngx_copy(b->last, header[i].value.data, header[i].value.len); - *b->last++ = CR; *b->last++ = LF; - } - - *b->last++ = CR; *b->last++ = LF; - - return cl; -} - - -static ngx_int_t -ngx_http_chunked_filter_init(ngx_conf_t *cf) -{ - ngx_http_next_header_filter = ngx_http_top_header_filter; - ngx_http_top_header_filter = ngx_http_chunked_header_filter; - - ngx_http_next_body_filter = ngx_http_top_body_filter; - ngx_http_top_body_filter = ngx_http_chunked_body_filter; - - return NGX_OK; -} diff --git a/src/deps/src/nginx-1.30.3/src/http/modules/ngx_http_dav_module.c b/src/deps/src/nginx-1.30.3/src/http/modules/ngx_http_dav_module.c deleted file mode 100644 index 4619b139a2..0000000000 --- a/src/deps/src/nginx-1.30.3/src/http/modules/ngx_http_dav_module.c +++ /dev/null @@ -1,1186 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#include -#include -#include - - -#define NGX_HTTP_DAV_OFF 2 - - -#define NGX_HTTP_DAV_NO_DEPTH -3 -#define NGX_HTTP_DAV_INVALID_DEPTH -2 -#define NGX_HTTP_DAV_INFINITY_DEPTH -1 - - -typedef struct { - ngx_uint_t methods; - ngx_uint_t access; - ngx_uint_t min_delete_depth; - ngx_flag_t create_full_put_path; -} ngx_http_dav_loc_conf_t; - - -typedef struct { - ngx_str_t path; - size_t len; -} ngx_http_dav_copy_ctx_t; - - -static ngx_int_t ngx_http_dav_handler(ngx_http_request_t *r); - -static void ngx_http_dav_put_handler(ngx_http_request_t *r); - -static ngx_int_t ngx_http_dav_delete_handler(ngx_http_request_t *r); -static ngx_int_t ngx_http_dav_delete_path(ngx_http_request_t *r, - ngx_str_t *path, ngx_uint_t dir); -static ngx_int_t ngx_http_dav_delete_dir(ngx_tree_ctx_t *ctx, ngx_str_t *path); -static ngx_int_t ngx_http_dav_delete_file(ngx_tree_ctx_t *ctx, ngx_str_t *path); -static ngx_int_t ngx_http_dav_noop(ngx_tree_ctx_t *ctx, ngx_str_t *path); - -static ngx_int_t ngx_http_dav_mkcol_handler(ngx_http_request_t *r, - ngx_http_dav_loc_conf_t *dlcf); - -static ngx_int_t ngx_http_dav_copy_move_handler(ngx_http_request_t *r); -static ngx_int_t ngx_http_dav_copy_dir(ngx_tree_ctx_t *ctx, ngx_str_t *path); -static ngx_int_t ngx_http_dav_copy_dir_time(ngx_tree_ctx_t *ctx, - ngx_str_t *path); -static ngx_int_t ngx_http_dav_copy_tree_file(ngx_tree_ctx_t *ctx, - ngx_str_t *path); - -static ngx_int_t ngx_http_dav_depth(ngx_http_request_t *r, ngx_int_t dflt); -static ngx_int_t ngx_http_dav_error(ngx_log_t *log, ngx_err_t err, - ngx_int_t not_found, char *failed, u_char *path); -static ngx_int_t ngx_http_dav_location(ngx_http_request_t *r); -static void *ngx_http_dav_create_loc_conf(ngx_conf_t *cf); -static char *ngx_http_dav_merge_loc_conf(ngx_conf_t *cf, - void *parent, void *child); -static ngx_int_t ngx_http_dav_init(ngx_conf_t *cf); - - -static ngx_conf_bitmask_t ngx_http_dav_methods_mask[] = { - { ngx_string("off"), NGX_HTTP_DAV_OFF }, - { ngx_string("put"), NGX_HTTP_PUT }, - { ngx_string("delete"), NGX_HTTP_DELETE }, - { ngx_string("mkcol"), NGX_HTTP_MKCOL }, - { ngx_string("copy"), NGX_HTTP_COPY }, - { ngx_string("move"), NGX_HTTP_MOVE }, - { ngx_null_string, 0 } -}; - - -static ngx_command_t ngx_http_dav_commands[] = { - - { ngx_string("dav_methods"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE, - ngx_conf_set_bitmask_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_dav_loc_conf_t, methods), - &ngx_http_dav_methods_mask }, - - { ngx_string("create_full_put_path"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG, - ngx_conf_set_flag_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_dav_loc_conf_t, create_full_put_path), - NULL }, - - { ngx_string("min_delete_depth"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1, - ngx_conf_set_num_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_dav_loc_conf_t, min_delete_depth), - NULL }, - - { ngx_string("dav_access"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE123, - ngx_conf_set_access_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_dav_loc_conf_t, access), - NULL }, - - ngx_null_command -}; - - -static ngx_http_module_t ngx_http_dav_module_ctx = { - NULL, /* preconfiguration */ - ngx_http_dav_init, /* postconfiguration */ - - NULL, /* create main configuration */ - NULL, /* init main configuration */ - - NULL, /* create server configuration */ - NULL, /* merge server configuration */ - - ngx_http_dav_create_loc_conf, /* create location configuration */ - ngx_http_dav_merge_loc_conf /* merge location configuration */ -}; - - -ngx_module_t ngx_http_dav_module = { - NGX_MODULE_V1, - &ngx_http_dav_module_ctx, /* module context */ - ngx_http_dav_commands, /* module directives */ - NGX_HTTP_MODULE, /* module type */ - NULL, /* init master */ - NULL, /* init module */ - NULL, /* init process */ - NULL, /* init thread */ - NULL, /* exit thread */ - NULL, /* exit process */ - NULL, /* exit master */ - NGX_MODULE_V1_PADDING -}; - - -static ngx_int_t -ngx_http_dav_handler(ngx_http_request_t *r) -{ - ngx_int_t rc; - ngx_http_dav_loc_conf_t *dlcf; - - dlcf = ngx_http_get_module_loc_conf(r, ngx_http_dav_module); - - if (!(r->method & dlcf->methods)) { - return NGX_DECLINED; - } - - switch (r->method) { - - case NGX_HTTP_PUT: - - if (r->uri.data[r->uri.len - 1] == '/') { - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "cannot PUT to a collection"); - return NGX_HTTP_CONFLICT; - } - - if (r->headers_in.content_range) { - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "PUT with range is unsupported"); - return NGX_HTTP_NOT_IMPLEMENTED; - } - - r->request_body_in_file_only = 1; - r->request_body_in_persistent_file = 1; - r->request_body_in_clean_file = 1; - r->request_body_file_group_access = 1; - r->request_body_file_log_level = 0; - - rc = ngx_http_read_client_request_body(r, ngx_http_dav_put_handler); - - if (rc >= NGX_HTTP_SPECIAL_RESPONSE) { - return rc; - } - - return NGX_DONE; - - case NGX_HTTP_DELETE: - - return ngx_http_dav_delete_handler(r); - - case NGX_HTTP_MKCOL: - - return ngx_http_dav_mkcol_handler(r, dlcf); - - case NGX_HTTP_COPY: - - return ngx_http_dav_copy_move_handler(r); - - case NGX_HTTP_MOVE: - - return ngx_http_dav_copy_move_handler(r); - } - - return NGX_DECLINED; -} - - -static void -ngx_http_dav_put_handler(ngx_http_request_t *r) -{ - size_t root; - time_t date; - ngx_str_t *temp, path; - ngx_uint_t status; - ngx_file_info_t fi; - ngx_ext_rename_file_t ext; - ngx_http_dav_loc_conf_t *dlcf; - - if (r->request_body == NULL) { - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "PUT request body is unavailable"); - ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR); - return; - } - - if (r->request_body->temp_file == NULL) { - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "PUT request body must be in a file"); - ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR); - return; - } - - if (ngx_http_map_uri_to_path(r, &path, &root, 0) == NULL) { - ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR); - return; - } - - path.len--; - - ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "http put filename: \"%s\"", path.data); - - temp = &r->request_body->temp_file->file.name; - - if (ngx_file_info(path.data, &fi) == NGX_FILE_ERROR) { - status = NGX_HTTP_CREATED; - - } else { - status = NGX_HTTP_NO_CONTENT; - - if (ngx_is_dir(&fi)) { - ngx_log_error(NGX_LOG_ERR, r->connection->log, NGX_EISDIR, - "\"%s\" could not be created", path.data); - - if (ngx_delete_file(temp->data) == NGX_FILE_ERROR) { - ngx_log_error(NGX_LOG_CRIT, r->connection->log, ngx_errno, - ngx_delete_file_n " \"%s\" failed", - temp->data); - } - - ngx_http_finalize_request(r, NGX_HTTP_CONFLICT); - return; - } - } - - dlcf = ngx_http_get_module_loc_conf(r, ngx_http_dav_module); - - ext.access = dlcf->access; - ext.path_access = dlcf->access; - ext.time = -1; - ext.create_path = dlcf->create_full_put_path; - ext.delete_file = 1; - ext.log = r->connection->log; - - if (r->headers_in.date) { - date = ngx_parse_http_time(r->headers_in.date->value.data, - r->headers_in.date->value.len); - - if (date != NGX_ERROR) { - ext.time = date; - ext.fd = r->request_body->temp_file->file.fd; - } - } - - if (ngx_ext_rename_file(temp, &path, &ext) != NGX_OK) { - ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR); - return; - } - - if (status == NGX_HTTP_CREATED) { - if (ngx_http_dav_location(r) != NGX_OK) { - ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR); - return; - } - - r->headers_out.content_length_n = 0; - } - - r->headers_out.status = status; - r->header_only = 1; - - ngx_http_finalize_request(r, ngx_http_send_header(r)); - return; -} - - -static ngx_int_t -ngx_http_dav_delete_handler(ngx_http_request_t *r) -{ - size_t root; - ngx_err_t err; - ngx_int_t rc, depth; - ngx_uint_t i, d, dir; - ngx_str_t path; - ngx_file_info_t fi; - ngx_http_dav_loc_conf_t *dlcf; - - if (r->headers_in.content_length_n > 0 || r->headers_in.chunked) { - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "DELETE with body is unsupported"); - return NGX_HTTP_UNSUPPORTED_MEDIA_TYPE; - } - - dlcf = ngx_http_get_module_loc_conf(r, ngx_http_dav_module); - - if (dlcf->min_delete_depth) { - d = 0; - - for (i = 0; i < r->uri.len; /* void */) { - if (r->uri.data[i++] == '/') { - if (++d >= dlcf->min_delete_depth && i < r->uri.len) { - goto ok; - } - } - } - - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "insufficient URI depth:%i to DELETE", d); - return NGX_HTTP_CONFLICT; - } - -ok: - - if (ngx_http_map_uri_to_path(r, &path, &root, 0) == NULL) { - return NGX_HTTP_INTERNAL_SERVER_ERROR; - } - - ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "http delete filename: \"%s\"", path.data); - - if (ngx_link_info(path.data, &fi) == NGX_FILE_ERROR) { - err = ngx_errno; - - rc = (err == NGX_ENOTDIR) ? NGX_HTTP_CONFLICT : NGX_HTTP_NOT_FOUND; - - return ngx_http_dav_error(r->connection->log, err, - rc, ngx_link_info_n, path.data); - } - - if (ngx_is_dir(&fi)) { - - if (r->uri.data[r->uri.len - 1] != '/') { - ngx_log_error(NGX_LOG_ERR, r->connection->log, NGX_EISDIR, - "DELETE \"%s\" failed", path.data); - return NGX_HTTP_CONFLICT; - } - - depth = ngx_http_dav_depth(r, NGX_HTTP_DAV_INFINITY_DEPTH); - - if (depth != NGX_HTTP_DAV_INFINITY_DEPTH) { - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "\"Depth\" header must be infinity"); - return NGX_HTTP_BAD_REQUEST; - } - - path.len -= 2; /* omit "/\0" */ - - dir = 1; - - } else { - - /* - * we do not need to test (r->uri.data[r->uri.len - 1] == '/') - * because ngx_link_info("/file/") returned NGX_ENOTDIR above - */ - - depth = ngx_http_dav_depth(r, 0); - - if (depth != 0 && depth != NGX_HTTP_DAV_INFINITY_DEPTH) { - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "\"Depth\" header must be 0 or infinity"); - return NGX_HTTP_BAD_REQUEST; - } - - dir = 0; - } - - rc = ngx_http_dav_delete_path(r, &path, dir); - - if (rc == NGX_OK) { - return NGX_HTTP_NO_CONTENT; - } - - return rc; -} - - -static ngx_int_t -ngx_http_dav_delete_path(ngx_http_request_t *r, ngx_str_t *path, ngx_uint_t dir) -{ - char *failed; - ngx_tree_ctx_t tree; - - if (dir) { - - tree.init_handler = NULL; - tree.file_handler = ngx_http_dav_delete_file; - tree.pre_tree_handler = ngx_http_dav_noop; - tree.post_tree_handler = ngx_http_dav_delete_dir; - tree.spec_handler = ngx_http_dav_delete_file; - tree.data = NULL; - tree.alloc = 0; - tree.log = r->connection->log; - - /* TODO: 207 */ - - if (ngx_walk_tree(&tree, path) != NGX_OK) { - return NGX_HTTP_INTERNAL_SERVER_ERROR; - } - - if (ngx_delete_dir(path->data) != NGX_FILE_ERROR) { - return NGX_OK; - } - - failed = ngx_delete_dir_n; - - } else { - - if (ngx_delete_file(path->data) != NGX_FILE_ERROR) { - return NGX_OK; - } - - failed = ngx_delete_file_n; - } - - return ngx_http_dav_error(r->connection->log, ngx_errno, - NGX_HTTP_NOT_FOUND, failed, path->data); -} - - -static ngx_int_t -ngx_http_dav_delete_dir(ngx_tree_ctx_t *ctx, ngx_str_t *path) -{ - ngx_log_debug1(NGX_LOG_DEBUG_HTTP, ctx->log, 0, - "http delete dir: \"%s\"", path->data); - - if (ngx_delete_dir(path->data) == NGX_FILE_ERROR) { - - /* TODO: add to 207 */ - - (void) ngx_http_dav_error(ctx->log, ngx_errno, 0, ngx_delete_dir_n, - path->data); - } - - return NGX_OK; -} - - -static ngx_int_t -ngx_http_dav_delete_file(ngx_tree_ctx_t *ctx, ngx_str_t *path) -{ - ngx_log_debug1(NGX_LOG_DEBUG_HTTP, ctx->log, 0, - "http delete file: \"%s\"", path->data); - - if (ngx_delete_file(path->data) == NGX_FILE_ERROR) { - - /* TODO: add to 207 */ - - (void) ngx_http_dav_error(ctx->log, ngx_errno, 0, ngx_delete_file_n, - path->data); - } - - return NGX_OK; -} - - -static ngx_int_t -ngx_http_dav_noop(ngx_tree_ctx_t *ctx, ngx_str_t *path) -{ - return NGX_OK; -} - - -static ngx_int_t -ngx_http_dav_mkcol_handler(ngx_http_request_t *r, ngx_http_dav_loc_conf_t *dlcf) -{ - u_char *p; - size_t root; - ngx_str_t path; - - if (r->headers_in.content_length_n > 0 || r->headers_in.chunked) { - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "MKCOL with body is unsupported"); - return NGX_HTTP_UNSUPPORTED_MEDIA_TYPE; - } - - if (r->uri.data[r->uri.len - 1] != '/') { - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "MKCOL can create a collection only"); - return NGX_HTTP_CONFLICT; - } - - p = ngx_http_map_uri_to_path(r, &path, &root, 0); - if (p == NULL) { - return NGX_HTTP_INTERNAL_SERVER_ERROR; - } - - *(p - 1) = '\0'; - - ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "http mkcol path: \"%s\"", path.data); - - if (ngx_create_dir(path.data, ngx_dir_access(dlcf->access)) - != NGX_FILE_ERROR) - { - if (ngx_http_dav_location(r) != NGX_OK) { - return NGX_HTTP_INTERNAL_SERVER_ERROR; - } - - return NGX_HTTP_CREATED; - } - - return ngx_http_dav_error(r->connection->log, ngx_errno, - NGX_HTTP_CONFLICT, ngx_create_dir_n, path.data); -} - - -static ngx_int_t -ngx_http_dav_copy_move_handler(ngx_http_request_t *r) -{ - u_char *p, *host, *last, ch; - size_t len, root; - ngx_err_t err; - ngx_int_t rc, depth; - ngx_uint_t overwrite, slash, dir, flags; - ngx_str_t path, uri, duri, args; - ngx_tree_ctx_t tree; - ngx_copy_file_t cf; - ngx_file_info_t fi; - ngx_table_elt_t *dest, *over; - ngx_ext_rename_file_t ext; - ngx_http_dav_copy_ctx_t copy; - ngx_http_dav_loc_conf_t *dlcf; - ngx_http_core_loc_conf_t *clcf; - - if (r->headers_in.content_length_n > 0 || r->headers_in.chunked) { - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "COPY and MOVE with body are unsupported"); - return NGX_HTTP_UNSUPPORTED_MEDIA_TYPE; - } - - dest = r->headers_in.destination; - - if (dest == NULL) { - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "client sent no \"Destination\" header"); - return NGX_HTTP_BAD_REQUEST; - } - - p = dest->value.data; - /* there is always '\0' even after empty header value */ - if (p[0] == '/') { - last = p + dest->value.len; - goto destination_done; - } - - len = r->headers_in.server.len; - - if (len == 0) { - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "client sent no \"Host\" header"); - return NGX_HTTP_BAD_REQUEST; - } - -#if (NGX_HTTP_SSL) - - if (r->connection->ssl) { - if (ngx_strncmp(dest->value.data, "https://", sizeof("https://") - 1) - != 0) - { - goto invalid_destination; - } - - host = dest->value.data + sizeof("https://") - 1; - - } else -#endif - { - if (ngx_strncmp(dest->value.data, "http://", sizeof("http://") - 1) - != 0) - { - goto invalid_destination; - } - - host = dest->value.data + sizeof("http://") - 1; - } - - if (ngx_strncmp(host, r->headers_in.server.data, len) != 0) { - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "\"Destination\" URI \"%V\" is handled by " - "different repository than the source URI", - &dest->value); - return NGX_HTTP_BAD_REQUEST; - } - - last = dest->value.data + dest->value.len; - - for (p = host + len; p < last; p++) { - if (*p == '/') { - goto destination_done; - } - } - -invalid_destination: - - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "client sent invalid \"Destination\" header: \"%V\"", - &dest->value); - return NGX_HTTP_BAD_REQUEST; - -destination_done: - - duri.len = last - p; - duri.data = p; - flags = NGX_HTTP_LOG_UNSAFE; - - if (ngx_http_parse_unsafe_uri(r, &duri, &args, &flags) != NGX_OK) { - goto invalid_destination; - } - - if ((r->uri.data[r->uri.len - 1] == '/' && *(last - 1) != '/') - || (r->uri.data[r->uri.len - 1] != '/' && *(last - 1) == '/')) - { - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "both URI \"%V\" and \"Destination\" URI \"%V\" " - "should be either collections or non-collections", - &r->uri, &dest->value); - return NGX_HTTP_CONFLICT; - } - - clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module); - - if (clcf->alias - && clcf->alias != NGX_MAX_SIZE_T_VALUE - && duri.len < clcf->alias) - { - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "client sent invalid \"Destination\" header: \"%V\"", - &dest->value); - return NGX_HTTP_BAD_REQUEST; - } - - depth = ngx_http_dav_depth(r, NGX_HTTP_DAV_INFINITY_DEPTH); - - if (depth != NGX_HTTP_DAV_INFINITY_DEPTH) { - - if (r->method == NGX_HTTP_COPY) { - if (depth != 0) { - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "\"Depth\" header must be 0 or infinity"); - return NGX_HTTP_BAD_REQUEST; - } - - } else { - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "\"Depth\" header must be infinity"); - return NGX_HTTP_BAD_REQUEST; - } - } - - over = r->headers_in.overwrite; - - if (over) { - if (over->value.len == 1) { - ch = over->value.data[0]; - - if (ch == 'T' || ch == 't') { - overwrite = 1; - goto overwrite_done; - } - - if (ch == 'F' || ch == 'f') { - overwrite = 0; - goto overwrite_done; - } - - } - - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "client sent invalid \"Overwrite\" header: \"%V\"", - &over->value); - return NGX_HTTP_BAD_REQUEST; - } - - overwrite = 1; - -overwrite_done: - - if (ngx_http_map_uri_to_path(r, &path, &root, 0) == NULL) { - return NGX_HTTP_INTERNAL_SERVER_ERROR; - } - - ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "http copy from: \"%s\"", path.data); - - uri = r->uri; - r->uri = duri; - - if (ngx_http_map_uri_to_path(r, ©.path, &root, 0) == NULL) { - return NGX_HTTP_INTERNAL_SERVER_ERROR; - } - - r->uri = uri; - - copy.path.len--; /* omit "\0" */ - - if (copy.path.data[copy.path.len - 1] == '/') { - slash = 1; - copy.path.len--; - copy.path.data[copy.path.len] = '\0'; - - } else { - slash = 0; - } - - ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "http copy to: \"%s\"", copy.path.data); - - if (ngx_link_info(copy.path.data, &fi) == NGX_FILE_ERROR) { - err = ngx_errno; - - if (err != NGX_ENOENT) { - return ngx_http_dav_error(r->connection->log, err, - NGX_HTTP_NOT_FOUND, ngx_link_info_n, - copy.path.data); - } - - /* destination does not exist */ - - overwrite = 0; - dir = 0; - - } else { - - /* destination exists */ - - if (ngx_is_dir(&fi) && !slash) { - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "\"%V\" could not be %Ved to collection \"%V\"", - &r->uri, &r->method_name, &dest->value); - return NGX_HTTP_CONFLICT; - } - - if (!overwrite) { - ngx_log_error(NGX_LOG_ERR, r->connection->log, NGX_EEXIST, - "\"%s\" could not be created", copy.path.data); - return NGX_HTTP_PRECONDITION_FAILED; - } - - dir = ngx_is_dir(&fi); - } - - if (ngx_link_info(path.data, &fi) == NGX_FILE_ERROR) { - return ngx_http_dav_error(r->connection->log, ngx_errno, - NGX_HTTP_NOT_FOUND, ngx_link_info_n, - path.data); - } - - if (ngx_is_dir(&fi)) { - - if (r->uri.data[r->uri.len - 1] != '/') { - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "\"%V\" is collection", &r->uri); - return NGX_HTTP_BAD_REQUEST; - } - - if (overwrite) { - ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "http delete: \"%s\"", copy.path.data); - - rc = ngx_http_dav_delete_path(r, ©.path, dir); - - if (rc != NGX_OK) { - return rc; - } - } - } - - if (ngx_is_dir(&fi)) { - - path.len -= 2; /* omit "/\0" */ - - if (r->method == NGX_HTTP_MOVE) { - if (ngx_rename_file(path.data, copy.path.data) != NGX_FILE_ERROR) { - return NGX_HTTP_CREATED; - } - } - - if (ngx_create_dir(copy.path.data, ngx_file_access(&fi)) - == NGX_FILE_ERROR) - { - return ngx_http_dav_error(r->connection->log, ngx_errno, - NGX_HTTP_NOT_FOUND, - ngx_create_dir_n, copy.path.data); - } - - copy.len = path.len; - - tree.init_handler = NULL; - tree.file_handler = ngx_http_dav_copy_tree_file; - tree.pre_tree_handler = ngx_http_dav_copy_dir; - tree.post_tree_handler = ngx_http_dav_copy_dir_time; - tree.spec_handler = ngx_http_dav_noop; - tree.data = © - tree.alloc = 0; - tree.log = r->connection->log; - - if (ngx_walk_tree(&tree, &path) == NGX_OK) { - - if (r->method == NGX_HTTP_MOVE) { - rc = ngx_http_dav_delete_path(r, &path, 1); - - if (rc != NGX_OK) { - return rc; - } - } - - return NGX_HTTP_CREATED; - } - - } else { - - if (r->method == NGX_HTTP_MOVE) { - - dlcf = ngx_http_get_module_loc_conf(r, ngx_http_dav_module); - - ext.access = 0; - ext.path_access = dlcf->access; - ext.time = -1; - ext.create_path = 1; - ext.delete_file = 0; - ext.log = r->connection->log; - - if (ngx_ext_rename_file(&path, ©.path, &ext) == NGX_OK) { - return NGX_HTTP_NO_CONTENT; - } - - return NGX_HTTP_INTERNAL_SERVER_ERROR; - } - - cf.size = ngx_file_size(&fi); - cf.buf_size = 0; - cf.access = ngx_file_access(&fi); - cf.time = ngx_file_mtime(&fi); - cf.log = r->connection->log; - - if (ngx_copy_file(path.data, copy.path.data, &cf) == NGX_OK) { - return NGX_HTTP_NO_CONTENT; - } - } - - return NGX_HTTP_INTERNAL_SERVER_ERROR; -} - - -static ngx_int_t -ngx_http_dav_copy_dir(ngx_tree_ctx_t *ctx, ngx_str_t *path) -{ - u_char *p, *dir; - size_t len; - ngx_http_dav_copy_ctx_t *copy; - - ngx_log_debug1(NGX_LOG_DEBUG_HTTP, ctx->log, 0, - "http copy dir: \"%s\"", path->data); - - copy = ctx->data; - - len = copy->path.len + path->len; - - dir = ngx_alloc(len + 1, ctx->log); - if (dir == NULL) { - return NGX_ABORT; - } - - p = ngx_cpymem(dir, copy->path.data, copy->path.len); - (void) ngx_cpystrn(p, path->data + copy->len, path->len - copy->len + 1); - - ngx_log_debug1(NGX_LOG_DEBUG_HTTP, ctx->log, 0, - "http copy dir to: \"%s\"", dir); - - if (ngx_create_dir(dir, ngx_dir_access(ctx->access)) == NGX_FILE_ERROR) { - (void) ngx_http_dav_error(ctx->log, ngx_errno, 0, ngx_create_dir_n, - dir); - } - - ngx_free(dir); - - return NGX_OK; -} - - -static ngx_int_t -ngx_http_dav_copy_dir_time(ngx_tree_ctx_t *ctx, ngx_str_t *path) -{ - u_char *p, *dir; - size_t len; - ngx_http_dav_copy_ctx_t *copy; - - ngx_log_debug1(NGX_LOG_DEBUG_HTTP, ctx->log, 0, - "http copy dir time: \"%s\"", path->data); - - copy = ctx->data; - - len = copy->path.len + path->len; - - dir = ngx_alloc(len + 1, ctx->log); - if (dir == NULL) { - return NGX_ABORT; - } - - p = ngx_cpymem(dir, copy->path.data, copy->path.len); - (void) ngx_cpystrn(p, path->data + copy->len, path->len - copy->len + 1); - - ngx_log_debug1(NGX_LOG_DEBUG_HTTP, ctx->log, 0, - "http copy dir time to: \"%s\"", dir); - -#if (NGX_WIN32) - { - ngx_fd_t fd; - - fd = ngx_open_file(dir, NGX_FILE_RDWR, NGX_FILE_OPEN, 0); - - if (fd == NGX_INVALID_FILE) { - (void) ngx_http_dav_error(ctx->log, ngx_errno, 0, ngx_open_file_n, dir); - goto failed; - } - - if (ngx_set_file_time(NULL, fd, ctx->mtime) != NGX_OK) { - ngx_log_error(NGX_LOG_ALERT, ctx->log, ngx_errno, - ngx_set_file_time_n " \"%s\" failed", dir); - } - - if (ngx_close_file(fd) == NGX_FILE_ERROR) { - ngx_log_error(NGX_LOG_ALERT, ctx->log, ngx_errno, - ngx_close_file_n " \"%s\" failed", dir); - } - } - -failed: - -#else - - if (ngx_set_file_time(dir, 0, ctx->mtime) != NGX_OK) { - ngx_log_error(NGX_LOG_ALERT, ctx->log, ngx_errno, - ngx_set_file_time_n " \"%s\" failed", dir); - } - -#endif - - ngx_free(dir); - - return NGX_OK; -} - - -static ngx_int_t -ngx_http_dav_copy_tree_file(ngx_tree_ctx_t *ctx, ngx_str_t *path) -{ - u_char *p, *file; - size_t len; - ngx_copy_file_t cf; - ngx_http_dav_copy_ctx_t *copy; - - ngx_log_debug1(NGX_LOG_DEBUG_HTTP, ctx->log, 0, - "http copy file: \"%s\"", path->data); - - copy = ctx->data; - - len = copy->path.len + path->len; - - file = ngx_alloc(len + 1, ctx->log); - if (file == NULL) { - return NGX_ABORT; - } - - p = ngx_cpymem(file, copy->path.data, copy->path.len); - (void) ngx_cpystrn(p, path->data + copy->len, path->len - copy->len + 1); - - ngx_log_debug1(NGX_LOG_DEBUG_HTTP, ctx->log, 0, - "http copy file to: \"%s\"", file); - - cf.size = ctx->size; - cf.buf_size = 0; - cf.access = ctx->access; - cf.time = ctx->mtime; - cf.log = ctx->log; - - (void) ngx_copy_file(path->data, file, &cf); - - ngx_free(file); - - return NGX_OK; -} - - -static ngx_int_t -ngx_http_dav_depth(ngx_http_request_t *r, ngx_int_t dflt) -{ - ngx_table_elt_t *depth; - - depth = r->headers_in.depth; - - if (depth == NULL) { - return dflt; - } - - if (depth->value.len == 1) { - - if (depth->value.data[0] == '0') { - return 0; - } - - if (depth->value.data[0] == '1') { - return 1; - } - - } else { - - if (depth->value.len == sizeof("infinity") - 1 - && ngx_strcmp(depth->value.data, "infinity") == 0) - { - return NGX_HTTP_DAV_INFINITY_DEPTH; - } - } - - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "client sent invalid \"Depth\" header: \"%V\"", - &depth->value); - - return NGX_HTTP_DAV_INVALID_DEPTH; -} - - -static ngx_int_t -ngx_http_dav_error(ngx_log_t *log, ngx_err_t err, ngx_int_t not_found, - char *failed, u_char *path) -{ - ngx_int_t rc; - ngx_uint_t level; - - if (err == NGX_ENOENT || err == NGX_ENOTDIR || err == NGX_ENAMETOOLONG) { - level = NGX_LOG_ERR; - rc = not_found; - - } else if (err == NGX_EACCES || err == NGX_EPERM) { - level = NGX_LOG_ERR; - rc = NGX_HTTP_FORBIDDEN; - - } else if (err == NGX_EEXIST) { - level = NGX_LOG_ERR; - rc = NGX_HTTP_NOT_ALLOWED; - - } else if (err == NGX_ENOSPC) { - level = NGX_LOG_CRIT; - rc = NGX_HTTP_INSUFFICIENT_STORAGE; - - } else { - level = NGX_LOG_CRIT; - rc = NGX_HTTP_INTERNAL_SERVER_ERROR; - } - - ngx_log_error(level, log, err, "%s \"%s\" failed", failed, path); - - return rc; -} - - -static ngx_int_t -ngx_http_dav_location(ngx_http_request_t *r) -{ - u_char *p; - size_t len; - uintptr_t escape; - - r->headers_out.location = ngx_list_push(&r->headers_out.headers); - if (r->headers_out.location == NULL) { - return NGX_ERROR; - } - - r->headers_out.location->hash = 1; - r->headers_out.location->next = NULL; - ngx_str_set(&r->headers_out.location->key, "Location"); - - escape = 2 * ngx_escape_uri(NULL, r->uri.data, r->uri.len, NGX_ESCAPE_URI); - - if (escape) { - len = r->uri.len + escape; - - p = ngx_pnalloc(r->pool, len); - if (p == NULL) { - ngx_http_clear_location(r); - return NGX_ERROR; - } - - r->headers_out.location->value.len = len; - r->headers_out.location->value.data = p; - - ngx_escape_uri(p, r->uri.data, r->uri.len, NGX_ESCAPE_URI); - - } else { - r->headers_out.location->value = r->uri; - } - - return NGX_OK; -} - - -static void * -ngx_http_dav_create_loc_conf(ngx_conf_t *cf) -{ - ngx_http_dav_loc_conf_t *conf; - - conf = ngx_pcalloc(cf->pool, sizeof(ngx_http_dav_loc_conf_t)); - if (conf == NULL) { - return NULL; - } - - /* - * set by ngx_pcalloc(): - * - * conf->methods = 0; - */ - - conf->min_delete_depth = NGX_CONF_UNSET_UINT; - conf->access = NGX_CONF_UNSET_UINT; - conf->create_full_put_path = NGX_CONF_UNSET; - - return conf; -} - - -static char * -ngx_http_dav_merge_loc_conf(ngx_conf_t *cf, void *parent, void *child) -{ - ngx_http_dav_loc_conf_t *prev = parent; - ngx_http_dav_loc_conf_t *conf = child; - - ngx_conf_merge_bitmask_value(conf->methods, prev->methods, - (NGX_CONF_BITMASK_SET|NGX_HTTP_DAV_OFF)); - - ngx_conf_merge_uint_value(conf->min_delete_depth, - prev->min_delete_depth, 0); - - ngx_conf_merge_uint_value(conf->access, prev->access, 0600); - - ngx_conf_merge_value(conf->create_full_put_path, - prev->create_full_put_path, 0); - - return NGX_CONF_OK; -} - - -static ngx_int_t -ngx_http_dav_init(ngx_conf_t *cf) -{ - ngx_http_handler_pt *h; - ngx_http_core_main_conf_t *cmcf; - - cmcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_core_module); - - h = ngx_array_push(&cmcf->phases[NGX_HTTP_CONTENT_PHASE].handlers); - if (h == NULL) { - return NGX_ERROR; - } - - *h = ngx_http_dav_handler; - - return NGX_OK; -} diff --git a/src/deps/src/nginx-1.30.3/src/http/modules/ngx_http_degradation_module.c b/src/deps/src/nginx-1.30.3/src/http/modules/ngx_http_degradation_module.c deleted file mode 100644 index b9c65cdc9e..0000000000 --- a/src/deps/src/nginx-1.30.3/src/http/modules/ngx_http_degradation_module.c +++ /dev/null @@ -1,243 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#include -#include -#include - - -typedef struct { - size_t sbrk_size; -} ngx_http_degradation_main_conf_t; - - -typedef struct { - ngx_uint_t degrade; -} ngx_http_degradation_loc_conf_t; - - -static ngx_conf_enum_t ngx_http_degrade[] = { - { ngx_string("204"), 204 }, - { ngx_string("444"), 444 }, - { ngx_null_string, 0 } -}; - - -static void *ngx_http_degradation_create_main_conf(ngx_conf_t *cf); -static void *ngx_http_degradation_create_loc_conf(ngx_conf_t *cf); -static char *ngx_http_degradation_merge_loc_conf(ngx_conf_t *cf, void *parent, - void *child); -static char *ngx_http_degradation(ngx_conf_t *cf, ngx_command_t *cmd, - void *conf); -static ngx_int_t ngx_http_degradation_init(ngx_conf_t *cf); - - -static ngx_command_t ngx_http_degradation_commands[] = { - - { ngx_string("degradation"), - NGX_HTTP_MAIN_CONF|NGX_CONF_TAKE1, - ngx_http_degradation, - NGX_HTTP_MAIN_CONF_OFFSET, - 0, - NULL }, - - { ngx_string("degrade"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1, - ngx_conf_set_enum_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_degradation_loc_conf_t, degrade), - &ngx_http_degrade }, - - ngx_null_command -}; - - -static ngx_http_module_t ngx_http_degradation_module_ctx = { - NULL, /* preconfiguration */ - ngx_http_degradation_init, /* postconfiguration */ - - ngx_http_degradation_create_main_conf, /* create main configuration */ - NULL, /* init main configuration */ - - NULL, /* create server configuration */ - NULL, /* merge server configuration */ - - ngx_http_degradation_create_loc_conf, /* create location configuration */ - ngx_http_degradation_merge_loc_conf /* merge location configuration */ -}; - - -ngx_module_t ngx_http_degradation_module = { - NGX_MODULE_V1, - &ngx_http_degradation_module_ctx, /* module context */ - ngx_http_degradation_commands, /* module directives */ - NGX_HTTP_MODULE, /* module type */ - NULL, /* init master */ - NULL, /* init module */ - NULL, /* init process */ - NULL, /* init thread */ - NULL, /* exit thread */ - NULL, /* exit process */ - NULL, /* exit master */ - NGX_MODULE_V1_PADDING -}; - - -static ngx_int_t -ngx_http_degradation_handler(ngx_http_request_t *r) -{ - ngx_http_degradation_loc_conf_t *dlcf; - - dlcf = ngx_http_get_module_loc_conf(r, ngx_http_degradation_module); - - if (dlcf->degrade && ngx_http_degraded(r)) { - return dlcf->degrade; - } - - return NGX_DECLINED; -} - - -ngx_uint_t -ngx_http_degraded(ngx_http_request_t *r) -{ - time_t now; - ngx_uint_t log; - static size_t sbrk_size; - static time_t sbrk_time; - ngx_http_degradation_main_conf_t *dmcf; - - dmcf = ngx_http_get_module_main_conf(r, ngx_http_degradation_module); - - if (dmcf->sbrk_size) { - - log = 0; - now = ngx_time(); - - /* lock mutex */ - - if (now != sbrk_time) { - - /* - * ELF/i386 is loaded at 0x08000000, 128M - * ELF/amd64 is loaded at 0x00400000, 4M - * - * use a function address to subtract the loading address - */ - - sbrk_size = (size_t) sbrk(0) - ((uintptr_t) ngx_palloc & ~0x3FFFFF); - sbrk_time = now; - log = 1; - } - - /* unlock mutex */ - - if (sbrk_size >= dmcf->sbrk_size) { - if (log) { - ngx_log_error(NGX_LOG_NOTICE, r->connection->log, 0, - "degradation sbrk:%uzM", - sbrk_size / (1024 * 1024)); - } - - return 1; - } - } - - return 0; -} - - -static void * -ngx_http_degradation_create_main_conf(ngx_conf_t *cf) -{ - ngx_http_degradation_main_conf_t *dmcf; - - dmcf = ngx_pcalloc(cf->pool, sizeof(ngx_http_degradation_main_conf_t)); - if (dmcf == NULL) { - return NULL; - } - - return dmcf; -} - - -static void * -ngx_http_degradation_create_loc_conf(ngx_conf_t *cf) -{ - ngx_http_degradation_loc_conf_t *conf; - - conf = ngx_palloc(cf->pool, sizeof(ngx_http_degradation_loc_conf_t)); - if (conf == NULL) { - return NULL; - } - - conf->degrade = NGX_CONF_UNSET_UINT; - - return conf; -} - - -static char * -ngx_http_degradation_merge_loc_conf(ngx_conf_t *cf, void *parent, void *child) -{ - ngx_http_degradation_loc_conf_t *prev = parent; - ngx_http_degradation_loc_conf_t *conf = child; - - ngx_conf_merge_uint_value(conf->degrade, prev->degrade, 0); - - return NGX_CONF_OK; -} - - -static char * -ngx_http_degradation(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) -{ - ngx_http_degradation_main_conf_t *dmcf = conf; - - ngx_str_t *value, s; - - value = cf->args->elts; - - if (ngx_strncmp(value[1].data, "sbrk=", 5) == 0) { - - s.len = value[1].len - 5; - s.data = value[1].data + 5; - - dmcf->sbrk_size = ngx_parse_size(&s); - if (dmcf->sbrk_size == (size_t) NGX_ERROR) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "invalid sbrk size \"%V\"", &value[1]); - return NGX_CONF_ERROR; - } - - return NGX_CONF_OK; - } - - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "invalid parameter \"%V\"", &value[1]); - - return NGX_CONF_ERROR; -} - - -static ngx_int_t -ngx_http_degradation_init(ngx_conf_t *cf) -{ - ngx_http_handler_pt *h; - ngx_http_core_main_conf_t *cmcf; - - cmcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_core_module); - - h = ngx_array_push(&cmcf->phases[NGX_HTTP_PREACCESS_PHASE].handlers); - if (h == NULL) { - return NGX_ERROR; - } - - *h = ngx_http_degradation_handler; - - return NGX_OK; -} diff --git a/src/deps/src/nginx-1.30.3/src/http/modules/ngx_http_empty_gif_module.c b/src/deps/src/nginx-1.30.3/src/http/modules/ngx_http_empty_gif_module.c deleted file mode 100644 index 04114dc3f4..0000000000 --- a/src/deps/src/nginx-1.30.3/src/http/modules/ngx_http_empty_gif_module.c +++ /dev/null @@ -1,140 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - -#include -#include -#include - - -static char *ngx_http_empty_gif(ngx_conf_t *cf, ngx_command_t *cmd, - void *conf); - -static ngx_command_t ngx_http_empty_gif_commands[] = { - - { ngx_string("empty_gif"), - NGX_HTTP_LOC_CONF|NGX_CONF_NOARGS, - ngx_http_empty_gif, - 0, - 0, - NULL }, - - ngx_null_command -}; - - -/* the minimal single pixel transparent GIF, 43 bytes */ - -static u_char ngx_empty_gif[] = { - - 'G', 'I', 'F', '8', '9', 'a', /* header */ - - /* logical screen descriptor */ - 0x01, 0x00, /* logical screen width */ - 0x01, 0x00, /* logical screen height */ - 0x80, /* global 1-bit color table */ - 0x01, /* background color #1 */ - 0x00, /* no aspect ratio */ - - /* global color table */ - 0x00, 0x00, 0x00, /* #0: black */ - 0xff, 0xff, 0xff, /* #1: white */ - - /* graphic control extension */ - 0x21, /* extension introducer */ - 0xf9, /* graphic control label */ - 0x04, /* block size */ - 0x01, /* transparent color is given, */ - /* no disposal specified, */ - /* user input is not expected */ - 0x00, 0x00, /* delay time */ - 0x01, /* transparent color #1 */ - 0x00, /* block terminator */ - - /* image descriptor */ - 0x2c, /* image separator */ - 0x00, 0x00, /* image left position */ - 0x00, 0x00, /* image top position */ - 0x01, 0x00, /* image width */ - 0x01, 0x00, /* image height */ - 0x00, /* no local color table, no interlaced */ - - /* table based image data */ - 0x02, /* LZW minimum code size, */ - /* must be at least 2-bit */ - 0x02, /* block size */ - 0x4c, 0x01, /* compressed bytes 01_001_100, 0000000_1 */ - /* 100: clear code */ - /* 001: 1 */ - /* 101: end of information code */ - 0x00, /* block terminator */ - - 0x3B /* trailer */ -}; - - -static ngx_http_module_t ngx_http_empty_gif_module_ctx = { - NULL, /* preconfiguration */ - NULL, /* postconfiguration */ - - NULL, /* create main configuration */ - NULL, /* init main configuration */ - - NULL, /* create server configuration */ - NULL, /* merge server configuration */ - - NULL, /* create location configuration */ - NULL /* merge location configuration */ -}; - - -ngx_module_t ngx_http_empty_gif_module = { - NGX_MODULE_V1, - &ngx_http_empty_gif_module_ctx, /* module context */ - ngx_http_empty_gif_commands, /* module directives */ - NGX_HTTP_MODULE, /* module type */ - NULL, /* init master */ - NULL, /* init module */ - NULL, /* init process */ - NULL, /* init thread */ - NULL, /* exit thread */ - NULL, /* exit process */ - NULL, /* exit master */ - NGX_MODULE_V1_PADDING -}; - - -static ngx_str_t ngx_http_gif_type = ngx_string("image/gif"); - - -static ngx_int_t -ngx_http_empty_gif_handler(ngx_http_request_t *r) -{ - ngx_http_complex_value_t cv; - - if (!(r->method & (NGX_HTTP_GET|NGX_HTTP_HEAD))) { - return NGX_HTTP_NOT_ALLOWED; - } - - ngx_memzero(&cv, sizeof(ngx_http_complex_value_t)); - - cv.value.len = sizeof(ngx_empty_gif); - cv.value.data = ngx_empty_gif; - r->headers_out.last_modified_time = 23349600; - - return ngx_http_send_response(r, NGX_HTTP_OK, &ngx_http_gif_type, &cv); -} - - -static char * -ngx_http_empty_gif(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) -{ - ngx_http_core_loc_conf_t *clcf; - - clcf = ngx_http_conf_get_module_loc_conf(cf, ngx_http_core_module); - clcf->handler = ngx_http_empty_gif_handler; - - return NGX_CONF_OK; -} diff --git a/src/deps/src/nginx-1.30.3/src/http/modules/ngx_http_fastcgi_module.c b/src/deps/src/nginx-1.30.3/src/http/modules/ngx_http_fastcgi_module.c deleted file mode 100644 index f7f0696a8f..0000000000 --- a/src/deps/src/nginx-1.30.3/src/http/modules/ngx_http_fastcgi_module.c +++ /dev/null @@ -1,3949 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#include -#include -#include - - -typedef struct { - ngx_array_t caches; /* ngx_http_file_cache_t * */ -} ngx_http_fastcgi_main_conf_t; - - -typedef struct { - ngx_array_t *flushes; - ngx_array_t *lengths; - ngx_array_t *values; - ngx_uint_t number; - ngx_hash_t hash; -} ngx_http_fastcgi_params_t; - - -typedef struct { - ngx_http_upstream_conf_t upstream; - - ngx_str_t index; - - ngx_http_fastcgi_params_t params; -#if (NGX_HTTP_CACHE) - ngx_http_fastcgi_params_t params_cache; -#endif - - ngx_array_t *params_source; - ngx_array_t *catch_stderr; - - ngx_array_t *fastcgi_lengths; - ngx_array_t *fastcgi_values; - - ngx_flag_t keep_conn; - -#if (NGX_HTTP_CACHE) - ngx_http_complex_value_t cache_key; -#endif - -#if (NGX_PCRE) - ngx_regex_t *split_regex; - ngx_str_t split_name; -#endif -} ngx_http_fastcgi_loc_conf_t; - - -typedef enum { - ngx_http_fastcgi_st_version = 0, - ngx_http_fastcgi_st_type, - ngx_http_fastcgi_st_request_id_hi, - ngx_http_fastcgi_st_request_id_lo, - ngx_http_fastcgi_st_content_length_hi, - ngx_http_fastcgi_st_content_length_lo, - ngx_http_fastcgi_st_padding_length, - ngx_http_fastcgi_st_reserved, - ngx_http_fastcgi_st_data, - ngx_http_fastcgi_st_padding -} ngx_http_fastcgi_state_e; - - -typedef struct { - u_char *start; - u_char *end; -} ngx_http_fastcgi_split_part_t; - - -typedef struct { - ngx_http_fastcgi_state_e state; - u_char *pos; - u_char *last; - ngx_uint_t type; - size_t length; - size_t padding; - - off_t rest; - - ngx_chain_t *free; - ngx_chain_t *busy; - - unsigned fastcgi_stdout:1; - unsigned large_stderr:1; - unsigned header_sent:1; - unsigned closed:1; - - ngx_array_t *split_parts; - - ngx_str_t script_name; - ngx_str_t path_info; -} ngx_http_fastcgi_ctx_t; - - -#define NGX_HTTP_FASTCGI_RESPONDER 1 - -#define NGX_HTTP_FASTCGI_KEEP_CONN 1 - -#define NGX_HTTP_FASTCGI_BEGIN_REQUEST 1 -#define NGX_HTTP_FASTCGI_ABORT_REQUEST 2 -#define NGX_HTTP_FASTCGI_END_REQUEST 3 -#define NGX_HTTP_FASTCGI_PARAMS 4 -#define NGX_HTTP_FASTCGI_STDIN 5 -#define NGX_HTTP_FASTCGI_STDOUT 6 -#define NGX_HTTP_FASTCGI_STDERR 7 -#define NGX_HTTP_FASTCGI_DATA 8 - - -typedef struct { - u_char version; - u_char type; - u_char request_id_hi; - u_char request_id_lo; - u_char content_length_hi; - u_char content_length_lo; - u_char padding_length; - u_char reserved; -} ngx_http_fastcgi_header_t; - - -typedef struct { - u_char role_hi; - u_char role_lo; - u_char flags; - u_char reserved[5]; -} ngx_http_fastcgi_begin_request_t; - - -typedef struct { - u_char version; - u_char type; - u_char request_id_hi; - u_char request_id_lo; -} ngx_http_fastcgi_header_small_t; - - -typedef struct { - ngx_http_fastcgi_header_t h0; - ngx_http_fastcgi_begin_request_t br; - ngx_http_fastcgi_header_small_t h1; -} ngx_http_fastcgi_request_start_t; - - -static ngx_int_t ngx_http_fastcgi_eval(ngx_http_request_t *r, - ngx_http_fastcgi_loc_conf_t *flcf); -#if (NGX_HTTP_CACHE) -static ngx_int_t ngx_http_fastcgi_create_key(ngx_http_request_t *r); -#endif -static ngx_int_t ngx_http_fastcgi_create_request(ngx_http_request_t *r); -static ngx_int_t ngx_http_fastcgi_reinit_request(ngx_http_request_t *r); -static ngx_int_t ngx_http_fastcgi_body_output_filter(void *data, - ngx_chain_t *in); -static ngx_int_t ngx_http_fastcgi_process_header(ngx_http_request_t *r); -static ngx_int_t ngx_http_fastcgi_input_filter_init(void *data); -static ngx_int_t ngx_http_fastcgi_input_filter(ngx_event_pipe_t *p, - ngx_buf_t *buf); -static ngx_int_t ngx_http_fastcgi_non_buffered_filter(void *data, - ssize_t bytes); -static ngx_int_t ngx_http_fastcgi_process_record(ngx_http_request_t *r, - ngx_http_fastcgi_ctx_t *f); -static void ngx_http_fastcgi_abort_request(ngx_http_request_t *r); -static void ngx_http_fastcgi_finalize_request(ngx_http_request_t *r, - ngx_int_t rc); - -static ngx_int_t ngx_http_fastcgi_add_variables(ngx_conf_t *cf); -static void *ngx_http_fastcgi_create_main_conf(ngx_conf_t *cf); -static void *ngx_http_fastcgi_create_loc_conf(ngx_conf_t *cf); -static char *ngx_http_fastcgi_merge_loc_conf(ngx_conf_t *cf, - void *parent, void *child); -static ngx_int_t ngx_http_fastcgi_init_params(ngx_conf_t *cf, - ngx_http_fastcgi_loc_conf_t *conf, ngx_http_fastcgi_params_t *params, - ngx_keyval_t *default_params); - -static ngx_int_t ngx_http_fastcgi_script_name_variable(ngx_http_request_t *r, - ngx_http_variable_value_t *v, uintptr_t data); -static ngx_int_t ngx_http_fastcgi_path_info_variable(ngx_http_request_t *r, - ngx_http_variable_value_t *v, uintptr_t data); -static ngx_http_fastcgi_ctx_t *ngx_http_fastcgi_split(ngx_http_request_t *r, - ngx_http_fastcgi_loc_conf_t *flcf); - -static char *ngx_http_fastcgi_pass(ngx_conf_t *cf, ngx_command_t *cmd, - void *conf); -static char *ngx_http_fastcgi_split_path_info(ngx_conf_t *cf, - ngx_command_t *cmd, void *conf); -static char *ngx_http_fastcgi_store(ngx_conf_t *cf, ngx_command_t *cmd, - void *conf); -#if (NGX_HTTP_CACHE) -static char *ngx_http_fastcgi_cache(ngx_conf_t *cf, ngx_command_t *cmd, - void *conf); -static char *ngx_http_fastcgi_cache_key(ngx_conf_t *cf, ngx_command_t *cmd, - void *conf); -#endif - -static char *ngx_http_fastcgi_lowat_check(ngx_conf_t *cf, void *post, - void *data); - - -static ngx_conf_post_t ngx_http_fastcgi_lowat_post = - { ngx_http_fastcgi_lowat_check }; - - -static ngx_conf_bitmask_t ngx_http_fastcgi_next_upstream_masks[] = { - { ngx_string("error"), NGX_HTTP_UPSTREAM_FT_ERROR }, - { ngx_string("timeout"), NGX_HTTP_UPSTREAM_FT_TIMEOUT }, - { ngx_string("invalid_header"), NGX_HTTP_UPSTREAM_FT_INVALID_HEADER }, - { ngx_string("non_idempotent"), NGX_HTTP_UPSTREAM_FT_NON_IDEMPOTENT }, - { ngx_string("http_500"), NGX_HTTP_UPSTREAM_FT_HTTP_500 }, - { ngx_string("http_503"), NGX_HTTP_UPSTREAM_FT_HTTP_503 }, - { ngx_string("http_403"), NGX_HTTP_UPSTREAM_FT_HTTP_403 }, - { ngx_string("http_404"), NGX_HTTP_UPSTREAM_FT_HTTP_404 }, - { ngx_string("http_429"), NGX_HTTP_UPSTREAM_FT_HTTP_429 }, - { ngx_string("updating"), NGX_HTTP_UPSTREAM_FT_UPDATING }, - { ngx_string("off"), NGX_HTTP_UPSTREAM_FT_OFF }, - { ngx_null_string, 0 } -}; - - -ngx_module_t ngx_http_fastcgi_module; - - -static ngx_command_t ngx_http_fastcgi_commands[] = { - - { ngx_string("fastcgi_pass"), - NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF|NGX_CONF_TAKE1, - ngx_http_fastcgi_pass, - NGX_HTTP_LOC_CONF_OFFSET, - 0, - NULL }, - - { ngx_string("fastcgi_index"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1, - ngx_conf_set_str_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_fastcgi_loc_conf_t, index), - NULL }, - - { ngx_string("fastcgi_split_path_info"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1, - ngx_http_fastcgi_split_path_info, - NGX_HTTP_LOC_CONF_OFFSET, - 0, - NULL }, - - { ngx_string("fastcgi_store"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1, - ngx_http_fastcgi_store, - NGX_HTTP_LOC_CONF_OFFSET, - 0, - NULL }, - - { ngx_string("fastcgi_store_access"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE123, - ngx_conf_set_access_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_fastcgi_loc_conf_t, upstream.store_access), - NULL }, - - { ngx_string("fastcgi_buffering"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG, - ngx_conf_set_flag_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_fastcgi_loc_conf_t, upstream.buffering), - NULL }, - - { ngx_string("fastcgi_request_buffering"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG, - ngx_conf_set_flag_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_fastcgi_loc_conf_t, upstream.request_buffering), - NULL }, - - { ngx_string("fastcgi_ignore_client_abort"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG, - ngx_conf_set_flag_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_fastcgi_loc_conf_t, upstream.ignore_client_abort), - NULL }, - - { ngx_string("fastcgi_bind"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE12, - ngx_http_upstream_bind_set_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_fastcgi_loc_conf_t, upstream.local), - NULL }, - - { ngx_string("fastcgi_socket_keepalive"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG, - ngx_conf_set_flag_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_fastcgi_loc_conf_t, upstream.socket_keepalive), - NULL }, - - { ngx_string("fastcgi_connect_timeout"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1, - ngx_conf_set_msec_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_fastcgi_loc_conf_t, upstream.connect_timeout), - NULL }, - - { ngx_string("fastcgi_send_timeout"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1, - ngx_conf_set_msec_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_fastcgi_loc_conf_t, upstream.send_timeout), - NULL }, - - { ngx_string("fastcgi_send_lowat"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1, - ngx_conf_set_size_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_fastcgi_loc_conf_t, upstream.send_lowat), - &ngx_http_fastcgi_lowat_post }, - - { ngx_string("fastcgi_buffer_size"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1, - ngx_conf_set_size_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_fastcgi_loc_conf_t, upstream.buffer_size), - NULL }, - - { ngx_string("fastcgi_pass_request_headers"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG, - ngx_conf_set_flag_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_fastcgi_loc_conf_t, upstream.pass_request_headers), - NULL }, - - { ngx_string("fastcgi_pass_request_body"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG, - ngx_conf_set_flag_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_fastcgi_loc_conf_t, upstream.pass_request_body), - NULL }, - - { ngx_string("fastcgi_intercept_errors"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG, - ngx_conf_set_flag_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_fastcgi_loc_conf_t, upstream.intercept_errors), - NULL }, - - { ngx_string("fastcgi_read_timeout"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1, - ngx_conf_set_msec_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_fastcgi_loc_conf_t, upstream.read_timeout), - NULL }, - - { ngx_string("fastcgi_buffers"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE2, - ngx_conf_set_bufs_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_fastcgi_loc_conf_t, upstream.bufs), - NULL }, - - { ngx_string("fastcgi_busy_buffers_size"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1, - ngx_conf_set_size_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_fastcgi_loc_conf_t, upstream.busy_buffers_size_conf), - NULL }, - - { ngx_string("fastcgi_force_ranges"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG, - ngx_conf_set_flag_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_fastcgi_loc_conf_t, upstream.force_ranges), - NULL }, - - { ngx_string("fastcgi_limit_rate"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1, - ngx_http_set_complex_value_size_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_fastcgi_loc_conf_t, upstream.limit_rate), - NULL }, - -#if (NGX_HTTP_CACHE) - - { ngx_string("fastcgi_cache"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1, - ngx_http_fastcgi_cache, - NGX_HTTP_LOC_CONF_OFFSET, - 0, - NULL }, - - { ngx_string("fastcgi_cache_key"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1, - ngx_http_fastcgi_cache_key, - NGX_HTTP_LOC_CONF_OFFSET, - 0, - NULL }, - - { ngx_string("fastcgi_cache_path"), - NGX_HTTP_MAIN_CONF|NGX_CONF_2MORE, - ngx_http_file_cache_set_slot, - NGX_HTTP_MAIN_CONF_OFFSET, - offsetof(ngx_http_fastcgi_main_conf_t, caches), - &ngx_http_fastcgi_module }, - - { ngx_string("fastcgi_cache_bypass"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE, - ngx_http_set_predicate_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_fastcgi_loc_conf_t, upstream.cache_bypass), - NULL }, - - { ngx_string("fastcgi_no_cache"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE, - ngx_http_set_predicate_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_fastcgi_loc_conf_t, upstream.no_cache), - NULL }, - - { ngx_string("fastcgi_cache_valid"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE, - ngx_http_file_cache_valid_set_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_fastcgi_loc_conf_t, upstream.cache_valid), - NULL }, - - { ngx_string("fastcgi_cache_min_uses"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1, - ngx_conf_set_num_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_fastcgi_loc_conf_t, upstream.cache_min_uses), - NULL }, - - { ngx_string("fastcgi_cache_max_range_offset"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1, - ngx_conf_set_off_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_fastcgi_loc_conf_t, upstream.cache_max_range_offset), - NULL }, - - { ngx_string("fastcgi_cache_use_stale"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE, - ngx_conf_set_bitmask_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_fastcgi_loc_conf_t, upstream.cache_use_stale), - &ngx_http_fastcgi_next_upstream_masks }, - - { ngx_string("fastcgi_cache_methods"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE, - ngx_conf_set_bitmask_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_fastcgi_loc_conf_t, upstream.cache_methods), - &ngx_http_upstream_cache_method_mask }, - - { ngx_string("fastcgi_cache_lock"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG, - ngx_conf_set_flag_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_fastcgi_loc_conf_t, upstream.cache_lock), - NULL }, - - { ngx_string("fastcgi_cache_lock_timeout"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1, - ngx_conf_set_msec_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_fastcgi_loc_conf_t, upstream.cache_lock_timeout), - NULL }, - - { ngx_string("fastcgi_cache_lock_age"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1, - ngx_conf_set_msec_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_fastcgi_loc_conf_t, upstream.cache_lock_age), - NULL }, - - { ngx_string("fastcgi_cache_revalidate"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG, - ngx_conf_set_flag_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_fastcgi_loc_conf_t, upstream.cache_revalidate), - NULL }, - - { ngx_string("fastcgi_cache_background_update"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG, - ngx_conf_set_flag_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_fastcgi_loc_conf_t, upstream.cache_background_update), - NULL }, - -#endif - - { ngx_string("fastcgi_temp_path"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1234, - ngx_conf_set_path_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_fastcgi_loc_conf_t, upstream.temp_path), - NULL }, - - { ngx_string("fastcgi_max_temp_file_size"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1, - ngx_conf_set_size_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_fastcgi_loc_conf_t, upstream.max_temp_file_size_conf), - NULL }, - - { ngx_string("fastcgi_temp_file_write_size"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1, - ngx_conf_set_size_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_fastcgi_loc_conf_t, upstream.temp_file_write_size_conf), - NULL }, - - { ngx_string("fastcgi_next_upstream"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE, - ngx_conf_set_bitmask_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_fastcgi_loc_conf_t, upstream.next_upstream), - &ngx_http_fastcgi_next_upstream_masks }, - - { ngx_string("fastcgi_next_upstream_tries"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1, - ngx_conf_set_num_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_fastcgi_loc_conf_t, upstream.next_upstream_tries), - NULL }, - - { ngx_string("fastcgi_next_upstream_timeout"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1, - ngx_conf_set_msec_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_fastcgi_loc_conf_t, upstream.next_upstream_timeout), - NULL }, - - { ngx_string("fastcgi_param"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE23, - ngx_http_upstream_param_set_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_fastcgi_loc_conf_t, params_source), - NULL }, - - { ngx_string("fastcgi_pass_header"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1, - ngx_conf_set_str_array_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_fastcgi_loc_conf_t, upstream.pass_headers), - NULL }, - - { ngx_string("fastcgi_hide_header"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1, - ngx_conf_set_str_array_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_fastcgi_loc_conf_t, upstream.hide_headers), - NULL }, - - { ngx_string("fastcgi_ignore_headers"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE, - ngx_conf_set_bitmask_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_fastcgi_loc_conf_t, upstream.ignore_headers), - &ngx_http_upstream_ignore_headers_masks }, - - { ngx_string("fastcgi_catch_stderr"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1, - ngx_conf_set_str_array_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_fastcgi_loc_conf_t, catch_stderr), - NULL }, - - { ngx_string("fastcgi_keep_conn"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG, - ngx_conf_set_flag_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_fastcgi_loc_conf_t, keep_conn), - NULL }, - - ngx_null_command -}; - - -static ngx_http_module_t ngx_http_fastcgi_module_ctx = { - ngx_http_fastcgi_add_variables, /* preconfiguration */ - NULL, /* postconfiguration */ - - ngx_http_fastcgi_create_main_conf, /* create main configuration */ - NULL, /* init main configuration */ - - NULL, /* create server configuration */ - NULL, /* merge server configuration */ - - ngx_http_fastcgi_create_loc_conf, /* create location configuration */ - ngx_http_fastcgi_merge_loc_conf /* merge location configuration */ -}; - - -ngx_module_t ngx_http_fastcgi_module = { - NGX_MODULE_V1, - &ngx_http_fastcgi_module_ctx, /* module context */ - ngx_http_fastcgi_commands, /* module directives */ - NGX_HTTP_MODULE, /* module type */ - NULL, /* init master */ - NULL, /* init module */ - NULL, /* init process */ - NULL, /* init thread */ - NULL, /* exit thread */ - NULL, /* exit process */ - NULL, /* exit master */ - NGX_MODULE_V1_PADDING -}; - - -static ngx_http_fastcgi_request_start_t ngx_http_fastcgi_request_start = { - { 1, /* version */ - NGX_HTTP_FASTCGI_BEGIN_REQUEST, /* type */ - 0, /* request_id_hi */ - 1, /* request_id_lo */ - 0, /* content_length_hi */ - sizeof(ngx_http_fastcgi_begin_request_t), /* content_length_lo */ - 0, /* padding_length */ - 0 }, /* reserved */ - - { 0, /* role_hi */ - NGX_HTTP_FASTCGI_RESPONDER, /* role_lo */ - 0, /* NGX_HTTP_FASTCGI_KEEP_CONN */ /* flags */ - { 0, 0, 0, 0, 0 } }, /* reserved[5] */ - - { 1, /* version */ - NGX_HTTP_FASTCGI_PARAMS, /* type */ - 0, /* request_id_hi */ - 1 }, /* request_id_lo */ - -}; - - -static ngx_http_variable_t ngx_http_fastcgi_vars[] = { - - { ngx_string("fastcgi_script_name"), NULL, - ngx_http_fastcgi_script_name_variable, 0, - NGX_HTTP_VAR_NOCACHEABLE|NGX_HTTP_VAR_NOHASH, 0 }, - - { ngx_string("fastcgi_path_info"), NULL, - ngx_http_fastcgi_path_info_variable, 0, - NGX_HTTP_VAR_NOCACHEABLE|NGX_HTTP_VAR_NOHASH, 0 }, - - ngx_http_null_variable -}; - - -static ngx_str_t ngx_http_fastcgi_hide_headers[] = { - ngx_string("Status"), - ngx_string("X-Accel-Expires"), - ngx_string("X-Accel-Redirect"), - ngx_string("X-Accel-Limit-Rate"), - ngx_string("X-Accel-Buffering"), - ngx_string("X-Accel-Charset"), - ngx_null_string -}; - - -static ngx_keyval_t ngx_http_fastcgi_headers[] = { - { ngx_string("HTTP_HOST"), - ngx_string("$host$is_request_port$request_port") }, - { ngx_null_string, ngx_null_string } -}; - - -#if (NGX_HTTP_CACHE) - -static ngx_keyval_t ngx_http_fastcgi_cache_headers[] = { - { ngx_string("HTTP_HOST"), - ngx_string("$host$is_request_port$request_port") }, - { ngx_string("HTTP_IF_MODIFIED_SINCE"), - ngx_string("$upstream_cache_last_modified") }, - { ngx_string("HTTP_IF_UNMODIFIED_SINCE"), ngx_string("") }, - { ngx_string("HTTP_IF_NONE_MATCH"), ngx_string("$upstream_cache_etag") }, - { ngx_string("HTTP_IF_MATCH"), ngx_string("") }, - { ngx_string("HTTP_RANGE"), ngx_string("") }, - { ngx_string("HTTP_IF_RANGE"), ngx_string("") }, - { ngx_null_string, ngx_null_string } -}; - -#endif - - -static ngx_path_init_t ngx_http_fastcgi_temp_path = { - ngx_string(NGX_HTTP_FASTCGI_TEMP_PATH), { 1, 2, 0 } -}; - - -static ngx_int_t -ngx_http_fastcgi_handler(ngx_http_request_t *r) -{ - ngx_int_t rc; - ngx_http_upstream_t *u; - ngx_http_fastcgi_ctx_t *f; - ngx_http_fastcgi_loc_conf_t *flcf; -#if (NGX_HTTP_CACHE) - ngx_http_fastcgi_main_conf_t *fmcf; -#endif - - if (ngx_http_upstream_create(r) != NGX_OK) { - return NGX_HTTP_INTERNAL_SERVER_ERROR; - } - - f = ngx_pcalloc(r->pool, sizeof(ngx_http_fastcgi_ctx_t)); - if (f == NULL) { - return NGX_HTTP_INTERNAL_SERVER_ERROR; - } - - ngx_http_set_ctx(r, f, ngx_http_fastcgi_module); - - flcf = ngx_http_get_module_loc_conf(r, ngx_http_fastcgi_module); - - if (flcf->fastcgi_lengths) { - if (ngx_http_fastcgi_eval(r, flcf) != NGX_OK) { - return NGX_HTTP_INTERNAL_SERVER_ERROR; - } - } - - u = r->upstream; - - ngx_str_set(&u->schema, "fastcgi://"); - u->output.tag = (ngx_buf_tag_t) &ngx_http_fastcgi_module; - - u->conf = &flcf->upstream; - -#if (NGX_HTTP_CACHE) - fmcf = ngx_http_get_module_main_conf(r, ngx_http_fastcgi_module); - - u->caches = &fmcf->caches; - u->create_key = ngx_http_fastcgi_create_key; -#endif - - u->create_request = ngx_http_fastcgi_create_request; - u->reinit_request = ngx_http_fastcgi_reinit_request; - u->process_header = ngx_http_fastcgi_process_header; - u->abort_request = ngx_http_fastcgi_abort_request; - u->finalize_request = ngx_http_fastcgi_finalize_request; - r->state = 0; - - u->buffering = flcf->upstream.buffering; - - u->pipe = ngx_pcalloc(r->pool, sizeof(ngx_event_pipe_t)); - if (u->pipe == NULL) { - return NGX_HTTP_INTERNAL_SERVER_ERROR; - } - - u->pipe->input_filter = ngx_http_fastcgi_input_filter; - u->pipe->input_ctx = r; - - u->input_filter_init = ngx_http_fastcgi_input_filter_init; - u->input_filter = ngx_http_fastcgi_non_buffered_filter; - u->input_filter_ctx = r; - - if (!flcf->upstream.request_buffering - && flcf->upstream.pass_request_body) - { - r->request_body_no_buffering = 1; - } - - rc = ngx_http_read_client_request_body(r, ngx_http_upstream_init); - - if (rc >= NGX_HTTP_SPECIAL_RESPONSE) { - return rc; - } - - return NGX_DONE; -} - - -static ngx_int_t -ngx_http_fastcgi_eval(ngx_http_request_t *r, ngx_http_fastcgi_loc_conf_t *flcf) -{ - ngx_url_t url; - ngx_http_upstream_t *u; - - ngx_memzero(&url, sizeof(ngx_url_t)); - - if (ngx_http_script_run(r, &url.url, flcf->fastcgi_lengths->elts, 0, - flcf->fastcgi_values->elts) - == NULL) - { - return NGX_ERROR; - } - - url.no_resolve = 1; - - if (ngx_parse_url(r->pool, &url) != NGX_OK) { - if (url.err) { - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "%s in upstream \"%V\"", url.err, &url.url); - } - - return NGX_ERROR; - } - - u = r->upstream; - - u->resolved = ngx_pcalloc(r->pool, sizeof(ngx_http_upstream_resolved_t)); - if (u->resolved == NULL) { - return NGX_ERROR; - } - - if (url.addrs) { - u->resolved->sockaddr = url.addrs[0].sockaddr; - u->resolved->socklen = url.addrs[0].socklen; - u->resolved->name = url.addrs[0].name; - u->resolved->naddrs = 1; - } - - u->resolved->host = url.host; - u->resolved->port = url.port; - u->resolved->no_port = url.no_port; - - return NGX_OK; -} - - -#if (NGX_HTTP_CACHE) - -static ngx_int_t -ngx_http_fastcgi_create_key(ngx_http_request_t *r) -{ - ngx_str_t *key; - ngx_http_fastcgi_loc_conf_t *flcf; - - key = ngx_array_push(&r->cache->keys); - if (key == NULL) { - return NGX_ERROR; - } - - flcf = ngx_http_get_module_loc_conf(r, ngx_http_fastcgi_module); - - if (ngx_http_complex_value(r, &flcf->cache_key, key) != NGX_OK) { - return NGX_ERROR; - } - - return NGX_OK; -} - -#endif - - -static ngx_int_t -ngx_http_fastcgi_create_request(ngx_http_request_t *r) -{ - off_t file_pos; - u_char ch, sep, *pos, *lowcase_key; - size_t size, len, key_len, val_len, padding, - allocated; - ngx_uint_t i, n, next, hash, skip_empty, header_params; - ngx_buf_t *b; - ngx_chain_t *cl, *body; - ngx_list_part_t *part; - ngx_table_elt_t *header, *hn, **ignored; - ngx_http_upstream_t *u; - ngx_http_script_code_pt code; - ngx_http_script_engine_t e, le; - ngx_http_fastcgi_header_t *h; - ngx_http_fastcgi_params_t *params; - ngx_http_fastcgi_loc_conf_t *flcf; - ngx_http_script_len_code_pt lcode; - - len = 0; - header_params = 0; - ignored = NULL; - - u = r->upstream; - - flcf = ngx_http_get_module_loc_conf(r, ngx_http_fastcgi_module); - -#if (NGX_HTTP_CACHE) - params = u->cacheable ? &flcf->params_cache : &flcf->params; -#else - params = &flcf->params; -#endif - - if (params->lengths) { - ngx_memzero(&le, sizeof(ngx_http_script_engine_t)); - - ngx_http_script_flush_no_cacheable_variables(r, params->flushes); - le.flushed = 1; - - le.ip = params->lengths->elts; - le.request = r; - - while (*(uintptr_t *) le.ip) { - - lcode = *(ngx_http_script_len_code_pt *) le.ip; - key_len = lcode(&le); - - lcode = *(ngx_http_script_len_code_pt *) le.ip; - skip_empty = lcode(&le); - - for (val_len = 0; *(uintptr_t *) le.ip; val_len += lcode(&le)) { - lcode = *(ngx_http_script_len_code_pt *) le.ip; - } - le.ip += sizeof(uintptr_t); - - if (skip_empty && val_len == 0) { - continue; - } - - len += 1 + key_len + ((val_len > 127) ? 4 : 1) + val_len; - } - } - - if (flcf->upstream.pass_request_headers) { - - allocated = 0; - lowcase_key = NULL; - - if (ngx_http_link_multi_headers(r) != NGX_OK) { - return NGX_ERROR; - } - - if (params->number || r->headers_in.multi) { - n = 0; - part = &r->headers_in.headers.part; - - while (part) { - n += part->nelts; - part = part->next; - } - - ignored = ngx_palloc(r->pool, n * sizeof(void *)); - if (ignored == NULL) { - return NGX_ERROR; - } - } - - part = &r->headers_in.headers.part; - header = part->elts; - - for (i = 0; /* void */; i++) { - - if (i >= part->nelts) { - if (part->next == NULL) { - break; - } - - part = part->next; - header = part->elts; - i = 0; - } - - for (n = 0; n < header_params; n++) { - if (&header[i] == ignored[n]) { - goto next_length; - } - } - - if (params->number) { - if (allocated < header[i].key.len) { - allocated = header[i].key.len + 16; - lowcase_key = ngx_pnalloc(r->pool, allocated); - if (lowcase_key == NULL) { - return NGX_ERROR; - } - } - - hash = 0; - - for (n = 0; n < header[i].key.len; n++) { - ch = header[i].key.data[n]; - - if (ch >= 'A' && ch <= 'Z') { - ch |= 0x20; - - } else if (ch == '-') { - ch = '_'; - } - - hash = ngx_hash(hash, ch); - lowcase_key[n] = ch; - } - - if (ngx_hash_find(¶ms->hash, hash, lowcase_key, n)) { - ignored[header_params++] = &header[i]; - continue; - } - } - - key_len = sizeof("HTTP_") - 1 + header[i].key.len; - - val_len = header[i].value.len; - - for (hn = header[i].next; hn; hn = hn->next) { - val_len += hn->value.len + 2; - ignored[header_params++] = hn; - } - - len += ((key_len > 127) ? 4 : 1) + key_len - + ((val_len > 127) ? 4 : 1) + val_len; - - next_length: - - continue; - } - } - - - if (len > 65535) { - ngx_log_error(NGX_LOG_ALERT, r->connection->log, 0, - "fastcgi request record is too big: %uz", len); - return NGX_ERROR; - } - - - padding = 8 - len % 8; - padding = (padding == 8) ? 0 : padding; - - - size = sizeof(ngx_http_fastcgi_header_t) - + sizeof(ngx_http_fastcgi_begin_request_t) - - + sizeof(ngx_http_fastcgi_header_t) /* NGX_HTTP_FASTCGI_PARAMS */ - + len + padding - + sizeof(ngx_http_fastcgi_header_t) /* NGX_HTTP_FASTCGI_PARAMS */ - - + sizeof(ngx_http_fastcgi_header_t); /* NGX_HTTP_FASTCGI_STDIN */ - - - b = ngx_create_temp_buf(r->pool, size); - if (b == NULL) { - return NGX_ERROR; - } - - cl = ngx_alloc_chain_link(r->pool); - if (cl == NULL) { - return NGX_ERROR; - } - - cl->buf = b; - - ngx_http_fastcgi_request_start.br.flags = - flcf->keep_conn ? NGX_HTTP_FASTCGI_KEEP_CONN : 0; - - ngx_memcpy(b->pos, &ngx_http_fastcgi_request_start, - sizeof(ngx_http_fastcgi_request_start_t)); - - h = (ngx_http_fastcgi_header_t *) - (b->pos + sizeof(ngx_http_fastcgi_header_t) - + sizeof(ngx_http_fastcgi_begin_request_t)); - - h->content_length_hi = (u_char) ((len >> 8) & 0xff); - h->content_length_lo = (u_char) (len & 0xff); - h->padding_length = (u_char) padding; - h->reserved = 0; - - b->last = b->pos + sizeof(ngx_http_fastcgi_header_t) - + sizeof(ngx_http_fastcgi_begin_request_t) - + sizeof(ngx_http_fastcgi_header_t); - - - if (params->lengths) { - ngx_memzero(&e, sizeof(ngx_http_script_engine_t)); - - e.ip = params->values->elts; - e.pos = b->last; - e.request = r; - e.flushed = 1; - - le.ip = params->lengths->elts; - - while (*(uintptr_t *) le.ip) { - - lcode = *(ngx_http_script_len_code_pt *) le.ip; - key_len = (u_char) lcode(&le); - - lcode = *(ngx_http_script_len_code_pt *) le.ip; - skip_empty = lcode(&le); - - for (val_len = 0; *(uintptr_t *) le.ip; val_len += lcode(&le)) { - lcode = *(ngx_http_script_len_code_pt *) le.ip; - } - le.ip += sizeof(uintptr_t); - - if (skip_empty && val_len == 0) { - e.skip = 1; - - while (*(uintptr_t *) e.ip) { - code = *(ngx_http_script_code_pt *) e.ip; - code((ngx_http_script_engine_t *) &e); - } - e.ip += sizeof(uintptr_t); - - e.skip = 0; - - continue; - } - - *e.pos++ = (u_char) key_len; - - if (val_len > 127) { - *e.pos++ = (u_char) (((val_len >> 24) & 0x7f) | 0x80); - *e.pos++ = (u_char) ((val_len >> 16) & 0xff); - *e.pos++ = (u_char) ((val_len >> 8) & 0xff); - *e.pos++ = (u_char) (val_len & 0xff); - - } else { - *e.pos++ = (u_char) val_len; - } - - while (*(uintptr_t *) e.ip) { - code = *(ngx_http_script_code_pt *) e.ip; - code((ngx_http_script_engine_t *) &e); - } - e.ip += sizeof(uintptr_t); - - ngx_log_debug4(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "fastcgi param: \"%*s: %*s\"", - key_len, e.pos - (key_len + val_len), - val_len, e.pos - val_len); - } - - b->last = e.pos; - } - - - if (flcf->upstream.pass_request_headers) { - - part = &r->headers_in.headers.part; - header = part->elts; - - for (i = 0; /* void */; i++) { - - if (i >= part->nelts) { - if (part->next == NULL) { - break; - } - - part = part->next; - header = part->elts; - i = 0; - } - - for (n = 0; n < header_params; n++) { - if (&header[i] == ignored[n]) { - goto next_value; - } - } - - key_len = sizeof("HTTP_") - 1 + header[i].key.len; - if (key_len > 127) { - *b->last++ = (u_char) (((key_len >> 24) & 0x7f) | 0x80); - *b->last++ = (u_char) ((key_len >> 16) & 0xff); - *b->last++ = (u_char) ((key_len >> 8) & 0xff); - *b->last++ = (u_char) (key_len & 0xff); - - } else { - *b->last++ = (u_char) key_len; - } - - val_len = header[i].value.len; - - for (hn = header[i].next; hn; hn = hn->next) { - val_len += hn->value.len + 2; - } - - if (val_len > 127) { - *b->last++ = (u_char) (((val_len >> 24) & 0x7f) | 0x80); - *b->last++ = (u_char) ((val_len >> 16) & 0xff); - *b->last++ = (u_char) ((val_len >> 8) & 0xff); - *b->last++ = (u_char) (val_len & 0xff); - - } else { - *b->last++ = (u_char) val_len; - } - - b->last = ngx_cpymem(b->last, "HTTP_", sizeof("HTTP_") - 1); - - for (n = 0; n < header[i].key.len; n++) { - ch = header[i].key.data[n]; - - if (ch >= 'a' && ch <= 'z') { - ch &= ~0x20; - - } else if (ch == '-') { - ch = '_'; - } - - *b->last++ = ch; - } - - b->last = ngx_copy(b->last, header[i].value.data, - header[i].value.len); - - if (header[i].next) { - - if (header[i].key.len == sizeof("Cookie") - 1 - && ngx_strncasecmp(header[i].key.data, (u_char *) "Cookie", - sizeof("Cookie") - 1) - == 0) - { - sep = ';'; - - } else { - sep = ','; - } - - for (hn = header[i].next; hn; hn = hn->next) { - *b->last++ = sep; - *b->last++ = ' '; - b->last = ngx_copy(b->last, hn->value.data, hn->value.len); - } - } - - ngx_log_debug4(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "fastcgi param: \"%*s: %*s\"", - key_len, b->last - (key_len + val_len), - val_len, b->last - val_len); - next_value: - - continue; - } - } - - - if (padding) { - ngx_memzero(b->last, padding); - b->last += padding; - } - - - h = (ngx_http_fastcgi_header_t *) b->last; - b->last += sizeof(ngx_http_fastcgi_header_t); - - h->version = 1; - h->type = NGX_HTTP_FASTCGI_PARAMS; - h->request_id_hi = 0; - h->request_id_lo = 1; - h->content_length_hi = 0; - h->content_length_lo = 0; - h->padding_length = 0; - h->reserved = 0; - - if (r->request_body_no_buffering) { - - u->request_bufs = cl; - - u->output.output_filter = ngx_http_fastcgi_body_output_filter; - u->output.filter_ctx = r; - - } else if (flcf->upstream.pass_request_body) { - - body = u->request_bufs; - u->request_bufs = cl; - -#if (NGX_SUPPRESS_WARN) - file_pos = 0; - pos = NULL; -#endif - - while (body) { - - if (ngx_buf_special(body->buf)) { - body = body->next; - continue; - } - - if (body->buf->in_file) { - file_pos = body->buf->file_pos; - - } else { - pos = body->buf->pos; - } - - next = 0; - - do { - b = ngx_alloc_buf(r->pool); - if (b == NULL) { - return NGX_ERROR; - } - - ngx_memcpy(b, body->buf, sizeof(ngx_buf_t)); - - if (body->buf->in_file) { - b->file_pos = file_pos; - file_pos += 32 * 1024; - - if (file_pos >= body->buf->file_last) { - file_pos = body->buf->file_last; - next = 1; - } - - b->file_last = file_pos; - len = (ngx_uint_t) (file_pos - b->file_pos); - - } else { - b->pos = pos; - b->start = pos; - pos += 32 * 1024; - - if (pos >= body->buf->last) { - pos = body->buf->last; - next = 1; - } - - b->last = pos; - len = (ngx_uint_t) (pos - b->pos); - } - - padding = 8 - len % 8; - padding = (padding == 8) ? 0 : padding; - - h = (ngx_http_fastcgi_header_t *) cl->buf->last; - cl->buf->last += sizeof(ngx_http_fastcgi_header_t); - - h->version = 1; - h->type = NGX_HTTP_FASTCGI_STDIN; - h->request_id_hi = 0; - h->request_id_lo = 1; - h->content_length_hi = (u_char) ((len >> 8) & 0xff); - h->content_length_lo = (u_char) (len & 0xff); - h->padding_length = (u_char) padding; - h->reserved = 0; - - cl->next = ngx_alloc_chain_link(r->pool); - if (cl->next == NULL) { - return NGX_ERROR; - } - - cl = cl->next; - cl->buf = b; - - b = ngx_create_temp_buf(r->pool, - sizeof(ngx_http_fastcgi_header_t) - + padding); - if (b == NULL) { - return NGX_ERROR; - } - - if (padding) { - ngx_memzero(b->last, padding); - b->last += padding; - } - - cl->next = ngx_alloc_chain_link(r->pool); - if (cl->next == NULL) { - return NGX_ERROR; - } - - cl = cl->next; - cl->buf = b; - - } while (!next); - - body = body->next; - } - - } else { - u->request_bufs = cl; - } - - if (!r->request_body_no_buffering) { - h = (ngx_http_fastcgi_header_t *) cl->buf->last; - cl->buf->last += sizeof(ngx_http_fastcgi_header_t); - - h->version = 1; - h->type = NGX_HTTP_FASTCGI_STDIN; - h->request_id_hi = 0; - h->request_id_lo = 1; - h->content_length_hi = 0; - h->content_length_lo = 0; - h->padding_length = 0; - h->reserved = 0; - } - - cl->next = NULL; - - return NGX_OK; -} - - -static ngx_int_t -ngx_http_fastcgi_reinit_request(ngx_http_request_t *r) -{ - ngx_http_fastcgi_ctx_t *f; - - f = ngx_http_get_module_ctx(r, ngx_http_fastcgi_module); - - if (f == NULL) { - return NGX_OK; - } - - f->state = ngx_http_fastcgi_st_version; - f->fastcgi_stdout = 0; - f->large_stderr = 0; - - if (f->split_parts) { - f->split_parts->nelts = 0; - } - - r->state = 0; - - return NGX_OK; -} - - -static ngx_int_t -ngx_http_fastcgi_body_output_filter(void *data, ngx_chain_t *in) -{ - ngx_http_request_t *r = data; - - off_t file_pos; - u_char *pos, *start; - size_t len, padding; - ngx_buf_t *b; - ngx_int_t rc; - ngx_uint_t next, last; - ngx_chain_t *cl, *tl, *out, **ll; - ngx_http_fastcgi_ctx_t *f; - ngx_http_fastcgi_header_t *h; - - ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "fastcgi output filter"); - - f = ngx_http_get_module_ctx(r, ngx_http_fastcgi_module); - - if (in == NULL) { - out = in; - goto out; - } - - out = NULL; - ll = &out; - - if (!f->header_sent) { - /* first buffer contains headers, pass it unmodified */ - - ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "fastcgi output header"); - - f->header_sent = 1; - - tl = ngx_alloc_chain_link(r->pool); - if (tl == NULL) { - return NGX_ERROR; - } - - tl->buf = in->buf; - *ll = tl; - ll = &tl->next; - - in = in->next; - - if (in == NULL) { - tl->next = NULL; - goto out; - } - } - - cl = ngx_chain_get_free_buf(r->pool, &f->free); - if (cl == NULL) { - return NGX_ERROR; - } - - b = cl->buf; - - b->tag = (ngx_buf_tag_t) &ngx_http_fastcgi_body_output_filter; - b->temporary = 1; - - if (b->start == NULL) { - /* reserve space for maximum possible padding, 7 bytes */ - - b->start = ngx_palloc(r->pool, - sizeof(ngx_http_fastcgi_header_t) + 7); - if (b->start == NULL) { - return NGX_ERROR; - } - - b->pos = b->start; - b->last = b->start; - - b->end = b->start + sizeof(ngx_http_fastcgi_header_t) + 7; - } - - *ll = cl; - - last = 0; - padding = 0; - -#if (NGX_SUPPRESS_WARN) - file_pos = 0; - pos = NULL; -#endif - - while (in) { - - ngx_log_debug7(NGX_LOG_DEBUG_EVENT, r->connection->log, 0, - "fastcgi output in l:%d f:%d %p, pos %p, size: %z " - "file: %O, size: %O", - in->buf->last_buf, - in->buf->in_file, - in->buf->start, in->buf->pos, - in->buf->last - in->buf->pos, - in->buf->file_pos, - in->buf->file_last - in->buf->file_pos); - - if (in->buf->last_buf) { - last = 1; - } - - if (ngx_buf_special(in->buf)) { - in = in->next; - continue; - } - - if (in->buf->in_file) { - file_pos = in->buf->file_pos; - - } else { - pos = in->buf->pos; - } - - next = 0; - - do { - tl = ngx_chain_get_free_buf(r->pool, &f->free); - if (tl == NULL) { - return NGX_ERROR; - } - - b = tl->buf; - start = b->start; - - ngx_memcpy(b, in->buf, sizeof(ngx_buf_t)); - - /* - * restore b->start to preserve memory allocated in the buffer, - * to reuse it later for headers and padding - */ - - b->start = start; - - if (in->buf->in_file) { - b->file_pos = file_pos; - file_pos += 32 * 1024; - - if (file_pos >= in->buf->file_last) { - file_pos = in->buf->file_last; - next = 1; - } - - b->file_last = file_pos; - len = (ngx_uint_t) (file_pos - b->file_pos); - - } else { - b->pos = pos; - pos += 32 * 1024; - - if (pos >= in->buf->last) { - pos = in->buf->last; - next = 1; - } - - b->last = pos; - len = (ngx_uint_t) (pos - b->pos); - } - - b->tag = (ngx_buf_tag_t) &ngx_http_fastcgi_body_output_filter; - b->shadow = in->buf; - b->last_shadow = next; - - b->last_buf = 0; - b->last_in_chain = 0; - - padding = 8 - len % 8; - padding = (padding == 8) ? 0 : padding; - - h = (ngx_http_fastcgi_header_t *) cl->buf->last; - cl->buf->last += sizeof(ngx_http_fastcgi_header_t); - - h->version = 1; - h->type = NGX_HTTP_FASTCGI_STDIN; - h->request_id_hi = 0; - h->request_id_lo = 1; - h->content_length_hi = (u_char) ((len >> 8) & 0xff); - h->content_length_lo = (u_char) (len & 0xff); - h->padding_length = (u_char) padding; - h->reserved = 0; - - cl->next = tl; - cl = tl; - - tl = ngx_chain_get_free_buf(r->pool, &f->free); - if (tl == NULL) { - return NGX_ERROR; - } - - b = tl->buf; - - b->tag = (ngx_buf_tag_t) &ngx_http_fastcgi_body_output_filter; - b->temporary = 1; - - if (b->start == NULL) { - /* reserve space for maximum possible padding, 7 bytes */ - - b->start = ngx_palloc(r->pool, - sizeof(ngx_http_fastcgi_header_t) + 7); - if (b->start == NULL) { - return NGX_ERROR; - } - - b->pos = b->start; - b->last = b->start; - - b->end = b->start + sizeof(ngx_http_fastcgi_header_t) + 7; - } - - if (padding) { - ngx_memzero(b->last, padding); - b->last += padding; - } - - cl->next = tl; - cl = tl; - - } while (!next); - - in = in->next; - } - - if (last) { - h = (ngx_http_fastcgi_header_t *) cl->buf->last; - cl->buf->last += sizeof(ngx_http_fastcgi_header_t); - - h->version = 1; - h->type = NGX_HTTP_FASTCGI_STDIN; - h->request_id_hi = 0; - h->request_id_lo = 1; - h->content_length_hi = 0; - h->content_length_lo = 0; - h->padding_length = 0; - h->reserved = 0; - - cl->buf->last_buf = 1; - - } else if (padding == 0) { - /* TODO: do not allocate buffers instead */ - cl->buf->temporary = 0; - cl->buf->sync = 1; - } - - cl->next = NULL; - -out: - -#if (NGX_DEBUG) - - for (cl = out; cl; cl = cl->next) { - ngx_log_debug7(NGX_LOG_DEBUG_EVENT, r->connection->log, 0, - "fastcgi output out l:%d f:%d %p, pos %p, size: %z " - "file: %O, size: %O", - cl->buf->last_buf, - cl->buf->in_file, - cl->buf->start, cl->buf->pos, - cl->buf->last - cl->buf->pos, - cl->buf->file_pos, - cl->buf->file_last - cl->buf->file_pos); - } - -#endif - - rc = ngx_chain_writer(&r->upstream->writer, out); - - ngx_chain_update_chains(r->pool, &f->free, &f->busy, &out, - (ngx_buf_tag_t) &ngx_http_fastcgi_body_output_filter); - - for (cl = f->free; cl; cl = cl->next) { - - /* mark original buffers as sent */ - - if (cl->buf->shadow) { - if (cl->buf->last_shadow) { - b = cl->buf->shadow; - b->pos = b->last; - } - - cl->buf->shadow = NULL; - } - } - - return rc; -} - - -static ngx_int_t -ngx_http_fastcgi_process_header(ngx_http_request_t *r) -{ - u_char *p, *msg, *start, *last, - *part_start, *part_end; - size_t size; - ngx_str_t *status_line, *pattern; - ngx_int_t rc, status; - ngx_buf_t buf; - ngx_uint_t i; - ngx_table_elt_t *h; - ngx_http_upstream_t *u; - ngx_http_fastcgi_ctx_t *f; - ngx_http_upstream_header_t *hh; - ngx_http_fastcgi_loc_conf_t *flcf; - ngx_http_fastcgi_split_part_t *part; - ngx_http_upstream_main_conf_t *umcf; - - f = ngx_http_get_module_ctx(r, ngx_http_fastcgi_module); - - umcf = ngx_http_get_module_main_conf(r, ngx_http_upstream_module); - - u = r->upstream; - - for ( ;; ) { - - if (f->state < ngx_http_fastcgi_st_data) { - - f->pos = u->buffer.pos; - f->last = u->buffer.last; - - rc = ngx_http_fastcgi_process_record(r, f); - - u->buffer.pos = f->pos; - u->buffer.last = f->last; - - if (rc == NGX_AGAIN) { - return NGX_AGAIN; - } - - if (rc == NGX_ERROR) { - return NGX_HTTP_UPSTREAM_INVALID_HEADER; - } - - if (f->type != NGX_HTTP_FASTCGI_STDOUT - && f->type != NGX_HTTP_FASTCGI_STDERR) - { - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "upstream sent unexpected FastCGI record: %ui", - f->type); - - return NGX_HTTP_UPSTREAM_INVALID_HEADER; - } - - if (f->type == NGX_HTTP_FASTCGI_STDOUT && f->length == 0) { - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "upstream prematurely closed FastCGI stdout"); - - return NGX_HTTP_UPSTREAM_INVALID_HEADER; - } - } - - if (f->state == ngx_http_fastcgi_st_padding) { - - if (u->buffer.pos + f->padding < u->buffer.last) { - f->state = ngx_http_fastcgi_st_version; - u->buffer.pos += f->padding; - - continue; - } - - if (u->buffer.pos + f->padding == u->buffer.last) { - f->state = ngx_http_fastcgi_st_version; - u->buffer.pos = u->buffer.last; - - return NGX_AGAIN; - } - - f->padding -= u->buffer.last - u->buffer.pos; - u->buffer.pos = u->buffer.last; - - return NGX_AGAIN; - } - - - /* f->state == ngx_http_fastcgi_st_data */ - - if (f->type == NGX_HTTP_FASTCGI_STDERR) { - - if (f->length) { - msg = u->buffer.pos; - - if (u->buffer.pos + f->length <= u->buffer.last) { - u->buffer.pos += f->length; - f->length = 0; - f->state = ngx_http_fastcgi_st_padding; - - } else { - f->length -= u->buffer.last - u->buffer.pos; - u->buffer.pos = u->buffer.last; - } - - for (p = u->buffer.pos - 1; msg < p; p--) { - if (*p != LF && *p != CR && *p != '.' && *p != ' ') { - break; - } - } - - p++; - - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "FastCGI sent in stderr: \"%*s\"", p - msg, msg); - - flcf = ngx_http_get_module_loc_conf(r, ngx_http_fastcgi_module); - - if (flcf->catch_stderr) { - pattern = flcf->catch_stderr->elts; - - for (i = 0; i < flcf->catch_stderr->nelts; i++) { - if (ngx_strnstr(msg, (char *) pattern[i].data, - p - msg) - != NULL) - { - return NGX_HTTP_UPSTREAM_INVALID_HEADER; - } - } - } - - if (u->buffer.pos == u->buffer.last) { - - if (!f->fastcgi_stdout) { - - /* - * the special handling the large number - * of the PHP warnings to not allocate memory - */ - -#if (NGX_HTTP_CACHE) - if (r->cache) { - u->buffer.pos = u->buffer.start - + r->cache->header_start; - } else { - u->buffer.pos = u->buffer.start; - } -#else - u->buffer.pos = u->buffer.start; -#endif - u->buffer.last = u->buffer.pos; - f->large_stderr = 1; - } - - return NGX_AGAIN; - } - - } else { - f->state = ngx_http_fastcgi_st_padding; - } - - continue; - } - - - /* f->type == NGX_HTTP_FASTCGI_STDOUT */ - -#if (NGX_HTTP_CACHE) - - if (f->large_stderr && r->cache) { - ssize_t len; - ngx_http_fastcgi_header_t *fh; - - start = u->buffer.start + r->cache->header_start; - - len = u->buffer.pos - start - 2 * sizeof(ngx_http_fastcgi_header_t); - - /* - * A tail of large stderr output before HTTP header is placed - * in a cache file without a FastCGI record header. - * To workaround it we put a dummy FastCGI record header at the - * start of the stderr output or update r->cache_header_start, - * if there is no enough place for the record header. - */ - - if (len >= 0) { - fh = (ngx_http_fastcgi_header_t *) start; - fh->version = 1; - fh->type = NGX_HTTP_FASTCGI_STDERR; - fh->request_id_hi = 0; - fh->request_id_lo = 1; - fh->content_length_hi = (u_char) ((len >> 8) & 0xff); - fh->content_length_lo = (u_char) (len & 0xff); - fh->padding_length = 0; - fh->reserved = 0; - - } else { - r->cache->header_start += u->buffer.pos - start - - sizeof(ngx_http_fastcgi_header_t); - } - - f->large_stderr = 0; - } - -#endif - - f->fastcgi_stdout = 1; - - start = u->buffer.pos; - - if (u->buffer.pos + f->length < u->buffer.last) { - - /* - * set u->buffer.last to the end of the FastCGI record data - * for ngx_http_parse_header_line() - */ - - last = u->buffer.last; - u->buffer.last = u->buffer.pos + f->length; - - } else { - last = NULL; - } - - for ( ;; ) { - - part_start = u->buffer.pos; - part_end = u->buffer.last; - - rc = ngx_http_parse_header_line(r, &u->buffer, 1); - - ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "http fastcgi parser: %i", rc); - - if (rc == NGX_AGAIN) { - break; - } - - if (rc == NGX_OK) { - - /* a header line has been parsed successfully */ - - h = ngx_list_push(&u->headers_in.headers); - if (h == NULL) { - return NGX_ERROR; - } - - if (f->split_parts && f->split_parts->nelts) { - - part = f->split_parts->elts; - size = u->buffer.pos - part_start; - - for (i = 0; i < f->split_parts->nelts; i++) { - size += part[i].end - part[i].start; - } - - p = ngx_pnalloc(r->pool, size); - if (p == NULL) { - h->hash = 0; - return NGX_ERROR; - } - - buf.pos = p; - - for (i = 0; i < f->split_parts->nelts; i++) { - p = ngx_cpymem(p, part[i].start, - part[i].end - part[i].start); - } - - p = ngx_cpymem(p, part_start, u->buffer.pos - part_start); - - buf.last = p; - - f->split_parts->nelts = 0; - - rc = ngx_http_parse_header_line(r, &buf, 1); - - if (rc != NGX_OK) { - ngx_log_error(NGX_LOG_ALERT, r->connection->log, 0, - "invalid header after joining " - "FastCGI records"); - h->hash = 0; - return NGX_ERROR; - } - - h->key.len = r->header_name_end - r->header_name_start; - h->key.data = r->header_name_start; - h->key.data[h->key.len] = '\0'; - - h->value.len = r->header_end - r->header_start; - h->value.data = r->header_start; - h->value.data[h->value.len] = '\0'; - - h->lowcase_key = ngx_pnalloc(r->pool, h->key.len); - if (h->lowcase_key == NULL) { - return NGX_ERROR; - } - - } else { - - h->key.len = r->header_name_end - r->header_name_start; - h->value.len = r->header_end - r->header_start; - - h->key.data = ngx_pnalloc(r->pool, - h->key.len + 1 + h->value.len + 1 - + h->key.len); - if (h->key.data == NULL) { - h->hash = 0; - return NGX_ERROR; - } - - h->value.data = h->key.data + h->key.len + 1; - h->lowcase_key = h->key.data + h->key.len + 1 - + h->value.len + 1; - - ngx_memcpy(h->key.data, r->header_name_start, h->key.len); - h->key.data[h->key.len] = '\0'; - ngx_memcpy(h->value.data, r->header_start, h->value.len); - h->value.data[h->value.len] = '\0'; - } - - h->hash = r->header_hash; - - if (h->key.len == r->lowcase_index) { - ngx_memcpy(h->lowcase_key, r->lowcase_header, h->key.len); - - } else { - ngx_strlow(h->lowcase_key, h->key.data, h->key.len); - } - - hh = ngx_hash_find(&umcf->headers_in_hash, h->hash, - h->lowcase_key, h->key.len); - - if (hh) { - rc = hh->handler(r, h, hh->offset); - - if (rc != NGX_OK) { - return rc; - } - } - - ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "http fastcgi header: \"%V: %V\"", - &h->key, &h->value); - - if (u->buffer.pos < u->buffer.last) { - continue; - } - - /* the end of the FastCGI record */ - - break; - } - - if (rc == NGX_HTTP_PARSE_HEADER_DONE) { - - /* a whole header has been parsed successfully */ - - ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "http fastcgi header done"); - - if (u->headers_in.status) { - status_line = &u->headers_in.status->value; - - status = ngx_atoi(status_line->data, 3); - - if (status == NGX_ERROR) { - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "upstream sent invalid status \"%V\"", - status_line); - return NGX_HTTP_UPSTREAM_INVALID_HEADER; - } - - u->headers_in.status_n = status; - - if (status_line->len > 3) { - u->headers_in.status_line = *status_line; - } - - } else if (u->headers_in.location) { - u->headers_in.status_n = 302; - ngx_str_set(&u->headers_in.status_line, - "302 Moved Temporarily"); - - } else { - u->headers_in.status_n = 200; - ngx_str_set(&u->headers_in.status_line, "200 OK"); - } - - if (u->state && u->state->status == 0) { - u->state->status = u->headers_in.status_n; - } - - break; - } - - /* rc == NGX_HTTP_PARSE_INVALID_HEADER */ - - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "upstream sent invalid header: \"%*s\\x%02xd...\"", - r->header_end - r->header_name_start, - r->header_name_start, *r->header_end); - - return NGX_HTTP_UPSTREAM_INVALID_HEADER; - } - - if (last) { - u->buffer.last = last; - } - - f->length -= u->buffer.pos - start; - - if (f->length == 0) { - f->state = ngx_http_fastcgi_st_padding; - } - - if (rc == NGX_HTTP_PARSE_HEADER_DONE) { - return NGX_OK; - } - - if (rc == NGX_OK) { - continue; - } - - /* rc == NGX_AGAIN */ - - ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "upstream split a header line in FastCGI records"); - - if (f->split_parts == NULL) { - f->split_parts = ngx_array_create(r->pool, 1, - sizeof(ngx_http_fastcgi_split_part_t)); - if (f->split_parts == NULL) { - return NGX_ERROR; - } - } - - part = ngx_array_push(f->split_parts); - if (part == NULL) { - return NGX_ERROR; - } - - part->start = part_start; - part->end = part_end; - - if (u->buffer.pos < u->buffer.last) { - continue; - } - - return NGX_AGAIN; - } -} - - -static ngx_int_t -ngx_http_fastcgi_input_filter_init(void *data) -{ - ngx_http_request_t *r = data; - - ngx_http_upstream_t *u; - ngx_http_fastcgi_ctx_t *f; - ngx_http_fastcgi_loc_conf_t *flcf; - - u = r->upstream; - - f = ngx_http_get_module_ctx(r, ngx_http_fastcgi_module); - flcf = ngx_http_get_module_loc_conf(r, ngx_http_fastcgi_module); - - u->pipe->length = flcf->keep_conn ? - (off_t) sizeof(ngx_http_fastcgi_header_t) : -1; - - if (u->headers_in.status_n == NGX_HTTP_NO_CONTENT - || u->headers_in.status_n == NGX_HTTP_NOT_MODIFIED) - { - f->rest = 0; - - } else if (r->method == NGX_HTTP_HEAD) { - f->rest = -2; - - } else { - f->rest = u->headers_in.content_length_n; - } - - return NGX_OK; -} - - -static ngx_int_t -ngx_http_fastcgi_input_filter(ngx_event_pipe_t *p, ngx_buf_t *buf) -{ - u_char *m, *msg; - ngx_int_t rc; - ngx_buf_t *b, **prev; - ngx_chain_t *cl; - ngx_http_request_t *r; - ngx_http_fastcgi_ctx_t *f; - ngx_http_fastcgi_loc_conf_t *flcf; - - if (buf->pos == buf->last) { - return NGX_OK; - } - - r = p->input_ctx; - f = ngx_http_get_module_ctx(r, ngx_http_fastcgi_module); - flcf = ngx_http_get_module_loc_conf(r, ngx_http_fastcgi_module); - - if (p->upstream_done || f->closed) { - r->upstream->keepalive = 0; - - ngx_log_debug0(NGX_LOG_DEBUG_HTTP, p->log, 0, - "http fastcgi data after close"); - - return NGX_OK; - } - - b = NULL; - prev = &buf->shadow; - - f->pos = buf->pos; - f->last = buf->last; - - for ( ;; ) { - if (f->state < ngx_http_fastcgi_st_data) { - - rc = ngx_http_fastcgi_process_record(r, f); - - if (rc == NGX_AGAIN) { - break; - } - - if (rc == NGX_ERROR) { - return NGX_ERROR; - } - - if (f->type == NGX_HTTP_FASTCGI_STDOUT && f->length == 0) { - f->state = ngx_http_fastcgi_st_padding; - - ngx_log_debug0(NGX_LOG_DEBUG_HTTP, p->log, 0, - "http fastcgi closed stdout"); - - if (f->rest > 0) { - ngx_log_error(NGX_LOG_ERR, p->log, 0, - "upstream prematurely closed " - "FastCGI stdout"); - - p->upstream_error = 1; - p->upstream_eof = 0; - f->closed = 1; - - break; - } - - if (!flcf->keep_conn) { - p->upstream_done = 1; - } - - continue; - } - - if (f->type == NGX_HTTP_FASTCGI_END_REQUEST) { - - ngx_log_debug0(NGX_LOG_DEBUG_HTTP, p->log, 0, - "http fastcgi sent end request"); - - if (f->rest > 0) { - ngx_log_error(NGX_LOG_ERR, p->log, 0, - "upstream prematurely closed " - "FastCGI request"); - - p->upstream_error = 1; - p->upstream_eof = 0; - f->closed = 1; - - break; - } - - if (!flcf->keep_conn) { - p->upstream_done = 1; - break; - } - - continue; - } - } - - - if (f->state == ngx_http_fastcgi_st_padding) { - - if (f->type == NGX_HTTP_FASTCGI_END_REQUEST) { - - if (f->pos + f->padding < f->last) { - p->upstream_done = 1; - break; - } - - if (f->pos + f->padding == f->last) { - p->upstream_done = 1; - r->upstream->keepalive = 1; - break; - } - - f->padding -= f->last - f->pos; - - break; - } - - if (f->pos + f->padding < f->last) { - f->state = ngx_http_fastcgi_st_version; - f->pos += f->padding; - - continue; - } - - if (f->pos + f->padding == f->last) { - f->state = ngx_http_fastcgi_st_version; - - break; - } - - f->padding -= f->last - f->pos; - - break; - } - - - /* f->state == ngx_http_fastcgi_st_data */ - - if (f->type == NGX_HTTP_FASTCGI_STDERR) { - - if (f->length) { - - if (f->pos == f->last) { - break; - } - - msg = f->pos; - - if (f->pos + f->length <= f->last) { - f->pos += f->length; - f->length = 0; - f->state = ngx_http_fastcgi_st_padding; - - } else { - f->length -= f->last - f->pos; - f->pos = f->last; - } - - for (m = f->pos - 1; msg < m; m--) { - if (*m != LF && *m != CR && *m != '.' && *m != ' ') { - break; - } - } - - ngx_log_error(NGX_LOG_ERR, p->log, 0, - "FastCGI sent in stderr: \"%*s\"", - m + 1 - msg, msg); - - } else { - f->state = ngx_http_fastcgi_st_padding; - } - - continue; - } - - if (f->type == NGX_HTTP_FASTCGI_END_REQUEST) { - - if (f->pos + f->length <= f->last) { - f->state = ngx_http_fastcgi_st_padding; - f->pos += f->length; - - continue; - } - - f->length -= f->last - f->pos; - - break; - } - - - /* f->type == NGX_HTTP_FASTCGI_STDOUT */ - - if (f->pos == f->last) { - break; - } - - if (f->rest == -2) { - f->rest = r->upstream->headers_in.content_length_n; - } - - if (f->rest == 0) { - ngx_log_error(NGX_LOG_WARN, p->log, 0, - "upstream sent more data than specified in " - "\"Content-Length\" header"); - p->upstream_done = 1; - break; - } - - cl = ngx_chain_get_free_buf(p->pool, &p->free); - if (cl == NULL) { - return NGX_ERROR; - } - - b = cl->buf; - - ngx_memzero(b, sizeof(ngx_buf_t)); - - b->pos = f->pos; - b->start = buf->start; - b->end = buf->end; - b->tag = p->tag; - b->temporary = 1; - b->recycled = 1; - - *prev = b; - prev = &b->shadow; - - if (p->in) { - *p->last_in = cl; - } else { - p->in = cl; - } - p->last_in = &cl->next; - - - /* STUB */ b->num = buf->num; - - ngx_log_debug2(NGX_LOG_DEBUG_EVENT, p->log, 0, - "input buf #%d %p", b->num, b->pos); - - if (f->pos + f->length <= f->last) { - f->state = ngx_http_fastcgi_st_padding; - f->pos += f->length; - b->last = f->pos; - - } else { - f->length -= f->last - f->pos; - f->pos = f->last; - b->last = f->last; - } - - if (f->rest > 0) { - - if (b->last - b->pos > f->rest) { - ngx_log_error(NGX_LOG_WARN, p->log, 0, - "upstream sent more data than specified in " - "\"Content-Length\" header"); - - b->last = b->pos + f->rest; - p->upstream_done = 1; - - break; - } - - f->rest -= b->last - b->pos; - } - } - - if (flcf->keep_conn) { - - /* set p->length, minimal amount of data we want to see */ - - if (f->state < ngx_http_fastcgi_st_data) { - p->length = 1; - - } else if (f->state == ngx_http_fastcgi_st_padding) { - p->length = f->padding; - - } else { - /* ngx_http_fastcgi_st_data */ - - p->length = f->length; - } - } - - if (b) { - b->shadow = buf; - b->last_shadow = 1; - - ngx_log_debug2(NGX_LOG_DEBUG_EVENT, p->log, 0, - "input buf %p %z", b->pos, b->last - b->pos); - - return NGX_OK; - } - - /* there is no data record in the buf, add it to free chain */ - - if (ngx_event_pipe_add_free_buf(p, buf) != NGX_OK) { - return NGX_ERROR; - } - - return NGX_OK; -} - - -static ngx_int_t -ngx_http_fastcgi_non_buffered_filter(void *data, ssize_t bytes) -{ - u_char *m, *msg; - ngx_int_t rc; - ngx_buf_t *b, *buf; - ngx_chain_t *cl, **ll; - ngx_http_request_t *r; - ngx_http_upstream_t *u; - ngx_http_fastcgi_ctx_t *f; - - r = data; - f = ngx_http_get_module_ctx(r, ngx_http_fastcgi_module); - - u = r->upstream; - buf = &u->buffer; - - buf->pos = buf->last; - buf->last += bytes; - - for (cl = u->out_bufs, ll = &u->out_bufs; cl; cl = cl->next) { - ll = &cl->next; - } - - f->pos = buf->pos; - f->last = buf->last; - - for ( ;; ) { - if (f->state < ngx_http_fastcgi_st_data) { - - rc = ngx_http_fastcgi_process_record(r, f); - - if (rc == NGX_AGAIN) { - break; - } - - if (rc == NGX_ERROR) { - return NGX_ERROR; - } - - if (f->type == NGX_HTTP_FASTCGI_STDOUT && f->length == 0) { - f->state = ngx_http_fastcgi_st_padding; - - ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "http fastcgi closed stdout"); - - continue; - } - } - - if (f->state == ngx_http_fastcgi_st_padding) { - - if (f->type == NGX_HTTP_FASTCGI_END_REQUEST) { - - if (f->rest > 0) { - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "upstream prematurely closed " - "FastCGI request"); - u->error = 1; - break; - } - - if (f->pos + f->padding < f->last) { - u->length = 0; - break; - } - - if (f->pos + f->padding == f->last) { - u->length = 0; - u->keepalive = 1; - break; - } - - f->padding -= f->last - f->pos; - - break; - } - - if (f->pos + f->padding < f->last) { - f->state = ngx_http_fastcgi_st_version; - f->pos += f->padding; - - continue; - } - - if (f->pos + f->padding == f->last) { - f->state = ngx_http_fastcgi_st_version; - - break; - } - - f->padding -= f->last - f->pos; - - break; - } - - - /* f->state == ngx_http_fastcgi_st_data */ - - if (f->type == NGX_HTTP_FASTCGI_STDERR) { - - if (f->length) { - - if (f->pos == f->last) { - break; - } - - msg = f->pos; - - if (f->pos + f->length <= f->last) { - f->pos += f->length; - f->length = 0; - f->state = ngx_http_fastcgi_st_padding; - - } else { - f->length -= f->last - f->pos; - f->pos = f->last; - } - - for (m = f->pos - 1; msg < m; m--) { - if (*m != LF && *m != CR && *m != '.' && *m != ' ') { - break; - } - } - - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "FastCGI sent in stderr: \"%*s\"", - m + 1 - msg, msg); - - } else { - f->state = ngx_http_fastcgi_st_padding; - } - - continue; - } - - if (f->type == NGX_HTTP_FASTCGI_END_REQUEST) { - - if (f->pos + f->length <= f->last) { - f->state = ngx_http_fastcgi_st_padding; - f->pos += f->length; - - continue; - } - - f->length -= f->last - f->pos; - - break; - } - - - /* f->type == NGX_HTTP_FASTCGI_STDOUT */ - - if (f->pos == f->last) { - break; - } - - if (f->rest == 0) { - ngx_log_error(NGX_LOG_WARN, r->connection->log, 0, - "upstream sent more data than specified in " - "\"Content-Length\" header"); - u->length = 0; - break; - } - - cl = ngx_chain_get_free_buf(r->pool, &u->free_bufs); - if (cl == NULL) { - return NGX_ERROR; - } - - *ll = cl; - ll = &cl->next; - - b = cl->buf; - - b->flush = 1; - b->memory = 1; - - b->pos = f->pos; - b->tag = u->output.tag; - - ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "http fastcgi output buf %p", b->pos); - - if (f->pos + f->length <= f->last) { - f->state = ngx_http_fastcgi_st_padding; - f->pos += f->length; - b->last = f->pos; - - } else { - f->length -= f->last - f->pos; - f->pos = f->last; - b->last = f->last; - } - - if (f->rest > 0) { - - if (b->last - b->pos > f->rest) { - ngx_log_error(NGX_LOG_WARN, r->connection->log, 0, - "upstream sent more data than specified in " - "\"Content-Length\" header"); - - b->last = b->pos + f->rest; - u->length = 0; - - break; - } - - f->rest -= b->last - b->pos; - } - } - - return NGX_OK; -} - - -static ngx_int_t -ngx_http_fastcgi_process_record(ngx_http_request_t *r, - ngx_http_fastcgi_ctx_t *f) -{ - u_char ch, *p; - ngx_http_fastcgi_state_e state; - - state = f->state; - - for (p = f->pos; p < f->last; p++) { - - ch = *p; - - ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "http fastcgi record byte: %02Xd", ch); - - switch (state) { - - case ngx_http_fastcgi_st_version: - if (ch != 1) { - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "upstream sent unsupported FastCGI " - "protocol version: %d", ch); - return NGX_ERROR; - } - state = ngx_http_fastcgi_st_type; - break; - - case ngx_http_fastcgi_st_type: - switch (ch) { - case NGX_HTTP_FASTCGI_STDOUT: - case NGX_HTTP_FASTCGI_STDERR: - case NGX_HTTP_FASTCGI_END_REQUEST: - f->type = (ngx_uint_t) ch; - break; - default: - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "upstream sent invalid FastCGI " - "record type: %d", ch); - return NGX_ERROR; - - } - state = ngx_http_fastcgi_st_request_id_hi; - break; - - /* we support the single request per connection */ - - case ngx_http_fastcgi_st_request_id_hi: - if (ch != 0) { - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "upstream sent unexpected FastCGI " - "request id high byte: %d", ch); - return NGX_ERROR; - } - state = ngx_http_fastcgi_st_request_id_lo; - break; - - case ngx_http_fastcgi_st_request_id_lo: - if (ch != 1) { - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "upstream sent unexpected FastCGI " - "request id low byte: %d", ch); - return NGX_ERROR; - } - state = ngx_http_fastcgi_st_content_length_hi; - break; - - case ngx_http_fastcgi_st_content_length_hi: - f->length = ch << 8; - state = ngx_http_fastcgi_st_content_length_lo; - break; - - case ngx_http_fastcgi_st_content_length_lo: - f->length |= (size_t) ch; - state = ngx_http_fastcgi_st_padding_length; - break; - - case ngx_http_fastcgi_st_padding_length: - f->padding = (size_t) ch; - state = ngx_http_fastcgi_st_reserved; - break; - - case ngx_http_fastcgi_st_reserved: - state = ngx_http_fastcgi_st_data; - - ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "http fastcgi record length: %z", f->length); - - f->pos = p + 1; - f->state = state; - - return NGX_OK; - - /* suppress warning */ - case ngx_http_fastcgi_st_data: - case ngx_http_fastcgi_st_padding: - break; - } - } - - f->pos = p; - f->state = state; - - return NGX_AGAIN; -} - - -static void -ngx_http_fastcgi_abort_request(ngx_http_request_t *r) -{ - ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "abort http fastcgi request"); - - return; -} - - -static void -ngx_http_fastcgi_finalize_request(ngx_http_request_t *r, ngx_int_t rc) -{ - ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "finalize http fastcgi request"); - - return; -} - - -static ngx_int_t -ngx_http_fastcgi_add_variables(ngx_conf_t *cf) -{ - ngx_http_variable_t *var, *v; - - for (v = ngx_http_fastcgi_vars; v->name.len; v++) { - var = ngx_http_add_variable(cf, &v->name, v->flags); - if (var == NULL) { - return NGX_ERROR; - } - - var->get_handler = v->get_handler; - var->data = v->data; - } - - return NGX_OK; -} - - -static void * -ngx_http_fastcgi_create_main_conf(ngx_conf_t *cf) -{ - ngx_http_fastcgi_main_conf_t *conf; - - conf = ngx_pcalloc(cf->pool, sizeof(ngx_http_fastcgi_main_conf_t)); - if (conf == NULL) { - return NULL; - } - -#if (NGX_HTTP_CACHE) - if (ngx_array_init(&conf->caches, cf->pool, 4, - sizeof(ngx_http_file_cache_t *)) - != NGX_OK) - { - return NULL; - } -#endif - - return conf; -} - - -static void * -ngx_http_fastcgi_create_loc_conf(ngx_conf_t *cf) -{ - ngx_http_fastcgi_loc_conf_t *conf; - - conf = ngx_pcalloc(cf->pool, sizeof(ngx_http_fastcgi_loc_conf_t)); - if (conf == NULL) { - return NULL; - } - - /* - * set by ngx_pcalloc(): - * - * conf->upstream.bufs.num = 0; - * conf->upstream.ignore_headers = 0; - * conf->upstream.next_upstream = 0; - * conf->upstream.cache_zone = NULL; - * conf->upstream.cache_use_stale = 0; - * conf->upstream.cache_methods = 0; - * conf->upstream.temp_path = NULL; - * conf->upstream.hide_headers_hash = { NULL, 0 }; - * conf->upstream.store_lengths = NULL; - * conf->upstream.store_values = NULL; - * - * conf->index = { 0, NULL }; - */ - - conf->upstream.store = NGX_CONF_UNSET; - conf->upstream.store_access = NGX_CONF_UNSET_UINT; - conf->upstream.next_upstream_tries = NGX_CONF_UNSET_UINT; - conf->upstream.buffering = NGX_CONF_UNSET; - conf->upstream.request_buffering = NGX_CONF_UNSET; - conf->upstream.ignore_client_abort = NGX_CONF_UNSET; - conf->upstream.force_ranges = NGX_CONF_UNSET; - - conf->upstream.local = NGX_CONF_UNSET_PTR; - conf->upstream.socket_keepalive = NGX_CONF_UNSET; - - conf->upstream.connect_timeout = NGX_CONF_UNSET_MSEC; - conf->upstream.send_timeout = NGX_CONF_UNSET_MSEC; - conf->upstream.read_timeout = NGX_CONF_UNSET_MSEC; - conf->upstream.next_upstream_timeout = NGX_CONF_UNSET_MSEC; - - conf->upstream.send_lowat = NGX_CONF_UNSET_SIZE; - conf->upstream.buffer_size = NGX_CONF_UNSET_SIZE; - conf->upstream.limit_rate = NGX_CONF_UNSET_PTR; - - conf->upstream.busy_buffers_size_conf = NGX_CONF_UNSET_SIZE; - conf->upstream.max_temp_file_size_conf = NGX_CONF_UNSET_SIZE; - conf->upstream.temp_file_write_size_conf = NGX_CONF_UNSET_SIZE; - - conf->upstream.pass_request_headers = NGX_CONF_UNSET; - conf->upstream.pass_request_body = NGX_CONF_UNSET; - -#if (NGX_HTTP_CACHE) - conf->upstream.cache = NGX_CONF_UNSET; - conf->upstream.cache_min_uses = NGX_CONF_UNSET_UINT; - conf->upstream.cache_max_range_offset = NGX_CONF_UNSET; - conf->upstream.cache_bypass = NGX_CONF_UNSET_PTR; - conf->upstream.no_cache = NGX_CONF_UNSET_PTR; - conf->upstream.cache_valid = NGX_CONF_UNSET_PTR; - conf->upstream.cache_lock = NGX_CONF_UNSET; - conf->upstream.cache_lock_timeout = NGX_CONF_UNSET_MSEC; - conf->upstream.cache_lock_age = NGX_CONF_UNSET_MSEC; - conf->upstream.cache_revalidate = NGX_CONF_UNSET; - conf->upstream.cache_background_update = NGX_CONF_UNSET; -#endif - - conf->upstream.hide_headers = NGX_CONF_UNSET_PTR; - conf->upstream.pass_headers = NGX_CONF_UNSET_PTR; - - conf->upstream.intercept_errors = NGX_CONF_UNSET; - - /* "fastcgi_cyclic_temp_file" is disabled */ - conf->upstream.cyclic_temp_file = 0; - - conf->upstream.change_buffering = 1; - - conf->catch_stderr = NGX_CONF_UNSET_PTR; - - conf->keep_conn = NGX_CONF_UNSET; - - ngx_str_set(&conf->upstream.module, "fastcgi"); - - return conf; -} - - -static char * -ngx_http_fastcgi_merge_loc_conf(ngx_conf_t *cf, void *parent, void *child) -{ - ngx_http_fastcgi_loc_conf_t *prev = parent; - ngx_http_fastcgi_loc_conf_t *conf = child; - - size_t size; - ngx_int_t rc; - ngx_hash_init_t hash; - ngx_http_core_loc_conf_t *clcf; - -#if (NGX_HTTP_CACHE) - - if (conf->upstream.store > 0) { - conf->upstream.cache = 0; - } - - if (conf->upstream.cache > 0) { - conf->upstream.store = 0; - } - -#endif - - if (conf->upstream.store == NGX_CONF_UNSET) { - ngx_conf_merge_value(conf->upstream.store, - prev->upstream.store, 0); - - conf->upstream.store_lengths = prev->upstream.store_lengths; - conf->upstream.store_values = prev->upstream.store_values; - } - - ngx_conf_merge_uint_value(conf->upstream.store_access, - prev->upstream.store_access, 0600); - - ngx_conf_merge_uint_value(conf->upstream.next_upstream_tries, - prev->upstream.next_upstream_tries, 0); - - ngx_conf_merge_value(conf->upstream.buffering, - prev->upstream.buffering, 1); - - ngx_conf_merge_value(conf->upstream.request_buffering, - prev->upstream.request_buffering, 1); - - ngx_conf_merge_value(conf->upstream.ignore_client_abort, - prev->upstream.ignore_client_abort, 0); - - ngx_conf_merge_value(conf->upstream.force_ranges, - prev->upstream.force_ranges, 0); - - ngx_conf_merge_ptr_value(conf->upstream.local, - prev->upstream.local, NULL); - - ngx_conf_merge_value(conf->upstream.socket_keepalive, - prev->upstream.socket_keepalive, 0); - - ngx_conf_merge_msec_value(conf->upstream.connect_timeout, - prev->upstream.connect_timeout, 60000); - - ngx_conf_merge_msec_value(conf->upstream.send_timeout, - prev->upstream.send_timeout, 60000); - - ngx_conf_merge_msec_value(conf->upstream.read_timeout, - prev->upstream.read_timeout, 60000); - - ngx_conf_merge_msec_value(conf->upstream.next_upstream_timeout, - prev->upstream.next_upstream_timeout, 0); - - ngx_conf_merge_size_value(conf->upstream.send_lowat, - prev->upstream.send_lowat, 0); - - ngx_conf_merge_size_value(conf->upstream.buffer_size, - prev->upstream.buffer_size, - (size_t) ngx_pagesize); - - ngx_conf_merge_ptr_value(conf->upstream.limit_rate, - prev->upstream.limit_rate, NULL); - - - ngx_conf_merge_bufs_value(conf->upstream.bufs, prev->upstream.bufs, - 8, ngx_pagesize); - - if (conf->upstream.bufs.num < 2) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "there must be at least 2 \"fastcgi_buffers\""); - return NGX_CONF_ERROR; - } - - - size = conf->upstream.buffer_size; - if (size < conf->upstream.bufs.size) { - size = conf->upstream.bufs.size; - } - - - ngx_conf_merge_size_value(conf->upstream.busy_buffers_size_conf, - prev->upstream.busy_buffers_size_conf, - NGX_CONF_UNSET_SIZE); - - if (conf->upstream.busy_buffers_size_conf == NGX_CONF_UNSET_SIZE) { - conf->upstream.busy_buffers_size = 2 * size; - } else { - conf->upstream.busy_buffers_size = - conf->upstream.busy_buffers_size_conf; - } - - if (conf->upstream.busy_buffers_size < size) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "\"fastcgi_busy_buffers_size\" must be equal to or greater than " - "the maximum of the value of \"fastcgi_buffer_size\" and " - "one of the \"fastcgi_buffers\""); - - return NGX_CONF_ERROR; - } - - if (conf->upstream.busy_buffers_size - > (conf->upstream.bufs.num - 1) * conf->upstream.bufs.size) - { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "\"fastcgi_busy_buffers_size\" must be less than " - "the size of all \"fastcgi_buffers\" minus one buffer"); - - return NGX_CONF_ERROR; - } - - - ngx_conf_merge_size_value(conf->upstream.temp_file_write_size_conf, - prev->upstream.temp_file_write_size_conf, - NGX_CONF_UNSET_SIZE); - - if (conf->upstream.temp_file_write_size_conf == NGX_CONF_UNSET_SIZE) { - conf->upstream.temp_file_write_size = 2 * size; - } else { - conf->upstream.temp_file_write_size = - conf->upstream.temp_file_write_size_conf; - } - - if (conf->upstream.temp_file_write_size < size) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "\"fastcgi_temp_file_write_size\" must be equal to or greater " - "than the maximum of the value of \"fastcgi_buffer_size\" and " - "one of the \"fastcgi_buffers\""); - - return NGX_CONF_ERROR; - } - - - ngx_conf_merge_size_value(conf->upstream.max_temp_file_size_conf, - prev->upstream.max_temp_file_size_conf, - NGX_CONF_UNSET_SIZE); - - if (conf->upstream.max_temp_file_size_conf == NGX_CONF_UNSET_SIZE) { - conf->upstream.max_temp_file_size = 1024 * 1024 * 1024; - } else { - conf->upstream.max_temp_file_size = - conf->upstream.max_temp_file_size_conf; - } - - if (conf->upstream.max_temp_file_size != 0 - && conf->upstream.max_temp_file_size < size) - { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "\"fastcgi_max_temp_file_size\" must be equal to zero to disable " - "temporary files usage or must be equal to or greater than " - "the maximum of the value of \"fastcgi_buffer_size\" and " - "one of the \"fastcgi_buffers\""); - - return NGX_CONF_ERROR; - } - - - ngx_conf_merge_bitmask_value(conf->upstream.ignore_headers, - prev->upstream.ignore_headers, - NGX_CONF_BITMASK_SET); - - - ngx_conf_merge_bitmask_value(conf->upstream.next_upstream, - prev->upstream.next_upstream, - (NGX_CONF_BITMASK_SET - |NGX_HTTP_UPSTREAM_FT_ERROR - |NGX_HTTP_UPSTREAM_FT_TIMEOUT)); - - if (conf->upstream.next_upstream & NGX_HTTP_UPSTREAM_FT_OFF) { - conf->upstream.next_upstream = NGX_CONF_BITMASK_SET - |NGX_HTTP_UPSTREAM_FT_OFF; - } - - if (ngx_conf_merge_path_value(cf, &conf->upstream.temp_path, - prev->upstream.temp_path, - &ngx_http_fastcgi_temp_path) - != NGX_CONF_OK) - { - return NGX_CONF_ERROR; - } - -#if (NGX_HTTP_CACHE) - - if (conf->upstream.cache == NGX_CONF_UNSET) { - ngx_conf_merge_value(conf->upstream.cache, - prev->upstream.cache, 0); - - conf->upstream.cache_zone = prev->upstream.cache_zone; - conf->upstream.cache_value = prev->upstream.cache_value; - } - - if (conf->upstream.cache_zone && conf->upstream.cache_zone->data == NULL) { - ngx_shm_zone_t *shm_zone; - - shm_zone = conf->upstream.cache_zone; - - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "\"fastcgi_cache\" zone \"%V\" is unknown", - &shm_zone->shm.name); - - return NGX_CONF_ERROR; - } - - ngx_conf_merge_uint_value(conf->upstream.cache_min_uses, - prev->upstream.cache_min_uses, 1); - - ngx_conf_merge_off_value(conf->upstream.cache_max_range_offset, - prev->upstream.cache_max_range_offset, - NGX_MAX_OFF_T_VALUE); - - ngx_conf_merge_bitmask_value(conf->upstream.cache_use_stale, - prev->upstream.cache_use_stale, - (NGX_CONF_BITMASK_SET - |NGX_HTTP_UPSTREAM_FT_OFF)); - - if (conf->upstream.cache_use_stale & NGX_HTTP_UPSTREAM_FT_OFF) { - conf->upstream.cache_use_stale = NGX_CONF_BITMASK_SET - |NGX_HTTP_UPSTREAM_FT_OFF; - } - - if (conf->upstream.cache_use_stale & NGX_HTTP_UPSTREAM_FT_ERROR) { - conf->upstream.cache_use_stale |= NGX_HTTP_UPSTREAM_FT_NOLIVE; - } - - if (conf->upstream.cache_methods == 0) { - conf->upstream.cache_methods = prev->upstream.cache_methods; - } - - conf->upstream.cache_methods |= NGX_HTTP_GET|NGX_HTTP_HEAD; - - ngx_conf_merge_ptr_value(conf->upstream.cache_bypass, - prev->upstream.cache_bypass, NULL); - - ngx_conf_merge_ptr_value(conf->upstream.no_cache, - prev->upstream.no_cache, NULL); - - ngx_conf_merge_ptr_value(conf->upstream.cache_valid, - prev->upstream.cache_valid, NULL); - - if (conf->cache_key.value.data == NULL) { - conf->cache_key = prev->cache_key; - } - - if (conf->upstream.cache && conf->cache_key.value.data == NULL) { - ngx_conf_log_error(NGX_LOG_WARN, cf, 0, - "no \"fastcgi_cache_key\" for \"fastcgi_cache\""); - } - - ngx_conf_merge_value(conf->upstream.cache_lock, - prev->upstream.cache_lock, 0); - - ngx_conf_merge_msec_value(conf->upstream.cache_lock_timeout, - prev->upstream.cache_lock_timeout, 5000); - - ngx_conf_merge_msec_value(conf->upstream.cache_lock_age, - prev->upstream.cache_lock_age, 5000); - - ngx_conf_merge_value(conf->upstream.cache_revalidate, - prev->upstream.cache_revalidate, 0); - - ngx_conf_merge_value(conf->upstream.cache_background_update, - prev->upstream.cache_background_update, 0); - -#endif - - ngx_conf_merge_value(conf->upstream.pass_request_headers, - prev->upstream.pass_request_headers, 1); - ngx_conf_merge_value(conf->upstream.pass_request_body, - prev->upstream.pass_request_body, 1); - - ngx_conf_merge_value(conf->upstream.intercept_errors, - prev->upstream.intercept_errors, 0); - - ngx_conf_merge_ptr_value(conf->catch_stderr, prev->catch_stderr, NULL); - - ngx_conf_merge_value(conf->keep_conn, prev->keep_conn, 0); - - - ngx_conf_merge_str_value(conf->index, prev->index, ""); - - hash.max_size = 512; - hash.bucket_size = ngx_align(64, ngx_cacheline_size); - hash.name = "fastcgi_hide_headers_hash"; - - if (ngx_http_upstream_hide_headers_hash(cf, &conf->upstream, - &prev->upstream, ngx_http_fastcgi_hide_headers, &hash) - != NGX_OK) - { - return NGX_CONF_ERROR; - } - - clcf = ngx_http_conf_get_module_loc_conf(cf, ngx_http_core_module); - - if (clcf->noname - && conf->upstream.upstream == NULL && conf->fastcgi_lengths == NULL) - { - conf->upstream.upstream = prev->upstream.upstream; - conf->fastcgi_lengths = prev->fastcgi_lengths; - conf->fastcgi_values = prev->fastcgi_values; - } - - if (clcf->lmt_excpt && clcf->handler == NULL - && (conf->upstream.upstream || conf->fastcgi_lengths)) - { - clcf->handler = ngx_http_fastcgi_handler; - } - -#if (NGX_PCRE) - if (conf->split_regex == NULL) { - conf->split_regex = prev->split_regex; - conf->split_name = prev->split_name; - } -#endif - - if (conf->params_source == NULL) { - conf->params = prev->params; -#if (NGX_HTTP_CACHE) - conf->params_cache = prev->params_cache; -#endif - conf->params_source = prev->params_source; - } - - rc = ngx_http_fastcgi_init_params(cf, conf, &conf->params, - ngx_http_fastcgi_headers); - if (rc != NGX_OK) { - return NGX_CONF_ERROR; - } - -#if (NGX_HTTP_CACHE) - - if (conf->upstream.cache) { - rc = ngx_http_fastcgi_init_params(cf, conf, &conf->params_cache, - ngx_http_fastcgi_cache_headers); - if (rc != NGX_OK) { - return NGX_CONF_ERROR; - } - } - -#endif - - /* - * special handling to preserve conf->params in the "http" section - * to inherit it to all servers - */ - - if (prev->params.hash.buckets == NULL - && conf->params_source == prev->params_source) - { - prev->params = conf->params; -#if (NGX_HTTP_CACHE) - prev->params_cache = conf->params_cache; -#endif - } - - return NGX_CONF_OK; -} - - -static ngx_int_t -ngx_http_fastcgi_init_params(ngx_conf_t *cf, ngx_http_fastcgi_loc_conf_t *conf, - ngx_http_fastcgi_params_t *params, ngx_keyval_t *default_params) -{ - u_char *p; - size_t size; - uintptr_t *code; - ngx_uint_t i, nsrc; - ngx_array_t headers_names, params_merged; - ngx_keyval_t *h; - ngx_hash_key_t *hk; - ngx_hash_init_t hash; - ngx_http_upstream_param_t *src, *s; - ngx_http_script_compile_t sc; - ngx_http_script_copy_code_t *copy; - - if (params->hash.buckets) { - return NGX_OK; - } - - if (conf->params_source == NULL && default_params == NULL) { - params->hash.buckets = (void *) 1; - return NGX_OK; - } - - params->lengths = ngx_array_create(cf->pool, 64, 1); - if (params->lengths == NULL) { - return NGX_ERROR; - } - - params->values = ngx_array_create(cf->pool, 512, 1); - if (params->values == NULL) { - return NGX_ERROR; - } - - if (ngx_array_init(&headers_names, cf->temp_pool, 4, sizeof(ngx_hash_key_t)) - != NGX_OK) - { - return NGX_ERROR; - } - - if (conf->params_source) { - src = conf->params_source->elts; - nsrc = conf->params_source->nelts; - - } else { - src = NULL; - nsrc = 0; - } - - if (default_params) { - if (ngx_array_init(¶ms_merged, cf->temp_pool, 4, - sizeof(ngx_http_upstream_param_t)) - != NGX_OK) - { - return NGX_ERROR; - } - - for (i = 0; i < nsrc; i++) { - - s = ngx_array_push(¶ms_merged); - if (s == NULL) { - return NGX_ERROR; - } - - *s = src[i]; - } - - h = default_params; - - while (h->key.len) { - - src = params_merged.elts; - nsrc = params_merged.nelts; - - for (i = 0; i < nsrc; i++) { - if (ngx_strcasecmp(h->key.data, src[i].key.data) == 0) { - goto next; - } - } - - s = ngx_array_push(¶ms_merged); - if (s == NULL) { - return NGX_ERROR; - } - - s->key = h->key; - s->value = h->value; - s->skip_empty = 1; - - next: - - h++; - } - - src = params_merged.elts; - nsrc = params_merged.nelts; - } - - for (i = 0; i < nsrc; i++) { - - if (src[i].key.len > sizeof("HTTP_") - 1 - && ngx_strncmp(src[i].key.data, "HTTP_", sizeof("HTTP_") - 1) == 0) - { - hk = ngx_array_push(&headers_names); - if (hk == NULL) { - return NGX_ERROR; - } - - hk->key.len = src[i].key.len - 5; - hk->key.data = src[i].key.data + 5; - hk->key_hash = ngx_hash_key_lc(hk->key.data, hk->key.len); - hk->value = (void *) 1; - - if (src[i].value.len == 0) { - continue; - } - } - - copy = ngx_array_push_n(params->lengths, - sizeof(ngx_http_script_copy_code_t)); - if (copy == NULL) { - return NGX_ERROR; - } - - copy->code = (ngx_http_script_code_pt) (void *) - ngx_http_script_copy_len_code; - copy->len = src[i].key.len; - - copy = ngx_array_push_n(params->lengths, - sizeof(ngx_http_script_copy_code_t)); - if (copy == NULL) { - return NGX_ERROR; - } - - copy->code = (ngx_http_script_code_pt) (void *) - ngx_http_script_copy_len_code; - copy->len = src[i].skip_empty; - - - size = (sizeof(ngx_http_script_copy_code_t) - + src[i].key.len + sizeof(uintptr_t) - 1) - & ~(sizeof(uintptr_t) - 1); - - copy = ngx_array_push_n(params->values, size); - if (copy == NULL) { - return NGX_ERROR; - } - - copy->code = ngx_http_script_copy_code; - copy->len = src[i].key.len; - - p = (u_char *) copy + sizeof(ngx_http_script_copy_code_t); - ngx_memcpy(p, src[i].key.data, src[i].key.len); - - - ngx_memzero(&sc, sizeof(ngx_http_script_compile_t)); - - sc.cf = cf; - sc.source = &src[i].value; - sc.flushes = ¶ms->flushes; - sc.lengths = ¶ms->lengths; - sc.values = ¶ms->values; - - if (ngx_http_script_compile(&sc) != NGX_OK) { - return NGX_ERROR; - } - - code = ngx_array_push_n(params->lengths, sizeof(uintptr_t)); - if (code == NULL) { - return NGX_ERROR; - } - - *code = (uintptr_t) NULL; - - - code = ngx_array_push_n(params->values, sizeof(uintptr_t)); - if (code == NULL) { - return NGX_ERROR; - } - - *code = (uintptr_t) NULL; - } - - code = ngx_array_push_n(params->lengths, sizeof(uintptr_t)); - if (code == NULL) { - return NGX_ERROR; - } - - *code = (uintptr_t) NULL; - - params->number = headers_names.nelts; - - hash.hash = ¶ms->hash; - hash.key = ngx_hash_key_lc; - hash.max_size = 512; - hash.bucket_size = 64; - hash.name = "fastcgi_params_hash"; - hash.pool = cf->pool; - hash.temp_pool = NULL; - - return ngx_hash_init(&hash, headers_names.elts, headers_names.nelts); -} - - -static ngx_int_t -ngx_http_fastcgi_script_name_variable(ngx_http_request_t *r, - ngx_http_variable_value_t *v, uintptr_t data) -{ - u_char *p; - ngx_http_fastcgi_ctx_t *f; - ngx_http_fastcgi_loc_conf_t *flcf; - - flcf = ngx_http_get_module_loc_conf(r, ngx_http_fastcgi_module); - - f = ngx_http_fastcgi_split(r, flcf); - - if (f == NULL) { - return NGX_ERROR; - } - - if (f->script_name.len == 0 - || f->script_name.data[f->script_name.len - 1] != '/') - { - v->len = f->script_name.len; - v->valid = 1; - v->no_cacheable = 0; - v->not_found = 0; - v->data = f->script_name.data; - - return NGX_OK; - } - - v->len = f->script_name.len + flcf->index.len; - - v->data = ngx_pnalloc(r->pool, v->len); - if (v->data == NULL) { - return NGX_ERROR; - } - - p = ngx_copy(v->data, f->script_name.data, f->script_name.len); - ngx_memcpy(p, flcf->index.data, flcf->index.len); - - return NGX_OK; -} - - -static ngx_int_t -ngx_http_fastcgi_path_info_variable(ngx_http_request_t *r, - ngx_http_variable_value_t *v, uintptr_t data) -{ - ngx_http_fastcgi_ctx_t *f; - ngx_http_fastcgi_loc_conf_t *flcf; - - flcf = ngx_http_get_module_loc_conf(r, ngx_http_fastcgi_module); - - f = ngx_http_fastcgi_split(r, flcf); - - if (f == NULL) { - return NGX_ERROR; - } - - v->len = f->path_info.len; - v->valid = 1; - v->no_cacheable = 0; - v->not_found = 0; - v->data = f->path_info.data; - - return NGX_OK; -} - - -static ngx_http_fastcgi_ctx_t * -ngx_http_fastcgi_split(ngx_http_request_t *r, ngx_http_fastcgi_loc_conf_t *flcf) -{ - ngx_http_fastcgi_ctx_t *f; -#if (NGX_PCRE) - ngx_int_t n; - int captures[(1 + 2) * 3]; - - f = ngx_http_get_module_ctx(r, ngx_http_fastcgi_module); - - if (f == NULL) { - f = ngx_pcalloc(r->pool, sizeof(ngx_http_fastcgi_ctx_t)); - if (f == NULL) { - return NULL; - } - - ngx_http_set_ctx(r, f, ngx_http_fastcgi_module); - } - - if (f->script_name.len) { - return f; - } - - if (flcf->split_regex == NULL) { - f->script_name = r->uri; - return f; - } - - n = ngx_regex_exec(flcf->split_regex, &r->uri, captures, (1 + 2) * 3); - - if (n >= 0) { /* match */ - f->script_name.len = captures[3] - captures[2]; - f->script_name.data = r->uri.data + captures[2]; - - f->path_info.len = captures[5] - captures[4]; - f->path_info.data = r->uri.data + captures[4]; - - return f; - } - - if (n == NGX_REGEX_NO_MATCHED) { - f->script_name = r->uri; - return f; - } - - ngx_log_error(NGX_LOG_ALERT, r->connection->log, 0, - ngx_regex_exec_n " failed: %i on \"%V\" using \"%V\"", - n, &r->uri, &flcf->split_name); - return NULL; - -#else - - f = ngx_http_get_module_ctx(r, ngx_http_fastcgi_module); - - if (f == NULL) { - f = ngx_pcalloc(r->pool, sizeof(ngx_http_fastcgi_ctx_t)); - if (f == NULL) { - return NULL; - } - - ngx_http_set_ctx(r, f, ngx_http_fastcgi_module); - } - - f->script_name = r->uri; - - return f; - -#endif -} - - -static char * -ngx_http_fastcgi_pass(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) -{ - ngx_http_fastcgi_loc_conf_t *flcf = conf; - - ngx_url_t u; - ngx_str_t *value, *url; - ngx_uint_t n; - ngx_http_core_loc_conf_t *clcf; - ngx_http_script_compile_t sc; - - if (flcf->upstream.upstream || flcf->fastcgi_lengths) { - return "is duplicate"; - } - - clcf = ngx_http_conf_get_module_loc_conf(cf, ngx_http_core_module); - - clcf->handler = ngx_http_fastcgi_handler; - - if (clcf->name.len && clcf->name.data[clcf->name.len - 1] == '/') { - clcf->auto_redirect = 1; - } - - value = cf->args->elts; - - url = &value[1]; - - n = ngx_http_script_variables_count(url); - - if (n) { - - ngx_memzero(&sc, sizeof(ngx_http_script_compile_t)); - - sc.cf = cf; - sc.source = url; - sc.lengths = &flcf->fastcgi_lengths; - sc.values = &flcf->fastcgi_values; - sc.variables = n; - sc.complete_lengths = 1; - sc.complete_values = 1; - - if (ngx_http_script_compile(&sc) != NGX_OK) { - return NGX_CONF_ERROR; - } - - return NGX_CONF_OK; - } - - ngx_memzero(&u, sizeof(ngx_url_t)); - - u.url = value[1]; - u.no_resolve = 1; - - flcf->upstream.upstream = ngx_http_upstream_add(cf, &u, 0); - if (flcf->upstream.upstream == NULL) { - return NGX_CONF_ERROR; - } - - return NGX_CONF_OK; -} - - -static char * -ngx_http_fastcgi_split_path_info(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) -{ -#if (NGX_PCRE) - ngx_http_fastcgi_loc_conf_t *flcf = conf; - - ngx_str_t *value; - ngx_regex_compile_t rc; - u_char errstr[NGX_MAX_CONF_ERRSTR]; - - value = cf->args->elts; - - flcf->split_name = value[1]; - - ngx_memzero(&rc, sizeof(ngx_regex_compile_t)); - - rc.pattern = value[1]; - rc.pool = cf->pool; - rc.err.len = NGX_MAX_CONF_ERRSTR; - rc.err.data = errstr; - - if (ngx_regex_compile(&rc) != NGX_OK) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, "%V", &rc.err); - return NGX_CONF_ERROR; - } - - if (rc.captures != 2) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "pattern \"%V\" must have 2 captures", &value[1]); - return NGX_CONF_ERROR; - } - - flcf->split_regex = rc.regex; - - return NGX_CONF_OK; - -#else - - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "\"%V\" requires PCRE library", &cmd->name); - return NGX_CONF_ERROR; - -#endif -} - - -static char * -ngx_http_fastcgi_store(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) -{ - ngx_http_fastcgi_loc_conf_t *flcf = conf; - - ngx_str_t *value; - ngx_http_script_compile_t sc; - - if (flcf->upstream.store != NGX_CONF_UNSET) { - return "is duplicate"; - } - - value = cf->args->elts; - - if (ngx_strcmp(value[1].data, "off") == 0) { - flcf->upstream.store = 0; - return NGX_CONF_OK; - } - - if (value[1].len == 0) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, "empty path"); - return NGX_CONF_ERROR; - } - -#if (NGX_HTTP_CACHE) - if (flcf->upstream.cache > 0) { - return "is incompatible with \"fastcgi_cache\""; - } -#endif - - flcf->upstream.store = 1; - - if (ngx_strcmp(value[1].data, "on") == 0) { - return NGX_CONF_OK; - } - - /* include the terminating '\0' into script */ - value[1].len++; - - ngx_memzero(&sc, sizeof(ngx_http_script_compile_t)); - - sc.cf = cf; - sc.source = &value[1]; - sc.lengths = &flcf->upstream.store_lengths; - sc.values = &flcf->upstream.store_values; - sc.variables = ngx_http_script_variables_count(&value[1]); - sc.complete_lengths = 1; - sc.complete_values = 1; - - if (ngx_http_script_compile(&sc) != NGX_OK) { - return NGX_CONF_ERROR; - } - - return NGX_CONF_OK; -} - - -#if (NGX_HTTP_CACHE) - -static char * -ngx_http_fastcgi_cache(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) -{ - ngx_http_fastcgi_loc_conf_t *flcf = conf; - - ngx_str_t *value; - ngx_http_complex_value_t cv; - ngx_http_compile_complex_value_t ccv; - - value = cf->args->elts; - - if (flcf->upstream.cache != NGX_CONF_UNSET) { - return "is duplicate"; - } - - if (ngx_strcmp(value[1].data, "off") == 0) { - flcf->upstream.cache = 0; - return NGX_CONF_OK; - } - - if (flcf->upstream.store > 0) { - return "is incompatible with \"fastcgi_store\""; - } - - flcf->upstream.cache = 1; - - ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t)); - - ccv.cf = cf; - ccv.value = &value[1]; - ccv.complex_value = &cv; - - if (ngx_http_compile_complex_value(&ccv) != NGX_OK) { - return NGX_CONF_ERROR; - } - - if (cv.lengths != NULL) { - - flcf->upstream.cache_value = ngx_palloc(cf->pool, - sizeof(ngx_http_complex_value_t)); - if (flcf->upstream.cache_value == NULL) { - return NGX_CONF_ERROR; - } - - *flcf->upstream.cache_value = cv; - - return NGX_CONF_OK; - } - - flcf->upstream.cache_zone = ngx_shared_memory_add(cf, &value[1], 0, - &ngx_http_fastcgi_module); - if (flcf->upstream.cache_zone == NULL) { - return NGX_CONF_ERROR; - } - - return NGX_CONF_OK; -} - - -static char * -ngx_http_fastcgi_cache_key(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) -{ - ngx_http_fastcgi_loc_conf_t *flcf = conf; - - ngx_str_t *value; - ngx_http_compile_complex_value_t ccv; - - value = cf->args->elts; - - if (flcf->cache_key.value.data) { - return "is duplicate"; - } - - ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t)); - - ccv.cf = cf; - ccv.value = &value[1]; - ccv.complex_value = &flcf->cache_key; - - if (ngx_http_compile_complex_value(&ccv) != NGX_OK) { - return NGX_CONF_ERROR; - } - - return NGX_CONF_OK; -} - -#endif - - -static char * -ngx_http_fastcgi_lowat_check(ngx_conf_t *cf, void *post, void *data) -{ -#if (NGX_FREEBSD) - ssize_t *np = data; - - if ((u_long) *np >= ngx_freebsd_net_inet_tcp_sendspace) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "\"fastcgi_send_lowat\" must be less than %d " - "(sysctl net.inet.tcp.sendspace)", - ngx_freebsd_net_inet_tcp_sendspace); - - return NGX_CONF_ERROR; - } - -#elif !(NGX_HAVE_SO_SNDLOWAT) - ssize_t *np = data; - - ngx_conf_log_error(NGX_LOG_WARN, cf, 0, - "\"fastcgi_send_lowat\" is not supported, ignored"); - - *np = 0; - -#endif - - return NGX_CONF_OK; -} diff --git a/src/deps/src/nginx-1.30.3/src/http/modules/ngx_http_flv_module.c b/src/deps/src/nginx-1.30.3/src/http/modules/ngx_http_flv_module.c deleted file mode 100644 index ef2bff433f..0000000000 --- a/src/deps/src/nginx-1.30.3/src/http/modules/ngx_http_flv_module.c +++ /dev/null @@ -1,261 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - -#include -#include -#include - - -static char *ngx_http_flv(ngx_conf_t *cf, ngx_command_t *cmd, void *conf); - -static ngx_command_t ngx_http_flv_commands[] = { - - { ngx_string("flv"), - NGX_HTTP_LOC_CONF|NGX_CONF_NOARGS, - ngx_http_flv, - 0, - 0, - NULL }, - - ngx_null_command -}; - - -static u_char ngx_flv_header[] = "FLV\x1\x5\0\0\0\x9\0\0\0\0"; - - -static ngx_http_module_t ngx_http_flv_module_ctx = { - NULL, /* preconfiguration */ - NULL, /* postconfiguration */ - - NULL, /* create main configuration */ - NULL, /* init main configuration */ - - NULL, /* create server configuration */ - NULL, /* merge server configuration */ - - NULL, /* create location configuration */ - NULL /* merge location configuration */ -}; - - -ngx_module_t ngx_http_flv_module = { - NGX_MODULE_V1, - &ngx_http_flv_module_ctx, /* module context */ - ngx_http_flv_commands, /* module directives */ - NGX_HTTP_MODULE, /* module type */ - NULL, /* init master */ - NULL, /* init module */ - NULL, /* init process */ - NULL, /* init thread */ - NULL, /* exit thread */ - NULL, /* exit process */ - NULL, /* exit master */ - NGX_MODULE_V1_PADDING -}; - - -static ngx_int_t -ngx_http_flv_handler(ngx_http_request_t *r) -{ - u_char *last; - off_t start, len; - size_t root; - ngx_int_t rc; - ngx_uint_t level, i; - ngx_str_t path, value; - ngx_log_t *log; - ngx_buf_t *b; - ngx_chain_t out[2]; - ngx_open_file_info_t of; - ngx_http_core_loc_conf_t *clcf; - - if (!(r->method & (NGX_HTTP_GET|NGX_HTTP_HEAD))) { - return NGX_HTTP_NOT_ALLOWED; - } - - if (r->uri.data[r->uri.len - 1] == '/') { - return NGX_DECLINED; - } - - rc = ngx_http_discard_request_body(r); - - if (rc != NGX_OK) { - return rc; - } - - last = ngx_http_map_uri_to_path(r, &path, &root, 0); - if (last == NULL) { - return NGX_HTTP_INTERNAL_SERVER_ERROR; - } - - log = r->connection->log; - - path.len = last - path.data; - - ngx_log_debug1(NGX_LOG_DEBUG_HTTP, log, 0, - "http flv filename: \"%V\"", &path); - - clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module); - - ngx_memzero(&of, sizeof(ngx_open_file_info_t)); - - of.read_ahead = clcf->read_ahead; - of.directio = clcf->directio; - of.valid = clcf->open_file_cache_valid; - of.min_uses = clcf->open_file_cache_min_uses; - of.errors = clcf->open_file_cache_errors; - of.events = clcf->open_file_cache_events; - - if (ngx_http_set_disable_symlinks(r, clcf, &path, &of) != NGX_OK) { - return NGX_HTTP_INTERNAL_SERVER_ERROR; - } - - if (ngx_open_cached_file(clcf->open_file_cache, &path, &of, r->pool) - != NGX_OK) - { - switch (of.err) { - - case 0: - return NGX_HTTP_INTERNAL_SERVER_ERROR; - - case NGX_ENOENT: - case NGX_ENOTDIR: - case NGX_ENAMETOOLONG: - - level = NGX_LOG_ERR; - rc = NGX_HTTP_NOT_FOUND; - break; - - case NGX_EACCES: -#if (NGX_HAVE_OPENAT) - case NGX_EMLINK: - case NGX_ELOOP: -#endif - - level = NGX_LOG_ERR; - rc = NGX_HTTP_FORBIDDEN; - break; - - default: - - level = NGX_LOG_CRIT; - rc = NGX_HTTP_INTERNAL_SERVER_ERROR; - break; - } - - if (rc != NGX_HTTP_NOT_FOUND || clcf->log_not_found) { - ngx_log_error(level, log, of.err, - "%s \"%s\" failed", of.failed, path.data); - } - - return rc; - } - - if (!of.is_file) { - return NGX_DECLINED; - } - - r->root_tested = !r->error_page; - - start = 0; - len = of.size; - i = 1; - - if (r->args.len) { - - if (ngx_http_arg(r, (u_char *) "start", 5, &value) == NGX_OK) { - - start = ngx_atoof(value.data, value.len); - - if (start == NGX_ERROR || start >= len) { - start = 0; - } - - if (start) { - len = sizeof(ngx_flv_header) - 1 + len - start; - i = 0; - } - } - } - - log->action = "sending flv to client"; - - r->headers_out.status = NGX_HTTP_OK; - r->headers_out.content_length_n = len; - r->headers_out.last_modified_time = of.mtime; - - if (ngx_http_set_etag(r) != NGX_OK) { - return NGX_HTTP_INTERNAL_SERVER_ERROR; - } - - if (ngx_http_set_content_type(r) != NGX_OK) { - return NGX_HTTP_INTERNAL_SERVER_ERROR; - } - - if (i == 0) { - b = ngx_calloc_buf(r->pool); - if (b == NULL) { - return NGX_HTTP_INTERNAL_SERVER_ERROR; - } - - b->pos = ngx_flv_header; - b->last = ngx_flv_header + sizeof(ngx_flv_header) - 1; - b->memory = 1; - - out[0].buf = b; - out[0].next = &out[1]; - } - - - b = ngx_calloc_buf(r->pool); - if (b == NULL) { - return NGX_HTTP_INTERNAL_SERVER_ERROR; - } - - b->file = ngx_pcalloc(r->pool, sizeof(ngx_file_t)); - if (b->file == NULL) { - return NGX_HTTP_INTERNAL_SERVER_ERROR; - } - - r->allow_ranges = 1; - - rc = ngx_http_send_header(r); - - if (rc == NGX_ERROR || rc > NGX_OK || r->header_only) { - return rc; - } - - b->file_pos = start; - b->file_last = of.size; - - b->in_file = b->file_last ? 1 : 0; - b->last_buf = (r == r->main) ? 1 : 0; - b->last_in_chain = 1; - b->sync = (b->last_buf || b->in_file) ? 0 : 1; - - b->file->fd = of.fd; - b->file->name = path; - b->file->log = log; - b->file->directio = of.is_directio; - - out[1].buf = b; - out[1].next = NULL; - - return ngx_http_output_filter(r, &out[i]); -} - - -static char * -ngx_http_flv(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) -{ - ngx_http_core_loc_conf_t *clcf; - - clcf = ngx_http_conf_get_module_loc_conf(cf, ngx_http_core_module); - clcf->handler = ngx_http_flv_handler; - - return NGX_CONF_OK; -} diff --git a/src/deps/src/nginx-1.30.3/src/http/modules/ngx_http_geo_module.c b/src/deps/src/nginx-1.30.3/src/http/modules/ngx_http_geo_module.c deleted file mode 100644 index 5018e1abb5..0000000000 --- a/src/deps/src/nginx-1.30.3/src/http/modules/ngx_http_geo_module.c +++ /dev/null @@ -1,1696 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#include -#include -#include - - -typedef struct { - ngx_http_variable_value_t *value; - u_short start; - u_short end; -} ngx_http_geo_range_t; - - -typedef struct { - ngx_radix_tree_t *tree; -#if (NGX_HAVE_INET6) - ngx_radix_tree_t *tree6; -#endif -} ngx_http_geo_trees_t; - - -typedef struct { - ngx_http_geo_range_t **low; - ngx_http_variable_value_t *default_value; -} ngx_http_geo_high_ranges_t; - - -typedef struct { - ngx_str_node_t sn; - ngx_http_variable_value_t *value; - size_t offset; -} ngx_http_geo_variable_value_node_t; - - -typedef struct { - ngx_http_variable_value_t *value; - ngx_str_t *net; - ngx_http_geo_high_ranges_t high; - ngx_radix_tree_t *tree; -#if (NGX_HAVE_INET6) - ngx_radix_tree_t *tree6; -#endif - ngx_rbtree_t rbtree; - ngx_rbtree_node_t sentinel; - ngx_array_t *proxies; - ngx_pool_t *pool; - ngx_pool_t *temp_pool; - - size_t data_size; - - ngx_str_t include_name; - ngx_uint_t includes; - ngx_uint_t entries; - - unsigned ranges:1; - unsigned outside_entries:1; - unsigned allow_binary_include:1; - unsigned binary_include:1; - unsigned proxy_recursive:1; - unsigned no_cacheable:1; -} ngx_http_geo_conf_ctx_t; - - -typedef struct { - union { - ngx_http_geo_trees_t trees; - ngx_http_geo_high_ranges_t high; - } u; - - ngx_array_t *proxies; - unsigned proxy_recursive:1; - - ngx_int_t index; -} ngx_http_geo_ctx_t; - - -static ngx_int_t ngx_http_geo_addr(ngx_http_request_t *r, - ngx_http_geo_ctx_t *ctx, ngx_addr_t *addr); -static ngx_int_t ngx_http_geo_real_addr(ngx_http_request_t *r, - ngx_http_geo_ctx_t *ctx, ngx_addr_t *addr); -static char *ngx_http_geo_block(ngx_conf_t *cf, ngx_command_t *cmd, void *conf); -static char *ngx_http_geo(ngx_conf_t *cf, ngx_command_t *dummy, void *conf); -static char *ngx_http_geo_range(ngx_conf_t *cf, ngx_http_geo_conf_ctx_t *ctx, - ngx_str_t *value); -static char *ngx_http_geo_add_range(ngx_conf_t *cf, - ngx_http_geo_conf_ctx_t *ctx, in_addr_t start, in_addr_t end); -static ngx_uint_t ngx_http_geo_delete_range(ngx_conf_t *cf, - ngx_http_geo_conf_ctx_t *ctx, in_addr_t start, in_addr_t end); -static char *ngx_http_geo_cidr(ngx_conf_t *cf, ngx_http_geo_conf_ctx_t *ctx, - ngx_str_t *value); -static char *ngx_http_geo_cidr_add(ngx_conf_t *cf, ngx_http_geo_conf_ctx_t *ctx, - ngx_cidr_t *cidr, ngx_str_t *value, ngx_str_t *net); -static ngx_http_variable_value_t *ngx_http_geo_value(ngx_conf_t *cf, - ngx_http_geo_conf_ctx_t *ctx, ngx_str_t *value); -static char *ngx_http_geo_add_proxy(ngx_conf_t *cf, - ngx_http_geo_conf_ctx_t *ctx, ngx_cidr_t *cidr); -static ngx_int_t ngx_http_geo_cidr_value(ngx_conf_t *cf, ngx_str_t *net, - ngx_cidr_t *cidr); -static char *ngx_http_geo_include(ngx_conf_t *cf, ngx_http_geo_conf_ctx_t *ctx, - ngx_str_t *name); -static ngx_int_t ngx_http_geo_include_binary_base(ngx_conf_t *cf, - ngx_http_geo_conf_ctx_t *ctx, ngx_str_t *name); -static void ngx_http_geo_create_binary_base(ngx_http_geo_conf_ctx_t *ctx); -static u_char *ngx_http_geo_copy_values(u_char *base, u_char *p, - ngx_rbtree_node_t *node, ngx_rbtree_node_t *sentinel); - - -static ngx_command_t ngx_http_geo_commands[] = { - - { ngx_string("geo"), - NGX_HTTP_MAIN_CONF|NGX_CONF_BLOCK|NGX_CONF_TAKE12, - ngx_http_geo_block, - NGX_HTTP_MAIN_CONF_OFFSET, - 0, - NULL }, - - ngx_null_command -}; - - -static ngx_http_module_t ngx_http_geo_module_ctx = { - NULL, /* preconfiguration */ - NULL, /* postconfiguration */ - - NULL, /* create main configuration */ - NULL, /* init main configuration */ - - NULL, /* create server configuration */ - NULL, /* merge server configuration */ - - NULL, /* create location configuration */ - NULL /* merge location configuration */ -}; - - -ngx_module_t ngx_http_geo_module = { - NGX_MODULE_V1, - &ngx_http_geo_module_ctx, /* module context */ - ngx_http_geo_commands, /* module directives */ - NGX_HTTP_MODULE, /* module type */ - NULL, /* init master */ - NULL, /* init module */ - NULL, /* init process */ - NULL, /* init thread */ - NULL, /* exit thread */ - NULL, /* exit process */ - NULL, /* exit master */ - NGX_MODULE_V1_PADDING -}; - - -typedef struct { - u_char GEORNG[6]; - u_char version; - u_char ptr_size; - uint32_t endianness; - uint32_t crc32; -} ngx_http_geo_header_t; - - -static ngx_http_geo_header_t ngx_http_geo_header = { - { 'G', 'E', 'O', 'R', 'N', 'G' }, 0, sizeof(void *), 0x12345678, 0 -}; - - -/* geo range is AF_INET only */ - -static ngx_int_t -ngx_http_geo_cidr_variable(ngx_http_request_t *r, ngx_http_variable_value_t *v, - uintptr_t data) -{ - ngx_http_geo_ctx_t *ctx = (ngx_http_geo_ctx_t *) data; - - in_addr_t inaddr; - ngx_addr_t addr; - struct sockaddr_in *sin; - ngx_http_variable_value_t *vv; -#if (NGX_HAVE_INET6) - u_char *p; - struct in6_addr *inaddr6; -#endif - - if (ngx_http_geo_addr(r, ctx, &addr) != NGX_OK) { - vv = (ngx_http_variable_value_t *) - ngx_radix32tree_find(ctx->u.trees.tree, INADDR_NONE); - goto done; - } - - switch (addr.sockaddr->sa_family) { - -#if (NGX_HAVE_INET6) - case AF_INET6: - inaddr6 = &((struct sockaddr_in6 *) addr.sockaddr)->sin6_addr; - p = inaddr6->s6_addr; - - if (IN6_IS_ADDR_V4MAPPED(inaddr6)) { - inaddr = (in_addr_t) p[12] << 24; - inaddr += p[13] << 16; - inaddr += p[14] << 8; - inaddr += p[15]; - - vv = (ngx_http_variable_value_t *) - ngx_radix32tree_find(ctx->u.trees.tree, inaddr); - - } else { - vv = (ngx_http_variable_value_t *) - ngx_radix128tree_find(ctx->u.trees.tree6, p); - } - - break; -#endif - -#if (NGX_HAVE_UNIX_DOMAIN) - case AF_UNIX: - vv = (ngx_http_variable_value_t *) - ngx_radix32tree_find(ctx->u.trees.tree, INADDR_NONE); - break; -#endif - - default: /* AF_INET */ - sin = (struct sockaddr_in *) addr.sockaddr; - inaddr = ntohl(sin->sin_addr.s_addr); - - vv = (ngx_http_variable_value_t *) - ngx_radix32tree_find(ctx->u.trees.tree, inaddr); - - break; - } - -done: - - *v = *vv; - - ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "http geo: %v", v); - - return NGX_OK; -} - - -static ngx_int_t -ngx_http_geo_range_variable(ngx_http_request_t *r, ngx_http_variable_value_t *v, - uintptr_t data) -{ - ngx_http_geo_ctx_t *ctx = (ngx_http_geo_ctx_t *) data; - - in_addr_t inaddr; - ngx_addr_t addr; - ngx_uint_t n; - struct sockaddr_in *sin; - ngx_http_geo_range_t *range; -#if (NGX_HAVE_INET6) - u_char *p; - struct in6_addr *inaddr6; -#endif - - *v = *ctx->u.high.default_value; - - if (ngx_http_geo_addr(r, ctx, &addr) == NGX_OK) { - - switch (addr.sockaddr->sa_family) { - -#if (NGX_HAVE_INET6) - case AF_INET6: - inaddr6 = &((struct sockaddr_in6 *) addr.sockaddr)->sin6_addr; - - if (IN6_IS_ADDR_V4MAPPED(inaddr6)) { - p = inaddr6->s6_addr; - - inaddr = (in_addr_t) p[12] << 24; - inaddr += p[13] << 16; - inaddr += p[14] << 8; - inaddr += p[15]; - - } else { - inaddr = INADDR_NONE; - } - - break; -#endif - -#if (NGX_HAVE_UNIX_DOMAIN) - case AF_UNIX: - inaddr = INADDR_NONE; - break; -#endif - - default: /* AF_INET */ - sin = (struct sockaddr_in *) addr.sockaddr; - inaddr = ntohl(sin->sin_addr.s_addr); - break; - } - - } else { - inaddr = INADDR_NONE; - } - - if (ctx->u.high.low) { - range = ctx->u.high.low[inaddr >> 16]; - - if (range) { - n = inaddr & 0xffff; - do { - if (n >= (ngx_uint_t) range->start - && n <= (ngx_uint_t) range->end) - { - *v = *range->value; - break; - } - } while ((++range)->value); - } - } - - ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "http geo: %v", v); - - return NGX_OK; -} - - -static ngx_int_t -ngx_http_geo_addr(ngx_http_request_t *r, ngx_http_geo_ctx_t *ctx, - ngx_addr_t *addr) -{ - ngx_table_elt_t *xfwd; - - if (ngx_http_geo_real_addr(r, ctx, addr) != NGX_OK) { - return NGX_ERROR; - } - - xfwd = r->headers_in.x_forwarded_for; - - if (xfwd != NULL && ctx->proxies != NULL) { - (void) ngx_http_get_forwarded_addr(r, addr, xfwd, NULL, - ctx->proxies, ctx->proxy_recursive); - } - - return NGX_OK; -} - - -static ngx_int_t -ngx_http_geo_real_addr(ngx_http_request_t *r, ngx_http_geo_ctx_t *ctx, - ngx_addr_t *addr) -{ - ngx_http_variable_value_t *v; - - if (ctx->index == -1) { - ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "http geo started: %V", &r->connection->addr_text); - - addr->sockaddr = r->connection->sockaddr; - addr->socklen = r->connection->socklen; - /* addr->name = r->connection->addr_text; */ - - return NGX_OK; - } - - v = ngx_http_get_flushed_variable(r, ctx->index); - - if (v == NULL || v->not_found) { - ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "http geo not found"); - - return NGX_ERROR; - } - - ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "http geo started: %v", v); - - if (ngx_parse_addr(r->pool, addr, v->data, v->len) == NGX_OK) { - return NGX_OK; - } - - return NGX_ERROR; -} - - -static char * -ngx_http_geo_block(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) -{ - char *rv; - size_t len; - ngx_str_t *value, name; - ngx_uint_t i; - ngx_conf_t save; - ngx_pool_t *pool; - ngx_array_t *a; - ngx_http_variable_t *var; - ngx_http_geo_ctx_t *geo; - ngx_http_geo_conf_ctx_t ctx; -#if (NGX_HAVE_INET6) - static struct in6_addr zero; -#endif - - value = cf->args->elts; - - geo = ngx_palloc(cf->pool, sizeof(ngx_http_geo_ctx_t)); - if (geo == NULL) { - return NGX_CONF_ERROR; - } - - name = value[1]; - - if (name.data[0] != '$') { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "invalid variable name \"%V\"", &name); - return NGX_CONF_ERROR; - } - - name.len--; - name.data++; - - if (cf->args->nelts == 3) { - - geo->index = ngx_http_get_variable_index(cf, &name); - if (geo->index == NGX_ERROR) { - return NGX_CONF_ERROR; - } - - name = value[2]; - - if (name.data[0] != '$') { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "invalid variable name \"%V\"", &name); - return NGX_CONF_ERROR; - } - - name.len--; - name.data++; - - } else { - geo->index = -1; - } - - var = ngx_http_add_variable(cf, &name, NGX_HTTP_VAR_CHANGEABLE); - if (var == NULL) { - return NGX_CONF_ERROR; - } - - pool = ngx_create_pool(NGX_DEFAULT_POOL_SIZE, cf->log); - if (pool == NULL) { - return NGX_CONF_ERROR; - } - - ngx_memzero(&ctx, sizeof(ngx_http_geo_conf_ctx_t)); - - ctx.temp_pool = ngx_create_pool(NGX_DEFAULT_POOL_SIZE, cf->log); - if (ctx.temp_pool == NULL) { - ngx_destroy_pool(pool); - return NGX_CONF_ERROR; - } - - ngx_rbtree_init(&ctx.rbtree, &ctx.sentinel, ngx_str_rbtree_insert_value); - - ctx.pool = cf->pool; - ctx.data_size = sizeof(ngx_http_geo_header_t) - + sizeof(ngx_http_variable_value_t) - + 0x10000 * sizeof(ngx_http_geo_range_t *); - ctx.allow_binary_include = 1; - ctx.no_cacheable = 0; - - save = *cf; - cf->pool = pool; - cf->ctx = &ctx; - cf->handler = ngx_http_geo; - cf->handler_conf = conf; - - rv = ngx_conf_parse(cf, NULL); - - *cf = save; - - if (rv != NGX_CONF_OK) { - goto failed; - } - - if (ctx.no_cacheable) { - var->flags |= NGX_HTTP_VAR_NOCACHEABLE; - } - - geo->proxies = ctx.proxies; - geo->proxy_recursive = ctx.proxy_recursive; - - if (ctx.ranges) { - - if (ctx.high.low && !ctx.binary_include) { - for (i = 0; i < 0x10000; i++) { - a = (ngx_array_t *) ctx.high.low[i]; - - if (a == NULL) { - continue; - } - - if (a->nelts == 0) { - ctx.high.low[i] = NULL; - continue; - } - - len = a->nelts * sizeof(ngx_http_geo_range_t); - - ctx.high.low[i] = ngx_palloc(cf->pool, len + sizeof(void *)); - if (ctx.high.low[i] == NULL) { - goto failed; - } - - ngx_memcpy(ctx.high.low[i], a->elts, len); - ctx.high.low[i][a->nelts].value = NULL; - ctx.data_size += len + sizeof(void *); - } - - if (ctx.allow_binary_include - && !ctx.outside_entries - && ctx.entries > 100000 - && ctx.includes == 1) - { - ngx_http_geo_create_binary_base(&ctx); - } - } - - if (ctx.high.default_value == NULL) { - ctx.high.default_value = &ngx_http_variable_null_value; - } - - geo->u.high = ctx.high; - - var->get_handler = ngx_http_geo_range_variable; - var->data = (uintptr_t) geo; - - } else { - if (ctx.tree == NULL) { - ctx.tree = ngx_radix_tree_create(cf->pool, -1); - if (ctx.tree == NULL) { - goto failed; - } - } - - geo->u.trees.tree = ctx.tree; - -#if (NGX_HAVE_INET6) - if (ctx.tree6 == NULL) { - ctx.tree6 = ngx_radix_tree_create(cf->pool, -1); - if (ctx.tree6 == NULL) { - goto failed; - } - } - - geo->u.trees.tree6 = ctx.tree6; -#endif - - var->get_handler = ngx_http_geo_cidr_variable; - var->data = (uintptr_t) geo; - - if (ngx_radix32tree_insert(ctx.tree, 0, 0, - (uintptr_t) &ngx_http_variable_null_value) - == NGX_ERROR) - { - goto failed; - } - - /* NGX_BUSY is okay (default was set explicitly) */ - -#if (NGX_HAVE_INET6) - if (ngx_radix128tree_insert(ctx.tree6, zero.s6_addr, zero.s6_addr, - (uintptr_t) &ngx_http_variable_null_value) - == NGX_ERROR) - { - goto failed; - } -#endif - } - - ngx_destroy_pool(ctx.temp_pool); - ngx_destroy_pool(pool); - - return NGX_CONF_OK; - -failed: - - ngx_destroy_pool(ctx.temp_pool); - ngx_destroy_pool(pool); - - return NGX_CONF_ERROR; -} - - -static char * -ngx_http_geo(ngx_conf_t *cf, ngx_command_t *dummy, void *conf) -{ - char *rv; - ngx_str_t *value; - ngx_cidr_t cidr; - ngx_http_geo_conf_ctx_t *ctx; - - ctx = cf->ctx; - - value = cf->args->elts; - - if (cf->args->nelts == 1) { - - if (ngx_strcmp(value[0].data, "ranges") == 0) { - - if (ctx->tree -#if (NGX_HAVE_INET6) - || ctx->tree6 -#endif - ) - { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "the \"ranges\" directive must be " - "the first directive inside \"geo\" block"); - goto failed; - } - - ctx->ranges = 1; - - rv = NGX_CONF_OK; - - goto done; - } - - else if (ngx_strcmp(value[0].data, "proxy_recursive") == 0) { - ctx->proxy_recursive = 1; - rv = NGX_CONF_OK; - goto done; - } - - else if (ngx_strcmp(value[0].data, "volatile") == 0) { - ctx->no_cacheable = 1; - rv = NGX_CONF_OK; - goto done; - } - } - - if (cf->args->nelts != 2) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "invalid number of the geo parameters"); - goto failed; - } - - if (ngx_strcmp(value[0].data, "include") == 0) { - - if (strpbrk((char *) value[1].data, "*?[") == NULL) { - rv = ngx_http_geo_include(cf, ctx, &value[1]); - - } else { - rv = ngx_conf_include(cf, dummy, conf); - } - - goto done; - - } else if (ngx_strcmp(value[0].data, "proxy") == 0) { - - if (ngx_http_geo_cidr_value(cf, &value[1], &cidr) != NGX_OK) { - goto failed; - } - - rv = ngx_http_geo_add_proxy(cf, ctx, &cidr); - - goto done; - } - - if (ctx->ranges) { - rv = ngx_http_geo_range(cf, ctx, value); - - } else { - rv = ngx_http_geo_cidr(cf, ctx, value); - } - -done: - - ngx_reset_pool(cf->pool); - - return rv; - -failed: - - ngx_reset_pool(cf->pool); - - return NGX_CONF_ERROR; -} - - -static char * -ngx_http_geo_range(ngx_conf_t *cf, ngx_http_geo_conf_ctx_t *ctx, - ngx_str_t *value) -{ - u_char *p, *last; - in_addr_t start, end; - ngx_str_t *net; - ngx_uint_t del; - - if (ngx_strcmp(value[0].data, "default") == 0) { - - if (ctx->high.default_value) { - ngx_conf_log_error(NGX_LOG_WARN, cf, 0, - "duplicate default geo range value: \"%V\", old value: \"%v\"", - &value[1], ctx->high.default_value); - } - - ctx->high.default_value = ngx_http_geo_value(cf, ctx, &value[1]); - if (ctx->high.default_value == NULL) { - return NGX_CONF_ERROR; - } - - return NGX_CONF_OK; - } - - if (ctx->binary_include) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "binary geo range base \"%s\" cannot be mixed with usual entries", - ctx->include_name.data); - return NGX_CONF_ERROR; - } - - if (ctx->high.low == NULL) { - ctx->high.low = ngx_pcalloc(ctx->pool, - 0x10000 * sizeof(ngx_http_geo_range_t *)); - if (ctx->high.low == NULL) { - return NGX_CONF_ERROR; - } - } - - ctx->entries++; - ctx->outside_entries = 1; - - if (ngx_strcmp(value[0].data, "delete") == 0) { - net = &value[1]; - del = 1; - - } else { - net = &value[0]; - del = 0; - } - - last = net->data + net->len; - - p = ngx_strlchr(net->data, last, '-'); - - if (p == NULL) { - goto invalid; - } - - start = ngx_inet_addr(net->data, p - net->data); - - if (start == INADDR_NONE) { - goto invalid; - } - - start = ntohl(start); - - p++; - - end = ngx_inet_addr(p, last - p); - - if (end == INADDR_NONE) { - goto invalid; - } - - end = ntohl(end); - - if (start > end) { - goto invalid; - } - - if (del) { - if (ngx_http_geo_delete_range(cf, ctx, start, end)) { - ngx_conf_log_error(NGX_LOG_WARN, cf, 0, - "no address range \"%V\" to delete", net); - } - - return NGX_CONF_OK; - } - - ctx->value = ngx_http_geo_value(cf, ctx, &value[1]); - - if (ctx->value == NULL) { - return NGX_CONF_ERROR; - } - - ctx->net = net; - - return ngx_http_geo_add_range(cf, ctx, start, end); - -invalid: - - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, "invalid range \"%V\"", net); - - return NGX_CONF_ERROR; -} - - -/* the add procedure is optimized to add a growing up sequence */ - -static char * -ngx_http_geo_add_range(ngx_conf_t *cf, ngx_http_geo_conf_ctx_t *ctx, - in_addr_t start, in_addr_t end) -{ - in_addr_t n; - ngx_uint_t h, i, s, e; - ngx_array_t *a; - ngx_http_geo_range_t *range; - - for (n = start; n <= end; n = (n + 0x10000) & 0xffff0000) { - - h = n >> 16; - - if (n == start) { - s = n & 0xffff; - } else { - s = 0; - } - - if ((n | 0xffff) > end) { - e = end & 0xffff; - - } else { - e = 0xffff; - } - - a = (ngx_array_t *) ctx->high.low[h]; - - if (a == NULL) { - a = ngx_array_create(ctx->temp_pool, 64, - sizeof(ngx_http_geo_range_t)); - if (a == NULL) { - return NGX_CONF_ERROR; - } - - ctx->high.low[h] = (ngx_http_geo_range_t *) a; - } - - i = a->nelts; - range = a->elts; - - while (i) { - - i--; - - if (e < (ngx_uint_t) range[i].start) { - continue; - } - - if (s > (ngx_uint_t) range[i].end) { - - /* add after the range */ - - range = ngx_array_push(a); - if (range == NULL) { - return NGX_CONF_ERROR; - } - - range = a->elts; - - ngx_memmove(&range[i + 2], &range[i + 1], - (a->nelts - 2 - i) * sizeof(ngx_http_geo_range_t)); - - range[i + 1].start = (u_short) s; - range[i + 1].end = (u_short) e; - range[i + 1].value = ctx->value; - - goto next; - } - - if (s == (ngx_uint_t) range[i].start - && e == (ngx_uint_t) range[i].end) - { - ngx_conf_log_error(NGX_LOG_WARN, cf, 0, - "duplicate range \"%V\", value: \"%v\", old value: \"%v\"", - ctx->net, ctx->value, range[i].value); - - range[i].value = ctx->value; - - goto next; - } - - if (s > (ngx_uint_t) range[i].start - && e < (ngx_uint_t) range[i].end) - { - /* split the range and insert the new one */ - - range = ngx_array_push(a); - if (range == NULL) { - return NGX_CONF_ERROR; - } - - range = ngx_array_push(a); - if (range == NULL) { - return NGX_CONF_ERROR; - } - - range = a->elts; - - ngx_memmove(&range[i + 3], &range[i + 1], - (a->nelts - 3 - i) * sizeof(ngx_http_geo_range_t)); - - range[i + 2].start = (u_short) (e + 1); - range[i + 2].end = range[i].end; - range[i + 2].value = range[i].value; - - range[i + 1].start = (u_short) s; - range[i + 1].end = (u_short) e; - range[i + 1].value = ctx->value; - - range[i].end = (u_short) (s - 1); - - goto next; - } - - if (s == (ngx_uint_t) range[i].start - && e < (ngx_uint_t) range[i].end) - { - /* shift the range start and insert the new range */ - - range = ngx_array_push(a); - if (range == NULL) { - return NGX_CONF_ERROR; - } - - range = a->elts; - - ngx_memmove(&range[i + 1], &range[i], - (a->nelts - 1 - i) * sizeof(ngx_http_geo_range_t)); - - range[i + 1].start = (u_short) (e + 1); - - range[i].start = (u_short) s; - range[i].end = (u_short) e; - range[i].value = ctx->value; - - goto next; - } - - if (s > (ngx_uint_t) range[i].start - && e == (ngx_uint_t) range[i].end) - { - /* shift the range end and insert the new range */ - - range = ngx_array_push(a); - if (range == NULL) { - return NGX_CONF_ERROR; - } - - range = a->elts; - - ngx_memmove(&range[i + 2], &range[i + 1], - (a->nelts - 2 - i) * sizeof(ngx_http_geo_range_t)); - - range[i + 1].start = (u_short) s; - range[i + 1].end = (u_short) e; - range[i + 1].value = ctx->value; - - range[i].end = (u_short) (s - 1); - - goto next; - } - - s = (ngx_uint_t) range[i].start; - e = (ngx_uint_t) range[i].end; - - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "range \"%V\" overlaps \"%d.%d.%d.%d-%d.%d.%d.%d\"", - ctx->net, - h >> 8, h & 0xff, s >> 8, s & 0xff, - h >> 8, h & 0xff, e >> 8, e & 0xff); - - return NGX_CONF_ERROR; - } - - /* add the first range */ - - range = ngx_array_push(a); - if (range == NULL) { - return NGX_CONF_ERROR; - } - - range = a->elts; - - ngx_memmove(&range[1], &range[0], - (a->nelts - 1) * sizeof(ngx_http_geo_range_t)); - - range[0].start = (u_short) s; - range[0].end = (u_short) e; - range[0].value = ctx->value; - - next: - - if (h == 0xffff) { - break; - } - } - - return NGX_CONF_OK; -} - - -static ngx_uint_t -ngx_http_geo_delete_range(ngx_conf_t *cf, ngx_http_geo_conf_ctx_t *ctx, - in_addr_t start, in_addr_t end) -{ - in_addr_t n; - ngx_uint_t h, i, s, e, warn; - ngx_array_t *a; - ngx_http_geo_range_t *range; - - warn = 0; - - for (n = start; n <= end; n = (n + 0x10000) & 0xffff0000) { - - h = n >> 16; - - if (n == start) { - s = n & 0xffff; - } else { - s = 0; - } - - if ((n | 0xffff) > end) { - e = end & 0xffff; - - } else { - e = 0xffff; - } - - a = (ngx_array_t *) ctx->high.low[h]; - - if (a == NULL || a->nelts == 0) { - warn = 1; - goto next; - } - - range = a->elts; - for (i = 0; i < a->nelts; i++) { - - if (s == (ngx_uint_t) range[i].start - && e == (ngx_uint_t) range[i].end) - { - ngx_memmove(&range[i], &range[i + 1], - (a->nelts - 1 - i) * sizeof(ngx_http_geo_range_t)); - - a->nelts--; - - break; - } - - if (i == a->nelts - 1) { - warn = 1; - } - } - - next: - - if (h == 0xffff) { - break; - } - } - - return warn; -} - - -static char * -ngx_http_geo_cidr(ngx_conf_t *cf, ngx_http_geo_conf_ctx_t *ctx, - ngx_str_t *value) -{ - char *rv; - ngx_int_t rc, del; - ngx_str_t *net; - ngx_cidr_t cidr; - - if (ctx->tree == NULL) { - ctx->tree = ngx_radix_tree_create(ctx->pool, -1); - if (ctx->tree == NULL) { - return NGX_CONF_ERROR; - } - } - -#if (NGX_HAVE_INET6) - if (ctx->tree6 == NULL) { - ctx->tree6 = ngx_radix_tree_create(ctx->pool, -1); - if (ctx->tree6 == NULL) { - return NGX_CONF_ERROR; - } - } -#endif - - if (ngx_strcmp(value[0].data, "default") == 0) { - cidr.family = AF_INET; - cidr.u.in.addr = 0; - cidr.u.in.mask = 0; - - rv = ngx_http_geo_cidr_add(cf, ctx, &cidr, &value[1], &value[0]); - - if (rv != NGX_CONF_OK) { - return rv; - } - -#if (NGX_HAVE_INET6) - cidr.family = AF_INET6; - ngx_memzero(&cidr.u.in6, sizeof(ngx_in6_cidr_t)); - - rv = ngx_http_geo_cidr_add(cf, ctx, &cidr, &value[1], &value[0]); - - if (rv != NGX_CONF_OK) { - return rv; - } -#endif - - return NGX_CONF_OK; - } - - if (ngx_strcmp(value[0].data, "delete") == 0) { - net = &value[1]; - del = 1; - - } else { - net = &value[0]; - del = 0; - } - - if (ngx_http_geo_cidr_value(cf, net, &cidr) != NGX_OK) { - return NGX_CONF_ERROR; - } - - if (cidr.family == AF_INET) { - cidr.u.in.addr = ntohl(cidr.u.in.addr); - cidr.u.in.mask = ntohl(cidr.u.in.mask); - } - - if (del) { - switch (cidr.family) { - -#if (NGX_HAVE_INET6) - case AF_INET6: - rc = ngx_radix128tree_delete(ctx->tree6, - cidr.u.in6.addr.s6_addr, - cidr.u.in6.mask.s6_addr); - break; -#endif - - default: /* AF_INET */ - rc = ngx_radix32tree_delete(ctx->tree, cidr.u.in.addr, - cidr.u.in.mask); - break; - } - - if (rc != NGX_OK) { - ngx_conf_log_error(NGX_LOG_WARN, cf, 0, - "no network \"%V\" to delete", net); - } - - return NGX_CONF_OK; - } - - return ngx_http_geo_cidr_add(cf, ctx, &cidr, &value[1], net); -} - - -static char * -ngx_http_geo_cidr_add(ngx_conf_t *cf, ngx_http_geo_conf_ctx_t *ctx, - ngx_cidr_t *cidr, ngx_str_t *value, ngx_str_t *net) -{ - ngx_int_t rc; - ngx_http_variable_value_t *val, *old; - - val = ngx_http_geo_value(cf, ctx, value); - - if (val == NULL) { - return NGX_CONF_ERROR; - } - - switch (cidr->family) { - -#if (NGX_HAVE_INET6) - case AF_INET6: - rc = ngx_radix128tree_insert(ctx->tree6, cidr->u.in6.addr.s6_addr, - cidr->u.in6.mask.s6_addr, - (uintptr_t) val); - - if (rc == NGX_OK) { - return NGX_CONF_OK; - } - - if (rc == NGX_ERROR) { - return NGX_CONF_ERROR; - } - - /* rc == NGX_BUSY */ - - old = (ngx_http_variable_value_t *) - ngx_radix128tree_find(ctx->tree6, - cidr->u.in6.addr.s6_addr); - - ngx_conf_log_error(NGX_LOG_WARN, cf, 0, - "duplicate network \"%V\", value: \"%v\", old value: \"%v\"", - net, val, old); - - rc = ngx_radix128tree_delete(ctx->tree6, - cidr->u.in6.addr.s6_addr, - cidr->u.in6.mask.s6_addr); - - if (rc == NGX_ERROR) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, "invalid radix tree"); - return NGX_CONF_ERROR; - } - - rc = ngx_radix128tree_insert(ctx->tree6, cidr->u.in6.addr.s6_addr, - cidr->u.in6.mask.s6_addr, - (uintptr_t) val); - - break; -#endif - - default: /* AF_INET */ - rc = ngx_radix32tree_insert(ctx->tree, cidr->u.in.addr, - cidr->u.in.mask, (uintptr_t) val); - - if (rc == NGX_OK) { - return NGX_CONF_OK; - } - - if (rc == NGX_ERROR) { - return NGX_CONF_ERROR; - } - - /* rc == NGX_BUSY */ - - old = (ngx_http_variable_value_t *) - ngx_radix32tree_find(ctx->tree, cidr->u.in.addr); - - ngx_conf_log_error(NGX_LOG_WARN, cf, 0, - "duplicate network \"%V\", value: \"%v\", old value: \"%v\"", - net, val, old); - - rc = ngx_radix32tree_delete(ctx->tree, - cidr->u.in.addr, cidr->u.in.mask); - - if (rc == NGX_ERROR) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, "invalid radix tree"); - return NGX_CONF_ERROR; - } - - rc = ngx_radix32tree_insert(ctx->tree, cidr->u.in.addr, - cidr->u.in.mask, (uintptr_t) val); - - break; - } - - if (rc == NGX_OK) { - return NGX_CONF_OK; - } - - return NGX_CONF_ERROR; -} - - -static ngx_http_variable_value_t * -ngx_http_geo_value(ngx_conf_t *cf, ngx_http_geo_conf_ctx_t *ctx, - ngx_str_t *value) -{ - uint32_t hash; - ngx_http_variable_value_t *val; - ngx_http_geo_variable_value_node_t *gvvn; - - hash = ngx_crc32_long(value->data, value->len); - - gvvn = (ngx_http_geo_variable_value_node_t *) - ngx_str_rbtree_lookup(&ctx->rbtree, value, hash); - - if (gvvn) { - return gvvn->value; - } - - val = ngx_pcalloc(ctx->pool, sizeof(ngx_http_variable_value_t)); - if (val == NULL) { - return NULL; - } - - val->len = value->len; - val->data = ngx_pstrdup(ctx->pool, value); - if (val->data == NULL) { - return NULL; - } - - val->valid = 1; - - gvvn = ngx_palloc(ctx->temp_pool, - sizeof(ngx_http_geo_variable_value_node_t)); - if (gvvn == NULL) { - return NULL; - } - - gvvn->sn.node.key = hash; - gvvn->sn.str.len = val->len; - gvvn->sn.str.data = val->data; - gvvn->value = val; - gvvn->offset = 0; - - ngx_rbtree_insert(&ctx->rbtree, &gvvn->sn.node); - - ctx->data_size += ngx_align(sizeof(ngx_http_variable_value_t) + value->len, - sizeof(void *)); - - return val; -} - - -static char * -ngx_http_geo_add_proxy(ngx_conf_t *cf, ngx_http_geo_conf_ctx_t *ctx, - ngx_cidr_t *cidr) -{ - ngx_cidr_t *c; - - if (ctx->proxies == NULL) { - ctx->proxies = ngx_array_create(ctx->pool, 4, sizeof(ngx_cidr_t)); - if (ctx->proxies == NULL) { - return NGX_CONF_ERROR; - } - } - - c = ngx_array_push(ctx->proxies); - if (c == NULL) { - return NGX_CONF_ERROR; - } - - *c = *cidr; - - return NGX_CONF_OK; -} - - -static ngx_int_t -ngx_http_geo_cidr_value(ngx_conf_t *cf, ngx_str_t *net, ngx_cidr_t *cidr) -{ - ngx_int_t rc; - - if (ngx_strcmp(net->data, "255.255.255.255") == 0) { - cidr->family = AF_INET; - cidr->u.in.addr = 0xffffffff; - cidr->u.in.mask = 0xffffffff; - - return NGX_OK; - } - - rc = ngx_ptocidr(net, cidr); - - if (rc == NGX_ERROR) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, "invalid network \"%V\"", net); - return NGX_ERROR; - } - - if (rc == NGX_DONE) { - ngx_conf_log_error(NGX_LOG_WARN, cf, 0, - "low address bits of %V are meaningless", net); - } - - return NGX_OK; -} - - -static char * -ngx_http_geo_include(ngx_conf_t *cf, ngx_http_geo_conf_ctx_t *ctx, - ngx_str_t *name) -{ - char *rv; - ngx_str_t file; - - file.len = name->len + 4; - file.data = ngx_pnalloc(ctx->temp_pool, name->len + 5); - if (file.data == NULL) { - return NGX_CONF_ERROR; - } - - ngx_sprintf(file.data, "%V.bin%Z", name); - - if (ngx_conf_full_name(cf->cycle, &file, 1) != NGX_OK) { - return NGX_CONF_ERROR; - } - - if (ctx->ranges) { - ngx_log_debug1(NGX_LOG_DEBUG_CORE, cf->log, 0, "include %s", file.data); - - switch (ngx_http_geo_include_binary_base(cf, ctx, &file)) { - case NGX_OK: - return NGX_CONF_OK; - case NGX_ERROR: - return NGX_CONF_ERROR; - default: - break; - } - } - - file.len -= 4; - file.data[file.len] = '\0'; - - ctx->include_name = file; - - if (ctx->outside_entries) { - ctx->allow_binary_include = 0; - } - - ngx_log_debug1(NGX_LOG_DEBUG_CORE, cf->log, 0, "include %s", file.data); - - rv = ngx_conf_parse(cf, &file); - - ctx->includes++; - ctx->outside_entries = 0; - - return rv; -} - - -static ngx_int_t -ngx_http_geo_include_binary_base(ngx_conf_t *cf, ngx_http_geo_conf_ctx_t *ctx, - ngx_str_t *name) -{ - u_char *base, ch; - time_t mtime; - size_t size, len; - ssize_t n; - uint32_t crc32; - ngx_err_t err; - ngx_int_t rc; - ngx_uint_t i; - ngx_file_t file; - ngx_file_info_t fi; - ngx_http_geo_range_t *range, **ranges; - ngx_http_geo_header_t *header; - ngx_http_variable_value_t *vv; - - ngx_memzero(&file, sizeof(ngx_file_t)); - file.name = *name; - file.log = cf->log; - - file.fd = ngx_open_file(name->data, NGX_FILE_RDONLY, NGX_FILE_OPEN, 0); - - if (file.fd == NGX_INVALID_FILE) { - err = ngx_errno; - if (err != NGX_ENOENT) { - ngx_conf_log_error(NGX_LOG_CRIT, cf, err, - ngx_open_file_n " \"%s\" failed", name->data); - } - return NGX_DECLINED; - } - - if (ctx->outside_entries) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "binary geo range base \"%s\" cannot be mixed with usual entries", - name->data); - rc = NGX_ERROR; - goto done; - } - - if (ctx->binary_include) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "second binary geo range base \"%s\" cannot be mixed with \"%s\"", - name->data, ctx->include_name.data); - rc = NGX_ERROR; - goto done; - } - - if (ngx_fd_info(file.fd, &fi) == NGX_FILE_ERROR) { - ngx_conf_log_error(NGX_LOG_CRIT, cf, ngx_errno, - ngx_fd_info_n " \"%s\" failed", name->data); - goto failed; - } - - size = (size_t) ngx_file_size(&fi); - mtime = ngx_file_mtime(&fi); - - ch = name->data[name->len - 4]; - name->data[name->len - 4] = '\0'; - - if (ngx_file_info(name->data, &fi) == NGX_FILE_ERROR) { - ngx_conf_log_error(NGX_LOG_CRIT, cf, ngx_errno, - ngx_file_info_n " \"%s\" failed", name->data); - goto failed; - } - - name->data[name->len - 4] = ch; - - if (mtime < ngx_file_mtime(&fi)) { - ngx_conf_log_error(NGX_LOG_WARN, cf, 0, - "stale binary geo range base \"%s\"", name->data); - goto failed; - } - - base = ngx_palloc(ctx->pool, size); - if (base == NULL) { - goto failed; - } - - n = ngx_read_file(&file, base, size, 0); - - if (n == NGX_ERROR) { - ngx_conf_log_error(NGX_LOG_CRIT, cf, ngx_errno, - ngx_read_file_n " \"%s\" failed", name->data); - goto failed; - } - - if ((size_t) n != size) { - ngx_conf_log_error(NGX_LOG_CRIT, cf, 0, - ngx_read_file_n " \"%s\" returned only %z bytes instead of %z", - name->data, n, size); - goto failed; - } - - header = (ngx_http_geo_header_t *) base; - - if (size < 16 || ngx_memcmp(&ngx_http_geo_header, header, 12) != 0) { - ngx_conf_log_error(NGX_LOG_WARN, cf, 0, - "incompatible binary geo range base \"%s\"", name->data); - goto failed; - } - - ngx_crc32_init(crc32); - - vv = (ngx_http_variable_value_t *) (base + sizeof(ngx_http_geo_header_t)); - - while (vv->data) { - len = ngx_align(sizeof(ngx_http_variable_value_t) + vv->len, - sizeof(void *)); - ngx_crc32_update(&crc32, (u_char *) vv, len); - vv->data += (size_t) base; - vv = (ngx_http_variable_value_t *) ((u_char *) vv + len); - } - ngx_crc32_update(&crc32, (u_char *) vv, sizeof(ngx_http_variable_value_t)); - vv++; - - ranges = (ngx_http_geo_range_t **) vv; - - for (i = 0; i < 0x10000; i++) { - ngx_crc32_update(&crc32, (u_char *) &ranges[i], sizeof(void *)); - if (ranges[i]) { - ranges[i] = (ngx_http_geo_range_t *) - ((u_char *) ranges[i] + (size_t) base); - } - } - - range = (ngx_http_geo_range_t *) &ranges[0x10000]; - - while ((u_char *) range < base + size) { - while (range->value) { - ngx_crc32_update(&crc32, (u_char *) range, - sizeof(ngx_http_geo_range_t)); - range->value = (ngx_http_variable_value_t *) - ((u_char *) range->value + (size_t) base); - range++; - } - ngx_crc32_update(&crc32, (u_char *) range, sizeof(void *)); - range = (ngx_http_geo_range_t *) ((u_char *) range + sizeof(void *)); - } - - ngx_crc32_final(crc32); - - if (crc32 != header->crc32) { - ngx_conf_log_error(NGX_LOG_WARN, cf, 0, - "CRC32 mismatch in binary geo range base \"%s\"", name->data); - goto failed; - } - - ngx_conf_log_error(NGX_LOG_NOTICE, cf, 0, - "using binary geo range base \"%s\"", name->data); - - ctx->include_name = *name; - ctx->binary_include = 1; - ctx->high.low = ranges; - rc = NGX_OK; - - goto done; - -failed: - - rc = NGX_DECLINED; - -done: - - if (ngx_close_file(file.fd) == NGX_FILE_ERROR) { - ngx_log_error(NGX_LOG_ALERT, cf->log, ngx_errno, - ngx_close_file_n " \"%s\" failed", name->data); - } - - return rc; -} - - -static void -ngx_http_geo_create_binary_base(ngx_http_geo_conf_ctx_t *ctx) -{ - u_char *p; - uint32_t hash; - ngx_str_t s; - ngx_uint_t i; - ngx_file_mapping_t fm; - ngx_http_geo_range_t *r, *range, **ranges; - ngx_http_geo_header_t *header; - ngx_http_geo_variable_value_node_t *gvvn; - - fm.name = ngx_pnalloc(ctx->temp_pool, ctx->include_name.len + 5); - if (fm.name == NULL) { - return; - } - - ngx_sprintf(fm.name, "%V.bin%Z", &ctx->include_name); - - fm.size = ctx->data_size; - fm.log = ctx->pool->log; - - ngx_log_error(NGX_LOG_NOTICE, fm.log, 0, - "creating binary geo range base \"%s\"", fm.name); - - if (ngx_create_file_mapping(&fm) != NGX_OK) { - return; - } - - p = ngx_cpymem(fm.addr, &ngx_http_geo_header, - sizeof(ngx_http_geo_header_t)); - - p = ngx_http_geo_copy_values(fm.addr, p, ctx->rbtree.root, - ctx->rbtree.sentinel); - - p += sizeof(ngx_http_variable_value_t); - - ranges = (ngx_http_geo_range_t **) p; - - p += 0x10000 * sizeof(ngx_http_geo_range_t *); - - for (i = 0; i < 0x10000; i++) { - r = ctx->high.low[i]; - if (r == NULL) { - continue; - } - - range = (ngx_http_geo_range_t *) p; - ranges[i] = (ngx_http_geo_range_t *) (p - (u_char *) fm.addr); - - do { - s.len = r->value->len; - s.data = r->value->data; - hash = ngx_crc32_long(s.data, s.len); - gvvn = (ngx_http_geo_variable_value_node_t *) - ngx_str_rbtree_lookup(&ctx->rbtree, &s, hash); - - range->value = (ngx_http_variable_value_t *) gvvn->offset; - range->start = r->start; - range->end = r->end; - range++; - - } while ((++r)->value); - - range->value = NULL; - - p = (u_char *) range + sizeof(void *); - } - - header = fm.addr; - header->crc32 = ngx_crc32_long((u_char *) fm.addr - + sizeof(ngx_http_geo_header_t), - fm.size - sizeof(ngx_http_geo_header_t)); - - ngx_close_file_mapping(&fm); -} - - -static u_char * -ngx_http_geo_copy_values(u_char *base, u_char *p, ngx_rbtree_node_t *node, - ngx_rbtree_node_t *sentinel) -{ - ngx_http_variable_value_t *vv; - ngx_http_geo_variable_value_node_t *gvvn; - - if (node == sentinel) { - return p; - } - - gvvn = (ngx_http_geo_variable_value_node_t *) node; - gvvn->offset = p - base; - - vv = (ngx_http_variable_value_t *) p; - *vv = *gvvn->value; - p += sizeof(ngx_http_variable_value_t); - vv->data = (u_char *) (p - base); - - p = ngx_cpymem(p, gvvn->sn.str.data, gvvn->sn.str.len); - - p = ngx_align_ptr(p, sizeof(void *)); - - p = ngx_http_geo_copy_values(base, p, node->left, sentinel); - - return ngx_http_geo_copy_values(base, p, node->right, sentinel); -} diff --git a/src/deps/src/nginx-1.30.3/src/http/modules/ngx_http_geoip_module.c b/src/deps/src/nginx-1.30.3/src/http/modules/ngx_http_geoip_module.c deleted file mode 100644 index 5b8b11fc79..0000000000 --- a/src/deps/src/nginx-1.30.3/src/http/modules/ngx_http_geoip_module.c +++ /dev/null @@ -1,925 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#include -#include -#include - -#include -#include - - -#define NGX_GEOIP_COUNTRY_CODE 0 -#define NGX_GEOIP_COUNTRY_CODE3 1 -#define NGX_GEOIP_COUNTRY_NAME 2 - - -typedef struct { - GeoIP *country; - GeoIP *org; - GeoIP *city; - ngx_array_t *proxies; /* array of ngx_cidr_t */ - ngx_flag_t proxy_recursive; -#if (NGX_HAVE_GEOIP_V6) - unsigned country_v6:1; - unsigned org_v6:1; - unsigned city_v6:1; -#endif -} ngx_http_geoip_conf_t; - - -typedef struct { - ngx_str_t *name; - uintptr_t data; -} ngx_http_geoip_var_t; - - -typedef const char *(*ngx_http_geoip_variable_handler_pt)(GeoIP *, - u_long addr); - - -ngx_http_geoip_variable_handler_pt ngx_http_geoip_country_functions[] = { - GeoIP_country_code_by_ipnum, - GeoIP_country_code3_by_ipnum, - GeoIP_country_name_by_ipnum, -}; - - -#if (NGX_HAVE_GEOIP_V6) - -typedef const char *(*ngx_http_geoip_variable_handler_v6_pt)(GeoIP *, - geoipv6_t addr); - - -ngx_http_geoip_variable_handler_v6_pt ngx_http_geoip_country_v6_functions[] = { - GeoIP_country_code_by_ipnum_v6, - GeoIP_country_code3_by_ipnum_v6, - GeoIP_country_name_by_ipnum_v6, -}; - -#endif - - -static ngx_int_t ngx_http_geoip_country_variable(ngx_http_request_t *r, - ngx_http_variable_value_t *v, uintptr_t data); -static ngx_int_t ngx_http_geoip_org_variable(ngx_http_request_t *r, - ngx_http_variable_value_t *v, uintptr_t data); -static ngx_int_t ngx_http_geoip_city_variable(ngx_http_request_t *r, - ngx_http_variable_value_t *v, uintptr_t data); -static ngx_int_t ngx_http_geoip_region_name_variable(ngx_http_request_t *r, - ngx_http_variable_value_t *v, uintptr_t data); -static ngx_int_t ngx_http_geoip_city_float_variable(ngx_http_request_t *r, - ngx_http_variable_value_t *v, uintptr_t data); -static ngx_int_t ngx_http_geoip_city_int_variable(ngx_http_request_t *r, - ngx_http_variable_value_t *v, uintptr_t data); -static GeoIPRecord *ngx_http_geoip_get_city_record(ngx_http_request_t *r); - -static ngx_int_t ngx_http_geoip_add_variables(ngx_conf_t *cf); -static void *ngx_http_geoip_create_conf(ngx_conf_t *cf); -static char *ngx_http_geoip_init_conf(ngx_conf_t *cf, void *conf); -static char *ngx_http_geoip_country(ngx_conf_t *cf, ngx_command_t *cmd, - void *conf); -static char *ngx_http_geoip_org(ngx_conf_t *cf, ngx_command_t *cmd, - void *conf); -static char *ngx_http_geoip_city(ngx_conf_t *cf, ngx_command_t *cmd, - void *conf); -static char *ngx_http_geoip_proxy(ngx_conf_t *cf, ngx_command_t *cmd, - void *conf); -static ngx_int_t ngx_http_geoip_cidr_value(ngx_conf_t *cf, ngx_str_t *net, - ngx_cidr_t *cidr); -static void ngx_http_geoip_cleanup(void *data); - - -static ngx_command_t ngx_http_geoip_commands[] = { - - { ngx_string("geoip_country"), - NGX_HTTP_MAIN_CONF|NGX_CONF_TAKE12, - ngx_http_geoip_country, - NGX_HTTP_MAIN_CONF_OFFSET, - 0, - NULL }, - - { ngx_string("geoip_org"), - NGX_HTTP_MAIN_CONF|NGX_CONF_TAKE12, - ngx_http_geoip_org, - NGX_HTTP_MAIN_CONF_OFFSET, - 0, - NULL }, - - { ngx_string("geoip_city"), - NGX_HTTP_MAIN_CONF|NGX_CONF_TAKE12, - ngx_http_geoip_city, - NGX_HTTP_MAIN_CONF_OFFSET, - 0, - NULL }, - - { ngx_string("geoip_proxy"), - NGX_HTTP_MAIN_CONF|NGX_CONF_TAKE1, - ngx_http_geoip_proxy, - NGX_HTTP_MAIN_CONF_OFFSET, - 0, - NULL }, - - { ngx_string("geoip_proxy_recursive"), - NGX_HTTP_MAIN_CONF|NGX_CONF_FLAG, - ngx_conf_set_flag_slot, - NGX_HTTP_MAIN_CONF_OFFSET, - offsetof(ngx_http_geoip_conf_t, proxy_recursive), - NULL }, - - ngx_null_command -}; - - -static ngx_http_module_t ngx_http_geoip_module_ctx = { - ngx_http_geoip_add_variables, /* preconfiguration */ - NULL, /* postconfiguration */ - - ngx_http_geoip_create_conf, /* create main configuration */ - ngx_http_geoip_init_conf, /* init main configuration */ - - NULL, /* create server configuration */ - NULL, /* merge server configuration */ - - NULL, /* create location configuration */ - NULL /* merge location configuration */ -}; - - -ngx_module_t ngx_http_geoip_module = { - NGX_MODULE_V1, - &ngx_http_geoip_module_ctx, /* module context */ - ngx_http_geoip_commands, /* module directives */ - NGX_HTTP_MODULE, /* module type */ - NULL, /* init master */ - NULL, /* init module */ - NULL, /* init process */ - NULL, /* init thread */ - NULL, /* exit thread */ - NULL, /* exit process */ - NULL, /* exit master */ - NGX_MODULE_V1_PADDING -}; - - -static ngx_http_variable_t ngx_http_geoip_vars[] = { - - { ngx_string("geoip_country_code"), NULL, - ngx_http_geoip_country_variable, - NGX_GEOIP_COUNTRY_CODE, 0, 0 }, - - { ngx_string("geoip_country_code3"), NULL, - ngx_http_geoip_country_variable, - NGX_GEOIP_COUNTRY_CODE3, 0, 0 }, - - { ngx_string("geoip_country_name"), NULL, - ngx_http_geoip_country_variable, - NGX_GEOIP_COUNTRY_NAME, 0, 0 }, - - { ngx_string("geoip_org"), NULL, - ngx_http_geoip_org_variable, - 0, 0, 0 }, - - { ngx_string("geoip_city_continent_code"), NULL, - ngx_http_geoip_city_variable, - offsetof(GeoIPRecord, continent_code), 0, 0 }, - - { ngx_string("geoip_city_country_code"), NULL, - ngx_http_geoip_city_variable, - offsetof(GeoIPRecord, country_code), 0, 0 }, - - { ngx_string("geoip_city_country_code3"), NULL, - ngx_http_geoip_city_variable, - offsetof(GeoIPRecord, country_code3), 0, 0 }, - - { ngx_string("geoip_city_country_name"), NULL, - ngx_http_geoip_city_variable, - offsetof(GeoIPRecord, country_name), 0, 0 }, - - { ngx_string("geoip_region"), NULL, - ngx_http_geoip_city_variable, - offsetof(GeoIPRecord, region), 0, 0 }, - - { ngx_string("geoip_region_name"), NULL, - ngx_http_geoip_region_name_variable, - 0, 0, 0 }, - - { ngx_string("geoip_city"), NULL, - ngx_http_geoip_city_variable, - offsetof(GeoIPRecord, city), 0, 0 }, - - { ngx_string("geoip_postal_code"), NULL, - ngx_http_geoip_city_variable, - offsetof(GeoIPRecord, postal_code), 0, 0 }, - - { ngx_string("geoip_latitude"), NULL, - ngx_http_geoip_city_float_variable, - offsetof(GeoIPRecord, latitude), 0, 0 }, - - { ngx_string("geoip_longitude"), NULL, - ngx_http_geoip_city_float_variable, - offsetof(GeoIPRecord, longitude), 0, 0 }, - - { ngx_string("geoip_dma_code"), NULL, - ngx_http_geoip_city_int_variable, - offsetof(GeoIPRecord, dma_code), 0, 0 }, - - { ngx_string("geoip_area_code"), NULL, - ngx_http_geoip_city_int_variable, - offsetof(GeoIPRecord, area_code), 0, 0 }, - - ngx_http_null_variable -}; - - -static u_long -ngx_http_geoip_addr(ngx_http_request_t *r, ngx_http_geoip_conf_t *gcf) -{ - ngx_addr_t addr; - ngx_table_elt_t *xfwd; - struct sockaddr_in *sin; - - addr.sockaddr = r->connection->sockaddr; - addr.socklen = r->connection->socklen; - /* addr.name = r->connection->addr_text; */ - - xfwd = r->headers_in.x_forwarded_for; - - if (xfwd != NULL && gcf->proxies != NULL) { - (void) ngx_http_get_forwarded_addr(r, &addr, xfwd, NULL, - gcf->proxies, gcf->proxy_recursive); - } - -#if (NGX_HAVE_INET6) - - if (addr.sockaddr->sa_family == AF_INET6) { - u_char *p; - in_addr_t inaddr; - struct in6_addr *inaddr6; - - inaddr6 = &((struct sockaddr_in6 *) addr.sockaddr)->sin6_addr; - - if (IN6_IS_ADDR_V4MAPPED(inaddr6)) { - p = inaddr6->s6_addr; - - inaddr = (in_addr_t) p[12] << 24; - inaddr += p[13] << 16; - inaddr += p[14] << 8; - inaddr += p[15]; - - return inaddr; - } - } - -#endif - - if (addr.sockaddr->sa_family != AF_INET) { - return INADDR_NONE; - } - - sin = (struct sockaddr_in *) addr.sockaddr; - return ntohl(sin->sin_addr.s_addr); -} - - -#if (NGX_HAVE_GEOIP_V6) - -static geoipv6_t -ngx_http_geoip_addr_v6(ngx_http_request_t *r, ngx_http_geoip_conf_t *gcf) -{ - ngx_addr_t addr; - ngx_table_elt_t *xfwd; - in_addr_t addr4; - struct in6_addr addr6; - struct sockaddr_in *sin; - struct sockaddr_in6 *sin6; - - addr.sockaddr = r->connection->sockaddr; - addr.socklen = r->connection->socklen; - /* addr.name = r->connection->addr_text; */ - - xfwd = r->headers_in.x_forwarded_for; - - if (xfwd != NULL && gcf->proxies != NULL) { - (void) ngx_http_get_forwarded_addr(r, &addr, xfwd, NULL, - gcf->proxies, gcf->proxy_recursive); - } - - switch (addr.sockaddr->sa_family) { - - case AF_INET: - /* Produce IPv4-mapped IPv6 address. */ - sin = (struct sockaddr_in *) addr.sockaddr; - addr4 = ntohl(sin->sin_addr.s_addr); - - ngx_memzero(&addr6, sizeof(struct in6_addr)); - addr6.s6_addr[10] = 0xff; - addr6.s6_addr[11] = 0xff; - addr6.s6_addr[12] = addr4 >> 24; - addr6.s6_addr[13] = addr4 >> 16; - addr6.s6_addr[14] = addr4 >> 8; - addr6.s6_addr[15] = addr4; - return addr6; - - case AF_INET6: - sin6 = (struct sockaddr_in6 *) addr.sockaddr; - return sin6->sin6_addr; - - default: - return in6addr_any; - } -} - -#endif - - -static ngx_int_t -ngx_http_geoip_country_variable(ngx_http_request_t *r, - ngx_http_variable_value_t *v, uintptr_t data) -{ - ngx_http_geoip_variable_handler_pt handler = - ngx_http_geoip_country_functions[data]; -#if (NGX_HAVE_GEOIP_V6) - ngx_http_geoip_variable_handler_v6_pt handler_v6 = - ngx_http_geoip_country_v6_functions[data]; -#endif - - const char *val; - ngx_http_geoip_conf_t *gcf; - - gcf = ngx_http_get_module_main_conf(r, ngx_http_geoip_module); - - if (gcf->country == NULL) { - goto not_found; - } - -#if (NGX_HAVE_GEOIP_V6) - val = gcf->country_v6 - ? handler_v6(gcf->country, ngx_http_geoip_addr_v6(r, gcf)) - : handler(gcf->country, ngx_http_geoip_addr(r, gcf)); -#else - val = handler(gcf->country, ngx_http_geoip_addr(r, gcf)); -#endif - - if (val == NULL) { - goto not_found; - } - - v->len = ngx_strlen(val); - v->valid = 1; - v->no_cacheable = 0; - v->not_found = 0; - v->data = (u_char *) val; - - return NGX_OK; - -not_found: - - v->not_found = 1; - - return NGX_OK; -} - - -static ngx_int_t -ngx_http_geoip_org_variable(ngx_http_request_t *r, - ngx_http_variable_value_t *v, uintptr_t data) -{ - size_t len; - char *val; - ngx_http_geoip_conf_t *gcf; - - gcf = ngx_http_get_module_main_conf(r, ngx_http_geoip_module); - - if (gcf->org == NULL) { - goto not_found; - } - -#if (NGX_HAVE_GEOIP_V6) - val = gcf->org_v6 - ? GeoIP_name_by_ipnum_v6(gcf->org, - ngx_http_geoip_addr_v6(r, gcf)) - : GeoIP_name_by_ipnum(gcf->org, - ngx_http_geoip_addr(r, gcf)); -#else - val = GeoIP_name_by_ipnum(gcf->org, ngx_http_geoip_addr(r, gcf)); -#endif - - if (val == NULL) { - goto not_found; - } - - len = ngx_strlen(val); - v->data = ngx_pnalloc(r->pool, len); - if (v->data == NULL) { - ngx_free(val); - return NGX_ERROR; - } - - ngx_memcpy(v->data, val, len); - - v->len = len; - v->valid = 1; - v->no_cacheable = 0; - v->not_found = 0; - - ngx_free(val); - - return NGX_OK; - -not_found: - - v->not_found = 1; - - return NGX_OK; -} - - -static ngx_int_t -ngx_http_geoip_city_variable(ngx_http_request_t *r, - ngx_http_variable_value_t *v, uintptr_t data) -{ - char *val; - size_t len; - GeoIPRecord *gr; - - gr = ngx_http_geoip_get_city_record(r); - if (gr == NULL) { - goto not_found; - } - - val = *(char **) ((char *) gr + data); - if (val == NULL) { - goto no_value; - } - - len = ngx_strlen(val); - v->data = ngx_pnalloc(r->pool, len); - if (v->data == NULL) { - GeoIPRecord_delete(gr); - return NGX_ERROR; - } - - ngx_memcpy(v->data, val, len); - - v->len = len; - v->valid = 1; - v->no_cacheable = 0; - v->not_found = 0; - - GeoIPRecord_delete(gr); - - return NGX_OK; - -no_value: - - GeoIPRecord_delete(gr); - -not_found: - - v->not_found = 1; - - return NGX_OK; -} - - -static ngx_int_t -ngx_http_geoip_region_name_variable(ngx_http_request_t *r, - ngx_http_variable_value_t *v, uintptr_t data) -{ - size_t len; - const char *val; - GeoIPRecord *gr; - - gr = ngx_http_geoip_get_city_record(r); - if (gr == NULL) { - goto not_found; - } - - val = GeoIP_region_name_by_code(gr->country_code, gr->region); - - GeoIPRecord_delete(gr); - - if (val == NULL) { - goto not_found; - } - - len = ngx_strlen(val); - v->data = ngx_pnalloc(r->pool, len); - if (v->data == NULL) { - return NGX_ERROR; - } - - ngx_memcpy(v->data, val, len); - - v->len = len; - v->valid = 1; - v->no_cacheable = 0; - v->not_found = 0; - - return NGX_OK; - -not_found: - - v->not_found = 1; - - return NGX_OK; -} - - -static ngx_int_t -ngx_http_geoip_city_float_variable(ngx_http_request_t *r, - ngx_http_variable_value_t *v, uintptr_t data) -{ - float val; - GeoIPRecord *gr; - - gr = ngx_http_geoip_get_city_record(r); - if (gr == NULL) { - v->not_found = 1; - return NGX_OK; - } - - v->data = ngx_pnalloc(r->pool, NGX_INT64_LEN + 5); - if (v->data == NULL) { - GeoIPRecord_delete(gr); - return NGX_ERROR; - } - - val = *(float *) ((char *) gr + data); - - v->len = ngx_sprintf(v->data, "%.4f", val) - v->data; - v->valid = 1; - v->no_cacheable = 0; - v->not_found = 0; - - GeoIPRecord_delete(gr); - - return NGX_OK; -} - - -static ngx_int_t -ngx_http_geoip_city_int_variable(ngx_http_request_t *r, - ngx_http_variable_value_t *v, uintptr_t data) -{ - int val; - GeoIPRecord *gr; - - gr = ngx_http_geoip_get_city_record(r); - if (gr == NULL) { - v->not_found = 1; - return NGX_OK; - } - - v->data = ngx_pnalloc(r->pool, NGX_INT64_LEN); - if (v->data == NULL) { - GeoIPRecord_delete(gr); - return NGX_ERROR; - } - - val = *(int *) ((char *) gr + data); - - v->len = ngx_sprintf(v->data, "%d", val) - v->data; - v->valid = 1; - v->no_cacheable = 0; - v->not_found = 0; - - GeoIPRecord_delete(gr); - - return NGX_OK; -} - - -static GeoIPRecord * -ngx_http_geoip_get_city_record(ngx_http_request_t *r) -{ - ngx_http_geoip_conf_t *gcf; - - gcf = ngx_http_get_module_main_conf(r, ngx_http_geoip_module); - - if (gcf->city) { -#if (NGX_HAVE_GEOIP_V6) - return gcf->city_v6 - ? GeoIP_record_by_ipnum_v6(gcf->city, - ngx_http_geoip_addr_v6(r, gcf)) - : GeoIP_record_by_ipnum(gcf->city, - ngx_http_geoip_addr(r, gcf)); -#else - return GeoIP_record_by_ipnum(gcf->city, ngx_http_geoip_addr(r, gcf)); -#endif - } - - return NULL; -} - - -static ngx_int_t -ngx_http_geoip_add_variables(ngx_conf_t *cf) -{ - ngx_http_variable_t *var, *v; - - for (v = ngx_http_geoip_vars; v->name.len; v++) { - var = ngx_http_add_variable(cf, &v->name, v->flags); - if (var == NULL) { - return NGX_ERROR; - } - - var->get_handler = v->get_handler; - var->data = v->data; - } - - return NGX_OK; -} - - -static void * -ngx_http_geoip_create_conf(ngx_conf_t *cf) -{ - ngx_pool_cleanup_t *cln; - ngx_http_geoip_conf_t *conf; - - conf = ngx_pcalloc(cf->pool, sizeof(ngx_http_geoip_conf_t)); - if (conf == NULL) { - return NULL; - } - - conf->proxy_recursive = NGX_CONF_UNSET; - - cln = ngx_pool_cleanup_add(cf->pool, 0); - if (cln == NULL) { - return NULL; - } - - cln->handler = ngx_http_geoip_cleanup; - cln->data = conf; - - return conf; -} - - -static char * -ngx_http_geoip_init_conf(ngx_conf_t *cf, void *conf) -{ - ngx_http_geoip_conf_t *gcf = conf; - - ngx_conf_init_value(gcf->proxy_recursive, 0); - - return NGX_CONF_OK; -} - - -static char * -ngx_http_geoip_country(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) -{ - ngx_http_geoip_conf_t *gcf = conf; - - ngx_str_t *value; - - if (gcf->country) { - return "is duplicate"; - } - - value = cf->args->elts; - - gcf->country = GeoIP_open((char *) value[1].data, GEOIP_MEMORY_CACHE); - - if (gcf->country == NULL) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "GeoIP_open(\"%V\") failed", &value[1]); - - return NGX_CONF_ERROR; - } - - if (cf->args->nelts == 3) { - if (ngx_strcmp(value[2].data, "utf8") == 0) { - GeoIP_set_charset(gcf->country, GEOIP_CHARSET_UTF8); - - } else { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "invalid parameter \"%V\"", &value[2]); - return NGX_CONF_ERROR; - } - } - - switch (gcf->country->databaseType) { - - case GEOIP_COUNTRY_EDITION: - - return NGX_CONF_OK; - -#if (NGX_HAVE_GEOIP_V6) - case GEOIP_COUNTRY_EDITION_V6: - - gcf->country_v6 = 1; - return NGX_CONF_OK; -#endif - - default: - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "invalid GeoIP database \"%V\" type:%d", - &value[1], gcf->country->databaseType); - return NGX_CONF_ERROR; - } -} - - -static char * -ngx_http_geoip_org(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) -{ - ngx_http_geoip_conf_t *gcf = conf; - - ngx_str_t *value; - - if (gcf->org) { - return "is duplicate"; - } - - value = cf->args->elts; - - gcf->org = GeoIP_open((char *) value[1].data, GEOIP_MEMORY_CACHE); - - if (gcf->org == NULL) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "GeoIP_open(\"%V\") failed", &value[1]); - - return NGX_CONF_ERROR; - } - - if (cf->args->nelts == 3) { - if (ngx_strcmp(value[2].data, "utf8") == 0) { - GeoIP_set_charset(gcf->org, GEOIP_CHARSET_UTF8); - - } else { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "invalid parameter \"%V\"", &value[2]); - return NGX_CONF_ERROR; - } - } - - switch (gcf->org->databaseType) { - - case GEOIP_ISP_EDITION: - case GEOIP_ORG_EDITION: - case GEOIP_DOMAIN_EDITION: - case GEOIP_ASNUM_EDITION: - - return NGX_CONF_OK; - -#if (NGX_HAVE_GEOIP_V6) - case GEOIP_ISP_EDITION_V6: - case GEOIP_ORG_EDITION_V6: - case GEOIP_DOMAIN_EDITION_V6: - case GEOIP_ASNUM_EDITION_V6: - - gcf->org_v6 = 1; - return NGX_CONF_OK; -#endif - - default: - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "invalid GeoIP database \"%V\" type:%d", - &value[1], gcf->org->databaseType); - return NGX_CONF_ERROR; - } -} - - -static char * -ngx_http_geoip_city(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) -{ - ngx_http_geoip_conf_t *gcf = conf; - - ngx_str_t *value; - - if (gcf->city) { - return "is duplicate"; - } - - value = cf->args->elts; - - gcf->city = GeoIP_open((char *) value[1].data, GEOIP_MEMORY_CACHE); - - if (gcf->city == NULL) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "GeoIP_open(\"%V\") failed", &value[1]); - - return NGX_CONF_ERROR; - } - - if (cf->args->nelts == 3) { - if (ngx_strcmp(value[2].data, "utf8") == 0) { - GeoIP_set_charset(gcf->city, GEOIP_CHARSET_UTF8); - - } else { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "invalid parameter \"%V\"", &value[2]); - return NGX_CONF_ERROR; - } - } - - switch (gcf->city->databaseType) { - - case GEOIP_CITY_EDITION_REV0: - case GEOIP_CITY_EDITION_REV1: - - return NGX_CONF_OK; - -#if (NGX_HAVE_GEOIP_V6) - case GEOIP_CITY_EDITION_REV0_V6: - case GEOIP_CITY_EDITION_REV1_V6: - - gcf->city_v6 = 1; - return NGX_CONF_OK; -#endif - - default: - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "invalid GeoIP City database \"%V\" type:%d", - &value[1], gcf->city->databaseType); - return NGX_CONF_ERROR; - } -} - - -static char * -ngx_http_geoip_proxy(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) -{ - ngx_http_geoip_conf_t *gcf = conf; - - ngx_str_t *value; - ngx_cidr_t cidr, *c; - - value = cf->args->elts; - - if (ngx_http_geoip_cidr_value(cf, &value[1], &cidr) != NGX_OK) { - return NGX_CONF_ERROR; - } - - if (gcf->proxies == NULL) { - gcf->proxies = ngx_array_create(cf->pool, 4, sizeof(ngx_cidr_t)); - if (gcf->proxies == NULL) { - return NGX_CONF_ERROR; - } - } - - c = ngx_array_push(gcf->proxies); - if (c == NULL) { - return NGX_CONF_ERROR; - } - - *c = cidr; - - return NGX_CONF_OK; -} - -static ngx_int_t -ngx_http_geoip_cidr_value(ngx_conf_t *cf, ngx_str_t *net, ngx_cidr_t *cidr) -{ - ngx_int_t rc; - - if (ngx_strcmp(net->data, "255.255.255.255") == 0) { - cidr->family = AF_INET; - cidr->u.in.addr = 0xffffffff; - cidr->u.in.mask = 0xffffffff; - - return NGX_OK; - } - - rc = ngx_ptocidr(net, cidr); - - if (rc == NGX_ERROR) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, "invalid network \"%V\"", net); - return NGX_ERROR; - } - - if (rc == NGX_DONE) { - ngx_conf_log_error(NGX_LOG_WARN, cf, 0, - "low address bits of %V are meaningless", net); - } - - return NGX_OK; -} - - -static void -ngx_http_geoip_cleanup(void *data) -{ - ngx_http_geoip_conf_t *gcf = data; - - if (gcf->country) { - GeoIP_delete(gcf->country); - } - - if (gcf->org) { - GeoIP_delete(gcf->org); - } - - if (gcf->city) { - GeoIP_delete(gcf->city); - } -} diff --git a/src/deps/src/nginx-1.30.3/src/http/modules/ngx_http_grpc_module.c b/src/deps/src/nginx-1.30.3/src/http/modules/ngx_http_grpc_module.c deleted file mode 100644 index 1895ef31b7..0000000000 --- a/src/deps/src/nginx-1.30.3/src/http/modules/ngx_http_grpc_module.c +++ /dev/null @@ -1,5212 +0,0 @@ - -/* - * Copyright (C) Maxim Dounin - * Copyright (C) Nginx, Inc. - */ - - -#include -#include -#include - - -typedef struct { - ngx_array_t *flushes; - ngx_array_t *lengths; - ngx_array_t *values; - ngx_hash_t hash; -} ngx_http_grpc_headers_t; - - -typedef struct { - ngx_http_upstream_conf_t upstream; - - ngx_http_grpc_headers_t headers; - ngx_array_t *headers_source; - - ngx_str_t host; - ngx_uint_t host_set; - - ngx_array_t *grpc_lengths; - ngx_array_t *grpc_values; - -#if (NGX_HTTP_SSL) - ngx_uint_t ssl; - ngx_uint_t ssl_protocols; - ngx_str_t ssl_ciphers; - ngx_uint_t ssl_verify_depth; - ngx_str_t ssl_trusted_certificate; - ngx_str_t ssl_crl; - ngx_array_t *ssl_conf_commands; -#endif -} ngx_http_grpc_loc_conf_t; - - -typedef enum { - ngx_http_grpc_st_start = 0, - ngx_http_grpc_st_length_2, - ngx_http_grpc_st_length_3, - ngx_http_grpc_st_type, - ngx_http_grpc_st_flags, - ngx_http_grpc_st_stream_id, - ngx_http_grpc_st_stream_id_2, - ngx_http_grpc_st_stream_id_3, - ngx_http_grpc_st_stream_id_4, - ngx_http_grpc_st_payload, - ngx_http_grpc_st_padding -} ngx_http_grpc_state_e; - - -typedef struct { - size_t init_window; - size_t send_window; - size_t recv_window; - ngx_uint_t last_stream_id; -} ngx_http_grpc_conn_t; - - -typedef struct { - ngx_http_grpc_state_e state; - ngx_uint_t frame_state; - ngx_uint_t fragment_state; - - ngx_chain_t *in; - ngx_chain_t *out; - ngx_chain_t *free; - ngx_chain_t *busy; - - ngx_http_grpc_conn_t *connection; - - ngx_uint_t id; - - ngx_uint_t pings; - ngx_uint_t settings; - - off_t length; - - ssize_t send_window; - size_t recv_window; - - size_t rest; - ngx_uint_t stream_id; - u_char type; - u_char flags; - u_char padding; - - ngx_uint_t error; - ngx_uint_t window_update; - - ngx_uint_t setting_id; - ngx_uint_t setting_value; - - u_char ping_data[8]; - - ngx_uint_t index; - ngx_str_t name; - ngx_str_t value; - - u_char *field_end; - size_t field_length; - size_t field_rest; - u_char field_state; - - unsigned literal:1; - unsigned field_huffman:1; - - unsigned header_sent:1; - unsigned output_closed:1; - unsigned output_blocked:1; - unsigned parsing_headers:1; - unsigned end_stream:1; - unsigned done:1; - unsigned status:1; - unsigned rst:1; - unsigned goaway:1; - - ngx_http_request_t *request; - - ngx_str_t host; -} ngx_http_grpc_ctx_t; - - -typedef struct { - u_char length_0; - u_char length_1; - u_char length_2; - u_char type; - u_char flags; - u_char stream_id_0; - u_char stream_id_1; - u_char stream_id_2; - u_char stream_id_3; -} ngx_http_grpc_frame_t; - - -static ngx_int_t ngx_http_grpc_eval(ngx_http_request_t *r, - ngx_http_grpc_ctx_t *ctx, ngx_http_grpc_loc_conf_t *glcf); -static ngx_int_t ngx_http_grpc_create_request(ngx_http_request_t *r); -static ngx_int_t ngx_http_grpc_reinit_request(ngx_http_request_t *r); -static ngx_int_t ngx_http_grpc_body_output_filter(void *data, ngx_chain_t *in); -static ngx_int_t ngx_http_grpc_process_header(ngx_http_request_t *r); -static ngx_int_t ngx_http_grpc_filter_init(void *data); -static ngx_int_t ngx_http_grpc_filter(void *data, ssize_t bytes); - -static ngx_int_t ngx_http_grpc_parse_frame(ngx_http_request_t *r, - ngx_http_grpc_ctx_t *ctx, ngx_buf_t *b); -static ngx_int_t ngx_http_grpc_parse_header(ngx_http_request_t *r, - ngx_http_grpc_ctx_t *ctx, ngx_buf_t *b); -static ngx_int_t ngx_http_grpc_parse_fragment(ngx_http_request_t *r, - ngx_http_grpc_ctx_t *ctx, ngx_buf_t *b); -static ngx_int_t ngx_http_grpc_validate_header_name(ngx_http_request_t *r, - ngx_str_t *s); -static ngx_int_t ngx_http_grpc_validate_header_value(ngx_http_request_t *r, - ngx_str_t *s); -static ngx_int_t ngx_http_grpc_parse_rst_stream(ngx_http_request_t *r, - ngx_http_grpc_ctx_t *ctx, ngx_buf_t *b); -static ngx_int_t ngx_http_grpc_parse_goaway(ngx_http_request_t *r, - ngx_http_grpc_ctx_t *ctx, ngx_buf_t *b); -static ngx_int_t ngx_http_grpc_parse_window_update(ngx_http_request_t *r, - ngx_http_grpc_ctx_t *ctx, ngx_buf_t *b); -static ngx_int_t ngx_http_grpc_parse_settings(ngx_http_request_t *r, - ngx_http_grpc_ctx_t *ctx, ngx_buf_t *b); -static ngx_int_t ngx_http_grpc_parse_ping(ngx_http_request_t *r, - ngx_http_grpc_ctx_t *ctx, ngx_buf_t *b); - -static ngx_int_t ngx_http_grpc_send_settings_ack(ngx_http_request_t *r, - ngx_http_grpc_ctx_t *ctx); -static ngx_int_t ngx_http_grpc_send_ping_ack(ngx_http_request_t *r, - ngx_http_grpc_ctx_t *ctx); -static ngx_int_t ngx_http_grpc_send_window_update(ngx_http_request_t *r, - ngx_http_grpc_ctx_t *ctx); - -static ngx_chain_t *ngx_http_grpc_get_buf(ngx_http_request_t *r, - ngx_http_grpc_ctx_t *ctx); -static ngx_http_grpc_ctx_t *ngx_http_grpc_get_ctx(ngx_http_request_t *r); -static ngx_int_t ngx_http_grpc_get_connection_data(ngx_http_request_t *r, - ngx_http_grpc_ctx_t *ctx, ngx_peer_connection_t *pc); -static void ngx_http_grpc_cleanup(void *data); - -static void ngx_http_grpc_abort_request(ngx_http_request_t *r); -static void ngx_http_grpc_finalize_request(ngx_http_request_t *r, - ngx_int_t rc); - -static ngx_int_t ngx_http_grpc_internal_trailers_variable( - ngx_http_request_t *r, ngx_http_variable_value_t *v, uintptr_t data); - -static ngx_int_t ngx_http_grpc_add_variables(ngx_conf_t *cf); -static void *ngx_http_grpc_create_loc_conf(ngx_conf_t *cf); -static char *ngx_http_grpc_merge_loc_conf(ngx_conf_t *cf, - void *parent, void *child); -static ngx_int_t ngx_http_grpc_init_headers(ngx_conf_t *cf, - ngx_http_grpc_loc_conf_t *conf, ngx_http_grpc_headers_t *headers, - ngx_keyval_t *default_headers); - -static char *ngx_http_grpc_pass(ngx_conf_t *cf, ngx_command_t *cmd, - void *conf); - -#if (NGX_HTTP_SSL) -static char *ngx_http_grpc_ssl_certificate_cache(ngx_conf_t *cf, - ngx_command_t *cmd, void *conf); -static char *ngx_http_grpc_ssl_password_file(ngx_conf_t *cf, - ngx_command_t *cmd, void *conf); -static char *ngx_http_grpc_ssl_conf_command_check(ngx_conf_t *cf, void *post, - void *data); -static ngx_int_t ngx_http_grpc_merge_ssl(ngx_conf_t *cf, - ngx_http_grpc_loc_conf_t *conf, ngx_http_grpc_loc_conf_t *prev); -static ngx_int_t ngx_http_grpc_set_ssl(ngx_conf_t *cf, - ngx_http_grpc_loc_conf_t *glcf); -#endif - - -static ngx_conf_bitmask_t ngx_http_grpc_next_upstream_masks[] = { - { ngx_string("error"), NGX_HTTP_UPSTREAM_FT_ERROR }, - { ngx_string("timeout"), NGX_HTTP_UPSTREAM_FT_TIMEOUT }, - { ngx_string("invalid_header"), NGX_HTTP_UPSTREAM_FT_INVALID_HEADER }, - { ngx_string("non_idempotent"), NGX_HTTP_UPSTREAM_FT_NON_IDEMPOTENT }, - { ngx_string("http_500"), NGX_HTTP_UPSTREAM_FT_HTTP_500 }, - { ngx_string("http_502"), NGX_HTTP_UPSTREAM_FT_HTTP_502 }, - { ngx_string("http_503"), NGX_HTTP_UPSTREAM_FT_HTTP_503 }, - { ngx_string("http_504"), NGX_HTTP_UPSTREAM_FT_HTTP_504 }, - { ngx_string("http_403"), NGX_HTTP_UPSTREAM_FT_HTTP_403 }, - { ngx_string("http_404"), NGX_HTTP_UPSTREAM_FT_HTTP_404 }, - { ngx_string("http_429"), NGX_HTTP_UPSTREAM_FT_HTTP_429 }, - { ngx_string("off"), NGX_HTTP_UPSTREAM_FT_OFF }, - { ngx_null_string, 0 } -}; - - -#if (NGX_HTTP_SSL) - -static ngx_conf_bitmask_t ngx_http_grpc_ssl_protocols[] = { - { ngx_string("SSLv2"), NGX_SSL_SSLv2 }, - { ngx_string("SSLv3"), NGX_SSL_SSLv3 }, - { ngx_string("TLSv1"), NGX_SSL_TLSv1 }, - { ngx_string("TLSv1.1"), NGX_SSL_TLSv1_1 }, - { ngx_string("TLSv1.2"), NGX_SSL_TLSv1_2 }, - { ngx_string("TLSv1.3"), NGX_SSL_TLSv1_3 }, - { ngx_null_string, 0 } -}; - -static ngx_conf_post_t ngx_http_grpc_ssl_conf_command_post = - { ngx_http_grpc_ssl_conf_command_check }; - -#endif - - -static ngx_command_t ngx_http_grpc_commands[] = { - - { ngx_string("grpc_pass"), - NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF|NGX_CONF_TAKE1, - ngx_http_grpc_pass, - NGX_HTTP_LOC_CONF_OFFSET, - 0, - NULL }, - - { ngx_string("grpc_bind"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE12, - ngx_http_upstream_bind_set_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_grpc_loc_conf_t, upstream.local), - NULL }, - - { ngx_string("grpc_socket_keepalive"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG, - ngx_conf_set_flag_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_grpc_loc_conf_t, upstream.socket_keepalive), - NULL }, - - { ngx_string("grpc_connect_timeout"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1, - ngx_conf_set_msec_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_grpc_loc_conf_t, upstream.connect_timeout), - NULL }, - - { ngx_string("grpc_send_timeout"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1, - ngx_conf_set_msec_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_grpc_loc_conf_t, upstream.send_timeout), - NULL }, - - { ngx_string("grpc_intercept_errors"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG, - ngx_conf_set_flag_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_grpc_loc_conf_t, upstream.intercept_errors), - NULL }, - - { ngx_string("grpc_buffer_size"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1, - ngx_conf_set_size_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_grpc_loc_conf_t, upstream.buffer_size), - NULL }, - - { ngx_string("grpc_read_timeout"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1, - ngx_conf_set_msec_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_grpc_loc_conf_t, upstream.read_timeout), - NULL }, - - { ngx_string("grpc_next_upstream"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE, - ngx_conf_set_bitmask_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_grpc_loc_conf_t, upstream.next_upstream), - &ngx_http_grpc_next_upstream_masks }, - - { ngx_string("grpc_next_upstream_tries"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1, - ngx_conf_set_num_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_grpc_loc_conf_t, upstream.next_upstream_tries), - NULL }, - - { ngx_string("grpc_next_upstream_timeout"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1, - ngx_conf_set_msec_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_grpc_loc_conf_t, upstream.next_upstream_timeout), - NULL }, - - { ngx_string("grpc_set_header"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE2, - ngx_conf_set_keyval_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_grpc_loc_conf_t, headers_source), - NULL }, - - { ngx_string("grpc_pass_header"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1, - ngx_conf_set_str_array_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_grpc_loc_conf_t, upstream.pass_headers), - NULL }, - - { ngx_string("grpc_hide_header"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1, - ngx_conf_set_str_array_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_grpc_loc_conf_t, upstream.hide_headers), - NULL }, - - { ngx_string("grpc_ignore_headers"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE, - ngx_conf_set_bitmask_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_grpc_loc_conf_t, upstream.ignore_headers), - &ngx_http_upstream_ignore_headers_masks }, - -#if (NGX_HTTP_SSL) - - { ngx_string("grpc_ssl_session_reuse"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG, - ngx_conf_set_flag_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_grpc_loc_conf_t, upstream.ssl_session_reuse), - NULL }, - - { ngx_string("grpc_ssl_protocols"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE, - ngx_conf_set_bitmask_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_grpc_loc_conf_t, ssl_protocols), - &ngx_http_grpc_ssl_protocols }, - - { ngx_string("grpc_ssl_ciphers"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1, - ngx_conf_set_str_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_grpc_loc_conf_t, ssl_ciphers), - NULL }, - - { ngx_string("grpc_ssl_name"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1, - ngx_http_set_complex_value_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_grpc_loc_conf_t, upstream.ssl_name), - NULL }, - - { ngx_string("grpc_ssl_server_name"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG, - ngx_conf_set_flag_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_grpc_loc_conf_t, upstream.ssl_server_name), - NULL }, - - { ngx_string("grpc_ssl_verify"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG, - ngx_conf_set_flag_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_grpc_loc_conf_t, upstream.ssl_verify), - NULL }, - - { ngx_string("grpc_ssl_verify_depth"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1, - ngx_conf_set_num_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_grpc_loc_conf_t, ssl_verify_depth), - NULL }, - - { ngx_string("grpc_ssl_trusted_certificate"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1, - ngx_conf_set_str_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_grpc_loc_conf_t, ssl_trusted_certificate), - NULL }, - - { ngx_string("grpc_ssl_crl"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1, - ngx_conf_set_str_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_grpc_loc_conf_t, ssl_crl), - NULL }, - - { ngx_string("grpc_ssl_certificate"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1, - ngx_http_set_complex_value_zero_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_grpc_loc_conf_t, upstream.ssl_certificate), - NULL }, - - { ngx_string("grpc_ssl_certificate_key"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1, - ngx_http_set_complex_value_zero_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_grpc_loc_conf_t, upstream.ssl_certificate_key), - NULL }, - - { ngx_string("grpc_ssl_certificate_cache"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE123, - ngx_http_grpc_ssl_certificate_cache, - NGX_HTTP_LOC_CONF_OFFSET, - 0, - NULL }, - - { ngx_string("grpc_ssl_password_file"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1, - ngx_http_grpc_ssl_password_file, - NGX_HTTP_LOC_CONF_OFFSET, - 0, - NULL }, - - { ngx_string("grpc_ssl_conf_command"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE2, - ngx_conf_set_keyval_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_grpc_loc_conf_t, ssl_conf_commands), - &ngx_http_grpc_ssl_conf_command_post }, - -#endif - - ngx_null_command -}; - - -static ngx_http_module_t ngx_http_grpc_module_ctx = { - ngx_http_grpc_add_variables, /* preconfiguration */ - NULL, /* postconfiguration */ - - NULL, /* create main configuration */ - NULL, /* init main configuration */ - - NULL, /* create server configuration */ - NULL, /* merge server configuration */ - - ngx_http_grpc_create_loc_conf, /* create location configuration */ - ngx_http_grpc_merge_loc_conf /* merge location configuration */ -}; - - -ngx_module_t ngx_http_grpc_module = { - NGX_MODULE_V1, - &ngx_http_grpc_module_ctx, /* module context */ - ngx_http_grpc_commands, /* module directives */ - NGX_HTTP_MODULE, /* module type */ - NULL, /* init master */ - NULL, /* init module */ - NULL, /* init process */ - NULL, /* init thread */ - NULL, /* exit thread */ - NULL, /* exit process */ - NULL, /* exit master */ - NGX_MODULE_V1_PADDING -}; - - -static u_char ngx_http_grpc_connection_start[] = - "PRI * HTTP/2.0\r\n\r\nSM\r\n\r\n" /* connection preface */ - - "\x00\x00\x12\x04\x00\x00\x00\x00\x00" /* settings frame */ - "\x00\x01\x00\x00\x00\x00" /* header table size */ - "\x00\x02\x00\x00\x00\x00" /* disable push */ - "\x00\x04\x7f\xff\xff\xff" /* initial window */ - - "\x00\x00\x04\x08\x00\x00\x00\x00\x00" /* window update frame */ - "\x7f\xff\x00\x00"; - - -static ngx_keyval_t ngx_http_grpc_headers[] = { - { ngx_string("Content-Length"), ngx_string("$content_length") }, - { ngx_string("TE"), ngx_string("$grpc_internal_trailers") }, - { ngx_string("Host"), ngx_string("") }, - { ngx_string("Connection"), ngx_string("") }, - { ngx_string("Transfer-Encoding"), ngx_string("") }, - { ngx_string("Keep-Alive"), ngx_string("") }, - { ngx_string("Expect"), ngx_string("") }, - { ngx_string("Upgrade"), ngx_string("") }, - { ngx_null_string, ngx_null_string } -}; - - -static ngx_str_t ngx_http_grpc_hide_headers[] = { - ngx_string("Date"), - ngx_string("Server"), - ngx_string("X-Accel-Expires"), - ngx_string("X-Accel-Redirect"), - ngx_string("X-Accel-Limit-Rate"), - ngx_string("X-Accel-Buffering"), - ngx_string("X-Accel-Charset"), - ngx_null_string -}; - - -static ngx_http_variable_t ngx_http_grpc_vars[] = { - - { ngx_string("grpc_internal_trailers"), NULL, - ngx_http_grpc_internal_trailers_variable, 0, - NGX_HTTP_VAR_NOCACHEABLE|NGX_HTTP_VAR_NOHASH, 0 }, - - ngx_http_null_variable -}; - - -static ngx_int_t -ngx_http_grpc_handler(ngx_http_request_t *r) -{ - ngx_int_t rc; - ngx_http_upstream_t *u; - ngx_http_grpc_ctx_t *ctx; - ngx_http_grpc_loc_conf_t *glcf; - - if (ngx_http_upstream_create(r) != NGX_OK) { - return NGX_HTTP_INTERNAL_SERVER_ERROR; - } - - ctx = ngx_pcalloc(r->pool, sizeof(ngx_http_grpc_ctx_t)); - if (ctx == NULL) { - return NGX_HTTP_INTERNAL_SERVER_ERROR; - } - - ctx->request = r; - - ngx_http_set_ctx(r, ctx, ngx_http_grpc_module); - - glcf = ngx_http_get_module_loc_conf(r, ngx_http_grpc_module); - - u = r->upstream; - - if (glcf->grpc_lengths == NULL) { - ctx->host = glcf->host; - -#if (NGX_HTTP_SSL) - u->ssl = glcf->ssl; - - if (u->ssl) { - ngx_str_set(&u->schema, "grpcs://"); - - } else { - ngx_str_set(&u->schema, "grpc://"); - } -#else - ngx_str_set(&u->schema, "grpc://"); -#endif - - } else { - if (ngx_http_grpc_eval(r, ctx, glcf) != NGX_OK) { - return NGX_HTTP_INTERNAL_SERVER_ERROR; - } - } - - u->output.tag = (ngx_buf_tag_t) &ngx_http_grpc_module; - - u->conf = &glcf->upstream; - - u->create_request = ngx_http_grpc_create_request; - u->reinit_request = ngx_http_grpc_reinit_request; - u->process_header = ngx_http_grpc_process_header; - u->abort_request = ngx_http_grpc_abort_request; - u->finalize_request = ngx_http_grpc_finalize_request; - - u->input_filter_init = ngx_http_grpc_filter_init; - u->input_filter = ngx_http_grpc_filter; - u->input_filter_ctx = ctx; - - r->request_body_no_buffering = 1; - - rc = ngx_http_read_client_request_body(r, ngx_http_upstream_init); - - if (rc >= NGX_HTTP_SPECIAL_RESPONSE) { - return rc; - } - - return NGX_DONE; -} - - -static ngx_int_t -ngx_http_grpc_eval(ngx_http_request_t *r, ngx_http_grpc_ctx_t *ctx, - ngx_http_grpc_loc_conf_t *glcf) -{ - size_t add; - ngx_url_t url; - ngx_http_upstream_t *u; - - ngx_memzero(&url, sizeof(ngx_url_t)); - - if (ngx_http_script_run(r, &url.url, glcf->grpc_lengths->elts, 0, - glcf->grpc_values->elts) - == NULL) - { - return NGX_ERROR; - } - - if (url.url.len > 7 - && ngx_strncasecmp(url.url.data, (u_char *) "grpc://", 7) == 0) - { - add = 7; - - } else if (url.url.len > 8 - && ngx_strncasecmp(url.url.data, (u_char *) "grpcs://", 8) == 0) - { - -#if (NGX_HTTP_SSL) - add = 8; - r->upstream->ssl = 1; -#else - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "grpcs protocol requires SSL support"); - return NGX_ERROR; -#endif - - } else { - add = 0; - } - - u = r->upstream; - - if (add) { - u->schema.len = add; - u->schema.data = url.url.data; - - url.url.data += add; - url.url.len -= add; - - } else { - ngx_str_set(&u->schema, "grpc://"); - } - - url.no_resolve = 1; - - if (ngx_parse_url(r->pool, &url) != NGX_OK) { - if (url.err) { - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "%s in upstream \"%V\"", url.err, &url.url); - } - - return NGX_ERROR; - } - - u->resolved = ngx_pcalloc(r->pool, sizeof(ngx_http_upstream_resolved_t)); - if (u->resolved == NULL) { - return NGX_ERROR; - } - - if (url.addrs) { - u->resolved->sockaddr = url.addrs[0].sockaddr; - u->resolved->socklen = url.addrs[0].socklen; - u->resolved->name = url.addrs[0].name; - u->resolved->naddrs = 1; - } - - u->resolved->host = url.host; - u->resolved->port = url.port; - u->resolved->no_port = url.no_port; - - if (url.family != AF_UNIX) { - - if (url.no_port) { - ctx->host = url.host; - - } else { - ctx->host.len = url.host.len + 1 + url.port_text.len; - ctx->host.data = url.host.data; - } - - } else { - ngx_str_set(&ctx->host, "localhost"); - } - - return NGX_OK; -} - - -static ngx_int_t -ngx_http_grpc_create_request(ngx_http_request_t *r) -{ - u_char *p, *tmp, *key_tmp, *val_tmp, *headers_frame; - size_t len, tmp_len, key_len, val_len, uri_len; - uintptr_t escape; - ngx_buf_t *b; - ngx_uint_t i, next; - ngx_chain_t *cl, *body; - ngx_list_part_t *part; - ngx_table_elt_t *header; - ngx_http_grpc_ctx_t *ctx; - ngx_http_upstream_t *u; - ngx_http_grpc_frame_t *f; - ngx_http_script_code_pt code; - ngx_http_grpc_loc_conf_t *glcf; - ngx_http_script_engine_t e, le; - ngx_http_script_len_code_pt lcode; - - u = r->upstream; - - glcf = ngx_http_get_module_loc_conf(r, ngx_http_grpc_module); - - ctx = ngx_http_get_module_ctx(r, ngx_http_grpc_module); - - len = sizeof(ngx_http_grpc_connection_start) - 1 - + sizeof(ngx_http_grpc_frame_t); /* headers frame */ - - /* :method header */ - - if (r->method == NGX_HTTP_GET || r->method == NGX_HTTP_POST) { - len += 1; - tmp_len = 0; - - } else { - if (r->method_name.len > NGX_HTTP_V2_MAX_FIELD) { - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "too long http2 method: \"%V\"", &r->method_name); - return NGX_ERROR; - } - - len += 1 + NGX_HTTP_V2_INT_OCTETS + r->method_name.len; - tmp_len = r->method_name.len; - } - - /* :scheme header */ - - len += 1; - - /* :path header */ - - if (r->valid_unparsed_uri) { - escape = 0; - uri_len = r->unparsed_uri.len; - - } else { - escape = 2 * ngx_escape_uri(NULL, r->uri.data, r->uri.len, - NGX_ESCAPE_URI); - uri_len = r->uri.len + escape + sizeof("?") - 1 + r->args.len; - } - - if (uri_len > NGX_HTTP_V2_MAX_FIELD) { - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "too long http2 URI"); - return NGX_ERROR; - } - - len += 1 + NGX_HTTP_V2_INT_OCTETS + uri_len; - - if (tmp_len < uri_len) { - tmp_len = uri_len; - } - - /* :authority header */ - - if (!glcf->host_set) { - if (ctx->host.len > NGX_HTTP_V2_MAX_FIELD) { - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "too long http2 host: \"%V\"", &ctx->host); - return NGX_ERROR; - } - - len += 1 + NGX_HTTP_V2_INT_OCTETS + ctx->host.len; - - if (tmp_len < ctx->host.len) { - tmp_len = ctx->host.len; - } - } - - /* other headers */ - - ngx_http_script_flush_no_cacheable_variables(r, glcf->headers.flushes); - ngx_memzero(&le, sizeof(ngx_http_script_engine_t)); - - le.ip = glcf->headers.lengths->elts; - le.request = r; - le.flushed = 1; - - while (*(uintptr_t *) le.ip) { - - lcode = *(ngx_http_script_len_code_pt *) le.ip; - key_len = lcode(&le); - - for (val_len = 0; *(uintptr_t *) le.ip; val_len += lcode(&le)) { - lcode = *(ngx_http_script_len_code_pt *) le.ip; - } - le.ip += sizeof(uintptr_t); - - if (val_len == 0) { - continue; - } - - if (key_len > NGX_HTTP_V2_MAX_FIELD) { - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "too long http2 header name"); - return NGX_ERROR; - } - - if (val_len > NGX_HTTP_V2_MAX_FIELD) { - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "too long http2 header value"); - return NGX_ERROR; - } - - len += 1 + NGX_HTTP_V2_INT_OCTETS + key_len - + NGX_HTTP_V2_INT_OCTETS + val_len; - - if (tmp_len < key_len) { - tmp_len = key_len; - } - - if (tmp_len < val_len) { - tmp_len = val_len; - } - } - - if (glcf->upstream.pass_request_headers) { - part = &r->headers_in.headers.part; - header = part->elts; - - for (i = 0; /* void */; i++) { - - if (i >= part->nelts) { - if (part->next == NULL) { - break; - } - - part = part->next; - header = part->elts; - i = 0; - } - - if (ngx_hash_find(&glcf->headers.hash, header[i].hash, - header[i].lowcase_key, header[i].key.len)) - { - continue; - } - - if (header[i].key.len > NGX_HTTP_V2_MAX_FIELD) { - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "too long http2 header name: \"%V\"", - &header[i].key); - return NGX_ERROR; - } - - if (header[i].value.len > NGX_HTTP_V2_MAX_FIELD) { - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "too long http2 header value: \"%V: %V\"", - &header[i].key, &header[i].value); - return NGX_ERROR; - } - - len += 1 + NGX_HTTP_V2_INT_OCTETS + header[i].key.len - + NGX_HTTP_V2_INT_OCTETS + header[i].value.len; - - if (tmp_len < header[i].key.len) { - tmp_len = header[i].key.len; - } - - if (tmp_len < header[i].value.len) { - tmp_len = header[i].value.len; - } - } - } - - /* continuation frames */ - - len += sizeof(ngx_http_grpc_frame_t) - * (len / NGX_HTTP_V2_DEFAULT_FRAME_SIZE); - - - b = ngx_create_temp_buf(r->pool, len); - if (b == NULL) { - return NGX_ERROR; - } - - cl = ngx_alloc_chain_link(r->pool); - if (cl == NULL) { - return NGX_ERROR; - } - - cl->buf = b; - cl->next = NULL; - - tmp = ngx_palloc(r->pool, tmp_len * 3); - if (tmp == NULL) { - return NGX_ERROR; - } - - key_tmp = tmp + tmp_len; - val_tmp = tmp + 2 * tmp_len; - - /* connection preface */ - - b->last = ngx_copy(b->last, ngx_http_grpc_connection_start, - sizeof(ngx_http_grpc_connection_start) - 1); - - /* headers frame */ - - headers_frame = b->last; - - f = (ngx_http_grpc_frame_t *) b->last; - b->last += sizeof(ngx_http_grpc_frame_t); - - f->length_0 = 0; - f->length_1 = 0; - f->length_2 = 0; - f->type = NGX_HTTP_V2_HEADERS_FRAME; - f->flags = 0; - f->stream_id_0 = 0; - f->stream_id_1 = 0; - f->stream_id_2 = 0; - f->stream_id_3 = 1; - - if (r->method == NGX_HTTP_GET) { - *b->last++ = ngx_http_v2_indexed(NGX_HTTP_V2_METHOD_GET_INDEX); - - ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "grpc header: \":method: GET\""); - - } else if (r->method == NGX_HTTP_POST) { - *b->last++ = ngx_http_v2_indexed(NGX_HTTP_V2_METHOD_POST_INDEX); - - ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "grpc header: \":method: POST\""); - - } else { - *b->last++ = ngx_http_v2_inc_indexed(NGX_HTTP_V2_METHOD_INDEX); - b->last = ngx_http_v2_write_value(b->last, r->method_name.data, - r->method_name.len, tmp); - - ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "grpc header: \":method: %V\"", &r->method_name); - } - -#if (NGX_HTTP_SSL) - if (u->ssl) { - *b->last++ = ngx_http_v2_indexed(NGX_HTTP_V2_SCHEME_HTTPS_INDEX); - - ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "grpc header: \":scheme: https\""); - } else -#endif - { - *b->last++ = ngx_http_v2_indexed(NGX_HTTP_V2_SCHEME_HTTP_INDEX); - - ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "grpc header: \":scheme: http\""); - } - - if (r->valid_unparsed_uri) { - - if (r->unparsed_uri.len == 1 && r->unparsed_uri.data[0] == '/') { - *b->last++ = ngx_http_v2_indexed(NGX_HTTP_V2_PATH_ROOT_INDEX); - - } else { - *b->last++ = ngx_http_v2_inc_indexed(NGX_HTTP_V2_PATH_INDEX); - b->last = ngx_http_v2_write_value(b->last, r->unparsed_uri.data, - r->unparsed_uri.len, tmp); - } - - ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "grpc header: \":path: %V\"", &r->unparsed_uri); - - } else if (escape || r->args.len > 0) { - p = val_tmp; - - if (escape) { - p = (u_char *) ngx_escape_uri(p, r->uri.data, r->uri.len, - NGX_ESCAPE_URI); - - } else { - p = ngx_copy(p, r->uri.data, r->uri.len); - } - - if (r->args.len > 0) { - *p++ = '?'; - p = ngx_copy(p, r->args.data, r->args.len); - } - - *b->last++ = ngx_http_v2_inc_indexed(NGX_HTTP_V2_PATH_INDEX); - b->last = ngx_http_v2_write_value(b->last, val_tmp, p - val_tmp, tmp); - - ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "grpc header: \":path: %*s\"", p - val_tmp, val_tmp); - - } else { - *b->last++ = ngx_http_v2_inc_indexed(NGX_HTTP_V2_PATH_INDEX); - b->last = ngx_http_v2_write_value(b->last, r->uri.data, - r->uri.len, tmp); - - ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "grpc header: \":path: %V\"", &r->uri); - } - - if (!glcf->host_set) { - *b->last++ = ngx_http_v2_inc_indexed(NGX_HTTP_V2_AUTHORITY_INDEX); - b->last = ngx_http_v2_write_value(b->last, ctx->host.data, - ctx->host.len, tmp); - - ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "grpc header: \":authority: %V\"", &ctx->host); - } - - ngx_memzero(&e, sizeof(ngx_http_script_engine_t)); - - e.ip = glcf->headers.values->elts; - e.request = r; - e.flushed = 1; - - le.ip = glcf->headers.lengths->elts; - - while (*(uintptr_t *) le.ip) { - - lcode = *(ngx_http_script_len_code_pt *) le.ip; - key_len = lcode(&le); - - for (val_len = 0; *(uintptr_t *) le.ip; val_len += lcode(&le)) { - lcode = *(ngx_http_script_len_code_pt *) le.ip; - } - le.ip += sizeof(uintptr_t); - - if (val_len == 0) { - e.skip = 1; - - while (*(uintptr_t *) e.ip) { - code = *(ngx_http_script_code_pt *) e.ip; - code((ngx_http_script_engine_t *) &e); - } - e.ip += sizeof(uintptr_t); - - e.skip = 0; - - continue; - } - - *b->last++ = 0; - - e.pos = key_tmp; - - code = *(ngx_http_script_code_pt *) e.ip; - code((ngx_http_script_engine_t *) &e); - - b->last = ngx_http_v2_write_name(b->last, key_tmp, key_len, tmp); - - e.pos = val_tmp; - - while (*(uintptr_t *) e.ip) { - code = *(ngx_http_script_code_pt *) e.ip; - code((ngx_http_script_engine_t *) &e); - } - e.ip += sizeof(uintptr_t); - - b->last = ngx_http_v2_write_value(b->last, val_tmp, val_len, tmp); - -#if (NGX_DEBUG) - if (r->connection->log->log_level & NGX_LOG_DEBUG_HTTP) { - ngx_strlow(key_tmp, key_tmp, key_len); - - ngx_log_debug4(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "grpc header: \"%*s: %*s\"", - key_len, key_tmp, val_len, val_tmp); - } -#endif - } - - if (glcf->upstream.pass_request_headers) { - part = &r->headers_in.headers.part; - header = part->elts; - - for (i = 0; /* void */; i++) { - - if (i >= part->nelts) { - if (part->next == NULL) { - break; - } - - part = part->next; - header = part->elts; - i = 0; - } - - if (ngx_hash_find(&glcf->headers.hash, header[i].hash, - header[i].lowcase_key, header[i].key.len)) - { - continue; - } - - *b->last++ = 0; - - b->last = ngx_http_v2_write_name(b->last, header[i].key.data, - header[i].key.len, tmp); - - b->last = ngx_http_v2_write_value(b->last, header[i].value.data, - header[i].value.len, tmp); - -#if (NGX_DEBUG) - if (r->connection->log->log_level & NGX_LOG_DEBUG_HTTP) { - ngx_strlow(tmp, header[i].key.data, header[i].key.len); - - ngx_log_debug3(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "grpc header: \"%*s: %V\"", - header[i].key.len, tmp, &header[i].value); - } -#endif - } - } - - /* update headers frame length */ - - len = b->last - headers_frame - sizeof(ngx_http_grpc_frame_t); - - if (len > NGX_HTTP_V2_DEFAULT_FRAME_SIZE) { - len = NGX_HTTP_V2_DEFAULT_FRAME_SIZE; - next = 1; - - } else { - next = 0; - } - - f = (ngx_http_grpc_frame_t *) headers_frame; - - f->length_0 = (u_char) ((len >> 16) & 0xff); - f->length_1 = (u_char) ((len >> 8) & 0xff); - f->length_2 = (u_char) (len & 0xff); - - /* create additional continuation frames */ - - p = headers_frame; - - while (next) { - p += sizeof(ngx_http_grpc_frame_t) + NGX_HTTP_V2_DEFAULT_FRAME_SIZE; - len = b->last - p; - - ngx_memmove(p + sizeof(ngx_http_grpc_frame_t), p, len); - b->last += sizeof(ngx_http_grpc_frame_t); - - if (len > NGX_HTTP_V2_DEFAULT_FRAME_SIZE) { - len = NGX_HTTP_V2_DEFAULT_FRAME_SIZE; - next = 1; - - } else { - next = 0; - } - - f = (ngx_http_grpc_frame_t *) p; - - f->length_0 = (u_char) ((len >> 16) & 0xff); - f->length_1 = (u_char) ((len >> 8) & 0xff); - f->length_2 = (u_char) (len & 0xff); - f->type = NGX_HTTP_V2_CONTINUATION_FRAME; - f->flags = 0; - f->stream_id_0 = 0; - f->stream_id_1 = 0; - f->stream_id_2 = 0; - f->stream_id_3 = 1; - } - - f->flags |= NGX_HTTP_V2_END_HEADERS_FLAG; - - ngx_log_debug4(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "grpc header: %*xs%s, len: %uz", - (size_t) ngx_min(b->last - b->pos, 256), b->pos, - b->last - b->pos > 256 ? "..." : "", - b->last - b->pos); - - if (r->request_body_no_buffering) { - - u->request_bufs = cl; - - } else { - - body = u->request_bufs; - u->request_bufs = cl; - - if (body == NULL) { - f = (ngx_http_grpc_frame_t *) headers_frame; - f->flags |= NGX_HTTP_V2_END_STREAM_FLAG; - } - - while (body) { - b = ngx_alloc_buf(r->pool); - if (b == NULL) { - return NGX_ERROR; - } - - ngx_memcpy(b, body->buf, sizeof(ngx_buf_t)); - - cl->next = ngx_alloc_chain_link(r->pool); - if (cl->next == NULL) { - return NGX_ERROR; - } - - cl = cl->next; - cl->buf = b; - - body = body->next; - } - - b->last_buf = 1; - } - - u->output.output_filter = ngx_http_grpc_body_output_filter; - u->output.filter_ctx = r; - - b->flush = 1; - cl->next = NULL; - - return NGX_OK; -} - - -static ngx_int_t -ngx_http_grpc_reinit_request(ngx_http_request_t *r) -{ - ngx_http_grpc_ctx_t *ctx; - - ctx = ngx_http_get_module_ctx(r, ngx_http_grpc_module); - - if (ctx == NULL) { - return NGX_OK; - } - - ctx->state = 0; - ctx->header_sent = 0; - ctx->output_closed = 0; - ctx->output_blocked = 0; - ctx->parsing_headers = 0; - ctx->end_stream = 0; - ctx->done = 0; - ctx->status = 0; - ctx->rst = 0; - ctx->goaway = 0; - ctx->connection = NULL; - ctx->in = NULL; - ctx->busy = NULL; - ctx->out = NULL; - - return NGX_OK; -} - - -static ngx_int_t -ngx_http_grpc_body_output_filter(void *data, ngx_chain_t *in) -{ - ngx_http_request_t *r = data; - - off_t file_pos; - u_char *p, *pos, *start; - size_t len, limit; - ngx_buf_t *b; - ngx_int_t rc; - ngx_uint_t next, last; - ngx_chain_t *cl, *out, *ln, **ll; - ngx_http_upstream_t *u; - ngx_http_grpc_ctx_t *ctx; - ngx_http_grpc_frame_t *f; - - ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "grpc output filter"); - - ctx = ngx_http_grpc_get_ctx(r); - - if (ctx == NULL) { - return NGX_ERROR; - } - - if (in) { - if (ngx_chain_add_copy(r->pool, &ctx->in, in) != NGX_OK) { - return NGX_ERROR; - } - } - - out = NULL; - ll = &out; - - if (!ctx->header_sent) { - /* first buffer contains headers */ - - ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "grpc output header"); - - ctx->header_sent = 1; - - if (ctx->id != 1) { - /* - * keepalive connection: skip connection preface, - * update stream identifiers - */ - - b = ctx->in->buf; - b->pos += sizeof(ngx_http_grpc_connection_start) - 1; - - p = b->pos; - - while (p < b->last) { - f = (ngx_http_grpc_frame_t *) p; - p += sizeof(ngx_http_grpc_frame_t); - - f->stream_id_0 = (u_char) ((ctx->id >> 24) & 0xff); - f->stream_id_1 = (u_char) ((ctx->id >> 16) & 0xff); - f->stream_id_2 = (u_char) ((ctx->id >> 8) & 0xff); - f->stream_id_3 = (u_char) (ctx->id & 0xff); - - p += (f->length_0 << 16) + (f->length_1 << 8) + f->length_2; - } - } - - if (ctx->in->buf->last_buf) { - ctx->output_closed = 1; - } - - *ll = ctx->in; - ll = &ctx->in->next; - - ctx->in = ctx->in->next; - } - - if (ctx->out) { - /* queued control frames */ - - *ll = ctx->out; - - for (cl = ctx->out, ll = &cl->next; cl; cl = cl->next) { - ll = &cl->next; - } - - ctx->out = NULL; - } - - f = NULL; - last = 0; - - limit = ngx_max(0, ctx->send_window); - - if (limit > ctx->connection->send_window) { - limit = ctx->connection->send_window; - } - - ngx_log_debug3(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "grpc output limit: %uz w:%z:%uz", - limit, ctx->send_window, ctx->connection->send_window); - -#if (NGX_SUPPRESS_WARN) - file_pos = 0; - pos = NULL; - cl = NULL; -#endif - - in = ctx->in; - - while (in && limit > 0) { - - ngx_log_debug7(NGX_LOG_DEBUG_EVENT, r->connection->log, 0, - "grpc output in l:%d f:%d %p, pos %p, size: %z " - "file: %O, size: %O", - in->buf->last_buf, - in->buf->in_file, - in->buf->start, in->buf->pos, - in->buf->last - in->buf->pos, - in->buf->file_pos, - in->buf->file_last - in->buf->file_pos); - - if (ngx_buf_special(in->buf)) { - goto next; - } - - if (in->buf->in_file) { - file_pos = in->buf->file_pos; - - } else { - pos = in->buf->pos; - } - - next = 0; - - do { - - cl = ngx_http_grpc_get_buf(r, ctx); - if (cl == NULL) { - return NGX_ERROR; - } - - b = cl->buf; - - f = (ngx_http_grpc_frame_t *) b->last; - b->last += sizeof(ngx_http_grpc_frame_t); - - *ll = cl; - ll = &cl->next; - - cl = ngx_chain_get_free_buf(r->pool, &ctx->free); - if (cl == NULL) { - return NGX_ERROR; - } - - b = cl->buf; - start = b->start; - - ngx_memcpy(b, in->buf, sizeof(ngx_buf_t)); - - /* - * restore b->start to preserve memory allocated in the buffer, - * to reuse it later for headers and control frames - */ - - b->start = start; - - if (in->buf->in_file) { - b->file_pos = file_pos; - file_pos += ngx_min(NGX_HTTP_V2_DEFAULT_FRAME_SIZE, limit); - - if (file_pos >= in->buf->file_last) { - file_pos = in->buf->file_last; - next = 1; - } - - b->file_last = file_pos; - len = (ngx_uint_t) (file_pos - b->file_pos); - - } else { - b->pos = pos; - pos += ngx_min(NGX_HTTP_V2_DEFAULT_FRAME_SIZE, limit); - - if (pos >= in->buf->last) { - pos = in->buf->last; - next = 1; - } - - b->last = pos; - len = (ngx_uint_t) (pos - b->pos); - } - - b->tag = (ngx_buf_tag_t) &ngx_http_grpc_body_output_filter; - b->shadow = in->buf; - b->last_shadow = next; - - b->last_buf = 0; - b->last_in_chain = 0; - - *ll = cl; - ll = &cl->next; - - f->length_0 = (u_char) ((len >> 16) & 0xff); - f->length_1 = (u_char) ((len >> 8) & 0xff); - f->length_2 = (u_char) (len & 0xff); - f->type = NGX_HTTP_V2_DATA_FRAME; - f->flags = 0; - f->stream_id_0 = (u_char) ((ctx->id >> 24) & 0xff); - f->stream_id_1 = (u_char) ((ctx->id >> 16) & 0xff); - f->stream_id_2 = (u_char) ((ctx->id >> 8) & 0xff); - f->stream_id_3 = (u_char) (ctx->id & 0xff); - - limit -= len; - ctx->send_window -= len; - ctx->connection->send_window -= len; - - } while (!next && limit > 0); - - if (!next) { - /* - * if the buffer wasn't fully sent due to flow control limits, - * preserve position for future use - */ - - if (in->buf->in_file) { - in->buf->file_pos = file_pos; - - } else { - in->buf->pos = pos; - } - - break; - } - - next: - - if (in->buf->last_buf) { - last = 1; - } - - ln = in; - in = in->next; - - ngx_free_chain(r->pool, ln); - } - - ctx->in = in; - - if (last) { - - ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "grpc output last"); - - ctx->output_closed = 1; - - if (f) { - f->flags |= NGX_HTTP_V2_END_STREAM_FLAG; - - } else { - cl = ngx_http_grpc_get_buf(r, ctx); - if (cl == NULL) { - return NGX_ERROR; - } - - b = cl->buf; - - f = (ngx_http_grpc_frame_t *) b->last; - b->last += sizeof(ngx_http_grpc_frame_t); - - f->length_0 = 0; - f->length_1 = 0; - f->length_2 = 0; - f->type = NGX_HTTP_V2_DATA_FRAME; - f->flags = NGX_HTTP_V2_END_STREAM_FLAG; - f->stream_id_0 = (u_char) ((ctx->id >> 24) & 0xff); - f->stream_id_1 = (u_char) ((ctx->id >> 16) & 0xff); - f->stream_id_2 = (u_char) ((ctx->id >> 8) & 0xff); - f->stream_id_3 = (u_char) (ctx->id & 0xff); - - *ll = cl; - ll = &cl->next; - } - - cl->buf->last_buf = 1; - } - - *ll = NULL; - -#if (NGX_DEBUG) - - for (cl = out; cl; cl = cl->next) { - ngx_log_debug7(NGX_LOG_DEBUG_EVENT, r->connection->log, 0, - "grpc output out l:%d f:%d %p, pos %p, size: %z " - "file: %O, size: %O", - cl->buf->last_buf, - cl->buf->in_file, - cl->buf->start, cl->buf->pos, - cl->buf->last - cl->buf->pos, - cl->buf->file_pos, - cl->buf->file_last - cl->buf->file_pos); - } - - ngx_log_debug3(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "grpc output limit: %uz w:%z:%uz", - limit, ctx->send_window, ctx->connection->send_window); - -#endif - - rc = ngx_chain_writer(&r->upstream->writer, out); - - ngx_chain_update_chains(r->pool, &ctx->free, &ctx->busy, &out, - (ngx_buf_tag_t) &ngx_http_grpc_body_output_filter); - - for (cl = ctx->free; cl; cl = cl->next) { - - /* mark original buffers as sent */ - - if (cl->buf->shadow) { - if (cl->buf->last_shadow) { - b = cl->buf->shadow; - b->pos = b->last; - } - - cl->buf->shadow = NULL; - } - } - - if (rc == NGX_OK && ctx->in) { - rc = NGX_AGAIN; - } - - if (rc == NGX_AGAIN) { - ctx->output_blocked = 1; - - } else { - ctx->output_blocked = 0; - } - - if (ctx->done) { - - /* - * We have already got the response and were sending some additional - * control frames. Even if there is still something unsent, stop - * here anyway. - */ - - u = r->upstream; - u->length = 0; - - if (ctx->in == NULL - && ctx->out == NULL - && ctx->output_closed - && !ctx->output_blocked - && !ctx->goaway - && ctx->state == ngx_http_grpc_st_start) - { - u->keepalive = 1; - } - - ngx_post_event(u->peer.connection->read, &ngx_posted_events); - } - - return rc; -} - - -static ngx_int_t -ngx_http_grpc_process_header(ngx_http_request_t *r) -{ - ngx_str_t *status_line; - ngx_int_t rc, status; - ngx_buf_t *b; - ngx_table_elt_t *h; - ngx_http_upstream_t *u; - ngx_http_grpc_ctx_t *ctx; - ngx_http_upstream_header_t *hh; - ngx_http_upstream_main_conf_t *umcf; - - u = r->upstream; - b = &u->buffer; - - ngx_log_debug4(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "grpc response: %*xs%s, len: %uz", - (size_t) ngx_min(b->last - b->pos, 256), - b->pos, b->last - b->pos > 256 ? "..." : "", - b->last - b->pos); - - ctx = ngx_http_grpc_get_ctx(r); - - if (ctx == NULL) { - return NGX_ERROR; - } - - umcf = ngx_http_get_module_main_conf(r, ngx_http_upstream_module); - - for ( ;; ) { - - if (ctx->state < ngx_http_grpc_st_payload) { - - rc = ngx_http_grpc_parse_frame(r, ctx, b); - - if (rc == NGX_AGAIN) { - - /* - * there can be a lot of window update frames, - * so we reset buffer if it is empty and we haven't - * started parsing headers yet - */ - - if (!ctx->parsing_headers) { - b->pos = b->start; - b->last = b->pos; - } - - return NGX_AGAIN; - } - - if (rc == NGX_ERROR) { - return NGX_HTTP_UPSTREAM_INVALID_HEADER; - } - - /* - * RFC 7540 says that implementations MUST discard frames - * that have unknown or unsupported types. However, extension - * frames that appear in the middle of a header block are - * not permitted. Also, for obvious reasons CONTINUATION frames - * cannot appear before headers, and DATA frames are not expected - * to appear before all headers are parsed. - */ - - if (ctx->type == NGX_HTTP_V2_DATA_FRAME - || (ctx->type == NGX_HTTP_V2_CONTINUATION_FRAME - && !ctx->parsing_headers) - || (ctx->type != NGX_HTTP_V2_CONTINUATION_FRAME - && ctx->parsing_headers)) - { - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "upstream sent unexpected http2 frame: %d", - ctx->type); - return NGX_HTTP_UPSTREAM_INVALID_HEADER; - } - - if (ctx->stream_id && ctx->stream_id != ctx->id) { - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "upstream sent frame for unknown stream %ui", - ctx->stream_id); - return NGX_HTTP_UPSTREAM_INVALID_HEADER; - } - } - - /* frame payload */ - - if (ctx->type == NGX_HTTP_V2_RST_STREAM_FRAME) { - - rc = ngx_http_grpc_parse_rst_stream(r, ctx, b); - - if (rc == NGX_AGAIN) { - return NGX_AGAIN; - } - - if (rc == NGX_ERROR) { - return NGX_HTTP_UPSTREAM_INVALID_HEADER; - } - - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "upstream rejected request with error %ui", - ctx->error); - - return NGX_HTTP_UPSTREAM_INVALID_HEADER; - } - - if (ctx->type == NGX_HTTP_V2_GOAWAY_FRAME) { - - rc = ngx_http_grpc_parse_goaway(r, ctx, b); - - if (rc == NGX_AGAIN) { - return NGX_AGAIN; - } - - if (rc == NGX_ERROR) { - return NGX_HTTP_UPSTREAM_INVALID_HEADER; - } - - /* - * If stream_id is lower than one we use, our - * request won't be processed and needs to be retried. - * If stream_id is greater or equal to the one we use, - * we can continue normally (except we can't use this - * connection for additional requests). If there is - * a real error, the connection will be closed. - */ - - if (ctx->stream_id < ctx->id) { - - /* TODO: we can retry non-idempotent requests */ - - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "upstream sent goaway with error %ui", - ctx->error); - - return NGX_HTTP_UPSTREAM_INVALID_HEADER; - } - - ctx->goaway = 1; - - continue; - } - - if (ctx->type == NGX_HTTP_V2_WINDOW_UPDATE_FRAME) { - - rc = ngx_http_grpc_parse_window_update(r, ctx, b); - - if (rc == NGX_AGAIN) { - return NGX_AGAIN; - } - - if (rc == NGX_ERROR) { - return NGX_HTTP_UPSTREAM_INVALID_HEADER; - } - - if (ctx->in) { - ngx_post_event(u->peer.connection->write, &ngx_posted_events); - } - - continue; - } - - if (ctx->type == NGX_HTTP_V2_SETTINGS_FRAME) { - - rc = ngx_http_grpc_parse_settings(r, ctx, b); - - if (rc == NGX_AGAIN) { - return NGX_AGAIN; - } - - if (rc == NGX_ERROR) { - return NGX_HTTP_UPSTREAM_INVALID_HEADER; - } - - if (ctx->in) { - ngx_post_event(u->peer.connection->write, &ngx_posted_events); - } - - continue; - } - - if (ctx->type == NGX_HTTP_V2_PING_FRAME) { - - rc = ngx_http_grpc_parse_ping(r, ctx, b); - - if (rc == NGX_AGAIN) { - return NGX_AGAIN; - } - - if (rc == NGX_ERROR) { - return NGX_HTTP_UPSTREAM_INVALID_HEADER; - } - - ngx_post_event(u->peer.connection->write, &ngx_posted_events); - continue; - } - - if (ctx->type == NGX_HTTP_V2_PUSH_PROMISE_FRAME) { - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "upstream sent unexpected push promise frame"); - return NGX_HTTP_UPSTREAM_INVALID_HEADER; - } - - if (ctx->type != NGX_HTTP_V2_HEADERS_FRAME - && ctx->type != NGX_HTTP_V2_CONTINUATION_FRAME) - { - /* priority, unknown frames */ - - if (b->last - b->pos < (ssize_t) ctx->rest) { - ctx->rest -= b->last - b->pos; - b->pos = b->last; - return NGX_AGAIN; - } - - b->pos += ctx->rest; - ctx->rest = 0; - ctx->state = ngx_http_grpc_st_start; - - continue; - } - - /* headers */ - - for ( ;; ) { - - rc = ngx_http_grpc_parse_header(r, ctx, b); - - if (rc == NGX_AGAIN) { - break; - } - - if (rc == NGX_OK) { - - /* a header line has been parsed successfully */ - - ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "grpc header: \"%V: %V\"", - &ctx->name, &ctx->value); - - if (ctx->name.len && ctx->name.data[0] == ':') { - - if (ctx->name.len != sizeof(":status") - 1 - || ngx_strncmp(ctx->name.data, ":status", - sizeof(":status") - 1) - != 0) - { - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "upstream sent invalid header \"%V: %V\"", - &ctx->name, &ctx->value); - return NGX_HTTP_UPSTREAM_INVALID_HEADER; - } - - if (ctx->status) { - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "upstream sent duplicate :status header"); - return NGX_HTTP_UPSTREAM_INVALID_HEADER; - } - - status_line = &ctx->value; - - if (status_line->len != 3) { - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "upstream sent invalid :status \"%V\"", - status_line); - return NGX_HTTP_UPSTREAM_INVALID_HEADER; - } - - status = ngx_atoi(status_line->data, 3); - - if (status == NGX_ERROR) { - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "upstream sent invalid :status \"%V\"", - status_line); - return NGX_HTTP_UPSTREAM_INVALID_HEADER; - } - - if (status < NGX_HTTP_OK && status != NGX_HTTP_EARLY_HINTS) - { - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "upstream sent unexpected :status \"%V\"", - status_line); - return NGX_HTTP_UPSTREAM_INVALID_HEADER; - } - - u->headers_in.status_n = status; - - if (u->state && u->state->status == 0) { - u->state->status = status; - } - - ctx->status = 1; - - continue; - - } else if (!ctx->status) { - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "upstream sent no :status header"); - return NGX_HTTP_UPSTREAM_INVALID_HEADER; - } - - h = ngx_list_push(&u->headers_in.headers); - if (h == NULL) { - return NGX_ERROR; - } - - h->key = ctx->name; - h->value = ctx->value; - h->lowcase_key = h->key.data; - h->hash = ngx_hash_key(h->key.data, h->key.len); - - if (u->headers_in.status_n == NGX_HTTP_EARLY_HINTS) { - continue; - } - - hh = ngx_hash_find(&umcf->headers_in_hash, h->hash, - h->lowcase_key, h->key.len); - - if (hh) { - rc = hh->handler(r, h, hh->offset); - - if (rc != NGX_OK) { - return rc; - } - } - - continue; - } - - if (rc == NGX_HTTP_PARSE_HEADER_DONE) { - - /* a whole header has been parsed successfully */ - - ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "grpc header done"); - - if (u->headers_in.status_n == NGX_HTTP_EARLY_HINTS) { - if (ctx->end_stream) { - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "upstream prematurely closed stream"); - return NGX_HTTP_UPSTREAM_INVALID_HEADER; - } - - ctx->status = 0; - return NGX_HTTP_UPSTREAM_EARLY_HINTS; - } - - if (ctx->end_stream) { - u->headers_in.content_length_n = 0; - - if (ctx->in == NULL - && ctx->out == NULL - && ctx->output_closed - && !ctx->output_blocked - && !ctx->goaway - && b->last == b->pos) - { - u->keepalive = 1; - } - } - - return NGX_OK; - } - - /* there was error while a header line parsing */ - - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "upstream sent invalid header"); - - return NGX_HTTP_UPSTREAM_INVALID_HEADER; - } - - /* rc == NGX_AGAIN */ - - if (ctx->rest == 0) { - ctx->state = ngx_http_grpc_st_start; - continue; - } - - return NGX_AGAIN; - } -} - - -static ngx_int_t -ngx_http_grpc_filter_init(void *data) -{ - ngx_http_grpc_ctx_t *ctx = data; - - ngx_http_request_t *r; - ngx_http_upstream_t *u; - - r = ctx->request; - u = r->upstream; - - if (u->headers_in.status_n == NGX_HTTP_NO_CONTENT - || u->headers_in.status_n == NGX_HTTP_NOT_MODIFIED - || r->method == NGX_HTTP_HEAD) - { - ctx->length = 0; - - } else { - ctx->length = u->headers_in.content_length_n; - } - - if (ctx->end_stream) { - - if (ctx->length > 0) { - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "upstream prematurely closed stream"); - return NGX_ERROR; - } - - u->length = 0; - ctx->done = 1; - - } else { - u->length = 1; - } - - return NGX_OK; -} - - -static ngx_int_t -ngx_http_grpc_filter(void *data, ssize_t bytes) -{ - ngx_http_grpc_ctx_t *ctx = data; - - ngx_int_t rc; - ngx_buf_t *b, *buf; - ngx_chain_t *cl, **ll; - ngx_table_elt_t *h; - ngx_http_request_t *r; - ngx_http_upstream_t *u; - - r = ctx->request; - u = r->upstream; - b = &u->buffer; - - ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "grpc filter bytes:%z", bytes); - - b->pos = b->last; - b->last += bytes; - - for (cl = u->out_bufs, ll = &u->out_bufs; cl; cl = cl->next) { - ll = &cl->next; - } - - for ( ;; ) { - - if (ctx->state < ngx_http_grpc_st_payload) { - - rc = ngx_http_grpc_parse_frame(r, ctx, b); - - if (rc == NGX_AGAIN) { - - if (ctx->done) { - - if (ctx->length > 0) { - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "upstream prematurely closed stream"); - return NGX_ERROR; - } - - /* - * We have finished parsing the response and the - * remaining control frames. If there are unsent - * control frames, post a write event to send them. - */ - - if (ctx->out) { - ngx_post_event(u->peer.connection->write, - &ngx_posted_events); - return NGX_AGAIN; - } - - u->length = 0; - - if (ctx->in == NULL - && ctx->output_closed - && !ctx->output_blocked - && !ctx->goaway - && ctx->state == ngx_http_grpc_st_start) - { - u->keepalive = 1; - } - - break; - } - - return NGX_AGAIN; - } - - if (rc == NGX_ERROR) { - return NGX_ERROR; - } - - if ((ctx->type == NGX_HTTP_V2_CONTINUATION_FRAME - && !ctx->parsing_headers) - || (ctx->type != NGX_HTTP_V2_CONTINUATION_FRAME - && ctx->parsing_headers)) - { - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "upstream sent unexpected http2 frame: %d", - ctx->type); - return NGX_ERROR; - } - - if (ctx->type == NGX_HTTP_V2_DATA_FRAME) { - - if (ctx->stream_id != ctx->id) { - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "upstream sent data frame " - "for unknown stream %ui", - ctx->stream_id); - return NGX_ERROR; - } - - if (ctx->rest > ctx->recv_window) { - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "upstream violated stream flow control, " - "received %uz data frame with window %uz", - ctx->rest, ctx->recv_window); - return NGX_ERROR; - } - - if (ctx->rest > ctx->connection->recv_window) { - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "upstream violated connection flow control, " - "received %uz data frame with window %uz", - ctx->rest, ctx->connection->recv_window); - return NGX_ERROR; - } - - ctx->recv_window -= ctx->rest; - ctx->connection->recv_window -= ctx->rest; - - if (ctx->connection->recv_window < NGX_HTTP_V2_MAX_WINDOW / 4 - || ctx->recv_window < NGX_HTTP_V2_MAX_WINDOW / 4) - { - if (ngx_http_grpc_send_window_update(r, ctx) != NGX_OK) { - return NGX_ERROR; - } - - ngx_post_event(u->peer.connection->write, - &ngx_posted_events); - } - } - - if (ctx->stream_id && ctx->stream_id != ctx->id) { - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "upstream sent frame for unknown stream %ui", - ctx->stream_id); - return NGX_ERROR; - } - - if (ctx->stream_id && ctx->done - && ctx->type != NGX_HTTP_V2_RST_STREAM_FRAME - && ctx->type != NGX_HTTP_V2_WINDOW_UPDATE_FRAME) - { - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "upstream sent frame for closed stream %ui", - ctx->stream_id); - return NGX_ERROR; - } - - ctx->padding = 0; - } - - if (ctx->state == ngx_http_grpc_st_padding) { - - if (b->last - b->pos < (ssize_t) ctx->rest) { - ctx->rest -= b->last - b->pos; - b->pos = b->last; - return NGX_AGAIN; - } - - b->pos += ctx->rest; - ctx->rest = 0; - ctx->state = ngx_http_grpc_st_start; - - if (ctx->flags & NGX_HTTP_V2_END_STREAM_FLAG) { - ctx->done = 1; - } - - continue; - } - - /* frame payload */ - - if (ctx->type == NGX_HTTP_V2_RST_STREAM_FRAME) { - - rc = ngx_http_grpc_parse_rst_stream(r, ctx, b); - - if (rc == NGX_AGAIN) { - return NGX_AGAIN; - } - - if (rc == NGX_ERROR) { - return NGX_ERROR; - } - - if (ctx->error || !ctx->done) { - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "upstream rejected request with error %ui", - ctx->error); - return NGX_ERROR; - } - - if (ctx->rst) { - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "upstream sent frame for closed stream %ui", - ctx->stream_id); - return NGX_ERROR; - } - - ctx->rst = 1; - - continue; - } - - if (ctx->type == NGX_HTTP_V2_GOAWAY_FRAME) { - - rc = ngx_http_grpc_parse_goaway(r, ctx, b); - - if (rc == NGX_AGAIN) { - return NGX_AGAIN; - } - - if (rc == NGX_ERROR) { - return NGX_ERROR; - } - - /* - * If stream_id is lower than one we use, our - * request won't be processed and needs to be retried. - * If stream_id is greater or equal to the one we use, - * we can continue normally (except we can't use this - * connection for additional requests). If there is - * a real error, the connection will be closed. - */ - - if (ctx->stream_id < ctx->id) { - - /* TODO: we can retry non-idempotent requests */ - - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "upstream sent goaway with error %ui", - ctx->error); - - return NGX_ERROR; - } - - ctx->goaway = 1; - - continue; - } - - if (ctx->type == NGX_HTTP_V2_WINDOW_UPDATE_FRAME) { - - rc = ngx_http_grpc_parse_window_update(r, ctx, b); - - if (rc == NGX_AGAIN) { - return NGX_AGAIN; - } - - if (rc == NGX_ERROR) { - return NGX_ERROR; - } - - if (ctx->in) { - ngx_post_event(u->peer.connection->write, &ngx_posted_events); - } - - continue; - } - - if (ctx->type == NGX_HTTP_V2_SETTINGS_FRAME) { - - rc = ngx_http_grpc_parse_settings(r, ctx, b); - - if (rc == NGX_AGAIN) { - return NGX_AGAIN; - } - - if (rc == NGX_ERROR) { - return NGX_ERROR; - } - - if (ctx->in) { - ngx_post_event(u->peer.connection->write, &ngx_posted_events); - } - - continue; - } - - if (ctx->type == NGX_HTTP_V2_PING_FRAME) { - - rc = ngx_http_grpc_parse_ping(r, ctx, b); - - if (rc == NGX_AGAIN) { - return NGX_AGAIN; - } - - if (rc == NGX_ERROR) { - return NGX_ERROR; - } - - ngx_post_event(u->peer.connection->write, &ngx_posted_events); - continue; - } - - if (ctx->type == NGX_HTTP_V2_PUSH_PROMISE_FRAME) { - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "upstream sent unexpected push promise frame"); - return NGX_ERROR; - } - - if (ctx->type == NGX_HTTP_V2_HEADERS_FRAME - || ctx->type == NGX_HTTP_V2_CONTINUATION_FRAME) - { - for ( ;; ) { - - rc = ngx_http_grpc_parse_header(r, ctx, b); - - if (rc == NGX_AGAIN) { - break; - } - - if (rc == NGX_OK) { - - /* a header line has been parsed successfully */ - - ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "grpc trailer: \"%V: %V\"", - &ctx->name, &ctx->value); - - if (ctx->name.len && ctx->name.data[0] == ':') { - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "upstream sent invalid " - "trailer \"%V: %V\"", - &ctx->name, &ctx->value); - return NGX_ERROR; - } - - h = ngx_list_push(&u->headers_in.trailers); - if (h == NULL) { - return NGX_ERROR; - } - - h->key = ctx->name; - h->value = ctx->value; - h->lowcase_key = h->key.data; - h->hash = ngx_hash_key(h->key.data, h->key.len); - - continue; - } - - if (rc == NGX_HTTP_PARSE_HEADER_DONE) { - - /* a whole header has been parsed successfully */ - - ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "grpc trailer done"); - - if (ctx->end_stream) { - ctx->done = 1; - break; - } - - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "upstream sent trailer without " - "end stream flag"); - return NGX_ERROR; - } - - /* there was error while a header line parsing */ - - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "upstream sent invalid trailer"); - - return NGX_ERROR; - } - - if (rc == NGX_HTTP_PARSE_HEADER_DONE) { - continue; - } - - /* rc == NGX_AGAIN */ - - if (ctx->rest == 0) { - ctx->state = ngx_http_grpc_st_start; - continue; - } - - return NGX_AGAIN; - } - - if (ctx->type != NGX_HTTP_V2_DATA_FRAME) { - - /* priority, unknown frames */ - - if (b->last - b->pos < (ssize_t) ctx->rest) { - ctx->rest -= b->last - b->pos; - b->pos = b->last; - return NGX_AGAIN; - } - - b->pos += ctx->rest; - ctx->rest = 0; - ctx->state = ngx_http_grpc_st_start; - - continue; - } - - /* - * data frame: - * - * +---------------+ - * |Pad Length? (8)| - * +---------------+-----------------------------------------------+ - * | Data (*) ... - * +---------------------------------------------------------------+ - * | Padding (*) ... - * +---------------------------------------------------------------+ - */ - - if (ctx->flags & NGX_HTTP_V2_PADDED_FLAG) { - - if (ctx->rest == 0) { - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "upstream sent too short http2 frame"); - return NGX_ERROR; - } - - if (b->pos == b->last) { - return NGX_AGAIN; - } - - ctx->flags &= ~NGX_HTTP_V2_PADDED_FLAG; - ctx->padding = *b->pos++; - ctx->rest -= 1; - - if (ctx->padding > ctx->rest) { - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "upstream sent http2 frame with too long " - "padding: %d in frame %uz", - ctx->padding, ctx->rest); - return NGX_ERROR; - } - - continue; - } - - if (ctx->rest == ctx->padding) { - goto done; - } - - if (b->pos == b->last) { - return NGX_AGAIN; - } - - cl = ngx_chain_get_free_buf(r->pool, &u->free_bufs); - if (cl == NULL) { - return NGX_ERROR; - } - - *ll = cl; - ll = &cl->next; - - buf = cl->buf; - - buf->flush = 1; - buf->memory = 1; - - buf->pos = b->pos; - buf->tag = u->output.tag; - - ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "grpc output buf %p", buf->pos); - - if (b->last - b->pos < (ssize_t) ctx->rest - ctx->padding) { - - ctx->rest -= b->last - b->pos; - b->pos = b->last; - buf->last = b->pos; - - if (ctx->length != -1) { - - if (buf->last - buf->pos > ctx->length) { - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "upstream sent response body larger " - "than indicated content length"); - return NGX_ERROR; - } - - ctx->length -= buf->last - buf->pos; - } - - return NGX_AGAIN; - } - - b->pos += ctx->rest - ctx->padding; - buf->last = b->pos; - ctx->rest = ctx->padding; - - if (ctx->length != -1) { - - if (buf->last - buf->pos > ctx->length) { - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "upstream sent response body larger " - "than indicated content length"); - return NGX_ERROR; - } - - ctx->length -= buf->last - buf->pos; - } - - done: - - if (ctx->padding) { - ctx->state = ngx_http_grpc_st_padding; - continue; - } - - ctx->state = ngx_http_grpc_st_start; - - if (ctx->flags & NGX_HTTP_V2_END_STREAM_FLAG) { - ctx->done = 1; - } - } - - return NGX_OK; -} - - -static ngx_int_t -ngx_http_grpc_parse_frame(ngx_http_request_t *r, ngx_http_grpc_ctx_t *ctx, - ngx_buf_t *b) -{ - u_char ch, *p; - ngx_http_grpc_state_e state; - - state = ctx->state; - - for (p = b->pos; p < b->last; p++) { - ch = *p; - -#if 0 - ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "grpc frame byte: %02Xd, s:%d", ch, state); -#endif - - switch (state) { - - case ngx_http_grpc_st_start: - ctx->rest = ch << 16; - state = ngx_http_grpc_st_length_2; - break; - - case ngx_http_grpc_st_length_2: - ctx->rest |= ch << 8; - state = ngx_http_grpc_st_length_3; - break; - - case ngx_http_grpc_st_length_3: - ctx->rest |= ch; - - if (ctx->rest > NGX_HTTP_V2_DEFAULT_FRAME_SIZE) { - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "upstream sent too large http2 frame: %uz", - ctx->rest); - return NGX_ERROR; - } - - state = ngx_http_grpc_st_type; - break; - - case ngx_http_grpc_st_type: - ctx->type = ch; - state = ngx_http_grpc_st_flags; - break; - - case ngx_http_grpc_st_flags: - ctx->flags = ch; - state = ngx_http_grpc_st_stream_id; - break; - - case ngx_http_grpc_st_stream_id: - ctx->stream_id = (ch & 0x7f) << 24; - state = ngx_http_grpc_st_stream_id_2; - break; - - case ngx_http_grpc_st_stream_id_2: - ctx->stream_id |= ch << 16; - state = ngx_http_grpc_st_stream_id_3; - break; - - case ngx_http_grpc_st_stream_id_3: - ctx->stream_id |= ch << 8; - state = ngx_http_grpc_st_stream_id_4; - break; - - case ngx_http_grpc_st_stream_id_4: - ctx->stream_id |= ch; - - ngx_log_debug4(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "grpc frame: %d, len: %uz, f:%d, i:%ui", - ctx->type, ctx->rest, ctx->flags, ctx->stream_id); - - b->pos = p + 1; - - ctx->state = ngx_http_grpc_st_payload; - ctx->frame_state = 0; - - return NGX_OK; - - /* suppress warning */ - case ngx_http_grpc_st_payload: - case ngx_http_grpc_st_padding: - break; - } - } - - b->pos = p; - ctx->state = state; - - return NGX_AGAIN; -} - - -static ngx_int_t -ngx_http_grpc_parse_header(ngx_http_request_t *r, ngx_http_grpc_ctx_t *ctx, - ngx_buf_t *b) -{ - u_char ch, *p, *last; - size_t min; - ngx_int_t rc; - enum { - sw_start = 0, - sw_padding_length, - sw_dependency, - sw_dependency_2, - sw_dependency_3, - sw_dependency_4, - sw_weight, - sw_fragment, - sw_padding - } state; - - state = ctx->frame_state; - - if (state == sw_start) { - - ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "grpc parse header: start"); - - if (ctx->type == NGX_HTTP_V2_HEADERS_FRAME) { - ctx->parsing_headers = 1; - ctx->fragment_state = 0; - - min = (ctx->flags & NGX_HTTP_V2_PADDED_FLAG ? 1 : 0) - + (ctx->flags & NGX_HTTP_V2_PRIORITY_FLAG ? 5 : 0); - - if (ctx->rest < min) { - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "upstream sent headers frame " - "with invalid length: %uz", - ctx->rest); - return NGX_ERROR; - } - - if (ctx->flags & NGX_HTTP_V2_END_STREAM_FLAG) { - ctx->end_stream = 1; - } - - if (ctx->flags & NGX_HTTP_V2_PADDED_FLAG) { - state = sw_padding_length; - - } else if (ctx->flags & NGX_HTTP_V2_PRIORITY_FLAG) { - state = sw_dependency; - - } else { - state = sw_fragment; - } - - } else if (ctx->type == NGX_HTTP_V2_CONTINUATION_FRAME) { - state = sw_fragment; - } - - ctx->padding = 0; - ctx->frame_state = state; - } - - if (state < sw_fragment) { - - if (b->last - b->pos < (ssize_t) ctx->rest) { - last = b->last; - - } else { - last = b->pos + ctx->rest; - } - - for (p = b->pos; p < last; p++) { - ch = *p; - -#if 0 - ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "grpc header byte: %02Xd s:%d", ch, state); -#endif - - /* - * headers frame: - * - * +---------------+ - * |Pad Length? (8)| - * +-+-------------+----------------------------------------------+ - * |E| Stream Dependency? (31) | - * +-+-------------+----------------------------------------------+ - * | Weight? (8) | - * +-+-------------+----------------------------------------------+ - * | Header Block Fragment (*) ... - * +--------------------------------------------------------------+ - * | Padding (*) ... - * +--------------------------------------------------------------+ - */ - - switch (state) { - - case sw_padding_length: - - ctx->padding = ch; - - if (ctx->flags & NGX_HTTP_V2_PRIORITY_FLAG) { - state = sw_dependency; - break; - } - - goto fragment; - - case sw_dependency: - state = sw_dependency_2; - break; - - case sw_dependency_2: - state = sw_dependency_3; - break; - - case sw_dependency_3: - state = sw_dependency_4; - break; - - case sw_dependency_4: - state = sw_weight; - break; - - case sw_weight: - goto fragment; - - /* suppress warning */ - case sw_start: - case sw_fragment: - case sw_padding: - break; - } - } - - ctx->rest -= p - b->pos; - b->pos = p; - - ctx->frame_state = state; - return NGX_AGAIN; - - fragment: - - p++; - ctx->rest -= p - b->pos; - b->pos = p; - - if (ctx->padding > ctx->rest) { - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "upstream sent http2 frame with too long " - "padding: %d in frame %uz", - ctx->padding, ctx->rest); - return NGX_ERROR; - } - - state = sw_fragment; - ctx->frame_state = state; - } - - if (state == sw_fragment) { - - rc = ngx_http_grpc_parse_fragment(r, ctx, b); - - if (rc == NGX_AGAIN) { - return NGX_AGAIN; - } - - if (rc == NGX_ERROR) { - return NGX_ERROR; - } - - if (rc == NGX_OK) { - return NGX_OK; - } - - /* rc == NGX_DONE */ - - state = sw_padding; - ctx->frame_state = state; - } - - if (state == sw_padding) { - - if (b->last - b->pos < (ssize_t) ctx->rest) { - - ctx->rest -= b->last - b->pos; - b->pos = b->last; - - return NGX_AGAIN; - } - - b->pos += ctx->rest; - ctx->rest = 0; - - ctx->state = ngx_http_grpc_st_start; - - if (ctx->flags & NGX_HTTP_V2_END_HEADERS_FLAG) { - - if (ctx->fragment_state) { - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "upstream sent truncated http2 header"); - return NGX_ERROR; - } - - ctx->parsing_headers = 0; - - return NGX_HTTP_PARSE_HEADER_DONE; - } - - return NGX_AGAIN; - } - - /* unreachable */ - - return NGX_ERROR; -} - - -static ngx_int_t -ngx_http_grpc_parse_fragment(ngx_http_request_t *r, ngx_http_grpc_ctx_t *ctx, - ngx_buf_t *b) -{ - u_char ch, *p, *last; - size_t size; - ngx_uint_t index, size_update; - enum { - sw_start = 0, - sw_index, - sw_name_length, - sw_name_length_2, - sw_name_length_3, - sw_name_length_4, - sw_name, - sw_name_bytes, - sw_value_length, - sw_value_length_2, - sw_value_length_3, - sw_value_length_4, - sw_value, - sw_value_bytes - } state; - - /* header block fragment */ - -#if 0 - ngx_log_debug3(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "grpc header fragment %p:%p rest:%uz", - b->pos, b->last, ctx->rest); -#endif - - if (b->last - b->pos < (ssize_t) ctx->rest - ctx->padding) { - last = b->last; - - } else { - last = b->pos + ctx->rest - ctx->padding; - } - - state = ctx->fragment_state; - - for (p = b->pos; p < last; p++) { - ch = *p; - -#if 0 - ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "grpc header byte: %02Xd s:%d", ch, state); -#endif - - switch (state) { - - case sw_start: - ctx->index = 0; - - if ((ch & 0x80) == 0x80) { - /* - * indexed header: - * - * 0 1 2 3 4 5 6 7 - * +---+---+---+---+---+---+---+---+ - * | 1 | Index (7+) | - * +---+---------------------------+ - */ - - index = ch & ~0x80; - - if (index == 0 || index > 61) { - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "upstream sent invalid http2 " - "table index: %ui", index); - return NGX_ERROR; - } - - ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "grpc indexed header: %ui", index); - - ctx->index = index; - ctx->literal = 0; - - goto done; - - } else if ((ch & 0xc0) == 0x40) { - /* - * literal header with incremental indexing: - * - * 0 1 2 3 4 5 6 7 - * +---+---+---+---+---+---+---+---+ - * | 0 | 1 | Index (6+) | - * +---+---+-----------------------+ - * | H | Value Length (7+) | - * +---+---------------------------+ - * | Value String (Length octets) | - * +-------------------------------+ - * - * 0 1 2 3 4 5 6 7 - * +---+---+---+---+---+---+---+---+ - * | 0 | 1 | 0 | - * +---+---+-----------------------+ - * | H | Name Length (7+) | - * +---+---------------------------+ - * | Name String (Length octets) | - * +---+---------------------------+ - * | H | Value Length (7+) | - * +---+---------------------------+ - * | Value String (Length octets) | - * +-------------------------------+ - */ - - index = ch & ~0xc0; - - if (index > 61) { - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "upstream sent invalid http2 " - "table index: %ui", index); - return NGX_ERROR; - } - - ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "grpc literal header: %ui", index); - - if (index == 0) { - state = sw_name_length; - break; - } - - ctx->index = index; - ctx->literal = 1; - - state = sw_value_length; - break; - - } else if ((ch & 0xe0) == 0x20) { - /* - * dynamic table size update: - * - * 0 1 2 3 4 5 6 7 - * +---+---+---+---+---+---+---+---+ - * | 0 | 0 | 1 | Max size (5+) | - * +---+---------------------------+ - */ - - size_update = ch & ~0xe0; - - if (size_update > 0) { - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "upstream sent invalid http2 " - "dynamic table size update: %ui", - size_update); - return NGX_ERROR; - } - - ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "grpc table size update: %ui", size_update); - - break; - - } else if ((ch & 0xf0) == 0x10) { - /* - * literal header field never indexed: - * - * 0 1 2 3 4 5 6 7 - * +---+---+---+---+---+---+---+---+ - * | 0 | 0 | 0 | 1 | Index (4+) | - * +---+---+-----------------------+ - * | H | Value Length (7+) | - * +---+---------------------------+ - * | Value String (Length octets) | - * +-------------------------------+ - * - * 0 1 2 3 4 5 6 7 - * +---+---+---+---+---+---+---+---+ - * | 0 | 0 | 0 | 1 | 0 | - * +---+---+-----------------------+ - * | H | Name Length (7+) | - * +---+---------------------------+ - * | Name String (Length octets) | - * +---+---------------------------+ - * | H | Value Length (7+) | - * +---+---------------------------+ - * | Value String (Length octets) | - * +-------------------------------+ - */ - - index = ch & ~0xf0; - - if (index == 0x0f) { - ctx->index = index; - ctx->literal = 1; - state = sw_index; - break; - } - - if (index == 0) { - state = sw_name_length; - break; - } - - ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "grpc literal header never indexed: %ui", - index); - - ctx->index = index; - ctx->literal = 1; - - state = sw_value_length; - break; - - } else if ((ch & 0xf0) == 0x00) { - /* - * literal header field without indexing: - * - * 0 1 2 3 4 5 6 7 - * +---+---+---+---+---+---+---+---+ - * | 0 | 0 | 0 | 0 | Index (4+) | - * +---+---+-----------------------+ - * | H | Value Length (7+) | - * +---+---------------------------+ - * | Value String (Length octets) | - * +-------------------------------+ - * - * 0 1 2 3 4 5 6 7 - * +---+---+---+---+---+---+---+---+ - * | 0 | 0 | 0 | 0 | 0 | - * +---+---+-----------------------+ - * | H | Name Length (7+) | - * +---+---------------------------+ - * | Name String (Length octets) | - * +---+---------------------------+ - * | H | Value Length (7+) | - * +---+---------------------------+ - * | Value String (Length octets) | - * +-------------------------------+ - */ - - index = ch & ~0xf0; - - if (index == 0x0f) { - ctx->index = index; - ctx->literal = 1; - state = sw_index; - break; - } - - if (index == 0) { - state = sw_name_length; - break; - } - - ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "grpc literal header without indexing: %ui", - index); - - ctx->index = index; - ctx->literal = 1; - - state = sw_value_length; - break; - } - - /* not reached */ - - return NGX_ERROR; - - case sw_index: - ctx->index = ctx->index + (ch & ~0x80); - - if (ch & 0x80) { - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "upstream sent http2 table index " - "with continuation flag"); - return NGX_ERROR; - } - - if (ctx->index > 61) { - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "upstream sent invalid http2 " - "table index: %ui", ctx->index); - return NGX_ERROR; - } - - ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "grpc header index: %ui", ctx->index); - - state = sw_value_length; - break; - - case sw_name_length: - ctx->field_huffman = ch & 0x80 ? 1 : 0; - ctx->field_length = ch & ~0x80; - - if (ctx->field_length == 0x7f) { - state = sw_name_length_2; - break; - } - - if (ctx->field_length == 0) { - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "upstream sent zero http2 " - "header name length"); - return NGX_ERROR; - } - - state = sw_name; - break; - - case sw_name_length_2: - ctx->field_length += ch & ~0x80; - - if (ch & 0x80) { - state = sw_name_length_3; - break; - } - - state = sw_name; - break; - - case sw_name_length_3: - ctx->field_length += (ch & ~0x80) << 7; - - if (ch & 0x80) { - state = sw_name_length_4; - break; - } - - state = sw_name; - break; - - case sw_name_length_4: - ctx->field_length += (ch & ~0x80) << 14; - - if (ch & 0x80) { - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "upstream sent too large http2 " - "header name length"); - return NGX_ERROR; - } - - state = sw_name; - break; - - case sw_name: - ctx->name.len = ctx->field_huffman ? - ctx->field_length * 8 / 5 : ctx->field_length; - - ctx->name.data = ngx_pnalloc(r->pool, ctx->name.len + 1); - if (ctx->name.data == NULL) { - return NGX_ERROR; - } - - ctx->field_end = ctx->name.data; - ctx->field_rest = ctx->field_length; - ctx->field_state = 0; - - state = sw_name_bytes; - - /* fall through */ - - case sw_name_bytes: - - ngx_log_debug4(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "grpc name: len:%uz h:%d last:%uz, rest:%uz", - ctx->field_length, - ctx->field_huffman, - last - p, - ctx->rest - (p - b->pos)); - - size = ngx_min(last - p, (ssize_t) ctx->field_rest); - ctx->field_rest -= size; - - if (ctx->field_huffman) { - if (ngx_http_huff_decode(&ctx->field_state, p, size, - &ctx->field_end, - ctx->field_rest == 0, - r->connection->log) - != NGX_OK) - { - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "upstream sent invalid encoded header"); - return NGX_ERROR; - } - - ctx->name.len = ctx->field_end - ctx->name.data; - ctx->name.data[ctx->name.len] = '\0'; - - } else { - ctx->field_end = ngx_cpymem(ctx->field_end, p, size); - ctx->name.data[ctx->name.len] = '\0'; - } - - p += size - 1; - - if (ctx->field_rest == 0) { - state = sw_value_length; - } - - break; - - case sw_value_length: - ctx->field_huffman = ch & 0x80 ? 1 : 0; - ctx->field_length = ch & ~0x80; - - if (ctx->field_length == 0x7f) { - state = sw_value_length_2; - break; - } - - if (ctx->field_length == 0) { - ngx_str_set(&ctx->value, ""); - goto done; - } - - state = sw_value; - break; - - case sw_value_length_2: - ctx->field_length += ch & ~0x80; - - if (ch & 0x80) { - state = sw_value_length_3; - break; - } - - state = sw_value; - break; - - case sw_value_length_3: - ctx->field_length += (ch & ~0x80) << 7; - - if (ch & 0x80) { - state = sw_value_length_4; - break; - } - - state = sw_value; - break; - - case sw_value_length_4: - ctx->field_length += (ch & ~0x80) << 14; - - if (ch & 0x80) { - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "upstream sent too large http2 " - "header value length"); - return NGX_ERROR; - } - - state = sw_value; - break; - - case sw_value: - ctx->value.len = ctx->field_huffman ? - ctx->field_length * 8 / 5 : ctx->field_length; - - ctx->value.data = ngx_pnalloc(r->pool, ctx->value.len + 1); - if (ctx->value.data == NULL) { - return NGX_ERROR; - } - - ctx->field_end = ctx->value.data; - ctx->field_rest = ctx->field_length; - ctx->field_state = 0; - - state = sw_value_bytes; - - /* fall through */ - - case sw_value_bytes: - - ngx_log_debug4(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "grpc value: len:%uz h:%d last:%uz, rest:%uz", - ctx->field_length, - ctx->field_huffman, - last - p, - ctx->rest - (p - b->pos)); - - size = ngx_min(last - p, (ssize_t) ctx->field_rest); - ctx->field_rest -= size; - - if (ctx->field_huffman) { - if (ngx_http_huff_decode(&ctx->field_state, p, size, - &ctx->field_end, - ctx->field_rest == 0, - r->connection->log) - != NGX_OK) - { - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "upstream sent invalid encoded header"); - return NGX_ERROR; - } - - ctx->value.len = ctx->field_end - ctx->value.data; - ctx->value.data[ctx->value.len] = '\0'; - - } else { - ctx->field_end = ngx_cpymem(ctx->field_end, p, size); - ctx->value.data[ctx->value.len] = '\0'; - } - - p += size - 1; - - if (ctx->field_rest == 0) { - goto done; - } - - break; - } - - continue; - - done: - - p++; - ctx->rest -= p - b->pos; - ctx->fragment_state = sw_start; - b->pos = p; - - if (ctx->index) { - ctx->name = *ngx_http_v2_get_static_name(ctx->index); - } - - if (ctx->index && !ctx->literal) { - ctx->value = *ngx_http_v2_get_static_value(ctx->index); - } - - if (!ctx->index) { - if (ngx_http_grpc_validate_header_name(r, &ctx->name) != NGX_OK) { - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "upstream sent invalid header: \"%V: %V\"", - &ctx->name, &ctx->value); - return NGX_ERROR; - } - } - - if (!ctx->index || ctx->literal) { - if (ngx_http_grpc_validate_header_value(r, &ctx->value) != NGX_OK) { - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "upstream sent invalid header: \"%V: %V\"", - &ctx->name, &ctx->value); - return NGX_ERROR; - } - } - - return NGX_OK; - } - - ctx->rest -= p - b->pos; - ctx->fragment_state = state; - b->pos = p; - - if (ctx->rest > ctx->padding) { - return NGX_AGAIN; - } - - return NGX_DONE; -} - - -static ngx_int_t -ngx_http_grpc_validate_header_name(ngx_http_request_t *r, ngx_str_t *s) -{ - u_char ch; - ngx_uint_t i; - - for (i = 0; i < s->len; i++) { - ch = s->data[i]; - - if (ch == ':' && i > 0) { - return NGX_ERROR; - } - - if (ch >= 'A' && ch <= 'Z') { - return NGX_ERROR; - } - - if (ch <= 0x20 || ch == 0x7f) { - return NGX_ERROR; - } - } - - return NGX_OK; -} - - -static ngx_int_t -ngx_http_grpc_validate_header_value(ngx_http_request_t *r, ngx_str_t *s) -{ - u_char ch; - ngx_uint_t i; - - for (i = 0; i < s->len; i++) { - ch = s->data[i]; - - if (ch == '\0' || ch == CR || ch == LF) { - return NGX_ERROR; - } - } - - return NGX_OK; -} - - -static ngx_int_t -ngx_http_grpc_parse_rst_stream(ngx_http_request_t *r, ngx_http_grpc_ctx_t *ctx, - ngx_buf_t *b) -{ - u_char ch, *p, *last; - enum { - sw_start = 0, - sw_error_2, - sw_error_3, - sw_error_4 - } state; - - if (b->last - b->pos < (ssize_t) ctx->rest) { - last = b->last; - - } else { - last = b->pos + ctx->rest; - } - - state = ctx->frame_state; - - if (state == sw_start) { - if (ctx->rest != 4) { - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "upstream sent rst stream frame " - "with invalid length: %uz", - ctx->rest); - return NGX_ERROR; - } - } - - for (p = b->pos; p < last; p++) { - ch = *p; - -#if 0 - ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "grpc rst byte: %02Xd s:%d", ch, state); -#endif - - switch (state) { - - case sw_start: - ctx->error = (ngx_uint_t) ch << 24; - state = sw_error_2; - break; - - case sw_error_2: - ctx->error |= ch << 16; - state = sw_error_3; - break; - - case sw_error_3: - ctx->error |= ch << 8; - state = sw_error_4; - break; - - case sw_error_4: - ctx->error |= ch; - state = sw_start; - - ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "grpc error: %ui", ctx->error); - - break; - } - } - - ctx->rest -= p - b->pos; - ctx->frame_state = state; - b->pos = p; - - if (ctx->rest > 0) { - return NGX_AGAIN; - } - - ctx->state = ngx_http_grpc_st_start; - - return NGX_OK; -} - - -static ngx_int_t -ngx_http_grpc_parse_goaway(ngx_http_request_t *r, ngx_http_grpc_ctx_t *ctx, - ngx_buf_t *b) -{ - u_char ch, *p, *last; - enum { - sw_start = 0, - sw_last_stream_id_2, - sw_last_stream_id_3, - sw_last_stream_id_4, - sw_error, - sw_error_2, - sw_error_3, - sw_error_4, - sw_debug - } state; - - if (b->last - b->pos < (ssize_t) ctx->rest) { - last = b->last; - - } else { - last = b->pos + ctx->rest; - } - - state = ctx->frame_state; - - if (state == sw_start) { - - if (ctx->stream_id) { - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "upstream sent goaway frame " - "with non-zero stream id: %ui", - ctx->stream_id); - return NGX_ERROR; - } - - if (ctx->rest < 8) { - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "upstream sent goaway frame " - "with invalid length: %uz", - ctx->rest); - return NGX_ERROR; - } - } - - for (p = b->pos; p < last; p++) { - ch = *p; - -#if 0 - ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "grpc goaway byte: %02Xd s:%d", ch, state); -#endif - - switch (state) { - - case sw_start: - ctx->stream_id = (ch & 0x7f) << 24; - state = sw_last_stream_id_2; - break; - - case sw_last_stream_id_2: - ctx->stream_id |= ch << 16; - state = sw_last_stream_id_3; - break; - - case sw_last_stream_id_3: - ctx->stream_id |= ch << 8; - state = sw_last_stream_id_4; - break; - - case sw_last_stream_id_4: - ctx->stream_id |= ch; - state = sw_error; - break; - - case sw_error: - ctx->error = (ngx_uint_t) ch << 24; - state = sw_error_2; - break; - - case sw_error_2: - ctx->error |= ch << 16; - state = sw_error_3; - break; - - case sw_error_3: - ctx->error |= ch << 8; - state = sw_error_4; - break; - - case sw_error_4: - ctx->error |= ch; - state = sw_debug; - break; - - case sw_debug: - break; - } - } - - ctx->rest -= p - b->pos; - ctx->frame_state = state; - b->pos = p; - - if (ctx->rest > 0) { - return NGX_AGAIN; - } - - ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "grpc goaway: %ui, stream %ui", - ctx->error, ctx->stream_id); - - ctx->state = ngx_http_grpc_st_start; - - return NGX_OK; -} - - -static ngx_int_t -ngx_http_grpc_parse_window_update(ngx_http_request_t *r, - ngx_http_grpc_ctx_t *ctx, ngx_buf_t *b) -{ - u_char ch, *p, *last; - enum { - sw_start = 0, - sw_size_2, - sw_size_3, - sw_size_4 - } state; - - if (b->last - b->pos < (ssize_t) ctx->rest) { - last = b->last; - - } else { - last = b->pos + ctx->rest; - } - - state = ctx->frame_state; - - if (state == sw_start) { - if (ctx->rest != 4) { - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "upstream sent window update frame " - "with invalid length: %uz", - ctx->rest); - return NGX_ERROR; - } - } - - for (p = b->pos; p < last; p++) { - ch = *p; - -#if 0 - ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "grpc window update byte: %02Xd s:%d", ch, state); -#endif - - switch (state) { - - case sw_start: - ctx->window_update = (ch & 0x7f) << 24; - state = sw_size_2; - break; - - case sw_size_2: - ctx->window_update |= ch << 16; - state = sw_size_3; - break; - - case sw_size_3: - ctx->window_update |= ch << 8; - state = sw_size_4; - break; - - case sw_size_4: - ctx->window_update |= ch; - state = sw_start; - break; - } - } - - ctx->rest -= p - b->pos; - ctx->frame_state = state; - b->pos = p; - - if (ctx->rest > 0) { - return NGX_AGAIN; - } - - ctx->state = ngx_http_grpc_st_start; - - ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "grpc window update: %ui", ctx->window_update); - - if (ctx->stream_id) { - - if (ctx->window_update > (size_t) NGX_HTTP_V2_MAX_WINDOW - - ctx->send_window) - { - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "upstream sent too large window update"); - return NGX_ERROR; - } - - ctx->send_window += ctx->window_update; - - } else { - - if (ctx->window_update > NGX_HTTP_V2_MAX_WINDOW - - ctx->connection->send_window) - { - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "upstream sent too large window update"); - return NGX_ERROR; - } - - ctx->connection->send_window += ctx->window_update; - } - - return NGX_OK; -} - - -static ngx_int_t -ngx_http_grpc_parse_settings(ngx_http_request_t *r, ngx_http_grpc_ctx_t *ctx, - ngx_buf_t *b) -{ - u_char ch, *p, *last; - ssize_t window_update; - enum { - sw_start = 0, - sw_id, - sw_id_2, - sw_value, - sw_value_2, - sw_value_3, - sw_value_4 - } state; - - if (b->last - b->pos < (ssize_t) ctx->rest) { - last = b->last; - - } else { - last = b->pos + ctx->rest; - } - - state = ctx->frame_state; - - if (state == sw_start) { - - if (ctx->stream_id) { - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "upstream sent settings frame " - "with non-zero stream id: %ui", - ctx->stream_id); - return NGX_ERROR; - } - - if (ctx->flags & NGX_HTTP_V2_ACK_FLAG) { - ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "grpc settings ack"); - - if (ctx->rest != 0) { - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "upstream sent settings frame " - "with ack flag and non-zero length: %uz", - ctx->rest); - return NGX_ERROR; - } - - ctx->state = ngx_http_grpc_st_start; - - return NGX_OK; - } - - if (ctx->rest % 6 != 0) { - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "upstream sent settings frame " - "with invalid length: %uz", - ctx->rest); - return NGX_ERROR; - } - - if (ctx->free == NULL && ctx->settings++ > 1000) { - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "upstream sent too many settings frames"); - return NGX_ERROR; - } - } - - for (p = b->pos; p < last; p++) { - ch = *p; - -#if 0 - ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "grpc settings byte: %02Xd s:%d", ch, state); -#endif - - switch (state) { - - case sw_start: - case sw_id: - ctx->setting_id = ch << 8; - state = sw_id_2; - break; - - case sw_id_2: - ctx->setting_id |= ch; - state = sw_value; - break; - - case sw_value: - ctx->setting_value = (ngx_uint_t) ch << 24; - state = sw_value_2; - break; - - case sw_value_2: - ctx->setting_value |= ch << 16; - state = sw_value_3; - break; - - case sw_value_3: - ctx->setting_value |= ch << 8; - state = sw_value_4; - break; - - case sw_value_4: - ctx->setting_value |= ch; - state = sw_id; - - ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "grpc setting: %ui %ui", - ctx->setting_id, ctx->setting_value); - - /* - * The following settings are defined by the protocol: - * - * SETTINGS_HEADER_TABLE_SIZE, SETTINGS_ENABLE_PUSH, - * SETTINGS_MAX_CONCURRENT_STREAMS, SETTINGS_INITIAL_WINDOW_SIZE, - * SETTINGS_MAX_FRAME_SIZE, SETTINGS_MAX_HEADER_LIST_SIZE - * - * Only SETTINGS_INITIAL_WINDOW_SIZE seems to be needed in - * a simple client. - */ - - if (ctx->setting_id == 0x04) { - /* SETTINGS_INITIAL_WINDOW_SIZE */ - - if (ctx->setting_value > NGX_HTTP_V2_MAX_WINDOW) { - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "upstream sent settings frame " - "with too large initial window size: %ui", - ctx->setting_value); - return NGX_ERROR; - } - - window_update = ctx->setting_value - - ctx->connection->init_window; - ctx->connection->init_window = ctx->setting_value; - - if (ctx->send_window > 0 - && window_update > (ssize_t) NGX_HTTP_V2_MAX_WINDOW - - ctx->send_window) - { - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "upstream sent settings frame " - "with too large initial window size: %ui", - ctx->setting_value); - return NGX_ERROR; - } - - ctx->send_window += window_update; - } - - break; - } - } - - ctx->rest -= p - b->pos; - ctx->frame_state = state; - b->pos = p; - - if (ctx->rest > 0) { - return NGX_AGAIN; - } - - ctx->state = ngx_http_grpc_st_start; - - return ngx_http_grpc_send_settings_ack(r, ctx); -} - - -static ngx_int_t -ngx_http_grpc_parse_ping(ngx_http_request_t *r, - ngx_http_grpc_ctx_t *ctx, ngx_buf_t *b) -{ - u_char ch, *p, *last; - enum { - sw_start = 0, - sw_data_2, - sw_data_3, - sw_data_4, - sw_data_5, - sw_data_6, - sw_data_7, - sw_data_8 - } state; - - if (b->last - b->pos < (ssize_t) ctx->rest) { - last = b->last; - - } else { - last = b->pos + ctx->rest; - } - - state = ctx->frame_state; - - if (state == sw_start) { - - if (ctx->stream_id) { - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "upstream sent ping frame " - "with non-zero stream id: %ui", - ctx->stream_id); - return NGX_ERROR; - } - - if (ctx->rest != 8) { - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "upstream sent ping frame " - "with invalid length: %uz", - ctx->rest); - return NGX_ERROR; - } - - if (ctx->flags & NGX_HTTP_V2_ACK_FLAG) { - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "upstream sent ping frame with ack flag"); - return NGX_ERROR; - } - - if (ctx->free == NULL && ctx->pings++ > 1000) { - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "upstream sent too many ping frames"); - return NGX_ERROR; - } - } - - for (p = b->pos; p < last; p++) { - ch = *p; - -#if 0 - ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "grpc ping byte: %02Xd s:%d", ch, state); -#endif - - if (state < sw_data_8) { - ctx->ping_data[state] = ch; - state++; - - } else { - ctx->ping_data[7] = ch; - state = sw_start; - - ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "grpc ping"); - } - } - - ctx->rest -= p - b->pos; - ctx->frame_state = state; - b->pos = p; - - if (ctx->rest > 0) { - return NGX_AGAIN; - } - - ctx->state = ngx_http_grpc_st_start; - - return ngx_http_grpc_send_ping_ack(r, ctx); -} - - -static ngx_int_t -ngx_http_grpc_send_settings_ack(ngx_http_request_t *r, ngx_http_grpc_ctx_t *ctx) -{ - ngx_chain_t *cl, **ll; - ngx_http_grpc_frame_t *f; - - ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "grpc send settings ack"); - - for (cl = ctx->out, ll = &ctx->out; cl; cl = cl->next) { - ll = &cl->next; - } - - cl = ngx_http_grpc_get_buf(r, ctx); - if (cl == NULL) { - return NGX_ERROR; - } - - f = (ngx_http_grpc_frame_t *) cl->buf->last; - cl->buf->last += sizeof(ngx_http_grpc_frame_t); - - f->length_0 = 0; - f->length_1 = 0; - f->length_2 = 0; - f->type = NGX_HTTP_V2_SETTINGS_FRAME; - f->flags = NGX_HTTP_V2_ACK_FLAG; - f->stream_id_0 = 0; - f->stream_id_1 = 0; - f->stream_id_2 = 0; - f->stream_id_3 = 0; - - *ll = cl; - - return NGX_OK; -} - - -static ngx_int_t -ngx_http_grpc_send_ping_ack(ngx_http_request_t *r, ngx_http_grpc_ctx_t *ctx) -{ - ngx_chain_t *cl, **ll; - ngx_http_grpc_frame_t *f; - - ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "grpc send ping ack"); - - for (cl = ctx->out, ll = &ctx->out; cl; cl = cl->next) { - ll = &cl->next; - } - - cl = ngx_http_grpc_get_buf(r, ctx); - if (cl == NULL) { - return NGX_ERROR; - } - - f = (ngx_http_grpc_frame_t *) cl->buf->last; - cl->buf->last += sizeof(ngx_http_grpc_frame_t); - - f->length_0 = 0; - f->length_1 = 0; - f->length_2 = 8; - f->type = NGX_HTTP_V2_PING_FRAME; - f->flags = NGX_HTTP_V2_ACK_FLAG; - f->stream_id_0 = 0; - f->stream_id_1 = 0; - f->stream_id_2 = 0; - f->stream_id_3 = 0; - - cl->buf->last = ngx_copy(cl->buf->last, ctx->ping_data, 8); - - *ll = cl; - - return NGX_OK; -} - - -static ngx_int_t -ngx_http_grpc_send_window_update(ngx_http_request_t *r, - ngx_http_grpc_ctx_t *ctx) -{ - size_t n; - ngx_chain_t *cl, **ll; - ngx_http_grpc_frame_t *f; - - ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "grpc send window update: %uz %uz", - ctx->connection->recv_window, ctx->recv_window); - - for (cl = ctx->out, ll = &ctx->out; cl; cl = cl->next) { - ll = &cl->next; - } - - cl = ngx_http_grpc_get_buf(r, ctx); - if (cl == NULL) { - return NGX_ERROR; - } - - f = (ngx_http_grpc_frame_t *) cl->buf->last; - cl->buf->last += sizeof(ngx_http_grpc_frame_t); - - f->length_0 = 0; - f->length_1 = 0; - f->length_2 = 4; - f->type = NGX_HTTP_V2_WINDOW_UPDATE_FRAME; - f->flags = 0; - f->stream_id_0 = 0; - f->stream_id_1 = 0; - f->stream_id_2 = 0; - f->stream_id_3 = 0; - - n = NGX_HTTP_V2_MAX_WINDOW - ctx->connection->recv_window; - ctx->connection->recv_window = NGX_HTTP_V2_MAX_WINDOW; - - *cl->buf->last++ = (u_char) ((n >> 24) & 0xff); - *cl->buf->last++ = (u_char) ((n >> 16) & 0xff); - *cl->buf->last++ = (u_char) ((n >> 8) & 0xff); - *cl->buf->last++ = (u_char) (n & 0xff); - - f = (ngx_http_grpc_frame_t *) cl->buf->last; - cl->buf->last += sizeof(ngx_http_grpc_frame_t); - - f->length_0 = 0; - f->length_1 = 0; - f->length_2 = 4; - f->type = NGX_HTTP_V2_WINDOW_UPDATE_FRAME; - f->flags = 0; - f->stream_id_0 = (u_char) ((ctx->id >> 24) & 0xff); - f->stream_id_1 = (u_char) ((ctx->id >> 16) & 0xff); - f->stream_id_2 = (u_char) ((ctx->id >> 8) & 0xff); - f->stream_id_3 = (u_char) (ctx->id & 0xff); - - n = NGX_HTTP_V2_MAX_WINDOW - ctx->recv_window; - ctx->recv_window = NGX_HTTP_V2_MAX_WINDOW; - - *cl->buf->last++ = (u_char) ((n >> 24) & 0xff); - *cl->buf->last++ = (u_char) ((n >> 16) & 0xff); - *cl->buf->last++ = (u_char) ((n >> 8) & 0xff); - *cl->buf->last++ = (u_char) (n & 0xff); - - *ll = cl; - - return NGX_OK; -} - - -static ngx_chain_t * -ngx_http_grpc_get_buf(ngx_http_request_t *r, ngx_http_grpc_ctx_t *ctx) -{ - u_char *start; - ngx_buf_t *b; - ngx_chain_t *cl; - - cl = ngx_chain_get_free_buf(r->pool, &ctx->free); - if (cl == NULL) { - return NULL; - } - - b = cl->buf; - start = b->start; - - if (start == NULL) { - - /* - * each buffer is large enough to hold two window update - * frames in a row - */ - - start = ngx_palloc(r->pool, 2 * sizeof(ngx_http_grpc_frame_t) + 8); - if (start == NULL) { - return NULL; - } - - } - - ngx_memzero(b, sizeof(ngx_buf_t)); - - b->start = start; - b->pos = start; - b->last = start; - b->end = start + 2 * sizeof(ngx_http_grpc_frame_t) + 8; - - b->tag = (ngx_buf_tag_t) &ngx_http_grpc_body_output_filter; - b->temporary = 1; - b->flush = 1; - - return cl; -} - - -static ngx_http_grpc_ctx_t * -ngx_http_grpc_get_ctx(ngx_http_request_t *r) -{ - ngx_http_grpc_ctx_t *ctx; - ngx_http_upstream_t *u; - - ctx = ngx_http_get_module_ctx(r, ngx_http_grpc_module); - - if (ctx->connection == NULL) { - u = r->upstream; - - if (ngx_http_grpc_get_connection_data(r, ctx, &u->peer) != NGX_OK) { - return NULL; - } - } - - return ctx; -} - - -static ngx_int_t -ngx_http_grpc_get_connection_data(ngx_http_request_t *r, - ngx_http_grpc_ctx_t *ctx, ngx_peer_connection_t *pc) -{ - ngx_connection_t *c; - ngx_pool_cleanup_t *cln; - - c = pc->connection; - - if (pc->cached) { - - /* - * for cached connections, connection data can be found - * in the cleanup handler - */ - - for (cln = c->pool->cleanup; cln; cln = cln->next) { - if (cln->handler == ngx_http_grpc_cleanup) { - ctx->connection = cln->data; - break; - } - } - - if (ctx->connection == NULL) { - ngx_log_error(NGX_LOG_ERR, c->log, 0, - "no connection data found for " - "keepalive http2 connection"); - return NGX_ERROR; - } - - ctx->send_window = ctx->connection->init_window; - ctx->recv_window = NGX_HTTP_V2_MAX_WINDOW; - - ctx->connection->last_stream_id += 2; - ctx->id = ctx->connection->last_stream_id; - - return NGX_OK; - } - - cln = ngx_pool_cleanup_add(c->pool, sizeof(ngx_http_grpc_conn_t)); - if (cln == NULL) { - return NGX_ERROR; - } - - cln->handler = ngx_http_grpc_cleanup; - ctx->connection = cln->data; - - ctx->connection->init_window = NGX_HTTP_V2_DEFAULT_WINDOW; - ctx->connection->send_window = NGX_HTTP_V2_DEFAULT_WINDOW; - ctx->connection->recv_window = NGX_HTTP_V2_MAX_WINDOW; - - ctx->send_window = NGX_HTTP_V2_DEFAULT_WINDOW; - ctx->recv_window = NGX_HTTP_V2_MAX_WINDOW; - - ctx->id = 1; - ctx->connection->last_stream_id = 1; - - return NGX_OK; -} - - -static void -ngx_http_grpc_cleanup(void *data) -{ -#if 0 - ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0, - "grpc cleanup"); -#endif - return; -} - - -static void -ngx_http_grpc_abort_request(ngx_http_request_t *r) -{ - ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "abort grpc request"); - return; -} - - -static void -ngx_http_grpc_finalize_request(ngx_http_request_t *r, ngx_int_t rc) -{ - ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "finalize grpc request"); - return; -} - - -static ngx_int_t -ngx_http_grpc_internal_trailers_variable(ngx_http_request_t *r, - ngx_http_variable_value_t *v, uintptr_t data) -{ - ngx_table_elt_t *te; - - te = r->headers_in.te; - - if (te == NULL) { - v->not_found = 1; - return NGX_OK; - } - - if (ngx_strlcasestrn(te->value.data, te->value.data + te->value.len, - (u_char *) "trailers", 8 - 1) - == NULL) - { - v->not_found = 1; - return NGX_OK; - } - - v->valid = 1; - v->no_cacheable = 0; - v->not_found = 0; - - v->data = (u_char *) "trailers"; - v->len = sizeof("trailers") - 1; - - return NGX_OK; -} - - -static ngx_int_t -ngx_http_grpc_add_variables(ngx_conf_t *cf) -{ - ngx_http_variable_t *var, *v; - - for (v = ngx_http_grpc_vars; v->name.len; v++) { - var = ngx_http_add_variable(cf, &v->name, v->flags); - if (var == NULL) { - return NGX_ERROR; - } - - var->get_handler = v->get_handler; - var->data = v->data; - } - - return NGX_OK; -} - - -static void * -ngx_http_grpc_create_loc_conf(ngx_conf_t *cf) -{ - ngx_http_grpc_loc_conf_t *conf; - - conf = ngx_pcalloc(cf->pool, sizeof(ngx_http_grpc_loc_conf_t)); - if (conf == NULL) { - return NULL; - } - - /* - * set by ngx_pcalloc(): - * - * conf->upstream.ignore_headers = 0; - * conf->upstream.next_upstream = 0; - * conf->upstream.hide_headers_hash = { NULL, 0 }; - * - * conf->headers.lengths = NULL; - * conf->headers.values = NULL; - * conf->headers.hash = { NULL, 0 }; - * conf->host = { 0, NULL }; - * conf->host_set = 0; - * conf->ssl = 0; - * conf->ssl_protocols = 0; - * conf->ssl_ciphers = { 0, NULL }; - * conf->ssl_trusted_certificate = { 0, NULL }; - * conf->ssl_crl = { 0, NULL }; - */ - - conf->upstream.local = NGX_CONF_UNSET_PTR; - conf->upstream.socket_keepalive = NGX_CONF_UNSET; - conf->upstream.next_upstream_tries = NGX_CONF_UNSET_UINT; - conf->upstream.connect_timeout = NGX_CONF_UNSET_MSEC; - conf->upstream.send_timeout = NGX_CONF_UNSET_MSEC; - conf->upstream.read_timeout = NGX_CONF_UNSET_MSEC; - conf->upstream.next_upstream_timeout = NGX_CONF_UNSET_MSEC; - - conf->upstream.buffer_size = NGX_CONF_UNSET_SIZE; - - conf->upstream.hide_headers = NGX_CONF_UNSET_PTR; - conf->upstream.pass_headers = NGX_CONF_UNSET_PTR; - - conf->upstream.intercept_errors = NGX_CONF_UNSET; - -#if (NGX_HTTP_SSL) - conf->upstream.ssl_session_reuse = NGX_CONF_UNSET; - conf->upstream.ssl_name = NGX_CONF_UNSET_PTR; - conf->upstream.ssl_server_name = NGX_CONF_UNSET; - conf->upstream.ssl_verify = NGX_CONF_UNSET; - conf->ssl_verify_depth = NGX_CONF_UNSET_UINT; - conf->upstream.ssl_certificate = NGX_CONF_UNSET_PTR; - conf->upstream.ssl_certificate_key = NGX_CONF_UNSET_PTR; - conf->upstream.ssl_certificate_cache = NGX_CONF_UNSET_PTR; - conf->upstream.ssl_passwords = NGX_CONF_UNSET_PTR; - conf->ssl_conf_commands = NGX_CONF_UNSET_PTR; -#endif - - /* the hardcoded values */ - conf->upstream.cyclic_temp_file = 0; - conf->upstream.buffering = 0; - conf->upstream.ignore_client_abort = 0; - conf->upstream.send_lowat = 0; - conf->upstream.bufs.num = 0; - conf->upstream.busy_buffers_size = 0; - conf->upstream.max_temp_file_size = 0; - conf->upstream.temp_file_write_size = 0; - conf->upstream.pass_request_headers = 1; - conf->upstream.pass_request_body = 1; - conf->upstream.force_ranges = 0; - conf->upstream.pass_trailers = 1; - conf->upstream.pass_early_hints = 1; - conf->upstream.preserve_output = 1; - - conf->headers_source = NGX_CONF_UNSET_PTR; - - ngx_str_set(&conf->upstream.module, "grpc"); - - return conf; -} - - -static char * -ngx_http_grpc_merge_loc_conf(ngx_conf_t *cf, void *parent, void *child) -{ - ngx_http_grpc_loc_conf_t *prev = parent; - ngx_http_grpc_loc_conf_t *conf = child; - - ngx_int_t rc; - ngx_hash_init_t hash; - ngx_http_core_loc_conf_t *clcf; - - ngx_conf_merge_ptr_value(conf->upstream.local, - prev->upstream.local, NULL); - - ngx_conf_merge_value(conf->upstream.socket_keepalive, - prev->upstream.socket_keepalive, 0); - - ngx_conf_merge_uint_value(conf->upstream.next_upstream_tries, - prev->upstream.next_upstream_tries, 0); - - ngx_conf_merge_msec_value(conf->upstream.connect_timeout, - prev->upstream.connect_timeout, 60000); - - ngx_conf_merge_msec_value(conf->upstream.send_timeout, - prev->upstream.send_timeout, 60000); - - ngx_conf_merge_msec_value(conf->upstream.read_timeout, - prev->upstream.read_timeout, 60000); - - ngx_conf_merge_msec_value(conf->upstream.next_upstream_timeout, - prev->upstream.next_upstream_timeout, 0); - - ngx_conf_merge_size_value(conf->upstream.buffer_size, - prev->upstream.buffer_size, - (size_t) ngx_pagesize); - - ngx_conf_merge_bitmask_value(conf->upstream.ignore_headers, - prev->upstream.ignore_headers, - NGX_CONF_BITMASK_SET); - - ngx_conf_merge_bitmask_value(conf->upstream.next_upstream, - prev->upstream.next_upstream, - (NGX_CONF_BITMASK_SET - |NGX_HTTP_UPSTREAM_FT_ERROR - |NGX_HTTP_UPSTREAM_FT_TIMEOUT)); - - if (conf->upstream.next_upstream & NGX_HTTP_UPSTREAM_FT_OFF) { - conf->upstream.next_upstream = NGX_CONF_BITMASK_SET - |NGX_HTTP_UPSTREAM_FT_OFF; - } - - ngx_conf_merge_value(conf->upstream.intercept_errors, - prev->upstream.intercept_errors, 0); - -#if (NGX_HTTP_SSL) - - if (ngx_http_grpc_merge_ssl(cf, conf, prev) != NGX_OK) { - return NGX_CONF_ERROR; - } - - ngx_conf_merge_value(conf->upstream.ssl_session_reuse, - prev->upstream.ssl_session_reuse, 1); - - ngx_conf_merge_bitmask_value(conf->ssl_protocols, prev->ssl_protocols, - (NGX_CONF_BITMASK_SET|NGX_SSL_DEFAULT_PROTOCOLS)); - - ngx_conf_merge_str_value(conf->ssl_ciphers, prev->ssl_ciphers, - "DEFAULT"); - - ngx_conf_merge_ptr_value(conf->upstream.ssl_name, - prev->upstream.ssl_name, NULL); - ngx_conf_merge_value(conf->upstream.ssl_server_name, - prev->upstream.ssl_server_name, 0); - ngx_conf_merge_value(conf->upstream.ssl_verify, - prev->upstream.ssl_verify, 0); - ngx_conf_merge_uint_value(conf->ssl_verify_depth, - prev->ssl_verify_depth, 1); - ngx_conf_merge_str_value(conf->ssl_trusted_certificate, - prev->ssl_trusted_certificate, ""); - ngx_conf_merge_str_value(conf->ssl_crl, prev->ssl_crl, ""); - - ngx_conf_merge_ptr_value(conf->upstream.ssl_certificate, - prev->upstream.ssl_certificate, NULL); - ngx_conf_merge_ptr_value(conf->upstream.ssl_certificate_key, - prev->upstream.ssl_certificate_key, NULL); - ngx_conf_merge_ptr_value(conf->upstream.ssl_certificate_cache, - prev->upstream.ssl_certificate_cache, NULL); - - if (ngx_http_upstream_merge_ssl_passwords(cf, &conf->upstream, - &prev->upstream) - != NGX_OK) - { - return NGX_CONF_ERROR; - } - - ngx_conf_merge_ptr_value(conf->ssl_conf_commands, - prev->ssl_conf_commands, NULL); - - if (conf->ssl && ngx_http_grpc_set_ssl(cf, conf) != NGX_OK) { - return NGX_CONF_ERROR; - } - -#endif - - hash.max_size = 512; - hash.bucket_size = ngx_align(64, ngx_cacheline_size); - hash.name = "grpc_headers_hash"; - - if (ngx_http_upstream_hide_headers_hash(cf, &conf->upstream, - &prev->upstream, ngx_http_grpc_hide_headers, &hash) - != NGX_OK) - { - return NGX_CONF_ERROR; - } - - clcf = ngx_http_conf_get_module_loc_conf(cf, ngx_http_core_module); - - if (clcf->noname - && conf->upstream.upstream == NULL && conf->grpc_lengths == NULL) - { - conf->upstream.upstream = prev->upstream.upstream; - conf->host = prev->host; - - conf->grpc_lengths = prev->grpc_lengths; - conf->grpc_values = prev->grpc_values; - -#if (NGX_HTTP_SSL) - conf->ssl = prev->ssl; -#endif - } - - if (clcf->lmt_excpt && clcf->handler == NULL - && (conf->upstream.upstream || conf->grpc_lengths)) - { - clcf->handler = ngx_http_grpc_handler; - } - - ngx_conf_merge_ptr_value(conf->headers_source, prev->headers_source, NULL); - - if (conf->headers_source == prev->headers_source) { - conf->headers = prev->headers; - conf->host_set = prev->host_set; - } - - rc = ngx_http_grpc_init_headers(cf, conf, &conf->headers, - ngx_http_grpc_headers); - if (rc != NGX_OK) { - return NGX_CONF_ERROR; - } - - /* - * special handling to preserve conf->headers in the "http" section - * to inherit it to all servers - */ - - if (prev->headers.hash.buckets == NULL - && conf->headers_source == prev->headers_source) - { - prev->headers = conf->headers; - prev->host_set = conf->host_set; - } - - return NGX_CONF_OK; -} - - -static ngx_int_t -ngx_http_grpc_init_headers(ngx_conf_t *cf, ngx_http_grpc_loc_conf_t *conf, - ngx_http_grpc_headers_t *headers, ngx_keyval_t *default_headers) -{ - u_char *p; - size_t size; - uintptr_t *code; - ngx_uint_t i; - ngx_array_t headers_names, headers_merged; - ngx_keyval_t *src, *s, *h; - ngx_hash_key_t *hk; - ngx_hash_init_t hash; - ngx_http_script_compile_t sc; - ngx_http_script_copy_code_t *copy; - - if (headers->hash.buckets) { - return NGX_OK; - } - - if (ngx_array_init(&headers_names, cf->temp_pool, 4, sizeof(ngx_hash_key_t)) - != NGX_OK) - { - return NGX_ERROR; - } - - if (ngx_array_init(&headers_merged, cf->temp_pool, 4, sizeof(ngx_keyval_t)) - != NGX_OK) - { - return NGX_ERROR; - } - - headers->lengths = ngx_array_create(cf->pool, 64, 1); - if (headers->lengths == NULL) { - return NGX_ERROR; - } - - headers->values = ngx_array_create(cf->pool, 512, 1); - if (headers->values == NULL) { - return NGX_ERROR; - } - - if (conf->headers_source) { - - src = conf->headers_source->elts; - for (i = 0; i < conf->headers_source->nelts; i++) { - - if (src[i].key.len == 4 - && ngx_strncasecmp(src[i].key.data, (u_char *) "Host", 4) == 0) - { - conf->host_set = 1; - } - - s = ngx_array_push(&headers_merged); - if (s == NULL) { - return NGX_ERROR; - } - - *s = src[i]; - } - } - - h = default_headers; - - while (h->key.len) { - - src = headers_merged.elts; - for (i = 0; i < headers_merged.nelts; i++) { - if (ngx_strcasecmp(h->key.data, src[i].key.data) == 0) { - goto next; - } - } - - s = ngx_array_push(&headers_merged); - if (s == NULL) { - return NGX_ERROR; - } - - *s = *h; - - next: - - h++; - } - - - src = headers_merged.elts; - for (i = 0; i < headers_merged.nelts; i++) { - - hk = ngx_array_push(&headers_names); - if (hk == NULL) { - return NGX_ERROR; - } - - hk->key = src[i].key; - hk->key_hash = ngx_hash_key_lc(src[i].key.data, src[i].key.len); - hk->value = (void *) 1; - - if (src[i].value.len == 0) { - continue; - } - - copy = ngx_array_push_n(headers->lengths, - sizeof(ngx_http_script_copy_code_t)); - if (copy == NULL) { - return NGX_ERROR; - } - - copy->code = (ngx_http_script_code_pt) (void *) - ngx_http_script_copy_len_code; - copy->len = src[i].key.len; - - size = (sizeof(ngx_http_script_copy_code_t) - + src[i].key.len + sizeof(uintptr_t) - 1) - & ~(sizeof(uintptr_t) - 1); - - copy = ngx_array_push_n(headers->values, size); - if (copy == NULL) { - return NGX_ERROR; - } - - copy->code = ngx_http_script_copy_code; - copy->len = src[i].key.len; - - p = (u_char *) copy + sizeof(ngx_http_script_copy_code_t); - ngx_memcpy(p, src[i].key.data, src[i].key.len); - - ngx_memzero(&sc, sizeof(ngx_http_script_compile_t)); - - sc.cf = cf; - sc.source = &src[i].value; - sc.flushes = &headers->flushes; - sc.lengths = &headers->lengths; - sc.values = &headers->values; - - if (ngx_http_script_compile(&sc) != NGX_OK) { - return NGX_ERROR; - } - - code = ngx_array_push_n(headers->lengths, sizeof(uintptr_t)); - if (code == NULL) { - return NGX_ERROR; - } - - *code = (uintptr_t) NULL; - - code = ngx_array_push_n(headers->values, sizeof(uintptr_t)); - if (code == NULL) { - return NGX_ERROR; - } - - *code = (uintptr_t) NULL; - } - - code = ngx_array_push_n(headers->lengths, sizeof(uintptr_t)); - if (code == NULL) { - return NGX_ERROR; - } - - *code = (uintptr_t) NULL; - - - hash.hash = &headers->hash; - hash.key = ngx_hash_key_lc; - hash.max_size = 512; - hash.bucket_size = 64; - hash.name = "grpc_headers_hash"; - hash.pool = cf->pool; - hash.temp_pool = NULL; - - return ngx_hash_init(&hash, headers_names.elts, headers_names.nelts); -} - - -static char * -ngx_http_grpc_pass(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) -{ - ngx_http_grpc_loc_conf_t *glcf = conf; - - size_t add; - ngx_str_t *value, *url; - ngx_url_t u; - ngx_uint_t n; - ngx_http_core_loc_conf_t *clcf; - ngx_http_script_compile_t sc; - - if (glcf->upstream.upstream || glcf->grpc_lengths) { - return "is duplicate"; - } - - clcf = ngx_http_conf_get_module_loc_conf(cf, ngx_http_core_module); - - clcf->handler = ngx_http_grpc_handler; - - if (clcf->name.len && clcf->name.data[clcf->name.len - 1] == '/') { - clcf->auto_redirect = 1; - } - - value = cf->args->elts; - - url = &value[1]; - - n = ngx_http_script_variables_count(url); - - if (n) { - - ngx_memzero(&sc, sizeof(ngx_http_script_compile_t)); - - sc.cf = cf; - sc.source = url; - sc.lengths = &glcf->grpc_lengths; - sc.values = &glcf->grpc_values; - sc.variables = n; - sc.complete_lengths = 1; - sc.complete_values = 1; - - if (ngx_http_script_compile(&sc) != NGX_OK) { - return NGX_CONF_ERROR; - } - -#if (NGX_HTTP_SSL) - glcf->ssl = 1; -#endif - - return NGX_CONF_OK; - } - - if (ngx_strncasecmp(url->data, (u_char *) "grpc://", 7) == 0) { - add = 7; - - } else if (ngx_strncasecmp(url->data, (u_char *) "grpcs://", 8) == 0) { - -#if (NGX_HTTP_SSL) - glcf->ssl = 1; - - add = 8; -#else - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "grpcs protocol requires SSL support"); - return NGX_CONF_ERROR; -#endif - - } else { - add = 0; - } - - ngx_memzero(&u, sizeof(ngx_url_t)); - - u.url.len = url->len - add; - u.url.data = url->data + add; - u.no_resolve = 1; - - glcf->upstream.upstream = ngx_http_upstream_add(cf, &u, 0); - if (glcf->upstream.upstream == NULL) { - return NGX_CONF_ERROR; - } - - if (u.family != AF_UNIX) { - - if (u.no_port) { - glcf->host = u.host; - - } else { - glcf->host.len = u.host.len + 1 + u.port_text.len; - glcf->host.data = u.host.data; - } - - } else { - ngx_str_set(&glcf->host, "localhost"); - } - - return NGX_CONF_OK; -} - - -#if (NGX_HTTP_SSL) - -static char * -ngx_http_grpc_ssl_certificate_cache(ngx_conf_t *cf, ngx_command_t *cmd, - void *conf) -{ - ngx_http_grpc_loc_conf_t *plcf = conf; - - time_t inactive, valid; - ngx_str_t *value, s; - ngx_int_t max; - ngx_uint_t i; - - if (plcf->upstream.ssl_certificate_cache != NGX_CONF_UNSET_PTR) { - return "is duplicate"; - } - - value = cf->args->elts; - - max = 0; - inactive = 10; - valid = 60; - - for (i = 1; i < cf->args->nelts; i++) { - - if (ngx_strncmp(value[i].data, "max=", 4) == 0) { - - max = ngx_atoi(value[i].data + 4, value[i].len - 4); - if (max <= 0) { - goto failed; - } - - continue; - } - - if (ngx_strncmp(value[i].data, "inactive=", 9) == 0) { - - s.len = value[i].len - 9; - s.data = value[i].data + 9; - - inactive = ngx_parse_time(&s, 1); - if (inactive == (time_t) NGX_ERROR) { - goto failed; - } - - continue; - } - - if (ngx_strncmp(value[i].data, "valid=", 6) == 0) { - - s.len = value[i].len - 6; - s.data = value[i].data + 6; - - valid = ngx_parse_time(&s, 1); - if (valid == (time_t) NGX_ERROR) { - goto failed; - } - - continue; - } - - if (ngx_strcmp(value[i].data, "off") == 0) { - - plcf->upstream.ssl_certificate_cache = NULL; - - continue; - } - - failed: - - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "invalid parameter \"%V\"", &value[i]); - return NGX_CONF_ERROR; - } - - if (plcf->upstream.ssl_certificate_cache == NULL) { - return NGX_CONF_OK; - } - - if (max == 0) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "\"grpc_ssl_certificate_cache\" must have " - "the \"max\" parameter"); - return NGX_CONF_ERROR; - } - - plcf->upstream.ssl_certificate_cache = ngx_ssl_cache_init(cf->pool, max, - valid, inactive); - if (plcf->upstream.ssl_certificate_cache == NULL) { - return NGX_CONF_ERROR; - } - - return NGX_CONF_OK; -} - - -static char * -ngx_http_grpc_ssl_password_file(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) -{ - ngx_http_grpc_loc_conf_t *glcf = conf; - - ngx_str_t *value; - - if (glcf->upstream.ssl_passwords != NGX_CONF_UNSET_PTR) { - return "is duplicate"; - } - - value = cf->args->elts; - - glcf->upstream.ssl_passwords = ngx_ssl_read_password_file(cf, &value[1]); - - if (glcf->upstream.ssl_passwords == NULL) { - return NGX_CONF_ERROR; - } - - return NGX_CONF_OK; -} - - -static char * -ngx_http_grpc_ssl_conf_command_check(ngx_conf_t *cf, void *post, void *data) -{ -#ifndef SSL_CONF_FLAG_FILE - return "is not supported on this platform"; -#else - return NGX_CONF_OK; -#endif -} - - -static ngx_int_t -ngx_http_grpc_merge_ssl(ngx_conf_t *cf, ngx_http_grpc_loc_conf_t *conf, - ngx_http_grpc_loc_conf_t *prev) -{ - ngx_uint_t preserve; - - if (conf->ssl_protocols == 0 - && conf->ssl_ciphers.data == NULL - && conf->upstream.ssl_certificate == NGX_CONF_UNSET_PTR - && conf->upstream.ssl_certificate_key == NGX_CONF_UNSET_PTR - && conf->upstream.ssl_passwords == NGX_CONF_UNSET_PTR - && conf->upstream.ssl_verify == NGX_CONF_UNSET - && conf->ssl_verify_depth == NGX_CONF_UNSET_UINT - && conf->ssl_trusted_certificate.data == NULL - && conf->ssl_crl.data == NULL - && conf->upstream.ssl_session_reuse == NGX_CONF_UNSET - && conf->ssl_conf_commands == NGX_CONF_UNSET_PTR) - { - if (prev->upstream.ssl) { - conf->upstream.ssl = prev->upstream.ssl; - return NGX_OK; - } - - preserve = 1; - - } else { - preserve = 0; - } - - conf->upstream.ssl = ngx_pcalloc(cf->pool, sizeof(ngx_ssl_t)); - if (conf->upstream.ssl == NULL) { - return NGX_ERROR; - } - - conf->upstream.ssl->log = cf->log; - - /* - * special handling to preserve conf->upstream.ssl - * in the "http" section to inherit it to all servers - */ - - if (preserve) { - prev->upstream.ssl = conf->upstream.ssl; - } - - return NGX_OK; -} - - -static ngx_int_t -ngx_http_grpc_set_ssl(ngx_conf_t *cf, ngx_http_grpc_loc_conf_t *glcf) -{ - ngx_pool_cleanup_t *cln; - - if (glcf->upstream.ssl->ctx) { - return NGX_OK; - } - - if (ngx_ssl_create(glcf->upstream.ssl, glcf->ssl_protocols, NULL) - != NGX_OK) - { - return NGX_ERROR; - } - - cln = ngx_pool_cleanup_add(cf->pool, 0); - if (cln == NULL) { - ngx_ssl_cleanup_ctx(glcf->upstream.ssl); - return NGX_ERROR; - } - - cln->handler = ngx_ssl_cleanup_ctx; - cln->data = glcf->upstream.ssl; - - if (ngx_ssl_ciphers(cf, glcf->upstream.ssl, &glcf->ssl_ciphers, 0) - != NGX_OK) - { - return NGX_ERROR; - } - - if (glcf->upstream.ssl_certificate - && glcf->upstream.ssl_certificate->value.len) - { - if (glcf->upstream.ssl_certificate_key == NULL) { - ngx_log_error(NGX_LOG_EMERG, cf->log, 0, - "no \"grpc_ssl_certificate_key\" is defined " - "for certificate \"%V\"", - &glcf->upstream.ssl_certificate->value); - return NGX_ERROR; - } - - if (glcf->upstream.ssl_certificate->lengths == NULL - && glcf->upstream.ssl_certificate_key->lengths == NULL) - { - if (ngx_ssl_certificate(cf, glcf->upstream.ssl, - &glcf->upstream.ssl_certificate->value, - &glcf->upstream.ssl_certificate_key->value, - glcf->upstream.ssl_passwords) - != NGX_OK) - { - return NGX_ERROR; - } - } - } - - if (glcf->upstream.ssl_verify) { - if (glcf->ssl_trusted_certificate.len == 0) { - ngx_log_error(NGX_LOG_EMERG, cf->log, 0, - "no grpc_ssl_trusted_certificate for grpc_ssl_verify"); - return NGX_ERROR; - } - - if (ngx_ssl_trusted_certificate(cf, glcf->upstream.ssl, - &glcf->ssl_trusted_certificate, - glcf->ssl_verify_depth) - != NGX_OK) - { - return NGX_ERROR; - } - - if (ngx_ssl_crl(cf, glcf->upstream.ssl, &glcf->ssl_crl) != NGX_OK) { - return NGX_ERROR; - } - } - - if (ngx_ssl_client_session_cache(cf, glcf->upstream.ssl, - glcf->upstream.ssl_session_reuse) - != NGX_OK) - { - return NGX_ERROR; - } - -#ifdef TLSEXT_TYPE_application_layer_protocol_negotiation - - if (SSL_CTX_set_alpn_protos(glcf->upstream.ssl->ctx, - (u_char *) "\x02h2", 3) - != 0) - { - ngx_ssl_error(NGX_LOG_EMERG, cf->log, 0, - "SSL_CTX_set_alpn_protos() failed"); - return NGX_ERROR; - } - -#endif - - if (ngx_ssl_conf_commands(cf, glcf->upstream.ssl, glcf->ssl_conf_commands) - != NGX_OK) - { - return NGX_ERROR; - } - - return NGX_OK; -} - -#endif diff --git a/src/deps/src/nginx-1.30.3/src/http/modules/ngx_http_gunzip_filter_module.c b/src/deps/src/nginx-1.30.3/src/http/modules/ngx_http_gunzip_filter_module.c deleted file mode 100644 index 22e75e300c..0000000000 --- a/src/deps/src/nginx-1.30.3/src/http/modules/ngx_http_gunzip_filter_module.c +++ /dev/null @@ -1,697 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Maxim Dounin - * Copyright (C) Nginx, Inc. - */ - - -#include -#include -#include - -#include - - -typedef struct { - ngx_flag_t enable; - ngx_bufs_t bufs; -} ngx_http_gunzip_conf_t; - - -typedef struct { - ngx_chain_t *in; - ngx_chain_t *free; - ngx_chain_t *busy; - ngx_chain_t *out; - ngx_chain_t **last_out; - - ngx_buf_t *in_buf; - ngx_buf_t *out_buf; - ngx_int_t bufs; - - unsigned started:1; - unsigned flush:4; - unsigned redo:1; - unsigned done:1; - unsigned nomem:1; - - z_stream zstream; - ngx_http_request_t *request; -} ngx_http_gunzip_ctx_t; - - -static ngx_int_t ngx_http_gunzip_filter_inflate_start(ngx_http_request_t *r, - ngx_http_gunzip_ctx_t *ctx); -static ngx_int_t ngx_http_gunzip_filter_add_data(ngx_http_request_t *r, - ngx_http_gunzip_ctx_t *ctx); -static ngx_int_t ngx_http_gunzip_filter_get_buf(ngx_http_request_t *r, - ngx_http_gunzip_ctx_t *ctx); -static ngx_int_t ngx_http_gunzip_filter_inflate(ngx_http_request_t *r, - ngx_http_gunzip_ctx_t *ctx); -static ngx_int_t ngx_http_gunzip_filter_inflate_end(ngx_http_request_t *r, - ngx_http_gunzip_ctx_t *ctx); - -static void *ngx_http_gunzip_filter_alloc(void *opaque, u_int items, - u_int size); -static void ngx_http_gunzip_filter_free(void *opaque, void *address); - -static ngx_int_t ngx_http_gunzip_filter_init(ngx_conf_t *cf); -static void *ngx_http_gunzip_create_conf(ngx_conf_t *cf); -static char *ngx_http_gunzip_merge_conf(ngx_conf_t *cf, - void *parent, void *child); - - -static ngx_command_t ngx_http_gunzip_filter_commands[] = { - - { ngx_string("gunzip"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG, - ngx_conf_set_flag_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_gunzip_conf_t, enable), - NULL }, - - { ngx_string("gunzip_buffers"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE2, - ngx_conf_set_bufs_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_gunzip_conf_t, bufs), - NULL }, - - ngx_null_command -}; - - -static ngx_http_module_t ngx_http_gunzip_filter_module_ctx = { - NULL, /* preconfiguration */ - ngx_http_gunzip_filter_init, /* postconfiguration */ - - NULL, /* create main configuration */ - NULL, /* init main configuration */ - - NULL, /* create server configuration */ - NULL, /* merge server configuration */ - - ngx_http_gunzip_create_conf, /* create location configuration */ - ngx_http_gunzip_merge_conf /* merge location configuration */ -}; - - -ngx_module_t ngx_http_gunzip_filter_module = { - NGX_MODULE_V1, - &ngx_http_gunzip_filter_module_ctx, /* module context */ - ngx_http_gunzip_filter_commands, /* module directives */ - NGX_HTTP_MODULE, /* module type */ - NULL, /* init master */ - NULL, /* init module */ - NULL, /* init process */ - NULL, /* init thread */ - NULL, /* exit thread */ - NULL, /* exit process */ - NULL, /* exit master */ - NGX_MODULE_V1_PADDING -}; - - -static ngx_http_output_header_filter_pt ngx_http_next_header_filter; -static ngx_http_output_body_filter_pt ngx_http_next_body_filter; - - -static ngx_int_t -ngx_http_gunzip_header_filter(ngx_http_request_t *r) -{ - ngx_http_gunzip_ctx_t *ctx; - ngx_http_gunzip_conf_t *conf; - - conf = ngx_http_get_module_loc_conf(r, ngx_http_gunzip_filter_module); - - /* TODO support multiple content-codings */ - /* TODO always gunzip - due to configuration or module request */ - /* TODO ignore content encoding? */ - - if (!conf->enable - || r->headers_out.content_encoding == NULL - || r->headers_out.content_encoding->value.len != 4 - || ngx_strncasecmp(r->headers_out.content_encoding->value.data, - (u_char *) "gzip", 4) != 0) - { - return ngx_http_next_header_filter(r); - } - - r->gzip_vary = 1; - - if (!r->gzip_tested) { - if (ngx_http_gzip_ok(r) == NGX_OK) { - return ngx_http_next_header_filter(r); - } - - } else if (r->gzip_ok) { - return ngx_http_next_header_filter(r); - } - - ctx = ngx_pcalloc(r->pool, sizeof(ngx_http_gunzip_ctx_t)); - if (ctx == NULL) { - return NGX_ERROR; - } - - ngx_http_set_ctx(r, ctx, ngx_http_gunzip_filter_module); - - ctx->request = r; - - r->filter_need_in_memory = 1; - - r->headers_out.content_encoding->hash = 0; - r->headers_out.content_encoding = NULL; - - ngx_http_clear_content_length(r); - ngx_http_clear_accept_ranges(r); - ngx_http_weak_etag(r); - - return ngx_http_next_header_filter(r); -} - - -static ngx_int_t -ngx_http_gunzip_body_filter(ngx_http_request_t *r, ngx_chain_t *in) -{ - int rc; - ngx_uint_t flush; - ngx_chain_t *cl; - ngx_http_gunzip_ctx_t *ctx; - - ctx = ngx_http_get_module_ctx(r, ngx_http_gunzip_filter_module); - - if (ctx == NULL || ctx->done) { - return ngx_http_next_body_filter(r, in); - } - - ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "http gunzip filter"); - - if (!ctx->started) { - if (ngx_http_gunzip_filter_inflate_start(r, ctx) != NGX_OK) { - goto failed; - } - } - - if (in) { - if (ngx_chain_add_copy(r->pool, &ctx->in, in) != NGX_OK) { - goto failed; - } - } - - if (ctx->nomem) { - - /* flush busy buffers */ - - if (ngx_http_next_body_filter(r, NULL) == NGX_ERROR) { - goto failed; - } - - cl = NULL; - - ngx_chain_update_chains(r->pool, &ctx->free, &ctx->busy, &cl, - (ngx_buf_tag_t) &ngx_http_gunzip_filter_module); - ctx->nomem = 0; - flush = 0; - - } else { - flush = ctx->busy ? 1 : 0; - } - - for ( ;; ) { - - /* cycle while we can write to a client */ - - for ( ;; ) { - - /* cycle while there is data to feed zlib and ... */ - - rc = ngx_http_gunzip_filter_add_data(r, ctx); - - if (rc == NGX_DECLINED) { - break; - } - - if (rc == NGX_AGAIN) { - continue; - } - - - /* ... there are buffers to write zlib output */ - - rc = ngx_http_gunzip_filter_get_buf(r, ctx); - - if (rc == NGX_DECLINED) { - break; - } - - if (rc == NGX_ERROR) { - goto failed; - } - - rc = ngx_http_gunzip_filter_inflate(r, ctx); - - if (rc == NGX_OK) { - break; - } - - if (rc == NGX_ERROR) { - goto failed; - } - - /* rc == NGX_AGAIN */ - } - - if (ctx->out == NULL && !flush) { - return ctx->busy ? NGX_AGAIN : NGX_OK; - } - - rc = ngx_http_next_body_filter(r, ctx->out); - - if (rc == NGX_ERROR) { - goto failed; - } - - ngx_chain_update_chains(r->pool, &ctx->free, &ctx->busy, &ctx->out, - (ngx_buf_tag_t) &ngx_http_gunzip_filter_module); - ctx->last_out = &ctx->out; - - ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "gunzip out: %p", ctx->out); - - ctx->nomem = 0; - flush = 0; - - if (ctx->done) { - return rc; - } - } - - /* unreachable */ - -failed: - - ctx->done = 1; - - return NGX_ERROR; -} - - -static ngx_int_t -ngx_http_gunzip_filter_inflate_start(ngx_http_request_t *r, - ngx_http_gunzip_ctx_t *ctx) -{ - int rc; - - ctx->zstream.next_in = NULL; - ctx->zstream.avail_in = 0; - - ctx->zstream.zalloc = ngx_http_gunzip_filter_alloc; - ctx->zstream.zfree = ngx_http_gunzip_filter_free; - ctx->zstream.opaque = ctx; - - /* windowBits +16 to decode gzip, zlib 1.2.0.4+ */ - rc = inflateInit2(&ctx->zstream, MAX_WBITS + 16); - - if (rc != Z_OK) { - ngx_log_error(NGX_LOG_ALERT, r->connection->log, 0, - "inflateInit2() failed: %d", rc); - return NGX_ERROR; - } - - ctx->started = 1; - - ctx->last_out = &ctx->out; - ctx->flush = Z_NO_FLUSH; - - return NGX_OK; -} - - -static ngx_int_t -ngx_http_gunzip_filter_add_data(ngx_http_request_t *r, - ngx_http_gunzip_ctx_t *ctx) -{ - ngx_chain_t *cl; - - if (ctx->zstream.avail_in || ctx->flush != Z_NO_FLUSH || ctx->redo) { - return NGX_OK; - } - - ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "gunzip in: %p", ctx->in); - - if (ctx->in == NULL) { - return NGX_DECLINED; - } - - cl = ctx->in; - ctx->in_buf = cl->buf; - ctx->in = cl->next; - - ngx_free_chain(r->pool, cl); - - ctx->zstream.next_in = ctx->in_buf->pos; - ctx->zstream.avail_in = ctx->in_buf->last - ctx->in_buf->pos; - - ngx_log_debug3(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "gunzip in_buf:%p ni:%p ai:%ud", - ctx->in_buf, - ctx->zstream.next_in, ctx->zstream.avail_in); - - if (ctx->in_buf->last_buf || ctx->in_buf->last_in_chain) { - ctx->flush = Z_FINISH; - - } else if (ctx->in_buf->flush) { - ctx->flush = Z_SYNC_FLUSH; - - } else if (ctx->zstream.avail_in == 0) { - /* ctx->flush == Z_NO_FLUSH */ - return NGX_AGAIN; - } - - return NGX_OK; -} - - -static ngx_int_t -ngx_http_gunzip_filter_get_buf(ngx_http_request_t *r, - ngx_http_gunzip_ctx_t *ctx) -{ - ngx_chain_t *cl; - ngx_http_gunzip_conf_t *conf; - - if (ctx->zstream.avail_out) { - return NGX_OK; - } - - conf = ngx_http_get_module_loc_conf(r, ngx_http_gunzip_filter_module); - - if (ctx->free) { - - cl = ctx->free; - ctx->out_buf = cl->buf; - ctx->free = cl->next; - - ngx_free_chain(r->pool, cl); - - ctx->out_buf->flush = 0; - - } else if (ctx->bufs < conf->bufs.num) { - - ctx->out_buf = ngx_create_temp_buf(r->pool, conf->bufs.size); - if (ctx->out_buf == NULL) { - return NGX_ERROR; - } - - ctx->out_buf->tag = (ngx_buf_tag_t) &ngx_http_gunzip_filter_module; - ctx->out_buf->recycled = 1; - ctx->bufs++; - - } else { - ctx->nomem = 1; - return NGX_DECLINED; - } - - ctx->zstream.next_out = ctx->out_buf->pos; - ctx->zstream.avail_out = conf->bufs.size; - - return NGX_OK; -} - - -static ngx_int_t -ngx_http_gunzip_filter_inflate(ngx_http_request_t *r, - ngx_http_gunzip_ctx_t *ctx) -{ - int rc; - ngx_buf_t *b; - ngx_chain_t *cl; - - ngx_log_debug6(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "inflate in: ni:%p no:%p ai:%ud ao:%ud fl:%d redo:%d", - ctx->zstream.next_in, ctx->zstream.next_out, - ctx->zstream.avail_in, ctx->zstream.avail_out, - ctx->flush, ctx->redo); - - rc = inflate(&ctx->zstream, ctx->flush); - - if (rc != Z_OK && rc != Z_STREAM_END && rc != Z_BUF_ERROR) { - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "inflate() failed: %d, %d", ctx->flush, rc); - return NGX_ERROR; - } - - ngx_log_debug5(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "inflate out: ni:%p no:%p ai:%ud ao:%ud rc:%d", - ctx->zstream.next_in, ctx->zstream.next_out, - ctx->zstream.avail_in, ctx->zstream.avail_out, - rc); - - ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "gunzip in_buf:%p pos:%p", - ctx->in_buf, ctx->in_buf->pos); - - if (ctx->zstream.next_in) { - ctx->in_buf->pos = ctx->zstream.next_in; - - if (ctx->zstream.avail_in == 0) { - ctx->zstream.next_in = NULL; - } - } - - ctx->out_buf->last = ctx->zstream.next_out; - - if (ctx->zstream.avail_out == 0) { - - /* zlib wants to output some more data */ - - cl = ngx_alloc_chain_link(r->pool); - if (cl == NULL) { - return NGX_ERROR; - } - - cl->buf = ctx->out_buf; - cl->next = NULL; - *ctx->last_out = cl; - ctx->last_out = &cl->next; - - ctx->redo = 1; - - return NGX_AGAIN; - } - - ctx->redo = 0; - - if (ctx->flush == Z_SYNC_FLUSH) { - - ctx->flush = Z_NO_FLUSH; - - cl = ngx_alloc_chain_link(r->pool); - if (cl == NULL) { - return NGX_ERROR; - } - - b = ctx->out_buf; - - if (ngx_buf_size(b) == 0) { - - b = ngx_calloc_buf(ctx->request->pool); - if (b == NULL) { - return NGX_ERROR; - } - - } else { - ctx->zstream.avail_out = 0; - } - - b->flush = 1; - - cl->buf = b; - cl->next = NULL; - *ctx->last_out = cl; - ctx->last_out = &cl->next; - - return NGX_OK; - } - - if (ctx->flush == Z_FINISH && ctx->zstream.avail_in == 0) { - - if (rc != Z_STREAM_END) { - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "inflate() returned %d on response end", rc); - return NGX_ERROR; - } - - if (ngx_http_gunzip_filter_inflate_end(r, ctx) != NGX_OK) { - return NGX_ERROR; - } - - return NGX_OK; - } - - if (rc == Z_STREAM_END && ctx->zstream.avail_in > 0) { - - rc = inflateReset(&ctx->zstream); - - if (rc != Z_OK) { - ngx_log_error(NGX_LOG_ALERT, r->connection->log, 0, - "inflateReset() failed: %d", rc); - return NGX_ERROR; - } - - ctx->redo = 1; - - return NGX_AGAIN; - } - - if (ctx->in == NULL) { - - b = ctx->out_buf; - - if (ngx_buf_size(b) == 0) { - return NGX_OK; - } - - cl = ngx_alloc_chain_link(r->pool); - if (cl == NULL) { - return NGX_ERROR; - } - - ctx->zstream.avail_out = 0; - - cl->buf = b; - cl->next = NULL; - *ctx->last_out = cl; - ctx->last_out = &cl->next; - - return NGX_OK; - } - - return NGX_AGAIN; -} - - -static ngx_int_t -ngx_http_gunzip_filter_inflate_end(ngx_http_request_t *r, - ngx_http_gunzip_ctx_t *ctx) -{ - int rc; - ngx_buf_t *b; - ngx_chain_t *cl; - - ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "gunzip inflate end"); - - rc = inflateEnd(&ctx->zstream); - - if (rc != Z_OK) { - ngx_log_error(NGX_LOG_ALERT, r->connection->log, 0, - "inflateEnd() failed: %d", rc); - return NGX_ERROR; - } - - b = ctx->out_buf; - - if (ngx_buf_size(b) == 0) { - - b = ngx_calloc_buf(ctx->request->pool); - if (b == NULL) { - return NGX_ERROR; - } - } - - cl = ngx_alloc_chain_link(r->pool); - if (cl == NULL) { - return NGX_ERROR; - } - - cl->buf = b; - cl->next = NULL; - *ctx->last_out = cl; - ctx->last_out = &cl->next; - - b->last_buf = (r == r->main) ? 1 : 0; - b->last_in_chain = 1; - b->sync = 1; - - ctx->done = 1; - - return NGX_OK; -} - - -static void * -ngx_http_gunzip_filter_alloc(void *opaque, u_int items, u_int size) -{ - ngx_http_gunzip_ctx_t *ctx = opaque; - - ngx_log_debug2(NGX_LOG_DEBUG_HTTP, ctx->request->connection->log, 0, - "gunzip alloc: n:%ud s:%ud", - items, size); - - return ngx_palloc(ctx->request->pool, items * size); -} - - -static void -ngx_http_gunzip_filter_free(void *opaque, void *address) -{ -#if 0 - ngx_http_gunzip_ctx_t *ctx = opaque; - - ngx_log_debug1(NGX_LOG_DEBUG_HTTP, ctx->request->connection->log, 0, - "gunzip free: %p", address); -#endif -} - - -static void * -ngx_http_gunzip_create_conf(ngx_conf_t *cf) -{ - ngx_http_gunzip_conf_t *conf; - - conf = ngx_pcalloc(cf->pool, sizeof(ngx_http_gunzip_conf_t)); - if (conf == NULL) { - return NULL; - } - - /* - * set by ngx_pcalloc(): - * - * conf->bufs.num = 0; - */ - - conf->enable = NGX_CONF_UNSET; - - return conf; -} - - -static char * -ngx_http_gunzip_merge_conf(ngx_conf_t *cf, void *parent, void *child) -{ - ngx_http_gunzip_conf_t *prev = parent; - ngx_http_gunzip_conf_t *conf = child; - - ngx_conf_merge_value(conf->enable, prev->enable, 0); - - ngx_conf_merge_bufs_value(conf->bufs, prev->bufs, - (128 * 1024) / ngx_pagesize, ngx_pagesize); - - return NGX_CONF_OK; -} - - -static ngx_int_t -ngx_http_gunzip_filter_init(ngx_conf_t *cf) -{ - ngx_http_next_header_filter = ngx_http_top_header_filter; - ngx_http_top_header_filter = ngx_http_gunzip_header_filter; - - ngx_http_next_body_filter = ngx_http_top_body_filter; - ngx_http_top_body_filter = ngx_http_gunzip_body_filter; - - return NGX_OK; -} diff --git a/src/deps/src/nginx-1.30.3/src/http/modules/ngx_http_gzip_filter_module.c b/src/deps/src/nginx-1.30.3/src/http/modules/ngx_http_gzip_filter_module.c deleted file mode 100644 index dac21bb189..0000000000 --- a/src/deps/src/nginx-1.30.3/src/http/modules/ngx_http_gzip_filter_module.c +++ /dev/null @@ -1,1185 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#include -#include -#include - -#include - - -typedef struct { - ngx_flag_t enable; - ngx_flag_t no_buffer; - - ngx_hash_t types; - - ngx_bufs_t bufs; - - size_t postpone_gzipping; - ngx_int_t level; - size_t wbits; - size_t memlevel; - ssize_t min_length; - - ngx_array_t *types_keys; -} ngx_http_gzip_conf_t; - - -typedef struct { - ngx_chain_t *in; - ngx_chain_t *free; - ngx_chain_t *busy; - ngx_chain_t *out; - ngx_chain_t **last_out; - - ngx_chain_t *copied; - ngx_chain_t *copy_buf; - - ngx_buf_t *in_buf; - ngx_buf_t *out_buf; - ngx_int_t bufs; - - void *preallocated; - char *free_mem; - ngx_uint_t allocated; - - int wbits; - int memlevel; - - unsigned flush:4; - unsigned redo:1; - unsigned done:1; - unsigned nomem:1; - unsigned buffering:1; - unsigned zlib_ng:1; - unsigned state_allocated:1; - - size_t zin; - size_t zout; - - z_stream zstream; - ngx_http_request_t *request; -} ngx_http_gzip_ctx_t; - - -static void ngx_http_gzip_filter_memory(ngx_http_request_t *r, - ngx_http_gzip_ctx_t *ctx); -static ngx_int_t ngx_http_gzip_filter_buffer(ngx_http_gzip_ctx_t *ctx, - ngx_chain_t *in); -static ngx_int_t ngx_http_gzip_filter_deflate_start(ngx_http_request_t *r, - ngx_http_gzip_ctx_t *ctx); -static ngx_int_t ngx_http_gzip_filter_add_data(ngx_http_request_t *r, - ngx_http_gzip_ctx_t *ctx); -static ngx_int_t ngx_http_gzip_filter_get_buf(ngx_http_request_t *r, - ngx_http_gzip_ctx_t *ctx); -static ngx_int_t ngx_http_gzip_filter_deflate(ngx_http_request_t *r, - ngx_http_gzip_ctx_t *ctx); -static ngx_int_t ngx_http_gzip_filter_deflate_end(ngx_http_request_t *r, - ngx_http_gzip_ctx_t *ctx); - -static void *ngx_http_gzip_filter_alloc(void *opaque, u_int items, - u_int size); -static void ngx_http_gzip_filter_free(void *opaque, void *address); -static void ngx_http_gzip_filter_free_copy_buf(ngx_http_request_t *r, - ngx_http_gzip_ctx_t *ctx); - -static ngx_int_t ngx_http_gzip_add_variables(ngx_conf_t *cf); -static ngx_int_t ngx_http_gzip_ratio_variable(ngx_http_request_t *r, - ngx_http_variable_value_t *v, uintptr_t data); - -static ngx_int_t ngx_http_gzip_filter_init(ngx_conf_t *cf); -static void *ngx_http_gzip_create_conf(ngx_conf_t *cf); -static char *ngx_http_gzip_merge_conf(ngx_conf_t *cf, - void *parent, void *child); -static char *ngx_http_gzip_window(ngx_conf_t *cf, void *post, void *data); -static char *ngx_http_gzip_hash(ngx_conf_t *cf, void *post, void *data); - - -static ngx_conf_num_bounds_t ngx_http_gzip_comp_level_bounds = { - ngx_conf_check_num_bounds, 1, 9 -}; - -static ngx_conf_post_handler_pt ngx_http_gzip_window_p = ngx_http_gzip_window; -static ngx_conf_post_handler_pt ngx_http_gzip_hash_p = ngx_http_gzip_hash; - - -static ngx_command_t ngx_http_gzip_filter_commands[] = { - - { ngx_string("gzip"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF - |NGX_CONF_FLAG, - ngx_conf_set_flag_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_gzip_conf_t, enable), - NULL }, - - { ngx_string("gzip_buffers"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE2, - ngx_conf_set_bufs_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_gzip_conf_t, bufs), - NULL }, - - { ngx_string("gzip_types"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE, - ngx_http_types_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_gzip_conf_t, types_keys), - &ngx_http_html_default_types[0] }, - - { ngx_string("gzip_comp_level"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1, - ngx_conf_set_num_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_gzip_conf_t, level), - &ngx_http_gzip_comp_level_bounds }, - - { ngx_string("gzip_window"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1, - ngx_conf_set_size_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_gzip_conf_t, wbits), - &ngx_http_gzip_window_p }, - - { ngx_string("gzip_hash"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1, - ngx_conf_set_size_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_gzip_conf_t, memlevel), - &ngx_http_gzip_hash_p }, - - { ngx_string("postpone_gzipping"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1, - ngx_conf_set_size_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_gzip_conf_t, postpone_gzipping), - NULL }, - - { ngx_string("gzip_no_buffer"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG, - ngx_conf_set_flag_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_gzip_conf_t, no_buffer), - NULL }, - - { ngx_string("gzip_min_length"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1, - ngx_conf_set_size_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_gzip_conf_t, min_length), - NULL }, - - ngx_null_command -}; - - -static ngx_http_module_t ngx_http_gzip_filter_module_ctx = { - ngx_http_gzip_add_variables, /* preconfiguration */ - ngx_http_gzip_filter_init, /* postconfiguration */ - - NULL, /* create main configuration */ - NULL, /* init main configuration */ - - NULL, /* create server configuration */ - NULL, /* merge server configuration */ - - ngx_http_gzip_create_conf, /* create location configuration */ - ngx_http_gzip_merge_conf /* merge location configuration */ -}; - - -ngx_module_t ngx_http_gzip_filter_module = { - NGX_MODULE_V1, - &ngx_http_gzip_filter_module_ctx, /* module context */ - ngx_http_gzip_filter_commands, /* module directives */ - NGX_HTTP_MODULE, /* module type */ - NULL, /* init master */ - NULL, /* init module */ - NULL, /* init process */ - NULL, /* init thread */ - NULL, /* exit thread */ - NULL, /* exit process */ - NULL, /* exit master */ - NGX_MODULE_V1_PADDING -}; - - -static ngx_str_t ngx_http_gzip_ratio = ngx_string("gzip_ratio"); - -static ngx_http_output_header_filter_pt ngx_http_next_header_filter; -static ngx_http_output_body_filter_pt ngx_http_next_body_filter; - -static ngx_uint_t ngx_http_gzip_assume_zlib_ng; - - -static ngx_int_t -ngx_http_gzip_header_filter(ngx_http_request_t *r) -{ - ngx_table_elt_t *h; - ngx_http_gzip_ctx_t *ctx; - ngx_http_gzip_conf_t *conf; - - conf = ngx_http_get_module_loc_conf(r, ngx_http_gzip_filter_module); - - if (!conf->enable - || (r->headers_out.status != NGX_HTTP_OK - && r->headers_out.status != NGX_HTTP_FORBIDDEN - && r->headers_out.status != NGX_HTTP_NOT_FOUND) - || (r->headers_out.content_encoding - && r->headers_out.content_encoding->value.len) - || (r->headers_out.content_length_n != -1 - && r->headers_out.content_length_n < conf->min_length) - || ngx_http_test_content_type(r, &conf->types) == NULL - || r->header_only) - { - return ngx_http_next_header_filter(r); - } - - r->gzip_vary = 1; - -#if (NGX_HTTP_DEGRADATION) - { - ngx_http_core_loc_conf_t *clcf; - - clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module); - - if (clcf->gzip_disable_degradation && ngx_http_degraded(r)) { - return ngx_http_next_header_filter(r); - } - } -#endif - - if (!r->gzip_tested) { - if (ngx_http_gzip_ok(r) != NGX_OK) { - return ngx_http_next_header_filter(r); - } - - } else if (!r->gzip_ok) { - return ngx_http_next_header_filter(r); - } - - ctx = ngx_pcalloc(r->pool, sizeof(ngx_http_gzip_ctx_t)); - if (ctx == NULL) { - return NGX_ERROR; - } - - ngx_http_set_ctx(r, ctx, ngx_http_gzip_filter_module); - - ctx->request = r; - ctx->buffering = (conf->postpone_gzipping != 0); - - ngx_http_gzip_filter_memory(r, ctx); - - h = ngx_list_push(&r->headers_out.headers); - if (h == NULL) { - return NGX_ERROR; - } - - h->hash = 1; - h->next = NULL; - ngx_str_set(&h->key, "Content-Encoding"); - ngx_str_set(&h->value, "gzip"); - r->headers_out.content_encoding = h; - - r->main_filter_need_in_memory = 1; - - ngx_http_clear_content_length(r); - ngx_http_clear_accept_ranges(r); - ngx_http_weak_etag(r); - - return ngx_http_next_header_filter(r); -} - - -static ngx_int_t -ngx_http_gzip_body_filter(ngx_http_request_t *r, ngx_chain_t *in) -{ - int rc; - ngx_uint_t flush; - ngx_chain_t *cl; - ngx_http_gzip_ctx_t *ctx; - - ctx = ngx_http_get_module_ctx(r, ngx_http_gzip_filter_module); - - if (ctx == NULL || ctx->done || r->header_only) { - return ngx_http_next_body_filter(r, in); - } - - ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "http gzip filter"); - - if (ctx->buffering) { - - /* - * With default memory settings zlib starts to output gzipped data - * only after it has got about 90K, so it makes sense to allocate - * zlib memory (200-400K) only after we have enough data to compress. - * Although we copy buffers, nevertheless for not big responses - * this allows to allocate zlib memory, to compress and to output - * the response in one step using hot CPU cache. - */ - - if (in) { - switch (ngx_http_gzip_filter_buffer(ctx, in)) { - - case NGX_OK: - return NGX_OK; - - case NGX_DONE: - in = NULL; - break; - - default: /* NGX_ERROR */ - goto failed; - } - - } else { - ctx->buffering = 0; - } - } - - if (ctx->preallocated == NULL) { - if (ngx_http_gzip_filter_deflate_start(r, ctx) != NGX_OK) { - goto failed; - } - } - - if (in) { - if (ngx_chain_add_copy(r->pool, &ctx->in, in) != NGX_OK) { - goto failed; - } - - r->connection->buffered |= NGX_HTTP_GZIP_BUFFERED; - } - - if (ctx->nomem) { - - /* flush busy buffers */ - - if (ngx_http_next_body_filter(r, NULL) == NGX_ERROR) { - goto failed; - } - - cl = NULL; - - ngx_chain_update_chains(r->pool, &ctx->free, &ctx->busy, &cl, - (ngx_buf_tag_t) &ngx_http_gzip_filter_module); - ctx->nomem = 0; - flush = 0; - - } else { - flush = ctx->busy ? 1 : 0; - } - - for ( ;; ) { - - /* cycle while we can write to a client */ - - for ( ;; ) { - - /* cycle while there is data to feed zlib and ... */ - - rc = ngx_http_gzip_filter_add_data(r, ctx); - - if (rc == NGX_DECLINED) { - break; - } - - if (rc == NGX_AGAIN) { - continue; - } - - - /* ... there are buffers to write zlib output */ - - rc = ngx_http_gzip_filter_get_buf(r, ctx); - - if (rc == NGX_DECLINED) { - break; - } - - if (rc == NGX_ERROR) { - goto failed; - } - - - rc = ngx_http_gzip_filter_deflate(r, ctx); - - if (rc == NGX_OK) { - break; - } - - if (rc == NGX_ERROR) { - goto failed; - } - - /* rc == NGX_AGAIN */ - } - - if (ctx->out == NULL && !flush) { - ngx_http_gzip_filter_free_copy_buf(r, ctx); - - return ctx->busy ? NGX_AGAIN : NGX_OK; - } - - rc = ngx_http_next_body_filter(r, ctx->out); - - if (rc == NGX_ERROR) { - goto failed; - } - - ngx_http_gzip_filter_free_copy_buf(r, ctx); - - ngx_chain_update_chains(r->pool, &ctx->free, &ctx->busy, &ctx->out, - (ngx_buf_tag_t) &ngx_http_gzip_filter_module); - ctx->last_out = &ctx->out; - - ctx->nomem = 0; - flush = 0; - - if (ctx->done) { - return rc; - } - } - - /* unreachable */ - -failed: - - ctx->done = 1; - - if (ctx->preallocated) { - deflateEnd(&ctx->zstream); - - ngx_pfree(r->pool, ctx->preallocated); - } - - ngx_http_gzip_filter_free_copy_buf(r, ctx); - - return NGX_ERROR; -} - - -static void -ngx_http_gzip_filter_memory(ngx_http_request_t *r, ngx_http_gzip_ctx_t *ctx) -{ - int wbits, memlevel; - ngx_http_gzip_conf_t *conf; - - conf = ngx_http_get_module_loc_conf(r, ngx_http_gzip_filter_module); - - wbits = conf->wbits; - memlevel = conf->memlevel; - - if (r->headers_out.content_length_n > 0) { - - /* the actual zlib window size is smaller by 262 bytes */ - - while (r->headers_out.content_length_n < ((1 << (wbits - 1)) - 262)) { - wbits--; - memlevel--; - } - - if (memlevel < 1) { - memlevel = 1; - } - } - - ctx->wbits = wbits; - ctx->memlevel = memlevel; - - /* - * We preallocate a memory for zlib in one buffer (200K-400K), this - * decreases a number of malloc() and free() calls and also probably - * decreases a number of syscalls (sbrk()/mmap() and so on). - * Besides we free the memory as soon as a gzipping will complete - * and do not wait while a whole response will be sent to a client. - * - * 8K is for zlib deflate_state, it takes - * *) 5816 bytes on i386 and sparc64 (32-bit mode) - * *) 5920 bytes on amd64 and sparc64 - * - * A zlib variant from Intel (https://github.com/jtkukunas/zlib) - * uses additional 16-byte padding in one of window-sized buffers. - */ - - if (!ngx_http_gzip_assume_zlib_ng) { - ctx->allocated = 8192 + 16 + (1 << (wbits + 2)) - + (1 << (memlevel + 9)); - - } else { - /* - * Another zlib variant, https://github.com/zlib-ng/zlib-ng. - * It used to force window bits to 13 for fast compression level, - * used (64 + sizeof(void*)) additional space on all allocations - * for alignment and 16-byte padding in one of window-sized buffers, - * uses a single allocation with up to 200 bytes for alignment and - * internal pointers, 5/4 times more memory for the pending buffer, - * and 128K hash. - */ - - if (conf->level == 1) { - wbits = ngx_max(wbits, 13); - } - - ctx->allocated = 8192 + 16 + (1 << (wbits + 2)) - + 131072 + (5 << (memlevel + 6)) - + 4 * (64 + sizeof(void*)); - ctx->zlib_ng = 1; - } -} - - -static ngx_int_t -ngx_http_gzip_filter_buffer(ngx_http_gzip_ctx_t *ctx, ngx_chain_t *in) -{ - size_t size, buffered; - ngx_buf_t *b, *buf; - ngx_chain_t *cl, **ll; - ngx_http_request_t *r; - ngx_http_gzip_conf_t *conf; - - r = ctx->request; - - r->connection->buffered |= NGX_HTTP_GZIP_BUFFERED; - - buffered = 0; - ll = &ctx->in; - - for (cl = ctx->in; cl; cl = cl->next) { - buffered += cl->buf->last - cl->buf->pos; - ll = &cl->next; - } - - conf = ngx_http_get_module_loc_conf(r, ngx_http_gzip_filter_module); - - while (in) { - cl = ngx_alloc_chain_link(r->pool); - if (cl == NULL) { - return NGX_ERROR; - } - - b = in->buf; - - size = b->last - b->pos; - buffered += size; - - if (b->flush || b->last_buf || buffered > conf->postpone_gzipping) { - ctx->buffering = 0; - } - - if (ctx->buffering && size) { - - buf = ngx_create_temp_buf(r->pool, size); - if (buf == NULL) { - return NGX_ERROR; - } - - buf->last = ngx_cpymem(buf->pos, b->pos, size); - b->pos = b->last; - - buf->last_buf = b->last_buf; - buf->tag = (ngx_buf_tag_t) &ngx_http_gzip_filter_module; - - cl->buf = buf; - - } else { - cl->buf = b; - } - - *ll = cl; - ll = &cl->next; - in = in->next; - } - - *ll = NULL; - - return ctx->buffering ? NGX_OK : NGX_DONE; -} - - -static ngx_int_t -ngx_http_gzip_filter_deflate_start(ngx_http_request_t *r, - ngx_http_gzip_ctx_t *ctx) -{ - int rc; - ngx_http_gzip_conf_t *conf; - - conf = ngx_http_get_module_loc_conf(r, ngx_http_gzip_filter_module); - - ctx->preallocated = ngx_palloc(r->pool, ctx->allocated); - if (ctx->preallocated == NULL) { - return NGX_ERROR; - } - - ctx->free_mem = ctx->preallocated; - - ctx->zstream.zalloc = ngx_http_gzip_filter_alloc; - ctx->zstream.zfree = ngx_http_gzip_filter_free; - ctx->zstream.opaque = ctx; - - rc = deflateInit2(&ctx->zstream, (int) conf->level, Z_DEFLATED, - ctx->wbits + 16, ctx->memlevel, Z_DEFAULT_STRATEGY); - - if (rc != Z_OK) { - ngx_log_error(NGX_LOG_ALERT, r->connection->log, 0, - "deflateInit2() failed: %d", rc); - return NGX_ERROR; - } - - ctx->last_out = &ctx->out; - ctx->flush = Z_NO_FLUSH; - - return NGX_OK; -} - - -static ngx_int_t -ngx_http_gzip_filter_add_data(ngx_http_request_t *r, ngx_http_gzip_ctx_t *ctx) -{ - ngx_chain_t *cl; - - if (ctx->zstream.avail_in || ctx->flush != Z_NO_FLUSH || ctx->redo) { - return NGX_OK; - } - - ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "gzip in: %p", ctx->in); - - if (ctx->in == NULL) { - return NGX_DECLINED; - } - - if (ctx->copy_buf) { - - /* - * to avoid CPU cache trashing we do not free() just quit buf, - * but postpone free()ing after zlib compressing and data output - */ - - ctx->copy_buf->next = ctx->copied; - ctx->copied = ctx->copy_buf; - ctx->copy_buf = NULL; - } - - cl = ctx->in; - ctx->in_buf = cl->buf; - ctx->in = cl->next; - - if (ctx->in_buf->tag == (ngx_buf_tag_t) &ngx_http_gzip_filter_module) { - ctx->copy_buf = cl; - - } else { - ngx_free_chain(r->pool, cl); - } - - ctx->zstream.next_in = ctx->in_buf->pos; - ctx->zstream.avail_in = ctx->in_buf->last - ctx->in_buf->pos; - - ngx_log_debug3(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "gzip in_buf:%p ni:%p ai:%ud", - ctx->in_buf, - ctx->zstream.next_in, ctx->zstream.avail_in); - - if (ctx->in_buf->last_buf) { - ctx->flush = Z_FINISH; - - } else if (ctx->in_buf->flush) { - ctx->flush = Z_SYNC_FLUSH; - - } else if (ctx->zstream.avail_in == 0) { - /* ctx->flush == Z_NO_FLUSH */ - return NGX_AGAIN; - } - - return NGX_OK; -} - - -static ngx_int_t -ngx_http_gzip_filter_get_buf(ngx_http_request_t *r, ngx_http_gzip_ctx_t *ctx) -{ - ngx_chain_t *cl; - ngx_http_gzip_conf_t *conf; - - if (ctx->zstream.avail_out) { - return NGX_OK; - } - - conf = ngx_http_get_module_loc_conf(r, ngx_http_gzip_filter_module); - - if (ctx->free) { - - cl = ctx->free; - ctx->out_buf = cl->buf; - ctx->free = cl->next; - - ngx_free_chain(r->pool, cl); - - } else if (ctx->bufs < conf->bufs.num) { - - ctx->out_buf = ngx_create_temp_buf(r->pool, conf->bufs.size); - if (ctx->out_buf == NULL) { - return NGX_ERROR; - } - - ctx->out_buf->tag = (ngx_buf_tag_t) &ngx_http_gzip_filter_module; - ctx->out_buf->recycled = 1; - ctx->bufs++; - - } else { - ctx->nomem = 1; - return NGX_DECLINED; - } - - ctx->zstream.next_out = ctx->out_buf->pos; - ctx->zstream.avail_out = conf->bufs.size; - - return NGX_OK; -} - - -static ngx_int_t -ngx_http_gzip_filter_deflate(ngx_http_request_t *r, ngx_http_gzip_ctx_t *ctx) -{ - int rc; - ngx_buf_t *b; - ngx_chain_t *cl; - ngx_http_gzip_conf_t *conf; - - ngx_log_debug6(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "deflate in: ni:%p no:%p ai:%ud ao:%ud fl:%d redo:%d", - ctx->zstream.next_in, ctx->zstream.next_out, - ctx->zstream.avail_in, ctx->zstream.avail_out, - ctx->flush, ctx->redo); - - rc = deflate(&ctx->zstream, ctx->flush); - - if (rc != Z_OK && rc != Z_STREAM_END && rc != Z_BUF_ERROR) { - ngx_log_error(NGX_LOG_ALERT, r->connection->log, 0, - "deflate() failed: %d, %d", ctx->flush, rc); - return NGX_ERROR; - } - - ngx_log_debug5(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "deflate out: ni:%p no:%p ai:%ud ao:%ud rc:%d", - ctx->zstream.next_in, ctx->zstream.next_out, - ctx->zstream.avail_in, ctx->zstream.avail_out, - rc); - - ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "gzip in_buf:%p pos:%p", - ctx->in_buf, ctx->in_buf->pos); - - if (ctx->zstream.next_in) { - ctx->in_buf->pos = ctx->zstream.next_in; - - if (ctx->zstream.avail_in == 0) { - ctx->zstream.next_in = NULL; - } - } - - ctx->out_buf->last = ctx->zstream.next_out; - - if (ctx->zstream.avail_out == 0 && rc != Z_STREAM_END) { - - /* zlib wants to output some more gzipped data */ - - cl = ngx_alloc_chain_link(r->pool); - if (cl == NULL) { - return NGX_ERROR; - } - - cl->buf = ctx->out_buf; - cl->next = NULL; - *ctx->last_out = cl; - ctx->last_out = &cl->next; - - ctx->redo = 1; - - return NGX_AGAIN; - } - - ctx->redo = 0; - - if (ctx->flush == Z_SYNC_FLUSH) { - - ctx->flush = Z_NO_FLUSH; - - cl = ngx_alloc_chain_link(r->pool); - if (cl == NULL) { - return NGX_ERROR; - } - - b = ctx->out_buf; - - if (ngx_buf_size(b) == 0) { - - b = ngx_calloc_buf(ctx->request->pool); - if (b == NULL) { - return NGX_ERROR; - } - - } else { - ctx->zstream.avail_out = 0; - } - - b->flush = 1; - - cl->buf = b; - cl->next = NULL; - *ctx->last_out = cl; - ctx->last_out = &cl->next; - - r->connection->buffered &= ~NGX_HTTP_GZIP_BUFFERED; - - return NGX_OK; - } - - if (rc == Z_STREAM_END) { - - if (ngx_http_gzip_filter_deflate_end(r, ctx) != NGX_OK) { - return NGX_ERROR; - } - - return NGX_OK; - } - - conf = ngx_http_get_module_loc_conf(r, ngx_http_gzip_filter_module); - - if (conf->no_buffer && ctx->in == NULL) { - - cl = ngx_alloc_chain_link(r->pool); - if (cl == NULL) { - return NGX_ERROR; - } - - cl->buf = ctx->out_buf; - cl->next = NULL; - *ctx->last_out = cl; - ctx->last_out = &cl->next; - - return NGX_OK; - } - - return NGX_AGAIN; -} - - -static ngx_int_t -ngx_http_gzip_filter_deflate_end(ngx_http_request_t *r, - ngx_http_gzip_ctx_t *ctx) -{ - int rc; - ngx_buf_t *b; - ngx_chain_t *cl; - - ctx->zin = ctx->zstream.total_in; - ctx->zout = ctx->zstream.total_out; - - rc = deflateEnd(&ctx->zstream); - - if (rc != Z_OK) { - ngx_log_error(NGX_LOG_ALERT, r->connection->log, 0, - "deflateEnd() failed: %d", rc); - return NGX_ERROR; - } - - ngx_pfree(r->pool, ctx->preallocated); - - cl = ngx_alloc_chain_link(r->pool); - if (cl == NULL) { - return NGX_ERROR; - } - - b = ctx->out_buf; - - if (ngx_buf_size(b) == 0) { - b->temporary = 0; - } - - b->last_buf = 1; - - cl->buf = b; - cl->next = NULL; - *ctx->last_out = cl; - ctx->last_out = &cl->next; - - ctx->zstream.avail_in = 0; - ctx->zstream.avail_out = 0; - - ctx->done = 1; - - r->connection->buffered &= ~NGX_HTTP_GZIP_BUFFERED; - - return NGX_OK; -} - - -static void * -ngx_http_gzip_filter_alloc(void *opaque, u_int items, u_int size) -{ - ngx_http_gzip_ctx_t *ctx = opaque; - - void *p; - ngx_uint_t alloc; - - alloc = items * size; - - if (items == 1 && alloc % 512 != 0 && alloc < 8192 - && !ctx->state_allocated) - { - /* - * The zlib deflate_state allocation, it takes about 6K, - * we allocate 8K. Other allocations are divisible by 512. - */ - - ctx->state_allocated = 1; - - alloc = 8192; - } - - if (alloc <= ctx->allocated) { - p = ctx->free_mem; - ctx->free_mem += alloc; - ctx->allocated -= alloc; - - ngx_log_debug4(NGX_LOG_DEBUG_HTTP, ctx->request->connection->log, 0, - "gzip alloc: n:%ud s:%ud a:%ui p:%p", - items, size, alloc, p); - - return p; - } - - if (ctx->zlib_ng) { - ngx_log_error(NGX_LOG_ALERT, ctx->request->connection->log, 0, - "gzip filter failed to use preallocated memory: " - "%ud of %ui", items * size, ctx->allocated); - - } else { - ngx_http_gzip_assume_zlib_ng = 1; - } - - p = ngx_palloc(ctx->request->pool, items * size); - - return p; -} - - -static void -ngx_http_gzip_filter_free(void *opaque, void *address) -{ -#if 0 - ngx_http_gzip_ctx_t *ctx = opaque; - - ngx_log_debug1(NGX_LOG_DEBUG_HTTP, ctx->request->connection->log, 0, - "gzip free: %p", address); -#endif -} - - -static void -ngx_http_gzip_filter_free_copy_buf(ngx_http_request_t *r, - ngx_http_gzip_ctx_t *ctx) -{ - ngx_chain_t *cl, *ln; - - for (cl = ctx->copied; cl; /* void */) { - ln = cl; - cl = cl->next; - - ngx_pfree(r->pool, ln->buf->start); - ngx_free_chain(r->pool, ln); - } - - ctx->copied = NULL; -} - - -static ngx_int_t -ngx_http_gzip_add_variables(ngx_conf_t *cf) -{ - ngx_http_variable_t *var; - - var = ngx_http_add_variable(cf, &ngx_http_gzip_ratio, NGX_HTTP_VAR_NOHASH); - if (var == NULL) { - return NGX_ERROR; - } - - var->get_handler = ngx_http_gzip_ratio_variable; - - return NGX_OK; -} - - -static ngx_int_t -ngx_http_gzip_ratio_variable(ngx_http_request_t *r, - ngx_http_variable_value_t *v, uintptr_t data) -{ - ngx_uint_t zint, zfrac; - ngx_http_gzip_ctx_t *ctx; - - ctx = ngx_http_get_module_ctx(r, ngx_http_gzip_filter_module); - - if (ctx == NULL || ctx->zout == 0) { - v->not_found = 1; - return NGX_OK; - } - - v->valid = 1; - v->no_cacheable = 0; - v->not_found = 0; - - v->data = ngx_pnalloc(r->pool, NGX_INT32_LEN + 3); - if (v->data == NULL) { - return NGX_ERROR; - } - - zint = (ngx_uint_t) (ctx->zin / ctx->zout); - zfrac = (ngx_uint_t) ((ctx->zin * 100 / ctx->zout) % 100); - - if ((ctx->zin * 1000 / ctx->zout) % 10 > 4) { - - /* the rounding, e.g., 2.125 to 2.13 */ - - zfrac++; - - if (zfrac > 99) { - zint++; - zfrac = 0; - } - } - - v->len = ngx_sprintf(v->data, "%ui.%02ui", zint, zfrac) - v->data; - - return NGX_OK; -} - - -static void * -ngx_http_gzip_create_conf(ngx_conf_t *cf) -{ - ngx_http_gzip_conf_t *conf; - - conf = ngx_pcalloc(cf->pool, sizeof(ngx_http_gzip_conf_t)); - if (conf == NULL) { - return NULL; - } - - /* - * set by ngx_pcalloc(): - * - * conf->bufs.num = 0; - * conf->types = { NULL }; - * conf->types_keys = NULL; - */ - - conf->enable = NGX_CONF_UNSET; - conf->no_buffer = NGX_CONF_UNSET; - - conf->postpone_gzipping = NGX_CONF_UNSET_SIZE; - conf->level = NGX_CONF_UNSET; - conf->wbits = NGX_CONF_UNSET_SIZE; - conf->memlevel = NGX_CONF_UNSET_SIZE; - conf->min_length = NGX_CONF_UNSET; - - return conf; -} - - -static char * -ngx_http_gzip_merge_conf(ngx_conf_t *cf, void *parent, void *child) -{ - ngx_http_gzip_conf_t *prev = parent; - ngx_http_gzip_conf_t *conf = child; - - ngx_conf_merge_value(conf->enable, prev->enable, 0); - ngx_conf_merge_value(conf->no_buffer, prev->no_buffer, 0); - - ngx_conf_merge_bufs_value(conf->bufs, prev->bufs, - (128 * 1024) / ngx_pagesize, ngx_pagesize); - - ngx_conf_merge_size_value(conf->postpone_gzipping, prev->postpone_gzipping, - 0); - ngx_conf_merge_value(conf->level, prev->level, 1); - ngx_conf_merge_size_value(conf->wbits, prev->wbits, MAX_WBITS); - ngx_conf_merge_size_value(conf->memlevel, prev->memlevel, - MAX_MEM_LEVEL - 1); - ngx_conf_merge_value(conf->min_length, prev->min_length, 20); - - if (ngx_http_merge_types(cf, &conf->types_keys, &conf->types, - &prev->types_keys, &prev->types, - ngx_http_html_default_types) - != NGX_CONF_OK) - { - return NGX_CONF_ERROR; - } - - return NGX_CONF_OK; -} - - -static ngx_int_t -ngx_http_gzip_filter_init(ngx_conf_t *cf) -{ - ngx_http_next_header_filter = ngx_http_top_header_filter; - ngx_http_top_header_filter = ngx_http_gzip_header_filter; - - ngx_http_next_body_filter = ngx_http_top_body_filter; - ngx_http_top_body_filter = ngx_http_gzip_body_filter; - - return NGX_OK; -} - - -static char * -ngx_http_gzip_window(ngx_conf_t *cf, void *post, void *data) -{ - size_t *np = data; - - size_t wbits, wsize; - - wbits = 15; - - for (wsize = 32 * 1024; wsize > 256; wsize >>= 1) { - - if (wsize == *np) { - *np = wbits; - - return NGX_CONF_OK; - } - - wbits--; - } - - return "must be 512, 1k, 2k, 4k, 8k, 16k, or 32k"; -} - - -static char * -ngx_http_gzip_hash(ngx_conf_t *cf, void *post, void *data) -{ - size_t *np = data; - - size_t memlevel, hsize; - - memlevel = 9; - - for (hsize = 128 * 1024; hsize > 256; hsize >>= 1) { - - if (hsize == *np) { - *np = memlevel; - - return NGX_CONF_OK; - } - - memlevel--; - } - - return "must be 512, 1k, 2k, 4k, 8k, 16k, 32k, 64k, or 128k"; -} diff --git a/src/deps/src/nginx-1.30.3/src/http/modules/ngx_http_gzip_static_module.c b/src/deps/src/nginx-1.30.3/src/http/modules/ngx_http_gzip_static_module.c deleted file mode 100644 index 91b38d17be..0000000000 --- a/src/deps/src/nginx-1.30.3/src/http/modules/ngx_http_gzip_static_module.c +++ /dev/null @@ -1,335 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#include -#include -#include - - -#define NGX_HTTP_GZIP_STATIC_OFF 0 -#define NGX_HTTP_GZIP_STATIC_ON 1 -#define NGX_HTTP_GZIP_STATIC_ALWAYS 2 - - -typedef struct { - ngx_uint_t enable; -} ngx_http_gzip_static_conf_t; - - -static ngx_int_t ngx_http_gzip_static_handler(ngx_http_request_t *r); -static void *ngx_http_gzip_static_create_conf(ngx_conf_t *cf); -static char *ngx_http_gzip_static_merge_conf(ngx_conf_t *cf, void *parent, - void *child); -static ngx_int_t ngx_http_gzip_static_init(ngx_conf_t *cf); - - -static ngx_conf_enum_t ngx_http_gzip_static[] = { - { ngx_string("off"), NGX_HTTP_GZIP_STATIC_OFF }, - { ngx_string("on"), NGX_HTTP_GZIP_STATIC_ON }, - { ngx_string("always"), NGX_HTTP_GZIP_STATIC_ALWAYS }, - { ngx_null_string, 0 } -}; - - -static ngx_command_t ngx_http_gzip_static_commands[] = { - - { ngx_string("gzip_static"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1, - ngx_conf_set_enum_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_gzip_static_conf_t, enable), - &ngx_http_gzip_static }, - - ngx_null_command -}; - - -static ngx_http_module_t ngx_http_gzip_static_module_ctx = { - NULL, /* preconfiguration */ - ngx_http_gzip_static_init, /* postconfiguration */ - - NULL, /* create main configuration */ - NULL, /* init main configuration */ - - NULL, /* create server configuration */ - NULL, /* merge server configuration */ - - ngx_http_gzip_static_create_conf, /* create location configuration */ - ngx_http_gzip_static_merge_conf /* merge location configuration */ -}; - - -ngx_module_t ngx_http_gzip_static_module = { - NGX_MODULE_V1, - &ngx_http_gzip_static_module_ctx, /* module context */ - ngx_http_gzip_static_commands, /* module directives */ - NGX_HTTP_MODULE, /* module type */ - NULL, /* init master */ - NULL, /* init module */ - NULL, /* init process */ - NULL, /* init thread */ - NULL, /* exit thread */ - NULL, /* exit process */ - NULL, /* exit master */ - NGX_MODULE_V1_PADDING -}; - - -static ngx_int_t -ngx_http_gzip_static_handler(ngx_http_request_t *r) -{ - u_char *p; - size_t root; - ngx_str_t path; - ngx_int_t rc; - ngx_uint_t level; - ngx_log_t *log; - ngx_buf_t *b; - ngx_chain_t out; - ngx_table_elt_t *h; - ngx_open_file_info_t of; - ngx_http_core_loc_conf_t *clcf; - ngx_http_gzip_static_conf_t *gzcf; - - if (!(r->method & (NGX_HTTP_GET|NGX_HTTP_HEAD))) { - return NGX_DECLINED; - } - - if (r->uri.data[r->uri.len - 1] == '/') { - return NGX_DECLINED; - } - - gzcf = ngx_http_get_module_loc_conf(r, ngx_http_gzip_static_module); - - if (gzcf->enable == NGX_HTTP_GZIP_STATIC_OFF) { - return NGX_DECLINED; - } - - if (gzcf->enable == NGX_HTTP_GZIP_STATIC_ON) { - rc = ngx_http_gzip_ok(r); - - } else { - /* always */ - rc = NGX_OK; - } - - clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module); - - if (!clcf->gzip_vary && rc != NGX_OK) { - return NGX_DECLINED; - } - - log = r->connection->log; - - p = ngx_http_map_uri_to_path(r, &path, &root, sizeof(".gz") - 1); - if (p == NULL) { - return NGX_HTTP_INTERNAL_SERVER_ERROR; - } - - *p++ = '.'; - *p++ = 'g'; - *p++ = 'z'; - *p = '\0'; - - path.len = p - path.data; - - ngx_log_debug1(NGX_LOG_DEBUG_HTTP, log, 0, - "http filename: \"%s\"", path.data); - - ngx_memzero(&of, sizeof(ngx_open_file_info_t)); - - of.read_ahead = clcf->read_ahead; - of.directio = clcf->directio; - of.valid = clcf->open_file_cache_valid; - of.min_uses = clcf->open_file_cache_min_uses; - of.errors = clcf->open_file_cache_errors; - of.events = clcf->open_file_cache_events; - - if (ngx_http_set_disable_symlinks(r, clcf, &path, &of) != NGX_OK) { - return NGX_HTTP_INTERNAL_SERVER_ERROR; - } - - if (ngx_open_cached_file(clcf->open_file_cache, &path, &of, r->pool) - != NGX_OK) - { - switch (of.err) { - - case 0: - return NGX_HTTP_INTERNAL_SERVER_ERROR; - - case NGX_ENOENT: - case NGX_ENOTDIR: - case NGX_ENAMETOOLONG: - - return NGX_DECLINED; - - case NGX_EACCES: -#if (NGX_HAVE_OPENAT) - case NGX_EMLINK: - case NGX_ELOOP: -#endif - - level = NGX_LOG_ERR; - break; - - default: - - level = NGX_LOG_CRIT; - break; - } - - ngx_log_error(level, log, of.err, - "%s \"%s\" failed", of.failed, path.data); - - return NGX_DECLINED; - } - - if (gzcf->enable == NGX_HTTP_GZIP_STATIC_ON) { - r->gzip_vary = 1; - - if (rc != NGX_OK) { - return NGX_DECLINED; - } - } - - ngx_log_debug1(NGX_LOG_DEBUG_HTTP, log, 0, "http static fd: %d", of.fd); - - if (of.is_dir) { - ngx_log_debug0(NGX_LOG_DEBUG_HTTP, log, 0, "http dir"); - return NGX_DECLINED; - } - -#if !(NGX_WIN32) /* the not regular files are probably Unix specific */ - - if (!of.is_file) { - ngx_log_error(NGX_LOG_CRIT, log, 0, - "\"%s\" is not a regular file", path.data); - - return NGX_HTTP_NOT_FOUND; - } - -#endif - - r->root_tested = !r->error_page; - - rc = ngx_http_discard_request_body(r); - - if (rc != NGX_OK) { - return rc; - } - - log->action = "sending response to client"; - - r->headers_out.status = NGX_HTTP_OK; - r->headers_out.content_length_n = of.size; - r->headers_out.last_modified_time = of.mtime; - - if (ngx_http_set_etag(r) != NGX_OK) { - return NGX_HTTP_INTERNAL_SERVER_ERROR; - } - - if (ngx_http_set_content_type(r) != NGX_OK) { - return NGX_HTTP_INTERNAL_SERVER_ERROR; - } - - h = ngx_list_push(&r->headers_out.headers); - if (h == NULL) { - return NGX_HTTP_INTERNAL_SERVER_ERROR; - } - - h->hash = 1; - h->next = NULL; - ngx_str_set(&h->key, "Content-Encoding"); - ngx_str_set(&h->value, "gzip"); - r->headers_out.content_encoding = h; - - r->allow_ranges = 1; - - /* we need to allocate all before the header would be sent */ - - b = ngx_calloc_buf(r->pool); - if (b == NULL) { - return NGX_HTTP_INTERNAL_SERVER_ERROR; - } - - b->file = ngx_pcalloc(r->pool, sizeof(ngx_file_t)); - if (b->file == NULL) { - return NGX_HTTP_INTERNAL_SERVER_ERROR; - } - - rc = ngx_http_send_header(r); - - if (rc == NGX_ERROR || rc > NGX_OK || r->header_only) { - return rc; - } - - b->file_pos = 0; - b->file_last = of.size; - - b->in_file = b->file_last ? 1 : 0; - b->last_buf = (r == r->main) ? 1 : 0; - b->last_in_chain = 1; - b->sync = (b->last_buf || b->in_file) ? 0 : 1; - - b->file->fd = of.fd; - b->file->name = path; - b->file->log = log; - b->file->directio = of.is_directio; - - out.buf = b; - out.next = NULL; - - return ngx_http_output_filter(r, &out); -} - - -static void * -ngx_http_gzip_static_create_conf(ngx_conf_t *cf) -{ - ngx_http_gzip_static_conf_t *conf; - - conf = ngx_palloc(cf->pool, sizeof(ngx_http_gzip_static_conf_t)); - if (conf == NULL) { - return NULL; - } - - conf->enable = NGX_CONF_UNSET_UINT; - - return conf; -} - - -static char * -ngx_http_gzip_static_merge_conf(ngx_conf_t *cf, void *parent, void *child) -{ - ngx_http_gzip_static_conf_t *prev = parent; - ngx_http_gzip_static_conf_t *conf = child; - - ngx_conf_merge_uint_value(conf->enable, prev->enable, - NGX_HTTP_GZIP_STATIC_OFF); - - return NGX_CONF_OK; -} - - -static ngx_int_t -ngx_http_gzip_static_init(ngx_conf_t *cf) -{ - ngx_http_handler_pt *h; - ngx_http_core_main_conf_t *cmcf; - - cmcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_core_module); - - h = ngx_array_push(&cmcf->phases[NGX_HTTP_CONTENT_PHASE].handlers); - if (h == NULL) { - return NGX_ERROR; - } - - *h = ngx_http_gzip_static_handler; - - return NGX_OK; -} diff --git a/src/deps/src/nginx-1.30.3/src/http/modules/ngx_http_headers_filter_module.c b/src/deps/src/nginx-1.30.3/src/http/modules/ngx_http_headers_filter_module.c deleted file mode 100644 index f720440978..0000000000 --- a/src/deps/src/nginx-1.30.3/src/http/modules/ngx_http_headers_filter_module.c +++ /dev/null @@ -1,918 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#include -#include -#include - - -#define NGX_HTTP_HEADERS_INHERIT_OFF 0 -#define NGX_HTTP_HEADERS_INHERIT_ON 1 -#define NGX_HTTP_HEADERS_INHERIT_MERGE 2 - - -typedef struct ngx_http_header_val_s ngx_http_header_val_t; - -typedef ngx_int_t (*ngx_http_set_header_pt)(ngx_http_request_t *r, - ngx_http_header_val_t *hv, ngx_str_t *value); - - -typedef struct { - ngx_str_t name; - ngx_uint_t offset; - ngx_http_set_header_pt handler; -} ngx_http_set_header_t; - - -struct ngx_http_header_val_s { - ngx_http_complex_value_t value; - ngx_str_t key; - ngx_http_set_header_pt handler; - ngx_uint_t offset; - ngx_uint_t always; /* unsigned always:1 */ -}; - - -typedef enum { - NGX_HTTP_EXPIRES_OFF, - NGX_HTTP_EXPIRES_EPOCH, - NGX_HTTP_EXPIRES_MAX, - NGX_HTTP_EXPIRES_ACCESS, - NGX_HTTP_EXPIRES_MODIFIED, - NGX_HTTP_EXPIRES_DAILY, - NGX_HTTP_EXPIRES_UNSET -} ngx_http_expires_t; - - -typedef struct { - ngx_http_expires_t expires; - time_t expires_time; - ngx_http_complex_value_t *expires_value; - ngx_array_t *headers; - ngx_array_t *trailers; - ngx_uint_t headers_inherit; - ngx_uint_t trailers_inherit; -} ngx_http_headers_conf_t; - - -static ngx_int_t ngx_http_set_expires(ngx_http_request_t *r, - ngx_http_headers_conf_t *conf); -static ngx_int_t ngx_http_parse_expires(ngx_str_t *value, - ngx_http_expires_t *expires, time_t *expires_time, char **err); -static ngx_int_t ngx_http_add_multi_header_lines(ngx_http_request_t *r, - ngx_http_header_val_t *hv, ngx_str_t *value); -static ngx_int_t ngx_http_add_header(ngx_http_request_t *r, - ngx_http_header_val_t *hv, ngx_str_t *value); -static ngx_int_t ngx_http_set_last_modified(ngx_http_request_t *r, - ngx_http_header_val_t *hv, ngx_str_t *value); -static ngx_int_t ngx_http_set_response_header(ngx_http_request_t *r, - ngx_http_header_val_t *hv, ngx_str_t *value); - -static void *ngx_http_headers_create_conf(ngx_conf_t *cf); -static char *ngx_http_headers_merge_conf(ngx_conf_t *cf, - void *parent, void *child); -static ngx_int_t ngx_http_headers_filter_init(ngx_conf_t *cf); -static char *ngx_http_headers_expires(ngx_conf_t *cf, ngx_command_t *cmd, - void *conf); -static char *ngx_http_headers_add(ngx_conf_t *cf, ngx_command_t *cmd, - void *conf); - - -static ngx_http_set_header_t ngx_http_set_headers[] = { - - { ngx_string("Cache-Control"), - offsetof(ngx_http_headers_out_t, cache_control), - ngx_http_add_multi_header_lines }, - - { ngx_string("Link"), - offsetof(ngx_http_headers_out_t, link), - ngx_http_add_multi_header_lines }, - - { ngx_string("Last-Modified"), - offsetof(ngx_http_headers_out_t, last_modified), - ngx_http_set_last_modified }, - - { ngx_string("ETag"), - offsetof(ngx_http_headers_out_t, etag), - ngx_http_set_response_header }, - - { ngx_null_string, 0, NULL } -}; - - -static ngx_conf_enum_t ngx_http_headers_inherit[] = { - { ngx_string("off"), NGX_HTTP_HEADERS_INHERIT_OFF }, - { ngx_string("on"), NGX_HTTP_HEADERS_INHERIT_ON }, - { ngx_string("merge"), NGX_HTTP_HEADERS_INHERIT_MERGE }, - { ngx_null_string, 0 } -}; - - -static ngx_command_t ngx_http_headers_filter_commands[] = { - - { ngx_string("expires"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF - |NGX_CONF_TAKE12, - ngx_http_headers_expires, - NGX_HTTP_LOC_CONF_OFFSET, - 0, - NULL }, - - { ngx_string("add_header"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF - |NGX_CONF_TAKE23, - ngx_http_headers_add, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_headers_conf_t, headers), - NULL }, - - { ngx_string("add_trailer"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF - |NGX_CONF_TAKE23, - ngx_http_headers_add, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_headers_conf_t, trailers), - NULL }, - - { ngx_string("add_header_inherit"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF - |NGX_CONF_TAKE1, - ngx_conf_set_enum_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_headers_conf_t, headers_inherit), - &ngx_http_headers_inherit }, - - { ngx_string("add_trailer_inherit"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF - |NGX_CONF_TAKE1, - ngx_conf_set_enum_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_headers_conf_t, trailers_inherit), - &ngx_http_headers_inherit }, - - ngx_null_command -}; - - -static ngx_http_module_t ngx_http_headers_filter_module_ctx = { - NULL, /* preconfiguration */ - ngx_http_headers_filter_init, /* postconfiguration */ - - NULL, /* create main configuration */ - NULL, /* init main configuration */ - - NULL, /* create server configuration */ - NULL, /* merge server configuration */ - - ngx_http_headers_create_conf, /* create location configuration */ - ngx_http_headers_merge_conf /* merge location configuration */ -}; - - -ngx_module_t ngx_http_headers_filter_module = { - NGX_MODULE_V1, - &ngx_http_headers_filter_module_ctx, /* module context */ - ngx_http_headers_filter_commands, /* module directives */ - NGX_HTTP_MODULE, /* module type */ - NULL, /* init master */ - NULL, /* init module */ - NULL, /* init process */ - NULL, /* init thread */ - NULL, /* exit thread */ - NULL, /* exit process */ - NULL, /* exit master */ - NGX_MODULE_V1_PADDING -}; - - -static ngx_http_output_header_filter_pt ngx_http_next_header_filter; -static ngx_http_output_body_filter_pt ngx_http_next_body_filter; - - -static ngx_int_t -ngx_http_headers_filter(ngx_http_request_t *r) -{ - ngx_str_t value; - ngx_uint_t i, safe_status; - ngx_http_header_val_t *h; - ngx_http_headers_conf_t *conf; - - if (r != r->main) { - return ngx_http_next_header_filter(r); - } - - conf = ngx_http_get_module_loc_conf(r, ngx_http_headers_filter_module); - - if (conf->expires == NGX_HTTP_EXPIRES_OFF - && conf->headers == NULL - && conf->trailers == NULL) - { - return ngx_http_next_header_filter(r); - } - - switch (r->headers_out.status) { - - case NGX_HTTP_OK: - case NGX_HTTP_CREATED: - case NGX_HTTP_NO_CONTENT: - case NGX_HTTP_PARTIAL_CONTENT: - case NGX_HTTP_MOVED_PERMANENTLY: - case NGX_HTTP_MOVED_TEMPORARILY: - case NGX_HTTP_SEE_OTHER: - case NGX_HTTP_NOT_MODIFIED: - case NGX_HTTP_TEMPORARY_REDIRECT: - case NGX_HTTP_PERMANENT_REDIRECT: - safe_status = 1; - break; - - default: - safe_status = 0; - break; - } - - if (conf->expires != NGX_HTTP_EXPIRES_OFF && safe_status) { - if (ngx_http_set_expires(r, conf) != NGX_OK) { - return NGX_ERROR; - } - } - - if (conf->headers) { - h = conf->headers->elts; - for (i = 0; i < conf->headers->nelts; i++) { - - if (!safe_status && !h[i].always) { - continue; - } - - if (ngx_http_complex_value(r, &h[i].value, &value) != NGX_OK) { - return NGX_ERROR; - } - - if (h[i].handler(r, &h[i], &value) != NGX_OK) { - return NGX_ERROR; - } - } - } - - if (conf->trailers) { - h = conf->trailers->elts; - for (i = 0; i < conf->trailers->nelts; i++) { - - if (!safe_status && !h[i].always) { - continue; - } - - r->expect_trailers = 1; - break; - } - } - - return ngx_http_next_header_filter(r); -} - - -static ngx_int_t -ngx_http_trailers_filter(ngx_http_request_t *r, ngx_chain_t *in) -{ - ngx_str_t value; - ngx_uint_t i, safe_status; - ngx_chain_t *cl; - ngx_table_elt_t *t; - ngx_http_header_val_t *h; - ngx_http_headers_conf_t *conf; - - conf = ngx_http_get_module_loc_conf(r, ngx_http_headers_filter_module); - - if (in == NULL - || conf->trailers == NULL - || !r->expect_trailers - || r->header_only) - { - return ngx_http_next_body_filter(r, in); - } - - for (cl = in; cl; cl = cl->next) { - if (cl->buf->last_buf) { - break; - } - } - - if (cl == NULL) { - return ngx_http_next_body_filter(r, in); - } - - switch (r->headers_out.status) { - - case NGX_HTTP_OK: - case NGX_HTTP_CREATED: - case NGX_HTTP_NO_CONTENT: - case NGX_HTTP_PARTIAL_CONTENT: - case NGX_HTTP_MOVED_PERMANENTLY: - case NGX_HTTP_MOVED_TEMPORARILY: - case NGX_HTTP_SEE_OTHER: - case NGX_HTTP_NOT_MODIFIED: - case NGX_HTTP_TEMPORARY_REDIRECT: - case NGX_HTTP_PERMANENT_REDIRECT: - safe_status = 1; - break; - - default: - safe_status = 0; - break; - } - - h = conf->trailers->elts; - for (i = 0; i < conf->trailers->nelts; i++) { - - if (!safe_status && !h[i].always) { - continue; - } - - if (ngx_http_complex_value(r, &h[i].value, &value) != NGX_OK) { - return NGX_ERROR; - } - - if (value.len) { - t = ngx_list_push(&r->headers_out.trailers); - if (t == NULL) { - return NGX_ERROR; - } - - t->key = h[i].key; - t->value = value; - t->hash = 1; - } - } - - return ngx_http_next_body_filter(r, in); -} - - -static ngx_int_t -ngx_http_set_expires(ngx_http_request_t *r, ngx_http_headers_conf_t *conf) -{ - char *err; - size_t len; - time_t now, expires_time, max_age; - ngx_str_t value; - ngx_int_t rc; - ngx_table_elt_t *e, *cc; - ngx_http_expires_t expires; - - expires = conf->expires; - expires_time = conf->expires_time; - - if (conf->expires_value != NULL) { - - if (ngx_http_complex_value(r, conf->expires_value, &value) != NGX_OK) { - return NGX_ERROR; - } - - rc = ngx_http_parse_expires(&value, &expires, &expires_time, &err); - - if (rc != NGX_OK) { - return NGX_OK; - } - - if (expires == NGX_HTTP_EXPIRES_OFF) { - return NGX_OK; - } - } - - e = r->headers_out.expires; - - if (e == NULL) { - - e = ngx_list_push(&r->headers_out.headers); - if (e == NULL) { - return NGX_ERROR; - } - - r->headers_out.expires = e; - e->next = NULL; - - e->hash = 1; - ngx_str_set(&e->key, "Expires"); - } - - len = sizeof("Mon, 28 Sep 1970 06:00:00 GMT"); - e->value.len = len - 1; - - cc = r->headers_out.cache_control; - - if (cc == NULL) { - - cc = ngx_list_push(&r->headers_out.headers); - if (cc == NULL) { - e->hash = 0; - return NGX_ERROR; - } - - r->headers_out.cache_control = cc; - cc->next = NULL; - - cc->hash = 1; - ngx_str_set(&cc->key, "Cache-Control"); - - } else { - for (cc = cc->next; cc; cc = cc->next) { - cc->hash = 0; - } - - cc = r->headers_out.cache_control; - cc->next = NULL; - } - - if (expires == NGX_HTTP_EXPIRES_EPOCH) { - e->value.data = (u_char *) "Thu, 01 Jan 1970 00:00:01 GMT"; - ngx_str_set(&cc->value, "no-cache"); - return NGX_OK; - } - - if (expires == NGX_HTTP_EXPIRES_MAX) { - e->value.data = (u_char *) "Thu, 31 Dec 2037 23:55:55 GMT"; - /* 10 years */ - ngx_str_set(&cc->value, "max-age=315360000"); - return NGX_OK; - } - - e->value.data = ngx_pnalloc(r->pool, len); - if (e->value.data == NULL) { - e->hash = 0; - cc->hash = 0; - return NGX_ERROR; - } - - if (expires_time == 0 && expires != NGX_HTTP_EXPIRES_DAILY) { - ngx_memcpy(e->value.data, ngx_cached_http_time.data, - ngx_cached_http_time.len + 1); - ngx_str_set(&cc->value, "max-age=0"); - return NGX_OK; - } - - now = ngx_time(); - - if (expires == NGX_HTTP_EXPIRES_DAILY) { - expires_time = ngx_next_time(expires_time); - max_age = expires_time - now; - - } else if (expires == NGX_HTTP_EXPIRES_ACCESS - || r->headers_out.last_modified_time == -1) - { - max_age = expires_time; - expires_time += now; - - } else { - expires_time += r->headers_out.last_modified_time; - max_age = expires_time - now; - } - - ngx_http_time(e->value.data, expires_time); - - if (conf->expires_time < 0 || max_age < 0) { - ngx_str_set(&cc->value, "no-cache"); - return NGX_OK; - } - - cc->value.data = ngx_pnalloc(r->pool, - sizeof("max-age=") + NGX_TIME_T_LEN + 1); - if (cc->value.data == NULL) { - cc->hash = 0; - return NGX_ERROR; - } - - cc->value.len = ngx_sprintf(cc->value.data, "max-age=%T", max_age) - - cc->value.data; - - return NGX_OK; -} - - -static ngx_int_t -ngx_http_parse_expires(ngx_str_t *value, ngx_http_expires_t *expires, - time_t *expires_time, char **err) -{ - ngx_uint_t minus; - - if (*expires != NGX_HTTP_EXPIRES_MODIFIED) { - - if (value->len == 5 && ngx_strncmp(value->data, "epoch", 5) == 0) { - *expires = NGX_HTTP_EXPIRES_EPOCH; - return NGX_OK; - } - - if (value->len == 3 && ngx_strncmp(value->data, "max", 3) == 0) { - *expires = NGX_HTTP_EXPIRES_MAX; - return NGX_OK; - } - - if (value->len == 3 && ngx_strncmp(value->data, "off", 3) == 0) { - *expires = NGX_HTTP_EXPIRES_OFF; - return NGX_OK; - } - } - - if (value->len && value->data[0] == '@') { - value->data++; - value->len--; - minus = 0; - - if (*expires == NGX_HTTP_EXPIRES_MODIFIED) { - *err = "daily time cannot be used with \"modified\" parameter"; - return NGX_ERROR; - } - - *expires = NGX_HTTP_EXPIRES_DAILY; - - } else if (value->len && value->data[0] == '+') { - value->data++; - value->len--; - minus = 0; - - } else if (value->len && value->data[0] == '-') { - value->data++; - value->len--; - minus = 1; - - } else { - minus = 0; - } - - *expires_time = ngx_parse_time(value, 1); - - if (*expires_time == (time_t) NGX_ERROR) { - *err = "invalid value"; - return NGX_ERROR; - } - - if (*expires == NGX_HTTP_EXPIRES_DAILY - && *expires_time > 24 * 60 * 60) - { - *err = "daily time value must be less than 24 hours"; - return NGX_ERROR; - } - - if (minus) { - *expires_time = - *expires_time; - } - - return NGX_OK; -} - - -static ngx_int_t -ngx_http_add_header(ngx_http_request_t *r, ngx_http_header_val_t *hv, - ngx_str_t *value) -{ - ngx_table_elt_t *h; - - if (value->len) { - h = ngx_list_push(&r->headers_out.headers); - if (h == NULL) { - return NGX_ERROR; - } - - h->hash = 1; - h->key = hv->key; - h->value = *value; - } - - return NGX_OK; -} - - -static ngx_int_t -ngx_http_add_multi_header_lines(ngx_http_request_t *r, - ngx_http_header_val_t *hv, ngx_str_t *value) -{ - ngx_table_elt_t *h, **ph; - - if (value->len == 0) { - return NGX_OK; - } - - h = ngx_list_push(&r->headers_out.headers); - if (h == NULL) { - return NGX_ERROR; - } - - h->hash = 1; - h->key = hv->key; - h->value = *value; - - ph = (ngx_table_elt_t **) ((char *) &r->headers_out + hv->offset); - - while (*ph) { ph = &(*ph)->next; } - - *ph = h; - h->next = NULL; - - return NGX_OK; -} - - -static ngx_int_t -ngx_http_set_last_modified(ngx_http_request_t *r, ngx_http_header_val_t *hv, - ngx_str_t *value) -{ - if (ngx_http_set_response_header(r, hv, value) != NGX_OK) { - return NGX_ERROR; - } - - r->headers_out.last_modified_time = - (value->len) ? ngx_parse_http_time(value->data, value->len) : -1; - - return NGX_OK; -} - - -static ngx_int_t -ngx_http_set_response_header(ngx_http_request_t *r, ngx_http_header_val_t *hv, - ngx_str_t *value) -{ - ngx_table_elt_t *h, **old; - - old = (ngx_table_elt_t **) ((char *) &r->headers_out + hv->offset); - - if (value->len == 0) { - if (*old) { - (*old)->hash = 0; - *old = NULL; - } - - return NGX_OK; - } - - if (*old) { - h = *old; - - } else { - h = ngx_list_push(&r->headers_out.headers); - if (h == NULL) { - return NGX_ERROR; - } - - *old = h; - h->next = NULL; - } - - h->hash = 1; - h->key = hv->key; - h->value = *value; - - return NGX_OK; -} - - -static void * -ngx_http_headers_create_conf(ngx_conf_t *cf) -{ - ngx_http_headers_conf_t *conf; - - conf = ngx_pcalloc(cf->pool, sizeof(ngx_http_headers_conf_t)); - if (conf == NULL) { - return NULL; - } - - /* - * set by ngx_pcalloc(): - * - * conf->headers = NULL; - * conf->trailers = NULL; - * conf->expires_time = 0; - * conf->expires_value = NULL; - */ - - conf->expires = NGX_HTTP_EXPIRES_UNSET; - conf->headers_inherit = NGX_CONF_UNSET_UINT; - conf->trailers_inherit = NGX_CONF_UNSET_UINT; - - return conf; -} - - -static char * -ngx_http_headers_merge_conf(ngx_conf_t *cf, void *parent, void *child) -{ - ngx_http_headers_conf_t *prev = parent; - ngx_http_headers_conf_t *conf = child; - - ngx_http_header_val_t *hv; - - if (conf->expires == NGX_HTTP_EXPIRES_UNSET) { - conf->expires = prev->expires; - conf->expires_time = prev->expires_time; - conf->expires_value = prev->expires_value; - - if (conf->expires == NGX_HTTP_EXPIRES_UNSET) { - conf->expires = NGX_HTTP_EXPIRES_OFF; - } - } - - ngx_conf_merge_uint_value(conf->headers_inherit, prev->headers_inherit, - NGX_HTTP_HEADERS_INHERIT_ON); - ngx_conf_merge_uint_value(conf->trailers_inherit, prev->trailers_inherit, - NGX_HTTP_HEADERS_INHERIT_ON); - - if (conf->headers_inherit != NGX_HTTP_HEADERS_INHERIT_OFF - && prev->headers) - { - if (conf->headers == NULL) { - conf->headers = prev->headers; - - } else if (conf->headers_inherit == NGX_HTTP_HEADERS_INHERIT_MERGE) { - hv = ngx_array_push_n(conf->headers, prev->headers->nelts); - if (hv == NULL) { - return NGX_CONF_ERROR; - } - - ngx_memcpy(hv, prev->headers->elts, - sizeof(ngx_http_header_val_t) * prev->headers->nelts); - } - } - - if (conf->trailers_inherit != NGX_HTTP_HEADERS_INHERIT_OFF - && prev->trailers) - { - if (conf->trailers == NULL) { - conf->trailers = prev->trailers; - - } else if (conf->trailers_inherit == NGX_HTTP_HEADERS_INHERIT_MERGE) { - hv = ngx_array_push_n(conf->trailers, prev->trailers->nelts); - if (hv == NULL) { - return NGX_CONF_ERROR; - } - - ngx_memcpy(hv, prev->trailers->elts, - sizeof(ngx_http_header_val_t) * prev->trailers->nelts); - } - } - - return NGX_CONF_OK; -} - - -static ngx_int_t -ngx_http_headers_filter_init(ngx_conf_t *cf) -{ - ngx_http_next_header_filter = ngx_http_top_header_filter; - ngx_http_top_header_filter = ngx_http_headers_filter; - - ngx_http_next_body_filter = ngx_http_top_body_filter; - ngx_http_top_body_filter = ngx_http_trailers_filter; - - return NGX_OK; -} - - -static char * -ngx_http_headers_expires(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) -{ - ngx_http_headers_conf_t *hcf = conf; - - char *err; - ngx_str_t *value; - ngx_int_t rc; - ngx_uint_t n; - ngx_http_complex_value_t cv; - ngx_http_compile_complex_value_t ccv; - - if (hcf->expires != NGX_HTTP_EXPIRES_UNSET) { - return "is duplicate"; - } - - value = cf->args->elts; - - if (cf->args->nelts == 2) { - - hcf->expires = NGX_HTTP_EXPIRES_ACCESS; - - n = 1; - - } else { /* cf->args->nelts == 3 */ - - if (ngx_strcmp(value[1].data, "modified") != 0) { - return "invalid value"; - } - - hcf->expires = NGX_HTTP_EXPIRES_MODIFIED; - - n = 2; - } - - ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t)); - - ccv.cf = cf; - ccv.value = &value[n]; - ccv.complex_value = &cv; - - if (ngx_http_compile_complex_value(&ccv) != NGX_OK) { - return NGX_CONF_ERROR; - } - - if (cv.lengths != NULL) { - - hcf->expires_value = ngx_palloc(cf->pool, - sizeof(ngx_http_complex_value_t)); - if (hcf->expires_value == NULL) { - return NGX_CONF_ERROR; - } - - *hcf->expires_value = cv; - - return NGX_CONF_OK; - } - - rc = ngx_http_parse_expires(&value[n], &hcf->expires, &hcf->expires_time, - &err); - if (rc != NGX_OK) { - return err; - } - - return NGX_CONF_OK; -} - - -static char * -ngx_http_headers_add(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) -{ - ngx_http_headers_conf_t *hcf = conf; - - ngx_str_t *value; - ngx_uint_t i; - ngx_array_t **headers; - ngx_http_header_val_t *hv; - ngx_http_set_header_t *set; - ngx_http_compile_complex_value_t ccv; - - value = cf->args->elts; - - headers = (ngx_array_t **) ((char *) hcf + cmd->offset); - - if (*headers == NULL) { - *headers = ngx_array_create(cf->pool, 1, - sizeof(ngx_http_header_val_t)); - if (*headers == NULL) { - return NGX_CONF_ERROR; - } - } - - hv = ngx_array_push(*headers); - if (hv == NULL) { - return NGX_CONF_ERROR; - } - - hv->key = value[1]; - hv->handler = NULL; - hv->offset = 0; - hv->always = 0; - - if (headers == &hcf->headers) { - hv->handler = ngx_http_add_header; - - set = ngx_http_set_headers; - for (i = 0; set[i].name.len; i++) { - if (ngx_strcasecmp(value[1].data, set[i].name.data) != 0) { - continue; - } - - hv->offset = set[i].offset; - hv->handler = set[i].handler; - - break; - } - } - - if (value[2].len == 0) { - ngx_memzero(&hv->value, sizeof(ngx_http_complex_value_t)); - - } else { - ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t)); - - ccv.cf = cf; - ccv.value = &value[2]; - ccv.complex_value = &hv->value; - - if (ngx_http_compile_complex_value(&ccv) != NGX_OK) { - return NGX_CONF_ERROR; - } - } - - if (cf->args->nelts == 3) { - return NGX_CONF_OK; - } - - if (ngx_strcmp(value[3].data, "always") != 0) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "invalid parameter \"%V\"", &value[3]); - return NGX_CONF_ERROR; - } - - hv->always = 1; - - return NGX_CONF_OK; -} diff --git a/src/deps/src/nginx-1.30.3/src/http/modules/ngx_http_image_filter_module.c b/src/deps/src/nginx-1.30.3/src/http/modules/ngx_http_image_filter_module.c deleted file mode 100644 index 6c03e8aece..0000000000 --- a/src/deps/src/nginx-1.30.3/src/http/modules/ngx_http_image_filter_module.c +++ /dev/null @@ -1,1675 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#include -#include -#include - -#include - - -#define NGX_HTTP_IMAGE_OFF 0 -#define NGX_HTTP_IMAGE_TEST 1 -#define NGX_HTTP_IMAGE_SIZE 2 -#define NGX_HTTP_IMAGE_RESIZE 3 -#define NGX_HTTP_IMAGE_CROP 4 -#define NGX_HTTP_IMAGE_ROTATE 5 - - -#define NGX_HTTP_IMAGE_START 0 -#define NGX_HTTP_IMAGE_READ 1 -#define NGX_HTTP_IMAGE_PROCESS 2 -#define NGX_HTTP_IMAGE_PASS 3 -#define NGX_HTTP_IMAGE_DONE 4 - - -#define NGX_HTTP_IMAGE_NONE 0 -#define NGX_HTTP_IMAGE_JPEG 1 -#define NGX_HTTP_IMAGE_GIF 2 -#define NGX_HTTP_IMAGE_PNG 3 -#define NGX_HTTP_IMAGE_WEBP 4 - - -#define NGX_HTTP_IMAGE_BUFFERED 0x08 - - -typedef struct { - ngx_uint_t filter; - ngx_uint_t width; - ngx_uint_t height; - ngx_uint_t angle; - ngx_uint_t jpeg_quality; - ngx_uint_t webp_quality; - ngx_uint_t sharpen; - - ngx_flag_t transparency; - ngx_flag_t interlace; - - ngx_http_complex_value_t *wcv; - ngx_http_complex_value_t *hcv; - ngx_http_complex_value_t *acv; - ngx_http_complex_value_t *jqcv; - ngx_http_complex_value_t *wqcv; - ngx_http_complex_value_t *shcv; - - size_t buffer_size; -} ngx_http_image_filter_conf_t; - - -typedef struct { - u_char *image; - u_char *last; - - size_t length; - - ngx_uint_t width; - ngx_uint_t height; - ngx_uint_t max_width; - ngx_uint_t max_height; - ngx_uint_t angle; - - ngx_uint_t phase; - ngx_uint_t type; - ngx_uint_t force; -} ngx_http_image_filter_ctx_t; - - -static ngx_int_t ngx_http_image_send(ngx_http_request_t *r, - ngx_http_image_filter_ctx_t *ctx, ngx_chain_t *in); -static ngx_uint_t ngx_http_image_test(ngx_http_request_t *r, ngx_chain_t *in); -static ngx_int_t ngx_http_image_read(ngx_http_request_t *r, ngx_chain_t *in); -static ngx_buf_t *ngx_http_image_process(ngx_http_request_t *r); -static ngx_buf_t *ngx_http_image_json(ngx_http_request_t *r, - ngx_http_image_filter_ctx_t *ctx); -static ngx_buf_t *ngx_http_image_asis(ngx_http_request_t *r, - ngx_http_image_filter_ctx_t *ctx); -static void ngx_http_image_length(ngx_http_request_t *r, ngx_buf_t *b); -static ngx_int_t ngx_http_image_size(ngx_http_request_t *r, - ngx_http_image_filter_ctx_t *ctx); - -static ngx_buf_t *ngx_http_image_resize(ngx_http_request_t *r, - ngx_http_image_filter_ctx_t *ctx); -static gdImagePtr ngx_http_image_source(ngx_http_request_t *r, - ngx_http_image_filter_ctx_t *ctx); -static gdImagePtr ngx_http_image_new(ngx_http_request_t *r, int w, int h, - int colors); -static u_char *ngx_http_image_out(ngx_http_request_t *r, ngx_uint_t type, - gdImagePtr img, int *size); -static void ngx_http_image_cleanup(void *data); -static ngx_uint_t ngx_http_image_filter_get_value(ngx_http_request_t *r, - ngx_http_complex_value_t *cv, ngx_uint_t v); -static ngx_uint_t ngx_http_image_filter_value(ngx_str_t *value); - - -static void *ngx_http_image_filter_create_conf(ngx_conf_t *cf); -static char *ngx_http_image_filter_merge_conf(ngx_conf_t *cf, void *parent, - void *child); -static char *ngx_http_image_filter(ngx_conf_t *cf, ngx_command_t *cmd, - void *conf); -static char *ngx_http_image_filter_jpeg_quality(ngx_conf_t *cf, - ngx_command_t *cmd, void *conf); -static char *ngx_http_image_filter_webp_quality(ngx_conf_t *cf, - ngx_command_t *cmd, void *conf); -static char *ngx_http_image_filter_sharpen(ngx_conf_t *cf, ngx_command_t *cmd, - void *conf); -static ngx_int_t ngx_http_image_filter_init(ngx_conf_t *cf); - - -static ngx_command_t ngx_http_image_filter_commands[] = { - - { ngx_string("image_filter"), - NGX_HTTP_LOC_CONF|NGX_CONF_TAKE123, - ngx_http_image_filter, - NGX_HTTP_LOC_CONF_OFFSET, - 0, - NULL }, - - { ngx_string("image_filter_jpeg_quality"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1, - ngx_http_image_filter_jpeg_quality, - NGX_HTTP_LOC_CONF_OFFSET, - 0, - NULL }, - - { ngx_string("image_filter_webp_quality"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1, - ngx_http_image_filter_webp_quality, - NGX_HTTP_LOC_CONF_OFFSET, - 0, - NULL }, - - { ngx_string("image_filter_sharpen"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1, - ngx_http_image_filter_sharpen, - NGX_HTTP_LOC_CONF_OFFSET, - 0, - NULL }, - - { ngx_string("image_filter_transparency"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG, - ngx_conf_set_flag_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_image_filter_conf_t, transparency), - NULL }, - - { ngx_string("image_filter_interlace"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG, - ngx_conf_set_flag_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_image_filter_conf_t, interlace), - NULL }, - - { ngx_string("image_filter_buffer"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1, - ngx_conf_set_size_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_image_filter_conf_t, buffer_size), - NULL }, - - ngx_null_command -}; - - -static ngx_http_module_t ngx_http_image_filter_module_ctx = { - NULL, /* preconfiguration */ - ngx_http_image_filter_init, /* postconfiguration */ - - NULL, /* create main configuration */ - NULL, /* init main configuration */ - - NULL, /* create server configuration */ - NULL, /* merge server configuration */ - - ngx_http_image_filter_create_conf, /* create location configuration */ - ngx_http_image_filter_merge_conf /* merge location configuration */ -}; - - -ngx_module_t ngx_http_image_filter_module = { - NGX_MODULE_V1, - &ngx_http_image_filter_module_ctx, /* module context */ - ngx_http_image_filter_commands, /* module directives */ - NGX_HTTP_MODULE, /* module type */ - NULL, /* init master */ - NULL, /* init module */ - NULL, /* init process */ - NULL, /* init thread */ - NULL, /* exit thread */ - NULL, /* exit process */ - NULL, /* exit master */ - NGX_MODULE_V1_PADDING -}; - - -static ngx_http_output_header_filter_pt ngx_http_next_header_filter; -static ngx_http_output_body_filter_pt ngx_http_next_body_filter; - - -static ngx_str_t ngx_http_image_types[] = { - ngx_string("image/jpeg"), - ngx_string("image/gif"), - ngx_string("image/png"), - ngx_string("image/webp") -}; - - -static ngx_int_t -ngx_http_image_header_filter(ngx_http_request_t *r) -{ - off_t len; - ngx_http_image_filter_ctx_t *ctx; - ngx_http_image_filter_conf_t *conf; - - if (r->headers_out.status == NGX_HTTP_NOT_MODIFIED) { - return ngx_http_next_header_filter(r); - } - - ctx = ngx_http_get_module_ctx(r, ngx_http_image_filter_module); - - if (ctx) { - ngx_http_set_ctx(r, NULL, ngx_http_image_filter_module); - return ngx_http_next_header_filter(r); - } - - conf = ngx_http_get_module_loc_conf(r, ngx_http_image_filter_module); - - if (conf->filter == NGX_HTTP_IMAGE_OFF) { - return ngx_http_next_header_filter(r); - } - - if (r->headers_out.content_type.len - >= sizeof("multipart/x-mixed-replace") - 1 - && ngx_strncasecmp(r->headers_out.content_type.data, - (u_char *) "multipart/x-mixed-replace", - sizeof("multipart/x-mixed-replace") - 1) - == 0) - { - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "image filter: multipart/x-mixed-replace response"); - - return NGX_ERROR; - } - - ctx = ngx_pcalloc(r->pool, sizeof(ngx_http_image_filter_ctx_t)); - if (ctx == NULL) { - return NGX_ERROR; - } - - ngx_http_set_ctx(r, ctx, ngx_http_image_filter_module); - - len = r->headers_out.content_length_n; - - if (len != -1 && len > (off_t) conf->buffer_size) { - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "image filter: too big response: %O", len); - - return NGX_HTTP_UNSUPPORTED_MEDIA_TYPE; - } - - if (len == -1) { - ctx->length = conf->buffer_size; - - } else { - ctx->length = (size_t) len; - } - - if (r->headers_out.refresh) { - r->headers_out.refresh->hash = 0; - } - - r->main_filter_need_in_memory = 1; - r->allow_ranges = 0; - - return NGX_OK; -} - - -static ngx_int_t -ngx_http_image_body_filter(ngx_http_request_t *r, ngx_chain_t *in) -{ - ngx_int_t rc; - ngx_str_t *ct; - ngx_chain_t out; - ngx_http_image_filter_ctx_t *ctx; - ngx_http_image_filter_conf_t *conf; - - ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, "image filter"); - - if (in == NULL) { - return ngx_http_next_body_filter(r, in); - } - - ctx = ngx_http_get_module_ctx(r, ngx_http_image_filter_module); - - if (ctx == NULL) { - return ngx_http_next_body_filter(r, in); - } - - switch (ctx->phase) { - - case NGX_HTTP_IMAGE_START: - - ctx->type = ngx_http_image_test(r, in); - - conf = ngx_http_get_module_loc_conf(r, ngx_http_image_filter_module); - - if (ctx->type == NGX_HTTP_IMAGE_NONE) { - - if (conf->filter == NGX_HTTP_IMAGE_SIZE) { - out.buf = ngx_http_image_json(r, NULL); - - if (out.buf) { - out.next = NULL; - ctx->phase = NGX_HTTP_IMAGE_DONE; - - return ngx_http_image_send(r, ctx, &out); - } - } - - return ngx_http_filter_finalize_request(r, - &ngx_http_image_filter_module, - NGX_HTTP_UNSUPPORTED_MEDIA_TYPE); - } - - /* override content type */ - - ct = &ngx_http_image_types[ctx->type - 1]; - r->headers_out.content_type_len = ct->len; - r->headers_out.content_type = *ct; - r->headers_out.content_type_lowcase = NULL; - - if (conf->filter == NGX_HTTP_IMAGE_TEST) { - ctx->phase = NGX_HTTP_IMAGE_PASS; - - return ngx_http_image_send(r, ctx, in); - } - - ctx->phase = NGX_HTTP_IMAGE_READ; - - /* fall through */ - - case NGX_HTTP_IMAGE_READ: - - rc = ngx_http_image_read(r, in); - - if (rc == NGX_AGAIN) { - return NGX_OK; - } - - if (rc == NGX_ERROR) { - return ngx_http_filter_finalize_request(r, - &ngx_http_image_filter_module, - NGX_HTTP_UNSUPPORTED_MEDIA_TYPE); - } - - /* fall through */ - - case NGX_HTTP_IMAGE_PROCESS: - - out.buf = ngx_http_image_process(r); - - if (out.buf == NULL) { - return ngx_http_filter_finalize_request(r, - &ngx_http_image_filter_module, - NGX_HTTP_UNSUPPORTED_MEDIA_TYPE); - } - - out.next = NULL; - ctx->phase = NGX_HTTP_IMAGE_PASS; - - return ngx_http_image_send(r, ctx, &out); - - case NGX_HTTP_IMAGE_PASS: - - return ngx_http_next_body_filter(r, in); - - default: /* NGX_HTTP_IMAGE_DONE */ - - rc = ngx_http_next_body_filter(r, NULL); - - /* NGX_ERROR resets any pending data */ - return (rc == NGX_OK) ? NGX_ERROR : rc; - } -} - - -static ngx_int_t -ngx_http_image_send(ngx_http_request_t *r, ngx_http_image_filter_ctx_t *ctx, - ngx_chain_t *in) -{ - ngx_int_t rc; - - rc = ngx_http_next_header_filter(r); - - if (rc == NGX_ERROR || rc > NGX_OK || r->header_only) { - return NGX_ERROR; - } - - rc = ngx_http_next_body_filter(r, in); - - if (ctx->phase == NGX_HTTP_IMAGE_DONE) { - /* NGX_ERROR resets any pending data */ - return (rc == NGX_OK) ? NGX_ERROR : rc; - } - - return rc; -} - - -static ngx_uint_t -ngx_http_image_test(ngx_http_request_t *r, ngx_chain_t *in) -{ - u_char *p; - - p = in->buf->pos; - - if (in->buf->last - p < 16) { - return NGX_HTTP_IMAGE_NONE; - } - - ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "image filter: \"%c%c\"", p[0], p[1]); - - if (p[0] == 0xff && p[1] == 0xd8) { - - /* JPEG */ - - return NGX_HTTP_IMAGE_JPEG; - - } else if (p[0] == 'G' && p[1] == 'I' && p[2] == 'F' && p[3] == '8' - && p[5] == 'a') - { - if (p[4] == '9' || p[4] == '7') { - /* GIF */ - return NGX_HTTP_IMAGE_GIF; - } - - } else if (p[0] == 0x89 && p[1] == 'P' && p[2] == 'N' && p[3] == 'G' - && p[4] == 0x0d && p[5] == 0x0a && p[6] == 0x1a && p[7] == 0x0a) - { - /* PNG */ - - return NGX_HTTP_IMAGE_PNG; - - } else if (p[0] == 'R' && p[1] == 'I' && p[2] == 'F' && p[3] == 'F' - && p[8] == 'W' && p[9] == 'E' && p[10] == 'B' && p[11] == 'P') - { - /* WebP */ - - return NGX_HTTP_IMAGE_WEBP; - } - - return NGX_HTTP_IMAGE_NONE; -} - - -static ngx_int_t -ngx_http_image_read(ngx_http_request_t *r, ngx_chain_t *in) -{ - u_char *p; - size_t size, rest; - ngx_buf_t *b; - ngx_chain_t *cl; - ngx_http_image_filter_ctx_t *ctx; - - ctx = ngx_http_get_module_ctx(r, ngx_http_image_filter_module); - - if (ctx->image == NULL) { - ctx->image = ngx_palloc(r->pool, ctx->length); - if (ctx->image == NULL) { - return NGX_ERROR; - } - - ctx->last = ctx->image; - } - - p = ctx->last; - - for (cl = in; cl; cl = cl->next) { - - b = cl->buf; - size = b->last - b->pos; - - ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "image buf: %uz", size); - - rest = ctx->image + ctx->length - p; - - if (size > rest) { - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "image filter: too big response"); - return NGX_ERROR; - } - - p = ngx_cpymem(p, b->pos, size); - b->pos += size; - - if (b->last_buf) { - ctx->last = p; - return NGX_OK; - } - } - - ctx->last = p; - r->connection->buffered |= NGX_HTTP_IMAGE_BUFFERED; - - return NGX_AGAIN; -} - - -static ngx_buf_t * -ngx_http_image_process(ngx_http_request_t *r) -{ - ngx_int_t rc; - ngx_http_image_filter_ctx_t *ctx; - ngx_http_image_filter_conf_t *conf; - - r->connection->buffered &= ~NGX_HTTP_IMAGE_BUFFERED; - - ctx = ngx_http_get_module_ctx(r, ngx_http_image_filter_module); - - rc = ngx_http_image_size(r, ctx); - - conf = ngx_http_get_module_loc_conf(r, ngx_http_image_filter_module); - - if (conf->filter == NGX_HTTP_IMAGE_SIZE) { - return ngx_http_image_json(r, rc == NGX_OK ? ctx : NULL); - } - - ctx->angle = ngx_http_image_filter_get_value(r, conf->acv, conf->angle); - - if (conf->filter == NGX_HTTP_IMAGE_ROTATE) { - - if (ctx->angle != 90 && ctx->angle != 180 && ctx->angle != 270) { - return NULL; - } - - return ngx_http_image_resize(r, ctx); - } - - ctx->max_width = ngx_http_image_filter_get_value(r, conf->wcv, conf->width); - if (ctx->max_width == 0) { - return NULL; - } - - ctx->max_height = ngx_http_image_filter_get_value(r, conf->hcv, - conf->height); - if (ctx->max_height == 0) { - return NULL; - } - - if (rc == NGX_OK - && ctx->width <= ctx->max_width - && ctx->height <= ctx->max_height - && ctx->angle == 0 - && !ctx->force) - { - return ngx_http_image_asis(r, ctx); - } - - return ngx_http_image_resize(r, ctx); -} - - -static ngx_buf_t * -ngx_http_image_json(ngx_http_request_t *r, ngx_http_image_filter_ctx_t *ctx) -{ - size_t len; - ngx_buf_t *b; - - b = ngx_calloc_buf(r->pool); - if (b == NULL) { - return NULL; - } - - b->memory = 1; - b->last_buf = 1; - - ngx_http_clean_header(r); - - r->headers_out.status = NGX_HTTP_OK; - r->headers_out.content_type_len = sizeof("application/json") - 1; - ngx_str_set(&r->headers_out.content_type, "application/json"); - r->headers_out.content_type_lowcase = NULL; - - if (ctx == NULL) { - b->pos = (u_char *) "{}" CRLF; - b->last = b->pos + sizeof("{}" CRLF) - 1; - - ngx_http_image_length(r, b); - - return b; - } - - len = sizeof("{ \"img\" : " - "{ \"width\": , \"height\": , \"type\": \"jpeg\" } }" CRLF) - 1 - + 2 * NGX_SIZE_T_LEN; - - b->pos = ngx_pnalloc(r->pool, len); - if (b->pos == NULL) { - return NULL; - } - - b->last = ngx_sprintf(b->pos, - "{ \"img\" : " - "{ \"width\": %uz," - " \"height\": %uz," - " \"type\": \"%s\" } }" CRLF, - ctx->width, ctx->height, - ngx_http_image_types[ctx->type - 1].data + 6); - - ngx_http_image_length(r, b); - - return b; -} - - -static ngx_buf_t * -ngx_http_image_asis(ngx_http_request_t *r, ngx_http_image_filter_ctx_t *ctx) -{ - ngx_buf_t *b; - - b = ngx_calloc_buf(r->pool); - if (b == NULL) { - return NULL; - } - - b->pos = ctx->image; - b->last = ctx->last; - b->memory = 1; - b->last_buf = 1; - - ngx_http_image_length(r, b); - - return b; -} - - -static void -ngx_http_image_length(ngx_http_request_t *r, ngx_buf_t *b) -{ - r->headers_out.content_length_n = b->last - b->pos; - - if (r->headers_out.content_length) { - r->headers_out.content_length->hash = 0; - } - - r->headers_out.content_length = NULL; -} - - -static ngx_int_t -ngx_http_image_size(ngx_http_request_t *r, ngx_http_image_filter_ctx_t *ctx) -{ - u_char *p, *last; - size_t len, app; - ngx_uint_t width, height; - - p = ctx->image; - - switch (ctx->type) { - - case NGX_HTTP_IMAGE_JPEG: - - p += 2; - last = ctx->image + ctx->length - 10; - width = 0; - height = 0; - app = 0; - - while (p < last) { - - if (p[0] == 0xff && p[1] != 0xff) { - - ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "JPEG: %02xd %02xd", p[0], p[1]); - - p++; - - if ((*p == 0xc0 || *p == 0xc1 || *p == 0xc2 || *p == 0xc3 - || *p == 0xc9 || *p == 0xca || *p == 0xcb) - && (width == 0 || height == 0)) - { - width = p[6] * 256 + p[7]; - height = p[4] * 256 + p[5]; - } - - ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "JPEG: %02xd %02xd", p[1], p[2]); - - len = p[1] * 256 + p[2]; - - if (*p >= 0xe1 && *p <= 0xef) { - /* application data, e.g., EXIF, Adobe XMP, etc. */ - app += len; - } - - p += len; - - continue; - } - - p++; - } - - if (width == 0 || height == 0) { - return NGX_DECLINED; - } - - if (ctx->length / 20 < app) { - /* force conversion if application data consume more than 5% */ - ctx->force = 1; - ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "app data size: %uz", app); - } - - break; - - case NGX_HTTP_IMAGE_GIF: - - if (ctx->length < 10) { - return NGX_DECLINED; - } - - width = p[7] * 256 + p[6]; - height = p[9] * 256 + p[8]; - - break; - - case NGX_HTTP_IMAGE_PNG: - - if (ctx->length < 24) { - return NGX_DECLINED; - } - - width = p[18] * 256 + p[19]; - height = p[22] * 256 + p[23]; - - break; - - case NGX_HTTP_IMAGE_WEBP: - - if (ctx->length < 30) { - return NGX_DECLINED; - } - - if (p[12] != 'V' || p[13] != 'P' || p[14] != '8') { - return NGX_DECLINED; - } - - switch (p[15]) { - - case ' ': - if (p[20] & 1) { - /* not a key frame */ - return NGX_DECLINED; - } - - if (p[23] != 0x9d || p[24] != 0x01 || p[25] != 0x2a) { - /* invalid start code */ - return NGX_DECLINED; - } - - width = (p[26] | p[27] << 8) & 0x3fff; - height = (p[28] | p[29] << 8) & 0x3fff; - - break; - - case 'L': - if (p[20] != 0x2f) { - /* invalid signature */ - return NGX_DECLINED; - } - - width = ((p[21] | p[22] << 8) & 0x3fff) + 1; - height = ((p[22] >> 6 | p[23] << 2 | p[24] << 10) & 0x3fff) + 1; - - break; - - case 'X': - width = (p[24] | p[25] << 8 | p[26] << 16) + 1; - height = (p[27] | p[28] << 8 | p[29] << 16) + 1; - break; - - default: - return NGX_DECLINED; - } - - break; - - default: - - return NGX_DECLINED; - } - - ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "image size: %d x %d", (int) width, (int) height); - - ctx->width = width; - ctx->height = height; - - return NGX_OK; -} - - -static ngx_buf_t * -ngx_http_image_resize(ngx_http_request_t *r, ngx_http_image_filter_ctx_t *ctx) -{ - int sx, sy, dx, dy, ox, oy, ax, ay, size, - colors, palette, transparent, sharpen, - red, green, blue, t; - u_char *out; - ngx_buf_t *b; - ngx_uint_t resize; - gdImagePtr src, dst; - ngx_pool_cleanup_t *cln; - ngx_http_image_filter_conf_t *conf; - - src = ngx_http_image_source(r, ctx); - - if (src == NULL) { - return NULL; - } - - sx = gdImageSX(src); - sy = gdImageSY(src); - - conf = ngx_http_get_module_loc_conf(r, ngx_http_image_filter_module); - - if (!ctx->force - && ctx->angle == 0 - && (ngx_uint_t) sx <= ctx->max_width - && (ngx_uint_t) sy <= ctx->max_height) - { - gdImageDestroy(src); - return ngx_http_image_asis(r, ctx); - } - - colors = gdImageColorsTotal(src); - - if (colors && conf->transparency) { - transparent = gdImageGetTransparent(src); - - if (transparent != -1) { - palette = colors; - red = gdImageRed(src, transparent); - green = gdImageGreen(src, transparent); - blue = gdImageBlue(src, transparent); - - goto transparent; - } - } - - palette = 0; - transparent = -1; - red = 0; - green = 0; - blue = 0; - -transparent: - - gdImageColorTransparent(src, -1); - - dx = sx; - dy = sy; - - if (conf->filter == NGX_HTTP_IMAGE_RESIZE) { - - if ((ngx_uint_t) dx > ctx->max_width) { - dy = dy * ctx->max_width / dx; - dy = dy ? dy : 1; - dx = ctx->max_width; - } - - if ((ngx_uint_t) dy > ctx->max_height) { - dx = dx * ctx->max_height / dy; - dx = dx ? dx : 1; - dy = ctx->max_height; - } - - resize = 1; - - } else if (conf->filter == NGX_HTTP_IMAGE_ROTATE) { - - resize = 0; - - } else { /* NGX_HTTP_IMAGE_CROP */ - - resize = 0; - - if ((double) dx / dy < (double) ctx->max_width / ctx->max_height) { - if ((ngx_uint_t) dx > ctx->max_width) { - dy = dy * ctx->max_width / dx; - dy = dy ? dy : 1; - dx = ctx->max_width; - resize = 1; - } - - } else { - if ((ngx_uint_t) dy > ctx->max_height) { - dx = dx * ctx->max_height / dy; - dx = dx ? dx : 1; - dy = ctx->max_height; - resize = 1; - } - } - } - - if (resize) { - dst = ngx_http_image_new(r, dx, dy, palette); - if (dst == NULL) { - gdImageDestroy(src); - return NULL; - } - - if (colors == 0) { - gdImageSaveAlpha(dst, 1); - gdImageAlphaBlending(dst, 0); - } - - gdImageCopyResampled(dst, src, 0, 0, 0, 0, dx, dy, sx, sy); - - if (colors) { - gdImageTrueColorToPalette(dst, 1, 256); - } - - gdImageDestroy(src); - - } else { - dst = src; - } - - if (ctx->angle) { - src = dst; - - ax = (dx % 2 == 0) ? 1 : 0; - ay = (dy % 2 == 0) ? 1 : 0; - - switch (ctx->angle) { - - case 90: - case 270: - dst = ngx_http_image_new(r, dy, dx, palette); - if (dst == NULL) { - gdImageDestroy(src); - return NULL; - } - if (ctx->angle == 90) { - ox = dy / 2 + ay; - oy = dx / 2 - ax; - - } else { - ox = dy / 2 - ay; - oy = dx / 2 + ax; - } - - gdImageCopyRotated(dst, src, ox, oy, 0, 0, - dx + ax, dy + ay, ctx->angle); - gdImageDestroy(src); - - t = dx; - dx = dy; - dy = t; - break; - - case 180: - dst = ngx_http_image_new(r, dx, dy, palette); - if (dst == NULL) { - gdImageDestroy(src); - return NULL; - } - gdImageCopyRotated(dst, src, dx / 2 - ax, dy / 2 - ay, 0, 0, - dx + ax, dy + ay, ctx->angle); - gdImageDestroy(src); - break; - } - } - - if (conf->filter == NGX_HTTP_IMAGE_CROP) { - - src = dst; - - if ((ngx_uint_t) dx > ctx->max_width) { - ox = dx - ctx->max_width; - - } else { - ox = 0; - } - - if ((ngx_uint_t) dy > ctx->max_height) { - oy = dy - ctx->max_height; - - } else { - oy = 0; - } - - if (ox || oy) { - - dst = ngx_http_image_new(r, dx - ox, dy - oy, colors); - - if (dst == NULL) { - gdImageDestroy(src); - return NULL; - } - - ox /= 2; - oy /= 2; - - ngx_log_debug4(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "image crop: %d x %d @ %d x %d", - dx, dy, ox, oy); - - if (colors == 0) { - gdImageSaveAlpha(dst, 1); - gdImageAlphaBlending(dst, 0); - } - - gdImageCopy(dst, src, 0, 0, ox, oy, dx - ox, dy - oy); - - if (colors) { - gdImageTrueColorToPalette(dst, 1, 256); - } - - gdImageDestroy(src); - } - } - - if (transparent != -1 && colors) { - gdImageColorTransparent(dst, gdImageColorExact(dst, red, green, blue)); - } - - sharpen = ngx_http_image_filter_get_value(r, conf->shcv, conf->sharpen); - if (sharpen > 0) { - gdImageSharpen(dst, sharpen); - } - - gdImageInterlace(dst, (int) conf->interlace); - - out = ngx_http_image_out(r, ctx->type, dst, &size); - - ngx_log_debug3(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "image: %d x %d %d", sx, sy, colors); - - gdImageDestroy(dst); - ngx_pfree(r->pool, ctx->image); - - if (out == NULL) { - return NULL; - } - - cln = ngx_pool_cleanup_add(r->pool, 0); - if (cln == NULL) { - gdFree(out); - return NULL; - } - - b = ngx_calloc_buf(r->pool); - if (b == NULL) { - gdFree(out); - return NULL; - } - - cln->handler = ngx_http_image_cleanup; - cln->data = out; - - b->pos = out; - b->last = out + size; - b->memory = 1; - b->last_buf = 1; - - ngx_http_image_length(r, b); - ngx_http_weak_etag(r); - - return b; -} - - -static gdImagePtr -ngx_http_image_source(ngx_http_request_t *r, ngx_http_image_filter_ctx_t *ctx) -{ - char *failed; - gdImagePtr img; - - img = NULL; - - switch (ctx->type) { - - case NGX_HTTP_IMAGE_JPEG: - img = gdImageCreateFromJpegPtr(ctx->length, ctx->image); - failed = "gdImageCreateFromJpegPtr() failed"; - break; - - case NGX_HTTP_IMAGE_GIF: - img = gdImageCreateFromGifPtr(ctx->length, ctx->image); - failed = "gdImageCreateFromGifPtr() failed"; - break; - - case NGX_HTTP_IMAGE_PNG: - img = gdImageCreateFromPngPtr(ctx->length, ctx->image); - failed = "gdImageCreateFromPngPtr() failed"; - break; - - case NGX_HTTP_IMAGE_WEBP: -#if (NGX_HAVE_GD_WEBP) - img = gdImageCreateFromWebpPtr(ctx->length, ctx->image); - failed = "gdImageCreateFromWebpPtr() failed"; -#else - failed = "nginx was built without GD WebP support"; -#endif - break; - - default: - failed = "unknown image type"; - break; - } - - if (img == NULL) { - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, failed); - } - - return img; -} - - -static gdImagePtr -ngx_http_image_new(ngx_http_request_t *r, int w, int h, int colors) -{ - gdImagePtr img; - - if (colors == 0) { - img = gdImageCreateTrueColor(w, h); - - if (img == NULL) { - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "gdImageCreateTrueColor() failed"); - return NULL; - } - - } else { - img = gdImageCreate(w, h); - - if (img == NULL) { - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "gdImageCreate() failed"); - return NULL; - } - } - - return img; -} - - -static u_char * -ngx_http_image_out(ngx_http_request_t *r, ngx_uint_t type, gdImagePtr img, - int *size) -{ - char *failed; - u_char *out; - ngx_int_t q; - ngx_http_image_filter_conf_t *conf; - - out = NULL; - - switch (type) { - - case NGX_HTTP_IMAGE_JPEG: - conf = ngx_http_get_module_loc_conf(r, ngx_http_image_filter_module); - - q = ngx_http_image_filter_get_value(r, conf->jqcv, conf->jpeg_quality); - if (q <= 0) { - return NULL; - } - - out = gdImageJpegPtr(img, size, q); - failed = "gdImageJpegPtr() failed"; - break; - - case NGX_HTTP_IMAGE_GIF: - out = gdImageGifPtr(img, size); - failed = "gdImageGifPtr() failed"; - break; - - case NGX_HTTP_IMAGE_PNG: - out = gdImagePngPtr(img, size); - failed = "gdImagePngPtr() failed"; - break; - - case NGX_HTTP_IMAGE_WEBP: -#if (NGX_HAVE_GD_WEBP) - conf = ngx_http_get_module_loc_conf(r, ngx_http_image_filter_module); - - q = ngx_http_image_filter_get_value(r, conf->wqcv, conf->webp_quality); - if (q <= 0) { - return NULL; - } - - out = gdImageWebpPtrEx(img, size, q); - failed = "gdImageWebpPtrEx() failed"; -#else - failed = "nginx was built without GD WebP support"; -#endif - break; - - default: - failed = "unknown image type"; - break; - } - - if (out == NULL) { - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, failed); - } - - return out; -} - - -static void -ngx_http_image_cleanup(void *data) -{ - gdFree(data); -} - - -static ngx_uint_t -ngx_http_image_filter_get_value(ngx_http_request_t *r, - ngx_http_complex_value_t *cv, ngx_uint_t v) -{ - ngx_str_t val; - - if (cv == NULL) { - return v; - } - - if (ngx_http_complex_value(r, cv, &val) != NGX_OK) { - return 0; - } - - return ngx_http_image_filter_value(&val); -} - - -static ngx_uint_t -ngx_http_image_filter_value(ngx_str_t *value) -{ - ngx_int_t n; - - if (value->len == 1 && value->data[0] == '-') { - return (ngx_uint_t) -1; - } - - n = ngx_atoi(value->data, value->len); - - if (n > 0) { - return (ngx_uint_t) n; - } - - return 0; -} - - -static void * -ngx_http_image_filter_create_conf(ngx_conf_t *cf) -{ - ngx_http_image_filter_conf_t *conf; - - conf = ngx_pcalloc(cf->pool, sizeof(ngx_http_image_filter_conf_t)); - if (conf == NULL) { - return NULL; - } - - /* - * set by ngx_pcalloc(): - * - * conf->width = 0; - * conf->height = 0; - * conf->angle = 0; - * conf->wcv = NULL; - * conf->hcv = NULL; - * conf->acv = NULL; - * conf->jqcv = NULL; - * conf->wqcv = NULL; - * conf->shcv = NULL; - */ - - conf->filter = NGX_CONF_UNSET_UINT; - conf->jpeg_quality = NGX_CONF_UNSET_UINT; - conf->webp_quality = NGX_CONF_UNSET_UINT; - conf->sharpen = NGX_CONF_UNSET_UINT; - conf->transparency = NGX_CONF_UNSET; - conf->interlace = NGX_CONF_UNSET; - conf->buffer_size = NGX_CONF_UNSET_SIZE; - - return conf; -} - - -static char * -ngx_http_image_filter_merge_conf(ngx_conf_t *cf, void *parent, void *child) -{ - ngx_http_image_filter_conf_t *prev = parent; - ngx_http_image_filter_conf_t *conf = child; - - if (conf->filter == NGX_CONF_UNSET_UINT) { - - if (prev->filter == NGX_CONF_UNSET_UINT) { - conf->filter = NGX_HTTP_IMAGE_OFF; - - } else { - conf->filter = prev->filter; - conf->width = prev->width; - conf->height = prev->height; - conf->angle = prev->angle; - conf->wcv = prev->wcv; - conf->hcv = prev->hcv; - conf->acv = prev->acv; - } - } - - if (conf->jpeg_quality == NGX_CONF_UNSET_UINT) { - - /* 75 is libjpeg default quality */ - ngx_conf_merge_uint_value(conf->jpeg_quality, prev->jpeg_quality, 75); - - if (conf->jqcv == NULL) { - conf->jqcv = prev->jqcv; - } - } - - if (conf->webp_quality == NGX_CONF_UNSET_UINT) { - - /* 80 is libwebp default quality */ - ngx_conf_merge_uint_value(conf->webp_quality, prev->webp_quality, 80); - - if (conf->wqcv == NULL) { - conf->wqcv = prev->wqcv; - } - } - - if (conf->sharpen == NGX_CONF_UNSET_UINT) { - ngx_conf_merge_uint_value(conf->sharpen, prev->sharpen, 0); - - if (conf->shcv == NULL) { - conf->shcv = prev->shcv; - } - } - - ngx_conf_merge_value(conf->transparency, prev->transparency, 1); - - ngx_conf_merge_value(conf->interlace, prev->interlace, 0); - - ngx_conf_merge_size_value(conf->buffer_size, prev->buffer_size, - 1 * 1024 * 1024); - - return NGX_CONF_OK; -} - - -static char * -ngx_http_image_filter(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) -{ - ngx_http_image_filter_conf_t *imcf = conf; - - ngx_str_t *value; - ngx_int_t n; - ngx_uint_t i; - ngx_http_complex_value_t cv; - ngx_http_compile_complex_value_t ccv; - - value = cf->args->elts; - - i = 1; - - if (cf->args->nelts == 2) { - if (ngx_strcmp(value[i].data, "off") == 0) { - imcf->filter = NGX_HTTP_IMAGE_OFF; - - } else if (ngx_strcmp(value[i].data, "test") == 0) { - imcf->filter = NGX_HTTP_IMAGE_TEST; - - } else if (ngx_strcmp(value[i].data, "size") == 0) { - imcf->filter = NGX_HTTP_IMAGE_SIZE; - - } else { - goto failed; - } - - return NGX_CONF_OK; - - } else if (cf->args->nelts == 3) { - - if (ngx_strcmp(value[i].data, "rotate") == 0) { - if (imcf->filter != NGX_HTTP_IMAGE_RESIZE - && imcf->filter != NGX_HTTP_IMAGE_CROP) - { - imcf->filter = NGX_HTTP_IMAGE_ROTATE; - } - - ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t)); - - ccv.cf = cf; - ccv.value = &value[++i]; - ccv.complex_value = &cv; - - if (ngx_http_compile_complex_value(&ccv) != NGX_OK) { - return NGX_CONF_ERROR; - } - - if (cv.lengths == NULL) { - n = ngx_http_image_filter_value(&value[i]); - - if (n != 90 && n != 180 && n != 270) { - goto failed; - } - - imcf->angle = (ngx_uint_t) n; - - } else { - imcf->acv = ngx_palloc(cf->pool, - sizeof(ngx_http_complex_value_t)); - if (imcf->acv == NULL) { - return NGX_CONF_ERROR; - } - - *imcf->acv = cv; - } - - return NGX_CONF_OK; - - } else { - goto failed; - } - } - - if (ngx_strcmp(value[i].data, "resize") == 0) { - imcf->filter = NGX_HTTP_IMAGE_RESIZE; - - } else if (ngx_strcmp(value[i].data, "crop") == 0) { - imcf->filter = NGX_HTTP_IMAGE_CROP; - - } else { - goto failed; - } - - ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t)); - - ccv.cf = cf; - ccv.value = &value[++i]; - ccv.complex_value = &cv; - - if (ngx_http_compile_complex_value(&ccv) != NGX_OK) { - return NGX_CONF_ERROR; - } - - if (cv.lengths == NULL) { - n = ngx_http_image_filter_value(&value[i]); - - if (n == 0) { - goto failed; - } - - imcf->width = (ngx_uint_t) n; - - } else { - imcf->wcv = ngx_palloc(cf->pool, sizeof(ngx_http_complex_value_t)); - if (imcf->wcv == NULL) { - return NGX_CONF_ERROR; - } - - *imcf->wcv = cv; - } - - ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t)); - - ccv.cf = cf; - ccv.value = &value[++i]; - ccv.complex_value = &cv; - - if (ngx_http_compile_complex_value(&ccv) != NGX_OK) { - return NGX_CONF_ERROR; - } - - if (cv.lengths == NULL) { - n = ngx_http_image_filter_value(&value[i]); - - if (n == 0) { - goto failed; - } - - imcf->height = (ngx_uint_t) n; - - } else { - imcf->hcv = ngx_palloc(cf->pool, sizeof(ngx_http_complex_value_t)); - if (imcf->hcv == NULL) { - return NGX_CONF_ERROR; - } - - *imcf->hcv = cv; - } - - return NGX_CONF_OK; - -failed: - - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, "invalid parameter \"%V\"", - &value[i]); - - return NGX_CONF_ERROR; -} - - -static char * -ngx_http_image_filter_jpeg_quality(ngx_conf_t *cf, ngx_command_t *cmd, - void *conf) -{ - ngx_http_image_filter_conf_t *imcf = conf; - - ngx_str_t *value; - ngx_int_t n; - ngx_http_complex_value_t cv; - ngx_http_compile_complex_value_t ccv; - - value = cf->args->elts; - - ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t)); - - ccv.cf = cf; - ccv.value = &value[1]; - ccv.complex_value = &cv; - - if (ngx_http_compile_complex_value(&ccv) != NGX_OK) { - return NGX_CONF_ERROR; - } - - if (cv.lengths == NULL) { - n = ngx_http_image_filter_value(&value[1]); - - if (n <= 0) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "invalid value \"%V\"", &value[1]); - return NGX_CONF_ERROR; - } - - imcf->jpeg_quality = (ngx_uint_t) n; - - } else { - imcf->jqcv = ngx_palloc(cf->pool, sizeof(ngx_http_complex_value_t)); - if (imcf->jqcv == NULL) { - return NGX_CONF_ERROR; - } - - *imcf->jqcv = cv; - } - - return NGX_CONF_OK; -} - - -static char * -ngx_http_image_filter_webp_quality(ngx_conf_t *cf, ngx_command_t *cmd, - void *conf) -{ - ngx_http_image_filter_conf_t *imcf = conf; - - ngx_str_t *value; - ngx_int_t n; - ngx_http_complex_value_t cv; - ngx_http_compile_complex_value_t ccv; - - value = cf->args->elts; - - ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t)); - - ccv.cf = cf; - ccv.value = &value[1]; - ccv.complex_value = &cv; - - if (ngx_http_compile_complex_value(&ccv) != NGX_OK) { - return NGX_CONF_ERROR; - } - - if (cv.lengths == NULL) { - n = ngx_http_image_filter_value(&value[1]); - - if (n <= 0) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "invalid value \"%V\"", &value[1]); - return NGX_CONF_ERROR; - } - - imcf->webp_quality = (ngx_uint_t) n; - - } else { - imcf->wqcv = ngx_palloc(cf->pool, sizeof(ngx_http_complex_value_t)); - if (imcf->wqcv == NULL) { - return NGX_CONF_ERROR; - } - - *imcf->wqcv = cv; - } - - return NGX_CONF_OK; -} - - -static char * -ngx_http_image_filter_sharpen(ngx_conf_t *cf, ngx_command_t *cmd, - void *conf) -{ - ngx_http_image_filter_conf_t *imcf = conf; - - ngx_str_t *value; - ngx_int_t n; - ngx_http_complex_value_t cv; - ngx_http_compile_complex_value_t ccv; - - value = cf->args->elts; - - ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t)); - - ccv.cf = cf; - ccv.value = &value[1]; - ccv.complex_value = &cv; - - if (ngx_http_compile_complex_value(&ccv) != NGX_OK) { - return NGX_CONF_ERROR; - } - - if (cv.lengths == NULL) { - n = ngx_http_image_filter_value(&value[1]); - - if (n < 0) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "invalid value \"%V\"", &value[1]); - return NGX_CONF_ERROR; - } - - imcf->sharpen = (ngx_uint_t) n; - - } else { - imcf->shcv = ngx_palloc(cf->pool, sizeof(ngx_http_complex_value_t)); - if (imcf->shcv == NULL) { - return NGX_CONF_ERROR; - } - - *imcf->shcv = cv; - } - - return NGX_CONF_OK; -} - - -static ngx_int_t -ngx_http_image_filter_init(ngx_conf_t *cf) -{ - ngx_http_next_header_filter = ngx_http_top_header_filter; - ngx_http_top_header_filter = ngx_http_image_header_filter; - - ngx_http_next_body_filter = ngx_http_top_body_filter; - ngx_http_top_body_filter = ngx_http_image_body_filter; - - return NGX_OK; -} diff --git a/src/deps/src/nginx-1.30.3/src/http/modules/ngx_http_index_module.c b/src/deps/src/nginx-1.30.3/src/http/modules/ngx_http_index_module.c deleted file mode 100644 index 18e7049c51..0000000000 --- a/src/deps/src/nginx-1.30.3/src/http/modules/ngx_http_index_module.c +++ /dev/null @@ -1,540 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#include -#include -#include - - -typedef struct { - ngx_str_t name; - ngx_array_t *lengths; - ngx_array_t *values; -} ngx_http_index_t; - - -typedef struct { - ngx_array_t *indices; /* array of ngx_http_index_t */ - size_t max_index_len; -} ngx_http_index_loc_conf_t; - - -#define NGX_HTTP_DEFAULT_INDEX "index.html" - - -static ngx_int_t ngx_http_index_test_dir(ngx_http_request_t *r, - ngx_http_core_loc_conf_t *clcf, u_char *path, u_char *last); -static ngx_int_t ngx_http_index_error(ngx_http_request_t *r, - ngx_http_core_loc_conf_t *clcf, u_char *file, ngx_err_t err); - -static ngx_int_t ngx_http_index_init(ngx_conf_t *cf); -static void *ngx_http_index_create_loc_conf(ngx_conf_t *cf); -static char *ngx_http_index_merge_loc_conf(ngx_conf_t *cf, - void *parent, void *child); -static char *ngx_http_index_set_index(ngx_conf_t *cf, ngx_command_t *cmd, - void *conf); - - -static ngx_command_t ngx_http_index_commands[] = { - - { ngx_string("index"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE, - ngx_http_index_set_index, - NGX_HTTP_LOC_CONF_OFFSET, - 0, - NULL }, - - ngx_null_command -}; - - -static ngx_http_module_t ngx_http_index_module_ctx = { - NULL, /* preconfiguration */ - ngx_http_index_init, /* postconfiguration */ - - NULL, /* create main configuration */ - NULL, /* init main configuration */ - - NULL, /* create server configuration */ - NULL, /* merge server configuration */ - - ngx_http_index_create_loc_conf, /* create location configuration */ - ngx_http_index_merge_loc_conf /* merge location configuration */ -}; - - -ngx_module_t ngx_http_index_module = { - NGX_MODULE_V1, - &ngx_http_index_module_ctx, /* module context */ - ngx_http_index_commands, /* module directives */ - NGX_HTTP_MODULE, /* module type */ - NULL, /* init master */ - NULL, /* init module */ - NULL, /* init process */ - NULL, /* init thread */ - NULL, /* exit thread */ - NULL, /* exit process */ - NULL, /* exit master */ - NGX_MODULE_V1_PADDING -}; - - -/* - * Try to open/test the first index file before the test of directory - * existence because valid requests should prevail over invalid ones. - * If open()/stat() of a file will fail then stat() of a directory - * should be faster because kernel may have already cached some data. - * Besides, Win32 may return ERROR_PATH_NOT_FOUND (NGX_ENOTDIR) at once. - * Unix has ENOTDIR error; however, it's less helpful than Win32's one: - * it only indicates that path points to a regular file, not a directory. - */ - -static ngx_int_t -ngx_http_index_handler(ngx_http_request_t *r) -{ - u_char *p, *name; - size_t len, root, reserve, allocated; - ngx_int_t rc; - ngx_str_t path, uri; - ngx_uint_t i, dir_tested; - ngx_http_index_t *index; - ngx_open_file_info_t of; - ngx_http_script_code_pt code; - ngx_http_script_engine_t e; - ngx_http_core_loc_conf_t *clcf; - ngx_http_index_loc_conf_t *ilcf; - ngx_http_script_len_code_pt lcode; - - if (r->uri.data[r->uri.len - 1] != '/') { - return NGX_DECLINED; - } - - if (!(r->method & (NGX_HTTP_GET|NGX_HTTP_HEAD|NGX_HTTP_POST))) { - return NGX_DECLINED; - } - - ilcf = ngx_http_get_module_loc_conf(r, ngx_http_index_module); - clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module); - - allocated = 0; - root = 0; - dir_tested = 0; - name = NULL; - /* suppress MSVC warning */ - path.data = NULL; - - index = ilcf->indices->elts; - for (i = 0; i < ilcf->indices->nelts; i++) { - - if (index[i].lengths == NULL) { - - if (index[i].name.data[0] == '/') { - return ngx_http_internal_redirect(r, &index[i].name, &r->args); - } - - reserve = ilcf->max_index_len; - len = index[i].name.len; - - } else { - ngx_memzero(&e, sizeof(ngx_http_script_engine_t)); - - e.ip = index[i].lengths->elts; - e.request = r; - e.flushed = 1; - - /* 1 is for terminating '\0' as in static names */ - len = 1; - - while (*(uintptr_t *) e.ip) { - lcode = *(ngx_http_script_len_code_pt *) e.ip; - len += lcode(&e); - } - - /* 16 bytes are preallocation */ - - reserve = len + 16; - } - - if (reserve > allocated) { - - name = ngx_http_map_uri_to_path(r, &path, &root, reserve); - if (name == NULL) { - return NGX_HTTP_INTERNAL_SERVER_ERROR; - } - - allocated = path.data + path.len - name; - } - - if (index[i].values == NULL) { - - /* index[i].name.len includes the terminating '\0' */ - - ngx_memcpy(name, index[i].name.data, index[i].name.len); - - path.len = (name + index[i].name.len - 1) - path.data; - - } else { - e.ip = index[i].values->elts; - e.pos = name; - - while (*(uintptr_t *) e.ip) { - code = *(ngx_http_script_code_pt *) e.ip; - code((ngx_http_script_engine_t *) &e); - } - - if (*name == '/') { - uri.len = len - 1; - uri.data = name; - return ngx_http_internal_redirect(r, &uri, &r->args); - } - - path.len = e.pos - path.data; - - *e.pos = '\0'; - } - - ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "open index \"%V\"", &path); - - ngx_memzero(&of, sizeof(ngx_open_file_info_t)); - - of.read_ahead = clcf->read_ahead; - of.directio = clcf->directio; - of.valid = clcf->open_file_cache_valid; - of.min_uses = clcf->open_file_cache_min_uses; - of.test_only = 1; - of.errors = clcf->open_file_cache_errors; - of.events = clcf->open_file_cache_events; - - if (ngx_http_set_disable_symlinks(r, clcf, &path, &of) != NGX_OK) { - return NGX_HTTP_INTERNAL_SERVER_ERROR; - } - - if (ngx_open_cached_file(clcf->open_file_cache, &path, &of, r->pool) - != NGX_OK) - { - if (of.err == 0) { - return NGX_HTTP_INTERNAL_SERVER_ERROR; - } - - ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, of.err, - "%s \"%s\" failed", of.failed, path.data); - -#if (NGX_HAVE_OPENAT) - if (of.err == NGX_EMLINK - || of.err == NGX_ELOOP) - { - return NGX_HTTP_FORBIDDEN; - } -#endif - - if (of.err == NGX_ENOTDIR - || of.err == NGX_ENAMETOOLONG - || of.err == NGX_EACCES) - { - return ngx_http_index_error(r, clcf, path.data, of.err); - } - - if (!dir_tested) { - rc = ngx_http_index_test_dir(r, clcf, path.data, name - 1); - - if (rc != NGX_OK) { - return rc; - } - - dir_tested = 1; - } - - if (of.err == NGX_ENOENT) { - continue; - } - - ngx_log_error(NGX_LOG_CRIT, r->connection->log, of.err, - "%s \"%s\" failed", of.failed, path.data); - - return NGX_HTTP_INTERNAL_SERVER_ERROR; - } - - uri.len = r->uri.len + len - 1; - - if (!clcf->alias) { - uri.data = path.data + root; - - } else { - uri.data = ngx_pnalloc(r->pool, uri.len); - if (uri.data == NULL) { - return NGX_HTTP_INTERNAL_SERVER_ERROR; - } - - p = ngx_copy(uri.data, r->uri.data, r->uri.len); - ngx_memcpy(p, name, len - 1); - } - - return ngx_http_internal_redirect(r, &uri, &r->args); - } - - return NGX_DECLINED; -} - - -static ngx_int_t -ngx_http_index_test_dir(ngx_http_request_t *r, ngx_http_core_loc_conf_t *clcf, - u_char *path, u_char *last) -{ - u_char c; - ngx_str_t dir; - ngx_open_file_info_t of; - - c = *last; - if (c != '/' || path == last) { - /* "alias" without trailing slash */ - c = *(++last); - } - *last = '\0'; - - dir.len = last - path; - dir.data = path; - - ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "http index check dir: \"%V\"", &dir); - - ngx_memzero(&of, sizeof(ngx_open_file_info_t)); - - of.test_dir = 1; - of.test_only = 1; - of.valid = clcf->open_file_cache_valid; - of.errors = clcf->open_file_cache_errors; - - if (ngx_http_set_disable_symlinks(r, clcf, &dir, &of) != NGX_OK) { - return NGX_HTTP_INTERNAL_SERVER_ERROR; - } - - if (ngx_open_cached_file(clcf->open_file_cache, &dir, &of, r->pool) - != NGX_OK) - { - if (of.err) { - -#if (NGX_HAVE_OPENAT) - if (of.err == NGX_EMLINK - || of.err == NGX_ELOOP) - { - return NGX_HTTP_FORBIDDEN; - } -#endif - - if (of.err == NGX_ENOENT) { - *last = c; - return ngx_http_index_error(r, clcf, dir.data, NGX_ENOENT); - } - - if (of.err == NGX_EACCES) { - - *last = c; - - /* - * ngx_http_index_test_dir() is called after the first index - * file testing has returned an error distinct from NGX_EACCES. - * This means that directory searching is allowed. - */ - - return NGX_OK; - } - - ngx_log_error(NGX_LOG_CRIT, r->connection->log, of.err, - "%s \"%s\" failed", of.failed, dir.data); - } - - return NGX_HTTP_INTERNAL_SERVER_ERROR; - } - - *last = c; - - if (of.is_dir) { - return NGX_OK; - } - - ngx_log_error(NGX_LOG_ALERT, r->connection->log, 0, - "\"%s\" is not a directory", dir.data); - - return NGX_HTTP_INTERNAL_SERVER_ERROR; -} - - -static ngx_int_t -ngx_http_index_error(ngx_http_request_t *r, ngx_http_core_loc_conf_t *clcf, - u_char *file, ngx_err_t err) -{ - if (err == NGX_EACCES) { - ngx_log_error(NGX_LOG_ERR, r->connection->log, err, - "\"%s\" is forbidden", file); - - return NGX_HTTP_FORBIDDEN; - } - - if (clcf->log_not_found) { - ngx_log_error(NGX_LOG_ERR, r->connection->log, err, - "\"%s\" is not found", file); - } - - return NGX_HTTP_NOT_FOUND; -} - - -static void * -ngx_http_index_create_loc_conf(ngx_conf_t *cf) -{ - ngx_http_index_loc_conf_t *conf; - - conf = ngx_palloc(cf->pool, sizeof(ngx_http_index_loc_conf_t)); - if (conf == NULL) { - return NULL; - } - - conf->indices = NULL; - conf->max_index_len = 0; - - return conf; -} - - -static char * -ngx_http_index_merge_loc_conf(ngx_conf_t *cf, void *parent, void *child) -{ - ngx_http_index_loc_conf_t *prev = parent; - ngx_http_index_loc_conf_t *conf = child; - - ngx_http_index_t *index; - - if (conf->indices == NULL) { - conf->indices = prev->indices; - conf->max_index_len = prev->max_index_len; - } - - if (conf->indices == NULL) { - conf->indices = ngx_array_create(cf->pool, 1, sizeof(ngx_http_index_t)); - if (conf->indices == NULL) { - return NGX_CONF_ERROR; - } - - index = ngx_array_push(conf->indices); - if (index == NULL) { - return NGX_CONF_ERROR; - } - - index->name.len = sizeof(NGX_HTTP_DEFAULT_INDEX); - index->name.data = (u_char *) NGX_HTTP_DEFAULT_INDEX; - index->lengths = NULL; - index->values = NULL; - - conf->max_index_len = sizeof(NGX_HTTP_DEFAULT_INDEX); - - return NGX_CONF_OK; - } - - return NGX_CONF_OK; -} - - -static ngx_int_t -ngx_http_index_init(ngx_conf_t *cf) -{ - ngx_http_handler_pt *h; - ngx_http_core_main_conf_t *cmcf; - - cmcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_core_module); - - h = ngx_array_push(&cmcf->phases[NGX_HTTP_CONTENT_PHASE].handlers); - if (h == NULL) { - return NGX_ERROR; - } - - *h = ngx_http_index_handler; - - return NGX_OK; -} - - -/* TODO: warn about duplicate indices */ - -static char * -ngx_http_index_set_index(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) -{ - ngx_http_index_loc_conf_t *ilcf = conf; - - ngx_str_t *value; - ngx_uint_t i, n; - ngx_http_index_t *index; - ngx_http_script_compile_t sc; - - if (ilcf->indices == NULL) { - ilcf->indices = ngx_array_create(cf->pool, 2, sizeof(ngx_http_index_t)); - if (ilcf->indices == NULL) { - return NGX_CONF_ERROR; - } - } - - value = cf->args->elts; - - for (i = 1; i < cf->args->nelts; i++) { - - if (value[i].data[0] == '/' && i != cf->args->nelts - 1) { - ngx_conf_log_error(NGX_LOG_WARN, cf, 0, - "only the last index in \"index\" directive " - "should be absolute"); - } - - if (value[i].len == 0) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "index \"%V\" in \"index\" directive is invalid", - &value[i]); - return NGX_CONF_ERROR; - } - - index = ngx_array_push(ilcf->indices); - if (index == NULL) { - return NGX_CONF_ERROR; - } - - index->name.len = value[i].len; - index->name.data = value[i].data; - index->lengths = NULL; - index->values = NULL; - - n = ngx_http_script_variables_count(&value[i]); - - if (n == 0) { - if (ilcf->max_index_len < index->name.len) { - ilcf->max_index_len = index->name.len; - } - - if (index->name.data[0] == '/') { - continue; - } - - /* include the terminating '\0' to the length to use ngx_memcpy() */ - index->name.len++; - - continue; - } - - ngx_memzero(&sc, sizeof(ngx_http_script_compile_t)); - - sc.cf = cf; - sc.source = &value[i]; - sc.lengths = &index->lengths; - sc.values = &index->values; - sc.variables = n; - sc.complete_lengths = 1; - sc.complete_values = 1; - - if (ngx_http_script_compile(&sc) != NGX_OK) { - return NGX_CONF_ERROR; - } - } - - return NGX_CONF_OK; -} diff --git a/src/deps/src/nginx-1.30.3/src/http/modules/ngx_http_limit_conn_module.c b/src/deps/src/nginx-1.30.3/src/http/modules/ngx_http_limit_conn_module.c deleted file mode 100644 index 4e3e7d524c..0000000000 --- a/src/deps/src/nginx-1.30.3/src/http/modules/ngx_http_limit_conn_module.c +++ /dev/null @@ -1,758 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#include -#include -#include - - -#define NGX_HTTP_LIMIT_CONN_PASSED 1 -#define NGX_HTTP_LIMIT_CONN_REJECTED 2 -#define NGX_HTTP_LIMIT_CONN_REJECTED_DRY_RUN 3 - - -typedef struct { - u_char color; - u_char len; - u_short conn; - u_char data[1]; -} ngx_http_limit_conn_node_t; - - -typedef struct { - ngx_shm_zone_t *shm_zone; - ngx_rbtree_node_t *node; -} ngx_http_limit_conn_cleanup_t; - - -typedef struct { - ngx_rbtree_t rbtree; - ngx_rbtree_node_t sentinel; -} ngx_http_limit_conn_shctx_t; - - -typedef struct { - ngx_http_limit_conn_shctx_t *sh; - ngx_slab_pool_t *shpool; - ngx_http_complex_value_t key; -} ngx_http_limit_conn_ctx_t; - - -typedef struct { - ngx_shm_zone_t *shm_zone; - ngx_uint_t conn; -} ngx_http_limit_conn_limit_t; - - -typedef struct { - ngx_array_t limits; - ngx_uint_t log_level; - ngx_uint_t status_code; - ngx_flag_t dry_run; -} ngx_http_limit_conn_conf_t; - - -static ngx_rbtree_node_t *ngx_http_limit_conn_lookup(ngx_rbtree_t *rbtree, - ngx_str_t *key, uint32_t hash); -static void ngx_http_limit_conn_cleanup(void *data); -static ngx_inline void ngx_http_limit_conn_cleanup_all(ngx_pool_t *pool); - -static ngx_int_t ngx_http_limit_conn_status_variable(ngx_http_request_t *r, - ngx_http_variable_value_t *v, uintptr_t data); -static void *ngx_http_limit_conn_create_conf(ngx_conf_t *cf); -static char *ngx_http_limit_conn_merge_conf(ngx_conf_t *cf, void *parent, - void *child); -static char *ngx_http_limit_conn_zone(ngx_conf_t *cf, ngx_command_t *cmd, - void *conf); -static char *ngx_http_limit_conn(ngx_conf_t *cf, ngx_command_t *cmd, - void *conf); -static ngx_int_t ngx_http_limit_conn_add_variables(ngx_conf_t *cf); -static ngx_int_t ngx_http_limit_conn_init(ngx_conf_t *cf); - - -static ngx_conf_enum_t ngx_http_limit_conn_log_levels[] = { - { ngx_string("info"), NGX_LOG_INFO }, - { ngx_string("notice"), NGX_LOG_NOTICE }, - { ngx_string("warn"), NGX_LOG_WARN }, - { ngx_string("error"), NGX_LOG_ERR }, - { ngx_null_string, 0 } -}; - - -static ngx_conf_num_bounds_t ngx_http_limit_conn_status_bounds = { - ngx_conf_check_num_bounds, 400, 599 -}; - - -static ngx_command_t ngx_http_limit_conn_commands[] = { - - { ngx_string("limit_conn_zone"), - NGX_HTTP_MAIN_CONF|NGX_CONF_TAKE2, - ngx_http_limit_conn_zone, - 0, - 0, - NULL }, - - { ngx_string("limit_conn"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE2, - ngx_http_limit_conn, - NGX_HTTP_LOC_CONF_OFFSET, - 0, - NULL }, - - { ngx_string("limit_conn_log_level"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1, - ngx_conf_set_enum_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_limit_conn_conf_t, log_level), - &ngx_http_limit_conn_log_levels }, - - { ngx_string("limit_conn_status"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1, - ngx_conf_set_num_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_limit_conn_conf_t, status_code), - &ngx_http_limit_conn_status_bounds }, - - { ngx_string("limit_conn_dry_run"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG, - ngx_conf_set_flag_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_limit_conn_conf_t, dry_run), - NULL }, - - ngx_null_command -}; - - -static ngx_http_module_t ngx_http_limit_conn_module_ctx = { - ngx_http_limit_conn_add_variables, /* preconfiguration */ - ngx_http_limit_conn_init, /* postconfiguration */ - - NULL, /* create main configuration */ - NULL, /* init main configuration */ - - NULL, /* create server configuration */ - NULL, /* merge server configuration */ - - ngx_http_limit_conn_create_conf, /* create location configuration */ - ngx_http_limit_conn_merge_conf /* merge location configuration */ -}; - - -ngx_module_t ngx_http_limit_conn_module = { - NGX_MODULE_V1, - &ngx_http_limit_conn_module_ctx, /* module context */ - ngx_http_limit_conn_commands, /* module directives */ - NGX_HTTP_MODULE, /* module type */ - NULL, /* init master */ - NULL, /* init module */ - NULL, /* init process */ - NULL, /* init thread */ - NULL, /* exit thread */ - NULL, /* exit process */ - NULL, /* exit master */ - NGX_MODULE_V1_PADDING -}; - - -static ngx_http_variable_t ngx_http_limit_conn_vars[] = { - - { ngx_string("limit_conn_status"), NULL, - ngx_http_limit_conn_status_variable, 0, NGX_HTTP_VAR_NOCACHEABLE, 0 }, - - ngx_http_null_variable -}; - - -static ngx_str_t ngx_http_limit_conn_status[] = { - ngx_string("PASSED"), - ngx_string("REJECTED"), - ngx_string("REJECTED_DRY_RUN") -}; - - -static ngx_int_t -ngx_http_limit_conn_handler(ngx_http_request_t *r) -{ - size_t n; - uint32_t hash; - ngx_str_t key; - ngx_uint_t i; - ngx_rbtree_node_t *node; - ngx_pool_cleanup_t *cln; - ngx_http_limit_conn_ctx_t *ctx; - ngx_http_limit_conn_node_t *lc; - ngx_http_limit_conn_conf_t *lccf; - ngx_http_limit_conn_limit_t *limits; - ngx_http_limit_conn_cleanup_t *lccln; - - if (r->main->limit_conn_status) { - return NGX_DECLINED; - } - - lccf = ngx_http_get_module_loc_conf(r, ngx_http_limit_conn_module); - limits = lccf->limits.elts; - - for (i = 0; i < lccf->limits.nelts; i++) { - ctx = limits[i].shm_zone->data; - - if (ngx_http_complex_value(r, &ctx->key, &key) != NGX_OK) { - return NGX_HTTP_INTERNAL_SERVER_ERROR; - } - - if (key.len == 0) { - continue; - } - - if (key.len > 255) { - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "the value of the \"%V\" key " - "is more than 255 bytes: \"%V\"", - &ctx->key.value, &key); - continue; - } - - r->main->limit_conn_status = NGX_HTTP_LIMIT_CONN_PASSED; - - hash = ngx_crc32_short(key.data, key.len); - - ngx_shmtx_lock(&ctx->shpool->mutex); - - node = ngx_http_limit_conn_lookup(&ctx->sh->rbtree, &key, hash); - - if (node == NULL) { - - n = offsetof(ngx_rbtree_node_t, color) - + offsetof(ngx_http_limit_conn_node_t, data) - + key.len; - - node = ngx_slab_alloc_locked(ctx->shpool, n); - - if (node == NULL) { - ngx_shmtx_unlock(&ctx->shpool->mutex); - ngx_http_limit_conn_cleanup_all(r->pool); - - if (lccf->dry_run) { - r->main->limit_conn_status = - NGX_HTTP_LIMIT_CONN_REJECTED_DRY_RUN; - return NGX_DECLINED; - } - - r->main->limit_conn_status = NGX_HTTP_LIMIT_CONN_REJECTED; - - return lccf->status_code; - } - - lc = (ngx_http_limit_conn_node_t *) &node->color; - - node->key = hash; - lc->len = (u_char) key.len; - lc->conn = 1; - ngx_memcpy(lc->data, key.data, key.len); - - ngx_rbtree_insert(&ctx->sh->rbtree, node); - - } else { - - lc = (ngx_http_limit_conn_node_t *) &node->color; - - if ((ngx_uint_t) lc->conn >= limits[i].conn) { - - ngx_shmtx_unlock(&ctx->shpool->mutex); - - ngx_log_error(lccf->log_level, r->connection->log, 0, - "limiting connections%s by zone \"%V\"", - lccf->dry_run ? ", dry run," : "", - &limits[i].shm_zone->shm.name); - - ngx_http_limit_conn_cleanup_all(r->pool); - - if (lccf->dry_run) { - r->main->limit_conn_status = - NGX_HTTP_LIMIT_CONN_REJECTED_DRY_RUN; - return NGX_DECLINED; - } - - r->main->limit_conn_status = NGX_HTTP_LIMIT_CONN_REJECTED; - - return lccf->status_code; - } - - lc->conn++; - } - - ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "limit conn: %08Xi %d", node->key, lc->conn); - - ngx_shmtx_unlock(&ctx->shpool->mutex); - - cln = ngx_pool_cleanup_add(r->pool, - sizeof(ngx_http_limit_conn_cleanup_t)); - if (cln == NULL) { - return NGX_HTTP_INTERNAL_SERVER_ERROR; - } - - cln->handler = ngx_http_limit_conn_cleanup; - lccln = cln->data; - - lccln->shm_zone = limits[i].shm_zone; - lccln->node = node; - } - - return NGX_DECLINED; -} - - -static void -ngx_http_limit_conn_rbtree_insert_value(ngx_rbtree_node_t *temp, - ngx_rbtree_node_t *node, ngx_rbtree_node_t *sentinel) -{ - ngx_rbtree_node_t **p; - ngx_http_limit_conn_node_t *lcn, *lcnt; - - for ( ;; ) { - - if (node->key < temp->key) { - - p = &temp->left; - - } else if (node->key > temp->key) { - - p = &temp->right; - - } else { /* node->key == temp->key */ - - lcn = (ngx_http_limit_conn_node_t *) &node->color; - lcnt = (ngx_http_limit_conn_node_t *) &temp->color; - - p = (ngx_memn2cmp(lcn->data, lcnt->data, lcn->len, lcnt->len) < 0) - ? &temp->left : &temp->right; - } - - if (*p == sentinel) { - break; - } - - temp = *p; - } - - *p = node; - node->parent = temp; - node->left = sentinel; - node->right = sentinel; - ngx_rbt_red(node); -} - - -static ngx_rbtree_node_t * -ngx_http_limit_conn_lookup(ngx_rbtree_t *rbtree, ngx_str_t *key, uint32_t hash) -{ - ngx_int_t rc; - ngx_rbtree_node_t *node, *sentinel; - ngx_http_limit_conn_node_t *lcn; - - node = rbtree->root; - sentinel = rbtree->sentinel; - - while (node != sentinel) { - - if (hash < node->key) { - node = node->left; - continue; - } - - if (hash > node->key) { - node = node->right; - continue; - } - - /* hash == node->key */ - - lcn = (ngx_http_limit_conn_node_t *) &node->color; - - rc = ngx_memn2cmp(key->data, lcn->data, key->len, (size_t) lcn->len); - - if (rc == 0) { - return node; - } - - node = (rc < 0) ? node->left : node->right; - } - - return NULL; -} - - -static void -ngx_http_limit_conn_cleanup(void *data) -{ - ngx_http_limit_conn_cleanup_t *lccln = data; - - ngx_rbtree_node_t *node; - ngx_http_limit_conn_ctx_t *ctx; - ngx_http_limit_conn_node_t *lc; - - ctx = lccln->shm_zone->data; - node = lccln->node; - lc = (ngx_http_limit_conn_node_t *) &node->color; - - ngx_shmtx_lock(&ctx->shpool->mutex); - - ngx_log_debug2(NGX_LOG_DEBUG_HTTP, lccln->shm_zone->shm.log, 0, - "limit conn cleanup: %08Xi %d", node->key, lc->conn); - - lc->conn--; - - if (lc->conn == 0) { - ngx_rbtree_delete(&ctx->sh->rbtree, node); - ngx_slab_free_locked(ctx->shpool, node); - } - - ngx_shmtx_unlock(&ctx->shpool->mutex); -} - - -static ngx_inline void -ngx_http_limit_conn_cleanup_all(ngx_pool_t *pool) -{ - ngx_pool_cleanup_t *cln; - - cln = pool->cleanup; - - while (cln && cln->handler == ngx_http_limit_conn_cleanup) { - ngx_http_limit_conn_cleanup(cln->data); - cln = cln->next; - } - - pool->cleanup = cln; -} - - -static ngx_int_t -ngx_http_limit_conn_init_zone(ngx_shm_zone_t *shm_zone, void *data) -{ - ngx_http_limit_conn_ctx_t *octx = data; - - size_t len; - ngx_http_limit_conn_ctx_t *ctx; - - ctx = shm_zone->data; - - if (octx) { - if (ctx->key.value.len != octx->key.value.len - || ngx_strncmp(ctx->key.value.data, octx->key.value.data, - ctx->key.value.len) - != 0) - { - ngx_log_error(NGX_LOG_EMERG, shm_zone->shm.log, 0, - "limit_conn_zone \"%V\" uses the \"%V\" key " - "while previously it used the \"%V\" key", - &shm_zone->shm.name, &ctx->key.value, - &octx->key.value); - return NGX_ERROR; - } - - ctx->sh = octx->sh; - ctx->shpool = octx->shpool; - - return NGX_OK; - } - - ctx->shpool = (ngx_slab_pool_t *) shm_zone->shm.addr; - - if (shm_zone->shm.exists) { - ctx->sh = ctx->shpool->data; - - return NGX_OK; - } - - ctx->sh = ngx_slab_alloc(ctx->shpool, sizeof(ngx_http_limit_conn_shctx_t)); - if (ctx->sh == NULL) { - return NGX_ERROR; - } - - ctx->shpool->data = ctx->sh; - - ngx_rbtree_init(&ctx->sh->rbtree, &ctx->sh->sentinel, - ngx_http_limit_conn_rbtree_insert_value); - - len = sizeof(" in limit_conn_zone \"\"") + shm_zone->shm.name.len; - - ctx->shpool->log_ctx = ngx_slab_alloc(ctx->shpool, len); - if (ctx->shpool->log_ctx == NULL) { - return NGX_ERROR; - } - - ngx_sprintf(ctx->shpool->log_ctx, " in limit_conn_zone \"%V\"%Z", - &shm_zone->shm.name); - - return NGX_OK; -} - - -static ngx_int_t -ngx_http_limit_conn_status_variable(ngx_http_request_t *r, - ngx_http_variable_value_t *v, uintptr_t data) -{ - if (r->main->limit_conn_status == 0) { - v->not_found = 1; - return NGX_OK; - } - - v->valid = 1; - v->no_cacheable = 0; - v->not_found = 0; - v->len = ngx_http_limit_conn_status[r->main->limit_conn_status - 1].len; - v->data = ngx_http_limit_conn_status[r->main->limit_conn_status - 1].data; - - return NGX_OK; -} - - -static void * -ngx_http_limit_conn_create_conf(ngx_conf_t *cf) -{ - ngx_http_limit_conn_conf_t *conf; - - conf = ngx_pcalloc(cf->pool, sizeof(ngx_http_limit_conn_conf_t)); - if (conf == NULL) { - return NULL; - } - - /* - * set by ngx_pcalloc(): - * - * conf->limits.elts = NULL; - */ - - conf->log_level = NGX_CONF_UNSET_UINT; - conf->status_code = NGX_CONF_UNSET_UINT; - conf->dry_run = NGX_CONF_UNSET; - - return conf; -} - - -static char * -ngx_http_limit_conn_merge_conf(ngx_conf_t *cf, void *parent, void *child) -{ - ngx_http_limit_conn_conf_t *prev = parent; - ngx_http_limit_conn_conf_t *conf = child; - - if (conf->limits.elts == NULL) { - conf->limits = prev->limits; - } - - ngx_conf_merge_uint_value(conf->log_level, prev->log_level, NGX_LOG_ERR); - ngx_conf_merge_uint_value(conf->status_code, prev->status_code, - NGX_HTTP_SERVICE_UNAVAILABLE); - - ngx_conf_merge_value(conf->dry_run, prev->dry_run, 0); - - return NGX_CONF_OK; -} - - -static char * -ngx_http_limit_conn_zone(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) -{ - u_char *p; - ssize_t size; - ngx_str_t *value, name, s; - ngx_uint_t i; - ngx_shm_zone_t *shm_zone; - ngx_http_limit_conn_ctx_t *ctx; - ngx_http_compile_complex_value_t ccv; - - value = cf->args->elts; - - ctx = ngx_pcalloc(cf->pool, sizeof(ngx_http_limit_conn_ctx_t)); - if (ctx == NULL) { - return NGX_CONF_ERROR; - } - - ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t)); - - ccv.cf = cf; - ccv.value = &value[1]; - ccv.complex_value = &ctx->key; - - if (ngx_http_compile_complex_value(&ccv) != NGX_OK) { - return NGX_CONF_ERROR; - } - - size = 0; - name.len = 0; - - for (i = 2; i < cf->args->nelts; i++) { - - if (ngx_strncmp(value[i].data, "zone=", 5) == 0) { - - name.data = value[i].data + 5; - - p = (u_char *) ngx_strchr(name.data, ':'); - - if (p == NULL) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "invalid zone size \"%V\"", &value[i]); - return NGX_CONF_ERROR; - } - - name.len = p - name.data; - - s.data = p + 1; - s.len = value[i].data + value[i].len - s.data; - - size = ngx_parse_size(&s); - - if (size == NGX_ERROR) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "invalid zone size \"%V\"", &value[i]); - return NGX_CONF_ERROR; - } - - if (size < (ssize_t) (8 * ngx_pagesize)) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "zone \"%V\" is too small", &value[i]); - return NGX_CONF_ERROR; - } - - continue; - } - - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "invalid parameter \"%V\"", &value[i]); - return NGX_CONF_ERROR; - } - - if (name.len == 0) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "\"%V\" must have \"zone\" parameter", - &cmd->name); - return NGX_CONF_ERROR; - } - - shm_zone = ngx_shared_memory_add(cf, &name, size, - &ngx_http_limit_conn_module); - if (shm_zone == NULL) { - return NGX_CONF_ERROR; - } - - if (shm_zone->data) { - ctx = shm_zone->data; - - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "%V \"%V\" is already bound to key \"%V\"", - &cmd->name, &name, &ctx->key.value); - return NGX_CONF_ERROR; - } - - shm_zone->init = ngx_http_limit_conn_init_zone; - shm_zone->data = ctx; - - return NGX_CONF_OK; -} - - -static char * -ngx_http_limit_conn(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) -{ - ngx_shm_zone_t *shm_zone; - ngx_http_limit_conn_conf_t *lccf = conf; - ngx_http_limit_conn_limit_t *limit, *limits; - - ngx_str_t *value; - ngx_int_t n; - ngx_uint_t i; - - value = cf->args->elts; - - shm_zone = ngx_shared_memory_add(cf, &value[1], 0, - &ngx_http_limit_conn_module); - if (shm_zone == NULL) { - return NGX_CONF_ERROR; - } - - limits = lccf->limits.elts; - - if (limits == NULL) { - if (ngx_array_init(&lccf->limits, cf->pool, 1, - sizeof(ngx_http_limit_conn_limit_t)) - != NGX_OK) - { - return NGX_CONF_ERROR; - } - } - - for (i = 0; i < lccf->limits.nelts; i++) { - if (shm_zone == limits[i].shm_zone) { - return "is duplicate"; - } - } - - n = ngx_atoi(value[2].data, value[2].len); - if (n <= 0) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "invalid number of connections \"%V\"", &value[2]); - return NGX_CONF_ERROR; - } - - if (n > 65535) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "connection limit must be less 65536"); - return NGX_CONF_ERROR; - } - - limit = ngx_array_push(&lccf->limits); - if (limit == NULL) { - return NGX_CONF_ERROR; - } - - limit->conn = n; - limit->shm_zone = shm_zone; - - return NGX_CONF_OK; -} - - -static ngx_int_t -ngx_http_limit_conn_add_variables(ngx_conf_t *cf) -{ - ngx_http_variable_t *var, *v; - - for (v = ngx_http_limit_conn_vars; v->name.len; v++) { - var = ngx_http_add_variable(cf, &v->name, v->flags); - if (var == NULL) { - return NGX_ERROR; - } - - var->get_handler = v->get_handler; - var->data = v->data; - } - - return NGX_OK; -} - - -static ngx_int_t -ngx_http_limit_conn_init(ngx_conf_t *cf) -{ - ngx_http_handler_pt *h; - ngx_http_core_main_conf_t *cmcf; - - cmcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_core_module); - - h = ngx_array_push(&cmcf->phases[NGX_HTTP_PREACCESS_PHASE].handlers); - if (h == NULL) { - return NGX_ERROR; - } - - *h = ngx_http_limit_conn_handler; - - return NGX_OK; -} diff --git a/src/deps/src/nginx-1.30.3/src/http/modules/ngx_http_limit_req_module.c b/src/deps/src/nginx-1.30.3/src/http/modules/ngx_http_limit_req_module.c deleted file mode 100644 index 2b062a3052..0000000000 --- a/src/deps/src/nginx-1.30.3/src/http/modules/ngx_http_limit_req_module.c +++ /dev/null @@ -1,1102 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#include -#include -#include - - -#define NGX_HTTP_LIMIT_REQ_PASSED 1 -#define NGX_HTTP_LIMIT_REQ_DELAYED 2 -#define NGX_HTTP_LIMIT_REQ_REJECTED 3 -#define NGX_HTTP_LIMIT_REQ_DELAYED_DRY_RUN 4 -#define NGX_HTTP_LIMIT_REQ_REJECTED_DRY_RUN 5 - - -typedef struct { - u_char color; - u_char dummy; - u_short len; - ngx_queue_t queue; - ngx_msec_t last; - /* integer value, 1 corresponds to 0.001 r/s */ - ngx_uint_t excess; - ngx_uint_t count; - u_char data[1]; -} ngx_http_limit_req_node_t; - - -typedef struct { - ngx_rbtree_t rbtree; - ngx_rbtree_node_t sentinel; - ngx_queue_t queue; -} ngx_http_limit_req_shctx_t; - - -typedef struct { - ngx_http_limit_req_shctx_t *sh; - ngx_slab_pool_t *shpool; - /* integer value, 1 corresponds to 0.001 r/s */ - ngx_uint_t rate; - ngx_http_complex_value_t key; - ngx_http_limit_req_node_t *node; -} ngx_http_limit_req_ctx_t; - - -typedef struct { - ngx_shm_zone_t *shm_zone; - /* integer value, 1 corresponds to 0.001 r/s */ - ngx_uint_t burst; - ngx_uint_t delay; -} ngx_http_limit_req_limit_t; - - -typedef struct { - ngx_array_t limits; - ngx_uint_t limit_log_level; - ngx_uint_t delay_log_level; - ngx_uint_t status_code; - ngx_flag_t dry_run; -} ngx_http_limit_req_conf_t; - - -static void ngx_http_limit_req_delay(ngx_http_request_t *r); -static ngx_int_t ngx_http_limit_req_lookup(ngx_http_limit_req_limit_t *limit, - ngx_uint_t hash, ngx_str_t *key, ngx_uint_t *ep, ngx_uint_t account); -static ngx_msec_t ngx_http_limit_req_account(ngx_http_limit_req_limit_t *limits, - ngx_uint_t n, ngx_uint_t *ep, ngx_http_limit_req_limit_t **limit); -static void ngx_http_limit_req_unlock(ngx_http_limit_req_limit_t *limits, - ngx_uint_t n); -static void ngx_http_limit_req_expire(ngx_http_limit_req_ctx_t *ctx, - ngx_uint_t n); - -static ngx_int_t ngx_http_limit_req_status_variable(ngx_http_request_t *r, - ngx_http_variable_value_t *v, uintptr_t data); -static void *ngx_http_limit_req_create_conf(ngx_conf_t *cf); -static char *ngx_http_limit_req_merge_conf(ngx_conf_t *cf, void *parent, - void *child); -static char *ngx_http_limit_req_zone(ngx_conf_t *cf, ngx_command_t *cmd, - void *conf); -static char *ngx_http_limit_req(ngx_conf_t *cf, ngx_command_t *cmd, - void *conf); -static ngx_int_t ngx_http_limit_req_add_variables(ngx_conf_t *cf); -static ngx_int_t ngx_http_limit_req_init(ngx_conf_t *cf); - - -static ngx_conf_enum_t ngx_http_limit_req_log_levels[] = { - { ngx_string("info"), NGX_LOG_INFO }, - { ngx_string("notice"), NGX_LOG_NOTICE }, - { ngx_string("warn"), NGX_LOG_WARN }, - { ngx_string("error"), NGX_LOG_ERR }, - { ngx_null_string, 0 } -}; - - -static ngx_conf_num_bounds_t ngx_http_limit_req_status_bounds = { - ngx_conf_check_num_bounds, 400, 599 -}; - - -static ngx_command_t ngx_http_limit_req_commands[] = { - - { ngx_string("limit_req_zone"), - NGX_HTTP_MAIN_CONF|NGX_CONF_TAKE3, - ngx_http_limit_req_zone, - 0, - 0, - NULL }, - - { ngx_string("limit_req"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE123, - ngx_http_limit_req, - NGX_HTTP_LOC_CONF_OFFSET, - 0, - NULL }, - - { ngx_string("limit_req_log_level"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1, - ngx_conf_set_enum_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_limit_req_conf_t, limit_log_level), - &ngx_http_limit_req_log_levels }, - - { ngx_string("limit_req_status"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1, - ngx_conf_set_num_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_limit_req_conf_t, status_code), - &ngx_http_limit_req_status_bounds }, - - { ngx_string("limit_req_dry_run"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG, - ngx_conf_set_flag_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_limit_req_conf_t, dry_run), - NULL }, - - ngx_null_command -}; - - -static ngx_http_module_t ngx_http_limit_req_module_ctx = { - ngx_http_limit_req_add_variables, /* preconfiguration */ - ngx_http_limit_req_init, /* postconfiguration */ - - NULL, /* create main configuration */ - NULL, /* init main configuration */ - - NULL, /* create server configuration */ - NULL, /* merge server configuration */ - - ngx_http_limit_req_create_conf, /* create location configuration */ - ngx_http_limit_req_merge_conf /* merge location configuration */ -}; - - -ngx_module_t ngx_http_limit_req_module = { - NGX_MODULE_V1, - &ngx_http_limit_req_module_ctx, /* module context */ - ngx_http_limit_req_commands, /* module directives */ - NGX_HTTP_MODULE, /* module type */ - NULL, /* init master */ - NULL, /* init module */ - NULL, /* init process */ - NULL, /* init thread */ - NULL, /* exit thread */ - NULL, /* exit process */ - NULL, /* exit master */ - NGX_MODULE_V1_PADDING -}; - - -static ngx_http_variable_t ngx_http_limit_req_vars[] = { - - { ngx_string("limit_req_status"), NULL, - ngx_http_limit_req_status_variable, 0, NGX_HTTP_VAR_NOCACHEABLE, 0 }, - - ngx_http_null_variable -}; - - -static ngx_str_t ngx_http_limit_req_status[] = { - ngx_string("PASSED"), - ngx_string("DELAYED"), - ngx_string("REJECTED"), - ngx_string("DELAYED_DRY_RUN"), - ngx_string("REJECTED_DRY_RUN") -}; - - -static ngx_int_t -ngx_http_limit_req_handler(ngx_http_request_t *r) -{ - uint32_t hash; - ngx_str_t key; - ngx_int_t rc; - ngx_uint_t n, excess; - ngx_msec_t delay; - ngx_http_limit_req_ctx_t *ctx; - ngx_http_limit_req_conf_t *lrcf; - ngx_http_limit_req_limit_t *limit, *limits; - - if (r->main->limit_req_status) { - return NGX_DECLINED; - } - - lrcf = ngx_http_get_module_loc_conf(r, ngx_http_limit_req_module); - limits = lrcf->limits.elts; - - excess = 0; - - rc = NGX_DECLINED; - -#if (NGX_SUPPRESS_WARN) - limit = NULL; -#endif - - for (n = 0; n < lrcf->limits.nelts; n++) { - - limit = &limits[n]; - - ctx = limit->shm_zone->data; - - if (ngx_http_complex_value(r, &ctx->key, &key) != NGX_OK) { - ngx_http_limit_req_unlock(limits, n); - return NGX_HTTP_INTERNAL_SERVER_ERROR; - } - - if (key.len == 0) { - continue; - } - - if (key.len > 65535) { - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "the value of the \"%V\" key " - "is more than 65535 bytes: \"%V\"", - &ctx->key.value, &key); - continue; - } - - hash = ngx_crc32_short(key.data, key.len); - - ngx_shmtx_lock(&ctx->shpool->mutex); - - rc = ngx_http_limit_req_lookup(limit, hash, &key, &excess, - (n == lrcf->limits.nelts - 1)); - - ngx_shmtx_unlock(&ctx->shpool->mutex); - - ngx_log_debug4(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "limit_req[%ui]: %i %ui.%03ui", - n, rc, excess / 1000, excess % 1000); - - if (rc != NGX_AGAIN) { - break; - } - } - - if (rc == NGX_DECLINED) { - return NGX_DECLINED; - } - - if (rc == NGX_BUSY || rc == NGX_ERROR) { - - if (rc == NGX_BUSY) { - ngx_log_error(lrcf->limit_log_level, r->connection->log, 0, - "limiting requests%s, excess: %ui.%03ui by zone \"%V\"", - lrcf->dry_run ? ", dry run" : "", - excess / 1000, excess % 1000, - &limit->shm_zone->shm.name); - } - - ngx_http_limit_req_unlock(limits, n); - - if (lrcf->dry_run) { - r->main->limit_req_status = NGX_HTTP_LIMIT_REQ_REJECTED_DRY_RUN; - return NGX_DECLINED; - } - - r->main->limit_req_status = NGX_HTTP_LIMIT_REQ_REJECTED; - - return lrcf->status_code; - } - - /* rc == NGX_AGAIN || rc == NGX_OK */ - - if (rc == NGX_AGAIN) { - excess = 0; - } - - delay = ngx_http_limit_req_account(limits, n, &excess, &limit); - - if (!delay) { - r->main->limit_req_status = NGX_HTTP_LIMIT_REQ_PASSED; - return NGX_DECLINED; - } - - ngx_log_error(lrcf->delay_log_level, r->connection->log, 0, - "delaying request%s, excess: %ui.%03ui, by zone \"%V\"", - lrcf->dry_run ? ", dry run" : "", - excess / 1000, excess % 1000, &limit->shm_zone->shm.name); - - if (lrcf->dry_run) { - r->main->limit_req_status = NGX_HTTP_LIMIT_REQ_DELAYED_DRY_RUN; - return NGX_DECLINED; - } - - r->main->limit_req_status = NGX_HTTP_LIMIT_REQ_DELAYED; - - if (r->connection->read->ready) { - ngx_post_event(r->connection->read, &ngx_posted_events); - - } else { - if (ngx_handle_read_event(r->connection->read, 0) != NGX_OK) { - return NGX_HTTP_INTERNAL_SERVER_ERROR; - } - } - - r->read_event_handler = ngx_http_test_reading; - r->write_event_handler = ngx_http_limit_req_delay; - - r->connection->write->delayed = 1; - ngx_add_timer(r->connection->write, delay); - - return NGX_AGAIN; -} - - -static void -ngx_http_limit_req_delay(ngx_http_request_t *r) -{ - ngx_event_t *wev; - - ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "limit_req delay"); - - wev = r->connection->write; - - if (wev->delayed) { - - if (ngx_handle_write_event(wev, 0) != NGX_OK) { - ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR); - } - - return; - } - - if (ngx_handle_read_event(r->connection->read, 0) != NGX_OK) { - ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR); - return; - } - - r->read_event_handler = ngx_http_block_reading; - r->write_event_handler = ngx_http_core_run_phases; - - ngx_http_core_run_phases(r); -} - - -static void -ngx_http_limit_req_rbtree_insert_value(ngx_rbtree_node_t *temp, - ngx_rbtree_node_t *node, ngx_rbtree_node_t *sentinel) -{ - ngx_rbtree_node_t **p; - ngx_http_limit_req_node_t *lrn, *lrnt; - - for ( ;; ) { - - if (node->key < temp->key) { - - p = &temp->left; - - } else if (node->key > temp->key) { - - p = &temp->right; - - } else { /* node->key == temp->key */ - - lrn = (ngx_http_limit_req_node_t *) &node->color; - lrnt = (ngx_http_limit_req_node_t *) &temp->color; - - p = (ngx_memn2cmp(lrn->data, lrnt->data, lrn->len, lrnt->len) < 0) - ? &temp->left : &temp->right; - } - - if (*p == sentinel) { - break; - } - - temp = *p; - } - - *p = node; - node->parent = temp; - node->left = sentinel; - node->right = sentinel; - ngx_rbt_red(node); -} - - -static ngx_int_t -ngx_http_limit_req_lookup(ngx_http_limit_req_limit_t *limit, ngx_uint_t hash, - ngx_str_t *key, ngx_uint_t *ep, ngx_uint_t account) -{ - size_t size; - ngx_int_t rc, excess; - ngx_msec_t now; - ngx_msec_int_t ms; - ngx_rbtree_node_t *node, *sentinel; - ngx_http_limit_req_ctx_t *ctx; - ngx_http_limit_req_node_t *lr; - - now = ngx_current_msec; - - ctx = limit->shm_zone->data; - - node = ctx->sh->rbtree.root; - sentinel = ctx->sh->rbtree.sentinel; - - while (node != sentinel) { - - if (hash < node->key) { - node = node->left; - continue; - } - - if (hash > node->key) { - node = node->right; - continue; - } - - /* hash == node->key */ - - lr = (ngx_http_limit_req_node_t *) &node->color; - - rc = ngx_memn2cmp(key->data, lr->data, key->len, (size_t) lr->len); - - if (rc == 0) { - ngx_queue_remove(&lr->queue); - ngx_queue_insert_head(&ctx->sh->queue, &lr->queue); - - ms = (ngx_msec_int_t) (now - lr->last); - - if (ms < -60000) { - ms = 1; - - } else if (ms < 0) { - ms = 0; - } - - excess = lr->excess - ctx->rate * ms / 1000 + 1000; - - if (excess < 0) { - excess = 0; - } - - *ep = excess; - - if ((ngx_uint_t) excess > limit->burst) { - return NGX_BUSY; - } - - if (account) { - lr->excess = excess; - - if (ms) { - lr->last = now; - } - - return NGX_OK; - } - - lr->count++; - - ctx->node = lr; - - return NGX_AGAIN; - } - - node = (rc < 0) ? node->left : node->right; - } - - *ep = 0; - - size = offsetof(ngx_rbtree_node_t, color) - + offsetof(ngx_http_limit_req_node_t, data) - + key->len; - - ngx_http_limit_req_expire(ctx, 1); - - node = ngx_slab_alloc_locked(ctx->shpool, size); - - if (node == NULL) { - ngx_http_limit_req_expire(ctx, 0); - - node = ngx_slab_alloc_locked(ctx->shpool, size); - if (node == NULL) { - ngx_log_error(NGX_LOG_ALERT, ngx_cycle->log, 0, - "could not allocate node%s", ctx->shpool->log_ctx); - return NGX_ERROR; - } - } - - node->key = hash; - - lr = (ngx_http_limit_req_node_t *) &node->color; - - lr->len = (u_short) key->len; - lr->excess = 0; - - ngx_memcpy(lr->data, key->data, key->len); - - ngx_rbtree_insert(&ctx->sh->rbtree, node); - - ngx_queue_insert_head(&ctx->sh->queue, &lr->queue); - - if (account) { - lr->last = now; - lr->count = 0; - return NGX_OK; - } - - lr->last = 0; - lr->count = 1; - - ctx->node = lr; - - return NGX_AGAIN; -} - - -static ngx_msec_t -ngx_http_limit_req_account(ngx_http_limit_req_limit_t *limits, ngx_uint_t n, - ngx_uint_t *ep, ngx_http_limit_req_limit_t **limit) -{ - ngx_int_t excess; - ngx_msec_t now, delay, max_delay; - ngx_msec_int_t ms; - ngx_http_limit_req_ctx_t *ctx; - ngx_http_limit_req_node_t *lr; - - excess = *ep; - - if ((ngx_uint_t) excess <= (*limit)->delay) { - max_delay = 0; - - } else { - ctx = (*limit)->shm_zone->data; - max_delay = (excess - (*limit)->delay) * 1000 / ctx->rate; - } - - while (n--) { - ctx = limits[n].shm_zone->data; - lr = ctx->node; - - if (lr == NULL) { - continue; - } - - ngx_shmtx_lock(&ctx->shpool->mutex); - - now = ngx_current_msec; - ms = (ngx_msec_int_t) (now - lr->last); - - if (ms < -60000) { - ms = 1; - - } else if (ms < 0) { - ms = 0; - } - - excess = lr->excess - ctx->rate * ms / 1000 + 1000; - - if (excess < 0) { - excess = 0; - } - - if (ms) { - lr->last = now; - } - - lr->excess = excess; - lr->count--; - - ngx_shmtx_unlock(&ctx->shpool->mutex); - - ctx->node = NULL; - - if ((ngx_uint_t) excess <= limits[n].delay) { - continue; - } - - delay = (excess - limits[n].delay) * 1000 / ctx->rate; - - if (delay > max_delay) { - max_delay = delay; - *ep = excess; - *limit = &limits[n]; - } - } - - return max_delay; -} - - -static void -ngx_http_limit_req_unlock(ngx_http_limit_req_limit_t *limits, ngx_uint_t n) -{ - ngx_http_limit_req_ctx_t *ctx; - - while (n--) { - ctx = limits[n].shm_zone->data; - - if (ctx->node == NULL) { - continue; - } - - ngx_shmtx_lock(&ctx->shpool->mutex); - - ctx->node->count--; - - ngx_shmtx_unlock(&ctx->shpool->mutex); - - ctx->node = NULL; - } -} - - -static void -ngx_http_limit_req_expire(ngx_http_limit_req_ctx_t *ctx, ngx_uint_t n) -{ - ngx_int_t excess; - ngx_msec_t now; - ngx_queue_t *q; - ngx_msec_int_t ms; - ngx_rbtree_node_t *node; - ngx_http_limit_req_node_t *lr; - - now = ngx_current_msec; - - /* - * n == 1 deletes one or two zero rate entries - * n == 0 deletes oldest entry by force - * and one or two zero rate entries - */ - - while (n < 3) { - - if (ngx_queue_empty(&ctx->sh->queue)) { - return; - } - - q = ngx_queue_last(&ctx->sh->queue); - - lr = ngx_queue_data(q, ngx_http_limit_req_node_t, queue); - - if (lr->count) { - - /* - * There is not much sense in looking further, - * because we bump nodes on the lookup stage. - */ - - return; - } - - if (n++ != 0) { - - ms = (ngx_msec_int_t) (now - lr->last); - ms = ngx_abs(ms); - - if (ms < 60000) { - return; - } - - excess = lr->excess - ctx->rate * ms / 1000; - - if (excess > 0) { - return; - } - } - - ngx_queue_remove(q); - - node = (ngx_rbtree_node_t *) - ((u_char *) lr - offsetof(ngx_rbtree_node_t, color)); - - ngx_rbtree_delete(&ctx->sh->rbtree, node); - - ngx_slab_free_locked(ctx->shpool, node); - } -} - - -static ngx_int_t -ngx_http_limit_req_init_zone(ngx_shm_zone_t *shm_zone, void *data) -{ - ngx_http_limit_req_ctx_t *octx = data; - - size_t len; - ngx_http_limit_req_ctx_t *ctx; - - ctx = shm_zone->data; - - if (octx) { - if (ctx->key.value.len != octx->key.value.len - || ngx_strncmp(ctx->key.value.data, octx->key.value.data, - ctx->key.value.len) - != 0) - { - ngx_log_error(NGX_LOG_EMERG, shm_zone->shm.log, 0, - "limit_req \"%V\" uses the \"%V\" key " - "while previously it used the \"%V\" key", - &shm_zone->shm.name, &ctx->key.value, - &octx->key.value); - return NGX_ERROR; - } - - ctx->sh = octx->sh; - ctx->shpool = octx->shpool; - - return NGX_OK; - } - - ctx->shpool = (ngx_slab_pool_t *) shm_zone->shm.addr; - - if (shm_zone->shm.exists) { - ctx->sh = ctx->shpool->data; - - return NGX_OK; - } - - ctx->sh = ngx_slab_alloc(ctx->shpool, sizeof(ngx_http_limit_req_shctx_t)); - if (ctx->sh == NULL) { - return NGX_ERROR; - } - - ctx->shpool->data = ctx->sh; - - ngx_rbtree_init(&ctx->sh->rbtree, &ctx->sh->sentinel, - ngx_http_limit_req_rbtree_insert_value); - - ngx_queue_init(&ctx->sh->queue); - - len = sizeof(" in limit_req zone \"\"") + shm_zone->shm.name.len; - - ctx->shpool->log_ctx = ngx_slab_alloc(ctx->shpool, len); - if (ctx->shpool->log_ctx == NULL) { - return NGX_ERROR; - } - - ngx_sprintf(ctx->shpool->log_ctx, " in limit_req zone \"%V\"%Z", - &shm_zone->shm.name); - - ctx->shpool->log_nomem = 0; - - return NGX_OK; -} - - -static ngx_int_t -ngx_http_limit_req_status_variable(ngx_http_request_t *r, - ngx_http_variable_value_t *v, uintptr_t data) -{ - if (r->main->limit_req_status == 0) { - v->not_found = 1; - return NGX_OK; - } - - v->valid = 1; - v->no_cacheable = 0; - v->not_found = 0; - v->len = ngx_http_limit_req_status[r->main->limit_req_status - 1].len; - v->data = ngx_http_limit_req_status[r->main->limit_req_status - 1].data; - - return NGX_OK; -} - - -static void * -ngx_http_limit_req_create_conf(ngx_conf_t *cf) -{ - ngx_http_limit_req_conf_t *conf; - - conf = ngx_pcalloc(cf->pool, sizeof(ngx_http_limit_req_conf_t)); - if (conf == NULL) { - return NULL; - } - - /* - * set by ngx_pcalloc(): - * - * conf->limits.elts = NULL; - */ - - conf->limit_log_level = NGX_CONF_UNSET_UINT; - conf->status_code = NGX_CONF_UNSET_UINT; - conf->dry_run = NGX_CONF_UNSET; - - return conf; -} - - -static char * -ngx_http_limit_req_merge_conf(ngx_conf_t *cf, void *parent, void *child) -{ - ngx_http_limit_req_conf_t *prev = parent; - ngx_http_limit_req_conf_t *conf = child; - - if (conf->limits.elts == NULL) { - conf->limits = prev->limits; - } - - ngx_conf_merge_uint_value(conf->limit_log_level, prev->limit_log_level, - NGX_LOG_ERR); - - conf->delay_log_level = (conf->limit_log_level == NGX_LOG_INFO) ? - NGX_LOG_INFO : conf->limit_log_level + 1; - - ngx_conf_merge_uint_value(conf->status_code, prev->status_code, - NGX_HTTP_SERVICE_UNAVAILABLE); - - ngx_conf_merge_value(conf->dry_run, prev->dry_run, 0); - - return NGX_CONF_OK; -} - - -static char * -ngx_http_limit_req_zone(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) -{ - u_char *p; - size_t len; - ssize_t size; - ngx_str_t *value, name, s; - ngx_int_t rate, scale; - ngx_uint_t i; - ngx_shm_zone_t *shm_zone; - ngx_http_limit_req_ctx_t *ctx; - ngx_http_compile_complex_value_t ccv; - - value = cf->args->elts; - - ctx = ngx_pcalloc(cf->pool, sizeof(ngx_http_limit_req_ctx_t)); - if (ctx == NULL) { - return NGX_CONF_ERROR; - } - - ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t)); - - ccv.cf = cf; - ccv.value = &value[1]; - ccv.complex_value = &ctx->key; - - if (ngx_http_compile_complex_value(&ccv) != NGX_OK) { - return NGX_CONF_ERROR; - } - - size = 0; - rate = 1; - scale = 1; - name.len = 0; - - for (i = 2; i < cf->args->nelts; i++) { - - if (ngx_strncmp(value[i].data, "zone=", 5) == 0) { - - name.data = value[i].data + 5; - - p = (u_char *) ngx_strchr(name.data, ':'); - - if (p == NULL) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "invalid zone size \"%V\"", &value[i]); - return NGX_CONF_ERROR; - } - - name.len = p - name.data; - - s.data = p + 1; - s.len = value[i].data + value[i].len - s.data; - - size = ngx_parse_size(&s); - - if (size == NGX_ERROR) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "invalid zone size \"%V\"", &value[i]); - return NGX_CONF_ERROR; - } - - if (size < (ssize_t) (8 * ngx_pagesize)) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "zone \"%V\" is too small", &value[i]); - return NGX_CONF_ERROR; - } - - continue; - } - - if (ngx_strncmp(value[i].data, "rate=", 5) == 0) { - - len = value[i].len; - p = value[i].data + len - 3; - - if (ngx_strncmp(p, "r/s", 3) == 0) { - scale = 1; - len -= 3; - - } else if (ngx_strncmp(p, "r/m", 3) == 0) { - scale = 60; - len -= 3; - } - - rate = ngx_atoi(value[i].data + 5, len - 5); - if (rate <= 0) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "invalid rate \"%V\"", &value[i]); - return NGX_CONF_ERROR; - } - - continue; - } - - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "invalid parameter \"%V\"", &value[i]); - return NGX_CONF_ERROR; - } - - if (name.len == 0) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "\"%V\" must have \"zone\" parameter", - &cmd->name); - return NGX_CONF_ERROR; - } - - ctx->rate = rate * 1000 / scale; - - shm_zone = ngx_shared_memory_add(cf, &name, size, - &ngx_http_limit_req_module); - if (shm_zone == NULL) { - return NGX_CONF_ERROR; - } - - if (shm_zone->data) { - ctx = shm_zone->data; - - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "%V \"%V\" is already bound to key \"%V\"", - &cmd->name, &name, &ctx->key.value); - return NGX_CONF_ERROR; - } - - shm_zone->init = ngx_http_limit_req_init_zone; - shm_zone->data = ctx; - - return NGX_CONF_OK; -} - - -static char * -ngx_http_limit_req(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) -{ - ngx_http_limit_req_conf_t *lrcf = conf; - - ngx_int_t burst, delay; - ngx_str_t *value, s; - ngx_uint_t i; - ngx_shm_zone_t *shm_zone; - ngx_http_limit_req_limit_t *limit, *limits; - - value = cf->args->elts; - - shm_zone = NULL; - burst = 0; - delay = 0; - - for (i = 1; i < cf->args->nelts; i++) { - - if (ngx_strncmp(value[i].data, "zone=", 5) == 0) { - - s.len = value[i].len - 5; - s.data = value[i].data + 5; - - shm_zone = ngx_shared_memory_add(cf, &s, 0, - &ngx_http_limit_req_module); - if (shm_zone == NULL) { - return NGX_CONF_ERROR; - } - - continue; - } - - if (ngx_strncmp(value[i].data, "burst=", 6) == 0) { - - burst = ngx_atoi(value[i].data + 6, value[i].len - 6); - if (burst <= 0) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "invalid burst value \"%V\"", &value[i]); - return NGX_CONF_ERROR; - } - - continue; - } - - if (ngx_strncmp(value[i].data, "delay=", 6) == 0) { - - delay = ngx_atoi(value[i].data + 6, value[i].len - 6); - if (delay <= 0) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "invalid delay value \"%V\"", &value[i]); - return NGX_CONF_ERROR; - } - - continue; - } - - if (ngx_strcmp(value[i].data, "nodelay") == 0) { - delay = NGX_MAX_INT_T_VALUE / 1000; - continue; - } - - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "invalid parameter \"%V\"", &value[i]); - return NGX_CONF_ERROR; - } - - if (shm_zone == NULL) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "\"%V\" must have \"zone\" parameter", - &cmd->name); - return NGX_CONF_ERROR; - } - - limits = lrcf->limits.elts; - - if (limits == NULL) { - if (ngx_array_init(&lrcf->limits, cf->pool, 1, - sizeof(ngx_http_limit_req_limit_t)) - != NGX_OK) - { - return NGX_CONF_ERROR; - } - } - - for (i = 0; i < lrcf->limits.nelts; i++) { - if (shm_zone == limits[i].shm_zone) { - return "is duplicate"; - } - } - - limit = ngx_array_push(&lrcf->limits); - if (limit == NULL) { - return NGX_CONF_ERROR; - } - - limit->shm_zone = shm_zone; - limit->burst = burst * 1000; - limit->delay = delay * 1000; - - return NGX_CONF_OK; -} - - -static ngx_int_t -ngx_http_limit_req_add_variables(ngx_conf_t *cf) -{ - ngx_http_variable_t *var, *v; - - for (v = ngx_http_limit_req_vars; v->name.len; v++) { - var = ngx_http_add_variable(cf, &v->name, v->flags); - if (var == NULL) { - return NGX_ERROR; - } - - var->get_handler = v->get_handler; - var->data = v->data; - } - - return NGX_OK; -} - - -static ngx_int_t -ngx_http_limit_req_init(ngx_conf_t *cf) -{ - ngx_http_handler_pt *h; - ngx_http_core_main_conf_t *cmcf; - - cmcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_core_module); - - h = ngx_array_push(&cmcf->phases[NGX_HTTP_PREACCESS_PHASE].handlers); - if (h == NULL) { - return NGX_ERROR; - } - - *h = ngx_http_limit_req_handler; - - return NGX_OK; -} diff --git a/src/deps/src/nginx-1.30.3/src/http/modules/ngx_http_log_module.c b/src/deps/src/nginx-1.30.3/src/http/modules/ngx_http_log_module.c deleted file mode 100644 index f7c4bd2f59..0000000000 --- a/src/deps/src/nginx-1.30.3/src/http/modules/ngx_http_log_module.c +++ /dev/null @@ -1,1909 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#include -#include -#include - -#if (NGX_ZLIB) -#include -#endif - - -typedef struct ngx_http_log_op_s ngx_http_log_op_t; - -typedef u_char *(*ngx_http_log_op_run_pt) (ngx_http_request_t *r, u_char *buf, - ngx_http_log_op_t *op); - -typedef size_t (*ngx_http_log_op_getlen_pt) (ngx_http_request_t *r, - uintptr_t data); - - -struct ngx_http_log_op_s { - size_t len; - ngx_http_log_op_getlen_pt getlen; - ngx_http_log_op_run_pt run; - uintptr_t data; -}; - - -typedef struct { - ngx_str_t name; - ngx_array_t *flushes; - ngx_array_t *ops; /* array of ngx_http_log_op_t */ -} ngx_http_log_fmt_t; - - -typedef struct { - ngx_array_t formats; /* array of ngx_http_log_fmt_t */ - ngx_uint_t combined_used; /* unsigned combined_used:1 */ -} ngx_http_log_main_conf_t; - - -typedef struct { - u_char *start; - u_char *pos; - u_char *last; - - ngx_event_t *event; - ngx_msec_t flush; - ngx_int_t gzip; -} ngx_http_log_buf_t; - - -typedef struct { - ngx_array_t *lengths; - ngx_array_t *values; -} ngx_http_log_script_t; - - -typedef struct { - ngx_open_file_t *file; - ngx_http_log_script_t *script; - time_t disk_full_time; - time_t error_log_time; - ngx_syslog_peer_t *syslog_peer; - ngx_http_log_fmt_t *format; - ngx_http_complex_value_t *filter; -} ngx_http_log_t; - - -typedef struct { - ngx_array_t *logs; /* array of ngx_http_log_t */ - - ngx_open_file_cache_t *open_file_cache; - time_t open_file_cache_valid; - ngx_uint_t open_file_cache_min_uses; - - ngx_uint_t off; /* unsigned off:1 */ -} ngx_http_log_loc_conf_t; - - -typedef struct { - ngx_str_t name; - size_t len; - ngx_http_log_op_run_pt run; -} ngx_http_log_var_t; - - -#define NGX_HTTP_LOG_ESCAPE_DEFAULT 0 -#define NGX_HTTP_LOG_ESCAPE_JSON 1 -#define NGX_HTTP_LOG_ESCAPE_NONE 2 - - -static void ngx_http_log_write(ngx_http_request_t *r, ngx_http_log_t *log, - u_char *buf, size_t len); -static ssize_t ngx_http_log_script_write(ngx_http_request_t *r, - ngx_http_log_script_t *script, u_char **name, u_char *buf, size_t len); - -#if (NGX_ZLIB) -static ssize_t ngx_http_log_gzip(ngx_fd_t fd, u_char *buf, size_t len, - ngx_int_t level, ngx_log_t *log); - -static void *ngx_http_log_gzip_alloc(void *opaque, u_int items, u_int size); -static void ngx_http_log_gzip_free(void *opaque, void *address); -#endif - -static void ngx_http_log_flush(ngx_open_file_t *file, ngx_log_t *log); -static void ngx_http_log_flush_handler(ngx_event_t *ev); - -static u_char *ngx_http_log_pipe(ngx_http_request_t *r, u_char *buf, - ngx_http_log_op_t *op); -static u_char *ngx_http_log_time(ngx_http_request_t *r, u_char *buf, - ngx_http_log_op_t *op); -static u_char *ngx_http_log_iso8601(ngx_http_request_t *r, u_char *buf, - ngx_http_log_op_t *op); -static u_char *ngx_http_log_msec(ngx_http_request_t *r, u_char *buf, - ngx_http_log_op_t *op); -static u_char *ngx_http_log_request_time(ngx_http_request_t *r, u_char *buf, - ngx_http_log_op_t *op); -static u_char *ngx_http_log_status(ngx_http_request_t *r, u_char *buf, - ngx_http_log_op_t *op); -static u_char *ngx_http_log_bytes_sent(ngx_http_request_t *r, u_char *buf, - ngx_http_log_op_t *op); -static u_char *ngx_http_log_body_bytes_sent(ngx_http_request_t *r, - u_char *buf, ngx_http_log_op_t *op); -static u_char *ngx_http_log_request_length(ngx_http_request_t *r, u_char *buf, - ngx_http_log_op_t *op); - -static ngx_int_t ngx_http_log_variable_compile(ngx_conf_t *cf, - ngx_http_log_op_t *op, ngx_str_t *value, ngx_uint_t escape); -static size_t ngx_http_log_variable_getlen(ngx_http_request_t *r, - uintptr_t data); -static u_char *ngx_http_log_variable(ngx_http_request_t *r, u_char *buf, - ngx_http_log_op_t *op); -static uintptr_t ngx_http_log_escape(u_char *dst, u_char *src, size_t size); -static size_t ngx_http_log_json_variable_getlen(ngx_http_request_t *r, - uintptr_t data); -static u_char *ngx_http_log_json_variable(ngx_http_request_t *r, u_char *buf, - ngx_http_log_op_t *op); -static size_t ngx_http_log_unescaped_variable_getlen(ngx_http_request_t *r, - uintptr_t data); -static u_char *ngx_http_log_unescaped_variable(ngx_http_request_t *r, - u_char *buf, ngx_http_log_op_t *op); - - -static void *ngx_http_log_create_main_conf(ngx_conf_t *cf); -static void *ngx_http_log_create_loc_conf(ngx_conf_t *cf); -static char *ngx_http_log_merge_loc_conf(ngx_conf_t *cf, void *parent, - void *child); -static char *ngx_http_log_set_log(ngx_conf_t *cf, ngx_command_t *cmd, - void *conf); -static char *ngx_http_log_set_format(ngx_conf_t *cf, ngx_command_t *cmd, - void *conf); -static char *ngx_http_log_compile_format(ngx_conf_t *cf, - ngx_array_t *flushes, ngx_array_t *ops, ngx_array_t *args, ngx_uint_t s); -static char *ngx_http_log_open_file_cache(ngx_conf_t *cf, ngx_command_t *cmd, - void *conf); -static ngx_int_t ngx_http_log_init(ngx_conf_t *cf); - - -static ngx_command_t ngx_http_log_commands[] = { - - { ngx_string("log_format"), - NGX_HTTP_MAIN_CONF|NGX_CONF_2MORE, - ngx_http_log_set_format, - NGX_HTTP_MAIN_CONF_OFFSET, - 0, - NULL }, - - { ngx_string("access_log"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF - |NGX_HTTP_LMT_CONF|NGX_CONF_1MORE, - ngx_http_log_set_log, - NGX_HTTP_LOC_CONF_OFFSET, - 0, - NULL }, - - { ngx_string("open_log_file_cache"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1234, - ngx_http_log_open_file_cache, - NGX_HTTP_LOC_CONF_OFFSET, - 0, - NULL }, - - ngx_null_command -}; - - -static ngx_http_module_t ngx_http_log_module_ctx = { - NULL, /* preconfiguration */ - ngx_http_log_init, /* postconfiguration */ - - ngx_http_log_create_main_conf, /* create main configuration */ - NULL, /* init main configuration */ - - NULL, /* create server configuration */ - NULL, /* merge server configuration */ - - ngx_http_log_create_loc_conf, /* create location configuration */ - ngx_http_log_merge_loc_conf /* merge location configuration */ -}; - - -ngx_module_t ngx_http_log_module = { - NGX_MODULE_V1, - &ngx_http_log_module_ctx, /* module context */ - ngx_http_log_commands, /* module directives */ - NGX_HTTP_MODULE, /* module type */ - NULL, /* init master */ - NULL, /* init module */ - NULL, /* init process */ - NULL, /* init thread */ - NULL, /* exit thread */ - NULL, /* exit process */ - NULL, /* exit master */ - NGX_MODULE_V1_PADDING -}; - - -static ngx_str_t ngx_http_access_log = ngx_string(NGX_HTTP_LOG_PATH); - - -static ngx_str_t ngx_http_combined_fmt = - ngx_string("$remote_addr - $remote_user [$time_local] " - "\"$request\" $status $body_bytes_sent " - "\"$http_referer\" \"$http_user_agent\""); - - -static ngx_http_log_var_t ngx_http_log_vars[] = { - { ngx_string("pipe"), 1, ngx_http_log_pipe }, - { ngx_string("time_local"), sizeof("28/Sep/1970:12:00:00 +0600") - 1, - ngx_http_log_time }, - { ngx_string("time_iso8601"), sizeof("1970-09-28T12:00:00+06:00") - 1, - ngx_http_log_iso8601 }, - { ngx_string("msec"), NGX_TIME_T_LEN + 4, ngx_http_log_msec }, - { ngx_string("request_time"), NGX_TIME_T_LEN + 4, - ngx_http_log_request_time }, - { ngx_string("status"), NGX_INT_T_LEN, ngx_http_log_status }, - { ngx_string("bytes_sent"), NGX_OFF_T_LEN, ngx_http_log_bytes_sent }, - { ngx_string("body_bytes_sent"), NGX_OFF_T_LEN, - ngx_http_log_body_bytes_sent }, - { ngx_string("request_length"), NGX_SIZE_T_LEN, - ngx_http_log_request_length }, - - { ngx_null_string, 0, NULL } -}; - - -static ngx_int_t -ngx_http_log_handler(ngx_http_request_t *r) -{ - u_char *line, *p; - size_t len, size; - ssize_t n; - ngx_str_t val; - ngx_uint_t i, l; - ngx_http_log_t *log; - ngx_http_log_op_t *op; - ngx_http_log_buf_t *buffer; - ngx_http_log_loc_conf_t *lcf; - - ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "http log handler"); - - lcf = ngx_http_get_module_loc_conf(r, ngx_http_log_module); - - if (lcf->off) { - return NGX_OK; - } - - log = lcf->logs->elts; - for (l = 0; l < lcf->logs->nelts; l++) { - - if (log[l].filter) { - if (ngx_http_complex_value(r, log[l].filter, &val) != NGX_OK) { - return NGX_ERROR; - } - - if (val.len == 0 || (val.len == 1 && val.data[0] == '0')) { - continue; - } - } - - if (ngx_time() == log[l].disk_full_time) { - - /* - * on FreeBSD writing to a full filesystem with enabled softupdates - * may block process for much longer time than writing to non-full - * filesystem, so we skip writing to a log for one second - */ - - continue; - } - - ngx_http_script_flush_no_cacheable_variables(r, log[l].format->flushes); - - len = 0; - op = log[l].format->ops->elts; - for (i = 0; i < log[l].format->ops->nelts; i++) { - if (op[i].len == 0) { - len += op[i].getlen(r, op[i].data); - - } else { - len += op[i].len; - } - } - - if (log[l].syslog_peer) { - - /* length of syslog's PRI and HEADER message parts */ - len += sizeof("<255>Jan 01 00:00:00 ") - 1 - + ngx_cycle->hostname.len + 1 - + log[l].syslog_peer->tag.len + 2; - - goto alloc_line; - } - - len += NGX_LINEFEED_SIZE; - - buffer = log[l].file ? log[l].file->data : NULL; - - if (buffer) { - - if (len > (size_t) (buffer->last - buffer->pos)) { - - ngx_http_log_write(r, &log[l], buffer->start, - buffer->pos - buffer->start); - - buffer->pos = buffer->start; - } - - if (len <= (size_t) (buffer->last - buffer->pos)) { - - p = buffer->pos; - - if (buffer->event && p == buffer->start) { - ngx_add_timer(buffer->event, buffer->flush); - } - - for (i = 0; i < log[l].format->ops->nelts; i++) { - p = op[i].run(r, p, &op[i]); - } - - ngx_linefeed(p); - - buffer->pos = p; - - continue; - } - - if (buffer->event && buffer->event->timer_set) { - ngx_del_timer(buffer->event); - } - } - - alloc_line: - - line = ngx_pnalloc(r->pool, len); - if (line == NULL) { - return NGX_ERROR; - } - - p = line; - - if (log[l].syslog_peer) { - p = ngx_syslog_add_header(log[l].syslog_peer, line); - } - - for (i = 0; i < log[l].format->ops->nelts; i++) { - p = op[i].run(r, p, &op[i]); - } - - if (log[l].syslog_peer) { - - size = p - line; - - n = ngx_syslog_send(log[l].syslog_peer, line, size); - - if (n < 0) { - ngx_log_error(NGX_LOG_WARN, r->connection->log, 0, - "send() to syslog failed"); - - } else if ((size_t) n != size) { - ngx_log_error(NGX_LOG_WARN, r->connection->log, 0, - "send() to syslog has written only %z of %uz", - n, size); - } - - continue; - } - - ngx_linefeed(p); - - ngx_http_log_write(r, &log[l], line, p - line); - } - - return NGX_OK; -} - - -static void -ngx_http_log_write(ngx_http_request_t *r, ngx_http_log_t *log, u_char *buf, - size_t len) -{ - u_char *name; - time_t now; - ssize_t n; - ngx_err_t err; -#if (NGX_ZLIB) - ngx_http_log_buf_t *buffer; -#endif - - if (log->script == NULL) { - name = log->file->name.data; - -#if (NGX_ZLIB) - buffer = log->file->data; - - if (buffer && buffer->gzip) { - n = ngx_http_log_gzip(log->file->fd, buf, len, buffer->gzip, - r->connection->log); - } else { - n = ngx_write_fd(log->file->fd, buf, len); - } -#else - n = ngx_write_fd(log->file->fd, buf, len); -#endif - - } else { - name = NULL; - n = ngx_http_log_script_write(r, log->script, &name, buf, len); - } - - if (n == (ssize_t) len) { - return; - } - - now = ngx_time(); - - if (n == -1) { - err = ngx_errno; - - if (err == NGX_ENOSPC) { - log->disk_full_time = now; - } - - if (now - log->error_log_time > 59) { - ngx_log_error(NGX_LOG_ALERT, r->connection->log, err, - ngx_write_fd_n " to \"%s\" failed", name); - - log->error_log_time = now; - } - - return; - } - - if (now - log->error_log_time > 59) { - ngx_log_error(NGX_LOG_ALERT, r->connection->log, 0, - ngx_write_fd_n " to \"%s\" was incomplete: %z of %uz", - name, n, len); - - log->error_log_time = now; - } -} - - -static ssize_t -ngx_http_log_script_write(ngx_http_request_t *r, ngx_http_log_script_t *script, - u_char **name, u_char *buf, size_t len) -{ - size_t root; - ssize_t n; - ngx_str_t log, path; - ngx_open_file_info_t of; - ngx_http_log_loc_conf_t *llcf; - ngx_http_core_loc_conf_t *clcf; - - clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module); - - if (!r->root_tested) { - - /* test root directory existence */ - - if (ngx_http_map_uri_to_path(r, &path, &root, 0) == NULL) { - /* simulate successful logging */ - return len; - } - - path.data[root] = '\0'; - - ngx_memzero(&of, sizeof(ngx_open_file_info_t)); - - of.valid = clcf->open_file_cache_valid; - of.min_uses = clcf->open_file_cache_min_uses; - of.test_dir = 1; - of.test_only = 1; - of.errors = clcf->open_file_cache_errors; - of.events = clcf->open_file_cache_events; - - if (ngx_http_set_disable_symlinks(r, clcf, &path, &of) != NGX_OK) { - /* simulate successful logging */ - return len; - } - - if (ngx_open_cached_file(clcf->open_file_cache, &path, &of, r->pool) - != NGX_OK) - { - if (of.err == 0) { - /* simulate successful logging */ - return len; - } - - ngx_log_error(NGX_LOG_ERR, r->connection->log, of.err, - "testing \"%s\" existence failed", path.data); - - /* simulate successful logging */ - return len; - } - - if (!of.is_dir) { - ngx_log_error(NGX_LOG_ERR, r->connection->log, NGX_ENOTDIR, - "testing \"%s\" existence failed", path.data); - - /* simulate successful logging */ - return len; - } - } - - if (ngx_http_script_run(r, &log, script->lengths->elts, 1, - script->values->elts) - == NULL) - { - /* simulate successful logging */ - return len; - } - - log.data[log.len - 1] = '\0'; - *name = log.data; - - ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "http log \"%s\"", log.data); - - llcf = ngx_http_get_module_loc_conf(r, ngx_http_log_module); - - ngx_memzero(&of, sizeof(ngx_open_file_info_t)); - - of.log = 1; - of.valid = llcf->open_file_cache_valid; - of.min_uses = llcf->open_file_cache_min_uses; - of.directio = NGX_OPEN_FILE_DIRECTIO_OFF; - - if (ngx_http_set_disable_symlinks(r, clcf, &log, &of) != NGX_OK) { - /* simulate successful logging */ - return len; - } - - if (ngx_open_cached_file(llcf->open_file_cache, &log, &of, r->pool) - != NGX_OK) - { - if (of.err == 0) { - /* simulate successful logging */ - return len; - } - - ngx_log_error(NGX_LOG_CRIT, r->connection->log, ngx_errno, - "%s \"%s\" failed", of.failed, log.data); - /* simulate successful logging */ - return len; - } - - ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "http log #%d", of.fd); - - n = ngx_write_fd(of.fd, buf, len); - - return n; -} - - -#if (NGX_ZLIB) - -static ssize_t -ngx_http_log_gzip(ngx_fd_t fd, u_char *buf, size_t len, ngx_int_t level, - ngx_log_t *log) -{ - int rc, wbits, memlevel; - u_char *out; - size_t size; - ssize_t n; - z_stream zstream; - ngx_err_t err; - ngx_pool_t *pool; - - wbits = MAX_WBITS; - memlevel = MAX_MEM_LEVEL - 1; - - while ((ssize_t) len < ((1 << (wbits - 1)) - 262)) { - wbits--; - memlevel--; - } - - /* - * This is a formula from deflateBound() for conservative upper bound of - * compressed data plus 18 bytes of gzip wrapper. - */ - - size = len + ((len + 7) >> 3) + ((len + 63) >> 6) + 5 + 18; - - ngx_memzero(&zstream, sizeof(z_stream)); - - pool = ngx_create_pool(256, log); - if (pool == NULL) { - /* simulate successful logging */ - return len; - } - - pool->log = log; - - zstream.zalloc = ngx_http_log_gzip_alloc; - zstream.zfree = ngx_http_log_gzip_free; - zstream.opaque = pool; - - out = ngx_pnalloc(pool, size); - if (out == NULL) { - goto done; - } - - zstream.next_in = buf; - zstream.avail_in = len; - zstream.next_out = out; - zstream.avail_out = size; - - rc = deflateInit2(&zstream, (int) level, Z_DEFLATED, wbits + 16, memlevel, - Z_DEFAULT_STRATEGY); - - if (rc != Z_OK) { - ngx_log_error(NGX_LOG_ALERT, log, 0, "deflateInit2() failed: %d", rc); - goto done; - } - - ngx_log_debug4(NGX_LOG_DEBUG_HTTP, log, 0, - "deflate in: ni:%p no:%p ai:%ud ao:%ud", - zstream.next_in, zstream.next_out, - zstream.avail_in, zstream.avail_out); - - rc = deflate(&zstream, Z_FINISH); - - if (rc != Z_STREAM_END) { - ngx_log_error(NGX_LOG_ALERT, log, 0, - "deflate(Z_FINISH) failed: %d", rc); - goto done; - } - - ngx_log_debug5(NGX_LOG_DEBUG_HTTP, log, 0, - "deflate out: ni:%p no:%p ai:%ud ao:%ud rc:%d", - zstream.next_in, zstream.next_out, - zstream.avail_in, zstream.avail_out, - rc); - - size -= zstream.avail_out; - - rc = deflateEnd(&zstream); - - if (rc != Z_OK) { - ngx_log_error(NGX_LOG_ALERT, log, 0, "deflateEnd() failed: %d", rc); - goto done; - } - - n = ngx_write_fd(fd, out, size); - - if (n != (ssize_t) size) { - err = (n == -1) ? ngx_errno : 0; - - ngx_destroy_pool(pool); - - ngx_set_errno(err); - return -1; - } - -done: - - ngx_destroy_pool(pool); - - /* simulate successful logging */ - return len; -} - - -static void * -ngx_http_log_gzip_alloc(void *opaque, u_int items, u_int size) -{ - ngx_pool_t *pool = opaque; - - ngx_log_debug2(NGX_LOG_DEBUG_HTTP, pool->log, 0, - "gzip alloc: n:%ud s:%ud", items, size); - - return ngx_palloc(pool, items * size); -} - - -static void -ngx_http_log_gzip_free(void *opaque, void *address) -{ -#if 0 - ngx_pool_t *pool = opaque; - - ngx_log_debug1(NGX_LOG_DEBUG_HTTP, pool->log, 0, "gzip free: %p", address); -#endif -} - -#endif - - -static void -ngx_http_log_flush(ngx_open_file_t *file, ngx_log_t *log) -{ - size_t len; - ssize_t n; - ngx_http_log_buf_t *buffer; - - buffer = file->data; - - len = buffer->pos - buffer->start; - - if (len == 0) { - return; - } - -#if (NGX_ZLIB) - if (buffer->gzip) { - n = ngx_http_log_gzip(file->fd, buffer->start, len, buffer->gzip, log); - } else { - n = ngx_write_fd(file->fd, buffer->start, len); - } -#else - n = ngx_write_fd(file->fd, buffer->start, len); -#endif - - if (n == -1) { - ngx_log_error(NGX_LOG_ALERT, log, ngx_errno, - ngx_write_fd_n " to \"%s\" failed", - file->name.data); - - } else if ((size_t) n != len) { - ngx_log_error(NGX_LOG_ALERT, log, 0, - ngx_write_fd_n " to \"%s\" was incomplete: %z of %uz", - file->name.data, n, len); - } - - buffer->pos = buffer->start; - - if (buffer->event && buffer->event->timer_set) { - ngx_del_timer(buffer->event); - } -} - - -static void -ngx_http_log_flush_handler(ngx_event_t *ev) -{ - ngx_log_debug0(NGX_LOG_DEBUG_EVENT, ev->log, 0, - "http log buffer flush handler"); - - ngx_http_log_flush(ev->data, ev->log); -} - - -static u_char * -ngx_http_log_copy_short(ngx_http_request_t *r, u_char *buf, - ngx_http_log_op_t *op) -{ - size_t len; - uintptr_t data; - - len = op->len; - data = op->data; - - while (len--) { - *buf++ = (u_char) (data & 0xff); - data >>= 8; - } - - return buf; -} - - -static u_char * -ngx_http_log_copy_long(ngx_http_request_t *r, u_char *buf, - ngx_http_log_op_t *op) -{ - return ngx_cpymem(buf, (u_char *) op->data, op->len); -} - - -static u_char * -ngx_http_log_pipe(ngx_http_request_t *r, u_char *buf, ngx_http_log_op_t *op) -{ - if (r->pipeline) { - *buf = 'p'; - } else { - *buf = '.'; - } - - return buf + 1; -} - - -static u_char * -ngx_http_log_time(ngx_http_request_t *r, u_char *buf, ngx_http_log_op_t *op) -{ - return ngx_cpymem(buf, ngx_cached_http_log_time.data, - ngx_cached_http_log_time.len); -} - -static u_char * -ngx_http_log_iso8601(ngx_http_request_t *r, u_char *buf, ngx_http_log_op_t *op) -{ - return ngx_cpymem(buf, ngx_cached_http_log_iso8601.data, - ngx_cached_http_log_iso8601.len); -} - -static u_char * -ngx_http_log_msec(ngx_http_request_t *r, u_char *buf, ngx_http_log_op_t *op) -{ - ngx_time_t *tp; - - tp = ngx_timeofday(); - - return ngx_sprintf(buf, "%T.%03M", tp->sec, tp->msec); -} - - -static u_char * -ngx_http_log_request_time(ngx_http_request_t *r, u_char *buf, - ngx_http_log_op_t *op) -{ - ngx_time_t *tp; - ngx_msec_int_t ms; - - tp = ngx_timeofday(); - - ms = (ngx_msec_int_t) - ((tp->sec - r->start_sec) * 1000 + (tp->msec - r->start_msec)); - ms = ngx_max(ms, 0); - - return ngx_sprintf(buf, "%T.%03M", (time_t) ms / 1000, ms % 1000); -} - - -static u_char * -ngx_http_log_status(ngx_http_request_t *r, u_char *buf, ngx_http_log_op_t *op) -{ - ngx_uint_t status; - - if (r->err_status) { - status = r->err_status; - - } else if (r->headers_out.status) { - status = r->headers_out.status; - - } else if (r->http_version == NGX_HTTP_VERSION_9) { - status = 9; - - } else { - status = 0; - } - - return ngx_sprintf(buf, "%03ui", status); -} - - -static u_char * -ngx_http_log_bytes_sent(ngx_http_request_t *r, u_char *buf, - ngx_http_log_op_t *op) -{ - return ngx_sprintf(buf, "%O", r->connection->sent); -} - - -/* - * although there is a real $body_bytes_sent variable, - * this log operation code function is more optimized for logging - */ - -static u_char * -ngx_http_log_body_bytes_sent(ngx_http_request_t *r, u_char *buf, - ngx_http_log_op_t *op) -{ - off_t length; - - length = r->connection->sent - r->header_size; - - if (length > 0) { - return ngx_sprintf(buf, "%O", length); - } - - *buf = '0'; - - return buf + 1; -} - - -static u_char * -ngx_http_log_request_length(ngx_http_request_t *r, u_char *buf, - ngx_http_log_op_t *op) -{ - return ngx_sprintf(buf, "%O", r->request_length); -} - - -static ngx_int_t -ngx_http_log_variable_compile(ngx_conf_t *cf, ngx_http_log_op_t *op, - ngx_str_t *value, ngx_uint_t escape) -{ - ngx_int_t index; - - index = ngx_http_get_variable_index(cf, value); - if (index == NGX_ERROR) { - return NGX_ERROR; - } - - op->len = 0; - - switch (escape) { - case NGX_HTTP_LOG_ESCAPE_JSON: - op->getlen = ngx_http_log_json_variable_getlen; - op->run = ngx_http_log_json_variable; - break; - - case NGX_HTTP_LOG_ESCAPE_NONE: - op->getlen = ngx_http_log_unescaped_variable_getlen; - op->run = ngx_http_log_unescaped_variable; - break; - - default: /* NGX_HTTP_LOG_ESCAPE_DEFAULT */ - op->getlen = ngx_http_log_variable_getlen; - op->run = ngx_http_log_variable; - } - - op->data = index; - - return NGX_OK; -} - - -static size_t -ngx_http_log_variable_getlen(ngx_http_request_t *r, uintptr_t data) -{ - uintptr_t len; - ngx_http_variable_value_t *value; - - value = ngx_http_get_indexed_variable(r, data); - - if (value == NULL || value->not_found) { - return 1; - } - - len = ngx_http_log_escape(NULL, value->data, value->len); - - value->escape = len ? 1 : 0; - - return value->len + len * 3; -} - - -static u_char * -ngx_http_log_variable(ngx_http_request_t *r, u_char *buf, ngx_http_log_op_t *op) -{ - ngx_http_variable_value_t *value; - - value = ngx_http_get_indexed_variable(r, op->data); - - if (value == NULL || value->not_found) { - *buf = '-'; - return buf + 1; - } - - if (value->escape == 0) { - return ngx_cpymem(buf, value->data, value->len); - - } else { - return (u_char *) ngx_http_log_escape(buf, value->data, value->len); - } -} - - -static uintptr_t -ngx_http_log_escape(u_char *dst, u_char *src, size_t size) -{ - ngx_uint_t n; - static u_char hex[] = "0123456789ABCDEF"; - - static uint32_t escape[] = { - 0xffffffff, /* 1111 1111 1111 1111 1111 1111 1111 1111 */ - - /* ?>=< ;:98 7654 3210 /.-, +*)( '&%$ #"! */ - 0x00000004, /* 0000 0000 0000 0000 0000 0000 0000 0100 */ - - /* _^]\ [ZYX WVUT SRQP ONML KJIH GFED CBA@ */ - 0x10000000, /* 0001 0000 0000 0000 0000 0000 0000 0000 */ - - /* ~}| {zyx wvut srqp onml kjih gfed cba` */ - 0x80000000, /* 1000 0000 0000 0000 0000 0000 0000 0000 */ - - 0xffffffff, /* 1111 1111 1111 1111 1111 1111 1111 1111 */ - 0xffffffff, /* 1111 1111 1111 1111 1111 1111 1111 1111 */ - 0xffffffff, /* 1111 1111 1111 1111 1111 1111 1111 1111 */ - 0xffffffff, /* 1111 1111 1111 1111 1111 1111 1111 1111 */ - }; - - - if (dst == NULL) { - - /* find the number of the characters to be escaped */ - - n = 0; - - while (size) { - if (escape[*src >> 5] & (1U << (*src & 0x1f))) { - n++; - } - src++; - size--; - } - - return (uintptr_t) n; - } - - while (size) { - if (escape[*src >> 5] & (1U << (*src & 0x1f))) { - *dst++ = '\\'; - *dst++ = 'x'; - *dst++ = hex[*src >> 4]; - *dst++ = hex[*src & 0xf]; - src++; - - } else { - *dst++ = *src++; - } - size--; - } - - return (uintptr_t) dst; -} - - -static size_t -ngx_http_log_json_variable_getlen(ngx_http_request_t *r, uintptr_t data) -{ - uintptr_t len; - ngx_http_variable_value_t *value; - - value = ngx_http_get_indexed_variable(r, data); - - if (value == NULL || value->not_found) { - return 0; - } - - len = ngx_escape_json(NULL, value->data, value->len); - - value->escape = len ? 1 : 0; - - return value->len + len; -} - - -static u_char * -ngx_http_log_json_variable(ngx_http_request_t *r, u_char *buf, - ngx_http_log_op_t *op) -{ - ngx_http_variable_value_t *value; - - value = ngx_http_get_indexed_variable(r, op->data); - - if (value == NULL || value->not_found) { - return buf; - } - - if (value->escape == 0) { - return ngx_cpymem(buf, value->data, value->len); - - } else { - return (u_char *) ngx_escape_json(buf, value->data, value->len); - } -} - - -static size_t -ngx_http_log_unescaped_variable_getlen(ngx_http_request_t *r, uintptr_t data) -{ - ngx_http_variable_value_t *value; - - value = ngx_http_get_indexed_variable(r, data); - - if (value == NULL || value->not_found) { - return 0; - } - - value->escape = 0; - - return value->len; -} - - -static u_char * -ngx_http_log_unescaped_variable(ngx_http_request_t *r, u_char *buf, - ngx_http_log_op_t *op) -{ - ngx_http_variable_value_t *value; - - value = ngx_http_get_indexed_variable(r, op->data); - - if (value == NULL || value->not_found) { - return buf; - } - - return ngx_cpymem(buf, value->data, value->len); -} - - -static void * -ngx_http_log_create_main_conf(ngx_conf_t *cf) -{ - ngx_http_log_main_conf_t *conf; - - ngx_http_log_fmt_t *fmt; - - conf = ngx_pcalloc(cf->pool, sizeof(ngx_http_log_main_conf_t)); - if (conf == NULL) { - return NULL; - } - - if (ngx_array_init(&conf->formats, cf->pool, 4, sizeof(ngx_http_log_fmt_t)) - != NGX_OK) - { - return NULL; - } - - fmt = ngx_array_push(&conf->formats); - if (fmt == NULL) { - return NULL; - } - - ngx_str_set(&fmt->name, "combined"); - - fmt->flushes = NULL; - - fmt->ops = ngx_array_create(cf->pool, 16, sizeof(ngx_http_log_op_t)); - if (fmt->ops == NULL) { - return NULL; - } - - return conf; -} - - -static void * -ngx_http_log_create_loc_conf(ngx_conf_t *cf) -{ - ngx_http_log_loc_conf_t *conf; - - conf = ngx_pcalloc(cf->pool, sizeof(ngx_http_log_loc_conf_t)); - if (conf == NULL) { - return NULL; - } - - conf->open_file_cache = NGX_CONF_UNSET_PTR; - - return conf; -} - - -static char * -ngx_http_log_merge_loc_conf(ngx_conf_t *cf, void *parent, void *child) -{ - ngx_http_log_loc_conf_t *prev = parent; - ngx_http_log_loc_conf_t *conf = child; - - ngx_http_log_t *log; - ngx_http_log_fmt_t *fmt; - ngx_http_log_main_conf_t *lmcf; - - if (conf->open_file_cache == NGX_CONF_UNSET_PTR) { - - conf->open_file_cache = prev->open_file_cache; - conf->open_file_cache_valid = prev->open_file_cache_valid; - conf->open_file_cache_min_uses = prev->open_file_cache_min_uses; - - if (conf->open_file_cache == NGX_CONF_UNSET_PTR) { - conf->open_file_cache = NULL; - } - } - - if (conf->logs || conf->off) { - return NGX_CONF_OK; - } - - conf->logs = prev->logs; - conf->off = prev->off; - - if (conf->logs || conf->off) { - return NGX_CONF_OK; - } - - conf->logs = ngx_array_create(cf->pool, 2, sizeof(ngx_http_log_t)); - if (conf->logs == NULL) { - return NGX_CONF_ERROR; - } - - log = ngx_array_push(conf->logs); - if (log == NULL) { - return NGX_CONF_ERROR; - } - - ngx_memzero(log, sizeof(ngx_http_log_t)); - - log->file = ngx_conf_open_file(cf->cycle, &ngx_http_access_log); - if (log->file == NULL) { - return NGX_CONF_ERROR; - } - - lmcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_log_module); - fmt = lmcf->formats.elts; - - /* the default "combined" format */ - log->format = &fmt[0]; - lmcf->combined_used = 1; - - return NGX_CONF_OK; -} - - -static char * -ngx_http_log_set_log(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) -{ - ngx_http_log_loc_conf_t *llcf = conf; - - ssize_t size; - ngx_int_t gzip; - ngx_uint_t i, n; - ngx_msec_t flush; - ngx_str_t *value, name, s; - ngx_http_log_t *log; - ngx_syslog_peer_t *peer; - ngx_http_log_buf_t *buffer; - ngx_http_log_fmt_t *fmt; - ngx_http_log_main_conf_t *lmcf; - ngx_http_script_compile_t sc; - ngx_http_compile_complex_value_t ccv; - - value = cf->args->elts; - - if (ngx_strcmp(value[1].data, "off") == 0) { - llcf->off = 1; - if (cf->args->nelts == 2) { - return NGX_CONF_OK; - } - - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "invalid parameter \"%V\"", &value[2]); - return NGX_CONF_ERROR; - } - - if (llcf->logs == NULL) { - llcf->logs = ngx_array_create(cf->pool, 2, sizeof(ngx_http_log_t)); - if (llcf->logs == NULL) { - return NGX_CONF_ERROR; - } - } - - lmcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_log_module); - - log = ngx_array_push(llcf->logs); - if (log == NULL) { - return NGX_CONF_ERROR; - } - - ngx_memzero(log, sizeof(ngx_http_log_t)); - - - if (ngx_strncmp(value[1].data, "syslog:", 7) == 0) { - - peer = ngx_pcalloc(cf->pool, sizeof(ngx_syslog_peer_t)); - if (peer == NULL) { - return NGX_CONF_ERROR; - } - - if (ngx_syslog_process_conf(cf, peer) != NGX_CONF_OK) { - return NGX_CONF_ERROR; - } - - log->syslog_peer = peer; - - goto process_formats; - } - - n = ngx_http_script_variables_count(&value[1]); - - if (n == 0) { - log->file = ngx_conf_open_file(cf->cycle, &value[1]); - if (log->file == NULL) { - return NGX_CONF_ERROR; - } - - } else { - if (ngx_conf_full_name(cf->cycle, &value[1], 0) != NGX_OK) { - return NGX_CONF_ERROR; - } - - log->script = ngx_pcalloc(cf->pool, sizeof(ngx_http_log_script_t)); - if (log->script == NULL) { - return NGX_CONF_ERROR; - } - - ngx_memzero(&sc, sizeof(ngx_http_script_compile_t)); - - sc.cf = cf; - sc.source = &value[1]; - sc.lengths = &log->script->lengths; - sc.values = &log->script->values; - sc.variables = n; - sc.complete_lengths = 1; - sc.complete_values = 1; - - if (ngx_http_script_compile(&sc) != NGX_OK) { - return NGX_CONF_ERROR; - } - } - -process_formats: - - if (cf->args->nelts >= 3) { - name = value[2]; - - if (ngx_strcmp(name.data, "combined") == 0) { - lmcf->combined_used = 1; - } - - } else { - ngx_str_set(&name, "combined"); - lmcf->combined_used = 1; - } - - fmt = lmcf->formats.elts; - for (i = 0; i < lmcf->formats.nelts; i++) { - if (fmt[i].name.len == name.len - && ngx_strcasecmp(fmt[i].name.data, name.data) == 0) - { - log->format = &fmt[i]; - break; - } - } - - if (log->format == NULL) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "unknown log format \"%V\"", &name); - return NGX_CONF_ERROR; - } - - size = 0; - flush = 0; - gzip = 0; - - for (i = 3; i < cf->args->nelts; i++) { - - if (ngx_strncmp(value[i].data, "buffer=", 7) == 0) { - s.len = value[i].len - 7; - s.data = value[i].data + 7; - - size = ngx_parse_size(&s); - - if (size == NGX_ERROR || size == 0) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "invalid buffer size \"%V\"", &s); - return NGX_CONF_ERROR; - } - - continue; - } - - if (ngx_strncmp(value[i].data, "flush=", 6) == 0) { - s.len = value[i].len - 6; - s.data = value[i].data + 6; - - flush = ngx_parse_time(&s, 0); - - if (flush == (ngx_msec_t) NGX_ERROR || flush == 0) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "invalid flush time \"%V\"", &s); - return NGX_CONF_ERROR; - } - - continue; - } - - if (ngx_strncmp(value[i].data, "gzip", 4) == 0 - && (value[i].len == 4 || value[i].data[4] == '=')) - { -#if (NGX_ZLIB) - if (size == 0) { - size = 64 * 1024; - } - - if (value[i].len == 4) { - gzip = Z_BEST_SPEED; - continue; - } - - s.len = value[i].len - 5; - s.data = value[i].data + 5; - - gzip = ngx_atoi(s.data, s.len); - - if (gzip < 1 || gzip > 9) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "invalid compression level \"%V\"", &s); - return NGX_CONF_ERROR; - } - - continue; - -#else - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "nginx was built without zlib support"); - return NGX_CONF_ERROR; -#endif - } - - if (ngx_strncmp(value[i].data, "if=", 3) == 0) { - s.len = value[i].len - 3; - s.data = value[i].data + 3; - - ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t)); - - ccv.cf = cf; - ccv.value = &s; - ccv.complex_value = ngx_palloc(cf->pool, - sizeof(ngx_http_complex_value_t)); - if (ccv.complex_value == NULL) { - return NGX_CONF_ERROR; - } - - if (ngx_http_compile_complex_value(&ccv) != NGX_OK) { - return NGX_CONF_ERROR; - } - - log->filter = ccv.complex_value; - - continue; - } - - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "invalid parameter \"%V\"", &value[i]); - return NGX_CONF_ERROR; - } - - if (flush && size == 0) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "no buffer is defined for access_log \"%V\"", - &value[1]); - return NGX_CONF_ERROR; - } - - if (size) { - - if (log->script) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "buffered logs cannot have variables in name"); - return NGX_CONF_ERROR; - } - - if (log->syslog_peer) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "logs to syslog cannot be buffered"); - return NGX_CONF_ERROR; - } - - if (log->file->data) { - buffer = log->file->data; - - if (buffer->last - buffer->start != size - || buffer->flush != flush - || buffer->gzip != gzip) - { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "access_log \"%V\" already defined " - "with conflicting parameters", - &value[1]); - return NGX_CONF_ERROR; - } - - return NGX_CONF_OK; - } - - buffer = ngx_pcalloc(cf->pool, sizeof(ngx_http_log_buf_t)); - if (buffer == NULL) { - return NGX_CONF_ERROR; - } - - buffer->start = ngx_pnalloc(cf->pool, size); - if (buffer->start == NULL) { - return NGX_CONF_ERROR; - } - - buffer->pos = buffer->start; - buffer->last = buffer->start + size; - - if (flush) { - buffer->event = ngx_pcalloc(cf->pool, sizeof(ngx_event_t)); - if (buffer->event == NULL) { - return NGX_CONF_ERROR; - } - - buffer->event->data = log->file; - buffer->event->handler = ngx_http_log_flush_handler; - buffer->event->log = &cf->cycle->new_log; - buffer->event->cancelable = 1; - - buffer->flush = flush; - } - - buffer->gzip = gzip; - - log->file->flush = ngx_http_log_flush; - log->file->data = buffer; - } - - return NGX_CONF_OK; -} - - -static char * -ngx_http_log_set_format(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) -{ - ngx_http_log_main_conf_t *lmcf = conf; - - ngx_str_t *value; - ngx_uint_t i; - ngx_http_log_fmt_t *fmt; - - value = cf->args->elts; - - fmt = lmcf->formats.elts; - for (i = 0; i < lmcf->formats.nelts; i++) { - if (fmt[i].name.len == value[1].len - && ngx_strcmp(fmt[i].name.data, value[1].data) == 0) - { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "duplicate \"log_format\" name \"%V\"", - &value[1]); - return NGX_CONF_ERROR; - } - } - - fmt = ngx_array_push(&lmcf->formats); - if (fmt == NULL) { - return NGX_CONF_ERROR; - } - - fmt->name = value[1]; - - fmt->flushes = ngx_array_create(cf->pool, 4, sizeof(ngx_int_t)); - if (fmt->flushes == NULL) { - return NGX_CONF_ERROR; - } - - fmt->ops = ngx_array_create(cf->pool, 16, sizeof(ngx_http_log_op_t)); - if (fmt->ops == NULL) { - return NGX_CONF_ERROR; - } - - return ngx_http_log_compile_format(cf, fmt->flushes, fmt->ops, cf->args, 2); -} - - -static char * -ngx_http_log_compile_format(ngx_conf_t *cf, ngx_array_t *flushes, - ngx_array_t *ops, ngx_array_t *args, ngx_uint_t s) -{ - u_char *data, *p, ch; - size_t i, len; - ngx_str_t *value, var; - ngx_int_t *flush; - ngx_uint_t bracket, escape; - ngx_http_log_op_t *op; - ngx_http_log_var_t *v; - - escape = NGX_HTTP_LOG_ESCAPE_DEFAULT; - value = args->elts; - - if (s < args->nelts && ngx_strncmp(value[s].data, "escape=", 7) == 0) { - data = value[s].data + 7; - - if (ngx_strcmp(data, "json") == 0) { - escape = NGX_HTTP_LOG_ESCAPE_JSON; - - } else if (ngx_strcmp(data, "none") == 0) { - escape = NGX_HTTP_LOG_ESCAPE_NONE; - - } else if (ngx_strcmp(data, "default") != 0) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "unknown log format escaping \"%s\"", data); - return NGX_CONF_ERROR; - } - - s++; - } - - for ( /* void */ ; s < args->nelts; s++) { - - i = 0; - - while (i < value[s].len) { - - op = ngx_array_push(ops); - if (op == NULL) { - return NGX_CONF_ERROR; - } - - data = &value[s].data[i]; - - if (value[s].data[i] == '$') { - - if (++i == value[s].len) { - goto invalid; - } - - if (value[s].data[i] == '{') { - bracket = 1; - - if (++i == value[s].len) { - goto invalid; - } - - var.data = &value[s].data[i]; - - } else { - bracket = 0; - var.data = &value[s].data[i]; - } - - for (var.len = 0; i < value[s].len; i++, var.len++) { - ch = value[s].data[i]; - - if (ch == '}' && bracket) { - i++; - bracket = 0; - break; - } - - if ((ch >= 'A' && ch <= 'Z') - || (ch >= 'a' && ch <= 'z') - || (ch >= '0' && ch <= '9') - || ch == '_') - { - continue; - } - - break; - } - - if (bracket) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "the closing bracket in \"%V\" " - "variable is missing", &var); - return NGX_CONF_ERROR; - } - - if (var.len == 0) { - goto invalid; - } - - for (v = ngx_http_log_vars; v->name.len; v++) { - - if (v->name.len == var.len - && ngx_strncmp(v->name.data, var.data, var.len) == 0) - { - op->len = v->len; - op->getlen = NULL; - op->run = v->run; - op->data = 0; - - goto found; - } - } - - if (ngx_http_log_variable_compile(cf, op, &var, escape) - != NGX_OK) - { - return NGX_CONF_ERROR; - } - - if (flushes) { - - flush = ngx_array_push(flushes); - if (flush == NULL) { - return NGX_CONF_ERROR; - } - - *flush = op->data; /* variable index */ - } - - found: - - continue; - } - - i++; - - while (i < value[s].len && value[s].data[i] != '$') { - i++; - } - - len = &value[s].data[i] - data; - - if (len) { - - op->len = len; - op->getlen = NULL; - - if (len <= sizeof(uintptr_t)) { - op->run = ngx_http_log_copy_short; - op->data = 0; - - while (len--) { - op->data <<= 8; - op->data |= data[len]; - } - - } else { - op->run = ngx_http_log_copy_long; - - p = ngx_pnalloc(cf->pool, len); - if (p == NULL) { - return NGX_CONF_ERROR; - } - - ngx_memcpy(p, data, len); - op->data = (uintptr_t) p; - } - } - } - } - - return NGX_CONF_OK; - -invalid: - - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, "invalid parameter \"%s\"", data); - - return NGX_CONF_ERROR; -} - - -static char * -ngx_http_log_open_file_cache(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) -{ - ngx_http_log_loc_conf_t *llcf = conf; - - time_t inactive, valid; - ngx_str_t *value, s; - ngx_int_t max, min_uses; - ngx_uint_t i; - - if (llcf->open_file_cache != NGX_CONF_UNSET_PTR) { - return "is duplicate"; - } - - value = cf->args->elts; - - max = 0; - inactive = 10; - valid = 60; - min_uses = 1; - - for (i = 1; i < cf->args->nelts; i++) { - - if (ngx_strncmp(value[i].data, "max=", 4) == 0) { - - max = ngx_atoi(value[i].data + 4, value[i].len - 4); - if (max == NGX_ERROR) { - goto failed; - } - - continue; - } - - if (ngx_strncmp(value[i].data, "inactive=", 9) == 0) { - - s.len = value[i].len - 9; - s.data = value[i].data + 9; - - inactive = ngx_parse_time(&s, 1); - if (inactive == (time_t) NGX_ERROR) { - goto failed; - } - - continue; - } - - if (ngx_strncmp(value[i].data, "min_uses=", 9) == 0) { - - min_uses = ngx_atoi(value[i].data + 9, value[i].len - 9); - if (min_uses == NGX_ERROR) { - goto failed; - } - - continue; - } - - if (ngx_strncmp(value[i].data, "valid=", 6) == 0) { - - s.len = value[i].len - 6; - s.data = value[i].data + 6; - - valid = ngx_parse_time(&s, 1); - if (valid == (time_t) NGX_ERROR) { - goto failed; - } - - continue; - } - - if (ngx_strcmp(value[i].data, "off") == 0) { - - llcf->open_file_cache = NULL; - - continue; - } - - failed: - - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "invalid \"open_log_file_cache\" parameter \"%V\"", - &value[i]); - return NGX_CONF_ERROR; - } - - if (llcf->open_file_cache == NULL) { - return NGX_CONF_OK; - } - - if (max == 0) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "\"open_log_file_cache\" must have \"max\" parameter"); - return NGX_CONF_ERROR; - } - - llcf->open_file_cache = ngx_open_file_cache_init(cf->pool, max, inactive); - - if (llcf->open_file_cache) { - - llcf->open_file_cache_valid = valid; - llcf->open_file_cache_min_uses = min_uses; - - return NGX_CONF_OK; - } - - return NGX_CONF_ERROR; -} - - -static ngx_int_t -ngx_http_log_init(ngx_conf_t *cf) -{ - ngx_str_t *value; - ngx_array_t a; - ngx_http_handler_pt *h; - ngx_http_log_fmt_t *fmt; - ngx_http_log_main_conf_t *lmcf; - ngx_http_core_main_conf_t *cmcf; - - lmcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_log_module); - - if (lmcf->combined_used) { - if (ngx_array_init(&a, cf->pool, 1, sizeof(ngx_str_t)) != NGX_OK) { - return NGX_ERROR; - } - - value = ngx_array_push(&a); - if (value == NULL) { - return NGX_ERROR; - } - - *value = ngx_http_combined_fmt; - fmt = lmcf->formats.elts; - - if (ngx_http_log_compile_format(cf, NULL, fmt->ops, &a, 0) - != NGX_CONF_OK) - { - return NGX_ERROR; - } - } - - cmcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_core_module); - - h = ngx_array_push(&cmcf->phases[NGX_HTTP_LOG_PHASE].handlers); - if (h == NULL) { - return NGX_ERROR; - } - - *h = ngx_http_log_handler; - - return NGX_OK; -} diff --git a/src/deps/src/nginx-1.30.3/src/http/modules/ngx_http_map_module.c b/src/deps/src/nginx-1.30.3/src/http/modules/ngx_http_map_module.c deleted file mode 100644 index 2fc9be90b7..0000000000 --- a/src/deps/src/nginx-1.30.3/src/http/modules/ngx_http_map_module.c +++ /dev/null @@ -1,589 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#include -#include -#include - - -typedef struct { - ngx_uint_t hash_max_size; - ngx_uint_t hash_bucket_size; -} ngx_http_map_conf_t; - - -typedef struct { - ngx_hash_keys_arrays_t keys; - - ngx_array_t *values_hash; -#if (NGX_PCRE) - ngx_array_t regexes; -#endif - - ngx_http_variable_value_t *default_value; - ngx_conf_t *cf; - unsigned hostnames:1; - unsigned no_cacheable:1; -} ngx_http_map_conf_ctx_t; - - -typedef struct { - ngx_http_map_t map; - ngx_http_complex_value_t value; - ngx_http_variable_value_t *default_value; - ngx_uint_t hostnames; /* unsigned hostnames:1 */ -} ngx_http_map_ctx_t; - - -static int ngx_libc_cdecl ngx_http_map_cmp_dns_wildcards(const void *one, - const void *two); -static void *ngx_http_map_create_conf(ngx_conf_t *cf); -static char *ngx_http_map_block(ngx_conf_t *cf, ngx_command_t *cmd, void *conf); -static char *ngx_http_map(ngx_conf_t *cf, ngx_command_t *dummy, void *conf); - - -static ngx_command_t ngx_http_map_commands[] = { - - { ngx_string("map"), - NGX_HTTP_MAIN_CONF|NGX_CONF_BLOCK|NGX_CONF_TAKE2, - ngx_http_map_block, - NGX_HTTP_MAIN_CONF_OFFSET, - 0, - NULL }, - - { ngx_string("map_hash_max_size"), - NGX_HTTP_MAIN_CONF|NGX_CONF_TAKE1, - ngx_conf_set_num_slot, - NGX_HTTP_MAIN_CONF_OFFSET, - offsetof(ngx_http_map_conf_t, hash_max_size), - NULL }, - - { ngx_string("map_hash_bucket_size"), - NGX_HTTP_MAIN_CONF|NGX_CONF_TAKE1, - ngx_conf_set_num_slot, - NGX_HTTP_MAIN_CONF_OFFSET, - offsetof(ngx_http_map_conf_t, hash_bucket_size), - NULL }, - - ngx_null_command -}; - - -static ngx_http_module_t ngx_http_map_module_ctx = { - NULL, /* preconfiguration */ - NULL, /* postconfiguration */ - - ngx_http_map_create_conf, /* create main configuration */ - NULL, /* init main configuration */ - - NULL, /* create server configuration */ - NULL, /* merge server configuration */ - - NULL, /* create location configuration */ - NULL /* merge location configuration */ -}; - - -ngx_module_t ngx_http_map_module = { - NGX_MODULE_V1, - &ngx_http_map_module_ctx, /* module context */ - ngx_http_map_commands, /* module directives */ - NGX_HTTP_MODULE, /* module type */ - NULL, /* init master */ - NULL, /* init module */ - NULL, /* init process */ - NULL, /* init thread */ - NULL, /* exit thread */ - NULL, /* exit process */ - NULL, /* exit master */ - NGX_MODULE_V1_PADDING -}; - - -static ngx_int_t -ngx_http_map_variable(ngx_http_request_t *r, ngx_http_variable_value_t *v, - uintptr_t data) -{ - ngx_http_map_ctx_t *map = (ngx_http_map_ctx_t *) data; - - ngx_str_t val, str; - ngx_http_complex_value_t *cv; - ngx_http_variable_value_t *value; - - ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "http map started"); - - if (ngx_http_complex_value(r, &map->value, &val) != NGX_OK) { - return NGX_ERROR; - } - - if (map->hostnames && val.len > 0 && val.data[val.len - 1] == '.') { - val.len--; - } - - value = ngx_http_map_find(r, &map->map, &val); - - if (value == NULL) { - value = map->default_value; - } - - if (!value->valid) { - cv = (ngx_http_complex_value_t *) value->data; - - if (ngx_http_complex_value(r, cv, &str) != NGX_OK) { - return NGX_ERROR; - } - - v->valid = 1; - v->no_cacheable = 0; - v->not_found = 0; - v->len = str.len; - v->data = str.data; - - } else { - *v = *value; - } - - ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "http map: \"%V\" \"%v\"", &val, v); - - return NGX_OK; -} - - -static void * -ngx_http_map_create_conf(ngx_conf_t *cf) -{ - ngx_http_map_conf_t *mcf; - - mcf = ngx_palloc(cf->pool, sizeof(ngx_http_map_conf_t)); - if (mcf == NULL) { - return NULL; - } - - mcf->hash_max_size = NGX_CONF_UNSET_UINT; - mcf->hash_bucket_size = NGX_CONF_UNSET_UINT; - - return mcf; -} - - -static char * -ngx_http_map_block(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) -{ - ngx_http_map_conf_t *mcf = conf; - - char *rv; - ngx_str_t *value, name; - ngx_conf_t save; - ngx_pool_t *pool; - ngx_hash_init_t hash; - ngx_http_map_ctx_t *map; - ngx_http_variable_t *var; - ngx_http_map_conf_ctx_t ctx; - ngx_http_compile_complex_value_t ccv; - - if (mcf->hash_max_size == NGX_CONF_UNSET_UINT) { - mcf->hash_max_size = 2048; - } - - if (mcf->hash_bucket_size == NGX_CONF_UNSET_UINT) { - mcf->hash_bucket_size = ngx_cacheline_size; - - } else { - mcf->hash_bucket_size = ngx_align(mcf->hash_bucket_size, - ngx_cacheline_size); - } - - map = ngx_pcalloc(cf->pool, sizeof(ngx_http_map_ctx_t)); - if (map == NULL) { - return NGX_CONF_ERROR; - } - - value = cf->args->elts; - - ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t)); - - ccv.cf = cf; - ccv.value = &value[1]; - ccv.complex_value = &map->value; - - if (ngx_http_compile_complex_value(&ccv) != NGX_OK) { - return NGX_CONF_ERROR; - } - - name = value[2]; - - if (name.data[0] != '$') { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "invalid variable name \"%V\"", &name); - return NGX_CONF_ERROR; - } - - name.len--; - name.data++; - - var = ngx_http_add_variable(cf, &name, NGX_HTTP_VAR_CHANGEABLE); - if (var == NULL) { - return NGX_CONF_ERROR; - } - - var->get_handler = ngx_http_map_variable; - var->data = (uintptr_t) map; - - pool = ngx_create_pool(NGX_DEFAULT_POOL_SIZE, cf->log); - if (pool == NULL) { - return NGX_CONF_ERROR; - } - - ctx.keys.pool = cf->pool; - ctx.keys.temp_pool = pool; - - if (ngx_hash_keys_array_init(&ctx.keys, NGX_HASH_LARGE) != NGX_OK) { - ngx_destroy_pool(pool); - return NGX_CONF_ERROR; - } - - ctx.values_hash = ngx_pcalloc(pool, sizeof(ngx_array_t) * ctx.keys.hsize); - if (ctx.values_hash == NULL) { - ngx_destroy_pool(pool); - return NGX_CONF_ERROR; - } - -#if (NGX_PCRE) - if (ngx_array_init(&ctx.regexes, cf->pool, 2, sizeof(ngx_http_map_regex_t)) - != NGX_OK) - { - ngx_destroy_pool(pool); - return NGX_CONF_ERROR; - } -#endif - - ctx.default_value = NULL; - ctx.cf = &save; - ctx.hostnames = 0; - ctx.no_cacheable = 0; - - save = *cf; - cf->pool = pool; - cf->ctx = &ctx; - cf->handler = ngx_http_map; - cf->handler_conf = conf; - - rv = ngx_conf_parse(cf, NULL); - - *cf = save; - - if (rv != NGX_CONF_OK) { - ngx_destroy_pool(pool); - return rv; - } - - if (ctx.no_cacheable) { - var->flags |= NGX_HTTP_VAR_NOCACHEABLE; - } - - map->default_value = ctx.default_value ? ctx.default_value: - &ngx_http_variable_null_value; - - map->hostnames = ctx.hostnames; - - hash.key = ngx_hash_key_lc; - hash.max_size = mcf->hash_max_size; - hash.bucket_size = mcf->hash_bucket_size; - hash.name = "map_hash"; - hash.pool = cf->pool; - - if (ctx.keys.keys.nelts) { - hash.hash = &map->map.hash.hash; - hash.temp_pool = NULL; - - if (ngx_hash_init(&hash, ctx.keys.keys.elts, ctx.keys.keys.nelts) - != NGX_OK) - { - ngx_destroy_pool(pool); - return NGX_CONF_ERROR; - } - } - - if (ctx.keys.dns_wc_head.nelts) { - - ngx_qsort(ctx.keys.dns_wc_head.elts, - (size_t) ctx.keys.dns_wc_head.nelts, - sizeof(ngx_hash_key_t), ngx_http_map_cmp_dns_wildcards); - - hash.hash = NULL; - hash.temp_pool = pool; - - if (ngx_hash_wildcard_init(&hash, ctx.keys.dns_wc_head.elts, - ctx.keys.dns_wc_head.nelts) - != NGX_OK) - { - ngx_destroy_pool(pool); - return NGX_CONF_ERROR; - } - - map->map.hash.wc_head = (ngx_hash_wildcard_t *) hash.hash; - } - - if (ctx.keys.dns_wc_tail.nelts) { - - ngx_qsort(ctx.keys.dns_wc_tail.elts, - (size_t) ctx.keys.dns_wc_tail.nelts, - sizeof(ngx_hash_key_t), ngx_http_map_cmp_dns_wildcards); - - hash.hash = NULL; - hash.temp_pool = pool; - - if (ngx_hash_wildcard_init(&hash, ctx.keys.dns_wc_tail.elts, - ctx.keys.dns_wc_tail.nelts) - != NGX_OK) - { - ngx_destroy_pool(pool); - return NGX_CONF_ERROR; - } - - map->map.hash.wc_tail = (ngx_hash_wildcard_t *) hash.hash; - } - -#if (NGX_PCRE) - - if (ctx.regexes.nelts) { - map->map.regex = ctx.regexes.elts; - map->map.nregex = ctx.regexes.nelts; - } - -#endif - - ngx_destroy_pool(pool); - - return rv; -} - - -static int ngx_libc_cdecl -ngx_http_map_cmp_dns_wildcards(const void *one, const void *two) -{ - ngx_hash_key_t *first, *second; - - first = (ngx_hash_key_t *) one; - second = (ngx_hash_key_t *) two; - - return ngx_dns_strcmp(first->key.data, second->key.data); -} - - -static char * -ngx_http_map(ngx_conf_t *cf, ngx_command_t *dummy, void *conf) -{ - u_char *data; - size_t len; - ngx_int_t rv; - ngx_str_t *value, v; - ngx_uint_t i, key; - ngx_http_map_conf_ctx_t *ctx; - ngx_http_complex_value_t cv, *cvp; - ngx_http_variable_value_t *var, **vp; - ngx_http_compile_complex_value_t ccv; - - ctx = cf->ctx; - - value = cf->args->elts; - - if (cf->args->nelts == 1 - && ngx_strcmp(value[0].data, "hostnames") == 0) - { - ctx->hostnames = 1; - return NGX_CONF_OK; - } - - if (cf->args->nelts == 1 - && ngx_strcmp(value[0].data, "volatile") == 0) - { - ctx->no_cacheable = 1; - return NGX_CONF_OK; - } - - if (cf->args->nelts != 2) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "invalid number of the map parameters"); - return NGX_CONF_ERROR; - } - - if (ngx_strcmp(value[0].data, "include") == 0) { - return ngx_conf_include(cf, dummy, conf); - } - - key = 0; - - for (i = 0; i < value[1].len; i++) { - key = ngx_hash(key, value[1].data[i]); - } - - key %= ctx->keys.hsize; - - vp = ctx->values_hash[key].elts; - - if (vp) { - for (i = 0; i < ctx->values_hash[key].nelts; i++) { - - if (vp[i]->valid) { - data = vp[i]->data; - len = vp[i]->len; - - } else { - cvp = (ngx_http_complex_value_t *) vp[i]->data; - data = cvp->value.data; - len = cvp->value.len; - } - - if (value[1].len != len) { - continue; - } - - if (ngx_strncmp(value[1].data, data, len) == 0) { - var = vp[i]; - goto found; - } - } - - } else { - if (ngx_array_init(&ctx->values_hash[key], cf->pool, 4, - sizeof(ngx_http_variable_value_t *)) - != NGX_OK) - { - return NGX_CONF_ERROR; - } - } - - var = ngx_palloc(ctx->keys.pool, sizeof(ngx_http_variable_value_t)); - if (var == NULL) { - return NGX_CONF_ERROR; - } - - v.len = value[1].len; - v.data = ngx_pstrdup(ctx->keys.pool, &value[1]); - if (v.data == NULL) { - return NGX_CONF_ERROR; - } - - ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t)); - - ccv.cf = ctx->cf; - ccv.value = &v; - ccv.complex_value = &cv; - - if (ngx_http_compile_complex_value(&ccv) != NGX_OK) { - return NGX_CONF_ERROR; - } - - if (cv.lengths != NULL) { - cvp = ngx_palloc(ctx->keys.pool, sizeof(ngx_http_complex_value_t)); - if (cvp == NULL) { - return NGX_CONF_ERROR; - } - - *cvp = cv; - - var->len = 0; - var->data = (u_char *) cvp; - var->valid = 0; - - } else { - var->len = v.len; - var->data = v.data; - var->valid = 1; - } - - var->no_cacheable = 0; - var->not_found = 0; - - vp = ngx_array_push(&ctx->values_hash[key]); - if (vp == NULL) { - return NGX_CONF_ERROR; - } - - *vp = var; - -found: - - if (ngx_strcmp(value[0].data, "default") == 0) { - - if (ctx->default_value) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "duplicate default map parameter"); - return NGX_CONF_ERROR; - } - - ctx->default_value = var; - - return NGX_CONF_OK; - } - -#if (NGX_PCRE) - - if (value[0].len && value[0].data[0] == '~') { - ngx_regex_compile_t rc; - ngx_http_map_regex_t *regex; - u_char errstr[NGX_MAX_CONF_ERRSTR]; - - regex = ngx_array_push(&ctx->regexes); - if (regex == NULL) { - return NGX_CONF_ERROR; - } - - value[0].len--; - value[0].data++; - - ngx_memzero(&rc, sizeof(ngx_regex_compile_t)); - - if (value[0].data[0] == '*') { - value[0].len--; - value[0].data++; - rc.options = NGX_REGEX_CASELESS; - } - - rc.pattern = value[0]; - rc.err.len = NGX_MAX_CONF_ERRSTR; - rc.err.data = errstr; - - regex->regex = ngx_http_regex_compile(ctx->cf, &rc); - if (regex->regex == NULL) { - return NGX_CONF_ERROR; - } - - regex->value = var; - - return NGX_CONF_OK; - } - -#endif - - if (value[0].len && value[0].data[0] == '\\') { - value[0].len--; - value[0].data++; - } - - rv = ngx_hash_add_key(&ctx->keys, &value[0], var, - (ctx->hostnames) ? NGX_HASH_WILDCARD_KEY : 0); - - if (rv == NGX_OK) { - return NGX_CONF_OK; - } - - if (rv == NGX_DECLINED) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "invalid hostname or wildcard \"%V\"", &value[0]); - } - - if (rv == NGX_BUSY) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "conflicting parameter \"%V\"", &value[0]); - } - - return NGX_CONF_ERROR; -} diff --git a/src/deps/src/nginx-1.30.3/src/http/modules/ngx_http_memcached_module.c b/src/deps/src/nginx-1.30.3/src/http/modules/ngx_http_memcached_module.c deleted file mode 100644 index 11bbd91659..0000000000 --- a/src/deps/src/nginx-1.30.3/src/http/modules/ngx_http_memcached_module.c +++ /dev/null @@ -1,736 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#include -#include -#include - - -typedef struct { - ngx_http_upstream_conf_t upstream; - ngx_int_t index; - ngx_uint_t gzip_flag; -} ngx_http_memcached_loc_conf_t; - - -typedef struct { - size_t rest; - ngx_http_request_t *request; - ngx_str_t key; -} ngx_http_memcached_ctx_t; - - -static ngx_int_t ngx_http_memcached_create_request(ngx_http_request_t *r); -static ngx_int_t ngx_http_memcached_reinit_request(ngx_http_request_t *r); -static ngx_int_t ngx_http_memcached_process_header(ngx_http_request_t *r); -static ngx_int_t ngx_http_memcached_filter_init(void *data); -static ngx_int_t ngx_http_memcached_filter(void *data, ssize_t bytes); -static void ngx_http_memcached_abort_request(ngx_http_request_t *r); -static void ngx_http_memcached_finalize_request(ngx_http_request_t *r, - ngx_int_t rc); - -static void *ngx_http_memcached_create_loc_conf(ngx_conf_t *cf); -static char *ngx_http_memcached_merge_loc_conf(ngx_conf_t *cf, - void *parent, void *child); - -static char *ngx_http_memcached_pass(ngx_conf_t *cf, ngx_command_t *cmd, - void *conf); - - -static ngx_conf_bitmask_t ngx_http_memcached_next_upstream_masks[] = { - { ngx_string("error"), NGX_HTTP_UPSTREAM_FT_ERROR }, - { ngx_string("timeout"), NGX_HTTP_UPSTREAM_FT_TIMEOUT }, - { ngx_string("invalid_response"), NGX_HTTP_UPSTREAM_FT_INVALID_HEADER }, - { ngx_string("not_found"), NGX_HTTP_UPSTREAM_FT_HTTP_404 }, - { ngx_string("off"), NGX_HTTP_UPSTREAM_FT_OFF }, - { ngx_null_string, 0 } -}; - - -static ngx_command_t ngx_http_memcached_commands[] = { - - { ngx_string("memcached_pass"), - NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF|NGX_CONF_TAKE1, - ngx_http_memcached_pass, - NGX_HTTP_LOC_CONF_OFFSET, - 0, - NULL }, - - { ngx_string("memcached_bind"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE12, - ngx_http_upstream_bind_set_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_memcached_loc_conf_t, upstream.local), - NULL }, - - { ngx_string("memcached_socket_keepalive"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG, - ngx_conf_set_flag_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_memcached_loc_conf_t, upstream.socket_keepalive), - NULL }, - - { ngx_string("memcached_connect_timeout"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1, - ngx_conf_set_msec_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_memcached_loc_conf_t, upstream.connect_timeout), - NULL }, - - { ngx_string("memcached_send_timeout"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1, - ngx_conf_set_msec_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_memcached_loc_conf_t, upstream.send_timeout), - NULL }, - - { ngx_string("memcached_buffer_size"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1, - ngx_conf_set_size_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_memcached_loc_conf_t, upstream.buffer_size), - NULL }, - - { ngx_string("memcached_read_timeout"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1, - ngx_conf_set_msec_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_memcached_loc_conf_t, upstream.read_timeout), - NULL }, - - { ngx_string("memcached_next_upstream"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE, - ngx_conf_set_bitmask_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_memcached_loc_conf_t, upstream.next_upstream), - &ngx_http_memcached_next_upstream_masks }, - - { ngx_string("memcached_next_upstream_tries"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1, - ngx_conf_set_num_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_memcached_loc_conf_t, upstream.next_upstream_tries), - NULL }, - - { ngx_string("memcached_next_upstream_timeout"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1, - ngx_conf_set_msec_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_memcached_loc_conf_t, upstream.next_upstream_timeout), - NULL }, - - { ngx_string("memcached_gzip_flag"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1, - ngx_conf_set_num_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_memcached_loc_conf_t, gzip_flag), - NULL }, - - ngx_null_command -}; - - -static ngx_http_module_t ngx_http_memcached_module_ctx = { - NULL, /* preconfiguration */ - NULL, /* postconfiguration */ - - NULL, /* create main configuration */ - NULL, /* init main configuration */ - - NULL, /* create server configuration */ - NULL, /* merge server configuration */ - - ngx_http_memcached_create_loc_conf, /* create location configuration */ - ngx_http_memcached_merge_loc_conf /* merge location configuration */ -}; - - -ngx_module_t ngx_http_memcached_module = { - NGX_MODULE_V1, - &ngx_http_memcached_module_ctx, /* module context */ - ngx_http_memcached_commands, /* module directives */ - NGX_HTTP_MODULE, /* module type */ - NULL, /* init master */ - NULL, /* init module */ - NULL, /* init process */ - NULL, /* init thread */ - NULL, /* exit thread */ - NULL, /* exit process */ - NULL, /* exit master */ - NGX_MODULE_V1_PADDING -}; - - -static ngx_str_t ngx_http_memcached_key = ngx_string("memcached_key"); - - -#define NGX_HTTP_MEMCACHED_END (sizeof(ngx_http_memcached_end) - 1) -static u_char ngx_http_memcached_end[] = CRLF "END" CRLF; - - -static ngx_int_t -ngx_http_memcached_handler(ngx_http_request_t *r) -{ - ngx_int_t rc; - ngx_http_upstream_t *u; - ngx_http_memcached_ctx_t *ctx; - ngx_http_memcached_loc_conf_t *mlcf; - - if (!(r->method & (NGX_HTTP_GET|NGX_HTTP_HEAD))) { - return NGX_HTTP_NOT_ALLOWED; - } - - rc = ngx_http_discard_request_body(r); - - if (rc != NGX_OK) { - return rc; - } - - if (ngx_http_set_content_type(r) != NGX_OK) { - return NGX_HTTP_INTERNAL_SERVER_ERROR; - } - - if (ngx_http_upstream_create(r) != NGX_OK) { - return NGX_HTTP_INTERNAL_SERVER_ERROR; - } - - u = r->upstream; - - ngx_str_set(&u->schema, "memcached://"); - u->output.tag = (ngx_buf_tag_t) &ngx_http_memcached_module; - - mlcf = ngx_http_get_module_loc_conf(r, ngx_http_memcached_module); - - u->conf = &mlcf->upstream; - - u->create_request = ngx_http_memcached_create_request; - u->reinit_request = ngx_http_memcached_reinit_request; - u->process_header = ngx_http_memcached_process_header; - u->abort_request = ngx_http_memcached_abort_request; - u->finalize_request = ngx_http_memcached_finalize_request; - - ctx = ngx_palloc(r->pool, sizeof(ngx_http_memcached_ctx_t)); - if (ctx == NULL) { - return NGX_HTTP_INTERNAL_SERVER_ERROR; - } - - ctx->request = r; - - ngx_http_set_ctx(r, ctx, ngx_http_memcached_module); - - u->input_filter_init = ngx_http_memcached_filter_init; - u->input_filter = ngx_http_memcached_filter; - u->input_filter_ctx = ctx; - - r->main->count++; - - ngx_http_upstream_init(r); - - return NGX_DONE; -} - - -static ngx_int_t -ngx_http_memcached_create_request(ngx_http_request_t *r) -{ - size_t len; - uintptr_t escape; - ngx_buf_t *b; - ngx_chain_t *cl; - ngx_http_memcached_ctx_t *ctx; - ngx_http_variable_value_t *vv; - ngx_http_memcached_loc_conf_t *mlcf; - - mlcf = ngx_http_get_module_loc_conf(r, ngx_http_memcached_module); - - vv = ngx_http_get_indexed_variable(r, mlcf->index); - - if (vv == NULL || vv->not_found || vv->len == 0) { - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "the \"$memcached_key\" variable is not set"); - return NGX_ERROR; - } - - escape = 2 * ngx_escape_uri(NULL, vv->data, vv->len, NGX_ESCAPE_MEMCACHED); - - len = sizeof("get ") - 1 + vv->len + escape + sizeof(CRLF) - 1; - - b = ngx_create_temp_buf(r->pool, len); - if (b == NULL) { - return NGX_ERROR; - } - - cl = ngx_alloc_chain_link(r->pool); - if (cl == NULL) { - return NGX_ERROR; - } - - cl->buf = b; - cl->next = NULL; - - r->upstream->request_bufs = cl; - - *b->last++ = 'g'; *b->last++ = 'e'; *b->last++ = 't'; *b->last++ = ' '; - - ctx = ngx_http_get_module_ctx(r, ngx_http_memcached_module); - - ctx->key.data = b->last; - - if (escape == 0) { - b->last = ngx_copy(b->last, vv->data, vv->len); - - } else { - b->last = (u_char *) ngx_escape_uri(b->last, vv->data, vv->len, - NGX_ESCAPE_MEMCACHED); - } - - ctx->key.len = b->last - ctx->key.data; - - ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "http memcached request: \"%V\"", &ctx->key); - - *b->last++ = CR; *b->last++ = LF; - - return NGX_OK; -} - - -static ngx_int_t -ngx_http_memcached_reinit_request(ngx_http_request_t *r) -{ - return NGX_OK; -} - - -static ngx_int_t -ngx_http_memcached_process_header(ngx_http_request_t *r) -{ - u_char *p, *start; - ngx_str_t line; - ngx_uint_t flags; - ngx_table_elt_t *h; - ngx_http_upstream_t *u; - ngx_http_memcached_ctx_t *ctx; - ngx_http_memcached_loc_conf_t *mlcf; - - u = r->upstream; - - for (p = u->buffer.pos; p < u->buffer.last; p++) { - if (*p == LF) { - goto found; - } - } - - return NGX_AGAIN; - -found: - - line.data = u->buffer.pos; - line.len = p - u->buffer.pos; - - if (line.len == 0 || *(p - 1) != CR) { - goto no_valid; - } - - *p = '\0'; - line.len--; - - ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "memcached: \"%V\"", &line); - - p = u->buffer.pos; - - ctx = ngx_http_get_module_ctx(r, ngx_http_memcached_module); - mlcf = ngx_http_get_module_loc_conf(r, ngx_http_memcached_module); - - if (ngx_strncmp(p, "VALUE ", sizeof("VALUE ") - 1) == 0) { - - p += sizeof("VALUE ") - 1; - - if (ngx_strncmp(p, ctx->key.data, ctx->key.len) != 0) { - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "memcached sent invalid key in response \"%V\" " - "for key \"%V\"", - &line, &ctx->key); - - return NGX_HTTP_UPSTREAM_INVALID_HEADER; - } - - p += ctx->key.len; - - if (*p++ != ' ') { - goto no_valid; - } - - /* flags */ - - start = p; - - while (*p) { - if (*p++ == ' ') { - if (mlcf->gzip_flag) { - goto flags; - } else { - goto length; - } - } - } - - goto no_valid; - - flags: - - flags = ngx_atoi(start, p - start - 1); - - if (flags == (ngx_uint_t) NGX_ERROR) { - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "memcached sent invalid flags in response \"%V\" " - "for key \"%V\"", - &line, &ctx->key); - return NGX_HTTP_UPSTREAM_INVALID_HEADER; - } - - if (flags & mlcf->gzip_flag) { - h = ngx_list_push(&r->headers_out.headers); - if (h == NULL) { - return NGX_ERROR; - } - - h->hash = 1; - h->next = NULL; - ngx_str_set(&h->key, "Content-Encoding"); - ngx_str_set(&h->value, "gzip"); - r->headers_out.content_encoding = h; - } - - length: - - start = p; - p = line.data + line.len; - - u->headers_in.content_length_n = ngx_atoof(start, p - start); - if (u->headers_in.content_length_n == NGX_ERROR) { - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "memcached sent invalid length in response \"%V\" " - "for key \"%V\"", - &line, &ctx->key); - return NGX_HTTP_UPSTREAM_INVALID_HEADER; - } - - u->headers_in.status_n = 200; - u->state->status = 200; - u->buffer.pos = p + sizeof(CRLF) - 1; - - return NGX_OK; - } - - if (ngx_strcmp(p, "END\x0d") == 0) { - ngx_log_error(NGX_LOG_INFO, r->connection->log, 0, - "key: \"%V\" was not found by memcached", &ctx->key); - - u->headers_in.content_length_n = 0; - u->headers_in.status_n = 404; - u->state->status = 404; - u->buffer.pos = p + sizeof("END" CRLF) - 1; - u->keepalive = 1; - - return NGX_OK; - } - -no_valid: - - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "memcached sent invalid response: \"%V\"", &line); - - return NGX_HTTP_UPSTREAM_INVALID_HEADER; -} - - -static ngx_int_t -ngx_http_memcached_filter_init(void *data) -{ - ngx_http_memcached_ctx_t *ctx = data; - - ngx_http_upstream_t *u; - - u = ctx->request->upstream; - - if (u->headers_in.status_n != 404) { - u->length = u->headers_in.content_length_n + NGX_HTTP_MEMCACHED_END; - ctx->rest = NGX_HTTP_MEMCACHED_END; - - } else { - u->length = 0; - } - - return NGX_OK; -} - - -static ngx_int_t -ngx_http_memcached_filter(void *data, ssize_t bytes) -{ - ngx_http_memcached_ctx_t *ctx = data; - - u_char *last; - ngx_buf_t *b; - ngx_chain_t *cl, **ll; - ngx_http_upstream_t *u; - - u = ctx->request->upstream; - b = &u->buffer; - - if (u->length == (ssize_t) ctx->rest) { - - if (bytes > u->length - || ngx_strncmp(b->last, - ngx_http_memcached_end + NGX_HTTP_MEMCACHED_END - ctx->rest, - bytes) - != 0) - { - ngx_log_error(NGX_LOG_ERR, ctx->request->connection->log, 0, - "memcached sent invalid trailer"); - - u->length = 0; - ctx->rest = 0; - - return NGX_OK; - } - - u->length -= bytes; - ctx->rest -= bytes; - - if (u->length == 0) { - u->keepalive = 1; - } - - return NGX_OK; - } - - for (cl = u->out_bufs, ll = &u->out_bufs; cl; cl = cl->next) { - ll = &cl->next; - } - - cl = ngx_chain_get_free_buf(ctx->request->pool, &u->free_bufs); - if (cl == NULL) { - return NGX_ERROR; - } - - cl->buf->flush = 1; - cl->buf->memory = 1; - - *ll = cl; - - last = b->last; - cl->buf->pos = last; - b->last += bytes; - cl->buf->last = b->last; - cl->buf->tag = u->output.tag; - - ngx_log_debug4(NGX_LOG_DEBUG_HTTP, ctx->request->connection->log, 0, - "memcached filter bytes:%z size:%z length:%O rest:%z", - bytes, b->last - b->pos, u->length, ctx->rest); - - if (bytes <= (ssize_t) (u->length - NGX_HTTP_MEMCACHED_END)) { - u->length -= bytes; - return NGX_OK; - } - - last += (size_t) (u->length - NGX_HTTP_MEMCACHED_END); - - if (bytes > u->length - || ngx_strncmp(last, ngx_http_memcached_end, b->last - last) != 0) - { - ngx_log_error(NGX_LOG_ERR, ctx->request->connection->log, 0, - "memcached sent invalid trailer"); - - b->last = last; - cl->buf->last = last; - u->length = 0; - ctx->rest = 0; - - return NGX_OK; - } - - ctx->rest -= b->last - last; - b->last = last; - cl->buf->last = last; - u->length = ctx->rest; - - if (u->length == 0) { - u->keepalive = 1; - } - - return NGX_OK; -} - - -static void -ngx_http_memcached_abort_request(ngx_http_request_t *r) -{ - ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "abort http memcached request"); - return; -} - - -static void -ngx_http_memcached_finalize_request(ngx_http_request_t *r, ngx_int_t rc) -{ - ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "finalize http memcached request"); - return; -} - - -static void * -ngx_http_memcached_create_loc_conf(ngx_conf_t *cf) -{ - ngx_http_memcached_loc_conf_t *conf; - - conf = ngx_pcalloc(cf->pool, sizeof(ngx_http_memcached_loc_conf_t)); - if (conf == NULL) { - return NULL; - } - - /* - * set by ngx_pcalloc(): - * - * conf->upstream.bufs.num = 0; - * conf->upstream.next_upstream = 0; - * conf->upstream.temp_path = NULL; - */ - - conf->upstream.local = NGX_CONF_UNSET_PTR; - conf->upstream.socket_keepalive = NGX_CONF_UNSET; - conf->upstream.next_upstream_tries = NGX_CONF_UNSET_UINT; - conf->upstream.connect_timeout = NGX_CONF_UNSET_MSEC; - conf->upstream.send_timeout = NGX_CONF_UNSET_MSEC; - conf->upstream.read_timeout = NGX_CONF_UNSET_MSEC; - conf->upstream.next_upstream_timeout = NGX_CONF_UNSET_MSEC; - - conf->upstream.buffer_size = NGX_CONF_UNSET_SIZE; - - /* the hardcoded values */ - conf->upstream.cyclic_temp_file = 0; - conf->upstream.buffering = 0; - conf->upstream.ignore_client_abort = 0; - conf->upstream.send_lowat = 0; - conf->upstream.bufs.num = 0; - conf->upstream.busy_buffers_size = 0; - conf->upstream.max_temp_file_size = 0; - conf->upstream.temp_file_write_size = 0; - conf->upstream.intercept_errors = 1; - conf->upstream.intercept_404 = 1; - conf->upstream.pass_request_headers = 0; - conf->upstream.pass_request_body = 0; - conf->upstream.force_ranges = 1; - - conf->index = NGX_CONF_UNSET; - conf->gzip_flag = NGX_CONF_UNSET_UINT; - - return conf; -} - - -static char * -ngx_http_memcached_merge_loc_conf(ngx_conf_t *cf, void *parent, void *child) -{ - ngx_http_memcached_loc_conf_t *prev = parent; - ngx_http_memcached_loc_conf_t *conf = child; - - ngx_conf_merge_ptr_value(conf->upstream.local, - prev->upstream.local, NULL); - - ngx_conf_merge_value(conf->upstream.socket_keepalive, - prev->upstream.socket_keepalive, 0); - - ngx_conf_merge_uint_value(conf->upstream.next_upstream_tries, - prev->upstream.next_upstream_tries, 0); - - ngx_conf_merge_msec_value(conf->upstream.connect_timeout, - prev->upstream.connect_timeout, 60000); - - ngx_conf_merge_msec_value(conf->upstream.send_timeout, - prev->upstream.send_timeout, 60000); - - ngx_conf_merge_msec_value(conf->upstream.read_timeout, - prev->upstream.read_timeout, 60000); - - ngx_conf_merge_msec_value(conf->upstream.next_upstream_timeout, - prev->upstream.next_upstream_timeout, 0); - - ngx_conf_merge_size_value(conf->upstream.buffer_size, - prev->upstream.buffer_size, - (size_t) ngx_pagesize); - - ngx_conf_merge_bitmask_value(conf->upstream.next_upstream, - prev->upstream.next_upstream, - (NGX_CONF_BITMASK_SET - |NGX_HTTP_UPSTREAM_FT_ERROR - |NGX_HTTP_UPSTREAM_FT_TIMEOUT)); - - if (conf->upstream.next_upstream & NGX_HTTP_UPSTREAM_FT_OFF) { - conf->upstream.next_upstream = NGX_CONF_BITMASK_SET - |NGX_HTTP_UPSTREAM_FT_OFF; - } - - if (conf->upstream.upstream == NULL) { - conf->upstream.upstream = prev->upstream.upstream; - } - - if (conf->index == NGX_CONF_UNSET) { - conf->index = prev->index; - } - - ngx_conf_merge_uint_value(conf->gzip_flag, prev->gzip_flag, 0); - - return NGX_CONF_OK; -} - - -static char * -ngx_http_memcached_pass(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) -{ - ngx_http_memcached_loc_conf_t *mlcf = conf; - - ngx_str_t *value; - ngx_url_t u; - ngx_http_core_loc_conf_t *clcf; - - if (mlcf->upstream.upstream) { - return "is duplicate"; - } - - value = cf->args->elts; - - ngx_memzero(&u, sizeof(ngx_url_t)); - - u.url = value[1]; - u.no_resolve = 1; - - mlcf->upstream.upstream = ngx_http_upstream_add(cf, &u, 0); - if (mlcf->upstream.upstream == NULL) { - return NGX_CONF_ERROR; - } - - clcf = ngx_http_conf_get_module_loc_conf(cf, ngx_http_core_module); - - clcf->handler = ngx_http_memcached_handler; - - if (clcf->name.len && clcf->name.data[clcf->name.len - 1] == '/') { - clcf->auto_redirect = 1; - } - - mlcf->index = ngx_http_get_variable_index(cf, &ngx_http_memcached_key); - - if (mlcf->index == NGX_ERROR) { - return NGX_CONF_ERROR; - } - - return NGX_CONF_OK; -} diff --git a/src/deps/src/nginx-1.30.3/src/http/modules/ngx_http_mirror_module.c b/src/deps/src/nginx-1.30.3/src/http/modules/ngx_http_mirror_module.c deleted file mode 100644 index 787adb321b..0000000000 --- a/src/deps/src/nginx-1.30.3/src/http/modules/ngx_http_mirror_module.c +++ /dev/null @@ -1,264 +0,0 @@ - -/* - * Copyright (C) Roman Arutyunyan - * Copyright (C) Nginx, Inc. - */ - - -#include -#include -#include - - -typedef struct { - ngx_array_t *mirror; - ngx_flag_t request_body; -} ngx_http_mirror_loc_conf_t; - - -typedef struct { - ngx_int_t status; -} ngx_http_mirror_ctx_t; - - -static ngx_int_t ngx_http_mirror_handler(ngx_http_request_t *r); -static void ngx_http_mirror_body_handler(ngx_http_request_t *r); -static ngx_int_t ngx_http_mirror_handler_internal(ngx_http_request_t *r); -static void *ngx_http_mirror_create_loc_conf(ngx_conf_t *cf); -static char *ngx_http_mirror_merge_loc_conf(ngx_conf_t *cf, void *parent, - void *child); -static char *ngx_http_mirror(ngx_conf_t *cf, ngx_command_t *cmd, void *conf); -static ngx_int_t ngx_http_mirror_init(ngx_conf_t *cf); - - -static ngx_command_t ngx_http_mirror_commands[] = { - - { ngx_string("mirror"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1, - ngx_http_mirror, - NGX_HTTP_LOC_CONF_OFFSET, - 0, - NULL }, - - { ngx_string("mirror_request_body"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG, - ngx_conf_set_flag_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_mirror_loc_conf_t, request_body), - NULL }, - - ngx_null_command -}; - - -static ngx_http_module_t ngx_http_mirror_module_ctx = { - NULL, /* preconfiguration */ - ngx_http_mirror_init, /* postconfiguration */ - - NULL, /* create main configuration */ - NULL, /* init main configuration */ - - NULL, /* create server configuration */ - NULL, /* merge server configuration */ - - ngx_http_mirror_create_loc_conf, /* create location configuration */ - ngx_http_mirror_merge_loc_conf /* merge location configuration */ -}; - - -ngx_module_t ngx_http_mirror_module = { - NGX_MODULE_V1, - &ngx_http_mirror_module_ctx, /* module context */ - ngx_http_mirror_commands, /* module directives */ - NGX_HTTP_MODULE, /* module type */ - NULL, /* init master */ - NULL, /* init module */ - NULL, /* init process */ - NULL, /* init thread */ - NULL, /* exit thread */ - NULL, /* exit process */ - NULL, /* exit master */ - NGX_MODULE_V1_PADDING -}; - - -static ngx_int_t -ngx_http_mirror_handler(ngx_http_request_t *r) -{ - ngx_int_t rc; - ngx_http_mirror_ctx_t *ctx; - ngx_http_mirror_loc_conf_t *mlcf; - - if (r != r->main) { - return NGX_DECLINED; - } - - mlcf = ngx_http_get_module_loc_conf(r, ngx_http_mirror_module); - - if (mlcf->mirror == NULL) { - return NGX_DECLINED; - } - - ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, "mirror handler"); - - if (mlcf->request_body) { - ctx = ngx_http_get_module_ctx(r, ngx_http_mirror_module); - - if (ctx) { - return ctx->status; - } - - ctx = ngx_pcalloc(r->pool, sizeof(ngx_http_mirror_ctx_t)); - if (ctx == NULL) { - return NGX_ERROR; - } - - ctx->status = NGX_DONE; - - ngx_http_set_ctx(r, ctx, ngx_http_mirror_module); - - rc = ngx_http_read_client_request_body(r, ngx_http_mirror_body_handler); - if (rc >= NGX_HTTP_SPECIAL_RESPONSE) { - return rc; - } - - ngx_http_finalize_request(r, NGX_DONE); - return NGX_DONE; - } - - return ngx_http_mirror_handler_internal(r); -} - - -static void -ngx_http_mirror_body_handler(ngx_http_request_t *r) -{ - ngx_http_mirror_ctx_t *ctx; - - ctx = ngx_http_get_module_ctx(r, ngx_http_mirror_module); - - ctx->status = ngx_http_mirror_handler_internal(r); - - r->preserve_body = 1; - - r->write_event_handler = ngx_http_core_run_phases; - ngx_http_core_run_phases(r); -} - - -static ngx_int_t -ngx_http_mirror_handler_internal(ngx_http_request_t *r) -{ - ngx_str_t *name; - ngx_uint_t i; - ngx_http_request_t *sr; - ngx_http_mirror_loc_conf_t *mlcf; - - mlcf = ngx_http_get_module_loc_conf(r, ngx_http_mirror_module); - - name = mlcf->mirror->elts; - - for (i = 0; i < mlcf->mirror->nelts; i++) { - if (ngx_http_subrequest(r, &name[i], &r->args, &sr, NULL, - NGX_HTTP_SUBREQUEST_BACKGROUND) - != NGX_OK) - { - return NGX_HTTP_INTERNAL_SERVER_ERROR; - } - - sr->header_only = 1; - sr->method = r->method; - sr->method_name = r->method_name; - } - - return NGX_DECLINED; -} - - -static void * -ngx_http_mirror_create_loc_conf(ngx_conf_t *cf) -{ - ngx_http_mirror_loc_conf_t *mlcf; - - mlcf = ngx_pcalloc(cf->pool, sizeof(ngx_http_mirror_loc_conf_t)); - if (mlcf == NULL) { - return NULL; - } - - mlcf->mirror = NGX_CONF_UNSET_PTR; - mlcf->request_body = NGX_CONF_UNSET; - - return mlcf; -} - - -static char * -ngx_http_mirror_merge_loc_conf(ngx_conf_t *cf, void *parent, void *child) -{ - ngx_http_mirror_loc_conf_t *prev = parent; - ngx_http_mirror_loc_conf_t *conf = child; - - ngx_conf_merge_ptr_value(conf->mirror, prev->mirror, NULL); - ngx_conf_merge_value(conf->request_body, prev->request_body, 1); - - return NGX_CONF_OK; -} - - -static char * -ngx_http_mirror(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) -{ - ngx_http_mirror_loc_conf_t *mlcf = conf; - - ngx_str_t *value, *s; - - value = cf->args->elts; - - if (ngx_strcmp(value[1].data, "off") == 0) { - if (mlcf->mirror != NGX_CONF_UNSET_PTR) { - return "is duplicate"; - } - - mlcf->mirror = NULL; - return NGX_CONF_OK; - } - - if (mlcf->mirror == NULL) { - return "is duplicate"; - } - - if (mlcf->mirror == NGX_CONF_UNSET_PTR) { - mlcf->mirror = ngx_array_create(cf->pool, 4, sizeof(ngx_str_t)); - if (mlcf->mirror == NULL) { - return NGX_CONF_ERROR; - } - } - - s = ngx_array_push(mlcf->mirror); - if (s == NULL) { - return NGX_CONF_ERROR; - } - - *s = value[1]; - - return NGX_CONF_OK; -} - - -static ngx_int_t -ngx_http_mirror_init(ngx_conf_t *cf) -{ - ngx_http_handler_pt *h; - ngx_http_core_main_conf_t *cmcf; - - cmcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_core_module); - - h = ngx_array_push(&cmcf->phases[NGX_HTTP_PRECONTENT_PHASE].handlers); - if (h == NULL) { - return NGX_ERROR; - } - - *h = ngx_http_mirror_handler; - - return NGX_OK; -} diff --git a/src/deps/src/nginx-1.30.3/src/http/modules/ngx_http_mp4_module.c b/src/deps/src/nginx-1.30.3/src/http/modules/ngx_http_mp4_module.c deleted file mode 100644 index 678d6296c9..0000000000 --- a/src/deps/src/nginx-1.30.3/src/http/modules/ngx_http_mp4_module.c +++ /dev/null @@ -1,3987 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - -#include -#include -#include - - -#define NGX_HTTP_MP4_TRAK_ATOM 0 -#define NGX_HTTP_MP4_TKHD_ATOM 1 -#define NGX_HTTP_MP4_EDTS_ATOM 2 -#define NGX_HTTP_MP4_ELST_ATOM 3 -#define NGX_HTTP_MP4_MDIA_ATOM 4 -#define NGX_HTTP_MP4_MDHD_ATOM 5 -#define NGX_HTTP_MP4_HDLR_ATOM 6 -#define NGX_HTTP_MP4_MINF_ATOM 7 -#define NGX_HTTP_MP4_VMHD_ATOM 8 -#define NGX_HTTP_MP4_SMHD_ATOM 9 -#define NGX_HTTP_MP4_DINF_ATOM 10 -#define NGX_HTTP_MP4_STBL_ATOM 11 -#define NGX_HTTP_MP4_STSD_ATOM 12 -#define NGX_HTTP_MP4_STTS_ATOM 13 -#define NGX_HTTP_MP4_STTS_DATA 14 -#define NGX_HTTP_MP4_STSS_ATOM 15 -#define NGX_HTTP_MP4_STSS_DATA 16 -#define NGX_HTTP_MP4_CTTS_ATOM 17 -#define NGX_HTTP_MP4_CTTS_DATA 18 -#define NGX_HTTP_MP4_STSC_ATOM 19 -#define NGX_HTTP_MP4_STSC_START 20 -#define NGX_HTTP_MP4_STSC_DATA 21 -#define NGX_HTTP_MP4_STSC_END 22 -#define NGX_HTTP_MP4_STSZ_ATOM 23 -#define NGX_HTTP_MP4_STSZ_DATA 24 -#define NGX_HTTP_MP4_STCO_ATOM 25 -#define NGX_HTTP_MP4_STCO_DATA 26 -#define NGX_HTTP_MP4_CO64_ATOM 27 -#define NGX_HTTP_MP4_CO64_DATA 28 - -#define NGX_HTTP_MP4_LAST_ATOM NGX_HTTP_MP4_CO64_DATA - - -typedef struct { - size_t buffer_size; - size_t max_buffer_size; - ngx_flag_t start_key_frame; -} ngx_http_mp4_conf_t; - - -typedef struct { - u_char chunk[4]; - u_char samples[4]; - u_char id[4]; -} ngx_mp4_stsc_entry_t; - - -typedef struct { - u_char size[4]; - u_char name[4]; -} ngx_mp4_edts_atom_t; - - -typedef struct { - u_char size[4]; - u_char name[4]; - u_char version[1]; - u_char flags[3]; - u_char entries[4]; - u_char duration[8]; - u_char media_time[8]; - u_char media_rate[2]; - u_char reserved[2]; -} ngx_mp4_elst_atom_t; - - -typedef struct { - uint32_t timescale; - uint32_t time_to_sample_entries; - uint32_t sample_to_chunk_entries; - uint32_t sync_samples_entries; - uint32_t composition_offset_entries; - uint32_t sample_sizes_entries; - uint32_t chunks; - - ngx_uint_t start_sample; - ngx_uint_t end_sample; - ngx_uint_t start_chunk; - ngx_uint_t end_chunk; - ngx_uint_t start_chunk_samples; - ngx_uint_t end_chunk_samples; - uint64_t start_chunk_samples_size; - uint64_t end_chunk_samples_size; - uint64_t duration; - uint64_t prefix; - uint64_t movie_duration; - off_t start_offset; - off_t end_offset; - - size_t tkhd_size; - size_t mdhd_size; - size_t hdlr_size; - size_t vmhd_size; - size_t smhd_size; - size_t dinf_size; - size_t size; - - ngx_chain_t out[NGX_HTTP_MP4_LAST_ATOM + 1]; - - ngx_buf_t trak_atom_buf; - ngx_buf_t tkhd_atom_buf; - ngx_buf_t edts_atom_buf; - ngx_buf_t elst_atom_buf; - ngx_buf_t mdia_atom_buf; - ngx_buf_t mdhd_atom_buf; - ngx_buf_t hdlr_atom_buf; - ngx_buf_t minf_atom_buf; - ngx_buf_t vmhd_atom_buf; - ngx_buf_t smhd_atom_buf; - ngx_buf_t dinf_atom_buf; - ngx_buf_t stbl_atom_buf; - ngx_buf_t stsd_atom_buf; - ngx_buf_t stts_atom_buf; - ngx_buf_t stts_data_buf; - ngx_buf_t stss_atom_buf; - ngx_buf_t stss_data_buf; - ngx_buf_t ctts_atom_buf; - ngx_buf_t ctts_data_buf; - ngx_buf_t stsc_atom_buf; - ngx_buf_t stsc_start_chunk_buf; - ngx_buf_t stsc_end_chunk_buf; - ngx_buf_t stsc_data_buf; - ngx_buf_t stsz_atom_buf; - ngx_buf_t stsz_data_buf; - ngx_buf_t stco_atom_buf; - ngx_buf_t stco_data_buf; - ngx_buf_t co64_atom_buf; - ngx_buf_t co64_data_buf; - - ngx_mp4_edts_atom_t edts_atom; - ngx_mp4_elst_atom_t elst_atom; - ngx_mp4_stsc_entry_t stsc_start_chunk_entry; - ngx_mp4_stsc_entry_t stsc_end_chunk_entry; -} ngx_http_mp4_trak_t; - - -typedef struct { - ngx_file_t file; - - u_char *buffer; - u_char *buffer_start; - u_char *buffer_pos; - u_char *buffer_end; - size_t buffer_size; - - off_t offset; - off_t end; - off_t content_length; - ngx_uint_t start; - ngx_uint_t length; - uint32_t timescale; - ngx_http_request_t *request; - ngx_array_t trak; - ngx_http_mp4_trak_t traks[2]; - - size_t ftyp_size; - size_t moov_size; - - ngx_chain_t *out; - ngx_chain_t ftyp_atom; - ngx_chain_t moov_atom; - ngx_chain_t mvhd_atom; - ngx_chain_t mdat_atom; - ngx_chain_t mdat_data; - - ngx_buf_t ftyp_atom_buf; - ngx_buf_t moov_atom_buf; - ngx_buf_t mvhd_atom_buf; - ngx_buf_t mdat_atom_buf; - ngx_buf_t mdat_data_buf; - - u_char moov_atom_header[8]; - u_char mdat_atom_header[16]; -} ngx_http_mp4_file_t; - - -typedef struct { - char *name; - ngx_int_t (*handler)(ngx_http_mp4_file_t *mp4, - uint64_t atom_data_size); -} ngx_http_mp4_atom_handler_t; - - -#define ngx_mp4_atom_header(mp4) (mp4->buffer_pos - 8) -#define ngx_mp4_atom_data(mp4) mp4->buffer_pos -#define ngx_mp4_atom_data_size(t) (uint64_t) (sizeof(t) - 8) - - -#define ngx_mp4_atom_next(mp4, n) \ - \ - if (n > (size_t) (mp4->buffer_end - mp4->buffer_pos)) { \ - mp4->buffer_pos = mp4->buffer_end; \ - \ - } else { \ - mp4->buffer_pos += (size_t) n; \ - } \ - \ - mp4->offset += n - - -#define ngx_mp4_set_atom_name(p, n1, n2, n3, n4) \ - ((u_char *) (p))[4] = n1; \ - ((u_char *) (p))[5] = n2; \ - ((u_char *) (p))[6] = n3; \ - ((u_char *) (p))[7] = n4 - -#define ngx_mp4_get_16value(p) \ - ( ((uint16_t) ((u_char *) (p))[0] << 8) \ - + ( ((u_char *) (p))[1]) ) - -#define ngx_mp4_set_16value(p, n) \ - ((u_char *) (p))[0] = (u_char) ((n) >> 8); \ - ((u_char *) (p))[1] = (u_char) (n) - -#define ngx_mp4_get_32value(p) \ - ( ((uint32_t) ((u_char *) (p))[0] << 24) \ - + ( ((u_char *) (p))[1] << 16) \ - + ( ((u_char *) (p))[2] << 8) \ - + ( ((u_char *) (p))[3]) ) - -#define ngx_mp4_set_32value(p, n) \ - ((u_char *) (p))[0] = (u_char) ((n) >> 24); \ - ((u_char *) (p))[1] = (u_char) ((n) >> 16); \ - ((u_char *) (p))[2] = (u_char) ((n) >> 8); \ - ((u_char *) (p))[3] = (u_char) (n) - -#define ngx_mp4_get_64value(p) \ - ( ((uint64_t) ((u_char *) (p))[0] << 56) \ - + ((uint64_t) ((u_char *) (p))[1] << 48) \ - + ((uint64_t) ((u_char *) (p))[2] << 40) \ - + ((uint64_t) ((u_char *) (p))[3] << 32) \ - + ((uint64_t) ((u_char *) (p))[4] << 24) \ - + ( ((u_char *) (p))[5] << 16) \ - + ( ((u_char *) (p))[6] << 8) \ - + ( ((u_char *) (p))[7]) ) - -#define ngx_mp4_set_64value(p, n) \ - ((u_char *) (p))[0] = (u_char) ((uint64_t) (n) >> 56); \ - ((u_char *) (p))[1] = (u_char) ((uint64_t) (n) >> 48); \ - ((u_char *) (p))[2] = (u_char) ((uint64_t) (n) >> 40); \ - ((u_char *) (p))[3] = (u_char) ((uint64_t) (n) >> 32); \ - ((u_char *) (p))[4] = (u_char) ( (n) >> 24); \ - ((u_char *) (p))[5] = (u_char) ( (n) >> 16); \ - ((u_char *) (p))[6] = (u_char) ( (n) >> 8); \ - ((u_char *) (p))[7] = (u_char) (n) - -#define ngx_mp4_last_trak(mp4) \ - &((ngx_http_mp4_trak_t *) mp4->trak.elts)[mp4->trak.nelts - 1] - - -static ngx_int_t ngx_http_mp4_handler(ngx_http_request_t *r); -static ngx_int_t ngx_http_mp4_atofp(u_char *line, size_t n, size_t point); - -static ngx_int_t ngx_http_mp4_process(ngx_http_mp4_file_t *mp4); -static ngx_int_t ngx_http_mp4_read_atom(ngx_http_mp4_file_t *mp4, - ngx_http_mp4_atom_handler_t *atom, uint64_t atom_data_size); -static ngx_int_t ngx_http_mp4_read(ngx_http_mp4_file_t *mp4, size_t size); -static ngx_int_t ngx_http_mp4_read_ftyp_atom(ngx_http_mp4_file_t *mp4, - uint64_t atom_data_size); -static ngx_int_t ngx_http_mp4_read_moov_atom(ngx_http_mp4_file_t *mp4, - uint64_t atom_data_size); -static ngx_int_t ngx_http_mp4_read_mdat_atom(ngx_http_mp4_file_t *mp4, - uint64_t atom_data_size); -static size_t ngx_http_mp4_update_mdat_atom(ngx_http_mp4_file_t *mp4, - off_t start_offset, off_t end_offset); -static ngx_int_t ngx_http_mp4_read_mvhd_atom(ngx_http_mp4_file_t *mp4, - uint64_t atom_data_size); -static ngx_int_t ngx_http_mp4_read_trak_atom(ngx_http_mp4_file_t *mp4, - uint64_t atom_data_size); -static void ngx_http_mp4_update_trak_atom(ngx_http_mp4_file_t *mp4, - ngx_http_mp4_trak_t *trak); -static ngx_int_t ngx_http_mp4_read_cmov_atom(ngx_http_mp4_file_t *mp4, - uint64_t atom_data_size); -static ngx_int_t ngx_http_mp4_read_tkhd_atom(ngx_http_mp4_file_t *mp4, - uint64_t atom_data_size); -static ngx_int_t ngx_http_mp4_read_mdia_atom(ngx_http_mp4_file_t *mp4, - uint64_t atom_data_size); -static void ngx_http_mp4_update_mdia_atom(ngx_http_mp4_file_t *mp4, - ngx_http_mp4_trak_t *trak); -static ngx_int_t ngx_http_mp4_read_mdhd_atom(ngx_http_mp4_file_t *mp4, - uint64_t atom_data_size); -static void ngx_http_mp4_update_mdhd_atom(ngx_http_mp4_file_t *mp4, - ngx_http_mp4_trak_t *trak); -static ngx_int_t ngx_http_mp4_read_hdlr_atom(ngx_http_mp4_file_t *mp4, - uint64_t atom_data_size); -static ngx_int_t ngx_http_mp4_read_minf_atom(ngx_http_mp4_file_t *mp4, - uint64_t atom_data_size); -static void ngx_http_mp4_update_minf_atom(ngx_http_mp4_file_t *mp4, - ngx_http_mp4_trak_t *trak); -static ngx_int_t ngx_http_mp4_read_dinf_atom(ngx_http_mp4_file_t *mp4, - uint64_t atom_data_size); -static ngx_int_t ngx_http_mp4_read_vmhd_atom(ngx_http_mp4_file_t *mp4, - uint64_t atom_data_size); -static ngx_int_t ngx_http_mp4_read_smhd_atom(ngx_http_mp4_file_t *mp4, - uint64_t atom_data_size); -static ngx_int_t ngx_http_mp4_read_stbl_atom(ngx_http_mp4_file_t *mp4, - uint64_t atom_data_size); -static void ngx_http_mp4_update_edts_atom(ngx_http_mp4_file_t *mp4, - ngx_http_mp4_trak_t *trak); -static void ngx_http_mp4_update_stbl_atom(ngx_http_mp4_file_t *mp4, - ngx_http_mp4_trak_t *trak); -static ngx_int_t ngx_http_mp4_read_stsd_atom(ngx_http_mp4_file_t *mp4, - uint64_t atom_data_size); -static ngx_int_t ngx_http_mp4_read_stts_atom(ngx_http_mp4_file_t *mp4, - uint64_t atom_data_size); -static ngx_int_t ngx_http_mp4_update_stts_atom(ngx_http_mp4_file_t *mp4, - ngx_http_mp4_trak_t *trak); -static ngx_int_t ngx_http_mp4_crop_stts_data(ngx_http_mp4_file_t *mp4, - ngx_http_mp4_trak_t *trak, ngx_uint_t start); -static ngx_int_t ngx_http_mp4_seek_key_frame(ngx_http_mp4_file_t *mp4, - ngx_http_mp4_trak_t *trak, uint32_t start_sample, uint32_t *key_prefix); -static ngx_int_t ngx_http_mp4_read_stss_atom(ngx_http_mp4_file_t *mp4, - uint64_t atom_data_size); -static ngx_int_t ngx_http_mp4_update_stss_atom(ngx_http_mp4_file_t *mp4, - ngx_http_mp4_trak_t *trak); -static void ngx_http_mp4_crop_stss_data(ngx_http_mp4_file_t *mp4, - ngx_http_mp4_trak_t *trak, ngx_uint_t start); -static ngx_int_t ngx_http_mp4_read_ctts_atom(ngx_http_mp4_file_t *mp4, - uint64_t atom_data_size); -static void ngx_http_mp4_update_ctts_atom(ngx_http_mp4_file_t *mp4, - ngx_http_mp4_trak_t *trak); -static void ngx_http_mp4_crop_ctts_data(ngx_http_mp4_file_t *mp4, - ngx_http_mp4_trak_t *trak, ngx_uint_t start); -static ngx_int_t ngx_http_mp4_read_stsc_atom(ngx_http_mp4_file_t *mp4, - uint64_t atom_data_size); -static ngx_int_t ngx_http_mp4_update_stsc_atom(ngx_http_mp4_file_t *mp4, - ngx_http_mp4_trak_t *trak); -static ngx_int_t ngx_http_mp4_crop_stsc_data(ngx_http_mp4_file_t *mp4, - ngx_http_mp4_trak_t *trak, ngx_uint_t start); -static ngx_int_t ngx_http_mp4_read_stsz_atom(ngx_http_mp4_file_t *mp4, - uint64_t atom_data_size); -static ngx_int_t ngx_http_mp4_update_stsz_atom(ngx_http_mp4_file_t *mp4, - ngx_http_mp4_trak_t *trak); -static ngx_int_t ngx_http_mp4_read_stco_atom(ngx_http_mp4_file_t *mp4, - uint64_t atom_data_size); -static ngx_int_t ngx_http_mp4_update_stco_atom(ngx_http_mp4_file_t *mp4, - ngx_http_mp4_trak_t *trak); -static void ngx_http_mp4_adjust_stco_atom(ngx_http_mp4_file_t *mp4, - ngx_http_mp4_trak_t *trak, int32_t adjustment); -static ngx_int_t ngx_http_mp4_read_co64_atom(ngx_http_mp4_file_t *mp4, - uint64_t atom_data_size); -static ngx_int_t ngx_http_mp4_update_co64_atom(ngx_http_mp4_file_t *mp4, - ngx_http_mp4_trak_t *trak); -static void ngx_http_mp4_adjust_co64_atom(ngx_http_mp4_file_t *mp4, - ngx_http_mp4_trak_t *trak, off_t adjustment); - -static char *ngx_http_mp4(ngx_conf_t *cf, ngx_command_t *cmd, void *conf); -static void *ngx_http_mp4_create_conf(ngx_conf_t *cf); -static char *ngx_http_mp4_merge_conf(ngx_conf_t *cf, void *parent, void *child); - - -static ngx_command_t ngx_http_mp4_commands[] = { - - { ngx_string("mp4"), - NGX_HTTP_LOC_CONF|NGX_CONF_NOARGS, - ngx_http_mp4, - 0, - 0, - NULL }, - - { ngx_string("mp4_buffer_size"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1, - ngx_conf_set_size_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_mp4_conf_t, buffer_size), - NULL }, - - { ngx_string("mp4_max_buffer_size"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1, - ngx_conf_set_size_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_mp4_conf_t, max_buffer_size), - NULL }, - - { ngx_string("mp4_start_key_frame"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG, - ngx_conf_set_flag_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_mp4_conf_t, start_key_frame), - NULL }, - - ngx_null_command -}; - - -static ngx_http_module_t ngx_http_mp4_module_ctx = { - NULL, /* preconfiguration */ - NULL, /* postconfiguration */ - - NULL, /* create main configuration */ - NULL, /* init main configuration */ - - NULL, /* create server configuration */ - NULL, /* merge server configuration */ - - ngx_http_mp4_create_conf, /* create location configuration */ - ngx_http_mp4_merge_conf /* merge location configuration */ -}; - - -ngx_module_t ngx_http_mp4_module = { - NGX_MODULE_V1, - &ngx_http_mp4_module_ctx, /* module context */ - ngx_http_mp4_commands, /* module directives */ - NGX_HTTP_MODULE, /* module type */ - NULL, /* init master */ - NULL, /* init module */ - NULL, /* init process */ - NULL, /* init thread */ - NULL, /* exit thread */ - NULL, /* exit process */ - NULL, /* exit master */ - NGX_MODULE_V1_PADDING -}; - - -static ngx_http_mp4_atom_handler_t ngx_http_mp4_atoms[] = { - { "ftyp", ngx_http_mp4_read_ftyp_atom }, - { "moov", ngx_http_mp4_read_moov_atom }, - { "mdat", ngx_http_mp4_read_mdat_atom }, - { NULL, NULL } -}; - -static ngx_http_mp4_atom_handler_t ngx_http_mp4_moov_atoms[] = { - { "mvhd", ngx_http_mp4_read_mvhd_atom }, - { "trak", ngx_http_mp4_read_trak_atom }, - { "cmov", ngx_http_mp4_read_cmov_atom }, - { NULL, NULL } -}; - -static ngx_http_mp4_atom_handler_t ngx_http_mp4_trak_atoms[] = { - { "tkhd", ngx_http_mp4_read_tkhd_atom }, - { "mdia", ngx_http_mp4_read_mdia_atom }, - { NULL, NULL } -}; - -static ngx_http_mp4_atom_handler_t ngx_http_mp4_mdia_atoms[] = { - { "mdhd", ngx_http_mp4_read_mdhd_atom }, - { "hdlr", ngx_http_mp4_read_hdlr_atom }, - { "minf", ngx_http_mp4_read_minf_atom }, - { NULL, NULL } -}; - -static ngx_http_mp4_atom_handler_t ngx_http_mp4_minf_atoms[] = { - { "vmhd", ngx_http_mp4_read_vmhd_atom }, - { "smhd", ngx_http_mp4_read_smhd_atom }, - { "dinf", ngx_http_mp4_read_dinf_atom }, - { "stbl", ngx_http_mp4_read_stbl_atom }, - { NULL, NULL } -}; - -static ngx_http_mp4_atom_handler_t ngx_http_mp4_stbl_atoms[] = { - { "stsd", ngx_http_mp4_read_stsd_atom }, - { "stts", ngx_http_mp4_read_stts_atom }, - { "stss", ngx_http_mp4_read_stss_atom }, - { "ctts", ngx_http_mp4_read_ctts_atom }, - { "stsc", ngx_http_mp4_read_stsc_atom }, - { "stsz", ngx_http_mp4_read_stsz_atom }, - { "stco", ngx_http_mp4_read_stco_atom }, - { "co64", ngx_http_mp4_read_co64_atom }, - { NULL, NULL } -}; - - -static ngx_int_t -ngx_http_mp4_handler(ngx_http_request_t *r) -{ - u_char *last; - size_t root; - ngx_int_t rc, start, end; - ngx_uint_t level, length; - ngx_str_t path, value; - ngx_log_t *log; - ngx_buf_t *b; - ngx_chain_t out; - ngx_http_mp4_file_t *mp4; - ngx_open_file_info_t of; - ngx_http_core_loc_conf_t *clcf; - - if (!(r->method & (NGX_HTTP_GET|NGX_HTTP_HEAD))) { - return NGX_HTTP_NOT_ALLOWED; - } - - if (r->uri.data[r->uri.len - 1] == '/') { - return NGX_DECLINED; - } - - rc = ngx_http_discard_request_body(r); - - if (rc != NGX_OK) { - return rc; - } - - last = ngx_http_map_uri_to_path(r, &path, &root, 0); - if (last == NULL) { - return NGX_HTTP_INTERNAL_SERVER_ERROR; - } - - log = r->connection->log; - - path.len = last - path.data; - - ngx_log_debug1(NGX_LOG_DEBUG_HTTP, log, 0, - "http mp4 filename: \"%V\"", &path); - - clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module); - - ngx_memzero(&of, sizeof(ngx_open_file_info_t)); - - of.read_ahead = clcf->read_ahead; - of.directio = NGX_MAX_OFF_T_VALUE; - of.valid = clcf->open_file_cache_valid; - of.min_uses = clcf->open_file_cache_min_uses; - of.errors = clcf->open_file_cache_errors; - of.events = clcf->open_file_cache_events; - - if (ngx_http_set_disable_symlinks(r, clcf, &path, &of) != NGX_OK) { - return NGX_HTTP_INTERNAL_SERVER_ERROR; - } - - if (ngx_open_cached_file(clcf->open_file_cache, &path, &of, r->pool) - != NGX_OK) - { - switch (of.err) { - - case 0: - return NGX_HTTP_INTERNAL_SERVER_ERROR; - - case NGX_ENOENT: - case NGX_ENOTDIR: - case NGX_ENAMETOOLONG: - - level = NGX_LOG_ERR; - rc = NGX_HTTP_NOT_FOUND; - break; - - case NGX_EACCES: -#if (NGX_HAVE_OPENAT) - case NGX_EMLINK: - case NGX_ELOOP: -#endif - - level = NGX_LOG_ERR; - rc = NGX_HTTP_FORBIDDEN; - break; - - default: - - level = NGX_LOG_CRIT; - rc = NGX_HTTP_INTERNAL_SERVER_ERROR; - break; - } - - if (rc != NGX_HTTP_NOT_FOUND || clcf->log_not_found) { - ngx_log_error(level, log, of.err, - "%s \"%s\" failed", of.failed, path.data); - } - - return rc; - } - - if (!of.is_file) { - return NGX_DECLINED; - } - - r->root_tested = !r->error_page; - r->allow_ranges = 1; - - start = -1; - length = 0; - r->headers_out.content_length_n = of.size; - mp4 = NULL; - b = NULL; - - if (r->args.len) { - - if (ngx_http_arg(r, (u_char *) "start", 5, &value) == NGX_OK) { - - /* - * A Flash player may send start value with a lot of digits - * after dot so a custom function is used instead of ngx_atofp(). - */ - - start = ngx_http_mp4_atofp(value.data, value.len, 3); - } - - if (ngx_http_arg(r, (u_char *) "end", 3, &value) == NGX_OK) { - - end = ngx_http_mp4_atofp(value.data, value.len, 3); - - if (end > 0) { - if (start < 0) { - start = 0; - } - - if (end > start) { - length = end - start; - } - } - } - } - - if (start >= 0) { - r->single_range = 1; - - mp4 = ngx_pcalloc(r->pool, sizeof(ngx_http_mp4_file_t)); - if (mp4 == NULL) { - return NGX_HTTP_INTERNAL_SERVER_ERROR; - } - - mp4->file.fd = of.fd; - mp4->file.name = path; - mp4->file.log = r->connection->log; - mp4->end = of.size; - mp4->start = (ngx_uint_t) start; - mp4->length = length; - mp4->request = r; - - switch (ngx_http_mp4_process(mp4)) { - - case NGX_DECLINED: - if (mp4->buffer) { - ngx_pfree(r->pool, mp4->buffer); - } - - ngx_pfree(r->pool, mp4); - mp4 = NULL; - - break; - - case NGX_OK: - r->headers_out.content_length_n = mp4->content_length; - break; - - default: /* NGX_ERROR */ - if (mp4->buffer) { - ngx_pfree(r->pool, mp4->buffer); - } - - ngx_pfree(r->pool, mp4); - - return NGX_HTTP_INTERNAL_SERVER_ERROR; - } - } - - log->action = "sending mp4 to client"; - - if (clcf->directio <= of.size) { - - /* - * DIRECTIO is set on transfer only - * to allow kernel to cache "moov" atom - */ - - if (ngx_directio_on(of.fd) == NGX_FILE_ERROR) { - ngx_log_error(NGX_LOG_ALERT, log, ngx_errno, - ngx_directio_on_n " \"%s\" failed", path.data); - } - - of.is_directio = 1; - - if (mp4) { - mp4->file.directio = 1; - } - } - - r->headers_out.status = NGX_HTTP_OK; - r->headers_out.last_modified_time = of.mtime; - - if (ngx_http_set_etag(r) != NGX_OK) { - return NGX_HTTP_INTERNAL_SERVER_ERROR; - } - - if (ngx_http_set_content_type(r) != NGX_OK) { - return NGX_HTTP_INTERNAL_SERVER_ERROR; - } - - if (mp4 == NULL) { - b = ngx_calloc_buf(r->pool); - if (b == NULL) { - return NGX_HTTP_INTERNAL_SERVER_ERROR; - } - - b->file = ngx_pcalloc(r->pool, sizeof(ngx_file_t)); - if (b->file == NULL) { - return NGX_HTTP_INTERNAL_SERVER_ERROR; - } - } - - rc = ngx_http_send_header(r); - - if (rc == NGX_ERROR || rc > NGX_OK || r->header_only) { - return rc; - } - - if (mp4) { - return ngx_http_output_filter(r, mp4->out); - } - - b->file_pos = 0; - b->file_last = of.size; - - b->in_file = b->file_last ? 1 : 0; - b->last_buf = (r == r->main) ? 1 : 0; - b->last_in_chain = 1; - b->sync = (b->last_buf || b->in_file) ? 0 : 1; - - b->file->fd = of.fd; - b->file->name = path; - b->file->log = log; - b->file->directio = of.is_directio; - - out.buf = b; - out.next = NULL; - - return ngx_http_output_filter(r, &out); -} - - -static ngx_int_t -ngx_http_mp4_atofp(u_char *line, size_t n, size_t point) -{ - ngx_int_t value, cutoff, cutlim; - ngx_uint_t dot; - - /* same as ngx_atofp(), but allows additional digits */ - - if (n == 0) { - return NGX_ERROR; - } - - cutoff = NGX_MAX_INT_T_VALUE / 10; - cutlim = NGX_MAX_INT_T_VALUE % 10; - - dot = 0; - - for (value = 0; n--; line++) { - - if (*line == '.') { - if (dot) { - return NGX_ERROR; - } - - dot = 1; - continue; - } - - if (*line < '0' || *line > '9') { - return NGX_ERROR; - } - - if (point == 0) { - continue; - } - - if (value >= cutoff && (value > cutoff || *line - '0' > cutlim)) { - return NGX_ERROR; - } - - value = value * 10 + (*line - '0'); - point -= dot; - } - - while (point--) { - if (value > cutoff) { - return NGX_ERROR; - } - - value = value * 10; - } - - return value; -} - - -static ngx_int_t -ngx_http_mp4_process(ngx_http_mp4_file_t *mp4) -{ - off_t start_offset, end_offset, adjustment; - ngx_int_t rc; - ngx_uint_t i, j; - ngx_chain_t **prev; - ngx_http_mp4_trak_t *trak; - ngx_http_mp4_conf_t *conf; - - ngx_log_debug2(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0, - "mp4 start:%ui, length:%ui", mp4->start, mp4->length); - - conf = ngx_http_get_module_loc_conf(mp4->request, ngx_http_mp4_module); - - mp4->buffer_size = conf->buffer_size; - - rc = ngx_http_mp4_read_atom(mp4, ngx_http_mp4_atoms, mp4->end); - if (rc != NGX_OK) { - return rc; - } - - if (mp4->trak.nelts == 0) { - ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0, - "no mp4 trak atoms were found in \"%s\"", - mp4->file.name.data); - return NGX_ERROR; - } - - if (mp4->mdat_atom.buf == NULL) { - ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0, - "no mp4 mdat atom was found in \"%s\"", - mp4->file.name.data); - return NGX_ERROR; - } - - prev = &mp4->out; - - if (mp4->ftyp_atom.buf) { - *prev = &mp4->ftyp_atom; - prev = &mp4->ftyp_atom.next; - } - - *prev = &mp4->moov_atom; - prev = &mp4->moov_atom.next; - - if (mp4->mvhd_atom.buf) { - mp4->moov_size += mp4->mvhd_atom_buf.last - mp4->mvhd_atom_buf.pos; - *prev = &mp4->mvhd_atom; - prev = &mp4->mvhd_atom.next; - } - - start_offset = mp4->end; - end_offset = 0; - trak = mp4->trak.elts; - - for (i = 0; i < mp4->trak.nelts; i++) { - - if (ngx_http_mp4_update_stts_atom(mp4, &trak[i]) != NGX_OK) { - return NGX_ERROR; - } - - if (ngx_http_mp4_update_stss_atom(mp4, &trak[i]) != NGX_OK) { - return NGX_ERROR; - } - - ngx_http_mp4_update_ctts_atom(mp4, &trak[i]); - - if (ngx_http_mp4_update_stsc_atom(mp4, &trak[i]) != NGX_OK) { - return NGX_ERROR; - } - - if (ngx_http_mp4_update_stsz_atom(mp4, &trak[i]) != NGX_OK) { - return NGX_ERROR; - } - - if (trak[i].out[NGX_HTTP_MP4_CO64_DATA].buf) { - if (ngx_http_mp4_update_co64_atom(mp4, &trak[i]) != NGX_OK) { - return NGX_ERROR; - } - - } else { - if (ngx_http_mp4_update_stco_atom(mp4, &trak[i]) != NGX_OK) { - return NGX_ERROR; - } - } - - ngx_http_mp4_update_stbl_atom(mp4, &trak[i]); - ngx_http_mp4_update_minf_atom(mp4, &trak[i]); - ngx_http_mp4_update_mdhd_atom(mp4, &trak[i]); - trak[i].size += trak[i].hdlr_size; - ngx_http_mp4_update_mdia_atom(mp4, &trak[i]); - trak[i].size += trak[i].tkhd_size; - ngx_http_mp4_update_edts_atom(mp4, &trak[i]); - ngx_http_mp4_update_trak_atom(mp4, &trak[i]); - - mp4->moov_size += trak[i].size; - - if (start_offset > trak[i].start_offset) { - start_offset = trak[i].start_offset; - } - - if (end_offset < trak[i].end_offset) { - end_offset = trak[i].end_offset; - } - - *prev = &trak[i].out[NGX_HTTP_MP4_TRAK_ATOM]; - prev = &trak[i].out[NGX_HTTP_MP4_TRAK_ATOM].next; - - for (j = 0; j < NGX_HTTP_MP4_LAST_ATOM + 1; j++) { - if (trak[i].out[j].buf) { - *prev = &trak[i].out[j]; - prev = &trak[i].out[j].next; - } - } - } - - if (end_offset <= start_offset) { - ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0, - "no data between start time and end time in \"%s\"", - mp4->file.name.data); - return NGX_ERROR; - } - - mp4->moov_size += 8; - - ngx_mp4_set_32value(mp4->moov_atom_header, mp4->moov_size); - ngx_mp4_set_atom_name(mp4->moov_atom_header, 'm', 'o', 'o', 'v'); - mp4->content_length += mp4->moov_size; - - *prev = &mp4->mdat_atom; - - if (start_offset >= mp4->mdat_data.buf->file_last) { - ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0, - "start time is out mp4 mdat atom in \"%s\"", - mp4->file.name.data); - return NGX_ERROR; - } - - adjustment = mp4->ftyp_size + mp4->moov_size - + ngx_http_mp4_update_mdat_atom(mp4, start_offset, end_offset) - - start_offset; - - ngx_log_debug1(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0, - "mp4 adjustment:%O", adjustment); - - for (i = 0; i < mp4->trak.nelts; i++) { - if (trak[i].out[NGX_HTTP_MP4_CO64_DATA].buf) { - ngx_http_mp4_adjust_co64_atom(mp4, &trak[i], adjustment); - } else { - ngx_http_mp4_adjust_stco_atom(mp4, &trak[i], (int32_t) adjustment); - } - } - - return NGX_OK; -} - - -typedef struct { - u_char size[4]; - u_char name[4]; -} ngx_mp4_atom_header_t; - -typedef struct { - u_char size[4]; - u_char name[4]; - u_char size64[8]; -} ngx_mp4_atom_header64_t; - - -static ngx_int_t -ngx_http_mp4_read_atom(ngx_http_mp4_file_t *mp4, - ngx_http_mp4_atom_handler_t *atom, uint64_t atom_data_size) -{ - off_t end; - size_t atom_header_size; - u_char *atom_header, *atom_name; - uint64_t atom_size; - ngx_int_t rc; - ngx_uint_t n; - - end = mp4->offset + atom_data_size; - - while (mp4->offset < end) { - - if (ngx_http_mp4_read(mp4, sizeof(uint32_t)) != NGX_OK) { - return NGX_ERROR; - } - - atom_header = mp4->buffer_pos; - atom_size = ngx_mp4_get_32value(atom_header); - atom_header_size = sizeof(ngx_mp4_atom_header_t); - - if (atom_size == 0) { - ngx_log_debug0(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0, - "mp4 atom end"); - return NGX_OK; - } - - if (atom_size < sizeof(ngx_mp4_atom_header_t)) { - - if (atom_size == 1) { - - if (ngx_http_mp4_read(mp4, sizeof(ngx_mp4_atom_header64_t)) - != NGX_OK) - { - return NGX_ERROR; - } - - /* 64-bit atom size */ - atom_header = mp4->buffer_pos; - atom_size = ngx_mp4_get_64value(atom_header + 8); - atom_header_size = sizeof(ngx_mp4_atom_header64_t); - - if (atom_size < sizeof(ngx_mp4_atom_header64_t)) { - ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0, - "\"%s\" mp4 atom is too small:%uL", - mp4->file.name.data, atom_size); - return NGX_ERROR; - } - - } else { - ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0, - "\"%s\" mp4 atom is too small:%uL", - mp4->file.name.data, atom_size); - return NGX_ERROR; - } - } - - if (ngx_http_mp4_read(mp4, sizeof(ngx_mp4_atom_header_t)) != NGX_OK) { - return NGX_ERROR; - } - - atom_header = mp4->buffer_pos; - atom_name = atom_header + sizeof(uint32_t); - - ngx_log_debug4(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0, - "mp4 atom: %*s @%O:%uL", - (size_t) 4, atom_name, mp4->offset, atom_size); - - if (atom_size > (uint64_t) (NGX_MAX_OFF_T_VALUE - mp4->offset) - || mp4->offset + (off_t) atom_size > end) - { - ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0, - "\"%s\" mp4 atom too large:%uL", - mp4->file.name.data, atom_size); - return NGX_ERROR; - } - - for (n = 0; atom[n].name; n++) { - - if (ngx_strncmp(atom_name, atom[n].name, 4) == 0) { - - ngx_mp4_atom_next(mp4, atom_header_size); - - rc = atom[n].handler(mp4, atom_size - atom_header_size); - if (rc != NGX_OK) { - return rc; - } - - goto next; - } - } - - ngx_mp4_atom_next(mp4, atom_size); - - next: - continue; - } - - return NGX_OK; -} - - -static ngx_int_t -ngx_http_mp4_read(ngx_http_mp4_file_t *mp4, size_t size) -{ - ssize_t n; - - if (mp4->buffer_pos + size <= mp4->buffer_end) { - return NGX_OK; - } - - if (mp4->offset + (off_t) mp4->buffer_size > mp4->end) { - mp4->buffer_size = (size_t) (mp4->end - mp4->offset); - } - - if (mp4->buffer_size < size) { - ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0, - "\"%s\" mp4 file truncated", mp4->file.name.data); - return NGX_ERROR; - } - - if (mp4->buffer == NULL) { - mp4->buffer = ngx_palloc(mp4->request->pool, mp4->buffer_size); - if (mp4->buffer == NULL) { - return NGX_ERROR; - } - - mp4->buffer_start = mp4->buffer; - } - - n = ngx_read_file(&mp4->file, mp4->buffer_start, mp4->buffer_size, - mp4->offset); - - if (n == NGX_ERROR) { - return NGX_ERROR; - } - - if ((size_t) n != mp4->buffer_size) { - ngx_log_error(NGX_LOG_CRIT, mp4->file.log, 0, - ngx_read_file_n " read only %z of %z from \"%s\"", - n, mp4->buffer_size, mp4->file.name.data); - return NGX_ERROR; - } - - mp4->buffer_pos = mp4->buffer_start; - mp4->buffer_end = mp4->buffer_start + mp4->buffer_size; - - return NGX_OK; -} - - -static ngx_int_t -ngx_http_mp4_read_ftyp_atom(ngx_http_mp4_file_t *mp4, uint64_t atom_data_size) -{ - u_char *ftyp_atom; - size_t atom_size; - ngx_buf_t *atom; - - ngx_log_debug0(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0, "mp4 ftyp atom"); - - if (atom_data_size > 1024 - || ngx_mp4_atom_data(mp4) + (size_t) atom_data_size > mp4->buffer_end) - { - ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0, - "\"%s\" mp4 ftyp atom is too large:%uL", - mp4->file.name.data, atom_data_size); - return NGX_ERROR; - } - - if (mp4->ftyp_atom.buf) { - ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0, - "duplicate mp4 ftyp atom in \"%s\"", mp4->file.name.data); - return NGX_ERROR; - } - - atom_size = sizeof(ngx_mp4_atom_header_t) + (size_t) atom_data_size; - - ftyp_atom = ngx_palloc(mp4->request->pool, atom_size); - if (ftyp_atom == NULL) { - return NGX_ERROR; - } - - ngx_mp4_set_32value(ftyp_atom, atom_size); - ngx_mp4_set_atom_name(ftyp_atom, 'f', 't', 'y', 'p'); - - /* - * only moov atom content is guaranteed to be in mp4->buffer - * during sending response, so ftyp atom content should be copied - */ - ngx_memcpy(ftyp_atom + sizeof(ngx_mp4_atom_header_t), - ngx_mp4_atom_data(mp4), (size_t) atom_data_size); - - atom = &mp4->ftyp_atom_buf; - atom->temporary = 1; - atom->pos = ftyp_atom; - atom->last = ftyp_atom + atom_size; - - mp4->ftyp_atom.buf = atom; - mp4->ftyp_size = atom_size; - mp4->content_length = atom_size; - - ngx_mp4_atom_next(mp4, atom_data_size); - - return NGX_OK; -} - - -/* - * Small excess buffer to process atoms after moov atom, mp4->buffer_start - * will be set to this buffer part after moov atom processing. - */ -#define NGX_HTTP_MP4_MOOV_BUFFER_EXCESS (4 * 1024) - -static ngx_int_t -ngx_http_mp4_read_moov_atom(ngx_http_mp4_file_t *mp4, uint64_t atom_data_size) -{ - ngx_int_t rc; - ngx_uint_t no_mdat; - ngx_buf_t *atom; - ngx_http_mp4_conf_t *conf; - - ngx_log_debug0(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0, "mp4 moov atom"); - - no_mdat = (mp4->mdat_atom.buf == NULL); - - if (no_mdat && mp4->start == 0 && mp4->length == 0) { - /* - * send original file if moov atom resides before - * mdat atom and client requests integral file - */ - return NGX_DECLINED; - } - - if (mp4->moov_atom.buf) { - ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0, - "duplicate mp4 moov atom in \"%s\"", mp4->file.name.data); - return NGX_ERROR; - } - - conf = ngx_http_get_module_loc_conf(mp4->request, ngx_http_mp4_module); - - if (atom_data_size > mp4->buffer_size) { - - if (atom_data_size > conf->max_buffer_size) { - ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0, - "\"%s\" mp4 moov atom is too large:%uL, " - "you may want to increase mp4_max_buffer_size", - mp4->file.name.data, atom_data_size); - return NGX_ERROR; - } - - ngx_pfree(mp4->request->pool, mp4->buffer); - mp4->buffer = NULL; - mp4->buffer_pos = NULL; - mp4->buffer_end = NULL; - - mp4->buffer_size = (size_t) atom_data_size - + NGX_HTTP_MP4_MOOV_BUFFER_EXCESS * no_mdat; - } - - if (ngx_http_mp4_read(mp4, (size_t) atom_data_size) != NGX_OK) { - return NGX_ERROR; - } - - mp4->trak.elts = &mp4->traks; - mp4->trak.size = sizeof(ngx_http_mp4_trak_t); - mp4->trak.nalloc = 2; - mp4->trak.pool = mp4->request->pool; - - atom = &mp4->moov_atom_buf; - atom->temporary = 1; - atom->pos = mp4->moov_atom_header; - atom->last = mp4->moov_atom_header + 8; - - mp4->moov_atom.buf = &mp4->moov_atom_buf; - - rc = ngx_http_mp4_read_atom(mp4, ngx_http_mp4_moov_atoms, atom_data_size); - - ngx_log_debug0(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0, "mp4 moov atom done"); - - if (no_mdat) { - mp4->buffer_start = mp4->buffer_pos; - mp4->buffer_size = NGX_HTTP_MP4_MOOV_BUFFER_EXCESS; - - if (mp4->buffer_start + mp4->buffer_size > mp4->buffer_end) { - mp4->buffer = NULL; - mp4->buffer_pos = NULL; - mp4->buffer_end = NULL; - } - - } else { - /* skip atoms after moov atom */ - mp4->offset = mp4->end; - } - - return rc; -} - - -static ngx_int_t -ngx_http_mp4_read_mdat_atom(ngx_http_mp4_file_t *mp4, uint64_t atom_data_size) -{ - ngx_buf_t *data; - - ngx_log_debug0(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0, "mp4 mdat atom"); - - if (mp4->mdat_atom.buf) { - ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0, - "duplicate mp4 mdat atom in \"%s\"", mp4->file.name.data); - return NGX_ERROR; - } - - data = &mp4->mdat_data_buf; - data->file = &mp4->file; - data->in_file = 1; - data->last_buf = (mp4->request == mp4->request->main) ? 1 : 0; - data->last_in_chain = 1; - data->file_last = mp4->offset + atom_data_size; - - mp4->mdat_atom.buf = &mp4->mdat_atom_buf; - mp4->mdat_atom.next = &mp4->mdat_data; - mp4->mdat_data.buf = data; - - if (mp4->trak.nelts) { - /* skip atoms after mdat atom */ - mp4->offset = mp4->end; - - } else { - ngx_mp4_atom_next(mp4, atom_data_size); - } - - return NGX_OK; -} - - -static size_t -ngx_http_mp4_update_mdat_atom(ngx_http_mp4_file_t *mp4, off_t start_offset, - off_t end_offset) -{ - off_t atom_data_size; - u_char *atom_header; - uint32_t atom_header_size; - uint64_t atom_size; - ngx_buf_t *atom; - - atom_data_size = end_offset - start_offset; - mp4->mdat_data.buf->file_pos = start_offset; - mp4->mdat_data.buf->file_last = end_offset; - - ngx_log_debug2(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0, - "mdat new offset @%O:%O", start_offset, atom_data_size); - - atom_header = mp4->mdat_atom_header; - - if ((uint64_t) atom_data_size - > (uint64_t) 0xffffffff - sizeof(ngx_mp4_atom_header_t)) - { - atom_size = 1; - atom_header_size = sizeof(ngx_mp4_atom_header64_t); - ngx_mp4_set_64value(atom_header + sizeof(ngx_mp4_atom_header_t), - sizeof(ngx_mp4_atom_header64_t) + atom_data_size); - } else { - atom_size = sizeof(ngx_mp4_atom_header_t) + atom_data_size; - atom_header_size = sizeof(ngx_mp4_atom_header_t); - } - - mp4->content_length += atom_header_size + atom_data_size; - - ngx_mp4_set_32value(atom_header, atom_size); - ngx_mp4_set_atom_name(atom_header, 'm', 'd', 'a', 't'); - - atom = &mp4->mdat_atom_buf; - atom->temporary = 1; - atom->pos = atom_header; - atom->last = atom_header + atom_header_size; - - return atom_header_size; -} - - -typedef struct { - u_char size[4]; - u_char name[4]; - u_char version[1]; - u_char flags[3]; - u_char creation_time[4]; - u_char modification_time[4]; - u_char timescale[4]; - u_char duration[4]; - u_char rate[4]; - u_char volume[2]; - u_char reserved[10]; - u_char matrix[36]; - u_char preview_time[4]; - u_char preview_duration[4]; - u_char poster_time[4]; - u_char selection_time[4]; - u_char selection_duration[4]; - u_char current_time[4]; - u_char next_track_id[4]; -} ngx_mp4_mvhd_atom_t; - -typedef struct { - u_char size[4]; - u_char name[4]; - u_char version[1]; - u_char flags[3]; - u_char creation_time[8]; - u_char modification_time[8]; - u_char timescale[4]; - u_char duration[8]; - u_char rate[4]; - u_char volume[2]; - u_char reserved[10]; - u_char matrix[36]; - u_char preview_time[4]; - u_char preview_duration[4]; - u_char poster_time[4]; - u_char selection_time[4]; - u_char selection_duration[4]; - u_char current_time[4]; - u_char next_track_id[4]; -} ngx_mp4_mvhd64_atom_t; - - -static ngx_int_t -ngx_http_mp4_read_mvhd_atom(ngx_http_mp4_file_t *mp4, uint64_t atom_data_size) -{ - u_char *atom_header; - size_t atom_size; - uint32_t timescale; - uint64_t duration, start_time, length_time; - ngx_buf_t *atom; - ngx_mp4_mvhd_atom_t *mvhd_atom; - ngx_mp4_mvhd64_atom_t *mvhd64_atom; - - ngx_log_debug0(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0, "mp4 mvhd atom"); - - if (mp4->mvhd_atom.buf) { - ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0, - "duplicate mp4 mvhd atom in \"%s\"", mp4->file.name.data); - return NGX_ERROR; - } - - atom_header = ngx_mp4_atom_header(mp4); - mvhd_atom = (ngx_mp4_mvhd_atom_t *) atom_header; - mvhd64_atom = (ngx_mp4_mvhd64_atom_t *) atom_header; - ngx_mp4_set_atom_name(atom_header, 'm', 'v', 'h', 'd'); - - if (ngx_mp4_atom_data_size(ngx_mp4_mvhd_atom_t) > atom_data_size) { - ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0, - "\"%s\" mp4 mvhd atom too small", mp4->file.name.data); - return NGX_ERROR; - } - - if (mvhd_atom->version[0] == 0) { - /* version 0: 32-bit duration */ - timescale = ngx_mp4_get_32value(mvhd_atom->timescale); - duration = ngx_mp4_get_32value(mvhd_atom->duration); - - } else { - /* version 1: 64-bit duration */ - - if (ngx_mp4_atom_data_size(ngx_mp4_mvhd64_atom_t) > atom_data_size) { - ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0, - "\"%s\" mp4 mvhd atom too small", - mp4->file.name.data); - return NGX_ERROR; - } - - timescale = ngx_mp4_get_32value(mvhd64_atom->timescale); - duration = ngx_mp4_get_64value(mvhd64_atom->duration); - } - - mp4->timescale = timescale; - - ngx_log_debug3(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0, - "mvhd timescale:%uD, duration:%uL, time:%.3fs", - timescale, duration, (double) duration / timescale); - - start_time = (uint64_t) mp4->start * timescale / 1000; - - if (duration < start_time) { - ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0, - "\"%s\" mp4 start time exceeds file duration", - mp4->file.name.data); - return NGX_ERROR; - } - - duration -= start_time; - - if (mp4->length) { - length_time = (uint64_t) mp4->length * timescale / 1000; - - if (duration > length_time) { - duration = length_time; - } - } - - ngx_log_debug2(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0, - "mvhd new duration:%uL, time:%.3fs", - duration, (double) duration / timescale); - - atom_size = sizeof(ngx_mp4_atom_header_t) + (size_t) atom_data_size; - ngx_mp4_set_32value(mvhd_atom->size, atom_size); - - if (mvhd_atom->version[0] == 0) { - ngx_mp4_set_32value(mvhd_atom->duration, duration); - - } else { - ngx_mp4_set_64value(mvhd64_atom->duration, duration); - } - - atom = &mp4->mvhd_atom_buf; - atom->temporary = 1; - atom->pos = atom_header; - atom->last = atom_header + atom_size; - - mp4->mvhd_atom.buf = atom; - - ngx_mp4_atom_next(mp4, atom_data_size); - - return NGX_OK; -} - - -static ngx_int_t -ngx_http_mp4_read_trak_atom(ngx_http_mp4_file_t *mp4, uint64_t atom_data_size) -{ - u_char *atom_header, *atom_end; - off_t atom_file_end; - ngx_int_t rc; - ngx_buf_t *atom; - ngx_http_mp4_trak_t *trak; - - ngx_log_debug0(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0, "mp4 trak atom"); - - trak = ngx_array_push(&mp4->trak); - if (trak == NULL) { - return NGX_ERROR; - } - - ngx_memzero(trak, sizeof(ngx_http_mp4_trak_t)); - - atom_header = ngx_mp4_atom_header(mp4); - ngx_mp4_set_atom_name(atom_header, 't', 'r', 'a', 'k'); - - atom = &trak->trak_atom_buf; - atom->temporary = 1; - atom->pos = atom_header; - atom->last = atom_header + sizeof(ngx_mp4_atom_header_t); - - trak->out[NGX_HTTP_MP4_TRAK_ATOM].buf = atom; - - atom_end = mp4->buffer_pos + (size_t) atom_data_size; - atom_file_end = mp4->offset + atom_data_size; - - rc = ngx_http_mp4_read_atom(mp4, ngx_http_mp4_trak_atoms, atom_data_size); - - ngx_log_debug1(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0, - "mp4 trak atom: %i", rc); - - if (rc == NGX_DECLINED) { - /* skip this trak */ - ngx_memzero(trak, sizeof(ngx_http_mp4_trak_t)); - mp4->trak.nelts--; - mp4->buffer_pos = atom_end; - mp4->offset = atom_file_end; - return NGX_OK; - } - - return rc; -} - - -static void -ngx_http_mp4_update_trak_atom(ngx_http_mp4_file_t *mp4, - ngx_http_mp4_trak_t *trak) -{ - ngx_buf_t *atom; - - trak->size += sizeof(ngx_mp4_atom_header_t); - atom = &trak->trak_atom_buf; - ngx_mp4_set_32value(atom->pos, trak->size); -} - - -static ngx_int_t -ngx_http_mp4_read_cmov_atom(ngx_http_mp4_file_t *mp4, uint64_t atom_data_size) -{ - ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0, - "\"%s\" mp4 compressed moov atom (cmov) is not supported", - mp4->file.name.data); - - return NGX_ERROR; -} - - -typedef struct { - u_char size[4]; - u_char name[4]; - u_char version[1]; - u_char flags[3]; - u_char creation_time[4]; - u_char modification_time[4]; - u_char track_id[4]; - u_char reserved1[4]; - u_char duration[4]; - u_char reserved2[8]; - u_char layer[2]; - u_char group[2]; - u_char volume[2]; - u_char reserved3[2]; - u_char matrix[36]; - u_char width[4]; - u_char height[4]; -} ngx_mp4_tkhd_atom_t; - -typedef struct { - u_char size[4]; - u_char name[4]; - u_char version[1]; - u_char flags[3]; - u_char creation_time[8]; - u_char modification_time[8]; - u_char track_id[4]; - u_char reserved1[4]; - u_char duration[8]; - u_char reserved2[8]; - u_char layer[2]; - u_char group[2]; - u_char volume[2]; - u_char reserved3[2]; - u_char matrix[36]; - u_char width[4]; - u_char height[4]; -} ngx_mp4_tkhd64_atom_t; - - -static ngx_int_t -ngx_http_mp4_read_tkhd_atom(ngx_http_mp4_file_t *mp4, uint64_t atom_data_size) -{ - u_char *atom_header; - size_t atom_size; - uint64_t duration, start_time, length_time; - ngx_buf_t *atom; - ngx_http_mp4_trak_t *trak; - ngx_mp4_tkhd_atom_t *tkhd_atom; - ngx_mp4_tkhd64_atom_t *tkhd64_atom; - - ngx_log_debug0(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0, "mp4 tkhd atom"); - - atom_header = ngx_mp4_atom_header(mp4); - tkhd_atom = (ngx_mp4_tkhd_atom_t *) atom_header; - tkhd64_atom = (ngx_mp4_tkhd64_atom_t *) atom_header; - ngx_mp4_set_atom_name(tkhd_atom, 't', 'k', 'h', 'd'); - - if (ngx_mp4_atom_data_size(ngx_mp4_tkhd_atom_t) > atom_data_size) { - ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0, - "\"%s\" mp4 tkhd atom too small", mp4->file.name.data); - return NGX_ERROR; - } - - if (tkhd_atom->version[0] == 0) { - /* version 0: 32-bit duration */ - duration = ngx_mp4_get_32value(tkhd_atom->duration); - - } else { - /* version 1: 64-bit duration */ - - if (ngx_mp4_atom_data_size(ngx_mp4_tkhd64_atom_t) > atom_data_size) { - ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0, - "\"%s\" mp4 tkhd atom too small", - mp4->file.name.data); - return NGX_ERROR; - } - - duration = ngx_mp4_get_64value(tkhd64_atom->duration); - } - - ngx_log_debug2(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0, - "tkhd duration:%uL, time:%.3fs", - duration, (double) duration / mp4->timescale); - - start_time = (uint64_t) mp4->start * mp4->timescale / 1000; - - if (duration <= start_time) { - ngx_log_debug0(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0, - "tkhd duration is less than start time"); - return NGX_DECLINED; - } - - duration -= start_time; - - if (mp4->length) { - length_time = (uint64_t) mp4->length * mp4->timescale / 1000; - - if (duration > length_time) { - duration = length_time; - } - } - - ngx_log_debug2(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0, - "tkhd new duration:%uL, time:%.3fs", - duration, (double) duration / mp4->timescale); - - atom_size = sizeof(ngx_mp4_atom_header_t) + (size_t) atom_data_size; - - trak = ngx_mp4_last_trak(mp4); - - if (trak->out[NGX_HTTP_MP4_TKHD_ATOM].buf) { - ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0, - "duplicate mp4 tkhd atom in \"%s\"", mp4->file.name.data); - return NGX_ERROR; - } - - trak->tkhd_size = atom_size; - trak->movie_duration = duration; - - ngx_mp4_set_32value(tkhd_atom->size, atom_size); - - if (tkhd_atom->version[0] == 0) { - ngx_mp4_set_32value(tkhd_atom->duration, duration); - - } else { - ngx_mp4_set_64value(tkhd64_atom->duration, duration); - } - - atom = &trak->tkhd_atom_buf; - atom->temporary = 1; - atom->pos = atom_header; - atom->last = atom_header + atom_size; - - trak->out[NGX_HTTP_MP4_TKHD_ATOM].buf = atom; - - ngx_mp4_atom_next(mp4, atom_data_size); - - return NGX_OK; -} - - -static ngx_int_t -ngx_http_mp4_read_mdia_atom(ngx_http_mp4_file_t *mp4, uint64_t atom_data_size) -{ - u_char *atom_header; - ngx_buf_t *atom; - ngx_http_mp4_trak_t *trak; - - ngx_log_debug0(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0, "process mdia atom"); - - atom_header = ngx_mp4_atom_header(mp4); - ngx_mp4_set_atom_name(atom_header, 'm', 'd', 'i', 'a'); - - trak = ngx_mp4_last_trak(mp4); - - if (trak->out[NGX_HTTP_MP4_MDIA_ATOM].buf) { - ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0, - "duplicate mp4 mdia atom in \"%s\"", mp4->file.name.data); - return NGX_ERROR; - } - - atom = &trak->mdia_atom_buf; - atom->temporary = 1; - atom->pos = atom_header; - atom->last = atom_header + sizeof(ngx_mp4_atom_header_t); - - trak->out[NGX_HTTP_MP4_MDIA_ATOM].buf = atom; - - return ngx_http_mp4_read_atom(mp4, ngx_http_mp4_mdia_atoms, atom_data_size); -} - - -static void -ngx_http_mp4_update_mdia_atom(ngx_http_mp4_file_t *mp4, - ngx_http_mp4_trak_t *trak) -{ - ngx_buf_t *atom; - - trak->size += sizeof(ngx_mp4_atom_header_t); - atom = &trak->mdia_atom_buf; - ngx_mp4_set_32value(atom->pos, trak->size); -} - - -typedef struct { - u_char size[4]; - u_char name[4]; - u_char version[1]; - u_char flags[3]; - u_char creation_time[4]; - u_char modification_time[4]; - u_char timescale[4]; - u_char duration[4]; - u_char language[2]; - u_char quality[2]; -} ngx_mp4_mdhd_atom_t; - -typedef struct { - u_char size[4]; - u_char name[4]; - u_char version[1]; - u_char flags[3]; - u_char creation_time[8]; - u_char modification_time[8]; - u_char timescale[4]; - u_char duration[8]; - u_char language[2]; - u_char quality[2]; -} ngx_mp4_mdhd64_atom_t; - - -static ngx_int_t -ngx_http_mp4_read_mdhd_atom(ngx_http_mp4_file_t *mp4, uint64_t atom_data_size) -{ - u_char *atom_header; - size_t atom_size; - uint32_t timescale; - uint64_t duration, start_time, length_time; - ngx_buf_t *atom; - ngx_http_mp4_trak_t *trak; - ngx_mp4_mdhd_atom_t *mdhd_atom; - ngx_mp4_mdhd64_atom_t *mdhd64_atom; - - ngx_log_debug0(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0, "mp4 mdhd atom"); - - atom_header = ngx_mp4_atom_header(mp4); - mdhd_atom = (ngx_mp4_mdhd_atom_t *) atom_header; - mdhd64_atom = (ngx_mp4_mdhd64_atom_t *) atom_header; - ngx_mp4_set_atom_name(mdhd_atom, 'm', 'd', 'h', 'd'); - - if (ngx_mp4_atom_data_size(ngx_mp4_mdhd_atom_t) > atom_data_size) { - ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0, - "\"%s\" mp4 mdhd atom too small", mp4->file.name.data); - return NGX_ERROR; - } - - if (mdhd_atom->version[0] == 0) { - /* version 0: everything is 32-bit */ - timescale = ngx_mp4_get_32value(mdhd_atom->timescale); - duration = ngx_mp4_get_32value(mdhd_atom->duration); - - } else { - /* version 1: 64-bit duration and 32-bit timescale */ - - if (ngx_mp4_atom_data_size(ngx_mp4_mdhd64_atom_t) > atom_data_size) { - ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0, - "\"%s\" mp4 mdhd atom too small", - mp4->file.name.data); - return NGX_ERROR; - } - - timescale = ngx_mp4_get_32value(mdhd64_atom->timescale); - duration = ngx_mp4_get_64value(mdhd64_atom->duration); - } - - ngx_log_debug3(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0, - "mdhd timescale:%uD, duration:%uL, time:%.3fs", - timescale, duration, (double) duration / timescale); - - start_time = (uint64_t) mp4->start * timescale / 1000; - - if (duration <= start_time) { - ngx_log_debug0(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0, - "mdhd duration is less than start time"); - return NGX_DECLINED; - } - - duration -= start_time; - - if (mp4->length) { - length_time = (uint64_t) mp4->length * timescale / 1000; - - if (duration > length_time) { - duration = length_time; - } - } - - ngx_log_debug2(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0, - "mdhd new duration:%uL, time:%.3fs", - duration, (double) duration / timescale); - - atom_size = sizeof(ngx_mp4_atom_header_t) + (size_t) atom_data_size; - - trak = ngx_mp4_last_trak(mp4); - - if (trak->out[NGX_HTTP_MP4_MDHD_ATOM].buf) { - ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0, - "duplicate mp4 mdhd atom in \"%s\"", mp4->file.name.data); - return NGX_ERROR; - } - - trak->mdhd_size = atom_size; - trak->timescale = timescale; - trak->duration = duration; - - ngx_mp4_set_32value(mdhd_atom->size, atom_size); - - atom = &trak->mdhd_atom_buf; - atom->temporary = 1; - atom->pos = atom_header; - atom->last = atom_header + atom_size; - - trak->out[NGX_HTTP_MP4_MDHD_ATOM].buf = atom; - - ngx_mp4_atom_next(mp4, atom_data_size); - - return NGX_OK; -} - - -static void -ngx_http_mp4_update_mdhd_atom(ngx_http_mp4_file_t *mp4, - ngx_http_mp4_trak_t *trak) -{ - ngx_buf_t *atom; - ngx_mp4_mdhd_atom_t *mdhd_atom; - ngx_mp4_mdhd64_atom_t *mdhd64_atom; - - atom = trak->out[NGX_HTTP_MP4_MDHD_ATOM].buf; - if (atom == NULL) { - return; - } - - mdhd_atom = (ngx_mp4_mdhd_atom_t *) atom->pos; - mdhd64_atom = (ngx_mp4_mdhd64_atom_t *) atom->pos; - - if (mdhd_atom->version[0] == 0) { - ngx_mp4_set_32value(mdhd_atom->duration, trak->duration); - - } else { - ngx_mp4_set_64value(mdhd64_atom->duration, trak->duration); - } - - trak->size += trak->mdhd_size; -} - - -static ngx_int_t -ngx_http_mp4_read_hdlr_atom(ngx_http_mp4_file_t *mp4, uint64_t atom_data_size) -{ - u_char *atom_header; - size_t atom_size; - ngx_buf_t *atom; - ngx_http_mp4_trak_t *trak; - - ngx_log_debug0(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0, "mp4 hdlr atom"); - - atom_header = ngx_mp4_atom_header(mp4); - atom_size = sizeof(ngx_mp4_atom_header_t) + (size_t) atom_data_size; - ngx_mp4_set_32value(atom_header, atom_size); - ngx_mp4_set_atom_name(atom_header, 'h', 'd', 'l', 'r'); - - trak = ngx_mp4_last_trak(mp4); - - if (trak->out[NGX_HTTP_MP4_HDLR_ATOM].buf) { - ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0, - "duplicate mp4 hdlr atom in \"%s\"", mp4->file.name.data); - return NGX_ERROR; - } - - atom = &trak->hdlr_atom_buf; - atom->temporary = 1; - atom->pos = atom_header; - atom->last = atom_header + atom_size; - - trak->hdlr_size = atom_size; - trak->out[NGX_HTTP_MP4_HDLR_ATOM].buf = atom; - - ngx_mp4_atom_next(mp4, atom_data_size); - - return NGX_OK; -} - - -static ngx_int_t -ngx_http_mp4_read_minf_atom(ngx_http_mp4_file_t *mp4, uint64_t atom_data_size) -{ - u_char *atom_header; - ngx_buf_t *atom; - ngx_http_mp4_trak_t *trak; - - ngx_log_debug0(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0, "process minf atom"); - - atom_header = ngx_mp4_atom_header(mp4); - ngx_mp4_set_atom_name(atom_header, 'm', 'i', 'n', 'f'); - - trak = ngx_mp4_last_trak(mp4); - - if (trak->out[NGX_HTTP_MP4_MINF_ATOM].buf) { - ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0, - "duplicate mp4 minf atom in \"%s\"", mp4->file.name.data); - return NGX_ERROR; - } - - atom = &trak->minf_atom_buf; - atom->temporary = 1; - atom->pos = atom_header; - atom->last = atom_header + sizeof(ngx_mp4_atom_header_t); - - trak->out[NGX_HTTP_MP4_MINF_ATOM].buf = atom; - - return ngx_http_mp4_read_atom(mp4, ngx_http_mp4_minf_atoms, atom_data_size); -} - - -static void -ngx_http_mp4_update_minf_atom(ngx_http_mp4_file_t *mp4, - ngx_http_mp4_trak_t *trak) -{ - ngx_buf_t *atom; - - trak->size += sizeof(ngx_mp4_atom_header_t) - + trak->vmhd_size - + trak->smhd_size - + trak->dinf_size; - atom = &trak->minf_atom_buf; - ngx_mp4_set_32value(atom->pos, trak->size); -} - - -static ngx_int_t -ngx_http_mp4_read_vmhd_atom(ngx_http_mp4_file_t *mp4, uint64_t atom_data_size) -{ - u_char *atom_header; - size_t atom_size; - ngx_buf_t *atom; - ngx_http_mp4_trak_t *trak; - - ngx_log_debug0(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0, "mp4 vmhd atom"); - - atom_header = ngx_mp4_atom_header(mp4); - atom_size = sizeof(ngx_mp4_atom_header_t) + (size_t) atom_data_size; - ngx_mp4_set_32value(atom_header, atom_size); - ngx_mp4_set_atom_name(atom_header, 'v', 'm', 'h', 'd'); - - trak = ngx_mp4_last_trak(mp4); - - if (trak->out[NGX_HTTP_MP4_VMHD_ATOM].buf - || trak->out[NGX_HTTP_MP4_SMHD_ATOM].buf) - { - ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0, - "duplicate mp4 vmhd/smhd atom in \"%s\"", - mp4->file.name.data); - return NGX_ERROR; - } - - atom = &trak->vmhd_atom_buf; - atom->temporary = 1; - atom->pos = atom_header; - atom->last = atom_header + atom_size; - - trak->vmhd_size += atom_size; - trak->out[NGX_HTTP_MP4_VMHD_ATOM].buf = atom; - - ngx_mp4_atom_next(mp4, atom_data_size); - - return NGX_OK; -} - - -static ngx_int_t -ngx_http_mp4_read_smhd_atom(ngx_http_mp4_file_t *mp4, uint64_t atom_data_size) -{ - u_char *atom_header; - size_t atom_size; - ngx_buf_t *atom; - ngx_http_mp4_trak_t *trak; - - ngx_log_debug0(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0, "mp4 smhd atom"); - - atom_header = ngx_mp4_atom_header(mp4); - atom_size = sizeof(ngx_mp4_atom_header_t) + (size_t) atom_data_size; - ngx_mp4_set_32value(atom_header, atom_size); - ngx_mp4_set_atom_name(atom_header, 's', 'm', 'h', 'd'); - - trak = ngx_mp4_last_trak(mp4); - - if (trak->out[NGX_HTTP_MP4_VMHD_ATOM].buf - || trak->out[NGX_HTTP_MP4_SMHD_ATOM].buf) - { - ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0, - "duplicate mp4 vmhd/smhd atom in \"%s\"", - mp4->file.name.data); - return NGX_ERROR; - } - - atom = &trak->smhd_atom_buf; - atom->temporary = 1; - atom->pos = atom_header; - atom->last = atom_header + atom_size; - - trak->smhd_size += atom_size; - trak->out[NGX_HTTP_MP4_SMHD_ATOM].buf = atom; - - ngx_mp4_atom_next(mp4, atom_data_size); - - return NGX_OK; -} - - -static ngx_int_t -ngx_http_mp4_read_dinf_atom(ngx_http_mp4_file_t *mp4, uint64_t atom_data_size) -{ - u_char *atom_header; - size_t atom_size; - ngx_buf_t *atom; - ngx_http_mp4_trak_t *trak; - - ngx_log_debug0(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0, "mp4 dinf atom"); - - atom_header = ngx_mp4_atom_header(mp4); - atom_size = sizeof(ngx_mp4_atom_header_t) + (size_t) atom_data_size; - ngx_mp4_set_32value(atom_header, atom_size); - ngx_mp4_set_atom_name(atom_header, 'd', 'i', 'n', 'f'); - - trak = ngx_mp4_last_trak(mp4); - - if (trak->out[NGX_HTTP_MP4_DINF_ATOM].buf) { - ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0, - "duplicate mp4 dinf atom in \"%s\"", mp4->file.name.data); - return NGX_ERROR; - } - - atom = &trak->dinf_atom_buf; - atom->temporary = 1; - atom->pos = atom_header; - atom->last = atom_header + atom_size; - - trak->dinf_size += atom_size; - trak->out[NGX_HTTP_MP4_DINF_ATOM].buf = atom; - - ngx_mp4_atom_next(mp4, atom_data_size); - - return NGX_OK; -} - - -static ngx_int_t -ngx_http_mp4_read_stbl_atom(ngx_http_mp4_file_t *mp4, uint64_t atom_data_size) -{ - u_char *atom_header; - ngx_buf_t *atom; - ngx_http_mp4_trak_t *trak; - - ngx_log_debug0(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0, "process stbl atom"); - - atom_header = ngx_mp4_atom_header(mp4); - ngx_mp4_set_atom_name(atom_header, 's', 't', 'b', 'l'); - - trak = ngx_mp4_last_trak(mp4); - - if (trak->out[NGX_HTTP_MP4_STBL_ATOM].buf) { - ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0, - "duplicate mp4 stbl atom in \"%s\"", mp4->file.name.data); - return NGX_ERROR; - } - - atom = &trak->stbl_atom_buf; - atom->temporary = 1; - atom->pos = atom_header; - atom->last = atom_header + sizeof(ngx_mp4_atom_header_t); - - trak->out[NGX_HTTP_MP4_STBL_ATOM].buf = atom; - - return ngx_http_mp4_read_atom(mp4, ngx_http_mp4_stbl_atoms, atom_data_size); -} - - -static void -ngx_http_mp4_update_edts_atom(ngx_http_mp4_file_t *mp4, - ngx_http_mp4_trak_t *trak) -{ - ngx_buf_t *atom; - ngx_mp4_elst_atom_t *elst_atom; - ngx_mp4_edts_atom_t *edts_atom; - - if (trak->prefix == 0) { - return; - } - - ngx_log_debug1(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0, - "mp4 edts atom update prefix:%uL", trak->prefix); - - edts_atom = &trak->edts_atom; - ngx_mp4_set_32value(edts_atom->size, sizeof(ngx_mp4_edts_atom_t) - + sizeof(ngx_mp4_elst_atom_t)); - ngx_mp4_set_atom_name(edts_atom, 'e', 'd', 't', 's'); - - atom = &trak->edts_atom_buf; - atom->temporary = 1; - atom->pos = (u_char *) edts_atom; - atom->last = (u_char *) edts_atom + sizeof(ngx_mp4_edts_atom_t); - - trak->out[NGX_HTTP_MP4_EDTS_ATOM].buf = atom; - - elst_atom = &trak->elst_atom; - ngx_mp4_set_32value(elst_atom->size, sizeof(ngx_mp4_elst_atom_t)); - ngx_mp4_set_atom_name(elst_atom, 'e', 'l', 's', 't'); - - elst_atom->version[0] = 1; - elst_atom->flags[0] = 0; - elst_atom->flags[1] = 0; - elst_atom->flags[2] = 0; - - ngx_mp4_set_32value(elst_atom->entries, 1); - ngx_mp4_set_64value(elst_atom->duration, trak->movie_duration); - ngx_mp4_set_64value(elst_atom->media_time, trak->prefix); - ngx_mp4_set_16value(elst_atom->media_rate, 1); - ngx_mp4_set_16value(elst_atom->reserved, 0); - - atom = &trak->elst_atom_buf; - atom->temporary = 1; - atom->pos = (u_char *) elst_atom; - atom->last = (u_char *) elst_atom + sizeof(ngx_mp4_elst_atom_t); - - trak->out[NGX_HTTP_MP4_ELST_ATOM].buf = atom; - - trak->size += sizeof(ngx_mp4_edts_atom_t) + sizeof(ngx_mp4_elst_atom_t); -} - - -static void -ngx_http_mp4_update_stbl_atom(ngx_http_mp4_file_t *mp4, - ngx_http_mp4_trak_t *trak) -{ - ngx_buf_t *atom; - - trak->size += sizeof(ngx_mp4_atom_header_t); - atom = &trak->stbl_atom_buf; - ngx_mp4_set_32value(atom->pos, trak->size); -} - - -typedef struct { - u_char size[4]; - u_char name[4]; - u_char version[1]; - u_char flags[3]; - u_char entries[4]; - - u_char media_size[4]; - u_char media_name[4]; -} ngx_mp4_stsd_atom_t; - - -static ngx_int_t -ngx_http_mp4_read_stsd_atom(ngx_http_mp4_file_t *mp4, uint64_t atom_data_size) -{ - u_char *atom_header, *atom_table; - size_t atom_size; - ngx_buf_t *atom; - ngx_mp4_stsd_atom_t *stsd_atom; - ngx_http_mp4_trak_t *trak; - - /* sample description atom */ - - ngx_log_debug0(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0, "mp4 stsd atom"); - - atom_header = ngx_mp4_atom_header(mp4); - stsd_atom = (ngx_mp4_stsd_atom_t *) atom_header; - atom_size = sizeof(ngx_mp4_atom_header_t) + (size_t) atom_data_size; - atom_table = atom_header + atom_size; - ngx_mp4_set_32value(stsd_atom->size, atom_size); - ngx_mp4_set_atom_name(stsd_atom, 's', 't', 's', 'd'); - - if (ngx_mp4_atom_data_size(ngx_mp4_stsd_atom_t) > atom_data_size) { - ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0, - "\"%s\" mp4 stsd atom too small", mp4->file.name.data); - return NGX_ERROR; - } - - ngx_log_debug3(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0, - "stsd entries:%uD, media:%*s", - ngx_mp4_get_32value(stsd_atom->entries), - (size_t) 4, stsd_atom->media_name); - - trak = ngx_mp4_last_trak(mp4); - - if (trak->out[NGX_HTTP_MP4_STSD_ATOM].buf) { - ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0, - "duplicate mp4 stsd atom in \"%s\"", mp4->file.name.data); - return NGX_ERROR; - } - - atom = &trak->stsd_atom_buf; - atom->temporary = 1; - atom->pos = atom_header; - atom->last = atom_table; - - trak->out[NGX_HTTP_MP4_STSD_ATOM].buf = atom; - trak->size += atom_size; - - ngx_mp4_atom_next(mp4, atom_data_size); - - return NGX_OK; -} - - -typedef struct { - u_char size[4]; - u_char name[4]; - u_char version[1]; - u_char flags[3]; - u_char entries[4]; -} ngx_mp4_stts_atom_t; - -typedef struct { - u_char count[4]; - u_char duration[4]; -} ngx_mp4_stts_entry_t; - - -static ngx_int_t -ngx_http_mp4_read_stts_atom(ngx_http_mp4_file_t *mp4, uint64_t atom_data_size) -{ - u_char *atom_header, *atom_table, *atom_end; - uint32_t entries; - ngx_buf_t *atom, *data; - ngx_mp4_stts_atom_t *stts_atom; - ngx_http_mp4_trak_t *trak; - - /* time-to-sample atom */ - - ngx_log_debug0(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0, "mp4 stts atom"); - - atom_header = ngx_mp4_atom_header(mp4); - stts_atom = (ngx_mp4_stts_atom_t *) atom_header; - ngx_mp4_set_atom_name(stts_atom, 's', 't', 't', 's'); - - if (ngx_mp4_atom_data_size(ngx_mp4_stts_atom_t) > atom_data_size) { - ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0, - "\"%s\" mp4 stts atom too small", mp4->file.name.data); - return NGX_ERROR; - } - - entries = ngx_mp4_get_32value(stts_atom->entries); - - ngx_log_debug1(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0, - "mp4 time-to-sample entries:%uD", entries); - - if (ngx_mp4_atom_data_size(ngx_mp4_stts_atom_t) - + (uint64_t) entries * sizeof(ngx_mp4_stts_entry_t) > atom_data_size) - { - ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0, - "\"%s\" mp4 stts atom too small", mp4->file.name.data); - return NGX_ERROR; - } - - atom_table = atom_header + sizeof(ngx_mp4_stts_atom_t); - atom_end = atom_table + entries * sizeof(ngx_mp4_stts_entry_t); - - trak = ngx_mp4_last_trak(mp4); - - if (trak->out[NGX_HTTP_MP4_STTS_ATOM].buf) { - ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0, - "duplicate mp4 stts atom in \"%s\"", mp4->file.name.data); - return NGX_ERROR; - } - - trak->time_to_sample_entries = entries; - - atom = &trak->stts_atom_buf; - atom->temporary = 1; - atom->pos = atom_header; - atom->last = atom_table; - - data = &trak->stts_data_buf; - data->temporary = 1; - data->pos = atom_table; - data->last = atom_end; - - trak->out[NGX_HTTP_MP4_STTS_ATOM].buf = atom; - trak->out[NGX_HTTP_MP4_STTS_DATA].buf = data; - - ngx_mp4_atom_next(mp4, atom_data_size); - - return NGX_OK; -} - - -static ngx_int_t -ngx_http_mp4_update_stts_atom(ngx_http_mp4_file_t *mp4, - ngx_http_mp4_trak_t *trak) -{ - size_t atom_size; - ngx_buf_t *atom, *data; - ngx_mp4_stts_atom_t *stts_atom; - - /* - * mdia.minf.stbl.stts updating requires trak->timescale - * from mdia.mdhd atom which may reside after mdia.minf - */ - - ngx_log_debug0(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0, - "mp4 stts atom update"); - - data = trak->out[NGX_HTTP_MP4_STTS_DATA].buf; - - if (data == NULL) { - ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0, - "no mp4 stts atoms were found in \"%s\"", - mp4->file.name.data); - return NGX_ERROR; - } - - if (ngx_http_mp4_crop_stts_data(mp4, trak, 1) != NGX_OK) { - return NGX_ERROR; - } - - if (ngx_http_mp4_crop_stts_data(mp4, trak, 0) != NGX_OK) { - return NGX_ERROR; - } - - ngx_log_debug1(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0, - "time-to-sample entries:%uD", trak->time_to_sample_entries); - - atom_size = sizeof(ngx_mp4_stts_atom_t) + (data->last - data->pos); - trak->size += atom_size; - - atom = trak->out[NGX_HTTP_MP4_STTS_ATOM].buf; - stts_atom = (ngx_mp4_stts_atom_t *) atom->pos; - ngx_mp4_set_32value(stts_atom->size, atom_size); - ngx_mp4_set_32value(stts_atom->entries, trak->time_to_sample_entries); - - return NGX_OK; -} - - -static ngx_int_t -ngx_http_mp4_crop_stts_data(ngx_http_mp4_file_t *mp4, - ngx_http_mp4_trak_t *trak, ngx_uint_t start) -{ - uint32_t count, duration, rest, key_prefix; - uint64_t start_time; - ngx_buf_t *data; - ngx_uint_t start_sample, entries, start_sec; - ngx_mp4_stts_entry_t *entry, *end; - - if (start) { - start_sec = mp4->start; - - ngx_log_debug1(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0, - "mp4 stts crop start_time:%ui", start_sec); - - } else if (mp4->length) { - start_sec = mp4->length; - - ngx_log_debug1(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0, - "mp4 stts crop end_time:%ui", start_sec); - - } else { - return NGX_OK; - } - - data = trak->out[NGX_HTTP_MP4_STTS_DATA].buf; - - start_time = (uint64_t) start_sec * trak->timescale / 1000 + trak->prefix; - - entries = trak->time_to_sample_entries; - start_sample = 0; - entry = (ngx_mp4_stts_entry_t *) data->pos; - end = (ngx_mp4_stts_entry_t *) data->last; - - while (entry < end) { - count = ngx_mp4_get_32value(entry->count); - duration = ngx_mp4_get_32value(entry->duration); - - ngx_log_debug3(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0, - "time:%uL, count:%uD, duration:%uD", - start_time, count, duration); - - if (start_time < (uint64_t) count * duration) { - start_sample += (ngx_uint_t) (start_time / duration); - rest = (uint32_t) (start_time / duration); - goto found; - } - - start_sample += count; - start_time -= (uint64_t) count * duration; - entries--; - entry++; - } - - if (start) { - ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0, - "start time is out mp4 stts samples in \"%s\"", - mp4->file.name.data); - - return NGX_ERROR; - - } else { - trak->end_sample = trak->start_sample + start_sample; - - ngx_log_debug1(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0, - "end_sample:%ui", trak->end_sample); - - return NGX_OK; - } - -found: - - if (start) { - if (ngx_http_mp4_seek_key_frame(mp4, trak, start_sample, &key_prefix) - != NGX_OK) - { - return NGX_ERROR; - } - - start_sample -= key_prefix; - - while (rest < key_prefix) { - trak->prefix += rest * duration; - key_prefix -= rest; - - entry--; - entries++; - - count = ngx_mp4_get_32value(entry->count); - duration = ngx_mp4_get_32value(entry->duration); - rest = count; - } - - trak->prefix += key_prefix * duration; - trak->duration += trak->prefix; - rest -= key_prefix; - - ngx_mp4_set_32value(entry->count, count - rest); - data->pos = (u_char *) entry; - trak->time_to_sample_entries = entries; - trak->start_sample = start_sample; - - ngx_log_debug2(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0, - "start_sample:%ui, new count:%uD", - trak->start_sample, count - rest); - - } else { - ngx_mp4_set_32value(entry->count, rest); - data->last = (u_char *) (entry + 1); - trak->time_to_sample_entries -= entries - 1; - trak->end_sample = trak->start_sample + start_sample; - - ngx_log_debug2(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0, - "end_sample:%ui, new count:%uD", - trak->end_sample, rest); - } - - return NGX_OK; -} - - -static ngx_int_t -ngx_http_mp4_seek_key_frame(ngx_http_mp4_file_t *mp4, ngx_http_mp4_trak_t *trak, - uint32_t start_sample, uint32_t *key_prefix) -{ - uint32_t sample, *entry, *end; - ngx_buf_t *data; - ngx_http_mp4_conf_t *conf; - - *key_prefix = 0; - - conf = ngx_http_get_module_loc_conf(mp4->request, ngx_http_mp4_module); - if (!conf->start_key_frame) { - return NGX_OK; - } - - data = trak->out[NGX_HTTP_MP4_STSS_DATA].buf; - if (data == NULL) { - return NGX_OK; - } - - entry = (uint32_t *) data->pos; - end = (uint32_t *) data->last; - - /* sync samples starts from 1 */ - start_sample++; - - while (entry < end) { - sample = ngx_mp4_get_32value(entry); - - if (sample == 0) { - ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0, - "zero sync sample in \"%s\"", - mp4->file.name.data); - return NGX_ERROR; - } - - if (sample > start_sample) { - break; - } - - *key_prefix = start_sample - sample; - entry++; - } - - ngx_log_debug1(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0, - "mp4 key frame prefix:%uD", *key_prefix); - - return NGX_OK; -} - - -typedef struct { - u_char size[4]; - u_char name[4]; - u_char version[1]; - u_char flags[3]; - u_char entries[4]; -} ngx_http_mp4_stss_atom_t; - - -static ngx_int_t -ngx_http_mp4_read_stss_atom(ngx_http_mp4_file_t *mp4, uint64_t atom_data_size) -{ - u_char *atom_header, *atom_table, *atom_end; - uint32_t entries; - ngx_buf_t *atom, *data; - ngx_http_mp4_trak_t *trak; - ngx_http_mp4_stss_atom_t *stss_atom; - - /* sync samples atom */ - - ngx_log_debug0(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0, "mp4 stss atom"); - - atom_header = ngx_mp4_atom_header(mp4); - stss_atom = (ngx_http_mp4_stss_atom_t *) atom_header; - ngx_mp4_set_atom_name(stss_atom, 's', 't', 's', 's'); - - if (ngx_mp4_atom_data_size(ngx_http_mp4_stss_atom_t) > atom_data_size) { - ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0, - "\"%s\" mp4 stss atom too small", mp4->file.name.data); - return NGX_ERROR; - } - - entries = ngx_mp4_get_32value(stss_atom->entries); - - ngx_log_debug1(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0, - "sync sample entries:%uD", entries); - - trak = ngx_mp4_last_trak(mp4); - - if (trak->out[NGX_HTTP_MP4_STSS_ATOM].buf) { - ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0, - "duplicate mp4 stss atom in \"%s\"", mp4->file.name.data); - return NGX_ERROR; - } - - trak->sync_samples_entries = entries; - - atom_table = atom_header + sizeof(ngx_http_mp4_stss_atom_t); - - atom = &trak->stss_atom_buf; - atom->temporary = 1; - atom->pos = atom_header; - atom->last = atom_table; - - if (ngx_mp4_atom_data_size(ngx_http_mp4_stss_atom_t) - + (uint64_t) entries * sizeof(uint32_t) > atom_data_size) - { - ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0, - "\"%s\" mp4 stss atom too small", mp4->file.name.data); - return NGX_ERROR; - } - - atom_end = atom_table + entries * sizeof(uint32_t); - - data = &trak->stss_data_buf; - data->temporary = 1; - data->pos = atom_table; - data->last = atom_end; - - trak->out[NGX_HTTP_MP4_STSS_ATOM].buf = atom; - trak->out[NGX_HTTP_MP4_STSS_DATA].buf = data; - - ngx_mp4_atom_next(mp4, atom_data_size); - - return NGX_OK; -} - - -static ngx_int_t -ngx_http_mp4_update_stss_atom(ngx_http_mp4_file_t *mp4, - ngx_http_mp4_trak_t *trak) -{ - size_t atom_size; - uint32_t sample, start_sample, *entry, *end; - ngx_buf_t *atom, *data; - ngx_http_mp4_stss_atom_t *stss_atom; - - /* - * mdia.minf.stbl.stss updating requires trak->start_sample - * from mdia.minf.stbl.stts which depends on value from mdia.mdhd - * atom which may reside after mdia.minf - */ - - ngx_log_debug0(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0, - "mp4 stss atom update"); - - data = trak->out[NGX_HTTP_MP4_STSS_DATA].buf; - - if (data == NULL) { - return NGX_OK; - } - - ngx_http_mp4_crop_stss_data(mp4, trak, 1); - ngx_http_mp4_crop_stss_data(mp4, trak, 0); - - ngx_log_debug1(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0, - "sync sample entries:%uD", trak->sync_samples_entries); - - if (trak->sync_samples_entries) { - entry = (uint32_t *) data->pos; - end = (uint32_t *) data->last; - - start_sample = trak->start_sample; - - while (entry < end) { - sample = ngx_mp4_get_32value(entry); - sample -= start_sample; - ngx_mp4_set_32value(entry, sample); - entry++; - } - - } else { - trak->out[NGX_HTTP_MP4_STSS_DATA].buf = NULL; - } - - atom_size = sizeof(ngx_http_mp4_stss_atom_t) + (data->last - data->pos); - trak->size += atom_size; - - atom = trak->out[NGX_HTTP_MP4_STSS_ATOM].buf; - stss_atom = (ngx_http_mp4_stss_atom_t *) atom->pos; - - ngx_mp4_set_32value(stss_atom->size, atom_size); - ngx_mp4_set_32value(stss_atom->entries, trak->sync_samples_entries); - - return NGX_OK; -} - - -static void -ngx_http_mp4_crop_stss_data(ngx_http_mp4_file_t *mp4, - ngx_http_mp4_trak_t *trak, ngx_uint_t start) -{ - uint32_t sample, start_sample, *entry, *end; - ngx_buf_t *data; - ngx_uint_t entries; - - /* sync samples starts from 1 */ - - if (start) { - start_sample = trak->start_sample + 1; - - ngx_log_debug1(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0, - "mp4 stss crop start_sample:%uD", start_sample); - - } else if (mp4->length) { - start_sample = trak->end_sample + 1; - - ngx_log_debug1(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0, - "mp4 stss crop end_sample:%uD", start_sample); - - } else { - return; - } - - data = trak->out[NGX_HTTP_MP4_STSS_DATA].buf; - - entries = trak->sync_samples_entries; - entry = (uint32_t *) data->pos; - end = (uint32_t *) data->last; - - while (entry < end) { - sample = ngx_mp4_get_32value(entry); - - ngx_log_debug1(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0, - "sync:%uD", sample); - - if (sample >= start_sample) { - goto found; - } - - entries--; - entry++; - } - - ngx_log_debug0(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0, - "sample is out of mp4 stss atom"); - -found: - - if (start) { - data->pos = (u_char *) entry; - trak->sync_samples_entries = entries; - - } else { - data->last = (u_char *) entry; - trak->sync_samples_entries -= entries; - } -} - - -typedef struct { - u_char size[4]; - u_char name[4]; - u_char version[1]; - u_char flags[3]; - u_char entries[4]; -} ngx_mp4_ctts_atom_t; - -typedef struct { - u_char count[4]; - u_char offset[4]; -} ngx_mp4_ctts_entry_t; - - -static ngx_int_t -ngx_http_mp4_read_ctts_atom(ngx_http_mp4_file_t *mp4, uint64_t atom_data_size) -{ - u_char *atom_header, *atom_table, *atom_end; - uint32_t entries; - ngx_buf_t *atom, *data; - ngx_mp4_ctts_atom_t *ctts_atom; - ngx_http_mp4_trak_t *trak; - - /* composition offsets atom */ - - ngx_log_debug0(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0, "mp4 ctts atom"); - - atom_header = ngx_mp4_atom_header(mp4); - ctts_atom = (ngx_mp4_ctts_atom_t *) atom_header; - ngx_mp4_set_atom_name(ctts_atom, 'c', 't', 't', 's'); - - if (ngx_mp4_atom_data_size(ngx_mp4_ctts_atom_t) > atom_data_size) { - ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0, - "\"%s\" mp4 ctts atom too small", mp4->file.name.data); - return NGX_ERROR; - } - - entries = ngx_mp4_get_32value(ctts_atom->entries); - - ngx_log_debug1(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0, - "composition offset entries:%uD", entries); - - trak = ngx_mp4_last_trak(mp4); - - if (trak->out[NGX_HTTP_MP4_CTTS_ATOM].buf) { - ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0, - "duplicate mp4 ctts atom in \"%s\"", mp4->file.name.data); - return NGX_ERROR; - } - - trak->composition_offset_entries = entries; - - atom_table = atom_header + sizeof(ngx_mp4_ctts_atom_t); - - atom = &trak->ctts_atom_buf; - atom->temporary = 1; - atom->pos = atom_header; - atom->last = atom_table; - - if (ngx_mp4_atom_data_size(ngx_mp4_ctts_atom_t) - + (uint64_t) entries * sizeof(ngx_mp4_ctts_entry_t) > atom_data_size) - { - ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0, - "\"%s\" mp4 ctts atom too small", mp4->file.name.data); - return NGX_ERROR; - } - - atom_end = atom_table + entries * sizeof(ngx_mp4_ctts_entry_t); - - data = &trak->ctts_data_buf; - data->temporary = 1; - data->pos = atom_table; - data->last = atom_end; - - trak->out[NGX_HTTP_MP4_CTTS_ATOM].buf = atom; - trak->out[NGX_HTTP_MP4_CTTS_DATA].buf = data; - - ngx_mp4_atom_next(mp4, atom_data_size); - - return NGX_OK; -} - - -static void -ngx_http_mp4_update_ctts_atom(ngx_http_mp4_file_t *mp4, - ngx_http_mp4_trak_t *trak) -{ - size_t atom_size; - ngx_buf_t *atom, *data; - ngx_mp4_ctts_atom_t *ctts_atom; - - /* - * mdia.minf.stbl.ctts updating requires trak->start_sample - * from mdia.minf.stbl.stts which depends on value from mdia.mdhd - * atom which may reside after mdia.minf - */ - - ngx_log_debug0(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0, - "mp4 ctts atom update"); - - data = trak->out[NGX_HTTP_MP4_CTTS_DATA].buf; - - if (data == NULL) { - return; - } - - ngx_http_mp4_crop_ctts_data(mp4, trak, 1); - ngx_http_mp4_crop_ctts_data(mp4, trak, 0); - - ngx_log_debug1(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0, - "composition offset entries:%uD", - trak->composition_offset_entries); - - if (trak->composition_offset_entries == 0) { - trak->out[NGX_HTTP_MP4_CTTS_ATOM].buf = NULL; - trak->out[NGX_HTTP_MP4_CTTS_DATA].buf = NULL; - return; - } - - atom_size = sizeof(ngx_mp4_ctts_atom_t) + (data->last - data->pos); - trak->size += atom_size; - - atom = trak->out[NGX_HTTP_MP4_CTTS_ATOM].buf; - ctts_atom = (ngx_mp4_ctts_atom_t *) atom->pos; - - ngx_mp4_set_32value(ctts_atom->size, atom_size); - ngx_mp4_set_32value(ctts_atom->entries, trak->composition_offset_entries); - - return; -} - - -static void -ngx_http_mp4_crop_ctts_data(ngx_http_mp4_file_t *mp4, - ngx_http_mp4_trak_t *trak, ngx_uint_t start) -{ - uint32_t count, start_sample, rest; - ngx_buf_t *data; - ngx_uint_t entries; - ngx_mp4_ctts_entry_t *entry, *end; - - /* sync samples starts from 1 */ - - if (start) { - start_sample = trak->start_sample + 1; - - ngx_log_debug1(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0, - "mp4 ctts crop start_sample:%uD", start_sample); - - } else if (mp4->length) { - start_sample = trak->end_sample - trak->start_sample + 1; - - ngx_log_debug1(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0, - "mp4 ctts crop end_sample:%uD", start_sample); - - } else { - return; - } - - data = trak->out[NGX_HTTP_MP4_CTTS_DATA].buf; - - entries = trak->composition_offset_entries; - entry = (ngx_mp4_ctts_entry_t *) data->pos; - end = (ngx_mp4_ctts_entry_t *) data->last; - - while (entry < end) { - count = ngx_mp4_get_32value(entry->count); - - ngx_log_debug3(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0, - "sample:%uD, count:%uD, offset:%uD", - start_sample, count, ngx_mp4_get_32value(entry->offset)); - - if (start_sample <= count) { - rest = start_sample - 1; - goto found; - } - - start_sample -= count; - entries--; - entry++; - } - - if (start) { - data->pos = (u_char *) end; - trak->composition_offset_entries = 0; - } - - return; - -found: - - if (start) { - ngx_mp4_set_32value(entry->count, count - rest); - data->pos = (u_char *) entry; - trak->composition_offset_entries = entries; - - } else { - ngx_mp4_set_32value(entry->count, rest); - data->last = (u_char *) (entry + 1); - trak->composition_offset_entries -= entries - 1; - } -} - - -typedef struct { - u_char size[4]; - u_char name[4]; - u_char version[1]; - u_char flags[3]; - u_char entries[4]; -} ngx_mp4_stsc_atom_t; - - -static ngx_int_t -ngx_http_mp4_read_stsc_atom(ngx_http_mp4_file_t *mp4, uint64_t atom_data_size) -{ - u_char *atom_header, *atom_table, *atom_end; - uint32_t entries; - ngx_buf_t *atom, *data; - ngx_mp4_stsc_atom_t *stsc_atom; - ngx_http_mp4_trak_t *trak; - - /* sample-to-chunk atom */ - - ngx_log_debug0(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0, "mp4 stsc atom"); - - atom_header = ngx_mp4_atom_header(mp4); - stsc_atom = (ngx_mp4_stsc_atom_t *) atom_header; - ngx_mp4_set_atom_name(stsc_atom, 's', 't', 's', 'c'); - - if (ngx_mp4_atom_data_size(ngx_mp4_stsc_atom_t) > atom_data_size) { - ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0, - "\"%s\" mp4 stsc atom too small", mp4->file.name.data); - return NGX_ERROR; - } - - entries = ngx_mp4_get_32value(stsc_atom->entries); - - ngx_log_debug1(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0, - "sample-to-chunk entries:%uD", entries); - - if (ngx_mp4_atom_data_size(ngx_mp4_stsc_atom_t) - + (uint64_t) entries * sizeof(ngx_mp4_stsc_entry_t) > atom_data_size) - { - ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0, - "\"%s\" mp4 stsc atom too small", mp4->file.name.data); - return NGX_ERROR; - } - - atom_table = atom_header + sizeof(ngx_mp4_stsc_atom_t); - atom_end = atom_table + entries * sizeof(ngx_mp4_stsc_entry_t); - - trak = ngx_mp4_last_trak(mp4); - - if (trak->out[NGX_HTTP_MP4_STSC_ATOM].buf) { - ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0, - "duplicate mp4 stsc atom in \"%s\"", mp4->file.name.data); - return NGX_ERROR; - } - - trak->sample_to_chunk_entries = entries; - - atom = &trak->stsc_atom_buf; - atom->temporary = 1; - atom->pos = atom_header; - atom->last = atom_table; - - data = &trak->stsc_data_buf; - data->temporary = 1; - data->pos = atom_table; - data->last = atom_end; - - trak->out[NGX_HTTP_MP4_STSC_ATOM].buf = atom; - trak->out[NGX_HTTP_MP4_STSC_DATA].buf = data; - - ngx_mp4_atom_next(mp4, atom_data_size); - - return NGX_OK; -} - - -static ngx_int_t -ngx_http_mp4_update_stsc_atom(ngx_http_mp4_file_t *mp4, - ngx_http_mp4_trak_t *trak) -{ - size_t atom_size; - uint32_t chunk; - ngx_buf_t *atom, *data; - ngx_mp4_stsc_atom_t *stsc_atom; - ngx_mp4_stsc_entry_t *entry, *end; - - /* - * mdia.minf.stbl.stsc updating requires trak->start_sample - * from mdia.minf.stbl.stts which depends on value from mdia.mdhd - * atom which may reside after mdia.minf - */ - - ngx_log_debug0(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0, - "mp4 stsc atom update"); - - data = trak->out[NGX_HTTP_MP4_STSC_DATA].buf; - - if (data == NULL) { - ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0, - "no mp4 stsc atoms were found in \"%s\"", - mp4->file.name.data); - return NGX_ERROR; - } - - if (trak->sample_to_chunk_entries == 0) { - ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0, - "zero number of entries in stsc atom in \"%s\"", - mp4->file.name.data); - return NGX_ERROR; - } - - if (ngx_http_mp4_crop_stsc_data(mp4, trak, 1) != NGX_OK) { - return NGX_ERROR; - } - - if (ngx_http_mp4_crop_stsc_data(mp4, trak, 0) != NGX_OK) { - return NGX_ERROR; - } - - ngx_log_debug1(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0, - "sample-to-chunk entries:%uD", - trak->sample_to_chunk_entries); - - entry = (ngx_mp4_stsc_entry_t *) data->pos; - end = (ngx_mp4_stsc_entry_t *) data->last; - - while (entry < end) { - chunk = ngx_mp4_get_32value(entry->chunk); - chunk -= trak->start_chunk; - ngx_mp4_set_32value(entry->chunk, chunk); - entry++; - } - - atom_size = sizeof(ngx_mp4_stsc_atom_t) - + trak->sample_to_chunk_entries * sizeof(ngx_mp4_stsc_entry_t); - - trak->size += atom_size; - - atom = trak->out[NGX_HTTP_MP4_STSC_ATOM].buf; - stsc_atom = (ngx_mp4_stsc_atom_t *) atom->pos; - - ngx_mp4_set_32value(stsc_atom->size, atom_size); - ngx_mp4_set_32value(stsc_atom->entries, trak->sample_to_chunk_entries); - - return NGX_OK; -} - - -static ngx_int_t -ngx_http_mp4_crop_stsc_data(ngx_http_mp4_file_t *mp4, - ngx_http_mp4_trak_t *trak, ngx_uint_t start) -{ - uint64_t n; - uint32_t start_sample, chunk, samples, id, next_chunk, - prev_samples; - ngx_buf_t *data, *buf; - ngx_uint_t entries, target_chunk, chunk_samples; - ngx_mp4_stsc_entry_t *entry, *end, *first; - - entries = trak->sample_to_chunk_entries - 1; - - if (start) { - start_sample = (uint32_t) trak->start_sample; - - ngx_log_debug1(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0, - "mp4 stsc crop start_sample:%uD", start_sample); - - } else if (mp4->length) { - start_sample = (uint32_t) (trak->end_sample - trak->start_sample); - samples = 0; - - data = trak->out[NGX_HTTP_MP4_STSC_START].buf; - - if (data) { - entry = (ngx_mp4_stsc_entry_t *) data->pos; - samples = ngx_mp4_get_32value(entry->samples); - entries--; - - if (samples > start_sample) { - samples = start_sample; - ngx_mp4_set_32value(entry->samples, samples); - } - - start_sample -= samples; - } - - ngx_log_debug2(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0, - "mp4 stsc crop end_sample:%uD, ext_samples:%uD", - start_sample, samples); - - } else { - return NGX_OK; - } - - data = trak->out[NGX_HTTP_MP4_STSC_DATA].buf; - - entry = (ngx_mp4_stsc_entry_t *) data->pos; - end = (ngx_mp4_stsc_entry_t *) data->last; - - chunk = ngx_mp4_get_32value(entry->chunk); - samples = ngx_mp4_get_32value(entry->samples); - id = ngx_mp4_get_32value(entry->id); - prev_samples = 0; - entry++; - - while (entry < end) { - - next_chunk = ngx_mp4_get_32value(entry->chunk); - - if (next_chunk < chunk) { - ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0, - "unordered mp4 stsc chunks in \"%s\"", - mp4->file.name.data); - return NGX_ERROR; - } - - ngx_log_debug5(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0, - "sample:%uD, chunk:%uD, chunks:%uD, " - "samples:%uD, id:%uD", - start_sample, chunk, next_chunk - chunk, samples, id); - - n = (uint64_t) (next_chunk - chunk) * samples; - - if (start_sample < n) { - goto found; - } - - start_sample -= n; - - if (next_chunk > chunk) { - prev_samples = samples; - } - - chunk = next_chunk; - samples = ngx_mp4_get_32value(entry->samples); - id = ngx_mp4_get_32value(entry->id); - entries--; - entry++; - } - - next_chunk = trak->chunks + 1; - - if (next_chunk < chunk) { - ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0, - "unordered mp4 stsc chunks in \"%s\"", - mp4->file.name.data); - return NGX_ERROR; - } - - ngx_log_debug4(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0, - "sample:%uD, chunk:%uD, chunks:%uD, samples:%uD", - start_sample, chunk, next_chunk - chunk, samples); - - n = (uint64_t) (next_chunk - chunk) * samples; - - if (start_sample > n) { - ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0, - "%s time is out mp4 stsc chunks in \"%s\"", - start ? "start" : "end", mp4->file.name.data); - return NGX_ERROR; - } - -found: - - entries++; - entry--; - - if (samples == 0) { - ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0, - "zero number of samples in \"%s\"", - mp4->file.name.data); - return NGX_ERROR; - } - - if (chunk == 0) { - ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0, - "zero chunk in \"%s\"", mp4->file.name.data); - return NGX_ERROR; - } - - target_chunk = chunk - 1; - target_chunk += start_sample / samples; - chunk_samples = start_sample % samples; - - if (start) { - data->pos = (u_char *) entry; - - trak->sample_to_chunk_entries = entries; - trak->start_chunk = target_chunk; - trak->start_chunk_samples = chunk_samples; - - ngx_mp4_set_32value(entry->chunk, trak->start_chunk + 1); - - samples -= chunk_samples; - - ngx_log_debug2(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0, - "start_chunk:%ui, start_chunk_samples:%ui", - trak->start_chunk, trak->start_chunk_samples); - - } else { - if (start_sample) { - data->last = (u_char *) (entry + 1); - trak->sample_to_chunk_entries -= entries - 1; - trak->end_chunk_samples = samples; - - } else { - data->last = (u_char *) entry; - trak->sample_to_chunk_entries -= entries; - trak->end_chunk_samples = prev_samples; - } - - if (chunk_samples) { - trak->end_chunk = target_chunk + 1; - trak->end_chunk_samples = chunk_samples; - - } else { - trak->end_chunk = target_chunk; - } - - samples = chunk_samples; - next_chunk = chunk + 1; - - ngx_log_debug2(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0, - "end_chunk:%ui, end_chunk_samples:%ui", - trak->end_chunk, trak->end_chunk_samples); - } - - if (chunk_samples && next_chunk - target_chunk == 2) { - - ngx_mp4_set_32value(entry->samples, samples); - - } else if (chunk_samples && start) { - - first = &trak->stsc_start_chunk_entry; - ngx_mp4_set_32value(first->chunk, 1); - ngx_mp4_set_32value(first->samples, samples); - ngx_mp4_set_32value(first->id, id); - - buf = &trak->stsc_start_chunk_buf; - buf->temporary = 1; - buf->pos = (u_char *) first; - buf->last = (u_char *) first + sizeof(ngx_mp4_stsc_entry_t); - - trak->out[NGX_HTTP_MP4_STSC_START].buf = buf; - - ngx_mp4_set_32value(entry->chunk, trak->start_chunk + 2); - - trak->sample_to_chunk_entries++; - - } else if (chunk_samples) { - - first = &trak->stsc_end_chunk_entry; - ngx_mp4_set_32value(first->chunk, trak->end_chunk - trak->start_chunk); - ngx_mp4_set_32value(first->samples, samples); - ngx_mp4_set_32value(first->id, id); - - buf = &trak->stsc_end_chunk_buf; - buf->temporary = 1; - buf->pos = (u_char *) first; - buf->last = (u_char *) first + sizeof(ngx_mp4_stsc_entry_t); - - trak->out[NGX_HTTP_MP4_STSC_END].buf = buf; - - trak->sample_to_chunk_entries++; - } - - return NGX_OK; -} - - -typedef struct { - u_char size[4]; - u_char name[4]; - u_char version[1]; - u_char flags[3]; - u_char uniform_size[4]; - u_char entries[4]; -} ngx_mp4_stsz_atom_t; - - -static ngx_int_t -ngx_http_mp4_read_stsz_atom(ngx_http_mp4_file_t *mp4, uint64_t atom_data_size) -{ - u_char *atom_header, *atom_table, *atom_end; - size_t atom_size; - uint32_t entries, size; - ngx_buf_t *atom, *data; - ngx_mp4_stsz_atom_t *stsz_atom; - ngx_http_mp4_trak_t *trak; - - /* sample sizes atom */ - - ngx_log_debug0(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0, "mp4 stsz atom"); - - atom_header = ngx_mp4_atom_header(mp4); - stsz_atom = (ngx_mp4_stsz_atom_t *) atom_header; - ngx_mp4_set_atom_name(stsz_atom, 's', 't', 's', 'z'); - - if (ngx_mp4_atom_data_size(ngx_mp4_stsz_atom_t) > atom_data_size) { - ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0, - "\"%s\" mp4 stsz atom too small", mp4->file.name.data); - return NGX_ERROR; - } - - size = ngx_mp4_get_32value(stsz_atom->uniform_size); - entries = ngx_mp4_get_32value(stsz_atom->entries); - - ngx_log_debug2(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0, - "sample uniform size:%uD, entries:%uD", size, entries); - - trak = ngx_mp4_last_trak(mp4); - - if (trak->out[NGX_HTTP_MP4_STSZ_ATOM].buf) { - ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0, - "duplicate mp4 stsz atom in \"%s\"", mp4->file.name.data); - return NGX_ERROR; - } - - trak->sample_sizes_entries = entries; - - atom_table = atom_header + sizeof(ngx_mp4_stsz_atom_t); - - atom = &trak->stsz_atom_buf; - atom->temporary = 1; - atom->pos = atom_header; - atom->last = atom_table; - - trak->out[NGX_HTTP_MP4_STSZ_ATOM].buf = atom; - - if (size == 0) { - if (ngx_mp4_atom_data_size(ngx_mp4_stsz_atom_t) - + (uint64_t) entries * sizeof(uint32_t) > atom_data_size) - { - ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0, - "\"%s\" mp4 stsz atom too small", - mp4->file.name.data); - return NGX_ERROR; - } - - atom_end = atom_table + entries * sizeof(uint32_t); - - data = &trak->stsz_data_buf; - data->temporary = 1; - data->pos = atom_table; - data->last = atom_end; - - trak->out[NGX_HTTP_MP4_STSZ_DATA].buf = data; - - } else { - /* if size != 0 then all samples are the same size */ - /* TODO : chunk samples */ - atom_size = sizeof(ngx_mp4_atom_header_t) + (size_t) atom_data_size; - ngx_mp4_set_32value(atom_header, atom_size); - trak->size += atom_size; - } - - ngx_mp4_atom_next(mp4, atom_data_size); - - return NGX_OK; -} - - -static ngx_int_t -ngx_http_mp4_update_stsz_atom(ngx_http_mp4_file_t *mp4, - ngx_http_mp4_trak_t *trak) -{ - size_t atom_size; - uint32_t *pos, *end, entries; - ngx_buf_t *atom, *data; - ngx_mp4_stsz_atom_t *stsz_atom; - - /* - * mdia.minf.stbl.stsz updating requires trak->start_sample - * from mdia.minf.stbl.stts which depends on value from mdia.mdhd - * atom which may reside after mdia.minf - */ - - ngx_log_debug0(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0, - "mp4 stsz atom update"); - - data = trak->out[NGX_HTTP_MP4_STSZ_DATA].buf; - - if (data) { - entries = trak->sample_sizes_entries; - - if (trak->start_sample >= entries) { - ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0, - "start time is out mp4 stsz samples in \"%s\"", - mp4->file.name.data); - return NGX_ERROR; - } - - entries -= trak->start_sample; - data->pos += trak->start_sample * sizeof(uint32_t); - end = (uint32_t *) data->pos; - - for (pos = end - trak->start_chunk_samples; pos < end; pos++) { - trak->start_chunk_samples_size += ngx_mp4_get_32value(pos); - } - - ngx_log_debug1(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0, - "chunk samples sizes:%uL", - trak->start_chunk_samples_size); - - if (trak->start_chunk_samples_size > (uint64_t) mp4->end) { - ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0, - "too large mp4 start samples size in \"%s\"", - mp4->file.name.data); - return NGX_ERROR; - } - - if (mp4->length) { - if (trak->end_sample - trak->start_sample > entries) { - ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0, - "end time is out mp4 stsz samples in \"%s\"", - mp4->file.name.data); - return NGX_ERROR; - } - - entries = trak->end_sample - trak->start_sample; - data->last = data->pos + entries * sizeof(uint32_t); - end = (uint32_t *) data->last; - - for (pos = end - trak->end_chunk_samples; pos < end; pos++) { - trak->end_chunk_samples_size += ngx_mp4_get_32value(pos); - } - - ngx_log_debug1(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0, - "mp4 stsz end_chunk_samples_size:%uL", - trak->end_chunk_samples_size); - - if (trak->end_chunk_samples_size > (uint64_t) mp4->end) { - ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0, - "too large mp4 end samples size in \"%s\"", - mp4->file.name.data); - return NGX_ERROR; - } - } - - atom_size = sizeof(ngx_mp4_stsz_atom_t) + (data->last - data->pos); - trak->size += atom_size; - - atom = trak->out[NGX_HTTP_MP4_STSZ_ATOM].buf; - stsz_atom = (ngx_mp4_stsz_atom_t *) atom->pos; - - ngx_mp4_set_32value(stsz_atom->size, atom_size); - ngx_mp4_set_32value(stsz_atom->entries, entries); - } - - return NGX_OK; -} - - -typedef struct { - u_char size[4]; - u_char name[4]; - u_char version[1]; - u_char flags[3]; - u_char entries[4]; -} ngx_mp4_stco_atom_t; - - -static ngx_int_t -ngx_http_mp4_read_stco_atom(ngx_http_mp4_file_t *mp4, uint64_t atom_data_size) -{ - u_char *atom_header, *atom_table, *atom_end; - uint32_t entries; - ngx_buf_t *atom, *data; - ngx_mp4_stco_atom_t *stco_atom; - ngx_http_mp4_trak_t *trak; - - /* chunk offsets atom */ - - ngx_log_debug0(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0, "mp4 stco atom"); - - atom_header = ngx_mp4_atom_header(mp4); - stco_atom = (ngx_mp4_stco_atom_t *) atom_header; - ngx_mp4_set_atom_name(stco_atom, 's', 't', 'c', 'o'); - - if (ngx_mp4_atom_data_size(ngx_mp4_stco_atom_t) > atom_data_size) { - ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0, - "\"%s\" mp4 stco atom too small", mp4->file.name.data); - return NGX_ERROR; - } - - entries = ngx_mp4_get_32value(stco_atom->entries); - - ngx_log_debug1(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0, "chunks:%uD", entries); - - if (ngx_mp4_atom_data_size(ngx_mp4_stco_atom_t) - + (uint64_t) entries * sizeof(uint32_t) > atom_data_size) - { - ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0, - "\"%s\" mp4 stco atom too small", mp4->file.name.data); - return NGX_ERROR; - } - - atom_table = atom_header + sizeof(ngx_mp4_stco_atom_t); - atom_end = atom_table + entries * sizeof(uint32_t); - - trak = ngx_mp4_last_trak(mp4); - - if (trak->out[NGX_HTTP_MP4_STCO_ATOM].buf - || trak->out[NGX_HTTP_MP4_CO64_ATOM].buf) - { - ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0, - "duplicate mp4 stco/co64 atom in \"%s\"", - mp4->file.name.data); - return NGX_ERROR; - } - - trak->chunks = entries; - - atom = &trak->stco_atom_buf; - atom->temporary = 1; - atom->pos = atom_header; - atom->last = atom_table; - - data = &trak->stco_data_buf; - data->temporary = 1; - data->pos = atom_table; - data->last = atom_end; - - trak->out[NGX_HTTP_MP4_STCO_ATOM].buf = atom; - trak->out[NGX_HTTP_MP4_STCO_DATA].buf = data; - - ngx_mp4_atom_next(mp4, atom_data_size); - - return NGX_OK; -} - - -static ngx_int_t -ngx_http_mp4_update_stco_atom(ngx_http_mp4_file_t *mp4, - ngx_http_mp4_trak_t *trak) -{ - size_t atom_size; - uint32_t entries; - uint64_t chunk_offset, samples_size; - ngx_buf_t *atom, *data; - ngx_mp4_stco_atom_t *stco_atom; - - /* - * mdia.minf.stbl.stco updating requires trak->start_chunk - * from mdia.minf.stbl.stsc which depends on value from mdia.mdhd - * atom which may reside after mdia.minf - */ - - ngx_log_debug0(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0, - "mp4 stco atom update"); - - data = trak->out[NGX_HTTP_MP4_STCO_DATA].buf; - - if (data == NULL) { - ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0, - "no mp4 stco atoms were found in \"%s\"", - mp4->file.name.data); - return NGX_ERROR; - } - - if (trak->start_chunk >= trak->chunks) { - ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0, - "start time is out mp4 stco chunks in \"%s\"", - mp4->file.name.data); - return NGX_ERROR; - } - - data->pos += trak->start_chunk * sizeof(uint32_t); - - chunk_offset = ngx_mp4_get_32value(data->pos); - samples_size = trak->start_chunk_samples_size; - - if (chunk_offset > (uint64_t) mp4->end - samples_size - || chunk_offset + samples_size > NGX_MAX_UINT32_VALUE) - { - ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0, - "too large chunk offset in \"%s\"", - mp4->file.name.data); - return NGX_ERROR; - } - - trak->start_offset = chunk_offset + samples_size; - ngx_mp4_set_32value(data->pos, trak->start_offset); - - ngx_log_debug1(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0, - "start chunk offset:%O", trak->start_offset); - - if (mp4->length) { - - if (trak->end_chunk > trak->chunks) { - ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0, - "end time is out mp4 stco chunks in \"%s\"", - mp4->file.name.data); - return NGX_ERROR; - } - - entries = trak->end_chunk - trak->start_chunk; - data->last = data->pos + entries * sizeof(uint32_t); - - if (entries) { - chunk_offset = ngx_mp4_get_32value(data->last - sizeof(uint32_t)); - samples_size = trak->end_chunk_samples_size; - - if (chunk_offset > (uint64_t) mp4->end - samples_size - || chunk_offset + samples_size > NGX_MAX_UINT32_VALUE) - { - ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0, - "too large chunk offset in \"%s\"", - mp4->file.name.data); - return NGX_ERROR; - } - - trak->end_offset = chunk_offset + samples_size; - - ngx_log_debug1(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0, - "end chunk offset:%O", trak->end_offset); - } - - } else { - entries = trak->chunks - trak->start_chunk; - trak->end_offset = mp4->mdat_data.buf->file_last; - } - - if (entries == 0) { - trak->start_offset = mp4->end; - trak->end_offset = 0; - } - - atom_size = sizeof(ngx_mp4_stco_atom_t) + (data->last - data->pos); - trak->size += atom_size; - - atom = trak->out[NGX_HTTP_MP4_STCO_ATOM].buf; - stco_atom = (ngx_mp4_stco_atom_t *) atom->pos; - - ngx_mp4_set_32value(stco_atom->size, atom_size); - ngx_mp4_set_32value(stco_atom->entries, entries); - - return NGX_OK; -} - - -static void -ngx_http_mp4_adjust_stco_atom(ngx_http_mp4_file_t *mp4, - ngx_http_mp4_trak_t *trak, int32_t adjustment) -{ - uint32_t offset, *entry, *end; - ngx_buf_t *data; - - /* - * moov.trak.mdia.minf.stbl.stco adjustment requires - * minimal start offset of all traks and new moov atom size - */ - - ngx_log_debug0(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0, - "mp4 stco atom adjustment"); - - data = trak->out[NGX_HTTP_MP4_STCO_DATA].buf; - entry = (uint32_t *) data->pos; - end = (uint32_t *) data->last; - - while (entry < end) { - offset = ngx_mp4_get_32value(entry); - offset += adjustment; - ngx_mp4_set_32value(entry, offset); - entry++; - } -} - - -typedef struct { - u_char size[4]; - u_char name[4]; - u_char version[1]; - u_char flags[3]; - u_char entries[4]; -} ngx_mp4_co64_atom_t; - - -static ngx_int_t -ngx_http_mp4_read_co64_atom(ngx_http_mp4_file_t *mp4, uint64_t atom_data_size) -{ - u_char *atom_header, *atom_table, *atom_end; - uint32_t entries; - ngx_buf_t *atom, *data; - ngx_mp4_co64_atom_t *co64_atom; - ngx_http_mp4_trak_t *trak; - - /* chunk offsets atom */ - - ngx_log_debug0(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0, "mp4 co64 atom"); - - atom_header = ngx_mp4_atom_header(mp4); - co64_atom = (ngx_mp4_co64_atom_t *) atom_header; - ngx_mp4_set_atom_name(co64_atom, 'c', 'o', '6', '4'); - - if (ngx_mp4_atom_data_size(ngx_mp4_co64_atom_t) > atom_data_size) { - ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0, - "\"%s\" mp4 co64 atom too small", mp4->file.name.data); - return NGX_ERROR; - } - - entries = ngx_mp4_get_32value(co64_atom->entries); - - ngx_log_debug1(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0, "chunks:%uD", entries); - - if (ngx_mp4_atom_data_size(ngx_mp4_co64_atom_t) - + (uint64_t) entries * sizeof(uint64_t) > atom_data_size) - { - ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0, - "\"%s\" mp4 co64 atom too small", mp4->file.name.data); - return NGX_ERROR; - } - - atom_table = atom_header + sizeof(ngx_mp4_co64_atom_t); - atom_end = atom_table + entries * sizeof(uint64_t); - - trak = ngx_mp4_last_trak(mp4); - - if (trak->out[NGX_HTTP_MP4_STCO_ATOM].buf - || trak->out[NGX_HTTP_MP4_CO64_ATOM].buf) - { - ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0, - "duplicate mp4 stco/co64 atom in \"%s\"", - mp4->file.name.data); - return NGX_ERROR; - } - - trak->chunks = entries; - - atom = &trak->co64_atom_buf; - atom->temporary = 1; - atom->pos = atom_header; - atom->last = atom_table; - - data = &trak->co64_data_buf; - data->temporary = 1; - data->pos = atom_table; - data->last = atom_end; - - trak->out[NGX_HTTP_MP4_CO64_ATOM].buf = atom; - trak->out[NGX_HTTP_MP4_CO64_DATA].buf = data; - - ngx_mp4_atom_next(mp4, atom_data_size); - - return NGX_OK; -} - - -static ngx_int_t -ngx_http_mp4_update_co64_atom(ngx_http_mp4_file_t *mp4, - ngx_http_mp4_trak_t *trak) -{ - size_t atom_size; - uint64_t entries, chunk_offset, samples_size; - ngx_buf_t *atom, *data; - ngx_mp4_co64_atom_t *co64_atom; - - /* - * mdia.minf.stbl.co64 updating requires trak->start_chunk - * from mdia.minf.stbl.stsc which depends on value from mdia.mdhd - * atom which may reside after mdia.minf - */ - - ngx_log_debug0(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0, - "mp4 co64 atom update"); - - data = trak->out[NGX_HTTP_MP4_CO64_DATA].buf; - - if (data == NULL) { - ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0, - "no mp4 co64 atoms were found in \"%s\"", - mp4->file.name.data); - return NGX_ERROR; - } - - if (trak->start_chunk >= trak->chunks) { - ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0, - "start time is out mp4 co64 chunks in \"%s\"", - mp4->file.name.data); - return NGX_ERROR; - } - - data->pos += trak->start_chunk * sizeof(uint64_t); - - chunk_offset = ngx_mp4_get_64value(data->pos); - samples_size = trak->start_chunk_samples_size; - - if (chunk_offset > (uint64_t) mp4->end - samples_size) { - ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0, - "too large chunk offset in \"%s\"", - mp4->file.name.data); - return NGX_ERROR; - } - - trak->start_offset = chunk_offset + samples_size; - ngx_mp4_set_64value(data->pos, trak->start_offset); - - ngx_log_debug1(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0, - "start chunk offset:%O", trak->start_offset); - - if (mp4->length) { - - if (trak->end_chunk > trak->chunks) { - ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0, - "end time is out mp4 co64 chunks in \"%s\"", - mp4->file.name.data); - return NGX_ERROR; - } - - entries = trak->end_chunk - trak->start_chunk; - data->last = data->pos + entries * sizeof(uint64_t); - - if (entries) { - chunk_offset = ngx_mp4_get_64value(data->last - sizeof(uint64_t)); - samples_size = trak->end_chunk_samples_size; - - if (chunk_offset > (uint64_t) mp4->end - samples_size) { - ngx_log_error(NGX_LOG_ERR, mp4->file.log, 0, - "too large chunk offset in \"%s\"", - mp4->file.name.data); - return NGX_ERROR; - } - - trak->end_offset = chunk_offset + samples_size; - - ngx_log_debug1(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0, - "end chunk offset:%O", trak->end_offset); - } - - } else { - entries = trak->chunks - trak->start_chunk; - trak->end_offset = mp4->mdat_data.buf->file_last; - } - - if (entries == 0) { - trak->start_offset = mp4->end; - trak->end_offset = 0; - } - - atom_size = sizeof(ngx_mp4_co64_atom_t) + (data->last - data->pos); - trak->size += atom_size; - - atom = trak->out[NGX_HTTP_MP4_CO64_ATOM].buf; - co64_atom = (ngx_mp4_co64_atom_t *) atom->pos; - - ngx_mp4_set_32value(co64_atom->size, atom_size); - ngx_mp4_set_32value(co64_atom->entries, entries); - - return NGX_OK; -} - - -static void -ngx_http_mp4_adjust_co64_atom(ngx_http_mp4_file_t *mp4, - ngx_http_mp4_trak_t *trak, off_t adjustment) -{ - uint64_t offset, *entry, *end; - ngx_buf_t *data; - - /* - * moov.trak.mdia.minf.stbl.co64 adjustment requires - * minimal start offset of all traks and new moov atom size - */ - - ngx_log_debug0(NGX_LOG_DEBUG_HTTP, mp4->file.log, 0, - "mp4 co64 atom adjustment"); - - data = trak->out[NGX_HTTP_MP4_CO64_DATA].buf; - entry = (uint64_t *) data->pos; - end = (uint64_t *) data->last; - - while (entry < end) { - offset = ngx_mp4_get_64value(entry); - offset += adjustment; - ngx_mp4_set_64value(entry, offset); - entry++; - } -} - - -static char * -ngx_http_mp4(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) -{ - ngx_http_core_loc_conf_t *clcf; - - clcf = ngx_http_conf_get_module_loc_conf(cf, ngx_http_core_module); - clcf->handler = ngx_http_mp4_handler; - - return NGX_CONF_OK; -} - - -static void * -ngx_http_mp4_create_conf(ngx_conf_t *cf) -{ - ngx_http_mp4_conf_t *conf; - - conf = ngx_palloc(cf->pool, sizeof(ngx_http_mp4_conf_t)); - if (conf == NULL) { - return NULL; - } - - conf->buffer_size = NGX_CONF_UNSET_SIZE; - conf->max_buffer_size = NGX_CONF_UNSET_SIZE; - conf->start_key_frame = NGX_CONF_UNSET; - - return conf; -} - - -static char * -ngx_http_mp4_merge_conf(ngx_conf_t *cf, void *parent, void *child) -{ - ngx_http_mp4_conf_t *prev = parent; - ngx_http_mp4_conf_t *conf = child; - - ngx_conf_merge_size_value(conf->buffer_size, prev->buffer_size, 512 * 1024); - ngx_conf_merge_size_value(conf->max_buffer_size, prev->max_buffer_size, - 10 * 1024 * 1024); - ngx_conf_merge_value(conf->start_key_frame, prev->start_key_frame, 0); - - return NGX_CONF_OK; -} diff --git a/src/deps/src/nginx-1.30.3/src/http/modules/ngx_http_not_modified_filter_module.c b/src/deps/src/nginx-1.30.3/src/http/modules/ngx_http_not_modified_filter_module.c deleted file mode 100644 index 032ba96fd4..0000000000 --- a/src/deps/src/nginx-1.30.3/src/http/modules/ngx_http_not_modified_filter_module.c +++ /dev/null @@ -1,266 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#include -#include -#include - - -static ngx_uint_t ngx_http_test_if_unmodified(ngx_http_request_t *r); -static ngx_uint_t ngx_http_test_if_modified(ngx_http_request_t *r); -static ngx_uint_t ngx_http_test_if_match(ngx_http_request_t *r, - ngx_table_elt_t *header, ngx_uint_t weak); -static ngx_int_t ngx_http_not_modified_filter_init(ngx_conf_t *cf); - - -static ngx_http_module_t ngx_http_not_modified_filter_module_ctx = { - NULL, /* preconfiguration */ - ngx_http_not_modified_filter_init, /* postconfiguration */ - - NULL, /* create main configuration */ - NULL, /* init main configuration */ - - NULL, /* create server configuration */ - NULL, /* merge server configuration */ - - NULL, /* create location configuration */ - NULL /* merge location configuration */ -}; - - -ngx_module_t ngx_http_not_modified_filter_module = { - NGX_MODULE_V1, - &ngx_http_not_modified_filter_module_ctx, /* module context */ - NULL, /* module directives */ - NGX_HTTP_MODULE, /* module type */ - NULL, /* init master */ - NULL, /* init module */ - NULL, /* init process */ - NULL, /* init thread */ - NULL, /* exit thread */ - NULL, /* exit process */ - NULL, /* exit master */ - NGX_MODULE_V1_PADDING -}; - - -static ngx_http_output_header_filter_pt ngx_http_next_header_filter; - - -static ngx_int_t -ngx_http_not_modified_header_filter(ngx_http_request_t *r) -{ - if (r->headers_out.status != NGX_HTTP_OK - || r != r->main - || r->disable_not_modified) - { - return ngx_http_next_header_filter(r); - } - - if (r->headers_in.if_unmodified_since - && !ngx_http_test_if_unmodified(r)) - { - return ngx_http_filter_finalize_request(r, NULL, - NGX_HTTP_PRECONDITION_FAILED); - } - - if (r->headers_in.if_match - && !ngx_http_test_if_match(r, r->headers_in.if_match, 0)) - { - return ngx_http_filter_finalize_request(r, NULL, - NGX_HTTP_PRECONDITION_FAILED); - } - - if (r->headers_in.if_modified_since || r->headers_in.if_none_match) { - - if (r->headers_in.if_modified_since - && ngx_http_test_if_modified(r)) - { - return ngx_http_next_header_filter(r); - } - - if (r->headers_in.if_none_match - && !ngx_http_test_if_match(r, r->headers_in.if_none_match, 1)) - { - return ngx_http_next_header_filter(r); - } - - /* not modified */ - - r->headers_out.status = NGX_HTTP_NOT_MODIFIED; - r->headers_out.status_line.len = 0; - r->headers_out.content_type.len = 0; - ngx_http_clear_content_length(r); - ngx_http_clear_accept_ranges(r); - - if (r->headers_out.content_encoding) { - r->headers_out.content_encoding->hash = 0; - r->headers_out.content_encoding = NULL; - } - - return ngx_http_next_header_filter(r); - } - - return ngx_http_next_header_filter(r); -} - - -static ngx_uint_t -ngx_http_test_if_unmodified(ngx_http_request_t *r) -{ - time_t iums; - - if (r->headers_out.last_modified_time == (time_t) -1) { - return 0; - } - - iums = ngx_parse_http_time(r->headers_in.if_unmodified_since->value.data, - r->headers_in.if_unmodified_since->value.len); - - ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "http iums:%T lm:%T", iums, r->headers_out.last_modified_time); - - if (iums >= r->headers_out.last_modified_time) { - return 1; - } - - return 0; -} - - -static ngx_uint_t -ngx_http_test_if_modified(ngx_http_request_t *r) -{ - time_t ims; - ngx_http_core_loc_conf_t *clcf; - - if (r->headers_out.last_modified_time == (time_t) -1) { - return 1; - } - - clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module); - - if (clcf->if_modified_since == NGX_HTTP_IMS_OFF) { - return 1; - } - - ims = ngx_parse_http_time(r->headers_in.if_modified_since->value.data, - r->headers_in.if_modified_since->value.len); - - ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "http ims:%T lm:%T", ims, r->headers_out.last_modified_time); - - if (ims == r->headers_out.last_modified_time) { - return 0; - } - - if (clcf->if_modified_since == NGX_HTTP_IMS_EXACT - || ims < r->headers_out.last_modified_time) - { - return 1; - } - - return 0; -} - - -static ngx_uint_t -ngx_http_test_if_match(ngx_http_request_t *r, ngx_table_elt_t *header, - ngx_uint_t weak) -{ - u_char *start, *end, ch; - ngx_str_t etag, *list; - - list = &header->value; - - if (list->len == 1 && list->data[0] == '*') { - return 1; - } - - if (r->headers_out.etag == NULL) { - return 0; - } - - etag = r->headers_out.etag->value; - - ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "http im:\"%V\" etag:%V", list, &etag); - - if (weak - && etag.len > 2 - && etag.data[0] == 'W' - && etag.data[1] == '/') - { - etag.len -= 2; - etag.data += 2; - } - - start = list->data; - end = list->data + list->len; - - while (start < end) { - - if (weak - && end - start > 2 - && start[0] == 'W' - && start[1] == '/') - { - start += 2; - } - - if (etag.len > (size_t) (end - start)) { - return 0; - } - - if (ngx_strncmp(start, etag.data, etag.len) != 0) { - goto skip; - } - - start += etag.len; - - while (start < end) { - ch = *start; - - if (ch == ' ' || ch == '\t') { - start++; - continue; - } - - break; - } - - if (start == end || *start == ',') { - return 1; - } - - skip: - - while (start < end && *start != ',') { start++; } - while (start < end) { - ch = *start; - - if (ch == ' ' || ch == '\t' || ch == ',') { - start++; - continue; - } - - break; - } - } - - return 0; -} - - -static ngx_int_t -ngx_http_not_modified_filter_init(ngx_conf_t *cf) -{ - ngx_http_next_header_filter = ngx_http_top_header_filter; - ngx_http_top_header_filter = ngx_http_not_modified_header_filter; - - return NGX_OK; -} diff --git a/src/deps/src/nginx-1.30.3/src/http/modules/ngx_http_proxy_module.c b/src/deps/src/nginx-1.30.3/src/http/modules/ngx_http_proxy_module.c deleted file mode 100644 index 276cc07502..0000000000 --- a/src/deps/src/nginx-1.30.3/src/http/modules/ngx_http_proxy_module.c +++ /dev/null @@ -1,5389 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#include -#include -#include -#include - - -#define NGX_HTTP_PROXY_COOKIE_SECURE 0x0001 -#define NGX_HTTP_PROXY_COOKIE_SECURE_ON 0x0002 -#define NGX_HTTP_PROXY_COOKIE_SECURE_OFF 0x0004 -#define NGX_HTTP_PROXY_COOKIE_HTTPONLY 0x0008 -#define NGX_HTTP_PROXY_COOKIE_HTTPONLY_ON 0x0010 -#define NGX_HTTP_PROXY_COOKIE_HTTPONLY_OFF 0x0020 -#define NGX_HTTP_PROXY_COOKIE_SAMESITE 0x0040 -#define NGX_HTTP_PROXY_COOKIE_SAMESITE_STRICT 0x0080 -#define NGX_HTTP_PROXY_COOKIE_SAMESITE_LAX 0x0100 -#define NGX_HTTP_PROXY_COOKIE_SAMESITE_NONE 0x0200 -#define NGX_HTTP_PROXY_COOKIE_SAMESITE_OFF 0x0400 - - -typedef struct ngx_http_proxy_rewrite_s ngx_http_proxy_rewrite_t; - -typedef ngx_int_t (*ngx_http_proxy_rewrite_pt)(ngx_http_request_t *r, - ngx_str_t *value, size_t prefix, size_t len, - ngx_http_proxy_rewrite_t *pr); - -struct ngx_http_proxy_rewrite_s { - ngx_http_proxy_rewrite_pt handler; - - union { - ngx_http_complex_value_t complex; -#if (NGX_PCRE) - ngx_http_regex_t *regex; -#endif - } pattern; - - ngx_http_complex_value_t replacement; -}; - - -typedef struct { - union { - ngx_http_complex_value_t complex; -#if (NGX_PCRE) - ngx_http_regex_t *regex; -#endif - } cookie; - - ngx_array_t flags_values; - ngx_uint_t regex; -} ngx_http_proxy_cookie_flags_t; - - -static ngx_int_t ngx_http_proxy_create_request(ngx_http_request_t *r); -static ngx_int_t ngx_http_proxy_reinit_request(ngx_http_request_t *r); -static ngx_int_t ngx_http_proxy_body_output_filter(void *data, ngx_chain_t *in); -static ngx_int_t ngx_http_proxy_process_status_line(ngx_http_request_t *r); -static ngx_int_t ngx_http_proxy_process_header(ngx_http_request_t *r); -static ngx_int_t ngx_http_proxy_input_filter_init(void *data); -static ngx_int_t ngx_http_proxy_copy_filter(ngx_event_pipe_t *p, - ngx_buf_t *buf); -static ngx_int_t ngx_http_proxy_chunked_filter(ngx_event_pipe_t *p, - ngx_buf_t *buf); -static ngx_int_t ngx_http_proxy_non_buffered_copy_filter(void *data, - ssize_t bytes); -static ngx_int_t ngx_http_proxy_non_buffered_chunked_filter(void *data, - ssize_t bytes); -static ngx_int_t ngx_http_proxy_process_trailer(ngx_http_request_t *r, - ngx_buf_t *buf); -static void ngx_http_proxy_abort_request(ngx_http_request_t *r); -static void ngx_http_proxy_finalize_request(ngx_http_request_t *r, - ngx_int_t rc); - -static ngx_int_t ngx_http_proxy_host_variable(ngx_http_request_t *r, - ngx_http_variable_value_t *v, uintptr_t data); -static ngx_int_t ngx_http_proxy_port_variable(ngx_http_request_t *r, - ngx_http_variable_value_t *v, uintptr_t data); -static ngx_int_t - ngx_http_proxy_add_x_forwarded_for_variable(ngx_http_request_t *r, - ngx_http_variable_value_t *v, uintptr_t data); -static ngx_int_t - ngx_http_proxy_internal_body_length_variable(ngx_http_request_t *r, - ngx_http_variable_value_t *v, uintptr_t data); -static ngx_int_t ngx_http_proxy_internal_chunked_variable(ngx_http_request_t *r, - ngx_http_variable_value_t *v, uintptr_t data); -static ngx_int_t ngx_http_proxy_parse_cookie(ngx_str_t *value, - ngx_array_t *attrs); -static ngx_int_t ngx_http_proxy_rewrite_cookie_value(ngx_http_request_t *r, - ngx_str_t *value, ngx_array_t *rewrites); -static ngx_int_t ngx_http_proxy_rewrite_cookie_flags(ngx_http_request_t *r, - ngx_array_t *attrs, ngx_array_t *flags); -static ngx_int_t ngx_http_proxy_edit_cookie_flags(ngx_http_request_t *r, - ngx_array_t *attrs, ngx_uint_t flags); -static ngx_int_t ngx_http_proxy_rewrite(ngx_http_request_t *r, - ngx_str_t *value, size_t prefix, size_t len, ngx_str_t *replacement); - -static ngx_int_t ngx_http_proxy_add_variables(ngx_conf_t *cf); -static void *ngx_http_proxy_create_main_conf(ngx_conf_t *cf); -static void *ngx_http_proxy_create_loc_conf(ngx_conf_t *cf); -static char *ngx_http_proxy_merge_loc_conf(ngx_conf_t *cf, - void *parent, void *child); -static ngx_int_t ngx_http_proxy_init_headers(ngx_conf_t *cf, - ngx_http_proxy_loc_conf_t *conf, ngx_http_proxy_headers_t *headers, - ngx_keyval_t *default_headers); - -static char *ngx_http_proxy_pass(ngx_conf_t *cf, ngx_command_t *cmd, - void *conf); -static char *ngx_http_proxy_redirect(ngx_conf_t *cf, ngx_command_t *cmd, - void *conf); -static char *ngx_http_proxy_cookie_domain(ngx_conf_t *cf, ngx_command_t *cmd, - void *conf); -static char *ngx_http_proxy_cookie_path(ngx_conf_t *cf, ngx_command_t *cmd, - void *conf); -static char *ngx_http_proxy_cookie_flags(ngx_conf_t *cf, ngx_command_t *cmd, - void *conf); -static char *ngx_http_proxy_store(ngx_conf_t *cf, ngx_command_t *cmd, - void *conf); -#if (NGX_HTTP_CACHE) -static char *ngx_http_proxy_cache(ngx_conf_t *cf, ngx_command_t *cmd, - void *conf); -static char *ngx_http_proxy_cache_key(ngx_conf_t *cf, ngx_command_t *cmd, - void *conf); -#endif -#if (NGX_HTTP_SSL) -static char *ngx_http_proxy_ssl_certificate_cache(ngx_conf_t *cf, - ngx_command_t *cmd, void *conf); -static char *ngx_http_proxy_ssl_password_file(ngx_conf_t *cf, - ngx_command_t *cmd, void *conf); -#endif - -static char *ngx_http_proxy_lowat_check(ngx_conf_t *cf, void *post, void *data); -#if (NGX_HTTP_SSL) -static char *ngx_http_proxy_ssl_conf_command_check(ngx_conf_t *cf, void *post, - void *data); -#endif - -static ngx_int_t ngx_http_proxy_rewrite_regex(ngx_conf_t *cf, - ngx_http_proxy_rewrite_t *pr, ngx_str_t *regex, ngx_uint_t caseless); - -#if (NGX_HTTP_SSL) -static ngx_int_t ngx_http_proxy_merge_ssl(ngx_conf_t *cf, - ngx_http_proxy_loc_conf_t *conf, ngx_http_proxy_loc_conf_t *prev); -static ngx_int_t ngx_http_proxy_set_ssl(ngx_conf_t *cf, - ngx_http_proxy_loc_conf_t *plcf); -#endif -static void ngx_http_proxy_set_vars(ngx_url_t *u, ngx_http_proxy_vars_t *v); - - -static ngx_conf_post_t ngx_http_proxy_lowat_post = - { ngx_http_proxy_lowat_check }; - - -static ngx_conf_bitmask_t ngx_http_proxy_next_upstream_masks[] = { - { ngx_string("error"), NGX_HTTP_UPSTREAM_FT_ERROR }, - { ngx_string("timeout"), NGX_HTTP_UPSTREAM_FT_TIMEOUT }, - { ngx_string("invalid_header"), NGX_HTTP_UPSTREAM_FT_INVALID_HEADER }, - { ngx_string("non_idempotent"), NGX_HTTP_UPSTREAM_FT_NON_IDEMPOTENT }, - { ngx_string("http_500"), NGX_HTTP_UPSTREAM_FT_HTTP_500 }, - { ngx_string("http_502"), NGX_HTTP_UPSTREAM_FT_HTTP_502 }, - { ngx_string("http_503"), NGX_HTTP_UPSTREAM_FT_HTTP_503 }, - { ngx_string("http_504"), NGX_HTTP_UPSTREAM_FT_HTTP_504 }, - { ngx_string("http_403"), NGX_HTTP_UPSTREAM_FT_HTTP_403 }, - { ngx_string("http_404"), NGX_HTTP_UPSTREAM_FT_HTTP_404 }, - { ngx_string("http_429"), NGX_HTTP_UPSTREAM_FT_HTTP_429 }, - { ngx_string("updating"), NGX_HTTP_UPSTREAM_FT_UPDATING }, - { ngx_string("off"), NGX_HTTP_UPSTREAM_FT_OFF }, - { ngx_null_string, 0 } -}; - - -#if (NGX_HTTP_SSL) - -static ngx_conf_bitmask_t ngx_http_proxy_ssl_protocols[] = { - { ngx_string("SSLv2"), NGX_SSL_SSLv2 }, - { ngx_string("SSLv3"), NGX_SSL_SSLv3 }, - { ngx_string("TLSv1"), NGX_SSL_TLSv1 }, - { ngx_string("TLSv1.1"), NGX_SSL_TLSv1_1 }, - { ngx_string("TLSv1.2"), NGX_SSL_TLSv1_2 }, - { ngx_string("TLSv1.3"), NGX_SSL_TLSv1_3 }, - { ngx_null_string, 0 } -}; - -static ngx_conf_post_t ngx_http_proxy_ssl_conf_command_post = - { ngx_http_proxy_ssl_conf_command_check }; - -#endif - - -static ngx_conf_enum_t ngx_http_proxy_http_version[] = { - { ngx_string("1.0"), NGX_HTTP_VERSION_10 }, - { ngx_string("1.1"), NGX_HTTP_VERSION_11 }, -#if (NGX_HTTP_V2) - { ngx_string("2"), NGX_HTTP_VERSION_20 }, -#endif - { ngx_null_string, 0 } -}; - - -ngx_module_t ngx_http_proxy_module; - - -static ngx_command_t ngx_http_proxy_commands[] = { - - { ngx_string("proxy_pass"), - NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF|NGX_HTTP_LMT_CONF|NGX_CONF_TAKE1, - ngx_http_proxy_pass, - NGX_HTTP_LOC_CONF_OFFSET, - 0, - NULL }, - - { ngx_string("proxy_redirect"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE12, - ngx_http_proxy_redirect, - NGX_HTTP_LOC_CONF_OFFSET, - 0, - NULL }, - - { ngx_string("proxy_cookie_domain"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE12, - ngx_http_proxy_cookie_domain, - NGX_HTTP_LOC_CONF_OFFSET, - 0, - NULL }, - - { ngx_string("proxy_cookie_path"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE12, - ngx_http_proxy_cookie_path, - NGX_HTTP_LOC_CONF_OFFSET, - 0, - NULL }, - - { ngx_string("proxy_cookie_flags"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1234, - ngx_http_proxy_cookie_flags, - NGX_HTTP_LOC_CONF_OFFSET, - 0, - NULL }, - - { ngx_string("proxy_store"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1, - ngx_http_proxy_store, - NGX_HTTP_LOC_CONF_OFFSET, - 0, - NULL }, - - { ngx_string("proxy_store_access"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE123, - ngx_conf_set_access_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_proxy_loc_conf_t, upstream.store_access), - NULL }, - - { ngx_string("proxy_buffering"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG, - ngx_conf_set_flag_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_proxy_loc_conf_t, upstream.buffering), - NULL }, - - { ngx_string("proxy_request_buffering"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG, - ngx_conf_set_flag_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_proxy_loc_conf_t, upstream.request_buffering), - NULL }, - - { ngx_string("proxy_ignore_client_abort"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG, - ngx_conf_set_flag_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_proxy_loc_conf_t, upstream.ignore_client_abort), - NULL }, - - { ngx_string("proxy_bind"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE12, - ngx_http_upstream_bind_set_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_proxy_loc_conf_t, upstream.local), - NULL }, - - { ngx_string("proxy_socket_keepalive"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG, - ngx_conf_set_flag_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_proxy_loc_conf_t, upstream.socket_keepalive), - NULL }, - - { ngx_string("proxy_connect_timeout"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1, - ngx_conf_set_msec_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_proxy_loc_conf_t, upstream.connect_timeout), - NULL }, - - { ngx_string("proxy_send_timeout"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1, - ngx_conf_set_msec_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_proxy_loc_conf_t, upstream.send_timeout), - NULL }, - - { ngx_string("proxy_send_lowat"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1, - ngx_conf_set_size_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_proxy_loc_conf_t, upstream.send_lowat), - &ngx_http_proxy_lowat_post }, - - { ngx_string("proxy_intercept_errors"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG, - ngx_conf_set_flag_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_proxy_loc_conf_t, upstream.intercept_errors), - NULL }, - - { ngx_string("proxy_set_header"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE2, - ngx_conf_set_keyval_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_proxy_loc_conf_t, headers_source), - NULL }, - - { ngx_string("proxy_headers_hash_max_size"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1, - ngx_conf_set_num_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_proxy_loc_conf_t, headers_hash_max_size), - NULL }, - - { ngx_string("proxy_headers_hash_bucket_size"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1, - ngx_conf_set_num_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_proxy_loc_conf_t, headers_hash_bucket_size), - NULL }, - - { ngx_string("proxy_set_body"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1, - ngx_conf_set_str_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_proxy_loc_conf_t, body_source), - NULL }, - - { ngx_string("proxy_method"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1, - ngx_http_set_complex_value_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_proxy_loc_conf_t, method), - NULL }, - - { ngx_string("proxy_pass_request_headers"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG, - ngx_conf_set_flag_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_proxy_loc_conf_t, upstream.pass_request_headers), - NULL }, - - { ngx_string("proxy_pass_request_body"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG, - ngx_conf_set_flag_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_proxy_loc_conf_t, upstream.pass_request_body), - NULL }, - - { ngx_string("proxy_pass_trailers"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG, - ngx_conf_set_flag_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_proxy_loc_conf_t, upstream.pass_trailers), - NULL }, - - { ngx_string("proxy_buffer_size"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1, - ngx_conf_set_size_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_proxy_loc_conf_t, upstream.buffer_size), - NULL }, - - { ngx_string("proxy_read_timeout"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1, - ngx_conf_set_msec_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_proxy_loc_conf_t, upstream.read_timeout), - NULL }, - - { ngx_string("proxy_buffers"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE2, - ngx_conf_set_bufs_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_proxy_loc_conf_t, upstream.bufs), - NULL }, - - { ngx_string("proxy_busy_buffers_size"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1, - ngx_conf_set_size_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_proxy_loc_conf_t, upstream.busy_buffers_size_conf), - NULL }, - - { ngx_string("proxy_force_ranges"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG, - ngx_conf_set_flag_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_proxy_loc_conf_t, upstream.force_ranges), - NULL }, - - { ngx_string("proxy_limit_rate"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1, - ngx_http_set_complex_value_size_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_proxy_loc_conf_t, upstream.limit_rate), - NULL }, - -#if (NGX_HTTP_CACHE) - - { ngx_string("proxy_cache"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1, - ngx_http_proxy_cache, - NGX_HTTP_LOC_CONF_OFFSET, - 0, - NULL }, - - { ngx_string("proxy_cache_key"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1, - ngx_http_proxy_cache_key, - NGX_HTTP_LOC_CONF_OFFSET, - 0, - NULL }, - - { ngx_string("proxy_cache_path"), - NGX_HTTP_MAIN_CONF|NGX_CONF_2MORE, - ngx_http_file_cache_set_slot, - NGX_HTTP_MAIN_CONF_OFFSET, - offsetof(ngx_http_proxy_main_conf_t, caches), - &ngx_http_proxy_module }, - - { ngx_string("proxy_cache_bypass"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE, - ngx_http_set_predicate_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_proxy_loc_conf_t, upstream.cache_bypass), - NULL }, - - { ngx_string("proxy_no_cache"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE, - ngx_http_set_predicate_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_proxy_loc_conf_t, upstream.no_cache), - NULL }, - - { ngx_string("proxy_cache_valid"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE, - ngx_http_file_cache_valid_set_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_proxy_loc_conf_t, upstream.cache_valid), - NULL }, - - { ngx_string("proxy_cache_min_uses"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1, - ngx_conf_set_num_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_proxy_loc_conf_t, upstream.cache_min_uses), - NULL }, - - { ngx_string("proxy_cache_max_range_offset"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1, - ngx_conf_set_off_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_proxy_loc_conf_t, upstream.cache_max_range_offset), - NULL }, - - { ngx_string("proxy_cache_use_stale"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE, - ngx_conf_set_bitmask_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_proxy_loc_conf_t, upstream.cache_use_stale), - &ngx_http_proxy_next_upstream_masks }, - - { ngx_string("proxy_cache_methods"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE, - ngx_conf_set_bitmask_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_proxy_loc_conf_t, upstream.cache_methods), - &ngx_http_upstream_cache_method_mask }, - - { ngx_string("proxy_cache_lock"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG, - ngx_conf_set_flag_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_proxy_loc_conf_t, upstream.cache_lock), - NULL }, - - { ngx_string("proxy_cache_lock_timeout"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1, - ngx_conf_set_msec_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_proxy_loc_conf_t, upstream.cache_lock_timeout), - NULL }, - - { ngx_string("proxy_cache_lock_age"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1, - ngx_conf_set_msec_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_proxy_loc_conf_t, upstream.cache_lock_age), - NULL }, - - { ngx_string("proxy_cache_revalidate"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG, - ngx_conf_set_flag_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_proxy_loc_conf_t, upstream.cache_revalidate), - NULL }, - - { ngx_string("proxy_cache_convert_head"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG, - ngx_conf_set_flag_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_proxy_loc_conf_t, upstream.cache_convert_head), - NULL }, - - { ngx_string("proxy_cache_background_update"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG, - ngx_conf_set_flag_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_proxy_loc_conf_t, upstream.cache_background_update), - NULL }, - -#endif - - { ngx_string("proxy_temp_path"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1234, - ngx_conf_set_path_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_proxy_loc_conf_t, upstream.temp_path), - NULL }, - - { ngx_string("proxy_max_temp_file_size"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1, - ngx_conf_set_size_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_proxy_loc_conf_t, upstream.max_temp_file_size_conf), - NULL }, - - { ngx_string("proxy_temp_file_write_size"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1, - ngx_conf_set_size_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_proxy_loc_conf_t, upstream.temp_file_write_size_conf), - NULL }, - - { ngx_string("proxy_next_upstream"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE, - ngx_conf_set_bitmask_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_proxy_loc_conf_t, upstream.next_upstream), - &ngx_http_proxy_next_upstream_masks }, - - { ngx_string("proxy_next_upstream_tries"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1, - ngx_conf_set_num_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_proxy_loc_conf_t, upstream.next_upstream_tries), - NULL }, - - { ngx_string("proxy_next_upstream_timeout"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1, - ngx_conf_set_msec_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_proxy_loc_conf_t, upstream.next_upstream_timeout), - NULL }, - - { ngx_string("proxy_pass_header"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1, - ngx_conf_set_str_array_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_proxy_loc_conf_t, upstream.pass_headers), - NULL }, - - { ngx_string("proxy_hide_header"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1, - ngx_conf_set_str_array_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_proxy_loc_conf_t, upstream.hide_headers), - NULL }, - - { ngx_string("proxy_ignore_headers"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE, - ngx_conf_set_bitmask_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_proxy_loc_conf_t, upstream.ignore_headers), - &ngx_http_upstream_ignore_headers_masks }, - - { ngx_string("proxy_http_version"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1, - ngx_conf_set_enum_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_proxy_loc_conf_t, http_version), - &ngx_http_proxy_http_version }, - -#if (NGX_HTTP_SSL) - - { ngx_string("proxy_ssl_session_reuse"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG, - ngx_conf_set_flag_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_proxy_loc_conf_t, upstream.ssl_session_reuse), - NULL }, - - { ngx_string("proxy_ssl_protocols"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE, - ngx_conf_set_bitmask_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_proxy_loc_conf_t, ssl_protocols), - &ngx_http_proxy_ssl_protocols }, - - { ngx_string("proxy_ssl_ciphers"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1, - ngx_conf_set_str_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_proxy_loc_conf_t, ssl_ciphers), - NULL }, - - { ngx_string("proxy_ssl_name"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1, - ngx_http_set_complex_value_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_proxy_loc_conf_t, upstream.ssl_name), - NULL }, - - { ngx_string("proxy_ssl_server_name"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG, - ngx_conf_set_flag_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_proxy_loc_conf_t, upstream.ssl_server_name), - NULL }, - - { ngx_string("proxy_ssl_verify"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG, - ngx_conf_set_flag_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_proxy_loc_conf_t, upstream.ssl_verify), - NULL }, - - { ngx_string("proxy_ssl_verify_depth"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1, - ngx_conf_set_num_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_proxy_loc_conf_t, ssl_verify_depth), - NULL }, - - { ngx_string("proxy_ssl_trusted_certificate"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1, - ngx_conf_set_str_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_proxy_loc_conf_t, ssl_trusted_certificate), - NULL }, - - { ngx_string("proxy_ssl_crl"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1, - ngx_conf_set_str_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_proxy_loc_conf_t, ssl_crl), - NULL }, - - { ngx_string("proxy_ssl_certificate"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1, - ngx_http_set_complex_value_zero_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_proxy_loc_conf_t, upstream.ssl_certificate), - NULL }, - - { ngx_string("proxy_ssl_certificate_key"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1, - ngx_http_set_complex_value_zero_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_proxy_loc_conf_t, upstream.ssl_certificate_key), - NULL }, - - { ngx_string("proxy_ssl_certificate_cache"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE123, - ngx_http_proxy_ssl_certificate_cache, - NGX_HTTP_LOC_CONF_OFFSET, - 0, - NULL }, - - { ngx_string("proxy_ssl_password_file"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1, - ngx_http_proxy_ssl_password_file, - NGX_HTTP_LOC_CONF_OFFSET, - 0, - NULL }, - - { ngx_string("proxy_ssl_conf_command"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE2, - ngx_conf_set_keyval_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_proxy_loc_conf_t, ssl_conf_commands), - &ngx_http_proxy_ssl_conf_command_post }, - -#endif - - ngx_null_command -}; - - -static ngx_http_module_t ngx_http_proxy_module_ctx = { - ngx_http_proxy_add_variables, /* preconfiguration */ - NULL, /* postconfiguration */ - - ngx_http_proxy_create_main_conf, /* create main configuration */ - NULL, /* init main configuration */ - - NULL, /* create server configuration */ - NULL, /* merge server configuration */ - - ngx_http_proxy_create_loc_conf, /* create location configuration */ - ngx_http_proxy_merge_loc_conf /* merge location configuration */ -}; - - -ngx_module_t ngx_http_proxy_module = { - NGX_MODULE_V1, - &ngx_http_proxy_module_ctx, /* module context */ - ngx_http_proxy_commands, /* module directives */ - NGX_HTTP_MODULE, /* module type */ - NULL, /* init master */ - NULL, /* init module */ - NULL, /* init process */ - NULL, /* init thread */ - NULL, /* exit thread */ - NULL, /* exit process */ - NULL, /* exit master */ - NGX_MODULE_V1_PADDING -}; - - -static char ngx_http_proxy_version[] = " HTTP/1.0" CRLF; -static char ngx_http_proxy_version_11[] = " HTTP/1.1" CRLF; - - -static ngx_keyval_t ngx_http_proxy_headers[] = { - { ngx_string("Host"), ngx_string("$proxy_internal_host") }, - { ngx_string("Connection"), ngx_string("") }, - { ngx_string("Content-Length"), ngx_string("$proxy_internal_body_length") }, - { ngx_string("Transfer-Encoding"), ngx_string("$proxy_internal_chunked") }, - { ngx_string("TE"), ngx_string("") }, - { ngx_string("Keep-Alive"), ngx_string("") }, - { ngx_string("Expect"), ngx_string("") }, - { ngx_string("Upgrade"), ngx_string("") }, - { ngx_null_string, ngx_null_string } -}; - - -static ngx_str_t ngx_http_proxy_hide_headers[] = { - ngx_string("Date"), - ngx_string("Server"), - ngx_string("X-Pad"), - ngx_string("X-Accel-Expires"), - ngx_string("X-Accel-Redirect"), - ngx_string("X-Accel-Limit-Rate"), - ngx_string("X-Accel-Buffering"), - ngx_string("X-Accel-Charset"), - ngx_null_string -}; - - -#if (NGX_HTTP_CACHE) - -static ngx_keyval_t ngx_http_proxy_cache_headers[] = { - { ngx_string("Host"), ngx_string("$proxy_internal_host") }, - { ngx_string("Connection"), ngx_string("") }, - { ngx_string("Content-Length"), ngx_string("$proxy_internal_body_length") }, - { ngx_string("Transfer-Encoding"), ngx_string("$proxy_internal_chunked") }, - { ngx_string("TE"), ngx_string("") }, - { ngx_string("Keep-Alive"), ngx_string("") }, - { ngx_string("Expect"), ngx_string("") }, - { ngx_string("Upgrade"), ngx_string("") }, - { ngx_string("If-Modified-Since"), - ngx_string("$upstream_cache_last_modified") }, - { ngx_string("If-Unmodified-Since"), ngx_string("") }, - { ngx_string("If-None-Match"), ngx_string("$upstream_cache_etag") }, - { ngx_string("If-Match"), ngx_string("") }, - { ngx_string("Range"), ngx_string("") }, - { ngx_string("If-Range"), ngx_string("") }, - { ngx_null_string, ngx_null_string } -}; - -#endif - - -static ngx_http_variable_t ngx_http_proxy_vars[] = { - - { ngx_string("proxy_host"), NULL, ngx_http_proxy_host_variable, 0, - NGX_HTTP_VAR_CHANGEABLE|NGX_HTTP_VAR_NOCACHEABLE|NGX_HTTP_VAR_NOHASH, 0 }, - - { ngx_string("proxy_port"), NULL, ngx_http_proxy_port_variable, 0, - NGX_HTTP_VAR_CHANGEABLE|NGX_HTTP_VAR_NOCACHEABLE|NGX_HTTP_VAR_NOHASH, 0 }, - - { ngx_string("proxy_add_x_forwarded_for"), NULL, - ngx_http_proxy_add_x_forwarded_for_variable, 0, NGX_HTTP_VAR_NOHASH, 0 }, - -#if 0 - { ngx_string("proxy_add_via"), NULL, NULL, 0, NGX_HTTP_VAR_NOHASH, 0 }, -#endif - - { ngx_string("proxy_internal_host"), NULL, - ngx_http_proxy_host_variable, 1, - NGX_HTTP_VAR_CHANGEABLE|NGX_HTTP_VAR_NOCACHEABLE|NGX_HTTP_VAR_NOHASH, 0 }, - - { ngx_string("proxy_internal_body_length"), NULL, - ngx_http_proxy_internal_body_length_variable, 0, - NGX_HTTP_VAR_NOCACHEABLE|NGX_HTTP_VAR_NOHASH, 0 }, - - { ngx_string("proxy_internal_chunked"), NULL, - ngx_http_proxy_internal_chunked_variable, 0, - NGX_HTTP_VAR_NOCACHEABLE|NGX_HTTP_VAR_NOHASH, 0 }, - - ngx_http_null_variable -}; - - -static ngx_path_init_t ngx_http_proxy_temp_path = { - ngx_string(NGX_HTTP_PROXY_TEMP_PATH), { 1, 2, 0 } -}; - - -static ngx_conf_bitmask_t ngx_http_proxy_cookie_flags_masks[] = { - - { ngx_string("secure"), - NGX_HTTP_PROXY_COOKIE_SECURE|NGX_HTTP_PROXY_COOKIE_SECURE_ON }, - - { ngx_string("nosecure"), - NGX_HTTP_PROXY_COOKIE_SECURE|NGX_HTTP_PROXY_COOKIE_SECURE_OFF }, - - { ngx_string("httponly"), - NGX_HTTP_PROXY_COOKIE_HTTPONLY|NGX_HTTP_PROXY_COOKIE_HTTPONLY_ON }, - - { ngx_string("nohttponly"), - NGX_HTTP_PROXY_COOKIE_HTTPONLY|NGX_HTTP_PROXY_COOKIE_HTTPONLY_OFF }, - - { ngx_string("samesite=strict"), - NGX_HTTP_PROXY_COOKIE_SAMESITE|NGX_HTTP_PROXY_COOKIE_SAMESITE_STRICT }, - - { ngx_string("samesite=lax"), - NGX_HTTP_PROXY_COOKIE_SAMESITE|NGX_HTTP_PROXY_COOKIE_SAMESITE_LAX }, - - { ngx_string("samesite=none"), - NGX_HTTP_PROXY_COOKIE_SAMESITE|NGX_HTTP_PROXY_COOKIE_SAMESITE_NONE }, - - { ngx_string("nosamesite"), - NGX_HTTP_PROXY_COOKIE_SAMESITE|NGX_HTTP_PROXY_COOKIE_SAMESITE_OFF }, - - { ngx_null_string, 0 } -}; - - -static ngx_int_t -ngx_http_proxy_handler(ngx_http_request_t *r) -{ - ngx_int_t rc; - ngx_http_upstream_t *u; - ngx_http_proxy_ctx_t *ctx; - ngx_http_proxy_loc_conf_t *plcf; -#if (NGX_HTTP_CACHE) - ngx_http_proxy_main_conf_t *pmcf; -#endif - - plcf = ngx_http_get_module_loc_conf(r, ngx_http_proxy_module); - -#if (NGX_HTTP_V2) - if (plcf->http_version == NGX_HTTP_VERSION_20) { - return ngx_http_proxy_v2_handler(r); - } -#endif - - if (ngx_http_upstream_create(r) != NGX_OK) { - return NGX_HTTP_INTERNAL_SERVER_ERROR; - } - - ctx = ngx_pcalloc(r->pool, sizeof(ngx_http_proxy_ctx_t)); - if (ctx == NULL) { - return NGX_HTTP_INTERNAL_SERVER_ERROR; - } - - ctx->legacy = 1; - - ngx_http_set_ctx(r, ctx, ngx_http_proxy_module); - - u = r->upstream; - - if (plcf->proxy_lengths == NULL) { - ctx->vars = plcf->vars; - u->schema = plcf->vars.schema; -#if (NGX_HTTP_SSL) - u->ssl = plcf->ssl; -#endif - - } else { - if (ngx_http_proxy_eval(r, ctx, plcf) != NGX_OK) { - return NGX_HTTP_INTERNAL_SERVER_ERROR; - } - } - - u->output.tag = (ngx_buf_tag_t) &ngx_http_proxy_module; - - u->conf = &plcf->upstream; - -#if (NGX_HTTP_CACHE) - pmcf = ngx_http_get_module_main_conf(r, ngx_http_proxy_module); - - u->caches = &pmcf->caches; - u->create_key = ngx_http_proxy_create_key; -#endif - - u->create_request = ngx_http_proxy_create_request; - u->reinit_request = ngx_http_proxy_reinit_request; - u->process_header = ngx_http_proxy_process_status_line; - u->abort_request = ngx_http_proxy_abort_request; - u->finalize_request = ngx_http_proxy_finalize_request; - r->state = 0; - - if (plcf->redirects) { - u->rewrite_redirect = ngx_http_proxy_rewrite_redirect; - } - - if (plcf->cookie_domains || plcf->cookie_paths || plcf->cookie_flags) { - u->rewrite_cookie = ngx_http_proxy_rewrite_cookie; - } - - u->buffering = plcf->upstream.buffering; - - u->pipe = ngx_pcalloc(r->pool, sizeof(ngx_event_pipe_t)); - if (u->pipe == NULL) { - return NGX_HTTP_INTERNAL_SERVER_ERROR; - } - - u->pipe->input_filter = ngx_http_proxy_copy_filter; - u->pipe->input_ctx = r; - - u->input_filter_init = ngx_http_proxy_input_filter_init; - u->input_filter = ngx_http_proxy_non_buffered_copy_filter; - u->input_filter_ctx = r; - - u->accel = 1; - - if (!plcf->upstream.request_buffering - && plcf->body_values == NULL && plcf->upstream.pass_request_body - && (!r->headers_in.chunked - || plcf->http_version == NGX_HTTP_VERSION_11)) - { - r->request_body_no_buffering = 1; - } - - rc = ngx_http_read_client_request_body(r, ngx_http_upstream_init); - - if (rc >= NGX_HTTP_SPECIAL_RESPONSE) { - return rc; - } - - return NGX_DONE; -} - - -ngx_int_t -ngx_http_proxy_eval(ngx_http_request_t *r, ngx_http_proxy_ctx_t *ctx, - ngx_http_proxy_loc_conf_t *plcf) -{ - u_char *p; - size_t add; - u_short port; - ngx_str_t proxy; - ngx_url_t url; - ngx_http_upstream_t *u; - - if (ngx_http_script_run(r, &proxy, plcf->proxy_lengths->elts, 0, - plcf->proxy_values->elts) - == NULL) - { - return NGX_ERROR; - } - - if (proxy.len > 7 - && ngx_strncasecmp(proxy.data, (u_char *) "http://", 7) == 0) - { - add = 7; - port = 80; - -#if (NGX_HTTP_SSL) - - } else if (proxy.len > 8 - && ngx_strncasecmp(proxy.data, (u_char *) "https://", 8) == 0) - { - add = 8; - port = 443; - r->upstream->ssl = 1; - -#endif - - } else { - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "invalid URL prefix in \"%V\"", &proxy); - return NGX_ERROR; - } - - u = r->upstream; - - u->schema.len = add; - u->schema.data = proxy.data; - - ngx_memzero(&url, sizeof(ngx_url_t)); - - url.url.len = proxy.len - add; - url.url.data = proxy.data + add; - url.default_port = port; - url.uri_part = 1; - url.no_resolve = 1; - - if (ngx_parse_url(r->pool, &url) != NGX_OK) { - if (url.err) { - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "%s in upstream \"%V\"", url.err, &url.url); - } - - return NGX_ERROR; - } - - if (url.uri.len) { - if (url.uri.data[0] == '?') { - p = ngx_pnalloc(r->pool, url.uri.len + 1); - if (p == NULL) { - return NGX_ERROR; - } - - *p++ = '/'; - ngx_memcpy(p, url.uri.data, url.uri.len); - - url.uri.len++; - url.uri.data = p - 1; - } - } - - ctx->vars.key_start = u->schema; - - ngx_http_proxy_set_vars(&url, &ctx->vars); - - u->resolved = ngx_pcalloc(r->pool, sizeof(ngx_http_upstream_resolved_t)); - if (u->resolved == NULL) { - return NGX_ERROR; - } - - if (url.addrs) { - u->resolved->sockaddr = url.addrs[0].sockaddr; - u->resolved->socklen = url.addrs[0].socklen; - u->resolved->name = url.addrs[0].name; - u->resolved->naddrs = 1; - } - - u->resolved->host = url.host; - u->resolved->port = (in_port_t) (url.no_port ? port : url.port); - u->resolved->no_port = url.no_port; - - return NGX_OK; -} - - -#if (NGX_HTTP_CACHE) - -ngx_int_t -ngx_http_proxy_create_key(ngx_http_request_t *r) -{ - size_t len, loc_len; - u_char *p; - uintptr_t escape; - ngx_str_t *key; - ngx_http_upstream_t *u; - ngx_http_proxy_ctx_t *ctx; - ngx_http_proxy_loc_conf_t *plcf; - - u = r->upstream; - - plcf = ngx_http_get_module_loc_conf(r, ngx_http_proxy_module); - - ctx = ngx_http_get_module_ctx(r, ngx_http_proxy_module); - - key = ngx_array_push(&r->cache->keys); - if (key == NULL) { - return NGX_ERROR; - } - - if (plcf->cache_key.value.data) { - - if (ngx_http_complex_value(r, &plcf->cache_key, key) != NGX_OK) { - return NGX_ERROR; - } - - return NGX_OK; - } - - *key = ctx->vars.key_start; - - key = ngx_array_push(&r->cache->keys); - if (key == NULL) { - return NGX_ERROR; - } - - if (plcf->proxy_lengths && ctx->vars.uri.len) { - - *key = ctx->vars.uri; - u->uri = ctx->vars.uri; - - return NGX_OK; - - } else if (ctx->vars.uri.len == 0 && r->valid_unparsed_uri) { - *key = r->unparsed_uri; - u->uri = r->unparsed_uri; - - return NGX_OK; - } - - loc_len = (r->valid_location && ctx->vars.uri.len) - ? ngx_min(plcf->location.len, r->uri.len) : 0; - - if (r->quoted_uri || r->internal) { - escape = 2 * ngx_escape_uri(NULL, r->uri.data + loc_len, - r->uri.len - loc_len, NGX_ESCAPE_URI); - } else { - escape = 0; - } - - len = ctx->vars.uri.len + r->uri.len - loc_len + escape - + sizeof("?") - 1 + r->args.len; - - p = ngx_pnalloc(r->pool, len); - if (p == NULL) { - return NGX_ERROR; - } - - key->data = p; - - if (r->valid_location) { - p = ngx_copy(p, ctx->vars.uri.data, ctx->vars.uri.len); - } - - if (escape) { - ngx_escape_uri(p, r->uri.data + loc_len, - r->uri.len - loc_len, NGX_ESCAPE_URI); - p += r->uri.len - loc_len + escape; - - } else { - p = ngx_copy(p, r->uri.data + loc_len, r->uri.len - loc_len); - } - - if (r->args.len > 0) { - *p++ = '?'; - p = ngx_copy(p, r->args.data, r->args.len); - } - - key->len = p - key->data; - u->uri = *key; - - return NGX_OK; -} - -#endif - - -static ngx_int_t -ngx_http_proxy_create_request(ngx_http_request_t *r) -{ - size_t len, uri_len, loc_len, body_len, - key_len, val_len; - uintptr_t escape; - ngx_buf_t *b; - ngx_str_t method; - ngx_uint_t i, unparsed_uri; - ngx_chain_t *cl, *body; - ngx_list_part_t *part; - ngx_table_elt_t *header; - ngx_http_upstream_t *u; - ngx_http_proxy_ctx_t *ctx; - ngx_http_script_code_pt code; - ngx_http_proxy_headers_t *headers; - ngx_http_script_engine_t e, le; - ngx_http_proxy_loc_conf_t *plcf; - ngx_http_script_len_code_pt lcode; - - u = r->upstream; - - plcf = ngx_http_get_module_loc_conf(r, ngx_http_proxy_module); - -#if (NGX_HTTP_CACHE) - headers = u->cacheable ? &plcf->headers_cache : &plcf->headers; -#else - headers = &plcf->headers; -#endif - - if (u->method.len) { - /* HEAD was changed to GET to cache response */ - method = u->method; - - } else if (plcf->method) { - if (ngx_http_complex_value(r, plcf->method, &method) != NGX_OK) { - return NGX_ERROR; - } - - } else { - method = r->method_name; - } - - ctx = ngx_http_get_module_ctx(r, ngx_http_proxy_module); - - if (method.len == 4 - && ngx_strncasecmp(method.data, (u_char *) "HEAD", 4) == 0) - { - ctx->head = 1; - } - - len = method.len + 1 + sizeof(ngx_http_proxy_version) - 1 - + sizeof(CRLF) - 1; - - escape = 0; - loc_len = 0; - unparsed_uri = 0; - - if (plcf->proxy_lengths && ctx->vars.uri.len) { - uri_len = ctx->vars.uri.len; - - } else if (ctx->vars.uri.len == 0 && r->valid_unparsed_uri) { - unparsed_uri = 1; - uri_len = r->unparsed_uri.len; - - } else { - loc_len = (r->valid_location && ctx->vars.uri.len) - ? ngx_min(plcf->location.len, r->uri.len) : 0; - - if (r->quoted_uri || r->internal) { - escape = 2 * ngx_escape_uri(NULL, r->uri.data + loc_len, - r->uri.len - loc_len, NGX_ESCAPE_URI); - } - - uri_len = ctx->vars.uri.len + r->uri.len - loc_len + escape - + sizeof("?") - 1 + r->args.len; - } - - if (uri_len == 0) { - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "zero length URI to proxy"); - return NGX_ERROR; - } - - len += uri_len; - - ngx_memzero(&le, sizeof(ngx_http_script_engine_t)); - - ngx_http_script_flush_no_cacheable_variables(r, plcf->body_flushes); - ngx_http_script_flush_no_cacheable_variables(r, headers->flushes); - - if (plcf->body_lengths) { - le.ip = plcf->body_lengths->elts; - le.request = r; - le.flushed = 1; - body_len = 0; - - while (*(uintptr_t *) le.ip) { - lcode = *(ngx_http_script_len_code_pt *) le.ip; - body_len += lcode(&le); - } - - ctx->internal_body_length = body_len; - len += body_len; - - } else if (r->headers_in.chunked && r->reading_body) { - ctx->internal_body_length = -1; - ctx->internal_chunked = 1; - - } else { - ctx->internal_body_length = r->headers_in.content_length_n; - } - - le.ip = headers->lengths->elts; - le.request = r; - le.flushed = 1; - - while (*(uintptr_t *) le.ip) { - - lcode = *(ngx_http_script_len_code_pt *) le.ip; - key_len = lcode(&le); - - for (val_len = 0; *(uintptr_t *) le.ip; val_len += lcode(&le)) { - lcode = *(ngx_http_script_len_code_pt *) le.ip; - } - le.ip += sizeof(uintptr_t); - - if (val_len == 0) { - continue; - } - - len += key_len + sizeof(": ") - 1 + val_len + sizeof(CRLF) - 1; - } - - - if (plcf->upstream.pass_request_headers) { - part = &r->headers_in.headers.part; - header = part->elts; - - for (i = 0; /* void */; i++) { - - if (i >= part->nelts) { - if (part->next == NULL) { - break; - } - - part = part->next; - header = part->elts; - i = 0; - } - - if (ngx_hash_find(&headers->hash, header[i].hash, - header[i].lowcase_key, header[i].key.len)) - { - continue; - } - - len += header[i].key.len + sizeof(": ") - 1 - + header[i].value.len + sizeof(CRLF) - 1; - } - } - - - b = ngx_create_temp_buf(r->pool, len); - if (b == NULL) { - return NGX_ERROR; - } - - cl = ngx_alloc_chain_link(r->pool); - if (cl == NULL) { - return NGX_ERROR; - } - - cl->buf = b; - - - /* the request line */ - - b->last = ngx_copy(b->last, method.data, method.len); - *b->last++ = ' '; - - u->uri.data = b->last; - - if (plcf->proxy_lengths && ctx->vars.uri.len) { - b->last = ngx_copy(b->last, ctx->vars.uri.data, ctx->vars.uri.len); - - } else if (unparsed_uri) { - b->last = ngx_copy(b->last, r->unparsed_uri.data, r->unparsed_uri.len); - - } else { - if (r->valid_location) { - b->last = ngx_copy(b->last, ctx->vars.uri.data, ctx->vars.uri.len); - } - - if (escape) { - ngx_escape_uri(b->last, r->uri.data + loc_len, - r->uri.len - loc_len, NGX_ESCAPE_URI); - b->last += r->uri.len - loc_len + escape; - - } else { - b->last = ngx_copy(b->last, r->uri.data + loc_len, - r->uri.len - loc_len); - } - - if (r->args.len > 0) { - *b->last++ = '?'; - b->last = ngx_copy(b->last, r->args.data, r->args.len); - } - } - - u->uri.len = b->last - u->uri.data; - - if (plcf->http_version == NGX_HTTP_VERSION_11) { - b->last = ngx_cpymem(b->last, ngx_http_proxy_version_11, - sizeof(ngx_http_proxy_version_11) - 1); - - } else { - b->last = ngx_cpymem(b->last, ngx_http_proxy_version, - sizeof(ngx_http_proxy_version) - 1); - } - - ngx_memzero(&e, sizeof(ngx_http_script_engine_t)); - - e.ip = headers->values->elts; - e.pos = b->last; - e.request = r; - e.flushed = 1; - - le.ip = headers->lengths->elts; - - while (*(uintptr_t *) le.ip) { - - lcode = *(ngx_http_script_len_code_pt *) le.ip; - (void) lcode(&le); - - for (val_len = 0; *(uintptr_t *) le.ip; val_len += lcode(&le)) { - lcode = *(ngx_http_script_len_code_pt *) le.ip; - } - le.ip += sizeof(uintptr_t); - - if (val_len == 0) { - e.skip = 1; - - while (*(uintptr_t *) e.ip) { - code = *(ngx_http_script_code_pt *) e.ip; - code((ngx_http_script_engine_t *) &e); - } - e.ip += sizeof(uintptr_t); - - e.skip = 0; - - continue; - } - - code = *(ngx_http_script_code_pt *) e.ip; - code((ngx_http_script_engine_t *) &e); - - *e.pos++ = ':'; *e.pos++ = ' '; - - while (*(uintptr_t *) e.ip) { - code = *(ngx_http_script_code_pt *) e.ip; - code((ngx_http_script_engine_t *) &e); - } - e.ip += sizeof(uintptr_t); - - *e.pos++ = CR; *e.pos++ = LF; - } - - b->last = e.pos; - - - if (plcf->upstream.pass_request_headers) { - part = &r->headers_in.headers.part; - header = part->elts; - - for (i = 0; /* void */; i++) { - - if (i >= part->nelts) { - if (part->next == NULL) { - break; - } - - part = part->next; - header = part->elts; - i = 0; - } - - if (ngx_hash_find(&headers->hash, header[i].hash, - header[i].lowcase_key, header[i].key.len)) - { - continue; - } - - b->last = ngx_copy(b->last, header[i].key.data, header[i].key.len); - - *b->last++ = ':'; *b->last++ = ' '; - - b->last = ngx_copy(b->last, header[i].value.data, - header[i].value.len); - - *b->last++ = CR; *b->last++ = LF; - - ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "http proxy header: \"%V: %V\"", - &header[i].key, &header[i].value); - } - } - - - /* add "\r\n" at the header end */ - *b->last++ = CR; *b->last++ = LF; - - if (plcf->body_values) { - e.ip = plcf->body_values->elts; - e.pos = b->last; - e.skip = 0; - - while (*(uintptr_t *) e.ip) { - code = *(ngx_http_script_code_pt *) e.ip; - code((ngx_http_script_engine_t *) &e); - } - - b->last = e.pos; - } - - ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "http proxy header:%N\"%*s\"", - (size_t) (b->last - b->pos), b->pos); - - if (r->request_body_no_buffering) { - - u->request_bufs = cl; - - if (ctx->internal_chunked) { - u->output.output_filter = ngx_http_proxy_body_output_filter; - u->output.filter_ctx = r; - } - - } else if (plcf->body_values == NULL && plcf->upstream.pass_request_body) { - - body = u->request_bufs; - u->request_bufs = cl; - - while (body) { - b = ngx_alloc_buf(r->pool); - if (b == NULL) { - return NGX_ERROR; - } - - ngx_memcpy(b, body->buf, sizeof(ngx_buf_t)); - - cl->next = ngx_alloc_chain_link(r->pool); - if (cl->next == NULL) { - return NGX_ERROR; - } - - cl = cl->next; - cl->buf = b; - - body = body->next; - } - - } else { - u->request_bufs = cl; - } - - b->flush = 1; - cl->next = NULL; - - return NGX_OK; -} - - -static ngx_int_t -ngx_http_proxy_reinit_request(ngx_http_request_t *r) -{ - ngx_http_proxy_ctx_t *ctx; - - ctx = ngx_http_get_module_ctx(r, ngx_http_proxy_module); - - if (ctx == NULL) { - return NGX_OK; - } - - ctx->status.code = 0; - ctx->status.count = 0; - ctx->status.start = NULL; - ctx->status.end = NULL; - ctx->chunked.state = 0; - - r->upstream->process_header = ngx_http_proxy_process_status_line; - r->upstream->pipe->input_filter = ngx_http_proxy_copy_filter; - r->upstream->input_filter = ngx_http_proxy_non_buffered_copy_filter; - r->state = 0; - - return NGX_OK; -} - - -static ngx_int_t -ngx_http_proxy_body_output_filter(void *data, ngx_chain_t *in) -{ - ngx_http_request_t *r = data; - - off_t size; - u_char *chunk; - ngx_int_t rc; - ngx_buf_t *b; - ngx_chain_t *out, *cl, *tl, **ll, **fl; - ngx_http_proxy_ctx_t *ctx; - - ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "proxy output filter"); - - ctx = ngx_http_get_module_ctx(r, ngx_http_proxy_module); - - if (in == NULL) { - out = in; - goto out; - } - - out = NULL; - ll = &out; - - if (!ctx->header_sent) { - /* first buffer contains headers, pass it unmodified */ - - ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "proxy output header"); - - ctx->header_sent = 1; - - tl = ngx_alloc_chain_link(r->pool); - if (tl == NULL) { - return NGX_ERROR; - } - - tl->buf = in->buf; - *ll = tl; - ll = &tl->next; - - in = in->next; - - if (in == NULL) { - tl->next = NULL; - goto out; - } - } - - size = 0; - cl = in; - fl = ll; - - for ( ;; ) { - ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "proxy output chunk: %O", ngx_buf_size(cl->buf)); - - size += ngx_buf_size(cl->buf); - - if (cl->buf->flush - || cl->buf->sync - || ngx_buf_in_memory(cl->buf) - || cl->buf->in_file) - { - tl = ngx_alloc_chain_link(r->pool); - if (tl == NULL) { - return NGX_ERROR; - } - - tl->buf = cl->buf; - *ll = tl; - ll = &tl->next; - } - - if (cl->next == NULL) { - break; - } - - cl = cl->next; - } - - if (size) { - tl = ngx_chain_get_free_buf(r->pool, &ctx->free); - if (tl == NULL) { - return NGX_ERROR; - } - - b = tl->buf; - chunk = b->start; - - if (chunk == NULL) { - /* the "0000000000000000" is 64-bit hexadecimal string */ - - chunk = ngx_palloc(r->pool, sizeof("0000000000000000" CRLF) - 1); - if (chunk == NULL) { - return NGX_ERROR; - } - - b->start = chunk; - b->end = chunk + sizeof("0000000000000000" CRLF) - 1; - } - - b->tag = (ngx_buf_tag_t) &ngx_http_proxy_body_output_filter; - b->memory = 0; - b->temporary = 1; - b->pos = chunk; - b->last = ngx_sprintf(chunk, "%xO" CRLF, size); - - tl->next = *fl; - *fl = tl; - } - - if (cl->buf->last_buf) { - tl = ngx_chain_get_free_buf(r->pool, &ctx->free); - if (tl == NULL) { - return NGX_ERROR; - } - - b = tl->buf; - - b->tag = (ngx_buf_tag_t) &ngx_http_proxy_body_output_filter; - b->temporary = 0; - b->memory = 1; - b->last_buf = 1; - b->pos = (u_char *) CRLF "0" CRLF CRLF; - b->last = b->pos + 7; - - cl->buf->last_buf = 0; - - *ll = tl; - - if (size == 0) { - b->pos += 2; - } - - } else if (size > 0) { - tl = ngx_chain_get_free_buf(r->pool, &ctx->free); - if (tl == NULL) { - return NGX_ERROR; - } - - b = tl->buf; - - b->tag = (ngx_buf_tag_t) &ngx_http_proxy_body_output_filter; - b->temporary = 0; - b->memory = 1; - b->pos = (u_char *) CRLF; - b->last = b->pos + 2; - - *ll = tl; - - } else { - *ll = NULL; - } - -out: - - rc = ngx_chain_writer(&r->upstream->writer, out); - - ngx_chain_update_chains(r->pool, &ctx->free, &ctx->busy, &out, - (ngx_buf_tag_t) &ngx_http_proxy_body_output_filter); - - return rc; -} - - -static ngx_int_t -ngx_http_proxy_process_status_line(ngx_http_request_t *r) -{ - size_t len; - ngx_int_t rc; - ngx_http_upstream_t *u; - ngx_http_proxy_ctx_t *ctx; - - ctx = ngx_http_get_module_ctx(r, ngx_http_proxy_module); - - if (ctx == NULL) { - return NGX_ERROR; - } - - u = r->upstream; - - if (r->state == 0) { - r->header_name_start = u->buffer.pos; - } - - rc = ngx_http_parse_status_line(r, &u->buffer, &ctx->status); - - if (rc == NGX_AGAIN) { - return rc; - } - - if (rc == NGX_ERROR) { - u->buffer.pos = r->header_name_start; - -#if (NGX_HTTP_CACHE) - - if (r->cache) { - r->http_version = NGX_HTTP_VERSION_9; - return NGX_OK; - } - -#endif - - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "upstream sent no valid HTTP/1.0 header"); - -#if 0 - if (u->accel) { - return NGX_HTTP_UPSTREAM_INVALID_HEADER; - } -#endif - - r->http_version = NGX_HTTP_VERSION_9; - u->state->status = NGX_HTTP_OK; - u->headers_in.connection_close = 1; - - return NGX_OK; - } - - if (u->state && u->state->status == 0) { - u->state->status = ctx->status.code; - } - - u->headers_in.status_n = ctx->status.code; - - len = ctx->status.end - ctx->status.start; - u->headers_in.status_line.len = len; - - u->headers_in.status_line.data = ngx_pnalloc(r->pool, len); - if (u->headers_in.status_line.data == NULL) { - return NGX_ERROR; - } - - ngx_memcpy(u->headers_in.status_line.data, ctx->status.start, len); - - ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "http proxy status %ui \"%V\"", - u->headers_in.status_n, &u->headers_in.status_line); - - if (ctx->status.http_version < NGX_HTTP_VERSION_11) { - - if (ctx->status.code == NGX_HTTP_EARLY_HINTS) { - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "upstream sent HTTP/1.0 response with early hints"); - return NGX_HTTP_UPSTREAM_INVALID_HEADER; - } - - u->headers_in.connection_close = 1; - } - - u->process_header = ngx_http_proxy_process_header; - - return ngx_http_proxy_process_header(r); -} - - -static ngx_int_t -ngx_http_proxy_process_header(ngx_http_request_t *r) -{ - ngx_int_t rc; - ngx_table_elt_t *h; - ngx_http_upstream_t *u; - ngx_http_proxy_ctx_t *ctx; - ngx_http_upstream_header_t *hh; - ngx_http_upstream_main_conf_t *umcf; - - umcf = ngx_http_get_module_main_conf(r, ngx_http_upstream_module); - - for ( ;; ) { - - rc = ngx_http_parse_header_line(r, &r->upstream->buffer, 1); - - if (rc == NGX_OK) { - - /* a header line has been parsed successfully */ - - h = ngx_list_push(&r->upstream->headers_in.headers); - if (h == NULL) { - return NGX_ERROR; - } - - h->hash = r->header_hash; - - h->key.len = r->header_name_end - r->header_name_start; - h->value.len = r->header_end - r->header_start; - - h->key.data = ngx_pnalloc(r->pool, - h->key.len + 1 + h->value.len + 1 + h->key.len); - if (h->key.data == NULL) { - h->hash = 0; - return NGX_ERROR; - } - - h->value.data = h->key.data + h->key.len + 1; - h->lowcase_key = h->key.data + h->key.len + 1 + h->value.len + 1; - - ngx_memcpy(h->key.data, r->header_name_start, h->key.len); - h->key.data[h->key.len] = '\0'; - ngx_memcpy(h->value.data, r->header_start, h->value.len); - h->value.data[h->value.len] = '\0'; - - if (h->key.len == r->lowcase_index) { - ngx_memcpy(h->lowcase_key, r->lowcase_header, h->key.len); - - } else { - ngx_strlow(h->lowcase_key, h->key.data, h->key.len); - } - - ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "http proxy header: \"%V: %V\"", - &h->key, &h->value); - - if (r->upstream->headers_in.status_n == NGX_HTTP_EARLY_HINTS) { - continue; - } - - hh = ngx_hash_find(&umcf->headers_in_hash, h->hash, - h->lowcase_key, h->key.len); - - if (hh) { - rc = hh->handler(r, h, hh->offset); - - if (rc != NGX_OK) { - return rc; - } - } - - continue; - } - - if (rc == NGX_HTTP_PARSE_HEADER_DONE) { - - /* a whole header has been parsed successfully */ - - ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "http proxy header done"); - - ctx = ngx_http_get_module_ctx(r, ngx_http_proxy_module); - - if (r->upstream->headers_in.status_n == NGX_HTTP_EARLY_HINTS) { - ctx->status.code = 0; - ctx->status.count = 0; - ctx->status.start = NULL; - ctx->status.end = NULL; - - r->upstream->process_header = - ngx_http_proxy_process_status_line; - r->state = 0; - return NGX_HTTP_UPSTREAM_EARLY_HINTS; - } - - /* - * if no "Server" and "Date" in header line, - * then add the special empty headers - */ - - if (r->upstream->headers_in.server == NULL) { - h = ngx_list_push(&r->upstream->headers_in.headers); - if (h == NULL) { - return NGX_ERROR; - } - - h->hash = ngx_hash(ngx_hash(ngx_hash(ngx_hash( - ngx_hash('s', 'e'), 'r'), 'v'), 'e'), 'r'); - - ngx_str_set(&h->key, "Server"); - ngx_str_null(&h->value); - h->lowcase_key = (u_char *) "server"; - h->next = NULL; - } - - if (r->upstream->headers_in.date == NULL) { - h = ngx_list_push(&r->upstream->headers_in.headers); - if (h == NULL) { - return NGX_ERROR; - } - - h->hash = ngx_hash(ngx_hash(ngx_hash('d', 'a'), 't'), 'e'); - - ngx_str_set(&h->key, "Date"); - ngx_str_null(&h->value); - h->lowcase_key = (u_char *) "date"; - h->next = NULL; - } - - /* clear content length if response is chunked */ - - u = r->upstream; - - if (u->headers_in.chunked) { - u->headers_in.content_length_n = -1; - } - - /* - * set u->keepalive if response has no body; this allows to keep - * connections alive in case of r->header_only or X-Accel-Redirect - */ - - if (u->headers_in.status_n == NGX_HTTP_NO_CONTENT - || u->headers_in.status_n == NGX_HTTP_NOT_MODIFIED - || ctx->head - || (!u->headers_in.chunked - && u->headers_in.content_length_n == 0)) - { - u->keepalive = !u->headers_in.connection_close; - } - - if (u->headers_in.status_n == NGX_HTTP_SWITCHING_PROTOCOLS) { - u->keepalive = 0; - - if (r->headers_in.upgrade) { - u->upgrade = 1; - } - } - - return NGX_OK; - } - - if (rc == NGX_AGAIN) { - return NGX_AGAIN; - } - - /* rc == NGX_HTTP_PARSE_INVALID_HEADER */ - - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "upstream sent invalid header: \"%*s\\x%02xd...\"", - r->header_end - r->header_name_start, - r->header_name_start, *r->header_end); - - return NGX_HTTP_UPSTREAM_INVALID_HEADER; - } -} - - -static ngx_int_t -ngx_http_proxy_input_filter_init(void *data) -{ - ngx_http_request_t *r = data; - ngx_http_upstream_t *u; - ngx_http_proxy_ctx_t *ctx; - - u = r->upstream; - ctx = ngx_http_get_module_ctx(r, ngx_http_proxy_module); - - if (ctx == NULL) { - return NGX_ERROR; - } - - ngx_log_debug4(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "http proxy filter init s:%ui h:%d c:%d l:%O", - u->headers_in.status_n, ctx->head, u->headers_in.chunked, - u->headers_in.content_length_n); - - /* as per RFC2616, 4.4 Message Length */ - - if (u->headers_in.status_n == NGX_HTTP_NO_CONTENT - || u->headers_in.status_n == NGX_HTTP_NOT_MODIFIED - || ctx->head) - { - /* 1xx, 204, and 304 and replies to HEAD requests */ - /* no 1xx since we don't send Expect and Upgrade */ - - u->pipe->length = 0; - u->length = 0; - u->keepalive = !u->headers_in.connection_close; - - } else if (u->headers_in.chunked) { - /* chunked */ - - u->pipe->input_filter = ngx_http_proxy_chunked_filter; - u->pipe->length = 5; /* "0" CRLF CRLF */ - - u->input_filter = ngx_http_proxy_non_buffered_chunked_filter; - u->length = 1; - - } else if (u->headers_in.content_length_n == 0) { - /* empty body: special case as filter won't be called */ - - u->pipe->length = 0; - u->length = 0; - u->keepalive = !u->headers_in.connection_close; - - } else { - /* content length or connection close */ - - u->pipe->length = u->headers_in.content_length_n; - u->length = u->headers_in.content_length_n; - } - - return NGX_OK; -} - - -static ngx_int_t -ngx_http_proxy_copy_filter(ngx_event_pipe_t *p, ngx_buf_t *buf) -{ - ngx_buf_t *b; - ngx_chain_t *cl; - ngx_http_request_t *r; - - if (buf->pos == buf->last) { - return NGX_OK; - } - - if (p->upstream_done) { - ngx_log_debug0(NGX_LOG_DEBUG_HTTP, p->log, 0, - "http proxy data after close"); - return NGX_OK; - } - - if (p->length == 0) { - - ngx_log_error(NGX_LOG_WARN, p->log, 0, - "upstream sent more data than specified in " - "\"Content-Length\" header"); - - r = p->input_ctx; - r->upstream->keepalive = 0; - p->upstream_done = 1; - - return NGX_OK; - } - - cl = ngx_chain_get_free_buf(p->pool, &p->free); - if (cl == NULL) { - return NGX_ERROR; - } - - b = cl->buf; - - ngx_memcpy(b, buf, sizeof(ngx_buf_t)); - b->shadow = buf; - b->tag = p->tag; - b->last_shadow = 1; - b->recycled = 1; - buf->shadow = b; - - ngx_log_debug1(NGX_LOG_DEBUG_EVENT, p->log, 0, "input buf #%d", b->num); - - if (p->in) { - *p->last_in = cl; - } else { - p->in = cl; - } - p->last_in = &cl->next; - - if (p->length == -1) { - return NGX_OK; - } - - if (b->last - b->pos > p->length) { - - ngx_log_error(NGX_LOG_WARN, p->log, 0, - "upstream sent more data than specified in " - "\"Content-Length\" header"); - - b->last = b->pos + p->length; - p->upstream_done = 1; - - return NGX_OK; - } - - p->length -= b->last - b->pos; - - if (p->length == 0) { - r = p->input_ctx; - r->upstream->keepalive = !r->upstream->headers_in.connection_close; - } - - return NGX_OK; -} - - -static ngx_int_t -ngx_http_proxy_chunked_filter(ngx_event_pipe_t *p, ngx_buf_t *buf) -{ - ngx_int_t rc; - ngx_buf_t *b, **prev; - ngx_chain_t *cl; - ngx_http_request_t *r; - ngx_http_proxy_ctx_t *ctx; - ngx_http_proxy_loc_conf_t *plcf; - - if (buf->pos == buf->last) { - return NGX_OK; - } - - r = p->input_ctx; - ctx = ngx_http_get_module_ctx(r, ngx_http_proxy_module); - - if (ctx == NULL) { - return NGX_ERROR; - } - - if (p->upstream_done) { - ngx_log_debug0(NGX_LOG_DEBUG_HTTP, p->log, 0, - "http proxy data after close"); - return NGX_OK; - } - - if (p->length == 0) { - - ngx_log_error(NGX_LOG_WARN, p->log, 0, - "upstream sent data after final chunk"); - - r->upstream->keepalive = 0; - p->upstream_done = 1; - - return NGX_OK; - } - - b = NULL; - - if (ctx->trailers) { - rc = ngx_http_proxy_process_trailer(r, buf); - - if (rc == NGX_ERROR) { - return NGX_ERROR; - } - - if (rc == NGX_OK) { - - /* a whole response has been parsed successfully */ - - p->length = 0; - r->upstream->keepalive = !r->upstream->headers_in.connection_close; - - if (buf->pos != buf->last) { - ngx_log_error(NGX_LOG_WARN, p->log, 0, - "upstream sent data after trailers"); - r->upstream->keepalive = 0; - } - } - - goto free_buf; - } - - plcf = ngx_http_get_module_loc_conf(r, ngx_http_proxy_module); - - prev = &buf->shadow; - - for ( ;; ) { - - rc = ngx_http_parse_chunked(r, buf, &ctx->chunked, - plcf->upstream.pass_trailers); - - if (rc == NGX_OK) { - - /* a chunk has been parsed successfully */ - - cl = ngx_chain_get_free_buf(p->pool, &p->free); - if (cl == NULL) { - return NGX_ERROR; - } - - b = cl->buf; - - ngx_memzero(b, sizeof(ngx_buf_t)); - - b->pos = buf->pos; - b->start = buf->start; - b->end = buf->end; - b->tag = p->tag; - b->temporary = 1; - b->recycled = 1; - - *prev = b; - prev = &b->shadow; - - if (p->in) { - *p->last_in = cl; - } else { - p->in = cl; - } - p->last_in = &cl->next; - - /* STUB */ b->num = buf->num; - - ngx_log_debug2(NGX_LOG_DEBUG_EVENT, p->log, 0, - "input buf #%d %p", b->num, b->pos); - - if (buf->last - buf->pos >= ctx->chunked.size) { - - buf->pos += (size_t) ctx->chunked.size; - b->last = buf->pos; - ctx->chunked.size = 0; - - continue; - } - - ctx->chunked.size -= buf->last - buf->pos; - buf->pos = buf->last; - b->last = buf->last; - - continue; - } - - if (rc == NGX_DONE) { - - if (plcf->upstream.pass_trailers) { - rc = ngx_http_proxy_process_trailer(r, buf); - - if (rc == NGX_ERROR) { - return NGX_ERROR; - } - - if (rc == NGX_AGAIN) { - p->length = 1; - break; - } - } - - /* a whole response has been parsed successfully */ - - p->length = 0; - r->upstream->keepalive = !r->upstream->headers_in.connection_close; - - if (buf->pos != buf->last) { - ngx_log_error(NGX_LOG_WARN, p->log, 0, - "upstream sent data after final chunk"); - r->upstream->keepalive = 0; - } - - break; - } - - if (rc == NGX_AGAIN) { - - /* set p->length, minimal amount of data we want to see */ - - p->length = ctx->chunked.length; - - break; - } - - /* invalid response */ - - ngx_log_error(NGX_LOG_ERR, p->log, 0, - "upstream sent invalid chunked response"); - - return NGX_ERROR; - } - -free_buf: - - ngx_log_debug2(NGX_LOG_DEBUG_HTTP, p->log, 0, - "http proxy chunked state %ui, length %O", - ctx->chunked.state, p->length); - - if (b) { - b->shadow = buf; - b->last_shadow = 1; - - ngx_log_debug2(NGX_LOG_DEBUG_EVENT, p->log, 0, - "input buf %p %z", b->pos, b->last - b->pos); - - return NGX_OK; - } - - /* there is no data record in the buf, add it to free chain */ - - if (ngx_event_pipe_add_free_buf(p, buf) != NGX_OK) { - return NGX_ERROR; - } - - return NGX_OK; -} - - -static ngx_int_t -ngx_http_proxy_non_buffered_copy_filter(void *data, ssize_t bytes) -{ - ngx_http_request_t *r = data; - - ngx_buf_t *b; - ngx_chain_t *cl, **ll; - ngx_http_upstream_t *u; - - u = r->upstream; - - if (u->length == 0) { - ngx_log_error(NGX_LOG_WARN, r->connection->log, 0, - "upstream sent more data than specified in " - "\"Content-Length\" header"); - u->keepalive = 0; - return NGX_OK; - } - - for (cl = u->out_bufs, ll = &u->out_bufs; cl; cl = cl->next) { - ll = &cl->next; - } - - cl = ngx_chain_get_free_buf(r->pool, &u->free_bufs); - if (cl == NULL) { - return NGX_ERROR; - } - - *ll = cl; - - cl->buf->flush = 1; - cl->buf->memory = 1; - - b = &u->buffer; - - cl->buf->pos = b->last; - b->last += bytes; - cl->buf->last = b->last; - cl->buf->tag = u->output.tag; - - if (u->length == -1) { - return NGX_OK; - } - - if (bytes > u->length) { - - ngx_log_error(NGX_LOG_WARN, r->connection->log, 0, - "upstream sent more data than specified in " - "\"Content-Length\" header"); - - cl->buf->last = cl->buf->pos + u->length; - u->length = 0; - - return NGX_OK; - } - - u->length -= bytes; - - if (u->length == 0) { - u->keepalive = !u->headers_in.connection_close; - } - - return NGX_OK; -} - - -static ngx_int_t -ngx_http_proxy_non_buffered_chunked_filter(void *data, ssize_t bytes) -{ - ngx_http_request_t *r = data; - - ngx_int_t rc; - ngx_buf_t *b, *buf; - ngx_chain_t *cl, **ll; - ngx_http_upstream_t *u; - ngx_http_proxy_ctx_t *ctx; - ngx_http_proxy_loc_conf_t *plcf; - - plcf = ngx_http_get_module_loc_conf(r, ngx_http_proxy_module); - - ctx = ngx_http_get_module_ctx(r, ngx_http_proxy_module); - - if (ctx == NULL) { - return NGX_ERROR; - } - - u = r->upstream; - buf = &u->buffer; - - buf->pos = buf->last; - buf->last += bytes; - - if (ctx->trailers) { - rc = ngx_http_proxy_process_trailer(r, buf); - - if (rc == NGX_ERROR) { - return NGX_ERROR; - } - - if (rc == NGX_OK) { - - /* a whole response has been parsed successfully */ - - r->upstream->keepalive = !u->headers_in.connection_close; - u->length = 0; - - if (buf->pos != buf->last) { - ngx_log_error(NGX_LOG_WARN, r->connection->log, 0, - "upstream sent data after trailers"); - u->keepalive = 0; - } - } - - return NGX_OK; - } - - for (cl = u->out_bufs, ll = &u->out_bufs; cl; cl = cl->next) { - ll = &cl->next; - } - - for ( ;; ) { - - rc = ngx_http_parse_chunked(r, buf, &ctx->chunked, - plcf->upstream.pass_trailers); - - if (rc == NGX_OK) { - - /* a chunk has been parsed successfully */ - - cl = ngx_chain_get_free_buf(r->pool, &u->free_bufs); - if (cl == NULL) { - return NGX_ERROR; - } - - *ll = cl; - ll = &cl->next; - - b = cl->buf; - - b->flush = 1; - b->memory = 1; - - b->pos = buf->pos; - b->tag = u->output.tag; - - if (buf->last - buf->pos >= ctx->chunked.size) { - buf->pos += (size_t) ctx->chunked.size; - b->last = buf->pos; - ctx->chunked.size = 0; - - } else { - ctx->chunked.size -= buf->last - buf->pos; - buf->pos = buf->last; - b->last = buf->last; - } - - ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "http proxy out buf %p %z", - b->pos, b->last - b->pos); - - continue; - } - - if (rc == NGX_DONE) { - - if (plcf->upstream.pass_trailers) { - rc = ngx_http_proxy_process_trailer(r, buf); - - if (rc == NGX_ERROR) { - return NGX_ERROR; - } - - if (rc == NGX_AGAIN) { - u->length = 1; - break; - } - } - - /* a whole response has been parsed successfully */ - - u->keepalive = !u->headers_in.connection_close; - u->length = 0; - - if (buf->pos != buf->last) { - ngx_log_error(NGX_LOG_WARN, r->connection->log, 0, - "upstream sent data after final chunk"); - u->keepalive = 0; - } - - break; - } - - if (rc == NGX_AGAIN) { - break; - } - - /* invalid response */ - - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "upstream sent invalid chunked response"); - - return NGX_ERROR; - } - - return NGX_OK; -} - - -static ngx_int_t -ngx_http_proxy_process_trailer(ngx_http_request_t *r, ngx_buf_t *buf) -{ - size_t len; - ngx_int_t rc; - ngx_buf_t *b; - ngx_table_elt_t *h; - ngx_http_proxy_ctx_t *ctx; - ngx_http_proxy_loc_conf_t *plcf; - - plcf = ngx_http_get_module_loc_conf(r, ngx_http_proxy_module); - - ctx = ngx_http_get_module_ctx(r, ngx_http_proxy_module); - - if (ctx->trailers == NULL) { - ctx->trailers = ngx_create_temp_buf(r->pool, - plcf->upstream.buffer_size); - if (ctx->trailers == NULL) { - return NGX_ERROR; - } - } - - b = ctx->trailers; - len = ngx_min(buf->last - buf->pos, b->end - b->last); - - b->last = ngx_cpymem(b->last, buf->pos, len); - - for ( ;; ) { - - rc = ngx_http_parse_header_line(r, b, 1); - - if (rc == NGX_OK) { - - /* a header line has been parsed successfully */ - - h = ngx_list_push(&r->upstream->headers_in.trailers); - if (h == NULL) { - return NGX_ERROR; - } - - h->hash = r->header_hash; - - h->key.len = r->header_name_end - r->header_name_start; - h->value.len = r->header_end - r->header_start; - - h->key.data = ngx_pnalloc(r->pool, - h->key.len + 1 + h->value.len + 1 + h->key.len); - if (h->key.data == NULL) { - h->hash = 0; - return NGX_ERROR; - } - - h->value.data = h->key.data + h->key.len + 1; - h->lowcase_key = h->key.data + h->key.len + 1 + h->value.len + 1; - - ngx_memcpy(h->key.data, r->header_name_start, h->key.len); - h->key.data[h->key.len] = '\0'; - ngx_memcpy(h->value.data, r->header_start, h->value.len); - h->value.data[h->value.len] = '\0'; - - if (h->key.len == r->lowcase_index) { - ngx_memcpy(h->lowcase_key, r->lowcase_header, h->key.len); - - } else { - ngx_strlow(h->lowcase_key, h->key.data, h->key.len); - } - - ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "http proxy trailer: \"%V: %V\"", - &h->key, &h->value); - continue; - } - - if (rc == NGX_HTTP_PARSE_HEADER_DONE) { - - /* a whole header has been parsed successfully */ - - buf->pos += len - (b->last - b->pos); - - ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "http proxy trailer done"); - - return NGX_OK; - } - - if (rc == NGX_AGAIN) { - buf->pos += len; - - if (b->last == b->end) { - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "upstream sent too big trailers"); - return NGX_ERROR; - } - - return NGX_AGAIN; - } - - /* rc == NGX_HTTP_PARSE_INVALID_HEADER */ - - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "upstream sent invalid trailer: \"%*s\\x%02xd...\"", - r->header_end - r->header_name_start, - r->header_name_start, *r->header_end); - - return NGX_ERROR; - } -} - - -static void -ngx_http_proxy_abort_request(ngx_http_request_t *r) -{ - ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "abort http proxy request"); - - return; -} - - -static void -ngx_http_proxy_finalize_request(ngx_http_request_t *r, ngx_int_t rc) -{ - ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "finalize http proxy request"); - - return; -} - - -static ngx_int_t -ngx_http_proxy_host_variable(ngx_http_request_t *r, - ngx_http_variable_value_t *v, uintptr_t data) -{ - ngx_http_proxy_ctx_t *ctx; - - ctx = ngx_http_get_module_ctx(r, ngx_http_proxy_module); - - if (ctx == NULL) { - v->not_found = 1; - return NGX_OK; - } - - if (data == 1 && !ctx->legacy) { - v->not_found = 1; - return NGX_OK; - } - - v->len = ctx->vars.host_header.len; - v->valid = 1; - v->no_cacheable = 0; - v->not_found = 0; - v->data = ctx->vars.host_header.data; - - return NGX_OK; -} - - -static ngx_int_t -ngx_http_proxy_port_variable(ngx_http_request_t *r, - ngx_http_variable_value_t *v, uintptr_t data) -{ - ngx_http_proxy_ctx_t *ctx; - - ctx = ngx_http_get_module_ctx(r, ngx_http_proxy_module); - - if (ctx == NULL) { - v->not_found = 1; - return NGX_OK; - } - - v->len = ctx->vars.port.len; - v->valid = 1; - v->no_cacheable = 0; - v->not_found = 0; - v->data = ctx->vars.port.data; - - return NGX_OK; -} - - -static ngx_int_t -ngx_http_proxy_add_x_forwarded_for_variable(ngx_http_request_t *r, - ngx_http_variable_value_t *v, uintptr_t data) -{ - size_t len; - u_char *p; - ngx_table_elt_t *h, *xfwd; - - v->valid = 1; - v->no_cacheable = 0; - v->not_found = 0; - - xfwd = r->headers_in.x_forwarded_for; - - len = 0; - - for (h = xfwd; h; h = h->next) { - len += h->value.len + sizeof(", ") - 1; - } - - if (len == 0) { - v->len = r->connection->addr_text.len; - v->data = r->connection->addr_text.data; - return NGX_OK; - } - - len += r->connection->addr_text.len; - - p = ngx_pnalloc(r->pool, len); - if (p == NULL) { - return NGX_ERROR; - } - - v->len = len; - v->data = p; - - for (h = xfwd; h; h = h->next) { - p = ngx_copy(p, h->value.data, h->value.len); - *p++ = ','; *p++ = ' '; - } - - ngx_memcpy(p, r->connection->addr_text.data, r->connection->addr_text.len); - - return NGX_OK; -} - - -static ngx_int_t -ngx_http_proxy_internal_body_length_variable(ngx_http_request_t *r, - ngx_http_variable_value_t *v, uintptr_t data) -{ - ngx_http_proxy_ctx_t *ctx; - - ctx = ngx_http_get_module_ctx(r, ngx_http_proxy_module); - - if (ctx == NULL || ctx->internal_body_length < 0) { - v->not_found = 1; - return NGX_OK; - } - - v->valid = 1; - v->no_cacheable = 0; - v->not_found = 0; - - v->data = ngx_pnalloc(r->pool, NGX_OFF_T_LEN); - - if (v->data == NULL) { - return NGX_ERROR; - } - - v->len = ngx_sprintf(v->data, "%O", ctx->internal_body_length) - v->data; - - return NGX_OK; -} - - -static ngx_int_t -ngx_http_proxy_internal_chunked_variable(ngx_http_request_t *r, - ngx_http_variable_value_t *v, uintptr_t data) -{ - ngx_http_proxy_ctx_t *ctx; - - ctx = ngx_http_get_module_ctx(r, ngx_http_proxy_module); - - if (ctx == NULL || !ctx->internal_chunked) { - v->not_found = 1; - return NGX_OK; - } - - v->valid = 1; - v->no_cacheable = 0; - v->not_found = 0; - - v->data = (u_char *) "chunked"; - v->len = sizeof("chunked") - 1; - - return NGX_OK; -} - - -ngx_int_t -ngx_http_proxy_rewrite_redirect(ngx_http_request_t *r, ngx_table_elt_t *h, - size_t prefix) -{ - size_t len; - ngx_int_t rc; - ngx_uint_t i; - ngx_http_proxy_rewrite_t *pr; - ngx_http_proxy_loc_conf_t *plcf; - - plcf = ngx_http_get_module_loc_conf(r, ngx_http_proxy_module); - - pr = plcf->redirects->elts; - - if (pr == NULL) { - return NGX_DECLINED; - } - - len = h->value.len - prefix; - - for (i = 0; i < plcf->redirects->nelts; i++) { - rc = pr[i].handler(r, &h->value, prefix, len, &pr[i]); - - if (rc != NGX_DECLINED) { - return rc; - } - } - - return NGX_DECLINED; -} - - -ngx_int_t -ngx_http_proxy_rewrite_cookie(ngx_http_request_t *r, ngx_table_elt_t *h) -{ - u_char *p; - size_t len; - ngx_int_t rc, rv; - ngx_str_t *key, *value; - ngx_uint_t i; - ngx_array_t attrs; - ngx_keyval_t *attr; - ngx_http_proxy_loc_conf_t *plcf; - - if (ngx_array_init(&attrs, r->pool, 2, sizeof(ngx_keyval_t)) != NGX_OK) { - return NGX_ERROR; - } - - if (ngx_http_proxy_parse_cookie(&h->value, &attrs) != NGX_OK) { - return NGX_ERROR; - } - - attr = attrs.elts; - - if (attr[0].value.data == NULL) { - return NGX_DECLINED; - } - - rv = NGX_DECLINED; - - plcf = ngx_http_get_module_loc_conf(r, ngx_http_proxy_module); - - for (i = 1; i < attrs.nelts; i++) { - - key = &attr[i].key; - value = &attr[i].value; - - if (plcf->cookie_domains && key->len == 6 - && ngx_strncasecmp(key->data, (u_char *) "domain", 6) == 0 - && value->data) - { - rc = ngx_http_proxy_rewrite_cookie_value(r, value, - plcf->cookie_domains); - if (rc == NGX_ERROR) { - return NGX_ERROR; - } - - if (rc != NGX_DECLINED) { - rv = rc; - } - } - - if (plcf->cookie_paths && key->len == 4 - && ngx_strncasecmp(key->data, (u_char *) "path", 4) == 0 - && value->data) - { - rc = ngx_http_proxy_rewrite_cookie_value(r, value, - plcf->cookie_paths); - if (rc == NGX_ERROR) { - return NGX_ERROR; - } - - if (rc != NGX_DECLINED) { - rv = rc; - } - } - } - - if (plcf->cookie_flags) { - rc = ngx_http_proxy_rewrite_cookie_flags(r, &attrs, - plcf->cookie_flags); - if (rc == NGX_ERROR) { - return NGX_ERROR; - } - - if (rc != NGX_DECLINED) { - rv = rc; - } - - attr = attrs.elts; - } - - if (rv != NGX_OK) { - return rv; - } - - len = 0; - - for (i = 0; i < attrs.nelts; i++) { - - if (attr[i].key.data == NULL) { - continue; - } - - if (i > 0) { - len += 2; - } - - len += attr[i].key.len; - - if (attr[i].value.data) { - len += 1 + attr[i].value.len; - } - } - - p = ngx_pnalloc(r->pool, len + 1); - if (p == NULL) { - return NGX_ERROR; - } - - h->value.data = p; - h->value.len = len; - - for (i = 0; i < attrs.nelts; i++) { - - if (attr[i].key.data == NULL) { - continue; - } - - if (i > 0) { - *p++ = ';'; - *p++ = ' '; - } - - p = ngx_cpymem(p, attr[i].key.data, attr[i].key.len); - - if (attr[i].value.data) { - *p++ = '='; - p = ngx_cpymem(p, attr[i].value.data, attr[i].value.len); - } - } - - *p = '\0'; - - return NGX_OK; -} - - -static ngx_int_t -ngx_http_proxy_parse_cookie(ngx_str_t *value, ngx_array_t *attrs) -{ - u_char *start, *end, *p, *last; - ngx_str_t name, val; - ngx_keyval_t *attr; - - start = value->data; - end = value->data + value->len; - - for ( ;; ) { - - last = (u_char *) ngx_strchr(start, ';'); - - if (last == NULL) { - last = end; - } - - while (start < last && *start == ' ') { start++; } - - for (p = start; p < last && *p != '='; p++) { /* void */ } - - name.data = start; - name.len = p - start; - - while (name.len && name.data[name.len - 1] == ' ') { - name.len--; - } - - if (p < last) { - - p++; - - while (p < last && *p == ' ') { p++; } - - val.data = p; - val.len = last - val.data; - - while (val.len && val.data[val.len - 1] == ' ') { - val.len--; - } - - } else { - ngx_str_null(&val); - } - - attr = ngx_array_push(attrs); - if (attr == NULL) { - return NGX_ERROR; - } - - attr->key = name; - attr->value = val; - - if (last == end) { - break; - } - - start = last + 1; - } - - return NGX_OK; -} - - -static ngx_int_t -ngx_http_proxy_rewrite_cookie_value(ngx_http_request_t *r, ngx_str_t *value, - ngx_array_t *rewrites) -{ - ngx_int_t rc; - ngx_uint_t i; - ngx_http_proxy_rewrite_t *pr; - - pr = rewrites->elts; - - for (i = 0; i < rewrites->nelts; i++) { - rc = pr[i].handler(r, value, 0, value->len, &pr[i]); - - if (rc != NGX_DECLINED) { - return rc; - } - } - - return NGX_DECLINED; -} - - -static ngx_int_t -ngx_http_proxy_rewrite_cookie_flags(ngx_http_request_t *r, ngx_array_t *attrs, - ngx_array_t *flags) -{ - ngx_str_t pattern, value; -#if (NGX_PCRE) - ngx_int_t rc; -#endif - ngx_uint_t i, m, f, nelts; - ngx_keyval_t *attr; - ngx_conf_bitmask_t *mask; - ngx_http_complex_value_t *flags_values; - ngx_http_proxy_cookie_flags_t *pcf; - - attr = attrs->elts; - pcf = flags->elts; - - for (i = 0; i < flags->nelts; i++) { - -#if (NGX_PCRE) - if (pcf[i].regex) { - rc = ngx_http_regex_exec(r, pcf[i].cookie.regex, &attr[0].key); - - if (rc == NGX_ERROR) { - return NGX_ERROR; - } - - if (rc == NGX_OK) { - break; - } - - /* NGX_DECLINED */ - - continue; - } -#endif - - if (ngx_http_complex_value(r, &pcf[i].cookie.complex, &pattern) - != NGX_OK) - { - return NGX_ERROR; - } - - if (pattern.len == attr[0].key.len - && ngx_strncasecmp(attr[0].key.data, pattern.data, pattern.len) - == 0) - { - break; - } - } - - if (i == flags->nelts) { - return NGX_DECLINED; - } - - nelts = pcf[i].flags_values.nelts; - flags_values = pcf[i].flags_values.elts; - - mask = ngx_http_proxy_cookie_flags_masks; - f = 0; - - for (i = 0; i < nelts; i++) { - - if (ngx_http_complex_value(r, &flags_values[i], &value) != NGX_OK) { - return NGX_ERROR; - } - - if (value.len == 0) { - continue; - } - - for (m = 0; mask[m].name.len != 0; m++) { - - if (mask[m].name.len != value.len - || ngx_strncasecmp(mask[m].name.data, value.data, value.len) - != 0) - { - continue; - } - - f |= mask[m].mask; - - break; - } - - if (mask[m].name.len == 0) { - ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "invalid proxy_cookie_flags flag \"%V\"", &value); - } - } - - if (f == 0) { - return NGX_DECLINED; - } - - return ngx_http_proxy_edit_cookie_flags(r, attrs, f); -} - - -static ngx_int_t -ngx_http_proxy_edit_cookie_flags(ngx_http_request_t *r, ngx_array_t *attrs, - ngx_uint_t flags) -{ - ngx_str_t *key, *value; - ngx_uint_t i; - ngx_keyval_t *attr; - - attr = attrs->elts; - - for (i = 1; i < attrs->nelts; i++) { - key = &attr[i].key; - - if (key->len == 6 - && ngx_strncasecmp(key->data, (u_char *) "secure", 6) == 0) - { - if (flags & NGX_HTTP_PROXY_COOKIE_SECURE_ON) { - flags &= ~NGX_HTTP_PROXY_COOKIE_SECURE_ON; - - } else if (flags & NGX_HTTP_PROXY_COOKIE_SECURE_OFF) { - key->data = NULL; - } - - continue; - } - - if (key->len == 8 - && ngx_strncasecmp(key->data, (u_char *) "httponly", 8) == 0) - { - if (flags & NGX_HTTP_PROXY_COOKIE_HTTPONLY_ON) { - flags &= ~NGX_HTTP_PROXY_COOKIE_HTTPONLY_ON; - - } else if (flags & NGX_HTTP_PROXY_COOKIE_HTTPONLY_OFF) { - key->data = NULL; - } - - continue; - } - - if (key->len == 8 - && ngx_strncasecmp(key->data, (u_char *) "samesite", 8) == 0) - { - value = &attr[i].value; - - if (flags & NGX_HTTP_PROXY_COOKIE_SAMESITE_STRICT) { - flags &= ~NGX_HTTP_PROXY_COOKIE_SAMESITE_STRICT; - - if (value->len != 6 - || ngx_strncasecmp(value->data, (u_char *) "strict", 6) - != 0) - { - ngx_str_set(key, "SameSite"); - ngx_str_set(value, "Strict"); - } - - } else if (flags & NGX_HTTP_PROXY_COOKIE_SAMESITE_LAX) { - flags &= ~NGX_HTTP_PROXY_COOKIE_SAMESITE_LAX; - - if (value->len != 3 - || ngx_strncasecmp(value->data, (u_char *) "lax", 3) != 0) - { - ngx_str_set(key, "SameSite"); - ngx_str_set(value, "Lax"); - } - - } else if (flags & NGX_HTTP_PROXY_COOKIE_SAMESITE_NONE) { - flags &= ~NGX_HTTP_PROXY_COOKIE_SAMESITE_NONE; - - if (value->len != 4 - || ngx_strncasecmp(value->data, (u_char *) "none", 4) != 0) - { - ngx_str_set(key, "SameSite"); - ngx_str_set(value, "None"); - } - - } else if (flags & NGX_HTTP_PROXY_COOKIE_SAMESITE_OFF) { - key->data = NULL; - } - - continue; - } - } - - if (flags & NGX_HTTP_PROXY_COOKIE_SECURE_ON) { - attr = ngx_array_push(attrs); - if (attr == NULL) { - return NGX_ERROR; - } - - ngx_str_set(&attr->key, "Secure"); - ngx_str_null(&attr->value); - } - - if (flags & NGX_HTTP_PROXY_COOKIE_HTTPONLY_ON) { - attr = ngx_array_push(attrs); - if (attr == NULL) { - return NGX_ERROR; - } - - ngx_str_set(&attr->key, "HttpOnly"); - ngx_str_null(&attr->value); - } - - if (flags & (NGX_HTTP_PROXY_COOKIE_SAMESITE_STRICT - |NGX_HTTP_PROXY_COOKIE_SAMESITE_LAX - |NGX_HTTP_PROXY_COOKIE_SAMESITE_NONE)) - { - attr = ngx_array_push(attrs); - if (attr == NULL) { - return NGX_ERROR; - } - - ngx_str_set(&attr->key, "SameSite"); - - if (flags & NGX_HTTP_PROXY_COOKIE_SAMESITE_STRICT) { - ngx_str_set(&attr->value, "Strict"); - - } else if (flags & NGX_HTTP_PROXY_COOKIE_SAMESITE_LAX) { - ngx_str_set(&attr->value, "Lax"); - - } else { - ngx_str_set(&attr->value, "None"); - } - } - - return NGX_OK; -} - - -static ngx_int_t -ngx_http_proxy_rewrite_complex_handler(ngx_http_request_t *r, ngx_str_t *value, - size_t prefix, size_t len, ngx_http_proxy_rewrite_t *pr) -{ - ngx_str_t pattern, replacement; - - if (ngx_http_complex_value(r, &pr->pattern.complex, &pattern) != NGX_OK) { - return NGX_ERROR; - } - - if (pattern.len > len - || ngx_rstrncmp(value->data + prefix, pattern.data, pattern.len) != 0) - { - return NGX_DECLINED; - } - - if (ngx_http_complex_value(r, &pr->replacement, &replacement) != NGX_OK) { - return NGX_ERROR; - } - - return ngx_http_proxy_rewrite(r, value, prefix, pattern.len, &replacement); -} - - -#if (NGX_PCRE) - -static ngx_int_t -ngx_http_proxy_rewrite_regex_handler(ngx_http_request_t *r, ngx_str_t *value, - size_t prefix, size_t len, ngx_http_proxy_rewrite_t *pr) -{ - ngx_str_t pattern, replacement; - - pattern.len = len; - pattern.data = value->data + prefix; - - if (ngx_http_regex_exec(r, pr->pattern.regex, &pattern) != NGX_OK) { - return NGX_DECLINED; - } - - if (ngx_http_complex_value(r, &pr->replacement, &replacement) != NGX_OK) { - return NGX_ERROR; - } - - return ngx_http_proxy_rewrite(r, value, prefix, len, &replacement); -} - -#endif - - -static ngx_int_t -ngx_http_proxy_rewrite_domain_handler(ngx_http_request_t *r, ngx_str_t *value, - size_t prefix, size_t len, ngx_http_proxy_rewrite_t *pr) -{ - u_char *p; - ngx_str_t pattern, replacement; - - if (ngx_http_complex_value(r, &pr->pattern.complex, &pattern) != NGX_OK) { - return NGX_ERROR; - } - - p = value->data + prefix; - - if (len && p[0] == '.') { - p++; - prefix++; - len--; - } - - if (pattern.len != len || ngx_rstrncasecmp(pattern.data, p, len) != 0) { - return NGX_DECLINED; - } - - if (ngx_http_complex_value(r, &pr->replacement, &replacement) != NGX_OK) { - return NGX_ERROR; - } - - return ngx_http_proxy_rewrite(r, value, prefix, len, &replacement); -} - - -static ngx_int_t -ngx_http_proxy_rewrite(ngx_http_request_t *r, ngx_str_t *value, size_t prefix, - size_t len, ngx_str_t *replacement) -{ - u_char *p, *data; - size_t new_len; - - if (len == value->len) { - *value = *replacement; - return NGX_OK; - } - - new_len = replacement->len + value->len - len; - - if (replacement->len > len) { - - data = ngx_pnalloc(r->pool, new_len + 1); - if (data == NULL) { - return NGX_ERROR; - } - - p = ngx_copy(data, value->data, prefix); - p = ngx_copy(p, replacement->data, replacement->len); - - ngx_memcpy(p, value->data + prefix + len, - value->len - len - prefix + 1); - - value->data = data; - - } else { - p = ngx_copy(value->data + prefix, replacement->data, replacement->len); - - ngx_memmove(p, value->data + prefix + len, - value->len - len - prefix + 1); - } - - value->len = new_len; - - return NGX_OK; -} - - -static ngx_int_t -ngx_http_proxy_add_variables(ngx_conf_t *cf) -{ - ngx_http_variable_t *var, *v; - - for (v = ngx_http_proxy_vars; v->name.len; v++) { - var = ngx_http_add_variable(cf, &v->name, v->flags); - if (var == NULL) { - return NGX_ERROR; - } - - var->get_handler = v->get_handler; - var->data = v->data; - } - - return NGX_OK; -} - - -static void * -ngx_http_proxy_create_main_conf(ngx_conf_t *cf) -{ - ngx_http_proxy_main_conf_t *conf; - - conf = ngx_pcalloc(cf->pool, sizeof(ngx_http_proxy_main_conf_t)); - if (conf == NULL) { - return NULL; - } - -#if (NGX_HTTP_CACHE) - if (ngx_array_init(&conf->caches, cf->pool, 4, - sizeof(ngx_http_file_cache_t *)) - != NGX_OK) - { - return NULL; - } -#endif - - return conf; -} - - -static void * -ngx_http_proxy_create_loc_conf(ngx_conf_t *cf) -{ - ngx_http_proxy_loc_conf_t *conf; - - conf = ngx_pcalloc(cf->pool, sizeof(ngx_http_proxy_loc_conf_t)); - if (conf == NULL) { - return NULL; - } - - /* - * set by ngx_pcalloc(): - * - * conf->upstream.bufs.num = 0; - * conf->upstream.ignore_headers = 0; - * conf->upstream.next_upstream = 0; - * conf->upstream.cache_zone = NULL; - * conf->upstream.cache_use_stale = 0; - * conf->upstream.cache_methods = 0; - * conf->upstream.temp_path = NULL; - * conf->upstream.hide_headers_hash = { NULL, 0 }; - * conf->upstream.store_lengths = NULL; - * conf->upstream.store_values = NULL; - * - * conf->location = NULL; - * conf->url = { 0, NULL }; - * conf->headers.lengths = NULL; - * conf->headers.values = NULL; - * conf->headers.hash = { NULL, 0 }; - * conf->headers_cache.lengths = NULL; - * conf->host_set = 0; - * conf->headers_cache.values = NULL; - * conf->headers_cache.hash = { NULL, 0 }; - * conf->body_lengths = NULL; - * conf->body_values = NULL; - * conf->body_source = { 0, NULL }; - * conf->redirects = NULL; - * conf->ssl = 0; - * conf->ssl_protocols = 0; - * conf->ssl_ciphers = { 0, NULL }; - * conf->ssl_trusted_certificate = { 0, NULL }; - * conf->ssl_crl = { 0, NULL }; - */ - - conf->upstream.store = NGX_CONF_UNSET; - conf->upstream.store_access = NGX_CONF_UNSET_UINT; - conf->upstream.next_upstream_tries = NGX_CONF_UNSET_UINT; - conf->upstream.buffering = NGX_CONF_UNSET; - conf->upstream.request_buffering = NGX_CONF_UNSET; - conf->upstream.ignore_client_abort = NGX_CONF_UNSET; - conf->upstream.force_ranges = NGX_CONF_UNSET; - - conf->upstream.local = NGX_CONF_UNSET_PTR; - conf->upstream.socket_keepalive = NGX_CONF_UNSET; - - conf->upstream.connect_timeout = NGX_CONF_UNSET_MSEC; - conf->upstream.send_timeout = NGX_CONF_UNSET_MSEC; - conf->upstream.read_timeout = NGX_CONF_UNSET_MSEC; - conf->upstream.next_upstream_timeout = NGX_CONF_UNSET_MSEC; - - conf->upstream.send_lowat = NGX_CONF_UNSET_SIZE; - conf->upstream.buffer_size = NGX_CONF_UNSET_SIZE; - conf->upstream.limit_rate = NGX_CONF_UNSET_PTR; - - conf->upstream.busy_buffers_size_conf = NGX_CONF_UNSET_SIZE; - conf->upstream.max_temp_file_size_conf = NGX_CONF_UNSET_SIZE; - conf->upstream.temp_file_write_size_conf = NGX_CONF_UNSET_SIZE; - - conf->upstream.pass_request_headers = NGX_CONF_UNSET; - conf->upstream.pass_request_body = NGX_CONF_UNSET; - conf->upstream.pass_trailers = NGX_CONF_UNSET; - -#if (NGX_HTTP_CACHE) - conf->upstream.cache = NGX_CONF_UNSET; - conf->upstream.cache_min_uses = NGX_CONF_UNSET_UINT; - conf->upstream.cache_max_range_offset = NGX_CONF_UNSET; - conf->upstream.cache_bypass = NGX_CONF_UNSET_PTR; - conf->upstream.no_cache = NGX_CONF_UNSET_PTR; - conf->upstream.cache_valid = NGX_CONF_UNSET_PTR; - conf->upstream.cache_lock = NGX_CONF_UNSET; - conf->upstream.cache_lock_timeout = NGX_CONF_UNSET_MSEC; - conf->upstream.cache_lock_age = NGX_CONF_UNSET_MSEC; - conf->upstream.cache_revalidate = NGX_CONF_UNSET; - conf->upstream.cache_convert_head = NGX_CONF_UNSET; - conf->upstream.cache_background_update = NGX_CONF_UNSET; -#endif - - conf->upstream.hide_headers = NGX_CONF_UNSET_PTR; - conf->upstream.pass_headers = NGX_CONF_UNSET_PTR; - - conf->upstream.intercept_errors = NGX_CONF_UNSET; - -#if (NGX_HTTP_SSL) - conf->upstream.ssl_session_reuse = NGX_CONF_UNSET; - conf->upstream.ssl_name = NGX_CONF_UNSET_PTR; - conf->upstream.ssl_server_name = NGX_CONF_UNSET; - conf->upstream.ssl_verify = NGX_CONF_UNSET; - conf->upstream.ssl_certificate = NGX_CONF_UNSET_PTR; - conf->upstream.ssl_certificate_key = NGX_CONF_UNSET_PTR; - conf->upstream.ssl_certificate_cache = NGX_CONF_UNSET_PTR; - conf->upstream.ssl_passwords = NGX_CONF_UNSET_PTR; - conf->ssl_verify_depth = NGX_CONF_UNSET_UINT; - conf->ssl_conf_commands = NGX_CONF_UNSET_PTR; -#endif - - /* the hardcoded values */ - conf->upstream.cyclic_temp_file = 0; - conf->upstream.change_buffering = 1; - conf->upstream.pass_early_hints = 1; - - conf->headers_source = NGX_CONF_UNSET_PTR; - - conf->method = NGX_CONF_UNSET_PTR; - - conf->redirect = NGX_CONF_UNSET; - - conf->cookie_domains = NGX_CONF_UNSET_PTR; - conf->cookie_paths = NGX_CONF_UNSET_PTR; - conf->cookie_flags = NGX_CONF_UNSET_PTR; - - conf->http_version = NGX_CONF_UNSET_UINT; - - conf->headers_hash_max_size = NGX_CONF_UNSET_UINT; - conf->headers_hash_bucket_size = NGX_CONF_UNSET_UINT; - - ngx_str_set(&conf->upstream.module, "proxy"); - - return conf; -} - - -static char * -ngx_http_proxy_merge_loc_conf(ngx_conf_t *cf, void *parent, void *child) -{ - ngx_http_proxy_loc_conf_t *prev = parent; - ngx_http_proxy_loc_conf_t *conf = child; - - u_char *p; - size_t size; - ngx_int_t rc; - ngx_hash_init_t hash; - ngx_http_core_loc_conf_t *clcf; - ngx_http_proxy_rewrite_t *pr; - ngx_http_script_compile_t sc; - -#if (NGX_HTTP_CACHE) - - if (conf->upstream.store > 0) { - conf->upstream.cache = 0; - } - - if (conf->upstream.cache > 0) { - conf->upstream.store = 0; - } - -#endif - - if (conf->upstream.store == NGX_CONF_UNSET) { - ngx_conf_merge_value(conf->upstream.store, - prev->upstream.store, 0); - - conf->upstream.store_lengths = prev->upstream.store_lengths; - conf->upstream.store_values = prev->upstream.store_values; - } - - ngx_conf_merge_uint_value(conf->upstream.store_access, - prev->upstream.store_access, 0600); - - ngx_conf_merge_uint_value(conf->upstream.next_upstream_tries, - prev->upstream.next_upstream_tries, 0); - - ngx_conf_merge_value(conf->upstream.buffering, - prev->upstream.buffering, 1); - - ngx_conf_merge_value(conf->upstream.request_buffering, - prev->upstream.request_buffering, 1); - - ngx_conf_merge_value(conf->upstream.ignore_client_abort, - prev->upstream.ignore_client_abort, 0); - - ngx_conf_merge_value(conf->upstream.force_ranges, - prev->upstream.force_ranges, 0); - - ngx_conf_merge_ptr_value(conf->upstream.local, - prev->upstream.local, NULL); - - ngx_conf_merge_value(conf->upstream.socket_keepalive, - prev->upstream.socket_keepalive, 0); - - ngx_conf_merge_msec_value(conf->upstream.connect_timeout, - prev->upstream.connect_timeout, 60000); - - ngx_conf_merge_msec_value(conf->upstream.send_timeout, - prev->upstream.send_timeout, 60000); - - ngx_conf_merge_msec_value(conf->upstream.read_timeout, - prev->upstream.read_timeout, 60000); - - ngx_conf_merge_msec_value(conf->upstream.next_upstream_timeout, - prev->upstream.next_upstream_timeout, 0); - - ngx_conf_merge_size_value(conf->upstream.send_lowat, - prev->upstream.send_lowat, 0); - - ngx_conf_merge_size_value(conf->upstream.buffer_size, - prev->upstream.buffer_size, - (size_t) ngx_pagesize); - - ngx_conf_merge_ptr_value(conf->upstream.limit_rate, - prev->upstream.limit_rate, NULL); - - ngx_conf_merge_bufs_value(conf->upstream.bufs, prev->upstream.bufs, - 8, ngx_pagesize); - - if (conf->upstream.bufs.num < 2) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "there must be at least 2 \"proxy_buffers\""); - return NGX_CONF_ERROR; - } - - - size = conf->upstream.buffer_size; - if (size < conf->upstream.bufs.size) { - size = conf->upstream.bufs.size; - } - - - ngx_conf_merge_size_value(conf->upstream.busy_buffers_size_conf, - prev->upstream.busy_buffers_size_conf, - NGX_CONF_UNSET_SIZE); - - if (conf->upstream.busy_buffers_size_conf == NGX_CONF_UNSET_SIZE) { - conf->upstream.busy_buffers_size = 2 * size; - } else { - conf->upstream.busy_buffers_size = - conf->upstream.busy_buffers_size_conf; - } - - if (conf->upstream.busy_buffers_size < size) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "\"proxy_busy_buffers_size\" must be equal to or greater than " - "the maximum of the value of \"proxy_buffer_size\" and " - "one of the \"proxy_buffers\""); - - return NGX_CONF_ERROR; - } - - if (conf->upstream.busy_buffers_size - > (conf->upstream.bufs.num - 1) * conf->upstream.bufs.size) - { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "\"proxy_busy_buffers_size\" must be less than " - "the size of all \"proxy_buffers\" minus one buffer"); - - return NGX_CONF_ERROR; - } - - - ngx_conf_merge_size_value(conf->upstream.temp_file_write_size_conf, - prev->upstream.temp_file_write_size_conf, - NGX_CONF_UNSET_SIZE); - - if (conf->upstream.temp_file_write_size_conf == NGX_CONF_UNSET_SIZE) { - conf->upstream.temp_file_write_size = 2 * size; - } else { - conf->upstream.temp_file_write_size = - conf->upstream.temp_file_write_size_conf; - } - - if (conf->upstream.temp_file_write_size < size) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "\"proxy_temp_file_write_size\" must be equal to or greater " - "than the maximum of the value of \"proxy_buffer_size\" and " - "one of the \"proxy_buffers\""); - - return NGX_CONF_ERROR; - } - - ngx_conf_merge_size_value(conf->upstream.max_temp_file_size_conf, - prev->upstream.max_temp_file_size_conf, - NGX_CONF_UNSET_SIZE); - - if (conf->upstream.max_temp_file_size_conf == NGX_CONF_UNSET_SIZE) { - conf->upstream.max_temp_file_size = 1024 * 1024 * 1024; - } else { - conf->upstream.max_temp_file_size = - conf->upstream.max_temp_file_size_conf; - } - - if (conf->upstream.max_temp_file_size != 0 - && conf->upstream.max_temp_file_size < size) - { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "\"proxy_max_temp_file_size\" must be equal to zero to disable " - "temporary files usage or must be equal to or greater than " - "the maximum of the value of \"proxy_buffer_size\" and " - "one of the \"proxy_buffers\""); - - return NGX_CONF_ERROR; - } - - - ngx_conf_merge_bitmask_value(conf->upstream.ignore_headers, - prev->upstream.ignore_headers, - NGX_CONF_BITMASK_SET); - - - ngx_conf_merge_bitmask_value(conf->upstream.next_upstream, - prev->upstream.next_upstream, - (NGX_CONF_BITMASK_SET - |NGX_HTTP_UPSTREAM_FT_ERROR - |NGX_HTTP_UPSTREAM_FT_TIMEOUT)); - - if (conf->upstream.next_upstream & NGX_HTTP_UPSTREAM_FT_OFF) { - conf->upstream.next_upstream = NGX_CONF_BITMASK_SET - |NGX_HTTP_UPSTREAM_FT_OFF; - } - - if (ngx_conf_merge_path_value(cf, &conf->upstream.temp_path, - prev->upstream.temp_path, - &ngx_http_proxy_temp_path) - != NGX_CONF_OK) - { - return NGX_CONF_ERROR; - } - - -#if (NGX_HTTP_CACHE) - - if (conf->upstream.cache == NGX_CONF_UNSET) { - ngx_conf_merge_value(conf->upstream.cache, - prev->upstream.cache, 0); - - conf->upstream.cache_zone = prev->upstream.cache_zone; - conf->upstream.cache_value = prev->upstream.cache_value; - } - - if (conf->upstream.cache_zone && conf->upstream.cache_zone->data == NULL) { - ngx_shm_zone_t *shm_zone; - - shm_zone = conf->upstream.cache_zone; - - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "\"proxy_cache\" zone \"%V\" is unknown", - &shm_zone->shm.name); - - return NGX_CONF_ERROR; - } - - ngx_conf_merge_uint_value(conf->upstream.cache_min_uses, - prev->upstream.cache_min_uses, 1); - - ngx_conf_merge_off_value(conf->upstream.cache_max_range_offset, - prev->upstream.cache_max_range_offset, - NGX_MAX_OFF_T_VALUE); - - ngx_conf_merge_bitmask_value(conf->upstream.cache_use_stale, - prev->upstream.cache_use_stale, - (NGX_CONF_BITMASK_SET - |NGX_HTTP_UPSTREAM_FT_OFF)); - - if (conf->upstream.cache_use_stale & NGX_HTTP_UPSTREAM_FT_OFF) { - conf->upstream.cache_use_stale = NGX_CONF_BITMASK_SET - |NGX_HTTP_UPSTREAM_FT_OFF; - } - - if (conf->upstream.cache_use_stale & NGX_HTTP_UPSTREAM_FT_ERROR) { - conf->upstream.cache_use_stale |= NGX_HTTP_UPSTREAM_FT_NOLIVE; - } - - if (conf->upstream.cache_methods == 0) { - conf->upstream.cache_methods = prev->upstream.cache_methods; - } - - conf->upstream.cache_methods |= NGX_HTTP_GET|NGX_HTTP_HEAD; - - ngx_conf_merge_ptr_value(conf->upstream.cache_bypass, - prev->upstream.cache_bypass, NULL); - - ngx_conf_merge_ptr_value(conf->upstream.no_cache, - prev->upstream.no_cache, NULL); - - ngx_conf_merge_ptr_value(conf->upstream.cache_valid, - prev->upstream.cache_valid, NULL); - - if (conf->cache_key.value.data == NULL) { - conf->cache_key = prev->cache_key; - } - - ngx_conf_merge_value(conf->upstream.cache_lock, - prev->upstream.cache_lock, 0); - - ngx_conf_merge_msec_value(conf->upstream.cache_lock_timeout, - prev->upstream.cache_lock_timeout, 5000); - - ngx_conf_merge_msec_value(conf->upstream.cache_lock_age, - prev->upstream.cache_lock_age, 5000); - - ngx_conf_merge_value(conf->upstream.cache_revalidate, - prev->upstream.cache_revalidate, 0); - - ngx_conf_merge_value(conf->upstream.cache_convert_head, - prev->upstream.cache_convert_head, 1); - - ngx_conf_merge_value(conf->upstream.cache_background_update, - prev->upstream.cache_background_update, 0); - -#endif - - ngx_conf_merge_value(conf->upstream.pass_request_headers, - prev->upstream.pass_request_headers, 1); - ngx_conf_merge_value(conf->upstream.pass_request_body, - prev->upstream.pass_request_body, 1); - - ngx_conf_merge_value(conf->upstream.pass_trailers, - prev->upstream.pass_trailers, 0); - - ngx_conf_merge_value(conf->upstream.intercept_errors, - prev->upstream.intercept_errors, 0); - -#if (NGX_HTTP_SSL) - - if (ngx_http_proxy_merge_ssl(cf, conf, prev) != NGX_OK) { - return NGX_CONF_ERROR; - } - - ngx_conf_merge_value(conf->upstream.ssl_session_reuse, - prev->upstream.ssl_session_reuse, 1); - - ngx_conf_merge_bitmask_value(conf->ssl_protocols, prev->ssl_protocols, - (NGX_CONF_BITMASK_SET|NGX_SSL_DEFAULT_PROTOCOLS)); - - ngx_conf_merge_str_value(conf->ssl_ciphers, prev->ssl_ciphers, - "DEFAULT"); - - ngx_conf_merge_ptr_value(conf->upstream.ssl_name, - prev->upstream.ssl_name, NULL); - ngx_conf_merge_value(conf->upstream.ssl_server_name, - prev->upstream.ssl_server_name, 0); - ngx_conf_merge_value(conf->upstream.ssl_verify, - prev->upstream.ssl_verify, 0); - ngx_conf_merge_uint_value(conf->ssl_verify_depth, - prev->ssl_verify_depth, 1); - ngx_conf_merge_str_value(conf->ssl_trusted_certificate, - prev->ssl_trusted_certificate, ""); - ngx_conf_merge_str_value(conf->ssl_crl, prev->ssl_crl, ""); - - ngx_conf_merge_ptr_value(conf->upstream.ssl_certificate, - prev->upstream.ssl_certificate, NULL); - ngx_conf_merge_ptr_value(conf->upstream.ssl_certificate_key, - prev->upstream.ssl_certificate_key, NULL); - ngx_conf_merge_ptr_value(conf->upstream.ssl_certificate_cache, - prev->upstream.ssl_certificate_cache, NULL); - - if (ngx_http_upstream_merge_ssl_passwords(cf, &conf->upstream, - &prev->upstream) - != NGX_OK) - { - return NGX_CONF_ERROR; - } - - ngx_conf_merge_ptr_value(conf->ssl_conf_commands, - prev->ssl_conf_commands, NULL); - - if (conf->ssl && ngx_http_proxy_set_ssl(cf, conf) != NGX_OK) { - return NGX_CONF_ERROR; - } - -#endif - - ngx_conf_merge_ptr_value(conf->method, prev->method, NULL); - - ngx_conf_merge_value(conf->redirect, prev->redirect, 1); - - if (conf->redirect) { - - if (conf->redirects == NULL) { - conf->redirects = prev->redirects; - } - - if (conf->redirects == NULL && conf->url.data) { - - conf->redirects = ngx_array_create(cf->pool, 1, - sizeof(ngx_http_proxy_rewrite_t)); - if (conf->redirects == NULL) { - return NGX_CONF_ERROR; - } - - pr = ngx_array_push(conf->redirects); - if (pr == NULL) { - return NGX_CONF_ERROR; - } - - ngx_memzero(&pr->pattern.complex, - sizeof(ngx_http_complex_value_t)); - - ngx_memzero(&pr->replacement, sizeof(ngx_http_complex_value_t)); - - pr->handler = ngx_http_proxy_rewrite_complex_handler; - - if (conf->vars.uri.len) { - pr->pattern.complex.value = conf->url; - pr->replacement.value = conf->location; - - } else { - pr->pattern.complex.value.len = conf->url.len - + sizeof("/") - 1; - - p = ngx_pnalloc(cf->pool, pr->pattern.complex.value.len); - if (p == NULL) { - return NGX_CONF_ERROR; - } - - pr->pattern.complex.value.data = p; - - p = ngx_cpymem(p, conf->url.data, conf->url.len); - *p = '/'; - - ngx_str_set(&pr->replacement.value, "/"); - } - } - } - - ngx_conf_merge_ptr_value(conf->cookie_domains, prev->cookie_domains, NULL); - - ngx_conf_merge_ptr_value(conf->cookie_paths, prev->cookie_paths, NULL); - - ngx_conf_merge_ptr_value(conf->cookie_flags, prev->cookie_flags, NULL); - - ngx_conf_merge_uint_value(conf->http_version, prev->http_version, - NGX_HTTP_VERSION_11); - - ngx_conf_merge_uint_value(conf->headers_hash_max_size, - prev->headers_hash_max_size, 512); - - ngx_conf_merge_uint_value(conf->headers_hash_bucket_size, - prev->headers_hash_bucket_size, 64); - - conf->headers_hash_bucket_size = ngx_align(conf->headers_hash_bucket_size, - ngx_cacheline_size); - - hash.max_size = conf->headers_hash_max_size; - hash.bucket_size = conf->headers_hash_bucket_size; - hash.name = "proxy_headers_hash"; - - if (ngx_http_upstream_hide_headers_hash(cf, &conf->upstream, - &prev->upstream, ngx_http_proxy_hide_headers, &hash) - != NGX_OK) - { - return NGX_CONF_ERROR; - } - - clcf = ngx_http_conf_get_module_loc_conf(cf, ngx_http_core_module); - - if (clcf->noname - && conf->upstream.upstream == NULL && conf->proxy_lengths == NULL) - { - conf->upstream.upstream = prev->upstream.upstream; - conf->location = prev->location; - conf->vars = prev->vars; - - conf->proxy_lengths = prev->proxy_lengths; - conf->proxy_values = prev->proxy_values; - -#if (NGX_HTTP_SSL) - conf->ssl = prev->ssl; -#endif - } - - if (clcf->lmt_excpt && clcf->handler == NULL - && (conf->upstream.upstream || conf->proxy_lengths)) - { - clcf->handler = ngx_http_proxy_handler; - } - - if (conf->body_source.data == NULL) { - conf->body_flushes = prev->body_flushes; - conf->body_source = prev->body_source; - conf->body_lengths = prev->body_lengths; - conf->body_values = prev->body_values; - } - - if (conf->body_source.data && conf->body_lengths == NULL) { - - ngx_memzero(&sc, sizeof(ngx_http_script_compile_t)); - - sc.cf = cf; - sc.source = &conf->body_source; - sc.flushes = &conf->body_flushes; - sc.lengths = &conf->body_lengths; - sc.values = &conf->body_values; - sc.complete_lengths = 1; - sc.complete_values = 1; - - if (ngx_http_script_compile(&sc) != NGX_OK) { - return NGX_CONF_ERROR; - } - } - - ngx_conf_merge_ptr_value(conf->headers_source, prev->headers_source, NULL); - - if (conf->headers_source == prev->headers_source) { - conf->headers = prev->headers; -#if (NGX_HTTP_CACHE) - conf->headers_cache = prev->headers_cache; -#endif - conf->host_set = prev->host_set; - } - - rc = ngx_http_proxy_init_headers(cf, conf, &conf->headers, - ngx_http_proxy_headers); - if (rc != NGX_OK) { - return NGX_CONF_ERROR; - } - -#if (NGX_HTTP_CACHE) - - if (conf->upstream.cache) { - rc = ngx_http_proxy_init_headers(cf, conf, &conf->headers_cache, - ngx_http_proxy_cache_headers); - if (rc != NGX_OK) { - return NGX_CONF_ERROR; - } - } - -#endif - - /* - * special handling to preserve conf->headers in the "http" section - * to inherit it to all servers - */ - - if (prev->headers.hash.buckets == NULL - && conf->headers_source == prev->headers_source) - { - prev->headers = conf->headers; -#if (NGX_HTTP_CACHE) - prev->headers_cache = conf->headers_cache; -#endif - prev->host_set = conf->host_set; - } - - return NGX_CONF_OK; -} - - -static ngx_int_t -ngx_http_proxy_init_headers(ngx_conf_t *cf, ngx_http_proxy_loc_conf_t *conf, - ngx_http_proxy_headers_t *headers, ngx_keyval_t *default_headers) -{ - u_char *p; - size_t size; - uintptr_t *code; - ngx_uint_t i; - ngx_array_t headers_names, headers_merged; - ngx_keyval_t *src, *s, *h; - ngx_hash_key_t *hk; - ngx_hash_init_t hash; - ngx_http_script_compile_t sc; - ngx_http_script_copy_code_t *copy; - - if (headers->hash.buckets) { - return NGX_OK; - } - - if (ngx_array_init(&headers_names, cf->temp_pool, 4, sizeof(ngx_hash_key_t)) - != NGX_OK) - { - return NGX_ERROR; - } - - if (ngx_array_init(&headers_merged, cf->temp_pool, 4, sizeof(ngx_keyval_t)) - != NGX_OK) - { - return NGX_ERROR; - } - - headers->lengths = ngx_array_create(cf->pool, 64, 1); - if (headers->lengths == NULL) { - return NGX_ERROR; - } - - headers->values = ngx_array_create(cf->pool, 512, 1); - if (headers->values == NULL) { - return NGX_ERROR; - } - - if (conf->headers_source) { - - src = conf->headers_source->elts; - for (i = 0; i < conf->headers_source->nelts; i++) { - - if (src[i].key.len == 4 - && ngx_strncasecmp(src[i].key.data, (u_char *) "Host", 4) == 0) - { - conf->host_set = 1; - } - - s = ngx_array_push(&headers_merged); - if (s == NULL) { - return NGX_ERROR; - } - - *s = src[i]; - } - } - - h = default_headers; - - while (h->key.len) { - - src = headers_merged.elts; - for (i = 0; i < headers_merged.nelts; i++) { - if (ngx_strcasecmp(h->key.data, src[i].key.data) == 0) { - goto next; - } - } - - s = ngx_array_push(&headers_merged); - if (s == NULL) { - return NGX_ERROR; - } - - *s = *h; - - next: - - h++; - } - - - src = headers_merged.elts; - for (i = 0; i < headers_merged.nelts; i++) { - - hk = ngx_array_push(&headers_names); - if (hk == NULL) { - return NGX_ERROR; - } - - hk->key = src[i].key; - hk->key_hash = ngx_hash_key_lc(src[i].key.data, src[i].key.len); - hk->value = (void *) 1; - - if (src[i].value.len == 0) { - continue; - } - - copy = ngx_array_push_n(headers->lengths, - sizeof(ngx_http_script_copy_code_t)); - if (copy == NULL) { - return NGX_ERROR; - } - - copy->code = (ngx_http_script_code_pt) (void *) - ngx_http_script_copy_len_code; - copy->len = src[i].key.len; - - size = (sizeof(ngx_http_script_copy_code_t) - + src[i].key.len + sizeof(uintptr_t) - 1) - & ~(sizeof(uintptr_t) - 1); - - copy = ngx_array_push_n(headers->values, size); - if (copy == NULL) { - return NGX_ERROR; - } - - copy->code = ngx_http_script_copy_code; - copy->len = src[i].key.len; - - p = (u_char *) copy + sizeof(ngx_http_script_copy_code_t); - ngx_memcpy(p, src[i].key.data, src[i].key.len); - - ngx_memzero(&sc, sizeof(ngx_http_script_compile_t)); - - sc.cf = cf; - sc.source = &src[i].value; - sc.flushes = &headers->flushes; - sc.lengths = &headers->lengths; - sc.values = &headers->values; - - if (ngx_http_script_compile(&sc) != NGX_OK) { - return NGX_ERROR; - } - - code = ngx_array_push_n(headers->lengths, sizeof(uintptr_t)); - if (code == NULL) { - return NGX_ERROR; - } - - *code = (uintptr_t) NULL; - - code = ngx_array_push_n(headers->values, sizeof(uintptr_t)); - if (code == NULL) { - return NGX_ERROR; - } - - *code = (uintptr_t) NULL; - } - - code = ngx_array_push_n(headers->lengths, sizeof(uintptr_t)); - if (code == NULL) { - return NGX_ERROR; - } - - *code = (uintptr_t) NULL; - - - hash.hash = &headers->hash; - hash.key = ngx_hash_key_lc; - hash.max_size = conf->headers_hash_max_size; - hash.bucket_size = conf->headers_hash_bucket_size; - hash.name = "proxy_headers_hash"; - hash.pool = cf->pool; - hash.temp_pool = NULL; - - return ngx_hash_init(&hash, headers_names.elts, headers_names.nelts); -} - - -static char * -ngx_http_proxy_pass(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) -{ - ngx_http_proxy_loc_conf_t *plcf = conf; - - size_t add; - u_short port; - ngx_str_t *value, *url; - ngx_url_t u; - ngx_uint_t n; - ngx_http_core_loc_conf_t *clcf; - ngx_http_script_compile_t sc; - - if (plcf->upstream.upstream || plcf->proxy_lengths) { - return "is duplicate"; - } - - clcf = ngx_http_conf_get_module_loc_conf(cf, ngx_http_core_module); - - clcf->handler = ngx_http_proxy_handler; - - if (clcf->name.len && clcf->name.data[clcf->name.len - 1] == '/') { - clcf->auto_redirect = 1; - } - - value = cf->args->elts; - - url = &value[1]; - - n = ngx_http_script_variables_count(url); - - if (n) { - - ngx_memzero(&sc, sizeof(ngx_http_script_compile_t)); - - sc.cf = cf; - sc.source = url; - sc.lengths = &plcf->proxy_lengths; - sc.values = &plcf->proxy_values; - sc.variables = n; - sc.complete_lengths = 1; - sc.complete_values = 1; - - if (ngx_http_script_compile(&sc) != NGX_OK) { - return NGX_CONF_ERROR; - } - -#if (NGX_HTTP_SSL) - plcf->ssl = 1; -#endif - - return NGX_CONF_OK; - } - - if (ngx_strncasecmp(url->data, (u_char *) "http://", 7) == 0) { - add = 7; - port = 80; - - } else if (ngx_strncasecmp(url->data, (u_char *) "https://", 8) == 0) { - -#if (NGX_HTTP_SSL) - plcf->ssl = 1; - - add = 8; - port = 443; -#else - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "https protocol requires SSL support"); - return NGX_CONF_ERROR; -#endif - - } else { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, "invalid URL prefix"); - return NGX_CONF_ERROR; - } - - ngx_memzero(&u, sizeof(ngx_url_t)); - - u.url.len = url->len - add; - u.url.data = url->data + add; - u.default_port = port; - u.uri_part = 1; - u.no_resolve = 1; - - plcf->upstream.upstream = ngx_http_upstream_add(cf, &u, 0); - if (plcf->upstream.upstream == NULL) { - return NGX_CONF_ERROR; - } - - plcf->vars.schema.len = add; - plcf->vars.schema.data = url->data; - plcf->vars.key_start = plcf->vars.schema; - - ngx_http_proxy_set_vars(&u, &plcf->vars); - - plcf->location = clcf->name; - - if (clcf->named -#if (NGX_PCRE) - || clcf->regex -#endif - || clcf->noname) - { - if (plcf->vars.uri.len) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "\"proxy_pass\" cannot have URI part in " - "location given by regular expression, " - "or inside named location, " - "or inside \"if\" statement, " - "or inside \"limit_except\" block"); - return NGX_CONF_ERROR; - } - - plcf->location.len = 0; - } - - plcf->url = *url; - - return NGX_CONF_OK; -} - - -static char * -ngx_http_proxy_redirect(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) -{ - ngx_http_proxy_loc_conf_t *plcf = conf; - - u_char *p; - ngx_str_t *value; - ngx_http_proxy_rewrite_t *pr; - ngx_http_compile_complex_value_t ccv; - - if (plcf->redirect == 0) { - return "is duplicate"; - } - - plcf->redirect = 1; - - value = cf->args->elts; - - if (cf->args->nelts == 2) { - if (ngx_strcmp(value[1].data, "off") == 0) { - - if (plcf->redirects) { - return "is duplicate"; - } - - plcf->redirect = 0; - return NGX_CONF_OK; - } - - if (ngx_strcmp(value[1].data, "default") != 0) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "invalid parameter \"%V\"", &value[1]); - return NGX_CONF_ERROR; - } - } - - if (plcf->redirects == NULL) { - plcf->redirects = ngx_array_create(cf->pool, 1, - sizeof(ngx_http_proxy_rewrite_t)); - if (plcf->redirects == NULL) { - return NGX_CONF_ERROR; - } - } - - pr = ngx_array_push(plcf->redirects); - if (pr == NULL) { - return NGX_CONF_ERROR; - } - - if (cf->args->nelts == 2 - && ngx_strcmp(value[1].data, "default") == 0) - { - if (plcf->proxy_lengths) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "\"proxy_redirect default\" cannot be used " - "with \"proxy_pass\" directive with variables"); - return NGX_CONF_ERROR; - } - - if (plcf->url.data == NULL) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "\"proxy_redirect default\" should be placed " - "after the \"proxy_pass\" directive"); - return NGX_CONF_ERROR; - } - - pr->handler = ngx_http_proxy_rewrite_complex_handler; - - ngx_memzero(&pr->pattern.complex, sizeof(ngx_http_complex_value_t)); - - ngx_memzero(&pr->replacement, sizeof(ngx_http_complex_value_t)); - - if (plcf->vars.uri.len) { - pr->pattern.complex.value = plcf->url; - pr->replacement.value = plcf->location; - - } else { - pr->pattern.complex.value.len = plcf->url.len + sizeof("/") - 1; - - p = ngx_pnalloc(cf->pool, pr->pattern.complex.value.len); - if (p == NULL) { - return NGX_CONF_ERROR; - } - - pr->pattern.complex.value.data = p; - - p = ngx_cpymem(p, plcf->url.data, plcf->url.len); - *p = '/'; - - ngx_str_set(&pr->replacement.value, "/"); - } - - return NGX_CONF_OK; - } - - - if (value[1].data[0] == '~') { - value[1].len--; - value[1].data++; - - if (value[1].data[0] == '*') { - value[1].len--; - value[1].data++; - - if (ngx_http_proxy_rewrite_regex(cf, pr, &value[1], 1) != NGX_OK) { - return NGX_CONF_ERROR; - } - - } else { - if (ngx_http_proxy_rewrite_regex(cf, pr, &value[1], 0) != NGX_OK) { - return NGX_CONF_ERROR; - } - } - - } else { - - ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t)); - - ccv.cf = cf; - ccv.value = &value[1]; - ccv.complex_value = &pr->pattern.complex; - - if (ngx_http_compile_complex_value(&ccv) != NGX_OK) { - return NGX_CONF_ERROR; - } - - pr->handler = ngx_http_proxy_rewrite_complex_handler; - } - - - ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t)); - - ccv.cf = cf; - ccv.value = &value[2]; - ccv.complex_value = &pr->replacement; - - if (ngx_http_compile_complex_value(&ccv) != NGX_OK) { - return NGX_CONF_ERROR; - } - - return NGX_CONF_OK; -} - - -static char * -ngx_http_proxy_cookie_domain(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) -{ - ngx_http_proxy_loc_conf_t *plcf = conf; - - ngx_str_t *value; - ngx_http_proxy_rewrite_t *pr; - ngx_http_compile_complex_value_t ccv; - - if (plcf->cookie_domains == NULL) { - return "is duplicate"; - } - - value = cf->args->elts; - - if (cf->args->nelts == 2) { - - if (ngx_strcmp(value[1].data, "off") == 0) { - - if (plcf->cookie_domains != NGX_CONF_UNSET_PTR) { - return "is duplicate"; - } - - plcf->cookie_domains = NULL; - return NGX_CONF_OK; - } - - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "invalid parameter \"%V\"", &value[1]); - return NGX_CONF_ERROR; - } - - if (plcf->cookie_domains == NGX_CONF_UNSET_PTR) { - plcf->cookie_domains = ngx_array_create(cf->pool, 1, - sizeof(ngx_http_proxy_rewrite_t)); - if (plcf->cookie_domains == NULL) { - return NGX_CONF_ERROR; - } - } - - pr = ngx_array_push(plcf->cookie_domains); - if (pr == NULL) { - return NGX_CONF_ERROR; - } - - if (value[1].data[0] == '~') { - value[1].len--; - value[1].data++; - - if (ngx_http_proxy_rewrite_regex(cf, pr, &value[1], 1) != NGX_OK) { - return NGX_CONF_ERROR; - } - - } else { - - if (value[1].data[0] == '.') { - value[1].len--; - value[1].data++; - } - - ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t)); - - ccv.cf = cf; - ccv.value = &value[1]; - ccv.complex_value = &pr->pattern.complex; - - if (ngx_http_compile_complex_value(&ccv) != NGX_OK) { - return NGX_CONF_ERROR; - } - - pr->handler = ngx_http_proxy_rewrite_domain_handler; - - if (value[2].data[0] == '.') { - value[2].len--; - value[2].data++; - } - } - - ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t)); - - ccv.cf = cf; - ccv.value = &value[2]; - ccv.complex_value = &pr->replacement; - - if (ngx_http_compile_complex_value(&ccv) != NGX_OK) { - return NGX_CONF_ERROR; - } - - return NGX_CONF_OK; -} - - -static char * -ngx_http_proxy_cookie_path(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) -{ - ngx_http_proxy_loc_conf_t *plcf = conf; - - ngx_str_t *value; - ngx_http_proxy_rewrite_t *pr; - ngx_http_compile_complex_value_t ccv; - - if (plcf->cookie_paths == NULL) { - return "is duplicate"; - } - - value = cf->args->elts; - - if (cf->args->nelts == 2) { - - if (ngx_strcmp(value[1].data, "off") == 0) { - - if (plcf->cookie_paths != NGX_CONF_UNSET_PTR) { - return "is duplicate"; - } - - plcf->cookie_paths = NULL; - return NGX_CONF_OK; - } - - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "invalid parameter \"%V\"", &value[1]); - return NGX_CONF_ERROR; - } - - if (plcf->cookie_paths == NGX_CONF_UNSET_PTR) { - plcf->cookie_paths = ngx_array_create(cf->pool, 1, - sizeof(ngx_http_proxy_rewrite_t)); - if (plcf->cookie_paths == NULL) { - return NGX_CONF_ERROR; - } - } - - pr = ngx_array_push(plcf->cookie_paths); - if (pr == NULL) { - return NGX_CONF_ERROR; - } - - if (value[1].data[0] == '~') { - value[1].len--; - value[1].data++; - - if (value[1].data[0] == '*') { - value[1].len--; - value[1].data++; - - if (ngx_http_proxy_rewrite_regex(cf, pr, &value[1], 1) != NGX_OK) { - return NGX_CONF_ERROR; - } - - } else { - if (ngx_http_proxy_rewrite_regex(cf, pr, &value[1], 0) != NGX_OK) { - return NGX_CONF_ERROR; - } - } - - } else { - - ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t)); - - ccv.cf = cf; - ccv.value = &value[1]; - ccv.complex_value = &pr->pattern.complex; - - if (ngx_http_compile_complex_value(&ccv) != NGX_OK) { - return NGX_CONF_ERROR; - } - - pr->handler = ngx_http_proxy_rewrite_complex_handler; - } - - ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t)); - - ccv.cf = cf; - ccv.value = &value[2]; - ccv.complex_value = &pr->replacement; - - if (ngx_http_compile_complex_value(&ccv) != NGX_OK) { - return NGX_CONF_ERROR; - } - - return NGX_CONF_OK; -} - - -static char * -ngx_http_proxy_cookie_flags(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) -{ - ngx_http_proxy_loc_conf_t *plcf = conf; - - ngx_str_t *value; - ngx_uint_t i; - ngx_http_complex_value_t *cv; - ngx_http_proxy_cookie_flags_t *pcf; - ngx_http_compile_complex_value_t ccv; -#if (NGX_PCRE) - ngx_regex_compile_t rc; - u_char errstr[NGX_MAX_CONF_ERRSTR]; -#endif - - if (plcf->cookie_flags == NULL) { - return "is duplicate"; - } - - value = cf->args->elts; - - if (cf->args->nelts == 2) { - - if (ngx_strcmp(value[1].data, "off") == 0) { - - if (plcf->cookie_flags != NGX_CONF_UNSET_PTR) { - return "is duplicate"; - } - - plcf->cookie_flags = NULL; - return NGX_CONF_OK; - } - - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "invalid parameter \"%V\"", &value[1]); - return NGX_CONF_ERROR; - } - - if (plcf->cookie_flags == NGX_CONF_UNSET_PTR) { - plcf->cookie_flags = ngx_array_create(cf->pool, 1, - sizeof(ngx_http_proxy_cookie_flags_t)); - if (plcf->cookie_flags == NULL) { - return NGX_CONF_ERROR; - } - } - - pcf = ngx_array_push(plcf->cookie_flags); - if (pcf == NULL) { - return NGX_CONF_ERROR; - } - - pcf->regex = 0; - - if (value[1].data[0] == '~') { - value[1].len--; - value[1].data++; - -#if (NGX_PCRE) - ngx_memzero(&rc, sizeof(ngx_regex_compile_t)); - - rc.pattern = value[1]; - rc.err.len = NGX_MAX_CONF_ERRSTR; - rc.err.data = errstr; - rc.options = NGX_REGEX_CASELESS; - - pcf->cookie.regex = ngx_http_regex_compile(cf, &rc); - if (pcf->cookie.regex == NULL) { - return NGX_CONF_ERROR; - } - - pcf->regex = 1; -#else - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "using regex \"%V\" requires PCRE library", - &value[1]); - return NGX_CONF_ERROR; -#endif - - } else { - - ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t)); - - ccv.cf = cf; - ccv.value = &value[1]; - ccv.complex_value = &pcf->cookie.complex; - - if (ngx_http_compile_complex_value(&ccv) != NGX_OK) { - return NGX_CONF_ERROR; - } - } - - if (ngx_array_init(&pcf->flags_values, cf->pool, cf->args->nelts - 2, - sizeof(ngx_http_complex_value_t)) - != NGX_OK) - { - return NGX_CONF_ERROR; - } - - for (i = 2; i < cf->args->nelts; i++) { - - cv = ngx_array_push(&pcf->flags_values); - if (cv == NULL) { - return NGX_CONF_ERROR; - } - - ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t)); - - ccv.cf = cf; - ccv.value = &value[i]; - ccv.complex_value = cv; - - if (ngx_http_compile_complex_value(&ccv) != NGX_OK) { - return NGX_CONF_ERROR; - } - } - - return NGX_CONF_OK; -} - - -static ngx_int_t -ngx_http_proxy_rewrite_regex(ngx_conf_t *cf, ngx_http_proxy_rewrite_t *pr, - ngx_str_t *regex, ngx_uint_t caseless) -{ -#if (NGX_PCRE) - u_char errstr[NGX_MAX_CONF_ERRSTR]; - ngx_regex_compile_t rc; - - ngx_memzero(&rc, sizeof(ngx_regex_compile_t)); - - rc.pattern = *regex; - rc.err.len = NGX_MAX_CONF_ERRSTR; - rc.err.data = errstr; - - if (caseless) { - rc.options = NGX_REGEX_CASELESS; - } - - pr->pattern.regex = ngx_http_regex_compile(cf, &rc); - if (pr->pattern.regex == NULL) { - return NGX_ERROR; - } - - pr->handler = ngx_http_proxy_rewrite_regex_handler; - - return NGX_OK; - -#else - - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "using regex \"%V\" requires PCRE library", regex); - return NGX_ERROR; - -#endif -} - - -static char * -ngx_http_proxy_store(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) -{ - ngx_http_proxy_loc_conf_t *plcf = conf; - - ngx_str_t *value; - ngx_http_script_compile_t sc; - - if (plcf->upstream.store != NGX_CONF_UNSET) { - return "is duplicate"; - } - - value = cf->args->elts; - - if (ngx_strcmp(value[1].data, "off") == 0) { - plcf->upstream.store = 0; - return NGX_CONF_OK; - } - - if (value[1].len == 0) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, "empty path"); - return NGX_CONF_ERROR; - } - -#if (NGX_HTTP_CACHE) - if (plcf->upstream.cache > 0) { - return "is incompatible with \"proxy_cache\""; - } -#endif - - plcf->upstream.store = 1; - - if (ngx_strcmp(value[1].data, "on") == 0) { - return NGX_CONF_OK; - } - - /* include the terminating '\0' into script */ - value[1].len++; - - ngx_memzero(&sc, sizeof(ngx_http_script_compile_t)); - - sc.cf = cf; - sc.source = &value[1]; - sc.lengths = &plcf->upstream.store_lengths; - sc.values = &plcf->upstream.store_values; - sc.variables = ngx_http_script_variables_count(&value[1]); - sc.complete_lengths = 1; - sc.complete_values = 1; - - if (ngx_http_script_compile(&sc) != NGX_OK) { - return NGX_CONF_ERROR; - } - - return NGX_CONF_OK; -} - - -#if (NGX_HTTP_CACHE) - -static char * -ngx_http_proxy_cache(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) -{ - ngx_http_proxy_loc_conf_t *plcf = conf; - - ngx_str_t *value; - ngx_http_complex_value_t cv; - ngx_http_compile_complex_value_t ccv; - - value = cf->args->elts; - - if (plcf->upstream.cache != NGX_CONF_UNSET) { - return "is duplicate"; - } - - if (ngx_strcmp(value[1].data, "off") == 0) { - plcf->upstream.cache = 0; - return NGX_CONF_OK; - } - - if (plcf->upstream.store > 0) { - return "is incompatible with \"proxy_store\""; - } - - plcf->upstream.cache = 1; - - ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t)); - - ccv.cf = cf; - ccv.value = &value[1]; - ccv.complex_value = &cv; - - if (ngx_http_compile_complex_value(&ccv) != NGX_OK) { - return NGX_CONF_ERROR; - } - - if (cv.lengths != NULL) { - - plcf->upstream.cache_value = ngx_palloc(cf->pool, - sizeof(ngx_http_complex_value_t)); - if (plcf->upstream.cache_value == NULL) { - return NGX_CONF_ERROR; - } - - *plcf->upstream.cache_value = cv; - - return NGX_CONF_OK; - } - - plcf->upstream.cache_zone = ngx_shared_memory_add(cf, &value[1], 0, - &ngx_http_proxy_module); - if (plcf->upstream.cache_zone == NULL) { - return NGX_CONF_ERROR; - } - - return NGX_CONF_OK; -} - - -static char * -ngx_http_proxy_cache_key(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) -{ - ngx_http_proxy_loc_conf_t *plcf = conf; - - ngx_str_t *value; - ngx_http_compile_complex_value_t ccv; - - value = cf->args->elts; - - if (plcf->cache_key.value.data) { - return "is duplicate"; - } - - ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t)); - - ccv.cf = cf; - ccv.value = &value[1]; - ccv.complex_value = &plcf->cache_key; - - if (ngx_http_compile_complex_value(&ccv) != NGX_OK) { - return NGX_CONF_ERROR; - } - - return NGX_CONF_OK; -} - -#endif - - -#if (NGX_HTTP_SSL) - -static char * -ngx_http_proxy_ssl_certificate_cache(ngx_conf_t *cf, ngx_command_t *cmd, - void *conf) -{ - ngx_http_proxy_loc_conf_t *plcf = conf; - - time_t inactive, valid; - ngx_str_t *value, s; - ngx_int_t max; - ngx_uint_t i; - - if (plcf->upstream.ssl_certificate_cache != NGX_CONF_UNSET_PTR) { - return "is duplicate"; - } - - value = cf->args->elts; - - max = 0; - inactive = 10; - valid = 60; - - for (i = 1; i < cf->args->nelts; i++) { - - if (ngx_strncmp(value[i].data, "max=", 4) == 0) { - - max = ngx_atoi(value[i].data + 4, value[i].len - 4); - if (max <= 0) { - goto failed; - } - - continue; - } - - if (ngx_strncmp(value[i].data, "inactive=", 9) == 0) { - - s.len = value[i].len - 9; - s.data = value[i].data + 9; - - inactive = ngx_parse_time(&s, 1); - if (inactive == (time_t) NGX_ERROR) { - goto failed; - } - - continue; - } - - if (ngx_strncmp(value[i].data, "valid=", 6) == 0) { - - s.len = value[i].len - 6; - s.data = value[i].data + 6; - - valid = ngx_parse_time(&s, 1); - if (valid == (time_t) NGX_ERROR) { - goto failed; - } - - continue; - } - - if (ngx_strcmp(value[i].data, "off") == 0) { - - plcf->upstream.ssl_certificate_cache = NULL; - - continue; - } - - failed: - - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "invalid parameter \"%V\"", &value[i]); - return NGX_CONF_ERROR; - } - - if (plcf->upstream.ssl_certificate_cache == NULL) { - return NGX_CONF_OK; - } - - if (max == 0) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "\"proxy_ssl_certificate_cache\" must have " - "the \"max\" parameter"); - return NGX_CONF_ERROR; - } - - plcf->upstream.ssl_certificate_cache = ngx_ssl_cache_init(cf->pool, max, - valid, inactive); - if (plcf->upstream.ssl_certificate_cache == NULL) { - return NGX_CONF_ERROR; - } - - return NGX_CONF_OK; -} - - -static char * -ngx_http_proxy_ssl_password_file(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) -{ - ngx_http_proxy_loc_conf_t *plcf = conf; - - ngx_str_t *value; - - if (plcf->upstream.ssl_passwords != NGX_CONF_UNSET_PTR) { - return "is duplicate"; - } - - value = cf->args->elts; - - plcf->upstream.ssl_passwords = ngx_ssl_read_password_file(cf, &value[1]); - - if (plcf->upstream.ssl_passwords == NULL) { - return NGX_CONF_ERROR; - } - - return NGX_CONF_OK; -} - -#endif - - -static char * -ngx_http_proxy_lowat_check(ngx_conf_t *cf, void *post, void *data) -{ -#if (NGX_FREEBSD) - ssize_t *np = data; - - if ((u_long) *np >= ngx_freebsd_net_inet_tcp_sendspace) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "\"proxy_send_lowat\" must be less than %d " - "(sysctl net.inet.tcp.sendspace)", - ngx_freebsd_net_inet_tcp_sendspace); - - return NGX_CONF_ERROR; - } - -#elif !(NGX_HAVE_SO_SNDLOWAT) - ssize_t *np = data; - - ngx_conf_log_error(NGX_LOG_WARN, cf, 0, - "\"proxy_send_lowat\" is not supported, ignored"); - - *np = 0; - -#endif - - return NGX_CONF_OK; -} - - -#if (NGX_HTTP_SSL) - -static char * -ngx_http_proxy_ssl_conf_command_check(ngx_conf_t *cf, void *post, void *data) -{ -#ifndef SSL_CONF_FLAG_FILE - return "is not supported on this platform"; -#else - return NGX_CONF_OK; -#endif -} - - -static ngx_int_t -ngx_http_proxy_merge_ssl(ngx_conf_t *cf, ngx_http_proxy_loc_conf_t *conf, - ngx_http_proxy_loc_conf_t *prev) -{ - ngx_uint_t preserve; - - if (conf->ssl_protocols == 0 - && conf->ssl_ciphers.data == NULL - && conf->upstream.ssl_certificate == NGX_CONF_UNSET_PTR - && conf->upstream.ssl_certificate_key == NGX_CONF_UNSET_PTR - && conf->upstream.ssl_passwords == NGX_CONF_UNSET_PTR - && conf->upstream.ssl_verify == NGX_CONF_UNSET - && conf->ssl_verify_depth == NGX_CONF_UNSET_UINT - && conf->ssl_trusted_certificate.data == NULL - && conf->ssl_crl.data == NULL - && conf->upstream.ssl_session_reuse == NGX_CONF_UNSET - && conf->ssl_conf_commands == NGX_CONF_UNSET_PTR) - { - if (prev->upstream.ssl) { - conf->upstream.ssl = prev->upstream.ssl; - return NGX_OK; - } - - preserve = 1; - - } else { - preserve = 0; - } - - conf->upstream.ssl = ngx_pcalloc(cf->pool, sizeof(ngx_ssl_t)); - if (conf->upstream.ssl == NULL) { - return NGX_ERROR; - } - - conf->upstream.ssl->log = cf->log; - - /* - * special handling to preserve conf->upstream.ssl - * in the "http" section to inherit it to all servers - */ - - if (preserve) { - prev->upstream.ssl = conf->upstream.ssl; - } - - return NGX_OK; -} - - -static ngx_int_t -ngx_http_proxy_set_ssl(ngx_conf_t *cf, ngx_http_proxy_loc_conf_t *plcf) -{ - ngx_pool_cleanup_t *cln; - - if (plcf->upstream.ssl->ctx) { - return NGX_OK; - } - - if (ngx_ssl_create(plcf->upstream.ssl, plcf->ssl_protocols, NULL) - != NGX_OK) - { - return NGX_ERROR; - } - - cln = ngx_pool_cleanup_add(cf->pool, 0); - if (cln == NULL) { - ngx_ssl_cleanup_ctx(plcf->upstream.ssl); - return NGX_ERROR; - } - - cln->handler = ngx_ssl_cleanup_ctx; - cln->data = plcf->upstream.ssl; - - if (ngx_ssl_ciphers(cf, plcf->upstream.ssl, &plcf->ssl_ciphers, 0) - != NGX_OK) - { - return NGX_ERROR; - } - - if (plcf->upstream.ssl_certificate - && plcf->upstream.ssl_certificate->value.len) - { - if (plcf->upstream.ssl_certificate_key == NULL) { - ngx_log_error(NGX_LOG_EMERG, cf->log, 0, - "no \"proxy_ssl_certificate_key\" is defined " - "for certificate \"%V\"", - &plcf->upstream.ssl_certificate->value); - return NGX_ERROR; - } - - if (plcf->upstream.ssl_certificate->lengths == NULL - && plcf->upstream.ssl_certificate_key->lengths == NULL) - { - if (ngx_ssl_certificate(cf, plcf->upstream.ssl, - &plcf->upstream.ssl_certificate->value, - &plcf->upstream.ssl_certificate_key->value, - plcf->upstream.ssl_passwords) - != NGX_OK) - { - return NGX_ERROR; - } - } - } - - if (plcf->upstream.ssl_verify) { - if (plcf->ssl_trusted_certificate.len == 0) { - ngx_log_error(NGX_LOG_EMERG, cf->log, 0, - "no proxy_ssl_trusted_certificate for proxy_ssl_verify"); - return NGX_ERROR; - } - - if (ngx_ssl_trusted_certificate(cf, plcf->upstream.ssl, - &plcf->ssl_trusted_certificate, - plcf->ssl_verify_depth) - != NGX_OK) - { - return NGX_ERROR; - } - - if (ngx_ssl_crl(cf, plcf->upstream.ssl, &plcf->ssl_crl) != NGX_OK) { - return NGX_ERROR; - } - } - - if (ngx_ssl_client_session_cache(cf, plcf->upstream.ssl, - plcf->upstream.ssl_session_reuse) - != NGX_OK) - { - return NGX_ERROR; - } - - if (ngx_ssl_conf_commands(cf, plcf->upstream.ssl, plcf->ssl_conf_commands) - != NGX_OK) - { - return NGX_ERROR; - } - - return NGX_OK; -} - -#endif - - -static void -ngx_http_proxy_set_vars(ngx_url_t *u, ngx_http_proxy_vars_t *v) -{ - if (u->family != AF_UNIX) { - - if (u->no_port || u->port == u->default_port) { - - v->host_header = u->host; - - if (u->default_port == 80) { - ngx_str_set(&v->port, "80"); - - } else { - ngx_str_set(&v->port, "443"); - } - - } else { - v->host_header.len = u->host.len + 1 + u->port_text.len; - v->host_header.data = u->host.data; - v->port = u->port_text; - } - - v->key_start.len += v->host_header.len; - - } else { - ngx_str_set(&v->host_header, "localhost"); - ngx_str_null(&v->port); - v->key_start.len += sizeof("unix:") - 1 + u->host.len + 1; - } - - v->uri = u->uri; -} diff --git a/src/deps/src/nginx-1.30.3/src/http/modules/ngx_http_proxy_module.h b/src/deps/src/nginx-1.30.3/src/http/modules/ngx_http_proxy_module.h deleted file mode 100644 index a0f79bc13c..0000000000 --- a/src/deps/src/nginx-1.30.3/src/http/modules/ngx_http_proxy_module.h +++ /dev/null @@ -1,127 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#ifndef _NGX_HTTP_PROXY_H_INCLUDED_ -#define _NGX_HTTP_PROXY_H_INCLUDED_ - - -#include -#include -#include - - -typedef struct { - ngx_array_t caches; /* ngx_http_file_cache_t * */ -} ngx_http_proxy_main_conf_t; - - -typedef struct { - ngx_str_t key_start; - ngx_str_t schema; - ngx_str_t host_header; - ngx_str_t port; - ngx_str_t uri; -} ngx_http_proxy_vars_t; - - -typedef struct { - ngx_array_t *flushes; - ngx_array_t *lengths; - ngx_array_t *values; - ngx_hash_t hash; -} ngx_http_proxy_headers_t; - - -typedef struct { - ngx_http_upstream_conf_t upstream; - - ngx_array_t *body_flushes; - ngx_array_t *body_lengths; - ngx_array_t *body_values; - ngx_str_t body_source; - - ngx_http_proxy_headers_t headers; -#if (NGX_HTTP_CACHE) - ngx_http_proxy_headers_t headers_cache; -#endif - ngx_array_t *headers_source; - ngx_uint_t host_set; - - ngx_array_t *proxy_lengths; - ngx_array_t *proxy_values; - - ngx_array_t *redirects; - ngx_array_t *cookie_domains; - ngx_array_t *cookie_paths; - ngx_array_t *cookie_flags; - - ngx_http_complex_value_t *method; - ngx_str_t location; - ngx_str_t url; - -#if (NGX_HTTP_CACHE) - ngx_http_complex_value_t cache_key; -#endif - - ngx_http_proxy_vars_t vars; - - ngx_flag_t redirect; - - ngx_uint_t http_version; - - ngx_uint_t headers_hash_max_size; - ngx_uint_t headers_hash_bucket_size; - -#if (NGX_HTTP_SSL || NGX_COMPAT) - ngx_uint_t ssl; - ngx_uint_t ssl_protocols; - ngx_str_t ssl_ciphers; - ngx_uint_t ssl_verify_depth; - ngx_str_t ssl_trusted_certificate; - ngx_str_t ssl_crl; - ngx_array_t *ssl_conf_commands; -#endif -} ngx_http_proxy_loc_conf_t; - - -typedef struct { - ngx_http_status_t status; - ngx_http_chunked_t chunked; - ngx_http_proxy_vars_t vars; - off_t internal_body_length; - - ngx_chain_t *free; - ngx_chain_t *busy; - - ngx_buf_t *trailers; - - unsigned head:1; - unsigned internal_chunked:1; - unsigned header_sent:1; - unsigned legacy:1; -} ngx_http_proxy_ctx_t; - - -ngx_int_t ngx_http_proxy_eval(ngx_http_request_t *r, ngx_http_proxy_ctx_t *ctx, - ngx_http_proxy_loc_conf_t *plcf); -#if (NGX_HTTP_CACHE) -ngx_int_t ngx_http_proxy_create_key(ngx_http_request_t *r); -#endif -ngx_int_t ngx_http_proxy_rewrite_redirect(ngx_http_request_t *r, - ngx_table_elt_t *h, size_t prefix); -ngx_int_t ngx_http_proxy_rewrite_cookie(ngx_http_request_t *r, - ngx_table_elt_t *h); - -#if (NGX_HTTP_V2) -ngx_int_t ngx_http_proxy_v2_handler(ngx_http_request_t *r); -#endif - - -extern ngx_module_t ngx_http_proxy_module; - - -#endif /* _NGX_HTTP_PROXY_H_INCLUDED_ */ diff --git a/src/deps/src/nginx-1.30.3/src/http/modules/ngx_http_proxy_v2_module.c b/src/deps/src/nginx-1.30.3/src/http/modules/ngx_http_proxy_v2_module.c deleted file mode 100644 index 010c02a864..0000000000 --- a/src/deps/src/nginx-1.30.3/src/http/modules/ngx_http_proxy_v2_module.c +++ /dev/null @@ -1,4210 +0,0 @@ - -/* - * Copyright (C) Maxim Dounin - * Copyright (C) Nginx, Inc. - */ - - -#include -#include -#include -#include - - -typedef enum { - ngx_http_proxy_v2_st_start = 0, - ngx_http_proxy_v2_st_length_2, - ngx_http_proxy_v2_st_length_3, - ngx_http_proxy_v2_st_type, - ngx_http_proxy_v2_st_flags, - ngx_http_proxy_v2_st_stream_id, - ngx_http_proxy_v2_st_stream_id_2, - ngx_http_proxy_v2_st_stream_id_3, - ngx_http_proxy_v2_st_stream_id_4, - ngx_http_proxy_v2_st_payload, - ngx_http_proxy_v2_st_padding -} ngx_http_proxy_v2_state_e; - - -typedef struct { - size_t init_window; - size_t send_window; - size_t recv_window; - ngx_uint_t last_stream_id; -} ngx_http_proxy_v2_conn_t; - - -typedef struct { - ngx_http_proxy_ctx_t ctx; - - ngx_http_proxy_v2_state_e state; - ngx_uint_t frame_state; - ngx_uint_t fragment_state; - - ngx_chain_t *in; - ngx_chain_t *out; - ngx_chain_t *free; - ngx_chain_t *busy; - - ngx_http_proxy_v2_conn_t *connection; - - ngx_uint_t id; - - ngx_uint_t pings; - ngx_uint_t settings; - - off_t length; - - ssize_t send_window; - size_t recv_window; - - size_t rest; - ngx_uint_t stream_id; - u_char type; - u_char flags; - u_char padding; - - ngx_uint_t error; - ngx_uint_t window_update; - - ngx_uint_t setting_id; - ngx_uint_t setting_value; - - u_char ping_data[8]; - - ngx_uint_t index; - ngx_str_t name; - ngx_str_t value; - - u_char *field_end; - size_t field_length; - size_t field_rest; - u_char field_state; - - unsigned literal:1; - unsigned field_huffman:1; - - unsigned header_sent:1; - unsigned output_closed:1; - unsigned output_blocked:1; - unsigned parsing_headers:1; - unsigned end_stream:1; - unsigned done:1; - unsigned status:1; - unsigned rst:1; - unsigned goaway:1; -} ngx_http_proxy_v2_ctx_t; - - -typedef struct { - u_char length_0; - u_char length_1; - u_char length_2; - u_char type; - u_char flags; - u_char stream_id_0; - u_char stream_id_1; - u_char stream_id_2; - u_char stream_id_3; -} ngx_http_proxy_v2_frame_t; - - -static ngx_int_t ngx_http_proxy_v2_create_request(ngx_http_request_t *r); -static ngx_int_t ngx_http_proxy_v2_reinit_request(ngx_http_request_t *r); -static ngx_int_t ngx_http_proxy_v2_body_output_filter(void *data, - ngx_chain_t *in); -static ngx_int_t ngx_http_proxy_v2_process_header(ngx_http_request_t *r); -static ngx_int_t ngx_http_proxy_v2_filter_init(void *data); -static ngx_int_t ngx_http_proxy_v2_non_buffered_filter(void *data, - ssize_t bytes); -static ngx_int_t ngx_http_proxy_v2_body_filter(ngx_event_pipe_t *p, - ngx_buf_t *buf); -static ngx_int_t ngx_http_proxy_v2_process_control_frame(ngx_http_request_t *r, - ngx_http_proxy_v2_ctx_t *ctx, ngx_buf_t *b); -static ngx_int_t ngx_http_proxy_v2_skip_frame(ngx_http_proxy_v2_ctx_t *ctx, - ngx_buf_t *b); -static ngx_int_t ngx_http_proxy_v2_process_frames(ngx_http_request_t *r, - ngx_http_proxy_v2_ctx_t *ctx, ngx_buf_t *b); - -static ngx_int_t ngx_http_proxy_v2_parse_frame(ngx_http_request_t *r, - ngx_http_proxy_v2_ctx_t *ctx, ngx_buf_t *b); -static ngx_int_t ngx_http_proxy_v2_parse_header(ngx_http_request_t *r, - ngx_http_proxy_v2_ctx_t *ctx, ngx_buf_t *b); -static ngx_int_t ngx_http_proxy_v2_parse_fragment(ngx_http_request_t *r, - ngx_http_proxy_v2_ctx_t *ctx, ngx_buf_t *b); -static ngx_int_t ngx_http_proxy_v2_validate_header_name(ngx_http_request_t *r, - ngx_str_t *s); -static ngx_int_t ngx_http_proxy_v2_validate_header_value(ngx_http_request_t *r, - ngx_str_t *s); -static ngx_int_t ngx_http_proxy_v2_parse_rst_stream(ngx_http_request_t *r, - ngx_http_proxy_v2_ctx_t *ctx, ngx_buf_t *b); -static ngx_int_t ngx_http_proxy_v2_parse_goaway(ngx_http_request_t *r, - ngx_http_proxy_v2_ctx_t *ctx, ngx_buf_t *b); -static ngx_int_t ngx_http_proxy_v2_parse_window_update(ngx_http_request_t *r, - ngx_http_proxy_v2_ctx_t *ctx, ngx_buf_t *b); -static ngx_int_t ngx_http_proxy_v2_parse_settings(ngx_http_request_t *r, - ngx_http_proxy_v2_ctx_t *ctx, ngx_buf_t *b); -static ngx_int_t ngx_http_proxy_v2_parse_ping(ngx_http_request_t *r, - ngx_http_proxy_v2_ctx_t *ctx, ngx_buf_t *b); - -static ngx_int_t ngx_http_proxy_v2_send_settings_ack(ngx_http_request_t *r, - ngx_http_proxy_v2_ctx_t *ctx); -static ngx_int_t ngx_http_proxy_v2_send_ping_ack(ngx_http_request_t *r, - ngx_http_proxy_v2_ctx_t *ctx); -static ngx_int_t ngx_http_proxy_v2_send_window_update(ngx_http_request_t *r, - ngx_http_proxy_v2_ctx_t *ctx); - -static ngx_chain_t *ngx_http_proxy_v2_get_buf(ngx_http_request_t *r, - ngx_http_proxy_v2_ctx_t *ctx); -static ngx_http_proxy_v2_ctx_t * - ngx_http_proxy_v2_get_ctx(ngx_http_request_t *r); -static ngx_int_t ngx_http_proxy_v2_get_connection_data(ngx_http_request_t *r, - ngx_http_proxy_v2_ctx_t *ctx, ngx_peer_connection_t *pc); -static void ngx_http_proxy_v2_cleanup(void *data); - -static void ngx_http_proxy_v2_abort_request(ngx_http_request_t *r); -static void ngx_http_proxy_v2_finalize_request(ngx_http_request_t *r, - ngx_int_t rc); - - -static ngx_http_module_t ngx_http_proxy_v2_module_ctx = { - NULL, /* preconfiguration */ - NULL, /* postconfiguration */ - - NULL, /* create main configuration */ - NULL, /* init main configuration */ - - NULL, /* create server configuration */ - NULL, /* merge server configuration */ - - NULL, /* create location configuration */ - NULL /* merge location configuration */ -}; - - -ngx_module_t ngx_http_proxy_v2_module = { - NGX_MODULE_V1, - &ngx_http_proxy_v2_module_ctx, /* module context */ - NULL, /* module directives */ - NGX_HTTP_MODULE, /* module type */ - NULL, /* init master */ - NULL, /* init module */ - NULL, /* init process */ - NULL, /* init thread */ - NULL, /* exit thread */ - NULL, /* exit process */ - NULL, /* exit master */ - NGX_MODULE_V1_PADDING -}; - - -static u_char ngx_http_proxy_v2_connection_start[] = - "PRI * HTTP/2.0\r\n\r\nSM\r\n\r\n" /* connection preface */ - - "\x00\x00\x12\x04\x00\x00\x00\x00\x00" /* settings frame */ - "\x00\x01\x00\x00\x00\x00" /* header table size */ - "\x00\x02\x00\x00\x00\x00" /* disable push */ - "\x00\x04\x7f\xff\xff\xff" /* initial window */ - - "\x00\x00\x04\x08\x00\x00\x00\x00\x00" /* window update frame */ - "\x7f\xff\x00\x00"; - - -ngx_int_t -ngx_http_proxy_v2_handler(ngx_http_request_t *r) -{ - ngx_int_t rc; - ngx_http_upstream_t *u; - ngx_http_proxy_v2_ctx_t *ctx; - ngx_http_proxy_loc_conf_t *plcf; -#if (NGX_HTTP_CACHE) - ngx_http_proxy_main_conf_t *pmcf; -#endif - - if (ngx_http_upstream_create(r) != NGX_OK) { - return NGX_HTTP_INTERNAL_SERVER_ERROR; - } - - ctx = ngx_pcalloc(r->pool, sizeof(ngx_http_proxy_v2_ctx_t)); - if (ctx == NULL) { - return NGX_HTTP_INTERNAL_SERVER_ERROR; - } - - ngx_http_set_ctx(r, ctx, ngx_http_proxy_v2_module); - - ngx_http_set_ctx(r, &ctx->ctx, ngx_http_proxy_module); - - plcf = ngx_http_get_module_loc_conf(r, ngx_http_proxy_module); - - plcf->upstream.preserve_output = 1; - - u = r->upstream; - - if (plcf->proxy_lengths == NULL) { - ctx->ctx.vars = plcf->vars; - u->schema = plcf->vars.schema; -#if (NGX_HTTP_SSL) - u->ssl = plcf->ssl; -#endif - - } else { - if (ngx_http_proxy_eval(r, &ctx->ctx, plcf) != NGX_OK) { - return NGX_HTTP_INTERNAL_SERVER_ERROR; - } - } - -#if (NGX_HTTP_SSL) - ngx_str_set(&u->ssl_alpn_protocol, NGX_HTTP_V2_ALPN_PROTO); -#endif - - u->output.tag = (ngx_buf_tag_t) &ngx_http_proxy_v2_module; - - u->conf = &plcf->upstream; - -#if (NGX_HTTP_CACHE) - pmcf = ngx_http_get_module_main_conf(r, ngx_http_proxy_module); - - u->caches = &pmcf->caches; - u->create_key = ngx_http_proxy_create_key; -#endif - - u->create_request = ngx_http_proxy_v2_create_request; - u->reinit_request = ngx_http_proxy_v2_reinit_request; - u->process_header = ngx_http_proxy_v2_process_header; - u->abort_request = ngx_http_proxy_v2_abort_request; - u->finalize_request = ngx_http_proxy_v2_finalize_request; - - if (plcf->redirects) { - u->rewrite_redirect = ngx_http_proxy_rewrite_redirect; - } - - if (plcf->cookie_domains || plcf->cookie_paths || plcf->cookie_flags) { - u->rewrite_cookie = ngx_http_proxy_rewrite_cookie; - } - - u->buffering = plcf->upstream.buffering; - - u->pipe = ngx_pcalloc(r->pool, sizeof(ngx_event_pipe_t)); - if (u->pipe == NULL) { - return NGX_HTTP_INTERNAL_SERVER_ERROR; - } - - u->pipe->input_filter = ngx_http_proxy_v2_body_filter; - u->pipe->input_ctx = r; - - u->input_filter_init = ngx_http_proxy_v2_filter_init; - u->input_filter = ngx_http_proxy_v2_non_buffered_filter; - u->input_filter_ctx = r; - - u->accel = 1; - - if (!plcf->upstream.request_buffering - && plcf->body_values == NULL && plcf->upstream.pass_request_body) - { - r->request_body_no_buffering = 1; - } - - rc = ngx_http_read_client_request_body(r, ngx_http_upstream_init); - - if (rc >= NGX_HTTP_SPECIAL_RESPONSE) { - return rc; - } - - return NGX_DONE; -} - - -static ngx_int_t -ngx_http_proxy_v2_create_request(ngx_http_request_t *r) -{ - u_char *p, *tmp, *key_tmp, *val_tmp, *headers_frame; - size_t len, tmp_len, key_len, val_len, uri_len, - loc_len, body_len; - uintptr_t escape; - ngx_buf_t *b; - ngx_str_t method, *host; - ngx_uint_t i, next, unparsed_uri; - ngx_chain_t *cl, *body; - ngx_list_part_t *part; - ngx_table_elt_t *header; - ngx_http_upstream_t *u; - ngx_http_proxy_v2_ctx_t *ctx; - ngx_http_script_code_pt code; - ngx_http_script_engine_t e, le; - ngx_http_proxy_headers_t *headers; - ngx_http_proxy_v2_frame_t *f; - ngx_http_proxy_loc_conf_t *plcf; - ngx_http_script_len_code_pt lcode; - - u = r->upstream; - - plcf = ngx_http_get_module_loc_conf(r, ngx_http_proxy_module); - -#if (NGX_HTTP_CACHE) - headers = u->cacheable ? &plcf->headers_cache : &plcf->headers; -#else - headers = &plcf->headers; -#endif - - if (u->method.len) { - /* HEAD was changed to GET to cache response */ - method = u->method; - - } else if (plcf->method) { - if (ngx_http_complex_value(r, plcf->method, &method) != NGX_OK) { - return NGX_ERROR; - } - - } else { - method = r->method_name; - } - - ctx = ngx_http_get_module_ctx(r, ngx_http_proxy_v2_module); - - if (method.len == 4 - && ngx_strncasecmp(method.data, (u_char *) "HEAD", 4) == 0) - { - ctx->ctx.head = 1; - } - - len = sizeof(ngx_http_proxy_v2_connection_start) - 1 - + sizeof(ngx_http_proxy_v2_frame_t); /* headers frame */ - - /* :method header */ - - if ((method.len == 3 && ngx_strncmp(method.data, "GET", 3) == 0) - || (method.len == 4 && ngx_strncmp(method.data, "POST", 4) == 0)) - { - len += 1; - tmp_len = 0; - - } else { - if (method.len > NGX_HTTP_V2_MAX_FIELD) { - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "too long http2 method: \"%V\"", &method); - return NGX_ERROR; - } - - len += 1 + NGX_HTTP_V2_INT_OCTETS + method.len; - tmp_len = method.len; - } - - /* :scheme header */ - - len += 1; - - /* :path header */ - - escape = 0; - loc_len = 0; - unparsed_uri = 0; - - if (plcf->proxy_lengths && ctx->ctx.vars.uri.len) { - uri_len = ctx->ctx.vars.uri.len; - - } else if (ctx->ctx.vars.uri.len == 0 && r->valid_unparsed_uri) { - unparsed_uri = 1; - uri_len = r->unparsed_uri.len; - - } else { - loc_len = (r->valid_location && ctx->ctx.vars.uri.len) - ? ngx_min(plcf->location.len, r->uri.len) : 0; - - if (r->quoted_uri || r->internal) { - escape = 2 * ngx_escape_uri(NULL, r->uri.data + loc_len, - r->uri.len - loc_len, NGX_ESCAPE_URI); - } - - uri_len = ctx->ctx.vars.uri.len + r->uri.len - loc_len + escape - + sizeof("?") - 1 + r->args.len; - } - - if (uri_len == 0) { - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "zero length URI to proxy"); - return NGX_ERROR; - } - - if (uri_len > NGX_HTTP_V2_MAX_FIELD) { - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "too long http2 URI"); - return NGX_ERROR; - } - - len += 1 + NGX_HTTP_V2_INT_OCTETS + uri_len; - - if (tmp_len < uri_len) { - tmp_len = uri_len; - } - - /* :authority header */ - - host = &ctx->ctx.vars.host_header; - - if (!plcf->host_set) { - if (host->len > NGX_HTTP_V2_MAX_FIELD) { - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "too long http2 host: \"%V\"", host); - return NGX_ERROR; - } - - len += 1 + NGX_HTTP_V2_INT_OCTETS + host->len; - - if (tmp_len < host->len) { - tmp_len = host->len; - } - } - - /* other headers */ - - ngx_memzero(&le, sizeof(ngx_http_script_engine_t)); - - ngx_http_script_flush_no_cacheable_variables(r, plcf->body_flushes); - ngx_http_script_flush_no_cacheable_variables(r, headers->flushes); - - body_len = 0; - - if (plcf->body_lengths) { - le.ip = plcf->body_lengths->elts; - le.request = r; - le.flushed = 1; - - while (*(uintptr_t *) le.ip) { - lcode = *(ngx_http_script_len_code_pt *) le.ip; - body_len += lcode(&le); - } - - ctx->ctx.internal_body_length = body_len; - - } else if (r->headers_in.chunked && r->reading_body) { - ctx->ctx.internal_body_length = -1; - - } else { - ctx->ctx.internal_body_length = r->headers_in.content_length_n; - } - - le.ip = headers->lengths->elts; - le.request = r; - le.flushed = 1; - - while (*(uintptr_t *) le.ip) { - - lcode = *(ngx_http_script_len_code_pt *) le.ip; - key_len = lcode(&le); - - for (val_len = 0; *(uintptr_t *) le.ip; val_len += lcode(&le)) { - lcode = *(ngx_http_script_len_code_pt *) le.ip; - } - le.ip += sizeof(uintptr_t); - - if (val_len == 0) { - continue; - } - - if (key_len > NGX_HTTP_V2_MAX_FIELD) { - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "too long http2 header name"); - return NGX_ERROR; - } - - if (val_len > NGX_HTTP_V2_MAX_FIELD) { - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "too long http2 header value"); - return NGX_ERROR; - } - - len += 1 + NGX_HTTP_V2_INT_OCTETS + key_len - + NGX_HTTP_V2_INT_OCTETS + val_len; - - if (tmp_len < key_len) { - tmp_len = key_len; - } - - if (tmp_len < val_len) { - tmp_len = val_len; - } - } - - if (plcf->upstream.pass_request_headers) { - part = &r->headers_in.headers.part; - header = part->elts; - - for (i = 0; /* void */; i++) { - - if (i >= part->nelts) { - if (part->next == NULL) { - break; - } - - part = part->next; - header = part->elts; - i = 0; - } - - if (ngx_hash_find(&headers->hash, header[i].hash, - header[i].lowcase_key, header[i].key.len)) - { - continue; - } - - if (header[i].key.len > NGX_HTTP_V2_MAX_FIELD) { - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "too long http2 header name: \"%V\"", - &header[i].key); - return NGX_ERROR; - } - - if (header[i].value.len > NGX_HTTP_V2_MAX_FIELD) { - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "too long http2 header value: \"%V: %V\"", - &header[i].key, &header[i].value); - return NGX_ERROR; - } - - len += 1 + NGX_HTTP_V2_INT_OCTETS + header[i].key.len - + NGX_HTTP_V2_INT_OCTETS + header[i].value.len; - - if (tmp_len < header[i].key.len) { - tmp_len = header[i].key.len; - } - - if (tmp_len < header[i].value.len) { - tmp_len = header[i].value.len; - } - } - } - - /* continuation frames */ - - len += sizeof(ngx_http_proxy_v2_frame_t) - * (len / NGX_HTTP_V2_DEFAULT_FRAME_SIZE); - - - b = ngx_create_temp_buf(r->pool, len); - if (b == NULL) { - return NGX_ERROR; - } - - cl = ngx_alloc_chain_link(r->pool); - if (cl == NULL) { - return NGX_ERROR; - } - - cl->buf = b; - cl->next = NULL; - - tmp = ngx_palloc(r->pool, tmp_len * 3); - if (tmp == NULL) { - return NGX_ERROR; - } - - key_tmp = tmp + tmp_len; - val_tmp = tmp + 2 * tmp_len; - - /* connection preface */ - - b->last = ngx_copy(b->last, ngx_http_proxy_v2_connection_start, - sizeof(ngx_http_proxy_v2_connection_start) - 1); - - /* headers frame */ - - headers_frame = b->last; - - f = (ngx_http_proxy_v2_frame_t *) b->last; - b->last += sizeof(ngx_http_proxy_v2_frame_t); - - f->length_0 = 0; - f->length_1 = 0; - f->length_2 = 0; - f->type = NGX_HTTP_V2_HEADERS_FRAME; - f->flags = 0; - f->stream_id_0 = 0; - f->stream_id_1 = 0; - f->stream_id_2 = 0; - f->stream_id_3 = 1; - - if (method.len == 3 && ngx_strncmp(method.data, "GET", 3) == 0) { - *b->last++ = ngx_http_v2_indexed(NGX_HTTP_V2_METHOD_GET_INDEX); - - ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "http proxy header: \":method: GET\""); - - } else if (method.len == 4 && ngx_strncmp(method.data, "POST", 4) == 0) { - *b->last++ = ngx_http_v2_indexed(NGX_HTTP_V2_METHOD_POST_INDEX); - - ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "http proxy header: \":method: POST\""); - - } else { - *b->last++ = ngx_http_v2_inc_indexed(NGX_HTTP_V2_METHOD_INDEX); - b->last = ngx_http_v2_write_value(b->last, method.data, - method.len, tmp); - - ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "http proxy header: \":method: %V\"", &method); - } - -#if (NGX_HTTP_SSL) - if (u->ssl) { - *b->last++ = ngx_http_v2_indexed(NGX_HTTP_V2_SCHEME_HTTPS_INDEX); - - ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "http proxy header: \":scheme: https\""); - } else -#endif - { - *b->last++ = ngx_http_v2_indexed(NGX_HTTP_V2_SCHEME_HTTP_INDEX); - - ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "http proxy header: \":scheme: http\""); - } - - if (plcf->proxy_lengths && ctx->ctx.vars.uri.len) { - - *b->last++ = ngx_http_v2_inc_indexed(NGX_HTTP_V2_PATH_INDEX); - b->last = ngx_http_v2_write_value(b->last, ctx->ctx.vars.uri.data, - ctx->ctx.vars.uri.len, tmp); - - ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "http proxy header: \":path: %V\"", &ctx->ctx.vars.uri); - - } else if (unparsed_uri) { - - if (r->unparsed_uri.len == 1 && r->unparsed_uri.data[0] == '/') { - *b->last++ = ngx_http_v2_indexed(NGX_HTTP_V2_PATH_ROOT_INDEX); - - } else { - *b->last++ = ngx_http_v2_inc_indexed(NGX_HTTP_V2_PATH_INDEX); - b->last = ngx_http_v2_write_value(b->last, r->unparsed_uri.data, - r->unparsed_uri.len, tmp); - } - - ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "http proxy header: \":path: %V\"", &r->unparsed_uri); - - } else { - p = val_tmp; - - if (r->valid_location) { - p = ngx_copy(p, ctx->ctx.vars.uri.data, ctx->ctx.vars.uri.len); - } - - if (escape) { - ngx_escape_uri(p, r->uri.data + loc_len, - r->uri.len - loc_len, NGX_ESCAPE_URI); - p += r->uri.len - loc_len + escape; - - } else { - p = ngx_copy(p, r->uri.data + loc_len, r->uri.len - loc_len); - } - - if (r->args.len > 0) { - *p++ = '?'; - p = ngx_copy(p, r->args.data, r->args.len); - } - - *b->last++ = ngx_http_v2_inc_indexed(NGX_HTTP_V2_PATH_INDEX); - b->last = ngx_http_v2_write_value(b->last, val_tmp, p - val_tmp, tmp); - - ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "http proxy header: \":path: %*s\"", p - val_tmp, - val_tmp); - } - - if (!plcf->host_set) { - *b->last++ = ngx_http_v2_inc_indexed(NGX_HTTP_V2_AUTHORITY_INDEX); - b->last = ngx_http_v2_write_value(b->last, host->data, host->len, tmp); - - ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "http proxy header: \":authority: %V\"", host); - } - - ngx_memzero(&e, sizeof(ngx_http_script_engine_t)); - - e.ip = headers->values->elts; - e.request = r; - e.flushed = 1; - - le.ip = headers->lengths->elts; - - while (*(uintptr_t *) le.ip) { - - lcode = *(ngx_http_script_len_code_pt *) le.ip; - key_len = lcode(&le); - - for (val_len = 0; *(uintptr_t *) le.ip; val_len += lcode(&le)) { - lcode = *(ngx_http_script_len_code_pt *) le.ip; - } - le.ip += sizeof(uintptr_t); - - if (val_len == 0) { - e.skip = 1; - - while (*(uintptr_t *) e.ip) { - code = *(ngx_http_script_code_pt *) e.ip; - code((ngx_http_script_engine_t *) &e); - } - e.ip += sizeof(uintptr_t); - - e.skip = 0; - - continue; - } - - *b->last++ = 0; - - e.pos = key_tmp; - - code = *(ngx_http_script_code_pt *) e.ip; - code((ngx_http_script_engine_t *) &e); - - b->last = ngx_http_v2_write_name(b->last, key_tmp, key_len, tmp); - - e.pos = val_tmp; - - while (*(uintptr_t *) e.ip) { - code = *(ngx_http_script_code_pt *) e.ip; - code((ngx_http_script_engine_t *) &e); - } - e.ip += sizeof(uintptr_t); - - b->last = ngx_http_v2_write_value(b->last, val_tmp, val_len, tmp); - -#if (NGX_DEBUG) - if (r->connection->log->log_level & NGX_LOG_DEBUG_HTTP) { - ngx_strlow(key_tmp, key_tmp, key_len); - - ngx_log_debug4(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "http proxy header: \"%*s: %*s\"", - key_len, key_tmp, val_len, val_tmp); - } -#endif - } - - if (plcf->upstream.pass_request_headers) { - part = &r->headers_in.headers.part; - header = part->elts; - - for (i = 0; /* void */; i++) { - - if (i >= part->nelts) { - if (part->next == NULL) { - break; - } - - part = part->next; - header = part->elts; - i = 0; - } - - if (ngx_hash_find(&headers->hash, header[i].hash, - header[i].lowcase_key, header[i].key.len)) - { - continue; - } - - *b->last++ = 0; - - b->last = ngx_http_v2_write_name(b->last, header[i].key.data, - header[i].key.len, tmp); - - b->last = ngx_http_v2_write_value(b->last, header[i].value.data, - header[i].value.len, tmp); - -#if (NGX_DEBUG) - if (r->connection->log->log_level & NGX_LOG_DEBUG_HTTP) { - ngx_strlow(tmp, header[i].key.data, header[i].key.len); - - ngx_log_debug3(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "http proxy header: \"%*s: %V\"", - header[i].key.len, tmp, &header[i].value); - } -#endif - } - } - - /* update headers frame length */ - - len = b->last - headers_frame - sizeof(ngx_http_proxy_v2_frame_t); - - if (len > NGX_HTTP_V2_DEFAULT_FRAME_SIZE) { - len = NGX_HTTP_V2_DEFAULT_FRAME_SIZE; - next = 1; - - } else { - next = 0; - } - - f = (ngx_http_proxy_v2_frame_t *) headers_frame; - - f->length_0 = (u_char) ((len >> 16) & 0xff); - f->length_1 = (u_char) ((len >> 8) & 0xff); - f->length_2 = (u_char) (len & 0xff); - - /* create additional continuation frames */ - - p = headers_frame; - - while (next) { - p += sizeof(ngx_http_proxy_v2_frame_t) + NGX_HTTP_V2_DEFAULT_FRAME_SIZE; - len = b->last - p; - - ngx_memmove(p + sizeof(ngx_http_proxy_v2_frame_t), p, len); - b->last += sizeof(ngx_http_proxy_v2_frame_t); - - if (len > NGX_HTTP_V2_DEFAULT_FRAME_SIZE) { - len = NGX_HTTP_V2_DEFAULT_FRAME_SIZE; - next = 1; - - } else { - next = 0; - } - - f = (ngx_http_proxy_v2_frame_t *) p; - - f->length_0 = (u_char) ((len >> 16) & 0xff); - f->length_1 = (u_char) ((len >> 8) & 0xff); - f->length_2 = (u_char) (len & 0xff); - f->type = NGX_HTTP_V2_CONTINUATION_FRAME; - f->flags = 0; - f->stream_id_0 = 0; - f->stream_id_1 = 0; - f->stream_id_2 = 0; - f->stream_id_3 = 1; - } - - f->flags |= NGX_HTTP_V2_END_HEADERS_FLAG; - - ngx_log_debug4(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "http proxy header: %*xs%s, len: %uz", - (size_t) ngx_min(b->last - b->pos, 256), b->pos, - b->last - b->pos > 256 ? "..." : "", - b->last - b->pos); - - if (r->request_body_no_buffering) { - - u->request_bufs = cl; - - } else if (plcf->body_values == NULL && plcf->upstream.pass_request_body) { - - body = u->request_bufs; - u->request_bufs = cl; - - if (body == NULL) { - f = (ngx_http_proxy_v2_frame_t *) headers_frame; - f->flags |= NGX_HTTP_V2_END_STREAM_FLAG; - } - - while (body) { - b = ngx_alloc_buf(r->pool); - if (b == NULL) { - return NGX_ERROR; - } - - ngx_memcpy(b, body->buf, sizeof(ngx_buf_t)); - - cl->next = ngx_alloc_chain_link(r->pool); - if (cl->next == NULL) { - return NGX_ERROR; - } - - cl = cl->next; - cl->buf = b; - - body = body->next; - } - - b->last_buf = 1; - - } else if (body_len) { - - u->request_bufs = cl; - - b = ngx_create_temp_buf(r->pool, body_len); - if (b == NULL) { - return NGX_ERROR; - } - - cl->next = ngx_alloc_chain_link(r->pool); - if (cl->next == NULL) { - return NGX_ERROR; - } - - cl = cl->next; - cl->buf = b; - - e.ip = plcf->body_values->elts; - e.pos = b->last; - e.request = r; - e.flushed = 1; - e.skip = 0; - - while (*(uintptr_t *) e.ip) { - code = *(ngx_http_script_code_pt *) e.ip; - code((ngx_http_script_engine_t *) &e); - } - - b->last = e.pos; - b->last_buf = 1; - - } else { - u->request_bufs = cl; - - f = (ngx_http_proxy_v2_frame_t *) headers_frame; - f->flags |= NGX_HTTP_V2_END_STREAM_FLAG; - - b->last_buf = 1; - } - - u->output.output_filter = ngx_http_proxy_v2_body_output_filter; - u->output.filter_ctx = r; - - b->flush = 1; - cl->next = NULL; - - return NGX_OK; -} - - -static ngx_int_t -ngx_http_proxy_v2_reinit_request(ngx_http_request_t *r) -{ - ngx_http_proxy_v2_ctx_t *ctx; - - ctx = ngx_http_get_module_ctx(r, ngx_http_proxy_v2_module); - - if (ctx == NULL) { - return NGX_OK; - } - - ctx->state = 0; - ctx->header_sent = 0; - ctx->output_closed = 0; - ctx->output_blocked = 0; - ctx->parsing_headers = 0; - ctx->end_stream = 0; - ctx->done = 0; - ctx->status = 0; - ctx->rst = 0; - ctx->goaway = 0; - ctx->connection = NULL; - ctx->in = NULL; - ctx->busy = NULL; - ctx->out = NULL; - - return NGX_OK; -} - - -static ngx_int_t -ngx_http_proxy_v2_body_output_filter(void *data, ngx_chain_t *in) -{ - ngx_http_request_t *r = data; - - off_t file_pos; - u_char *p, *pos, *start; - size_t len, limit; - ngx_buf_t *b; - ngx_int_t rc; - ngx_uint_t next, last; - ngx_chain_t *cl, *out, *ln, **ll; - ngx_http_upstream_t *u; - ngx_http_proxy_v2_ctx_t *ctx; - ngx_http_proxy_v2_frame_t *f; - - ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "http proxy output filter"); - - ctx = ngx_http_proxy_v2_get_ctx(r); - - if (ctx == NULL) { - return NGX_ERROR; - } - - if (in) { - if (ngx_chain_add_copy(r->pool, &ctx->in, in) != NGX_OK) { - return NGX_ERROR; - } - } - - out = NULL; - ll = &out; - - if (!ctx->header_sent) { - /* first buffer contains headers */ - - ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "http proxy output header"); - - ctx->header_sent = 1; - - if (ctx->id != 1) { - /* - * keepalive connection: skip connection preface, - * update stream identifiers - */ - - b = ctx->in->buf; - b->pos += sizeof(ngx_http_proxy_v2_connection_start) - 1; - - p = b->pos; - - while (p < b->last) { - f = (ngx_http_proxy_v2_frame_t *) p; - p += sizeof(ngx_http_proxy_v2_frame_t); - - f->stream_id_0 = (u_char) ((ctx->id >> 24) & 0xff); - f->stream_id_1 = (u_char) ((ctx->id >> 16) & 0xff); - f->stream_id_2 = (u_char) ((ctx->id >> 8) & 0xff); - f->stream_id_3 = (u_char) (ctx->id & 0xff); - - p += (f->length_0 << 16) + (f->length_1 << 8) + f->length_2; - } - } - - if (ctx->in->buf->last_buf) { - ctx->output_closed = 1; - } - - *ll = ctx->in; - ll = &ctx->in->next; - - ctx->in = ctx->in->next; - } - - if (ctx->out) { - /* queued control frames */ - - *ll = ctx->out; - - for (cl = ctx->out, ll = &cl->next; cl; cl = cl->next) { - ll = &cl->next; - } - - ctx->out = NULL; - } - - f = NULL; - last = 0; - - limit = ngx_max(0, ctx->send_window); - - if (limit > ctx->connection->send_window) { - limit = ctx->connection->send_window; - } - - ngx_log_debug3(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "http proxy output limit: %uz w:%z:%uz", - limit, ctx->send_window, ctx->connection->send_window); - -#if (NGX_SUPPRESS_WARN) - file_pos = 0; - pos = NULL; - cl = NULL; -#endif - - in = ctx->in; - - while (in && limit > 0) { - - ngx_log_debug7(NGX_LOG_DEBUG_EVENT, r->connection->log, 0, - "http proxy output in l:%d f:%d %p, pos %p, size: %z " - "file: %O, size: %O", - in->buf->last_buf, - in->buf->in_file, - in->buf->start, in->buf->pos, - in->buf->last - in->buf->pos, - in->buf->file_pos, - in->buf->file_last - in->buf->file_pos); - - if (ngx_buf_special(in->buf)) { - goto next; - } - - if (in->buf->in_file) { - file_pos = in->buf->file_pos; - - } else { - pos = in->buf->pos; - } - - next = 0; - - do { - - cl = ngx_http_proxy_v2_get_buf(r, ctx); - if (cl == NULL) { - return NGX_ERROR; - } - - b = cl->buf; - - f = (ngx_http_proxy_v2_frame_t *) b->last; - b->last += sizeof(ngx_http_proxy_v2_frame_t); - - *ll = cl; - ll = &cl->next; - - cl = ngx_chain_get_free_buf(r->pool, &ctx->free); - if (cl == NULL) { - return NGX_ERROR; - } - - b = cl->buf; - start = b->start; - - ngx_memcpy(b, in->buf, sizeof(ngx_buf_t)); - - /* - * restore b->start to preserve memory allocated in the buffer, - * to reuse it later for headers and control frames - */ - - b->start = start; - - if (in->buf->in_file) { - b->file_pos = file_pos; - file_pos += ngx_min(NGX_HTTP_V2_DEFAULT_FRAME_SIZE, limit); - - if (file_pos >= in->buf->file_last) { - file_pos = in->buf->file_last; - next = 1; - } - - b->file_last = file_pos; - len = (ngx_uint_t) (file_pos - b->file_pos); - - } else { - b->pos = pos; - pos += ngx_min(NGX_HTTP_V2_DEFAULT_FRAME_SIZE, limit); - - if (pos >= in->buf->last) { - pos = in->buf->last; - next = 1; - } - - b->last = pos; - len = (ngx_uint_t) (pos - b->pos); - } - - b->tag = (ngx_buf_tag_t) &ngx_http_proxy_v2_body_output_filter; - b->shadow = in->buf; - b->last_shadow = next; - - b->last_buf = 0; - b->last_in_chain = 0; - - *ll = cl; - ll = &cl->next; - - f->length_0 = (u_char) ((len >> 16) & 0xff); - f->length_1 = (u_char) ((len >> 8) & 0xff); - f->length_2 = (u_char) (len & 0xff); - f->type = NGX_HTTP_V2_DATA_FRAME; - f->flags = 0; - f->stream_id_0 = (u_char) ((ctx->id >> 24) & 0xff); - f->stream_id_1 = (u_char) ((ctx->id >> 16) & 0xff); - f->stream_id_2 = (u_char) ((ctx->id >> 8) & 0xff); - f->stream_id_3 = (u_char) (ctx->id & 0xff); - - limit -= len; - ctx->send_window -= len; - ctx->connection->send_window -= len; - - } while (!next && limit > 0); - - if (!next) { - /* - * if the buffer wasn't fully sent due to flow control limits, - * preserve position for future use - */ - - if (in->buf->in_file) { - in->buf->file_pos = file_pos; - - } else { - in->buf->pos = pos; - } - - break; - } - - next: - - if (in->buf->last_buf) { - last = 1; - } - - ln = in; - in = in->next; - - ngx_free_chain(r->pool, ln); - } - - ctx->in = in; - - if (last) { - - ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "http proxy output last"); - - ctx->output_closed = 1; - - if (f) { - f->flags |= NGX_HTTP_V2_END_STREAM_FLAG; - - } else { - cl = ngx_http_proxy_v2_get_buf(r, ctx); - if (cl == NULL) { - return NGX_ERROR; - } - - b = cl->buf; - - f = (ngx_http_proxy_v2_frame_t *) b->last; - b->last += sizeof(ngx_http_proxy_v2_frame_t); - - f->length_0 = 0; - f->length_1 = 0; - f->length_2 = 0; - f->type = NGX_HTTP_V2_DATA_FRAME; - f->flags = NGX_HTTP_V2_END_STREAM_FLAG; - f->stream_id_0 = (u_char) ((ctx->id >> 24) & 0xff); - f->stream_id_1 = (u_char) ((ctx->id >> 16) & 0xff); - f->stream_id_2 = (u_char) ((ctx->id >> 8) & 0xff); - f->stream_id_3 = (u_char) (ctx->id & 0xff); - - *ll = cl; - ll = &cl->next; - } - - cl->buf->last_buf = 1; - } - - *ll = NULL; - -#if (NGX_DEBUG) - - for (cl = out; cl; cl = cl->next) { - ngx_log_debug7(NGX_LOG_DEBUG_EVENT, r->connection->log, 0, - "http proxy output out l:%d f:%d %p, pos %p, size: %z " - "file: %O, size: %O", - cl->buf->last_buf, - cl->buf->in_file, - cl->buf->start, cl->buf->pos, - cl->buf->last - cl->buf->pos, - cl->buf->file_pos, - cl->buf->file_last - cl->buf->file_pos); - } - - ngx_log_debug3(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "http proxy output limit: %uz w:%z:%uz", - limit, ctx->send_window, ctx->connection->send_window); - -#endif - - rc = ngx_chain_writer(&r->upstream->writer, out); - - ngx_chain_update_chains(r->pool, &ctx->free, &ctx->busy, &out, - (ngx_buf_tag_t) &ngx_http_proxy_v2_body_output_filter); - - for (cl = ctx->free; cl; cl = cl->next) { - - /* mark original buffers as sent */ - - if (cl->buf->shadow) { - if (cl->buf->last_shadow) { - b = cl->buf->shadow; - b->pos = b->last; - } - - cl->buf->shadow = NULL; - } - } - - if (rc == NGX_OK && ctx->in) { - rc = NGX_AGAIN; - } - - if (rc == NGX_AGAIN) { - ctx->output_blocked = 1; - - } else { - ctx->output_blocked = 0; - } - - if (ctx->done) { - - /* - * We have already got the response and were sending some additional - * control frames. Even if there is still something unsent, stop - * here anyway. - */ - - u = r->upstream; - u->length = 0; - u->pipe->length = 0; - - if (ctx->in == NULL - && ctx->out == NULL - && ctx->output_closed - && !ctx->output_blocked - && !ctx->goaway - && ctx->state == ngx_http_proxy_v2_st_start) - { - u->keepalive = 1; - } - - ngx_post_event(u->peer.connection->read, &ngx_posted_events); - } - - return rc; -} - - -static ngx_int_t -ngx_http_proxy_v2_process_header(ngx_http_request_t *r) -{ - u_char *pos; - ngx_str_t *status_line; - ngx_int_t rc, status; - ngx_buf_t *b; - ngx_table_elt_t *h; - ngx_http_upstream_t *u; - ngx_http_proxy_v2_ctx_t *ctx; - ngx_http_upstream_header_t *hh; - ngx_http_upstream_main_conf_t *umcf; - - u = r->upstream; - b = &u->buffer; - pos = b->pos; - - ngx_log_debug4(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "http proxy response: %*xs%s, len: %uz", - (size_t) ngx_min(b->last - b->pos, 256), - b->pos, b->last - b->pos > 256 ? "..." : "", - b->last - b->pos); - - ctx = ngx_http_proxy_v2_get_ctx(r); - - if (ctx == NULL) { - return NGX_ERROR; - } - - umcf = ngx_http_get_module_main_conf(r, ngx_http_upstream_module); - - for ( ;; ) { - - if (ctx->state < ngx_http_proxy_v2_st_payload) { - - rc = ngx_http_proxy_v2_parse_frame(r, ctx, b); - - if (rc == NGX_AGAIN) { - - /* - * there can be a lot of window update frames, - * so we reset buffer if it is empty and we haven't - * started parsing headers yet - */ - - if (!ctx->parsing_headers) { - b->pos = pos; - b->last = b->pos; - } - - return NGX_AGAIN; - } - - if (rc == NGX_ERROR) { - return NGX_HTTP_UPSTREAM_INVALID_HEADER; - } - - /* - * RFC 7540 says that implementations MUST discard frames - * that have unknown or unsupported types. However, extension - * frames that appear in the middle of a header block are - * not permitted. Also, for obvious reasons CONTINUATION frames - * cannot appear before headers, and DATA frames are not expected - * to appear before all headers are parsed. - */ - - if (ctx->type == NGX_HTTP_V2_DATA_FRAME - || (ctx->type == NGX_HTTP_V2_CONTINUATION_FRAME - && !ctx->parsing_headers) - || (ctx->type != NGX_HTTP_V2_CONTINUATION_FRAME - && ctx->parsing_headers)) - { - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "upstream sent unexpected http2 frame: %d", - ctx->type); - return NGX_HTTP_UPSTREAM_INVALID_HEADER; - } - - if (ctx->id && ctx->stream_id && ctx->stream_id != ctx->id) { - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "upstream sent frame for unknown stream %ui", - ctx->stream_id); - return NGX_HTTP_UPSTREAM_INVALID_HEADER; - } - } - - /* frame payload */ - - if (u->peer.connection) { - - if (ctx->type == NGX_HTTP_V2_RST_STREAM_FRAME) { - rc = ngx_http_proxy_v2_parse_rst_stream(r, ctx, b); - - if (rc == NGX_AGAIN) { - return NGX_AGAIN; - } - - if (rc == NGX_ERROR) { - return NGX_HTTP_UPSTREAM_INVALID_HEADER; - } - - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "upstream rejected request with error %ui", - ctx->error); - - return NGX_HTTP_UPSTREAM_INVALID_HEADER; - } - - rc = ngx_http_proxy_v2_process_control_frame(r, ctx, b); - - if (rc == NGX_AGAIN) { - return NGX_AGAIN; - } - - if (rc == NGX_ERROR) { - return NGX_HTTP_UPSTREAM_INVALID_HEADER; - } - - if (rc == NGX_OK) { - continue; - } - } - - if (ctx->type != NGX_HTTP_V2_HEADERS_FRAME - && ctx->type != NGX_HTTP_V2_CONTINUATION_FRAME) - { - /* priority, unknown frames */ - - rc = ngx_http_proxy_v2_skip_frame(ctx, b); - - if (rc == NGX_AGAIN) { - return NGX_AGAIN; - } - - continue; - } - - /* headers */ - - for ( ;; ) { - - rc = ngx_http_proxy_v2_parse_header(r, ctx, b); - - if (rc == NGX_AGAIN) { - break; - } - - if (rc == NGX_OK) { - - /* a header line has been parsed successfully */ - - ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "http proxy header: \"%V: %V\"", - &ctx->name, &ctx->value); - - if (ctx->name.len && ctx->name.data[0] == ':') { - - if (ctx->name.len != sizeof(":status") - 1 - || ngx_strncmp(ctx->name.data, ":status", - sizeof(":status") - 1) - != 0) - { - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "upstream sent invalid header \"%V: %V\"", - &ctx->name, &ctx->value); - return NGX_HTTP_UPSTREAM_INVALID_HEADER; - } - - if (ctx->status) { - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "upstream sent duplicate :status header"); - return NGX_HTTP_UPSTREAM_INVALID_HEADER; - } - - status_line = &ctx->value; - - if (status_line->len != 3) { - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "upstream sent invalid :status \"%V\"", - status_line); - return NGX_HTTP_UPSTREAM_INVALID_HEADER; - } - - status = ngx_atoi(status_line->data, 3); - - if (status == NGX_ERROR) { - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "upstream sent invalid :status \"%V\"", - status_line); - return NGX_HTTP_UPSTREAM_INVALID_HEADER; - } - - if (status < NGX_HTTP_OK && status != NGX_HTTP_EARLY_HINTS) - { - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "upstream sent unexpected :status \"%V\"", - status_line); - return NGX_HTTP_UPSTREAM_INVALID_HEADER; - } - - u->headers_in.status_n = status; - - if (u->state && u->state->status == 0) { - u->state->status = status; - } - - ctx->status = 1; - - continue; - - } else if (!ctx->status) { - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "upstream sent no :status header"); - return NGX_HTTP_UPSTREAM_INVALID_HEADER; - } - - h = ngx_list_push(&u->headers_in.headers); - if (h == NULL) { - return NGX_ERROR; - } - - h->key = ctx->name; - h->value = ctx->value; - h->lowcase_key = h->key.data; - h->hash = ngx_hash_key(h->key.data, h->key.len); - - if (u->headers_in.status_n == NGX_HTTP_EARLY_HINTS) { - continue; - } - - hh = ngx_hash_find(&umcf->headers_in_hash, h->hash, - h->lowcase_key, h->key.len); - - if (hh) { - rc = hh->handler(r, h, hh->offset); - - if (rc != NGX_OK) { - return rc; - } - } - - continue; - } - - if (rc == NGX_HTTP_PARSE_HEADER_DONE) { - - /* a whole header has been parsed successfully */ - - ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "http proxy header done"); - - if (u->headers_in.status_n == NGX_HTTP_EARLY_HINTS) { - if (ctx->end_stream) { - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "upstream prematurely closed stream"); - return NGX_HTTP_UPSTREAM_INVALID_HEADER; - } - - ctx->status = 0; - return NGX_HTTP_UPSTREAM_EARLY_HINTS; - } - - if (ctx->end_stream - && ctx->in == NULL - && ctx->out == NULL - && ctx->output_closed - && !ctx->output_blocked - && !ctx->goaway - && b->last == b->pos) - { - u->keepalive = 1; - } - - return NGX_OK; - } - - /* there was error while a header line parsing */ - - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "upstream sent invalid header"); - - return NGX_HTTP_UPSTREAM_INVALID_HEADER; - } - - /* rc == NGX_AGAIN */ - - if (ctx->rest == 0) { - ctx->state = ngx_http_proxy_v2_st_start; - continue; - } - - return NGX_AGAIN; - } -} - - -static ngx_int_t -ngx_http_proxy_v2_filter_init(void *data) -{ - ngx_http_request_t *r = data; - ngx_http_upstream_t *u; - ngx_http_proxy_v2_ctx_t *ctx; - - u = r->upstream; - ctx = ngx_http_get_module_ctx(r, ngx_http_proxy_v2_module); - - if (ctx == NULL) { - return NGX_ERROR; - } - - if (u->headers_in.status_n == NGX_HTTP_NO_CONTENT - || u->headers_in.status_n == NGX_HTTP_NOT_MODIFIED - || ctx->ctx.head) - { - ctx->length = 0; - - } else { - ctx->length = u->headers_in.content_length_n; - } - - if (ctx->end_stream) { - - if (ctx->length > 0) { - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "upstream prematurely closed stream"); - return NGX_ERROR; - } - - u->length = 0; - u->pipe->length = 0; - ctx->done = 1; - - } else { - u->length = 1; - u->pipe->length = 1; - } - - return NGX_OK; -} - - -static ngx_int_t -ngx_http_proxy_v2_non_buffered_filter(void *data, ssize_t bytes) -{ - ngx_http_request_t *r = data; - - ngx_int_t rc; - ngx_buf_t *b, *buf; - ngx_chain_t *cl, **ll; - ngx_http_upstream_t *u; - ngx_http_proxy_v2_ctx_t *ctx; - - ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "http proxy filter bytes:%z", bytes); - - ctx = ngx_http_get_module_ctx(r, ngx_http_proxy_v2_module); - - if (ctx == NULL) { - return NGX_ERROR; - } - - u = r->upstream; - b = &u->buffer; - - b->pos = b->last; - b->last += bytes; - - for (cl = u->out_bufs, ll = &u->out_bufs; cl; cl = cl->next) { - ll = &cl->next; - } - - for ( ;; ) { - - rc = ngx_http_proxy_v2_process_frames(r, ctx, b); - - if (rc == NGX_OK) { - - cl = ngx_chain_get_free_buf(r->pool, &u->free_bufs); - if (cl == NULL) { - return NGX_ERROR; - } - - *ll = cl; - ll = &cl->next; - - buf = cl->buf; - - buf->flush = 1; - buf->memory = 1; - - buf->pos = b->pos; - buf->tag = u->output.tag; - - if (b->last - b->pos >= (ssize_t) ctx->rest - ctx->padding) { - b->pos += ctx->rest - ctx->padding; - buf->last = b->pos; - ctx->rest = ctx->padding; - - } else { - ctx->rest -= b->last - b->pos; - b->pos = b->last; - buf->last = b->pos; - } - - ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "http proxy output buf %p", buf->pos); - - if (ctx->length != -1) { - - if (buf->last - buf->pos > ctx->length) { - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "upstream sent response body larger " - "than indicated content length"); - return NGX_ERROR; - } - - ctx->length -= buf->last - buf->pos; - } - - continue; - } - - if (rc == NGX_DONE) { - u->length = 0; - break; - } - - if (rc == NGX_AGAIN) { - return NGX_AGAIN; - } - - /* invalid response */ - - return NGX_ERROR; - } - - return NGX_OK; -} - - -static ngx_int_t -ngx_http_proxy_v2_body_filter(ngx_event_pipe_t *p, ngx_buf_t *b) -{ - ngx_int_t rc; - ngx_buf_t *buf, **prev; - ngx_chain_t *cl; - ngx_http_request_t *r; - ngx_http_proxy_v2_ctx_t *ctx; - - if (b->pos == b->last) { - return NGX_OK; - } - - r = p->input_ctx; - ctx = ngx_http_get_module_ctx(r, ngx_http_proxy_v2_module); - - if (ctx == NULL) { - return NGX_ERROR; - } - - buf = NULL; - prev = &b->shadow; - - ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "http proxy filter bytes:%z", b->last - b->pos); - - for ( ;; ) { - - rc = ngx_http_proxy_v2_process_frames(r, ctx, b); - - if (rc == NGX_OK) { - - /* copy data frame payload for buffering */ - - cl = ngx_chain_get_free_buf(p->pool, &p->free); - if (cl == NULL) { - return NGX_ERROR; - } - - buf = cl->buf; - - ngx_memzero(buf, sizeof(ngx_buf_t)); - - buf->pos = b->pos; - buf->start = b->start; - buf->end = b->end; - buf->tag = p->tag; - buf->temporary = 1; - buf->recycled = 1; - - *prev = buf; - prev = &buf->shadow; - - if (p->in) { - *p->last_in = cl; - - } else { - p->in = cl; - } - - p->last_in = &cl->next; - - /* STUB */ buf->num = b->num; - - ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "http proxy copy buf %p", buf->pos); - - if (b->last - b->pos >= (ssize_t) ctx->rest - ctx->padding) { - b->pos += ctx->rest - ctx->padding; - buf->last = b->pos; - ctx->rest = ctx->padding; - - } else { - ctx->rest -= b->last - b->pos; - b->pos = b->last; - buf->last = b->pos; - } - - if (ctx->length != -1) { - - if (buf->last - buf->pos > ctx->length) { - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "upstream sent response body larger " - "than indicated content length"); - return NGX_ERROR; - } - - ctx->length -= buf->last - buf->pos; - } - - continue; - } - - if (rc == NGX_DONE) { - p->length = 0; - break; - } - - if (rc == NGX_AGAIN) { - break; - } - - /* invalid response */ - - return NGX_ERROR; - } - - if (buf) { - buf->shadow = b; - buf->last_shadow = 1; - - ngx_log_debug2(NGX_LOG_DEBUG_EVENT, p->log, 0, - "input buf %p %z", buf->pos, buf->last - buf->pos); - - return NGX_OK; - } - - /* there is no data record in the buf, add it to free chain */ - - if (ngx_event_pipe_add_free_buf(p, b) != NGX_OK) { - return NGX_ERROR; - } - - return NGX_OK; -} - - -static ngx_int_t -ngx_http_proxy_v2_process_control_frame(ngx_http_request_t *r, - ngx_http_proxy_v2_ctx_t *ctx, ngx_buf_t *b) -{ - ngx_int_t rc; - ngx_http_upstream_t *u; - - u = r->upstream; - - if (ctx->type == NGX_HTTP_V2_GOAWAY_FRAME) { - - rc = ngx_http_proxy_v2_parse_goaway(r, ctx, b); - - if (rc == NGX_AGAIN) { - return NGX_AGAIN; - } - - if (rc == NGX_ERROR) { - return NGX_ERROR; - } - - /* - * If stream_id is lower than one we use, our - * request won't be processed and needs to be retried. - * If stream_id is greater or equal to the one we use, - * we can continue normally (except we can't use this - * connection for additional requests). If there is - * a real error, the connection will be closed. - */ - - if (ctx->stream_id < ctx->id) { - - /* TODO: we can retry non-idempotent requests */ - - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "upstream sent goaway with error %ui", - ctx->error); - - return NGX_ERROR; - } - - ctx->goaway = 1; - - return NGX_OK; - } - - if (ctx->type == NGX_HTTP_V2_WINDOW_UPDATE_FRAME) { - - rc = ngx_http_proxy_v2_parse_window_update(r, ctx, b); - - if (rc == NGX_AGAIN) { - return NGX_AGAIN; - } - - if (rc == NGX_ERROR) { - return NGX_ERROR; - } - - if (ctx->in) { - ngx_post_event(u->peer.connection->write, &ngx_posted_events); - } - - return NGX_OK; - } - - if (ctx->type == NGX_HTTP_V2_SETTINGS_FRAME) { - - rc = ngx_http_proxy_v2_parse_settings(r, ctx, b); - - if (rc == NGX_AGAIN) { - return NGX_AGAIN; - } - - if (rc == NGX_ERROR) { - return NGX_ERROR; - } - - if (ctx->in) { - ngx_post_event(u->peer.connection->write, &ngx_posted_events); - } - - return NGX_OK; - } - - if (ctx->type == NGX_HTTP_V2_PING_FRAME) { - - rc = ngx_http_proxy_v2_parse_ping(r, ctx, b); - - if (rc == NGX_AGAIN) { - return NGX_AGAIN; - } - - if (rc == NGX_ERROR) { - return NGX_ERROR; - } - - ngx_post_event(u->peer.connection->write, &ngx_posted_events); - - return NGX_OK; - } - - if (ctx->type == NGX_HTTP_V2_PUSH_PROMISE_FRAME) { - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "upstream sent unexpected push promise frame"); - return NGX_ERROR; - } - - return NGX_DECLINED; -} - - -static ngx_int_t -ngx_http_proxy_v2_skip_frame(ngx_http_proxy_v2_ctx_t *ctx, ngx_buf_t *b) -{ - if (b->last - b->pos < (ssize_t) ctx->rest) { - ctx->rest -= b->last - b->pos; - b->pos = b->last; - return NGX_AGAIN; - } - - b->pos += ctx->rest; - ctx->rest = 0; - ctx->state = ngx_http_proxy_v2_st_start; - - return NGX_OK; -} - - -static ngx_int_t -ngx_http_proxy_v2_process_frames(ngx_http_request_t *r, - ngx_http_proxy_v2_ctx_t *ctx, ngx_buf_t *b) -{ - ngx_int_t rc; - ngx_table_elt_t *h; - ngx_http_upstream_t *u; - - u = r->upstream; - - for ( ;; ) { - - if (ctx->state < ngx_http_proxy_v2_st_payload) { - - rc = ngx_http_proxy_v2_parse_frame(r, ctx, b); - - if (rc == NGX_AGAIN) { - - if (ctx->done) { - - if (ctx->length > 0) { - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "upstream prematurely closed stream"); - return NGX_ERROR; - } - - /* - * We have finished parsing the response and the - * remaining control frames. If there are unsent - * control frames, post a write event to send them. - */ - - if (ctx->out) { - ngx_post_event(u->peer.connection->write, - &ngx_posted_events); - return NGX_AGAIN; - } - - if (ctx->in == NULL - && ctx->output_closed - && !ctx->output_blocked - && !ctx->goaway - && ctx->state == ngx_http_proxy_v2_st_start) - { - u->keepalive = 1; - } - - return NGX_DONE; - } - - return NGX_AGAIN; - } - - if (rc == NGX_ERROR) { - return NGX_ERROR; - } - - if ((ctx->type == NGX_HTTP_V2_CONTINUATION_FRAME - && !ctx->parsing_headers) - || (ctx->type != NGX_HTTP_V2_CONTINUATION_FRAME - && ctx->parsing_headers)) - { - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "upstream sent unexpected http2 frame: %d", - ctx->type); - return NGX_ERROR; - } - - if (ctx->type == NGX_HTTP_V2_DATA_FRAME) { - - if (ctx->stream_id != ctx->id) { - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "upstream sent data frame " - "for unknown stream %ui", - ctx->stream_id); - return NGX_ERROR; - } - - if (ctx->rest > ctx->recv_window) { - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "upstream violated stream flow control, " - "received %uz data frame with window %uz", - ctx->rest, ctx->recv_window); - return NGX_ERROR; - } - - if (ctx->rest > ctx->connection->recv_window) { - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "upstream violated connection flow control, " - "received %uz data frame with window %uz", - ctx->rest, ctx->connection->recv_window); - return NGX_ERROR; - } - - ctx->recv_window -= ctx->rest; - ctx->connection->recv_window -= ctx->rest; - - if (ctx->connection->recv_window < NGX_HTTP_V2_MAX_WINDOW / 4 - || ctx->recv_window < NGX_HTTP_V2_MAX_WINDOW / 4) - { - if (ngx_http_proxy_v2_send_window_update(r, ctx) - != NGX_OK) - { - return NGX_ERROR; - } - - ngx_post_event(u->peer.connection->write, - &ngx_posted_events); - } - } - - if (ctx->stream_id && ctx->stream_id != ctx->id) { - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "upstream sent frame for unknown stream %ui", - ctx->stream_id); - return NGX_ERROR; - } - - if (ctx->stream_id && ctx->done - && ctx->type != NGX_HTTP_V2_RST_STREAM_FRAME - && ctx->type != NGX_HTTP_V2_WINDOW_UPDATE_FRAME) - { - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "upstream sent frame for closed stream %ui", - ctx->stream_id); - return NGX_ERROR; - } - - ctx->padding = 0; - } - - if (ctx->state == ngx_http_proxy_v2_st_padding) { - - if (b->last - b->pos < (ssize_t) ctx->rest) { - ctx->rest -= b->last - b->pos; - b->pos = b->last; - return NGX_AGAIN; - } - - b->pos += ctx->rest; - ctx->rest = 0; - ctx->state = ngx_http_proxy_v2_st_start; - - if (ctx->flags & NGX_HTTP_V2_END_STREAM_FLAG) { - ctx->done = 1; - } - - continue; - } - - /* frame payload */ - - if (ctx->type == NGX_HTTP_V2_RST_STREAM_FRAME) { - - rc = ngx_http_proxy_v2_parse_rst_stream(r, ctx, b); - - if (rc == NGX_AGAIN) { - return NGX_AGAIN; - } - - if (rc == NGX_ERROR) { - return NGX_ERROR; - } - - if (ctx->error || !ctx->done) { - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "upstream rejected request with error %ui", - ctx->error); - return NGX_ERROR; - } - - if (ctx->rst) { - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "upstream sent frame for closed stream %ui", - ctx->stream_id); - return NGX_ERROR; - } - - ctx->rst = 1; - - continue; - } - - rc = ngx_http_proxy_v2_process_control_frame(r, ctx, b); - - if (rc == NGX_AGAIN) { - return NGX_AGAIN; - } - - if (rc == NGX_ERROR) { - return NGX_ERROR; - } - - if (rc == NGX_OK) { - continue; - } - - if (ctx->type == NGX_HTTP_V2_HEADERS_FRAME - || ctx->type == NGX_HTTP_V2_CONTINUATION_FRAME) - { - for ( ;; ) { - - rc = ngx_http_proxy_v2_parse_header(r, ctx, b); - - if (rc == NGX_AGAIN) { - break; - } - - if (rc == NGX_OK) { - - /* a header line has been parsed successfully */ - - ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "http proxy trailer: \"%V: %V\"", - &ctx->name, &ctx->value); - - if (ctx->name.len && ctx->name.data[0] == ':') { - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "upstream sent invalid " - "trailer \"%V: %V\"", - &ctx->name, &ctx->value); - return NGX_ERROR; - } - - h = ngx_list_push(&u->headers_in.trailers); - if (h == NULL) { - return NGX_ERROR; - } - - h->key = ctx->name; - h->value = ctx->value; - h->lowcase_key = h->key.data; - h->hash = ngx_hash_key(h->key.data, h->key.len); - - continue; - } - - if (rc == NGX_HTTP_PARSE_HEADER_DONE) { - - /* a whole header has been parsed successfully */ - - ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "http proxy trailer done"); - - if (ctx->end_stream) { - ctx->done = 1; - break; - } - - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "upstream sent trailer without " - "end stream flag"); - return NGX_ERROR; - } - - /* there was error while a header line parsing */ - - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "upstream sent invalid trailer"); - - return NGX_ERROR; - } - - if (rc == NGX_HTTP_PARSE_HEADER_DONE) { - continue; - } - - /* rc == NGX_AGAIN */ - - if (ctx->rest == 0) { - ctx->state = ngx_http_proxy_v2_st_start; - continue; - } - - return NGX_AGAIN; - } - - if (ctx->type != NGX_HTTP_V2_DATA_FRAME) { - - /* priority, unknown frames */ - - rc = ngx_http_proxy_v2_skip_frame(ctx, b); - - if (rc == NGX_AGAIN) { - return NGX_AGAIN; - } - - continue; - } - - /* - * data frame: - * - * +---------------+ - * |Pad Length? (8)| - * +---------------+-----------------------------------------------+ - * | Data (*) ... - * +---------------------------------------------------------------+ - * | Padding (*) ... - * +---------------------------------------------------------------+ - */ - - if (ctx->flags & NGX_HTTP_V2_PADDED_FLAG) { - - if (ctx->rest == 0) { - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "upstream sent too short http2 frame"); - return NGX_ERROR; - } - - if (b->pos == b->last) { - return NGX_AGAIN; - } - - ctx->flags &= ~NGX_HTTP_V2_PADDED_FLAG; - ctx->padding = *b->pos++; - ctx->rest -= 1; - - if (ctx->padding > ctx->rest) { - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "upstream sent http2 frame with too long " - "padding: %d in frame %uz", - ctx->padding, ctx->rest); - return NGX_ERROR; - } - - continue; - } - - if (ctx->padding == ctx->rest) { - - if (ctx->padding) { - ctx->state = ngx_http_proxy_v2_st_padding; - - } else { - ctx->state = ngx_http_proxy_v2_st_start; - - if (ctx->flags & NGX_HTTP_V2_END_STREAM_FLAG) { - ctx->done = 1; - } - } - - continue; - } - - if (b->pos == b->last) { - return NGX_AGAIN; - } - - return NGX_OK; - } -} - - -static ngx_int_t -ngx_http_proxy_v2_parse_frame(ngx_http_request_t *r, - ngx_http_proxy_v2_ctx_t *ctx, ngx_buf_t *b) -{ - u_char ch, *p; - ngx_http_proxy_v2_state_e state; - - state = ctx->state; - - for (p = b->pos; p < b->last; p++) { - ch = *p; - -#if 0 - ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "http proxy frame byte: %02Xd, s:%d", ch, state); -#endif - - switch (state) { - - case ngx_http_proxy_v2_st_start: - ctx->rest = ch << 16; - state = ngx_http_proxy_v2_st_length_2; - break; - - case ngx_http_proxy_v2_st_length_2: - ctx->rest |= ch << 8; - state = ngx_http_proxy_v2_st_length_3; - break; - - case ngx_http_proxy_v2_st_length_3: - ctx->rest |= ch; - - if (ctx->rest > NGX_HTTP_V2_DEFAULT_FRAME_SIZE) { - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "upstream sent too large http2 frame: %uz", - ctx->rest); - return NGX_ERROR; - } - - state = ngx_http_proxy_v2_st_type; - break; - - case ngx_http_proxy_v2_st_type: - ctx->type = ch; - state = ngx_http_proxy_v2_st_flags; - break; - - case ngx_http_proxy_v2_st_flags: - ctx->flags = ch; - state = ngx_http_proxy_v2_st_stream_id; - break; - - case ngx_http_proxy_v2_st_stream_id: - ctx->stream_id = (ch & 0x7f) << 24; - state = ngx_http_proxy_v2_st_stream_id_2; - break; - - case ngx_http_proxy_v2_st_stream_id_2: - ctx->stream_id |= ch << 16; - state = ngx_http_proxy_v2_st_stream_id_3; - break; - - case ngx_http_proxy_v2_st_stream_id_3: - ctx->stream_id |= ch << 8; - state = ngx_http_proxy_v2_st_stream_id_4; - break; - - case ngx_http_proxy_v2_st_stream_id_4: - ctx->stream_id |= ch; - - ngx_log_debug4(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "http proxy frame: %d, len: %uz, f:%d, i:%ui", - ctx->type, ctx->rest, ctx->flags, ctx->stream_id); - - b->pos = p + 1; - - ctx->state = ngx_http_proxy_v2_st_payload; - ctx->frame_state = 0; - - return NGX_OK; - - /* suppress warning */ - case ngx_http_proxy_v2_st_payload: - case ngx_http_proxy_v2_st_padding: - break; - } - } - - b->pos = p; - ctx->state = state; - - return NGX_AGAIN; -} - - -static ngx_int_t -ngx_http_proxy_v2_parse_header(ngx_http_request_t *r, - ngx_http_proxy_v2_ctx_t *ctx, ngx_buf_t *b) -{ - u_char ch, *p, *last; - size_t min; - ngx_int_t rc; - enum { - sw_start = 0, - sw_padding_length, - sw_dependency, - sw_dependency_2, - sw_dependency_3, - sw_dependency_4, - sw_weight, - sw_fragment, - sw_padding - } state; - - state = ctx->frame_state; - - if (state == sw_start) { - - ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "http proxy parse header: start"); - - if (ctx->type == NGX_HTTP_V2_HEADERS_FRAME) { - ctx->parsing_headers = 1; - ctx->fragment_state = 0; - - min = (ctx->flags & NGX_HTTP_V2_PADDED_FLAG ? 1 : 0) - + (ctx->flags & NGX_HTTP_V2_PRIORITY_FLAG ? 5 : 0); - - if (ctx->rest < min) { - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "upstream sent headers frame " - "with invalid length: %uz", - ctx->rest); - return NGX_ERROR; - } - - if (ctx->flags & NGX_HTTP_V2_END_STREAM_FLAG) { - ctx->end_stream = 1; - } - - if (ctx->flags & NGX_HTTP_V2_PADDED_FLAG) { - state = sw_padding_length; - - } else if (ctx->flags & NGX_HTTP_V2_PRIORITY_FLAG) { - state = sw_dependency; - - } else { - state = sw_fragment; - } - - } else if (ctx->type == NGX_HTTP_V2_CONTINUATION_FRAME) { - state = sw_fragment; - } - - ctx->padding = 0; - ctx->frame_state = state; - } - - if (state < sw_fragment) { - - if (b->last - b->pos < (ssize_t) ctx->rest) { - last = b->last; - - } else { - last = b->pos + ctx->rest; - } - - for (p = b->pos; p < last; p++) { - ch = *p; - -#if 0 - ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "http proxy header byte: %02Xd s:%d", ch, state); -#endif - - /* - * headers frame: - * - * +---------------+ - * |Pad Length? (8)| - * +-+-------------+----------------------------------------------+ - * |E| Stream Dependency? (31) | - * +-+-------------+----------------------------------------------+ - * | Weight? (8) | - * +-+-------------+----------------------------------------------+ - * | Header Block Fragment (*) ... - * +--------------------------------------------------------------+ - * | Padding (*) ... - * +--------------------------------------------------------------+ - */ - - switch (state) { - - case sw_padding_length: - - ctx->padding = ch; - - if (ctx->flags & NGX_HTTP_V2_PRIORITY_FLAG) { - state = sw_dependency; - break; - } - - goto fragment; - - case sw_dependency: - state = sw_dependency_2; - break; - - case sw_dependency_2: - state = sw_dependency_3; - break; - - case sw_dependency_3: - state = sw_dependency_4; - break; - - case sw_dependency_4: - state = sw_weight; - break; - - case sw_weight: - goto fragment; - - /* suppress warning */ - case sw_start: - case sw_fragment: - case sw_padding: - break; - } - } - - ctx->rest -= p - b->pos; - b->pos = p; - - ctx->frame_state = state; - return NGX_AGAIN; - - fragment: - - p++; - ctx->rest -= p - b->pos; - b->pos = p; - - if (ctx->padding > ctx->rest) { - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "upstream sent http2 frame with too long " - "padding: %d in frame %uz", - ctx->padding, ctx->rest); - return NGX_ERROR; - } - - state = sw_fragment; - ctx->frame_state = state; - } - - if (state == sw_fragment) { - - rc = ngx_http_proxy_v2_parse_fragment(r, ctx, b); - - if (rc == NGX_AGAIN) { - return NGX_AGAIN; - } - - if (rc == NGX_ERROR) { - return NGX_ERROR; - } - - if (rc == NGX_OK) { - return NGX_OK; - } - - /* rc == NGX_DONE */ - - state = sw_padding; - ctx->frame_state = state; - } - - if (state == sw_padding) { - - if (b->last - b->pos < (ssize_t) ctx->rest) { - - ctx->rest -= b->last - b->pos; - b->pos = b->last; - - return NGX_AGAIN; - } - - b->pos += ctx->rest; - ctx->rest = 0; - - ctx->state = ngx_http_proxy_v2_st_start; - - if (ctx->flags & NGX_HTTP_V2_END_HEADERS_FLAG) { - - if (ctx->fragment_state) { - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "upstream sent truncated http2 header"); - return NGX_ERROR; - } - - ctx->parsing_headers = 0; - - return NGX_HTTP_PARSE_HEADER_DONE; - } - - return NGX_AGAIN; - } - - /* unreachable */ - - return NGX_ERROR; -} - - -static ngx_int_t -ngx_http_proxy_v2_parse_fragment(ngx_http_request_t *r, - ngx_http_proxy_v2_ctx_t *ctx, ngx_buf_t *b) -{ - u_char ch, *p, *last; - size_t size; - ngx_uint_t index, size_update; - enum { - sw_start = 0, - sw_index, - sw_name_length, - sw_name_length_2, - sw_name_length_3, - sw_name_length_4, - sw_name, - sw_name_bytes, - sw_value_length, - sw_value_length_2, - sw_value_length_3, - sw_value_length_4, - sw_value, - sw_value_bytes - } state; - - /* header block fragment */ - -#if 0 - ngx_log_debug3(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "http proxy header fragment %p:%p rest:%uz", - b->pos, b->last, ctx->rest); -#endif - - if (b->last - b->pos < (ssize_t) ctx->rest - ctx->padding) { - last = b->last; - - } else { - last = b->pos + ctx->rest - ctx->padding; - } - - state = ctx->fragment_state; - - for (p = b->pos; p < last; p++) { - ch = *p; - -#if 0 - ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "http proxy header byte: %02Xd s:%d", ch, state); -#endif - - switch (state) { - - case sw_start: - ctx->index = 0; - - if ((ch & 0x80) == 0x80) { - /* - * indexed header: - * - * 0 1 2 3 4 5 6 7 - * +---+---+---+---+---+---+---+---+ - * | 1 | Index (7+) | - * +---+---------------------------+ - */ - - index = ch & ~0x80; - - if (index == 0 || index > 61) { - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "upstream sent invalid http2 " - "table index: %ui", index); - return NGX_ERROR; - } - - ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "http proxy indexed header: %ui", index); - - ctx->index = index; - ctx->literal = 0; - - goto done; - - } else if ((ch & 0xc0) == 0x40) { - /* - * literal header with incremental indexing: - * - * 0 1 2 3 4 5 6 7 - * +---+---+---+---+---+---+---+---+ - * | 0 | 1 | Index (6+) | - * +---+---+-----------------------+ - * | H | Value Length (7+) | - * +---+---------------------------+ - * | Value String (Length octets) | - * +-------------------------------+ - * - * 0 1 2 3 4 5 6 7 - * +---+---+---+---+---+---+---+---+ - * | 0 | 1 | 0 | - * +---+---+-----------------------+ - * | H | Name Length (7+) | - * +---+---------------------------+ - * | Name String (Length octets) | - * +---+---------------------------+ - * | H | Value Length (7+) | - * +---+---------------------------+ - * | Value String (Length octets) | - * +-------------------------------+ - */ - - index = ch & ~0xc0; - - if (index > 61) { - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "upstream sent invalid http2 " - "table index: %ui", index); - return NGX_ERROR; - } - - ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "http proxy literal header: %ui", index); - - if (index == 0) { - state = sw_name_length; - break; - } - - ctx->index = index; - ctx->literal = 1; - - state = sw_value_length; - break; - - } else if ((ch & 0xe0) == 0x20) { - /* - * dynamic table size update: - * - * 0 1 2 3 4 5 6 7 - * +---+---+---+---+---+---+---+---+ - * | 0 | 0 | 1 | Max size (5+) | - * +---+---------------------------+ - */ - - size_update = ch & ~0xe0; - - if (size_update > 0) { - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "upstream sent invalid http2 " - "dynamic table size update: %ui", - size_update); - return NGX_ERROR; - } - - ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "http proxy table size update: %ui", - size_update); - - break; - - } else if ((ch & 0xf0) == 0x10) { - /* - * literal header field never indexed: - * - * 0 1 2 3 4 5 6 7 - * +---+---+---+---+---+---+---+---+ - * | 0 | 0 | 0 | 1 | Index (4+) | - * +---+---+-----------------------+ - * | H | Value Length (7+) | - * +---+---------------------------+ - * | Value String (Length octets) | - * +-------------------------------+ - * - * 0 1 2 3 4 5 6 7 - * +---+---+---+---+---+---+---+---+ - * | 0 | 0 | 0 | 1 | 0 | - * +---+---+-----------------------+ - * | H | Name Length (7+) | - * +---+---------------------------+ - * | Name String (Length octets) | - * +---+---------------------------+ - * | H | Value Length (7+) | - * +---+---------------------------+ - * | Value String (Length octets) | - * +-------------------------------+ - */ - - index = ch & ~0xf0; - - if (index == 0x0f) { - ctx->index = index; - ctx->literal = 1; - state = sw_index; - break; - } - - if (index == 0) { - state = sw_name_length; - break; - } - - ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "http proxy literal header never indexed: %ui", - index); - - ctx->index = index; - ctx->literal = 1; - - state = sw_value_length; - break; - - } else if ((ch & 0xf0) == 0x00) { - /* - * literal header field without indexing: - * - * 0 1 2 3 4 5 6 7 - * +---+---+---+---+---+---+---+---+ - * | 0 | 0 | 0 | 0 | Index (4+) | - * +---+---+-----------------------+ - * | H | Value Length (7+) | - * +---+---------------------------+ - * | Value String (Length octets) | - * +-------------------------------+ - * - * 0 1 2 3 4 5 6 7 - * +---+---+---+---+---+---+---+---+ - * | 0 | 0 | 0 | 0 | 0 | - * +---+---+-----------------------+ - * | H | Name Length (7+) | - * +---+---------------------------+ - * | Name String (Length octets) | - * +---+---------------------------+ - * | H | Value Length (7+) | - * +---+---------------------------+ - * | Value String (Length octets) | - * +-------------------------------+ - */ - - index = ch & ~0xf0; - - if (index == 0x0f) { - ctx->index = index; - ctx->literal = 1; - state = sw_index; - break; - } - - if (index == 0) { - state = sw_name_length; - break; - } - - ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "http proxy literal header without indexing: %ui", - index); - - ctx->index = index; - ctx->literal = 1; - - state = sw_value_length; - break; - } - - /* not reached */ - - return NGX_ERROR; - - case sw_index: - ctx->index = ctx->index + (ch & ~0x80); - - if (ch & 0x80) { - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "upstream sent http2 table index " - "with continuation flag"); - return NGX_ERROR; - } - - if (ctx->index > 61) { - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "upstream sent invalid http2 " - "table index: %ui", ctx->index); - return NGX_ERROR; - } - - ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "http proxy header index: %ui", ctx->index); - - state = sw_value_length; - break; - - case sw_name_length: - ctx->field_huffman = ch & 0x80 ? 1 : 0; - ctx->field_length = ch & ~0x80; - - if (ctx->field_length == 0x7f) { - state = sw_name_length_2; - break; - } - - if (ctx->field_length == 0) { - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "upstream sent zero http2 " - "header name length"); - return NGX_ERROR; - } - - state = sw_name; - break; - - case sw_name_length_2: - ctx->field_length += ch & ~0x80; - - if (ch & 0x80) { - state = sw_name_length_3; - break; - } - - state = sw_name; - break; - - case sw_name_length_3: - ctx->field_length += (ch & ~0x80) << 7; - - if (ch & 0x80) { - state = sw_name_length_4; - break; - } - - state = sw_name; - break; - - case sw_name_length_4: - ctx->field_length += (ch & ~0x80) << 14; - - if (ch & 0x80) { - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "upstream sent too large http2 " - "header name length"); - return NGX_ERROR; - } - - state = sw_name; - break; - - case sw_name: - ctx->name.len = ctx->field_huffman ? - ctx->field_length * 8 / 5 : ctx->field_length; - - ctx->name.data = ngx_pnalloc(r->pool, ctx->name.len + 1); - if (ctx->name.data == NULL) { - return NGX_ERROR; - } - - ctx->field_end = ctx->name.data; - ctx->field_rest = ctx->field_length; - ctx->field_state = 0; - - state = sw_name_bytes; - - /* fall through */ - - case sw_name_bytes: - - ngx_log_debug4(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "http proxy name: len:%uz h:%d last:%uz, rest:%uz", - ctx->field_length, - ctx->field_huffman, - last - p, - ctx->rest - (p - b->pos)); - - size = ngx_min(last - p, (ssize_t) ctx->field_rest); - ctx->field_rest -= size; - - if (ctx->field_huffman) { - if (ngx_http_huff_decode(&ctx->field_state, p, size, - &ctx->field_end, - ctx->field_rest == 0, - r->connection->log) - != NGX_OK) - { - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "upstream sent invalid encoded header"); - return NGX_ERROR; - } - - ctx->name.len = ctx->field_end - ctx->name.data; - ctx->name.data[ctx->name.len] = '\0'; - - } else { - ctx->field_end = ngx_cpymem(ctx->field_end, p, size); - ctx->name.data[ctx->name.len] = '\0'; - } - - p += size - 1; - - if (ctx->field_rest == 0) { - state = sw_value_length; - } - - break; - - case sw_value_length: - ctx->field_huffman = ch & 0x80 ? 1 : 0; - ctx->field_length = ch & ~0x80; - - if (ctx->field_length == 0x7f) { - state = sw_value_length_2; - break; - } - - if (ctx->field_length == 0) { - ngx_str_set(&ctx->value, ""); - goto done; - } - - state = sw_value; - break; - - case sw_value_length_2: - ctx->field_length += ch & ~0x80; - - if (ch & 0x80) { - state = sw_value_length_3; - break; - } - - state = sw_value; - break; - - case sw_value_length_3: - ctx->field_length += (ch & ~0x80) << 7; - - if (ch & 0x80) { - state = sw_value_length_4; - break; - } - - state = sw_value; - break; - - case sw_value_length_4: - ctx->field_length += (ch & ~0x80) << 14; - - if (ch & 0x80) { - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "upstream sent too large http2 " - "header value length"); - return NGX_ERROR; - } - - state = sw_value; - break; - - case sw_value: - ctx->value.len = ctx->field_huffman ? - ctx->field_length * 8 / 5 : ctx->field_length; - - ctx->value.data = ngx_pnalloc(r->pool, ctx->value.len + 1); - if (ctx->value.data == NULL) { - return NGX_ERROR; - } - - ctx->field_end = ctx->value.data; - ctx->field_rest = ctx->field_length; - ctx->field_state = 0; - - state = sw_value_bytes; - - /* fall through */ - - case sw_value_bytes: - - ngx_log_debug4(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "http proxy value: len:%uz h:%d last:%uz, rest:%uz", - ctx->field_length, - ctx->field_huffman, - last - p, - ctx->rest - (p - b->pos)); - - size = ngx_min(last - p, (ssize_t) ctx->field_rest); - ctx->field_rest -= size; - - if (ctx->field_huffman) { - if (ngx_http_huff_decode(&ctx->field_state, p, size, - &ctx->field_end, - ctx->field_rest == 0, - r->connection->log) - != NGX_OK) - { - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "upstream sent invalid encoded header"); - return NGX_ERROR; - } - - ctx->value.len = ctx->field_end - ctx->value.data; - ctx->value.data[ctx->value.len] = '\0'; - - } else { - ctx->field_end = ngx_cpymem(ctx->field_end, p, size); - ctx->value.data[ctx->value.len] = '\0'; - } - - p += size - 1; - - if (ctx->field_rest == 0) { - goto done; - } - - break; - } - - continue; - - done: - - p++; - ctx->rest -= p - b->pos; - ctx->fragment_state = sw_start; - b->pos = p; - - if (ctx->index) { - ctx->name = *ngx_http_v2_get_static_name(ctx->index); - } - - if (ctx->index && !ctx->literal) { - ctx->value = *ngx_http_v2_get_static_value(ctx->index); - } - - if (!ctx->index) { - if (ngx_http_proxy_v2_validate_header_name(r, &ctx->name) - != NGX_OK) - { - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "upstream sent invalid header: \"%V: %V\"", - &ctx->name, &ctx->value); - return NGX_ERROR; - } - } - - if (!ctx->index || ctx->literal) { - if (ngx_http_proxy_v2_validate_header_value(r, &ctx->value) - != NGX_OK) - { - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "upstream sent invalid header: \"%V: %V\"", - &ctx->name, &ctx->value); - return NGX_ERROR; - } - } - - return NGX_OK; - } - - ctx->rest -= p - b->pos; - ctx->fragment_state = state; - b->pos = p; - - if (ctx->rest > ctx->padding) { - return NGX_AGAIN; - } - - return NGX_DONE; -} - - -static ngx_int_t -ngx_http_proxy_v2_validate_header_name(ngx_http_request_t *r, ngx_str_t *s) -{ - u_char ch; - ngx_uint_t i; - - for (i = 0; i < s->len; i++) { - ch = s->data[i]; - - if (ch == ':' && i > 0) { - return NGX_ERROR; - } - - if (ch >= 'A' && ch <= 'Z') { - return NGX_ERROR; - } - - if (ch <= 0x20 || ch == 0x7f) { - return NGX_ERROR; - } - } - - return NGX_OK; -} - - -static ngx_int_t -ngx_http_proxy_v2_validate_header_value(ngx_http_request_t *r, ngx_str_t *s) -{ - u_char ch; - ngx_uint_t i; - - for (i = 0; i < s->len; i++) { - ch = s->data[i]; - - if (ch == '\0' || ch == CR || ch == LF) { - return NGX_ERROR; - } - } - - return NGX_OK; -} - - -static ngx_int_t -ngx_http_proxy_v2_parse_rst_stream(ngx_http_request_t *r, - ngx_http_proxy_v2_ctx_t *ctx, ngx_buf_t *b) -{ - u_char ch, *p, *last; - enum { - sw_start = 0, - sw_error_2, - sw_error_3, - sw_error_4 - } state; - - if (b->last - b->pos < (ssize_t) ctx->rest) { - last = b->last; - - } else { - last = b->pos + ctx->rest; - } - - state = ctx->frame_state; - - if (state == sw_start) { - if (ctx->rest != 4) { - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "upstream sent rst stream frame " - "with invalid length: %uz", - ctx->rest); - return NGX_ERROR; - } - } - - for (p = b->pos; p < last; p++) { - ch = *p; - -#if 0 - ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "http proxy rst byte: %02Xd s:%d", ch, state); -#endif - - switch (state) { - - case sw_start: - ctx->error = (ngx_uint_t) ch << 24; - state = sw_error_2; - break; - - case sw_error_2: - ctx->error |= ch << 16; - state = sw_error_3; - break; - - case sw_error_3: - ctx->error |= ch << 8; - state = sw_error_4; - break; - - case sw_error_4: - ctx->error |= ch; - state = sw_start; - - ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "http proxy error: %ui", ctx->error); - - break; - } - } - - ctx->rest -= p - b->pos; - ctx->frame_state = state; - b->pos = p; - - if (ctx->rest > 0) { - return NGX_AGAIN; - } - - ctx->state = ngx_http_proxy_v2_st_start; - - return NGX_OK; -} - - -static ngx_int_t -ngx_http_proxy_v2_parse_goaway(ngx_http_request_t *r, - ngx_http_proxy_v2_ctx_t *ctx, ngx_buf_t *b) -{ - u_char ch, *p, *last; - enum { - sw_start = 0, - sw_last_stream_id_2, - sw_last_stream_id_3, - sw_last_stream_id_4, - sw_error, - sw_error_2, - sw_error_3, - sw_error_4, - sw_debug - } state; - - if (b->last - b->pos < (ssize_t) ctx->rest) { - last = b->last; - - } else { - last = b->pos + ctx->rest; - } - - state = ctx->frame_state; - - if (state == sw_start) { - - if (ctx->stream_id) { - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "upstream sent goaway frame " - "with non-zero stream id: %ui", - ctx->stream_id); - return NGX_ERROR; - } - - if (ctx->rest < 8) { - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "upstream sent goaway frame " - "with invalid length: %uz", - ctx->rest); - return NGX_ERROR; - } - } - - for (p = b->pos; p < last; p++) { - ch = *p; - -#if 0 - ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "http proxy goaway byte: %02Xd s:%d", ch, state); -#endif - - switch (state) { - - case sw_start: - ctx->stream_id = (ch & 0x7f) << 24; - state = sw_last_stream_id_2; - break; - - case sw_last_stream_id_2: - ctx->stream_id |= ch << 16; - state = sw_last_stream_id_3; - break; - - case sw_last_stream_id_3: - ctx->stream_id |= ch << 8; - state = sw_last_stream_id_4; - break; - - case sw_last_stream_id_4: - ctx->stream_id |= ch; - state = sw_error; - break; - - case sw_error: - ctx->error = (ngx_uint_t) ch << 24; - state = sw_error_2; - break; - - case sw_error_2: - ctx->error |= ch << 16; - state = sw_error_3; - break; - - case sw_error_3: - ctx->error |= ch << 8; - state = sw_error_4; - break; - - case sw_error_4: - ctx->error |= ch; - state = sw_debug; - break; - - case sw_debug: - break; - } - } - - ctx->rest -= p - b->pos; - ctx->frame_state = state; - b->pos = p; - - if (ctx->rest > 0) { - return NGX_AGAIN; - } - - ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "http proxy goaway: %ui, stream %ui", - ctx->error, ctx->stream_id); - - ctx->state = ngx_http_proxy_v2_st_start; - - return NGX_OK; -} - - -static ngx_int_t -ngx_http_proxy_v2_parse_window_update(ngx_http_request_t *r, - ngx_http_proxy_v2_ctx_t *ctx, ngx_buf_t *b) -{ - u_char ch, *p, *last; - enum { - sw_start = 0, - sw_size_2, - sw_size_3, - sw_size_4 - } state; - - if (b->last - b->pos < (ssize_t) ctx->rest) { - last = b->last; - - } else { - last = b->pos + ctx->rest; - } - - state = ctx->frame_state; - - if (state == sw_start) { - if (ctx->rest != 4) { - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "upstream sent window update frame " - "with invalid length: %uz", - ctx->rest); - return NGX_ERROR; - } - } - - for (p = b->pos; p < last; p++) { - ch = *p; - -#if 0 - ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "http proxy window update byte: %02Xd s:%d", ch, state); -#endif - - switch (state) { - - case sw_start: - ctx->window_update = (ch & 0x7f) << 24; - state = sw_size_2; - break; - - case sw_size_2: - ctx->window_update |= ch << 16; - state = sw_size_3; - break; - - case sw_size_3: - ctx->window_update |= ch << 8; - state = sw_size_4; - break; - - case sw_size_4: - ctx->window_update |= ch; - state = sw_start; - break; - } - } - - ctx->rest -= p - b->pos; - ctx->frame_state = state; - b->pos = p; - - if (ctx->rest > 0) { - return NGX_AGAIN; - } - - ctx->state = ngx_http_proxy_v2_st_start; - - ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "http proxy window update: %ui", ctx->window_update); - - if (ctx->stream_id) { - - if (ctx->window_update > (size_t) NGX_HTTP_V2_MAX_WINDOW - - ctx->send_window) - { - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "upstream sent too large window update"); - return NGX_ERROR; - } - - ctx->send_window += ctx->window_update; - - } else { - - if (ctx->window_update > NGX_HTTP_V2_MAX_WINDOW - - ctx->connection->send_window) - { - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "upstream sent too large window update"); - return NGX_ERROR; - } - - ctx->connection->send_window += ctx->window_update; - } - - return NGX_OK; -} - - -static ngx_int_t -ngx_http_proxy_v2_parse_settings(ngx_http_request_t *r, - ngx_http_proxy_v2_ctx_t *ctx, ngx_buf_t *b) -{ - u_char ch, *p, *last; - ssize_t window_update; - enum { - sw_start = 0, - sw_id, - sw_id_2, - sw_value, - sw_value_2, - sw_value_3, - sw_value_4 - } state; - - if (b->last - b->pos < (ssize_t) ctx->rest) { - last = b->last; - - } else { - last = b->pos + ctx->rest; - } - - state = ctx->frame_state; - - if (state == sw_start) { - - if (ctx->stream_id) { - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "upstream sent settings frame " - "with non-zero stream id: %ui", - ctx->stream_id); - return NGX_ERROR; - } - - if (ctx->flags & NGX_HTTP_V2_ACK_FLAG) { - ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "http proxy settings ack"); - - if (ctx->rest != 0) { - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "upstream sent settings frame " - "with ack flag and non-zero length: %uz", - ctx->rest); - return NGX_ERROR; - } - - ctx->state = ngx_http_proxy_v2_st_start; - - return NGX_OK; - } - - if (ctx->rest % 6 != 0) { - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "upstream sent settings frame " - "with invalid length: %uz", - ctx->rest); - return NGX_ERROR; - } - - if (ctx->free == NULL && ctx->settings++ > 1000) { - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "upstream sent too many settings frames"); - return NGX_ERROR; - } - } - - for (p = b->pos; p < last; p++) { - ch = *p; - -#if 0 - ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "http proxy settings byte: %02Xd s:%d", ch, state); -#endif - - switch (state) { - - case sw_start: - case sw_id: - ctx->setting_id = ch << 8; - state = sw_id_2; - break; - - case sw_id_2: - ctx->setting_id |= ch; - state = sw_value; - break; - - case sw_value: - ctx->setting_value = (ngx_uint_t) ch << 24; - state = sw_value_2; - break; - - case sw_value_2: - ctx->setting_value |= ch << 16; - state = sw_value_3; - break; - - case sw_value_3: - ctx->setting_value |= ch << 8; - state = sw_value_4; - break; - - case sw_value_4: - ctx->setting_value |= ch; - state = sw_id; - - ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "http proxy setting: %ui %ui", - ctx->setting_id, ctx->setting_value); - - /* - * The following settings are defined by the protocol: - * - * SETTINGS_HEADER_TABLE_SIZE, SETTINGS_ENABLE_PUSH, - * SETTINGS_MAX_CONCURRENT_STREAMS, SETTINGS_INITIAL_WINDOW_SIZE, - * SETTINGS_MAX_FRAME_SIZE, SETTINGS_MAX_HEADER_LIST_SIZE - * - * Only SETTINGS_INITIAL_WINDOW_SIZE seems to be needed in - * a simple client. - */ - - if (ctx->setting_id == 0x04) { - /* SETTINGS_INITIAL_WINDOW_SIZE */ - - if (ctx->setting_value > NGX_HTTP_V2_MAX_WINDOW) { - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "upstream sent settings frame " - "with too large initial window size: %ui", - ctx->setting_value); - return NGX_ERROR; - } - - window_update = ctx->setting_value - - ctx->connection->init_window; - ctx->connection->init_window = ctx->setting_value; - - if (ctx->send_window > 0 - && window_update > (ssize_t) NGX_HTTP_V2_MAX_WINDOW - - ctx->send_window) - { - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "upstream sent settings frame " - "with too large initial window size: %ui", - ctx->setting_value); - return NGX_ERROR; - } - - ctx->send_window += window_update; - } - - break; - } - } - - ctx->rest -= p - b->pos; - ctx->frame_state = state; - b->pos = p; - - if (ctx->rest > 0) { - return NGX_AGAIN; - } - - ctx->state = ngx_http_proxy_v2_st_start; - - return ngx_http_proxy_v2_send_settings_ack(r, ctx); -} - - -static ngx_int_t -ngx_http_proxy_v2_parse_ping(ngx_http_request_t *r, - ngx_http_proxy_v2_ctx_t *ctx, ngx_buf_t *b) -{ - u_char ch, *p, *last; - enum { - sw_start = 0, - sw_data_2, - sw_data_3, - sw_data_4, - sw_data_5, - sw_data_6, - sw_data_7, - sw_data_8 - } state; - - if (b->last - b->pos < (ssize_t) ctx->rest) { - last = b->last; - - } else { - last = b->pos + ctx->rest; - } - - state = ctx->frame_state; - - if (state == sw_start) { - - if (ctx->stream_id) { - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "upstream sent ping frame " - "with non-zero stream id: %ui", - ctx->stream_id); - return NGX_ERROR; - } - - if (ctx->rest != 8) { - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "upstream sent ping frame " - "with invalid length: %uz", - ctx->rest); - return NGX_ERROR; - } - - if (ctx->flags & NGX_HTTP_V2_ACK_FLAG) { - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "upstream sent ping frame with ack flag"); - return NGX_ERROR; - } - - if (ctx->free == NULL && ctx->pings++ > 1000) { - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "upstream sent too many ping frames"); - return NGX_ERROR; - } - } - - for (p = b->pos; p < last; p++) { - ch = *p; - -#if 0 - ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "http proxy ping byte: %02Xd s:%d", ch, state); -#endif - - if (state < sw_data_8) { - ctx->ping_data[state] = ch; - state++; - - } else { - ctx->ping_data[7] = ch; - state = sw_start; - - ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "http proxy ping"); - } - } - - ctx->rest -= p - b->pos; - ctx->frame_state = state; - b->pos = p; - - if (ctx->rest > 0) { - return NGX_AGAIN; - } - - ctx->state = ngx_http_proxy_v2_st_start; - - return ngx_http_proxy_v2_send_ping_ack(r, ctx); -} - - -static ngx_int_t -ngx_http_proxy_v2_send_settings_ack(ngx_http_request_t *r, - ngx_http_proxy_v2_ctx_t *ctx) -{ - ngx_chain_t *cl, **ll; - ngx_http_proxy_v2_frame_t *f; - - ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "http proxy send settings ack"); - - for (cl = ctx->out, ll = &ctx->out; cl; cl = cl->next) { - ll = &cl->next; - } - - cl = ngx_http_proxy_v2_get_buf(r, ctx); - if (cl == NULL) { - return NGX_ERROR; - } - - f = (ngx_http_proxy_v2_frame_t *) cl->buf->last; - cl->buf->last += sizeof(ngx_http_proxy_v2_frame_t); - - f->length_0 = 0; - f->length_1 = 0; - f->length_2 = 0; - f->type = NGX_HTTP_V2_SETTINGS_FRAME; - f->flags = NGX_HTTP_V2_ACK_FLAG; - f->stream_id_0 = 0; - f->stream_id_1 = 0; - f->stream_id_2 = 0; - f->stream_id_3 = 0; - - *ll = cl; - - return NGX_OK; -} - - -static ngx_int_t -ngx_http_proxy_v2_send_ping_ack(ngx_http_request_t *r, - ngx_http_proxy_v2_ctx_t *ctx) -{ - ngx_chain_t *cl, **ll; - ngx_http_proxy_v2_frame_t *f; - - ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "http proxy send ping ack"); - - for (cl = ctx->out, ll = &ctx->out; cl; cl = cl->next) { - ll = &cl->next; - } - - cl = ngx_http_proxy_v2_get_buf(r, ctx); - if (cl == NULL) { - return NGX_ERROR; - } - - f = (ngx_http_proxy_v2_frame_t *) cl->buf->last; - cl->buf->last += sizeof(ngx_http_proxy_v2_frame_t); - - f->length_0 = 0; - f->length_1 = 0; - f->length_2 = 8; - f->type = NGX_HTTP_V2_PING_FRAME; - f->flags = NGX_HTTP_V2_ACK_FLAG; - f->stream_id_0 = 0; - f->stream_id_1 = 0; - f->stream_id_2 = 0; - f->stream_id_3 = 0; - - cl->buf->last = ngx_copy(cl->buf->last, ctx->ping_data, 8); - - *ll = cl; - - return NGX_OK; -} - - -static ngx_int_t -ngx_http_proxy_v2_send_window_update(ngx_http_request_t *r, - ngx_http_proxy_v2_ctx_t *ctx) -{ - size_t n; - ngx_chain_t *cl, **ll; - ngx_http_proxy_v2_frame_t *f; - - ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "http proxy send window update: %uz %uz", - ctx->connection->recv_window, ctx->recv_window); - - for (cl = ctx->out, ll = &ctx->out; cl; cl = cl->next) { - ll = &cl->next; - } - - cl = ngx_http_proxy_v2_get_buf(r, ctx); - if (cl == NULL) { - return NGX_ERROR; - } - - f = (ngx_http_proxy_v2_frame_t *) cl->buf->last; - cl->buf->last += sizeof(ngx_http_proxy_v2_frame_t); - - f->length_0 = 0; - f->length_1 = 0; - f->length_2 = 4; - f->type = NGX_HTTP_V2_WINDOW_UPDATE_FRAME; - f->flags = 0; - f->stream_id_0 = 0; - f->stream_id_1 = 0; - f->stream_id_2 = 0; - f->stream_id_3 = 0; - - n = NGX_HTTP_V2_MAX_WINDOW - ctx->connection->recv_window; - ctx->connection->recv_window = NGX_HTTP_V2_MAX_WINDOW; - - *cl->buf->last++ = (u_char) ((n >> 24) & 0xff); - *cl->buf->last++ = (u_char) ((n >> 16) & 0xff); - *cl->buf->last++ = (u_char) ((n >> 8) & 0xff); - *cl->buf->last++ = (u_char) (n & 0xff); - - f = (ngx_http_proxy_v2_frame_t *) cl->buf->last; - cl->buf->last += sizeof(ngx_http_proxy_v2_frame_t); - - f->length_0 = 0; - f->length_1 = 0; - f->length_2 = 4; - f->type = NGX_HTTP_V2_WINDOW_UPDATE_FRAME; - f->flags = 0; - f->stream_id_0 = (u_char) ((ctx->id >> 24) & 0xff); - f->stream_id_1 = (u_char) ((ctx->id >> 16) & 0xff); - f->stream_id_2 = (u_char) ((ctx->id >> 8) & 0xff); - f->stream_id_3 = (u_char) (ctx->id & 0xff); - - n = NGX_HTTP_V2_MAX_WINDOW - ctx->recv_window; - ctx->recv_window = NGX_HTTP_V2_MAX_WINDOW; - - *cl->buf->last++ = (u_char) ((n >> 24) & 0xff); - *cl->buf->last++ = (u_char) ((n >> 16) & 0xff); - *cl->buf->last++ = (u_char) ((n >> 8) & 0xff); - *cl->buf->last++ = (u_char) (n & 0xff); - - *ll = cl; - - return NGX_OK; -} - - -static ngx_chain_t * -ngx_http_proxy_v2_get_buf(ngx_http_request_t *r, ngx_http_proxy_v2_ctx_t *ctx) -{ - u_char *start; - ngx_buf_t *b; - ngx_chain_t *cl; - - cl = ngx_chain_get_free_buf(r->pool, &ctx->free); - if (cl == NULL) { - return NULL; - } - - b = cl->buf; - start = b->start; - - if (start == NULL) { - - /* - * each buffer is large enough to hold two window update - * frames in a row - */ - - start = ngx_palloc(r->pool, 2 * sizeof(ngx_http_proxy_v2_frame_t) + 8); - if (start == NULL) { - return NULL; - } - - } - - ngx_memzero(b, sizeof(ngx_buf_t)); - - b->start = start; - b->pos = start; - b->last = start; - b->end = start + 2 * sizeof(ngx_http_proxy_v2_frame_t) + 8; - - b->tag = (ngx_buf_tag_t) &ngx_http_proxy_v2_body_output_filter; - b->temporary = 1; - b->flush = 1; - - return cl; -} - - -static ngx_http_proxy_v2_ctx_t * -ngx_http_proxy_v2_get_ctx(ngx_http_request_t *r) -{ - ngx_http_upstream_t *u; - ngx_http_proxy_v2_ctx_t *ctx; - - ctx = ngx_http_get_module_ctx(r, ngx_http_proxy_v2_module); - - if (ctx->connection == NULL) { - u = r->upstream; - - if (ngx_http_proxy_v2_get_connection_data(r, ctx, &u->peer) != NGX_OK) { - return NULL; - } - } - - return ctx; -} - - -static ngx_int_t -ngx_http_proxy_v2_get_connection_data(ngx_http_request_t *r, - ngx_http_proxy_v2_ctx_t *ctx, ngx_peer_connection_t *pc) -{ - ngx_connection_t *c; - ngx_pool_cleanup_t *cln; - - c = pc->connection; - - if (c == NULL) { - ctx->connection = ngx_palloc(r->pool, sizeof(ngx_http_proxy_v2_conn_t)); - if (ctx->connection == NULL) { - return NGX_ERROR; - } - - ctx->id = 0; - - goto done; - } - - if (pc->cached) { - - /* - * for cached connections, connection data can be found - * in the cleanup handler - */ - - for (cln = c->pool->cleanup; cln; cln = cln->next) { - if (cln->handler == ngx_http_proxy_v2_cleanup) { - ctx->connection = cln->data; - break; - } - } - - if (ctx->connection == NULL) { - ngx_log_error(NGX_LOG_ERR, c->log, 0, - "no connection data found for " - "keepalive http2 connection"); - return NGX_ERROR; - } - - ctx->send_window = ctx->connection->init_window; - ctx->recv_window = NGX_HTTP_V2_MAX_WINDOW; - - ctx->connection->last_stream_id += 2; - ctx->id = ctx->connection->last_stream_id; - - return NGX_OK; - } - - cln = ngx_pool_cleanup_add(c->pool, sizeof(ngx_http_proxy_v2_conn_t)); - if (cln == NULL) { - return NGX_ERROR; - } - - cln->handler = ngx_http_proxy_v2_cleanup; - ctx->connection = cln->data; - - ctx->id = 1; - -done: - - ctx->connection->init_window = NGX_HTTP_V2_DEFAULT_WINDOW; - ctx->connection->send_window = NGX_HTTP_V2_DEFAULT_WINDOW; - ctx->connection->recv_window = NGX_HTTP_V2_MAX_WINDOW; - - ctx->send_window = NGX_HTTP_V2_DEFAULT_WINDOW; - ctx->recv_window = NGX_HTTP_V2_MAX_WINDOW; - - ctx->connection->last_stream_id = 1; - - return NGX_OK; -} - - -static void -ngx_http_proxy_v2_cleanup(void *data) -{ -#if 0 - ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0, - "http proxy cleanup"); -#endif - return; -} - - -static void -ngx_http_proxy_v2_abort_request(ngx_http_request_t *r) -{ - ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "abort proxy http2 request"); - return; -} - - -static void -ngx_http_proxy_v2_finalize_request(ngx_http_request_t *r, ngx_int_t rc) -{ - ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "finalize proxy http2 request"); - return; -} diff --git a/src/deps/src/nginx-1.30.3/src/http/modules/ngx_http_random_index_module.c b/src/deps/src/nginx-1.30.3/src/http/modules/ngx_http_random_index_module.c deleted file mode 100644 index ed00ad53ca..0000000000 --- a/src/deps/src/nginx-1.30.3/src/http/modules/ngx_http_random_index_module.c +++ /dev/null @@ -1,317 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#include -#include -#include - - -typedef struct { - ngx_flag_t enable; -} ngx_http_random_index_loc_conf_t; - - -#define NGX_HTTP_RANDOM_INDEX_PREALLOCATE 50 - - -static ngx_int_t ngx_http_random_index_error(ngx_http_request_t *r, - ngx_dir_t *dir, ngx_str_t *name); -static ngx_int_t ngx_http_random_index_init(ngx_conf_t *cf); -static void *ngx_http_random_index_create_loc_conf(ngx_conf_t *cf); -static char *ngx_http_random_index_merge_loc_conf(ngx_conf_t *cf, - void *parent, void *child); - - -static ngx_command_t ngx_http_random_index_commands[] = { - - { ngx_string("random_index"), - NGX_HTTP_LOC_CONF|NGX_CONF_FLAG, - ngx_conf_set_flag_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_random_index_loc_conf_t, enable), - NULL }, - - ngx_null_command -}; - - -static ngx_http_module_t ngx_http_random_index_module_ctx = { - NULL, /* preconfiguration */ - ngx_http_random_index_init, /* postconfiguration */ - - NULL, /* create main configuration */ - NULL, /* init main configuration */ - - NULL, /* create server configuration */ - NULL, /* merge server configuration */ - - ngx_http_random_index_create_loc_conf, /* create location configuration */ - ngx_http_random_index_merge_loc_conf /* merge location configuration */ -}; - - -ngx_module_t ngx_http_random_index_module = { - NGX_MODULE_V1, - &ngx_http_random_index_module_ctx, /* module context */ - ngx_http_random_index_commands, /* module directives */ - NGX_HTTP_MODULE, /* module type */ - NULL, /* init master */ - NULL, /* init module */ - NULL, /* init process */ - NULL, /* init thread */ - NULL, /* exit thread */ - NULL, /* exit process */ - NULL, /* exit master */ - NGX_MODULE_V1_PADDING -}; - - -static ngx_int_t -ngx_http_random_index_handler(ngx_http_request_t *r) -{ - u_char *last, *filename; - size_t len, allocated, root; - ngx_err_t err; - ngx_int_t rc; - ngx_str_t path, uri, *name; - ngx_dir_t dir; - ngx_uint_t n, level; - ngx_array_t names; - ngx_http_random_index_loc_conf_t *rlcf; - - if (r->uri.data[r->uri.len - 1] != '/') { - return NGX_DECLINED; - } - - if (!(r->method & (NGX_HTTP_GET|NGX_HTTP_HEAD|NGX_HTTP_POST))) { - return NGX_DECLINED; - } - - rlcf = ngx_http_get_module_loc_conf(r, ngx_http_random_index_module); - - if (!rlcf->enable) { - return NGX_DECLINED; - } - -#if (NGX_HAVE_D_TYPE) - len = 0; -#else - len = NGX_HTTP_RANDOM_INDEX_PREALLOCATE; -#endif - - last = ngx_http_map_uri_to_path(r, &path, &root, len); - if (last == NULL) { - return NGX_HTTP_INTERNAL_SERVER_ERROR; - } - - allocated = path.len; - - path.len = last - path.data - 1; - path.data[path.len] = '\0'; - - ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "http random index: \"%s\"", path.data); - - if (ngx_open_dir(&path, &dir) == NGX_ERROR) { - err = ngx_errno; - - if (err == NGX_ENOENT - || err == NGX_ENOTDIR - || err == NGX_ENAMETOOLONG) - { - level = NGX_LOG_ERR; - rc = NGX_HTTP_NOT_FOUND; - - } else if (err == NGX_EACCES) { - level = NGX_LOG_ERR; - rc = NGX_HTTP_FORBIDDEN; - - } else { - level = NGX_LOG_CRIT; - rc = NGX_HTTP_INTERNAL_SERVER_ERROR; - } - - ngx_log_error(level, r->connection->log, err, - ngx_open_dir_n " \"%s\" failed", path.data); - - return rc; - } - - if (ngx_array_init(&names, r->pool, 32, sizeof(ngx_str_t)) != NGX_OK) { - return ngx_http_random_index_error(r, &dir, &path); - } - - filename = path.data; - filename[path.len] = '/'; - - for ( ;; ) { - ngx_set_errno(0); - - if (ngx_read_dir(&dir) == NGX_ERROR) { - err = ngx_errno; - - if (err != NGX_ENOMOREFILES) { - ngx_log_error(NGX_LOG_CRIT, r->connection->log, err, - ngx_read_dir_n " \"%V\" failed", &path); - return ngx_http_random_index_error(r, &dir, &path); - } - - break; - } - - ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "http random index file: \"%s\"", ngx_de_name(&dir)); - - if (ngx_de_name(&dir)[0] == '.') { - continue; - } - - len = ngx_de_namelen(&dir); - - if (dir.type == 0 || ngx_de_is_link(&dir)) { - - /* 1 byte for '/' and 1 byte for terminating '\0' */ - - if (path.len + 1 + len + 1 > allocated) { - allocated = path.len + 1 + len + 1 - + NGX_HTTP_RANDOM_INDEX_PREALLOCATE; - - filename = ngx_pnalloc(r->pool, allocated); - if (filename == NULL) { - return ngx_http_random_index_error(r, &dir, &path); - } - - last = ngx_cpystrn(filename, path.data, path.len + 1); - *last++ = '/'; - } - - ngx_cpystrn(last, ngx_de_name(&dir), len + 1); - - if (ngx_de_info(filename, &dir) == NGX_FILE_ERROR) { - err = ngx_errno; - - if (err != NGX_ENOENT) { - ngx_log_error(NGX_LOG_CRIT, r->connection->log, err, - ngx_de_info_n " \"%s\" failed", filename); - return ngx_http_random_index_error(r, &dir, &path); - } - - if (ngx_de_link_info(filename, &dir) == NGX_FILE_ERROR) { - ngx_log_error(NGX_LOG_CRIT, r->connection->log, ngx_errno, - ngx_de_link_info_n " \"%s\" failed", - filename); - return ngx_http_random_index_error(r, &dir, &path); - } - } - } - - if (!ngx_de_is_file(&dir)) { - continue; - } - - name = ngx_array_push(&names); - if (name == NULL) { - return ngx_http_random_index_error(r, &dir, &path); - } - - name->len = len; - - name->data = ngx_pnalloc(r->pool, len); - if (name->data == NULL) { - return ngx_http_random_index_error(r, &dir, &path); - } - - ngx_memcpy(name->data, ngx_de_name(&dir), len); - } - - if (ngx_close_dir(&dir) == NGX_ERROR) { - ngx_log_error(NGX_LOG_ALERT, r->connection->log, ngx_errno, - ngx_close_dir_n " \"%V\" failed", &path); - } - - n = names.nelts; - - if (n == 0) { - return NGX_DECLINED; - } - - name = names.elts; - - n = (ngx_uint_t) (((uint64_t) ngx_random() * n) / 0x80000000); - - uri.len = r->uri.len + name[n].len; - - uri.data = ngx_pnalloc(r->pool, uri.len); - if (uri.data == NULL) { - return NGX_HTTP_INTERNAL_SERVER_ERROR; - } - - last = ngx_copy(uri.data, r->uri.data, r->uri.len); - ngx_memcpy(last, name[n].data, name[n].len); - - return ngx_http_internal_redirect(r, &uri, &r->args); -} - - -static ngx_int_t -ngx_http_random_index_error(ngx_http_request_t *r, ngx_dir_t *dir, - ngx_str_t *name) -{ - if (ngx_close_dir(dir) == NGX_ERROR) { - ngx_log_error(NGX_LOG_ALERT, r->connection->log, ngx_errno, - ngx_close_dir_n " \"%V\" failed", name); - } - - return NGX_HTTP_INTERNAL_SERVER_ERROR; -} - - -static void * -ngx_http_random_index_create_loc_conf(ngx_conf_t *cf) -{ - ngx_http_random_index_loc_conf_t *conf; - - conf = ngx_palloc(cf->pool, sizeof(ngx_http_random_index_loc_conf_t)); - if (conf == NULL) { - return NULL; - } - - conf->enable = NGX_CONF_UNSET; - - return conf; -} - - -static char * -ngx_http_random_index_merge_loc_conf(ngx_conf_t *cf, void *parent, void *child) -{ - ngx_http_random_index_loc_conf_t *prev = parent; - ngx_http_random_index_loc_conf_t *conf = child; - - ngx_conf_merge_value(conf->enable, prev->enable, 0); - - return NGX_CONF_OK; -} - - -static ngx_int_t -ngx_http_random_index_init(ngx_conf_t *cf) -{ - ngx_http_handler_pt *h; - ngx_http_core_main_conf_t *cmcf; - - cmcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_core_module); - - h = ngx_array_push(&cmcf->phases[NGX_HTTP_CONTENT_PHASE].handlers); - if (h == NULL) { - return NGX_ERROR; - } - - *h = ngx_http_random_index_handler; - - return NGX_OK; -} diff --git a/src/deps/src/nginx-1.30.3/src/http/modules/ngx_http_range_filter_module.c b/src/deps/src/nginx-1.30.3/src/http/modules/ngx_http_range_filter_module.c deleted file mode 100644 index fec3642cf9..0000000000 --- a/src/deps/src/nginx-1.30.3/src/http/modules/ngx_http_range_filter_module.c +++ /dev/null @@ -1,999 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#include -#include -#include - - -/* - * the single part format: - * - * "HTTP/1.0 206 Partial Content" CRLF - * ... header ... - * "Content-Type: image/jpeg" CRLF - * "Content-Length: SIZE" CRLF - * "Content-Range: bytes START-END/SIZE" CRLF - * CRLF - * ... data ... - * - * - * the multipart format: - * - * "HTTP/1.0 206 Partial Content" CRLF - * ... header ... - * "Content-Type: multipart/byteranges; boundary=0123456789" CRLF - * CRLF - * CRLF - * "--0123456789" CRLF - * "Content-Type: image/jpeg" CRLF - * "Content-Range: bytes START0-END0/SIZE" CRLF - * CRLF - * ... data ... - * CRLF - * "--0123456789" CRLF - * "Content-Type: image/jpeg" CRLF - * "Content-Range: bytes START1-END1/SIZE" CRLF - * CRLF - * ... data ... - * CRLF - * "--0123456789--" CRLF - */ - - -typedef struct { - off_t start; - off_t end; - ngx_str_t content_range; -} ngx_http_range_t; - - -typedef struct { - off_t offset; - ngx_str_t boundary_header; - ngx_array_t ranges; -} ngx_http_range_filter_ctx_t; - - -static ngx_int_t ngx_http_range_parse(ngx_http_request_t *r, - ngx_http_range_filter_ctx_t *ctx, ngx_uint_t ranges); -static ngx_int_t ngx_http_range_singlepart_header(ngx_http_request_t *r, - ngx_http_range_filter_ctx_t *ctx); -static ngx_int_t ngx_http_range_multipart_header(ngx_http_request_t *r, - ngx_http_range_filter_ctx_t *ctx); -static ngx_int_t ngx_http_range_not_satisfiable(ngx_http_request_t *r); -static ngx_int_t ngx_http_range_test_overlapped(ngx_http_request_t *r, - ngx_http_range_filter_ctx_t *ctx, ngx_chain_t *in); -static ngx_int_t ngx_http_range_singlepart_body(ngx_http_request_t *r, - ngx_http_range_filter_ctx_t *ctx, ngx_chain_t *in); -static ngx_int_t ngx_http_range_multipart_body(ngx_http_request_t *r, - ngx_http_range_filter_ctx_t *ctx, ngx_chain_t *in); - -static ngx_int_t ngx_http_range_header_filter_init(ngx_conf_t *cf); -static ngx_int_t ngx_http_range_body_filter_init(ngx_conf_t *cf); - - -static ngx_http_module_t ngx_http_range_header_filter_module_ctx = { - NULL, /* preconfiguration */ - ngx_http_range_header_filter_init, /* postconfiguration */ - - NULL, /* create main configuration */ - NULL, /* init main configuration */ - - NULL, /* create server configuration */ - NULL, /* merge server configuration */ - - NULL, /* create location configuration */ - NULL, /* merge location configuration */ -}; - - -ngx_module_t ngx_http_range_header_filter_module = { - NGX_MODULE_V1, - &ngx_http_range_header_filter_module_ctx, /* module context */ - NULL, /* module directives */ - NGX_HTTP_MODULE, /* module type */ - NULL, /* init master */ - NULL, /* init module */ - NULL, /* init process */ - NULL, /* init thread */ - NULL, /* exit thread */ - NULL, /* exit process */ - NULL, /* exit master */ - NGX_MODULE_V1_PADDING -}; - - -static ngx_http_module_t ngx_http_range_body_filter_module_ctx = { - NULL, /* preconfiguration */ - ngx_http_range_body_filter_init, /* postconfiguration */ - - NULL, /* create main configuration */ - NULL, /* init main configuration */ - - NULL, /* create server configuration */ - NULL, /* merge server configuration */ - - NULL, /* create location configuration */ - NULL, /* merge location configuration */ -}; - - -ngx_module_t ngx_http_range_body_filter_module = { - NGX_MODULE_V1, - &ngx_http_range_body_filter_module_ctx, /* module context */ - NULL, /* module directives */ - NGX_HTTP_MODULE, /* module type */ - NULL, /* init master */ - NULL, /* init module */ - NULL, /* init process */ - NULL, /* init thread */ - NULL, /* exit thread */ - NULL, /* exit process */ - NULL, /* exit master */ - NGX_MODULE_V1_PADDING -}; - - -static ngx_http_output_header_filter_pt ngx_http_next_header_filter; -static ngx_http_output_body_filter_pt ngx_http_next_body_filter; - - -static ngx_int_t -ngx_http_range_header_filter(ngx_http_request_t *r) -{ - time_t if_range_time; - ngx_str_t *if_range, *etag; - ngx_uint_t ranges; - ngx_http_core_loc_conf_t *clcf; - ngx_http_range_filter_ctx_t *ctx; - - if (r->http_version < NGX_HTTP_VERSION_10 - || r->headers_out.status != NGX_HTTP_OK - || (r != r->main && !r->subrequest_ranges) - || r->headers_out.content_length_n == -1 - || !r->allow_ranges) - { - return ngx_http_next_header_filter(r); - } - - clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module); - - if (clcf->max_ranges == 0) { - return ngx_http_next_header_filter(r); - } - - if (r->headers_in.range == NULL - || r->headers_in.range->value.len < 7 - || ngx_strncasecmp(r->headers_in.range->value.data, - (u_char *) "bytes=", 6) - != 0) - { - goto next_filter; - } - - if (r->headers_in.if_range) { - - if_range = &r->headers_in.if_range->value; - - if (if_range->len >= 2 && if_range->data[if_range->len - 1] == '"') { - - if (r->headers_out.etag == NULL) { - goto next_filter; - } - - etag = &r->headers_out.etag->value; - - ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "http ir:%V etag:%V", if_range, etag); - - if (if_range->len != etag->len - || ngx_strncmp(if_range->data, etag->data, etag->len) != 0) - { - goto next_filter; - } - - goto parse; - } - - if (r->headers_out.last_modified_time == (time_t) -1) { - goto next_filter; - } - - if_range_time = ngx_parse_http_time(if_range->data, if_range->len); - - ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "http ir:%T lm:%T", - if_range_time, r->headers_out.last_modified_time); - - if (if_range_time != r->headers_out.last_modified_time) { - goto next_filter; - } - } - -parse: - - ctx = ngx_pcalloc(r->pool, sizeof(ngx_http_range_filter_ctx_t)); - if (ctx == NULL) { - return NGX_ERROR; - } - - ctx->offset = r->headers_out.content_offset; - - ranges = r->single_range ? 1 : clcf->max_ranges; - - switch (ngx_http_range_parse(r, ctx, ranges)) { - - case NGX_OK: - ngx_http_set_ctx(r, ctx, ngx_http_range_body_filter_module); - - r->headers_out.status = NGX_HTTP_PARTIAL_CONTENT; - r->headers_out.status_line.len = 0; - - if (ctx->ranges.nelts == 1) { - return ngx_http_range_singlepart_header(r, ctx); - } - - return ngx_http_range_multipart_header(r, ctx); - - case NGX_HTTP_RANGE_NOT_SATISFIABLE: - return ngx_http_range_not_satisfiable(r); - - case NGX_ERROR: - return NGX_ERROR; - - default: /* NGX_DECLINED */ - break; - } - -next_filter: - - r->headers_out.accept_ranges = ngx_list_push(&r->headers_out.headers); - if (r->headers_out.accept_ranges == NULL) { - return NGX_ERROR; - } - - r->headers_out.accept_ranges->hash = 1; - r->headers_out.accept_ranges->next = NULL; - ngx_str_set(&r->headers_out.accept_ranges->key, "Accept-Ranges"); - ngx_str_set(&r->headers_out.accept_ranges->value, "bytes"); - - return ngx_http_next_header_filter(r); -} - - -static ngx_int_t -ngx_http_range_parse(ngx_http_request_t *r, ngx_http_range_filter_ctx_t *ctx, - ngx_uint_t ranges) -{ - u_char *p; - off_t start, end, size, content_length, cutoff, - cutlim; - ngx_uint_t suffix, max_ranges; - ngx_http_range_t *range; - ngx_http_range_filter_ctx_t *mctx; - - if (r != r->main) { - mctx = ngx_http_get_module_ctx(r->main, - ngx_http_range_body_filter_module); - if (mctx) { - ctx->ranges = mctx->ranges; - return NGX_OK; - } - } - - if (ngx_array_init(&ctx->ranges, r->pool, 1, sizeof(ngx_http_range_t)) - != NGX_OK) - { - return NGX_ERROR; - } - - p = r->headers_in.range->value.data + 6; - size = 0; - max_ranges = ranges; - - content_length = r->headers_out.content_length_n; - - cutoff = NGX_MAX_OFF_T_VALUE / 10; - cutlim = NGX_MAX_OFF_T_VALUE % 10; - - for ( ;; ) { - start = 0; - end = 0; - suffix = 0; - - while (*p == ' ') { p++; } - - if (*p != '-') { - if (*p < '0' || *p > '9') { - return NGX_HTTP_RANGE_NOT_SATISFIABLE; - } - - while (*p >= '0' && *p <= '9') { - if (start >= cutoff && (start > cutoff || *p - '0' > cutlim)) { - return NGX_HTTP_RANGE_NOT_SATISFIABLE; - } - - start = start * 10 + (*p++ - '0'); - } - - while (*p == ' ') { p++; } - - if (*p++ != '-') { - return NGX_HTTP_RANGE_NOT_SATISFIABLE; - } - - while (*p == ' ') { p++; } - - if (*p == ',' || *p == '\0') { - end = content_length; - goto found; - } - - } else { - suffix = 1; - p++; - } - - if (*p < '0' || *p > '9') { - return NGX_HTTP_RANGE_NOT_SATISFIABLE; - } - - while (*p >= '0' && *p <= '9') { - if (end >= cutoff && (end > cutoff || *p - '0' > cutlim)) { - return NGX_HTTP_RANGE_NOT_SATISFIABLE; - } - - end = end * 10 + (*p++ - '0'); - } - - while (*p == ' ') { p++; } - - if (*p != ',' && *p != '\0') { - return NGX_HTTP_RANGE_NOT_SATISFIABLE; - } - - if (suffix) { - start = (end < content_length) ? content_length - end : 0; - end = content_length - 1; - } - - if (end >= content_length) { - end = content_length; - - } else { - end++; - } - - found: - - if (start < end) { - range = ngx_array_push(&ctx->ranges); - if (range == NULL) { - return NGX_ERROR; - } - - range->start = start; - range->end = end; - - if (size > NGX_MAX_OFF_T_VALUE - (end - start)) { - return NGX_HTTP_RANGE_NOT_SATISFIABLE; - } - - size += end - start; - - if (ranges-- == 0) { - return NGX_DECLINED; - } - - } else if (start == 0) { - return NGX_DECLINED; - } - - if (*p++ != ',') { - break; - } - } - - if (ctx->ranges.nelts == 0) { - return NGX_HTTP_RANGE_NOT_SATISFIABLE; - } - - if (ctx->ranges.nelts == 1) { - return NGX_OK; - } - - if (size > content_length) { - return NGX_DECLINED; - } - - if (max_ranges == NGX_MAX_INT32_VALUE) { - size += ctx->ranges.nelts * 256; - content_length += 4096; - - if (size > content_length) { - return NGX_DECLINED; - } - } - - return NGX_OK; -} - - -static ngx_int_t -ngx_http_range_singlepart_header(ngx_http_request_t *r, - ngx_http_range_filter_ctx_t *ctx) -{ - ngx_table_elt_t *content_range; - ngx_http_range_t *range; - - if (r != r->main) { - return ngx_http_next_header_filter(r); - } - - content_range = ngx_list_push(&r->headers_out.headers); - if (content_range == NULL) { - return NGX_ERROR; - } - - if (r->headers_out.content_range) { - r->headers_out.content_range->hash = 0; - } - - r->headers_out.content_range = content_range; - - content_range->hash = 1; - content_range->next = NULL; - ngx_str_set(&content_range->key, "Content-Range"); - - content_range->value.data = ngx_pnalloc(r->pool, - sizeof("bytes -/") - 1 + 3 * NGX_OFF_T_LEN); - if (content_range->value.data == NULL) { - content_range->hash = 0; - r->headers_out.content_range = NULL; - return NGX_ERROR; - } - - /* "Content-Range: bytes SSSS-EEEE/TTTT" header */ - - range = ctx->ranges.elts; - - content_range->value.len = ngx_sprintf(content_range->value.data, - "bytes %O-%O/%O", - range->start, range->end - 1, - r->headers_out.content_length_n) - - content_range->value.data; - - r->headers_out.content_length_n = range->end - range->start; - r->headers_out.content_offset = range->start; - - if (r->headers_out.content_length) { - r->headers_out.content_length->hash = 0; - r->headers_out.content_length = NULL; - } - - return ngx_http_next_header_filter(r); -} - - -static ngx_int_t -ngx_http_range_multipart_header(ngx_http_request_t *r, - ngx_http_range_filter_ctx_t *ctx) -{ - off_t len; - size_t size; - ngx_uint_t i; - ngx_http_range_t *range; - ngx_atomic_uint_t boundary; - - size = sizeof(CRLF "--") - 1 + NGX_ATOMIC_T_LEN - + sizeof(CRLF "Content-Type: ") - 1 - + r->headers_out.content_type.len - + sizeof(CRLF "Content-Range: bytes ") - 1; - - if (r->headers_out.content_type_len == r->headers_out.content_type.len - && r->headers_out.charset.len) - { - size += sizeof("; charset=") - 1 + r->headers_out.charset.len; - } - - ctx->boundary_header.data = ngx_pnalloc(r->pool, size); - if (ctx->boundary_header.data == NULL) { - return NGX_ERROR; - } - - boundary = ngx_next_temp_number(0); - - /* - * The boundary header of the range: - * CRLF - * "--0123456789" CRLF - * "Content-Type: image/jpeg" CRLF - * "Content-Range: bytes " - */ - - if (r->headers_out.content_type_len == r->headers_out.content_type.len - && r->headers_out.charset.len) - { - ctx->boundary_header.len = ngx_sprintf(ctx->boundary_header.data, - CRLF "--%0muA" CRLF - "Content-Type: %V; charset=%V" CRLF - "Content-Range: bytes ", - boundary, - &r->headers_out.content_type, - &r->headers_out.charset) - - ctx->boundary_header.data; - - } else if (r->headers_out.content_type.len) { - ctx->boundary_header.len = ngx_sprintf(ctx->boundary_header.data, - CRLF "--%0muA" CRLF - "Content-Type: %V" CRLF - "Content-Range: bytes ", - boundary, - &r->headers_out.content_type) - - ctx->boundary_header.data; - - } else { - ctx->boundary_header.len = ngx_sprintf(ctx->boundary_header.data, - CRLF "--%0muA" CRLF - "Content-Range: bytes ", - boundary) - - ctx->boundary_header.data; - } - - r->headers_out.content_type.data = - ngx_pnalloc(r->pool, - sizeof("Content-Type: multipart/byteranges; boundary=") - 1 - + NGX_ATOMIC_T_LEN); - - if (r->headers_out.content_type.data == NULL) { - return NGX_ERROR; - } - - r->headers_out.content_type_lowcase = NULL; - - /* "Content-Type: multipart/byteranges; boundary=0123456789" */ - - r->headers_out.content_type.len = - ngx_sprintf(r->headers_out.content_type.data, - "multipart/byteranges; boundary=%0muA", - boundary) - - r->headers_out.content_type.data; - - r->headers_out.content_type_len = r->headers_out.content_type.len; - - r->headers_out.charset.len = 0; - - /* the size of the last boundary CRLF "--0123456789--" CRLF */ - - len = sizeof(CRLF "--") - 1 + NGX_ATOMIC_T_LEN + sizeof("--" CRLF) - 1; - - range = ctx->ranges.elts; - for (i = 0; i < ctx->ranges.nelts; i++) { - - /* the size of the range: "SSSS-EEEE/TTTT" CRLF CRLF */ - - range[i].content_range.data = - ngx_pnalloc(r->pool, 3 * NGX_OFF_T_LEN + 2 + 4); - - if (range[i].content_range.data == NULL) { - return NGX_ERROR; - } - - range[i].content_range.len = ngx_sprintf(range[i].content_range.data, - "%O-%O/%O" CRLF CRLF, - range[i].start, range[i].end - 1, - r->headers_out.content_length_n) - - range[i].content_range.data; - - len += ctx->boundary_header.len + range[i].content_range.len - + (range[i].end - range[i].start); - } - - r->headers_out.content_length_n = len; - - if (r->headers_out.content_length) { - r->headers_out.content_length->hash = 0; - r->headers_out.content_length = NULL; - } - - if (r->headers_out.content_range) { - r->headers_out.content_range->hash = 0; - r->headers_out.content_range = NULL; - } - - return ngx_http_next_header_filter(r); -} - - -static ngx_int_t -ngx_http_range_not_satisfiable(ngx_http_request_t *r) -{ - ngx_table_elt_t *content_range; - - r->headers_out.status = NGX_HTTP_RANGE_NOT_SATISFIABLE; - - content_range = ngx_list_push(&r->headers_out.headers); - if (content_range == NULL) { - return NGX_ERROR; - } - - if (r->headers_out.content_range) { - r->headers_out.content_range->hash = 0; - } - - r->headers_out.content_range = content_range; - - content_range->hash = 1; - content_range->next = NULL; - ngx_str_set(&content_range->key, "Content-Range"); - - content_range->value.data = ngx_pnalloc(r->pool, - sizeof("bytes */") - 1 + NGX_OFF_T_LEN); - if (content_range->value.data == NULL) { - content_range->hash = 0; - r->headers_out.content_range = NULL; - return NGX_ERROR; - } - - content_range->value.len = ngx_sprintf(content_range->value.data, - "bytes */%O", - r->headers_out.content_length_n) - - content_range->value.data; - - ngx_http_clear_content_length(r); - - return NGX_HTTP_RANGE_NOT_SATISFIABLE; -} - - -static ngx_int_t -ngx_http_range_body_filter(ngx_http_request_t *r, ngx_chain_t *in) -{ - ngx_http_range_filter_ctx_t *ctx; - - if (in == NULL) { - return ngx_http_next_body_filter(r, in); - } - - ctx = ngx_http_get_module_ctx(r, ngx_http_range_body_filter_module); - - if (ctx == NULL) { - return ngx_http_next_body_filter(r, in); - } - - if (ctx->ranges.nelts == 1) { - return ngx_http_range_singlepart_body(r, ctx, in); - } - - /* - * multipart ranges are supported only if whole body is in a single buffer - */ - - if (ngx_buf_special(in->buf)) { - return ngx_http_next_body_filter(r, in); - } - - if (ngx_http_range_test_overlapped(r, ctx, in) != NGX_OK) { - return NGX_ERROR; - } - - return ngx_http_range_multipart_body(r, ctx, in); -} - - -static ngx_int_t -ngx_http_range_test_overlapped(ngx_http_request_t *r, - ngx_http_range_filter_ctx_t *ctx, ngx_chain_t *in) -{ - off_t start, last; - ngx_buf_t *buf; - ngx_uint_t i; - ngx_http_range_t *range; - - if (ctx->offset) { - goto overlapped; - } - - buf = in->buf; - - if (!buf->last_buf) { - start = ctx->offset; - last = ctx->offset + ngx_buf_size(buf); - - range = ctx->ranges.elts; - for (i = 0; i < ctx->ranges.nelts; i++) { - if (start > range[i].start || last < range[i].end) { - goto overlapped; - } - } - } - - ctx->offset = ngx_buf_size(buf); - - return NGX_OK; - -overlapped: - - ngx_log_error(NGX_LOG_ALERT, r->connection->log, 0, - "range in overlapped buffers"); - - return NGX_ERROR; -} - - -static ngx_int_t -ngx_http_range_singlepart_body(ngx_http_request_t *r, - ngx_http_range_filter_ctx_t *ctx, ngx_chain_t *in) -{ - off_t start, last; - ngx_int_t rc; - ngx_buf_t *buf; - ngx_chain_t *out, *cl, *tl, **ll; - ngx_http_range_t *range; - - out = NULL; - ll = &out; - range = ctx->ranges.elts; - - for (cl = in; cl; cl = cl->next) { - - buf = cl->buf; - - start = ctx->offset; - last = ctx->offset + ngx_buf_size(buf); - - ctx->offset = last; - - ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "http range body buf: %O-%O", start, last); - - if (ngx_buf_special(buf)) { - - if (range->end <= start) { - continue; - } - - tl = ngx_alloc_chain_link(r->pool); - if (tl == NULL) { - return NGX_ERROR; - } - - tl->buf = buf; - tl->next = NULL; - - *ll = tl; - ll = &tl->next; - - continue; - } - - if (range->end <= start || range->start >= last) { - - ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "http range body skip"); - - if (buf->in_file) { - buf->file_pos = buf->file_last; - } - - buf->pos = buf->last; - buf->sync = 1; - - continue; - } - - if (range->start > start) { - - if (buf->in_file) { - buf->file_pos += range->start - start; - } - - if (ngx_buf_in_memory(buf)) { - buf->pos += (size_t) (range->start - start); - } - } - - if (range->end <= last) { - - if (buf->in_file) { - buf->file_last -= last - range->end; - } - - if (ngx_buf_in_memory(buf)) { - buf->last -= (size_t) (last - range->end); - } - - buf->last_buf = (r == r->main) ? 1 : 0; - buf->last_in_chain = 1; - - tl = ngx_alloc_chain_link(r->pool); - if (tl == NULL) { - return NGX_ERROR; - } - - tl->buf = buf; - tl->next = NULL; - - *ll = tl; - ll = &tl->next; - - continue; - } - - tl = ngx_alloc_chain_link(r->pool); - if (tl == NULL) { - return NGX_ERROR; - } - - tl->buf = buf; - tl->next = NULL; - - *ll = tl; - ll = &tl->next; - } - - rc = ngx_http_next_body_filter(r, out); - - while (out) { - cl = out; - out = out->next; - ngx_free_chain(r->pool, cl); - } - - return rc; -} - - -static ngx_int_t -ngx_http_range_multipart_body(ngx_http_request_t *r, - ngx_http_range_filter_ctx_t *ctx, ngx_chain_t *in) -{ - ngx_buf_t *b, *buf; - ngx_uint_t i; - ngx_chain_t *out, *hcl, *rcl, *dcl, **ll; - ngx_http_range_t *range; - - ll = &out; - buf = in->buf; - range = ctx->ranges.elts; - - for (i = 0; i < ctx->ranges.nelts; i++) { - - /* - * The boundary header of the range: - * CRLF - * "--0123456789" CRLF - * "Content-Type: image/jpeg" CRLF - * "Content-Range: bytes " - */ - - b = ngx_calloc_buf(r->pool); - if (b == NULL) { - return NGX_ERROR; - } - - b->memory = 1; - b->pos = ctx->boundary_header.data; - b->last = ctx->boundary_header.data + ctx->boundary_header.len; - - hcl = ngx_alloc_chain_link(r->pool); - if (hcl == NULL) { - return NGX_ERROR; - } - - hcl->buf = b; - - - /* "SSSS-EEEE/TTTT" CRLF CRLF */ - - b = ngx_calloc_buf(r->pool); - if (b == NULL) { - return NGX_ERROR; - } - - b->temporary = 1; - b->pos = range[i].content_range.data; - b->last = range[i].content_range.data + range[i].content_range.len; - - rcl = ngx_alloc_chain_link(r->pool); - if (rcl == NULL) { - return NGX_ERROR; - } - - rcl->buf = b; - - - /* the range data */ - - b = ngx_calloc_buf(r->pool); - if (b == NULL) { - return NGX_ERROR; - } - - b->in_file = buf->in_file; - b->temporary = buf->temporary; - b->memory = buf->memory; - b->mmap = buf->mmap; - b->file = buf->file; - - if (buf->in_file) { - b->file_pos = buf->file_pos + range[i].start; - b->file_last = buf->file_pos + range[i].end; - } - - if (ngx_buf_in_memory(buf)) { - b->pos = buf->pos + (size_t) range[i].start; - b->last = buf->pos + (size_t) range[i].end; - } - - dcl = ngx_alloc_chain_link(r->pool); - if (dcl == NULL) { - return NGX_ERROR; - } - - dcl->buf = b; - - *ll = hcl; - hcl->next = rcl; - rcl->next = dcl; - ll = &dcl->next; - } - - /* the last boundary CRLF "--0123456789--" CRLF */ - - b = ngx_calloc_buf(r->pool); - if (b == NULL) { - return NGX_ERROR; - } - - b->temporary = 1; - b->last_buf = 1; - - b->pos = ngx_pnalloc(r->pool, sizeof(CRLF "--") - 1 + NGX_ATOMIC_T_LEN - + sizeof("--" CRLF) - 1); - if (b->pos == NULL) { - return NGX_ERROR; - } - - b->last = ngx_cpymem(b->pos, ctx->boundary_header.data, - sizeof(CRLF "--") - 1 + NGX_ATOMIC_T_LEN); - *b->last++ = '-'; *b->last++ = '-'; - *b->last++ = CR; *b->last++ = LF; - - hcl = ngx_alloc_chain_link(r->pool); - if (hcl == NULL) { - return NGX_ERROR; - } - - hcl->buf = b; - hcl->next = NULL; - - *ll = hcl; - - return ngx_http_next_body_filter(r, out); -} - - -static ngx_int_t -ngx_http_range_header_filter_init(ngx_conf_t *cf) -{ - ngx_http_next_header_filter = ngx_http_top_header_filter; - ngx_http_top_header_filter = ngx_http_range_header_filter; - - return NGX_OK; -} - - -static ngx_int_t -ngx_http_range_body_filter_init(ngx_conf_t *cf) -{ - ngx_http_next_body_filter = ngx_http_top_body_filter; - ngx_http_top_body_filter = ngx_http_range_body_filter; - - return NGX_OK; -} diff --git a/src/deps/src/nginx-1.30.3/src/http/modules/ngx_http_realip_module.c b/src/deps/src/nginx-1.30.3/src/http/modules/ngx_http_realip_module.c deleted file mode 100644 index f6731e7805..0000000000 --- a/src/deps/src/nginx-1.30.3/src/http/modules/ngx_http_realip_module.c +++ /dev/null @@ -1,621 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#include -#include -#include - - -#define NGX_HTTP_REALIP_XREALIP 0 -#define NGX_HTTP_REALIP_XFWD 1 -#define NGX_HTTP_REALIP_HEADER 2 -#define NGX_HTTP_REALIP_PROXY 3 - - -typedef struct { - ngx_array_t *from; /* array of ngx_cidr_t */ - ngx_uint_t type; - ngx_uint_t hash; - ngx_str_t header; - ngx_flag_t recursive; -} ngx_http_realip_loc_conf_t; - - -typedef struct { - ngx_connection_t *connection; - struct sockaddr *sockaddr; - socklen_t socklen; - ngx_str_t addr_text; -} ngx_http_realip_ctx_t; - - -static ngx_int_t ngx_http_realip_handler(ngx_http_request_t *r); -static ngx_int_t ngx_http_realip_set_addr(ngx_http_request_t *r, - ngx_addr_t *addr); -static void ngx_http_realip_cleanup(void *data); -static char *ngx_http_realip_from(ngx_conf_t *cf, ngx_command_t *cmd, - void *conf); -static char *ngx_http_realip(ngx_conf_t *cf, ngx_command_t *cmd, void *conf); -static void *ngx_http_realip_create_loc_conf(ngx_conf_t *cf); -static char *ngx_http_realip_merge_loc_conf(ngx_conf_t *cf, - void *parent, void *child); -static ngx_int_t ngx_http_realip_add_variables(ngx_conf_t *cf); -static ngx_int_t ngx_http_realip_init(ngx_conf_t *cf); -static ngx_http_realip_ctx_t *ngx_http_realip_get_module_ctx( - ngx_http_request_t *r); - - -static ngx_int_t ngx_http_realip_remote_addr_variable(ngx_http_request_t *r, - ngx_http_variable_value_t *v, uintptr_t data); -static ngx_int_t ngx_http_realip_remote_port_variable(ngx_http_request_t *r, - ngx_http_variable_value_t *v, uintptr_t data); - - -static ngx_command_t ngx_http_realip_commands[] = { - - { ngx_string("set_real_ip_from"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1, - ngx_http_realip_from, - NGX_HTTP_LOC_CONF_OFFSET, - 0, - NULL }, - - { ngx_string("real_ip_header"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1, - ngx_http_realip, - NGX_HTTP_LOC_CONF_OFFSET, - 0, - NULL }, - - { ngx_string("real_ip_recursive"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG, - ngx_conf_set_flag_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_realip_loc_conf_t, recursive), - NULL }, - - ngx_null_command -}; - - - -static ngx_http_module_t ngx_http_realip_module_ctx = { - ngx_http_realip_add_variables, /* preconfiguration */ - ngx_http_realip_init, /* postconfiguration */ - - NULL, /* create main configuration */ - NULL, /* init main configuration */ - - NULL, /* create server configuration */ - NULL, /* merge server configuration */ - - ngx_http_realip_create_loc_conf, /* create location configuration */ - ngx_http_realip_merge_loc_conf /* merge location configuration */ -}; - - -ngx_module_t ngx_http_realip_module = { - NGX_MODULE_V1, - &ngx_http_realip_module_ctx, /* module context */ - ngx_http_realip_commands, /* module directives */ - NGX_HTTP_MODULE, /* module type */ - NULL, /* init master */ - NULL, /* init module */ - NULL, /* init process */ - NULL, /* init thread */ - NULL, /* exit thread */ - NULL, /* exit process */ - NULL, /* exit master */ - NGX_MODULE_V1_PADDING -}; - - -static ngx_http_variable_t ngx_http_realip_vars[] = { - - { ngx_string("realip_remote_addr"), NULL, - ngx_http_realip_remote_addr_variable, 0, 0, 0 }, - - { ngx_string("realip_remote_port"), NULL, - ngx_http_realip_remote_port_variable, 0, 0, 0 }, - - ngx_http_null_variable -}; - - -static ngx_int_t -ngx_http_realip_handler(ngx_http_request_t *r) -{ - u_char *p; - size_t len; - ngx_str_t *value; - ngx_uint_t i, hash; - ngx_addr_t addr; - ngx_list_part_t *part; - ngx_table_elt_t *header, *xfwd; - ngx_connection_t *c; - ngx_http_realip_ctx_t *ctx; - ngx_http_realip_loc_conf_t *rlcf; - - rlcf = ngx_http_get_module_loc_conf(r, ngx_http_realip_module); - - if (rlcf->from == NULL) { - return NGX_DECLINED; - } - - ctx = ngx_http_realip_get_module_ctx(r); - - if (ctx) { - return NGX_DECLINED; - } - - switch (rlcf->type) { - - case NGX_HTTP_REALIP_XREALIP: - - if (r->headers_in.x_real_ip == NULL) { - return NGX_DECLINED; - } - - value = &r->headers_in.x_real_ip->value; - xfwd = NULL; - - break; - - case NGX_HTTP_REALIP_XFWD: - - xfwd = r->headers_in.x_forwarded_for; - - if (xfwd == NULL) { - return NGX_DECLINED; - } - - value = NULL; - - break; - - case NGX_HTTP_REALIP_PROXY: - - if (r->connection->proxy_protocol == NULL) { - return NGX_DECLINED; - } - - value = &r->connection->proxy_protocol->src_addr; - xfwd = NULL; - - break; - - default: /* NGX_HTTP_REALIP_HEADER */ - - part = &r->headers_in.headers.part; - header = part->elts; - - hash = rlcf->hash; - len = rlcf->header.len; - p = rlcf->header.data; - - for (i = 0; /* void */ ; i++) { - - if (i >= part->nelts) { - if (part->next == NULL) { - break; - } - - part = part->next; - header = part->elts; - i = 0; - } - - if (hash == header[i].hash - && len == header[i].key.len - && ngx_strncmp(p, header[i].lowcase_key, len) == 0) - { - value = &header[i].value; - xfwd = NULL; - - goto found; - } - } - - return NGX_DECLINED; - } - -found: - - c = r->connection; - - addr.sockaddr = c->sockaddr; - addr.socklen = c->socklen; - /* addr.name = c->addr_text; */ - - if (ngx_http_get_forwarded_addr(r, &addr, xfwd, value, rlcf->from, - rlcf->recursive) - != NGX_DECLINED) - { - if (rlcf->type == NGX_HTTP_REALIP_PROXY) { - ngx_inet_set_port(addr.sockaddr, c->proxy_protocol->src_port); - } - - return ngx_http_realip_set_addr(r, &addr); - } - - return NGX_DECLINED; -} - - -static ngx_int_t -ngx_http_realip_set_addr(ngx_http_request_t *r, ngx_addr_t *addr) -{ - size_t len; - u_char *p; - u_char text[NGX_SOCKADDR_STRLEN]; - ngx_connection_t *c; - ngx_pool_cleanup_t *cln; - ngx_http_realip_ctx_t *ctx; - - cln = ngx_pool_cleanup_add(r->pool, sizeof(ngx_http_realip_ctx_t)); - if (cln == NULL) { - return NGX_HTTP_INTERNAL_SERVER_ERROR; - } - - ctx = cln->data; - - c = r->connection; - - len = ngx_sock_ntop(addr->sockaddr, addr->socklen, text, - NGX_SOCKADDR_STRLEN, 0); - if (len == 0) { - return NGX_HTTP_INTERNAL_SERVER_ERROR; - } - - p = ngx_pnalloc(c->pool, len); - if (p == NULL) { - return NGX_HTTP_INTERNAL_SERVER_ERROR; - } - - ngx_memcpy(p, text, len); - - cln->handler = ngx_http_realip_cleanup; - ngx_http_set_ctx(r, ctx, ngx_http_realip_module); - - ctx->connection = c; - ctx->sockaddr = c->sockaddr; - ctx->socklen = c->socklen; - ctx->addr_text = c->addr_text; - - c->sockaddr = addr->sockaddr; - c->socklen = addr->socklen; - c->addr_text.len = len; - c->addr_text.data = p; - - return NGX_DECLINED; -} - - -static void -ngx_http_realip_cleanup(void *data) -{ - ngx_http_realip_ctx_t *ctx = data; - - ngx_connection_t *c; - - c = ctx->connection; - - c->sockaddr = ctx->sockaddr; - c->socklen = ctx->socklen; - c->addr_text = ctx->addr_text; -} - - -static char * -ngx_http_realip_from(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) -{ - ngx_http_realip_loc_conf_t *rlcf = conf; - - ngx_int_t rc; - ngx_str_t *value; - ngx_url_t u; - ngx_cidr_t c, *cidr; - ngx_uint_t i; - struct sockaddr_in *sin; -#if (NGX_HAVE_INET6) - struct sockaddr_in6 *sin6; -#endif - - value = cf->args->elts; - - if (rlcf->from == NULL) { - rlcf->from = ngx_array_create(cf->pool, 2, - sizeof(ngx_cidr_t)); - if (rlcf->from == NULL) { - return NGX_CONF_ERROR; - } - } - -#if (NGX_HAVE_UNIX_DOMAIN) - - if (ngx_strcmp(value[1].data, "unix:") == 0) { - cidr = ngx_array_push(rlcf->from); - if (cidr == NULL) { - return NGX_CONF_ERROR; - } - - cidr->family = AF_UNIX; - return NGX_CONF_OK; - } - -#endif - - rc = ngx_ptocidr(&value[1], &c); - - if (rc != NGX_ERROR) { - if (rc == NGX_DONE) { - ngx_conf_log_error(NGX_LOG_WARN, cf, 0, - "low address bits of %V are meaningless", - &value[1]); - } - - cidr = ngx_array_push(rlcf->from); - if (cidr == NULL) { - return NGX_CONF_ERROR; - } - - *cidr = c; - - return NGX_CONF_OK; - } - - ngx_memzero(&u, sizeof(ngx_url_t)); - u.host = value[1]; - - if (ngx_inet_resolve_host(cf->pool, &u) != NGX_OK) { - if (u.err) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "%s in set_real_ip_from \"%V\"", - u.err, &u.host); - } - - return NGX_CONF_ERROR; - } - - cidr = ngx_array_push_n(rlcf->from, u.naddrs); - if (cidr == NULL) { - return NGX_CONF_ERROR; - } - - ngx_memzero(cidr, u.naddrs * sizeof(ngx_cidr_t)); - - for (i = 0; i < u.naddrs; i++) { - cidr[i].family = u.addrs[i].sockaddr->sa_family; - - switch (cidr[i].family) { - -#if (NGX_HAVE_INET6) - case AF_INET6: - sin6 = (struct sockaddr_in6 *) u.addrs[i].sockaddr; - cidr[i].u.in6.addr = sin6->sin6_addr; - ngx_memset(cidr[i].u.in6.mask.s6_addr, 0xff, 16); - break; -#endif - - default: /* AF_INET */ - sin = (struct sockaddr_in *) u.addrs[i].sockaddr; - cidr[i].u.in.addr = sin->sin_addr.s_addr; - cidr[i].u.in.mask = 0xffffffff; - break; - } - } - - return NGX_CONF_OK; -} - - -static char * -ngx_http_realip(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) -{ - ngx_http_realip_loc_conf_t *rlcf = conf; - - ngx_str_t *value; - - if (rlcf->type != NGX_CONF_UNSET_UINT) { - return "is duplicate"; - } - - value = cf->args->elts; - - if (ngx_strcmp(value[1].data, "X-Real-IP") == 0) { - rlcf->type = NGX_HTTP_REALIP_XREALIP; - return NGX_CONF_OK; - } - - if (ngx_strcmp(value[1].data, "X-Forwarded-For") == 0) { - rlcf->type = NGX_HTTP_REALIP_XFWD; - return NGX_CONF_OK; - } - - if (ngx_strcmp(value[1].data, "proxy_protocol") == 0) { - rlcf->type = NGX_HTTP_REALIP_PROXY; - return NGX_CONF_OK; - } - - rlcf->type = NGX_HTTP_REALIP_HEADER; - rlcf->hash = ngx_hash_strlow(value[1].data, value[1].data, value[1].len); - rlcf->header = value[1]; - - return NGX_CONF_OK; -} - - -static void * -ngx_http_realip_create_loc_conf(ngx_conf_t *cf) -{ - ngx_http_realip_loc_conf_t *conf; - - conf = ngx_pcalloc(cf->pool, sizeof(ngx_http_realip_loc_conf_t)); - if (conf == NULL) { - return NULL; - } - - /* - * set by ngx_pcalloc(): - * - * conf->from = NULL; - * conf->hash = 0; - * conf->header = { 0, NULL }; - */ - - conf->type = NGX_CONF_UNSET_UINT; - conf->recursive = NGX_CONF_UNSET; - - return conf; -} - - -static char * -ngx_http_realip_merge_loc_conf(ngx_conf_t *cf, void *parent, void *child) -{ - ngx_http_realip_loc_conf_t *prev = parent; - ngx_http_realip_loc_conf_t *conf = child; - - if (conf->from == NULL) { - conf->from = prev->from; - } - - ngx_conf_merge_uint_value(conf->type, prev->type, NGX_HTTP_REALIP_XREALIP); - ngx_conf_merge_value(conf->recursive, prev->recursive, 0); - - if (conf->header.len == 0) { - conf->hash = prev->hash; - conf->header = prev->header; - } - - return NGX_CONF_OK; -} - - -static ngx_int_t -ngx_http_realip_add_variables(ngx_conf_t *cf) -{ - ngx_http_variable_t *var, *v; - - for (v = ngx_http_realip_vars; v->name.len; v++) { - var = ngx_http_add_variable(cf, &v->name, v->flags); - if (var == NULL) { - return NGX_ERROR; - } - - var->get_handler = v->get_handler; - var->data = v->data; - } - - return NGX_OK; -} - - -static ngx_int_t -ngx_http_realip_init(ngx_conf_t *cf) -{ - ngx_http_handler_pt *h; - ngx_http_core_main_conf_t *cmcf; - - cmcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_core_module); - - h = ngx_array_push(&cmcf->phases[NGX_HTTP_POST_READ_PHASE].handlers); - if (h == NULL) { - return NGX_ERROR; - } - - *h = ngx_http_realip_handler; - - h = ngx_array_push(&cmcf->phases[NGX_HTTP_PREACCESS_PHASE].handlers); - if (h == NULL) { - return NGX_ERROR; - } - - *h = ngx_http_realip_handler; - - return NGX_OK; -} - - -static ngx_http_realip_ctx_t * -ngx_http_realip_get_module_ctx(ngx_http_request_t *r) -{ - ngx_pool_cleanup_t *cln; - ngx_http_realip_ctx_t *ctx; - - ctx = ngx_http_get_module_ctx(r, ngx_http_realip_module); - - if (ctx == NULL && (r->internal || r->filter_finalize)) { - - /* - * if module context was reset, the original address - * can still be found in the cleanup handler - */ - - for (cln = r->pool->cleanup; cln; cln = cln->next) { - if (cln->handler == ngx_http_realip_cleanup) { - ctx = cln->data; - break; - } - } - } - - return ctx; -} - - -static ngx_int_t -ngx_http_realip_remote_addr_variable(ngx_http_request_t *r, - ngx_http_variable_value_t *v, uintptr_t data) -{ - ngx_str_t *addr_text; - ngx_http_realip_ctx_t *ctx; - - ctx = ngx_http_realip_get_module_ctx(r); - - addr_text = ctx ? &ctx->addr_text : &r->connection->addr_text; - - v->len = addr_text->len; - v->valid = 1; - v->no_cacheable = 0; - v->not_found = 0; - v->data = addr_text->data; - - return NGX_OK; -} - - -static ngx_int_t -ngx_http_realip_remote_port_variable(ngx_http_request_t *r, - ngx_http_variable_value_t *v, uintptr_t data) -{ - ngx_uint_t port; - struct sockaddr *sa; - ngx_http_realip_ctx_t *ctx; - - ctx = ngx_http_realip_get_module_ctx(r); - - sa = ctx ? ctx->sockaddr : r->connection->sockaddr; - - v->len = 0; - v->valid = 1; - v->no_cacheable = 0; - v->not_found = 0; - - v->data = ngx_pnalloc(r->pool, sizeof("65535") - 1); - if (v->data == NULL) { - return NGX_ERROR; - } - - port = ngx_inet_get_port(sa); - - if (port > 0 && port < 65536) { - v->len = ngx_sprintf(v->data, "%ui", port) - v->data; - } - - return NGX_OK; -} diff --git a/src/deps/src/nginx-1.30.3/src/http/modules/ngx_http_referer_module.c b/src/deps/src/nginx-1.30.3/src/http/modules/ngx_http_referer_module.c deleted file mode 100644 index 11a681b84d..0000000000 --- a/src/deps/src/nginx-1.30.3/src/http/modules/ngx_http_referer_module.c +++ /dev/null @@ -1,682 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#include -#include -#include - - -#define NGX_HTTP_REFERER_NO_URI_PART ((void *) 4) - - -typedef struct { - ngx_hash_combined_t hash; - -#if (NGX_PCRE) - ngx_array_t *regex; - ngx_array_t *server_name_regex; -#endif - - ngx_flag_t no_referer; - ngx_flag_t blocked_referer; - ngx_flag_t server_names; - - ngx_hash_keys_arrays_t *keys; - - ngx_uint_t referer_hash_max_size; - ngx_uint_t referer_hash_bucket_size; -} ngx_http_referer_conf_t; - - -static ngx_int_t ngx_http_referer_add_variables(ngx_conf_t *cf); -static void * ngx_http_referer_create_conf(ngx_conf_t *cf); -static char * ngx_http_referer_merge_conf(ngx_conf_t *cf, void *parent, - void *child); -static char *ngx_http_valid_referers(ngx_conf_t *cf, ngx_command_t *cmd, - void *conf); -static ngx_int_t ngx_http_add_referer(ngx_conf_t *cf, - ngx_hash_keys_arrays_t *keys, ngx_str_t *value, ngx_str_t *uri); -static ngx_int_t ngx_http_add_regex_referer(ngx_conf_t *cf, - ngx_http_referer_conf_t *rlcf, ngx_str_t *name); -#if (NGX_PCRE) -static ngx_int_t ngx_http_add_regex_server_name(ngx_conf_t *cf, - ngx_http_referer_conf_t *rlcf, ngx_http_regex_t *regex); -#endif -static int ngx_libc_cdecl ngx_http_cmp_referer_wildcards(const void *one, - const void *two); - - -static ngx_command_t ngx_http_referer_commands[] = { - - { ngx_string("valid_referers"), - NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE, - ngx_http_valid_referers, - NGX_HTTP_LOC_CONF_OFFSET, - 0, - NULL }, - - { ngx_string("referer_hash_max_size"), - NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1, - ngx_conf_set_num_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_referer_conf_t, referer_hash_max_size), - NULL }, - - { ngx_string("referer_hash_bucket_size"), - NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1, - ngx_conf_set_num_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_referer_conf_t, referer_hash_bucket_size), - NULL }, - - ngx_null_command -}; - - -static ngx_http_module_t ngx_http_referer_module_ctx = { - ngx_http_referer_add_variables, /* preconfiguration */ - NULL, /* postconfiguration */ - - NULL, /* create main configuration */ - NULL, /* init main configuration */ - - NULL, /* create server configuration */ - NULL, /* merge server configuration */ - - ngx_http_referer_create_conf, /* create location configuration */ - ngx_http_referer_merge_conf /* merge location configuration */ -}; - - -ngx_module_t ngx_http_referer_module = { - NGX_MODULE_V1, - &ngx_http_referer_module_ctx, /* module context */ - ngx_http_referer_commands, /* module directives */ - NGX_HTTP_MODULE, /* module type */ - NULL, /* init master */ - NULL, /* init module */ - NULL, /* init process */ - NULL, /* init thread */ - NULL, /* exit thread */ - NULL, /* exit process */ - NULL, /* exit master */ - NGX_MODULE_V1_PADDING -}; - - -static ngx_str_t ngx_http_invalid_referer_name = ngx_string("invalid_referer"); - - -static ngx_int_t -ngx_http_referer_variable(ngx_http_request_t *r, ngx_http_variable_value_t *v, - uintptr_t data) -{ - u_char *p, *ref, *last; - size_t len; - ngx_str_t *uri; - ngx_uint_t i, key; - ngx_http_referer_conf_t *rlcf; - u_char buf[256]; -#if (NGX_PCRE) - ngx_int_t rc; - ngx_str_t referer; -#endif - - rlcf = ngx_http_get_module_loc_conf(r, ngx_http_referer_module); - - if (rlcf->hash.hash.buckets == NULL - && rlcf->hash.wc_head == NULL - && rlcf->hash.wc_tail == NULL -#if (NGX_PCRE) - && rlcf->regex == NULL - && rlcf->server_name_regex == NULL -#endif - ) - { - goto valid; - } - - if (r->headers_in.referer == NULL) { - if (rlcf->no_referer) { - goto valid; - } - - goto invalid; - } - - len = r->headers_in.referer->value.len; - ref = r->headers_in.referer->value.data; - - if (len >= sizeof("http://i.ru") - 1) { - last = ref + len; - - if (ngx_strncasecmp(ref, (u_char *) "http://", 7) == 0) { - ref += 7; - len -= 7; - goto valid_scheme; - - } else if (ngx_strncasecmp(ref, (u_char *) "https://", 8) == 0) { - ref += 8; - len -= 8; - goto valid_scheme; - } - } - - if (rlcf->blocked_referer) { - goto valid; - } - - goto invalid; - -valid_scheme: - - i = 0; - key = 0; - - for (p = ref; p < last; p++) { - if (*p == '/' || *p == ':') { - break; - } - - if (i == 256) { - goto invalid; - } - - buf[i] = ngx_tolower(*p); - key = ngx_hash(key, buf[i++]); - } - - uri = ngx_hash_find_combined(&rlcf->hash, key, buf, p - ref); - - if (uri) { - goto uri; - } - -#if (NGX_PCRE) - - if (rlcf->server_name_regex) { - referer.len = p - ref; - referer.data = buf; - - rc = ngx_regex_exec_array(rlcf->server_name_regex, &referer, - r->connection->log); - - if (rc == NGX_OK) { - goto valid; - } - - if (rc == NGX_ERROR) { - return rc; - } - - /* NGX_DECLINED */ - } - - if (rlcf->regex) { - referer.len = len; - referer.data = ref; - - rc = ngx_regex_exec_array(rlcf->regex, &referer, r->connection->log); - - if (rc == NGX_OK) { - goto valid; - } - - if (rc == NGX_ERROR) { - return rc; - } - - /* NGX_DECLINED */ - } - -#endif - -invalid: - - *v = ngx_http_variable_true_value; - - return NGX_OK; - -uri: - - for ( /* void */ ; p < last; p++) { - if (*p == '/') { - break; - } - } - - len = last - p; - - if (uri == NGX_HTTP_REFERER_NO_URI_PART) { - goto valid; - } - - if (len < uri->len || ngx_strncmp(uri->data, p, uri->len) != 0) { - goto invalid; - } - -valid: - - *v = ngx_http_variable_null_value; - - return NGX_OK; -} - - -static ngx_int_t -ngx_http_referer_add_variables(ngx_conf_t *cf) -{ - ngx_http_variable_t *var; - - var = ngx_http_add_variable(cf, &ngx_http_invalid_referer_name, - NGX_HTTP_VAR_CHANGEABLE); - if (var == NULL) { - return NGX_ERROR; - } - - var->get_handler = ngx_http_referer_variable; - - return NGX_OK; -} - - -static void * -ngx_http_referer_create_conf(ngx_conf_t *cf) -{ - ngx_http_referer_conf_t *conf; - - conf = ngx_pcalloc(cf->pool, sizeof(ngx_http_referer_conf_t)); - if (conf == NULL) { - return NULL; - } - - /* - * set by ngx_pcalloc(): - * - * conf->hash = { NULL }; - * conf->server_names = 0; - * conf->keys = NULL; - */ - -#if (NGX_PCRE) - conf->regex = NGX_CONF_UNSET_PTR; - conf->server_name_regex = NGX_CONF_UNSET_PTR; -#endif - - conf->no_referer = NGX_CONF_UNSET; - conf->blocked_referer = NGX_CONF_UNSET; - conf->referer_hash_max_size = NGX_CONF_UNSET_UINT; - conf->referer_hash_bucket_size = NGX_CONF_UNSET_UINT; - - return conf; -} - - -static char * -ngx_http_referer_merge_conf(ngx_conf_t *cf, void *parent, void *child) -{ - ngx_http_referer_conf_t *prev = parent; - ngx_http_referer_conf_t *conf = child; - - ngx_uint_t n; - ngx_hash_init_t hash; - ngx_http_server_name_t *sn; - ngx_http_core_srv_conf_t *cscf; - - if (conf->keys == NULL) { - conf->hash = prev->hash; - -#if (NGX_PCRE) - ngx_conf_merge_ptr_value(conf->regex, prev->regex, NULL); - ngx_conf_merge_ptr_value(conf->server_name_regex, - prev->server_name_regex, NULL); -#endif - ngx_conf_merge_value(conf->no_referer, prev->no_referer, 0); - ngx_conf_merge_value(conf->blocked_referer, prev->blocked_referer, 0); - ngx_conf_merge_uint_value(conf->referer_hash_max_size, - prev->referer_hash_max_size, 2048); - ngx_conf_merge_uint_value(conf->referer_hash_bucket_size, - prev->referer_hash_bucket_size, 64); - - return NGX_CONF_OK; - } - - if (conf->server_names == 1) { - cscf = ngx_http_conf_get_module_srv_conf(cf, ngx_http_core_module); - - sn = cscf->server_names.elts; - for (n = 0; n < cscf->server_names.nelts; n++) { - -#if (NGX_PCRE) - if (sn[n].regex) { - - if (ngx_http_add_regex_server_name(cf, conf, sn[n].regex) - != NGX_OK) - { - return NGX_CONF_ERROR; - } - - continue; - } -#endif - - if (ngx_http_add_referer(cf, conf->keys, &sn[n].name, NULL) - != NGX_OK) - { - return NGX_CONF_ERROR; - } - } - } - - if ((conf->no_referer == 1 || conf->blocked_referer == 1) - && conf->keys->keys.nelts == 0 - && conf->keys->dns_wc_head.nelts == 0 - && conf->keys->dns_wc_tail.nelts == 0) - { - ngx_log_error(NGX_LOG_EMERG, cf->log, 0, - "the \"none\" or \"blocked\" referers are specified " - "in the \"valid_referers\" directive " - "without any valid referer"); - return NGX_CONF_ERROR; - } - - ngx_conf_merge_uint_value(conf->referer_hash_max_size, - prev->referer_hash_max_size, 2048); - ngx_conf_merge_uint_value(conf->referer_hash_bucket_size, - prev->referer_hash_bucket_size, 64); - conf->referer_hash_bucket_size = ngx_align(conf->referer_hash_bucket_size, - ngx_cacheline_size); - - hash.key = ngx_hash_key_lc; - hash.max_size = conf->referer_hash_max_size; - hash.bucket_size = conf->referer_hash_bucket_size; - hash.name = "referer_hash"; - hash.pool = cf->pool; - - if (conf->keys->keys.nelts) { - hash.hash = &conf->hash.hash; - hash.temp_pool = NULL; - - if (ngx_hash_init(&hash, conf->keys->keys.elts, conf->keys->keys.nelts) - != NGX_OK) - { - return NGX_CONF_ERROR; - } - } - - if (conf->keys->dns_wc_head.nelts) { - - ngx_qsort(conf->keys->dns_wc_head.elts, - (size_t) conf->keys->dns_wc_head.nelts, - sizeof(ngx_hash_key_t), - ngx_http_cmp_referer_wildcards); - - hash.hash = NULL; - hash.temp_pool = cf->temp_pool; - - if (ngx_hash_wildcard_init(&hash, conf->keys->dns_wc_head.elts, - conf->keys->dns_wc_head.nelts) - != NGX_OK) - { - return NGX_CONF_ERROR; - } - - conf->hash.wc_head = (ngx_hash_wildcard_t *) hash.hash; - } - - if (conf->keys->dns_wc_tail.nelts) { - - ngx_qsort(conf->keys->dns_wc_tail.elts, - (size_t) conf->keys->dns_wc_tail.nelts, - sizeof(ngx_hash_key_t), - ngx_http_cmp_referer_wildcards); - - hash.hash = NULL; - hash.temp_pool = cf->temp_pool; - - if (ngx_hash_wildcard_init(&hash, conf->keys->dns_wc_tail.elts, - conf->keys->dns_wc_tail.nelts) - != NGX_OK) - { - return NGX_CONF_ERROR; - } - - conf->hash.wc_tail = (ngx_hash_wildcard_t *) hash.hash; - } - -#if (NGX_PCRE) - ngx_conf_merge_ptr_value(conf->regex, prev->regex, NULL); - ngx_conf_merge_ptr_value(conf->server_name_regex, prev->server_name_regex, - NULL); -#endif - - if (conf->no_referer == NGX_CONF_UNSET) { - conf->no_referer = 0; - } - - if (conf->blocked_referer == NGX_CONF_UNSET) { - conf->blocked_referer = 0; - } - - conf->keys = NULL; - - return NGX_CONF_OK; -} - - -static char * -ngx_http_valid_referers(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) -{ - ngx_http_referer_conf_t *rlcf = conf; - - u_char *p; - ngx_str_t *value, uri; - ngx_uint_t i; - - if (rlcf->keys == NULL) { - rlcf->keys = ngx_pcalloc(cf->temp_pool, sizeof(ngx_hash_keys_arrays_t)); - if (rlcf->keys == NULL) { - return NGX_CONF_ERROR; - } - - rlcf->keys->pool = cf->pool; - rlcf->keys->temp_pool = cf->pool; - - if (ngx_hash_keys_array_init(rlcf->keys, NGX_HASH_SMALL) != NGX_OK) { - return NGX_CONF_ERROR; - } - } - - value = cf->args->elts; - - for (i = 1; i < cf->args->nelts; i++) { - if (value[i].len == 0) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "invalid referer \"%V\"", &value[i]); - return NGX_CONF_ERROR; - } - - if (ngx_strcmp(value[i].data, "none") == 0) { - rlcf->no_referer = 1; - continue; - } - - if (ngx_strcmp(value[i].data, "blocked") == 0) { - rlcf->blocked_referer = 1; - continue; - } - - if (ngx_strcmp(value[i].data, "server_names") == 0) { - rlcf->server_names = 1; - continue; - } - - if (value[i].data[0] == '~') { - if (ngx_http_add_regex_referer(cf, rlcf, &value[i]) != NGX_OK) { - return NGX_CONF_ERROR; - } - - continue; - } - - ngx_str_null(&uri); - - p = (u_char *) ngx_strchr(value[i].data, '/'); - - if (p) { - uri.len = (value[i].data + value[i].len) - p; - uri.data = p; - value[i].len = p - value[i].data; - } - - if (ngx_http_add_referer(cf, rlcf->keys, &value[i], &uri) != NGX_OK) { - return NGX_CONF_ERROR; - } - } - - return NGX_CONF_OK; -} - - -static ngx_int_t -ngx_http_add_referer(ngx_conf_t *cf, ngx_hash_keys_arrays_t *keys, - ngx_str_t *value, ngx_str_t *uri) -{ - ngx_int_t rc; - ngx_str_t *u; - - if (uri == NULL || uri->len == 0) { - u = NGX_HTTP_REFERER_NO_URI_PART; - - } else { - u = ngx_palloc(cf->pool, sizeof(ngx_str_t)); - if (u == NULL) { - return NGX_ERROR; - } - - *u = *uri; - } - - rc = ngx_hash_add_key(keys, value, u, NGX_HASH_WILDCARD_KEY); - - if (rc == NGX_OK) { - return NGX_OK; - } - - if (rc == NGX_DECLINED) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "invalid hostname or wildcard \"%V\"", value); - } - - if (rc == NGX_BUSY) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "conflicting parameter \"%V\"", value); - } - - return NGX_ERROR; -} - - -static ngx_int_t -ngx_http_add_regex_referer(ngx_conf_t *cf, ngx_http_referer_conf_t *rlcf, - ngx_str_t *name) -{ -#if (NGX_PCRE) - ngx_regex_elt_t *re; - ngx_regex_compile_t rc; - u_char errstr[NGX_MAX_CONF_ERRSTR]; - - if (name->len == 1) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, "empty regex in \"%V\"", name); - return NGX_ERROR; - } - - if (rlcf->regex == NGX_CONF_UNSET_PTR) { - rlcf->regex = ngx_array_create(cf->pool, 2, sizeof(ngx_regex_elt_t)); - if (rlcf->regex == NULL) { - return NGX_ERROR; - } - } - - re = ngx_array_push(rlcf->regex); - if (re == NULL) { - return NGX_ERROR; - } - - name->len--; - name->data++; - - ngx_memzero(&rc, sizeof(ngx_regex_compile_t)); - - rc.pattern = *name; - rc.pool = cf->pool; - rc.options = NGX_REGEX_CASELESS; - rc.err.len = NGX_MAX_CONF_ERRSTR; - rc.err.data = errstr; - - if (ngx_regex_compile(&rc) != NGX_OK) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, "%V", &rc.err); - return NGX_ERROR; - } - - re->regex = rc.regex; - re->name = name->data; - - return NGX_OK; - -#else - - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "using regex \"%V\" requires PCRE library", - name); - - return NGX_ERROR; - -#endif -} - - -#if (NGX_PCRE) - -static ngx_int_t -ngx_http_add_regex_server_name(ngx_conf_t *cf, ngx_http_referer_conf_t *rlcf, - ngx_http_regex_t *regex) -{ - ngx_regex_elt_t *re; - - if (rlcf->server_name_regex == NGX_CONF_UNSET_PTR) { - rlcf->server_name_regex = ngx_array_create(cf->pool, 2, - sizeof(ngx_regex_elt_t)); - if (rlcf->server_name_regex == NULL) { - return NGX_ERROR; - } - } - - re = ngx_array_push(rlcf->server_name_regex); - if (re == NULL) { - return NGX_ERROR; - } - - re->regex = regex->regex; - re->name = regex->name.data; - - return NGX_OK; -} - -#endif - - -static int ngx_libc_cdecl -ngx_http_cmp_referer_wildcards(const void *one, const void *two) -{ - ngx_hash_key_t *first, *second; - - first = (ngx_hash_key_t *) one; - second = (ngx_hash_key_t *) two; - - return ngx_dns_strcmp(first->key.data, second->key.data); -} diff --git a/src/deps/src/nginx-1.30.3/src/http/modules/ngx_http_rewrite_module.c b/src/deps/src/nginx-1.30.3/src/http/modules/ngx_http_rewrite_module.c deleted file mode 100644 index ff3b68716d..0000000000 --- a/src/deps/src/nginx-1.30.3/src/http/modules/ngx_http_rewrite_module.c +++ /dev/null @@ -1,1020 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#include -#include -#include - - -typedef struct { - ngx_array_t *codes; /* uintptr_t */ - - ngx_uint_t stack_size; - - ngx_flag_t log; - ngx_flag_t uninitialized_variable_warn; -} ngx_http_rewrite_loc_conf_t; - - -static void *ngx_http_rewrite_create_loc_conf(ngx_conf_t *cf); -static char *ngx_http_rewrite_merge_loc_conf(ngx_conf_t *cf, - void *parent, void *child); -static ngx_int_t ngx_http_rewrite_init(ngx_conf_t *cf); -static char *ngx_http_rewrite(ngx_conf_t *cf, ngx_command_t *cmd, void *conf); -static char *ngx_http_rewrite_return(ngx_conf_t *cf, ngx_command_t *cmd, - void *conf); -static char *ngx_http_rewrite_break(ngx_conf_t *cf, ngx_command_t *cmd, - void *conf); -static char *ngx_http_rewrite_if(ngx_conf_t *cf, ngx_command_t *cmd, - void *conf); -static char * ngx_http_rewrite_if_condition(ngx_conf_t *cf, - ngx_http_rewrite_loc_conf_t *lcf); -static char *ngx_http_rewrite_variable(ngx_conf_t *cf, - ngx_http_rewrite_loc_conf_t *lcf, ngx_str_t *value); -static char *ngx_http_rewrite_set(ngx_conf_t *cf, ngx_command_t *cmd, - void *conf); -static char * ngx_http_rewrite_value(ngx_conf_t *cf, - ngx_http_rewrite_loc_conf_t *lcf, ngx_str_t *value); - - -static ngx_command_t ngx_http_rewrite_commands[] = { - - { ngx_string("rewrite"), - NGX_HTTP_SRV_CONF|NGX_HTTP_SIF_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF - |NGX_CONF_TAKE23, - ngx_http_rewrite, - NGX_HTTP_LOC_CONF_OFFSET, - 0, - NULL }, - - { ngx_string("return"), - NGX_HTTP_SRV_CONF|NGX_HTTP_SIF_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF - |NGX_CONF_TAKE12, - ngx_http_rewrite_return, - NGX_HTTP_LOC_CONF_OFFSET, - 0, - NULL }, - - { ngx_string("break"), - NGX_HTTP_SRV_CONF|NGX_HTTP_SIF_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF - |NGX_CONF_NOARGS, - ngx_http_rewrite_break, - NGX_HTTP_LOC_CONF_OFFSET, - 0, - NULL }, - - { ngx_string("if"), - NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_BLOCK|NGX_CONF_1MORE, - ngx_http_rewrite_if, - NGX_HTTP_LOC_CONF_OFFSET, - 0, - NULL }, - - { ngx_string("set"), - NGX_HTTP_SRV_CONF|NGX_HTTP_SIF_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF - |NGX_CONF_TAKE2, - ngx_http_rewrite_set, - NGX_HTTP_LOC_CONF_OFFSET, - 0, - NULL }, - - { ngx_string("rewrite_log"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_SIF_CONF|NGX_HTTP_LOC_CONF - |NGX_HTTP_LIF_CONF|NGX_CONF_FLAG, - ngx_conf_set_flag_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_rewrite_loc_conf_t, log), - NULL }, - - { ngx_string("uninitialized_variable_warn"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_SIF_CONF|NGX_HTTP_LOC_CONF - |NGX_HTTP_LIF_CONF|NGX_CONF_FLAG, - ngx_conf_set_flag_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_rewrite_loc_conf_t, uninitialized_variable_warn), - NULL }, - - ngx_null_command -}; - - -static ngx_http_module_t ngx_http_rewrite_module_ctx = { - NULL, /* preconfiguration */ - ngx_http_rewrite_init, /* postconfiguration */ - - NULL, /* create main configuration */ - NULL, /* init main configuration */ - - NULL, /* create server configuration */ - NULL, /* merge server configuration */ - - ngx_http_rewrite_create_loc_conf, /* create location configuration */ - ngx_http_rewrite_merge_loc_conf /* merge location configuration */ -}; - - -ngx_module_t ngx_http_rewrite_module = { - NGX_MODULE_V1, - &ngx_http_rewrite_module_ctx, /* module context */ - ngx_http_rewrite_commands, /* module directives */ - NGX_HTTP_MODULE, /* module type */ - NULL, /* init master */ - NULL, /* init module */ - NULL, /* init process */ - NULL, /* init thread */ - NULL, /* exit thread */ - NULL, /* exit process */ - NULL, /* exit master */ - NGX_MODULE_V1_PADDING -}; - - -static ngx_int_t -ngx_http_rewrite_handler(ngx_http_request_t *r) -{ - ngx_int_t index; - ngx_http_script_code_pt code; - ngx_http_script_engine_t *e; - ngx_http_core_srv_conf_t *cscf; - ngx_http_core_main_conf_t *cmcf; - ngx_http_rewrite_loc_conf_t *rlcf; - - cmcf = ngx_http_get_module_main_conf(r, ngx_http_core_module); - cscf = ngx_http_get_module_srv_conf(r, ngx_http_core_module); - index = cmcf->phase_engine.location_rewrite_index; - - if (r->phase_handler == index && r->loc_conf == cscf->ctx->loc_conf) { - /* skipping location rewrite phase for server null location */ - return NGX_DECLINED; - } - - rlcf = ngx_http_get_module_loc_conf(r, ngx_http_rewrite_module); - - if (rlcf->codes == NULL) { - return NGX_DECLINED; - } - - e = ngx_pcalloc(r->pool, sizeof(ngx_http_script_engine_t)); - if (e == NULL) { - return NGX_HTTP_INTERNAL_SERVER_ERROR; - } - - e->sp = ngx_pcalloc(r->pool, - rlcf->stack_size * sizeof(ngx_http_variable_value_t)); - if (e->sp == NULL) { - return NGX_HTTP_INTERNAL_SERVER_ERROR; - } - - e->ip = rlcf->codes->elts; - e->request = r; - e->quote = 1; - e->log = rlcf->log; - e->status = NGX_DECLINED; - - while (*(uintptr_t *) e->ip) { - code = *(ngx_http_script_code_pt *) e->ip; - code(e); - } - - return e->status; -} - - -static ngx_int_t -ngx_http_rewrite_var(ngx_http_request_t *r, ngx_http_variable_value_t *v, - uintptr_t data) -{ - ngx_http_variable_t *var; - ngx_http_core_main_conf_t *cmcf; - ngx_http_rewrite_loc_conf_t *rlcf; - - rlcf = ngx_http_get_module_loc_conf(r, ngx_http_rewrite_module); - - if (rlcf->uninitialized_variable_warn == 0) { - *v = ngx_http_variable_null_value; - return NGX_OK; - } - - cmcf = ngx_http_get_module_main_conf(r, ngx_http_core_module); - - var = cmcf->variables.elts; - - /* - * the ngx_http_rewrite_module sets variables directly in r->variables, - * and they should be handled by ngx_http_get_indexed_variable(), - * so the handler is called only if the variable is not initialized - */ - - ngx_log_error(NGX_LOG_WARN, r->connection->log, 0, - "using uninitialized \"%V\" variable", &var[data].name); - - *v = ngx_http_variable_null_value; - - return NGX_OK; -} - - -static void * -ngx_http_rewrite_create_loc_conf(ngx_conf_t *cf) -{ - ngx_http_rewrite_loc_conf_t *conf; - - conf = ngx_pcalloc(cf->pool, sizeof(ngx_http_rewrite_loc_conf_t)); - if (conf == NULL) { - return NULL; - } - - conf->stack_size = NGX_CONF_UNSET_UINT; - conf->log = NGX_CONF_UNSET; - conf->uninitialized_variable_warn = NGX_CONF_UNSET; - - return conf; -} - - -static char * -ngx_http_rewrite_merge_loc_conf(ngx_conf_t *cf, void *parent, void *child) -{ - ngx_http_rewrite_loc_conf_t *prev = parent; - ngx_http_rewrite_loc_conf_t *conf = child; - - uintptr_t *code; - - ngx_conf_merge_value(conf->log, prev->log, 0); - ngx_conf_merge_value(conf->uninitialized_variable_warn, - prev->uninitialized_variable_warn, 1); - ngx_conf_merge_uint_value(conf->stack_size, prev->stack_size, 10); - - if (conf->codes == NULL) { - return NGX_CONF_OK; - } - - if (conf->codes == prev->codes) { - return NGX_CONF_OK; - } - - code = ngx_array_push_n(conf->codes, sizeof(uintptr_t)); - if (code == NULL) { - return NGX_CONF_ERROR; - } - - *code = (uintptr_t) NULL; - - return NGX_CONF_OK; -} - - -static ngx_int_t -ngx_http_rewrite_init(ngx_conf_t *cf) -{ - ngx_http_handler_pt *h; - ngx_http_core_main_conf_t *cmcf; - - cmcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_core_module); - - h = ngx_array_push(&cmcf->phases[NGX_HTTP_SERVER_REWRITE_PHASE].handlers); - if (h == NULL) { - return NGX_ERROR; - } - - *h = ngx_http_rewrite_handler; - - h = ngx_array_push(&cmcf->phases[NGX_HTTP_REWRITE_PHASE].handlers); - if (h == NULL) { - return NGX_ERROR; - } - - *h = ngx_http_rewrite_handler; - - return NGX_OK; -} - - -static char * -ngx_http_rewrite(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) -{ - ngx_http_rewrite_loc_conf_t *lcf = conf; - - ngx_str_t *value; - ngx_uint_t last; - ngx_regex_compile_t rc; - ngx_http_script_code_pt *code; - ngx_http_script_compile_t sc; - ngx_http_script_regex_code_t *regex; - ngx_http_script_regex_end_code_t *regex_end; - u_char errstr[NGX_MAX_CONF_ERRSTR]; - - regex = ngx_http_script_start_code(cf->pool, &lcf->codes, - sizeof(ngx_http_script_regex_code_t)); - if (regex == NULL) { - return NGX_CONF_ERROR; - } - - ngx_memzero(regex, sizeof(ngx_http_script_regex_code_t)); - - value = cf->args->elts; - - if (value[2].len == 0) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, "empty replacement"); - return NGX_CONF_ERROR; - } - - ngx_memzero(&rc, sizeof(ngx_regex_compile_t)); - - rc.pattern = value[1]; - rc.err.len = NGX_MAX_CONF_ERRSTR; - rc.err.data = errstr; - - /* TODO: NGX_REGEX_CASELESS */ - - regex->regex = ngx_http_regex_compile(cf, &rc); - if (regex->regex == NULL) { - return NGX_CONF_ERROR; - } - - regex->code = ngx_http_script_regex_start_code; - regex->uri = 1; - regex->name = value[1]; - - if (value[2].data[value[2].len - 1] == '?') { - - /* the last "?" drops the original arguments */ - value[2].len--; - - } else { - regex->add_args = 1; - } - - last = 0; - - if (ngx_strncmp(value[2].data, "http://", sizeof("http://") - 1) == 0 - || ngx_strncmp(value[2].data, "https://", sizeof("https://") - 1) == 0 - || ngx_strncmp(value[2].data, "$scheme", sizeof("$scheme") - 1) == 0) - { - regex->status = NGX_HTTP_MOVED_TEMPORARILY; - regex->redirect = 1; - last = 1; - } - - if (cf->args->nelts == 4) { - if (ngx_strcmp(value[3].data, "last") == 0) { - last = 1; - - } else if (ngx_strcmp(value[3].data, "break") == 0) { - regex->break_cycle = 1; - last = 1; - - } else if (ngx_strcmp(value[3].data, "redirect") == 0) { - regex->status = NGX_HTTP_MOVED_TEMPORARILY; - regex->redirect = 1; - last = 1; - - } else if (ngx_strcmp(value[3].data, "permanent") == 0) { - regex->status = NGX_HTTP_MOVED_PERMANENTLY; - regex->redirect = 1; - last = 1; - - } else { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "invalid parameter \"%V\"", &value[3]); - return NGX_CONF_ERROR; - } - } - - ngx_memzero(&sc, sizeof(ngx_http_script_compile_t)); - - sc.cf = cf; - sc.source = &value[2]; - sc.lengths = ®ex->lengths; - sc.values = &lcf->codes; - sc.variables = ngx_http_script_variables_count(&value[2]); - sc.main = regex; - sc.complete_lengths = 1; - sc.compile_args = !regex->redirect; - - if (ngx_http_script_compile(&sc) != NGX_OK) { - return NGX_CONF_ERROR; - } - - regex = sc.main; - - regex->size = sc.size; - regex->args = sc.args; - - if (sc.variables == 0 && !sc.dup_capture) { - regex->lengths = NULL; - } - - regex_end = ngx_http_script_add_code(lcf->codes, - sizeof(ngx_http_script_regex_end_code_t), - ®ex); - if (regex_end == NULL) { - return NGX_CONF_ERROR; - } - - regex_end->code = ngx_http_script_regex_end_code; - regex_end->uri = regex->uri; - regex_end->args = regex->args; - regex_end->add_args = regex->add_args; - regex_end->redirect = regex->redirect; - - if (last) { - code = ngx_http_script_add_code(lcf->codes, sizeof(uintptr_t), ®ex); - if (code == NULL) { - return NGX_CONF_ERROR; - } - - *code = NULL; - } - - regex->next = (u_char *) lcf->codes->elts + lcf->codes->nelts - - (u_char *) regex; - - return NGX_CONF_OK; -} - - -static char * -ngx_http_rewrite_return(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) -{ - ngx_http_rewrite_loc_conf_t *lcf = conf; - - u_char *p; - ngx_str_t *value, *v; - ngx_http_script_return_code_t *ret; - ngx_http_compile_complex_value_t ccv; - - ret = ngx_http_script_start_code(cf->pool, &lcf->codes, - sizeof(ngx_http_script_return_code_t)); - if (ret == NULL) { - return NGX_CONF_ERROR; - } - - value = cf->args->elts; - - ngx_memzero(ret, sizeof(ngx_http_script_return_code_t)); - - ret->code = ngx_http_script_return_code; - - p = value[1].data; - - ret->status = ngx_atoi(p, value[1].len); - - if (ret->status == (uintptr_t) NGX_ERROR) { - - if (cf->args->nelts == 2 - && (ngx_strncmp(p, "http://", sizeof("http://") - 1) == 0 - || ngx_strncmp(p, "https://", sizeof("https://") - 1) == 0 - || ngx_strncmp(p, "$scheme", sizeof("$scheme") - 1) == 0)) - { - ret->status = NGX_HTTP_MOVED_TEMPORARILY; - v = &value[1]; - - } else { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "invalid return code \"%V\"", &value[1]); - return NGX_CONF_ERROR; - } - - } else { - - if (ret->status > 999) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "invalid return code \"%V\"", &value[1]); - return NGX_CONF_ERROR; - } - - if (cf->args->nelts == 2) { - ngx_str_set(&ret->text.value, ""); - return NGX_CONF_OK; - } - - v = &value[2]; - } - - ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t)); - - ccv.cf = cf; - ccv.value = v; - ccv.complex_value = &ret->text; - - if (ngx_http_compile_complex_value(&ccv) != NGX_OK) { - return NGX_CONF_ERROR; - } - - return NGX_CONF_OK; -} - - -static char * -ngx_http_rewrite_break(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) -{ - ngx_http_rewrite_loc_conf_t *lcf = conf; - - ngx_http_script_code_pt *code; - - code = ngx_http_script_start_code(cf->pool, &lcf->codes, sizeof(uintptr_t)); - if (code == NULL) { - return NGX_CONF_ERROR; - } - - *code = ngx_http_script_break_code; - - return NGX_CONF_OK; -} - - -static char * -ngx_http_rewrite_if(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) -{ - ngx_http_rewrite_loc_conf_t *lcf = conf; - - void *mconf; - char *rv; - u_char *elts; - ngx_uint_t i; - ngx_conf_t save; - ngx_http_module_t *module; - ngx_http_conf_ctx_t *ctx, *pctx; - ngx_http_core_loc_conf_t *clcf, *pclcf; - ngx_http_script_if_code_t *if_code; - ngx_http_rewrite_loc_conf_t *nlcf; - - ctx = ngx_pcalloc(cf->pool, sizeof(ngx_http_conf_ctx_t)); - if (ctx == NULL) { - return NGX_CONF_ERROR; - } - - pctx = cf->ctx; - ctx->main_conf = pctx->main_conf; - ctx->srv_conf = pctx->srv_conf; - - ctx->loc_conf = ngx_pcalloc(cf->pool, sizeof(void *) * ngx_http_max_module); - if (ctx->loc_conf == NULL) { - return NGX_CONF_ERROR; - } - - for (i = 0; cf->cycle->modules[i]; i++) { - if (cf->cycle->modules[i]->type != NGX_HTTP_MODULE) { - continue; - } - - module = cf->cycle->modules[i]->ctx; - - if (module->create_loc_conf) { - - mconf = module->create_loc_conf(cf); - if (mconf == NULL) { - return NGX_CONF_ERROR; - } - - ctx->loc_conf[cf->cycle->modules[i]->ctx_index] = mconf; - } - } - - pclcf = pctx->loc_conf[ngx_http_core_module.ctx_index]; - - clcf = ctx->loc_conf[ngx_http_core_module.ctx_index]; - clcf->loc_conf = ctx->loc_conf; - clcf->name = pclcf->name; - clcf->noname = 1; - - if (ngx_http_add_location(cf, &pclcf->locations, clcf) != NGX_OK) { - return NGX_CONF_ERROR; - } - - if (ngx_http_rewrite_if_condition(cf, lcf) != NGX_CONF_OK) { - return NGX_CONF_ERROR; - } - - if_code = ngx_array_push_n(lcf->codes, sizeof(ngx_http_script_if_code_t)); - if (if_code == NULL) { - return NGX_CONF_ERROR; - } - - if_code->code = ngx_http_script_if_code; - - elts = lcf->codes->elts; - - - /* the inner directives must be compiled to the same code array */ - - nlcf = ctx->loc_conf[ngx_http_rewrite_module.ctx_index]; - nlcf->codes = lcf->codes; - - - save = *cf; - cf->ctx = ctx; - - if (cf->cmd_type == NGX_HTTP_SRV_CONF) { - if_code->loc_conf = NULL; - cf->cmd_type = NGX_HTTP_SIF_CONF; - - } else { - if_code->loc_conf = ctx->loc_conf; - cf->cmd_type = NGX_HTTP_LIF_CONF; - } - - rv = ngx_conf_parse(cf, NULL); - - *cf = save; - - if (rv != NGX_CONF_OK) { - return rv; - } - - - if (elts != lcf->codes->elts) { - if_code = (ngx_http_script_if_code_t *) - ((u_char *) if_code + ((u_char *) lcf->codes->elts - elts)); - } - - if_code->next = (u_char *) lcf->codes->elts + lcf->codes->nelts - - (u_char *) if_code; - - /* the code array belong to parent block */ - - nlcf->codes = NULL; - - return NGX_CONF_OK; -} - - -static char * -ngx_http_rewrite_if_condition(ngx_conf_t *cf, ngx_http_rewrite_loc_conf_t *lcf) -{ - u_char *p; - size_t len; - ngx_str_t *value; - ngx_uint_t cur, last; - ngx_regex_compile_t rc; - ngx_http_script_code_pt *code; - ngx_http_script_file_code_t *fop; - ngx_http_script_regex_code_t *regex; - u_char errstr[NGX_MAX_CONF_ERRSTR]; - - value = cf->args->elts; - last = cf->args->nelts - 1; - - if (value[1].len < 1 || value[1].data[0] != '(') { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "invalid condition \"%V\"", &value[1]); - return NGX_CONF_ERROR; - } - - if (value[1].len == 1) { - cur = 2; - - } else { - cur = 1; - value[1].len--; - value[1].data++; - } - - if (value[last].len < 1 || value[last].data[value[last].len - 1] != ')') { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "invalid condition \"%V\"", &value[last]); - return NGX_CONF_ERROR; - } - - if (value[last].len == 1) { - last--; - - } else { - value[last].len--; - value[last].data[value[last].len] = '\0'; - } - - len = value[cur].len; - p = value[cur].data; - - if (len > 1 && p[0] == '$') { - - if (cur != last && cur + 2 != last) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "invalid condition \"%V\"", &value[cur]); - return NGX_CONF_ERROR; - } - - if (ngx_http_rewrite_variable(cf, lcf, &value[cur]) != NGX_CONF_OK) { - return NGX_CONF_ERROR; - } - - if (cur == last) { - return NGX_CONF_OK; - } - - cur++; - - len = value[cur].len; - p = value[cur].data; - - if (len == 1 && p[0] == '=') { - - if (ngx_http_rewrite_value(cf, lcf, &value[last]) != NGX_CONF_OK) { - return NGX_CONF_ERROR; - } - - code = ngx_http_script_start_code(cf->pool, &lcf->codes, - sizeof(uintptr_t)); - if (code == NULL) { - return NGX_CONF_ERROR; - } - - *code = ngx_http_script_equal_code; - - return NGX_CONF_OK; - } - - if (len == 2 && p[0] == '!' && p[1] == '=') { - - if (ngx_http_rewrite_value(cf, lcf, &value[last]) != NGX_CONF_OK) { - return NGX_CONF_ERROR; - } - - code = ngx_http_script_start_code(cf->pool, &lcf->codes, - sizeof(uintptr_t)); - if (code == NULL) { - return NGX_CONF_ERROR; - } - - *code = ngx_http_script_not_equal_code; - return NGX_CONF_OK; - } - - if ((len == 1 && p[0] == '~') - || (len == 2 && p[0] == '~' && p[1] == '*') - || (len == 2 && p[0] == '!' && p[1] == '~') - || (len == 3 && p[0] == '!' && p[1] == '~' && p[2] == '*')) - { - regex = ngx_http_script_start_code(cf->pool, &lcf->codes, - sizeof(ngx_http_script_regex_code_t)); - if (regex == NULL) { - return NGX_CONF_ERROR; - } - - ngx_memzero(regex, sizeof(ngx_http_script_regex_code_t)); - - ngx_memzero(&rc, sizeof(ngx_regex_compile_t)); - - rc.pattern = value[last]; - rc.options = (p[len - 1] == '*') ? NGX_REGEX_CASELESS : 0; - rc.err.len = NGX_MAX_CONF_ERRSTR; - rc.err.data = errstr; - - regex->regex = ngx_http_regex_compile(cf, &rc); - if (regex->regex == NULL) { - return NGX_CONF_ERROR; - } - - regex->code = ngx_http_script_regex_start_code; - regex->next = sizeof(ngx_http_script_regex_code_t); - regex->test = 1; - if (p[0] == '!') { - regex->negative_test = 1; - } - regex->name = value[last]; - - return NGX_CONF_OK; - } - - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "unexpected \"%V\" in condition", &value[cur]); - return NGX_CONF_ERROR; - - } else if ((len == 2 && p[0] == '-') - || (len == 3 && p[0] == '!' && p[1] == '-')) - { - if (cur + 1 != last) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "invalid condition \"%V\"", &value[cur]); - return NGX_CONF_ERROR; - } - - value[last].data[value[last].len] = '\0'; - value[last].len++; - - if (ngx_http_rewrite_value(cf, lcf, &value[last]) != NGX_CONF_OK) { - return NGX_CONF_ERROR; - } - - fop = ngx_http_script_start_code(cf->pool, &lcf->codes, - sizeof(ngx_http_script_file_code_t)); - if (fop == NULL) { - return NGX_CONF_ERROR; - } - - fop->code = ngx_http_script_file_code; - - if (p[1] == 'f') { - fop->op = ngx_http_script_file_plain; - return NGX_CONF_OK; - } - - if (p[1] == 'd') { - fop->op = ngx_http_script_file_dir; - return NGX_CONF_OK; - } - - if (p[1] == 'e') { - fop->op = ngx_http_script_file_exists; - return NGX_CONF_OK; - } - - if (p[1] == 'x') { - fop->op = ngx_http_script_file_exec; - return NGX_CONF_OK; - } - - if (p[0] == '!') { - if (p[2] == 'f') { - fop->op = ngx_http_script_file_not_plain; - return NGX_CONF_OK; - } - - if (p[2] == 'd') { - fop->op = ngx_http_script_file_not_dir; - return NGX_CONF_OK; - } - - if (p[2] == 'e') { - fop->op = ngx_http_script_file_not_exists; - return NGX_CONF_OK; - } - - if (p[2] == 'x') { - fop->op = ngx_http_script_file_not_exec; - return NGX_CONF_OK; - } - } - - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "invalid condition \"%V\"", &value[cur]); - return NGX_CONF_ERROR; - } - - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "invalid condition \"%V\"", &value[cur]); - - return NGX_CONF_ERROR; -} - - -static char * -ngx_http_rewrite_variable(ngx_conf_t *cf, ngx_http_rewrite_loc_conf_t *lcf, - ngx_str_t *value) -{ - ngx_int_t index; - ngx_http_script_var_code_t *var_code; - - value->len--; - value->data++; - - index = ngx_http_get_variable_index(cf, value); - - if (index == NGX_ERROR) { - return NGX_CONF_ERROR; - } - - var_code = ngx_http_script_start_code(cf->pool, &lcf->codes, - sizeof(ngx_http_script_var_code_t)); - if (var_code == NULL) { - return NGX_CONF_ERROR; - } - - var_code->code = ngx_http_script_var_code; - var_code->index = index; - - return NGX_CONF_OK; -} - - -static char * -ngx_http_rewrite_set(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) -{ - ngx_http_rewrite_loc_conf_t *lcf = conf; - - ngx_int_t index; - ngx_str_t *value; - ngx_http_variable_t *v; - ngx_http_script_var_code_t *vcode; - ngx_http_script_var_handler_code_t *vhcode; - - value = cf->args->elts; - - if (value[1].data[0] != '$') { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "invalid variable name \"%V\"", &value[1]); - return NGX_CONF_ERROR; - } - - value[1].len--; - value[1].data++; - - v = ngx_http_add_variable(cf, &value[1], - NGX_HTTP_VAR_CHANGEABLE|NGX_HTTP_VAR_WEAK); - if (v == NULL) { - return NGX_CONF_ERROR; - } - - index = ngx_http_get_variable_index(cf, &value[1]); - if (index == NGX_ERROR) { - return NGX_CONF_ERROR; - } - - if (v->get_handler == NULL) { - v->get_handler = ngx_http_rewrite_var; - v->data = index; - } - - if (ngx_http_rewrite_value(cf, lcf, &value[2]) != NGX_CONF_OK) { - return NGX_CONF_ERROR; - } - - if (v->set_handler) { - vhcode = ngx_http_script_start_code(cf->pool, &lcf->codes, - sizeof(ngx_http_script_var_handler_code_t)); - if (vhcode == NULL) { - return NGX_CONF_ERROR; - } - - vhcode->code = ngx_http_script_var_set_handler_code; - vhcode->handler = v->set_handler; - vhcode->data = v->data; - - return NGX_CONF_OK; - } - - vcode = ngx_http_script_start_code(cf->pool, &lcf->codes, - sizeof(ngx_http_script_var_code_t)); - if (vcode == NULL) { - return NGX_CONF_ERROR; - } - - vcode->code = ngx_http_script_set_var_code; - vcode->index = (uintptr_t) index; - - return NGX_CONF_OK; -} - - -static char * -ngx_http_rewrite_value(ngx_conf_t *cf, ngx_http_rewrite_loc_conf_t *lcf, - ngx_str_t *value) -{ - ngx_int_t n; - ngx_http_script_compile_t sc; - ngx_http_script_value_code_t *val; - ngx_http_script_complex_value_code_t *complex; - - n = ngx_http_script_variables_count(value); - - if (n == 0) { - val = ngx_http_script_start_code(cf->pool, &lcf->codes, - sizeof(ngx_http_script_value_code_t)); - if (val == NULL) { - return NGX_CONF_ERROR; - } - - n = ngx_atoi(value->data, value->len); - - if (n == NGX_ERROR) { - n = 0; - } - - val->code = ngx_http_script_value_code; - val->value = (uintptr_t) n; - val->text_len = (uintptr_t) value->len; - val->text_data = (uintptr_t) value->data; - - return NGX_CONF_OK; - } - - complex = ngx_http_script_start_code(cf->pool, &lcf->codes, - sizeof(ngx_http_script_complex_value_code_t)); - if (complex == NULL) { - return NGX_CONF_ERROR; - } - - complex->code = ngx_http_script_complex_value_code; - complex->lengths = NULL; - - ngx_memzero(&sc, sizeof(ngx_http_script_compile_t)); - - sc.cf = cf; - sc.source = value; - sc.lengths = &complex->lengths; - sc.values = &lcf->codes; - sc.variables = n; - sc.complete_lengths = 1; - - if (ngx_http_script_compile(&sc) != NGX_OK) { - return NGX_CONF_ERROR; - } - - return NGX_CONF_OK; -} diff --git a/src/deps/src/nginx-1.30.3/src/http/modules/ngx_http_scgi_module.c b/src/deps/src/nginx-1.30.3/src/http/modules/ngx_http_scgi_module.c deleted file mode 100644 index b4a73a5a6b..0000000000 --- a/src/deps/src/nginx-1.30.3/src/http/modules/ngx_http_scgi_module.c +++ /dev/null @@ -1,2138 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - * Copyright (C) Manlio Perillo (manlio.perillo@gmail.com) - */ - - -#include -#include -#include - - -typedef struct { - ngx_array_t caches; /* ngx_http_file_cache_t * */ -} ngx_http_scgi_main_conf_t; - - -typedef struct { - ngx_array_t *flushes; - ngx_array_t *lengths; - ngx_array_t *values; - ngx_uint_t number; - ngx_hash_t hash; -} ngx_http_scgi_params_t; - - -typedef struct { - ngx_http_upstream_conf_t upstream; - - ngx_http_scgi_params_t params; -#if (NGX_HTTP_CACHE) - ngx_http_scgi_params_t params_cache; -#endif - ngx_array_t *params_source; - - ngx_array_t *scgi_lengths; - ngx_array_t *scgi_values; - -#if (NGX_HTTP_CACHE) - ngx_http_complex_value_t cache_key; -#endif -} ngx_http_scgi_loc_conf_t; - - -static ngx_int_t ngx_http_scgi_eval(ngx_http_request_t *r, - ngx_http_scgi_loc_conf_t *scf); -static ngx_int_t ngx_http_scgi_create_request(ngx_http_request_t *r); -static ngx_int_t ngx_http_scgi_reinit_request(ngx_http_request_t *r); -static ngx_int_t ngx_http_scgi_process_status_line(ngx_http_request_t *r); -static ngx_int_t ngx_http_scgi_process_header(ngx_http_request_t *r); -static ngx_int_t ngx_http_scgi_input_filter_init(void *data); -static void ngx_http_scgi_abort_request(ngx_http_request_t *r); -static void ngx_http_scgi_finalize_request(ngx_http_request_t *r, ngx_int_t rc); - -static void *ngx_http_scgi_create_main_conf(ngx_conf_t *cf); -static void *ngx_http_scgi_create_loc_conf(ngx_conf_t *cf); -static char *ngx_http_scgi_merge_loc_conf(ngx_conf_t *cf, void *parent, - void *child); -static ngx_int_t ngx_http_scgi_init_params(ngx_conf_t *cf, - ngx_http_scgi_loc_conf_t *conf, ngx_http_scgi_params_t *params, - ngx_keyval_t *default_params); - -static char *ngx_http_scgi_pass(ngx_conf_t *cf, ngx_command_t *cmd, void *conf); -static char *ngx_http_scgi_store(ngx_conf_t *cf, ngx_command_t *cmd, - void *conf); - -#if (NGX_HTTP_CACHE) -static ngx_int_t ngx_http_scgi_create_key(ngx_http_request_t *r); -static char *ngx_http_scgi_cache(ngx_conf_t *cf, ngx_command_t *cmd, - void *conf); -static char *ngx_http_scgi_cache_key(ngx_conf_t *cf, ngx_command_t *cmd, - void *conf); -#endif - - -static ngx_conf_bitmask_t ngx_http_scgi_next_upstream_masks[] = { - { ngx_string("error"), NGX_HTTP_UPSTREAM_FT_ERROR }, - { ngx_string("timeout"), NGX_HTTP_UPSTREAM_FT_TIMEOUT }, - { ngx_string("invalid_header"), NGX_HTTP_UPSTREAM_FT_INVALID_HEADER }, - { ngx_string("non_idempotent"), NGX_HTTP_UPSTREAM_FT_NON_IDEMPOTENT }, - { ngx_string("http_500"), NGX_HTTP_UPSTREAM_FT_HTTP_500 }, - { ngx_string("http_503"), NGX_HTTP_UPSTREAM_FT_HTTP_503 }, - { ngx_string("http_403"), NGX_HTTP_UPSTREAM_FT_HTTP_403 }, - { ngx_string("http_404"), NGX_HTTP_UPSTREAM_FT_HTTP_404 }, - { ngx_string("http_429"), NGX_HTTP_UPSTREAM_FT_HTTP_429 }, - { ngx_string("updating"), NGX_HTTP_UPSTREAM_FT_UPDATING }, - { ngx_string("off"), NGX_HTTP_UPSTREAM_FT_OFF }, - { ngx_null_string, 0 } -}; - - -ngx_module_t ngx_http_scgi_module; - - -static ngx_command_t ngx_http_scgi_commands[] = { - - { ngx_string("scgi_pass"), - NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF|NGX_CONF_TAKE1, - ngx_http_scgi_pass, - NGX_HTTP_LOC_CONF_OFFSET, - 0, - NULL }, - - { ngx_string("scgi_store"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1, - ngx_http_scgi_store, - NGX_HTTP_LOC_CONF_OFFSET, - 0, - NULL }, - - { ngx_string("scgi_store_access"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE123, - ngx_conf_set_access_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_scgi_loc_conf_t, upstream.store_access), - NULL }, - - { ngx_string("scgi_buffering"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG, - ngx_conf_set_flag_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_scgi_loc_conf_t, upstream.buffering), - NULL }, - - { ngx_string("scgi_request_buffering"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG, - ngx_conf_set_flag_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_scgi_loc_conf_t, upstream.request_buffering), - NULL }, - - { ngx_string("scgi_ignore_client_abort"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG, - ngx_conf_set_flag_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_scgi_loc_conf_t, upstream.ignore_client_abort), - NULL }, - - { ngx_string("scgi_bind"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE12, - ngx_http_upstream_bind_set_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_scgi_loc_conf_t, upstream.local), - NULL }, - - { ngx_string("scgi_socket_keepalive"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG, - ngx_conf_set_flag_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_scgi_loc_conf_t, upstream.socket_keepalive), - NULL }, - - { ngx_string("scgi_connect_timeout"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1, - ngx_conf_set_msec_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_scgi_loc_conf_t, upstream.connect_timeout), - NULL }, - - { ngx_string("scgi_send_timeout"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1, - ngx_conf_set_msec_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_scgi_loc_conf_t, upstream.send_timeout), - NULL }, - - { ngx_string("scgi_buffer_size"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1, - ngx_conf_set_size_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_scgi_loc_conf_t, upstream.buffer_size), - NULL }, - - { ngx_string("scgi_pass_request_headers"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG, - ngx_conf_set_flag_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_scgi_loc_conf_t, upstream.pass_request_headers), - NULL }, - - { ngx_string("scgi_pass_request_body"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG, - ngx_conf_set_flag_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_scgi_loc_conf_t, upstream.pass_request_body), - NULL }, - - { ngx_string("scgi_intercept_errors"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG, - ngx_conf_set_flag_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_scgi_loc_conf_t, upstream.intercept_errors), - NULL }, - - { ngx_string("scgi_read_timeout"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1, - ngx_conf_set_msec_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_scgi_loc_conf_t, upstream.read_timeout), - NULL }, - - { ngx_string("scgi_buffers"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE2, - ngx_conf_set_bufs_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_scgi_loc_conf_t, upstream.bufs), - NULL }, - - { ngx_string("scgi_busy_buffers_size"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1, - ngx_conf_set_size_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_scgi_loc_conf_t, upstream.busy_buffers_size_conf), - NULL }, - - { ngx_string("scgi_force_ranges"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG, - ngx_conf_set_flag_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_scgi_loc_conf_t, upstream.force_ranges), - NULL }, - - { ngx_string("scgi_limit_rate"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1, - ngx_http_set_complex_value_size_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_scgi_loc_conf_t, upstream.limit_rate), - NULL }, - -#if (NGX_HTTP_CACHE) - - { ngx_string("scgi_cache"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1, - ngx_http_scgi_cache, - NGX_HTTP_LOC_CONF_OFFSET, - 0, - NULL }, - - { ngx_string("scgi_cache_key"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1, - ngx_http_scgi_cache_key, - NGX_HTTP_LOC_CONF_OFFSET, - 0, - NULL }, - - { ngx_string("scgi_cache_path"), - NGX_HTTP_MAIN_CONF|NGX_CONF_2MORE, - ngx_http_file_cache_set_slot, - NGX_HTTP_MAIN_CONF_OFFSET, - offsetof(ngx_http_scgi_main_conf_t, caches), - &ngx_http_scgi_module }, - - { ngx_string("scgi_cache_bypass"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE, - ngx_http_set_predicate_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_scgi_loc_conf_t, upstream.cache_bypass), - NULL }, - - { ngx_string("scgi_no_cache"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE, - ngx_http_set_predicate_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_scgi_loc_conf_t, upstream.no_cache), - NULL }, - - { ngx_string("scgi_cache_valid"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE, - ngx_http_file_cache_valid_set_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_scgi_loc_conf_t, upstream.cache_valid), - NULL }, - - { ngx_string("scgi_cache_min_uses"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1, - ngx_conf_set_num_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_scgi_loc_conf_t, upstream.cache_min_uses), - NULL }, - - { ngx_string("scgi_cache_max_range_offset"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1, - ngx_conf_set_off_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_scgi_loc_conf_t, upstream.cache_max_range_offset), - NULL }, - - { ngx_string("scgi_cache_use_stale"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE, - ngx_conf_set_bitmask_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_scgi_loc_conf_t, upstream.cache_use_stale), - &ngx_http_scgi_next_upstream_masks }, - - { ngx_string("scgi_cache_methods"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE, - ngx_conf_set_bitmask_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_scgi_loc_conf_t, upstream.cache_methods), - &ngx_http_upstream_cache_method_mask }, - - { ngx_string("scgi_cache_lock"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG, - ngx_conf_set_flag_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_scgi_loc_conf_t, upstream.cache_lock), - NULL }, - - { ngx_string("scgi_cache_lock_timeout"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1, - ngx_conf_set_msec_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_scgi_loc_conf_t, upstream.cache_lock_timeout), - NULL }, - - { ngx_string("scgi_cache_lock_age"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1, - ngx_conf_set_msec_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_scgi_loc_conf_t, upstream.cache_lock_age), - NULL }, - - { ngx_string("scgi_cache_revalidate"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG, - ngx_conf_set_flag_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_scgi_loc_conf_t, upstream.cache_revalidate), - NULL }, - - { ngx_string("scgi_cache_background_update"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG, - ngx_conf_set_flag_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_scgi_loc_conf_t, upstream.cache_background_update), - NULL }, - -#endif - - { ngx_string("scgi_temp_path"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1234, - ngx_conf_set_path_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_scgi_loc_conf_t, upstream.temp_path), - NULL }, - - { ngx_string("scgi_max_temp_file_size"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1, - ngx_conf_set_size_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_scgi_loc_conf_t, upstream.max_temp_file_size_conf), - NULL }, - - { ngx_string("scgi_temp_file_write_size"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1, - ngx_conf_set_size_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_scgi_loc_conf_t, upstream.temp_file_write_size_conf), - NULL }, - - { ngx_string("scgi_next_upstream"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE, - ngx_conf_set_bitmask_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_scgi_loc_conf_t, upstream.next_upstream), - &ngx_http_scgi_next_upstream_masks }, - - { ngx_string("scgi_next_upstream_tries"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1, - ngx_conf_set_num_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_scgi_loc_conf_t, upstream.next_upstream_tries), - NULL }, - - { ngx_string("scgi_next_upstream_timeout"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1, - ngx_conf_set_msec_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_scgi_loc_conf_t, upstream.next_upstream_timeout), - NULL }, - - { ngx_string("scgi_param"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE23, - ngx_http_upstream_param_set_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_scgi_loc_conf_t, params_source), - NULL }, - - { ngx_string("scgi_pass_header"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1, - ngx_conf_set_str_array_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_scgi_loc_conf_t, upstream.pass_headers), - NULL }, - - { ngx_string("scgi_hide_header"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1, - ngx_conf_set_str_array_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_scgi_loc_conf_t, upstream.hide_headers), - NULL }, - - { ngx_string("scgi_ignore_headers"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE, - ngx_conf_set_bitmask_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_scgi_loc_conf_t, upstream.ignore_headers), - &ngx_http_upstream_ignore_headers_masks }, - - ngx_null_command -}; - - -static ngx_http_module_t ngx_http_scgi_module_ctx = { - NULL, /* preconfiguration */ - NULL, /* postconfiguration */ - - ngx_http_scgi_create_main_conf, /* create main configuration */ - NULL, /* init main configuration */ - - NULL, /* create server configuration */ - NULL, /* merge server configuration */ - - ngx_http_scgi_create_loc_conf, /* create location configuration */ - ngx_http_scgi_merge_loc_conf /* merge location configuration */ -}; - - -ngx_module_t ngx_http_scgi_module = { - NGX_MODULE_V1, - &ngx_http_scgi_module_ctx, /* module context */ - ngx_http_scgi_commands, /* module directives */ - NGX_HTTP_MODULE, /* module type */ - NULL, /* init master */ - NULL, /* init module */ - NULL, /* init process */ - NULL, /* init thread */ - NULL, /* exit thread */ - NULL, /* exit process */ - NULL, /* exit master */ - NGX_MODULE_V1_PADDING -}; - - -static ngx_str_t ngx_http_scgi_hide_headers[] = { - ngx_string("Status"), - ngx_string("X-Accel-Expires"), - ngx_string("X-Accel-Redirect"), - ngx_string("X-Accel-Limit-Rate"), - ngx_string("X-Accel-Buffering"), - ngx_string("X-Accel-Charset"), - ngx_null_string -}; - - -static ngx_keyval_t ngx_http_scgi_headers[] = { - { ngx_string("HTTP_HOST"), - ngx_string("$host$is_request_port$request_port") }, - { ngx_null_string, ngx_null_string } -}; - - -#if (NGX_HTTP_CACHE) - -static ngx_keyval_t ngx_http_scgi_cache_headers[] = { - { ngx_string("HTTP_HOST"), - ngx_string("$host$is_request_port$request_port") }, - { ngx_string("HTTP_IF_MODIFIED_SINCE"), - ngx_string("$upstream_cache_last_modified") }, - { ngx_string("HTTP_IF_UNMODIFIED_SINCE"), ngx_string("") }, - { ngx_string("HTTP_IF_NONE_MATCH"), ngx_string("$upstream_cache_etag") }, - { ngx_string("HTTP_IF_MATCH"), ngx_string("") }, - { ngx_string("HTTP_RANGE"), ngx_string("") }, - { ngx_string("HTTP_IF_RANGE"), ngx_string("") }, - { ngx_null_string, ngx_null_string } -}; - -#endif - - -static ngx_path_init_t ngx_http_scgi_temp_path = { - ngx_string(NGX_HTTP_SCGI_TEMP_PATH), { 1, 2, 0 } -}; - - -static ngx_int_t -ngx_http_scgi_handler(ngx_http_request_t *r) -{ - ngx_int_t rc; - ngx_http_status_t *status; - ngx_http_upstream_t *u; - ngx_http_scgi_loc_conf_t *scf; -#if (NGX_HTTP_CACHE) - ngx_http_scgi_main_conf_t *smcf; -#endif - - if (ngx_http_upstream_create(r) != NGX_OK) { - return NGX_HTTP_INTERNAL_SERVER_ERROR; - } - - status = ngx_pcalloc(r->pool, sizeof(ngx_http_status_t)); - if (status == NULL) { - return NGX_HTTP_INTERNAL_SERVER_ERROR; - } - - ngx_http_set_ctx(r, status, ngx_http_scgi_module); - - scf = ngx_http_get_module_loc_conf(r, ngx_http_scgi_module); - - if (scf->scgi_lengths) { - if (ngx_http_scgi_eval(r, scf) != NGX_OK) { - return NGX_HTTP_INTERNAL_SERVER_ERROR; - } - } - - u = r->upstream; - - ngx_str_set(&u->schema, "scgi://"); - u->output.tag = (ngx_buf_tag_t) &ngx_http_scgi_module; - - u->conf = &scf->upstream; - -#if (NGX_HTTP_CACHE) - smcf = ngx_http_get_module_main_conf(r, ngx_http_scgi_module); - - u->caches = &smcf->caches; - u->create_key = ngx_http_scgi_create_key; -#endif - - u->create_request = ngx_http_scgi_create_request; - u->reinit_request = ngx_http_scgi_reinit_request; - u->process_header = ngx_http_scgi_process_status_line; - u->abort_request = ngx_http_scgi_abort_request; - u->finalize_request = ngx_http_scgi_finalize_request; - r->state = 0; - - u->buffering = scf->upstream.buffering; - - u->pipe = ngx_pcalloc(r->pool, sizeof(ngx_event_pipe_t)); - if (u->pipe == NULL) { - return NGX_HTTP_INTERNAL_SERVER_ERROR; - } - - u->pipe->input_filter = ngx_event_pipe_copy_input_filter; - u->pipe->input_ctx = r; - - u->input_filter_init = ngx_http_scgi_input_filter_init; - u->input_filter = ngx_http_upstream_non_buffered_filter; - u->input_filter_ctx = r; - - if (!scf->upstream.request_buffering - && scf->upstream.pass_request_body - && !r->headers_in.chunked) - { - r->request_body_no_buffering = 1; - } - - rc = ngx_http_read_client_request_body(r, ngx_http_upstream_init); - - if (rc >= NGX_HTTP_SPECIAL_RESPONSE) { - return rc; - } - - return NGX_DONE; -} - - -static ngx_int_t -ngx_http_scgi_eval(ngx_http_request_t *r, ngx_http_scgi_loc_conf_t * scf) -{ - ngx_url_t url; - ngx_http_upstream_t *u; - - ngx_memzero(&url, sizeof(ngx_url_t)); - - if (ngx_http_script_run(r, &url.url, scf->scgi_lengths->elts, 0, - scf->scgi_values->elts) - == NULL) - { - return NGX_ERROR; - } - - url.no_resolve = 1; - - if (ngx_parse_url(r->pool, &url) != NGX_OK) { - if (url.err) { - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "%s in upstream \"%V\"", url.err, &url.url); - } - - return NGX_ERROR; - } - - u = r->upstream; - - u->resolved = ngx_pcalloc(r->pool, sizeof(ngx_http_upstream_resolved_t)); - if (u->resolved == NULL) { - return NGX_ERROR; - } - - if (url.addrs) { - u->resolved->sockaddr = url.addrs[0].sockaddr; - u->resolved->socklen = url.addrs[0].socklen; - u->resolved->name = url.addrs[0].name; - u->resolved->naddrs = 1; - } - - u->resolved->host = url.host; - u->resolved->port = url.port; - u->resolved->no_port = url.no_port; - - return NGX_OK; -} - - -#if (NGX_HTTP_CACHE) - -static ngx_int_t -ngx_http_scgi_create_key(ngx_http_request_t *r) -{ - ngx_str_t *key; - ngx_http_scgi_loc_conf_t *scf; - - key = ngx_array_push(&r->cache->keys); - if (key == NULL) { - return NGX_ERROR; - } - - scf = ngx_http_get_module_loc_conf(r, ngx_http_scgi_module); - - if (ngx_http_complex_value(r, &scf->cache_key, key) != NGX_OK) { - return NGX_ERROR; - } - - return NGX_OK; -} - -#endif - - -static ngx_int_t -ngx_http_scgi_create_request(ngx_http_request_t *r) -{ - off_t content_length_n; - u_char ch, sep, *key, *val, *lowcase_key; - size_t len, key_len, val_len, allocated; - ngx_buf_t *b; - ngx_str_t content_length; - ngx_uint_t i, n, hash, skip_empty, header_params; - ngx_chain_t *cl, *body; - ngx_list_part_t *part; - ngx_table_elt_t *header, *hn, **ignored; - ngx_http_scgi_params_t *params; - ngx_http_script_code_pt code; - ngx_http_script_engine_t e, le; - ngx_http_scgi_loc_conf_t *scf; - ngx_http_script_len_code_pt lcode; - u_char buffer[NGX_OFF_T_LEN]; - - content_length_n = 0; - - if (r->headers_in.content_length_n > 0) { - content_length_n = r->headers_in.content_length_n; - } - - content_length.data = buffer; - content_length.len = ngx_sprintf(buffer, "%O", content_length_n) - buffer; - - len = sizeof("CONTENT_LENGTH") + content_length.len + 1; - - header_params = 0; - ignored = NULL; - - scf = ngx_http_get_module_loc_conf(r, ngx_http_scgi_module); - -#if (NGX_HTTP_CACHE) - params = r->upstream->cacheable ? &scf->params_cache : &scf->params; -#else - params = &scf->params; -#endif - - if (params->lengths) { - ngx_memzero(&le, sizeof(ngx_http_script_engine_t)); - - ngx_http_script_flush_no_cacheable_variables(r, params->flushes); - le.flushed = 1; - - le.ip = params->lengths->elts; - le.request = r; - - while (*(uintptr_t *) le.ip) { - - lcode = *(ngx_http_script_len_code_pt *) le.ip; - key_len = lcode(&le); - - lcode = *(ngx_http_script_len_code_pt *) le.ip; - skip_empty = lcode(&le); - - for (val_len = 0; *(uintptr_t *) le.ip; val_len += lcode(&le)) { - lcode = *(ngx_http_script_len_code_pt *) le.ip; - } - le.ip += sizeof(uintptr_t); - - if (skip_empty && val_len == 0) { - continue; - } - - len += key_len + val_len + 1; - } - } - - if (scf->upstream.pass_request_headers) { - - allocated = 0; - lowcase_key = NULL; - - if (ngx_http_link_multi_headers(r) != NGX_OK) { - return NGX_ERROR; - } - - if (params->number || r->headers_in.multi) { - n = 0; - part = &r->headers_in.headers.part; - - while (part) { - n += part->nelts; - part = part->next; - } - - ignored = ngx_palloc(r->pool, n * sizeof(void *)); - if (ignored == NULL) { - return NGX_ERROR; - } - } - - part = &r->headers_in.headers.part; - header = part->elts; - - for (i = 0; /* void */; i++) { - - if (i >= part->nelts) { - if (part->next == NULL) { - break; - } - - part = part->next; - header = part->elts; - i = 0; - } - - for (n = 0; n < header_params; n++) { - if (&header[i] == ignored[n]) { - goto next_length; - } - } - - if (params->number) { - if (allocated < header[i].key.len) { - allocated = header[i].key.len + 16; - lowcase_key = ngx_pnalloc(r->pool, allocated); - if (lowcase_key == NULL) { - return NGX_ERROR; - } - } - - hash = 0; - - for (n = 0; n < header[i].key.len; n++) { - ch = header[i].key.data[n]; - - if (ch >= 'A' && ch <= 'Z') { - ch |= 0x20; - - } else if (ch == '-') { - ch = '_'; - } - - hash = ngx_hash(hash, ch); - lowcase_key[n] = ch; - } - - if (ngx_hash_find(¶ms->hash, hash, lowcase_key, n)) { - ignored[header_params++] = &header[i]; - continue; - } - } - - len += sizeof("HTTP_") - 1 + header[i].key.len + 1 - + header[i].value.len + 1; - - for (hn = header[i].next; hn; hn = hn->next) { - len += hn->value.len + 2; - ignored[header_params++] = hn; - } - - next_length: - - continue; - } - } - - /* netstring: "length:" + packet + "," */ - - b = ngx_create_temp_buf(r->pool, NGX_SIZE_T_LEN + 1 + len + 1); - if (b == NULL) { - return NGX_ERROR; - } - - cl = ngx_alloc_chain_link(r->pool); - if (cl == NULL) { - return NGX_ERROR; - } - - cl->buf = b; - - b->last = ngx_sprintf(b->last, "%ui:CONTENT_LENGTH%Z%V%Z", - len, &content_length); - - if (params->lengths) { - ngx_memzero(&e, sizeof(ngx_http_script_engine_t)); - - e.ip = params->values->elts; - e.pos = b->last; - e.request = r; - e.flushed = 1; - - le.ip = params->lengths->elts; - - while (*(uintptr_t *) le.ip) { - - lcode = *(ngx_http_script_len_code_pt *) le.ip; - lcode(&le); /* key length */ - - lcode = *(ngx_http_script_len_code_pt *) le.ip; - skip_empty = lcode(&le); - - for (val_len = 0; *(uintptr_t *) le.ip; val_len += lcode(&le)) { - lcode = *(ngx_http_script_len_code_pt *) le.ip; - } - le.ip += sizeof(uintptr_t); - - if (skip_empty && val_len == 0) { - e.skip = 1; - - while (*(uintptr_t *) e.ip) { - code = *(ngx_http_script_code_pt *) e.ip; - code((ngx_http_script_engine_t *) &e); - } - e.ip += sizeof(uintptr_t); - - e.skip = 0; - - continue; - } - -#if (NGX_DEBUG) - key = e.pos; -#endif - code = *(ngx_http_script_code_pt *) e.ip; - code((ngx_http_script_engine_t *) &e); - -#if (NGX_DEBUG) - val = e.pos; -#endif - while (*(uintptr_t *) e.ip) { - code = *(ngx_http_script_code_pt *) e.ip; - code((ngx_http_script_engine_t *) &e); - } - *e.pos++ = '\0'; - e.ip += sizeof(uintptr_t); - - ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "scgi param: \"%s: %s\"", key, val); - } - - b->last = e.pos; - } - - if (scf->upstream.pass_request_headers) { - - part = &r->headers_in.headers.part; - header = part->elts; - - for (i = 0; /* void */; i++) { - - if (i >= part->nelts) { - if (part->next == NULL) { - break; - } - - part = part->next; - header = part->elts; - i = 0; - } - - for (n = 0; n < header_params; n++) { - if (&header[i] == ignored[n]) { - goto next_value; - } - } - - key = b->last; - b->last = ngx_cpymem(key, "HTTP_", sizeof("HTTP_") - 1); - - for (n = 0; n < header[i].key.len; n++) { - ch = header[i].key.data[n]; - - if (ch >= 'a' && ch <= 'z') { - ch &= ~0x20; - - } else if (ch == '-') { - ch = '_'; - } - - *b->last++ = ch; - } - - *b->last++ = (u_char) 0; - - val = b->last; - b->last = ngx_copy(val, header[i].value.data, header[i].value.len); - - if (header[i].next) { - - if (header[i].key.len == sizeof("Cookie") - 1 - && ngx_strncasecmp(header[i].key.data, (u_char *) "Cookie", - sizeof("Cookie") - 1) - == 0) - { - sep = ';'; - - } else { - sep = ','; - } - - for (hn = header[i].next; hn; hn = hn->next) { - *b->last++ = sep; - *b->last++ = ' '; - b->last = ngx_copy(b->last, hn->value.data, hn->value.len); - } - } - - *b->last++ = (u_char) 0; - - ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "scgi param: \"%s: %s\"", key, val); - - next_value: - - continue; - } - } - - *b->last++ = (u_char) ','; - - if (r->request_body_no_buffering) { - r->upstream->request_bufs = cl; - - } else if (scf->upstream.pass_request_body) { - body = r->upstream->request_bufs; - r->upstream->request_bufs = cl; - - while (body) { - b = ngx_alloc_buf(r->pool); - if (b == NULL) { - return NGX_ERROR; - } - - ngx_memcpy(b, body->buf, sizeof(ngx_buf_t)); - - cl->next = ngx_alloc_chain_link(r->pool); - if (cl->next == NULL) { - return NGX_ERROR; - } - - cl = cl->next; - cl->buf = b; - - body = body->next; - } - - } else { - r->upstream->request_bufs = cl; - } - - cl->next = NULL; - - return NGX_OK; -} - - -static ngx_int_t -ngx_http_scgi_reinit_request(ngx_http_request_t *r) -{ - ngx_http_status_t *status; - - status = ngx_http_get_module_ctx(r, ngx_http_scgi_module); - - if (status == NULL) { - return NGX_OK; - } - - status->code = 0; - status->count = 0; - status->start = NULL; - status->end = NULL; - - r->upstream->process_header = ngx_http_scgi_process_status_line; - r->state = 0; - - return NGX_OK; -} - - -static ngx_int_t -ngx_http_scgi_process_status_line(ngx_http_request_t *r) -{ - size_t len; - ngx_int_t rc; - ngx_http_status_t *status; - ngx_http_upstream_t *u; - - status = ngx_http_get_module_ctx(r, ngx_http_scgi_module); - - if (status == NULL) { - return NGX_ERROR; - } - - u = r->upstream; - - if (r->state == 0) { - r->header_name_start = u->buffer.pos; - } - - rc = ngx_http_parse_status_line(r, &u->buffer, status); - - if (rc == NGX_AGAIN) { - return rc; - } - - if (rc == NGX_ERROR) { - u->process_header = ngx_http_scgi_process_header; - u->buffer.pos = r->header_name_start; - r->state = 0; - return ngx_http_scgi_process_header(r); - } - - if (u->state && u->state->status == 0) { - u->state->status = status->code; - } - - u->headers_in.status_n = status->code; - - len = status->end - status->start; - u->headers_in.status_line.len = len; - - u->headers_in.status_line.data = ngx_pnalloc(r->pool, len); - if (u->headers_in.status_line.data == NULL) { - return NGX_ERROR; - } - - ngx_memcpy(u->headers_in.status_line.data, status->start, len); - - ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "http scgi status %ui \"%V\"", - u->headers_in.status_n, &u->headers_in.status_line); - - u->process_header = ngx_http_scgi_process_header; - - return ngx_http_scgi_process_header(r); -} - - -static ngx_int_t -ngx_http_scgi_process_header(ngx_http_request_t *r) -{ - ngx_str_t *status_line; - ngx_int_t rc, status; - ngx_table_elt_t *h; - ngx_http_upstream_t *u; - ngx_http_upstream_header_t *hh; - ngx_http_upstream_main_conf_t *umcf; - - umcf = ngx_http_get_module_main_conf(r, ngx_http_upstream_module); - - for ( ;; ) { - - rc = ngx_http_parse_header_line(r, &r->upstream->buffer, 1); - - if (rc == NGX_OK) { - - /* a header line has been parsed successfully */ - - h = ngx_list_push(&r->upstream->headers_in.headers); - if (h == NULL) { - return NGX_ERROR; - } - - h->hash = r->header_hash; - - h->key.len = r->header_name_end - r->header_name_start; - h->value.len = r->header_end - r->header_start; - - h->key.data = ngx_pnalloc(r->pool, - h->key.len + 1 + h->value.len + 1 - + h->key.len); - if (h->key.data == NULL) { - h->hash = 0; - return NGX_ERROR; - } - - h->value.data = h->key.data + h->key.len + 1; - h->lowcase_key = h->key.data + h->key.len + 1 + h->value.len + 1; - - ngx_memcpy(h->key.data, r->header_name_start, h->key.len); - h->key.data[h->key.len] = '\0'; - ngx_memcpy(h->value.data, r->header_start, h->value.len); - h->value.data[h->value.len] = '\0'; - - if (h->key.len == r->lowcase_index) { - ngx_memcpy(h->lowcase_key, r->lowcase_header, h->key.len); - - } else { - ngx_strlow(h->lowcase_key, h->key.data, h->key.len); - } - - hh = ngx_hash_find(&umcf->headers_in_hash, h->hash, - h->lowcase_key, h->key.len); - - if (hh) { - rc = hh->handler(r, h, hh->offset); - - if (rc != NGX_OK) { - return rc; - } - } - - ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "http scgi header: \"%V: %V\"", &h->key, &h->value); - - continue; - } - - if (rc == NGX_HTTP_PARSE_HEADER_DONE) { - - /* a whole header has been parsed successfully */ - - ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "http scgi header done"); - - u = r->upstream; - - if (u->headers_in.status_n) { - goto done; - } - - if (u->headers_in.status) { - status_line = &u->headers_in.status->value; - - status = ngx_atoi(status_line->data, 3); - if (status == NGX_ERROR) { - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "upstream sent invalid status \"%V\"", - status_line); - return NGX_HTTP_UPSTREAM_INVALID_HEADER; - } - - u->headers_in.status_n = status; - - if (status_line->len > 3) { - u->headers_in.status_line = *status_line; - } - - } else if (u->headers_in.location) { - u->headers_in.status_n = 302; - ngx_str_set(&u->headers_in.status_line, - "302 Moved Temporarily"); - - } else { - u->headers_in.status_n = 200; - ngx_str_set(&u->headers_in.status_line, "200 OK"); - } - - if (u->state && u->state->status == 0) { - u->state->status = u->headers_in.status_n; - } - - done: - - if (u->headers_in.status_n == NGX_HTTP_SWITCHING_PROTOCOLS - && r->headers_in.upgrade) - { - u->upgrade = 1; - } - - return NGX_OK; - } - - if (rc == NGX_AGAIN) { - return NGX_AGAIN; - } - - /* rc == NGX_HTTP_PARSE_INVALID_HEADER */ - - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "upstream sent invalid header: \"%*s\\x%02xd...\"", - r->header_end - r->header_name_start, - r->header_name_start, *r->header_end); - - return NGX_HTTP_UPSTREAM_INVALID_HEADER; - } -} - - -static ngx_int_t -ngx_http_scgi_input_filter_init(void *data) -{ - ngx_http_request_t *r = data; - ngx_http_upstream_t *u; - - u = r->upstream; - - ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "http scgi filter init s:%ui l:%O", - u->headers_in.status_n, u->headers_in.content_length_n); - - if (u->headers_in.status_n == NGX_HTTP_NO_CONTENT - || u->headers_in.status_n == NGX_HTTP_NOT_MODIFIED) - { - u->pipe->length = 0; - u->length = 0; - - } else if (r->method == NGX_HTTP_HEAD) { - u->pipe->length = -1; - u->length = -1; - - } else { - u->pipe->length = u->headers_in.content_length_n; - u->length = u->headers_in.content_length_n; - } - - return NGX_OK; -} - - -static void -ngx_http_scgi_abort_request(ngx_http_request_t *r) -{ - ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "abort http scgi request"); - - return; -} - - -static void -ngx_http_scgi_finalize_request(ngx_http_request_t *r, ngx_int_t rc) -{ - ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "finalize http scgi request"); - - return; -} - - -static void * -ngx_http_scgi_create_main_conf(ngx_conf_t *cf) -{ - ngx_http_scgi_main_conf_t *conf; - - conf = ngx_pcalloc(cf->pool, sizeof(ngx_http_scgi_main_conf_t)); - if (conf == NULL) { - return NULL; - } - -#if (NGX_HTTP_CACHE) - if (ngx_array_init(&conf->caches, cf->pool, 4, - sizeof(ngx_http_file_cache_t *)) - != NGX_OK) - { - return NULL; - } -#endif - - return conf; -} - - -static void * -ngx_http_scgi_create_loc_conf(ngx_conf_t *cf) -{ - ngx_http_scgi_loc_conf_t *conf; - - conf = ngx_pcalloc(cf->pool, sizeof(ngx_http_scgi_loc_conf_t)); - if (conf == NULL) { - return NULL; - } - - /* - * set by ngx_pcalloc(): - * - * conf->upstream.bufs.num = 0; - * conf->upstream.ignore_headers = 0; - * conf->upstream.next_upstream = 0; - * conf->upstream.cache_zone = NULL; - * conf->upstream.cache_use_stale = 0; - * conf->upstream.cache_methods = 0; - * conf->upstream.temp_path = NULL; - * conf->upstream.hide_headers_hash = { NULL, 0 }; - * conf->upstream.store_lengths = NULL; - * conf->upstream.store_values = NULL; - */ - - conf->upstream.store = NGX_CONF_UNSET; - conf->upstream.store_access = NGX_CONF_UNSET_UINT; - conf->upstream.next_upstream_tries = NGX_CONF_UNSET_UINT; - conf->upstream.buffering = NGX_CONF_UNSET; - conf->upstream.request_buffering = NGX_CONF_UNSET; - conf->upstream.ignore_client_abort = NGX_CONF_UNSET; - conf->upstream.force_ranges = NGX_CONF_UNSET; - - conf->upstream.local = NGX_CONF_UNSET_PTR; - conf->upstream.socket_keepalive = NGX_CONF_UNSET; - - conf->upstream.connect_timeout = NGX_CONF_UNSET_MSEC; - conf->upstream.send_timeout = NGX_CONF_UNSET_MSEC; - conf->upstream.read_timeout = NGX_CONF_UNSET_MSEC; - conf->upstream.next_upstream_timeout = NGX_CONF_UNSET_MSEC; - - conf->upstream.send_lowat = NGX_CONF_UNSET_SIZE; - conf->upstream.buffer_size = NGX_CONF_UNSET_SIZE; - conf->upstream.limit_rate = NGX_CONF_UNSET_PTR; - - conf->upstream.busy_buffers_size_conf = NGX_CONF_UNSET_SIZE; - conf->upstream.max_temp_file_size_conf = NGX_CONF_UNSET_SIZE; - conf->upstream.temp_file_write_size_conf = NGX_CONF_UNSET_SIZE; - - conf->upstream.pass_request_headers = NGX_CONF_UNSET; - conf->upstream.pass_request_body = NGX_CONF_UNSET; - -#if (NGX_HTTP_CACHE) - conf->upstream.cache = NGX_CONF_UNSET; - conf->upstream.cache_min_uses = NGX_CONF_UNSET_UINT; - conf->upstream.cache_max_range_offset = NGX_CONF_UNSET; - conf->upstream.cache_bypass = NGX_CONF_UNSET_PTR; - conf->upstream.no_cache = NGX_CONF_UNSET_PTR; - conf->upstream.cache_valid = NGX_CONF_UNSET_PTR; - conf->upstream.cache_lock = NGX_CONF_UNSET; - conf->upstream.cache_lock_timeout = NGX_CONF_UNSET_MSEC; - conf->upstream.cache_lock_age = NGX_CONF_UNSET_MSEC; - conf->upstream.cache_revalidate = NGX_CONF_UNSET; - conf->upstream.cache_background_update = NGX_CONF_UNSET; -#endif - - conf->upstream.hide_headers = NGX_CONF_UNSET_PTR; - conf->upstream.pass_headers = NGX_CONF_UNSET_PTR; - - conf->upstream.intercept_errors = NGX_CONF_UNSET; - - /* "scgi_cyclic_temp_file" is disabled */ - conf->upstream.cyclic_temp_file = 0; - - conf->upstream.change_buffering = 1; - - ngx_str_set(&conf->upstream.module, "scgi"); - - return conf; -} - - -static char * -ngx_http_scgi_merge_loc_conf(ngx_conf_t *cf, void *parent, void *child) -{ - ngx_http_scgi_loc_conf_t *prev = parent; - ngx_http_scgi_loc_conf_t *conf = child; - - size_t size; - ngx_int_t rc; - ngx_hash_init_t hash; - ngx_http_core_loc_conf_t *clcf; - -#if (NGX_HTTP_CACHE) - - if (conf->upstream.store > 0) { - conf->upstream.cache = 0; - } - - if (conf->upstream.cache > 0) { - conf->upstream.store = 0; - } - -#endif - - if (conf->upstream.store == NGX_CONF_UNSET) { - ngx_conf_merge_value(conf->upstream.store, prev->upstream.store, 0); - - conf->upstream.store_lengths = prev->upstream.store_lengths; - conf->upstream.store_values = prev->upstream.store_values; - } - - ngx_conf_merge_uint_value(conf->upstream.store_access, - prev->upstream.store_access, 0600); - - ngx_conf_merge_uint_value(conf->upstream.next_upstream_tries, - prev->upstream.next_upstream_tries, 0); - - ngx_conf_merge_value(conf->upstream.buffering, - prev->upstream.buffering, 1); - - ngx_conf_merge_value(conf->upstream.request_buffering, - prev->upstream.request_buffering, 1); - - ngx_conf_merge_value(conf->upstream.ignore_client_abort, - prev->upstream.ignore_client_abort, 0); - - ngx_conf_merge_value(conf->upstream.force_ranges, - prev->upstream.force_ranges, 0); - - ngx_conf_merge_ptr_value(conf->upstream.local, - prev->upstream.local, NULL); - - ngx_conf_merge_value(conf->upstream.socket_keepalive, - prev->upstream.socket_keepalive, 0); - - ngx_conf_merge_msec_value(conf->upstream.connect_timeout, - prev->upstream.connect_timeout, 60000); - - ngx_conf_merge_msec_value(conf->upstream.send_timeout, - prev->upstream.send_timeout, 60000); - - ngx_conf_merge_msec_value(conf->upstream.read_timeout, - prev->upstream.read_timeout, 60000); - - ngx_conf_merge_msec_value(conf->upstream.next_upstream_timeout, - prev->upstream.next_upstream_timeout, 0); - - ngx_conf_merge_size_value(conf->upstream.send_lowat, - prev->upstream.send_lowat, 0); - - ngx_conf_merge_size_value(conf->upstream.buffer_size, - prev->upstream.buffer_size, - (size_t) ngx_pagesize); - - ngx_conf_merge_ptr_value(conf->upstream.limit_rate, - prev->upstream.limit_rate, NULL); - - - ngx_conf_merge_bufs_value(conf->upstream.bufs, prev->upstream.bufs, - 8, ngx_pagesize); - - if (conf->upstream.bufs.num < 2) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "there must be at least 2 \"scgi_buffers\""); - return NGX_CONF_ERROR; - } - - - size = conf->upstream.buffer_size; - if (size < conf->upstream.bufs.size) { - size = conf->upstream.bufs.size; - } - - - ngx_conf_merge_size_value(conf->upstream.busy_buffers_size_conf, - prev->upstream.busy_buffers_size_conf, - NGX_CONF_UNSET_SIZE); - - if (conf->upstream.busy_buffers_size_conf == NGX_CONF_UNSET_SIZE) { - conf->upstream.busy_buffers_size = 2 * size; - } else { - conf->upstream.busy_buffers_size = - conf->upstream.busy_buffers_size_conf; - } - - if (conf->upstream.busy_buffers_size < size) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "\"scgi_busy_buffers_size\" must be equal to or greater " - "than the maximum of the value of \"scgi_buffer_size\" and " - "one of the \"scgi_buffers\""); - - return NGX_CONF_ERROR; - } - - if (conf->upstream.busy_buffers_size - > (conf->upstream.bufs.num - 1) * conf->upstream.bufs.size) - { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "\"scgi_busy_buffers_size\" must be less than " - "the size of all \"scgi_buffers\" minus one buffer"); - - return NGX_CONF_ERROR; - } - - - ngx_conf_merge_size_value(conf->upstream.temp_file_write_size_conf, - prev->upstream.temp_file_write_size_conf, - NGX_CONF_UNSET_SIZE); - - if (conf->upstream.temp_file_write_size_conf == NGX_CONF_UNSET_SIZE) { - conf->upstream.temp_file_write_size = 2 * size; - } else { - conf->upstream.temp_file_write_size = - conf->upstream.temp_file_write_size_conf; - } - - if (conf->upstream.temp_file_write_size < size) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "\"scgi_temp_file_write_size\" must be equal to or greater than " - "the maximum of the value of \"scgi_buffer_size\" and " - "one of the \"scgi_buffers\""); - - return NGX_CONF_ERROR; - } - - - ngx_conf_merge_size_value(conf->upstream.max_temp_file_size_conf, - prev->upstream.max_temp_file_size_conf, - NGX_CONF_UNSET_SIZE); - - if (conf->upstream.max_temp_file_size_conf == NGX_CONF_UNSET_SIZE) { - conf->upstream.max_temp_file_size = 1024 * 1024 * 1024; - } else { - conf->upstream.max_temp_file_size = - conf->upstream.max_temp_file_size_conf; - } - - if (conf->upstream.max_temp_file_size != 0 - && conf->upstream.max_temp_file_size < size) - { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "\"scgi_max_temp_file_size\" must be equal to zero to disable " - "temporary files usage or must be equal to or greater than " - "the maximum of the value of \"scgi_buffer_size\" and " - "one of the \"scgi_buffers\""); - - return NGX_CONF_ERROR; - } - - - ngx_conf_merge_bitmask_value(conf->upstream.ignore_headers, - prev->upstream.ignore_headers, - NGX_CONF_BITMASK_SET); - - - ngx_conf_merge_bitmask_value(conf->upstream.next_upstream, - prev->upstream.next_upstream, - (NGX_CONF_BITMASK_SET - |NGX_HTTP_UPSTREAM_FT_ERROR - |NGX_HTTP_UPSTREAM_FT_TIMEOUT)); - - if (conf->upstream.next_upstream & NGX_HTTP_UPSTREAM_FT_OFF) { - conf->upstream.next_upstream = NGX_CONF_BITMASK_SET - |NGX_HTTP_UPSTREAM_FT_OFF; - } - - if (ngx_conf_merge_path_value(cf, &conf->upstream.temp_path, - prev->upstream.temp_path, - &ngx_http_scgi_temp_path) - != NGX_CONF_OK) - { - return NGX_CONF_ERROR; - } - -#if (NGX_HTTP_CACHE) - - if (conf->upstream.cache == NGX_CONF_UNSET) { - ngx_conf_merge_value(conf->upstream.cache, - prev->upstream.cache, 0); - - conf->upstream.cache_zone = prev->upstream.cache_zone; - conf->upstream.cache_value = prev->upstream.cache_value; - } - - if (conf->upstream.cache_zone && conf->upstream.cache_zone->data == NULL) { - ngx_shm_zone_t *shm_zone; - - shm_zone = conf->upstream.cache_zone; - - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "\"scgi_cache\" zone \"%V\" is unknown", - &shm_zone->shm.name); - - return NGX_CONF_ERROR; - } - - ngx_conf_merge_uint_value(conf->upstream.cache_min_uses, - prev->upstream.cache_min_uses, 1); - - ngx_conf_merge_off_value(conf->upstream.cache_max_range_offset, - prev->upstream.cache_max_range_offset, - NGX_MAX_OFF_T_VALUE); - - ngx_conf_merge_bitmask_value(conf->upstream.cache_use_stale, - prev->upstream.cache_use_stale, - (NGX_CONF_BITMASK_SET - |NGX_HTTP_UPSTREAM_FT_OFF)); - - if (conf->upstream.cache_use_stale & NGX_HTTP_UPSTREAM_FT_OFF) { - conf->upstream.cache_use_stale = NGX_CONF_BITMASK_SET - |NGX_HTTP_UPSTREAM_FT_OFF; - } - - if (conf->upstream.cache_use_stale & NGX_HTTP_UPSTREAM_FT_ERROR) { - conf->upstream.cache_use_stale |= NGX_HTTP_UPSTREAM_FT_NOLIVE; - } - - if (conf->upstream.cache_methods == 0) { - conf->upstream.cache_methods = prev->upstream.cache_methods; - } - - conf->upstream.cache_methods |= NGX_HTTP_GET|NGX_HTTP_HEAD; - - ngx_conf_merge_ptr_value(conf->upstream.cache_bypass, - prev->upstream.cache_bypass, NULL); - - ngx_conf_merge_ptr_value(conf->upstream.no_cache, - prev->upstream.no_cache, NULL); - - ngx_conf_merge_ptr_value(conf->upstream.cache_valid, - prev->upstream.cache_valid, NULL); - - if (conf->cache_key.value.data == NULL) { - conf->cache_key = prev->cache_key; - } - - if (conf->upstream.cache && conf->cache_key.value.data == NULL) { - ngx_conf_log_error(NGX_LOG_WARN, cf, 0, - "no \"scgi_cache_key\" for \"scgi_cache\""); - } - - ngx_conf_merge_value(conf->upstream.cache_lock, - prev->upstream.cache_lock, 0); - - ngx_conf_merge_msec_value(conf->upstream.cache_lock_timeout, - prev->upstream.cache_lock_timeout, 5000); - - ngx_conf_merge_msec_value(conf->upstream.cache_lock_age, - prev->upstream.cache_lock_age, 5000); - - ngx_conf_merge_value(conf->upstream.cache_revalidate, - prev->upstream.cache_revalidate, 0); - - ngx_conf_merge_value(conf->upstream.cache_background_update, - prev->upstream.cache_background_update, 0); - -#endif - - ngx_conf_merge_value(conf->upstream.pass_request_headers, - prev->upstream.pass_request_headers, 1); - ngx_conf_merge_value(conf->upstream.pass_request_body, - prev->upstream.pass_request_body, 1); - - ngx_conf_merge_value(conf->upstream.intercept_errors, - prev->upstream.intercept_errors, 0); - - hash.max_size = 512; - hash.bucket_size = ngx_align(64, ngx_cacheline_size); - hash.name = "scgi_hide_headers_hash"; - - if (ngx_http_upstream_hide_headers_hash(cf, &conf->upstream, - &prev->upstream, ngx_http_scgi_hide_headers, &hash) - != NGX_OK) - { - return NGX_CONF_ERROR; - } - - clcf = ngx_http_conf_get_module_loc_conf(cf, ngx_http_core_module); - - if (clcf->noname - && conf->upstream.upstream == NULL && conf->scgi_lengths == NULL) - { - conf->upstream.upstream = prev->upstream.upstream; - conf->scgi_lengths = prev->scgi_lengths; - conf->scgi_values = prev->scgi_values; - } - - if (clcf->lmt_excpt && clcf->handler == NULL - && (conf->upstream.upstream || conf->scgi_lengths)) - { - clcf->handler = ngx_http_scgi_handler; - } - - if (conf->params_source == NULL) { - conf->params = prev->params; -#if (NGX_HTTP_CACHE) - conf->params_cache = prev->params_cache; -#endif - conf->params_source = prev->params_source; - } - - rc = ngx_http_scgi_init_params(cf, conf, &conf->params, - ngx_http_scgi_headers); - if (rc != NGX_OK) { - return NGX_CONF_ERROR; - } - -#if (NGX_HTTP_CACHE) - - if (conf->upstream.cache) { - rc = ngx_http_scgi_init_params(cf, conf, &conf->params_cache, - ngx_http_scgi_cache_headers); - if (rc != NGX_OK) { - return NGX_CONF_ERROR; - } - } - -#endif - - /* - * special handling to preserve conf->params in the "http" section - * to inherit it to all servers - */ - - if (prev->params.hash.buckets == NULL - && conf->params_source == prev->params_source) - { - prev->params = conf->params; -#if (NGX_HTTP_CACHE) - prev->params_cache = conf->params_cache; -#endif - } - - return NGX_CONF_OK; -} - - -static ngx_int_t -ngx_http_scgi_init_params(ngx_conf_t *cf, ngx_http_scgi_loc_conf_t *conf, - ngx_http_scgi_params_t *params, ngx_keyval_t *default_params) -{ - u_char *p; - size_t size; - uintptr_t *code; - ngx_uint_t i, nsrc; - ngx_array_t headers_names, params_merged; - ngx_keyval_t *h; - ngx_hash_key_t *hk; - ngx_hash_init_t hash; - ngx_http_upstream_param_t *src, *s; - ngx_http_script_compile_t sc; - ngx_http_script_copy_code_t *copy; - - if (params->hash.buckets) { - return NGX_OK; - } - - if (conf->params_source == NULL && default_params == NULL) { - params->hash.buckets = (void *) 1; - return NGX_OK; - } - - params->lengths = ngx_array_create(cf->pool, 64, 1); - if (params->lengths == NULL) { - return NGX_ERROR; - } - - params->values = ngx_array_create(cf->pool, 512, 1); - if (params->values == NULL) { - return NGX_ERROR; - } - - if (ngx_array_init(&headers_names, cf->temp_pool, 4, sizeof(ngx_hash_key_t)) - != NGX_OK) - { - return NGX_ERROR; - } - - if (conf->params_source) { - src = conf->params_source->elts; - nsrc = conf->params_source->nelts; - - } else { - src = NULL; - nsrc = 0; - } - - if (default_params) { - if (ngx_array_init(¶ms_merged, cf->temp_pool, 4, - sizeof(ngx_http_upstream_param_t)) - != NGX_OK) - { - return NGX_ERROR; - } - - for (i = 0; i < nsrc; i++) { - - s = ngx_array_push(¶ms_merged); - if (s == NULL) { - return NGX_ERROR; - } - - *s = src[i]; - } - - h = default_params; - - while (h->key.len) { - - src = params_merged.elts; - nsrc = params_merged.nelts; - - for (i = 0; i < nsrc; i++) { - if (ngx_strcasecmp(h->key.data, src[i].key.data) == 0) { - goto next; - } - } - - s = ngx_array_push(¶ms_merged); - if (s == NULL) { - return NGX_ERROR; - } - - s->key = h->key; - s->value = h->value; - s->skip_empty = 1; - - next: - - h++; - } - - src = params_merged.elts; - nsrc = params_merged.nelts; - } - - for (i = 0; i < nsrc; i++) { - - if (src[i].key.len > sizeof("HTTP_") - 1 - && ngx_strncmp(src[i].key.data, "HTTP_", sizeof("HTTP_") - 1) == 0) - { - hk = ngx_array_push(&headers_names); - if (hk == NULL) { - return NGX_ERROR; - } - - hk->key.len = src[i].key.len - 5; - hk->key.data = src[i].key.data + 5; - hk->key_hash = ngx_hash_key_lc(hk->key.data, hk->key.len); - hk->value = (void *) 1; - - if (src[i].value.len == 0) { - continue; - } - } - - copy = ngx_array_push_n(params->lengths, - sizeof(ngx_http_script_copy_code_t)); - if (copy == NULL) { - return NGX_ERROR; - } - - copy->code = (ngx_http_script_code_pt) (void *) - ngx_http_script_copy_len_code; - copy->len = src[i].key.len + 1; - - copy = ngx_array_push_n(params->lengths, - sizeof(ngx_http_script_copy_code_t)); - if (copy == NULL) { - return NGX_ERROR; - } - - copy->code = (ngx_http_script_code_pt) (void *) - ngx_http_script_copy_len_code; - copy->len = src[i].skip_empty; - - - size = (sizeof(ngx_http_script_copy_code_t) - + src[i].key.len + 1 + sizeof(uintptr_t) - 1) - & ~(sizeof(uintptr_t) - 1); - - copy = ngx_array_push_n(params->values, size); - if (copy == NULL) { - return NGX_ERROR; - } - - copy->code = ngx_http_script_copy_code; - copy->len = src[i].key.len + 1; - - p = (u_char *) copy + sizeof(ngx_http_script_copy_code_t); - (void) ngx_cpystrn(p, src[i].key.data, src[i].key.len + 1); - - - ngx_memzero(&sc, sizeof(ngx_http_script_compile_t)); - - sc.cf = cf; - sc.source = &src[i].value; - sc.flushes = ¶ms->flushes; - sc.lengths = ¶ms->lengths; - sc.values = ¶ms->values; - - if (ngx_http_script_compile(&sc) != NGX_OK) { - return NGX_ERROR; - } - - code = ngx_array_push_n(params->lengths, sizeof(uintptr_t)); - if (code == NULL) { - return NGX_ERROR; - } - - *code = (uintptr_t) NULL; - - - code = ngx_array_push_n(params->values, sizeof(uintptr_t)); - if (code == NULL) { - return NGX_ERROR; - } - - *code = (uintptr_t) NULL; - } - - code = ngx_array_push_n(params->lengths, sizeof(uintptr_t)); - if (code == NULL) { - return NGX_ERROR; - } - - *code = (uintptr_t) NULL; - - params->number = headers_names.nelts; - - hash.hash = ¶ms->hash; - hash.key = ngx_hash_key_lc; - hash.max_size = 512; - hash.bucket_size = 64; - hash.name = "scgi_params_hash"; - hash.pool = cf->pool; - hash.temp_pool = NULL; - - return ngx_hash_init(&hash, headers_names.elts, headers_names.nelts); -} - - -static char * -ngx_http_scgi_pass(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) -{ - ngx_http_scgi_loc_conf_t *scf = conf; - - ngx_url_t u; - ngx_str_t *value, *url; - ngx_uint_t n; - ngx_http_core_loc_conf_t *clcf; - ngx_http_script_compile_t sc; - - if (scf->upstream.upstream || scf->scgi_lengths) { - return "is duplicate"; - } - - clcf = ngx_http_conf_get_module_loc_conf(cf, ngx_http_core_module); - clcf->handler = ngx_http_scgi_handler; - - value = cf->args->elts; - - url = &value[1]; - - n = ngx_http_script_variables_count(url); - - if (n) { - - ngx_memzero(&sc, sizeof(ngx_http_script_compile_t)); - - sc.cf = cf; - sc.source = url; - sc.lengths = &scf->scgi_lengths; - sc.values = &scf->scgi_values; - sc.variables = n; - sc.complete_lengths = 1; - sc.complete_values = 1; - - if (ngx_http_script_compile(&sc) != NGX_OK) { - return NGX_CONF_ERROR; - } - - return NGX_CONF_OK; - } - - ngx_memzero(&u, sizeof(ngx_url_t)); - - u.url = value[1]; - u.no_resolve = 1; - - scf->upstream.upstream = ngx_http_upstream_add(cf, &u, 0); - if (scf->upstream.upstream == NULL) { - return NGX_CONF_ERROR; - } - - if (clcf->name.len && clcf->name.data[clcf->name.len - 1] == '/') { - clcf->auto_redirect = 1; - } - - return NGX_CONF_OK; -} - - -static char * -ngx_http_scgi_store(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) -{ - ngx_http_scgi_loc_conf_t *scf = conf; - - ngx_str_t *value; - ngx_http_script_compile_t sc; - - if (scf->upstream.store != NGX_CONF_UNSET) { - return "is duplicate"; - } - - value = cf->args->elts; - - if (ngx_strcmp(value[1].data, "off") == 0) { - scf->upstream.store = 0; - return NGX_CONF_OK; - } - - if (value[1].len == 0) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, "empty path"); - return NGX_CONF_ERROR; - } - -#if (NGX_HTTP_CACHE) - if (scf->upstream.cache > 0) { - return "is incompatible with \"scgi_cache\""; - } -#endif - - scf->upstream.store = 1; - - if (ngx_strcmp(value[1].data, "on") == 0) { - return NGX_CONF_OK; - } - - /* include the terminating '\0' into script */ - value[1].len++; - - ngx_memzero(&sc, sizeof(ngx_http_script_compile_t)); - - sc.cf = cf; - sc.source = &value[1]; - sc.lengths = &scf->upstream.store_lengths; - sc.values = &scf->upstream.store_values; - sc.variables = ngx_http_script_variables_count(&value[1]); - sc.complete_lengths = 1; - sc.complete_values = 1; - - if (ngx_http_script_compile(&sc) != NGX_OK) { - return NGX_CONF_ERROR; - } - - return NGX_CONF_OK; -} - - -#if (NGX_HTTP_CACHE) - -static char * -ngx_http_scgi_cache(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) -{ - ngx_http_scgi_loc_conf_t *scf = conf; - - ngx_str_t *value; - ngx_http_complex_value_t cv; - ngx_http_compile_complex_value_t ccv; - - value = cf->args->elts; - - if (scf->upstream.cache != NGX_CONF_UNSET) { - return "is duplicate"; - } - - if (ngx_strcmp(value[1].data, "off") == 0) { - scf->upstream.cache = 0; - return NGX_CONF_OK; - } - - if (scf->upstream.store > 0) { - return "is incompatible with \"scgi_store\""; - } - - scf->upstream.cache = 1; - - ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t)); - - ccv.cf = cf; - ccv.value = &value[1]; - ccv.complex_value = &cv; - - if (ngx_http_compile_complex_value(&ccv) != NGX_OK) { - return NGX_CONF_ERROR; - } - - if (cv.lengths != NULL) { - - scf->upstream.cache_value = ngx_palloc(cf->pool, - sizeof(ngx_http_complex_value_t)); - if (scf->upstream.cache_value == NULL) { - return NGX_CONF_ERROR; - } - - *scf->upstream.cache_value = cv; - - return NGX_CONF_OK; - } - - scf->upstream.cache_zone = ngx_shared_memory_add(cf, &value[1], 0, - &ngx_http_scgi_module); - if (scf->upstream.cache_zone == NULL) { - return NGX_CONF_ERROR; - } - - return NGX_CONF_OK; -} - - -static char * -ngx_http_scgi_cache_key(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) -{ - ngx_http_scgi_loc_conf_t *scf = conf; - - ngx_str_t *value; - ngx_http_compile_complex_value_t ccv; - - value = cf->args->elts; - - if (scf->cache_key.value.data) { - return "is duplicate"; - } - - ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t)); - - ccv.cf = cf; - ccv.value = &value[1]; - ccv.complex_value = &scf->cache_key; - - if (ngx_http_compile_complex_value(&ccv) != NGX_OK) { - return NGX_CONF_ERROR; - } - - return NGX_CONF_OK; -} - -#endif diff --git a/src/deps/src/nginx-1.30.3/src/http/modules/ngx_http_secure_link_module.c b/src/deps/src/nginx-1.30.3/src/http/modules/ngx_http_secure_link_module.c deleted file mode 100644 index 4d4ce6af11..0000000000 --- a/src/deps/src/nginx-1.30.3/src/http/modules/ngx_http_secure_link_module.c +++ /dev/null @@ -1,366 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#include -#include -#include -#include - - -typedef struct { - ngx_http_complex_value_t *variable; - ngx_http_complex_value_t *md5; - ngx_str_t secret; -} ngx_http_secure_link_conf_t; - - -typedef struct { - ngx_str_t expires; -} ngx_http_secure_link_ctx_t; - - -static ngx_int_t ngx_http_secure_link_old_variable(ngx_http_request_t *r, - ngx_http_secure_link_conf_t *conf, ngx_http_variable_value_t *v, - uintptr_t data); -static ngx_int_t ngx_http_secure_link_expires_variable(ngx_http_request_t *r, - ngx_http_variable_value_t *v, uintptr_t data); -static void *ngx_http_secure_link_create_conf(ngx_conf_t *cf); -static char *ngx_http_secure_link_merge_conf(ngx_conf_t *cf, void *parent, - void *child); -static ngx_int_t ngx_http_secure_link_add_variables(ngx_conf_t *cf); - - -static ngx_command_t ngx_http_secure_link_commands[] = { - - { ngx_string("secure_link"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1, - ngx_http_set_complex_value_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_secure_link_conf_t, variable), - NULL }, - - { ngx_string("secure_link_md5"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1, - ngx_http_set_complex_value_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_secure_link_conf_t, md5), - NULL }, - - { ngx_string("secure_link_secret"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1, - ngx_conf_set_str_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_secure_link_conf_t, secret), - NULL }, - - ngx_null_command -}; - - -static ngx_http_module_t ngx_http_secure_link_module_ctx = { - ngx_http_secure_link_add_variables, /* preconfiguration */ - NULL, /* postconfiguration */ - - NULL, /* create main configuration */ - NULL, /* init main configuration */ - - NULL, /* create server configuration */ - NULL, /* merge server configuration */ - - ngx_http_secure_link_create_conf, /* create location configuration */ - ngx_http_secure_link_merge_conf /* merge location configuration */ -}; - - -ngx_module_t ngx_http_secure_link_module = { - NGX_MODULE_V1, - &ngx_http_secure_link_module_ctx, /* module context */ - ngx_http_secure_link_commands, /* module directives */ - NGX_HTTP_MODULE, /* module type */ - NULL, /* init master */ - NULL, /* init module */ - NULL, /* init process */ - NULL, /* init thread */ - NULL, /* exit thread */ - NULL, /* exit process */ - NULL, /* exit master */ - NGX_MODULE_V1_PADDING -}; - - -static ngx_str_t ngx_http_secure_link_name = ngx_string("secure_link"); -static ngx_str_t ngx_http_secure_link_expires_name = - ngx_string("secure_link_expires"); - - -static ngx_int_t -ngx_http_secure_link_variable(ngx_http_request_t *r, - ngx_http_variable_value_t *v, uintptr_t data) -{ - u_char *p, *last; - ngx_str_t val, hash; - time_t expires; - ngx_md5_t md5; - ngx_http_secure_link_ctx_t *ctx; - ngx_http_secure_link_conf_t *conf; - u_char hash_buf[18], md5_buf[16]; - - conf = ngx_http_get_module_loc_conf(r, ngx_http_secure_link_module); - - if (conf->secret.data) { - return ngx_http_secure_link_old_variable(r, conf, v, data); - } - - if (conf->variable == NULL || conf->md5 == NULL) { - goto not_found; - } - - if (ngx_http_complex_value(r, conf->variable, &val) != NGX_OK) { - return NGX_ERROR; - } - - ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "secure link: \"%V\"", &val); - - last = val.data + val.len; - - p = ngx_strlchr(val.data, last, ','); - expires = 0; - - if (p) { - val.len = p++ - val.data; - - expires = ngx_atotm(p, last - p); - if (expires <= 0) { - goto not_found; - } - - ctx = ngx_pcalloc(r->pool, sizeof(ngx_http_secure_link_ctx_t)); - if (ctx == NULL) { - return NGX_ERROR; - } - - ngx_http_set_ctx(r, ctx, ngx_http_secure_link_module); - - ctx->expires.len = last - p; - ctx->expires.data = p; - } - - if (val.len > 24) { - goto not_found; - } - - hash.data = hash_buf; - - if (ngx_decode_base64url(&hash, &val) != NGX_OK) { - goto not_found; - } - - if (hash.len != 16) { - goto not_found; - } - - if (ngx_http_complex_value(r, conf->md5, &val) != NGX_OK) { - return NGX_ERROR; - } - - ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "secure link md5: \"%V\"", &val); - - ngx_md5_init(&md5); - ngx_md5_update(&md5, val.data, val.len); - ngx_md5_final(md5_buf, &md5); - - if (ngx_memcmp(hash_buf, md5_buf, 16) != 0) { - goto not_found; - } - - v->data = (u_char *) ((expires && expires < ngx_time()) ? "0" : "1"); - v->len = 1; - v->valid = 1; - v->no_cacheable = 0; - v->not_found = 0; - - return NGX_OK; - -not_found: - - v->not_found = 1; - - return NGX_OK; -} - - -static ngx_int_t -ngx_http_secure_link_old_variable(ngx_http_request_t *r, - ngx_http_secure_link_conf_t *conf, ngx_http_variable_value_t *v, - uintptr_t data) -{ - u_char *p, *start, *end, *last; - size_t len; - ngx_int_t n; - ngx_uint_t i; - ngx_md5_t md5; - u_char hash[16]; - - p = &r->unparsed_uri.data[1]; - last = r->unparsed_uri.data + r->unparsed_uri.len; - - while (p < last) { - if (*p++ == '/') { - start = p; - goto md5_start; - } - } - - goto not_found; - -md5_start: - - while (p < last) { - if (*p++ == '/') { - end = p - 1; - goto url_start; - } - } - - goto not_found; - -url_start: - - len = last - p; - - if (end - start != 32 || len == 0) { - goto not_found; - } - - ngx_md5_init(&md5); - ngx_md5_update(&md5, p, len); - ngx_md5_update(&md5, conf->secret.data, conf->secret.len); - ngx_md5_final(hash, &md5); - - for (i = 0; i < 16; i++) { - n = ngx_hextoi(&start[2 * i], 2); - if (n == NGX_ERROR || n != hash[i]) { - goto not_found; - } - } - - v->len = len; - v->valid = 1; - v->no_cacheable = 0; - v->not_found = 0; - v->data = p; - - return NGX_OK; - -not_found: - - v->not_found = 1; - - return NGX_OK; -} - - -static ngx_int_t -ngx_http_secure_link_expires_variable(ngx_http_request_t *r, - ngx_http_variable_value_t *v, uintptr_t data) -{ - ngx_http_secure_link_ctx_t *ctx; - - ctx = ngx_http_get_module_ctx(r, ngx_http_secure_link_module); - - if (ctx) { - v->len = ctx->expires.len; - v->valid = 1; - v->no_cacheable = 0; - v->not_found = 0; - v->data = ctx->expires.data; - - } else { - v->not_found = 1; - } - - return NGX_OK; -} - - -static void * -ngx_http_secure_link_create_conf(ngx_conf_t *cf) -{ - ngx_http_secure_link_conf_t *conf; - - conf = ngx_pcalloc(cf->pool, sizeof(ngx_http_secure_link_conf_t)); - if (conf == NULL) { - return NULL; - } - - /* - * set by ngx_pcalloc(): - * - * conf->secret = { 0, NULL }; - */ - - conf->variable = NGX_CONF_UNSET_PTR; - conf->md5 = NGX_CONF_UNSET_PTR; - - return conf; -} - - -static char * -ngx_http_secure_link_merge_conf(ngx_conf_t *cf, void *parent, void *child) -{ - ngx_http_secure_link_conf_t *prev = parent; - ngx_http_secure_link_conf_t *conf = child; - - if (conf->secret.data) { - ngx_conf_init_ptr_value(conf->variable, NULL); - ngx_conf_init_ptr_value(conf->md5, NULL); - - if (conf->variable || conf->md5) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "\"secure_link_secret\" cannot be mixed with " - "\"secure_link\" and \"secure_link_md5\""); - return NGX_CONF_ERROR; - } - - return NGX_CONF_OK; - } - - ngx_conf_merge_ptr_value(conf->variable, prev->variable, NULL); - ngx_conf_merge_ptr_value(conf->md5, prev->md5, NULL); - - if (conf->variable == NULL && conf->md5 == NULL) { - conf->secret = prev->secret; - } - - return NGX_CONF_OK; -} - - -static ngx_int_t -ngx_http_secure_link_add_variables(ngx_conf_t *cf) -{ - ngx_http_variable_t *var; - - var = ngx_http_add_variable(cf, &ngx_http_secure_link_name, 0); - if (var == NULL) { - return NGX_ERROR; - } - - var->get_handler = ngx_http_secure_link_variable; - - var = ngx_http_add_variable(cf, &ngx_http_secure_link_expires_name, 0); - if (var == NULL) { - return NGX_ERROR; - } - - var->get_handler = ngx_http_secure_link_expires_variable; - - return NGX_OK; -} diff --git a/src/deps/src/nginx-1.30.3/src/http/modules/ngx_http_slice_filter_module.c b/src/deps/src/nginx-1.30.3/src/http/modules/ngx_http_slice_filter_module.c deleted file mode 100644 index 67dc14c824..0000000000 --- a/src/deps/src/nginx-1.30.3/src/http/modules/ngx_http_slice_filter_module.c +++ /dev/null @@ -1,550 +0,0 @@ - -/* - * Copyright (C) Roman Arutyunyan - * Copyright (C) Nginx, Inc. - */ - - -#include -#include -#include - - -typedef struct { - size_t size; -} ngx_http_slice_loc_conf_t; - - -typedef struct { - off_t start; - off_t end; - ngx_str_t range; - ngx_str_t etag; - unsigned last:1; - unsigned active:1; - ngx_http_request_t *sr; -} ngx_http_slice_ctx_t; - - -typedef struct { - off_t start; - off_t end; - off_t complete_length; -} ngx_http_slice_content_range_t; - - -static ngx_int_t ngx_http_slice_header_filter(ngx_http_request_t *r); -static ngx_int_t ngx_http_slice_body_filter(ngx_http_request_t *r, - ngx_chain_t *in); -static ngx_int_t ngx_http_slice_parse_content_range(ngx_http_request_t *r, - ngx_http_slice_content_range_t *cr); -static ngx_int_t ngx_http_slice_range_variable(ngx_http_request_t *r, - ngx_http_variable_value_t *v, uintptr_t data); -static off_t ngx_http_slice_get_start(ngx_http_request_t *r); -static void *ngx_http_slice_create_loc_conf(ngx_conf_t *cf); -static char *ngx_http_slice_merge_loc_conf(ngx_conf_t *cf, void *parent, - void *child); -static ngx_int_t ngx_http_slice_add_variables(ngx_conf_t *cf); -static ngx_int_t ngx_http_slice_init(ngx_conf_t *cf); - - -static ngx_command_t ngx_http_slice_filter_commands[] = { - - { ngx_string("slice"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1, - ngx_conf_set_size_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_slice_loc_conf_t, size), - NULL }, - - ngx_null_command -}; - - -static ngx_http_module_t ngx_http_slice_filter_module_ctx = { - ngx_http_slice_add_variables, /* preconfiguration */ - ngx_http_slice_init, /* postconfiguration */ - - NULL, /* create main configuration */ - NULL, /* init main configuration */ - - NULL, /* create server configuration */ - NULL, /* merge server configuration */ - - ngx_http_slice_create_loc_conf, /* create location configuration */ - ngx_http_slice_merge_loc_conf /* merge location configuration */ -}; - - -ngx_module_t ngx_http_slice_filter_module = { - NGX_MODULE_V1, - &ngx_http_slice_filter_module_ctx, /* module context */ - ngx_http_slice_filter_commands, /* module directives */ - NGX_HTTP_MODULE, /* module type */ - NULL, /* init master */ - NULL, /* init module */ - NULL, /* init process */ - NULL, /* init thread */ - NULL, /* exit thread */ - NULL, /* exit process */ - NULL, /* exit master */ - NGX_MODULE_V1_PADDING -}; - - -static ngx_str_t ngx_http_slice_range_name = ngx_string("slice_range"); - -static ngx_http_output_header_filter_pt ngx_http_next_header_filter; -static ngx_http_output_body_filter_pt ngx_http_next_body_filter; - - -static ngx_int_t -ngx_http_slice_header_filter(ngx_http_request_t *r) -{ - off_t end; - ngx_int_t rc; - ngx_table_elt_t *h; - ngx_http_slice_ctx_t *ctx; - ngx_http_slice_loc_conf_t *slcf; - ngx_http_slice_content_range_t cr; - - ctx = ngx_http_get_module_ctx(r, ngx_http_slice_filter_module); - if (ctx == NULL) { - return ngx_http_next_header_filter(r); - } - - if (r->headers_out.status != NGX_HTTP_PARTIAL_CONTENT) { - if (r == r->main) { - ngx_http_set_ctx(r, NULL, ngx_http_slice_filter_module); - return ngx_http_next_header_filter(r); - } - - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "unexpected status code %ui in slice response", - r->headers_out.status); - return NGX_ERROR; - } - - h = r->headers_out.etag; - - if (ctx->etag.len) { - if (h == NULL - || h->value.len != ctx->etag.len - || ngx_strncmp(h->value.data, ctx->etag.data, ctx->etag.len) - != 0) - { - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "etag mismatch in slice response"); - return NGX_ERROR; - } - } - - if (h) { - ctx->etag = h->value; - } - - if (ngx_http_slice_parse_content_range(r, &cr) != NGX_OK) { - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "invalid range in slice response"); - return NGX_ERROR; - } - - if (cr.complete_length == -1) { - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "no complete length in slice response"); - return NGX_ERROR; - } - - ngx_log_debug3(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "http slice response range: %O-%O/%O", - cr.start, cr.end, cr.complete_length); - - slcf = ngx_http_get_module_loc_conf(r, ngx_http_slice_filter_module); - - end = ngx_min(cr.start + (off_t) slcf->size, cr.complete_length); - - if (cr.start != ctx->start || cr.end != end) { - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "unexpected range in slice response: %O-%O, " - "expected: %O-%O", cr.start, cr.end, ctx->start, end); - return NGX_ERROR; - } - - ctx->start = end; - ctx->active = 1; - - r->headers_out.status = NGX_HTTP_OK; - r->headers_out.status_line.len = 0; - r->headers_out.content_length_n = cr.complete_length; - r->headers_out.content_offset = cr.start; - r->headers_out.content_range->hash = 0; - r->headers_out.content_range = NULL; - - if (r->headers_out.accept_ranges) { - r->headers_out.accept_ranges->hash = 0; - r->headers_out.accept_ranges = NULL; - } - - r->allow_ranges = 1; - r->subrequest_ranges = 1; - r->single_range = 1; - - rc = ngx_http_next_header_filter(r); - - if (r != r->main) { - return rc; - } - - r->preserve_body = 1; - - if (r->headers_out.status == NGX_HTTP_PARTIAL_CONTENT) { - if (ctx->start + (off_t) slcf->size <= r->headers_out.content_offset) { - ctx->start = slcf->size - * (r->headers_out.content_offset / slcf->size); - } - - ctx->end = r->headers_out.content_offset - + r->headers_out.content_length_n; - - } else { - ctx->end = cr.complete_length; - } - - return rc; -} - - -static ngx_int_t -ngx_http_slice_body_filter(ngx_http_request_t *r, ngx_chain_t *in) -{ - ngx_int_t rc; - ngx_chain_t *cl; - ngx_http_slice_ctx_t *ctx; - ngx_http_slice_loc_conf_t *slcf; - - ctx = ngx_http_get_module_ctx(r, ngx_http_slice_filter_module); - - if (ctx == NULL || r != r->main) { - return ngx_http_next_body_filter(r, in); - } - - for (cl = in; cl; cl = cl->next) { - if (cl->buf->last_buf) { - cl->buf->last_buf = 0; - cl->buf->last_in_chain = 1; - cl->buf->sync = 1; - ctx->last = 1; - } - } - - rc = ngx_http_next_body_filter(r, in); - - if (rc == NGX_ERROR || !ctx->last) { - return rc; - } - - if (ctx->sr && !ctx->sr->done) { - return rc; - } - - if (!ctx->active) { - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "missing slice response"); - return NGX_ERROR; - } - - if (ctx->start >= ctx->end) { - ngx_http_set_ctx(r, NULL, ngx_http_slice_filter_module); - ngx_http_send_special(r, NGX_HTTP_LAST); - return rc; - } - - if (r->buffered) { - return rc; - } - - if (ngx_http_subrequest(r, &r->uri, &r->args, &ctx->sr, NULL, - NGX_HTTP_SUBREQUEST_CLONE) - != NGX_OK) - { - return NGX_ERROR; - } - - ngx_http_set_ctx(ctx->sr, ctx, ngx_http_slice_filter_module); - - slcf = ngx_http_get_module_loc_conf(r, ngx_http_slice_filter_module); - - ctx->range.len = ngx_sprintf(ctx->range.data, "bytes=%O-%O", ctx->start, - ctx->start + (off_t) slcf->size - 1) - - ctx->range.data; - - ctx->active = 0; - - ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "http slice subrequest: \"%V\"", &ctx->range); - - return rc; -} - - -static ngx_int_t -ngx_http_slice_parse_content_range(ngx_http_request_t *r, - ngx_http_slice_content_range_t *cr) -{ - off_t start, end, complete_length, cutoff, cutlim; - u_char *p; - ngx_table_elt_t *h; - - h = r->headers_out.content_range; - - if (h == NULL - || h->value.len < 7 - || ngx_strncmp(h->value.data, "bytes ", 6) != 0) - { - return NGX_ERROR; - } - - p = h->value.data + 6; - - cutoff = NGX_MAX_OFF_T_VALUE / 10; - cutlim = NGX_MAX_OFF_T_VALUE % 10; - - start = 0; - end = 0; - complete_length = 0; - - while (*p == ' ') { p++; } - - if (*p < '0' || *p > '9') { - return NGX_ERROR; - } - - while (*p >= '0' && *p <= '9') { - if (start >= cutoff && (start > cutoff || *p - '0' > cutlim)) { - return NGX_ERROR; - } - - start = start * 10 + (*p++ - '0'); - } - - while (*p == ' ') { p++; } - - if (*p++ != '-') { - return NGX_ERROR; - } - - while (*p == ' ') { p++; } - - if (*p < '0' || *p > '9') { - return NGX_ERROR; - } - - while (*p >= '0' && *p <= '9') { - if (end >= cutoff && (end > cutoff || *p - '0' > cutlim)) { - return NGX_ERROR; - } - - end = end * 10 + (*p++ - '0'); - } - - end++; - - while (*p == ' ') { p++; } - - if (*p++ != '/') { - return NGX_ERROR; - } - - while (*p == ' ') { p++; } - - if (*p != '*') { - if (*p < '0' || *p > '9') { - return NGX_ERROR; - } - - while (*p >= '0' && *p <= '9') { - if (complete_length >= cutoff - && (complete_length > cutoff || *p - '0' > cutlim)) - { - return NGX_ERROR; - } - - complete_length = complete_length * 10 + (*p++ - '0'); - } - - } else { - complete_length = -1; - p++; - } - - while (*p == ' ') { p++; } - - if (*p != '\0') { - return NGX_ERROR; - } - - cr->start = start; - cr->end = end; - cr->complete_length = complete_length; - - return NGX_OK; -} - - -static ngx_int_t -ngx_http_slice_range_variable(ngx_http_request_t *r, - ngx_http_variable_value_t *v, uintptr_t data) -{ - u_char *p; - ngx_http_slice_ctx_t *ctx; - ngx_http_slice_loc_conf_t *slcf; - - ctx = ngx_http_get_module_ctx(r, ngx_http_slice_filter_module); - - if (ctx == NULL) { - if (r != r->main || r->headers_out.status) { - v->not_found = 1; - return NGX_OK; - } - - slcf = ngx_http_get_module_loc_conf(r, ngx_http_slice_filter_module); - - if (slcf->size == 0) { - v->not_found = 1; - return NGX_OK; - } - - ctx = ngx_pcalloc(r->pool, sizeof(ngx_http_slice_ctx_t)); - if (ctx == NULL) { - return NGX_ERROR; - } - - p = ngx_pnalloc(r->pool, sizeof("bytes=-") - 1 + 2 * NGX_OFF_T_LEN); - if (p == NULL) { - return NGX_ERROR; - } - - ngx_http_set_ctx(r, ctx, ngx_http_slice_filter_module); - - ctx->start = slcf->size * (ngx_http_slice_get_start(r) / slcf->size); - - ctx->range.data = p; - ctx->range.len = ngx_sprintf(p, "bytes=%O-%O", ctx->start, - ctx->start + (off_t) slcf->size - 1) - - p; - } - - v->data = ctx->range.data; - v->valid = 1; - v->not_found = 0; - v->no_cacheable = 1; - v->len = ctx->range.len; - - return NGX_OK; -} - - -static off_t -ngx_http_slice_get_start(ngx_http_request_t *r) -{ - off_t start, cutoff, cutlim; - u_char *p; - ngx_table_elt_t *h; - - if (r->headers_in.if_range) { - return 0; - } - - h = r->headers_in.range; - - if (h == NULL - || h->value.len < 7 - || ngx_strncasecmp(h->value.data, (u_char *) "bytes=", 6) != 0) - { - return 0; - } - - p = h->value.data + 6; - - if (ngx_strchr(p, ',')) { - return 0; - } - - while (*p == ' ') { p++; } - - if (*p == '-') { - return 0; - } - - cutoff = NGX_MAX_OFF_T_VALUE / 10; - cutlim = NGX_MAX_OFF_T_VALUE % 10; - - start = 0; - - while (*p >= '0' && *p <= '9') { - if (start >= cutoff && (start > cutoff || *p - '0' > cutlim)) { - return 0; - } - - start = start * 10 + (*p++ - '0'); - } - - return start; -} - - -static void * -ngx_http_slice_create_loc_conf(ngx_conf_t *cf) -{ - ngx_http_slice_loc_conf_t *slcf; - - slcf = ngx_palloc(cf->pool, sizeof(ngx_http_slice_loc_conf_t)); - if (slcf == NULL) { - return NULL; - } - - slcf->size = NGX_CONF_UNSET_SIZE; - - return slcf; -} - - -static char * -ngx_http_slice_merge_loc_conf(ngx_conf_t *cf, void *parent, void *child) -{ - ngx_http_slice_loc_conf_t *prev = parent; - ngx_http_slice_loc_conf_t *conf = child; - - ngx_conf_merge_size_value(conf->size, prev->size, 0); - - return NGX_CONF_OK; -} - - -static ngx_int_t -ngx_http_slice_add_variables(ngx_conf_t *cf) -{ - ngx_http_variable_t *var; - - var = ngx_http_add_variable(cf, &ngx_http_slice_range_name, 0); - if (var == NULL) { - return NGX_ERROR; - } - - var->get_handler = ngx_http_slice_range_variable; - - return NGX_OK; -} - - -static ngx_int_t -ngx_http_slice_init(ngx_conf_t *cf) -{ - ngx_http_next_header_filter = ngx_http_top_header_filter; - ngx_http_top_header_filter = ngx_http_slice_header_filter; - - ngx_http_next_body_filter = ngx_http_top_body_filter; - ngx_http_top_body_filter = ngx_http_slice_body_filter; - - return NGX_OK; -} diff --git a/src/deps/src/nginx-1.30.3/src/http/modules/ngx_http_split_clients_module.c b/src/deps/src/nginx-1.30.3/src/http/modules/ngx_http_split_clients_module.c deleted file mode 100644 index 2f92c9e1a8..0000000000 --- a/src/deps/src/nginx-1.30.3/src/http/modules/ngx_http_split_clients_module.c +++ /dev/null @@ -1,246 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#include -#include -#include - - -typedef struct { - uint32_t percent; - ngx_http_variable_value_t value; -} ngx_http_split_clients_part_t; - - -typedef struct { - ngx_http_complex_value_t value; - ngx_array_t parts; -} ngx_http_split_clients_ctx_t; - - -static char *ngx_conf_split_clients_block(ngx_conf_t *cf, ngx_command_t *cmd, - void *conf); -static char *ngx_http_split_clients(ngx_conf_t *cf, ngx_command_t *dummy, - void *conf); - -static ngx_command_t ngx_http_split_clients_commands[] = { - - { ngx_string("split_clients"), - NGX_HTTP_MAIN_CONF|NGX_CONF_BLOCK|NGX_CONF_TAKE2, - ngx_conf_split_clients_block, - NGX_HTTP_MAIN_CONF_OFFSET, - 0, - NULL }, - - ngx_null_command -}; - - -static ngx_http_module_t ngx_http_split_clients_module_ctx = { - NULL, /* preconfiguration */ - NULL, /* postconfiguration */ - - NULL, /* create main configuration */ - NULL, /* init main configuration */ - - NULL, /* create server configuration */ - NULL, /* merge server configuration */ - - NULL, /* create location configuration */ - NULL /* merge location configuration */ -}; - - -ngx_module_t ngx_http_split_clients_module = { - NGX_MODULE_V1, - &ngx_http_split_clients_module_ctx, /* module context */ - ngx_http_split_clients_commands, /* module directives */ - NGX_HTTP_MODULE, /* module type */ - NULL, /* init master */ - NULL, /* init module */ - NULL, /* init process */ - NULL, /* init thread */ - NULL, /* exit thread */ - NULL, /* exit process */ - NULL, /* exit master */ - NGX_MODULE_V1_PADDING -}; - - -static ngx_int_t -ngx_http_split_clients_variable(ngx_http_request_t *r, - ngx_http_variable_value_t *v, uintptr_t data) -{ - ngx_http_split_clients_ctx_t *ctx = (ngx_http_split_clients_ctx_t *) data; - - uint32_t hash; - ngx_str_t val; - ngx_uint_t i; - ngx_http_split_clients_part_t *part; - - *v = ngx_http_variable_null_value; - - if (ngx_http_complex_value(r, &ctx->value, &val) != NGX_OK) { - return NGX_OK; - } - - hash = ngx_murmur_hash2(val.data, val.len); - - part = ctx->parts.elts; - - for (i = 0; i < ctx->parts.nelts; i++) { - - ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "http split: %uD %uD", hash, part[i].percent); - - if (hash < part[i].percent || part[i].percent == 0) { - *v = part[i].value; - return NGX_OK; - } - } - - return NGX_OK; -} - - -static char * -ngx_conf_split_clients_block(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) -{ - char *rv; - uint32_t sum, last; - ngx_str_t *value, name; - ngx_uint_t i; - ngx_conf_t save; - ngx_http_variable_t *var; - ngx_http_split_clients_ctx_t *ctx; - ngx_http_split_clients_part_t *part; - ngx_http_compile_complex_value_t ccv; - - ctx = ngx_pcalloc(cf->pool, sizeof(ngx_http_split_clients_ctx_t)); - if (ctx == NULL) { - return NGX_CONF_ERROR; - } - - value = cf->args->elts; - - ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t)); - - ccv.cf = cf; - ccv.value = &value[1]; - ccv.complex_value = &ctx->value; - - if (ngx_http_compile_complex_value(&ccv) != NGX_OK) { - return NGX_CONF_ERROR; - } - - name = value[2]; - - if (name.data[0] != '$') { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "invalid variable name \"%V\"", &name); - return NGX_CONF_ERROR; - } - - name.len--; - name.data++; - - var = ngx_http_add_variable(cf, &name, NGX_HTTP_VAR_CHANGEABLE); - if (var == NULL) { - return NGX_CONF_ERROR; - } - - var->get_handler = ngx_http_split_clients_variable; - var->data = (uintptr_t) ctx; - - if (ngx_array_init(&ctx->parts, cf->pool, 2, - sizeof(ngx_http_split_clients_part_t)) - != NGX_OK) - { - return NGX_CONF_ERROR; - } - - save = *cf; - cf->ctx = ctx; - cf->handler = ngx_http_split_clients; - cf->handler_conf = conf; - - rv = ngx_conf_parse(cf, NULL); - - *cf = save; - - if (rv != NGX_CONF_OK) { - return rv; - } - - sum = 0; - last = 0; - part = ctx->parts.elts; - - for (i = 0; i < ctx->parts.nelts; i++) { - sum = part[i].percent ? sum + part[i].percent : 10000; - if (sum > 10000) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "percent total is greater than 100%%"); - return NGX_CONF_ERROR; - } - - if (part[i].percent) { - last += part[i].percent * (uint64_t) 0xffffffff / 10000; - part[i].percent = last; - } - } - - return rv; -} - - -static char * -ngx_http_split_clients(ngx_conf_t *cf, ngx_command_t *dummy, void *conf) -{ - ngx_int_t n; - ngx_str_t *value; - ngx_http_split_clients_ctx_t *ctx; - ngx_http_split_clients_part_t *part; - - ctx = cf->ctx; - value = cf->args->elts; - - part = ngx_array_push(&ctx->parts); - if (part == NULL) { - return NGX_CONF_ERROR; - } - - if (value[0].len == 1 && value[0].data[0] == '*') { - part->percent = 0; - - } else { - if (value[0].len == 0 || value[0].data[value[0].len - 1] != '%') { - goto invalid; - } - - n = ngx_atofp(value[0].data, value[0].len - 1, 2); - if (n == NGX_ERROR || n == 0) { - goto invalid; - } - - part->percent = (uint32_t) n; - } - - part->value.len = value[1].len; - part->value.valid = 1; - part->value.no_cacheable = 0; - part->value.not_found = 0; - part->value.data = value[1].data; - - return NGX_CONF_OK; - -invalid: - - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "invalid percent value \"%V\"", &value[0]); - return NGX_CONF_ERROR; -} diff --git a/src/deps/src/nginx-1.30.3/src/http/modules/ngx_http_ssi_filter_module.c b/src/deps/src/nginx-1.30.3/src/http/modules/ngx_http_ssi_filter_module.c deleted file mode 100644 index 65ca03440c..0000000000 --- a/src/deps/src/nginx-1.30.3/src/http/modules/ngx_http_ssi_filter_module.c +++ /dev/null @@ -1,2964 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#include -#include -#include - -#define NGX_HTTP_SSI_ERROR 1 - -#define NGX_HTTP_SSI_DATE_LEN 2048 - -#define NGX_HTTP_SSI_ADD_PREFIX 1 -#define NGX_HTTP_SSI_ADD_ZERO 2 - - -typedef struct { - ngx_flag_t enable; - ngx_flag_t silent_errors; - ngx_flag_t ignore_recycled_buffers; - ngx_flag_t last_modified; - - ngx_hash_t types; - - size_t min_file_chunk; - size_t value_len; - - ngx_array_t *types_keys; -} ngx_http_ssi_loc_conf_t; - - -typedef struct { - ngx_str_t name; - ngx_uint_t key; - ngx_str_t value; -} ngx_http_ssi_var_t; - - -typedef struct { - ngx_str_t name; - ngx_chain_t *bufs; - ngx_uint_t count; -} ngx_http_ssi_block_t; - - -typedef enum { - ssi_start_state = 0, - ssi_tag_state, - ssi_comment0_state, - ssi_comment1_state, - ssi_sharp_state, - ssi_precommand_state, - ssi_command_state, - ssi_preparam_state, - ssi_param_state, - ssi_preequal_state, - ssi_prevalue_state, - ssi_double_quoted_value_state, - ssi_quoted_value_state, - ssi_quoted_symbol_state, - ssi_postparam_state, - ssi_comment_end0_state, - ssi_comment_end1_state, - ssi_error_state, - ssi_error_end0_state, - ssi_error_end1_state -} ngx_http_ssi_state_e; - - -static ngx_int_t ngx_http_ssi_output(ngx_http_request_t *r, - ngx_http_ssi_ctx_t *ctx); -static void ngx_http_ssi_buffered(ngx_http_request_t *r, - ngx_http_ssi_ctx_t *ctx); -static ngx_int_t ngx_http_ssi_parse(ngx_http_request_t *r, - ngx_http_ssi_ctx_t *ctx); -static ngx_str_t *ngx_http_ssi_get_variable(ngx_http_request_t *r, - ngx_str_t *name, ngx_uint_t key); -static ngx_int_t ngx_http_ssi_evaluate_string(ngx_http_request_t *r, - ngx_http_ssi_ctx_t *ctx, ngx_str_t *text, ngx_uint_t flags); -static ngx_int_t ngx_http_ssi_regex_match(ngx_http_request_t *r, - ngx_str_t *pattern, ngx_str_t *str); - -static ngx_int_t ngx_http_ssi_include(ngx_http_request_t *r, - ngx_http_ssi_ctx_t *ctx, ngx_str_t **params); -static ngx_int_t ngx_http_ssi_stub_output(ngx_http_request_t *r, void *data, - ngx_int_t rc); -static ngx_int_t ngx_http_ssi_set_variable(ngx_http_request_t *r, void *data, - ngx_int_t rc); -static ngx_int_t ngx_http_ssi_echo(ngx_http_request_t *r, - ngx_http_ssi_ctx_t *ctx, ngx_str_t **params); -static ngx_int_t ngx_http_ssi_config(ngx_http_request_t *r, - ngx_http_ssi_ctx_t *ctx, ngx_str_t **params); -static ngx_int_t ngx_http_ssi_set(ngx_http_request_t *r, - ngx_http_ssi_ctx_t *ctx, ngx_str_t **params); -static ngx_int_t ngx_http_ssi_if(ngx_http_request_t *r, - ngx_http_ssi_ctx_t *ctx, ngx_str_t **params); -static ngx_int_t ngx_http_ssi_else(ngx_http_request_t *r, - ngx_http_ssi_ctx_t *ctx, ngx_str_t **params); -static ngx_int_t ngx_http_ssi_endif(ngx_http_request_t *r, - ngx_http_ssi_ctx_t *ctx, ngx_str_t **params); -static ngx_int_t ngx_http_ssi_block(ngx_http_request_t *r, - ngx_http_ssi_ctx_t *ctx, ngx_str_t **params); -static ngx_int_t ngx_http_ssi_endblock(ngx_http_request_t *r, - ngx_http_ssi_ctx_t *ctx, ngx_str_t **params); - -static ngx_int_t ngx_http_ssi_date_gmt_local_variable(ngx_http_request_t *r, - ngx_http_variable_value_t *v, uintptr_t gmt); - -static ngx_int_t ngx_http_ssi_preconfiguration(ngx_conf_t *cf); -static void *ngx_http_ssi_create_main_conf(ngx_conf_t *cf); -static char *ngx_http_ssi_init_main_conf(ngx_conf_t *cf, void *conf); -static void *ngx_http_ssi_create_loc_conf(ngx_conf_t *cf); -static char *ngx_http_ssi_merge_loc_conf(ngx_conf_t *cf, - void *parent, void *child); -static ngx_int_t ngx_http_ssi_filter_init(ngx_conf_t *cf); - - -static ngx_command_t ngx_http_ssi_filter_commands[] = { - - { ngx_string("ssi"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF - |NGX_CONF_FLAG, - ngx_conf_set_flag_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_ssi_loc_conf_t, enable), - NULL }, - - { ngx_string("ssi_silent_errors"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG, - ngx_conf_set_flag_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_ssi_loc_conf_t, silent_errors), - NULL }, - - { ngx_string("ssi_ignore_recycled_buffers"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG, - ngx_conf_set_flag_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_ssi_loc_conf_t, ignore_recycled_buffers), - NULL }, - - { ngx_string("ssi_min_file_chunk"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1, - ngx_conf_set_size_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_ssi_loc_conf_t, min_file_chunk), - NULL }, - - { ngx_string("ssi_value_length"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1, - ngx_conf_set_size_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_ssi_loc_conf_t, value_len), - NULL }, - - { ngx_string("ssi_types"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE, - ngx_http_types_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_ssi_loc_conf_t, types_keys), - &ngx_http_html_default_types[0] }, - - { ngx_string("ssi_last_modified"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG, - ngx_conf_set_flag_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_ssi_loc_conf_t, last_modified), - NULL }, - - ngx_null_command -}; - - - -static ngx_http_module_t ngx_http_ssi_filter_module_ctx = { - ngx_http_ssi_preconfiguration, /* preconfiguration */ - ngx_http_ssi_filter_init, /* postconfiguration */ - - ngx_http_ssi_create_main_conf, /* create main configuration */ - ngx_http_ssi_init_main_conf, /* init main configuration */ - - NULL, /* create server configuration */ - NULL, /* merge server configuration */ - - ngx_http_ssi_create_loc_conf, /* create location configuration */ - ngx_http_ssi_merge_loc_conf /* merge location configuration */ -}; - - -ngx_module_t ngx_http_ssi_filter_module = { - NGX_MODULE_V1, - &ngx_http_ssi_filter_module_ctx, /* module context */ - ngx_http_ssi_filter_commands, /* module directives */ - NGX_HTTP_MODULE, /* module type */ - NULL, /* init master */ - NULL, /* init module */ - NULL, /* init process */ - NULL, /* init thread */ - NULL, /* exit thread */ - NULL, /* exit process */ - NULL, /* exit master */ - NGX_MODULE_V1_PADDING -}; - - -static ngx_http_output_header_filter_pt ngx_http_next_header_filter; -static ngx_http_output_body_filter_pt ngx_http_next_body_filter; - - -static u_char ngx_http_ssi_string[] = "" CRLF -"" CRLF -"" CRLF -"" CRLF -"" CRLF -"" CRLF -; - - -static u_char ngx_http_msie_refresh_head[] = -"" CRLF; - - -static char ngx_http_error_301_page[] = -"" CRLF -"301 Moved Permanently" CRLF -"" CRLF -"

301 Moved Permanently

" CRLF -; - - -static char ngx_http_error_302_page[] = -"" CRLF -"302 Found" CRLF -"" CRLF -"

302 Found

" CRLF -; - - -static char ngx_http_error_303_page[] = -"" CRLF -"303 See Other" CRLF -"" CRLF -"

303 See Other

" CRLF -; - - -static char ngx_http_error_307_page[] = -"" CRLF -"307 Temporary Redirect" CRLF -"" CRLF -"

307 Temporary Redirect

" CRLF -; - - -static char ngx_http_error_308_page[] = -"" CRLF -"308 Permanent Redirect" CRLF -"" CRLF -"

308 Permanent Redirect

" CRLF -; - - -static char ngx_http_error_400_page[] = -"" CRLF -"400 Bad Request" CRLF -"" CRLF -"

400 Bad Request

" CRLF -; - - -static char ngx_http_error_401_page[] = -"" CRLF -"401 Authorization Required" CRLF -"" CRLF -"

401 Authorization Required

" CRLF -; - - -static char ngx_http_error_402_page[] = -"" CRLF -"402 Payment Required" CRLF -"" CRLF -"

402 Payment Required

" CRLF -; - - -static char ngx_http_error_403_page[] = -"" CRLF -"403 Forbidden" CRLF -"" CRLF -"

403 Forbidden

" CRLF -; - - -static char ngx_http_error_404_page[] = -"" CRLF -"404 Not Found" CRLF -"" CRLF -"

404 Not Found

" CRLF -; - - -static char ngx_http_error_405_page[] = -"" CRLF -"405 Not Allowed" CRLF -"" CRLF -"

405 Not Allowed

" CRLF -; - - -static char ngx_http_error_406_page[] = -"" CRLF -"406 Not Acceptable" CRLF -"" CRLF -"

406 Not Acceptable

" CRLF -; - - -static char ngx_http_error_407_page[] = -"" CRLF -"407 Proxy Authentication Required" CRLF -"" CRLF -"

407 Proxy Authentication Required

" CRLF -; - - -static char ngx_http_error_408_page[] = -"" CRLF -"408 Request Time-out" CRLF -"" CRLF -"

408 Request Time-out

" CRLF -; - - -static char ngx_http_error_409_page[] = -"" CRLF -"409 Conflict" CRLF -"" CRLF -"

409 Conflict

" CRLF -; - - -static char ngx_http_error_410_page[] = -"" CRLF -"410 Gone" CRLF -"" CRLF -"

410 Gone

" CRLF -; - - -static char ngx_http_error_411_page[] = -"" CRLF -"411 Length Required" CRLF -"" CRLF -"

411 Length Required

" CRLF -; - - -static char ngx_http_error_412_page[] = -"" CRLF -"412 Precondition Failed" CRLF -"" CRLF -"

412 Precondition Failed

" CRLF -; - - -static char ngx_http_error_413_page[] = -"" CRLF -"413 Request Entity Too Large" CRLF -"" CRLF -"

413 Request Entity Too Large

" CRLF -; - - -static char ngx_http_error_414_page[] = -"" CRLF -"414 Request-URI Too Large" CRLF -"" CRLF -"

414 Request-URI Too Large

" CRLF -; - - -static char ngx_http_error_415_page[] = -"" CRLF -"415 Unsupported Media Type" CRLF -"" CRLF -"

415 Unsupported Media Type

" CRLF -; - - -static char ngx_http_error_416_page[] = -"" CRLF -"416 Requested Range Not Satisfiable" CRLF -"" CRLF -"

416 Requested Range Not Satisfiable

" CRLF -; - - -static char ngx_http_error_421_page[] = -"" CRLF -"421 Misdirected Request" CRLF -"" CRLF -"

421 Misdirected Request

" CRLF -; - - -static char ngx_http_error_429_page[] = -"" CRLF -"429 Too Many Requests" CRLF -"" CRLF -"

429 Too Many Requests

" CRLF -; - - -static char ngx_http_error_494_page[] = -"" CRLF -"400 Request Header Or Cookie Too Large" -CRLF -"" CRLF -"

400 Bad Request

" CRLF -"
Request Header Or Cookie Too Large
" CRLF -; - - -static char ngx_http_error_495_page[] = -"" CRLF -"400 The SSL certificate error" -CRLF -"" CRLF -"

400 Bad Request

" CRLF -"
The SSL certificate error
" CRLF -; - - -static char ngx_http_error_496_page[] = -"" CRLF -"400 No required SSL certificate was sent" -CRLF -"" CRLF -"

400 Bad Request

" CRLF -"
No required SSL certificate was sent
" CRLF -; - - -static char ngx_http_error_497_page[] = -"" CRLF -"400 The plain HTTP request was sent to HTTPS port" -CRLF -"" CRLF -"

400 Bad Request

" CRLF -"
The plain HTTP request was sent to HTTPS port
" CRLF -; - - -static char ngx_http_error_500_page[] = -"" CRLF -"500 Internal Server Error" CRLF -"" CRLF -"

500 Internal Server Error

" CRLF -; - - -static char ngx_http_error_501_page[] = -"" CRLF -"501 Not Implemented" CRLF -"" CRLF -"

501 Not Implemented

" CRLF -; - - -static char ngx_http_error_502_page[] = -"" CRLF -"502 Bad Gateway" CRLF -"" CRLF -"

502 Bad Gateway

" CRLF -; - - -static char ngx_http_error_503_page[] = -"" CRLF -"503 Service Temporarily Unavailable" CRLF -"" CRLF -"

503 Service Temporarily Unavailable

" CRLF -; - - -static char ngx_http_error_504_page[] = -"" CRLF -"504 Gateway Time-out" CRLF -"" CRLF -"

504 Gateway Time-out

" CRLF -; - - -static char ngx_http_error_505_page[] = -"" CRLF -"505 HTTP Version Not Supported" CRLF -"" CRLF -"

505 HTTP Version Not Supported

" CRLF -; - - -static char ngx_http_error_507_page[] = -"" CRLF -"507 Insufficient Storage" CRLF -"" CRLF -"

507 Insufficient Storage

" CRLF -; - - -static ngx_str_t ngx_http_error_pages[] = { - - ngx_null_string, /* 201, 204 */ - -#define NGX_HTTP_LAST_2XX 202 -#define NGX_HTTP_OFF_3XX (NGX_HTTP_LAST_2XX - 201) - - /* ngx_null_string, */ /* 300 */ - ngx_string(ngx_http_error_301_page), - ngx_string(ngx_http_error_302_page), - ngx_string(ngx_http_error_303_page), - ngx_null_string, /* 304 */ - ngx_null_string, /* 305 */ - ngx_null_string, /* 306 */ - ngx_string(ngx_http_error_307_page), - ngx_string(ngx_http_error_308_page), - -#define NGX_HTTP_LAST_3XX 309 -#define NGX_HTTP_OFF_4XX (NGX_HTTP_LAST_3XX - 301 + NGX_HTTP_OFF_3XX) - - ngx_string(ngx_http_error_400_page), - ngx_string(ngx_http_error_401_page), - ngx_string(ngx_http_error_402_page), - ngx_string(ngx_http_error_403_page), - ngx_string(ngx_http_error_404_page), - ngx_string(ngx_http_error_405_page), - ngx_string(ngx_http_error_406_page), - ngx_string(ngx_http_error_407_page), - ngx_string(ngx_http_error_408_page), - ngx_string(ngx_http_error_409_page), - ngx_string(ngx_http_error_410_page), - ngx_string(ngx_http_error_411_page), - ngx_string(ngx_http_error_412_page), - ngx_string(ngx_http_error_413_page), - ngx_string(ngx_http_error_414_page), - ngx_string(ngx_http_error_415_page), - ngx_string(ngx_http_error_416_page), - ngx_null_string, /* 417 */ - ngx_null_string, /* 418 */ - ngx_null_string, /* 419 */ - ngx_null_string, /* 420 */ - ngx_string(ngx_http_error_421_page), - ngx_null_string, /* 422 */ - ngx_null_string, /* 423 */ - ngx_null_string, /* 424 */ - ngx_null_string, /* 425 */ - ngx_null_string, /* 426 */ - ngx_null_string, /* 427 */ - ngx_null_string, /* 428 */ - ngx_string(ngx_http_error_429_page), - -#define NGX_HTTP_LAST_4XX 430 -#define NGX_HTTP_OFF_5XX (NGX_HTTP_LAST_4XX - 400 + NGX_HTTP_OFF_4XX) - - ngx_string(ngx_http_error_494_page), /* 494, request header too large */ - ngx_string(ngx_http_error_495_page), /* 495, https certificate error */ - ngx_string(ngx_http_error_496_page), /* 496, https no certificate */ - ngx_string(ngx_http_error_497_page), /* 497, http to https */ - ngx_string(ngx_http_error_404_page), /* 498, canceled */ - ngx_null_string, /* 499, client has closed connection */ - - ngx_string(ngx_http_error_500_page), - ngx_string(ngx_http_error_501_page), - ngx_string(ngx_http_error_502_page), - ngx_string(ngx_http_error_503_page), - ngx_string(ngx_http_error_504_page), - ngx_string(ngx_http_error_505_page), - ngx_null_string, /* 506 */ - ngx_string(ngx_http_error_507_page) - -#define NGX_HTTP_LAST_5XX 508 - -}; - - -ngx_int_t -ngx_http_special_response_handler(ngx_http_request_t *r, ngx_int_t error) -{ - ngx_uint_t i, err; - ngx_http_err_page_t *err_page; - ngx_http_core_loc_conf_t *clcf; - - ngx_log_debug3(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "http special response: %i, \"%V?%V\"", - error, &r->uri, &r->args); - - r->err_status = error; - - if (r->keepalive) { - switch (error) { - case NGX_HTTP_BAD_REQUEST: - case NGX_HTTP_REQUEST_ENTITY_TOO_LARGE: - case NGX_HTTP_REQUEST_URI_TOO_LARGE: - case NGX_HTTP_TO_HTTPS: - case NGX_HTTPS_CERT_ERROR: - case NGX_HTTPS_NO_CERT: - case NGX_HTTP_INTERNAL_SERVER_ERROR: - case NGX_HTTP_NOT_IMPLEMENTED: - r->keepalive = 0; - } - } - - if (r->lingering_close) { - switch (error) { - case NGX_HTTP_BAD_REQUEST: - case NGX_HTTP_TO_HTTPS: - case NGX_HTTPS_CERT_ERROR: - case NGX_HTTPS_NO_CERT: - r->lingering_close = 0; - } - } - - r->headers_out.content_type.len = 0; - - clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module); - - if (!r->error_page && clcf->error_pages && r->uri_changes != 0) { - - if (clcf->recursive_error_pages == 0) { - r->error_page = 1; - } - - err_page = clcf->error_pages->elts; - - for (i = 0; i < clcf->error_pages->nelts; i++) { - if (err_page[i].status == error) { - return ngx_http_send_error_page(r, &err_page[i]); - } - } - } - - r->expect_tested = 1; - - if (ngx_http_discard_request_body(r) != NGX_OK) { - r->keepalive = 0; - } - - if (clcf->msie_refresh - && r->headers_in.msie - && (error == NGX_HTTP_MOVED_PERMANENTLY - || error == NGX_HTTP_MOVED_TEMPORARILY)) - { - return ngx_http_send_refresh(r); - } - - if (error == NGX_HTTP_CREATED) { - /* 201 */ - err = 0; - - } else if (error == NGX_HTTP_NO_CONTENT) { - /* 204 */ - err = 0; - - } else if (error >= NGX_HTTP_MOVED_PERMANENTLY - && error < NGX_HTTP_LAST_3XX) - { - /* 3XX */ - err = error - NGX_HTTP_MOVED_PERMANENTLY + NGX_HTTP_OFF_3XX; - - } else if (error >= NGX_HTTP_BAD_REQUEST - && error < NGX_HTTP_LAST_4XX) - { - /* 4XX */ - err = error - NGX_HTTP_BAD_REQUEST + NGX_HTTP_OFF_4XX; - - } else if (error >= NGX_HTTP_NGINX_CODES - && error < NGX_HTTP_LAST_5XX) - { - /* 49X, 5XX */ - err = error - NGX_HTTP_NGINX_CODES + NGX_HTTP_OFF_5XX; - switch (error) { - case NGX_HTTP_TO_HTTPS: - case NGX_HTTPS_CERT_ERROR: - case NGX_HTTPS_NO_CERT: - case NGX_HTTP_REQUEST_HEADER_TOO_LARGE: - r->err_status = NGX_HTTP_BAD_REQUEST; - } - - } else { - /* unknown code, zero body */ - err = 0; - } - - return ngx_http_send_special_response(r, clcf, err); -} - - -ngx_int_t -ngx_http_filter_finalize_request(ngx_http_request_t *r, ngx_module_t *m, - ngx_int_t error) -{ - void *ctx; - ngx_int_t rc; - - ngx_http_clean_header(r); - - ctx = NULL; - - if (m) { - ctx = r->ctx[m->ctx_index]; - } - - /* clear the modules contexts */ - ngx_memzero(r->ctx, sizeof(void *) * ngx_http_max_module); - - if (m) { - r->ctx[m->ctx_index] = ctx; - } - - r->filter_finalize = 1; - - rc = ngx_http_special_response_handler(r, error); - - /* NGX_ERROR resets any pending data */ - - switch (rc) { - - case NGX_OK: - case NGX_DONE: - return NGX_ERROR; - - default: - return rc; - } -} - - -void -ngx_http_clean_header(ngx_http_request_t *r) -{ - ngx_memzero(&r->headers_out.status, - sizeof(ngx_http_headers_out_t) - - offsetof(ngx_http_headers_out_t, status)); - - r->headers_out.headers.part.nelts = 0; - r->headers_out.headers.part.next = NULL; - r->headers_out.headers.last = &r->headers_out.headers.part; - - r->headers_out.trailers.part.nelts = 0; - r->headers_out.trailers.part.next = NULL; - r->headers_out.trailers.last = &r->headers_out.trailers.part; - - r->headers_out.content_length_n = -1; - r->headers_out.last_modified_time = -1; -} - - -static ngx_int_t -ngx_http_send_error_page(ngx_http_request_t *r, ngx_http_err_page_t *err_page) -{ - ngx_int_t overwrite; - ngx_str_t uri, args; - ngx_table_elt_t *location; - ngx_http_core_loc_conf_t *clcf; - - overwrite = err_page->overwrite; - - if (overwrite && overwrite != NGX_HTTP_OK) { - r->expect_tested = 1; - } - - if (overwrite >= 0) { - r->err_status = overwrite; - } - - if (ngx_http_complex_value(r, &err_page->value, &uri) != NGX_OK) { - return NGX_ERROR; - } - - if (uri.len && uri.data[0] == '/') { - - if (err_page->value.lengths) { - ngx_http_split_args(r, &uri, &args); - - } else { - args = err_page->args; - } - - if (r->method != NGX_HTTP_HEAD) { - r->method = NGX_HTTP_GET; - r->method_name = ngx_http_core_get_method; - } - - return ngx_http_internal_redirect(r, &uri, &args); - } - - if (uri.len && uri.data[0] == '@') { - return ngx_http_named_location(r, &uri); - } - - r->expect_tested = 1; - - if (ngx_http_discard_request_body(r) != NGX_OK) { - r->keepalive = 0; - } - - location = ngx_list_push(&r->headers_out.headers); - - if (location == NULL) { - return NGX_ERROR; - } - - if (overwrite != NGX_HTTP_MOVED_PERMANENTLY - && overwrite != NGX_HTTP_MOVED_TEMPORARILY - && overwrite != NGX_HTTP_SEE_OTHER - && overwrite != NGX_HTTP_TEMPORARY_REDIRECT - && overwrite != NGX_HTTP_PERMANENT_REDIRECT) - { - r->err_status = NGX_HTTP_MOVED_TEMPORARILY; - } - - location->hash = 1; - location->next = NULL; - ngx_str_set(&location->key, "Location"); - location->value = uri; - - ngx_http_clear_location(r); - - r->headers_out.location = location; - - clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module); - - if (clcf->msie_refresh && r->headers_in.msie) { - return ngx_http_send_refresh(r); - } - - return ngx_http_send_special_response(r, clcf, r->err_status - - NGX_HTTP_MOVED_PERMANENTLY - + NGX_HTTP_OFF_3XX); -} - - -static ngx_int_t -ngx_http_send_special_response(ngx_http_request_t *r, - ngx_http_core_loc_conf_t *clcf, ngx_uint_t err) -{ - u_char *tail; - size_t len; - ngx_int_t rc; - ngx_buf_t *b; - ngx_uint_t msie_padding; - ngx_chain_t out[3]; - - if (clcf->server_tokens == NGX_HTTP_SERVER_TOKENS_ON) { - len = sizeof(ngx_http_error_full_tail) - 1; - tail = ngx_http_error_full_tail; - - } else if (clcf->server_tokens == NGX_HTTP_SERVER_TOKENS_BUILD) { - len = sizeof(ngx_http_error_build_tail) - 1; - tail = ngx_http_error_build_tail; - - } else { - len = sizeof(ngx_http_error_tail) - 1; - tail = ngx_http_error_tail; - } - - msie_padding = 0; - - if (ngx_http_error_pages[err].len) { - r->headers_out.content_length_n = ngx_http_error_pages[err].len + len; - if (clcf->msie_padding - && (r->headers_in.msie || r->headers_in.chrome) - && r->http_version >= NGX_HTTP_VERSION_10 - && err >= NGX_HTTP_OFF_4XX) - { - r->headers_out.content_length_n += - sizeof(ngx_http_msie_padding) - 1; - msie_padding = 1; - } - - r->headers_out.content_type_len = sizeof("text/html") - 1; - ngx_str_set(&r->headers_out.content_type, "text/html"); - r->headers_out.content_type_lowcase = NULL; - - } else { - r->headers_out.content_length_n = 0; - } - - if (r->headers_out.content_length) { - r->headers_out.content_length->hash = 0; - r->headers_out.content_length = NULL; - } - - ngx_http_clear_accept_ranges(r); - ngx_http_clear_last_modified(r); - ngx_http_clear_etag(r); - - rc = ngx_http_send_header(r); - - if (rc == NGX_ERROR || r->header_only) { - return rc; - } - - if (ngx_http_error_pages[err].len == 0) { - return ngx_http_send_special(r, NGX_HTTP_LAST); - } - - b = ngx_calloc_buf(r->pool); - if (b == NULL) { - return NGX_ERROR; - } - - b->memory = 1; - b->pos = ngx_http_error_pages[err].data; - b->last = ngx_http_error_pages[err].data + ngx_http_error_pages[err].len; - - out[0].buf = b; - out[0].next = &out[1]; - - b = ngx_calloc_buf(r->pool); - if (b == NULL) { - return NGX_ERROR; - } - - b->memory = 1; - - b->pos = tail; - b->last = tail + len; - - out[1].buf = b; - out[1].next = NULL; - - if (msie_padding) { - b = ngx_calloc_buf(r->pool); - if (b == NULL) { - return NGX_ERROR; - } - - b->memory = 1; - b->pos = ngx_http_msie_padding; - b->last = ngx_http_msie_padding + sizeof(ngx_http_msie_padding) - 1; - - out[1].next = &out[2]; - out[2].buf = b; - out[2].next = NULL; - } - - if (r == r->main) { - b->last_buf = 1; - } - - b->last_in_chain = 1; - - return ngx_http_output_filter(r, &out[0]); -} - - -static ngx_int_t -ngx_http_send_refresh(ngx_http_request_t *r) -{ - u_char *p, *location; - size_t len, size; - uintptr_t escape; - ngx_int_t rc; - ngx_buf_t *b; - ngx_chain_t out; - - len = r->headers_out.location->value.len; - location = r->headers_out.location->value.data; - - escape = 2 * ngx_escape_uri(NULL, location, len, NGX_ESCAPE_REFRESH); - - size = sizeof(ngx_http_msie_refresh_head) - 1 - + escape + len - + sizeof(ngx_http_msie_refresh_tail) - 1; - - r->err_status = NGX_HTTP_OK; - - r->headers_out.content_type_len = sizeof("text/html") - 1; - ngx_str_set(&r->headers_out.content_type, "text/html"); - r->headers_out.content_type_lowcase = NULL; - - r->headers_out.location->hash = 0; - r->headers_out.location = NULL; - - r->headers_out.content_length_n = size; - - if (r->headers_out.content_length) { - r->headers_out.content_length->hash = 0; - r->headers_out.content_length = NULL; - } - - ngx_http_clear_accept_ranges(r); - ngx_http_clear_last_modified(r); - ngx_http_clear_etag(r); - - rc = ngx_http_send_header(r); - - if (rc == NGX_ERROR || r->header_only) { - return rc; - } - - b = ngx_create_temp_buf(r->pool, size); - if (b == NULL) { - return NGX_ERROR; - } - - p = ngx_cpymem(b->pos, ngx_http_msie_refresh_head, - sizeof(ngx_http_msie_refresh_head) - 1); - - if (escape == 0) { - p = ngx_cpymem(p, location, len); - - } else { - p = (u_char *) ngx_escape_uri(p, location, len, NGX_ESCAPE_REFRESH); - } - - b->last = ngx_cpymem(p, ngx_http_msie_refresh_tail, - sizeof(ngx_http_msie_refresh_tail) - 1); - - b->last_buf = (r == r->main) ? 1 : 0; - b->last_in_chain = 1; - - out.buf = b; - out.next = NULL; - - return ngx_http_output_filter(r, &out); -} diff --git a/src/deps/src/nginx-1.30.3/src/http/ngx_http_upstream.c b/src/deps/src/nginx-1.30.3/src/http/ngx_http_upstream.c deleted file mode 100644 index b645613693..0000000000 --- a/src/deps/src/nginx-1.30.3/src/http/ngx_http_upstream.c +++ /dev/null @@ -1,7305 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#include -#include -#include - - -#if (NGX_HTTP_CACHE) -static ngx_int_t ngx_http_upstream_cache(ngx_http_request_t *r, - ngx_http_upstream_t *u); -static ngx_int_t ngx_http_upstream_cache_get(ngx_http_request_t *r, - ngx_http_upstream_t *u, ngx_http_file_cache_t **cache); -static ngx_int_t ngx_http_upstream_cache_send(ngx_http_request_t *r, - ngx_http_upstream_t *u); -static ngx_int_t ngx_http_upstream_cache_background_update( - ngx_http_request_t *r, ngx_http_upstream_t *u); -static ngx_int_t ngx_http_upstream_cache_check_range(ngx_http_request_t *r, - ngx_http_upstream_t *u); -static ngx_int_t ngx_http_upstream_cache_status(ngx_http_request_t *r, - ngx_http_variable_value_t *v, uintptr_t data); -static ngx_int_t ngx_http_upstream_cache_last_modified(ngx_http_request_t *r, - ngx_http_variable_value_t *v, uintptr_t data); -static ngx_int_t ngx_http_upstream_cache_etag(ngx_http_request_t *r, - ngx_http_variable_value_t *v, uintptr_t data); -#endif - -static void ngx_http_upstream_init_request(ngx_http_request_t *r); -static void ngx_http_upstream_resolve_handler(ngx_resolver_ctx_t *ctx); -static void ngx_http_upstream_rd_check_broken_connection(ngx_http_request_t *r); -static void ngx_http_upstream_wr_check_broken_connection(ngx_http_request_t *r); -static void ngx_http_upstream_check_broken_connection(ngx_http_request_t *r, - ngx_event_t *ev); -static void ngx_http_upstream_connect(ngx_http_request_t *r, - ngx_http_upstream_t *u); -static ngx_int_t ngx_http_upstream_reinit(ngx_http_request_t *r, - ngx_http_upstream_t *u); -static void ngx_http_upstream_send_request(ngx_http_request_t *r, - ngx_http_upstream_t *u, ngx_uint_t do_write); -static ngx_int_t ngx_http_upstream_send_request_body(ngx_http_request_t *r, - ngx_http_upstream_t *u, ngx_uint_t do_write); -static void ngx_http_upstream_send_request_handler(ngx_http_request_t *r, - ngx_http_upstream_t *u); -static void ngx_http_upstream_read_request_handler(ngx_http_request_t *r); -static void ngx_http_upstream_process_header(ngx_http_request_t *r, - ngx_http_upstream_t *u); -static ngx_int_t ngx_http_upstream_process_early_hints(ngx_http_request_t *r, - ngx_http_upstream_t *u); -static void ngx_http_upstream_early_hints_writer(ngx_http_request_t *r); -static ngx_int_t ngx_http_upstream_test_next(ngx_http_request_t *r, - ngx_http_upstream_t *u); -static ngx_int_t ngx_http_upstream_intercept_errors(ngx_http_request_t *r, - ngx_http_upstream_t *u); -static ngx_int_t ngx_http_upstream_test_connect(ngx_connection_t *c); -static ngx_int_t ngx_http_upstream_process_headers(ngx_http_request_t *r, - ngx_http_upstream_t *u); -static ngx_int_t ngx_http_upstream_process_trailers(ngx_http_request_t *r, - ngx_http_upstream_t *u); -static void ngx_http_upstream_send_response(ngx_http_request_t *r, - ngx_http_upstream_t *u); -static void ngx_http_upstream_upgrade(ngx_http_request_t *r, - ngx_http_upstream_t *u); -static void ngx_http_upstream_upgraded_read_downstream(ngx_http_request_t *r); -static void ngx_http_upstream_upgraded_write_downstream(ngx_http_request_t *r); -static void ngx_http_upstream_upgraded_read_upstream(ngx_http_request_t *r, - ngx_http_upstream_t *u); -static void ngx_http_upstream_upgraded_write_upstream(ngx_http_request_t *r, - ngx_http_upstream_t *u); -static void ngx_http_upstream_process_upgraded(ngx_http_request_t *r, - ngx_uint_t from_upstream, ngx_uint_t do_write); -static void - ngx_http_upstream_process_non_buffered_downstream(ngx_http_request_t *r); -static void - ngx_http_upstream_process_non_buffered_upstream(ngx_http_request_t *r, - ngx_http_upstream_t *u); -static void - ngx_http_upstream_process_non_buffered_request(ngx_http_request_t *r, - ngx_uint_t do_write); -#if (NGX_THREADS) -static ngx_int_t ngx_http_upstream_thread_handler(ngx_thread_task_t *task, - ngx_file_t *file); -static void ngx_http_upstream_thread_event_handler(ngx_event_t *ev); -#endif -static ngx_int_t ngx_http_upstream_output_filter(void *data, - ngx_chain_t *chain); -static void ngx_http_upstream_process_downstream(ngx_http_request_t *r); -static void ngx_http_upstream_process_upstream(ngx_http_request_t *r, - ngx_http_upstream_t *u); -static void ngx_http_upstream_process_request(ngx_http_request_t *r, - ngx_http_upstream_t *u); -static void ngx_http_upstream_store(ngx_http_request_t *r, - ngx_http_upstream_t *u); -static void ngx_http_upstream_dummy_handler(ngx_http_request_t *r, - ngx_http_upstream_t *u); -static void ngx_http_upstream_next(ngx_http_request_t *r, - ngx_http_upstream_t *u, ngx_uint_t ft_type); -static void ngx_http_upstream_cleanup(void *data); -static void ngx_http_upstream_finalize_request(ngx_http_request_t *r, - ngx_http_upstream_t *u, ngx_int_t rc); - -static ngx_int_t ngx_http_upstream_process_header_line(ngx_http_request_t *r, - ngx_table_elt_t *h, ngx_uint_t offset); -static ngx_int_t - ngx_http_upstream_process_multi_header_lines(ngx_http_request_t *r, - ngx_table_elt_t *h, ngx_uint_t offset); -static ngx_int_t ngx_http_upstream_process_content_length(ngx_http_request_t *r, - ngx_table_elt_t *h, ngx_uint_t offset); -static ngx_int_t ngx_http_upstream_process_last_modified(ngx_http_request_t *r, - ngx_table_elt_t *h, ngx_uint_t offset); -static ngx_int_t ngx_http_upstream_process_set_cookie(ngx_http_request_t *r, - ngx_table_elt_t *h, ngx_uint_t offset); -static ngx_int_t - ngx_http_upstream_process_cache_control(ngx_http_request_t *r, - ngx_table_elt_t *h, ngx_uint_t offset); -#if (NGX_HTTP_CACHE) -static ngx_int_t ngx_http_upstream_process_delta_seconds(u_char *p, - u_char *last); -#endif -static ngx_int_t ngx_http_upstream_ignore_header_line(ngx_http_request_t *r, - ngx_table_elt_t *h, ngx_uint_t offset); -static ngx_int_t ngx_http_upstream_process_expires(ngx_http_request_t *r, - ngx_table_elt_t *h, ngx_uint_t offset); -static ngx_int_t ngx_http_upstream_process_accel_expires(ngx_http_request_t *r, - ngx_table_elt_t *h, ngx_uint_t offset); -static ngx_int_t ngx_http_upstream_process_limit_rate(ngx_http_request_t *r, - ngx_table_elt_t *h, ngx_uint_t offset); -static ngx_int_t ngx_http_upstream_process_buffering(ngx_http_request_t *r, - ngx_table_elt_t *h, ngx_uint_t offset); -static ngx_int_t ngx_http_upstream_process_charset(ngx_http_request_t *r, - ngx_table_elt_t *h, ngx_uint_t offset); -static ngx_int_t ngx_http_upstream_process_connection(ngx_http_request_t *r, - ngx_table_elt_t *h, ngx_uint_t offset); -static ngx_int_t - ngx_http_upstream_process_transfer_encoding(ngx_http_request_t *r, - ngx_table_elt_t *h, ngx_uint_t offset); -static ngx_int_t ngx_http_upstream_process_vary(ngx_http_request_t *r, - ngx_table_elt_t *h, ngx_uint_t offset); -static ngx_int_t ngx_http_upstream_copy_header_line(ngx_http_request_t *r, - ngx_table_elt_t *h, ngx_uint_t offset); -static ngx_int_t - ngx_http_upstream_copy_multi_header_lines(ngx_http_request_t *r, - ngx_table_elt_t *h, ngx_uint_t offset); -static ngx_int_t ngx_http_upstream_copy_content_type(ngx_http_request_t *r, - ngx_table_elt_t *h, ngx_uint_t offset); -static ngx_int_t ngx_http_upstream_copy_last_modified(ngx_http_request_t *r, - ngx_table_elt_t *h, ngx_uint_t offset); -static ngx_int_t ngx_http_upstream_rewrite_location(ngx_http_request_t *r, - ngx_table_elt_t *h, ngx_uint_t offset); -static ngx_int_t ngx_http_upstream_rewrite_refresh(ngx_http_request_t *r, - ngx_table_elt_t *h, ngx_uint_t offset); -static ngx_int_t ngx_http_upstream_rewrite_set_cookie(ngx_http_request_t *r, - ngx_table_elt_t *h, ngx_uint_t offset); -static ngx_int_t ngx_http_upstream_copy_allow_ranges(ngx_http_request_t *r, - ngx_table_elt_t *h, ngx_uint_t offset); - -static ngx_int_t ngx_http_upstream_add_variables(ngx_conf_t *cf); -static ngx_int_t ngx_http_upstream_addr_variable(ngx_http_request_t *r, - ngx_http_variable_value_t *v, uintptr_t data); -static ngx_int_t ngx_http_upstream_status_variable(ngx_http_request_t *r, - ngx_http_variable_value_t *v, uintptr_t data); -static ngx_int_t ngx_http_upstream_response_time_variable(ngx_http_request_t *r, - ngx_http_variable_value_t *v, uintptr_t data); -static ngx_int_t ngx_http_upstream_response_length_variable( - ngx_http_request_t *r, ngx_http_variable_value_t *v, uintptr_t data); -static ngx_int_t ngx_http_upstream_header_variable(ngx_http_request_t *r, - ngx_http_variable_value_t *v, uintptr_t data); -static ngx_int_t ngx_http_upstream_trailer_variable(ngx_http_request_t *r, - ngx_http_variable_value_t *v, uintptr_t data); -static ngx_int_t ngx_http_upstream_cookie_variable(ngx_http_request_t *r, - ngx_http_variable_value_t *v, uintptr_t data); - -static char *ngx_http_upstream(ngx_conf_t *cf, ngx_command_t *cmd, void *dummy); -static char *ngx_http_upstream_server(ngx_conf_t *cf, ngx_command_t *cmd, - void *conf); -#if (NGX_HTTP_UPSTREAM_ZONE) -static char *ngx_http_upstream_resolver(ngx_conf_t *cf, ngx_command_t *cmd, - void *conf); -#endif - -static ngx_int_t ngx_http_upstream_set_local(ngx_http_request_t *r, - ngx_http_upstream_t *u, ngx_http_upstream_local_t *local); - -static void *ngx_http_upstream_create_main_conf(ngx_conf_t *cf); -static char *ngx_http_upstream_init_main_conf(ngx_conf_t *cf, void *conf); - -#if (NGX_HTTP_SSL) -static void ngx_http_upstream_ssl_init_connection(ngx_http_request_t *, - ngx_http_upstream_t *u, ngx_connection_t *c); -static void ngx_http_upstream_ssl_handshake_handler(ngx_connection_t *c); -static void ngx_http_upstream_ssl_handshake(ngx_http_request_t *, - ngx_http_upstream_t *u, ngx_connection_t *c); -static void ngx_http_upstream_ssl_save_session(ngx_connection_t *c); -static ngx_int_t ngx_http_upstream_ssl_name(ngx_http_request_t *r, - ngx_http_upstream_t *u, ngx_connection_t *c); -static ngx_int_t ngx_http_upstream_ssl_certificate(ngx_http_request_t *r, - ngx_http_upstream_t *u, ngx_connection_t *c); -#endif - - -static ngx_http_upstream_header_t ngx_http_upstream_headers_in[] = { - - { ngx_string("Status"), - ngx_http_upstream_process_header_line, - offsetof(ngx_http_upstream_headers_in_t, status), - ngx_http_upstream_copy_header_line, 0, 0 }, - - { ngx_string("Content-Type"), - ngx_http_upstream_process_header_line, - offsetof(ngx_http_upstream_headers_in_t, content_type), - ngx_http_upstream_copy_content_type, 0, 1 }, - - { ngx_string("Content-Length"), - ngx_http_upstream_process_content_length, 0, - ngx_http_upstream_ignore_header_line, 0, 0 }, - - { ngx_string("Date"), - ngx_http_upstream_process_header_line, - offsetof(ngx_http_upstream_headers_in_t, date), - ngx_http_upstream_copy_header_line, - offsetof(ngx_http_headers_out_t, date), 0 }, - - { ngx_string("Last-Modified"), - ngx_http_upstream_process_last_modified, 0, - ngx_http_upstream_copy_last_modified, 0, 0 }, - - { ngx_string("ETag"), - ngx_http_upstream_process_header_line, - offsetof(ngx_http_upstream_headers_in_t, etag), - ngx_http_upstream_copy_header_line, - offsetof(ngx_http_headers_out_t, etag), 0 }, - - { ngx_string("Server"), - ngx_http_upstream_process_header_line, - offsetof(ngx_http_upstream_headers_in_t, server), - ngx_http_upstream_copy_header_line, - offsetof(ngx_http_headers_out_t, server), 0 }, - - { ngx_string("WWW-Authenticate"), - ngx_http_upstream_process_multi_header_lines, - offsetof(ngx_http_upstream_headers_in_t, www_authenticate), - ngx_http_upstream_copy_header_line, 0, 0 }, - - { ngx_string("Location"), - ngx_http_upstream_process_header_line, - offsetof(ngx_http_upstream_headers_in_t, location), - ngx_http_upstream_rewrite_location, 0, 0 }, - - { ngx_string("Refresh"), - ngx_http_upstream_process_header_line, - offsetof(ngx_http_upstream_headers_in_t, refresh), - ngx_http_upstream_rewrite_refresh, 0, 0 }, - - { ngx_string("Set-Cookie"), - ngx_http_upstream_process_set_cookie, - offsetof(ngx_http_upstream_headers_in_t, set_cookie), - ngx_http_upstream_rewrite_set_cookie, 0, 1 }, - - { ngx_string("Content-Disposition"), - ngx_http_upstream_ignore_header_line, 0, - ngx_http_upstream_copy_header_line, 0, 1 }, - - { ngx_string("Cache-Control"), - ngx_http_upstream_process_cache_control, 0, - ngx_http_upstream_copy_multi_header_lines, - offsetof(ngx_http_headers_out_t, cache_control), 1 }, - - { ngx_string("Expires"), - ngx_http_upstream_process_expires, 0, - ngx_http_upstream_copy_header_line, - offsetof(ngx_http_headers_out_t, expires), 1 }, - - { ngx_string("Accept-Ranges"), - ngx_http_upstream_ignore_header_line, 0, - ngx_http_upstream_copy_allow_ranges, - offsetof(ngx_http_headers_out_t, accept_ranges), 1 }, - - { ngx_string("Content-Range"), - ngx_http_upstream_ignore_header_line, 0, - ngx_http_upstream_copy_header_line, - offsetof(ngx_http_headers_out_t, content_range), 0 }, - - { ngx_string("Connection"), - ngx_http_upstream_process_connection, 0, - ngx_http_upstream_ignore_header_line, 0, 0 }, - - { ngx_string("Keep-Alive"), - ngx_http_upstream_ignore_header_line, 0, - ngx_http_upstream_ignore_header_line, 0, 0 }, - - { ngx_string("Vary"), - ngx_http_upstream_process_vary, 0, - ngx_http_upstream_copy_header_line, 0, 0 }, - - { ngx_string("Link"), - ngx_http_upstream_ignore_header_line, 0, - ngx_http_upstream_copy_multi_header_lines, - offsetof(ngx_http_headers_out_t, link), 0 }, - - { ngx_string("X-Accel-Expires"), - ngx_http_upstream_process_accel_expires, 0, - ngx_http_upstream_copy_header_line, 0, 0 }, - - { ngx_string("X-Accel-Redirect"), - ngx_http_upstream_process_header_line, - offsetof(ngx_http_upstream_headers_in_t, x_accel_redirect), - ngx_http_upstream_copy_header_line, 0, 0 }, - - { ngx_string("X-Accel-Limit-Rate"), - ngx_http_upstream_process_limit_rate, 0, - ngx_http_upstream_copy_header_line, 0, 0 }, - - { ngx_string("X-Accel-Buffering"), - ngx_http_upstream_process_buffering, 0, - ngx_http_upstream_copy_header_line, 0, 0 }, - - { ngx_string("X-Accel-Charset"), - ngx_http_upstream_process_charset, 0, - ngx_http_upstream_copy_header_line, 0, 0 }, - - { ngx_string("Transfer-Encoding"), - ngx_http_upstream_process_transfer_encoding, 0, - ngx_http_upstream_ignore_header_line, 0, 0 }, - - { ngx_string("Content-Encoding"), - ngx_http_upstream_ignore_header_line, 0, - ngx_http_upstream_copy_header_line, - offsetof(ngx_http_headers_out_t, content_encoding), 0 }, - - { ngx_null_string, NULL, 0, NULL, 0, 0 } -}; - - -static ngx_command_t ngx_http_upstream_commands[] = { - - { ngx_string("upstream"), - NGX_HTTP_MAIN_CONF|NGX_CONF_BLOCK|NGX_CONF_TAKE1, - ngx_http_upstream, - 0, - 0, - NULL }, - - { ngx_string("server"), - NGX_HTTP_UPS_CONF|NGX_CONF_1MORE, - ngx_http_upstream_server, - NGX_HTTP_SRV_CONF_OFFSET, - 0, - NULL }, - -#if (NGX_HTTP_UPSTREAM_ZONE) - - { ngx_string("resolver"), - NGX_HTTP_UPS_CONF|NGX_CONF_1MORE, - ngx_http_upstream_resolver, - NGX_HTTP_SRV_CONF_OFFSET, - 0, - NULL }, - - { ngx_string("resolver_timeout"), - NGX_HTTP_UPS_CONF|NGX_CONF_TAKE1, - ngx_conf_set_msec_slot, - NGX_HTTP_SRV_CONF_OFFSET, - offsetof(ngx_http_upstream_srv_conf_t, resolver_timeout), - NULL }, - -#endif - - ngx_null_command -}; - - -static ngx_http_module_t ngx_http_upstream_module_ctx = { - ngx_http_upstream_add_variables, /* preconfiguration */ - NULL, /* postconfiguration */ - - ngx_http_upstream_create_main_conf, /* create main configuration */ - ngx_http_upstream_init_main_conf, /* init main configuration */ - - NULL, /* create server configuration */ - NULL, /* merge server configuration */ - - NULL, /* create location configuration */ - NULL /* merge location configuration */ -}; - - -ngx_module_t ngx_http_upstream_module = { - NGX_MODULE_V1, - &ngx_http_upstream_module_ctx, /* module context */ - ngx_http_upstream_commands, /* module directives */ - NGX_HTTP_MODULE, /* module type */ - NULL, /* init master */ - NULL, /* init module */ - NULL, /* init process */ - NULL, /* init thread */ - NULL, /* exit thread */ - NULL, /* exit process */ - NULL, /* exit master */ - NGX_MODULE_V1_PADDING -}; - - -static ngx_http_variable_t ngx_http_upstream_vars[] = { - - { ngx_string("upstream_addr"), NULL, - ngx_http_upstream_addr_variable, 0, - NGX_HTTP_VAR_NOCACHEABLE, 0 }, - - { ngx_string("upstream_status"), NULL, - ngx_http_upstream_status_variable, 0, - NGX_HTTP_VAR_NOCACHEABLE, 0 }, - - { ngx_string("upstream_connect_time"), NULL, - ngx_http_upstream_response_time_variable, 2, - NGX_HTTP_VAR_NOCACHEABLE, 0 }, - - { ngx_string("upstream_header_time"), NULL, - ngx_http_upstream_response_time_variable, 1, - NGX_HTTP_VAR_NOCACHEABLE, 0 }, - - { ngx_string("upstream_response_time"), NULL, - ngx_http_upstream_response_time_variable, 0, - NGX_HTTP_VAR_NOCACHEABLE, 0 }, - - { ngx_string("upstream_response_length"), NULL, - ngx_http_upstream_response_length_variable, 0, - NGX_HTTP_VAR_NOCACHEABLE, 0 }, - - { ngx_string("upstream_bytes_received"), NULL, - ngx_http_upstream_response_length_variable, 1, - NGX_HTTP_VAR_NOCACHEABLE, 0 }, - - { ngx_string("upstream_bytes_sent"), NULL, - ngx_http_upstream_response_length_variable, 2, - NGX_HTTP_VAR_NOCACHEABLE, 0 }, - -#if (NGX_HTTP_CACHE) - - { ngx_string("upstream_cache_status"), NULL, - ngx_http_upstream_cache_status, 0, - NGX_HTTP_VAR_NOCACHEABLE, 0 }, - - { ngx_string("upstream_cache_last_modified"), NULL, - ngx_http_upstream_cache_last_modified, 0, - NGX_HTTP_VAR_NOCACHEABLE|NGX_HTTP_VAR_NOHASH, 0 }, - - { ngx_string("upstream_cache_etag"), NULL, - ngx_http_upstream_cache_etag, 0, - NGX_HTTP_VAR_NOCACHEABLE|NGX_HTTP_VAR_NOHASH, 0 }, - -#endif - - { ngx_string("upstream_http_"), NULL, ngx_http_upstream_header_variable, - 0, NGX_HTTP_VAR_NOCACHEABLE|NGX_HTTP_VAR_PREFIX, 0 }, - - { ngx_string("upstream_trailer_"), NULL, ngx_http_upstream_trailer_variable, - 0, NGX_HTTP_VAR_NOCACHEABLE|NGX_HTTP_VAR_PREFIX, 0 }, - - { ngx_string("upstream_cookie_"), NULL, ngx_http_upstream_cookie_variable, - 0, NGX_HTTP_VAR_NOCACHEABLE|NGX_HTTP_VAR_PREFIX, 0 }, - - ngx_http_null_variable -}; - - -static ngx_http_upstream_next_t ngx_http_upstream_next_errors[] = { - { 500, NGX_HTTP_UPSTREAM_FT_HTTP_500 }, - { 502, NGX_HTTP_UPSTREAM_FT_HTTP_502 }, - { 503, NGX_HTTP_UPSTREAM_FT_HTTP_503 }, - { 504, NGX_HTTP_UPSTREAM_FT_HTTP_504 }, - { 403, NGX_HTTP_UPSTREAM_FT_HTTP_403 }, - { 404, NGX_HTTP_UPSTREAM_FT_HTTP_404 }, - { 429, NGX_HTTP_UPSTREAM_FT_HTTP_429 }, - { 0, 0 } -}; - - -ngx_conf_bitmask_t ngx_http_upstream_cache_method_mask[] = { - { ngx_string("GET"), NGX_HTTP_GET }, - { ngx_string("HEAD"), NGX_HTTP_HEAD }, - { ngx_string("POST"), NGX_HTTP_POST }, - { ngx_null_string, 0 } -}; - - -ngx_conf_bitmask_t ngx_http_upstream_ignore_headers_masks[] = { - { ngx_string("X-Accel-Redirect"), NGX_HTTP_UPSTREAM_IGN_XA_REDIRECT }, - { ngx_string("X-Accel-Expires"), NGX_HTTP_UPSTREAM_IGN_XA_EXPIRES }, - { ngx_string("X-Accel-Limit-Rate"), NGX_HTTP_UPSTREAM_IGN_XA_LIMIT_RATE }, - { ngx_string("X-Accel-Buffering"), NGX_HTTP_UPSTREAM_IGN_XA_BUFFERING }, - { ngx_string("X-Accel-Charset"), NGX_HTTP_UPSTREAM_IGN_XA_CHARSET }, - { ngx_string("Expires"), NGX_HTTP_UPSTREAM_IGN_EXPIRES }, - { ngx_string("Cache-Control"), NGX_HTTP_UPSTREAM_IGN_CACHE_CONTROL }, - { ngx_string("Set-Cookie"), NGX_HTTP_UPSTREAM_IGN_SET_COOKIE }, - { ngx_string("Vary"), NGX_HTTP_UPSTREAM_IGN_VARY }, - { ngx_null_string, 0 } -}; - - -ngx_int_t -ngx_http_upstream_create(ngx_http_request_t *r) -{ - ngx_http_upstream_t *u; - - u = r->upstream; - - if (u && u->cleanup) { - r->main->count++; - ngx_http_upstream_cleanup(r); - } - - u = ngx_pcalloc(r->pool, sizeof(ngx_http_upstream_t)); - if (u == NULL) { - return NGX_ERROR; - } - - r->upstream = u; - - u->peer.log = r->connection->log; - u->peer.log_error = NGX_ERROR_ERR; - -#if (NGX_HTTP_CACHE) - r->cache = NULL; -#endif - - u->headers_in.content_length_n = -1; - u->headers_in.last_modified_time = -1; - - return NGX_OK; -} - - -void -ngx_http_upstream_init(ngx_http_request_t *r) -{ - ngx_connection_t *c; - - c = r->connection; - - ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0, - "http init upstream, client timer: %d", c->read->timer_set); - -#if (NGX_HTTP_V2) - if (r->stream) { - ngx_http_upstream_init_request(r); - return; - } -#endif - -#if (NGX_HTTP_V3) - if (c->quic) { - ngx_http_upstream_init_request(r); - return; - } -#endif - - if (c->read->timer_set) { - ngx_del_timer(c->read); - } - - if (ngx_event_flags & NGX_USE_CLEAR_EVENT) { - - if (!c->write->active) { - if (ngx_add_event(c->write, NGX_WRITE_EVENT, NGX_CLEAR_EVENT) - == NGX_ERROR) - { - ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR); - return; - } - } - } - - ngx_http_upstream_init_request(r); -} - - -static void -ngx_http_upstream_init_request(ngx_http_request_t *r) -{ - ngx_str_t *host; - ngx_uint_t i; - ngx_resolver_ctx_t *ctx, temp; - ngx_http_cleanup_t *cln; - ngx_http_upstream_t *u; - ngx_http_core_loc_conf_t *clcf; - ngx_http_upstream_srv_conf_t *uscf, **uscfp; - ngx_http_upstream_main_conf_t *umcf; - - if (r->aio) { - return; - } - - u = r->upstream; - -#if (NGX_HTTP_CACHE) - - if (u->conf->cache) { - ngx_int_t rc; - - rc = ngx_http_upstream_cache(r, u); - - if (rc == NGX_BUSY) { - r->write_event_handler = ngx_http_upstream_init_request; - return; - } - - r->write_event_handler = ngx_http_request_empty_handler; - - if (rc == NGX_ERROR) { - ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR); - return; - } - - if (rc == NGX_OK) { - rc = ngx_http_upstream_cache_send(r, u); - - if (rc == NGX_DONE) { - return; - } - - if (rc == NGX_HTTP_UPSTREAM_INVALID_HEADER) { - rc = NGX_DECLINED; - r->cached = 0; - u->buffer.start = NULL; - u->cache_status = NGX_HTTP_CACHE_MISS; - u->request_sent = 1; - } - } - - if (rc != NGX_DECLINED) { - ngx_http_finalize_request(r, rc); - return; - } - } - -#endif - - u->store = u->conf->store; - - if (!u->store && !r->post_action && !u->conf->ignore_client_abort) { - - if (r->connection->read->ready) { - ngx_post_event(r->connection->read, &ngx_posted_events); - - } else { - if (ngx_handle_read_event(r->connection->read, 0) != NGX_OK) { - ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR); - return; - } - } - - r->read_event_handler = ngx_http_upstream_rd_check_broken_connection; - r->write_event_handler = ngx_http_upstream_wr_check_broken_connection; - } - - if (r->request_body) { - u->request_bufs = r->request_body->bufs; - } - - if (u->create_request(r) != NGX_OK) { - ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR); - return; - } - - if (ngx_http_upstream_set_local(r, u, u->conf->local) != NGX_OK) { - ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR); - return; - } - - if (u->conf->socket_keepalive) { - u->peer.so_keepalive = 1; - } - - clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module); - - u->output.alignment = clcf->directio_alignment; - u->output.pool = r->pool; - u->output.bufs.num = 1; - u->output.bufs.size = clcf->client_body_buffer_size; - - if (u->output.output_filter == NULL) { - u->output.output_filter = ngx_chain_writer; - u->output.filter_ctx = &u->writer; - } - - u->writer.pool = r->pool; - - if (r->upstream_states == NULL) { - - r->upstream_states = ngx_array_create(r->pool, 1, - sizeof(ngx_http_upstream_state_t)); - if (r->upstream_states == NULL) { - ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR); - return; - } - - } else { - - u->state = ngx_array_push(r->upstream_states); - if (u->state == NULL) { - ngx_http_upstream_finalize_request(r, u, - NGX_HTTP_INTERNAL_SERVER_ERROR); - return; - } - - ngx_memzero(u->state, sizeof(ngx_http_upstream_state_t)); - } - - cln = ngx_http_cleanup_add(r, 0); - if (cln == NULL) { - ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR); - return; - } - - cln->handler = ngx_http_upstream_cleanup; - cln->data = r; - u->cleanup = &cln->handler; - - if (u->resolved == NULL) { - - uscf = u->conf->upstream; - - } else { - -#if (NGX_HTTP_SSL) - u->ssl_name = u->resolved->host; -#endif - - host = &u->resolved->host; - - umcf = ngx_http_get_module_main_conf(r, ngx_http_upstream_module); - - uscfp = umcf->upstreams.elts; - - for (i = 0; i < umcf->upstreams.nelts; i++) { - - uscf = uscfp[i]; - - if (uscf->host.len == host->len - && ((uscf->port == 0 && u->resolved->no_port) - || uscf->port == u->resolved->port) - && ngx_strncasecmp(uscf->host.data, host->data, host->len) == 0) - { - goto found; - } - } - - if (u->resolved->sockaddr) { - - if (u->resolved->port == 0 - && u->resolved->sockaddr->sa_family != AF_UNIX) - { - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "no port in upstream \"%V\"", host); - ngx_http_upstream_finalize_request(r, u, - NGX_HTTP_INTERNAL_SERVER_ERROR); - return; - } - - if (ngx_http_upstream_create_round_robin_peer(r, u->resolved) - != NGX_OK) - { - ngx_http_upstream_finalize_request(r, u, - NGX_HTTP_INTERNAL_SERVER_ERROR); - return; - } - - ngx_http_upstream_connect(r, u); - - return; - } - - if (u->resolved->port == 0) { - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "no port in upstream \"%V\"", host); - ngx_http_upstream_finalize_request(r, u, - NGX_HTTP_INTERNAL_SERVER_ERROR); - return; - } - - temp.name = *host; - - ctx = ngx_resolve_start(clcf->resolver, &temp); - if (ctx == NULL) { - ngx_http_upstream_finalize_request(r, u, - NGX_HTTP_INTERNAL_SERVER_ERROR); - return; - } - - if (ctx == NGX_NO_RESOLVER) { - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "no resolver defined to resolve %V", host); - - ngx_http_upstream_finalize_request(r, u, NGX_HTTP_BAD_GATEWAY); - return; - } - - ctx->name = *host; - ctx->handler = ngx_http_upstream_resolve_handler; - ctx->data = r; - ctx->timeout = clcf->resolver_timeout; - - u->resolved->ctx = ctx; - - if (ngx_resolve_name(ctx) != NGX_OK) { - u->resolved->ctx = NULL; - ngx_http_upstream_finalize_request(r, u, - NGX_HTTP_INTERNAL_SERVER_ERROR); - return; - } - - return; - } - -found: - - if (uscf == NULL) { - ngx_log_error(NGX_LOG_ALERT, r->connection->log, 0, - "no upstream configuration"); - ngx_http_upstream_finalize_request(r, u, - NGX_HTTP_INTERNAL_SERVER_ERROR); - return; - } - - u->upstream = uscf; - -#if (NGX_HTTP_SSL) - u->ssl_name = uscf->host; -#endif - - if (uscf->peer.init(r, uscf) != NGX_OK) { - ngx_http_upstream_finalize_request(r, u, - NGX_HTTP_INTERNAL_SERVER_ERROR); - return; - } - - u->peer.start_time = ngx_current_msec; - - if (u->conf->next_upstream_tries - && u->peer.tries > u->conf->next_upstream_tries) - { - u->peer.tries = u->conf->next_upstream_tries; - } - - ngx_http_upstream_connect(r, u); -} - - -#if (NGX_HTTP_CACHE) - -static ngx_int_t -ngx_http_upstream_cache(ngx_http_request_t *r, ngx_http_upstream_t *u) -{ - ngx_int_t rc; - ngx_http_cache_t *c; - ngx_http_file_cache_t *cache; - - c = r->cache; - - if (c == NULL) { - - if (!(r->method & u->conf->cache_methods)) { - return NGX_DECLINED; - } - - rc = ngx_http_upstream_cache_get(r, u, &cache); - - if (rc != NGX_OK) { - return rc; - } - - if (r->method == NGX_HTTP_HEAD && u->conf->cache_convert_head) { - u->method = ngx_http_core_get_method; - } - - if (ngx_http_file_cache_new(r) != NGX_OK) { - return NGX_ERROR; - } - - if (u->create_key(r) != NGX_OK) { - return NGX_ERROR; - } - - /* TODO: add keys */ - - ngx_http_file_cache_create_key(r); - - if (r->cache->header_start + 256 > u->conf->buffer_size) { - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "%V_buffer_size %uz is not enough for cache key, " - "it should be increased to at least %uz", - &u->conf->module, u->conf->buffer_size, - ngx_align(r->cache->header_start + 256, 1024)); - - r->cache = NULL; - return NGX_DECLINED; - } - - u->cacheable = 1; - - c = r->cache; - - c->body_start = u->conf->buffer_size; - c->min_uses = u->conf->cache_min_uses; - c->file_cache = cache; - - switch (ngx_http_test_predicates(r, u->conf->cache_bypass)) { - - case NGX_ERROR: - return NGX_ERROR; - - case NGX_DECLINED: - u->cache_status = NGX_HTTP_CACHE_BYPASS; - return NGX_DECLINED; - - default: /* NGX_OK */ - break; - } - - c->lock = u->conf->cache_lock; - c->lock_timeout = u->conf->cache_lock_timeout; - c->lock_age = u->conf->cache_lock_age; - - u->cache_status = NGX_HTTP_CACHE_MISS; - } - - rc = ngx_http_file_cache_open(r); - - ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "http upstream cache: %i", rc); - - switch (rc) { - - case NGX_HTTP_CACHE_STALE: - - if (((u->conf->cache_use_stale & NGX_HTTP_UPSTREAM_FT_UPDATING) - || c->stale_updating) && !r->background - && u->conf->cache_background_update) - { - if (ngx_http_upstream_cache_background_update(r, u) == NGX_OK) { - r->cache->background = 1; - u->cache_status = rc; - rc = NGX_OK; - - } else { - rc = NGX_ERROR; - } - } - - break; - - case NGX_HTTP_CACHE_UPDATING: - - if (((u->conf->cache_use_stale & NGX_HTTP_UPSTREAM_FT_UPDATING) - || c->stale_updating) && !r->background) - { - u->cache_status = rc; - rc = NGX_OK; - - } else { - rc = NGX_HTTP_CACHE_STALE; - } - - break; - - case NGX_OK: - u->cache_status = NGX_HTTP_CACHE_HIT; - } - - switch (rc) { - - case NGX_OK: - - return NGX_OK; - - case NGX_HTTP_CACHE_STALE: - - c->valid_sec = 0; - c->updating_sec = 0; - c->error_sec = 0; - - u->buffer.start = NULL; - u->cache_status = NGX_HTTP_CACHE_EXPIRED; - - break; - - case NGX_DECLINED: - - if ((size_t) (u->buffer.end - u->buffer.start) < u->conf->buffer_size) { - u->buffer.start = NULL; - - } else { - u->buffer.pos = u->buffer.start + c->header_start; - u->buffer.last = u->buffer.pos; - } - - break; - - case NGX_HTTP_CACHE_SCARCE: - - u->cacheable = 0; - - break; - - case NGX_AGAIN: - - return NGX_BUSY; - - case NGX_ERROR: - - return NGX_ERROR; - - default: - - /* cached NGX_HTTP_BAD_GATEWAY, NGX_HTTP_GATEWAY_TIME_OUT, etc. */ - - u->cache_status = NGX_HTTP_CACHE_HIT; - - return rc; - } - - if (ngx_http_upstream_cache_check_range(r, u) == NGX_DECLINED) { - u->cacheable = 0; - } - - r->cached = 0; - - return NGX_DECLINED; -} - - -static ngx_int_t -ngx_http_upstream_cache_get(ngx_http_request_t *r, ngx_http_upstream_t *u, - ngx_http_file_cache_t **cache) -{ - ngx_str_t *name, val; - ngx_uint_t i; - ngx_http_file_cache_t **caches; - - if (u->conf->cache_zone) { - *cache = u->conf->cache_zone->data; - return NGX_OK; - } - - if (ngx_http_complex_value(r, u->conf->cache_value, &val) != NGX_OK) { - return NGX_ERROR; - } - - if (val.len == 0 - || (val.len == 3 && ngx_strncmp(val.data, "off", 3) == 0)) - { - return NGX_DECLINED; - } - - caches = u->caches->elts; - - for (i = 0; i < u->caches->nelts; i++) { - name = &caches[i]->shm_zone->shm.name; - - if (name->len == val.len - && ngx_strncmp(name->data, val.data, val.len) == 0) - { - *cache = caches[i]; - return NGX_OK; - } - } - - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "cache \"%V\" not found", &val); - - return NGX_ERROR; -} - - -static ngx_int_t -ngx_http_upstream_cache_send(ngx_http_request_t *r, ngx_http_upstream_t *u) -{ - ngx_int_t rc; - ngx_http_cache_t *c; - - r->cached = 1; - c = r->cache; - - if (c->header_start == c->body_start) { - r->http_version = NGX_HTTP_VERSION_9; - return ngx_http_cache_send(r); - } - - /* TODO: cache stack */ - - u->buffer = *c->buf; - u->buffer.pos += c->header_start; - - ngx_memzero(&u->headers_in, sizeof(ngx_http_upstream_headers_in_t)); - u->headers_in.content_length_n = -1; - u->headers_in.last_modified_time = -1; - - if (ngx_list_init(&u->headers_in.headers, r->pool, 8, - sizeof(ngx_table_elt_t)) - != NGX_OK) - { - return NGX_ERROR; - } - - if (ngx_list_init(&u->headers_in.trailers, r->pool, 2, - sizeof(ngx_table_elt_t)) - != NGX_OK) - { - return NGX_ERROR; - } - - rc = u->process_header(r); - - if (rc == NGX_OK) { - - if (ngx_http_upstream_process_headers(r, u) != NGX_OK) { - return NGX_DONE; - } - - return ngx_http_cache_send(r); - } - - if (rc == NGX_ERROR) { - return NGX_ERROR; - } - - if (rc == NGX_AGAIN || rc == NGX_HTTP_UPSTREAM_EARLY_HINTS) { - rc = NGX_HTTP_UPSTREAM_INVALID_HEADER; - } - - /* rc == NGX_HTTP_UPSTREAM_INVALID_HEADER */ - - ngx_log_error(NGX_LOG_CRIT, r->connection->log, 0, - "cache file \"%s\" contains invalid header", - c->file.name.data); - - /* TODO: delete file */ - - return rc; -} - - -static ngx_int_t -ngx_http_upstream_cache_background_update(ngx_http_request_t *r, - ngx_http_upstream_t *u) -{ - ngx_http_request_t *sr; - - if (r == r->main) { - r->preserve_body = 1; - } - - if (ngx_http_subrequest(r, &r->uri, &r->args, &sr, NULL, - NGX_HTTP_SUBREQUEST_CLONE - |NGX_HTTP_SUBREQUEST_BACKGROUND) - != NGX_OK) - { - return NGX_ERROR; - } - - sr->header_only = 1; - - return NGX_OK; -} - - -static ngx_int_t -ngx_http_upstream_cache_check_range(ngx_http_request_t *r, - ngx_http_upstream_t *u) -{ - off_t offset; - u_char *p, *start; - ngx_table_elt_t *h; - - h = r->headers_in.range; - - if (h == NULL - || !u->cacheable - || u->conf->cache_max_range_offset == NGX_MAX_OFF_T_VALUE) - { - return NGX_OK; - } - - if (u->conf->cache_max_range_offset == 0) { - return NGX_DECLINED; - } - - if (h->value.len < 7 - || ngx_strncasecmp(h->value.data, (u_char *) "bytes=", 6) != 0) - { - return NGX_OK; - } - - p = h->value.data + 6; - - while (*p == ' ') { p++; } - - if (*p == '-') { - return NGX_DECLINED; - } - - start = p; - - while (*p >= '0' && *p <= '9') { p++; } - - offset = ngx_atoof(start, p - start); - - if (offset >= u->conf->cache_max_range_offset) { - return NGX_DECLINED; - } - - return NGX_OK; -} - -#endif - - -static void -ngx_http_upstream_resolve_handler(ngx_resolver_ctx_t *ctx) -{ - ngx_uint_t run_posted; - ngx_connection_t *c; - ngx_http_request_t *r; - ngx_http_upstream_t *u; - ngx_http_upstream_resolved_t *ur; - - run_posted = ctx->async; - - r = ctx->data; - c = r->connection; - - u = r->upstream; - ur = u->resolved; - - ngx_http_set_log_request(c->log, r); - - ngx_log_debug2(NGX_LOG_DEBUG_HTTP, c->log, 0, - "http upstream resolve: \"%V?%V\"", &r->uri, &r->args); - - if (ctx->state) { - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "%V could not be resolved (%i: %s)", - &ctx->name, ctx->state, - ngx_resolver_strerror(ctx->state)); - - ngx_http_upstream_finalize_request(r, u, NGX_HTTP_BAD_GATEWAY); - goto failed; - } - - ur->naddrs = ctx->naddrs; - ur->addrs = ctx->addrs; - -#if (NGX_DEBUG) - { - u_char text[NGX_SOCKADDR_STRLEN]; - ngx_str_t addr; - ngx_uint_t i; - - addr.data = text; - - for (i = 0; i < ctx->naddrs; i++) { - addr.len = ngx_sock_ntop(ur->addrs[i].sockaddr, ur->addrs[i].socklen, - text, NGX_SOCKADDR_STRLEN, 0); - - ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "name was resolved to %V", &addr); - } - } -#endif - - if (ngx_http_upstream_create_round_robin_peer(r, ur) != NGX_OK) { - ngx_http_upstream_finalize_request(r, u, - NGX_HTTP_INTERNAL_SERVER_ERROR); - goto failed; - } - - ngx_resolve_name_done(ctx); - ur->ctx = NULL; - - u->peer.start_time = ngx_current_msec; - - if (u->conf->next_upstream_tries - && u->peer.tries > u->conf->next_upstream_tries) - { - u->peer.tries = u->conf->next_upstream_tries; - } - - ngx_http_upstream_connect(r, u); - -failed: - - if (run_posted) { - ngx_http_run_posted_requests(c); - } -} - - -static void -ngx_http_upstream_handler(ngx_event_t *ev) -{ - ngx_connection_t *c; - ngx_http_request_t *r; - ngx_http_upstream_t *u; - - c = ev->data; - r = c->data; - - u = r->upstream; - c = r->connection; - - ngx_http_set_log_request(c->log, r); - - ngx_log_debug2(NGX_LOG_DEBUG_HTTP, c->log, 0, - "http upstream request: \"%V?%V\"", &r->uri, &r->args); - - if (ev->delayed && ev->timedout) { - ev->delayed = 0; - ev->timedout = 0; - } - - if (ev->write) { - u->write_event_handler(r, u); - - } else { - u->read_event_handler(r, u); - } - - ngx_http_run_posted_requests(c); -} - - -static void -ngx_http_upstream_rd_check_broken_connection(ngx_http_request_t *r) -{ - ngx_http_upstream_check_broken_connection(r, r->connection->read); -} - - -static void -ngx_http_upstream_wr_check_broken_connection(ngx_http_request_t *r) -{ - ngx_http_upstream_check_broken_connection(r, r->connection->write); -} - - -static void -ngx_http_upstream_check_broken_connection(ngx_http_request_t *r, - ngx_event_t *ev) -{ - int n; - char buf[1]; - ngx_err_t err; - ngx_int_t event; - ngx_connection_t *c; - ngx_http_upstream_t *u; - - ngx_log_debug2(NGX_LOG_DEBUG_HTTP, ev->log, 0, - "http upstream check client, write event:%d, \"%V\"", - ev->write, &r->uri); - - c = r->connection; - u = r->upstream; - - if (c->error) { - if ((ngx_event_flags & NGX_USE_LEVEL_EVENT) && ev->active) { - - event = ev->write ? NGX_WRITE_EVENT : NGX_READ_EVENT; - - if (ngx_del_event(ev, event, 0) != NGX_OK) { - ngx_http_upstream_finalize_request(r, u, - NGX_HTTP_INTERNAL_SERVER_ERROR); - return; - } - } - - if (!u->cacheable) { - ngx_http_upstream_finalize_request(r, u, - NGX_HTTP_CLIENT_CLOSED_REQUEST); - } - - return; - } - -#if (NGX_HTTP_V2) - if (r->stream) { - return; - } -#endif - -#if (NGX_HTTP_V3) - - if (c->quic) { - if (c->write->error) { - ngx_http_upstream_finalize_request(r, u, - NGX_HTTP_CLIENT_CLOSED_REQUEST); - } - - return; - } - -#endif - -#if (NGX_HAVE_KQUEUE) - - if (ngx_event_flags & NGX_USE_KQUEUE_EVENT) { - - if (!ev->pending_eof) { - return; - } - - ev->eof = 1; - c->error = 1; - - if (ev->kq_errno) { - ev->error = 1; - } - - if (!u->cacheable && u->peer.connection) { - ngx_log_error(NGX_LOG_INFO, ev->log, ev->kq_errno, - "kevent() reported that client prematurely closed " - "connection, so upstream connection is closed too"); - ngx_http_upstream_finalize_request(r, u, - NGX_HTTP_CLIENT_CLOSED_REQUEST); - return; - } - - ngx_log_error(NGX_LOG_INFO, ev->log, ev->kq_errno, - "kevent() reported that client prematurely closed " - "connection"); - - if (u->peer.connection == NULL) { - ngx_http_upstream_finalize_request(r, u, - NGX_HTTP_CLIENT_CLOSED_REQUEST); - } - - return; - } - -#endif - -#if (NGX_HAVE_EPOLLRDHUP) - - if ((ngx_event_flags & NGX_USE_EPOLL_EVENT) && ngx_use_epoll_rdhup) { - socklen_t len; - - if (!ev->pending_eof) { - return; - } - - ev->eof = 1; - c->error = 1; - - err = 0; - len = sizeof(ngx_err_t); - - /* - * BSDs and Linux return 0 and set a pending error in err - * Solaris returns -1 and sets errno - */ - - if (getsockopt(c->fd, SOL_SOCKET, SO_ERROR, (void *) &err, &len) - == -1) - { - err = ngx_socket_errno; - } - - if (err) { - ev->error = 1; - } - - if (!u->cacheable && u->peer.connection) { - ngx_log_error(NGX_LOG_INFO, ev->log, err, - "epoll_wait() reported that client prematurely closed " - "connection, so upstream connection is closed too"); - ngx_http_upstream_finalize_request(r, u, - NGX_HTTP_CLIENT_CLOSED_REQUEST); - return; - } - - ngx_log_error(NGX_LOG_INFO, ev->log, err, - "epoll_wait() reported that client prematurely closed " - "connection"); - - if (u->peer.connection == NULL) { - ngx_http_upstream_finalize_request(r, u, - NGX_HTTP_CLIENT_CLOSED_REQUEST); - } - - return; - } - -#endif - - n = recv(c->fd, buf, 1, MSG_PEEK); - - err = ngx_socket_errno; - - ngx_log_debug1(NGX_LOG_DEBUG_HTTP, ev->log, err, - "http upstream recv(): %d", n); - - if (ev->write && (n >= 0 || err == NGX_EAGAIN)) { - return; - } - - if ((ngx_event_flags & NGX_USE_LEVEL_EVENT) && ev->active) { - - event = ev->write ? NGX_WRITE_EVENT : NGX_READ_EVENT; - - if (ngx_del_event(ev, event, 0) != NGX_OK) { - ngx_http_upstream_finalize_request(r, u, - NGX_HTTP_INTERNAL_SERVER_ERROR); - return; - } - } - - if (n > 0) { - return; - } - - if (n == -1) { - if (err == NGX_EAGAIN) { - return; - } - - ev->error = 1; - - } else { /* n == 0 */ - err = 0; - } - - ev->eof = 1; - c->error = 1; - - if (!u->cacheable && u->peer.connection) { - ngx_log_error(NGX_LOG_INFO, ev->log, err, - "client prematurely closed connection, " - "so upstream connection is closed too"); - ngx_http_upstream_finalize_request(r, u, - NGX_HTTP_CLIENT_CLOSED_REQUEST); - return; - } - - ngx_log_error(NGX_LOG_INFO, ev->log, err, - "client prematurely closed connection"); - - if (u->peer.connection == NULL) { - ngx_http_upstream_finalize_request(r, u, - NGX_HTTP_CLIENT_CLOSED_REQUEST); - } -} - - -static void -ngx_http_upstream_connect(ngx_http_request_t *r, ngx_http_upstream_t *u) -{ - ngx_int_t rc; - ngx_connection_t *c; - ngx_http_core_loc_conf_t *clcf; - - r->connection->log->action = "connecting to upstream"; - - if (u->state && u->state->response_time == (ngx_msec_t) -1) { - u->state->response_time = ngx_current_msec - u->start_time; - } - - u->state = ngx_array_push(r->upstream_states); - if (u->state == NULL) { - ngx_http_upstream_finalize_request(r, u, - NGX_HTTP_INTERNAL_SERVER_ERROR); - return; - } - - ngx_memzero(u->state, sizeof(ngx_http_upstream_state_t)); - - u->start_time = ngx_current_msec; - - u->state->response_time = (ngx_msec_t) -1; - u->state->connect_time = (ngx_msec_t) -1; - u->state->header_time = (ngx_msec_t) -1; - - rc = ngx_event_connect_peer(&u->peer); - - ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "http upstream connect: %i", rc); - - if (rc == NGX_ERROR) { - ngx_http_upstream_finalize_request(r, u, - NGX_HTTP_INTERNAL_SERVER_ERROR); - return; - } - - u->state->peer = u->peer.name; - -#if (NGX_HTTP_UPSTREAM_ZONE) - if (u->upstream && u->upstream->shm_zone - && (u->upstream->flags & NGX_HTTP_UPSTREAM_MODIFY)) - { - u->state->peer = ngx_palloc(r->pool, - sizeof(ngx_str_t) + u->peer.name->len); - if (u->state->peer == NULL) { - ngx_http_upstream_finalize_request(r, u, - NGX_HTTP_INTERNAL_SERVER_ERROR); - return; - } - - u->state->peer->len = u->peer.name->len; - u->state->peer->data = (u_char *) (u->state->peer + 1); - ngx_memcpy(u->state->peer->data, u->peer.name->data, u->peer.name->len); - - u->peer.name = u->state->peer; - } -#endif - - if (rc == NGX_BUSY) { - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, "no live upstreams"); - ngx_http_upstream_next(r, u, NGX_HTTP_UPSTREAM_FT_NOLIVE); - return; - } - - if (rc == NGX_DECLINED) { - ngx_http_upstream_next(r, u, NGX_HTTP_UPSTREAM_FT_ERROR); - return; - } - - /* rc == NGX_OK || rc == NGX_AGAIN || rc == NGX_DONE */ - - c = u->peer.connection; - - c->requests++; - - c->data = r; - - c->write->handler = ngx_http_upstream_handler; - c->read->handler = ngx_http_upstream_handler; - - u->write_event_handler = ngx_http_upstream_send_request_handler; - u->read_event_handler = ngx_http_upstream_process_header; - - c->sendfile &= r->connection->sendfile; - u->output.sendfile = c->sendfile; - - if (r->connection->tcp_nopush == NGX_TCP_NOPUSH_DISABLED) { - c->tcp_nopush = NGX_TCP_NOPUSH_DISABLED; - } - - if (c->pool == NULL) { - - /* we need separate pool here to be able to cache SSL connections */ - - c->pool = ngx_create_pool(128, r->connection->log); - if (c->pool == NULL) { - ngx_http_upstream_finalize_request(r, u, - NGX_HTTP_INTERNAL_SERVER_ERROR); - return; - } - } - - c->log = r->connection->log; - c->pool->log = c->log; - c->read->log = c->log; - c->write->log = c->log; - - /* init or reinit the ngx_output_chain() and ngx_chain_writer() contexts */ - - clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module); - - u->writer.out = NULL; - u->writer.last = &u->writer.out; - u->writer.connection = c; - u->writer.limit = clcf->sendfile_max_chunk; - - if (u->request_sent || u->response_received) { - if (ngx_http_upstream_reinit(r, u) != NGX_OK) { - ngx_http_upstream_finalize_request(r, u, - NGX_HTTP_INTERNAL_SERVER_ERROR); - return; - } - } - - if (r->request_body - && r->request_body->buf - && r->request_body->temp_file - && r == r->main) - { - /* - * the r->request_body->buf can be reused for one request only, - * the subrequests should allocate their own temporary bufs - */ - - u->output.free = ngx_alloc_chain_link(r->pool); - if (u->output.free == NULL) { - ngx_http_upstream_finalize_request(r, u, - NGX_HTTP_INTERNAL_SERVER_ERROR); - return; - } - - u->output.free->buf = r->request_body->buf; - u->output.free->next = NULL; - u->output.allocated = 1; - - r->request_body->buf->pos = r->request_body->buf->start; - r->request_body->buf->last = r->request_body->buf->start; - r->request_body->buf->tag = u->output.tag; - } - - u->request_sent = 0; - u->request_body_sent = 0; - u->request_body_blocked = 0; - u->response_received = 0; - - if (rc == NGX_AGAIN) { - ngx_add_timer(c->write, u->conf->connect_timeout); - return; - } - -#if (NGX_HTTP_SSL) - - if (u->ssl && c->ssl == NULL) { - ngx_http_upstream_ssl_init_connection(r, u, c); - return; - } - -#endif - - ngx_http_upstream_send_request(r, u, 1); -} - - -#if (NGX_HTTP_SSL) - -static void -ngx_http_upstream_ssl_init_connection(ngx_http_request_t *r, - ngx_http_upstream_t *u, ngx_connection_t *c) -{ - ngx_int_t rc; - ngx_http_core_loc_conf_t *clcf; - - if (ngx_http_upstream_test_connect(c) != NGX_OK) { - ngx_http_upstream_next(r, u, NGX_HTTP_UPSTREAM_FT_ERROR); - return; - } - - if (ngx_ssl_create_connection(u->conf->ssl, c, - NGX_SSL_BUFFER|NGX_SSL_CLIENT) - != NGX_OK) - { - ngx_http_upstream_finalize_request(r, u, - NGX_HTTP_INTERNAL_SERVER_ERROR); - return; - } - - if (u->conf->ssl_server_name || u->conf->ssl_verify) { - if (ngx_http_upstream_ssl_name(r, u, c) != NGX_OK) { - ngx_http_upstream_finalize_request(r, u, - NGX_HTTP_INTERNAL_SERVER_ERROR); - return; - } - } - - if (u->conf->ssl_certificate - && u->conf->ssl_certificate->value.len - && (u->conf->ssl_certificate->lengths - || u->conf->ssl_certificate_key->lengths)) - { - if (ngx_http_upstream_ssl_certificate(r, u, c) != NGX_OK) { - ngx_http_upstream_finalize_request(r, u, - NGX_HTTP_INTERNAL_SERVER_ERROR); - return; - } - } - -#ifdef TLSEXT_TYPE_application_layer_protocol_negotiation - - if (u->ssl_alpn_protocol.len) { - if (SSL_set_alpn_protos(c->ssl->connection, u->ssl_alpn_protocol.data, - u->ssl_alpn_protocol.len) - != 0) - { - ngx_ssl_error(NGX_LOG_ERR, c->log, 0, - "SSL_set_alpn_protos() failed"); - ngx_http_upstream_finalize_request(r, u, - NGX_HTTP_INTERNAL_SERVER_ERROR); - return; - } - } - -#endif - - if (u->conf->ssl_session_reuse) { - c->ssl->save_session = ngx_http_upstream_ssl_save_session; - - if (u->peer.set_session(&u->peer, u->peer.data) != NGX_OK) { - ngx_http_upstream_finalize_request(r, u, - NGX_HTTP_INTERNAL_SERVER_ERROR); - return; - } - - /* abbreviated SSL handshake may interact badly with Nagle */ - - clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module); - - if (clcf->tcp_nodelay && ngx_tcp_nodelay(c) != NGX_OK) { - ngx_http_upstream_finalize_request(r, u, - NGX_HTTP_INTERNAL_SERVER_ERROR); - return; - } - } - - r->connection->log->action = "SSL handshaking to upstream"; - - rc = ngx_ssl_handshake(c); - - if (rc == NGX_AGAIN) { - - if (!c->write->timer_set) { - ngx_add_timer(c->write, u->conf->connect_timeout); - } - - c->ssl->handler = ngx_http_upstream_ssl_handshake_handler; - return; - } - - ngx_http_upstream_ssl_handshake(r, u, c); -} - - -static void -ngx_http_upstream_ssl_handshake_handler(ngx_connection_t *c) -{ - ngx_http_request_t *r; - ngx_http_upstream_t *u; - - r = c->data; - - u = r->upstream; - c = r->connection; - - ngx_http_set_log_request(c->log, r); - - ngx_log_debug2(NGX_LOG_DEBUG_HTTP, c->log, 0, - "http upstream ssl handshake: \"%V?%V\"", - &r->uri, &r->args); - - ngx_http_upstream_ssl_handshake(r, u, u->peer.connection); - - ngx_http_run_posted_requests(c); -} - - -static void -ngx_http_upstream_ssl_handshake(ngx_http_request_t *r, ngx_http_upstream_t *u, - ngx_connection_t *c) -{ - long rc; - - if (c->ssl->handshaked) { - - if (u->conf->ssl_verify) { - rc = SSL_get_verify_result(c->ssl->connection); - - if (rc != X509_V_OK) { - ngx_log_error(NGX_LOG_ERR, c->log, 0, - "upstream SSL certificate verify error: (%l:%s)", - rc, X509_verify_cert_error_string(rc)); - goto failed; - } - - if (ngx_ssl_check_host(c, &u->ssl_name) != NGX_OK) { - ngx_log_error(NGX_LOG_ERR, c->log, 0, - "upstream SSL certificate does not match \"%V\"", - &u->ssl_name); - goto failed; - } - } - - if (!c->ssl->sendfile) { - c->sendfile = 0; - u->output.sendfile = 0; - } - - c->write->handler = ngx_http_upstream_handler; - c->read->handler = ngx_http_upstream_handler; - - ngx_http_upstream_send_request(r, u, 1); - - return; - } - - if (c->write->timedout) { - ngx_http_upstream_next(r, u, NGX_HTTP_UPSTREAM_FT_TIMEOUT); - return; - } - -failed: - - ngx_http_upstream_next(r, u, NGX_HTTP_UPSTREAM_FT_ERROR); -} - - -static void -ngx_http_upstream_ssl_save_session(ngx_connection_t *c) -{ - ngx_http_request_t *r; - ngx_http_upstream_t *u; - - if (c->idle) { - return; - } - - r = c->data; - - u = r->upstream; - c = r->connection; - - ngx_http_set_log_request(c->log, r); - - u->peer.save_session(&u->peer, u->peer.data); -} - - -static ngx_int_t -ngx_http_upstream_ssl_name(ngx_http_request_t *r, ngx_http_upstream_t *u, - ngx_connection_t *c) -{ - u_char *p, *last; - ngx_str_t name; - - if (u->conf->ssl_name) { - if (ngx_http_complex_value(r, u->conf->ssl_name, &name) != NGX_OK) { - return NGX_ERROR; - } - - } else { - name = u->ssl_name; - } - - if (name.len == 0) { - goto done; - } - - /* - * ssl name here may contain port, notably if derived from $proxy_host - * or $http_host; we have to strip it - */ - - p = name.data; - last = name.data + name.len; - - if (*p == '[') { - p = ngx_strlchr(p, last, ']'); - - if (p == NULL) { - p = name.data; - } - } - - p = ngx_strlchr(p, last, ':'); - - if (p != NULL) { - name.len = p - name.data; - } - - if (!u->conf->ssl_server_name) { - goto done; - } - -#ifdef SSL_CTRL_SET_TLSEXT_HOSTNAME - - /* as per RFC 6066, literal IPv4 and IPv6 addresses are not permitted */ - - if (name.len == 0 || *name.data == '[') { - goto done; - } - - if (ngx_inet_addr(name.data, name.len) != INADDR_NONE) { - goto done; - } - - /* - * SSL_set_tlsext_host_name() needs a null-terminated string, - * hence we explicitly null-terminate name here - */ - - p = ngx_pnalloc(r->pool, name.len + 1); - if (p == NULL) { - return NGX_ERROR; - } - - (void) ngx_cpystrn(p, name.data, name.len + 1); - - name.data = p; - - ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "upstream SSL server name: \"%s\"", name.data); - - if (SSL_set_tlsext_host_name(c->ssl->connection, - (char *) name.data) - == 0) - { - ngx_ssl_error(NGX_LOG_ERR, r->connection->log, 0, - "SSL_set_tlsext_host_name(\"%s\") failed", name.data); - return NGX_ERROR; - } - -#endif - -done: - - u->ssl_name = name; - - return NGX_OK; -} - - -static ngx_int_t -ngx_http_upstream_ssl_certificate(ngx_http_request_t *r, - ngx_http_upstream_t *u, ngx_connection_t *c) -{ - ngx_str_t cert, key; - - if (ngx_http_complex_value(r, u->conf->ssl_certificate, &cert) - != NGX_OK) - { - return NGX_ERROR; - } - - ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0, - "http upstream ssl cert: \"%s\"", cert.data); - - if (*cert.data == '\0') { - return NGX_OK; - } - - if (ngx_http_complex_value(r, u->conf->ssl_certificate_key, &key) - != NGX_OK) - { - return NGX_ERROR; - } - - ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0, - "http upstream ssl key: \"%s\"", key.data); - - if (ngx_ssl_connection_certificate(c, r->pool, &cert, &key, - u->conf->ssl_certificate_cache, - u->conf->ssl_passwords) - != NGX_OK) - { - return NGX_ERROR; - } - - return NGX_OK; -} - -#endif - - -static ngx_int_t -ngx_http_upstream_reinit(ngx_http_request_t *r, ngx_http_upstream_t *u) -{ - off_t file_pos; - ngx_chain_t *cl; - - if (u->reinit_request(r) != NGX_OK) { - return NGX_ERROR; - } - - u->early_hints_length = 0; - u->keepalive = 0; - u->upgrade = 0; - u->error = 0; - - ngx_memzero(&u->headers_in, sizeof(ngx_http_upstream_headers_in_t)); - u->headers_in.content_length_n = -1; - u->headers_in.last_modified_time = -1; - - if (ngx_list_init(&u->headers_in.headers, r->pool, 8, - sizeof(ngx_table_elt_t)) - != NGX_OK) - { - return NGX_ERROR; - } - - if (ngx_list_init(&u->headers_in.trailers, r->pool, 2, - sizeof(ngx_table_elt_t)) - != NGX_OK) - { - return NGX_ERROR; - } - - /* reinit the request chain */ - - file_pos = 0; - - for (cl = u->request_bufs; cl; cl = cl->next) { - cl->buf->pos = cl->buf->start; - - /* there is at most one file */ - - if (cl->buf->in_file) { - cl->buf->file_pos = file_pos; - file_pos = cl->buf->file_last; - } - } - - /* reinit the subrequest's ngx_output_chain() context */ - - if (r->request_body && r->request_body->temp_file - && r != r->main && u->output.buf) - { - u->output.free = ngx_alloc_chain_link(r->pool); - if (u->output.free == NULL) { - return NGX_ERROR; - } - - u->output.free->buf = u->output.buf; - u->output.free->next = NULL; - - u->output.buf->pos = u->output.buf->start; - u->output.buf->last = u->output.buf->start; - } - - u->output.buf = NULL; - u->output.in = NULL; - u->output.busy = NULL; - - /* reinit u->buffer */ - - u->buffer.pos = u->buffer.start; - -#if (NGX_HTTP_CACHE) - - if (r->cache) { - u->buffer.pos += r->cache->header_start; - } - -#endif - - u->buffer.last = u->buffer.pos; - - return NGX_OK; -} - - -static void -ngx_http_upstream_send_request(ngx_http_request_t *r, ngx_http_upstream_t *u, - ngx_uint_t do_write) -{ - ngx_int_t rc; - ngx_connection_t *c; - - c = u->peer.connection; - - ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0, - "http upstream send request"); - - if (u->state->connect_time == (ngx_msec_t) -1) { - u->state->connect_time = ngx_current_msec - u->start_time; - } - - if (!u->request_sent && ngx_http_upstream_test_connect(c) != NGX_OK) { - ngx_http_upstream_next(r, u, NGX_HTTP_UPSTREAM_FT_ERROR); - return; - } - - c->log->action = "sending request to upstream"; - - rc = ngx_http_upstream_send_request_body(r, u, do_write); - - if (rc == NGX_ERROR) { - ngx_http_upstream_next(r, u, NGX_HTTP_UPSTREAM_FT_ERROR); - return; - } - - if (rc >= NGX_HTTP_SPECIAL_RESPONSE) { - ngx_http_upstream_finalize_request(r, u, rc); - return; - } - - if (rc == NGX_AGAIN) { - if (!c->write->ready || u->request_body_blocked) { - ngx_add_timer(c->write, u->conf->send_timeout); - - } else if (c->write->timer_set) { - ngx_del_timer(c->write); - } - - if (ngx_handle_write_event(c->write, u->conf->send_lowat) != NGX_OK) { - ngx_http_upstream_finalize_request(r, u, - NGX_HTTP_INTERNAL_SERVER_ERROR); - return; - } - - if (c->write->ready && c->tcp_nopush == NGX_TCP_NOPUSH_SET) { - if (ngx_tcp_push(c->fd) == -1) { - ngx_log_error(NGX_LOG_CRIT, c->log, ngx_socket_errno, - ngx_tcp_push_n " failed"); - ngx_http_upstream_finalize_request(r, u, - NGX_HTTP_INTERNAL_SERVER_ERROR); - return; - } - - c->tcp_nopush = NGX_TCP_NOPUSH_UNSET; - } - - if (c->read->ready) { - ngx_post_event(c->read, &ngx_posted_events); - } - - return; - } - - /* rc == NGX_OK */ - - if (c->write->timer_set) { - ngx_del_timer(c->write); - } - - if (c->tcp_nopush == NGX_TCP_NOPUSH_SET) { - if (ngx_tcp_push(c->fd) == -1) { - ngx_log_error(NGX_LOG_CRIT, c->log, ngx_socket_errno, - ngx_tcp_push_n " failed"); - ngx_http_upstream_finalize_request(r, u, - NGX_HTTP_INTERNAL_SERVER_ERROR); - return; - } - - c->tcp_nopush = NGX_TCP_NOPUSH_UNSET; - } - - if (!u->conf->preserve_output) { - u->write_event_handler = ngx_http_upstream_dummy_handler; - } - - if (ngx_handle_write_event(c->write, 0) != NGX_OK) { - ngx_http_upstream_finalize_request(r, u, - NGX_HTTP_INTERNAL_SERVER_ERROR); - return; - } - - if (!u->request_body_sent) { - u->request_body_sent = 1; - - if (u->header_sent) { - return; - } - - ngx_add_timer(c->read, u->conf->read_timeout); - - if (c->read->ready) { - ngx_http_upstream_process_header(r, u); - return; - } - } -} - - -static ngx_int_t -ngx_http_upstream_send_request_body(ngx_http_request_t *r, - ngx_http_upstream_t *u, ngx_uint_t do_write) -{ - ngx_int_t rc; - ngx_chain_t *out, *cl, *ln; - ngx_connection_t *c; - ngx_http_core_loc_conf_t *clcf; - - ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "http upstream send request body"); - - if (!r->request_body_no_buffering) { - - /* buffered request body */ - - if (!u->request_sent) { - u->request_sent = 1; - out = u->request_bufs; - - } else { - out = NULL; - } - - rc = ngx_output_chain(&u->output, out); - - if (rc == NGX_AGAIN) { - u->request_body_blocked = 1; - - } else { - u->request_body_blocked = 0; - } - - return rc; - } - - if (!u->request_sent) { - u->request_sent = 1; - out = u->request_bufs; - - if (r->request_body->bufs) { - for (cl = out; cl->next; cl = cl->next) { /* void */ } - cl->next = r->request_body->bufs; - r->request_body->bufs = NULL; - } - - c = u->peer.connection; - clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module); - - if (clcf->tcp_nodelay && ngx_tcp_nodelay(c) != NGX_OK) { - return NGX_ERROR; - } - - r->read_event_handler = ngx_http_upstream_read_request_handler; - - } else { - out = NULL; - } - - for ( ;; ) { - - if (do_write) { - rc = ngx_output_chain(&u->output, out); - - if (rc == NGX_ERROR) { - return NGX_ERROR; - } - - while (out) { - ln = out; - out = out->next; - ngx_free_chain(r->pool, ln); - } - - if (rc == NGX_AGAIN) { - u->request_body_blocked = 1; - - } else { - u->request_body_blocked = 0; - } - - if (rc == NGX_OK && !r->reading_body) { - break; - } - } - - if (r->reading_body) { - /* read client request body */ - - rc = ngx_http_read_unbuffered_request_body(r); - - if (rc >= NGX_HTTP_SPECIAL_RESPONSE) { - return rc; - } - - out = r->request_body->bufs; - r->request_body->bufs = NULL; - } - - /* stop if there is nothing to send */ - - if (out == NULL) { - rc = NGX_AGAIN; - break; - } - - do_write = 1; - } - - if (!r->reading_body) { - if (!u->store && !r->post_action && !u->conf->ignore_client_abort) { - r->read_event_handler = - ngx_http_upstream_rd_check_broken_connection; - } - } - - return rc; -} - - -static void -ngx_http_upstream_send_request_handler(ngx_http_request_t *r, - ngx_http_upstream_t *u) -{ - ngx_connection_t *c; - - c = u->peer.connection; - - ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "http upstream send request handler"); - - if (c->write->timedout) { - ngx_http_upstream_next(r, u, NGX_HTTP_UPSTREAM_FT_TIMEOUT); - return; - } - -#if (NGX_HTTP_SSL) - - if (u->ssl && c->ssl == NULL) { - ngx_http_upstream_ssl_init_connection(r, u, c); - return; - } - -#endif - - if (u->header_sent && !u->conf->preserve_output) { - u->write_event_handler = ngx_http_upstream_dummy_handler; - - (void) ngx_handle_write_event(c->write, 0); - - return; - } - - ngx_http_upstream_send_request(r, u, 1); -} - - -static void -ngx_http_upstream_read_request_handler(ngx_http_request_t *r) -{ - ngx_connection_t *c; - ngx_http_upstream_t *u; - - c = r->connection; - u = r->upstream; - - ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "http upstream read request handler"); - - if (c->read->timedout) { - c->timedout = 1; - ngx_http_upstream_finalize_request(r, u, NGX_HTTP_REQUEST_TIME_OUT); - return; - } - - ngx_http_upstream_send_request(r, u, 0); -} - - -static void -ngx_http_upstream_process_header(ngx_http_request_t *r, ngx_http_upstream_t *u) -{ - ssize_t n; - ngx_int_t rc; - ngx_connection_t *c; - - c = u->peer.connection; - - ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0, - "http upstream process header"); - - c->log->action = "reading response header from upstream"; - - if (c->read->timedout) { - ngx_http_upstream_next(r, u, NGX_HTTP_UPSTREAM_FT_TIMEOUT); - return; - } - - if (!u->request_sent && ngx_http_upstream_test_connect(c) != NGX_OK) { - ngx_http_upstream_next(r, u, NGX_HTTP_UPSTREAM_FT_ERROR); - return; - } - - if (u->buffer.start == NULL) { - u->buffer.start = ngx_palloc(r->pool, u->conf->buffer_size); - if (u->buffer.start == NULL) { - ngx_http_upstream_finalize_request(r, u, - NGX_HTTP_INTERNAL_SERVER_ERROR); - return; - } - - u->buffer.pos = u->buffer.start; - u->buffer.last = u->buffer.start; - u->buffer.end = u->buffer.start + u->conf->buffer_size; - u->buffer.temporary = 1; - - u->buffer.tag = u->output.tag; - - if (ngx_list_init(&u->headers_in.headers, r->pool, 8, - sizeof(ngx_table_elt_t)) - != NGX_OK) - { - ngx_http_upstream_finalize_request(r, u, - NGX_HTTP_INTERNAL_SERVER_ERROR); - return; - } - - if (ngx_list_init(&u->headers_in.trailers, r->pool, 2, - sizeof(ngx_table_elt_t)) - != NGX_OK) - { - ngx_http_upstream_finalize_request(r, u, - NGX_HTTP_INTERNAL_SERVER_ERROR); - return; - } - -#if (NGX_HTTP_CACHE) - - if (r->cache) { - u->buffer.pos += r->cache->header_start; - u->buffer.last = u->buffer.pos; - } -#endif - } - - for ( ;; ) { - - n = c->recv(c, u->buffer.last, u->buffer.end - u->buffer.last); - - if (n == NGX_AGAIN) { -#if 0 - ngx_add_timer(rev, u->read_timeout); -#endif - - if (ngx_handle_read_event(c->read, 0) != NGX_OK) { - ngx_http_upstream_finalize_request(r, u, - NGX_HTTP_INTERNAL_SERVER_ERROR); - return; - } - - return; - } - - if (n == 0) { - ngx_log_error(NGX_LOG_ERR, c->log, 0, - "upstream prematurely closed connection"); - } - - if (n == NGX_ERROR || n == 0) { - ngx_http_upstream_next(r, u, NGX_HTTP_UPSTREAM_FT_ERROR); - return; - } - -#if (NGX_HTTP_SSL) - if (u->ssl && c->ssl == NULL) { - ngx_log_error(NGX_LOG_ERR, c->log, 0, - "upstream prematurely sent response"); - ngx_http_upstream_next(r, u, NGX_HTTP_UPSTREAM_FT_ERROR); - return; - } -#endif - - u->state->bytes_received += n; - - u->buffer.last += n; - -#if 0 - u->valid_header_in = 0; - - u->peer.cached = 0; -#endif - - u->response_received = 1; - -again: - - rc = u->process_header(r); - - if (rc == NGX_AGAIN) { - - if (u->buffer.last == u->buffer.end) { - ngx_log_error(NGX_LOG_ERR, c->log, 0, - "upstream sent too big header"); - - ngx_http_upstream_next(r, u, - NGX_HTTP_UPSTREAM_FT_INVALID_HEADER); - return; - } - - continue; - } - - if (rc == NGX_HTTP_UPSTREAM_EARLY_HINTS) { - rc = ngx_http_upstream_process_early_hints(r, u); - - if (rc == NGX_OK) { - goto again; - } - } - - break; - } - - if (rc == NGX_HTTP_UPSTREAM_INVALID_HEADER) { - ngx_http_upstream_next(r, u, NGX_HTTP_UPSTREAM_FT_INVALID_HEADER); - return; - } - - if (rc == NGX_ERROR) { - ngx_http_upstream_finalize_request(r, u, - NGX_HTTP_INTERNAL_SERVER_ERROR); - return; - } - - /* rc == NGX_OK */ - - u->state->header_time = ngx_current_msec - u->start_time; - - if (u->headers_in.status_n >= NGX_HTTP_SPECIAL_RESPONSE) { - - if (ngx_http_upstream_test_next(r, u) == NGX_OK) { - return; - } - - if (ngx_http_upstream_intercept_errors(r, u) == NGX_OK) { - return; - } - } - - if (u->peer.notify) { - u->peer.notify(&u->peer, u->peer.data, NGX_HTTP_UPSTREAM_NOTIFY_HEADER); - } - - if (ngx_http_upstream_process_headers(r, u) != NGX_OK) { - return; - } - - ngx_http_upstream_send_response(r, u); -} - - -static ngx_int_t -ngx_http_upstream_process_early_hints(ngx_http_request_t *r, - ngx_http_upstream_t *u) -{ - u_char *p; - ngx_uint_t i; - ngx_list_part_t *part; - ngx_table_elt_t *h, *ho; - ngx_connection_t *c; - - c = r->connection; - - ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0, "http upstream early hints"); - - if (u->conf->pass_early_hints) { - - u->early_hints_length += u->buffer.pos - u->buffer.start; - - if (u->early_hints_length <= (off_t) u->conf->buffer_size) { - - part = &u->headers_in.headers.part; - h = part->elts; - - for (i = 0; /* void */; i++) { - - if (i >= part->nelts) { - if (part->next == NULL) { - break; - } - - part = part->next; - h = part->elts; - i = 0; - } - - if (ngx_hash_find(&u->conf->hide_headers_hash, h[i].hash, - h[i].lowcase_key, h[i].key.len)) - { - continue; - } - - ho = ngx_list_push(&r->headers_out.headers); - if (ho == NULL) { - return NGX_ERROR; - } - - *ho = h[i]; - } - - if (ngx_http_send_early_hints(r) == NGX_ERROR) { - return NGX_ERROR; - } - - if (c->buffered) { - if (ngx_handle_write_event(c->write, 0) != NGX_OK) { - return NGX_ERROR; - } - - r->write_event_handler = ngx_http_upstream_early_hints_writer; - } - - } else { - ngx_log_error(NGX_LOG_INFO, c->log, 0, - "upstream sent too big early hints"); - } - } - - ngx_http_clean_header(r); - - ngx_memzero(&u->headers_in, sizeof(ngx_http_upstream_headers_in_t)); - u->headers_in.content_length_n = -1; - u->headers_in.last_modified_time = -1; - - if (ngx_list_init(&u->headers_in.headers, r->pool, 8, - sizeof(ngx_table_elt_t)) - != NGX_OK) - { - return NGX_ERROR; - } - - if (ngx_list_init(&u->headers_in.trailers, r->pool, 2, - sizeof(ngx_table_elt_t)) - != NGX_OK) - { - return NGX_ERROR; - } - - p = u->buffer.pos; - - u->buffer.pos = u->buffer.start; - -#if (NGX_HTTP_CACHE) - - if (r->cache) { - u->buffer.pos += r->cache->header_start; - } - -#endif - - u->buffer.last = ngx_movemem(u->buffer.pos, p, u->buffer.last - p); - - return NGX_OK; -} - - -static void -ngx_http_upstream_early_hints_writer(ngx_http_request_t *r) -{ - ngx_connection_t *c; - ngx_http_upstream_t *u; - - c = r->connection; - u = r->upstream; - - ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0, - "http upstream early hints writer"); - - c->log->action = "sending early hints to client"; - - if (ngx_http_write_filter(r, NULL) == NGX_ERROR) { - ngx_http_upstream_finalize_request(r, u, - NGX_HTTP_INTERNAL_SERVER_ERROR); - return; - } - - if (!c->buffered) { - if (!u->store && !r->post_action && !u->conf->ignore_client_abort) { - r->write_event_handler = - ngx_http_upstream_wr_check_broken_connection; - - } else { - r->write_event_handler = ngx_http_request_empty_handler; - } - } - - if (ngx_handle_write_event(c->write, 0) != NGX_OK) { - ngx_http_upstream_finalize_request(r, u, - NGX_HTTP_INTERNAL_SERVER_ERROR); - } -} - - -static ngx_int_t -ngx_http_upstream_test_next(ngx_http_request_t *r, ngx_http_upstream_t *u) -{ - ngx_msec_t timeout; - ngx_uint_t status, mask; - ngx_http_upstream_next_t *un; - - status = u->headers_in.status_n; - - for (un = ngx_http_upstream_next_errors; un->status; un++) { - - if (status != un->status) { - continue; - } - - timeout = u->conf->next_upstream_timeout; - - if (u->request_sent - && (r->method & (NGX_HTTP_POST|NGX_HTTP_LOCK|NGX_HTTP_PATCH))) - { - mask = un->mask | NGX_HTTP_UPSTREAM_FT_NON_IDEMPOTENT; - - } else { - mask = un->mask; - } - - if (u->peer.tries > 1 - && ((u->conf->next_upstream & mask) == mask) - && !(u->request_sent && r->request_body_no_buffering) - && !(timeout && ngx_current_msec - u->peer.start_time >= timeout)) - { - ngx_http_upstream_next(r, u, un->mask); - return NGX_OK; - } - -#if (NGX_HTTP_CACHE) - - if (u->cache_status == NGX_HTTP_CACHE_EXPIRED - && (u->conf->cache_use_stale & un->mask)) - { - ngx_int_t rc; - - rc = u->reinit_request(r); - - if (rc != NGX_OK) { - ngx_http_upstream_finalize_request(r, u, rc); - return NGX_OK; - } - - u->cache_status = NGX_HTTP_CACHE_STALE; - rc = ngx_http_upstream_cache_send(r, u); - - if (rc == NGX_DONE) { - return NGX_OK; - } - - if (rc == NGX_HTTP_UPSTREAM_INVALID_HEADER) { - rc = NGX_HTTP_INTERNAL_SERVER_ERROR; - } - - ngx_http_upstream_finalize_request(r, u, rc); - return NGX_OK; - } - -#endif - - break; - } - -#if (NGX_HTTP_CACHE) - - if (status == NGX_HTTP_NOT_MODIFIED - && u->cache_status == NGX_HTTP_CACHE_EXPIRED - && u->conf->cache_revalidate) - { - time_t now, valid, updating, error; - ngx_int_t rc; - - ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "http upstream not modified"); - - now = ngx_time(); - - valid = r->cache->valid_sec; - updating = r->cache->updating_sec; - error = r->cache->error_sec; - - rc = u->reinit_request(r); - - if (rc != NGX_OK) { - ngx_http_upstream_finalize_request(r, u, rc); - return NGX_OK; - } - - u->cache_status = NGX_HTTP_CACHE_REVALIDATED; - rc = ngx_http_upstream_cache_send(r, u); - - if (rc == NGX_DONE) { - return NGX_OK; - } - - if (rc == NGX_HTTP_UPSTREAM_INVALID_HEADER) { - rc = NGX_HTTP_INTERNAL_SERVER_ERROR; - } - - if (valid == 0) { - valid = r->cache->valid_sec; - updating = r->cache->updating_sec; - error = r->cache->error_sec; - } - - if (valid == 0) { - valid = ngx_http_file_cache_valid(u->conf->cache_valid, - u->headers_in.status_n); - if (valid) { - valid = now + valid; - } - } - - if (valid) { - r->cache->valid_sec = valid; - r->cache->updating_sec = updating; - r->cache->error_sec = error; - - r->cache->date = now; - - ngx_http_file_cache_update_header(r); - } - - ngx_http_upstream_finalize_request(r, u, rc); - return NGX_OK; - } - -#endif - - return NGX_DECLINED; -} - - -static ngx_int_t -ngx_http_upstream_intercept_errors(ngx_http_request_t *r, - ngx_http_upstream_t *u) -{ - ngx_int_t status; - ngx_uint_t i; - ngx_table_elt_t *h, *ho, **ph; - ngx_http_err_page_t *err_page; - ngx_http_core_loc_conf_t *clcf; - - status = u->headers_in.status_n; - - if (status == NGX_HTTP_NOT_FOUND && u->conf->intercept_404) { - ngx_http_upstream_finalize_request(r, u, NGX_HTTP_NOT_FOUND); - return NGX_OK; - } - - if (!u->conf->intercept_errors) { - return NGX_DECLINED; - } - - clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module); - - if (clcf->error_pages == NULL) { - return NGX_DECLINED; - } - - err_page = clcf->error_pages->elts; - for (i = 0; i < clcf->error_pages->nelts; i++) { - - if (err_page[i].status == status) { - - if (status == NGX_HTTP_UNAUTHORIZED - && u->headers_in.www_authenticate) - { - h = u->headers_in.www_authenticate; - ph = &r->headers_out.www_authenticate; - - while (h) { - ho = ngx_list_push(&r->headers_out.headers); - - if (ho == NULL) { - ngx_http_upstream_finalize_request(r, u, - NGX_HTTP_INTERNAL_SERVER_ERROR); - return NGX_OK; - } - - *ho = *h; - ho->next = NULL; - - *ph = ho; - ph = &ho->next; - - h = h->next; - } - } - -#if (NGX_HTTP_CACHE) - - if (r->cache) { - - if (u->headers_in.no_cache || u->headers_in.expired) { - u->cacheable = 0; - } - - if (u->cacheable) { - time_t valid; - - valid = r->cache->valid_sec; - - if (valid == 0) { - valid = ngx_http_file_cache_valid(u->conf->cache_valid, - status); - if (valid) { - r->cache->valid_sec = ngx_time() + valid; - } - } - - if (valid) { - r->cache->error = status; - } - } - - ngx_http_file_cache_free(r->cache, u->pipe->temp_file); - } -#endif - ngx_http_upstream_finalize_request(r, u, status); - - return NGX_OK; - } - } - - return NGX_DECLINED; -} - - -static ngx_int_t -ngx_http_upstream_test_connect(ngx_connection_t *c) -{ - int err; - socklen_t len; - -#if (NGX_HAVE_KQUEUE) - - if (ngx_event_flags & NGX_USE_KQUEUE_EVENT) { - if (c->write->pending_eof || c->read->pending_eof) { - if (c->write->pending_eof) { - err = c->write->kq_errno; - - } else { - err = c->read->kq_errno; - } - - c->log->action = "connecting to upstream"; - (void) ngx_connection_error(c, err, - "kevent() reported that connect() failed"); - return NGX_ERROR; - } - - } else -#endif - { - err = 0; - len = sizeof(int); - - /* - * BSDs and Linux return 0 and set a pending error in err - * Solaris returns -1 and sets errno - */ - - if (getsockopt(c->fd, SOL_SOCKET, SO_ERROR, (void *) &err, &len) - == -1) - { - err = ngx_socket_errno; - } - - if (err) { - c->log->action = "connecting to upstream"; - (void) ngx_connection_error(c, err, "connect() failed"); - return NGX_ERROR; - } - } - - return NGX_OK; -} - - -static ngx_int_t -ngx_http_upstream_process_headers(ngx_http_request_t *r, ngx_http_upstream_t *u) -{ - ngx_str_t uri, args; - ngx_uint_t i, flags; - ngx_list_part_t *part; - ngx_table_elt_t *h; - ngx_http_upstream_header_t *hh; - ngx_http_upstream_main_conf_t *umcf; - - umcf = ngx_http_get_module_main_conf(r, ngx_http_upstream_module); - - if (u->headers_in.no_cache || u->headers_in.expired) { - u->cacheable = 0; - } - - if (u->headers_in.x_accel_redirect - && !(u->conf->ignore_headers & NGX_HTTP_UPSTREAM_IGN_XA_REDIRECT)) - { - ngx_http_upstream_finalize_request(r, u, NGX_DECLINED); - - part = &u->headers_in.headers.part; - h = part->elts; - - for (i = 0; /* void */; i++) { - - if (i >= part->nelts) { - if (part->next == NULL) { - break; - } - - part = part->next; - h = part->elts; - i = 0; - } - - if (h[i].hash == 0) { - continue; - } - - hh = ngx_hash_find(&umcf->headers_in_hash, h[i].hash, - h[i].lowcase_key, h[i].key.len); - - if (hh && hh->redirect) { - if (hh->copy_handler(r, &h[i], hh->conf) != NGX_OK) { - ngx_http_finalize_request(r, - NGX_HTTP_INTERNAL_SERVER_ERROR); - return NGX_DONE; - } - } - } - - uri = u->headers_in.x_accel_redirect->value; - - if (uri.data[0] == '@') { - ngx_http_named_location(r, &uri); - - } else { - ngx_str_null(&args); - flags = NGX_HTTP_LOG_UNSAFE; - - if (ngx_http_parse_unsafe_uri(r, &uri, &args, &flags) != NGX_OK) { - ngx_http_finalize_request(r, NGX_HTTP_NOT_FOUND); - return NGX_DONE; - } - - if (r->method != NGX_HTTP_HEAD) { - r->method = NGX_HTTP_GET; - r->method_name = ngx_http_core_get_method; - } - - ngx_http_internal_redirect(r, &uri, &args); - } - - ngx_http_finalize_request(r, NGX_DONE); - return NGX_DONE; - } - - part = &u->headers_in.headers.part; - h = part->elts; - - for (i = 0; /* void */; i++) { - - if (i >= part->nelts) { - if (part->next == NULL) { - break; - } - - part = part->next; - h = part->elts; - i = 0; - } - - if (h[i].hash == 0) { - continue; - } - - if (ngx_hash_find(&u->conf->hide_headers_hash, h[i].hash, - h[i].lowcase_key, h[i].key.len)) - { - continue; - } - - hh = ngx_hash_find(&umcf->headers_in_hash, h[i].hash, - h[i].lowcase_key, h[i].key.len); - - if (hh) { - if (hh->copy_handler(r, &h[i], hh->conf) != NGX_OK) { - ngx_http_upstream_finalize_request(r, u, - NGX_HTTP_INTERNAL_SERVER_ERROR); - return NGX_DONE; - } - - continue; - } - - if (ngx_http_upstream_copy_header_line(r, &h[i], 0) != NGX_OK) { - ngx_http_upstream_finalize_request(r, u, - NGX_HTTP_INTERNAL_SERVER_ERROR); - return NGX_DONE; - } - } - - if (r->headers_out.server && r->headers_out.server->value.data == NULL) { - r->headers_out.server->hash = 0; - } - - if (r->headers_out.date && r->headers_out.date->value.data == NULL) { - r->headers_out.date->hash = 0; - } - - r->headers_out.status = u->headers_in.status_n; - r->headers_out.status_line = u->headers_in.status_line; - - r->headers_out.content_length_n = u->headers_in.content_length_n; - - r->disable_not_modified = !u->cacheable; - - if (u->conf->force_ranges) { - r->allow_ranges = 1; - r->single_range = 1; - -#if (NGX_HTTP_CACHE) - if (r->cached) { - r->single_range = 0; - } -#endif - } - - u->length = -1; - - return NGX_OK; -} - - -static ngx_int_t -ngx_http_upstream_process_trailers(ngx_http_request_t *r, - ngx_http_upstream_t *u) -{ - ngx_uint_t i; - ngx_list_part_t *part; - ngx_table_elt_t *h, *ho; - - if (!u->conf->pass_trailers) { - return NGX_OK; - } - - part = &u->headers_in.trailers.part; - h = part->elts; - - for (i = 0; /* void */; i++) { - - if (i >= part->nelts) { - if (part->next == NULL) { - break; - } - - part = part->next; - h = part->elts; - i = 0; - } - - if (ngx_hash_find(&u->conf->hide_headers_hash, h[i].hash, - h[i].lowcase_key, h[i].key.len)) - { - continue; - } - - ho = ngx_list_push(&r->headers_out.trailers); - if (ho == NULL) { - return NGX_ERROR; - } - - *ho = h[i]; - } - - return NGX_OK; -} - - -static void -ngx_http_upstream_send_response(ngx_http_request_t *r, ngx_http_upstream_t *u) -{ - ssize_t n; - ngx_int_t rc; - ngx_event_pipe_t *p; - ngx_connection_t *c; - ngx_http_core_loc_conf_t *clcf; - - rc = ngx_http_send_header(r); - - if (rc == NGX_ERROR || rc > NGX_OK || r->post_action) { - ngx_http_upstream_finalize_request(r, u, rc); - return; - } - - u->header_sent = 1; - - if (u->upgrade) { - -#if (NGX_HTTP_CACHE) - - if (r->cache) { - ngx_http_file_cache_free(r->cache, u->pipe->temp_file); - } - -#endif - - ngx_http_upstream_upgrade(r, u); - return; - } - - c = r->connection; - - if (r->header_only) { - - if (!u->buffering) { - ngx_http_upstream_finalize_request(r, u, rc); - return; - } - - if (!u->cacheable && !u->store) { - ngx_http_upstream_finalize_request(r, u, rc); - return; - } - - u->pipe->downstream_error = 1; - } - - if (r->request_body && r->request_body->temp_file - && r == r->main && !r->preserve_body - && !u->conf->preserve_output) - { - ngx_pool_run_cleanup_file(r->pool, r->request_body->temp_file->file.fd); - r->request_body->temp_file->file.fd = NGX_INVALID_FILE; - } - - clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module); - - if (!u->buffering) { - -#if (NGX_HTTP_CACHE) - - if (r->cache) { - ngx_http_file_cache_free(r->cache, u->pipe->temp_file); - } - -#endif - - if (u->input_filter == NULL) { - u->input_filter_init = ngx_http_upstream_non_buffered_filter_init; - u->input_filter = ngx_http_upstream_non_buffered_filter; - u->input_filter_ctx = r; - } - - u->read_event_handler = ngx_http_upstream_process_non_buffered_upstream; - r->write_event_handler = - ngx_http_upstream_process_non_buffered_downstream; - - r->limit_rate = 0; - r->limit_rate_set = 1; - - if (u->input_filter_init(u->input_filter_ctx) == NGX_ERROR) { - ngx_http_upstream_finalize_request(r, u, NGX_ERROR); - return; - } - - if (clcf->tcp_nodelay && ngx_tcp_nodelay(c) != NGX_OK) { - ngx_http_upstream_finalize_request(r, u, NGX_ERROR); - return; - } - - n = u->buffer.last - u->buffer.pos; - - if (n) { - u->buffer.last = u->buffer.pos; - - u->state->response_length += n; - - if (u->input_filter(u->input_filter_ctx, n) == NGX_ERROR) { - ngx_http_upstream_finalize_request(r, u, NGX_ERROR); - return; - } - - ngx_http_upstream_process_non_buffered_downstream(r); - - } else { - u->buffer.pos = u->buffer.start; - u->buffer.last = u->buffer.start; - - if (ngx_http_send_special(r, NGX_HTTP_FLUSH) == NGX_ERROR) { - ngx_http_upstream_finalize_request(r, u, NGX_ERROR); - return; - } - - ngx_http_upstream_process_non_buffered_upstream(r, u); - } - - return; - } - - /* TODO: preallocate event_pipe bufs, look "Content-Length" */ - -#if (NGX_HTTP_CACHE) - - if (r->cache && r->cache->file.fd != NGX_INVALID_FILE) { - ngx_pool_run_cleanup_file(r->pool, r->cache->file.fd); - r->cache->file.fd = NGX_INVALID_FILE; - } - - switch (ngx_http_test_predicates(r, u->conf->no_cache)) { - - case NGX_ERROR: - ngx_http_upstream_finalize_request(r, u, NGX_ERROR); - return; - - case NGX_DECLINED: - u->cacheable = 0; - break; - - default: /* NGX_OK */ - - if (u->cache_status == NGX_HTTP_CACHE_BYPASS) { - - /* create cache if previously bypassed */ - - if (ngx_http_file_cache_create(r) != NGX_OK) { - ngx_http_upstream_finalize_request(r, u, NGX_ERROR); - return; - } - } - - break; - } - - if (u->cacheable) { - time_t now, valid; - - now = ngx_time(); - - valid = r->cache->valid_sec; - - if (valid == 0) { - valid = ngx_http_file_cache_valid(u->conf->cache_valid, - u->headers_in.status_n); - if (valid) { - r->cache->valid_sec = now + valid; - } - } - - if (valid) { - r->cache->date = now; - r->cache->body_start = (u_short) (u->buffer.pos - u->buffer.start); - - if (u->headers_in.status_n == NGX_HTTP_OK - || u->headers_in.status_n == NGX_HTTP_PARTIAL_CONTENT) - { - r->cache->last_modified = u->headers_in.last_modified_time; - - if (u->headers_in.etag) { - r->cache->etag = u->headers_in.etag->value; - - } else { - ngx_str_null(&r->cache->etag); - } - - } else { - r->cache->last_modified = -1; - ngx_str_null(&r->cache->etag); - } - - if (ngx_http_file_cache_set_header(r, u->buffer.start) != NGX_OK) { - ngx_http_upstream_finalize_request(r, u, NGX_ERROR); - return; - } - - } else { - u->cacheable = 0; - } - } - - ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0, - "http cacheable: %d", u->cacheable); - - if (u->cacheable == 0 && r->cache) { - ngx_http_file_cache_free(r->cache, u->pipe->temp_file); - } - - if (r->header_only && !u->cacheable && !u->store) { - ngx_http_upstream_finalize_request(r, u, 0); - return; - } - -#endif - - p = u->pipe; - - p->output_filter = ngx_http_upstream_output_filter; - p->output_ctx = r; - p->tag = u->output.tag; - p->bufs = u->conf->bufs; - p->busy_size = u->conf->busy_buffers_size; - p->upstream = u->peer.connection; - p->downstream = c; - p->pool = r->pool; - p->log = c->log; - p->limit_rate = ngx_http_complex_value_size(r, u->conf->limit_rate, 0); - p->start_sec = ngx_time(); - - p->cacheable = u->cacheable || u->store; - - p->temp_file = ngx_pcalloc(r->pool, sizeof(ngx_temp_file_t)); - if (p->temp_file == NULL) { - ngx_http_upstream_finalize_request(r, u, NGX_ERROR); - return; - } - - p->temp_file->file.fd = NGX_INVALID_FILE; - p->temp_file->file.log = c->log; - p->temp_file->path = u->conf->temp_path; - p->temp_file->pool = r->pool; - - if (p->cacheable) { - p->temp_file->persistent = 1; - -#if (NGX_HTTP_CACHE) - if (r->cache && !r->cache->file_cache->use_temp_path) { - p->temp_file->path = r->cache->file_cache->path; - p->temp_file->file.name = r->cache->file.name; - } -#endif - - } else { - p->temp_file->log_level = NGX_LOG_WARN; - p->temp_file->warn = "an upstream response is buffered " - "to a temporary file"; - } - - p->max_temp_file_size = u->conf->max_temp_file_size; - p->temp_file_write_size = u->conf->temp_file_write_size; - -#if (NGX_THREADS) - if (clcf->aio == NGX_HTTP_AIO_THREADS && clcf->aio_write) { - p->thread_handler = ngx_http_upstream_thread_handler; - p->thread_ctx = r; - } -#endif - - p->preread_bufs = ngx_alloc_chain_link(r->pool); - if (p->preread_bufs == NULL) { - ngx_http_upstream_finalize_request(r, u, NGX_ERROR); - return; - } - - p->preread_bufs->buf = &u->buffer; - p->preread_bufs->next = NULL; - u->buffer.recycled = 1; - - p->preread_size = u->buffer.last - u->buffer.pos; - - if (u->cacheable) { - - p->buf_to_file = ngx_calloc_buf(r->pool); - if (p->buf_to_file == NULL) { - ngx_http_upstream_finalize_request(r, u, NGX_ERROR); - return; - } - - p->buf_to_file->start = u->buffer.start; - p->buf_to_file->pos = u->buffer.start; - p->buf_to_file->last = u->buffer.pos; - p->buf_to_file->temporary = 1; - } - - if (ngx_event_flags & NGX_USE_IOCP_EVENT) { - /* the posted aio operation may corrupt a shadow buffer */ - p->single_buf = 1; - } - - /* TODO: p->free_bufs = 0 if use ngx_create_chain_of_bufs() */ - p->free_bufs = 1; - - /* - * event_pipe would do u->buffer.last += p->preread_size - * as though these bytes were read - */ - u->buffer.last = u->buffer.pos; - - if (u->conf->cyclic_temp_file) { - - /* - * we need to disable the use of sendfile() if we use cyclic temp file - * because the writing a new data may interfere with sendfile() - * that uses the same kernel file pages (at least on FreeBSD) - */ - - p->cyclic_temp_file = 1; - c->sendfile = 0; - - } else { - p->cyclic_temp_file = 0; - } - - p->read_timeout = u->conf->read_timeout; - p->send_timeout = clcf->send_timeout; - p->send_lowat = clcf->send_lowat; - - p->length = -1; - - if (u->input_filter_init - && u->input_filter_init(p->input_ctx) != NGX_OK) - { - ngx_http_upstream_finalize_request(r, u, NGX_ERROR); - return; - } - - u->read_event_handler = ngx_http_upstream_process_upstream; - r->write_event_handler = ngx_http_upstream_process_downstream; - - ngx_http_upstream_process_upstream(r, u); -} - - -static void -ngx_http_upstream_upgrade(ngx_http_request_t *r, ngx_http_upstream_t *u) -{ - ngx_connection_t *c; - ngx_http_core_loc_conf_t *clcf; - - c = r->connection; - clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module); - - /* TODO: prevent upgrade if not requested or not possible */ - - if (r != r->main) { - ngx_log_error(NGX_LOG_ERR, c->log, 0, - "connection upgrade in subrequest"); - ngx_http_upstream_finalize_request(r, u, NGX_ERROR); - return; - } - - r->keepalive = 0; - c->log->action = "proxying upgraded connection"; - - u->read_event_handler = ngx_http_upstream_upgraded_read_upstream; - u->write_event_handler = ngx_http_upstream_upgraded_write_upstream; - r->read_event_handler = ngx_http_upstream_upgraded_read_downstream; - r->write_event_handler = ngx_http_upstream_upgraded_write_downstream; - - if (clcf->tcp_nodelay) { - - if (ngx_tcp_nodelay(c) != NGX_OK) { - ngx_http_upstream_finalize_request(r, u, NGX_ERROR); - return; - } - - if (ngx_tcp_nodelay(u->peer.connection) != NGX_OK) { - ngx_http_upstream_finalize_request(r, u, NGX_ERROR); - return; - } - } - - if (ngx_http_send_special(r, NGX_HTTP_FLUSH) == NGX_ERROR) { - ngx_http_upstream_finalize_request(r, u, NGX_ERROR); - return; - } - - if (u->peer.connection->read->ready - || u->buffer.pos != u->buffer.last) - { - ngx_post_event(c->read, &ngx_posted_events); - ngx_http_upstream_process_upgraded(r, 1, 1); - return; - } - - ngx_http_upstream_process_upgraded(r, 0, 1); -} - - -static void -ngx_http_upstream_upgraded_read_downstream(ngx_http_request_t *r) -{ - ngx_http_upstream_process_upgraded(r, 0, 0); -} - - -static void -ngx_http_upstream_upgraded_write_downstream(ngx_http_request_t *r) -{ - ngx_http_upstream_process_upgraded(r, 1, 1); -} - - -static void -ngx_http_upstream_upgraded_read_upstream(ngx_http_request_t *r, - ngx_http_upstream_t *u) -{ - ngx_http_upstream_process_upgraded(r, 1, 0); -} - - -static void -ngx_http_upstream_upgraded_write_upstream(ngx_http_request_t *r, - ngx_http_upstream_t *u) -{ - ngx_http_upstream_process_upgraded(r, 0, 1); -} - - -static void -ngx_http_upstream_process_upgraded(ngx_http_request_t *r, - ngx_uint_t from_upstream, ngx_uint_t do_write) -{ - size_t size; - ssize_t n; - ngx_buf_t *b; - ngx_uint_t flags; - ngx_connection_t *c, *downstream, *upstream, *dst, *src; - ngx_http_upstream_t *u; - ngx_http_core_loc_conf_t *clcf; - - c = r->connection; - u = r->upstream; - - ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0, - "http upstream process upgraded, fu:%ui", from_upstream); - - downstream = c; - upstream = u->peer.connection; - - if (downstream->write->timedout) { - c->timedout = 1; - ngx_connection_error(c, NGX_ETIMEDOUT, "client timed out"); - ngx_http_upstream_finalize_request(r, u, NGX_HTTP_REQUEST_TIME_OUT); - return; - } - - if (upstream->read->timedout || upstream->write->timedout) { - ngx_connection_error(c, NGX_ETIMEDOUT, "upstream timed out"); - ngx_http_upstream_finalize_request(r, u, NGX_HTTP_GATEWAY_TIME_OUT); - return; - } - - if (from_upstream) { - src = upstream; - dst = downstream; - b = &u->buffer; - - } else { - src = downstream; - dst = upstream; - b = &u->from_client; - - if (r->header_in->last > r->header_in->pos) { - b = r->header_in; - b->end = b->last; - do_write = 1; - } - - if (b->start == NULL) { - b->start = ngx_palloc(r->pool, u->conf->buffer_size); - if (b->start == NULL) { - ngx_http_upstream_finalize_request(r, u, NGX_ERROR); - return; - } - - b->pos = b->start; - b->last = b->start; - b->end = b->start + u->conf->buffer_size; - b->temporary = 1; - b->tag = u->output.tag; - } - } - - for ( ;; ) { - - if (do_write) { - - size = b->last - b->pos; - - if (size && dst->write->ready) { - - n = dst->send(dst, b->pos, size); - - if (n == NGX_ERROR) { - ngx_http_upstream_finalize_request(r, u, NGX_ERROR); - return; - } - - if (n > 0) { - b->pos += n; - - if (b->pos == b->last) { - b->pos = b->start; - b->last = b->start; - } - } - } - } - - size = b->end - b->last; - - if (size && src->read->ready) { - - n = src->recv(src, b->last, size); - - if (n == NGX_AGAIN || n == 0) { - break; - } - - if (n > 0) { - do_write = 1; - b->last += n; - - if (from_upstream) { - u->state->bytes_received += n; - } - - continue; - } - - if (n == NGX_ERROR) { - src->read->eof = 1; - } - } - - break; - } - - if ((upstream->read->eof && u->buffer.pos == u->buffer.last) - || (downstream->read->eof && u->from_client.pos == u->from_client.last) - || (downstream->read->eof && upstream->read->eof)) - { - ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0, - "http upstream upgraded done"); - ngx_http_upstream_finalize_request(r, u, 0); - return; - } - - clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module); - - if (ngx_handle_write_event(upstream->write, u->conf->send_lowat) - != NGX_OK) - { - ngx_http_upstream_finalize_request(r, u, NGX_ERROR); - return; - } - - if (upstream->write->active && !upstream->write->ready) { - ngx_add_timer(upstream->write, u->conf->send_timeout); - - } else if (upstream->write->timer_set) { - ngx_del_timer(upstream->write); - } - - if (upstream->read->eof || upstream->read->error) { - flags = NGX_CLOSE_EVENT; - - } else { - flags = 0; - } - - if (ngx_handle_read_event(upstream->read, flags) != NGX_OK) { - ngx_http_upstream_finalize_request(r, u, NGX_ERROR); - return; - } - - if (upstream->read->active && !upstream->read->ready) { - ngx_add_timer(upstream->read, u->conf->read_timeout); - - } else if (upstream->read->timer_set) { - ngx_del_timer(upstream->read); - } - - if (ngx_handle_write_event(downstream->write, clcf->send_lowat) - != NGX_OK) - { - ngx_http_upstream_finalize_request(r, u, NGX_ERROR); - return; - } - - if (downstream->read->eof || downstream->read->error) { - flags = NGX_CLOSE_EVENT; - - } else { - flags = 0; - } - - if (ngx_handle_read_event(downstream->read, flags) != NGX_OK) { - ngx_http_upstream_finalize_request(r, u, NGX_ERROR); - return; - } - - if (downstream->write->active && !downstream->write->ready) { - ngx_add_timer(downstream->write, clcf->send_timeout); - - } else if (downstream->write->timer_set) { - ngx_del_timer(downstream->write); - } -} - - -static void -ngx_http_upstream_process_non_buffered_downstream(ngx_http_request_t *r) -{ - ngx_event_t *wev; - ngx_connection_t *c; - ngx_http_upstream_t *u; - - c = r->connection; - u = r->upstream; - wev = c->write; - - ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0, - "http upstream process non buffered downstream"); - - c->log->action = "sending to client"; - - if (wev->timedout) { - c->timedout = 1; - ngx_connection_error(c, NGX_ETIMEDOUT, "client timed out"); - ngx_http_upstream_finalize_request(r, u, NGX_HTTP_REQUEST_TIME_OUT); - return; - } - - ngx_http_upstream_process_non_buffered_request(r, 1); -} - - -static void -ngx_http_upstream_process_non_buffered_upstream(ngx_http_request_t *r, - ngx_http_upstream_t *u) -{ - ngx_connection_t *c; - - c = u->peer.connection; - - ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0, - "http upstream process non buffered upstream"); - - c->log->action = "reading upstream"; - - if (c->read->timedout) { - ngx_connection_error(c, NGX_ETIMEDOUT, "upstream timed out"); - ngx_http_upstream_finalize_request(r, u, NGX_HTTP_GATEWAY_TIME_OUT); - return; - } - - ngx_http_upstream_process_non_buffered_request(r, 0); -} - - -static void -ngx_http_upstream_process_non_buffered_request(ngx_http_request_t *r, - ngx_uint_t do_write) -{ - size_t size; - ssize_t n; - ngx_buf_t *b; - ngx_int_t rc; - ngx_uint_t flags; - ngx_connection_t *downstream, *upstream; - ngx_http_upstream_t *u; - ngx_http_core_loc_conf_t *clcf; - - u = r->upstream; - downstream = r->connection; - upstream = u->peer.connection; - - b = &u->buffer; - - do_write = do_write || u->length == 0; - - for ( ;; ) { - - if (do_write) { - - if (u->out_bufs || u->busy_bufs || downstream->buffered) { - rc = ngx_http_output_filter(r, u->out_bufs); - - if (rc == NGX_ERROR) { - ngx_http_upstream_finalize_request(r, u, NGX_ERROR); - return; - } - - ngx_chain_update_chains(r->pool, &u->free_bufs, &u->busy_bufs, - &u->out_bufs, u->output.tag); - } - - if (u->busy_bufs == NULL) { - - if (u->length == 0 - || (upstream->read->eof && u->length == -1)) - { - ngx_http_upstream_finalize_request(r, u, 0); - return; - } - - if (upstream->read->eof) { - ngx_log_error(NGX_LOG_ERR, upstream->log, 0, - "upstream prematurely closed connection"); - - ngx_http_upstream_finalize_request(r, u, - NGX_HTTP_BAD_GATEWAY); - return; - } - - if (upstream->read->error || u->error) { - ngx_http_upstream_finalize_request(r, u, - NGX_HTTP_BAD_GATEWAY); - return; - } - - b->pos = b->start; - b->last = b->start; - } - } - - size = b->end - b->last; - - if (size && upstream->read->ready) { - - n = upstream->recv(upstream, b->last, size); - - if (n == NGX_AGAIN) { - break; - } - - if (n > 0) { - u->state->bytes_received += n; - u->state->response_length += n; - - if (u->input_filter(u->input_filter_ctx, n) == NGX_ERROR) { - ngx_http_upstream_finalize_request(r, u, NGX_ERROR); - return; - } - } - - do_write = 1; - - continue; - } - - break; - } - - clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module); - - if (downstream->data == r) { - if (ngx_handle_write_event(downstream->write, clcf->send_lowat) - != NGX_OK) - { - ngx_http_upstream_finalize_request(r, u, NGX_ERROR); - return; - } - } - - if (downstream->write->active && !downstream->write->ready) { - ngx_add_timer(downstream->write, clcf->send_timeout); - - } else if (downstream->write->timer_set) { - ngx_del_timer(downstream->write); - } - - if (upstream->read->eof || upstream->read->error) { - flags = NGX_CLOSE_EVENT; - - } else { - flags = 0; - } - - if (ngx_handle_read_event(upstream->read, flags) != NGX_OK) { - ngx_http_upstream_finalize_request(r, u, NGX_ERROR); - return; - } - - if (upstream->read->active && !upstream->read->ready) { - ngx_add_timer(upstream->read, u->conf->read_timeout); - - } else if (upstream->read->timer_set) { - ngx_del_timer(upstream->read); - } -} - - -ngx_int_t -ngx_http_upstream_non_buffered_filter_init(void *data) -{ - return NGX_OK; -} - - -ngx_int_t -ngx_http_upstream_non_buffered_filter(void *data, ssize_t bytes) -{ - ngx_http_request_t *r = data; - - ngx_buf_t *b; - ngx_chain_t *cl, **ll; - ngx_http_upstream_t *u; - - u = r->upstream; - - if (u->length == 0) { - ngx_log_error(NGX_LOG_WARN, r->connection->log, 0, - "upstream sent more data than specified in " - "\"Content-Length\" header"); - return NGX_OK; - } - - for (cl = u->out_bufs, ll = &u->out_bufs; cl; cl = cl->next) { - ll = &cl->next; - } - - cl = ngx_chain_get_free_buf(r->pool, &u->free_bufs); - if (cl == NULL) { - return NGX_ERROR; - } - - *ll = cl; - - cl->buf->flush = 1; - cl->buf->memory = 1; - - b = &u->buffer; - - cl->buf->pos = b->last; - b->last += bytes; - cl->buf->last = b->last; - cl->buf->tag = u->output.tag; - - if (u->length == -1) { - return NGX_OK; - } - - if (bytes > u->length) { - - ngx_log_error(NGX_LOG_WARN, r->connection->log, 0, - "upstream sent more data than specified in " - "\"Content-Length\" header"); - - cl->buf->last = cl->buf->pos + u->length; - u->length = 0; - - return NGX_OK; - } - - u->length -= bytes; - - return NGX_OK; -} - - -#if (NGX_THREADS) - -static ngx_int_t -ngx_http_upstream_thread_handler(ngx_thread_task_t *task, ngx_file_t *file) -{ - ngx_str_t name; - ngx_event_pipe_t *p; - ngx_connection_t *c; - ngx_thread_pool_t *tp; - ngx_http_request_t *r; - ngx_http_core_loc_conf_t *clcf; - - r = file->thread_ctx; - p = r->upstream->pipe; - - if (r->aio) { - /* - * tolerate sendfile() calls if another operation is already - * running; this can happen due to subrequests, multiple calls - * of the next body filter from a filter, or in HTTP/2 due to - * a write event on the main connection - */ - - c = r->connection; - -#if (NGX_HTTP_V2) - if (r->stream) { - c = r->stream->connection->connection; - } -#endif - - if (task == c->sendfile_task) { - return NGX_OK; - } - } - - clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module); - tp = clcf->thread_pool; - - if (tp == NULL) { - if (ngx_http_complex_value(r, clcf->thread_pool_value, &name) - != NGX_OK) - { - return NGX_ERROR; - } - - tp = ngx_thread_pool_get((ngx_cycle_t *) ngx_cycle, &name); - - if (tp == NULL) { - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "thread pool \"%V\" not found", &name); - return NGX_ERROR; - } - } - - task->event.data = r; - task->event.handler = ngx_http_upstream_thread_event_handler; - - if (ngx_thread_task_post(tp, task) != NGX_OK) { - return NGX_ERROR; - } - - r->main->blocked++; - r->aio = 1; - p->aio = 1; - - ngx_add_timer(&task->event, 60000); - - return NGX_OK; -} - - -static void -ngx_http_upstream_thread_event_handler(ngx_event_t *ev) -{ - ngx_connection_t *c; - ngx_http_request_t *r; - - r = ev->data; - c = r->connection; - - ngx_http_set_log_request(c->log, r); - - ngx_log_debug2(NGX_LOG_DEBUG_HTTP, c->log, 0, - "http upstream thread: \"%V?%V\"", &r->uri, &r->args); - - if (ev->timedout) { - ngx_log_error(NGX_LOG_ALERT, c->log, 0, - "thread operation took too long"); - ev->timedout = 0; - return; - } - - if (ev->timer_set) { - ngx_del_timer(ev); - } - - r->main->blocked--; - r->aio = 0; - -#if (NGX_HTTP_V2) - - if (r->stream) { - /* - * for HTTP/2, update write event to make sure processing will - * reach the main connection to handle sendfile() in threads - */ - - c->write->ready = 1; - c->write->active = 0; - } - -#endif - - if (r->done || r->main->terminated) { - /* - * trigger connection event handler if the subrequest was - * already finalized (this can happen if the handler is used - * for sendfile() in threads), or if the request was terminated - */ - - c->write->handler(c->write); - - } else { - r->write_event_handler(r); - ngx_http_run_posted_requests(c); - } -} - -#endif - - -static ngx_int_t -ngx_http_upstream_output_filter(void *data, ngx_chain_t *chain) -{ - ngx_int_t rc; - ngx_event_pipe_t *p; - ngx_http_request_t *r; - - r = data; - p = r->upstream->pipe; - - rc = ngx_http_output_filter(r, chain); - - p->aio = r->aio; - - return rc; -} - - -static void -ngx_http_upstream_process_downstream(ngx_http_request_t *r) -{ - ngx_event_t *wev; - ngx_connection_t *c; - ngx_event_pipe_t *p; - ngx_http_upstream_t *u; - - c = r->connection; - u = r->upstream; - p = u->pipe; - wev = c->write; - - ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0, - "http upstream process downstream"); - - c->log->action = "sending to client"; - -#if (NGX_THREADS) - p->aio = r->aio; -#endif - - if (wev->timedout) { - - p->downstream_error = 1; - c->timedout = 1; - ngx_connection_error(c, NGX_ETIMEDOUT, "client timed out"); - - } else { - - if (wev->delayed) { - - ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0, - "http downstream delayed"); - - if (ngx_handle_write_event(wev, p->send_lowat) != NGX_OK) { - ngx_http_upstream_finalize_request(r, u, NGX_ERROR); - } - - return; - } - - if (ngx_event_pipe(p, 1) == NGX_ABORT) { - ngx_http_upstream_finalize_request(r, u, NGX_ERROR); - return; - } - } - - ngx_http_upstream_process_request(r, u); -} - - -static void -ngx_http_upstream_process_upstream(ngx_http_request_t *r, - ngx_http_upstream_t *u) -{ - ngx_event_t *rev; - ngx_event_pipe_t *p; - ngx_connection_t *c; - - c = u->peer.connection; - p = u->pipe; - rev = c->read; - - ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0, - "http upstream process upstream"); - - c->log->action = "reading upstream"; - - if (rev->timedout) { - - p->upstream_error = 1; - ngx_connection_error(c, NGX_ETIMEDOUT, "upstream timed out"); - - } else { - - if (rev->delayed) { - - ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0, - "http upstream delayed"); - - if (ngx_handle_read_event(rev, 0) != NGX_OK) { - ngx_http_upstream_finalize_request(r, u, NGX_ERROR); - } - - return; - } - - if (ngx_event_pipe(p, 0) == NGX_ABORT) { - ngx_http_upstream_finalize_request(r, u, NGX_ERROR); - return; - } - } - - ngx_http_upstream_process_request(r, u); -} - - -static void -ngx_http_upstream_process_request(ngx_http_request_t *r, - ngx_http_upstream_t *u) -{ - ngx_temp_file_t *tf; - ngx_event_pipe_t *p; - - p = u->pipe; - -#if (NGX_THREADS) - - if (p->writing && !p->aio) { - - /* - * make sure to call ngx_event_pipe() - * if there is an incomplete aio write - */ - - if (ngx_event_pipe(p, 1) == NGX_ABORT) { - ngx_http_upstream_finalize_request(r, u, NGX_ERROR); - return; - } - } - - if (p->writing) { - return; - } - -#endif - - if (u->peer.connection) { - - if (u->store) { - - if (p->upstream_eof || p->upstream_done) { - - tf = p->temp_file; - - if (u->headers_in.status_n == NGX_HTTP_OK - && (p->upstream_done || p->length == -1) - && (u->headers_in.content_length_n == -1 - || u->headers_in.content_length_n == tf->offset)) - { - ngx_http_upstream_store(r, u); - } - } - } - -#if (NGX_HTTP_CACHE) - - if (u->cacheable) { - - if (p->upstream_done) { - ngx_http_file_cache_update(r, p->temp_file); - - } else if (p->upstream_eof) { - - tf = p->temp_file; - - if (p->length == -1 - && (u->headers_in.content_length_n == -1 - || u->headers_in.content_length_n - == tf->offset - (off_t) r->cache->body_start)) - { - ngx_http_file_cache_update(r, tf); - - } else { - ngx_http_file_cache_free(r->cache, tf); - } - - } else if (p->upstream_error) { - ngx_http_file_cache_free(r->cache, p->temp_file); - } - } - -#endif - - if (p->upstream_done || p->upstream_eof || p->upstream_error) { - ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "http upstream exit: %p", p->out); - - if (p->upstream_done - || (p->upstream_eof && p->length == -1)) - { - ngx_http_upstream_finalize_request(r, u, 0); - return; - } - - if (p->upstream_eof) { - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "upstream prematurely closed connection"); - } - - ngx_http_upstream_finalize_request(r, u, NGX_HTTP_BAD_GATEWAY); - return; - } - } - - if (p->downstream_error) { - ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "http upstream downstream error"); - - if (!u->cacheable && !u->store && u->peer.connection) { - ngx_http_upstream_finalize_request(r, u, NGX_ERROR); - } - } -} - - -static void -ngx_http_upstream_store(ngx_http_request_t *r, ngx_http_upstream_t *u) -{ - size_t root; - time_t lm; - ngx_str_t path; - ngx_temp_file_t *tf; - ngx_ext_rename_file_t ext; - - tf = u->pipe->temp_file; - - if (tf->file.fd == NGX_INVALID_FILE) { - - /* create file for empty 200 response */ - - tf = ngx_pcalloc(r->pool, sizeof(ngx_temp_file_t)); - if (tf == NULL) { - return; - } - - tf->file.fd = NGX_INVALID_FILE; - tf->file.log = r->connection->log; - tf->path = u->conf->temp_path; - tf->pool = r->pool; - tf->persistent = 1; - - if (ngx_create_temp_file(&tf->file, tf->path, tf->pool, - tf->persistent, tf->clean, tf->access) - != NGX_OK) - { - return; - } - - u->pipe->temp_file = tf; - } - - ext.access = u->conf->store_access; - ext.path_access = u->conf->store_access; - ext.time = -1; - ext.create_path = 1; - ext.delete_file = 1; - ext.log = r->connection->log; - - if (u->headers_in.last_modified) { - - lm = ngx_parse_http_time(u->headers_in.last_modified->value.data, - u->headers_in.last_modified->value.len); - - if (lm != NGX_ERROR) { - ext.time = lm; - ext.fd = tf->file.fd; - } - } - - if (u->conf->store_lengths == NULL) { - - if (ngx_http_map_uri_to_path(r, &path, &root, 0) == NULL) { - return; - } - - } else { - if (ngx_http_script_run(r, &path, u->conf->store_lengths->elts, 0, - u->conf->store_values->elts) - == NULL) - { - return; - } - } - - path.len--; - - ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "upstream stores \"%s\" to \"%s\"", - tf->file.name.data, path.data); - - if (path.len == 0) { - return; - } - - (void) ngx_ext_rename_file(&tf->file.name, &path, &ext); - - u->store = 0; -} - - -static void -ngx_http_upstream_dummy_handler(ngx_http_request_t *r, ngx_http_upstream_t *u) -{ - ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "http upstream dummy handler"); -} - - -static void -ngx_http_upstream_next(ngx_http_request_t *r, ngx_http_upstream_t *u, - ngx_uint_t ft_type) -{ - ngx_msec_t timeout; - ngx_uint_t status, state; - - ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "http next upstream, %xi", ft_type); - - if (u->peer.sockaddr) { - - if (u->peer.connection) { - u->state->bytes_sent = u->peer.connection->sent; - } - - if (ft_type == NGX_HTTP_UPSTREAM_FT_HTTP_403 - || ft_type == NGX_HTTP_UPSTREAM_FT_HTTP_404) - { - state = NGX_PEER_NEXT; - - } else { - state = NGX_PEER_FAILED; - } - - u->peer.free(&u->peer, u->peer.data, state); - u->peer.sockaddr = NULL; - -#if (NGX_HTTP_UPSTREAM_SID) - u->peer.sid = NULL; -#endif - } - - if (ft_type == NGX_HTTP_UPSTREAM_FT_TIMEOUT) { - ngx_log_error(NGX_LOG_ERR, r->connection->log, NGX_ETIMEDOUT, - "upstream timed out"); - } - - if (u->peer.cached && ft_type == NGX_HTTP_UPSTREAM_FT_ERROR) { - /* TODO: inform balancer instead */ - u->peer.tries++; - } - - switch (ft_type) { - - case NGX_HTTP_UPSTREAM_FT_TIMEOUT: - case NGX_HTTP_UPSTREAM_FT_HTTP_504: - status = NGX_HTTP_GATEWAY_TIME_OUT; - break; - - case NGX_HTTP_UPSTREAM_FT_HTTP_500: - status = NGX_HTTP_INTERNAL_SERVER_ERROR; - break; - - case NGX_HTTP_UPSTREAM_FT_HTTP_503: - status = NGX_HTTP_SERVICE_UNAVAILABLE; - break; - - case NGX_HTTP_UPSTREAM_FT_HTTP_403: - status = NGX_HTTP_FORBIDDEN; - break; - - case NGX_HTTP_UPSTREAM_FT_HTTP_404: - status = NGX_HTTP_NOT_FOUND; - break; - - case NGX_HTTP_UPSTREAM_FT_HTTP_429: - status = NGX_HTTP_TOO_MANY_REQUESTS; - break; - - /* - * NGX_HTTP_UPSTREAM_FT_BUSY_LOCK and NGX_HTTP_UPSTREAM_FT_MAX_WAITING - * never reach here - */ - - default: - status = NGX_HTTP_BAD_GATEWAY; - } - - if (r->connection->error) { - ngx_http_upstream_finalize_request(r, u, - NGX_HTTP_CLIENT_CLOSED_REQUEST); - return; - } - - u->state->status = status; - - timeout = u->conf->next_upstream_timeout; - - if (u->request_sent - && (r->method & (NGX_HTTP_POST|NGX_HTTP_LOCK|NGX_HTTP_PATCH))) - { - ft_type |= NGX_HTTP_UPSTREAM_FT_NON_IDEMPOTENT; - } - - if (u->peer.tries == 0 - || ((u->conf->next_upstream & ft_type) != ft_type) - || (u->request_sent && r->request_body_no_buffering) - || (timeout && ngx_current_msec - u->peer.start_time >= timeout)) - { -#if (NGX_HTTP_CACHE) - - if (u->cache_status == NGX_HTTP_CACHE_EXPIRED - && ((u->conf->cache_use_stale & ft_type) || r->cache->stale_error)) - { - ngx_int_t rc; - - rc = u->reinit_request(r); - - if (rc != NGX_OK) { - ngx_http_upstream_finalize_request(r, u, rc); - return; - } - - u->cache_status = NGX_HTTP_CACHE_STALE; - rc = ngx_http_upstream_cache_send(r, u); - - if (rc == NGX_DONE) { - return; - } - - if (rc == NGX_HTTP_UPSTREAM_INVALID_HEADER) { - rc = NGX_HTTP_INTERNAL_SERVER_ERROR; - } - - ngx_http_upstream_finalize_request(r, u, rc); - return; - } -#endif - - ngx_http_upstream_finalize_request(r, u, status); - return; - } - - if (u->peer.connection) { - ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "close http upstream connection: %d", - u->peer.connection->fd); -#if (NGX_HTTP_SSL) - - if (u->peer.connection->ssl) { - u->peer.connection->ssl->no_wait_shutdown = 1; - u->peer.connection->ssl->no_send_shutdown = 1; - - (void) ngx_ssl_shutdown(u->peer.connection); - } -#endif - - if (u->peer.connection->pool) { - ngx_destroy_pool(u->peer.connection->pool); - } - - ngx_close_connection(u->peer.connection); - u->peer.connection = NULL; - } - - ngx_http_upstream_connect(r, u); -} - - -static void -ngx_http_upstream_cleanup(void *data) -{ - ngx_http_request_t *r = data; - - ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "cleanup http upstream request: \"%V\"", &r->uri); - - ngx_http_upstream_finalize_request(r, r->upstream, NGX_DONE); -} - - -static void -ngx_http_upstream_finalize_request(ngx_http_request_t *r, - ngx_http_upstream_t *u, ngx_int_t rc) -{ - ngx_uint_t flush; - - ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "finalize http upstream request: %i", rc); - - if (u->cleanup == NULL) { - /* the request was already finalized */ - ngx_http_finalize_request(r, NGX_DONE); - return; - } - - *u->cleanup = NULL; - u->cleanup = NULL; - - if (u->resolved && u->resolved->ctx) { - ngx_resolve_name_done(u->resolved->ctx); - u->resolved->ctx = NULL; - } - - if (u->state && u->state->response_time == (ngx_msec_t) -1) { - u->state->response_time = ngx_current_msec - u->start_time; - - if (u->pipe && u->pipe->read_length) { - u->state->bytes_received += u->pipe->read_length - - u->pipe->preread_size; - u->state->response_length = u->pipe->read_length; - } - - if (u->peer.connection) { - u->state->bytes_sent = u->peer.connection->sent; - } - } - - u->finalize_request(r, rc); - - if (u->peer.free && u->peer.sockaddr) { - u->peer.free(&u->peer, u->peer.data, 0); - u->peer.sockaddr = NULL; - -#if (NGX_HTTP_UPSTREAM_SID) - u->peer.sid = NULL; -#endif - } - - if (u->peer.connection) { - -#if (NGX_HTTP_SSL) - - /* TODO: do not shutdown persistent connection */ - - if (u->peer.connection->ssl) { - - /* - * We send the "close notify" shutdown alert to the upstream only - * and do not wait its "close notify" shutdown alert. - * It is acceptable according to the TLS standard. - */ - - u->peer.connection->ssl->no_wait_shutdown = 1; - - (void) ngx_ssl_shutdown(u->peer.connection); - } -#endif - - ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "close http upstream connection: %d", - u->peer.connection->fd); - - if (u->peer.connection->pool) { - ngx_destroy_pool(u->peer.connection->pool); - } - - ngx_close_connection(u->peer.connection); - } - - u->peer.connection = NULL; - - if (u->pipe) { - u->pipe->upstream = NULL; - } - - if (u->pipe && u->pipe->temp_file) { - ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "http upstream temp fd: %d", - u->pipe->temp_file->file.fd); - } - - if (u->store && u->pipe && u->pipe->temp_file - && u->pipe->temp_file->file.fd != NGX_INVALID_FILE) - { - if (ngx_delete_file(u->pipe->temp_file->file.name.data) - == NGX_FILE_ERROR) - { - ngx_log_error(NGX_LOG_CRIT, r->connection->log, ngx_errno, - ngx_delete_file_n " \"%s\" failed", - u->pipe->temp_file->file.name.data); - } - } - -#if (NGX_HTTP_CACHE) - - if (r->cache) { - - if (u->cacheable) { - - if (rc == NGX_HTTP_BAD_GATEWAY || rc == NGX_HTTP_GATEWAY_TIME_OUT) { - time_t valid; - - valid = ngx_http_file_cache_valid(u->conf->cache_valid, rc); - - if (valid) { - r->cache->valid_sec = ngx_time() + valid; - r->cache->error = rc; - } - } - } - - ngx_http_file_cache_free(r->cache, u->pipe->temp_file); - } - -#endif - - r->read_event_handler = ngx_http_block_reading; - - if (rc == NGX_DECLINED) { - return; - } - - r->connection->log->action = "sending to client"; - - if (!u->header_sent - || rc == NGX_HTTP_REQUEST_TIME_OUT - || rc == NGX_HTTP_CLIENT_CLOSED_REQUEST) - { - ngx_http_finalize_request(r, rc); - return; - } - - flush = 0; - - if (rc >= NGX_HTTP_SPECIAL_RESPONSE) { - rc = NGX_ERROR; - flush = 1; - } - - if (r->header_only - || (u->pipe && u->pipe->downstream_error)) - { - ngx_http_finalize_request(r, rc); - return; - } - - if (rc == 0) { - - if (ngx_http_upstream_process_trailers(r, u) != NGX_OK) { - ngx_http_finalize_request(r, NGX_ERROR); - return; - } - - rc = ngx_http_send_special(r, NGX_HTTP_LAST); - - } else if (flush) { - r->keepalive = 0; - rc = ngx_http_send_special(r, NGX_HTTP_FLUSH); - } - - ngx_http_finalize_request(r, rc); -} - - -static ngx_int_t -ngx_http_upstream_process_header_line(ngx_http_request_t *r, ngx_table_elt_t *h, - ngx_uint_t offset) -{ - ngx_table_elt_t **ph; - - ph = (ngx_table_elt_t **) ((char *) &r->upstream->headers_in + offset); - - if (*ph) { - ngx_log_error(NGX_LOG_WARN, r->connection->log, 0, - "upstream sent duplicate header line: \"%V: %V\", " - "previous value: \"%V: %V\", ignored", - &h->key, &h->value, - &(*ph)->key, &(*ph)->value); - h->hash = 0; - return NGX_OK; - } - - *ph = h; - h->next = NULL; - - return NGX_OK; -} - - -static ngx_int_t -ngx_http_upstream_process_multi_header_lines(ngx_http_request_t *r, - ngx_table_elt_t *h, ngx_uint_t offset) -{ - ngx_table_elt_t **ph; - - ph = (ngx_table_elt_t **) ((char *) &r->upstream->headers_in + offset); - - while (*ph) { ph = &(*ph)->next; } - - *ph = h; - h->next = NULL; - - return NGX_OK; -} - - -static ngx_int_t -ngx_http_upstream_ignore_header_line(ngx_http_request_t *r, ngx_table_elt_t *h, - ngx_uint_t offset) -{ - return NGX_OK; -} - - -static ngx_int_t -ngx_http_upstream_process_content_length(ngx_http_request_t *r, - ngx_table_elt_t *h, ngx_uint_t offset) -{ - ngx_http_upstream_t *u; - - u = r->upstream; - - if (u->headers_in.content_length) { - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "upstream sent duplicate header line: \"%V: %V\", " - "previous value: \"%V: %V\"", - &h->key, &h->value, - &u->headers_in.content_length->key, - &u->headers_in.content_length->value); - return NGX_HTTP_UPSTREAM_INVALID_HEADER; - } - - if (u->headers_in.transfer_encoding) { - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "upstream sent \"Content-Length\" and " - "\"Transfer-Encoding\" headers at the same time"); - return NGX_HTTP_UPSTREAM_INVALID_HEADER; - } - - h->next = NULL; - u->headers_in.content_length = h; - u->headers_in.content_length_n = ngx_atoof(h->value.data, h->value.len); - - if (u->headers_in.content_length_n == NGX_ERROR) { - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "upstream sent invalid \"Content-Length\" header: " - "\"%V: %V\"", &h->key, &h->value); - return NGX_HTTP_UPSTREAM_INVALID_HEADER; - } - - return NGX_OK; -} - - -static ngx_int_t -ngx_http_upstream_process_last_modified(ngx_http_request_t *r, - ngx_table_elt_t *h, ngx_uint_t offset) -{ - ngx_http_upstream_t *u; - - u = r->upstream; - - if (u->headers_in.last_modified) { - ngx_log_error(NGX_LOG_WARN, r->connection->log, 0, - "upstream sent duplicate header line: \"%V: %V\", " - "previous value: \"%V: %V\", ignored", - &h->key, &h->value, - &u->headers_in.last_modified->key, - &u->headers_in.last_modified->value); - h->hash = 0; - return NGX_OK; - } - - h->next = NULL; - u->headers_in.last_modified = h; - u->headers_in.last_modified_time = ngx_parse_http_time(h->value.data, - h->value.len); - - return NGX_OK; -} - - -static ngx_int_t -ngx_http_upstream_process_set_cookie(ngx_http_request_t *r, ngx_table_elt_t *h, - ngx_uint_t offset) -{ - ngx_table_elt_t **ph; - ngx_http_upstream_t *u; - - u = r->upstream; - ph = &u->headers_in.set_cookie; - - while (*ph) { ph = &(*ph)->next; } - - *ph = h; - h->next = NULL; - -#if (NGX_HTTP_CACHE) - if (!(u->conf->ignore_headers & NGX_HTTP_UPSTREAM_IGN_SET_COOKIE)) { - u->cacheable = 0; - } -#endif - - return NGX_OK; -} - - -static ngx_int_t -ngx_http_upstream_process_cache_control(ngx_http_request_t *r, - ngx_table_elt_t *h, ngx_uint_t offset) -{ - ngx_table_elt_t **ph; - ngx_http_upstream_t *u; - - u = r->upstream; - ph = &u->headers_in.cache_control; - - while (*ph) { ph = &(*ph)->next; } - - *ph = h; - h->next = NULL; - -#if (NGX_HTTP_CACHE) - { - u_char *p, *start, *last; - ngx_int_t n; - - if (u->conf->ignore_headers & NGX_HTTP_UPSTREAM_IGN_CACHE_CONTROL) { - return NGX_OK; - } - - if (r->cache == NULL) { - return NGX_OK; - } - - start = h->value.data; - last = start + h->value.len; - - if (r->cache->valid_sec != 0 && u->headers_in.x_accel_expires != NULL) { - goto extensions; - } - - if (ngx_strlcasestrn(start, last, (u_char *) "no-cache", 8 - 1) != NULL - || ngx_strlcasestrn(start, last, (u_char *) "no-store", 8 - 1) != NULL - || ngx_strlcasestrn(start, last, (u_char *) "private", 7 - 1) != NULL) - { - u->headers_in.no_cache = 1; - return NGX_OK; - } - - p = ngx_strlcasestrn(start, last, (u_char *) "s-maxage=", 9 - 1); - offset = 9; - - if (p == NULL) { - p = ngx_strlcasestrn(start, last, (u_char *) "max-age=", 8 - 1); - offset = 8; - } - - if (p) { - n = ngx_http_upstream_process_delta_seconds(p + offset, last); - - if (n == NGX_ERROR) { - u->cacheable = 0; - return NGX_OK; - } - - if (n == 0) { - u->headers_in.no_cache = 1; - return NGX_OK; - } - - r->cache->valid_sec = ngx_min((ngx_uint_t) ngx_time() + n, - NGX_MAX_INT_T_VALUE); - u->headers_in.expired = 0; - } - -extensions: - - p = ngx_strlcasestrn(start, last, (u_char *) "stale-while-revalidate=", - 23 - 1); - - if (p) { - n = ngx_http_upstream_process_delta_seconds(p + 23, last); - - if (n == NGX_ERROR) { - u->cacheable = 0; - return NGX_OK; - } - - r->cache->updating_sec = n; - r->cache->error_sec = n; - } - - p = ngx_strlcasestrn(start, last, (u_char *) "stale-if-error=", 15 - 1); - - if (p) { - n = ngx_http_upstream_process_delta_seconds(p + 15, last); - - if (n == NGX_ERROR) { - u->cacheable = 0; - return NGX_OK; - } - - r->cache->error_sec = n; - } - } -#endif - - return NGX_OK; -} - - -#if (NGX_HTTP_CACHE) - -static ngx_int_t -ngx_http_upstream_process_delta_seconds(u_char *p, u_char *last) -{ - ngx_int_t n, cutoff, cutlim; - - cutoff = NGX_MAX_INT_T_VALUE / 10; - cutlim = NGX_MAX_INT_T_VALUE % 10; - - n = 0; - - for ( /* void */ ; p < last; p++) { - if (*p == ',' || *p == ';' || *p == ' ') { - break; - } - - if (*p < '0' || *p > '9') { - return NGX_ERROR; - } - - if (n >= cutoff && (n > cutoff || *p - '0' > cutlim)) { - n = NGX_MAX_INT_T_VALUE; - break; - } - - n = n * 10 + (*p - '0'); - } - - return n; -} - -#endif - - -static ngx_int_t -ngx_http_upstream_process_expires(ngx_http_request_t *r, ngx_table_elt_t *h, - ngx_uint_t offset) -{ - ngx_http_upstream_t *u; - - u = r->upstream; - - if (u->headers_in.expires) { - ngx_log_error(NGX_LOG_WARN, r->connection->log, 0, - "upstream sent duplicate header line: \"%V: %V\", " - "previous value: \"%V: %V\", ignored", - &h->key, &h->value, - &u->headers_in.expires->key, - &u->headers_in.expires->value); - h->hash = 0; - return NGX_OK; - } - - u->headers_in.expires = h; - h->next = NULL; - -#if (NGX_HTTP_CACHE) - { - time_t expires; - - if (u->conf->ignore_headers & NGX_HTTP_UPSTREAM_IGN_EXPIRES) { - return NGX_OK; - } - - if (r->cache == NULL) { - return NGX_OK; - } - - if (r->cache->valid_sec != 0) { - return NGX_OK; - } - - expires = ngx_parse_http_time(h->value.data, h->value.len); - - if (expires == NGX_ERROR || expires < ngx_time()) { - u->headers_in.expired = 1; - return NGX_OK; - } - - r->cache->valid_sec = expires; - } -#endif - - return NGX_OK; -} - - -static ngx_int_t -ngx_http_upstream_process_accel_expires(ngx_http_request_t *r, - ngx_table_elt_t *h, ngx_uint_t offset) -{ - ngx_http_upstream_t *u; - - u = r->upstream; - - if (u->headers_in.x_accel_expires) { - ngx_log_error(NGX_LOG_WARN, r->connection->log, 0, - "upstream sent duplicate header line: \"%V: %V\", " - "previous value: \"%V: %V\", ignored", - &h->key, &h->value, - &u->headers_in.x_accel_expires->key, - &u->headers_in.x_accel_expires->value); - h->hash = 0; - return NGX_OK; - } - - u->headers_in.x_accel_expires = h; - h->next = NULL; - -#if (NGX_HTTP_CACHE) - { - u_char *p; - size_t len; - ngx_int_t n; - - if (u->conf->ignore_headers & NGX_HTTP_UPSTREAM_IGN_XA_EXPIRES) { - return NGX_OK; - } - - if (r->cache == NULL) { - return NGX_OK; - } - - len = h->value.len; - p = h->value.data; - - if (p[0] != '@') { - n = ngx_atoi(p, len); - - switch (n) { - case 0: - u->cacheable = 0; - /* fall through */ - - case NGX_ERROR: - return NGX_OK; - - default: - r->cache->valid_sec = ngx_time() + n; - u->headers_in.no_cache = 0; - u->headers_in.expired = 0; - return NGX_OK; - } - } - - p++; - len--; - - n = ngx_atoi(p, len); - - if (n != NGX_ERROR) { - r->cache->valid_sec = n; - u->headers_in.no_cache = 0; - u->headers_in.expired = 0; - } - } -#endif - - return NGX_OK; -} - - -static ngx_int_t -ngx_http_upstream_process_limit_rate(ngx_http_request_t *r, ngx_table_elt_t *h, - ngx_uint_t offset) -{ - ngx_int_t n; - ngx_http_upstream_t *u; - - u = r->upstream; - - if (u->headers_in.x_accel_limit_rate) { - ngx_log_error(NGX_LOG_WARN, r->connection->log, 0, - "upstream sent duplicate header line: \"%V: %V\", " - "previous value: \"%V: %V\", ignored", - &h->key, &h->value, - &u->headers_in.x_accel_limit_rate->key, - &u->headers_in.x_accel_limit_rate->value); - h->hash = 0; - return NGX_OK; - } - - u->headers_in.x_accel_limit_rate = h; - h->next = NULL; - - if (u->conf->ignore_headers & NGX_HTTP_UPSTREAM_IGN_XA_LIMIT_RATE) { - return NGX_OK; - } - - n = ngx_atoi(h->value.data, h->value.len); - - if (n != NGX_ERROR) { - r->limit_rate = (size_t) n; - r->limit_rate_set = 1; - } - - return NGX_OK; -} - - -static ngx_int_t -ngx_http_upstream_process_buffering(ngx_http_request_t *r, ngx_table_elt_t *h, - ngx_uint_t offset) -{ - u_char c0, c1, c2; - ngx_http_upstream_t *u; - - u = r->upstream; - - if (u->conf->ignore_headers & NGX_HTTP_UPSTREAM_IGN_XA_BUFFERING) { - return NGX_OK; - } - - if (u->conf->change_buffering) { - - if (h->value.len == 2) { - c0 = ngx_tolower(h->value.data[0]); - c1 = ngx_tolower(h->value.data[1]); - - if (c0 == 'n' && c1 == 'o') { - u->buffering = 0; - } - - } else if (h->value.len == 3) { - c0 = ngx_tolower(h->value.data[0]); - c1 = ngx_tolower(h->value.data[1]); - c2 = ngx_tolower(h->value.data[2]); - - if (c0 == 'y' && c1 == 'e' && c2 == 's') { - u->buffering = 1; - } - } - } - - return NGX_OK; -} - - -static ngx_int_t -ngx_http_upstream_process_charset(ngx_http_request_t *r, ngx_table_elt_t *h, - ngx_uint_t offset) -{ - ngx_http_upstream_t *u; - - u = r->upstream; - - if (u->conf->ignore_headers & NGX_HTTP_UPSTREAM_IGN_XA_CHARSET) { - return NGX_OK; - } - - r->headers_out.override_charset = &h->value; - - return NGX_OK; -} - - -static ngx_int_t -ngx_http_upstream_process_connection(ngx_http_request_t *r, ngx_table_elt_t *h, - ngx_uint_t offset) -{ - ngx_table_elt_t **ph; - ngx_http_upstream_t *u; - - u = r->upstream; - ph = &u->headers_in.connection; - - while (*ph) { ph = &(*ph)->next; } - - *ph = h; - h->next = NULL; - - if (ngx_strlcasestrn(h->value.data, h->value.data + h->value.len, - (u_char *) "close", 5 - 1) - != NULL) - { - u->headers_in.connection_close = 1; - } - - return NGX_OK; -} - - -static ngx_int_t -ngx_http_upstream_process_transfer_encoding(ngx_http_request_t *r, - ngx_table_elt_t *h, ngx_uint_t offset) -{ - ngx_http_upstream_t *u; - - u = r->upstream; - - if (u->headers_in.transfer_encoding) { - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "upstream sent duplicate header line: \"%V: %V\", " - "previous value: \"%V: %V\"", - &h->key, &h->value, - &u->headers_in.transfer_encoding->key, - &u->headers_in.transfer_encoding->value); - return NGX_HTTP_UPSTREAM_INVALID_HEADER; - } - - if (u->headers_in.content_length) { - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "upstream sent \"Content-Length\" and " - "\"Transfer-Encoding\" headers at the same time"); - return NGX_HTTP_UPSTREAM_INVALID_HEADER; - } - - u->headers_in.transfer_encoding = h; - h->next = NULL; - - if (h->value.len == 7 - && ngx_strncasecmp(h->value.data, (u_char *) "chunked", 7) == 0) - { - u->headers_in.chunked = 1; - - } else { - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "upstream sent unknown \"Transfer-Encoding\": \"%V\"", - &h->value); - return NGX_HTTP_UPSTREAM_INVALID_HEADER; - } - - return NGX_OK; -} - - -static ngx_int_t -ngx_http_upstream_process_vary(ngx_http_request_t *r, - ngx_table_elt_t *h, ngx_uint_t offset) -{ - ngx_table_elt_t **ph; - ngx_http_upstream_t *u; - - u = r->upstream; - ph = &u->headers_in.vary; - - while (*ph) { ph = &(*ph)->next; } - - *ph = h; - h->next = NULL; - -#if (NGX_HTTP_CACHE) - { - u_char *p; - size_t len; - ngx_str_t vary; - - if (u->conf->ignore_headers & NGX_HTTP_UPSTREAM_IGN_VARY) { - return NGX_OK; - } - - if (r->cache == NULL || !u->cacheable) { - return NGX_OK; - } - - if (h->value.len == 1 && h->value.data[0] == '*') { - u->cacheable = 0; - return NGX_OK; - } - - if (u->headers_in.vary->next) { - - len = 0; - - for (h = u->headers_in.vary; h; h = h->next) { - len += h->value.len + 2; - } - - len -= 2; - - p = ngx_pnalloc(r->pool, len); - if (p == NULL) { - return NGX_ERROR; - } - - vary.len = len; - vary.data = p; - - for (h = u->headers_in.vary; h; h = h->next) { - p = ngx_copy(p, h->value.data, h->value.len); - - if (h->next == NULL) { - break; - } - - *p++ = ','; *p++ = ' '; - } - - } else { - vary = h->value; - } - - if (vary.len > NGX_HTTP_CACHE_VARY_LEN) { - u->cacheable = 0; - } - - r->cache->vary = vary; - } -#endif - - return NGX_OK; -} - - -static ngx_int_t -ngx_http_upstream_copy_header_line(ngx_http_request_t *r, ngx_table_elt_t *h, - ngx_uint_t offset) -{ - ngx_table_elt_t *ho, **ph; - - ho = ngx_list_push(&r->headers_out.headers); - if (ho == NULL) { - return NGX_ERROR; - } - - *ho = *h; - - if (offset) { - ph = (ngx_table_elt_t **) ((char *) &r->headers_out + offset); - *ph = ho; - ho->next = NULL; - } - - return NGX_OK; -} - - -static ngx_int_t -ngx_http_upstream_copy_multi_header_lines(ngx_http_request_t *r, - ngx_table_elt_t *h, ngx_uint_t offset) -{ - ngx_table_elt_t *ho, **ph; - - ho = ngx_list_push(&r->headers_out.headers); - if (ho == NULL) { - return NGX_ERROR; - } - - *ho = *h; - - ph = (ngx_table_elt_t **) ((char *) &r->headers_out + offset); - - while (*ph) { ph = &(*ph)->next; } - - *ph = ho; - ho->next = NULL; - - return NGX_OK; -} - - -static ngx_int_t -ngx_http_upstream_copy_content_type(ngx_http_request_t *r, ngx_table_elt_t *h, - ngx_uint_t offset) -{ - u_char *p, *last; - - r->headers_out.content_type_len = h->value.len; - r->headers_out.content_type = h->value; - r->headers_out.content_type_lowcase = NULL; - - for (p = h->value.data; *p; p++) { - - if (*p != ';') { - continue; - } - - last = p; - - while (*++p == ' ') { /* void */ } - - if (*p == '\0') { - return NGX_OK; - } - - if (ngx_strncasecmp(p, (u_char *) "charset=", 8) != 0) { - continue; - } - - p += 8; - - r->headers_out.content_type_len = last - h->value.data; - - if (*p == '"') { - p++; - } - - last = h->value.data + h->value.len; - - if (last > p && *(last - 1) == '"') { - last--; - } - - r->headers_out.charset.len = last - p; - r->headers_out.charset.data = p; - - return NGX_OK; - } - - return NGX_OK; -} - - -static ngx_int_t -ngx_http_upstream_copy_last_modified(ngx_http_request_t *r, ngx_table_elt_t *h, - ngx_uint_t offset) -{ - ngx_table_elt_t *ho; - - ho = ngx_list_push(&r->headers_out.headers); - if (ho == NULL) { - return NGX_ERROR; - } - - *ho = *h; - ho->next = NULL; - - r->headers_out.last_modified = ho; - r->headers_out.last_modified_time = - r->upstream->headers_in.last_modified_time; - - return NGX_OK; -} - - -static ngx_int_t -ngx_http_upstream_rewrite_location(ngx_http_request_t *r, ngx_table_elt_t *h, - ngx_uint_t offset) -{ - ngx_int_t rc; - ngx_table_elt_t *ho; - - ho = ngx_list_push(&r->headers_out.headers); - if (ho == NULL) { - return NGX_ERROR; - } - - *ho = *h; - ho->next = NULL; - - if (r->upstream->rewrite_redirect) { - rc = r->upstream->rewrite_redirect(r, ho, 0); - - if (rc == NGX_DECLINED) { - return NGX_OK; - } - - if (rc == NGX_OK) { - r->headers_out.location = ho; - - ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "rewritten location: \"%V\"", &ho->value); - } - - return rc; - } - - if (ho->value.data[0] != '/') { - r->headers_out.location = ho; - } - - /* - * we do not set r->headers_out.location here to avoid handling - * relative redirects in ngx_http_header_filter() - */ - - return NGX_OK; -} - - -static ngx_int_t -ngx_http_upstream_rewrite_refresh(ngx_http_request_t *r, ngx_table_elt_t *h, - ngx_uint_t offset) -{ - u_char *p; - ngx_int_t rc; - ngx_table_elt_t *ho; - - ho = ngx_list_push(&r->headers_out.headers); - if (ho == NULL) { - return NGX_ERROR; - } - - *ho = *h; - ho->next = NULL; - - if (r->upstream->rewrite_redirect) { - - p = ngx_strcasestrn(ho->value.data, "url=", 4 - 1); - - if (p) { - rc = r->upstream->rewrite_redirect(r, ho, p + 4 - ho->value.data); - - } else { - return NGX_OK; - } - - if (rc == NGX_DECLINED) { - return NGX_OK; - } - - if (rc == NGX_OK) { - r->headers_out.refresh = ho; - - ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "rewritten refresh: \"%V\"", &ho->value); - } - - return rc; - } - - r->headers_out.refresh = ho; - - return NGX_OK; -} - - -static ngx_int_t -ngx_http_upstream_rewrite_set_cookie(ngx_http_request_t *r, ngx_table_elt_t *h, - ngx_uint_t offset) -{ - ngx_int_t rc; - ngx_table_elt_t *ho; - - ho = ngx_list_push(&r->headers_out.headers); - if (ho == NULL) { - return NGX_ERROR; - } - - *ho = *h; - ho->next = NULL; - - if (r->upstream->rewrite_cookie) { - rc = r->upstream->rewrite_cookie(r, ho); - - if (rc == NGX_DECLINED) { - return NGX_OK; - } - -#if (NGX_DEBUG) - if (rc == NGX_OK) { - ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "rewritten cookie: \"%V\"", &ho->value); - } -#endif - - return rc; - } - - return NGX_OK; -} - - -static ngx_int_t -ngx_http_upstream_copy_allow_ranges(ngx_http_request_t *r, - ngx_table_elt_t *h, ngx_uint_t offset) -{ - ngx_table_elt_t *ho; - - if (r->upstream->conf->force_ranges) { - return NGX_OK; - } - -#if (NGX_HTTP_CACHE) - - if (r->cached) { - r->allow_ranges = 1; - return NGX_OK; - } - - if (r->upstream->cacheable) { - r->allow_ranges = 1; - r->single_range = 1; - return NGX_OK; - } - -#endif - - ho = ngx_list_push(&r->headers_out.headers); - if (ho == NULL) { - return NGX_ERROR; - } - - *ho = *h; - ho->next = NULL; - - r->headers_out.accept_ranges = ho; - - return NGX_OK; -} - - -static ngx_int_t -ngx_http_upstream_add_variables(ngx_conf_t *cf) -{ - ngx_http_variable_t *var, *v; - - for (v = ngx_http_upstream_vars; v->name.len; v++) { - var = ngx_http_add_variable(cf, &v->name, v->flags); - if (var == NULL) { - return NGX_ERROR; - } - - var->get_handler = v->get_handler; - var->data = v->data; - } - - return NGX_OK; -} - - -static ngx_int_t -ngx_http_upstream_addr_variable(ngx_http_request_t *r, - ngx_http_variable_value_t *v, uintptr_t data) -{ - u_char *p; - size_t len; - ngx_uint_t i; - ngx_http_upstream_state_t *state; - - v->valid = 1; - v->no_cacheable = 0; - v->not_found = 0; - - if (r->upstream_states == NULL || r->upstream_states->nelts == 0) { - v->not_found = 1; - return NGX_OK; - } - - len = 0; - state = r->upstream_states->elts; - - for (i = 0; i < r->upstream_states->nelts; i++) { - if (state[i].peer) { - len += state[i].peer->len + 2; - - } else { - len += 3; - } - } - - p = ngx_pnalloc(r->pool, len); - if (p == NULL) { - return NGX_ERROR; - } - - v->data = p; - - i = 0; - - for ( ;; ) { - if (state[i].peer) { - p = ngx_cpymem(p, state[i].peer->data, state[i].peer->len); - } - - if (++i == r->upstream_states->nelts) { - break; - } - - if (state[i].peer) { - *p++ = ','; - *p++ = ' '; - - } else { - *p++ = ' '; - *p++ = ':'; - *p++ = ' '; - - if (++i == r->upstream_states->nelts) { - break; - } - - continue; - } - } - - v->len = p - v->data; - - return NGX_OK; -} - - -static ngx_int_t -ngx_http_upstream_status_variable(ngx_http_request_t *r, - ngx_http_variable_value_t *v, uintptr_t data) -{ - u_char *p; - size_t len; - ngx_uint_t i; - ngx_http_upstream_state_t *state; - - v->valid = 1; - v->no_cacheable = 0; - v->not_found = 0; - - if (r->upstream_states == NULL || r->upstream_states->nelts == 0) { - v->not_found = 1; - return NGX_OK; - } - - len = r->upstream_states->nelts * (3 + 2); - - p = ngx_pnalloc(r->pool, len); - if (p == NULL) { - return NGX_ERROR; - } - - v->data = p; - - i = 0; - state = r->upstream_states->elts; - - for ( ;; ) { - if (state[i].status) { - p = ngx_sprintf(p, "%ui", state[i].status); - - } else { - *p++ = '-'; - } - - if (++i == r->upstream_states->nelts) { - break; - } - - if (state[i].peer) { - *p++ = ','; - *p++ = ' '; - - } else { - *p++ = ' '; - *p++ = ':'; - *p++ = ' '; - - if (++i == r->upstream_states->nelts) { - break; - } - - continue; - } - } - - v->len = p - v->data; - - return NGX_OK; -} - - -static ngx_int_t -ngx_http_upstream_response_time_variable(ngx_http_request_t *r, - ngx_http_variable_value_t *v, uintptr_t data) -{ - u_char *p; - size_t len; - ngx_uint_t i; - ngx_msec_int_t ms; - ngx_http_upstream_state_t *state; - - v->valid = 1; - v->no_cacheable = 0; - v->not_found = 0; - - if (r->upstream_states == NULL || r->upstream_states->nelts == 0) { - v->not_found = 1; - return NGX_OK; - } - - len = r->upstream_states->nelts * (NGX_TIME_T_LEN + 4 + 2); - - p = ngx_pnalloc(r->pool, len); - if (p == NULL) { - return NGX_ERROR; - } - - v->data = p; - - i = 0; - state = r->upstream_states->elts; - - for ( ;; ) { - - if (data == 1) { - ms = state[i].header_time; - - } else if (data == 2) { - ms = state[i].connect_time; - - } else { - ms = state[i].response_time; - } - - if (ms != -1) { - ms = ngx_max(ms, 0); - p = ngx_sprintf(p, "%T.%03M", (time_t) ms / 1000, ms % 1000); - - } else { - *p++ = '-'; - } - - if (++i == r->upstream_states->nelts) { - break; - } - - if (state[i].peer) { - *p++ = ','; - *p++ = ' '; - - } else { - *p++ = ' '; - *p++ = ':'; - *p++ = ' '; - - if (++i == r->upstream_states->nelts) { - break; - } - - continue; - } - } - - v->len = p - v->data; - - return NGX_OK; -} - - -static ngx_int_t -ngx_http_upstream_response_length_variable(ngx_http_request_t *r, - ngx_http_variable_value_t *v, uintptr_t data) -{ - u_char *p; - size_t len; - ngx_uint_t i; - ngx_http_upstream_state_t *state; - - v->valid = 1; - v->no_cacheable = 0; - v->not_found = 0; - - if (r->upstream_states == NULL || r->upstream_states->nelts == 0) { - v->not_found = 1; - return NGX_OK; - } - - len = r->upstream_states->nelts * (NGX_OFF_T_LEN + 2); - - p = ngx_pnalloc(r->pool, len); - if (p == NULL) { - return NGX_ERROR; - } - - v->data = p; - - i = 0; - state = r->upstream_states->elts; - - for ( ;; ) { - - if (data == 1) { - p = ngx_sprintf(p, "%O", state[i].bytes_received); - - } else if (data == 2) { - p = ngx_sprintf(p, "%O", state[i].bytes_sent); - - } else { - p = ngx_sprintf(p, "%O", state[i].response_length); - } - - if (++i == r->upstream_states->nelts) { - break; - } - - if (state[i].peer) { - *p++ = ','; - *p++ = ' '; - - } else { - *p++ = ' '; - *p++ = ':'; - *p++ = ' '; - - if (++i == r->upstream_states->nelts) { - break; - } - - continue; - } - } - - v->len = p - v->data; - - return NGX_OK; -} - - -static ngx_int_t -ngx_http_upstream_header_variable(ngx_http_request_t *r, - ngx_http_variable_value_t *v, uintptr_t data) -{ - if (r->upstream == NULL) { - v->not_found = 1; - return NGX_OK; - } - - return ngx_http_variable_unknown_header(r, v, (ngx_str_t *) data, - &r->upstream->headers_in.headers.part, - sizeof("upstream_http_") - 1); -} - - -static ngx_int_t -ngx_http_upstream_trailer_variable(ngx_http_request_t *r, - ngx_http_variable_value_t *v, uintptr_t data) -{ - if (r->upstream == NULL) { - v->not_found = 1; - return NGX_OK; - } - - return ngx_http_variable_unknown_header(r, v, (ngx_str_t *) data, - &r->upstream->headers_in.trailers.part, - sizeof("upstream_trailer_") - 1); -} - - -static ngx_int_t -ngx_http_upstream_cookie_variable(ngx_http_request_t *r, - ngx_http_variable_value_t *v, uintptr_t data) -{ - ngx_str_t *name = (ngx_str_t *) data; - - ngx_str_t cookie, s; - - if (r->upstream == NULL) { - v->not_found = 1; - return NGX_OK; - } - - s.len = name->len - (sizeof("upstream_cookie_") - 1); - s.data = name->data + sizeof("upstream_cookie_") - 1; - - if (ngx_http_parse_set_cookie_lines(r, r->upstream->headers_in.set_cookie, - &s, &cookie) - == NULL) - { - v->not_found = 1; - return NGX_OK; - } - - v->len = cookie.len; - v->valid = 1; - v->no_cacheable = 0; - v->not_found = 0; - v->data = cookie.data; - - return NGX_OK; -} - - -#if (NGX_HTTP_CACHE) - -static ngx_int_t -ngx_http_upstream_cache_status(ngx_http_request_t *r, - ngx_http_variable_value_t *v, uintptr_t data) -{ - ngx_uint_t n; - - if (r->upstream == NULL || r->upstream->cache_status == 0) { - v->not_found = 1; - return NGX_OK; - } - - n = r->upstream->cache_status - 1; - - v->valid = 1; - v->no_cacheable = 0; - v->not_found = 0; - v->len = ngx_http_cache_status[n].len; - v->data = ngx_http_cache_status[n].data; - - return NGX_OK; -} - - -static ngx_int_t -ngx_http_upstream_cache_last_modified(ngx_http_request_t *r, - ngx_http_variable_value_t *v, uintptr_t data) -{ - u_char *p; - - if (r->upstream == NULL - || !r->upstream->conf->cache_revalidate - || r->upstream->cache_status != NGX_HTTP_CACHE_EXPIRED - || r->cache->last_modified == -1) - { - v->not_found = 1; - return NGX_OK; - } - - p = ngx_pnalloc(r->pool, sizeof("Mon, 28 Sep 1970 06:00:00 GMT") - 1); - if (p == NULL) { - return NGX_ERROR; - } - - v->len = ngx_http_time(p, r->cache->last_modified) - p; - v->valid = 1; - v->no_cacheable = 0; - v->not_found = 0; - v->data = p; - - return NGX_OK; -} - - -static ngx_int_t -ngx_http_upstream_cache_etag(ngx_http_request_t *r, - ngx_http_variable_value_t *v, uintptr_t data) -{ - if (r->upstream == NULL - || !r->upstream->conf->cache_revalidate - || r->upstream->cache_status != NGX_HTTP_CACHE_EXPIRED - || r->cache->etag.len == 0) - { - v->not_found = 1; - return NGX_OK; - } - - v->valid = 1; - v->no_cacheable = 0; - v->not_found = 0; - v->len = r->cache->etag.len; - v->data = r->cache->etag.data; - - return NGX_OK; -} - -#endif - - -static char * -ngx_http_upstream(ngx_conf_t *cf, ngx_command_t *cmd, void *dummy) -{ - char *rv; - void *mconf; - ngx_str_t *value; - ngx_url_t u; - ngx_uint_t m; - ngx_conf_t pcf; - ngx_http_module_t *module; - ngx_http_conf_ctx_t *ctx, *http_ctx; - ngx_http_upstream_srv_conf_t *uscf; - - ngx_memzero(&u, sizeof(ngx_url_t)); - - value = cf->args->elts; - u.host = value[1]; - u.no_resolve = 1; - u.no_port = 1; - - uscf = ngx_http_upstream_add(cf, &u, NGX_HTTP_UPSTREAM_CREATE - |NGX_HTTP_UPSTREAM_MODIFY - |NGX_HTTP_UPSTREAM_WEIGHT - |NGX_HTTP_UPSTREAM_MAX_CONNS - |NGX_HTTP_UPSTREAM_MAX_FAILS - |NGX_HTTP_UPSTREAM_FAIL_TIMEOUT - |NGX_HTTP_UPSTREAM_DOWN - |NGX_HTTP_UPSTREAM_BACKUP); - if (uscf == NULL) { - return NGX_CONF_ERROR; - } - - - ctx = ngx_pcalloc(cf->pool, sizeof(ngx_http_conf_ctx_t)); - if (ctx == NULL) { - return NGX_CONF_ERROR; - } - - http_ctx = cf->ctx; - ctx->main_conf = http_ctx->main_conf; - - /* the upstream{}'s srv_conf */ - - ctx->srv_conf = ngx_pcalloc(cf->pool, sizeof(void *) * ngx_http_max_module); - if (ctx->srv_conf == NULL) { - return NGX_CONF_ERROR; - } - - ctx->srv_conf[ngx_http_upstream_module.ctx_index] = uscf; - - uscf->srv_conf = ctx->srv_conf; - - - /* the upstream{}'s loc_conf */ - - ctx->loc_conf = ngx_pcalloc(cf->pool, sizeof(void *) * ngx_http_max_module); - if (ctx->loc_conf == NULL) { - return NGX_CONF_ERROR; - } - - for (m = 0; cf->cycle->modules[m]; m++) { - if (cf->cycle->modules[m]->type != NGX_HTTP_MODULE) { - continue; - } - - module = cf->cycle->modules[m]->ctx; - - if (module->create_srv_conf) { - mconf = module->create_srv_conf(cf); - if (mconf == NULL) { - return NGX_CONF_ERROR; - } - - ctx->srv_conf[cf->cycle->modules[m]->ctx_index] = mconf; - } - - if (module->create_loc_conf) { - mconf = module->create_loc_conf(cf); - if (mconf == NULL) { - return NGX_CONF_ERROR; - } - - ctx->loc_conf[cf->cycle->modules[m]->ctx_index] = mconf; - } - } - - uscf->servers = ngx_array_create(cf->pool, 4, - sizeof(ngx_http_upstream_server_t)); - if (uscf->servers == NULL) { - return NGX_CONF_ERROR; - } - - - /* parse inside upstream{} */ - - pcf = *cf; - cf->ctx = ctx; - cf->cmd_type = NGX_HTTP_UPS_CONF; - - rv = ngx_conf_parse(cf, NULL); - - *cf = pcf; - - if (rv != NGX_CONF_OK) { - return rv; - } - - if (uscf->servers->nelts == 0) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "no servers are inside upstream"); - return NGX_CONF_ERROR; - } - - return rv; -} - - -static char * -ngx_http_upstream_server(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) -{ - ngx_http_upstream_srv_conf_t *uscf = conf; - - time_t fail_timeout; - ngx_str_t *value, s; - ngx_url_t u; - ngx_int_t weight, max_conns, max_fails; - ngx_uint_t i; -#if (NGX_HTTP_UPSTREAM_ZONE) - ngx_uint_t resolve; -#endif - ngx_http_upstream_server_t *us; - - us = ngx_array_push(uscf->servers); - if (us == NULL) { - return NGX_CONF_ERROR; - } - - ngx_memzero(us, sizeof(ngx_http_upstream_server_t)); - - value = cf->args->elts; - - weight = 1; - max_conns = 0; - max_fails = 1; - fail_timeout = 10; -#if (NGX_HTTP_UPSTREAM_ZONE) - resolve = 0; -#endif - - for (i = 2; i < cf->args->nelts; i++) { - - if (ngx_strncmp(value[i].data, "weight=", 7) == 0) { - - if (!(uscf->flags & NGX_HTTP_UPSTREAM_WEIGHT)) { - goto not_supported; - } - - weight = ngx_atoi(&value[i].data[7], value[i].len - 7); - - if (weight == NGX_ERROR || weight == 0) { - goto invalid; - } - - continue; - } - - if (ngx_strncmp(value[i].data, "max_conns=", 10) == 0) { - - if (!(uscf->flags & NGX_HTTP_UPSTREAM_MAX_CONNS)) { - goto not_supported; - } - - max_conns = ngx_atoi(&value[i].data[10], value[i].len - 10); - - if (max_conns == NGX_ERROR) { - goto invalid; - } - - continue; - } - - if (ngx_strncmp(value[i].data, "max_fails=", 10) == 0) { - - if (!(uscf->flags & NGX_HTTP_UPSTREAM_MAX_FAILS)) { - goto not_supported; - } - - max_fails = ngx_atoi(&value[i].data[10], value[i].len - 10); - - if (max_fails == NGX_ERROR) { - goto invalid; - } - - continue; - } - - if (ngx_strncmp(value[i].data, "fail_timeout=", 13) == 0) { - - if (!(uscf->flags & NGX_HTTP_UPSTREAM_FAIL_TIMEOUT)) { - goto not_supported; - } - - s.len = value[i].len - 13; - s.data = &value[i].data[13]; - - fail_timeout = ngx_parse_time(&s, 1); - - if (fail_timeout == (time_t) NGX_ERROR) { - goto invalid; - } - - continue; - } - - if (ngx_strcmp(value[i].data, "backup") == 0) { - - if (!(uscf->flags & NGX_HTTP_UPSTREAM_BACKUP)) { - goto not_supported; - } - - us->backup = 1; - - continue; - } - - if (ngx_strcmp(value[i].data, "down") == 0) { - - if (!(uscf->flags & NGX_HTTP_UPSTREAM_DOWN)) { - goto not_supported; - } - - us->down = NGX_HTTP_UPSTREAM_FAILED; - - continue; - } - -#if (NGX_HTTP_UPSTREAM_STICKY) - if (ngx_strcmp(value[i].data, "drain") == 0) { - - if (!(uscf->flags & NGX_HTTP_UPSTREAM_DOWN)) { - goto not_supported; - } - - us->down = NGX_HTTP_UPSTREAM_DRAINING; - - continue; - } -#endif - -#if (NGX_HTTP_UPSTREAM_SID) - if (ngx_strncmp(value[i].data, "route=", 6) == 0) { - - us->sid.data = &value[i].data[6]; - us->sid.len = value[i].len - 6; - - if (us->sid.len == 0) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, "route is empty"); - return NGX_CONF_ERROR; - } - - if (us->sid.len > NGX_HTTP_UPSTREAM_SID_LEN) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "route is longer than %d", - NGX_HTTP_UPSTREAM_SID_LEN); - return NGX_CONF_ERROR; - } - - continue; - } -#endif - -#if (NGX_HTTP_UPSTREAM_ZONE) - if (ngx_strcmp(value[i].data, "resolve") == 0) { - resolve = 1; - continue; - } - - if (ngx_strncmp(value[i].data, "service=", 8) == 0) { - - us->service.len = value[i].len - 8; - us->service.data = &value[i].data[8]; - - if (us->service.len == 0) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, "service is empty"); - return NGX_CONF_ERROR; - } - - continue; - } -#endif - - goto invalid; - } - - ngx_memzero(&u, sizeof(ngx_url_t)); - - u.url = value[1]; - u.default_port = 80; - -#if (NGX_HTTP_UPSTREAM_ZONE) - if (resolve) { - /* resolve at run time */ - u.no_resolve = 1; - } - - if (us->service.len && !resolve) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "service upstream \"%V\" requires " - "\"resolve\" parameter", - &u.url); - return NGX_CONF_ERROR; - } - -#endif - - if (ngx_parse_url(cf->pool, &u) != NGX_OK) { - if (u.err) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "%s in upstream \"%V\"", u.err, &u.url); - } - - return NGX_CONF_ERROR; - } - - us->name = u.url; - -#if (NGX_HTTP_UPSTREAM_ZONE) - - if (us->service.len && !u.no_port) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "service upstream \"%V\" may not have port", - &us->name); - - return NGX_CONF_ERROR; - } - - if (us->service.len && u.naddrs) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "service upstream \"%V\" requires domain name", - &us->name); - - return NGX_CONF_ERROR; - } - - if (resolve && u.naddrs == 0) { - ngx_addr_t *addr; - - /* save port */ - - addr = ngx_pcalloc(cf->pool, sizeof(ngx_addr_t)); - if (addr == NULL) { - return NGX_CONF_ERROR; - } - - addr->sockaddr = ngx_palloc(cf->pool, u.socklen); - if (addr->sockaddr == NULL) { - return NGX_CONF_ERROR; - } - - ngx_memcpy(addr->sockaddr, &u.sockaddr, u.socklen); - - addr->socklen = u.socklen; - - us->addrs = addr; - us->naddrs = 1; - - us->host = u.host; - - } else { - us->addrs = u.addrs; - us->naddrs = u.naddrs; - } - -#else - - us->addrs = u.addrs; - us->naddrs = u.naddrs; - -#endif - - us->weight = weight; - us->max_conns = max_conns; - us->max_fails = max_fails; - us->fail_timeout = fail_timeout; - - return NGX_CONF_OK; - -invalid: - - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "invalid parameter \"%V\"", &value[i]); - - return NGX_CONF_ERROR; - -not_supported: - - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "balancing method does not support parameter \"%V\"", - &value[i]); - - return NGX_CONF_ERROR; -} - - -#if (NGX_HTTP_UPSTREAM_ZONE) - -static char * -ngx_http_upstream_resolver(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) -{ - ngx_http_upstream_srv_conf_t *uscf = conf; - - ngx_str_t *value; - - if (uscf->resolver) { - return "is duplicate"; - } - - value = cf->args->elts; - - uscf->resolver = ngx_resolver_create(cf, &value[1], cf->args->nelts - 1); - if (uscf->resolver == NULL) { - return NGX_CONF_ERROR; - } - - return NGX_CONF_OK; -} - -#endif - - -ngx_http_upstream_srv_conf_t * -ngx_http_upstream_add(ngx_conf_t *cf, ngx_url_t *u, ngx_uint_t flags) -{ - ngx_uint_t i; - ngx_http_upstream_server_t *us; - ngx_http_upstream_srv_conf_t *uscf, **uscfp; - ngx_http_upstream_main_conf_t *umcf; - - if (!(flags & NGX_HTTP_UPSTREAM_CREATE)) { - - if (ngx_parse_url(cf->pool, u) != NGX_OK) { - if (u->err) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "%s in upstream \"%V\"", u->err, &u->url); - } - - return NULL; - } - } - - umcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_upstream_module); - - uscfp = umcf->upstreams.elts; - - for (i = 0; i < umcf->upstreams.nelts; i++) { - - if (uscfp[i]->host.len != u->host.len - || ngx_strncasecmp(uscfp[i]->host.data, u->host.data, u->host.len) - != 0) - { - continue; - } - - if ((flags & NGX_HTTP_UPSTREAM_CREATE) - && (uscfp[i]->flags & NGX_HTTP_UPSTREAM_CREATE)) - { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "duplicate upstream \"%V\"", &u->host); - return NULL; - } - - if ((uscfp[i]->flags & NGX_HTTP_UPSTREAM_CREATE) && !u->no_port) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "upstream \"%V\" may not have port %d", - &u->host, u->port); - return NULL; - } - - if ((flags & NGX_HTTP_UPSTREAM_CREATE) && !uscfp[i]->no_port) { - ngx_log_error(NGX_LOG_EMERG, cf->log, 0, - "upstream \"%V\" may not have port %d in %s:%ui", - &u->host, uscfp[i]->port, - uscfp[i]->file_name, uscfp[i]->line); - return NULL; - } - - if (uscfp[i]->port && u->port - && uscfp[i]->port != u->port) - { - continue; - } - - if (flags & NGX_HTTP_UPSTREAM_CREATE) { - uscfp[i]->flags = flags; - uscfp[i]->port = 0; - } - - return uscfp[i]; - } - - uscf = ngx_pcalloc(cf->pool, sizeof(ngx_http_upstream_srv_conf_t)); - if (uscf == NULL) { - return NULL; - } - - uscf->flags = flags; - uscf->host = u->host; - uscf->file_name = cf->conf_file->file.name.data; - uscf->line = cf->conf_file->line; - uscf->port = u->port; - uscf->no_port = u->no_port; -#if (NGX_HTTP_UPSTREAM_ZONE) - uscf->resolver_timeout = NGX_CONF_UNSET_MSEC; -#endif - - if (u->naddrs == 1 && (u->port || u->family == AF_UNIX)) { - uscf->servers = ngx_array_create(cf->pool, 1, - sizeof(ngx_http_upstream_server_t)); - if (uscf->servers == NULL) { - return NULL; - } - - us = ngx_array_push(uscf->servers); - if (us == NULL) { - return NULL; - } - - ngx_memzero(us, sizeof(ngx_http_upstream_server_t)); - - us->addrs = u->addrs; - us->naddrs = 1; - } - - uscfp = ngx_array_push(&umcf->upstreams); - if (uscfp == NULL) { - return NULL; - } - - *uscfp = uscf; - - return uscf; -} - - -char * -ngx_http_upstream_bind_set_slot(ngx_conf_t *cf, ngx_command_t *cmd, - void *conf) -{ - char *p = conf; - - ngx_int_t rc; - ngx_str_t *value; - ngx_http_complex_value_t cv; - ngx_http_upstream_local_t **plocal, *local; - ngx_http_compile_complex_value_t ccv; - - plocal = (ngx_http_upstream_local_t **) (p + cmd->offset); - - if (*plocal != NGX_CONF_UNSET_PTR) { - return "is duplicate"; - } - - value = cf->args->elts; - - if (cf->args->nelts == 2 && ngx_strcmp(value[1].data, "off") == 0) { - *plocal = NULL; - return NGX_CONF_OK; - } - - ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t)); - - ccv.cf = cf; - ccv.value = &value[1]; - ccv.complex_value = &cv; - - if (ngx_http_compile_complex_value(&ccv) != NGX_OK) { - return NGX_CONF_ERROR; - } - - local = ngx_pcalloc(cf->pool, sizeof(ngx_http_upstream_local_t)); - if (local == NULL) { - return NGX_CONF_ERROR; - } - - *plocal = local; - - if (cv.lengths) { - local->value = ngx_palloc(cf->pool, sizeof(ngx_http_complex_value_t)); - if (local->value == NULL) { - return NGX_CONF_ERROR; - } - - *local->value = cv; - - } else { - local->addr = ngx_palloc(cf->pool, sizeof(ngx_addr_t)); - if (local->addr == NULL) { - return NGX_CONF_ERROR; - } - - rc = ngx_parse_addr_port(cf->pool, local->addr, value[1].data, - value[1].len); - - switch (rc) { - case NGX_OK: - local->addr->name = value[1]; - break; - - case NGX_DECLINED: - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "invalid address \"%V\"", &value[1]); - /* fall through */ - - default: - return NGX_CONF_ERROR; - } - } - - if (cf->args->nelts > 2) { - if (ngx_strcmp(value[2].data, "transparent") == 0) { -#if (NGX_HAVE_TRANSPARENT_PROXY) - ngx_core_conf_t *ccf; - - ccf = (ngx_core_conf_t *) ngx_get_conf(cf->cycle->conf_ctx, - ngx_core_module); - - ccf->transparent = 1; - local->transparent = 1; -#else - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "transparent proxying is not supported " - "on this platform, ignored"); -#endif - } else { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "invalid parameter \"%V\"", &value[2]); - return NGX_CONF_ERROR; - } - } - - return NGX_CONF_OK; -} - - -static ngx_int_t -ngx_http_upstream_set_local(ngx_http_request_t *r, ngx_http_upstream_t *u, - ngx_http_upstream_local_t *local) -{ - ngx_int_t rc; - ngx_str_t val; - ngx_addr_t *addr; - - if (local == NULL) { - u->peer.local = NULL; - return NGX_OK; - } - -#if (NGX_HAVE_TRANSPARENT_PROXY) - u->peer.transparent = local->transparent; -#endif - - if (local->value == NULL) { - u->peer.local = local->addr; - return NGX_OK; - } - - if (ngx_http_complex_value(r, local->value, &val) != NGX_OK) { - return NGX_ERROR; - } - - if (val.len == 0) { - u->peer.local = NULL; - return NGX_OK; - } - - addr = ngx_palloc(r->pool, sizeof(ngx_addr_t)); - if (addr == NULL) { - return NGX_ERROR; - } - - rc = ngx_parse_addr_port(r->pool, addr, val.data, val.len); - if (rc == NGX_ERROR) { - return NGX_ERROR; - } - - if (rc != NGX_OK) { - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "invalid local address \"%V\"", &val); - u->peer.local = NULL; - return NGX_OK; - } - - addr->name = val; - u->peer.local = addr; - - return NGX_OK; -} - - -char * -ngx_http_upstream_param_set_slot(ngx_conf_t *cf, ngx_command_t *cmd, - void *conf) -{ - char *p = conf; - - ngx_str_t *value; - ngx_array_t **a; - ngx_http_upstream_param_t *param; - - a = (ngx_array_t **) (p + cmd->offset); - - if (*a == NULL) { - *a = ngx_array_create(cf->pool, 4, sizeof(ngx_http_upstream_param_t)); - if (*a == NULL) { - return NGX_CONF_ERROR; - } - } - - param = ngx_array_push(*a); - if (param == NULL) { - return NGX_CONF_ERROR; - } - - value = cf->args->elts; - - param->key = value[1]; - param->value = value[2]; - param->skip_empty = 0; - - if (cf->args->nelts == 4) { - if (ngx_strcmp(value[3].data, "if_not_empty") != 0) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "invalid parameter \"%V\"", &value[3]); - return NGX_CONF_ERROR; - } - - param->skip_empty = 1; - } - - return NGX_CONF_OK; -} - - -ngx_int_t -ngx_http_upstream_hide_headers_hash(ngx_conf_t *cf, - ngx_http_upstream_conf_t *conf, ngx_http_upstream_conf_t *prev, - ngx_str_t *default_hide_headers, ngx_hash_init_t *hash) -{ - ngx_str_t *h; - ngx_uint_t i, j; - ngx_array_t hide_headers; - ngx_hash_key_t *hk; - - if (conf->hide_headers == NGX_CONF_UNSET_PTR - && conf->pass_headers == NGX_CONF_UNSET_PTR) - { - conf->hide_headers = prev->hide_headers; - conf->pass_headers = prev->pass_headers; - - conf->hide_headers_hash = prev->hide_headers_hash; - - if (conf->hide_headers_hash.buckets) { - return NGX_OK; - } - - } else { - if (conf->hide_headers == NGX_CONF_UNSET_PTR) { - conf->hide_headers = prev->hide_headers; - } - - if (conf->pass_headers == NGX_CONF_UNSET_PTR) { - conf->pass_headers = prev->pass_headers; - } - } - - if (ngx_array_init(&hide_headers, cf->temp_pool, 4, sizeof(ngx_hash_key_t)) - != NGX_OK) - { - return NGX_ERROR; - } - - for (h = default_hide_headers; h->len; h++) { - hk = ngx_array_push(&hide_headers); - if (hk == NULL) { - return NGX_ERROR; - } - - hk->key = *h; - hk->key_hash = ngx_hash_key_lc(h->data, h->len); - hk->value = (void *) 1; - } - - if (conf->hide_headers != NGX_CONF_UNSET_PTR) { - - h = conf->hide_headers->elts; - - for (i = 0; i < conf->hide_headers->nelts; i++) { - - hk = hide_headers.elts; - - for (j = 0; j < hide_headers.nelts; j++) { - if (ngx_strcasecmp(h[i].data, hk[j].key.data) == 0) { - goto exist; - } - } - - hk = ngx_array_push(&hide_headers); - if (hk == NULL) { - return NGX_ERROR; - } - - hk->key = h[i]; - hk->key_hash = ngx_hash_key_lc(h[i].data, h[i].len); - hk->value = (void *) 1; - - exist: - - continue; - } - } - - if (conf->pass_headers != NGX_CONF_UNSET_PTR) { - - h = conf->pass_headers->elts; - hk = hide_headers.elts; - - for (i = 0; i < conf->pass_headers->nelts; i++) { - for (j = 0; j < hide_headers.nelts; j++) { - - if (hk[j].key.data == NULL) { - continue; - } - - if (ngx_strcasecmp(h[i].data, hk[j].key.data) == 0) { - hk[j].key.data = NULL; - break; - } - } - } - } - - hash->hash = &conf->hide_headers_hash; - hash->key = ngx_hash_key_lc; - hash->pool = cf->pool; - hash->temp_pool = NULL; - - if (ngx_hash_init(hash, hide_headers.elts, hide_headers.nelts) != NGX_OK) { - return NGX_ERROR; - } - - /* - * special handling to preserve conf->hide_headers_hash - * in the "http" section to inherit it to all servers - */ - - if (prev->hide_headers_hash.buckets == NULL - && conf->hide_headers == prev->hide_headers - && conf->pass_headers == prev->pass_headers) - { - prev->hide_headers_hash = conf->hide_headers_hash; - } - - return NGX_OK; -} - - -#if (NGX_HTTP_SSL) - -ngx_int_t -ngx_http_upstream_merge_ssl_passwords(ngx_conf_t *cf, - ngx_http_upstream_conf_t *conf, ngx_http_upstream_conf_t *prev) -{ - ngx_uint_t preserve; - - ngx_conf_merge_ptr_value(conf->ssl_passwords, prev->ssl_passwords, NULL); - - if (conf->ssl_certificate == NULL - || conf->ssl_certificate->value.len == 0 - || conf->ssl_certificate_key == NULL) - { - return NGX_OK; - } - - if (conf->ssl_certificate->lengths == NULL - && conf->ssl_certificate_key->lengths == NULL) - { - if (conf->ssl_passwords && conf->ssl_passwords->pool == NULL) { - /* un-preserve empty password list */ - conf->ssl_passwords = NULL; - } - - return NGX_OK; - } - - if (conf->ssl_passwords && conf->ssl_passwords->pool != cf->temp_pool) { - /* already preserved */ - return NGX_OK; - } - - preserve = (conf->ssl_passwords == prev->ssl_passwords) ? 1 : 0; - - conf->ssl_passwords = ngx_ssl_preserve_passwords(cf, conf->ssl_passwords); - if (conf->ssl_passwords == NULL) { - return NGX_ERROR; - } - - /* - * special handling to keep a preserved ssl_passwords copy - * in the previous configuration to inherit it to all children - */ - - if (preserve) { - prev->ssl_passwords = conf->ssl_passwords; - } - - return NGX_OK; -} - -#endif - - -static void * -ngx_http_upstream_create_main_conf(ngx_conf_t *cf) -{ - ngx_http_upstream_main_conf_t *umcf; - - umcf = ngx_pcalloc(cf->pool, sizeof(ngx_http_upstream_main_conf_t)); - if (umcf == NULL) { - return NULL; - } - - if (ngx_array_init(&umcf->upstreams, cf->pool, 4, - sizeof(ngx_http_upstream_srv_conf_t *)) - != NGX_OK) - { - return NULL; - } - - return umcf; -} - - -static char * -ngx_http_upstream_init_main_conf(ngx_conf_t *cf, void *conf) -{ - ngx_http_upstream_main_conf_t *umcf = conf; - - ngx_uint_t i; - ngx_array_t headers_in; - ngx_hash_key_t *hk; - ngx_hash_init_t hash; - ngx_http_upstream_init_pt init; - ngx_http_upstream_header_t *header; - ngx_http_upstream_srv_conf_t **uscfp; - - uscfp = umcf->upstreams.elts; - - for (i = 0; i < umcf->upstreams.nelts; i++) { - - init = uscfp[i]->peer.init_upstream ? uscfp[i]->peer.init_upstream: - ngx_http_upstream_init_round_robin; - - if (init(cf, uscfp[i]) != NGX_OK) { - return NGX_CONF_ERROR; - } - } - - - /* upstream_headers_in_hash */ - - if (ngx_array_init(&headers_in, cf->temp_pool, 32, sizeof(ngx_hash_key_t)) - != NGX_OK) - { - return NGX_CONF_ERROR; - } - - for (header = ngx_http_upstream_headers_in; header->name.len; header++) { - hk = ngx_array_push(&headers_in); - if (hk == NULL) { - return NGX_CONF_ERROR; - } - - hk->key = header->name; - hk->key_hash = ngx_hash_key_lc(header->name.data, header->name.len); - hk->value = header; - } - - hash.hash = &umcf->headers_in_hash; - hash.key = ngx_hash_key_lc; - hash.max_size = 512; - hash.bucket_size = ngx_align(64, ngx_cacheline_size); - hash.name = "upstream_headers_in_hash"; - hash.pool = cf->pool; - hash.temp_pool = NULL; - - if (ngx_hash_init(&hash, headers_in.elts, headers_in.nelts) != NGX_OK) { - return NGX_CONF_ERROR; - } - - return NGX_CONF_OK; -} diff --git a/src/deps/src/nginx-1.30.3/src/http/ngx_http_upstream.h b/src/deps/src/nginx-1.30.3/src/http/ngx_http_upstream.h deleted file mode 100644 index 0d48db7880..0000000000 --- a/src/deps/src/nginx-1.30.3/src/http/ngx_http_upstream.h +++ /dev/null @@ -1,464 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#ifndef _NGX_HTTP_UPSTREAM_H_INCLUDED_ -#define _NGX_HTTP_UPSTREAM_H_INCLUDED_ - - -#include -#include -#include -#include -#include -#include - - -#define NGX_HTTP_UPSTREAM_FT_ERROR 0x00000002 -#define NGX_HTTP_UPSTREAM_FT_TIMEOUT 0x00000004 -#define NGX_HTTP_UPSTREAM_FT_INVALID_HEADER 0x00000008 -#define NGX_HTTP_UPSTREAM_FT_HTTP_500 0x00000010 -#define NGX_HTTP_UPSTREAM_FT_HTTP_502 0x00000020 -#define NGX_HTTP_UPSTREAM_FT_HTTP_503 0x00000040 -#define NGX_HTTP_UPSTREAM_FT_HTTP_504 0x00000080 -#define NGX_HTTP_UPSTREAM_FT_HTTP_403 0x00000100 -#define NGX_HTTP_UPSTREAM_FT_HTTP_404 0x00000200 -#define NGX_HTTP_UPSTREAM_FT_HTTP_429 0x00000400 -#define NGX_HTTP_UPSTREAM_FT_UPDATING 0x00000800 -#define NGX_HTTP_UPSTREAM_FT_BUSY_LOCK 0x00001000 -#define NGX_HTTP_UPSTREAM_FT_MAX_WAITING 0x00002000 -#define NGX_HTTP_UPSTREAM_FT_NON_IDEMPOTENT 0x00004000 -#define NGX_HTTP_UPSTREAM_FT_NOLIVE 0x40000000 -#define NGX_HTTP_UPSTREAM_FT_OFF 0x80000000 - -#define NGX_HTTP_UPSTREAM_FT_STATUS (NGX_HTTP_UPSTREAM_FT_HTTP_500 \ - |NGX_HTTP_UPSTREAM_FT_HTTP_502 \ - |NGX_HTTP_UPSTREAM_FT_HTTP_503 \ - |NGX_HTTP_UPSTREAM_FT_HTTP_504 \ - |NGX_HTTP_UPSTREAM_FT_HTTP_403 \ - |NGX_HTTP_UPSTREAM_FT_HTTP_404 \ - |NGX_HTTP_UPSTREAM_FT_HTTP_429) - -#define NGX_HTTP_UPSTREAM_INVALID_HEADER 40 -#define NGX_HTTP_UPSTREAM_EARLY_HINTS 41 - - -#define NGX_HTTP_UPSTREAM_IGN_XA_REDIRECT 0x00000002 -#define NGX_HTTP_UPSTREAM_IGN_XA_EXPIRES 0x00000004 -#define NGX_HTTP_UPSTREAM_IGN_EXPIRES 0x00000008 -#define NGX_HTTP_UPSTREAM_IGN_CACHE_CONTROL 0x00000010 -#define NGX_HTTP_UPSTREAM_IGN_SET_COOKIE 0x00000020 -#define NGX_HTTP_UPSTREAM_IGN_XA_LIMIT_RATE 0x00000040 -#define NGX_HTTP_UPSTREAM_IGN_XA_BUFFERING 0x00000080 -#define NGX_HTTP_UPSTREAM_IGN_XA_CHARSET 0x00000100 -#define NGX_HTTP_UPSTREAM_IGN_VARY 0x00000200 - - -#define NGX_HTTP_UPSTREAM_NOTIFY_HEADER 0x1 - - -typedef struct { - ngx_uint_t status; - ngx_msec_t response_time; - ngx_msec_t connect_time; - ngx_msec_t header_time; - ngx_msec_t queue_time; - off_t response_length; - off_t bytes_received; - off_t bytes_sent; - - ngx_str_t *peer; -} ngx_http_upstream_state_t; - - -typedef struct { - ngx_hash_t headers_in_hash; - ngx_array_t upstreams; - /* ngx_http_upstream_srv_conf_t */ -} ngx_http_upstream_main_conf_t; - -typedef struct ngx_http_upstream_srv_conf_s ngx_http_upstream_srv_conf_t; - -typedef ngx_int_t (*ngx_http_upstream_init_pt)(ngx_conf_t *cf, - ngx_http_upstream_srv_conf_t *us); -typedef ngx_int_t (*ngx_http_upstream_init_peer_pt)(ngx_http_request_t *r, - ngx_http_upstream_srv_conf_t *us); - - -typedef struct { - ngx_http_upstream_init_pt init_upstream; - ngx_http_upstream_init_peer_pt init; - void *data; -} ngx_http_upstream_peer_t; - - -typedef struct { - ngx_str_t name; - ngx_addr_t *addrs; - ngx_uint_t naddrs; - ngx_uint_t weight; - ngx_uint_t max_conns; - ngx_uint_t max_fails; - time_t fail_timeout; - ngx_msec_t slow_start; - ngx_uint_t down; - - unsigned backup:1; - -#if (NGX_HTTP_UPSTREAM_ZONE) - ngx_str_t host; - ngx_str_t service; -#endif - -#if (NGX_HTTP_UPSTREAM_SID || NGX_COMPAT) - ngx_str_t sid; -#endif -} ngx_http_upstream_server_t; - - -#define NGX_HTTP_UPSTREAM_CREATE 0x0001 -#define NGX_HTTP_UPSTREAM_WEIGHT 0x0002 -#define NGX_HTTP_UPSTREAM_MAX_FAILS 0x0004 -#define NGX_HTTP_UPSTREAM_FAIL_TIMEOUT 0x0008 -#define NGX_HTTP_UPSTREAM_DOWN 0x0010 -#define NGX_HTTP_UPSTREAM_BACKUP 0x0020 -#define NGX_HTTP_UPSTREAM_MODIFY 0x0040 -#define NGX_HTTP_UPSTREAM_MAX_CONNS 0x0100 - - -struct ngx_http_upstream_srv_conf_s { - ngx_http_upstream_peer_t peer; - void **srv_conf; - - ngx_array_t *servers; /* ngx_http_upstream_server_t */ - - ngx_uint_t flags; - ngx_str_t host; - u_char *file_name; - ngx_uint_t line; - in_port_t port; - ngx_uint_t no_port; /* unsigned no_port:1 */ - -#if (NGX_HTTP_UPSTREAM_ZONE) - ngx_shm_zone_t *shm_zone; - ngx_resolver_t *resolver; - ngx_msec_t resolver_timeout; -#endif -}; - - -typedef struct { - ngx_addr_t *addr; - ngx_http_complex_value_t *value; -#if (NGX_HAVE_TRANSPARENT_PROXY) - ngx_uint_t transparent; /* unsigned transparent:1; */ -#endif -} ngx_http_upstream_local_t; - - -typedef struct { - ngx_http_upstream_srv_conf_t *upstream; - - ngx_msec_t connect_timeout; - ngx_msec_t send_timeout; - ngx_msec_t read_timeout; - ngx_msec_t next_upstream_timeout; - - size_t send_lowat; - size_t buffer_size; - ngx_http_complex_value_t *limit_rate; - - size_t busy_buffers_size; - size_t max_temp_file_size; - size_t temp_file_write_size; - - size_t busy_buffers_size_conf; - size_t max_temp_file_size_conf; - size_t temp_file_write_size_conf; - - ngx_bufs_t bufs; - - ngx_uint_t ignore_headers; - ngx_uint_t next_upstream; - ngx_uint_t store_access; - ngx_uint_t next_upstream_tries; - ngx_flag_t buffering; - ngx_flag_t request_buffering; - ngx_flag_t pass_request_headers; - ngx_flag_t pass_request_body; - ngx_flag_t pass_trailers; - ngx_flag_t pass_early_hints; - - ngx_flag_t ignore_client_abort; - ngx_flag_t intercept_errors; - ngx_flag_t cyclic_temp_file; - ngx_flag_t force_ranges; - - ngx_path_t *temp_path; - - ngx_hash_t hide_headers_hash; - ngx_array_t *hide_headers; - ngx_array_t *pass_headers; - - ngx_http_upstream_local_t *local; - ngx_flag_t socket_keepalive; - -#if (NGX_HTTP_CACHE) - ngx_shm_zone_t *cache_zone; - ngx_http_complex_value_t *cache_value; - - ngx_uint_t cache_min_uses; - ngx_uint_t cache_use_stale; - ngx_uint_t cache_methods; - - off_t cache_max_range_offset; - - ngx_flag_t cache_lock; - ngx_msec_t cache_lock_timeout; - ngx_msec_t cache_lock_age; - - ngx_flag_t cache_revalidate; - ngx_flag_t cache_convert_head; - ngx_flag_t cache_background_update; - - ngx_array_t *cache_valid; - ngx_array_t *cache_bypass; - ngx_array_t *cache_purge; - ngx_array_t *no_cache; -#endif - - ngx_array_t *store_lengths; - ngx_array_t *store_values; - -#if (NGX_HTTP_CACHE) - signed cache:2; -#endif - signed store:2; - unsigned intercept_404:1; - unsigned change_buffering:1; - unsigned preserve_output:1; - -#if (NGX_HTTP_SSL || NGX_COMPAT) - ngx_ssl_t *ssl; - ngx_flag_t ssl_session_reuse; - - ngx_http_complex_value_t *ssl_name; - ngx_flag_t ssl_server_name; - ngx_flag_t ssl_verify; - - ngx_http_complex_value_t *ssl_certificate; - ngx_http_complex_value_t *ssl_certificate_key; - ngx_ssl_cache_t *ssl_certificate_cache; - ngx_array_t *ssl_passwords; -#endif - - ngx_str_t module; - - NGX_COMPAT_BEGIN(6) - NGX_COMPAT_END -} ngx_http_upstream_conf_t; - - -typedef struct { - ngx_str_t name; - ngx_http_header_handler_pt handler; - ngx_uint_t offset; - ngx_http_header_handler_pt copy_handler; - ngx_uint_t conf; - ngx_uint_t redirect; /* unsigned redirect:1; */ -} ngx_http_upstream_header_t; - - -typedef struct { - ngx_list_t headers; - ngx_list_t trailers; - - ngx_uint_t status_n; - ngx_str_t status_line; - - ngx_table_elt_t *status; - ngx_table_elt_t *date; - ngx_table_elt_t *server; - ngx_table_elt_t *connection; - - ngx_table_elt_t *expires; - ngx_table_elt_t *etag; - ngx_table_elt_t *x_accel_expires; - ngx_table_elt_t *x_accel_redirect; - ngx_table_elt_t *x_accel_limit_rate; - - ngx_table_elt_t *content_type; - ngx_table_elt_t *content_length; - - ngx_table_elt_t *last_modified; - ngx_table_elt_t *location; - ngx_table_elt_t *refresh; - ngx_table_elt_t *www_authenticate; - ngx_table_elt_t *transfer_encoding; - ngx_table_elt_t *vary; - - ngx_table_elt_t *cache_control; - ngx_table_elt_t *set_cookie; - - off_t content_length_n; - time_t last_modified_time; - - unsigned connection_close:1; - unsigned chunked:1; - unsigned no_cache:1; - unsigned expired:1; -} ngx_http_upstream_headers_in_t; - - -typedef struct { - ngx_str_t host; - in_port_t port; - ngx_uint_t no_port; /* unsigned no_port:1 */ - - ngx_uint_t naddrs; - ngx_resolver_addr_t *addrs; - - struct sockaddr *sockaddr; - socklen_t socklen; - ngx_str_t name; - - ngx_resolver_ctx_t *ctx; -} ngx_http_upstream_resolved_t; - - -typedef void (*ngx_http_upstream_handler_pt)(ngx_http_request_t *r, - ngx_http_upstream_t *u); - - -struct ngx_http_upstream_s { - ngx_http_upstream_handler_pt read_event_handler; - ngx_http_upstream_handler_pt write_event_handler; - - ngx_peer_connection_t peer; - - ngx_event_pipe_t *pipe; - - ngx_chain_t *request_bufs; - - ngx_output_chain_ctx_t output; - ngx_chain_writer_ctx_t writer; - - ngx_http_upstream_conf_t *conf; - ngx_http_upstream_srv_conf_t *upstream; -#if (NGX_HTTP_CACHE) - ngx_array_t *caches; -#endif - - ngx_http_upstream_headers_in_t headers_in; - - ngx_http_upstream_resolved_t *resolved; - - ngx_buf_t from_client; - - ngx_buf_t buffer; - off_t length; - off_t early_hints_length; - - ngx_chain_t *out_bufs; - ngx_chain_t *busy_bufs; - ngx_chain_t *free_bufs; - - ngx_int_t (*input_filter_init)(void *data); - ngx_int_t (*input_filter)(void *data, ssize_t bytes); - void *input_filter_ctx; - -#if (NGX_HTTP_CACHE) - ngx_int_t (*create_key)(ngx_http_request_t *r); -#endif - ngx_int_t (*create_request)(ngx_http_request_t *r); - ngx_int_t (*reinit_request)(ngx_http_request_t *r); - ngx_int_t (*process_header)(ngx_http_request_t *r); - void (*abort_request)(ngx_http_request_t *r); - void (*finalize_request)(ngx_http_request_t *r, - ngx_int_t rc); - ngx_int_t (*rewrite_redirect)(ngx_http_request_t *r, - ngx_table_elt_t *h, size_t prefix); - ngx_int_t (*rewrite_cookie)(ngx_http_request_t *r, - ngx_table_elt_t *h); - - ngx_msec_t start_time; - - ngx_http_upstream_state_t *state; - - ngx_str_t method; - ngx_str_t schema; - ngx_str_t uri; - -#if (NGX_HTTP_SSL || NGX_COMPAT) - ngx_str_t ssl_name; - ngx_str_t ssl_alpn_protocol; -#endif - - ngx_http_cleanup_pt *cleanup; - - unsigned store:1; - unsigned cacheable:1; - unsigned accel:1; - unsigned ssl:1; -#if (NGX_HTTP_CACHE) - unsigned cache_status:3; -#endif - - unsigned buffering:1; - unsigned keepalive:1; - unsigned upgrade:1; - unsigned error:1; - - unsigned request_sent:1; - unsigned request_body_sent:1; - unsigned request_body_blocked:1; - unsigned header_sent:1; - unsigned response_received:1; -}; - - -typedef struct { - ngx_uint_t status; - ngx_uint_t mask; -} ngx_http_upstream_next_t; - - -typedef struct { - ngx_str_t key; - ngx_str_t value; - ngx_uint_t skip_empty; -} ngx_http_upstream_param_t; - - -ngx_int_t ngx_http_upstream_create(ngx_http_request_t *r); -void ngx_http_upstream_init(ngx_http_request_t *r); -ngx_int_t ngx_http_upstream_non_buffered_filter_init(void *data); -ngx_int_t ngx_http_upstream_non_buffered_filter(void *data, ssize_t bytes); -ngx_http_upstream_srv_conf_t *ngx_http_upstream_add(ngx_conf_t *cf, - ngx_url_t *u, ngx_uint_t flags); -char *ngx_http_upstream_bind_set_slot(ngx_conf_t *cf, ngx_command_t *cmd, - void *conf); -char *ngx_http_upstream_param_set_slot(ngx_conf_t *cf, ngx_command_t *cmd, - void *conf); -ngx_int_t ngx_http_upstream_hide_headers_hash(ngx_conf_t *cf, - ngx_http_upstream_conf_t *conf, ngx_http_upstream_conf_t *prev, - ngx_str_t *default_hide_headers, ngx_hash_init_t *hash); -#if (NGX_HTTP_SSL) -ngx_int_t ngx_http_upstream_merge_ssl_passwords(ngx_conf_t *cf, - ngx_http_upstream_conf_t *conf, ngx_http_upstream_conf_t *prev); -#endif - - -#define ngx_http_conf_upstream_srv_conf(uscf, module) \ - uscf->srv_conf[module.ctx_index] - - -extern ngx_module_t ngx_http_upstream_module; -extern ngx_conf_bitmask_t ngx_http_upstream_cache_method_mask[]; -extern ngx_conf_bitmask_t ngx_http_upstream_ignore_headers_masks[]; - - -#endif /* _NGX_HTTP_UPSTREAM_H_INCLUDED_ */ diff --git a/src/deps/src/nginx-1.30.3/src/http/ngx_http_upstream_round_robin.c b/src/deps/src/nginx-1.30.3/src/http/ngx_http_upstream_round_robin.c deleted file mode 100644 index 4122817672..0000000000 --- a/src/deps/src/nginx-1.30.3/src/http/ngx_http_upstream_round_robin.c +++ /dev/null @@ -1,1267 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#include -#include -#include -#include - - -#define ngx_http_upstream_tries(p) ((p)->tries \ - + ((p)->next ? (p)->next->tries : 0)) - - -#if (NGX_HTTP_UPSTREAM_SID) -static ngx_int_t ngx_http_upstream_create_sid(ngx_conf_t *cf, - ngx_http_upstream_rr_peer_t *peer, ngx_str_t *route); -#endif - -static ngx_http_upstream_rr_peer_t *ngx_http_upstream_get_peer( - ngx_http_upstream_rr_peer_data_t *rrp, ngx_peer_connection_t *pc); - -#if (NGX_HTTP_SSL) - -static ngx_int_t ngx_http_upstream_empty_set_session(ngx_peer_connection_t *pc, - void *data); -static void ngx_http_upstream_empty_save_session(ngx_peer_connection_t *pc, - void *data); - -#endif - - -ngx_int_t -ngx_http_upstream_init_round_robin(ngx_conf_t *cf, - ngx_http_upstream_srv_conf_t *us) -{ - ngx_url_t u; - ngx_uint_t i, j, n, r, w, t; - ngx_http_upstream_server_t *server; - ngx_http_upstream_rr_peer_t *peer, **peerp; - ngx_http_upstream_rr_peers_t *peers, *backup; -#if (NGX_HTTP_UPSTREAM_ZONE) - ngx_uint_t resolve; - ngx_http_core_loc_conf_t *clcf; - ngx_http_upstream_rr_peer_t **rpeerp; -#endif - - us->peer.init = ngx_http_upstream_init_round_robin_peer; - - if (us->servers) { - server = us->servers->elts; - - n = 0; - r = 0; - w = 0; - t = 0; - -#if (NGX_HTTP_UPSTREAM_ZONE) - resolve = 0; -#endif - - for (i = 0; i < us->servers->nelts; i++) { - -#if (NGX_HTTP_UPSTREAM_ZONE) - if (server[i].host.len) { - resolve = 1; - } -#endif - - if (server[i].backup) { - continue; - } - -#if (NGX_HTTP_UPSTREAM_ZONE) - if (server[i].host.len) { - r++; - continue; - } -#endif - - n += server[i].naddrs; - w += server[i].naddrs * server[i].weight; - - if (!server[i].down) { - t += server[i].naddrs; - } - } - -#if (NGX_HTTP_UPSTREAM_ZONE) - if (us->shm_zone) { - - if (resolve && !(us->flags & NGX_HTTP_UPSTREAM_MODIFY)) { - ngx_log_error(NGX_LOG_EMERG, cf->log, 0, - "load balancing method does not support" - " resolving names at run time in" - " upstream \"%V\" in %s:%ui", - &us->host, us->file_name, us->line); - return NGX_ERROR; - } - - clcf = ngx_http_conf_get_module_loc_conf(cf, ngx_http_core_module); - - if (us->resolver == NULL) { - us->resolver = clcf->resolver; - } - - /* - * Without "resolver_timeout" in http{} the merged value is unset. - */ - ngx_conf_merge_msec_value(us->resolver_timeout, - clcf->resolver_timeout, 30000); - - if (resolve - && (us->resolver == NULL - || us->resolver->connections.nelts == 0)) - { - ngx_log_error(NGX_LOG_EMERG, cf->log, 0, - "no resolver defined to resolve names" - " at run time in upstream \"%V\" in %s:%ui", - &us->host, us->file_name, us->line); - return NGX_ERROR; - } - - } else if (resolve) { - - ngx_log_error(NGX_LOG_EMERG, cf->log, 0, - "resolving names at run time requires" - " upstream \"%V\" in %s:%ui" - " to be in shared memory", - &us->host, us->file_name, us->line); - return NGX_ERROR; - } -#endif - - if (n + r == 0) { - ngx_log_error(NGX_LOG_EMERG, cf->log, 0, - "no servers in upstream \"%V\" in %s:%ui", - &us->host, us->file_name, us->line); - return NGX_ERROR; - } - - peers = ngx_pcalloc(cf->pool, sizeof(ngx_http_upstream_rr_peers_t)); - if (peers == NULL) { - return NGX_ERROR; - } - - peer = ngx_pcalloc(cf->pool, sizeof(ngx_http_upstream_rr_peer_t) - * (n + r)); - if (peer == NULL) { - return NGX_ERROR; - } - - peers->single = (n == 1); - peers->number = n; - peers->weighted = (w != n); - peers->total_weight = w; - peers->tries = t; - peers->name = &us->host; - - n = 0; - peerp = &peers->peer; - -#if (NGX_HTTP_UPSTREAM_ZONE) - rpeerp = &peers->resolve; -#endif - - for (i = 0; i < us->servers->nelts; i++) { - if (server[i].backup) { - continue; - } - -#if (NGX_HTTP_UPSTREAM_ZONE) - if (server[i].host.len) { - - peer[n].host = ngx_pcalloc(cf->pool, - sizeof(ngx_http_upstream_host_t)); - if (peer[n].host == NULL) { - return NGX_ERROR; - } - - peer[n].host->name = server[i].host; - peer[n].host->service = server[i].service; - - peer[n].sockaddr = server[i].addrs[0].sockaddr; - peer[n].socklen = server[i].addrs[0].socklen; - peer[n].name = server[i].addrs[0].name; - peer[n].weight = server[i].weight; - peer[n].effective_weight = server[i].weight; - peer[n].current_weight = 0; - peer[n].max_conns = server[i].max_conns; - peer[n].max_fails = server[i].max_fails; - peer[n].fail_timeout = server[i].fail_timeout; - peer[n].down = server[i].down; - peer[n].server = server[i].name; - -#if (NGX_HTTP_UPSTREAM_SID) - if (ngx_http_upstream_create_sid(cf, &peer[n], &server[i].sid) - != NGX_OK) - { - return NGX_ERROR; - } -#endif - - *rpeerp = &peer[n]; - rpeerp = &peer[n].next; - n++; - - continue; - } -#endif - - for (j = 0; j < server[i].naddrs; j++) { - peer[n].sockaddr = server[i].addrs[j].sockaddr; - peer[n].socklen = server[i].addrs[j].socklen; - peer[n].name = server[i].addrs[j].name; - peer[n].weight = server[i].weight; - peer[n].effective_weight = server[i].weight; - peer[n].current_weight = 0; - peer[n].max_conns = server[i].max_conns; - peer[n].max_fails = server[i].max_fails; - peer[n].fail_timeout = server[i].fail_timeout; - peer[n].down = server[i].down; - peer[n].server = server[i].name; - -#if (NGX_HTTP_UPSTREAM_SID) - if (ngx_http_upstream_create_sid(cf, &peer[n], &server[i].sid) - != NGX_OK) - { - return NGX_ERROR; - } -#endif - - *peerp = &peer[n]; - peerp = &peer[n].next; - n++; - } - } - - us->peer.data = peers; - - /* backup servers */ - - n = 0; - r = 0; - w = 0; - t = 0; - - for (i = 0; i < us->servers->nelts; i++) { - if (!server[i].backup) { - continue; - } - -#if (NGX_HTTP_UPSTREAM_ZONE) - if (server[i].host.len) { - r++; - continue; - } -#endif - - n += server[i].naddrs; - w += server[i].naddrs * server[i].weight; - - if (!server[i].down) { - t += server[i].naddrs; - } - } - - if (n == 0 -#if (NGX_HTTP_UPSTREAM_ZONE) - && !resolve -#endif - ) { - return NGX_OK; - } - - if (n + r == 0 && !(us->flags & NGX_HTTP_UPSTREAM_BACKUP)) { - return NGX_OK; - } - - backup = ngx_pcalloc(cf->pool, sizeof(ngx_http_upstream_rr_peers_t)); - if (backup == NULL) { - return NGX_ERROR; - } - - peer = ngx_pcalloc(cf->pool, sizeof(ngx_http_upstream_rr_peer_t) - * (n + r)); - if (peer == NULL) { - return NGX_ERROR; - } - - if (n > 0) { - peers->single = 0; - } - - backup->single = 0; - backup->number = n; - backup->weighted = (w != n); - backup->total_weight = w; - backup->tries = t; - backup->name = &us->host; - - n = 0; - peerp = &backup->peer; - -#if (NGX_HTTP_UPSTREAM_ZONE) - rpeerp = &backup->resolve; -#endif - - for (i = 0; i < us->servers->nelts; i++) { - if (!server[i].backup) { - continue; - } - -#if (NGX_HTTP_UPSTREAM_ZONE) - if (server[i].host.len) { - - peer[n].host = ngx_pcalloc(cf->pool, - sizeof(ngx_http_upstream_host_t)); - if (peer[n].host == NULL) { - return NGX_ERROR; - } - - peer[n].host->name = server[i].host; - peer[n].host->service = server[i].service; - - peer[n].sockaddr = server[i].addrs[0].sockaddr; - peer[n].socklen = server[i].addrs[0].socklen; - peer[n].name = server[i].addrs[0].name; - peer[n].weight = server[i].weight; - peer[n].effective_weight = server[i].weight; - peer[n].current_weight = 0; - peer[n].max_conns = server[i].max_conns; - peer[n].max_fails = server[i].max_fails; - peer[n].fail_timeout = server[i].fail_timeout; - peer[n].down = server[i].down; - peer[n].server = server[i].name; - -#if (NGX_HTTP_UPSTREAM_SID) - if (ngx_http_upstream_create_sid(cf, &peer[n], &server[i].sid) - != NGX_OK) - { - return NGX_ERROR; - } -#endif - - *rpeerp = &peer[n]; - rpeerp = &peer[n].next; - n++; - - continue; - } -#endif - - for (j = 0; j < server[i].naddrs; j++) { - peer[n].sockaddr = server[i].addrs[j].sockaddr; - peer[n].socklen = server[i].addrs[j].socklen; - peer[n].name = server[i].addrs[j].name; - peer[n].weight = server[i].weight; - peer[n].effective_weight = server[i].weight; - peer[n].current_weight = 0; - peer[n].max_conns = server[i].max_conns; - peer[n].max_fails = server[i].max_fails; - peer[n].fail_timeout = server[i].fail_timeout; - peer[n].down = server[i].down; - peer[n].server = server[i].name; - -#if (NGX_HTTP_UPSTREAM_SID) - if (ngx_http_upstream_create_sid(cf, &peer[n], &server[i].sid) - != NGX_OK) - { - return NGX_ERROR; - } -#endif - - *peerp = &peer[n]; - peerp = &peer[n].next; - n++; - } - } - - peers->next = backup; - - return NGX_OK; - } - - - /* an upstream implicitly defined by proxy_pass, etc. */ - - if (us->port == 0) { - ngx_log_error(NGX_LOG_EMERG, cf->log, 0, - "no port in upstream \"%V\" in %s:%ui", - &us->host, us->file_name, us->line); - return NGX_ERROR; - } - - ngx_memzero(&u, sizeof(ngx_url_t)); - - u.host = us->host; - u.port = us->port; - - if (ngx_inet_resolve_host(cf->pool, &u) != NGX_OK) { - if (u.err) { - ngx_log_error(NGX_LOG_EMERG, cf->log, 0, - "%s in upstream \"%V\" in %s:%ui", - u.err, &us->host, us->file_name, us->line); - } - - return NGX_ERROR; - } - - n = u.naddrs; - - peers = ngx_pcalloc(cf->pool, sizeof(ngx_http_upstream_rr_peers_t)); - if (peers == NULL) { - return NGX_ERROR; - } - - peer = ngx_pcalloc(cf->pool, sizeof(ngx_http_upstream_rr_peer_t) * n); - if (peer == NULL) { - return NGX_ERROR; - } - - peers->single = (n == 1); - peers->number = n; - peers->weighted = 0; - peers->total_weight = n; - peers->tries = n; - peers->name = &us->host; - - peerp = &peers->peer; - - for (i = 0; i < u.naddrs; i++) { - peer[i].sockaddr = u.addrs[i].sockaddr; - peer[i].socklen = u.addrs[i].socklen; - peer[i].name = u.addrs[i].name; - peer[i].weight = 1; - peer[i].effective_weight = 1; - peer[i].current_weight = 0; - peer[i].max_conns = 0; - peer[i].max_fails = 1; - peer[i].fail_timeout = 10; - *peerp = &peer[i]; - peerp = &peer[i].next; - } - - us->peer.data = peers; - - /* implicitly defined upstream has no backup servers */ - - return NGX_OK; -} - - -#if (NGX_HTTP_UPSTREAM_SID) - -static ngx_int_t -ngx_http_upstream_create_sid(ngx_conf_t *cf, ngx_http_upstream_rr_peer_t *peer, - ngx_str_t *route) -{ - if (route->len) { - peer->route = 1; - peer->sid = *route; - return NGX_OK; - } - - peer->sid.data = ngx_pnalloc(cf->pool, NGX_HTTP_UPSTREAM_SID_LEN); - if (peer->sid.data == NULL) { - return NGX_ERROR; - } - - ngx_http_upstream_init_round_robin_sid(peer, NULL); - - return NGX_OK; -} - - -void -ngx_http_upstream_init_round_robin_sid(ngx_http_upstream_rr_peer_t *peer, - ngx_str_t *route) -{ - u_char hash[16]; - ngx_md5_t md5; - - if (route && route->len) { - peer->route = 1; - peer->sid.len = route->len; - ngx_memcpy(peer->sid.data, route->data, route->len); - return; - } - - peer->route = 0; - - /* SID is the MD5 hash of a printable socket address */ - - if (peer->name.len == 0) { - peer->sid.len = 0; - return; - } - - ngx_md5_init(&md5); - ngx_md5_update(&md5, peer->name.data, peer->name.len); - ngx_md5_final(hash, &md5); - - ngx_hex_dump(peer->sid.data, hash, 16); - peer->sid.len = NGX_HTTP_UPSTREAM_SID_LEN; -} - -#endif - - -ngx_int_t -ngx_http_upstream_init_round_robin_peer(ngx_http_request_t *r, - ngx_http_upstream_srv_conf_t *us) -{ - ngx_uint_t n; - ngx_http_upstream_rr_peer_data_t *rrp; - - rrp = r->upstream->peer.data; - - if (rrp == NULL) { - rrp = ngx_palloc(r->pool, sizeof(ngx_http_upstream_rr_peer_data_t)); - if (rrp == NULL) { - return NGX_ERROR; - } - - r->upstream->peer.data = rrp; - } - - rrp->peers = us->peer.data; - rrp->current = NULL; - - ngx_http_upstream_rr_peers_rlock(rrp->peers); - -#if (NGX_HTTP_UPSTREAM_ZONE) - rrp->config = rrp->peers->config ? *rrp->peers->config : 0; -#endif - - n = rrp->peers->number; - - if (rrp->peers->next && rrp->peers->next->number > n) { - n = rrp->peers->next->number; - } - - r->upstream->peer.tries = ngx_http_upstream_tries(rrp->peers); - - ngx_http_upstream_rr_peers_unlock(rrp->peers); - - if (n <= 8 * sizeof(uintptr_t)) { - rrp->tried = &rrp->data; - rrp->data = 0; - - } else { - n = (n + (8 * sizeof(uintptr_t) - 1)) / (8 * sizeof(uintptr_t)); - - rrp->tried = ngx_pcalloc(r->pool, n * sizeof(uintptr_t)); - if (rrp->tried == NULL) { - return NGX_ERROR; - } - } - - r->upstream->peer.get = ngx_http_upstream_get_round_robin_peer; - r->upstream->peer.free = ngx_http_upstream_free_round_robin_peer; -#if (NGX_HTTP_SSL) - r->upstream->peer.set_session = - ngx_http_upstream_set_round_robin_peer_session; - r->upstream->peer.save_session = - ngx_http_upstream_save_round_robin_peer_session; -#endif - - return NGX_OK; -} - - -ngx_int_t -ngx_http_upstream_create_round_robin_peer(ngx_http_request_t *r, - ngx_http_upstream_resolved_t *ur) -{ - u_char *p; - size_t len; - socklen_t socklen; - ngx_uint_t i, n; - struct sockaddr *sockaddr; - ngx_http_upstream_rr_peer_t *peer, **peerp; - ngx_http_upstream_rr_peers_t *peers; - ngx_http_upstream_rr_peer_data_t *rrp; - - rrp = r->upstream->peer.data; - - if (rrp == NULL) { - rrp = ngx_palloc(r->pool, sizeof(ngx_http_upstream_rr_peer_data_t)); - if (rrp == NULL) { - return NGX_ERROR; - } - - r->upstream->peer.data = rrp; - } - - peers = ngx_pcalloc(r->pool, sizeof(ngx_http_upstream_rr_peers_t)); - if (peers == NULL) { - return NGX_ERROR; - } - - peer = ngx_pcalloc(r->pool, sizeof(ngx_http_upstream_rr_peer_t) - * ur->naddrs); - if (peer == NULL) { - return NGX_ERROR; - } - - peers->single = (ur->naddrs == 1); - peers->number = ur->naddrs; - peers->tries = ur->naddrs; - peers->name = &ur->host; - - if (ur->sockaddr) { - peer[0].sockaddr = ur->sockaddr; - peer[0].socklen = ur->socklen; - peer[0].name = ur->name.data ? ur->name : ur->host; - peer[0].weight = 1; - peer[0].effective_weight = 1; - peer[0].current_weight = 0; - peer[0].max_conns = 0; - peer[0].max_fails = 1; - peer[0].fail_timeout = 10; - peers->peer = peer; - - } else { - peerp = &peers->peer; - - for (i = 0; i < ur->naddrs; i++) { - - socklen = ur->addrs[i].socklen; - - sockaddr = ngx_palloc(r->pool, socklen); - if (sockaddr == NULL) { - return NGX_ERROR; - } - - ngx_memcpy(sockaddr, ur->addrs[i].sockaddr, socklen); - ngx_inet_set_port(sockaddr, ur->port); - - p = ngx_pnalloc(r->pool, NGX_SOCKADDR_STRLEN); - if (p == NULL) { - return NGX_ERROR; - } - - len = ngx_sock_ntop(sockaddr, socklen, p, NGX_SOCKADDR_STRLEN, 1); - - peer[i].sockaddr = sockaddr; - peer[i].socklen = socklen; - peer[i].name.len = len; - peer[i].name.data = p; - peer[i].weight = 1; - peer[i].effective_weight = 1; - peer[i].current_weight = 0; - peer[i].max_conns = 0; - peer[i].max_fails = 1; - peer[i].fail_timeout = 10; - *peerp = &peer[i]; - peerp = &peer[i].next; - } - } - - rrp->peers = peers; - rrp->current = NULL; - rrp->config = 0; - - if (rrp->peers->number <= 8 * sizeof(uintptr_t)) { - rrp->tried = &rrp->data; - rrp->data = 0; - - } else { - n = (rrp->peers->number + (8 * sizeof(uintptr_t) - 1)) - / (8 * sizeof(uintptr_t)); - - rrp->tried = ngx_pcalloc(r->pool, n * sizeof(uintptr_t)); - if (rrp->tried == NULL) { - return NGX_ERROR; - } - } - - r->upstream->peer.get = ngx_http_upstream_get_round_robin_peer; - r->upstream->peer.free = ngx_http_upstream_free_round_robin_peer; - r->upstream->peer.tries = ngx_http_upstream_tries(rrp->peers); -#if (NGX_HTTP_SSL) - r->upstream->peer.set_session = ngx_http_upstream_empty_set_session; - r->upstream->peer.save_session = ngx_http_upstream_empty_save_session; -#endif - - return NGX_OK; -} - - -ngx_int_t -ngx_http_upstream_get_round_robin_peer(ngx_peer_connection_t *pc, void *data) -{ - ngx_http_upstream_rr_peer_data_t *rrp = data; - - ngx_int_t rc; - ngx_uint_t i, n; - ngx_http_upstream_rr_peer_t *peer; - ngx_http_upstream_rr_peers_t *peers; - - ngx_log_debug1(NGX_LOG_DEBUG_HTTP, pc->log, 0, - "get rr peer, try: %ui", pc->tries); - - pc->cached = 0; - pc->connection = NULL; - - peers = rrp->peers; - ngx_http_upstream_rr_peers_wlock(peers); - -#if (NGX_HTTP_UPSTREAM_ZONE) - if (peers->config && rrp->config != *peers->config) { - goto busy; - } -#endif - - if (peers->single) { -#if (NGX_HTTP_UPSTREAM_SID) - peer = ngx_http_upstream_get_rr_peer_by_sid(rrp, pc->hint, &i, 0); - - if (peer == NULL) { -#endif - peer = peers->peer; - - if (peer->down) { - goto failed; - } - - if (peer->max_conns && peer->conns >= peer->max_conns) { - goto failed; - } -#if (NGX_HTTP_UPSTREAM_SID) - } -#endif - - rrp->current = peer; - ngx_http_upstream_rr_peer_ref(peers, peer); - - } else { - - /* there are several peers */ - - peer = ngx_http_upstream_get_peer(rrp, pc); - - if (peer == NULL) { - goto failed; - } - - ngx_log_debug2(NGX_LOG_DEBUG_HTTP, pc->log, 0, - "get rr peer, current: %p %i", - peer, peer->current_weight); - } - - pc->sockaddr = peer->sockaddr; - pc->socklen = peer->socklen; - pc->name = &peer->name; - -#if (NGX_HTTP_UPSTREAM_SID) - pc->sid = &peer->sid; -#endif - - peer->conns++; - - ngx_http_upstream_rr_peers_unlock(peers); - - return NGX_OK; - -failed: - - if (peers->next) { - - ngx_log_debug0(NGX_LOG_DEBUG_HTTP, pc->log, 0, "backup servers"); - - rrp->peers = peers->next; - - n = (rrp->peers->number + (8 * sizeof(uintptr_t) - 1)) - / (8 * sizeof(uintptr_t)); - - for (i = 0; i < n; i++) { - rrp->tried[i] = 0; - } - - ngx_http_upstream_rr_peers_unlock(peers); - - rc = ngx_http_upstream_get_round_robin_peer(pc, rrp); - - if (rc != NGX_BUSY) { - return rc; - } - - ngx_http_upstream_rr_peers_wlock(peers); - } - -#if (NGX_HTTP_UPSTREAM_ZONE) -busy: -#endif - - ngx_http_upstream_rr_peers_unlock(peers); - - pc->name = peers->name; - - return NGX_BUSY; -} - - -static ngx_http_upstream_rr_peer_t * -ngx_http_upstream_get_peer(ngx_http_upstream_rr_peer_data_t *rrp, - ngx_peer_connection_t *pc) -{ - time_t now; - uintptr_t m; - ngx_int_t total; - ngx_uint_t i, n, p; - ngx_http_upstream_rr_peer_t *peer, *best; - -#if (NGX_HTTP_UPSTREAM_SID) - ngx_int_t low_limit; - ngx_uint_t st_p; - ngx_http_upstream_rr_peer_t *st_peer; -#endif - - now = ngx_time(); - - best = NULL; - total = 0; - -#if (NGX_SUPPRESS_WARN) - p = 0; -#endif - -#if (NGX_HTTP_UPSTREAM_SID) - st_peer = ngx_http_upstream_get_rr_peer_by_sid(rrp, pc->hint, &p, 0); - - if (st_peer) { - - low_limit = -((ngx_int_t)(rrp->peers->total_weight - st_peer->weight)); - - /* - * note: current code accounts only one sticky request in a row, if it - * is required to account more, multiply low_limit by N below - */ - if (st_peer->current_weight <= low_limit) { - - /* do not update weights if the limit exceeded */ - best = st_peer; - goto best_chosen; - } - /* else: proceed to reweight with existing st_peer */ - } - - st_p = p; -#endif - - for (peer = rrp->peers->peer, i = 0; - peer; - peer = peer->next, i++) - { - n = i / (8 * sizeof(uintptr_t)); - m = (uintptr_t) 1 << i % (8 * sizeof(uintptr_t)); - - if (rrp->tried[n] & m) { - continue; - } - - if (peer->down) { - continue; - } - - if (peer->max_fails - && peer->fails >= peer->max_fails - && now - peer->checked <= peer->fail_timeout) - { - continue; - } - - if (peer->max_conns && peer->conns >= peer->max_conns) { - continue; - } - - peer->current_weight += peer->effective_weight; - total += peer->effective_weight; - - if (peer->effective_weight < peer->weight) { - peer->effective_weight++; - } - - if (best == NULL || peer->current_weight > best->current_weight) { - best = peer; - p = i; - } - } - -#if (NGX_HTTP_UPSTREAM_SID) - /* prefer peer chosen by sticky to best from RR */ - - if (st_peer) { - best = st_peer; - p = st_p; - } -#endif - - if (best == NULL) { - return NULL; - } - - best->current_weight -= total; - -#if (NGX_HTTP_UPSTREAM_SID) -best_chosen: -#endif - - rrp->current = best; - ngx_http_upstream_rr_peer_ref(rrp->peers, best); - - n = p / (8 * sizeof(uintptr_t)); - m = (uintptr_t) 1 << p % (8 * sizeof(uintptr_t)); - - rrp->tried[n] |= m; - - if (now - best->checked > best->fail_timeout) { - best->checked = now; - } - - return best; -} - - -#if (NGX_HTTP_UPSTREAM_SID) - -ngx_http_upstream_rr_peer_t * -ngx_http_upstream_get_rr_peer_by_sid(ngx_http_upstream_rr_peer_data_t *rrp, - ngx_str_t *hint, ngx_uint_t *p, ngx_uint_t lock) -{ - uintptr_t m; - ngx_uint_t i, n; - ngx_http_upstream_rr_peer_t *peer; - - if (hint == NULL) { - return NULL; - } - - for (peer = rrp->peers->peer, i = 0; - peer; - peer = peer->next, i++) - { - - if (peer->sid.len == hint->len - && ngx_memcmp(peer->sid.data, hint->data, hint->len) == 0) - { - goto found; - } - } - - return NULL; - -found: - - n = i / (8 * sizeof(uintptr_t)); - m = (uintptr_t) 1 << i % (8 * sizeof(uintptr_t)); - - if (rrp->tried[n] & m) { - return NULL; - } - - if (lock) { - ngx_http_upstream_rr_peer_lock(rrp->peers, peer); - } - - if (peer->down -#if (NGX_HTTP_UPSTREAM_STICKY) - & ~NGX_HTTP_UPSTREAM_DRAINING -#endif - ) { - goto failed; - } - - if (peer->max_fails - && peer->fails >= peer->max_fails - && ngx_time() - peer->checked <= peer->fail_timeout) - { - goto failed; - } - - if (peer->max_conns && peer->conns >= peer->max_conns) { - goto failed; - } - - *p = i; - return peer; - -failed: - - if (lock) { - ngx_http_upstream_rr_peer_unlock(rrp->peers, peer); - } - - return NULL; -} - -#endif - - -void -ngx_http_upstream_free_round_robin_peer(ngx_peer_connection_t *pc, void *data, - ngx_uint_t state) -{ - ngx_http_upstream_rr_peer_data_t *rrp = data; - - time_t now; - ngx_http_upstream_rr_peer_t *peer; - - ngx_log_debug2(NGX_LOG_DEBUG_HTTP, pc->log, 0, - "free rr peer %ui %ui", pc->tries, state); - - /* TODO: NGX_PEER_KEEPALIVE */ - - peer = rrp->current; - - ngx_http_upstream_rr_peers_rlock(rrp->peers); - ngx_http_upstream_rr_peer_lock(rrp->peers, peer); - - if (rrp->peers->single) { - - if (peer->fails) { - peer->fails = 0; - } - - peer->conns--; - - if (ngx_http_upstream_rr_peer_unref(rrp->peers, peer) == NGX_OK) { - ngx_http_upstream_rr_peer_unlock(rrp->peers, peer); - } - - ngx_http_upstream_rr_peers_unlock(rrp->peers); - - pc->tries = 0; - return; - } - - if (state & NGX_PEER_FAILED) { - now = ngx_time(); - - peer->fails++; - peer->accessed = now; - peer->checked = now; - - if (peer->max_fails) { - peer->effective_weight -= peer->weight / peer->max_fails; - - if (peer->fails >= peer->max_fails) { - ngx_log_error(NGX_LOG_WARN, pc->log, 0, - "upstream server temporarily disabled"); - } - } - - ngx_log_debug2(NGX_LOG_DEBUG_HTTP, pc->log, 0, - "free rr peer failed: %p %i", - peer, peer->effective_weight); - - if (peer->effective_weight < 0) { - peer->effective_weight = 0; - } - - } else { - - /* mark peer live if check passed */ - - if (peer->accessed < peer->checked) { - peer->fails = 0; - } - } - - peer->conns--; - - if (ngx_http_upstream_rr_peer_unref(rrp->peers, peer) == NGX_OK) { - ngx_http_upstream_rr_peer_unlock(rrp->peers, peer); - } - - ngx_http_upstream_rr_peers_unlock(rrp->peers); - - if (pc->tries) { - pc->tries--; - } -} - - -#if (NGX_HTTP_SSL) - -ngx_int_t -ngx_http_upstream_set_round_robin_peer_session(ngx_peer_connection_t *pc, - void *data) -{ - ngx_http_upstream_rr_peer_data_t *rrp = data; - - ngx_int_t rc; - ngx_ssl_session_t *ssl_session; - ngx_http_upstream_rr_peer_t *peer; -#if (NGX_HTTP_UPSTREAM_ZONE) - int len; - const u_char *p; - ngx_http_upstream_rr_peers_t *peers; -#endif - - peer = rrp->current; - -#if (NGX_HTTP_UPSTREAM_ZONE) - peers = rrp->peers; - - if (peers->shpool) { - ngx_http_upstream_rr_peers_rlock(peers); - ngx_http_upstream_rr_peer_lock(peers, peer); - - if (peer->ssl_session == NULL) { - ngx_http_upstream_rr_peer_unlock(peers, peer); - ngx_http_upstream_rr_peers_unlock(peers); - return NGX_OK; - } - - len = peer->ssl_session_len; - - ngx_memcpy(ngx_ssl_session_buffer, peer->ssl_session, len); - - ngx_http_upstream_rr_peer_unlock(peers, peer); - ngx_http_upstream_rr_peers_unlock(peers); - - p = ngx_ssl_session_buffer; - ssl_session = d2i_SSL_SESSION(NULL, &p, len); - - rc = ngx_ssl_set_session(pc->connection, ssl_session); - - ngx_log_debug1(NGX_LOG_DEBUG_HTTP, pc->log, 0, - "set session: %p", ssl_session); - - ngx_ssl_free_session(ssl_session); - - return rc; - } -#endif - - ssl_session = peer->ssl_session; - - rc = ngx_ssl_set_session(pc->connection, ssl_session); - - ngx_log_debug1(NGX_LOG_DEBUG_HTTP, pc->log, 0, - "set session: %p", ssl_session); - - return rc; -} - - -void -ngx_http_upstream_save_round_robin_peer_session(ngx_peer_connection_t *pc, - void *data) -{ - ngx_http_upstream_rr_peer_data_t *rrp = data; - - ngx_ssl_session_t *old_ssl_session, *ssl_session; - ngx_http_upstream_rr_peer_t *peer; -#if (NGX_HTTP_UPSTREAM_ZONE) - int len; - u_char *p; - ngx_http_upstream_rr_peers_t *peers; -#endif - -#if (NGX_HTTP_UPSTREAM_ZONE) - peers = rrp->peers; - - if (peers->shpool) { - - ssl_session = ngx_ssl_get0_session(pc->connection); - - if (ssl_session == NULL) { - return; - } - - len = i2d_SSL_SESSION(ssl_session, NULL); - - ngx_log_debug2(NGX_LOG_DEBUG_HTTP, pc->log, 0, - "save session: %p:%d", ssl_session, len); - - /* do not cache too big session */ - - if (len > NGX_SSL_MAX_SESSION_SIZE) { - return; - } - - p = ngx_ssl_session_buffer; - (void) i2d_SSL_SESSION(ssl_session, &p); - - peer = rrp->current; - - ngx_http_upstream_rr_peers_rlock(peers); - ngx_http_upstream_rr_peer_lock(peers, peer); - - if (len > peer->ssl_session_len) { - ngx_shmtx_lock(&peers->shpool->mutex); - - if (peer->ssl_session) { - ngx_slab_free_locked(peers->shpool, peer->ssl_session); - } - - peer->ssl_session = ngx_slab_alloc_locked(peers->shpool, len); - - ngx_shmtx_unlock(&peers->shpool->mutex); - - if (peer->ssl_session == NULL) { - peer->ssl_session_len = 0; - - ngx_http_upstream_rr_peer_unlock(peers, peer); - ngx_http_upstream_rr_peers_unlock(peers); - return; - } - - peer->ssl_session_len = len; - } - - ngx_memcpy(peer->ssl_session, ngx_ssl_session_buffer, len); - - ngx_http_upstream_rr_peer_unlock(peers, peer); - ngx_http_upstream_rr_peers_unlock(peers); - - return; - } -#endif - - ssl_session = ngx_ssl_get_session(pc->connection); - - if (ssl_session == NULL) { - return; - } - - ngx_log_debug1(NGX_LOG_DEBUG_HTTP, pc->log, 0, - "save session: %p", ssl_session); - - peer = rrp->current; - - old_ssl_session = peer->ssl_session; - peer->ssl_session = ssl_session; - - if (old_ssl_session) { - - ngx_log_debug1(NGX_LOG_DEBUG_HTTP, pc->log, 0, - "old session: %p", old_ssl_session); - - ngx_ssl_free_session(old_ssl_session); - } -} - - -static ngx_int_t -ngx_http_upstream_empty_set_session(ngx_peer_connection_t *pc, void *data) -{ - return NGX_OK; -} - - -static void -ngx_http_upstream_empty_save_session(ngx_peer_connection_t *pc, void *data) -{ - return; -} - -#endif diff --git a/src/deps/src/nginx-1.30.3/src/http/ngx_http_upstream_round_robin.h b/src/deps/src/nginx-1.30.3/src/http/ngx_http_upstream_round_robin.h deleted file mode 100644 index 95c7ae1906..0000000000 --- a/src/deps/src/nginx-1.30.3/src/http/ngx_http_upstream_round_robin.h +++ /dev/null @@ -1,275 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#ifndef _NGX_HTTP_UPSTREAM_ROUND_ROBIN_H_INCLUDED_ -#define _NGX_HTTP_UPSTREAM_ROUND_ROBIN_H_INCLUDED_ - - -#include -#include -#include - - -#if (NGX_HTTP_UPSTREAM_SID) -#define NGX_HTTP_UPSTREAM_SID_LEN 32 /* md5 in hex */ -#endif - -#define NGX_HTTP_UPSTREAM_FAILED 1 - -#if (NGX_HTTP_UPSTREAM_STICKY) -#define NGX_HTTP_UPSTREAM_DRAINING 8 -#endif - - -typedef struct ngx_http_upstream_rr_peers_s ngx_http_upstream_rr_peers_t; -typedef struct ngx_http_upstream_rr_peer_s ngx_http_upstream_rr_peer_t; - - -#if (NGX_HTTP_UPSTREAM_ZONE) - -typedef struct { - ngx_event_t event; /* must be first */ - ngx_uint_t worker; - ngx_str_t name; - ngx_str_t service; - time_t valid; - ngx_http_upstream_rr_peers_t *peers; - ngx_http_upstream_rr_peer_t *peer; -} ngx_http_upstream_host_t; - -#endif - - -struct ngx_http_upstream_rr_peer_s { - struct sockaddr *sockaddr; - socklen_t socklen; - ngx_str_t name; - ngx_str_t server; - - ngx_int_t current_weight; - ngx_int_t effective_weight; - ngx_int_t weight; - - ngx_uint_t conns; - ngx_uint_t max_conns; - - ngx_uint_t fails; - time_t accessed; - time_t checked; - - ngx_uint_t max_fails; - time_t fail_timeout; - ngx_msec_t slow_start; - ngx_msec_t start_time; - - ngx_uint_t down; - -#if (NGX_HTTP_SSL || NGX_COMPAT) - void *ssl_session; - int ssl_session_len; -#endif - -#if (NGX_HTTP_UPSTREAM_SID || NGX_COMPAT) - unsigned route:1; -#endif - -#if (NGX_HTTP_UPSTREAM_ZONE) - unsigned zombie:1; - - ngx_atomic_t lock; - ngx_uint_t refs; - ngx_http_upstream_host_t *host; -#endif - -#if (NGX_HTTP_UPSTREAM_SID || NGX_COMPAT) - ngx_str_t sid; -#endif - - ngx_http_upstream_rr_peer_t *next; - - NGX_COMPAT_BEGIN(13) - NGX_COMPAT_END -}; - - -struct ngx_http_upstream_rr_peers_s { - ngx_uint_t number; - -#if (NGX_HTTP_UPSTREAM_ZONE) - ngx_slab_pool_t *shpool; - ngx_atomic_t rwlock; - ngx_uint_t *config; - ngx_http_upstream_rr_peer_t *resolve; - ngx_http_upstream_rr_peers_t *zone_next; -#endif - - ngx_uint_t total_weight; - ngx_uint_t tries; - - unsigned single:1; - unsigned weighted:1; - - ngx_str_t *name; - - ngx_http_upstream_rr_peers_t *next; - - ngx_http_upstream_rr_peer_t *peer; -}; - - -#if (NGX_HTTP_UPSTREAM_ZONE) - -#define ngx_http_upstream_rr_peers_rlock(peers) \ - \ - if (peers->shpool) { \ - ngx_rwlock_rlock(&peers->rwlock); \ - } - -#define ngx_http_upstream_rr_peers_wlock(peers) \ - \ - if (peers->shpool) { \ - ngx_rwlock_wlock(&peers->rwlock); \ - } - -#define ngx_http_upstream_rr_peers_unlock(peers) \ - \ - if (peers->shpool) { \ - ngx_rwlock_unlock(&peers->rwlock); \ - } - - -#define ngx_http_upstream_rr_peer_lock(peers, peer) \ - \ - if (peers->shpool) { \ - ngx_rwlock_wlock(&peer->lock); \ - } - -#define ngx_http_upstream_rr_peer_unlock(peers, peer) \ - \ - if (peers->shpool) { \ - ngx_rwlock_unlock(&peer->lock); \ - } - - -#define ngx_http_upstream_rr_peer_ref(peers, peer) \ - (peer)->refs++; - - -static ngx_inline void -ngx_http_upstream_rr_peer_free_locked(ngx_http_upstream_rr_peers_t *peers, - ngx_http_upstream_rr_peer_t *peer) -{ - if (peer->refs) { - peer->zombie = 1; - return; - } - - ngx_slab_free_locked(peers->shpool, peer->sockaddr); - ngx_slab_free_locked(peers->shpool, peer->name.data); -#if (NGX_HTTP_UPSTREAM_SID) - ngx_slab_free_locked(peers->shpool, peer->sid.data); -#endif - - if (peer->server.data) { - ngx_slab_free_locked(peers->shpool, peer->server.data); - } - -#if (NGX_HTTP_SSL) - if (peer->ssl_session) { - ngx_slab_free_locked(peers->shpool, peer->ssl_session); - } -#endif - - ngx_slab_free_locked(peers->shpool, peer); -} - - -static ngx_inline void -ngx_http_upstream_rr_peer_free(ngx_http_upstream_rr_peers_t *peers, - ngx_http_upstream_rr_peer_t *peer) -{ - ngx_shmtx_lock(&peers->shpool->mutex); - ngx_http_upstream_rr_peer_free_locked(peers, peer); - ngx_shmtx_unlock(&peers->shpool->mutex); -} - - -static ngx_inline ngx_int_t -ngx_http_upstream_rr_peer_unref(ngx_http_upstream_rr_peers_t *peers, - ngx_http_upstream_rr_peer_t *peer) -{ - peer->refs--; - - if (peers->shpool == NULL) { - return NGX_OK; - } - - if (peer->refs == 0 && peer->zombie) { - ngx_http_upstream_rr_peer_free(peers, peer); - return NGX_DONE; - } - - return NGX_OK; -} - -#else - -#define ngx_http_upstream_rr_peers_rlock(peers) -#define ngx_http_upstream_rr_peers_wlock(peers) -#define ngx_http_upstream_rr_peers_unlock(peers) -#define ngx_http_upstream_rr_peer_lock(peers, peer) -#define ngx_http_upstream_rr_peer_unlock(peers, peer) -#define ngx_http_upstream_rr_peer_ref(peers, peer) -#define ngx_http_upstream_rr_peer_unref(peers, peer) NGX_OK - -#endif - - -typedef struct { - ngx_uint_t config; - ngx_http_upstream_rr_peers_t *peers; - ngx_http_upstream_rr_peer_t *current; - uintptr_t *tried; - uintptr_t data; -} ngx_http_upstream_rr_peer_data_t; - - -ngx_int_t ngx_http_upstream_init_round_robin(ngx_conf_t *cf, - ngx_http_upstream_srv_conf_t *us); -ngx_int_t ngx_http_upstream_init_round_robin_peer(ngx_http_request_t *r, - ngx_http_upstream_srv_conf_t *us); -ngx_int_t ngx_http_upstream_create_round_robin_peer(ngx_http_request_t *r, - ngx_http_upstream_resolved_t *ur); -ngx_int_t ngx_http_upstream_get_round_robin_peer(ngx_peer_connection_t *pc, - void *data); -void ngx_http_upstream_free_round_robin_peer(ngx_peer_connection_t *pc, - void *data, ngx_uint_t state); - -#if (NGX_HTTP_SSL) -ngx_int_t - ngx_http_upstream_set_round_robin_peer_session(ngx_peer_connection_t *pc, - void *data); -void ngx_http_upstream_save_round_robin_peer_session(ngx_peer_connection_t *pc, - void *data); -#endif - -#if (NGX_HTTP_UPSTREAM_SID) - -#define ngx_http_upstream_copy_round_robin_sid(dst, src) \ - ngx_http_upstream_init_round_robin_sid(dst, \ - (src)->route ? &(src)->sid : NULL) - -void ngx_http_upstream_init_round_robin_sid(ngx_http_upstream_rr_peer_t *peer, - ngx_str_t *route); -ngx_http_upstream_rr_peer_t *ngx_http_upstream_get_rr_peer_by_sid( - ngx_http_upstream_rr_peer_data_t *rrp, ngx_str_t *hint, ngx_uint_t *p, - ngx_uint_t lock); - -#endif - - -#endif /* _NGX_HTTP_UPSTREAM_ROUND_ROBIN_H_INCLUDED_ */ diff --git a/src/deps/src/nginx-1.30.3/src/http/ngx_http_variables.c b/src/deps/src/nginx-1.30.3/src/http/ngx_http_variables.c deleted file mode 100644 index 37cd0d2877..0000000000 --- a/src/deps/src/nginx-1.30.3/src/http/ngx_http_variables.c +++ /dev/null @@ -1,2890 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#include -#include -#include -#include - - -static ngx_http_variable_t *ngx_http_add_prefix_variable(ngx_conf_t *cf, - ngx_str_t *name, ngx_uint_t flags); - -static ngx_int_t ngx_http_variable_request(ngx_http_request_t *r, - ngx_http_variable_value_t *v, uintptr_t data); -#if 0 -static void ngx_http_variable_request_set(ngx_http_request_t *r, - ngx_http_variable_value_t *v, uintptr_t data); -#endif -static ngx_int_t ngx_http_variable_request_get_size(ngx_http_request_t *r, - ngx_http_variable_value_t *v, uintptr_t data); -static ngx_int_t ngx_http_variable_header(ngx_http_request_t *r, - ngx_http_variable_value_t *v, uintptr_t data); - -static ngx_int_t ngx_http_variable_cookies(ngx_http_request_t *r, - ngx_http_variable_value_t *v, uintptr_t data); -static ngx_int_t ngx_http_variable_headers_internal(ngx_http_request_t *r, - ngx_http_variable_value_t *v, uintptr_t data, u_char sep); - -static ngx_int_t ngx_http_variable_unknown_header_in(ngx_http_request_t *r, - ngx_http_variable_value_t *v, uintptr_t data); -static ngx_int_t ngx_http_variable_unknown_header_out(ngx_http_request_t *r, - ngx_http_variable_value_t *v, uintptr_t data); -static ngx_int_t ngx_http_variable_unknown_trailer_out(ngx_http_request_t *r, - ngx_http_variable_value_t *v, uintptr_t data); -static ngx_int_t ngx_http_variable_request_line(ngx_http_request_t *r, - ngx_http_variable_value_t *v, uintptr_t data); -static ngx_int_t ngx_http_variable_cookie(ngx_http_request_t *r, - ngx_http_variable_value_t *v, uintptr_t data); -static ngx_int_t ngx_http_variable_argument(ngx_http_request_t *r, - ngx_http_variable_value_t *v, uintptr_t data); -#if (NGX_HAVE_TCP_INFO) -static ngx_int_t ngx_http_variable_tcpinfo(ngx_http_request_t *r, - ngx_http_variable_value_t *v, uintptr_t data); -#endif - -static ngx_int_t ngx_http_variable_content_length(ngx_http_request_t *r, - ngx_http_variable_value_t *v, uintptr_t data); -static ngx_int_t ngx_http_variable_host(ngx_http_request_t *r, - ngx_http_variable_value_t *v, uintptr_t data); -static ngx_int_t ngx_http_variable_binary_remote_addr(ngx_http_request_t *r, - ngx_http_variable_value_t *v, uintptr_t data); -static ngx_int_t ngx_http_variable_remote_addr(ngx_http_request_t *r, - ngx_http_variable_value_t *v, uintptr_t data); -static ngx_int_t ngx_http_variable_remote_port(ngx_http_request_t *r, - ngx_http_variable_value_t *v, uintptr_t data); -static ngx_int_t ngx_http_variable_proxy_protocol_addr(ngx_http_request_t *r, - ngx_http_variable_value_t *v, uintptr_t data); -static ngx_int_t ngx_http_variable_proxy_protocol_port(ngx_http_request_t *r, - ngx_http_variable_value_t *v, uintptr_t data); -static ngx_int_t ngx_http_variable_proxy_protocol_tlv(ngx_http_request_t *r, - ngx_http_variable_value_t *v, uintptr_t data); -static ngx_int_t ngx_http_variable_server_addr(ngx_http_request_t *r, - ngx_http_variable_value_t *v, uintptr_t data); -static ngx_int_t ngx_http_variable_server_port(ngx_http_request_t *r, - ngx_http_variable_value_t *v, uintptr_t data); -static ngx_int_t ngx_http_variable_scheme(ngx_http_request_t *r, - ngx_http_variable_value_t *v, uintptr_t data); -static ngx_int_t ngx_http_variable_https(ngx_http_request_t *r, - ngx_http_variable_value_t *v, uintptr_t data); -static ngx_int_t ngx_http_variable_request_port(ngx_http_request_t *r, - ngx_http_variable_value_t *v, uintptr_t data); -static ngx_int_t ngx_http_variable_is_request_port(ngx_http_request_t *r, - ngx_http_variable_value_t *v, uintptr_t data); -static void ngx_http_variable_set_args(ngx_http_request_t *r, - ngx_http_variable_value_t *v, uintptr_t data); -static ngx_int_t ngx_http_variable_is_args(ngx_http_request_t *r, - ngx_http_variable_value_t *v, uintptr_t data); -static ngx_int_t ngx_http_variable_document_root(ngx_http_request_t *r, - ngx_http_variable_value_t *v, uintptr_t data); -static ngx_int_t ngx_http_variable_realpath_root(ngx_http_request_t *r, - ngx_http_variable_value_t *v, uintptr_t data); -static ngx_int_t ngx_http_variable_request_filename(ngx_http_request_t *r, - ngx_http_variable_value_t *v, uintptr_t data); -static ngx_int_t ngx_http_variable_server_name(ngx_http_request_t *r, - ngx_http_variable_value_t *v, uintptr_t data); -static ngx_int_t ngx_http_variable_request_method(ngx_http_request_t *r, - ngx_http_variable_value_t *v, uintptr_t data); -static ngx_int_t ngx_http_variable_remote_user(ngx_http_request_t *r, - ngx_http_variable_value_t *v, uintptr_t data); -static ngx_int_t ngx_http_variable_bytes_sent(ngx_http_request_t *r, - ngx_http_variable_value_t *v, uintptr_t data); -static ngx_int_t ngx_http_variable_body_bytes_sent(ngx_http_request_t *r, - ngx_http_variable_value_t *v, uintptr_t data); -static ngx_int_t ngx_http_variable_pipe(ngx_http_request_t *r, - ngx_http_variable_value_t *v, uintptr_t data); -static ngx_int_t ngx_http_variable_request_completion(ngx_http_request_t *r, - ngx_http_variable_value_t *v, uintptr_t data); -static ngx_int_t ngx_http_variable_request_body(ngx_http_request_t *r, - ngx_http_variable_value_t *v, uintptr_t data); -static ngx_int_t ngx_http_variable_request_body_file(ngx_http_request_t *r, - ngx_http_variable_value_t *v, uintptr_t data); -static ngx_int_t ngx_http_variable_request_length(ngx_http_request_t *r, - ngx_http_variable_value_t *v, uintptr_t data); -static ngx_int_t ngx_http_variable_request_time(ngx_http_request_t *r, - ngx_http_variable_value_t *v, uintptr_t data); -static ngx_int_t ngx_http_variable_request_id(ngx_http_request_t *r, - ngx_http_variable_value_t *v, uintptr_t data); -static ngx_int_t ngx_http_variable_status(ngx_http_request_t *r, - ngx_http_variable_value_t *v, uintptr_t data); - -static ngx_int_t ngx_http_variable_sent_content_type(ngx_http_request_t *r, - ngx_http_variable_value_t *v, uintptr_t data); -static ngx_int_t ngx_http_variable_sent_content_length(ngx_http_request_t *r, - ngx_http_variable_value_t *v, uintptr_t data); -static ngx_int_t ngx_http_variable_sent_location(ngx_http_request_t *r, - ngx_http_variable_value_t *v, uintptr_t data); -static ngx_int_t ngx_http_variable_sent_last_modified(ngx_http_request_t *r, - ngx_http_variable_value_t *v, uintptr_t data); -static ngx_int_t ngx_http_variable_sent_connection(ngx_http_request_t *r, - ngx_http_variable_value_t *v, uintptr_t data); -static ngx_int_t ngx_http_variable_sent_keep_alive(ngx_http_request_t *r, - ngx_http_variable_value_t *v, uintptr_t data); -static ngx_int_t ngx_http_variable_sent_transfer_encoding(ngx_http_request_t *r, - ngx_http_variable_value_t *v, uintptr_t data); -static void ngx_http_variable_set_limit_rate(ngx_http_request_t *r, - ngx_http_variable_value_t *v, uintptr_t data); - -static ngx_int_t ngx_http_variable_connection(ngx_http_request_t *r, - ngx_http_variable_value_t *v, uintptr_t data); -static ngx_int_t ngx_http_variable_connection_requests(ngx_http_request_t *r, - ngx_http_variable_value_t *v, uintptr_t data); -static ngx_int_t ngx_http_variable_connection_time(ngx_http_request_t *r, - ngx_http_variable_value_t *v, uintptr_t data); - -static ngx_int_t ngx_http_variable_nginx_version(ngx_http_request_t *r, - ngx_http_variable_value_t *v, uintptr_t data); -static ngx_int_t ngx_http_variable_hostname(ngx_http_request_t *r, - ngx_http_variable_value_t *v, uintptr_t data); -static ngx_int_t ngx_http_variable_pid(ngx_http_request_t *r, - ngx_http_variable_value_t *v, uintptr_t data); -static ngx_int_t ngx_http_variable_msec(ngx_http_request_t *r, - ngx_http_variable_value_t *v, uintptr_t data); -static ngx_int_t ngx_http_variable_time_iso8601(ngx_http_request_t *r, - ngx_http_variable_value_t *v, uintptr_t data); -static ngx_int_t ngx_http_variable_time_local(ngx_http_request_t *r, - ngx_http_variable_value_t *v, uintptr_t data); - -/* - * TODO: - * Apache CGI: AUTH_TYPE, PATH_INFO (null), PATH_TRANSLATED - * REMOTE_HOST (null), REMOTE_IDENT (null), - * SERVER_SOFTWARE - * - * Apache SSI: DOCUMENT_NAME, LAST_MODIFIED, USER_NAME (file owner) - */ - -/* - * the $http_host, $http_user_agent, $http_referer, and $http_via - * variables may be handled by generic - * ngx_http_variable_unknown_header_in(), but for performance reasons - * they are handled using dedicated entries - */ - -static ngx_http_variable_t ngx_http_core_variables[] = { - - { ngx_string("http_host"), NULL, ngx_http_variable_header, - offsetof(ngx_http_request_t, headers_in.host), 0, 0 }, - - { ngx_string("http_user_agent"), NULL, ngx_http_variable_header, - offsetof(ngx_http_request_t, headers_in.user_agent), 0, 0 }, - - { ngx_string("http_referer"), NULL, ngx_http_variable_header, - offsetof(ngx_http_request_t, headers_in.referer), 0, 0 }, - -#if (NGX_HTTP_GZIP) - { ngx_string("http_via"), NULL, ngx_http_variable_header, - offsetof(ngx_http_request_t, headers_in.via), 0, 0 }, -#endif - -#if (NGX_HTTP_X_FORWARDED_FOR) - { ngx_string("http_x_forwarded_for"), NULL, ngx_http_variable_header, - offsetof(ngx_http_request_t, headers_in.x_forwarded_for), 0, 0 }, -#endif - - { ngx_string("http_cookie"), NULL, ngx_http_variable_cookies, - offsetof(ngx_http_request_t, headers_in.cookie), 0, 0 }, - - { ngx_string("content_length"), NULL, ngx_http_variable_content_length, - 0, 0, 0 }, - - { ngx_string("content_type"), NULL, ngx_http_variable_header, - offsetof(ngx_http_request_t, headers_in.content_type), 0, 0 }, - - { ngx_string("host"), NULL, ngx_http_variable_host, 0, 0, 0 }, - - { ngx_string("binary_remote_addr"), NULL, - ngx_http_variable_binary_remote_addr, 0, 0, 0 }, - - { ngx_string("remote_addr"), NULL, ngx_http_variable_remote_addr, 0, 0, 0 }, - - { ngx_string("remote_port"), NULL, ngx_http_variable_remote_port, 0, 0, 0 }, - - { ngx_string("proxy_protocol_addr"), NULL, - ngx_http_variable_proxy_protocol_addr, - offsetof(ngx_proxy_protocol_t, src_addr), 0, 0 }, - - { ngx_string("proxy_protocol_port"), NULL, - ngx_http_variable_proxy_protocol_port, - offsetof(ngx_proxy_protocol_t, src_port), 0, 0 }, - - { ngx_string("proxy_protocol_server_addr"), NULL, - ngx_http_variable_proxy_protocol_addr, - offsetof(ngx_proxy_protocol_t, dst_addr), 0, 0 }, - - { ngx_string("proxy_protocol_server_port"), NULL, - ngx_http_variable_proxy_protocol_port, - offsetof(ngx_proxy_protocol_t, dst_port), 0, 0 }, - - { ngx_string("proxy_protocol_tlv_"), NULL, - ngx_http_variable_proxy_protocol_tlv, - 0, NGX_HTTP_VAR_PREFIX, 0 }, - - { ngx_string("server_addr"), NULL, ngx_http_variable_server_addr, 0, 0, 0 }, - - { ngx_string("server_port"), NULL, ngx_http_variable_server_port, 0, 0, 0 }, - - { ngx_string("server_protocol"), NULL, ngx_http_variable_request, - offsetof(ngx_http_request_t, http_protocol), 0, 0 }, - - { ngx_string("scheme"), NULL, ngx_http_variable_scheme, 0, 0, 0 }, - - { ngx_string("https"), NULL, ngx_http_variable_https, 0, 0, 0 }, - - { ngx_string("request_port"), NULL, - ngx_http_variable_request_port, 0, 0, 0 }, - - { ngx_string("is_request_port"), NULL, - ngx_http_variable_is_request_port, 0, 0, 0 }, - - { ngx_string("request_uri"), NULL, ngx_http_variable_request, - offsetof(ngx_http_request_t, unparsed_uri), 0, 0 }, - - { ngx_string("uri"), NULL, ngx_http_variable_request, - offsetof(ngx_http_request_t, uri), - NGX_HTTP_VAR_NOCACHEABLE, 0 }, - - { ngx_string("document_uri"), NULL, ngx_http_variable_request, - offsetof(ngx_http_request_t, uri), - NGX_HTTP_VAR_NOCACHEABLE, 0 }, - - { ngx_string("request"), NULL, ngx_http_variable_request_line, 0, 0, 0 }, - - { ngx_string("document_root"), NULL, - ngx_http_variable_document_root, 0, NGX_HTTP_VAR_NOCACHEABLE, 0 }, - - { ngx_string("realpath_root"), NULL, - ngx_http_variable_realpath_root, 0, NGX_HTTP_VAR_NOCACHEABLE, 0 }, - - { ngx_string("query_string"), NULL, ngx_http_variable_request, - offsetof(ngx_http_request_t, args), - NGX_HTTP_VAR_NOCACHEABLE, 0 }, - - { ngx_string("args"), - ngx_http_variable_set_args, - ngx_http_variable_request, - offsetof(ngx_http_request_t, args), - NGX_HTTP_VAR_CHANGEABLE|NGX_HTTP_VAR_NOCACHEABLE, 0 }, - - { ngx_string("is_args"), NULL, ngx_http_variable_is_args, - 0, NGX_HTTP_VAR_NOCACHEABLE, 0 }, - - { ngx_string("request_filename"), NULL, - ngx_http_variable_request_filename, 0, - NGX_HTTP_VAR_NOCACHEABLE, 0 }, - - { ngx_string("server_name"), NULL, ngx_http_variable_server_name, 0, 0, 0 }, - - { ngx_string("request_method"), NULL, - ngx_http_variable_request_method, 0, - NGX_HTTP_VAR_NOCACHEABLE, 0 }, - - { ngx_string("remote_user"), NULL, ngx_http_variable_remote_user, 0, 0, 0 }, - - { ngx_string("bytes_sent"), NULL, ngx_http_variable_bytes_sent, - 0, 0, 0 }, - - { ngx_string("body_bytes_sent"), NULL, ngx_http_variable_body_bytes_sent, - 0, 0, 0 }, - - { ngx_string("pipe"), NULL, ngx_http_variable_pipe, - 0, 0, 0 }, - - { ngx_string("request_completion"), NULL, - ngx_http_variable_request_completion, - 0, 0, 0 }, - - { ngx_string("request_body"), NULL, - ngx_http_variable_request_body, - 0, 0, 0 }, - - { ngx_string("request_body_file"), NULL, - ngx_http_variable_request_body_file, - 0, 0, 0 }, - - { ngx_string("request_length"), NULL, ngx_http_variable_request_length, - 0, NGX_HTTP_VAR_NOCACHEABLE, 0 }, - - { ngx_string("request_time"), NULL, ngx_http_variable_request_time, - 0, NGX_HTTP_VAR_NOCACHEABLE, 0 }, - - { ngx_string("request_id"), NULL, - ngx_http_variable_request_id, - 0, 0, 0 }, - - { ngx_string("status"), NULL, - ngx_http_variable_status, 0, - NGX_HTTP_VAR_NOCACHEABLE, 0 }, - - { ngx_string("sent_http_content_type"), NULL, - ngx_http_variable_sent_content_type, 0, 0, 0 }, - - { ngx_string("sent_http_content_length"), NULL, - ngx_http_variable_sent_content_length, 0, 0, 0 }, - - { ngx_string("sent_http_location"), NULL, - ngx_http_variable_sent_location, 0, 0, 0 }, - - { ngx_string("sent_http_last_modified"), NULL, - ngx_http_variable_sent_last_modified, 0, 0, 0 }, - - { ngx_string("sent_http_connection"), NULL, - ngx_http_variable_sent_connection, 0, 0, 0 }, - - { ngx_string("sent_http_keep_alive"), NULL, - ngx_http_variable_sent_keep_alive, 0, 0, 0 }, - - { ngx_string("sent_http_transfer_encoding"), NULL, - ngx_http_variable_sent_transfer_encoding, 0, 0, 0 }, - - { ngx_string("sent_http_cache_control"), NULL, ngx_http_variable_header, - offsetof(ngx_http_request_t, headers_out.cache_control), 0, 0 }, - - { ngx_string("sent_http_link"), NULL, ngx_http_variable_header, - offsetof(ngx_http_request_t, headers_out.link), 0, 0 }, - - { ngx_string("limit_rate"), ngx_http_variable_set_limit_rate, - ngx_http_variable_request_get_size, - offsetof(ngx_http_request_t, limit_rate), - NGX_HTTP_VAR_CHANGEABLE|NGX_HTTP_VAR_NOCACHEABLE, 0 }, - - { ngx_string("connection"), NULL, - ngx_http_variable_connection, 0, 0, 0 }, - - { ngx_string("connection_requests"), NULL, - ngx_http_variable_connection_requests, 0, 0, 0 }, - - { ngx_string("connection_time"), NULL, ngx_http_variable_connection_time, - 0, NGX_HTTP_VAR_NOCACHEABLE, 0 }, - - { ngx_string("nginx_version"), NULL, ngx_http_variable_nginx_version, - 0, 0, 0 }, - - { ngx_string("hostname"), NULL, ngx_http_variable_hostname, - 0, 0, 0 }, - - { ngx_string("pid"), NULL, ngx_http_variable_pid, - 0, 0, 0 }, - - { ngx_string("msec"), NULL, ngx_http_variable_msec, - 0, NGX_HTTP_VAR_NOCACHEABLE, 0 }, - - { ngx_string("time_iso8601"), NULL, ngx_http_variable_time_iso8601, - 0, NGX_HTTP_VAR_NOCACHEABLE, 0 }, - - { ngx_string("time_local"), NULL, ngx_http_variable_time_local, - 0, NGX_HTTP_VAR_NOCACHEABLE, 0 }, - -#if (NGX_HAVE_TCP_INFO) - { ngx_string("tcpinfo_rtt"), NULL, ngx_http_variable_tcpinfo, - 0, NGX_HTTP_VAR_NOCACHEABLE, 0 }, - - { ngx_string("tcpinfo_rttvar"), NULL, ngx_http_variable_tcpinfo, - 1, NGX_HTTP_VAR_NOCACHEABLE, 0 }, - - { ngx_string("tcpinfo_snd_cwnd"), NULL, ngx_http_variable_tcpinfo, - 2, NGX_HTTP_VAR_NOCACHEABLE, 0 }, - - { ngx_string("tcpinfo_rcv_space"), NULL, ngx_http_variable_tcpinfo, - 3, NGX_HTTP_VAR_NOCACHEABLE, 0 }, -#endif - - { ngx_string("http_"), NULL, ngx_http_variable_unknown_header_in, - 0, NGX_HTTP_VAR_PREFIX, 0 }, - - { ngx_string("sent_http_"), NULL, ngx_http_variable_unknown_header_out, - 0, NGX_HTTP_VAR_PREFIX, 0 }, - - { ngx_string("sent_trailer_"), NULL, ngx_http_variable_unknown_trailer_out, - 0, NGX_HTTP_VAR_PREFIX, 0 }, - - { ngx_string("cookie_"), NULL, ngx_http_variable_cookie, - 0, NGX_HTTP_VAR_PREFIX, 0 }, - - { ngx_string("arg_"), NULL, ngx_http_variable_argument, - 0, NGX_HTTP_VAR_NOCACHEABLE|NGX_HTTP_VAR_PREFIX, 0 }, - - ngx_http_null_variable -}; - - -ngx_http_variable_value_t ngx_http_variable_null_value = - ngx_http_variable(""); -ngx_http_variable_value_t ngx_http_variable_true_value = - ngx_http_variable("1"); - - -static ngx_uint_t ngx_http_variable_depth = 100; - - -ngx_http_variable_t * -ngx_http_add_variable(ngx_conf_t *cf, ngx_str_t *name, ngx_uint_t flags) -{ - ngx_int_t rc; - ngx_uint_t i; - ngx_hash_key_t *key; - ngx_http_variable_t *v; - ngx_http_core_main_conf_t *cmcf; - - if (name->len == 0) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "invalid variable name \"$\""); - return NULL; - } - - if (flags & NGX_HTTP_VAR_PREFIX) { - return ngx_http_add_prefix_variable(cf, name, flags); - } - - cmcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_core_module); - - key = cmcf->variables_keys->keys.elts; - for (i = 0; i < cmcf->variables_keys->keys.nelts; i++) { - if (name->len != key[i].key.len - || ngx_strncasecmp(name->data, key[i].key.data, name->len) != 0) - { - continue; - } - - v = key[i].value; - - if (!(v->flags & NGX_HTTP_VAR_CHANGEABLE)) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "the duplicate \"%V\" variable", name); - return NULL; - } - - if (!(flags & NGX_HTTP_VAR_WEAK)) { - v->flags &= ~NGX_HTTP_VAR_WEAK; - } - - return v; - } - - v = ngx_palloc(cf->pool, sizeof(ngx_http_variable_t)); - if (v == NULL) { - return NULL; - } - - v->name.len = name->len; - v->name.data = ngx_pnalloc(cf->pool, name->len); - if (v->name.data == NULL) { - return NULL; - } - - ngx_strlow(v->name.data, name->data, name->len); - - v->set_handler = NULL; - v->get_handler = NULL; - v->data = 0; - v->flags = flags; - v->index = 0; - - rc = ngx_hash_add_key(cmcf->variables_keys, &v->name, v, 0); - - if (rc == NGX_ERROR) { - return NULL; - } - - if (rc == NGX_BUSY) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "conflicting variable name \"%V\"", name); - return NULL; - } - - return v; -} - - -static ngx_http_variable_t * -ngx_http_add_prefix_variable(ngx_conf_t *cf, ngx_str_t *name, ngx_uint_t flags) -{ - ngx_uint_t i; - ngx_http_variable_t *v; - ngx_http_core_main_conf_t *cmcf; - - cmcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_core_module); - - v = cmcf->prefix_variables.elts; - for (i = 0; i < cmcf->prefix_variables.nelts; i++) { - if (name->len != v[i].name.len - || ngx_strncasecmp(name->data, v[i].name.data, name->len) != 0) - { - continue; - } - - v = &v[i]; - - if (!(v->flags & NGX_HTTP_VAR_CHANGEABLE)) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "the duplicate \"%V\" variable", name); - return NULL; - } - - if (!(flags & NGX_HTTP_VAR_WEAK)) { - v->flags &= ~NGX_HTTP_VAR_WEAK; - } - - return v; - } - - v = ngx_array_push(&cmcf->prefix_variables); - if (v == NULL) { - return NULL; - } - - v->name.len = name->len; - v->name.data = ngx_pnalloc(cf->pool, name->len); - if (v->name.data == NULL) { - return NULL; - } - - ngx_strlow(v->name.data, name->data, name->len); - - v->set_handler = NULL; - v->get_handler = NULL; - v->data = 0; - v->flags = flags; - v->index = 0; - - return v; -} - - -ngx_int_t -ngx_http_get_variable_index(ngx_conf_t *cf, ngx_str_t *name) -{ - ngx_uint_t i; - ngx_http_variable_t *v; - ngx_http_core_main_conf_t *cmcf; - - if (name->len == 0) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "invalid variable name \"$\""); - return NGX_ERROR; - } - - cmcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_core_module); - - v = cmcf->variables.elts; - - if (v == NULL) { - if (ngx_array_init(&cmcf->variables, cf->pool, 4, - sizeof(ngx_http_variable_t)) - != NGX_OK) - { - return NGX_ERROR; - } - - } else { - for (i = 0; i < cmcf->variables.nelts; i++) { - if (name->len != v[i].name.len - || ngx_strncasecmp(name->data, v[i].name.data, name->len) != 0) - { - continue; - } - - return i; - } - } - - v = ngx_array_push(&cmcf->variables); - if (v == NULL) { - return NGX_ERROR; - } - - v->name.len = name->len; - v->name.data = ngx_pnalloc(cf->pool, name->len); - if (v->name.data == NULL) { - return NGX_ERROR; - } - - ngx_strlow(v->name.data, name->data, name->len); - - v->set_handler = NULL; - v->get_handler = NULL; - v->data = 0; - v->flags = 0; - v->index = cmcf->variables.nelts - 1; - - return v->index; -} - - -ngx_http_variable_value_t * -ngx_http_get_indexed_variable(ngx_http_request_t *r, ngx_uint_t index) -{ - ngx_http_variable_t *v; - ngx_http_core_main_conf_t *cmcf; - - cmcf = ngx_http_get_module_main_conf(r, ngx_http_core_module); - - if (cmcf->variables.nelts <= index) { - ngx_log_error(NGX_LOG_ALERT, r->connection->log, 0, - "unknown variable index: %ui", index); - return NULL; - } - - if (r->variables[index].not_found || r->variables[index].valid) { - return &r->variables[index]; - } - - v = cmcf->variables.elts; - - if (ngx_http_variable_depth == 0) { - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "cycle while evaluating variable \"%V\"", - &v[index].name); - return NULL; - } - - ngx_http_variable_depth--; - - if (v[index].get_handler(r, &r->variables[index], v[index].data) - == NGX_OK) - { - ngx_http_variable_depth++; - - if (v[index].flags & NGX_HTTP_VAR_NOCACHEABLE) { - r->variables[index].no_cacheable = 1; - } - - return &r->variables[index]; - } - - ngx_http_variable_depth++; - - r->variables[index].valid = 0; - r->variables[index].not_found = 1; - - return NULL; -} - - -ngx_http_variable_value_t * -ngx_http_get_flushed_variable(ngx_http_request_t *r, ngx_uint_t index) -{ - ngx_http_variable_value_t *v; - - v = &r->variables[index]; - - if (v->valid || v->not_found) { - if (!v->no_cacheable) { - return v; - } - - v->valid = 0; - v->not_found = 0; - } - - return ngx_http_get_indexed_variable(r, index); -} - - -ngx_http_variable_value_t * -ngx_http_get_variable(ngx_http_request_t *r, ngx_str_t *name, ngx_uint_t key) -{ - size_t len; - ngx_uint_t i, n; - ngx_http_variable_t *v; - ngx_http_variable_value_t *vv; - ngx_http_core_main_conf_t *cmcf; - - cmcf = ngx_http_get_module_main_conf(r, ngx_http_core_module); - - v = ngx_hash_find(&cmcf->variables_hash, key, name->data, name->len); - - if (v) { - if (v->flags & NGX_HTTP_VAR_INDEXED) { - return ngx_http_get_flushed_variable(r, v->index); - } - - if (ngx_http_variable_depth == 0) { - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "cycle while evaluating variable \"%V\"", name); - return NULL; - } - - ngx_http_variable_depth--; - - vv = ngx_palloc(r->pool, sizeof(ngx_http_variable_value_t)); - - if (vv && v->get_handler(r, vv, v->data) == NGX_OK) { - ngx_http_variable_depth++; - return vv; - } - - ngx_http_variable_depth++; - return NULL; - } - - vv = ngx_palloc(r->pool, sizeof(ngx_http_variable_value_t)); - if (vv == NULL) { - return NULL; - } - - len = 0; - - v = cmcf->prefix_variables.elts; - n = cmcf->prefix_variables.nelts; - - for (i = 0; i < cmcf->prefix_variables.nelts; i++) { - if (name->len >= v[i].name.len && name->len > len - && ngx_strncmp(name->data, v[i].name.data, v[i].name.len) == 0) - { - len = v[i].name.len; - n = i; - } - } - - if (n != cmcf->prefix_variables.nelts) { - if (v[n].get_handler(r, vv, (uintptr_t) name) == NGX_OK) { - return vv; - } - - return NULL; - } - - vv->not_found = 1; - - return vv; -} - - -static ngx_int_t -ngx_http_variable_request(ngx_http_request_t *r, ngx_http_variable_value_t *v, - uintptr_t data) -{ - ngx_str_t *s; - - s = (ngx_str_t *) ((char *) r + data); - - if (s->data) { - v->len = s->len; - v->valid = 1; - v->no_cacheable = 0; - v->not_found = 0; - v->data = s->data; - - } else { - v->not_found = 1; - } - - return NGX_OK; -} - - -#if 0 - -static void -ngx_http_variable_request_set(ngx_http_request_t *r, - ngx_http_variable_value_t *v, uintptr_t data) -{ - ngx_str_t *s; - - s = (ngx_str_t *) ((char *) r + data); - - s->len = v->len; - s->data = v->data; -} - -#endif - - -static ngx_int_t -ngx_http_variable_request_get_size(ngx_http_request_t *r, - ngx_http_variable_value_t *v, uintptr_t data) -{ - size_t *sp; - - sp = (size_t *) ((char *) r + data); - - v->data = ngx_pnalloc(r->pool, NGX_SIZE_T_LEN); - if (v->data == NULL) { - return NGX_ERROR; - } - - v->len = ngx_sprintf(v->data, "%uz", *sp) - v->data; - v->valid = 1; - v->no_cacheable = 0; - v->not_found = 0; - - return NGX_OK; -} - - -static ngx_int_t -ngx_http_variable_header(ngx_http_request_t *r, ngx_http_variable_value_t *v, - uintptr_t data) -{ - return ngx_http_variable_headers_internal(r, v, data, ','); -} - - -static ngx_int_t -ngx_http_variable_cookies(ngx_http_request_t *r, - ngx_http_variable_value_t *v, uintptr_t data) -{ - return ngx_http_variable_headers_internal(r, v, data, ';'); -} - - -static ngx_int_t -ngx_http_variable_headers_internal(ngx_http_request_t *r, - ngx_http_variable_value_t *v, uintptr_t data, u_char sep) -{ - size_t len; - u_char *p, *end; - ngx_table_elt_t *h, *th; - - h = *(ngx_table_elt_t **) ((char *) r + data); - - len = 0; - - for (th = h; th; th = th->next) { - - if (th->hash == 0) { - continue; - } - - len += th->value.len + 2; - } - - if (len == 0) { - v->not_found = 1; - return NGX_OK; - } - - len -= 2; - - v->valid = 1; - v->no_cacheable = 0; - v->not_found = 0; - - if (h->next == NULL) { - v->len = h->value.len; - v->data = h->value.data; - - return NGX_OK; - } - - p = ngx_pnalloc(r->pool, len); - if (p == NULL) { - return NGX_ERROR; - } - - v->len = len; - v->data = p; - - end = p + len; - - for (th = h; th; th = th->next) { - - if (th->hash == 0) { - continue; - } - - p = ngx_copy(p, th->value.data, th->value.len); - - if (p == end) { - break; - } - - *p++ = sep; *p++ = ' '; - } - - return NGX_OK; -} - - -static ngx_int_t -ngx_http_variable_unknown_header_in(ngx_http_request_t *r, - ngx_http_variable_value_t *v, uintptr_t data) -{ - return ngx_http_variable_unknown_header(r, v, (ngx_str_t *) data, - &r->headers_in.headers.part, - sizeof("http_") - 1); -} - - -static ngx_int_t -ngx_http_variable_unknown_header_out(ngx_http_request_t *r, - ngx_http_variable_value_t *v, uintptr_t data) -{ - return ngx_http_variable_unknown_header(r, v, (ngx_str_t *) data, - &r->headers_out.headers.part, - sizeof("sent_http_") - 1); -} - - -static ngx_int_t -ngx_http_variable_unknown_trailer_out(ngx_http_request_t *r, - ngx_http_variable_value_t *v, uintptr_t data) -{ - return ngx_http_variable_unknown_header(r, v, (ngx_str_t *) data, - &r->headers_out.trailers.part, - sizeof("sent_trailer_") - 1); -} - - -ngx_int_t -ngx_http_variable_unknown_header(ngx_http_request_t *r, - ngx_http_variable_value_t *v, ngx_str_t *var, - ngx_list_part_t *part, size_t prefix) -{ - u_char *p, ch; - size_t len; - ngx_uint_t i, n; - ngx_table_elt_t *header, *h, **ph; - - ph = &h; -#if (NGX_SUPPRESS_WARN) - len = 0; -#endif - - header = part->elts; - - for (i = 0; /* void */ ; i++) { - - if (i >= part->nelts) { - if (part->next == NULL) { - break; - } - - part = part->next; - header = part->elts; - i = 0; - } - - if (header[i].hash == 0) { - continue; - } - - if (header[i].key.len != var->len - prefix) { - continue; - } - - for (n = 0; n < var->len - prefix; n++) { - ch = header[i].key.data[n]; - - if (ch >= 'A' && ch <= 'Z') { - ch |= 0x20; - - } else if (ch == '-') { - ch = '_'; - } - - if (var->data[n + prefix] != ch) { - break; - } - } - - if (n != var->len - prefix) { - continue; - } - - len += header[i].value.len + 2; - - *ph = &header[i]; - ph = &header[i].next; - } - - *ph = NULL; - - if (h == NULL) { - v->not_found = 1; - return NGX_OK; - } - - len -= 2; - - if (h->next == NULL) { - - v->len = h->value.len; - v->valid = 1; - v->no_cacheable = 0; - v->not_found = 0; - v->data = h->value.data; - - return NGX_OK; - } - - p = ngx_pnalloc(r->pool, len); - if (p == NULL) { - return NGX_ERROR; - } - - v->len = len; - v->valid = 1; - v->no_cacheable = 0; - v->not_found = 0; - v->data = p; - - for ( ;; ) { - - p = ngx_copy(p, h->value.data, h->value.len); - - if (h->next == NULL) { - break; - } - - *p++ = ','; *p++ = ' '; - - h = h->next; - } - - return NGX_OK; -} - - -static ngx_int_t -ngx_http_variable_request_line(ngx_http_request_t *r, - ngx_http_variable_value_t *v, uintptr_t data) -{ - u_char *p, *s; - - s = r->request_line.data; - - if (s == NULL) { - s = r->request_start; - - if (s == NULL) { - v->not_found = 1; - return NGX_OK; - } - - for (p = s; p < r->header_in->last; p++) { - if (*p == CR || *p == LF) { - break; - } - } - - r->request_line.len = p - s; - r->request_line.data = s; - } - - v->len = r->request_line.len; - v->valid = 1; - v->no_cacheable = 0; - v->not_found = 0; - v->data = s; - - return NGX_OK; -} - - -static ngx_int_t -ngx_http_variable_cookie(ngx_http_request_t *r, ngx_http_variable_value_t *v, - uintptr_t data) -{ - ngx_str_t *name = (ngx_str_t *) data; - - ngx_str_t cookie, s; - - s.len = name->len - (sizeof("cookie_") - 1); - s.data = name->data + sizeof("cookie_") - 1; - - if (ngx_http_parse_cookie_lines(r, r->headers_in.cookie, &s, &cookie) - == NULL) - { - v->not_found = 1; - return NGX_OK; - } - - v->len = cookie.len; - v->valid = 1; - v->no_cacheable = 0; - v->not_found = 0; - v->data = cookie.data; - - return NGX_OK; -} - - -static ngx_int_t -ngx_http_variable_argument(ngx_http_request_t *r, ngx_http_variable_value_t *v, - uintptr_t data) -{ - ngx_str_t *name = (ngx_str_t *) data; - - u_char *arg; - size_t len; - ngx_str_t value; - - len = name->len - (sizeof("arg_") - 1); - arg = name->data + sizeof("arg_") - 1; - - if (len == 0 || ngx_http_arg(r, arg, len, &value) != NGX_OK) { - v->not_found = 1; - return NGX_OK; - } - - v->data = value.data; - v->len = value.len; - v->valid = 1; - v->no_cacheable = 0; - v->not_found = 0; - - return NGX_OK; -} - - -#if (NGX_HAVE_TCP_INFO) - -static ngx_int_t -ngx_http_variable_tcpinfo(ngx_http_request_t *r, ngx_http_variable_value_t *v, - uintptr_t data) -{ - struct tcp_info ti; - socklen_t len; - uint32_t value; - - len = sizeof(struct tcp_info); - if (getsockopt(r->connection->fd, IPPROTO_TCP, TCP_INFO, &ti, &len) == -1) { - v->not_found = 1; - return NGX_OK; - } - - v->data = ngx_pnalloc(r->pool, NGX_INT32_LEN); - if (v->data == NULL) { - return NGX_ERROR; - } - - switch (data) { - case 0: - value = ti.tcpi_rtt; - break; - - case 1: - value = ti.tcpi_rttvar; - break; - - case 2: - value = ti.tcpi_snd_cwnd; - break; - - case 3: - value = ti.tcpi_rcv_space; - break; - - /* suppress warning */ - default: - value = 0; - break; - } - - v->len = ngx_sprintf(v->data, "%uD", value) - v->data; - v->valid = 1; - v->no_cacheable = 0; - v->not_found = 0; - - return NGX_OK; -} - -#endif - - -static ngx_int_t -ngx_http_variable_content_length(ngx_http_request_t *r, - ngx_http_variable_value_t *v, uintptr_t data) -{ - u_char *p; - - if (r->headers_in.content_length) { - v->len = r->headers_in.content_length->value.len; - v->data = r->headers_in.content_length->value.data; - v->valid = 1; - v->no_cacheable = 0; - v->not_found = 0; - - } else if (r->reading_body) { - v->not_found = 1; - v->no_cacheable = 1; - - } else if (r->headers_in.content_length_n >= 0) { - p = ngx_pnalloc(r->pool, NGX_OFF_T_LEN); - if (p == NULL) { - return NGX_ERROR; - } - - v->len = ngx_sprintf(p, "%O", r->headers_in.content_length_n) - p; - v->data = p; - v->valid = 1; - v->no_cacheable = 0; - v->not_found = 0; - - } else if (r->headers_in.chunked) { - v->not_found = 1; - v->no_cacheable = 1; - - } else { - v->not_found = 1; - } - - return NGX_OK; -} - - -static ngx_int_t -ngx_http_variable_host(ngx_http_request_t *r, ngx_http_variable_value_t *v, - uintptr_t data) -{ - ngx_http_core_srv_conf_t *cscf; - - if (r->headers_in.server.len) { - v->len = r->headers_in.server.len; - v->data = r->headers_in.server.data; - - } else { - cscf = ngx_http_get_module_srv_conf(r, ngx_http_core_module); - - v->len = cscf->server_name.len; - v->data = cscf->server_name.data; - } - - v->valid = 1; - v->no_cacheable = 0; - v->not_found = 0; - - return NGX_OK; -} - - -static ngx_int_t -ngx_http_variable_binary_remote_addr(ngx_http_request_t *r, - ngx_http_variable_value_t *v, uintptr_t data) -{ - struct sockaddr_in *sin; -#if (NGX_HAVE_INET6) - struct sockaddr_in6 *sin6; -#endif - - switch (r->connection->sockaddr->sa_family) { - -#if (NGX_HAVE_INET6) - case AF_INET6: - sin6 = (struct sockaddr_in6 *) r->connection->sockaddr; - - v->len = sizeof(struct in6_addr); - v->valid = 1; - v->no_cacheable = 0; - v->not_found = 0; - v->data = sin6->sin6_addr.s6_addr; - - break; -#endif - -#if (NGX_HAVE_UNIX_DOMAIN) - case AF_UNIX: - - v->len = r->connection->addr_text.len; - v->valid = 1; - v->no_cacheable = 0; - v->not_found = 0; - v->data = r->connection->addr_text.data; - - break; -#endif - - default: /* AF_INET */ - sin = (struct sockaddr_in *) r->connection->sockaddr; - - v->len = sizeof(in_addr_t); - v->valid = 1; - v->no_cacheable = 0; - v->not_found = 0; - v->data = (u_char *) &sin->sin_addr; - - break; - } - - return NGX_OK; -} - - -static ngx_int_t -ngx_http_variable_remote_addr(ngx_http_request_t *r, - ngx_http_variable_value_t *v, uintptr_t data) -{ - v->len = r->connection->addr_text.len; - v->valid = 1; - v->no_cacheable = 0; - v->not_found = 0; - v->data = r->connection->addr_text.data; - - return NGX_OK; -} - - -static ngx_int_t -ngx_http_variable_remote_port(ngx_http_request_t *r, - ngx_http_variable_value_t *v, uintptr_t data) -{ - ngx_uint_t port; - - v->len = 0; - v->valid = 1; - v->no_cacheable = 0; - v->not_found = 0; - - v->data = ngx_pnalloc(r->pool, sizeof("65535") - 1); - if (v->data == NULL) { - return NGX_ERROR; - } - - port = ngx_inet_get_port(r->connection->sockaddr); - - if (port > 0 && port < 65536) { - v->len = ngx_sprintf(v->data, "%ui", port) - v->data; - } - - return NGX_OK; -} - - -static ngx_int_t -ngx_http_variable_proxy_protocol_addr(ngx_http_request_t *r, - ngx_http_variable_value_t *v, uintptr_t data) -{ - ngx_str_t *addr; - ngx_proxy_protocol_t *pp; - - pp = r->connection->proxy_protocol; - if (pp == NULL) { - v->not_found = 1; - return NGX_OK; - } - - addr = (ngx_str_t *) ((char *) pp + data); - - v->len = addr->len; - v->valid = 1; - v->no_cacheable = 0; - v->not_found = 0; - v->data = addr->data; - - return NGX_OK; -} - - -static ngx_int_t -ngx_http_variable_proxy_protocol_port(ngx_http_request_t *r, - ngx_http_variable_value_t *v, uintptr_t data) -{ - ngx_uint_t port; - ngx_proxy_protocol_t *pp; - - pp = r->connection->proxy_protocol; - if (pp == NULL) { - v->not_found = 1; - return NGX_OK; - } - - v->len = 0; - v->valid = 1; - v->no_cacheable = 0; - v->not_found = 0; - - v->data = ngx_pnalloc(r->pool, sizeof("65535") - 1); - if (v->data == NULL) { - return NGX_ERROR; - } - - port = *(in_port_t *) ((char *) pp + data); - - if (port > 0 && port < 65536) { - v->len = ngx_sprintf(v->data, "%ui", port) - v->data; - } - - return NGX_OK; -} - - -static ngx_int_t -ngx_http_variable_proxy_protocol_tlv(ngx_http_request_t *r, - ngx_http_variable_value_t *v, uintptr_t data) -{ - ngx_str_t *name = (ngx_str_t *) data; - - ngx_int_t rc; - ngx_str_t tlv, value; - - tlv.len = name->len - (sizeof("proxy_protocol_tlv_") - 1); - tlv.data = name->data + sizeof("proxy_protocol_tlv_") - 1; - - rc = ngx_proxy_protocol_get_tlv(r->connection, &tlv, &value); - - if (rc == NGX_ERROR) { - return NGX_ERROR; - } - - if (rc == NGX_DECLINED) { - v->not_found = 1; - return NGX_OK; - } - - v->len = value.len; - v->valid = 1; - v->no_cacheable = 0; - v->not_found = 0; - v->data = value.data; - - return NGX_OK; -} - - -static ngx_int_t -ngx_http_variable_server_addr(ngx_http_request_t *r, - ngx_http_variable_value_t *v, uintptr_t data) -{ - ngx_str_t s; - u_char addr[NGX_SOCKADDR_STRLEN]; - - s.len = NGX_SOCKADDR_STRLEN; - s.data = addr; - - if (ngx_connection_local_sockaddr(r->connection, &s, 0) != NGX_OK) { - return NGX_ERROR; - } - - s.data = ngx_pnalloc(r->pool, s.len); - if (s.data == NULL) { - return NGX_ERROR; - } - - ngx_memcpy(s.data, addr, s.len); - - v->len = s.len; - v->valid = 1; - v->no_cacheable = 0; - v->not_found = 0; - v->data = s.data; - - return NGX_OK; -} - - -static ngx_int_t -ngx_http_variable_server_port(ngx_http_request_t *r, - ngx_http_variable_value_t *v, uintptr_t data) -{ - ngx_uint_t port; - - v->len = 0; - v->valid = 1; - v->no_cacheable = 0; - v->not_found = 0; - - if (ngx_connection_local_sockaddr(r->connection, NULL, 0) != NGX_OK) { - return NGX_ERROR; - } - - v->data = ngx_pnalloc(r->pool, sizeof("65535") - 1); - if (v->data == NULL) { - return NGX_ERROR; - } - - port = ngx_inet_get_port(r->connection->local_sockaddr); - - if (port > 0 && port < 65536) { - v->len = ngx_sprintf(v->data, "%ui", port) - v->data; - } - - return NGX_OK; -} - - -static ngx_int_t -ngx_http_variable_scheme(ngx_http_request_t *r, - ngx_http_variable_value_t *v, uintptr_t data) -{ -#if (NGX_HTTP_SSL) - - if (r->connection->ssl) { - v->len = sizeof("https") - 1; - v->valid = 1; - v->no_cacheable = 0; - v->not_found = 0; - v->data = (u_char *) "https"; - - return NGX_OK; - } - -#endif - - v->len = sizeof("http") - 1; - v->valid = 1; - v->no_cacheable = 0; - v->not_found = 0; - v->data = (u_char *) "http"; - - return NGX_OK; -} - - -static ngx_int_t -ngx_http_variable_https(ngx_http_request_t *r, - ngx_http_variable_value_t *v, uintptr_t data) -{ -#if (NGX_HTTP_SSL) - - if (r->connection->ssl) { - v->len = sizeof("on") - 1; - v->valid = 1; - v->no_cacheable = 0; - v->not_found = 0; - v->data = (u_char *) "on"; - - return NGX_OK; - } - -#endif - - *v = ngx_http_variable_null_value; - - return NGX_OK; -} - - -static ngx_int_t -ngx_http_variable_request_port(ngx_http_request_t *r, - ngx_http_variable_value_t *v, uintptr_t data) -{ - ngx_uint_t port; - - v->len = 0; - v->valid = 1; - v->no_cacheable = 0; - v->not_found = 0; - - v->data = ngx_pnalloc(r->pool, sizeof("65535") - 1); - if (v->data == NULL) { - return NGX_ERROR; - } - - port = r->port; - - if (port > 0 && port < 65536) { - v->len = ngx_sprintf(v->data, "%ui", port) - v->data; - } - - return NGX_OK; -} - - -static ngx_int_t -ngx_http_variable_is_request_port(ngx_http_request_t *r, - ngx_http_variable_value_t *v, uintptr_t data) -{ - if (r->port == 0) { - *v = ngx_http_variable_null_value; - return NGX_OK; - } - - v->len = 1; - v->valid = 1; - v->no_cacheable = 0; - v->not_found = 0; - v->data = (u_char *) ":"; - - return NGX_OK; -} - - -static void -ngx_http_variable_set_args(ngx_http_request_t *r, - ngx_http_variable_value_t *v, uintptr_t data) -{ - r->args.len = v->len; - r->args.data = v->data; - r->valid_unparsed_uri = 0; -} - - -static ngx_int_t -ngx_http_variable_is_args(ngx_http_request_t *r, - ngx_http_variable_value_t *v, uintptr_t data) -{ - if (r->args.len == 0) { - *v = ngx_http_variable_null_value; - return NGX_OK; - } - - v->len = 1; - v->valid = 1; - v->no_cacheable = 0; - v->not_found = 0; - v->data = (u_char *) "?"; - - return NGX_OK; -} - - -static ngx_int_t -ngx_http_variable_document_root(ngx_http_request_t *r, - ngx_http_variable_value_t *v, uintptr_t data) -{ - ngx_str_t path; - ngx_http_core_loc_conf_t *clcf; - - clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module); - - if (clcf->root_lengths == NULL) { - v->len = clcf->root.len; - v->valid = 1; - v->no_cacheable = 0; - v->not_found = 0; - v->data = clcf->root.data; - - } else { - if (ngx_http_script_run(r, &path, clcf->root_lengths->elts, 0, - clcf->root_values->elts) - == NULL) - { - return NGX_ERROR; - } - - if (ngx_get_full_name(r->pool, (ngx_str_t *) &ngx_cycle->prefix, &path) - != NGX_OK) - { - return NGX_ERROR; - } - - v->len = path.len; - v->valid = 1; - v->no_cacheable = 0; - v->not_found = 0; - v->data = path.data; - } - - return NGX_OK; -} - - -static ngx_int_t -ngx_http_variable_realpath_root(ngx_http_request_t *r, - ngx_http_variable_value_t *v, uintptr_t data) -{ - u_char *real; - size_t len; - ngx_str_t path; - ngx_http_core_loc_conf_t *clcf; -#if (NGX_HAVE_MAX_PATH) - u_char buffer[NGX_MAX_PATH]; -#endif - - clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module); - - if (clcf->root_lengths == NULL) { - path = clcf->root; - - } else { - if (ngx_http_script_run(r, &path, clcf->root_lengths->elts, 1, - clcf->root_values->elts) - == NULL) - { - return NGX_ERROR; - } - - path.data[path.len - 1] = '\0'; - - if (ngx_get_full_name(r->pool, (ngx_str_t *) &ngx_cycle->prefix, &path) - != NGX_OK) - { - return NGX_ERROR; - } - } - -#if (NGX_HAVE_MAX_PATH) - real = buffer; -#else - real = NULL; -#endif - - real = ngx_realpath(path.data, real); - - if (real == NULL) { - ngx_log_error(NGX_LOG_CRIT, r->connection->log, ngx_errno, - ngx_realpath_n " \"%s\" failed", path.data); - return NGX_ERROR; - } - - len = ngx_strlen(real); - - v->data = ngx_pnalloc(r->pool, len); - if (v->data == NULL) { -#if !(NGX_HAVE_MAX_PATH) - ngx_free(real); -#endif - return NGX_ERROR; - } - - v->len = len; - v->valid = 1; - v->no_cacheable = 0; - v->not_found = 0; - - ngx_memcpy(v->data, real, len); - -#if !(NGX_HAVE_MAX_PATH) - ngx_free(real); -#endif - - return NGX_OK; -} - - -static ngx_int_t -ngx_http_variable_request_filename(ngx_http_request_t *r, - ngx_http_variable_value_t *v, uintptr_t data) -{ - size_t root; - ngx_str_t path; - - if (ngx_http_map_uri_to_path(r, &path, &root, 0) == NULL) { - return NGX_ERROR; - } - - /* ngx_http_map_uri_to_path() allocates memory for terminating '\0' */ - - v->len = path.len - 1; - v->valid = 1; - v->no_cacheable = 0; - v->not_found = 0; - v->data = path.data; - - return NGX_OK; -} - - -static ngx_int_t -ngx_http_variable_server_name(ngx_http_request_t *r, - ngx_http_variable_value_t *v, uintptr_t data) -{ - ngx_http_core_srv_conf_t *cscf; - - cscf = ngx_http_get_module_srv_conf(r, ngx_http_core_module); - - v->len = cscf->server_name.len; - v->valid = 1; - v->no_cacheable = 0; - v->not_found = 0; - v->data = cscf->server_name.data; - - return NGX_OK; -} - - -static ngx_int_t -ngx_http_variable_request_method(ngx_http_request_t *r, - ngx_http_variable_value_t *v, uintptr_t data) -{ - if (r->main->method_name.data) { - v->len = r->main->method_name.len; - v->valid = 1; - v->no_cacheable = 0; - v->not_found = 0; - v->data = r->main->method_name.data; - - } else { - v->not_found = 1; - } - - return NGX_OK; -} - - -static ngx_int_t -ngx_http_variable_remote_user(ngx_http_request_t *r, - ngx_http_variable_value_t *v, uintptr_t data) -{ - ngx_int_t rc; - - rc = ngx_http_auth_basic_user(r); - - if (rc == NGX_DECLINED) { - v->not_found = 1; - return NGX_OK; - } - - if (rc == NGX_ERROR) { - return NGX_ERROR; - } - - v->len = r->headers_in.user.len; - v->valid = 1; - v->no_cacheable = 0; - v->not_found = 0; - v->data = r->headers_in.user.data; - - return NGX_OK; -} - - -static ngx_int_t -ngx_http_variable_bytes_sent(ngx_http_request_t *r, - ngx_http_variable_value_t *v, uintptr_t data) -{ - u_char *p; - - p = ngx_pnalloc(r->pool, NGX_OFF_T_LEN); - if (p == NULL) { - return NGX_ERROR; - } - - v->len = ngx_sprintf(p, "%O", r->connection->sent) - p; - v->valid = 1; - v->no_cacheable = 0; - v->not_found = 0; - v->data = p; - - return NGX_OK; -} - - -static ngx_int_t -ngx_http_variable_body_bytes_sent(ngx_http_request_t *r, - ngx_http_variable_value_t *v, uintptr_t data) -{ - off_t sent; - u_char *p; - - sent = r->connection->sent - r->header_size; - - if (sent < 0) { - sent = 0; - } - - p = ngx_pnalloc(r->pool, NGX_OFF_T_LEN); - if (p == NULL) { - return NGX_ERROR; - } - - v->len = ngx_sprintf(p, "%O", sent) - p; - v->valid = 1; - v->no_cacheable = 0; - v->not_found = 0; - v->data = p; - - return NGX_OK; -} - - -static ngx_int_t -ngx_http_variable_pipe(ngx_http_request_t *r, - ngx_http_variable_value_t *v, uintptr_t data) -{ - v->data = (u_char *) (r->pipeline ? "p" : "."); - v->len = 1; - v->valid = 1; - v->no_cacheable = 0; - v->not_found = 0; - - return NGX_OK; -} - - -static ngx_int_t -ngx_http_variable_status(ngx_http_request_t *r, - ngx_http_variable_value_t *v, uintptr_t data) -{ - ngx_uint_t status; - - v->data = ngx_pnalloc(r->pool, NGX_INT_T_LEN); - if (v->data == NULL) { - return NGX_ERROR; - } - - if (r->err_status) { - status = r->err_status; - - } else if (r->headers_out.status) { - status = r->headers_out.status; - - } else if (r->http_version == NGX_HTTP_VERSION_9) { - status = 9; - - } else { - status = 0; - } - - v->len = ngx_sprintf(v->data, "%03ui", status) - v->data; - v->valid = 1; - v->no_cacheable = 0; - v->not_found = 0; - - return NGX_OK; -} - - -static ngx_int_t -ngx_http_variable_sent_content_type(ngx_http_request_t *r, - ngx_http_variable_value_t *v, uintptr_t data) -{ - if (r->headers_out.content_type.len) { - v->len = r->headers_out.content_type.len; - v->valid = 1; - v->no_cacheable = 0; - v->not_found = 0; - v->data = r->headers_out.content_type.data; - - } else { - v->not_found = 1; - } - - return NGX_OK; -} - - -static ngx_int_t -ngx_http_variable_sent_content_length(ngx_http_request_t *r, - ngx_http_variable_value_t *v, uintptr_t data) -{ - u_char *p; - - if (r->headers_out.content_length) { - v->len = r->headers_out.content_length->value.len; - v->valid = 1; - v->no_cacheable = 0; - v->not_found = 0; - v->data = r->headers_out.content_length->value.data; - - return NGX_OK; - } - - if (r->headers_out.content_length_n >= 0) { - p = ngx_pnalloc(r->pool, NGX_OFF_T_LEN); - if (p == NULL) { - return NGX_ERROR; - } - - v->len = ngx_sprintf(p, "%O", r->headers_out.content_length_n) - p; - v->valid = 1; - v->no_cacheable = 0; - v->not_found = 0; - v->data = p; - - return NGX_OK; - } - - v->not_found = 1; - - return NGX_OK; -} - - -static ngx_int_t -ngx_http_variable_sent_location(ngx_http_request_t *r, - ngx_http_variable_value_t *v, uintptr_t data) -{ - ngx_str_t name; - - if (r->headers_out.location) { - v->len = r->headers_out.location->value.len; - v->valid = 1; - v->no_cacheable = 0; - v->not_found = 0; - v->data = r->headers_out.location->value.data; - - return NGX_OK; - } - - ngx_str_set(&name, "sent_http_location"); - - return ngx_http_variable_unknown_header(r, v, &name, - &r->headers_out.headers.part, - sizeof("sent_http_") - 1); -} - - -static ngx_int_t -ngx_http_variable_sent_last_modified(ngx_http_request_t *r, - ngx_http_variable_value_t *v, uintptr_t data) -{ - u_char *p; - - if (r->headers_out.last_modified) { - v->len = r->headers_out.last_modified->value.len; - v->valid = 1; - v->no_cacheable = 0; - v->not_found = 0; - v->data = r->headers_out.last_modified->value.data; - - return NGX_OK; - } - - if (r->headers_out.last_modified_time >= 0) { - p = ngx_pnalloc(r->pool, sizeof("Mon, 28 Sep 1970 06:00:00 GMT") - 1); - if (p == NULL) { - return NGX_ERROR; - } - - v->len = ngx_http_time(p, r->headers_out.last_modified_time) - p; - v->valid = 1; - v->no_cacheable = 0; - v->not_found = 0; - v->data = p; - - return NGX_OK; - } - - v->not_found = 1; - - return NGX_OK; -} - - -static ngx_int_t -ngx_http_variable_sent_connection(ngx_http_request_t *r, - ngx_http_variable_value_t *v, uintptr_t data) -{ - size_t len; - char *p; - - if (r->headers_out.status == NGX_HTTP_SWITCHING_PROTOCOLS) { - len = sizeof("upgrade") - 1; - p = "upgrade"; - - } else if (r->keepalive) { - len = sizeof("keep-alive") - 1; - p = "keep-alive"; - - } else { - len = sizeof("close") - 1; - p = "close"; - } - - v->len = len; - v->valid = 1; - v->no_cacheable = 0; - v->not_found = 0; - v->data = (u_char *) p; - - return NGX_OK; -} - - -static ngx_int_t -ngx_http_variable_sent_keep_alive(ngx_http_request_t *r, - ngx_http_variable_value_t *v, uintptr_t data) -{ - u_char *p; - ngx_http_core_loc_conf_t *clcf; - - if (r->keepalive) { - clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module); - - if (clcf->keepalive_header) { - - p = ngx_pnalloc(r->pool, sizeof("timeout=") - 1 + NGX_TIME_T_LEN); - if (p == NULL) { - return NGX_ERROR; - } - - v->len = ngx_sprintf(p, "timeout=%T", clcf->keepalive_header) - p; - v->valid = 1; - v->no_cacheable = 0; - v->not_found = 0; - v->data = p; - - return NGX_OK; - } - } - - v->not_found = 1; - - return NGX_OK; -} - - -static ngx_int_t -ngx_http_variable_sent_transfer_encoding(ngx_http_request_t *r, - ngx_http_variable_value_t *v, uintptr_t data) -{ - if (r->chunked) { - v->len = sizeof("chunked") - 1; - v->valid = 1; - v->no_cacheable = 0; - v->not_found = 0; - v->data = (u_char *) "chunked"; - - } else { - v->not_found = 1; - } - - return NGX_OK; -} - - -static void -ngx_http_variable_set_limit_rate(ngx_http_request_t *r, - ngx_http_variable_value_t *v, uintptr_t data) -{ - ssize_t s; - ngx_str_t val; - - val.len = v->len; - val.data = v->data; - - s = ngx_parse_size(&val); - - if (s == NGX_ERROR) { - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "invalid $limit_rate \"%V\"", &val); - return; - } - - r->limit_rate = s; - r->limit_rate_set = 1; -} - - -static ngx_int_t -ngx_http_variable_request_completion(ngx_http_request_t *r, - ngx_http_variable_value_t *v, uintptr_t data) -{ - if (r->request_complete) { - v->len = 2; - v->valid = 1; - v->no_cacheable = 0; - v->not_found = 0; - v->data = (u_char *) "OK"; - - return NGX_OK; - } - - *v = ngx_http_variable_null_value; - - return NGX_OK; -} - - -static ngx_int_t -ngx_http_variable_request_body(ngx_http_request_t *r, - ngx_http_variable_value_t *v, uintptr_t data) -{ - u_char *p; - size_t len; - ngx_buf_t *buf; - ngx_chain_t *cl; - - if (r->request_body == NULL - || r->request_body->bufs == NULL - || r->request_body->temp_file) - { - v->not_found = 1; - - return NGX_OK; - } - - cl = r->request_body->bufs; - buf = cl->buf; - - if (cl->next == NULL) { - v->len = buf->last - buf->pos; - v->valid = 1; - v->no_cacheable = 0; - v->not_found = 0; - v->data = buf->pos; - - return NGX_OK; - } - - len = buf->last - buf->pos; - cl = cl->next; - - for ( /* void */ ; cl; cl = cl->next) { - buf = cl->buf; - len += buf->last - buf->pos; - } - - p = ngx_pnalloc(r->pool, len); - if (p == NULL) { - return NGX_ERROR; - } - - v->data = p; - cl = r->request_body->bufs; - - for ( /* void */ ; cl; cl = cl->next) { - buf = cl->buf; - p = ngx_cpymem(p, buf->pos, buf->last - buf->pos); - } - - v->len = len; - v->valid = 1; - v->no_cacheable = 0; - v->not_found = 0; - - return NGX_OK; -} - - -static ngx_int_t -ngx_http_variable_request_body_file(ngx_http_request_t *r, - ngx_http_variable_value_t *v, uintptr_t data) -{ - if (r->request_body == NULL || r->request_body->temp_file == NULL) { - v->not_found = 1; - - return NGX_OK; - } - - v->len = r->request_body->temp_file->file.name.len; - v->valid = 1; - v->no_cacheable = 0; - v->not_found = 0; - v->data = r->request_body->temp_file->file.name.data; - - return NGX_OK; -} - - -static ngx_int_t -ngx_http_variable_request_length(ngx_http_request_t *r, - ngx_http_variable_value_t *v, uintptr_t data) -{ - u_char *p; - - p = ngx_pnalloc(r->pool, NGX_OFF_T_LEN); - if (p == NULL) { - return NGX_ERROR; - } - - v->len = ngx_sprintf(p, "%O", r->request_length) - p; - v->valid = 1; - v->no_cacheable = 0; - v->not_found = 0; - v->data = p; - - return NGX_OK; -} - - -static ngx_int_t -ngx_http_variable_request_time(ngx_http_request_t *r, - ngx_http_variable_value_t *v, uintptr_t data) -{ - u_char *p; - ngx_time_t *tp; - ngx_msec_int_t ms; - - p = ngx_pnalloc(r->pool, NGX_TIME_T_LEN + 4); - if (p == NULL) { - return NGX_ERROR; - } - - tp = ngx_timeofday(); - - ms = (ngx_msec_int_t) - ((tp->sec - r->start_sec) * 1000 + (tp->msec - r->start_msec)); - ms = ngx_max(ms, 0); - - v->len = ngx_sprintf(p, "%T.%03M", (time_t) ms / 1000, ms % 1000) - p; - v->valid = 1; - v->no_cacheable = 0; - v->not_found = 0; - v->data = p; - - return NGX_OK; -} - - -static ngx_int_t -ngx_http_variable_request_id(ngx_http_request_t *r, - ngx_http_variable_value_t *v, uintptr_t data) -{ - u_char *id; - -#if (NGX_OPENSSL) - u_char random_bytes[16]; -#endif - - id = ngx_pnalloc(r->pool, 32); - if (id == NULL) { - return NGX_ERROR; - } - - v->valid = 1; - v->no_cacheable = 0; - v->not_found = 0; - - v->len = 32; - v->data = id; - -#if (NGX_OPENSSL) - - if (RAND_bytes(random_bytes, 16) == 1) { - ngx_hex_dump(id, random_bytes, 16); - return NGX_OK; - } - - ngx_ssl_error(NGX_LOG_ERR, r->connection->log, 0, "RAND_bytes() failed"); - -#endif - - ngx_sprintf(id, "%08xD%08xD%08xD%08xD", - (uint32_t) ngx_random(), (uint32_t) ngx_random(), - (uint32_t) ngx_random(), (uint32_t) ngx_random()); - - return NGX_OK; -} - - -static ngx_int_t -ngx_http_variable_connection(ngx_http_request_t *r, - ngx_http_variable_value_t *v, uintptr_t data) -{ - u_char *p; - - p = ngx_pnalloc(r->pool, NGX_ATOMIC_T_LEN); - if (p == NULL) { - return NGX_ERROR; - } - - v->len = ngx_sprintf(p, "%uA", r->connection->number) - p; - v->valid = 1; - v->no_cacheable = 0; - v->not_found = 0; - v->data = p; - - return NGX_OK; -} - - -static ngx_int_t -ngx_http_variable_connection_requests(ngx_http_request_t *r, - ngx_http_variable_value_t *v, uintptr_t data) -{ - u_char *p; - - p = ngx_pnalloc(r->pool, NGX_INT_T_LEN); - if (p == NULL) { - return NGX_ERROR; - } - - v->len = ngx_sprintf(p, "%ui", r->connection->requests) - p; - v->valid = 1; - v->no_cacheable = 0; - v->not_found = 0; - v->data = p; - - return NGX_OK; -} - - -static ngx_int_t -ngx_http_variable_connection_time(ngx_http_request_t *r, - ngx_http_variable_value_t *v, uintptr_t data) -{ - u_char *p; - ngx_msec_int_t ms; - - p = ngx_pnalloc(r->pool, NGX_TIME_T_LEN + 4); - if (p == NULL) { - return NGX_ERROR; - } - - ms = ngx_current_msec - r->connection->start_time; - ms = ngx_max(ms, 0); - - v->len = ngx_sprintf(p, "%T.%03M", (time_t) ms / 1000, ms % 1000) - p; - v->valid = 1; - v->no_cacheable = 0; - v->not_found = 0; - v->data = p; - - return NGX_OK; -} - - -static ngx_int_t -ngx_http_variable_nginx_version(ngx_http_request_t *r, - ngx_http_variable_value_t *v, uintptr_t data) -{ - v->len = sizeof(NGINX_VERSION) - 1; - v->valid = 1; - v->no_cacheable = 0; - v->not_found = 0; - v->data = (u_char *) NGINX_VERSION; - - return NGX_OK; -} - - -static ngx_int_t -ngx_http_variable_hostname(ngx_http_request_t *r, - ngx_http_variable_value_t *v, uintptr_t data) -{ - v->len = ngx_cycle->hostname.len; - v->valid = 1; - v->no_cacheable = 0; - v->not_found = 0; - v->data = ngx_cycle->hostname.data; - - return NGX_OK; -} - - -static ngx_int_t -ngx_http_variable_pid(ngx_http_request_t *r, - ngx_http_variable_value_t *v, uintptr_t data) -{ - u_char *p; - - p = ngx_pnalloc(r->pool, NGX_INT64_LEN); - if (p == NULL) { - return NGX_ERROR; - } - - v->len = ngx_sprintf(p, "%P", ngx_pid) - p; - v->valid = 1; - v->no_cacheable = 0; - v->not_found = 0; - v->data = p; - - return NGX_OK; -} - - -static ngx_int_t -ngx_http_variable_msec(ngx_http_request_t *r, - ngx_http_variable_value_t *v, uintptr_t data) -{ - u_char *p; - ngx_time_t *tp; - - p = ngx_pnalloc(r->pool, NGX_TIME_T_LEN + 4); - if (p == NULL) { - return NGX_ERROR; - } - - tp = ngx_timeofday(); - - v->len = ngx_sprintf(p, "%T.%03M", tp->sec, tp->msec) - p; - v->valid = 1; - v->no_cacheable = 0; - v->not_found = 0; - v->data = p; - - return NGX_OK; -} - - -static ngx_int_t -ngx_http_variable_time_iso8601(ngx_http_request_t *r, - ngx_http_variable_value_t *v, uintptr_t data) -{ - u_char *p; - - p = ngx_pnalloc(r->pool, ngx_cached_http_log_iso8601.len); - if (p == NULL) { - return NGX_ERROR; - } - - ngx_memcpy(p, ngx_cached_http_log_iso8601.data, - ngx_cached_http_log_iso8601.len); - - v->len = ngx_cached_http_log_iso8601.len; - v->valid = 1; - v->no_cacheable = 0; - v->not_found = 0; - v->data = p; - - return NGX_OK; -} - - -static ngx_int_t -ngx_http_variable_time_local(ngx_http_request_t *r, - ngx_http_variable_value_t *v, uintptr_t data) -{ - u_char *p; - - p = ngx_pnalloc(r->pool, ngx_cached_http_log_time.len); - if (p == NULL) { - return NGX_ERROR; - } - - ngx_memcpy(p, ngx_cached_http_log_time.data, ngx_cached_http_log_time.len); - - v->len = ngx_cached_http_log_time.len; - v->valid = 1; - v->no_cacheable = 0; - v->not_found = 0; - v->data = p; - - return NGX_OK; -} - - -void * -ngx_http_map_find(ngx_http_request_t *r, ngx_http_map_t *map, ngx_str_t *match) -{ - void *value; - u_char *low; - size_t len; - ngx_uint_t key; - - len = match->len; - - if (len) { - low = ngx_pnalloc(r->pool, len); - if (low == NULL) { - return NULL; - } - - } else { - low = NULL; - } - - key = ngx_hash_strlow(low, match->data, len); - - value = ngx_hash_find_combined(&map->hash, key, low, len); - if (value) { - return value; - } - -#if (NGX_PCRE) - - if (len && map->nregex) { - ngx_int_t n; - ngx_uint_t i; - ngx_http_map_regex_t *reg; - - reg = map->regex; - - for (i = 0; i < map->nregex; i++) { - - n = ngx_http_regex_exec(r, reg[i].regex, match); - - if (n == NGX_OK) { - return reg[i].value; - } - - if (n == NGX_DECLINED) { - continue; - } - - /* NGX_ERROR */ - - return NULL; - } - } - -#endif - - return NULL; -} - - -#if (NGX_PCRE) - -static ngx_int_t -ngx_http_variable_not_found(ngx_http_request_t *r, ngx_http_variable_value_t *v, - uintptr_t data) -{ - v->not_found = 1; - return NGX_OK; -} - - -ngx_http_regex_t * -ngx_http_regex_compile(ngx_conf_t *cf, ngx_regex_compile_t *rc) -{ - u_char *p; - size_t size; - ngx_str_t name; - ngx_uint_t i, n; - ngx_http_variable_t *v; - ngx_http_regex_t *re; - ngx_http_regex_variable_t *rv; - ngx_http_core_main_conf_t *cmcf; - - rc->pool = cf->pool; - - if (ngx_regex_compile(rc) != NGX_OK) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, "%V", &rc->err); - return NULL; - } - - re = ngx_pcalloc(cf->pool, sizeof(ngx_http_regex_t)); - if (re == NULL) { - return NULL; - } - - re->regex = rc->regex; - re->ncaptures = rc->captures; - re->name = rc->pattern; - - cmcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_core_module); - cmcf->ncaptures = ngx_max(cmcf->ncaptures, re->ncaptures); - - n = (ngx_uint_t) rc->named_captures; - - if (n == 0) { - return re; - } - - rv = ngx_palloc(rc->pool, n * sizeof(ngx_http_regex_variable_t)); - if (rv == NULL) { - return NULL; - } - - re->variables = rv; - re->nvariables = n; - - size = rc->name_size; - p = rc->names; - - for (i = 0; i < n; i++) { - rv[i].capture = 2 * ((p[0] << 8) + p[1]); - - name.data = &p[2]; - name.len = ngx_strlen(name.data); - - v = ngx_http_add_variable(cf, &name, NGX_HTTP_VAR_CHANGEABLE); - if (v == NULL) { - return NULL; - } - - rv[i].index = ngx_http_get_variable_index(cf, &name); - if (rv[i].index == NGX_ERROR) { - return NULL; - } - - v->get_handler = ngx_http_variable_not_found; - - p += size; - } - - return re; -} - - -ngx_int_t -ngx_http_regex_exec(ngx_http_request_t *r, ngx_http_regex_t *re, ngx_str_t *s) -{ - ngx_int_t rc, index; - ngx_uint_t i, n, len; - ngx_http_variable_value_t *vv; - ngx_http_core_main_conf_t *cmcf; - - cmcf = ngx_http_get_module_main_conf(r, ngx_http_core_module); - - if (re->ncaptures) { - len = cmcf->ncaptures; - - if (r->captures == NULL || r->realloc_captures) { - r->realloc_captures = 0; - - r->captures = ngx_palloc(r->pool, len * sizeof(int)); - if (r->captures == NULL) { - return NGX_ERROR; - } - } - - } else { - len = 0; - } - - rc = ngx_regex_exec(re->regex, s, r->captures, len); - - if (rc == NGX_REGEX_NO_MATCHED) { - return NGX_DECLINED; - } - - if (rc < 0) { - ngx_log_error(NGX_LOG_ALERT, r->connection->log, 0, - ngx_regex_exec_n " failed: %i on \"%V\" using \"%V\"", - rc, s, &re->name); - return NGX_ERROR; - } - - for (i = 0; i < re->nvariables; i++) { - - n = re->variables[i].capture; - index = re->variables[i].index; - vv = &r->variables[index]; - - vv->len = r->captures[n + 1] - r->captures[n]; - vv->valid = 1; - vv->no_cacheable = 0; - vv->not_found = 0; - vv->data = &s->data[r->captures[n]]; - -#if (NGX_DEBUG) - { - ngx_http_variable_t *v; - - v = cmcf->variables.elts; - - ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "http regex set $%V to \"%v\"", &v[index].name, vv); - } -#endif - } - - r->ncaptures = rc * 2; - r->captures_data = s->data; - - return NGX_OK; -} - -#endif - - -ngx_int_t -ngx_http_variables_add_core_vars(ngx_conf_t *cf) -{ - ngx_http_variable_t *cv, *v; - ngx_http_core_main_conf_t *cmcf; - - cmcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_core_module); - - cmcf->variables_keys = ngx_pcalloc(cf->temp_pool, - sizeof(ngx_hash_keys_arrays_t)); - if (cmcf->variables_keys == NULL) { - return NGX_ERROR; - } - - cmcf->variables_keys->pool = cf->pool; - cmcf->variables_keys->temp_pool = cf->pool; - - if (ngx_hash_keys_array_init(cmcf->variables_keys, NGX_HASH_SMALL) - != NGX_OK) - { - return NGX_ERROR; - } - - if (ngx_array_init(&cmcf->prefix_variables, cf->pool, 8, - sizeof(ngx_http_variable_t)) - != NGX_OK) - { - return NGX_ERROR; - } - - for (cv = ngx_http_core_variables; cv->name.len; cv++) { - v = ngx_http_add_variable(cf, &cv->name, cv->flags); - if (v == NULL) { - return NGX_ERROR; - } - - *v = *cv; - } - - return NGX_OK; -} - - -ngx_int_t -ngx_http_variables_init_vars(ngx_conf_t *cf) -{ - size_t len; - ngx_uint_t i, n; - ngx_hash_key_t *key; - ngx_hash_init_t hash; - ngx_http_variable_t *v, *av, *pv; - ngx_http_core_main_conf_t *cmcf; - - /* set the handlers for the indexed http variables */ - - cmcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_core_module); - - v = cmcf->variables.elts; - pv = cmcf->prefix_variables.elts; - key = cmcf->variables_keys->keys.elts; - - for (i = 0; i < cmcf->variables.nelts; i++) { - - for (n = 0; n < cmcf->variables_keys->keys.nelts; n++) { - - av = key[n].value; - - if (v[i].name.len == key[n].key.len - && ngx_strncmp(v[i].name.data, key[n].key.data, v[i].name.len) - == 0) - { - v[i].get_handler = av->get_handler; - v[i].data = av->data; - - av->flags |= NGX_HTTP_VAR_INDEXED; - v[i].flags = av->flags; - - av->index = i; - - if (av->get_handler == NULL - || (av->flags & NGX_HTTP_VAR_WEAK)) - { - break; - } - - goto next; - } - } - - len = 0; - av = NULL; - - for (n = 0; n < cmcf->prefix_variables.nelts; n++) { - if (v[i].name.len >= pv[n].name.len && v[i].name.len > len - && ngx_strncmp(v[i].name.data, pv[n].name.data, pv[n].name.len) - == 0) - { - av = &pv[n]; - len = pv[n].name.len; - } - } - - if (av) { - v[i].get_handler = av->get_handler; - v[i].data = (uintptr_t) &v[i].name; - v[i].flags = av->flags; - - goto next; - } - - if (v[i].get_handler == NULL) { - ngx_log_error(NGX_LOG_EMERG, cf->log, 0, - "unknown \"%V\" variable", &v[i].name); - - return NGX_ERROR; - } - - next: - continue; - } - - - for (n = 0; n < cmcf->variables_keys->keys.nelts; n++) { - av = key[n].value; - - if (av->flags & NGX_HTTP_VAR_NOHASH) { - key[n].key.data = NULL; - } - } - - - hash.hash = &cmcf->variables_hash; - hash.key = ngx_hash_key; - hash.max_size = cmcf->variables_hash_max_size; - hash.bucket_size = cmcf->variables_hash_bucket_size; - hash.name = "variables_hash"; - hash.pool = cf->pool; - hash.temp_pool = NULL; - - if (ngx_hash_init(&hash, cmcf->variables_keys->keys.elts, - cmcf->variables_keys->keys.nelts) - != NGX_OK) - { - return NGX_ERROR; - } - - cmcf->variables_keys = NULL; - - return NGX_OK; -} diff --git a/src/deps/src/nginx-1.30.3/src/http/ngx_http_variables.h b/src/deps/src/nginx-1.30.3/src/http/ngx_http_variables.h deleted file mode 100644 index 6a661a2568..0000000000 --- a/src/deps/src/nginx-1.30.3/src/http/ngx_http_variables.h +++ /dev/null @@ -1,117 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#ifndef _NGX_HTTP_VARIABLES_H_INCLUDED_ -#define _NGX_HTTP_VARIABLES_H_INCLUDED_ - - -#include -#include -#include - - -typedef ngx_variable_value_t ngx_http_variable_value_t; - -#define ngx_http_variable(v) { sizeof(v) - 1, 1, 0, 0, 0, (u_char *) v } - -typedef struct ngx_http_variable_s ngx_http_variable_t; - -typedef void (*ngx_http_set_variable_pt) (ngx_http_request_t *r, - ngx_http_variable_value_t *v, uintptr_t data); -typedef ngx_int_t (*ngx_http_get_variable_pt) (ngx_http_request_t *r, - ngx_http_variable_value_t *v, uintptr_t data); - - -#define NGX_HTTP_VAR_CHANGEABLE 1 -#define NGX_HTTP_VAR_NOCACHEABLE 2 -#define NGX_HTTP_VAR_INDEXED 4 -#define NGX_HTTP_VAR_NOHASH 8 -#define NGX_HTTP_VAR_WEAK 16 -#define NGX_HTTP_VAR_PREFIX 32 - - -struct ngx_http_variable_s { - ngx_str_t name; /* must be first to build the hash */ - ngx_http_set_variable_pt set_handler; - ngx_http_get_variable_pt get_handler; - uintptr_t data; - ngx_uint_t flags; - ngx_uint_t index; -}; - -#define ngx_http_null_variable { ngx_null_string, NULL, NULL, 0, 0, 0 } - - -ngx_http_variable_t *ngx_http_add_variable(ngx_conf_t *cf, ngx_str_t *name, - ngx_uint_t flags); -ngx_int_t ngx_http_get_variable_index(ngx_conf_t *cf, ngx_str_t *name); -ngx_http_variable_value_t *ngx_http_get_indexed_variable(ngx_http_request_t *r, - ngx_uint_t index); -ngx_http_variable_value_t *ngx_http_get_flushed_variable(ngx_http_request_t *r, - ngx_uint_t index); - -ngx_http_variable_value_t *ngx_http_get_variable(ngx_http_request_t *r, - ngx_str_t *name, ngx_uint_t key); - -ngx_int_t ngx_http_variable_unknown_header(ngx_http_request_t *r, - ngx_http_variable_value_t *v, ngx_str_t *var, ngx_list_part_t *part, - size_t prefix); - - -#if (NGX_PCRE) - -typedef struct { - ngx_uint_t capture; - ngx_int_t index; -} ngx_http_regex_variable_t; - - -typedef struct { - ngx_regex_t *regex; - ngx_uint_t ncaptures; - ngx_http_regex_variable_t *variables; - ngx_uint_t nvariables; - ngx_str_t name; -} ngx_http_regex_t; - - -typedef struct { - ngx_http_regex_t *regex; - void *value; -} ngx_http_map_regex_t; - - -ngx_http_regex_t *ngx_http_regex_compile(ngx_conf_t *cf, - ngx_regex_compile_t *rc); -ngx_int_t ngx_http_regex_exec(ngx_http_request_t *r, ngx_http_regex_t *re, - ngx_str_t *s); - -#endif - - -typedef struct { - ngx_hash_combined_t hash; -#if (NGX_PCRE) - ngx_http_map_regex_t *regex; - ngx_uint_t nregex; -#endif -} ngx_http_map_t; - - -void *ngx_http_map_find(ngx_http_request_t *r, ngx_http_map_t *map, - ngx_str_t *match); - - -ngx_int_t ngx_http_variables_add_core_vars(ngx_conf_t *cf); -ngx_int_t ngx_http_variables_init_vars(ngx_conf_t *cf); - - -extern ngx_http_variable_value_t ngx_http_variable_null_value; -extern ngx_http_variable_value_t ngx_http_variable_true_value; - - -#endif /* _NGX_HTTP_VARIABLES_H_INCLUDED_ */ diff --git a/src/deps/src/nginx-1.30.3/src/http/ngx_http_write_filter_module.c b/src/deps/src/nginx-1.30.3/src/http/ngx_http_write_filter_module.c deleted file mode 100644 index 9188ee948d..0000000000 --- a/src/deps/src/nginx-1.30.3/src/http/ngx_http_write_filter_module.c +++ /dev/null @@ -1,371 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#include -#include -#include - - -static ngx_int_t ngx_http_write_filter_init(ngx_conf_t *cf); - - -static ngx_http_module_t ngx_http_write_filter_module_ctx = { - NULL, /* preconfiguration */ - ngx_http_write_filter_init, /* postconfiguration */ - - NULL, /* create main configuration */ - NULL, /* init main configuration */ - - NULL, /* create server configuration */ - NULL, /* merge server configuration */ - - NULL, /* create location configuration */ - NULL, /* merge location configuration */ -}; - - -ngx_module_t ngx_http_write_filter_module = { - NGX_MODULE_V1, - &ngx_http_write_filter_module_ctx, /* module context */ - NULL, /* module directives */ - NGX_HTTP_MODULE, /* module type */ - NULL, /* init master */ - NULL, /* init module */ - NULL, /* init process */ - NULL, /* init thread */ - NULL, /* exit thread */ - NULL, /* exit process */ - NULL, /* exit master */ - NGX_MODULE_V1_PADDING -}; - - -ngx_int_t -ngx_http_write_filter(ngx_http_request_t *r, ngx_chain_t *in) -{ - off_t size, sent, nsent, limit; - ngx_uint_t last, flush, sync; - ngx_msec_t delay; - ngx_chain_t *cl, *ln, **ll, *chain; - ngx_connection_t *c; - ngx_http_core_loc_conf_t *clcf; - - c = r->connection; - - if (c->error) { - return NGX_ERROR; - } - - size = 0; - flush = 0; - sync = 0; - last = 0; - ll = &r->out; - - /* find the size, the flush point and the last link of the saved chain */ - - for (cl = r->out; cl; cl = cl->next) { - ll = &cl->next; - - ngx_log_debug7(NGX_LOG_DEBUG_EVENT, c->log, 0, - "write old buf t:%d f:%d %p, pos %p, size: %z " - "file: %O, size: %O", - cl->buf->temporary, cl->buf->in_file, - cl->buf->start, cl->buf->pos, - cl->buf->last - cl->buf->pos, - cl->buf->file_pos, - cl->buf->file_last - cl->buf->file_pos); - - if (ngx_buf_size(cl->buf) == 0 && !ngx_buf_special(cl->buf)) { - ngx_log_error(NGX_LOG_ALERT, c->log, 0, - "zero size buf in writer " - "t:%d r:%d f:%d %p %p-%p %p %O-%O", - cl->buf->temporary, - cl->buf->recycled, - cl->buf->in_file, - cl->buf->start, - cl->buf->pos, - cl->buf->last, - cl->buf->file, - cl->buf->file_pos, - cl->buf->file_last); - - ngx_debug_point(); - return NGX_ERROR; - } - - if (ngx_buf_size(cl->buf) < 0) { - ngx_log_error(NGX_LOG_ALERT, c->log, 0, - "negative size buf in writer " - "t:%d r:%d f:%d %p %p-%p %p %O-%O", - cl->buf->temporary, - cl->buf->recycled, - cl->buf->in_file, - cl->buf->start, - cl->buf->pos, - cl->buf->last, - cl->buf->file, - cl->buf->file_pos, - cl->buf->file_last); - - ngx_debug_point(); - return NGX_ERROR; - } - - size += ngx_buf_size(cl->buf); - - if (cl->buf->flush || cl->buf->recycled) { - flush = 1; - } - - if (cl->buf->sync) { - sync = 1; - } - - if (cl->buf->last_buf) { - last = 1; - } - } - - /* add the new chain to the existent one */ - - for (ln = in; ln; ln = ln->next) { - cl = ngx_alloc_chain_link(r->pool); - if (cl == NULL) { - return NGX_ERROR; - } - - cl->buf = ln->buf; - *ll = cl; - ll = &cl->next; - - ngx_log_debug7(NGX_LOG_DEBUG_EVENT, c->log, 0, - "write new buf t:%d f:%d %p, pos %p, size: %z " - "file: %O, size: %O", - cl->buf->temporary, cl->buf->in_file, - cl->buf->start, cl->buf->pos, - cl->buf->last - cl->buf->pos, - cl->buf->file_pos, - cl->buf->file_last - cl->buf->file_pos); - - if (ngx_buf_size(cl->buf) == 0 && !ngx_buf_special(cl->buf)) { - ngx_log_error(NGX_LOG_ALERT, c->log, 0, - "zero size buf in writer " - "t:%d r:%d f:%d %p %p-%p %p %O-%O", - cl->buf->temporary, - cl->buf->recycled, - cl->buf->in_file, - cl->buf->start, - cl->buf->pos, - cl->buf->last, - cl->buf->file, - cl->buf->file_pos, - cl->buf->file_last); - - ngx_debug_point(); - return NGX_ERROR; - } - - if (ngx_buf_size(cl->buf) < 0) { - ngx_log_error(NGX_LOG_ALERT, c->log, 0, - "negative size buf in writer " - "t:%d r:%d f:%d %p %p-%p %p %O-%O", - cl->buf->temporary, - cl->buf->recycled, - cl->buf->in_file, - cl->buf->start, - cl->buf->pos, - cl->buf->last, - cl->buf->file, - cl->buf->file_pos, - cl->buf->file_last); - - ngx_debug_point(); - return NGX_ERROR; - } - - size += ngx_buf_size(cl->buf); - - if (cl->buf->flush || cl->buf->recycled) { - flush = 1; - } - - if (cl->buf->sync) { - sync = 1; - } - - if (cl->buf->last_buf) { - last = 1; - } - } - - *ll = NULL; - - ngx_log_debug3(NGX_LOG_DEBUG_HTTP, c->log, 0, - "http write filter: l:%ui f:%ui s:%O", last, flush, size); - - clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module); - - /* - * avoid the output if there are no last buf, no flush point, - * there are the incoming bufs and the size of all bufs - * is smaller than "postpone_output" directive - */ - - if (!last && !flush && in && size < (off_t) clcf->postpone_output) { - return NGX_OK; - } - - if (c->write->delayed) { - c->buffered |= NGX_HTTP_WRITE_BUFFERED; - return NGX_AGAIN; - } - - if (size == 0 - && !(c->buffered & NGX_LOWLEVEL_BUFFERED) - && !(last && c->need_last_buf) - && !(flush && c->need_flush_buf)) - { - if (last || flush || sync) { - for (cl = r->out; cl; /* void */) { - ln = cl; - cl = cl->next; - ngx_free_chain(r->pool, ln); - } - - r->out = NULL; - c->buffered &= ~NGX_HTTP_WRITE_BUFFERED; - - if (last) { - r->response_sent = 1; - } - - return NGX_OK; - } - - ngx_log_error(NGX_LOG_ALERT, c->log, 0, - "the http output chain is empty"); - - ngx_debug_point(); - - return NGX_ERROR; - } - - if (!r->limit_rate_set) { - r->limit_rate = ngx_http_complex_value_size(r, clcf->limit_rate, 0); - r->limit_rate_set = 1; - } - - if (r->limit_rate) { - - if (!r->limit_rate_after_set) { - r->limit_rate_after = ngx_http_complex_value_size(r, - clcf->limit_rate_after, 0); - r->limit_rate_after_set = 1; - } - - limit = (off_t) r->limit_rate * (ngx_time() - r->start_sec + 1) - - (c->sent - r->limit_rate_after); - - if (limit <= 0) { - c->write->delayed = 1; - delay = (ngx_msec_t) (- limit * 1000 / r->limit_rate + 1); - ngx_add_timer(c->write, delay); - - c->buffered |= NGX_HTTP_WRITE_BUFFERED; - - return NGX_AGAIN; - } - - if (clcf->sendfile_max_chunk - && (off_t) clcf->sendfile_max_chunk < limit) - { - limit = clcf->sendfile_max_chunk; - } - - } else { - limit = clcf->sendfile_max_chunk; - } - - sent = c->sent; - - ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0, - "http write filter limit %O", limit); - - chain = c->send_chain(c, r->out, limit); - - ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0, - "http write filter %p", chain); - - if (chain == NGX_CHAIN_ERROR) { - c->error = 1; - return NGX_ERROR; - } - - if (r->limit_rate) { - - nsent = c->sent; - - if (r->limit_rate_after) { - - sent -= r->limit_rate_after; - if (sent < 0) { - sent = 0; - } - - nsent -= r->limit_rate_after; - if (nsent < 0) { - nsent = 0; - } - } - - delay = (ngx_msec_t) ((nsent - sent) * 1000 / r->limit_rate); - - if (delay > 0) { - c->write->delayed = 1; - ngx_add_timer(c->write, delay); - } - } - - if (chain && c->write->ready && !c->write->delayed) { - ngx_post_event(c->write, &ngx_posted_next_events); - } - - for (cl = r->out; cl && cl != chain; /* void */) { - ln = cl; - cl = cl->next; - ngx_free_chain(r->pool, ln); - } - - r->out = chain; - - if (chain) { - c->buffered |= NGX_HTTP_WRITE_BUFFERED; - return NGX_AGAIN; - } - - c->buffered &= ~NGX_HTTP_WRITE_BUFFERED; - - if (last) { - r->response_sent = 1; - } - - if ((c->buffered & NGX_LOWLEVEL_BUFFERED) && r->postponed == NULL) { - return NGX_AGAIN; - } - - return NGX_OK; -} - - -static ngx_int_t -ngx_http_write_filter_init(ngx_conf_t *cf) -{ - ngx_http_top_body_filter = ngx_http_write_filter; - - return NGX_OK; -} diff --git a/src/deps/src/nginx-1.30.3/src/http/v2/ngx_http_v2.c b/src/deps/src/nginx-1.30.3/src/http/v2/ngx_http_v2.c deleted file mode 100644 index efe22903fa..0000000000 --- a/src/deps/src/nginx-1.30.3/src/http/v2/ngx_http_v2.c +++ /dev/null @@ -1,5030 +0,0 @@ - -/* - * Copyright (C) Nginx, Inc. - * Copyright (C) Valentin V. Bartenev - */ - - -#include -#include -#include -#include - - -/* errors */ -#define NGX_HTTP_V2_NO_ERROR 0x0 -#define NGX_HTTP_V2_PROTOCOL_ERROR 0x1 -#define NGX_HTTP_V2_INTERNAL_ERROR 0x2 -#define NGX_HTTP_V2_FLOW_CTRL_ERROR 0x3 -#define NGX_HTTP_V2_SETTINGS_TIMEOUT 0x4 -#define NGX_HTTP_V2_STREAM_CLOSED 0x5 -#define NGX_HTTP_V2_SIZE_ERROR 0x6 -#define NGX_HTTP_V2_REFUSED_STREAM 0x7 -#define NGX_HTTP_V2_CANCEL 0x8 -#define NGX_HTTP_V2_COMP_ERROR 0x9 -#define NGX_HTTP_V2_CONNECT_ERROR 0xa -#define NGX_HTTP_V2_ENHANCE_YOUR_CALM 0xb -#define NGX_HTTP_V2_INADEQUATE_SECURITY 0xc -#define NGX_HTTP_V2_HTTP_1_1_REQUIRED 0xd - -/* frame sizes */ -#define NGX_HTTP_V2_SETTINGS_ACK_SIZE 0 -#define NGX_HTTP_V2_RST_STREAM_SIZE 4 -#define NGX_HTTP_V2_PRIORITY_SIZE 5 -#define NGX_HTTP_V2_PING_SIZE 8 -#define NGX_HTTP_V2_GOAWAY_SIZE 8 -#define NGX_HTTP_V2_WINDOW_UPDATE_SIZE 4 - -#define NGX_HTTP_V2_SETTINGS_PARAM_SIZE 6 - -/* settings fields */ -#define NGX_HTTP_V2_HEADER_TABLE_SIZE_SETTING 0x1 -#define NGX_HTTP_V2_ENABLE_PUSH_SETTING 0x2 -#define NGX_HTTP_V2_MAX_STREAMS_SETTING 0x3 -#define NGX_HTTP_V2_INIT_WINDOW_SIZE_SETTING 0x4 -#define NGX_HTTP_V2_MAX_FRAME_SIZE_SETTING 0x5 - -#define NGX_HTTP_V2_FRAME_BUFFER_SIZE 24 - -#define NGX_HTTP_V2_ROOT (void *) -1 - - -static void ngx_http_v2_read_handler(ngx_event_t *rev); -static void ngx_http_v2_write_handler(ngx_event_t *wev); -static void ngx_http_v2_handle_connection(ngx_http_v2_connection_t *h2c); -static void ngx_http_v2_lingering_close(ngx_connection_t *c); -static void ngx_http_v2_lingering_close_handler(ngx_event_t *rev); - -static u_char *ngx_http_v2_state_preface(ngx_http_v2_connection_t *h2c, - u_char *pos, u_char *end); -static u_char *ngx_http_v2_state_preface_end(ngx_http_v2_connection_t *h2c, - u_char *pos, u_char *end); -static u_char *ngx_http_v2_state_head(ngx_http_v2_connection_t *h2c, - u_char *pos, u_char *end); -static u_char *ngx_http_v2_state_data(ngx_http_v2_connection_t *h2c, - u_char *pos, u_char *end); -static u_char *ngx_http_v2_state_read_data(ngx_http_v2_connection_t *h2c, - u_char *pos, u_char *end); -static u_char *ngx_http_v2_state_headers(ngx_http_v2_connection_t *h2c, - u_char *pos, u_char *end); -static u_char *ngx_http_v2_state_header_block(ngx_http_v2_connection_t *h2c, - u_char *pos, u_char *end); -static u_char *ngx_http_v2_state_field_len(ngx_http_v2_connection_t *h2c, - u_char *pos, u_char *end); -static u_char *ngx_http_v2_state_field_huff(ngx_http_v2_connection_t *h2c, - u_char *pos, u_char *end); -static u_char *ngx_http_v2_state_field_raw(ngx_http_v2_connection_t *h2c, - u_char *pos, u_char *end); -static u_char *ngx_http_v2_state_field_skip(ngx_http_v2_connection_t *h2c, - u_char *pos, u_char *end); -static u_char *ngx_http_v2_state_process_header(ngx_http_v2_connection_t *h2c, - u_char *pos, u_char *end); -static u_char *ngx_http_v2_state_header_complete(ngx_http_v2_connection_t *h2c, - u_char *pos, u_char *end); -static u_char *ngx_http_v2_handle_continuation(ngx_http_v2_connection_t *h2c, - u_char *pos, u_char *end, ngx_http_v2_handler_pt handler); -static u_char *ngx_http_v2_state_priority(ngx_http_v2_connection_t *h2c, - u_char *pos, u_char *end); -static u_char *ngx_http_v2_state_rst_stream(ngx_http_v2_connection_t *h2c, - u_char *pos, u_char *end); -static u_char *ngx_http_v2_state_settings(ngx_http_v2_connection_t *h2c, - u_char *pos, u_char *end); -static u_char *ngx_http_v2_state_settings_params(ngx_http_v2_connection_t *h2c, - u_char *pos, u_char *end); -static u_char *ngx_http_v2_state_push_promise(ngx_http_v2_connection_t *h2c, - u_char *pos, u_char *end); -static u_char *ngx_http_v2_state_ping(ngx_http_v2_connection_t *h2c, - u_char *pos, u_char *end); -static u_char *ngx_http_v2_state_goaway(ngx_http_v2_connection_t *h2c, - u_char *pos, u_char *end); -static u_char *ngx_http_v2_state_window_update(ngx_http_v2_connection_t *h2c, - u_char *pos, u_char *end); -static u_char *ngx_http_v2_state_continuation(ngx_http_v2_connection_t *h2c, - u_char *pos, u_char *end); -static u_char *ngx_http_v2_state_complete(ngx_http_v2_connection_t *h2c, - u_char *pos, u_char *end); -static u_char *ngx_http_v2_state_skip_padded(ngx_http_v2_connection_t *h2c, - u_char *pos, u_char *end); -static u_char *ngx_http_v2_state_skip(ngx_http_v2_connection_t *h2c, - u_char *pos, u_char *end); -static u_char *ngx_http_v2_state_save(ngx_http_v2_connection_t *h2c, - u_char *pos, u_char *end, ngx_http_v2_handler_pt handler); -static u_char *ngx_http_v2_state_headers_save(ngx_http_v2_connection_t *h2c, - u_char *pos, u_char *end, ngx_http_v2_handler_pt handler); -static u_char *ngx_http_v2_connection_error(ngx_http_v2_connection_t *h2c, - ngx_uint_t err); - -static ngx_int_t ngx_http_v2_parse_int(ngx_http_v2_connection_t *h2c, - u_char **pos, u_char *end, ngx_uint_t prefix); - -static ngx_http_v2_stream_t *ngx_http_v2_create_stream( - ngx_http_v2_connection_t *h2c); -static ngx_http_v2_node_t *ngx_http_v2_get_node_by_id( - ngx_http_v2_connection_t *h2c, ngx_uint_t sid, ngx_uint_t alloc); -static ngx_http_v2_node_t *ngx_http_v2_get_closed_node( - ngx_http_v2_connection_t *h2c); -#define ngx_http_v2_index_size(h2scf) (h2scf->streams_index_mask + 1) -#define ngx_http_v2_index(h2scf, sid) ((sid >> 1) & h2scf->streams_index_mask) - -static ngx_int_t ngx_http_v2_send_settings(ngx_http_v2_connection_t *h2c); -static ngx_int_t ngx_http_v2_settings_frame_handler( - ngx_http_v2_connection_t *h2c, ngx_http_v2_out_frame_t *frame); -static ngx_int_t ngx_http_v2_send_window_update(ngx_http_v2_connection_t *h2c, - ngx_uint_t sid, size_t window); -static ngx_int_t ngx_http_v2_send_rst_stream(ngx_http_v2_connection_t *h2c, - ngx_uint_t sid, ngx_uint_t status); -static ngx_int_t ngx_http_v2_send_goaway(ngx_http_v2_connection_t *h2c, - ngx_uint_t status); - -static ngx_http_v2_out_frame_t *ngx_http_v2_get_frame( - ngx_http_v2_connection_t *h2c, size_t length, ngx_uint_t type, - u_char flags, ngx_uint_t sid); -static ngx_int_t ngx_http_v2_frame_handler(ngx_http_v2_connection_t *h2c, - ngx_http_v2_out_frame_t *frame); - -static ngx_int_t ngx_http_v2_validate_header(ngx_http_request_t *r, - ngx_http_v2_header_t *header); -static ngx_int_t ngx_http_v2_pseudo_header(ngx_http_request_t *r, - ngx_http_v2_header_t *header); -static ngx_int_t ngx_http_v2_parse_path(ngx_http_request_t *r, - ngx_str_t *value); -static ngx_int_t ngx_http_v2_parse_method(ngx_http_request_t *r, - ngx_str_t *value); -static ngx_int_t ngx_http_v2_parse_scheme(ngx_http_request_t *r, - ngx_str_t *value); -static ngx_int_t ngx_http_v2_parse_authority(ngx_http_request_t *r, - ngx_str_t *value); -static ngx_int_t ngx_http_v2_construct_request_line(ngx_http_request_t *r); -static ngx_int_t ngx_http_v2_cookie(ngx_http_request_t *r, - ngx_http_v2_header_t *header); -static ngx_int_t ngx_http_v2_construct_cookie_header(ngx_http_request_t *r); -static ngx_int_t ngx_http_v2_construct_host_header(ngx_http_request_t *r); -static void ngx_http_v2_run_request(ngx_http_request_t *r); -static ngx_int_t ngx_http_v2_process_request_body(ngx_http_request_t *r, - u_char *pos, size_t size, ngx_uint_t last, ngx_uint_t flush); -static ngx_int_t ngx_http_v2_filter_request_body(ngx_http_request_t *r); -static void ngx_http_v2_read_client_request_body_handler(ngx_http_request_t *r); - -static ngx_int_t ngx_http_v2_terminate_stream(ngx_http_v2_connection_t *h2c, - ngx_http_v2_stream_t *stream, ngx_uint_t status); -static void ngx_http_v2_close_stream_handler(ngx_event_t *ev); -static void ngx_http_v2_retry_close_stream_handler(ngx_event_t *ev); -static void ngx_http_v2_handle_connection_handler(ngx_event_t *rev); -static void ngx_http_v2_idle_handler(ngx_event_t *rev); -static void ngx_http_v2_finalize_connection(ngx_http_v2_connection_t *h2c, - ngx_uint_t status); - -static ngx_int_t ngx_http_v2_adjust_windows(ngx_http_v2_connection_t *h2c, - ssize_t delta); -static void ngx_http_v2_set_dependency(ngx_http_v2_connection_t *h2c, - ngx_http_v2_node_t *node, ngx_uint_t depend, ngx_uint_t exclusive); -static void ngx_http_v2_node_children_update(ngx_http_v2_node_t *node); - -static void ngx_http_v2_pool_cleanup(void *data); - - -static ngx_http_v2_handler_pt ngx_http_v2_frame_states[] = { - ngx_http_v2_state_data, /* NGX_HTTP_V2_DATA_FRAME */ - ngx_http_v2_state_headers, /* NGX_HTTP_V2_HEADERS_FRAME */ - ngx_http_v2_state_priority, /* NGX_HTTP_V2_PRIORITY_FRAME */ - ngx_http_v2_state_rst_stream, /* NGX_HTTP_V2_RST_STREAM_FRAME */ - ngx_http_v2_state_settings, /* NGX_HTTP_V2_SETTINGS_FRAME */ - ngx_http_v2_state_push_promise, /* NGX_HTTP_V2_PUSH_PROMISE_FRAME */ - ngx_http_v2_state_ping, /* NGX_HTTP_V2_PING_FRAME */ - ngx_http_v2_state_goaway, /* NGX_HTTP_V2_GOAWAY_FRAME */ - ngx_http_v2_state_window_update, /* NGX_HTTP_V2_WINDOW_UPDATE_FRAME */ - ngx_http_v2_state_continuation /* NGX_HTTP_V2_CONTINUATION_FRAME */ -}; - -#define NGX_HTTP_V2_FRAME_STATES \ - (sizeof(ngx_http_v2_frame_states) / sizeof(ngx_http_v2_handler_pt)) - - -void -ngx_http_v2_init(ngx_event_t *rev) -{ - u_char *p, *end; - ngx_connection_t *c; - ngx_pool_cleanup_t *cln; - ngx_http_connection_t *hc; - ngx_http_v2_srv_conf_t *h2scf; - ngx_http_v2_main_conf_t *h2mcf; - ngx_http_v2_connection_t *h2c; - ngx_http_core_srv_conf_t *cscf; - - c = rev->data; - hc = c->data; - - ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0, "init http2 connection"); - - c->log->action = "processing HTTP/2 connection"; - - h2mcf = ngx_http_get_module_main_conf(hc->conf_ctx, ngx_http_v2_module); - - if (h2mcf->recv_buffer == NULL) { - h2mcf->recv_buffer = ngx_palloc(ngx_cycle->pool, - h2mcf->recv_buffer_size); - if (h2mcf->recv_buffer == NULL) { - ngx_http_close_connection(c); - return; - } - } - - h2c = ngx_pcalloc(c->pool, sizeof(ngx_http_v2_connection_t)); - if (h2c == NULL) { - ngx_http_close_connection(c); - return; - } - - h2c->connection = c; - h2c->http_connection = hc; - - h2c->send_window = NGX_HTTP_V2_DEFAULT_WINDOW; - h2c->recv_window = NGX_HTTP_V2_MAX_WINDOW; - - h2c->init_window = NGX_HTTP_V2_DEFAULT_WINDOW; - - h2c->frame_size = NGX_HTTP_V2_DEFAULT_FRAME_SIZE; - - h2scf = ngx_http_get_module_srv_conf(hc->conf_ctx, ngx_http_v2_module); - - h2c->priority_limit = ngx_max(h2scf->concurrent_streams, 100); - - h2c->pool = ngx_create_pool(h2scf->pool_size, h2c->connection->log); - if (h2c->pool == NULL) { - ngx_http_close_connection(c); - return; - } - - cln = ngx_pool_cleanup_add(c->pool, 0); - if (cln == NULL) { - ngx_http_close_connection(c); - return; - } - - cln->handler = ngx_http_v2_pool_cleanup; - cln->data = h2c; - - h2c->streams_index = ngx_pcalloc(c->pool, ngx_http_v2_index_size(h2scf) - * sizeof(ngx_http_v2_node_t *)); - if (h2c->streams_index == NULL) { - ngx_http_close_connection(c); - return; - } - - if (ngx_http_v2_send_settings(h2c) == NGX_ERROR) { - ngx_http_close_connection(c); - return; - } - - if (ngx_http_v2_send_window_update(h2c, 0, NGX_HTTP_V2_MAX_WINDOW - - NGX_HTTP_V2_DEFAULT_WINDOW) - == NGX_ERROR) - { - ngx_http_close_connection(c); - return; - } - - h2c->state.handler = ngx_http_v2_state_preface; - - ngx_queue_init(&h2c->waiting); - ngx_queue_init(&h2c->dependencies); - ngx_queue_init(&h2c->closed); - - c->data = h2c; - - if (ngx_exiting) { - ngx_http_v2_finalize_connection(h2c, NGX_HTTP_V2_NO_ERROR); - return; - } - - rev->handler = ngx_http_v2_read_handler; - c->write->handler = ngx_http_v2_write_handler; - - if (!rev->timer_set) { - cscf = ngx_http_get_module_srv_conf(hc->conf_ctx, - ngx_http_core_module); - ngx_add_timer(rev, cscf->client_header_timeout); - } - - c->idle = 1; - ngx_reusable_connection(c, 0); - - if (c->buffer) { - p = c->buffer->pos; - end = c->buffer->last; - - do { - p = h2c->state.handler(h2c, p, end); - - if (p == NULL) { - return; - } - - } while (p != end); - - h2c->total_bytes += p - c->buffer->pos; - c->buffer->pos = p; - } - - ngx_http_v2_read_handler(rev); -} - - -static void -ngx_http_v2_read_handler(ngx_event_t *rev) -{ - u_char *p, *end; - size_t available; - ssize_t n; - ngx_connection_t *c; - ngx_http_v2_main_conf_t *h2mcf; - ngx_http_v2_connection_t *h2c; - - c = rev->data; - h2c = c->data; - - if (rev->timedout) { - ngx_log_error(NGX_LOG_INFO, c->log, NGX_ETIMEDOUT, "client timed out"); - ngx_http_v2_finalize_connection(h2c, NGX_HTTP_V2_PROTOCOL_ERROR); - return; - } - - ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0, "http2 read handler"); - - h2c->blocked = 1; - h2c->new_streams = 0; - - if (c->close) { - c->close = 0; - - if (c->error) { - ngx_http_v2_finalize_connection(h2c, 0); - return; - } - - if (!h2c->processing) { - ngx_http_v2_finalize_connection(h2c, NGX_HTTP_V2_NO_ERROR); - return; - } - - if (!h2c->goaway) { - h2c->goaway = 1; - - if (ngx_http_v2_send_goaway(h2c, NGX_HTTP_V2_NO_ERROR) - == NGX_ERROR) - { - ngx_http_v2_finalize_connection(h2c, 0); - return; - } - - if (ngx_http_v2_send_output_queue(h2c) == NGX_ERROR) { - ngx_http_v2_finalize_connection(h2c, 0); - return; - } - } - - h2c->blocked = 0; - - return; - } - - h2mcf = ngx_http_get_module_main_conf(h2c->http_connection->conf_ctx, - ngx_http_v2_module); - - available = h2mcf->recv_buffer_size - NGX_HTTP_V2_STATE_BUFFER_SIZE; - - do { - p = h2mcf->recv_buffer; - end = ngx_cpymem(p, h2c->state.buffer, h2c->state.buffer_used); - - n = c->recv(c, end, available); - - if (n == NGX_AGAIN) { - break; - } - - if (n == 0 && (h2c->state.incomplete || h2c->processing)) { - ngx_log_error(NGX_LOG_INFO, c->log, 0, - "client prematurely closed connection"); - } - - if (n == 0 || n == NGX_ERROR) { - c->error = 1; - ngx_http_v2_finalize_connection(h2c, 0); - return; - } - - end += n; - - h2c->state.buffer_used = 0; - h2c->state.incomplete = 0; - - do { - p = h2c->state.handler(h2c, p, end); - - if (p == NULL) { - return; - } - - } while (p != end); - - h2c->total_bytes += n; - - if (h2c->total_bytes / 8 > h2c->payload_bytes + 1048576) { - ngx_log_error(NGX_LOG_INFO, c->log, 0, "http2 flood detected"); - ngx_http_v2_finalize_connection(h2c, NGX_HTTP_V2_NO_ERROR); - return; - } - - } while (rev->ready); - - if (ngx_handle_read_event(rev, 0) != NGX_OK) { - ngx_http_v2_finalize_connection(h2c, NGX_HTTP_V2_INTERNAL_ERROR); - return; - } - - if (h2c->last_out && ngx_http_v2_send_output_queue(h2c) == NGX_ERROR) { - ngx_http_v2_finalize_connection(h2c, 0); - return; - } - - h2c->blocked = 0; - - ngx_http_v2_handle_connection(h2c); -} - - -static void -ngx_http_v2_write_handler(ngx_event_t *wev) -{ - ngx_int_t rc; - ngx_connection_t *c; - ngx_http_v2_connection_t *h2c; - - c = wev->data; - h2c = c->data; - - if (wev->timedout) { - ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0, - "http2 write event timed out"); - c->error = 1; - c->timedout = 1; - ngx_http_v2_finalize_connection(h2c, 0); - return; - } - - ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0, "http2 write handler"); - - if (h2c->last_out == NULL && !c->buffered) { - - if (wev->timer_set) { - ngx_del_timer(wev); - } - - ngx_http_v2_handle_connection(h2c); - return; - } - - h2c->blocked = 1; - - rc = ngx_http_v2_send_output_queue(h2c); - - if (rc == NGX_ERROR) { - ngx_http_v2_finalize_connection(h2c, 0); - return; - } - - h2c->blocked = 0; - - if (rc == NGX_AGAIN) { - return; - } - - ngx_http_v2_handle_connection(h2c); -} - - -ngx_int_t -ngx_http_v2_send_output_queue(ngx_http_v2_connection_t *h2c) -{ - int tcp_nodelay; - ngx_chain_t *cl; - ngx_event_t *wev; - ngx_connection_t *c; - ngx_http_v2_out_frame_t *out, *frame, *fn; - ngx_http_core_loc_conf_t *clcf; - - c = h2c->connection; - wev = c->write; - - if (c->error) { - goto error; - } - - if (!wev->ready) { - return NGX_AGAIN; - } - - cl = NULL; - out = NULL; - - for (frame = h2c->last_out; frame; frame = fn) { - frame->last->next = cl; - cl = frame->first; - - fn = frame->next; - frame->next = out; - out = frame; - - ngx_log_debug4(NGX_LOG_DEBUG_HTTP, c->log, 0, - "http2 frame out: %p sid:%ui bl:%d len:%uz", - out, out->stream ? out->stream->node->id : 0, - out->blocked, out->length); - } - - cl = c->send_chain(c, cl, 0); - - if (cl == NGX_CHAIN_ERROR) { - goto error; - } - - clcf = ngx_http_get_module_loc_conf(h2c->http_connection->conf_ctx, - ngx_http_core_module); - - if (ngx_handle_write_event(wev, clcf->send_lowat) != NGX_OK) { - goto error; - } - - if (c->tcp_nopush == NGX_TCP_NOPUSH_SET) { - if (ngx_tcp_push(c->fd) == -1) { - ngx_connection_error(c, ngx_socket_errno, ngx_tcp_push_n " failed"); - goto error; - } - - c->tcp_nopush = NGX_TCP_NOPUSH_UNSET; - tcp_nodelay = ngx_tcp_nodelay_and_tcp_nopush ? 1 : 0; - - } else { - tcp_nodelay = 1; - } - - if (tcp_nodelay && clcf->tcp_nodelay && ngx_tcp_nodelay(c) != NGX_OK) { - goto error; - } - - for ( /* void */ ; out; out = fn) { - fn = out->next; - - if (out->handler(h2c, out) != NGX_OK) { - out->blocked = 1; - break; - } - - ngx_log_debug4(NGX_LOG_DEBUG_HTTP, c->log, 0, - "http2 frame sent: %p sid:%ui bl:%d len:%uz", - out, out->stream ? out->stream->node->id : 0, - out->blocked, out->length); - } - - frame = NULL; - - for ( /* void */ ; out; out = fn) { - fn = out->next; - out->next = frame; - frame = out; - } - - h2c->last_out = frame; - - if (!wev->ready) { - ngx_add_timer(wev, clcf->send_timeout); - return NGX_AGAIN; - } - - if (wev->timer_set) { - ngx_del_timer(wev); - } - - return NGX_OK; - -error: - - c->error = 1; - - if (!h2c->blocked) { - ngx_post_event(wev, &ngx_posted_events); - } - - return NGX_ERROR; -} - - -static void -ngx_http_v2_handle_connection(ngx_http_v2_connection_t *h2c) -{ - ngx_int_t rc; - ngx_connection_t *c; - ngx_http_core_loc_conf_t *clcf; - - if (h2c->last_out || h2c->processing) { - return; - } - - c = h2c->connection; - - if (c->error) { - ngx_http_close_connection(c); - return; - } - - if (c->buffered) { - h2c->blocked = 1; - - rc = ngx_http_v2_send_output_queue(h2c); - - h2c->blocked = 0; - - if (rc == NGX_ERROR) { - ngx_http_close_connection(c); - return; - } - - if (rc == NGX_AGAIN) { - return; - } - - /* rc == NGX_OK */ - } - - if (h2c->goaway) { - ngx_http_v2_lingering_close(c); - return; - } - - clcf = ngx_http_get_module_loc_conf(h2c->http_connection->conf_ctx, - ngx_http_core_module); - - if (!c->read->timer_set) { - ngx_add_timer(c->read, clcf->keepalive_timeout); - } - - ngx_reusable_connection(c, 1); - - if (h2c->state.incomplete) { - return; - } - - ngx_destroy_pool(h2c->pool); - - h2c->pool = NULL; - h2c->free_frames = NULL; - h2c->frames = 0; - h2c->free_fake_connections = NULL; - -#if (NGX_HTTP_SSL) - if (c->ssl) { - ngx_ssl_free_buffer(c); - } -#endif - - c->destroyed = 1; - - c->write->handler = ngx_http_empty_handler; - c->read->handler = ngx_http_v2_idle_handler; - - if (c->write->timer_set) { - ngx_del_timer(c->write); - } -} - - -static void -ngx_http_v2_lingering_close(ngx_connection_t *c) -{ - ngx_event_t *rev, *wev; - ngx_http_v2_connection_t *h2c; - ngx_http_core_loc_conf_t *clcf; - - h2c = c->data; - - clcf = ngx_http_get_module_loc_conf(h2c->http_connection->conf_ctx, - ngx_http_core_module); - - if (clcf->lingering_close == NGX_HTTP_LINGERING_OFF) { - ngx_http_close_connection(c); - return; - } - - if (h2c->lingering_time == 0) { - h2c->lingering_time = ngx_time() - + (time_t) (clcf->lingering_time / 1000); - } - -#if (NGX_HTTP_SSL) - if (c->ssl) { - ngx_int_t rc; - - rc = ngx_ssl_shutdown(c); - - if (rc == NGX_ERROR) { - ngx_http_close_connection(c); - return; - } - - if (rc == NGX_AGAIN) { - c->ssl->handler = ngx_http_v2_lingering_close; - return; - } - } -#endif - - rev = c->read; - rev->handler = ngx_http_v2_lingering_close_handler; - - if (ngx_handle_read_event(rev, 0) != NGX_OK) { - ngx_http_close_connection(c); - return; - } - - wev = c->write; - wev->handler = ngx_http_empty_handler; - - if (wev->active && (ngx_event_flags & NGX_USE_LEVEL_EVENT)) { - if (ngx_del_event(wev, NGX_WRITE_EVENT, 0) != NGX_OK) { - ngx_http_close_connection(c); - return; - } - } - - if (ngx_shutdown_socket(c->fd, NGX_WRITE_SHUTDOWN) == -1) { - ngx_connection_error(c, ngx_socket_errno, - ngx_shutdown_socket_n " failed"); - ngx_http_close_connection(c); - return; - } - - c->close = 0; - ngx_reusable_connection(c, 1); - - ngx_add_timer(rev, clcf->lingering_timeout); - - if (rev->ready) { - ngx_http_v2_lingering_close_handler(rev); - } -} - - -static void -ngx_http_v2_lingering_close_handler(ngx_event_t *rev) -{ - ssize_t n; - ngx_msec_t timer; - ngx_connection_t *c; - ngx_http_core_loc_conf_t *clcf; - ngx_http_v2_connection_t *h2c; - u_char buffer[NGX_HTTP_LINGERING_BUFFER_SIZE]; - - c = rev->data; - h2c = c->data; - - ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0, - "http2 lingering close handler"); - - if (rev->timedout || c->close) { - ngx_http_close_connection(c); - return; - } - - timer = (ngx_msec_t) h2c->lingering_time - (ngx_msec_t) ngx_time(); - if ((ngx_msec_int_t) timer <= 0) { - ngx_http_close_connection(c); - return; - } - - do { - n = c->recv(c, buffer, NGX_HTTP_LINGERING_BUFFER_SIZE); - - ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0, "lingering read: %z", n); - - if (n == NGX_AGAIN) { - break; - } - - if (n == NGX_ERROR || n == 0) { - ngx_http_close_connection(c); - return; - } - - } while (rev->ready); - - if (ngx_handle_read_event(rev, 0) != NGX_OK) { - ngx_http_close_connection(c); - return; - } - - clcf = ngx_http_get_module_loc_conf(h2c->http_connection->conf_ctx, - ngx_http_core_module); - timer *= 1000; - - if (timer > clcf->lingering_timeout) { - timer = clcf->lingering_timeout; - } - - ngx_add_timer(rev, timer); -} - - -static u_char * -ngx_http_v2_state_preface(ngx_http_v2_connection_t *h2c, u_char *pos, - u_char *end) -{ - static const u_char preface[] = NGX_HTTP_V2_PREFACE_START; - - if ((size_t) (end - pos) < sizeof(preface) - 1) { - return ngx_http_v2_state_save(h2c, pos, end, ngx_http_v2_state_preface); - } - - if (ngx_memcmp(pos, preface, sizeof(preface) - 1) != 0) { - ngx_log_error(NGX_LOG_INFO, h2c->connection->log, 0, - "invalid connection preface"); - - return ngx_http_v2_connection_error(h2c, NGX_HTTP_V2_PROTOCOL_ERROR); - } - - return ngx_http_v2_state_preface_end(h2c, pos + sizeof(preface) - 1, end); -} - - -static u_char * -ngx_http_v2_state_preface_end(ngx_http_v2_connection_t *h2c, u_char *pos, - u_char *end) -{ - static const u_char preface[] = NGX_HTTP_V2_PREFACE_END; - - if ((size_t) (end - pos) < sizeof(preface) - 1) { - return ngx_http_v2_state_save(h2c, pos, end, - ngx_http_v2_state_preface_end); - } - - if (ngx_memcmp(pos, preface, sizeof(preface) - 1) != 0) { - ngx_log_error(NGX_LOG_INFO, h2c->connection->log, 0, - "invalid connection preface"); - - return ngx_http_v2_connection_error(h2c, NGX_HTTP_V2_PROTOCOL_ERROR); - } - - ngx_log_debug0(NGX_LOG_DEBUG_HTTP, h2c->connection->log, 0, - "http2 preface verified"); - - return ngx_http_v2_state_head(h2c, pos + sizeof(preface) - 1, end); -} - - -static u_char * -ngx_http_v2_state_head(ngx_http_v2_connection_t *h2c, u_char *pos, u_char *end) -{ - uint32_t head; - ngx_uint_t type; - - if (end - pos < NGX_HTTP_V2_FRAME_HEADER_SIZE) { - return ngx_http_v2_state_save(h2c, pos, end, ngx_http_v2_state_head); - } - - head = ngx_http_v2_parse_uint32(pos); - - h2c->state.length = ngx_http_v2_parse_length(head); - h2c->state.flags = pos[4]; - - h2c->state.sid = ngx_http_v2_parse_sid(&pos[5]); - - pos += NGX_HTTP_V2_FRAME_HEADER_SIZE; - - type = ngx_http_v2_parse_type(head); - - ngx_log_debug4(NGX_LOG_DEBUG_HTTP, h2c->connection->log, 0, - "http2 frame type:%ui f:%Xd l:%uz sid:%ui", - type, h2c->state.flags, h2c->state.length, h2c->state.sid); - - if (type >= NGX_HTTP_V2_FRAME_STATES) { - ngx_log_error(NGX_LOG_INFO, h2c->connection->log, 0, - "client sent frame with unknown type %ui", type); - return ngx_http_v2_state_skip(h2c, pos, end); - } - - return ngx_http_v2_frame_states[type](h2c, pos, end); -} - - -static u_char * -ngx_http_v2_state_data(ngx_http_v2_connection_t *h2c, u_char *pos, u_char *end) -{ - size_t size; - ngx_http_v2_node_t *node; - ngx_http_v2_stream_t *stream; - - size = h2c->state.length; - - if (h2c->state.flags & NGX_HTTP_V2_PADDED_FLAG) { - - if (h2c->state.length == 0) { - ngx_log_error(NGX_LOG_INFO, h2c->connection->log, 0, - "client sent padded DATA frame " - "with incorrect length: 0"); - - return ngx_http_v2_connection_error(h2c, NGX_HTTP_V2_SIZE_ERROR); - } - - if (end - pos == 0) { - return ngx_http_v2_state_save(h2c, pos, end, - ngx_http_v2_state_data); - } - - h2c->state.padding = *pos++; - - if (h2c->state.padding >= size) { - ngx_log_error(NGX_LOG_INFO, h2c->connection->log, 0, - "client sent padded DATA frame " - "with incorrect length: %uz, padding: %uz", - size, h2c->state.padding); - - return ngx_http_v2_connection_error(h2c, - NGX_HTTP_V2_PROTOCOL_ERROR); - } - - h2c->state.length -= 1 + h2c->state.padding; - } - - ngx_log_debug0(NGX_LOG_DEBUG_HTTP, h2c->connection->log, 0, - "http2 DATA frame"); - - if (h2c->state.sid == 0) { - ngx_log_error(NGX_LOG_INFO, h2c->connection->log, 0, - "client sent DATA frame with incorrect identifier"); - - return ngx_http_v2_connection_error(h2c, NGX_HTTP_V2_PROTOCOL_ERROR); - } - - if (size > h2c->recv_window) { - ngx_log_error(NGX_LOG_INFO, h2c->connection->log, 0, - "client violated connection flow control: " - "received DATA frame length %uz, available window %uz", - size, h2c->recv_window); - - return ngx_http_v2_connection_error(h2c, NGX_HTTP_V2_FLOW_CTRL_ERROR); - } - - h2c->recv_window -= size; - - if (h2c->recv_window < NGX_HTTP_V2_MAX_WINDOW / 4) { - - if (ngx_http_v2_send_window_update(h2c, 0, NGX_HTTP_V2_MAX_WINDOW - - h2c->recv_window) - == NGX_ERROR) - { - return ngx_http_v2_connection_error(h2c, - NGX_HTTP_V2_INTERNAL_ERROR); - } - - h2c->recv_window = NGX_HTTP_V2_MAX_WINDOW; - } - - node = ngx_http_v2_get_node_by_id(h2c, h2c->state.sid, 0); - - if (node == NULL || node->stream == NULL) { - ngx_log_debug0(NGX_LOG_DEBUG_HTTP, h2c->connection->log, 0, - "unknown http2 stream"); - - return ngx_http_v2_state_skip_padded(h2c, pos, end); - } - - stream = node->stream; - - if (size > stream->recv_window) { - ngx_log_error(NGX_LOG_INFO, h2c->connection->log, 0, - "client violated flow control for stream %ui: " - "received DATA frame length %uz, available window %uz", - node->id, size, stream->recv_window); - - if (ngx_http_v2_terminate_stream(h2c, stream, - NGX_HTTP_V2_FLOW_CTRL_ERROR) - == NGX_ERROR) - { - return ngx_http_v2_connection_error(h2c, - NGX_HTTP_V2_INTERNAL_ERROR); - } - - return ngx_http_v2_state_skip_padded(h2c, pos, end); - } - - stream->recv_window -= size; - - if (stream->no_flow_control - && stream->recv_window < NGX_HTTP_V2_MAX_WINDOW / 4) - { - if (ngx_http_v2_send_window_update(h2c, node->id, - NGX_HTTP_V2_MAX_WINDOW - - stream->recv_window) - == NGX_ERROR) - { - return ngx_http_v2_connection_error(h2c, - NGX_HTTP_V2_INTERNAL_ERROR); - } - - stream->recv_window = NGX_HTTP_V2_MAX_WINDOW; - } - - if (stream->in_closed) { - ngx_log_error(NGX_LOG_INFO, h2c->connection->log, 0, - "client sent DATA frame for half-closed stream %ui", - node->id); - - if (ngx_http_v2_terminate_stream(h2c, stream, - NGX_HTTP_V2_STREAM_CLOSED) - == NGX_ERROR) - { - return ngx_http_v2_connection_error(h2c, - NGX_HTTP_V2_INTERNAL_ERROR); - } - - return ngx_http_v2_state_skip_padded(h2c, pos, end); - } - - h2c->state.stream = stream; - - return ngx_http_v2_state_read_data(h2c, pos, end); -} - - -static u_char * -ngx_http_v2_state_read_data(ngx_http_v2_connection_t *h2c, u_char *pos, - u_char *end) -{ - size_t size; - ngx_buf_t *buf; - ngx_int_t rc; - ngx_connection_t *fc; - ngx_http_request_t *r; - ngx_http_v2_stream_t *stream; - ngx_http_v2_srv_conf_t *h2scf; - - stream = h2c->state.stream; - - if (stream == NULL) { - return ngx_http_v2_state_skip_padded(h2c, pos, end); - } - - if (stream->skip_data) { - ngx_log_debug0(NGX_LOG_DEBUG_HTTP, h2c->connection->log, 0, - "skipping http2 DATA frame"); - - return ngx_http_v2_state_skip_padded(h2c, pos, end); - } - - r = stream->request; - fc = r->connection; - - if (r->reading_body && !r->request_body_no_buffering) { - ngx_log_debug0(NGX_LOG_DEBUG_HTTP, h2c->connection->log, 0, - "skipping http2 DATA frame"); - - return ngx_http_v2_state_skip_padded(h2c, pos, end); - } - - if (r->headers_in.content_length_n < 0 && !r->headers_in.chunked) { - ngx_log_debug0(NGX_LOG_DEBUG_HTTP, h2c->connection->log, 0, - "skipping http2 DATA frame"); - - return ngx_http_v2_state_skip_padded(h2c, pos, end); - } - - size = end - pos; - - if (size >= h2c->state.length) { - size = h2c->state.length; - stream->in_closed = h2c->state.flags & NGX_HTTP_V2_END_STREAM_FLAG; - } - - h2c->payload_bytes += size; - - if (r->request_body) { - rc = ngx_http_v2_process_request_body(r, pos, size, - stream->in_closed, 0); - - if (rc != NGX_OK && rc != NGX_AGAIN) { - stream->skip_data = 1; - ngx_http_finalize_request(r, rc); - } - - ngx_http_run_posted_requests(fc); - - } else if (size) { - buf = stream->preread; - - if (buf == NULL) { - h2scf = ngx_http_get_module_srv_conf(r, ngx_http_v2_module); - - buf = ngx_create_temp_buf(r->pool, h2scf->preread_size); - if (buf == NULL) { - return ngx_http_v2_connection_error(h2c, - NGX_HTTP_V2_INTERNAL_ERROR); - } - - stream->preread = buf; - } - - if (size > (size_t) (buf->end - buf->last)) { - ngx_log_error(NGX_LOG_ALERT, h2c->connection->log, 0, - "http2 preread buffer overflow"); - return ngx_http_v2_connection_error(h2c, - NGX_HTTP_V2_INTERNAL_ERROR); - } - - buf->last = ngx_cpymem(buf->last, pos, size); - } - - pos += size; - h2c->state.length -= size; - - if (h2c->state.length) { - return ngx_http_v2_state_save(h2c, pos, end, - ngx_http_v2_state_read_data); - } - - if (h2c->state.padding) { - return ngx_http_v2_state_skip_padded(h2c, pos, end); - } - - return ngx_http_v2_state_complete(h2c, pos, end); -} - - -static u_char * -ngx_http_v2_state_headers(ngx_http_v2_connection_t *h2c, u_char *pos, - u_char *end) -{ - size_t size; - ngx_uint_t padded, priority, depend, dependency, excl, - weight; - ngx_uint_t status; - ngx_http_v2_node_t *node; - ngx_http_v2_stream_t *stream; - ngx_http_v2_srv_conf_t *h2scf; - ngx_http_core_srv_conf_t *cscf; - ngx_http_core_loc_conf_t *clcf; - - padded = h2c->state.flags & NGX_HTTP_V2_PADDED_FLAG; - priority = h2c->state.flags & NGX_HTTP_V2_PRIORITY_FLAG; - - size = 0; - - if (padded) { - size++; - } - - if (priority) { - size += sizeof(uint32_t) + 1; - } - - if (h2c->state.length < size) { - ngx_log_error(NGX_LOG_INFO, h2c->connection->log, 0, - "client sent HEADERS frame with incorrect length %uz", - h2c->state.length); - - return ngx_http_v2_connection_error(h2c, NGX_HTTP_V2_SIZE_ERROR); - } - - if (h2c->state.length == size) { - ngx_log_error(NGX_LOG_INFO, h2c->connection->log, 0, - "client sent HEADERS frame with empty header block"); - - return ngx_http_v2_connection_error(h2c, NGX_HTTP_V2_SIZE_ERROR); - } - - if (h2c->goaway) { - ngx_log_debug0(NGX_LOG_DEBUG_HTTP, h2c->connection->log, 0, - "skipping http2 HEADERS frame"); - return ngx_http_v2_state_skip(h2c, pos, end); - } - - if ((size_t) (end - pos) < size) { - return ngx_http_v2_state_save(h2c, pos, end, - ngx_http_v2_state_headers); - } - - h2c->state.length -= size; - - if (padded) { - h2c->state.padding = *pos++; - - if (h2c->state.padding > h2c->state.length) { - ngx_log_error(NGX_LOG_INFO, h2c->connection->log, 0, - "client sent padded HEADERS frame " - "with incorrect length: %uz, padding: %uz", - h2c->state.length, h2c->state.padding); - - return ngx_http_v2_connection_error(h2c, - NGX_HTTP_V2_PROTOCOL_ERROR); - } - - h2c->state.length -= h2c->state.padding; - } - - depend = 0; - excl = 0; - weight = NGX_HTTP_V2_DEFAULT_WEIGHT; - - if (priority) { - dependency = ngx_http_v2_parse_uint32(pos); - - depend = dependency & 0x7fffffff; - excl = dependency >> 31; - weight = pos[4] + 1; - - pos += sizeof(uint32_t) + 1; - } - - ngx_log_debug4(NGX_LOG_DEBUG_HTTP, h2c->connection->log, 0, - "http2 HEADERS frame sid:%ui " - "depends on %ui excl:%ui weight:%ui", - h2c->state.sid, depend, excl, weight); - - if (h2c->state.sid % 2 == 0 || h2c->state.sid <= h2c->last_sid) { - ngx_log_error(NGX_LOG_INFO, h2c->connection->log, 0, - "client sent HEADERS frame with incorrect identifier " - "%ui, the last was %ui", h2c->state.sid, h2c->last_sid); - - return ngx_http_v2_connection_error(h2c, NGX_HTTP_V2_PROTOCOL_ERROR); - } - - if (depend == h2c->state.sid) { - ngx_log_error(NGX_LOG_INFO, h2c->connection->log, 0, - "client sent HEADERS frame for stream %ui " - "with incorrect dependency", h2c->state.sid); - - return ngx_http_v2_connection_error(h2c, NGX_HTTP_V2_PROTOCOL_ERROR); - } - - h2c->last_sid = h2c->state.sid; - - h2c->state.pool = ngx_create_pool(1024, h2c->connection->log); - if (h2c->state.pool == NULL) { - return ngx_http_v2_connection_error(h2c, NGX_HTTP_V2_INTERNAL_ERROR); - } - - cscf = ngx_http_get_module_srv_conf(h2c->http_connection->conf_ctx, - ngx_http_core_module); - - h2c->state.header_limit = cscf->large_client_header_buffers.size - * cscf->large_client_header_buffers.num; - - h2scf = ngx_http_get_module_srv_conf(h2c->http_connection->conf_ctx, - ngx_http_v2_module); - - if (h2c->processing >= h2scf->concurrent_streams) { - ngx_log_error(NGX_LOG_INFO, h2c->connection->log, 0, - "concurrent streams exceeded %ui", h2c->processing); - - status = NGX_HTTP_V2_REFUSED_STREAM; - goto rst_stream; - } - - if (h2c->new_streams++ >= 2 * h2scf->concurrent_streams) { - ngx_log_error(NGX_LOG_INFO, h2c->connection->log, 0, - "client sent too many streams at once"); - - status = NGX_HTTP_V2_REFUSED_STREAM; - goto rst_stream; - } - - if (!h2c->settings_ack - && !(h2c->state.flags & NGX_HTTP_V2_END_STREAM_FLAG) - && h2scf->preread_size < NGX_HTTP_V2_DEFAULT_WINDOW) - { - ngx_log_error(NGX_LOG_INFO, h2c->connection->log, 0, - "client sent stream with data " - "before settings were acknowledged"); - - status = NGX_HTTP_V2_REFUSED_STREAM; - goto rst_stream; - } - - node = ngx_http_v2_get_node_by_id(h2c, h2c->state.sid, 1); - - if (node == NULL) { - return ngx_http_v2_connection_error(h2c, NGX_HTTP_V2_INTERNAL_ERROR); - } - - if (node->parent) { - ngx_queue_remove(&node->reuse); - h2c->closed_nodes--; - } - - stream = ngx_http_v2_create_stream(h2c); - if (stream == NULL) { - return ngx_http_v2_connection_error(h2c, NGX_HTTP_V2_INTERNAL_ERROR); - } - - h2c->state.stream = stream; - - stream->pool = h2c->state.pool; - h2c->state.keep_pool = 1; - - stream->request->request_length = h2c->state.length; - - stream->in_closed = h2c->state.flags & NGX_HTTP_V2_END_STREAM_FLAG; - stream->node = node; - - node->stream = stream; - - if (priority || node->parent == NULL) { - node->weight = weight; - ngx_http_v2_set_dependency(h2c, node, depend, excl); - } - - clcf = ngx_http_get_module_loc_conf(h2c->http_connection->conf_ctx, - ngx_http_core_module); - - if (clcf->keepalive_timeout == 0 - || h2c->connection->requests >= clcf->keepalive_requests - || ngx_current_msec - h2c->connection->start_time - > clcf->keepalive_time) - { - h2c->goaway = 1; - - if (ngx_http_v2_send_goaway(h2c, NGX_HTTP_V2_NO_ERROR) == NGX_ERROR) { - return ngx_http_v2_connection_error(h2c, - NGX_HTTP_V2_INTERNAL_ERROR); - } - } - - return ngx_http_v2_state_header_block(h2c, pos, end); - -rst_stream: - - if (h2c->refused_streams++ > ngx_max(h2scf->concurrent_streams, 100)) { - ngx_log_error(NGX_LOG_INFO, h2c->connection->log, 0, - "client sent too many refused streams"); - return ngx_http_v2_connection_error(h2c, NGX_HTTP_V2_NO_ERROR); - } - - if (ngx_http_v2_send_rst_stream(h2c, h2c->state.sid, status) != NGX_OK) { - return ngx_http_v2_connection_error(h2c, NGX_HTTP_V2_INTERNAL_ERROR); - } - - return ngx_http_v2_state_header_block(h2c, pos, end); -} - - -static u_char * -ngx_http_v2_state_header_block(ngx_http_v2_connection_t *h2c, u_char *pos, - u_char *end) -{ - u_char ch; - ngx_int_t value; - ngx_uint_t indexed, size_update, prefix; - - if (end - pos < 1) { - return ngx_http_v2_state_headers_save(h2c, pos, end, - ngx_http_v2_state_header_block); - } - - if (!(h2c->state.flags & NGX_HTTP_V2_END_HEADERS_FLAG) - && h2c->state.length < NGX_HTTP_V2_INT_OCTETS) - { - return ngx_http_v2_handle_continuation(h2c, pos, end, - ngx_http_v2_state_header_block); - } - - size_update = 0; - indexed = 0; - - ch = *pos; - - if (ch >= (1 << 7)) { - /* indexed header field */ - indexed = 1; - prefix = ngx_http_v2_prefix(7); - - } else if (ch >= (1 << 6)) { - /* literal header field with incremental indexing */ - h2c->state.index = 1; - prefix = ngx_http_v2_prefix(6); - - } else if (ch >= (1 << 5)) { - /* dynamic table size update */ - size_update = 1; - prefix = ngx_http_v2_prefix(5); - - } else if (ch >= (1 << 4)) { - /* literal header field never indexed */ - prefix = ngx_http_v2_prefix(4); - - } else { - /* literal header field without indexing */ - prefix = ngx_http_v2_prefix(4); - } - - value = ngx_http_v2_parse_int(h2c, &pos, end, prefix); - - if (value < 0) { - if (value == NGX_AGAIN) { - return ngx_http_v2_state_headers_save(h2c, pos, end, - ngx_http_v2_state_header_block); - } - - if (value == NGX_DECLINED) { - ngx_log_error(NGX_LOG_INFO, h2c->connection->log, 0, - "client sent header block with too long %s value", - size_update ? "size update" : "header index"); - - return ngx_http_v2_connection_error(h2c, NGX_HTTP_V2_COMP_ERROR); - } - - ngx_log_error(NGX_LOG_INFO, h2c->connection->log, 0, - "client sent header block with incorrect length"); - - return ngx_http_v2_connection_error(h2c, NGX_HTTP_V2_SIZE_ERROR); - } - - if (indexed) { - if (ngx_http_v2_get_indexed_header(h2c, value, 0) != NGX_OK) { - return ngx_http_v2_connection_error(h2c, NGX_HTTP_V2_COMP_ERROR); - } - - return ngx_http_v2_state_process_header(h2c, pos, end); - } - - if (size_update) { - if (ngx_http_v2_table_size(h2c, value) != NGX_OK) { - return ngx_http_v2_connection_error(h2c, NGX_HTTP_V2_COMP_ERROR); - } - - return ngx_http_v2_state_header_complete(h2c, pos, end); - } - - if (value == 0) { - h2c->state.parse_name = 1; - - } else if (ngx_http_v2_get_indexed_header(h2c, value, 1) != NGX_OK) { - return ngx_http_v2_connection_error(h2c, NGX_HTTP_V2_COMP_ERROR); - } - - h2c->state.parse_value = 1; - - return ngx_http_v2_state_field_len(h2c, pos, end); -} - - -static u_char * -ngx_http_v2_state_field_len(ngx_http_v2_connection_t *h2c, u_char *pos, - u_char *end) -{ - size_t alloc; - ngx_int_t len; - ngx_uint_t huff; - ngx_http_core_srv_conf_t *cscf; - - if (!(h2c->state.flags & NGX_HTTP_V2_END_HEADERS_FLAG) - && h2c->state.length < NGX_HTTP_V2_INT_OCTETS) - { - return ngx_http_v2_handle_continuation(h2c, pos, end, - ngx_http_v2_state_field_len); - } - - if (h2c->state.length < 1) { - ngx_log_error(NGX_LOG_INFO, h2c->connection->log, 0, - "client sent header block with incorrect length"); - - return ngx_http_v2_connection_error(h2c, NGX_HTTP_V2_SIZE_ERROR); - } - - if (end - pos < 1) { - return ngx_http_v2_state_headers_save(h2c, pos, end, - ngx_http_v2_state_field_len); - } - - huff = *pos >> 7; - len = ngx_http_v2_parse_int(h2c, &pos, end, ngx_http_v2_prefix(7)); - - if (len < 0) { - if (len == NGX_AGAIN) { - return ngx_http_v2_state_headers_save(h2c, pos, end, - ngx_http_v2_state_field_len); - } - - if (len == NGX_DECLINED) { - ngx_log_error(NGX_LOG_INFO, h2c->connection->log, 0, - "client sent header field with too long length value"); - - return ngx_http_v2_connection_error(h2c, NGX_HTTP_V2_COMP_ERROR); - } - - ngx_log_error(NGX_LOG_INFO, h2c->connection->log, 0, - "client sent header block with incorrect length"); - - return ngx_http_v2_connection_error(h2c, NGX_HTTP_V2_SIZE_ERROR); - } - - ngx_log_debug2(NGX_LOG_DEBUG_HTTP, h2c->connection->log, 0, - "http2 %s string, len:%i", - huff ? "encoded" : "raw", len); - - cscf = ngx_http_get_module_srv_conf(h2c->http_connection->conf_ctx, - ngx_http_core_module); - - if ((size_t) len > cscf->large_client_header_buffers.size) { - ngx_log_error(NGX_LOG_INFO, h2c->connection->log, 0, - "client sent too large header field"); - - return ngx_http_v2_connection_error(h2c, NGX_HTTP_V2_ENHANCE_YOUR_CALM); - } - - h2c->state.field_rest = len; - - if (h2c->state.stream == NULL && !h2c->state.index) { - return ngx_http_v2_state_field_skip(h2c, pos, end); - } - - alloc = (huff ? len * 8 / 5 : len) + 1; - - h2c->state.field_start = ngx_pnalloc(h2c->state.pool, alloc); - if (h2c->state.field_start == NULL) { - return ngx_http_v2_connection_error(h2c, NGX_HTTP_V2_INTERNAL_ERROR); - } - - h2c->state.field_end = h2c->state.field_start; - - if (huff) { - return ngx_http_v2_state_field_huff(h2c, pos, end); - } - - return ngx_http_v2_state_field_raw(h2c, pos, end); -} - - -static u_char * -ngx_http_v2_state_field_huff(ngx_http_v2_connection_t *h2c, u_char *pos, - u_char *end) -{ - size_t size; - - size = end - pos; - - if (size > h2c->state.field_rest) { - size = h2c->state.field_rest; - } - - if (size > h2c->state.length) { - size = h2c->state.length; - } - - h2c->state.length -= size; - h2c->state.field_rest -= size; - - if (ngx_http_huff_decode(&h2c->state.field_state, pos, size, - &h2c->state.field_end, - h2c->state.field_rest == 0, - h2c->connection->log) - != NGX_OK) - { - ngx_log_error(NGX_LOG_INFO, h2c->connection->log, 0, - "client sent invalid encoded header field"); - - return ngx_http_v2_connection_error(h2c, NGX_HTTP_V2_COMP_ERROR); - } - - pos += size; - - if (h2c->state.field_rest == 0) { - *h2c->state.field_end = '\0'; - return ngx_http_v2_state_process_header(h2c, pos, end); - } - - if (h2c->state.length) { - return ngx_http_v2_state_headers_save(h2c, pos, end, - ngx_http_v2_state_field_huff); - } - - if (h2c->state.flags & NGX_HTTP_V2_END_HEADERS_FLAG) { - ngx_log_error(NGX_LOG_INFO, h2c->connection->log, 0, - "client sent header field with incorrect length"); - - return ngx_http_v2_connection_error(h2c, NGX_HTTP_V2_SIZE_ERROR); - } - - return ngx_http_v2_handle_continuation(h2c, pos, end, - ngx_http_v2_state_field_huff); -} - - -static u_char * -ngx_http_v2_state_field_raw(ngx_http_v2_connection_t *h2c, u_char *pos, - u_char *end) -{ - size_t size; - - size = end - pos; - - if (size > h2c->state.field_rest) { - size = h2c->state.field_rest; - } - - if (size > h2c->state.length) { - size = h2c->state.length; - } - - h2c->state.length -= size; - h2c->state.field_rest -= size; - - h2c->state.field_end = ngx_cpymem(h2c->state.field_end, pos, size); - - pos += size; - - if (h2c->state.field_rest == 0) { - *h2c->state.field_end = '\0'; - return ngx_http_v2_state_process_header(h2c, pos, end); - } - - if (h2c->state.length) { - return ngx_http_v2_state_headers_save(h2c, pos, end, - ngx_http_v2_state_field_raw); - } - - if (h2c->state.flags & NGX_HTTP_V2_END_HEADERS_FLAG) { - ngx_log_error(NGX_LOG_INFO, h2c->connection->log, 0, - "client sent header field with incorrect length"); - - return ngx_http_v2_connection_error(h2c, NGX_HTTP_V2_SIZE_ERROR); - } - - return ngx_http_v2_handle_continuation(h2c, pos, end, - ngx_http_v2_state_field_raw); -} - - -static u_char * -ngx_http_v2_state_field_skip(ngx_http_v2_connection_t *h2c, u_char *pos, - u_char *end) -{ - size_t size; - - size = end - pos; - - if (size > h2c->state.field_rest) { - size = h2c->state.field_rest; - } - - if (size > h2c->state.length) { - size = h2c->state.length; - } - - h2c->state.length -= size; - h2c->state.field_rest -= size; - - pos += size; - - if (h2c->state.field_rest == 0) { - return ngx_http_v2_state_process_header(h2c, pos, end); - } - - if (h2c->state.length) { - return ngx_http_v2_state_save(h2c, pos, end, - ngx_http_v2_state_field_skip); - } - - if (h2c->state.flags & NGX_HTTP_V2_END_HEADERS_FLAG) { - ngx_log_error(NGX_LOG_INFO, h2c->connection->log, 0, - "client sent header field with incorrect length"); - - return ngx_http_v2_connection_error(h2c, NGX_HTTP_V2_SIZE_ERROR); - } - - return ngx_http_v2_handle_continuation(h2c, pos, end, - ngx_http_v2_state_field_skip); -} - - -static u_char * -ngx_http_v2_state_process_header(ngx_http_v2_connection_t *h2c, u_char *pos, - u_char *end) -{ - size_t len; - ngx_int_t rc; - ngx_table_elt_t *h; - ngx_connection_t *fc; - ngx_http_header_t *hh; - ngx_http_request_t *r; - ngx_http_v2_header_t *header; - ngx_http_core_srv_conf_t *cscf; - ngx_http_core_main_conf_t *cmcf; - - static ngx_str_t cookie = ngx_string("cookie"); - - header = &h2c->state.header; - - if (h2c->state.parse_name) { - h2c->state.parse_name = 0; - - header->name.len = h2c->state.field_end - h2c->state.field_start; - header->name.data = h2c->state.field_start; - - if (header->name.len == 0) { - ngx_log_error(NGX_LOG_INFO, h2c->connection->log, 0, - "client sent zero header name length"); - - return ngx_http_v2_connection_error(h2c, - NGX_HTTP_V2_PROTOCOL_ERROR); - } - - return ngx_http_v2_state_field_len(h2c, pos, end); - } - - if (h2c->state.parse_value) { - h2c->state.parse_value = 0; - - header->value.len = h2c->state.field_end - h2c->state.field_start; - header->value.data = h2c->state.field_start; - } - - len = header->name.len + header->value.len; - - if (len > h2c->state.header_limit) { - ngx_log_error(NGX_LOG_INFO, h2c->connection->log, 0, - "client sent too large header"); - - return ngx_http_v2_connection_error(h2c, NGX_HTTP_V2_ENHANCE_YOUR_CALM); - } - - h2c->state.header_limit -= len; - - if (h2c->state.index) { - if (ngx_http_v2_add_header(h2c, header) != NGX_OK) { - return ngx_http_v2_connection_error(h2c, - NGX_HTTP_V2_INTERNAL_ERROR); - } - - h2c->state.index = 0; - } - - if (h2c->state.stream == NULL) { - return ngx_http_v2_state_header_complete(h2c, pos, end); - } - - r = h2c->state.stream->request; - fc = r->connection; - - /* TODO Optimization: validate headers while parsing. */ - if (ngx_http_v2_validate_header(r, header) != NGX_OK) { - ngx_http_finalize_request(r, NGX_HTTP_BAD_REQUEST); - goto error; - } - - if (header->name.data[0] == ':') { - rc = ngx_http_v2_pseudo_header(r, header); - - if (rc == NGX_OK) { - ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "http2 header: \":%V: %V\"", - &header->name, &header->value); - - return ngx_http_v2_state_header_complete(h2c, pos, end); - } - - if (rc == NGX_ABORT) { - goto error; - } - - if (rc == NGX_DECLINED) { - ngx_http_finalize_request(r, NGX_HTTP_BAD_REQUEST); - goto error; - } - - return ngx_http_v2_connection_error(h2c, NGX_HTTP_V2_INTERNAL_ERROR); - } - - if (r->invalid_header) { - cscf = ngx_http_get_module_srv_conf(r, ngx_http_core_module); - - if (cscf->ignore_invalid_headers) { - ngx_log_error(NGX_LOG_INFO, r->connection->log, 0, - "client sent invalid header: \"%V\"", &header->name); - - return ngx_http_v2_state_header_complete(h2c, pos, end); - } - } - - if (header->name.len == cookie.len - && ngx_memcmp(header->name.data, cookie.data, cookie.len) == 0) - { - if (ngx_http_v2_cookie(r, header) != NGX_OK) { - return ngx_http_v2_connection_error(h2c, - NGX_HTTP_V2_INTERNAL_ERROR); - } - - } else { - cscf = ngx_http_get_module_srv_conf(r, ngx_http_core_module); - - if (r->headers_in.count++ >= cscf->max_headers) { - ngx_log_error(NGX_LOG_INFO, r->connection->log, 0, - "client sent too many header lines"); - ngx_http_finalize_request(r, NGX_HTTP_REQUEST_HEADER_TOO_LARGE); - goto error; - } - - h = ngx_list_push(&r->headers_in.headers); - if (h == NULL) { - return ngx_http_v2_connection_error(h2c, - NGX_HTTP_V2_INTERNAL_ERROR); - } - - h->key.len = header->name.len; - h->key.data = header->name.data; - - /* - * TODO Optimization: precalculate hash - * and handler for indexed headers. - */ - h->hash = ngx_hash_key(h->key.data, h->key.len); - - h->value.len = header->value.len; - h->value.data = header->value.data; - - h->lowcase_key = h->key.data; - - cmcf = ngx_http_get_module_main_conf(r, ngx_http_core_module); - - hh = ngx_hash_find(&cmcf->headers_in_hash, h->hash, - h->lowcase_key, h->key.len); - - if (hh && hh->handler(r, h, hh->offset) != NGX_OK) { - goto error; - } - } - - ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "http2 header: \"%V: %V\"", - &header->name, &header->value); - - return ngx_http_v2_state_header_complete(h2c, pos, end); - -error: - - h2c->state.stream = NULL; - - ngx_http_run_posted_requests(fc); - - return ngx_http_v2_state_header_complete(h2c, pos, end); -} - - -static u_char * -ngx_http_v2_state_header_complete(ngx_http_v2_connection_t *h2c, u_char *pos, - u_char *end) -{ - ngx_http_v2_stream_t *stream; - - if (h2c->state.length) { - if (end - pos > 0) { - h2c->state.handler = ngx_http_v2_state_header_block; - return pos; - } - - return ngx_http_v2_state_headers_save(h2c, pos, end, - ngx_http_v2_state_header_block); - } - - if (!(h2c->state.flags & NGX_HTTP_V2_END_HEADERS_FLAG)) { - return ngx_http_v2_handle_continuation(h2c, pos, end, - ngx_http_v2_state_header_complete); - } - - stream = h2c->state.stream; - - if (stream) { - ngx_http_v2_run_request(stream->request); - } - - if (!h2c->state.keep_pool) { - ngx_destroy_pool(h2c->state.pool); - } - - h2c->state.pool = NULL; - h2c->state.keep_pool = 0; - - if (h2c->state.padding) { - return ngx_http_v2_state_skip_padded(h2c, pos, end); - } - - return ngx_http_v2_state_complete(h2c, pos, end); -} - - -static u_char * -ngx_http_v2_handle_continuation(ngx_http_v2_connection_t *h2c, u_char *pos, - u_char *end, ngx_http_v2_handler_pt handler) -{ - u_char *p; - size_t len, skip; - uint32_t head; - - len = h2c->state.length; - - if (h2c->state.padding && (size_t) (end - pos) > len) { - skip = ngx_min(h2c->state.padding, (end - pos) - len); - - h2c->state.padding -= skip; - - p = pos; - pos += skip; - ngx_memmove(pos, p, len); - } - - if ((size_t) (end - pos) < len + NGX_HTTP_V2_FRAME_HEADER_SIZE) { - return ngx_http_v2_state_headers_save(h2c, pos, end, handler); - } - - p = pos + len; - - head = ngx_http_v2_parse_uint32(p); - - if (ngx_http_v2_parse_type(head) != NGX_HTTP_V2_CONTINUATION_FRAME) { - ngx_log_error(NGX_LOG_INFO, h2c->connection->log, 0, - "client sent inappropriate frame while CONTINUATION was expected"); - - return ngx_http_v2_connection_error(h2c, NGX_HTTP_V2_PROTOCOL_ERROR); - } - - h2c->state.flags |= p[4]; - - if (h2c->state.sid != ngx_http_v2_parse_sid(&p[5])) { - ngx_log_error(NGX_LOG_INFO, h2c->connection->log, 0, - "client sent CONTINUATION frame with incorrect identifier"); - - return ngx_http_v2_connection_error(h2c, NGX_HTTP_V2_PROTOCOL_ERROR); - } - - p = pos; - pos += NGX_HTTP_V2_FRAME_HEADER_SIZE; - - ngx_memcpy(pos, p, len); - - len = ngx_http_v2_parse_length(head); - - h2c->state.length += len; - - if (h2c->state.stream) { - h2c->state.stream->request->request_length += len; - } - - h2c->state.handler = handler; - return pos; -} - - -static u_char * -ngx_http_v2_state_priority(ngx_http_v2_connection_t *h2c, u_char *pos, - u_char *end) -{ - ngx_uint_t depend, dependency, excl, weight; - ngx_http_v2_node_t *node; - - if (h2c->state.length != NGX_HTTP_V2_PRIORITY_SIZE) { - ngx_log_error(NGX_LOG_INFO, h2c->connection->log, 0, - "client sent PRIORITY frame with incorrect length %uz", - h2c->state.length); - - return ngx_http_v2_connection_error(h2c, NGX_HTTP_V2_SIZE_ERROR); - } - - if (--h2c->priority_limit == 0) { - ngx_log_error(NGX_LOG_INFO, h2c->connection->log, 0, - "client sent too many PRIORITY frames"); - - return ngx_http_v2_connection_error(h2c, NGX_HTTP_V2_ENHANCE_YOUR_CALM); - } - - if (end - pos < NGX_HTTP_V2_PRIORITY_SIZE) { - return ngx_http_v2_state_save(h2c, pos, end, - ngx_http_v2_state_priority); - } - - dependency = ngx_http_v2_parse_uint32(pos); - - depend = dependency & 0x7fffffff; - excl = dependency >> 31; - weight = pos[4] + 1; - - pos += NGX_HTTP_V2_PRIORITY_SIZE; - - ngx_log_debug4(NGX_LOG_DEBUG_HTTP, h2c->connection->log, 0, - "http2 PRIORITY frame sid:%ui " - "depends on %ui excl:%ui weight:%ui", - h2c->state.sid, depend, excl, weight); - - if (h2c->state.sid == 0) { - ngx_log_error(NGX_LOG_INFO, h2c->connection->log, 0, - "client sent PRIORITY frame with incorrect identifier"); - - return ngx_http_v2_connection_error(h2c, NGX_HTTP_V2_PROTOCOL_ERROR); - } - - if (depend == h2c->state.sid) { - ngx_log_error(NGX_LOG_INFO, h2c->connection->log, 0, - "client sent PRIORITY frame for stream %ui " - "with incorrect dependency", h2c->state.sid); - - return ngx_http_v2_connection_error(h2c, NGX_HTTP_V2_PROTOCOL_ERROR); - } - - node = ngx_http_v2_get_node_by_id(h2c, h2c->state.sid, 1); - - if (node == NULL) { - return ngx_http_v2_connection_error(h2c, NGX_HTTP_V2_INTERNAL_ERROR); - } - - node->weight = weight; - - if (node->stream == NULL) { - if (node->parent == NULL) { - h2c->closed_nodes++; - - } else { - ngx_queue_remove(&node->reuse); - } - - ngx_queue_insert_tail(&h2c->closed, &node->reuse); - } - - ngx_http_v2_set_dependency(h2c, node, depend, excl); - - return ngx_http_v2_state_complete(h2c, pos, end); -} - - -static u_char * -ngx_http_v2_state_rst_stream(ngx_http_v2_connection_t *h2c, u_char *pos, - u_char *end) -{ - ngx_uint_t status; - ngx_event_t *ev; - ngx_connection_t *fc; - ngx_http_v2_node_t *node; - ngx_http_v2_stream_t *stream; - - if (h2c->state.length != NGX_HTTP_V2_RST_STREAM_SIZE) { - ngx_log_error(NGX_LOG_INFO, h2c->connection->log, 0, - "client sent RST_STREAM frame with incorrect length %uz", - h2c->state.length); - - return ngx_http_v2_connection_error(h2c, NGX_HTTP_V2_SIZE_ERROR); - } - - if (end - pos < NGX_HTTP_V2_RST_STREAM_SIZE) { - return ngx_http_v2_state_save(h2c, pos, end, - ngx_http_v2_state_rst_stream); - } - - status = ngx_http_v2_parse_uint32(pos); - - pos += NGX_HTTP_V2_RST_STREAM_SIZE; - - ngx_log_debug2(NGX_LOG_DEBUG_HTTP, h2c->connection->log, 0, - "http2 RST_STREAM frame, sid:%ui status:%ui", - h2c->state.sid, status); - - if (h2c->state.sid == 0) { - ngx_log_error(NGX_LOG_INFO, h2c->connection->log, 0, - "client sent RST_STREAM frame with incorrect identifier"); - - return ngx_http_v2_connection_error(h2c, NGX_HTTP_V2_PROTOCOL_ERROR); - } - - node = ngx_http_v2_get_node_by_id(h2c, h2c->state.sid, 0); - - if (node == NULL || node->stream == NULL) { - ngx_log_debug0(NGX_LOG_DEBUG_HTTP, h2c->connection->log, 0, - "unknown http2 stream"); - - return ngx_http_v2_state_complete(h2c, pos, end); - } - - stream = node->stream; - - stream->in_closed = 1; - stream->out_closed = 1; - - fc = stream->request->connection; - fc->error = 1; - - switch (status) { - - case NGX_HTTP_V2_CANCEL: - ngx_log_error(NGX_LOG_INFO, fc->log, 0, - "client canceled stream %ui", h2c->state.sid); - break; - - case NGX_HTTP_V2_INTERNAL_ERROR: - ngx_log_error(NGX_LOG_INFO, fc->log, 0, - "client terminated stream %ui due to internal error", - h2c->state.sid); - break; - - default: - ngx_log_error(NGX_LOG_INFO, fc->log, 0, - "client terminated stream %ui with status %ui", - h2c->state.sid, status); - break; - } - - ev = fc->read; - ev->handler(ev); - - return ngx_http_v2_state_complete(h2c, pos, end); -} - - -static u_char * -ngx_http_v2_state_settings(ngx_http_v2_connection_t *h2c, u_char *pos, - u_char *end) -{ - ngx_log_debug0(NGX_LOG_DEBUG_HTTP, h2c->connection->log, 0, - "http2 SETTINGS frame"); - - if (h2c->state.sid) { - ngx_log_error(NGX_LOG_INFO, h2c->connection->log, 0, - "client sent SETTINGS frame with incorrect identifier"); - - return ngx_http_v2_connection_error(h2c, NGX_HTTP_V2_PROTOCOL_ERROR); - } - - if (h2c->state.flags == NGX_HTTP_V2_ACK_FLAG) { - - if (h2c->state.length != 0) { - ngx_log_error(NGX_LOG_INFO, h2c->connection->log, 0, - "client sent SETTINGS frame with the ACK flag " - "and nonzero length"); - - return ngx_http_v2_connection_error(h2c, NGX_HTTP_V2_SIZE_ERROR); - } - - h2c->settings_ack = 1; - - return ngx_http_v2_state_complete(h2c, pos, end); - } - - if (h2c->state.length % NGX_HTTP_V2_SETTINGS_PARAM_SIZE) { - ngx_log_error(NGX_LOG_INFO, h2c->connection->log, 0, - "client sent SETTINGS frame with incorrect length %uz", - h2c->state.length); - - return ngx_http_v2_connection_error(h2c, NGX_HTTP_V2_SIZE_ERROR); - } - - return ngx_http_v2_state_settings_params(h2c, pos, end); -} - - -static u_char * -ngx_http_v2_state_settings_params(ngx_http_v2_connection_t *h2c, u_char *pos, - u_char *end) -{ - ssize_t window_delta; - ngx_uint_t id, value; - ngx_http_v2_out_frame_t *frame; - - window_delta = 0; - - while (h2c->state.length) { - if (end - pos < NGX_HTTP_V2_SETTINGS_PARAM_SIZE) { - return ngx_http_v2_state_save(h2c, pos, end, - ngx_http_v2_state_settings_params); - } - - h2c->state.length -= NGX_HTTP_V2_SETTINGS_PARAM_SIZE; - - id = ngx_http_v2_parse_uint16(pos); - value = ngx_http_v2_parse_uint32(&pos[2]); - - ngx_log_debug2(NGX_LOG_DEBUG_HTTP, h2c->connection->log, 0, - "http2 setting %ui:%ui", id, value); - - switch (id) { - - case NGX_HTTP_V2_INIT_WINDOW_SIZE_SETTING: - - if (value > NGX_HTTP_V2_MAX_WINDOW) { - ngx_log_error(NGX_LOG_INFO, h2c->connection->log, 0, - "client sent SETTINGS frame with incorrect " - "INITIAL_WINDOW_SIZE value %ui", value); - - return ngx_http_v2_connection_error(h2c, - NGX_HTTP_V2_FLOW_CTRL_ERROR); - } - - window_delta = value - h2c->init_window; - break; - - case NGX_HTTP_V2_MAX_FRAME_SIZE_SETTING: - - if (value > NGX_HTTP_V2_MAX_FRAME_SIZE - || value < NGX_HTTP_V2_DEFAULT_FRAME_SIZE) - { - ngx_log_error(NGX_LOG_INFO, h2c->connection->log, 0, - "client sent SETTINGS frame with incorrect " - "MAX_FRAME_SIZE value %ui", value); - - return ngx_http_v2_connection_error(h2c, - NGX_HTTP_V2_PROTOCOL_ERROR); - } - - h2c->frame_size = value; - break; - - case NGX_HTTP_V2_ENABLE_PUSH_SETTING: - - if (value > 1) { - ngx_log_error(NGX_LOG_INFO, h2c->connection->log, 0, - "client sent SETTINGS frame with incorrect " - "ENABLE_PUSH value %ui", value); - - return ngx_http_v2_connection_error(h2c, - NGX_HTTP_V2_PROTOCOL_ERROR); - } - - break; - - case NGX_HTTP_V2_HEADER_TABLE_SIZE_SETTING: - - h2c->table_update = 1; - break; - - default: - break; - } - - pos += NGX_HTTP_V2_SETTINGS_PARAM_SIZE; - } - - frame = ngx_http_v2_get_frame(h2c, NGX_HTTP_V2_SETTINGS_ACK_SIZE, - NGX_HTTP_V2_SETTINGS_FRAME, - NGX_HTTP_V2_ACK_FLAG, 0); - if (frame == NULL) { - return ngx_http_v2_connection_error(h2c, NGX_HTTP_V2_INTERNAL_ERROR); - } - - ngx_http_v2_queue_ordered_frame(h2c, frame); - - if (window_delta) { - h2c->init_window += window_delta; - - if (ngx_http_v2_adjust_windows(h2c, window_delta) != NGX_OK) { - return ngx_http_v2_connection_error(h2c, - NGX_HTTP_V2_INTERNAL_ERROR); - } - } - - return ngx_http_v2_state_complete(h2c, pos, end); -} - - -static u_char * -ngx_http_v2_state_push_promise(ngx_http_v2_connection_t *h2c, u_char *pos, - u_char *end) -{ - ngx_log_error(NGX_LOG_INFO, h2c->connection->log, 0, - "client sent PUSH_PROMISE frame"); - - return ngx_http_v2_connection_error(h2c, NGX_HTTP_V2_PROTOCOL_ERROR); -} - - -static u_char * -ngx_http_v2_state_ping(ngx_http_v2_connection_t *h2c, u_char *pos, u_char *end) -{ - ngx_buf_t *buf; - ngx_http_v2_out_frame_t *frame; - - if (h2c->state.length != NGX_HTTP_V2_PING_SIZE) { - ngx_log_error(NGX_LOG_INFO, h2c->connection->log, 0, - "client sent PING frame with incorrect length %uz", - h2c->state.length); - - return ngx_http_v2_connection_error(h2c, NGX_HTTP_V2_SIZE_ERROR); - } - - if (end - pos < NGX_HTTP_V2_PING_SIZE) { - return ngx_http_v2_state_save(h2c, pos, end, ngx_http_v2_state_ping); - } - - ngx_log_debug0(NGX_LOG_DEBUG_HTTP, h2c->connection->log, 0, - "http2 PING frame"); - - if (h2c->state.sid) { - ngx_log_error(NGX_LOG_INFO, h2c->connection->log, 0, - "client sent PING frame with incorrect identifier"); - - return ngx_http_v2_connection_error(h2c, NGX_HTTP_V2_PROTOCOL_ERROR); - } - - if (h2c->state.flags & NGX_HTTP_V2_ACK_FLAG) { - return ngx_http_v2_state_skip(h2c, pos, end); - } - - frame = ngx_http_v2_get_frame(h2c, NGX_HTTP_V2_PING_SIZE, - NGX_HTTP_V2_PING_FRAME, - NGX_HTTP_V2_ACK_FLAG, 0); - if (frame == NULL) { - return ngx_http_v2_connection_error(h2c, NGX_HTTP_V2_INTERNAL_ERROR); - } - - buf = frame->first->buf; - - buf->last = ngx_cpymem(buf->last, pos, NGX_HTTP_V2_PING_SIZE); - - ngx_http_v2_queue_blocked_frame(h2c, frame); - - return ngx_http_v2_state_complete(h2c, pos + NGX_HTTP_V2_PING_SIZE, end); -} - - -static u_char * -ngx_http_v2_state_goaway(ngx_http_v2_connection_t *h2c, u_char *pos, - u_char *end) -{ -#if (NGX_DEBUG) - ngx_uint_t last_sid, error; -#endif - - if (h2c->state.length < NGX_HTTP_V2_GOAWAY_SIZE) { - ngx_log_error(NGX_LOG_INFO, h2c->connection->log, 0, - "client sent GOAWAY frame " - "with incorrect length %uz", h2c->state.length); - - return ngx_http_v2_connection_error(h2c, NGX_HTTP_V2_SIZE_ERROR); - } - - if (end - pos < NGX_HTTP_V2_GOAWAY_SIZE) { - return ngx_http_v2_state_save(h2c, pos, end, ngx_http_v2_state_goaway); - } - - if (h2c->state.sid) { - ngx_log_error(NGX_LOG_INFO, h2c->connection->log, 0, - "client sent GOAWAY frame with incorrect identifier"); - - return ngx_http_v2_connection_error(h2c, NGX_HTTP_V2_PROTOCOL_ERROR); - } - -#if (NGX_DEBUG) - h2c->state.length -= NGX_HTTP_V2_GOAWAY_SIZE; - - last_sid = ngx_http_v2_parse_sid(pos); - error = ngx_http_v2_parse_uint32(&pos[4]); - - pos += NGX_HTTP_V2_GOAWAY_SIZE; - - ngx_log_debug2(NGX_LOG_DEBUG_HTTP, h2c->connection->log, 0, - "http2 GOAWAY frame: last sid %ui, error %ui", - last_sid, error); -#endif - - return ngx_http_v2_state_skip(h2c, pos, end); -} - - -static u_char * -ngx_http_v2_state_window_update(ngx_http_v2_connection_t *h2c, u_char *pos, - u_char *end) -{ - size_t window; - ngx_event_t *wev; - ngx_queue_t *q; - ngx_http_v2_node_t *node; - ngx_http_v2_stream_t *stream; - - if (h2c->state.length != NGX_HTTP_V2_WINDOW_UPDATE_SIZE) { - ngx_log_error(NGX_LOG_INFO, h2c->connection->log, 0, - "client sent WINDOW_UPDATE frame " - "with incorrect length %uz", h2c->state.length); - - return ngx_http_v2_connection_error(h2c, NGX_HTTP_V2_SIZE_ERROR); - } - - if (end - pos < NGX_HTTP_V2_WINDOW_UPDATE_SIZE) { - return ngx_http_v2_state_save(h2c, pos, end, - ngx_http_v2_state_window_update); - } - - window = ngx_http_v2_parse_window(pos); - - pos += NGX_HTTP_V2_WINDOW_UPDATE_SIZE; - - ngx_log_debug2(NGX_LOG_DEBUG_HTTP, h2c->connection->log, 0, - "http2 WINDOW_UPDATE frame sid:%ui window:%uz", - h2c->state.sid, window); - - if (window == 0) { - ngx_log_error(NGX_LOG_INFO, h2c->connection->log, 0, - "client sent WINDOW_UPDATE frame " - "with incorrect window increment 0"); - - return ngx_http_v2_connection_error(h2c, NGX_HTTP_V2_PROTOCOL_ERROR); - } - - if (h2c->state.sid) { - node = ngx_http_v2_get_node_by_id(h2c, h2c->state.sid, 0); - - if (node == NULL || node->stream == NULL) { - ngx_log_debug0(NGX_LOG_DEBUG_HTTP, h2c->connection->log, 0, - "unknown http2 stream"); - - return ngx_http_v2_state_complete(h2c, pos, end); - } - - stream = node->stream; - - if (window > (size_t) (NGX_HTTP_V2_MAX_WINDOW - stream->send_window)) { - - ngx_log_error(NGX_LOG_INFO, h2c->connection->log, 0, - "client violated flow control for stream %ui: " - "received WINDOW_UPDATE frame " - "with window increment %uz " - "not allowed for window %z", - h2c->state.sid, window, stream->send_window); - - if (ngx_http_v2_terminate_stream(h2c, stream, - NGX_HTTP_V2_FLOW_CTRL_ERROR) - == NGX_ERROR) - { - return ngx_http_v2_connection_error(h2c, - NGX_HTTP_V2_INTERNAL_ERROR); - } - - return ngx_http_v2_state_complete(h2c, pos, end); - } - - stream->send_window += window; - - if (stream->exhausted) { - stream->exhausted = 0; - - wev = stream->request->connection->write; - - wev->active = 0; - wev->ready = 1; - - if (!wev->delayed) { - wev->handler(wev); - } - } - - return ngx_http_v2_state_complete(h2c, pos, end); - } - - if (window > NGX_HTTP_V2_MAX_WINDOW - h2c->send_window) { - ngx_log_error(NGX_LOG_INFO, h2c->connection->log, 0, - "client violated connection flow control: " - "received WINDOW_UPDATE frame " - "with window increment %uz " - "not allowed for window %uz", - window, h2c->send_window); - - return ngx_http_v2_connection_error(h2c, NGX_HTTP_V2_FLOW_CTRL_ERROR); - } - - h2c->send_window += window; - - while (!ngx_queue_empty(&h2c->waiting)) { - q = ngx_queue_head(&h2c->waiting); - - ngx_queue_remove(q); - - stream = ngx_queue_data(q, ngx_http_v2_stream_t, queue); - - stream->waiting = 0; - - wev = stream->request->connection->write; - - wev->active = 0; - wev->ready = 1; - - if (!wev->delayed) { - wev->handler(wev); - - if (h2c->send_window == 0) { - break; - } - } - } - - return ngx_http_v2_state_complete(h2c, pos, end); -} - - -static u_char * -ngx_http_v2_state_continuation(ngx_http_v2_connection_t *h2c, u_char *pos, - u_char *end) -{ - ngx_log_error(NGX_LOG_INFO, h2c->connection->log, 0, - "client sent unexpected CONTINUATION frame"); - - return ngx_http_v2_connection_error(h2c, NGX_HTTP_V2_PROTOCOL_ERROR); -} - - -static u_char * -ngx_http_v2_state_complete(ngx_http_v2_connection_t *h2c, u_char *pos, - u_char *end) -{ - ngx_log_debug2(NGX_LOG_DEBUG_HTTP, h2c->connection->log, 0, - "http2 frame complete pos:%p end:%p", pos, end); - - if (pos > end) { - ngx_log_error(NGX_LOG_ALERT, h2c->connection->log, 0, - "receive buffer overrun"); - - return ngx_http_v2_connection_error(h2c, NGX_HTTP_V2_INTERNAL_ERROR); - } - - h2c->state.stream = NULL; - h2c->state.handler = ngx_http_v2_state_head; - - return pos; -} - - -static u_char * -ngx_http_v2_state_skip_padded(ngx_http_v2_connection_t *h2c, u_char *pos, - u_char *end) -{ - h2c->state.length += h2c->state.padding; - h2c->state.padding = 0; - - return ngx_http_v2_state_skip(h2c, pos, end); -} - - -static u_char * -ngx_http_v2_state_skip(ngx_http_v2_connection_t *h2c, u_char *pos, u_char *end) -{ - size_t size; - - size = end - pos; - - if (size < h2c->state.length) { - ngx_log_debug2(NGX_LOG_DEBUG_HTTP, h2c->connection->log, 0, - "http2 frame skip %uz of %uz", size, h2c->state.length); - - h2c->state.length -= size; - return ngx_http_v2_state_save(h2c, end, end, ngx_http_v2_state_skip); - } - - ngx_log_debug1(NGX_LOG_DEBUG_HTTP, h2c->connection->log, 0, - "http2 frame skip %uz", h2c->state.length); - - return ngx_http_v2_state_complete(h2c, pos + h2c->state.length, end); -} - - -static u_char * -ngx_http_v2_state_save(ngx_http_v2_connection_t *h2c, u_char *pos, u_char *end, - ngx_http_v2_handler_pt handler) -{ - size_t size; - - ngx_log_debug3(NGX_LOG_DEBUG_HTTP, h2c->connection->log, 0, - "http2 frame state save pos:%p end:%p handler:%p", - pos, end, handler); - - size = end - pos; - - if (size > NGX_HTTP_V2_STATE_BUFFER_SIZE) { - ngx_log_error(NGX_LOG_ALERT, h2c->connection->log, 0, - "state buffer overflow: %uz bytes required", size); - - return ngx_http_v2_connection_error(h2c, NGX_HTTP_V2_INTERNAL_ERROR); - } - - ngx_memcpy(h2c->state.buffer, pos, size); - - h2c->state.buffer_used = size; - h2c->state.handler = handler; - h2c->state.incomplete = 1; - - return end; -} - - -static u_char * -ngx_http_v2_state_headers_save(ngx_http_v2_connection_t *h2c, u_char *pos, - u_char *end, ngx_http_v2_handler_pt handler) -{ - ngx_event_t *rev; - ngx_http_request_t *r; - ngx_http_core_srv_conf_t *cscf; - - if (h2c->state.stream) { - r = h2c->state.stream->request; - rev = r->connection->read; - - if (!rev->timer_set) { - cscf = ngx_http_get_module_srv_conf(r, ngx_http_core_module); - ngx_add_timer(rev, cscf->client_header_timeout); - } - } - - return ngx_http_v2_state_save(h2c, pos, end, handler); -} - - -static u_char * -ngx_http_v2_connection_error(ngx_http_v2_connection_t *h2c, - ngx_uint_t err) -{ - ngx_log_debug0(NGX_LOG_DEBUG_HTTP, h2c->connection->log, 0, - "http2 state connection error"); - - ngx_http_v2_finalize_connection(h2c, err); - - return NULL; -} - - -static ngx_int_t -ngx_http_v2_parse_int(ngx_http_v2_connection_t *h2c, u_char **pos, u_char *end, - ngx_uint_t prefix) -{ - u_char *start, *p; - ngx_uint_t value, octet, shift; - - start = *pos; - p = start; - - value = *p++ & prefix; - - if (value != prefix) { - if (h2c->state.length == 0) { - return NGX_ERROR; - } - - h2c->state.length--; - - *pos = p; - return value; - } - - if (end - start > NGX_HTTP_V2_INT_OCTETS) { - end = start + NGX_HTTP_V2_INT_OCTETS; - } - - for (shift = 0; p != end; shift += 7) { - octet = *p++; - - value += (octet & 0x7f) << shift; - - if (octet < 128) { - if ((size_t) (p - start) > h2c->state.length) { - return NGX_ERROR; - } - - h2c->state.length -= p - start; - - *pos = p; - return value; - } - } - - if ((size_t) (end - start) >= h2c->state.length) { - return NGX_ERROR; - } - - if (end == start + NGX_HTTP_V2_INT_OCTETS) { - return NGX_DECLINED; - } - - return NGX_AGAIN; -} - - -static ngx_int_t -ngx_http_v2_send_settings(ngx_http_v2_connection_t *h2c) -{ - size_t len; - ngx_buf_t *buf; - ngx_chain_t *cl; - ngx_http_v2_srv_conf_t *h2scf; - ngx_http_v2_out_frame_t *frame; - - ngx_log_debug0(NGX_LOG_DEBUG_HTTP, h2c->connection->log, 0, - "http2 send SETTINGS frame"); - - frame = ngx_palloc(h2c->pool, sizeof(ngx_http_v2_out_frame_t)); - if (frame == NULL) { - return NGX_ERROR; - } - - cl = ngx_alloc_chain_link(h2c->pool); - if (cl == NULL) { - return NGX_ERROR; - } - - len = NGX_HTTP_V2_SETTINGS_PARAM_SIZE * 3; - - buf = ngx_create_temp_buf(h2c->pool, NGX_HTTP_V2_FRAME_HEADER_SIZE + len); - if (buf == NULL) { - return NGX_ERROR; - } - - buf->last_buf = 1; - - cl->buf = buf; - cl->next = NULL; - - frame->first = cl; - frame->last = cl; - frame->handler = ngx_http_v2_settings_frame_handler; - frame->stream = NULL; -#if (NGX_DEBUG) - frame->length = len; -#endif - frame->blocked = 0; - - buf->last = ngx_http_v2_write_len_and_type(buf->last, len, - NGX_HTTP_V2_SETTINGS_FRAME); - - *buf->last++ = NGX_HTTP_V2_NO_FLAG; - - buf->last = ngx_http_v2_write_sid(buf->last, 0); - - h2scf = ngx_http_get_module_srv_conf(h2c->http_connection->conf_ctx, - ngx_http_v2_module); - - buf->last = ngx_http_v2_write_uint16(buf->last, - NGX_HTTP_V2_MAX_STREAMS_SETTING); - buf->last = ngx_http_v2_write_uint32(buf->last, - h2scf->concurrent_streams); - - buf->last = ngx_http_v2_write_uint16(buf->last, - NGX_HTTP_V2_INIT_WINDOW_SIZE_SETTING); - buf->last = ngx_http_v2_write_uint32(buf->last, h2scf->preread_size); - - buf->last = ngx_http_v2_write_uint16(buf->last, - NGX_HTTP_V2_MAX_FRAME_SIZE_SETTING); - buf->last = ngx_http_v2_write_uint32(buf->last, - NGX_HTTP_V2_MAX_FRAME_SIZE); - - ngx_http_v2_queue_blocked_frame(h2c, frame); - - return NGX_OK; -} - - -static ngx_int_t -ngx_http_v2_settings_frame_handler(ngx_http_v2_connection_t *h2c, - ngx_http_v2_out_frame_t *frame) -{ - ngx_buf_t *buf; - - buf = frame->first->buf; - - if (buf->pos != buf->last) { - return NGX_AGAIN; - } - - ngx_free_chain(h2c->pool, frame->first); - - return NGX_OK; -} - - -static ngx_int_t -ngx_http_v2_send_window_update(ngx_http_v2_connection_t *h2c, ngx_uint_t sid, - size_t window) -{ - ngx_buf_t *buf; - ngx_http_v2_out_frame_t *frame; - - ngx_log_debug2(NGX_LOG_DEBUG_HTTP, h2c->connection->log, 0, - "http2 send WINDOW_UPDATE frame sid:%ui, window:%uz", - sid, window); - - frame = ngx_http_v2_get_frame(h2c, NGX_HTTP_V2_WINDOW_UPDATE_SIZE, - NGX_HTTP_V2_WINDOW_UPDATE_FRAME, - NGX_HTTP_V2_NO_FLAG, sid); - if (frame == NULL) { - return NGX_ERROR; - } - - buf = frame->first->buf; - - buf->last = ngx_http_v2_write_uint32(buf->last, window); - - ngx_http_v2_queue_blocked_frame(h2c, frame); - - return NGX_OK; -} - - -static ngx_int_t -ngx_http_v2_send_rst_stream(ngx_http_v2_connection_t *h2c, ngx_uint_t sid, - ngx_uint_t status) -{ - ngx_buf_t *buf; - ngx_http_v2_out_frame_t *frame; - - ngx_log_debug2(NGX_LOG_DEBUG_HTTP, h2c->connection->log, 0, - "http2 send RST_STREAM frame sid:%ui, status:%ui", - sid, status); - - frame = ngx_http_v2_get_frame(h2c, NGX_HTTP_V2_RST_STREAM_SIZE, - NGX_HTTP_V2_RST_STREAM_FRAME, - NGX_HTTP_V2_NO_FLAG, sid); - if (frame == NULL) { - return NGX_ERROR; - } - - buf = frame->first->buf; - - buf->last = ngx_http_v2_write_uint32(buf->last, status); - - ngx_http_v2_queue_blocked_frame(h2c, frame); - - return NGX_OK; -} - - -static ngx_int_t -ngx_http_v2_send_goaway(ngx_http_v2_connection_t *h2c, ngx_uint_t status) -{ - ngx_buf_t *buf; - ngx_http_v2_out_frame_t *frame; - - ngx_log_debug2(NGX_LOG_DEBUG_HTTP, h2c->connection->log, 0, - "http2 send GOAWAY frame: last sid %ui, error %ui", - h2c->last_sid, status); - - frame = ngx_http_v2_get_frame(h2c, NGX_HTTP_V2_GOAWAY_SIZE, - NGX_HTTP_V2_GOAWAY_FRAME, - NGX_HTTP_V2_NO_FLAG, 0); - if (frame == NULL) { - return NGX_ERROR; - } - - buf = frame->first->buf; - - buf->last = ngx_http_v2_write_sid(buf->last, h2c->last_sid); - buf->last = ngx_http_v2_write_uint32(buf->last, status); - - ngx_http_v2_queue_blocked_frame(h2c, frame); - - return NGX_OK; -} - - -static ngx_http_v2_out_frame_t * -ngx_http_v2_get_frame(ngx_http_v2_connection_t *h2c, size_t length, - ngx_uint_t type, u_char flags, ngx_uint_t sid) -{ - ngx_buf_t *buf; - ngx_pool_t *pool; - ngx_http_v2_out_frame_t *frame; - - frame = h2c->free_frames; - - if (frame) { - h2c->free_frames = frame->next; - - buf = frame->first->buf; - buf->pos = buf->start; - - frame->blocked = 0; - - } else if (h2c->frames < 10000) { - pool = h2c->pool ? h2c->pool : h2c->connection->pool; - - frame = ngx_pcalloc(pool, sizeof(ngx_http_v2_out_frame_t)); - if (frame == NULL) { - return NULL; - } - - frame->first = ngx_alloc_chain_link(pool); - if (frame->first == NULL) { - return NULL; - } - - buf = ngx_create_temp_buf(pool, NGX_HTTP_V2_FRAME_BUFFER_SIZE); - if (buf == NULL) { - return NULL; - } - - buf->last_buf = 1; - - frame->first->buf = buf; - frame->last = frame->first; - - frame->handler = ngx_http_v2_frame_handler; - - h2c->frames++; - - } else { - ngx_log_error(NGX_LOG_INFO, h2c->connection->log, 0, - "http2 flood detected"); - - h2c->connection->error = 1; - return NULL; - } - -#if (NGX_DEBUG) - if (length > NGX_HTTP_V2_FRAME_BUFFER_SIZE - NGX_HTTP_V2_FRAME_HEADER_SIZE) - { - ngx_log_error(NGX_LOG_ALERT, h2c->connection->log, 0, - "requested control frame is too large: %uz", length); - return NULL; - } -#endif - - frame->length = length; - - buf->last = ngx_http_v2_write_len_and_type(buf->pos, length, type); - - *buf->last++ = flags; - - buf->last = ngx_http_v2_write_sid(buf->last, sid); - - return frame; -} - - -static ngx_int_t -ngx_http_v2_frame_handler(ngx_http_v2_connection_t *h2c, - ngx_http_v2_out_frame_t *frame) -{ - ngx_buf_t *buf; - - buf = frame->first->buf; - - if (buf->pos != buf->last) { - return NGX_AGAIN; - } - - frame->next = h2c->free_frames; - h2c->free_frames = frame; - - h2c->total_bytes += NGX_HTTP_V2_FRAME_HEADER_SIZE + frame->length; - - return NGX_OK; -} - - -static ngx_http_v2_stream_t * -ngx_http_v2_create_stream(ngx_http_v2_connection_t *h2c) -{ - ngx_log_t *log; - ngx_event_t *rev, *wev; - ngx_connection_t *fc; - ngx_http_log_ctx_t *ctx; - ngx_http_request_t *r; - ngx_http_v2_stream_t *stream; - ngx_http_v2_srv_conf_t *h2scf; - ngx_http_core_srv_conf_t *cscf; - - fc = h2c->free_fake_connections; - - if (fc) { - h2c->free_fake_connections = fc->data; - - rev = fc->read; - wev = fc->write; - log = fc->log; - ctx = log->data; - - } else { - fc = ngx_palloc(h2c->pool, sizeof(ngx_connection_t)); - if (fc == NULL) { - return NULL; - } - - rev = ngx_palloc(h2c->pool, sizeof(ngx_event_t)); - if (rev == NULL) { - return NULL; - } - - wev = ngx_palloc(h2c->pool, sizeof(ngx_event_t)); - if (wev == NULL) { - return NULL; - } - - log = ngx_palloc(h2c->pool, sizeof(ngx_log_t)); - if (log == NULL) { - return NULL; - } - - ctx = ngx_palloc(h2c->pool, sizeof(ngx_http_log_ctx_t)); - if (ctx == NULL) { - return NULL; - } - - ctx->connection = fc; - ctx->request = NULL; - ctx->current_request = NULL; - } - - ngx_memcpy(log, h2c->connection->log, sizeof(ngx_log_t)); - - log->data = ctx; - log->action = "reading client request headers"; - - ngx_memzero(rev, sizeof(ngx_event_t)); - - rev->data = fc; - rev->ready = 1; - rev->handler = ngx_http_v2_close_stream_handler; - rev->log = log; - - ngx_memcpy(wev, rev, sizeof(ngx_event_t)); - - wev->write = 1; - - ngx_memcpy(fc, h2c->connection, sizeof(ngx_connection_t)); - - fc->data = h2c->http_connection; - fc->read = rev; - fc->write = wev; - fc->sent = 0; - fc->log = log; - fc->buffered = 0; - fc->sndlowat = 1; - fc->tcp_nodelay = NGX_TCP_NODELAY_DISABLED; - - r = ngx_http_create_request(fc); - if (r == NULL) { - return NULL; - } - - ngx_str_set(&r->http_protocol, "HTTP/2.0"); - - r->http_version = NGX_HTTP_VERSION_20; - r->valid_location = 1; - - fc->data = r; - h2c->connection->requests++; - - cscf = ngx_http_get_module_srv_conf(r, ngx_http_core_module); - - r->header_in = ngx_create_temp_buf(r->pool, - cscf->client_header_buffer_size); - if (r->header_in == NULL) { - ngx_http_free_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR); - return NULL; - } - - if (ngx_list_init(&r->headers_in.headers, r->pool, 20, - sizeof(ngx_table_elt_t)) - != NGX_OK) - { - ngx_http_free_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR); - return NULL; - } - - r->headers_in.connection_type = NGX_HTTP_CONNECTION_CLOSE; - - stream = ngx_pcalloc(r->pool, sizeof(ngx_http_v2_stream_t)); - if (stream == NULL) { - ngx_http_free_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR); - return NULL; - } - - r->stream = stream; - - stream->request = r; - stream->connection = h2c; - - h2scf = ngx_http_get_module_srv_conf(r, ngx_http_v2_module); - - stream->send_window = h2c->init_window; - stream->recv_window = h2scf->preread_size; - - h2c->processing++; - - h2c->priority_limit += h2scf->concurrent_streams; - - if (h2c->connection->read->timer_set) { - ngx_del_timer(h2c->connection->read); - } - - return stream; -} - - -static ngx_http_v2_node_t * -ngx_http_v2_get_node_by_id(ngx_http_v2_connection_t *h2c, ngx_uint_t sid, - ngx_uint_t alloc) -{ - ngx_uint_t index; - ngx_http_v2_node_t *node; - ngx_http_v2_srv_conf_t *h2scf; - - h2scf = ngx_http_get_module_srv_conf(h2c->http_connection->conf_ctx, - ngx_http_v2_module); - - index = ngx_http_v2_index(h2scf, sid); - - for (node = h2c->streams_index[index]; node; node = node->index) { - - if (node->id == sid) { - return node; - } - } - - if (!alloc) { - return NULL; - } - - if (h2c->closed_nodes < 32) { - node = ngx_pcalloc(h2c->connection->pool, sizeof(ngx_http_v2_node_t)); - if (node == NULL) { - return NULL; - } - - } else { - node = ngx_http_v2_get_closed_node(h2c); - } - - node->id = sid; - - ngx_queue_init(&node->children); - - node->index = h2c->streams_index[index]; - h2c->streams_index[index] = node; - - return node; -} - - -static ngx_http_v2_node_t * -ngx_http_v2_get_closed_node(ngx_http_v2_connection_t *h2c) -{ - ngx_uint_t weight; - ngx_queue_t *q, *children; - ngx_http_v2_node_t *node, **next, *n, *parent, *child; - ngx_http_v2_srv_conf_t *h2scf; - - h2scf = ngx_http_get_module_srv_conf(h2c->http_connection->conf_ctx, - ngx_http_v2_module); - - h2c->closed_nodes--; - - q = ngx_queue_head(&h2c->closed); - - ngx_queue_remove(q); - - node = ngx_queue_data(q, ngx_http_v2_node_t, reuse); - - next = &h2c->streams_index[ngx_http_v2_index(h2scf, node->id)]; - - for ( ;; ) { - n = *next; - - if (n == node) { - *next = n->index; - break; - } - - next = &n->index; - } - - ngx_queue_remove(&node->queue); - - weight = 0; - - for (q = ngx_queue_head(&node->children); - q != ngx_queue_sentinel(&node->children); - q = ngx_queue_next(q)) - { - child = ngx_queue_data(q, ngx_http_v2_node_t, queue); - weight += child->weight; - } - - parent = node->parent; - - for (q = ngx_queue_head(&node->children); - q != ngx_queue_sentinel(&node->children); - q = ngx_queue_next(q)) - { - child = ngx_queue_data(q, ngx_http_v2_node_t, queue); - child->parent = parent; - child->weight = node->weight * child->weight / weight; - - if (child->weight == 0) { - child->weight = 1; - } - } - - if (parent == NGX_HTTP_V2_ROOT) { - node->rank = 0; - node->rel_weight = 1.0; - - children = &h2c->dependencies; - - } else { - node->rank = parent->rank; - node->rel_weight = parent->rel_weight; - - children = &parent->children; - } - - ngx_http_v2_node_children_update(node); - ngx_queue_add(children, &node->children); - - ngx_memzero(node, sizeof(ngx_http_v2_node_t)); - - return node; -} - - -static ngx_int_t -ngx_http_v2_validate_header(ngx_http_request_t *r, ngx_http_v2_header_t *header) -{ - u_char ch; - ngx_uint_t i; - ngx_http_core_srv_conf_t *cscf; - - r->invalid_header = 0; - - cscf = ngx_http_get_module_srv_conf(r, ngx_http_core_module); - - for (i = (header->name.data[0] == ':'); i != header->name.len; i++) { - ch = header->name.data[i]; - - if ((ch >= 'a' && ch <= 'z') - || (ch == '-') - || (ch >= '0' && ch <= '9') - || (ch == '_' && cscf->underscores_in_headers)) - { - continue; - } - - if (ch <= 0x20 || ch == 0x7f || ch == ':' - || (ch >= 'A' && ch <= 'Z')) - { - ngx_log_error(NGX_LOG_INFO, r->connection->log, 0, - "client sent invalid header name: \"%V\"", - &header->name); - - return NGX_ERROR; - } - - r->invalid_header = 1; - } - - for (i = 0; i != header->value.len; i++) { - ch = header->value.data[i]; - - if (ch == '\0' || ch == LF || ch == CR) { - ngx_log_error(NGX_LOG_INFO, r->connection->log, 0, - "client sent header \"%V\" with " - "invalid value: \"%V\"", - &header->name, &header->value); - - return NGX_ERROR; - } - } - - return NGX_OK; -} - - -static ngx_int_t -ngx_http_v2_pseudo_header(ngx_http_request_t *r, ngx_http_v2_header_t *header) -{ - header->name.len--; - header->name.data++; - - switch (header->name.len) { - case 4: - if (ngx_memcmp(header->name.data, "path", sizeof("path") - 1) - == 0) - { - return ngx_http_v2_parse_path(r, &header->value); - } - - break; - - case 6: - if (ngx_memcmp(header->name.data, "method", sizeof("method") - 1) - == 0) - { - return ngx_http_v2_parse_method(r, &header->value); - } - - if (ngx_memcmp(header->name.data, "scheme", sizeof("scheme") - 1) - == 0) - { - return ngx_http_v2_parse_scheme(r, &header->value); - } - - break; - - case 9: - if (ngx_memcmp(header->name.data, "authority", sizeof("authority") - 1) - == 0) - { - return ngx_http_v2_parse_authority(r, &header->value); - } - - break; - } - - ngx_log_error(NGX_LOG_INFO, r->connection->log, 0, - "client sent unknown pseudo-header \":%V\"", - &header->name); - - return NGX_DECLINED; -} - - -static ngx_int_t -ngx_http_v2_parse_path(ngx_http_request_t *r, ngx_str_t *value) -{ - if (r->unparsed_uri.len) { - ngx_log_error(NGX_LOG_INFO, r->connection->log, 0, - "client sent duplicate :path header"); - - return NGX_DECLINED; - } - - if (value->len == 0) { - ngx_log_error(NGX_LOG_INFO, r->connection->log, 0, - "client sent empty :path header"); - - return NGX_DECLINED; - } - - r->uri_start = value->data; - r->uri_end = value->data + value->len; - - if (ngx_http_parse_uri(r) != NGX_OK) { - ngx_log_error(NGX_LOG_INFO, r->connection->log, 0, - "client sent invalid :path header: \"%V\"", value); - - return NGX_DECLINED; - } - - if (ngx_http_process_request_uri(r) != NGX_OK) { - /* - * request has been finalized already - * in ngx_http_process_request_uri() - */ - return NGX_ABORT; - } - - return NGX_OK; -} - - -static ngx_int_t -ngx_http_v2_parse_method(ngx_http_request_t *r, ngx_str_t *value) -{ - size_t k, len; - ngx_uint_t n; - const u_char *p, *m; - - /* - * This array takes less than 256 sequential bytes, - * and if typical CPU cache line size is 64 bytes, - * it is prefetched for 4 load operations. - */ - static const struct { - u_char len; - const u_char method[11]; - uint32_t value; - } tests[] = { - { 3, "GET", NGX_HTTP_GET }, - { 4, "POST", NGX_HTTP_POST }, - { 4, "HEAD", NGX_HTTP_HEAD }, - { 7, "OPTIONS", NGX_HTTP_OPTIONS }, - { 8, "PROPFIND", NGX_HTTP_PROPFIND }, - { 3, "PUT", NGX_HTTP_PUT }, - { 5, "MKCOL", NGX_HTTP_MKCOL }, - { 6, "DELETE", NGX_HTTP_DELETE }, - { 4, "COPY", NGX_HTTP_COPY }, - { 4, "MOVE", NGX_HTTP_MOVE }, - { 9, "PROPPATCH", NGX_HTTP_PROPPATCH }, - { 4, "LOCK", NGX_HTTP_LOCK }, - { 6, "UNLOCK", NGX_HTTP_UNLOCK }, - { 5, "PATCH", NGX_HTTP_PATCH }, - { 5, "TRACE", NGX_HTTP_TRACE }, - { 7, "CONNECT", NGX_HTTP_CONNECT } - }, *test; - - if (r->method_name.len) { - ngx_log_error(NGX_LOG_INFO, r->connection->log, 0, - "client sent duplicate :method header"); - - return NGX_DECLINED; - } - - if (value->len == 0) { - ngx_log_error(NGX_LOG_INFO, r->connection->log, 0, - "client sent empty :method header"); - - return NGX_DECLINED; - } - - r->method_name.len = value->len; - r->method_name.data = value->data; - - len = r->method_name.len; - n = sizeof(tests) / sizeof(tests[0]); - test = tests; - - do { - if (len == test->len) { - p = r->method_name.data; - m = test->method; - k = len; - - do { - if (*p++ != *m++) { - goto next; - } - } while (--k); - - r->method = test->value; - return NGX_OK; - } - - next: - test++; - - } while (--n); - - p = r->method_name.data; - - do { - if ((*p < 'A' || *p > 'Z') && *p != '_' && *p != '-') { - ngx_log_error(NGX_LOG_INFO, r->connection->log, 0, - "client sent invalid method: \"%V\"", - &r->method_name); - - return NGX_DECLINED; - } - - p++; - - } while (--len); - - return NGX_OK; -} - - -static ngx_int_t -ngx_http_v2_parse_scheme(ngx_http_request_t *r, ngx_str_t *value) -{ - u_char c, ch; - ngx_uint_t i; - - if (r->schema.len) { - ngx_log_error(NGX_LOG_INFO, r->connection->log, 0, - "client sent duplicate :scheme header"); - - return NGX_DECLINED; - } - - if (value->len == 0) { - ngx_log_error(NGX_LOG_INFO, r->connection->log, 0, - "client sent empty :scheme header"); - - return NGX_DECLINED; - } - - for (i = 0; i < value->len; i++) { - ch = value->data[i]; - - c = (u_char) (ch | 0x20); - if (c >= 'a' && c <= 'z') { - continue; - } - - if (((ch >= '0' && ch <= '9') || ch == '+' || ch == '-' || ch == '.') - && i > 0) - { - continue; - } - - ngx_log_error(NGX_LOG_INFO, r->connection->log, 0, - "client sent invalid :scheme header: \"%V\"", value); - - return NGX_DECLINED; - } - - r->schema = *value; - - return NGX_OK; -} - - -static ngx_int_t -ngx_http_v2_parse_authority(ngx_http_request_t *r, ngx_str_t *value) -{ - ngx_int_t rc; - in_port_t port; - - if (r->host_start) { - ngx_log_error(NGX_LOG_INFO, r->connection->log, 0, - "client sent duplicate \":authority\" header"); - return NGX_DECLINED; - } - - r->host_start = value->data; - r->host_end = value->data + value->len; - - rc = ngx_http_validate_host(value, &port, r->pool, 0); - - if (rc == NGX_DECLINED) { - ngx_log_error(NGX_LOG_INFO, r->connection->log, 0, - "client sent invalid \":authority\" header"); - return NGX_DECLINED; - } - - if (rc == NGX_ERROR) { - ngx_http_v2_close_stream(r->stream, NGX_HTTP_INTERNAL_SERVER_ERROR); - return NGX_ABORT; - } - - if (ngx_http_set_virtual_server(r, value) == NGX_ERROR) { - /* - * request has been finalized already - * in ngx_http_set_virtual_server() - */ - return NGX_ABORT; - } - - r->headers_in.server = *value; - r->port = port; - - return NGX_OK; -} - - -static ngx_int_t -ngx_http_v2_construct_request_line(ngx_http_request_t *r) -{ - u_char *p; - - static const u_char ending[] = " HTTP/2.0"; - - if (r->method_name.len == 0 - || r->schema.len == 0 - || r->unparsed_uri.len == 0) - { - if (r->method_name.len == 0) { - ngx_log_error(NGX_LOG_INFO, r->connection->log, 0, - "client sent no :method header"); - - } else if (r->schema.len == 0) { - ngx_log_error(NGX_LOG_INFO, r->connection->log, 0, - "client sent no :scheme header"); - - } else { - ngx_log_error(NGX_LOG_INFO, r->connection->log, 0, - "client sent no :path header"); - } - - ngx_http_finalize_request(r, NGX_HTTP_BAD_REQUEST); - return NGX_ERROR; - } - - r->request_line.len = r->method_name.len + 1 - + r->unparsed_uri.len - + sizeof(ending) - 1; - - p = ngx_pnalloc(r->pool, r->request_line.len + 1); - if (p == NULL) { - ngx_http_v2_close_stream(r->stream, NGX_HTTP_INTERNAL_SERVER_ERROR); - return NGX_ERROR; - } - - r->request_line.data = p; - - p = ngx_cpymem(p, r->method_name.data, r->method_name.len); - - *p++ = ' '; - - p = ngx_cpymem(p, r->unparsed_uri.data, r->unparsed_uri.len); - - ngx_memcpy(p, ending, sizeof(ending)); - - ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "http2 request line: \"%V\"", &r->request_line); - - return NGX_OK; -} - - -static ngx_int_t -ngx_http_v2_cookie(ngx_http_request_t *r, ngx_http_v2_header_t *header) -{ - ngx_str_t *val; - ngx_array_t *cookies; - - cookies = r->stream->cookies; - - if (cookies == NULL) { - cookies = ngx_array_create(r->pool, 2, sizeof(ngx_str_t)); - if (cookies == NULL) { - return NGX_ERROR; - } - - r->stream->cookies = cookies; - } - - val = ngx_array_push(cookies); - if (val == NULL) { - return NGX_ERROR; - } - - val->len = header->value.len; - val->data = header->value.data; - - return NGX_OK; -} - - -static ngx_int_t -ngx_http_v2_construct_cookie_header(ngx_http_request_t *r) -{ - u_char *buf, *p, *end; - size_t len; - ngx_str_t *vals; - ngx_uint_t i; - ngx_array_t *cookies; - ngx_table_elt_t *h; - ngx_http_header_t *hh; - ngx_http_core_main_conf_t *cmcf; - - static ngx_str_t cookie = ngx_string("cookie"); - - cookies = r->stream->cookies; - - if (cookies == NULL) { - return NGX_OK; - } - - vals = cookies->elts; - - i = 0; - len = 0; - - do { - len += vals[i].len + 2; - } while (++i != cookies->nelts); - - len -= 2; - - buf = ngx_pnalloc(r->pool, len + 1); - if (buf == NULL) { - ngx_http_v2_close_stream(r->stream, NGX_HTTP_INTERNAL_SERVER_ERROR); - return NGX_ERROR; - } - - p = buf; - end = buf + len; - - for (i = 0; /* void */ ; i++) { - - p = ngx_cpymem(p, vals[i].data, vals[i].len); - - if (p == end) { - *p = '\0'; - break; - } - - *p++ = ';'; *p++ = ' '; - } - - h = ngx_list_push(&r->headers_in.headers); - if (h == NULL) { - ngx_http_v2_close_stream(r->stream, NGX_HTTP_INTERNAL_SERVER_ERROR); - return NGX_ERROR; - } - - h->hash = ngx_hash(ngx_hash(ngx_hash(ngx_hash( - ngx_hash('c', 'o'), 'o'), 'k'), 'i'), 'e'); - - h->key.len = cookie.len; - h->key.data = cookie.data; - - h->value.len = len; - h->value.data = buf; - - h->lowcase_key = cookie.data; - - cmcf = ngx_http_get_module_main_conf(r, ngx_http_core_module); - - hh = ngx_hash_find(&cmcf->headers_in_hash, h->hash, - h->lowcase_key, h->key.len); - - if (hh == NULL) { - ngx_http_v2_close_stream(r->stream, NGX_HTTP_INTERNAL_SERVER_ERROR); - return NGX_ERROR; - } - - if (hh->handler(r, h, hh->offset) != NGX_OK) { - /* - * request has been finalized already - * in ngx_http_process_header_line() - */ - return NGX_ERROR; - } - - return NGX_OK; -} - - -static ngx_int_t -ngx_http_v2_construct_host_header(ngx_http_request_t *r) -{ - ngx_table_elt_t *h; - ngx_http_header_t *hh; - ngx_http_core_main_conf_t *cmcf; - - static ngx_str_t host = ngx_string("host"); - - h = ngx_list_push(&r->headers_in.headers); - if (h == NULL) { - ngx_http_v2_close_stream(r->stream, NGX_HTTP_INTERNAL_SERVER_ERROR); - return NGX_ERROR; - } - - h->hash = ngx_hash(ngx_hash(ngx_hash('h', 'o'), 's'), 't'); - - h->key.len = host.len; - h->key.data = host.data; - - h->value.len = r->host_end - r->host_start; - h->value.data = r->host_start; - - h->lowcase_key = host.data; - - cmcf = ngx_http_get_module_main_conf(r, ngx_http_core_module); - - hh = ngx_hash_find(&cmcf->headers_in_hash, h->hash, - h->lowcase_key, h->key.len); - - if (hh == NULL) { - ngx_http_v2_close_stream(r->stream, NGX_HTTP_INTERNAL_SERVER_ERROR); - return NGX_ERROR; - } - - if (hh->handler(r, h, hh->offset) != NGX_OK) { - /* - * request has been finalized already - * in ngx_http_process_host() - */ - return NGX_ERROR; - } - - return NGX_OK; -} - - -static void -ngx_http_v2_run_request(ngx_http_request_t *r) -{ - ngx_str_t host; - ngx_connection_t *fc; - ngx_http_v2_srv_conf_t *h2scf; - ngx_http_v2_connection_t *h2c; - - fc = r->connection; - - h2scf = ngx_http_get_module_srv_conf(r, ngx_http_v2_module); - - if (!h2scf->enable && !r->http_connection->addr_conf->http2) { - ngx_log_error(NGX_LOG_INFO, fc->log, 0, - "client attempted to request the server name " - "for which the negotiated protocol is disabled"); - - ngx_http_finalize_request(r, NGX_HTTP_MISDIRECTED_REQUEST); - goto failed; - } - - if (ngx_http_v2_construct_request_line(r) != NGX_OK) { - goto failed; - } - - if (ngx_http_v2_construct_cookie_header(r) != NGX_OK) { - goto failed; - } - - r->http_state = NGX_HTTP_PROCESS_REQUEST_STATE; - - if (r->headers_in.server.len == 0) { - ngx_log_error(NGX_LOG_INFO, fc->log, 0, - "client sent neither \":authority\" nor \"Host\" header"); - ngx_http_finalize_request(r, NGX_HTTP_BAD_REQUEST); - goto failed; - } - - if (r->host_end) { - - host.len = r->host_end - r->host_start; - host.data = r->host_start; - - if (r->headers_in.host) { - if (r->headers_in.host->value.len != host.len - || ngx_memcmp(r->headers_in.host->value.data, host.data, - host.len) - != 0) - { - ngx_log_error(NGX_LOG_INFO, fc->log, 0, - "client sent \":authority\" and \"Host\" headers " - "with different values"); - ngx_http_finalize_request(r, NGX_HTTP_BAD_REQUEST); - goto failed; - } - - } else { - /* compatibility for $http_host */ - - if (ngx_http_v2_construct_host_header(r) != NGX_OK) { - goto failed; - } - } - } - - if (r->headers_in.content_length) { - r->headers_in.content_length_n = - ngx_atoof(r->headers_in.content_length->value.data, - r->headers_in.content_length->value.len); - - if (r->headers_in.content_length_n == NGX_ERROR) { - ngx_log_error(NGX_LOG_INFO, fc->log, 0, - "client sent invalid \"Content-Length\" header"); - ngx_http_finalize_request(r, NGX_HTTP_BAD_REQUEST); - goto failed; - } - - if (r->headers_in.content_length_n > 0 && r->stream->in_closed) { - ngx_log_error(NGX_LOG_INFO, fc->log, 0, - "client prematurely closed stream"); - - r->stream->skip_data = 1; - - ngx_http_finalize_request(r, NGX_HTTP_BAD_REQUEST); - goto failed; - } - - } else if (!r->stream->in_closed) { - r->headers_in.chunked = 1; - } - - if (r->method == NGX_HTTP_CONNECT) { - ngx_log_error(NGX_LOG_INFO, fc->log, 0, "client sent CONNECT method"); - ngx_http_finalize_request(r, NGX_HTTP_NOT_ALLOWED); - goto failed; - } - - if (r->method == NGX_HTTP_TRACE) { - ngx_log_error(NGX_LOG_INFO, fc->log, 0, "client sent TRACE method"); - ngx_http_finalize_request(r, NGX_HTTP_NOT_ALLOWED); - goto failed; - } - - h2c = r->stream->connection; - - h2c->payload_bytes += r->request_length; - - ngx_http_process_request(r); - -failed: - - ngx_http_run_posted_requests(fc); -} - - -ngx_int_t -ngx_http_v2_read_request_body(ngx_http_request_t *r) -{ - off_t len; - size_t size; - ngx_buf_t *buf; - ngx_int_t rc; - ngx_http_v2_stream_t *stream; - ngx_http_v2_srv_conf_t *h2scf; - ngx_http_request_body_t *rb; - ngx_http_core_loc_conf_t *clcf; - ngx_http_v2_connection_t *h2c; - - stream = r->stream; - rb = r->request_body; - - if (stream->skip_data) { - r->request_body_no_buffering = 0; - rb->post_handler(r); - return NGX_OK; - } - - rb->rest = 1; - - /* set rb->filter_need_buffering */ - - rc = ngx_http_top_request_body_filter(r, NULL); - - if (rc != NGX_OK) { - stream->skip_data = 1; - return rc; - } - - h2scf = ngx_http_get_module_srv_conf(r, ngx_http_v2_module); - clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module); - - len = r->headers_in.content_length_n; - - if (len < 0 || len > (off_t) clcf->client_body_buffer_size) { - len = clcf->client_body_buffer_size; - - } else { - len++; - } - - if (r->request_body_no_buffering || rb->filter_need_buffering) { - - /* - * We need a room to store data up to the stream's initial window size, - * at least until this window will be exhausted. - */ - - if (len < (off_t) h2scf->preread_size) { - len = h2scf->preread_size; - } - - if (len > NGX_HTTP_V2_MAX_WINDOW) { - len = NGX_HTTP_V2_MAX_WINDOW; - } - } - - rb->buf = ngx_create_temp_buf(r->pool, (size_t) len); - - if (rb->buf == NULL) { - stream->skip_data = 1; - return NGX_HTTP_INTERNAL_SERVER_ERROR; - } - - buf = stream->preread; - - if (stream->in_closed) { - if (!rb->filter_need_buffering) { - r->request_body_no_buffering = 0; - } - - if (buf) { - rc = ngx_http_v2_process_request_body(r, buf->pos, - buf->last - buf->pos, 1, 0); - ngx_pfree(r->pool, buf->start); - - } else { - rc = ngx_http_v2_process_request_body(r, NULL, 0, 1, 0); - } - - if (rc != NGX_AGAIN) { - return rc; - } - - r->read_event_handler = ngx_http_v2_read_client_request_body_handler; - r->write_event_handler = ngx_http_request_empty_handler; - - return NGX_AGAIN; - } - - if (buf) { - rc = ngx_http_v2_process_request_body(r, buf->pos, - buf->last - buf->pos, 0, 0); - - ngx_pfree(r->pool, buf->start); - - if (rc != NGX_OK && rc != NGX_AGAIN) { - stream->skip_data = 1; - return rc; - } - } - - if (r->request_body_no_buffering || rb->filter_need_buffering) { - size = (size_t) len - h2scf->preread_size; - - } else { - stream->no_flow_control = 1; - size = NGX_HTTP_V2_MAX_WINDOW - stream->recv_window; - } - - if (size) { - if (ngx_http_v2_send_window_update(stream->connection, - stream->node->id, size) - == NGX_ERROR) - { - stream->skip_data = 1; - return NGX_HTTP_INTERNAL_SERVER_ERROR; - } - - h2c = stream->connection; - - if (!h2c->blocked) { - if (ngx_http_v2_send_output_queue(h2c) == NGX_ERROR) { - stream->skip_data = 1; - return NGX_HTTP_INTERNAL_SERVER_ERROR; - } - } - - stream->recv_window += size; - } - - if (!buf) { - ngx_add_timer(r->connection->read, clcf->client_body_timeout); - } - - r->read_event_handler = ngx_http_v2_read_client_request_body_handler; - r->write_event_handler = ngx_http_request_empty_handler; - - return NGX_AGAIN; -} - - -static ngx_int_t -ngx_http_v2_process_request_body(ngx_http_request_t *r, u_char *pos, - size_t size, ngx_uint_t last, ngx_uint_t flush) -{ - size_t n; - ngx_int_t rc; - ngx_connection_t *fc; - ngx_http_request_body_t *rb; - ngx_http_core_loc_conf_t *clcf; - - fc = r->connection; - rb = r->request_body; - - ngx_log_debug0(NGX_LOG_DEBUG_HTTP, fc->log, 0, - "http2 process request body"); - - if (size == 0 && !last && !flush) { - return NGX_AGAIN; - } - - for ( ;; ) { - for ( ;; ) { - if (rb->buf->last == rb->buf->end && size) { - - if (r->request_body_no_buffering) { - - /* should never happen due to flow control */ - - ngx_log_error(NGX_LOG_ALERT, fc->log, 0, - "no space in http2 body buffer"); - - return NGX_HTTP_INTERNAL_SERVER_ERROR; - } - - /* update chains */ - - ngx_log_debug0(NGX_LOG_DEBUG_HTTP, fc->log, 0, - "http2 body update chains"); - - rc = ngx_http_v2_filter_request_body(r); - - if (rc != NGX_OK) { - return rc; - } - - if (rb->busy != NULL) { - ngx_log_error(NGX_LOG_ALERT, fc->log, 0, - "busy buffers after request body flush"); - return NGX_HTTP_INTERNAL_SERVER_ERROR; - } - - rb->buf->pos = rb->buf->start; - rb->buf->last = rb->buf->start; - } - - /* copy body data to the buffer */ - - n = rb->buf->end - rb->buf->last; - - if (n > size) { - n = size; - } - - ngx_log_debug1(NGX_LOG_DEBUG_HTTP, fc->log, 0, - "http2 request body recv %uz", n); - - if (n > 0) { - rb->buf->last = ngx_cpymem(rb->buf->last, pos, n); - pos += n; - size -= n; - } - - if (size == 0 && last) { - rb->rest = 0; - } - - if (size == 0) { - break; - } - } - - ngx_log_debug1(NGX_LOG_DEBUG_HTTP, fc->log, 0, - "http2 request body rest %O", rb->rest); - - if (flush) { - rc = ngx_http_v2_filter_request_body(r); - - if (rc != NGX_OK) { - return rc; - } - } - - if (rb->rest == 0 && rb->last_saved) { - break; - } - - if (size == 0) { - clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module); - ngx_add_timer(fc->read, clcf->client_body_timeout); - - if (!flush) { - ngx_post_event(fc->read, &ngx_posted_events); - } - - return NGX_AGAIN; - } - } - - if (fc->read->timer_set) { - ngx_del_timer(fc->read); - } - - if (r->request_body_no_buffering) { - if (!flush) { - ngx_post_event(fc->read, &ngx_posted_events); - } - - return NGX_OK; - } - - if (r->headers_in.chunked) { - r->headers_in.content_length_n = rb->received; - } - - r->read_event_handler = ngx_http_block_reading; - rb->post_handler(r); - - return NGX_OK; -} - - -static ngx_int_t -ngx_http_v2_filter_request_body(ngx_http_request_t *r) -{ - ngx_buf_t *b, *buf; - ngx_int_t rc; - ngx_chain_t *cl; - ngx_http_request_body_t *rb; - ngx_http_core_loc_conf_t *clcf; - - rb = r->request_body; - buf = rb->buf; - - if (buf->pos == buf->last && (rb->rest || rb->last_sent)) { - cl = NULL; - goto update; - } - - cl = ngx_chain_get_free_buf(r->pool, &rb->free); - if (cl == NULL) { - return NGX_HTTP_INTERNAL_SERVER_ERROR; - } - - b = cl->buf; - - ngx_memzero(b, sizeof(ngx_buf_t)); - - if (buf->pos != buf->last) { - r->request_length += buf->last - buf->pos; - rb->received += buf->last - buf->pos; - - if (r->headers_in.content_length_n != -1) { - if (rb->received > r->headers_in.content_length_n) { - ngx_log_error(NGX_LOG_INFO, r->connection->log, 0, - "client intended to send body data " - "larger than declared"); - - return NGX_HTTP_BAD_REQUEST; - } - - } else { - clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module); - - if (clcf->client_max_body_size - && rb->received > clcf->client_max_body_size) - { - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "client intended to send too large chunked body: " - "%O bytes", rb->received); - - return NGX_HTTP_REQUEST_ENTITY_TOO_LARGE; - } - } - - b->temporary = 1; - b->pos = buf->pos; - b->last = buf->last; - b->start = b->pos; - b->end = b->last; - - buf->pos = buf->last; - } - - if (!rb->rest) { - if (r->headers_in.content_length_n != -1 - && r->headers_in.content_length_n != rb->received) - { - ngx_log_error(NGX_LOG_INFO, r->connection->log, 0, - "client prematurely closed stream: " - "only %O out of %O bytes of request body received", - rb->received, r->headers_in.content_length_n); - - return NGX_HTTP_BAD_REQUEST; - } - - b->last_buf = 1; - rb->last_sent = 1; - } - - b->tag = (ngx_buf_tag_t) &ngx_http_v2_filter_request_body; - b->flush = r->request_body_no_buffering; - -update: - - rc = ngx_http_top_request_body_filter(r, cl); - - ngx_chain_update_chains(r->pool, &rb->free, &rb->busy, &cl, - (ngx_buf_tag_t) &ngx_http_v2_filter_request_body); - - return rc; -} - - -static void -ngx_http_v2_read_client_request_body_handler(ngx_http_request_t *r) -{ - size_t window; - ngx_buf_t *buf; - ngx_int_t rc; - ngx_connection_t *fc; - ngx_http_v2_stream_t *stream; - ngx_http_v2_connection_t *h2c; - - fc = r->connection; - - ngx_log_debug0(NGX_LOG_DEBUG_HTTP, fc->log, 0, - "http2 read client request body handler"); - - if (fc->read->timedout) { - ngx_log_error(NGX_LOG_INFO, fc->log, NGX_ETIMEDOUT, "client timed out"); - - fc->timedout = 1; - r->stream->skip_data = 1; - - ngx_http_finalize_request(r, NGX_HTTP_REQUEST_TIME_OUT); - return; - } - - if (fc->error) { - ngx_log_error(NGX_LOG_INFO, fc->log, 0, - "client prematurely closed stream"); - - r->stream->skip_data = 1; - - ngx_http_finalize_request(r, NGX_HTTP_CLIENT_CLOSED_REQUEST); - return; - } - - rc = ngx_http_v2_process_request_body(r, NULL, 0, r->stream->in_closed, 1); - - if (rc != NGX_OK && rc != NGX_AGAIN) { - r->stream->skip_data = 1; - ngx_http_finalize_request(r, rc); - return; - } - - if (rc == NGX_OK) { - return; - } - - if (r->stream->no_flow_control) { - return; - } - - if (r->request_body->rest == 0) { - return; - } - - if (r->request_body->busy != NULL) { - return; - } - - stream = r->stream; - h2c = stream->connection; - - buf = r->request_body->buf; - - buf->pos = buf->start; - buf->last = buf->start; - - window = buf->end - buf->start; - - if (h2c->state.stream == stream) { - window -= h2c->state.length; - } - - if (window <= stream->recv_window) { - if (window < stream->recv_window) { - ngx_log_error(NGX_LOG_ALERT, r->connection->log, 0, - "http2 negative window update"); - - stream->skip_data = 1; - - ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR); - return; - } - - return; - } - - if (ngx_http_v2_send_window_update(h2c, stream->node->id, - window - stream->recv_window) - == NGX_ERROR) - { - stream->skip_data = 1; - ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR); - return; - } - - stream->recv_window = window; - - if (ngx_http_v2_send_output_queue(h2c) == NGX_ERROR) { - stream->skip_data = 1; - ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR); - return; - } -} - - -ngx_int_t -ngx_http_v2_read_unbuffered_request_body(ngx_http_request_t *r) -{ - size_t window; - ngx_buf_t *buf; - ngx_int_t rc; - ngx_connection_t *fc; - ngx_http_v2_stream_t *stream; - ngx_http_v2_connection_t *h2c; - - stream = r->stream; - fc = r->connection; - - ngx_log_debug0(NGX_LOG_DEBUG_HTTP, fc->log, 0, - "http2 read unbuffered request body"); - - if (fc->read->timedout) { - if (stream->recv_window) { - stream->skip_data = 1; - fc->timedout = 1; - - return NGX_HTTP_REQUEST_TIME_OUT; - } - - fc->read->timedout = 0; - } - - if (fc->error) { - stream->skip_data = 1; - return NGX_HTTP_BAD_REQUEST; - } - - rc = ngx_http_v2_process_request_body(r, NULL, 0, r->stream->in_closed, 1); - - if (rc != NGX_OK && rc != NGX_AGAIN) { - stream->skip_data = 1; - return rc; - } - - if (rc == NGX_OK) { - return NGX_OK; - } - - if (r->request_body->rest == 0) { - return NGX_AGAIN; - } - - if (r->request_body->busy != NULL) { - return NGX_AGAIN; - } - - buf = r->request_body->buf; - - buf->pos = buf->start; - buf->last = buf->start; - - window = buf->end - buf->start; - h2c = stream->connection; - - if (h2c->state.stream == stream) { - window -= h2c->state.length; - } - - if (window <= stream->recv_window) { - if (window < stream->recv_window) { - ngx_log_error(NGX_LOG_ALERT, r->connection->log, 0, - "http2 negative window update"); - stream->skip_data = 1; - return NGX_HTTP_INTERNAL_SERVER_ERROR; - } - - return NGX_AGAIN; - } - - if (ngx_http_v2_send_window_update(h2c, stream->node->id, - window - stream->recv_window) - == NGX_ERROR) - { - stream->skip_data = 1; - return NGX_HTTP_INTERNAL_SERVER_ERROR; - } - - if (ngx_http_v2_send_output_queue(h2c) == NGX_ERROR) { - stream->skip_data = 1; - return NGX_HTTP_INTERNAL_SERVER_ERROR; - } - - stream->recv_window = window; - - return NGX_AGAIN; -} - - -static ngx_int_t -ngx_http_v2_terminate_stream(ngx_http_v2_connection_t *h2c, - ngx_http_v2_stream_t *stream, ngx_uint_t status) -{ - ngx_event_t *rev; - ngx_connection_t *fc; - - if (stream->rst_sent) { - return NGX_OK; - } - - if (ngx_http_v2_send_rst_stream(h2c, stream->node->id, status) - == NGX_ERROR) - { - return NGX_ERROR; - } - - stream->rst_sent = 1; - stream->skip_data = 1; - - fc = stream->request->connection; - fc->error = 1; - - rev = fc->read; - rev->handler(rev); - - return NGX_OK; -} - - -void -ngx_http_v2_close_stream(ngx_http_v2_stream_t *stream, ngx_int_t rc) -{ - ngx_pool_t *pool; - ngx_event_t *ev; - ngx_connection_t *fc; - ngx_http_v2_node_t *node; - ngx_http_v2_connection_t *h2c; - - h2c = stream->connection; - node = stream->node; - - ngx_log_debug3(NGX_LOG_DEBUG_HTTP, h2c->connection->log, 0, - "http2 close stream %ui, queued %ui, processing %ui", - node->id, stream->queued, h2c->processing); - - fc = stream->request->connection; - - if (stream->queued) { - fc->error = 1; - fc->write->handler = ngx_http_v2_retry_close_stream_handler; - fc->read->handler = ngx_http_v2_retry_close_stream_handler; - return; - } - - if (!stream->rst_sent && !h2c->connection->error) { - - if (!stream->out_closed) { - if (ngx_http_v2_send_rst_stream(h2c, node->id, - fc->timedout ? NGX_HTTP_V2_PROTOCOL_ERROR - : NGX_HTTP_V2_INTERNAL_ERROR) - != NGX_OK) - { - h2c->connection->error = 1; - } - - } else if (!stream->in_closed) { - if (ngx_http_v2_send_rst_stream(h2c, node->id, NGX_HTTP_V2_NO_ERROR) - != NGX_OK) - { - h2c->connection->error = 1; - } - } - } - - if (h2c->state.stream == stream) { - h2c->state.stream = NULL; - } - - node->stream = NULL; - - ngx_queue_insert_tail(&h2c->closed, &node->reuse); - h2c->closed_nodes++; - - /* - * This pool keeps decoded request headers which can be used by log phase - * handlers in ngx_http_free_request(). - * - * The pointer is stored into local variable because the stream object - * will be destroyed after a call to ngx_http_free_request(). - */ - pool = stream->pool; - - h2c->frames -= stream->frames; - - ngx_http_free_request(stream->request, rc); - - if (pool != h2c->state.pool) { - ngx_destroy_pool(pool); - - } else { - /* pool will be destroyed when the complete header is parsed */ - h2c->state.keep_pool = 0; - } - - ev = fc->read; - - if (ev->timer_set) { - ngx_del_timer(ev); - } - - if (ev->posted) { - ngx_delete_posted_event(ev); - } - - ev = fc->write; - - if (ev->timer_set) { - ngx_del_timer(ev); - } - - if (ev->posted) { - ngx_delete_posted_event(ev); - } - - fc->data = h2c->free_fake_connections; - h2c->free_fake_connections = fc; - - h2c->processing--; - - if (h2c->processing || h2c->blocked) { - return; - } - - ev = h2c->connection->read; - - ev->handler = ngx_http_v2_handle_connection_handler; - ngx_post_event(ev, &ngx_posted_events); -} - - -static void -ngx_http_v2_close_stream_handler(ngx_event_t *ev) -{ - ngx_connection_t *fc; - ngx_http_request_t *r; - - fc = ev->data; - r = fc->data; - - ngx_log_debug0(NGX_LOG_DEBUG_HTTP, fc->log, 0, - "http2 close stream handler"); - - if (ev->timedout) { - ngx_log_error(NGX_LOG_INFO, fc->log, NGX_ETIMEDOUT, "client timed out"); - - fc->timedout = 1; - - ngx_http_v2_close_stream(r->stream, NGX_HTTP_REQUEST_TIME_OUT); - return; - } - - ngx_http_v2_close_stream(r->stream, 0); -} - - -static void -ngx_http_v2_retry_close_stream_handler(ngx_event_t *ev) -{ - ngx_connection_t *fc; - ngx_http_request_t *r; - - fc = ev->data; - r = fc->data; - - ngx_log_debug0(NGX_LOG_DEBUG_HTTP, fc->log, 0, - "http2 retry close stream handler"); - - ngx_http_v2_close_stream(r->stream, 0); -} - - -static void -ngx_http_v2_handle_connection_handler(ngx_event_t *rev) -{ - ngx_connection_t *c; - ngx_http_v2_connection_t *h2c; - - ngx_log_debug0(NGX_LOG_DEBUG_HTTP, rev->log, 0, - "http2 handle connection handler"); - - c = rev->data; - h2c = c->data; - - if (c->error) { - ngx_http_v2_finalize_connection(h2c, 0); - return; - } - - rev->handler = ngx_http_v2_read_handler; - - if (rev->ready) { - ngx_http_v2_read_handler(rev); - return; - } - - if (h2c->last_out && ngx_http_v2_send_output_queue(h2c) == NGX_ERROR) { - ngx_http_v2_finalize_connection(h2c, 0); - return; - } - - ngx_http_v2_handle_connection(c->data); -} - - -static void -ngx_http_v2_idle_handler(ngx_event_t *rev) -{ - ngx_connection_t *c; - ngx_http_v2_srv_conf_t *h2scf; - ngx_http_v2_connection_t *h2c; - ngx_http_core_loc_conf_t *clcf; - - c = rev->data; - h2c = c->data; - - ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0, "http2 idle handler"); - - if (rev->timedout || c->close) { - ngx_http_v2_finalize_connection(h2c, NGX_HTTP_V2_NO_ERROR); - return; - } - -#if (NGX_HAVE_KQUEUE) - - if (ngx_event_flags & NGX_USE_KQUEUE_EVENT) { - if (rev->pending_eof) { - c->log->handler = NULL; - ngx_log_error(NGX_LOG_INFO, c->log, rev->kq_errno, - "kevent() reported that client %V closed " - "idle connection", &c->addr_text); -#if (NGX_HTTP_SSL) - if (c->ssl) { - c->ssl->no_send_shutdown = 1; - } -#endif - ngx_http_close_connection(c); - return; - } - } - -#endif - - clcf = ngx_http_get_module_loc_conf(h2c->http_connection->conf_ctx, - ngx_http_core_module); - - if (h2c->idle++ > 10 * clcf->keepalive_requests) { - ngx_log_error(NGX_LOG_INFO, h2c->connection->log, 0, - "http2 flood detected"); - ngx_http_v2_finalize_connection(h2c, NGX_HTTP_V2_NO_ERROR); - return; - } - - c->destroyed = 0; - ngx_reusable_connection(c, 0); - - h2scf = ngx_http_get_module_srv_conf(h2c->http_connection->conf_ctx, - ngx_http_v2_module); - - h2c->pool = ngx_create_pool(h2scf->pool_size, h2c->connection->log); - if (h2c->pool == NULL) { - ngx_http_v2_finalize_connection(h2c, NGX_HTTP_V2_INTERNAL_ERROR); - return; - } - - c->write->handler = ngx_http_v2_write_handler; - - rev->handler = ngx_http_v2_read_handler; - ngx_http_v2_read_handler(rev); -} - - -static void -ngx_http_v2_finalize_connection(ngx_http_v2_connection_t *h2c, - ngx_uint_t status) -{ - ngx_uint_t i, size; - ngx_event_t *ev; - ngx_connection_t *c, *fc; - ngx_http_request_t *r; - ngx_http_v2_node_t *node; - ngx_http_v2_stream_t *stream; - ngx_http_v2_srv_conf_t *h2scf; - - c = h2c->connection; - - h2c->blocked = 1; - - if (!c->error && !h2c->goaway) { - h2c->goaway = 1; - - if (ngx_http_v2_send_goaway(h2c, status) != NGX_ERROR) { - (void) ngx_http_v2_send_output_queue(h2c); - } - } - - if (!h2c->processing) { - goto done; - } - - c->read->handler = ngx_http_empty_handler; - c->write->handler = ngx_http_empty_handler; - - h2c->last_out = NULL; - - h2scf = ngx_http_get_module_srv_conf(h2c->http_connection->conf_ctx, - ngx_http_v2_module); - - size = ngx_http_v2_index_size(h2scf); - - for (i = 0; i < size; i++) { - - for (node = h2c->streams_index[i]; node; node = node->index) { - stream = node->stream; - - if (stream == NULL) { - continue; - } - - stream->waiting = 0; - - r = stream->request; - fc = r->connection; - - fc->error = 1; - - if (stream->queued) { - stream->queued = 0; - - ev = fc->write; - ev->active = 0; - ev->ready = 1; - - } else { - ev = fc->read; - } - - ev->eof = 1; - ev->handler(ev); - } - } - - h2c->blocked = 0; - - if (h2c->processing) { - c->error = 1; - return; - } - -done: - - if (c->error) { - ngx_http_close_connection(c); - return; - } - - ngx_http_v2_lingering_close(c); -} - - -static ngx_int_t -ngx_http_v2_adjust_windows(ngx_http_v2_connection_t *h2c, ssize_t delta) -{ - ngx_uint_t i, size; - ngx_event_t *wev; - ngx_http_v2_node_t *node; - ngx_http_v2_stream_t *stream; - ngx_http_v2_srv_conf_t *h2scf; - - h2scf = ngx_http_get_module_srv_conf(h2c->http_connection->conf_ctx, - ngx_http_v2_module); - - size = ngx_http_v2_index_size(h2scf); - - for (i = 0; i < size; i++) { - - for (node = h2c->streams_index[i]; node; node = node->index) { - stream = node->stream; - - if (stream == NULL) { - continue; - } - - if (delta > 0 - && stream->send_window - > (ssize_t) (NGX_HTTP_V2_MAX_WINDOW - delta)) - { - if (ngx_http_v2_terminate_stream(h2c, stream, - NGX_HTTP_V2_FLOW_CTRL_ERROR) - == NGX_ERROR) - { - return NGX_ERROR; - } - - continue; - } - - stream->send_window += delta; - - ngx_log_debug2(NGX_LOG_DEBUG_HTTP, h2c->connection->log, 0, - "http2:%ui adjusted window: %z", - node->id, stream->send_window); - - if (stream->send_window > 0 && stream->exhausted) { - stream->exhausted = 0; - - wev = stream->request->connection->write; - - wev->active = 0; - wev->ready = 1; - - if (!wev->delayed) { - wev->handler(wev); - } - } - } - } - - return NGX_OK; -} - - -static void -ngx_http_v2_set_dependency(ngx_http_v2_connection_t *h2c, - ngx_http_v2_node_t *node, ngx_uint_t depend, ngx_uint_t exclusive) -{ - ngx_queue_t *children, *q; - ngx_http_v2_node_t *parent, *child, *next; - - parent = depend ? ngx_http_v2_get_node_by_id(h2c, depend, 0) : NULL; - - if (parent == NULL) { - parent = NGX_HTTP_V2_ROOT; - - if (depend != 0) { - exclusive = 0; - } - - node->rank = 1; - node->rel_weight = (1.0 / 256) * node->weight; - - children = &h2c->dependencies; - - } else { - if (node->parent != NULL) { - - for (next = parent->parent; - next != NGX_HTTP_V2_ROOT && next->rank >= node->rank; - next = next->parent) - { - if (next != node) { - continue; - } - - ngx_queue_remove(&parent->queue); - ngx_queue_insert_after(&node->queue, &parent->queue); - - parent->parent = node->parent; - - if (node->parent == NGX_HTTP_V2_ROOT) { - parent->rank = 1; - parent->rel_weight = (1.0 / 256) * parent->weight; - - } else { - parent->rank = node->parent->rank + 1; - parent->rel_weight = (node->parent->rel_weight / 256) - * parent->weight; - } - - if (!exclusive) { - ngx_http_v2_node_children_update(parent); - } - - break; - } - } - - node->rank = parent->rank + 1; - node->rel_weight = (parent->rel_weight / 256) * node->weight; - - if (parent->stream == NULL) { - ngx_queue_remove(&parent->reuse); - ngx_queue_insert_tail(&h2c->closed, &parent->reuse); - } - - children = &parent->children; - } - - if (exclusive) { - for (q = ngx_queue_head(children); - q != ngx_queue_sentinel(children); - q = ngx_queue_next(q)) - { - child = ngx_queue_data(q, ngx_http_v2_node_t, queue); - child->parent = node; - } - - ngx_queue_add(&node->children, children); - ngx_queue_init(children); - } - - if (node->parent != NULL) { - ngx_queue_remove(&node->queue); - } - - ngx_queue_insert_tail(children, &node->queue); - - node->parent = parent; - - ngx_http_v2_node_children_update(node); -} - - -static void -ngx_http_v2_node_children_update(ngx_http_v2_node_t *node) -{ - ngx_queue_t *q; - ngx_http_v2_node_t *child; - - for (q = ngx_queue_head(&node->children); - q != ngx_queue_sentinel(&node->children); - q = ngx_queue_next(q)) - { - child = ngx_queue_data(q, ngx_http_v2_node_t, queue); - - child->rank = node->rank + 1; - child->rel_weight = (node->rel_weight / 256) * child->weight; - - ngx_http_v2_node_children_update(child); - } -} - - -static void -ngx_http_v2_pool_cleanup(void *data) -{ - ngx_http_v2_connection_t *h2c = data; - - if (h2c->state.pool) { - ngx_destroy_pool(h2c->state.pool); - } - - if (h2c->pool) { - ngx_destroy_pool(h2c->pool); - } -} diff --git a/src/deps/src/nginx-1.30.3/src/http/v2/ngx_http_v2.h b/src/deps/src/nginx-1.30.3/src/http/v2/ngx_http_v2.h deleted file mode 100644 index 9605c8a23d..0000000000 --- a/src/deps/src/nginx-1.30.3/src/http/v2/ngx_http_v2.h +++ /dev/null @@ -1,423 +0,0 @@ -/* - * Copyright (C) Nginx, Inc. - * Copyright (C) Valentin V. Bartenev - */ - - -#ifndef _NGX_HTTP_V2_H_INCLUDED_ -#define _NGX_HTTP_V2_H_INCLUDED_ - - -#include -#include -#include - - -#define NGX_HTTP_V2_ALPN_PROTO "\x02h2" - -#define NGX_HTTP_V2_STATE_BUFFER_SIZE 16 - -#define NGX_HTTP_V2_DEFAULT_FRAME_SIZE (1 << 14) -#define NGX_HTTP_V2_MAX_FRAME_SIZE ((1 << 24) - 1) - -#define NGX_HTTP_V2_INT_OCTETS 4 -#define NGX_HTTP_V2_MAX_FIELD \ - (127 + (1 << (NGX_HTTP_V2_INT_OCTETS - 1) * 7) - 1) - -#define NGX_HTTP_V2_FRAME_HEADER_SIZE 9 - -/* frame types */ -#define NGX_HTTP_V2_DATA_FRAME 0x0 -#define NGX_HTTP_V2_HEADERS_FRAME 0x1 -#define NGX_HTTP_V2_PRIORITY_FRAME 0x2 -#define NGX_HTTP_V2_RST_STREAM_FRAME 0x3 -#define NGX_HTTP_V2_SETTINGS_FRAME 0x4 -#define NGX_HTTP_V2_PUSH_PROMISE_FRAME 0x5 -#define NGX_HTTP_V2_PING_FRAME 0x6 -#define NGX_HTTP_V2_GOAWAY_FRAME 0x7 -#define NGX_HTTP_V2_WINDOW_UPDATE_FRAME 0x8 -#define NGX_HTTP_V2_CONTINUATION_FRAME 0x9 - -/* frame flags */ -#define NGX_HTTP_V2_NO_FLAG 0x00 -#define NGX_HTTP_V2_ACK_FLAG 0x01 -#define NGX_HTTP_V2_END_STREAM_FLAG 0x01 -#define NGX_HTTP_V2_END_HEADERS_FLAG 0x04 -#define NGX_HTTP_V2_PADDED_FLAG 0x08 -#define NGX_HTTP_V2_PRIORITY_FLAG 0x20 - -#define NGX_HTTP_V2_MAX_WINDOW ((1U << 31) - 1) -#define NGX_HTTP_V2_DEFAULT_WINDOW 65535 - -#define NGX_HTTP_V2_DEFAULT_WEIGHT 16 - - -typedef struct ngx_http_v2_connection_s ngx_http_v2_connection_t; -typedef struct ngx_http_v2_node_s ngx_http_v2_node_t; -typedef struct ngx_http_v2_out_frame_s ngx_http_v2_out_frame_t; - - -typedef u_char *(*ngx_http_v2_handler_pt) (ngx_http_v2_connection_t *h2c, - u_char *pos, u_char *end); - - -typedef struct { - ngx_flag_t enable; - size_t pool_size; - ngx_uint_t concurrent_streams; - size_t preread_size; - ngx_uint_t streams_index_mask; -} ngx_http_v2_srv_conf_t; - - -typedef struct { - ngx_str_t name; - ngx_str_t value; -} ngx_http_v2_header_t; - - -typedef struct { - ngx_uint_t sid; - size_t length; - size_t padding; - unsigned flags:8; - - unsigned incomplete:1; - unsigned keep_pool:1; - - /* HPACK */ - unsigned parse_name:1; - unsigned parse_value:1; - unsigned index:1; - ngx_http_v2_header_t header; - size_t header_limit; - u_char field_state; - u_char *field_start; - u_char *field_end; - size_t field_rest; - ngx_pool_t *pool; - - ngx_http_v2_stream_t *stream; - - u_char buffer[NGX_HTTP_V2_STATE_BUFFER_SIZE]; - size_t buffer_used; - ngx_http_v2_handler_pt handler; -} ngx_http_v2_state_t; - - - -typedef struct { - ngx_http_v2_header_t **entries; - - ngx_uint_t added; - ngx_uint_t deleted; - ngx_uint_t reused; - ngx_uint_t allocated; - - size_t size; - size_t free; - u_char *storage; - u_char *pos; -} ngx_http_v2_hpack_t; - - -struct ngx_http_v2_connection_s { - ngx_connection_t *connection; - ngx_http_connection_t *http_connection; - - off_t total_bytes; - off_t payload_bytes; - - ngx_uint_t processing; - ngx_uint_t frames; - ngx_uint_t idle; - ngx_uint_t new_streams; - ngx_uint_t refused_streams; - ngx_uint_t priority_limit; - - size_t send_window; - size_t recv_window; - size_t init_window; - - size_t frame_size; - - ngx_queue_t waiting; - - ngx_http_v2_state_t state; - - ngx_http_v2_hpack_t hpack; - - ngx_pool_t *pool; - - ngx_http_v2_out_frame_t *free_frames; - ngx_connection_t *free_fake_connections; - - ngx_http_v2_node_t **streams_index; - - ngx_http_v2_out_frame_t *last_out; - - ngx_queue_t dependencies; - ngx_queue_t closed; - - ngx_uint_t closed_nodes; - ngx_uint_t last_sid; - - time_t lingering_time; - - unsigned settings_ack:1; - unsigned table_update:1; - unsigned blocked:1; - unsigned goaway:1; -}; - - -struct ngx_http_v2_node_s { - ngx_uint_t id; - ngx_http_v2_node_t *index; - ngx_http_v2_node_t *parent; - ngx_queue_t queue; - ngx_queue_t children; - ngx_queue_t reuse; - ngx_uint_t rank; - ngx_uint_t weight; - double rel_weight; - ngx_http_v2_stream_t *stream; -}; - - -struct ngx_http_v2_stream_s { - ngx_http_request_t *request; - ngx_http_v2_connection_t *connection; - ngx_http_v2_node_t *node; - - ngx_uint_t queued; - - /* - * A change to SETTINGS_INITIAL_WINDOW_SIZE could cause the - * send_window to become negative, hence it's signed. - */ - ssize_t send_window; - size_t recv_window; - - ngx_buf_t *preread; - - ngx_uint_t frames; - - ngx_http_v2_out_frame_t *free_frames; - ngx_chain_t *free_frame_headers; - ngx_chain_t *free_bufs; - - ngx_queue_t queue; - - ngx_array_t *cookies; - - ngx_pool_t *pool; - - unsigned initialized:1; - unsigned waiting:1; - unsigned blocked:1; - unsigned exhausted:1; - unsigned in_closed:1; - unsigned out_closed:1; - unsigned rst_sent:1; - unsigned no_flow_control:1; - unsigned skip_data:1; -}; - - -struct ngx_http_v2_out_frame_s { - ngx_http_v2_out_frame_t *next; - ngx_chain_t *first; - ngx_chain_t *last; - ngx_int_t (*handler)(ngx_http_v2_connection_t *h2c, - ngx_http_v2_out_frame_t *frame); - - ngx_http_v2_stream_t *stream; - size_t length; - - unsigned blocked:1; - unsigned fin:1; -}; - - -static ngx_inline void -ngx_http_v2_queue_frame(ngx_http_v2_connection_t *h2c, - ngx_http_v2_out_frame_t *frame) -{ - ngx_http_v2_out_frame_t **out; - - for (out = &h2c->last_out; *out; out = &(*out)->next) { - - if ((*out)->blocked || (*out)->stream == NULL) { - break; - } - - if ((*out)->stream->node->rank < frame->stream->node->rank - || ((*out)->stream->node->rank == frame->stream->node->rank - && (*out)->stream->node->rel_weight - >= frame->stream->node->rel_weight)) - { - break; - } - } - - frame->next = *out; - *out = frame; -} - - -static ngx_inline void -ngx_http_v2_queue_blocked_frame(ngx_http_v2_connection_t *h2c, - ngx_http_v2_out_frame_t *frame) -{ - ngx_http_v2_out_frame_t **out; - - for (out = &h2c->last_out; *out; out = &(*out)->next) { - - if ((*out)->blocked || (*out)->stream == NULL) { - break; - } - } - - frame->next = *out; - *out = frame; -} - - -static ngx_inline void -ngx_http_v2_queue_ordered_frame(ngx_http_v2_connection_t *h2c, - ngx_http_v2_out_frame_t *frame) -{ - frame->next = h2c->last_out; - h2c->last_out = frame; -} - - -void ngx_http_v2_init(ngx_event_t *rev); - -ngx_int_t ngx_http_v2_read_request_body(ngx_http_request_t *r); -ngx_int_t ngx_http_v2_read_unbuffered_request_body(ngx_http_request_t *r); - -void ngx_http_v2_close_stream(ngx_http_v2_stream_t *stream, ngx_int_t rc); - -ngx_int_t ngx_http_v2_send_output_queue(ngx_http_v2_connection_t *h2c); - - -ngx_str_t *ngx_http_v2_get_static_name(ngx_uint_t index); -ngx_str_t *ngx_http_v2_get_static_value(ngx_uint_t index); - -ngx_int_t ngx_http_v2_get_indexed_header(ngx_http_v2_connection_t *h2c, - ngx_uint_t index, ngx_uint_t name_only); -ngx_int_t ngx_http_v2_add_header(ngx_http_v2_connection_t *h2c, - ngx_http_v2_header_t *header); -ngx_int_t ngx_http_v2_table_size(ngx_http_v2_connection_t *h2c, size_t size); - - -#define ngx_http_v2_prefix(bits) ((1 << (bits)) - 1) - - -#if (NGX_HAVE_NONALIGNED) - -#define ngx_http_v2_parse_uint16(p) ntohs(*(uint16_t *) (p)) -#define ngx_http_v2_parse_uint32(p) ntohl(*(uint32_t *) (p)) - -#else - -#define ngx_http_v2_parse_uint16(p) ((p)[0] << 8 | (p)[1]) -#define ngx_http_v2_parse_uint32(p) \ - ((uint32_t) (p)[0] << 24 | (p)[1] << 16 | (p)[2] << 8 | (p)[3]) - -#endif - -#define ngx_http_v2_parse_length(p) ((p) >> 8) -#define ngx_http_v2_parse_type(p) ((p) & 0xff) -#define ngx_http_v2_parse_sid(p) (ngx_http_v2_parse_uint32(p) & 0x7fffffff) -#define ngx_http_v2_parse_window(p) (ngx_http_v2_parse_uint32(p) & 0x7fffffff) - - -#define ngx_http_v2_write_uint16_aligned(p, s) \ - (*(uint16_t *) (p) = htons((uint16_t) (s)), (p) + sizeof(uint16_t)) -#define ngx_http_v2_write_uint32_aligned(p, s) \ - (*(uint32_t *) (p) = htonl((uint32_t) (s)), (p) + sizeof(uint32_t)) - -#if (NGX_HAVE_NONALIGNED) - -#define ngx_http_v2_write_uint16 ngx_http_v2_write_uint16_aligned -#define ngx_http_v2_write_uint32 ngx_http_v2_write_uint32_aligned - -#else - -#define ngx_http_v2_write_uint16(p, s) \ - ((p)[0] = (u_char) ((s) >> 8), \ - (p)[1] = (u_char) (s), \ - (p) + sizeof(uint16_t)) - -#define ngx_http_v2_write_uint32(p, s) \ - ((p)[0] = (u_char) ((s) >> 24), \ - (p)[1] = (u_char) ((s) >> 16), \ - (p)[2] = (u_char) ((s) >> 8), \ - (p)[3] = (u_char) (s), \ - (p) + sizeof(uint32_t)) - -#endif - -#define ngx_http_v2_write_len_and_type(p, l, t) \ - ngx_http_v2_write_uint32_aligned(p, (l) << 8 | (t)) - -#define ngx_http_v2_write_sid ngx_http_v2_write_uint32 - - -#define ngx_http_v2_indexed(i) (128 + (i)) -#define ngx_http_v2_inc_indexed(i) (64 + (i)) - -#define ngx_http_v2_write_name(dst, src, len, tmp) \ - ngx_http_v2_string_encode(dst, src, len, tmp, 1) -#define ngx_http_v2_write_value(dst, src, len, tmp) \ - ngx_http_v2_string_encode(dst, src, len, tmp, 0) - -#define NGX_HTTP_V2_ENCODE_RAW 0 -#define NGX_HTTP_V2_ENCODE_HUFF 0x80 - -#define NGX_HTTP_V2_AUTHORITY_INDEX 1 - -#define NGX_HTTP_V2_METHOD_INDEX 2 -#define NGX_HTTP_V2_METHOD_GET_INDEX 2 -#define NGX_HTTP_V2_METHOD_POST_INDEX 3 - -#define NGX_HTTP_V2_PATH_INDEX 4 -#define NGX_HTTP_V2_PATH_ROOT_INDEX 4 - -#define NGX_HTTP_V2_SCHEME_HTTP_INDEX 6 -#define NGX_HTTP_V2_SCHEME_HTTPS_INDEX 7 - -#define NGX_HTTP_V2_STATUS_INDEX 8 -#define NGX_HTTP_V2_STATUS_200_INDEX 8 -#define NGX_HTTP_V2_STATUS_204_INDEX 9 -#define NGX_HTTP_V2_STATUS_206_INDEX 10 -#define NGX_HTTP_V2_STATUS_304_INDEX 11 -#define NGX_HTTP_V2_STATUS_400_INDEX 12 -#define NGX_HTTP_V2_STATUS_404_INDEX 13 -#define NGX_HTTP_V2_STATUS_500_INDEX 14 - -#define NGX_HTTP_V2_CONTENT_LENGTH_INDEX 28 -#define NGX_HTTP_V2_CONTENT_TYPE_INDEX 31 -#define NGX_HTTP_V2_DATE_INDEX 33 -#define NGX_HTTP_V2_LAST_MODIFIED_INDEX 44 -#define NGX_HTTP_V2_LOCATION_INDEX 46 -#define NGX_HTTP_V2_SERVER_INDEX 54 -#define NGX_HTTP_V2_VARY_INDEX 59 - -#define NGX_HTTP_V2_PREFACE_START "PRI * HTTP/2.0\r\n" -#define NGX_HTTP_V2_PREFACE_END "\r\nSM\r\n\r\n" -#define NGX_HTTP_V2_PREFACE NGX_HTTP_V2_PREFACE_START \ - NGX_HTTP_V2_PREFACE_END - - -u_char *ngx_http_v2_string_encode(u_char *dst, u_char *src, size_t len, - u_char *tmp, ngx_uint_t lower); - - -extern ngx_module_t ngx_http_v2_module; - - -#endif /* _NGX_HTTP_V2_H_INCLUDED_ */ diff --git a/src/deps/src/nginx-1.30.3/src/http/v2/ngx_http_v2_encode.c b/src/deps/src/nginx-1.30.3/src/http/v2/ngx_http_v2_encode.c deleted file mode 100644 index 8798aa9ae2..0000000000 --- a/src/deps/src/nginx-1.30.3/src/http/v2/ngx_http_v2_encode.c +++ /dev/null @@ -1,62 +0,0 @@ - -/* - * Copyright (C) Nginx, Inc. - * Copyright (C) Valentin V. Bartenev - */ - - -#include -#include -#include - - -static u_char *ngx_http_v2_write_int(u_char *pos, ngx_uint_t prefix, - ngx_uint_t value); - - -u_char * -ngx_http_v2_string_encode(u_char *dst, u_char *src, size_t len, u_char *tmp, - ngx_uint_t lower) -{ - size_t hlen; - - hlen = ngx_http_huff_encode(src, len, tmp, lower); - - if (hlen > 0) { - *dst = NGX_HTTP_V2_ENCODE_HUFF; - dst = ngx_http_v2_write_int(dst, ngx_http_v2_prefix(7), hlen); - return ngx_cpymem(dst, tmp, hlen); - } - - *dst = NGX_HTTP_V2_ENCODE_RAW; - dst = ngx_http_v2_write_int(dst, ngx_http_v2_prefix(7), len); - - if (lower) { - ngx_strlow(dst, src, len); - return dst + len; - } - - return ngx_cpymem(dst, src, len); -} - - -static u_char * -ngx_http_v2_write_int(u_char *pos, ngx_uint_t prefix, ngx_uint_t value) -{ - if (value < prefix) { - *pos++ |= value; - return pos; - } - - *pos++ |= prefix; - value -= prefix; - - while (value >= 128) { - *pos++ = value % 128 + 128; - value /= 128; - } - - *pos++ = (u_char) value; - - return pos; -} diff --git a/src/deps/src/nginx-1.30.3/src/http/v2/ngx_http_v2_filter_module.c b/src/deps/src/nginx-1.30.3/src/http/v2/ngx_http_v2_filter_module.c deleted file mode 100644 index 6b73b1e687..0000000000 --- a/src/deps/src/nginx-1.30.3/src/http/v2/ngx_http_v2_filter_module.c +++ /dev/null @@ -1,1769 +0,0 @@ - -/* - * Copyright (C) Nginx, Inc. - * Copyright (C) Valentin V. Bartenev - * Copyright (C) Ruslan Ermilov - */ - - -#include -#include -#include -#include -#include - - -/* - * This returns precise number of octets for values in range 0..253 - * and estimate number for the rest, but not smaller than required. - */ - -#define ngx_http_v2_integer_octets(v) (1 + (v) / 127) - -#define ngx_http_v2_literal_size(h) \ - (ngx_http_v2_integer_octets(sizeof(h) - 1) + sizeof(h) - 1) - - -#define NGX_HTTP_V2_NO_TRAILERS (ngx_http_v2_out_frame_t *) -1 - - -static ngx_int_t ngx_http_v2_header_filter(ngx_http_request_t *r); -static ngx_int_t ngx_http_v2_early_hints_filter(ngx_http_request_t *r); -static ngx_int_t ngx_http_v2_init_stream(ngx_http_request_t *r); - -static ngx_http_v2_out_frame_t *ngx_http_v2_create_headers_frame( - ngx_http_request_t *r, u_char *pos, u_char *end, ngx_uint_t fin, - ngx_uint_t flush); -static ngx_http_v2_out_frame_t *ngx_http_v2_create_trailers_frame( - ngx_http_request_t *r); - -static ngx_chain_t *ngx_http_v2_send_chain(ngx_connection_t *fc, - ngx_chain_t *in, off_t limit); - -static ngx_chain_t *ngx_http_v2_filter_get_shadow( - ngx_http_v2_stream_t *stream, ngx_buf_t *buf, off_t offset, off_t size); -static ngx_http_v2_out_frame_t *ngx_http_v2_filter_get_data_frame( - ngx_http_v2_stream_t *stream, size_t len, ngx_chain_t *first, - ngx_chain_t *last); - -static ngx_inline ngx_int_t ngx_http_v2_flow_control( - ngx_http_v2_connection_t *h2c, ngx_http_v2_stream_t *stream); -static void ngx_http_v2_waiting_queue(ngx_http_v2_connection_t *h2c, - ngx_http_v2_stream_t *stream); - -static ngx_inline ngx_int_t ngx_http_v2_filter_send( - ngx_connection_t *fc, ngx_http_v2_stream_t *stream); - -static ngx_int_t ngx_http_v2_headers_frame_handler( - ngx_http_v2_connection_t *h2c, ngx_http_v2_out_frame_t *frame); -static ngx_int_t ngx_http_v2_data_frame_handler( - ngx_http_v2_connection_t *h2c, ngx_http_v2_out_frame_t *frame); -static ngx_inline void ngx_http_v2_handle_frame( - ngx_http_v2_stream_t *stream, ngx_http_v2_out_frame_t *frame); -static ngx_inline void ngx_http_v2_handle_stream( - ngx_http_v2_connection_t *h2c, ngx_http_v2_stream_t *stream); - -static void ngx_http_v2_filter_cleanup(void *data); - -static ngx_int_t ngx_http_v2_filter_init(ngx_conf_t *cf); - - -static ngx_http_module_t ngx_http_v2_filter_module_ctx = { - NULL, /* preconfiguration */ - ngx_http_v2_filter_init, /* postconfiguration */ - - NULL, /* create main configuration */ - NULL, /* init main configuration */ - - NULL, /* create server configuration */ - NULL, /* merge server configuration */ - - NULL, /* create location configuration */ - NULL /* merge location configuration */ -}; - - -ngx_module_t ngx_http_v2_filter_module = { - NGX_MODULE_V1, - &ngx_http_v2_filter_module_ctx, /* module context */ - NULL, /* module directives */ - NGX_HTTP_MODULE, /* module type */ - NULL, /* init master */ - NULL, /* init module */ - NULL, /* init process */ - NULL, /* init thread */ - NULL, /* exit thread */ - NULL, /* exit process */ - NULL, /* exit master */ - NGX_MODULE_V1_PADDING -}; - - -static ngx_http_output_header_filter_pt ngx_http_next_header_filter; -static ngx_http_output_header_filter_pt ngx_http_next_early_hints_filter; - - -static ngx_int_t -ngx_http_v2_header_filter(ngx_http_request_t *r) -{ - u_char status, *pos, *start, *p, *tmp; - size_t len, tmp_len; - ngx_str_t host, location; - ngx_uint_t i, port, fin; - ngx_list_part_t *part; - ngx_table_elt_t *header; - ngx_connection_t *fc; - ngx_http_v2_stream_t *stream; - ngx_http_v2_out_frame_t *frame; - ngx_http_v2_connection_t *h2c; - ngx_http_core_loc_conf_t *clcf; - ngx_http_core_srv_conf_t *cscf; - u_char addr[NGX_SOCKADDR_STRLEN]; - - static const u_char nginx[5] = { 0x84, 0xaa, 0x63, 0x55, 0xe7 }; -#if (NGX_HTTP_GZIP) - static const u_char accept_encoding[12] = { - 0x8b, 0x84, 0x84, 0x2d, 0x69, 0x5b, 0x05, 0x44, 0x3c, 0x86, 0xaa, 0x6f - }; -#endif - - static size_t nginx_ver_len = ngx_http_v2_literal_size(NGINX_VER); - static u_char nginx_ver[ngx_http_v2_literal_size(NGINX_VER)]; - - static size_t nginx_ver_build_len = - ngx_http_v2_literal_size(NGINX_VER_BUILD); - static u_char nginx_ver_build[ngx_http_v2_literal_size(NGINX_VER_BUILD)]; - - stream = r->stream; - - if (!stream) { - return ngx_http_next_header_filter(r); - } - - ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "http2 header filter"); - - if (r->header_sent) { - return NGX_OK; - } - - r->header_sent = 1; - - if (r != r->main) { - return NGX_OK; - } - - fc = r->connection; - - if (fc->error) { - return NGX_ERROR; - } - - if (r->method == NGX_HTTP_HEAD) { - r->header_only = 1; - } - - switch (r->headers_out.status) { - - case NGX_HTTP_OK: - status = ngx_http_v2_indexed(NGX_HTTP_V2_STATUS_200_INDEX); - break; - - case NGX_HTTP_NO_CONTENT: - r->header_only = 1; - - ngx_str_null(&r->headers_out.content_type); - - r->headers_out.content_length = NULL; - r->headers_out.content_length_n = -1; - - r->headers_out.last_modified_time = -1; - r->headers_out.last_modified = NULL; - - status = ngx_http_v2_indexed(NGX_HTTP_V2_STATUS_204_INDEX); - break; - - case NGX_HTTP_PARTIAL_CONTENT: - status = ngx_http_v2_indexed(NGX_HTTP_V2_STATUS_206_INDEX); - break; - - case NGX_HTTP_NOT_MODIFIED: - r->header_only = 1; - status = ngx_http_v2_indexed(NGX_HTTP_V2_STATUS_304_INDEX); - break; - - default: - r->headers_out.last_modified_time = -1; - r->headers_out.last_modified = NULL; - - switch (r->headers_out.status) { - - case NGX_HTTP_BAD_REQUEST: - status = ngx_http_v2_indexed(NGX_HTTP_V2_STATUS_400_INDEX); - break; - - case NGX_HTTP_NOT_FOUND: - status = ngx_http_v2_indexed(NGX_HTTP_V2_STATUS_404_INDEX); - break; - - case NGX_HTTP_INTERNAL_SERVER_ERROR: - status = ngx_http_v2_indexed(NGX_HTTP_V2_STATUS_500_INDEX); - break; - - default: - status = 0; - } - } - - h2c = stream->connection; - - len = h2c->table_update ? 1 : 0; - - len += status ? 1 : 1 + ngx_http_v2_literal_size("418"); - - clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module); - - if (r->headers_out.server == NULL) { - - if (clcf->server_tokens == NGX_HTTP_SERVER_TOKENS_ON) { - len += 1 + nginx_ver_len; - - } else if (clcf->server_tokens == NGX_HTTP_SERVER_TOKENS_BUILD) { - len += 1 + nginx_ver_build_len; - - } else { - len += 1 + sizeof(nginx); - } - } - - if (r->headers_out.date == NULL) { - len += 1 + ngx_http_v2_literal_size("Wed, 31 Dec 1986 18:00:00 GMT"); - } - - if (r->headers_out.content_type.len) { - len += 1 + NGX_HTTP_V2_INT_OCTETS + r->headers_out.content_type.len; - - if (r->headers_out.content_type_len == r->headers_out.content_type.len - && r->headers_out.charset.len) - { - len += sizeof("; charset=") - 1 + r->headers_out.charset.len; - } - } - - if (r->headers_out.content_length == NULL - && r->headers_out.content_length_n >= 0) - { - len += 1 + ngx_http_v2_integer_octets(NGX_OFF_T_LEN) + NGX_OFF_T_LEN; - } - - if (r->headers_out.last_modified == NULL - && r->headers_out.last_modified_time != -1) - { - len += 1 + ngx_http_v2_literal_size("Wed, 31 Dec 1986 18:00:00 GMT"); - } - - if (r->headers_out.location && r->headers_out.location->value.len) { - - if (r->headers_out.location->value.data[0] == '/' - && clcf->absolute_redirect) - { - if (clcf->server_name_in_redirect) { - cscf = ngx_http_get_module_srv_conf(r, ngx_http_core_module); - host = cscf->server_name; - - } else if (r->headers_in.server.len) { - host = r->headers_in.server; - - } else { - host.len = NGX_SOCKADDR_STRLEN; - host.data = addr; - - if (ngx_connection_local_sockaddr(fc, &host, 0) != NGX_OK) { - return NGX_ERROR; - } - } - - port = ngx_inet_get_port(fc->local_sockaddr); - - location.len = sizeof("https://") - 1 + host.len - + r->headers_out.location->value.len; - - if (clcf->port_in_redirect) { - -#if (NGX_HTTP_SSL) - if (fc->ssl) - port = (port == 443) ? 0 : port; - else -#endif - port = (port == 80) ? 0 : port; - - } else { - port = 0; - } - - if (port) { - location.len += sizeof(":65535") - 1; - } - - location.data = ngx_pnalloc(r->pool, location.len); - if (location.data == NULL) { - return NGX_ERROR; - } - - p = ngx_cpymem(location.data, "http", sizeof("http") - 1); - -#if (NGX_HTTP_SSL) - if (fc->ssl) { - *p++ = 's'; - } -#endif - - *p++ = ':'; *p++ = '/'; *p++ = '/'; - p = ngx_cpymem(p, host.data, host.len); - - if (port) { - p = ngx_sprintf(p, ":%ui", port); - } - - p = ngx_cpymem(p, r->headers_out.location->value.data, - r->headers_out.location->value.len); - - /* update r->headers_out.location->value for possible logging */ - - r->headers_out.location->value.len = p - location.data; - r->headers_out.location->value.data = location.data; - ngx_str_set(&r->headers_out.location->key, "Location"); - } - - r->headers_out.location->hash = 0; - - len += 1 + NGX_HTTP_V2_INT_OCTETS + r->headers_out.location->value.len; - } - - tmp_len = len; - -#if (NGX_HTTP_GZIP) - if (r->gzip_vary) { - if (clcf->gzip_vary) { - len += 1 + sizeof(accept_encoding); - - } else { - r->gzip_vary = 0; - } - } -#endif - - part = &r->headers_out.headers.part; - header = part->elts; - - for (i = 0; /* void */; i++) { - - if (i >= part->nelts) { - if (part->next == NULL) { - break; - } - - part = part->next; - header = part->elts; - i = 0; - } - - if (header[i].hash == 0) { - continue; - } - - if (header[i].key.len > NGX_HTTP_V2_MAX_FIELD) { - ngx_log_error(NGX_LOG_CRIT, fc->log, 0, - "too long response header name: \"%V\"", - &header[i].key); - return NGX_ERROR; - } - - if (header[i].value.len > NGX_HTTP_V2_MAX_FIELD) { - ngx_log_error(NGX_LOG_CRIT, fc->log, 0, - "too long response header value: \"%V: %V\"", - &header[i].key, &header[i].value); - return NGX_ERROR; - } - - len += 1 + NGX_HTTP_V2_INT_OCTETS + header[i].key.len - + NGX_HTTP_V2_INT_OCTETS + header[i].value.len; - - if (header[i].key.len > tmp_len) { - tmp_len = header[i].key.len; - } - - if (header[i].value.len > tmp_len) { - tmp_len = header[i].value.len; - } - } - - tmp = ngx_palloc(r->pool, tmp_len); - pos = ngx_pnalloc(r->pool, len); - - if (pos == NULL || tmp == NULL) { - return NGX_ERROR; - } - - start = pos; - - if (h2c->table_update) { - ngx_log_debug0(NGX_LOG_DEBUG_HTTP, fc->log, 0, - "http2 table size update: 0"); - *pos++ = (1 << 5) | 0; - h2c->table_update = 0; - } - - ngx_log_debug1(NGX_LOG_DEBUG_HTTP, fc->log, 0, - "http2 output header: \":status: %03ui\"", - r->headers_out.status); - - if (status) { - *pos++ = status; - - } else { - *pos++ = ngx_http_v2_inc_indexed(NGX_HTTP_V2_STATUS_INDEX); - *pos++ = NGX_HTTP_V2_ENCODE_RAW | 3; - pos = ngx_sprintf(pos, "%03ui", r->headers_out.status); - } - - if (r->headers_out.server == NULL) { - - if (clcf->server_tokens == NGX_HTTP_SERVER_TOKENS_ON) { - ngx_log_debug1(NGX_LOG_DEBUG_HTTP, fc->log, 0, - "http2 output header: \"server: %s\"", - NGINX_VER); - - } else if (clcf->server_tokens == NGX_HTTP_SERVER_TOKENS_BUILD) { - ngx_log_debug1(NGX_LOG_DEBUG_HTTP, fc->log, 0, - "http2 output header: \"server: %s\"", - NGINX_VER_BUILD); - - } else { - ngx_log_debug0(NGX_LOG_DEBUG_HTTP, fc->log, 0, - "http2 output header: \"server: nginx\""); - } - - *pos++ = ngx_http_v2_inc_indexed(NGX_HTTP_V2_SERVER_INDEX); - - if (clcf->server_tokens == NGX_HTTP_SERVER_TOKENS_ON) { - if (nginx_ver[0] == '\0') { - p = ngx_http_v2_write_value(nginx_ver, (u_char *) NGINX_VER, - sizeof(NGINX_VER) - 1, tmp); - nginx_ver_len = p - nginx_ver; - } - - pos = ngx_cpymem(pos, nginx_ver, nginx_ver_len); - - } else if (clcf->server_tokens == NGX_HTTP_SERVER_TOKENS_BUILD) { - if (nginx_ver_build[0] == '\0') { - p = ngx_http_v2_write_value(nginx_ver_build, - (u_char *) NGINX_VER_BUILD, - sizeof(NGINX_VER_BUILD) - 1, tmp); - nginx_ver_build_len = p - nginx_ver_build; - } - - pos = ngx_cpymem(pos, nginx_ver_build, nginx_ver_build_len); - - } else { - pos = ngx_cpymem(pos, nginx, sizeof(nginx)); - } - } - - if (r->headers_out.date == NULL) { - ngx_log_debug1(NGX_LOG_DEBUG_HTTP, fc->log, 0, - "http2 output header: \"date: %V\"", - &ngx_cached_http_time); - - *pos++ = ngx_http_v2_inc_indexed(NGX_HTTP_V2_DATE_INDEX); - pos = ngx_http_v2_write_value(pos, ngx_cached_http_time.data, - ngx_cached_http_time.len, tmp); - } - - if (r->headers_out.content_type.len) { - *pos++ = ngx_http_v2_inc_indexed(NGX_HTTP_V2_CONTENT_TYPE_INDEX); - - if (r->headers_out.content_type_len == r->headers_out.content_type.len - && r->headers_out.charset.len) - { - len = r->headers_out.content_type.len + sizeof("; charset=") - 1 - + r->headers_out.charset.len; - - p = ngx_pnalloc(r->pool, len); - if (p == NULL) { - return NGX_ERROR; - } - - p = ngx_cpymem(p, r->headers_out.content_type.data, - r->headers_out.content_type.len); - - p = ngx_cpymem(p, "; charset=", sizeof("; charset=") - 1); - - p = ngx_cpymem(p, r->headers_out.charset.data, - r->headers_out.charset.len); - - /* updated r->headers_out.content_type is also needed for logging */ - - r->headers_out.content_type.len = len; - r->headers_out.content_type.data = p - len; - } - - ngx_log_debug1(NGX_LOG_DEBUG_HTTP, fc->log, 0, - "http2 output header: \"content-type: %V\"", - &r->headers_out.content_type); - - pos = ngx_http_v2_write_value(pos, r->headers_out.content_type.data, - r->headers_out.content_type.len, tmp); - } - - if (r->headers_out.content_length == NULL - && r->headers_out.content_length_n >= 0) - { - ngx_log_debug1(NGX_LOG_DEBUG_HTTP, fc->log, 0, - "http2 output header: \"content-length: %O\"", - r->headers_out.content_length_n); - - *pos++ = ngx_http_v2_inc_indexed(NGX_HTTP_V2_CONTENT_LENGTH_INDEX); - - p = pos; - pos = ngx_sprintf(pos + 1, "%O", r->headers_out.content_length_n); - *p = NGX_HTTP_V2_ENCODE_RAW | (u_char) (pos - p - 1); - } - - if (r->headers_out.last_modified == NULL - && r->headers_out.last_modified_time != -1) - { - *pos++ = ngx_http_v2_inc_indexed(NGX_HTTP_V2_LAST_MODIFIED_INDEX); - - ngx_http_time(pos, r->headers_out.last_modified_time); - len = sizeof("Wed, 31 Dec 1986 18:00:00 GMT") - 1; - - ngx_log_debug2(NGX_LOG_DEBUG_HTTP, fc->log, 0, - "http2 output header: \"last-modified: %*s\"", - len, pos); - - /* - * Date will always be encoded using huffman in the temporary buffer, - * so it's safe here to use src and dst pointing to the same address. - */ - pos = ngx_http_v2_write_value(pos, pos, len, tmp); - } - - if (r->headers_out.location && r->headers_out.location->value.len) { - ngx_log_debug1(NGX_LOG_DEBUG_HTTP, fc->log, 0, - "http2 output header: \"location: %V\"", - &r->headers_out.location->value); - - *pos++ = ngx_http_v2_inc_indexed(NGX_HTTP_V2_LOCATION_INDEX); - pos = ngx_http_v2_write_value(pos, r->headers_out.location->value.data, - r->headers_out.location->value.len, tmp); - } - -#if (NGX_HTTP_GZIP) - if (r->gzip_vary) { - ngx_log_debug0(NGX_LOG_DEBUG_HTTP, fc->log, 0, - "http2 output header: \"vary: Accept-Encoding\""); - - *pos++ = ngx_http_v2_inc_indexed(NGX_HTTP_V2_VARY_INDEX); - pos = ngx_cpymem(pos, accept_encoding, sizeof(accept_encoding)); - } -#endif - - part = &r->headers_out.headers.part; - header = part->elts; - - for (i = 0; /* void */; i++) { - - if (i >= part->nelts) { - if (part->next == NULL) { - break; - } - - part = part->next; - header = part->elts; - i = 0; - } - - if (header[i].hash == 0) { - continue; - } - -#if (NGX_DEBUG) - if (fc->log->log_level & NGX_LOG_DEBUG_HTTP) { - ngx_strlow(tmp, header[i].key.data, header[i].key.len); - - ngx_log_debug3(NGX_LOG_DEBUG_HTTP, fc->log, 0, - "http2 output header: \"%*s: %V\"", - header[i].key.len, tmp, &header[i].value); - } -#endif - - *pos++ = 0; - - pos = ngx_http_v2_write_name(pos, header[i].key.data, - header[i].key.len, tmp); - - pos = ngx_http_v2_write_value(pos, header[i].value.data, - header[i].value.len, tmp); - } - - fin = r->header_only - || (r->headers_out.content_length_n == 0 && !r->expect_trailers); - - frame = ngx_http_v2_create_headers_frame(r, start, pos, fin, 0); - if (frame == NULL) { - return NGX_ERROR; - } - - ngx_http_v2_queue_blocked_frame(h2c, frame); - - stream->queued++; - - if (ngx_http_v2_init_stream(r) != NGX_OK) { - return NGX_ERROR; - } - - return ngx_http_v2_filter_send(fc, stream); -} - - -static ngx_int_t -ngx_http_v2_early_hints_filter(ngx_http_request_t *r) -{ - u_char *pos, *start, *tmp; - size_t len, tmp_len; - ngx_uint_t i; - ngx_list_part_t *part; - ngx_table_elt_t *header; - ngx_connection_t *fc; - ngx_http_v2_stream_t *stream; - ngx_http_v2_out_frame_t *frame; - ngx_http_v2_connection_t *h2c; - - stream = r->stream; - - if (!stream) { - return ngx_http_next_early_hints_filter(r); - } - - if (r != r->main) { - return NGX_OK; - } - - fc = r->connection; - - if (fc->error) { - return NGX_ERROR; - } - - len = 0; - tmp_len = 0; - - part = &r->headers_out.headers.part; - header = part->elts; - - for (i = 0; /* void */; i++) { - - if (i >= part->nelts) { - if (part->next == NULL) { - break; - } - - part = part->next; - header = part->elts; - i = 0; - } - - if (header[i].hash == 0) { - continue; - } - - if (header[i].key.len > NGX_HTTP_V2_MAX_FIELD) { - ngx_log_error(NGX_LOG_CRIT, fc->log, 0, - "too long response header name: \"%V\"", - &header[i].key); - return NGX_ERROR; - } - - if (header[i].value.len > NGX_HTTP_V2_MAX_FIELD) { - ngx_log_error(NGX_LOG_CRIT, fc->log, 0, - "too long response header value: \"%V: %V\"", - &header[i].key, &header[i].value); - return NGX_ERROR; - } - - len += 1 + NGX_HTTP_V2_INT_OCTETS + header[i].key.len - + NGX_HTTP_V2_INT_OCTETS + header[i].value.len; - - if (header[i].key.len > tmp_len) { - tmp_len = header[i].key.len; - } - - if (header[i].value.len > tmp_len) { - tmp_len = header[i].value.len; - } - } - - if (len == 0) { - return NGX_OK; - } - - h2c = stream->connection; - - len += h2c->table_update ? 1 : 0; - len += 1 + ngx_http_v2_literal_size("418"); - - tmp = ngx_palloc(r->pool, tmp_len); - pos = ngx_pnalloc(r->pool, len); - - if (pos == NULL || tmp == NULL) { - return NGX_ERROR; - } - - start = pos; - - if (h2c->table_update) { - ngx_log_debug0(NGX_LOG_DEBUG_HTTP, fc->log, 0, - "http2 table size update: 0"); - *pos++ = (1 << 5) | 0; - h2c->table_update = 0; - } - - ngx_log_debug1(NGX_LOG_DEBUG_HTTP, fc->log, 0, - "http2 output header: \":status: %03ui\"", - (ngx_uint_t) NGX_HTTP_EARLY_HINTS); - - *pos++ = ngx_http_v2_inc_indexed(NGX_HTTP_V2_STATUS_INDEX); - *pos++ = NGX_HTTP_V2_ENCODE_RAW | 3; - pos = ngx_sprintf(pos, "%03ui", (ngx_uint_t) NGX_HTTP_EARLY_HINTS); - - part = &r->headers_out.headers.part; - header = part->elts; - - for (i = 0; /* void */; i++) { - - if (i >= part->nelts) { - if (part->next == NULL) { - break; - } - - part = part->next; - header = part->elts; - i = 0; - } - - if (header[i].hash == 0) { - continue; - } - -#if (NGX_DEBUG) - if (fc->log->log_level & NGX_LOG_DEBUG_HTTP) { - ngx_strlow(tmp, header[i].key.data, header[i].key.len); - - ngx_log_debug3(NGX_LOG_DEBUG_HTTP, fc->log, 0, - "http2 output header: \"%*s: %V\"", - header[i].key.len, tmp, &header[i].value); - } -#endif - - *pos++ = 0; - - pos = ngx_http_v2_write_name(pos, header[i].key.data, - header[i].key.len, tmp); - - pos = ngx_http_v2_write_value(pos, header[i].value.data, - header[i].value.len, tmp); - } - - frame = ngx_http_v2_create_headers_frame(r, start, pos, 0, 1); - if (frame == NULL) { - return NGX_ERROR; - } - - ngx_http_v2_queue_blocked_frame(h2c, frame); - - stream->queued++; - - if (ngx_http_v2_init_stream(r) != NGX_OK) { - return NGX_ERROR; - } - - return ngx_http_v2_filter_send(fc, stream); -} - - -static ngx_int_t -ngx_http_v2_init_stream(ngx_http_request_t *r) -{ - ngx_connection_t *fc; - ngx_http_cleanup_t *cln; - ngx_http_v2_stream_t *stream; - - stream = r->stream; - fc = r->connection; - - if (stream->initialized) { - return NGX_OK; - } - - stream->initialized = 1; - - cln = ngx_http_cleanup_add(r, 0); - if (cln == NULL) { - return NGX_ERROR; - } - - cln->handler = ngx_http_v2_filter_cleanup; - cln->data = stream; - - fc->send_chain = ngx_http_v2_send_chain; - fc->need_last_buf = 1; - fc->need_flush_buf = 1; - - return NGX_OK; -} - - -static ngx_http_v2_out_frame_t * -ngx_http_v2_create_headers_frame(ngx_http_request_t *r, u_char *pos, - u_char *end, ngx_uint_t fin, ngx_uint_t flush) -{ - u_char type, flags; - size_t rest, frame_size; - ngx_buf_t *b; - ngx_chain_t *cl, **ll; - ngx_http_v2_stream_t *stream; - ngx_http_v2_out_frame_t *frame; - - stream = r->stream; - rest = end - pos; - - frame = ngx_palloc(r->pool, sizeof(ngx_http_v2_out_frame_t)); - if (frame == NULL) { - return NULL; - } - - frame->handler = ngx_http_v2_headers_frame_handler; - frame->stream = stream; - frame->length = rest; - frame->blocked = 1; - frame->fin = fin; - - ll = &frame->first; - - type = NGX_HTTP_V2_HEADERS_FRAME; - flags = fin ? NGX_HTTP_V2_END_STREAM_FLAG : NGX_HTTP_V2_NO_FLAG; - frame_size = stream->connection->frame_size; - - for ( ;; ) { - if (rest <= frame_size) { - frame_size = rest; - flags |= NGX_HTTP_V2_END_HEADERS_FLAG; - } - - b = ngx_create_temp_buf(r->pool, NGX_HTTP_V2_FRAME_HEADER_SIZE); - if (b == NULL) { - return NULL; - } - - b->last = ngx_http_v2_write_len_and_type(b->last, frame_size, type); - *b->last++ = flags; - b->last = ngx_http_v2_write_sid(b->last, stream->node->id); - - b->tag = (ngx_buf_tag_t) &ngx_http_v2_module; - - cl = ngx_alloc_chain_link(r->pool); - if (cl == NULL) { - return NULL; - } - - cl->buf = b; - - *ll = cl; - ll = &cl->next; - - b = ngx_calloc_buf(r->pool); - if (b == NULL) { - return NULL; - } - - b->pos = pos; - - pos += frame_size; - - b->last = pos; - b->start = b->pos; - b->end = b->last; - b->temporary = 1; - - cl = ngx_alloc_chain_link(r->pool); - if (cl == NULL) { - return NULL; - } - - cl->buf = b; - - *ll = cl; - ll = &cl->next; - - rest -= frame_size; - - if (rest) { - frame->length += NGX_HTTP_V2_FRAME_HEADER_SIZE; - - type = NGX_HTTP_V2_CONTINUATION_FRAME; - flags = NGX_HTTP_V2_NO_FLAG; - continue; - } - - b->last_buf = fin; - b->flush = flush; - cl->next = NULL; - frame->last = cl; - - ngx_log_debug4(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "http2:%ui create HEADERS frame %p: len:%uz fin:%ui", - stream->node->id, frame, frame->length, fin); - - return frame; - } -} - - -static ngx_http_v2_out_frame_t * -ngx_http_v2_create_trailers_frame(ngx_http_request_t *r) -{ - u_char *pos, *start, *tmp; - size_t len, tmp_len; - ngx_uint_t i; - ngx_list_part_t *part; - ngx_table_elt_t *header; - ngx_connection_t *fc; - - fc = r->connection; - len = 0; - tmp_len = 0; - - part = &r->headers_out.trailers.part; - header = part->elts; - - for (i = 0; /* void */; i++) { - - if (i >= part->nelts) { - if (part->next == NULL) { - break; - } - - part = part->next; - header = part->elts; - i = 0; - } - - if (header[i].hash == 0) { - continue; - } - - if (header[i].key.len > NGX_HTTP_V2_MAX_FIELD) { - ngx_log_error(NGX_LOG_CRIT, fc->log, 0, - "too long response trailer name: \"%V\"", - &header[i].key); - return NULL; - } - - if (header[i].value.len > NGX_HTTP_V2_MAX_FIELD) { - ngx_log_error(NGX_LOG_CRIT, fc->log, 0, - "too long response trailer value: \"%V: %V\"", - &header[i].key, &header[i].value); - return NULL; - } - - len += 1 + NGX_HTTP_V2_INT_OCTETS + header[i].key.len - + NGX_HTTP_V2_INT_OCTETS + header[i].value.len; - - if (header[i].key.len > tmp_len) { - tmp_len = header[i].key.len; - } - - if (header[i].value.len > tmp_len) { - tmp_len = header[i].value.len; - } - } - - if (len == 0) { - return NGX_HTTP_V2_NO_TRAILERS; - } - - tmp = ngx_palloc(r->pool, tmp_len); - pos = ngx_pnalloc(r->pool, len); - - if (pos == NULL || tmp == NULL) { - return NULL; - } - - start = pos; - - part = &r->headers_out.trailers.part; - header = part->elts; - - for (i = 0; /* void */; i++) { - - if (i >= part->nelts) { - if (part->next == NULL) { - break; - } - - part = part->next; - header = part->elts; - i = 0; - } - - if (header[i].hash == 0) { - continue; - } - -#if (NGX_DEBUG) - if (fc->log->log_level & NGX_LOG_DEBUG_HTTP) { - ngx_strlow(tmp, header[i].key.data, header[i].key.len); - - ngx_log_debug3(NGX_LOG_DEBUG_HTTP, fc->log, 0, - "http2 output trailer: \"%*s: %V\"", - header[i].key.len, tmp, &header[i].value); - } -#endif - - *pos++ = 0; - - pos = ngx_http_v2_write_name(pos, header[i].key.data, - header[i].key.len, tmp); - - pos = ngx_http_v2_write_value(pos, header[i].value.data, - header[i].value.len, tmp); - } - - return ngx_http_v2_create_headers_frame(r, start, pos, 1, 0); -} - - -static ngx_chain_t * -ngx_http_v2_send_chain(ngx_connection_t *fc, ngx_chain_t *in, off_t limit) -{ - off_t size, offset; - size_t rest, frame_size; - ngx_chain_t *cl, *out, **ln; - ngx_http_request_t *r; - ngx_http_v2_stream_t *stream; - ngx_http_v2_loc_conf_t *h2lcf; - ngx_http_v2_out_frame_t *frame, *trailers; - ngx_http_v2_connection_t *h2c; - - r = fc->data; - stream = r->stream; - -#if (NGX_SUPPRESS_WARN) - size = 0; -#endif - - ngx_log_debug1(NGX_LOG_DEBUG_HTTP, fc->log, 0, - "http2 send chain: %p", in); - - while (in) { - size = ngx_buf_size(in->buf); - - if (size || in->buf->last_buf) { - break; - } - - in = in->next; - } - - if (in == NULL || stream->out_closed) { - - if (size) { - ngx_log_error(NGX_LOG_ERR, fc->log, 0, - "output on closed stream"); - return NGX_CHAIN_ERROR; - } - - if (ngx_http_v2_filter_send(fc, stream) == NGX_ERROR) { - return NGX_CHAIN_ERROR; - } - - return NULL; - } - - h2c = stream->connection; - - if (size && ngx_http_v2_flow_control(h2c, stream) == NGX_DECLINED) { - - if (ngx_http_v2_filter_send(fc, stream) == NGX_ERROR) { - return NGX_CHAIN_ERROR; - } - - if (ngx_http_v2_flow_control(h2c, stream) == NGX_DECLINED) { - fc->write->active = 1; - fc->write->ready = 0; - return in; - } - } - - if (in->buf->tag == (ngx_buf_tag_t) &ngx_http_v2_filter_get_shadow) { - cl = ngx_alloc_chain_link(r->pool); - if (cl == NULL) { - return NGX_CHAIN_ERROR; - } - - cl->buf = in->buf; - in->buf = cl->buf->shadow; - - offset = ngx_buf_in_memory(in->buf) - ? (cl->buf->pos - in->buf->pos) - : (cl->buf->file_pos - in->buf->file_pos); - - cl->next = stream->free_bufs; - stream->free_bufs = cl; - - } else { - offset = 0; - } - - if (limit == 0 || limit > (off_t) h2c->send_window) { - limit = h2c->send_window; - } - - if (limit > stream->send_window) { - limit = (stream->send_window > 0) ? stream->send_window : 0; - } - - h2lcf = ngx_http_get_module_loc_conf(r, ngx_http_v2_module); - - frame_size = (h2lcf->chunk_size < h2c->frame_size) - ? h2lcf->chunk_size : h2c->frame_size; - - trailers = NGX_HTTP_V2_NO_TRAILERS; - -#if (NGX_SUPPRESS_WARN) - cl = NULL; -#endif - - for ( ;; ) { - if ((off_t) frame_size > limit) { - frame_size = (size_t) limit; - } - - ln = &out; - rest = frame_size; - - while ((off_t) rest >= size) { - - if (offset) { - cl = ngx_http_v2_filter_get_shadow(stream, in->buf, - offset, size); - if (cl == NULL) { - return NGX_CHAIN_ERROR; - } - - offset = 0; - - } else { - cl = ngx_alloc_chain_link(r->pool); - if (cl == NULL) { - return NGX_CHAIN_ERROR; - } - - cl->buf = in->buf; - } - - *ln = cl; - ln = &cl->next; - - rest -= (size_t) size; - in = in->next; - - if (in == NULL) { - frame_size -= rest; - rest = 0; - break; - } - - size = ngx_buf_size(in->buf); - } - - if (rest) { - cl = ngx_http_v2_filter_get_shadow(stream, in->buf, offset, rest); - if (cl == NULL) { - return NGX_CHAIN_ERROR; - } - - cl->buf->flush = 0; - cl->buf->last_buf = 0; - - *ln = cl; - - offset += rest; - size -= rest; - } - - if (cl->buf->last_buf) { - trailers = ngx_http_v2_create_trailers_frame(r); - if (trailers == NULL) { - return NGX_CHAIN_ERROR; - } - - if (trailers != NGX_HTTP_V2_NO_TRAILERS) { - cl->buf->last_buf = 0; - } - } - - if (frame_size || cl->buf->last_buf) { - frame = ngx_http_v2_filter_get_data_frame(stream, frame_size, - out, cl); - if (frame == NULL) { - return NGX_CHAIN_ERROR; - } - - ngx_http_v2_queue_frame(h2c, frame); - - h2c->send_window -= frame_size; - - stream->send_window -= frame_size; - stream->queued++; - } - - if (in == NULL) { - - if (trailers != NGX_HTTP_V2_NO_TRAILERS) { - ngx_http_v2_queue_frame(h2c, trailers); - stream->queued++; - } - - break; - } - - limit -= frame_size; - - if (limit == 0) { - break; - } - } - - if (offset) { - cl = ngx_http_v2_filter_get_shadow(stream, in->buf, offset, size); - if (cl == NULL) { - return NGX_CHAIN_ERROR; - } - - in->buf = cl->buf; - ngx_free_chain(r->pool, cl); - } - - if (ngx_http_v2_filter_send(fc, stream) == NGX_ERROR) { - return NGX_CHAIN_ERROR; - } - - if (in && ngx_http_v2_flow_control(h2c, stream) == NGX_DECLINED) { - fc->write->active = 1; - fc->write->ready = 0; - } - - return in; -} - - -static ngx_chain_t * -ngx_http_v2_filter_get_shadow(ngx_http_v2_stream_t *stream, ngx_buf_t *buf, - off_t offset, off_t size) -{ - ngx_buf_t *chunk; - ngx_chain_t *cl; - - cl = ngx_chain_get_free_buf(stream->request->pool, &stream->free_bufs); - if (cl == NULL) { - return NULL; - } - - chunk = cl->buf; - - ngx_memcpy(chunk, buf, sizeof(ngx_buf_t)); - - chunk->tag = (ngx_buf_tag_t) &ngx_http_v2_filter_get_shadow; - chunk->shadow = buf; - - if (ngx_buf_in_memory(chunk)) { - chunk->pos += offset; - chunk->last = chunk->pos + size; - } - - if (chunk->in_file) { - chunk->file_pos += offset; - chunk->file_last = chunk->file_pos + size; - } - - return cl; -} - - -static ngx_http_v2_out_frame_t * -ngx_http_v2_filter_get_data_frame(ngx_http_v2_stream_t *stream, - size_t len, ngx_chain_t *first, ngx_chain_t *last) -{ - u_char flags; - ngx_buf_t *buf; - ngx_chain_t *cl; - ngx_http_v2_out_frame_t *frame; - ngx_http_v2_connection_t *h2c; - - frame = stream->free_frames; - h2c = stream->connection; - - if (frame) { - stream->free_frames = frame->next; - - } else if (h2c->frames < 10000) { - frame = ngx_palloc(stream->request->pool, - sizeof(ngx_http_v2_out_frame_t)); - if (frame == NULL) { - return NULL; - } - - stream->frames++; - h2c->frames++; - - } else { - ngx_log_error(NGX_LOG_INFO, h2c->connection->log, 0, - "http2 flood detected"); - - h2c->connection->error = 1; - return NULL; - } - - flags = last->buf->last_buf ? NGX_HTTP_V2_END_STREAM_FLAG : 0; - - ngx_log_debug4(NGX_LOG_DEBUG_HTTP, stream->request->connection->log, 0, - "http2:%ui create DATA frame %p: len:%uz flags:%ui", - stream->node->id, frame, len, (ngx_uint_t) flags); - - cl = ngx_chain_get_free_buf(stream->request->pool, - &stream->free_frame_headers); - if (cl == NULL) { - return NULL; - } - - buf = cl->buf; - - if (buf->start == NULL) { - buf->start = ngx_palloc(stream->request->pool, - NGX_HTTP_V2_FRAME_HEADER_SIZE); - if (buf->start == NULL) { - return NULL; - } - - buf->end = buf->start + NGX_HTTP_V2_FRAME_HEADER_SIZE; - buf->last = buf->end; - - buf->tag = (ngx_buf_tag_t) &ngx_http_v2_module; - buf->memory = 1; - } - - buf->pos = buf->start; - buf->last = buf->pos; - - buf->last = ngx_http_v2_write_len_and_type(buf->last, len, - NGX_HTTP_V2_DATA_FRAME); - *buf->last++ = flags; - - buf->last = ngx_http_v2_write_sid(buf->last, stream->node->id); - - cl->next = first; - first = cl; - - last->buf->flush = 1; - - frame->first = first; - frame->last = last; - frame->handler = ngx_http_v2_data_frame_handler; - frame->stream = stream; - frame->length = len; - frame->blocked = 0; - frame->fin = last->buf->last_buf; - - return frame; -} - - -static ngx_inline ngx_int_t -ngx_http_v2_flow_control(ngx_http_v2_connection_t *h2c, - ngx_http_v2_stream_t *stream) -{ - ngx_log_debug3(NGX_LOG_DEBUG_HTTP, h2c->connection->log, 0, - "http2:%ui windows: conn:%uz stream:%z", - stream->node->id, h2c->send_window, stream->send_window); - - if (stream->send_window <= 0) { - stream->exhausted = 1; - return NGX_DECLINED; - } - - if (h2c->send_window == 0) { - ngx_http_v2_waiting_queue(h2c, stream); - return NGX_DECLINED; - } - - return NGX_OK; -} - - -static void -ngx_http_v2_waiting_queue(ngx_http_v2_connection_t *h2c, - ngx_http_v2_stream_t *stream) -{ - ngx_queue_t *q; - ngx_http_v2_stream_t *s; - - if (stream->waiting) { - return; - } - - stream->waiting = 1; - - for (q = ngx_queue_last(&h2c->waiting); - q != ngx_queue_sentinel(&h2c->waiting); - q = ngx_queue_prev(q)) - { - s = ngx_queue_data(q, ngx_http_v2_stream_t, queue); - - if (s->node->rank < stream->node->rank - || (s->node->rank == stream->node->rank - && s->node->rel_weight >= stream->node->rel_weight)) - { - break; - } - } - - ngx_queue_insert_after(q, &stream->queue); -} - - -static ngx_inline ngx_int_t -ngx_http_v2_filter_send(ngx_connection_t *fc, ngx_http_v2_stream_t *stream) -{ - ngx_connection_t *c; - - c = stream->connection->connection; - - if (stream->queued == 0 && !c->buffered) { - fc->buffered &= ~NGX_HTTP_V2_BUFFERED; - return NGX_OK; - } - - stream->blocked = 1; - - if (ngx_http_v2_send_output_queue(stream->connection) == NGX_ERROR) { - fc->error = 1; - return NGX_ERROR; - } - - stream->blocked = 0; - - if (stream->queued) { - fc->buffered |= NGX_HTTP_V2_BUFFERED; - fc->write->active = 1; - fc->write->ready = 0; - return NGX_AGAIN; - } - - fc->buffered &= ~NGX_HTTP_V2_BUFFERED; - - return NGX_OK; -} - - -static ngx_int_t -ngx_http_v2_headers_frame_handler(ngx_http_v2_connection_t *h2c, - ngx_http_v2_out_frame_t *frame) -{ - ngx_chain_t *cl, *ln; - ngx_http_v2_stream_t *stream; - - stream = frame->stream; - cl = frame->first; - - for ( ;; ) { - if (cl->buf->pos != cl->buf->last) { - frame->first = cl; - - ngx_log_debug2(NGX_LOG_DEBUG_HTTP, h2c->connection->log, 0, - "http2:%ui HEADERS frame %p was sent partially", - stream->node->id, frame); - - return NGX_AGAIN; - } - - ln = cl->next; - - if (cl->buf->tag == (ngx_buf_tag_t) &ngx_http_v2_module) { - cl->next = stream->free_frame_headers; - stream->free_frame_headers = cl; - - } else { - cl->next = stream->free_bufs; - stream->free_bufs = cl; - } - - if (cl == frame->last) { - break; - } - - cl = ln; - } - - ngx_log_debug2(NGX_LOG_DEBUG_HTTP, h2c->connection->log, 0, - "http2:%ui HEADERS frame %p was sent", - stream->node->id, frame); - - stream->request->header_size += NGX_HTTP_V2_FRAME_HEADER_SIZE - + frame->length; - - h2c->payload_bytes += frame->length; - - ngx_http_v2_handle_frame(stream, frame); - - ngx_http_v2_handle_stream(h2c, stream); - - return NGX_OK; -} - - -static ngx_int_t -ngx_http_v2_data_frame_handler(ngx_http_v2_connection_t *h2c, - ngx_http_v2_out_frame_t *frame) -{ - ngx_buf_t *buf; - ngx_chain_t *cl, *ln; - ngx_http_v2_stream_t *stream; - - stream = frame->stream; - cl = frame->first; - - if (cl->buf->tag == (ngx_buf_tag_t) &ngx_http_v2_module) { - - if (cl->buf->pos != cl->buf->last) { - ngx_log_debug2(NGX_LOG_DEBUG_HTTP, h2c->connection->log, 0, - "http2:%ui DATA frame %p was sent partially", - stream->node->id, frame); - - return NGX_AGAIN; - } - - ln = cl->next; - - cl->next = stream->free_frame_headers; - stream->free_frame_headers = cl; - - if (cl == frame->last) { - goto done; - } - - cl = ln; - } - - for ( ;; ) { - if (cl->buf->tag == (ngx_buf_tag_t) &ngx_http_v2_filter_get_shadow) { - buf = cl->buf->shadow; - - if (ngx_buf_in_memory(buf)) { - buf->pos = cl->buf->pos; - } - - if (buf->in_file) { - buf->file_pos = cl->buf->file_pos; - } - } - - if (ngx_buf_size(cl->buf) != 0) { - - if (cl != frame->first) { - frame->first = cl; - ngx_http_v2_handle_stream(h2c, stream); - } - - ngx_log_debug2(NGX_LOG_DEBUG_HTTP, h2c->connection->log, 0, - "http2:%ui DATA frame %p was sent partially", - stream->node->id, frame); - - return NGX_AGAIN; - } - - ln = cl->next; - - if (cl->buf->tag == (ngx_buf_tag_t) &ngx_http_v2_filter_get_shadow) { - cl->next = stream->free_bufs; - stream->free_bufs = cl; - - } else { - ngx_free_chain(stream->request->pool, cl); - } - - if (cl == frame->last) { - goto done; - } - - cl = ln; - } - -done: - - ngx_log_debug2(NGX_LOG_DEBUG_HTTP, h2c->connection->log, 0, - "http2:%ui DATA frame %p was sent", - stream->node->id, frame); - - stream->request->header_size += NGX_HTTP_V2_FRAME_HEADER_SIZE; - - h2c->payload_bytes += frame->length; - - ngx_http_v2_handle_frame(stream, frame); - - ngx_http_v2_handle_stream(h2c, stream); - - return NGX_OK; -} - - -static ngx_inline void -ngx_http_v2_handle_frame(ngx_http_v2_stream_t *stream, - ngx_http_v2_out_frame_t *frame) -{ - ngx_http_request_t *r; - ngx_http_v2_connection_t *h2c; - - r = stream->request; - - r->connection->sent += NGX_HTTP_V2_FRAME_HEADER_SIZE + frame->length; - - h2c = stream->connection; - - h2c->total_bytes += NGX_HTTP_V2_FRAME_HEADER_SIZE + frame->length; - - if (frame->fin) { - stream->out_closed = 1; - } - - frame->next = stream->free_frames; - stream->free_frames = frame; - - stream->queued--; -} - - -static ngx_inline void -ngx_http_v2_handle_stream(ngx_http_v2_connection_t *h2c, - ngx_http_v2_stream_t *stream) -{ - ngx_event_t *wev; - ngx_connection_t *fc; - - if (stream->waiting || stream->blocked) { - return; - } - - fc = stream->request->connection; - - if (!fc->error && stream->exhausted) { - return; - } - - wev = fc->write; - - wev->active = 0; - wev->ready = 1; - - if (!fc->error && wev->delayed) { - return; - } - - ngx_post_event(wev, &ngx_posted_events); -} - - -static void -ngx_http_v2_filter_cleanup(void *data) -{ - ngx_http_v2_stream_t *stream = data; - - size_t window; - ngx_event_t *wev; - ngx_queue_t *q; - ngx_http_v2_out_frame_t *frame, **fn; - ngx_http_v2_connection_t *h2c; - - if (stream->waiting) { - stream->waiting = 0; - ngx_queue_remove(&stream->queue); - } - - if (stream->queued == 0) { - return; - } - - window = 0; - h2c = stream->connection; - fn = &h2c->last_out; - - for ( ;; ) { - frame = *fn; - - if (frame == NULL) { - break; - } - - if (frame->stream == stream && !frame->blocked) { - *fn = frame->next; - - window += frame->length; - - if (--stream->queued == 0) { - break; - } - - continue; - } - - fn = &frame->next; - } - - if (h2c->send_window == 0 && window) { - - while (!ngx_queue_empty(&h2c->waiting)) { - q = ngx_queue_head(&h2c->waiting); - - ngx_queue_remove(q); - - stream = ngx_queue_data(q, ngx_http_v2_stream_t, queue); - - stream->waiting = 0; - - wev = stream->request->connection->write; - - wev->active = 0; - wev->ready = 1; - - if (!wev->delayed) { - ngx_post_event(wev, &ngx_posted_events); - } - } - } - - h2c->send_window += window; -} - - -static ngx_int_t -ngx_http_v2_filter_init(ngx_conf_t *cf) -{ - ngx_http_next_header_filter = ngx_http_top_header_filter; - ngx_http_top_header_filter = ngx_http_v2_header_filter; - - ngx_http_next_early_hints_filter = ngx_http_top_early_hints_filter; - ngx_http_top_early_hints_filter = ngx_http_v2_early_hints_filter; - - return NGX_OK; -} diff --git a/src/deps/src/nginx-1.30.3/src/http/v2/ngx_http_v2_module.c b/src/deps/src/nginx-1.30.3/src/http/v2/ngx_http_v2_module.c deleted file mode 100644 index d64488c20b..0000000000 --- a/src/deps/src/nginx-1.30.3/src/http/v2/ngx_http_v2_module.c +++ /dev/null @@ -1,498 +0,0 @@ - -/* - * Copyright (C) Nginx, Inc. - * Copyright (C) Valentin V. Bartenev - */ - - -#include -#include -#include -#include - - -static ngx_int_t ngx_http_v2_add_variables(ngx_conf_t *cf); - -static ngx_int_t ngx_http_v2_variable(ngx_http_request_t *r, - ngx_http_variable_value_t *v, uintptr_t data); - -static ngx_int_t ngx_http_v2_module_init(ngx_cycle_t *cycle); - -static void *ngx_http_v2_create_main_conf(ngx_conf_t *cf); -static char *ngx_http_v2_init_main_conf(ngx_conf_t *cf, void *conf); -static void *ngx_http_v2_create_srv_conf(ngx_conf_t *cf); -static char *ngx_http_v2_merge_srv_conf(ngx_conf_t *cf, void *parent, - void *child); -static void *ngx_http_v2_create_loc_conf(ngx_conf_t *cf); -static char *ngx_http_v2_merge_loc_conf(ngx_conf_t *cf, void *parent, - void *child); - -static char *ngx_http_v2_recv_buffer_size(ngx_conf_t *cf, void *post, - void *data); -static char *ngx_http_v2_pool_size(ngx_conf_t *cf, void *post, void *data); -static char *ngx_http_v2_preread_size(ngx_conf_t *cf, void *post, void *data); -static char *ngx_http_v2_streams_index_mask(ngx_conf_t *cf, void *post, - void *data); -static char *ngx_http_v2_chunk_size(ngx_conf_t *cf, void *post, void *data); -static char *ngx_http_v2_obsolete(ngx_conf_t *cf, ngx_command_t *cmd, - void *conf); - - -static ngx_conf_deprecated_t ngx_http_v2_recv_timeout_deprecated = { - ngx_conf_deprecated, "http2_recv_timeout", "client_header_timeout" -}; - -static ngx_conf_deprecated_t ngx_http_v2_idle_timeout_deprecated = { - ngx_conf_deprecated, "http2_idle_timeout", "keepalive_timeout" -}; - -static ngx_conf_deprecated_t ngx_http_v2_max_requests_deprecated = { - ngx_conf_deprecated, "http2_max_requests", "keepalive_requests" -}; - -static ngx_conf_deprecated_t ngx_http_v2_max_field_size_deprecated = { - ngx_conf_deprecated, "http2_max_field_size", "large_client_header_buffers" -}; - -static ngx_conf_deprecated_t ngx_http_v2_max_header_size_deprecated = { - ngx_conf_deprecated, "http2_max_header_size", "large_client_header_buffers" -}; - - -static ngx_conf_post_t ngx_http_v2_recv_buffer_size_post = - { ngx_http_v2_recv_buffer_size }; -static ngx_conf_post_t ngx_http_v2_pool_size_post = - { ngx_http_v2_pool_size }; -static ngx_conf_post_t ngx_http_v2_preread_size_post = - { ngx_http_v2_preread_size }; -static ngx_conf_post_t ngx_http_v2_streams_index_mask_post = - { ngx_http_v2_streams_index_mask }; -static ngx_conf_post_t ngx_http_v2_chunk_size_post = - { ngx_http_v2_chunk_size }; - - -static ngx_command_t ngx_http_v2_commands[] = { - - { ngx_string("http2"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_FLAG, - ngx_conf_set_flag_slot, - NGX_HTTP_SRV_CONF_OFFSET, - offsetof(ngx_http_v2_srv_conf_t, enable), - NULL }, - - { ngx_string("http2_recv_buffer_size"), - NGX_HTTP_MAIN_CONF|NGX_CONF_TAKE1, - ngx_conf_set_size_slot, - NGX_HTTP_MAIN_CONF_OFFSET, - offsetof(ngx_http_v2_main_conf_t, recv_buffer_size), - &ngx_http_v2_recv_buffer_size_post }, - - { ngx_string("http2_pool_size"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_TAKE1, - ngx_conf_set_size_slot, - NGX_HTTP_SRV_CONF_OFFSET, - offsetof(ngx_http_v2_srv_conf_t, pool_size), - &ngx_http_v2_pool_size_post }, - - { ngx_string("http2_max_concurrent_streams"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_TAKE1, - ngx_conf_set_num_slot, - NGX_HTTP_SRV_CONF_OFFSET, - offsetof(ngx_http_v2_srv_conf_t, concurrent_streams), - NULL }, - - { ngx_string("http2_max_concurrent_pushes"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_TAKE1, - ngx_http_v2_obsolete, - 0, - 0, - NULL }, - - { ngx_string("http2_max_requests"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_TAKE1, - ngx_http_v2_obsolete, - 0, - 0, - &ngx_http_v2_max_requests_deprecated }, - - { ngx_string("http2_max_field_size"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_TAKE1, - ngx_http_v2_obsolete, - 0, - 0, - &ngx_http_v2_max_field_size_deprecated }, - - { ngx_string("http2_max_header_size"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_TAKE1, - ngx_http_v2_obsolete, - 0, - 0, - &ngx_http_v2_max_header_size_deprecated }, - - { ngx_string("http2_body_preread_size"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_TAKE1, - ngx_conf_set_size_slot, - NGX_HTTP_SRV_CONF_OFFSET, - offsetof(ngx_http_v2_srv_conf_t, preread_size), - &ngx_http_v2_preread_size_post }, - - { ngx_string("http2_streams_index_size"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_TAKE1, - ngx_conf_set_num_slot, - NGX_HTTP_SRV_CONF_OFFSET, - offsetof(ngx_http_v2_srv_conf_t, streams_index_mask), - &ngx_http_v2_streams_index_mask_post }, - - { ngx_string("http2_recv_timeout"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_TAKE1, - ngx_http_v2_obsolete, - 0, - 0, - &ngx_http_v2_recv_timeout_deprecated }, - - { ngx_string("http2_idle_timeout"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_TAKE1, - ngx_http_v2_obsolete, - 0, - 0, - &ngx_http_v2_idle_timeout_deprecated }, - - { ngx_string("http2_chunk_size"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1, - ngx_conf_set_size_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_v2_loc_conf_t, chunk_size), - &ngx_http_v2_chunk_size_post }, - - { ngx_string("http2_push_preload"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG, - ngx_http_v2_obsolete, - 0, - 0, - NULL }, - - { ngx_string("http2_push"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1, - ngx_http_v2_obsolete, - 0, - 0, - NULL }, - - ngx_null_command -}; - - -static ngx_http_module_t ngx_http_v2_module_ctx = { - ngx_http_v2_add_variables, /* preconfiguration */ - NULL, /* postconfiguration */ - - ngx_http_v2_create_main_conf, /* create main configuration */ - ngx_http_v2_init_main_conf, /* init main configuration */ - - ngx_http_v2_create_srv_conf, /* create server configuration */ - ngx_http_v2_merge_srv_conf, /* merge server configuration */ - - ngx_http_v2_create_loc_conf, /* create location configuration */ - ngx_http_v2_merge_loc_conf /* merge location configuration */ -}; - - -ngx_module_t ngx_http_v2_module = { - NGX_MODULE_V1, - &ngx_http_v2_module_ctx, /* module context */ - ngx_http_v2_commands, /* module directives */ - NGX_HTTP_MODULE, /* module type */ - NULL, /* init master */ - ngx_http_v2_module_init, /* init module */ - NULL, /* init process */ - NULL, /* init thread */ - NULL, /* exit thread */ - NULL, /* exit process */ - NULL, /* exit master */ - NGX_MODULE_V1_PADDING -}; - - -static ngx_http_variable_t ngx_http_v2_vars[] = { - - { ngx_string("http2"), NULL, - ngx_http_v2_variable, 0, 0, 0 }, - - ngx_http_null_variable -}; - - -static ngx_int_t -ngx_http_v2_add_variables(ngx_conf_t *cf) -{ - ngx_http_variable_t *var, *v; - - for (v = ngx_http_v2_vars; v->name.len; v++) { - var = ngx_http_add_variable(cf, &v->name, v->flags); - if (var == NULL) { - return NGX_ERROR; - } - - var->get_handler = v->get_handler; - var->data = v->data; - } - - return NGX_OK; -} - - -static ngx_int_t -ngx_http_v2_variable(ngx_http_request_t *r, - ngx_http_variable_value_t *v, uintptr_t data) -{ - - if (r->stream) { -#if (NGX_HTTP_SSL) - - if (r->connection->ssl) { - v->len = sizeof("h2") - 1; - v->valid = 1; - v->no_cacheable = 0; - v->not_found = 0; - v->data = (u_char *) "h2"; - - return NGX_OK; - } - -#endif - v->len = sizeof("h2c") - 1; - v->valid = 1; - v->no_cacheable = 0; - v->not_found = 0; - v->data = (u_char *) "h2c"; - - return NGX_OK; - } - - *v = ngx_http_variable_null_value; - - return NGX_OK; -} - - -static ngx_int_t -ngx_http_v2_module_init(ngx_cycle_t *cycle) -{ - return NGX_OK; -} - - -static void * -ngx_http_v2_create_main_conf(ngx_conf_t *cf) -{ - ngx_http_v2_main_conf_t *h2mcf; - - h2mcf = ngx_pcalloc(cf->pool, sizeof(ngx_http_v2_main_conf_t)); - if (h2mcf == NULL) { - return NULL; - } - - h2mcf->recv_buffer_size = NGX_CONF_UNSET_SIZE; - - return h2mcf; -} - - -static char * -ngx_http_v2_init_main_conf(ngx_conf_t *cf, void *conf) -{ - ngx_http_v2_main_conf_t *h2mcf = conf; - - ngx_conf_init_size_value(h2mcf->recv_buffer_size, 256 * 1024); - - return NGX_CONF_OK; -} - - -static void * -ngx_http_v2_create_srv_conf(ngx_conf_t *cf) -{ - ngx_http_v2_srv_conf_t *h2scf; - - h2scf = ngx_pcalloc(cf->pool, sizeof(ngx_http_v2_srv_conf_t)); - if (h2scf == NULL) { - return NULL; - } - - h2scf->enable = NGX_CONF_UNSET; - - h2scf->pool_size = NGX_CONF_UNSET_SIZE; - - h2scf->concurrent_streams = NGX_CONF_UNSET_UINT; - - h2scf->preread_size = NGX_CONF_UNSET_SIZE; - - h2scf->streams_index_mask = NGX_CONF_UNSET_UINT; - - return h2scf; -} - - -static char * -ngx_http_v2_merge_srv_conf(ngx_conf_t *cf, void *parent, void *child) -{ - ngx_http_v2_srv_conf_t *prev = parent; - ngx_http_v2_srv_conf_t *conf = child; - - ngx_conf_merge_value(conf->enable, prev->enable, 0); - - ngx_conf_merge_size_value(conf->pool_size, prev->pool_size, 4096); - - ngx_conf_merge_uint_value(conf->concurrent_streams, - prev->concurrent_streams, 128); - - ngx_conf_merge_size_value(conf->preread_size, prev->preread_size, 65536); - - ngx_conf_merge_uint_value(conf->streams_index_mask, - prev->streams_index_mask, 32 - 1); - - return NGX_CONF_OK; -} - - -static void * -ngx_http_v2_create_loc_conf(ngx_conf_t *cf) -{ - ngx_http_v2_loc_conf_t *h2lcf; - - h2lcf = ngx_pcalloc(cf->pool, sizeof(ngx_http_v2_loc_conf_t)); - if (h2lcf == NULL) { - return NULL; - } - - h2lcf->chunk_size = NGX_CONF_UNSET_SIZE; - - return h2lcf; -} - - -static char * -ngx_http_v2_merge_loc_conf(ngx_conf_t *cf, void *parent, void *child) -{ - ngx_http_v2_loc_conf_t *prev = parent; - ngx_http_v2_loc_conf_t *conf = child; - - ngx_conf_merge_size_value(conf->chunk_size, prev->chunk_size, 8 * 1024); - - return NGX_CONF_OK; -} - - -static char * -ngx_http_v2_recv_buffer_size(ngx_conf_t *cf, void *post, void *data) -{ - size_t *sp = data; - - if (*sp <= NGX_HTTP_V2_STATE_BUFFER_SIZE) { - return "value is too small"; - } - - return NGX_CONF_OK; -} - - -static char * -ngx_http_v2_pool_size(ngx_conf_t *cf, void *post, void *data) -{ - size_t *sp = data; - - if (*sp < NGX_MIN_POOL_SIZE) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "the pool size must be no less than %uz", - NGX_MIN_POOL_SIZE); - - return NGX_CONF_ERROR; - } - - if (*sp % NGX_POOL_ALIGNMENT) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "the pool size must be a multiple of %uz", - NGX_POOL_ALIGNMENT); - - return NGX_CONF_ERROR; - } - - return NGX_CONF_OK; -} - - -static char * -ngx_http_v2_preread_size(ngx_conf_t *cf, void *post, void *data) -{ - size_t *sp = data; - - if (*sp > NGX_HTTP_V2_MAX_WINDOW) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "the maximum body preread buffer size is %uz", - NGX_HTTP_V2_MAX_WINDOW); - - return NGX_CONF_ERROR; - } - - return NGX_CONF_OK; -} - - -static char * -ngx_http_v2_streams_index_mask(ngx_conf_t *cf, void *post, void *data) -{ - ngx_uint_t *np = data; - - ngx_uint_t mask; - - mask = *np - 1; - - if (*np == 0 || (*np & mask)) { - return "must be a power of two"; - } - - *np = mask; - - return NGX_CONF_OK; -} - - -static char * -ngx_http_v2_chunk_size(ngx_conf_t *cf, void *post, void *data) -{ - size_t *sp = data; - - if (*sp == 0) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "the http2 chunk size cannot be zero"); - - return NGX_CONF_ERROR; - } - - if (*sp > NGX_HTTP_V2_MAX_FRAME_SIZE) { - *sp = NGX_HTTP_V2_MAX_FRAME_SIZE; - } - - return NGX_CONF_OK; -} - - -static char * -ngx_http_v2_obsolete(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) -{ - ngx_conf_deprecated_t *d = cmd->post; - - if (d) { - ngx_conf_log_error(NGX_LOG_WARN, cf, 0, - "the \"%s\" directive is obsolete, " - "use the \"%s\" directive instead", - d->old_name, d->new_name); - - } else { - ngx_conf_log_error(NGX_LOG_WARN, cf, 0, - "the \"%V\" directive is obsolete, ignored", - &cmd->name); - } - - return NGX_CONF_OK; -} diff --git a/src/deps/src/nginx-1.30.3/src/http/v2/ngx_http_v2_module.h b/src/deps/src/nginx-1.30.3/src/http/v2/ngx_http_v2_module.h deleted file mode 100644 index 07a595cfdd..0000000000 --- a/src/deps/src/nginx-1.30.3/src/http/v2/ngx_http_v2_module.h +++ /dev/null @@ -1,28 +0,0 @@ - -/* - * Copyright (C) Nginx, Inc. - * Copyright (C) Valentin V. Bartenev - */ - - -#ifndef _NGX_HTTP_V2_MODULE_H_INCLUDED_ -#define _NGX_HTTP_V2_MODULE_H_INCLUDED_ - - -#include -#include -#include - - -typedef struct { - size_t recv_buffer_size; - u_char *recv_buffer; -} ngx_http_v2_main_conf_t; - - -typedef struct { - size_t chunk_size; -} ngx_http_v2_loc_conf_t; - - -#endif /* _NGX_HTTP_V2_MODULE_H_INCLUDED_ */ diff --git a/src/deps/src/nginx-1.30.3/src/http/v2/ngx_http_v2_table.c b/src/deps/src/nginx-1.30.3/src/http/v2/ngx_http_v2_table.c deleted file mode 100644 index 7d49803fdb..0000000000 --- a/src/deps/src/nginx-1.30.3/src/http/v2/ngx_http_v2_table.c +++ /dev/null @@ -1,363 +0,0 @@ - -/* - * Copyright (C) Nginx, Inc. - * Copyright (C) Valentin V. Bartenev - */ - - -#include -#include -#include - - -#define NGX_HTTP_V2_TABLE_SIZE 4096 - - -static ngx_int_t ngx_http_v2_table_account(ngx_http_v2_connection_t *h2c, - size_t size); - - -static ngx_http_v2_header_t ngx_http_v2_static_table[] = { - { ngx_string(":authority"), ngx_string("") }, - { ngx_string(":method"), ngx_string("GET") }, - { ngx_string(":method"), ngx_string("POST") }, - { ngx_string(":path"), ngx_string("/") }, - { ngx_string(":path"), ngx_string("/index.html") }, - { ngx_string(":scheme"), ngx_string("http") }, - { ngx_string(":scheme"), ngx_string("https") }, - { ngx_string(":status"), ngx_string("200") }, - { ngx_string(":status"), ngx_string("204") }, - { ngx_string(":status"), ngx_string("206") }, - { ngx_string(":status"), ngx_string("304") }, - { ngx_string(":status"), ngx_string("400") }, - { ngx_string(":status"), ngx_string("404") }, - { ngx_string(":status"), ngx_string("500") }, - { ngx_string("accept-charset"), ngx_string("") }, - { ngx_string("accept-encoding"), ngx_string("gzip, deflate") }, - { ngx_string("accept-language"), ngx_string("") }, - { ngx_string("accept-ranges"), ngx_string("") }, - { ngx_string("accept"), ngx_string("") }, - { ngx_string("access-control-allow-origin"), ngx_string("") }, - { ngx_string("age"), ngx_string("") }, - { ngx_string("allow"), ngx_string("") }, - { ngx_string("authorization"), ngx_string("") }, - { ngx_string("cache-control"), ngx_string("") }, - { ngx_string("content-disposition"), ngx_string("") }, - { ngx_string("content-encoding"), ngx_string("") }, - { ngx_string("content-language"), ngx_string("") }, - { ngx_string("content-length"), ngx_string("") }, - { ngx_string("content-location"), ngx_string("") }, - { ngx_string("content-range"), ngx_string("") }, - { ngx_string("content-type"), ngx_string("") }, - { ngx_string("cookie"), ngx_string("") }, - { ngx_string("date"), ngx_string("") }, - { ngx_string("etag"), ngx_string("") }, - { ngx_string("expect"), ngx_string("") }, - { ngx_string("expires"), ngx_string("") }, - { ngx_string("from"), ngx_string("") }, - { ngx_string("host"), ngx_string("") }, - { ngx_string("if-match"), ngx_string("") }, - { ngx_string("if-modified-since"), ngx_string("") }, - { ngx_string("if-none-match"), ngx_string("") }, - { ngx_string("if-range"), ngx_string("") }, - { ngx_string("if-unmodified-since"), ngx_string("") }, - { ngx_string("last-modified"), ngx_string("") }, - { ngx_string("link"), ngx_string("") }, - { ngx_string("location"), ngx_string("") }, - { ngx_string("max-forwards"), ngx_string("") }, - { ngx_string("proxy-authenticate"), ngx_string("") }, - { ngx_string("proxy-authorization"), ngx_string("") }, - { ngx_string("range"), ngx_string("") }, - { ngx_string("referer"), ngx_string("") }, - { ngx_string("refresh"), ngx_string("") }, - { ngx_string("retry-after"), ngx_string("") }, - { ngx_string("server"), ngx_string("") }, - { ngx_string("set-cookie"), ngx_string("") }, - { ngx_string("strict-transport-security"), ngx_string("") }, - { ngx_string("transfer-encoding"), ngx_string("") }, - { ngx_string("user-agent"), ngx_string("") }, - { ngx_string("vary"), ngx_string("") }, - { ngx_string("via"), ngx_string("") }, - { ngx_string("www-authenticate"), ngx_string("") }, -}; - -#define NGX_HTTP_V2_STATIC_TABLE_ENTRIES \ - (sizeof(ngx_http_v2_static_table) \ - / sizeof(ngx_http_v2_header_t)) - - -ngx_str_t * -ngx_http_v2_get_static_name(ngx_uint_t index) -{ - return &ngx_http_v2_static_table[index - 1].name; -} - - -ngx_str_t * -ngx_http_v2_get_static_value(ngx_uint_t index) -{ - return &ngx_http_v2_static_table[index - 1].value; -} - - -ngx_int_t -ngx_http_v2_get_indexed_header(ngx_http_v2_connection_t *h2c, ngx_uint_t index, - ngx_uint_t name_only) -{ - u_char *p; - size_t rest; - ngx_http_v2_header_t *entry; - - if (index == 0) { - ngx_log_error(NGX_LOG_INFO, h2c->connection->log, 0, - "client sent invalid hpack table index 0"); - return NGX_ERROR; - } - - ngx_log_debug2(NGX_LOG_DEBUG_HTTP, h2c->connection->log, 0, - "http2 get indexed %s: %ui", - name_only ? "name" : "header", index); - - index--; - - if (index < NGX_HTTP_V2_STATIC_TABLE_ENTRIES) { - h2c->state.header = ngx_http_v2_static_table[index]; - return NGX_OK; - } - - index -= NGX_HTTP_V2_STATIC_TABLE_ENTRIES; - - if (index < h2c->hpack.added - h2c->hpack.deleted) { - index = (h2c->hpack.added - index - 1) % h2c->hpack.allocated; - entry = h2c->hpack.entries[index]; - - p = ngx_pnalloc(h2c->state.pool, entry->name.len + 1); - if (p == NULL) { - return NGX_ERROR; - } - - h2c->state.header.name.len = entry->name.len; - h2c->state.header.name.data = p; - - rest = h2c->hpack.storage + NGX_HTTP_V2_TABLE_SIZE - entry->name.data; - - if (entry->name.len > rest) { - p = ngx_cpymem(p, entry->name.data, rest); - p = ngx_cpymem(p, h2c->hpack.storage, entry->name.len - rest); - - } else { - p = ngx_cpymem(p, entry->name.data, entry->name.len); - } - - *p = '\0'; - - if (name_only) { - return NGX_OK; - } - - p = ngx_pnalloc(h2c->state.pool, entry->value.len + 1); - if (p == NULL) { - return NGX_ERROR; - } - - h2c->state.header.value.len = entry->value.len; - h2c->state.header.value.data = p; - - rest = h2c->hpack.storage + NGX_HTTP_V2_TABLE_SIZE - entry->value.data; - - if (entry->value.len > rest) { - p = ngx_cpymem(p, entry->value.data, rest); - p = ngx_cpymem(p, h2c->hpack.storage, entry->value.len - rest); - - } else { - p = ngx_cpymem(p, entry->value.data, entry->value.len); - } - - *p = '\0'; - - return NGX_OK; - } - - ngx_log_error(NGX_LOG_INFO, h2c->connection->log, 0, - "client sent out of bound hpack table index: %ui", index); - - return NGX_ERROR; -} - - -ngx_int_t -ngx_http_v2_add_header(ngx_http_v2_connection_t *h2c, - ngx_http_v2_header_t *header) -{ - size_t avail; - ngx_uint_t index; - ngx_http_v2_header_t *entry, **entries; - - ngx_log_debug2(NGX_LOG_DEBUG_HTTP, h2c->connection->log, 0, - "http2 table add: \"%V: %V\"", - &header->name, &header->value); - - if (h2c->hpack.entries == NULL) { - h2c->hpack.allocated = 64; - h2c->hpack.size = NGX_HTTP_V2_TABLE_SIZE; - h2c->hpack.free = NGX_HTTP_V2_TABLE_SIZE; - - h2c->hpack.entries = ngx_palloc(h2c->connection->pool, - sizeof(ngx_http_v2_header_t *) - * h2c->hpack.allocated); - if (h2c->hpack.entries == NULL) { - return NGX_ERROR; - } - - h2c->hpack.storage = ngx_palloc(h2c->connection->pool, - h2c->hpack.free); - if (h2c->hpack.storage == NULL) { - return NGX_ERROR; - } - - h2c->hpack.pos = h2c->hpack.storage; - } - - if (ngx_http_v2_table_account(h2c, header->name.len + header->value.len) - != NGX_OK) - { - return NGX_OK; - } - - if (h2c->hpack.reused == h2c->hpack.deleted) { - entry = ngx_palloc(h2c->connection->pool, sizeof(ngx_http_v2_header_t)); - if (entry == NULL) { - return NGX_ERROR; - } - - } else { - entry = h2c->hpack.entries[h2c->hpack.reused++ % h2c->hpack.allocated]; - } - - avail = h2c->hpack.storage + NGX_HTTP_V2_TABLE_SIZE - h2c->hpack.pos; - - entry->name.len = header->name.len; - entry->name.data = h2c->hpack.pos; - - if (avail >= header->name.len) { - h2c->hpack.pos = ngx_cpymem(h2c->hpack.pos, header->name.data, - header->name.len); - } else { - ngx_memcpy(h2c->hpack.pos, header->name.data, avail); - h2c->hpack.pos = ngx_cpymem(h2c->hpack.storage, - header->name.data + avail, - header->name.len - avail); - avail = NGX_HTTP_V2_TABLE_SIZE; - } - - avail -= header->name.len; - - entry->value.len = header->value.len; - entry->value.data = h2c->hpack.pos; - - if (avail >= header->value.len) { - h2c->hpack.pos = ngx_cpymem(h2c->hpack.pos, header->value.data, - header->value.len); - } else { - ngx_memcpy(h2c->hpack.pos, header->value.data, avail); - h2c->hpack.pos = ngx_cpymem(h2c->hpack.storage, - header->value.data + avail, - header->value.len - avail); - } - - if (h2c->hpack.allocated == h2c->hpack.added - h2c->hpack.deleted) { - - entries = ngx_palloc(h2c->connection->pool, - sizeof(ngx_http_v2_header_t *) - * (h2c->hpack.allocated + 64)); - if (entries == NULL) { - return NGX_ERROR; - } - - index = h2c->hpack.deleted % h2c->hpack.allocated; - - ngx_memcpy(entries, &h2c->hpack.entries[index], - (h2c->hpack.allocated - index) - * sizeof(ngx_http_v2_header_t *)); - - ngx_memcpy(&entries[h2c->hpack.allocated - index], h2c->hpack.entries, - index * sizeof(ngx_http_v2_header_t *)); - - (void) ngx_pfree(h2c->connection->pool, h2c->hpack.entries); - - h2c->hpack.entries = entries; - - h2c->hpack.added = h2c->hpack.allocated; - h2c->hpack.deleted = 0; - h2c->hpack.reused = 0; - h2c->hpack.allocated += 64; - } - - h2c->hpack.entries[h2c->hpack.added++ % h2c->hpack.allocated] = entry; - - return NGX_OK; -} - - -static ngx_int_t -ngx_http_v2_table_account(ngx_http_v2_connection_t *h2c, size_t size) -{ - ngx_http_v2_header_t *entry; - - size += 32; - - ngx_log_debug2(NGX_LOG_DEBUG_HTTP, h2c->connection->log, 0, - "http2 table account: %uz free:%uz", - size, h2c->hpack.free); - - if (size <= h2c->hpack.free) { - h2c->hpack.free -= size; - return NGX_OK; - } - - if (size > h2c->hpack.size) { - h2c->hpack.deleted = h2c->hpack.added; - h2c->hpack.free = h2c->hpack.size; - return NGX_DECLINED; - } - - do { - entry = h2c->hpack.entries[h2c->hpack.deleted++ % h2c->hpack.allocated]; - h2c->hpack.free += 32 + entry->name.len + entry->value.len; - } while (size > h2c->hpack.free); - - h2c->hpack.free -= size; - - return NGX_OK; -} - - -ngx_int_t -ngx_http_v2_table_size(ngx_http_v2_connection_t *h2c, size_t size) -{ - ssize_t needed; - ngx_http_v2_header_t *entry; - - if (size > NGX_HTTP_V2_TABLE_SIZE) { - ngx_log_error(NGX_LOG_INFO, h2c->connection->log, 0, - "client sent invalid table size update: %uz", size); - - return NGX_ERROR; - } - - ngx_log_debug2(NGX_LOG_DEBUG_HTTP, h2c->connection->log, 0, - "http2 new hpack table size: %uz was:%uz", - size, h2c->hpack.size); - - needed = h2c->hpack.size - size; - - while (needed > (ssize_t) h2c->hpack.free) { - entry = h2c->hpack.entries[h2c->hpack.deleted++ % h2c->hpack.allocated]; - h2c->hpack.free += 32 + entry->name.len + entry->value.len; - } - - h2c->hpack.size = size; - h2c->hpack.free -= needed; - - return NGX_OK; -} diff --git a/src/deps/src/nginx-1.30.3/src/http/v3/ngx_http_v3.c b/src/deps/src/nginx-1.30.3/src/http/v3/ngx_http_v3.c deleted file mode 100644 index d8597ec5c7..0000000000 --- a/src/deps/src/nginx-1.30.3/src/http/v3/ngx_http_v3.c +++ /dev/null @@ -1,111 +0,0 @@ - -/* - * Copyright (C) Roman Arutyunyan - * Copyright (C) Nginx, Inc. - */ - - -#include -#include -#include - - -static void ngx_http_v3_keepalive_handler(ngx_event_t *ev); -static void ngx_http_v3_cleanup_session(void *data); - - -ngx_int_t -ngx_http_v3_init_session(ngx_connection_t *c) -{ - ngx_pool_cleanup_t *cln; - ngx_http_connection_t *hc; - ngx_http_v3_session_t *h3c; - - hc = c->data; - - ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0, "http3 init session"); - - h3c = ngx_pcalloc(c->pool, sizeof(ngx_http_v3_session_t)); - if (h3c == NULL) { - goto failed; - } - - h3c->http_connection = hc; - - ngx_queue_init(&h3c->blocked); - - h3c->keepalive.log = c->log; - h3c->keepalive.data = c; - h3c->keepalive.handler = ngx_http_v3_keepalive_handler; - - h3c->table.send_insert_count.log = c->log; - h3c->table.send_insert_count.data = c; - h3c->table.send_insert_count.handler = ngx_http_v3_inc_insert_count_handler; - - cln = ngx_pool_cleanup_add(c->pool, 0); - if (cln == NULL) { - goto failed; - } - - cln->handler = ngx_http_v3_cleanup_session; - cln->data = h3c; - - c->data = h3c; - - return NGX_OK; - -failed: - - ngx_log_error(NGX_LOG_ERR, c->log, 0, "failed to create http3 session"); - return NGX_ERROR; -} - - -static void -ngx_http_v3_keepalive_handler(ngx_event_t *ev) -{ - ngx_connection_t *c; - - c = ev->data; - - ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0, "http3 keepalive handler"); - - ngx_http_v3_shutdown_connection(c, NGX_HTTP_V3_ERR_NO_ERROR, - "keepalive timeout"); -} - - -static void -ngx_http_v3_cleanup_session(void *data) -{ - ngx_http_v3_session_t *h3c = data; - - ngx_http_v3_cleanup_table(h3c); - - if (h3c->keepalive.timer_set) { - ngx_del_timer(&h3c->keepalive); - } - - if (h3c->table.send_insert_count.posted) { - ngx_delete_posted_event(&h3c->table.send_insert_count); - } -} - - -ngx_int_t -ngx_http_v3_check_flood(ngx_connection_t *c) -{ - ngx_http_v3_session_t *h3c; - - h3c = ngx_http_v3_get_session(c); - - if (h3c->total_bytes / 8 > h3c->payload_bytes + 1048576) { - ngx_log_error(NGX_LOG_INFO, c->log, 0, "http3 flood detected"); - - ngx_http_v3_finalize_connection(c, NGX_HTTP_V3_ERR_NO_ERROR, - "HTTP/3 flood detected"); - return NGX_ERROR; - } - - return NGX_OK; -} diff --git a/src/deps/src/nginx-1.30.3/src/http/v3/ngx_http_v3.h b/src/deps/src/nginx-1.30.3/src/http/v3/ngx_http_v3.h deleted file mode 100644 index 8fd212c1f0..0000000000 --- a/src/deps/src/nginx-1.30.3/src/http/v3/ngx_http_v3.h +++ /dev/null @@ -1,160 +0,0 @@ - -/* - * Copyright (C) Roman Arutyunyan - * Copyright (C) Nginx, Inc. - */ - - -#ifndef _NGX_HTTP_V3_H_INCLUDED_ -#define _NGX_HTTP_V3_H_INCLUDED_ - - -#include -#include -#include - -#include -#include -#include -#include - - -#define NGX_HTTP_V3_ALPN_PROTO "\x02h3" -#define NGX_HTTP_V3_HQ_ALPN_PROTO "\x0Ahq-interop" -#define NGX_HTTP_V3_HQ_PROTO "hq-interop" - -#define NGX_HTTP_V3_VARLEN_INT_LEN 8 -#define NGX_HTTP_V3_PREFIX_INT_LEN 11 - -#define NGX_HTTP_V3_STREAM_CONTROL 0x00 -#define NGX_HTTP_V3_STREAM_PUSH 0x01 -#define NGX_HTTP_V3_STREAM_ENCODER 0x02 -#define NGX_HTTP_V3_STREAM_DECODER 0x03 - -#define NGX_HTTP_V3_FRAME_DATA 0x00 -#define NGX_HTTP_V3_FRAME_HEADERS 0x01 -#define NGX_HTTP_V3_FRAME_CANCEL_PUSH 0x03 -#define NGX_HTTP_V3_FRAME_SETTINGS 0x04 -#define NGX_HTTP_V3_FRAME_PUSH_PROMISE 0x05 -#define NGX_HTTP_V3_FRAME_GOAWAY 0x07 -#define NGX_HTTP_V3_FRAME_MAX_PUSH_ID 0x0d - -#define NGX_HTTP_V3_PARAM_MAX_TABLE_CAPACITY 0x01 -#define NGX_HTTP_V3_PARAM_MAX_FIELD_SECTION_SIZE 0x06 -#define NGX_HTTP_V3_PARAM_BLOCKED_STREAMS 0x07 - -#define NGX_HTTP_V3_MAX_TABLE_CAPACITY 4096 - -#define NGX_HTTP_V3_STREAM_CLIENT_CONTROL 0 -#define NGX_HTTP_V3_STREAM_SERVER_CONTROL 1 -#define NGX_HTTP_V3_STREAM_CLIENT_ENCODER 2 -#define NGX_HTTP_V3_STREAM_SERVER_ENCODER 3 -#define NGX_HTTP_V3_STREAM_CLIENT_DECODER 4 -#define NGX_HTTP_V3_STREAM_SERVER_DECODER 5 -#define NGX_HTTP_V3_MAX_KNOWN_STREAM 6 -#define NGX_HTTP_V3_MAX_UNI_STREAMS 3 - -/* HTTP/3 errors */ -#define NGX_HTTP_V3_ERR_NO_ERROR 0x100 -#define NGX_HTTP_V3_ERR_GENERAL_PROTOCOL_ERROR 0x101 -#define NGX_HTTP_V3_ERR_INTERNAL_ERROR 0x102 -#define NGX_HTTP_V3_ERR_STREAM_CREATION_ERROR 0x103 -#define NGX_HTTP_V3_ERR_CLOSED_CRITICAL_STREAM 0x104 -#define NGX_HTTP_V3_ERR_FRAME_UNEXPECTED 0x105 -#define NGX_HTTP_V3_ERR_FRAME_ERROR 0x106 -#define NGX_HTTP_V3_ERR_EXCESSIVE_LOAD 0x107 -#define NGX_HTTP_V3_ERR_ID_ERROR 0x108 -#define NGX_HTTP_V3_ERR_SETTINGS_ERROR 0x109 -#define NGX_HTTP_V3_ERR_MISSING_SETTINGS 0x10a -#define NGX_HTTP_V3_ERR_REQUEST_REJECTED 0x10b -#define NGX_HTTP_V3_ERR_REQUEST_CANCELLED 0x10c -#define NGX_HTTP_V3_ERR_REQUEST_INCOMPLETE 0x10d -#define NGX_HTTP_V3_ERR_CONNECT_ERROR 0x10f -#define NGX_HTTP_V3_ERR_VERSION_FALLBACK 0x110 - -/* QPACK errors */ -#define NGX_HTTP_V3_ERR_DECOMPRESSION_FAILED 0x200 -#define NGX_HTTP_V3_ERR_ENCODER_STREAM_ERROR 0x201 -#define NGX_HTTP_V3_ERR_DECODER_STREAM_ERROR 0x202 - - -#define ngx_http_v3_get_session(c) \ - ((ngx_http_v3_session_t *) ((c)->quic ? (c)->quic->parent->data \ - : (c)->data)) - -#define ngx_http_quic_get_connection(c) \ - (ngx_http_v3_get_session(c)->http_connection) - -#define ngx_http_v3_get_module_loc_conf(c, module) \ - ngx_http_get_module_loc_conf(ngx_http_quic_get_connection(c)->conf_ctx, \ - module) - -#define ngx_http_v3_get_module_srv_conf(c, module) \ - ngx_http_get_module_srv_conf(ngx_http_quic_get_connection(c)->conf_ctx, \ - module) - -#define ngx_http_v3_finalize_connection(c, code, reason) \ - ngx_quic_finalize_connection((c)->quic ? (c)->quic->parent : (c), \ - code, reason) - -#define ngx_http_v3_shutdown_connection(c, code, reason) \ - ngx_quic_shutdown_connection((c)->quic ? (c)->quic->parent : (c), \ - code, reason) - - -typedef struct { - ngx_flag_t enable; - ngx_flag_t enable_hq; - size_t max_table_capacity; - ngx_uint_t max_blocked_streams; - ngx_uint_t max_concurrent_streams; - ngx_quic_conf_t quic; -} ngx_http_v3_srv_conf_t; - - -struct ngx_http_v3_parse_s { - size_t header_limit; - ngx_http_v3_parse_headers_t headers; - ngx_http_v3_parse_data_t body; - ngx_array_t *cookies; -}; - - -struct ngx_http_v3_session_s { - ngx_http_connection_t *http_connection; - - ngx_http_v3_dynamic_table_t table; - - ngx_event_t keepalive; - ngx_uint_t nrequests; - - ngx_queue_t blocked; - ngx_uint_t nblocked; - - uint64_t next_request_id; - - off_t total_bytes; - off_t payload_bytes; - - unsigned goaway:1; - unsigned hq:1; - - ngx_connection_t *known_streams[NGX_HTTP_V3_MAX_KNOWN_STREAM]; -}; - - -void ngx_http_v3_init_stream(ngx_connection_t *c); -void ngx_http_v3_reset_stream(ngx_connection_t *c); -ngx_int_t ngx_http_v3_init_session(ngx_connection_t *c); -ngx_int_t ngx_http_v3_check_flood(ngx_connection_t *c); -ngx_int_t ngx_http_v3_init(ngx_connection_t *c); -void ngx_http_v3_shutdown(ngx_connection_t *c); - -ngx_int_t ngx_http_v3_read_request_body(ngx_http_request_t *r); -ngx_int_t ngx_http_v3_read_unbuffered_request_body(ngx_http_request_t *r); - - -extern ngx_module_t ngx_http_v3_module; - - -#endif /* _NGX_HTTP_V3_H_INCLUDED_ */ diff --git a/src/deps/src/nginx-1.30.3/src/http/v3/ngx_http_v3_encode.c b/src/deps/src/nginx-1.30.3/src/http/v3/ngx_http_v3_encode.c deleted file mode 100644 index fb089c4132..0000000000 --- a/src/deps/src/nginx-1.30.3/src/http/v3/ngx_http_v3_encode.c +++ /dev/null @@ -1,304 +0,0 @@ - -/* - * Copyright (C) Roman Arutyunyan - * Copyright (C) Nginx, Inc. - */ - - -#include -#include -#include - - -uintptr_t -ngx_http_v3_encode_varlen_int(u_char *p, uint64_t value) -{ - if (value <= 63) { - if (p == NULL) { - return 1; - } - - *p++ = value; - return (uintptr_t) p; - } - - if (value <= 16383) { - if (p == NULL) { - return 2; - } - - *p++ = 0x40 | (value >> 8); - *p++ = value; - return (uintptr_t) p; - } - - if (value <= 1073741823) { - if (p == NULL) { - return 4; - } - - *p++ = 0x80 | (value >> 24); - *p++ = (value >> 16); - *p++ = (value >> 8); - *p++ = value; - return (uintptr_t) p; - } - - if (p == NULL) { - return 8; - } - - *p++ = 0xc0 | (value >> 56); - *p++ = (value >> 48); - *p++ = (value >> 40); - *p++ = (value >> 32); - *p++ = (value >> 24); - *p++ = (value >> 16); - *p++ = (value >> 8); - *p++ = value; - return (uintptr_t) p; -} - - -uintptr_t -ngx_http_v3_encode_prefix_int(u_char *p, uint64_t value, ngx_uint_t prefix) -{ - ngx_uint_t thresh, n; - - thresh = (1 << prefix) - 1; - - if (value < thresh) { - if (p == NULL) { - return 1; - } - - *p++ |= value; - return (uintptr_t) p; - } - - value -= thresh; - - if (p == NULL) { - for (n = 2; value >= 128; n++) { - value >>= 7; - } - - return n; - } - - *p++ |= thresh; - - while (value >= 128) { - *p++ = 0x80 | value; - value >>= 7; - } - - *p++ = value; - - return (uintptr_t) p; -} - - -uintptr_t -ngx_http_v3_encode_field_section_prefix(u_char *p, ngx_uint_t insert_count, - ngx_uint_t sign, ngx_uint_t delta_base) -{ - if (p == NULL) { - return ngx_http_v3_encode_prefix_int(NULL, insert_count, 8) - + ngx_http_v3_encode_prefix_int(NULL, delta_base, 7); - } - - *p = 0; - p = (u_char *) ngx_http_v3_encode_prefix_int(p, insert_count, 8); - - *p = sign ? 0x80 : 0; - p = (u_char *) ngx_http_v3_encode_prefix_int(p, delta_base, 7); - - return (uintptr_t) p; -} - - -uintptr_t -ngx_http_v3_encode_field_ri(u_char *p, ngx_uint_t dynamic, ngx_uint_t index) -{ - /* Indexed Field Line */ - - if (p == NULL) { - return ngx_http_v3_encode_prefix_int(NULL, index, 6); - } - - *p = dynamic ? 0x80 : 0xc0; - - return ngx_http_v3_encode_prefix_int(p, index, 6); -} - - -uintptr_t -ngx_http_v3_encode_field_lri(u_char *p, ngx_uint_t dynamic, ngx_uint_t index, - u_char *data, size_t len) -{ - size_t hlen; - u_char *p1, *p2; - - /* Literal Field Line With Name Reference */ - - if (p == NULL) { - return ngx_http_v3_encode_prefix_int(NULL, index, 4) - + ngx_http_v3_encode_prefix_int(NULL, len, 7) - + len; - } - - *p = dynamic ? 0x40 : 0x50; - p = (u_char *) ngx_http_v3_encode_prefix_int(p, index, 4); - - p1 = p; - *p = 0; - p = (u_char *) ngx_http_v3_encode_prefix_int(p, len, 7); - - if (data) { - p2 = p; - hlen = ngx_http_huff_encode(data, len, p, 0); - - if (hlen) { - p = p1; - *p = 0x80; - p = (u_char *) ngx_http_v3_encode_prefix_int(p, hlen, 7); - - if (p != p2) { - ngx_memmove(p, p2, hlen); - } - - p += hlen; - - } else { - p = ngx_cpymem(p, data, len); - } - } - - return (uintptr_t) p; -} - - -uintptr_t -ngx_http_v3_encode_field_l(u_char *p, ngx_str_t *name, ngx_str_t *value) -{ - size_t hlen; - u_char *p1, *p2; - - /* Literal Field Line With Literal Name */ - - if (p == NULL) { - return ngx_http_v3_encode_prefix_int(NULL, name->len, 3) - + name->len - + ngx_http_v3_encode_prefix_int(NULL, value->len, 7) - + value->len; - } - - p1 = p; - *p = 0x20; - p = (u_char *) ngx_http_v3_encode_prefix_int(p, name->len, 3); - - p2 = p; - hlen = ngx_http_huff_encode(name->data, name->len, p, 1); - - if (hlen) { - p = p1; - *p = 0x28; - p = (u_char *) ngx_http_v3_encode_prefix_int(p, hlen, 3); - - if (p != p2) { - ngx_memmove(p, p2, hlen); - } - - p += hlen; - - } else { - ngx_strlow(p, name->data, name->len); - p += name->len; - } - - p1 = p; - *p = 0; - p = (u_char *) ngx_http_v3_encode_prefix_int(p, value->len, 7); - - p2 = p; - hlen = ngx_http_huff_encode(value->data, value->len, p, 0); - - if (hlen) { - p = p1; - *p = 0x80; - p = (u_char *) ngx_http_v3_encode_prefix_int(p, hlen, 7); - - if (p != p2) { - ngx_memmove(p, p2, hlen); - } - - p += hlen; - - } else { - p = ngx_cpymem(p, value->data, value->len); - } - - return (uintptr_t) p; -} - - -uintptr_t -ngx_http_v3_encode_field_pbi(u_char *p, ngx_uint_t index) -{ - /* Indexed Field Line With Post-Base Index */ - - if (p == NULL) { - return ngx_http_v3_encode_prefix_int(NULL, index, 4); - } - - *p = 0x10; - - return ngx_http_v3_encode_prefix_int(p, index, 4); -} - - -uintptr_t -ngx_http_v3_encode_field_lpbi(u_char *p, ngx_uint_t index, u_char *data, - size_t len) -{ - size_t hlen; - u_char *p1, *p2; - - /* Literal Field Line With Post-Base Name Reference */ - - if (p == NULL) { - return ngx_http_v3_encode_prefix_int(NULL, index, 3) - + ngx_http_v3_encode_prefix_int(NULL, len, 7) - + len; - } - - *p = 0; - p = (u_char *) ngx_http_v3_encode_prefix_int(p, index, 3); - - p1 = p; - *p = 0; - p = (u_char *) ngx_http_v3_encode_prefix_int(p, len, 7); - - if (data) { - p2 = p; - hlen = ngx_http_huff_encode(data, len, p, 0); - - if (hlen) { - p = p1; - *p = 0x80; - p = (u_char *) ngx_http_v3_encode_prefix_int(p, hlen, 7); - - if (p != p2) { - ngx_memmove(p, p2, hlen); - } - - p += hlen; - - } else { - p = ngx_cpymem(p, data, len); - } - } - - return (uintptr_t) p; -} diff --git a/src/deps/src/nginx-1.30.3/src/http/v3/ngx_http_v3_encode.h b/src/deps/src/nginx-1.30.3/src/http/v3/ngx_http_v3_encode.h deleted file mode 100644 index fca376da5e..0000000000 --- a/src/deps/src/nginx-1.30.3/src/http/v3/ngx_http_v3_encode.h +++ /dev/null @@ -1,34 +0,0 @@ - -/* - * Copyright (C) Roman Arutyunyan - * Copyright (C) Nginx, Inc. - */ - - -#ifndef _NGX_HTTP_V3_ENCODE_H_INCLUDED_ -#define _NGX_HTTP_V3_ENCODE_H_INCLUDED_ - - -#include -#include -#include - - -uintptr_t ngx_http_v3_encode_varlen_int(u_char *p, uint64_t value); -uintptr_t ngx_http_v3_encode_prefix_int(u_char *p, uint64_t value, - ngx_uint_t prefix); - -uintptr_t ngx_http_v3_encode_field_section_prefix(u_char *p, - ngx_uint_t insert_count, ngx_uint_t sign, ngx_uint_t delta_base); -uintptr_t ngx_http_v3_encode_field_ri(u_char *p, ngx_uint_t dynamic, - ngx_uint_t index); -uintptr_t ngx_http_v3_encode_field_lri(u_char *p, ngx_uint_t dynamic, - ngx_uint_t index, u_char *data, size_t len); -uintptr_t ngx_http_v3_encode_field_l(u_char *p, ngx_str_t *name, - ngx_str_t *value); -uintptr_t ngx_http_v3_encode_field_pbi(u_char *p, ngx_uint_t index); -uintptr_t ngx_http_v3_encode_field_lpbi(u_char *p, ngx_uint_t index, - u_char *data, size_t len); - - -#endif /* _NGX_HTTP_V3_ENCODE_H_INCLUDED_ */ diff --git a/src/deps/src/nginx-1.30.3/src/http/v3/ngx_http_v3_filter_module.c b/src/deps/src/nginx-1.30.3/src/http/v3/ngx_http_v3_filter_module.c deleted file mode 100644 index e3f15368f1..0000000000 --- a/src/deps/src/nginx-1.30.3/src/http/v3/ngx_http_v3_filter_module.c +++ /dev/null @@ -1,1002 +0,0 @@ - -/* - * Copyright (C) Roman Arutyunyan - * Copyright (C) Nginx, Inc. - */ - - -#include -#include -#include - - -/* static table indices */ -#define NGX_HTTP_V3_HEADER_AUTHORITY 0 -#define NGX_HTTP_V3_HEADER_PATH_ROOT 1 -#define NGX_HTTP_V3_HEADER_CONTENT_LENGTH_ZERO 4 -#define NGX_HTTP_V3_HEADER_DATE 6 -#define NGX_HTTP_V3_HEADER_LAST_MODIFIED 10 -#define NGX_HTTP_V3_HEADER_LOCATION 12 -#define NGX_HTTP_V3_HEADER_METHOD_GET 17 -#define NGX_HTTP_V3_HEADER_SCHEME_HTTP 22 -#define NGX_HTTP_V3_HEADER_SCHEME_HTTPS 23 -#define NGX_HTTP_V3_HEADER_STATUS_103 24 -#define NGX_HTTP_V3_HEADER_STATUS_200 25 -#define NGX_HTTP_V3_HEADER_ACCEPT_ENCODING 31 -#define NGX_HTTP_V3_HEADER_CONTENT_TYPE_TEXT_PLAIN 53 -#define NGX_HTTP_V3_HEADER_VARY_ACCEPT_ENCODING 59 -#define NGX_HTTP_V3_HEADER_ACCEPT_LANGUAGE 72 -#define NGX_HTTP_V3_HEADER_SERVER 92 -#define NGX_HTTP_V3_HEADER_USER_AGENT 95 - - -typedef struct { - ngx_chain_t *free; - ngx_chain_t *busy; -} ngx_http_v3_filter_ctx_t; - - -static ngx_int_t ngx_http_v3_header_filter(ngx_http_request_t *r); -static ngx_int_t ngx_http_v3_early_hints_filter(ngx_http_request_t *r); -static ngx_int_t ngx_http_v3_body_filter(ngx_http_request_t *r, - ngx_chain_t *in); -static ngx_chain_t *ngx_http_v3_create_trailers(ngx_http_request_t *r, - ngx_http_v3_filter_ctx_t *ctx); -static ngx_int_t ngx_http_v3_filter_init(ngx_conf_t *cf); - - -static ngx_http_module_t ngx_http_v3_filter_module_ctx = { - NULL, /* preconfiguration */ - ngx_http_v3_filter_init, /* postconfiguration */ - - NULL, /* create main configuration */ - NULL, /* init main configuration */ - - NULL, /* create server configuration */ - NULL, /* merge server configuration */ - - NULL, /* create location configuration */ - NULL /* merge location configuration */ -}; - - -ngx_module_t ngx_http_v3_filter_module = { - NGX_MODULE_V1, - &ngx_http_v3_filter_module_ctx, /* module context */ - NULL, /* module directives */ - NGX_HTTP_MODULE, /* module type */ - NULL, /* init master */ - NULL, /* init module */ - NULL, /* init process */ - NULL, /* init thread */ - NULL, /* exit thread */ - NULL, /* exit process */ - NULL, /* exit master */ - NGX_MODULE_V1_PADDING -}; - - -static ngx_http_output_header_filter_pt ngx_http_next_header_filter; -static ngx_http_output_header_filter_pt ngx_http_next_early_hints_filter; -static ngx_http_output_body_filter_pt ngx_http_next_body_filter; - - -static ngx_int_t -ngx_http_v3_header_filter(ngx_http_request_t *r) -{ - u_char *p; - size_t len, n; - ngx_buf_t *b; - ngx_str_t host, location; - ngx_uint_t i, port; - ngx_chain_t *out, *hl, *cl, **ll; - ngx_list_part_t *part; - ngx_table_elt_t *header; - ngx_connection_t *c; - ngx_http_v3_session_t *h3c; - ngx_http_v3_filter_ctx_t *ctx; - ngx_http_core_loc_conf_t *clcf; - ngx_http_core_srv_conf_t *cscf; - u_char addr[NGX_SOCKADDR_STRLEN]; - - if (r->http_version != NGX_HTTP_VERSION_30) { - return ngx_http_next_header_filter(r); - } - - if (r->header_sent) { - return NGX_OK; - } - - r->header_sent = 1; - - if (r != r->main) { - return NGX_OK; - } - - h3c = ngx_http_v3_get_session(r->connection); - - if (r->method == NGX_HTTP_HEAD) { - r->header_only = 1; - } - - if (r->headers_out.last_modified_time != -1) { - if (r->headers_out.status != NGX_HTTP_OK - && r->headers_out.status != NGX_HTTP_PARTIAL_CONTENT - && r->headers_out.status != NGX_HTTP_NOT_MODIFIED) - { - r->headers_out.last_modified_time = -1; - r->headers_out.last_modified = NULL; - } - } - - if (r->headers_out.status == NGX_HTTP_NO_CONTENT) { - r->header_only = 1; - ngx_str_null(&r->headers_out.content_type); - r->headers_out.last_modified_time = -1; - r->headers_out.last_modified = NULL; - r->headers_out.content_length = NULL; - r->headers_out.content_length_n = -1; - } - - if (r->headers_out.status == NGX_HTTP_NOT_MODIFIED) { - r->header_only = 1; - } - - c = r->connection; - - out = NULL; - ll = &out; - - len = ngx_http_v3_encode_field_section_prefix(NULL, 0, 0, 0); - - if (r->headers_out.status == NGX_HTTP_OK) { - len += ngx_http_v3_encode_field_ri(NULL, 0, - NGX_HTTP_V3_HEADER_STATUS_200); - - } else { - len += ngx_http_v3_encode_field_lri(NULL, 0, - NGX_HTTP_V3_HEADER_STATUS_200, - NULL, 3); - } - - clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module); - - if (r->headers_out.server == NULL) { - if (clcf->server_tokens == NGX_HTTP_SERVER_TOKENS_ON) { - n = sizeof(NGINX_VER) - 1; - - } else if (clcf->server_tokens == NGX_HTTP_SERVER_TOKENS_BUILD) { - n = sizeof(NGINX_VER_BUILD) - 1; - - } else { - n = sizeof("nginx") - 1; - } - - len += ngx_http_v3_encode_field_lri(NULL, 0, - NGX_HTTP_V3_HEADER_SERVER, - NULL, n); - } - - if (r->headers_out.date == NULL) { - len += ngx_http_v3_encode_field_lri(NULL, 0, NGX_HTTP_V3_HEADER_DATE, - NULL, ngx_cached_http_time.len); - } - - if (r->headers_out.content_type.len) { - n = r->headers_out.content_type.len; - - if (r->headers_out.content_type_len == r->headers_out.content_type.len - && r->headers_out.charset.len) - { - n += sizeof("; charset=") - 1 + r->headers_out.charset.len; - } - - len += ngx_http_v3_encode_field_lri(NULL, 0, - NGX_HTTP_V3_HEADER_CONTENT_TYPE_TEXT_PLAIN, - NULL, n); - } - - if (r->headers_out.content_length == NULL) { - if (r->headers_out.content_length_n > 0) { - len += ngx_http_v3_encode_field_lri(NULL, 0, - NGX_HTTP_V3_HEADER_CONTENT_LENGTH_ZERO, - NULL, NGX_OFF_T_LEN); - - } else if (r->headers_out.content_length_n == 0) { - len += ngx_http_v3_encode_field_ri(NULL, 0, - NGX_HTTP_V3_HEADER_CONTENT_LENGTH_ZERO); - } - } - - if (r->headers_out.last_modified == NULL - && r->headers_out.last_modified_time != -1) - { - len += ngx_http_v3_encode_field_lri(NULL, 0, - NGX_HTTP_V3_HEADER_LAST_MODIFIED, NULL, - sizeof("Mon, 28 Sep 1970 06:00:00 GMT") - 1); - } - - if (r->headers_out.location && r->headers_out.location->value.len) { - - if (r->headers_out.location->value.data[0] == '/' - && clcf->absolute_redirect) - { - if (clcf->server_name_in_redirect) { - cscf = ngx_http_get_module_srv_conf(r, ngx_http_core_module); - host = cscf->server_name; - - } else if (r->headers_in.server.len) { - host = r->headers_in.server; - - } else { - host.len = NGX_SOCKADDR_STRLEN; - host.data = addr; - - if (ngx_connection_local_sockaddr(c, &host, 0) != NGX_OK) { - return NGX_ERROR; - } - } - - port = ngx_inet_get_port(c->local_sockaddr); - - location.len = sizeof("https://") - 1 + host.len - + r->headers_out.location->value.len; - - if (clcf->port_in_redirect) { - port = (port == 443) ? 0 : port; - - } else { - port = 0; - } - - if (port) { - location.len += sizeof(":65535") - 1; - } - - location.data = ngx_pnalloc(r->pool, location.len); - if (location.data == NULL) { - return NGX_ERROR; - } - - p = ngx_cpymem(location.data, "https://", sizeof("https://") - 1); - p = ngx_cpymem(p, host.data, host.len); - - if (port) { - p = ngx_sprintf(p, ":%ui", port); - } - - p = ngx_cpymem(p, r->headers_out.location->value.data, - r->headers_out.location->value.len); - - /* update r->headers_out.location->value for possible logging */ - - r->headers_out.location->value.len = p - location.data; - r->headers_out.location->value.data = location.data; - ngx_str_set(&r->headers_out.location->key, "Location"); - } - - r->headers_out.location->hash = 0; - - len += ngx_http_v3_encode_field_lri(NULL, 0, - NGX_HTTP_V3_HEADER_LOCATION, NULL, - r->headers_out.location->value.len); - } - -#if (NGX_HTTP_GZIP) - if (r->gzip_vary) { - if (clcf->gzip_vary) { - len += ngx_http_v3_encode_field_ri(NULL, 0, - NGX_HTTP_V3_HEADER_VARY_ACCEPT_ENCODING); - - } else { - r->gzip_vary = 0; - } - } -#endif - - part = &r->headers_out.headers.part; - header = part->elts; - - for (i = 0; /* void */; i++) { - - if (i >= part->nelts) { - if (part->next == NULL) { - break; - } - - part = part->next; - header = part->elts; - i = 0; - } - - if (header[i].hash == 0) { - continue; - } - - len += ngx_http_v3_encode_field_l(NULL, &header[i].key, - &header[i].value); - } - - ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0, "http3 header len:%uz", len); - - b = ngx_create_temp_buf(r->pool, len); - if (b == NULL) { - return NGX_ERROR; - } - - b->last = (u_char *) ngx_http_v3_encode_field_section_prefix(b->last, - 0, 0, 0); - - ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0, - "http3 output header: \":status: %03ui\"", - r->headers_out.status); - - if (r->headers_out.status == NGX_HTTP_OK) { - b->last = (u_char *) ngx_http_v3_encode_field_ri(b->last, 0, - NGX_HTTP_V3_HEADER_STATUS_200); - - } else { - b->last = (u_char *) ngx_http_v3_encode_field_lri(b->last, 0, - NGX_HTTP_V3_HEADER_STATUS_200, - NULL, 3); - b->last = ngx_sprintf(b->last, "%03ui", r->headers_out.status); - } - - if (r->headers_out.server == NULL) { - if (clcf->server_tokens == NGX_HTTP_SERVER_TOKENS_ON) { - p = (u_char *) NGINX_VER; - n = sizeof(NGINX_VER) - 1; - - } else if (clcf->server_tokens == NGX_HTTP_SERVER_TOKENS_BUILD) { - p = (u_char *) NGINX_VER_BUILD; - n = sizeof(NGINX_VER_BUILD) - 1; - - } else { - p = (u_char *) "nginx"; - n = sizeof("nginx") - 1; - } - - ngx_log_debug2(NGX_LOG_DEBUG_HTTP, c->log, 0, - "http3 output header: \"server: %*s\"", n, p); - - b->last = (u_char *) ngx_http_v3_encode_field_lri(b->last, 0, - NGX_HTTP_V3_HEADER_SERVER, - p, n); - } - - if (r->headers_out.date == NULL) { - ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0, - "http3 output header: \"date: %V\"", - &ngx_cached_http_time); - - b->last = (u_char *) ngx_http_v3_encode_field_lri(b->last, 0, - NGX_HTTP_V3_HEADER_DATE, - ngx_cached_http_time.data, - ngx_cached_http_time.len); - } - - if (r->headers_out.content_type.len) { - if (r->headers_out.content_type_len == r->headers_out.content_type.len - && r->headers_out.charset.len) - { - n = r->headers_out.content_type.len + sizeof("; charset=") - 1 - + r->headers_out.charset.len; - - p = ngx_pnalloc(r->pool, n); - if (p == NULL) { - return NGX_ERROR; - } - - p = ngx_cpymem(p, r->headers_out.content_type.data, - r->headers_out.content_type.len); - - p = ngx_cpymem(p, "; charset=", sizeof("; charset=") - 1); - - p = ngx_cpymem(p, r->headers_out.charset.data, - r->headers_out.charset.len); - - /* updated r->headers_out.content_type is also needed for logging */ - - r->headers_out.content_type.len = n; - r->headers_out.content_type.data = p - n; - } - - ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0, - "http3 output header: \"content-type: %V\"", - &r->headers_out.content_type); - - b->last = (u_char *) ngx_http_v3_encode_field_lri(b->last, 0, - NGX_HTTP_V3_HEADER_CONTENT_TYPE_TEXT_PLAIN, - r->headers_out.content_type.data, - r->headers_out.content_type.len); - } - - if (r->headers_out.content_length == NULL - && r->headers_out.content_length_n >= 0) - { - ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0, - "http3 output header: \"content-length: %O\"", - r->headers_out.content_length_n); - - if (r->headers_out.content_length_n > 0) { - p = ngx_sprintf(b->last, "%O", r->headers_out.content_length_n); - n = p - b->last; - - b->last = (u_char *) ngx_http_v3_encode_field_lri(b->last, 0, - NGX_HTTP_V3_HEADER_CONTENT_LENGTH_ZERO, - NULL, n); - - b->last = ngx_sprintf(b->last, "%O", - r->headers_out.content_length_n); - - } else { - b->last = (u_char *) ngx_http_v3_encode_field_ri(b->last, 0, - NGX_HTTP_V3_HEADER_CONTENT_LENGTH_ZERO); - } - } - - if (r->headers_out.last_modified == NULL - && r->headers_out.last_modified_time != -1) - { - n = sizeof("Mon, 28 Sep 1970 06:00:00 GMT") - 1; - - p = ngx_pnalloc(r->pool, n); - if (p == NULL) { - return NGX_ERROR; - } - - ngx_http_time(p, r->headers_out.last_modified_time); - - ngx_log_debug2(NGX_LOG_DEBUG_HTTP, c->log, 0, - "http3 output header: \"last-modified: %*s\"", n, p); - - b->last = (u_char *) ngx_http_v3_encode_field_lri(b->last, 0, - NGX_HTTP_V3_HEADER_LAST_MODIFIED, - p, n); - } - - if (r->headers_out.location && r->headers_out.location->value.len) { - ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0, - "http3 output header: \"location: %V\"", - &r->headers_out.location->value); - - b->last = (u_char *) ngx_http_v3_encode_field_lri(b->last, 0, - NGX_HTTP_V3_HEADER_LOCATION, - r->headers_out.location->value.data, - r->headers_out.location->value.len); - } - -#if (NGX_HTTP_GZIP) - if (r->gzip_vary) { - ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0, - "http3 output header: \"vary: Accept-Encoding\""); - - b->last = (u_char *) ngx_http_v3_encode_field_ri(b->last, 0, - NGX_HTTP_V3_HEADER_VARY_ACCEPT_ENCODING); - } -#endif - - part = &r->headers_out.headers.part; - header = part->elts; - - for (i = 0; /* void */; i++) { - - if (i >= part->nelts) { - if (part->next == NULL) { - break; - } - - part = part->next; - header = part->elts; - i = 0; - } - - if (header[i].hash == 0) { - continue; - } - - ngx_log_debug2(NGX_LOG_DEBUG_HTTP, c->log, 0, - "http3 output header: \"%V: %V\"", - &header[i].key, &header[i].value); - - b->last = (u_char *) ngx_http_v3_encode_field_l(b->last, - &header[i].key, - &header[i].value); - } - - if (r->header_only) { - b->last_buf = 1; - } - - cl = ngx_alloc_chain_link(r->pool); - if (cl == NULL) { - return NGX_ERROR; - } - - cl->buf = b; - cl->next = NULL; - - n = b->last - b->pos; - - h3c->payload_bytes += n; - - len = ngx_http_v3_encode_varlen_int(NULL, NGX_HTTP_V3_FRAME_HEADERS) - + ngx_http_v3_encode_varlen_int(NULL, n); - - b = ngx_create_temp_buf(r->pool, len); - if (b == NULL) { - return NGX_ERROR; - } - - b->last = (u_char *) ngx_http_v3_encode_varlen_int(b->last, - NGX_HTTP_V3_FRAME_HEADERS); - b->last = (u_char *) ngx_http_v3_encode_varlen_int(b->last, n); - - hl = ngx_alloc_chain_link(r->pool); - if (hl == NULL) { - return NGX_ERROR; - } - - hl->buf = b; - hl->next = cl; - - *ll = hl; - ll = &cl->next; - - if (r->headers_out.content_length_n >= 0 - && !r->header_only && !r->expect_trailers) - { - len = ngx_http_v3_encode_varlen_int(NULL, NGX_HTTP_V3_FRAME_DATA) - + ngx_http_v3_encode_varlen_int(NULL, - r->headers_out.content_length_n); - - b = ngx_create_temp_buf(r->pool, len); - if (b == NULL) { - return NGX_ERROR; - } - - b->last = (u_char *) ngx_http_v3_encode_varlen_int(b->last, - NGX_HTTP_V3_FRAME_DATA); - b->last = (u_char *) ngx_http_v3_encode_varlen_int(b->last, - r->headers_out.content_length_n); - - h3c->payload_bytes += r->headers_out.content_length_n; - h3c->total_bytes += r->headers_out.content_length_n; - - cl = ngx_alloc_chain_link(r->pool); - if (cl == NULL) { - return NGX_ERROR; - } - - cl->buf = b; - cl->next = NULL; - - *ll = cl; - - } else { - ctx = ngx_pcalloc(r->pool, sizeof(ngx_http_v3_filter_ctx_t)); - if (ctx == NULL) { - return NGX_ERROR; - } - - ngx_http_set_ctx(r, ctx, ngx_http_v3_filter_module); - } - - for (cl = out; cl; cl = cl->next) { - h3c->total_bytes += cl->buf->last - cl->buf->pos; - r->header_size += cl->buf->last - cl->buf->pos; - } - - return ngx_http_write_filter(r, out); -} - - -static ngx_int_t -ngx_http_v3_early_hints_filter(ngx_http_request_t *r) -{ - size_t len, n; - ngx_buf_t *b; - ngx_uint_t i; - ngx_chain_t *out, *hl, *cl; - ngx_list_part_t *part; - ngx_table_elt_t *header; - ngx_http_v3_session_t *h3c; - - if (r->http_version != NGX_HTTP_VERSION_30) { - return ngx_http_next_early_hints_filter(r); - } - - if (r != r->main) { - return NGX_OK; - } - - len = 0; - - part = &r->headers_out.headers.part; - header = part->elts; - - for (i = 0; /* void */; i++) { - - if (i >= part->nelts) { - if (part->next == NULL) { - break; - } - - part = part->next; - header = part->elts; - i = 0; - } - - if (header[i].hash == 0) { - continue; - } - - len += ngx_http_v3_encode_field_l(NULL, &header[i].key, - &header[i].value); - } - - if (len == 0) { - return NGX_OK; - } - - len += ngx_http_v3_encode_field_section_prefix(NULL, 0, 0, 0); - - len += ngx_http_v3_encode_field_ri(NULL, 0, NGX_HTTP_V3_HEADER_STATUS_103); - - ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "http3 header len:%uz", len); - - b = ngx_create_temp_buf(r->pool, len); - if (b == NULL) { - return NGX_ERROR; - } - - b->last = (u_char *) ngx_http_v3_encode_field_section_prefix(b->last, - 0, 0, 0); - - ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "http3 output header: \":status: %03ui\"", - (ngx_uint_t) NGX_HTTP_EARLY_HINTS); - - b->last = (u_char *) ngx_http_v3_encode_field_ri(b->last, 0, - NGX_HTTP_V3_HEADER_STATUS_103); - - part = &r->headers_out.headers.part; - header = part->elts; - - for (i = 0; /* void */; i++) { - - if (i >= part->nelts) { - if (part->next == NULL) { - break; - } - - part = part->next; - header = part->elts; - i = 0; - } - - if (header[i].hash == 0) { - continue; - } - - ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "http3 output header: \"%V: %V\"", - &header[i].key, &header[i].value); - - b->last = (u_char *) ngx_http_v3_encode_field_l(b->last, - &header[i].key, - &header[i].value); - } - - b->flush = 1; - - cl = ngx_alloc_chain_link(r->pool); - if (cl == NULL) { - return NGX_ERROR; - } - - cl->buf = b; - cl->next = NULL; - - n = b->last - b->pos; - - h3c = ngx_http_v3_get_session(r->connection); - h3c->payload_bytes += n; - - len = ngx_http_v3_encode_varlen_int(NULL, NGX_HTTP_V3_FRAME_HEADERS) - + ngx_http_v3_encode_varlen_int(NULL, n); - - b = ngx_create_temp_buf(r->pool, len); - if (b == NULL) { - return NGX_ERROR; - } - - b->last = (u_char *) ngx_http_v3_encode_varlen_int(b->last, - NGX_HTTP_V3_FRAME_HEADERS); - b->last = (u_char *) ngx_http_v3_encode_varlen_int(b->last, n); - - hl = ngx_alloc_chain_link(r->pool); - if (hl == NULL) { - return NGX_ERROR; - } - - hl->buf = b; - hl->next = cl; - - out = hl; - - for (cl = out; cl; cl = cl->next) { - h3c->total_bytes += cl->buf->last - cl->buf->pos; - r->header_size += cl->buf->last - cl->buf->pos; - } - - return ngx_http_write_filter(r, out); -} - - -static ngx_int_t -ngx_http_v3_body_filter(ngx_http_request_t *r, ngx_chain_t *in) -{ - u_char *chunk; - off_t size; - ngx_int_t rc; - ngx_buf_t *b; - ngx_chain_t *out, *cl, *tl, **ll; - ngx_http_v3_session_t *h3c; - ngx_http_v3_filter_ctx_t *ctx; - - if (in == NULL) { - return ngx_http_next_body_filter(r, in); - } - - ctx = ngx_http_get_module_ctx(r, ngx_http_v3_filter_module); - if (ctx == NULL) { - return ngx_http_next_body_filter(r, in); - } - - h3c = ngx_http_v3_get_session(r->connection); - - out = NULL; - ll = &out; - - size = 0; - cl = in; - - for ( ;; ) { - ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "http3 chunk: %O", ngx_buf_size(cl->buf)); - - size += ngx_buf_size(cl->buf); - - if (cl->buf->flush - || cl->buf->sync - || ngx_buf_in_memory(cl->buf) - || cl->buf->in_file) - { - tl = ngx_alloc_chain_link(r->pool); - if (tl == NULL) { - return NGX_ERROR; - } - - tl->buf = cl->buf; - *ll = tl; - ll = &tl->next; - } - - if (cl->next == NULL) { - break; - } - - cl = cl->next; - } - - if (size) { - tl = ngx_chain_get_free_buf(r->pool, &ctx->free); - if (tl == NULL) { - return NGX_ERROR; - } - - b = tl->buf; - chunk = b->start; - - if (chunk == NULL) { - chunk = ngx_palloc(r->pool, NGX_HTTP_V3_VARLEN_INT_LEN * 2); - if (chunk == NULL) { - return NGX_ERROR; - } - - b->start = chunk; - b->end = chunk + NGX_HTTP_V3_VARLEN_INT_LEN * 2; - } - - b->tag = (ngx_buf_tag_t) &ngx_http_v3_filter_module; - b->memory = 0; - b->temporary = 1; - b->pos = chunk; - - b->last = (u_char *) ngx_http_v3_encode_varlen_int(chunk, - NGX_HTTP_V3_FRAME_DATA); - b->last = (u_char *) ngx_http_v3_encode_varlen_int(b->last, size); - - tl->next = out; - out = tl; - - h3c->payload_bytes += size; - } - - if (cl->buf->last_buf) { - tl = ngx_http_v3_create_trailers(r, ctx); - if (tl == NULL) { - return NGX_ERROR; - } - - cl->buf->last_buf = 0; - - *ll = tl; - - } else { - *ll = NULL; - } - - for (cl = out; cl; cl = cl->next) { - h3c->total_bytes += cl->buf->last - cl->buf->pos; - } - - rc = ngx_http_next_body_filter(r, out); - - ngx_chain_update_chains(r->pool, &ctx->free, &ctx->busy, &out, - (ngx_buf_tag_t) &ngx_http_v3_filter_module); - - return rc; -} - - -static ngx_chain_t * -ngx_http_v3_create_trailers(ngx_http_request_t *r, - ngx_http_v3_filter_ctx_t *ctx) -{ - size_t len, n; - u_char *p; - ngx_buf_t *b; - ngx_uint_t i; - ngx_chain_t *cl, *hl; - ngx_list_part_t *part; - ngx_table_elt_t *header; - ngx_http_v3_session_t *h3c; - - h3c = ngx_http_v3_get_session(r->connection); - - len = 0; - - part = &r->headers_out.trailers.part; - header = part->elts; - - for (i = 0; /* void */; i++) { - - if (i >= part->nelts) { - if (part->next == NULL) { - break; - } - - part = part->next; - header = part->elts; - i = 0; - } - - if (header[i].hash == 0) { - continue; - } - - len += ngx_http_v3_encode_field_l(NULL, &header[i].key, - &header[i].value); - } - - cl = ngx_chain_get_free_buf(r->pool, &ctx->free); - if (cl == NULL) { - return NULL; - } - - b = cl->buf; - - b->tag = (ngx_buf_tag_t) &ngx_http_v3_filter_module; - b->memory = 0; - b->last_buf = 1; - - if (len == 0) { - b->temporary = 0; - b->pos = b->last = NULL; - return cl; - } - - b->temporary = 1; - - len += ngx_http_v3_encode_field_section_prefix(NULL, 0, 0, 0); - - b->pos = ngx_palloc(r->pool, len); - if (b->pos == NULL) { - return NULL; - } - - b->last = (u_char *) ngx_http_v3_encode_field_section_prefix(b->pos, - 0, 0, 0); - - part = &r->headers_out.trailers.part; - header = part->elts; - - for (i = 0; /* void */; i++) { - - if (i >= part->nelts) { - if (part->next == NULL) { - break; - } - - part = part->next; - header = part->elts; - i = 0; - } - - if (header[i].hash == 0) { - continue; - } - - ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "http3 output trailer: \"%V: %V\"", - &header[i].key, &header[i].value); - - b->last = (u_char *) ngx_http_v3_encode_field_l(b->last, - &header[i].key, - &header[i].value); - } - - n = b->last - b->pos; - - h3c->payload_bytes += n; - - hl = ngx_chain_get_free_buf(r->pool, &ctx->free); - if (hl == NULL) { - return NULL; - } - - b = hl->buf; - p = b->start; - - if (p == NULL) { - p = ngx_palloc(r->pool, NGX_HTTP_V3_VARLEN_INT_LEN * 2); - if (p == NULL) { - return NULL; - } - - b->start = p; - b->end = p + NGX_HTTP_V3_VARLEN_INT_LEN * 2; - } - - b->tag = (ngx_buf_tag_t) &ngx_http_v3_filter_module; - b->memory = 0; - b->temporary = 1; - b->pos = p; - - b->last = (u_char *) ngx_http_v3_encode_varlen_int(p, - NGX_HTTP_V3_FRAME_HEADERS); - b->last = (u_char *) ngx_http_v3_encode_varlen_int(b->last, n); - - hl->next = cl; - - return hl; -} - - -static ngx_int_t -ngx_http_v3_filter_init(ngx_conf_t *cf) -{ - ngx_http_next_header_filter = ngx_http_top_header_filter; - ngx_http_top_header_filter = ngx_http_v3_header_filter; - - ngx_http_next_early_hints_filter = ngx_http_top_early_hints_filter; - ngx_http_top_early_hints_filter = ngx_http_v3_early_hints_filter; - - ngx_http_next_body_filter = ngx_http_top_body_filter; - ngx_http_top_body_filter = ngx_http_v3_body_filter; - - return NGX_OK; -} diff --git a/src/deps/src/nginx-1.30.3/src/http/v3/ngx_http_v3_module.c b/src/deps/src/nginx-1.30.3/src/http/v3/ngx_http_v3_module.c deleted file mode 100644 index 139bd65f3d..0000000000 --- a/src/deps/src/nginx-1.30.3/src/http/v3/ngx_http_v3_module.c +++ /dev/null @@ -1,393 +0,0 @@ - -/* - * Copyright (C) Nginx, Inc. - * Copyright (C) Roman Arutyunyan - */ - - -#include -#include -#include - - -static ngx_int_t ngx_http_v3_variable(ngx_http_request_t *r, - ngx_http_variable_value_t *v, uintptr_t data); -static ngx_int_t ngx_http_v3_add_variables(ngx_conf_t *cf); -static void *ngx_http_v3_create_srv_conf(ngx_conf_t *cf); -static char *ngx_http_v3_merge_srv_conf(ngx_conf_t *cf, void *parent, - void *child); -static char *ngx_http_quic_host_key(ngx_conf_t *cf, ngx_command_t *cmd, - void *conf); - - -static ngx_command_t ngx_http_v3_commands[] = { - - { ngx_string("http3"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_FLAG, - ngx_conf_set_flag_slot, - NGX_HTTP_SRV_CONF_OFFSET, - offsetof(ngx_http_v3_srv_conf_t, enable), - NULL }, - - { ngx_string("http3_hq"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_FLAG, - ngx_conf_set_flag_slot, - NGX_HTTP_SRV_CONF_OFFSET, - offsetof(ngx_http_v3_srv_conf_t, enable_hq), - NULL }, - - { ngx_string("http3_max_concurrent_streams"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_TAKE1, - ngx_conf_set_num_slot, - NGX_HTTP_SRV_CONF_OFFSET, - offsetof(ngx_http_v3_srv_conf_t, max_concurrent_streams), - NULL }, - - { ngx_string("http3_stream_buffer_size"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_TAKE1, - ngx_conf_set_size_slot, - NGX_HTTP_SRV_CONF_OFFSET, - offsetof(ngx_http_v3_srv_conf_t, quic.stream_buffer_size), - NULL }, - - { ngx_string("quic_retry"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_FLAG, - ngx_conf_set_flag_slot, - NGX_HTTP_SRV_CONF_OFFSET, - offsetof(ngx_http_v3_srv_conf_t, quic.retry), - NULL }, - - { ngx_string("quic_gso"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_FLAG, - ngx_conf_set_flag_slot, - NGX_HTTP_SRV_CONF_OFFSET, - offsetof(ngx_http_v3_srv_conf_t, quic.gso_enabled), - NULL }, - - { ngx_string("quic_host_key"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_TAKE1, - ngx_http_quic_host_key, - NGX_HTTP_SRV_CONF_OFFSET, - 0, - NULL }, - - { ngx_string("quic_active_connection_id_limit"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_TAKE1, - ngx_conf_set_num_slot, - NGX_HTTP_SRV_CONF_OFFSET, - offsetof(ngx_http_v3_srv_conf_t, quic.active_connection_id_limit), - NULL }, - - ngx_null_command -}; - - -static ngx_http_module_t ngx_http_v3_module_ctx = { - ngx_http_v3_add_variables, /* preconfiguration */ - NULL, /* postconfiguration */ - - NULL, /* create main configuration */ - NULL, /* init main configuration */ - - ngx_http_v3_create_srv_conf, /* create server configuration */ - ngx_http_v3_merge_srv_conf, /* merge server configuration */ - - NULL, /* create location configuration */ - NULL /* merge location configuration */ -}; - - -ngx_module_t ngx_http_v3_module = { - NGX_MODULE_V1, - &ngx_http_v3_module_ctx, /* module context */ - ngx_http_v3_commands, /* module directives */ - NGX_HTTP_MODULE, /* module type */ - NULL, /* init master */ - NULL, /* init module */ - NULL, /* init process */ - NULL, /* init thread */ - NULL, /* exit thread */ - NULL, /* exit process */ - NULL, /* exit master */ - NGX_MODULE_V1_PADDING -}; - - -static ngx_http_variable_t ngx_http_v3_vars[] = { - - { ngx_string("http3"), NULL, ngx_http_v3_variable, 0, 0, 0 }, - - ngx_http_null_variable -}; - -static ngx_str_t ngx_http_quic_salt = ngx_string("ngx_quic"); - - -static ngx_int_t -ngx_http_v3_variable(ngx_http_request_t *r, - ngx_http_variable_value_t *v, uintptr_t data) -{ - ngx_http_v3_session_t *h3c; - - if (r->connection->quic) { - h3c = ngx_http_v3_get_session(r->connection); - - if (h3c->hq) { - v->len = sizeof("hq") - 1; - v->valid = 1; - v->no_cacheable = 0; - v->not_found = 0; - v->data = (u_char *) "hq"; - - return NGX_OK; - } - - v->len = sizeof("h3") - 1; - v->valid = 1; - v->no_cacheable = 0; - v->not_found = 0; - v->data = (u_char *) "h3"; - - return NGX_OK; - } - - *v = ngx_http_variable_null_value; - - return NGX_OK; -} - - -static ngx_int_t -ngx_http_v3_add_variables(ngx_conf_t *cf) -{ - ngx_http_variable_t *var, *v; - - for (v = ngx_http_v3_vars; v->name.len; v++) { - var = ngx_http_add_variable(cf, &v->name, v->flags); - if (var == NULL) { - return NGX_ERROR; - } - - var->get_handler = v->get_handler; - var->data = v->data; - } - - return NGX_OK; -} - - -static void * -ngx_http_v3_create_srv_conf(ngx_conf_t *cf) -{ - ngx_http_v3_srv_conf_t *h3scf; - - h3scf = ngx_pcalloc(cf->pool, sizeof(ngx_http_v3_srv_conf_t)); - if (h3scf == NULL) { - return NULL; - } - - /* - * set by ngx_pcalloc(): - * - * h3scf->quic.host_key = { 0, NULL } - * h3scf->quic.stream_reject_code_uni = 0; - * h3scf->quic.disable_active_migration = 0; - * h3scf->quic.idle_timeout = 0; - * h3scf->max_blocked_streams = 0; - */ - - h3scf->enable = NGX_CONF_UNSET; - h3scf->enable_hq = NGX_CONF_UNSET; - h3scf->max_table_capacity = NGX_HTTP_V3_MAX_TABLE_CAPACITY; - h3scf->max_concurrent_streams = NGX_CONF_UNSET_UINT; - - h3scf->quic.stream_buffer_size = NGX_CONF_UNSET_SIZE; - h3scf->quic.max_concurrent_streams_bidi = NGX_CONF_UNSET_UINT; - h3scf->quic.max_concurrent_streams_uni = NGX_HTTP_V3_MAX_UNI_STREAMS; - h3scf->quic.retry = NGX_CONF_UNSET; - h3scf->quic.gso_enabled = NGX_CONF_UNSET; - h3scf->quic.stream_close_code = NGX_HTTP_V3_ERR_NO_ERROR; - h3scf->quic.stream_reject_code_bidi = NGX_HTTP_V3_ERR_REQUEST_REJECTED; - h3scf->quic.active_connection_id_limit = NGX_CONF_UNSET_UINT; - - h3scf->quic.init = ngx_http_v3_init; - h3scf->quic.shutdown = ngx_http_v3_shutdown; - - return h3scf; -} - - -static char * -ngx_http_v3_merge_srv_conf(ngx_conf_t *cf, void *parent, void *child) -{ - ngx_http_v3_srv_conf_t *prev = parent; - ngx_http_v3_srv_conf_t *conf = child; - - ngx_http_ssl_srv_conf_t *sscf; - ngx_http_core_srv_conf_t *cscf; - - ngx_conf_merge_value(conf->enable, prev->enable, 1); - - ngx_conf_merge_value(conf->enable_hq, prev->enable_hq, 0); - - ngx_conf_merge_uint_value(conf->max_concurrent_streams, - prev->max_concurrent_streams, 128); - - conf->max_blocked_streams = conf->max_concurrent_streams; - - ngx_conf_merge_size_value(conf->quic.stream_buffer_size, - prev->quic.stream_buffer_size, - 65536); - - conf->quic.max_concurrent_streams_bidi = conf->max_concurrent_streams; - - ngx_conf_merge_value(conf->quic.retry, prev->quic.retry, 0); - ngx_conf_merge_value(conf->quic.gso_enabled, prev->quic.gso_enabled, 0); - - ngx_conf_merge_str_value(conf->quic.host_key, prev->quic.host_key, ""); - - ngx_conf_merge_uint_value(conf->quic.active_connection_id_limit, - prev->quic.active_connection_id_limit, - 2); - - if (conf->quic.host_key.len == 0) { - - conf->quic.host_key.len = NGX_QUIC_DEFAULT_HOST_KEY_LEN; - conf->quic.host_key.data = ngx_palloc(cf->pool, - conf->quic.host_key.len); - if (conf->quic.host_key.data == NULL) { - return NGX_CONF_ERROR; - } - - if (RAND_bytes(conf->quic.host_key.data, NGX_QUIC_DEFAULT_HOST_KEY_LEN) - <= 0) - { - return NGX_CONF_ERROR; - } - } - - if (ngx_quic_derive_key(cf->log, "av_token_key", - &conf->quic.host_key, &ngx_http_quic_salt, - conf->quic.av_token_key, NGX_QUIC_AV_KEY_LEN) - != NGX_OK) - { - return NGX_CONF_ERROR; - } - - if (ngx_quic_derive_key(cf->log, "sr_token_key", - &conf->quic.host_key, &ngx_http_quic_salt, - conf->quic.sr_token_key, NGX_QUIC_SR_KEY_LEN) - != NGX_OK) - { - return NGX_CONF_ERROR; - } - - cscf = ngx_http_conf_get_module_srv_conf(cf, ngx_http_core_module); - conf->quic.handshake_timeout = cscf->client_header_timeout; - - sscf = ngx_http_conf_get_module_srv_conf(cf, ngx_http_ssl_module); - conf->quic.ssl = &sscf->ssl; - - return NGX_CONF_OK; -} - - -static char * -ngx_http_quic_host_key(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) -{ - ngx_http_v3_srv_conf_t *h3scf = conf; - - u_char *buf; - size_t size; - ssize_t n; - ngx_str_t *value; - ngx_file_t file; - ngx_file_info_t fi; - ngx_quic_conf_t *qcf; - - qcf = &h3scf->quic; - - if (qcf->host_key.len) { - return "is duplicate"; - } - - buf = NULL; -#if (NGX_SUPPRESS_WARN) - size = 0; -#endif - - value = cf->args->elts; - - if (ngx_conf_full_name(cf->cycle, &value[1], 1) != NGX_OK) { - return NGX_CONF_ERROR; - } - - ngx_memzero(&file, sizeof(ngx_file_t)); - file.name = value[1]; - file.log = cf->log; - - file.fd = ngx_open_file(file.name.data, NGX_FILE_RDONLY, NGX_FILE_OPEN, 0); - - if (file.fd == NGX_INVALID_FILE) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, ngx_errno, - ngx_open_file_n " \"%V\" failed", &file.name); - return NGX_CONF_ERROR; - } - - if (ngx_fd_info(file.fd, &fi) == NGX_FILE_ERROR) { - ngx_conf_log_error(NGX_LOG_CRIT, cf, ngx_errno, - ngx_fd_info_n " \"%V\" failed", &file.name); - goto failed; - } - - size = ngx_file_size(&fi); - - if (size == 0) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "\"%V\" zero key size", &file.name); - goto failed; - } - - buf = ngx_pnalloc(cf->pool, size); - if (buf == NULL) { - goto failed; - } - - n = ngx_read_file(&file, buf, size, 0); - - if (n == NGX_ERROR) { - ngx_conf_log_error(NGX_LOG_CRIT, cf, ngx_errno, - ngx_read_file_n " \"%V\" failed", &file.name); - goto failed; - } - - if ((size_t) n != size) { - ngx_conf_log_error(NGX_LOG_CRIT, cf, 0, - ngx_read_file_n " \"%V\" returned only " - "%z bytes instead of %uz", &file.name, n, size); - goto failed; - } - - qcf->host_key.data = buf; - qcf->host_key.len = n; - - if (ngx_close_file(file.fd) == NGX_FILE_ERROR) { - ngx_log_error(NGX_LOG_ALERT, cf->log, ngx_errno, - ngx_close_file_n " \"%V\" failed", &file.name); - } - - return NGX_CONF_OK; - -failed: - - if (ngx_close_file(file.fd) == NGX_FILE_ERROR) { - ngx_log_error(NGX_LOG_ALERT, cf->log, ngx_errno, - ngx_close_file_n " \"%V\" failed", &file.name); - } - - if (buf) { - ngx_explicit_memzero(buf, size); - } - - return NGX_CONF_ERROR; -} diff --git a/src/deps/src/nginx-1.30.3/src/http/v3/ngx_http_v3_parse.c b/src/deps/src/nginx-1.30.3/src/http/v3/ngx_http_v3_parse.c deleted file mode 100644 index bcbf0dbe12..0000000000 --- a/src/deps/src/nginx-1.30.3/src/http/v3/ngx_http_v3_parse.c +++ /dev/null @@ -1,1942 +0,0 @@ - -/* - * Copyright (C) Roman Arutyunyan - * Copyright (C) Nginx, Inc. - */ - - -#include -#include -#include - - -#define ngx_http_v3_is_v2_frame(type) \ - ((type) == 0x02 || (type) == 0x06 || (type) == 0x08 || (type) == 0x09) - - -static void ngx_http_v3_parse_start_local(ngx_buf_t *b, ngx_buf_t *loc, - ngx_uint_t n); -static void ngx_http_v3_parse_end_local(ngx_buf_t *b, ngx_buf_t *loc, - ngx_uint_t *n); -static ngx_int_t ngx_http_v3_parse_skip(ngx_buf_t *b, ngx_uint_t *length); - -static ngx_int_t ngx_http_v3_parse_varlen_int(ngx_connection_t *c, - ngx_http_v3_parse_varlen_int_t *st, ngx_buf_t *b); -static ngx_int_t ngx_http_v3_parse_prefix_int(ngx_connection_t *c, - ngx_http_v3_parse_prefix_int_t *st, ngx_uint_t prefix, ngx_buf_t *b); - -static ngx_int_t ngx_http_v3_parse_field_section_prefix(ngx_connection_t *c, - ngx_http_v3_parse_field_section_prefix_t *st, ngx_buf_t *b); -static ngx_int_t ngx_http_v3_parse_field_rep(ngx_connection_t *c, - ngx_http_v3_parse_field_rep_t *st, ngx_uint_t base, ngx_buf_t *b); -static ngx_int_t ngx_http_v3_parse_literal(ngx_connection_t *c, - ngx_http_v3_parse_literal_t *st, ngx_buf_t *b); -static ngx_int_t ngx_http_v3_parse_field_ri(ngx_connection_t *c, - ngx_http_v3_parse_field_t *st, ngx_buf_t *b); -static ngx_int_t ngx_http_v3_parse_field_lri(ngx_connection_t *c, - ngx_http_v3_parse_field_t *st, ngx_buf_t *b); -static ngx_int_t ngx_http_v3_parse_field_l(ngx_connection_t *c, - ngx_http_v3_parse_field_t *st, ngx_buf_t *b); -static ngx_int_t ngx_http_v3_parse_field_pbi(ngx_connection_t *c, - ngx_http_v3_parse_field_t *st, ngx_buf_t *b); -static ngx_int_t ngx_http_v3_parse_field_lpbi(ngx_connection_t *c, - ngx_http_v3_parse_field_t *st, ngx_buf_t *b); - -static ngx_int_t ngx_http_v3_parse_control(ngx_connection_t *c, - ngx_http_v3_parse_control_t *st, ngx_buf_t *b); -static ngx_int_t ngx_http_v3_parse_settings(ngx_connection_t *c, - ngx_http_v3_parse_settings_t *st, ngx_buf_t *b); - -static ngx_int_t ngx_http_v3_parse_encoder(ngx_connection_t *c, - ngx_http_v3_parse_encoder_t *st, ngx_buf_t *b); -static ngx_int_t ngx_http_v3_parse_field_inr(ngx_connection_t *c, - ngx_http_v3_parse_field_t *st, ngx_buf_t *b); -static ngx_int_t ngx_http_v3_parse_field_iln(ngx_connection_t *c, - ngx_http_v3_parse_field_t *st, ngx_buf_t *b); - -static ngx_int_t ngx_http_v3_parse_decoder(ngx_connection_t *c, - ngx_http_v3_parse_decoder_t *st, ngx_buf_t *b); - -static ngx_int_t ngx_http_v3_parse_lookup(ngx_connection_t *c, - ngx_uint_t dynamic, ngx_uint_t index, ngx_str_t *name, ngx_str_t *value); - - -static void -ngx_http_v3_parse_start_local(ngx_buf_t *b, ngx_buf_t *loc, ngx_uint_t n) -{ - *loc = *b; - - if ((size_t) (loc->last - loc->pos) > n) { - loc->last = loc->pos + n; - } -} - - -static void -ngx_http_v3_parse_end_local(ngx_buf_t *b, ngx_buf_t *loc, ngx_uint_t *pn) -{ - *pn -= loc->pos - b->pos; - b->pos = loc->pos; -} - - -static ngx_int_t -ngx_http_v3_parse_skip(ngx_buf_t *b, ngx_uint_t *length) -{ - if ((size_t) (b->last - b->pos) < *length) { - *length -= b->last - b->pos; - b->pos = b->last; - return NGX_AGAIN; - } - - b->pos += *length; - return NGX_DONE; -} - - -static ngx_int_t -ngx_http_v3_parse_varlen_int(ngx_connection_t *c, - ngx_http_v3_parse_varlen_int_t *st, ngx_buf_t *b) -{ - u_char ch; - enum { - sw_start = 0, - sw_length_2, - sw_length_3, - sw_length_4, - sw_length_5, - sw_length_6, - sw_length_7, - sw_length_8 - }; - - for ( ;; ) { - - if (b->pos == b->last) { - return NGX_AGAIN; - } - - ch = *b->pos++; - - switch (st->state) { - - case sw_start: - - st->value = ch; - if (st->value & 0xc0) { - st->state = sw_length_2; - break; - } - - goto done; - - case sw_length_2: - - st->value = (st->value << 8) + ch; - if ((st->value & 0xc000) == 0x4000) { - st->value &= 0x3fff; - goto done; - } - - st->state = sw_length_3; - break; - - case sw_length_4: - - st->value = (st->value << 8) + ch; - if ((st->value & 0xc0000000) == 0x80000000) { - st->value &= 0x3fffffff; - goto done; - } - - st->state = sw_length_5; - break; - - case sw_length_3: - case sw_length_5: - case sw_length_6: - case sw_length_7: - - st->value = (st->value << 8) + ch; - st->state++; - break; - - case sw_length_8: - - st->value = (st->value << 8) + ch; - st->value &= 0x3fffffffffffffff; - goto done; - } - } - -done: - - ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0, - "http3 parse varlen int %uL", st->value); - - st->state = sw_start; - return NGX_DONE; -} - - -static ngx_int_t -ngx_http_v3_parse_prefix_int(ngx_connection_t *c, - ngx_http_v3_parse_prefix_int_t *st, ngx_uint_t prefix, ngx_buf_t *b) -{ - u_char ch; - ngx_uint_t mask; - enum { - sw_start = 0, - sw_value - }; - - for ( ;; ) { - - if (b->pos == b->last) { - return NGX_AGAIN; - } - - ch = *b->pos++; - - switch (st->state) { - - case sw_start: - - mask = (1 << prefix) - 1; - st->value = ch & mask; - - if (st->value != mask) { - goto done; - } - - st->shift = 0; - st->state = sw_value; - break; - - case sw_value: - - st->value += (uint64_t) (ch & 0x7f) << st->shift; - - if (st->shift == 56 - && ((ch & 0x80) || (st->value & 0xc000000000000000))) - { - ngx_log_error(NGX_LOG_INFO, c->log, 0, - "client exceeded integer size limit"); - return NGX_HTTP_V3_ERR_EXCESSIVE_LOAD; - } - - if (ch & 0x80) { - st->shift += 7; - break; - } - - goto done; - } - } - -done: - - ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0, - "http3 parse prefix int %uL", st->value); - - st->state = sw_start; - return NGX_DONE; -} - - -ngx_int_t -ngx_http_v3_parse_headers(ngx_connection_t *c, ngx_http_v3_parse_headers_t *st, - ngx_buf_t *b) -{ - ngx_buf_t loc; - ngx_int_t rc; - enum { - sw_start = 0, - sw_type, - sw_length, - sw_skip, - sw_prefix, - sw_verify, - sw_field_rep, - sw_done - }; - - for ( ;; ) { - - switch (st->state) { - - case sw_start: - - ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0, - "http3 parse headers"); - - st->state = sw_type; - - /* fall through */ - - case sw_type: - - rc = ngx_http_v3_parse_varlen_int(c, &st->vlint, b); - if (rc != NGX_DONE) { - return rc; - } - - st->type = st->vlint.value; - - if (ngx_http_v3_is_v2_frame(st->type) - || st->type == NGX_HTTP_V3_FRAME_DATA - || st->type == NGX_HTTP_V3_FRAME_GOAWAY - || st->type == NGX_HTTP_V3_FRAME_SETTINGS - || st->type == NGX_HTTP_V3_FRAME_MAX_PUSH_ID - || st->type == NGX_HTTP_V3_FRAME_CANCEL_PUSH - || st->type == NGX_HTTP_V3_FRAME_PUSH_PROMISE) - { - return NGX_HTTP_V3_ERR_FRAME_UNEXPECTED; - } - - st->state = sw_length; - break; - - case sw_length: - - rc = ngx_http_v3_parse_varlen_int(c, &st->vlint, b); - if (rc != NGX_DONE) { - return rc; - } - - st->length = st->vlint.value; - - ngx_log_debug2(NGX_LOG_DEBUG_HTTP, c->log, 0, - "http3 parse headers type:%ui, len:%ui", - st->type, st->length); - - if (st->type != NGX_HTTP_V3_FRAME_HEADERS) { - st->state = st->length > 0 ? sw_skip : sw_type; - break; - } - - if (st->length == 0) { - return NGX_HTTP_V3_ERR_FRAME_ERROR; - } - - st->state = sw_prefix; - break; - - case sw_skip: - - rc = ngx_http_v3_parse_skip(b, &st->length); - if (rc != NGX_DONE) { - return rc; - } - - st->state = sw_type; - break; - - case sw_prefix: - - ngx_http_v3_parse_start_local(b, &loc, st->length); - - rc = ngx_http_v3_parse_field_section_prefix(c, &st->prefix, &loc); - - ngx_http_v3_parse_end_local(b, &loc, &st->length); - - if (st->length == 0 && rc == NGX_AGAIN) { - return NGX_HTTP_V3_ERR_FRAME_ERROR; - } - - if (rc != NGX_DONE) { - return rc; - } - - st->state = sw_verify; - break; - - case sw_verify: - - rc = ngx_http_v3_check_insert_count(c, st->prefix.insert_count); - if (rc != NGX_OK) { - return rc; - } - - st->state = sw_field_rep; - - /* fall through */ - - case sw_field_rep: - - ngx_http_v3_parse_start_local(b, &loc, st->length); - - rc = ngx_http_v3_parse_field_rep(c, &st->field_rep, st->prefix.base, - &loc); - - ngx_http_v3_parse_end_local(b, &loc, &st->length); - - if (st->length == 0 && rc == NGX_AGAIN) { - return NGX_HTTP_V3_ERR_FRAME_ERROR; - } - - if (rc != NGX_DONE) { - return rc; - } - - if (st->length == 0) { - goto done; - } - - return NGX_OK; - } - } - -done: - - ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0, "http3 parse headers done"); - - if (st->prefix.insert_count > 0) { - if (ngx_http_v3_send_ack_section(c, c->quic->id) != NGX_OK) { - return NGX_ERROR; - } - - ngx_http_v3_ack_insert_count(c, st->prefix.insert_count); - } - - st->state = sw_start; - return NGX_DONE; -} - - -static ngx_int_t -ngx_http_v3_parse_field_section_prefix(ngx_connection_t *c, - ngx_http_v3_parse_field_section_prefix_t *st, ngx_buf_t *b) -{ - u_char ch; - ngx_int_t rc; - enum { - sw_start = 0, - sw_req_insert_count, - sw_delta_base, - sw_read_delta_base - }; - - for ( ;; ) { - - switch (st->state) { - - case sw_start: - - ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0, - "http3 parse field section prefix"); - - st->state = sw_req_insert_count; - - /* fall through */ - - case sw_req_insert_count: - - rc = ngx_http_v3_parse_prefix_int(c, &st->pint, 8, b); - if (rc != NGX_DONE) { - return rc; - } - - st->insert_count = st->pint.value; - st->state = sw_delta_base; - break; - - case sw_delta_base: - - if (b->pos == b->last) { - return NGX_AGAIN; - } - - ch = *b->pos; - - st->sign = (ch & 0x80) ? 1 : 0; - st->state = sw_read_delta_base; - - /* fall through */ - - case sw_read_delta_base: - - rc = ngx_http_v3_parse_prefix_int(c, &st->pint, 7, b); - if (rc != NGX_DONE) { - return rc; - } - - st->delta_base = st->pint.value; - goto done; - } - } - -done: - - rc = ngx_http_v3_decode_insert_count(c, &st->insert_count); - if (rc != NGX_OK) { - return rc; - } - - if (st->sign) { - if (st->insert_count <= st->delta_base) { - ngx_log_error(NGX_LOG_INFO, c->log, 0, "client sent negative base"); - return NGX_HTTP_V3_ERR_DECOMPRESSION_FAILED; - } - - st->base = st->insert_count - st->delta_base - 1; - - } else { - st->base = st->insert_count + st->delta_base; - } - - ngx_log_debug4(NGX_LOG_DEBUG_HTTP, c->log, 0, - "http3 parse field section prefix done " - "insert_count:%ui, sign:%ui, delta_base:%ui, base:%ui", - st->insert_count, st->sign, st->delta_base, st->base); - - st->state = sw_start; - return NGX_DONE; -} - - -static ngx_int_t -ngx_http_v3_parse_field_rep(ngx_connection_t *c, - ngx_http_v3_parse_field_rep_t *st, ngx_uint_t base, ngx_buf_t *b) -{ - u_char ch; - ngx_int_t rc; - enum { - sw_start = 0, - sw_field_ri, - sw_field_lri, - sw_field_l, - sw_field_pbi, - sw_field_lpbi - }; - - if (st->state == sw_start) { - - ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0, - "http3 parse field representation"); - - if (b->pos == b->last) { - return NGX_AGAIN; - } - - ch = *b->pos; - - ngx_memzero(&st->field, sizeof(ngx_http_v3_parse_field_t)); - - st->field.base = base; - - if (ch & 0x80) { - /* Indexed Field Line */ - - st->state = sw_field_ri; - - } else if (ch & 0x40) { - /* Literal Field Line With Name Reference */ - - st->state = sw_field_lri; - - } else if (ch & 0x20) { - /* Literal Field Line With Literal Name */ - - st->state = sw_field_l; - - } else if (ch & 0x10) { - /* Indexed Field Line With Post-Base Index */ - - st->state = sw_field_pbi; - - } else { - /* Literal Field Line With Post-Base Name Reference */ - - st->state = sw_field_lpbi; - } - } - - switch (st->state) { - - case sw_field_ri: - rc = ngx_http_v3_parse_field_ri(c, &st->field, b); - break; - - case sw_field_lri: - rc = ngx_http_v3_parse_field_lri(c, &st->field, b); - break; - - case sw_field_l: - rc = ngx_http_v3_parse_field_l(c, &st->field, b); - break; - - case sw_field_pbi: - rc = ngx_http_v3_parse_field_pbi(c, &st->field, b); - break; - - case sw_field_lpbi: - rc = ngx_http_v3_parse_field_lpbi(c, &st->field, b); - break; - - default: - rc = NGX_OK; - } - - if (rc != NGX_DONE) { - return rc; - } - - ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0, - "http3 parse field representation done"); - - st->state = sw_start; - return NGX_DONE; -} - - -static ngx_int_t -ngx_http_v3_parse_literal(ngx_connection_t *c, ngx_http_v3_parse_literal_t *st, - ngx_buf_t *b) -{ - u_char ch; - ngx_uint_t n; - ngx_http_core_srv_conf_t *cscf; - enum { - sw_start = 0, - sw_value - }; - - for ( ;; ) { - - switch (st->state) { - - case sw_start: - - ngx_log_debug2(NGX_LOG_DEBUG_HTTP, c->log, 0, - "http3 parse literal huff:%ui, len:%ui", - st->huffman, st->length); - - n = st->length; - - cscf = ngx_http_v3_get_module_srv_conf(c, ngx_http_core_module); - - if (n > cscf->large_client_header_buffers.size) { - ngx_log_error(NGX_LOG_INFO, c->log, 0, - "client sent too large field line"); - return NGX_HTTP_V3_ERR_EXCESSIVE_LOAD; - } - - if (st->huffman) { - if (n > NGX_MAX_INT_T_VALUE / 8) { - ngx_log_error(NGX_LOG_INFO, c->log, 0, - "client sent too large field line"); - return NGX_HTTP_V3_ERR_EXCESSIVE_LOAD; - } - - n = n * 8 / 5; - st->huffstate = 0; - } - - st->last = ngx_pnalloc(c->pool, n + 1); - if (st->last == NULL) { - return NGX_ERROR; - } - - st->value.data = st->last; - st->state = sw_value; - - /* fall through */ - - case sw_value: - - if (b->pos == b->last) { - return NGX_AGAIN; - } - - ch = *b->pos++; - - if (st->huffman) { - if (ngx_http_huff_decode(&st->huffstate, &ch, 1, &st->last, - st->length == 1, c->log) - != NGX_OK) - { - ngx_log_error(NGX_LOG_INFO, c->log, 0, - "client sent invalid encoded field line"); - return NGX_ERROR; - } - - } else { - *st->last++ = ch; - } - - if (--st->length) { - break; - } - - st->value.len = st->last - st->value.data; - *st->last = '\0'; - goto done; - } - } - -done: - - ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0, - "http3 parse literal done \"%V\"", &st->value); - - st->state = sw_start; - return NGX_DONE; -} - - -static ngx_int_t -ngx_http_v3_parse_field_ri(ngx_connection_t *c, ngx_http_v3_parse_field_t *st, - ngx_buf_t *b) -{ - u_char ch; - ngx_int_t rc; - enum { - sw_start = 0, - sw_index - }; - - for ( ;; ) { - - switch (st->state) { - - case sw_start: - - ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0, - "http3 parse field ri"); - - if (b->pos == b->last) { - return NGX_AGAIN; - } - - ch = *b->pos; - - st->dynamic = (ch & 0x40) ? 0 : 1; - st->state = sw_index; - - /* fall through */ - - case sw_index: - - rc = ngx_http_v3_parse_prefix_int(c, &st->pint, 6, b); - if (rc != NGX_DONE) { - return rc; - } - - st->index = st->pint.value; - goto done; - } - } - -done: - - ngx_log_debug2(NGX_LOG_DEBUG_HTTP, c->log, 0, - "http3 parse field ri done %s%ui]", - st->dynamic ? "dynamic[-" : "static[", st->index); - - if (st->dynamic) { - st->index = st->base - st->index - 1; - } - - rc = ngx_http_v3_parse_lookup(c, st->dynamic, st->index, &st->name, - &st->value); - if (rc != NGX_OK) { - return rc; - } - - st->state = sw_start; - return NGX_DONE; -} - - -static ngx_int_t -ngx_http_v3_parse_field_lri(ngx_connection_t *c, - ngx_http_v3_parse_field_t *st, ngx_buf_t *b) -{ - u_char ch; - ngx_int_t rc; - enum { - sw_start = 0, - sw_index, - sw_value_len, - sw_read_value_len, - sw_value - }; - - for ( ;; ) { - - switch (st->state) { - - case sw_start: - - ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0, - "http3 parse field lri"); - - if (b->pos == b->last) { - return NGX_AGAIN; - } - - ch = *b->pos; - - st->dynamic = (ch & 0x10) ? 0 : 1; - st->state = sw_index; - - /* fall through */ - - case sw_index: - - rc = ngx_http_v3_parse_prefix_int(c, &st->pint, 4, b); - if (rc != NGX_DONE) { - return rc; - } - - st->index = st->pint.value; - st->state = sw_value_len; - break; - - case sw_value_len: - - if (b->pos == b->last) { - return NGX_AGAIN; - } - - ch = *b->pos; - - st->literal.huffman = (ch & 0x80) ? 1 : 0; - st->state = sw_read_value_len; - - /* fall through */ - - case sw_read_value_len: - - rc = ngx_http_v3_parse_prefix_int(c, &st->pint, 7, b); - if (rc != NGX_DONE) { - return rc; - } - - st->literal.length = st->pint.value; - if (st->literal.length == 0) { - st->value.data = (u_char *) ""; - goto done; - } - - st->state = sw_value; - break; - - case sw_value: - - rc = ngx_http_v3_parse_literal(c, &st->literal, b); - if (rc != NGX_DONE) { - return rc; - } - - st->value = st->literal.value; - goto done; - } - } - -done: - - ngx_log_debug3(NGX_LOG_DEBUG_HTTP, c->log, 0, - "http3 parse field lri done %s%ui] \"%V\"", - st->dynamic ? "dynamic[-" : "static[", - st->index, &st->value); - - if (st->dynamic) { - st->index = st->base - st->index - 1; - } - - rc = ngx_http_v3_parse_lookup(c, st->dynamic, st->index, &st->name, NULL); - if (rc != NGX_OK) { - return rc; - } - - st->state = sw_start; - return NGX_DONE; -} - - -static ngx_int_t -ngx_http_v3_parse_field_l(ngx_connection_t *c, - ngx_http_v3_parse_field_t *st, ngx_buf_t *b) -{ - u_char ch; - ngx_int_t rc; - enum { - sw_start = 0, - sw_name_len, - sw_name, - sw_value_len, - sw_read_value_len, - sw_value - }; - - for ( ;; ) { - - switch (st->state) { - - case sw_start: - - ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0, - "http3 parse field l"); - - if (b->pos == b->last) { - return NGX_AGAIN; - } - - ch = *b->pos; - - st->literal.huffman = (ch & 0x08) ? 1 : 0; - st->state = sw_name_len; - - /* fall through */ - - case sw_name_len: - - rc = ngx_http_v3_parse_prefix_int(c, &st->pint, 3, b); - if (rc != NGX_DONE) { - return rc; - } - - st->literal.length = st->pint.value; - if (st->literal.length == 0) { - return NGX_ERROR; - } - - st->state = sw_name; - break; - - case sw_name: - - rc = ngx_http_v3_parse_literal(c, &st->literal, b); - if (rc != NGX_DONE) { - return rc; - } - - st->name = st->literal.value; - st->state = sw_value_len; - break; - - case sw_value_len: - - if (b->pos == b->last) { - return NGX_AGAIN; - } - - ch = *b->pos; - - st->literal.huffman = (ch & 0x80) ? 1 : 0; - st->state = sw_read_value_len; - - /* fall through */ - - case sw_read_value_len: - - rc = ngx_http_v3_parse_prefix_int(c, &st->pint, 7, b); - if (rc != NGX_DONE) { - return rc; - } - - st->literal.length = st->pint.value; - if (st->literal.length == 0) { - st->value.data = (u_char *) ""; - goto done; - } - - st->state = sw_value; - break; - - case sw_value: - - rc = ngx_http_v3_parse_literal(c, &st->literal, b); - if (rc != NGX_DONE) { - return rc; - } - - st->value = st->literal.value; - goto done; - } - } - -done: - - ngx_log_debug2(NGX_LOG_DEBUG_HTTP, c->log, 0, - "http3 parse field l done \"%V\" \"%V\"", - &st->name, &st->value); - - st->state = sw_start; - return NGX_DONE; -} - - -static ngx_int_t -ngx_http_v3_parse_field_pbi(ngx_connection_t *c, - ngx_http_v3_parse_field_t *st, ngx_buf_t *b) -{ - ngx_int_t rc; - enum { - sw_start = 0, - sw_index - }; - - for ( ;; ) { - - switch (st->state) { - - case sw_start: - - ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0, - "http3 parse field pbi"); - - st->state = sw_index; - - /* fall through */ - - case sw_index: - - rc = ngx_http_v3_parse_prefix_int(c, &st->pint, 4, b); - if (rc != NGX_DONE) { - return rc; - } - - st->index = st->pint.value; - goto done; - } - } - -done: - - ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0, - "http3 parse field pbi done dynamic[+%ui]", st->index); - - rc = ngx_http_v3_parse_lookup(c, 1, st->base + st->index, &st->name, - &st->value); - if (rc != NGX_OK) { - return rc; - } - - st->state = sw_start; - return NGX_DONE; -} - - -static ngx_int_t -ngx_http_v3_parse_field_lpbi(ngx_connection_t *c, - ngx_http_v3_parse_field_t *st, ngx_buf_t *b) -{ - u_char ch; - ngx_int_t rc; - enum { - sw_start = 0, - sw_index, - sw_value_len, - sw_read_value_len, - sw_value - }; - - for ( ;; ) { - - switch (st->state) { - - case sw_start: - - ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0, - "http3 parse field lpbi"); - - st->state = sw_index; - - /* fall through */ - - case sw_index: - - rc = ngx_http_v3_parse_prefix_int(c, &st->pint, 3, b); - if (rc != NGX_DONE) { - return rc; - } - - st->index = st->pint.value; - st->state = sw_value_len; - break; - - case sw_value_len: - - if (b->pos == b->last) { - return NGX_AGAIN; - } - - ch = *b->pos; - - st->literal.huffman = (ch & 0x80) ? 1 : 0; - st->state = sw_read_value_len; - - /* fall through */ - - case sw_read_value_len: - - rc = ngx_http_v3_parse_prefix_int(c, &st->pint, 7, b); - if (rc != NGX_DONE) { - return rc; - } - - st->literal.length = st->pint.value; - if (st->literal.length == 0) { - st->value.data = (u_char *) ""; - goto done; - } - - st->state = sw_value; - break; - - case sw_value: - - rc = ngx_http_v3_parse_literal(c, &st->literal, b); - if (rc != NGX_DONE) { - return rc; - } - - st->value = st->literal.value; - goto done; - } - } - -done: - - ngx_log_debug2(NGX_LOG_DEBUG_HTTP, c->log, 0, - "http3 parse field lpbi done dynamic[+%ui] \"%V\"", - st->index, &st->value); - - rc = ngx_http_v3_parse_lookup(c, 1, st->base + st->index, &st->name, NULL); - if (rc != NGX_OK) { - return rc; - } - - st->state = sw_start; - return NGX_DONE; -} - - -static ngx_int_t -ngx_http_v3_parse_lookup(ngx_connection_t *c, ngx_uint_t dynamic, - ngx_uint_t index, ngx_str_t *name, ngx_str_t *value) -{ - u_char *p; - - if (!dynamic) { - if (ngx_http_v3_lookup_static(c, index, name, value) != NGX_OK) { - return NGX_HTTP_V3_ERR_DECOMPRESSION_FAILED; - } - - return NGX_OK; - } - - if (ngx_http_v3_lookup(c, index, name, value) != NGX_OK) { - return NGX_HTTP_V3_ERR_DECOMPRESSION_FAILED; - } - - if (name) { - p = ngx_pnalloc(c->pool, name->len + 1); - if (p == NULL) { - return NGX_ERROR; - } - - ngx_memcpy(p, name->data, name->len); - p[name->len] = '\0'; - name->data = p; - } - - if (value) { - p = ngx_pnalloc(c->pool, value->len + 1); - if (p == NULL) { - return NGX_ERROR; - } - - ngx_memcpy(p, value->data, value->len); - p[value->len] = '\0'; - value->data = p; - } - - return NGX_OK; -} - - -static ngx_int_t -ngx_http_v3_parse_control(ngx_connection_t *c, ngx_http_v3_parse_control_t *st, - ngx_buf_t *b) -{ - ngx_buf_t loc; - ngx_int_t rc; - enum { - sw_start = 0, - sw_first_type, - sw_type, - sw_length, - sw_settings, - sw_skip - }; - - for ( ;; ) { - - switch (st->state) { - - case sw_start: - - ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0, - "http3 parse control"); - - st->state = sw_first_type; - - /* fall through */ - - case sw_first_type: - case sw_type: - - rc = ngx_http_v3_parse_varlen_int(c, &st->vlint, b); - if (rc != NGX_DONE) { - return rc; - } - - st->type = st->vlint.value; - - ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0, - "http3 parse frame type:%ui", st->type); - - if (st->state == sw_first_type - && st->type != NGX_HTTP_V3_FRAME_SETTINGS) - { - return NGX_HTTP_V3_ERR_MISSING_SETTINGS; - } - - if (st->state != sw_first_type - && st->type == NGX_HTTP_V3_FRAME_SETTINGS) - { - return NGX_HTTP_V3_ERR_FRAME_UNEXPECTED; - } - - if (ngx_http_v3_is_v2_frame(st->type) - || st->type == NGX_HTTP_V3_FRAME_DATA - || st->type == NGX_HTTP_V3_FRAME_HEADERS - || st->type == NGX_HTTP_V3_FRAME_PUSH_PROMISE) - { - return NGX_HTTP_V3_ERR_FRAME_UNEXPECTED; - } - - if (st->type == NGX_HTTP_V3_FRAME_CANCEL_PUSH) { - return NGX_HTTP_V3_ERR_ID_ERROR; - } - - st->state = sw_length; - break; - - case sw_length: - - rc = ngx_http_v3_parse_varlen_int(c, &st->vlint, b); - if (rc != NGX_DONE) { - return rc; - } - - ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0, - "http3 parse frame len:%uL", st->vlint.value); - - st->length = st->vlint.value; - if (st->length == 0) { - st->state = sw_type; - break; - } - - switch (st->type) { - - case NGX_HTTP_V3_FRAME_SETTINGS: - st->state = sw_settings; - break; - - default: - ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0, - "http3 parse skip unknown frame"); - st->state = sw_skip; - } - - break; - - case sw_settings: - - ngx_http_v3_parse_start_local(b, &loc, st->length); - - rc = ngx_http_v3_parse_settings(c, &st->settings, &loc); - - ngx_http_v3_parse_end_local(b, &loc, &st->length); - - if (st->length == 0 && rc == NGX_AGAIN) { - return NGX_HTTP_V3_ERR_SETTINGS_ERROR; - } - - if (rc != NGX_DONE) { - return rc; - } - - if (st->length == 0) { - st->state = sw_type; - } - - break; - - case sw_skip: - - rc = ngx_http_v3_parse_skip(b, &st->length); - if (rc != NGX_DONE) { - return rc; - } - - st->state = sw_type; - break; - } - } -} - - -static ngx_int_t -ngx_http_v3_parse_settings(ngx_connection_t *c, - ngx_http_v3_parse_settings_t *st, ngx_buf_t *b) -{ - ngx_int_t rc; - enum { - sw_start = 0, - sw_id, - sw_value - }; - - for ( ;; ) { - - switch (st->state) { - - case sw_start: - - ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0, - "http3 parse settings"); - - st->state = sw_id; - - /* fall through */ - - case sw_id: - - rc = ngx_http_v3_parse_varlen_int(c, &st->vlint, b); - if (rc != NGX_DONE) { - return rc; - } - - st->id = st->vlint.value; - st->state = sw_value; - break; - - case sw_value: - - rc = ngx_http_v3_parse_varlen_int(c, &st->vlint, b); - if (rc != NGX_DONE) { - return rc; - } - - if (ngx_http_v3_set_param(c, st->id, st->vlint.value) != NGX_OK) { - return NGX_HTTP_V3_ERR_SETTINGS_ERROR; - } - - goto done; - } - } - -done: - - ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0, "http3 parse settings done"); - - st->state = sw_start; - return NGX_DONE; -} - - -static ngx_int_t -ngx_http_v3_parse_encoder(ngx_connection_t *c, ngx_http_v3_parse_encoder_t *st, - ngx_buf_t *b) -{ - u_char ch; - ngx_int_t rc; - enum { - sw_start = 0, - sw_inr, - sw_iln, - sw_capacity, - sw_duplicate - }; - - for ( ;; ) { - - if (st->state == sw_start) { - - ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0, - "http3 parse encoder instruction"); - - if (b->pos == b->last) { - return NGX_AGAIN; - } - - ch = *b->pos; - - if (ch & 0x80) { - /* Insert With Name Reference */ - - st->state = sw_inr; - - } else if (ch & 0x40) { - /* Insert With Literal Name */ - - st->state = sw_iln; - - } else if (ch & 0x20) { - /* Set Dynamic Table Capacity */ - - st->state = sw_capacity; - - } else { - /* Duplicate */ - - st->state = sw_duplicate; - } - } - - switch (st->state) { - - case sw_inr: - - rc = ngx_http_v3_parse_field_inr(c, &st->field, b); - if (rc != NGX_DONE) { - return rc; - } - - st->state = sw_start; - break; - - case sw_iln: - - rc = ngx_http_v3_parse_field_iln(c, &st->field, b); - if (rc != NGX_DONE) { - return rc; - } - - st->state = sw_start; - break; - - case sw_capacity: - - rc = ngx_http_v3_parse_prefix_int(c, &st->pint, 5, b); - if (rc != NGX_DONE) { - return rc; - } - - rc = ngx_http_v3_set_capacity(c, st->pint.value); - if (rc != NGX_OK) { - return rc; - } - - st->state = sw_start; - break; - - default: /* sw_duplicate */ - - rc = ngx_http_v3_parse_prefix_int(c, &st->pint, 5, b); - if (rc != NGX_DONE) { - return rc; - } - - rc = ngx_http_v3_duplicate(c, st->pint.value); - if (rc != NGX_OK) { - return rc; - } - - st->state = sw_start; - break; - } - } -} - - -static ngx_int_t -ngx_http_v3_parse_field_inr(ngx_connection_t *c, - ngx_http_v3_parse_field_t *st, ngx_buf_t *b) -{ - u_char ch; - ngx_int_t rc; - enum { - sw_start = 0, - sw_name_index, - sw_value_len, - sw_read_value_len, - sw_value - }; - - for ( ;; ) { - - switch (st->state) { - - case sw_start: - - ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0, - "http3 parse field inr"); - - if (b->pos == b->last) { - return NGX_AGAIN; - } - - ch = *b->pos; - - st->dynamic = (ch & 0x40) ? 0 : 1; - st->state = sw_name_index; - - /* fall through */ - - case sw_name_index: - - rc = ngx_http_v3_parse_prefix_int(c, &st->pint, 6, b); - if (rc != NGX_DONE) { - return rc; - } - - st->index = st->pint.value; - st->state = sw_value_len; - break; - - case sw_value_len: - - if (b->pos == b->last) { - return NGX_AGAIN; - } - - ch = *b->pos; - - st->literal.huffman = (ch & 0x80) ? 1 : 0; - st->state = sw_read_value_len; - - /* fall through */ - - case sw_read_value_len: - - rc = ngx_http_v3_parse_prefix_int(c, &st->pint, 7, b); - if (rc != NGX_DONE) { - return rc; - } - - st->literal.length = st->pint.value; - if (st->literal.length == 0) { - st->value.len = 0; - goto done; - } - - st->state = sw_value; - break; - - case sw_value: - - rc = ngx_http_v3_parse_literal(c, &st->literal, b); - if (rc != NGX_DONE) { - return rc; - } - - st->value = st->literal.value; - goto done; - } - } - -done: - - ngx_log_debug3(NGX_LOG_DEBUG_HTTP, c->log, 0, - "http3 parse field inr done %s[%ui] \"%V\"", - st->dynamic ? "dynamic" : "static", - st->index, &st->value); - - rc = ngx_http_v3_ref_insert(c, st->dynamic, st->index, &st->value); - if (rc != NGX_OK) { - return rc; - } - - st->state = sw_start; - return NGX_DONE; -} - - -static ngx_int_t -ngx_http_v3_parse_field_iln(ngx_connection_t *c, - ngx_http_v3_parse_field_t *st, ngx_buf_t *b) -{ - u_char ch; - ngx_int_t rc; - enum { - sw_start = 0, - sw_name_len, - sw_name, - sw_value_len, - sw_read_value_len, - sw_value - }; - - for ( ;; ) { - - switch (st->state) { - - case sw_start: - - ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0, - "http3 parse field iln"); - - if (b->pos == b->last) { - return NGX_AGAIN; - } - - ch = *b->pos; - - st->literal.huffman = (ch & 0x20) ? 1 : 0; - st->state = sw_name_len; - - /* fall through */ - - case sw_name_len: - - rc = ngx_http_v3_parse_prefix_int(c, &st->pint, 5, b); - if (rc != NGX_DONE) { - return rc; - } - - st->literal.length = st->pint.value; - if (st->literal.length == 0) { - return NGX_ERROR; - } - - st->state = sw_name; - break; - - case sw_name: - - rc = ngx_http_v3_parse_literal(c, &st->literal, b); - if (rc != NGX_DONE) { - return rc; - } - - st->name = st->literal.value; - st->state = sw_value_len; - break; - - case sw_value_len: - - if (b->pos == b->last) { - return NGX_AGAIN; - } - - ch = *b->pos; - - st->literal.huffman = (ch & 0x80) ? 1 : 0; - st->state = sw_read_value_len; - - /* fall through */ - - case sw_read_value_len: - - rc = ngx_http_v3_parse_prefix_int(c, &st->pint, 7, b); - if (rc != NGX_DONE) { - return rc; - } - - st->literal.length = st->pint.value; - if (st->literal.length == 0) { - st->value.len = 0; - goto done; - } - - st->state = sw_value; - break; - - case sw_value: - - rc = ngx_http_v3_parse_literal(c, &st->literal, b); - if (rc != NGX_DONE) { - return rc; - } - - st->value = st->literal.value; - goto done; - } - } - -done: - - ngx_log_debug2(NGX_LOG_DEBUG_HTTP, c->log, 0, - "http3 parse field iln done \"%V\":\"%V\"", - &st->name, &st->value); - - rc = ngx_http_v3_insert(c, &st->name, &st->value); - if (rc != NGX_OK) { - return rc; - } - - st->state = sw_start; - return NGX_DONE; -} - - -static ngx_int_t -ngx_http_v3_parse_decoder(ngx_connection_t *c, ngx_http_v3_parse_decoder_t *st, - ngx_buf_t *b) -{ - u_char ch; - ngx_int_t rc; - enum { - sw_start = 0, - sw_ack_section, - sw_cancel_stream, - sw_inc_insert_count - }; - - for ( ;; ) { - - if (st->state == sw_start) { - - ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0, - "http3 parse decoder instruction"); - - if (b->pos == b->last) { - return NGX_AGAIN; - } - - ch = *b->pos; - - if (ch & 0x80) { - /* Section Acknowledgment */ - - st->state = sw_ack_section; - - } else if (ch & 0x40) { - /* Stream Cancellation */ - - st->state = sw_cancel_stream; - - } else { - /* Insert Count Increment */ - - st->state = sw_inc_insert_count; - } - } - - switch (st->state) { - - case sw_ack_section: - - rc = ngx_http_v3_parse_prefix_int(c, &st->pint, 7, b); - if (rc != NGX_DONE) { - return rc; - } - - rc = ngx_http_v3_ack_section(c, st->pint.value); - if (rc != NGX_OK) { - return rc; - } - - st->state = sw_start; - break; - - case sw_cancel_stream: - - rc = ngx_http_v3_parse_prefix_int(c, &st->pint, 6, b); - if (rc != NGX_DONE) { - return rc; - } - - rc = ngx_http_v3_cancel_stream(c, st->pint.value); - if (rc != NGX_OK) { - return rc; - } - - st->state = sw_start; - break; - - case sw_inc_insert_count: - - rc = ngx_http_v3_parse_prefix_int(c, &st->pint, 6, b); - if (rc != NGX_DONE) { - return rc; - } - - rc = ngx_http_v3_inc_insert_count(c, st->pint.value); - if (rc != NGX_OK) { - return rc; - } - - st->state = sw_start; - break; - } - } -} - - -ngx_int_t -ngx_http_v3_parse_data(ngx_connection_t *c, ngx_http_v3_parse_data_t *st, - ngx_buf_t *b) -{ - ngx_int_t rc; - enum { - sw_start = 0, - sw_type, - sw_length, - sw_skip - }; - - for ( ;; ) { - - switch (st->state) { - - case sw_start: - - ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0, "http3 parse data"); - - st->state = sw_type; - - /* fall through */ - - case sw_type: - - rc = ngx_http_v3_parse_varlen_int(c, &st->vlint, b); - if (rc != NGX_DONE) { - return rc; - } - - st->type = st->vlint.value; - - if (st->type == NGX_HTTP_V3_FRAME_HEADERS) { - /* trailers */ - goto done; - } - - if (ngx_http_v3_is_v2_frame(st->type) - || st->type == NGX_HTTP_V3_FRAME_GOAWAY - || st->type == NGX_HTTP_V3_FRAME_SETTINGS - || st->type == NGX_HTTP_V3_FRAME_MAX_PUSH_ID - || st->type == NGX_HTTP_V3_FRAME_CANCEL_PUSH - || st->type == NGX_HTTP_V3_FRAME_PUSH_PROMISE) - { - return NGX_HTTP_V3_ERR_FRAME_UNEXPECTED; - } - - st->state = sw_length; - break; - - case sw_length: - - rc = ngx_http_v3_parse_varlen_int(c, &st->vlint, b); - if (rc != NGX_DONE) { - return rc; - } - - st->length = st->vlint.value; - - ngx_log_debug2(NGX_LOG_DEBUG_HTTP, c->log, 0, - "http3 parse data type:%ui, len:%ui", - st->type, st->length); - - if (st->type != NGX_HTTP_V3_FRAME_DATA && st->length > 0) { - st->state = sw_skip; - break; - } - - st->state = sw_type; - return NGX_OK; - - case sw_skip: - - rc = ngx_http_v3_parse_skip(b, &st->length); - if (rc != NGX_DONE) { - return rc; - } - - st->state = sw_type; - break; - } - } - -done: - - ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0, "http3 parse data done"); - - st->state = sw_start; - return NGX_DONE; -} - - -ngx_int_t -ngx_http_v3_parse_uni(ngx_connection_t *c, ngx_http_v3_parse_uni_t *st, - ngx_buf_t *b) -{ - ngx_int_t rc; - enum { - sw_start = 0, - sw_type, - sw_control, - sw_encoder, - sw_decoder, - sw_unknown - }; - - for ( ;; ) { - - switch (st->state) { - case sw_start: - - ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0, "http3 parse uni"); - - st->state = sw_type; - - /* fall through */ - - case sw_type: - - rc = ngx_http_v3_parse_varlen_int(c, &st->vlint, b); - if (rc != NGX_DONE) { - return rc; - } - - rc = ngx_http_v3_register_uni_stream(c, st->vlint.value); - if (rc != NGX_OK) { - return rc; - } - - switch (st->vlint.value) { - case NGX_HTTP_V3_STREAM_CONTROL: - st->state = sw_control; - break; - - case NGX_HTTP_V3_STREAM_ENCODER: - st->state = sw_encoder; - break; - - case NGX_HTTP_V3_STREAM_DECODER: - st->state = sw_decoder; - break; - - default: - st->state = sw_unknown; - } - - break; - - case sw_control: - - return ngx_http_v3_parse_control(c, &st->u.control, b); - - case sw_encoder: - - return ngx_http_v3_parse_encoder(c, &st->u.encoder, b); - - case sw_decoder: - - return ngx_http_v3_parse_decoder(c, &st->u.decoder, b); - - case sw_unknown: - - b->pos = b->last; - return NGX_AGAIN; - } - } -} diff --git a/src/deps/src/nginx-1.30.3/src/http/v3/ngx_http_v3_parse.h b/src/deps/src/nginx-1.30.3/src/http/v3/ngx_http_v3_parse.h deleted file mode 100644 index ba004db5df..0000000000 --- a/src/deps/src/nginx-1.30.3/src/http/v3/ngx_http_v3_parse.h +++ /dev/null @@ -1,146 +0,0 @@ - -/* - * Copyright (C) Roman Arutyunyan - * Copyright (C) Nginx, Inc. - */ - - -#ifndef _NGX_HTTP_V3_PARSE_H_INCLUDED_ -#define _NGX_HTTP_V3_PARSE_H_INCLUDED_ - - -#include -#include -#include - - -typedef struct { - ngx_uint_t state; - uint64_t value; -} ngx_http_v3_parse_varlen_int_t; - - -typedef struct { - ngx_uint_t state; - ngx_uint_t shift; - uint64_t value; -} ngx_http_v3_parse_prefix_int_t; - - -typedef struct { - ngx_uint_t state; - uint64_t id; - ngx_http_v3_parse_varlen_int_t vlint; -} ngx_http_v3_parse_settings_t; - - -typedef struct { - ngx_uint_t state; - ngx_uint_t insert_count; - ngx_uint_t delta_base; - ngx_uint_t sign; - ngx_uint_t base; - ngx_http_v3_parse_prefix_int_t pint; -} ngx_http_v3_parse_field_section_prefix_t; - - -typedef struct { - ngx_uint_t state; - ngx_uint_t length; - ngx_uint_t huffman; - ngx_str_t value; - u_char *last; - u_char huffstate; -} ngx_http_v3_parse_literal_t; - - -typedef struct { - ngx_uint_t state; - ngx_uint_t index; - ngx_uint_t base; - ngx_uint_t dynamic; - - ngx_str_t name; - ngx_str_t value; - - ngx_http_v3_parse_prefix_int_t pint; - ngx_http_v3_parse_literal_t literal; -} ngx_http_v3_parse_field_t; - - -typedef struct { - ngx_uint_t state; - ngx_http_v3_parse_field_t field; -} ngx_http_v3_parse_field_rep_t; - - -typedef struct { - ngx_uint_t state; - ngx_uint_t type; - ngx_uint_t length; - ngx_http_v3_parse_varlen_int_t vlint; - ngx_http_v3_parse_field_section_prefix_t prefix; - ngx_http_v3_parse_field_rep_t field_rep; -} ngx_http_v3_parse_headers_t; - - -typedef struct { - ngx_uint_t state; - ngx_http_v3_parse_field_t field; - ngx_http_v3_parse_prefix_int_t pint; -} ngx_http_v3_parse_encoder_t; - - -typedef struct { - ngx_uint_t state; - ngx_http_v3_parse_prefix_int_t pint; -} ngx_http_v3_parse_decoder_t; - - -typedef struct { - ngx_uint_t state; - ngx_uint_t type; - ngx_uint_t length; - ngx_http_v3_parse_varlen_int_t vlint; - ngx_http_v3_parse_settings_t settings; -} ngx_http_v3_parse_control_t; - - -typedef struct { - ngx_uint_t state; - ngx_http_v3_parse_varlen_int_t vlint; - union { - ngx_http_v3_parse_encoder_t encoder; - ngx_http_v3_parse_decoder_t decoder; - ngx_http_v3_parse_control_t control; - } u; -} ngx_http_v3_parse_uni_t; - - -typedef struct { - ngx_uint_t state; - ngx_uint_t type; - ngx_uint_t length; - ngx_http_v3_parse_varlen_int_t vlint; -} ngx_http_v3_parse_data_t; - - -/* - * Parse functions return codes: - * NGX_DONE - parsing done - * NGX_OK - sub-element done - * NGX_AGAIN - more data expected - * NGX_BUSY - waiting for external event - * NGX_ERROR - internal error - * NGX_HTTP_V3_ERROR_XXX - HTTP/3 or QPACK error - */ - -ngx_int_t ngx_http_v3_parse_headers(ngx_connection_t *c, - ngx_http_v3_parse_headers_t *st, ngx_buf_t *b); -ngx_int_t ngx_http_v3_parse_data(ngx_connection_t *c, - ngx_http_v3_parse_data_t *st, ngx_buf_t *b); -ngx_int_t ngx_http_v3_parse_uni(ngx_connection_t *c, - ngx_http_v3_parse_uni_t *st, ngx_buf_t *b); - - -#endif /* _NGX_HTTP_V3_PARSE_H_INCLUDED_ */ diff --git a/src/deps/src/nginx-1.30.3/src/http/v3/ngx_http_v3_request.c b/src/deps/src/nginx-1.30.3/src/http/v3/ngx_http_v3_request.c deleted file mode 100644 index 7bb61311d9..0000000000 --- a/src/deps/src/nginx-1.30.3/src/http/v3/ngx_http_v3_request.c +++ /dev/null @@ -1,1741 +0,0 @@ - -/* - * Copyright (C) Roman Arutyunyan - * Copyright (C) Nginx, Inc. - */ - - -#include -#include -#include - - -static void ngx_http_v3_init_request_stream(ngx_connection_t *c); -static void ngx_http_v3_wait_request_handler(ngx_event_t *rev); -static void ngx_http_v3_cleanup_connection(void *data); -static void ngx_http_v3_cleanup_request(void *data); -static void ngx_http_v3_process_request(ngx_event_t *rev); -static ngx_int_t ngx_http_v3_process_header(ngx_http_request_t *r, - ngx_str_t *name, ngx_str_t *value); -static ngx_int_t ngx_http_v3_validate_header(ngx_http_request_t *r, - ngx_str_t *name, ngx_str_t *value); -static ngx_int_t ngx_http_v3_process_pseudo_header(ngx_http_request_t *r, - ngx_str_t *name, ngx_str_t *value); -static ngx_int_t ngx_http_v3_init_pseudo_headers(ngx_http_request_t *r); -static ngx_int_t ngx_http_v3_process_request_header(ngx_http_request_t *r); -static ngx_int_t ngx_http_v3_cookie(ngx_http_request_t *r, ngx_str_t *value); -static ngx_int_t ngx_http_v3_construct_cookie_header(ngx_http_request_t *r); -static void ngx_http_v3_read_client_request_body_handler(ngx_http_request_t *r); -static ngx_int_t ngx_http_v3_do_read_client_request_body(ngx_http_request_t *r); -static ngx_int_t ngx_http_v3_request_body_filter(ngx_http_request_t *r, - ngx_chain_t *in); - - -static const struct { - ngx_str_t name; - ngx_uint_t method; -} ngx_http_v3_methods[] = { - - { ngx_string("GET"), NGX_HTTP_GET }, - { ngx_string("POST"), NGX_HTTP_POST }, - { ngx_string("HEAD"), NGX_HTTP_HEAD }, - { ngx_string("OPTIONS"), NGX_HTTP_OPTIONS }, - { ngx_string("PROPFIND"), NGX_HTTP_PROPFIND }, - { ngx_string("PUT"), NGX_HTTP_PUT }, - { ngx_string("MKCOL"), NGX_HTTP_MKCOL }, - { ngx_string("DELETE"), NGX_HTTP_DELETE }, - { ngx_string("COPY"), NGX_HTTP_COPY }, - { ngx_string("MOVE"), NGX_HTTP_MOVE }, - { ngx_string("PROPPATCH"), NGX_HTTP_PROPPATCH }, - { ngx_string("LOCK"), NGX_HTTP_LOCK }, - { ngx_string("UNLOCK"), NGX_HTTP_UNLOCK }, - { ngx_string("PATCH"), NGX_HTTP_PATCH }, - { ngx_string("TRACE"), NGX_HTTP_TRACE }, - { ngx_string("CONNECT"), NGX_HTTP_CONNECT } -}; - - -void -ngx_http_v3_init_stream(ngx_connection_t *c) -{ - ngx_http_connection_t *hc, *phc; - ngx_http_v3_srv_conf_t *h3scf; - ngx_http_core_loc_conf_t *clcf; - - hc = c->data; - - hc->ssl = 1; - - clcf = ngx_http_get_module_loc_conf(hc->conf_ctx, ngx_http_core_module); - - if (c->quic == NULL) { - h3scf = ngx_http_get_module_srv_conf(hc->conf_ctx, ngx_http_v3_module); - h3scf->quic.idle_timeout = clcf->keepalive_timeout; - - ngx_quic_run(c, &h3scf->quic); - return; - } - - phc = ngx_http_quic_get_connection(c); - - if (phc->ssl_servername) { - hc->ssl_servername = phc->ssl_servername; -#if (NGX_PCRE) - hc->ssl_servername_regex = phc->ssl_servername_regex; -#endif - hc->conf_ctx = phc->conf_ctx; - - ngx_set_connection_log(c, clcf->error_log); - } - - if (c->quic->id & NGX_QUIC_STREAM_UNIDIRECTIONAL) { - ngx_http_v3_init_uni_stream(c); - - } else { - ngx_http_v3_init_request_stream(c); - } -} - - -ngx_int_t -ngx_http_v3_init(ngx_connection_t *c) -{ - unsigned int len; - const unsigned char *data; - ngx_http_v3_session_t *h3c; - ngx_http_v3_srv_conf_t *h3scf; - ngx_http_core_loc_conf_t *clcf; - - ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0, "http3 init"); - - if (ngx_http_v3_init_session(c) != NGX_OK) { - return NGX_ERROR; - } - - h3c = ngx_http_v3_get_session(c); - clcf = ngx_http_v3_get_module_loc_conf(c, ngx_http_core_module); - ngx_add_timer(&h3c->keepalive, clcf->keepalive_timeout); - - h3scf = ngx_http_v3_get_module_srv_conf(c, ngx_http_v3_module); - - if (h3scf->enable_hq) { - if (!h3scf->enable) { - h3c->hq = 1; - return NGX_OK; - } - - SSL_get0_alpn_selected(c->ssl->connection, &data, &len); - - if (len == sizeof(NGX_HTTP_V3_HQ_PROTO) - 1 - && ngx_strncmp(data, NGX_HTTP_V3_HQ_PROTO, len) == 0) - { - h3c->hq = 1; - return NGX_OK; - } - } - - if (ngx_http_v3_send_settings(c) != NGX_OK) { - return NGX_ERROR; - } - - if (h3scf->max_table_capacity > 0) { - if (ngx_http_v3_get_uni_stream(c, NGX_HTTP_V3_STREAM_DECODER) == NULL) { - return NGX_ERROR; - } - } - - return NGX_OK; -} - - -void -ngx_http_v3_shutdown(ngx_connection_t *c) -{ - ngx_http_v3_session_t *h3c; - - ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0, "http3 shutdown"); - - h3c = ngx_http_v3_get_session(c); - - if (h3c == NULL) { - ngx_quic_finalize_connection(c, NGX_HTTP_V3_ERR_NO_ERROR, - "connection shutdown"); - return; - } - - if (!h3c->goaway) { - h3c->goaway = 1; - - if (!h3c->hq) { - (void) ngx_http_v3_send_goaway(c, h3c->next_request_id); - } - - ngx_http_v3_shutdown_connection(c, NGX_HTTP_V3_ERR_NO_ERROR, - "connection shutdown"); - } -} - - -static void -ngx_http_v3_init_request_stream(ngx_connection_t *c) -{ - uint64_t n; - ngx_event_t *rev; - ngx_pool_cleanup_t *cln; - ngx_http_connection_t *hc; - ngx_http_v3_session_t *h3c; - ngx_http_core_loc_conf_t *clcf; - ngx_http_core_srv_conf_t *cscf; - - ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0, "http3 init request stream"); - -#if (NGX_STAT_STUB) - (void) ngx_atomic_fetch_add(ngx_stat_active, 1); -#endif - - hc = c->data; - - clcf = ngx_http_get_module_loc_conf(hc->conf_ctx, ngx_http_core_module); - - n = c->quic->id >> 2; - - if (n >= clcf->keepalive_requests * 2) { - ngx_http_v3_finalize_connection(c, NGX_HTTP_V3_ERR_EXCESSIVE_LOAD, - "too many requests per connection"); - ngx_http_close_connection(c); - return; - } - - h3c = ngx_http_v3_get_session(c); - - if (h3c->goaway) { - c->close = 1; - ngx_http_close_connection(c); - return; - } - - h3c->next_request_id = c->quic->id + 0x04; - - if (n + 1 == clcf->keepalive_requests - || ngx_current_msec - c->start_time > clcf->keepalive_time) - { - h3c->goaway = 1; - - if (!h3c->hq) { - if (ngx_http_v3_send_goaway(c, h3c->next_request_id) != NGX_OK) { - ngx_http_close_connection(c); - return; - } - } - - ngx_http_v3_shutdown_connection(c, NGX_HTTP_V3_ERR_NO_ERROR, - "reached maximum number of requests"); - } - - cln = ngx_pool_cleanup_add(c->pool, 0); - if (cln == NULL) { - ngx_http_close_connection(c); - return; - } - - cln->handler = ngx_http_v3_cleanup_connection; - cln->data = c; - - h3c->nrequests++; - - if (h3c->keepalive.timer_set) { - ngx_del_timer(&h3c->keepalive); - } - - rev = c->read; - - if (!h3c->hq) { - rev->handler = ngx_http_v3_wait_request_handler; - c->write->handler = ngx_http_empty_handler; - } - - if (rev->ready) { - rev->handler(rev); - return; - } - - cscf = ngx_http_get_module_srv_conf(hc->conf_ctx, ngx_http_core_module); - - ngx_add_timer(rev, cscf->client_header_timeout); - ngx_reusable_connection(c, 1); - - if (ngx_handle_read_event(rev, 0) != NGX_OK) { - ngx_http_close_connection(c); - return; - } -} - - -static void -ngx_http_v3_wait_request_handler(ngx_event_t *rev) -{ - size_t size; - ssize_t n; - ngx_buf_t *b; - ngx_connection_t *c; - ngx_pool_cleanup_t *cln; - ngx_http_request_t *r; - ngx_http_connection_t *hc; - ngx_http_core_srv_conf_t *cscf; - - c = rev->data; - - ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0, "http3 wait request handler"); - - if (rev->timedout) { - ngx_log_error(NGX_LOG_INFO, c->log, NGX_ETIMEDOUT, "client timed out"); - c->timedout = 1; - ngx_http_close_connection(c); - return; - } - - if (c->close) { - ngx_http_close_connection(c); - return; - } - - hc = c->data; - cscf = ngx_http_get_module_srv_conf(hc->conf_ctx, ngx_http_core_module); - - size = cscf->client_header_buffer_size; - - b = c->buffer; - - if (b == NULL) { - b = ngx_create_temp_buf(c->pool, size); - if (b == NULL) { - ngx_http_close_connection(c); - return; - } - - c->buffer = b; - - } else if (b->start == NULL) { - - b->start = ngx_palloc(c->pool, size); - if (b->start == NULL) { - ngx_http_close_connection(c); - return; - } - - b->pos = b->start; - b->last = b->start; - b->end = b->last + size; - } - - n = c->recv(c, b->last, size); - - if (n == NGX_AGAIN) { - - if (!rev->timer_set) { - ngx_add_timer(rev, cscf->client_header_timeout); - ngx_reusable_connection(c, 1); - } - - if (ngx_handle_read_event(rev, 0) != NGX_OK) { - ngx_http_close_connection(c); - return; - } - - /* - * We are trying to not hold c->buffer's memory for an idle connection. - */ - - if (ngx_pfree(c->pool, b->start) == NGX_OK) { - b->start = NULL; - } - - return; - } - - if (n == NGX_ERROR) { - ngx_http_close_connection(c); - return; - } - - if (n == 0) { - ngx_log_error(NGX_LOG_INFO, c->log, 0, - "client closed connection"); - ngx_http_close_connection(c); - return; - } - - b->last += n; - - c->log->action = "reading client request"; - - ngx_reusable_connection(c, 0); - - r = ngx_http_create_request(c); - if (r == NULL) { - ngx_http_close_connection(c); - return; - } - - r->http_version = NGX_HTTP_VERSION_30; - - r->v3_parse = ngx_pcalloc(r->pool, sizeof(ngx_http_v3_parse_t)); - if (r->v3_parse == NULL) { - ngx_http_close_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR); - return; - } - - r->v3_parse->header_limit = cscf->large_client_header_buffers.size - * cscf->large_client_header_buffers.num; - - c->data = r; - c->requests = (c->quic->id >> 2) + 1; - - cln = ngx_pool_cleanup_add(r->pool, 0); - if (cln == NULL) { - ngx_http_close_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR); - return; - } - - cln->handler = ngx_http_v3_cleanup_request; - cln->data = r; - - rev->handler = ngx_http_v3_process_request; - ngx_http_v3_process_request(rev); -} - - -void -ngx_http_v3_reset_stream(ngx_connection_t *c) -{ - ngx_http_v3_session_t *h3c; - - h3c = ngx_http_v3_get_session(c); - - if (!c->read->eof && !h3c->hq - && h3c->known_streams[NGX_HTTP_V3_STREAM_SERVER_DECODER] - && (c->quic->id & NGX_QUIC_STREAM_UNIDIRECTIONAL) == 0) - { - (void) ngx_http_v3_send_cancel_stream(c, c->quic->id); - } - - if (c->timedout) { - ngx_quic_reset_stream(c, NGX_HTTP_V3_ERR_GENERAL_PROTOCOL_ERROR); - - } else if (c->close) { - ngx_quic_reset_stream(c, NGX_HTTP_V3_ERR_REQUEST_REJECTED); - - } else if (c->requests == 0 || c->error) { - ngx_quic_reset_stream(c, NGX_HTTP_V3_ERR_INTERNAL_ERROR); - } -} - - -static void -ngx_http_v3_cleanup_connection(void *data) -{ - ngx_connection_t *c = data; - - ngx_http_v3_session_t *h3c; - ngx_http_core_loc_conf_t *clcf; - - h3c = ngx_http_v3_get_session(c); - - if (--h3c->nrequests == 0) { - clcf = ngx_http_v3_get_module_loc_conf(c, ngx_http_core_module); - ngx_add_timer(&h3c->keepalive, clcf->keepalive_timeout); - } -} - - -static void -ngx_http_v3_cleanup_request(void *data) -{ - ngx_http_request_t *r = data; - - if (!r->response_sent) { - r->connection->error = 1; - } -} - - -static void -ngx_http_v3_process_request(ngx_event_t *rev) -{ - u_char *p; - ssize_t n; - ngx_buf_t *b; - ngx_int_t rc; - ngx_connection_t *c; - ngx_http_request_t *r; - ngx_http_v3_session_t *h3c; - ngx_http_core_srv_conf_t *cscf; - ngx_http_v3_parse_headers_t *st; - - c = rev->data; - r = c->data; - - ngx_log_debug0(NGX_LOG_DEBUG_HTTP, rev->log, 0, "http3 process request"); - - if (rev->timedout) { - ngx_log_error(NGX_LOG_INFO, c->log, NGX_ETIMEDOUT, "client timed out"); - c->timedout = 1; - ngx_http_close_request(r, NGX_HTTP_REQUEST_TIME_OUT); - return; - } - - h3c = ngx_http_v3_get_session(c); - - st = &r->v3_parse->headers; - - b = r->header_in; - - for ( ;; ) { - - if (b->pos == b->last) { - - if (rev->ready) { - n = c->recv(c, b->start, b->end - b->start); - - } else { - n = NGX_AGAIN; - } - - if (n == NGX_AGAIN) { - if (!rev->timer_set) { - cscf = ngx_http_get_module_srv_conf(r, - ngx_http_core_module); - ngx_add_timer(rev, cscf->client_header_timeout); - } - - if (ngx_handle_read_event(rev, 0) != NGX_OK) { - ngx_http_close_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR); - } - - break; - } - - if (n == 0) { - ngx_log_error(NGX_LOG_INFO, c->log, 0, - "client prematurely closed connection"); - } - - if (n == 0 || n == NGX_ERROR) { - c->error = 1; - c->log->action = "reading client request"; - - ngx_http_finalize_request(r, NGX_HTTP_BAD_REQUEST); - break; - } - - b->pos = b->start; - b->last = b->start + n; - } - - p = b->pos; - - rc = ngx_http_v3_parse_headers(c, st, b); - - if (rc > 0) { - ngx_quic_reset_stream(c, rc); - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "client sent invalid header"); - ngx_http_finalize_request(r, NGX_HTTP_BAD_REQUEST); - break; - } - - if (rc == NGX_ERROR) { - ngx_http_close_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR); - break; - } - - r->request_length += b->pos - p; - h3c->total_bytes += b->pos - p; - - if (ngx_http_v3_check_flood(c) != NGX_OK) { - ngx_http_close_request(r, NGX_HTTP_CLOSE); - break; - } - - if (rc == NGX_BUSY) { - if (rev->error) { - ngx_http_finalize_request(r, NGX_HTTP_BAD_REQUEST); - break; - } - - if (!rev->timer_set) { - cscf = ngx_http_get_module_srv_conf(r, - ngx_http_core_module); - ngx_add_timer(rev, cscf->client_header_timeout); - } - - if (ngx_handle_read_event(rev, 0) != NGX_OK) { - ngx_http_close_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR); - } - - break; - } - - if (rc == NGX_AGAIN) { - continue; - } - - /* rc == NGX_OK || rc == NGX_DONE */ - - h3c->payload_bytes += ngx_http_v3_encode_field_l(NULL, - &st->field_rep.field.name, - &st->field_rep.field.value); - - if (ngx_http_v3_process_header(r, &st->field_rep.field.name, - &st->field_rep.field.value) - != NGX_OK) - { - break; - } - - if (rc == NGX_DONE) { - if (ngx_http_v3_process_request_header(r) != NGX_OK) { - break; - } - - ngx_http_process_request(r); - break; - } - } - - ngx_http_run_posted_requests(c); - - return; -} - - -static ngx_int_t -ngx_http_v3_process_header(ngx_http_request_t *r, ngx_str_t *name, - ngx_str_t *value) -{ - size_t len; - ngx_table_elt_t *h; - ngx_http_header_t *hh; - ngx_http_core_srv_conf_t *cscf; - ngx_http_core_main_conf_t *cmcf; - - static ngx_str_t cookie = ngx_string("cookie"); - - len = name->len + value->len; - - if (len > r->v3_parse->header_limit) { - ngx_log_error(NGX_LOG_INFO, r->connection->log, 0, - "client sent too large header"); - ngx_http_finalize_request(r, NGX_HTTP_REQUEST_HEADER_TOO_LARGE); - return NGX_ERROR; - } - - r->v3_parse->header_limit -= len; - - if (ngx_http_v3_validate_header(r, name, value) != NGX_OK) { - ngx_http_finalize_request(r, NGX_HTTP_BAD_REQUEST); - return NGX_ERROR; - } - - if (r->invalid_header) { - cscf = ngx_http_get_module_srv_conf(r, ngx_http_core_module); - - if (cscf->ignore_invalid_headers) { - ngx_log_error(NGX_LOG_INFO, r->connection->log, 0, - "client sent invalid header: \"%V\"", name); - - return NGX_OK; - } - } - - if (name->len && name->data[0] == ':') { - return ngx_http_v3_process_pseudo_header(r, name, value); - } - - if (ngx_http_v3_init_pseudo_headers(r) != NGX_OK) { - return NGX_ERROR; - } - - if (name->len == cookie.len - && ngx_memcmp(name->data, cookie.data, cookie.len) == 0) - { - if (ngx_http_v3_cookie(r, value) != NGX_OK) { - ngx_http_close_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR); - return NGX_ERROR; - } - - } else { - cscf = ngx_http_get_module_srv_conf(r, ngx_http_core_module); - - if (r->headers_in.count++ >= cscf->max_headers) { - ngx_log_error(NGX_LOG_INFO, r->connection->log, 0, - "client sent too many header lines"); - ngx_http_finalize_request(r, NGX_HTTP_REQUEST_HEADER_TOO_LARGE); - return NGX_ERROR; - } - - h = ngx_list_push(&r->headers_in.headers); - if (h == NULL) { - ngx_http_close_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR); - return NGX_ERROR; - } - - h->key = *name; - h->value = *value; - h->lowcase_key = h->key.data; - h->hash = ngx_hash_key(h->key.data, h->key.len); - - cmcf = ngx_http_get_module_main_conf(r, ngx_http_core_module); - - hh = ngx_hash_find(&cmcf->headers_in_hash, h->hash, - h->lowcase_key, h->key.len); - - if (hh && hh->handler(r, h, hh->offset) != NGX_OK) { - return NGX_ERROR; - } - } - - ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "http3 header: \"%V: %V\"", name, value); - return NGX_OK; -} - - -static ngx_int_t -ngx_http_v3_validate_header(ngx_http_request_t *r, ngx_str_t *name, - ngx_str_t *value) -{ - u_char ch; - ngx_uint_t i; - ngx_http_core_srv_conf_t *cscf; - - r->invalid_header = 0; - - cscf = ngx_http_get_module_srv_conf(r, ngx_http_core_module); - - for (i = (name->data[0] == ':'); i != name->len; i++) { - ch = name->data[i]; - - if ((ch >= 'a' && ch <= 'z') - || (ch == '-') - || (ch >= '0' && ch <= '9') - || (ch == '_' && cscf->underscores_in_headers)) - { - continue; - } - - if (ch <= 0x20 || ch == 0x7f || ch == ':' - || (ch >= 'A' && ch <= 'Z')) - { - ngx_log_error(NGX_LOG_INFO, r->connection->log, 0, - "client sent invalid header name: \"%V\"", name); - - return NGX_ERROR; - } - - r->invalid_header = 1; - } - - for (i = 0; i != value->len; i++) { - ch = value->data[i]; - - if (ch == '\0' || ch == LF || ch == CR) { - ngx_log_error(NGX_LOG_INFO, r->connection->log, 0, - "client sent header \"%V\" with " - "invalid value: \"%V\"", name, value); - - return NGX_ERROR; - } - } - - return NGX_OK; -} - - -static ngx_int_t -ngx_http_v3_process_pseudo_header(ngx_http_request_t *r, ngx_str_t *name, - ngx_str_t *value) -{ - u_char ch, c; - ngx_uint_t i; - - if (r->request_line.len) { - ngx_log_error(NGX_LOG_INFO, r->connection->log, 0, - "client sent out of order pseudo-headers"); - goto failed; - } - - if (name->len == 7 && ngx_strncmp(name->data, ":method", 7) == 0) { - - if (r->method_name.len) { - ngx_log_error(NGX_LOG_INFO, r->connection->log, 0, - "client sent duplicate \":method\" header"); - goto failed; - } - - if (value->len == 0) { - ngx_log_error(NGX_LOG_INFO, r->connection->log, 0, - "client sent empty \":method\" header"); - goto failed; - } - - r->method_name = *value; - - for (i = 0; i < sizeof(ngx_http_v3_methods) - / sizeof(ngx_http_v3_methods[0]); i++) - { - if (value->len == ngx_http_v3_methods[i].name.len - && ngx_strncmp(value->data, - ngx_http_v3_methods[i].name.data, value->len) - == 0) - { - r->method = ngx_http_v3_methods[i].method; - break; - } - } - - for (i = 0; i < value->len; i++) { - ch = value->data[i]; - - if ((ch < 'A' || ch > 'Z') && ch != '_' && ch != '-') { - ngx_log_error(NGX_LOG_INFO, r->connection->log, 0, - "client sent invalid method: \"%V\"", value); - goto failed; - } - } - - ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "http3 method \"%V\" %ui", value, r->method); - return NGX_OK; - } - - if (name->len == 5 && ngx_strncmp(name->data, ":path", 5) == 0) { - - if (r->uri_start) { - ngx_log_error(NGX_LOG_INFO, r->connection->log, 0, - "client sent duplicate \":path\" header"); - goto failed; - } - - if (value->len == 0) { - ngx_log_error(NGX_LOG_INFO, r->connection->log, 0, - "client sent empty \":path\" header"); - goto failed; - } - - r->uri_start = value->data; - r->uri_end = value->data + value->len; - - if (ngx_http_parse_uri(r) != NGX_OK) { - ngx_log_error(NGX_LOG_INFO, r->connection->log, 0, - "client sent invalid \":path\" header: \"%V\"", - value); - goto failed; - } - - ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "http3 path \"%V\"", value); - return NGX_OK; - } - - if (name->len == 7 && ngx_strncmp(name->data, ":scheme", 7) == 0) { - - if (r->schema.len) { - ngx_log_error(NGX_LOG_INFO, r->connection->log, 0, - "client sent duplicate \":scheme\" header"); - goto failed; - } - - if (value->len == 0) { - ngx_log_error(NGX_LOG_INFO, r->connection->log, 0, - "client sent empty \":scheme\" header"); - goto failed; - } - - for (i = 0; i < value->len; i++) { - ch = value->data[i]; - - c = (u_char) (ch | 0x20); - if (c >= 'a' && c <= 'z') { - continue; - } - - if (((ch >= '0' && ch <= '9') - || ch == '+' || ch == '-' || ch == '.') - && i > 0) - { - continue; - } - - ngx_log_error(NGX_LOG_INFO, r->connection->log, 0, - "client sent invalid \":scheme\" header: \"%V\"", - value); - goto failed; - } - - r->schema = *value; - - ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "http3 schema \"%V\"", value); - return NGX_OK; - } - - if (name->len == 10 && ngx_strncmp(name->data, ":authority", 10) == 0) { - - if (r->host_start) { - ngx_log_error(NGX_LOG_INFO, r->connection->log, 0, - "client sent duplicate \":authority\" header"); - goto failed; - } - - r->host_start = value->data; - r->host_end = value->data + value->len; - - ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "http3 authority \"%V\"", value); - return NGX_OK; - } - - ngx_log_error(NGX_LOG_INFO, r->connection->log, 0, - "client sent unknown pseudo-header \"%V\"", name); - -failed: - - ngx_http_finalize_request(r, NGX_HTTP_BAD_REQUEST); - return NGX_ERROR; -} - - -static ngx_int_t -ngx_http_v3_init_pseudo_headers(ngx_http_request_t *r) -{ - size_t len; - u_char *p; - ngx_int_t rc; - ngx_str_t host; - in_port_t port; - - if (r->request_line.len) { - return NGX_OK; - } - - if (r->method_name.len == 0) { - ngx_log_error(NGX_LOG_INFO, r->connection->log, 0, - "client sent no \":method\" header"); - goto failed; - } - - if (r->schema.len == 0) { - ngx_log_error(NGX_LOG_INFO, r->connection->log, 0, - "client sent no \":scheme\" header"); - goto failed; - } - - if (r->uri_start == NULL) { - ngx_log_error(NGX_LOG_INFO, r->connection->log, 0, - "client sent no \":path\" header"); - goto failed; - } - - len = r->method_name.len + 1 - + (r->uri_end - r->uri_start) + 1 - + sizeof("HTTP/3.0") - 1; - - p = ngx_pnalloc(r->pool, len); - if (p == NULL) { - ngx_http_close_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR); - return NGX_ERROR; - } - - r->request_line.data = p; - - p = ngx_cpymem(p, r->method_name.data, r->method_name.len); - *p++ = ' '; - p = ngx_cpymem(p, r->uri_start, r->uri_end - r->uri_start); - *p++ = ' '; - p = ngx_cpymem(p, "HTTP/3.0", sizeof("HTTP/3.0") - 1); - - r->request_line.len = p - r->request_line.data; - - ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "http3 request line: \"%V\"", &r->request_line); - - ngx_str_set(&r->http_protocol, "HTTP/3.0"); - - if (ngx_http_process_request_uri(r) != NGX_OK) { - return NGX_ERROR; - } - - if (r->host_end) { - - host.len = r->host_end - r->host_start; - host.data = r->host_start; - - rc = ngx_http_validate_host(&host, &port, r->pool, 0); - - if (rc == NGX_DECLINED) { - ngx_log_error(NGX_LOG_INFO, r->connection->log, 0, - "client sent invalid \":authority\" header"); - goto failed; - } - - if (rc == NGX_ERROR) { - ngx_http_close_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR); - return NGX_ERROR; - } - - if (ngx_http_set_virtual_server(r, &host) == NGX_ERROR) { - return NGX_ERROR; - } - - r->headers_in.server = host; - r->port = port; - } - - if (ngx_list_init(&r->headers_in.headers, r->pool, 20, - sizeof(ngx_table_elt_t)) - != NGX_OK) - { - ngx_http_close_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR); - return NGX_ERROR; - } - - return NGX_OK; - -failed: - - ngx_http_finalize_request(r, NGX_HTTP_BAD_REQUEST); - return NGX_ERROR; -} - - -static ngx_int_t -ngx_http_v3_process_request_header(ngx_http_request_t *r) -{ - ssize_t n; - ngx_buf_t *b; - ngx_str_t host; - ngx_connection_t *c; - ngx_http_v3_session_t *h3c; - ngx_http_v3_srv_conf_t *h3scf; - - c = r->connection; - - if (ngx_http_v3_init_pseudo_headers(r) != NGX_OK) { - return NGX_ERROR; - } - - h3c = ngx_http_v3_get_session(c); - h3scf = ngx_http_get_module_srv_conf(r, ngx_http_v3_module); - - if ((h3c->hq && !h3scf->enable_hq) || (!h3c->hq && !h3scf->enable)) { - ngx_log_error(NGX_LOG_INFO, c->log, 0, - "client attempted to request the server name " - "for which the negotiated protocol is disabled"); - ngx_http_finalize_request(r, NGX_HTTP_MISDIRECTED_REQUEST); - return NGX_ERROR; - } - - if (ngx_http_v3_construct_cookie_header(r) != NGX_OK) { - return NGX_ERROR; - } - - if (r->headers_in.server.len == 0) { - ngx_log_error(NGX_LOG_INFO, c->log, 0, - "client sent neither \":authority\" nor \"Host\" header"); - goto failed; - } - - if (r->headers_in.host && r->host_end) { - - host.len = r->host_end - r->host_start; - host.data = r->host_start; - - if (r->headers_in.host->value.len != host.len - || ngx_memcmp(r->headers_in.host->value.data, host.data, host.len) - != 0) - { - ngx_log_error(NGX_LOG_INFO, c->log, 0, - "client sent \":authority\" and \"Host\" headers " - "with different values"); - goto failed; - } - } - - if (r->headers_in.content_length) { - r->headers_in.content_length_n = - ngx_atoof(r->headers_in.content_length->value.data, - r->headers_in.content_length->value.len); - - if (r->headers_in.content_length_n == NGX_ERROR) { - ngx_log_error(NGX_LOG_INFO, c->log, 0, - "client sent invalid \"Content-Length\" header"); - goto failed; - } - - } else { - b = r->header_in; - n = b->last - b->pos; - - if (n == 0) { - n = c->recv(c, b->start, b->end - b->start); - - if (n == NGX_ERROR) { - ngx_http_close_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR); - return NGX_ERROR; - } - - if (n > 0) { - b->pos = b->start; - b->last = b->start + n; - } - } - - if (n != 0) { - r->headers_in.chunked = 1; - } - } - - if (r->method == NGX_HTTP_CONNECT) { - ngx_log_error(NGX_LOG_INFO, c->log, 0, "client sent CONNECT method"); - ngx_http_finalize_request(r, NGX_HTTP_NOT_ALLOWED); - return NGX_ERROR; - } - - if (r->method == NGX_HTTP_TRACE) { - ngx_log_error(NGX_LOG_INFO, c->log, 0, "client sent TRACE method"); - ngx_http_finalize_request(r, NGX_HTTP_NOT_ALLOWED); - return NGX_ERROR; - } - - return NGX_OK; - -failed: - - ngx_http_finalize_request(r, NGX_HTTP_BAD_REQUEST); - return NGX_ERROR; -} - - -static ngx_int_t -ngx_http_v3_cookie(ngx_http_request_t *r, ngx_str_t *value) -{ - ngx_str_t *val; - ngx_array_t *cookies; - - cookies = r->v3_parse->cookies; - - if (cookies == NULL) { - cookies = ngx_array_create(r->pool, 2, sizeof(ngx_str_t)); - if (cookies == NULL) { - return NGX_ERROR; - } - - r->v3_parse->cookies = cookies; - } - - val = ngx_array_push(cookies); - if (val == NULL) { - return NGX_ERROR; - } - - *val = *value; - - return NGX_OK; -} - - -static ngx_int_t -ngx_http_v3_construct_cookie_header(ngx_http_request_t *r) -{ - u_char *buf, *p, *end; - size_t len; - ngx_str_t *vals; - ngx_uint_t i; - ngx_array_t *cookies; - ngx_table_elt_t *h; - ngx_http_header_t *hh; - ngx_http_core_main_conf_t *cmcf; - - static ngx_str_t cookie = ngx_string("cookie"); - - cookies = r->v3_parse->cookies; - - if (cookies == NULL) { - return NGX_OK; - } - - vals = cookies->elts; - - i = 0; - len = 0; - - do { - len += vals[i].len + 2; - } while (++i != cookies->nelts); - - len -= 2; - - buf = ngx_pnalloc(r->pool, len + 1); - if (buf == NULL) { - ngx_http_close_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR); - return NGX_ERROR; - } - - p = buf; - end = buf + len; - - for (i = 0; /* void */ ; i++) { - - p = ngx_cpymem(p, vals[i].data, vals[i].len); - - if (p == end) { - *p = '\0'; - break; - } - - *p++ = ';'; *p++ = ' '; - } - - h = ngx_list_push(&r->headers_in.headers); - if (h == NULL) { - ngx_http_close_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR); - return NGX_ERROR; - } - - h->hash = ngx_hash(ngx_hash(ngx_hash(ngx_hash( - ngx_hash('c', 'o'), 'o'), 'k'), 'i'), 'e'); - - h->key.len = cookie.len; - h->key.data = cookie.data; - - h->value.len = len; - h->value.data = buf; - - h->lowcase_key = cookie.data; - - cmcf = ngx_http_get_module_main_conf(r, ngx_http_core_module); - - hh = ngx_hash_find(&cmcf->headers_in_hash, h->hash, - h->lowcase_key, h->key.len); - - if (hh == NULL) { - ngx_http_close_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR); - return NGX_ERROR; - } - - if (hh->handler(r, h, hh->offset) != NGX_OK) { - /* - * request has been finalized already - * in ngx_http_process_header_line() - */ - return NGX_ERROR; - } - - return NGX_OK; -} - - -ngx_int_t -ngx_http_v3_read_request_body(ngx_http_request_t *r) -{ - size_t preread; - ngx_int_t rc; - ngx_chain_t *cl, out; - ngx_http_request_body_t *rb; - ngx_http_core_loc_conf_t *clcf; - - rb = r->request_body; - - preread = r->header_in->last - r->header_in->pos; - - if (preread) { - - /* there is the pre-read part of the request body */ - - ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "http3 client request body preread %uz", preread); - - out.buf = r->header_in; - out.next = NULL; - cl = &out; - - } else { - cl = NULL; - } - - rc = ngx_http_v3_request_body_filter(r, cl); - if (rc != NGX_OK) { - return rc; - } - - if (rb->rest == 0 && rb->last_saved) { - /* the whole request body was pre-read */ - r->request_body_no_buffering = 0; - rb->post_handler(r); - return NGX_OK; - } - - if (rb->rest < 0) { - ngx_log_error(NGX_LOG_ALERT, r->connection->log, 0, - "negative request body rest"); - return NGX_HTTP_INTERNAL_SERVER_ERROR; - } - - clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module); - - rb->buf = ngx_create_temp_buf(r->pool, clcf->client_body_buffer_size); - if (rb->buf == NULL) { - return NGX_HTTP_INTERNAL_SERVER_ERROR; - } - - r->read_event_handler = ngx_http_v3_read_client_request_body_handler; - r->write_event_handler = ngx_http_request_empty_handler; - - return ngx_http_v3_do_read_client_request_body(r); -} - - -static void -ngx_http_v3_read_client_request_body_handler(ngx_http_request_t *r) -{ - ngx_int_t rc; - - if (r->connection->read->timedout) { - r->connection->timedout = 1; - ngx_http_finalize_request(r, NGX_HTTP_REQUEST_TIME_OUT); - return; - } - - rc = ngx_http_v3_do_read_client_request_body(r); - - if (rc >= NGX_HTTP_SPECIAL_RESPONSE) { - ngx_http_finalize_request(r, rc); - } -} - - -ngx_int_t -ngx_http_v3_read_unbuffered_request_body(ngx_http_request_t *r) -{ - ngx_int_t rc; - - if (r->connection->read->timedout) { - r->connection->timedout = 1; - return NGX_HTTP_REQUEST_TIME_OUT; - } - - rc = ngx_http_v3_do_read_client_request_body(r); - - if (rc == NGX_OK) { - r->reading_body = 0; - } - - return rc; -} - - -static ngx_int_t -ngx_http_v3_do_read_client_request_body(ngx_http_request_t *r) -{ - off_t rest; - size_t size; - ssize_t n; - ngx_int_t rc; - ngx_uint_t flush; - ngx_chain_t out; - ngx_connection_t *c; - ngx_http_request_body_t *rb; - ngx_http_core_loc_conf_t *clcf; - - c = r->connection; - rb = r->request_body; - flush = 1; - - ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0, - "http3 read client request body"); - - for ( ;; ) { - for ( ;; ) { - if (rb->rest == 0) { - break; - } - - if (rb->buf->last == rb->buf->end) { - - /* update chains */ - - rc = ngx_http_v3_request_body_filter(r, NULL); - - if (rc != NGX_OK) { - return rc; - } - - if (rb->busy != NULL) { - if (r->request_body_no_buffering) { - if (c->read->timer_set) { - ngx_del_timer(c->read); - } - - if (ngx_handle_read_event(c->read, 0) != NGX_OK) { - return NGX_HTTP_INTERNAL_SERVER_ERROR; - } - - return NGX_AGAIN; - } - - if (rb->filter_need_buffering) { - clcf = ngx_http_get_module_loc_conf(r, - ngx_http_core_module); - ngx_add_timer(c->read, clcf->client_body_timeout); - - if (ngx_handle_read_event(c->read, 0) != NGX_OK) { - return NGX_HTTP_INTERNAL_SERVER_ERROR; - } - - return NGX_AGAIN; - } - - ngx_log_error(NGX_LOG_ALERT, c->log, 0, - "busy buffers after request body flush"); - - return NGX_HTTP_INTERNAL_SERVER_ERROR; - } - - flush = 0; - rb->buf->pos = rb->buf->start; - rb->buf->last = rb->buf->start; - } - - size = rb->buf->end - rb->buf->last; - rest = rb->rest - (rb->buf->last - rb->buf->pos); - - if ((off_t) size > rest) { - size = (size_t) rest; - } - - if (size == 0) { - break; - } - - n = c->recv(c, rb->buf->last, size); - - ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0, - "http3 client request body recv %z", n); - - if (n == NGX_AGAIN) { - break; - } - - if (n == 0) { - rb->buf->last_buf = 1; - } - - if (n == NGX_ERROR) { - c->error = 1; - return NGX_HTTP_BAD_REQUEST; - } - - rb->buf->last += n; - - /* pass buffer to request body filter chain */ - - flush = 0; - out.buf = rb->buf; - out.next = NULL; - - rc = ngx_http_v3_request_body_filter(r, &out); - - if (rc != NGX_OK) { - return rc; - } - - if (rb->rest == 0) { - break; - } - - if (rb->buf->last < rb->buf->end) { - break; - } - } - - ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0, - "http3 client request body rest %O", rb->rest); - - if (flush) { - rc = ngx_http_v3_request_body_filter(r, NULL); - - if (rc != NGX_OK) { - return rc; - } - } - - if (rb->rest == 0 && rb->last_saved) { - break; - } - - if (!c->read->ready || rb->rest == 0) { - - clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module); - ngx_add_timer(c->read, clcf->client_body_timeout); - - if (ngx_handle_read_event(c->read, 0) != NGX_OK) { - return NGX_HTTP_INTERNAL_SERVER_ERROR; - } - - return NGX_AGAIN; - } - } - - if (c->read->timer_set) { - ngx_del_timer(c->read); - } - - if (!r->request_body_no_buffering) { - r->read_event_handler = ngx_http_block_reading; - rb->post_handler(r); - } - - return NGX_OK; -} - - -static ngx_int_t -ngx_http_v3_request_body_filter(ngx_http_request_t *r, ngx_chain_t *in) -{ - off_t max; - size_t size; - u_char *p; - ngx_int_t rc; - ngx_buf_t *b; - ngx_uint_t last; - ngx_chain_t *cl, *out, *tl, **ll; - ngx_http_v3_session_t *h3c; - ngx_http_request_body_t *rb; - ngx_http_core_loc_conf_t *clcf; - ngx_http_core_srv_conf_t *cscf; - ngx_http_v3_parse_data_t *st; - - rb = r->request_body; - st = &r->v3_parse->body; - - h3c = ngx_http_v3_get_session(r->connection); - - if (rb->rest == -1) { - - ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "http3 request body filter"); - - cscf = ngx_http_get_module_srv_conf(r, ngx_http_core_module); - - rb->rest = cscf->large_client_header_buffers.size; - } - - clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module); - - max = r->headers_in.content_length_n; - - if (max == -1 && clcf->client_max_body_size) { - max = clcf->client_max_body_size; - } - - out = NULL; - ll = &out; - last = 0; - - for (cl = in; cl; cl = cl->next) { - - ngx_log_debug7(NGX_LOG_DEBUG_EVENT, r->connection->log, 0, - "http3 body buf " - "t:%d f:%d %p, pos %p, size: %z file: %O, size: %O", - cl->buf->temporary, cl->buf->in_file, - cl->buf->start, cl->buf->pos, - cl->buf->last - cl->buf->pos, - cl->buf->file_pos, - cl->buf->file_last - cl->buf->file_pos); - - if (cl->buf->last_buf) { - last = 1; - } - - b = NULL; - - while (cl->buf->pos < cl->buf->last) { - - if (st->length == 0) { - p = cl->buf->pos; - - rc = ngx_http_v3_parse_data(r->connection, st, cl->buf); - - r->request_length += cl->buf->pos - p; - h3c->total_bytes += cl->buf->pos - p; - - if (ngx_http_v3_check_flood(r->connection) != NGX_OK) { - return NGX_HTTP_CLOSE; - } - - if (rc == NGX_AGAIN) { - continue; - } - - if (rc == NGX_DONE) { - last = 1; - goto done; - } - - if (rc > 0) { - ngx_quic_reset_stream(r->connection, rc); - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "client sent invalid body"); - return NGX_HTTP_BAD_REQUEST; - } - - if (rc == NGX_ERROR) { - return NGX_HTTP_INTERNAL_SERVER_ERROR; - } - - /* rc == NGX_OK */ - - if (max != -1 && (uint64_t) (max - rb->received) < st->length) { - - if (r->headers_in.content_length_n != -1) { - ngx_log_error(NGX_LOG_INFO, r->connection->log, 0, - "client intended to send body data " - "larger than declared"); - - return NGX_HTTP_BAD_REQUEST; - } - - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "client intended to send too large " - "body: %O+%ui bytes", - rb->received, st->length); - - return NGX_HTTP_REQUEST_ENTITY_TOO_LARGE; - } - - continue; - } - - if (b - && st->length <= 128 - && (uint64_t) (cl->buf->last - cl->buf->pos) >= st->length) - { - rb->received += st->length; - r->request_length += st->length; - h3c->total_bytes += st->length; - h3c->payload_bytes += st->length; - - if (st->length < 8) { - - while (st->length) { - *b->last++ = *cl->buf->pos++; - st->length--; - } - - } else { - ngx_memmove(b->last, cl->buf->pos, st->length); - b->last += st->length; - cl->buf->pos += st->length; - st->length = 0; - } - - continue; - } - - tl = ngx_chain_get_free_buf(r->pool, &rb->free); - if (tl == NULL) { - return NGX_HTTP_INTERNAL_SERVER_ERROR; - } - - b = tl->buf; - - ngx_memzero(b, sizeof(ngx_buf_t)); - - b->temporary = 1; - b->tag = (ngx_buf_tag_t) &ngx_http_read_client_request_body; - b->start = cl->buf->pos; - b->pos = cl->buf->pos; - b->last = cl->buf->last; - b->end = cl->buf->end; - b->flush = r->request_body_no_buffering; - - *ll = tl; - ll = &tl->next; - - size = cl->buf->last - cl->buf->pos; - - if (size > st->length) { - cl->buf->pos += (size_t) st->length; - rb->received += st->length; - r->request_length += st->length; - h3c->total_bytes += st->length; - h3c->payload_bytes += st->length; - st->length = 0; - - } else { - st->length -= size; - rb->received += size; - r->request_length += size; - h3c->total_bytes += size; - h3c->payload_bytes += size; - cl->buf->pos = cl->buf->last; - } - - b->last = cl->buf->pos; - } - } - -done: - - if (last) { - - if (st->length > 0) { - ngx_log_error(NGX_LOG_INFO, r->connection->log, 0, - "client prematurely closed stream"); - r->connection->error = 1; - return NGX_HTTP_BAD_REQUEST; - } - - if (r->headers_in.content_length_n == -1) { - r->headers_in.content_length_n = rb->received; - - } else if (r->headers_in.content_length_n != rb->received) { - ngx_log_error(NGX_LOG_INFO, r->connection->log, 0, - "client sent less body data than expected: " - "%O out of %O bytes of request body received", - rb->received, r->headers_in.content_length_n); - return NGX_HTTP_BAD_REQUEST; - } - - rb->rest = 0; - - tl = ngx_chain_get_free_buf(r->pool, &rb->free); - if (tl == NULL) { - return NGX_HTTP_INTERNAL_SERVER_ERROR; - } - - b = tl->buf; - - ngx_memzero(b, sizeof(ngx_buf_t)); - - b->last_buf = 1; - - *ll = tl; - - } else { - - /* set rb->rest, amount of data we want to see next time */ - - cscf = ngx_http_get_module_srv_conf(r, ngx_http_core_module); - - rb->rest = (off_t) cscf->large_client_header_buffers.size; - } - - rc = ngx_http_top_request_body_filter(r, out); - - ngx_chain_update_chains(r->pool, &rb->free, &rb->busy, &out, - (ngx_buf_tag_t) &ngx_http_read_client_request_body); - - return rc; -} diff --git a/src/deps/src/nginx-1.30.3/src/http/v3/ngx_http_v3_table.c b/src/deps/src/nginx-1.30.3/src/http/v3/ngx_http_v3_table.c deleted file mode 100644 index 428e7326b9..0000000000 --- a/src/deps/src/nginx-1.30.3/src/http/v3/ngx_http_v3_table.c +++ /dev/null @@ -1,715 +0,0 @@ - -/* - * Copyright (C) Roman Arutyunyan - * Copyright (C) Nginx, Inc. - */ - - -#include -#include -#include - - -#define ngx_http_v3_table_entry_size(n, v) ((n)->len + (v)->len + 32) - - -static ngx_int_t ngx_http_v3_evict(ngx_connection_t *c, size_t target); -static void ngx_http_v3_unblock(void *data); -static ngx_int_t ngx_http_v3_new_entry(ngx_connection_t *c); - - -typedef struct { - ngx_queue_t queue; - ngx_connection_t *connection; - ngx_uint_t *nblocked; -} ngx_http_v3_block_t; - - -static ngx_http_v3_field_t ngx_http_v3_static_table[] = { - - { ngx_string(":authority"), ngx_string("") }, - { ngx_string(":path"), ngx_string("/") }, - { ngx_string("age"), ngx_string("0") }, - { ngx_string("content-disposition"), ngx_string("") }, - { ngx_string("content-length"), ngx_string("0") }, - { ngx_string("cookie"), ngx_string("") }, - { ngx_string("date"), ngx_string("") }, - { ngx_string("etag"), ngx_string("") }, - { ngx_string("if-modified-since"), ngx_string("") }, - { ngx_string("if-none-match"), ngx_string("") }, - { ngx_string("last-modified"), ngx_string("") }, - { ngx_string("link"), ngx_string("") }, - { ngx_string("location"), ngx_string("") }, - { ngx_string("referer"), ngx_string("") }, - { ngx_string("set-cookie"), ngx_string("") }, - { ngx_string(":method"), ngx_string("CONNECT") }, - { ngx_string(":method"), ngx_string("DELETE") }, - { ngx_string(":method"), ngx_string("GET") }, - { ngx_string(":method"), ngx_string("HEAD") }, - { ngx_string(":method"), ngx_string("OPTIONS") }, - { ngx_string(":method"), ngx_string("POST") }, - { ngx_string(":method"), ngx_string("PUT") }, - { ngx_string(":scheme"), ngx_string("http") }, - { ngx_string(":scheme"), ngx_string("https") }, - { ngx_string(":status"), ngx_string("103") }, - { ngx_string(":status"), ngx_string("200") }, - { ngx_string(":status"), ngx_string("304") }, - { ngx_string(":status"), ngx_string("404") }, - { ngx_string(":status"), ngx_string("503") }, - { ngx_string("accept"), ngx_string("*/*") }, - { ngx_string("accept"), - ngx_string("application/dns-message") }, - { ngx_string("accept-encoding"), ngx_string("gzip, deflate, br") }, - { ngx_string("accept-ranges"), ngx_string("bytes") }, - { ngx_string("access-control-allow-headers"), - ngx_string("cache-control") }, - { ngx_string("access-control-allow-headers"), - ngx_string("content-type") }, - { ngx_string("access-control-allow-origin"), - ngx_string("*") }, - { ngx_string("cache-control"), ngx_string("max-age=0") }, - { ngx_string("cache-control"), ngx_string("max-age=2592000") }, - { ngx_string("cache-control"), ngx_string("max-age=604800") }, - { ngx_string("cache-control"), ngx_string("no-cache") }, - { ngx_string("cache-control"), ngx_string("no-store") }, - { ngx_string("cache-control"), - ngx_string("public, max-age=31536000") }, - { ngx_string("content-encoding"), ngx_string("br") }, - { ngx_string("content-encoding"), ngx_string("gzip") }, - { ngx_string("content-type"), - ngx_string("application/dns-message") }, - { ngx_string("content-type"), - ngx_string("application/javascript") }, - { ngx_string("content-type"), ngx_string("application/json") }, - { ngx_string("content-type"), - ngx_string("application/x-www-form-urlencoded") }, - { ngx_string("content-type"), ngx_string("image/gif") }, - { ngx_string("content-type"), ngx_string("image/jpeg") }, - { ngx_string("content-type"), ngx_string("image/png") }, - { ngx_string("content-type"), ngx_string("text/css") }, - { ngx_string("content-type"), - ngx_string("text/html;charset=utf-8") }, - { ngx_string("content-type"), ngx_string("text/plain") }, - { ngx_string("content-type"), - ngx_string("text/plain;charset=utf-8") }, - { ngx_string("range"), ngx_string("bytes=0-") }, - { ngx_string("strict-transport-security"), - ngx_string("max-age=31536000") }, - { ngx_string("strict-transport-security"), - ngx_string("max-age=31536000;includesubdomains") }, - { ngx_string("strict-transport-security"), - ngx_string("max-age=31536000;includesubdomains;preload") }, - { ngx_string("vary"), ngx_string("accept-encoding") }, - { ngx_string("vary"), ngx_string("origin") }, - { ngx_string("x-content-type-options"), - ngx_string("nosniff") }, - { ngx_string("x-xss-protection"), ngx_string("1;mode=block") }, - { ngx_string(":status"), ngx_string("100") }, - { ngx_string(":status"), ngx_string("204") }, - { ngx_string(":status"), ngx_string("206") }, - { ngx_string(":status"), ngx_string("302") }, - { ngx_string(":status"), ngx_string("400") }, - { ngx_string(":status"), ngx_string("403") }, - { ngx_string(":status"), ngx_string("421") }, - { ngx_string(":status"), ngx_string("425") }, - { ngx_string(":status"), ngx_string("500") }, - { ngx_string("accept-language"), ngx_string("") }, - { ngx_string("access-control-allow-credentials"), - ngx_string("FALSE") }, - { ngx_string("access-control-allow-credentials"), - ngx_string("TRUE") }, - { ngx_string("access-control-allow-headers"), - ngx_string("*") }, - { ngx_string("access-control-allow-methods"), - ngx_string("get") }, - { ngx_string("access-control-allow-methods"), - ngx_string("get, post, options") }, - { ngx_string("access-control-allow-methods"), - ngx_string("options") }, - { ngx_string("access-control-expose-headers"), - ngx_string("content-length") }, - { ngx_string("access-control-request-headers"), - ngx_string("content-type") }, - { ngx_string("access-control-request-method"), - ngx_string("get") }, - { ngx_string("access-control-request-method"), - ngx_string("post") }, - { ngx_string("alt-svc"), ngx_string("clear") }, - { ngx_string("authorization"), ngx_string("") }, - { ngx_string("content-security-policy"), - ngx_string("script-src 'none';object-src 'none';base-uri 'none'") }, - { ngx_string("early-data"), ngx_string("1") }, - { ngx_string("expect-ct"), ngx_string("") }, - { ngx_string("forwarded"), ngx_string("") }, - { ngx_string("if-range"), ngx_string("") }, - { ngx_string("origin"), ngx_string("") }, - { ngx_string("purpose"), ngx_string("prefetch") }, - { ngx_string("server"), ngx_string("") }, - { ngx_string("timing-allow-origin"), ngx_string("*") }, - { ngx_string("upgrade-insecure-requests"), - ngx_string("1") }, - { ngx_string("user-agent"), ngx_string("") }, - { ngx_string("x-forwarded-for"), ngx_string("") }, - { ngx_string("x-frame-options"), ngx_string("deny") }, - { ngx_string("x-frame-options"), ngx_string("sameorigin") } -}; - - -ngx_int_t -ngx_http_v3_ref_insert(ngx_connection_t *c, ngx_uint_t dynamic, - ngx_uint_t index, ngx_str_t *value) -{ - ngx_str_t name; - ngx_http_v3_session_t *h3c; - ngx_http_v3_dynamic_table_t *dt; - - if (dynamic) { - ngx_log_debug2(NGX_LOG_DEBUG_HTTP, c->log, 0, - "http3 ref insert dynamic[%ui] \"%V\"", index, value); - - h3c = ngx_http_v3_get_session(c); - dt = &h3c->table; - - if (dt->base + dt->nelts <= index) { - return NGX_HTTP_V3_ERR_ENCODER_STREAM_ERROR; - } - - index = dt->base + dt->nelts - 1 - index; - - if (ngx_http_v3_lookup(c, index, &name, NULL) != NGX_OK) { - return NGX_HTTP_V3_ERR_ENCODER_STREAM_ERROR; - } - - } else { - ngx_log_debug2(NGX_LOG_DEBUG_HTTP, c->log, 0, - "http3 ref insert static[%ui] \"%V\"", index, value); - - if (ngx_http_v3_lookup_static(c, index, &name, NULL) != NGX_OK) { - return NGX_HTTP_V3_ERR_ENCODER_STREAM_ERROR; - } - } - - return ngx_http_v3_insert(c, &name, value); -} - - -ngx_int_t -ngx_http_v3_insert(ngx_connection_t *c, ngx_str_t *name, ngx_str_t *value) -{ - u_char *p; - size_t size; - ngx_http_v3_field_t *field; - ngx_http_v3_session_t *h3c; - ngx_http_v3_dynamic_table_t *dt; - - size = ngx_http_v3_table_entry_size(name, value); - - h3c = ngx_http_v3_get_session(c); - dt = &h3c->table; - - if (size > dt->capacity) { - ngx_log_error(NGX_LOG_ERR, c->log, 0, - "not enough dynamic table capacity"); - return NGX_HTTP_V3_ERR_ENCODER_STREAM_ERROR; - } - - ngx_log_debug4(NGX_LOG_DEBUG_HTTP, c->log, 0, - "http3 insert [%ui] \"%V\":\"%V\", size:%uz", - dt->base + dt->nelts, name, value, size); - - p = ngx_alloc(sizeof(ngx_http_v3_field_t) + name->len + value->len, - c->log); - if (p == NULL) { - return NGX_ERROR; - } - - field = (ngx_http_v3_field_t *) p; - - field->name.data = p + sizeof(ngx_http_v3_field_t); - field->name.len = name->len; - field->value.data = ngx_cpymem(field->name.data, name->data, name->len); - field->value.len = value->len; - ngx_memcpy(field->value.data, value->data, value->len); - - dt->elts[dt->nelts++] = field; - dt->size += size; - - dt->insert_count++; - - if (ngx_http_v3_evict(c, dt->capacity) != NGX_OK) { - return NGX_ERROR; - } - - ngx_post_event(&dt->send_insert_count, &ngx_posted_events); - - if (ngx_http_v3_new_entry(c) != NGX_OK) { - return NGX_ERROR; - } - - return NGX_OK; -} - - -void -ngx_http_v3_inc_insert_count_handler(ngx_event_t *ev) -{ - ngx_connection_t *c; - ngx_http_v3_session_t *h3c; - ngx_http_v3_dynamic_table_t *dt; - - c = ev->data; - - ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0, - "http3 inc insert count handler"); - - h3c = ngx_http_v3_get_session(c); - dt = &h3c->table; - - if (dt->insert_count > dt->ack_insert_count) { - if (ngx_http_v3_send_inc_insert_count(c, - dt->insert_count - dt->ack_insert_count) - != NGX_OK) - { - return; - } - - dt->ack_insert_count = dt->insert_count; - } -} - - -ngx_int_t -ngx_http_v3_set_capacity(ngx_connection_t *c, ngx_uint_t capacity) -{ - ngx_uint_t max, prev_max; - ngx_http_v3_field_t **elts; - ngx_http_v3_session_t *h3c; - ngx_http_v3_srv_conf_t *h3scf; - ngx_http_v3_dynamic_table_t *dt; - - ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0, - "http3 set capacity %ui", capacity); - - h3c = ngx_http_v3_get_session(c); - h3scf = ngx_http_v3_get_module_srv_conf(c, ngx_http_v3_module); - - if (capacity > h3scf->max_table_capacity) { - ngx_log_error(NGX_LOG_INFO, c->log, 0, - "client exceeded http3_max_table_capacity limit"); - return NGX_HTTP_V3_ERR_ENCODER_STREAM_ERROR; - } - - if (ngx_http_v3_evict(c, capacity) != NGX_OK) { - return NGX_HTTP_V3_ERR_ENCODER_STREAM_ERROR; - } - - dt = &h3c->table; - max = capacity / 32; - prev_max = dt->capacity / 32; - - if (max > prev_max) { - elts = ngx_alloc((max + 1) * sizeof(void *), c->log); - if (elts == NULL) { - return NGX_ERROR; - } - - if (dt->elts) { - ngx_memcpy(elts, dt->elts, dt->nelts * sizeof(void *)); - ngx_free(dt->elts); - } - - dt->elts = elts; - } - - dt->capacity = capacity; - - return NGX_OK; -} - - -void -ngx_http_v3_cleanup_table(ngx_http_v3_session_t *h3c) -{ - ngx_uint_t n; - ngx_http_v3_dynamic_table_t *dt; - - dt = &h3c->table; - - if (dt->elts == NULL) { - return; - } - - for (n = 0; n < dt->nelts; n++) { - ngx_free(dt->elts[n]); - } - - ngx_free(dt->elts); -} - - -static ngx_int_t -ngx_http_v3_evict(ngx_connection_t *c, size_t target) -{ - size_t size; - ngx_uint_t n; - ngx_http_v3_field_t *field; - ngx_http_v3_session_t *h3c; - ngx_http_v3_dynamic_table_t *dt; - - h3c = ngx_http_v3_get_session(c); - dt = &h3c->table; - n = 0; - - while (dt->size > target) { - field = dt->elts[n++]; - size = ngx_http_v3_table_entry_size(&field->name, &field->value); - - ngx_log_debug4(NGX_LOG_DEBUG_HTTP, c->log, 0, - "http3 evict [%ui] \"%V\":\"%V\" size:%uz", - dt->base, &field->name, &field->value, size); - - ngx_free(field); - dt->size -= size; - } - - if (n) { - dt->nelts -= n; - dt->base += n; - ngx_memmove(dt->elts, &dt->elts[n], dt->nelts * sizeof(void *)); - } - - return NGX_OK; -} - - -ngx_int_t -ngx_http_v3_duplicate(ngx_connection_t *c, ngx_uint_t index) -{ - ngx_str_t name, value; - ngx_http_v3_session_t *h3c; - ngx_http_v3_dynamic_table_t *dt; - - ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0, "http3 duplicate %ui", index); - - h3c = ngx_http_v3_get_session(c); - dt = &h3c->table; - - if (dt->base + dt->nelts <= index) { - return NGX_HTTP_V3_ERR_ENCODER_STREAM_ERROR; - } - - index = dt->base + dt->nelts - 1 - index; - - if (ngx_http_v3_lookup(c, index, &name, &value) != NGX_OK) { - return NGX_HTTP_V3_ERR_ENCODER_STREAM_ERROR; - } - - return ngx_http_v3_insert(c, &name, &value); -} - - -ngx_int_t -ngx_http_v3_ack_section(ngx_connection_t *c, ngx_uint_t stream_id) -{ - ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0, - "http3 ack section %ui", stream_id); - - /* we do not use dynamic tables */ - - return NGX_HTTP_V3_ERR_DECODER_STREAM_ERROR; -} - - -ngx_int_t -ngx_http_v3_inc_insert_count(ngx_connection_t *c, ngx_uint_t inc) -{ - ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0, - "http3 increment insert count %ui", inc); - - /* we do not use dynamic tables */ - - return NGX_HTTP_V3_ERR_DECODER_STREAM_ERROR; -} - - -ngx_int_t -ngx_http_v3_lookup_static(ngx_connection_t *c, ngx_uint_t index, - ngx_str_t *name, ngx_str_t *value) -{ - ngx_uint_t nelts; - ngx_http_v3_field_t *field; - - nelts = sizeof(ngx_http_v3_static_table) - / sizeof(ngx_http_v3_static_table[0]); - - if (index >= nelts) { - ngx_log_debug2(NGX_LOG_DEBUG_HTTP, c->log, 0, - "http3 static[%ui] lookup out of bounds: %ui", - index, nelts); - return NGX_ERROR; - } - - field = &ngx_http_v3_static_table[index]; - - ngx_log_debug3(NGX_LOG_DEBUG_HTTP, c->log, 0, - "http3 static[%ui] lookup \"%V\":\"%V\"", - index, &field->name, &field->value); - - if (name) { - *name = field->name; - } - - if (value) { - *value = field->value; - } - - return NGX_OK; -} - - -ngx_int_t -ngx_http_v3_lookup(ngx_connection_t *c, ngx_uint_t index, ngx_str_t *name, - ngx_str_t *value) -{ - ngx_http_v3_field_t *field; - ngx_http_v3_session_t *h3c; - ngx_http_v3_dynamic_table_t *dt; - - h3c = ngx_http_v3_get_session(c); - dt = &h3c->table; - - if (index < dt->base || index - dt->base >= dt->nelts) { - ngx_log_debug3(NGX_LOG_DEBUG_HTTP, c->log, 0, - "http3 dynamic[%ui] lookup out of bounds: [%ui,%ui]", - index, dt->base, dt->base + dt->nelts); - return NGX_ERROR; - } - - field = dt->elts[index - dt->base]; - - ngx_log_debug3(NGX_LOG_DEBUG_HTTP, c->log, 0, - "http3 dynamic[%ui] lookup \"%V\":\"%V\"", - index, &field->name, &field->value); - - if (name) { - *name = field->name; - } - - if (value) { - *value = field->value; - } - - return NGX_OK; -} - - -ngx_int_t -ngx_http_v3_decode_insert_count(ngx_connection_t *c, ngx_uint_t *insert_count) -{ - ngx_uint_t max_entries, full_range, max_value, - max_wrapped, req_insert_count; - ngx_http_v3_srv_conf_t *h3scf; - ngx_http_v3_session_t *h3c; - ngx_http_v3_dynamic_table_t *dt; - - /* QPACK 4.5.1.1. Required Insert Count */ - - if (*insert_count == 0) { - return NGX_OK; - } - - h3c = ngx_http_v3_get_session(c); - dt = &h3c->table; - - h3scf = ngx_http_v3_get_module_srv_conf(c, ngx_http_v3_module); - - max_entries = h3scf->max_table_capacity / 32; - full_range = 2 * max_entries; - - if (*insert_count > full_range) { - return NGX_HTTP_V3_ERR_DECOMPRESSION_FAILED; - } - - max_value = dt->base + dt->nelts + max_entries; - max_wrapped = (max_value / full_range) * full_range; - req_insert_count = max_wrapped + *insert_count - 1; - - if (req_insert_count > max_value) { - if (req_insert_count <= full_range) { - return NGX_HTTP_V3_ERR_DECOMPRESSION_FAILED; - } - - req_insert_count -= full_range; - } - - if (req_insert_count == 0) { - return NGX_HTTP_V3_ERR_DECOMPRESSION_FAILED; - } - - ngx_log_debug2(NGX_LOG_DEBUG_HTTP, c->log, 0, - "http3 decode insert_count %ui -> %ui", - *insert_count, req_insert_count); - - *insert_count = req_insert_count; - - return NGX_OK; -} - - -ngx_int_t -ngx_http_v3_check_insert_count(ngx_connection_t *c, ngx_uint_t insert_count) -{ - size_t n; - ngx_pool_cleanup_t *cln; - ngx_http_v3_block_t *block; - ngx_http_v3_session_t *h3c; - ngx_http_v3_srv_conf_t *h3scf; - ngx_http_v3_dynamic_table_t *dt; - - h3c = ngx_http_v3_get_session(c); - dt = &h3c->table; - - n = dt->base + dt->nelts; - - ngx_log_debug2(NGX_LOG_DEBUG_HTTP, c->log, 0, - "http3 check insert count req:%ui, have:%ui", - insert_count, n); - - if (n >= insert_count) { - return NGX_OK; - } - - ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0, "http3 block stream"); - - block = NULL; - - for (cln = c->pool->cleanup; cln; cln = cln->next) { - if (cln->handler == ngx_http_v3_unblock) { - block = cln->data; - break; - } - } - - if (block == NULL) { - cln = ngx_pool_cleanup_add(c->pool, sizeof(ngx_http_v3_block_t)); - if (cln == NULL) { - return NGX_ERROR; - } - - cln->handler = ngx_http_v3_unblock; - - block = cln->data; - block->queue.prev = NULL; - block->connection = c; - block->nblocked = &h3c->nblocked; - } - - if (block->queue.prev == NULL) { - h3scf = ngx_http_v3_get_module_srv_conf(c, ngx_http_v3_module); - - if (h3c->nblocked == h3scf->max_blocked_streams) { - ngx_log_error(NGX_LOG_INFO, c->log, 0, - "client exceeded http3_max_blocked_streams limit"); - - ngx_http_v3_finalize_connection(c, - NGX_HTTP_V3_ERR_DECOMPRESSION_FAILED, - "too many blocked streams"); - return NGX_HTTP_V3_ERR_DECOMPRESSION_FAILED; - } - - h3c->nblocked++; - ngx_queue_insert_tail(&h3c->blocked, &block->queue); - } - - ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0, - "http3 blocked:%ui", h3c->nblocked); - - return NGX_BUSY; -} - - -void -ngx_http_v3_ack_insert_count(ngx_connection_t *c, uint64_t insert_count) -{ - ngx_http_v3_session_t *h3c; - ngx_http_v3_dynamic_table_t *dt; - - h3c = ngx_http_v3_get_session(c); - dt = &h3c->table; - - if (dt->ack_insert_count < insert_count) { - dt->ack_insert_count = insert_count; - } -} - - -static void -ngx_http_v3_unblock(void *data) -{ - ngx_http_v3_block_t *block = data; - - if (block->queue.prev) { - ngx_queue_remove(&block->queue); - block->queue.prev = NULL; - (*block->nblocked)--; - } -} - - -static ngx_int_t -ngx_http_v3_new_entry(ngx_connection_t *c) -{ - ngx_queue_t *q; - ngx_connection_t *bc; - ngx_http_v3_block_t *block; - ngx_http_v3_session_t *h3c; - - h3c = ngx_http_v3_get_session(c); - - ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0, - "http3 new dynamic entry, blocked:%ui", h3c->nblocked); - - while (!ngx_queue_empty(&h3c->blocked)) { - q = ngx_queue_head(&h3c->blocked); - block = (ngx_http_v3_block_t *) q; - bc = block->connection; - - ngx_log_debug0(NGX_LOG_DEBUG_HTTP, bc->log, 0, "http3 unblock stream"); - - ngx_http_v3_unblock(block); - ngx_post_event(bc->read, &ngx_posted_events); - } - - return NGX_OK; -} - - -ngx_int_t -ngx_http_v3_set_param(ngx_connection_t *c, uint64_t id, uint64_t value) -{ - switch (id) { - - case NGX_HTTP_V3_PARAM_MAX_TABLE_CAPACITY: - ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0, - "http3 param QPACK_MAX_TABLE_CAPACITY:%uL", value); - break; - - case NGX_HTTP_V3_PARAM_MAX_FIELD_SECTION_SIZE: - ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0, - "http3 param SETTINGS_MAX_FIELD_SECTION_SIZE:%uL", - value); - break; - - case NGX_HTTP_V3_PARAM_BLOCKED_STREAMS: - ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0, - "http3 param QPACK_BLOCKED_STREAMS:%uL", value); - break; - - default: - - ngx_log_debug2(NGX_LOG_DEBUG_HTTP, c->log, 0, - "http3 param #%uL:%uL", id, value); - } - - return NGX_OK; -} diff --git a/src/deps/src/nginx-1.30.3/src/http/v3/ngx_http_v3_table.h b/src/deps/src/nginx-1.30.3/src/http/v3/ngx_http_v3_table.h deleted file mode 100644 index 1c2fb17b9c..0000000000 --- a/src/deps/src/nginx-1.30.3/src/http/v3/ngx_http_v3_table.h +++ /dev/null @@ -1,58 +0,0 @@ - -/* - * Copyright (C) Roman Arutyunyan - * Copyright (C) Nginx, Inc. - */ - - -#ifndef _NGX_HTTP_V3_TABLE_H_INCLUDED_ -#define _NGX_HTTP_V3_TABLE_H_INCLUDED_ - - -#include -#include -#include - - -typedef struct { - ngx_str_t name; - ngx_str_t value; -} ngx_http_v3_field_t; - - -typedef struct { - ngx_http_v3_field_t **elts; - ngx_uint_t nelts; - ngx_uint_t base; - size_t size; - size_t capacity; - uint64_t insert_count; - uint64_t ack_insert_count; - ngx_event_t send_insert_count; -} ngx_http_v3_dynamic_table_t; - - -void ngx_http_v3_inc_insert_count_handler(ngx_event_t *ev); -void ngx_http_v3_cleanup_table(ngx_http_v3_session_t *h3c); -ngx_int_t ngx_http_v3_ref_insert(ngx_connection_t *c, ngx_uint_t dynamic, - ngx_uint_t index, ngx_str_t *value); -ngx_int_t ngx_http_v3_insert(ngx_connection_t *c, ngx_str_t *name, - ngx_str_t *value); -ngx_int_t ngx_http_v3_set_capacity(ngx_connection_t *c, ngx_uint_t capacity); -ngx_int_t ngx_http_v3_duplicate(ngx_connection_t *c, ngx_uint_t index); -ngx_int_t ngx_http_v3_ack_section(ngx_connection_t *c, ngx_uint_t stream_id); -ngx_int_t ngx_http_v3_inc_insert_count(ngx_connection_t *c, ngx_uint_t inc); -ngx_int_t ngx_http_v3_lookup_static(ngx_connection_t *c, ngx_uint_t index, - ngx_str_t *name, ngx_str_t *value); -ngx_int_t ngx_http_v3_lookup(ngx_connection_t *c, ngx_uint_t index, - ngx_str_t *name, ngx_str_t *value); -ngx_int_t ngx_http_v3_decode_insert_count(ngx_connection_t *c, - ngx_uint_t *insert_count); -ngx_int_t ngx_http_v3_check_insert_count(ngx_connection_t *c, - ngx_uint_t insert_count); -void ngx_http_v3_ack_insert_count(ngx_connection_t *c, uint64_t insert_count); -ngx_int_t ngx_http_v3_set_param(ngx_connection_t *c, uint64_t id, - uint64_t value); - - -#endif /* _NGX_HTTP_V3_TABLE_H_INCLUDED_ */ diff --git a/src/deps/src/nginx-1.30.3/src/http/v3/ngx_http_v3_uni.c b/src/deps/src/nginx-1.30.3/src/http/v3/ngx_http_v3_uni.c deleted file mode 100644 index 302064b8b2..0000000000 --- a/src/deps/src/nginx-1.30.3/src/http/v3/ngx_http_v3_uni.c +++ /dev/null @@ -1,622 +0,0 @@ - -/* - * Copyright (C) Roman Arutyunyan - * Copyright (C) Nginx, Inc. - */ - - -#include -#include -#include - - -typedef struct { - ngx_http_v3_parse_uni_t parse; - ngx_int_t index; -} ngx_http_v3_uni_stream_t; - - -static void ngx_http_v3_close_uni_stream(ngx_connection_t *c); -static void ngx_http_v3_uni_read_handler(ngx_event_t *rev); -static void ngx_http_v3_uni_dummy_read_handler(ngx_event_t *wev); -static void ngx_http_v3_uni_dummy_write_handler(ngx_event_t *wev); - - -void -ngx_http_v3_init_uni_stream(ngx_connection_t *c) -{ - uint64_t n; - ngx_http_v3_session_t *h3c; - ngx_http_v3_uni_stream_t *us; - - h3c = ngx_http_v3_get_session(c); - if (h3c->hq) { - ngx_http_v3_finalize_connection(c, - NGX_HTTP_V3_ERR_STREAM_CREATION_ERROR, - "uni stream in hq mode"); - c->data = NULL; - ngx_http_v3_close_uni_stream(c); - return; - } - - ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0, "http3 init uni stream"); - - n = c->quic->id >> 2; - - if (n >= NGX_HTTP_V3_MAX_UNI_STREAMS) { - ngx_http_v3_finalize_connection(c, - NGX_HTTP_V3_ERR_STREAM_CREATION_ERROR, - "reached maximum number of uni streams"); - c->data = NULL; - ngx_http_v3_close_uni_stream(c); - return; - } - - ngx_quic_cancelable_stream(c); - - us = ngx_pcalloc(c->pool, sizeof(ngx_http_v3_uni_stream_t)); - if (us == NULL) { - ngx_http_v3_finalize_connection(c, - NGX_HTTP_V3_ERR_INTERNAL_ERROR, - "memory allocation error"); - c->data = NULL; - ngx_http_v3_close_uni_stream(c); - return; - } - - us->index = -1; - - c->data = us; - - c->read->handler = ngx_http_v3_uni_read_handler; - c->write->handler = ngx_http_v3_uni_dummy_write_handler; - - ngx_http_v3_uni_read_handler(c->read); -} - - -static void -ngx_http_v3_close_uni_stream(ngx_connection_t *c) -{ - ngx_pool_t *pool; - ngx_http_v3_session_t *h3c; - ngx_http_v3_uni_stream_t *us; - - ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0, "http3 close stream"); - - us = c->data; - - if (us && us->index >= 0) { - h3c = ngx_http_v3_get_session(c); - h3c->known_streams[us->index] = NULL; - } - - c->destroyed = 1; - - pool = c->pool; - - ngx_close_connection(c); - - ngx_destroy_pool(pool); -} - - -ngx_int_t -ngx_http_v3_register_uni_stream(ngx_connection_t *c, uint64_t type) -{ - ngx_int_t index; - ngx_http_v3_session_t *h3c; - ngx_http_v3_uni_stream_t *us; - - h3c = ngx_http_v3_get_session(c); - - switch (type) { - - case NGX_HTTP_V3_STREAM_ENCODER: - - ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0, - "http3 encoder stream"); - index = NGX_HTTP_V3_STREAM_CLIENT_ENCODER; - break; - - case NGX_HTTP_V3_STREAM_DECODER: - - ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0, - "http3 decoder stream"); - index = NGX_HTTP_V3_STREAM_CLIENT_DECODER; - break; - - case NGX_HTTP_V3_STREAM_CONTROL: - - ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0, - "http3 control stream"); - index = NGX_HTTP_V3_STREAM_CLIENT_CONTROL; - - break; - - default: - - ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0, - "http3 stream 0x%02xL", type); - - if (h3c->known_streams[NGX_HTTP_V3_STREAM_CLIENT_ENCODER] == NULL - || h3c->known_streams[NGX_HTTP_V3_STREAM_CLIENT_DECODER] == NULL - || h3c->known_streams[NGX_HTTP_V3_STREAM_CLIENT_CONTROL] == NULL) - { - ngx_log_error(NGX_LOG_INFO, c->log, 0, "missing mandatory stream"); - return NGX_HTTP_V3_ERR_STREAM_CREATION_ERROR; - } - - index = -1; - } - - if (index >= 0) { - if (h3c->known_streams[index]) { - ngx_log_error(NGX_LOG_INFO, c->log, 0, "stream exists"); - return NGX_HTTP_V3_ERR_STREAM_CREATION_ERROR; - } - - h3c->known_streams[index] = c; - - us = c->data; - us->index = index; - } - - return NGX_OK; -} - - -static void -ngx_http_v3_uni_read_handler(ngx_event_t *rev) -{ - u_char buf[128]; - ssize_t n; - ngx_buf_t b; - ngx_int_t rc; - ngx_connection_t *c; - ngx_http_v3_session_t *h3c; - ngx_http_v3_uni_stream_t *us; - - c = rev->data; - us = c->data; - - ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0, "http3 read handler"); - - if (c->close) { - ngx_http_v3_close_uni_stream(c); - return; - } - - ngx_memzero(&b, sizeof(ngx_buf_t)); - - while (rev->ready) { - - n = c->recv(c, buf, sizeof(buf)); - - if (n == NGX_ERROR) { - rc = NGX_HTTP_V3_ERR_INTERNAL_ERROR; - goto failed; - } - - if (n == 0) { - if (us->index >= 0) { - rc = NGX_HTTP_V3_ERR_CLOSED_CRITICAL_STREAM; - goto failed; - } - - ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0, "http3 read eof"); - ngx_http_v3_close_uni_stream(c); - return; - } - - if (n == NGX_AGAIN) { - break; - } - - b.pos = buf; - b.last = buf + n; - - h3c = ngx_http_v3_get_session(c); - h3c->total_bytes += n; - - if (ngx_http_v3_check_flood(c) != NGX_OK) { - ngx_http_v3_close_uni_stream(c); - return; - } - - rc = ngx_http_v3_parse_uni(c, &us->parse, &b); - - if (rc == NGX_DONE) { - ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0, - "http3 read done"); - ngx_http_v3_close_uni_stream(c); - return; - } - - if (rc > 0) { - goto failed; - } - - if (rc != NGX_AGAIN) { - rc = NGX_HTTP_V3_ERR_GENERAL_PROTOCOL_ERROR; - goto failed; - } - } - - if (ngx_handle_read_event(rev, 0) != NGX_OK) { - rc = NGX_HTTP_V3_ERR_INTERNAL_ERROR; - goto failed; - } - - return; - -failed: - - ngx_http_v3_finalize_connection(c, rc, "stream error"); - ngx_http_v3_close_uni_stream(c); -} - - -static void -ngx_http_v3_uni_dummy_read_handler(ngx_event_t *rev) -{ - u_char ch; - ngx_connection_t *c; - - c = rev->data; - - ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0, "http3 dummy read handler"); - - if (c->close) { - ngx_http_v3_close_uni_stream(c); - return; - } - - if (rev->ready) { - if (c->recv(c, &ch, 1) != 0) { - ngx_http_v3_finalize_connection(c, NGX_HTTP_V3_ERR_NO_ERROR, NULL); - ngx_http_v3_close_uni_stream(c); - return; - } - } - - if (ngx_handle_read_event(rev, 0) != NGX_OK) { - ngx_http_v3_finalize_connection(c, NGX_HTTP_V3_ERR_INTERNAL_ERROR, - NULL); - ngx_http_v3_close_uni_stream(c); - } -} - - -static void -ngx_http_v3_uni_dummy_write_handler(ngx_event_t *wev) -{ - ngx_connection_t *c; - - c = wev->data; - - ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0, "http3 dummy write handler"); - - if (ngx_handle_write_event(wev, 0) != NGX_OK) { - ngx_http_v3_finalize_connection(c, NGX_HTTP_V3_ERR_INTERNAL_ERROR, - NULL); - ngx_http_v3_close_uni_stream(c); - } -} - - -ngx_connection_t * -ngx_http_v3_get_uni_stream(ngx_connection_t *c, ngx_uint_t type) -{ - u_char buf[NGX_HTTP_V3_VARLEN_INT_LEN]; - size_t n; - ngx_int_t index; - ngx_connection_t *sc; - ngx_http_v3_session_t *h3c; - ngx_http_v3_uni_stream_t *us; - - switch (type) { - case NGX_HTTP_V3_STREAM_ENCODER: - index = NGX_HTTP_V3_STREAM_SERVER_ENCODER; - break; - case NGX_HTTP_V3_STREAM_DECODER: - index = NGX_HTTP_V3_STREAM_SERVER_DECODER; - break; - case NGX_HTTP_V3_STREAM_CONTROL: - index = NGX_HTTP_V3_STREAM_SERVER_CONTROL; - break; - default: - index = -1; - } - - h3c = ngx_http_v3_get_session(c); - - if (index >= 0) { - if (h3c->known_streams[index]) { - return h3c->known_streams[index]; - } - } - - sc = ngx_quic_open_stream(c, 0); - if (sc == NULL) { - goto failed; - } - - ngx_quic_cancelable_stream(sc); - - ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0, - "http3 create uni stream, type:%ui", type); - - us = ngx_pcalloc(sc->pool, sizeof(ngx_http_v3_uni_stream_t)); - if (us == NULL) { - goto failed; - } - - us->index = index; - - sc->data = us; - - sc->read->handler = ngx_http_v3_uni_dummy_read_handler; - sc->write->handler = ngx_http_v3_uni_dummy_write_handler; - - if (index >= 0) { - h3c->known_streams[index] = sc; - } - - n = (u_char *) ngx_http_v3_encode_varlen_int(buf, type) - buf; - - h3c = ngx_http_v3_get_session(c); - h3c->total_bytes += n; - - if (sc->send(sc, buf, n) != (ssize_t) n) { - goto failed; - } - - ngx_post_event(sc->read, &ngx_posted_events); - - return sc; - -failed: - - ngx_log_error(NGX_LOG_ERR, c->log, 0, "failed to create server stream"); - - ngx_http_v3_finalize_connection(c, NGX_HTTP_V3_ERR_STREAM_CREATION_ERROR, - "failed to create server stream"); - if (sc) { - ngx_http_v3_close_uni_stream(sc); - } - - return NULL; -} - - -ngx_int_t -ngx_http_v3_send_settings(ngx_connection_t *c) -{ - u_char *p, buf[NGX_HTTP_V3_VARLEN_INT_LEN * 6]; - size_t n; - ngx_connection_t *cc; - ngx_http_v3_session_t *h3c; - ngx_http_v3_srv_conf_t *h3scf; - - ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0, "http3 send settings"); - - cc = ngx_http_v3_get_uni_stream(c, NGX_HTTP_V3_STREAM_CONTROL); - if (cc == NULL) { - return NGX_ERROR; - } - - h3scf = ngx_http_v3_get_module_srv_conf(c, ngx_http_v3_module); - - n = ngx_http_v3_encode_varlen_int(NULL, - NGX_HTTP_V3_PARAM_MAX_TABLE_CAPACITY); - n += ngx_http_v3_encode_varlen_int(NULL, h3scf->max_table_capacity); - n += ngx_http_v3_encode_varlen_int(NULL, NGX_HTTP_V3_PARAM_BLOCKED_STREAMS); - n += ngx_http_v3_encode_varlen_int(NULL, h3scf->max_blocked_streams); - - p = (u_char *) ngx_http_v3_encode_varlen_int(buf, - NGX_HTTP_V3_FRAME_SETTINGS); - p = (u_char *) ngx_http_v3_encode_varlen_int(p, n); - p = (u_char *) ngx_http_v3_encode_varlen_int(p, - NGX_HTTP_V3_PARAM_MAX_TABLE_CAPACITY); - p = (u_char *) ngx_http_v3_encode_varlen_int(p, h3scf->max_table_capacity); - p = (u_char *) ngx_http_v3_encode_varlen_int(p, - NGX_HTTP_V3_PARAM_BLOCKED_STREAMS); - p = (u_char *) ngx_http_v3_encode_varlen_int(p, h3scf->max_blocked_streams); - n = p - buf; - - h3c = ngx_http_v3_get_session(c); - h3c->total_bytes += n; - - if (cc->send(cc, buf, n) != (ssize_t) n) { - goto failed; - } - - return NGX_OK; - -failed: - - ngx_log_error(NGX_LOG_ERR, c->log, 0, "failed to send settings"); - - ngx_http_v3_finalize_connection(c, NGX_HTTP_V3_ERR_EXCESSIVE_LOAD, - "failed to send settings"); - ngx_http_v3_close_uni_stream(cc); - - return NGX_ERROR; -} - - -ngx_int_t -ngx_http_v3_send_goaway(ngx_connection_t *c, uint64_t id) -{ - u_char *p, buf[NGX_HTTP_V3_VARLEN_INT_LEN * 3]; - size_t n; - ngx_connection_t *cc; - ngx_http_v3_session_t *h3c; - - ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0, "http3 send goaway %uL", id); - - cc = ngx_http_v3_get_uni_stream(c, NGX_HTTP_V3_STREAM_CONTROL); - if (cc == NULL) { - return NGX_ERROR; - } - - n = ngx_http_v3_encode_varlen_int(NULL, id); - p = (u_char *) ngx_http_v3_encode_varlen_int(buf, NGX_HTTP_V3_FRAME_GOAWAY); - p = (u_char *) ngx_http_v3_encode_varlen_int(p, n); - p = (u_char *) ngx_http_v3_encode_varlen_int(p, id); - n = p - buf; - - h3c = ngx_http_v3_get_session(c); - h3c->total_bytes += n; - - if (cc->send(cc, buf, n) != (ssize_t) n) { - goto failed; - } - - return NGX_OK; - -failed: - - ngx_log_error(NGX_LOG_ERR, c->log, 0, "failed to send goaway"); - - ngx_http_v3_finalize_connection(c, NGX_HTTP_V3_ERR_EXCESSIVE_LOAD, - "failed to send goaway"); - ngx_http_v3_close_uni_stream(cc); - - return NGX_ERROR; -} - - -ngx_int_t -ngx_http_v3_send_ack_section(ngx_connection_t *c, ngx_uint_t stream_id) -{ - u_char buf[NGX_HTTP_V3_PREFIX_INT_LEN]; - size_t n; - ngx_connection_t *dc; - ngx_http_v3_session_t *h3c; - - ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0, - "http3 send section acknowledgement %ui", stream_id); - - dc = ngx_http_v3_get_uni_stream(c, NGX_HTTP_V3_STREAM_DECODER); - if (dc == NULL) { - return NGX_ERROR; - } - - buf[0] = 0x80; - n = (u_char *) ngx_http_v3_encode_prefix_int(buf, stream_id, 7) - buf; - - h3c = ngx_http_v3_get_session(c); - h3c->total_bytes += n; - - if (dc->send(dc, buf, n) != (ssize_t) n) { - goto failed; - } - - return NGX_OK; - -failed: - - ngx_log_error(NGX_LOG_ERR, c->log, 0, - "failed to send section acknowledgement"); - - ngx_http_v3_finalize_connection(c, NGX_HTTP_V3_ERR_EXCESSIVE_LOAD, - "failed to send section acknowledgement"); - ngx_http_v3_close_uni_stream(dc); - - return NGX_ERROR; -} - - -ngx_int_t -ngx_http_v3_send_cancel_stream(ngx_connection_t *c, ngx_uint_t stream_id) -{ - u_char buf[NGX_HTTP_V3_PREFIX_INT_LEN]; - size_t n; - ngx_connection_t *dc; - ngx_http_v3_session_t *h3c; - - ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0, - "http3 send stream cancellation %ui", stream_id); - - dc = ngx_http_v3_get_uni_stream(c, NGX_HTTP_V3_STREAM_DECODER); - if (dc == NULL) { - return NGX_ERROR; - } - - buf[0] = 0x40; - n = (u_char *) ngx_http_v3_encode_prefix_int(buf, stream_id, 6) - buf; - - h3c = ngx_http_v3_get_session(c); - h3c->total_bytes += n; - - if (dc->send(dc, buf, n) != (ssize_t) n) { - goto failed; - } - - return NGX_OK; - -failed: - - ngx_log_error(NGX_LOG_ERR, c->log, 0, "failed to send stream cancellation"); - - ngx_http_v3_finalize_connection(c, NGX_HTTP_V3_ERR_EXCESSIVE_LOAD, - "failed to send stream cancellation"); - ngx_http_v3_close_uni_stream(dc); - - return NGX_ERROR; -} - - -ngx_int_t -ngx_http_v3_send_inc_insert_count(ngx_connection_t *c, ngx_uint_t inc) -{ - u_char buf[NGX_HTTP_V3_PREFIX_INT_LEN]; - size_t n; - ngx_connection_t *dc; - ngx_http_v3_session_t *h3c; - - ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0, - "http3 send insert count increment %ui", inc); - - dc = ngx_http_v3_get_uni_stream(c, NGX_HTTP_V3_STREAM_DECODER); - if (dc == NULL) { - return NGX_ERROR; - } - - buf[0] = 0; - n = (u_char *) ngx_http_v3_encode_prefix_int(buf, inc, 6) - buf; - - h3c = ngx_http_v3_get_session(c); - h3c->total_bytes += n; - - if (dc->send(dc, buf, n) != (ssize_t) n) { - goto failed; - } - - return NGX_OK; - -failed: - - ngx_log_error(NGX_LOG_ERR, c->log, 0, - "failed to send insert count increment"); - - ngx_http_v3_finalize_connection(c, NGX_HTTP_V3_ERR_EXCESSIVE_LOAD, - "failed to send insert count increment"); - ngx_http_v3_close_uni_stream(dc); - - return NGX_ERROR; -} - - -ngx_int_t -ngx_http_v3_cancel_stream(ngx_connection_t *c, ngx_uint_t stream_id) -{ - ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0, - "http3 cancel stream %ui", stream_id); - - /* we do not use dynamic tables */ - - return NGX_OK; -} diff --git a/src/deps/src/nginx-1.30.3/src/http/v3/ngx_http_v3_uni.h b/src/deps/src/nginx-1.30.3/src/http/v3/ngx_http_v3_uni.h deleted file mode 100644 index 2805894697..0000000000 --- a/src/deps/src/nginx-1.30.3/src/http/v3/ngx_http_v3_uni.h +++ /dev/null @@ -1,34 +0,0 @@ - -/* - * Copyright (C) Roman Arutyunyan - * Copyright (C) Nginx, Inc. - */ - - -#ifndef _NGX_HTTP_V3_UNI_H_INCLUDED_ -#define _NGX_HTTP_V3_UNI_H_INCLUDED_ - - -#include -#include -#include - - -void ngx_http_v3_init_uni_stream(ngx_connection_t *c); -ngx_int_t ngx_http_v3_register_uni_stream(ngx_connection_t *c, uint64_t type); - -ngx_int_t ngx_http_v3_cancel_stream(ngx_connection_t *c, ngx_uint_t stream_id); - -ngx_connection_t *ngx_http_v3_get_uni_stream(ngx_connection_t *c, - ngx_uint_t type); -ngx_int_t ngx_http_v3_send_settings(ngx_connection_t *c); -ngx_int_t ngx_http_v3_send_goaway(ngx_connection_t *c, uint64_t id); -ngx_int_t ngx_http_v3_send_ack_section(ngx_connection_t *c, - ngx_uint_t stream_id); -ngx_int_t ngx_http_v3_send_cancel_stream(ngx_connection_t *c, - ngx_uint_t stream_id); -ngx_int_t ngx_http_v3_send_inc_insert_count(ngx_connection_t *c, - ngx_uint_t inc); - - -#endif /* _NGX_HTTP_V3_UNI_H_INCLUDED_ */ diff --git a/src/deps/src/nginx-1.30.3/src/mail/ngx_mail.c b/src/deps/src/nginx-1.30.3/src/mail/ngx_mail.c deleted file mode 100644 index cc34cb3659..0000000000 --- a/src/deps/src/nginx-1.30.3/src/mail/ngx_mail.c +++ /dev/null @@ -1,485 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#include -#include -#include -#include - - -static char *ngx_mail_block(ngx_conf_t *cf, ngx_command_t *cmd, void *conf); -static ngx_int_t ngx_mail_add_ports(ngx_conf_t *cf, ngx_array_t *ports, - ngx_mail_listen_t *listen); -static char *ngx_mail_optimize_servers(ngx_conf_t *cf, ngx_array_t *ports); -static ngx_int_t ngx_mail_add_addrs(ngx_conf_t *cf, ngx_mail_port_t *mport, - ngx_mail_conf_addr_t *addr); -#if (NGX_HAVE_INET6) -static ngx_int_t ngx_mail_add_addrs6(ngx_conf_t *cf, ngx_mail_port_t *mport, - ngx_mail_conf_addr_t *addr); -#endif -static ngx_int_t ngx_mail_cmp_conf_addrs(const void *one, const void *two); - - -ngx_uint_t ngx_mail_max_module; - - -static ngx_command_t ngx_mail_commands[] = { - - { ngx_string("mail"), - NGX_MAIN_CONF|NGX_CONF_BLOCK|NGX_CONF_NOARGS, - ngx_mail_block, - 0, - 0, - NULL }, - - ngx_null_command -}; - - -static ngx_core_module_t ngx_mail_module_ctx = { - ngx_string("mail"), - NULL, - NULL -}; - - -ngx_module_t ngx_mail_module = { - NGX_MODULE_V1, - &ngx_mail_module_ctx, /* module context */ - ngx_mail_commands, /* module directives */ - NGX_CORE_MODULE, /* module type */ - NULL, /* init master */ - NULL, /* init module */ - NULL, /* init process */ - NULL, /* init thread */ - NULL, /* exit thread */ - NULL, /* exit process */ - NULL, /* exit master */ - NGX_MODULE_V1_PADDING -}; - - -static char * -ngx_mail_block(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) -{ - char *rv; - ngx_uint_t i, m, mi, s; - ngx_conf_t pcf; - ngx_array_t ports; - ngx_mail_listen_t *listen; - ngx_mail_module_t *module; - ngx_mail_conf_ctx_t *ctx; - ngx_mail_core_srv_conf_t **cscfp; - ngx_mail_core_main_conf_t *cmcf; - - if (*(ngx_mail_conf_ctx_t **) conf) { - return "is duplicate"; - } - - /* the main mail context */ - - ctx = ngx_pcalloc(cf->pool, sizeof(ngx_mail_conf_ctx_t)); - if (ctx == NULL) { - return NGX_CONF_ERROR; - } - - *(ngx_mail_conf_ctx_t **) conf = ctx; - - /* count the number of the mail modules and set up their indices */ - - ngx_mail_max_module = ngx_count_modules(cf->cycle, NGX_MAIL_MODULE); - - - /* the mail main_conf context, it is the same in the all mail contexts */ - - ctx->main_conf = ngx_pcalloc(cf->pool, - sizeof(void *) * ngx_mail_max_module); - if (ctx->main_conf == NULL) { - return NGX_CONF_ERROR; - } - - - /* - * the mail null srv_conf context, it is used to merge - * the server{}s' srv_conf's - */ - - ctx->srv_conf = ngx_pcalloc(cf->pool, sizeof(void *) * ngx_mail_max_module); - if (ctx->srv_conf == NULL) { - return NGX_CONF_ERROR; - } - - - /* - * create the main_conf's and the null srv_conf's of the all mail modules - */ - - for (m = 0; cf->cycle->modules[m]; m++) { - if (cf->cycle->modules[m]->type != NGX_MAIL_MODULE) { - continue; - } - - module = cf->cycle->modules[m]->ctx; - mi = cf->cycle->modules[m]->ctx_index; - - if (module->create_main_conf) { - ctx->main_conf[mi] = module->create_main_conf(cf); - if (ctx->main_conf[mi] == NULL) { - return NGX_CONF_ERROR; - } - } - - if (module->create_srv_conf) { - ctx->srv_conf[mi] = module->create_srv_conf(cf); - if (ctx->srv_conf[mi] == NULL) { - return NGX_CONF_ERROR; - } - } - } - - - /* parse inside the mail{} block */ - - pcf = *cf; - cf->ctx = ctx; - - cf->module_type = NGX_MAIL_MODULE; - cf->cmd_type = NGX_MAIL_MAIN_CONF; - rv = ngx_conf_parse(cf, NULL); - - if (rv != NGX_CONF_OK) { - *cf = pcf; - return rv; - } - - - /* init mail{} main_conf's, merge the server{}s' srv_conf's */ - - cmcf = ctx->main_conf[ngx_mail_core_module.ctx_index]; - cscfp = cmcf->servers.elts; - - for (m = 0; cf->cycle->modules[m]; m++) { - if (cf->cycle->modules[m]->type != NGX_MAIL_MODULE) { - continue; - } - - module = cf->cycle->modules[m]->ctx; - mi = cf->cycle->modules[m]->ctx_index; - - /* init mail{} main_conf's */ - - cf->ctx = ctx; - - if (module->init_main_conf) { - rv = module->init_main_conf(cf, ctx->main_conf[mi]); - if (rv != NGX_CONF_OK) { - *cf = pcf; - return rv; - } - } - - for (s = 0; s < cmcf->servers.nelts; s++) { - - /* merge the server{}s' srv_conf's */ - - cf->ctx = cscfp[s]->ctx; - - if (module->merge_srv_conf) { - rv = module->merge_srv_conf(cf, - ctx->srv_conf[mi], - cscfp[s]->ctx->srv_conf[mi]); - if (rv != NGX_CONF_OK) { - *cf = pcf; - return rv; - } - } - } - } - - *cf = pcf; - - - if (ngx_array_init(&ports, cf->temp_pool, 4, sizeof(ngx_mail_conf_port_t)) - != NGX_OK) - { - return NGX_CONF_ERROR; - } - - listen = cmcf->listen.elts; - - for (i = 0; i < cmcf->listen.nelts; i++) { - if (ngx_mail_add_ports(cf, &ports, &listen[i]) != NGX_OK) { - return NGX_CONF_ERROR; - } - } - - return ngx_mail_optimize_servers(cf, &ports); -} - - -static ngx_int_t -ngx_mail_add_ports(ngx_conf_t *cf, ngx_array_t *ports, - ngx_mail_listen_t *listen) -{ - in_port_t p; - ngx_uint_t i; - struct sockaddr *sa; - ngx_mail_conf_port_t *port; - ngx_mail_conf_addr_t *addr; - - sa = listen->sockaddr; - p = ngx_inet_get_port(sa); - - port = ports->elts; - for (i = 0; i < ports->nelts; i++) { - if (p == port[i].port && sa->sa_family == port[i].family) { - - /* a port is already in the port list */ - - port = &port[i]; - goto found; - } - } - - /* add a port to the port list */ - - port = ngx_array_push(ports); - if (port == NULL) { - return NGX_ERROR; - } - - port->family = sa->sa_family; - port->port = p; - - if (ngx_array_init(&port->addrs, cf->temp_pool, 2, - sizeof(ngx_mail_conf_addr_t)) - != NGX_OK) - { - return NGX_ERROR; - } - -found: - - addr = ngx_array_push(&port->addrs); - if (addr == NULL) { - return NGX_ERROR; - } - - addr->opt = *listen; - - return NGX_OK; -} - - -static char * -ngx_mail_optimize_servers(ngx_conf_t *cf, ngx_array_t *ports) -{ - ngx_uint_t i, p, last, bind_wildcard; - ngx_listening_t *ls; - ngx_mail_port_t *mport; - ngx_mail_conf_port_t *port; - ngx_mail_conf_addr_t *addr; - ngx_mail_core_srv_conf_t *cscf; - - port = ports->elts; - for (p = 0; p < ports->nelts; p++) { - - ngx_sort(port[p].addrs.elts, (size_t) port[p].addrs.nelts, - sizeof(ngx_mail_conf_addr_t), ngx_mail_cmp_conf_addrs); - - addr = port[p].addrs.elts; - last = port[p].addrs.nelts; - - /* - * if there is the binding to the "*:port" then we need to bind() - * to the "*:port" only and ignore the other bindings - */ - - if (addr[last - 1].opt.wildcard) { - addr[last - 1].opt.bind = 1; - bind_wildcard = 1; - - } else { - bind_wildcard = 0; - } - - i = 0; - - while (i < last) { - - if (bind_wildcard && !addr[i].opt.bind) { - i++; - continue; - } - - ls = ngx_create_listening(cf, addr[i].opt.sockaddr, - addr[i].opt.socklen); - if (ls == NULL) { - return NGX_CONF_ERROR; - } - - ls->addr_ntop = 1; - ls->handler = ngx_mail_init_connection; - ls->pool_size = 256; - - cscf = addr->opt.ctx->srv_conf[ngx_mail_core_module.ctx_index]; - - ls->logp = cscf->error_log; - ls->log.data = &ls->addr_text; - ls->log.handler = ngx_accept_log_error; - - ls->protocol = addr[i].opt.protocol; - ls->backlog = addr[i].opt.backlog; - ls->rcvbuf = addr[i].opt.rcvbuf; - ls->sndbuf = addr[i].opt.sndbuf; - - ls->keepalive = addr[i].opt.so_keepalive; -#if (NGX_HAVE_KEEPALIVE_TUNABLE) - ls->keepidle = addr[i].opt.tcp_keepidle; - ls->keepintvl = addr[i].opt.tcp_keepintvl; - ls->keepcnt = addr[i].opt.tcp_keepcnt; -#endif - -#if (NGX_HAVE_INET6) - ls->ipv6only = addr[i].opt.ipv6only; -#endif - - mport = ngx_palloc(cf->pool, sizeof(ngx_mail_port_t)); - if (mport == NULL) { - return NGX_CONF_ERROR; - } - - ls->servers = mport; - - mport->naddrs = i + 1; - - switch (ls->sockaddr->sa_family) { -#if (NGX_HAVE_INET6) - case AF_INET6: - if (ngx_mail_add_addrs6(cf, mport, addr) != NGX_OK) { - return NGX_CONF_ERROR; - } - break; -#endif - default: /* AF_INET */ - if (ngx_mail_add_addrs(cf, mport, addr) != NGX_OK) { - return NGX_CONF_ERROR; - } - break; - } - - addr++; - last--; - } - } - - return NGX_CONF_OK; -} - - -static ngx_int_t -ngx_mail_add_addrs(ngx_conf_t *cf, ngx_mail_port_t *mport, - ngx_mail_conf_addr_t *addr) -{ - ngx_uint_t i; - ngx_mail_in_addr_t *addrs; - struct sockaddr_in *sin; - - mport->addrs = ngx_pcalloc(cf->pool, - mport->naddrs * sizeof(ngx_mail_in_addr_t)); - if (mport->addrs == NULL) { - return NGX_ERROR; - } - - addrs = mport->addrs; - - for (i = 0; i < mport->naddrs; i++) { - - sin = (struct sockaddr_in *) addr[i].opt.sockaddr; - addrs[i].addr = sin->sin_addr.s_addr; - - addrs[i].conf.ctx = addr[i].opt.ctx; -#if (NGX_MAIL_SSL) - addrs[i].conf.ssl = addr[i].opt.ssl; -#endif - addrs[i].conf.proxy_protocol = addr[i].opt.proxy_protocol; - addrs[i].conf.addr_text = addr[i].opt.addr_text; - } - - return NGX_OK; -} - - -#if (NGX_HAVE_INET6) - -static ngx_int_t -ngx_mail_add_addrs6(ngx_conf_t *cf, ngx_mail_port_t *mport, - ngx_mail_conf_addr_t *addr) -{ - ngx_uint_t i; - ngx_mail_in6_addr_t *addrs6; - struct sockaddr_in6 *sin6; - - mport->addrs = ngx_pcalloc(cf->pool, - mport->naddrs * sizeof(ngx_mail_in6_addr_t)); - if (mport->addrs == NULL) { - return NGX_ERROR; - } - - addrs6 = mport->addrs; - - for (i = 0; i < mport->naddrs; i++) { - - sin6 = (struct sockaddr_in6 *) addr[i].opt.sockaddr; - addrs6[i].addr6 = sin6->sin6_addr; - - addrs6[i].conf.ctx = addr[i].opt.ctx; -#if (NGX_MAIL_SSL) - addrs6[i].conf.ssl = addr[i].opt.ssl; -#endif - addrs6[i].conf.proxy_protocol = addr[i].opt.proxy_protocol; - addrs6[i].conf.addr_text = addr[i].opt.addr_text; - } - - return NGX_OK; -} - -#endif - - -static ngx_int_t -ngx_mail_cmp_conf_addrs(const void *one, const void *two) -{ - ngx_mail_conf_addr_t *first, *second; - - first = (ngx_mail_conf_addr_t *) one; - second = (ngx_mail_conf_addr_t *) two; - - if (first->opt.wildcard) { - /* a wildcard must be the last resort, shift it to the end */ - return 1; - } - - if (second->opt.wildcard) { - /* a wildcard must be the last resort, shift it to the end */ - return -1; - } - - if (first->opt.bind && !second->opt.bind) { - /* shift explicit bind()ed addresses to the start */ - return -1; - } - - if (!first->opt.bind && second->opt.bind) { - /* shift explicit bind()ed addresses to the start */ - return 1; - } - - /* do not sort by default */ - - return 0; -} diff --git a/src/deps/src/nginx-1.30.3/src/mail/ngx_mail.h b/src/deps/src/nginx-1.30.3/src/mail/ngx_mail.h deleted file mode 100644 index 221faf67d5..0000000000 --- a/src/deps/src/nginx-1.30.3/src/mail/ngx_mail.h +++ /dev/null @@ -1,425 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#ifndef _NGX_MAIL_H_INCLUDED_ -#define _NGX_MAIL_H_INCLUDED_ - - -#include -#include -#include -#include - -#if (NGX_MAIL_SSL) -#include -#endif - - - -typedef struct { - void **main_conf; - void **srv_conf; -} ngx_mail_conf_ctx_t; - - -typedef struct { - struct sockaddr *sockaddr; - socklen_t socklen; - ngx_str_t addr_text; - - /* server ctx */ - ngx_mail_conf_ctx_t *ctx; - - unsigned bind:1; - unsigned wildcard:1; - unsigned ssl:1; -#if (NGX_HAVE_INET6) - unsigned ipv6only:1; -#endif - unsigned so_keepalive:2; - unsigned proxy_protocol:1; -#if (NGX_HAVE_KEEPALIVE_TUNABLE) - int tcp_keepidle; - int tcp_keepintvl; - int tcp_keepcnt; -#endif - int protocol; - int backlog; - int rcvbuf; - int sndbuf; -} ngx_mail_listen_t; - - -typedef struct { - ngx_mail_conf_ctx_t *ctx; - ngx_str_t addr_text; - unsigned ssl:1; - unsigned proxy_protocol:1; -} ngx_mail_addr_conf_t; - -typedef struct { - in_addr_t addr; - ngx_mail_addr_conf_t conf; -} ngx_mail_in_addr_t; - - -#if (NGX_HAVE_INET6) - -typedef struct { - struct in6_addr addr6; - ngx_mail_addr_conf_t conf; -} ngx_mail_in6_addr_t; - -#endif - - -typedef struct { - /* ngx_mail_in_addr_t or ngx_mail_in6_addr_t */ - void *addrs; - ngx_uint_t naddrs; -} ngx_mail_port_t; - - -typedef struct { - int family; - in_port_t port; - ngx_array_t addrs; /* array of ngx_mail_conf_addr_t */ -} ngx_mail_conf_port_t; - - -typedef struct { - ngx_mail_listen_t opt; -} ngx_mail_conf_addr_t; - - -typedef struct { - ngx_array_t servers; /* ngx_mail_core_srv_conf_t */ - ngx_array_t listen; /* ngx_mail_listen_t */ -} ngx_mail_core_main_conf_t; - - -#define NGX_MAIL_POP3_PROTOCOL 0 -#define NGX_MAIL_IMAP_PROTOCOL 1 -#define NGX_MAIL_SMTP_PROTOCOL 2 - - -typedef struct ngx_mail_protocol_s ngx_mail_protocol_t; - - -typedef struct { - ngx_mail_protocol_t *protocol; - - ngx_msec_t timeout; - ngx_msec_t resolver_timeout; - - ngx_uint_t max_errors; - - ngx_str_t server_name; - - u_char *file_name; - ngx_uint_t line; - - ngx_resolver_t *resolver; - ngx_log_t *error_log; - - /* server ctx */ - ngx_mail_conf_ctx_t *ctx; - - ngx_uint_t listen; /* unsigned listen:1; */ -} ngx_mail_core_srv_conf_t; - - -typedef enum { - ngx_pop3_start = 0, - ngx_pop3_user, - ngx_pop3_passwd, - ngx_pop3_auth_login_username, - ngx_pop3_auth_login_password, - ngx_pop3_auth_plain, - ngx_pop3_auth_cram_md5, - ngx_pop3_auth_external -} ngx_pop3_state_e; - - -typedef enum { - ngx_imap_start = 0, - ngx_imap_auth_login_username, - ngx_imap_auth_login_password, - ngx_imap_auth_plain, - ngx_imap_auth_cram_md5, - ngx_imap_auth_external, - ngx_imap_login, - ngx_imap_user, - ngx_imap_passwd -} ngx_imap_state_e; - - -typedef enum { - ngx_smtp_start = 0, - ngx_smtp_auth_login_username, - ngx_smtp_auth_login_password, - ngx_smtp_auth_plain, - ngx_smtp_auth_cram_md5, - ngx_smtp_auth_external, - ngx_smtp_helo, - ngx_smtp_helo_xclient, - ngx_smtp_helo_auth, - ngx_smtp_helo_from, - ngx_smtp_xclient, - ngx_smtp_xclient_from, - ngx_smtp_xclient_helo, - ngx_smtp_xclient_auth, - ngx_smtp_from, - ngx_smtp_to -} ngx_smtp_state_e; - - -typedef struct { - ngx_peer_connection_t upstream; - ngx_buf_t *buffer; - ngx_uint_t proxy_protocol; /* unsigned proxy_protocol:1; */ -} ngx_mail_proxy_ctx_t; - - -typedef struct { - uint32_t signature; /* "MAIL" */ - - ngx_connection_t *connection; - - ngx_str_t out; - ngx_buf_t *buffer; - - void **ctx; - void **main_conf; - void **srv_conf; - - ngx_resolver_ctx_t *resolver_ctx; - - ngx_mail_proxy_ctx_t *proxy; - - ngx_uint_t mail_state; - - unsigned ssl:1; - unsigned protocol:3; - unsigned blocked:1; - unsigned quit:1; - unsigned quoted:1; - unsigned backslash:1; - unsigned no_sync_literal:1; - unsigned starttls:1; - unsigned esmtp:1; - unsigned auth_method:3; - unsigned auth_wait:1; - - ngx_str_t login; - ngx_str_t passwd; - - ngx_str_t salt; - ngx_str_t tag; - ngx_str_t tagged_line; - ngx_str_t text; - - ngx_str_t *addr_text; - ngx_str_t host; - ngx_str_t smtp_helo; - ngx_str_t smtp_from; - ngx_str_t smtp_to; - - ngx_str_t cmd; - - ngx_uint_t command; - ngx_array_t args; - - ngx_uint_t errors; - ngx_uint_t login_attempt; - - /* used to parse POP3/IMAP/SMTP command */ - - ngx_uint_t state; - u_char *tag_start; - u_char *cmd_start; - u_char *arg_start; - ngx_uint_t literal_len; -} ngx_mail_session_t; - - -typedef struct { - ngx_str_t *client; - ngx_mail_session_t *session; -} ngx_mail_log_ctx_t; - - -#define NGX_POP3_USER 1 -#define NGX_POP3_PASS 2 -#define NGX_POP3_CAPA 3 -#define NGX_POP3_QUIT 4 -#define NGX_POP3_NOOP 5 -#define NGX_POP3_STLS 6 -#define NGX_POP3_APOP 7 -#define NGX_POP3_AUTH 8 -#define NGX_POP3_STAT 9 -#define NGX_POP3_LIST 10 -#define NGX_POP3_RETR 11 -#define NGX_POP3_DELE 12 -#define NGX_POP3_RSET 13 -#define NGX_POP3_TOP 14 -#define NGX_POP3_UIDL 15 - - -#define NGX_IMAP_LOGIN 1 -#define NGX_IMAP_LOGOUT 2 -#define NGX_IMAP_CAPABILITY 3 -#define NGX_IMAP_NOOP 4 -#define NGX_IMAP_STARTTLS 5 - -#define NGX_IMAP_NEXT 6 - -#define NGX_IMAP_AUTHENTICATE 7 - - -#define NGX_SMTP_HELO 1 -#define NGX_SMTP_EHLO 2 -#define NGX_SMTP_AUTH 3 -#define NGX_SMTP_QUIT 4 -#define NGX_SMTP_NOOP 5 -#define NGX_SMTP_MAIL 6 -#define NGX_SMTP_RSET 7 -#define NGX_SMTP_RCPT 8 -#define NGX_SMTP_DATA 9 -#define NGX_SMTP_VRFY 10 -#define NGX_SMTP_EXPN 11 -#define NGX_SMTP_HELP 12 -#define NGX_SMTP_STARTTLS 13 - - -#define NGX_MAIL_AUTH_PLAIN 0 -#define NGX_MAIL_AUTH_LOGIN 1 -#define NGX_MAIL_AUTH_LOGIN_USERNAME 2 -#define NGX_MAIL_AUTH_APOP 3 -#define NGX_MAIL_AUTH_CRAM_MD5 4 -#define NGX_MAIL_AUTH_EXTERNAL 5 -#define NGX_MAIL_AUTH_NONE 6 - - -#define NGX_MAIL_AUTH_PLAIN_ENABLED 0x0002 -#define NGX_MAIL_AUTH_LOGIN_ENABLED 0x0004 -#define NGX_MAIL_AUTH_APOP_ENABLED 0x0008 -#define NGX_MAIL_AUTH_CRAM_MD5_ENABLED 0x0010 -#define NGX_MAIL_AUTH_EXTERNAL_ENABLED 0x0020 -#define NGX_MAIL_AUTH_NONE_ENABLED 0x0040 - - -#define NGX_MAIL_PARSE_INVALID_COMMAND 20 - - -typedef void (*ngx_mail_init_session_pt)(ngx_mail_session_t *s, - ngx_connection_t *c); -typedef void (*ngx_mail_init_protocol_pt)(ngx_event_t *rev); -typedef void (*ngx_mail_auth_state_pt)(ngx_event_t *rev); -typedef ngx_int_t (*ngx_mail_parse_command_pt)(ngx_mail_session_t *s); - - -struct ngx_mail_protocol_s { - ngx_str_t name; - ngx_str_t alpn; - in_port_t port[4]; - ngx_uint_t type; - - ngx_mail_init_session_pt init_session; - ngx_mail_init_protocol_pt init_protocol; - ngx_mail_parse_command_pt parse_command; - ngx_mail_auth_state_pt auth_state; - - ngx_str_t internal_server_error; - ngx_str_t cert_error; - ngx_str_t no_cert; -}; - - -typedef struct { - ngx_mail_protocol_t *protocol; - - void *(*create_main_conf)(ngx_conf_t *cf); - char *(*init_main_conf)(ngx_conf_t *cf, void *conf); - - void *(*create_srv_conf)(ngx_conf_t *cf); - char *(*merge_srv_conf)(ngx_conf_t *cf, void *prev, - void *conf); -} ngx_mail_module_t; - - -#define NGX_MAIL_MODULE 0x4C49414D /* "MAIL" */ - -#define NGX_MAIL_MAIN_CONF 0x02000000 -#define NGX_MAIL_SRV_CONF 0x04000000 - - -#define NGX_MAIL_MAIN_CONF_OFFSET offsetof(ngx_mail_conf_ctx_t, main_conf) -#define NGX_MAIL_SRV_CONF_OFFSET offsetof(ngx_mail_conf_ctx_t, srv_conf) - - -#define ngx_mail_get_module_ctx(s, module) (s)->ctx[module.ctx_index] -#define ngx_mail_set_ctx(s, c, module) s->ctx[module.ctx_index] = c; -#define ngx_mail_delete_ctx(s, module) s->ctx[module.ctx_index] = NULL; - - -#define ngx_mail_get_module_main_conf(s, module) \ - (s)->main_conf[module.ctx_index] -#define ngx_mail_get_module_srv_conf(s, module) (s)->srv_conf[module.ctx_index] - -#define ngx_mail_conf_get_module_main_conf(cf, module) \ - ((ngx_mail_conf_ctx_t *) cf->ctx)->main_conf[module.ctx_index] -#define ngx_mail_conf_get_module_srv_conf(cf, module) \ - ((ngx_mail_conf_ctx_t *) cf->ctx)->srv_conf[module.ctx_index] - - -#if (NGX_MAIL_SSL) -void ngx_mail_starttls_handler(ngx_event_t *rev); -ngx_int_t ngx_mail_starttls_only(ngx_mail_session_t *s, ngx_connection_t *c); -#endif - - -void ngx_mail_init_connection(ngx_connection_t *c); - -ngx_int_t ngx_mail_salt(ngx_mail_session_t *s, ngx_connection_t *c, - ngx_mail_core_srv_conf_t *cscf); -ngx_int_t ngx_mail_auth_plain(ngx_mail_session_t *s, ngx_connection_t *c, - ngx_uint_t n); -ngx_int_t ngx_mail_auth_login_username(ngx_mail_session_t *s, - ngx_connection_t *c, ngx_uint_t n); -ngx_int_t ngx_mail_auth_login_password(ngx_mail_session_t *s, - ngx_connection_t *c); -ngx_int_t ngx_mail_auth_cram_md5_salt(ngx_mail_session_t *s, - ngx_connection_t *c, char *prefix, size_t len); -ngx_int_t ngx_mail_auth_cram_md5(ngx_mail_session_t *s, ngx_connection_t *c); -ngx_int_t ngx_mail_auth_external(ngx_mail_session_t *s, ngx_connection_t *c, - ngx_uint_t n); -ngx_int_t ngx_mail_auth_parse(ngx_mail_session_t *s, ngx_connection_t *c); - -void ngx_mail_send(ngx_event_t *wev); -ngx_int_t ngx_mail_read_command(ngx_mail_session_t *s, ngx_connection_t *c); -void ngx_mail_auth(ngx_mail_session_t *s, ngx_connection_t *c); -void ngx_mail_close_connection(ngx_connection_t *c); -void ngx_mail_session_internal_server_error(ngx_mail_session_t *s); -u_char *ngx_mail_log_error(ngx_log_t *log, u_char *buf, size_t len); - - -char *ngx_mail_capabilities(ngx_conf_t *cf, ngx_command_t *cmd, void *conf); - - -/* STUB */ -void ngx_mail_proxy_init(ngx_mail_session_t *s, ngx_addr_t *peer); -void ngx_mail_auth_http_init(ngx_mail_session_t *s); -ngx_int_t ngx_mail_realip_handler(ngx_mail_session_t *s); -/**/ - - -extern ngx_uint_t ngx_mail_max_module; -extern ngx_module_t ngx_mail_core_module; - - -#endif /* _NGX_MAIL_H_INCLUDED_ */ diff --git a/src/deps/src/nginx-1.30.3/src/mail/ngx_mail_auth_http_module.c b/src/deps/src/nginx-1.30.3/src/mail/ngx_mail_auth_http_module.c deleted file mode 100644 index 3e5095a2d2..0000000000 --- a/src/deps/src/nginx-1.30.3/src/mail/ngx_mail_auth_http_module.c +++ /dev/null @@ -1,1662 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#include -#include -#include -#include -#include - - -typedef struct { - ngx_addr_t *peer; - - ngx_msec_t timeout; - ngx_flag_t pass_client_cert; - - ngx_str_t host_header; - ngx_str_t uri; - ngx_str_t header; - - ngx_array_t *headers; - - u_char *file; - ngx_uint_t line; -} ngx_mail_auth_http_conf_t; - - -typedef struct ngx_mail_auth_http_ctx_s ngx_mail_auth_http_ctx_t; - -typedef void (*ngx_mail_auth_http_handler_pt)(ngx_mail_session_t *s, - ngx_mail_auth_http_ctx_t *ctx); - -struct ngx_mail_auth_http_ctx_s { - ngx_buf_t *request; - ngx_buf_t *response; - ngx_peer_connection_t peer; - - ngx_mail_auth_http_handler_pt handler; - - ngx_uint_t state; - - u_char *header_name_start; - u_char *header_name_end; - u_char *header_start; - u_char *header_end; - - ngx_str_t addr; - ngx_str_t port; - ngx_str_t err; - ngx_str_t errmsg; - ngx_str_t errcode; - - time_t sleep; - - ngx_pool_t *pool; -}; - - -static void ngx_mail_auth_http_write_handler(ngx_event_t *wev); -static void ngx_mail_auth_http_read_handler(ngx_event_t *rev); -static void ngx_mail_auth_http_ignore_status_line(ngx_mail_session_t *s, - ngx_mail_auth_http_ctx_t *ctx); -static void ngx_mail_auth_http_process_headers(ngx_mail_session_t *s, - ngx_mail_auth_http_ctx_t *ctx); -static void ngx_mail_auth_sleep_handler(ngx_event_t *rev); -static ngx_int_t ngx_mail_auth_http_parse_header_line(ngx_mail_session_t *s, - ngx_mail_auth_http_ctx_t *ctx); -static void ngx_mail_auth_http_block_read(ngx_event_t *rev); -static void ngx_mail_auth_http_dummy_handler(ngx_event_t *ev); -static ngx_buf_t *ngx_mail_auth_http_create_request(ngx_mail_session_t *s, - ngx_pool_t *pool, ngx_mail_auth_http_conf_t *ahcf); -static ngx_int_t ngx_mail_auth_http_escape(ngx_pool_t *pool, ngx_str_t *text, - ngx_str_t *escaped); - -static void *ngx_mail_auth_http_create_conf(ngx_conf_t *cf); -static char *ngx_mail_auth_http_merge_conf(ngx_conf_t *cf, void *parent, - void *child); -static char *ngx_mail_auth_http(ngx_conf_t *cf, ngx_command_t *cmd, void *conf); -static char *ngx_mail_auth_http_header(ngx_conf_t *cf, ngx_command_t *cmd, - void *conf); - - -static ngx_command_t ngx_mail_auth_http_commands[] = { - - { ngx_string("auth_http"), - NGX_MAIL_MAIN_CONF|NGX_MAIL_SRV_CONF|NGX_CONF_TAKE1, - ngx_mail_auth_http, - NGX_MAIL_SRV_CONF_OFFSET, - 0, - NULL }, - - { ngx_string("auth_http_timeout"), - NGX_MAIL_MAIN_CONF|NGX_MAIL_SRV_CONF|NGX_CONF_TAKE1, - ngx_conf_set_msec_slot, - NGX_MAIL_SRV_CONF_OFFSET, - offsetof(ngx_mail_auth_http_conf_t, timeout), - NULL }, - - { ngx_string("auth_http_header"), - NGX_MAIL_MAIN_CONF|NGX_MAIL_SRV_CONF|NGX_CONF_TAKE2, - ngx_mail_auth_http_header, - NGX_MAIL_SRV_CONF_OFFSET, - 0, - NULL }, - - { ngx_string("auth_http_pass_client_cert"), - NGX_MAIL_MAIN_CONF|NGX_MAIL_SRV_CONF|NGX_CONF_FLAG, - ngx_conf_set_flag_slot, - NGX_MAIL_SRV_CONF_OFFSET, - offsetof(ngx_mail_auth_http_conf_t, pass_client_cert), - NULL }, - - ngx_null_command -}; - - -static ngx_mail_module_t ngx_mail_auth_http_module_ctx = { - NULL, /* protocol */ - - NULL, /* create main configuration */ - NULL, /* init main configuration */ - - ngx_mail_auth_http_create_conf, /* create server configuration */ - ngx_mail_auth_http_merge_conf /* merge server configuration */ -}; - - -ngx_module_t ngx_mail_auth_http_module = { - NGX_MODULE_V1, - &ngx_mail_auth_http_module_ctx, /* module context */ - ngx_mail_auth_http_commands, /* module directives */ - NGX_MAIL_MODULE, /* module type */ - NULL, /* init master */ - NULL, /* init module */ - NULL, /* init process */ - NULL, /* init thread */ - NULL, /* exit thread */ - NULL, /* exit process */ - NULL, /* exit master */ - NGX_MODULE_V1_PADDING -}; - - -static ngx_str_t ngx_mail_auth_http_method[] = { - ngx_string("plain"), - ngx_string("plain"), - ngx_string("plain"), - ngx_string("apop"), - ngx_string("cram-md5"), - ngx_string("external"), - ngx_string("none") -}; - -static ngx_str_t ngx_mail_smtp_errcode = ngx_string("535 5.7.0"); - - -void -ngx_mail_auth_http_init(ngx_mail_session_t *s) -{ - ngx_int_t rc; - ngx_pool_t *pool; - ngx_mail_auth_http_ctx_t *ctx; - ngx_mail_auth_http_conf_t *ahcf; - - s->connection->log->action = "in http auth state"; - - pool = ngx_create_pool(2048, s->connection->log); - if (pool == NULL) { - ngx_mail_session_internal_server_error(s); - return; - } - - ctx = ngx_pcalloc(pool, sizeof(ngx_mail_auth_http_ctx_t)); - if (ctx == NULL) { - ngx_destroy_pool(pool); - ngx_mail_session_internal_server_error(s); - return; - } - - ctx->pool = pool; - - ahcf = ngx_mail_get_module_srv_conf(s, ngx_mail_auth_http_module); - - ctx->request = ngx_mail_auth_http_create_request(s, pool, ahcf); - if (ctx->request == NULL) { - ngx_destroy_pool(ctx->pool); - ngx_mail_session_internal_server_error(s); - return; - } - - ngx_mail_set_ctx(s, ctx, ngx_mail_auth_http_module); - - ctx->peer.sockaddr = ahcf->peer->sockaddr; - ctx->peer.socklen = ahcf->peer->socklen; - ctx->peer.name = &ahcf->peer->name; - ctx->peer.get = ngx_event_get_peer; - ctx->peer.log = s->connection->log; - ctx->peer.log_error = NGX_ERROR_ERR; - - rc = ngx_event_connect_peer(&ctx->peer); - - if (rc == NGX_ERROR || rc == NGX_BUSY || rc == NGX_DECLINED) { - if (ctx->peer.connection) { - ngx_close_connection(ctx->peer.connection); - } - - ngx_destroy_pool(ctx->pool); - ngx_mail_session_internal_server_error(s); - return; - } - - ctx->peer.connection->data = s; - ctx->peer.connection->pool = s->connection->pool; - - s->connection->read->handler = ngx_mail_auth_http_block_read; - ctx->peer.connection->read->handler = ngx_mail_auth_http_read_handler; - ctx->peer.connection->write->handler = ngx_mail_auth_http_write_handler; - - ctx->handler = ngx_mail_auth_http_ignore_status_line; - - ngx_add_timer(ctx->peer.connection->read, ahcf->timeout); - ngx_add_timer(ctx->peer.connection->write, ahcf->timeout); - - if (rc == NGX_OK) { - ngx_mail_auth_http_write_handler(ctx->peer.connection->write); - return; - } -} - - -static void -ngx_mail_auth_http_write_handler(ngx_event_t *wev) -{ - ssize_t n, size; - ngx_connection_t *c; - ngx_mail_session_t *s; - ngx_mail_auth_http_ctx_t *ctx; - ngx_mail_auth_http_conf_t *ahcf; - - c = wev->data; - s = c->data; - - ctx = ngx_mail_get_module_ctx(s, ngx_mail_auth_http_module); - - ngx_log_debug0(NGX_LOG_DEBUG_MAIL, wev->log, 0, - "mail auth http write handler"); - - if (wev->timedout) { - ngx_log_error(NGX_LOG_ERR, wev->log, NGX_ETIMEDOUT, - "auth http server %V timed out", ctx->peer.name); - ngx_close_connection(c); - ngx_destroy_pool(ctx->pool); - ngx_mail_session_internal_server_error(s); - return; - } - - size = ctx->request->last - ctx->request->pos; - - n = ngx_send(c, ctx->request->pos, size); - - if (n == NGX_ERROR) { - ngx_close_connection(c); - ngx_destroy_pool(ctx->pool); - ngx_mail_session_internal_server_error(s); - return; - } - - if (n > 0) { - ctx->request->pos += n; - - if (n == size) { - wev->handler = ngx_mail_auth_http_dummy_handler; - - if (wev->timer_set) { - ngx_del_timer(wev); - } - - if (ngx_handle_write_event(wev, 0) != NGX_OK) { - ngx_close_connection(c); - ngx_destroy_pool(ctx->pool); - ngx_mail_session_internal_server_error(s); - } - - return; - } - } - - if (!wev->timer_set) { - ahcf = ngx_mail_get_module_srv_conf(s, ngx_mail_auth_http_module); - ngx_add_timer(wev, ahcf->timeout); - } -} - - -static void -ngx_mail_auth_http_read_handler(ngx_event_t *rev) -{ - ssize_t n, size; - ngx_connection_t *c; - ngx_mail_session_t *s; - ngx_mail_auth_http_ctx_t *ctx; - - c = rev->data; - s = c->data; - - ngx_log_debug0(NGX_LOG_DEBUG_MAIL, rev->log, 0, - "mail auth http read handler"); - - ctx = ngx_mail_get_module_ctx(s, ngx_mail_auth_http_module); - - if (rev->timedout) { - ngx_log_error(NGX_LOG_ERR, rev->log, NGX_ETIMEDOUT, - "auth http server %V timed out", ctx->peer.name); - ngx_close_connection(c); - ngx_destroy_pool(ctx->pool); - ngx_mail_session_internal_server_error(s); - return; - } - - if (ctx->response == NULL) { - ctx->response = ngx_create_temp_buf(ctx->pool, 1024); - if (ctx->response == NULL) { - ngx_close_connection(c); - ngx_destroy_pool(ctx->pool); - ngx_mail_session_internal_server_error(s); - return; - } - } - - size = ctx->response->end - ctx->response->last; - - n = ngx_recv(c, ctx->response->pos, size); - - if (n > 0) { - ctx->response->last += n; - - ctx->handler(s, ctx); - return; - } - - if (n == NGX_AGAIN) { - return; - } - - ngx_close_connection(c); - ngx_destroy_pool(ctx->pool); - ngx_mail_session_internal_server_error(s); -} - - -static void -ngx_mail_auth_http_ignore_status_line(ngx_mail_session_t *s, - ngx_mail_auth_http_ctx_t *ctx) -{ - u_char *p, ch; - enum { - sw_start = 0, - sw_H, - sw_HT, - sw_HTT, - sw_HTTP, - sw_skip, - sw_almost_done - } state; - - ngx_log_debug0(NGX_LOG_DEBUG_MAIL, s->connection->log, 0, - "mail auth http process status line"); - - state = ctx->state; - - for (p = ctx->response->pos; p < ctx->response->last; p++) { - ch = *p; - - switch (state) { - - /* "HTTP/" */ - case sw_start: - if (ch == 'H') { - state = sw_H; - break; - } - goto next; - - case sw_H: - if (ch == 'T') { - state = sw_HT; - break; - } - goto next; - - case sw_HT: - if (ch == 'T') { - state = sw_HTT; - break; - } - goto next; - - case sw_HTT: - if (ch == 'P') { - state = sw_HTTP; - break; - } - goto next; - - case sw_HTTP: - if (ch == '/') { - state = sw_skip; - break; - } - goto next; - - /* any text until end of line */ - case sw_skip: - switch (ch) { - case CR: - state = sw_almost_done; - - break; - case LF: - goto done; - } - break; - - /* end of status line */ - case sw_almost_done: - if (ch == LF) { - goto done; - } - - ngx_log_error(NGX_LOG_ERR, s->connection->log, 0, - "auth http server %V sent invalid response", - ctx->peer.name); - ngx_close_connection(ctx->peer.connection); - ngx_destroy_pool(ctx->pool); - ngx_mail_session_internal_server_error(s); - return; - } - } - - ctx->response->pos = p; - ctx->state = state; - - return; - -next: - - p = ctx->response->start - 1; - -done: - - ctx->response->pos = p + 1; - ctx->state = 0; - ctx->handler = ngx_mail_auth_http_process_headers; - ctx->handler(s, ctx); -} - - -static void -ngx_mail_auth_http_process_headers(ngx_mail_session_t *s, - ngx_mail_auth_http_ctx_t *ctx) -{ - u_char *p; - time_t timer; - size_t len, size; - ngx_int_t rc, port, n; - ngx_addr_t *peer; - - ngx_log_debug0(NGX_LOG_DEBUG_MAIL, s->connection->log, 0, - "mail auth http process headers"); - - for ( ;; ) { - rc = ngx_mail_auth_http_parse_header_line(s, ctx); - - if (rc == NGX_OK) { - -#if (NGX_DEBUG) - { - ngx_str_t key, value; - - key.len = ctx->header_name_end - ctx->header_name_start; - key.data = ctx->header_name_start; - value.len = ctx->header_end - ctx->header_start; - value.data = ctx->header_start; - - ngx_log_debug2(NGX_LOG_DEBUG_MAIL, s->connection->log, 0, - "mail auth http header: \"%V: %V\"", - &key, &value); - } -#endif - - len = ctx->header_name_end - ctx->header_name_start; - - if (len == sizeof("Auth-Status") - 1 - && ngx_strncasecmp(ctx->header_name_start, - (u_char *) "Auth-Status", - sizeof("Auth-Status") - 1) - == 0) - { - len = ctx->header_end - ctx->header_start; - - if (len == 2 - && ctx->header_start[0] == 'O' - && ctx->header_start[1] == 'K') - { - continue; - } - - if (len == 4 - && ctx->header_start[0] == 'W' - && ctx->header_start[1] == 'A' - && ctx->header_start[2] == 'I' - && ctx->header_start[3] == 'T') - { - s->auth_wait = 1; - continue; - } - - ctx->errmsg.len = len; - ctx->errmsg.data = ctx->header_start; - - switch (s->protocol) { - - case NGX_MAIL_POP3_PROTOCOL: - size = sizeof("-ERR ") - 1 + len + sizeof(CRLF) - 1; - break; - - case NGX_MAIL_IMAP_PROTOCOL: - size = s->tag.len + sizeof("NO ") - 1 + len - + sizeof(CRLF) - 1; - break; - - default: /* NGX_MAIL_SMTP_PROTOCOL */ - ctx->err = ctx->errmsg; - continue; - } - - p = ngx_pnalloc(s->connection->pool, size); - if (p == NULL) { - ngx_close_connection(ctx->peer.connection); - ngx_destroy_pool(ctx->pool); - ngx_mail_session_internal_server_error(s); - return; - } - - ctx->err.data = p; - - switch (s->protocol) { - - case NGX_MAIL_POP3_PROTOCOL: - *p++ = '-'; *p++ = 'E'; *p++ = 'R'; *p++ = 'R'; *p++ = ' '; - break; - - case NGX_MAIL_IMAP_PROTOCOL: - p = ngx_cpymem(p, s->tag.data, s->tag.len); - *p++ = 'N'; *p++ = 'O'; *p++ = ' '; - break; - - default: /* NGX_MAIL_SMTP_PROTOCOL */ - break; - } - - p = ngx_cpymem(p, ctx->header_start, len); - *p++ = CR; *p++ = LF; - - ctx->err.len = p - ctx->err.data; - - continue; - } - - if (len == sizeof("Auth-Server") - 1 - && ngx_strncasecmp(ctx->header_name_start, - (u_char *) "Auth-Server", - sizeof("Auth-Server") - 1) - == 0) - { - ctx->addr.len = ctx->header_end - ctx->header_start; - ctx->addr.data = ctx->header_start; - - continue; - } - - if (len == sizeof("Auth-Port") - 1 - && ngx_strncasecmp(ctx->header_name_start, - (u_char *) "Auth-Port", - sizeof("Auth-Port") - 1) - == 0) - { - ctx->port.len = ctx->header_end - ctx->header_start; - ctx->port.data = ctx->header_start; - - continue; - } - - if (len == sizeof("Auth-User") - 1 - && ngx_strncasecmp(ctx->header_name_start, - (u_char *) "Auth-User", - sizeof("Auth-User") - 1) - == 0) - { - s->login.len = ctx->header_end - ctx->header_start; - - s->login.data = ngx_pnalloc(s->connection->pool, s->login.len); - if (s->login.data == NULL) { - ngx_close_connection(ctx->peer.connection); - ngx_destroy_pool(ctx->pool); - ngx_mail_session_internal_server_error(s); - return; - } - - ngx_memcpy(s->login.data, ctx->header_start, s->login.len); - - continue; - } - - if (len == sizeof("Auth-Pass") - 1 - && ngx_strncasecmp(ctx->header_name_start, - (u_char *) "Auth-Pass", - sizeof("Auth-Pass") - 1) - == 0) - { - s->passwd.len = ctx->header_end - ctx->header_start; - - s->passwd.data = ngx_pnalloc(s->connection->pool, - s->passwd.len); - if (s->passwd.data == NULL) { - ngx_close_connection(ctx->peer.connection); - ngx_destroy_pool(ctx->pool); - ngx_mail_session_internal_server_error(s); - return; - } - - ngx_memcpy(s->passwd.data, ctx->header_start, s->passwd.len); - - continue; - } - - if (len == sizeof("Auth-Wait") - 1 - && ngx_strncasecmp(ctx->header_name_start, - (u_char *) "Auth-Wait", - sizeof("Auth-Wait") - 1) - == 0) - { - n = ngx_atoi(ctx->header_start, - ctx->header_end - ctx->header_start); - - if (n != NGX_ERROR) { - ctx->sleep = n; - } - - continue; - } - - if (len == sizeof("Auth-Error-Code") - 1 - && ngx_strncasecmp(ctx->header_name_start, - (u_char *) "Auth-Error-Code", - sizeof("Auth-Error-Code") - 1) - == 0) - { - ctx->errcode.len = ctx->header_end - ctx->header_start; - - ctx->errcode.data = ngx_pnalloc(s->connection->pool, - ctx->errcode.len); - if (ctx->errcode.data == NULL) { - ngx_close_connection(ctx->peer.connection); - ngx_destroy_pool(ctx->pool); - ngx_mail_session_internal_server_error(s); - return; - } - - ngx_memcpy(ctx->errcode.data, ctx->header_start, - ctx->errcode.len); - - continue; - } - - /* ignore other headers */ - - continue; - } - - if (rc == NGX_DONE) { - ngx_log_debug0(NGX_LOG_DEBUG_MAIL, s->connection->log, 0, - "mail auth http header done"); - - ngx_close_connection(ctx->peer.connection); - - if (ctx->err.len) { - - ngx_log_error(NGX_LOG_INFO, s->connection->log, 0, - "client login failed: \"%V\"", &ctx->errmsg); - - if (s->protocol == NGX_MAIL_SMTP_PROTOCOL) { - - if (ctx->errcode.len == 0) { - ctx->errcode = ngx_mail_smtp_errcode; - } - - ctx->err.len = ctx->errcode.len + ctx->errmsg.len - + sizeof(" " CRLF) - 1; - - p = ngx_pnalloc(s->connection->pool, ctx->err.len); - if (p == NULL) { - ngx_destroy_pool(ctx->pool); - ngx_mail_session_internal_server_error(s); - return; - } - - ctx->err.data = p; - - p = ngx_cpymem(p, ctx->errcode.data, ctx->errcode.len); - *p++ = ' '; - p = ngx_cpymem(p, ctx->errmsg.data, ctx->errmsg.len); - *p++ = CR; *p = LF; - } - - s->out = ctx->err; - timer = ctx->sleep; - - ngx_destroy_pool(ctx->pool); - - if (timer == 0) { - s->quit = 1; - ngx_mail_send(s->connection->write); - return; - } - - ngx_add_timer(s->connection->read, (ngx_msec_t) (timer * 1000)); - - s->connection->read->handler = ngx_mail_auth_sleep_handler; - - return; - } - - if (s->auth_wait) { - timer = ctx->sleep; - - ngx_destroy_pool(ctx->pool); - - if (timer == 0) { - ngx_mail_auth_http_init(s); - return; - } - - ngx_add_timer(s->connection->read, (ngx_msec_t) (timer * 1000)); - - s->connection->read->handler = ngx_mail_auth_sleep_handler; - - return; - } - - if (ctx->addr.len == 0 || ctx->port.len == 0) { - ngx_log_error(NGX_LOG_ERR, s->connection->log, 0, - "auth http server %V did not send server or port", - ctx->peer.name); - ngx_destroy_pool(ctx->pool); - ngx_mail_session_internal_server_error(s); - return; - } - - if (s->passwd.data == NULL - && s->protocol != NGX_MAIL_SMTP_PROTOCOL) - { - ngx_log_error(NGX_LOG_ERR, s->connection->log, 0, - "auth http server %V did not send password", - ctx->peer.name); - ngx_destroy_pool(ctx->pool); - ngx_mail_session_internal_server_error(s); - return; - } - - peer = ngx_pcalloc(s->connection->pool, sizeof(ngx_addr_t)); - if (peer == NULL) { - ngx_destroy_pool(ctx->pool); - ngx_mail_session_internal_server_error(s); - return; - } - - rc = ngx_parse_addr(s->connection->pool, peer, - ctx->addr.data, ctx->addr.len); - - switch (rc) { - case NGX_OK: - break; - - case NGX_DECLINED: - ngx_log_error(NGX_LOG_ERR, s->connection->log, 0, - "auth http server %V sent invalid server " - "address:\"%V\"", - ctx->peer.name, &ctx->addr); - /* fall through */ - - default: - ngx_destroy_pool(ctx->pool); - ngx_mail_session_internal_server_error(s); - return; - } - - port = ngx_atoi(ctx->port.data, ctx->port.len); - if (port == NGX_ERROR || port < 1 || port > 65535) { - ngx_log_error(NGX_LOG_ERR, s->connection->log, 0, - "auth http server %V sent invalid server " - "port:\"%V\"", - ctx->peer.name, &ctx->port); - ngx_destroy_pool(ctx->pool); - ngx_mail_session_internal_server_error(s); - return; - } - - ngx_inet_set_port(peer->sockaddr, (in_port_t) port); - - len = ctx->addr.len + 1 + ctx->port.len; - - peer->name.len = len; - - peer->name.data = ngx_pnalloc(s->connection->pool, len); - if (peer->name.data == NULL) { - ngx_destroy_pool(ctx->pool); - ngx_mail_session_internal_server_error(s); - return; - } - - len = ctx->addr.len; - - ngx_memcpy(peer->name.data, ctx->addr.data, len); - - peer->name.data[len++] = ':'; - - ngx_memcpy(peer->name.data + len, ctx->port.data, ctx->port.len); - - ngx_destroy_pool(ctx->pool); - ngx_mail_proxy_init(s, peer); - - return; - } - - if (rc == NGX_AGAIN ) { - return; - } - - /* rc == NGX_ERROR */ - - ngx_log_error(NGX_LOG_ERR, s->connection->log, 0, - "auth http server %V sent invalid header in response", - ctx->peer.name); - ngx_close_connection(ctx->peer.connection); - ngx_destroy_pool(ctx->pool); - ngx_mail_session_internal_server_error(s); - - return; - } -} - - -static void -ngx_mail_auth_sleep_handler(ngx_event_t *rev) -{ - ngx_connection_t *c; - ngx_mail_session_t *s; - ngx_mail_core_srv_conf_t *cscf; - - ngx_log_debug0(NGX_LOG_DEBUG_MAIL, rev->log, 0, "mail auth sleep handler"); - - c = rev->data; - s = c->data; - - if (rev->timedout) { - - rev->timedout = 0; - - if (s->auth_wait) { - s->auth_wait = 0; - ngx_mail_auth_http_init(s); - return; - } - - cscf = ngx_mail_get_module_srv_conf(s, ngx_mail_core_module); - - rev->handler = cscf->protocol->auth_state; - - s->mail_state = 0; - s->auth_method = NGX_MAIL_AUTH_PLAIN; - - c->log->action = "in auth state"; - - ngx_mail_send(c->write); - - if (c->destroyed) { - return; - } - - ngx_add_timer(rev, cscf->timeout); - - if (rev->ready) { - rev->handler(rev); - return; - } - - if (ngx_handle_read_event(rev, 0) != NGX_OK) { - ngx_mail_close_connection(c); - } - - return; - } - - if (rev->active) { - if (ngx_handle_read_event(rev, 0) != NGX_OK) { - ngx_mail_close_connection(c); - } - } -} - - -static ngx_int_t -ngx_mail_auth_http_parse_header_line(ngx_mail_session_t *s, - ngx_mail_auth_http_ctx_t *ctx) -{ - u_char c, ch, *p; - enum { - sw_start = 0, - sw_name, - sw_space_before_value, - sw_value, - sw_space_after_value, - sw_almost_done, - sw_header_almost_done - } state; - - state = ctx->state; - - for (p = ctx->response->pos; p < ctx->response->last; p++) { - ch = *p; - - switch (state) { - - /* first char */ - case sw_start: - - switch (ch) { - case CR: - ctx->header_end = p; - state = sw_header_almost_done; - break; - case LF: - ctx->header_end = p; - goto header_done; - default: - state = sw_name; - ctx->header_name_start = p; - - c = (u_char) (ch | 0x20); - if (c >= 'a' && c <= 'z') { - break; - } - - if (ch >= '0' && ch <= '9') { - break; - } - - return NGX_ERROR; - } - break; - - /* header name */ - case sw_name: - c = (u_char) (ch | 0x20); - if (c >= 'a' && c <= 'z') { - break; - } - - if (ch == ':') { - ctx->header_name_end = p; - state = sw_space_before_value; - break; - } - - if (ch == '-') { - break; - } - - if (ch >= '0' && ch <= '9') { - break; - } - - if (ch == CR) { - ctx->header_name_end = p; - ctx->header_start = p; - ctx->header_end = p; - state = sw_almost_done; - break; - } - - if (ch == LF) { - ctx->header_name_end = p; - ctx->header_start = p; - ctx->header_end = p; - goto done; - } - - return NGX_ERROR; - - /* space* before header value */ - case sw_space_before_value: - switch (ch) { - case ' ': - break; - case CR: - ctx->header_start = p; - ctx->header_end = p; - state = sw_almost_done; - break; - case LF: - ctx->header_start = p; - ctx->header_end = p; - goto done; - default: - ctx->header_start = p; - state = sw_value; - break; - } - break; - - /* header value */ - case sw_value: - switch (ch) { - case ' ': - ctx->header_end = p; - state = sw_space_after_value; - break; - case CR: - ctx->header_end = p; - state = sw_almost_done; - break; - case LF: - ctx->header_end = p; - goto done; - } - break; - - /* space* before end of header line */ - case sw_space_after_value: - switch (ch) { - case ' ': - break; - case CR: - state = sw_almost_done; - break; - case LF: - goto done; - default: - state = sw_value; - break; - } - break; - - /* end of header line */ - case sw_almost_done: - switch (ch) { - case LF: - goto done; - default: - return NGX_ERROR; - } - - /* end of header */ - case sw_header_almost_done: - switch (ch) { - case LF: - goto header_done; - default: - return NGX_ERROR; - } - } - } - - ctx->response->pos = p; - ctx->state = state; - - return NGX_AGAIN; - -done: - - ctx->response->pos = p + 1; - ctx->state = sw_start; - - return NGX_OK; - -header_done: - - ctx->response->pos = p + 1; - ctx->state = sw_start; - - return NGX_DONE; -} - - -static void -ngx_mail_auth_http_block_read(ngx_event_t *rev) -{ - ngx_connection_t *c; - ngx_mail_session_t *s; - ngx_mail_auth_http_ctx_t *ctx; - - ngx_log_debug0(NGX_LOG_DEBUG_MAIL, rev->log, 0, - "mail auth http block read"); - - if (ngx_handle_read_event(rev, 0) != NGX_OK) { - c = rev->data; - s = c->data; - - ctx = ngx_mail_get_module_ctx(s, ngx_mail_auth_http_module); - - ngx_close_connection(ctx->peer.connection); - ngx_destroy_pool(ctx->pool); - ngx_mail_session_internal_server_error(s); - } -} - - -static void -ngx_mail_auth_http_dummy_handler(ngx_event_t *ev) -{ - ngx_log_debug0(NGX_LOG_DEBUG_MAIL, ev->log, 0, - "mail auth http dummy handler"); -} - - -static ngx_buf_t * -ngx_mail_auth_http_create_request(ngx_mail_session_t *s, ngx_pool_t *pool, - ngx_mail_auth_http_conf_t *ahcf) -{ - size_t len; - ngx_buf_t *b; - ngx_str_t login, passwd; - ngx_connection_t *c; -#if (NGX_MAIL_SSL) - ngx_str_t protocol, cipher, verify, subject, issuer, - serial, fingerprint, raw_cert, cert; - ngx_mail_ssl_conf_t *sslcf; -#endif - ngx_mail_core_srv_conf_t *cscf; - - if (ngx_mail_auth_http_escape(pool, &s->login, &login) != NGX_OK) { - return NULL; - } - - if (ngx_mail_auth_http_escape(pool, &s->passwd, &passwd) != NGX_OK) { - return NULL; - } - - c = s->connection; - -#if (NGX_MAIL_SSL) - - if (c->ssl) { - - if (ngx_ssl_get_protocol(c, pool, &protocol) != NGX_OK) { - return NULL; - } - - protocol.len = ngx_strlen(protocol.data); - - if (ngx_ssl_get_cipher_name(c, pool, &cipher) != NGX_OK) { - return NULL; - } - - cipher.len = ngx_strlen(cipher.data); - - } else { - ngx_str_null(&protocol); - ngx_str_null(&cipher); - } - - sslcf = ngx_mail_get_module_srv_conf(s, ngx_mail_ssl_module); - - if (c->ssl && sslcf->verify) { - - /* certificate details */ - - if (ngx_ssl_get_client_verify(c, pool, &verify) != NGX_OK) { - return NULL; - } - - if (ngx_ssl_get_subject_dn(c, pool, &subject) != NGX_OK) { - return NULL; - } - - if (ngx_ssl_get_issuer_dn(c, pool, &issuer) != NGX_OK) { - return NULL; - } - - if (ngx_ssl_get_serial_number(c, pool, &serial) != NGX_OK) { - return NULL; - } - - if (ngx_ssl_get_fingerprint(c, pool, &fingerprint) != NGX_OK) { - return NULL; - } - - if (ahcf->pass_client_cert) { - - /* certificate itself, if configured */ - - if (ngx_ssl_get_raw_certificate(c, pool, &raw_cert) != NGX_OK) { - return NULL; - } - - if (ngx_mail_auth_http_escape(pool, &raw_cert, &cert) != NGX_OK) { - return NULL; - } - - } else { - ngx_str_null(&cert); - } - - } else { - ngx_str_null(&verify); - ngx_str_null(&subject); - ngx_str_null(&issuer); - ngx_str_null(&serial); - ngx_str_null(&fingerprint); - ngx_str_null(&cert); - } - -#endif - - cscf = ngx_mail_get_module_srv_conf(s, ngx_mail_core_module); - - len = sizeof("GET ") - 1 + ahcf->uri.len + sizeof(" HTTP/1.0" CRLF) - 1 - + sizeof("Host: ") - 1 + ahcf->host_header.len + sizeof(CRLF) - 1 - + sizeof("Auth-Method: ") - 1 - + ngx_mail_auth_http_method[s->auth_method].len - + sizeof(CRLF) - 1 - + sizeof("Auth-User: ") - 1 + login.len + sizeof(CRLF) - 1 - + sizeof("Auth-Pass: ") - 1 + passwd.len + sizeof(CRLF) - 1 - + sizeof("Auth-Salt: ") - 1 + s->salt.len - + sizeof("Auth-Protocol: ") - 1 + cscf->protocol->name.len - + sizeof(CRLF) - 1 - + sizeof("Auth-Login-Attempt: ") - 1 + NGX_INT_T_LEN - + sizeof(CRLF) - 1 - + sizeof("Client-IP: ") - 1 + s->connection->addr_text.len - + sizeof(CRLF) - 1 - + sizeof("Client-Host: ") - 1 + s->host.len + sizeof(CRLF) - 1 - + ahcf->header.len - + sizeof(CRLF) - 1; - - if (c->proxy_protocol) { - len += sizeof("Proxy-Protocol-Addr: ") - 1 - + c->proxy_protocol->src_addr.len + sizeof(CRLF) - 1 - + sizeof("Proxy-Protocol-Port: ") - 1 - + sizeof("65535") - 1 + sizeof(CRLF) - 1 - + sizeof("Proxy-Protocol-Server-Addr: ") - 1 - + c->proxy_protocol->dst_addr.len + sizeof(CRLF) - 1 - + sizeof("Proxy-Protocol-Server-Port: ") - 1 - + sizeof("65535") - 1 + sizeof(CRLF) - 1; - } - - if (s->auth_method == NGX_MAIL_AUTH_NONE) { - len += sizeof("Auth-SMTP-Helo: ") - 1 + s->smtp_helo.len - + sizeof(CRLF) - 1 - + sizeof("Auth-SMTP-From: ") - 1 + s->smtp_from.len - + sizeof(CRLF) - 1 - + sizeof("Auth-SMTP-To: ") - 1 + s->smtp_to.len - + sizeof(CRLF) - 1; - } - -#if (NGX_MAIL_SSL) - - if (c->ssl) { - len += sizeof("Auth-SSL: on" CRLF) - 1 - + sizeof("Auth-SSL-Protocol: ") - 1 + protocol.len - + sizeof(CRLF) - 1 - + sizeof("Auth-SSL-Cipher: ") - 1 + cipher.len - + sizeof(CRLF) - 1 - + sizeof("Auth-SSL-Verify: ") - 1 + verify.len - + sizeof(CRLF) - 1 - + sizeof("Auth-SSL-Subject: ") - 1 + subject.len - + sizeof(CRLF) - 1 - + sizeof("Auth-SSL-Issuer: ") - 1 + issuer.len - + sizeof(CRLF) - 1 - + sizeof("Auth-SSL-Serial: ") - 1 + serial.len - + sizeof(CRLF) - 1 - + sizeof("Auth-SSL-Fingerprint: ") - 1 + fingerprint.len - + sizeof(CRLF) - 1 - + sizeof("Auth-SSL-Cert: ") - 1 + cert.len - + sizeof(CRLF) - 1; - } - -#endif - - b = ngx_create_temp_buf(pool, len); - if (b == NULL) { - return NULL; - } - - b->last = ngx_cpymem(b->last, "GET ", sizeof("GET ") - 1); - b->last = ngx_copy(b->last, ahcf->uri.data, ahcf->uri.len); - b->last = ngx_cpymem(b->last, " HTTP/1.0" CRLF, - sizeof(" HTTP/1.0" CRLF) - 1); - - b->last = ngx_cpymem(b->last, "Host: ", sizeof("Host: ") - 1); - b->last = ngx_copy(b->last, ahcf->host_header.data, - ahcf->host_header.len); - *b->last++ = CR; *b->last++ = LF; - - b->last = ngx_cpymem(b->last, "Auth-Method: ", - sizeof("Auth-Method: ") - 1); - b->last = ngx_cpymem(b->last, - ngx_mail_auth_http_method[s->auth_method].data, - ngx_mail_auth_http_method[s->auth_method].len); - *b->last++ = CR; *b->last++ = LF; - - b->last = ngx_cpymem(b->last, "Auth-User: ", sizeof("Auth-User: ") - 1); - b->last = ngx_copy(b->last, login.data, login.len); - *b->last++ = CR; *b->last++ = LF; - - b->last = ngx_cpymem(b->last, "Auth-Pass: ", sizeof("Auth-Pass: ") - 1); - b->last = ngx_copy(b->last, passwd.data, passwd.len); - *b->last++ = CR; *b->last++ = LF; - - if ((s->auth_method == NGX_MAIL_AUTH_APOP - || s->auth_method == NGX_MAIL_AUTH_CRAM_MD5) - && s->salt.len) - { - b->last = ngx_cpymem(b->last, "Auth-Salt: ", sizeof("Auth-Salt: ") - 1); - b->last = ngx_copy(b->last, s->salt.data, s->salt.len); - - ngx_str_null(&s->passwd); - } - - b->last = ngx_cpymem(b->last, "Auth-Protocol: ", - sizeof("Auth-Protocol: ") - 1); - b->last = ngx_cpymem(b->last, cscf->protocol->name.data, - cscf->protocol->name.len); - *b->last++ = CR; *b->last++ = LF; - - b->last = ngx_sprintf(b->last, "Auth-Login-Attempt: %ui" CRLF, - s->login_attempt); - - b->last = ngx_cpymem(b->last, "Client-IP: ", sizeof("Client-IP: ") - 1); - b->last = ngx_copy(b->last, s->connection->addr_text.data, - s->connection->addr_text.len); - *b->last++ = CR; *b->last++ = LF; - - if (s->host.len) { - b->last = ngx_cpymem(b->last, "Client-Host: ", - sizeof("Client-Host: ") - 1); - b->last = ngx_copy(b->last, s->host.data, s->host.len); - *b->last++ = CR; *b->last++ = LF; - } - - if (c->proxy_protocol) { - b->last = ngx_cpymem(b->last, "Proxy-Protocol-Addr: ", - sizeof("Proxy-Protocol-Addr: ") - 1); - b->last = ngx_copy(b->last, c->proxy_protocol->src_addr.data, - c->proxy_protocol->src_addr.len); - *b->last++ = CR; *b->last++ = LF; - - b->last = ngx_sprintf(b->last, "Proxy-Protocol-Port: %d" CRLF, - c->proxy_protocol->src_port); - - b->last = ngx_cpymem(b->last, "Proxy-Protocol-Server-Addr: ", - sizeof("Proxy-Protocol-Server-Addr: ") - 1); - b->last = ngx_copy(b->last, c->proxy_protocol->dst_addr.data, - c->proxy_protocol->dst_addr.len); - *b->last++ = CR; *b->last++ = LF; - - b->last = ngx_sprintf(b->last, "Proxy-Protocol-Server-Port: %d" CRLF, - c->proxy_protocol->dst_port); - } - - if (s->auth_method == NGX_MAIL_AUTH_NONE) { - - /* HELO, MAIL FROM, and RCPT TO can't contain CRLF, no need to escape */ - - b->last = ngx_cpymem(b->last, "Auth-SMTP-Helo: ", - sizeof("Auth-SMTP-Helo: ") - 1); - b->last = ngx_copy(b->last, s->smtp_helo.data, s->smtp_helo.len); - *b->last++ = CR; *b->last++ = LF; - - b->last = ngx_cpymem(b->last, "Auth-SMTP-From: ", - sizeof("Auth-SMTP-From: ") - 1); - b->last = ngx_copy(b->last, s->smtp_from.data, s->smtp_from.len); - *b->last++ = CR; *b->last++ = LF; - - b->last = ngx_cpymem(b->last, "Auth-SMTP-To: ", - sizeof("Auth-SMTP-To: ") - 1); - b->last = ngx_copy(b->last, s->smtp_to.data, s->smtp_to.len); - *b->last++ = CR; *b->last++ = LF; - - } - -#if (NGX_MAIL_SSL) - - if (c->ssl) { - b->last = ngx_cpymem(b->last, "Auth-SSL: on" CRLF, - sizeof("Auth-SSL: on" CRLF) - 1); - - if (protocol.len) { - b->last = ngx_cpymem(b->last, "Auth-SSL-Protocol: ", - sizeof("Auth-SSL-Protocol: ") - 1); - b->last = ngx_copy(b->last, protocol.data, protocol.len); - *b->last++ = CR; *b->last++ = LF; - } - - if (cipher.len) { - b->last = ngx_cpymem(b->last, "Auth-SSL-Cipher: ", - sizeof("Auth-SSL-Cipher: ") - 1); - b->last = ngx_copy(b->last, cipher.data, cipher.len); - *b->last++ = CR; *b->last++ = LF; - } - - if (verify.len) { - b->last = ngx_cpymem(b->last, "Auth-SSL-Verify: ", - sizeof("Auth-SSL-Verify: ") - 1); - b->last = ngx_copy(b->last, verify.data, verify.len); - *b->last++ = CR; *b->last++ = LF; - } - - if (subject.len) { - b->last = ngx_cpymem(b->last, "Auth-SSL-Subject: ", - sizeof("Auth-SSL-Subject: ") - 1); - b->last = ngx_copy(b->last, subject.data, subject.len); - *b->last++ = CR; *b->last++ = LF; - } - - if (issuer.len) { - b->last = ngx_cpymem(b->last, "Auth-SSL-Issuer: ", - sizeof("Auth-SSL-Issuer: ") - 1); - b->last = ngx_copy(b->last, issuer.data, issuer.len); - *b->last++ = CR; *b->last++ = LF; - } - - if (serial.len) { - b->last = ngx_cpymem(b->last, "Auth-SSL-Serial: ", - sizeof("Auth-SSL-Serial: ") - 1); - b->last = ngx_copy(b->last, serial.data, serial.len); - *b->last++ = CR; *b->last++ = LF; - } - - if (fingerprint.len) { - b->last = ngx_cpymem(b->last, "Auth-SSL-Fingerprint: ", - sizeof("Auth-SSL-Fingerprint: ") - 1); - b->last = ngx_copy(b->last, fingerprint.data, fingerprint.len); - *b->last++ = CR; *b->last++ = LF; - } - - if (cert.len) { - b->last = ngx_cpymem(b->last, "Auth-SSL-Cert: ", - sizeof("Auth-SSL-Cert: ") - 1); - b->last = ngx_copy(b->last, cert.data, cert.len); - *b->last++ = CR; *b->last++ = LF; - } - } - -#endif - - if (ahcf->header.len) { - b->last = ngx_copy(b->last, ahcf->header.data, ahcf->header.len); - } - - /* add "\r\n" at the header end */ - *b->last++ = CR; *b->last++ = LF; - -#if (NGX_DEBUG_MAIL_PASSWD) - ngx_log_debug2(NGX_LOG_DEBUG_MAIL, s->connection->log, 0, - "mail auth http header:%N\"%*s\"", - (size_t) (b->last - b->pos), b->pos); -#endif - - return b; -} - - -static ngx_int_t -ngx_mail_auth_http_escape(ngx_pool_t *pool, ngx_str_t *text, ngx_str_t *escaped) -{ - u_char *p; - uintptr_t n; - - n = ngx_escape_uri(NULL, text->data, text->len, NGX_ESCAPE_MAIL_AUTH); - - if (n == 0) { - *escaped = *text; - return NGX_OK; - } - - escaped->len = text->len + n * 2; - - p = ngx_pnalloc(pool, escaped->len); - if (p == NULL) { - return NGX_ERROR; - } - - (void) ngx_escape_uri(p, text->data, text->len, NGX_ESCAPE_MAIL_AUTH); - - escaped->data = p; - - return NGX_OK; -} - - -static void * -ngx_mail_auth_http_create_conf(ngx_conf_t *cf) -{ - ngx_mail_auth_http_conf_t *ahcf; - - ahcf = ngx_pcalloc(cf->pool, sizeof(ngx_mail_auth_http_conf_t)); - if (ahcf == NULL) { - return NULL; - } - - ahcf->timeout = NGX_CONF_UNSET_MSEC; - ahcf->pass_client_cert = NGX_CONF_UNSET; - - ahcf->file = cf->conf_file->file.name.data; - ahcf->line = cf->conf_file->line; - - return ahcf; -} - - -static char * -ngx_mail_auth_http_merge_conf(ngx_conf_t *cf, void *parent, void *child) -{ - ngx_mail_auth_http_conf_t *prev = parent; - ngx_mail_auth_http_conf_t *conf = child; - - u_char *p; - size_t len; - ngx_uint_t i; - ngx_table_elt_t *header; - - if (conf->peer == NULL) { - conf->peer = prev->peer; - conf->host_header = prev->host_header; - conf->uri = prev->uri; - - if (conf->peer == NULL) { - ngx_log_error(NGX_LOG_EMERG, cf->log, 0, - "no \"auth_http\" is defined for server in %s:%ui", - conf->file, conf->line); - - return NGX_CONF_ERROR; - } - } - - ngx_conf_merge_msec_value(conf->timeout, prev->timeout, 60000); - - ngx_conf_merge_value(conf->pass_client_cert, prev->pass_client_cert, 0); - - if (conf->headers == NULL) { - conf->headers = prev->headers; - conf->header = prev->header; - } - - if (conf->headers && conf->header.len == 0) { - len = 0; - header = conf->headers->elts; - for (i = 0; i < conf->headers->nelts; i++) { - len += header[i].key.len + 2 + header[i].value.len + 2; - } - - p = ngx_pnalloc(cf->pool, len); - if (p == NULL) { - return NGX_CONF_ERROR; - } - - conf->header.len = len; - conf->header.data = p; - - for (i = 0; i < conf->headers->nelts; i++) { - p = ngx_cpymem(p, header[i].key.data, header[i].key.len); - *p++ = ':'; *p++ = ' '; - p = ngx_cpymem(p, header[i].value.data, header[i].value.len); - *p++ = CR; *p++ = LF; - } - } - - return NGX_CONF_OK; -} - - -static char * -ngx_mail_auth_http(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) -{ - ngx_mail_auth_http_conf_t *ahcf = conf; - - ngx_str_t *value; - ngx_url_t u; - - value = cf->args->elts; - - ngx_memzero(&u, sizeof(ngx_url_t)); - - u.url = value[1]; - u.default_port = 80; - u.uri_part = 1; - - if (ngx_strncmp(u.url.data, "http://", 7) == 0) { - u.url.len -= 7; - u.url.data += 7; - } - - if (ngx_parse_url(cf->pool, &u) != NGX_OK) { - if (u.err) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "%s in auth_http \"%V\"", u.err, &u.url); - } - - return NGX_CONF_ERROR; - } - - ahcf->peer = u.addrs; - - if (u.family != AF_UNIX) { - ahcf->host_header = u.host; - - } else { - ngx_str_set(&ahcf->host_header, "localhost"); - } - - ahcf->uri = u.uri; - - if (ahcf->uri.len == 0) { - ngx_str_set(&ahcf->uri, "/"); - } - - return NGX_CONF_OK; -} - - -static char * -ngx_mail_auth_http_header(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) -{ - ngx_mail_auth_http_conf_t *ahcf = conf; - - ngx_str_t *value; - ngx_table_elt_t *header; - - if (ahcf->headers == NULL) { - ahcf->headers = ngx_array_create(cf->pool, 1, sizeof(ngx_table_elt_t)); - if (ahcf->headers == NULL) { - return NGX_CONF_ERROR; - } - } - - header = ngx_array_push(ahcf->headers); - if (header == NULL) { - return NGX_CONF_ERROR; - } - - value = cf->args->elts; - - header->key = value[1]; - header->value = value[2]; - - return NGX_CONF_OK; -} diff --git a/src/deps/src/nginx-1.30.3/src/mail/ngx_mail_core_module.c b/src/deps/src/nginx-1.30.3/src/mail/ngx_mail_core_module.c deleted file mode 100644 index 5532ceeb1b..0000000000 --- a/src/deps/src/nginx-1.30.3/src/mail/ngx_mail_core_module.c +++ /dev/null @@ -1,728 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#include -#include -#include -#include - - -static void *ngx_mail_core_create_main_conf(ngx_conf_t *cf); -static void *ngx_mail_core_create_srv_conf(ngx_conf_t *cf); -static char *ngx_mail_core_merge_srv_conf(ngx_conf_t *cf, void *parent, - void *child); -static char *ngx_mail_core_server(ngx_conf_t *cf, ngx_command_t *cmd, - void *conf); -static char *ngx_mail_core_listen(ngx_conf_t *cf, ngx_command_t *cmd, - void *conf); -static char *ngx_mail_core_protocol(ngx_conf_t *cf, ngx_command_t *cmd, - void *conf); -static char *ngx_mail_core_error_log(ngx_conf_t *cf, ngx_command_t *cmd, - void *conf); -static char *ngx_mail_core_resolver(ngx_conf_t *cf, ngx_command_t *cmd, - void *conf); - - -static ngx_command_t ngx_mail_core_commands[] = { - - { ngx_string("server"), - NGX_MAIL_MAIN_CONF|NGX_CONF_BLOCK|NGX_CONF_NOARGS, - ngx_mail_core_server, - 0, - 0, - NULL }, - - { ngx_string("listen"), - NGX_MAIL_SRV_CONF|NGX_CONF_1MORE, - ngx_mail_core_listen, - NGX_MAIL_SRV_CONF_OFFSET, - 0, - NULL }, - - { ngx_string("protocol"), - NGX_MAIL_SRV_CONF|NGX_CONF_TAKE1, - ngx_mail_core_protocol, - NGX_MAIL_SRV_CONF_OFFSET, - 0, - NULL }, - - { ngx_string("timeout"), - NGX_MAIL_MAIN_CONF|NGX_MAIL_SRV_CONF|NGX_CONF_TAKE1, - ngx_conf_set_msec_slot, - NGX_MAIL_SRV_CONF_OFFSET, - offsetof(ngx_mail_core_srv_conf_t, timeout), - NULL }, - - { ngx_string("server_name"), - NGX_MAIL_MAIN_CONF|NGX_MAIL_SRV_CONF|NGX_CONF_TAKE1, - ngx_conf_set_str_slot, - NGX_MAIL_SRV_CONF_OFFSET, - offsetof(ngx_mail_core_srv_conf_t, server_name), - NULL }, - - { ngx_string("error_log"), - NGX_MAIL_MAIN_CONF|NGX_MAIL_SRV_CONF|NGX_CONF_1MORE, - ngx_mail_core_error_log, - NGX_MAIL_SRV_CONF_OFFSET, - 0, - NULL }, - - { ngx_string("resolver"), - NGX_MAIL_MAIN_CONF|NGX_MAIL_SRV_CONF|NGX_CONF_1MORE, - ngx_mail_core_resolver, - NGX_MAIL_SRV_CONF_OFFSET, - 0, - NULL }, - - { ngx_string("resolver_timeout"), - NGX_MAIL_MAIN_CONF|NGX_MAIL_SRV_CONF|NGX_CONF_TAKE1, - ngx_conf_set_msec_slot, - NGX_MAIL_SRV_CONF_OFFSET, - offsetof(ngx_mail_core_srv_conf_t, resolver_timeout), - NULL }, - - { ngx_string("max_errors"), - NGX_MAIL_MAIN_CONF|NGX_MAIL_SRV_CONF|NGX_CONF_TAKE1, - ngx_conf_set_num_slot, - NGX_MAIL_SRV_CONF_OFFSET, - offsetof(ngx_mail_core_srv_conf_t, max_errors), - NULL }, - - ngx_null_command -}; - - -static ngx_mail_module_t ngx_mail_core_module_ctx = { - NULL, /* protocol */ - - ngx_mail_core_create_main_conf, /* create main configuration */ - NULL, /* init main configuration */ - - ngx_mail_core_create_srv_conf, /* create server configuration */ - ngx_mail_core_merge_srv_conf /* merge server configuration */ -}; - - -ngx_module_t ngx_mail_core_module = { - NGX_MODULE_V1, - &ngx_mail_core_module_ctx, /* module context */ - ngx_mail_core_commands, /* module directives */ - NGX_MAIL_MODULE, /* module type */ - NULL, /* init master */ - NULL, /* init module */ - NULL, /* init process */ - NULL, /* init thread */ - NULL, /* exit thread */ - NULL, /* exit process */ - NULL, /* exit master */ - NGX_MODULE_V1_PADDING -}; - - -static void * -ngx_mail_core_create_main_conf(ngx_conf_t *cf) -{ - ngx_mail_core_main_conf_t *cmcf; - - cmcf = ngx_pcalloc(cf->pool, sizeof(ngx_mail_core_main_conf_t)); - if (cmcf == NULL) { - return NULL; - } - - if (ngx_array_init(&cmcf->servers, cf->pool, 4, - sizeof(ngx_mail_core_srv_conf_t *)) - != NGX_OK) - { - return NULL; - } - - if (ngx_array_init(&cmcf->listen, cf->pool, 4, sizeof(ngx_mail_listen_t)) - != NGX_OK) - { - return NULL; - } - - return cmcf; -} - - -static void * -ngx_mail_core_create_srv_conf(ngx_conf_t *cf) -{ - ngx_mail_core_srv_conf_t *cscf; - - cscf = ngx_pcalloc(cf->pool, sizeof(ngx_mail_core_srv_conf_t)); - if (cscf == NULL) { - return NULL; - } - - /* - * set by ngx_pcalloc(): - * - * cscf->protocol = NULL; - * cscf->error_log = NULL; - */ - - cscf->timeout = NGX_CONF_UNSET_MSEC; - cscf->resolver_timeout = NGX_CONF_UNSET_MSEC; - - cscf->max_errors = NGX_CONF_UNSET_UINT; - - cscf->resolver = NGX_CONF_UNSET_PTR; - - cscf->file_name = cf->conf_file->file.name.data; - cscf->line = cf->conf_file->line; - - return cscf; -} - - -static char * -ngx_mail_core_merge_srv_conf(ngx_conf_t *cf, void *parent, void *child) -{ - ngx_mail_core_srv_conf_t *prev = parent; - ngx_mail_core_srv_conf_t *conf = child; - - ngx_conf_merge_msec_value(conf->timeout, prev->timeout, 60000); - ngx_conf_merge_msec_value(conf->resolver_timeout, prev->resolver_timeout, - 30000); - - ngx_conf_merge_uint_value(conf->max_errors, prev->max_errors, 5); - - ngx_conf_merge_str_value(conf->server_name, prev->server_name, ""); - - if (conf->server_name.len == 0) { - conf->server_name = cf->cycle->hostname; - } - - if (conf->protocol == NULL) { - ngx_log_error(NGX_LOG_EMERG, cf->log, 0, - "unknown mail protocol for server in %s:%ui", - conf->file_name, conf->line); - return NGX_CONF_ERROR; - } - - if (conf->error_log == NULL) { - if (prev->error_log) { - conf->error_log = prev->error_log; - } else { - conf->error_log = &cf->cycle->new_log; - } - } - - ngx_conf_merge_ptr_value(conf->resolver, prev->resolver, NULL); - - return NGX_CONF_OK; -} - - -static char * -ngx_mail_core_server(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) -{ - char *rv; - void *mconf; - ngx_uint_t m; - ngx_conf_t pcf; - ngx_mail_module_t *module; - ngx_mail_conf_ctx_t *ctx, *mail_ctx; - ngx_mail_core_srv_conf_t *cscf, **cscfp; - ngx_mail_core_main_conf_t *cmcf; - - ctx = ngx_pcalloc(cf->pool, sizeof(ngx_mail_conf_ctx_t)); - if (ctx == NULL) { - return NGX_CONF_ERROR; - } - - mail_ctx = cf->ctx; - ctx->main_conf = mail_ctx->main_conf; - - /* the server{}'s srv_conf */ - - ctx->srv_conf = ngx_pcalloc(cf->pool, sizeof(void *) * ngx_mail_max_module); - if (ctx->srv_conf == NULL) { - return NGX_CONF_ERROR; - } - - for (m = 0; cf->cycle->modules[m]; m++) { - if (cf->cycle->modules[m]->type != NGX_MAIL_MODULE) { - continue; - } - - module = cf->cycle->modules[m]->ctx; - - if (module->create_srv_conf) { - mconf = module->create_srv_conf(cf); - if (mconf == NULL) { - return NGX_CONF_ERROR; - } - - ctx->srv_conf[cf->cycle->modules[m]->ctx_index] = mconf; - } - } - - /* the server configuration context */ - - cscf = ctx->srv_conf[ngx_mail_core_module.ctx_index]; - cscf->ctx = ctx; - - cmcf = ctx->main_conf[ngx_mail_core_module.ctx_index]; - - cscfp = ngx_array_push(&cmcf->servers); - if (cscfp == NULL) { - return NGX_CONF_ERROR; - } - - *cscfp = cscf; - - - /* parse inside server{} */ - - pcf = *cf; - cf->ctx = ctx; - cf->cmd_type = NGX_MAIL_SRV_CONF; - - rv = ngx_conf_parse(cf, NULL); - - *cf = pcf; - - if (rv == NGX_CONF_OK && !cscf->listen) { - ngx_log_error(NGX_LOG_EMERG, cf->log, 0, - "no \"listen\" is defined for server in %s:%ui", - cscf->file_name, cscf->line); - return NGX_CONF_ERROR; - } - - return rv; -} - - -static char * -ngx_mail_core_listen(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) -{ - ngx_mail_core_srv_conf_t *cscf = conf; - - ngx_str_t *value, size; - ngx_url_t u; - ngx_uint_t i, n, m; - ngx_mail_listen_t *ls, *als, *nls; - ngx_mail_module_t *module; - ngx_mail_core_main_conf_t *cmcf; - - cscf->listen = 1; - - value = cf->args->elts; - - ngx_memzero(&u, sizeof(ngx_url_t)); - - u.url = value[1]; - u.listen = 1; - - if (ngx_parse_url(cf->pool, &u) != NGX_OK) { - if (u.err) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "%s in \"%V\" of the \"listen\" directive", - u.err, &u.url); - } - - return NGX_CONF_ERROR; - } - - cmcf = ngx_mail_conf_get_module_main_conf(cf, ngx_mail_core_module); - - ls = ngx_array_push(&cmcf->listen); - if (ls == NULL) { - return NGX_CONF_ERROR; - } - - ngx_memzero(ls, sizeof(ngx_mail_listen_t)); - - ls->backlog = NGX_LISTEN_BACKLOG; - ls->rcvbuf = -1; - ls->sndbuf = -1; - ls->ctx = cf->ctx; - -#if (NGX_HAVE_INET6) - ls->ipv6only = 1; -#endif - - if (cscf->protocol == NULL) { - for (m = 0; cf->cycle->modules[m]; m++) { - if (cf->cycle->modules[m]->type != NGX_MAIL_MODULE) { - continue; - } - - module = cf->cycle->modules[m]->ctx; - - if (module->protocol == NULL) { - continue; - } - - for (i = 0; module->protocol->port[i]; i++) { - if (module->protocol->port[i] == u.port) { - cscf->protocol = module->protocol; - break; - } - } - } - } - - for (i = 2; i < cf->args->nelts; i++) { - - if (ngx_strcmp(value[i].data, "bind") == 0) { - ls->bind = 1; - continue; - } - - if (ngx_strncmp(value[i].data, "backlog=", 8) == 0) { - ls->backlog = ngx_atoi(value[i].data + 8, value[i].len - 8); - ls->bind = 1; - - if (ls->backlog == NGX_ERROR || ls->backlog == 0) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "invalid backlog \"%V\"", &value[i]); - return NGX_CONF_ERROR; - } - - continue; - } - - if (ngx_strncmp(value[i].data, "rcvbuf=", 7) == 0) { - size.len = value[i].len - 7; - size.data = value[i].data + 7; - - ls->rcvbuf = ngx_parse_size(&size); - ls->bind = 1; - - if (ls->rcvbuf == NGX_ERROR) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "invalid rcvbuf \"%V\"", &value[i]); - return NGX_CONF_ERROR; - } - - continue; - } - - if (ngx_strncmp(value[i].data, "sndbuf=", 7) == 0) { - size.len = value[i].len - 7; - size.data = value[i].data + 7; - - ls->sndbuf = ngx_parse_size(&size); - ls->bind = 1; - - if (ls->sndbuf == NGX_ERROR) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "invalid sndbuf \"%V\"", &value[i]); - return NGX_CONF_ERROR; - } - - continue; - } - - if (ngx_strncmp(value[i].data, "ipv6only=o", 10) == 0) { -#if (NGX_HAVE_INET6 && defined IPV6_V6ONLY) - if (ngx_strcmp(&value[i].data[10], "n") == 0) { - ls->ipv6only = 1; - - } else if (ngx_strcmp(&value[i].data[10], "ff") == 0) { - ls->ipv6only = 0; - - } else { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "invalid ipv6only flags \"%s\"", - &value[i].data[9]); - return NGX_CONF_ERROR; - } - - ls->bind = 1; - continue; -#else - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "ipv6only is not supported " - "on this platform"); - return NGX_CONF_ERROR; -#endif - } - - if (ngx_strcmp(value[i].data, "multipath") == 0) { -#ifdef IPPROTO_MPTCP - ls->protocol = IPPROTO_MPTCP; - ls->bind = 1; -#else - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "multipath is not supported " - "on this platform, ignored"); -#endif - continue; - } - - if (ngx_strcmp(value[i].data, "ssl") == 0) { -#if (NGX_MAIL_SSL) - ngx_mail_ssl_conf_t *sslcf; - - sslcf = ngx_mail_conf_get_module_srv_conf(cf, ngx_mail_ssl_module); - - sslcf->listen = 1; - sslcf->file = cf->conf_file->file.name.data; - sslcf->line = cf->conf_file->line; - - ls->ssl = 1; - - continue; -#else - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "the \"ssl\" parameter requires " - "ngx_mail_ssl_module"); - return NGX_CONF_ERROR; -#endif - } - - if (ngx_strncmp(value[i].data, "so_keepalive=", 13) == 0) { - - if (ngx_strcmp(&value[i].data[13], "on") == 0) { - ls->so_keepalive = 1; - - } else if (ngx_strcmp(&value[i].data[13], "off") == 0) { - ls->so_keepalive = 2; - - } else { - -#if (NGX_HAVE_KEEPALIVE_TUNABLE) - u_char *p, *end; - ngx_str_t s; - - end = value[i].data + value[i].len; - s.data = value[i].data + 13; - - p = ngx_strlchr(s.data, end, ':'); - if (p == NULL) { - p = end; - } - - if (p > s.data) { - s.len = p - s.data; - - ls->tcp_keepidle = ngx_parse_time(&s, 1); - if (ls->tcp_keepidle == (time_t) NGX_ERROR) { - goto invalid_so_keepalive; - } - } - - s.data = (p < end) ? (p + 1) : end; - - p = ngx_strlchr(s.data, end, ':'); - if (p == NULL) { - p = end; - } - - if (p > s.data) { - s.len = p - s.data; - - ls->tcp_keepintvl = ngx_parse_time(&s, 1); - if (ls->tcp_keepintvl == (time_t) NGX_ERROR) { - goto invalid_so_keepalive; - } - } - - s.data = (p < end) ? (p + 1) : end; - - if (s.data < end) { - s.len = end - s.data; - - ls->tcp_keepcnt = ngx_atoi(s.data, s.len); - if (ls->tcp_keepcnt == NGX_ERROR) { - goto invalid_so_keepalive; - } - } - - if (ls->tcp_keepidle == 0 && ls->tcp_keepintvl == 0 - && ls->tcp_keepcnt == 0) - { - goto invalid_so_keepalive; - } - - ls->so_keepalive = 1; - -#else - - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "the \"so_keepalive\" parameter accepts " - "only \"on\" or \"off\" on this platform"); - return NGX_CONF_ERROR; - -#endif - } - - ls->bind = 1; - - continue; - -#if (NGX_HAVE_KEEPALIVE_TUNABLE) - invalid_so_keepalive: - - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "invalid so_keepalive value: \"%s\"", - &value[i].data[13]); - return NGX_CONF_ERROR; -#endif - } - - if (ngx_strcmp(value[i].data, "proxy_protocol") == 0) { - ls->proxy_protocol = 1; - continue; - } - - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "invalid parameter \"%V\"", &value[i]); - return NGX_CONF_ERROR; - } - - for (n = 0; n < u.naddrs; n++) { - - for (i = 0; i < n; i++) { - if (ngx_cmp_sockaddr(u.addrs[n].sockaddr, u.addrs[n].socklen, - u.addrs[i].sockaddr, u.addrs[i].socklen, 1) - == NGX_OK) - { - goto next; - } - } - - if (n != 0) { - nls = ngx_array_push(&cmcf->listen); - if (nls == NULL) { - return NGX_CONF_ERROR; - } - - *nls = *ls; - - } else { - nls = ls; - } - - nls->sockaddr = u.addrs[n].sockaddr; - nls->socklen = u.addrs[n].socklen; - nls->addr_text = u.addrs[n].name; - nls->wildcard = ngx_inet_wildcard(nls->sockaddr); - - als = cmcf->listen.elts; - - for (i = 0; i < cmcf->listen.nelts - 1; i++) { - - if (ngx_cmp_sockaddr(als[i].sockaddr, als[i].socklen, - nls->sockaddr, nls->socklen, 1) - != NGX_OK) - { - continue; - } - - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "duplicate \"%V\" address and port pair", - &nls->addr_text); - return NGX_CONF_ERROR; - } - - next: - continue; - } - - return NGX_CONF_OK; -} - - -static char * -ngx_mail_core_protocol(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) -{ - ngx_mail_core_srv_conf_t *cscf = conf; - - ngx_str_t *value; - ngx_uint_t m; - ngx_mail_module_t *module; - - value = cf->args->elts; - - for (m = 0; cf->cycle->modules[m]; m++) { - if (cf->cycle->modules[m]->type != NGX_MAIL_MODULE) { - continue; - } - - module = cf->cycle->modules[m]->ctx; - - if (module->protocol - && ngx_strcmp(module->protocol->name.data, value[1].data) == 0) - { - cscf->protocol = module->protocol; - - return NGX_CONF_OK; - } - } - - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "unknown protocol \"%V\"", &value[1]); - return NGX_CONF_ERROR; -} - - -static char * -ngx_mail_core_error_log(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) -{ - ngx_mail_core_srv_conf_t *cscf = conf; - - return ngx_log_set_log(cf, &cscf->error_log); -} - - -static char * -ngx_mail_core_resolver(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) -{ - ngx_mail_core_srv_conf_t *cscf = conf; - - ngx_str_t *value; - - value = cf->args->elts; - - if (cscf->resolver != NGX_CONF_UNSET_PTR) { - return "is duplicate"; - } - - if (ngx_strcmp(value[1].data, "off") == 0) { - cscf->resolver = NULL; - return NGX_CONF_OK; - } - - cscf->resolver = ngx_resolver_create(cf, &value[1], cf->args->nelts - 1); - if (cscf->resolver == NULL) { - return NGX_CONF_ERROR; - } - - return NGX_CONF_OK; -} - - -char * -ngx_mail_capabilities(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) -{ - char *p = conf; - - ngx_str_t *c, *value; - ngx_uint_t i; - ngx_array_t *a; - - a = (ngx_array_t *) (p + cmd->offset); - - value = cf->args->elts; - - for (i = 1; i < cf->args->nelts; i++) { - c = ngx_array_push(a); - if (c == NULL) { - return NGX_CONF_ERROR; - } - - *c = value[i]; - } - - return NGX_CONF_OK; -} diff --git a/src/deps/src/nginx-1.30.3/src/mail/ngx_mail_handler.c b/src/deps/src/nginx-1.30.3/src/mail/ngx_mail_handler.c deleted file mode 100644 index a88e6c2873..0000000000 --- a/src/deps/src/nginx-1.30.3/src/mail/ngx_mail_handler.c +++ /dev/null @@ -1,1022 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#include -#include -#include -#include - - -static void ngx_mail_proxy_protocol_handler(ngx_event_t *rev); -static void ngx_mail_init_session_handler(ngx_event_t *rev); -static void ngx_mail_init_session(ngx_connection_t *c); - -#if (NGX_MAIL_SSL) -static void ngx_mail_ssl_init_connection(ngx_ssl_t *ssl, ngx_connection_t *c); -static void ngx_mail_ssl_handshake_handler(ngx_connection_t *c); -static ngx_int_t ngx_mail_verify_cert(ngx_mail_session_t *s, - ngx_connection_t *c); -#endif - - -void -ngx_mail_init_connection(ngx_connection_t *c) -{ - size_t len; - ngx_uint_t i; - ngx_event_t *rev; - ngx_mail_port_t *port; - struct sockaddr *sa; - struct sockaddr_in *sin; - ngx_mail_log_ctx_t *ctx; - ngx_mail_in_addr_t *addr; - ngx_mail_session_t *s; - ngx_mail_addr_conf_t *addr_conf; - ngx_mail_core_srv_conf_t *cscf; - u_char text[NGX_SOCKADDR_STRLEN]; -#if (NGX_HAVE_INET6) - struct sockaddr_in6 *sin6; - ngx_mail_in6_addr_t *addr6; -#endif - - - /* find the server configuration for the address:port */ - - port = c->listening->servers; - - if (port->naddrs > 1) { - - /* - * There are several addresses on this port and one of them - * is the "*:port" wildcard so getsockname() is needed to determine - * the server address. - * - * AcceptEx() already gave this address. - */ - - if (ngx_connection_local_sockaddr(c, NULL, 0) != NGX_OK) { - ngx_mail_close_connection(c); - return; - } - - sa = c->local_sockaddr; - - switch (sa->sa_family) { - -#if (NGX_HAVE_INET6) - case AF_INET6: - sin6 = (struct sockaddr_in6 *) sa; - - addr6 = port->addrs; - - /* the last address is "*" */ - - for (i = 0; i < port->naddrs - 1; i++) { - if (ngx_memcmp(&addr6[i].addr6, &sin6->sin6_addr, 16) == 0) { - break; - } - } - - addr_conf = &addr6[i].conf; - - break; -#endif - - default: /* AF_INET */ - sin = (struct sockaddr_in *) sa; - - addr = port->addrs; - - /* the last address is "*" */ - - for (i = 0; i < port->naddrs - 1; i++) { - if (addr[i].addr == sin->sin_addr.s_addr) { - break; - } - } - - addr_conf = &addr[i].conf; - - break; - } - - } else { - switch (c->local_sockaddr->sa_family) { - -#if (NGX_HAVE_INET6) - case AF_INET6: - addr6 = port->addrs; - addr_conf = &addr6[0].conf; - break; -#endif - - default: /* AF_INET */ - addr = port->addrs; - addr_conf = &addr[0].conf; - break; - } - } - - s = ngx_pcalloc(c->pool, sizeof(ngx_mail_session_t)); - if (s == NULL) { - ngx_mail_close_connection(c); - return; - } - - s->signature = NGX_MAIL_MODULE; - - s->main_conf = addr_conf->ctx->main_conf; - s->srv_conf = addr_conf->ctx->srv_conf; - -#if (NGX_MAIL_SSL) - s->ssl = addr_conf->ssl; -#endif - - s->addr_text = &addr_conf->addr_text; - - c->data = s; - s->connection = c; - - cscf = ngx_mail_get_module_srv_conf(s, ngx_mail_core_module); - - ngx_set_connection_log(c, cscf->error_log); - - len = ngx_sock_ntop(c->sockaddr, c->socklen, text, NGX_SOCKADDR_STRLEN, 1); - - ngx_log_error(NGX_LOG_INFO, c->log, 0, "*%uA client %*s connected to %V", - c->number, len, text, s->addr_text); - - ctx = ngx_palloc(c->pool, sizeof(ngx_mail_log_ctx_t)); - if (ctx == NULL) { - ngx_mail_close_connection(c); - return; - } - - ctx->client = &c->addr_text; - ctx->session = s; - - c->log->connection = c->number; - c->log->handler = ngx_mail_log_error; - c->log->data = ctx; - c->log->action = "sending client greeting line"; - - c->log_error = NGX_ERROR_INFO; - - rev = c->read; - rev->handler = ngx_mail_init_session_handler; - - if (addr_conf->proxy_protocol) { - c->log->action = "reading PROXY protocol"; - - rev->handler = ngx_mail_proxy_protocol_handler; - - if (!rev->ready) { - ngx_add_timer(rev, cscf->timeout); - - if (ngx_handle_read_event(rev, 0) != NGX_OK) { - ngx_mail_close_connection(c); - } - - return; - } - } - - if (ngx_use_accept_mutex) { - ngx_post_event(rev, &ngx_posted_events); - return; - } - - rev->handler(rev); -} - - -static void -ngx_mail_proxy_protocol_handler(ngx_event_t *rev) -{ - u_char *p, buf[NGX_PROXY_PROTOCOL_MAX_HEADER]; - size_t size; - ssize_t n; - ngx_err_t err; - ngx_connection_t *c; - ngx_mail_session_t *s; - ngx_mail_core_srv_conf_t *cscf; - - c = rev->data; - s = c->data; - - ngx_log_debug0(NGX_LOG_DEBUG_MAIL, c->log, 0, - "mail PROXY protocol handler"); - - if (rev->timedout) { - ngx_log_error(NGX_LOG_INFO, c->log, NGX_ETIMEDOUT, "client timed out"); - c->timedout = 1; - ngx_mail_close_connection(c); - return; - } - - n = recv(c->fd, (char *) buf, sizeof(buf), MSG_PEEK); - - err = ngx_socket_errno; - - ngx_log_debug1(NGX_LOG_DEBUG_MAIL, c->log, 0, "recv(): %z", n); - - if (n == -1) { - if (err == NGX_EAGAIN) { - rev->ready = 0; - - if (!rev->timer_set) { - cscf = ngx_mail_get_module_srv_conf(s, ngx_mail_core_module); - ngx_add_timer(rev, cscf->timeout); - } - - if (ngx_handle_read_event(rev, 0) != NGX_OK) { - ngx_mail_close_connection(c); - } - - return; - } - - ngx_connection_error(c, err, "recv() failed"); - - ngx_mail_close_connection(c); - return; - } - - p = ngx_proxy_protocol_read(c, buf, buf + n); - - if (p == NULL) { - ngx_mail_close_connection(c); - return; - } - - size = p - buf; - - if (c->recv(c, buf, size) != (ssize_t) size) { - ngx_mail_close_connection(c); - return; - } - - if (ngx_mail_realip_handler(s) != NGX_OK) { - ngx_mail_close_connection(c); - return; - } - - ngx_mail_init_session_handler(rev); -} - - -static void -ngx_mail_init_session_handler(ngx_event_t *rev) -{ - ngx_connection_t *c; - - c = rev->data; - -#if (NGX_MAIL_SSL) - { - ngx_mail_session_t *s; - ngx_mail_ssl_conf_t *sslcf; - - s = c->data; - - if (s->ssl) { - c->log->action = "SSL handshaking"; - - sslcf = ngx_mail_get_module_srv_conf(s, ngx_mail_ssl_module); - - ngx_mail_ssl_init_connection(&sslcf->ssl, c); - return; - } - - } -#endif - - ngx_mail_init_session(c); -} - - -#if (NGX_MAIL_SSL) - -void -ngx_mail_starttls_handler(ngx_event_t *rev) -{ - ngx_connection_t *c; - ngx_mail_session_t *s; - ngx_mail_ssl_conf_t *sslcf; - - c = rev->data; - s = c->data; - s->starttls = 1; - - c->log->action = "in starttls state"; - - sslcf = ngx_mail_get_module_srv_conf(s, ngx_mail_ssl_module); - - ngx_mail_ssl_init_connection(&sslcf->ssl, c); -} - - -static void -ngx_mail_ssl_init_connection(ngx_ssl_t *ssl, ngx_connection_t *c) -{ - ngx_mail_session_t *s; - ngx_mail_core_srv_conf_t *cscf; - - if (ngx_ssl_create_connection(ssl, c, 0) != NGX_OK) { - ngx_mail_close_connection(c); - return; - } - - if (ngx_ssl_handshake(c) == NGX_AGAIN) { - - s = c->data; - - if (!c->read->timer_set) { - cscf = ngx_mail_get_module_srv_conf(s, ngx_mail_core_module); - ngx_add_timer(c->read, cscf->timeout); - } - - c->ssl->handler = ngx_mail_ssl_handshake_handler; - - return; - } - - ngx_mail_ssl_handshake_handler(c); -} - - -static void -ngx_mail_ssl_handshake_handler(ngx_connection_t *c) -{ - ngx_mail_session_t *s; - ngx_mail_core_srv_conf_t *cscf; - - if (c->ssl->handshaked) { - - s = c->data; - - if (ngx_mail_verify_cert(s, c) != NGX_OK) { - return; - } - - if (s->starttls) { - cscf = ngx_mail_get_module_srv_conf(s, ngx_mail_core_module); - - c->read->handler = cscf->protocol->init_protocol; - c->write->handler = ngx_mail_send; - - cscf->protocol->init_protocol(c->read); - - return; - } - - c->read->ready = 0; - - ngx_mail_init_session(c); - return; - } - - ngx_mail_close_connection(c); -} - - -static ngx_int_t -ngx_mail_verify_cert(ngx_mail_session_t *s, ngx_connection_t *c) -{ - long rc; - X509 *cert; - ngx_mail_ssl_conf_t *sslcf; - ngx_mail_core_srv_conf_t *cscf; - - sslcf = ngx_mail_get_module_srv_conf(s, ngx_mail_ssl_module); - - if (!sslcf->verify) { - return NGX_OK; - } - - rc = SSL_get_verify_result(c->ssl->connection); - - if (rc != X509_V_OK - && (sslcf->verify != 3 || !ngx_ssl_verify_error_optional(rc))) - { - ngx_log_error(NGX_LOG_INFO, c->log, 0, - "client SSL certificate verify error: (%l:%s)", - rc, X509_verify_cert_error_string(rc)); - - ngx_ssl_remove_cached_session(c->ssl->session_ctx, - (SSL_get0_session(c->ssl->connection))); - - cscf = ngx_mail_get_module_srv_conf(s, ngx_mail_core_module); - - s->out = cscf->protocol->cert_error; - s->quit = 1; - - c->write->handler = ngx_mail_send; - - ngx_mail_send(s->connection->write); - return NGX_ERROR; - } - - if (sslcf->verify == 1) { - cert = SSL_get_peer_certificate(c->ssl->connection); - - if (cert == NULL) { - ngx_log_error(NGX_LOG_INFO, c->log, 0, - "client sent no required SSL certificate"); - - ngx_ssl_remove_cached_session(c->ssl->session_ctx, - (SSL_get0_session(c->ssl->connection))); - - cscf = ngx_mail_get_module_srv_conf(s, ngx_mail_core_module); - - s->out = cscf->protocol->no_cert; - s->quit = 1; - - c->write->handler = ngx_mail_send; - - ngx_mail_send(s->connection->write); - return NGX_ERROR; - } - - X509_free(cert); - } - - return NGX_OK; -} - -#endif - - -static void -ngx_mail_init_session(ngx_connection_t *c) -{ - ngx_mail_session_t *s; - ngx_mail_core_srv_conf_t *cscf; - - s = c->data; - - c->log->action = "sending client greeting line"; - - cscf = ngx_mail_get_module_srv_conf(s, ngx_mail_core_module); - - s->protocol = cscf->protocol->type; - - s->ctx = ngx_pcalloc(c->pool, sizeof(void *) * ngx_mail_max_module); - if (s->ctx == NULL) { - ngx_mail_session_internal_server_error(s); - return; - } - - c->write->handler = ngx_mail_send; - - cscf->protocol->init_session(s, c); -} - - -ngx_int_t -ngx_mail_salt(ngx_mail_session_t *s, ngx_connection_t *c, - ngx_mail_core_srv_conf_t *cscf) -{ - s->salt.data = ngx_pnalloc(c->pool, - sizeof(" <18446744073709551616.@>" CRLF) - 1 - + NGX_TIME_T_LEN - + cscf->server_name.len); - if (s->salt.data == NULL) { - return NGX_ERROR; - } - - s->salt.len = ngx_sprintf(s->salt.data, "<%ul.%T@%V>" CRLF, - ngx_random(), ngx_time(), &cscf->server_name) - - s->salt.data; - - return NGX_OK; -} - - -#if (NGX_MAIL_SSL) - -ngx_int_t -ngx_mail_starttls_only(ngx_mail_session_t *s, ngx_connection_t *c) -{ - ngx_mail_ssl_conf_t *sslcf; - - if (c->ssl) { - return 0; - } - - sslcf = ngx_mail_get_module_srv_conf(s, ngx_mail_ssl_module); - - if (sslcf->starttls == NGX_MAIL_STARTTLS_ONLY) { - return 1; - } - - return 0; -} - -#endif - - -ngx_int_t -ngx_mail_auth_plain(ngx_mail_session_t *s, ngx_connection_t *c, ngx_uint_t n) -{ - u_char *p, *pos, *last; - ngx_str_t *arg, plain; - - arg = s->args.elts; - -#if (NGX_DEBUG_MAIL_PASSWD) - ngx_log_debug1(NGX_LOG_DEBUG_MAIL, c->log, 0, - "mail auth plain: \"%V\"", &arg[n]); -#endif - - plain.data = ngx_pnalloc(c->pool, ngx_base64_decoded_length(arg[n].len)); - if (plain.data == NULL) { - return NGX_ERROR; - } - - if (ngx_decode_base64(&plain, &arg[n]) != NGX_OK) { - ngx_log_error(NGX_LOG_INFO, c->log, 0, - "client sent invalid base64 encoding in AUTH PLAIN command"); - return NGX_MAIL_PARSE_INVALID_COMMAND; - } - - p = plain.data; - last = p + plain.len; - - while (p < last && *p++) { /* void */ } - - if (p == last) { - ngx_log_error(NGX_LOG_INFO, c->log, 0, - "client sent invalid login in AUTH PLAIN command"); - return NGX_MAIL_PARSE_INVALID_COMMAND; - } - - pos = p; - - while (p < last && *p) { p++; } - - if (p == last) { - ngx_log_error(NGX_LOG_INFO, c->log, 0, - "client sent invalid password in AUTH PLAIN command"); - return NGX_MAIL_PARSE_INVALID_COMMAND; - } - - s->login.len = p++ - pos; - s->login.data = pos; - - s->passwd.len = last - p; - s->passwd.data = p; - -#if (NGX_DEBUG_MAIL_PASSWD) - ngx_log_debug2(NGX_LOG_DEBUG_MAIL, c->log, 0, - "mail auth plain: \"%V\" \"%V\"", &s->login, &s->passwd); -#endif - - return NGX_DONE; -} - - -ngx_int_t -ngx_mail_auth_login_username(ngx_mail_session_t *s, ngx_connection_t *c, - ngx_uint_t n) -{ - ngx_str_t *arg, login; - - arg = s->args.elts; - - ngx_log_debug1(NGX_LOG_DEBUG_MAIL, c->log, 0, - "mail auth login username: \"%V\"", &arg[n]); - - login.data = ngx_pnalloc(c->pool, ngx_base64_decoded_length(arg[n].len)); - if (login.data == NULL) { - return NGX_ERROR; - } - - if (ngx_decode_base64(&login, &arg[n]) != NGX_OK) { - ngx_log_error(NGX_LOG_INFO, c->log, 0, - "client sent invalid base64 encoding in AUTH LOGIN command"); - return NGX_MAIL_PARSE_INVALID_COMMAND; - } - - s->login = login; - - ngx_log_debug1(NGX_LOG_DEBUG_MAIL, c->log, 0, - "mail auth login username: \"%V\"", &s->login); - - return NGX_OK; -} - - -ngx_int_t -ngx_mail_auth_login_password(ngx_mail_session_t *s, ngx_connection_t *c) -{ - ngx_str_t *arg, passwd; - - arg = s->args.elts; - -#if (NGX_DEBUG_MAIL_PASSWD) - ngx_log_debug1(NGX_LOG_DEBUG_MAIL, c->log, 0, - "mail auth login password: \"%V\"", &arg[0]); -#endif - - passwd.data = ngx_pnalloc(c->pool, ngx_base64_decoded_length(arg[0].len)); - if (passwd.data == NULL) { - return NGX_ERROR; - } - - if (ngx_decode_base64(&passwd, &arg[0]) != NGX_OK) { - ngx_log_error(NGX_LOG_INFO, c->log, 0, - "client sent invalid base64 encoding in AUTH LOGIN command"); - return NGX_MAIL_PARSE_INVALID_COMMAND; - } - - s->passwd = passwd; - -#if (NGX_DEBUG_MAIL_PASSWD) - ngx_log_debug1(NGX_LOG_DEBUG_MAIL, c->log, 0, - "mail auth login password: \"%V\"", &s->passwd); -#endif - - return NGX_DONE; -} - - -ngx_int_t -ngx_mail_auth_cram_md5_salt(ngx_mail_session_t *s, ngx_connection_t *c, - char *prefix, size_t len) -{ - u_char *p; - ngx_str_t salt; - ngx_uint_t n; - - p = ngx_pnalloc(c->pool, len + ngx_base64_encoded_length(s->salt.len) + 2); - if (p == NULL) { - return NGX_ERROR; - } - - salt.data = ngx_cpymem(p, prefix, len); - s->salt.len -= 2; - - ngx_encode_base64(&salt, &s->salt); - - s->salt.len += 2; - n = len + salt.len; - p[n++] = CR; p[n++] = LF; - - s->out.len = n; - s->out.data = p; - - return NGX_OK; -} - - -ngx_int_t -ngx_mail_auth_cram_md5(ngx_mail_session_t *s, ngx_connection_t *c) -{ - u_char *p, *last; - ngx_str_t *arg, login; - - arg = s->args.elts; - - ngx_log_debug1(NGX_LOG_DEBUG_MAIL, c->log, 0, - "mail auth cram-md5: \"%V\"", &arg[0]); - - login.data = ngx_pnalloc(c->pool, ngx_base64_decoded_length(arg[0].len)); - if (login.data == NULL) { - return NGX_ERROR; - } - - if (ngx_decode_base64(&login, &arg[0]) != NGX_OK) { - ngx_log_error(NGX_LOG_INFO, c->log, 0, - "client sent invalid base64 encoding in AUTH CRAM-MD5 command"); - return NGX_MAIL_PARSE_INVALID_COMMAND; - } - - s->login = login; - - p = s->login.data; - last = p + s->login.len; - - while (p < last) { - if (*p++ == ' ') { - s->login.len = p - s->login.data - 1; - s->passwd.len = last - p; - s->passwd.data = p; - break; - } - } - - if (s->passwd.len != 32) { - ngx_log_error(NGX_LOG_INFO, c->log, 0, - "client sent invalid CRAM-MD5 hash in AUTH CRAM-MD5 command"); - return NGX_MAIL_PARSE_INVALID_COMMAND; - } - - ngx_log_debug2(NGX_LOG_DEBUG_MAIL, c->log, 0, - "mail auth cram-md5: \"%V\" \"%V\"", &s->login, &s->passwd); - - s->auth_method = NGX_MAIL_AUTH_CRAM_MD5; - - return NGX_DONE; -} - - -ngx_int_t -ngx_mail_auth_external(ngx_mail_session_t *s, ngx_connection_t *c, - ngx_uint_t n) -{ - ngx_str_t *arg, external; - - arg = s->args.elts; - - ngx_log_debug1(NGX_LOG_DEBUG_MAIL, c->log, 0, - "mail auth external: \"%V\"", &arg[n]); - - external.data = ngx_pnalloc(c->pool, ngx_base64_decoded_length(arg[n].len)); - if (external.data == NULL) { - return NGX_ERROR; - } - - if (ngx_decode_base64(&external, &arg[n]) != NGX_OK) { - ngx_log_error(NGX_LOG_INFO, c->log, 0, - "client sent invalid base64 encoding in AUTH EXTERNAL command"); - return NGX_MAIL_PARSE_INVALID_COMMAND; - } - - s->login.len = external.len; - s->login.data = external.data; - - ngx_log_debug1(NGX_LOG_DEBUG_MAIL, c->log, 0, - "mail auth external: \"%V\"", &s->login); - - s->auth_method = NGX_MAIL_AUTH_EXTERNAL; - - return NGX_DONE; -} - - -void -ngx_mail_send(ngx_event_t *wev) -{ - ngx_int_t n; - ngx_connection_t *c; - ngx_mail_session_t *s; - ngx_mail_core_srv_conf_t *cscf; - - c = wev->data; - s = c->data; - - if (wev->timedout) { - ngx_log_error(NGX_LOG_INFO, c->log, NGX_ETIMEDOUT, "client timed out"); - c->timedout = 1; - ngx_mail_close_connection(c); - return; - } - - if (s->out.len == 0) { - if (ngx_handle_write_event(c->write, 0) != NGX_OK) { - ngx_mail_close_connection(c); - } - - return; - } - - n = c->send(c, s->out.data, s->out.len); - - if (n > 0) { - s->out.data += n; - s->out.len -= n; - - if (s->out.len != 0) { - goto again; - } - - if (wev->timer_set) { - ngx_del_timer(wev); - } - - if (s->quit) { - ngx_mail_close_connection(c); - return; - } - - if (s->blocked) { - c->read->handler(c->read); - } - - return; - } - - if (n == NGX_ERROR) { - ngx_mail_close_connection(c); - return; - } - - /* n == NGX_AGAIN */ - -again: - - cscf = ngx_mail_get_module_srv_conf(s, ngx_mail_core_module); - - ngx_add_timer(c->write, cscf->timeout); - - if (ngx_handle_write_event(c->write, 0) != NGX_OK) { - ngx_mail_close_connection(c); - return; - } -} - - -ngx_int_t -ngx_mail_read_command(ngx_mail_session_t *s, ngx_connection_t *c) -{ - ssize_t n; - ngx_int_t rc; - ngx_str_t l; - ngx_mail_core_srv_conf_t *cscf; - - if (s->buffer->last < s->buffer->end) { - - n = c->recv(c, s->buffer->last, s->buffer->end - s->buffer->last); - - if (n == NGX_ERROR || n == 0) { - ngx_mail_close_connection(c); - return NGX_ERROR; - } - - if (n > 0) { - s->buffer->last += n; - } - - if (n == NGX_AGAIN) { - if (s->buffer->pos == s->buffer->last) { - return NGX_AGAIN; - } - } - } - - cscf = ngx_mail_get_module_srv_conf(s, ngx_mail_core_module); - - rc = cscf->protocol->parse_command(s); - - if (rc == NGX_AGAIN) { - - if (s->buffer->last < s->buffer->end) { - return rc; - } - - l.len = s->buffer->last - s->buffer->start; - l.data = s->buffer->start; - - ngx_log_error(NGX_LOG_INFO, c->log, 0, - "client sent too long command \"%V\"", &l); - - s->quit = 1; - - return NGX_MAIL_PARSE_INVALID_COMMAND; - } - - if (rc == NGX_MAIL_PARSE_INVALID_COMMAND) { - - s->errors++; - - if (s->errors >= cscf->max_errors) { - ngx_log_error(NGX_LOG_INFO, c->log, 0, - "client sent too many invalid commands"); - s->quit = 1; - } - - return rc; - } - - if (rc == NGX_IMAP_NEXT) { - return rc; - } - - if (rc == NGX_ERROR) { - ngx_mail_close_connection(c); - return NGX_ERROR; - } - - return NGX_OK; -} - - -void -ngx_mail_auth(ngx_mail_session_t *s, ngx_connection_t *c) -{ - s->args.nelts = 0; - - if (s->buffer->pos == s->buffer->last) { - s->buffer->pos = s->buffer->start; - s->buffer->last = s->buffer->start; - } - - s->state = 0; - - if (c->read->timer_set) { - ngx_del_timer(c->read); - } - - s->login_attempt++; - - ngx_mail_auth_http_init(s); -} - - -void -ngx_mail_session_internal_server_error(ngx_mail_session_t *s) -{ - ngx_mail_core_srv_conf_t *cscf; - - cscf = ngx_mail_get_module_srv_conf(s, ngx_mail_core_module); - - s->out = cscf->protocol->internal_server_error; - s->quit = 1; - - ngx_mail_send(s->connection->write); -} - - -void -ngx_mail_close_connection(ngx_connection_t *c) -{ - ngx_pool_t *pool; - - ngx_log_debug1(NGX_LOG_DEBUG_MAIL, c->log, 0, - "close mail connection: %d", c->fd); - -#if (NGX_MAIL_SSL) - - if (c->ssl) { - if (ngx_ssl_shutdown(c) == NGX_AGAIN) { - c->ssl->handler = ngx_mail_close_connection; - return; - } - } - -#endif - -#if (NGX_STAT_STUB) - (void) ngx_atomic_fetch_add(ngx_stat_active, -1); -#endif - - c->destroyed = 1; - - pool = c->pool; - - ngx_close_connection(c); - - ngx_destroy_pool(pool); -} - - -u_char * -ngx_mail_log_error(ngx_log_t *log, u_char *buf, size_t len) -{ - u_char *p; - ngx_mail_session_t *s; - ngx_mail_log_ctx_t *ctx; - - if (log->action) { - p = ngx_snprintf(buf, len, " while %s", log->action); - len -= p - buf; - buf = p; - } - - ctx = log->data; - - p = ngx_snprintf(buf, len, ", client: %V", ctx->client); - len -= p - buf; - buf = p; - - s = ctx->session; - - if (s == NULL) { - return p; - } - - p = ngx_snprintf(buf, len, "%s, server: %V", - s->starttls ? " using starttls" : "", - s->addr_text); - len -= p - buf; - buf = p; - - if (s->login.len) { - p = ngx_snprintf(buf, len, ", login: \"%V\"", &s->login); - len -= p - buf; - buf = p; - } - - if (s->proxy == NULL) { - return p; - } - - p = ngx_snprintf(buf, len, ", upstream: %V", s->proxy->upstream.name); - - return p; -} diff --git a/src/deps/src/nginx-1.30.3/src/mail/ngx_mail_imap_handler.c b/src/deps/src/nginx-1.30.3/src/mail/ngx_mail_imap_handler.c deleted file mode 100644 index 291e87a4de..0000000000 --- a/src/deps/src/nginx-1.30.3/src/mail/ngx_mail_imap_handler.c +++ /dev/null @@ -1,477 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#include -#include -#include -#include -#include - - -static ngx_int_t ngx_mail_imap_login(ngx_mail_session_t *s, - ngx_connection_t *c); -static ngx_int_t ngx_mail_imap_authenticate(ngx_mail_session_t *s, - ngx_connection_t *c); -static ngx_int_t ngx_mail_imap_capability(ngx_mail_session_t *s, - ngx_connection_t *c); -static ngx_int_t ngx_mail_imap_starttls(ngx_mail_session_t *s, - ngx_connection_t *c); - - -static u_char imap_greeting[] = "* OK IMAP4 ready" CRLF; -static u_char imap_star[] = "* "; -static u_char imap_ok[] = "OK completed" CRLF; -static u_char imap_next[] = "+ OK" CRLF; -static u_char imap_plain_next[] = "+ " CRLF; -static u_char imap_username[] = "+ VXNlcm5hbWU6" CRLF; -static u_char imap_password[] = "+ UGFzc3dvcmQ6" CRLF; -static u_char imap_bye[] = "* BYE" CRLF; -static u_char imap_invalid_command[] = "BAD invalid command" CRLF; - - -void -ngx_mail_imap_init_session(ngx_mail_session_t *s, ngx_connection_t *c) -{ - ngx_mail_core_srv_conf_t *cscf; - - cscf = ngx_mail_get_module_srv_conf(s, ngx_mail_core_module); - - ngx_str_set(&s->out, imap_greeting); - - c->read->handler = ngx_mail_imap_init_protocol; - - ngx_add_timer(c->read, cscf->timeout); - - if (ngx_handle_read_event(c->read, 0) != NGX_OK) { - ngx_mail_close_connection(c); - } - - ngx_mail_send(c->write); -} - - -void -ngx_mail_imap_init_protocol(ngx_event_t *rev) -{ - ngx_connection_t *c; - ngx_mail_session_t *s; - ngx_mail_imap_srv_conf_t *iscf; - - c = rev->data; - - c->log->action = "in auth state"; - - if (rev->timedout) { - ngx_log_error(NGX_LOG_INFO, c->log, NGX_ETIMEDOUT, "client timed out"); - c->timedout = 1; - ngx_mail_close_connection(c); - return; - } - - s = c->data; - - if (s->buffer == NULL) { - if (ngx_array_init(&s->args, c->pool, 2, sizeof(ngx_str_t)) - == NGX_ERROR) - { - ngx_mail_session_internal_server_error(s); - return; - } - - iscf = ngx_mail_get_module_srv_conf(s, ngx_mail_imap_module); - - s->buffer = ngx_create_temp_buf(c->pool, iscf->client_buffer_size); - if (s->buffer == NULL) { - ngx_mail_session_internal_server_error(s); - return; - } - } - - s->mail_state = ngx_imap_start; - c->read->handler = ngx_mail_imap_auth_state; - - ngx_mail_imap_auth_state(rev); -} - - -void -ngx_mail_imap_auth_state(ngx_event_t *rev) -{ - u_char *p; - ngx_int_t rc; - ngx_uint_t tag; - ngx_connection_t *c; - ngx_mail_session_t *s; - - c = rev->data; - s = c->data; - - ngx_log_debug0(NGX_LOG_DEBUG_MAIL, c->log, 0, "imap auth state"); - - if (rev->timedout) { - ngx_log_error(NGX_LOG_INFO, c->log, NGX_ETIMEDOUT, "client timed out"); - c->timedout = 1; - ngx_mail_close_connection(c); - return; - } - - if (s->out.len) { - ngx_log_debug0(NGX_LOG_DEBUG_MAIL, c->log, 0, "imap send handler busy"); - s->blocked = 1; - - if (ngx_handle_read_event(c->read, 0) != NGX_OK) { - ngx_mail_close_connection(c); - return; - } - - return; - } - - s->blocked = 0; - - rc = ngx_mail_read_command(s, c); - - if (rc == NGX_AGAIN) { - if (ngx_handle_read_event(c->read, 0) != NGX_OK) { - ngx_mail_session_internal_server_error(s); - return; - } - - return; - } - - if (rc == NGX_ERROR) { - return; - } - - tag = 1; - s->text.len = 0; - ngx_str_set(&s->out, imap_ok); - - if (rc == NGX_OK) { - - ngx_log_debug1(NGX_LOG_DEBUG_MAIL, c->log, 0, "imap auth command: %i", - s->command); - - switch (s->mail_state) { - - case ngx_imap_start: - - switch (s->command) { - - case NGX_IMAP_LOGIN: - rc = ngx_mail_imap_login(s, c); - break; - - case NGX_IMAP_AUTHENTICATE: - rc = ngx_mail_imap_authenticate(s, c); - tag = (rc != NGX_OK); - break; - - case NGX_IMAP_CAPABILITY: - rc = ngx_mail_imap_capability(s, c); - break; - - case NGX_IMAP_LOGOUT: - s->quit = 1; - ngx_str_set(&s->text, imap_bye); - break; - - case NGX_IMAP_NOOP: - break; - - case NGX_IMAP_STARTTLS: - rc = ngx_mail_imap_starttls(s, c); - break; - - default: - rc = NGX_MAIL_PARSE_INVALID_COMMAND; - break; - } - - break; - - case ngx_imap_auth_login_username: - rc = ngx_mail_auth_login_username(s, c, 0); - - tag = 0; - ngx_str_set(&s->out, imap_password); - s->mail_state = ngx_imap_auth_login_password; - - break; - - case ngx_imap_auth_login_password: - rc = ngx_mail_auth_login_password(s, c); - break; - - case ngx_imap_auth_plain: - rc = ngx_mail_auth_plain(s, c, 0); - break; - - case ngx_imap_auth_cram_md5: - rc = ngx_mail_auth_cram_md5(s, c); - break; - - case ngx_imap_auth_external: - rc = ngx_mail_auth_external(s, c, 0); - break; - } - - } else if (rc == NGX_IMAP_NEXT) { - tag = 0; - ngx_str_set(&s->out, imap_next); - } - - if (s->buffer->pos < s->buffer->last) { - s->blocked = 1; - } - - switch (rc) { - - case NGX_DONE: - ngx_mail_auth(s, c); - return; - - case NGX_ERROR: - ngx_mail_session_internal_server_error(s); - return; - - case NGX_MAIL_PARSE_INVALID_COMMAND: - s->state = 0; - ngx_str_set(&s->out, imap_invalid_command); - s->mail_state = ngx_imap_start; - break; - } - - if (tag) { - if (s->tag.len == 0) { - ngx_str_set(&s->tag, imap_star); - } - - if (s->tagged_line.len < s->tag.len + s->text.len + s->out.len) { - s->tagged_line.len = s->tag.len + s->text.len + s->out.len; - s->tagged_line.data = ngx_pnalloc(c->pool, s->tagged_line.len); - if (s->tagged_line.data == NULL) { - ngx_mail_close_connection(c); - return; - } - } - - p = s->tagged_line.data; - - if (s->text.len) { - p = ngx_cpymem(p, s->text.data, s->text.len); - } - - p = ngx_cpymem(p, s->tag.data, s->tag.len); - ngx_memcpy(p, s->out.data, s->out.len); - - s->out.len = s->text.len + s->tag.len + s->out.len; - s->out.data = s->tagged_line.data; - } - - if (rc != NGX_IMAP_NEXT) { - s->args.nelts = 0; - - if (s->state) { - /* preserve tag */ - s->arg_start = s->buffer->pos; - - } else { - if (s->buffer->pos == s->buffer->last) { - s->buffer->pos = s->buffer->start; - s->buffer->last = s->buffer->start; - } - - s->tag.len = 0; - } - } - - if (ngx_handle_read_event(c->read, 0) != NGX_OK) { - ngx_mail_session_internal_server_error(s); - return; - } - - ngx_mail_send(c->write); -} - - -static ngx_int_t -ngx_mail_imap_login(ngx_mail_session_t *s, ngx_connection_t *c) -{ - ngx_str_t *arg; - -#if (NGX_MAIL_SSL) - if (ngx_mail_starttls_only(s, c)) { - return NGX_MAIL_PARSE_INVALID_COMMAND; - } -#endif - - arg = s->args.elts; - - if (s->args.nelts != 2 || arg[0].len == 0) { - return NGX_MAIL_PARSE_INVALID_COMMAND; - } - - s->login.len = arg[0].len; - s->login.data = ngx_pnalloc(c->pool, s->login.len); - if (s->login.data == NULL) { - return NGX_ERROR; - } - - ngx_memcpy(s->login.data, arg[0].data, s->login.len); - - s->passwd.len = arg[1].len; - s->passwd.data = ngx_pnalloc(c->pool, s->passwd.len); - if (s->passwd.data == NULL) { - return NGX_ERROR; - } - - ngx_memcpy(s->passwd.data, arg[1].data, s->passwd.len); - -#if (NGX_DEBUG_MAIL_PASSWD) - ngx_log_debug2(NGX_LOG_DEBUG_MAIL, c->log, 0, - "imap login:\"%V\" passwd:\"%V\"", - &s->login, &s->passwd); -#else - ngx_log_debug1(NGX_LOG_DEBUG_MAIL, c->log, 0, - "imap login:\"%V\"", &s->login); -#endif - - return NGX_DONE; -} - - -static ngx_int_t -ngx_mail_imap_authenticate(ngx_mail_session_t *s, ngx_connection_t *c) -{ - ngx_int_t rc; - ngx_mail_core_srv_conf_t *cscf; - ngx_mail_imap_srv_conf_t *iscf; - -#if (NGX_MAIL_SSL) - if (ngx_mail_starttls_only(s, c)) { - return NGX_MAIL_PARSE_INVALID_COMMAND; - } -#endif - - iscf = ngx_mail_get_module_srv_conf(s, ngx_mail_imap_module); - - rc = ngx_mail_auth_parse(s, c); - - switch (rc) { - - case NGX_MAIL_AUTH_LOGIN: - - ngx_str_set(&s->out, imap_username); - s->mail_state = ngx_imap_auth_login_username; - - return NGX_OK; - - case NGX_MAIL_AUTH_LOGIN_USERNAME: - - ngx_str_set(&s->out, imap_password); - s->mail_state = ngx_imap_auth_login_password; - - return ngx_mail_auth_login_username(s, c, 1); - - case NGX_MAIL_AUTH_PLAIN: - - ngx_str_set(&s->out, imap_plain_next); - s->mail_state = ngx_imap_auth_plain; - - return NGX_OK; - - case NGX_MAIL_AUTH_CRAM_MD5: - - if (!(iscf->auth_methods & NGX_MAIL_AUTH_CRAM_MD5_ENABLED)) { - return NGX_MAIL_PARSE_INVALID_COMMAND; - } - - if (s->salt.data == NULL) { - cscf = ngx_mail_get_module_srv_conf(s, ngx_mail_core_module); - - if (ngx_mail_salt(s, c, cscf) != NGX_OK) { - return NGX_ERROR; - } - } - - if (ngx_mail_auth_cram_md5_salt(s, c, "+ ", 2) == NGX_OK) { - s->mail_state = ngx_imap_auth_cram_md5; - return NGX_OK; - } - - return NGX_ERROR; - - case NGX_MAIL_AUTH_EXTERNAL: - - if (!(iscf->auth_methods & NGX_MAIL_AUTH_EXTERNAL_ENABLED)) { - return NGX_MAIL_PARSE_INVALID_COMMAND; - } - - ngx_str_set(&s->out, imap_username); - s->mail_state = ngx_imap_auth_external; - - return NGX_OK; - } - - return rc; -} - - -static ngx_int_t -ngx_mail_imap_capability(ngx_mail_session_t *s, ngx_connection_t *c) -{ - ngx_mail_imap_srv_conf_t *iscf; - - iscf = ngx_mail_get_module_srv_conf(s, ngx_mail_imap_module); - -#if (NGX_MAIL_SSL) - - if (c->ssl == NULL) { - ngx_mail_ssl_conf_t *sslcf; - - sslcf = ngx_mail_get_module_srv_conf(s, ngx_mail_ssl_module); - - if (sslcf->starttls == NGX_MAIL_STARTTLS_ON) { - s->text = iscf->starttls_capability; - return NGX_OK; - } - - if (sslcf->starttls == NGX_MAIL_STARTTLS_ONLY) { - s->text = iscf->starttls_only_capability; - return NGX_OK; - } - } -#endif - - s->text = iscf->capability; - - return NGX_OK; -} - - -static ngx_int_t -ngx_mail_imap_starttls(ngx_mail_session_t *s, ngx_connection_t *c) -{ -#if (NGX_MAIL_SSL) - ngx_mail_ssl_conf_t *sslcf; - - if (c->ssl == NULL) { - sslcf = ngx_mail_get_module_srv_conf(s, ngx_mail_ssl_module); - if (sslcf->starttls) { - s->buffer->pos = s->buffer->start; - s->buffer->last = s->buffer->start; - c->read->handler = ngx_mail_starttls_handler; - return NGX_OK; - } - } - -#endif - - return NGX_MAIL_PARSE_INVALID_COMMAND; -} diff --git a/src/deps/src/nginx-1.30.3/src/mail/ngx_mail_imap_module.c b/src/deps/src/nginx-1.30.3/src/mail/ngx_mail_imap_module.c deleted file mode 100644 index 02c684cd4b..0000000000 --- a/src/deps/src/nginx-1.30.3/src/mail/ngx_mail_imap_module.c +++ /dev/null @@ -1,258 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#include -#include -#include -#include -#include - - -static void *ngx_mail_imap_create_srv_conf(ngx_conf_t *cf); -static char *ngx_mail_imap_merge_srv_conf(ngx_conf_t *cf, void *parent, - void *child); - - -static ngx_str_t ngx_mail_imap_default_capabilities[] = { - ngx_string("IMAP4"), - ngx_string("IMAP4rev1"), - ngx_string("UIDPLUS"), - ngx_null_string -}; - - -static ngx_conf_bitmask_t ngx_mail_imap_auth_methods[] = { - { ngx_string("plain"), NGX_MAIL_AUTH_PLAIN_ENABLED }, - { ngx_string("login"), NGX_MAIL_AUTH_LOGIN_ENABLED }, - { ngx_string("cram-md5"), NGX_MAIL_AUTH_CRAM_MD5_ENABLED }, - { ngx_string("external"), NGX_MAIL_AUTH_EXTERNAL_ENABLED }, - { ngx_null_string, 0 } -}; - - -static ngx_str_t ngx_mail_imap_auth_methods_names[] = { - ngx_string("AUTH=PLAIN"), - ngx_string("AUTH=LOGIN"), - ngx_null_string, /* APOP */ - ngx_string("AUTH=CRAM-MD5"), - ngx_string("AUTH=EXTERNAL"), - ngx_null_string /* NONE */ -}; - - -static ngx_mail_protocol_t ngx_mail_imap_protocol = { - ngx_string("imap"), - ngx_string("\x04imap"), - { 143, 993, 0, 0 }, - NGX_MAIL_IMAP_PROTOCOL, - - ngx_mail_imap_init_session, - ngx_mail_imap_init_protocol, - ngx_mail_imap_parse_command, - ngx_mail_imap_auth_state, - - ngx_string("* BAD internal server error" CRLF), - ngx_string("* BYE SSL certificate error" CRLF), - ngx_string("* BYE No required SSL certificate" CRLF) -}; - - -static ngx_command_t ngx_mail_imap_commands[] = { - - { ngx_string("imap_client_buffer"), - NGX_MAIL_MAIN_CONF|NGX_MAIL_SRV_CONF|NGX_CONF_TAKE1, - ngx_conf_set_size_slot, - NGX_MAIL_SRV_CONF_OFFSET, - offsetof(ngx_mail_imap_srv_conf_t, client_buffer_size), - NULL }, - - { ngx_string("imap_capabilities"), - NGX_MAIL_MAIN_CONF|NGX_MAIL_SRV_CONF|NGX_CONF_1MORE, - ngx_mail_capabilities, - NGX_MAIL_SRV_CONF_OFFSET, - offsetof(ngx_mail_imap_srv_conf_t, capabilities), - NULL }, - - { ngx_string("imap_auth"), - NGX_MAIL_MAIN_CONF|NGX_MAIL_SRV_CONF|NGX_CONF_1MORE, - ngx_conf_set_bitmask_slot, - NGX_MAIL_SRV_CONF_OFFSET, - offsetof(ngx_mail_imap_srv_conf_t, auth_methods), - &ngx_mail_imap_auth_methods }, - - ngx_null_command -}; - - -static ngx_mail_module_t ngx_mail_imap_module_ctx = { - &ngx_mail_imap_protocol, /* protocol */ - - NULL, /* create main configuration */ - NULL, /* init main configuration */ - - ngx_mail_imap_create_srv_conf, /* create server configuration */ - ngx_mail_imap_merge_srv_conf /* merge server configuration */ -}; - - -ngx_module_t ngx_mail_imap_module = { - NGX_MODULE_V1, - &ngx_mail_imap_module_ctx, /* module context */ - ngx_mail_imap_commands, /* module directives */ - NGX_MAIL_MODULE, /* module type */ - NULL, /* init master */ - NULL, /* init module */ - NULL, /* init process */ - NULL, /* init thread */ - NULL, /* exit thread */ - NULL, /* exit process */ - NULL, /* exit master */ - NGX_MODULE_V1_PADDING -}; - - -static void * -ngx_mail_imap_create_srv_conf(ngx_conf_t *cf) -{ - ngx_mail_imap_srv_conf_t *iscf; - - iscf = ngx_pcalloc(cf->pool, sizeof(ngx_mail_imap_srv_conf_t)); - if (iscf == NULL) { - return NULL; - } - - iscf->client_buffer_size = NGX_CONF_UNSET_SIZE; - - if (ngx_array_init(&iscf->capabilities, cf->pool, 4, sizeof(ngx_str_t)) - != NGX_OK) - { - return NULL; - } - - return iscf; -} - - -static char * -ngx_mail_imap_merge_srv_conf(ngx_conf_t *cf, void *parent, void *child) -{ - ngx_mail_imap_srv_conf_t *prev = parent; - ngx_mail_imap_srv_conf_t *conf = child; - - u_char *p, *auth; - size_t size; - ngx_str_t *c, *d; - ngx_uint_t i, m; - - ngx_conf_merge_size_value(conf->client_buffer_size, - prev->client_buffer_size, - (size_t) ngx_pagesize); - - ngx_conf_merge_bitmask_value(conf->auth_methods, - prev->auth_methods, - (NGX_CONF_BITMASK_SET - |NGX_MAIL_AUTH_PLAIN_ENABLED)); - - - if (conf->capabilities.nelts == 0) { - conf->capabilities = prev->capabilities; - } - - if (conf->capabilities.nelts == 0) { - - for (d = ngx_mail_imap_default_capabilities; d->len; d++) { - c = ngx_array_push(&conf->capabilities); - if (c == NULL) { - return NGX_CONF_ERROR; - } - - *c = *d; - } - } - - size = sizeof("* CAPABILITY" CRLF) - 1; - - c = conf->capabilities.elts; - for (i = 0; i < conf->capabilities.nelts; i++) { - size += 1 + c[i].len; - } - - for (m = NGX_MAIL_AUTH_PLAIN_ENABLED, i = 0; - m <= NGX_MAIL_AUTH_EXTERNAL_ENABLED; - m <<= 1, i++) - { - if (m & conf->auth_methods) { - size += 1 + ngx_mail_imap_auth_methods_names[i].len; - } - } - - p = ngx_pnalloc(cf->pool, size); - if (p == NULL) { - return NGX_CONF_ERROR; - } - - conf->capability.len = size; - conf->capability.data = p; - - p = ngx_cpymem(p, "* CAPABILITY", sizeof("* CAPABILITY") - 1); - - for (i = 0; i < conf->capabilities.nelts; i++) { - *p++ = ' '; - p = ngx_cpymem(p, c[i].data, c[i].len); - } - - auth = p; - - for (m = NGX_MAIL_AUTH_PLAIN_ENABLED, i = 0; - m <= NGX_MAIL_AUTH_EXTERNAL_ENABLED; - m <<= 1, i++) - { - if (m & conf->auth_methods) { - *p++ = ' '; - p = ngx_cpymem(p, ngx_mail_imap_auth_methods_names[i].data, - ngx_mail_imap_auth_methods_names[i].len); - } - } - - *p++ = CR; *p = LF; - - - size += sizeof(" STARTTLS") - 1; - - p = ngx_pnalloc(cf->pool, size); - if (p == NULL) { - return NGX_CONF_ERROR; - } - - conf->starttls_capability.len = size; - conf->starttls_capability.data = p; - - p = ngx_cpymem(p, conf->capability.data, - conf->capability.len - (sizeof(CRLF) - 1)); - p = ngx_cpymem(p, " STARTTLS", sizeof(" STARTTLS") - 1); - *p++ = CR; *p = LF; - - - size = (auth - conf->capability.data) + sizeof(CRLF) - 1 - + sizeof(" STARTTLS LOGINDISABLED") - 1; - - p = ngx_pnalloc(cf->pool, size); - if (p == NULL) { - return NGX_CONF_ERROR; - } - - conf->starttls_only_capability.len = size; - conf->starttls_only_capability.data = p; - - p = ngx_cpymem(p, conf->capability.data, - auth - conf->capability.data); - p = ngx_cpymem(p, " STARTTLS LOGINDISABLED", - sizeof(" STARTTLS LOGINDISABLED") - 1); - *p++ = CR; *p = LF; - - return NGX_CONF_OK; -} diff --git a/src/deps/src/nginx-1.30.3/src/mail/ngx_mail_imap_module.h b/src/deps/src/nginx-1.30.3/src/mail/ngx_mail_imap_module.h deleted file mode 100644 index 131b44597f..0000000000 --- a/src/deps/src/nginx-1.30.3/src/mail/ngx_mail_imap_module.h +++ /dev/null @@ -1,39 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#ifndef _NGX_MAIL_IMAP_MODULE_H_INCLUDED_ -#define _NGX_MAIL_IMAP_MODULE_H_INCLUDED_ - - -#include -#include -#include - - -typedef struct { - size_t client_buffer_size; - - ngx_str_t capability; - ngx_str_t starttls_capability; - ngx_str_t starttls_only_capability; - - ngx_uint_t auth_methods; - - ngx_array_t capabilities; -} ngx_mail_imap_srv_conf_t; - - -void ngx_mail_imap_init_session(ngx_mail_session_t *s, ngx_connection_t *c); -void ngx_mail_imap_init_protocol(ngx_event_t *rev); -void ngx_mail_imap_auth_state(ngx_event_t *rev); -ngx_int_t ngx_mail_imap_parse_command(ngx_mail_session_t *s); - - -extern ngx_module_t ngx_mail_imap_module; - - -#endif /* _NGX_MAIL_IMAP_MODULE_H_INCLUDED_ */ diff --git a/src/deps/src/nginx-1.30.3/src/mail/ngx_mail_parse.c b/src/deps/src/nginx-1.30.3/src/mail/ngx_mail_parse.c deleted file mode 100644 index 227b63abb2..0000000000 --- a/src/deps/src/nginx-1.30.3/src/mail/ngx_mail_parse.c +++ /dev/null @@ -1,974 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#include -#include -#include -#include -#include -#include -#include - - -ngx_int_t -ngx_mail_pop3_parse_command(ngx_mail_session_t *s) -{ - u_char ch, *p, *c, c0, c1, c2, c3; - ngx_str_t *arg; - enum { - sw_start = 0, - sw_command, - sw_invalid, - sw_spaces_before_argument, - sw_argument, - sw_almost_done - } state; - - state = s->state; - - for (p = s->buffer->pos; p < s->buffer->last; p++) { - ch = *p; - - switch (state) { - - /* POP3 command */ - case sw_start: - s->cmd_start = p; - state = sw_command; - - /* fall through */ - - case sw_command: - if (ch == ' ' || ch == CR || ch == LF) { - c = s->cmd_start; - - if (p - c == 4) { - - c0 = ngx_toupper(c[0]); - c1 = ngx_toupper(c[1]); - c2 = ngx_toupper(c[2]); - c3 = ngx_toupper(c[3]); - - if (c0 == 'U' && c1 == 'S' && c2 == 'E' && c3 == 'R') - { - s->command = NGX_POP3_USER; - - } else if (c0 == 'P' && c1 == 'A' && c2 == 'S' && c3 == 'S') - { - s->command = NGX_POP3_PASS; - - } else if (c0 == 'A' && c1 == 'P' && c2 == 'O' && c3 == 'P') - { - s->command = NGX_POP3_APOP; - - } else if (c0 == 'Q' && c1 == 'U' && c2 == 'I' && c3 == 'T') - { - s->command = NGX_POP3_QUIT; - - } else if (c0 == 'C' && c1 == 'A' && c2 == 'P' && c3 == 'A') - { - s->command = NGX_POP3_CAPA; - - } else if (c0 == 'A' && c1 == 'U' && c2 == 'T' && c3 == 'H') - { - s->command = NGX_POP3_AUTH; - - } else if (c0 == 'N' && c1 == 'O' && c2 == 'O' && c3 == 'P') - { - s->command = NGX_POP3_NOOP; -#if (NGX_MAIL_SSL) - } else if (c0 == 'S' && c1 == 'T' && c2 == 'L' && c3 == 'S') - { - s->command = NGX_POP3_STLS; -#endif - } else { - goto invalid; - } - - } else { - goto invalid; - } - - s->cmd.data = s->cmd_start; - s->cmd.len = p - s->cmd_start; - - switch (ch) { - case ' ': - state = sw_spaces_before_argument; - break; - case CR: - state = sw_almost_done; - break; - case LF: - goto done; - } - break; - } - - if ((ch < 'A' || ch > 'Z') && (ch < 'a' || ch > 'z')) { - goto invalid; - } - - break; - - case sw_invalid: - goto invalid; - - case sw_spaces_before_argument: - switch (ch) { - case ' ': - break; - case CR: - state = sw_almost_done; - break; - case LF: - goto done; - default: - if (s->args.nelts <= 2) { - state = sw_argument; - s->arg_start = p; - break; - } - goto invalid; - } - break; - - case sw_argument: - switch (ch) { - - case ' ': - - /* - * the space should be considered as part of the at username - * or password, but not of argument in other commands - */ - - if (s->command == NGX_POP3_USER - || s->command == NGX_POP3_PASS) - { - break; - } - - /* fall through */ - - case CR: - case LF: - arg = ngx_array_push(&s->args); - if (arg == NULL) { - return NGX_ERROR; - } - arg->len = p - s->arg_start; - arg->data = s->arg_start; - s->arg_start = NULL; - - switch (ch) { - case ' ': - state = sw_spaces_before_argument; - break; - case CR: - state = sw_almost_done; - break; - case LF: - goto done; - } - break; - - default: - break; - } - break; - - case sw_almost_done: - switch (ch) { - case LF: - goto done; - default: - goto invalid; - } - } - } - - s->buffer->pos = p; - s->state = state; - - return NGX_AGAIN; - -done: - - s->buffer->pos = p + 1; - s->state = (s->command != NGX_POP3_AUTH) ? sw_start : sw_argument; - - return NGX_OK; - -invalid: - - s->state = sw_invalid; - - /* skip invalid command till LF */ - - for ( /* void */ ; p < s->buffer->last; p++) { - if (*p == LF) { - s->state = sw_start; - s->buffer->pos = p + 1; - return NGX_MAIL_PARSE_INVALID_COMMAND; - } - } - - s->buffer->pos = p; - - return NGX_AGAIN; -} - - -ngx_int_t -ngx_mail_imap_parse_command(ngx_mail_session_t *s) -{ - u_char ch, *p, *c, *dst, *src, *end; - ngx_str_t *arg; - enum { - sw_start = 0, - sw_tag, - sw_invalid, - sw_spaces_before_command, - sw_command, - sw_spaces_before_argument, - sw_argument, - sw_backslash, - sw_literal, - sw_no_sync_literal_argument, - sw_start_literal_argument, - sw_literal_argument, - sw_end_literal_argument, - sw_almost_done - } state; - - state = s->state; - - for (p = s->buffer->pos; p < s->buffer->last; p++) { - ch = *p; - - switch (state) { - - /* IMAP tag */ - case sw_start: - s->tag_start = p; - state = sw_tag; - - /* fall through */ - - case sw_tag: - switch (ch) { - case ' ': - s->tag.len = p - s->tag_start + 1; - s->tag.data = s->tag_start; - state = sw_spaces_before_command; - break; - case CR: - case LF: - goto invalid; - default: - if ((ch < 'A' || ch > 'Z') && (ch < 'a' || ch > 'z') - && (ch < '0' || ch > '9') && ch != '-' && ch != '.' - && ch != '_') - { - goto invalid; - } - if (p - s->tag_start > 31) { - goto invalid; - } - break; - } - break; - - case sw_invalid: - goto invalid; - - case sw_spaces_before_command: - switch (ch) { - case ' ': - break; - case CR: - case LF: - goto invalid; - default: - s->cmd_start = p; - state = sw_command; - break; - } - break; - - case sw_command: - if (ch == ' ' || ch == CR || ch == LF) { - - c = s->cmd_start; - - switch (p - c) { - - case 4: - if ((c[0] == 'N' || c[0] == 'n') - && (c[1] == 'O'|| c[1] == 'o') - && (c[2] == 'O'|| c[2] == 'o') - && (c[3] == 'P'|| c[3] == 'p')) - { - s->command = NGX_IMAP_NOOP; - - } else { - goto invalid; - } - break; - - case 5: - if ((c[0] == 'L'|| c[0] == 'l') - && (c[1] == 'O'|| c[1] == 'o') - && (c[2] == 'G'|| c[2] == 'g') - && (c[3] == 'I'|| c[3] == 'i') - && (c[4] == 'N'|| c[4] == 'n')) - { - s->command = NGX_IMAP_LOGIN; - - } else { - goto invalid; - } - break; - - case 6: - if ((c[0] == 'L'|| c[0] == 'l') - && (c[1] == 'O'|| c[1] == 'o') - && (c[2] == 'G'|| c[2] == 'g') - && (c[3] == 'O'|| c[3] == 'o') - && (c[4] == 'U'|| c[4] == 'u') - && (c[5] == 'T'|| c[5] == 't')) - { - s->command = NGX_IMAP_LOGOUT; - - } else { - goto invalid; - } - break; - -#if (NGX_MAIL_SSL) - case 8: - if ((c[0] == 'S'|| c[0] == 's') - && (c[1] == 'T'|| c[1] == 't') - && (c[2] == 'A'|| c[2] == 'a') - && (c[3] == 'R'|| c[3] == 'r') - && (c[4] == 'T'|| c[4] == 't') - && (c[5] == 'T'|| c[5] == 't') - && (c[6] == 'L'|| c[6] == 'l') - && (c[7] == 'S'|| c[7] == 's')) - { - s->command = NGX_IMAP_STARTTLS; - - } else { - goto invalid; - } - break; -#endif - - case 10: - if ((c[0] == 'C'|| c[0] == 'c') - && (c[1] == 'A'|| c[1] == 'a') - && (c[2] == 'P'|| c[2] == 'p') - && (c[3] == 'A'|| c[3] == 'a') - && (c[4] == 'B'|| c[4] == 'b') - && (c[5] == 'I'|| c[5] == 'i') - && (c[6] == 'L'|| c[6] == 'l') - && (c[7] == 'I'|| c[7] == 'i') - && (c[8] == 'T'|| c[8] == 't') - && (c[9] == 'Y'|| c[9] == 'y')) - { - s->command = NGX_IMAP_CAPABILITY; - - } else { - goto invalid; - } - break; - - case 12: - if ((c[0] == 'A'|| c[0] == 'a') - && (c[1] == 'U'|| c[1] == 'u') - && (c[2] == 'T'|| c[2] == 't') - && (c[3] == 'H'|| c[3] == 'h') - && (c[4] == 'E'|| c[4] == 'e') - && (c[5] == 'N'|| c[5] == 'n') - && (c[6] == 'T'|| c[6] == 't') - && (c[7] == 'I'|| c[7] == 'i') - && (c[8] == 'C'|| c[8] == 'c') - && (c[9] == 'A'|| c[9] == 'a') - && (c[10] == 'T'|| c[10] == 't') - && (c[11] == 'E'|| c[11] == 'e')) - { - s->command = NGX_IMAP_AUTHENTICATE; - - } else { - goto invalid; - } - break; - - default: - goto invalid; - } - - s->cmd.data = s->cmd_start; - s->cmd.len = p - s->cmd_start; - - switch (ch) { - case ' ': - state = sw_spaces_before_argument; - break; - case CR: - state = sw_almost_done; - break; - case LF: - goto done; - } - break; - } - - if ((ch < 'A' || ch > 'Z') && (ch < 'a' || ch > 'z')) { - goto invalid; - } - - break; - - case sw_spaces_before_argument: - switch (ch) { - case ' ': - break; - case CR: - state = sw_almost_done; - break; - case LF: - goto done; - case '"': - if (s->args.nelts <= 2) { - s->quoted = 1; - s->arg_start = p + 1; - state = sw_argument; - break; - } - goto invalid; - case '{': - if (s->args.nelts <= 2) { - state = sw_literal; - break; - } - goto invalid; - default: - if (s->args.nelts <= 2) { - s->arg_start = p; - state = sw_argument; - break; - } - goto invalid; - } - break; - - case sw_argument: - if (ch == ' ' && s->quoted) { - break; - } - - switch (ch) { - case '"': - if (!s->quoted) { - break; - } - s->quoted = 0; - /* fall through */ - case ' ': - case CR: - case LF: - arg = ngx_array_push(&s->args); - if (arg == NULL) { - return NGX_ERROR; - } - arg->len = p - s->arg_start; - arg->data = s->arg_start; - - if (s->backslash) { - dst = s->arg_start; - end = p; - - for (src = dst; src < end; dst++) { - *dst = *src; - if (*src++ == '\\') { - *dst = *src++; - } - } - - arg->len = dst - s->arg_start; - s->backslash = 0; - } - - s->arg_start = NULL; - - switch (ch) { - case '"': - case ' ': - state = sw_spaces_before_argument; - break; - case CR: - state = sw_almost_done; - break; - case LF: - goto done; - } - break; - case '\\': - if (s->quoted) { - s->backslash = 1; - state = sw_backslash; - } - break; - } - break; - - case sw_backslash: - switch (ch) { - case CR: - case LF: - goto invalid; - default: - state = sw_argument; - } - break; - - case sw_literal: - if (s->literal_len > NGX_MAX_SIZE_T_VALUE / 10) { - goto invalid; - } - if (ch >= '0' && ch <= '9') { - s->literal_len = s->literal_len * 10 + (ch - '0'); - break; - } - if (ch == '}') { - state = sw_start_literal_argument; - break; - } - if (ch == '+') { - state = sw_no_sync_literal_argument; - break; - } - goto invalid; - - case sw_no_sync_literal_argument: - if (ch == '}') { - s->no_sync_literal = 1; - state = sw_start_literal_argument; - break; - } - goto invalid; - - case sw_start_literal_argument: - switch (ch) { - case CR: - break; - case LF: - s->buffer->pos = p + 1; - s->arg_start = p + 1; - if (s->no_sync_literal == 0) { - s->state = sw_literal_argument; - return NGX_IMAP_NEXT; - } - state = sw_literal_argument; - s->no_sync_literal = 0; - break; - default: - goto invalid; - } - break; - - case sw_literal_argument: - if (s->literal_len && --s->literal_len) { - break; - } - - arg = ngx_array_push(&s->args); - if (arg == NULL) { - return NGX_ERROR; - } - arg->len = p + 1 - s->arg_start; - arg->data = s->arg_start; - s->arg_start = NULL; - state = sw_end_literal_argument; - - break; - - case sw_end_literal_argument: - switch (ch) { - case ' ': - state = sw_spaces_before_argument; - break; - case CR: - state = sw_almost_done; - break; - case LF: - goto done; - default: - goto invalid; - } - break; - - case sw_almost_done: - switch (ch) { - case LF: - goto done; - default: - goto invalid; - } - } - } - - s->buffer->pos = p; - s->state = state; - - return NGX_AGAIN; - -done: - - s->buffer->pos = p + 1; - s->state = (s->command != NGX_IMAP_AUTHENTICATE) ? sw_start : sw_argument; - - return NGX_OK; - -invalid: - - s->state = sw_invalid; - s->quoted = 0; - s->backslash = 0; - s->no_sync_literal = 0; - s->literal_len = 0; - - /* skip invalid command till LF */ - - for ( /* void */ ; p < s->buffer->last; p++) { - if (*p == LF) { - s->state = sw_start; - s->buffer->pos = p + 1; - - /* detect non-synchronizing literals */ - - if ((size_t) (p - s->buffer->start) > sizeof("{1+}") - 1) { - p--; - - if (*p == CR) { - p--; - } - - if (*p == '}' && *(p - 1) == '+') { - s->quit = 1; - } - } - - return NGX_MAIL_PARSE_INVALID_COMMAND; - } - } - - s->buffer->pos = p; - - return NGX_AGAIN; -} - - -ngx_int_t -ngx_mail_smtp_parse_command(ngx_mail_session_t *s) -{ - u_char ch, *p, *c, c0, c1, c2, c3; - ngx_str_t *arg; - enum { - sw_start = 0, - sw_command, - sw_invalid, - sw_spaces_before_argument, - sw_argument, - sw_almost_done - } state; - - state = s->state; - - for (p = s->buffer->pos; p < s->buffer->last; p++) { - ch = *p; - - switch (state) { - - /* SMTP command */ - case sw_start: - s->cmd_start = p; - state = sw_command; - - /* fall through */ - - case sw_command: - if (ch == ' ' || ch == CR || ch == LF) { - c = s->cmd_start; - - if (p - c == 4) { - - c0 = ngx_toupper(c[0]); - c1 = ngx_toupper(c[1]); - c2 = ngx_toupper(c[2]); - c3 = ngx_toupper(c[3]); - - if (c0 == 'H' && c1 == 'E' && c2 == 'L' && c3 == 'O') - { - s->command = NGX_SMTP_HELO; - - } else if (c0 == 'E' && c1 == 'H' && c2 == 'L' && c3 == 'O') - { - s->command = NGX_SMTP_EHLO; - - } else if (c0 == 'Q' && c1 == 'U' && c2 == 'I' && c3 == 'T') - { - s->command = NGX_SMTP_QUIT; - - } else if (c0 == 'A' && c1 == 'U' && c2 == 'T' && c3 == 'H') - { - s->command = NGX_SMTP_AUTH; - - } else if (c0 == 'N' && c1 == 'O' && c2 == 'O' && c3 == 'P') - { - s->command = NGX_SMTP_NOOP; - - } else if (c0 == 'M' && c1 == 'A' && c2 == 'I' && c3 == 'L') - { - s->command = NGX_SMTP_MAIL; - - } else if (c0 == 'R' && c1 == 'S' && c2 == 'E' && c3 == 'T') - { - s->command = NGX_SMTP_RSET; - - } else if (c0 == 'R' && c1 == 'C' && c2 == 'P' && c3 == 'T') - { - s->command = NGX_SMTP_RCPT; - - } else if (c0 == 'V' && c1 == 'R' && c2 == 'F' && c3 == 'Y') - { - s->command = NGX_SMTP_VRFY; - - } else if (c0 == 'E' && c1 == 'X' && c2 == 'P' && c3 == 'N') - { - s->command = NGX_SMTP_EXPN; - - } else if (c0 == 'H' && c1 == 'E' && c2 == 'L' && c3 == 'P') - { - s->command = NGX_SMTP_HELP; - - } else { - goto invalid; - } -#if (NGX_MAIL_SSL) - } else if (p - c == 8) { - - if ((c[0] == 'S'|| c[0] == 's') - && (c[1] == 'T'|| c[1] == 't') - && (c[2] == 'A'|| c[2] == 'a') - && (c[3] == 'R'|| c[3] == 'r') - && (c[4] == 'T'|| c[4] == 't') - && (c[5] == 'T'|| c[5] == 't') - && (c[6] == 'L'|| c[6] == 'l') - && (c[7] == 'S'|| c[7] == 's')) - { - s->command = NGX_SMTP_STARTTLS; - - } else { - goto invalid; - } -#endif - } else { - goto invalid; - } - - s->cmd.data = s->cmd_start; - s->cmd.len = p - s->cmd_start; - - switch (ch) { - case ' ': - state = sw_spaces_before_argument; - break; - case CR: - state = sw_almost_done; - break; - case LF: - goto done; - } - break; - } - - if ((ch < 'A' || ch > 'Z') && (ch < 'a' || ch > 'z')) { - goto invalid; - } - - break; - - case sw_invalid: - goto invalid; - - case sw_spaces_before_argument: - switch (ch) { - case ' ': - break; - case CR: - state = sw_almost_done; - break; - case LF: - goto done; - default: - if (s->args.nelts <= 10) { - state = sw_argument; - s->arg_start = p; - break; - } - goto invalid; - } - break; - - case sw_argument: - switch (ch) { - case ' ': - case CR: - case LF: - arg = ngx_array_push(&s->args); - if (arg == NULL) { - return NGX_ERROR; - } - arg->len = p - s->arg_start; - arg->data = s->arg_start; - s->arg_start = NULL; - - switch (ch) { - case ' ': - state = sw_spaces_before_argument; - break; - case CR: - state = sw_almost_done; - break; - case LF: - goto done; - } - break; - - default: - break; - } - break; - - case sw_almost_done: - switch (ch) { - case LF: - goto done; - default: - goto invalid; - } - } - } - - s->buffer->pos = p; - s->state = state; - - return NGX_AGAIN; - -done: - - s->buffer->pos = p + 1; - s->state = (s->command != NGX_SMTP_AUTH) ? sw_start : sw_argument; - - return NGX_OK; - -invalid: - - s->state = sw_invalid; - - /* skip invalid command till LF */ - - for ( /* void */ ; p < s->buffer->last; p++) { - if (*p == LF) { - s->state = sw_start; - s->buffer->pos = p + 1; - return NGX_MAIL_PARSE_INVALID_COMMAND; - } - } - - s->buffer->pos = p; - - return NGX_AGAIN; -} - - -ngx_int_t -ngx_mail_auth_parse(ngx_mail_session_t *s, ngx_connection_t *c) -{ - ngx_str_t *arg; - -#if (NGX_MAIL_SSL) - if (ngx_mail_starttls_only(s, c)) { - return NGX_MAIL_PARSE_INVALID_COMMAND; - } -#endif - - if (s->args.nelts == 0) { - return NGX_MAIL_PARSE_INVALID_COMMAND; - } - - arg = s->args.elts; - - if (arg[0].len == 5) { - - if (ngx_strncasecmp(arg[0].data, (u_char *) "LOGIN", 5) == 0) { - - if (s->args.nelts == 1) { - return NGX_MAIL_AUTH_LOGIN; - } - - if (s->args.nelts == 2) { - return NGX_MAIL_AUTH_LOGIN_USERNAME; - } - - return NGX_MAIL_PARSE_INVALID_COMMAND; - } - - if (ngx_strncasecmp(arg[0].data, (u_char *) "PLAIN", 5) == 0) { - - if (s->args.nelts == 1) { - return NGX_MAIL_AUTH_PLAIN; - } - - if (s->args.nelts == 2) { - return ngx_mail_auth_plain(s, c, 1); - } - } - - return NGX_MAIL_PARSE_INVALID_COMMAND; - } - - if (arg[0].len == 8) { - - if (ngx_strncasecmp(arg[0].data, (u_char *) "CRAM-MD5", 8) == 0) { - - if (s->args.nelts != 1) { - return NGX_MAIL_PARSE_INVALID_COMMAND; - } - - return NGX_MAIL_AUTH_CRAM_MD5; - } - - if (ngx_strncasecmp(arg[0].data, (u_char *) "EXTERNAL", 8) == 0) { - - if (s->args.nelts == 1) { - return NGX_MAIL_AUTH_EXTERNAL; - } - - if (s->args.nelts == 2) { - return ngx_mail_auth_external(s, c, 1); - } - } - - return NGX_MAIL_PARSE_INVALID_COMMAND; - } - - return NGX_MAIL_PARSE_INVALID_COMMAND; -} diff --git a/src/deps/src/nginx-1.30.3/src/mail/ngx_mail_pop3_handler.c b/src/deps/src/nginx-1.30.3/src/mail/ngx_mail_pop3_handler.c deleted file mode 100644 index 226e7419bd..0000000000 --- a/src/deps/src/nginx-1.30.3/src/mail/ngx_mail_pop3_handler.c +++ /dev/null @@ -1,544 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#include -#include -#include -#include -#include - - -static ngx_int_t ngx_mail_pop3_user(ngx_mail_session_t *s, ngx_connection_t *c); -static ngx_int_t ngx_mail_pop3_pass(ngx_mail_session_t *s, ngx_connection_t *c); -static ngx_int_t ngx_mail_pop3_capa(ngx_mail_session_t *s, ngx_connection_t *c, - ngx_int_t stls); -static ngx_int_t ngx_mail_pop3_stls(ngx_mail_session_t *s, ngx_connection_t *c); -static ngx_int_t ngx_mail_pop3_apop(ngx_mail_session_t *s, ngx_connection_t *c); -static ngx_int_t ngx_mail_pop3_auth(ngx_mail_session_t *s, ngx_connection_t *c); - - -static u_char pop3_greeting[] = "+OK POP3 ready" CRLF; -static u_char pop3_ok[] = "+OK" CRLF; -static u_char pop3_next[] = "+ " CRLF; -static u_char pop3_username[] = "+ VXNlcm5hbWU6" CRLF; -static u_char pop3_password[] = "+ UGFzc3dvcmQ6" CRLF; -static u_char pop3_invalid_command[] = "-ERR invalid command" CRLF; - - -void -ngx_mail_pop3_init_session(ngx_mail_session_t *s, ngx_connection_t *c) -{ - u_char *p; - ngx_mail_core_srv_conf_t *cscf; - ngx_mail_pop3_srv_conf_t *pscf; - - pscf = ngx_mail_get_module_srv_conf(s, ngx_mail_pop3_module); - cscf = ngx_mail_get_module_srv_conf(s, ngx_mail_core_module); - - if (pscf->auth_methods - & (NGX_MAIL_AUTH_APOP_ENABLED|NGX_MAIL_AUTH_CRAM_MD5_ENABLED)) - { - if (ngx_mail_salt(s, c, cscf) != NGX_OK) { - ngx_mail_session_internal_server_error(s); - return; - } - - s->out.data = ngx_pnalloc(c->pool, sizeof(pop3_greeting) + s->salt.len); - if (s->out.data == NULL) { - ngx_mail_session_internal_server_error(s); - return; - } - - p = ngx_cpymem(s->out.data, pop3_greeting, sizeof(pop3_greeting) - 3); - *p++ = ' '; - p = ngx_cpymem(p, s->salt.data, s->salt.len); - - s->out.len = p - s->out.data; - - } else { - ngx_str_set(&s->out, pop3_greeting); - } - - c->read->handler = ngx_mail_pop3_init_protocol; - - ngx_add_timer(c->read, cscf->timeout); - - if (ngx_handle_read_event(c->read, 0) != NGX_OK) { - ngx_mail_close_connection(c); - } - - ngx_mail_send(c->write); -} - - -void -ngx_mail_pop3_init_protocol(ngx_event_t *rev) -{ - ngx_connection_t *c; - ngx_mail_session_t *s; - - c = rev->data; - - c->log->action = "in auth state"; - - if (rev->timedout) { - ngx_log_error(NGX_LOG_INFO, c->log, NGX_ETIMEDOUT, "client timed out"); - c->timedout = 1; - ngx_mail_close_connection(c); - return; - } - - s = c->data; - - if (s->buffer == NULL) { - if (ngx_array_init(&s->args, c->pool, 2, sizeof(ngx_str_t)) - == NGX_ERROR) - { - ngx_mail_session_internal_server_error(s); - return; - } - - s->buffer = ngx_create_temp_buf(c->pool, 128); - if (s->buffer == NULL) { - ngx_mail_session_internal_server_error(s); - return; - } - } - - s->mail_state = ngx_pop3_start; - c->read->handler = ngx_mail_pop3_auth_state; - - ngx_mail_pop3_auth_state(rev); -} - - -void -ngx_mail_pop3_auth_state(ngx_event_t *rev) -{ - ngx_int_t rc; - ngx_connection_t *c; - ngx_mail_session_t *s; - - c = rev->data; - s = c->data; - - ngx_log_debug0(NGX_LOG_DEBUG_MAIL, c->log, 0, "pop3 auth state"); - - if (rev->timedout) { - ngx_log_error(NGX_LOG_INFO, c->log, NGX_ETIMEDOUT, "client timed out"); - c->timedout = 1; - ngx_mail_close_connection(c); - return; - } - - if (s->out.len) { - ngx_log_debug0(NGX_LOG_DEBUG_MAIL, c->log, 0, "pop3 send handler busy"); - s->blocked = 1; - - if (ngx_handle_read_event(c->read, 0) != NGX_OK) { - ngx_mail_close_connection(c); - return; - } - - return; - } - - s->blocked = 0; - - rc = ngx_mail_read_command(s, c); - - if (rc == NGX_AGAIN) { - if (ngx_handle_read_event(c->read, 0) != NGX_OK) { - ngx_mail_session_internal_server_error(s); - return; - } - - return; - } - - if (rc == NGX_ERROR) { - return; - } - - ngx_str_set(&s->out, pop3_ok); - - if (rc == NGX_OK) { - switch (s->mail_state) { - - case ngx_pop3_start: - - switch (s->command) { - - case NGX_POP3_USER: - rc = ngx_mail_pop3_user(s, c); - break; - - case NGX_POP3_CAPA: - rc = ngx_mail_pop3_capa(s, c, 1); - break; - - case NGX_POP3_APOP: - rc = ngx_mail_pop3_apop(s, c); - break; - - case NGX_POP3_AUTH: - rc = ngx_mail_pop3_auth(s, c); - break; - - case NGX_POP3_QUIT: - s->quit = 1; - break; - - case NGX_POP3_NOOP: - break; - - case NGX_POP3_STLS: - rc = ngx_mail_pop3_stls(s, c); - break; - - default: - rc = NGX_MAIL_PARSE_INVALID_COMMAND; - break; - } - - break; - - case ngx_pop3_user: - - switch (s->command) { - - case NGX_POP3_PASS: - rc = ngx_mail_pop3_pass(s, c); - break; - - case NGX_POP3_CAPA: - rc = ngx_mail_pop3_capa(s, c, 0); - break; - - case NGX_POP3_QUIT: - s->quit = 1; - break; - - case NGX_POP3_NOOP: - break; - - default: - rc = NGX_MAIL_PARSE_INVALID_COMMAND; - break; - } - - break; - - /* suppress warnings */ - case ngx_pop3_passwd: - break; - - case ngx_pop3_auth_login_username: - rc = ngx_mail_auth_login_username(s, c, 0); - - ngx_str_set(&s->out, pop3_password); - s->mail_state = ngx_pop3_auth_login_password; - break; - - case ngx_pop3_auth_login_password: - rc = ngx_mail_auth_login_password(s, c); - break; - - case ngx_pop3_auth_plain: - rc = ngx_mail_auth_plain(s, c, 0); - break; - - case ngx_pop3_auth_cram_md5: - rc = ngx_mail_auth_cram_md5(s, c); - break; - - case ngx_pop3_auth_external: - rc = ngx_mail_auth_external(s, c, 0); - break; - } - } - - if (s->buffer->pos < s->buffer->last) { - s->blocked = 1; - } - - switch (rc) { - - case NGX_DONE: - ngx_mail_auth(s, c); - return; - - case NGX_ERROR: - ngx_mail_session_internal_server_error(s); - return; - - case NGX_MAIL_PARSE_INVALID_COMMAND: - s->mail_state = ngx_pop3_start; - s->state = 0; - - ngx_str_set(&s->out, pop3_invalid_command); - - /* fall through */ - - case NGX_OK: - - s->args.nelts = 0; - - if (s->buffer->pos == s->buffer->last) { - s->buffer->pos = s->buffer->start; - s->buffer->last = s->buffer->start; - } - - if (s->state) { - s->arg_start = s->buffer->pos; - } - - if (ngx_handle_read_event(c->read, 0) != NGX_OK) { - ngx_mail_session_internal_server_error(s); - return; - } - - ngx_mail_send(c->write); - } -} - -static ngx_int_t -ngx_mail_pop3_user(ngx_mail_session_t *s, ngx_connection_t *c) -{ - ngx_str_t *arg; - -#if (NGX_MAIL_SSL) - if (ngx_mail_starttls_only(s, c)) { - return NGX_MAIL_PARSE_INVALID_COMMAND; - } -#endif - - if (s->args.nelts != 1) { - return NGX_MAIL_PARSE_INVALID_COMMAND; - } - - arg = s->args.elts; - s->login.len = arg[0].len; - s->login.data = ngx_pnalloc(c->pool, s->login.len); - if (s->login.data == NULL) { - return NGX_ERROR; - } - - ngx_memcpy(s->login.data, arg[0].data, s->login.len); - - ngx_log_debug1(NGX_LOG_DEBUG_MAIL, c->log, 0, - "pop3 login: \"%V\"", &s->login); - - s->mail_state = ngx_pop3_user; - - return NGX_OK; -} - - -static ngx_int_t -ngx_mail_pop3_pass(ngx_mail_session_t *s, ngx_connection_t *c) -{ - ngx_str_t *arg; - - if (s->args.nelts != 1) { - return NGX_MAIL_PARSE_INVALID_COMMAND; - } - - arg = s->args.elts; - s->passwd.len = arg[0].len; - s->passwd.data = ngx_pnalloc(c->pool, s->passwd.len); - if (s->passwd.data == NULL) { - return NGX_ERROR; - } - - ngx_memcpy(s->passwd.data, arg[0].data, s->passwd.len); - -#if (NGX_DEBUG_MAIL_PASSWD) - ngx_log_debug1(NGX_LOG_DEBUG_MAIL, c->log, 0, - "pop3 passwd: \"%V\"", &s->passwd); -#endif - - return NGX_DONE; -} - - -static ngx_int_t -ngx_mail_pop3_capa(ngx_mail_session_t *s, ngx_connection_t *c, ngx_int_t stls) -{ - ngx_mail_pop3_srv_conf_t *pscf; - - pscf = ngx_mail_get_module_srv_conf(s, ngx_mail_pop3_module); - -#if (NGX_MAIL_SSL) - - if (stls && c->ssl == NULL) { - ngx_mail_ssl_conf_t *sslcf; - - sslcf = ngx_mail_get_module_srv_conf(s, ngx_mail_ssl_module); - - if (sslcf->starttls == NGX_MAIL_STARTTLS_ON) { - s->out = pscf->starttls_capability; - return NGX_OK; - } - - if (sslcf->starttls == NGX_MAIL_STARTTLS_ONLY) { - s->out = pscf->starttls_only_capability; - return NGX_OK; - } - } - -#endif - - s->out = pscf->capability; - return NGX_OK; -} - - -static ngx_int_t -ngx_mail_pop3_stls(ngx_mail_session_t *s, ngx_connection_t *c) -{ -#if (NGX_MAIL_SSL) - ngx_mail_ssl_conf_t *sslcf; - - if (c->ssl == NULL) { - sslcf = ngx_mail_get_module_srv_conf(s, ngx_mail_ssl_module); - if (sslcf->starttls) { - s->buffer->pos = s->buffer->start; - s->buffer->last = s->buffer->start; - c->read->handler = ngx_mail_starttls_handler; - return NGX_OK; - } - } - -#endif - - return NGX_MAIL_PARSE_INVALID_COMMAND; -} - - -static ngx_int_t -ngx_mail_pop3_apop(ngx_mail_session_t *s, ngx_connection_t *c) -{ - ngx_str_t *arg; - ngx_mail_pop3_srv_conf_t *pscf; - -#if (NGX_MAIL_SSL) - if (ngx_mail_starttls_only(s, c)) { - return NGX_MAIL_PARSE_INVALID_COMMAND; - } -#endif - - if (s->args.nelts != 2) { - return NGX_MAIL_PARSE_INVALID_COMMAND; - } - - pscf = ngx_mail_get_module_srv_conf(s, ngx_mail_pop3_module); - - if (!(pscf->auth_methods & NGX_MAIL_AUTH_APOP_ENABLED)) { - return NGX_MAIL_PARSE_INVALID_COMMAND; - } - - arg = s->args.elts; - - s->login.len = arg[0].len; - s->login.data = ngx_pnalloc(c->pool, s->login.len); - if (s->login.data == NULL) { - return NGX_ERROR; - } - - ngx_memcpy(s->login.data, arg[0].data, s->login.len); - - s->passwd.len = arg[1].len; - s->passwd.data = ngx_pnalloc(c->pool, s->passwd.len); - if (s->passwd.data == NULL) { - return NGX_ERROR; - } - - ngx_memcpy(s->passwd.data, arg[1].data, s->passwd.len); - - ngx_log_debug2(NGX_LOG_DEBUG_MAIL, c->log, 0, - "pop3 apop: \"%V\" \"%V\"", &s->login, &s->passwd); - - s->auth_method = NGX_MAIL_AUTH_APOP; - - return NGX_DONE; -} - - -static ngx_int_t -ngx_mail_pop3_auth(ngx_mail_session_t *s, ngx_connection_t *c) -{ - ngx_int_t rc; - ngx_mail_pop3_srv_conf_t *pscf; - -#if (NGX_MAIL_SSL) - if (ngx_mail_starttls_only(s, c)) { - return NGX_MAIL_PARSE_INVALID_COMMAND; - } -#endif - - pscf = ngx_mail_get_module_srv_conf(s, ngx_mail_pop3_module); - - if (s->args.nelts == 0) { - s->out = pscf->auth_capability; - s->state = 0; - - return NGX_OK; - } - - rc = ngx_mail_auth_parse(s, c); - - switch (rc) { - - case NGX_MAIL_AUTH_LOGIN: - - ngx_str_set(&s->out, pop3_username); - s->mail_state = ngx_pop3_auth_login_username; - - return NGX_OK; - - case NGX_MAIL_AUTH_LOGIN_USERNAME: - - ngx_str_set(&s->out, pop3_password); - s->mail_state = ngx_pop3_auth_login_password; - - return ngx_mail_auth_login_username(s, c, 1); - - case NGX_MAIL_AUTH_PLAIN: - - ngx_str_set(&s->out, pop3_next); - s->mail_state = ngx_pop3_auth_plain; - - return NGX_OK; - - case NGX_MAIL_AUTH_CRAM_MD5: - - if (!(pscf->auth_methods & NGX_MAIL_AUTH_CRAM_MD5_ENABLED)) { - return NGX_MAIL_PARSE_INVALID_COMMAND; - } - - if (ngx_mail_auth_cram_md5_salt(s, c, "+ ", 2) == NGX_OK) { - s->mail_state = ngx_pop3_auth_cram_md5; - return NGX_OK; - } - - return NGX_ERROR; - - case NGX_MAIL_AUTH_EXTERNAL: - - if (!(pscf->auth_methods & NGX_MAIL_AUTH_EXTERNAL_ENABLED)) { - return NGX_MAIL_PARSE_INVALID_COMMAND; - } - - ngx_str_set(&s->out, pop3_username); - s->mail_state = ngx_pop3_auth_external; - - return NGX_OK; - } - - return rc; -} diff --git a/src/deps/src/nginx-1.30.3/src/mail/ngx_mail_pop3_module.c b/src/deps/src/nginx-1.30.3/src/mail/ngx_mail_pop3_module.c deleted file mode 100644 index a257b5a702..0000000000 --- a/src/deps/src/nginx-1.30.3/src/mail/ngx_mail_pop3_module.c +++ /dev/null @@ -1,323 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#include -#include -#include -#include -#include - - -static void *ngx_mail_pop3_create_srv_conf(ngx_conf_t *cf); -static char *ngx_mail_pop3_merge_srv_conf(ngx_conf_t *cf, void *parent, - void *child); - - -static ngx_str_t ngx_mail_pop3_default_capabilities[] = { - ngx_string("TOP"), - ngx_string("USER"), - ngx_string("UIDL"), - ngx_null_string -}; - - -static ngx_conf_bitmask_t ngx_mail_pop3_auth_methods[] = { - { ngx_string("plain"), NGX_MAIL_AUTH_PLAIN_ENABLED }, - { ngx_string("apop"), NGX_MAIL_AUTH_APOP_ENABLED }, - { ngx_string("cram-md5"), NGX_MAIL_AUTH_CRAM_MD5_ENABLED }, - { ngx_string("external"), NGX_MAIL_AUTH_EXTERNAL_ENABLED }, - { ngx_null_string, 0 } -}; - - -static ngx_str_t ngx_mail_pop3_auth_methods_names[] = { - ngx_string("PLAIN"), - ngx_string("LOGIN"), - ngx_null_string, /* APOP */ - ngx_string("CRAM-MD5"), - ngx_string("EXTERNAL"), - ngx_null_string /* NONE */ -}; - - -static ngx_mail_protocol_t ngx_mail_pop3_protocol = { - ngx_string("pop3"), - ngx_string("\x04pop3"), - { 110, 995, 0, 0 }, - NGX_MAIL_POP3_PROTOCOL, - - ngx_mail_pop3_init_session, - ngx_mail_pop3_init_protocol, - ngx_mail_pop3_parse_command, - ngx_mail_pop3_auth_state, - - ngx_string("-ERR internal server error" CRLF), - ngx_string("-ERR SSL certificate error" CRLF), - ngx_string("-ERR No required SSL certificate" CRLF) -}; - - -static ngx_command_t ngx_mail_pop3_commands[] = { - - { ngx_string("pop3_capabilities"), - NGX_MAIL_MAIN_CONF|NGX_MAIL_SRV_CONF|NGX_CONF_1MORE, - ngx_mail_capabilities, - NGX_MAIL_SRV_CONF_OFFSET, - offsetof(ngx_mail_pop3_srv_conf_t, capabilities), - NULL }, - - { ngx_string("pop3_auth"), - NGX_MAIL_MAIN_CONF|NGX_MAIL_SRV_CONF|NGX_CONF_1MORE, - ngx_conf_set_bitmask_slot, - NGX_MAIL_SRV_CONF_OFFSET, - offsetof(ngx_mail_pop3_srv_conf_t, auth_methods), - &ngx_mail_pop3_auth_methods }, - - ngx_null_command -}; - - -static ngx_mail_module_t ngx_mail_pop3_module_ctx = { - &ngx_mail_pop3_protocol, /* protocol */ - - NULL, /* create main configuration */ - NULL, /* init main configuration */ - - ngx_mail_pop3_create_srv_conf, /* create server configuration */ - ngx_mail_pop3_merge_srv_conf /* merge server configuration */ -}; - - -ngx_module_t ngx_mail_pop3_module = { - NGX_MODULE_V1, - &ngx_mail_pop3_module_ctx, /* module context */ - ngx_mail_pop3_commands, /* module directives */ - NGX_MAIL_MODULE, /* module type */ - NULL, /* init master */ - NULL, /* init module */ - NULL, /* init process */ - NULL, /* init thread */ - NULL, /* exit thread */ - NULL, /* exit process */ - NULL, /* exit master */ - NGX_MODULE_V1_PADDING -}; - - -static void * -ngx_mail_pop3_create_srv_conf(ngx_conf_t *cf) -{ - ngx_mail_pop3_srv_conf_t *pscf; - - pscf = ngx_pcalloc(cf->pool, sizeof(ngx_mail_pop3_srv_conf_t)); - if (pscf == NULL) { - return NULL; - } - - if (ngx_array_init(&pscf->capabilities, cf->pool, 4, sizeof(ngx_str_t)) - != NGX_OK) - { - return NULL; - } - - return pscf; -} - - -static char * -ngx_mail_pop3_merge_srv_conf(ngx_conf_t *cf, void *parent, void *child) -{ - ngx_mail_pop3_srv_conf_t *prev = parent; - ngx_mail_pop3_srv_conf_t *conf = child; - - u_char *p; - size_t size, stls_only_size; - ngx_str_t *c, *d; - ngx_uint_t i, m; - - ngx_conf_merge_bitmask_value(conf->auth_methods, - prev->auth_methods, - (NGX_CONF_BITMASK_SET - |NGX_MAIL_AUTH_PLAIN_ENABLED)); - - if (conf->auth_methods & NGX_MAIL_AUTH_PLAIN_ENABLED) { - conf->auth_methods |= NGX_MAIL_AUTH_LOGIN_ENABLED; - } - - if (conf->capabilities.nelts == 0) { - conf->capabilities = prev->capabilities; - } - - if (conf->capabilities.nelts == 0) { - - for (d = ngx_mail_pop3_default_capabilities; d->len; d++) { - c = ngx_array_push(&conf->capabilities); - if (c == NULL) { - return NGX_CONF_ERROR; - } - - *c = *d; - } - } - - size = sizeof("+OK Capability list follows" CRLF) - 1 - + sizeof("." CRLF) - 1; - - stls_only_size = size + sizeof("STLS" CRLF) - 1; - - c = conf->capabilities.elts; - for (i = 0; i < conf->capabilities.nelts; i++) { - size += c[i].len + sizeof(CRLF) - 1; - - if (ngx_strcasecmp(c[i].data, (u_char *) "USER") == 0) { - continue; - } - - stls_only_size += c[i].len + sizeof(CRLF) - 1; - } - - size += sizeof("SASL") - 1 + sizeof(CRLF) - 1; - - for (m = NGX_MAIL_AUTH_PLAIN_ENABLED, i = 0; - m <= NGX_MAIL_AUTH_EXTERNAL_ENABLED; - m <<= 1, i++) - { - if (ngx_mail_pop3_auth_methods_names[i].len == 0) { - continue; - } - - if (m & conf->auth_methods) { - size += 1 + ngx_mail_pop3_auth_methods_names[i].len; - } - } - - p = ngx_pnalloc(cf->pool, size); - if (p == NULL) { - return NGX_CONF_ERROR; - } - - conf->capability.len = size; - conf->capability.data = p; - - p = ngx_cpymem(p, "+OK Capability list follows" CRLF, - sizeof("+OK Capability list follows" CRLF) - 1); - - for (i = 0; i < conf->capabilities.nelts; i++) { - p = ngx_cpymem(p, c[i].data, c[i].len); - *p++ = CR; *p++ = LF; - } - - p = ngx_cpymem(p, "SASL", sizeof("SASL") - 1); - - for (m = NGX_MAIL_AUTH_PLAIN_ENABLED, i = 0; - m <= NGX_MAIL_AUTH_EXTERNAL_ENABLED; - m <<= 1, i++) - { - if (ngx_mail_pop3_auth_methods_names[i].len == 0) { - continue; - } - - if (m & conf->auth_methods) { - *p++ = ' '; - p = ngx_cpymem(p, ngx_mail_pop3_auth_methods_names[i].data, - ngx_mail_pop3_auth_methods_names[i].len); - } - } - - *p++ = CR; *p++ = LF; - - *p++ = '.'; *p++ = CR; *p = LF; - - - size += sizeof("STLS" CRLF) - 1; - - p = ngx_pnalloc(cf->pool, size); - if (p == NULL) { - return NGX_CONF_ERROR; - } - - conf->starttls_capability.len = size; - conf->starttls_capability.data = p; - - p = ngx_cpymem(p, conf->capability.data, - conf->capability.len - (sizeof("." CRLF) - 1)); - - p = ngx_cpymem(p, "STLS" CRLF, sizeof("STLS" CRLF) - 1); - *p++ = '.'; *p++ = CR; *p = LF; - - - size = sizeof("+OK methods supported:" CRLF) - 1 - + sizeof("." CRLF) - 1; - - for (m = NGX_MAIL_AUTH_PLAIN_ENABLED, i = 0; - m <= NGX_MAIL_AUTH_EXTERNAL_ENABLED; - m <<= 1, i++) - { - if (ngx_mail_pop3_auth_methods_names[i].len == 0) { - continue; - } - - if (m & conf->auth_methods) { - size += ngx_mail_pop3_auth_methods_names[i].len - + sizeof(CRLF) - 1; - } - } - - p = ngx_pnalloc(cf->pool, size); - if (p == NULL) { - return NGX_CONF_ERROR; - } - - conf->auth_capability.data = p; - conf->auth_capability.len = size; - - p = ngx_cpymem(p, "+OK methods supported:" CRLF, - sizeof("+OK methods supported:" CRLF) - 1); - - for (m = NGX_MAIL_AUTH_PLAIN_ENABLED, i = 0; - m <= NGX_MAIL_AUTH_EXTERNAL_ENABLED; - m <<= 1, i++) - { - if (ngx_mail_pop3_auth_methods_names[i].len == 0) { - continue; - } - - if (m & conf->auth_methods) { - p = ngx_cpymem(p, ngx_mail_pop3_auth_methods_names[i].data, - ngx_mail_pop3_auth_methods_names[i].len); - *p++ = CR; *p++ = LF; - } - } - - *p++ = '.'; *p++ = CR; *p = LF; - - - p = ngx_pnalloc(cf->pool, stls_only_size); - if (p == NULL) { - return NGX_CONF_ERROR; - } - - conf->starttls_only_capability.len = stls_only_size; - conf->starttls_only_capability.data = p; - - p = ngx_cpymem(p, "+OK Capability list follows" CRLF, - sizeof("+OK Capability list follows" CRLF) - 1); - - for (i = 0; i < conf->capabilities.nelts; i++) { - if (ngx_strcasecmp(c[i].data, (u_char *) "USER") == 0) { - continue; - } - - p = ngx_cpymem(p, c[i].data, c[i].len); - *p++ = CR; *p++ = LF; - } - - p = ngx_cpymem(p, "STLS" CRLF, sizeof("STLS" CRLF) - 1); - *p++ = '.'; *p++ = CR; *p = LF; - - return NGX_CONF_OK; -} diff --git a/src/deps/src/nginx-1.30.3/src/mail/ngx_mail_pop3_module.h b/src/deps/src/nginx-1.30.3/src/mail/ngx_mail_pop3_module.h deleted file mode 100644 index 86947a7725..0000000000 --- a/src/deps/src/nginx-1.30.3/src/mail/ngx_mail_pop3_module.h +++ /dev/null @@ -1,38 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#ifndef _NGX_MAIL_POP3_MODULE_H_INCLUDED_ -#define _NGX_MAIL_POP3_MODULE_H_INCLUDED_ - - -#include -#include -#include - - -typedef struct { - ngx_str_t capability; - ngx_str_t starttls_capability; - ngx_str_t starttls_only_capability; - ngx_str_t auth_capability; - - ngx_uint_t auth_methods; - - ngx_array_t capabilities; -} ngx_mail_pop3_srv_conf_t; - - -void ngx_mail_pop3_init_session(ngx_mail_session_t *s, ngx_connection_t *c); -void ngx_mail_pop3_init_protocol(ngx_event_t *rev); -void ngx_mail_pop3_auth_state(ngx_event_t *rev); -ngx_int_t ngx_mail_pop3_parse_command(ngx_mail_session_t *s); - - -extern ngx_module_t ngx_mail_pop3_module; - - -#endif /* _NGX_MAIL_POP3_MODULE_H_INCLUDED_ */ diff --git a/src/deps/src/nginx-1.30.3/src/mail/ngx_mail_proxy_module.c b/src/deps/src/nginx-1.30.3/src/mail/ngx_mail_proxy_module.c deleted file mode 100644 index 84a7f61a4a..0000000000 --- a/src/deps/src/nginx-1.30.3/src/mail/ngx_mail_proxy_module.c +++ /dev/null @@ -1,1411 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#include -#include -#include -#include -#include - - -typedef struct { - ngx_flag_t enable; - ngx_flag_t pass_error_message; - ngx_flag_t xclient; - ngx_flag_t smtp_auth; - ngx_flag_t proxy_protocol; - size_t buffer_size; - ngx_msec_t timeout; -} ngx_mail_proxy_conf_t; - - -static void ngx_mail_proxy_block_read(ngx_event_t *rev); -static void ngx_mail_proxy_pop3_handler(ngx_event_t *rev); -static void ngx_mail_proxy_imap_handler(ngx_event_t *rev); -static void ngx_mail_proxy_smtp_handler(ngx_event_t *rev); -static void ngx_mail_proxy_write_handler(ngx_event_t *wev); -static ngx_int_t ngx_mail_proxy_send_proxy_protocol(ngx_mail_session_t *s); -static ngx_int_t ngx_mail_proxy_read_response(ngx_mail_session_t *s, - ngx_uint_t state); -static void ngx_mail_proxy_handler(ngx_event_t *ev); -static void ngx_mail_proxy_upstream_error(ngx_mail_session_t *s); -static void ngx_mail_proxy_internal_server_error(ngx_mail_session_t *s); -static void ngx_mail_proxy_close_session(ngx_mail_session_t *s); -static void *ngx_mail_proxy_create_conf(ngx_conf_t *cf); -static char *ngx_mail_proxy_merge_conf(ngx_conf_t *cf, void *parent, - void *child); - - -static ngx_command_t ngx_mail_proxy_commands[] = { - - { ngx_string("proxy"), - NGX_MAIL_MAIN_CONF|NGX_MAIL_SRV_CONF|NGX_CONF_FLAG, - ngx_conf_set_flag_slot, - NGX_MAIL_SRV_CONF_OFFSET, - offsetof(ngx_mail_proxy_conf_t, enable), - NULL }, - - { ngx_string("proxy_buffer"), - NGX_MAIL_MAIN_CONF|NGX_MAIL_SRV_CONF|NGX_CONF_TAKE1, - ngx_conf_set_size_slot, - NGX_MAIL_SRV_CONF_OFFSET, - offsetof(ngx_mail_proxy_conf_t, buffer_size), - NULL }, - - { ngx_string("proxy_timeout"), - NGX_MAIL_MAIN_CONF|NGX_MAIL_SRV_CONF|NGX_CONF_TAKE1, - ngx_conf_set_msec_slot, - NGX_MAIL_SRV_CONF_OFFSET, - offsetof(ngx_mail_proxy_conf_t, timeout), - NULL }, - - { ngx_string("proxy_pass_error_message"), - NGX_MAIL_MAIN_CONF|NGX_MAIL_SRV_CONF|NGX_CONF_FLAG, - ngx_conf_set_flag_slot, - NGX_MAIL_SRV_CONF_OFFSET, - offsetof(ngx_mail_proxy_conf_t, pass_error_message), - NULL }, - - { ngx_string("xclient"), - NGX_MAIL_MAIN_CONF|NGX_MAIL_SRV_CONF|NGX_CONF_FLAG, - ngx_conf_set_flag_slot, - NGX_MAIL_SRV_CONF_OFFSET, - offsetof(ngx_mail_proxy_conf_t, xclient), - NULL }, - - { ngx_string("proxy_smtp_auth"), - NGX_MAIL_MAIN_CONF|NGX_MAIL_SRV_CONF|NGX_CONF_FLAG, - ngx_conf_set_flag_slot, - NGX_MAIL_SRV_CONF_OFFSET, - offsetof(ngx_mail_proxy_conf_t, smtp_auth), - NULL }, - - { ngx_string("proxy_protocol"), - NGX_MAIL_MAIN_CONF|NGX_MAIL_SRV_CONF|NGX_CONF_FLAG, - ngx_conf_set_flag_slot, - NGX_MAIL_SRV_CONF_OFFSET, - offsetof(ngx_mail_proxy_conf_t, proxy_protocol), - NULL }, - - ngx_null_command -}; - - -static ngx_mail_module_t ngx_mail_proxy_module_ctx = { - NULL, /* protocol */ - - NULL, /* create main configuration */ - NULL, /* init main configuration */ - - ngx_mail_proxy_create_conf, /* create server configuration */ - ngx_mail_proxy_merge_conf /* merge server configuration */ -}; - - -ngx_module_t ngx_mail_proxy_module = { - NGX_MODULE_V1, - &ngx_mail_proxy_module_ctx, /* module context */ - ngx_mail_proxy_commands, /* module directives */ - NGX_MAIL_MODULE, /* module type */ - NULL, /* init master */ - NULL, /* init module */ - NULL, /* init process */ - NULL, /* init thread */ - NULL, /* exit thread */ - NULL, /* exit process */ - NULL, /* exit master */ - NGX_MODULE_V1_PADDING -}; - - -static u_char smtp_auth_ok[] = "235 2.0.0 OK" CRLF; - - -void -ngx_mail_proxy_init(ngx_mail_session_t *s, ngx_addr_t *peer) -{ - ngx_int_t rc; - ngx_mail_proxy_ctx_t *p; - ngx_mail_proxy_conf_t *pcf; - ngx_mail_core_srv_conf_t *cscf; - - s->connection->log->action = "connecting to upstream"; - - cscf = ngx_mail_get_module_srv_conf(s, ngx_mail_core_module); - - p = ngx_pcalloc(s->connection->pool, sizeof(ngx_mail_proxy_ctx_t)); - if (p == NULL) { - ngx_mail_session_internal_server_error(s); - return; - } - - s->proxy = p; - - p->upstream.sockaddr = peer->sockaddr; - p->upstream.socklen = peer->socklen; - p->upstream.name = &peer->name; - p->upstream.get = ngx_event_get_peer; - p->upstream.log = s->connection->log; - p->upstream.log_error = NGX_ERROR_ERR; - - rc = ngx_event_connect_peer(&p->upstream); - - if (rc == NGX_ERROR || rc == NGX_BUSY || rc == NGX_DECLINED) { - ngx_mail_proxy_internal_server_error(s); - return; - } - - ngx_add_timer(p->upstream.connection->read, cscf->timeout); - - p->upstream.connection->data = s; - p->upstream.connection->pool = s->connection->pool; - - s->connection->read->handler = ngx_mail_proxy_block_read; - p->upstream.connection->write->handler = ngx_mail_proxy_write_handler; - - pcf = ngx_mail_get_module_srv_conf(s, ngx_mail_proxy_module); - - s->proxy->buffer = ngx_create_temp_buf(s->connection->pool, - pcf->buffer_size); - if (s->proxy->buffer == NULL) { - ngx_mail_proxy_internal_server_error(s); - return; - } - - s->proxy->proxy_protocol = pcf->proxy_protocol; - - s->out.len = 0; - - switch (s->protocol) { - - case NGX_MAIL_POP3_PROTOCOL: - p->upstream.connection->read->handler = ngx_mail_proxy_pop3_handler; - s->mail_state = ngx_pop3_start; - break; - - case NGX_MAIL_IMAP_PROTOCOL: - p->upstream.connection->read->handler = ngx_mail_proxy_imap_handler; - s->mail_state = ngx_imap_start; - break; - - default: /* NGX_MAIL_SMTP_PROTOCOL */ - p->upstream.connection->read->handler = ngx_mail_proxy_smtp_handler; - s->mail_state = ngx_smtp_start; - break; - } - - if (rc == NGX_AGAIN) { - return; - } - - ngx_mail_proxy_write_handler(p->upstream.connection->write); -} - - -static void -ngx_mail_proxy_block_read(ngx_event_t *rev) -{ - ngx_connection_t *c; - ngx_mail_session_t *s; - - ngx_log_debug0(NGX_LOG_DEBUG_MAIL, rev->log, 0, "mail proxy block read"); - - if (ngx_handle_read_event(rev, 0) != NGX_OK) { - c = rev->data; - s = c->data; - - ngx_mail_proxy_close_session(s); - } -} - - -static void -ngx_mail_proxy_pop3_handler(ngx_event_t *rev) -{ - u_char *p; - ngx_int_t rc; - ngx_str_t line; - ngx_connection_t *c; - ngx_mail_session_t *s; - ngx_mail_proxy_conf_t *pcf; - - ngx_log_debug0(NGX_LOG_DEBUG_MAIL, rev->log, 0, - "mail proxy pop3 auth handler"); - - c = rev->data; - s = c->data; - - if (rev->timedout) { - ngx_log_error(NGX_LOG_INFO, c->log, NGX_ETIMEDOUT, - "upstream timed out"); - c->timedout = 1; - ngx_mail_proxy_internal_server_error(s); - return; - } - - if (s->proxy->proxy_protocol) { - ngx_log_debug0(NGX_LOG_DEBUG_MAIL, c->log, 0, "mail proxy pop3 busy"); - - if (ngx_handle_read_event(c->read, 0) != NGX_OK) { - ngx_mail_proxy_internal_server_error(s); - return; - } - - return; - } - - rc = ngx_mail_proxy_read_response(s, 0); - - if (rc == NGX_AGAIN) { - if (ngx_handle_read_event(c->read, 0) != NGX_OK) { - ngx_mail_proxy_internal_server_error(s); - return; - } - - return; - } - - if (rc == NGX_ERROR) { - ngx_mail_proxy_upstream_error(s); - return; - } - - switch (s->mail_state) { - - case ngx_pop3_start: - ngx_log_debug0(NGX_LOG_DEBUG_MAIL, rev->log, 0, "mail proxy send user"); - - s->connection->log->action = "sending user name to upstream"; - - line.len = sizeof("USER ") - 1 + s->login.len + 2; - line.data = ngx_pnalloc(c->pool, line.len); - if (line.data == NULL) { - ngx_mail_proxy_internal_server_error(s); - return; - } - - p = ngx_cpymem(line.data, "USER ", sizeof("USER ") - 1); - p = ngx_cpymem(p, s->login.data, s->login.len); - *p++ = CR; *p = LF; - - s->mail_state = ngx_pop3_user; - break; - - case ngx_pop3_user: - ngx_log_debug0(NGX_LOG_DEBUG_MAIL, rev->log, 0, "mail proxy send pass"); - - s->connection->log->action = "sending password to upstream"; - - line.len = sizeof("PASS ") - 1 + s->passwd.len + 2; - line.data = ngx_pnalloc(c->pool, line.len); - if (line.data == NULL) { - ngx_mail_proxy_internal_server_error(s); - return; - } - - p = ngx_cpymem(line.data, "PASS ", sizeof("PASS ") - 1); - p = ngx_cpymem(p, s->passwd.data, s->passwd.len); - *p++ = CR; *p = LF; - - s->mail_state = ngx_pop3_passwd; - break; - - case ngx_pop3_passwd: - s->connection->read->handler = ngx_mail_proxy_handler; - s->connection->write->handler = ngx_mail_proxy_handler; - rev->handler = ngx_mail_proxy_handler; - c->write->handler = ngx_mail_proxy_handler; - - pcf = ngx_mail_get_module_srv_conf(s, ngx_mail_proxy_module); - ngx_add_timer(s->connection->read, pcf->timeout); - ngx_del_timer(c->read); - - c->log->action = NULL; - ngx_log_error(NGX_LOG_INFO, c->log, 0, "client logged in"); - - if (s->buffer->pos < s->buffer->last - || s->connection->read->ready) - { - ngx_post_event(c->write, &ngx_posted_events); - } - - ngx_mail_proxy_handler(s->connection->write); - - return; - - default: -#if (NGX_SUPPRESS_WARN) - ngx_str_null(&line); -#endif - break; - } - - if (c->send(c, line.data, line.len) < (ssize_t) line.len) { - /* - * we treat the incomplete sending as NGX_ERROR - * because it is very strange here - */ - ngx_mail_proxy_internal_server_error(s); - return; - } - - if (ngx_handle_read_event(c->read, 0) != NGX_OK) { - ngx_mail_proxy_internal_server_error(s); - return; - } - - s->proxy->buffer->pos = s->proxy->buffer->start; - s->proxy->buffer->last = s->proxy->buffer->start; -} - - -static void -ngx_mail_proxy_imap_handler(ngx_event_t *rev) -{ - u_char *p; - ngx_int_t rc; - ngx_str_t line; - ngx_connection_t *c; - ngx_mail_session_t *s; - ngx_mail_proxy_conf_t *pcf; - - ngx_log_debug0(NGX_LOG_DEBUG_MAIL, rev->log, 0, - "mail proxy imap auth handler"); - - c = rev->data; - s = c->data; - - if (rev->timedout) { - ngx_log_error(NGX_LOG_INFO, c->log, NGX_ETIMEDOUT, - "upstream timed out"); - c->timedout = 1; - ngx_mail_proxy_internal_server_error(s); - return; - } - - if (s->proxy->proxy_protocol) { - ngx_log_debug0(NGX_LOG_DEBUG_MAIL, c->log, 0, "mail proxy imap busy"); - - if (ngx_handle_read_event(c->read, 0) != NGX_OK) { - ngx_mail_proxy_internal_server_error(s); - return; - } - - return; - } - - rc = ngx_mail_proxy_read_response(s, s->mail_state); - - if (rc == NGX_AGAIN) { - if (ngx_handle_read_event(c->read, 0) != NGX_OK) { - ngx_mail_proxy_internal_server_error(s); - return; - } - - return; - } - - if (rc == NGX_ERROR) { - ngx_mail_proxy_upstream_error(s); - return; - } - - switch (s->mail_state) { - - case ngx_imap_start: - ngx_log_debug0(NGX_LOG_DEBUG_MAIL, rev->log, 0, - "mail proxy send login"); - - s->connection->log->action = "sending LOGIN command to upstream"; - - line.len = s->tag.len + sizeof("LOGIN ") - 1 - + 1 + NGX_SIZE_T_LEN + 1 + 2; - line.data = ngx_pnalloc(c->pool, line.len); - if (line.data == NULL) { - ngx_mail_proxy_internal_server_error(s); - return; - } - - line.len = ngx_sprintf(line.data, "%VLOGIN {%uz}" CRLF, - &s->tag, s->login.len) - - line.data; - - s->mail_state = ngx_imap_login; - break; - - case ngx_imap_login: - ngx_log_debug0(NGX_LOG_DEBUG_MAIL, rev->log, 0, "mail proxy send user"); - - s->connection->log->action = "sending user name to upstream"; - - line.len = s->login.len + 1 + 1 + NGX_SIZE_T_LEN + 1 + 2; - line.data = ngx_pnalloc(c->pool, line.len); - if (line.data == NULL) { - ngx_mail_proxy_internal_server_error(s); - return; - } - - line.len = ngx_sprintf(line.data, "%V {%uz}" CRLF, - &s->login, s->passwd.len) - - line.data; - - s->mail_state = ngx_imap_user; - break; - - case ngx_imap_user: - ngx_log_debug0(NGX_LOG_DEBUG_MAIL, rev->log, 0, - "mail proxy send passwd"); - - s->connection->log->action = "sending password to upstream"; - - line.len = s->passwd.len + 2; - line.data = ngx_pnalloc(c->pool, line.len); - if (line.data == NULL) { - ngx_mail_proxy_internal_server_error(s); - return; - } - - p = ngx_cpymem(line.data, s->passwd.data, s->passwd.len); - *p++ = CR; *p = LF; - - s->mail_state = ngx_imap_passwd; - break; - - case ngx_imap_passwd: - s->connection->read->handler = ngx_mail_proxy_handler; - s->connection->write->handler = ngx_mail_proxy_handler; - rev->handler = ngx_mail_proxy_handler; - c->write->handler = ngx_mail_proxy_handler; - - pcf = ngx_mail_get_module_srv_conf(s, ngx_mail_proxy_module); - ngx_add_timer(s->connection->read, pcf->timeout); - ngx_del_timer(c->read); - - c->log->action = NULL; - ngx_log_error(NGX_LOG_INFO, c->log, 0, "client logged in"); - - if (s->buffer->pos < s->buffer->last - || s->connection->read->ready) - { - ngx_post_event(c->write, &ngx_posted_events); - } - - ngx_mail_proxy_handler(s->connection->write); - - return; - - default: -#if (NGX_SUPPRESS_WARN) - ngx_str_null(&line); -#endif - break; - } - - if (c->send(c, line.data, line.len) < (ssize_t) line.len) { - /* - * we treat the incomplete sending as NGX_ERROR - * because it is very strange here - */ - ngx_mail_proxy_internal_server_error(s); - return; - } - - if (ngx_handle_read_event(c->read, 0) != NGX_OK) { - ngx_mail_proxy_internal_server_error(s); - return; - } - - s->proxy->buffer->pos = s->proxy->buffer->start; - s->proxy->buffer->last = s->proxy->buffer->start; -} - - -static void -ngx_mail_proxy_smtp_handler(ngx_event_t *rev) -{ - u_char *p; - ngx_int_t rc; - ngx_str_t line, auth, encoded; - ngx_buf_t *b; - uintptr_t n; - ngx_connection_t *c; - ngx_mail_session_t *s; - ngx_mail_proxy_conf_t *pcf; - ngx_mail_core_srv_conf_t *cscf; - - ngx_log_debug0(NGX_LOG_DEBUG_MAIL, rev->log, 0, - "mail proxy smtp auth handler"); - - c = rev->data; - s = c->data; - - if (rev->timedout) { - ngx_log_error(NGX_LOG_INFO, c->log, NGX_ETIMEDOUT, - "upstream timed out"); - c->timedout = 1; - ngx_mail_proxy_internal_server_error(s); - return; - } - - if (s->proxy->proxy_protocol) { - ngx_log_debug0(NGX_LOG_DEBUG_MAIL, c->log, 0, "mail proxy smtp busy"); - - if (ngx_handle_read_event(c->read, 0) != NGX_OK) { - ngx_mail_proxy_internal_server_error(s); - return; - } - - return; - } - - rc = ngx_mail_proxy_read_response(s, s->mail_state); - - if (rc == NGX_AGAIN) { - if (ngx_handle_read_event(c->read, 0) != NGX_OK) { - ngx_mail_proxy_internal_server_error(s); - return; - } - - return; - } - - if (rc == NGX_ERROR) { - ngx_mail_proxy_upstream_error(s); - return; - } - - switch (s->mail_state) { - - case ngx_smtp_start: - ngx_log_debug0(NGX_LOG_DEBUG_MAIL, rev->log, 0, "mail proxy send ehlo"); - - s->connection->log->action = "sending HELO/EHLO to upstream"; - - cscf = ngx_mail_get_module_srv_conf(s, ngx_mail_core_module); - - line.len = sizeof("HELO ") - 1 + cscf->server_name.len + 2; - line.data = ngx_pnalloc(c->pool, line.len); - if (line.data == NULL) { - ngx_mail_proxy_internal_server_error(s); - return; - } - - pcf = ngx_mail_get_module_srv_conf(s, ngx_mail_proxy_module); - - p = ngx_cpymem(line.data, - ((s->esmtp || pcf->xclient) ? "EHLO " : "HELO "), - sizeof("HELO ") - 1); - - p = ngx_cpymem(p, cscf->server_name.data, cscf->server_name.len); - *p++ = CR; *p = LF; - - if (pcf->xclient) { - s->mail_state = ngx_smtp_helo_xclient; - - } else if (s->auth_method == NGX_MAIL_AUTH_NONE) { - s->mail_state = ngx_smtp_helo_from; - - } else if (pcf->smtp_auth) { - s->mail_state = ngx_smtp_helo_auth; - - } else { - s->mail_state = ngx_smtp_helo; - } - - break; - - case ngx_smtp_helo_xclient: - ngx_log_debug0(NGX_LOG_DEBUG_MAIL, rev->log, 0, - "mail proxy send xclient"); - - s->connection->log->action = "sending XCLIENT to upstream"; - - line.len = sizeof("XCLIENT ADDR= LOGIN= NAME=" - CRLF) - 1 - + s->connection->addr_text.len + s->login.len + s->host.len; - - n = ngx_escape_uri(NULL, s->login.data, s->login.len, - NGX_ESCAPE_MAIL_XTEXT); - line.len += n * 2; - -#if (NGX_HAVE_INET6) - if (s->connection->sockaddr->sa_family == AF_INET6) { - line.len += sizeof("IPV6:") - 1; - } -#endif - - line.data = ngx_pnalloc(c->pool, line.len); - if (line.data == NULL) { - ngx_mail_proxy_internal_server_error(s); - return; - } - - p = ngx_cpymem(line.data, "XCLIENT ADDR=", sizeof("XCLIENT ADDR=") - 1); - -#if (NGX_HAVE_INET6) - if (s->connection->sockaddr->sa_family == AF_INET6) { - p = ngx_cpymem(p, "IPV6:", sizeof("IPV6:") - 1); - } -#endif - - p = ngx_copy(p, s->connection->addr_text.data, - s->connection->addr_text.len); - - pcf = ngx_mail_get_module_srv_conf(s, ngx_mail_proxy_module); - - if (s->login.len && !pcf->smtp_auth) { - p = ngx_cpymem(p, " LOGIN=", sizeof(" LOGIN=") - 1); - - if (n == 0) { - p = ngx_copy(p, s->login.data, s->login.len); - - } else { - p = (u_char *) ngx_escape_uri(p, s->login.data, s->login.len, - NGX_ESCAPE_MAIL_XTEXT); - } - } - - p = ngx_cpymem(p, " NAME=", sizeof(" NAME=") - 1); - p = ngx_copy(p, s->host.data, s->host.len); - - *p++ = CR; *p++ = LF; - - line.len = p - line.data; - - if (s->smtp_helo.len) { - s->mail_state = ngx_smtp_xclient_helo; - - } else if (s->auth_method == NGX_MAIL_AUTH_NONE) { - s->mail_state = ngx_smtp_xclient_from; - - } else if (pcf->smtp_auth) { - s->mail_state = ngx_smtp_xclient_auth; - - } else { - s->mail_state = ngx_smtp_xclient; - } - - break; - - case ngx_smtp_xclient_helo: - ngx_log_debug0(NGX_LOG_DEBUG_MAIL, rev->log, 0, - "mail proxy send client ehlo"); - - s->connection->log->action = "sending client HELO/EHLO to upstream"; - - line.len = sizeof("HELO " CRLF) - 1 + s->smtp_helo.len; - - line.data = ngx_pnalloc(c->pool, line.len); - if (line.data == NULL) { - ngx_mail_proxy_internal_server_error(s); - return; - } - - line.len = ngx_sprintf(line.data, - ((s->esmtp) ? "EHLO %V" CRLF : "HELO %V" CRLF), - &s->smtp_helo) - - line.data; - - pcf = ngx_mail_get_module_srv_conf(s, ngx_mail_proxy_module); - - if (s->auth_method == NGX_MAIL_AUTH_NONE) { - s->mail_state = ngx_smtp_helo_from; - - } else if (pcf->smtp_auth) { - s->mail_state = ngx_smtp_helo_auth; - - } else { - s->mail_state = ngx_smtp_helo; - } - - break; - - case ngx_smtp_helo_auth: - case ngx_smtp_xclient_auth: - ngx_log_debug0(NGX_LOG_DEBUG_MAIL, rev->log, 0, - "mail proxy send auth"); - - s->connection->log->action = "sending AUTH to upstream"; - - if (s->passwd.data == NULL) { - ngx_log_error(NGX_LOG_ERR, s->connection->log, 0, - "no password available"); - ngx_mail_proxy_internal_server_error(s); - return; - } - - auth.len = 1 + s->login.len + 1 + s->passwd.len; - auth.data = ngx_pnalloc(c->pool, auth.len); - if (auth.data == NULL) { - ngx_mail_proxy_internal_server_error(s); - return; - } - - auth.len = ngx_sprintf(auth.data, "%Z%V%Z%V", &s->login, &s->passwd) - - auth.data; - - line.len = sizeof("AUTH PLAIN " CRLF) - 1 - + ngx_base64_encoded_length(auth.len); - - line.data = ngx_pnalloc(c->pool, line.len); - if (line.data == NULL) { - ngx_mail_proxy_internal_server_error(s); - return; - } - - encoded.data = ngx_cpymem(line.data, "AUTH PLAIN ", - sizeof("AUTH PLAIN ") - 1); - - ngx_encode_base64(&encoded, &auth); - - p = encoded.data + encoded.len; - *p++ = CR; *p = LF; - - s->mail_state = ngx_smtp_auth_plain; - - break; - - case ngx_smtp_helo_from: - case ngx_smtp_xclient_from: - ngx_log_debug0(NGX_LOG_DEBUG_MAIL, rev->log, 0, - "mail proxy send mail from"); - - s->connection->log->action = "sending MAIL FROM to upstream"; - - line.len = s->smtp_from.len + sizeof(CRLF) - 1; - line.data = ngx_pnalloc(c->pool, line.len); - if (line.data == NULL) { - ngx_mail_proxy_internal_server_error(s); - return; - } - - p = ngx_cpymem(line.data, s->smtp_from.data, s->smtp_from.len); - *p++ = CR; *p = LF; - - s->mail_state = ngx_smtp_from; - - break; - - case ngx_smtp_from: - ngx_log_debug0(NGX_LOG_DEBUG_MAIL, rev->log, 0, - "mail proxy send rcpt to"); - - s->connection->log->action = "sending RCPT TO to upstream"; - - line.len = s->smtp_to.len + sizeof(CRLF) - 1; - line.data = ngx_pnalloc(c->pool, line.len); - if (line.data == NULL) { - ngx_mail_proxy_internal_server_error(s); - return; - } - - p = ngx_cpymem(line.data, s->smtp_to.data, s->smtp_to.len); - *p++ = CR; *p = LF; - - s->mail_state = ngx_smtp_to; - - break; - - case ngx_smtp_helo: - case ngx_smtp_xclient: - case ngx_smtp_auth_plain: - case ngx_smtp_to: - - b = s->proxy->buffer; - - if (s->auth_method == NGX_MAIL_AUTH_NONE) { - b->pos = b->start; - - } else { - ngx_memcpy(b->start, smtp_auth_ok, sizeof(smtp_auth_ok) - 1); - b->last = b->start + sizeof(smtp_auth_ok) - 1; - } - - s->connection->read->handler = ngx_mail_proxy_handler; - s->connection->write->handler = ngx_mail_proxy_handler; - rev->handler = ngx_mail_proxy_handler; - c->write->handler = ngx_mail_proxy_handler; - - pcf = ngx_mail_get_module_srv_conf(s, ngx_mail_proxy_module); - ngx_add_timer(s->connection->read, pcf->timeout); - ngx_del_timer(c->read); - - c->log->action = NULL; - ngx_log_error(NGX_LOG_INFO, c->log, 0, "client logged in"); - - if (s->buffer->pos < s->buffer->last - || s->connection->read->ready) - { - ngx_post_event(c->write, &ngx_posted_events); - } - - ngx_mail_proxy_handler(s->connection->write); - - return; - - default: -#if (NGX_SUPPRESS_WARN) - ngx_str_null(&line); -#endif - break; - } - - if (c->send(c, line.data, line.len) < (ssize_t) line.len) { - /* - * we treat the incomplete sending as NGX_ERROR - * because it is very strange here - */ - ngx_mail_proxy_internal_server_error(s); - return; - } - - if (ngx_handle_read_event(c->read, 0) != NGX_OK) { - ngx_mail_proxy_internal_server_error(s); - return; - } - - s->proxy->buffer->pos = s->proxy->buffer->start; - s->proxy->buffer->last = s->proxy->buffer->start; -} - - -static void -ngx_mail_proxy_write_handler(ngx_event_t *wev) -{ - ngx_connection_t *c; - ngx_mail_session_t *s; - - ngx_log_debug0(NGX_LOG_DEBUG_MAIL, wev->log, 0, "mail proxy write handler"); - - c = wev->data; - s = c->data; - - if (s->proxy->proxy_protocol) { - if (ngx_mail_proxy_send_proxy_protocol(s) != NGX_OK) { - return; - } - - s->proxy->proxy_protocol = 0; - } - - if (ngx_handle_write_event(wev, 0) != NGX_OK) { - ngx_mail_proxy_internal_server_error(s); - } - - if (c->read->ready) { - ngx_post_event(c->read, &ngx_posted_events); - } -} - - -static ngx_int_t -ngx_mail_proxy_send_proxy_protocol(ngx_mail_session_t *s) -{ - u_char *p; - ssize_t n, size; - ngx_connection_t *c; - u_char buf[NGX_PROXY_PROTOCOL_V1_MAX_HEADER]; - - s->connection->log->action = "sending PROXY protocol header to upstream"; - - ngx_log_debug0(NGX_LOG_DEBUG_MAIL, s->connection->log, 0, - "mail proxy send PROXY protocol header"); - - p = ngx_proxy_protocol_write(s->connection, buf, - buf + NGX_PROXY_PROTOCOL_V1_MAX_HEADER); - if (p == NULL) { - ngx_mail_proxy_internal_server_error(s); - return NGX_ERROR; - } - - c = s->proxy->upstream.connection; - - size = p - buf; - - n = c->send(c, buf, size); - - if (n == NGX_AGAIN) { - if (ngx_handle_write_event(c->write, 0) != NGX_OK) { - ngx_mail_proxy_internal_server_error(s); - return NGX_ERROR; - } - - return NGX_AGAIN; - } - - if (n == NGX_ERROR) { - ngx_mail_proxy_internal_server_error(s); - return NGX_ERROR; - } - - if (n != size) { - - /* - * PROXY protocol specification: - * The sender must always ensure that the header - * is sent at once, so that the transport layer - * maintains atomicity along the path to the receiver. - */ - - ngx_log_error(NGX_LOG_ERR, s->connection->log, 0, - "could not send PROXY protocol header at once"); - - ngx_mail_proxy_internal_server_error(s); - - return NGX_ERROR; - } - - return NGX_OK; -} - - -static ngx_int_t -ngx_mail_proxy_read_response(ngx_mail_session_t *s, ngx_uint_t state) -{ - u_char *p, *m; - ssize_t n; - ngx_buf_t *b; - ngx_mail_proxy_conf_t *pcf; - - s->connection->log->action = "reading response from upstream"; - - b = s->proxy->buffer; - - n = s->proxy->upstream.connection->recv(s->proxy->upstream.connection, - b->last, b->end - b->last); - - if (n == NGX_ERROR || n == 0) { - return NGX_ERROR; - } - - if (n == NGX_AGAIN) { - return NGX_AGAIN; - } - - b->last += n; - - if (b->last - b->pos < 4) { - return NGX_AGAIN; - } - - if (*(b->last - 2) != CR || *(b->last - 1) != LF) { - if (b->last == b->end) { - *(b->last - 1) = '\0'; - ngx_log_error(NGX_LOG_ERR, s->connection->log, 0, - "upstream sent too long response line: \"%s\"", - b->pos); - return NGX_ERROR; - } - - return NGX_AGAIN; - } - - p = b->pos; - - switch (s->protocol) { - - case NGX_MAIL_POP3_PROTOCOL: - if (p[0] == '+' && p[1] == 'O' && p[2] == 'K') { - return NGX_OK; - } - break; - - case NGX_MAIL_IMAP_PROTOCOL: - switch (state) { - - case ngx_imap_start: - if (p[0] == '*' && p[1] == ' ' && p[2] == 'O' && p[3] == 'K') { - return NGX_OK; - } - break; - - case ngx_imap_login: - case ngx_imap_user: - if (p[0] == '+') { - return NGX_OK; - } - break; - - case ngx_imap_passwd: - - /* - * untagged CAPABILITY response (draft-crispin-imapv-16), - * known to be sent by SmarterMail and Gmail - */ - - if (p[0] == '*' && p[1] == ' ') { - p += 2; - - while (p < b->last - 1) { - if (p[0] == CR && p[1] == LF) { - p += 2; - break; - } - - p++; - } - - if (b->last - p < 4) { - return NGX_AGAIN; - } - } - - if (ngx_strncmp(p, s->tag.data, s->tag.len) == 0) { - p += s->tag.len; - if (p[0] == 'O' && p[1] == 'K') { - return NGX_OK; - } - } - - break; - } - - break; - - default: /* NGX_MAIL_SMTP_PROTOCOL */ - - if (p[3] == '-') { - /* multiline reply, check if we got last line */ - - m = b->last - (sizeof(CRLF "200" CRLF) - 1); - - while (m > p) { - if (m[0] == CR && m[1] == LF) { - break; - } - - m--; - } - - if (m <= p || m[5] == '-') { - return NGX_AGAIN; - } - } - - switch (state) { - - case ngx_smtp_start: - if (p[0] == '2' && p[1] == '2' && p[2] == '0') { - return NGX_OK; - } - break; - - case ngx_smtp_helo: - case ngx_smtp_helo_xclient: - case ngx_smtp_helo_from: - case ngx_smtp_helo_auth: - case ngx_smtp_from: - if (p[0] == '2' && p[1] == '5' && p[2] == '0') { - return NGX_OK; - } - break; - - case ngx_smtp_xclient: - case ngx_smtp_xclient_from: - case ngx_smtp_xclient_helo: - case ngx_smtp_xclient_auth: - if (p[0] == '2' && (p[1] == '2' || p[1] == '5') && p[2] == '0') { - return NGX_OK; - } - break; - - case ngx_smtp_auth_plain: - if (p[0] == '2' && p[1] == '3' && p[2] == '5') { - return NGX_OK; - } - break; - - case ngx_smtp_to: - return NGX_OK; - } - - break; - } - - pcf = ngx_mail_get_module_srv_conf(s, ngx_mail_proxy_module); - - if (pcf->pass_error_message == 0) { - *(b->last - 2) = '\0'; - ngx_log_error(NGX_LOG_ERR, s->connection->log, 0, - "upstream sent invalid response: \"%s\"", p); - return NGX_ERROR; - } - - s->out.len = b->last - p - 2; - s->out.data = p; - - ngx_log_error(NGX_LOG_INFO, s->connection->log, 0, - "upstream sent invalid response: \"%V\"", &s->out); - - s->out.len = b->last - b->pos; - s->out.data = b->pos; - - return NGX_ERROR; -} - - -static void -ngx_mail_proxy_handler(ngx_event_t *ev) -{ - char *action, *recv_action, *send_action; - size_t size; - ssize_t n; - ngx_buf_t *b; - ngx_uint_t do_write; - ngx_connection_t *c, *src, *dst; - ngx_mail_session_t *s; - ngx_mail_proxy_conf_t *pcf; - - c = ev->data; - s = c->data; - - if (ev->timedout || c->close) { - c->log->action = "proxying"; - - if (c->close) { - ngx_log_error(NGX_LOG_INFO, c->log, 0, "shutdown timeout"); - - } else if (c == s->connection) { - ngx_log_error(NGX_LOG_INFO, c->log, NGX_ETIMEDOUT, - "client timed out"); - c->timedout = 1; - - } else { - ngx_log_error(NGX_LOG_INFO, c->log, NGX_ETIMEDOUT, - "upstream timed out"); - } - - ngx_mail_proxy_close_session(s); - return; - } - - if (c == s->connection) { - if (ev->write) { - recv_action = "proxying and reading from upstream"; - send_action = "proxying and sending to client"; - src = s->proxy->upstream.connection; - dst = c; - b = s->proxy->buffer; - - } else { - recv_action = "proxying and reading from client"; - send_action = "proxying and sending to upstream"; - src = c; - dst = s->proxy->upstream.connection; - b = s->buffer; - } - - } else { - if (ev->write) { - recv_action = "proxying and reading from client"; - send_action = "proxying and sending to upstream"; - src = s->connection; - dst = c; - b = s->buffer; - - } else { - recv_action = "proxying and reading from upstream"; - send_action = "proxying and sending to client"; - src = c; - dst = s->connection; - b = s->proxy->buffer; - } - } - - do_write = ev->write ? 1 : 0; - - ngx_log_debug3(NGX_LOG_DEBUG_MAIL, ev->log, 0, - "mail proxy handler: %ui, #%d > #%d", - do_write, src->fd, dst->fd); - - for ( ;; ) { - - if (do_write) { - - size = b->last - b->pos; - - if (size && dst->write->ready) { - c->log->action = send_action; - - n = dst->send(dst, b->pos, size); - - if (n == NGX_ERROR) { - ngx_mail_proxy_close_session(s); - return; - } - - if (n > 0) { - b->pos += n; - - if (b->pos == b->last) { - b->pos = b->start; - b->last = b->start; - } - } - } - } - - size = b->end - b->last; - - if (size && src->read->ready) { - c->log->action = recv_action; - - n = src->recv(src, b->last, size); - - if (n == NGX_AGAIN || n == 0) { - break; - } - - if (n > 0) { - do_write = 1; - b->last += n; - - continue; - } - - if (n == NGX_ERROR) { - src->read->eof = 1; - } - } - - break; - } - - c->log->action = "proxying"; - - if ((s->connection->read->eof && s->buffer->pos == s->buffer->last) - || (s->proxy->upstream.connection->read->eof - && s->proxy->buffer->pos == s->proxy->buffer->last) - || (s->connection->read->eof - && s->proxy->upstream.connection->read->eof)) - { - action = c->log->action; - c->log->action = NULL; - ngx_log_error(NGX_LOG_INFO, c->log, 0, "proxied session done"); - c->log->action = action; - - ngx_mail_proxy_close_session(s); - return; - } - - if (ngx_handle_write_event(dst->write, 0) != NGX_OK) { - ngx_mail_proxy_close_session(s); - return; - } - - if (ngx_handle_read_event(dst->read, 0) != NGX_OK) { - ngx_mail_proxy_close_session(s); - return; - } - - if (ngx_handle_write_event(src->write, 0) != NGX_OK) { - ngx_mail_proxy_close_session(s); - return; - } - - if (ngx_handle_read_event(src->read, 0) != NGX_OK) { - ngx_mail_proxy_close_session(s); - return; - } - - if (c == s->connection) { - pcf = ngx_mail_get_module_srv_conf(s, ngx_mail_proxy_module); - ngx_add_timer(c->read, pcf->timeout); - } -} - - -static void -ngx_mail_proxy_upstream_error(ngx_mail_session_t *s) -{ - if (s->proxy->upstream.connection) { - ngx_log_debug1(NGX_LOG_DEBUG_MAIL, s->connection->log, 0, - "close mail proxy connection: %d", - s->proxy->upstream.connection->fd); - - ngx_close_connection(s->proxy->upstream.connection); - } - - if (s->out.len == 0) { - ngx_mail_session_internal_server_error(s); - return; - } - - s->quit = 1; - ngx_mail_send(s->connection->write); -} - - -static void -ngx_mail_proxy_internal_server_error(ngx_mail_session_t *s) -{ - if (s->proxy->upstream.connection) { - ngx_log_debug1(NGX_LOG_DEBUG_MAIL, s->connection->log, 0, - "close mail proxy connection: %d", - s->proxy->upstream.connection->fd); - - ngx_close_connection(s->proxy->upstream.connection); - } - - ngx_mail_session_internal_server_error(s); -} - - -static void -ngx_mail_proxy_close_session(ngx_mail_session_t *s) -{ - if (s->proxy->upstream.connection) { - ngx_log_debug1(NGX_LOG_DEBUG_MAIL, s->connection->log, 0, - "close mail proxy connection: %d", - s->proxy->upstream.connection->fd); - - ngx_close_connection(s->proxy->upstream.connection); - } - - ngx_mail_close_connection(s->connection); -} - - -static void * -ngx_mail_proxy_create_conf(ngx_conf_t *cf) -{ - ngx_mail_proxy_conf_t *pcf; - - pcf = ngx_pcalloc(cf->pool, sizeof(ngx_mail_proxy_conf_t)); - if (pcf == NULL) { - return NULL; - } - - pcf->enable = NGX_CONF_UNSET; - pcf->pass_error_message = NGX_CONF_UNSET; - pcf->xclient = NGX_CONF_UNSET; - pcf->smtp_auth = NGX_CONF_UNSET; - pcf->proxy_protocol = NGX_CONF_UNSET; - pcf->buffer_size = NGX_CONF_UNSET_SIZE; - pcf->timeout = NGX_CONF_UNSET_MSEC; - - return pcf; -} - - -static char * -ngx_mail_proxy_merge_conf(ngx_conf_t *cf, void *parent, void *child) -{ - ngx_mail_proxy_conf_t *prev = parent; - ngx_mail_proxy_conf_t *conf = child; - - ngx_conf_merge_value(conf->enable, prev->enable, 0); - ngx_conf_merge_value(conf->pass_error_message, prev->pass_error_message, 0); - ngx_conf_merge_value(conf->xclient, prev->xclient, 1); - ngx_conf_merge_value(conf->smtp_auth, prev->smtp_auth, 0); - ngx_conf_merge_value(conf->proxy_protocol, prev->proxy_protocol, 0); - ngx_conf_merge_size_value(conf->buffer_size, prev->buffer_size, - (size_t) ngx_pagesize); - ngx_conf_merge_msec_value(conf->timeout, prev->timeout, 24 * 60 * 60000); - - return NGX_CONF_OK; -} diff --git a/src/deps/src/nginx-1.30.3/src/mail/ngx_mail_realip_module.c b/src/deps/src/nginx-1.30.3/src/mail/ngx_mail_realip_module.c deleted file mode 100644 index c93d7d33c1..0000000000 --- a/src/deps/src/nginx-1.30.3/src/mail/ngx_mail_realip_module.c +++ /dev/null @@ -1,269 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#include -#include -#include - - -typedef struct { - ngx_array_t *from; /* array of ngx_cidr_t */ -} ngx_mail_realip_srv_conf_t; - - -static ngx_int_t ngx_mail_realip_set_addr(ngx_mail_session_t *s, - ngx_addr_t *addr); -static char *ngx_mail_realip_from(ngx_conf_t *cf, ngx_command_t *cmd, - void *conf); -static void *ngx_mail_realip_create_srv_conf(ngx_conf_t *cf); -static char *ngx_mail_realip_merge_srv_conf(ngx_conf_t *cf, void *parent, - void *child); - - -static ngx_command_t ngx_mail_realip_commands[] = { - - { ngx_string("set_real_ip_from"), - NGX_MAIL_MAIN_CONF|NGX_MAIL_SRV_CONF|NGX_CONF_TAKE1, - ngx_mail_realip_from, - NGX_MAIL_SRV_CONF_OFFSET, - 0, - NULL }, - - ngx_null_command -}; - - -static ngx_mail_module_t ngx_mail_realip_module_ctx = { - NULL, /* protocol */ - - NULL, /* create main configuration */ - NULL, /* init main configuration */ - - ngx_mail_realip_create_srv_conf, /* create server configuration */ - ngx_mail_realip_merge_srv_conf /* merge server configuration */ -}; - - -ngx_module_t ngx_mail_realip_module = { - NGX_MODULE_V1, - &ngx_mail_realip_module_ctx, /* module context */ - ngx_mail_realip_commands, /* module directives */ - NGX_MAIL_MODULE, /* module type */ - NULL, /* init master */ - NULL, /* init module */ - NULL, /* init process */ - NULL, /* init thread */ - NULL, /* exit thread */ - NULL, /* exit process */ - NULL, /* exit master */ - NGX_MODULE_V1_PADDING -}; - - -ngx_int_t -ngx_mail_realip_handler(ngx_mail_session_t *s) -{ - ngx_addr_t addr; - ngx_connection_t *c; - ngx_mail_realip_srv_conf_t *rscf; - - rscf = ngx_mail_get_module_srv_conf(s, ngx_mail_realip_module); - - if (rscf->from == NULL) { - return NGX_OK; - } - - c = s->connection; - - if (c->proxy_protocol == NULL) { - return NGX_OK; - } - - if (ngx_cidr_match(c->sockaddr, rscf->from) != NGX_OK) { - return NGX_OK; - } - - if (ngx_parse_addr(c->pool, &addr, c->proxy_protocol->src_addr.data, - c->proxy_protocol->src_addr.len) - != NGX_OK) - { - return NGX_OK; - } - - ngx_inet_set_port(addr.sockaddr, c->proxy_protocol->src_port); - - return ngx_mail_realip_set_addr(s, &addr); -} - - -static ngx_int_t -ngx_mail_realip_set_addr(ngx_mail_session_t *s, ngx_addr_t *addr) -{ - size_t len; - u_char *p; - u_char text[NGX_SOCKADDR_STRLEN]; - ngx_connection_t *c; - - c = s->connection; - - len = ngx_sock_ntop(addr->sockaddr, addr->socklen, text, - NGX_SOCKADDR_STRLEN, 0); - if (len == 0) { - return NGX_ERROR; - } - - p = ngx_pnalloc(c->pool, len); - if (p == NULL) { - return NGX_ERROR; - } - - ngx_memcpy(p, text, len); - - c->sockaddr = addr->sockaddr; - c->socklen = addr->socklen; - c->addr_text.len = len; - c->addr_text.data = p; - - return NGX_OK; -} - - -static char * -ngx_mail_realip_from(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) -{ - ngx_mail_realip_srv_conf_t *rscf = conf; - - ngx_int_t rc; - ngx_str_t *value; - ngx_url_t u; - ngx_cidr_t c, *cidr; - ngx_uint_t i; - struct sockaddr_in *sin; -#if (NGX_HAVE_INET6) - struct sockaddr_in6 *sin6; -#endif - - value = cf->args->elts; - - if (rscf->from == NULL) { - rscf->from = ngx_array_create(cf->pool, 2, - sizeof(ngx_cidr_t)); - if (rscf->from == NULL) { - return NGX_CONF_ERROR; - } - } - -#if (NGX_HAVE_UNIX_DOMAIN) - - if (ngx_strcmp(value[1].data, "unix:") == 0) { - cidr = ngx_array_push(rscf->from); - if (cidr == NULL) { - return NGX_CONF_ERROR; - } - - cidr->family = AF_UNIX; - return NGX_CONF_OK; - } - -#endif - - rc = ngx_ptocidr(&value[1], &c); - - if (rc != NGX_ERROR) { - if (rc == NGX_DONE) { - ngx_conf_log_error(NGX_LOG_WARN, cf, 0, - "low address bits of %V are meaningless", - &value[1]); - } - - cidr = ngx_array_push(rscf->from); - if (cidr == NULL) { - return NGX_CONF_ERROR; - } - - *cidr = c; - - return NGX_CONF_OK; - } - - ngx_memzero(&u, sizeof(ngx_url_t)); - u.host = value[1]; - - if (ngx_inet_resolve_host(cf->pool, &u) != NGX_OK) { - if (u.err) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "%s in set_real_ip_from \"%V\"", - u.err, &u.host); - } - - return NGX_CONF_ERROR; - } - - cidr = ngx_array_push_n(rscf->from, u.naddrs); - if (cidr == NULL) { - return NGX_CONF_ERROR; - } - - ngx_memzero(cidr, u.naddrs * sizeof(ngx_cidr_t)); - - for (i = 0; i < u.naddrs; i++) { - cidr[i].family = u.addrs[i].sockaddr->sa_family; - - switch (cidr[i].family) { - -#if (NGX_HAVE_INET6) - case AF_INET6: - sin6 = (struct sockaddr_in6 *) u.addrs[i].sockaddr; - cidr[i].u.in6.addr = sin6->sin6_addr; - ngx_memset(cidr[i].u.in6.mask.s6_addr, 0xff, 16); - break; -#endif - - default: /* AF_INET */ - sin = (struct sockaddr_in *) u.addrs[i].sockaddr; - cidr[i].u.in.addr = sin->sin_addr.s_addr; - cidr[i].u.in.mask = 0xffffffff; - break; - } - } - - return NGX_CONF_OK; -} - - -static void * -ngx_mail_realip_create_srv_conf(ngx_conf_t *cf) -{ - ngx_mail_realip_srv_conf_t *conf; - - conf = ngx_pcalloc(cf->pool, sizeof(ngx_mail_realip_srv_conf_t)); - if (conf == NULL) { - return NULL; - } - - /* - * set by ngx_pcalloc(): - * - * conf->from = NULL; - */ - - return conf; -} - - -static char * -ngx_mail_realip_merge_srv_conf(ngx_conf_t *cf, void *parent, void *child) -{ - ngx_mail_realip_srv_conf_t *prev = parent; - ngx_mail_realip_srv_conf_t *conf = child; - - if (conf->from == NULL) { - conf->from = prev->from; - } - - return NGX_CONF_OK; -} diff --git a/src/deps/src/nginx-1.30.3/src/mail/ngx_mail_smtp_handler.c b/src/deps/src/nginx-1.30.3/src/mail/ngx_mail_smtp_handler.c deleted file mode 100644 index 97bbd70631..0000000000 --- a/src/deps/src/nginx-1.30.3/src/mail/ngx_mail_smtp_handler.c +++ /dev/null @@ -1,983 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#include -#include -#include -#include -#include - - -static void ngx_mail_smtp_resolve_addr_handler(ngx_resolver_ctx_t *ctx); -static ngx_int_t ngx_mail_smtp_validate_host(ngx_str_t *name); -static void ngx_mail_smtp_resolve_name(ngx_event_t *rev); -static void ngx_mail_smtp_resolve_name_handler(ngx_resolver_ctx_t *ctx); -static void ngx_mail_smtp_block_reading(ngx_event_t *rev); -static void ngx_mail_smtp_greeting(ngx_mail_session_t *s, ngx_connection_t *c); -static void ngx_mail_smtp_invalid_pipelining(ngx_event_t *rev); -static ngx_int_t ngx_mail_smtp_create_buffer(ngx_mail_session_t *s, - ngx_connection_t *c); - -static ngx_int_t ngx_mail_smtp_helo(ngx_mail_session_t *s, ngx_connection_t *c); -static ngx_int_t ngx_mail_smtp_auth(ngx_mail_session_t *s, ngx_connection_t *c); -static ngx_int_t ngx_mail_smtp_mail(ngx_mail_session_t *s, ngx_connection_t *c); -static ngx_int_t ngx_mail_smtp_starttls(ngx_mail_session_t *s, - ngx_connection_t *c); -static ngx_int_t ngx_mail_smtp_rset(ngx_mail_session_t *s, ngx_connection_t *c); -static ngx_int_t ngx_mail_smtp_rcpt(ngx_mail_session_t *s, ngx_connection_t *c); - -static ngx_int_t ngx_mail_smtp_discard_command(ngx_mail_session_t *s, - ngx_connection_t *c, char *err); -static void ngx_mail_smtp_log_rejected_command(ngx_mail_session_t *s, - ngx_connection_t *c, char *err); - - -static u_char smtp_ok[] = "250 2.0.0 OK" CRLF; -static u_char smtp_bye[] = "221 2.0.0 Bye" CRLF; -static u_char smtp_starttls[] = "220 2.0.0 Start TLS" CRLF; -static u_char smtp_next[] = "334 " CRLF; -static u_char smtp_username[] = "334 VXNlcm5hbWU6" CRLF; -static u_char smtp_password[] = "334 UGFzc3dvcmQ6" CRLF; -static u_char smtp_invalid_command[] = "500 5.5.1 Invalid command" CRLF; -static u_char smtp_invalid_pipelining[] = - "503 5.5.0 Improper use of SMTP command pipelining" CRLF; -static u_char smtp_invalid_argument[] = "501 5.5.4 Invalid argument" CRLF; -static u_char smtp_auth_required[] = "530 5.7.1 Authentication required" CRLF; -static u_char smtp_bad_sequence[] = "503 5.5.1 Bad sequence of commands" CRLF; - - -static ngx_str_t smtp_unavailable = ngx_string("[UNAVAILABLE]"); -static ngx_str_t smtp_tempunavail = ngx_string("[TEMPUNAVAIL]"); - - -void -ngx_mail_smtp_init_session(ngx_mail_session_t *s, ngx_connection_t *c) -{ - ngx_resolver_ctx_t *ctx; - ngx_mail_core_srv_conf_t *cscf; - - cscf = ngx_mail_get_module_srv_conf(s, ngx_mail_core_module); - - if (cscf->resolver == NULL) { - s->host = smtp_unavailable; - ngx_mail_smtp_greeting(s, c); - return; - } - -#if (NGX_HAVE_UNIX_DOMAIN) - if (c->sockaddr->sa_family == AF_UNIX) { - s->host = smtp_tempunavail; - ngx_mail_smtp_greeting(s, c); - return; - } -#endif - - c->log->action = "in resolving client address"; - - ctx = ngx_resolve_start(cscf->resolver, NULL); - if (ctx == NULL) { - ngx_mail_close_connection(c); - return; - } - - ctx->addr.sockaddr = c->sockaddr; - ctx->addr.socklen = c->socklen; - ctx->handler = ngx_mail_smtp_resolve_addr_handler; - ctx->data = s; - ctx->timeout = cscf->resolver_timeout; - - s->resolver_ctx = ctx; - c->read->handler = ngx_mail_smtp_block_reading; - - if (ngx_resolve_addr(ctx) != NGX_OK) { - ngx_mail_close_connection(c); - } -} - - -static void -ngx_mail_smtp_resolve_addr_handler(ngx_resolver_ctx_t *ctx) -{ - ngx_connection_t *c; - ngx_mail_session_t *s; - - s = ctx->data; - c = s->connection; - - if (ctx->state) { - ngx_log_error(NGX_LOG_ERR, c->log, 0, - "%V could not be resolved (%i: %s)", - &c->addr_text, ctx->state, - ngx_resolver_strerror(ctx->state)); - - if (ctx->state == NGX_RESOLVE_NXDOMAIN) { - s->host = smtp_unavailable; - - } else { - s->host = smtp_tempunavail; - } - - ngx_resolve_addr_done(ctx); - - ngx_mail_smtp_greeting(s, s->connection); - - return; - } - - if (ngx_mail_smtp_validate_host(&ctx->name) != NGX_OK) { - ngx_log_error(NGX_LOG_ERR, c->log, 0, - "%V resolved to invalid host name \"%V\"", - &c->addr_text, &ctx->name); - - s->host = smtp_tempunavail; - - ngx_resolve_addr_done(ctx); - - ngx_mail_smtp_greeting(s, s->connection); - - return; - } - - c->log->action = "in resolving client hostname"; - - s->host.data = ngx_pstrdup(c->pool, &ctx->name); - if (s->host.data == NULL) { - ngx_resolve_addr_done(ctx); - ngx_mail_close_connection(c); - return; - } - - s->host.len = ctx->name.len; - - ngx_resolve_addr_done(ctx); - - ngx_log_debug1(NGX_LOG_DEBUG_MAIL, c->log, 0, - "address resolved: %V", &s->host); - - c->read->handler = ngx_mail_smtp_resolve_name; - - ngx_post_event(c->read, &ngx_posted_events); -} - - -static ngx_int_t -ngx_mail_smtp_validate_host(ngx_str_t *name) -{ - u_char ch; - ngx_uint_t i; - - if (name->len == 0) { - return NGX_DECLINED; - } - - for (i = 0; i < name->len; i++) { - ch = name->data[i]; - - /* allow only characters from RFC 1034, Section 3.5 */ - - if ((ch >= 'a' && ch <= 'z') - || (ch >= 'A' && ch <= 'Z') - || (ch >= '0' && ch <= '9') - || ch == '-' || ch == '.') - { - continue; - } - - return NGX_DECLINED; - } - - return NGX_OK; -} - - -static void -ngx_mail_smtp_resolve_name(ngx_event_t *rev) -{ - ngx_connection_t *c; - ngx_mail_session_t *s; - ngx_resolver_ctx_t *ctx; - ngx_mail_core_srv_conf_t *cscf; - - c = rev->data; - s = c->data; - - cscf = ngx_mail_get_module_srv_conf(s, ngx_mail_core_module); - - ctx = ngx_resolve_start(cscf->resolver, NULL); - if (ctx == NULL) { - ngx_mail_close_connection(c); - return; - } - - ctx->name = s->host; - ctx->handler = ngx_mail_smtp_resolve_name_handler; - ctx->data = s; - ctx->timeout = cscf->resolver_timeout; - - s->resolver_ctx = ctx; - c->read->handler = ngx_mail_smtp_block_reading; - - if (ngx_resolve_name(ctx) != NGX_OK) { - ngx_mail_close_connection(c); - } -} - - -static void -ngx_mail_smtp_resolve_name_handler(ngx_resolver_ctx_t *ctx) -{ - ngx_uint_t i; - ngx_connection_t *c; - ngx_mail_session_t *s; - - s = ctx->data; - c = s->connection; - - if (ctx->state) { - ngx_log_error(NGX_LOG_ERR, c->log, 0, - "\"%V\" could not be resolved (%i: %s)", - &ctx->name, ctx->state, - ngx_resolver_strerror(ctx->state)); - - if (ctx->state == NGX_RESOLVE_NXDOMAIN) { - s->host = smtp_unavailable; - - } else { - s->host = smtp_tempunavail; - } - - } else { - -#if (NGX_DEBUG) - { - u_char text[NGX_SOCKADDR_STRLEN]; - ngx_str_t addr; - - addr.data = text; - - for (i = 0; i < ctx->naddrs; i++) { - addr.len = ngx_sock_ntop(ctx->addrs[i].sockaddr, - ctx->addrs[i].socklen, - text, NGX_SOCKADDR_STRLEN, 0); - - ngx_log_debug1(NGX_LOG_DEBUG_MAIL, c->log, 0, - "name was resolved to %V", &addr); - } - } -#endif - - for (i = 0; i < ctx->naddrs; i++) { - if (ngx_cmp_sockaddr(ctx->addrs[i].sockaddr, ctx->addrs[i].socklen, - c->sockaddr, c->socklen, 0) - == NGX_OK) - { - goto found; - } - } - - s->host = smtp_unavailable; - } - -found: - - ngx_resolve_name_done(ctx); - - ngx_mail_smtp_greeting(s, c); -} - - -static void -ngx_mail_smtp_block_reading(ngx_event_t *rev) -{ - ngx_connection_t *c; - ngx_mail_session_t *s; - ngx_resolver_ctx_t *ctx; - - c = rev->data; - s = c->data; - - ngx_log_debug0(NGX_LOG_DEBUG_MAIL, c->log, 0, "smtp reading blocked"); - - if (ngx_handle_read_event(rev, 0) != NGX_OK) { - - if (s->resolver_ctx) { - ctx = s->resolver_ctx; - - if (ctx->handler == ngx_mail_smtp_resolve_addr_handler) { - ngx_resolve_addr_done(ctx); - - } else if (ctx->handler == ngx_mail_smtp_resolve_name_handler) { - ngx_resolve_name_done(ctx); - } - - s->resolver_ctx = NULL; - } - - ngx_mail_close_connection(c); - } -} - - -static void -ngx_mail_smtp_greeting(ngx_mail_session_t *s, ngx_connection_t *c) -{ - ngx_msec_t timeout; - ngx_mail_core_srv_conf_t *cscf; - ngx_mail_smtp_srv_conf_t *sscf; - - ngx_log_debug1(NGX_LOG_DEBUG_MAIL, c->log, 0, - "smtp greeting for \"%V\"", &s->host); - - cscf = ngx_mail_get_module_srv_conf(s, ngx_mail_core_module); - sscf = ngx_mail_get_module_srv_conf(s, ngx_mail_smtp_module); - - timeout = sscf->greeting_delay ? sscf->greeting_delay : cscf->timeout; - ngx_add_timer(c->read, timeout); - - if (ngx_handle_read_event(c->read, 0) != NGX_OK) { - ngx_mail_close_connection(c); - } - - if (c->read->ready) { - ngx_post_event(c->read, &ngx_posted_events); - } - - if (sscf->greeting_delay) { - c->read->handler = ngx_mail_smtp_invalid_pipelining; - return; - } - - c->read->handler = ngx_mail_smtp_init_protocol; - - s->out = sscf->greeting; - - ngx_mail_send(c->write); -} - - -static void -ngx_mail_smtp_invalid_pipelining(ngx_event_t *rev) -{ - ngx_connection_t *c; - ngx_mail_session_t *s; - ngx_mail_core_srv_conf_t *cscf; - ngx_mail_smtp_srv_conf_t *sscf; - - c = rev->data; - s = c->data; - - c->log->action = "in delay pipelining state"; - - if (rev->timedout) { - - ngx_log_debug0(NGX_LOG_DEBUG_MAIL, c->log, 0, "delay greeting"); - - rev->timedout = 0; - - cscf = ngx_mail_get_module_srv_conf(s, ngx_mail_core_module); - - c->read->handler = ngx_mail_smtp_init_protocol; - - ngx_add_timer(c->read, cscf->timeout); - - if (ngx_handle_read_event(c->read, 0) != NGX_OK) { - ngx_mail_close_connection(c); - return; - } - - sscf = ngx_mail_get_module_srv_conf(s, ngx_mail_smtp_module); - - s->out = sscf->greeting; - - } else { - - ngx_log_debug0(NGX_LOG_DEBUG_MAIL, c->log, 0, "invalid pipelining"); - - if (s->buffer == NULL) { - if (ngx_mail_smtp_create_buffer(s, c) != NGX_OK) { - return; - } - } - - if (ngx_mail_smtp_discard_command(s, c, - "client was rejected before greeting: \"%V\"") - != NGX_OK) - { - return; - } - - ngx_str_set(&s->out, smtp_invalid_pipelining); - s->quit = 1; - } - - ngx_mail_send(c->write); -} - - -void -ngx_mail_smtp_init_protocol(ngx_event_t *rev) -{ - ngx_connection_t *c; - ngx_mail_session_t *s; - - c = rev->data; - - c->log->action = "in auth state"; - - if (rev->timedout) { - ngx_log_error(NGX_LOG_INFO, c->log, NGX_ETIMEDOUT, "client timed out"); - c->timedout = 1; - ngx_mail_close_connection(c); - return; - } - - s = c->data; - - if (s->buffer == NULL) { - if (ngx_mail_smtp_create_buffer(s, c) != NGX_OK) { - return; - } - } - - s->mail_state = ngx_smtp_start; - c->read->handler = ngx_mail_smtp_auth_state; - - ngx_mail_smtp_auth_state(rev); -} - - -static ngx_int_t -ngx_mail_smtp_create_buffer(ngx_mail_session_t *s, ngx_connection_t *c) -{ - ngx_mail_smtp_srv_conf_t *sscf; - - if (ngx_array_init(&s->args, c->pool, 2, sizeof(ngx_str_t)) == NGX_ERROR) { - ngx_mail_session_internal_server_error(s); - return NGX_ERROR; - } - - sscf = ngx_mail_get_module_srv_conf(s, ngx_mail_smtp_module); - - s->buffer = ngx_create_temp_buf(c->pool, sscf->client_buffer_size); - if (s->buffer == NULL) { - ngx_mail_session_internal_server_error(s); - return NGX_ERROR; - } - - return NGX_OK; -} - - -void -ngx_mail_smtp_auth_state(ngx_event_t *rev) -{ - ngx_int_t rc; - ngx_connection_t *c; - ngx_mail_session_t *s; - - c = rev->data; - s = c->data; - - ngx_log_debug0(NGX_LOG_DEBUG_MAIL, c->log, 0, "smtp auth state"); - - if (rev->timedout) { - ngx_log_error(NGX_LOG_INFO, c->log, NGX_ETIMEDOUT, "client timed out"); - c->timedout = 1; - ngx_mail_close_connection(c); - return; - } - - if (s->out.len) { - ngx_log_debug0(NGX_LOG_DEBUG_MAIL, c->log, 0, "smtp send handler busy"); - s->blocked = 1; - - if (ngx_handle_read_event(c->read, 0) != NGX_OK) { - ngx_mail_close_connection(c); - return; - } - - return; - } - - s->blocked = 0; - - rc = ngx_mail_read_command(s, c); - - if (rc == NGX_AGAIN) { - if (ngx_handle_read_event(c->read, 0) != NGX_OK) { - ngx_mail_session_internal_server_error(s); - return; - } - - return; - } - - if (rc == NGX_ERROR) { - return; - } - - ngx_str_set(&s->out, smtp_ok); - - if (rc == NGX_OK) { - switch (s->mail_state) { - - case ngx_smtp_start: - - switch (s->command) { - - case NGX_SMTP_HELO: - case NGX_SMTP_EHLO: - rc = ngx_mail_smtp_helo(s, c); - break; - - case NGX_SMTP_AUTH: - rc = ngx_mail_smtp_auth(s, c); - break; - - case NGX_SMTP_QUIT: - s->quit = 1; - ngx_str_set(&s->out, smtp_bye); - break; - - case NGX_SMTP_MAIL: - rc = ngx_mail_smtp_mail(s, c); - break; - - case NGX_SMTP_RCPT: - rc = ngx_mail_smtp_rcpt(s, c); - break; - - case NGX_SMTP_RSET: - rc = ngx_mail_smtp_rset(s, c); - break; - - case NGX_SMTP_NOOP: - break; - - case NGX_SMTP_STARTTLS: - rc = ngx_mail_smtp_starttls(s, c); - ngx_str_set(&s->out, smtp_starttls); - break; - - default: - rc = NGX_MAIL_PARSE_INVALID_COMMAND; - break; - } - - break; - - case ngx_smtp_auth_login_username: - rc = ngx_mail_auth_login_username(s, c, 0); - - ngx_str_set(&s->out, smtp_password); - s->mail_state = ngx_smtp_auth_login_password; - break; - - case ngx_smtp_auth_login_password: - rc = ngx_mail_auth_login_password(s, c); - break; - - case ngx_smtp_auth_plain: - rc = ngx_mail_auth_plain(s, c, 0); - break; - - case ngx_smtp_auth_cram_md5: - rc = ngx_mail_auth_cram_md5(s, c); - break; - - case ngx_smtp_auth_external: - rc = ngx_mail_auth_external(s, c, 0); - break; - } - } - - if (s->buffer->pos < s->buffer->last) { - s->blocked = 1; - } - - switch (rc) { - - case NGX_DONE: - ngx_mail_auth(s, c); - return; - - case NGX_ERROR: - ngx_mail_session_internal_server_error(s); - return; - - case NGX_MAIL_PARSE_INVALID_COMMAND: - s->mail_state = ngx_smtp_start; - s->state = 0; - ngx_str_set(&s->out, smtp_invalid_command); - - /* fall through */ - - case NGX_OK: - s->args.nelts = 0; - - if (s->buffer->pos == s->buffer->last) { - s->buffer->pos = s->buffer->start; - s->buffer->last = s->buffer->start; - } - - if (s->state) { - s->arg_start = s->buffer->pos; - } - - if (ngx_handle_read_event(c->read, 0) != NGX_OK) { - ngx_mail_session_internal_server_error(s); - return; - } - - ngx_mail_send(c->write); - } -} - - -static ngx_int_t -ngx_mail_smtp_helo(ngx_mail_session_t *s, ngx_connection_t *c) -{ - ngx_str_t *arg; - ngx_mail_smtp_srv_conf_t *sscf; - - if (s->args.nelts != 1) { - ngx_str_set(&s->out, smtp_invalid_argument); - s->state = 0; - return NGX_OK; - } - - arg = s->args.elts; - - s->smtp_helo.len = arg[0].len; - - s->smtp_helo.data = ngx_pnalloc(c->pool, arg[0].len); - if (s->smtp_helo.data == NULL) { - return NGX_ERROR; - } - - ngx_memcpy(s->smtp_helo.data, arg[0].data, arg[0].len); - - ngx_str_null(&s->smtp_from); - ngx_str_null(&s->smtp_to); - - sscf = ngx_mail_get_module_srv_conf(s, ngx_mail_smtp_module); - - if (s->command == NGX_SMTP_HELO) { - s->out = sscf->server_name; - - } else { - s->esmtp = 1; - -#if (NGX_MAIL_SSL) - - if (c->ssl == NULL) { - ngx_mail_ssl_conf_t *sslcf; - - sslcf = ngx_mail_get_module_srv_conf(s, ngx_mail_ssl_module); - - if (sslcf->starttls == NGX_MAIL_STARTTLS_ON) { - s->out = sscf->starttls_capability; - return NGX_OK; - } - - if (sslcf->starttls == NGX_MAIL_STARTTLS_ONLY) { - s->out = sscf->starttls_only_capability; - return NGX_OK; - } - } -#endif - - s->out = sscf->capability; - } - - return NGX_OK; -} - - -static ngx_int_t -ngx_mail_smtp_auth(ngx_mail_session_t *s, ngx_connection_t *c) -{ - ngx_int_t rc; - ngx_mail_core_srv_conf_t *cscf; - ngx_mail_smtp_srv_conf_t *sscf; - -#if (NGX_MAIL_SSL) - if (ngx_mail_starttls_only(s, c)) { - return NGX_MAIL_PARSE_INVALID_COMMAND; - } -#endif - - if (s->args.nelts == 0) { - ngx_str_set(&s->out, smtp_invalid_argument); - s->state = 0; - return NGX_OK; - } - - sscf = ngx_mail_get_module_srv_conf(s, ngx_mail_smtp_module); - - rc = ngx_mail_auth_parse(s, c); - - switch (rc) { - - case NGX_MAIL_AUTH_LOGIN: - - ngx_str_set(&s->out, smtp_username); - s->mail_state = ngx_smtp_auth_login_username; - - return NGX_OK; - - case NGX_MAIL_AUTH_LOGIN_USERNAME: - - ngx_str_set(&s->out, smtp_password); - s->mail_state = ngx_smtp_auth_login_password; - - return ngx_mail_auth_login_username(s, c, 1); - - case NGX_MAIL_AUTH_PLAIN: - - ngx_str_set(&s->out, smtp_next); - s->mail_state = ngx_smtp_auth_plain; - - return NGX_OK; - - case NGX_MAIL_AUTH_CRAM_MD5: - - if (!(sscf->auth_methods & NGX_MAIL_AUTH_CRAM_MD5_ENABLED)) { - return NGX_MAIL_PARSE_INVALID_COMMAND; - } - - if (s->salt.data == NULL) { - cscf = ngx_mail_get_module_srv_conf(s, ngx_mail_core_module); - - if (ngx_mail_salt(s, c, cscf) != NGX_OK) { - return NGX_ERROR; - } - } - - if (ngx_mail_auth_cram_md5_salt(s, c, "334 ", 4) == NGX_OK) { - s->mail_state = ngx_smtp_auth_cram_md5; - return NGX_OK; - } - - return NGX_ERROR; - - case NGX_MAIL_AUTH_EXTERNAL: - - if (!(sscf->auth_methods & NGX_MAIL_AUTH_EXTERNAL_ENABLED)) { - return NGX_MAIL_PARSE_INVALID_COMMAND; - } - - ngx_str_set(&s->out, smtp_username); - s->mail_state = ngx_smtp_auth_external; - - return NGX_OK; - } - - return rc; -} - - -static ngx_int_t -ngx_mail_smtp_mail(ngx_mail_session_t *s, ngx_connection_t *c) -{ - ngx_str_t *arg, cmd; - ngx_mail_smtp_srv_conf_t *sscf; - - sscf = ngx_mail_get_module_srv_conf(s, ngx_mail_smtp_module); - - if (!(sscf->auth_methods & NGX_MAIL_AUTH_NONE_ENABLED)) { - ngx_mail_smtp_log_rejected_command(s, c, "client was rejected: \"%V\""); - ngx_str_set(&s->out, smtp_auth_required); - return NGX_OK; - } - - /* auth none */ - - if (s->smtp_from.len) { - ngx_str_set(&s->out, smtp_bad_sequence); - return NGX_OK; - } - - if (s->args.nelts == 0) { - ngx_str_set(&s->out, smtp_invalid_argument); - return NGX_OK; - } - - arg = s->args.elts; - arg += s->args.nelts - 1; - - cmd.len = arg->data + arg->len - s->cmd.data; - cmd.data = s->cmd.data; - - s->smtp_from.len = cmd.len; - - s->smtp_from.data = ngx_pnalloc(c->pool, cmd.len); - if (s->smtp_from.data == NULL) { - return NGX_ERROR; - } - - ngx_memcpy(s->smtp_from.data, cmd.data, cmd.len); - - ngx_log_debug1(NGX_LOG_DEBUG_MAIL, c->log, 0, - "smtp mail from:\"%V\"", &s->smtp_from); - - ngx_str_set(&s->out, smtp_ok); - - ngx_str_null(&s->login); - ngx_str_null(&s->passwd); - - return NGX_OK; -} - - -static ngx_int_t -ngx_mail_smtp_rcpt(ngx_mail_session_t *s, ngx_connection_t *c) -{ - ngx_str_t *arg, cmd; - - if (s->smtp_from.len == 0) { - ngx_str_set(&s->out, smtp_bad_sequence); - return NGX_OK; - } - - if (s->args.nelts == 0) { - ngx_str_set(&s->out, smtp_invalid_argument); - return NGX_OK; - } - - arg = s->args.elts; - arg += s->args.nelts - 1; - - cmd.len = arg->data + arg->len - s->cmd.data; - cmd.data = s->cmd.data; - - s->smtp_to.len = cmd.len; - - s->smtp_to.data = ngx_pnalloc(c->pool, cmd.len); - if (s->smtp_to.data == NULL) { - return NGX_ERROR; - } - - ngx_memcpy(s->smtp_to.data, cmd.data, cmd.len); - - ngx_log_debug1(NGX_LOG_DEBUG_MAIL, c->log, 0, - "smtp rcpt to:\"%V\"", &s->smtp_to); - - s->auth_method = NGX_MAIL_AUTH_NONE; - - return NGX_DONE; -} - - -static ngx_int_t -ngx_mail_smtp_rset(ngx_mail_session_t *s, ngx_connection_t *c) -{ - ngx_str_null(&s->smtp_from); - ngx_str_null(&s->smtp_to); - ngx_str_set(&s->out, smtp_ok); - - return NGX_OK; -} - - -static ngx_int_t -ngx_mail_smtp_starttls(ngx_mail_session_t *s, ngx_connection_t *c) -{ -#if (NGX_MAIL_SSL) - ngx_mail_ssl_conf_t *sslcf; - - if (c->ssl == NULL) { - sslcf = ngx_mail_get_module_srv_conf(s, ngx_mail_ssl_module); - if (sslcf->starttls) { - - /* - * RFC3207 requires us to discard any knowledge - * obtained from client before STARTTLS. - */ - - ngx_str_null(&s->smtp_helo); - ngx_str_null(&s->smtp_from); - ngx_str_null(&s->smtp_to); - - s->buffer->pos = s->buffer->start; - s->buffer->last = s->buffer->start; - - c->read->handler = ngx_mail_starttls_handler; - return NGX_OK; - } - } - -#endif - - return NGX_MAIL_PARSE_INVALID_COMMAND; -} - - -static ngx_int_t -ngx_mail_smtp_discard_command(ngx_mail_session_t *s, ngx_connection_t *c, - char *err) -{ - ssize_t n; - - n = c->recv(c, s->buffer->last, s->buffer->end - s->buffer->last); - - if (n == NGX_ERROR || n == 0) { - ngx_mail_close_connection(c); - return NGX_ERROR; - } - - if (n > 0) { - s->buffer->last += n; - } - - if (n == NGX_AGAIN) { - if (ngx_handle_read_event(c->read, 0) != NGX_OK) { - ngx_mail_session_internal_server_error(s); - return NGX_ERROR; - } - - return NGX_AGAIN; - } - - ngx_mail_smtp_log_rejected_command(s, c, err); - - s->buffer->pos = s->buffer->start; - s->buffer->last = s->buffer->start; - - return NGX_OK; -} - - -static void -ngx_mail_smtp_log_rejected_command(ngx_mail_session_t *s, ngx_connection_t *c, - char *err) -{ - u_char ch; - ngx_str_t cmd; - ngx_uint_t i; - - if (c->log->log_level < NGX_LOG_INFO) { - return; - } - - cmd.len = s->buffer->last - s->buffer->start; - cmd.data = s->buffer->start; - - for (i = 0; i < cmd.len; i++) { - ch = cmd.data[i]; - - if (ch != CR && ch != LF) { - continue; - } - - cmd.data[i] = '_'; - } - - cmd.len = i; - - ngx_log_error(NGX_LOG_INFO, c->log, 0, err, &cmd); -} diff --git a/src/deps/src/nginx-1.30.3/src/mail/ngx_mail_smtp_module.c b/src/deps/src/nginx-1.30.3/src/mail/ngx_mail_smtp_module.c deleted file mode 100644 index 0e05fdc034..0000000000 --- a/src/deps/src/nginx-1.30.3/src/mail/ngx_mail_smtp_module.c +++ /dev/null @@ -1,312 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#include -#include -#include -#include -#include - - -static void *ngx_mail_smtp_create_srv_conf(ngx_conf_t *cf); -static char *ngx_mail_smtp_merge_srv_conf(ngx_conf_t *cf, void *parent, - void *child); - - -static ngx_conf_bitmask_t ngx_mail_smtp_auth_methods[] = { - { ngx_string("plain"), NGX_MAIL_AUTH_PLAIN_ENABLED }, - { ngx_string("login"), NGX_MAIL_AUTH_LOGIN_ENABLED }, - { ngx_string("cram-md5"), NGX_MAIL_AUTH_CRAM_MD5_ENABLED }, - { ngx_string("external"), NGX_MAIL_AUTH_EXTERNAL_ENABLED }, - { ngx_string("none"), NGX_MAIL_AUTH_NONE_ENABLED }, - { ngx_null_string, 0 } -}; - - -static ngx_str_t ngx_mail_smtp_auth_methods_names[] = { - ngx_string("PLAIN"), - ngx_string("LOGIN"), - ngx_null_string, /* APOP */ - ngx_string("CRAM-MD5"), - ngx_string("EXTERNAL"), - ngx_null_string /* NONE */ -}; - - -static ngx_mail_protocol_t ngx_mail_smtp_protocol = { - ngx_string("smtp"), - ngx_string("\x04smtp"), - { 25, 465, 587, 0 }, - NGX_MAIL_SMTP_PROTOCOL, - - ngx_mail_smtp_init_session, - ngx_mail_smtp_init_protocol, - ngx_mail_smtp_parse_command, - ngx_mail_smtp_auth_state, - - ngx_string("451 4.3.2 Internal server error" CRLF), - ngx_string("421 4.7.1 SSL certificate error" CRLF), - ngx_string("421 4.7.1 No required SSL certificate" CRLF) -}; - - -static ngx_command_t ngx_mail_smtp_commands[] = { - - { ngx_string("smtp_client_buffer"), - NGX_MAIL_MAIN_CONF|NGX_MAIL_SRV_CONF|NGX_CONF_TAKE1, - ngx_conf_set_size_slot, - NGX_MAIL_SRV_CONF_OFFSET, - offsetof(ngx_mail_smtp_srv_conf_t, client_buffer_size), - NULL }, - - { ngx_string("smtp_greeting_delay"), - NGX_MAIL_MAIN_CONF|NGX_MAIL_SRV_CONF|NGX_CONF_TAKE1, - ngx_conf_set_msec_slot, - NGX_MAIL_SRV_CONF_OFFSET, - offsetof(ngx_mail_smtp_srv_conf_t, greeting_delay), - NULL }, - - { ngx_string("smtp_capabilities"), - NGX_MAIL_MAIN_CONF|NGX_MAIL_SRV_CONF|NGX_CONF_1MORE, - ngx_mail_capabilities, - NGX_MAIL_SRV_CONF_OFFSET, - offsetof(ngx_mail_smtp_srv_conf_t, capabilities), - NULL }, - - { ngx_string("smtp_auth"), - NGX_MAIL_MAIN_CONF|NGX_MAIL_SRV_CONF|NGX_CONF_1MORE, - ngx_conf_set_bitmask_slot, - NGX_MAIL_SRV_CONF_OFFSET, - offsetof(ngx_mail_smtp_srv_conf_t, auth_methods), - &ngx_mail_smtp_auth_methods }, - - ngx_null_command -}; - - -static ngx_mail_module_t ngx_mail_smtp_module_ctx = { - &ngx_mail_smtp_protocol, /* protocol */ - - NULL, /* create main configuration */ - NULL, /* init main configuration */ - - ngx_mail_smtp_create_srv_conf, /* create server configuration */ - ngx_mail_smtp_merge_srv_conf /* merge server configuration */ -}; - - -ngx_module_t ngx_mail_smtp_module = { - NGX_MODULE_V1, - &ngx_mail_smtp_module_ctx, /* module context */ - ngx_mail_smtp_commands, /* module directives */ - NGX_MAIL_MODULE, /* module type */ - NULL, /* init master */ - NULL, /* init module */ - NULL, /* init process */ - NULL, /* init thread */ - NULL, /* exit thread */ - NULL, /* exit process */ - NULL, /* exit master */ - NGX_MODULE_V1_PADDING -}; - - -static void * -ngx_mail_smtp_create_srv_conf(ngx_conf_t *cf) -{ - ngx_mail_smtp_srv_conf_t *sscf; - - sscf = ngx_pcalloc(cf->pool, sizeof(ngx_mail_smtp_srv_conf_t)); - if (sscf == NULL) { - return NULL; - } - - sscf->client_buffer_size = NGX_CONF_UNSET_SIZE; - sscf->greeting_delay = NGX_CONF_UNSET_MSEC; - - if (ngx_array_init(&sscf->capabilities, cf->pool, 4, sizeof(ngx_str_t)) - != NGX_OK) - { - return NULL; - } - - return sscf; -} - - -static char * -ngx_mail_smtp_merge_srv_conf(ngx_conf_t *cf, void *parent, void *child) -{ - ngx_mail_smtp_srv_conf_t *prev = parent; - ngx_mail_smtp_srv_conf_t *conf = child; - - u_char *p, *auth, *last; - size_t size; - ngx_str_t *c; - ngx_uint_t i, m, auth_enabled; - ngx_mail_core_srv_conf_t *cscf; - - ngx_conf_merge_size_value(conf->client_buffer_size, - prev->client_buffer_size, - (size_t) ngx_pagesize); - - ngx_conf_merge_msec_value(conf->greeting_delay, - prev->greeting_delay, 0); - - ngx_conf_merge_bitmask_value(conf->auth_methods, - prev->auth_methods, - (NGX_CONF_BITMASK_SET - |NGX_MAIL_AUTH_PLAIN_ENABLED - |NGX_MAIL_AUTH_LOGIN_ENABLED)); - - - cscf = ngx_mail_conf_get_module_srv_conf(cf, ngx_mail_core_module); - - size = sizeof("220 ESMTP ready" CRLF) - 1 + cscf->server_name.len; - - p = ngx_pnalloc(cf->pool, size); - if (p == NULL) { - return NGX_CONF_ERROR; - } - - conf->greeting.len = size; - conf->greeting.data = p; - - *p++ = '2'; *p++ = '2'; *p++ = '0'; *p++ = ' '; - p = ngx_cpymem(p, cscf->server_name.data, cscf->server_name.len); - ngx_memcpy(p, " ESMTP ready" CRLF, sizeof(" ESMTP ready" CRLF) - 1); - - - size = sizeof("250 " CRLF) - 1 + cscf->server_name.len; - - p = ngx_pnalloc(cf->pool, size); - if (p == NULL) { - return NGX_CONF_ERROR; - } - - conf->server_name.len = size; - conf->server_name.data = p; - - *p++ = '2'; *p++ = '5'; *p++ = '0'; *p++ = ' '; - p = ngx_cpymem(p, cscf->server_name.data, cscf->server_name.len); - *p++ = CR; *p = LF; - - - if (conf->capabilities.nelts == 0) { - conf->capabilities = prev->capabilities; - } - - size = sizeof("250-") - 1 + cscf->server_name.len + sizeof(CRLF) - 1; - - c = conf->capabilities.elts; - for (i = 0; i < conf->capabilities.nelts; i++) { - size += sizeof("250 ") - 1 + c[i].len + sizeof(CRLF) - 1; - } - - auth_enabled = 0; - - for (m = NGX_MAIL_AUTH_PLAIN_ENABLED, i = 0; - m <= NGX_MAIL_AUTH_EXTERNAL_ENABLED; - m <<= 1, i++) - { - if (m & conf->auth_methods) { - size += 1 + ngx_mail_smtp_auth_methods_names[i].len; - auth_enabled = 1; - } - } - - if (auth_enabled) { - size += sizeof("250 AUTH") - 1 + sizeof(CRLF) - 1; - } - - p = ngx_pnalloc(cf->pool, size); - if (p == NULL) { - return NGX_CONF_ERROR; - } - - conf->capability.len = size; - conf->capability.data = p; - - last = p; - - *p++ = '2'; *p++ = '5'; *p++ = '0'; *p++ = '-'; - p = ngx_cpymem(p, cscf->server_name.data, cscf->server_name.len); - *p++ = CR; *p++ = LF; - - for (i = 0; i < conf->capabilities.nelts; i++) { - last = p; - *p++ = '2'; *p++ = '5'; *p++ = '0'; *p++ = '-'; - p = ngx_cpymem(p, c[i].data, c[i].len); - *p++ = CR; *p++ = LF; - } - - auth = p; - - if (auth_enabled) { - last = p; - - *p++ = '2'; *p++ = '5'; *p++ = '0'; *p++ = ' '; - *p++ = 'A'; *p++ = 'U'; *p++ = 'T'; *p++ = 'H'; - - for (m = NGX_MAIL_AUTH_PLAIN_ENABLED, i = 0; - m <= NGX_MAIL_AUTH_EXTERNAL_ENABLED; - m <<= 1, i++) - { - if (m & conf->auth_methods) { - *p++ = ' '; - p = ngx_cpymem(p, ngx_mail_smtp_auth_methods_names[i].data, - ngx_mail_smtp_auth_methods_names[i].len); - } - } - - *p++ = CR; *p = LF; - - } else { - last[3] = ' '; - } - - size += sizeof("250 STARTTLS" CRLF) - 1; - - p = ngx_pnalloc(cf->pool, size); - if (p == NULL) { - return NGX_CONF_ERROR; - } - - conf->starttls_capability.len = size; - conf->starttls_capability.data = p; - - p = ngx_cpymem(p, conf->capability.data, conf->capability.len); - - ngx_memcpy(p, "250 STARTTLS" CRLF, sizeof("250 STARTTLS" CRLF) - 1); - - p = conf->starttls_capability.data - + (last - conf->capability.data) + 3; - *p = '-'; - - size = (auth - conf->capability.data) - + sizeof("250 STARTTLS" CRLF) - 1; - - p = ngx_pnalloc(cf->pool, size); - if (p == NULL) { - return NGX_CONF_ERROR; - } - - conf->starttls_only_capability.len = size; - conf->starttls_only_capability.data = p; - - p = ngx_cpymem(p, conf->capability.data, auth - conf->capability.data); - - ngx_memcpy(p, "250 STARTTLS" CRLF, sizeof("250 STARTTLS" CRLF) - 1); - - if (last < auth) { - p = conf->starttls_only_capability.data - + (last - conf->capability.data) + 3; - *p = '-'; - } - - return NGX_CONF_OK; -} diff --git a/src/deps/src/nginx-1.30.3/src/mail/ngx_mail_smtp_module.h b/src/deps/src/nginx-1.30.3/src/mail/ngx_mail_smtp_module.h deleted file mode 100644 index 04ffab60ad..0000000000 --- a/src/deps/src/nginx-1.30.3/src/mail/ngx_mail_smtp_module.h +++ /dev/null @@ -1,45 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#ifndef _NGX_MAIL_SMTP_MODULE_H_INCLUDED_ -#define _NGX_MAIL_SMTP_MODULE_H_INCLUDED_ - - -#include -#include -#include -#include - - -typedef struct { - ngx_msec_t greeting_delay; - - size_t client_buffer_size; - - ngx_str_t capability; - ngx_str_t starttls_capability; - ngx_str_t starttls_only_capability; - - ngx_str_t server_name; - ngx_str_t greeting; - - ngx_uint_t auth_methods; - - ngx_array_t capabilities; -} ngx_mail_smtp_srv_conf_t; - - -void ngx_mail_smtp_init_session(ngx_mail_session_t *s, ngx_connection_t *c); -void ngx_mail_smtp_init_protocol(ngx_event_t *rev); -void ngx_mail_smtp_auth_state(ngx_event_t *rev); -ngx_int_t ngx_mail_smtp_parse_command(ngx_mail_session_t *s); - - -extern ngx_module_t ngx_mail_smtp_module; - - -#endif /* _NGX_MAIL_SMTP_MODULE_H_INCLUDED_ */ diff --git a/src/deps/src/nginx-1.30.3/src/mail/ngx_mail_ssl_module.c b/src/deps/src/nginx-1.30.3/src/mail/ngx_mail_ssl_module.c deleted file mode 100644 index 079d0e7734..0000000000 --- a/src/deps/src/nginx-1.30.3/src/mail/ngx_mail_ssl_module.c +++ /dev/null @@ -1,714 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#include -#include -#include - - -#define NGX_DEFAULT_CIPHERS "HIGH:!aNULL:!MD5" -#define NGX_DEFAULT_ECDH_CURVE "auto" - - -#ifdef TLSEXT_TYPE_application_layer_protocol_negotiation -static int ngx_mail_ssl_alpn_select(ngx_ssl_conn_t *ssl_conn, - const unsigned char **out, unsigned char *outlen, - const unsigned char *in, unsigned int inlen, void *arg); -#endif - -static void *ngx_mail_ssl_create_conf(ngx_conf_t *cf); -static char *ngx_mail_ssl_merge_conf(ngx_conf_t *cf, void *parent, void *child); - -static char *ngx_mail_ssl_starttls(ngx_conf_t *cf, ngx_command_t *cmd, - void *conf); -static char *ngx_mail_ssl_password_file(ngx_conf_t *cf, ngx_command_t *cmd, - void *conf); -static char *ngx_mail_ssl_session_cache(ngx_conf_t *cf, ngx_command_t *cmd, - void *conf); - -static char *ngx_mail_ssl_conf_command_check(ngx_conf_t *cf, void *post, - void *data); - - -static ngx_conf_enum_t ngx_mail_starttls_state[] = { - { ngx_string("off"), NGX_MAIL_STARTTLS_OFF }, - { ngx_string("on"), NGX_MAIL_STARTTLS_ON }, - { ngx_string("only"), NGX_MAIL_STARTTLS_ONLY }, - { ngx_null_string, 0 } -}; - - - -static ngx_conf_bitmask_t ngx_mail_ssl_protocols[] = { - { ngx_string("SSLv2"), NGX_SSL_SSLv2 }, - { ngx_string("SSLv3"), NGX_SSL_SSLv3 }, - { ngx_string("TLSv1"), NGX_SSL_TLSv1 }, - { ngx_string("TLSv1.1"), NGX_SSL_TLSv1_1 }, - { ngx_string("TLSv1.2"), NGX_SSL_TLSv1_2 }, - { ngx_string("TLSv1.3"), NGX_SSL_TLSv1_3 }, - { ngx_null_string, 0 } -}; - - -static ngx_conf_enum_t ngx_mail_ssl_verify[] = { - { ngx_string("off"), 0 }, - { ngx_string("on"), 1 }, - { ngx_string("optional"), 2 }, - { ngx_string("optional_no_ca"), 3 }, - { ngx_null_string, 0 } -}; - - -static ngx_conf_post_t ngx_mail_ssl_conf_command_post = - { ngx_mail_ssl_conf_command_check }; - - -static ngx_command_t ngx_mail_ssl_commands[] = { - - { ngx_string("starttls"), - NGX_MAIL_MAIN_CONF|NGX_MAIL_SRV_CONF|NGX_CONF_TAKE1, - ngx_mail_ssl_starttls, - NGX_MAIL_SRV_CONF_OFFSET, - offsetof(ngx_mail_ssl_conf_t, starttls), - ngx_mail_starttls_state }, - - { ngx_string("ssl_certificate"), - NGX_MAIL_MAIN_CONF|NGX_MAIL_SRV_CONF|NGX_CONF_TAKE1, - ngx_conf_set_str_array_slot, - NGX_MAIL_SRV_CONF_OFFSET, - offsetof(ngx_mail_ssl_conf_t, certificates), - NULL }, - - { ngx_string("ssl_certificate_key"), - NGX_MAIL_MAIN_CONF|NGX_MAIL_SRV_CONF|NGX_CONF_TAKE1, - ngx_conf_set_str_array_slot, - NGX_MAIL_SRV_CONF_OFFSET, - offsetof(ngx_mail_ssl_conf_t, certificate_keys), - NULL }, - - { ngx_string("ssl_password_file"), - NGX_MAIL_MAIN_CONF|NGX_MAIL_SRV_CONF|NGX_CONF_TAKE1, - ngx_mail_ssl_password_file, - NGX_MAIL_SRV_CONF_OFFSET, - 0, - NULL }, - - { ngx_string("ssl_certificate_compression"), - NGX_MAIL_MAIN_CONF|NGX_MAIL_SRV_CONF|NGX_CONF_FLAG, - ngx_conf_set_flag_slot, - NGX_MAIL_SRV_CONF_OFFSET, - offsetof(ngx_mail_ssl_conf_t, certificate_compression), - NULL }, - - { ngx_string("ssl_dhparam"), - NGX_MAIL_MAIN_CONF|NGX_MAIL_SRV_CONF|NGX_CONF_TAKE1, - ngx_conf_set_str_slot, - NGX_MAIL_SRV_CONF_OFFSET, - offsetof(ngx_mail_ssl_conf_t, dhparam), - NULL }, - - { ngx_string("ssl_ecdh_curve"), - NGX_MAIL_MAIN_CONF|NGX_MAIL_SRV_CONF|NGX_CONF_TAKE1, - ngx_conf_set_str_slot, - NGX_MAIL_SRV_CONF_OFFSET, - offsetof(ngx_mail_ssl_conf_t, ecdh_curve), - NULL }, - - { ngx_string("ssl_protocols"), - NGX_MAIL_MAIN_CONF|NGX_MAIL_SRV_CONF|NGX_CONF_1MORE, - ngx_conf_set_bitmask_slot, - NGX_MAIL_SRV_CONF_OFFSET, - offsetof(ngx_mail_ssl_conf_t, protocols), - &ngx_mail_ssl_protocols }, - - { ngx_string("ssl_ciphers"), - NGX_MAIL_MAIN_CONF|NGX_MAIL_SRV_CONF|NGX_CONF_TAKE1, - ngx_conf_set_str_slot, - NGX_MAIL_SRV_CONF_OFFSET, - offsetof(ngx_mail_ssl_conf_t, ciphers), - NULL }, - - { ngx_string("ssl_prefer_server_ciphers"), - NGX_MAIL_MAIN_CONF|NGX_MAIL_SRV_CONF|NGX_CONF_FLAG, - ngx_conf_set_flag_slot, - NGX_MAIL_SRV_CONF_OFFSET, - offsetof(ngx_mail_ssl_conf_t, prefer_server_ciphers), - NULL }, - - { ngx_string("ssl_session_cache"), - NGX_MAIL_MAIN_CONF|NGX_MAIL_SRV_CONF|NGX_CONF_TAKE12, - ngx_mail_ssl_session_cache, - NGX_MAIL_SRV_CONF_OFFSET, - 0, - NULL }, - - { ngx_string("ssl_session_tickets"), - NGX_MAIL_MAIN_CONF|NGX_MAIL_SRV_CONF|NGX_CONF_FLAG, - ngx_conf_set_flag_slot, - NGX_MAIL_SRV_CONF_OFFSET, - offsetof(ngx_mail_ssl_conf_t, session_tickets), - NULL }, - - { ngx_string("ssl_session_ticket_key"), - NGX_MAIL_MAIN_CONF|NGX_MAIL_SRV_CONF|NGX_CONF_TAKE1, - ngx_conf_set_str_array_slot, - NGX_MAIL_SRV_CONF_OFFSET, - offsetof(ngx_mail_ssl_conf_t, session_ticket_keys), - NULL }, - - { ngx_string("ssl_session_timeout"), - NGX_MAIL_MAIN_CONF|NGX_MAIL_SRV_CONF|NGX_CONF_TAKE1, - ngx_conf_set_sec_slot, - NGX_MAIL_SRV_CONF_OFFSET, - offsetof(ngx_mail_ssl_conf_t, session_timeout), - NULL }, - - { ngx_string("ssl_verify_client"), - NGX_MAIL_MAIN_CONF|NGX_MAIL_SRV_CONF|NGX_CONF_TAKE1, - ngx_conf_set_enum_slot, - NGX_MAIL_SRV_CONF_OFFSET, - offsetof(ngx_mail_ssl_conf_t, verify), - &ngx_mail_ssl_verify }, - - { ngx_string("ssl_verify_depth"), - NGX_MAIL_MAIN_CONF|NGX_MAIL_SRV_CONF|NGX_CONF_TAKE1, - ngx_conf_set_num_slot, - NGX_MAIL_SRV_CONF_OFFSET, - offsetof(ngx_mail_ssl_conf_t, verify_depth), - NULL }, - - { ngx_string("ssl_client_certificate"), - NGX_MAIL_MAIN_CONF|NGX_MAIL_SRV_CONF|NGX_CONF_TAKE1, - ngx_conf_set_str_slot, - NGX_MAIL_SRV_CONF_OFFSET, - offsetof(ngx_mail_ssl_conf_t, client_certificate), - NULL }, - - { ngx_string("ssl_trusted_certificate"), - NGX_MAIL_MAIN_CONF|NGX_MAIL_SRV_CONF|NGX_CONF_TAKE1, - ngx_conf_set_str_slot, - NGX_MAIL_SRV_CONF_OFFSET, - offsetof(ngx_mail_ssl_conf_t, trusted_certificate), - NULL }, - - { ngx_string("ssl_crl"), - NGX_MAIL_MAIN_CONF|NGX_MAIL_SRV_CONF|NGX_CONF_TAKE1, - ngx_conf_set_str_slot, - NGX_MAIL_SRV_CONF_OFFSET, - offsetof(ngx_mail_ssl_conf_t, crl), - NULL }, - - { ngx_string("ssl_conf_command"), - NGX_MAIL_MAIN_CONF|NGX_MAIL_SRV_CONF|NGX_CONF_TAKE2, - ngx_conf_set_keyval_slot, - NGX_MAIL_SRV_CONF_OFFSET, - offsetof(ngx_mail_ssl_conf_t, conf_commands), - &ngx_mail_ssl_conf_command_post }, - - ngx_null_command -}; - - -static ngx_mail_module_t ngx_mail_ssl_module_ctx = { - NULL, /* protocol */ - - NULL, /* create main configuration */ - NULL, /* init main configuration */ - - ngx_mail_ssl_create_conf, /* create server configuration */ - ngx_mail_ssl_merge_conf /* merge server configuration */ -}; - - -ngx_module_t ngx_mail_ssl_module = { - NGX_MODULE_V1, - &ngx_mail_ssl_module_ctx, /* module context */ - ngx_mail_ssl_commands, /* module directives */ - NGX_MAIL_MODULE, /* module type */ - NULL, /* init master */ - NULL, /* init module */ - NULL, /* init process */ - NULL, /* init thread */ - NULL, /* exit thread */ - NULL, /* exit process */ - NULL, /* exit master */ - NGX_MODULE_V1_PADDING -}; - - -static ngx_str_t ngx_mail_ssl_sess_id_ctx = ngx_string("MAIL"); - - -#ifdef TLSEXT_TYPE_application_layer_protocol_negotiation - -static int -ngx_mail_ssl_alpn_select(ngx_ssl_conn_t *ssl_conn, const unsigned char **out, - unsigned char *outlen, const unsigned char *in, unsigned int inlen, - void *arg) -{ - unsigned int srvlen; - unsigned char *srv; - ngx_connection_t *c; - ngx_mail_session_t *s; - ngx_mail_core_srv_conf_t *cscf; -#if (NGX_DEBUG) - unsigned int i; -#endif - - c = ngx_ssl_get_connection(ssl_conn); - s = c->data; - -#if (NGX_DEBUG) - for (i = 0; i < inlen; i += in[i] + 1) { - ngx_log_debug2(NGX_LOG_DEBUG_MAIL, c->log, 0, - "SSL ALPN supported by client: %*s", - (size_t) in[i], &in[i + 1]); - } -#endif - - cscf = ngx_mail_get_module_srv_conf(s, ngx_mail_core_module); - - srv = cscf->protocol->alpn.data; - srvlen = cscf->protocol->alpn.len; - - if (SSL_select_next_proto((unsigned char **) out, outlen, srv, srvlen, - in, inlen) - != OPENSSL_NPN_NEGOTIATED) - { - return SSL_TLSEXT_ERR_ALERT_FATAL; - } - - ngx_log_debug2(NGX_LOG_DEBUG_MAIL, c->log, 0, - "SSL ALPN selected: %*s", (size_t) *outlen, *out); - - return SSL_TLSEXT_ERR_OK; -} - -#endif - - -static void * -ngx_mail_ssl_create_conf(ngx_conf_t *cf) -{ - ngx_mail_ssl_conf_t *scf; - - scf = ngx_pcalloc(cf->pool, sizeof(ngx_mail_ssl_conf_t)); - if (scf == NULL) { - return NULL; - } - - /* - * set by ngx_pcalloc(): - * - * scf->listen = 0; - * scf->protocols = 0; - * scf->dhparam = { 0, NULL }; - * scf->ecdh_curve = { 0, NULL }; - * scf->client_certificate = { 0, NULL }; - * scf->trusted_certificate = { 0, NULL }; - * scf->crl = { 0, NULL }; - * scf->ciphers = { 0, NULL }; - * scf->shm_zone = NULL; - */ - - scf->starttls = NGX_CONF_UNSET_UINT; - scf->certificates = NGX_CONF_UNSET_PTR; - scf->certificate_keys = NGX_CONF_UNSET_PTR; - scf->passwords = NGX_CONF_UNSET_PTR; - scf->conf_commands = NGX_CONF_UNSET_PTR; - scf->prefer_server_ciphers = NGX_CONF_UNSET; - scf->certificate_compression = NGX_CONF_UNSET; - scf->verify = NGX_CONF_UNSET_UINT; - scf->verify_depth = NGX_CONF_UNSET_UINT; - scf->builtin_session_cache = NGX_CONF_UNSET; - scf->session_timeout = NGX_CONF_UNSET; - scf->session_tickets = NGX_CONF_UNSET; - scf->session_ticket_keys = NGX_CONF_UNSET_PTR; - - return scf; -} - - -static char * -ngx_mail_ssl_merge_conf(ngx_conf_t *cf, void *parent, void *child) -{ - ngx_mail_ssl_conf_t *prev = parent; - ngx_mail_ssl_conf_t *conf = child; - - char *mode; - ngx_pool_cleanup_t *cln; - - ngx_conf_merge_uint_value(conf->starttls, prev->starttls, - NGX_MAIL_STARTTLS_OFF); - - ngx_conf_merge_value(conf->session_timeout, - prev->session_timeout, 300); - - ngx_conf_merge_value(conf->prefer_server_ciphers, - prev->prefer_server_ciphers, 0); - - ngx_conf_merge_value(conf->certificate_compression, - prev->certificate_compression, 0); - - ngx_conf_merge_bitmask_value(conf->protocols, prev->protocols, - (NGX_CONF_BITMASK_SET|NGX_SSL_DEFAULT_PROTOCOLS)); - - ngx_conf_merge_uint_value(conf->verify, prev->verify, 0); - ngx_conf_merge_uint_value(conf->verify_depth, prev->verify_depth, 1); - - ngx_conf_merge_ptr_value(conf->certificates, prev->certificates, NULL); - ngx_conf_merge_ptr_value(conf->certificate_keys, prev->certificate_keys, - NULL); - - ngx_conf_merge_ptr_value(conf->passwords, prev->passwords, NULL); - - ngx_conf_merge_str_value(conf->dhparam, prev->dhparam, ""); - - ngx_conf_merge_str_value(conf->ecdh_curve, prev->ecdh_curve, - NGX_DEFAULT_ECDH_CURVE); - - ngx_conf_merge_str_value(conf->client_certificate, - prev->client_certificate, ""); - ngx_conf_merge_str_value(conf->trusted_certificate, - prev->trusted_certificate, ""); - ngx_conf_merge_str_value(conf->crl, prev->crl, ""); - - ngx_conf_merge_str_value(conf->ciphers, prev->ciphers, NGX_DEFAULT_CIPHERS); - - ngx_conf_merge_ptr_value(conf->conf_commands, prev->conf_commands, NULL); - - - conf->ssl.log = cf->log; - - if (conf->listen) { - mode = "listen ... ssl"; - - } else if (conf->starttls != NGX_MAIL_STARTTLS_OFF) { - mode = "starttls"; - - } else { - return NGX_CONF_OK; - } - - if (conf->file == NULL) { - conf->file = prev->file; - conf->line = prev->line; - } - - if (conf->certificates == NULL) { - ngx_log_error(NGX_LOG_EMERG, cf->log, 0, - "no \"ssl_certificate\" is defined for " - "the \"%s\" directive in %s:%ui", - mode, conf->file, conf->line); - return NGX_CONF_ERROR; - } - - if (conf->certificate_keys == NULL) { - ngx_log_error(NGX_LOG_EMERG, cf->log, 0, - "no \"ssl_certificate_key\" is defined for " - "the \"%s\" directive in %s:%ui", - mode, conf->file, conf->line); - return NGX_CONF_ERROR; - } - - if (conf->certificate_keys->nelts < conf->certificates->nelts) { - ngx_log_error(NGX_LOG_EMERG, cf->log, 0, - "no \"ssl_certificate_key\" is defined " - "for certificate \"%V\" and " - "the \"%s\" directive in %s:%ui", - ((ngx_str_t *) conf->certificates->elts) - + conf->certificates->nelts - 1, - mode, conf->file, conf->line); - return NGX_CONF_ERROR; - } - - if (ngx_ssl_create(&conf->ssl, conf->protocols, NULL) != NGX_OK) { - return NGX_CONF_ERROR; - } - - cln = ngx_pool_cleanup_add(cf->pool, 0); - if (cln == NULL) { - ngx_ssl_cleanup_ctx(&conf->ssl); - return NGX_CONF_ERROR; - } - - cln->handler = ngx_ssl_cleanup_ctx; - cln->data = &conf->ssl; - -#ifdef TLSEXT_TYPE_application_layer_protocol_negotiation - SSL_CTX_set_alpn_select_cb(conf->ssl.ctx, ngx_mail_ssl_alpn_select, NULL); -#endif - - if (ngx_ssl_ciphers(cf, &conf->ssl, &conf->ciphers, - conf->prefer_server_ciphers) - != NGX_OK) - { - return NGX_CONF_ERROR; - } - - if (ngx_ssl_certificates(cf, &conf->ssl, conf->certificates, - conf->certificate_keys, conf->passwords) - != NGX_OK) - { - return NGX_CONF_ERROR; - } - - if (ngx_ssl_certificate_compression(cf, &conf->ssl, - conf->certificate_compression) - != NGX_OK) - { - return NGX_CONF_ERROR; - } - - if (conf->verify) { - - if (conf->verify != 3 - && conf->client_certificate.len == 0 - && conf->trusted_certificate.len == 0) - { - ngx_log_error(NGX_LOG_EMERG, cf->log, 0, - "no ssl_client_certificate or " - "ssl_trusted_certificate for ssl_verify_client"); - return NGX_CONF_ERROR; - } - - if (ngx_ssl_client_certificate(cf, &conf->ssl, - &conf->client_certificate, - conf->verify_depth) - != NGX_OK) - { - return NGX_CONF_ERROR; - } - - if (ngx_ssl_trusted_certificate(cf, &conf->ssl, - &conf->trusted_certificate, - conf->verify_depth) - != NGX_OK) - { - return NGX_CONF_ERROR; - } - - if (ngx_ssl_crl(cf, &conf->ssl, &conf->crl) != NGX_OK) { - return NGX_CONF_ERROR; - } - } - - if (ngx_ssl_dhparam(cf, &conf->ssl, &conf->dhparam) != NGX_OK) { - return NGX_CONF_ERROR; - } - - if (ngx_ssl_ecdh_curve(cf, &conf->ssl, &conf->ecdh_curve) != NGX_OK) { - return NGX_CONF_ERROR; - } - - ngx_conf_merge_value(conf->builtin_session_cache, - prev->builtin_session_cache, NGX_SSL_NONE_SCACHE); - - if (conf->shm_zone == NULL) { - conf->shm_zone = prev->shm_zone; - } - - if (ngx_ssl_session_cache(&conf->ssl, &ngx_mail_ssl_sess_id_ctx, - conf->certificates, conf->builtin_session_cache, - conf->shm_zone, conf->session_timeout) - != NGX_OK) - { - return NGX_CONF_ERROR; - } - - ngx_conf_merge_value(conf->session_tickets, - prev->session_tickets, 1); - -#ifdef SSL_OP_NO_TICKET - if (!conf->session_tickets) { - SSL_CTX_set_options(conf->ssl.ctx, SSL_OP_NO_TICKET); - } -#endif - - ngx_conf_merge_ptr_value(conf->session_ticket_keys, - prev->session_ticket_keys, NULL); - - if (ngx_ssl_session_ticket_keys(cf, &conf->ssl, conf->session_ticket_keys) - != NGX_OK) - { - return NGX_CONF_ERROR; - } - - if (ngx_ssl_conf_commands(cf, &conf->ssl, conf->conf_commands) != NGX_OK) { - return NGX_CONF_ERROR; - } - - return NGX_CONF_OK; -} - - -static char * -ngx_mail_ssl_starttls(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) -{ - ngx_mail_ssl_conf_t *scf = conf; - - char *rv; - - rv = ngx_conf_set_enum_slot(cf, cmd, conf); - - if (rv != NGX_CONF_OK) { - return rv; - } - - if (!scf->listen) { - scf->file = cf->conf_file->file.name.data; - scf->line = cf->conf_file->line; - } - - return NGX_CONF_OK; -} - - -static char * -ngx_mail_ssl_password_file(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) -{ - ngx_mail_ssl_conf_t *scf = conf; - - ngx_str_t *value; - - if (scf->passwords != NGX_CONF_UNSET_PTR) { - return "is duplicate"; - } - - value = cf->args->elts; - - scf->passwords = ngx_ssl_read_password_file(cf, &value[1]); - - if (scf->passwords == NULL) { - return NGX_CONF_ERROR; - } - - return NGX_CONF_OK; -} - - -static char * -ngx_mail_ssl_session_cache(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) -{ - ngx_mail_ssl_conf_t *scf = conf; - - size_t len; - ngx_str_t *value, name, size; - ngx_int_t n; - ngx_uint_t i, j; - - value = cf->args->elts; - - for (i = 1; i < cf->args->nelts; i++) { - - if (ngx_strcmp(value[i].data, "off") == 0) { - scf->builtin_session_cache = NGX_SSL_NO_SCACHE; - continue; - } - - if (ngx_strcmp(value[i].data, "none") == 0) { - scf->builtin_session_cache = NGX_SSL_NONE_SCACHE; - continue; - } - - if (ngx_strcmp(value[i].data, "builtin") == 0) { - scf->builtin_session_cache = NGX_SSL_DFLT_BUILTIN_SCACHE; - continue; - } - - if (value[i].len > sizeof("builtin:") - 1 - && ngx_strncmp(value[i].data, "builtin:", sizeof("builtin:") - 1) - == 0) - { - n = ngx_atoi(value[i].data + sizeof("builtin:") - 1, - value[i].len - (sizeof("builtin:") - 1)); - - if (n == NGX_ERROR) { - goto invalid; - } - - scf->builtin_session_cache = n; - - continue; - } - - if (value[i].len > sizeof("shared:") - 1 - && ngx_strncmp(value[i].data, "shared:", sizeof("shared:") - 1) - == 0) - { - len = 0; - - for (j = sizeof("shared:") - 1; j < value[i].len; j++) { - if (value[i].data[j] == ':') { - break; - } - - len++; - } - - if (len == 0 || j == value[i].len) { - goto invalid; - } - - name.len = len; - name.data = value[i].data + sizeof("shared:") - 1; - - size.len = value[i].len - j - 1; - size.data = name.data + len + 1; - - n = ngx_parse_size(&size); - - if (n == NGX_ERROR) { - goto invalid; - } - - if (n < (ngx_int_t) (8 * ngx_pagesize)) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "session cache \"%V\" is too small", - &value[i]); - - return NGX_CONF_ERROR; - } - - scf->shm_zone = ngx_shared_memory_add(cf, &name, n, - &ngx_mail_ssl_module); - if (scf->shm_zone == NULL) { - return NGX_CONF_ERROR; - } - - scf->shm_zone->init = ngx_ssl_session_cache_init; - - continue; - } - - goto invalid; - } - - if (scf->shm_zone && scf->builtin_session_cache == NGX_CONF_UNSET) { - scf->builtin_session_cache = NGX_SSL_NO_BUILTIN_SCACHE; - } - - return NGX_CONF_OK; - -invalid: - - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "invalid session cache \"%V\"", &value[i]); - - return NGX_CONF_ERROR; -} - - -static char * -ngx_mail_ssl_conf_command_check(ngx_conf_t *cf, void *post, void *data) -{ -#ifndef SSL_CONF_FLAG_FILE - return "is not supported on this platform"; -#else - return NGX_CONF_OK; -#endif -} diff --git a/src/deps/src/nginx-1.30.3/src/mail/ngx_mail_ssl_module.h b/src/deps/src/nginx-1.30.3/src/mail/ngx_mail_ssl_module.h deleted file mode 100644 index a0e9a173a7..0000000000 --- a/src/deps/src/nginx-1.30.3/src/mail/ngx_mail_ssl_module.h +++ /dev/null @@ -1,66 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#ifndef _NGX_MAIL_SSL_H_INCLUDED_ -#define _NGX_MAIL_SSL_H_INCLUDED_ - - -#include -#include -#include - - -#define NGX_MAIL_STARTTLS_OFF 0 -#define NGX_MAIL_STARTTLS_ON 1 -#define NGX_MAIL_STARTTLS_ONLY 2 - - -typedef struct { - ngx_flag_t prefer_server_ciphers; - ngx_flag_t certificate_compression; - - ngx_ssl_t ssl; - - ngx_uint_t starttls; - ngx_uint_t listen; - ngx_uint_t protocols; - - ngx_uint_t verify; - ngx_uint_t verify_depth; - - ssize_t builtin_session_cache; - - time_t session_timeout; - - ngx_array_t *certificates; - ngx_array_t *certificate_keys; - - ngx_str_t dhparam; - ngx_str_t ecdh_curve; - ngx_str_t client_certificate; - ngx_str_t trusted_certificate; - ngx_str_t crl; - - ngx_str_t ciphers; - - ngx_array_t *passwords; - ngx_array_t *conf_commands; - - ngx_shm_zone_t *shm_zone; - - ngx_flag_t session_tickets; - ngx_array_t *session_ticket_keys; - - u_char *file; - ngx_uint_t line; -} ngx_mail_ssl_conf_t; - - -extern ngx_module_t ngx_mail_ssl_module; - - -#endif /* _NGX_MAIL_SSL_H_INCLUDED_ */ diff --git a/src/deps/src/nginx-1.30.3/src/misc/ngx_cpp_test_module.cpp b/src/deps/src/nginx-1.30.3/src/misc/ngx_cpp_test_module.cpp deleted file mode 100644 index 002640990f..0000000000 --- a/src/deps/src/nginx-1.30.3/src/misc/ngx_cpp_test_module.cpp +++ /dev/null @@ -1,31 +0,0 @@ - -// stub module to test header files' C++ compatibility - -extern "C" { - #include - #include - #include - #include - #include - - #include - - #include - #include - #include - #include - - #include -} - -// nginx header files should go before other, because they define 64-bit off_t -// #include - - -void ngx_cpp_test_handler(void *data); - -void -ngx_cpp_test_handler(void *data) -{ - return; -} diff --git a/src/deps/src/nginx-1.30.3/src/misc/ngx_google_perftools_module.c b/src/deps/src/nginx-1.30.3/src/misc/ngx_google_perftools_module.c deleted file mode 100644 index 381f3d105f..0000000000 --- a/src/deps/src/nginx-1.30.3/src/misc/ngx_google_perftools_module.c +++ /dev/null @@ -1,126 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#include -#include - -/* - * declare Profiler interface here because - * is C++ header file - */ - -int ProfilerStart(u_char* fname); -void ProfilerStop(void); -void ProfilerRegisterThread(void); - - -static void *ngx_google_perftools_create_conf(ngx_cycle_t *cycle); -static ngx_int_t ngx_google_perftools_worker(ngx_cycle_t *cycle); - - -typedef struct { - ngx_str_t profiles; -} ngx_google_perftools_conf_t; - - -static ngx_command_t ngx_google_perftools_commands[] = { - - { ngx_string("google_perftools_profiles"), - NGX_MAIN_CONF|NGX_DIRECT_CONF|NGX_CONF_TAKE1, - ngx_conf_set_str_slot, - 0, - offsetof(ngx_google_perftools_conf_t, profiles), - NULL }, - - ngx_null_command -}; - - -static ngx_core_module_t ngx_google_perftools_module_ctx = { - ngx_string("google_perftools"), - ngx_google_perftools_create_conf, - NULL -}; - - -ngx_module_t ngx_google_perftools_module = { - NGX_MODULE_V1, - &ngx_google_perftools_module_ctx, /* module context */ - ngx_google_perftools_commands, /* module directives */ - NGX_CORE_MODULE, /* module type */ - NULL, /* init master */ - NULL, /* init module */ - ngx_google_perftools_worker, /* init process */ - NULL, /* init thread */ - NULL, /* exit thread */ - NULL, /* exit process */ - NULL, /* exit master */ - NGX_MODULE_V1_PADDING -}; - - -static void * -ngx_google_perftools_create_conf(ngx_cycle_t *cycle) -{ - ngx_google_perftools_conf_t *gptcf; - - gptcf = ngx_pcalloc(cycle->pool, sizeof(ngx_google_perftools_conf_t)); - if (gptcf == NULL) { - return NULL; - } - - /* - * set by ngx_pcalloc() - * - * gptcf->profiles = { 0, NULL }; - */ - - return gptcf; -} - - -static ngx_int_t -ngx_google_perftools_worker(ngx_cycle_t *cycle) -{ - u_char *profile; - ngx_google_perftools_conf_t *gptcf; - - gptcf = (ngx_google_perftools_conf_t *) - ngx_get_conf(cycle->conf_ctx, ngx_google_perftools_module); - - if (gptcf->profiles.len == 0) { - return NGX_OK; - } - - profile = ngx_alloc(gptcf->profiles.len + NGX_INT_T_LEN + 2, cycle->log); - if (profile == NULL) { - return NGX_OK; - } - - if (getenv("CPUPROFILE")) { - /* disable inherited Profiler enabled in master process */ - ProfilerStop(); - } - - ngx_sprintf(profile, "%V.%d%Z", &gptcf->profiles, ngx_pid); - - if (ProfilerStart(profile)) { - /* start ITIMER_PROF timer */ - ProfilerRegisterThread(); - - } else { - ngx_log_error(NGX_LOG_CRIT, cycle->log, ngx_errno, - "ProfilerStart(%s) failed", profile); - } - - ngx_free(profile); - - return NGX_OK; -} - - -/* ProfilerStop() is called on Profiler destruction */ diff --git a/src/deps/src/nginx-1.30.3/src/os/unix/ngx_alloc.c b/src/deps/src/nginx-1.30.3/src/os/unix/ngx_alloc.c deleted file mode 100644 index 5c2f787025..0000000000 --- a/src/deps/src/nginx-1.30.3/src/os/unix/ngx_alloc.c +++ /dev/null @@ -1,90 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#include -#include - - -ngx_uint_t ngx_pagesize; -ngx_uint_t ngx_pagesize_shift; -ngx_uint_t ngx_cacheline_size; - - -void * -ngx_alloc(size_t size, ngx_log_t *log) -{ - void *p; - - p = malloc(size); - if (p == NULL) { - ngx_log_error(NGX_LOG_EMERG, log, ngx_errno, - "malloc(%uz) failed", size); - } - - ngx_log_debug2(NGX_LOG_DEBUG_ALLOC, log, 0, "malloc: %p:%uz", p, size); - - return p; -} - - -void * -ngx_calloc(size_t size, ngx_log_t *log) -{ - void *p; - - p = ngx_alloc(size, log); - - if (p) { - ngx_memzero(p, size); - } - - return p; -} - - -#if (NGX_HAVE_POSIX_MEMALIGN) - -void * -ngx_memalign(size_t alignment, size_t size, ngx_log_t *log) -{ - void *p; - int err; - - err = posix_memalign(&p, alignment, size); - - if (err) { - ngx_log_error(NGX_LOG_EMERG, log, err, - "posix_memalign(%uz, %uz) failed", alignment, size); - p = NULL; - } - - ngx_log_debug3(NGX_LOG_DEBUG_ALLOC, log, 0, - "posix_memalign: %p:%uz @%uz", p, size, alignment); - - return p; -} - -#elif (NGX_HAVE_MEMALIGN) - -void * -ngx_memalign(size_t alignment, size_t size, ngx_log_t *log) -{ - void *p; - - p = memalign(alignment, size); - if (p == NULL) { - ngx_log_error(NGX_LOG_EMERG, log, ngx_errno, - "memalign(%uz, %uz) failed", alignment, size); - } - - ngx_log_debug3(NGX_LOG_DEBUG_ALLOC, log, 0, - "memalign: %p:%uz @%uz", p, size, alignment); - - return p; -} - -#endif diff --git a/src/deps/src/nginx-1.30.3/src/os/unix/ngx_alloc.h b/src/deps/src/nginx-1.30.3/src/os/unix/ngx_alloc.h deleted file mode 100644 index 655db257f4..0000000000 --- a/src/deps/src/nginx-1.30.3/src/os/unix/ngx_alloc.h +++ /dev/null @@ -1,45 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#ifndef _NGX_ALLOC_H_INCLUDED_ -#define _NGX_ALLOC_H_INCLUDED_ - - -#include -#include - - -void *ngx_alloc(size_t size, ngx_log_t *log); -void *ngx_calloc(size_t size, ngx_log_t *log); - -#define ngx_free free - - -/* - * Linux has memalign() or posix_memalign() - * Solaris has memalign() - * FreeBSD 7.0 has posix_memalign(), besides, early version's malloc() - * aligns allocations bigger than page size at the page boundary - */ - -#if (NGX_HAVE_POSIX_MEMALIGN || NGX_HAVE_MEMALIGN) - -void *ngx_memalign(size_t alignment, size_t size, ngx_log_t *log); - -#else - -#define ngx_memalign(alignment, size, log) ngx_alloc(size, log) - -#endif - - -extern ngx_uint_t ngx_pagesize; -extern ngx_uint_t ngx_pagesize_shift; -extern ngx_uint_t ngx_cacheline_size; - - -#endif /* _NGX_ALLOC_H_INCLUDED_ */ diff --git a/src/deps/src/nginx-1.30.3/src/os/unix/ngx_atomic.h b/src/deps/src/nginx-1.30.3/src/os/unix/ngx_atomic.h deleted file mode 100644 index fcab2d6a0c..0000000000 --- a/src/deps/src/nginx-1.30.3/src/os/unix/ngx_atomic.h +++ /dev/null @@ -1,313 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#ifndef _NGX_ATOMIC_H_INCLUDED_ -#define _NGX_ATOMIC_H_INCLUDED_ - - -#include -#include - - -#if (NGX_HAVE_LIBATOMIC) - -#define AO_REQUIRE_CAS -#include - -#define NGX_HAVE_ATOMIC_OPS 1 - -typedef long ngx_atomic_int_t; -typedef AO_t ngx_atomic_uint_t; -typedef volatile ngx_atomic_uint_t ngx_atomic_t; - -#if (NGX_PTR_SIZE == 8) -#define NGX_ATOMIC_T_LEN (sizeof("-9223372036854775808") - 1) -#else -#define NGX_ATOMIC_T_LEN (sizeof("-2147483648") - 1) -#endif - -#define ngx_atomic_cmp_set(lock, old, new) \ - AO_compare_and_swap(lock, old, new) -#define ngx_atomic_fetch_add(value, add) \ - AO_fetch_and_add(value, add) -#define ngx_memory_barrier() AO_nop() -#define ngx_cpu_pause() - - -#elif (NGX_HAVE_GCC_ATOMIC) - -/* GCC 4.1 builtin atomic operations */ - -#define NGX_HAVE_ATOMIC_OPS 1 - -typedef long ngx_atomic_int_t; -typedef unsigned long ngx_atomic_uint_t; - -#if (NGX_PTR_SIZE == 8) -#define NGX_ATOMIC_T_LEN (sizeof("-9223372036854775808") - 1) -#else -#define NGX_ATOMIC_T_LEN (sizeof("-2147483648") - 1) -#endif - -typedef volatile ngx_atomic_uint_t ngx_atomic_t; - - -#define ngx_atomic_cmp_set(lock, old, set) \ - __sync_bool_compare_and_swap(lock, old, set) - -#define ngx_atomic_fetch_add(value, add) \ - __sync_fetch_and_add(value, add) - -#define ngx_memory_barrier() __sync_synchronize() - -#if ( __i386__ || __i386 || __amd64__ || __amd64 ) -#define ngx_cpu_pause() __asm__ ("pause") -#else -#define ngx_cpu_pause() -#endif - - -#elif (NGX_DARWIN_ATOMIC) - -/* - * use Darwin 8 atomic(3) and barrier(3) operations - * optimized at run-time for UP and SMP - */ - -#include - -/* "bool" conflicts with perl's CORE/handy.h */ -#if 0 -#undef bool -#endif - - -#define NGX_HAVE_ATOMIC_OPS 1 - -#if (NGX_PTR_SIZE == 8) - -typedef int64_t ngx_atomic_int_t; -typedef uint64_t ngx_atomic_uint_t; -#define NGX_ATOMIC_T_LEN (sizeof("-9223372036854775808") - 1) - -#define ngx_atomic_cmp_set(lock, old, new) \ - OSAtomicCompareAndSwap64Barrier(old, new, (int64_t *) lock) - -#define ngx_atomic_fetch_add(value, add) \ - (OSAtomicAdd64(add, (int64_t *) value) - add) - -#else - -typedef int32_t ngx_atomic_int_t; -typedef uint32_t ngx_atomic_uint_t; -#define NGX_ATOMIC_T_LEN (sizeof("-2147483648") - 1) - -#define ngx_atomic_cmp_set(lock, old, new) \ - OSAtomicCompareAndSwap32Barrier(old, new, (int32_t *) lock) - -#define ngx_atomic_fetch_add(value, add) \ - (OSAtomicAdd32(add, (int32_t *) value) - add) - -#endif - -#define ngx_memory_barrier() OSMemoryBarrier() - -#define ngx_cpu_pause() - -typedef volatile ngx_atomic_uint_t ngx_atomic_t; - - -#elif ( __i386__ || __i386 ) - -typedef int32_t ngx_atomic_int_t; -typedef uint32_t ngx_atomic_uint_t; -typedef volatile ngx_atomic_uint_t ngx_atomic_t; -#define NGX_ATOMIC_T_LEN (sizeof("-2147483648") - 1) - - -#if ( __SUNPRO_C ) - -#define NGX_HAVE_ATOMIC_OPS 1 - -ngx_atomic_uint_t -ngx_atomic_cmp_set(ngx_atomic_t *lock, ngx_atomic_uint_t old, - ngx_atomic_uint_t set); - -ngx_atomic_int_t -ngx_atomic_fetch_add(ngx_atomic_t *value, ngx_atomic_int_t add); - -/* - * Sun Studio 12 exits with segmentation fault on '__asm ("pause")', - * so ngx_cpu_pause is declared in src/os/unix/ngx_sunpro_x86.il - */ - -void -ngx_cpu_pause(void); - -/* the code in src/os/unix/ngx_sunpro_x86.il */ - -#define ngx_memory_barrier() __asm (".volatile"); __asm (".nonvolatile") - - -#else /* ( __GNUC__ || __INTEL_COMPILER ) */ - -#define NGX_HAVE_ATOMIC_OPS 1 - -#include "ngx_gcc_atomic_x86.h" - -#endif - - -#elif ( __amd64__ || __amd64 ) - -typedef int64_t ngx_atomic_int_t; -typedef uint64_t ngx_atomic_uint_t; -typedef volatile ngx_atomic_uint_t ngx_atomic_t; -#define NGX_ATOMIC_T_LEN (sizeof("-9223372036854775808") - 1) - - -#if ( __SUNPRO_C ) - -#define NGX_HAVE_ATOMIC_OPS 1 - -ngx_atomic_uint_t -ngx_atomic_cmp_set(ngx_atomic_t *lock, ngx_atomic_uint_t old, - ngx_atomic_uint_t set); - -ngx_atomic_int_t -ngx_atomic_fetch_add(ngx_atomic_t *value, ngx_atomic_int_t add); - -/* - * Sun Studio 12 exits with segmentation fault on '__asm ("pause")', - * so ngx_cpu_pause is declared in src/os/unix/ngx_sunpro_amd64.il - */ - -void -ngx_cpu_pause(void); - -/* the code in src/os/unix/ngx_sunpro_amd64.il */ - -#define ngx_memory_barrier() __asm (".volatile"); __asm (".nonvolatile") - - -#else /* ( __GNUC__ || __INTEL_COMPILER ) */ - -#define NGX_HAVE_ATOMIC_OPS 1 - -#include "ngx_gcc_atomic_amd64.h" - -#endif - - -#elif ( __sparc__ || __sparc || __sparcv9 ) - -#if (NGX_PTR_SIZE == 8) - -typedef int64_t ngx_atomic_int_t; -typedef uint64_t ngx_atomic_uint_t; -#define NGX_ATOMIC_T_LEN (sizeof("-9223372036854775808") - 1) - -#else - -typedef int32_t ngx_atomic_int_t; -typedef uint32_t ngx_atomic_uint_t; -#define NGX_ATOMIC_T_LEN (sizeof("-2147483648") - 1) - -#endif - -typedef volatile ngx_atomic_uint_t ngx_atomic_t; - - -#if ( __SUNPRO_C ) - -#define NGX_HAVE_ATOMIC_OPS 1 - -#include "ngx_sunpro_atomic_sparc64.h" - - -#else /* ( __GNUC__ || __INTEL_COMPILER ) */ - -#define NGX_HAVE_ATOMIC_OPS 1 - -#include "ngx_gcc_atomic_sparc64.h" - -#endif - - -#elif ( __powerpc__ || __POWERPC__ ) - -#define NGX_HAVE_ATOMIC_OPS 1 - -#if (NGX_PTR_SIZE == 8) - -typedef int64_t ngx_atomic_int_t; -typedef uint64_t ngx_atomic_uint_t; -#define NGX_ATOMIC_T_LEN (sizeof("-9223372036854775808") - 1) - -#else - -typedef int32_t ngx_atomic_int_t; -typedef uint32_t ngx_atomic_uint_t; -#define NGX_ATOMIC_T_LEN (sizeof("-2147483648") - 1) - -#endif - -typedef volatile ngx_atomic_uint_t ngx_atomic_t; - - -#include "ngx_gcc_atomic_ppc.h" - -#endif - - -#if !(NGX_HAVE_ATOMIC_OPS) - -#define NGX_HAVE_ATOMIC_OPS 0 - -typedef int32_t ngx_atomic_int_t; -typedef uint32_t ngx_atomic_uint_t; -typedef volatile ngx_atomic_uint_t ngx_atomic_t; -#define NGX_ATOMIC_T_LEN (sizeof("-2147483648") - 1) - - -static ngx_inline ngx_atomic_uint_t -ngx_atomic_cmp_set(ngx_atomic_t *lock, ngx_atomic_uint_t old, - ngx_atomic_uint_t set) -{ - if (*lock == old) { - *lock = set; - return 1; - } - - return 0; -} - - -static ngx_inline ngx_atomic_int_t -ngx_atomic_fetch_add(ngx_atomic_t *value, ngx_atomic_int_t add) -{ - ngx_atomic_int_t old; - - old = *value; - *value += add; - - return old; -} - -#define ngx_memory_barrier() -#define ngx_cpu_pause() - -#endif - - -void ngx_spinlock(ngx_atomic_t *lock, ngx_atomic_int_t value, ngx_uint_t spin); - -#define ngx_trylock(lock) (*(lock) == 0 && ngx_atomic_cmp_set(lock, 0, 1)) -#define ngx_unlock(lock) *(lock) = 0 - - -#endif /* _NGX_ATOMIC_H_INCLUDED_ */ diff --git a/src/deps/src/nginx-1.30.3/src/os/unix/ngx_channel.c b/src/deps/src/nginx-1.30.3/src/os/unix/ngx_channel.c deleted file mode 100644 index 1efa0667cb..0000000000 --- a/src/deps/src/nginx-1.30.3/src/os/unix/ngx_channel.c +++ /dev/null @@ -1,253 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#include -#include -#include - - -ngx_int_t -ngx_write_channel(ngx_socket_t s, ngx_channel_t *ch, size_t size, - ngx_log_t *log) -{ - ssize_t n; - ngx_err_t err; - struct iovec iov[1]; - struct msghdr msg; - -#if (NGX_HAVE_MSGHDR_MSG_CONTROL) - - union { - struct cmsghdr cm; - char space[CMSG_SPACE(sizeof(int))]; - } cmsg; - - if (ch->fd == -1) { - msg.msg_control = NULL; - msg.msg_controllen = 0; - - } else { - msg.msg_control = (caddr_t) &cmsg; - msg.msg_controllen = sizeof(cmsg); - - ngx_memzero(&cmsg, sizeof(cmsg)); - - cmsg.cm.cmsg_len = CMSG_LEN(sizeof(int)); - cmsg.cm.cmsg_level = SOL_SOCKET; - cmsg.cm.cmsg_type = SCM_RIGHTS; - - /* - * We have to use ngx_memcpy() instead of simple - * *(int *) CMSG_DATA(&cmsg.cm) = ch->fd; - * because some gcc 4.4 with -O2/3/s optimization issues the warning: - * dereferencing type-punned pointer will break strict-aliasing rules - * - * Fortunately, gcc with -O1 compiles this ngx_memcpy() - * in the same simple assignment as in the code above - */ - - ngx_memcpy(CMSG_DATA(&cmsg.cm), &ch->fd, sizeof(int)); - } - - msg.msg_flags = 0; - -#else - - if (ch->fd == -1) { - msg.msg_accrights = NULL; - msg.msg_accrightslen = 0; - - } else { - msg.msg_accrights = (caddr_t) &ch->fd; - msg.msg_accrightslen = sizeof(int); - } - -#endif - - iov[0].iov_base = (char *) ch; - iov[0].iov_len = size; - - msg.msg_name = NULL; - msg.msg_namelen = 0; - msg.msg_iov = iov; - msg.msg_iovlen = 1; - - n = sendmsg(s, &msg, 0); - - if (n == -1) { - err = ngx_errno; - if (err == NGX_EAGAIN) { - return NGX_AGAIN; - } - - ngx_log_error(NGX_LOG_ALERT, log, err, "sendmsg() failed"); - return NGX_ERROR; - } - - return NGX_OK; -} - - -ngx_int_t -ngx_read_channel(ngx_socket_t s, ngx_channel_t *ch, size_t size, ngx_log_t *log) -{ - ssize_t n; - ngx_err_t err; - struct iovec iov[1]; - struct msghdr msg; - -#if (NGX_HAVE_MSGHDR_MSG_CONTROL) - union { - struct cmsghdr cm; - char space[CMSG_SPACE(sizeof(int))]; - } cmsg; -#else - int fd; -#endif - - iov[0].iov_base = (char *) ch; - iov[0].iov_len = size; - - msg.msg_name = NULL; - msg.msg_namelen = 0; - msg.msg_iov = iov; - msg.msg_iovlen = 1; - -#if (NGX_HAVE_MSGHDR_MSG_CONTROL) - msg.msg_control = (caddr_t) &cmsg; - msg.msg_controllen = sizeof(cmsg); -#else - msg.msg_accrights = (caddr_t) &fd; - msg.msg_accrightslen = sizeof(int); -#endif - - n = recvmsg(s, &msg, 0); - - if (n == -1) { - err = ngx_errno; - if (err == NGX_EAGAIN) { - return NGX_AGAIN; - } - - ngx_log_error(NGX_LOG_ALERT, log, err, "recvmsg() failed"); - return NGX_ERROR; - } - - if (n == 0) { - ngx_log_debug0(NGX_LOG_DEBUG_CORE, log, 0, "recvmsg() returned zero"); - return NGX_ERROR; - } - - if ((size_t) n < sizeof(ngx_channel_t)) { - ngx_log_error(NGX_LOG_ALERT, log, 0, - "recvmsg() returned not enough data: %z", n); - return NGX_ERROR; - } - -#if (NGX_HAVE_MSGHDR_MSG_CONTROL) - - if (ch->command == NGX_CMD_OPEN_CHANNEL) { - - if (cmsg.cm.cmsg_len < (socklen_t) CMSG_LEN(sizeof(int))) { - ngx_log_error(NGX_LOG_ALERT, log, 0, - "recvmsg() returned too small ancillary data"); - return NGX_ERROR; - } - - if (cmsg.cm.cmsg_level != SOL_SOCKET || cmsg.cm.cmsg_type != SCM_RIGHTS) - { - ngx_log_error(NGX_LOG_ALERT, log, 0, - "recvmsg() returned invalid ancillary data " - "level %d or type %d", - cmsg.cm.cmsg_level, cmsg.cm.cmsg_type); - return NGX_ERROR; - } - - /* ch->fd = *(int *) CMSG_DATA(&cmsg.cm); */ - - ngx_memcpy(&ch->fd, CMSG_DATA(&cmsg.cm), sizeof(int)); - } - - if (msg.msg_flags & (MSG_TRUNC|MSG_CTRUNC)) { - ngx_log_error(NGX_LOG_ALERT, log, 0, - "recvmsg() truncated data"); - } - -#else - - if (ch->command == NGX_CMD_OPEN_CHANNEL) { - if (msg.msg_accrightslen != sizeof(int)) { - ngx_log_error(NGX_LOG_ALERT, log, 0, - "recvmsg() returned no ancillary data"); - return NGX_ERROR; - } - - ch->fd = fd; - } - -#endif - - return n; -} - - -ngx_int_t -ngx_add_channel_event(ngx_cycle_t *cycle, ngx_fd_t fd, ngx_int_t event, - ngx_event_handler_pt handler) -{ - ngx_event_t *ev, *rev, *wev; - ngx_connection_t *c; - - c = ngx_get_connection(fd, cycle->log); - - if (c == NULL) { - return NGX_ERROR; - } - - c->pool = cycle->pool; - - rev = c->read; - wev = c->write; - - rev->log = cycle->log; - wev->log = cycle->log; - - rev->channel = 1; - wev->channel = 1; - - ev = (event == NGX_READ_EVENT) ? rev : wev; - - ev->handler = handler; - - if (ngx_add_conn && (ngx_event_flags & NGX_USE_EPOLL_EVENT) == 0) { - if (ngx_add_conn(c) == NGX_ERROR) { - ngx_free_connection(c); - return NGX_ERROR; - } - - } else { - if (ngx_add_event(ev, event, 0) == NGX_ERROR) { - ngx_free_connection(c); - return NGX_ERROR; - } - } - - return NGX_OK; -} - - -void -ngx_close_channel(ngx_fd_t *fd, ngx_log_t *log) -{ - if (close(fd[0]) == -1) { - ngx_log_error(NGX_LOG_ALERT, log, ngx_errno, "close() channel failed"); - } - - if (close(fd[1]) == -1) { - ngx_log_error(NGX_LOG_ALERT, log, ngx_errno, "close() channel failed"); - } -} diff --git a/src/deps/src/nginx-1.30.3/src/os/unix/ngx_channel.h b/src/deps/src/nginx-1.30.3/src/os/unix/ngx_channel.h deleted file mode 100644 index 362cc649aa..0000000000 --- a/src/deps/src/nginx-1.30.3/src/os/unix/ngx_channel.h +++ /dev/null @@ -1,34 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#ifndef _NGX_CHANNEL_H_INCLUDED_ -#define _NGX_CHANNEL_H_INCLUDED_ - - -#include -#include -#include - - -typedef struct { - ngx_uint_t command; - ngx_pid_t pid; - ngx_int_t slot; - ngx_fd_t fd; -} ngx_channel_t; - - -ngx_int_t ngx_write_channel(ngx_socket_t s, ngx_channel_t *ch, size_t size, - ngx_log_t *log); -ngx_int_t ngx_read_channel(ngx_socket_t s, ngx_channel_t *ch, size_t size, - ngx_log_t *log); -ngx_int_t ngx_add_channel_event(ngx_cycle_t *cycle, ngx_fd_t fd, - ngx_int_t event, ngx_event_handler_pt handler); -void ngx_close_channel(ngx_fd_t *fd, ngx_log_t *log); - - -#endif /* _NGX_CHANNEL_H_INCLUDED_ */ diff --git a/src/deps/src/nginx-1.30.3/src/os/unix/ngx_daemon.c b/src/deps/src/nginx-1.30.3/src/os/unix/ngx_daemon.c deleted file mode 100644 index 385c49b6c3..0000000000 --- a/src/deps/src/nginx-1.30.3/src/os/unix/ngx_daemon.c +++ /dev/null @@ -1,71 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#include -#include - - -ngx_int_t -ngx_daemon(ngx_log_t *log) -{ - int fd; - - switch (fork()) { - case -1: - ngx_log_error(NGX_LOG_EMERG, log, ngx_errno, "fork() failed"); - return NGX_ERROR; - - case 0: - break; - - default: - exit(0); - } - - ngx_parent = ngx_pid; - ngx_pid = ngx_getpid(); - - if (setsid() == -1) { - ngx_log_error(NGX_LOG_EMERG, log, ngx_errno, "setsid() failed"); - return NGX_ERROR; - } - - umask(0); - - fd = open("/dev/null", O_RDWR); - if (fd == -1) { - ngx_log_error(NGX_LOG_EMERG, log, ngx_errno, - "open(\"/dev/null\") failed"); - return NGX_ERROR; - } - - if (dup2(fd, STDIN_FILENO) == -1) { - ngx_log_error(NGX_LOG_EMERG, log, ngx_errno, "dup2(STDIN) failed"); - return NGX_ERROR; - } - - if (dup2(fd, STDOUT_FILENO) == -1) { - ngx_log_error(NGX_LOG_EMERG, log, ngx_errno, "dup2(STDOUT) failed"); - return NGX_ERROR; - } - -#if 0 - if (dup2(fd, STDERR_FILENO) == -1) { - ngx_log_error(NGX_LOG_EMERG, log, ngx_errno, "dup2(STDERR) failed"); - return NGX_ERROR; - } -#endif - - if (fd > STDERR_FILENO) { - if (close(fd) == -1) { - ngx_log_error(NGX_LOG_EMERG, log, ngx_errno, "close() failed"); - return NGX_ERROR; - } - } - - return NGX_OK; -} diff --git a/src/deps/src/nginx-1.30.3/src/os/unix/ngx_darwin.h b/src/deps/src/nginx-1.30.3/src/os/unix/ngx_darwin.h deleted file mode 100644 index 4d01b26ea5..0000000000 --- a/src/deps/src/nginx-1.30.3/src/os/unix/ngx_darwin.h +++ /dev/null @@ -1,23 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#ifndef _NGX_DARWIN_H_INCLUDED_ -#define _NGX_DARWIN_H_INCLUDED_ - - -void ngx_debug_init(void); -ngx_chain_t *ngx_darwin_sendfile_chain(ngx_connection_t *c, ngx_chain_t *in, - off_t limit); - -extern int ngx_darwin_kern_osreldate; -extern int ngx_darwin_hw_ncpu; -extern u_long ngx_darwin_net_inet_tcp_sendspace; - -extern ngx_uint_t ngx_debug_malloc; - - -#endif /* _NGX_DARWIN_H_INCLUDED_ */ diff --git a/src/deps/src/nginx-1.30.3/src/os/unix/ngx_darwin_config.h b/src/deps/src/nginx-1.30.3/src/os/unix/ngx_darwin_config.h deleted file mode 100644 index 0dfe633741..0000000000 --- a/src/deps/src/nginx-1.30.3/src/os/unix/ngx_darwin_config.h +++ /dev/null @@ -1,100 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#ifndef _NGX_DARWIN_CONFIG_H_INCLUDED_ -#define _NGX_DARWIN_CONFIG_H_INCLUDED_ - - -#define __APPLE_USE_RFC_3542 /* IPV6_PKTINFO */ - - -#include -#include -#include -#include -#include -#include /* offsetof() */ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include /* statfs() */ - -#include /* FIONBIO */ -#include -#include -#include -#include - -#include -#include -#include -#include - -#include -#include -#include /* TCP_NODELAY */ -#include -#include -#include - -#include -#include - -#include - - -#ifndef IOV_MAX -#define IOV_MAX 64 -#endif - - -#include - - -#if (NGX_HAVE_POSIX_SEM) -#include -#endif - - -#if (NGX_HAVE_POLL) -#include -#endif - - -#if (NGX_HAVE_KQUEUE) -#include -#endif - - -#define NGX_LISTEN_BACKLOG -1 - - -#ifndef NGX_HAVE_INHERITED_NONBLOCK -#define NGX_HAVE_INHERITED_NONBLOCK 1 -#endif - - -#ifndef NGX_HAVE_CASELESS_FILESYSTEM -#define NGX_HAVE_CASELESS_FILESYSTEM 1 -#endif - - -#define NGX_HAVE_OS_SPECIFIC_INIT 1 -#define NGX_HAVE_DEBUG_MALLOC 1 - - -extern char **environ; - - -#endif /* _NGX_DARWIN_CONFIG_H_INCLUDED_ */ diff --git a/src/deps/src/nginx-1.30.3/src/os/unix/ngx_darwin_init.c b/src/deps/src/nginx-1.30.3/src/os/unix/ngx_darwin_init.c deleted file mode 100644 index 70748ee57a..0000000000 --- a/src/deps/src/nginx-1.30.3/src/os/unix/ngx_darwin_init.c +++ /dev/null @@ -1,204 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#include -#include - - -char ngx_darwin_kern_ostype[16]; -char ngx_darwin_kern_osrelease[128]; -int ngx_darwin_hw_ncpu; -int ngx_darwin_kern_ipc_somaxconn; -u_long ngx_darwin_net_inet_tcp_sendspace; -int64_t ngx_darwin_hw_cachelinesize; - -ngx_uint_t ngx_debug_malloc; - - -static ngx_os_io_t ngx_darwin_io = { - ngx_unix_recv, - ngx_readv_chain, - ngx_udp_unix_recv, - ngx_unix_send, - ngx_udp_unix_send, - ngx_udp_unix_sendmsg_chain, -#if (NGX_HAVE_SENDFILE) - ngx_darwin_sendfile_chain, - NGX_IO_SENDFILE -#else - ngx_writev_chain, - 0 -#endif -}; - - -typedef struct { - char *name; - void *value; - size_t size; - ngx_uint_t exists; -} sysctl_t; - - -sysctl_t sysctls[] = { - { "hw.ncpu", - &ngx_darwin_hw_ncpu, - sizeof(ngx_darwin_hw_ncpu), 0 }, - - { "net.inet.tcp.sendspace", - &ngx_darwin_net_inet_tcp_sendspace, - sizeof(ngx_darwin_net_inet_tcp_sendspace), 0 }, - - { "kern.ipc.somaxconn", - &ngx_darwin_kern_ipc_somaxconn, - sizeof(ngx_darwin_kern_ipc_somaxconn), 0 }, - - { "hw.cachelinesize", - &ngx_darwin_hw_cachelinesize, - sizeof(ngx_darwin_hw_cachelinesize), 0 }, - - { NULL, NULL, 0, 0 } -}; - - -void -ngx_debug_init(void) -{ -#if (NGX_DEBUG_MALLOC) - - /* - * MacOSX 10.6, 10.7: MallocScribble fills freed memory with 0x55 - * and fills allocated memory with 0xAA. - * MacOSX 10.4, 10.5: MallocScribble fills freed memory with 0x55, - * MallocPreScribble fills allocated memory with 0xAA. - * MacOSX 10.3: MallocScribble fills freed memory with 0x55, - * and no way to fill allocated memory. - */ - - setenv("MallocScribble", "1", 0); - - ngx_debug_malloc = 1; - -#else - - if (getenv("MallocScribble")) { - ngx_debug_malloc = 1; - } - -#endif -} - - -ngx_int_t -ngx_os_specific_init(ngx_log_t *log) -{ - size_t size; - ngx_err_t err; - ngx_uint_t i; - - size = sizeof(ngx_darwin_kern_ostype); - if (sysctlbyname("kern.ostype", ngx_darwin_kern_ostype, &size, NULL, 0) - == -1) - { - err = ngx_errno; - - if (err != NGX_ENOENT) { - - ngx_log_error(NGX_LOG_ALERT, log, err, - "sysctlbyname(kern.ostype) failed"); - - if (err != NGX_ENOMEM) { - return NGX_ERROR; - } - - ngx_darwin_kern_ostype[size - 1] = '\0'; - } - } - - size = sizeof(ngx_darwin_kern_osrelease); - if (sysctlbyname("kern.osrelease", ngx_darwin_kern_osrelease, &size, - NULL, 0) - == -1) - { - err = ngx_errno; - - if (err != NGX_ENOENT) { - - ngx_log_error(NGX_LOG_ALERT, log, err, - "sysctlbyname(kern.osrelease) failed"); - - if (err != NGX_ENOMEM) { - return NGX_ERROR; - } - - ngx_darwin_kern_osrelease[size - 1] = '\0'; - } - } - - for (i = 0; sysctls[i].name; i++) { - size = sysctls[i].size; - - if (sysctlbyname(sysctls[i].name, sysctls[i].value, &size, NULL, 0) - == 0) - { - sysctls[i].exists = 1; - continue; - } - - err = ngx_errno; - - if (err == NGX_ENOENT) { - continue; - } - - ngx_log_error(NGX_LOG_ALERT, log, err, - "sysctlbyname(%s) failed", sysctls[i].name); - return NGX_ERROR; - } - - ngx_cacheline_size = ngx_darwin_hw_cachelinesize; - ngx_ncpu = ngx_darwin_hw_ncpu; - - if (ngx_darwin_kern_ipc_somaxconn > 32767) { - ngx_log_error(NGX_LOG_ALERT, log, 0, - "sysctl kern.ipc.somaxconn must be less than 32768"); - return NGX_ERROR; - } - - ngx_tcp_nodelay_and_tcp_nopush = 1; - - ngx_os_io = ngx_darwin_io; - - return NGX_OK; -} - - -void -ngx_os_specific_status(ngx_log_t *log) -{ - u_long value; - ngx_uint_t i; - - if (ngx_darwin_kern_ostype[0]) { - ngx_log_error(NGX_LOG_NOTICE, log, 0, "OS: %s %s", - ngx_darwin_kern_ostype, ngx_darwin_kern_osrelease); - } - - for (i = 0; sysctls[i].name; i++) { - if (sysctls[i].exists) { - if (sysctls[i].size == sizeof(long)) { - value = *(long *) sysctls[i].value; - - } else { - value = *(int *) sysctls[i].value; - } - - ngx_log_error(NGX_LOG_NOTICE, log, 0, "%s: %l", - sysctls[i].name, value); - } - } -} diff --git a/src/deps/src/nginx-1.30.3/src/os/unix/ngx_darwin_sendfile_chain.c b/src/deps/src/nginx-1.30.3/src/os/unix/ngx_darwin_sendfile_chain.c deleted file mode 100644 index 2a76c154dd..0000000000 --- a/src/deps/src/nginx-1.30.3/src/os/unix/ngx_darwin_sendfile_chain.c +++ /dev/null @@ -1,206 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#include -#include -#include - - -/* - * It seems that Darwin 9.4 (Mac OS X 1.5) sendfile() has the same - * old bug as early FreeBSD sendfile() syscall: - * http://bugs.freebsd.org/33771 - * - * Besides sendfile() has another bug: if one calls sendfile() - * with both a header and a trailer, then sendfile() ignores a file part - * at all and sends only the header and the trailer together. - * For this reason we send a trailer only if there is no a header. - * - * Although sendfile() allows to pass a header or a trailer, - * it may send the header or the trailer and a part of the file - * in different packets. And FreeBSD workaround (TCP_NOPUSH option) - * does not help. - */ - - -ngx_chain_t * -ngx_darwin_sendfile_chain(ngx_connection_t *c, ngx_chain_t *in, off_t limit) -{ - int rc; - off_t send, prev_send, sent; - off_t file_size; - ssize_t n; - ngx_uint_t eintr; - ngx_err_t err; - ngx_buf_t *file; - ngx_event_t *wev; - ngx_chain_t *cl; - ngx_iovec_t header, trailer; - struct sf_hdtr hdtr; - struct iovec headers[NGX_IOVS_PREALLOCATE]; - struct iovec trailers[NGX_IOVS_PREALLOCATE]; - - wev = c->write; - - if (!wev->ready) { - return in; - } - -#if (NGX_HAVE_KQUEUE) - - if ((ngx_event_flags & NGX_USE_KQUEUE_EVENT) && wev->pending_eof) { - (void) ngx_connection_error(c, wev->kq_errno, - "kevent() reported about an closed connection"); - wev->error = 1; - return NGX_CHAIN_ERROR; - } - -#endif - - /* the maximum limit size is the maximum size_t value - the page size */ - - if (limit == 0 || limit > (off_t) (NGX_MAX_SIZE_T_VALUE - ngx_pagesize)) { - limit = NGX_MAX_SIZE_T_VALUE - ngx_pagesize; - } - - send = 0; - - header.iovs = headers; - header.nalloc = NGX_IOVS_PREALLOCATE; - - trailer.iovs = trailers; - trailer.nalloc = NGX_IOVS_PREALLOCATE; - - for ( ;; ) { - eintr = 0; - prev_send = send; - - /* create the header iovec and coalesce the neighbouring bufs */ - - cl = ngx_output_chain_to_iovec(&header, in, limit - send, c->log); - - if (cl == NGX_CHAIN_ERROR) { - return NGX_CHAIN_ERROR; - } - - send += header.size; - - if (cl && cl->buf->in_file && send < limit) { - file = cl->buf; - - /* coalesce the neighbouring file bufs */ - - file_size = ngx_chain_coalesce_file(&cl, limit - send); - - send += file_size; - - if (header.count == 0 && send < limit) { - - /* - * create the trailer iovec and coalesce the neighbouring bufs - */ - - cl = ngx_output_chain_to_iovec(&trailer, cl, limit - send, - c->log); - if (cl == NGX_CHAIN_ERROR) { - return NGX_CHAIN_ERROR; - } - - send += trailer.size; - - } else { - trailer.count = 0; - } - - /* - * sendfile() returns EINVAL if sf_hdtr's count is 0, - * but corresponding pointer is not NULL - */ - - hdtr.headers = header.count ? header.iovs : NULL; - hdtr.hdr_cnt = header.count; - hdtr.trailers = trailer.count ? trailer.iovs : NULL; - hdtr.trl_cnt = trailer.count; - - sent = header.size + file_size; - - ngx_log_debug3(NGX_LOG_DEBUG_EVENT, c->log, 0, - "sendfile: @%O %O h:%uz", - file->file_pos, sent, header.size); - - rc = sendfile(file->file->fd, c->fd, file->file_pos, - &sent, &hdtr, 0); - - if (rc == -1) { - err = ngx_errno; - - switch (err) { - case NGX_EAGAIN: - break; - - case NGX_EINTR: - eintr = 1; - break; - - default: - wev->error = 1; - (void) ngx_connection_error(c, err, "sendfile() failed"); - return NGX_CHAIN_ERROR; - } - - ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, err, - "sendfile() sent only %O bytes", sent); - } - - if (rc == 0 && sent == 0) { - - /* - * if rc and sent equal to zero, then someone - * has truncated the file, so the offset became beyond - * the end of the file - */ - - ngx_log_error(NGX_LOG_ALERT, c->log, 0, - "sendfile() reported that \"%s\" was truncated", - file->file->name.data); - - return NGX_CHAIN_ERROR; - } - - ngx_log_debug4(NGX_LOG_DEBUG_EVENT, c->log, 0, - "sendfile: %d, @%O %O:%O", - rc, file->file_pos, sent, file_size + header.size); - - } else { - n = ngx_writev(c, &header); - - if (n == NGX_ERROR) { - return NGX_CHAIN_ERROR; - } - - sent = (n == NGX_AGAIN) ? 0 : n; - } - - c->sent += sent; - - in = ngx_chain_update_sent(in, sent); - - if (eintr) { - send = prev_send + sent; - continue; - } - - if (send - prev_send != sent) { - wev->ready = 0; - return in; - } - - if (send >= limit || in == NULL) { - return in; - } - } -} diff --git a/src/deps/src/nginx-1.30.3/src/os/unix/ngx_dlopen.c b/src/deps/src/nginx-1.30.3/src/os/unix/ngx_dlopen.c deleted file mode 100644 index a0efc69257..0000000000 --- a/src/deps/src/nginx-1.30.3/src/os/unix/ngx_dlopen.c +++ /dev/null @@ -1,28 +0,0 @@ - -/* - * Copyright (C) Maxim Dounin - * Copyright (C) Nginx, Inc. - */ - - -#include -#include - - -#if (NGX_HAVE_DLOPEN) - -char * -ngx_dlerror(void) -{ - char *err; - - err = (char *) dlerror(); - - if (err == NULL) { - return ""; - } - - return err; -} - -#endif diff --git a/src/deps/src/nginx-1.30.3/src/os/unix/ngx_dlopen.h b/src/deps/src/nginx-1.30.3/src/os/unix/ngx_dlopen.h deleted file mode 100644 index 7a3159f430..0000000000 --- a/src/deps/src/nginx-1.30.3/src/os/unix/ngx_dlopen.h +++ /dev/null @@ -1,31 +0,0 @@ - -/* - * Copyright (C) Maxim Dounin - * Copyright (C) Nginx, Inc. - */ - - -#ifndef _NGX_DLOPEN_H_INCLUDED_ -#define _NGX_DLOPEN_H_INCLUDED_ - - -#include -#include - - -#define ngx_dlopen(path) dlopen((char *) path, RTLD_NOW | RTLD_GLOBAL) -#define ngx_dlopen_n "dlopen()" - -#define ngx_dlsym(handle, symbol) dlsym(handle, symbol) -#define ngx_dlsym_n "dlsym()" - -#define ngx_dlclose(handle) dlclose(handle) -#define ngx_dlclose_n "dlclose()" - - -#if (NGX_HAVE_DLOPEN) -char *ngx_dlerror(void); -#endif - - -#endif /* _NGX_DLOPEN_H_INCLUDED_ */ diff --git a/src/deps/src/nginx-1.30.3/src/os/unix/ngx_errno.c b/src/deps/src/nginx-1.30.3/src/os/unix/ngx_errno.c deleted file mode 100644 index ca23b2d3f2..0000000000 --- a/src/deps/src/nginx-1.30.3/src/os/unix/ngx_errno.c +++ /dev/null @@ -1,210 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#include -#include - - -static ngx_str_t ngx_unknown_error = ngx_string("Unknown error"); - - -#if (NGX_HAVE_STRERRORDESC_NP) - -/* - * The strerrordesc_np() function, introduced in glibc 2.32, is - * async-signal-safe. This makes it possible to use it directly, - * without copying error messages. - */ - - -u_char * -ngx_strerror(ngx_err_t err, u_char *errstr, size_t size) -{ - size_t len; - const char *msg; - - msg = strerrordesc_np(err); - - if (msg == NULL) { - msg = (char *) ngx_unknown_error.data; - len = ngx_unknown_error.len; - - } else { - len = ngx_strlen(msg); - } - - size = ngx_min(size, len); - - return ngx_cpymem(errstr, msg, size); -} - - -ngx_int_t -ngx_strerror_init(void) -{ - return NGX_OK; -} - - -#else - -/* - * The strerror() messages are copied because: - * - * 1) strerror() and strerror_r() functions are not Async-Signal-Safe, - * therefore, they cannot be used in signal handlers; - * - * 2) a direct sys_errlist[] array may be used instead of these functions, - * but Linux linker warns about its usage: - * - * warning: `sys_errlist' is deprecated; use `strerror' or `strerror_r' instead - * warning: `sys_nerr' is deprecated; use `strerror' or `strerror_r' instead - * - * causing false bug reports. - */ - - -static ngx_str_t *ngx_sys_errlist; -static ngx_err_t ngx_first_error; -static ngx_err_t ngx_last_error; - - -u_char * -ngx_strerror(ngx_err_t err, u_char *errstr, size_t size) -{ - ngx_str_t *msg; - - if (err >= ngx_first_error && err < ngx_last_error) { - msg = &ngx_sys_errlist[err - ngx_first_error]; - - } else { - msg = &ngx_unknown_error; - } - - size = ngx_min(size, msg->len); - - return ngx_cpymem(errstr, msg->data, size); -} - - -ngx_int_t -ngx_strerror_init(void) -{ - char *msg; - u_char *p; - size_t len; - ngx_err_t err; - -#if (NGX_SYS_NERR) - ngx_first_error = 0; - ngx_last_error = NGX_SYS_NERR; - -#elif (EPERM > 1000 && EPERM < 0x7fffffff - 1000) - - /* - * If number of errors is not known, and EPERM error code has large - * but reasonable value, guess possible error codes based on the error - * messages returned by strerror(), starting from EPERM. Notably, - * this covers GNU/Hurd, where errors start at 0x40000001. - */ - - for (err = EPERM; err > EPERM - 1000; err--) { - ngx_set_errno(0); - msg = strerror(err); - - if (errno == EINVAL - || msg == NULL - || strncmp(msg, "Unknown error", 13) == 0) - { - continue; - } - - ngx_first_error = err; - } - - for (err = EPERM; err < EPERM + 1000; err++) { - ngx_set_errno(0); - msg = strerror(err); - - if (errno == EINVAL - || msg == NULL - || strncmp(msg, "Unknown error", 13) == 0) - { - continue; - } - - ngx_last_error = err + 1; - } - -#else - - /* - * If number of errors is not known, guess it based on the error - * messages returned by strerror(). - */ - - ngx_first_error = 0; - - for (err = 0; err < 1000; err++) { - ngx_set_errno(0); - msg = strerror(err); - - if (errno == EINVAL - || msg == NULL - || strncmp(msg, "Unknown error", 13) == 0) - { - continue; - } - - ngx_last_error = err + 1; - } - -#endif - - /* - * ngx_strerror() is not ready to work at this stage, therefore, - * malloc() is used and possible errors are logged using strerror(). - */ - - len = (ngx_last_error - ngx_first_error) * sizeof(ngx_str_t); - - ngx_sys_errlist = malloc(len); - if (ngx_sys_errlist == NULL) { - goto failed; - } - - for (err = ngx_first_error; err < ngx_last_error; err++) { - msg = strerror(err); - - if (msg == NULL) { - ngx_sys_errlist[err - ngx_first_error] = ngx_unknown_error; - continue; - } - - len = ngx_strlen(msg); - - p = malloc(len); - if (p == NULL) { - goto failed; - } - - ngx_memcpy(p, msg, len); - ngx_sys_errlist[err - ngx_first_error].len = len; - ngx_sys_errlist[err - ngx_first_error].data = p; - } - - return NGX_OK; - -failed: - - err = errno; - ngx_log_stderr(0, "malloc(%uz) failed (%d: %s)", len, err, strerror(err)); - - return NGX_ERROR; -} - -#endif diff --git a/src/deps/src/nginx-1.30.3/src/os/unix/ngx_errno.h b/src/deps/src/nginx-1.30.3/src/os/unix/ngx_errno.h deleted file mode 100644 index 07fa8ced11..0000000000 --- a/src/deps/src/nginx-1.30.3/src/os/unix/ngx_errno.h +++ /dev/null @@ -1,80 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#ifndef _NGX_ERRNO_H_INCLUDED_ -#define _NGX_ERRNO_H_INCLUDED_ - - -#include -#include - - -typedef int ngx_err_t; - -#define NGX_EPERM EPERM -#define NGX_ENOENT ENOENT -#define NGX_ENOPATH ENOENT -#define NGX_ESRCH ESRCH -#define NGX_EINTR EINTR -#define NGX_ECHILD ECHILD -#define NGX_ENOMEM ENOMEM -#define NGX_EACCES EACCES -#define NGX_EBUSY EBUSY -#define NGX_EEXIST EEXIST -#define NGX_EEXIST_FILE EEXIST -#define NGX_EXDEV EXDEV -#define NGX_ENOTDIR ENOTDIR -#define NGX_EISDIR EISDIR -#define NGX_EINVAL EINVAL -#define NGX_ENFILE ENFILE -#define NGX_EMFILE EMFILE -#define NGX_ENOSPC ENOSPC -#define NGX_EPIPE EPIPE -#define NGX_EINPROGRESS EINPROGRESS -#define NGX_ENOPROTOOPT ENOPROTOOPT -#define NGX_EOPNOTSUPP EOPNOTSUPP -#define NGX_EADDRINUSE EADDRINUSE -#define NGX_ECONNABORTED ECONNABORTED -#define NGX_ECONNRESET ECONNRESET -#define NGX_ENOTCONN ENOTCONN -#define NGX_ETIMEDOUT ETIMEDOUT -#define NGX_ECONNREFUSED ECONNREFUSED -#define NGX_ENAMETOOLONG ENAMETOOLONG -#define NGX_ENETDOWN ENETDOWN -#define NGX_ENETUNREACH ENETUNREACH -#define NGX_EHOSTDOWN EHOSTDOWN -#define NGX_EHOSTUNREACH EHOSTUNREACH -#define NGX_ENOSYS ENOSYS -#define NGX_ECANCELED ECANCELED -#define NGX_EILSEQ EILSEQ -#define NGX_ENOMOREFILES 0 -#define NGX_ELOOP ELOOP -#define NGX_EBADF EBADF -#define NGX_EMSGSIZE EMSGSIZE - -#if (NGX_HAVE_OPENAT) -#define NGX_EMLINK EMLINK -#endif - -#if (__hpux__) -#define NGX_EAGAIN EWOULDBLOCK -#else -#define NGX_EAGAIN EAGAIN -#endif - - -#define ngx_errno errno -#define ngx_socket_errno errno -#define ngx_set_errno(err) errno = err -#define ngx_set_socket_errno(err) errno = err - - -u_char *ngx_strerror(ngx_err_t err, u_char *errstr, size_t size); -ngx_int_t ngx_strerror_init(void); - - -#endif /* _NGX_ERRNO_H_INCLUDED_ */ diff --git a/src/deps/src/nginx-1.30.3/src/os/unix/ngx_file_aio_read.c b/src/deps/src/nginx-1.30.3/src/os/unix/ngx_file_aio_read.c deleted file mode 100644 index bb60ee8247..0000000000 --- a/src/deps/src/nginx-1.30.3/src/os/unix/ngx_file_aio_read.c +++ /dev/null @@ -1,216 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#include -#include -#include - - -/* - * FreeBSD file AIO features and quirks: - * - * if an asked data are already in VM cache, then aio_error() returns 0, - * and the data are already copied in buffer; - * - * aio_read() preread in VM cache as minimum 16K (probably BKVASIZE); - * the first AIO preload may be up to 128K; - * - * aio_read/aio_error() may return EINPROGRESS for just written data; - * - * kqueue EVFILT_AIO filter is level triggered only: an event repeats - * until aio_return() will be called; - * - * aio_cancel() cannot cancel file AIO: it returns AIO_NOTCANCELED always. - */ - - -extern int ngx_kqueue; - - -static ssize_t ngx_file_aio_result(ngx_file_t *file, ngx_event_aio_t *aio, - ngx_event_t *ev); -static void ngx_file_aio_event_handler(ngx_event_t *ev); - - -ngx_int_t -ngx_file_aio_init(ngx_file_t *file, ngx_pool_t *pool) -{ - ngx_event_aio_t *aio; - - aio = ngx_pcalloc(pool, sizeof(ngx_event_aio_t)); - if (aio == NULL) { - return NGX_ERROR; - } - - aio->file = file; - aio->fd = file->fd; - aio->event.data = aio; - aio->event.ready = 1; - aio->event.log = file->log; - - file->aio = aio; - - return NGX_OK; -} - - -ssize_t -ngx_file_aio_read(ngx_file_t *file, u_char *buf, size_t size, off_t offset, - ngx_pool_t *pool) -{ - int n; - ngx_event_t *ev; - ngx_event_aio_t *aio; - - if (!ngx_file_aio) { - return ngx_read_file(file, buf, size, offset); - } - - if (file->aio == NULL && ngx_file_aio_init(file, pool) != NGX_OK) { - return NGX_ERROR; - } - - aio = file->aio; - ev = &aio->event; - - if (!ev->ready) { - ngx_log_error(NGX_LOG_ALERT, file->log, 0, - "second aio post for \"%V\"", &file->name); - return NGX_AGAIN; - } - - ngx_log_debug4(NGX_LOG_DEBUG_CORE, file->log, 0, - "aio complete:%d @%O:%uz %V", - ev->complete, offset, size, &file->name); - - if (ev->complete) { - ev->complete = 0; - ngx_set_errno(aio->err); - - if (aio->err == 0) { - return aio->nbytes; - } - - ngx_log_error(NGX_LOG_CRIT, file->log, ngx_errno, - "aio read \"%s\" failed", file->name.data); - - return NGX_ERROR; - } - - ngx_memzero(&aio->aiocb, sizeof(struct aiocb)); - - aio->aiocb.aio_fildes = file->fd; - aio->aiocb.aio_offset = offset; - aio->aiocb.aio_buf = buf; - aio->aiocb.aio_nbytes = size; -#if (NGX_HAVE_KQUEUE) - aio->aiocb.aio_sigevent.sigev_notify_kqueue = ngx_kqueue; - aio->aiocb.aio_sigevent.sigev_notify = SIGEV_KEVENT; - aio->aiocb.aio_sigevent.sigev_value.sival_ptr = ev; -#endif - ev->handler = ngx_file_aio_event_handler; - - n = aio_read(&aio->aiocb); - - if (n == -1) { - n = ngx_errno; - - if (n == NGX_EAGAIN) { - return ngx_read_file(file, buf, size, offset); - } - - ngx_log_error(NGX_LOG_CRIT, file->log, n, - "aio_read(\"%V\") failed", &file->name); - - if (n == NGX_ENOSYS) { - ngx_file_aio = 0; - return ngx_read_file(file, buf, size, offset); - } - - return NGX_ERROR; - } - - ngx_log_debug2(NGX_LOG_DEBUG_CORE, file->log, 0, - "aio_read: fd:%d %d", file->fd, n); - - ev->active = 1; - ev->ready = 0; - ev->complete = 0; - - return ngx_file_aio_result(aio->file, aio, ev); -} - - -static ssize_t -ngx_file_aio_result(ngx_file_t *file, ngx_event_aio_t *aio, ngx_event_t *ev) -{ - int n; - ngx_err_t err; - - n = aio_error(&aio->aiocb); - - ngx_log_debug2(NGX_LOG_DEBUG_CORE, file->log, 0, - "aio_error: fd:%d %d", file->fd, n); - - if (n == -1) { - err = ngx_errno; - aio->err = err; - - ngx_log_error(NGX_LOG_ALERT, file->log, err, - "aio_error(\"%V\") failed", &file->name); - return NGX_ERROR; - } - - if (n == NGX_EINPROGRESS) { - if (ev->ready) { - ev->ready = 0; - ngx_log_error(NGX_LOG_ALERT, file->log, n, - "aio_read(\"%V\") still in progress", - &file->name); - } - - return NGX_AGAIN; - } - - n = aio_return(&aio->aiocb); - - if (n == -1) { - err = ngx_errno; - aio->err = err; - ev->ready = 1; - - ngx_log_error(NGX_LOG_CRIT, file->log, err, - "aio_return(\"%V\") failed", &file->name); - return NGX_ERROR; - } - - aio->err = 0; - aio->nbytes = n; - ev->ready = 1; - ev->active = 0; - - ngx_log_debug2(NGX_LOG_DEBUG_CORE, file->log, 0, - "aio_return: fd:%d %d", file->fd, n); - - return n; -} - - -static void -ngx_file_aio_event_handler(ngx_event_t *ev) -{ - ngx_event_aio_t *aio; - - aio = ev->data; - - ngx_log_debug2(NGX_LOG_DEBUG_CORE, ev->log, 0, - "aio event handler fd:%d %V", aio->fd, &aio->file->name); - - if (ngx_file_aio_result(aio->file, aio, ev) != NGX_AGAIN) { - aio->handler(ev); - } -} diff --git a/src/deps/src/nginx-1.30.3/src/os/unix/ngx_files.c b/src/deps/src/nginx-1.30.3/src/os/unix/ngx_files.c deleted file mode 100644 index 2fec1ece10..0000000000 --- a/src/deps/src/nginx-1.30.3/src/os/unix/ngx_files.c +++ /dev/null @@ -1,956 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#include -#include - - -#if (NGX_THREADS) -#include -static void ngx_thread_read_handler(void *data, ngx_log_t *log); -static void ngx_thread_write_chain_to_file_handler(void *data, ngx_log_t *log); -#endif - -static ngx_chain_t *ngx_chain_to_iovec(ngx_iovec_t *vec, ngx_chain_t *cl); -static ssize_t ngx_writev_file(ngx_file_t *file, ngx_iovec_t *vec, - off_t offset); - - -#if (NGX_HAVE_FILE_AIO) - -ngx_uint_t ngx_file_aio = 1; - -#endif - - -ssize_t -ngx_read_file(ngx_file_t *file, u_char *buf, size_t size, off_t offset) -{ - ssize_t n; - - ngx_log_debug4(NGX_LOG_DEBUG_CORE, file->log, 0, - "read: %d, %p, %uz, %O", file->fd, buf, size, offset); - -#if (NGX_HAVE_PREAD) - - n = pread(file->fd, buf, size, offset); - - if (n == -1) { - ngx_log_error(NGX_LOG_CRIT, file->log, ngx_errno, - "pread() \"%s\" failed", file->name.data); - return NGX_ERROR; - } - -#else - - if (file->sys_offset != offset) { - if (lseek(file->fd, offset, SEEK_SET) == -1) { - ngx_log_error(NGX_LOG_CRIT, file->log, ngx_errno, - "lseek() \"%s\" failed", file->name.data); - return NGX_ERROR; - } - - file->sys_offset = offset; - } - - n = read(file->fd, buf, size); - - if (n == -1) { - ngx_log_error(NGX_LOG_CRIT, file->log, ngx_errno, - "read() \"%s\" failed", file->name.data); - return NGX_ERROR; - } - - file->sys_offset += n; - -#endif - - file->offset += n; - - return n; -} - - -#if (NGX_THREADS) - -typedef struct { - ngx_fd_t fd; - ngx_uint_t write; /* unsigned write:1; */ - - u_char *buf; - size_t size; - ngx_chain_t *chain; - off_t offset; - - size_t nbytes; - ngx_err_t err; -} ngx_thread_file_ctx_t; - - -ssize_t -ngx_thread_read(ngx_file_t *file, u_char *buf, size_t size, off_t offset, - ngx_pool_t *pool) -{ - ngx_thread_task_t *task; - ngx_thread_file_ctx_t *ctx; - - ngx_log_debug4(NGX_LOG_DEBUG_CORE, file->log, 0, - "thread read: %d, %p, %uz, %O", - file->fd, buf, size, offset); - - task = file->thread_task; - - if (task == NULL) { - task = ngx_thread_task_alloc(pool, sizeof(ngx_thread_file_ctx_t)); - if (task == NULL) { - return NGX_ERROR; - } - - task->event.log = file->log; - - file->thread_task = task; - } - - ctx = task->ctx; - - if (task->event.complete) { - task->event.complete = 0; - - if (ctx->write) { - ngx_log_error(NGX_LOG_ALERT, file->log, 0, - "invalid thread call, read instead of write"); - return NGX_ERROR; - } - - if (ctx->err) { - ngx_log_error(NGX_LOG_CRIT, file->log, ctx->err, - "pread() \"%s\" failed", file->name.data); - return NGX_ERROR; - } - - return ctx->nbytes; - } - - task->handler = ngx_thread_read_handler; - - ctx->write = 0; - - ctx->fd = file->fd; - ctx->buf = buf; - ctx->size = size; - ctx->offset = offset; - - if (file->thread_handler(task, file) != NGX_OK) { - return NGX_ERROR; - } - - return NGX_AGAIN; -} - - -#if (NGX_HAVE_PREAD) - -static void -ngx_thread_read_handler(void *data, ngx_log_t *log) -{ - ngx_thread_file_ctx_t *ctx = data; - - ssize_t n; - - ngx_log_debug0(NGX_LOG_DEBUG_CORE, log, 0, "thread read handler"); - - n = pread(ctx->fd, ctx->buf, ctx->size, ctx->offset); - - if (n == -1) { - ctx->err = ngx_errno; - - } else { - ctx->nbytes = n; - ctx->err = 0; - } - -#if 0 - ngx_time_update(); -#endif - - ngx_log_debug4(NGX_LOG_DEBUG_CORE, log, 0, - "pread: %z (err: %d) of %uz @%O", - n, ctx->err, ctx->size, ctx->offset); -} - -#else - -#error pread() is required! - -#endif - -#endif /* NGX_THREADS */ - - -ssize_t -ngx_write_file(ngx_file_t *file, u_char *buf, size_t size, off_t offset) -{ - ssize_t n, written; - ngx_err_t err; - - ngx_log_debug4(NGX_LOG_DEBUG_CORE, file->log, 0, - "write: %d, %p, %uz, %O", file->fd, buf, size, offset); - - written = 0; - -#if (NGX_HAVE_PWRITE) - - for ( ;; ) { - n = pwrite(file->fd, buf + written, size, offset); - - if (n == -1) { - err = ngx_errno; - - if (err == NGX_EINTR) { - ngx_log_debug0(NGX_LOG_DEBUG_CORE, file->log, err, - "pwrite() was interrupted"); - continue; - } - - ngx_log_error(NGX_LOG_CRIT, file->log, err, - "pwrite() \"%s\" failed", file->name.data); - return NGX_ERROR; - } - - file->offset += n; - written += n; - - if ((size_t) n == size) { - return written; - } - - offset += n; - size -= n; - } - -#else - - if (file->sys_offset != offset) { - if (lseek(file->fd, offset, SEEK_SET) == -1) { - ngx_log_error(NGX_LOG_CRIT, file->log, ngx_errno, - "lseek() \"%s\" failed", file->name.data); - return NGX_ERROR; - } - - file->sys_offset = offset; - } - - for ( ;; ) { - n = write(file->fd, buf + written, size); - - if (n == -1) { - err = ngx_errno; - - if (err == NGX_EINTR) { - ngx_log_debug0(NGX_LOG_DEBUG_CORE, file->log, err, - "write() was interrupted"); - continue; - } - - ngx_log_error(NGX_LOG_CRIT, file->log, err, - "write() \"%s\" failed", file->name.data); - return NGX_ERROR; - } - - file->sys_offset += n; - file->offset += n; - written += n; - - if ((size_t) n == size) { - return written; - } - - size -= n; - } -#endif -} - - -ngx_fd_t -ngx_open_tempfile(u_char *name, ngx_uint_t persistent, ngx_uint_t access) -{ - ngx_fd_t fd; - - fd = open((const char *) name, O_CREAT|O_EXCL|O_RDWR, - access ? access : 0600); - - if (fd != -1 && !persistent) { - (void) unlink((const char *) name); - } - - return fd; -} - - -ssize_t -ngx_write_chain_to_file(ngx_file_t *file, ngx_chain_t *cl, off_t offset, - ngx_pool_t *pool) -{ - ssize_t total, n; - ngx_iovec_t vec; - struct iovec iovs[NGX_IOVS_PREALLOCATE]; - - /* use pwrite() if there is the only buf in a chain */ - - if (cl->next == NULL) { - return ngx_write_file(file, cl->buf->pos, - (size_t) (cl->buf->last - cl->buf->pos), - offset); - } - - total = 0; - - vec.iovs = iovs; - vec.nalloc = NGX_IOVS_PREALLOCATE; - - do { - /* create the iovec and coalesce the neighbouring bufs */ - cl = ngx_chain_to_iovec(&vec, cl); - - /* use pwrite() if there is the only iovec buffer */ - - if (vec.count == 1) { - n = ngx_write_file(file, (u_char *) iovs[0].iov_base, - iovs[0].iov_len, offset); - - if (n == NGX_ERROR) { - return n; - } - - return total + n; - } - - n = ngx_writev_file(file, &vec, offset); - - if (n == NGX_ERROR) { - return n; - } - - offset += n; - total += n; - - } while (cl); - - return total; -} - - -static ngx_chain_t * -ngx_chain_to_iovec(ngx_iovec_t *vec, ngx_chain_t *cl) -{ - size_t total, size; - u_char *prev; - ngx_uint_t n; - struct iovec *iov; - - iov = NULL; - prev = NULL; - total = 0; - n = 0; - - for ( /* void */ ; cl; cl = cl->next) { - - if (ngx_buf_special(cl->buf)) { - continue; - } - - size = cl->buf->last - cl->buf->pos; - - if (prev == cl->buf->pos) { - iov->iov_len += size; - - } else { - if (n == vec->nalloc) { - break; - } - - iov = &vec->iovs[n++]; - - iov->iov_base = (void *) cl->buf->pos; - iov->iov_len = size; - } - - prev = cl->buf->pos + size; - total += size; - } - - vec->count = n; - vec->size = total; - - return cl; -} - - -static ssize_t -ngx_writev_file(ngx_file_t *file, ngx_iovec_t *vec, off_t offset) -{ - ssize_t n; - ngx_err_t err; - - ngx_log_debug3(NGX_LOG_DEBUG_CORE, file->log, 0, - "writev: %d, %uz, %O", file->fd, vec->size, offset); - -#if (NGX_HAVE_PWRITEV) - -eintr: - - n = pwritev(file->fd, vec->iovs, vec->count, offset); - - if (n == -1) { - err = ngx_errno; - - if (err == NGX_EINTR) { - ngx_log_debug0(NGX_LOG_DEBUG_CORE, file->log, err, - "pwritev() was interrupted"); - goto eintr; - } - - ngx_log_error(NGX_LOG_CRIT, file->log, err, - "pwritev() \"%s\" failed", file->name.data); - return NGX_ERROR; - } - - if ((size_t) n != vec->size) { - ngx_log_error(NGX_LOG_CRIT, file->log, 0, - "pwritev() \"%s\" has written only %z of %uz", - file->name.data, n, vec->size); - return NGX_ERROR; - } - -#else - - if (file->sys_offset != offset) { - if (lseek(file->fd, offset, SEEK_SET) == -1) { - ngx_log_error(NGX_LOG_CRIT, file->log, ngx_errno, - "lseek() \"%s\" failed", file->name.data); - return NGX_ERROR; - } - - file->sys_offset = offset; - } - -eintr: - - n = writev(file->fd, vec->iovs, vec->count); - - if (n == -1) { - err = ngx_errno; - - if (err == NGX_EINTR) { - ngx_log_debug0(NGX_LOG_DEBUG_CORE, file->log, err, - "writev() was interrupted"); - goto eintr; - } - - ngx_log_error(NGX_LOG_CRIT, file->log, err, - "writev() \"%s\" failed", file->name.data); - return NGX_ERROR; - } - - if ((size_t) n != vec->size) { - ngx_log_error(NGX_LOG_CRIT, file->log, 0, - "writev() \"%s\" has written only %z of %uz", - file->name.data, n, vec->size); - return NGX_ERROR; - } - - file->sys_offset += n; - -#endif - - file->offset += n; - - return n; -} - - -#if (NGX_THREADS) - -ssize_t -ngx_thread_write_chain_to_file(ngx_file_t *file, ngx_chain_t *cl, off_t offset, - ngx_pool_t *pool) -{ - ngx_thread_task_t *task; - ngx_thread_file_ctx_t *ctx; - - ngx_log_debug3(NGX_LOG_DEBUG_CORE, file->log, 0, - "thread write chain: %d, %p, %O", - file->fd, cl, offset); - - task = file->thread_task; - - if (task == NULL) { - task = ngx_thread_task_alloc(pool, - sizeof(ngx_thread_file_ctx_t)); - if (task == NULL) { - return NGX_ERROR; - } - - task->event.log = file->log; - - file->thread_task = task; - } - - ctx = task->ctx; - - if (task->event.complete) { - task->event.complete = 0; - - if (!ctx->write) { - ngx_log_error(NGX_LOG_ALERT, file->log, 0, - "invalid thread call, write instead of read"); - return NGX_ERROR; - } - - if (ctx->err || ctx->nbytes == 0) { - ngx_log_error(NGX_LOG_CRIT, file->log, ctx->err, - "pwritev() \"%s\" failed", file->name.data); - return NGX_ERROR; - } - - file->offset += ctx->nbytes; - return ctx->nbytes; - } - - task->handler = ngx_thread_write_chain_to_file_handler; - - ctx->write = 1; - - ctx->fd = file->fd; - ctx->chain = cl; - ctx->offset = offset; - - if (file->thread_handler(task, file) != NGX_OK) { - return NGX_ERROR; - } - - return NGX_AGAIN; -} - - -static void -ngx_thread_write_chain_to_file_handler(void *data, ngx_log_t *log) -{ - ngx_thread_file_ctx_t *ctx = data; - -#if (NGX_HAVE_PWRITEV) - - off_t offset; - ssize_t n; - ngx_err_t err; - ngx_chain_t *cl; - ngx_iovec_t vec; - struct iovec iovs[NGX_IOVS_PREALLOCATE]; - - vec.iovs = iovs; - vec.nalloc = NGX_IOVS_PREALLOCATE; - - cl = ctx->chain; - offset = ctx->offset; - - ctx->nbytes = 0; - ctx->err = 0; - - do { - /* create the iovec and coalesce the neighbouring bufs */ - cl = ngx_chain_to_iovec(&vec, cl); - -eintr: - - n = pwritev(ctx->fd, iovs, vec.count, offset); - - if (n == -1) { - err = ngx_errno; - - if (err == NGX_EINTR) { - ngx_log_debug0(NGX_LOG_DEBUG_CORE, log, err, - "pwritev() was interrupted"); - goto eintr; - } - - ctx->err = err; - return; - } - - if ((size_t) n != vec.size) { - ctx->nbytes = 0; - return; - } - - ctx->nbytes += n; - offset += n; - } while (cl); - -#else - - ctx->err = NGX_ENOSYS; - return; - -#endif -} - -#endif /* NGX_THREADS */ - - -ngx_int_t -ngx_set_file_time(u_char *name, ngx_fd_t fd, time_t s) -{ - struct timeval tv[2]; - - tv[0].tv_sec = ngx_time(); - tv[0].tv_usec = 0; - tv[1].tv_sec = s; - tv[1].tv_usec = 0; - - if (utimes((char *) name, tv) != -1) { - return NGX_OK; - } - - return NGX_ERROR; -} - - -ngx_int_t -ngx_create_file_mapping(ngx_file_mapping_t *fm) -{ - fm->fd = ngx_open_file(fm->name, NGX_FILE_RDWR, NGX_FILE_TRUNCATE, - NGX_FILE_DEFAULT_ACCESS); - - if (fm->fd == NGX_INVALID_FILE) { - ngx_log_error(NGX_LOG_CRIT, fm->log, ngx_errno, - ngx_open_file_n " \"%s\" failed", fm->name); - return NGX_ERROR; - } - - if (ftruncate(fm->fd, fm->size) == -1) { - ngx_log_error(NGX_LOG_CRIT, fm->log, ngx_errno, - "ftruncate() \"%s\" failed", fm->name); - goto failed; - } - - fm->addr = mmap(NULL, fm->size, PROT_READ|PROT_WRITE, MAP_SHARED, - fm->fd, 0); - if (fm->addr != MAP_FAILED) { - return NGX_OK; - } - - ngx_log_error(NGX_LOG_CRIT, fm->log, ngx_errno, - "mmap(%uz) \"%s\" failed", fm->size, fm->name); - -failed: - - if (ngx_close_file(fm->fd) == NGX_FILE_ERROR) { - ngx_log_error(NGX_LOG_ALERT, fm->log, ngx_errno, - ngx_close_file_n " \"%s\" failed", fm->name); - } - - return NGX_ERROR; -} - - -void -ngx_close_file_mapping(ngx_file_mapping_t *fm) -{ - if (munmap(fm->addr, fm->size) == -1) { - ngx_log_error(NGX_LOG_CRIT, fm->log, ngx_errno, - "munmap(%uz) \"%s\" failed", fm->size, fm->name); - } - - if (ngx_close_file(fm->fd) == NGX_FILE_ERROR) { - ngx_log_error(NGX_LOG_ALERT, fm->log, ngx_errno, - ngx_close_file_n " \"%s\" failed", fm->name); - } -} - - -ngx_int_t -ngx_open_dir(ngx_str_t *name, ngx_dir_t *dir) -{ - dir->dir = opendir((const char *) name->data); - - if (dir->dir == NULL) { - return NGX_ERROR; - } - - dir->valid_info = 0; - - return NGX_OK; -} - - -ngx_int_t -ngx_read_dir(ngx_dir_t *dir) -{ - dir->de = readdir(dir->dir); - - if (dir->de) { -#if (NGX_HAVE_D_TYPE) - dir->type = dir->de->d_type; -#else - dir->type = 0; -#endif - return NGX_OK; - } - - return NGX_ERROR; -} - - -ngx_int_t -ngx_open_glob(ngx_glob_t *gl) -{ - int n; - - n = glob((char *) gl->pattern, 0, NULL, &gl->pglob); - - if (n == 0) { - return NGX_OK; - } - -#ifdef GLOB_NOMATCH - - if (n == GLOB_NOMATCH && gl->test) { - return NGX_OK; - } - -#endif - - return NGX_ERROR; -} - - -ngx_int_t -ngx_read_glob(ngx_glob_t *gl, ngx_str_t *name) -{ - size_t count; - -#ifdef GLOB_NOMATCH - count = (size_t) gl->pglob.gl_pathc; -#else - count = (size_t) gl->pglob.gl_matchc; -#endif - - if (gl->n < count) { - - name->len = (size_t) ngx_strlen(gl->pglob.gl_pathv[gl->n]); - name->data = (u_char *) gl->pglob.gl_pathv[gl->n]; - gl->n++; - - return NGX_OK; - } - - return NGX_DONE; -} - - -void -ngx_close_glob(ngx_glob_t *gl) -{ - globfree(&gl->pglob); -} - - -ngx_err_t -ngx_trylock_fd(ngx_fd_t fd) -{ - struct flock fl; - - ngx_memzero(&fl, sizeof(struct flock)); - fl.l_type = F_WRLCK; - fl.l_whence = SEEK_SET; - - if (fcntl(fd, F_SETLK, &fl) == -1) { - return ngx_errno; - } - - return 0; -} - - -ngx_err_t -ngx_lock_fd(ngx_fd_t fd) -{ - struct flock fl; - - ngx_memzero(&fl, sizeof(struct flock)); - fl.l_type = F_WRLCK; - fl.l_whence = SEEK_SET; - - if (fcntl(fd, F_SETLKW, &fl) == -1) { - return ngx_errno; - } - - return 0; -} - - -ngx_err_t -ngx_unlock_fd(ngx_fd_t fd) -{ - struct flock fl; - - ngx_memzero(&fl, sizeof(struct flock)); - fl.l_type = F_UNLCK; - fl.l_whence = SEEK_SET; - - if (fcntl(fd, F_SETLK, &fl) == -1) { - return ngx_errno; - } - - return 0; -} - - -#if (NGX_HAVE_POSIX_FADVISE) && !(NGX_HAVE_F_READAHEAD) - -ngx_int_t -ngx_read_ahead(ngx_fd_t fd, size_t n) -{ - int err; - - err = posix_fadvise(fd, 0, 0, POSIX_FADV_SEQUENTIAL); - - if (err == 0) { - return 0; - } - - ngx_set_errno(err); - return NGX_FILE_ERROR; -} - -#endif - - -#if (NGX_HAVE_O_DIRECT) - -ngx_int_t -ngx_directio_on(ngx_fd_t fd) -{ - int flags; - - flags = fcntl(fd, F_GETFL); - - if (flags == -1) { - return NGX_FILE_ERROR; - } - - return fcntl(fd, F_SETFL, flags | O_DIRECT); -} - - -ngx_int_t -ngx_directio_off(ngx_fd_t fd) -{ - int flags; - - flags = fcntl(fd, F_GETFL); - - if (flags == -1) { - return NGX_FILE_ERROR; - } - - return fcntl(fd, F_SETFL, flags & ~O_DIRECT); -} - -#endif - - -#if (NGX_HAVE_STATFS) - -size_t -ngx_fs_bsize(u_char *name) -{ - struct statfs fs; - - if (statfs((char *) name, &fs) == -1) { - return 512; - } - - if ((fs.f_bsize % 512) != 0) { - return 512; - } - -#if (NGX_LINUX) - if ((size_t) fs.f_bsize > ngx_pagesize) { - return 512; - } -#endif - - return (size_t) fs.f_bsize; -} - - -off_t -ngx_fs_available(u_char *name) -{ - struct statfs fs; - - if (statfs((char *) name, &fs) == -1) { - return NGX_MAX_OFF_T_VALUE; - } - - return (off_t) fs.f_bavail * fs.f_bsize; -} - -#elif (NGX_HAVE_STATVFS) - -size_t -ngx_fs_bsize(u_char *name) -{ - struct statvfs fs; - - if (statvfs((char *) name, &fs) == -1) { - return 512; - } - - if ((fs.f_frsize % 512) != 0) { - return 512; - } - -#if (NGX_LINUX) - if ((size_t) fs.f_frsize > ngx_pagesize) { - return 512; - } -#endif - - return (size_t) fs.f_frsize; -} - - -off_t -ngx_fs_available(u_char *name) -{ - struct statvfs fs; - - if (statvfs((char *) name, &fs) == -1) { - return NGX_MAX_OFF_T_VALUE; - } - - return (off_t) fs.f_bavail * fs.f_frsize; -} - -#else - -size_t -ngx_fs_bsize(u_char *name) -{ - return 512; -} - - -off_t -ngx_fs_available(u_char *name) -{ - return NGX_MAX_OFF_T_VALUE; -} - -#endif diff --git a/src/deps/src/nginx-1.30.3/src/os/unix/ngx_files.h b/src/deps/src/nginx-1.30.3/src/os/unix/ngx_files.h deleted file mode 100644 index d084713b6e..0000000000 --- a/src/deps/src/nginx-1.30.3/src/os/unix/ngx_files.h +++ /dev/null @@ -1,396 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#ifndef _NGX_FILES_H_INCLUDED_ -#define _NGX_FILES_H_INCLUDED_ - - -#include -#include - - -typedef int ngx_fd_t; -typedef struct stat ngx_file_info_t; -typedef ino_t ngx_file_uniq_t; - - -typedef struct { - u_char *name; - size_t size; - void *addr; - ngx_fd_t fd; - ngx_log_t *log; -} ngx_file_mapping_t; - - -typedef struct { - DIR *dir; - struct dirent *de; - struct stat info; - - unsigned type:8; - unsigned valid_info:1; -} ngx_dir_t; - - -typedef struct { - size_t n; - glob_t pglob; - u_char *pattern; - ngx_log_t *log; - ngx_uint_t test; -} ngx_glob_t; - - -#define NGX_INVALID_FILE -1 -#define NGX_FILE_ERROR -1 - - - -#ifdef __CYGWIN__ - -#ifndef NGX_HAVE_CASELESS_FILESYSTEM -#define NGX_HAVE_CASELESS_FILESYSTEM 1 -#endif - -#define ngx_open_file(name, mode, create, access) \ - open((const char *) name, mode|create|O_BINARY, access) - -#else - -#define ngx_open_file(name, mode, create, access) \ - open((const char *) name, mode|create, access) - -#endif - -#define ngx_open_file_n "open()" - -#define NGX_FILE_RDONLY O_RDONLY -#define NGX_FILE_WRONLY O_WRONLY -#define NGX_FILE_RDWR O_RDWR -#define NGX_FILE_CREATE_OR_OPEN O_CREAT -#define NGX_FILE_OPEN 0 -#define NGX_FILE_TRUNCATE (O_CREAT|O_TRUNC) -#define NGX_FILE_APPEND (O_WRONLY|O_APPEND) -#define NGX_FILE_NONBLOCK O_NONBLOCK - -#if (NGX_HAVE_OPENAT) -#define NGX_FILE_NOFOLLOW O_NOFOLLOW - -#if defined(O_DIRECTORY) -#define NGX_FILE_DIRECTORY O_DIRECTORY -#else -#define NGX_FILE_DIRECTORY 0 -#endif - -#if defined(O_SEARCH) -#define NGX_FILE_SEARCH (O_SEARCH|NGX_FILE_DIRECTORY) - -#elif defined(O_EXEC) -#define NGX_FILE_SEARCH (O_EXEC|NGX_FILE_DIRECTORY) - -#elif (NGX_HAVE_O_PATH) -#define NGX_FILE_SEARCH (O_PATH|O_RDONLY|NGX_FILE_DIRECTORY) - -#else -#define NGX_FILE_SEARCH (O_RDONLY|NGX_FILE_DIRECTORY) -#endif - -#endif /* NGX_HAVE_OPENAT */ - -#define NGX_FILE_DEFAULT_ACCESS 0644 -#define NGX_FILE_OWNER_ACCESS 0600 - - -#define ngx_close_file close -#define ngx_close_file_n "close()" - - -#define ngx_delete_file(name) unlink((const char *) name) -#define ngx_delete_file_n "unlink()" - - -ngx_fd_t ngx_open_tempfile(u_char *name, ngx_uint_t persistent, - ngx_uint_t access); -#define ngx_open_tempfile_n "open()" - - -ssize_t ngx_read_file(ngx_file_t *file, u_char *buf, size_t size, off_t offset); -#if (NGX_HAVE_PREAD) -#define ngx_read_file_n "pread()" -#else -#define ngx_read_file_n "read()" -#endif - -ssize_t ngx_write_file(ngx_file_t *file, u_char *buf, size_t size, - off_t offset); - -ssize_t ngx_write_chain_to_file(ngx_file_t *file, ngx_chain_t *ce, - off_t offset, ngx_pool_t *pool); - - -#define ngx_read_fd read -#define ngx_read_fd_n "read()" - -/* - * we use inlined function instead of simple #define - * because glibc 2.3 sets warn_unused_result attribute for write() - * and in this case gcc 4.3 ignores (void) cast - */ -static ngx_inline ssize_t -ngx_write_fd(ngx_fd_t fd, void *buf, size_t n) -{ - return write(fd, buf, n); -} - -#define ngx_write_fd_n "write()" - - -#define ngx_write_console ngx_write_fd - - -#define ngx_linefeed(p) *p++ = LF; -#define NGX_LINEFEED_SIZE 1 -#define NGX_LINEFEED "\x0a" - - -#define ngx_rename_file(o, n) rename((const char *) o, (const char *) n) -#define ngx_rename_file_n "rename()" - - -#define ngx_change_file_access(n, a) chmod((const char *) n, a) -#define ngx_change_file_access_n "chmod()" - - -ngx_int_t ngx_set_file_time(u_char *name, ngx_fd_t fd, time_t s); -#define ngx_set_file_time_n "utimes()" - - -#define ngx_file_info(file, sb) stat((const char *) file, sb) -#define ngx_file_info_n "stat()" - -#define ngx_fd_info(fd, sb) fstat(fd, sb) -#define ngx_fd_info_n "fstat()" - -#define ngx_link_info(file, sb) lstat((const char *) file, sb) -#define ngx_link_info_n "lstat()" - -#define ngx_is_dir(sb) (S_ISDIR((sb)->st_mode)) -#define ngx_is_file(sb) (S_ISREG((sb)->st_mode)) -#define ngx_is_link(sb) (S_ISLNK((sb)->st_mode)) -#define ngx_is_exec(sb) (((sb)->st_mode & S_IXUSR) == S_IXUSR) -#define ngx_file_access(sb) ((sb)->st_mode & 0777) -#define ngx_file_size(sb) (sb)->st_size -#define ngx_file_fs_size(sb) \ - (((sb)->st_blocks * 512 > (sb)->st_size \ - && (sb)->st_blocks * 512 < (sb)->st_size + 8 * (sb)->st_blksize) \ - ? (sb)->st_blocks * 512 : (sb)->st_size) -#define ngx_file_mtime(sb) (sb)->st_mtime -#define ngx_file_uniq(sb) (sb)->st_ino - - -ngx_int_t ngx_create_file_mapping(ngx_file_mapping_t *fm); -void ngx_close_file_mapping(ngx_file_mapping_t *fm); - - -#define ngx_realpath(p, r) (u_char *) realpath((char *) p, (char *) r) -#define ngx_realpath_n "realpath()" -#define ngx_getcwd(buf, size) (getcwd((char *) buf, size) != NULL) -#define ngx_getcwd_n "getcwd()" -#define ngx_path_separator(c) ((c) == '/') - - -#if defined(PATH_MAX) - -#define NGX_HAVE_MAX_PATH 1 -#define NGX_MAX_PATH PATH_MAX - -#else - -#define NGX_MAX_PATH 4096 - -#endif - - -ngx_int_t ngx_open_dir(ngx_str_t *name, ngx_dir_t *dir); -#define ngx_open_dir_n "opendir()" - - -#define ngx_close_dir(d) closedir((d)->dir) -#define ngx_close_dir_n "closedir()" - - -ngx_int_t ngx_read_dir(ngx_dir_t *dir); -#define ngx_read_dir_n "readdir()" - - -#define ngx_create_dir(name, access) mkdir((const char *) name, access) -#define ngx_create_dir_n "mkdir()" - - -#define ngx_delete_dir(name) rmdir((const char *) name) -#define ngx_delete_dir_n "rmdir()" - - -#define ngx_dir_access(a) (a | (a & 0444) >> 2) - - -#define ngx_de_name(dir) ((u_char *) (dir)->de->d_name) -#if (NGX_HAVE_D_NAMLEN) -#define ngx_de_namelen(dir) (dir)->de->d_namlen -#else -#define ngx_de_namelen(dir) ngx_strlen((dir)->de->d_name) -#endif - -static ngx_inline ngx_int_t -ngx_de_info(u_char *name, ngx_dir_t *dir) -{ - dir->type = 0; - return stat((const char *) name, &dir->info); -} - -#define ngx_de_info_n "stat()" -#define ngx_de_link_info(name, dir) lstat((const char *) name, &(dir)->info) -#define ngx_de_link_info_n "lstat()" - -#if (NGX_HAVE_D_TYPE) - -/* - * some file systems (e.g. XFS on Linux and CD9660 on FreeBSD) - * do not set dirent.d_type - */ - -#define ngx_de_is_dir(dir) \ - (((dir)->type) ? ((dir)->type == DT_DIR) : (S_ISDIR((dir)->info.st_mode))) -#define ngx_de_is_file(dir) \ - (((dir)->type) ? ((dir)->type == DT_REG) : (S_ISREG((dir)->info.st_mode))) -#define ngx_de_is_link(dir) \ - (((dir)->type) ? ((dir)->type == DT_LNK) : (S_ISLNK((dir)->info.st_mode))) - -#else - -#define ngx_de_is_dir(dir) (S_ISDIR((dir)->info.st_mode)) -#define ngx_de_is_file(dir) (S_ISREG((dir)->info.st_mode)) -#define ngx_de_is_link(dir) (S_ISLNK((dir)->info.st_mode)) - -#endif - -#define ngx_de_access(dir) (((dir)->info.st_mode) & 0777) -#define ngx_de_size(dir) (dir)->info.st_size -#define ngx_de_fs_size(dir) \ - ngx_max((dir)->info.st_size, (dir)->info.st_blocks * 512) -#define ngx_de_mtime(dir) (dir)->info.st_mtime - - -ngx_int_t ngx_open_glob(ngx_glob_t *gl); -#define ngx_open_glob_n "glob()" -ngx_int_t ngx_read_glob(ngx_glob_t *gl, ngx_str_t *name); -void ngx_close_glob(ngx_glob_t *gl); - - -ngx_err_t ngx_trylock_fd(ngx_fd_t fd); -ngx_err_t ngx_lock_fd(ngx_fd_t fd); -ngx_err_t ngx_unlock_fd(ngx_fd_t fd); - -#define ngx_trylock_fd_n "fcntl(F_SETLK, F_WRLCK)" -#define ngx_lock_fd_n "fcntl(F_SETLKW, F_WRLCK)" -#define ngx_unlock_fd_n "fcntl(F_SETLK, F_UNLCK)" - - -#if (NGX_HAVE_F_READAHEAD) - -#define NGX_HAVE_READ_AHEAD 1 - -#define ngx_read_ahead(fd, n) fcntl(fd, F_READAHEAD, (int) n) -#define ngx_read_ahead_n "fcntl(fd, F_READAHEAD)" - -#elif (NGX_HAVE_POSIX_FADVISE) - -#define NGX_HAVE_READ_AHEAD 1 - -ngx_int_t ngx_read_ahead(ngx_fd_t fd, size_t n); -#define ngx_read_ahead_n "posix_fadvise(POSIX_FADV_SEQUENTIAL)" - -#else - -#define ngx_read_ahead(fd, n) 0 -#define ngx_read_ahead_n "ngx_read_ahead_n" - -#endif - - -#if (NGX_HAVE_O_DIRECT) - -ngx_int_t ngx_directio_on(ngx_fd_t fd); -#define ngx_directio_on_n "fcntl(O_DIRECT)" - -ngx_int_t ngx_directio_off(ngx_fd_t fd); -#define ngx_directio_off_n "fcntl(!O_DIRECT)" - -#elif (NGX_HAVE_F_NOCACHE) - -#define ngx_directio_on(fd) fcntl(fd, F_NOCACHE, 1) -#define ngx_directio_on_n "fcntl(F_NOCACHE, 1)" - -#elif (NGX_HAVE_DIRECTIO) - -#define ngx_directio_on(fd) directio(fd, DIRECTIO_ON) -#define ngx_directio_on_n "directio(DIRECTIO_ON)" - -#else - -#define ngx_directio_on(fd) 0 -#define ngx_directio_on_n "ngx_directio_on_n" - -#endif - -size_t ngx_fs_bsize(u_char *name); -off_t ngx_fs_available(u_char *name); - - -#if (NGX_HAVE_OPENAT) - -#define ngx_openat_file(fd, name, mode, create, access) \ - openat(fd, (const char *) name, mode|create, access) - -#define ngx_openat_file_n "openat()" - -#define ngx_file_at_info(fd, name, sb, flag) \ - fstatat(fd, (const char *) name, sb, flag) - -#define ngx_file_at_info_n "fstatat()" - -#define NGX_AT_FDCWD (ngx_fd_t) AT_FDCWD - -#endif - - -#define ngx_stdout STDOUT_FILENO -#define ngx_stderr STDERR_FILENO -#define ngx_set_stderr(fd) dup2(fd, STDERR_FILENO) -#define ngx_set_stderr_n "dup2(STDERR_FILENO)" - - -#if (NGX_HAVE_FILE_AIO) - -ngx_int_t ngx_file_aio_init(ngx_file_t *file, ngx_pool_t *pool); -ssize_t ngx_file_aio_read(ngx_file_t *file, u_char *buf, size_t size, - off_t offset, ngx_pool_t *pool); - -extern ngx_uint_t ngx_file_aio; - -#endif - -#if (NGX_THREADS) -ssize_t ngx_thread_read(ngx_file_t *file, u_char *buf, size_t size, - off_t offset, ngx_pool_t *pool); -ssize_t ngx_thread_write_chain_to_file(ngx_file_t *file, ngx_chain_t *cl, - off_t offset, ngx_pool_t *pool); -#endif - - -#endif /* _NGX_FILES_H_INCLUDED_ */ diff --git a/src/deps/src/nginx-1.30.3/src/os/unix/ngx_freebsd.h b/src/deps/src/nginx-1.30.3/src/os/unix/ngx_freebsd.h deleted file mode 100644 index 4f93da55cd..0000000000 --- a/src/deps/src/nginx-1.30.3/src/os/unix/ngx_freebsd.h +++ /dev/null @@ -1,25 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#ifndef _NGX_FREEBSD_H_INCLUDED_ -#define _NGX_FREEBSD_H_INCLUDED_ - - -void ngx_debug_init(void); -ngx_chain_t *ngx_freebsd_sendfile_chain(ngx_connection_t *c, ngx_chain_t *in, - off_t limit); - -extern int ngx_freebsd_kern_osreldate; -extern int ngx_freebsd_hw_ncpu; -extern u_long ngx_freebsd_net_inet_tcp_sendspace; - -extern ngx_uint_t ngx_freebsd_sendfile_nbytes_bug; -extern ngx_uint_t ngx_freebsd_use_tcp_nopush; -extern ngx_uint_t ngx_debug_malloc; - - -#endif /* _NGX_FREEBSD_H_INCLUDED_ */ diff --git a/src/deps/src/nginx-1.30.3/src/os/unix/ngx_freebsd_config.h b/src/deps/src/nginx-1.30.3/src/os/unix/ngx_freebsd_config.h deleted file mode 100644 index 8153429745..0000000000 --- a/src/deps/src/nginx-1.30.3/src/os/unix/ngx_freebsd_config.h +++ /dev/null @@ -1,129 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#ifndef _NGX_FREEBSD_CONFIG_H_INCLUDED_ -#define _NGX_FREEBSD_CONFIG_H_INCLUDED_ - - -#include -#include -#include -#include -#include /* offsetof() */ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include /* ALIGN() */ -#include /* statfs() */ - -#include /* FIONBIO */ -#include -#include -#include - -#include -#include -#include -#include - -#include -#include -#include /* TCP_NODELAY, TCP_NOPUSH */ -#include -#include -#include - -#include /* setproctitle() before 4.1 */ -#include -#include - -#include - - -#if __FreeBSD_version < 400017 - -/* - * FreeBSD 3.x has no CMSG_SPACE() and CMSG_LEN() and has the broken CMSG_DATA() - */ - -#undef CMSG_SPACE -#define CMSG_SPACE(l) (ALIGN(sizeof(struct cmsghdr)) + ALIGN(l)) - -#undef CMSG_LEN -#define CMSG_LEN(l) (ALIGN(sizeof(struct cmsghdr)) + (l)) - -#undef CMSG_DATA -#define CMSG_DATA(cmsg) ((u_char *)(cmsg) + ALIGN(sizeof(struct cmsghdr))) - -#endif - - -#include - - -#if (NGX_HAVE_POSIX_SEM) -#include -#endif - - -#if (NGX_HAVE_POLL) -#include -#endif - - -#if (NGX_HAVE_KQUEUE) -#include -#endif - - -#if (NGX_HAVE_FILE_AIO) - -#include -typedef struct aiocb ngx_aiocb_t; - -#if (__FreeBSD_version < 700005 && !defined __DragonFly__) -#define sival_ptr sigval_ptr -#endif - -#endif - - -#define NGX_LISTEN_BACKLOG -1 - - -#if (defined __DragonFly__ && __DragonFly_version < 500702) -#define NGX_KEEPALIVE_FACTOR 1000 -#endif - - -#ifndef IOV_MAX -#define IOV_MAX 1024 -#endif - - -#ifndef NGX_HAVE_INHERITED_NONBLOCK -#define NGX_HAVE_INHERITED_NONBLOCK 1 -#endif - - -#define NGX_HAVE_OS_SPECIFIC_INIT 1 -#define NGX_HAVE_DEBUG_MALLOC 1 - - -extern char **environ; -extern char *malloc_options; - - -#endif /* _NGX_FREEBSD_CONFIG_H_INCLUDED_ */ diff --git a/src/deps/src/nginx-1.30.3/src/os/unix/ngx_freebsd_init.c b/src/deps/src/nginx-1.30.3/src/os/unix/ngx_freebsd_init.c deleted file mode 100644 index 1823f02813..0000000000 --- a/src/deps/src/nginx-1.30.3/src/os/unix/ngx_freebsd_init.c +++ /dev/null @@ -1,262 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#include -#include - - -/* FreeBSD 3.0 at least */ -char ngx_freebsd_kern_ostype[16]; -char ngx_freebsd_kern_osrelease[128]; -int ngx_freebsd_kern_osreldate; -int ngx_freebsd_hw_ncpu; -int ngx_freebsd_kern_ipc_somaxconn; -u_long ngx_freebsd_net_inet_tcp_sendspace; - -/* FreeBSD 4.9 */ -int ngx_freebsd_machdep_hlt_logical_cpus; - - -ngx_uint_t ngx_freebsd_sendfile_nbytes_bug; -ngx_uint_t ngx_freebsd_use_tcp_nopush; - -ngx_uint_t ngx_debug_malloc; - - -static ngx_os_io_t ngx_freebsd_io = { - ngx_unix_recv, - ngx_readv_chain, - ngx_udp_unix_recv, - ngx_unix_send, - ngx_udp_unix_send, - ngx_udp_unix_sendmsg_chain, -#if (NGX_HAVE_SENDFILE) - ngx_freebsd_sendfile_chain, - NGX_IO_SENDFILE -#else - ngx_writev_chain, - 0 -#endif -}; - - -typedef struct { - char *name; - void *value; - size_t size; - ngx_uint_t exists; -} sysctl_t; - - -sysctl_t sysctls[] = { - { "hw.ncpu", - &ngx_freebsd_hw_ncpu, - sizeof(ngx_freebsd_hw_ncpu), 0 }, - - { "machdep.hlt_logical_cpus", - &ngx_freebsd_machdep_hlt_logical_cpus, - sizeof(ngx_freebsd_machdep_hlt_logical_cpus), 0 }, - - { "net.inet.tcp.sendspace", - &ngx_freebsd_net_inet_tcp_sendspace, - sizeof(ngx_freebsd_net_inet_tcp_sendspace), 0 }, - - { "kern.ipc.somaxconn", - &ngx_freebsd_kern_ipc_somaxconn, - sizeof(ngx_freebsd_kern_ipc_somaxconn), 0 }, - - { NULL, NULL, 0, 0 } -}; - - -void -ngx_debug_init(void) -{ -#if (NGX_DEBUG_MALLOC) - -#if __FreeBSD_version >= 500014 && __FreeBSD_version < 1000011 - _malloc_options = "J"; -#elif __FreeBSD_version < 500014 - malloc_options = "J"; -#endif - - ngx_debug_malloc = 1; - -#else - char *mo; - - mo = getenv("MALLOC_OPTIONS"); - - if (mo && ngx_strchr(mo, 'J')) { - ngx_debug_malloc = 1; - } -#endif -} - - -ngx_int_t -ngx_os_specific_init(ngx_log_t *log) -{ - int version; - size_t size; - ngx_err_t err; - ngx_uint_t i; - - size = sizeof(ngx_freebsd_kern_ostype); - if (sysctlbyname("kern.ostype", - ngx_freebsd_kern_ostype, &size, NULL, 0) == -1) { - ngx_log_error(NGX_LOG_ALERT, log, ngx_errno, - "sysctlbyname(kern.ostype) failed"); - - if (ngx_errno != NGX_ENOMEM) { - return NGX_ERROR; - } - - ngx_freebsd_kern_ostype[size - 1] = '\0'; - } - - size = sizeof(ngx_freebsd_kern_osrelease); - if (sysctlbyname("kern.osrelease", - ngx_freebsd_kern_osrelease, &size, NULL, 0) == -1) { - ngx_log_error(NGX_LOG_ALERT, log, ngx_errno, - "sysctlbyname(kern.osrelease) failed"); - - if (ngx_errno != NGX_ENOMEM) { - return NGX_ERROR; - } - - ngx_freebsd_kern_osrelease[size - 1] = '\0'; - } - - - size = sizeof(int); - if (sysctlbyname("kern.osreldate", - &ngx_freebsd_kern_osreldate, &size, NULL, 0) == -1) { - ngx_log_error(NGX_LOG_ALERT, log, ngx_errno, - "sysctlbyname(kern.osreldate) failed"); - return NGX_ERROR; - } - - version = ngx_freebsd_kern_osreldate; - - -#if (NGX_HAVE_SENDFILE) - - /* - * The determination of the sendfile() "nbytes bug" is complex enough. - * There are two sendfile() syscalls: a new #393 has no bug while - * an old #336 has the bug in some versions and has not in others. - * Besides libc_r wrapper also emulates the bug in some versions. - * There is no way to say exactly if syscall #336 in FreeBSD circa 4.6 - * has the bug. We use the algorithm that is correct at least for - * RELEASEs and for syscalls only (not libc_r wrapper). - * - * 4.6.1-RELEASE and below have the bug - * 4.6.2-RELEASE and above have the new syscall - * - * We detect the new sendfile() syscall available at the compile time - * to allow an old binary to run correctly on an updated FreeBSD system. - */ - -#if (__FreeBSD__ == 4 && __FreeBSD_version >= 460102) \ - || __FreeBSD_version == 460002 || __FreeBSD_version >= 500039 - - /* a new syscall without the bug */ - - ngx_freebsd_sendfile_nbytes_bug = 0; - -#else - - /* an old syscall that may have the bug */ - - ngx_freebsd_sendfile_nbytes_bug = 1; - -#endif - -#endif /* NGX_HAVE_SENDFILE */ - - - if ((version < 500000 && version >= 440003) || version >= 500017) { - ngx_freebsd_use_tcp_nopush = 1; - } - - - for (i = 0; sysctls[i].name; i++) { - size = sysctls[i].size; - - if (sysctlbyname(sysctls[i].name, sysctls[i].value, &size, NULL, 0) - == 0) - { - sysctls[i].exists = 1; - continue; - } - - err = ngx_errno; - - if (err == NGX_ENOENT) { - continue; - } - - ngx_log_error(NGX_LOG_ALERT, log, err, - "sysctlbyname(%s) failed", sysctls[i].name); - return NGX_ERROR; - } - - if (ngx_freebsd_machdep_hlt_logical_cpus) { - ngx_ncpu = ngx_freebsd_hw_ncpu / 2; - - } else { - ngx_ncpu = ngx_freebsd_hw_ncpu; - } - - if (version < 600008 && ngx_freebsd_kern_ipc_somaxconn > 32767) { - ngx_log_error(NGX_LOG_ALERT, log, 0, - "sysctl kern.ipc.somaxconn must be less than 32768"); - return NGX_ERROR; - } - - ngx_tcp_nodelay_and_tcp_nopush = 1; - - ngx_os_io = ngx_freebsd_io; - - return NGX_OK; -} - - -void -ngx_os_specific_status(ngx_log_t *log) -{ - u_long value; - ngx_uint_t i; - - ngx_log_error(NGX_LOG_NOTICE, log, 0, "OS: %s %s", - ngx_freebsd_kern_ostype, ngx_freebsd_kern_osrelease); - -#ifdef __DragonFly_version - ngx_log_error(NGX_LOG_NOTICE, log, 0, - "kern.osreldate: %d, built on %d", - ngx_freebsd_kern_osreldate, __DragonFly_version); -#else - ngx_log_error(NGX_LOG_NOTICE, log, 0, - "kern.osreldate: %d, built on %d", - ngx_freebsd_kern_osreldate, __FreeBSD_version); -#endif - - for (i = 0; sysctls[i].name; i++) { - if (sysctls[i].exists) { - if (sysctls[i].size == sizeof(long)) { - value = *(long *) sysctls[i].value; - - } else { - value = *(int *) sysctls[i].value; - } - - ngx_log_error(NGX_LOG_NOTICE, log, 0, "%s: %l", - sysctls[i].name, value); - } - } -} diff --git a/src/deps/src/nginx-1.30.3/src/os/unix/ngx_freebsd_sendfile_chain.c b/src/deps/src/nginx-1.30.3/src/os/unix/ngx_freebsd_sendfile_chain.c deleted file mode 100644 index 5c6a830d87..0000000000 --- a/src/deps/src/nginx-1.30.3/src/os/unix/ngx_freebsd_sendfile_chain.c +++ /dev/null @@ -1,308 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#include -#include -#include - - -/* - * Although FreeBSD sendfile() allows to pass a header and a trailer, - * it cannot send a header with a part of the file in one packet until - * FreeBSD 5.3. Besides, over the fast ethernet connection sendfile() - * may send the partially filled packets, i.e. the 8 file pages may be sent - * as the 11 full 1460-bytes packets, then one incomplete 324-bytes packet, - * and then again the 11 full 1460-bytes packets. - * - * Therefore we use the TCP_NOPUSH option (similar to Linux's TCP_CORK) - * to postpone the sending - it not only sends a header and the first part of - * the file in one packet, but also sends the file pages in the full packets. - * - * But until FreeBSD 4.5 turning TCP_NOPUSH off does not flush a pending - * data that less than MSS, so that data may be sent with 5 second delay. - * So we do not use TCP_NOPUSH on FreeBSD prior to 4.5, although it can be used - * for non-keepalive HTTP connections. - */ - - -ngx_chain_t * -ngx_freebsd_sendfile_chain(ngx_connection_t *c, ngx_chain_t *in, off_t limit) -{ - int rc, flags; - off_t send, prev_send, sent; - size_t file_size; - ssize_t n; - ngx_err_t err; - ngx_buf_t *file; - ngx_uint_t eintr, eagain; -#if (NGX_HAVE_SENDFILE_NODISKIO) - ngx_uint_t ebusy; -#endif - ngx_event_t *wev; - ngx_chain_t *cl; - ngx_iovec_t header, trailer; - struct sf_hdtr hdtr; - struct iovec headers[NGX_IOVS_PREALLOCATE]; - struct iovec trailers[NGX_IOVS_PREALLOCATE]; - - wev = c->write; - - if (!wev->ready) { - return in; - } - -#if (NGX_HAVE_KQUEUE) - - if ((ngx_event_flags & NGX_USE_KQUEUE_EVENT) && wev->pending_eof) { - (void) ngx_connection_error(c, wev->kq_errno, - "kevent() reported about an closed connection"); - wev->error = 1; - return NGX_CHAIN_ERROR; - } - -#endif - - /* the maximum limit size is the maximum size_t value - the page size */ - - if (limit == 0 || limit > (off_t) (NGX_MAX_SIZE_T_VALUE - ngx_pagesize)) { - limit = NGX_MAX_SIZE_T_VALUE - ngx_pagesize; - } - - send = 0; - eagain = 0; - flags = 0; - - header.iovs = headers; - header.nalloc = NGX_IOVS_PREALLOCATE; - - trailer.iovs = trailers; - trailer.nalloc = NGX_IOVS_PREALLOCATE; - - for ( ;; ) { - eintr = 0; -#if (NGX_HAVE_SENDFILE_NODISKIO) - ebusy = 0; -#endif - prev_send = send; - - /* create the header iovec and coalesce the neighbouring bufs */ - - cl = ngx_output_chain_to_iovec(&header, in, limit - send, c->log); - - if (cl == NGX_CHAIN_ERROR) { - return NGX_CHAIN_ERROR; - } - - send += header.size; - - if (cl && cl->buf->in_file && send < limit) { - file = cl->buf; - - /* coalesce the neighbouring file bufs */ - - file_size = (size_t) ngx_chain_coalesce_file(&cl, limit - send); - - send += file_size; - - if (send < limit) { - - /* - * create the trailer iovec and coalesce the neighbouring bufs - */ - - cl = ngx_output_chain_to_iovec(&trailer, cl, limit - send, - c->log); - if (cl == NGX_CHAIN_ERROR) { - return NGX_CHAIN_ERROR; - } - - send += trailer.size; - - } else { - trailer.count = 0; - } - - if (ngx_freebsd_use_tcp_nopush - && c->tcp_nopush == NGX_TCP_NOPUSH_UNSET) - { - if (ngx_tcp_nopush(c->fd) == -1) { - err = ngx_socket_errno; - - /* - * there is a tiny chance to be interrupted, however, - * we continue a processing without the TCP_NOPUSH - */ - - if (err != NGX_EINTR) { - wev->error = 1; - (void) ngx_connection_error(c, err, - ngx_tcp_nopush_n " failed"); - return NGX_CHAIN_ERROR; - } - - } else { - c->tcp_nopush = NGX_TCP_NOPUSH_SET; - - ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0, - "tcp_nopush"); - } - } - - /* - * sendfile() does unneeded work if sf_hdtr's count is 0, - * but corresponding pointer is not NULL - */ - - hdtr.headers = header.count ? header.iovs : NULL; - hdtr.hdr_cnt = header.count; - hdtr.trailers = trailer.count ? trailer.iovs : NULL; - hdtr.trl_cnt = trailer.count; - - /* - * the "nbytes bug" of the old sendfile() syscall: - * http://bugs.freebsd.org/33771 - */ - - if (!ngx_freebsd_sendfile_nbytes_bug) { - header.size = 0; - } - - sent = 0; - -#if (NGX_HAVE_SENDFILE_NODISKIO) - - flags = (c->busy_count <= 2) ? SF_NODISKIO : 0; - - if (file->file->directio) { - flags |= SF_NOCACHE; - } - -#endif - - rc = sendfile(file->file->fd, c->fd, file->file_pos, - file_size + header.size, &hdtr, &sent, flags); - - if (rc == -1) { - err = ngx_errno; - - switch (err) { - case NGX_EAGAIN: - eagain = 1; - break; - - case NGX_EINTR: - eintr = 1; - break; - -#if (NGX_HAVE_SENDFILE_NODISKIO) - case NGX_EBUSY: - ebusy = 1; - break; -#endif - - default: - wev->error = 1; - (void) ngx_connection_error(c, err, "sendfile() failed"); - return NGX_CHAIN_ERROR; - } - - ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, err, - "sendfile() sent only %O bytes", sent); - - /* - * sendfile() in FreeBSD 3.x-4.x may return value >= 0 - * on success, although only 0 is documented - */ - - } else if (rc >= 0 && sent == 0) { - - /* - * if rc is OK and sent equal to zero, then someone - * has truncated the file, so the offset became beyond - * the end of the file - */ - - ngx_log_error(NGX_LOG_ALERT, c->log, 0, - "sendfile() reported that \"%s\" was truncated at %O", - file->file->name.data, file->file_pos); - - return NGX_CHAIN_ERROR; - } - - ngx_log_debug4(NGX_LOG_DEBUG_EVENT, c->log, 0, - "sendfile: %d, @%O %O:%uz", - rc, file->file_pos, sent, file_size + header.size); - - } else { - n = ngx_writev(c, &header); - - if (n == NGX_ERROR) { - return NGX_CHAIN_ERROR; - } - - sent = (n == NGX_AGAIN) ? 0 : n; - } - - c->sent += sent; - - in = ngx_chain_update_sent(in, sent); - -#if (NGX_HAVE_SENDFILE_NODISKIO) - - if (ebusy) { - if (sent == 0) { - c->busy_count++; - - ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, - "sendfile() busy, count:%d", c->busy_count); - - } else { - c->busy_count = 0; - } - - if (wev->posted) { - ngx_delete_posted_event(wev); - } - - ngx_post_event(wev, &ngx_posted_next_events); - - wev->ready = 0; - return in; - } - - c->busy_count = 0; - -#endif - - if (eagain) { - - /* - * sendfile() may return EAGAIN, even if it has sent a whole file - * part, it indicates that the successive sendfile() call would - * return EAGAIN right away and would not send anything. - * We use it as a hint. - */ - - wev->ready = 0; - return in; - } - - if (eintr) { - send = prev_send + sent; - continue; - } - - if (send - prev_send != sent) { - wev->ready = 0; - return in; - } - - if (send >= limit || in == NULL) { - return in; - } - } -} diff --git a/src/deps/src/nginx-1.30.3/src/os/unix/ngx_gcc_atomic_amd64.h b/src/deps/src/nginx-1.30.3/src/os/unix/ngx_gcc_atomic_amd64.h deleted file mode 100644 index 159a297427..0000000000 --- a/src/deps/src/nginx-1.30.3/src/os/unix/ngx_gcc_atomic_amd64.h +++ /dev/null @@ -1,82 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#if (NGX_SMP) -#define NGX_SMP_LOCK "lock;" -#else -#define NGX_SMP_LOCK -#endif - - -/* - * "cmpxchgq r, [m]": - * - * if (rax == [m]) { - * zf = 1; - * [m] = r; - * } else { - * zf = 0; - * rax = [m]; - * } - * - * - * The "r" is any register, %rax (%r0) - %r16. - * The "=a" and "a" are the %rax register. - * Although we can return result in any register, we use "a" because it is - * used in cmpxchgq anyway. The result is actually in %al but not in $rax, - * however as the code is inlined gcc can test %al as well as %rax. - * - * The "cc" means that flags were changed. - */ - -static ngx_inline ngx_atomic_uint_t -ngx_atomic_cmp_set(ngx_atomic_t *lock, ngx_atomic_uint_t old, - ngx_atomic_uint_t set) -{ - u_char res; - - __asm__ volatile ( - - NGX_SMP_LOCK - " cmpxchgq %3, %1; " - " sete %0; " - - : "=a" (res) : "m" (*lock), "a" (old), "r" (set) : "cc", "memory"); - - return res; -} - - -/* - * "xaddq r, [m]": - * - * temp = [m]; - * [m] += r; - * r = temp; - * - * - * The "+r" is any register, %rax (%r0) - %r16. - * The "cc" means that flags were changed. - */ - -static ngx_inline ngx_atomic_int_t -ngx_atomic_fetch_add(ngx_atomic_t *value, ngx_atomic_int_t add) -{ - __asm__ volatile ( - - NGX_SMP_LOCK - " xaddq %0, %1; " - - : "+r" (add) : "m" (*value) : "cc", "memory"); - - return add; -} - - -#define ngx_memory_barrier() __asm__ volatile ("" ::: "memory") - -#define ngx_cpu_pause() __asm__ ("pause") diff --git a/src/deps/src/nginx-1.30.3/src/os/unix/ngx_gcc_atomic_ppc.h b/src/deps/src/nginx-1.30.3/src/os/unix/ngx_gcc_atomic_ppc.h deleted file mode 100644 index 45afc4b9ea..0000000000 --- a/src/deps/src/nginx-1.30.3/src/os/unix/ngx_gcc_atomic_ppc.h +++ /dev/null @@ -1,155 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -/* - * The ppc assembler treats ";" as comment, so we have to use "\n". - * The minus in "bne-" is a hint for the branch prediction unit that - * this branch is unlikely to be taken. - * The "1b" means the nearest backward label "1" and the "1f" means - * the nearest forward label "1". - * - * The "b" means that the base registers can be used only, i.e. - * any register except r0. The r0 register always has a zero value and - * could not be used in "addi r0, r0, 1". - * The "=&b" means that no input registers can be used. - * - * "sync" read and write barriers - * "isync" read barrier, is faster than "sync" - * "eieio" write barrier, is faster than "sync" - * "lwsync" write barrier, is faster than "eieio" on ppc64 - */ - -#if (NGX_PTR_SIZE == 8) - -static ngx_inline ngx_atomic_uint_t -ngx_atomic_cmp_set(ngx_atomic_t *lock, ngx_atomic_uint_t old, - ngx_atomic_uint_t set) -{ - ngx_atomic_uint_t res, temp; - - __asm__ volatile ( - - " li %0, 0 \n" /* preset "0" to "res" */ - " lwsync \n" /* write barrier */ - "1: \n" - " ldarx %1, 0, %2 \n" /* load from [lock] into "temp" */ - /* and store reservation */ - " cmpd %1, %3 \n" /* compare "temp" and "old" */ - " bne- 2f \n" /* not equal */ - " stdcx. %4, 0, %2 \n" /* store "set" into [lock] if reservation */ - /* is not cleared */ - " bne- 1b \n" /* the reservation was cleared */ - " isync \n" /* read barrier */ - " li %0, 1 \n" /* set "1" to "res" */ - "2: \n" - - : "=&b" (res), "=&b" (temp) - : "b" (lock), "b" (old), "b" (set) - : "cc", "memory"); - - return res; -} - - -static ngx_inline ngx_atomic_int_t -ngx_atomic_fetch_add(ngx_atomic_t *value, ngx_atomic_int_t add) -{ - ngx_atomic_uint_t res, temp; - - __asm__ volatile ( - - " lwsync \n" /* write barrier */ - "1: ldarx %0, 0, %2 \n" /* load from [value] into "res" */ - /* and store reservation */ - " add %1, %0, %3 \n" /* "res" + "add" store in "temp" */ - " stdcx. %1, 0, %2 \n" /* store "temp" into [value] if reservation */ - /* is not cleared */ - " bne- 1b \n" /* try again if reservation was cleared */ - " isync \n" /* read barrier */ - - : "=&b" (res), "=&b" (temp) - : "b" (value), "b" (add) - : "cc", "memory"); - - return res; -} - - -#if (NGX_SMP) -#define ngx_memory_barrier() \ - __asm__ volatile ("isync \n lwsync \n" ::: "memory") -#else -#define ngx_memory_barrier() __asm__ volatile ("" ::: "memory") -#endif - -#else - -static ngx_inline ngx_atomic_uint_t -ngx_atomic_cmp_set(ngx_atomic_t *lock, ngx_atomic_uint_t old, - ngx_atomic_uint_t set) -{ - ngx_atomic_uint_t res, temp; - - __asm__ volatile ( - - " li %0, 0 \n" /* preset "0" to "res" */ - " eieio \n" /* write barrier */ - "1: \n" - " lwarx %1, 0, %2 \n" /* load from [lock] into "temp" */ - /* and store reservation */ - " cmpw %1, %3 \n" /* compare "temp" and "old" */ - " bne- 2f \n" /* not equal */ - " stwcx. %4, 0, %2 \n" /* store "set" into [lock] if reservation */ - /* is not cleared */ - " bne- 1b \n" /* the reservation was cleared */ - " isync \n" /* read barrier */ - " li %0, 1 \n" /* set "1" to "res" */ - "2: \n" - - : "=&b" (res), "=&b" (temp) - : "b" (lock), "b" (old), "b" (set) - : "cc", "memory"); - - return res; -} - - -static ngx_inline ngx_atomic_int_t -ngx_atomic_fetch_add(ngx_atomic_t *value, ngx_atomic_int_t add) -{ - ngx_atomic_uint_t res, temp; - - __asm__ volatile ( - - " eieio \n" /* write barrier */ - "1: lwarx %0, 0, %2 \n" /* load from [value] into "res" */ - /* and store reservation */ - " add %1, %0, %3 \n" /* "res" + "add" store in "temp" */ - " stwcx. %1, 0, %2 \n" /* store "temp" into [value] if reservation */ - /* is not cleared */ - " bne- 1b \n" /* try again if reservation was cleared */ - " isync \n" /* read barrier */ - - : "=&b" (res), "=&b" (temp) - : "b" (value), "b" (add) - : "cc", "memory"); - - return res; -} - - -#if (NGX_SMP) -#define ngx_memory_barrier() \ - __asm__ volatile ("isync \n eieio \n" ::: "memory") -#else -#define ngx_memory_barrier() __asm__ volatile ("" ::: "memory") -#endif - -#endif - - -#define ngx_cpu_pause() diff --git a/src/deps/src/nginx-1.30.3/src/os/unix/ngx_gcc_atomic_sparc64.h b/src/deps/src/nginx-1.30.3/src/os/unix/ngx_gcc_atomic_sparc64.h deleted file mode 100644 index a84db35448..0000000000 --- a/src/deps/src/nginx-1.30.3/src/os/unix/ngx_gcc_atomic_sparc64.h +++ /dev/null @@ -1,82 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -/* - * "casa [r1] 0x80, r2, r0" and - * "casxa [r1] 0x80, r2, r0" do the following: - * - * if ([r1] == r2) { - * swap(r0, [r1]); - * } else { - * r0 = [r1]; - * } - * - * so "r0 == r2" means that the operation was successful. - * - * - * The "r" means the general register. - * The "+r" means the general register used for both input and output. - */ - - -#if (NGX_PTR_SIZE == 4) -#define NGX_CASA "casa" -#else -#define NGX_CASA "casxa" -#endif - - -static ngx_inline ngx_atomic_uint_t -ngx_atomic_cmp_set(ngx_atomic_t *lock, ngx_atomic_uint_t old, - ngx_atomic_uint_t set) -{ - __asm__ volatile ( - - NGX_CASA " [%1] 0x80, %2, %0" - - : "+r" (set) : "r" (lock), "r" (old) : "memory"); - - return (set == old); -} - - -static ngx_inline ngx_atomic_int_t -ngx_atomic_fetch_add(ngx_atomic_t *value, ngx_atomic_int_t add) -{ - ngx_atomic_uint_t old, res; - - old = *value; - - for ( ;; ) { - - res = old + add; - - __asm__ volatile ( - - NGX_CASA " [%1] 0x80, %2, %0" - - : "+r" (res) : "r" (value), "r" (old) : "memory"); - - if (res == old) { - return res; - } - - old = res; - } -} - - -#if (NGX_SMP) -#define ngx_memory_barrier() \ - __asm__ volatile ( \ - "membar #LoadLoad | #LoadStore | #StoreStore | #StoreLoad" \ - ::: "memory") -#else -#define ngx_memory_barrier() __asm__ volatile ("" ::: "memory") -#endif - -#define ngx_cpu_pause() diff --git a/src/deps/src/nginx-1.30.3/src/os/unix/ngx_gcc_atomic_x86.h b/src/deps/src/nginx-1.30.3/src/os/unix/ngx_gcc_atomic_x86.h deleted file mode 100644 index 54e01aebf0..0000000000 --- a/src/deps/src/nginx-1.30.3/src/os/unix/ngx_gcc_atomic_x86.h +++ /dev/null @@ -1,127 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#if (NGX_SMP) -#define NGX_SMP_LOCK "lock;" -#else -#define NGX_SMP_LOCK -#endif - - -/* - * "cmpxchgl r, [m]": - * - * if (eax == [m]) { - * zf = 1; - * [m] = r; - * } else { - * zf = 0; - * eax = [m]; - * } - * - * - * The "r" means the general register. - * The "=a" and "a" are the %eax register. - * Although we can return result in any register, we use "a" because it is - * used in cmpxchgl anyway. The result is actually in %al but not in %eax, - * however, as the code is inlined gcc can test %al as well as %eax, - * and icc adds "movzbl %al, %eax" by itself. - * - * The "cc" means that flags were changed. - */ - -static ngx_inline ngx_atomic_uint_t -ngx_atomic_cmp_set(ngx_atomic_t *lock, ngx_atomic_uint_t old, - ngx_atomic_uint_t set) -{ - u_char res; - - __asm__ volatile ( - - NGX_SMP_LOCK - " cmpxchgl %3, %1; " - " sete %0; " - - : "=a" (res) : "m" (*lock), "a" (old), "r" (set) : "cc", "memory"); - - return res; -} - - -/* - * "xaddl r, [m]": - * - * temp = [m]; - * [m] += r; - * r = temp; - * - * - * The "+r" means the general register. - * The "cc" means that flags were changed. - */ - - -#if !(( __GNUC__ == 2 && __GNUC_MINOR__ <= 7 ) || ( __INTEL_COMPILER >= 800 )) - -/* - * icc 8.1 and 9.0 compile broken code with -march=pentium4 option: - * ngx_atomic_fetch_add() always return the input "add" value, - * so we use the gcc 2.7 version. - * - * icc 8.1 and 9.0 with -march=pentiumpro option or icc 7.1 compile - * correct code. - */ - -static ngx_inline ngx_atomic_int_t -ngx_atomic_fetch_add(ngx_atomic_t *value, ngx_atomic_int_t add) -{ - __asm__ volatile ( - - NGX_SMP_LOCK - " xaddl %0, %1; " - - : "+r" (add) : "m" (*value) : "cc", "memory"); - - return add; -} - - -#else - -/* - * gcc 2.7 does not support "+r", so we have to use the fixed - * %eax ("=a" and "a") and this adds two superfluous instructions in the end - * of code, something like this: "mov %eax, %edx / mov %edx, %eax". - */ - -static ngx_inline ngx_atomic_int_t -ngx_atomic_fetch_add(ngx_atomic_t *value, ngx_atomic_int_t add) -{ - ngx_atomic_uint_t old; - - __asm__ volatile ( - - NGX_SMP_LOCK - " xaddl %2, %1; " - - : "=a" (old) : "m" (*value), "a" (add) : "cc", "memory"); - - return old; -} - -#endif - - -/* - * on x86 the write operations go in a program order, so we need only - * to disable the gcc reorder optimizations - */ - -#define ngx_memory_barrier() __asm__ volatile ("" ::: "memory") - -/* old "as" does not support "pause" opcode */ -#define ngx_cpu_pause() __asm__ (".byte 0xf3, 0x90") diff --git a/src/deps/src/nginx-1.30.3/src/os/unix/ngx_linux.h b/src/deps/src/nginx-1.30.3/src/os/unix/ngx_linux.h deleted file mode 100644 index 13d654e399..0000000000 --- a/src/deps/src/nginx-1.30.3/src/os/unix/ngx_linux.h +++ /dev/null @@ -1,16 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#ifndef _NGX_LINUX_H_INCLUDED_ -#define _NGX_LINUX_H_INCLUDED_ - - -ngx_chain_t *ngx_linux_sendfile_chain(ngx_connection_t *c, ngx_chain_t *in, - off_t limit); - - -#endif /* _NGX_LINUX_H_INCLUDED_ */ diff --git a/src/deps/src/nginx-1.30.3/src/os/unix/ngx_linux_aio_read.c b/src/deps/src/nginx-1.30.3/src/os/unix/ngx_linux_aio_read.c deleted file mode 100644 index 9f0a6c124e..0000000000 --- a/src/deps/src/nginx-1.30.3/src/os/unix/ngx_linux_aio_read.c +++ /dev/null @@ -1,148 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#include -#include -#include - - -extern int ngx_eventfd; -extern aio_context_t ngx_aio_ctx; - - -static void ngx_file_aio_event_handler(ngx_event_t *ev); - - -static int -io_submit(aio_context_t ctx, long n, struct iocb **paiocb) -{ - return syscall(SYS_io_submit, ctx, n, paiocb); -} - - -ngx_int_t -ngx_file_aio_init(ngx_file_t *file, ngx_pool_t *pool) -{ - ngx_event_aio_t *aio; - - aio = ngx_pcalloc(pool, sizeof(ngx_event_aio_t)); - if (aio == NULL) { - return NGX_ERROR; - } - - aio->file = file; - aio->fd = file->fd; - aio->event.data = aio; - aio->event.ready = 1; - aio->event.log = file->log; - - file->aio = aio; - - return NGX_OK; -} - - -ssize_t -ngx_file_aio_read(ngx_file_t *file, u_char *buf, size_t size, off_t offset, - ngx_pool_t *pool) -{ - ngx_err_t err; - struct iocb *piocb[1]; - ngx_event_t *ev; - ngx_event_aio_t *aio; - - if (!ngx_file_aio) { - return ngx_read_file(file, buf, size, offset); - } - - if (file->aio == NULL && ngx_file_aio_init(file, pool) != NGX_OK) { - return NGX_ERROR; - } - - aio = file->aio; - ev = &aio->event; - - if (!ev->ready) { - ngx_log_error(NGX_LOG_ALERT, file->log, 0, - "second aio post for \"%V\"", &file->name); - return NGX_AGAIN; - } - - ngx_log_debug4(NGX_LOG_DEBUG_CORE, file->log, 0, - "aio complete:%d @%O:%uz %V", - ev->complete, offset, size, &file->name); - - if (ev->complete) { - ev->active = 0; - ev->complete = 0; - - if (aio->res >= 0) { - ngx_set_errno(0); - return aio->res; - } - - ngx_set_errno(-aio->res); - - ngx_log_error(NGX_LOG_CRIT, file->log, ngx_errno, - "aio read \"%s\" failed", file->name.data); - - return NGX_ERROR; - } - - ngx_memzero(&aio->aiocb, sizeof(struct iocb)); - - aio->aiocb.aio_data = (uint64_t) (uintptr_t) ev; - aio->aiocb.aio_lio_opcode = IOCB_CMD_PREAD; - aio->aiocb.aio_fildes = file->fd; - aio->aiocb.aio_buf = (uint64_t) (uintptr_t) buf; - aio->aiocb.aio_nbytes = size; - aio->aiocb.aio_offset = offset; - aio->aiocb.aio_flags = IOCB_FLAG_RESFD; - aio->aiocb.aio_resfd = ngx_eventfd; - - ev->handler = ngx_file_aio_event_handler; - - piocb[0] = &aio->aiocb; - - if (io_submit(ngx_aio_ctx, 1, piocb) == 1) { - ev->active = 1; - ev->ready = 0; - ev->complete = 0; - - return NGX_AGAIN; - } - - err = ngx_errno; - - if (err == NGX_EAGAIN) { - return ngx_read_file(file, buf, size, offset); - } - - ngx_log_error(NGX_LOG_CRIT, file->log, err, - "io_submit(\"%V\") failed", &file->name); - - if (err == NGX_ENOSYS) { - ngx_file_aio = 0; - return ngx_read_file(file, buf, size, offset); - } - - return NGX_ERROR; -} - - -static void -ngx_file_aio_event_handler(ngx_event_t *ev) -{ - ngx_event_aio_t *aio; - - aio = ev->data; - - ngx_log_debug2(NGX_LOG_DEBUG_CORE, ev->log, 0, - "aio event handler fd:%d %V", aio->fd, &aio->file->name); - - aio->handler(ev); -} diff --git a/src/deps/src/nginx-1.30.3/src/os/unix/ngx_linux_config.h b/src/deps/src/nginx-1.30.3/src/os/unix/ngx_linux_config.h deleted file mode 100644 index d99358c93f..0000000000 --- a/src/deps/src/nginx-1.30.3/src/os/unix/ngx_linux_config.h +++ /dev/null @@ -1,136 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#ifndef _NGX_LINUX_CONFIG_H_INCLUDED_ -#define _NGX_LINUX_CONFIG_H_INCLUDED_ - - -#ifndef _GNU_SOURCE -#define _GNU_SOURCE /* pread(), pwrite(), gethostname() */ -#endif - -#define _FILE_OFFSET_BITS 64 - -#include -#include -#include -#include -#include /* offsetof() */ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include /* statfs() */ - -#include -#include -#include - -#include -#include -#include -#include - -#include -#include -#include /* TCP_NODELAY, TCP_CORK */ -#include -#include -#include - -#include /* tzset() */ -#include /* memalign() */ -#include /* IOV_MAX */ -#include -#include /* uname() */ - -#include - - -#include - - -#if (NGX_HAVE_CRYPT_H) -#include -#endif - - -#if (NGX_HAVE_POSIX_SEM) -#include -#endif - - -#if (NGX_HAVE_SYS_PRCTL_H) -#include -#endif - - -#if (NGX_HAVE_SENDFILE64) -#include -#else -extern ssize_t sendfile(int s, int fd, int32_t *offset, size_t size); -#define NGX_SENDFILE_LIMIT 0x80000000 -#endif - - -#if (NGX_HAVE_POLL) -#include -#endif - - -#if (NGX_HAVE_EPOLL) -#include -#endif - - -#if (NGX_HAVE_SYS_EVENTFD_H) -#include -#endif -#include -#if (NGX_HAVE_FILE_AIO) -#include -typedef struct iocb ngx_aiocb_t; -#endif - - -#if (NGX_HAVE_CAPABILITIES) -#include -#endif - -#if (NGX_HAVE_UDP_SEGMENT) -#include -#endif - - -#define NGX_LISTEN_BACKLOG 511 - - -#ifndef NGX_HAVE_SO_SNDLOWAT -/* setsockopt(SO_SNDLOWAT) returns ENOPROTOOPT */ -#define NGX_HAVE_SO_SNDLOWAT 0 -#endif - - -#ifndef NGX_HAVE_INHERITED_NONBLOCK -#define NGX_HAVE_INHERITED_NONBLOCK 0 -#endif - - -#define NGX_HAVE_OS_SPECIFIC_INIT 1 -#define ngx_debug_init() - - -extern char **environ; - - -#endif /* _NGX_LINUX_CONFIG_H_INCLUDED_ */ diff --git a/src/deps/src/nginx-1.30.3/src/os/unix/ngx_linux_init.c b/src/deps/src/nginx-1.30.3/src/os/unix/ngx_linux_init.c deleted file mode 100644 index a8cf6a048d..0000000000 --- a/src/deps/src/nginx-1.30.3/src/os/unix/ngx_linux_init.c +++ /dev/null @@ -1,60 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#include -#include - - -u_char ngx_linux_kern_ostype[50]; -u_char ngx_linux_kern_osrelease[50]; - - -static ngx_os_io_t ngx_linux_io = { - ngx_unix_recv, - ngx_readv_chain, - ngx_udp_unix_recv, - ngx_unix_send, - ngx_udp_unix_send, - ngx_udp_unix_sendmsg_chain, -#if (NGX_HAVE_SENDFILE) - ngx_linux_sendfile_chain, - NGX_IO_SENDFILE -#else - ngx_writev_chain, - 0 -#endif -}; - - -ngx_int_t -ngx_os_specific_init(ngx_log_t *log) -{ - struct utsname u; - - if (uname(&u) == -1) { - ngx_log_error(NGX_LOG_ALERT, log, ngx_errno, "uname() failed"); - return NGX_ERROR; - } - - (void) ngx_cpystrn(ngx_linux_kern_ostype, (u_char *) u.sysname, - sizeof(ngx_linux_kern_ostype)); - - (void) ngx_cpystrn(ngx_linux_kern_osrelease, (u_char *) u.release, - sizeof(ngx_linux_kern_osrelease)); - - ngx_os_io = ngx_linux_io; - - return NGX_OK; -} - - -void -ngx_os_specific_status(ngx_log_t *log) -{ - ngx_log_error(NGX_LOG_NOTICE, log, 0, "OS: %s %s", - ngx_linux_kern_ostype, ngx_linux_kern_osrelease); -} diff --git a/src/deps/src/nginx-1.30.3/src/os/unix/ngx_linux_sendfile_chain.c b/src/deps/src/nginx-1.30.3/src/os/unix/ngx_linux_sendfile_chain.c deleted file mode 100644 index 603f91722c..0000000000 --- a/src/deps/src/nginx-1.30.3/src/os/unix/ngx_linux_sendfile_chain.c +++ /dev/null @@ -1,436 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#include -#include -#include - - -static ssize_t ngx_linux_sendfile(ngx_connection_t *c, ngx_buf_t *file, - size_t size); - -#if (NGX_THREADS) -#include - -#if !(NGX_HAVE_SENDFILE64) -#error sendfile64() is required! -#endif - -static ssize_t ngx_linux_sendfile_thread(ngx_connection_t *c, ngx_buf_t *file, - size_t size); -static void ngx_linux_sendfile_thread_handler(void *data, ngx_log_t *log); -#endif - - -/* - * On Linux up to 2.4.21 sendfile() (syscall #187) works with 32-bit - * offsets only, and the including breaks the compiling, - * if off_t is 64 bit wide. So we use own sendfile() definition, where offset - * parameter is int32_t, and use sendfile() for the file parts below 2G only, - * see src/os/unix/ngx_linux_config.h - * - * Linux 2.4.21 has the new sendfile64() syscall #239. - * - * On Linux up to 2.6.16 sendfile() does not allow to pass the count parameter - * more than 2G-1 bytes even on 64-bit platforms: it returns EINVAL, - * so we limit it to 2G-1 bytes. - * - * On Linux 2.6.16 and later, sendfile() silently limits the count parameter - * to 2G minus the page size, even on 64-bit platforms. - */ - -#define NGX_SENDFILE_MAXSIZE 2147483647L - - -ngx_chain_t * -ngx_linux_sendfile_chain(ngx_connection_t *c, ngx_chain_t *in, off_t limit) -{ - int tcp_nodelay; - off_t send, prev_send; - size_t file_size, sent; - ssize_t n; - ngx_err_t err; - ngx_buf_t *file; - ngx_event_t *wev; - ngx_chain_t *cl; - ngx_iovec_t header; - struct iovec headers[NGX_IOVS_PREALLOCATE]; - - wev = c->write; - - if (!wev->ready) { - return in; - } - - - /* the maximum limit size is 2G-1 - the page size */ - - if (limit == 0 || limit > (off_t) (NGX_SENDFILE_MAXSIZE - ngx_pagesize)) { - limit = NGX_SENDFILE_MAXSIZE - ngx_pagesize; - } - - - send = 0; - - header.iovs = headers; - header.nalloc = NGX_IOVS_PREALLOCATE; - - for ( ;; ) { - prev_send = send; - - /* create the iovec and coalesce the neighbouring bufs */ - - cl = ngx_output_chain_to_iovec(&header, in, limit - send, c->log); - - if (cl == NGX_CHAIN_ERROR) { - return NGX_CHAIN_ERROR; - } - - send += header.size; - - /* set TCP_CORK if there is a header before a file */ - - if (c->tcp_nopush == NGX_TCP_NOPUSH_UNSET - && header.count != 0 - && cl - && cl->buf->in_file) - { - /* the TCP_CORK and TCP_NODELAY are mutually exclusive */ - - if (c->tcp_nodelay == NGX_TCP_NODELAY_SET) { - - tcp_nodelay = 0; - - if (setsockopt(c->fd, IPPROTO_TCP, TCP_NODELAY, - (const void *) &tcp_nodelay, sizeof(int)) == -1) - { - err = ngx_socket_errno; - - /* - * there is a tiny chance to be interrupted, however, - * we continue a processing with the TCP_NODELAY - * and without the TCP_CORK - */ - - if (err != NGX_EINTR) { - wev->error = 1; - ngx_connection_error(c, err, - "setsockopt(TCP_NODELAY) failed"); - return NGX_CHAIN_ERROR; - } - - } else { - c->tcp_nodelay = NGX_TCP_NODELAY_UNSET; - - ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0, - "no tcp_nodelay"); - } - } - - if (c->tcp_nodelay == NGX_TCP_NODELAY_UNSET) { - - if (ngx_tcp_nopush(c->fd) == -1) { - err = ngx_socket_errno; - - /* - * there is a tiny chance to be interrupted, however, - * we continue a processing without the TCP_CORK - */ - - if (err != NGX_EINTR) { - wev->error = 1; - ngx_connection_error(c, err, - ngx_tcp_nopush_n " failed"); - return NGX_CHAIN_ERROR; - } - - } else { - c->tcp_nopush = NGX_TCP_NOPUSH_SET; - - ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0, - "tcp_nopush"); - } - } - } - - /* get the file buf */ - - if (header.count == 0 && cl && cl->buf->in_file && send < limit) { - file = cl->buf; - - /* coalesce the neighbouring file bufs */ - - file_size = (size_t) ngx_chain_coalesce_file(&cl, limit - send); - - send += file_size; -#if 1 - if (file_size == 0) { - ngx_debug_point(); - return NGX_CHAIN_ERROR; - } -#endif - - n = ngx_linux_sendfile(c, file, file_size); - - if (n == NGX_ERROR) { - return NGX_CHAIN_ERROR; - } - - if (n == NGX_DONE) { - /* thread task posted */ - return in; - } - - sent = (n == NGX_AGAIN) ? 0 : n; - - } else { - n = ngx_writev(c, &header); - - if (n == NGX_ERROR) { - return NGX_CHAIN_ERROR; - } - - sent = (n == NGX_AGAIN) ? 0 : n; - } - - c->sent += sent; - - in = ngx_chain_update_sent(in, sent); - - if (n == NGX_AGAIN) { - wev->ready = 0; - return in; - } - - if ((size_t) (send - prev_send) != sent) { - - /* - * sendfile() on Linux 4.3+ might be interrupted at any time, - * and provides no indication if it was interrupted or not, - * so we have to retry till an explicit EAGAIN - * - * sendfile() in threads can also report less bytes written - * than we are prepared to send now, since it was started in - * some point in the past, so we again have to retry - */ - - send = prev_send + sent; - } - - if (send >= limit || in == NULL) { - return in; - } - } -} - - -static ssize_t -ngx_linux_sendfile(ngx_connection_t *c, ngx_buf_t *file, size_t size) -{ -#if (NGX_HAVE_SENDFILE64) - off_t offset; -#else - int32_t offset; -#endif - ssize_t n; - ngx_err_t err; - -#if (NGX_THREADS) - - if (file->file->thread_handler) { - return ngx_linux_sendfile_thread(c, file, size); - } - -#endif - -#if (NGX_HAVE_SENDFILE64) - offset = file->file_pos; -#else - offset = (int32_t) file->file_pos; -#endif - -eintr: - - ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0, - "sendfile: @%O %uz", file->file_pos, size); - - n = sendfile(c->fd, file->file->fd, &offset, size); - - if (n == -1) { - err = ngx_errno; - - switch (err) { - case NGX_EAGAIN: - ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, err, - "sendfile() is not ready"); - return NGX_AGAIN; - - case NGX_EINTR: - ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, err, - "sendfile() was interrupted"); - goto eintr; - - default: - c->write->error = 1; - ngx_connection_error(c, err, "sendfile() failed"); - return NGX_ERROR; - } - } - - if (n == 0) { - /* - * if sendfile returns zero, then someone has truncated the file, - * so the offset became beyond the end of the file - */ - - ngx_log_error(NGX_LOG_ALERT, c->log, 0, - "sendfile() reported that \"%s\" was truncated at %O", - file->file->name.data, file->file_pos); - - return NGX_ERROR; - } - - ngx_log_debug3(NGX_LOG_DEBUG_EVENT, c->log, 0, "sendfile: %z of %uz @%O", - n, size, file->file_pos); - - return n; -} - - -#if (NGX_THREADS) - -typedef struct { - ngx_buf_t *file; - ngx_socket_t socket; - size_t size; - - size_t sent; - ngx_err_t err; -} ngx_linux_sendfile_ctx_t; - - -static ssize_t -ngx_linux_sendfile_thread(ngx_connection_t *c, ngx_buf_t *file, size_t size) -{ - ngx_event_t *wev; - ngx_thread_task_t *task; - ngx_linux_sendfile_ctx_t *ctx; - - ngx_log_debug3(NGX_LOG_DEBUG_CORE, c->log, 0, - "linux sendfile thread: %d, %uz, %O", - file->file->fd, size, file->file_pos); - - task = c->sendfile_task; - - if (task == NULL) { - task = ngx_thread_task_alloc(c->pool, sizeof(ngx_linux_sendfile_ctx_t)); - if (task == NULL) { - return NGX_ERROR; - } - - task->event.log = c->log; - task->handler = ngx_linux_sendfile_thread_handler; - - c->sendfile_task = task; - } - - ctx = task->ctx; - wev = c->write; - - if (task->event.complete) { - task->event.complete = 0; - - if (ctx->err == NGX_EAGAIN) { - /* - * if wev->complete is set, this means that a write event - * happened while we were waiting for the thread task, so - * we have to retry sending even on EAGAIN - */ - - if (wev->complete) { - return 0; - } - - return NGX_AGAIN; - } - - if (ctx->err) { - wev->error = 1; - ngx_connection_error(c, ctx->err, "sendfile() failed"); - return NGX_ERROR; - } - - if (ctx->sent == 0) { - /* - * if sendfile returns zero, then someone has truncated the file, - * so the offset became beyond the end of the file - */ - - ngx_log_error(NGX_LOG_ALERT, c->log, 0, - "sendfile() reported that \"%s\" was truncated at %O", - file->file->name.data, file->file_pos); - - return NGX_ERROR; - } - - return ctx->sent; - } - - ctx->file = file; - ctx->socket = c->fd; - ctx->size = size; - - wev->complete = 0; - - if (file->file->thread_handler(task, file->file) != NGX_OK) { - return NGX_ERROR; - } - - return NGX_DONE; -} - - -static void -ngx_linux_sendfile_thread_handler(void *data, ngx_log_t *log) -{ - ngx_linux_sendfile_ctx_t *ctx = data; - - off_t offset; - ssize_t n; - ngx_buf_t *file; - - ngx_log_debug0(NGX_LOG_DEBUG_CORE, log, 0, "linux sendfile thread handler"); - - file = ctx->file; - offset = file->file_pos; - -again: - - n = sendfile(ctx->socket, file->file->fd, &offset, ctx->size); - - if (n == -1) { - ctx->err = ngx_errno; - - } else { - ctx->sent = n; - ctx->err = 0; - } - -#if 0 - ngx_time_update(); -#endif - - ngx_log_debug4(NGX_LOG_DEBUG_EVENT, log, 0, - "sendfile: %z (err: %d) of %uz @%O", - n, ctx->err, ctx->size, file->file_pos); - - if (ctx->err == NGX_EINTR) { - goto again; - } -} - -#endif /* NGX_THREADS */ diff --git a/src/deps/src/nginx-1.30.3/src/os/unix/ngx_os.h b/src/deps/src/nginx-1.30.3/src/os/unix/ngx_os.h deleted file mode 100644 index 3b328191bb..0000000000 --- a/src/deps/src/nginx-1.30.3/src/os/unix/ngx_os.h +++ /dev/null @@ -1,102 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#ifndef _NGX_OS_H_INCLUDED_ -#define _NGX_OS_H_INCLUDED_ - - -#include -#include - - -#define NGX_IO_SENDFILE 1 - - -typedef ssize_t (*ngx_recv_pt)(ngx_connection_t *c, u_char *buf, size_t size); -typedef ssize_t (*ngx_recv_chain_pt)(ngx_connection_t *c, ngx_chain_t *in, - off_t limit); -typedef ssize_t (*ngx_send_pt)(ngx_connection_t *c, u_char *buf, size_t size); -typedef ngx_chain_t *(*ngx_send_chain_pt)(ngx_connection_t *c, ngx_chain_t *in, - off_t limit); - -typedef struct { - ngx_recv_pt recv; - ngx_recv_chain_pt recv_chain; - ngx_recv_pt udp_recv; - ngx_send_pt send; - ngx_send_pt udp_send; - ngx_send_chain_pt udp_send_chain; - ngx_send_chain_pt send_chain; - ngx_uint_t flags; -} ngx_os_io_t; - - -ngx_int_t ngx_os_init(ngx_log_t *log); -void ngx_os_status(ngx_log_t *log); -ngx_int_t ngx_os_specific_init(ngx_log_t *log); -void ngx_os_specific_status(ngx_log_t *log); -ngx_int_t ngx_daemon(ngx_log_t *log); -ngx_int_t ngx_os_signal_process(ngx_cycle_t *cycle, char *sig, ngx_pid_t pid); - - -ssize_t ngx_unix_recv(ngx_connection_t *c, u_char *buf, size_t size); -ssize_t ngx_readv_chain(ngx_connection_t *c, ngx_chain_t *entry, off_t limit); -ssize_t ngx_udp_unix_recv(ngx_connection_t *c, u_char *buf, size_t size); -ssize_t ngx_unix_send(ngx_connection_t *c, u_char *buf, size_t size); -ngx_chain_t *ngx_writev_chain(ngx_connection_t *c, ngx_chain_t *in, - off_t limit); -ssize_t ngx_udp_unix_send(ngx_connection_t *c, u_char *buf, size_t size); -ngx_chain_t *ngx_udp_unix_sendmsg_chain(ngx_connection_t *c, ngx_chain_t *in, - off_t limit); - - -#if (IOV_MAX > 64) -#define NGX_IOVS_PREALLOCATE 64 -#else -#define NGX_IOVS_PREALLOCATE IOV_MAX -#endif - - -typedef struct { - struct iovec *iovs; - ngx_uint_t count; - size_t size; - ngx_uint_t nalloc; -} ngx_iovec_t; - -ngx_chain_t *ngx_output_chain_to_iovec(ngx_iovec_t *vec, ngx_chain_t *in, - size_t limit, ngx_log_t *log); - - -ssize_t ngx_writev(ngx_connection_t *c, ngx_iovec_t *vec); - - -extern ngx_os_io_t ngx_os_io; -extern ngx_int_t ngx_ncpu; -extern ngx_int_t ngx_max_sockets; -extern ngx_uint_t ngx_inherited_nonblocking; -extern ngx_uint_t ngx_tcp_nodelay_and_tcp_nopush; - - -#if (NGX_FREEBSD) -#include - - -#elif (NGX_LINUX) -#include - - -#elif (NGX_SOLARIS) -#include - - -#elif (NGX_DARWIN) -#include -#endif - - -#endif /* _NGX_OS_H_INCLUDED_ */ diff --git a/src/deps/src/nginx-1.30.3/src/os/unix/ngx_posix_config.h b/src/deps/src/nginx-1.30.3/src/os/unix/ngx_posix_config.h deleted file mode 100644 index 2a8c413e0c..0000000000 --- a/src/deps/src/nginx-1.30.3/src/os/unix/ngx_posix_config.h +++ /dev/null @@ -1,151 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#ifndef _NGX_POSIX_CONFIG_H_INCLUDED_ -#define _NGX_POSIX_CONFIG_H_INCLUDED_ - - -#if (NGX_HPUX) -#define _XOPEN_SOURCE -#define _XOPEN_SOURCE_EXTENDED 1 -#define _HPUX_ALT_XOPEN_SOCKET_API -#endif - - -#if (NGX_TRU64) -#define _REENTRANT -#endif - - -#if (NGX_GNU_HURD) -#ifndef _GNU_SOURCE -#define _GNU_SOURCE /* accept4() */ -#endif -#define _FILE_OFFSET_BITS 64 -#endif - - -#ifdef __CYGWIN__ -#define timezonevar /* timezone is variable */ -#define NGX_BROKEN_SCM_RIGHTS 1 -#endif - - -#include -#include -#if (NGX_HAVE_UNISTD_H) -#include -#endif -#if (NGX_HAVE_INTTYPES_H) -#include -#endif -#include -#include /* offsetof() */ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#if (NGX_HAVE_SYS_PARAM_H) -#include /* statfs() */ -#endif -#if (NGX_HAVE_SYS_MOUNT_H) -#include /* statfs() */ -#endif -#if (NGX_HAVE_SYS_STATVFS_H) -#include /* statvfs() */ -#endif - -#if (NGX_HAVE_SYS_FILIO_H) -#include /* FIONBIO */ -#endif -#include /* FIONBIO */ - -#include -#include -#include - -#include -#include -#include -#include - -#include -#include -#include /* TCP_NODELAY */ -#include -#include -#include - -#if (NGX_HAVE_LIMITS_H) -#include /* IOV_MAX */ -#endif - -#ifdef __CYGWIN__ -#include /* memalign() */ -#endif - -#if (NGX_HAVE_CRYPT_H) -#include -#endif - - -#ifndef IOV_MAX -#define IOV_MAX 16 -#endif - - -#include - - -#if (NGX_HAVE_DLOPEN) -#include -#endif - - -#if (NGX_HAVE_POSIX_SEM) -#include -#endif - - -#if (NGX_HAVE_POLL) -#include -#endif - - -#if (NGX_HAVE_KQUEUE) -#include -#endif - - -#if (NGX_HAVE_DEVPOLL) && !(NGX_TEST_BUILD_DEVPOLL) -#include -#include -#endif - - -#if (NGX_HAVE_FILE_AIO) -#include -typedef struct aiocb ngx_aiocb_t; -#endif - - -#define NGX_LISTEN_BACKLOG 511 - -#define ngx_debug_init() - - -extern char **environ; - - -#endif /* _NGX_POSIX_CONFIG_H_INCLUDED_ */ diff --git a/src/deps/src/nginx-1.30.3/src/os/unix/ngx_posix_init.c b/src/deps/src/nginx-1.30.3/src/os/unix/ngx_posix_init.c deleted file mode 100644 index 6ac931c0ce..0000000000 --- a/src/deps/src/nginx-1.30.3/src/os/unix/ngx_posix_init.c +++ /dev/null @@ -1,147 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#include -#include -#include - - -ngx_int_t ngx_ncpu; -ngx_int_t ngx_max_sockets; -ngx_uint_t ngx_inherited_nonblocking; -ngx_uint_t ngx_tcp_nodelay_and_tcp_nopush; - - -struct rlimit rlmt; - - -ngx_os_io_t ngx_os_io = { - ngx_unix_recv, - ngx_readv_chain, - ngx_udp_unix_recv, - ngx_unix_send, - ngx_udp_unix_send, - ngx_udp_unix_sendmsg_chain, - ngx_writev_chain, - 0 -}; - - -ngx_int_t -ngx_os_init(ngx_log_t *log) -{ - ngx_time_t *tp; - ngx_uint_t n; -#if (NGX_HAVE_LEVEL1_DCACHE_LINESIZE) - long size; -#endif - -#if (NGX_HAVE_OS_SPECIFIC_INIT) - if (ngx_os_specific_init(log) != NGX_OK) { - return NGX_ERROR; - } -#endif - - if (ngx_init_setproctitle(log) != NGX_OK) { - return NGX_ERROR; - } - - ngx_pagesize = getpagesize(); - - if (ngx_cacheline_size == 0) { - ngx_cacheline_size = NGX_CPU_CACHE_LINE; - } - - for (n = ngx_pagesize; n >>= 1; ngx_pagesize_shift++) { /* void */ } - -#if (NGX_HAVE_SC_NPROCESSORS_ONLN) - if (ngx_ncpu == 0) { - ngx_ncpu = sysconf(_SC_NPROCESSORS_ONLN); - } -#endif - - if (ngx_ncpu < 1) { - ngx_ncpu = 1; - } - -#if (NGX_HAVE_LEVEL1_DCACHE_LINESIZE) - size = sysconf(_SC_LEVEL1_DCACHE_LINESIZE); - if (size > 0) { - ngx_cacheline_size = size; - } -#endif - - ngx_cpuinfo(); - - if (getrlimit(RLIMIT_NOFILE, &rlmt) == -1) { - ngx_log_error(NGX_LOG_ALERT, log, errno, - "getrlimit(RLIMIT_NOFILE) failed"); - return NGX_ERROR; - } - - ngx_max_sockets = (ngx_int_t) rlmt.rlim_cur; - -#if (NGX_HAVE_INHERITED_NONBLOCK || NGX_HAVE_ACCEPT4) - ngx_inherited_nonblocking = 1; -#else - ngx_inherited_nonblocking = 0; -#endif - - tp = ngx_timeofday(); - srandom(((unsigned) ngx_pid << 16) ^ tp->sec ^ tp->msec); - - return NGX_OK; -} - - -void -ngx_os_status(ngx_log_t *log) -{ - ngx_log_error(NGX_LOG_NOTICE, log, 0, NGINX_VER_BUILD); - -#ifdef NGX_COMPILER - ngx_log_error(NGX_LOG_NOTICE, log, 0, "built by " NGX_COMPILER); -#endif - -#if (NGX_HAVE_OS_SPECIFIC_INIT) - ngx_os_specific_status(log); -#endif - - ngx_log_error(NGX_LOG_NOTICE, log, 0, - "getrlimit(RLIMIT_NOFILE): %r:%r", - rlmt.rlim_cur, rlmt.rlim_max); -} - - -#if 0 - -ngx_int_t -ngx_posix_post_conf_init(ngx_log_t *log) -{ - ngx_fd_t pp[2]; - - if (pipe(pp) == -1) { - ngx_log_error(NGX_LOG_EMERG, log, ngx_errno, "pipe() failed"); - return NGX_ERROR; - } - - if (dup2(pp[1], STDERR_FILENO) == -1) { - ngx_log_error(NGX_LOG_EMERG, log, errno, "dup2(STDERR) failed"); - return NGX_ERROR; - } - - if (pp[1] > STDERR_FILENO) { - if (close(pp[1]) == -1) { - ngx_log_error(NGX_LOG_EMERG, log, errno, "close() failed"); - return NGX_ERROR; - } - } - - return NGX_OK; -} - -#endif diff --git a/src/deps/src/nginx-1.30.3/src/os/unix/ngx_process.c b/src/deps/src/nginx-1.30.3/src/os/unix/ngx_process.c deleted file mode 100644 index 15680237a6..0000000000 --- a/src/deps/src/nginx-1.30.3/src/os/unix/ngx_process.c +++ /dev/null @@ -1,648 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#include -#include -#include -#include - - -typedef struct { - int signo; - char *signame; - char *name; - void (*handler)(int signo, siginfo_t *siginfo, void *ucontext); -} ngx_signal_t; - - - -static void ngx_execute_proc(ngx_cycle_t *cycle, void *data); -static void ngx_signal_handler(int signo, siginfo_t *siginfo, void *ucontext); -static void ngx_process_get_status(void); -static void ngx_unlock_mutexes(ngx_pid_t pid); - - -int ngx_argc; -char **ngx_argv; -char **ngx_os_argv; - -ngx_int_t ngx_process_slot; -ngx_socket_t ngx_channel; -ngx_int_t ngx_last_process; -ngx_process_t ngx_processes[NGX_MAX_PROCESSES]; - - -ngx_signal_t signals[] = { - { ngx_signal_value(NGX_RECONFIGURE_SIGNAL), - "SIG" ngx_value(NGX_RECONFIGURE_SIGNAL), - "reload", - ngx_signal_handler }, - - { ngx_signal_value(NGX_REOPEN_SIGNAL), - "SIG" ngx_value(NGX_REOPEN_SIGNAL), - "reopen", - ngx_signal_handler }, - - { ngx_signal_value(NGX_NOACCEPT_SIGNAL), - "SIG" ngx_value(NGX_NOACCEPT_SIGNAL), - "", - ngx_signal_handler }, - - { ngx_signal_value(NGX_TERMINATE_SIGNAL), - "SIG" ngx_value(NGX_TERMINATE_SIGNAL), - "stop", - ngx_signal_handler }, - - { ngx_signal_value(NGX_SHUTDOWN_SIGNAL), - "SIG" ngx_value(NGX_SHUTDOWN_SIGNAL), - "quit", - ngx_signal_handler }, - - { ngx_signal_value(NGX_CHANGEBIN_SIGNAL), - "SIG" ngx_value(NGX_CHANGEBIN_SIGNAL), - "", - ngx_signal_handler }, - - { SIGALRM, "SIGALRM", "", ngx_signal_handler }, - - { SIGINT, "SIGINT", "", ngx_signal_handler }, - - { SIGIO, "SIGIO", "", ngx_signal_handler }, - - { SIGCHLD, "SIGCHLD", "", ngx_signal_handler }, - - { SIGSYS, "SIGSYS, SIG_IGN", "", NULL }, - - { SIGPIPE, "SIGPIPE, SIG_IGN", "", NULL }, - - { 0, NULL, "", NULL } -}; - - -ngx_pid_t -ngx_spawn_process(ngx_cycle_t *cycle, ngx_spawn_proc_pt proc, void *data, - char *name, ngx_int_t respawn) -{ - u_long on; - ngx_pid_t pid; - ngx_int_t s; - - if (respawn >= 0) { - s = respawn; - - } else { - for (s = 0; s < ngx_last_process; s++) { - if (ngx_processes[s].pid == -1) { - break; - } - } - - if (s == NGX_MAX_PROCESSES) { - ngx_log_error(NGX_LOG_ALERT, cycle->log, 0, - "no more than %d processes can be spawned", - NGX_MAX_PROCESSES); - return NGX_INVALID_PID; - } - } - - - if (respawn != NGX_PROCESS_DETACHED) { - - /* Solaris 9 still has no AF_LOCAL */ - - if (socketpair(AF_UNIX, SOCK_STREAM, 0, ngx_processes[s].channel) == -1) - { - ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno, - "socketpair() failed while spawning \"%s\"", name); - return NGX_INVALID_PID; - } - - ngx_log_debug2(NGX_LOG_DEBUG_CORE, cycle->log, 0, - "channel %d:%d", - ngx_processes[s].channel[0], - ngx_processes[s].channel[1]); - - if (ngx_nonblocking(ngx_processes[s].channel[0]) == -1) { - ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno, - ngx_nonblocking_n " failed while spawning \"%s\"", - name); - ngx_close_channel(ngx_processes[s].channel, cycle->log); - return NGX_INVALID_PID; - } - - if (ngx_nonblocking(ngx_processes[s].channel[1]) == -1) { - ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno, - ngx_nonblocking_n " failed while spawning \"%s\"", - name); - ngx_close_channel(ngx_processes[s].channel, cycle->log); - return NGX_INVALID_PID; - } - - on = 1; - if (ioctl(ngx_processes[s].channel[0], FIOASYNC, &on) == -1) { - ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno, - "ioctl(FIOASYNC) failed while spawning \"%s\"", name); - ngx_close_channel(ngx_processes[s].channel, cycle->log); - return NGX_INVALID_PID; - } - - if (fcntl(ngx_processes[s].channel[0], F_SETOWN, ngx_pid) == -1) { - ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno, - "fcntl(F_SETOWN) failed while spawning \"%s\"", name); - ngx_close_channel(ngx_processes[s].channel, cycle->log); - return NGX_INVALID_PID; - } - - if (fcntl(ngx_processes[s].channel[0], F_SETFD, FD_CLOEXEC) == -1) { - ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno, - "fcntl(FD_CLOEXEC) failed while spawning \"%s\"", - name); - ngx_close_channel(ngx_processes[s].channel, cycle->log); - return NGX_INVALID_PID; - } - - if (fcntl(ngx_processes[s].channel[1], F_SETFD, FD_CLOEXEC) == -1) { - ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno, - "fcntl(FD_CLOEXEC) failed while spawning \"%s\"", - name); - ngx_close_channel(ngx_processes[s].channel, cycle->log); - return NGX_INVALID_PID; - } - - ngx_channel = ngx_processes[s].channel[1]; - - } else { - ngx_processes[s].channel[0] = -1; - ngx_processes[s].channel[1] = -1; - } - - ngx_process_slot = s; - - - pid = fork(); - - switch (pid) { - - case -1: - ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno, - "fork() failed while spawning \"%s\"", name); - ngx_close_channel(ngx_processes[s].channel, cycle->log); - return NGX_INVALID_PID; - - case 0: - ngx_parent = ngx_pid; - ngx_pid = ngx_getpid(); - proc(cycle, data); - break; - - default: - break; - } - - ngx_log_error(NGX_LOG_NOTICE, cycle->log, 0, "start %s %P", name, pid); - - ngx_processes[s].pid = pid; - ngx_processes[s].exited = 0; - - if (respawn >= 0) { - return pid; - } - - ngx_processes[s].proc = proc; - ngx_processes[s].data = data; - ngx_processes[s].name = name; - ngx_processes[s].exiting = 0; - - switch (respawn) { - - case NGX_PROCESS_NORESPAWN: - ngx_processes[s].respawn = 0; - ngx_processes[s].just_spawn = 0; - ngx_processes[s].detached = 0; - break; - - case NGX_PROCESS_JUST_SPAWN: - ngx_processes[s].respawn = 0; - ngx_processes[s].just_spawn = 1; - ngx_processes[s].detached = 0; - break; - - case NGX_PROCESS_RESPAWN: - ngx_processes[s].respawn = 1; - ngx_processes[s].just_spawn = 0; - ngx_processes[s].detached = 0; - break; - - case NGX_PROCESS_JUST_RESPAWN: - ngx_processes[s].respawn = 1; - ngx_processes[s].just_spawn = 1; - ngx_processes[s].detached = 0; - break; - - case NGX_PROCESS_DETACHED: - ngx_processes[s].respawn = 0; - ngx_processes[s].just_spawn = 0; - ngx_processes[s].detached = 1; - break; - } - - if (s == ngx_last_process) { - ngx_last_process++; - } - - return pid; -} - - -ngx_pid_t -ngx_execute(ngx_cycle_t *cycle, ngx_exec_ctx_t *ctx) -{ - return ngx_spawn_process(cycle, ngx_execute_proc, ctx, ctx->name, - NGX_PROCESS_DETACHED); -} - - -static void -ngx_execute_proc(ngx_cycle_t *cycle, void *data) -{ - ngx_exec_ctx_t *ctx = data; - - if (execve(ctx->path, ctx->argv, ctx->envp) == -1) { - ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno, - "execve() failed while executing %s \"%s\"", - ctx->name, ctx->path); - } - - exit(1); -} - - -ngx_int_t -ngx_init_signals(ngx_log_t *log) -{ - ngx_signal_t *sig; - struct sigaction sa; - - for (sig = signals; sig->signo != 0; sig++) { - ngx_memzero(&sa, sizeof(struct sigaction)); - - if (sig->handler) { - sa.sa_sigaction = sig->handler; - sa.sa_flags = SA_SIGINFO; - - } else { - sa.sa_handler = SIG_IGN; - } - - sigemptyset(&sa.sa_mask); - if (sigaction(sig->signo, &sa, NULL) == -1) { -#if (NGX_VALGRIND) - ngx_log_error(NGX_LOG_ALERT, log, ngx_errno, - "sigaction(%s) failed, ignored", sig->signame); -#else - ngx_log_error(NGX_LOG_EMERG, log, ngx_errno, - "sigaction(%s) failed", sig->signame); - return NGX_ERROR; -#endif - } - } - - return NGX_OK; -} - - -static void -ngx_signal_handler(int signo, siginfo_t *siginfo, void *ucontext) -{ - char *action; - ngx_int_t ignore; - ngx_err_t err; - ngx_signal_t *sig; - - ignore = 0; - - err = ngx_errno; - - for (sig = signals; sig->signo != 0; sig++) { - if (sig->signo == signo) { - break; - } - } - - ngx_time_sigsafe_update(); - - action = ""; - - switch (ngx_process) { - - case NGX_PROCESS_MASTER: - case NGX_PROCESS_SINGLE: - switch (signo) { - - case ngx_signal_value(NGX_SHUTDOWN_SIGNAL): - ngx_quit = 1; - action = ", shutting down"; - break; - - case ngx_signal_value(NGX_TERMINATE_SIGNAL): - case SIGINT: - ngx_terminate = 1; - action = ", exiting"; - break; - - case ngx_signal_value(NGX_NOACCEPT_SIGNAL): - if (ngx_daemonized) { - ngx_noaccept = 1; - action = ", stop accepting connections"; - } - break; - - case ngx_signal_value(NGX_RECONFIGURE_SIGNAL): - ngx_reconfigure = 1; - action = ", reconfiguring"; - break; - - case ngx_signal_value(NGX_REOPEN_SIGNAL): - ngx_reopen = 1; - action = ", reopening logs"; - break; - - case ngx_signal_value(NGX_CHANGEBIN_SIGNAL): - if (ngx_getppid() == ngx_parent || ngx_new_binary > 0) { - - /* - * Ignore the signal in the new binary if its parent is - * not changed, i.e. the old binary's process is still - * running. Or ignore the signal in the old binary's - * process if the new binary's process is already running. - */ - - action = ", ignoring"; - ignore = 1; - break; - } - - ngx_change_binary = 1; - action = ", changing binary"; - break; - - case SIGALRM: - ngx_sigalrm = 1; - break; - - case SIGIO: - ngx_sigio = 1; - break; - - case SIGCHLD: - ngx_reap = 1; - break; - } - - break; - - case NGX_PROCESS_WORKER: - case NGX_PROCESS_HELPER: - switch (signo) { - - case ngx_signal_value(NGX_NOACCEPT_SIGNAL): - if (!ngx_daemonized) { - break; - } - ngx_debug_quit = 1; - /* fall through */ - case ngx_signal_value(NGX_SHUTDOWN_SIGNAL): - ngx_quit = 1; - action = ", shutting down"; - break; - - case ngx_signal_value(NGX_TERMINATE_SIGNAL): - case SIGINT: - ngx_terminate = 1; - action = ", exiting"; - break; - - case ngx_signal_value(NGX_REOPEN_SIGNAL): - ngx_reopen = 1; - action = ", reopening logs"; - break; - - case ngx_signal_value(NGX_RECONFIGURE_SIGNAL): - case ngx_signal_value(NGX_CHANGEBIN_SIGNAL): - case SIGIO: - action = ", ignoring"; - break; - } - - break; - } - - if (siginfo && siginfo->si_pid) { - ngx_log_error(NGX_LOG_NOTICE, ngx_cycle->log, 0, - "signal %d (%s) received from %P%s", - signo, sig->signame, siginfo->si_pid, action); - - } else { - ngx_log_error(NGX_LOG_NOTICE, ngx_cycle->log, 0, - "signal %d (%s) received%s", - signo, sig->signame, action); - } - - if (ignore) { - ngx_log_error(NGX_LOG_CRIT, ngx_cycle->log, 0, - "the changing binary signal is ignored: " - "you should shutdown or terminate " - "before either old or new binary's process"); - } - - if (signo == SIGCHLD) { - ngx_process_get_status(); - } - - ngx_set_errno(err); -} - - -static void -ngx_process_get_status(void) -{ - int status; - char *process; - ngx_pid_t pid; - ngx_err_t err; - ngx_int_t i; - ngx_uint_t one; - - one = 0; - - for ( ;; ) { - pid = waitpid(-1, &status, WNOHANG); - - if (pid == 0) { - return; - } - - if (pid == -1) { - err = ngx_errno; - - if (err == NGX_EINTR) { - continue; - } - - if (err == NGX_ECHILD && one) { - return; - } - - /* - * Solaris always calls the signal handler for each exited process - * despite waitpid() may be already called for this process. - * - * When several processes exit at the same time FreeBSD may - * erroneously call the signal handler for exited process - * despite waitpid() may be already called for this process. - */ - - if (err == NGX_ECHILD) { - ngx_log_error(NGX_LOG_INFO, ngx_cycle->log, err, - "waitpid() failed"); - return; - } - - ngx_log_error(NGX_LOG_ALERT, ngx_cycle->log, err, - "waitpid() failed"); - return; - } - - - one = 1; - process = "unknown process"; - - for (i = 0; i < ngx_last_process; i++) { - if (ngx_processes[i].pid == pid) { - ngx_processes[i].status = status; - ngx_processes[i].exited = 1; - process = ngx_processes[i].name; - break; - } - } - - if (WTERMSIG(status)) { -#ifdef WCOREDUMP - ngx_log_error(NGX_LOG_ALERT, ngx_cycle->log, 0, - "%s %P exited on signal %d%s", - process, pid, WTERMSIG(status), - WCOREDUMP(status) ? " (core dumped)" : ""); -#else - ngx_log_error(NGX_LOG_ALERT, ngx_cycle->log, 0, - "%s %P exited on signal %d", - process, pid, WTERMSIG(status)); -#endif - - } else { - ngx_log_error(NGX_LOG_NOTICE, ngx_cycle->log, 0, - "%s %P exited with code %d", - process, pid, WEXITSTATUS(status)); - } - - if (WEXITSTATUS(status) == 2 && ngx_processes[i].respawn) { - ngx_log_error(NGX_LOG_ALERT, ngx_cycle->log, 0, - "%s %P exited with fatal code %d " - "and cannot be respawned", - process, pid, WEXITSTATUS(status)); - ngx_processes[i].respawn = 0; - } - - ngx_unlock_mutexes(pid); - } -} - - -static void -ngx_unlock_mutexes(ngx_pid_t pid) -{ - ngx_uint_t i; - ngx_shm_zone_t *shm_zone; - ngx_list_part_t *part; - ngx_slab_pool_t *sp; - - /* - * unlock the accept mutex if the abnormally exited process - * held it - */ - - if (ngx_accept_mutex_ptr) { - (void) ngx_shmtx_force_unlock(&ngx_accept_mutex, pid); - } - - /* - * unlock shared memory mutexes if held by the abnormally exited - * process - */ - - part = (ngx_list_part_t *) &ngx_cycle->shared_memory.part; - shm_zone = part->elts; - - for (i = 0; /* void */ ; i++) { - - if (i >= part->nelts) { - if (part->next == NULL) { - break; - } - part = part->next; - shm_zone = part->elts; - i = 0; - } - - sp = (ngx_slab_pool_t *) shm_zone[i].shm.addr; - - if (ngx_shmtx_force_unlock(&sp->mutex, pid)) { - ngx_log_error(NGX_LOG_ALERT, ngx_cycle->log, 0, - "shared memory zone \"%V\" was locked by %P", - &shm_zone[i].shm.name, pid); - } - } -} - - -void -ngx_debug_point(void) -{ - ngx_core_conf_t *ccf; - - ccf = (ngx_core_conf_t *) ngx_get_conf(ngx_cycle->conf_ctx, - ngx_core_module); - - switch (ccf->debug_points) { - - case NGX_DEBUG_POINTS_STOP: - raise(SIGSTOP); - break; - - case NGX_DEBUG_POINTS_ABORT: - ngx_abort(); - } -} - - -ngx_int_t -ngx_os_signal_process(ngx_cycle_t *cycle, char *name, ngx_pid_t pid) -{ - ngx_signal_t *sig; - - for (sig = signals; sig->signo != 0; sig++) { - if (ngx_strcmp(name, sig->name) == 0) { - if (kill(pid, sig->signo) != -1) { - return 0; - } - - ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno, - "kill(%P, %d) failed", pid, sig->signo); - } - } - - return 1; -} diff --git a/src/deps/src/nginx-1.30.3/src/os/unix/ngx_process.h b/src/deps/src/nginx-1.30.3/src/os/unix/ngx_process.h deleted file mode 100644 index 3986639b47..0000000000 --- a/src/deps/src/nginx-1.30.3/src/os/unix/ngx_process.h +++ /dev/null @@ -1,90 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#ifndef _NGX_PROCESS_H_INCLUDED_ -#define _NGX_PROCESS_H_INCLUDED_ - - -#include -#include - - -typedef pid_t ngx_pid_t; - -#define NGX_INVALID_PID -1 - -typedef void (*ngx_spawn_proc_pt) (ngx_cycle_t *cycle, void *data); - -typedef struct { - ngx_pid_t pid; - int status; - ngx_socket_t channel[2]; - - ngx_spawn_proc_pt proc; - void *data; - char *name; - - unsigned respawn:1; - unsigned just_spawn:1; - unsigned detached:1; - unsigned exiting:1; - unsigned exited:1; -} ngx_process_t; - - -typedef struct { - char *path; - char *name; - char *const *argv; - char *const *envp; -} ngx_exec_ctx_t; - - -#define NGX_MAX_PROCESSES 1024 - -#define NGX_PROCESS_NORESPAWN -1 -#define NGX_PROCESS_JUST_SPAWN -2 -#define NGX_PROCESS_RESPAWN -3 -#define NGX_PROCESS_JUST_RESPAWN -4 -#define NGX_PROCESS_DETACHED -5 - - -#define ngx_getpid getpid -#define ngx_getppid getppid - -#ifndef ngx_log_pid -#define ngx_log_pid ngx_pid -#endif - - -ngx_pid_t ngx_spawn_process(ngx_cycle_t *cycle, - ngx_spawn_proc_pt proc, void *data, char *name, ngx_int_t respawn); -ngx_pid_t ngx_execute(ngx_cycle_t *cycle, ngx_exec_ctx_t *ctx); -ngx_int_t ngx_init_signals(ngx_log_t *log); -void ngx_debug_point(void); - - -#if (NGX_HAVE_SCHED_YIELD) -#define ngx_sched_yield() sched_yield() -#else -#define ngx_sched_yield() usleep(1) -#endif - - -extern int ngx_argc; -extern char **ngx_argv; -extern char **ngx_os_argv; - -extern ngx_pid_t ngx_pid; -extern ngx_pid_t ngx_parent; -extern ngx_socket_t ngx_channel; -extern ngx_int_t ngx_process_slot; -extern ngx_int_t ngx_last_process; -extern ngx_process_t ngx_processes[NGX_MAX_PROCESSES]; - - -#endif /* _NGX_PROCESS_H_INCLUDED_ */ diff --git a/src/deps/src/nginx-1.30.3/src/os/unix/ngx_process_cycle.c b/src/deps/src/nginx-1.30.3/src/os/unix/ngx_process_cycle.c deleted file mode 100644 index 5bc5ce9792..0000000000 --- a/src/deps/src/nginx-1.30.3/src/os/unix/ngx_process_cycle.c +++ /dev/null @@ -1,1191 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#include -#include -#include -#include - - -static void ngx_start_worker_processes(ngx_cycle_t *cycle, ngx_int_t n, - ngx_int_t type); -static void ngx_start_cache_manager_processes(ngx_cycle_t *cycle, - ngx_uint_t respawn); -static void ngx_pass_open_channel(ngx_cycle_t *cycle); -static void ngx_signal_worker_processes(ngx_cycle_t *cycle, int signo); -static ngx_uint_t ngx_reap_children(ngx_cycle_t *cycle); -static void ngx_master_process_exit(ngx_cycle_t *cycle); -static void ngx_worker_process_cycle(ngx_cycle_t *cycle, void *data); -static void ngx_worker_process_init(ngx_cycle_t *cycle, ngx_int_t worker); -static void ngx_worker_process_exit(ngx_cycle_t *cycle); -static void ngx_channel_handler(ngx_event_t *ev); -static void ngx_cache_manager_process_cycle(ngx_cycle_t *cycle, void *data); -static void ngx_cache_manager_process_handler(ngx_event_t *ev); -static void ngx_cache_loader_process_handler(ngx_event_t *ev); - - -ngx_uint_t ngx_process; -ngx_uint_t ngx_worker; -ngx_pid_t ngx_pid; -ngx_pid_t ngx_parent; - -sig_atomic_t ngx_reap; -sig_atomic_t ngx_sigio; -sig_atomic_t ngx_sigalrm; -sig_atomic_t ngx_terminate; -sig_atomic_t ngx_quit; -sig_atomic_t ngx_debug_quit; -ngx_uint_t ngx_exiting; -sig_atomic_t ngx_reconfigure; -sig_atomic_t ngx_reopen; - -sig_atomic_t ngx_change_binary; -ngx_pid_t ngx_new_binary; -ngx_uint_t ngx_inherited; -ngx_uint_t ngx_daemonized; - -sig_atomic_t ngx_noaccept; -ngx_uint_t ngx_noaccepting; -ngx_uint_t ngx_restart; - - -static u_char master_process[] = "master process"; - - -static ngx_cache_manager_ctx_t ngx_cache_manager_ctx = { - ngx_cache_manager_process_handler, "cache manager process", 0 -}; - -static ngx_cache_manager_ctx_t ngx_cache_loader_ctx = { - ngx_cache_loader_process_handler, "cache loader process", 60000 -}; - - -static ngx_cycle_t ngx_exit_cycle; -static ngx_log_t ngx_exit_log; -static ngx_open_file_t ngx_exit_log_file; - - -void -ngx_master_process_cycle(ngx_cycle_t *cycle) -{ - char *title; - u_char *p; - size_t size; - ngx_int_t i; - ngx_uint_t sigio; - sigset_t set; - struct itimerval itv; - ngx_uint_t live; - ngx_msec_t delay; - ngx_core_conf_t *ccf; - - sigemptyset(&set); - sigaddset(&set, SIGCHLD); - sigaddset(&set, SIGALRM); - sigaddset(&set, SIGIO); - sigaddset(&set, SIGINT); - sigaddset(&set, ngx_signal_value(NGX_RECONFIGURE_SIGNAL)); - sigaddset(&set, ngx_signal_value(NGX_REOPEN_SIGNAL)); - sigaddset(&set, ngx_signal_value(NGX_NOACCEPT_SIGNAL)); - sigaddset(&set, ngx_signal_value(NGX_TERMINATE_SIGNAL)); - sigaddset(&set, ngx_signal_value(NGX_SHUTDOWN_SIGNAL)); - sigaddset(&set, ngx_signal_value(NGX_CHANGEBIN_SIGNAL)); - - if (sigprocmask(SIG_BLOCK, &set, NULL) == -1) { - ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno, - "sigprocmask() failed"); - } - - sigemptyset(&set); - - - size = sizeof(master_process); - - for (i = 0; i < ngx_argc; i++) { - size += ngx_strlen(ngx_argv[i]) + 1; - } - - title = ngx_pnalloc(cycle->pool, size); - if (title == NULL) { - /* fatal */ - exit(2); - } - - p = ngx_cpymem(title, master_process, sizeof(master_process) - 1); - for (i = 0; i < ngx_argc; i++) { - *p++ = ' '; - p = ngx_cpystrn(p, (u_char *) ngx_argv[i], size); - } - - ngx_setproctitle(title); - - - ccf = (ngx_core_conf_t *) ngx_get_conf(cycle->conf_ctx, ngx_core_module); - - ngx_start_worker_processes(cycle, ccf->worker_processes, - NGX_PROCESS_RESPAWN); - ngx_start_cache_manager_processes(cycle, 0); - - ngx_new_binary = 0; - delay = 0; - sigio = 0; - live = 1; - - for ( ;; ) { - if (delay) { - if (ngx_sigalrm) { - sigio = 0; - delay *= 2; - ngx_sigalrm = 0; - } - - ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0, - "termination cycle: %M", delay); - - itv.it_interval.tv_sec = 0; - itv.it_interval.tv_usec = 0; - itv.it_value.tv_sec = delay / 1000; - itv.it_value.tv_usec = (delay % 1000 ) * 1000; - - if (setitimer(ITIMER_REAL, &itv, NULL) == -1) { - ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno, - "setitimer() failed"); - } - } - - ngx_log_debug0(NGX_LOG_DEBUG_EVENT, cycle->log, 0, "sigsuspend"); - - sigsuspend(&set); - - ngx_time_update(); - - ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0, - "wake up, sigio %i", sigio); - - if (ngx_reap) { - ngx_reap = 0; - ngx_log_debug0(NGX_LOG_DEBUG_EVENT, cycle->log, 0, "reap children"); - - live = ngx_reap_children(cycle); - } - - if (!live && (ngx_terminate || ngx_quit)) { - ngx_master_process_exit(cycle); - } - - if (ngx_terminate) { - if (delay == 0) { - delay = 50; - } - - if (sigio) { - sigio--; - continue; - } - - sigio = ccf->worker_processes + 2 /* cache processes */; - - if (delay > 1000) { - ngx_signal_worker_processes(cycle, SIGKILL); - } else { - ngx_signal_worker_processes(cycle, - ngx_signal_value(NGX_TERMINATE_SIGNAL)); - } - - continue; - } - - if (ngx_quit) { - ngx_signal_worker_processes(cycle, - ngx_signal_value(NGX_SHUTDOWN_SIGNAL)); - ngx_close_listening_sockets(cycle); - - continue; - } - - if (ngx_reconfigure) { - ngx_reconfigure = 0; - - if (ngx_new_binary) { - ngx_start_worker_processes(cycle, ccf->worker_processes, - NGX_PROCESS_RESPAWN); - ngx_start_cache_manager_processes(cycle, 0); - ngx_noaccepting = 0; - - continue; - } - - ngx_log_error(NGX_LOG_NOTICE, cycle->log, 0, "reconfiguring"); - - cycle = ngx_init_cycle(cycle); - if (cycle == NULL) { - cycle = (ngx_cycle_t *) ngx_cycle; - continue; - } - - ngx_cycle = cycle; - ccf = (ngx_core_conf_t *) ngx_get_conf(cycle->conf_ctx, - ngx_core_module); - ngx_start_worker_processes(cycle, ccf->worker_processes, - NGX_PROCESS_JUST_RESPAWN); - ngx_start_cache_manager_processes(cycle, 1); - - /* allow new processes to start */ - ngx_msleep(100); - - live = 1; - ngx_signal_worker_processes(cycle, - ngx_signal_value(NGX_SHUTDOWN_SIGNAL)); - } - - if (ngx_restart) { - ngx_restart = 0; - ngx_start_worker_processes(cycle, ccf->worker_processes, - NGX_PROCESS_RESPAWN); - ngx_start_cache_manager_processes(cycle, 0); - live = 1; - } - - if (ngx_reopen) { - ngx_reopen = 0; - ngx_log_error(NGX_LOG_NOTICE, cycle->log, 0, "reopening logs"); - ngx_reopen_files(cycle, ccf->user); - ngx_signal_worker_processes(cycle, - ngx_signal_value(NGX_REOPEN_SIGNAL)); - } - - if (ngx_change_binary) { - ngx_change_binary = 0; - ngx_log_error(NGX_LOG_NOTICE, cycle->log, 0, "changing binary"); - ngx_new_binary = ngx_exec_new_binary(cycle, ngx_argv); - } - - if (ngx_noaccept) { - ngx_noaccept = 0; - ngx_noaccepting = 1; - ngx_signal_worker_processes(cycle, - ngx_signal_value(NGX_SHUTDOWN_SIGNAL)); - } - } -} - - -void -ngx_single_process_cycle(ngx_cycle_t *cycle) -{ - ngx_uint_t i; - - if (ngx_set_environment(cycle, NULL) == NULL) { - /* fatal */ - exit(2); - } - - for (i = 0; cycle->modules[i]; i++) { - if (cycle->modules[i]->init_process) { - if (cycle->modules[i]->init_process(cycle) == NGX_ERROR) { - /* fatal */ - exit(2); - } - } - } - - for ( ;; ) { - ngx_log_debug0(NGX_LOG_DEBUG_EVENT, cycle->log, 0, "worker cycle"); - - ngx_process_events_and_timers(cycle); - - if (ngx_terminate || ngx_quit) { - - for (i = 0; cycle->modules[i]; i++) { - if (cycle->modules[i]->exit_process) { - cycle->modules[i]->exit_process(cycle); - } - } - - ngx_master_process_exit(cycle); - } - - if (ngx_reconfigure) { - ngx_reconfigure = 0; - ngx_log_error(NGX_LOG_NOTICE, cycle->log, 0, "reconfiguring"); - - cycle = ngx_init_cycle(cycle); - if (cycle == NULL) { - cycle = (ngx_cycle_t *) ngx_cycle; - continue; - } - - ngx_cycle = cycle; - } - - if (ngx_reopen) { - ngx_reopen = 0; - ngx_log_error(NGX_LOG_NOTICE, cycle->log, 0, "reopening logs"); - ngx_reopen_files(cycle, (ngx_uid_t) -1); - } - } -} - - -static void -ngx_start_worker_processes(ngx_cycle_t *cycle, ngx_int_t n, ngx_int_t type) -{ - ngx_int_t i; - - ngx_log_error(NGX_LOG_NOTICE, cycle->log, 0, "start worker processes"); - - for (i = 0; i < n; i++) { - - ngx_spawn_process(cycle, ngx_worker_process_cycle, - (void *) (intptr_t) i, "worker process", type); - - ngx_pass_open_channel(cycle); - } -} - - -static void -ngx_start_cache_manager_processes(ngx_cycle_t *cycle, ngx_uint_t respawn) -{ - ngx_uint_t i, manager, loader; - ngx_path_t **path; - - manager = 0; - loader = 0; - - path = ngx_cycle->paths.elts; - for (i = 0; i < ngx_cycle->paths.nelts; i++) { - - if (path[i]->manager) { - manager = 1; - } - - if (path[i]->loader) { - loader = 1; - } - } - - if (manager == 0) { - return; - } - - ngx_spawn_process(cycle, ngx_cache_manager_process_cycle, - &ngx_cache_manager_ctx, "cache manager process", - respawn ? NGX_PROCESS_JUST_RESPAWN : NGX_PROCESS_RESPAWN); - - ngx_pass_open_channel(cycle); - - if (loader == 0) { - return; - } - - ngx_spawn_process(cycle, ngx_cache_manager_process_cycle, - &ngx_cache_loader_ctx, "cache loader process", - respawn ? NGX_PROCESS_JUST_SPAWN : NGX_PROCESS_NORESPAWN); - - ngx_pass_open_channel(cycle); -} - - -static void -ngx_pass_open_channel(ngx_cycle_t *cycle) -{ - ngx_int_t i; - ngx_channel_t ch; - - ngx_memzero(&ch, sizeof(ngx_channel_t)); - - ch.command = NGX_CMD_OPEN_CHANNEL; - ch.pid = ngx_processes[ngx_process_slot].pid; - ch.slot = ngx_process_slot; - ch.fd = ngx_processes[ngx_process_slot].channel[0]; - - for (i = 0; i < ngx_last_process; i++) { - - if (i == ngx_process_slot - || ngx_processes[i].pid == -1 - || ngx_processes[i].channel[0] == -1) - { - continue; - } - - ngx_log_debug6(NGX_LOG_DEBUG_CORE, cycle->log, 0, - "pass channel s:%i pid:%P fd:%d to s:%i pid:%P fd:%d", - ch.slot, ch.pid, ch.fd, - i, ngx_processes[i].pid, - ngx_processes[i].channel[0]); - - /* TODO: NGX_AGAIN */ - - ngx_write_channel(ngx_processes[i].channel[0], - &ch, sizeof(ngx_channel_t), cycle->log); - } -} - - -static void -ngx_signal_worker_processes(ngx_cycle_t *cycle, int signo) -{ - ngx_int_t i; - ngx_err_t err; - ngx_channel_t ch; - - ngx_memzero(&ch, sizeof(ngx_channel_t)); - -#if (NGX_BROKEN_SCM_RIGHTS) - - ch.command = 0; - -#else - - switch (signo) { - - case ngx_signal_value(NGX_SHUTDOWN_SIGNAL): - ch.command = NGX_CMD_QUIT; - break; - - case ngx_signal_value(NGX_TERMINATE_SIGNAL): - ch.command = NGX_CMD_TERMINATE; - break; - - case ngx_signal_value(NGX_REOPEN_SIGNAL): - ch.command = NGX_CMD_REOPEN; - break; - - default: - ch.command = 0; - } - -#endif - - ch.fd = -1; - - - for (i = 0; i < ngx_last_process; i++) { - - ngx_log_debug7(NGX_LOG_DEBUG_EVENT, cycle->log, 0, - "child: %i %P e:%d t:%d d:%d r:%d j:%d", - i, - ngx_processes[i].pid, - ngx_processes[i].exiting, - ngx_processes[i].exited, - ngx_processes[i].detached, - ngx_processes[i].respawn, - ngx_processes[i].just_spawn); - - if (ngx_processes[i].detached || ngx_processes[i].pid == -1) { - continue; - } - - if (ngx_processes[i].just_spawn) { - ngx_processes[i].just_spawn = 0; - continue; - } - - if (ngx_processes[i].exiting - && signo == ngx_signal_value(NGX_SHUTDOWN_SIGNAL)) - { - continue; - } - - if (ch.command) { - if (ngx_write_channel(ngx_processes[i].channel[0], - &ch, sizeof(ngx_channel_t), cycle->log) - == NGX_OK) - { - if (signo != ngx_signal_value(NGX_REOPEN_SIGNAL)) { - ngx_processes[i].exiting = 1; - } - - continue; - } - } - - ngx_log_debug2(NGX_LOG_DEBUG_CORE, cycle->log, 0, - "kill (%P, %d)", ngx_processes[i].pid, signo); - - if (kill(ngx_processes[i].pid, signo) == -1) { - err = ngx_errno; - ngx_log_error(NGX_LOG_ALERT, cycle->log, err, - "kill(%P, %d) failed", ngx_processes[i].pid, signo); - - if (err == NGX_ESRCH) { - ngx_processes[i].exited = 1; - ngx_processes[i].exiting = 0; - ngx_reap = 1; - } - - continue; - } - - if (signo != ngx_signal_value(NGX_REOPEN_SIGNAL)) { - ngx_processes[i].exiting = 1; - } - } -} - - -static ngx_uint_t -ngx_reap_children(ngx_cycle_t *cycle) -{ - ngx_int_t i, n; - ngx_uint_t live; - ngx_channel_t ch; - ngx_core_conf_t *ccf; - - ngx_memzero(&ch, sizeof(ngx_channel_t)); - - ch.command = NGX_CMD_CLOSE_CHANNEL; - ch.fd = -1; - - live = 0; - for (i = 0; i < ngx_last_process; i++) { - - ngx_log_debug7(NGX_LOG_DEBUG_EVENT, cycle->log, 0, - "child: %i %P e:%d t:%d d:%d r:%d j:%d", - i, - ngx_processes[i].pid, - ngx_processes[i].exiting, - ngx_processes[i].exited, - ngx_processes[i].detached, - ngx_processes[i].respawn, - ngx_processes[i].just_spawn); - - if (ngx_processes[i].pid == -1) { - continue; - } - - if (ngx_processes[i].exited) { - - if (!ngx_processes[i].detached) { - ngx_close_channel(ngx_processes[i].channel, cycle->log); - - ngx_processes[i].channel[0] = -1; - ngx_processes[i].channel[1] = -1; - - ch.pid = ngx_processes[i].pid; - ch.slot = i; - - for (n = 0; n < ngx_last_process; n++) { - if (ngx_processes[n].exited - || ngx_processes[n].pid == -1 - || ngx_processes[n].channel[0] == -1) - { - continue; - } - - ngx_log_debug3(NGX_LOG_DEBUG_CORE, cycle->log, 0, - "pass close channel s:%i pid:%P to:%P", - ch.slot, ch.pid, ngx_processes[n].pid); - - /* TODO: NGX_AGAIN */ - - ngx_write_channel(ngx_processes[n].channel[0], - &ch, sizeof(ngx_channel_t), cycle->log); - } - } - - if (ngx_processes[i].respawn - && !ngx_processes[i].exiting - && !ngx_terminate - && !ngx_quit) - { - if (ngx_spawn_process(cycle, ngx_processes[i].proc, - ngx_processes[i].data, - ngx_processes[i].name, i) - == NGX_INVALID_PID) - { - ngx_log_error(NGX_LOG_ALERT, cycle->log, 0, - "could not respawn %s", - ngx_processes[i].name); - continue; - } - - - ngx_pass_open_channel(cycle); - - live = 1; - - continue; - } - - if (ngx_processes[i].pid == ngx_new_binary) { - - ccf = (ngx_core_conf_t *) ngx_get_conf(cycle->conf_ctx, - ngx_core_module); - - if (ngx_rename_file((char *) ccf->oldpid.data, - (char *) ccf->pid.data) - == NGX_FILE_ERROR) - { - ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno, - ngx_rename_file_n " %s back to %s failed " - "after the new binary process \"%s\" exited", - ccf->oldpid.data, ccf->pid.data, ngx_argv[0]); - } - - ngx_new_binary = 0; - if (ngx_noaccepting) { - ngx_restart = 1; - ngx_noaccepting = 0; - } - } - - if (i == ngx_last_process - 1) { - ngx_last_process--; - - } else { - ngx_processes[i].pid = -1; - } - - } else if (ngx_processes[i].exiting || !ngx_processes[i].detached) { - live = 1; - } - } - - return live; -} - - -static void -ngx_master_process_exit(ngx_cycle_t *cycle) -{ - ngx_uint_t i; - - ngx_delete_pidfile(cycle); - - ngx_log_error(NGX_LOG_NOTICE, cycle->log, 0, "exit"); - - for (i = 0; cycle->modules[i]; i++) { - if (cycle->modules[i]->exit_master) { - cycle->modules[i]->exit_master(cycle); - } - } - - ngx_close_listening_sockets(cycle); - - /* - * Copy ngx_cycle->log related data to the special static exit cycle, - * log, and log file structures enough to allow a signal handler to log. - * The handler may be called when standard ngx_cycle->log allocated from - * ngx_cycle->pool is already destroyed. - */ - - - ngx_exit_log = *ngx_log_get_file_log(ngx_cycle->log); - - ngx_exit_log_file.fd = ngx_exit_log.file->fd; - ngx_exit_log.file = &ngx_exit_log_file; - ngx_exit_log.next = NULL; - ngx_exit_log.writer = NULL; - - ngx_exit_cycle.log = &ngx_exit_log; - ngx_exit_cycle.files = ngx_cycle->files; - ngx_exit_cycle.files_n = ngx_cycle->files_n; - ngx_cycle = &ngx_exit_cycle; - - ngx_destroy_pool(cycle->pool); - - exit(0); -} - - -static void -ngx_worker_process_cycle(ngx_cycle_t *cycle, void *data) -{ - ngx_int_t worker = (intptr_t) data; - - ngx_process = NGX_PROCESS_WORKER; - ngx_worker = worker; - - ngx_worker_process_init(cycle, worker); - - ngx_setproctitle("worker process"); - - for ( ;; ) { - - if (ngx_exiting) { - if (ngx_event_no_timers_left() == NGX_OK) { - ngx_log_error(NGX_LOG_NOTICE, cycle->log, 0, "exiting"); - ngx_worker_process_exit(cycle); - } - } - - ngx_log_debug0(NGX_LOG_DEBUG_EVENT, cycle->log, 0, "worker cycle"); - - ngx_process_events_and_timers(cycle); - - if (ngx_terminate) { - ngx_log_error(NGX_LOG_NOTICE, cycle->log, 0, "exiting"); - ngx_worker_process_exit(cycle); - } - - if (ngx_quit) { - ngx_quit = 0; - ngx_log_error(NGX_LOG_NOTICE, cycle->log, 0, - "gracefully shutting down"); - ngx_setproctitle("worker process is shutting down"); - - if (!ngx_exiting) { - ngx_exiting = 1; - ngx_set_shutdown_timer(cycle); - ngx_close_listening_sockets(cycle); - ngx_close_idle_connections(cycle); - ngx_event_process_posted(cycle, &ngx_posted_events); - } - } - - if (ngx_reopen) { - ngx_reopen = 0; - ngx_log_error(NGX_LOG_NOTICE, cycle->log, 0, "reopening logs"); - ngx_reopen_files(cycle, -1); - } - } -} - - -static void -ngx_worker_process_init(ngx_cycle_t *cycle, ngx_int_t worker) -{ - sigset_t set; - ngx_int_t n; - ngx_time_t *tp; - ngx_uint_t i; - ngx_cpuset_t *cpu_affinity; - struct rlimit rlmt; - ngx_core_conf_t *ccf; - - if (ngx_set_environment(cycle, NULL) == NULL) { - /* fatal */ - exit(2); - } - - ccf = (ngx_core_conf_t *) ngx_get_conf(cycle->conf_ctx, ngx_core_module); - - if (worker >= 0 && ccf->priority != 0) { - if (setpriority(PRIO_PROCESS, 0, ccf->priority) == -1) { - ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno, - "setpriority(%d) failed", ccf->priority); - } - } - - if (ccf->rlimit_nofile != NGX_CONF_UNSET) { - rlmt.rlim_cur = (rlim_t) ccf->rlimit_nofile; - rlmt.rlim_max = (rlim_t) ccf->rlimit_nofile; - - if (setrlimit(RLIMIT_NOFILE, &rlmt) == -1) { - ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno, - "setrlimit(RLIMIT_NOFILE, %i) failed", - ccf->rlimit_nofile); - } - } - - if (ccf->rlimit_core != NGX_CONF_UNSET) { - rlmt.rlim_cur = (rlim_t) ccf->rlimit_core; - rlmt.rlim_max = (rlim_t) ccf->rlimit_core; - - if (setrlimit(RLIMIT_CORE, &rlmt) == -1) { - ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno, - "setrlimit(RLIMIT_CORE, %O) failed", - ccf->rlimit_core); - } - } - - if (geteuid() == 0) { - if (setgid(ccf->group) == -1) { - ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno, - "setgid(%d) failed", ccf->group); - /* fatal */ - exit(2); - } - - if (initgroups(ccf->username, ccf->group) == -1) { - ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno, - "initgroups(%s, %d) failed", - ccf->username, ccf->group); - } - -#if (NGX_HAVE_PR_SET_KEEPCAPS && NGX_HAVE_CAPABILITIES) - if (ccf->transparent && ccf->user) { - if (prctl(PR_SET_KEEPCAPS, 1, 0, 0, 0) == -1) { - ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno, - "prctl(PR_SET_KEEPCAPS, 1) failed"); - /* fatal */ - exit(2); - } - } -#endif - - if (setuid(ccf->user) == -1) { - ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno, - "setuid(%d) failed", ccf->user); - /* fatal */ - exit(2); - } - -#if (NGX_HAVE_CAPABILITIES) - if (ccf->transparent && ccf->user) { - struct __user_cap_data_struct data; - struct __user_cap_header_struct header; - - ngx_memzero(&header, sizeof(struct __user_cap_header_struct)); - ngx_memzero(&data, sizeof(struct __user_cap_data_struct)); - - header.version = _LINUX_CAPABILITY_VERSION_1; - data.effective = CAP_TO_MASK(CAP_NET_RAW); - data.permitted = data.effective; - - if (syscall(SYS_capset, &header, &data) == -1) { - ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno, - "capset() failed"); - /* fatal */ - exit(2); - } - } -#endif - } - - if (worker >= 0) { - cpu_affinity = ngx_get_cpu_affinity(worker); - - if (cpu_affinity) { - ngx_setaffinity(cpu_affinity, cycle->log); - } - } - -#if (NGX_HAVE_PR_SET_DUMPABLE) - - /* allow coredump after setuid() in Linux 2.4.x */ - - if (prctl(PR_SET_DUMPABLE, 1, 0, 0, 0) == -1) { - ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno, - "prctl(PR_SET_DUMPABLE) failed"); - } - -#endif - - if (ccf->working_directory.len) { - if (chdir((char *) ccf->working_directory.data) == -1) { - ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno, - "chdir(\"%s\") failed", ccf->working_directory.data); - /* fatal */ - exit(2); - } - } - - sigemptyset(&set); - - if (sigprocmask(SIG_SETMASK, &set, NULL) == -1) { - ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno, - "sigprocmask() failed"); - } - - tp = ngx_timeofday(); - srandom(((unsigned) ngx_pid << 16) ^ tp->sec ^ tp->msec); - - for (i = 0; cycle->modules[i]; i++) { - if (cycle->modules[i]->init_process) { - if (cycle->modules[i]->init_process(cycle) == NGX_ERROR) { - /* fatal */ - exit(2); - } - } - } - - for (n = 0; n < ngx_last_process; n++) { - - if (ngx_processes[n].pid == -1) { - continue; - } - - if (n == ngx_process_slot) { - continue; - } - - if (ngx_processes[n].channel[1] == -1) { - continue; - } - - if (close(ngx_processes[n].channel[1]) == -1) { - ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno, - "close() channel failed"); - } - } - - if (close(ngx_processes[ngx_process_slot].channel[0]) == -1) { - ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno, - "close() channel failed"); - } - -#if 0 - ngx_last_process = 0; -#endif - - if (ngx_add_channel_event(cycle, ngx_channel, NGX_READ_EVENT, - ngx_channel_handler) - == NGX_ERROR) - { - /* fatal */ - exit(2); - } -} - - -static void -ngx_worker_process_exit(ngx_cycle_t *cycle) -{ - ngx_uint_t i; - ngx_connection_t *c; - - for (i = 0; cycle->modules[i]; i++) { - if (cycle->modules[i]->exit_process) { - cycle->modules[i]->exit_process(cycle); - } - } - - if (ngx_exiting && !ngx_terminate) { - c = cycle->connections; - for (i = 0; i < cycle->connection_n; i++) { - if (c[i].fd != -1 - && c[i].read - && !c[i].read->accept - && !c[i].read->channel - && !c[i].read->resolver) - { - ngx_log_error(NGX_LOG_ALERT, cycle->log, 0, - "*%uA open socket #%d left in connection %ui", - c[i].number, c[i].fd, i); - ngx_debug_quit = 1; - } - } - } - - if (ngx_debug_quit) { - ngx_log_error(NGX_LOG_ALERT, cycle->log, 0, "aborting"); - ngx_debug_point(); - } - - /* - * Copy ngx_cycle->log related data to the special static exit cycle, - * log, and log file structures enough to allow a signal handler to log. - * The handler may be called when standard ngx_cycle->log allocated from - * ngx_cycle->pool is already destroyed. - */ - - ngx_exit_log = *ngx_log_get_file_log(ngx_cycle->log); - - ngx_exit_log_file.fd = ngx_exit_log.file->fd; - ngx_exit_log.file = &ngx_exit_log_file; - ngx_exit_log.next = NULL; - ngx_exit_log.writer = NULL; - - ngx_exit_cycle.log = &ngx_exit_log; - ngx_exit_cycle.files = ngx_cycle->files; - ngx_exit_cycle.files_n = ngx_cycle->files_n; - ngx_cycle = &ngx_exit_cycle; - - ngx_destroy_pool(cycle->pool); - - ngx_log_error(NGX_LOG_NOTICE, ngx_cycle->log, 0, "exit"); - - exit(0); -} - - -static void -ngx_channel_handler(ngx_event_t *ev) -{ - ngx_int_t n; - ngx_channel_t ch; - ngx_connection_t *c; - - if (ev->timedout) { - ev->timedout = 0; - return; - } - - c = ev->data; - - ngx_log_debug0(NGX_LOG_DEBUG_CORE, ev->log, 0, "channel handler"); - - for ( ;; ) { - - n = ngx_read_channel(c->fd, &ch, sizeof(ngx_channel_t), ev->log); - - ngx_log_debug1(NGX_LOG_DEBUG_CORE, ev->log, 0, "channel: %i", n); - - if (n == NGX_ERROR) { - - if (ngx_event_flags & NGX_USE_EPOLL_EVENT) { - ngx_del_conn(c, 0); - } - - ngx_close_connection(c); - return; - } - - if (ngx_event_flags & NGX_USE_EVENTPORT_EVENT) { - if (ngx_add_event(ev, NGX_READ_EVENT, 0) == NGX_ERROR) { - return; - } - } - - if (n == NGX_AGAIN) { - return; - } - - ngx_log_debug1(NGX_LOG_DEBUG_CORE, ev->log, 0, - "channel command: %ui", ch.command); - - switch (ch.command) { - - case NGX_CMD_QUIT: - ngx_quit = 1; - break; - - case NGX_CMD_TERMINATE: - ngx_terminate = 1; - break; - - case NGX_CMD_REOPEN: - ngx_reopen = 1; - break; - - case NGX_CMD_OPEN_CHANNEL: - - ngx_log_debug3(NGX_LOG_DEBUG_CORE, ev->log, 0, - "get channel s:%i pid:%P fd:%d", - ch.slot, ch.pid, ch.fd); - - ngx_processes[ch.slot].pid = ch.pid; - ngx_processes[ch.slot].channel[0] = ch.fd; - break; - - case NGX_CMD_CLOSE_CHANNEL: - - ngx_log_debug4(NGX_LOG_DEBUG_CORE, ev->log, 0, - "close channel s:%i pid:%P our:%P fd:%d", - ch.slot, ch.pid, ngx_processes[ch.slot].pid, - ngx_processes[ch.slot].channel[0]); - - if (close(ngx_processes[ch.slot].channel[0]) == -1) { - ngx_log_error(NGX_LOG_ALERT, ev->log, ngx_errno, - "close() channel failed"); - } - - ngx_processes[ch.slot].channel[0] = -1; - break; - } - } -} - - -static void -ngx_cache_manager_process_cycle(ngx_cycle_t *cycle, void *data) -{ - ngx_cache_manager_ctx_t *ctx = data; - - void *ident[4]; - ngx_event_t ev; - - /* - * Set correct process type since closing listening Unix domain socket - * in a master process also removes the Unix domain socket file. - */ - ngx_process = NGX_PROCESS_HELPER; - - ngx_close_listening_sockets(cycle); - - /* Set a moderate number of connections for a helper process. */ - cycle->connection_n = 512; - - ngx_worker_process_init(cycle, -1); - - ngx_memzero(&ev, sizeof(ngx_event_t)); - ev.handler = ctx->handler; - ev.data = ident; - ev.log = cycle->log; - ident[3] = (void *) -1; - - ngx_use_accept_mutex = 0; - - ngx_setproctitle(ctx->name); - - ngx_add_timer(&ev, ctx->delay); - - for ( ;; ) { - - if (ngx_terminate || ngx_quit) { - ngx_log_error(NGX_LOG_NOTICE, cycle->log, 0, "exiting"); - exit(0); - } - - if (ngx_reopen) { - ngx_reopen = 0; - ngx_log_error(NGX_LOG_NOTICE, cycle->log, 0, "reopening logs"); - ngx_reopen_files(cycle, -1); - } - - ngx_process_events_and_timers(cycle); - } -} - - -static void -ngx_cache_manager_process_handler(ngx_event_t *ev) -{ - ngx_uint_t i; - ngx_msec_t next, n; - ngx_path_t **path; - - next = 60 * 60 * 1000; - - path = ngx_cycle->paths.elts; - for (i = 0; i < ngx_cycle->paths.nelts; i++) { - - if (path[i]->manager) { - n = path[i]->manager(path[i]->data); - - next = (n <= next) ? n : next; - - ngx_time_update(); - } - } - - if (next == 0) { - next = 1; - } - - ngx_add_timer(ev, next); -} - - -static void -ngx_cache_loader_process_handler(ngx_event_t *ev) -{ - ngx_uint_t i; - ngx_path_t **path; - ngx_cycle_t *cycle; - - cycle = (ngx_cycle_t *) ngx_cycle; - - path = cycle->paths.elts; - for (i = 0; i < cycle->paths.nelts; i++) { - - if (ngx_terminate || ngx_quit) { - break; - } - - if (path[i]->loader) { - path[i]->loader(path[i]->data); - ngx_time_update(); - } - } - - exit(0); -} diff --git a/src/deps/src/nginx-1.30.3/src/os/unix/ngx_process_cycle.h b/src/deps/src/nginx-1.30.3/src/os/unix/ngx_process_cycle.h deleted file mode 100644 index 69495d5f45..0000000000 --- a/src/deps/src/nginx-1.30.3/src/os/unix/ngx_process_cycle.h +++ /dev/null @@ -1,61 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#ifndef _NGX_PROCESS_CYCLE_H_INCLUDED_ -#define _NGX_PROCESS_CYCLE_H_INCLUDED_ - - -#include -#include - - -#define NGX_CMD_OPEN_CHANNEL 1 -#define NGX_CMD_CLOSE_CHANNEL 2 -#define NGX_CMD_QUIT 3 -#define NGX_CMD_TERMINATE 4 -#define NGX_CMD_REOPEN 5 - - -#define NGX_PROCESS_SINGLE 0 -#define NGX_PROCESS_MASTER 1 -#define NGX_PROCESS_SIGNALLER 2 -#define NGX_PROCESS_WORKER 3 -#define NGX_PROCESS_HELPER 4 - - -typedef struct { - ngx_event_handler_pt handler; - char *name; - ngx_msec_t delay; -} ngx_cache_manager_ctx_t; - - -void ngx_master_process_cycle(ngx_cycle_t *cycle); -void ngx_single_process_cycle(ngx_cycle_t *cycle); - - -extern ngx_uint_t ngx_process; -extern ngx_uint_t ngx_worker; -extern ngx_pid_t ngx_pid; -extern ngx_pid_t ngx_new_binary; -extern ngx_uint_t ngx_inherited; -extern ngx_uint_t ngx_daemonized; -extern ngx_uint_t ngx_exiting; - -extern sig_atomic_t ngx_reap; -extern sig_atomic_t ngx_sigio; -extern sig_atomic_t ngx_sigalrm; -extern sig_atomic_t ngx_quit; -extern sig_atomic_t ngx_debug_quit; -extern sig_atomic_t ngx_terminate; -extern sig_atomic_t ngx_noaccept; -extern sig_atomic_t ngx_reconfigure; -extern sig_atomic_t ngx_reopen; -extern sig_atomic_t ngx_change_binary; - - -#endif /* _NGX_PROCESS_CYCLE_H_INCLUDED_ */ diff --git a/src/deps/src/nginx-1.30.3/src/os/unix/ngx_readv_chain.c b/src/deps/src/nginx-1.30.3/src/os/unix/ngx_readv_chain.c deleted file mode 100644 index 48fa0a73d7..0000000000 --- a/src/deps/src/nginx-1.30.3/src/os/unix/ngx_readv_chain.c +++ /dev/null @@ -1,252 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#include -#include -#include - - -ssize_t -ngx_readv_chain(ngx_connection_t *c, ngx_chain_t *chain, off_t limit) -{ - u_char *prev; - ssize_t n, size; - ngx_err_t err; - ngx_array_t vec; - ngx_event_t *rev; - struct iovec *iov, iovs[NGX_IOVS_PREALLOCATE]; - - rev = c->read; - -#if (NGX_HAVE_KQUEUE) - - if (ngx_event_flags & NGX_USE_KQUEUE_EVENT) { - ngx_log_debug3(NGX_LOG_DEBUG_EVENT, c->log, 0, - "readv: eof:%d, avail:%d, err:%d", - rev->pending_eof, rev->available, rev->kq_errno); - - if (rev->available == 0) { - if (rev->pending_eof) { - rev->ready = 0; - rev->eof = 1; - - ngx_log_error(NGX_LOG_INFO, c->log, rev->kq_errno, - "kevent() reported about an closed connection"); - - if (rev->kq_errno) { - rev->error = 1; - ngx_set_socket_errno(rev->kq_errno); - return NGX_ERROR; - } - - return 0; - - } else { - rev->ready = 0; - return NGX_AGAIN; - } - } - } - -#endif - -#if (NGX_HAVE_EPOLLRDHUP) - - if ((ngx_event_flags & NGX_USE_EPOLL_EVENT) - && ngx_use_epoll_rdhup) - { - ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0, - "readv: eof:%d, avail:%d", - rev->pending_eof, rev->available); - - if (rev->available == 0 && !rev->pending_eof) { - rev->ready = 0; - return NGX_AGAIN; - } - } - -#endif - - prev = NULL; - iov = NULL; - size = 0; - - vec.elts = iovs; - vec.nelts = 0; - vec.size = sizeof(struct iovec); - vec.nalloc = NGX_IOVS_PREALLOCATE; - vec.pool = c->pool; - - /* coalesce the neighbouring bufs */ - - while (chain) { - n = chain->buf->end - chain->buf->last; - - if (limit) { - if (size >= limit) { - break; - } - - if (size + n > limit) { - n = (ssize_t) (limit - size); - } - } - - if (prev == chain->buf->last) { - iov->iov_len += n; - - } else { - if (vec.nelts == vec.nalloc) { - break; - } - - iov = ngx_array_push(&vec); - if (iov == NULL) { - return NGX_ERROR; - } - - iov->iov_base = (void *) chain->buf->last; - iov->iov_len = n; - } - - size += n; - prev = chain->buf->end; - chain = chain->next; - } - - ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0, - "readv: %ui, last:%uz", vec.nelts, iov->iov_len); - - do { - n = readv(c->fd, (struct iovec *) vec.elts, vec.nelts); - - if (n == 0) { - rev->ready = 0; - rev->eof = 1; - -#if (NGX_HAVE_KQUEUE) - - /* - * on FreeBSD readv() may return 0 on closed socket - * even if kqueue reported about available data - */ - - if (ngx_event_flags & NGX_USE_KQUEUE_EVENT) { - rev->available = 0; - } - -#endif - - return 0; - } - - if (n > 0) { - -#if (NGX_HAVE_KQUEUE) - - if (ngx_event_flags & NGX_USE_KQUEUE_EVENT) { - rev->available -= n; - - /* - * rev->available may be negative here because some additional - * bytes may be received between kevent() and readv() - */ - - if (rev->available <= 0) { - if (!rev->pending_eof) { - rev->ready = 0; - } - - rev->available = 0; - } - - return n; - } - -#endif - -#if (NGX_HAVE_FIONREAD) - - if (rev->available >= 0) { - rev->available -= n; - - /* - * negative rev->available means some additional bytes - * were received between kernel notification and readv(), - * and therefore ev->ready can be safely reset even for - * edge-triggered event methods - */ - - if (rev->available < 0) { - rev->available = 0; - rev->ready = 0; - } - - ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, - "readv: avail:%d", rev->available); - - } else if (n == size) { - - if (ngx_socket_nread(c->fd, &rev->available) == -1) { - n = ngx_connection_error(c, ngx_socket_errno, - ngx_socket_nread_n " failed"); - break; - } - - ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, - "readv: avail:%d", rev->available); - } - -#endif - -#if (NGX_HAVE_EPOLLRDHUP) - - if ((ngx_event_flags & NGX_USE_EPOLL_EVENT) - && ngx_use_epoll_rdhup) - { - if (n < size) { - if (!rev->pending_eof) { - rev->ready = 0; - } - - rev->available = 0; - } - - return n; - } - -#endif - - if (n < size && !(ngx_event_flags & NGX_USE_GREEDY_EVENT)) { - rev->ready = 0; - } - - return n; - } - - err = ngx_socket_errno; - - if (err == NGX_EAGAIN || err == NGX_EINTR) { - ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, err, - "readv() not ready"); - n = NGX_AGAIN; - - } else { - n = ngx_connection_error(c, err, "readv() failed"); - break; - } - - } while (err == NGX_EINTR); - - rev->ready = 0; - - if (n == NGX_ERROR) { - c->read->error = 1; - } - - return n; -} diff --git a/src/deps/src/nginx-1.30.3/src/os/unix/ngx_recv.c b/src/deps/src/nginx-1.30.3/src/os/unix/ngx_recv.c deleted file mode 100644 index cc04a5fbb1..0000000000 --- a/src/deps/src/nginx-1.30.3/src/os/unix/ngx_recv.c +++ /dev/null @@ -1,203 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#include -#include -#include - - -ssize_t -ngx_unix_recv(ngx_connection_t *c, u_char *buf, size_t size) -{ - ssize_t n; - ngx_err_t err; - ngx_event_t *rev; - - rev = c->read; - -#if (NGX_HAVE_KQUEUE) - - if (ngx_event_flags & NGX_USE_KQUEUE_EVENT) { - ngx_log_debug3(NGX_LOG_DEBUG_EVENT, c->log, 0, - "recv: eof:%d, avail:%d, err:%d", - rev->pending_eof, rev->available, rev->kq_errno); - - if (rev->available == 0) { - if (rev->pending_eof) { - rev->ready = 0; - rev->eof = 1; - - if (rev->kq_errno) { - rev->error = 1; - ngx_set_socket_errno(rev->kq_errno); - - return ngx_connection_error(c, rev->kq_errno, - "kevent() reported about an closed connection"); - } - - return 0; - - } else { - rev->ready = 0; - return NGX_AGAIN; - } - } - } - -#endif - -#if (NGX_HAVE_EPOLLRDHUP) - - if ((ngx_event_flags & NGX_USE_EPOLL_EVENT) - && ngx_use_epoll_rdhup) - { - ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0, - "recv: eof:%d, avail:%d", - rev->pending_eof, rev->available); - - if (rev->available == 0 && !rev->pending_eof) { - rev->ready = 0; - return NGX_AGAIN; - } - } - -#endif - - do { - n = recv(c->fd, buf, size, 0); - - ngx_log_debug3(NGX_LOG_DEBUG_EVENT, c->log, 0, - "recv: fd:%d %z of %uz", c->fd, n, size); - - if (n == 0) { - rev->ready = 0; - rev->eof = 1; - -#if (NGX_HAVE_KQUEUE) - - /* - * on FreeBSD recv() may return 0 on closed socket - * even if kqueue reported about available data - */ - - if (ngx_event_flags & NGX_USE_KQUEUE_EVENT) { - rev->available = 0; - } - -#endif - - return 0; - } - - if (n > 0) { - -#if (NGX_HAVE_KQUEUE) - - if (ngx_event_flags & NGX_USE_KQUEUE_EVENT) { - rev->available -= n; - - /* - * rev->available may be negative here because some additional - * bytes may be received between kevent() and recv() - */ - - if (rev->available <= 0) { - if (!rev->pending_eof) { - rev->ready = 0; - } - - rev->available = 0; - } - - return n; - } - -#endif - -#if (NGX_HAVE_FIONREAD) - - if (rev->available >= 0) { - rev->available -= n; - - /* - * negative rev->available means some additional bytes - * were received between kernel notification and recv(), - * and therefore ev->ready can be safely reset even for - * edge-triggered event methods - */ - - if (rev->available < 0) { - rev->available = 0; - rev->ready = 0; - } - - ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, - "recv: avail:%d", rev->available); - - } else if ((size_t) n == size) { - - if (ngx_socket_nread(c->fd, &rev->available) == -1) { - n = ngx_connection_error(c, ngx_socket_errno, - ngx_socket_nread_n " failed"); - break; - } - - ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, - "recv: avail:%d", rev->available); - } - -#endif - -#if (NGX_HAVE_EPOLLRDHUP) - - if ((ngx_event_flags & NGX_USE_EPOLL_EVENT) - && ngx_use_epoll_rdhup) - { - if ((size_t) n < size) { - if (!rev->pending_eof) { - rev->ready = 0; - } - - rev->available = 0; - } - - return n; - } - -#endif - - if ((size_t) n < size - && !(ngx_event_flags & NGX_USE_GREEDY_EVENT)) - { - rev->ready = 0; - } - - return n; - } - - err = ngx_socket_errno; - - if (err == NGX_EAGAIN || err == NGX_EINTR) { - ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, err, - "recv() not ready"); - n = NGX_AGAIN; - - } else { - n = ngx_connection_error(c, err, "recv() failed"); - break; - } - - } while (err == NGX_EINTR); - - rev->ready = 0; - - if (n == NGX_ERROR) { - rev->error = 1; - } - - return n; -} diff --git a/src/deps/src/nginx-1.30.3/src/os/unix/ngx_send.c b/src/deps/src/nginx-1.30.3/src/os/unix/ngx_send.c deleted file mode 100644 index 61ea202525..0000000000 --- a/src/deps/src/nginx-1.30.3/src/os/unix/ngx_send.c +++ /dev/null @@ -1,73 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#include -#include -#include - - -ssize_t -ngx_unix_send(ngx_connection_t *c, u_char *buf, size_t size) -{ - ssize_t n; - ngx_err_t err; - ngx_event_t *wev; - - wev = c->write; - -#if (NGX_HAVE_KQUEUE) - - if ((ngx_event_flags & NGX_USE_KQUEUE_EVENT) && wev->pending_eof) { - (void) ngx_connection_error(c, wev->kq_errno, - "kevent() reported about an closed connection"); - wev->error = 1; - return NGX_ERROR; - } - -#endif - - for ( ;; ) { - n = send(c->fd, buf, size, 0); - - ngx_log_debug3(NGX_LOG_DEBUG_EVENT, c->log, 0, - "send: fd:%d %z of %uz", c->fd, n, size); - - if (n > 0) { - if (n < (ssize_t) size) { - wev->ready = 0; - } - - c->sent += n; - - return n; - } - - err = ngx_socket_errno; - - if (n == 0) { - ngx_log_error(NGX_LOG_ALERT, c->log, err, "send() returned zero"); - wev->ready = 0; - return n; - } - - if (err == NGX_EAGAIN || err == NGX_EINTR) { - wev->ready = 0; - - ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, err, - "send() not ready"); - - if (err == NGX_EAGAIN) { - return NGX_AGAIN; - } - - } else { - wev->error = 1; - (void) ngx_connection_error(c, err, "send() failed"); - return NGX_ERROR; - } - } -} diff --git a/src/deps/src/nginx-1.30.3/src/os/unix/ngx_setaffinity.c b/src/deps/src/nginx-1.30.3/src/os/unix/ngx_setaffinity.c deleted file mode 100644 index 34ec390b70..0000000000 --- a/src/deps/src/nginx-1.30.3/src/os/unix/ngx_setaffinity.c +++ /dev/null @@ -1,53 +0,0 @@ - -/* - * Copyright (C) Nginx, Inc. - */ - - -#include -#include - - -#if (NGX_HAVE_CPUSET_SETAFFINITY) - -void -ngx_setaffinity(ngx_cpuset_t *cpu_affinity, ngx_log_t *log) -{ - ngx_uint_t i; - - for (i = 0; i < CPU_SETSIZE; i++) { - if (CPU_ISSET(i, cpu_affinity)) { - ngx_log_error(NGX_LOG_NOTICE, log, 0, - "cpuset_setaffinity(): using cpu #%ui", i); - } - } - - if (cpuset_setaffinity(CPU_LEVEL_WHICH, CPU_WHICH_PID, -1, - sizeof(cpuset_t), cpu_affinity) == -1) - { - ngx_log_error(NGX_LOG_ALERT, log, ngx_errno, - "cpuset_setaffinity() failed"); - } -} - -#elif (NGX_HAVE_SCHED_SETAFFINITY) - -void -ngx_setaffinity(ngx_cpuset_t *cpu_affinity, ngx_log_t *log) -{ - ngx_uint_t i; - - for (i = 0; i < CPU_SETSIZE; i++) { - if (CPU_ISSET(i, cpu_affinity)) { - ngx_log_error(NGX_LOG_NOTICE, log, 0, - "sched_setaffinity(): using cpu #%ui", i); - } - } - - if (sched_setaffinity(0, sizeof(cpu_set_t), cpu_affinity) == -1) { - ngx_log_error(NGX_LOG_ALERT, log, ngx_errno, - "sched_setaffinity() failed"); - } -} - -#endif diff --git a/src/deps/src/nginx-1.30.3/src/os/unix/ngx_setaffinity.h b/src/deps/src/nginx-1.30.3/src/os/unix/ngx_setaffinity.h deleted file mode 100644 index a4139edc8b..0000000000 --- a/src/deps/src/nginx-1.30.3/src/os/unix/ngx_setaffinity.h +++ /dev/null @@ -1,37 +0,0 @@ - -/* - * Copyright (C) Nginx, Inc. - */ - -#ifndef _NGX_SETAFFINITY_H_INCLUDED_ -#define _NGX_SETAFFINITY_H_INCLUDED_ - - -#if (NGX_HAVE_SCHED_SETAFFINITY || NGX_HAVE_CPUSET_SETAFFINITY) - -#define NGX_HAVE_CPU_AFFINITY 1 - -#if (NGX_HAVE_SCHED_SETAFFINITY) - -typedef cpu_set_t ngx_cpuset_t; - -#elif (NGX_HAVE_CPUSET_SETAFFINITY) - -#include - -typedef cpuset_t ngx_cpuset_t; - -#endif - -void ngx_setaffinity(ngx_cpuset_t *cpu_affinity, ngx_log_t *log); - -#else - -#define ngx_setaffinity(cpu_affinity, log) - -typedef uint64_t ngx_cpuset_t; - -#endif - - -#endif /* _NGX_SETAFFINITY_H_INCLUDED_ */ diff --git a/src/deps/src/nginx-1.30.3/src/os/unix/ngx_setproctitle.c b/src/deps/src/nginx-1.30.3/src/os/unix/ngx_setproctitle.c deleted file mode 100644 index 91afa51914..0000000000 --- a/src/deps/src/nginx-1.30.3/src/os/unix/ngx_setproctitle.c +++ /dev/null @@ -1,135 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#include -#include - - -#if (NGX_SETPROCTITLE_USES_ENV) - -/* - * To change the process title in Linux and Solaris we have to set argv[1] - * to NULL and to copy the title to the same place where the argv[0] points to. - * However, argv[0] may be too small to hold a new title. Fortunately, Linux - * and Solaris store argv[] and environ[] one after another. So we should - * ensure that is the continuous memory and then we allocate the new memory - * for environ[] and copy it. After this we could use the memory starting - * from argv[0] for our process title. - * - * The Solaris's standard /bin/ps does not show the changed process title. - * You have to use "/usr/ucb/ps -w" instead. Besides, the UCB ps does not - * show a new title if its length less than the origin command line length. - * To avoid it we append to a new title the origin command line in the - * parenthesis. - */ - -extern char **environ; - -static char *ngx_os_argv_last; - -ngx_int_t -ngx_init_setproctitle(ngx_log_t *log) -{ - u_char *p; - size_t size; - ngx_uint_t i; - - size = 0; - - for (i = 0; environ[i]; i++) { - size += ngx_strlen(environ[i]) + 1; - } - - p = ngx_alloc(size, log); - if (p == NULL) { - return NGX_ERROR; - } - - ngx_os_argv_last = ngx_os_argv[0]; - - for (i = 0; ngx_os_argv[i]; i++) { - if (ngx_os_argv_last == ngx_os_argv[i]) { - ngx_os_argv_last = ngx_os_argv[i] + ngx_strlen(ngx_os_argv[i]) + 1; - } - } - - for (i = 0; environ[i]; i++) { - if (ngx_os_argv_last == environ[i]) { - - size = ngx_strlen(environ[i]) + 1; - ngx_os_argv_last = environ[i] + size; - - ngx_cpystrn(p, (u_char *) environ[i], size); - environ[i] = (char *) p; - p += size; - } - } - - ngx_os_argv_last--; - - return NGX_OK; -} - - -void -ngx_setproctitle(char *title) -{ - u_char *p; - -#if (NGX_SOLARIS) - - ngx_int_t i; - size_t size; - -#endif - - ngx_os_argv[1] = NULL; - - p = ngx_cpystrn((u_char *) ngx_os_argv[0], (u_char *) "nginx: ", - ngx_os_argv_last - ngx_os_argv[0]); - - p = ngx_cpystrn(p, (u_char *) title, ngx_os_argv_last - (char *) p); - -#if (NGX_SOLARIS) - - size = 0; - - for (i = 0; i < ngx_argc; i++) { - size += ngx_strlen(ngx_argv[i]) + 1; - } - - if (size > (size_t) ((char *) p - ngx_os_argv[0])) { - - /* - * ngx_setproctitle() is too rare operation so we use - * the non-optimized copies - */ - - p = ngx_cpystrn(p, (u_char *) " (", ngx_os_argv_last - (char *) p); - - for (i = 0; i < ngx_argc; i++) { - p = ngx_cpystrn(p, (u_char *) ngx_argv[i], - ngx_os_argv_last - (char *) p); - p = ngx_cpystrn(p, (u_char *) " ", ngx_os_argv_last - (char *) p); - } - - if (*(p - 1) == ' ') { - *(p - 1) = ')'; - } - } - -#endif - - if (ngx_os_argv_last - (char *) p) { - ngx_memset(p, NGX_SETPROCTITLE_PAD, ngx_os_argv_last - (char *) p); - } - - ngx_log_debug1(NGX_LOG_DEBUG_CORE, ngx_cycle->log, 0, - "setproctitle: \"%s\"", ngx_os_argv[0]); -} - -#endif /* NGX_SETPROCTITLE_USES_ENV */ diff --git a/src/deps/src/nginx-1.30.3/src/os/unix/ngx_setproctitle.h b/src/deps/src/nginx-1.30.3/src/os/unix/ngx_setproctitle.h deleted file mode 100644 index c3636628bb..0000000000 --- a/src/deps/src/nginx-1.30.3/src/os/unix/ngx_setproctitle.h +++ /dev/null @@ -1,52 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#ifndef _NGX_SETPROCTITLE_H_INCLUDED_ -#define _NGX_SETPROCTITLE_H_INCLUDED_ - - -#if (NGX_HAVE_SETPROCTITLE) - -/* FreeBSD, NetBSD, OpenBSD */ - -#define ngx_init_setproctitle(log) NGX_OK -#define ngx_setproctitle(title) setproctitle("%s", title) - - -#else /* !NGX_HAVE_SETPROCTITLE */ - -#if !defined NGX_SETPROCTITLE_USES_ENV - -#if (NGX_SOLARIS) - -#define NGX_SETPROCTITLE_USES_ENV 1 -#define NGX_SETPROCTITLE_PAD ' ' - -ngx_int_t ngx_init_setproctitle(ngx_log_t *log); -void ngx_setproctitle(char *title); - -#elif (NGX_LINUX) || (NGX_DARWIN) - -#define NGX_SETPROCTITLE_USES_ENV 1 -#define NGX_SETPROCTITLE_PAD '\0' - -ngx_int_t ngx_init_setproctitle(ngx_log_t *log); -void ngx_setproctitle(char *title); - -#else - -#define ngx_init_setproctitle(log) NGX_OK -#define ngx_setproctitle(title) - -#endif /* OSes */ - -#endif /* NGX_SETPROCTITLE_USES_ENV */ - -#endif /* NGX_HAVE_SETPROCTITLE */ - - -#endif /* _NGX_SETPROCTITLE_H_INCLUDED_ */ diff --git a/src/deps/src/nginx-1.30.3/src/os/unix/ngx_shmem.c b/src/deps/src/nginx-1.30.3/src/os/unix/ngx_shmem.c deleted file mode 100644 index 3ec7cbf1fd..0000000000 --- a/src/deps/src/nginx-1.30.3/src/os/unix/ngx_shmem.c +++ /dev/null @@ -1,126 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#include -#include - - -#if (NGX_HAVE_MAP_ANON) - -ngx_int_t -ngx_shm_alloc(ngx_shm_t *shm) -{ - shm->addr = (u_char *) mmap(NULL, shm->size, - PROT_READ|PROT_WRITE, - MAP_ANON|MAP_SHARED, -1, 0); - - if (shm->addr == MAP_FAILED) { - ngx_log_error(NGX_LOG_ALERT, shm->log, ngx_errno, - "mmap(MAP_ANON|MAP_SHARED, %uz) failed", shm->size); - return NGX_ERROR; - } - - return NGX_OK; -} - - -void -ngx_shm_free(ngx_shm_t *shm) -{ - if (munmap((void *) shm->addr, shm->size) == -1) { - ngx_log_error(NGX_LOG_ALERT, shm->log, ngx_errno, - "munmap(%p, %uz) failed", shm->addr, shm->size); - } -} - -#elif (NGX_HAVE_MAP_DEVZERO) - -ngx_int_t -ngx_shm_alloc(ngx_shm_t *shm) -{ - ngx_fd_t fd; - - fd = open("/dev/zero", O_RDWR); - - if (fd == -1) { - ngx_log_error(NGX_LOG_ALERT, shm->log, ngx_errno, - "open(\"/dev/zero\") failed"); - return NGX_ERROR; - } - - shm->addr = (u_char *) mmap(NULL, shm->size, PROT_READ|PROT_WRITE, - MAP_SHARED, fd, 0); - - if (shm->addr == MAP_FAILED) { - ngx_log_error(NGX_LOG_ALERT, shm->log, ngx_errno, - "mmap(/dev/zero, MAP_SHARED, %uz) failed", shm->size); - } - - if (close(fd) == -1) { - ngx_log_error(NGX_LOG_ALERT, shm->log, ngx_errno, - "close(\"/dev/zero\") failed"); - } - - return (shm->addr == MAP_FAILED) ? NGX_ERROR : NGX_OK; -} - - -void -ngx_shm_free(ngx_shm_t *shm) -{ - if (munmap((void *) shm->addr, shm->size) == -1) { - ngx_log_error(NGX_LOG_ALERT, shm->log, ngx_errno, - "munmap(%p, %uz) failed", shm->addr, shm->size); - } -} - -#elif (NGX_HAVE_SYSVSHM) - -#include -#include - - -ngx_int_t -ngx_shm_alloc(ngx_shm_t *shm) -{ - int id; - - id = shmget(IPC_PRIVATE, shm->size, (SHM_R|SHM_W|IPC_CREAT)); - - if (id == -1) { - ngx_log_error(NGX_LOG_ALERT, shm->log, ngx_errno, - "shmget(%uz) failed", shm->size); - return NGX_ERROR; - } - - ngx_log_debug1(NGX_LOG_DEBUG_CORE, shm->log, 0, "shmget id: %d", id); - - shm->addr = shmat(id, NULL, 0); - - if (shm->addr == (void *) -1) { - ngx_log_error(NGX_LOG_ALERT, shm->log, ngx_errno, "shmat() failed"); - } - - if (shmctl(id, IPC_RMID, NULL) == -1) { - ngx_log_error(NGX_LOG_ALERT, shm->log, ngx_errno, - "shmctl(IPC_RMID) failed"); - } - - return (shm->addr == (void *) -1) ? NGX_ERROR : NGX_OK; -} - - -void -ngx_shm_free(ngx_shm_t *shm) -{ - if (shmdt(shm->addr) == -1) { - ngx_log_error(NGX_LOG_ALERT, shm->log, ngx_errno, - "shmdt(%p) failed", shm->addr); - } -} - -#endif diff --git a/src/deps/src/nginx-1.30.3/src/os/unix/ngx_shmem.h b/src/deps/src/nginx-1.30.3/src/os/unix/ngx_shmem.h deleted file mode 100644 index 566a7d3300..0000000000 --- a/src/deps/src/nginx-1.30.3/src/os/unix/ngx_shmem.h +++ /dev/null @@ -1,29 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#ifndef _NGX_SHMEM_H_INCLUDED_ -#define _NGX_SHMEM_H_INCLUDED_ - - -#include -#include - - -typedef struct { - u_char *addr; - size_t size; - ngx_str_t name; - ngx_log_t *log; - ngx_uint_t exists; /* unsigned exists:1; */ -} ngx_shm_t; - - -ngx_int_t ngx_shm_alloc(ngx_shm_t *shm); -void ngx_shm_free(ngx_shm_t *shm); - - -#endif /* _NGX_SHMEM_H_INCLUDED_ */ diff --git a/src/deps/src/nginx-1.30.3/src/os/unix/ngx_socket.c b/src/deps/src/nginx-1.30.3/src/os/unix/ngx_socket.c deleted file mode 100644 index 3978f655c0..0000000000 --- a/src/deps/src/nginx-1.30.3/src/os/unix/ngx_socket.c +++ /dev/null @@ -1,116 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#include -#include - - -/* - * ioctl(FIONBIO) sets a non-blocking mode with the single syscall - * while fcntl(F_SETFL, O_NONBLOCK) needs to learn the current state - * using fcntl(F_GETFL). - * - * ioctl() and fcntl() are syscalls at least in FreeBSD 2.x, Linux 2.2 - * and Solaris 7. - * - * ioctl() in Linux 2.4 and 2.6 uses BKL, however, fcntl(F_SETFL) uses it too. - */ - - -#if (NGX_HAVE_FIONBIO) - -int -ngx_nonblocking(ngx_socket_t s) -{ - int nb; - - nb = 1; - - return ioctl(s, FIONBIO, &nb); -} - - -int -ngx_blocking(ngx_socket_t s) -{ - int nb; - - nb = 0; - - return ioctl(s, FIONBIO, &nb); -} - -#endif - - -#if (NGX_FREEBSD) - -int -ngx_tcp_nopush(ngx_socket_t s) -{ - int tcp_nopush; - - tcp_nopush = 1; - - return setsockopt(s, IPPROTO_TCP, TCP_NOPUSH, - (const void *) &tcp_nopush, sizeof(int)); -} - - -int -ngx_tcp_push(ngx_socket_t s) -{ - int tcp_nopush; - - tcp_nopush = 0; - - return setsockopt(s, IPPROTO_TCP, TCP_NOPUSH, - (const void *) &tcp_nopush, sizeof(int)); -} - -#elif (NGX_LINUX) - - -int -ngx_tcp_nopush(ngx_socket_t s) -{ - int cork; - - cork = 1; - - return setsockopt(s, IPPROTO_TCP, TCP_CORK, - (const void *) &cork, sizeof(int)); -} - - -int -ngx_tcp_push(ngx_socket_t s) -{ - int cork; - - cork = 0; - - return setsockopt(s, IPPROTO_TCP, TCP_CORK, - (const void *) &cork, sizeof(int)); -} - -#else - -int -ngx_tcp_nopush(ngx_socket_t s) -{ - return 0; -} - - -int -ngx_tcp_push(ngx_socket_t s) -{ - return 0; -} - -#endif diff --git a/src/deps/src/nginx-1.30.3/src/os/unix/ngx_socket.h b/src/deps/src/nginx-1.30.3/src/os/unix/ngx_socket.h deleted file mode 100644 index 4480adca2e..0000000000 --- a/src/deps/src/nginx-1.30.3/src/os/unix/ngx_socket.h +++ /dev/null @@ -1,73 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#ifndef _NGX_SOCKET_H_INCLUDED_ -#define _NGX_SOCKET_H_INCLUDED_ - - -#include - - -#define NGX_WRITE_SHUTDOWN SHUT_WR -#define NGX_READ_SHUTDOWN SHUT_RD -#define NGX_RDWR_SHUTDOWN SHUT_RDWR - -typedef int ngx_socket_t; - -#define ngx_socket socket -#define ngx_socket_n "socket()" - - -#if (NGX_HAVE_FIONBIO) - -int ngx_nonblocking(ngx_socket_t s); -int ngx_blocking(ngx_socket_t s); - -#define ngx_nonblocking_n "ioctl(FIONBIO)" -#define ngx_blocking_n "ioctl(!FIONBIO)" - -#else - -#define ngx_nonblocking(s) fcntl(s, F_SETFL, fcntl(s, F_GETFL) | O_NONBLOCK) -#define ngx_nonblocking_n "fcntl(O_NONBLOCK)" - -#define ngx_blocking(s) fcntl(s, F_SETFL, fcntl(s, F_GETFL) & ~O_NONBLOCK) -#define ngx_blocking_n "fcntl(!O_NONBLOCK)" - -#endif - -#if (NGX_HAVE_FIONREAD) - -#define ngx_socket_nread(s, n) ioctl(s, FIONREAD, n) -#define ngx_socket_nread_n "ioctl(FIONREAD)" - -#endif - -int ngx_tcp_nopush(ngx_socket_t s); -int ngx_tcp_push(ngx_socket_t s); - -#if (NGX_LINUX) - -#define ngx_tcp_nopush_n "setsockopt(TCP_CORK)" -#define ngx_tcp_push_n "setsockopt(!TCP_CORK)" - -#else - -#define ngx_tcp_nopush_n "setsockopt(TCP_NOPUSH)" -#define ngx_tcp_push_n "setsockopt(!TCP_NOPUSH)" - -#endif - - -#define ngx_shutdown_socket shutdown -#define ngx_shutdown_socket_n "shutdown()" - -#define ngx_close_socket close -#define ngx_close_socket_n "close() socket" - - -#endif /* _NGX_SOCKET_H_INCLUDED_ */ diff --git a/src/deps/src/nginx-1.30.3/src/os/unix/ngx_solaris.h b/src/deps/src/nginx-1.30.3/src/os/unix/ngx_solaris.h deleted file mode 100644 index 7b167d830a..0000000000 --- a/src/deps/src/nginx-1.30.3/src/os/unix/ngx_solaris.h +++ /dev/null @@ -1,16 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#ifndef _NGX_SOLARIS_H_INCLUDED_ -#define _NGX_SOLARIS_H_INCLUDED_ - - -ngx_chain_t *ngx_solaris_sendfilev_chain(ngx_connection_t *c, ngx_chain_t *in, - off_t limit); - - -#endif /* _NGX_SOLARIS_H_INCLUDED_ */ diff --git a/src/deps/src/nginx-1.30.3/src/os/unix/ngx_solaris_config.h b/src/deps/src/nginx-1.30.3/src/os/unix/ngx_solaris_config.h deleted file mode 100644 index ffa01c8b72..0000000000 --- a/src/deps/src/nginx-1.30.3/src/os/unix/ngx_solaris_config.h +++ /dev/null @@ -1,112 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#ifndef _NGX_SOLARIS_CONFIG_H_INCLUDED_ -#define _NGX_SOLARIS_CONFIG_H_INCLUDED_ - - -#ifndef _REENTRANT -#define _REENTRANT -#endif - -#define _FILE_OFFSET_BITS 64 /* must be before */ - -#include -#include -#include -#include -#include /* offsetof() */ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include /* statvfs() */ - -#include /* FIONBIO */ -#include -#include -#include - -#include -#include -#include -#include - -#include -#include -#include /* TCP_NODELAY */ -#include -#include -#include - -#include -#include /* IOV_MAX */ -#include -#include - -#include - -#define NGX_ALIGNMENT _MAX_ALIGNMENT - -#include - - -#if (NGX_HAVE_POSIX_SEM) -#include -#endif - - -#if (NGX_HAVE_POLL) -#include -#endif - - -#if (NGX_HAVE_DEVPOLL) -#include -#include -#endif - - -#if (NGX_HAVE_EVENTPORT) -#include -#endif - - -#if (NGX_HAVE_SENDFILE) -#include -#endif - - -#define NGX_LISTEN_BACKLOG 511 - - -#ifndef NGX_HAVE_INHERITED_NONBLOCK -#define NGX_HAVE_INHERITED_NONBLOCK 1 -#endif - - -#ifndef NGX_HAVE_SO_SNDLOWAT -/* setsockopt(SO_SNDLOWAT) returns ENOPROTOOPT */ -#define NGX_HAVE_SO_SNDLOWAT 0 -#endif - - -#define NGX_HAVE_OS_SPECIFIC_INIT 1 -#define ngx_debug_init() - - -extern char **environ; - - -#endif /* _NGX_SOLARIS_CONFIG_H_INCLUDED_ */ diff --git a/src/deps/src/nginx-1.30.3/src/os/unix/ngx_solaris_init.c b/src/deps/src/nginx-1.30.3/src/os/unix/ngx_solaris_init.c deleted file mode 100644 index 65d787539a..0000000000 --- a/src/deps/src/nginx-1.30.3/src/os/unix/ngx_solaris_init.c +++ /dev/null @@ -1,77 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#include -#include - - -char ngx_solaris_sysname[20]; -char ngx_solaris_release[10]; -char ngx_solaris_version[50]; - - -static ngx_os_io_t ngx_solaris_io = { - ngx_unix_recv, - ngx_readv_chain, - ngx_udp_unix_recv, - ngx_unix_send, - ngx_udp_unix_send, - ngx_udp_unix_sendmsg_chain, -#if (NGX_HAVE_SENDFILE) - ngx_solaris_sendfilev_chain, - NGX_IO_SENDFILE -#else - ngx_writev_chain, - 0 -#endif -}; - - -ngx_int_t -ngx_os_specific_init(ngx_log_t *log) -{ - if (sysinfo(SI_SYSNAME, ngx_solaris_sysname, sizeof(ngx_solaris_sysname)) - == -1) - { - ngx_log_error(NGX_LOG_ALERT, log, ngx_errno, - "sysinfo(SI_SYSNAME) failed"); - return NGX_ERROR; - } - - if (sysinfo(SI_RELEASE, ngx_solaris_release, sizeof(ngx_solaris_release)) - == -1) - { - ngx_log_error(NGX_LOG_ALERT, log, ngx_errno, - "sysinfo(SI_RELEASE) failed"); - return NGX_ERROR; - } - - if (sysinfo(SI_VERSION, ngx_solaris_version, sizeof(ngx_solaris_version)) - == -1) - { - ngx_log_error(NGX_LOG_ALERT, log, ngx_errno, - "sysinfo(SI_SYSNAME) failed"); - return NGX_ERROR; - } - - - ngx_os_io = ngx_solaris_io; - - return NGX_OK; -} - - -void -ngx_os_specific_status(ngx_log_t *log) -{ - - ngx_log_error(NGX_LOG_NOTICE, log, 0, "OS: %s %s", - ngx_solaris_sysname, ngx_solaris_release); - - ngx_log_error(NGX_LOG_NOTICE, log, 0, "version: %s", - ngx_solaris_version); -} diff --git a/src/deps/src/nginx-1.30.3/src/os/unix/ngx_solaris_sendfilev_chain.c b/src/deps/src/nginx-1.30.3/src/os/unix/ngx_solaris_sendfilev_chain.c deleted file mode 100644 index 39bcafaaf2..0000000000 --- a/src/deps/src/nginx-1.30.3/src/os/unix/ngx_solaris_sendfilev_chain.c +++ /dev/null @@ -1,228 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#include -#include -#include - - -#if (NGX_TEST_BUILD_SOLARIS_SENDFILEV) - -/* Solaris declarations */ - -typedef struct sendfilevec { - int sfv_fd; - u_int sfv_flag; - off_t sfv_off; - size_t sfv_len; -} sendfilevec_t; - -#define SFV_FD_SELF -2 - -static ssize_t sendfilev(int fd, const struct sendfilevec *vec, - int sfvcnt, size_t *xferred) -{ - return -1; -} - -ngx_chain_t *ngx_solaris_sendfilev_chain(ngx_connection_t *c, ngx_chain_t *in, - off_t limit); - -#endif - - -#define NGX_SENDFILEVECS NGX_IOVS_PREALLOCATE - - -ngx_chain_t * -ngx_solaris_sendfilev_chain(ngx_connection_t *c, ngx_chain_t *in, off_t limit) -{ - int fd; - u_char *prev; - off_t size, send, prev_send, aligned, fprev; - size_t sent; - ssize_t n; - ngx_int_t eintr; - ngx_err_t err; - ngx_buf_t *file; - ngx_uint_t nsfv; - sendfilevec_t *sfv, sfvs[NGX_SENDFILEVECS]; - ngx_event_t *wev; - ngx_chain_t *cl; - - wev = c->write; - - if (!wev->ready) { - return in; - } - - if (!c->sendfile) { - return ngx_writev_chain(c, in, limit); - } - - - /* the maximum limit size is the maximum size_t value - the page size */ - - if (limit == 0 || limit > (off_t) (NGX_MAX_SIZE_T_VALUE - ngx_pagesize)) { - limit = NGX_MAX_SIZE_T_VALUE - ngx_pagesize; - } - - - send = 0; - - for ( ;; ) { - fd = SFV_FD_SELF; - prev = NULL; - fprev = 0; - file = NULL; - sfv = NULL; - eintr = 0; - sent = 0; - prev_send = send; - - nsfv = 0; - - /* create the sendfilevec and coalesce the neighbouring bufs */ - - for (cl = in; cl && send < limit; cl = cl->next) { - - if (ngx_buf_special(cl->buf)) { - continue; - } - - if (ngx_buf_in_memory_only(cl->buf)) { - fd = SFV_FD_SELF; - - size = cl->buf->last - cl->buf->pos; - - if (send + size > limit) { - size = limit - send; - } - - if (prev == cl->buf->pos) { - sfv->sfv_len += (size_t) size; - - } else { - if (nsfv == NGX_SENDFILEVECS) { - break; - } - - sfv = &sfvs[nsfv++]; - - sfv->sfv_fd = SFV_FD_SELF; - sfv->sfv_flag = 0; - sfv->sfv_off = (off_t) (uintptr_t) cl->buf->pos; - sfv->sfv_len = (size_t) size; - } - - prev = cl->buf->pos + (size_t) size; - send += size; - - } else { - prev = NULL; - - size = cl->buf->file_last - cl->buf->file_pos; - - if (send + size > limit) { - size = limit - send; - - aligned = (cl->buf->file_pos + size + ngx_pagesize - 1) - & ~((off_t) ngx_pagesize - 1); - - if (aligned <= cl->buf->file_last) { - size = aligned - cl->buf->file_pos; - } - } - - if (fd == cl->buf->file->fd && fprev == cl->buf->file_pos) { - sfv->sfv_len += (size_t) size; - - } else { - if (nsfv == NGX_SENDFILEVECS) { - break; - } - - sfv = &sfvs[nsfv++]; - - fd = cl->buf->file->fd; - sfv->sfv_fd = fd; - sfv->sfv_flag = 0; - sfv->sfv_off = cl->buf->file_pos; - sfv->sfv_len = (size_t) size; - } - - file = cl->buf; - fprev = cl->buf->file_pos + size; - send += size; - } - } - - n = sendfilev(c->fd, sfvs, nsfv, &sent); - - if (n == -1) { - err = ngx_errno; - - switch (err) { - case NGX_EAGAIN: - break; - - case NGX_EINTR: - eintr = 1; - break; - - default: - wev->error = 1; - ngx_connection_error(c, err, "sendfilev() failed"); - return NGX_CHAIN_ERROR; - } - - ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, err, - "sendfilev() sent only %uz bytes", sent); - - } else if (n == 0 && sent == 0) { - - /* - * sendfilev() is documented to return -1 with errno - * set to EINVAL if svf_len is greater than the file size, - * but at least Solaris 11 returns 0 instead - */ - - if (file) { - ngx_log_error(NGX_LOG_ALERT, c->log, 0, - "sendfilev() reported that \"%s\" was truncated at %O", - file->file->name.data, file->file_pos); - - } else { - ngx_log_error(NGX_LOG_ALERT, c->log, 0, - "sendfilev() returned 0 with memory buffers"); - } - - return NGX_CHAIN_ERROR; - } - - ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0, - "sendfilev: %z %z", n, sent); - - c->sent += sent; - - in = ngx_chain_update_sent(in, sent); - - if (eintr) { - send = prev_send + sent; - continue; - } - - if (send - prev_send != (off_t) sent) { - wev->ready = 0; - return in; - } - - if (send >= limit || in == NULL) { - return in; - } - } -} diff --git a/src/deps/src/nginx-1.30.3/src/os/unix/ngx_sunpro_amd64.il b/src/deps/src/nginx-1.30.3/src/os/unix/ngx_sunpro_amd64.il deleted file mode 100644 index 07f32103b7..0000000000 --- a/src/deps/src/nginx-1.30.3/src/os/unix/ngx_sunpro_amd64.il +++ /dev/null @@ -1,43 +0,0 @@ -/ -/ Copyright (C) Igor Sysoev -/ Copyright (C) Nginx, Inc. -/ - -/ ngx_atomic_uint_t ngx_atomic_cmp_set(ngx_atomic_t *lock, -/ ngx_atomic_uint_t old, ngx_atomic_uint_t set); -/ -/ the arguments are passed in %rdi, %rsi, %rdx -/ the result is returned in the %rax - - .inline ngx_atomic_cmp_set,0 - movq %rsi, %rax - lock - cmpxchgq %rdx, (%rdi) - setz %al - movzbq %al, %rax - .end - - -/ ngx_atomic_int_t ngx_atomic_fetch_add(ngx_atomic_t *value, -/ ngx_atomic_int_t add); -/ -/ the arguments are passed in %rdi, %rsi -/ the result is returned in the %rax - - .inline ngx_atomic_fetch_add,0 - movq %rsi, %rax - lock - xaddq %rax, (%rdi) - .end - - -/ ngx_cpu_pause() -/ -/ the "rep; nop" is used instead of "pause" to avoid the "[ PAUSE ]" hardware -/ capability added by linker because Solaris/amd64 does not know about it: -/ -/ ld.so.1: nginx: fatal: hardware capability unsupported: 0x2000 [ PAUSE ] - - .inline ngx_cpu_pause,0 - rep; nop - .end diff --git a/src/deps/src/nginx-1.30.3/src/os/unix/ngx_sunpro_atomic_sparc64.h b/src/deps/src/nginx-1.30.3/src/os/unix/ngx_sunpro_atomic_sparc64.h deleted file mode 100644 index 5f280553c9..0000000000 --- a/src/deps/src/nginx-1.30.3/src/os/unix/ngx_sunpro_atomic_sparc64.h +++ /dev/null @@ -1,61 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#if (NGX_PTR_SIZE == 4) -#define NGX_CASA ngx_casa -#else -#define NGX_CASA ngx_casxa -#endif - - -ngx_atomic_uint_t -ngx_casa(ngx_atomic_uint_t set, ngx_atomic_uint_t old, ngx_atomic_t *lock); - -ngx_atomic_uint_t -ngx_casxa(ngx_atomic_uint_t set, ngx_atomic_uint_t old, ngx_atomic_t *lock); - -/* the code in src/os/unix/ngx_sunpro_sparc64.il */ - - -static ngx_inline ngx_atomic_uint_t -ngx_atomic_cmp_set(ngx_atomic_t *lock, ngx_atomic_uint_t old, - ngx_atomic_uint_t set) -{ - set = NGX_CASA(set, old, lock); - - return (set == old); -} - - -static ngx_inline ngx_atomic_int_t -ngx_atomic_fetch_add(ngx_atomic_t *value, ngx_atomic_int_t add) -{ - ngx_atomic_uint_t old, res; - - old = *value; - - for ( ;; ) { - - res = old + add; - - res = NGX_CASA(res, old, value); - - if (res == old) { - return res; - } - - old = res; - } -} - - -#define ngx_memory_barrier() \ - __asm (".volatile"); \ - __asm ("membar #LoadLoad | #LoadStore | #StoreStore | #StoreLoad"); \ - __asm (".nonvolatile") - -#define ngx_cpu_pause() diff --git a/src/deps/src/nginx-1.30.3/src/os/unix/ngx_sunpro_sparc64.il b/src/deps/src/nginx-1.30.3/src/os/unix/ngx_sunpro_sparc64.il deleted file mode 100644 index bdeef61250..0000000000 --- a/src/deps/src/nginx-1.30.3/src/os/unix/ngx_sunpro_sparc64.il +++ /dev/null @@ -1,36 +0,0 @@ -/ -/ Copyright (C) Igor Sysoev -/ Copyright (C) Nginx, Inc. -/ - - -/ "casa [%o2] 0x80, %o1, %o0" and -/ "casxa [%o2] 0x80, %o1, %o0" do the following: -/ -/ if ([%o2] == %o1) { -/ swap(%o0, [%o2]); -/ } else { -/ %o0 = [%o2]; -/ } - - -/ ngx_atomic_uint_t ngx_casa(ngx_atomic_uint_t set, ngx_atomic_uint_t old, -/ ngx_atomic_t *lock); -/ -/ the arguments are passed in the %o0, %o1, %o2 -/ the result is returned in the %o0 - - .inline ngx_casa,0 - casa [%o2] 0x80, %o1, %o0 - .end - - -/ ngx_atomic_uint_t ngx_casxa(ngx_atomic_uint_t set, ngx_atomic_uint_t old, -/ ngx_atomic_t *lock); -/ -/ the arguments are passed in the %o0, %o1, %o2 -/ the result is returned in the %o0 - - .inline ngx_casxa,0 - casxa [%o2] 0x80, %o1, %o0 - .end diff --git a/src/deps/src/nginx-1.30.3/src/os/unix/ngx_sunpro_x86.il b/src/deps/src/nginx-1.30.3/src/os/unix/ngx_sunpro_x86.il deleted file mode 100644 index d7e127cc4f..0000000000 --- a/src/deps/src/nginx-1.30.3/src/os/unix/ngx_sunpro_x86.il +++ /dev/null @@ -1,44 +0,0 @@ -/ -/ Copyright (C) Igor Sysoev -/ Copyright (C) Nginx, Inc. -/ - -/ ngx_atomic_uint_t ngx_atomic_cmp_set(ngx_atomic_t *lock, -/ ngx_atomic_uint_t old, ngx_atomic_uint_t set); -/ -/ the arguments are passed on stack (%esp), 4(%esp), 8(%esp) - - .inline ngx_atomic_cmp_set,0 - movl (%esp), %ecx - movl 4(%esp), %eax - movl 8(%esp), %edx - lock - cmpxchgl %edx, (%ecx) - setz %al - movzbl %al, %eax - .end - - -/ ngx_atomic_int_t ngx_atomic_fetch_add(ngx_atomic_t *value, -/ ngx_atomic_int_t add); -/ -/ the arguments are passed on stack (%esp), 4(%esp) - - .inline ngx_atomic_fetch_add,0 - movl (%esp), %ecx - movl 4(%esp), %eax - lock - xaddl %eax, (%ecx) - .end - - -/ ngx_cpu_pause() -/ -/ the "rep; nop" is used instead of "pause" to avoid the "[ PAUSE ]" hardware -/ capability added by linker because Solaris/i386 does not know about it: -/ -/ ld.so.1: nginx: fatal: hardware capability unsupported: 0x2000 [ PAUSE ] - - .inline ngx_cpu_pause,0 - rep; nop - .end diff --git a/src/deps/src/nginx-1.30.3/src/os/unix/ngx_thread.h b/src/deps/src/nginx-1.30.3/src/os/unix/ngx_thread.h deleted file mode 100644 index e3b5e81341..0000000000 --- a/src/deps/src/nginx-1.30.3/src/os/unix/ngx_thread.h +++ /dev/null @@ -1,71 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#ifndef _NGX_THREAD_H_INCLUDED_ -#define _NGX_THREAD_H_INCLUDED_ - - -#include -#include - -#if (NGX_THREADS) - -#include - - -typedef pthread_mutex_t ngx_thread_mutex_t; - -ngx_int_t ngx_thread_mutex_create(ngx_thread_mutex_t *mtx, ngx_log_t *log); -ngx_int_t ngx_thread_mutex_destroy(ngx_thread_mutex_t *mtx, ngx_log_t *log); -ngx_int_t ngx_thread_mutex_lock(ngx_thread_mutex_t *mtx, ngx_log_t *log); -ngx_int_t ngx_thread_mutex_unlock(ngx_thread_mutex_t *mtx, ngx_log_t *log); - - -typedef pthread_cond_t ngx_thread_cond_t; - -ngx_int_t ngx_thread_cond_create(ngx_thread_cond_t *cond, ngx_log_t *log); -ngx_int_t ngx_thread_cond_destroy(ngx_thread_cond_t *cond, ngx_log_t *log); -ngx_int_t ngx_thread_cond_signal(ngx_thread_cond_t *cond, ngx_log_t *log); -ngx_int_t ngx_thread_cond_wait(ngx_thread_cond_t *cond, ngx_thread_mutex_t *mtx, - ngx_log_t *log); - - -#if (NGX_LINUX) - -typedef pid_t ngx_tid_t; -#define NGX_TID_T_FMT "%P" - -#elif (NGX_FREEBSD) - -typedef uint32_t ngx_tid_t; -#define NGX_TID_T_FMT "%uD" - -#elif (NGX_DARWIN) - -typedef uint64_t ngx_tid_t; -#define NGX_TID_T_FMT "%uL" - -#else - -typedef uint64_t ngx_tid_t; -#define NGX_TID_T_FMT "%uL" - -#endif - -ngx_tid_t ngx_thread_tid(void); - -#define ngx_log_tid ngx_thread_tid() - -#else - -#define ngx_log_tid 0 -#define NGX_TID_T_FMT "%d" - -#endif - - -#endif /* _NGX_THREAD_H_INCLUDED_ */ diff --git a/src/deps/src/nginx-1.30.3/src/os/unix/ngx_thread_cond.c b/src/deps/src/nginx-1.30.3/src/os/unix/ngx_thread_cond.c deleted file mode 100644 index 2ad51b809e..0000000000 --- a/src/deps/src/nginx-1.30.3/src/os/unix/ngx_thread_cond.c +++ /dev/null @@ -1,76 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#include -#include - - -ngx_int_t -ngx_thread_cond_create(ngx_thread_cond_t *cond, ngx_log_t *log) -{ - ngx_err_t err; - - err = pthread_cond_init(cond, NULL); - if (err == 0) { - return NGX_OK; - } - - ngx_log_error(NGX_LOG_EMERG, log, err, "pthread_cond_init() failed"); - return NGX_ERROR; -} - - -ngx_int_t -ngx_thread_cond_destroy(ngx_thread_cond_t *cond, ngx_log_t *log) -{ - ngx_err_t err; - - err = pthread_cond_destroy(cond); - if (err == 0) { - return NGX_OK; - } - - ngx_log_error(NGX_LOG_EMERG, log, err, "pthread_cond_destroy() failed"); - return NGX_ERROR; -} - - -ngx_int_t -ngx_thread_cond_signal(ngx_thread_cond_t *cond, ngx_log_t *log) -{ - ngx_err_t err; - - err = pthread_cond_signal(cond); - if (err == 0) { - return NGX_OK; - } - - ngx_log_error(NGX_LOG_EMERG, log, err, "pthread_cond_signal() failed"); - return NGX_ERROR; -} - - -ngx_int_t -ngx_thread_cond_wait(ngx_thread_cond_t *cond, ngx_thread_mutex_t *mtx, - ngx_log_t *log) -{ - ngx_err_t err; - - err = pthread_cond_wait(cond, mtx); - -#if 0 - ngx_time_update(); -#endif - - if (err == 0) { - return NGX_OK; - } - - ngx_log_error(NGX_LOG_ALERT, log, err, "pthread_cond_wait() failed"); - - return NGX_ERROR; -} diff --git a/src/deps/src/nginx-1.30.3/src/os/unix/ngx_thread_id.c b/src/deps/src/nginx-1.30.3/src/os/unix/ngx_thread_id.c deleted file mode 100644 index 5174f1abc4..0000000000 --- a/src/deps/src/nginx-1.30.3/src/os/unix/ngx_thread_id.c +++ /dev/null @@ -1,70 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#include -#include -#include - - -#if (NGX_LINUX) - -/* - * Linux thread id is a pid of thread created by clone(2), - * glibc does not provide a wrapper for gettid(). - */ - -ngx_tid_t -ngx_thread_tid(void) -{ - return syscall(SYS_gettid); -} - -#elif (NGX_FREEBSD) && (__FreeBSD_version >= 900031) - -#include - -ngx_tid_t -ngx_thread_tid(void) -{ - return pthread_getthreadid_np(); -} - -#elif (NGX_DARWIN) - -/* - * MacOSX thread has two thread ids: - * - * 1) MacOSX 10.6 (Snow Leoprad) has pthread_threadid_np() returning - * an uint64_t value, which is obtained using the __thread_selfid() - * syscall. It is a number above 300,000. - */ - -ngx_tid_t -ngx_thread_tid(void) -{ - uint64_t tid; - - (void) pthread_threadid_np(NULL, &tid); - return tid; -} - -/* - * 2) Kernel thread mach_port_t returned by pthread_mach_thread_np(). - * It is a number in range 100-100,000. - * - * return pthread_mach_thread_np(pthread_self()); - */ - -#else - -ngx_tid_t -ngx_thread_tid(void) -{ - return (uint64_t) (uintptr_t) pthread_self(); -} - -#endif diff --git a/src/deps/src/nginx-1.30.3/src/os/unix/ngx_thread_mutex.c b/src/deps/src/nginx-1.30.3/src/os/unix/ngx_thread_mutex.c deleted file mode 100644 index 4886f49d7d..0000000000 --- a/src/deps/src/nginx-1.30.3/src/os/unix/ngx_thread_mutex.c +++ /dev/null @@ -1,165 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - -#include -#include - - -/* - * All modern pthread mutex implementations try to acquire a lock - * atomically in userland before going to sleep in kernel. Some - * spins before the sleeping. - * - * In Solaris since version 8 all mutex types spin before sleeping. - * The default spin count is 1000. It can be overridden using - * _THREAD_ADAPTIVE_SPIN=100 environment variable. - * - * In MacOSX all mutex types spin to acquire a lock protecting a mutex's - * internals. If the mutex is busy, thread calls Mach semaphore_wait(). - * - * - * PTHREAD_MUTEX_NORMAL lacks deadlock detection and is the fastest - * mutex type. - * - * Linux: No spinning. The internal name PTHREAD_MUTEX_TIMED_NP - * remains from the times when pthread_mutex_timedlock() was - * non-standard extension. Alias name: PTHREAD_MUTEX_FAST_NP. - * FreeBSD: No spinning. - * - * - * PTHREAD_MUTEX_ERRORCHECK is usually as fast as PTHREAD_MUTEX_NORMAL - * yet has lightweight deadlock detection. - * - * Linux: No spinning. The internal name: PTHREAD_MUTEX_ERRORCHECK_NP. - * FreeBSD: No spinning. - * - * - * PTHREAD_MUTEX_RECURSIVE allows recursive locking. - * - * Linux: No spinning. The internal name: PTHREAD_MUTEX_RECURSIVE_NP. - * FreeBSD: No spinning. - * - * - * PTHREAD_MUTEX_ADAPTIVE_NP spins on SMP systems before sleeping. - * - * Linux: No deadlock detection. Dynamically changes a spin count - * for each mutex from 10 to 100 based on spin count taken - * previously. - * FreeBSD: Deadlock detection. The default spin count is 2000. - * It can be overridden using LIBPTHREAD_SPINLOOPS environment - * variable or by pthread_mutex_setspinloops_np(). If a lock - * is still busy, sched_yield() can be called on both UP and - * SMP systems. The default yield loop count is zero, but - * it can be set by LIBPTHREAD_YIELDLOOPS environment - * variable or by pthread_mutex_setyieldloops_np(). - * Solaris: No PTHREAD_MUTEX_ADAPTIVE_NP. - * MacOSX: No PTHREAD_MUTEX_ADAPTIVE_NP. - * - * - * PTHREAD_MUTEX_ELISION_NP is a Linux extension to elide locks using - * Intel Restricted Transactional Memory. It is the most suitable for - * rwlock pattern access because it allows simultaneous reads without lock. - * Supported since glibc 2.18. - * - * - * PTHREAD_MUTEX_DEFAULT is default mutex type. - * - * Linux: PTHREAD_MUTEX_NORMAL. - * FreeBSD: PTHREAD_MUTEX_ERRORCHECK. - * Solaris: PTHREAD_MUTEX_NORMAL. - * MacOSX: PTHREAD_MUTEX_NORMAL. - */ - - -ngx_int_t -ngx_thread_mutex_create(ngx_thread_mutex_t *mtx, ngx_log_t *log) -{ - ngx_err_t err; - pthread_mutexattr_t attr; - - err = pthread_mutexattr_init(&attr); - if (err != 0) { - ngx_log_error(NGX_LOG_EMERG, log, err, - "pthread_mutexattr_init() failed"); - return NGX_ERROR; - } - - err = pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_ERRORCHECK); - if (err != 0) { - ngx_log_error(NGX_LOG_EMERG, log, err, - "pthread_mutexattr_settype" - "(PTHREAD_MUTEX_ERRORCHECK) failed"); - return NGX_ERROR; - } - - err = pthread_mutex_init(mtx, &attr); - if (err != 0) { - ngx_log_error(NGX_LOG_EMERG, log, err, - "pthread_mutex_init() failed"); - return NGX_ERROR; - } - - err = pthread_mutexattr_destroy(&attr); - if (err != 0) { - ngx_log_error(NGX_LOG_ALERT, log, err, - "pthread_mutexattr_destroy() failed"); - } - - return NGX_OK; -} - - -ngx_int_t -ngx_thread_mutex_destroy(ngx_thread_mutex_t *mtx, ngx_log_t *log) -{ - ngx_err_t err; - - err = pthread_mutex_destroy(mtx); - if (err != 0) { - ngx_log_error(NGX_LOG_ALERT, log, err, - "pthread_mutex_destroy() failed"); - return NGX_ERROR; - } - - return NGX_OK; -} - - -ngx_int_t -ngx_thread_mutex_lock(ngx_thread_mutex_t *mtx, ngx_log_t *log) -{ - ngx_err_t err; - - err = pthread_mutex_lock(mtx); - if (err == 0) { - return NGX_OK; - } - - ngx_log_error(NGX_LOG_ALERT, log, err, "pthread_mutex_lock() failed"); - - return NGX_ERROR; -} - - -ngx_int_t -ngx_thread_mutex_unlock(ngx_thread_mutex_t *mtx, ngx_log_t *log) -{ - ngx_err_t err; - - err = pthread_mutex_unlock(mtx); - -#if 0 - ngx_time_update(); -#endif - - if (err == 0) { - return NGX_OK; - } - - ngx_log_error(NGX_LOG_ALERT, log, err, "pthread_mutex_unlock() failed"); - - return NGX_ERROR; -} diff --git a/src/deps/src/nginx-1.30.3/src/os/unix/ngx_time.c b/src/deps/src/nginx-1.30.3/src/os/unix/ngx_time.c deleted file mode 100644 index c97bae2ed2..0000000000 --- a/src/deps/src/nginx-1.30.3/src/os/unix/ngx_time.c +++ /dev/null @@ -1,104 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#include -#include - - -/* - * FreeBSD does not test /etc/localtime change, however, we can workaround it - * by calling tzset() with TZ and then without TZ to update timezone. - * The trick should work since FreeBSD 2.1.0. - * - * Linux does not test /etc/localtime change in localtime(), - * but may stat("/etc/localtime") several times in every strftime(), - * therefore we use it to update timezone. - * - * Solaris does not test /etc/TIMEZONE change too and no workaround available. - */ - -void -ngx_timezone_update(void) -{ -#if (NGX_FREEBSD) - - if (getenv("TZ")) { - return; - } - - putenv("TZ=UTC"); - - tzset(); - - unsetenv("TZ"); - - tzset(); - -#elif (NGX_LINUX) - time_t s; - struct tm *t; - char buf[4]; - - s = time(NULL); - - t = localtime(&s); - - strftime(buf, 4, "%H", t); - -#endif -} - - -void -ngx_localtime(time_t s, ngx_tm_t *tm) -{ -#if (NGX_HAVE_LOCALTIME_R) - (void) localtime_r(&s, tm); - -#else - ngx_tm_t *t; - - t = localtime(&s); - *tm = *t; - -#endif - - tm->ngx_tm_mon++; - tm->ngx_tm_year += 1900; -} - - -void -ngx_libc_localtime(time_t s, struct tm *tm) -{ -#if (NGX_HAVE_LOCALTIME_R) - (void) localtime_r(&s, tm); - -#else - struct tm *t; - - t = localtime(&s); - *tm = *t; - -#endif -} - - -void -ngx_libc_gmtime(time_t s, struct tm *tm) -{ -#if (NGX_HAVE_LOCALTIME_R) - (void) gmtime_r(&s, tm); - -#else - struct tm *t; - - t = gmtime(&s); - *tm = *t; - -#endif -} diff --git a/src/deps/src/nginx-1.30.3/src/os/unix/ngx_time.h b/src/deps/src/nginx-1.30.3/src/os/unix/ngx_time.h deleted file mode 100644 index c128c9aa04..0000000000 --- a/src/deps/src/nginx-1.30.3/src/os/unix/ngx_time.h +++ /dev/null @@ -1,66 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#ifndef _NGX_TIME_H_INCLUDED_ -#define _NGX_TIME_H_INCLUDED_ - - -#include -#include - - -typedef ngx_rbtree_key_t ngx_msec_t; -typedef ngx_rbtree_key_int_t ngx_msec_int_t; - -typedef struct tm ngx_tm_t; - -#define ngx_tm_sec tm_sec -#define ngx_tm_min tm_min -#define ngx_tm_hour tm_hour -#define ngx_tm_mday tm_mday -#define ngx_tm_mon tm_mon -#define ngx_tm_year tm_year -#define ngx_tm_wday tm_wday -#define ngx_tm_isdst tm_isdst - -#define ngx_tm_sec_t int -#define ngx_tm_min_t int -#define ngx_tm_hour_t int -#define ngx_tm_mday_t int -#define ngx_tm_mon_t int -#define ngx_tm_year_t int -#define ngx_tm_wday_t int - - -#if (NGX_HAVE_GMTOFF) -#define ngx_tm_gmtoff tm_gmtoff -#define ngx_tm_zone tm_zone -#endif - - -#if (NGX_SOLARIS) - -#define ngx_timezone(isdst) (- (isdst ? altzone : timezone) / 60) - -#else - -#define ngx_timezone(isdst) (- (isdst ? timezone + 3600 : timezone) / 60) - -#endif - - -void ngx_timezone_update(void); -void ngx_localtime(time_t s, ngx_tm_t *tm); -void ngx_libc_localtime(time_t s, struct tm *tm); -void ngx_libc_gmtime(time_t s, struct tm *tm); - -#define ngx_gettimeofday(tp) (void) gettimeofday(tp, NULL); -#define ngx_msleep(ms) (void) usleep(ms * 1000) -#define ngx_sleep(s) (void) sleep(s) - - -#endif /* _NGX_TIME_H_INCLUDED_ */ diff --git a/src/deps/src/nginx-1.30.3/src/os/unix/ngx_udp_recv.c b/src/deps/src/nginx-1.30.3/src/os/unix/ngx_udp_recv.c deleted file mode 100644 index 6d544c2c0e..0000000000 --- a/src/deps/src/nginx-1.30.3/src/os/unix/ngx_udp_recv.c +++ /dev/null @@ -1,72 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#include -#include -#include - - -ssize_t -ngx_udp_unix_recv(ngx_connection_t *c, u_char *buf, size_t size) -{ - ssize_t n; - ngx_err_t err; - ngx_event_t *rev; - - rev = c->read; - - do { - n = recv(c->fd, buf, size, 0); - - ngx_log_debug3(NGX_LOG_DEBUG_EVENT, c->log, 0, - "recv: fd:%d %z of %uz", c->fd, n, size); - - if (n >= 0) { - -#if (NGX_HAVE_KQUEUE) - - if (ngx_event_flags & NGX_USE_KQUEUE_EVENT) { - rev->available -= n; - - /* - * rev->available may be negative here because some additional - * bytes may be received between kevent() and recv() - */ - - if (rev->available <= 0) { - rev->ready = 0; - rev->available = 0; - } - } - -#endif - - return n; - } - - err = ngx_socket_errno; - - if (err == NGX_EAGAIN || err == NGX_EINTR) { - ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, err, - "recv() not ready"); - n = NGX_AGAIN; - - } else { - n = ngx_connection_error(c, err, "recv() failed"); - break; - } - - } while (err == NGX_EINTR); - - rev->ready = 0; - - if (n == NGX_ERROR) { - rev->error = 1; - } - - return n; -} diff --git a/src/deps/src/nginx-1.30.3/src/os/unix/ngx_udp_send.c b/src/deps/src/nginx-1.30.3/src/os/unix/ngx_udp_send.c deleted file mode 100644 index aabbc8e8bd..0000000000 --- a/src/deps/src/nginx-1.30.3/src/os/unix/ngx_udp_send.c +++ /dev/null @@ -1,56 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#include -#include -#include - - -ssize_t -ngx_udp_unix_send(ngx_connection_t *c, u_char *buf, size_t size) -{ - ssize_t n; - ngx_err_t err; - ngx_event_t *wev; - - wev = c->write; - - for ( ;; ) { - n = sendto(c->fd, buf, size, 0, c->sockaddr, c->socklen); - - ngx_log_debug4(NGX_LOG_DEBUG_EVENT, c->log, 0, - "sendto: fd:%d %z of %uz to \"%V\"", - c->fd, n, size, &c->addr_text); - - if (n >= 0) { - if ((size_t) n != size) { - wev->error = 1; - (void) ngx_connection_error(c, 0, "sendto() incomplete"); - return NGX_ERROR; - } - - c->sent += n; - - return n; - } - - err = ngx_socket_errno; - - if (err == NGX_EAGAIN) { - wev->ready = 0; - ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, NGX_EAGAIN, - "sendto() not ready"); - return NGX_AGAIN; - } - - if (err != NGX_EINTR) { - wev->error = 1; - (void) ngx_connection_error(c, err, "sendto() failed"); - return NGX_ERROR; - } - } -} diff --git a/src/deps/src/nginx-1.30.3/src/os/unix/ngx_udp_sendmsg_chain.c b/src/deps/src/nginx-1.30.3/src/os/unix/ngx_udp_sendmsg_chain.c deleted file mode 100644 index fa917b5690..0000000000 --- a/src/deps/src/nginx-1.30.3/src/os/unix/ngx_udp_sendmsg_chain.c +++ /dev/null @@ -1,432 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#include -#include -#include - - -static ngx_chain_t *ngx_udp_output_chain_to_iovec(ngx_iovec_t *vec, - ngx_chain_t *in, ngx_log_t *log); -static ssize_t ngx_sendmsg_vec(ngx_connection_t *c, ngx_iovec_t *vec); - - -ngx_chain_t * -ngx_udp_unix_sendmsg_chain(ngx_connection_t *c, ngx_chain_t *in, off_t limit) -{ - ssize_t n; - off_t send; - ngx_chain_t *cl; - ngx_event_t *wev; - ngx_iovec_t vec; - struct iovec iovs[NGX_IOVS_PREALLOCATE]; - - wev = c->write; - - if (!wev->ready) { - return in; - } - -#if (NGX_HAVE_KQUEUE) - - if ((ngx_event_flags & NGX_USE_KQUEUE_EVENT) && wev->pending_eof) { - (void) ngx_connection_error(c, wev->kq_errno, - "kevent() reported about an closed connection"); - wev->error = 1; - return NGX_CHAIN_ERROR; - } - -#endif - - /* the maximum limit size is the maximum size_t value - the page size */ - - if (limit == 0 || limit > (off_t) (NGX_MAX_SIZE_T_VALUE - ngx_pagesize)) { - limit = NGX_MAX_SIZE_T_VALUE - ngx_pagesize; - } - - send = 0; - - vec.iovs = iovs; - vec.nalloc = NGX_IOVS_PREALLOCATE; - - for ( ;; ) { - - /* create the iovec and coalesce the neighbouring bufs */ - - cl = ngx_udp_output_chain_to_iovec(&vec, in, c->log); - - if (cl == NGX_CHAIN_ERROR) { - return NGX_CHAIN_ERROR; - } - - if (cl && cl->buf->in_file) { - ngx_log_error(NGX_LOG_ALERT, c->log, 0, - "file buf in sendmsg " - "t:%d r:%d f:%d %p %p-%p %p %O-%O", - cl->buf->temporary, - cl->buf->recycled, - cl->buf->in_file, - cl->buf->start, - cl->buf->pos, - cl->buf->last, - cl->buf->file, - cl->buf->file_pos, - cl->buf->file_last); - - ngx_debug_point(); - - return NGX_CHAIN_ERROR; - } - - if (cl == in) { - return in; - } - - send += vec.size; - - n = ngx_sendmsg_vec(c, &vec); - - if (n == NGX_ERROR) { - return NGX_CHAIN_ERROR; - } - - if (n == NGX_AGAIN) { - wev->ready = 0; - return in; - } - - c->sent += n; - - in = ngx_chain_update_sent(in, n); - - if (send >= limit || in == NULL) { - return in; - } - } -} - - -static ngx_chain_t * -ngx_udp_output_chain_to_iovec(ngx_iovec_t *vec, ngx_chain_t *in, ngx_log_t *log) -{ - size_t total, size; - u_char *prev; - ngx_uint_t n, flush; - ngx_chain_t *cl; - struct iovec *iov; - - cl = in; - iov = NULL; - prev = NULL; - total = 0; - n = 0; - flush = 0; - - for ( /* void */ ; in && !flush; in = in->next) { - - if (in->buf->flush || in->buf->last_buf) { - flush = 1; - } - - if (ngx_buf_special(in->buf)) { - continue; - } - - if (in->buf->in_file) { - break; - } - - if (!ngx_buf_in_memory(in->buf)) { - ngx_log_error(NGX_LOG_ALERT, log, 0, - "bad buf in output chain " - "t:%d r:%d f:%d %p %p-%p %p %O-%O", - in->buf->temporary, - in->buf->recycled, - in->buf->in_file, - in->buf->start, - in->buf->pos, - in->buf->last, - in->buf->file, - in->buf->file_pos, - in->buf->file_last); - - ngx_debug_point(); - - return NGX_CHAIN_ERROR; - } - - size = in->buf->last - in->buf->pos; - - if (prev == in->buf->pos) { - iov->iov_len += size; - - } else { - if (n == vec->nalloc) { - ngx_log_error(NGX_LOG_ALERT, log, 0, - "too many parts in a datagram"); - return NGX_CHAIN_ERROR; - } - - iov = &vec->iovs[n++]; - - iov->iov_base = (void *) in->buf->pos; - iov->iov_len = size; - } - - prev = in->buf->pos + size; - total += size; - } - - if (!flush) { -#if (NGX_SUPPRESS_WARN) - vec->size = 0; - vec->count = 0; -#endif - return cl; - } - - /* zero-sized datagram; pretend to have at least 1 iov */ - if (n == 0) { - iov = &vec->iovs[n++]; - iov->iov_base = NULL; - iov->iov_len = 0; - } - - vec->count = n; - vec->size = total; - - return in; -} - - -static ssize_t -ngx_sendmsg_vec(ngx_connection_t *c, ngx_iovec_t *vec) -{ - struct msghdr msg; - -#if (NGX_HAVE_ADDRINFO_CMSG) - struct cmsghdr *cmsg; - u_char msg_control[CMSG_SPACE(sizeof(ngx_addrinfo_t))]; -#endif - - ngx_memzero(&msg, sizeof(struct msghdr)); - - if (c->socklen) { - msg.msg_name = c->sockaddr; - msg.msg_namelen = c->socklen; - } - - msg.msg_iov = vec->iovs; - msg.msg_iovlen = vec->count; - -#if (NGX_HAVE_ADDRINFO_CMSG) - if (c->listening && c->listening->wildcard && c->local_sockaddr) { - - msg.msg_control = msg_control; - msg.msg_controllen = sizeof(msg_control); - ngx_memzero(msg_control, sizeof(msg_control)); - - cmsg = CMSG_FIRSTHDR(&msg); - - msg.msg_controllen = ngx_set_srcaddr_cmsg(cmsg, c->local_sockaddr); - } -#endif - - return ngx_sendmsg(c, &msg, 0); -} - - -#if (NGX_HAVE_ADDRINFO_CMSG) - -size_t -ngx_set_srcaddr_cmsg(struct cmsghdr *cmsg, struct sockaddr *local_sockaddr) -{ - size_t len; -#if (NGX_HAVE_IP_SENDSRCADDR) - struct in_addr *addr; - struct sockaddr_in *sin; -#elif (NGX_HAVE_IP_PKTINFO) - struct in_pktinfo *pkt; - struct sockaddr_in *sin; -#endif - -#if (NGX_HAVE_INET6 && NGX_HAVE_IPV6_RECVPKTINFO) - struct in6_pktinfo *pkt6; - struct sockaddr_in6 *sin6; -#endif - - -#if (NGX_HAVE_IP_SENDSRCADDR) || (NGX_HAVE_IP_PKTINFO) - - if (local_sockaddr->sa_family == AF_INET) { - - cmsg->cmsg_level = IPPROTO_IP; - -#if (NGX_HAVE_IP_SENDSRCADDR) - - cmsg->cmsg_type = IP_SENDSRCADDR; - cmsg->cmsg_len = CMSG_LEN(sizeof(struct in_addr)); - len = CMSG_SPACE(sizeof(struct in_addr)); - - sin = (struct sockaddr_in *) local_sockaddr; - - addr = (struct in_addr *) CMSG_DATA(cmsg); - *addr = sin->sin_addr; - -#elif (NGX_HAVE_IP_PKTINFO) - - cmsg->cmsg_type = IP_PKTINFO; - cmsg->cmsg_len = CMSG_LEN(sizeof(struct in_pktinfo)); - len = CMSG_SPACE(sizeof(struct in_pktinfo)); - - sin = (struct sockaddr_in *) local_sockaddr; - - pkt = (struct in_pktinfo *) CMSG_DATA(cmsg); - ngx_memzero(pkt, sizeof(struct in_pktinfo)); - pkt->ipi_spec_dst = sin->sin_addr; - -#endif - return len; - } - -#endif - -#if (NGX_HAVE_INET6 && NGX_HAVE_IPV6_RECVPKTINFO) - if (local_sockaddr->sa_family == AF_INET6) { - - cmsg->cmsg_level = IPPROTO_IPV6; - cmsg->cmsg_type = IPV6_PKTINFO; - cmsg->cmsg_len = CMSG_LEN(sizeof(struct in6_pktinfo)); - len = CMSG_SPACE(sizeof(struct in6_pktinfo)); - - sin6 = (struct sockaddr_in6 *) local_sockaddr; - - pkt6 = (struct in6_pktinfo *) CMSG_DATA(cmsg); - ngx_memzero(pkt6, sizeof(struct in6_pktinfo)); - pkt6->ipi6_addr = sin6->sin6_addr; - - return len; - } -#endif - - return 0; -} - - -ngx_int_t -ngx_get_srcaddr_cmsg(struct cmsghdr *cmsg, struct sockaddr *local_sockaddr) -{ - -#if (NGX_HAVE_IP_RECVDSTADDR) - struct in_addr *addr; - struct sockaddr_in *sin; -#elif (NGX_HAVE_IP_PKTINFO) - struct in_pktinfo *pkt; - struct sockaddr_in *sin; -#endif - -#if (NGX_HAVE_INET6 && NGX_HAVE_IPV6_RECVPKTINFO) - struct in6_pktinfo *pkt6; - struct sockaddr_in6 *sin6; -#endif - - -#if (NGX_HAVE_IP_RECVDSTADDR) - - if (cmsg->cmsg_level == IPPROTO_IP - && cmsg->cmsg_type == IP_RECVDSTADDR - && local_sockaddr->sa_family == AF_INET) - { - addr = (struct in_addr *) CMSG_DATA(cmsg); - sin = (struct sockaddr_in *) local_sockaddr; - sin->sin_addr = *addr; - - return NGX_OK; - } - -#elif (NGX_HAVE_IP_PKTINFO) - - if (cmsg->cmsg_level == IPPROTO_IP - && cmsg->cmsg_type == IP_PKTINFO - && local_sockaddr->sa_family == AF_INET) - { - pkt = (struct in_pktinfo *) CMSG_DATA(cmsg); - sin = (struct sockaddr_in *) local_sockaddr; - sin->sin_addr = pkt->ipi_addr; - - return NGX_OK; - } - -#endif - -#if (NGX_HAVE_INET6 && NGX_HAVE_IPV6_RECVPKTINFO) - - if (cmsg->cmsg_level == IPPROTO_IPV6 - && cmsg->cmsg_type == IPV6_PKTINFO - && local_sockaddr->sa_family == AF_INET6) - { - pkt6 = (struct in6_pktinfo *) CMSG_DATA(cmsg); - sin6 = (struct sockaddr_in6 *) local_sockaddr; - sin6->sin6_addr = pkt6->ipi6_addr; - - return NGX_OK; - } - -#endif - - return NGX_DECLINED; -} - -#endif - - -ssize_t -ngx_sendmsg(ngx_connection_t *c, struct msghdr *msg, int flags) -{ - ssize_t n; - ngx_err_t err; -#if (NGX_DEBUG) - size_t size; - ngx_uint_t i; -#endif - -eintr: - - n = sendmsg(c->fd, msg, flags); - - if (n == -1) { - err = ngx_errno; - - switch (err) { - case NGX_EAGAIN: - ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, err, - "sendmsg() not ready"); - return NGX_AGAIN; - - case NGX_EINTR: - ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, err, - "sendmsg() was interrupted"); - goto eintr; - - default: - c->write->error = 1; - ngx_connection_error(c, err, "sendmsg() failed"); - return NGX_ERROR; - } - } - -#if (NGX_DEBUG) - for (i = 0, size = 0; i < (size_t) msg->msg_iovlen; i++) { - size += msg->msg_iov[i].iov_len; - } - - ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0, - "sendmsg: %z of %uz", n, size); -#endif - - return n; -} diff --git a/src/deps/src/nginx-1.30.3/src/os/unix/ngx_user.c b/src/deps/src/nginx-1.30.3/src/os/unix/ngx_user.c deleted file mode 100644 index 8c769ed932..0000000000 --- a/src/deps/src/nginx-1.30.3/src/os/unix/ngx_user.c +++ /dev/null @@ -1,84 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#include -#include - - -#if (NGX_CRYPT) - -#if (NGX_HAVE_GNU_CRYPT_R) - -ngx_int_t -ngx_libc_crypt(ngx_pool_t *pool, u_char *key, u_char *salt, u_char **encrypted) -{ - char *value; - size_t len; - struct crypt_data cd; - - cd.initialized = 0; - - value = crypt_r((char *) key, (char *) salt, &cd); - - if (value) { - len = ngx_strlen(value) + 1; - - *encrypted = ngx_pnalloc(pool, len); - if (*encrypted == NULL) { - return NGX_ERROR; - } - - ngx_memcpy(*encrypted, value, len); - return NGX_OK; - } - - ngx_log_error(NGX_LOG_CRIT, pool->log, ngx_errno, "crypt_r() failed"); - - return NGX_ERROR; -} - -#elif (NGX_HAVE_CRYPT) - -ngx_int_t -ngx_libc_crypt(ngx_pool_t *pool, u_char *key, u_char *salt, u_char **encrypted) -{ - char *value; - size_t len; - ngx_err_t err; - - value = crypt((char *) key, (char *) salt); - - if (value) { - len = ngx_strlen(value) + 1; - - *encrypted = ngx_pnalloc(pool, len); - if (*encrypted == NULL) { - return NGX_ERROR; - } - - ngx_memcpy(*encrypted, value, len); - return NGX_OK; - } - - err = ngx_errno; - - ngx_log_error(NGX_LOG_CRIT, pool->log, err, "crypt() failed"); - - return NGX_ERROR; -} - -#else - -ngx_int_t -ngx_libc_crypt(ngx_pool_t *pool, u_char *key, u_char *salt, u_char **encrypted) -{ - return NGX_ERROR; -} - -#endif - -#endif /* NGX_CRYPT */ diff --git a/src/deps/src/nginx-1.30.3/src/os/unix/ngx_user.h b/src/deps/src/nginx-1.30.3/src/os/unix/ngx_user.h deleted file mode 100644 index 6e82204f4d..0000000000 --- a/src/deps/src/nginx-1.30.3/src/os/unix/ngx_user.h +++ /dev/null @@ -1,24 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#ifndef _NGX_USER_H_INCLUDED_ -#define _NGX_USER_H_INCLUDED_ - - -#include -#include - - -typedef uid_t ngx_uid_t; -typedef gid_t ngx_gid_t; - - -ngx_int_t ngx_libc_crypt(ngx_pool_t *pool, u_char *key, u_char *salt, - u_char **encrypted); - - -#endif /* _NGX_USER_H_INCLUDED_ */ diff --git a/src/deps/src/nginx-1.30.3/src/os/unix/ngx_writev_chain.c b/src/deps/src/nginx-1.30.3/src/os/unix/ngx_writev_chain.c deleted file mode 100644 index e38a3aae00..0000000000 --- a/src/deps/src/nginx-1.30.3/src/os/unix/ngx_writev_chain.c +++ /dev/null @@ -1,216 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#include -#include -#include - - -ngx_chain_t * -ngx_writev_chain(ngx_connection_t *c, ngx_chain_t *in, off_t limit) -{ - ssize_t n, sent; - off_t send, prev_send; - ngx_chain_t *cl; - ngx_event_t *wev; - ngx_iovec_t vec; - struct iovec iovs[NGX_IOVS_PREALLOCATE]; - - wev = c->write; - - if (!wev->ready) { - return in; - } - -#if (NGX_HAVE_KQUEUE) - - if ((ngx_event_flags & NGX_USE_KQUEUE_EVENT) && wev->pending_eof) { - (void) ngx_connection_error(c, wev->kq_errno, - "kevent() reported about an closed connection"); - wev->error = 1; - return NGX_CHAIN_ERROR; - } - -#endif - - /* the maximum limit size is the maximum size_t value - the page size */ - - if (limit == 0 || limit > (off_t) (NGX_MAX_SIZE_T_VALUE - ngx_pagesize)) { - limit = NGX_MAX_SIZE_T_VALUE - ngx_pagesize; - } - - send = 0; - - vec.iovs = iovs; - vec.nalloc = NGX_IOVS_PREALLOCATE; - - for ( ;; ) { - prev_send = send; - - /* create the iovec and coalesce the neighbouring bufs */ - - cl = ngx_output_chain_to_iovec(&vec, in, limit - send, c->log); - - if (cl == NGX_CHAIN_ERROR) { - return NGX_CHAIN_ERROR; - } - - if (cl && cl->buf->in_file) { - ngx_log_error(NGX_LOG_ALERT, c->log, 0, - "file buf in writev " - "t:%d r:%d f:%d %p %p-%p %p %O-%O", - cl->buf->temporary, - cl->buf->recycled, - cl->buf->in_file, - cl->buf->start, - cl->buf->pos, - cl->buf->last, - cl->buf->file, - cl->buf->file_pos, - cl->buf->file_last); - - ngx_debug_point(); - - return NGX_CHAIN_ERROR; - } - - send += vec.size; - - n = ngx_writev(c, &vec); - - if (n == NGX_ERROR) { - return NGX_CHAIN_ERROR; - } - - sent = (n == NGX_AGAIN) ? 0 : n; - - c->sent += sent; - - in = ngx_chain_update_sent(in, sent); - - if (send - prev_send != sent) { - wev->ready = 0; - return in; - } - - if (send >= limit || in == NULL) { - return in; - } - } -} - - -ngx_chain_t * -ngx_output_chain_to_iovec(ngx_iovec_t *vec, ngx_chain_t *in, size_t limit, - ngx_log_t *log) -{ - size_t total, size; - u_char *prev; - ngx_uint_t n; - struct iovec *iov; - - iov = NULL; - prev = NULL; - total = 0; - n = 0; - - for ( /* void */ ; in && total < limit; in = in->next) { - - if (ngx_buf_special(in->buf)) { - continue; - } - - if (in->buf->in_file) { - break; - } - - if (!ngx_buf_in_memory(in->buf)) { - ngx_log_error(NGX_LOG_ALERT, log, 0, - "bad buf in output chain " - "t:%d r:%d f:%d %p %p-%p %p %O-%O", - in->buf->temporary, - in->buf->recycled, - in->buf->in_file, - in->buf->start, - in->buf->pos, - in->buf->last, - in->buf->file, - in->buf->file_pos, - in->buf->file_last); - - ngx_debug_point(); - - return NGX_CHAIN_ERROR; - } - - size = in->buf->last - in->buf->pos; - - if (size > limit - total) { - size = limit - total; - } - - if (prev == in->buf->pos) { - iov->iov_len += size; - - } else { - if (n == vec->nalloc) { - break; - } - - iov = &vec->iovs[n++]; - - iov->iov_base = (void *) in->buf->pos; - iov->iov_len = size; - } - - prev = in->buf->pos + size; - total += size; - } - - vec->count = n; - vec->size = total; - - return in; -} - - -ssize_t -ngx_writev(ngx_connection_t *c, ngx_iovec_t *vec) -{ - ssize_t n; - ngx_err_t err; - -eintr: - - n = writev(c->fd, vec->iovs, vec->count); - - ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0, - "writev: %z of %uz", n, vec->size); - - if (n == -1) { - err = ngx_errno; - - switch (err) { - case NGX_EAGAIN: - ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, err, - "writev() not ready"); - return NGX_AGAIN; - - case NGX_EINTR: - ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, err, - "writev() was interrupted"); - goto eintr; - - default: - c->write->error = 1; - ngx_connection_error(c, err, "writev() failed"); - return NGX_ERROR; - } - } - - return n; -} diff --git a/src/deps/src/nginx-1.30.3/src/os/win32/nginx.ico b/src/deps/src/nginx-1.30.3/src/os/win32/nginx.ico deleted file mode 100644 index 70f79db1c631c154f1d5002e0f5fc7139a0358bc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1350 zcma)+ziJ~f5XL`80i|0%KtL|9bQN+C*emZbQl$@RuG{Ud2`K}4i#&qiAbt%&USP{D zmQ21+@~j3wnH z|Av*p*r%x4m7`O=k?!2EM(NI;y_Mc~ABBuiYpmoVw*co9*!C8f0;?j&$UsTVg+oI& zfHNoVM<6HKlLPCf=b0n_Ez-qIKYRZ*j>mN}xi9(6d3zn3qxzW6m-@XgPK9Uuf`3r& zWkvZxncs^RcH`uG>3ETAAokmONyu>{Df1u8&2JkdDcYEVjZM#1QmR$RZtv&aALRRJ z)OrqPMcieeCncHE*h?gSO#Y_MI diff --git a/src/deps/src/nginx-1.30.3/src/os/win32/nginx.rc b/src/deps/src/nginx-1.30.3/src/os/win32/nginx.rc deleted file mode 100644 index dc8b7ab94d..0000000000 --- a/src/deps/src/nginx-1.30.3/src/os/win32/nginx.rc +++ /dev/null @@ -1,6 +0,0 @@ - -// Copyright (C) Igor Sysoev -// Copyright (C) Nginx, Inc. - - -nginx icon discardable "src\\os\\win32\\nginx.ico" diff --git a/src/deps/src/nginx-1.30.3/src/os/win32/nginx_icon16.xpm b/src/deps/src/nginx-1.30.3/src/os/win32/nginx_icon16.xpm deleted file mode 100644 index 45e4bad37e..0000000000 --- a/src/deps/src/nginx-1.30.3/src/os/win32/nginx_icon16.xpm +++ /dev/null @@ -1,24 +0,0 @@ -/* XPM */ -static char * nginx_xpm[] = { -"16 16 2 2", -/* colors */ -" c none", -"GG c #009900", -/* pixels */ -" ", -" GGGGGGGGGGGGGGGG ", -" GGGGGGGGGGGGGGGG ", -" GGGGGGGGGGGGGGGGGGGG ", -" GGGGGG GGGGGG ", -" GGGGGG GGGGGG ", -" GGGGGG ", -" GGGGGG GGGGGGGGGGGGGGGG ", -" GGGGGG GGGGGGGGGGGGGGGGGG ", -" GGGGGG GGGGGGGGGGGGGG ", -" GGGGGG GGGGGG ", -" GGGGGG GGGGGG ", -" GGGGGGGGGGGGGGGGGGGG ", -" GGGGGGGGGGGGGGGG ", -" GGGGGGGGGGGGGGGG ", -" " -}; diff --git a/src/deps/src/nginx-1.30.3/src/os/win32/nginx_icon32.xpm b/src/deps/src/nginx-1.30.3/src/os/win32/nginx_icon32.xpm deleted file mode 100644 index eb26638844..0000000000 --- a/src/deps/src/nginx-1.30.3/src/os/win32/nginx_icon32.xpm +++ /dev/null @@ -1,39 +0,0 @@ -/* XPM */ -static char * nginx_xpm[] = { -"32 32 2 2", -/* colors */ -" c none", -"GG c #009900", -/* pixels */ -" ", -" ", -" ", -" ", -" GGGGGGGGGGGGGGGGGGGGGGGGGGGG ", -" GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG ", -" GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG ", -" GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG ", -" GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG ", -" GGGGGGGGGG GGGGGGGGGG ", -" GGGGGGGGGG GGGGGGGGGG ", -" GGGGGGGGGG GGGGGGGGGG ", -" GGGGGGGGGG GGGGGGGGGG ", -" GGGGGGGGGG ", -" GGGGGGGGGG ", -" GGGGGGGGGG GGGGGGGGGGGGGGGGGGGGGGGGGGGGGG ", -" GGGGGGGGGG GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG ", -" GGGGGGGGGG GGGGGGGGGGGGGGGGGGGGGGGGGGGGGG ", -" GGGGGGGGGG GGGGGGGGGGGGGGGGGGGGGGGGGGGGGG ", -" GGGGGGGGGG GGGGGGGGGGGGGGGGGGGGGGGGGG ", -" GGGGGGGGGG GGGGGGGGGG ", -" GGGGGGGGGG GGGGGGGGGG ", -" GGGGGGGGGG GGGGGGGGGG ", -" GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG ", -" GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG ", -" GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG ", -" GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG ", -" GGGGGGGGGGGGGGGGGGGGGGGGGGGG ", -" ", -" ", -" ", -" " diff --git a/src/deps/src/nginx-1.30.3/src/os/win32/nginx_icon48.xpm b/src/deps/src/nginx-1.30.3/src/os/win32/nginx_icon48.xpm deleted file mode 100644 index c25ba0f2f6..0000000000 --- a/src/deps/src/nginx-1.30.3/src/os/win32/nginx_icon48.xpm +++ /dev/null @@ -1,55 +0,0 @@ -/* XPM */ -static char * nginx_xpm[] = { -"48 48 2 2", -/* colors */ -" c none", -"GG c #009900", -/* pixels */ -" ", -" ", -" ", -" ", -" ", -" GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG ", -" GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG ", -" GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG ", -" GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG ", -" GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG ", -" GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG ", -" GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG ", -" GGGGGGGGGGGGGGGG GGGGGGGGGGGGGGGG ", -" GGGGGGGGGGGGGGGG GGGGGGGGGGGGGGGG ", -" GGGGGGGGGGGGGGGG GGGGGGGGGGGGGGGG ", -" GGGGGGGGGGGGGGGG GGGGGGGGGGGGGGGG ", -" GGGGGGGGGGGGGGGG GGGGGGGGGGGGGGGG ", -" GGGGGGGGGGGGGGGG GGGGGGGGGGGGGGGG ", -" GGGGGGGGGGGGGGGG GGGGGGGGGGGGGGGG ", -" GGGGGGGGGGGGGGGG GGGGGGGGGGGGGGGG ", -" GGGGGGGGGGGGGGGG ", -" GGGGGGGGGGGGGGGG ", -" GGGGGGGGGGGGGGGG ", -" GGGGGGGGGGGGGGGG GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG ", -" GGGGGGGGGGGGGGGG GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG ", -" GGGGGGGGGGGGGGGG GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG ", -" GGGGGGGGGGGGGGGG GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG ", -" GGGGGGGGGGGGGGGG GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG ", -" GGGGGGGGGGGGGGGG GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG ", -" GGGGGGGGGGGGGGGG GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG ", -" GGGGGGGGGGGGGGGG GGGGGGGGGGGGGGGG ", -" GGGGGGGGGGGGGGGG GGGGGGGGGGGGGGGG ", -" GGGGGGGGGGGGGGGG GGGGGGGGGGGGGGGG ", -" GGGGGGGGGGGGGGGG GGGGGGGGGGGGGGGG ", -" GGGGGGGGGGGGGGGG GGGGGGGGGGGGGGGG ", -" GGGGGGGGGGGGGGGG GGGGGGGGGGGGGGGG ", -" GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG ", -" GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG ", -" GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG ", -" GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG ", -" GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG ", -" GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG ", -" GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG ", -" ", -" ", -" ", -" ", -" ", diff --git a/src/deps/src/nginx-1.30.3/src/os/win32/ngx_alloc.c b/src/deps/src/nginx-1.30.3/src/os/win32/ngx_alloc.c deleted file mode 100644 index 0c0ef30f36..0000000000 --- a/src/deps/src/nginx-1.30.3/src/os/win32/ngx_alloc.c +++ /dev/null @@ -1,44 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#include -#include - - -ngx_uint_t ngx_pagesize; -ngx_uint_t ngx_pagesize_shift; -ngx_uint_t ngx_cacheline_size; - - -void *ngx_alloc(size_t size, ngx_log_t *log) -{ - void *p; - - p = malloc(size); - if (p == NULL) { - ngx_log_error(NGX_LOG_EMERG, log, ngx_errno, - "malloc(%uz) failed", size); - } - - ngx_log_debug2(NGX_LOG_DEBUG_ALLOC, log, 0, "malloc: %p:%uz", p, size); - - return p; -} - - -void *ngx_calloc(size_t size, ngx_log_t *log) -{ - void *p; - - p = ngx_alloc(size, log); - - if (p) { - ngx_memzero(p, size); - } - - return p; -} diff --git a/src/deps/src/nginx-1.30.3/src/os/win32/ngx_alloc.h b/src/deps/src/nginx-1.30.3/src/os/win32/ngx_alloc.h deleted file mode 100644 index 5a0fa3f294..0000000000 --- a/src/deps/src/nginx-1.30.3/src/os/win32/ngx_alloc.h +++ /dev/null @@ -1,27 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#ifndef _NGX_ALLOC_H_INCLUDED_ -#define _NGX_ALLOC_H_INCLUDED_ - - -#include -#include - - -void *ngx_alloc(size_t size, ngx_log_t *log); -void *ngx_calloc(size_t size, ngx_log_t *log); - -#define ngx_free free -#define ngx_memalign(alignment, size, log) ngx_alloc(size, log) - -extern ngx_uint_t ngx_pagesize; -extern ngx_uint_t ngx_pagesize_shift; -extern ngx_uint_t ngx_cacheline_size; - - -#endif /* _NGX_ALLOC_H_INCLUDED_ */ diff --git a/src/deps/src/nginx-1.30.3/src/os/win32/ngx_atomic.h b/src/deps/src/nginx-1.30.3/src/os/win32/ngx_atomic.h deleted file mode 100644 index 113f56161f..0000000000 --- a/src/deps/src/nginx-1.30.3/src/os/win32/ngx_atomic.h +++ /dev/null @@ -1,69 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#ifndef _NGX_ATOMIC_H_INCLUDED_ -#define _NGX_ATOMIC_H_INCLUDED_ - - -#include -#include - - -#define NGX_HAVE_ATOMIC_OPS 1 - -typedef int32_t ngx_atomic_int_t; -typedef uint32_t ngx_atomic_uint_t; -typedef volatile ngx_atomic_uint_t ngx_atomic_t; -#define NGX_ATOMIC_T_LEN (sizeof("-2147483648") - 1) - - -#if defined( __WATCOMC__ ) || defined( __BORLANDC__ ) || defined(__GNUC__) \ - || ( _MSC_VER >= 1300 ) - -/* the new SDK headers */ - -#define ngx_atomic_cmp_set(lock, old, set) \ - ((ngx_atomic_uint_t) InterlockedCompareExchange((long *) lock, set, old) \ - == old) - -#else - -/* the old MS VC6.0SP2 SDK headers */ - -#define ngx_atomic_cmp_set(lock, old, set) \ - (InterlockedCompareExchange((void **) lock, (void *) set, (void *) old) \ - == (void *) old) - -#endif - - -#define ngx_atomic_fetch_add(p, add) InterlockedExchangeAdd((long *) p, add) - - -#define ngx_memory_barrier() - - -#if defined( __BORLANDC__ ) || ( __WATCOMC__ < 1230 ) - -/* - * Borland C++ 5.5 (tasm32) and Open Watcom C prior to 1.3 - * do not understand the "pause" instruction - */ - -#define ngx_cpu_pause() -#else -#define ngx_cpu_pause() __asm { pause } -#endif - - -void ngx_spinlock(ngx_atomic_t *lock, ngx_atomic_int_t value, ngx_uint_t spin); - -#define ngx_trylock(lock) (*(lock) == 0 && ngx_atomic_cmp_set(lock, 0, 1)) -#define ngx_unlock(lock) *(lock) = 0 - - -#endif /* _NGX_ATOMIC_H_INCLUDED_ */ diff --git a/src/deps/src/nginx-1.30.3/src/os/win32/ngx_dlopen.c b/src/deps/src/nginx-1.30.3/src/os/win32/ngx_dlopen.c deleted file mode 100644 index 804f49d132..0000000000 --- a/src/deps/src/nginx-1.30.3/src/os/win32/ngx_dlopen.c +++ /dev/null @@ -1,22 +0,0 @@ - -/* - * Copyright (C) Maxim Dounin - * Copyright (C) Nginx, Inc. - */ - - -#include -#include - - -char * -ngx_dlerror(void) -{ - u_char *p; - static u_char errstr[NGX_MAX_ERROR_STR]; - - p = ngx_strerror(ngx_errno, errstr, NGX_MAX_ERROR_STR); - *p = '\0'; - - return (char *) errstr; -} diff --git a/src/deps/src/nginx-1.30.3/src/os/win32/ngx_dlopen.h b/src/deps/src/nginx-1.30.3/src/os/win32/ngx_dlopen.h deleted file mode 100644 index 0d6b40524c..0000000000 --- a/src/deps/src/nginx-1.30.3/src/os/win32/ngx_dlopen.h +++ /dev/null @@ -1,32 +0,0 @@ - -/* - * Copyright (C) Maxim Dounin - * Copyright (C) Nginx, Inc. - */ - - -#ifndef _NGX_DLOPEN_H_INCLUDED_ -#define _NGX_DLOPEN_H_INCLUDED_ - - -#include -#include - - -#define NGX_HAVE_DLOPEN 1 - - -#define ngx_dlopen(path) LoadLibrary((char *) path) -#define ngx_dlopen_n "LoadLibrary()" - -#define ngx_dlsym(handle, symbol) (void *) GetProcAddress(handle, symbol) -#define ngx_dlsym_n "GetProcAddress()" - -#define ngx_dlclose(handle) (FreeLibrary(handle) ? 0 : -1) -#define ngx_dlclose_n "FreeLibrary()" - - -char *ngx_dlerror(void); - - -#endif /* _NGX_DLOPEN_H_INCLUDED_ */ diff --git a/src/deps/src/nginx-1.30.3/src/os/win32/ngx_errno.c b/src/deps/src/nginx-1.30.3/src/os/win32/ngx_errno.c deleted file mode 100644 index 966d3def24..0000000000 --- a/src/deps/src/nginx-1.30.3/src/os/win32/ngx_errno.c +++ /dev/null @@ -1,60 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#include -#include - - -u_char * -ngx_strerror(ngx_err_t err, u_char *errstr, size_t size) -{ - u_int len; - static u_long lang = MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US); - - if (size == 0) { - return errstr; - } - - len = FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, - NULL, err, lang, (char *) errstr, size, NULL); - - if (len == 0 && lang) { - - /* - * Try to use English messages first and fallback to a language, - * based on locale: non-English Windows have no English messages - * at all. This way allows to use English messages at least on - * Windows with MUI. - */ - - lang = 0; - - len = FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, - NULL, err, lang, (char *) errstr, size, NULL); - } - - if (len == 0) { - return ngx_snprintf(errstr, size, - "FormatMessage() error:(%d)", GetLastError()); - } - - /* remove ".\r\n\0" */ - while (errstr[len] == '\0' || errstr[len] == CR - || errstr[len] == LF || errstr[len] == '.') - { - --len; - } - - return &errstr[++len]; -} - - -ngx_int_t -ngx_strerror_init(void) -{ - return NGX_OK; -} diff --git a/src/deps/src/nginx-1.30.3/src/os/win32/ngx_errno.h b/src/deps/src/nginx-1.30.3/src/os/win32/ngx_errno.h deleted file mode 100644 index 1e73a832b0..0000000000 --- a/src/deps/src/nginx-1.30.3/src/os/win32/ngx_errno.h +++ /dev/null @@ -1,72 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#ifndef _NGX_ERRNO_H_INCLUDED_ -#define _NGX_ERRNO_H_INCLUDED_ - - -#include -#include - - -typedef DWORD ngx_err_t; - -#define ngx_errno GetLastError() -#define ngx_set_errno(err) SetLastError(err) -#define ngx_socket_errno WSAGetLastError() -#define ngx_set_socket_errno(err) WSASetLastError(err) - -#define NGX_EPERM ERROR_ACCESS_DENIED -#define NGX_ENOENT ERROR_FILE_NOT_FOUND -#define NGX_ENOPATH ERROR_PATH_NOT_FOUND -#define NGX_ENOMEM ERROR_NOT_ENOUGH_MEMORY -#define NGX_EACCES ERROR_ACCESS_DENIED -/* - * there are two EEXIST error codes: - * ERROR_FILE_EXISTS used by CreateFile(CREATE_NEW), - * and ERROR_ALREADY_EXISTS used by CreateDirectory(); - * MoveFile() uses both - */ -#define NGX_EEXIST ERROR_ALREADY_EXISTS -#define NGX_EEXIST_FILE ERROR_FILE_EXISTS -#define NGX_EXDEV ERROR_NOT_SAME_DEVICE -#define NGX_ENOTDIR ERROR_PATH_NOT_FOUND -#define NGX_EISDIR ERROR_CANNOT_MAKE -#define NGX_ENOSPC ERROR_DISK_FULL -#define NGX_EPIPE EPIPE -#define NGX_EAGAIN WSAEWOULDBLOCK -#define NGX_EINPROGRESS WSAEINPROGRESS -#define NGX_ENOPROTOOPT WSAENOPROTOOPT -#define NGX_EOPNOTSUPP WSAEOPNOTSUPP -#define NGX_EADDRINUSE WSAEADDRINUSE -#define NGX_ECONNABORTED WSAECONNABORTED -#define NGX_ECONNRESET WSAECONNRESET -#define NGX_ENOTCONN WSAENOTCONN -#define NGX_ETIMEDOUT WSAETIMEDOUT -#define NGX_ECONNREFUSED WSAECONNREFUSED -#define NGX_ENAMETOOLONG ERROR_BAD_PATHNAME -#define NGX_ENETDOWN WSAENETDOWN -#define NGX_ENETUNREACH WSAENETUNREACH -#define NGX_EHOSTDOWN WSAEHOSTDOWN -#define NGX_EHOSTUNREACH WSAEHOSTUNREACH -#define NGX_ENOMOREFILES ERROR_NO_MORE_FILES -#define NGX_EILSEQ ERROR_NO_UNICODE_TRANSLATION -#define NGX_ELOOP 0 -#define NGX_EBADF WSAEBADF -#define NGX_EMSGSIZE WSAEMSGSIZE - -#define NGX_EALREADY WSAEALREADY -#define NGX_EINVAL WSAEINVAL -#define NGX_EMFILE WSAEMFILE -#define NGX_ENFILE WSAEMFILE - - -u_char *ngx_strerror(ngx_err_t err, u_char *errstr, size_t size); -ngx_int_t ngx_strerror_init(void); - - -#endif /* _NGX_ERRNO_H_INCLUDED_ */ diff --git a/src/deps/src/nginx-1.30.3/src/os/win32/ngx_event_log.c b/src/deps/src/nginx-1.30.3/src/os/win32/ngx_event_log.c deleted file mode 100644 index e11ed1e82a..0000000000 --- a/src/deps/src/nginx-1.30.3/src/os/win32/ngx_event_log.c +++ /dev/null @@ -1,99 +0,0 @@ -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#include -#include - - -#define NGX_MAX_ERROR_STR 2048 - - -void ngx_cdecl -ngx_event_log(ngx_err_t err, const char *fmt, ...) -{ - u_char *p, *last; - long types; - HKEY key; - HANDLE ev; - va_list args; - u_char text[NGX_MAX_ERROR_STR]; - const char *msgarg[9]; - static u_char netmsg[] = "%SystemRoot%\\System32\\netmsg.dll"; - - last = text + NGX_MAX_ERROR_STR; - p = text + GetModuleFileName(NULL, (char *) text, NGX_MAX_ERROR_STR - 50); - - *p++ = ':'; - ngx_linefeed(p); - - va_start(args, fmt); - p = ngx_vslprintf(p, last, fmt, args); - va_end(args); - - if (err) { - p = ngx_log_errno(p, last, err); - } - - if (p > last - NGX_LINEFEED_SIZE - 1) { - p = last - NGX_LINEFEED_SIZE - 1; - } - - ngx_linefeed(p); - - *p = '\0'; - - /* - * we do not log errors here since we use - * Event Log only to log our own logs open errors - */ - - if (RegCreateKeyEx(HKEY_LOCAL_MACHINE, - "SYSTEM\\CurrentControlSet\\Services\\EventLog\\Application\\nginx", - 0, NULL, REG_OPTION_NON_VOLATILE, KEY_SET_VALUE, NULL, &key, NULL) - != 0) - { - return; - } - - if (RegSetValueEx(key, "EventMessageFile", 0, REG_EXPAND_SZ, - netmsg, sizeof(netmsg) - 1) - != 0) - { - return; - } - - types = EVENTLOG_ERROR_TYPE; - - if (RegSetValueEx(key, "TypesSupported", 0, REG_DWORD, - (u_char *) &types, sizeof(long)) - != 0) - { - return; - } - - RegCloseKey(key); - - ev = RegisterEventSource(NULL, "nginx"); - - msgarg[0] = (char *) text; - msgarg[1] = NULL; - msgarg[2] = NULL; - msgarg[3] = NULL; - msgarg[4] = NULL; - msgarg[5] = NULL; - msgarg[6] = NULL; - msgarg[7] = NULL; - msgarg[8] = NULL; - - /* - * the 3299 event id in netmsg.dll has the generic message format: - * "%1 %2 %3 %4 %5 %6 %7 %8 %9" - */ - - ReportEvent(ev, EVENTLOG_ERROR_TYPE, 0, 3299, NULL, 9, 0, msgarg, NULL); - - DeregisterEventSource(ev); -} diff --git a/src/deps/src/nginx-1.30.3/src/os/win32/ngx_files.c b/src/deps/src/nginx-1.30.3/src/os/win32/ngx_files.c deleted file mode 100644 index 90644ad9c4..0000000000 --- a/src/deps/src/nginx-1.30.3/src/os/win32/ngx_files.c +++ /dev/null @@ -1,1459 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#include -#include - - -#define NGX_UTF16_BUFLEN 256 -#define NGX_UTF8_BUFLEN 512 - -static ngx_int_t ngx_win32_check_filename(u_short *u, size_t len, - ngx_uint_t dirname); -static u_short *ngx_utf8_to_utf16(u_short *utf16, u_char *utf8, size_t *len, - size_t reserved); -static u_char *ngx_utf16_to_utf8(u_char *utf8, u_short *utf16, size_t *len, - size_t *allocated); -uint32_t ngx_utf16_decode(u_short **u, size_t n); - - -/* FILE_FLAG_BACKUP_SEMANTICS allows to obtain a handle to a directory */ - -ngx_fd_t -ngx_open_file(u_char *name, u_long mode, u_long create, u_long access) -{ - size_t len; - u_short *u; - ngx_fd_t fd; - ngx_err_t err; - u_short utf16[NGX_UTF16_BUFLEN]; - - len = NGX_UTF16_BUFLEN; - u = ngx_utf8_to_utf16(utf16, name, &len, 0); - - if (u == NULL) { - return INVALID_HANDLE_VALUE; - } - - fd = INVALID_HANDLE_VALUE; - - if (create == NGX_FILE_OPEN - && ngx_win32_check_filename(u, len, 0) != NGX_OK) - { - goto failed; - } - - fd = CreateFileW(u, mode, - FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE, - NULL, create, FILE_FLAG_BACKUP_SEMANTICS, NULL); - -failed: - - if (u != utf16) { - err = ngx_errno; - ngx_free(u); - ngx_set_errno(err); - } - - return fd; -} - - -ngx_fd_t -ngx_open_tempfile(u_char *name, ngx_uint_t persistent, ngx_uint_t access) -{ - size_t len; - u_short *u; - ngx_fd_t fd; - ngx_err_t err; - u_short utf16[NGX_UTF16_BUFLEN]; - - len = NGX_UTF16_BUFLEN; - u = ngx_utf8_to_utf16(utf16, name, &len, 0); - - if (u == NULL) { - return INVALID_HANDLE_VALUE; - } - - fd = CreateFileW(u, - GENERIC_READ|GENERIC_WRITE, - FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE, - NULL, - CREATE_NEW, - persistent ? 0: - FILE_ATTRIBUTE_TEMPORARY|FILE_FLAG_DELETE_ON_CLOSE, - NULL); - - if (u != utf16) { - err = ngx_errno; - ngx_free(u); - ngx_set_errno(err); - } - - return fd; -} - - -ssize_t -ngx_read_file(ngx_file_t *file, u_char *buf, size_t size, off_t offset) -{ - u_long n; - ngx_err_t err; - OVERLAPPED ovlp, *povlp; - - ovlp.Internal = 0; - ovlp.InternalHigh = 0; - ovlp.Offset = (u_long) offset; - ovlp.OffsetHigh = (u_long) (offset >> 32); - ovlp.hEvent = NULL; - - povlp = &ovlp; - - if (ReadFile(file->fd, buf, size, &n, povlp) == 0) { - err = ngx_errno; - - if (err == ERROR_HANDLE_EOF) { - return 0; - } - - ngx_log_error(NGX_LOG_ERR, file->log, err, - "ReadFile() \"%s\" failed", file->name.data); - return NGX_ERROR; - } - - file->offset += n; - - return n; -} - - -ssize_t -ngx_write_file(ngx_file_t *file, u_char *buf, size_t size, off_t offset) -{ - u_long n; - OVERLAPPED ovlp, *povlp; - - ovlp.Internal = 0; - ovlp.InternalHigh = 0; - ovlp.Offset = (u_long) offset; - ovlp.OffsetHigh = (u_long) (offset >> 32); - ovlp.hEvent = NULL; - - povlp = &ovlp; - - if (WriteFile(file->fd, buf, size, &n, povlp) == 0) { - ngx_log_error(NGX_LOG_ERR, file->log, ngx_errno, - "WriteFile() \"%s\" failed", file->name.data); - return NGX_ERROR; - } - - if (n != size) { - ngx_log_error(NGX_LOG_CRIT, file->log, 0, - "WriteFile() \"%s\" has written only %ul of %uz", - file->name.data, n, size); - return NGX_ERROR; - } - - file->offset += n; - - return n; -} - - -ssize_t -ngx_write_chain_to_file(ngx_file_t *file, ngx_chain_t *cl, off_t offset, - ngx_pool_t *pool) -{ - u_char *buf, *prev; - size_t size; - ssize_t total, n; - - total = 0; - - while (cl) { - buf = cl->buf->pos; - prev = buf; - size = 0; - - /* coalesce the neighbouring bufs */ - - while (cl && prev == cl->buf->pos) { - size += cl->buf->last - cl->buf->pos; - prev = cl->buf->last; - cl = cl->next; - } - - n = ngx_write_file(file, buf, size, offset); - - if (n == NGX_ERROR) { - return NGX_ERROR; - } - - total += n; - offset += n; - } - - return total; -} - - -ssize_t -ngx_read_fd(ngx_fd_t fd, void *buf, size_t size) -{ - u_long n; - - if (ReadFile(fd, buf, size, &n, NULL) != 0) { - return (size_t) n; - } - - return -1; -} - - -ssize_t -ngx_write_fd(ngx_fd_t fd, void *buf, size_t size) -{ - u_long n; - - if (WriteFile(fd, buf, size, &n, NULL) != 0) { - return (size_t) n; - } - - return -1; -} - - -ssize_t -ngx_write_console(ngx_fd_t fd, void *buf, size_t size) -{ - u_long n; - - (void) CharToOemBuff(buf, buf, size); - - if (WriteFile(fd, buf, size, &n, NULL) != 0) { - return (size_t) n; - } - - return -1; -} - - -ngx_int_t -ngx_delete_file(u_char *name) -{ - long rc; - size_t len; - u_short *u; - ngx_err_t err; - u_short utf16[NGX_UTF16_BUFLEN]; - - len = NGX_UTF16_BUFLEN; - u = ngx_utf8_to_utf16(utf16, name, &len, 0); - - if (u == NULL) { - return NGX_FILE_ERROR; - } - - rc = NGX_FILE_ERROR; - - if (ngx_win32_check_filename(u, len, 0) != NGX_OK) { - goto failed; - } - - rc = DeleteFileW(u); - -failed: - - if (u != utf16) { - err = ngx_errno; - ngx_free(u); - ngx_set_errno(err); - } - - return rc; -} - - -ngx_int_t -ngx_rename_file(u_char *from, u_char *to) -{ - long rc; - size_t len; - u_short *fu, *tu; - ngx_err_t err; - u_short utf16f[NGX_UTF16_BUFLEN]; - u_short utf16t[NGX_UTF16_BUFLEN]; - - len = NGX_UTF16_BUFLEN; - fu = ngx_utf8_to_utf16(utf16f, from, &len, 0); - - if (fu == NULL) { - return NGX_FILE_ERROR; - } - - rc = NGX_FILE_ERROR; - tu = NULL; - - if (ngx_win32_check_filename(fu, len, 0) != NGX_OK) { - goto failed; - } - - len = NGX_UTF16_BUFLEN; - tu = ngx_utf8_to_utf16(utf16t, to, &len, 0); - - if (tu == NULL) { - goto failed; - } - - if (ngx_win32_check_filename(tu, len, 1) != NGX_OK) { - goto failed; - } - - rc = MoveFileW(fu, tu); - -failed: - - if (fu != utf16f) { - err = ngx_errno; - ngx_free(fu); - ngx_set_errno(err); - } - - if (tu && tu != utf16t) { - err = ngx_errno; - ngx_free(tu); - ngx_set_errno(err); - } - - return rc; -} - - -ngx_err_t -ngx_win32_rename_file(ngx_str_t *from, ngx_str_t *to, ngx_log_t *log) -{ - u_char *name; - ngx_err_t err; - ngx_uint_t collision; - ngx_atomic_uint_t num; - - name = ngx_alloc(to->len + 1 + NGX_ATOMIC_T_LEN + 1 + sizeof("DELETE"), - log); - if (name == NULL) { - return NGX_ENOMEM; - } - - ngx_memcpy(name, to->data, to->len); - - collision = 0; - - /* mutex_lock() (per cache or single ?) */ - - for ( ;; ) { - num = ngx_next_temp_number(collision); - - ngx_sprintf(name + to->len, ".%0muA.DELETE%Z", num); - - if (ngx_rename_file(to->data, name) != NGX_FILE_ERROR) { - break; - } - - err = ngx_errno; - - if (err == NGX_EEXIST || err == NGX_EEXIST_FILE) { - collision = 1; - continue; - } - - ngx_log_error(NGX_LOG_CRIT, log, err, - "MoveFile() \"%s\" to \"%s\" failed", to->data, name); - goto failed; - } - - if (ngx_rename_file(from->data, to->data) == NGX_FILE_ERROR) { - err = ngx_errno; - - } else { - err = 0; - } - - if (ngx_delete_file(name) == NGX_FILE_ERROR) { - ngx_log_error(NGX_LOG_CRIT, log, ngx_errno, - "DeleteFile() \"%s\" failed", name); - } - -failed: - - /* mutex_unlock() */ - - ngx_free(name); - - return err; -} - - -ngx_int_t -ngx_file_info(u_char *file, ngx_file_info_t *sb) -{ - size_t len; - long rc; - u_short *u; - ngx_err_t err; - WIN32_FILE_ATTRIBUTE_DATA fa; - u_short utf16[NGX_UTF16_BUFLEN]; - - len = NGX_UTF16_BUFLEN; - - u = ngx_utf8_to_utf16(utf16, file, &len, 0); - - if (u == NULL) { - return NGX_FILE_ERROR; - } - - rc = NGX_FILE_ERROR; - - if (ngx_win32_check_filename(u, len, 0) != NGX_OK) { - goto failed; - } - - rc = GetFileAttributesExW(u, GetFileExInfoStandard, &fa); - - sb->dwFileAttributes = fa.dwFileAttributes; - sb->ftCreationTime = fa.ftCreationTime; - sb->ftLastAccessTime = fa.ftLastAccessTime; - sb->ftLastWriteTime = fa.ftLastWriteTime; - sb->nFileSizeHigh = fa.nFileSizeHigh; - sb->nFileSizeLow = fa.nFileSizeLow; - -failed: - - if (u != utf16) { - err = ngx_errno; - ngx_free(u); - ngx_set_errno(err); - } - - return rc; -} - - -ngx_int_t -ngx_set_file_time(u_char *name, ngx_fd_t fd, time_t s) -{ - uint64_t intervals; - FILETIME ft; - - /* 116444736000000000 is commented in src/os/win32/ngx_time.c */ - - intervals = s * 10000000 + 116444736000000000; - - ft.dwLowDateTime = (DWORD) intervals; - ft.dwHighDateTime = (DWORD) (intervals >> 32); - - if (SetFileTime(fd, NULL, NULL, &ft) != 0) { - return NGX_OK; - } - - return NGX_ERROR; -} - - -ngx_int_t -ngx_create_file_mapping(ngx_file_mapping_t *fm) -{ - LARGE_INTEGER size; - - fm->fd = ngx_open_file(fm->name, NGX_FILE_RDWR, NGX_FILE_TRUNCATE, - NGX_FILE_DEFAULT_ACCESS); - - if (fm->fd == NGX_INVALID_FILE) { - ngx_log_error(NGX_LOG_CRIT, fm->log, ngx_errno, - ngx_open_file_n " \"%s\" failed", fm->name); - return NGX_ERROR; - } - - fm->handle = NULL; - - size.QuadPart = fm->size; - - if (SetFilePointerEx(fm->fd, size, NULL, FILE_BEGIN) == 0) { - ngx_log_error(NGX_LOG_CRIT, fm->log, ngx_errno, - "SetFilePointerEx(\"%s\", %uz) failed", - fm->name, fm->size); - goto failed; - } - - if (SetEndOfFile(fm->fd) == 0) { - ngx_log_error(NGX_LOG_CRIT, fm->log, ngx_errno, - "SetEndOfFile() \"%s\" failed", fm->name); - goto failed; - } - - fm->handle = CreateFileMapping(fm->fd, NULL, PAGE_READWRITE, - (u_long) ((off_t) fm->size >> 32), - (u_long) ((off_t) fm->size & 0xffffffff), - NULL); - if (fm->handle == NULL) { - ngx_log_error(NGX_LOG_CRIT, fm->log, ngx_errno, - "CreateFileMapping(%s, %uz) failed", - fm->name, fm->size); - goto failed; - } - - fm->addr = MapViewOfFile(fm->handle, FILE_MAP_WRITE, 0, 0, 0); - - if (fm->addr != NULL) { - return NGX_OK; - } - - ngx_log_error(NGX_LOG_CRIT, fm->log, ngx_errno, - "MapViewOfFile(%uz) of file mapping \"%s\" failed", - fm->size, fm->name); - -failed: - - if (fm->handle) { - if (CloseHandle(fm->handle) == 0) { - ngx_log_error(NGX_LOG_ALERT, fm->log, ngx_errno, - "CloseHandle() of file mapping \"%s\" failed", - fm->name); - } - } - - if (ngx_close_file(fm->fd) == NGX_FILE_ERROR) { - ngx_log_error(NGX_LOG_ALERT, fm->log, ngx_errno, - ngx_close_file_n " \"%s\" failed", fm->name); - } - - return NGX_ERROR; -} - - -void -ngx_close_file_mapping(ngx_file_mapping_t *fm) -{ - if (UnmapViewOfFile(fm->addr) == 0) { - ngx_log_error(NGX_LOG_ALERT, fm->log, ngx_errno, - "UnmapViewOfFile(%p) of file mapping \"%s\" failed", - fm->addr, &fm->name); - } - - if (CloseHandle(fm->handle) == 0) { - ngx_log_error(NGX_LOG_ALERT, fm->log, ngx_errno, - "CloseHandle() of file mapping \"%s\" failed", - &fm->name); - } - - if (ngx_close_file(fm->fd) == NGX_FILE_ERROR) { - ngx_log_error(NGX_LOG_ALERT, fm->log, ngx_errno, - ngx_close_file_n " \"%s\" failed", fm->name); - } -} - - -u_char * -ngx_realpath(u_char *path, u_char *resolved) -{ - /* STUB */ - return path; -} - - -size_t -ngx_getcwd(u_char *buf, size_t size) -{ - u_char *p; - size_t n; - u_short utf16[NGX_MAX_PATH]; - - n = GetCurrentDirectoryW(NGX_MAX_PATH, utf16); - - if (n == 0) { - return 0; - } - - if (n > NGX_MAX_PATH) { - ngx_set_errno(ERROR_INSUFFICIENT_BUFFER); - return 0; - } - - p = ngx_utf16_to_utf8(buf, utf16, &size, NULL); - - if (p == NULL) { - return 0; - } - - if (p != buf) { - ngx_free(p); - ngx_set_errno(ERROR_INSUFFICIENT_BUFFER); - return 0; - } - - return size - 1; -} - - -ngx_int_t -ngx_open_dir(ngx_str_t *name, ngx_dir_t *dir) -{ - size_t len; - u_short *u, *p; - ngx_err_t err; - u_short utf16[NGX_UTF16_BUFLEN]; - - len = NGX_UTF16_BUFLEN - 2; - u = ngx_utf8_to_utf16(utf16, name->data, &len, 2); - - if (u == NULL) { - return NGX_ERROR; - } - - if (ngx_win32_check_filename(u, len, 0) != NGX_OK) { - goto failed; - } - - p = &u[len - 1]; - - *p++ = '/'; - *p++ = '*'; - *p = '\0'; - - dir->dir = FindFirstFileW(u, &dir->finddata); - - if (dir->dir == INVALID_HANDLE_VALUE) { - goto failed; - } - - if (u != utf16) { - ngx_free(u); - } - - dir->valid_info = 1; - dir->ready = 1; - dir->name = NULL; - dir->allocated = 0; - - return NGX_OK; - -failed: - - if (u != utf16) { - err = ngx_errno; - ngx_free(u); - ngx_set_errno(err); - } - - return NGX_ERROR; -} - - -ngx_int_t -ngx_read_dir(ngx_dir_t *dir) -{ - u_char *name; - size_t len, allocated; - - if (dir->ready) { - dir->ready = 0; - goto convert; - } - - if (FindNextFileW(dir->dir, &dir->finddata) != 0) { - dir->type = 1; - goto convert; - } - - return NGX_ERROR; - -convert: - - name = dir->name; - len = dir->allocated; - - name = ngx_utf16_to_utf8(name, dir->finddata.cFileName, &len, &allocated); - - if (name == NULL) { - return NGX_ERROR; - } - - if (name != dir->name) { - - if (dir->name) { - ngx_free(dir->name); - } - - dir->name = name; - dir->allocated = allocated; - } - - dir->namelen = len - 1; - - return NGX_OK; -} - - -ngx_int_t -ngx_close_dir(ngx_dir_t *dir) -{ - if (dir->name) { - ngx_free(dir->name); - } - - if (FindClose(dir->dir) == 0) { - return NGX_ERROR; - } - - return NGX_OK; -} - - -ngx_int_t -ngx_create_dir(u_char *name, ngx_uint_t access) -{ - long rc; - size_t len; - u_short *u; - ngx_err_t err; - u_short utf16[NGX_UTF16_BUFLEN]; - - len = NGX_UTF16_BUFLEN; - u = ngx_utf8_to_utf16(utf16, name, &len, 0); - - if (u == NULL) { - return NGX_FILE_ERROR; - } - - rc = NGX_FILE_ERROR; - - if (ngx_win32_check_filename(u, len, 1) != NGX_OK) { - goto failed; - } - - rc = CreateDirectoryW(u, NULL); - -failed: - - if (u != utf16) { - err = ngx_errno; - ngx_free(u); - ngx_set_errno(err); - } - - return rc; -} - - -ngx_int_t -ngx_delete_dir(u_char *name) -{ - long rc; - size_t len; - u_short *u; - ngx_err_t err; - u_short utf16[NGX_UTF16_BUFLEN]; - - len = NGX_UTF16_BUFLEN; - u = ngx_utf8_to_utf16(utf16, name, &len, 0); - - if (u == NULL) { - return NGX_FILE_ERROR; - } - - rc = NGX_FILE_ERROR; - - if (ngx_win32_check_filename(u, len, 0) != NGX_OK) { - goto failed; - } - - rc = RemoveDirectoryW(u); - -failed: - - if (u != utf16) { - err = ngx_errno; - ngx_free(u); - ngx_set_errno(err); - } - - return rc; -} - - -ngx_int_t -ngx_open_glob(ngx_glob_t *gl) -{ - u_char *p; - size_t len; - u_short *u; - ngx_err_t err; - u_short utf16[NGX_UTF16_BUFLEN]; - - len = NGX_UTF16_BUFLEN; - u = ngx_utf8_to_utf16(utf16, gl->pattern, &len, 0); - - if (u == NULL) { - return NGX_ERROR; - } - - gl->dir = FindFirstFileW(u, &gl->finddata); - - if (gl->dir == INVALID_HANDLE_VALUE) { - - err = ngx_errno; - - if (u != utf16) { - ngx_free(u); - } - - if ((err == ERROR_FILE_NOT_FOUND || err == ERROR_PATH_NOT_FOUND) - && gl->test) - { - gl->no_match = 1; - return NGX_OK; - } - - ngx_set_errno(err); - - return NGX_ERROR; - } - - for (p = gl->pattern; *p; p++) { - if (*p == '/') { - gl->last = p + 1 - gl->pattern; - } - } - - if (u != utf16) { - ngx_free(u); - } - - gl->ready = 1; - - return NGX_OK; -} - - -ngx_int_t -ngx_read_glob(ngx_glob_t *gl, ngx_str_t *name) -{ - u_char *p; - size_t len; - ngx_err_t err; - u_char utf8[NGX_UTF8_BUFLEN]; - - if (gl->no_match) { - return NGX_DONE; - } - - if (gl->ready) { - gl->ready = 0; - goto convert; - } - - ngx_free(gl->name.data); - gl->name.data = NULL; - - if (FindNextFileW(gl->dir, &gl->finddata) != 0) { - goto convert; - } - - err = ngx_errno; - - if (err == NGX_ENOMOREFILES) { - return NGX_DONE; - } - - ngx_log_error(NGX_LOG_ALERT, gl->log, err, - "FindNextFile(%s) failed", gl->pattern); - - return NGX_ERROR; - -convert: - - len = NGX_UTF8_BUFLEN; - p = ngx_utf16_to_utf8(utf8, gl->finddata.cFileName, &len, NULL); - - if (p == NULL) { - return NGX_ERROR; - } - - gl->name.len = gl->last + len - 1; - - gl->name.data = ngx_alloc(gl->name.len + 1, gl->log); - if (gl->name.data == NULL) { - goto failed; - } - - ngx_memcpy(gl->name.data, gl->pattern, gl->last); - ngx_cpystrn(gl->name.data + gl->last, p, len); - - if (p != utf8) { - ngx_free(p); - } - - *name = gl->name; - - return NGX_OK; - -failed: - - if (p != utf8) { - err = ngx_errno; - ngx_free(p); - ngx_set_errno(err); - } - - return NGX_ERROR; -} - - -void -ngx_close_glob(ngx_glob_t *gl) -{ - if (gl->name.data) { - ngx_free(gl->name.data); - } - - if (gl->dir == INVALID_HANDLE_VALUE) { - return; - } - - if (FindClose(gl->dir) == 0) { - ngx_log_error(NGX_LOG_ALERT, gl->log, ngx_errno, - "FindClose(%s) failed", gl->pattern); - } -} - - -ngx_int_t -ngx_de_info(u_char *name, ngx_dir_t *dir) -{ - return NGX_OK; -} - - -ngx_int_t -ngx_de_link_info(u_char *name, ngx_dir_t *dir) -{ - return NGX_OK; -} - - -ngx_int_t -ngx_read_ahead(ngx_fd_t fd, size_t n) -{ - return ~NGX_FILE_ERROR; -} - - -ngx_int_t -ngx_directio_on(ngx_fd_t fd) -{ - return ~NGX_FILE_ERROR; -} - - -ngx_int_t -ngx_directio_off(ngx_fd_t fd) -{ - return ~NGX_FILE_ERROR; -} - - -size_t -ngx_fs_bsize(u_char *name) -{ - u_long sc, bs, nfree, ncl; - size_t len; - u_short *u; - u_short utf16[NGX_UTF16_BUFLEN]; - - len = NGX_UTF16_BUFLEN; - u = ngx_utf8_to_utf16(utf16, name, &len, 0); - - if (u == NULL) { - return 512; - } - - if (GetDiskFreeSpaceW(u, &sc, &bs, &nfree, &ncl) == 0) { - - if (u != utf16) { - ngx_free(u); - } - - return 512; - } - - if (u != utf16) { - ngx_free(u); - } - - return sc * bs; -} - - -off_t -ngx_fs_available(u_char *name) -{ - size_t len; - u_short *u; - ULARGE_INTEGER navail; - u_short utf16[NGX_UTF16_BUFLEN]; - - len = NGX_UTF16_BUFLEN; - u = ngx_utf8_to_utf16(utf16, name, &len, 0); - - if (u == NULL) { - return NGX_MAX_OFF_T_VALUE; - } - - if (GetDiskFreeSpaceExW(u, &navail, NULL, NULL) == 0) { - - if (u != utf16) { - ngx_free(u); - } - - return NGX_MAX_OFF_T_VALUE; - } - - if (u != utf16) { - ngx_free(u); - } - - return (off_t) navail.QuadPart; -} - - -static ngx_int_t -ngx_win32_check_filename(u_short *u, size_t len, ngx_uint_t dirname) -{ - u_long n; - u_short *lu, *p, *slash, ch; - ngx_err_t err; - enum { - sw_start = 0, - sw_normal, - sw_after_slash, - sw_after_colon, - sw_after_dot - } state; - - /* check for NTFS streams (":"), trailing dots and spaces */ - - lu = NULL; - slash = NULL; - state = sw_start; - -#if (NGX_SUPPRESS_WARN) - ch = 0; -#endif - - for (p = u; *p; p++) { - ch = *p; - - switch (state) { - - case sw_start: - - /* - * skip till first "/" to allow paths starting with drive and - * relative path, like "c:html/" - */ - - if (ch == '/' || ch == '\\') { - state = sw_after_slash; - slash = p; - } - - break; - - case sw_normal: - - if (ch == ':') { - state = sw_after_colon; - break; - } - - if (ch == '.' || ch == ' ') { - state = sw_after_dot; - break; - } - - if (ch == '/' || ch == '\\') { - state = sw_after_slash; - slash = p; - break; - } - - break; - - case sw_after_slash: - - if (ch == '/' || ch == '\\') { - break; - } - - if (ch == '.') { - break; - } - - if (ch == ':') { - state = sw_after_colon; - break; - } - - state = sw_normal; - break; - - case sw_after_colon: - - if (ch == '/' || ch == '\\') { - state = sw_after_slash; - slash = p; - break; - } - - goto invalid; - - case sw_after_dot: - - if (ch == '/' || ch == '\\') { - goto invalid; - } - - if (ch == ':') { - goto invalid; - } - - if (ch == '.' || ch == ' ') { - break; - } - - state = sw_normal; - break; - } - } - - if (state == sw_after_dot) { - goto invalid; - } - - if (dirname && slash) { - ch = *slash; - *slash = '\0'; - len = slash - u + 1; - } - - /* check if long name match */ - - lu = malloc(len * 2); - if (lu == NULL) { - return NGX_ERROR; - } - - n = GetLongPathNameW(u, lu, len); - - if (n == 0) { - - if (dirname && slash && ngx_errno == NGX_ENOENT) { - ngx_set_errno(NGX_ENOPATH); - } - - goto failed; - } - - if (n != len - 1 || _wcsicmp(u, lu) != 0) { - goto invalid; - } - - if (dirname && slash) { - *slash = ch; - } - - ngx_free(lu); - - return NGX_OK; - -invalid: - - ngx_set_errno(NGX_ENOENT); - -failed: - - if (dirname && slash) { - *slash = ch; - } - - if (lu) { - err = ngx_errno; - ngx_free(lu); - ngx_set_errno(err); - } - - return NGX_ERROR; -} - - -static u_short * -ngx_utf8_to_utf16(u_short *utf16, u_char *utf8, size_t *len, size_t reserved) -{ - u_char *p; - u_short *u, *last; - uint32_t n; - - p = utf8; - u = utf16; - last = utf16 + *len; - - while (u < last) { - - if (*p < 0x80) { - *u++ = (u_short) *p; - - if (*p == 0) { - *len = u - utf16; - return utf16; - } - - p++; - - continue; - } - - if (u + 1 == last) { - *len = u - utf16; - break; - } - - n = ngx_utf8_decode(&p, 4); - - if (n > 0x10ffff) { - ngx_set_errno(NGX_EILSEQ); - return NULL; - } - - if (n > 0xffff) { - n -= 0x10000; - *u++ = (u_short) (0xd800 + (n >> 10)); - *u++ = (u_short) (0xdc00 + (n & 0x03ff)); - continue; - } - - *u++ = (u_short) n; - } - - /* the given buffer is not enough, allocate a new one */ - - u = malloc(((p - utf8) + ngx_strlen(p) + 1 + reserved) * sizeof(u_short)); - if (u == NULL) { - return NULL; - } - - ngx_memcpy(u, utf16, *len * 2); - - utf16 = u; - u += *len; - - for ( ;; ) { - - if (*p < 0x80) { - *u++ = (u_short) *p; - - if (*p == 0) { - *len = u - utf16; - return utf16; - } - - p++; - - continue; - } - - n = ngx_utf8_decode(&p, 4); - - if (n > 0x10ffff) { - ngx_free(utf16); - ngx_set_errno(NGX_EILSEQ); - return NULL; - } - - if (n > 0xffff) { - n -= 0x10000; - *u++ = (u_short) (0xd800 + (n >> 10)); - *u++ = (u_short) (0xdc00 + (n & 0x03ff)); - continue; - } - - *u++ = (u_short) n; - } - - /* unreachable */ -} - - -static u_char * -ngx_utf16_to_utf8(u_char *utf8, u_short *utf16, size_t *len, size_t *allocated) -{ - u_char *p, *last; - u_short *u, *j; - uint32_t n; - - u = utf16; - p = utf8; - last = utf8 + *len; - - while (p < last) { - - if (*u < 0x80) { - *p++ = (u_char) *u; - - if (*u == 0) { - *len = p - utf8; - return utf8; - } - - u++; - - continue; - } - - if (p >= last - 4) { - *len = p - utf8; - break; - } - - n = ngx_utf16_decode(&u, 2); - - if (n > 0x10ffff) { - ngx_set_errno(NGX_EILSEQ); - return NULL; - } - - if (n >= 0x10000) { - *p++ = (u_char) (0xf0 + (n >> 18)); - *p++ = (u_char) (0x80 + ((n >> 12) & 0x3f)); - *p++ = (u_char) (0x80 + ((n >> 6) & 0x3f)); - *p++ = (u_char) (0x80 + (n & 0x3f)); - continue; - } - - if (n >= 0x0800) { - *p++ = (u_char) (0xe0 + (n >> 12)); - *p++ = (u_char) (0x80 + ((n >> 6) & 0x3f)); - *p++ = (u_char) (0x80 + (n & 0x3f)); - continue; - } - - *p++ = (u_char) (0xc0 + (n >> 6)); - *p++ = (u_char) (0x80 + (n & 0x3f)); - } - - /* the given buffer is not enough, allocate a new one */ - - for (j = u; *j; j++) { /* void */ } - - p = malloc((j - utf16) * 4 + 1); - if (p == NULL) { - return NULL; - } - - if (allocated) { - *allocated = (j - utf16) * 4 + 1; - } - - ngx_memcpy(p, utf8, *len); - - utf8 = p; - p += *len; - - for ( ;; ) { - - if (*u < 0x80) { - *p++ = (u_char) *u; - - if (*u == 0) { - *len = p - utf8; - return utf8; - } - - u++; - - continue; - } - - n = ngx_utf16_decode(&u, 2); - - if (n > 0x10ffff) { - ngx_free(utf8); - ngx_set_errno(NGX_EILSEQ); - return NULL; - } - - if (n >= 0x10000) { - *p++ = (u_char) (0xf0 + (n >> 18)); - *p++ = (u_char) (0x80 + ((n >> 12) & 0x3f)); - *p++ = (u_char) (0x80 + ((n >> 6) & 0x3f)); - *p++ = (u_char) (0x80 + (n & 0x3f)); - continue; - } - - if (n >= 0x0800) { - *p++ = (u_char) (0xe0 + (n >> 12)); - *p++ = (u_char) (0x80 + ((n >> 6) & 0x3f)); - *p++ = (u_char) (0x80 + (n & 0x3f)); - continue; - } - - *p++ = (u_char) (0xc0 + (n >> 6)); - *p++ = (u_char) (0x80 + (n & 0x3f)); - } - - /* unreachable */ -} - - -/* - * ngx_utf16_decode() decodes one or two UTF-16 code units - * the return values: - * 0x80 - 0x10ffff valid character - * 0x110000 - 0xfffffffd invalid sequence - * 0xfffffffe incomplete sequence - * 0xffffffff error - */ - -uint32_t -ngx_utf16_decode(u_short **u, size_t n) -{ - uint32_t k, m; - - k = **u; - - if (k < 0xd800 || k > 0xdfff) { - (*u)++; - return k; - } - - if (k > 0xdbff) { - (*u)++; - return 0xffffffff; - } - - if (n < 2) { - return 0xfffffffe; - } - - (*u)++; - - m = *(*u)++; - - if (m < 0xdc00 || m > 0xdfff) { - return 0xffffffff; - - } - - return 0x10000 + ((k - 0xd800) << 10) + (m - 0xdc00); -} diff --git a/src/deps/src/nginx-1.30.3/src/os/win32/ngx_files.h b/src/deps/src/nginx-1.30.3/src/os/win32/ngx_files.h deleted file mode 100644 index 78ba13a0e9..0000000000 --- a/src/deps/src/nginx-1.30.3/src/os/win32/ngx_files.h +++ /dev/null @@ -1,272 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#ifndef _NGX_FILES_H_INCLUDED_ -#define _NGX_FILES_H_INCLUDED_ - - -#include -#include - - -typedef HANDLE ngx_fd_t; -typedef BY_HANDLE_FILE_INFORMATION ngx_file_info_t; -typedef uint64_t ngx_file_uniq_t; - - -typedef struct { - u_char *name; - size_t size; - void *addr; - ngx_fd_t fd; - HANDLE handle; - ngx_log_t *log; -} ngx_file_mapping_t; - - -typedef struct { - HANDLE dir; - WIN32_FIND_DATAW finddata; - - u_char *name; - size_t namelen; - size_t allocated; - - unsigned valid_info:1; - unsigned type:1; - unsigned ready:1; -} ngx_dir_t; - - -typedef struct { - HANDLE dir; - WIN32_FIND_DATAW finddata; - - unsigned ready:1; - unsigned test:1; - unsigned no_match:1; - - u_char *pattern; - ngx_str_t name; - size_t last; - ngx_log_t *log; -} ngx_glob_t; - - - -/* INVALID_FILE_ATTRIBUTES is specified but not defined at least in MSVC6SP2 */ -#ifndef INVALID_FILE_ATTRIBUTES -#define INVALID_FILE_ATTRIBUTES 0xffffffff -#endif - -/* INVALID_SET_FILE_POINTER is not defined at least in MSVC6SP2 */ -#ifndef INVALID_SET_FILE_POINTER -#define INVALID_SET_FILE_POINTER 0xffffffff -#endif - - -#define NGX_INVALID_FILE INVALID_HANDLE_VALUE -#define NGX_FILE_ERROR 0 - - -ngx_fd_t ngx_open_file(u_char *name, u_long mode, u_long create, u_long access); -#define ngx_open_file_n "CreateFile()" - -#define NGX_FILE_RDONLY GENERIC_READ -#define NGX_FILE_WRONLY GENERIC_WRITE -#define NGX_FILE_RDWR GENERIC_READ|GENERIC_WRITE -#define NGX_FILE_APPEND FILE_APPEND_DATA|SYNCHRONIZE -#define NGX_FILE_NONBLOCK 0 - -#define NGX_FILE_CREATE_OR_OPEN OPEN_ALWAYS -#define NGX_FILE_OPEN OPEN_EXISTING -#define NGX_FILE_TRUNCATE CREATE_ALWAYS - -#define NGX_FILE_DEFAULT_ACCESS 0 -#define NGX_FILE_OWNER_ACCESS 0 - - -ngx_fd_t ngx_open_tempfile(u_char *name, ngx_uint_t persistent, - ngx_uint_t access); -#define ngx_open_tempfile_n "CreateFile()" - - -#define ngx_close_file CloseHandle -#define ngx_close_file_n "CloseHandle()" - - -ssize_t ngx_read_fd(ngx_fd_t fd, void *buf, size_t size); -#define ngx_read_fd_n "ReadFile()" - - -ssize_t ngx_write_fd(ngx_fd_t fd, void *buf, size_t size); -#define ngx_write_fd_n "WriteFile()" - - -ssize_t ngx_write_console(ngx_fd_t fd, void *buf, size_t size); - - -#define ngx_linefeed(p) *p++ = CR; *p++ = LF; -#define NGX_LINEFEED_SIZE 2 -#define NGX_LINEFEED CRLF - - -ngx_int_t ngx_delete_file(u_char *name); -#define ngx_delete_file_n "DeleteFile()" - - -ngx_int_t ngx_rename_file(u_char *from, u_char *to); -#define ngx_rename_file_n "MoveFile()" -ngx_err_t ngx_win32_rename_file(ngx_str_t *from, ngx_str_t *to, ngx_log_t *log); - - - -ngx_int_t ngx_set_file_time(u_char *name, ngx_fd_t fd, time_t s); -#define ngx_set_file_time_n "SetFileTime()" - - -ngx_int_t ngx_file_info(u_char *filename, ngx_file_info_t *fi); -#define ngx_file_info_n "GetFileAttributesEx()" - - -#define ngx_fd_info(fd, fi) GetFileInformationByHandle(fd, fi) -#define ngx_fd_info_n "GetFileInformationByHandle()" - - -#define ngx_link_info(name, fi) ngx_file_info(name, fi) -#define ngx_link_info_n "GetFileAttributesEx()" - - -#define ngx_is_dir(fi) \ - (((fi)->dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) != 0) -#define ngx_is_file(fi) \ - (((fi)->dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) == 0) -#define ngx_is_link(fi) 0 -#define ngx_is_exec(fi) 0 - -#define ngx_file_access(fi) 0 - -#define ngx_file_size(fi) \ - (((off_t) (fi)->nFileSizeHigh << 32) | (fi)->nFileSizeLow) -#define ngx_file_fs_size(fi) ngx_file_size(fi) - -#define ngx_file_uniq(fi) \ - (((ngx_file_uniq_t) (fi)->nFileIndexHigh << 32) | (fi)->nFileIndexLow) - - -/* 116444736000000000 is commented in src/os/win32/ngx_time.c */ - -#define ngx_file_mtime(fi) \ - (time_t) (((((unsigned __int64) (fi)->ftLastWriteTime.dwHighDateTime << 32) \ - | (fi)->ftLastWriteTime.dwLowDateTime) \ - - 116444736000000000) / 10000000) - -ngx_int_t ngx_create_file_mapping(ngx_file_mapping_t *fm); -void ngx_close_file_mapping(ngx_file_mapping_t *fm); - - -u_char *ngx_realpath(u_char *path, u_char *resolved); -#define ngx_realpath_n "" - - -size_t ngx_getcwd(u_char *buf, size_t size); -#define ngx_getcwd_n "GetCurrentDirectory()" - - -#define ngx_path_separator(c) ((c) == '/' || (c) == '\\') - -#define NGX_HAVE_MAX_PATH 1 -#define NGX_MAX_PATH MAX_PATH - - -ngx_int_t ngx_open_dir(ngx_str_t *name, ngx_dir_t *dir); -#define ngx_open_dir_n "FindFirstFile()" - - -ngx_int_t ngx_read_dir(ngx_dir_t *dir); -#define ngx_read_dir_n "FindNextFile()" - - -ngx_int_t ngx_close_dir(ngx_dir_t *dir); -#define ngx_close_dir_n "FindClose()" - - -ngx_int_t ngx_create_dir(u_char *name, ngx_uint_t access); -#define ngx_create_dir_n "CreateDirectory()" - - -ngx_int_t ngx_delete_dir(u_char *name); -#define ngx_delete_dir_n "RemoveDirectory()" - - -#define ngx_dir_access(a) (a) - - -#define ngx_de_name(dir) (dir)->name -#define ngx_de_namelen(dir) (dir)->namelen - -ngx_int_t ngx_de_info(u_char *name, ngx_dir_t *dir); -#define ngx_de_info_n "dummy()" - -ngx_int_t ngx_de_link_info(u_char *name, ngx_dir_t *dir); -#define ngx_de_link_info_n "dummy()" - -#define ngx_de_is_dir(dir) \ - (((dir)->finddata.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) != 0) -#define ngx_de_is_file(dir) \ - (((dir)->finddata.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) == 0) -#define ngx_de_is_link(dir) 0 -#define ngx_de_access(dir) 0 -#define ngx_de_size(dir) \ - (((off_t) (dir)->finddata.nFileSizeHigh << 32) | (dir)->finddata.nFileSizeLow) -#define ngx_de_fs_size(dir) ngx_de_size(dir) - -/* 116444736000000000 is commented in src/os/win32/ngx_time.c */ - -#define ngx_de_mtime(dir) \ - (time_t) (((((unsigned __int64) \ - (dir)->finddata.ftLastWriteTime.dwHighDateTime << 32) \ - | (dir)->finddata.ftLastWriteTime.dwLowDateTime) \ - - 116444736000000000) / 10000000) - - -ngx_int_t ngx_open_glob(ngx_glob_t *gl); -#define ngx_open_glob_n "FindFirstFile()" - -ngx_int_t ngx_read_glob(ngx_glob_t *gl, ngx_str_t *name); -void ngx_close_glob(ngx_glob_t *gl); - - -ssize_t ngx_read_file(ngx_file_t *file, u_char *buf, size_t size, off_t offset); -#define ngx_read_file_n "ReadFile()" - -ssize_t ngx_write_file(ngx_file_t *file, u_char *buf, size_t size, - off_t offset); - -ssize_t ngx_write_chain_to_file(ngx_file_t *file, ngx_chain_t *ce, - off_t offset, ngx_pool_t *pool); - -ngx_int_t ngx_read_ahead(ngx_fd_t fd, size_t n); -#define ngx_read_ahead_n "ngx_read_ahead_n" - -ngx_int_t ngx_directio_on(ngx_fd_t fd); -#define ngx_directio_on_n "ngx_directio_on_n" - -ngx_int_t ngx_directio_off(ngx_fd_t fd); -#define ngx_directio_off_n "ngx_directio_off_n" - -size_t ngx_fs_bsize(u_char *name); -off_t ngx_fs_available(u_char *name); - - -#define ngx_stdout GetStdHandle(STD_OUTPUT_HANDLE) -#define ngx_stderr GetStdHandle(STD_ERROR_HANDLE) -#define ngx_set_stderr(fd) SetStdHandle(STD_ERROR_HANDLE, fd) -#define ngx_set_stderr_n "SetStdHandle(STD_ERROR_HANDLE)" - - -#endif /* _NGX_FILES_H_INCLUDED_ */ diff --git a/src/deps/src/nginx-1.30.3/src/os/win32/ngx_os.h b/src/deps/src/nginx-1.30.3/src/os/win32/ngx_os.h deleted file mode 100644 index 15f5aa0369..0000000000 --- a/src/deps/src/nginx-1.30.3/src/os/win32/ngx_os.h +++ /dev/null @@ -1,68 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#ifndef _NGX_OS_H_INCLUDED_ -#define _NGX_OS_H_INCLUDED_ - - -#include -#include - - -#define NGX_IO_SENDFILE 1 - - -typedef ssize_t (*ngx_recv_pt)(ngx_connection_t *c, u_char *buf, size_t size); -typedef ssize_t (*ngx_recv_chain_pt)(ngx_connection_t *c, ngx_chain_t *in, - off_t limit); -typedef ssize_t (*ngx_send_pt)(ngx_connection_t *c, u_char *buf, size_t size); -typedef ngx_chain_t *(*ngx_send_chain_pt)(ngx_connection_t *c, ngx_chain_t *in, - off_t limit); - -typedef struct { - ngx_recv_pt recv; - ngx_recv_chain_pt recv_chain; - ngx_recv_pt udp_recv; - ngx_send_pt send; - ngx_send_pt udp_send; - ngx_send_chain_pt udp_send_chain; - ngx_send_chain_pt send_chain; - ngx_uint_t flags; -} ngx_os_io_t; - - -ngx_int_t ngx_os_init(ngx_log_t *log); -void ngx_os_status(ngx_log_t *log); -ngx_int_t ngx_os_signal_process(ngx_cycle_t *cycle, char *sig, ngx_pid_t pid); - -ssize_t ngx_wsarecv(ngx_connection_t *c, u_char *buf, size_t size); -ssize_t ngx_overlapped_wsarecv(ngx_connection_t *c, u_char *buf, size_t size); -ssize_t ngx_udp_wsarecv(ngx_connection_t *c, u_char *buf, size_t size); -ssize_t ngx_udp_overlapped_wsarecv(ngx_connection_t *c, u_char *buf, - size_t size); -ssize_t ngx_wsarecv_chain(ngx_connection_t *c, ngx_chain_t *chain, off_t limit); -ssize_t ngx_wsasend(ngx_connection_t *c, u_char *buf, size_t size); -ssize_t ngx_overlapped_wsasend(ngx_connection_t *c, u_char *buf, size_t size); -ngx_chain_t *ngx_wsasend_chain(ngx_connection_t *c, ngx_chain_t *in, - off_t limit); -ngx_chain_t *ngx_overlapped_wsasend_chain(ngx_connection_t *c, ngx_chain_t *in, - off_t limit); - -void ngx_cdecl ngx_event_log(ngx_err_t err, const char *fmt, ...); - - -extern ngx_os_io_t ngx_os_io; -extern ngx_uint_t ngx_ncpu; -extern ngx_uint_t ngx_max_wsabufs; -extern ngx_int_t ngx_max_sockets; -extern ngx_uint_t ngx_inherited_nonblocking; -extern ngx_uint_t ngx_tcp_nodelay_and_tcp_nopush; -extern ngx_uint_t ngx_win32_version; -extern char ngx_unique[]; - - -#endif /* _NGX_OS_H_INCLUDED_ */ diff --git a/src/deps/src/nginx-1.30.3/src/os/win32/ngx_process.c b/src/deps/src/nginx-1.30.3/src/os/win32/ngx_process.c deleted file mode 100644 index 57b1ae9f43..0000000000 --- a/src/deps/src/nginx-1.30.3/src/os/win32/ngx_process.c +++ /dev/null @@ -1,238 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#include -#include - - -int ngx_argc; -char **ngx_argv; -char **ngx_os_argv; - -ngx_int_t ngx_last_process; -ngx_process_t ngx_processes[NGX_MAX_PROCESSES]; - - -ngx_pid_t -ngx_spawn_process(ngx_cycle_t *cycle, char *name, ngx_int_t respawn) -{ - u_long rc, n, code; - ngx_int_t s; - ngx_pid_t pid; - ngx_exec_ctx_t ctx; - HANDLE events[2]; - char file[MAX_PATH + 1]; - - if (respawn >= 0) { - s = respawn; - - } else { - for (s = 0; s < ngx_last_process; s++) { - if (ngx_processes[s].handle == NULL) { - break; - } - } - - if (s == NGX_MAX_PROCESSES) { - ngx_log_error(NGX_LOG_ALERT, cycle->log, 0, - "no more than %d processes can be spawned", - NGX_MAX_PROCESSES); - return NGX_INVALID_PID; - } - } - - n = GetModuleFileName(NULL, file, MAX_PATH); - - if (n == 0) { - ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno, - "GetModuleFileName() failed"); - return NGX_INVALID_PID; - } - - file[n] = '\0'; - - ngx_log_debug1(NGX_LOG_DEBUG_CORE, cycle->log, 0, - "GetModuleFileName: \"%s\"", file); - - ctx.path = file; - ctx.name = name; - ctx.args = GetCommandLine(); - ctx.argv = NULL; - ctx.envp = NULL; - - pid = ngx_execute(cycle, &ctx); - - if (pid == NGX_INVALID_PID) { - return pid; - } - - ngx_memzero(&ngx_processes[s], sizeof(ngx_process_t)); - - ngx_processes[s].handle = ctx.child; - ngx_processes[s].pid = pid; - ngx_processes[s].name = name; - - ngx_sprintf(ngx_processes[s].term_event, "ngx_%s_term_%P%Z", name, pid); - ngx_sprintf(ngx_processes[s].quit_event, "ngx_%s_quit_%P%Z", name, pid); - ngx_sprintf(ngx_processes[s].reopen_event, "ngx_%s_reopen_%P%Z", - name, pid); - - events[0] = ngx_master_process_event; - events[1] = ctx.child; - - rc = WaitForMultipleObjects(2, events, 0, 5000); - - ngx_time_update(); - - ngx_log_debug1(NGX_LOG_DEBUG_CORE, cycle->log, 0, - "WaitForMultipleObjects: %ul", rc); - - switch (rc) { - - case WAIT_OBJECT_0: - - ngx_processes[s].term = OpenEvent(EVENT_MODIFY_STATE, 0, - (char *) ngx_processes[s].term_event); - if (ngx_processes[s].term == NULL) { - ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno, - "OpenEvent(\"%s\") failed", - ngx_processes[s].term_event); - goto failed; - } - - ngx_processes[s].quit = OpenEvent(EVENT_MODIFY_STATE, 0, - (char *) ngx_processes[s].quit_event); - if (ngx_processes[s].quit == NULL) { - ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno, - "OpenEvent(\"%s\") failed", - ngx_processes[s].quit_event); - goto failed; - } - - ngx_processes[s].reopen = OpenEvent(EVENT_MODIFY_STATE, 0, - (char *) ngx_processes[s].reopen_event); - if (ngx_processes[s].reopen == NULL) { - ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno, - "OpenEvent(\"%s\") failed", - ngx_processes[s].reopen_event); - goto failed; - } - - if (ResetEvent(ngx_master_process_event) == 0) { - ngx_log_error(NGX_LOG_ALERT, cycle->log, 0, - "ResetEvent(\"%s\") failed", - ngx_master_process_event_name); - goto failed; - } - - break; - - case WAIT_OBJECT_0 + 1: - if (GetExitCodeProcess(ctx.child, &code) == 0) { - ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno, - "GetExitCodeProcess(%P) failed", pid); - } - - ngx_log_error(NGX_LOG_ALERT, cycle->log, 0, - "%s process %P exited with code %Xl", - name, pid, code); - - goto failed; - - case WAIT_TIMEOUT: - ngx_log_error(NGX_LOG_ALERT, cycle->log, 0, - "the event \"%s\" was not signaled for 5s", - ngx_master_process_event_name); - goto failed; - - case WAIT_FAILED: - ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno, - "WaitForSingleObject(\"%s\") failed", - ngx_master_process_event_name); - - goto failed; - } - - if (respawn >= 0) { - return pid; - } - - switch (respawn) { - - case NGX_PROCESS_RESPAWN: - ngx_processes[s].just_spawn = 0; - break; - - case NGX_PROCESS_JUST_RESPAWN: - ngx_processes[s].just_spawn = 1; - break; - } - - if (s == ngx_last_process) { - ngx_last_process++; - } - - return pid; - -failed: - - if (ngx_processes[s].reopen) { - ngx_close_handle(ngx_processes[s].reopen); - } - - if (ngx_processes[s].quit) { - ngx_close_handle(ngx_processes[s].quit); - } - - if (ngx_processes[s].term) { - ngx_close_handle(ngx_processes[s].term); - } - - TerminateProcess(ngx_processes[s].handle, 2); - - if (ngx_processes[s].handle) { - ngx_close_handle(ngx_processes[s].handle); - ngx_processes[s].handle = NULL; - } - - return NGX_INVALID_PID; -} - - -ngx_pid_t -ngx_execute(ngx_cycle_t *cycle, ngx_exec_ctx_t *ctx) -{ - STARTUPINFO si; - PROCESS_INFORMATION pi; - - ngx_memzero(&si, sizeof(STARTUPINFO)); - si.cb = sizeof(STARTUPINFO); - - ngx_memzero(&pi, sizeof(PROCESS_INFORMATION)); - - if (CreateProcess(ctx->path, ctx->args, - NULL, NULL, 0, CREATE_NO_WINDOW, NULL, NULL, &si, &pi) - == 0) - { - ngx_log_error(NGX_LOG_CRIT, cycle->log, ngx_errno, - "CreateProcess(\"%s\") failed", ngx_argv[0]); - - return 0; - } - - ctx->child = pi.hProcess; - - if (CloseHandle(pi.hThread) == 0) { - ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno, - "CloseHandle(pi.hThread) failed"); - } - - ngx_log_error(NGX_LOG_NOTICE, cycle->log, 0, - "start %s process %P", ctx->name, pi.dwProcessId); - - return pi.dwProcessId; -} diff --git a/src/deps/src/nginx-1.30.3/src/os/win32/ngx_process.h b/src/deps/src/nginx-1.30.3/src/os/win32/ngx_process.h deleted file mode 100644 index 7ec4cd92ce..0000000000 --- a/src/deps/src/nginx-1.30.3/src/os/win32/ngx_process.h +++ /dev/null @@ -1,80 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#ifndef _NGX_PROCESS_H_INCLUDED_ -#define _NGX_PROCESS_H_INCLUDED_ - - -typedef DWORD ngx_pid_t; -#define NGX_INVALID_PID 0 - - -#define ngx_getpid GetCurrentProcessId -#define ngx_getppid() 0 -#define ngx_log_pid ngx_pid - - -#define NGX_PROCESS_SYNC_NAME \ - (sizeof("ngx_cache_manager_mutex_") + NGX_INT32_LEN) - - -typedef uint64_t ngx_cpuset_t; - - -typedef struct { - HANDLE handle; - ngx_pid_t pid; - char *name; - - HANDLE term; - HANDLE quit; - HANDLE reopen; - - u_char term_event[NGX_PROCESS_SYNC_NAME]; - u_char quit_event[NGX_PROCESS_SYNC_NAME]; - u_char reopen_event[NGX_PROCESS_SYNC_NAME]; - - unsigned just_spawn:1; - unsigned exiting:1; -} ngx_process_t; - - -typedef struct { - char *path; - char *name; - char *args; - char *const *argv; - char *const *envp; - HANDLE child; -} ngx_exec_ctx_t; - - -ngx_pid_t ngx_spawn_process(ngx_cycle_t *cycle, char *name, ngx_int_t respawn); -ngx_pid_t ngx_execute(ngx_cycle_t *cycle, ngx_exec_ctx_t *ctx); - -#define ngx_debug_point() -#define ngx_sched_yield() SwitchToThread() - - -#define NGX_MAX_PROCESSES (MAXIMUM_WAIT_OBJECTS - 4) - -#define NGX_PROCESS_RESPAWN -2 -#define NGX_PROCESS_JUST_RESPAWN -3 - - -extern int ngx_argc; -extern char **ngx_argv; -extern char **ngx_os_argv; - -extern ngx_int_t ngx_last_process; -extern ngx_process_t ngx_processes[NGX_MAX_PROCESSES]; - -extern ngx_pid_t ngx_pid; -extern ngx_pid_t ngx_parent; - - -#endif /* _NGX_PROCESS_H_INCLUDED_ */ diff --git a/src/deps/src/nginx-1.30.3/src/os/win32/ngx_process_cycle.c b/src/deps/src/nginx-1.30.3/src/os/win32/ngx_process_cycle.c deleted file mode 100644 index a39335fd16..0000000000 --- a/src/deps/src/nginx-1.30.3/src/os/win32/ngx_process_cycle.c +++ /dev/null @@ -1,1044 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#include -#include -#include -#include - - -static void ngx_console_init(ngx_cycle_t *cycle); -static int __stdcall ngx_console_handler(u_long type); -static ngx_int_t ngx_create_signal_events(ngx_cycle_t *cycle); -static ngx_int_t ngx_start_worker_processes(ngx_cycle_t *cycle, ngx_int_t type); -static void ngx_reopen_worker_processes(ngx_cycle_t *cycle); -static void ngx_quit_worker_processes(ngx_cycle_t *cycle, ngx_uint_t old); -static void ngx_terminate_worker_processes(ngx_cycle_t *cycle); -static ngx_uint_t ngx_reap_worker(ngx_cycle_t *cycle, HANDLE h); -static void ngx_master_process_exit(ngx_cycle_t *cycle); -static void ngx_worker_process_cycle(ngx_cycle_t *cycle, char *mevn); -static void ngx_worker_process_exit(ngx_cycle_t *cycle); -static ngx_thread_value_t __stdcall ngx_worker_thread(void *data); -static ngx_thread_value_t __stdcall ngx_cache_manager_thread(void *data); -static void ngx_cache_manager_process_handler(void); -static ngx_thread_value_t __stdcall ngx_cache_loader_thread(void *data); - - -ngx_uint_t ngx_process; -ngx_uint_t ngx_worker; -ngx_pid_t ngx_pid; -ngx_pid_t ngx_parent; - -ngx_uint_t ngx_inherited; -ngx_pid_t ngx_new_binary; - -sig_atomic_t ngx_terminate; -sig_atomic_t ngx_quit; -sig_atomic_t ngx_reopen; -sig_atomic_t ngx_reconfigure; -ngx_uint_t ngx_exiting; - - -HANDLE ngx_master_process_event; -char ngx_master_process_event_name[NGX_PROCESS_SYNC_NAME]; - -static HANDLE ngx_stop_event; -static char ngx_stop_event_name[NGX_PROCESS_SYNC_NAME]; -static HANDLE ngx_quit_event; -static char ngx_quit_event_name[NGX_PROCESS_SYNC_NAME]; -static HANDLE ngx_reopen_event; -static char ngx_reopen_event_name[NGX_PROCESS_SYNC_NAME]; -static HANDLE ngx_reload_event; -static char ngx_reload_event_name[NGX_PROCESS_SYNC_NAME]; - -HANDLE ngx_cache_manager_mutex; -char ngx_cache_manager_mutex_name[NGX_PROCESS_SYNC_NAME]; -HANDLE ngx_cache_manager_event; - - -void -ngx_master_process_cycle(ngx_cycle_t *cycle) -{ - u_long nev, ev, timeout; - ngx_err_t err; - ngx_int_t n; - ngx_msec_t timer; - ngx_uint_t live; - HANDLE events[MAXIMUM_WAIT_OBJECTS]; - - ngx_sprintf((u_char *) ngx_master_process_event_name, - "ngx_master_%s%Z", ngx_unique); - - if (ngx_process == NGX_PROCESS_WORKER) { - ngx_worker_process_cycle(cycle, ngx_master_process_event_name); - return; - } - - ngx_log_debug0(NGX_LOG_DEBUG_CORE, cycle->log, 0, "master started"); - - ngx_console_init(cycle); - - SetEnvironmentVariable("ngx_unique", ngx_unique); - - ngx_master_process_event = CreateEvent(NULL, 1, 0, - ngx_master_process_event_name); - if (ngx_master_process_event == NULL) { - ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno, - "CreateEvent(\"%s\") failed", - ngx_master_process_event_name); - exit(2); - } - - if (ngx_create_signal_events(cycle) != NGX_OK) { - exit(2); - } - - ngx_sprintf((u_char *) ngx_cache_manager_mutex_name, - "ngx_cache_manager_mutex_%s%Z", ngx_unique); - - ngx_cache_manager_mutex = CreateMutex(NULL, 0, - ngx_cache_manager_mutex_name); - if (ngx_cache_manager_mutex == NULL) { - ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno, - "CreateMutex(\"%s\") failed", ngx_cache_manager_mutex_name); - exit(2); - } - - - events[0] = ngx_stop_event; - events[1] = ngx_quit_event; - events[2] = ngx_reopen_event; - events[3] = ngx_reload_event; - - ngx_close_listening_sockets(cycle); - - if (ngx_start_worker_processes(cycle, NGX_PROCESS_RESPAWN) == 0) { - exit(2); - } - - timer = 0; - timeout = INFINITE; - - for ( ;; ) { - - nev = 4; - for (n = 0; n < ngx_last_process; n++) { - if (ngx_processes[n].handle) { - events[nev++] = ngx_processes[n].handle; - } - } - - if (timer) { - timeout = timer > ngx_current_msec ? timer - ngx_current_msec : 0; - } - - ev = WaitForMultipleObjects(nev, events, 0, timeout); - - err = ngx_errno; - ngx_time_update(); - - ngx_log_debug1(NGX_LOG_DEBUG_CORE, cycle->log, 0, - "master WaitForMultipleObjects: %ul", ev); - - if (ev == WAIT_OBJECT_0) { - ngx_log_error(NGX_LOG_NOTICE, cycle->log, 0, "exiting"); - - if (ResetEvent(ngx_stop_event) == 0) { - ngx_log_error(NGX_LOG_ALERT, cycle->log, 0, - "ResetEvent(\"%s\") failed", ngx_stop_event_name); - } - - if (timer == 0) { - timer = ngx_current_msec + 5000; - } - - ngx_terminate = 1; - ngx_quit_worker_processes(cycle, 0); - - continue; - } - - if (ev == WAIT_OBJECT_0 + 1) { - ngx_log_error(NGX_LOG_NOTICE, cycle->log, 0, "shutting down"); - - if (ResetEvent(ngx_quit_event) == 0) { - ngx_log_error(NGX_LOG_ALERT, cycle->log, 0, - "ResetEvent(\"%s\") failed", ngx_quit_event_name); - } - - ngx_quit = 1; - ngx_quit_worker_processes(cycle, 0); - - continue; - } - - if (ev == WAIT_OBJECT_0 + 2) { - ngx_log_error(NGX_LOG_NOTICE, cycle->log, 0, "reopening logs"); - - if (ResetEvent(ngx_reopen_event) == 0) { - ngx_log_error(NGX_LOG_ALERT, cycle->log, 0, - "ResetEvent(\"%s\") failed", - ngx_reopen_event_name); - } - - ngx_reopen_files(cycle, -1); - ngx_reopen_worker_processes(cycle); - - continue; - } - - if (ev == WAIT_OBJECT_0 + 3) { - ngx_log_error(NGX_LOG_NOTICE, cycle->log, 0, "reconfiguring"); - - if (ResetEvent(ngx_reload_event) == 0) { - ngx_log_error(NGX_LOG_ALERT, cycle->log, 0, - "ResetEvent(\"%s\") failed", - ngx_reload_event_name); - } - - cycle = ngx_init_cycle(cycle); - if (cycle == NULL) { - cycle = (ngx_cycle_t *) ngx_cycle; - continue; - } - - ngx_cycle = cycle; - - ngx_close_listening_sockets(cycle); - - if (ngx_start_worker_processes(cycle, NGX_PROCESS_JUST_RESPAWN)) { - ngx_quit_worker_processes(cycle, 1); - } - - continue; - } - - if (ev > WAIT_OBJECT_0 + 3 && ev < WAIT_OBJECT_0 + nev) { - - ngx_log_debug0(NGX_LOG_DEBUG_CORE, cycle->log, 0, "reap worker"); - - live = ngx_reap_worker(cycle, events[ev]); - - if (!live && (ngx_terminate || ngx_quit)) { - ngx_master_process_exit(cycle); - } - - continue; - } - - if (ev == WAIT_TIMEOUT) { - ngx_terminate_worker_processes(cycle); - - ngx_master_process_exit(cycle); - } - - if (ev == WAIT_FAILED) { - ngx_log_error(NGX_LOG_ALERT, cycle->log, err, - "WaitForMultipleObjects() failed"); - - continue; - } - - ngx_log_error(NGX_LOG_ALERT, cycle->log, 0, - "WaitForMultipleObjects() returned unexpected value %ul", ev); - } -} - - -static void -ngx_console_init(ngx_cycle_t *cycle) -{ - ngx_core_conf_t *ccf; - - ccf = (ngx_core_conf_t *) ngx_get_conf(cycle->conf_ctx, ngx_core_module); - - if (ccf->daemon) { - if (FreeConsole() == 0) { - ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno, - "FreeConsole() failed"); - } - - return; - } - - if (SetConsoleCtrlHandler(ngx_console_handler, 1) == 0) { - ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno, - "SetConsoleCtrlHandler() failed"); - } -} - - -static int __stdcall -ngx_console_handler(u_long type) -{ - char *msg; - - switch (type) { - - case CTRL_C_EVENT: - msg = "Ctrl-C pressed, exiting"; - break; - - case CTRL_BREAK_EVENT: - msg = "Ctrl-Break pressed, exiting"; - break; - - case CTRL_CLOSE_EVENT: - msg = "console closing, exiting"; - break; - - case CTRL_LOGOFF_EVENT: - msg = "user logs off, exiting"; - break; - - default: - return 0; - } - - ngx_log_error(NGX_LOG_NOTICE, ngx_cycle->log, 0, msg); - - if (ngx_stop_event == NULL) { - return 1; - } - - if (SetEvent(ngx_stop_event) == 0) { - ngx_log_error(NGX_LOG_ALERT, ngx_cycle->log, 0, - "SetEvent(\"%s\") failed", ngx_stop_event_name); - } - - return 1; -} - - -static ngx_int_t -ngx_create_signal_events(ngx_cycle_t *cycle) -{ - ngx_sprintf((u_char *) ngx_stop_event_name, - "Global\\ngx_stop_%s%Z", ngx_unique); - - ngx_stop_event = CreateEvent(NULL, 1, 0, ngx_stop_event_name); - if (ngx_stop_event == NULL) { - ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno, - "CreateEvent(\"%s\") failed", ngx_stop_event_name); - return NGX_ERROR; - } - - - ngx_sprintf((u_char *) ngx_quit_event_name, - "Global\\ngx_quit_%s%Z", ngx_unique); - - ngx_quit_event = CreateEvent(NULL, 1, 0, ngx_quit_event_name); - if (ngx_quit_event == NULL) { - ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno, - "CreateEvent(\"%s\") failed", ngx_quit_event_name); - return NGX_ERROR; - } - - - ngx_sprintf((u_char *) ngx_reopen_event_name, - "Global\\ngx_reopen_%s%Z", ngx_unique); - - ngx_reopen_event = CreateEvent(NULL, 1, 0, ngx_reopen_event_name); - if (ngx_reopen_event == NULL) { - ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno, - "CreateEvent(\"%s\") failed", ngx_reopen_event_name); - return NGX_ERROR; - } - - - ngx_sprintf((u_char *) ngx_reload_event_name, - "Global\\ngx_reload_%s%Z", ngx_unique); - - ngx_reload_event = CreateEvent(NULL, 1, 0, ngx_reload_event_name); - if (ngx_reload_event == NULL) { - ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno, - "CreateEvent(\"%s\") failed", ngx_reload_event_name); - return NGX_ERROR; - } - - return NGX_OK; -} - - -static ngx_int_t -ngx_start_worker_processes(ngx_cycle_t *cycle, ngx_int_t type) -{ - ngx_int_t n; - ngx_core_conf_t *ccf; - - ngx_log_error(NGX_LOG_NOTICE, cycle->log, 0, "start worker processes"); - - ccf = (ngx_core_conf_t *) ngx_get_conf(cycle->conf_ctx, ngx_core_module); - - for (n = 0; n < ccf->worker_processes; n++) { - if (ngx_spawn_process(cycle, "worker", type) == NGX_INVALID_PID) { - break; - } - } - - return n; -} - - -static void -ngx_reopen_worker_processes(ngx_cycle_t *cycle) -{ - ngx_int_t n; - - for (n = 0; n < ngx_last_process; n++) { - - if (ngx_processes[n].handle == NULL) { - continue; - } - - if (SetEvent(ngx_processes[n].reopen) == 0) { - ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno, - "SetEvent(\"%s\") failed", - ngx_processes[n].reopen_event); - } - } -} - - -static void -ngx_quit_worker_processes(ngx_cycle_t *cycle, ngx_uint_t old) -{ - ngx_int_t n; - - for (n = 0; n < ngx_last_process; n++) { - - ngx_log_debug5(NGX_LOG_DEBUG_CORE, cycle->log, 0, - "process: %d %P %p e:%d j:%d", - n, - ngx_processes[n].pid, - ngx_processes[n].handle, - ngx_processes[n].exiting, - ngx_processes[n].just_spawn); - - if (old && ngx_processes[n].just_spawn) { - ngx_processes[n].just_spawn = 0; - continue; - } - - if (ngx_processes[n].handle == NULL) { - continue; - } - - if (SetEvent(ngx_processes[n].quit) == 0) { - ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno, - "SetEvent(\"%s\") failed", - ngx_processes[n].quit_event); - } - - ngx_processes[n].exiting = 1; - } -} - - -static void -ngx_terminate_worker_processes(ngx_cycle_t *cycle) -{ - ngx_int_t n; - - for (n = 0; n < ngx_last_process; n++) { - - if (ngx_processes[n].handle == NULL) { - continue; - } - - if (TerminateProcess(ngx_processes[n].handle, 0) == 0) { - ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno, - "TerminateProcess(\"%p\") failed", - ngx_processes[n].handle); - } - - ngx_processes[n].exiting = 1; - - ngx_close_handle(ngx_processes[n].reopen); - ngx_close_handle(ngx_processes[n].quit); - ngx_close_handle(ngx_processes[n].term); - ngx_close_handle(ngx_processes[n].handle); - } -} - - -static ngx_uint_t -ngx_reap_worker(ngx_cycle_t *cycle, HANDLE h) -{ - u_long code; - ngx_int_t n; - - for (n = 0; n < ngx_last_process; n++) { - - if (ngx_processes[n].handle != h) { - continue; - } - - if (GetExitCodeProcess(h, &code) == 0) { - ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno, - "GetExitCodeProcess(%P) failed", - ngx_processes[n].pid); - } - - ngx_log_error(NGX_LOG_NOTICE, cycle->log, 0, - "%s process %P exited with code %Xl", - ngx_processes[n].name, ngx_processes[n].pid, code); - - ngx_close_handle(ngx_processes[n].reopen); - ngx_close_handle(ngx_processes[n].quit); - ngx_close_handle(ngx_processes[n].term); - ngx_close_handle(h); - - ngx_processes[n].handle = NULL; - ngx_processes[n].term = NULL; - ngx_processes[n].quit = NULL; - ngx_processes[n].reopen = NULL; - - if (!ngx_processes[n].exiting && !ngx_terminate && !ngx_quit) { - - if (ngx_spawn_process(cycle, ngx_processes[n].name, n) - == NGX_INVALID_PID) - { - ngx_log_error(NGX_LOG_ALERT, cycle->log, 0, - "could not respawn %s", ngx_processes[n].name); - - if (n == ngx_last_process - 1) { - ngx_last_process--; - } - } - } - - goto found; - } - - ngx_log_error(NGX_LOG_ALERT, cycle->log, 0, "unknown process handle %p", h); - -found: - - for (n = 0; n < ngx_last_process; n++) { - - ngx_log_debug5(NGX_LOG_DEBUG_CORE, cycle->log, 0, - "process: %d %P %p e:%d j:%d", - n, - ngx_processes[n].pid, - ngx_processes[n].handle, - ngx_processes[n].exiting, - ngx_processes[n].just_spawn); - - if (ngx_processes[n].handle) { - return 1; - } - } - - return 0; -} - - -static void -ngx_master_process_exit(ngx_cycle_t *cycle) -{ - ngx_uint_t i; - - ngx_delete_pidfile(cycle); - - ngx_close_handle(ngx_cache_manager_mutex); - ngx_close_handle(ngx_stop_event); - ngx_close_handle(ngx_quit_event); - ngx_close_handle(ngx_reopen_event); - ngx_close_handle(ngx_reload_event); - ngx_close_handle(ngx_master_process_event); - - ngx_log_error(NGX_LOG_NOTICE, cycle->log, 0, "exit"); - - for (i = 0; cycle->modules[i]; i++) { - if (cycle->modules[i]->exit_master) { - cycle->modules[i]->exit_master(cycle); - } - } - - ngx_destroy_pool(cycle->pool); - - exit(0); -} - - -static void -ngx_worker_process_cycle(ngx_cycle_t *cycle, char *mevn) -{ - char wtevn[NGX_PROCESS_SYNC_NAME]; - char wqevn[NGX_PROCESS_SYNC_NAME]; - char wroevn[NGX_PROCESS_SYNC_NAME]; - HANDLE mev, events[3]; - u_long nev, ev; - ngx_err_t err; - ngx_tid_t wtid, cmtid, cltid; - ngx_log_t *log; - - log = cycle->log; - - ngx_log_debug0(NGX_LOG_DEBUG_CORE, log, 0, "worker started"); - - ngx_sprintf((u_char *) wtevn, "ngx_worker_term_%P%Z", ngx_pid); - events[0] = CreateEvent(NULL, 1, 0, wtevn); - if (events[0] == NULL) { - ngx_log_error(NGX_LOG_ALERT, log, ngx_errno, - "CreateEvent(\"%s\") failed", wtevn); - goto failed; - } - - ngx_sprintf((u_char *) wqevn, "ngx_worker_quit_%P%Z", ngx_pid); - events[1] = CreateEvent(NULL, 1, 0, wqevn); - if (events[1] == NULL) { - ngx_log_error(NGX_LOG_ALERT, log, ngx_errno, - "CreateEvent(\"%s\") failed", wqevn); - goto failed; - } - - ngx_sprintf((u_char *) wroevn, "ngx_worker_reopen_%P%Z", ngx_pid); - events[2] = CreateEvent(NULL, 1, 0, wroevn); - if (events[2] == NULL) { - ngx_log_error(NGX_LOG_ALERT, log, ngx_errno, - "CreateEvent(\"%s\") failed", wroevn); - goto failed; - } - - mev = OpenEvent(EVENT_MODIFY_STATE, 0, mevn); - if (mev == NULL) { - ngx_log_error(NGX_LOG_ALERT, log, ngx_errno, - "OpenEvent(\"%s\") failed", mevn); - goto failed; - } - - if (SetEvent(mev) == 0) { - ngx_log_error(NGX_LOG_ALERT, log, ngx_errno, - "SetEvent(\"%s\") failed", mevn); - goto failed; - } - - - ngx_sprintf((u_char *) ngx_cache_manager_mutex_name, - "ngx_cache_manager_mutex_%s%Z", ngx_unique); - - ngx_cache_manager_mutex = OpenMutex(SYNCHRONIZE, 0, - ngx_cache_manager_mutex_name); - if (ngx_cache_manager_mutex == NULL) { - ngx_log_error(NGX_LOG_ALERT, log, ngx_errno, - "OpenMutex(\"%s\") failed", ngx_cache_manager_mutex_name); - goto failed; - } - - ngx_cache_manager_event = CreateEvent(NULL, 1, 0, NULL); - if (ngx_cache_manager_event == NULL) { - ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno, - "CreateEvent(\"ngx_cache_manager_event\") failed"); - goto failed; - } - - - if (ngx_create_thread(&wtid, ngx_worker_thread, NULL, log) != 0) { - goto failed; - } - - if (ngx_create_thread(&cmtid, ngx_cache_manager_thread, NULL, log) != 0) { - goto failed; - } - - if (ngx_create_thread(&cltid, ngx_cache_loader_thread, NULL, log) != 0) { - goto failed; - } - - for ( ;; ) { - ev = WaitForMultipleObjects(3, events, 0, INFINITE); - - err = ngx_errno; - ngx_time_update(); - - ngx_log_debug1(NGX_LOG_DEBUG_CORE, log, 0, - "worker WaitForMultipleObjects: %ul", ev); - - if (ev == WAIT_OBJECT_0) { - ngx_terminate = 1; - ngx_log_error(NGX_LOG_NOTICE, log, 0, "exiting"); - - if (ResetEvent(events[0]) == 0) { - ngx_log_error(NGX_LOG_ALERT, log, 0, - "ResetEvent(\"%s\") failed", wtevn); - } - - break; - } - - if (ev == WAIT_OBJECT_0 + 1) { - ngx_quit = 1; - ngx_log_error(NGX_LOG_NOTICE, log, 0, "gracefully shutting down"); - break; - } - - if (ev == WAIT_OBJECT_0 + 2) { - ngx_reopen = 1; - ngx_log_error(NGX_LOG_NOTICE, log, 0, "reopening logs"); - - if (ResetEvent(events[2]) == 0) { - ngx_log_error(NGX_LOG_ALERT, log, 0, - "ResetEvent(\"%s\") failed", wroevn); - } - - continue; - } - - if (ev == WAIT_FAILED) { - ngx_log_error(NGX_LOG_ALERT, log, err, - "WaitForMultipleObjects() failed"); - - goto failed; - } - } - - /* wait threads */ - - if (SetEvent(ngx_cache_manager_event) == 0) { - ngx_log_error(NGX_LOG_ALERT, log, ngx_errno, - "SetEvent(\"ngx_cache_manager_event\") failed"); - } - - events[1] = wtid; - events[2] = cmtid; - - nev = 3; - - for ( ;; ) { - ev = WaitForMultipleObjects(nev, events, 0, INFINITE); - - err = ngx_errno; - ngx_time_update(); - - ngx_log_debug1(NGX_LOG_DEBUG_CORE, log, 0, - "worker exit WaitForMultipleObjects: %ul", ev); - - if (ev == WAIT_OBJECT_0) { - break; - } - - if (ev == WAIT_OBJECT_0 + 1) { - if (nev == 2) { - break; - } - - events[1] = events[2]; - nev = 2; - continue; - } - - if (ev == WAIT_OBJECT_0 + 2) { - nev = 2; - continue; - } - - if (ev == WAIT_FAILED) { - ngx_log_error(NGX_LOG_ALERT, log, err, - "WaitForMultipleObjects() failed"); - break; - } - } - - ngx_close_handle(ngx_cache_manager_event); - ngx_close_handle(events[0]); - ngx_close_handle(events[1]); - ngx_close_handle(events[2]); - ngx_close_handle(mev); - - ngx_worker_process_exit(cycle); - -failed: - - exit(2); -} - - -static ngx_thread_value_t __stdcall -ngx_worker_thread(void *data) -{ - ngx_int_t n; - ngx_time_t *tp; - ngx_cycle_t *cycle; - - tp = ngx_timeofday(); - srand((ngx_pid << 16) ^ (unsigned) tp->sec ^ tp->msec); - - cycle = (ngx_cycle_t *) ngx_cycle; - - for (n = 0; cycle->modules[n]; n++) { - if (cycle->modules[n]->init_process) { - if (cycle->modules[n]->init_process(cycle) == NGX_ERROR) { - /* fatal */ - exit(2); - } - } - } - - while (!ngx_quit) { - - if (ngx_exiting) { - if (ngx_event_no_timers_left() == NGX_OK) { - break; - } - } - - ngx_log_debug0(NGX_LOG_DEBUG_CORE, cycle->log, 0, "worker cycle"); - - ngx_process_events_and_timers(cycle); - - if (ngx_terminate) { - return 0; - } - - if (ngx_quit) { - ngx_quit = 0; - - if (!ngx_exiting) { - ngx_exiting = 1; - ngx_set_shutdown_timer(cycle); - ngx_close_listening_sockets(cycle); - ngx_close_idle_connections(cycle); - ngx_event_process_posted(cycle, &ngx_posted_events); - } - } - - if (ngx_reopen) { - ngx_reopen = 0; - ngx_reopen_files(cycle, -1); - } - } - - ngx_log_error(NGX_LOG_NOTICE, cycle->log, 0, "exiting"); - - return 0; -} - - -static void -ngx_worker_process_exit(ngx_cycle_t *cycle) -{ - ngx_uint_t i; - ngx_connection_t *c; - - ngx_log_error(NGX_LOG_NOTICE, cycle->log, 0, "exit"); - - for (i = 0; cycle->modules[i]; i++) { - if (cycle->modules[i]->exit_process) { - cycle->modules[i]->exit_process(cycle); - } - } - - if (ngx_exiting && !ngx_terminate) { - c = cycle->connections; - for (i = 0; i < cycle->connection_n; i++) { - if (c[i].fd != (ngx_socket_t) -1 - && c[i].read - && !c[i].read->accept - && !c[i].read->channel - && !c[i].read->resolver) - { - ngx_log_error(NGX_LOG_ALERT, cycle->log, 0, - "*%uA open socket #%d left in connection %ui", - c[i].number, c[i].fd, i); - } - } - } - - ngx_destroy_pool(cycle->pool); - - exit(0); -} - - -static ngx_thread_value_t __stdcall -ngx_cache_manager_thread(void *data) -{ - u_long ev; - HANDLE events[2]; - ngx_err_t err; - ngx_cycle_t *cycle; - - cycle = (ngx_cycle_t *) ngx_cycle; - - events[0] = ngx_cache_manager_event; - events[1] = ngx_cache_manager_mutex; - - for ( ;; ) { - ev = WaitForMultipleObjects(2, events, 0, INFINITE); - - err = ngx_errno; - ngx_time_update(); - - ngx_log_debug1(NGX_LOG_DEBUG_CORE, cycle->log, 0, - "cache manager WaitForMultipleObjects: %ul", ev); - - if (ev == WAIT_FAILED) { - ngx_log_error(NGX_LOG_ALERT, cycle->log, err, - "WaitForMultipleObjects() failed"); - } - - /* - * ev == WAIT_OBJECT_0 - * ev == WAIT_OBJECT_0 + 1 - * ev == WAIT_ABANDONED_0 + 1 - */ - - if (ngx_terminate || ngx_quit || ngx_exiting) { - ngx_log_error(NGX_LOG_NOTICE, cycle->log, 0, "exiting"); - return 0; - } - - break; - } - - for ( ;; ) { - - if (ngx_terminate || ngx_quit || ngx_exiting) { - ngx_log_error(NGX_LOG_NOTICE, cycle->log, 0, "exiting"); - break; - } - - ngx_cache_manager_process_handler(); - } - - if (ReleaseMutex(ngx_cache_manager_mutex) == 0) { - ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno, - "ReleaseMutex() failed"); - } - - return 0; -} - - -static void -ngx_cache_manager_process_handler(void) -{ - u_long ev; - ngx_uint_t i; - ngx_msec_t next, n; - ngx_path_t **path; - - next = 60 * 60 * 1000; - - path = ngx_cycle->paths.elts; - for (i = 0; i < ngx_cycle->paths.nelts; i++) { - - if (path[i]->manager) { - n = path[i]->manager(path[i]->data); - - next = (n <= next) ? n : next; - - ngx_time_update(); - } - } - - if (next == 0) { - next = 1; - } - - ev = WaitForSingleObject(ngx_cache_manager_event, (u_long) next); - - if (ev != WAIT_TIMEOUT) { - - ngx_time_update(); - - ngx_log_debug1(NGX_LOG_DEBUG_CORE, ngx_cycle->log, 0, - "cache manager WaitForSingleObject: %ul", ev); - } -} - - -static ngx_thread_value_t __stdcall -ngx_cache_loader_thread(void *data) -{ - ngx_uint_t i; - ngx_path_t **path; - ngx_cycle_t *cycle; - - ngx_msleep(60000); - - cycle = (ngx_cycle_t *) ngx_cycle; - - path = cycle->paths.elts; - for (i = 0; i < cycle->paths.nelts; i++) { - - if (ngx_terminate || ngx_quit || ngx_exiting) { - break; - } - - if (path[i]->loader) { - path[i]->loader(path[i]->data); - ngx_time_update(); - } - } - - return 0; -} - - -void -ngx_single_process_cycle(ngx_cycle_t *cycle) -{ - ngx_tid_t tid; - - ngx_console_init(cycle); - - if (ngx_create_signal_events(cycle) != NGX_OK) { - exit(2); - } - - if (ngx_create_thread(&tid, ngx_worker_thread, NULL, cycle->log) != 0) { - /* fatal */ - exit(2); - } - - /* STUB */ - WaitForSingleObject(ngx_stop_event, INFINITE); -} - - -ngx_int_t -ngx_os_signal_process(ngx_cycle_t *cycle, char *sig, ngx_pid_t pid) -{ - HANDLE ev; - ngx_int_t rc; - char evn[NGX_PROCESS_SYNC_NAME]; - - ngx_sprintf((u_char *) evn, "Global\\ngx_%s_%P%Z", sig, pid); - - ev = OpenEvent(EVENT_MODIFY_STATE, 0, evn); - if (ev == NULL) { - ngx_log_error(NGX_LOG_ERR, cycle->log, ngx_errno, - "OpenEvent(\"%s\") failed", evn); - return 1; - } - - if (SetEvent(ev) == 0) { - ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno, - "SetEvent(\"%s\") failed", evn); - rc = 1; - - } else { - rc = 0; - } - - ngx_close_handle(ev); - - return rc; -} - - -void -ngx_close_handle(HANDLE h) -{ - if (CloseHandle(h) == 0) { - ngx_log_error(NGX_LOG_ALERT, ngx_cycle->log, ngx_errno, - "CloseHandle(%p) failed", h); - } -} diff --git a/src/deps/src/nginx-1.30.3/src/os/win32/ngx_process_cycle.h b/src/deps/src/nginx-1.30.3/src/os/win32/ngx_process_cycle.h deleted file mode 100644 index 95d2743509..0000000000 --- a/src/deps/src/nginx-1.30.3/src/os/win32/ngx_process_cycle.h +++ /dev/null @@ -1,44 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#ifndef _NGX_PROCESS_CYCLE_H_INCLUDED_ -#define _NGX_PROCESS_CYCLE_H_INCLUDED_ - - -#include -#include - - -#define NGX_PROCESS_SINGLE 0 -#define NGX_PROCESS_MASTER 1 -#define NGX_PROCESS_SIGNALLER 2 -#define NGX_PROCESS_WORKER 3 - - -void ngx_master_process_cycle(ngx_cycle_t *cycle); -void ngx_single_process_cycle(ngx_cycle_t *cycle); -void ngx_close_handle(HANDLE h); - - -extern ngx_uint_t ngx_process; -extern ngx_uint_t ngx_worker; -extern ngx_pid_t ngx_pid; -extern ngx_uint_t ngx_exiting; - -extern sig_atomic_t ngx_quit; -extern sig_atomic_t ngx_terminate; -extern sig_atomic_t ngx_reopen; - -extern ngx_uint_t ngx_inherited; -extern ngx_pid_t ngx_new_binary; - - -extern HANDLE ngx_master_process_event; -extern char ngx_master_process_event_name[]; - - -#endif /* _NGX_PROCESS_CYCLE_H_INCLUDED_ */ diff --git a/src/deps/src/nginx-1.30.3/src/os/win32/ngx_service.c b/src/deps/src/nginx-1.30.3/src/os/win32/ngx_service.c deleted file mode 100644 index 835d9cf000..0000000000 --- a/src/deps/src/nginx-1.30.3/src/os/win32/ngx_service.c +++ /dev/null @@ -1,134 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - - -#define NGX_SERVICE_CONTROL_SHUTDOWN 128 -#define NGX_SERVICE_CONTROL_REOPEN 129 - - -SERVICE_TABLE_ENTRY st[] = { - { "nginx", service_main }, - { NULL, NULL } -}; - - -ngx_int_t -ngx_service(ngx_log_t *log) -{ - /* primary thread */ - - /* StartServiceCtrlDispatcher() should be called within 30 seconds */ - - if (StartServiceCtrlDispatcher(st) == 0) { - ngx_log_error(NGX_LOG_EMERG, log, ngx_errno, - "StartServiceCtrlDispatcher() failed"); - return NGX_ERROR; - } - - return NGX_OK; -} - - -void -service_main(u_int argc, char **argv) -{ - SERVICE_STATUS status; - SERVICE_STATUS_HANDLE service; - - /* thread spawned by SCM */ - - service = RegisterServiceCtrlHandlerEx("nginx", service_handler, ctx); - if (service == INVALID_HANDLE_VALUE) { - ngx_log_error(NGX_LOG_EMERG, log, ngx_errno, - "RegisterServiceCtrlHandlerEx() failed"); - return; - } - - status.dwServiceType = SERVICE_WIN32_OWN_PROCESS; - status.dwCurrentState = SERVICE_START_PENDING; - status.dwControlsAccepted = SERVICE_ACCEPT_STOP - |SERVICE_ACCEPT_PARAMCHANGE; - status.dwWin32ExitCode = NO_ERROR; - status.dwServiceSpecificExitCode = 0; - status.dwCheckPoint = 1; - status.dwWaitHint = 2000; - - /* SetServiceStatus() should be called within 80 seconds */ - - if (SetServiceStatus(service, &status) == 0) { - ngx_log_error(NGX_LOG_EMERG, log, ngx_errno, - "SetServiceStatus() failed"); - return; - } - - /* init */ - - status.dwCurrentState = SERVICE_RUNNING; - status.dwCheckPoint = 0; - status.dwWaitHint = 0; - - if (SetServiceStatus(service, &status) == 0) { - ngx_log_error(NGX_LOG_EMERG, log, ngx_errno, - "SetServiceStatus() failed"); - return; - } - - /* call master or worker loop */ - - /* - * master should use event notification and look status - * single should use iocp to get notifications from service handler - */ - -} - - -u_int -service_handler(u_int control, u_int type, void *data, void *ctx) -{ - /* primary thread */ - - switch (control) { - - case SERVICE_CONTROL_INTERROGATE: - status = NGX_IOCP_INTERROGATE; - break; - - case SERVICE_CONTROL_STOP: - status = NGX_IOCP_STOP; - break; - - case SERVICE_CONTROL_PARAMCHANGE: - status = NGX_IOCP_RECONFIGURE; - break; - - case NGX_SERVICE_CONTROL_SHUTDOWN: - status = NGX_IOCP_REOPEN; - break; - - case NGX_SERVICE_CONTROL_REOPEN: - status = NGX_IOCP_REOPEN; - break; - - default: - return ERROR_CALL_NOT_IMPLEMENTED; - } - - if (ngx_single) { - if (PostQueuedCompletionStatus(iocp, ... status, ...) == 0) { - err = ngx_errno; - ngx_log_error(NGX_LOG_ALERT, log, err, - "PostQueuedCompletionStatus() failed"); - return err; - } - - } else { - Event - } - - return NO_ERROR; -} diff --git a/src/deps/src/nginx-1.30.3/src/os/win32/ngx_shmem.c b/src/deps/src/nginx-1.30.3/src/os/win32/ngx_shmem.c deleted file mode 100644 index 4932764e82..0000000000 --- a/src/deps/src/nginx-1.30.3/src/os/win32/ngx_shmem.c +++ /dev/null @@ -1,161 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#include -#include - - -/* - * Base addresses selected by system for shared memory mappings are likely - * to be different on Windows Vista and later versions due to address space - * layout randomization. This is however incompatible with storing absolute - * addresses within the shared memory. - * - * To make it possible to store absolute addresses we create mappings - * at the same address in all processes by starting mappings at predefined - * addresses. The addresses were selected somewhat randomly in order to - * minimize the probability that some other library doing something similar - * conflicts with us. The addresses are from the following typically free - * blocks: - * - * - 0x10000000 .. 0x70000000 (about 1.5 GB in total) on 32-bit platforms - * - 0x000000007fff0000 .. 0x000007f68e8b0000 (about 8 TB) on 64-bit platforms - * - * Additionally, we allow to change the mapping address once it was detected - * to be different from one originally used. This is needed to support - * reconfiguration. - */ - - -#ifdef _WIN64 -#define NGX_SHMEM_BASE 0x0000047047e00000 -#else -#define NGX_SHMEM_BASE 0x2efe0000 -#endif - - -ngx_uint_t ngx_allocation_granularity; - - -ngx_int_t -ngx_shm_alloc(ngx_shm_t *shm) -{ - u_char *name; - uint64_t size; - static u_char *base = (u_char *) NGX_SHMEM_BASE; - - name = ngx_alloc(shm->name.len + 2 + NGX_INT32_LEN, shm->log); - if (name == NULL) { - return NGX_ERROR; - } - - (void) ngx_sprintf(name, "%V_%s%Z", &shm->name, ngx_unique); - - ngx_set_errno(0); - - size = shm->size; - - shm->handle = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, - (u_long) (size >> 32), - (u_long) (size & 0xffffffff), - (char *) name); - - if (shm->handle == NULL) { - ngx_log_error(NGX_LOG_ALERT, shm->log, ngx_errno, - "CreateFileMapping(%uz, %s) failed", - shm->size, name); - ngx_free(name); - - return NGX_ERROR; - } - - ngx_free(name); - - if (ngx_errno == ERROR_ALREADY_EXISTS) { - shm->exists = 1; - } - - shm->addr = MapViewOfFileEx(shm->handle, FILE_MAP_WRITE, 0, 0, 0, base); - - if (shm->addr != NULL) { - base += ngx_align(shm->size, ngx_allocation_granularity); - return NGX_OK; - } - - ngx_log_debug3(NGX_LOG_DEBUG_CORE, shm->log, ngx_errno, - "MapViewOfFileEx(%uz, %p) of file mapping \"%V\" failed, " - "retry without a base address", - shm->size, base, &shm->name); - - /* - * Order of shared memory zones may be different in the master process - * and worker processes after reconfiguration. As a result, the above - * may fail due to a conflict with a previously created mapping remapped - * to a different address. Additionally, there may be a conflict with - * some other uses of the memory. In this case we retry without a base - * address to let the system assign the address itself. - */ - - shm->addr = MapViewOfFile(shm->handle, FILE_MAP_WRITE, 0, 0, 0); - - if (shm->addr != NULL) { - return NGX_OK; - } - - ngx_log_error(NGX_LOG_ALERT, shm->log, ngx_errno, - "MapViewOfFile(%uz) of file mapping \"%V\" failed", - shm->size, &shm->name); - - if (CloseHandle(shm->handle) == 0) { - ngx_log_error(NGX_LOG_ALERT, shm->log, ngx_errno, - "CloseHandle() of file mapping \"%V\" failed", - &shm->name); - } - - return NGX_ERROR; -} - - -ngx_int_t -ngx_shm_remap(ngx_shm_t *shm, u_char *addr) -{ - if (UnmapViewOfFile(shm->addr) == 0) { - ngx_log_error(NGX_LOG_ALERT, shm->log, ngx_errno, - "UnmapViewOfFile(%p) of file mapping \"%V\" failed", - shm->addr, &shm->name); - return NGX_ERROR; - } - - shm->addr = MapViewOfFileEx(shm->handle, FILE_MAP_WRITE, 0, 0, 0, addr); - - if (shm->addr != NULL) { - return NGX_OK; - } - - ngx_log_error(NGX_LOG_ALERT, shm->log, ngx_errno, - "MapViewOfFileEx(%uz, %p) of file mapping \"%V\" failed", - shm->size, addr, &shm->name); - - return NGX_ERROR; -} - - -void -ngx_shm_free(ngx_shm_t *shm) -{ - if (UnmapViewOfFile(shm->addr) == 0) { - ngx_log_error(NGX_LOG_ALERT, shm->log, ngx_errno, - "UnmapViewOfFile(%p) of file mapping \"%V\" failed", - shm->addr, &shm->name); - } - - if (CloseHandle(shm->handle) == 0) { - ngx_log_error(NGX_LOG_ALERT, shm->log, ngx_errno, - "CloseHandle() of file mapping \"%V\" failed", - &shm->name); - } -} diff --git a/src/deps/src/nginx-1.30.3/src/os/win32/ngx_shmem.h b/src/deps/src/nginx-1.30.3/src/os/win32/ngx_shmem.h deleted file mode 100644 index ee47429331..0000000000 --- a/src/deps/src/nginx-1.30.3/src/os/win32/ngx_shmem.h +++ /dev/null @@ -1,33 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#ifndef _NGX_SHMEM_H_INCLUDED_ -#define _NGX_SHMEM_H_INCLUDED_ - - -#include -#include - - -typedef struct { - u_char *addr; - size_t size; - ngx_str_t name; - HANDLE handle; - ngx_log_t *log; - ngx_uint_t exists; /* unsigned exists:1; */ -} ngx_shm_t; - - -ngx_int_t ngx_shm_alloc(ngx_shm_t *shm); -ngx_int_t ngx_shm_remap(ngx_shm_t *shm, u_char *addr); -void ngx_shm_free(ngx_shm_t *shm); - -extern ngx_uint_t ngx_allocation_granularity; - - -#endif /* _NGX_SHMEM_H_INCLUDED_ */ diff --git a/src/deps/src/nginx-1.30.3/src/os/win32/ngx_socket.c b/src/deps/src/nginx-1.30.3/src/os/win32/ngx_socket.c deleted file mode 100644 index b1b4afb8a0..0000000000 --- a/src/deps/src/nginx-1.30.3/src/os/win32/ngx_socket.c +++ /dev/null @@ -1,49 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#include -#include - - -int -ngx_nonblocking(ngx_socket_t s) -{ - unsigned long nb = 1; - - return ioctlsocket(s, FIONBIO, &nb); -} - - -int -ngx_blocking(ngx_socket_t s) -{ - unsigned long nb = 0; - - return ioctlsocket(s, FIONBIO, &nb); -} - - -int -ngx_socket_nread(ngx_socket_t s, int *n) -{ - unsigned long nread; - - if (ioctlsocket(s, FIONREAD, &nread) == -1) { - return -1; - } - - *n = nread; - - return 0; -} - - -int -ngx_tcp_push(ngx_socket_t s) -{ - return 0; -} diff --git a/src/deps/src/nginx-1.30.3/src/os/win32/ngx_socket.h b/src/deps/src/nginx-1.30.3/src/os/win32/ngx_socket.h deleted file mode 100644 index 5b6138944a..0000000000 --- a/src/deps/src/nginx-1.30.3/src/os/win32/ngx_socket.h +++ /dev/null @@ -1,255 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#ifndef _NGX_SOCKET_H_INCLUDED_ -#define _NGX_SOCKET_H_INCLUDED_ - - -#include -#include - - -#define NGX_WRITE_SHUTDOWN SD_SEND -#define NGX_READ_SHUTDOWN SD_RECEIVE -#define NGX_RDWR_SHUTDOWN SD_BOTH - - -typedef SOCKET ngx_socket_t; -typedef int socklen_t; - - -#define ngx_socket(af, type, proto) \ - WSASocketW(af, type, proto, NULL, 0, WSA_FLAG_OVERLAPPED) - -#define ngx_socket_n "WSASocketW()" - -int ngx_nonblocking(ngx_socket_t s); -int ngx_blocking(ngx_socket_t s); - -#define ngx_nonblocking_n "ioctlsocket(FIONBIO)" -#define ngx_blocking_n "ioctlsocket(!FIONBIO)" - -int ngx_socket_nread(ngx_socket_t s, int *n); -#define ngx_socket_nread_n "ioctlsocket(FIONREAD)" - -#define ngx_shutdown_socket shutdown -#define ngx_shutdown_socket_n "shutdown()" - -#define ngx_close_socket closesocket -#define ngx_close_socket_n "closesocket()" - - -#ifndef WSAID_ACCEPTEX - -typedef BOOL (PASCAL FAR * LPFN_ACCEPTEX)( - IN SOCKET sListenSocket, - IN SOCKET sAcceptSocket, - IN PVOID lpOutputBuffer, - IN DWORD dwReceiveDataLength, - IN DWORD dwLocalAddressLength, - IN DWORD dwRemoteAddressLength, - OUT LPDWORD lpdwBytesReceived, - IN LPOVERLAPPED lpOverlapped - ); - -#define WSAID_ACCEPTEX \ - {0xb5367df1,0xcbac,0x11cf,{0x95,0xca,0x00,0x80,0x5f,0x48,0xa1,0x92}} - -#endif - - -#ifndef WSAID_GETACCEPTEXSOCKADDRS - -typedef VOID (PASCAL FAR * LPFN_GETACCEPTEXSOCKADDRS)( - IN PVOID lpOutputBuffer, - IN DWORD dwReceiveDataLength, - IN DWORD dwLocalAddressLength, - IN DWORD dwRemoteAddressLength, - OUT struct sockaddr **LocalSockaddr, - OUT LPINT LocalSockaddrLength, - OUT struct sockaddr **RemoteSockaddr, - OUT LPINT RemoteSockaddrLength - ); - -#define WSAID_GETACCEPTEXSOCKADDRS \ - {0xb5367df2,0xcbac,0x11cf,{0x95,0xca,0x00,0x80,0x5f,0x48,0xa1,0x92}} - -#endif - - -#ifndef WSAID_TRANSMITFILE - -#ifndef TF_DISCONNECT - -#define TF_DISCONNECT 1 -#define TF_REUSE_SOCKET 2 -#define TF_WRITE_BEHIND 4 -#define TF_USE_DEFAULT_WORKER 0 -#define TF_USE_SYSTEM_THREAD 16 -#define TF_USE_KERNEL_APC 32 - -typedef struct _TRANSMIT_FILE_BUFFERS { - LPVOID Head; - DWORD HeadLength; - LPVOID Tail; - DWORD TailLength; -} TRANSMIT_FILE_BUFFERS, *PTRANSMIT_FILE_BUFFERS, FAR *LPTRANSMIT_FILE_BUFFERS; - -#endif - -typedef BOOL (PASCAL FAR * LPFN_TRANSMITFILE)( - IN SOCKET hSocket, - IN HANDLE hFile, - IN DWORD nNumberOfBytesToWrite, - IN DWORD nNumberOfBytesPerSend, - IN LPOVERLAPPED lpOverlapped, - IN LPTRANSMIT_FILE_BUFFERS lpTransmitBuffers, - IN DWORD dwReserved - ); - -#define WSAID_TRANSMITFILE \ - {0xb5367df0,0xcbac,0x11cf,{0x95,0xca,0x00,0x80,0x5f,0x48,0xa1,0x92}} - -#endif - - -#ifndef WSAID_TRANSMITPACKETS - -/* OpenWatcom has a swapped TP_ELEMENT_FILE and TP_ELEMENT_MEMORY definition */ - -#ifndef TP_ELEMENT_FILE - -#ifdef _MSC_VER -#pragma warning(disable:4201) /* Nonstandard extension, nameless struct/union */ -#endif - -typedef struct _TRANSMIT_PACKETS_ELEMENT { - ULONG dwElFlags; -#define TP_ELEMENT_MEMORY 1 -#define TP_ELEMENT_FILE 2 -#define TP_ELEMENT_EOP 4 - ULONG cLength; - union { - struct { - LARGE_INTEGER nFileOffset; - HANDLE hFile; - }; - PVOID pBuffer; - }; -} TRANSMIT_PACKETS_ELEMENT, *PTRANSMIT_PACKETS_ELEMENT, - FAR *LPTRANSMIT_PACKETS_ELEMENT; - -#ifdef _MSC_VER -#pragma warning(default:4201) -#endif - -#endif - -typedef BOOL (PASCAL FAR * LPFN_TRANSMITPACKETS) ( - SOCKET hSocket, - TRANSMIT_PACKETS_ELEMENT *lpPacketArray, - DWORD nElementCount, - DWORD nSendSize, - LPOVERLAPPED lpOverlapped, - DWORD dwFlags - ); - -#define WSAID_TRANSMITPACKETS \ - {0xd9689da0,0x1f90,0x11d3,{0x99,0x71,0x00,0xc0,0x4f,0x68,0xc8,0x76}} - -#endif - - -#ifndef WSAID_CONNECTEX - -typedef BOOL (PASCAL FAR * LPFN_CONNECTEX) ( - IN SOCKET s, - IN const struct sockaddr FAR *name, - IN int namelen, - IN PVOID lpSendBuffer OPTIONAL, - IN DWORD dwSendDataLength, - OUT LPDWORD lpdwBytesSent, - IN LPOVERLAPPED lpOverlapped - ); - -#define WSAID_CONNECTEX \ - {0x25a207b9,0xddf3,0x4660,{0x8e,0xe9,0x76,0xe5,0x8c,0x74,0x06,0x3e}} - -#endif - - -#ifndef WSAID_DISCONNECTEX - -typedef BOOL (PASCAL FAR * LPFN_DISCONNECTEX) ( - IN SOCKET s, - IN LPOVERLAPPED lpOverlapped, - IN DWORD dwFlags, - IN DWORD dwReserved - ); - -#define WSAID_DISCONNECTEX \ - {0x7fda2e11,0x8630,0x436f,{0xa0,0x31,0xf5,0x36,0xa6,0xee,0xc1,0x57}} - -#endif - - -extern LPFN_ACCEPTEX ngx_acceptex; -extern LPFN_GETACCEPTEXSOCKADDRS ngx_getacceptexsockaddrs; -extern LPFN_TRANSMITFILE ngx_transmitfile; -extern LPFN_TRANSMITPACKETS ngx_transmitpackets; -extern LPFN_CONNECTEX ngx_connectex; -extern LPFN_DISCONNECTEX ngx_disconnectex; - - -#if (NGX_HAVE_POLL && !defined POLLIN) - -/* - * WSAPoll() is only available if _WIN32_WINNT >= 0x0600. - * If it is not available during compilation, we try to - * load it dynamically at runtime. - */ - -#define NGX_LOAD_WSAPOLL 1 - -#define POLLRDNORM 0x0100 -#define POLLRDBAND 0x0200 -#define POLLIN (POLLRDNORM | POLLRDBAND) -#define POLLPRI 0x0400 - -#define POLLWRNORM 0x0010 -#define POLLOUT (POLLWRNORM) -#define POLLWRBAND 0x0020 - -#define POLLERR 0x0001 -#define POLLHUP 0x0002 -#define POLLNVAL 0x0004 - -typedef struct pollfd { - - SOCKET fd; - SHORT events; - SHORT revents; - -} WSAPOLLFD, *PWSAPOLLFD, FAR *LPWSAPOLLFD; - -typedef int (WSAAPI *ngx_wsapoll_pt)( - LPWSAPOLLFD fdArray, - ULONG fds, - INT timeout - ); - -extern ngx_wsapoll_pt WSAPoll; -extern ngx_uint_t ngx_have_wsapoll; - -#endif - - -int ngx_tcp_push(ngx_socket_t s); -#define ngx_tcp_push_n "tcp_push()" - - -#endif /* _NGX_SOCKET_H_INCLUDED_ */ diff --git a/src/deps/src/nginx-1.30.3/src/os/win32/ngx_stat.c b/src/deps/src/nginx-1.30.3/src/os/win32/ngx_stat.c deleted file mode 100644 index 51bcd96292..0000000000 --- a/src/deps/src/nginx-1.30.3/src/os/win32/ngx_stat.c +++ /dev/null @@ -1,34 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#include -#include - - -int ngx_file_type(char *file, ngx_file_info_t *sb) -{ - sb->dwFileAttributes = GetFileAttributes(file); - - if (sb->dwFileAttributes == INVALID_FILE_ATTRIBUTES) { - return -1; - } - - return 0; -} - -/* -int ngx_stat(char *file, ngx_stat_t *sb) -{ - *sb = GetFileAttributes(file); - - if (*sb == INVALID_FILE_ATTRIBUTES) { - return -1; - } - - return 0; -} -*/ diff --git a/src/deps/src/nginx-1.30.3/src/os/win32/ngx_thread.c b/src/deps/src/nginx-1.30.3/src/os/win32/ngx_thread.c deleted file mode 100644 index a13de2d093..0000000000 --- a/src/deps/src/nginx-1.30.3/src/os/win32/ngx_thread.c +++ /dev/null @@ -1,30 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#include -#include - - -ngx_err_t -ngx_create_thread(ngx_tid_t *tid, - ngx_thread_value_t (__stdcall *func)(void *arg), void *arg, ngx_log_t *log) -{ - u_long id; - ngx_err_t err; - - *tid = CreateThread(NULL, 0, func, arg, 0, &id); - - if (*tid != NULL) { - ngx_log_error(NGX_LOG_NOTICE, log, 0, - "create thread " NGX_TID_T_FMT, id); - return 0; - } - - err = ngx_errno; - ngx_log_error(NGX_LOG_ALERT, log, err, "CreateThread() failed"); - return err; -} diff --git a/src/deps/src/nginx-1.30.3/src/os/win32/ngx_thread.h b/src/deps/src/nginx-1.30.3/src/os/win32/ngx_thread.h deleted file mode 100644 index 40122768c7..0000000000 --- a/src/deps/src/nginx-1.30.3/src/os/win32/ngx_thread.h +++ /dev/null @@ -1,27 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#ifndef _NGX_THREAD_H_INCLUDED_ -#define _NGX_THREAD_H_INCLUDED_ - - -#include -#include - - -typedef HANDLE ngx_tid_t; -typedef DWORD ngx_thread_value_t; - - -ngx_err_t ngx_create_thread(ngx_tid_t *tid, - ngx_thread_value_t (__stdcall *func)(void *arg), void *arg, ngx_log_t *log); - -#define ngx_log_tid GetCurrentThreadId() -#define NGX_TID_T_FMT "%ud" - - -#endif /* _NGX_THREAD_H_INCLUDED_ */ diff --git a/src/deps/src/nginx-1.30.3/src/os/win32/ngx_time.c b/src/deps/src/nginx-1.30.3/src/os/win32/ngx_time.c deleted file mode 100644 index 79149b2c71..0000000000 --- a/src/deps/src/nginx-1.30.3/src/os/win32/ngx_time.c +++ /dev/null @@ -1,83 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#include -#include - - -void -ngx_gettimeofday(struct timeval *tp) -{ - uint64_t intervals; - FILETIME ft; - - GetSystemTimeAsFileTime(&ft); - - /* - * A file time is a 64-bit value that represents the number - * of 100-nanosecond intervals that have elapsed since - * January 1, 1601 12:00 A.M. UTC. - * - * Between January 1, 1970 (Epoch) and January 1, 1601 there were - * 134774 days, - * 11644473600 seconds or - * 11644473600,000,000,0 100-nanosecond intervals. - * - * See also MSKB Q167296. - */ - - intervals = ((uint64_t) ft.dwHighDateTime << 32) | ft.dwLowDateTime; - intervals -= 116444736000000000; - - tp->tv_sec = (long) (intervals / 10000000); - tp->tv_usec = (long) ((intervals % 10000000) / 10); -} - - -void -ngx_libc_localtime(time_t s, struct tm *tm) -{ - struct tm *t; - - t = localtime(&s); - *tm = *t; -} - - -void -ngx_libc_gmtime(time_t s, struct tm *tm) -{ - struct tm *t; - - t = gmtime(&s); - *tm = *t; -} - - -ngx_int_t -ngx_gettimezone(void) -{ - u_long n; - TIME_ZONE_INFORMATION tz; - - n = GetTimeZoneInformation(&tz); - - switch (n) { - - case TIME_ZONE_ID_UNKNOWN: - return -tz.Bias; - - case TIME_ZONE_ID_STANDARD: - return -(tz.Bias + tz.StandardBias); - - case TIME_ZONE_ID_DAYLIGHT: - return -(tz.Bias + tz.DaylightBias); - - default: /* TIME_ZONE_ID_INVALID */ - return 0; - } -} diff --git a/src/deps/src/nginx-1.30.3/src/os/win32/ngx_time.h b/src/deps/src/nginx-1.30.3/src/os/win32/ngx_time.h deleted file mode 100644 index 6c2f806f30..0000000000 --- a/src/deps/src/nginx-1.30.3/src/os/win32/ngx_time.h +++ /dev/null @@ -1,51 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#ifndef _NGX_TIME_H_INCLUDED_ -#define _NGX_TIME_H_INCLUDED_ - - -#include -#include - - -typedef ngx_rbtree_key_t ngx_msec_t; -typedef ngx_rbtree_key_int_t ngx_msec_int_t; - -typedef SYSTEMTIME ngx_tm_t; -typedef FILETIME ngx_mtime_t; - -#define ngx_tm_sec wSecond -#define ngx_tm_min wMinute -#define ngx_tm_hour wHour -#define ngx_tm_mday wDay -#define ngx_tm_mon wMonth -#define ngx_tm_year wYear -#define ngx_tm_wday wDayOfWeek - -#define ngx_tm_sec_t u_short -#define ngx_tm_min_t u_short -#define ngx_tm_hour_t u_short -#define ngx_tm_mday_t u_short -#define ngx_tm_mon_t u_short -#define ngx_tm_year_t u_short -#define ngx_tm_wday_t u_short - - -#define ngx_msleep Sleep - -#define NGX_HAVE_GETTIMEZONE 1 - -#define ngx_timezone_update() - -ngx_int_t ngx_gettimezone(void); -void ngx_libc_localtime(time_t s, struct tm *tm); -void ngx_libc_gmtime(time_t s, struct tm *tm); -void ngx_gettimeofday(struct timeval *tp); - - -#endif /* _NGX_TIME_H_INCLUDED_ */ diff --git a/src/deps/src/nginx-1.30.3/src/os/win32/ngx_udp_wsarecv.c b/src/deps/src/nginx-1.30.3/src/os/win32/ngx_udp_wsarecv.c deleted file mode 100644 index 5424375a4d..0000000000 --- a/src/deps/src/nginx-1.30.3/src/os/win32/ngx_udp_wsarecv.c +++ /dev/null @@ -1,149 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#include -#include -#include - - -ssize_t -ngx_udp_wsarecv(ngx_connection_t *c, u_char *buf, size_t size) -{ - int rc; - u_long bytes, flags; - WSABUF wsabuf[1]; - ngx_err_t err; - ngx_event_t *rev; - - wsabuf[0].buf = (char *) buf; - wsabuf[0].len = size; - flags = 0; - bytes = 0; - - rc = WSARecv(c->fd, wsabuf, 1, &bytes, &flags, NULL, NULL); - - ngx_log_debug4(NGX_LOG_DEBUG_EVENT, c->log, 0, - "WSARecv: fd:%d rc:%d %ul of %z", c->fd, rc, bytes, size); - - rev = c->read; - - if (rc == -1) { - rev->ready = 0; - err = ngx_socket_errno; - - if (err == WSAEWOULDBLOCK) { - ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, err, - "WSARecv() not ready"); - return NGX_AGAIN; - } - - rev->error = 1; - ngx_connection_error(c, err, "WSARecv() failed"); - - return NGX_ERROR; - } - - return bytes; -} - - -ssize_t -ngx_udp_overlapped_wsarecv(ngx_connection_t *c, u_char *buf, size_t size) -{ - int rc; - u_long bytes, flags; - WSABUF wsabuf[1]; - ngx_err_t err; - ngx_event_t *rev; - LPWSAOVERLAPPED ovlp; - - rev = c->read; - - if (!rev->ready) { - ngx_log_error(NGX_LOG_ALERT, c->log, 0, "second wsa post"); - return NGX_AGAIN; - } - - ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, - "rev->complete: %d", rev->complete); - - if (rev->complete) { - rev->complete = 0; - - if (ngx_event_flags & NGX_USE_IOCP_EVENT) { - if (rev->ovlp.error) { - ngx_connection_error(c, rev->ovlp.error, "WSARecv() failed"); - return NGX_ERROR; - } - - ngx_log_debug3(NGX_LOG_DEBUG_EVENT, c->log, 0, - "WSARecv ovlp: fd:%d %ul of %z", - c->fd, rev->available, size); - - return rev->available; - } - - if (WSAGetOverlappedResult(c->fd, (LPWSAOVERLAPPED) &rev->ovlp, - &bytes, 0, NULL) - == 0) - { - ngx_connection_error(c, ngx_socket_errno, - "WSARecv() or WSAGetOverlappedResult() failed"); - return NGX_ERROR; - } - - ngx_log_debug3(NGX_LOG_DEBUG_EVENT, c->log, 0, - "WSARecv: fd:%d %ul of %z", c->fd, bytes, size); - - return bytes; - } - - ovlp = (LPWSAOVERLAPPED) &rev->ovlp; - ngx_memzero(ovlp, sizeof(WSAOVERLAPPED)); - wsabuf[0].buf = (char *) buf; - wsabuf[0].len = size; - flags = 0; - bytes = 0; - - rc = WSARecv(c->fd, wsabuf, 1, &bytes, &flags, ovlp, NULL); - - rev->complete = 0; - - ngx_log_debug4(NGX_LOG_DEBUG_EVENT, c->log, 0, - "WSARecv ovlp: fd:%d rc:%d %ul of %z", - c->fd, rc, bytes, size); - - if (rc == -1) { - err = ngx_socket_errno; - if (err == WSA_IO_PENDING) { - rev->active = 1; - ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, err, - "WSARecv() posted"); - return NGX_AGAIN; - } - - rev->error = 1; - ngx_connection_error(c, err, "WSARecv() failed"); - return NGX_ERROR; - } - - if (ngx_event_flags & NGX_USE_IOCP_EVENT) { - - /* - * if a socket was bound with I/O completion port - * then GetQueuedCompletionStatus() would anyway return its status - * despite that WSARecv() was already complete - */ - - rev->active = 1; - return NGX_AGAIN; - } - - rev->active = 0; - - return bytes; -} diff --git a/src/deps/src/nginx-1.30.3/src/os/win32/ngx_user.c b/src/deps/src/nginx-1.30.3/src/os/win32/ngx_user.c deleted file mode 100644 index ea6da5a303..0000000000 --- a/src/deps/src/nginx-1.30.3/src/os/win32/ngx_user.c +++ /dev/null @@ -1,23 +0,0 @@ -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#include -#include - - -#if (NGX_CRYPT) - -ngx_int_t -ngx_libc_crypt(ngx_pool_t *pool, u_char *key, u_char *salt, u_char **encrypted) -{ - /* STUB: a plain text password */ - - *encrypted = key; - - return NGX_OK; -} - -#endif /* NGX_CRYPT */ diff --git a/src/deps/src/nginx-1.30.3/src/os/win32/ngx_user.h b/src/deps/src/nginx-1.30.3/src/os/win32/ngx_user.h deleted file mode 100644 index 61408e4500..0000000000 --- a/src/deps/src/nginx-1.30.3/src/os/win32/ngx_user.h +++ /dev/null @@ -1,25 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#ifndef _NGX_USER_H_INCLUDED_ -#define _NGX_USER_H_INCLUDED_ - - -#include -#include - - -/* STUB */ -#define ngx_uid_t ngx_int_t -#define ngx_gid_t ngx_int_t - - -ngx_int_t ngx_libc_crypt(ngx_pool_t *pool, u_char *key, u_char *salt, - u_char **encrypted); - - -#endif /* _NGX_USER_H_INCLUDED_ */ diff --git a/src/deps/src/nginx-1.30.3/src/os/win32/ngx_win32_config.h b/src/deps/src/nginx-1.30.3/src/os/win32/ngx_win32_config.h deleted file mode 100644 index 704561355c..0000000000 --- a/src/deps/src/nginx-1.30.3/src/os/win32/ngx_win32_config.h +++ /dev/null @@ -1,291 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#ifndef _NGX_WIN32_CONFIG_H_INCLUDED_ -#define _NGX_WIN32_CONFIG_H_INCLUDED_ - - -#undef WIN32 -#define WIN32 0x0400 -#define _WIN32_WINNT 0x0501 - - -#define STRICT -#define WIN32_LEAN_AND_MEAN - -/* enable getenv() and gmtime() in msvc8 */ -#define _CRT_SECURE_NO_WARNINGS -#define _CRT_SECURE_NO_DEPRECATE - -/* enable gethostbyname() in msvc2015 */ -#if !(NGX_HAVE_INET6) -#define _WINSOCK_DEPRECATED_NO_WARNINGS -#endif - -/* - * we need to include explicitly before because - * the warning 4201 is enabled in - */ -#include - -#ifdef _MSC_VER -#pragma warning(disable:4201) -#endif - -#include -#include /* ipv6 */ -#include -#include -#include /* offsetof() */ - -#ifdef __MINGW64_VERSION_MAJOR - -/* GCC MinGW-w64 supports _FILE_OFFSET_BITS */ -#define _FILE_OFFSET_BITS 64 - -#elif defined __GNUC__ - -/* GCC MinGW's stdio.h includes sys/types.h */ -#define _OFF_T_ -#define __have_typedef_off_t - -#endif - -#include -#include -#include -#ifdef __GNUC__ -#include -#endif -#include -#include - -#ifdef __WATCOMC__ -#define _TIME_T_DEFINED -typedef long time_t; -/* OpenWatcom defines time_t as "unsigned long" */ -#endif - -#include /* localtime(), strftime() */ - - -#ifdef _MSC_VER - -/* the end of the precompiled headers */ -#pragma hdrstop - -#pragma warning(default:4201) - -/* 'type cast': from function pointer to data pointer */ -#pragma warning(disable:4054) - -/* 'type cast': from data pointer to function pointer */ -#pragma warning(disable:4055) - -/* 'function' : different 'const' qualifiers */ -#pragma warning(disable:4090) - -/* unreferenced formal parameter */ -#pragma warning(disable:4100) - -/* FD_SET() and FD_CLR(): conditional expression is constant */ -#pragma warning(disable:4127) - -/* conversion from 'type1' to 'type2', possible loss of data */ -#pragma warning(disable:4244) - -/* conversion from 'size_t' to 'type', possible loss of data */ -#pragma warning(disable:4267) - -/* array is too small to include a terminating null character */ -#pragma warning(disable:4295) - -/* conversion from 'type1' to 'type2' of greater size */ -#pragma warning(disable:4306) - -#endif - - -#ifdef __WATCOMC__ - -/* symbol 'ngx_rbtree_min' has been defined, but not referenced */ -#pragma disable_message(202) - -#endif - - -#ifdef __BORLANDC__ - -/* the end of the precompiled headers */ -#pragma hdrstop - -/* functions containing (for|while|some if) are not expanded inline */ -#pragma warn -8027 - -/* unreferenced formal parameter */ -#pragma warn -8057 - -/* suspicious pointer arithmetic */ -#pragma warn -8072 - -#endif - - -#include - - -#define ngx_inline __inline -#define ngx_cdecl __cdecl - - -#ifdef _MSC_VER -typedef unsigned __int32 uint32_t; -typedef __int32 int32_t; -typedef unsigned __int16 uint16_t; -#define ngx_libc_cdecl __cdecl - -#elif defined __BORLANDC__ -typedef unsigned __int32 uint32_t; -typedef __int32 int32_t; -typedef unsigned __int16 uint16_t; -#define ngx_libc_cdecl __cdecl - -#else /* __WATCOMC__ */ -typedef unsigned int uint32_t; -typedef int int32_t; -typedef unsigned short int uint16_t; -#define ngx_libc_cdecl - -#endif - -typedef __int64 int64_t; -typedef unsigned __int64 uint64_t; - -#if __BORLANDC__ -typedef int intptr_t; -typedef u_int uintptr_t; -#endif - - -#ifndef __MINGW64_VERSION_MAJOR - -/* Windows defines off_t as long, which is 32-bit */ -typedef __int64 off_t; -#define _OFF_T_DEFINED - -#endif - - -#ifdef __WATCOMC__ - -/* off_t is redefined by sys/types.h used by zlib.h */ -#define __TYPES_H_INCLUDED -typedef int dev_t; -typedef unsigned int ino_t; - -#elif __BORLANDC__ - -/* off_t is redefined by sys/types.h used by zlib.h */ -#define __TYPES_H - -typedef int dev_t; -typedef unsigned int ino_t; - -#endif - - -#ifndef __GNUC__ -#ifdef _WIN64 -typedef __int64 ssize_t; -#else -typedef int ssize_t; -#endif -#endif - - -typedef uint32_t in_addr_t; -typedef u_short in_port_t; -typedef int sig_atomic_t; - - -#ifdef _WIN64 - -#define NGX_PTR_SIZE 8 -#define NGX_SIZE_T_LEN (sizeof("-9223372036854775808") - 1) -#define NGX_MAX_SIZE_T_VALUE 9223372036854775807 -#define NGX_TIME_T_LEN (sizeof("-9223372036854775808") - 1) -#define NGX_TIME_T_SIZE 8 -#define NGX_MAX_TIME_T_VALUE 9223372036854775807 - -#else - -#define NGX_PTR_SIZE 4 -#define NGX_SIZE_T_LEN (sizeof("-2147483648") - 1) -#define NGX_MAX_SIZE_T_VALUE 2147483647 -#define NGX_TIME_T_LEN (sizeof("-2147483648") - 1) -#define NGX_TIME_T_SIZE 4 -#define NGX_MAX_TIME_T_VALUE 2147483647 - -#endif - - -#define NGX_OFF_T_LEN (sizeof("-9223372036854775807") - 1) -#define NGX_MAX_OFF_T_VALUE 9223372036854775807 -#define NGX_SIG_ATOMIC_T_SIZE 4 - - -#define NGX_HAVE_LITTLE_ENDIAN 1 -#define NGX_HAVE_NONALIGNED 1 - - -#define NGX_WIN_NT 200000 - - -#define NGX_LISTEN_BACKLOG 511 - - -#ifndef NGX_HAVE_INHERITED_NONBLOCK -#define NGX_HAVE_INHERITED_NONBLOCK 1 -#endif - -#ifndef NGX_HAVE_CASELESS_FILESYSTEM -#define NGX_HAVE_CASELESS_FILESYSTEM 1 -#endif - -#ifndef NGX_HAVE_WIN32_TRANSMITPACKETS -#define NGX_HAVE_WIN32_TRANSMITPACKETS 1 -#define NGX_HAVE_WIN32_TRANSMITFILE 0 -#endif - -#ifndef NGX_HAVE_WIN32_TRANSMITFILE -#define NGX_HAVE_WIN32_TRANSMITFILE 1 -#endif - -#if (NGX_HAVE_WIN32_TRANSMITPACKETS) || (NGX_HAVE_WIN32_TRANSMITFILE) -#define NGX_HAVE_SENDFILE 1 -#endif - -#ifndef NGX_HAVE_SO_SNDLOWAT -/* setsockopt(SO_SNDLOWAT) returns error WSAENOPROTOOPT */ -#define NGX_HAVE_SO_SNDLOWAT 0 -#endif - -#ifndef NGX_HAVE_FIONREAD -#define NGX_HAVE_FIONREAD 1 -#endif - -#define NGX_HAVE_GETADDRINFO 1 - -#define ngx_random() \ - ((long) (0x7fffffff & ( ((uint32_t) rand() << 16) \ - ^ ((uint32_t) rand() << 8) \ - ^ ((uint32_t) rand()) ))) - -#define ngx_debug_init() - - -#endif /* _NGX_WIN32_CONFIG_H_INCLUDED_ */ diff --git a/src/deps/src/nginx-1.30.3/src/os/win32/ngx_win32_init.c b/src/deps/src/nginx-1.30.3/src/os/win32/ngx_win32_init.c deleted file mode 100644 index de66a44eb5..0000000000 --- a/src/deps/src/nginx-1.30.3/src/os/win32/ngx_win32_init.c +++ /dev/null @@ -1,329 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#include -#include -#include - - -ngx_uint_t ngx_win32_version; -ngx_uint_t ngx_ncpu; -ngx_uint_t ngx_max_wsabufs; -ngx_int_t ngx_max_sockets; -ngx_uint_t ngx_inherited_nonblocking = 1; -ngx_uint_t ngx_tcp_nodelay_and_tcp_nopush; - -char ngx_unique[NGX_INT32_LEN + 1]; - - -ngx_os_io_t ngx_os_io = { - ngx_wsarecv, - ngx_wsarecv_chain, - ngx_udp_wsarecv, - ngx_wsasend, - NULL, - NULL, - ngx_wsasend_chain, - 0 -}; - - -typedef struct { - WORD wServicePackMinor; - WORD wSuiteMask; - BYTE wProductType; -} ngx_osviex_stub_t; - - -static u_int osviex; -static OSVERSIONINFOEX osvi; - -/* Should these pointers be per protocol ? */ -LPFN_ACCEPTEX ngx_acceptex; -LPFN_GETACCEPTEXSOCKADDRS ngx_getacceptexsockaddrs; -LPFN_TRANSMITFILE ngx_transmitfile; -LPFN_TRANSMITPACKETS ngx_transmitpackets; -LPFN_CONNECTEX ngx_connectex; -LPFN_DISCONNECTEX ngx_disconnectex; - -static GUID ax_guid = WSAID_ACCEPTEX; -static GUID as_guid = WSAID_GETACCEPTEXSOCKADDRS; -static GUID tf_guid = WSAID_TRANSMITFILE; -static GUID tp_guid = WSAID_TRANSMITPACKETS; -static GUID cx_guid = WSAID_CONNECTEX; -static GUID dx_guid = WSAID_DISCONNECTEX; - - -#if (NGX_LOAD_WSAPOLL) -ngx_wsapoll_pt WSAPoll; -ngx_uint_t ngx_have_wsapoll; -#endif - - -ngx_int_t -ngx_os_init(ngx_log_t *log) -{ - DWORD bytes; - SOCKET s; - WSADATA wsd; - ngx_err_t err; - ngx_time_t *tp; - ngx_uint_t n; - SYSTEM_INFO si; - - /* get Windows version */ - - ngx_memzero(&osvi, sizeof(OSVERSIONINFOEX)); - osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX); - -#ifdef _MSC_VER -#pragma warning(disable:4996) -#endif - - osviex = GetVersionEx((OSVERSIONINFO *) &osvi); - - if (osviex == 0) { - osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX); - if (GetVersionEx((OSVERSIONINFO *) &osvi) == 0) { - ngx_log_error(NGX_LOG_EMERG, log, ngx_errno, - "GetVersionEx() failed"); - return NGX_ERROR; - } - } - -#ifdef _MSC_VER -#pragma warning(default:4996) -#endif - - /* - * Windows 3.1 Win32s 0xxxxx - * - * Windows 95 140000 - * Windows 98 141000 - * Windows ME 149000 - * Windows NT 3.51 235100 - * Windows NT 4.0 240000 - * Windows NT 4.0 SP5 240050 - * Windows 2000 250000 - * Windows XP 250100 - * Windows 2003 250200 - * Windows Vista/2008 260000 - * - * Windows CE x.x 3xxxxx - */ - - ngx_win32_version = osvi.dwPlatformId * 100000 - + osvi.dwMajorVersion * 10000 - + osvi.dwMinorVersion * 100; - - if (osviex) { - ngx_win32_version += osvi.wServicePackMajor * 10 - + osvi.wServicePackMinor; - } - - GetSystemInfo(&si); - ngx_pagesize = si.dwPageSize; - ngx_allocation_granularity = si.dwAllocationGranularity; - ngx_ncpu = si.dwNumberOfProcessors; - ngx_cacheline_size = NGX_CPU_CACHE_LINE; - - for (n = ngx_pagesize; n >>= 1; ngx_pagesize_shift++) { /* void */ } - - /* delete default "C" locale for _wcsicmp() */ - setlocale(LC_ALL, ""); - - - /* init Winsock */ - - if (WSAStartup(MAKEWORD(2,2), &wsd) != 0) { - ngx_log_error(NGX_LOG_EMERG, log, ngx_socket_errno, - "WSAStartup() failed"); - return NGX_ERROR; - } - - if (ngx_win32_version < NGX_WIN_NT) { - ngx_max_wsabufs = 16; - return NGX_OK; - } - - /* STUB: ngx_uint_t max */ - ngx_max_wsabufs = 1024 * 1024; - - /* - * get AcceptEx(), GetAcceptExSockAddrs(), TransmitFile(), - * TransmitPackets(), ConnectEx(), and DisconnectEx() addresses - */ - - s = ngx_socket(AF_INET, SOCK_STREAM, IPPROTO_IP); - if (s == (ngx_socket_t) -1) { - ngx_log_error(NGX_LOG_EMERG, log, ngx_socket_errno, - ngx_socket_n " failed"); - return NGX_ERROR; - } - - if (WSAIoctl(s, SIO_GET_EXTENSION_FUNCTION_POINTER, &ax_guid, sizeof(GUID), - &ngx_acceptex, sizeof(LPFN_ACCEPTEX), &bytes, NULL, NULL) - == -1) - { - ngx_log_error(NGX_LOG_NOTICE, log, ngx_socket_errno, - "WSAIoctl(SIO_GET_EXTENSION_FUNCTION_POINTER, " - "WSAID_ACCEPTEX) failed"); - } - - if (WSAIoctl(s, SIO_GET_EXTENSION_FUNCTION_POINTER, &as_guid, sizeof(GUID), - &ngx_getacceptexsockaddrs, sizeof(LPFN_GETACCEPTEXSOCKADDRS), - &bytes, NULL, NULL) - == -1) - { - ngx_log_error(NGX_LOG_NOTICE, log, ngx_socket_errno, - "WSAIoctl(SIO_GET_EXTENSION_FUNCTION_POINTER, " - "WSAID_GETACCEPTEXSOCKADDRS) failed"); - } - - if (WSAIoctl(s, SIO_GET_EXTENSION_FUNCTION_POINTER, &tf_guid, sizeof(GUID), - &ngx_transmitfile, sizeof(LPFN_TRANSMITFILE), &bytes, - NULL, NULL) - == -1) - { - ngx_log_error(NGX_LOG_NOTICE, log, ngx_socket_errno, - "WSAIoctl(SIO_GET_EXTENSION_FUNCTION_POINTER, " - "WSAID_TRANSMITFILE) failed"); - } - - if (WSAIoctl(s, SIO_GET_EXTENSION_FUNCTION_POINTER, &tp_guid, sizeof(GUID), - &ngx_transmitpackets, sizeof(LPFN_TRANSMITPACKETS), &bytes, - NULL, NULL) - == -1) - { - ngx_log_error(NGX_LOG_NOTICE, log, ngx_socket_errno, - "WSAIoctl(SIO_GET_EXTENSION_FUNCTION_POINTER, " - "WSAID_TRANSMITPACKETS) failed"); - } - - if (WSAIoctl(s, SIO_GET_EXTENSION_FUNCTION_POINTER, &cx_guid, sizeof(GUID), - &ngx_connectex, sizeof(LPFN_CONNECTEX), &bytes, - NULL, NULL) - == -1) - { - ngx_log_error(NGX_LOG_NOTICE, log, ngx_socket_errno, - "WSAIoctl(SIO_GET_EXTENSION_FUNCTION_POINTER, " - "WSAID_CONNECTEX) failed"); - } - - if (WSAIoctl(s, SIO_GET_EXTENSION_FUNCTION_POINTER, &dx_guid, sizeof(GUID), - &ngx_disconnectex, sizeof(LPFN_DISCONNECTEX), &bytes, - NULL, NULL) - == -1) - { - ngx_log_error(NGX_LOG_NOTICE, log, ngx_socket_errno, - "WSAIoctl(SIO_GET_EXTENSION_FUNCTION_POINTER, " - "WSAID_DISCONNECTEX) failed"); - } - - if (ngx_close_socket(s) == -1) { - ngx_log_error(NGX_LOG_ALERT, log, ngx_socket_errno, - ngx_close_socket_n " failed"); - } - -#if (NGX_LOAD_WSAPOLL) - { - HMODULE hmod; - - hmod = GetModuleHandle("ws2_32.dll"); - if (hmod == NULL) { - ngx_log_error(NGX_LOG_NOTICE, log, ngx_errno, - "GetModuleHandle(\"ws2_32.dll\") failed"); - goto nopoll; - } - - WSAPoll = (ngx_wsapoll_pt) (void *) GetProcAddress(hmod, "WSAPoll"); - if (WSAPoll == NULL) { - ngx_log_error(NGX_LOG_NOTICE, log, ngx_errno, - "GetProcAddress(\"WSAPoll\") failed"); - goto nopoll; - } - - ngx_have_wsapoll = 1; - - } - -nopoll: - -#endif - - if (GetEnvironmentVariable("ngx_unique", ngx_unique, NGX_INT32_LEN + 1) - != 0) - { - ngx_process = NGX_PROCESS_WORKER; - - } else { - err = ngx_errno; - - if (err != ERROR_ENVVAR_NOT_FOUND) { - ngx_log_error(NGX_LOG_EMERG, log, err, - "GetEnvironmentVariable(\"ngx_unique\") failed"); - return NGX_ERROR; - } - - ngx_sprintf((u_char *) ngx_unique, "%P%Z", ngx_pid); - } - - tp = ngx_timeofday(); - srand((ngx_pid << 16) ^ (unsigned) tp->sec ^ tp->msec); - - return NGX_OK; -} - - -void -ngx_os_status(ngx_log_t *log) -{ - ngx_osviex_stub_t *osviex_stub; - - ngx_log_error(NGX_LOG_NOTICE, log, 0, NGINX_VER_BUILD); - - if (osviex) { - - /* - * the MSVC 6.0 SP2 defines wSuiteMask and wProductType - * as WORD wReserved[2] - */ - osviex_stub = (ngx_osviex_stub_t *) &osvi.wServicePackMinor; - - ngx_log_error(NGX_LOG_INFO, log, 0, - "OS: %ui build:%ud, \"%s\", suite:%Xd, type:%ud", - ngx_win32_version, osvi.dwBuildNumber, osvi.szCSDVersion, - osviex_stub->wSuiteMask, osviex_stub->wProductType); - - } else { - if (osvi.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS) { - - /* Win9x build */ - - ngx_log_error(NGX_LOG_INFO, log, 0, - "OS: %ui build:%ud.%ud.%ud, \"%s\"", - ngx_win32_version, - osvi.dwBuildNumber >> 24, - (osvi.dwBuildNumber >> 16) & 0xff, - osvi.dwBuildNumber & 0xffff, - osvi.szCSDVersion); - - } else { - - /* - * VER_PLATFORM_WIN32_NT - * - * we do not currently support VER_PLATFORM_WIN32_CE - * and we do not support VER_PLATFORM_WIN32s at all - */ - - ngx_log_error(NGX_LOG_INFO, log, 0, "OS: %ui build:%ud, \"%s\"", - ngx_win32_version, osvi.dwBuildNumber, - osvi.szCSDVersion); - } - } -} diff --git a/src/deps/src/nginx-1.30.3/src/os/win32/ngx_wsarecv.c b/src/deps/src/nginx-1.30.3/src/os/win32/ngx_wsarecv.c deleted file mode 100644 index b01405e26d..0000000000 --- a/src/deps/src/nginx-1.30.3/src/os/win32/ngx_wsarecv.c +++ /dev/null @@ -1,215 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#include -#include -#include - - -ssize_t -ngx_wsarecv(ngx_connection_t *c, u_char *buf, size_t size) -{ - int rc; - u_long bytes, flags; - WSABUF wsabuf[1]; - ngx_err_t err; - ngx_int_t n; - ngx_event_t *rev; - - wsabuf[0].buf = (char *) buf; - wsabuf[0].len = size; - flags = 0; - bytes = 0; - - rc = WSARecv(c->fd, wsabuf, 1, &bytes, &flags, NULL, NULL); - - ngx_log_debug4(NGX_LOG_DEBUG_EVENT, c->log, 0, - "WSARecv: fd:%d rc:%d %ul of %z", c->fd, rc, bytes, size); - - rev = c->read; - - if (rc == -1) { - rev->ready = 0; - err = ngx_socket_errno; - - if (err == WSAEWOULDBLOCK) { - ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, err, - "WSARecv() not ready"); - return NGX_AGAIN; - } - - n = ngx_connection_error(c, err, "WSARecv() failed"); - - if (n == NGX_ERROR) { - rev->error = 1; - } - - return n; - } - -#if (NGX_HAVE_FIONREAD) - - if (rev->available >= 0 && bytes > 0) { - rev->available -= bytes; - - /* - * negative rev->available means some additional bytes - * were received between kernel notification and WSARecv(), - * and therefore ev->ready can be safely reset even for - * edge-triggered event methods - */ - - if (rev->available < 0) { - rev->available = 0; - rev->ready = 0; - } - - ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, - "WSARecv: avail:%d", rev->available); - - } else if (bytes == size) { - - if (ngx_socket_nread(c->fd, &rev->available) == -1) { - n = ngx_connection_error(c, ngx_socket_errno, - ngx_socket_nread_n " failed"); - - if (n == NGX_ERROR) { - rev->ready = 0; - rev->error = 1; - } - - return n; - } - - ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, - "WSARecv: avail:%d", rev->available); - } - -#endif - - if (bytes < size) { - rev->ready = 0; - } - - if (bytes == 0) { - rev->ready = 0; - rev->eof = 1; - } - - return bytes; -} - - -ssize_t -ngx_overlapped_wsarecv(ngx_connection_t *c, u_char *buf, size_t size) -{ - int rc; - u_long bytes, flags; - WSABUF wsabuf[1]; - ngx_err_t err; - ngx_int_t n; - ngx_event_t *rev; - LPWSAOVERLAPPED ovlp; - - rev = c->read; - - if (!rev->ready) { - ngx_log_error(NGX_LOG_ALERT, c->log, 0, "second wsa post"); - return NGX_AGAIN; - } - - ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, - "rev->complete: %d", rev->complete); - - if (rev->complete) { - rev->complete = 0; - - if (ngx_event_flags & NGX_USE_IOCP_EVENT) { - if (rev->ovlp.error) { - ngx_connection_error(c, rev->ovlp.error, "WSARecv() failed"); - return NGX_ERROR; - } - - ngx_log_debug3(NGX_LOG_DEBUG_EVENT, c->log, 0, - "WSARecv ovlp: fd:%d %ul of %z", - c->fd, rev->available, size); - - return rev->available; - } - - if (WSAGetOverlappedResult(c->fd, (LPWSAOVERLAPPED) &rev->ovlp, - &bytes, 0, NULL) - == 0) - { - ngx_connection_error(c, ngx_socket_errno, - "WSARecv() or WSAGetOverlappedResult() failed"); - return NGX_ERROR; - } - - ngx_log_debug3(NGX_LOG_DEBUG_EVENT, c->log, 0, - "WSARecv: fd:%d %ul of %z", c->fd, bytes, size); - - return bytes; - } - - ovlp = (LPWSAOVERLAPPED) &rev->ovlp; - ngx_memzero(ovlp, sizeof(WSAOVERLAPPED)); - wsabuf[0].buf = (char *) buf; - wsabuf[0].len = size; - flags = 0; - bytes = 0; - - rc = WSARecv(c->fd, wsabuf, 1, &bytes, &flags, ovlp, NULL); - - rev->complete = 0; - - ngx_log_debug4(NGX_LOG_DEBUG_EVENT, c->log, 0, - "WSARecv ovlp: fd:%d rc:%d %ul of %z", - c->fd, rc, bytes, size); - - if (rc == -1) { - err = ngx_socket_errno; - if (err == WSA_IO_PENDING) { - rev->active = 1; - ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, err, - "WSARecv() posted"); - return NGX_AGAIN; - } - - n = ngx_connection_error(c, err, "WSARecv() failed"); - - if (n == NGX_ERROR) { - rev->error = 1; - } - - return n; - } - - if (ngx_event_flags & NGX_USE_IOCP_EVENT) { - - /* - * if a socket was bound with I/O completion port - * then GetQueuedCompletionStatus() would anyway return its status - * despite that WSARecv() was already complete - */ - - rev->active = 1; - return NGX_AGAIN; - } - - if (bytes == 0) { - rev->eof = 1; - rev->ready = 0; - - } else { - rev->ready = 1; - } - - rev->active = 0; - - return bytes; -} diff --git a/src/deps/src/nginx-1.30.3/src/os/win32/ngx_wsarecv_chain.c b/src/deps/src/nginx-1.30.3/src/os/win32/ngx_wsarecv_chain.c deleted file mode 100644 index e60389bb76..0000000000 --- a/src/deps/src/nginx-1.30.3/src/os/win32/ngx_wsarecv_chain.c +++ /dev/null @@ -1,147 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#include -#include -#include - - -#define NGX_WSABUFS 64 - - -ssize_t -ngx_wsarecv_chain(ngx_connection_t *c, ngx_chain_t *chain, off_t limit) -{ - int rc; - u_char *prev; - u_long bytes, flags; - size_t n, size; - ngx_err_t err; - ngx_array_t vec; - ngx_event_t *rev; - LPWSABUF wsabuf; - WSABUF wsabufs[NGX_WSABUFS]; - - prev = NULL; - wsabuf = NULL; - flags = 0; - size = 0; - bytes = 0; - - vec.elts = wsabufs; - vec.nelts = 0; - vec.size = sizeof(WSABUF); - vec.nalloc = NGX_WSABUFS; - vec.pool = c->pool; - - /* coalesce the neighbouring bufs */ - - while (chain) { - n = chain->buf->end - chain->buf->last; - - if (limit) { - if (size >= (size_t) limit) { - break; - } - - if (size + n > (size_t) limit) { - n = (size_t) limit - size; - } - } - - if (prev == chain->buf->last) { - wsabuf->len += n; - - } else { - if (vec.nelts == vec.nalloc) { - break; - } - - wsabuf = ngx_array_push(&vec); - if (wsabuf == NULL) { - return NGX_ERROR; - } - - wsabuf->buf = (char *) chain->buf->last; - wsabuf->len = n; - } - - size += n; - prev = chain->buf->end; - chain = chain->next; - } - - ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0, - "WSARecv: %d:%d", vec.nelts, wsabuf->len); - - - rc = WSARecv(c->fd, vec.elts, vec.nelts, &bytes, &flags, NULL, NULL); - - rev = c->read; - - if (rc == -1) { - rev->ready = 0; - err = ngx_socket_errno; - - if (err == WSAEWOULDBLOCK) { - ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, err, - "WSARecv() not ready"); - return NGX_AGAIN; - } - - rev->error = 1; - ngx_connection_error(c, err, "WSARecv() failed"); - return NGX_ERROR; - } - -#if (NGX_HAVE_FIONREAD) - - if (rev->available >= 0 && bytes > 0) { - rev->available -= bytes; - - /* - * negative rev->available means some additional bytes - * were received between kernel notification and WSARecv(), - * and therefore ev->ready can be safely reset even for - * edge-triggered event methods - */ - - if (rev->available < 0) { - rev->available = 0; - rev->ready = 0; - } - - ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, - "WSARecv: avail:%d", rev->available); - - } else if (bytes == size) { - - if (ngx_socket_nread(c->fd, &rev->available) == -1) { - rev->ready = 0; - rev->error = 1; - ngx_connection_error(c, ngx_socket_errno, - ngx_socket_nread_n " failed"); - return NGX_ERROR; - } - - ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, - "WSARecv: avail:%d", rev->available); - } - -#endif - - if (bytes < size) { - rev->ready = 0; - } - - if (bytes == 0) { - rev->ready = 0; - rev->eof = 1; - } - - return bytes; -} diff --git a/src/deps/src/nginx-1.30.3/src/os/win32/ngx_wsasend.c b/src/deps/src/nginx-1.30.3/src/os/win32/ngx_wsasend.c deleted file mode 100644 index d6a23d17bc..0000000000 --- a/src/deps/src/nginx-1.30.3/src/os/win32/ngx_wsasend.c +++ /dev/null @@ -1,185 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#include -#include -#include - - -ssize_t -ngx_wsasend(ngx_connection_t *c, u_char *buf, size_t size) -{ - int n; - u_long sent; - ngx_err_t err; - ngx_event_t *wev; - WSABUF wsabuf; - - wev = c->write; - - if (!wev->ready) { - return NGX_AGAIN; - } - - /* - * WSABUF must be 4-byte aligned otherwise - * WSASend() will return undocumented WSAEINVAL error. - */ - - wsabuf.buf = (char *) buf; - wsabuf.len = size; - - sent = 0; - - n = WSASend(c->fd, &wsabuf, 1, &sent, 0, NULL, NULL); - - ngx_log_debug4(NGX_LOG_DEBUG_EVENT, c->log, 0, - "WSASend: fd:%d, %d, %ul of %uz", c->fd, n, sent, size); - - if (n == 0) { - if (sent < size) { - wev->ready = 0; - } - - c->sent += sent; - - return sent; - } - - err = ngx_socket_errno; - - if (err == WSAEWOULDBLOCK) { - ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, err, "WSASend() not ready"); - wev->ready = 0; - return NGX_AGAIN; - } - - wev->error = 1; - ngx_connection_error(c, err, "WSASend() failed"); - - return NGX_ERROR; -} - - -ssize_t -ngx_overlapped_wsasend(ngx_connection_t *c, u_char *buf, size_t size) -{ - int n; - u_long sent; - ngx_err_t err; - ngx_event_t *wev; - LPWSAOVERLAPPED ovlp; - WSABUF wsabuf; - - wev = c->write; - - if (!wev->ready) { - return NGX_AGAIN; - } - - ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, - "wev->complete: %d", wev->complete); - - if (!wev->complete) { - - /* post the overlapped WSASend() */ - - /* - * WSABUFs must be 4-byte aligned otherwise - * WSASend() will return undocumented WSAEINVAL error. - */ - - wsabuf.buf = (char *) buf; - wsabuf.len = size; - - sent = 0; - - ovlp = (LPWSAOVERLAPPED) &c->write->ovlp; - ngx_memzero(ovlp, sizeof(WSAOVERLAPPED)); - - n = WSASend(c->fd, &wsabuf, 1, &sent, 0, ovlp, NULL); - - ngx_log_debug4(NGX_LOG_DEBUG_EVENT, c->log, 0, - "WSASend: fd:%d, %d, %ul of %uz", c->fd, n, sent, size); - - wev->complete = 0; - - if (n == 0) { - if (ngx_event_flags & NGX_USE_IOCP_EVENT) { - - /* - * if a socket was bound with I/O completion port then - * GetQueuedCompletionStatus() would anyway return its status - * despite that WSASend() was already complete - */ - - wev->active = 1; - return NGX_AGAIN; - } - - if (sent < size) { - wev->ready = 0; - } - - c->sent += sent; - - return sent; - } - - err = ngx_socket_errno; - - if (err == WSA_IO_PENDING) { - ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, err, - "WSASend() posted"); - wev->active = 1; - return NGX_AGAIN; - } - - wev->error = 1; - ngx_connection_error(c, err, "WSASend() failed"); - - return NGX_ERROR; - } - - /* the overlapped WSASend() complete */ - - wev->complete = 0; - wev->active = 0; - - if (ngx_event_flags & NGX_USE_IOCP_EVENT) { - - if (wev->ovlp.error) { - ngx_connection_error(c, wev->ovlp.error, "WSASend() failed"); - return NGX_ERROR; - } - - sent = wev->available; - - } else { - if (WSAGetOverlappedResult(c->fd, (LPWSAOVERLAPPED) &wev->ovlp, - &sent, 0, NULL) - == 0) - { - ngx_connection_error(c, ngx_socket_errno, - "WSASend() or WSAGetOverlappedResult() failed"); - - return NGX_ERROR; - } - } - - ngx_log_debug3(NGX_LOG_DEBUG_EVENT, c->log, 0, - "WSAGetOverlappedResult: fd:%d, %ul of %uz", - c->fd, sent, size); - - if (sent < size) { - wev->ready = 0; - } - - c->sent += sent; - - return sent; -} diff --git a/src/deps/src/nginx-1.30.3/src/os/win32/ngx_wsasend_chain.c b/src/deps/src/nginx-1.30.3/src/os/win32/ngx_wsasend_chain.c deleted file mode 100644 index cd50e710c0..0000000000 --- a/src/deps/src/nginx-1.30.3/src/os/win32/ngx_wsasend_chain.c +++ /dev/null @@ -1,296 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#include -#include -#include - - -#define NGX_WSABUFS 64 - - -ngx_chain_t * -ngx_wsasend_chain(ngx_connection_t *c, ngx_chain_t *in, off_t limit) -{ - int rc; - u_char *prev; - u_long size, sent, send, prev_send; - ngx_err_t err; - ngx_event_t *wev; - ngx_array_t vec; - ngx_chain_t *cl; - LPWSABUF wsabuf; - WSABUF wsabufs[NGX_WSABUFS]; - - wev = c->write; - - if (!wev->ready) { - return in; - } - - /* the maximum limit size is the maximum u_long value - the page size */ - - if (limit == 0 || limit > (off_t) (NGX_MAX_UINT32_VALUE - ngx_pagesize)) { - limit = NGX_MAX_UINT32_VALUE - ngx_pagesize; - } - - send = 0; - - /* - * WSABUFs must be 4-byte aligned otherwise - * WSASend() will return undocumented WSAEINVAL error. - */ - - vec.elts = wsabufs; - vec.size = sizeof(WSABUF); - vec.nalloc = ngx_min(NGX_WSABUFS, ngx_max_wsabufs); - vec.pool = c->pool; - - for ( ;; ) { - prev = NULL; - wsabuf = NULL; - prev_send = send; - - vec.nelts = 0; - - /* create the WSABUF and coalesce the neighbouring bufs */ - - for (cl = in; cl && send < limit; cl = cl->next) { - - if (ngx_buf_special(cl->buf)) { - continue; - } - - size = cl->buf->last - cl->buf->pos; - - if (send + size > limit) { - size = (u_long) (limit - send); - } - - if (prev == cl->buf->pos) { - wsabuf->len += cl->buf->last - cl->buf->pos; - - } else { - if (vec.nelts == vec.nalloc) { - break; - } - - wsabuf = ngx_array_push(&vec); - if (wsabuf == NULL) { - return NGX_CHAIN_ERROR; - } - - wsabuf->buf = (char *) cl->buf->pos; - wsabuf->len = cl->buf->last - cl->buf->pos; - } - - prev = cl->buf->last; - send += size; - } - - sent = 0; - - rc = WSASend(c->fd, vec.elts, vec.nelts, &sent, 0, NULL, NULL); - - if (rc == -1) { - err = ngx_errno; - - if (err == WSAEWOULDBLOCK) { - ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, err, - "WSASend() not ready"); - - } else { - wev->error = 1; - ngx_connection_error(c, err, "WSASend() failed"); - return NGX_CHAIN_ERROR; - } - } - - ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0, - "WSASend: fd:%d, s:%ul", c->fd, sent); - - c->sent += sent; - - in = ngx_chain_update_sent(in, sent); - - if (send - prev_send != sent) { - wev->ready = 0; - return in; - } - - if (send >= limit || in == NULL) { - return in; - } - } -} - - -ngx_chain_t * -ngx_overlapped_wsasend_chain(ngx_connection_t *c, ngx_chain_t *in, off_t limit) -{ - int rc; - u_char *prev; - u_long size, send, sent; - ngx_err_t err; - ngx_event_t *wev; - ngx_array_t vec; - ngx_chain_t *cl; - LPWSAOVERLAPPED ovlp; - LPWSABUF wsabuf; - WSABUF wsabufs[NGX_WSABUFS]; - - wev = c->write; - - if (!wev->ready) { - return in; - } - - ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, - "wev->complete: %d", wev->complete); - - if (!wev->complete) { - - /* post the overlapped WSASend() */ - - /* the maximum limit size is the maximum u_long value - the page size */ - - if (limit == 0 || limit > (off_t) (NGX_MAX_UINT32_VALUE - ngx_pagesize)) - { - limit = NGX_MAX_UINT32_VALUE - ngx_pagesize; - } - - /* - * WSABUFs must be 4-byte aligned otherwise - * WSASend() will return undocumented WSAEINVAL error. - */ - - vec.elts = wsabufs; - vec.nelts = 0; - vec.size = sizeof(WSABUF); - vec.nalloc = ngx_min(NGX_WSABUFS, ngx_max_wsabufs); - vec.pool = c->pool; - - send = 0; - prev = NULL; - wsabuf = NULL; - - /* create the WSABUF and coalesce the neighbouring bufs */ - - for (cl = in; cl && send < limit; cl = cl->next) { - - if (ngx_buf_special(cl->buf)) { - continue; - } - - size = cl->buf->last - cl->buf->pos; - - if (send + size > limit) { - size = (u_long) (limit - send); - } - - if (prev == cl->buf->pos) { - wsabuf->len += cl->buf->last - cl->buf->pos; - - } else { - if (vec.nelts == vec.nalloc) { - break; - } - - wsabuf = ngx_array_push(&vec); - if (wsabuf == NULL) { - return NGX_CHAIN_ERROR; - } - - wsabuf->buf = (char *) cl->buf->pos; - wsabuf->len = cl->buf->last - cl->buf->pos; - } - - prev = cl->buf->last; - send += size; - } - - ovlp = (LPWSAOVERLAPPED) &c->write->ovlp; - ngx_memzero(ovlp, sizeof(WSAOVERLAPPED)); - - rc = WSASend(c->fd, vec.elts, vec.nelts, &sent, 0, ovlp, NULL); - - wev->complete = 0; - - if (rc == -1) { - err = ngx_errno; - - if (err == WSA_IO_PENDING) { - ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, err, - "WSASend() posted"); - wev->active = 1; - return in; - - } else { - wev->error = 1; - ngx_connection_error(c, err, "WSASend() failed"); - return NGX_CHAIN_ERROR; - } - - } else if (ngx_event_flags & NGX_USE_IOCP_EVENT) { - - /* - * if a socket was bound with I/O completion port then - * GetQueuedCompletionStatus() would anyway return its status - * despite that WSASend() was already complete - */ - - wev->active = 1; - return in; - } - - ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0, - "WSASend: fd:%d, s:%ul", c->fd, sent); - - } else { - - /* the overlapped WSASend() complete */ - - wev->complete = 0; - wev->active = 0; - - if (ngx_event_flags & NGX_USE_IOCP_EVENT) { - if (wev->ovlp.error) { - ngx_connection_error(c, wev->ovlp.error, "WSASend() failed"); - return NGX_CHAIN_ERROR; - } - - sent = wev->available; - - } else { - if (WSAGetOverlappedResult(c->fd, (LPWSAOVERLAPPED) &wev->ovlp, - &sent, 0, NULL) - == 0) - { - ngx_connection_error(c, ngx_socket_errno, - "WSASend() or WSAGetOverlappedResult() failed"); - - return NGX_CHAIN_ERROR; - } - } - } - - ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0, - "WSASend ovlp: fd:%d, s:%ul", c->fd, sent); - - c->sent += sent; - - in = ngx_chain_update_sent(in, sent); - - if (in) { - wev->ready = 0; - - } else { - wev->ready = 1; - } - - return in; -} diff --git a/src/deps/src/nginx-1.30.3/src/stream/ngx_stream.c b/src/deps/src/nginx-1.30.3/src/stream/ngx_stream.c deleted file mode 100644 index 508ce60821..0000000000 --- a/src/deps/src/nginx-1.30.3/src/stream/ngx_stream.c +++ /dev/null @@ -1,1176 +0,0 @@ - -/* - * Copyright (C) Roman Arutyunyan - * Copyright (C) Nginx, Inc. - */ - - -#include -#include -#include -#include - - -static char *ngx_stream_block(ngx_conf_t *cf, ngx_command_t *cmd, void *conf); -static ngx_int_t ngx_stream_init_phases(ngx_conf_t *cf, - ngx_stream_core_main_conf_t *cmcf); -static ngx_int_t ngx_stream_init_phase_handlers(ngx_conf_t *cf, - ngx_stream_core_main_conf_t *cmcf); - -static ngx_int_t ngx_stream_add_addresses(ngx_conf_t *cf, - ngx_stream_core_srv_conf_t *cscf, ngx_stream_conf_port_t *port, - ngx_stream_listen_opt_t *lsopt); -static ngx_int_t ngx_stream_add_address(ngx_conf_t *cf, - ngx_stream_core_srv_conf_t *cscf, ngx_stream_conf_port_t *port, - ngx_stream_listen_opt_t *lsopt); -static ngx_int_t ngx_stream_add_server(ngx_conf_t *cf, - ngx_stream_core_srv_conf_t *cscf, ngx_stream_conf_addr_t *addr); - -static ngx_int_t ngx_stream_optimize_servers(ngx_conf_t *cf, - ngx_stream_core_main_conf_t *cmcf, ngx_array_t *ports); -static ngx_int_t ngx_stream_server_names(ngx_conf_t *cf, - ngx_stream_core_main_conf_t *cmcf, ngx_stream_conf_addr_t *addr); -static ngx_int_t ngx_stream_cmp_conf_addrs(const void *one, const void *two); -static int ngx_libc_cdecl ngx_stream_cmp_dns_wildcards(const void *one, - const void *two); - -static ngx_int_t ngx_stream_init_listening(ngx_conf_t *cf, - ngx_stream_conf_port_t *port); -static ngx_listening_t *ngx_stream_add_listening(ngx_conf_t *cf, - ngx_stream_conf_addr_t *addr); -static ngx_int_t ngx_stream_add_addrs(ngx_conf_t *cf, ngx_stream_port_t *stport, - ngx_stream_conf_addr_t *addr); -#if (NGX_HAVE_INET6) -static ngx_int_t ngx_stream_add_addrs6(ngx_conf_t *cf, - ngx_stream_port_t *stport, ngx_stream_conf_addr_t *addr); -#endif - - -ngx_uint_t ngx_stream_max_module; - - -ngx_stream_filter_pt ngx_stream_top_filter; - - -static ngx_command_t ngx_stream_commands[] = { - - { ngx_string("stream"), - NGX_MAIN_CONF|NGX_CONF_BLOCK|NGX_CONF_NOARGS, - ngx_stream_block, - 0, - 0, - NULL }, - - ngx_null_command -}; - - -static ngx_core_module_t ngx_stream_module_ctx = { - ngx_string("stream"), - NULL, - NULL -}; - - -ngx_module_t ngx_stream_module = { - NGX_MODULE_V1, - &ngx_stream_module_ctx, /* module context */ - ngx_stream_commands, /* module directives */ - NGX_CORE_MODULE, /* module type */ - NULL, /* init master */ - NULL, /* init module */ - NULL, /* init process */ - NULL, /* init thread */ - NULL, /* exit thread */ - NULL, /* exit process */ - NULL, /* exit master */ - NGX_MODULE_V1_PADDING -}; - - -static char * -ngx_stream_block(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) -{ - char *rv; - ngx_uint_t mi, m, s; - ngx_conf_t pcf; - ngx_stream_module_t *module; - ngx_stream_conf_ctx_t *ctx; - ngx_stream_core_srv_conf_t **cscfp; - ngx_stream_core_main_conf_t *cmcf; - - if (*(ngx_stream_conf_ctx_t **) conf) { - return "is duplicate"; - } - - /* the main stream context */ - - ctx = ngx_pcalloc(cf->pool, sizeof(ngx_stream_conf_ctx_t)); - if (ctx == NULL) { - return NGX_CONF_ERROR; - } - - *(ngx_stream_conf_ctx_t **) conf = ctx; - - /* count the number of the stream modules and set up their indices */ - - ngx_stream_max_module = ngx_count_modules(cf->cycle, NGX_STREAM_MODULE); - - - /* the stream main_conf context, it's the same in the all stream contexts */ - - ctx->main_conf = ngx_pcalloc(cf->pool, - sizeof(void *) * ngx_stream_max_module); - if (ctx->main_conf == NULL) { - return NGX_CONF_ERROR; - } - - - /* - * the stream null srv_conf context, it is used to merge - * the server{}s' srv_conf's - */ - - ctx->srv_conf = ngx_pcalloc(cf->pool, - sizeof(void *) * ngx_stream_max_module); - if (ctx->srv_conf == NULL) { - return NGX_CONF_ERROR; - } - - - /* - * create the main_conf's and the null srv_conf's of the all stream modules - */ - - for (m = 0; cf->cycle->modules[m]; m++) { - if (cf->cycle->modules[m]->type != NGX_STREAM_MODULE) { - continue; - } - - module = cf->cycle->modules[m]->ctx; - mi = cf->cycle->modules[m]->ctx_index; - - if (module->create_main_conf) { - ctx->main_conf[mi] = module->create_main_conf(cf); - if (ctx->main_conf[mi] == NULL) { - return NGX_CONF_ERROR; - } - } - - if (module->create_srv_conf) { - ctx->srv_conf[mi] = module->create_srv_conf(cf); - if (ctx->srv_conf[mi] == NULL) { - return NGX_CONF_ERROR; - } - } - } - - - pcf = *cf; - cf->ctx = ctx; - - for (m = 0; cf->cycle->modules[m]; m++) { - if (cf->cycle->modules[m]->type != NGX_STREAM_MODULE) { - continue; - } - - module = cf->cycle->modules[m]->ctx; - - if (module->preconfiguration) { - if (module->preconfiguration(cf) != NGX_OK) { - return NGX_CONF_ERROR; - } - } - } - - - /* parse inside the stream{} block */ - - cf->module_type = NGX_STREAM_MODULE; - cf->cmd_type = NGX_STREAM_MAIN_CONF; - rv = ngx_conf_parse(cf, NULL); - - if (rv != NGX_CONF_OK) { - *cf = pcf; - return rv; - } - - - /* init stream{} main_conf's, merge the server{}s' srv_conf's */ - - cmcf = ctx->main_conf[ngx_stream_core_module.ctx_index]; - cscfp = cmcf->servers.elts; - - for (m = 0; cf->cycle->modules[m]; m++) { - if (cf->cycle->modules[m]->type != NGX_STREAM_MODULE) { - continue; - } - - module = cf->cycle->modules[m]->ctx; - mi = cf->cycle->modules[m]->ctx_index; - - /* init stream{} main_conf's */ - - cf->ctx = ctx; - - if (module->init_main_conf) { - rv = module->init_main_conf(cf, ctx->main_conf[mi]); - if (rv != NGX_CONF_OK) { - *cf = pcf; - return rv; - } - } - - for (s = 0; s < cmcf->servers.nelts; s++) { - - /* merge the server{}s' srv_conf's */ - - cf->ctx = cscfp[s]->ctx; - - if (module->merge_srv_conf) { - rv = module->merge_srv_conf(cf, - ctx->srv_conf[mi], - cscfp[s]->ctx->srv_conf[mi]); - if (rv != NGX_CONF_OK) { - *cf = pcf; - return rv; - } - } - } - } - - if (ngx_stream_init_phases(cf, cmcf) != NGX_OK) { - return NGX_CONF_ERROR; - } - - for (m = 0; cf->cycle->modules[m]; m++) { - if (cf->cycle->modules[m]->type != NGX_STREAM_MODULE) { - continue; - } - - module = cf->cycle->modules[m]->ctx; - - if (module->postconfiguration) { - if (module->postconfiguration(cf) != NGX_OK) { - return NGX_CONF_ERROR; - } - } - } - - if (ngx_stream_variables_init_vars(cf) != NGX_OK) { - return NGX_CONF_ERROR; - } - - *cf = pcf; - - if (ngx_stream_init_phase_handlers(cf, cmcf) != NGX_OK) { - return NGX_CONF_ERROR; - } - - /* optimize the lists of ports, addresses and server names */ - - if (ngx_stream_optimize_servers(cf, cmcf, cmcf->ports) != NGX_OK) { - return NGX_CONF_ERROR; - } - - return NGX_CONF_OK; -} - - -static ngx_int_t -ngx_stream_init_phases(ngx_conf_t *cf, ngx_stream_core_main_conf_t *cmcf) -{ - if (ngx_array_init(&cmcf->phases[NGX_STREAM_POST_ACCEPT_PHASE].handlers, - cf->pool, 1, sizeof(ngx_stream_handler_pt)) - != NGX_OK) - { - return NGX_ERROR; - } - - if (ngx_array_init(&cmcf->phases[NGX_STREAM_PREACCESS_PHASE].handlers, - cf->pool, 1, sizeof(ngx_stream_handler_pt)) - != NGX_OK) - { - return NGX_ERROR; - } - - if (ngx_array_init(&cmcf->phases[NGX_STREAM_ACCESS_PHASE].handlers, - cf->pool, 1, sizeof(ngx_stream_handler_pt)) - != NGX_OK) - { - return NGX_ERROR; - } - - if (ngx_array_init(&cmcf->phases[NGX_STREAM_SSL_PHASE].handlers, - cf->pool, 1, sizeof(ngx_stream_handler_pt)) - != NGX_OK) - { - return NGX_ERROR; - } - - if (ngx_array_init(&cmcf->phases[NGX_STREAM_PREREAD_PHASE].handlers, - cf->pool, 1, sizeof(ngx_stream_handler_pt)) - != NGX_OK) - { - return NGX_ERROR; - } - - if (ngx_array_init(&cmcf->phases[NGX_STREAM_LOG_PHASE].handlers, - cf->pool, 1, sizeof(ngx_stream_handler_pt)) - != NGX_OK) - { - return NGX_ERROR; - } - - return NGX_OK; -} - - -static ngx_int_t -ngx_stream_init_phase_handlers(ngx_conf_t *cf, - ngx_stream_core_main_conf_t *cmcf) -{ - ngx_int_t j; - ngx_uint_t i, n; - ngx_stream_handler_pt *h; - ngx_stream_phase_handler_t *ph; - ngx_stream_phase_handler_pt checker; - - n = 1 /* content phase */; - - for (i = 0; i < NGX_STREAM_LOG_PHASE; i++) { - n += cmcf->phases[i].handlers.nelts; - } - - ph = ngx_pcalloc(cf->pool, - n * sizeof(ngx_stream_phase_handler_t) + sizeof(void *)); - if (ph == NULL) { - return NGX_ERROR; - } - - cmcf->phase_engine.handlers = ph; - n = 0; - - for (i = 0; i < NGX_STREAM_LOG_PHASE; i++) { - h = cmcf->phases[i].handlers.elts; - - switch (i) { - - case NGX_STREAM_PREREAD_PHASE: - checker = ngx_stream_core_preread_phase; - break; - - case NGX_STREAM_CONTENT_PHASE: - ph->checker = ngx_stream_core_content_phase; - n++; - ph++; - - continue; - - default: - checker = ngx_stream_core_generic_phase; - } - - n += cmcf->phases[i].handlers.nelts; - - for (j = cmcf->phases[i].handlers.nelts - 1; j >= 0; j--) { - ph->checker = checker; - ph->handler = h[j]; - ph->next = n; - ph++; - } - } - - return NGX_OK; -} - - -ngx_int_t -ngx_stream_add_listen(ngx_conf_t *cf, ngx_stream_core_srv_conf_t *cscf, - ngx_stream_listen_opt_t *lsopt) -{ - in_port_t p; - ngx_uint_t i; - struct sockaddr *sa; - ngx_stream_conf_port_t *port; - ngx_stream_core_main_conf_t *cmcf; - - cmcf = ngx_stream_conf_get_module_main_conf(cf, ngx_stream_core_module); - - if (cmcf->ports == NULL) { - cmcf->ports = ngx_array_create(cf->temp_pool, 2, - sizeof(ngx_stream_conf_port_t)); - if (cmcf->ports == NULL) { - return NGX_ERROR; - } - } - - sa = lsopt->sockaddr; - p = ngx_inet_get_port(sa); - - port = cmcf->ports->elts; - for (i = 0; i < cmcf->ports->nelts; i++) { - - if (p != port[i].port - || lsopt->type != port[i].type - || sa->sa_family != port[i].family) - { - continue; - } - - /* a port is already in the port list */ - - return ngx_stream_add_addresses(cf, cscf, &port[i], lsopt); - } - - /* add a port to the port list */ - - port = ngx_array_push(cmcf->ports); - if (port == NULL) { - return NGX_ERROR; - } - - port->family = sa->sa_family; - port->type = lsopt->type; - port->port = p; - port->addrs.elts = NULL; - - return ngx_stream_add_address(cf, cscf, port, lsopt); -} - - -static ngx_int_t -ngx_stream_add_addresses(ngx_conf_t *cf, ngx_stream_core_srv_conf_t *cscf, - ngx_stream_conf_port_t *port, ngx_stream_listen_opt_t *lsopt) -{ - ngx_uint_t i, default_server, proxy_protocol, - protocols, protocols_prev; - ngx_stream_conf_addr_t *addr; -#if (NGX_STREAM_SSL) - ngx_uint_t ssl; -#endif - - /* - * we cannot compare whole sockaddr struct's as kernel - * may fill some fields in inherited sockaddr struct's - */ - - addr = port->addrs.elts; - - for (i = 0; i < port->addrs.nelts; i++) { - - if (ngx_cmp_sockaddr(lsopt->sockaddr, lsopt->socklen, - addr[i].opt.sockaddr, - addr[i].opt.socklen, 0) - != NGX_OK) - { - continue; - } - - /* the address is already in the address list */ - - if (ngx_stream_add_server(cf, cscf, &addr[i]) != NGX_OK) { - return NGX_ERROR; - } - - /* preserve default_server bit during listen options overwriting */ - default_server = addr[i].opt.default_server; - - proxy_protocol = lsopt->proxy_protocol || addr[i].opt.proxy_protocol; - protocols = lsopt->proxy_protocol; - protocols_prev = addr[i].opt.proxy_protocol; - -#if (NGX_STREAM_SSL) - ssl = lsopt->ssl || addr[i].opt.ssl; - protocols |= lsopt->ssl << 1; - protocols_prev |= addr[i].opt.ssl << 1; -#endif - - if (lsopt->set) { - - if (addr[i].opt.set) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "duplicate listen options for %V", - &addr[i].opt.addr_text); - return NGX_ERROR; - } - - addr[i].opt = *lsopt; - } - - /* check the duplicate "default" server for this address:port */ - - if (lsopt->default_server) { - - if (default_server) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "a duplicate default server for %V", - &addr[i].opt.addr_text); - return NGX_ERROR; - } - - default_server = 1; - addr[i].default_server = cscf; - } - - /* check for conflicting protocol options */ - - if ((protocols | protocols_prev) != protocols_prev) { - - /* options added */ - - if ((addr[i].opt.set && !lsopt->set) - || addr[i].protocols_changed - || (protocols | protocols_prev) != protocols) - { - ngx_conf_log_error(NGX_LOG_WARN, cf, 0, - "protocol options redefined for %V", - &addr[i].opt.addr_text); - } - - addr[i].protocols = protocols_prev; - addr[i].protocols_set = 1; - addr[i].protocols_changed = 1; - - } else if ((protocols_prev | protocols) != protocols) { - - /* options removed */ - - if (lsopt->set - || (addr[i].protocols_set && protocols != addr[i].protocols)) - { - ngx_conf_log_error(NGX_LOG_WARN, cf, 0, - "protocol options redefined for %V", - &addr[i].opt.addr_text); - } - - addr[i].protocols = protocols; - addr[i].protocols_set = 1; - addr[i].protocols_changed = 1; - - } else { - - /* the same options */ - - if ((lsopt->set && addr[i].protocols_changed) - || (addr[i].protocols_set && protocols != addr[i].protocols)) - { - ngx_conf_log_error(NGX_LOG_WARN, cf, 0, - "protocol options redefined for %V", - &addr[i].opt.addr_text); - } - - addr[i].protocols = protocols; - addr[i].protocols_set = 1; - } - - addr[i].opt.default_server = default_server; - addr[i].opt.proxy_protocol = proxy_protocol; -#if (NGX_STREAM_SSL) - addr[i].opt.ssl = ssl; -#endif - - return NGX_OK; - } - - /* add the address to the addresses list that bound to this port */ - - return ngx_stream_add_address(cf, cscf, port, lsopt); -} - - -/* - * add the server address, the server names and the server core module - * configurations to the port list - */ - -static ngx_int_t -ngx_stream_add_address(ngx_conf_t *cf, ngx_stream_core_srv_conf_t *cscf, - ngx_stream_conf_port_t *port, ngx_stream_listen_opt_t *lsopt) -{ - ngx_stream_conf_addr_t *addr; - - if (port->addrs.elts == NULL) { - if (ngx_array_init(&port->addrs, cf->temp_pool, 4, - sizeof(ngx_stream_conf_addr_t)) - != NGX_OK) - { - return NGX_ERROR; - } - } - - addr = ngx_array_push(&port->addrs); - if (addr == NULL) { - return NGX_ERROR; - } - - addr->opt = *lsopt; - addr->protocols = 0; - addr->protocols_set = 0; - addr->protocols_changed = 0; - addr->hash.buckets = NULL; - addr->hash.size = 0; - addr->wc_head = NULL; - addr->wc_tail = NULL; -#if (NGX_PCRE) - addr->nregex = 0; - addr->regex = NULL; -#endif - addr->default_server = cscf; - addr->servers.elts = NULL; - - return ngx_stream_add_server(cf, cscf, addr); -} - - -/* add the server core module configuration to the address:port */ - -static ngx_int_t -ngx_stream_add_server(ngx_conf_t *cf, ngx_stream_core_srv_conf_t *cscf, - ngx_stream_conf_addr_t *addr) -{ - ngx_uint_t i; - ngx_stream_core_srv_conf_t **server; - - if (addr->servers.elts == NULL) { - if (ngx_array_init(&addr->servers, cf->temp_pool, 4, - sizeof(ngx_stream_core_srv_conf_t *)) - != NGX_OK) - { - return NGX_ERROR; - } - - } else { - server = addr->servers.elts; - for (i = 0; i < addr->servers.nelts; i++) { - if (server[i] == cscf) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "a duplicate listen %V", - &addr->opt.addr_text); - return NGX_ERROR; - } - } - } - - server = ngx_array_push(&addr->servers); - if (server == NULL) { - return NGX_ERROR; - } - - *server = cscf; - - return NGX_OK; -} - - -static ngx_int_t -ngx_stream_optimize_servers(ngx_conf_t *cf, ngx_stream_core_main_conf_t *cmcf, - ngx_array_t *ports) -{ - ngx_uint_t p, a; - ngx_stream_conf_port_t *port; - ngx_stream_conf_addr_t *addr; - - if (ports == NULL) { - return NGX_OK; - } - - port = ports->elts; - for (p = 0; p < ports->nelts; p++) { - - ngx_sort(port[p].addrs.elts, (size_t) port[p].addrs.nelts, - sizeof(ngx_stream_conf_addr_t), ngx_stream_cmp_conf_addrs); - - /* - * check whether all name-based servers have the same - * configuration as a default server for given address:port - */ - - addr = port[p].addrs.elts; - for (a = 0; a < port[p].addrs.nelts; a++) { - - if (addr[a].servers.nelts > 1 -#if (NGX_PCRE) - || addr[a].default_server->captures -#endif - ) - { - if (ngx_stream_server_names(cf, cmcf, &addr[a]) != NGX_OK) { - return NGX_ERROR; - } - } - } - - if (ngx_stream_init_listening(cf, &port[p]) != NGX_OK) { - return NGX_ERROR; - } - } - - return NGX_OK; -} - - -static ngx_int_t -ngx_stream_server_names(ngx_conf_t *cf, ngx_stream_core_main_conf_t *cmcf, - ngx_stream_conf_addr_t *addr) -{ - ngx_int_t rc; - ngx_uint_t n, s; - ngx_hash_init_t hash; - ngx_hash_keys_arrays_t ha; - ngx_stream_server_name_t *name; - ngx_stream_core_srv_conf_t **cscfp; -#if (NGX_PCRE) - ngx_uint_t regex, i; - - regex = 0; -#endif - - ngx_memzero(&ha, sizeof(ngx_hash_keys_arrays_t)); - - ha.temp_pool = ngx_create_pool(NGX_DEFAULT_POOL_SIZE, cf->log); - if (ha.temp_pool == NULL) { - return NGX_ERROR; - } - - ha.pool = cf->pool; - - if (ngx_hash_keys_array_init(&ha, NGX_HASH_LARGE) != NGX_OK) { - goto failed; - } - - cscfp = addr->servers.elts; - - for (s = 0; s < addr->servers.nelts; s++) { - - name = cscfp[s]->server_names.elts; - - for (n = 0; n < cscfp[s]->server_names.nelts; n++) { - -#if (NGX_PCRE) - if (name[n].regex) { - regex++; - continue; - } -#endif - - rc = ngx_hash_add_key(&ha, &name[n].name, name[n].server, - NGX_HASH_WILDCARD_KEY); - - if (rc == NGX_ERROR) { - goto failed; - } - - if (rc == NGX_DECLINED) { - ngx_log_error(NGX_LOG_EMERG, cf->log, 0, - "invalid server name or wildcard \"%V\" on %V", - &name[n].name, &addr->opt.addr_text); - goto failed; - } - - if (rc == NGX_BUSY) { - ngx_log_error(NGX_LOG_WARN, cf->log, 0, - "conflicting server name \"%V\" on %V, ignored", - &name[n].name, &addr->opt.addr_text); - } - } - } - - hash.key = ngx_hash_key_lc; - hash.max_size = cmcf->server_names_hash_max_size; - hash.bucket_size = cmcf->server_names_hash_bucket_size; - hash.name = "server_names_hash"; - hash.pool = cf->pool; - - if (ha.keys.nelts) { - hash.hash = &addr->hash; - hash.temp_pool = NULL; - - if (ngx_hash_init(&hash, ha.keys.elts, ha.keys.nelts) != NGX_OK) { - goto failed; - } - } - - if (ha.dns_wc_head.nelts) { - - ngx_qsort(ha.dns_wc_head.elts, (size_t) ha.dns_wc_head.nelts, - sizeof(ngx_hash_key_t), ngx_stream_cmp_dns_wildcards); - - hash.hash = NULL; - hash.temp_pool = ha.temp_pool; - - if (ngx_hash_wildcard_init(&hash, ha.dns_wc_head.elts, - ha.dns_wc_head.nelts) - != NGX_OK) - { - goto failed; - } - - addr->wc_head = (ngx_hash_wildcard_t *) hash.hash; - } - - if (ha.dns_wc_tail.nelts) { - - ngx_qsort(ha.dns_wc_tail.elts, (size_t) ha.dns_wc_tail.nelts, - sizeof(ngx_hash_key_t), ngx_stream_cmp_dns_wildcards); - - hash.hash = NULL; - hash.temp_pool = ha.temp_pool; - - if (ngx_hash_wildcard_init(&hash, ha.dns_wc_tail.elts, - ha.dns_wc_tail.nelts) - != NGX_OK) - { - goto failed; - } - - addr->wc_tail = (ngx_hash_wildcard_t *) hash.hash; - } - - ngx_destroy_pool(ha.temp_pool); - -#if (NGX_PCRE) - - if (regex == 0) { - return NGX_OK; - } - - addr->nregex = regex; - addr->regex = ngx_palloc(cf->pool, - regex * sizeof(ngx_stream_server_name_t)); - if (addr->regex == NULL) { - return NGX_ERROR; - } - - i = 0; - - for (s = 0; s < addr->servers.nelts; s++) { - - name = cscfp[s]->server_names.elts; - - for (n = 0; n < cscfp[s]->server_names.nelts; n++) { - if (name[n].regex) { - addr->regex[i++] = name[n]; - } - } - } - -#endif - - return NGX_OK; - -failed: - - ngx_destroy_pool(ha.temp_pool); - - return NGX_ERROR; -} - - -static ngx_int_t -ngx_stream_cmp_conf_addrs(const void *one, const void *two) -{ - ngx_stream_conf_addr_t *first, *second; - - first = (ngx_stream_conf_addr_t *) one; - second = (ngx_stream_conf_addr_t *) two; - - if (first->opt.wildcard) { - /* a wildcard address must be the last resort, shift it to the end */ - return 1; - } - - if (second->opt.wildcard) { - /* a wildcard address must be the last resort, shift it to the end */ - return -1; - } - - if (first->opt.bind && !second->opt.bind) { - /* shift explicit bind()ed addresses to the start */ - return -1; - } - - if (!first->opt.bind && second->opt.bind) { - /* shift explicit bind()ed addresses to the start */ - return 1; - } - - /* do not sort by default */ - - return 0; -} - - -static int ngx_libc_cdecl -ngx_stream_cmp_dns_wildcards(const void *one, const void *two) -{ - ngx_hash_key_t *first, *second; - - first = (ngx_hash_key_t *) one; - second = (ngx_hash_key_t *) two; - - return ngx_dns_strcmp(first->key.data, second->key.data); -} - - -static ngx_int_t -ngx_stream_init_listening(ngx_conf_t *cf, ngx_stream_conf_port_t *port) -{ - ngx_uint_t i, last, bind_wildcard; - ngx_listening_t *ls; - ngx_stream_port_t *stport; - ngx_stream_conf_addr_t *addr; - - addr = port->addrs.elts; - last = port->addrs.nelts; - - /* - * If there is a binding to an "*:port" then we need to bind() to - * the "*:port" only and ignore other implicit bindings. The bindings - * have been already sorted: explicit bindings are on the start, then - * implicit bindings go, and wildcard binding is in the end. - */ - - if (addr[last - 1].opt.wildcard) { - addr[last - 1].opt.bind = 1; - bind_wildcard = 1; - - } else { - bind_wildcard = 0; - } - - i = 0; - - while (i < last) { - - if (bind_wildcard && !addr[i].opt.bind) { - i++; - continue; - } - - ls = ngx_stream_add_listening(cf, &addr[i]); - if (ls == NULL) { - return NGX_ERROR; - } - - stport = ngx_pcalloc(cf->pool, sizeof(ngx_stream_port_t)); - if (stport == NULL) { - return NGX_ERROR; - } - - ls->servers = stport; - - stport->naddrs = i + 1; - - switch (ls->sockaddr->sa_family) { - -#if (NGX_HAVE_INET6) - case AF_INET6: - if (ngx_stream_add_addrs6(cf, stport, addr) != NGX_OK) { - return NGX_ERROR; - } - break; -#endif - default: /* AF_INET */ - if (ngx_stream_add_addrs(cf, stport, addr) != NGX_OK) { - return NGX_ERROR; - } - break; - } - - addr++; - last--; - } - - return NGX_OK; -} - - -static ngx_listening_t * -ngx_stream_add_listening(ngx_conf_t *cf, ngx_stream_conf_addr_t *addr) -{ - ngx_listening_t *ls; - ngx_stream_core_srv_conf_t *cscf; - - ls = ngx_create_listening(cf, addr->opt.sockaddr, addr->opt.socklen); - if (ls == NULL) { - return NULL; - } - - ls->addr_ntop = 1; - - ls->handler = ngx_stream_init_connection; - - ls->pool_size = 256; - - cscf = addr->default_server; - - ls->logp = cscf->error_log; - ls->log.data = &ls->addr_text; - ls->log.handler = ngx_accept_log_error; - - ls->type = addr->opt.type; - ls->protocol = addr->opt.protocol; - ls->backlog = addr->opt.backlog; - ls->rcvbuf = addr->opt.rcvbuf; - ls->sndbuf = addr->opt.sndbuf; - - ls->keepalive = addr->opt.so_keepalive; -#if (NGX_HAVE_KEEPALIVE_TUNABLE) - ls->keepidle = addr->opt.tcp_keepidle; - ls->keepintvl = addr->opt.tcp_keepintvl; - ls->keepcnt = addr->opt.tcp_keepcnt; -#endif - -#if (NGX_HAVE_DEFERRED_ACCEPT && defined SO_ACCEPTFILTER) - ls->accept_filter = addr->opt.accept_filter; -#endif - -#if (NGX_HAVE_DEFERRED_ACCEPT && defined TCP_DEFER_ACCEPT) - ls->deferred_accept = addr->opt.deferred_accept; -#endif - -#if (NGX_HAVE_INET6) - ls->ipv6only = addr->opt.ipv6only; -#endif - -#if (NGX_HAVE_SETFIB) - ls->setfib = addr->opt.setfib; -#endif - -#if (NGX_HAVE_TCP_FASTOPEN) - ls->fastopen = addr->opt.fastopen; -#endif - -#if (NGX_HAVE_REUSEPORT) - ls->reuseport = addr->opt.reuseport; -#endif - - ls->wildcard = addr->opt.wildcard; - - return ls; -} - - -static ngx_int_t -ngx_stream_add_addrs(ngx_conf_t *cf, ngx_stream_port_t *stport, - ngx_stream_conf_addr_t *addr) -{ - ngx_uint_t i; - struct sockaddr_in *sin; - ngx_stream_in_addr_t *addrs; - ngx_stream_virtual_names_t *vn; - - stport->addrs = ngx_pcalloc(cf->pool, - stport->naddrs * sizeof(ngx_stream_in_addr_t)); - if (stport->addrs == NULL) { - return NGX_ERROR; - } - - addrs = stport->addrs; - - for (i = 0; i < stport->naddrs; i++) { - - sin = (struct sockaddr_in *) addr[i].opt.sockaddr; - addrs[i].addr = sin->sin_addr.s_addr; - addrs[i].conf.default_server = addr[i].default_server; -#if (NGX_STREAM_SSL) - addrs[i].conf.ssl = addr[i].opt.ssl; -#endif - addrs[i].conf.proxy_protocol = addr[i].opt.proxy_protocol; - - if (addr[i].hash.buckets == NULL - && (addr[i].wc_head == NULL - || addr[i].wc_head->hash.buckets == NULL) - && (addr[i].wc_tail == NULL - || addr[i].wc_tail->hash.buckets == NULL) -#if (NGX_PCRE) - && addr[i].nregex == 0 -#endif - ) - { - continue; - } - - vn = ngx_palloc(cf->pool, sizeof(ngx_stream_virtual_names_t)); - if (vn == NULL) { - return NGX_ERROR; - } - - addrs[i].conf.virtual_names = vn; - - vn->names.hash = addr[i].hash; - vn->names.wc_head = addr[i].wc_head; - vn->names.wc_tail = addr[i].wc_tail; -#if (NGX_PCRE) - vn->nregex = addr[i].nregex; - vn->regex = addr[i].regex; -#endif - } - - return NGX_OK; -} - - -#if (NGX_HAVE_INET6) - -static ngx_int_t -ngx_stream_add_addrs6(ngx_conf_t *cf, ngx_stream_port_t *stport, - ngx_stream_conf_addr_t *addr) -{ - ngx_uint_t i; - struct sockaddr_in6 *sin6; - ngx_stream_in6_addr_t *addrs6; - ngx_stream_virtual_names_t *vn; - - stport->addrs = ngx_pcalloc(cf->pool, - stport->naddrs * sizeof(ngx_stream_in6_addr_t)); - if (stport->addrs == NULL) { - return NGX_ERROR; - } - - addrs6 = stport->addrs; - - for (i = 0; i < stport->naddrs; i++) { - - sin6 = (struct sockaddr_in6 *) addr[i].opt.sockaddr; - addrs6[i].addr6 = sin6->sin6_addr; - addrs6[i].conf.default_server = addr[i].default_server; -#if (NGX_STREAM_SSL) - addrs6[i].conf.ssl = addr[i].opt.ssl; -#endif - addrs6[i].conf.proxy_protocol = addr[i].opt.proxy_protocol; - - if (addr[i].hash.buckets == NULL - && (addr[i].wc_head == NULL - || addr[i].wc_head->hash.buckets == NULL) - && (addr[i].wc_tail == NULL - || addr[i].wc_tail->hash.buckets == NULL) -#if (NGX_PCRE) - && addr[i].nregex == 0 -#endif - ) - { - continue; - } - - vn = ngx_palloc(cf->pool, sizeof(ngx_stream_virtual_names_t)); - if (vn == NULL) { - return NGX_ERROR; - } - - addrs6[i].conf.virtual_names = vn; - - vn->names.hash = addr[i].hash; - vn->names.wc_head = addr[i].wc_head; - vn->names.wc_tail = addr[i].wc_tail; -#if (NGX_PCRE) - vn->nregex = addr[i].nregex; - vn->regex = addr[i].regex; -#endif - } - - return NGX_OK; -} - -#endif diff --git a/src/deps/src/nginx-1.30.3/src/stream/ngx_stream.h b/src/deps/src/nginx-1.30.3/src/stream/ngx_stream.h deleted file mode 100644 index 9bc689e999..0000000000 --- a/src/deps/src/nginx-1.30.3/src/stream/ngx_stream.h +++ /dev/null @@ -1,384 +0,0 @@ - -/* - * Copyright (C) Roman Arutyunyan - * Copyright (C) Nginx, Inc. - */ - - -#ifndef _NGX_STREAM_H_INCLUDED_ -#define _NGX_STREAM_H_INCLUDED_ - - -#include -#include - -#if (NGX_STREAM_SSL) -#include -#endif - - -typedef struct ngx_stream_session_s ngx_stream_session_t; - - -#include -#include -#include -#include - - -#define NGX_STREAM_OK 200 -#define NGX_STREAM_BAD_REQUEST 400 -#define NGX_STREAM_FORBIDDEN 403 -#define NGX_STREAM_INTERNAL_SERVER_ERROR 500 -#define NGX_STREAM_BAD_GATEWAY 502 -#define NGX_STREAM_SERVICE_UNAVAILABLE 503 - - -typedef struct { - void **main_conf; - void **srv_conf; -} ngx_stream_conf_ctx_t; - - -typedef struct { - struct sockaddr *sockaddr; - socklen_t socklen; - ngx_str_t addr_text; - - unsigned set:1; - unsigned default_server:1; - unsigned bind:1; - unsigned wildcard:1; - unsigned ssl:1; -#if (NGX_HAVE_INET6) - unsigned ipv6only:1; -#endif - unsigned deferred_accept:1; - unsigned reuseport:1; - unsigned so_keepalive:2; - unsigned proxy_protocol:1; - - int backlog; - int rcvbuf; - int sndbuf; - int type; - int protocol; -#if (NGX_HAVE_SETFIB) - int setfib; -#endif -#if (NGX_HAVE_TCP_FASTOPEN) - int fastopen; -#endif -#if (NGX_HAVE_KEEPALIVE_TUNABLE) - int tcp_keepidle; - int tcp_keepintvl; - int tcp_keepcnt; -#endif - -#if (NGX_HAVE_DEFERRED_ACCEPT && defined SO_ACCEPTFILTER) - char *accept_filter; -#endif -} ngx_stream_listen_opt_t; - - -typedef enum { - NGX_STREAM_POST_ACCEPT_PHASE = 0, - NGX_STREAM_PREACCESS_PHASE, - NGX_STREAM_ACCESS_PHASE, - NGX_STREAM_SSL_PHASE, - NGX_STREAM_PREREAD_PHASE, - NGX_STREAM_CONTENT_PHASE, - NGX_STREAM_LOG_PHASE -} ngx_stream_phases; - - -typedef struct ngx_stream_phase_handler_s ngx_stream_phase_handler_t; - -typedef ngx_int_t (*ngx_stream_phase_handler_pt)(ngx_stream_session_t *s, - ngx_stream_phase_handler_t *ph); -typedef ngx_int_t (*ngx_stream_handler_pt)(ngx_stream_session_t *s); -typedef void (*ngx_stream_content_handler_pt)(ngx_stream_session_t *s); - - -struct ngx_stream_phase_handler_s { - ngx_stream_phase_handler_pt checker; - ngx_stream_handler_pt handler; - ngx_uint_t next; -}; - - -typedef struct { - ngx_stream_phase_handler_t *handlers; -} ngx_stream_phase_engine_t; - - -typedef struct { - ngx_array_t handlers; -} ngx_stream_phase_t; - - -typedef struct { - ngx_array_t servers; /* ngx_stream_core_srv_conf_t */ - - ngx_stream_phase_engine_t phase_engine; - - ngx_hash_t variables_hash; - - ngx_array_t variables; /* ngx_stream_variable_t */ - ngx_array_t prefix_variables; /* ngx_stream_variable_t */ - ngx_uint_t ncaptures; - - ngx_uint_t server_names_hash_max_size; - ngx_uint_t server_names_hash_bucket_size; - - ngx_uint_t variables_hash_max_size; - ngx_uint_t variables_hash_bucket_size; - - ngx_hash_keys_arrays_t *variables_keys; - - ngx_array_t *ports; - - ngx_stream_phase_t phases[NGX_STREAM_LOG_PHASE + 1]; -} ngx_stream_core_main_conf_t; - - -typedef struct { - /* array of the ngx_stream_server_name_t, "server_name" directive */ - ngx_array_t server_names; - - ngx_stream_content_handler_pt handler; - - ngx_stream_conf_ctx_t *ctx; - - u_char *file_name; - ngx_uint_t line; - - ngx_str_t server_name; - - ngx_flag_t tcp_nodelay; - size_t preread_buffer_size; - ngx_msec_t preread_timeout; - - ngx_log_t *error_log; - - ngx_msec_t resolver_timeout; - ngx_resolver_t *resolver; - - ngx_msec_t proxy_protocol_timeout; - - unsigned listen:1; -#if (NGX_PCRE) - unsigned captures:1; -#endif -} ngx_stream_core_srv_conf_t; - - -/* list of structures to find core_srv_conf quickly at run time */ - - -typedef struct { -#if (NGX_PCRE) - ngx_stream_regex_t *regex; -#endif - ngx_stream_core_srv_conf_t *server; /* virtual name server conf */ - ngx_str_t name; -} ngx_stream_server_name_t; - - -typedef struct { - ngx_hash_combined_t names; - - ngx_uint_t nregex; - ngx_stream_server_name_t *regex; -} ngx_stream_virtual_names_t; - - -typedef struct { - /* the default server configuration for this address:port */ - ngx_stream_core_srv_conf_t *default_server; - - ngx_stream_virtual_names_t *virtual_names; - - unsigned ssl:1; - unsigned proxy_protocol:1; -} ngx_stream_addr_conf_t; - - -typedef struct { - in_addr_t addr; - ngx_stream_addr_conf_t conf; -} ngx_stream_in_addr_t; - - -#if (NGX_HAVE_INET6) - -typedef struct { - struct in6_addr addr6; - ngx_stream_addr_conf_t conf; -} ngx_stream_in6_addr_t; - -#endif - - -typedef struct { - /* ngx_stream_in_addr_t or ngx_stream_in6_addr_t */ - void *addrs; - ngx_uint_t naddrs; -} ngx_stream_port_t; - - -typedef struct { - int family; - int type; - in_port_t port; - ngx_array_t addrs; /* array of ngx_stream_conf_addr_t */ -} ngx_stream_conf_port_t; - - -typedef struct { - ngx_stream_listen_opt_t opt; - - unsigned protocols:3; - unsigned protocols_set:1; - unsigned protocols_changed:1; - - ngx_hash_t hash; - ngx_hash_wildcard_t *wc_head; - ngx_hash_wildcard_t *wc_tail; - -#if (NGX_PCRE) - ngx_uint_t nregex; - ngx_stream_server_name_t *regex; -#endif - - /* the default server configuration for this address:port */ - ngx_stream_core_srv_conf_t *default_server; - ngx_array_t servers; - /* array of ngx_stream_core_srv_conf_t */ -} ngx_stream_conf_addr_t; - - -struct ngx_stream_session_s { - uint32_t signature; /* "STRM" */ - - ngx_connection_t *connection; - - off_t received; - time_t start_sec; - ngx_msec_t start_msec; - - ngx_log_handler_pt log_handler; - - void **ctx; - void **main_conf; - void **srv_conf; - - ngx_stream_virtual_names_t *virtual_names; - - ngx_stream_upstream_t *upstream; - ngx_array_t *upstream_states; - /* of ngx_stream_upstream_state_t */ - ngx_stream_variable_value_t *variables; - -#if (NGX_PCRE) - ngx_uint_t ncaptures; - int *captures; - u_char *captures_data; -#endif - - ngx_int_t phase_handler; - ngx_uint_t status; - - unsigned ssl:1; - - unsigned stat_processing:1; - - unsigned health_check:1; - - unsigned limit_conn_status:2; -}; - - -typedef struct { - ngx_int_t (*preconfiguration)(ngx_conf_t *cf); - ngx_int_t (*postconfiguration)(ngx_conf_t *cf); - - void *(*create_main_conf)(ngx_conf_t *cf); - char *(*init_main_conf)(ngx_conf_t *cf, void *conf); - - void *(*create_srv_conf)(ngx_conf_t *cf); - char *(*merge_srv_conf)(ngx_conf_t *cf, void *prev, - void *conf); -} ngx_stream_module_t; - - -#define NGX_STREAM_MODULE 0x4d525453 /* "STRM" */ - -#define NGX_STREAM_MAIN_CONF 0x02000000 -#define NGX_STREAM_SRV_CONF 0x04000000 -#define NGX_STREAM_UPS_CONF 0x08000000 - - -#define NGX_STREAM_MAIN_CONF_OFFSET offsetof(ngx_stream_conf_ctx_t, main_conf) -#define NGX_STREAM_SRV_CONF_OFFSET offsetof(ngx_stream_conf_ctx_t, srv_conf) - - -#define ngx_stream_get_module_ctx(s, module) (s)->ctx[module.ctx_index] -#define ngx_stream_set_ctx(s, c, module) s->ctx[module.ctx_index] = c; -#define ngx_stream_delete_ctx(s, module) s->ctx[module.ctx_index] = NULL; - - -#define ngx_stream_get_module_main_conf(s, module) \ - (s)->main_conf[module.ctx_index] -#define ngx_stream_get_module_srv_conf(s, module) \ - (s)->srv_conf[module.ctx_index] - -#define ngx_stream_conf_get_module_main_conf(cf, module) \ - ((ngx_stream_conf_ctx_t *) cf->ctx)->main_conf[module.ctx_index] -#define ngx_stream_conf_get_module_srv_conf(cf, module) \ - ((ngx_stream_conf_ctx_t *) cf->ctx)->srv_conf[module.ctx_index] - -#define ngx_stream_cycle_get_module_main_conf(cycle, module) \ - (cycle->conf_ctx[ngx_stream_module.index] ? \ - ((ngx_stream_conf_ctx_t *) cycle->conf_ctx[ngx_stream_module.index]) \ - ->main_conf[module.ctx_index]: \ - NULL) - - -#define NGX_STREAM_WRITE_BUFFERED 0x10 - - -ngx_int_t ngx_stream_add_listen(ngx_conf_t *cf, - ngx_stream_core_srv_conf_t *cscf, ngx_stream_listen_opt_t *lsopt); - -void ngx_stream_core_run_phases(ngx_stream_session_t *s); -ngx_int_t ngx_stream_core_generic_phase(ngx_stream_session_t *s, - ngx_stream_phase_handler_t *ph); -ngx_int_t ngx_stream_core_preread_phase(ngx_stream_session_t *s, - ngx_stream_phase_handler_t *ph); -ngx_int_t ngx_stream_core_content_phase(ngx_stream_session_t *s, - ngx_stream_phase_handler_t *ph); - -ngx_int_t ngx_stream_validate_host(ngx_str_t *host, ngx_pool_t *pool, - ngx_uint_t alloc); -ngx_int_t ngx_stream_find_virtual_server(ngx_stream_session_t *s, - ngx_str_t *host, ngx_stream_core_srv_conf_t **cscfp); - -void ngx_stream_init_connection(ngx_connection_t *c); -void ngx_stream_session_handler(ngx_event_t *rev); -void ngx_stream_finalize_session(ngx_stream_session_t *s, ngx_uint_t rc); - - -extern ngx_module_t ngx_stream_module; -extern ngx_uint_t ngx_stream_max_module; -extern ngx_module_t ngx_stream_core_module; - - -typedef ngx_int_t (*ngx_stream_filter_pt)(ngx_stream_session_t *s, - ngx_chain_t *chain, ngx_uint_t from_upstream); - - -extern ngx_stream_filter_pt ngx_stream_top_filter; - - -#endif /* _NGX_STREAM_H_INCLUDED_ */ diff --git a/src/deps/src/nginx-1.30.3/src/stream/ngx_stream_access_module.c b/src/deps/src/nginx-1.30.3/src/stream/ngx_stream_access_module.c deleted file mode 100644 index 070c22614f..0000000000 --- a/src/deps/src/nginx-1.30.3/src/stream/ngx_stream_access_module.c +++ /dev/null @@ -1,453 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#include -#include -#include - - -typedef struct { - in_addr_t mask; - in_addr_t addr; - ngx_uint_t deny; /* unsigned deny:1; */ -} ngx_stream_access_rule_t; - -#if (NGX_HAVE_INET6) - -typedef struct { - struct in6_addr addr; - struct in6_addr mask; - ngx_uint_t deny; /* unsigned deny:1; */ -} ngx_stream_access_rule6_t; - -#endif - -#if (NGX_HAVE_UNIX_DOMAIN) - -typedef struct { - ngx_uint_t deny; /* unsigned deny:1; */ -} ngx_stream_access_rule_un_t; - -#endif - -typedef struct { - ngx_array_t *rules; /* array of ngx_stream_access_rule_t */ -#if (NGX_HAVE_INET6) - ngx_array_t *rules6; /* array of ngx_stream_access_rule6_t */ -#endif -#if (NGX_HAVE_UNIX_DOMAIN) - ngx_array_t *rules_un; /* array of ngx_stream_access_rule_un_t */ -#endif -} ngx_stream_access_srv_conf_t; - - -static ngx_int_t ngx_stream_access_handler(ngx_stream_session_t *s); -static ngx_int_t ngx_stream_access_inet(ngx_stream_session_t *s, - ngx_stream_access_srv_conf_t *ascf, in_addr_t addr); -#if (NGX_HAVE_INET6) -static ngx_int_t ngx_stream_access_inet6(ngx_stream_session_t *s, - ngx_stream_access_srv_conf_t *ascf, u_char *p); -#endif -#if (NGX_HAVE_UNIX_DOMAIN) -static ngx_int_t ngx_stream_access_unix(ngx_stream_session_t *s, - ngx_stream_access_srv_conf_t *ascf); -#endif -static ngx_int_t ngx_stream_access_found(ngx_stream_session_t *s, - ngx_uint_t deny); -static char *ngx_stream_access_rule(ngx_conf_t *cf, ngx_command_t *cmd, - void *conf); -static void *ngx_stream_access_create_srv_conf(ngx_conf_t *cf); -static char *ngx_stream_access_merge_srv_conf(ngx_conf_t *cf, - void *parent, void *child); -static ngx_int_t ngx_stream_access_init(ngx_conf_t *cf); - - -static ngx_command_t ngx_stream_access_commands[] = { - - { ngx_string("allow"), - NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_TAKE1, - ngx_stream_access_rule, - NGX_STREAM_SRV_CONF_OFFSET, - 0, - NULL }, - - { ngx_string("deny"), - NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_TAKE1, - ngx_stream_access_rule, - NGX_STREAM_SRV_CONF_OFFSET, - 0, - NULL }, - - ngx_null_command -}; - - - -static ngx_stream_module_t ngx_stream_access_module_ctx = { - NULL, /* preconfiguration */ - ngx_stream_access_init, /* postconfiguration */ - - NULL, /* create main configuration */ - NULL, /* init main configuration */ - - ngx_stream_access_create_srv_conf, /* create server configuration */ - ngx_stream_access_merge_srv_conf /* merge server configuration */ -}; - - -ngx_module_t ngx_stream_access_module = { - NGX_MODULE_V1, - &ngx_stream_access_module_ctx, /* module context */ - ngx_stream_access_commands, /* module directives */ - NGX_STREAM_MODULE, /* module type */ - NULL, /* init master */ - NULL, /* init module */ - NULL, /* init process */ - NULL, /* init thread */ - NULL, /* exit thread */ - NULL, /* exit process */ - NULL, /* exit master */ - NGX_MODULE_V1_PADDING -}; - - -static ngx_int_t -ngx_stream_access_handler(ngx_stream_session_t *s) -{ - struct sockaddr_in *sin; - ngx_stream_access_srv_conf_t *ascf; -#if (NGX_HAVE_INET6) - u_char *p; - in_addr_t addr; - struct sockaddr_in6 *sin6; -#endif - - ascf = ngx_stream_get_module_srv_conf(s, ngx_stream_access_module); - - switch (s->connection->sockaddr->sa_family) { - - case AF_INET: - if (ascf->rules) { - sin = (struct sockaddr_in *) s->connection->sockaddr; - return ngx_stream_access_inet(s, ascf, sin->sin_addr.s_addr); - } - break; - -#if (NGX_HAVE_INET6) - - case AF_INET6: - sin6 = (struct sockaddr_in6 *) s->connection->sockaddr; - p = sin6->sin6_addr.s6_addr; - - if (ascf->rules && IN6_IS_ADDR_V4MAPPED(&sin6->sin6_addr)) { - addr = (in_addr_t) p[12] << 24; - addr += p[13] << 16; - addr += p[14] << 8; - addr += p[15]; - return ngx_stream_access_inet(s, ascf, htonl(addr)); - } - - if (ascf->rules6) { - return ngx_stream_access_inet6(s, ascf, p); - } - - break; - -#endif - -#if (NGX_HAVE_UNIX_DOMAIN) - - case AF_UNIX: - if (ascf->rules_un) { - return ngx_stream_access_unix(s, ascf); - } - - break; - -#endif - } - - return NGX_DECLINED; -} - - -static ngx_int_t -ngx_stream_access_inet(ngx_stream_session_t *s, - ngx_stream_access_srv_conf_t *ascf, in_addr_t addr) -{ - ngx_uint_t i; - ngx_stream_access_rule_t *rule; - - rule = ascf->rules->elts; - for (i = 0; i < ascf->rules->nelts; i++) { - - ngx_log_debug3(NGX_LOG_DEBUG_STREAM, s->connection->log, 0, - "access: %08XD %08XD %08XD", - addr, rule[i].mask, rule[i].addr); - - if ((addr & rule[i].mask) == rule[i].addr) { - return ngx_stream_access_found(s, rule[i].deny); - } - } - - return NGX_DECLINED; -} - - -#if (NGX_HAVE_INET6) - -static ngx_int_t -ngx_stream_access_inet6(ngx_stream_session_t *s, - ngx_stream_access_srv_conf_t *ascf, u_char *p) -{ - ngx_uint_t n; - ngx_uint_t i; - ngx_stream_access_rule6_t *rule6; - - rule6 = ascf->rules6->elts; - for (i = 0; i < ascf->rules6->nelts; i++) { - -#if (NGX_DEBUG) - { - size_t cl, ml, al; - u_char ct[NGX_INET6_ADDRSTRLEN]; - u_char mt[NGX_INET6_ADDRSTRLEN]; - u_char at[NGX_INET6_ADDRSTRLEN]; - - cl = ngx_inet6_ntop(p, ct, NGX_INET6_ADDRSTRLEN); - ml = ngx_inet6_ntop(rule6[i].mask.s6_addr, mt, NGX_INET6_ADDRSTRLEN); - al = ngx_inet6_ntop(rule6[i].addr.s6_addr, at, NGX_INET6_ADDRSTRLEN); - - ngx_log_debug6(NGX_LOG_DEBUG_STREAM, s->connection->log, 0, - "access: %*s %*s %*s", cl, ct, ml, mt, al, at); - } -#endif - - for (n = 0; n < 16; n++) { - if ((p[n] & rule6[i].mask.s6_addr[n]) != rule6[i].addr.s6_addr[n]) { - goto next; - } - } - - return ngx_stream_access_found(s, rule6[i].deny); - - next: - continue; - } - - return NGX_DECLINED; -} - -#endif - - -#if (NGX_HAVE_UNIX_DOMAIN) - -static ngx_int_t -ngx_stream_access_unix(ngx_stream_session_t *s, - ngx_stream_access_srv_conf_t *ascf) -{ - ngx_uint_t i; - ngx_stream_access_rule_un_t *rule_un; - - rule_un = ascf->rules_un->elts; - for (i = 0; i < ascf->rules_un->nelts; i++) { - - /* TODO: check path */ - if (1) { - return ngx_stream_access_found(s, rule_un[i].deny); - } - } - - return NGX_DECLINED; -} - -#endif - - -static ngx_int_t -ngx_stream_access_found(ngx_stream_session_t *s, ngx_uint_t deny) -{ - if (deny) { - ngx_log_error(NGX_LOG_ERR, s->connection->log, 0, - "access forbidden by rule"); - return NGX_STREAM_FORBIDDEN; - } - - return NGX_OK; -} - - -static char * -ngx_stream_access_rule(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) -{ - ngx_stream_access_srv_conf_t *ascf = conf; - - ngx_int_t rc; - ngx_uint_t all; - ngx_str_t *value; - ngx_cidr_t cidr; - ngx_stream_access_rule_t *rule; -#if (NGX_HAVE_INET6) - ngx_stream_access_rule6_t *rule6; -#endif -#if (NGX_HAVE_UNIX_DOMAIN) - ngx_stream_access_rule_un_t *rule_un; -#endif - - all = 0; - ngx_memzero(&cidr, sizeof(ngx_cidr_t)); - - value = cf->args->elts; - - if (value[1].len == 3 && ngx_strcmp(value[1].data, "all") == 0) { - all = 1; - -#if (NGX_HAVE_UNIX_DOMAIN) - } else if (value[1].len == 5 && ngx_strcmp(value[1].data, "unix:") == 0) { - cidr.family = AF_UNIX; -#endif - - } else { - rc = ngx_ptocidr(&value[1], &cidr); - - if (rc == NGX_ERROR) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "invalid parameter \"%V\"", &value[1]); - return NGX_CONF_ERROR; - } - - if (rc == NGX_DONE) { - ngx_conf_log_error(NGX_LOG_WARN, cf, 0, - "low address bits of %V are meaningless", &value[1]); - } - } - - if (cidr.family == AF_INET || all) { - - if (ascf->rules == NULL) { - ascf->rules = ngx_array_create(cf->pool, 4, - sizeof(ngx_stream_access_rule_t)); - if (ascf->rules == NULL) { - return NGX_CONF_ERROR; - } - } - - rule = ngx_array_push(ascf->rules); - if (rule == NULL) { - return NGX_CONF_ERROR; - } - - rule->mask = cidr.u.in.mask; - rule->addr = cidr.u.in.addr; - rule->deny = (value[0].data[0] == 'd') ? 1 : 0; - } - -#if (NGX_HAVE_INET6) - if (cidr.family == AF_INET6 || all) { - - if (ascf->rules6 == NULL) { - ascf->rules6 = ngx_array_create(cf->pool, 4, - sizeof(ngx_stream_access_rule6_t)); - if (ascf->rules6 == NULL) { - return NGX_CONF_ERROR; - } - } - - rule6 = ngx_array_push(ascf->rules6); - if (rule6 == NULL) { - return NGX_CONF_ERROR; - } - - rule6->mask = cidr.u.in6.mask; - rule6->addr = cidr.u.in6.addr; - rule6->deny = (value[0].data[0] == 'd') ? 1 : 0; - } -#endif - -#if (NGX_HAVE_UNIX_DOMAIN) - if (cidr.family == AF_UNIX || all) { - - if (ascf->rules_un == NULL) { - ascf->rules_un = ngx_array_create(cf->pool, 1, - sizeof(ngx_stream_access_rule_un_t)); - if (ascf->rules_un == NULL) { - return NGX_CONF_ERROR; - } - } - - rule_un = ngx_array_push(ascf->rules_un); - if (rule_un == NULL) { - return NGX_CONF_ERROR; - } - - rule_un->deny = (value[0].data[0] == 'd') ? 1 : 0; - } -#endif - - return NGX_CONF_OK; -} - - -static void * -ngx_stream_access_create_srv_conf(ngx_conf_t *cf) -{ - ngx_stream_access_srv_conf_t *conf; - - conf = ngx_pcalloc(cf->pool, sizeof(ngx_stream_access_srv_conf_t)); - if (conf == NULL) { - return NULL; - } - - return conf; -} - - -static char * -ngx_stream_access_merge_srv_conf(ngx_conf_t *cf, void *parent, void *child) -{ - ngx_stream_access_srv_conf_t *prev = parent; - ngx_stream_access_srv_conf_t *conf = child; - - if (conf->rules == NULL -#if (NGX_HAVE_INET6) - && conf->rules6 == NULL -#endif -#if (NGX_HAVE_UNIX_DOMAIN) - && conf->rules_un == NULL -#endif - ) { - conf->rules = prev->rules; -#if (NGX_HAVE_INET6) - conf->rules6 = prev->rules6; -#endif -#if (NGX_HAVE_UNIX_DOMAIN) - conf->rules_un = prev->rules_un; -#endif - } - - return NGX_CONF_OK; -} - - -static ngx_int_t -ngx_stream_access_init(ngx_conf_t *cf) -{ - ngx_stream_handler_pt *h; - ngx_stream_core_main_conf_t *cmcf; - - cmcf = ngx_stream_conf_get_module_main_conf(cf, ngx_stream_core_module); - - h = ngx_array_push(&cmcf->phases[NGX_STREAM_ACCESS_PHASE].handlers); - if (h == NULL) { - return NGX_ERROR; - } - - *h = ngx_stream_access_handler; - - return NGX_OK; -} diff --git a/src/deps/src/nginx-1.30.3/src/stream/ngx_stream_core_module.c b/src/deps/src/nginx-1.30.3/src/stream/ngx_stream_core_module.c deleted file mode 100644 index 6556c5a73c..0000000000 --- a/src/deps/src/nginx-1.30.3/src/stream/ngx_stream_core_module.c +++ /dev/null @@ -1,1523 +0,0 @@ - -/* - * Copyright (C) Roman Arutyunyan - * Copyright (C) Nginx, Inc. - */ - - -#include -#include -#include - - -static ngx_uint_t ngx_stream_preread_can_peek(ngx_connection_t *c); -static ngx_int_t ngx_stream_preread_peek(ngx_stream_session_t *s, - ngx_stream_phase_handler_t *ph); -static ngx_int_t ngx_stream_preread(ngx_stream_session_t *s, - ngx_stream_phase_handler_t *ph); -static ngx_int_t ngx_stream_core_preconfiguration(ngx_conf_t *cf); -static void *ngx_stream_core_create_main_conf(ngx_conf_t *cf); -static char *ngx_stream_core_init_main_conf(ngx_conf_t *cf, void *conf); -static void *ngx_stream_core_create_srv_conf(ngx_conf_t *cf); -static char *ngx_stream_core_merge_srv_conf(ngx_conf_t *cf, void *parent, - void *child); -static char *ngx_stream_core_error_log(ngx_conf_t *cf, ngx_command_t *cmd, - void *conf); -static char *ngx_stream_core_server(ngx_conf_t *cf, ngx_command_t *cmd, - void *conf); -static char *ngx_stream_core_listen(ngx_conf_t *cf, ngx_command_t *cmd, - void *conf); -static char *ngx_stream_core_server_name(ngx_conf_t *cf, ngx_command_t *cmd, - void *conf); -static char *ngx_stream_core_resolver(ngx_conf_t *cf, ngx_command_t *cmd, - void *conf); - - -static ngx_command_t ngx_stream_core_commands[] = { - - { ngx_string("variables_hash_max_size"), - NGX_STREAM_MAIN_CONF|NGX_CONF_TAKE1, - ngx_conf_set_num_slot, - NGX_STREAM_MAIN_CONF_OFFSET, - offsetof(ngx_stream_core_main_conf_t, variables_hash_max_size), - NULL }, - - { ngx_string("variables_hash_bucket_size"), - NGX_STREAM_MAIN_CONF|NGX_CONF_TAKE1, - ngx_conf_set_num_slot, - NGX_STREAM_MAIN_CONF_OFFSET, - offsetof(ngx_stream_core_main_conf_t, variables_hash_bucket_size), - NULL }, - - { ngx_string("server_names_hash_max_size"), - NGX_STREAM_MAIN_CONF|NGX_CONF_TAKE1, - ngx_conf_set_num_slot, - NGX_STREAM_MAIN_CONF_OFFSET, - offsetof(ngx_stream_core_main_conf_t, server_names_hash_max_size), - NULL }, - - { ngx_string("server_names_hash_bucket_size"), - NGX_STREAM_MAIN_CONF|NGX_CONF_TAKE1, - ngx_conf_set_num_slot, - NGX_STREAM_MAIN_CONF_OFFSET, - offsetof(ngx_stream_core_main_conf_t, server_names_hash_bucket_size), - NULL }, - - { ngx_string("server"), - NGX_STREAM_MAIN_CONF|NGX_CONF_BLOCK|NGX_CONF_NOARGS, - ngx_stream_core_server, - 0, - 0, - NULL }, - - { ngx_string("listen"), - NGX_STREAM_SRV_CONF|NGX_CONF_1MORE, - ngx_stream_core_listen, - NGX_STREAM_SRV_CONF_OFFSET, - 0, - NULL }, - - { ngx_string("server_name"), - NGX_STREAM_SRV_CONF|NGX_CONF_1MORE, - ngx_stream_core_server_name, - NGX_STREAM_SRV_CONF_OFFSET, - 0, - NULL }, - - { ngx_string("error_log"), - NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_1MORE, - ngx_stream_core_error_log, - NGX_STREAM_SRV_CONF_OFFSET, - 0, - NULL }, - - { ngx_string("resolver"), - NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_1MORE, - ngx_stream_core_resolver, - NGX_STREAM_SRV_CONF_OFFSET, - 0, - NULL }, - - { ngx_string("resolver_timeout"), - NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_TAKE1, - ngx_conf_set_msec_slot, - NGX_STREAM_SRV_CONF_OFFSET, - offsetof(ngx_stream_core_srv_conf_t, resolver_timeout), - NULL }, - - { ngx_string("proxy_protocol_timeout"), - NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_TAKE1, - ngx_conf_set_msec_slot, - NGX_STREAM_SRV_CONF_OFFSET, - offsetof(ngx_stream_core_srv_conf_t, proxy_protocol_timeout), - NULL }, - - { ngx_string("tcp_nodelay"), - NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_FLAG, - ngx_conf_set_flag_slot, - NGX_STREAM_SRV_CONF_OFFSET, - offsetof(ngx_stream_core_srv_conf_t, tcp_nodelay), - NULL }, - - { ngx_string("preread_buffer_size"), - NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_TAKE1, - ngx_conf_set_size_slot, - NGX_STREAM_SRV_CONF_OFFSET, - offsetof(ngx_stream_core_srv_conf_t, preread_buffer_size), - NULL }, - - { ngx_string("preread_timeout"), - NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_TAKE1, - ngx_conf_set_msec_slot, - NGX_STREAM_SRV_CONF_OFFSET, - offsetof(ngx_stream_core_srv_conf_t, preread_timeout), - NULL }, - - ngx_null_command -}; - - -static ngx_stream_module_t ngx_stream_core_module_ctx = { - ngx_stream_core_preconfiguration, /* preconfiguration */ - NULL, /* postconfiguration */ - - ngx_stream_core_create_main_conf, /* create main configuration */ - ngx_stream_core_init_main_conf, /* init main configuration */ - - ngx_stream_core_create_srv_conf, /* create server configuration */ - ngx_stream_core_merge_srv_conf /* merge server configuration */ -}; - - -ngx_module_t ngx_stream_core_module = { - NGX_MODULE_V1, - &ngx_stream_core_module_ctx, /* module context */ - ngx_stream_core_commands, /* module directives */ - NGX_STREAM_MODULE, /* module type */ - NULL, /* init master */ - NULL, /* init module */ - NULL, /* init process */ - NULL, /* init thread */ - NULL, /* exit thread */ - NULL, /* exit process */ - NULL, /* exit master */ - NGX_MODULE_V1_PADDING -}; - - -void -ngx_stream_core_run_phases(ngx_stream_session_t *s) -{ - ngx_int_t rc; - ngx_stream_phase_handler_t *ph; - ngx_stream_core_main_conf_t *cmcf; - - cmcf = ngx_stream_get_module_main_conf(s, ngx_stream_core_module); - - ph = cmcf->phase_engine.handlers; - - while (ph[s->phase_handler].checker) { - - rc = ph[s->phase_handler].checker(s, &ph[s->phase_handler]); - - if (rc == NGX_OK) { - return; - } - } -} - - -ngx_int_t -ngx_stream_core_generic_phase(ngx_stream_session_t *s, - ngx_stream_phase_handler_t *ph) -{ - ngx_int_t rc; - - /* - * generic phase checker, - * used by all phases, except for preread and content - */ - - ngx_log_debug1(NGX_LOG_DEBUG_STREAM, s->connection->log, 0, - "generic phase: %ui", s->phase_handler); - - rc = ph->handler(s); - - if (rc == NGX_OK) { - s->phase_handler = ph->next; - return NGX_AGAIN; - } - - if (rc == NGX_DECLINED) { - s->phase_handler++; - return NGX_AGAIN; - } - - if (rc == NGX_AGAIN || rc == NGX_DONE) { - return NGX_OK; - } - - if (rc == NGX_ERROR) { - rc = NGX_STREAM_INTERNAL_SERVER_ERROR; - } - - ngx_stream_finalize_session(s, rc); - - return NGX_OK; -} - - -ngx_int_t -ngx_stream_core_preread_phase(ngx_stream_session_t *s, - ngx_stream_phase_handler_t *ph) -{ - ngx_int_t rc; - ngx_connection_t *c; - ngx_stream_core_srv_conf_t *cscf; - - c = s->connection; - - c->log->action = "prereading client data"; - - cscf = ngx_stream_get_module_srv_conf(s, ngx_stream_core_module); - - if (c->read->timedout) { - rc = NGX_STREAM_OK; - goto done; - } - - if (!c->read->timer_set) { - rc = ph->handler(s); - - if (rc != NGX_AGAIN) { - goto done; - } - } - - if (c->buffer == NULL) { - c->buffer = ngx_create_temp_buf(c->pool, cscf->preread_buffer_size); - if (c->buffer == NULL) { - rc = NGX_ERROR; - goto done; - } - } - - if (ngx_stream_preread_can_peek(c)) { - rc = ngx_stream_preread_peek(s, ph); - - } else { - rc = ngx_stream_preread(s, ph); - } - -done: - - if (rc == NGX_AGAIN) { - if (ngx_handle_read_event(c->read, 0) != NGX_OK) { - ngx_stream_finalize_session(s, NGX_STREAM_INTERNAL_SERVER_ERROR); - return NGX_OK; - } - - if (!c->read->timer_set) { - ngx_add_timer(c->read, cscf->preread_timeout); - } - - c->read->handler = ngx_stream_session_handler; - - return NGX_OK; - } - - if (c->read->timer_set) { - ngx_del_timer(c->read); - } - - if (rc == NGX_OK) { - s->phase_handler = ph->next; - return NGX_AGAIN; - } - - if (rc == NGX_DECLINED) { - s->phase_handler++; - return NGX_AGAIN; - } - - if (rc == NGX_DONE) { - return NGX_OK; - } - - if (rc == NGX_ERROR) { - rc = NGX_STREAM_INTERNAL_SERVER_ERROR; - } - - ngx_stream_finalize_session(s, rc); - - return NGX_OK; -} - - -static ngx_uint_t -ngx_stream_preread_can_peek(ngx_connection_t *c) -{ -#if (NGX_STREAM_SSL) - if (c->ssl) { - return 0; - } -#endif - - if ((ngx_event_flags & NGX_USE_CLEAR_EVENT) == 0) { - return 0; - } - -#if (NGX_HAVE_KQUEUE) - if (ngx_event_flags & NGX_USE_KQUEUE_EVENT) { - return 1; - } -#endif - -#if (NGX_HAVE_EPOLLRDHUP) - if ((ngx_event_flags & NGX_USE_EPOLL_EVENT) && ngx_use_epoll_rdhup) { - return 1; - } -#endif - - return 0; -} - - -static ngx_int_t -ngx_stream_preread_peek(ngx_stream_session_t *s, ngx_stream_phase_handler_t *ph) -{ - ssize_t n; - ngx_int_t rc; - ngx_err_t err; - ngx_connection_t *c; - - c = s->connection; - - n = recv(c->fd, (char *) c->buffer->last, - c->buffer->end - c->buffer->last, MSG_PEEK); - - err = ngx_socket_errno; - - ngx_log_debug1(NGX_LOG_DEBUG_STREAM, c->log, 0, "stream recv(): %z", n); - - if (n == -1) { - if (err == NGX_EAGAIN) { - c->read->ready = 0; - return NGX_AGAIN; - } - - ngx_connection_error(c, err, "recv() failed"); - return NGX_STREAM_OK; - } - - if (n == 0) { - return NGX_STREAM_OK; - } - - c->buffer->last += n; - - rc = ph->handler(s); - - if (rc != NGX_AGAIN) { - c->buffer->last = c->buffer->pos; - return rc; - } - - if (c->buffer->last == c->buffer->end) { - ngx_log_error(NGX_LOG_ERR, c->log, 0, "preread buffer full"); - return NGX_STREAM_BAD_REQUEST; - } - - if (c->read->pending_eof) { - return NGX_STREAM_OK; - } - - c->buffer->last = c->buffer->pos; - - return NGX_AGAIN; -} - - -static ngx_int_t -ngx_stream_preread(ngx_stream_session_t *s, ngx_stream_phase_handler_t *ph) -{ - ssize_t n; - ngx_int_t rc; - ngx_connection_t *c; - - c = s->connection; - - while (c->read->ready) { - - n = c->recv(c, c->buffer->last, c->buffer->end - c->buffer->last); - - if (n == NGX_AGAIN) { - return NGX_AGAIN; - } - - if (n == NGX_ERROR || n == 0) { - return NGX_STREAM_OK; - } - - c->buffer->last += n; - - rc = ph->handler(s); - - if (rc != NGX_AGAIN) { - return rc; - } - - if (c->buffer->last == c->buffer->end) { - ngx_log_error(NGX_LOG_ERR, c->log, 0, "preread buffer full"); - return NGX_STREAM_BAD_REQUEST; - } - } - - return NGX_AGAIN; -} - - -ngx_int_t -ngx_stream_core_content_phase(ngx_stream_session_t *s, - ngx_stream_phase_handler_t *ph) -{ - ngx_connection_t *c; - ngx_stream_core_srv_conf_t *cscf; - - c = s->connection; - - c->log->action = NULL; - - cscf = ngx_stream_get_module_srv_conf(s, ngx_stream_core_module); - - if (c->type == SOCK_STREAM - && cscf->tcp_nodelay - && ngx_tcp_nodelay(c) != NGX_OK) - { - ngx_stream_finalize_session(s, NGX_STREAM_INTERNAL_SERVER_ERROR); - return NGX_OK; - } - - if (cscf->handler == NULL) { - ngx_log_debug0(NGX_LOG_DEBUG_STREAM, c->log, 0, - "no handler for server"); - ngx_stream_finalize_session(s, NGX_STREAM_INTERNAL_SERVER_ERROR); - return NGX_OK; - } - - cscf->handler(s); - - return NGX_OK; -} - - -ngx_int_t -ngx_stream_validate_host(ngx_str_t *host, ngx_pool_t *pool, ngx_uint_t alloc) -{ - u_char *h, ch; - size_t i, dot_pos, host_len; - ngx_int_t port; - - enum { - sw_host_start = 0, - sw_host, - sw_host_ip_literal, - sw_host_end, - sw_port, - } state; - - dot_pos = host->len; - host_len = host->len; - port = 0; - - h = host->data; - - state = sw_host_start; - - for (i = 0; i < host->len; i++) { - ch = h[i]; - - switch (state) { - - case sw_host_start: - - if (ch == '[') { - state = sw_host_ip_literal; - break; - } - - state = sw_host; - - /* fall through */ - - case sw_host: - - if (ch >= 'A' && ch <= 'Z') { - alloc = 1; - break; - } - - if (ch >= 'a' && ch <= 'z') { - break; - } - - if (ch >= '0' && ch <= '9') { - break; - } - - switch (ch) { - case ':': - host_len = i; - state = sw_port; - break; - case '-': - break; - case '.': - if (dot_pos == i - 1) { - return NGX_DECLINED; - } - dot_pos = i; - break; - case '_': - case '~': - /* unreserved */ - break; - case '!': - case '$': - case '&': - case '\'': - case '(': - case ')': - case '*': - case '+': - case ',': - case ';': - case '=': - /* sub-delims */ - break; - case '%': - /* pct-encoded */ - break; - default: - return NGX_DECLINED; - } - break; - - case sw_host_ip_literal: - - if (ch >= 'A' && ch <= 'Z') { - alloc = 1; - break; - } - - if (ch >= 'a' && ch <= 'z') { - break; - } - - if (ch >= '0' && ch <= '9') { - break; - } - - switch (ch) { - case ':': - break; - case ']': - host_len = i + 1; - state = sw_host_end; - break; - case '-': - break; - case '.': - if (dot_pos == i - 1) { - return NGX_DECLINED; - } - dot_pos = i; - break; - case '_': - case '~': - /* unreserved */ - break; - case '!': - case '$': - case '&': - case '\'': - case '(': - case ')': - case '*': - case '+': - case ',': - case ';': - case '=': - /* sub-delims */ - break; - default: - return NGX_DECLINED; - } - break; - - case sw_host_end: - - if (ch == ':') { - state = sw_port; - break; - } - return NGX_DECLINED; - - case sw_port: - - if (ch >= '0' && ch <= '9') { - if (port >= 6553 && (port > 6553 || (ch - '0') > 5)) { - return NGX_DECLINED; - } - - port = port * 10 + (ch - '0'); - break; - } - return NGX_DECLINED; - } - } - - if (state == sw_host_ip_literal) { - return NGX_DECLINED; - } - - if (dot_pos == host_len - 1) { - host_len--; - } - - if (host_len == 0) { - return NGX_DECLINED; - } - - if (alloc) { - host->data = ngx_pnalloc(pool, host_len); - if (host->data == NULL) { - return NGX_ERROR; - } - - ngx_strlow(host->data, h, host_len); - } - - host->len = host_len; - - return NGX_OK; -} - - -ngx_int_t -ngx_stream_find_virtual_server(ngx_stream_session_t *s, - ngx_str_t *host, ngx_stream_core_srv_conf_t **cscfp) -{ - ngx_stream_core_srv_conf_t *cscf; - - if (s->virtual_names == NULL) { - return NGX_DECLINED; - } - - cscf = ngx_hash_find_combined(&s->virtual_names->names, - ngx_hash_key(host->data, host->len), - host->data, host->len); - - if (cscf) { - *cscfp = cscf; - return NGX_OK; - } - -#if (NGX_PCRE) - - if (host->len && s->virtual_names->nregex) { - ngx_int_t n; - ngx_uint_t i; - ngx_stream_server_name_t *sn; - - sn = s->virtual_names->regex; - - for (i = 0; i < s->virtual_names->nregex; i++) { - - n = ngx_stream_regex_exec(s, sn[i].regex, host); - - if (n == NGX_DECLINED) { - continue; - } - - if (n == NGX_OK) { - *cscfp = sn[i].server; - return NGX_OK; - } - - return NGX_ERROR; - } - } - -#endif /* NGX_PCRE */ - - return NGX_DECLINED; -} - - -static ngx_int_t -ngx_stream_core_preconfiguration(ngx_conf_t *cf) -{ - return ngx_stream_variables_add_core_vars(cf); -} - - -static void * -ngx_stream_core_create_main_conf(ngx_conf_t *cf) -{ - ngx_stream_core_main_conf_t *cmcf; - - cmcf = ngx_pcalloc(cf->pool, sizeof(ngx_stream_core_main_conf_t)); - if (cmcf == NULL) { - return NULL; - } - - if (ngx_array_init(&cmcf->servers, cf->pool, 4, - sizeof(ngx_stream_core_srv_conf_t *)) - != NGX_OK) - { - return NULL; - } - - cmcf->server_names_hash_max_size = NGX_CONF_UNSET_UINT; - cmcf->server_names_hash_bucket_size = NGX_CONF_UNSET_UINT; - - cmcf->variables_hash_max_size = NGX_CONF_UNSET_UINT; - cmcf->variables_hash_bucket_size = NGX_CONF_UNSET_UINT; - - return cmcf; -} - - -static char * -ngx_stream_core_init_main_conf(ngx_conf_t *cf, void *conf) -{ - ngx_stream_core_main_conf_t *cmcf = conf; - - ngx_conf_init_uint_value(cmcf->server_names_hash_max_size, 512); - ngx_conf_init_uint_value(cmcf->server_names_hash_bucket_size, - ngx_cacheline_size); - - cmcf->server_names_hash_bucket_size = - ngx_align(cmcf->server_names_hash_bucket_size, ngx_cacheline_size); - - - ngx_conf_init_uint_value(cmcf->variables_hash_max_size, 1024); - ngx_conf_init_uint_value(cmcf->variables_hash_bucket_size, 64); - - cmcf->variables_hash_bucket_size = - ngx_align(cmcf->variables_hash_bucket_size, ngx_cacheline_size); - - if (cmcf->ncaptures) { - cmcf->ncaptures = (cmcf->ncaptures + 1) * 3; - } - - return NGX_CONF_OK; -} - - -static void * -ngx_stream_core_create_srv_conf(ngx_conf_t *cf) -{ - ngx_stream_core_srv_conf_t *cscf; - - cscf = ngx_pcalloc(cf->pool, sizeof(ngx_stream_core_srv_conf_t)); - if (cscf == NULL) { - return NULL; - } - - /* - * set by ngx_pcalloc(): - * - * cscf->handler = NULL; - * cscf->error_log = NULL; - */ - - if (ngx_array_init(&cscf->server_names, cf->temp_pool, 4, - sizeof(ngx_stream_server_name_t)) - != NGX_OK) - { - return NULL; - } - - cscf->file_name = cf->conf_file->file.name.data; - cscf->line = cf->conf_file->line; - cscf->resolver_timeout = NGX_CONF_UNSET_MSEC; - cscf->proxy_protocol_timeout = NGX_CONF_UNSET_MSEC; - cscf->tcp_nodelay = NGX_CONF_UNSET; - cscf->preread_buffer_size = NGX_CONF_UNSET_SIZE; - cscf->preread_timeout = NGX_CONF_UNSET_MSEC; - - return cscf; -} - - -static char * -ngx_stream_core_merge_srv_conf(ngx_conf_t *cf, void *parent, void *child) -{ - ngx_stream_core_srv_conf_t *prev = parent; - ngx_stream_core_srv_conf_t *conf = child; - - ngx_str_t name; - ngx_stream_server_name_t *sn; - - ngx_conf_merge_msec_value(conf->resolver_timeout, - prev->resolver_timeout, 30000); - - if (conf->resolver == NULL) { - - if (prev->resolver == NULL) { - - /* - * create dummy resolver in stream {} context - * to inherit it in all servers - */ - - prev->resolver = ngx_resolver_create(cf, NULL, 0); - if (prev->resolver == NULL) { - return NGX_CONF_ERROR; - } - } - - conf->resolver = prev->resolver; - } - - if (conf->error_log == NULL) { - if (prev->error_log) { - conf->error_log = prev->error_log; - } else { - conf->error_log = &cf->cycle->new_log; - } - } - - ngx_conf_merge_msec_value(conf->proxy_protocol_timeout, - prev->proxy_protocol_timeout, 30000); - - ngx_conf_merge_value(conf->tcp_nodelay, prev->tcp_nodelay, 1); - - ngx_conf_merge_size_value(conf->preread_buffer_size, - prev->preread_buffer_size, 16384); - - ngx_conf_merge_msec_value(conf->preread_timeout, - prev->preread_timeout, 30000); - - if (conf->server_names.nelts == 0) { - /* the array has 4 empty preallocated elements, so push cannot fail */ - sn = ngx_array_push(&conf->server_names); -#if (NGX_PCRE) - sn->regex = NULL; -#endif - sn->server = conf; - ngx_str_set(&sn->name, ""); - } - - sn = conf->server_names.elts; - name = sn[0].name; - -#if (NGX_PCRE) - if (sn->regex) { - name.len++; - name.data--; - } else -#endif - - if (name.data[0] == '.') { - name.len--; - name.data++; - } - - conf->server_name.len = name.len; - conf->server_name.data = ngx_pstrdup(cf->pool, &name); - if (conf->server_name.data == NULL) { - return NGX_CONF_ERROR; - } - - return NGX_CONF_OK; -} - - -static char * -ngx_stream_core_error_log(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) -{ - ngx_stream_core_srv_conf_t *cscf = conf; - - return ngx_log_set_log(cf, &cscf->error_log); -} - - -static char * -ngx_stream_core_server(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) -{ - char *rv; - void *mconf; - ngx_uint_t m; - ngx_conf_t pcf; - ngx_stream_module_t *module; - ngx_stream_conf_ctx_t *ctx, *stream_ctx; - ngx_stream_core_srv_conf_t *cscf, **cscfp; - ngx_stream_core_main_conf_t *cmcf; - - ctx = ngx_pcalloc(cf->pool, sizeof(ngx_stream_conf_ctx_t)); - if (ctx == NULL) { - return NGX_CONF_ERROR; - } - - stream_ctx = cf->ctx; - ctx->main_conf = stream_ctx->main_conf; - - /* the server{}'s srv_conf */ - - ctx->srv_conf = ngx_pcalloc(cf->pool, - sizeof(void *) * ngx_stream_max_module); - if (ctx->srv_conf == NULL) { - return NGX_CONF_ERROR; - } - - for (m = 0; cf->cycle->modules[m]; m++) { - if (cf->cycle->modules[m]->type != NGX_STREAM_MODULE) { - continue; - } - - module = cf->cycle->modules[m]->ctx; - - if (module->create_srv_conf) { - mconf = module->create_srv_conf(cf); - if (mconf == NULL) { - return NGX_CONF_ERROR; - } - - ctx->srv_conf[cf->cycle->modules[m]->ctx_index] = mconf; - } - } - - /* the server configuration context */ - - cscf = ctx->srv_conf[ngx_stream_core_module.ctx_index]; - cscf->ctx = ctx; - - cmcf = ctx->main_conf[ngx_stream_core_module.ctx_index]; - - cscfp = ngx_array_push(&cmcf->servers); - if (cscfp == NULL) { - return NGX_CONF_ERROR; - } - - *cscfp = cscf; - - - /* parse inside server{} */ - - pcf = *cf; - cf->ctx = ctx; - cf->cmd_type = NGX_STREAM_SRV_CONF; - - rv = ngx_conf_parse(cf, NULL); - - *cf = pcf; - - if (rv == NGX_CONF_OK && !cscf->listen) { - ngx_log_error(NGX_LOG_EMERG, cf->log, 0, - "no \"listen\" is defined for server in %s:%ui", - cscf->file_name, cscf->line); - return NGX_CONF_ERROR; - } - - return rv; -} - - -static char * -ngx_stream_core_listen(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) -{ - ngx_stream_core_srv_conf_t *cscf = conf; - - ngx_str_t *value, size; - ngx_url_t u; - ngx_uint_t n, i, backlog; - ngx_stream_listen_opt_t lsopt; - - cscf->listen = 1; - - value = cf->args->elts; - - ngx_memzero(&u, sizeof(ngx_url_t)); - - u.url = value[1]; - u.listen = 1; - - if (ngx_parse_url(cf->pool, &u) != NGX_OK) { - if (u.err) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "%s in \"%V\" of the \"listen\" directive", - u.err, &u.url); - } - - return NGX_CONF_ERROR; - } - - ngx_memzero(&lsopt, sizeof(ngx_stream_listen_opt_t)); - - lsopt.backlog = NGX_LISTEN_BACKLOG; - lsopt.type = SOCK_STREAM; - lsopt.rcvbuf = -1; - lsopt.sndbuf = -1; -#if (NGX_HAVE_SETFIB) - lsopt.setfib = -1; -#endif -#if (NGX_HAVE_TCP_FASTOPEN) - lsopt.fastopen = -1; -#endif -#if (NGX_HAVE_INET6) - lsopt.ipv6only = 1; -#endif - - backlog = 0; - - for (i = 2; i < cf->args->nelts; i++) { - - if (ngx_strcmp(value[i].data, "default_server") == 0) { - lsopt.default_server = 1; - continue; - } - -#if !(NGX_WIN32) - if (ngx_strcmp(value[i].data, "udp") == 0) { - lsopt.type = SOCK_DGRAM; - continue; - } -#endif - - if (ngx_strcmp(value[i].data, "bind") == 0) { - lsopt.set = 1; - lsopt.bind = 1; - continue; - } - -#if (NGX_HAVE_SETFIB) - if (ngx_strncmp(value[i].data, "setfib=", 7) == 0) { - lsopt.setfib = ngx_atoi(value[i].data + 7, value[i].len - 7); - lsopt.set = 1; - lsopt.bind = 1; - - if (lsopt.setfib == NGX_ERROR) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "invalid setfib \"%V\"", &value[i]); - return NGX_CONF_ERROR; - } - - continue; - } -#endif - -#if (NGX_HAVE_TCP_FASTOPEN) - if (ngx_strncmp(value[i].data, "fastopen=", 9) == 0) { - lsopt.fastopen = ngx_atoi(value[i].data + 9, value[i].len - 9); - lsopt.set = 1; - lsopt.bind = 1; - - if (lsopt.fastopen == NGX_ERROR) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "invalid fastopen \"%V\"", &value[i]); - return NGX_CONF_ERROR; - } - - continue; - } -#endif - - if (ngx_strncmp(value[i].data, "backlog=", 8) == 0) { - lsopt.backlog = ngx_atoi(value[i].data + 8, value[i].len - 8); - lsopt.set = 1; - lsopt.bind = 1; - - if (lsopt.backlog == NGX_ERROR || lsopt.backlog == 0) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "invalid backlog \"%V\"", &value[i]); - return NGX_CONF_ERROR; - } - - backlog = 1; - - continue; - } - - if (ngx_strncmp(value[i].data, "rcvbuf=", 7) == 0) { - size.len = value[i].len - 7; - size.data = value[i].data + 7; - - lsopt.rcvbuf = ngx_parse_size(&size); - lsopt.set = 1; - lsopt.bind = 1; - - if (lsopt.rcvbuf == NGX_ERROR) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "invalid rcvbuf \"%V\"", &value[i]); - return NGX_CONF_ERROR; - } - - continue; - } - - if (ngx_strncmp(value[i].data, "sndbuf=", 7) == 0) { - size.len = value[i].len - 7; - size.data = value[i].data + 7; - - lsopt.sndbuf = ngx_parse_size(&size); - lsopt.set = 1; - lsopt.bind = 1; - - if (lsopt.sndbuf == NGX_ERROR) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "invalid sndbuf \"%V\"", &value[i]); - return NGX_CONF_ERROR; - } - - continue; - } - - if (ngx_strncmp(value[i].data, "accept_filter=", 14) == 0) { -#if (NGX_HAVE_DEFERRED_ACCEPT && defined SO_ACCEPTFILTER) - lsopt.accept_filter = (char *) &value[i].data[14]; - lsopt.set = 1; - lsopt.bind = 1; -#else - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "accept filters \"%V\" are not supported " - "on this platform, ignored", - &value[i]); -#endif - continue; - } - - if (ngx_strcmp(value[i].data, "deferred") == 0) { -#if (NGX_HAVE_DEFERRED_ACCEPT && defined TCP_DEFER_ACCEPT) - lsopt.deferred_accept = 1; - lsopt.set = 1; - lsopt.bind = 1; -#else - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "the deferred accept is not supported " - "on this platform, ignored"); -#endif - continue; - } - - if (ngx_strncmp(value[i].data, "ipv6only=o", 10) == 0) { -#if (NGX_HAVE_INET6 && defined IPV6_V6ONLY) - if (ngx_strcmp(&value[i].data[10], "n") == 0) { - lsopt.ipv6only = 1; - - } else if (ngx_strcmp(&value[i].data[10], "ff") == 0) { - lsopt.ipv6only = 0; - - } else { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "invalid ipv6only flags \"%s\"", - &value[i].data[9]); - return NGX_CONF_ERROR; - } - - lsopt.set = 1; - lsopt.bind = 1; - - continue; -#else - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "ipv6only is not supported " - "on this platform"); - return NGX_CONF_ERROR; -#endif - } - - if (ngx_strcmp(value[i].data, "reuseport") == 0) { -#if (NGX_HAVE_REUSEPORT) - lsopt.reuseport = 1; - lsopt.set = 1; - lsopt.bind = 1; -#else - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "reuseport is not supported " - "on this platform, ignored"); -#endif - continue; - } - - if (ngx_strcmp(value[i].data, "multipath") == 0) { -#ifdef IPPROTO_MPTCP - lsopt.protocol = IPPROTO_MPTCP; - lsopt.set = 1; - lsopt.bind = 1; -#else - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "multipath is not supported " - "on this platform, ignored"); -#endif - continue; - } - - if (ngx_strcmp(value[i].data, "ssl") == 0) { -#if (NGX_STREAM_SSL) - lsopt.ssl = 1; - continue; -#else - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "the \"ssl\" parameter requires " - "ngx_stream_ssl_module"); - return NGX_CONF_ERROR; -#endif - } - - if (ngx_strncmp(value[i].data, "so_keepalive=", 13) == 0) { - - if (ngx_strcmp(&value[i].data[13], "on") == 0) { - lsopt.so_keepalive = 1; - - } else if (ngx_strcmp(&value[i].data[13], "off") == 0) { - lsopt.so_keepalive = 2; - - } else { - -#if (NGX_HAVE_KEEPALIVE_TUNABLE) - u_char *p, *end; - ngx_str_t s; - - end = value[i].data + value[i].len; - s.data = value[i].data + 13; - - p = ngx_strlchr(s.data, end, ':'); - if (p == NULL) { - p = end; - } - - if (p > s.data) { - s.len = p - s.data; - - lsopt.tcp_keepidle = ngx_parse_time(&s, 1); - if (lsopt.tcp_keepidle == (time_t) NGX_ERROR) { - goto invalid_so_keepalive; - } - } - - s.data = (p < end) ? (p + 1) : end; - - p = ngx_strlchr(s.data, end, ':'); - if (p == NULL) { - p = end; - } - - if (p > s.data) { - s.len = p - s.data; - - lsopt.tcp_keepintvl = ngx_parse_time(&s, 1); - if (lsopt.tcp_keepintvl == (time_t) NGX_ERROR) { - goto invalid_so_keepalive; - } - } - - s.data = (p < end) ? (p + 1) : end; - - if (s.data < end) { - s.len = end - s.data; - - lsopt.tcp_keepcnt = ngx_atoi(s.data, s.len); - if (lsopt.tcp_keepcnt == NGX_ERROR) { - goto invalid_so_keepalive; - } - } - - if (lsopt.tcp_keepidle == 0 && lsopt.tcp_keepintvl == 0 - && lsopt.tcp_keepcnt == 0) - { - goto invalid_so_keepalive; - } - - lsopt.so_keepalive = 1; - -#else - - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "the \"so_keepalive\" parameter accepts " - "only \"on\" or \"off\" on this platform"); - return NGX_CONF_ERROR; - -#endif - } - - lsopt.set = 1; - lsopt.bind = 1; - - continue; - -#if (NGX_HAVE_KEEPALIVE_TUNABLE) - invalid_so_keepalive: - - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "invalid so_keepalive value: \"%s\"", - &value[i].data[13]); - return NGX_CONF_ERROR; -#endif - } - - if (ngx_strcmp(value[i].data, "proxy_protocol") == 0) { - lsopt.proxy_protocol = 1; - continue; - } - - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "invalid parameter \"%V\"", &value[i]); - return NGX_CONF_ERROR; - } - - if (lsopt.type == SOCK_DGRAM) { -#if (NGX_HAVE_TCP_FASTOPEN) - if (lsopt.fastopen != -1) { - return "\"fastopen\" parameter is incompatible with \"udp\""; - } -#endif - - if (backlog) { - return "\"backlog\" parameter is incompatible with \"udp\""; - } - -#if (NGX_HAVE_DEFERRED_ACCEPT && defined SO_ACCEPTFILTER) - if (lsopt.accept_filter) { - return "\"accept_filter\" parameter is incompatible with \"udp\""; - } -#endif - -#if (NGX_HAVE_DEFERRED_ACCEPT && defined TCP_DEFER_ACCEPT) - if (lsopt.deferred_accept) { - return "\"deferred\" parameter is incompatible with \"udp\""; - } -#endif - -#ifdef IPPROTO_MPTCP - if (lsopt.protocol == IPPROTO_MPTCP) { - return "\"multipath\" parameter is incompatible with \"udp\""; - } -#endif - -#if (NGX_STREAM_SSL) - if (lsopt.ssl) { - return "\"ssl\" parameter is incompatible with \"udp\""; - } -#endif - - if (lsopt.so_keepalive) { - return "\"so_keepalive\" parameter is incompatible with \"udp\""; - } - - if (lsopt.proxy_protocol) { - return "\"proxy_protocol\" parameter is incompatible with \"udp\""; - } - } - - for (n = 0; n < u.naddrs; n++) { - - for (i = 0; i < n; i++) { - if (ngx_cmp_sockaddr(u.addrs[n].sockaddr, u.addrs[n].socklen, - u.addrs[i].sockaddr, u.addrs[i].socklen, 1) - == NGX_OK) - { - goto next; - } - } - - lsopt.sockaddr = u.addrs[n].sockaddr; - lsopt.socklen = u.addrs[n].socklen; - lsopt.addr_text = u.addrs[n].name; - lsopt.wildcard = ngx_inet_wildcard(lsopt.sockaddr); - - if (ngx_stream_add_listen(cf, cscf, &lsopt) != NGX_OK) { - return NGX_CONF_ERROR; - } - - next: - continue; - } - - return NGX_CONF_OK; -} - - -static char * -ngx_stream_core_server_name(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) -{ - ngx_stream_core_srv_conf_t *cscf = conf; - - u_char ch; - ngx_str_t *value; - ngx_uint_t i; - ngx_stream_server_name_t *sn; - - value = cf->args->elts; - - for (i = 1; i < cf->args->nelts; i++) { - - ch = value[i].data[0]; - - if ((ch == '*' && (value[i].len < 3 || value[i].data[1] != '.')) - || (ch == '.' && value[i].len < 2)) - { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "server name \"%V\" is invalid", &value[i]); - return NGX_CONF_ERROR; - } - - if (ngx_strchr(value[i].data, '/')) { - ngx_conf_log_error(NGX_LOG_WARN, cf, 0, - "server name \"%V\" has suspicious symbols", - &value[i]); - } - - sn = ngx_array_push(&cscf->server_names); - if (sn == NULL) { - return NGX_CONF_ERROR; - } - -#if (NGX_PCRE) - sn->regex = NULL; -#endif - sn->server = cscf; - - if (ngx_strcasecmp(value[i].data, (u_char *) "$hostname") == 0) { - sn->name = cf->cycle->hostname; - - } else { - sn->name = value[i]; - } - - if (value[i].data[0] != '~') { - ngx_strlow(sn->name.data, sn->name.data, sn->name.len); - continue; - } - -#if (NGX_PCRE) - { - u_char *p; - ngx_regex_compile_t rc; - u_char errstr[NGX_MAX_CONF_ERRSTR]; - - if (value[i].len == 1) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "empty regex in server name \"%V\"", &value[i]); - return NGX_CONF_ERROR; - } - - value[i].len--; - value[i].data++; - - ngx_memzero(&rc, sizeof(ngx_regex_compile_t)); - - rc.pattern = value[i]; - rc.err.len = NGX_MAX_CONF_ERRSTR; - rc.err.data = errstr; - - for (p = value[i].data; p < value[i].data + value[i].len; p++) { - if (*p >= 'A' && *p <= 'Z') { - rc.options = NGX_REGEX_CASELESS; - break; - } - } - - sn->regex = ngx_stream_regex_compile(cf, &rc); - if (sn->regex == NULL) { - return NGX_CONF_ERROR; - } - - sn->name = value[i]; - cscf->captures = (rc.captures > 0); - } -#else - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "using regex \"%V\" " - "requires PCRE library", &value[i]); - - return NGX_CONF_ERROR; -#endif - } - - return NGX_CONF_OK; -} - - -static char * -ngx_stream_core_resolver(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) -{ - ngx_stream_core_srv_conf_t *cscf = conf; - - ngx_str_t *value; - - if (cscf->resolver) { - return "is duplicate"; - } - - value = cf->args->elts; - - cscf->resolver = ngx_resolver_create(cf, &value[1], cf->args->nelts - 1); - if (cscf->resolver == NULL) { - return NGX_CONF_ERROR; - } - - return NGX_CONF_OK; -} diff --git a/src/deps/src/nginx-1.30.3/src/stream/ngx_stream_geo_module.c b/src/deps/src/nginx-1.30.3/src/stream/ngx_stream_geo_module.c deleted file mode 100644 index 316de92869..0000000000 --- a/src/deps/src/nginx-1.30.3/src/stream/ngx_stream_geo_module.c +++ /dev/null @@ -1,1624 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#include -#include -#include - - -typedef struct { - ngx_stream_variable_value_t *value; - u_short start; - u_short end; -} ngx_stream_geo_range_t; - - -typedef struct { - ngx_radix_tree_t *tree; -#if (NGX_HAVE_INET6) - ngx_radix_tree_t *tree6; -#endif -} ngx_stream_geo_trees_t; - - -typedef struct { - ngx_stream_geo_range_t **low; - ngx_stream_variable_value_t *default_value; -} ngx_stream_geo_high_ranges_t; - - -typedef struct { - ngx_str_node_t sn; - ngx_stream_variable_value_t *value; - size_t offset; -} ngx_stream_geo_variable_value_node_t; - - -typedef struct { - ngx_stream_variable_value_t *value; - ngx_str_t *net; - ngx_stream_geo_high_ranges_t high; - ngx_radix_tree_t *tree; -#if (NGX_HAVE_INET6) - ngx_radix_tree_t *tree6; -#endif - ngx_rbtree_t rbtree; - ngx_rbtree_node_t sentinel; - ngx_pool_t *pool; - ngx_pool_t *temp_pool; - - size_t data_size; - - ngx_str_t include_name; - ngx_uint_t includes; - ngx_uint_t entries; - - unsigned ranges:1; - unsigned outside_entries:1; - unsigned allow_binary_include:1; - unsigned binary_include:1; - unsigned no_cacheable:1; -} ngx_stream_geo_conf_ctx_t; - - -typedef struct { - union { - ngx_stream_geo_trees_t trees; - ngx_stream_geo_high_ranges_t high; - } u; - - ngx_int_t index; -} ngx_stream_geo_ctx_t; - - -static ngx_int_t ngx_stream_geo_addr(ngx_stream_session_t *s, - ngx_stream_geo_ctx_t *ctx, ngx_addr_t *addr); - -static char *ngx_stream_geo_block(ngx_conf_t *cf, ngx_command_t *cmd, - void *conf); -static char *ngx_stream_geo(ngx_conf_t *cf, ngx_command_t *dummy, void *conf); -static char *ngx_stream_geo_range(ngx_conf_t *cf, - ngx_stream_geo_conf_ctx_t *ctx, ngx_str_t *value); -static char *ngx_stream_geo_add_range(ngx_conf_t *cf, - ngx_stream_geo_conf_ctx_t *ctx, in_addr_t start, in_addr_t end); -static ngx_uint_t ngx_stream_geo_delete_range(ngx_conf_t *cf, - ngx_stream_geo_conf_ctx_t *ctx, in_addr_t start, in_addr_t end); -static char *ngx_stream_geo_cidr(ngx_conf_t *cf, - ngx_stream_geo_conf_ctx_t *ctx, ngx_str_t *value); -static char *ngx_stream_geo_cidr_add(ngx_conf_t *cf, - ngx_stream_geo_conf_ctx_t *ctx, ngx_cidr_t *cidr, ngx_str_t *value, - ngx_str_t *net); -static ngx_stream_variable_value_t *ngx_stream_geo_value(ngx_conf_t *cf, - ngx_stream_geo_conf_ctx_t *ctx, ngx_str_t *value); -static ngx_int_t ngx_stream_geo_cidr_value(ngx_conf_t *cf, ngx_str_t *net, - ngx_cidr_t *cidr); -static char *ngx_stream_geo_include(ngx_conf_t *cf, - ngx_stream_geo_conf_ctx_t *ctx, ngx_str_t *name); -static ngx_int_t ngx_stream_geo_include_binary_base(ngx_conf_t *cf, - ngx_stream_geo_conf_ctx_t *ctx, ngx_str_t *name); -static void ngx_stream_geo_create_binary_base(ngx_stream_geo_conf_ctx_t *ctx); -static u_char *ngx_stream_geo_copy_values(u_char *base, u_char *p, - ngx_rbtree_node_t *node, ngx_rbtree_node_t *sentinel); - - -static ngx_command_t ngx_stream_geo_commands[] = { - - { ngx_string("geo"), - NGX_STREAM_MAIN_CONF|NGX_CONF_BLOCK|NGX_CONF_TAKE12, - ngx_stream_geo_block, - 0, - 0, - NULL }, - - ngx_null_command -}; - - -static ngx_stream_module_t ngx_stream_geo_module_ctx = { - NULL, /* preconfiguration */ - NULL, /* postconfiguration */ - - NULL, /* create main configuration */ - NULL, /* init main configuration */ - - NULL, /* create server configuration */ - NULL /* merge server configuration */ -}; - - -ngx_module_t ngx_stream_geo_module = { - NGX_MODULE_V1, - &ngx_stream_geo_module_ctx, /* module context */ - ngx_stream_geo_commands, /* module directives */ - NGX_STREAM_MODULE, /* module type */ - NULL, /* init master */ - NULL, /* init module */ - NULL, /* init process */ - NULL, /* init thread */ - NULL, /* exit thread */ - NULL, /* exit process */ - NULL, /* exit master */ - NGX_MODULE_V1_PADDING -}; - - -typedef struct { - u_char GEORNG[6]; - u_char version; - u_char ptr_size; - uint32_t endianness; - uint32_t crc32; -} ngx_stream_geo_header_t; - - -static ngx_stream_geo_header_t ngx_stream_geo_header = { - { 'G', 'E', 'O', 'R', 'N', 'G' }, 0, sizeof(void *), 0x12345678, 0 -}; - - -/* geo range is AF_INET only */ - -static ngx_int_t -ngx_stream_geo_cidr_variable(ngx_stream_session_t *s, - ngx_stream_variable_value_t *v, uintptr_t data) -{ - ngx_stream_geo_ctx_t *ctx = (ngx_stream_geo_ctx_t *) data; - - in_addr_t inaddr; - ngx_addr_t addr; - struct sockaddr_in *sin; - ngx_stream_variable_value_t *vv; -#if (NGX_HAVE_INET6) - u_char *p; - struct in6_addr *inaddr6; -#endif - - if (ngx_stream_geo_addr(s, ctx, &addr) != NGX_OK) { - vv = (ngx_stream_variable_value_t *) - ngx_radix32tree_find(ctx->u.trees.tree, INADDR_NONE); - goto done; - } - - switch (addr.sockaddr->sa_family) { - -#if (NGX_HAVE_INET6) - case AF_INET6: - inaddr6 = &((struct sockaddr_in6 *) addr.sockaddr)->sin6_addr; - p = inaddr6->s6_addr; - - if (IN6_IS_ADDR_V4MAPPED(inaddr6)) { - inaddr = (in_addr_t) p[12] << 24; - inaddr += p[13] << 16; - inaddr += p[14] << 8; - inaddr += p[15]; - - vv = (ngx_stream_variable_value_t *) - ngx_radix32tree_find(ctx->u.trees.tree, inaddr); - - } else { - vv = (ngx_stream_variable_value_t *) - ngx_radix128tree_find(ctx->u.trees.tree6, p); - } - - break; -#endif - -#if (NGX_HAVE_UNIX_DOMAIN) - case AF_UNIX: - vv = (ngx_stream_variable_value_t *) - ngx_radix32tree_find(ctx->u.trees.tree, INADDR_NONE); - break; -#endif - - default: /* AF_INET */ - sin = (struct sockaddr_in *) addr.sockaddr; - inaddr = ntohl(sin->sin_addr.s_addr); - - vv = (ngx_stream_variable_value_t *) - ngx_radix32tree_find(ctx->u.trees.tree, inaddr); - - break; - } - -done: - - *v = *vv; - - ngx_log_debug1(NGX_LOG_DEBUG_STREAM, s->connection->log, 0, - "stream geo: %v", v); - - return NGX_OK; -} - - -static ngx_int_t -ngx_stream_geo_range_variable(ngx_stream_session_t *s, - ngx_stream_variable_value_t *v, uintptr_t data) -{ - ngx_stream_geo_ctx_t *ctx = (ngx_stream_geo_ctx_t *) data; - - in_addr_t inaddr; - ngx_addr_t addr; - ngx_uint_t n; - struct sockaddr_in *sin; - ngx_stream_geo_range_t *range; -#if (NGX_HAVE_INET6) - u_char *p; - struct in6_addr *inaddr6; -#endif - - *v = *ctx->u.high.default_value; - - if (ngx_stream_geo_addr(s, ctx, &addr) == NGX_OK) { - - switch (addr.sockaddr->sa_family) { - -#if (NGX_HAVE_INET6) - case AF_INET6: - inaddr6 = &((struct sockaddr_in6 *) addr.sockaddr)->sin6_addr; - - if (IN6_IS_ADDR_V4MAPPED(inaddr6)) { - p = inaddr6->s6_addr; - - inaddr = (in_addr_t) p[12] << 24; - inaddr += p[13] << 16; - inaddr += p[14] << 8; - inaddr += p[15]; - - } else { - inaddr = INADDR_NONE; - } - - break; -#endif - -#if (NGX_HAVE_UNIX_DOMAIN) - case AF_UNIX: - inaddr = INADDR_NONE; - break; -#endif - - default: /* AF_INET */ - sin = (struct sockaddr_in *) addr.sockaddr; - inaddr = ntohl(sin->sin_addr.s_addr); - break; - } - - } else { - inaddr = INADDR_NONE; - } - - if (ctx->u.high.low) { - range = ctx->u.high.low[inaddr >> 16]; - - if (range) { - n = inaddr & 0xffff; - do { - if (n >= (ngx_uint_t) range->start - && n <= (ngx_uint_t) range->end) - { - *v = *range->value; - break; - } - } while ((++range)->value); - } - } - - ngx_log_debug1(NGX_LOG_DEBUG_STREAM, s->connection->log, 0, - "stream geo: %v", v); - - return NGX_OK; -} - - -static ngx_int_t -ngx_stream_geo_addr(ngx_stream_session_t *s, ngx_stream_geo_ctx_t *ctx, - ngx_addr_t *addr) -{ - ngx_stream_variable_value_t *v; - - if (ctx->index == -1) { - ngx_log_debug1(NGX_LOG_DEBUG_STREAM, s->connection->log, 0, - "stream geo started: %V", &s->connection->addr_text); - - addr->sockaddr = s->connection->sockaddr; - addr->socklen = s->connection->socklen; - /* addr->name = s->connection->addr_text; */ - - return NGX_OK; - } - - v = ngx_stream_get_flushed_variable(s, ctx->index); - - if (v == NULL || v->not_found) { - ngx_log_debug0(NGX_LOG_DEBUG_STREAM, s->connection->log, 0, - "stream geo not found"); - - return NGX_ERROR; - } - - ngx_log_debug1(NGX_LOG_DEBUG_STREAM, s->connection->log, 0, - "stream geo started: %v", v); - - if (ngx_parse_addr(s->connection->pool, addr, v->data, v->len) == NGX_OK) { - return NGX_OK; - } - - return NGX_ERROR; -} - - -static char * -ngx_stream_geo_block(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) -{ - char *rv; - size_t len; - ngx_str_t *value, name; - ngx_uint_t i; - ngx_conf_t save; - ngx_pool_t *pool; - ngx_array_t *a; - ngx_stream_variable_t *var; - ngx_stream_geo_ctx_t *geo; - ngx_stream_geo_conf_ctx_t ctx; -#if (NGX_HAVE_INET6) - static struct in6_addr zero; -#endif - - value = cf->args->elts; - - geo = ngx_palloc(cf->pool, sizeof(ngx_stream_geo_ctx_t)); - if (geo == NULL) { - return NGX_CONF_ERROR; - } - - name = value[1]; - - if (name.data[0] != '$') { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "invalid variable name \"%V\"", &name); - return NGX_CONF_ERROR; - } - - name.len--; - name.data++; - - if (cf->args->nelts == 3) { - - geo->index = ngx_stream_get_variable_index(cf, &name); - if (geo->index == NGX_ERROR) { - return NGX_CONF_ERROR; - } - - name = value[2]; - - if (name.data[0] != '$') { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "invalid variable name \"%V\"", &name); - return NGX_CONF_ERROR; - } - - name.len--; - name.data++; - - } else { - geo->index = -1; - } - - var = ngx_stream_add_variable(cf, &name, NGX_STREAM_VAR_CHANGEABLE); - if (var == NULL) { - return NGX_CONF_ERROR; - } - - pool = ngx_create_pool(NGX_DEFAULT_POOL_SIZE, cf->log); - if (pool == NULL) { - return NGX_CONF_ERROR; - } - - ngx_memzero(&ctx, sizeof(ngx_stream_geo_conf_ctx_t)); - - ctx.temp_pool = ngx_create_pool(NGX_DEFAULT_POOL_SIZE, cf->log); - if (ctx.temp_pool == NULL) { - ngx_destroy_pool(pool); - return NGX_CONF_ERROR; - } - - ngx_rbtree_init(&ctx.rbtree, &ctx.sentinel, ngx_str_rbtree_insert_value); - - ctx.pool = cf->pool; - ctx.data_size = sizeof(ngx_stream_geo_header_t) - + sizeof(ngx_stream_variable_value_t) - + 0x10000 * sizeof(ngx_stream_geo_range_t *); - ctx.allow_binary_include = 1; - ctx.no_cacheable = 0; - - save = *cf; - cf->pool = pool; - cf->ctx = &ctx; - cf->handler = ngx_stream_geo; - cf->handler_conf = conf; - - rv = ngx_conf_parse(cf, NULL); - - *cf = save; - - if (rv != NGX_CONF_OK) { - goto failed; - } - - if (ctx.no_cacheable) { - var->flags |= NGX_STREAM_VAR_NOCACHEABLE; - } - - if (ctx.ranges) { - - if (ctx.high.low && !ctx.binary_include) { - for (i = 0; i < 0x10000; i++) { - a = (ngx_array_t *) ctx.high.low[i]; - - if (a == NULL) { - continue; - } - - if (a->nelts == 0) { - ctx.high.low[i] = NULL; - continue; - } - - len = a->nelts * sizeof(ngx_stream_geo_range_t); - - ctx.high.low[i] = ngx_palloc(cf->pool, len + sizeof(void *)); - if (ctx.high.low[i] == NULL) { - goto failed; - } - - ngx_memcpy(ctx.high.low[i], a->elts, len); - ctx.high.low[i][a->nelts].value = NULL; - ctx.data_size += len + sizeof(void *); - } - - if (ctx.allow_binary_include - && !ctx.outside_entries - && ctx.entries > 100000 - && ctx.includes == 1) - { - ngx_stream_geo_create_binary_base(&ctx); - } - } - - if (ctx.high.default_value == NULL) { - ctx.high.default_value = &ngx_stream_variable_null_value; - } - - geo->u.high = ctx.high; - - var->get_handler = ngx_stream_geo_range_variable; - var->data = (uintptr_t) geo; - - } else { - if (ctx.tree == NULL) { - ctx.tree = ngx_radix_tree_create(cf->pool, -1); - if (ctx.tree == NULL) { - goto failed; - } - } - - geo->u.trees.tree = ctx.tree; - -#if (NGX_HAVE_INET6) - if (ctx.tree6 == NULL) { - ctx.tree6 = ngx_radix_tree_create(cf->pool, -1); - if (ctx.tree6 == NULL) { - goto failed; - } - } - - geo->u.trees.tree6 = ctx.tree6; -#endif - - var->get_handler = ngx_stream_geo_cidr_variable; - var->data = (uintptr_t) geo; - - if (ngx_radix32tree_insert(ctx.tree, 0, 0, - (uintptr_t) &ngx_stream_variable_null_value) - == NGX_ERROR) - { - goto failed; - } - - /* NGX_BUSY is okay (default was set explicitly) */ - -#if (NGX_HAVE_INET6) - if (ngx_radix128tree_insert(ctx.tree6, zero.s6_addr, zero.s6_addr, - (uintptr_t) &ngx_stream_variable_null_value) - == NGX_ERROR) - { - goto failed; - } -#endif - } - - ngx_destroy_pool(ctx.temp_pool); - ngx_destroy_pool(pool); - - return NGX_CONF_OK; - -failed: - - ngx_destroy_pool(ctx.temp_pool); - ngx_destroy_pool(pool); - - return NGX_CONF_ERROR; -} - - -static char * -ngx_stream_geo(ngx_conf_t *cf, ngx_command_t *dummy, void *conf) -{ - char *rv; - ngx_str_t *value; - ngx_stream_geo_conf_ctx_t *ctx; - - ctx = cf->ctx; - - value = cf->args->elts; - - if (cf->args->nelts == 1) { - - if (ngx_strcmp(value[0].data, "ranges") == 0) { - - if (ctx->tree -#if (NGX_HAVE_INET6) - || ctx->tree6 -#endif - ) - { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "the \"ranges\" directive must be " - "the first directive inside \"geo\" block"); - goto failed; - } - - ctx->ranges = 1; - - rv = NGX_CONF_OK; - - goto done; - } - - else if (ngx_strcmp(value[0].data, "volatile") == 0) { - ctx->no_cacheable = 1; - rv = NGX_CONF_OK; - goto done; - } - } - - if (cf->args->nelts != 2) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "invalid number of the geo parameters"); - goto failed; - } - - if (ngx_strcmp(value[0].data, "include") == 0) { - - if (strpbrk((char *) value[1].data, "*?[") == NULL) { - rv = ngx_stream_geo_include(cf, ctx, &value[1]); - - } else { - rv = ngx_conf_include(cf, dummy, conf); - } - - goto done; - } - - if (ctx->ranges) { - rv = ngx_stream_geo_range(cf, ctx, value); - - } else { - rv = ngx_stream_geo_cidr(cf, ctx, value); - } - -done: - - ngx_reset_pool(cf->pool); - - return rv; - -failed: - - ngx_reset_pool(cf->pool); - - return NGX_CONF_ERROR; -} - - -static char * -ngx_stream_geo_range(ngx_conf_t *cf, ngx_stream_geo_conf_ctx_t *ctx, - ngx_str_t *value) -{ - u_char *p, *last; - in_addr_t start, end; - ngx_str_t *net; - ngx_uint_t del; - - if (ngx_strcmp(value[0].data, "default") == 0) { - - if (ctx->high.default_value) { - ngx_conf_log_error(NGX_LOG_WARN, cf, 0, - "duplicate default geo range value: \"%V\", old value: \"%v\"", - &value[1], ctx->high.default_value); - } - - ctx->high.default_value = ngx_stream_geo_value(cf, ctx, &value[1]); - if (ctx->high.default_value == NULL) { - return NGX_CONF_ERROR; - } - - return NGX_CONF_OK; - } - - if (ctx->binary_include) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "binary geo range base \"%s\" cannot be mixed with usual entries", - ctx->include_name.data); - return NGX_CONF_ERROR; - } - - if (ctx->high.low == NULL) { - ctx->high.low = ngx_pcalloc(ctx->pool, - 0x10000 * sizeof(ngx_stream_geo_range_t *)); - if (ctx->high.low == NULL) { - return NGX_CONF_ERROR; - } - } - - ctx->entries++; - ctx->outside_entries = 1; - - if (ngx_strcmp(value[0].data, "delete") == 0) { - net = &value[1]; - del = 1; - - } else { - net = &value[0]; - del = 0; - } - - last = net->data + net->len; - - p = ngx_strlchr(net->data, last, '-'); - - if (p == NULL) { - goto invalid; - } - - start = ngx_inet_addr(net->data, p - net->data); - - if (start == INADDR_NONE) { - goto invalid; - } - - start = ntohl(start); - - p++; - - end = ngx_inet_addr(p, last - p); - - if (end == INADDR_NONE) { - goto invalid; - } - - end = ntohl(end); - - if (start > end) { - goto invalid; - } - - if (del) { - if (ngx_stream_geo_delete_range(cf, ctx, start, end)) { - ngx_conf_log_error(NGX_LOG_WARN, cf, 0, - "no address range \"%V\" to delete", net); - } - - return NGX_CONF_OK; - } - - ctx->value = ngx_stream_geo_value(cf, ctx, &value[1]); - - if (ctx->value == NULL) { - return NGX_CONF_ERROR; - } - - ctx->net = net; - - return ngx_stream_geo_add_range(cf, ctx, start, end); - -invalid: - - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, "invalid range \"%V\"", net); - - return NGX_CONF_ERROR; -} - - -/* the add procedure is optimized to add a growing up sequence */ - -static char * -ngx_stream_geo_add_range(ngx_conf_t *cf, ngx_stream_geo_conf_ctx_t *ctx, - in_addr_t start, in_addr_t end) -{ - in_addr_t n; - ngx_uint_t h, i, s, e; - ngx_array_t *a; - ngx_stream_geo_range_t *range; - - for (n = start; n <= end; n = (n + 0x10000) & 0xffff0000) { - - h = n >> 16; - - if (n == start) { - s = n & 0xffff; - } else { - s = 0; - } - - if ((n | 0xffff) > end) { - e = end & 0xffff; - - } else { - e = 0xffff; - } - - a = (ngx_array_t *) ctx->high.low[h]; - - if (a == NULL) { - a = ngx_array_create(ctx->temp_pool, 64, - sizeof(ngx_stream_geo_range_t)); - if (a == NULL) { - return NGX_CONF_ERROR; - } - - ctx->high.low[h] = (ngx_stream_geo_range_t *) a; - } - - i = a->nelts; - range = a->elts; - - while (i) { - - i--; - - if (e < (ngx_uint_t) range[i].start) { - continue; - } - - if (s > (ngx_uint_t) range[i].end) { - - /* add after the range */ - - range = ngx_array_push(a); - if (range == NULL) { - return NGX_CONF_ERROR; - } - - range = a->elts; - - ngx_memmove(&range[i + 2], &range[i + 1], - (a->nelts - 2 - i) * sizeof(ngx_stream_geo_range_t)); - - range[i + 1].start = (u_short) s; - range[i + 1].end = (u_short) e; - range[i + 1].value = ctx->value; - - goto next; - } - - if (s == (ngx_uint_t) range[i].start - && e == (ngx_uint_t) range[i].end) - { - ngx_conf_log_error(NGX_LOG_WARN, cf, 0, - "duplicate range \"%V\", value: \"%v\", old value: \"%v\"", - ctx->net, ctx->value, range[i].value); - - range[i].value = ctx->value; - - goto next; - } - - if (s > (ngx_uint_t) range[i].start - && e < (ngx_uint_t) range[i].end) - { - /* split the range and insert the new one */ - - range = ngx_array_push(a); - if (range == NULL) { - return NGX_CONF_ERROR; - } - - range = ngx_array_push(a); - if (range == NULL) { - return NGX_CONF_ERROR; - } - - range = a->elts; - - ngx_memmove(&range[i + 3], &range[i + 1], - (a->nelts - 3 - i) * sizeof(ngx_stream_geo_range_t)); - - range[i + 2].start = (u_short) (e + 1); - range[i + 2].end = range[i].end; - range[i + 2].value = range[i].value; - - range[i + 1].start = (u_short) s; - range[i + 1].end = (u_short) e; - range[i + 1].value = ctx->value; - - range[i].end = (u_short) (s - 1); - - goto next; - } - - if (s == (ngx_uint_t) range[i].start - && e < (ngx_uint_t) range[i].end) - { - /* shift the range start and insert the new range */ - - range = ngx_array_push(a); - if (range == NULL) { - return NGX_CONF_ERROR; - } - - range = a->elts; - - ngx_memmove(&range[i + 1], &range[i], - (a->nelts - 1 - i) * sizeof(ngx_stream_geo_range_t)); - - range[i + 1].start = (u_short) (e + 1); - - range[i].start = (u_short) s; - range[i].end = (u_short) e; - range[i].value = ctx->value; - - goto next; - } - - if (s > (ngx_uint_t) range[i].start - && e == (ngx_uint_t) range[i].end) - { - /* shift the range end and insert the new range */ - - range = ngx_array_push(a); - if (range == NULL) { - return NGX_CONF_ERROR; - } - - range = a->elts; - - ngx_memmove(&range[i + 2], &range[i + 1], - (a->nelts - 2 - i) * sizeof(ngx_stream_geo_range_t)); - - range[i + 1].start = (u_short) s; - range[i + 1].end = (u_short) e; - range[i + 1].value = ctx->value; - - range[i].end = (u_short) (s - 1); - - goto next; - } - - s = (ngx_uint_t) range[i].start; - e = (ngx_uint_t) range[i].end; - - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "range \"%V\" overlaps \"%d.%d.%d.%d-%d.%d.%d.%d\"", - ctx->net, - h >> 8, h & 0xff, s >> 8, s & 0xff, - h >> 8, h & 0xff, e >> 8, e & 0xff); - - return NGX_CONF_ERROR; - } - - /* add the first range */ - - range = ngx_array_push(a); - if (range == NULL) { - return NGX_CONF_ERROR; - } - - range = a->elts; - - ngx_memmove(&range[1], &range[0], - (a->nelts - 1) * sizeof(ngx_stream_geo_range_t)); - - range[0].start = (u_short) s; - range[0].end = (u_short) e; - range[0].value = ctx->value; - - next: - - if (h == 0xffff) { - break; - } - } - - return NGX_CONF_OK; -} - - -static ngx_uint_t -ngx_stream_geo_delete_range(ngx_conf_t *cf, ngx_stream_geo_conf_ctx_t *ctx, - in_addr_t start, in_addr_t end) -{ - in_addr_t n; - ngx_uint_t h, i, s, e, warn; - ngx_array_t *a; - ngx_stream_geo_range_t *range; - - warn = 0; - - for (n = start; n <= end; n = (n + 0x10000) & 0xffff0000) { - - h = n >> 16; - - if (n == start) { - s = n & 0xffff; - } else { - s = 0; - } - - if ((n | 0xffff) > end) { - e = end & 0xffff; - - } else { - e = 0xffff; - } - - a = (ngx_array_t *) ctx->high.low[h]; - - if (a == NULL || a->nelts == 0) { - warn = 1; - goto next; - } - - range = a->elts; - for (i = 0; i < a->nelts; i++) { - - if (s == (ngx_uint_t) range[i].start - && e == (ngx_uint_t) range[i].end) - { - ngx_memmove(&range[i], &range[i + 1], - (a->nelts - 1 - i) * sizeof(ngx_stream_geo_range_t)); - - a->nelts--; - - break; - } - - if (i == a->nelts - 1) { - warn = 1; - } - } - - next: - - if (h == 0xffff) { - break; - } - } - - return warn; -} - - -static char * -ngx_stream_geo_cidr(ngx_conf_t *cf, ngx_stream_geo_conf_ctx_t *ctx, - ngx_str_t *value) -{ - char *rv; - ngx_int_t rc, del; - ngx_str_t *net; - ngx_cidr_t cidr; - - if (ctx->tree == NULL) { - ctx->tree = ngx_radix_tree_create(ctx->pool, -1); - if (ctx->tree == NULL) { - return NGX_CONF_ERROR; - } - } - -#if (NGX_HAVE_INET6) - if (ctx->tree6 == NULL) { - ctx->tree6 = ngx_radix_tree_create(ctx->pool, -1); - if (ctx->tree6 == NULL) { - return NGX_CONF_ERROR; - } - } -#endif - - if (ngx_strcmp(value[0].data, "default") == 0) { - cidr.family = AF_INET; - cidr.u.in.addr = 0; - cidr.u.in.mask = 0; - - rv = ngx_stream_geo_cidr_add(cf, ctx, &cidr, &value[1], &value[0]); - - if (rv != NGX_CONF_OK) { - return rv; - } - -#if (NGX_HAVE_INET6) - cidr.family = AF_INET6; - ngx_memzero(&cidr.u.in6, sizeof(ngx_in6_cidr_t)); - - rv = ngx_stream_geo_cidr_add(cf, ctx, &cidr, &value[1], &value[0]); - - if (rv != NGX_CONF_OK) { - return rv; - } -#endif - - return NGX_CONF_OK; - } - - if (ngx_strcmp(value[0].data, "delete") == 0) { - net = &value[1]; - del = 1; - - } else { - net = &value[0]; - del = 0; - } - - if (ngx_stream_geo_cidr_value(cf, net, &cidr) != NGX_OK) { - return NGX_CONF_ERROR; - } - - if (cidr.family == AF_INET) { - cidr.u.in.addr = ntohl(cidr.u.in.addr); - cidr.u.in.mask = ntohl(cidr.u.in.mask); - } - - if (del) { - switch (cidr.family) { - -#if (NGX_HAVE_INET6) - case AF_INET6: - rc = ngx_radix128tree_delete(ctx->tree6, - cidr.u.in6.addr.s6_addr, - cidr.u.in6.mask.s6_addr); - break; -#endif - - default: /* AF_INET */ - rc = ngx_radix32tree_delete(ctx->tree, cidr.u.in.addr, - cidr.u.in.mask); - break; - } - - if (rc != NGX_OK) { - ngx_conf_log_error(NGX_LOG_WARN, cf, 0, - "no network \"%V\" to delete", net); - } - - return NGX_CONF_OK; - } - - return ngx_stream_geo_cidr_add(cf, ctx, &cidr, &value[1], net); -} - - -static char * -ngx_stream_geo_cidr_add(ngx_conf_t *cf, ngx_stream_geo_conf_ctx_t *ctx, - ngx_cidr_t *cidr, ngx_str_t *value, ngx_str_t *net) -{ - ngx_int_t rc; - ngx_stream_variable_value_t *val, *old; - - val = ngx_stream_geo_value(cf, ctx, value); - - if (val == NULL) { - return NGX_CONF_ERROR; - } - - switch (cidr->family) { - -#if (NGX_HAVE_INET6) - case AF_INET6: - rc = ngx_radix128tree_insert(ctx->tree6, cidr->u.in6.addr.s6_addr, - cidr->u.in6.mask.s6_addr, - (uintptr_t) val); - - if (rc == NGX_OK) { - return NGX_CONF_OK; - } - - if (rc == NGX_ERROR) { - return NGX_CONF_ERROR; - } - - /* rc == NGX_BUSY */ - - old = (ngx_stream_variable_value_t *) - ngx_radix128tree_find(ctx->tree6, - cidr->u.in6.addr.s6_addr); - - ngx_conf_log_error(NGX_LOG_WARN, cf, 0, - "duplicate network \"%V\", value: \"%v\", old value: \"%v\"", - net, val, old); - - rc = ngx_radix128tree_delete(ctx->tree6, - cidr->u.in6.addr.s6_addr, - cidr->u.in6.mask.s6_addr); - - if (rc == NGX_ERROR) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, "invalid radix tree"); - return NGX_CONF_ERROR; - } - - rc = ngx_radix128tree_insert(ctx->tree6, cidr->u.in6.addr.s6_addr, - cidr->u.in6.mask.s6_addr, - (uintptr_t) val); - - break; -#endif - - default: /* AF_INET */ - rc = ngx_radix32tree_insert(ctx->tree, cidr->u.in.addr, - cidr->u.in.mask, (uintptr_t) val); - - if (rc == NGX_OK) { - return NGX_CONF_OK; - } - - if (rc == NGX_ERROR) { - return NGX_CONF_ERROR; - } - - /* rc == NGX_BUSY */ - - old = (ngx_stream_variable_value_t *) - ngx_radix32tree_find(ctx->tree, cidr->u.in.addr); - - ngx_conf_log_error(NGX_LOG_WARN, cf, 0, - "duplicate network \"%V\", value: \"%v\", old value: \"%v\"", - net, val, old); - - rc = ngx_radix32tree_delete(ctx->tree, - cidr->u.in.addr, cidr->u.in.mask); - - if (rc == NGX_ERROR) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, "invalid radix tree"); - return NGX_CONF_ERROR; - } - - rc = ngx_radix32tree_insert(ctx->tree, cidr->u.in.addr, - cidr->u.in.mask, (uintptr_t) val); - - break; - } - - if (rc == NGX_OK) { - return NGX_CONF_OK; - } - - return NGX_CONF_ERROR; -} - - -static ngx_stream_variable_value_t * -ngx_stream_geo_value(ngx_conf_t *cf, ngx_stream_geo_conf_ctx_t *ctx, - ngx_str_t *value) -{ - uint32_t hash; - ngx_stream_variable_value_t *val; - ngx_stream_geo_variable_value_node_t *gvvn; - - hash = ngx_crc32_long(value->data, value->len); - - gvvn = (ngx_stream_geo_variable_value_node_t *) - ngx_str_rbtree_lookup(&ctx->rbtree, value, hash); - - if (gvvn) { - return gvvn->value; - } - - val = ngx_pcalloc(ctx->pool, sizeof(ngx_stream_variable_value_t)); - if (val == NULL) { - return NULL; - } - - val->len = value->len; - val->data = ngx_pstrdup(ctx->pool, value); - if (val->data == NULL) { - return NULL; - } - - val->valid = 1; - - gvvn = ngx_palloc(ctx->temp_pool, - sizeof(ngx_stream_geo_variable_value_node_t)); - if (gvvn == NULL) { - return NULL; - } - - gvvn->sn.node.key = hash; - gvvn->sn.str.len = val->len; - gvvn->sn.str.data = val->data; - gvvn->value = val; - gvvn->offset = 0; - - ngx_rbtree_insert(&ctx->rbtree, &gvvn->sn.node); - - ctx->data_size += ngx_align(sizeof(ngx_stream_variable_value_t) - + value->len, sizeof(void *)); - - return val; -} - - -static ngx_int_t -ngx_stream_geo_cidr_value(ngx_conf_t *cf, ngx_str_t *net, ngx_cidr_t *cidr) -{ - ngx_int_t rc; - - if (ngx_strcmp(net->data, "255.255.255.255") == 0) { - cidr->family = AF_INET; - cidr->u.in.addr = 0xffffffff; - cidr->u.in.mask = 0xffffffff; - - return NGX_OK; - } - - rc = ngx_ptocidr(net, cidr); - - if (rc == NGX_ERROR) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, "invalid network \"%V\"", net); - return NGX_ERROR; - } - - if (rc == NGX_DONE) { - ngx_conf_log_error(NGX_LOG_WARN, cf, 0, - "low address bits of %V are meaningless", net); - } - - return NGX_OK; -} - - -static char * -ngx_stream_geo_include(ngx_conf_t *cf, ngx_stream_geo_conf_ctx_t *ctx, - ngx_str_t *name) -{ - char *rv; - ngx_str_t file; - - file.len = name->len + 4; - file.data = ngx_pnalloc(ctx->temp_pool, name->len + 5); - if (file.data == NULL) { - return NGX_CONF_ERROR; - } - - ngx_sprintf(file.data, "%V.bin%Z", name); - - if (ngx_conf_full_name(cf->cycle, &file, 1) != NGX_OK) { - return NGX_CONF_ERROR; - } - - if (ctx->ranges) { - ngx_log_debug1(NGX_LOG_DEBUG_CORE, cf->log, 0, "include %s", file.data); - - switch (ngx_stream_geo_include_binary_base(cf, ctx, &file)) { - case NGX_OK: - return NGX_CONF_OK; - case NGX_ERROR: - return NGX_CONF_ERROR; - default: - break; - } - } - - file.len -= 4; - file.data[file.len] = '\0'; - - ctx->include_name = file; - - if (ctx->outside_entries) { - ctx->allow_binary_include = 0; - } - - ngx_log_debug1(NGX_LOG_DEBUG_CORE, cf->log, 0, "include %s", file.data); - - rv = ngx_conf_parse(cf, &file); - - ctx->includes++; - ctx->outside_entries = 0; - - return rv; -} - - -static ngx_int_t -ngx_stream_geo_include_binary_base(ngx_conf_t *cf, - ngx_stream_geo_conf_ctx_t *ctx, ngx_str_t *name) -{ - u_char *base, ch; - time_t mtime; - size_t size, len; - ssize_t n; - uint32_t crc32; - ngx_err_t err; - ngx_int_t rc; - ngx_uint_t i; - ngx_file_t file; - ngx_file_info_t fi; - ngx_stream_geo_range_t *range, **ranges; - ngx_stream_geo_header_t *header; - ngx_stream_variable_value_t *vv; - - ngx_memzero(&file, sizeof(ngx_file_t)); - file.name = *name; - file.log = cf->log; - - file.fd = ngx_open_file(name->data, NGX_FILE_RDONLY, NGX_FILE_OPEN, 0); - - if (file.fd == NGX_INVALID_FILE) { - err = ngx_errno; - if (err != NGX_ENOENT) { - ngx_conf_log_error(NGX_LOG_CRIT, cf, err, - ngx_open_file_n " \"%s\" failed", name->data); - } - return NGX_DECLINED; - } - - if (ctx->outside_entries) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "binary geo range base \"%s\" cannot be mixed with usual entries", - name->data); - rc = NGX_ERROR; - goto done; - } - - if (ctx->binary_include) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "second binary geo range base \"%s\" cannot be mixed with \"%s\"", - name->data, ctx->include_name.data); - rc = NGX_ERROR; - goto done; - } - - if (ngx_fd_info(file.fd, &fi) == NGX_FILE_ERROR) { - ngx_conf_log_error(NGX_LOG_CRIT, cf, ngx_errno, - ngx_fd_info_n " \"%s\" failed", name->data); - goto failed; - } - - size = (size_t) ngx_file_size(&fi); - mtime = ngx_file_mtime(&fi); - - ch = name->data[name->len - 4]; - name->data[name->len - 4] = '\0'; - - if (ngx_file_info(name->data, &fi) == NGX_FILE_ERROR) { - ngx_conf_log_error(NGX_LOG_CRIT, cf, ngx_errno, - ngx_file_info_n " \"%s\" failed", name->data); - goto failed; - } - - name->data[name->len - 4] = ch; - - if (mtime < ngx_file_mtime(&fi)) { - ngx_conf_log_error(NGX_LOG_WARN, cf, 0, - "stale binary geo range base \"%s\"", name->data); - goto failed; - } - - base = ngx_palloc(ctx->pool, size); - if (base == NULL) { - goto failed; - } - - n = ngx_read_file(&file, base, size, 0); - - if (n == NGX_ERROR) { - ngx_conf_log_error(NGX_LOG_CRIT, cf, ngx_errno, - ngx_read_file_n " \"%s\" failed", name->data); - goto failed; - } - - if ((size_t) n != size) { - ngx_conf_log_error(NGX_LOG_CRIT, cf, 0, - ngx_read_file_n " \"%s\" returned only %z bytes instead of %z", - name->data, n, size); - goto failed; - } - - header = (ngx_stream_geo_header_t *) base; - - if (size < 16 || ngx_memcmp(&ngx_stream_geo_header, header, 12) != 0) { - ngx_conf_log_error(NGX_LOG_WARN, cf, 0, - "incompatible binary geo range base \"%s\"", name->data); - goto failed; - } - - ngx_crc32_init(crc32); - - vv = (ngx_stream_variable_value_t *) - (base + sizeof(ngx_stream_geo_header_t)); - - while (vv->data) { - len = ngx_align(sizeof(ngx_stream_variable_value_t) + vv->len, - sizeof(void *)); - ngx_crc32_update(&crc32, (u_char *) vv, len); - vv->data += (size_t) base; - vv = (ngx_stream_variable_value_t *) ((u_char *) vv + len); - } - ngx_crc32_update(&crc32, (u_char *) vv, - sizeof(ngx_stream_variable_value_t)); - vv++; - - ranges = (ngx_stream_geo_range_t **) vv; - - for (i = 0; i < 0x10000; i++) { - ngx_crc32_update(&crc32, (u_char *) &ranges[i], sizeof(void *)); - if (ranges[i]) { - ranges[i] = (ngx_stream_geo_range_t *) - ((u_char *) ranges[i] + (size_t) base); - } - } - - range = (ngx_stream_geo_range_t *) &ranges[0x10000]; - - while ((u_char *) range < base + size) { - while (range->value) { - ngx_crc32_update(&crc32, (u_char *) range, - sizeof(ngx_stream_geo_range_t)); - range->value = (ngx_stream_variable_value_t *) - ((u_char *) range->value + (size_t) base); - range++; - } - ngx_crc32_update(&crc32, (u_char *) range, sizeof(void *)); - range = (ngx_stream_geo_range_t *) ((u_char *) range + sizeof(void *)); - } - - ngx_crc32_final(crc32); - - if (crc32 != header->crc32) { - ngx_conf_log_error(NGX_LOG_WARN, cf, 0, - "CRC32 mismatch in binary geo range base \"%s\"", name->data); - goto failed; - } - - ngx_conf_log_error(NGX_LOG_NOTICE, cf, 0, - "using binary geo range base \"%s\"", name->data); - - ctx->include_name = *name; - ctx->binary_include = 1; - ctx->high.low = ranges; - rc = NGX_OK; - - goto done; - -failed: - - rc = NGX_DECLINED; - -done: - - if (ngx_close_file(file.fd) == NGX_FILE_ERROR) { - ngx_log_error(NGX_LOG_ALERT, cf->log, ngx_errno, - ngx_close_file_n " \"%s\" failed", name->data); - } - - return rc; -} - - -static void -ngx_stream_geo_create_binary_base(ngx_stream_geo_conf_ctx_t *ctx) -{ - u_char *p; - uint32_t hash; - ngx_str_t s; - ngx_uint_t i; - ngx_file_mapping_t fm; - ngx_stream_geo_range_t *r, *range, **ranges; - ngx_stream_geo_header_t *header; - ngx_stream_geo_variable_value_node_t *gvvn; - - fm.name = ngx_pnalloc(ctx->temp_pool, ctx->include_name.len + 5); - if (fm.name == NULL) { - return; - } - - ngx_sprintf(fm.name, "%V.bin%Z", &ctx->include_name); - - fm.size = ctx->data_size; - fm.log = ctx->pool->log; - - ngx_log_error(NGX_LOG_NOTICE, fm.log, 0, - "creating binary geo range base \"%s\"", fm.name); - - if (ngx_create_file_mapping(&fm) != NGX_OK) { - return; - } - - p = ngx_cpymem(fm.addr, &ngx_stream_geo_header, - sizeof(ngx_stream_geo_header_t)); - - p = ngx_stream_geo_copy_values(fm.addr, p, ctx->rbtree.root, - ctx->rbtree.sentinel); - - p += sizeof(ngx_stream_variable_value_t); - - ranges = (ngx_stream_geo_range_t **) p; - - p += 0x10000 * sizeof(ngx_stream_geo_range_t *); - - for (i = 0; i < 0x10000; i++) { - r = ctx->high.low[i]; - if (r == NULL) { - continue; - } - - range = (ngx_stream_geo_range_t *) p; - ranges[i] = (ngx_stream_geo_range_t *) (p - (u_char *) fm.addr); - - do { - s.len = r->value->len; - s.data = r->value->data; - hash = ngx_crc32_long(s.data, s.len); - gvvn = (ngx_stream_geo_variable_value_node_t *) - ngx_str_rbtree_lookup(&ctx->rbtree, &s, hash); - - range->value = (ngx_stream_variable_value_t *) gvvn->offset; - range->start = r->start; - range->end = r->end; - range++; - - } while ((++r)->value); - - range->value = NULL; - - p = (u_char *) range + sizeof(void *); - } - - header = fm.addr; - header->crc32 = ngx_crc32_long((u_char *) fm.addr - + sizeof(ngx_stream_geo_header_t), - fm.size - sizeof(ngx_stream_geo_header_t)); - - ngx_close_file_mapping(&fm); -} - - -static u_char * -ngx_stream_geo_copy_values(u_char *base, u_char *p, ngx_rbtree_node_t *node, - ngx_rbtree_node_t *sentinel) -{ - ngx_stream_variable_value_t *vv; - ngx_stream_geo_variable_value_node_t *gvvn; - - if (node == sentinel) { - return p; - } - - gvvn = (ngx_stream_geo_variable_value_node_t *) node; - gvvn->offset = p - base; - - vv = (ngx_stream_variable_value_t *) p; - *vv = *gvvn->value; - p += sizeof(ngx_stream_variable_value_t); - vv->data = (u_char *) (p - base); - - p = ngx_cpymem(p, gvvn->sn.str.data, gvvn->sn.str.len); - - p = ngx_align_ptr(p, sizeof(void *)); - - p = ngx_stream_geo_copy_values(base, p, node->left, sentinel); - - return ngx_stream_geo_copy_values(base, p, node->right, sentinel); -} diff --git a/src/deps/src/nginx-1.30.3/src/stream/ngx_stream_geoip_module.c b/src/deps/src/nginx-1.30.3/src/stream/ngx_stream_geoip_module.c deleted file mode 100644 index 3ee8f0e33e..0000000000 --- a/src/deps/src/nginx-1.30.3/src/stream/ngx_stream_geoip_module.c +++ /dev/null @@ -1,814 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#include -#include -#include - -#include -#include - - -#define NGX_GEOIP_COUNTRY_CODE 0 -#define NGX_GEOIP_COUNTRY_CODE3 1 -#define NGX_GEOIP_COUNTRY_NAME 2 - - -typedef struct { - GeoIP *country; - GeoIP *org; - GeoIP *city; -#if (NGX_HAVE_GEOIP_V6) - unsigned country_v6:1; - unsigned org_v6:1; - unsigned city_v6:1; -#endif -} ngx_stream_geoip_conf_t; - - -typedef struct { - ngx_str_t *name; - uintptr_t data; -} ngx_stream_geoip_var_t; - - -typedef const char *(*ngx_stream_geoip_variable_handler_pt)(GeoIP *, - u_long addr); - - -ngx_stream_geoip_variable_handler_pt ngx_stream_geoip_country_functions[] = { - GeoIP_country_code_by_ipnum, - GeoIP_country_code3_by_ipnum, - GeoIP_country_name_by_ipnum, -}; - - -#if (NGX_HAVE_GEOIP_V6) - -typedef const char *(*ngx_stream_geoip_variable_handler_v6_pt)(GeoIP *, - geoipv6_t addr); - - -ngx_stream_geoip_variable_handler_v6_pt - ngx_stream_geoip_country_v6_functions[] = -{ - GeoIP_country_code_by_ipnum_v6, - GeoIP_country_code3_by_ipnum_v6, - GeoIP_country_name_by_ipnum_v6, -}; - -#endif - - -static ngx_int_t ngx_stream_geoip_country_variable(ngx_stream_session_t *s, - ngx_stream_variable_value_t *v, uintptr_t data); -static ngx_int_t ngx_stream_geoip_org_variable(ngx_stream_session_t *s, - ngx_stream_variable_value_t *v, uintptr_t data); -static ngx_int_t ngx_stream_geoip_city_variable(ngx_stream_session_t *s, - ngx_stream_variable_value_t *v, uintptr_t data); -static ngx_int_t ngx_stream_geoip_region_name_variable(ngx_stream_session_t *s, - ngx_stream_variable_value_t *v, uintptr_t data); -static ngx_int_t ngx_stream_geoip_city_float_variable(ngx_stream_session_t *s, - ngx_stream_variable_value_t *v, uintptr_t data); -static ngx_int_t ngx_stream_geoip_city_int_variable(ngx_stream_session_t *s, - ngx_stream_variable_value_t *v, uintptr_t data); -static GeoIPRecord *ngx_stream_geoip_get_city_record(ngx_stream_session_t *s); - -static ngx_int_t ngx_stream_geoip_add_variables(ngx_conf_t *cf); -static void *ngx_stream_geoip_create_conf(ngx_conf_t *cf); -static char *ngx_stream_geoip_country(ngx_conf_t *cf, ngx_command_t *cmd, - void *conf); -static char *ngx_stream_geoip_org(ngx_conf_t *cf, ngx_command_t *cmd, - void *conf); -static char *ngx_stream_geoip_city(ngx_conf_t *cf, ngx_command_t *cmd, - void *conf); -static void ngx_stream_geoip_cleanup(void *data); - - -static ngx_command_t ngx_stream_geoip_commands[] = { - - { ngx_string("geoip_country"), - NGX_STREAM_MAIN_CONF|NGX_CONF_TAKE12, - ngx_stream_geoip_country, - NGX_STREAM_MAIN_CONF_OFFSET, - 0, - NULL }, - - { ngx_string("geoip_org"), - NGX_STREAM_MAIN_CONF|NGX_CONF_TAKE12, - ngx_stream_geoip_org, - NGX_STREAM_MAIN_CONF_OFFSET, - 0, - NULL }, - - { ngx_string("geoip_city"), - NGX_STREAM_MAIN_CONF|NGX_CONF_TAKE12, - ngx_stream_geoip_city, - NGX_STREAM_MAIN_CONF_OFFSET, - 0, - NULL }, - - ngx_null_command -}; - - -static ngx_stream_module_t ngx_stream_geoip_module_ctx = { - ngx_stream_geoip_add_variables, /* preconfiguration */ - NULL, /* postconfiguration */ - - ngx_stream_geoip_create_conf, /* create main configuration */ - NULL, /* init main configuration */ - - NULL, /* create server configuration */ - NULL /* merge server configuration */ -}; - - -ngx_module_t ngx_stream_geoip_module = { - NGX_MODULE_V1, - &ngx_stream_geoip_module_ctx, /* module context */ - ngx_stream_geoip_commands, /* module directives */ - NGX_STREAM_MODULE, /* module type */ - NULL, /* init master */ - NULL, /* init module */ - NULL, /* init process */ - NULL, /* init thread */ - NULL, /* exit thread */ - NULL, /* exit process */ - NULL, /* exit master */ - NGX_MODULE_V1_PADDING -}; - - -static ngx_stream_variable_t ngx_stream_geoip_vars[] = { - - { ngx_string("geoip_country_code"), NULL, - ngx_stream_geoip_country_variable, - NGX_GEOIP_COUNTRY_CODE, 0, 0 }, - - { ngx_string("geoip_country_code3"), NULL, - ngx_stream_geoip_country_variable, - NGX_GEOIP_COUNTRY_CODE3, 0, 0 }, - - { ngx_string("geoip_country_name"), NULL, - ngx_stream_geoip_country_variable, - NGX_GEOIP_COUNTRY_NAME, 0, 0 }, - - { ngx_string("geoip_org"), NULL, - ngx_stream_geoip_org_variable, - 0, 0, 0 }, - - { ngx_string("geoip_city_continent_code"), NULL, - ngx_stream_geoip_city_variable, - offsetof(GeoIPRecord, continent_code), 0, 0 }, - - { ngx_string("geoip_city_country_code"), NULL, - ngx_stream_geoip_city_variable, - offsetof(GeoIPRecord, country_code), 0, 0 }, - - { ngx_string("geoip_city_country_code3"), NULL, - ngx_stream_geoip_city_variable, - offsetof(GeoIPRecord, country_code3), 0, 0 }, - - { ngx_string("geoip_city_country_name"), NULL, - ngx_stream_geoip_city_variable, - offsetof(GeoIPRecord, country_name), 0, 0 }, - - { ngx_string("geoip_region"), NULL, - ngx_stream_geoip_city_variable, - offsetof(GeoIPRecord, region), 0, 0 }, - - { ngx_string("geoip_region_name"), NULL, - ngx_stream_geoip_region_name_variable, - 0, 0, 0 }, - - { ngx_string("geoip_city"), NULL, - ngx_stream_geoip_city_variable, - offsetof(GeoIPRecord, city), 0, 0 }, - - { ngx_string("geoip_postal_code"), NULL, - ngx_stream_geoip_city_variable, - offsetof(GeoIPRecord, postal_code), 0, 0 }, - - { ngx_string("geoip_latitude"), NULL, - ngx_stream_geoip_city_float_variable, - offsetof(GeoIPRecord, latitude), 0, 0 }, - - { ngx_string("geoip_longitude"), NULL, - ngx_stream_geoip_city_float_variable, - offsetof(GeoIPRecord, longitude), 0, 0 }, - - { ngx_string("geoip_dma_code"), NULL, - ngx_stream_geoip_city_int_variable, - offsetof(GeoIPRecord, dma_code), 0, 0 }, - - { ngx_string("geoip_area_code"), NULL, - ngx_stream_geoip_city_int_variable, - offsetof(GeoIPRecord, area_code), 0, 0 }, - - ngx_stream_null_variable -}; - - -static u_long -ngx_stream_geoip_addr(ngx_stream_session_t *s, ngx_stream_geoip_conf_t *gcf) -{ - ngx_addr_t addr; - struct sockaddr_in *sin; - - addr.sockaddr = s->connection->sockaddr; - addr.socklen = s->connection->socklen; - /* addr.name = s->connection->addr_text; */ - -#if (NGX_HAVE_INET6) - - if (addr.sockaddr->sa_family == AF_INET6) { - u_char *p; - in_addr_t inaddr; - struct in6_addr *inaddr6; - - inaddr6 = &((struct sockaddr_in6 *) addr.sockaddr)->sin6_addr; - - if (IN6_IS_ADDR_V4MAPPED(inaddr6)) { - p = inaddr6->s6_addr; - - inaddr = (in_addr_t) p[12] << 24; - inaddr += p[13] << 16; - inaddr += p[14] << 8; - inaddr += p[15]; - - return inaddr; - } - } - -#endif - - if (addr.sockaddr->sa_family != AF_INET) { - return INADDR_NONE; - } - - sin = (struct sockaddr_in *) addr.sockaddr; - return ntohl(sin->sin_addr.s_addr); -} - - -#if (NGX_HAVE_GEOIP_V6) - -static geoipv6_t -ngx_stream_geoip_addr_v6(ngx_stream_session_t *s, ngx_stream_geoip_conf_t *gcf) -{ - ngx_addr_t addr; - in_addr_t addr4; - struct in6_addr addr6; - struct sockaddr_in *sin; - struct sockaddr_in6 *sin6; - - addr.sockaddr = s->connection->sockaddr; - addr.socklen = s->connection->socklen; - /* addr.name = s->connection->addr_text; */ - - switch (addr.sockaddr->sa_family) { - - case AF_INET: - /* Produce IPv4-mapped IPv6 address. */ - sin = (struct sockaddr_in *) addr.sockaddr; - addr4 = ntohl(sin->sin_addr.s_addr); - - ngx_memzero(&addr6, sizeof(struct in6_addr)); - addr6.s6_addr[10] = 0xff; - addr6.s6_addr[11] = 0xff; - addr6.s6_addr[12] = addr4 >> 24; - addr6.s6_addr[13] = addr4 >> 16; - addr6.s6_addr[14] = addr4 >> 8; - addr6.s6_addr[15] = addr4; - return addr6; - - case AF_INET6: - sin6 = (struct sockaddr_in6 *) addr.sockaddr; - return sin6->sin6_addr; - - default: - return in6addr_any; - } -} - -#endif - - -static ngx_int_t -ngx_stream_geoip_country_variable(ngx_stream_session_t *s, - ngx_stream_variable_value_t *v, uintptr_t data) -{ - ngx_stream_geoip_variable_handler_pt handler = - ngx_stream_geoip_country_functions[data]; -#if (NGX_HAVE_GEOIP_V6) - ngx_stream_geoip_variable_handler_v6_pt handler_v6 = - ngx_stream_geoip_country_v6_functions[data]; -#endif - - const char *val; - ngx_stream_geoip_conf_t *gcf; - - gcf = ngx_stream_get_module_main_conf(s, ngx_stream_geoip_module); - - if (gcf->country == NULL) { - goto not_found; - } - -#if (NGX_HAVE_GEOIP_V6) - val = gcf->country_v6 - ? handler_v6(gcf->country, ngx_stream_geoip_addr_v6(s, gcf)) - : handler(gcf->country, ngx_stream_geoip_addr(s, gcf)); -#else - val = handler(gcf->country, ngx_stream_geoip_addr(s, gcf)); -#endif - - if (val == NULL) { - goto not_found; - } - - v->len = ngx_strlen(val); - v->valid = 1; - v->no_cacheable = 0; - v->not_found = 0; - v->data = (u_char *) val; - - return NGX_OK; - -not_found: - - v->not_found = 1; - - return NGX_OK; -} - - -static ngx_int_t -ngx_stream_geoip_org_variable(ngx_stream_session_t *s, - ngx_stream_variable_value_t *v, uintptr_t data) -{ - size_t len; - char *val; - ngx_stream_geoip_conf_t *gcf; - - gcf = ngx_stream_get_module_main_conf(s, ngx_stream_geoip_module); - - if (gcf->org == NULL) { - goto not_found; - } - -#if (NGX_HAVE_GEOIP_V6) - val = gcf->org_v6 - ? GeoIP_name_by_ipnum_v6(gcf->org, - ngx_stream_geoip_addr_v6(s, gcf)) - : GeoIP_name_by_ipnum(gcf->org, - ngx_stream_geoip_addr(s, gcf)); -#else - val = GeoIP_name_by_ipnum(gcf->org, ngx_stream_geoip_addr(s, gcf)); -#endif - - if (val == NULL) { - goto not_found; - } - - len = ngx_strlen(val); - v->data = ngx_pnalloc(s->connection->pool, len); - if (v->data == NULL) { - ngx_free(val); - return NGX_ERROR; - } - - ngx_memcpy(v->data, val, len); - - v->len = len; - v->valid = 1; - v->no_cacheable = 0; - v->not_found = 0; - - ngx_free(val); - - return NGX_OK; - -not_found: - - v->not_found = 1; - - return NGX_OK; -} - - -static ngx_int_t -ngx_stream_geoip_city_variable(ngx_stream_session_t *s, - ngx_stream_variable_value_t *v, uintptr_t data) -{ - char *val; - size_t len; - GeoIPRecord *gr; - - gr = ngx_stream_geoip_get_city_record(s); - if (gr == NULL) { - goto not_found; - } - - val = *(char **) ((char *) gr + data); - if (val == NULL) { - goto no_value; - } - - len = ngx_strlen(val); - v->data = ngx_pnalloc(s->connection->pool, len); - if (v->data == NULL) { - GeoIPRecord_delete(gr); - return NGX_ERROR; - } - - ngx_memcpy(v->data, val, len); - - v->len = len; - v->valid = 1; - v->no_cacheable = 0; - v->not_found = 0; - - GeoIPRecord_delete(gr); - - return NGX_OK; - -no_value: - - GeoIPRecord_delete(gr); - -not_found: - - v->not_found = 1; - - return NGX_OK; -} - - -static ngx_int_t -ngx_stream_geoip_region_name_variable(ngx_stream_session_t *s, - ngx_stream_variable_value_t *v, uintptr_t data) -{ - size_t len; - const char *val; - GeoIPRecord *gr; - - gr = ngx_stream_geoip_get_city_record(s); - if (gr == NULL) { - goto not_found; - } - - val = GeoIP_region_name_by_code(gr->country_code, gr->region); - - GeoIPRecord_delete(gr); - - if (val == NULL) { - goto not_found; - } - - len = ngx_strlen(val); - v->data = ngx_pnalloc(s->connection->pool, len); - if (v->data == NULL) { - return NGX_ERROR; - } - - ngx_memcpy(v->data, val, len); - - v->len = len; - v->valid = 1; - v->no_cacheable = 0; - v->not_found = 0; - - return NGX_OK; - -not_found: - - v->not_found = 1; - - return NGX_OK; -} - - -static ngx_int_t -ngx_stream_geoip_city_float_variable(ngx_stream_session_t *s, - ngx_stream_variable_value_t *v, uintptr_t data) -{ - float val; - GeoIPRecord *gr; - - gr = ngx_stream_geoip_get_city_record(s); - if (gr == NULL) { - v->not_found = 1; - return NGX_OK; - } - - v->data = ngx_pnalloc(s->connection->pool, NGX_INT64_LEN + 5); - if (v->data == NULL) { - GeoIPRecord_delete(gr); - return NGX_ERROR; - } - - val = *(float *) ((char *) gr + data); - - v->len = ngx_sprintf(v->data, "%.4f", val) - v->data; - v->valid = 1; - v->no_cacheable = 0; - v->not_found = 0; - - GeoIPRecord_delete(gr); - - return NGX_OK; -} - - -static ngx_int_t -ngx_stream_geoip_city_int_variable(ngx_stream_session_t *s, - ngx_stream_variable_value_t *v, uintptr_t data) -{ - int val; - GeoIPRecord *gr; - - gr = ngx_stream_geoip_get_city_record(s); - if (gr == NULL) { - v->not_found = 1; - return NGX_OK; - } - - v->data = ngx_pnalloc(s->connection->pool, NGX_INT64_LEN); - if (v->data == NULL) { - GeoIPRecord_delete(gr); - return NGX_ERROR; - } - - val = *(int *) ((char *) gr + data); - - v->len = ngx_sprintf(v->data, "%d", val) - v->data; - v->valid = 1; - v->no_cacheable = 0; - v->not_found = 0; - - GeoIPRecord_delete(gr); - - return NGX_OK; -} - - -static GeoIPRecord * -ngx_stream_geoip_get_city_record(ngx_stream_session_t *s) -{ - ngx_stream_geoip_conf_t *gcf; - - gcf = ngx_stream_get_module_main_conf(s, ngx_stream_geoip_module); - - if (gcf->city) { -#if (NGX_HAVE_GEOIP_V6) - return gcf->city_v6 - ? GeoIP_record_by_ipnum_v6(gcf->city, - ngx_stream_geoip_addr_v6(s, gcf)) - : GeoIP_record_by_ipnum(gcf->city, - ngx_stream_geoip_addr(s, gcf)); -#else - return GeoIP_record_by_ipnum(gcf->city, ngx_stream_geoip_addr(s, gcf)); -#endif - } - - return NULL; -} - - -static ngx_int_t -ngx_stream_geoip_add_variables(ngx_conf_t *cf) -{ - ngx_stream_variable_t *var, *v; - - for (v = ngx_stream_geoip_vars; v->name.len; v++) { - var = ngx_stream_add_variable(cf, &v->name, v->flags); - if (var == NULL) { - return NGX_ERROR; - } - - var->get_handler = v->get_handler; - var->data = v->data; - } - - return NGX_OK; -} - - -static void * -ngx_stream_geoip_create_conf(ngx_conf_t *cf) -{ - ngx_pool_cleanup_t *cln; - ngx_stream_geoip_conf_t *conf; - - conf = ngx_pcalloc(cf->pool, sizeof(ngx_stream_geoip_conf_t)); - if (conf == NULL) { - return NULL; - } - - cln = ngx_pool_cleanup_add(cf->pool, 0); - if (cln == NULL) { - return NULL; - } - - cln->handler = ngx_stream_geoip_cleanup; - cln->data = conf; - - return conf; -} - - -static char * -ngx_stream_geoip_country(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) -{ - ngx_stream_geoip_conf_t *gcf = conf; - - ngx_str_t *value; - - if (gcf->country) { - return "is duplicate"; - } - - value = cf->args->elts; - - gcf->country = GeoIP_open((char *) value[1].data, GEOIP_MEMORY_CACHE); - - if (gcf->country == NULL) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "GeoIP_open(\"%V\") failed", &value[1]); - - return NGX_CONF_ERROR; - } - - if (cf->args->nelts == 3) { - if (ngx_strcmp(value[2].data, "utf8") == 0) { - GeoIP_set_charset(gcf->country, GEOIP_CHARSET_UTF8); - - } else { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "invalid parameter \"%V\"", &value[2]); - return NGX_CONF_ERROR; - } - } - - switch (gcf->country->databaseType) { - - case GEOIP_COUNTRY_EDITION: - - return NGX_CONF_OK; - -#if (NGX_HAVE_GEOIP_V6) - case GEOIP_COUNTRY_EDITION_V6: - - gcf->country_v6 = 1; - return NGX_CONF_OK; -#endif - - default: - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "invalid GeoIP database \"%V\" type:%d", - &value[1], gcf->country->databaseType); - return NGX_CONF_ERROR; - } -} - - -static char * -ngx_stream_geoip_org(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) -{ - ngx_stream_geoip_conf_t *gcf = conf; - - ngx_str_t *value; - - if (gcf->org) { - return "is duplicate"; - } - - value = cf->args->elts; - - gcf->org = GeoIP_open((char *) value[1].data, GEOIP_MEMORY_CACHE); - - if (gcf->org == NULL) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "GeoIP_open(\"%V\") failed", &value[1]); - - return NGX_CONF_ERROR; - } - - if (cf->args->nelts == 3) { - if (ngx_strcmp(value[2].data, "utf8") == 0) { - GeoIP_set_charset(gcf->org, GEOIP_CHARSET_UTF8); - - } else { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "invalid parameter \"%V\"", &value[2]); - return NGX_CONF_ERROR; - } - } - - switch (gcf->org->databaseType) { - - case GEOIP_ISP_EDITION: - case GEOIP_ORG_EDITION: - case GEOIP_DOMAIN_EDITION: - case GEOIP_ASNUM_EDITION: - - return NGX_CONF_OK; - -#if (NGX_HAVE_GEOIP_V6) - case GEOIP_ISP_EDITION_V6: - case GEOIP_ORG_EDITION_V6: - case GEOIP_DOMAIN_EDITION_V6: - case GEOIP_ASNUM_EDITION_V6: - - gcf->org_v6 = 1; - return NGX_CONF_OK; -#endif - - default: - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "invalid GeoIP database \"%V\" type:%d", - &value[1], gcf->org->databaseType); - return NGX_CONF_ERROR; - } -} - - -static char * -ngx_stream_geoip_city(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) -{ - ngx_stream_geoip_conf_t *gcf = conf; - - ngx_str_t *value; - - if (gcf->city) { - return "is duplicate"; - } - - value = cf->args->elts; - - gcf->city = GeoIP_open((char *) value[1].data, GEOIP_MEMORY_CACHE); - - if (gcf->city == NULL) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "GeoIP_open(\"%V\") failed", &value[1]); - - return NGX_CONF_ERROR; - } - - if (cf->args->nelts == 3) { - if (ngx_strcmp(value[2].data, "utf8") == 0) { - GeoIP_set_charset(gcf->city, GEOIP_CHARSET_UTF8); - - } else { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "invalid parameter \"%V\"", &value[2]); - return NGX_CONF_ERROR; - } - } - - switch (gcf->city->databaseType) { - - case GEOIP_CITY_EDITION_REV0: - case GEOIP_CITY_EDITION_REV1: - - return NGX_CONF_OK; - -#if (NGX_HAVE_GEOIP_V6) - case GEOIP_CITY_EDITION_REV0_V6: - case GEOIP_CITY_EDITION_REV1_V6: - - gcf->city_v6 = 1; - return NGX_CONF_OK; -#endif - - default: - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "invalid GeoIP City database \"%V\" type:%d", - &value[1], gcf->city->databaseType); - return NGX_CONF_ERROR; - } -} - - -static void -ngx_stream_geoip_cleanup(void *data) -{ - ngx_stream_geoip_conf_t *gcf = data; - - if (gcf->country) { - GeoIP_delete(gcf->country); - } - - if (gcf->org) { - GeoIP_delete(gcf->org); - } - - if (gcf->city) { - GeoIP_delete(gcf->city); - } -} diff --git a/src/deps/src/nginx-1.30.3/src/stream/ngx_stream_handler.c b/src/deps/src/nginx-1.30.3/src/stream/ngx_stream_handler.c deleted file mode 100644 index a7ffc6e618..0000000000 --- a/src/deps/src/nginx-1.30.3/src/stream/ngx_stream_handler.c +++ /dev/null @@ -1,389 +0,0 @@ - -/* - * Copyright (C) Roman Arutyunyan - * Copyright (C) Nginx, Inc. - */ - - -#include -#include -#include -#include - - -static void ngx_stream_log_session(ngx_stream_session_t *s); -static void ngx_stream_close_connection(ngx_connection_t *c); -static u_char *ngx_stream_log_error(ngx_log_t *log, u_char *buf, size_t len); -static void ngx_stream_proxy_protocol_handler(ngx_event_t *rev); - - -void -ngx_stream_init_connection(ngx_connection_t *c) -{ - u_char text[NGX_SOCKADDR_STRLEN]; - size_t len; - ngx_uint_t i; - ngx_time_t *tp; - ngx_event_t *rev; - struct sockaddr *sa; - ngx_stream_port_t *port; - struct sockaddr_in *sin; - ngx_stream_in_addr_t *addr; - ngx_stream_session_t *s; - ngx_stream_conf_ctx_t *ctx; - ngx_stream_addr_conf_t *addr_conf; -#if (NGX_HAVE_INET6) - struct sockaddr_in6 *sin6; - ngx_stream_in6_addr_t *addr6; -#endif - ngx_stream_core_srv_conf_t *cscf; - ngx_stream_core_main_conf_t *cmcf; - - /* find the server configuration for the address:port */ - - port = c->listening->servers; - - if (port->naddrs > 1) { - - /* - * There are several addresses on this port and one of them - * is the "*:port" wildcard so getsockname() is needed to determine - * the server address. - * - * AcceptEx() and recvmsg() already gave this address. - */ - - if (ngx_connection_local_sockaddr(c, NULL, 0) != NGX_OK) { - ngx_stream_close_connection(c); - return; - } - - sa = c->local_sockaddr; - - switch (sa->sa_family) { - -#if (NGX_HAVE_INET6) - case AF_INET6: - sin6 = (struct sockaddr_in6 *) sa; - - addr6 = port->addrs; - - /* the last address is "*" */ - - for (i = 0; i < port->naddrs - 1; i++) { - if (ngx_memcmp(&addr6[i].addr6, &sin6->sin6_addr, 16) == 0) { - break; - } - } - - addr_conf = &addr6[i].conf; - - break; -#endif - - default: /* AF_INET */ - sin = (struct sockaddr_in *) sa; - - addr = port->addrs; - - /* the last address is "*" */ - - for (i = 0; i < port->naddrs - 1; i++) { - if (addr[i].addr == sin->sin_addr.s_addr) { - break; - } - } - - addr_conf = &addr[i].conf; - - break; - } - - } else { - switch (c->local_sockaddr->sa_family) { - -#if (NGX_HAVE_INET6) - case AF_INET6: - addr6 = port->addrs; - addr_conf = &addr6[0].conf; - break; -#endif - - default: /* AF_INET */ - addr = port->addrs; - addr_conf = &addr[0].conf; - break; - } - } - - s = ngx_pcalloc(c->pool, sizeof(ngx_stream_session_t)); - if (s == NULL) { - ngx_stream_close_connection(c); - return; - } - - ctx = addr_conf->default_server->ctx; - - s->signature = NGX_STREAM_MODULE; - s->main_conf = ctx->main_conf; - s->srv_conf = ctx->srv_conf; - s->virtual_names = addr_conf->virtual_names; - -#if (NGX_STREAM_SSL) - s->ssl = addr_conf->ssl; -#endif - - if (c->buffer) { - s->received += c->buffer->last - c->buffer->pos; - } - - s->connection = c; - c->data = s; - - cscf = ngx_stream_get_module_srv_conf(s, ngx_stream_core_module); - - ngx_set_connection_log(c, cscf->error_log); - - len = ngx_sock_ntop(c->sockaddr, c->socklen, text, NGX_SOCKADDR_STRLEN, 1); - - ngx_log_error(NGX_LOG_INFO, c->log, 0, "*%uA %sclient %*s connected to %V", - c->number, c->type == SOCK_DGRAM ? "udp " : "", - len, text, &c->listening->addr_text); - - c->log->connection = c->number; - c->log->handler = ngx_stream_log_error; - c->log->data = s; - c->log->action = "initializing session"; - c->log_error = NGX_ERROR_INFO; - - s->ctx = ngx_pcalloc(c->pool, sizeof(void *) * ngx_stream_max_module); - if (s->ctx == NULL) { - ngx_stream_close_connection(c); - return; - } - - cmcf = ngx_stream_get_module_main_conf(s, ngx_stream_core_module); - - s->variables = ngx_pcalloc(s->connection->pool, - cmcf->variables.nelts - * sizeof(ngx_stream_variable_value_t)); - - if (s->variables == NULL) { - ngx_stream_close_connection(c); - return; - } - - tp = ngx_timeofday(); - s->start_sec = tp->sec; - s->start_msec = tp->msec; - - rev = c->read; - rev->handler = ngx_stream_session_handler; - - if (addr_conf->proxy_protocol) { - c->log->action = "reading PROXY protocol"; - - rev->handler = ngx_stream_proxy_protocol_handler; - - if (!rev->ready) { - ngx_add_timer(rev, cscf->proxy_protocol_timeout); - - if (ngx_handle_read_event(rev, 0) != NGX_OK) { - ngx_stream_finalize_session(s, - NGX_STREAM_INTERNAL_SERVER_ERROR); - } - - return; - } - } - - if (ngx_use_accept_mutex) { - ngx_post_event(rev, &ngx_posted_events); - return; - } - - rev->handler(rev); -} - - -static void -ngx_stream_proxy_protocol_handler(ngx_event_t *rev) -{ - u_char *p, buf[NGX_PROXY_PROTOCOL_MAX_HEADER]; - size_t size; - ssize_t n; - ngx_err_t err; - ngx_connection_t *c; - ngx_stream_session_t *s; - ngx_stream_core_srv_conf_t *cscf; - - c = rev->data; - s = c->data; - - ngx_log_debug0(NGX_LOG_DEBUG_STREAM, c->log, 0, - "stream PROXY protocol handler"); - - if (rev->timedout) { - ngx_log_error(NGX_LOG_INFO, c->log, NGX_ETIMEDOUT, "client timed out"); - ngx_stream_finalize_session(s, NGX_STREAM_OK); - return; - } - - n = recv(c->fd, (char *) buf, sizeof(buf), MSG_PEEK); - - err = ngx_socket_errno; - - ngx_log_debug1(NGX_LOG_DEBUG_STREAM, c->log, 0, "recv(): %z", n); - - if (n == -1) { - if (err == NGX_EAGAIN) { - rev->ready = 0; - - if (!rev->timer_set) { - cscf = ngx_stream_get_module_srv_conf(s, - ngx_stream_core_module); - - ngx_add_timer(rev, cscf->proxy_protocol_timeout); - } - - if (ngx_handle_read_event(rev, 0) != NGX_OK) { - ngx_stream_finalize_session(s, - NGX_STREAM_INTERNAL_SERVER_ERROR); - } - - return; - } - - ngx_connection_error(c, err, "recv() failed"); - - ngx_stream_finalize_session(s, NGX_STREAM_OK); - return; - } - - if (rev->timer_set) { - ngx_del_timer(rev); - } - - p = ngx_proxy_protocol_read(c, buf, buf + n); - - if (p == NULL) { - ngx_stream_finalize_session(s, NGX_STREAM_BAD_REQUEST); - return; - } - - size = p - buf; - - if (c->recv(c, buf, size) != (ssize_t) size) { - ngx_stream_finalize_session(s, NGX_STREAM_INTERNAL_SERVER_ERROR); - return; - } - - c->log->action = "initializing session"; - - ngx_stream_session_handler(rev); -} - - -void -ngx_stream_session_handler(ngx_event_t *rev) -{ - ngx_connection_t *c; - ngx_stream_session_t *s; - - c = rev->data; - s = c->data; - - ngx_stream_core_run_phases(s); -} - - -void -ngx_stream_finalize_session(ngx_stream_session_t *s, ngx_uint_t rc) -{ - ngx_log_debug1(NGX_LOG_DEBUG_STREAM, s->connection->log, 0, - "finalize stream session: %i", rc); - - s->status = rc; - - ngx_stream_log_session(s); - - ngx_stream_close_connection(s->connection); -} - - -static void -ngx_stream_log_session(ngx_stream_session_t *s) -{ - ngx_uint_t i, n; - ngx_stream_handler_pt *log_handler; - ngx_stream_core_main_conf_t *cmcf; - - cmcf = ngx_stream_get_module_main_conf(s, ngx_stream_core_module); - - log_handler = cmcf->phases[NGX_STREAM_LOG_PHASE].handlers.elts; - n = cmcf->phases[NGX_STREAM_LOG_PHASE].handlers.nelts; - - for (i = 0; i < n; i++) { - log_handler[i](s); - } -} - - -static void -ngx_stream_close_connection(ngx_connection_t *c) -{ - ngx_pool_t *pool; - - ngx_log_debug1(NGX_LOG_DEBUG_STREAM, c->log, 0, - "close stream connection: %d", c->fd); - -#if (NGX_STREAM_SSL) - - if (c->ssl) { - if (ngx_ssl_shutdown(c) == NGX_AGAIN) { - c->ssl->handler = ngx_stream_close_connection; - return; - } - } - -#endif - -#if (NGX_STAT_STUB) - (void) ngx_atomic_fetch_add(ngx_stat_active, -1); -#endif - - pool = c->pool; - - ngx_close_connection(c); - - ngx_destroy_pool(pool); -} - - -static u_char * -ngx_stream_log_error(ngx_log_t *log, u_char *buf, size_t len) -{ - u_char *p; - ngx_stream_session_t *s; - - if (log->action) { - p = ngx_snprintf(buf, len, " while %s", log->action); - len -= p - buf; - buf = p; - } - - s = log->data; - - p = ngx_snprintf(buf, len, ", %sclient: %V, server: %V", - s->connection->type == SOCK_DGRAM ? "udp " : "", - &s->connection->addr_text, - &s->connection->listening->addr_text); - len -= p - buf; - buf = p; - - if (s->log_handler) { - p = s->log_handler(log, buf, len); - } - - return p; -} diff --git a/src/deps/src/nginx-1.30.3/src/stream/ngx_stream_limit_conn_module.c b/src/deps/src/nginx-1.30.3/src/stream/ngx_stream_limit_conn_module.c deleted file mode 100644 index bae034ad3a..0000000000 --- a/src/deps/src/nginx-1.30.3/src/stream/ngx_stream_limit_conn_module.c +++ /dev/null @@ -1,737 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#include -#include -#include - - -#define NGX_STREAM_LIMIT_CONN_PASSED 1 -#define NGX_STREAM_LIMIT_CONN_REJECTED 2 -#define NGX_STREAM_LIMIT_CONN_REJECTED_DRY_RUN 3 - - -typedef struct { - u_char color; - u_char len; - u_short conn; - u_char data[1]; -} ngx_stream_limit_conn_node_t; - - -typedef struct { - ngx_shm_zone_t *shm_zone; - ngx_rbtree_node_t *node; -} ngx_stream_limit_conn_cleanup_t; - - -typedef struct { - ngx_rbtree_t rbtree; - ngx_rbtree_node_t sentinel; -} ngx_stream_limit_conn_shctx_t; - - -typedef struct { - ngx_stream_limit_conn_shctx_t *sh; - ngx_slab_pool_t *shpool; - ngx_stream_complex_value_t key; -} ngx_stream_limit_conn_ctx_t; - - -typedef struct { - ngx_shm_zone_t *shm_zone; - ngx_uint_t conn; -} ngx_stream_limit_conn_limit_t; - - -typedef struct { - ngx_array_t limits; - ngx_uint_t log_level; - ngx_flag_t dry_run; -} ngx_stream_limit_conn_conf_t; - - -static ngx_rbtree_node_t *ngx_stream_limit_conn_lookup(ngx_rbtree_t *rbtree, - ngx_str_t *key, uint32_t hash); -static void ngx_stream_limit_conn_cleanup(void *data); -static ngx_inline void ngx_stream_limit_conn_cleanup_all(ngx_pool_t *pool); - -static ngx_int_t ngx_stream_limit_conn_status_variable(ngx_stream_session_t *s, - ngx_stream_variable_value_t *v, uintptr_t data); -static void *ngx_stream_limit_conn_create_conf(ngx_conf_t *cf); -static char *ngx_stream_limit_conn_merge_conf(ngx_conf_t *cf, void *parent, - void *child); -static char *ngx_stream_limit_conn_zone(ngx_conf_t *cf, ngx_command_t *cmd, - void *conf); -static char *ngx_stream_limit_conn(ngx_conf_t *cf, ngx_command_t *cmd, - void *conf); -static ngx_int_t ngx_stream_limit_conn_add_variables(ngx_conf_t *cf); -static ngx_int_t ngx_stream_limit_conn_init(ngx_conf_t *cf); - - -static ngx_conf_enum_t ngx_stream_limit_conn_log_levels[] = { - { ngx_string("info"), NGX_LOG_INFO }, - { ngx_string("notice"), NGX_LOG_NOTICE }, - { ngx_string("warn"), NGX_LOG_WARN }, - { ngx_string("error"), NGX_LOG_ERR }, - { ngx_null_string, 0 } -}; - - -static ngx_command_t ngx_stream_limit_conn_commands[] = { - - { ngx_string("limit_conn_zone"), - NGX_STREAM_MAIN_CONF|NGX_CONF_TAKE2, - ngx_stream_limit_conn_zone, - 0, - 0, - NULL }, - - { ngx_string("limit_conn"), - NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_TAKE2, - ngx_stream_limit_conn, - NGX_STREAM_SRV_CONF_OFFSET, - 0, - NULL }, - - { ngx_string("limit_conn_log_level"), - NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_TAKE1, - ngx_conf_set_enum_slot, - NGX_STREAM_SRV_CONF_OFFSET, - offsetof(ngx_stream_limit_conn_conf_t, log_level), - &ngx_stream_limit_conn_log_levels }, - - { ngx_string("limit_conn_dry_run"), - NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_FLAG, - ngx_conf_set_flag_slot, - NGX_STREAM_SRV_CONF_OFFSET, - offsetof(ngx_stream_limit_conn_conf_t, dry_run), - NULL }, - - ngx_null_command -}; - - -static ngx_stream_module_t ngx_stream_limit_conn_module_ctx = { - ngx_stream_limit_conn_add_variables, /* preconfiguration */ - ngx_stream_limit_conn_init, /* postconfiguration */ - - NULL, /* create main configuration */ - NULL, /* init main configuration */ - - ngx_stream_limit_conn_create_conf, /* create server configuration */ - ngx_stream_limit_conn_merge_conf /* merge server configuration */ -}; - - -ngx_module_t ngx_stream_limit_conn_module = { - NGX_MODULE_V1, - &ngx_stream_limit_conn_module_ctx, /* module context */ - ngx_stream_limit_conn_commands, /* module directives */ - NGX_STREAM_MODULE, /* module type */ - NULL, /* init master */ - NULL, /* init module */ - NULL, /* init process */ - NULL, /* init thread */ - NULL, /* exit thread */ - NULL, /* exit process */ - NULL, /* exit master */ - NGX_MODULE_V1_PADDING -}; - - -static ngx_stream_variable_t ngx_stream_limit_conn_vars[] = { - - { ngx_string("limit_conn_status"), NULL, - ngx_stream_limit_conn_status_variable, 0, NGX_STREAM_VAR_NOCACHEABLE, 0 }, - - ngx_stream_null_variable -}; - - -static ngx_str_t ngx_stream_limit_conn_status[] = { - ngx_string("PASSED"), - ngx_string("REJECTED"), - ngx_string("REJECTED_DRY_RUN") -}; - - -static ngx_int_t -ngx_stream_limit_conn_handler(ngx_stream_session_t *s) -{ - size_t n; - uint32_t hash; - ngx_str_t key; - ngx_uint_t i; - ngx_rbtree_node_t *node; - ngx_pool_cleanup_t *cln; - ngx_stream_limit_conn_ctx_t *ctx; - ngx_stream_limit_conn_node_t *lc; - ngx_stream_limit_conn_conf_t *lccf; - ngx_stream_limit_conn_limit_t *limits; - ngx_stream_limit_conn_cleanup_t *lccln; - - lccf = ngx_stream_get_module_srv_conf(s, ngx_stream_limit_conn_module); - limits = lccf->limits.elts; - - for (i = 0; i < lccf->limits.nelts; i++) { - ctx = limits[i].shm_zone->data; - - if (ngx_stream_complex_value(s, &ctx->key, &key) != NGX_OK) { - return NGX_ERROR; - } - - if (key.len == 0) { - continue; - } - - if (key.len > 255) { - ngx_log_error(NGX_LOG_ERR, s->connection->log, 0, - "the value of the \"%V\" key " - "is more than 255 bytes: \"%V\"", - &ctx->key.value, &key); - continue; - } - - s->limit_conn_status = NGX_STREAM_LIMIT_CONN_PASSED; - - hash = ngx_crc32_short(key.data, key.len); - - ngx_shmtx_lock(&ctx->shpool->mutex); - - node = ngx_stream_limit_conn_lookup(&ctx->sh->rbtree, &key, hash); - - if (node == NULL) { - - n = offsetof(ngx_rbtree_node_t, color) - + offsetof(ngx_stream_limit_conn_node_t, data) - + key.len; - - node = ngx_slab_alloc_locked(ctx->shpool, n); - - if (node == NULL) { - ngx_shmtx_unlock(&ctx->shpool->mutex); - ngx_stream_limit_conn_cleanup_all(s->connection->pool); - - if (lccf->dry_run) { - s->limit_conn_status = - NGX_STREAM_LIMIT_CONN_REJECTED_DRY_RUN; - return NGX_DECLINED; - } - - s->limit_conn_status = NGX_STREAM_LIMIT_CONN_REJECTED; - - return NGX_STREAM_SERVICE_UNAVAILABLE; - } - - lc = (ngx_stream_limit_conn_node_t *) &node->color; - - node->key = hash; - lc->len = (u_char) key.len; - lc->conn = 1; - ngx_memcpy(lc->data, key.data, key.len); - - ngx_rbtree_insert(&ctx->sh->rbtree, node); - - } else { - - lc = (ngx_stream_limit_conn_node_t *) &node->color; - - if ((ngx_uint_t) lc->conn >= limits[i].conn) { - - ngx_shmtx_unlock(&ctx->shpool->mutex); - - ngx_log_error(lccf->log_level, s->connection->log, 0, - "limiting connections%s by zone \"%V\"", - lccf->dry_run ? ", dry run," : "", - &limits[i].shm_zone->shm.name); - - ngx_stream_limit_conn_cleanup_all(s->connection->pool); - - if (lccf->dry_run) { - s->limit_conn_status = - NGX_STREAM_LIMIT_CONN_REJECTED_DRY_RUN; - return NGX_DECLINED; - } - - s->limit_conn_status = NGX_STREAM_LIMIT_CONN_REJECTED; - - return NGX_STREAM_SERVICE_UNAVAILABLE; - } - - lc->conn++; - } - - ngx_log_debug2(NGX_LOG_DEBUG_STREAM, s->connection->log, 0, - "limit conn: %08Xi %d", node->key, lc->conn); - - ngx_shmtx_unlock(&ctx->shpool->mutex); - - cln = ngx_pool_cleanup_add(s->connection->pool, - sizeof(ngx_stream_limit_conn_cleanup_t)); - if (cln == NULL) { - return NGX_ERROR; - } - - cln->handler = ngx_stream_limit_conn_cleanup; - lccln = cln->data; - - lccln->shm_zone = limits[i].shm_zone; - lccln->node = node; - } - - return NGX_DECLINED; -} - - -static void -ngx_stream_limit_conn_rbtree_insert_value(ngx_rbtree_node_t *temp, - ngx_rbtree_node_t *node, ngx_rbtree_node_t *sentinel) -{ - ngx_rbtree_node_t **p; - ngx_stream_limit_conn_node_t *lcn, *lcnt; - - for ( ;; ) { - - if (node->key < temp->key) { - - p = &temp->left; - - } else if (node->key > temp->key) { - - p = &temp->right; - - } else { /* node->key == temp->key */ - - lcn = (ngx_stream_limit_conn_node_t *) &node->color; - lcnt = (ngx_stream_limit_conn_node_t *) &temp->color; - - p = (ngx_memn2cmp(lcn->data, lcnt->data, lcn->len, lcnt->len) < 0) - ? &temp->left : &temp->right; - } - - if (*p == sentinel) { - break; - } - - temp = *p; - } - - *p = node; - node->parent = temp; - node->left = sentinel; - node->right = sentinel; - ngx_rbt_red(node); -} - - -static ngx_rbtree_node_t * -ngx_stream_limit_conn_lookup(ngx_rbtree_t *rbtree, ngx_str_t *key, - uint32_t hash) -{ - ngx_int_t rc; - ngx_rbtree_node_t *node, *sentinel; - ngx_stream_limit_conn_node_t *lcn; - - node = rbtree->root; - sentinel = rbtree->sentinel; - - while (node != sentinel) { - - if (hash < node->key) { - node = node->left; - continue; - } - - if (hash > node->key) { - node = node->right; - continue; - } - - /* hash == node->key */ - - lcn = (ngx_stream_limit_conn_node_t *) &node->color; - - rc = ngx_memn2cmp(key->data, lcn->data, key->len, (size_t) lcn->len); - - if (rc == 0) { - return node; - } - - node = (rc < 0) ? node->left : node->right; - } - - return NULL; -} - - -static void -ngx_stream_limit_conn_cleanup(void *data) -{ - ngx_stream_limit_conn_cleanup_t *lccln = data; - - ngx_rbtree_node_t *node; - ngx_stream_limit_conn_ctx_t *ctx; - ngx_stream_limit_conn_node_t *lc; - - ctx = lccln->shm_zone->data; - node = lccln->node; - lc = (ngx_stream_limit_conn_node_t *) &node->color; - - ngx_shmtx_lock(&ctx->shpool->mutex); - - ngx_log_debug2(NGX_LOG_DEBUG_STREAM, lccln->shm_zone->shm.log, 0, - "limit conn cleanup: %08Xi %d", node->key, lc->conn); - - lc->conn--; - - if (lc->conn == 0) { - ngx_rbtree_delete(&ctx->sh->rbtree, node); - ngx_slab_free_locked(ctx->shpool, node); - } - - ngx_shmtx_unlock(&ctx->shpool->mutex); -} - - -static ngx_inline void -ngx_stream_limit_conn_cleanup_all(ngx_pool_t *pool) -{ - ngx_pool_cleanup_t *cln; - - cln = pool->cleanup; - - while (cln && cln->handler == ngx_stream_limit_conn_cleanup) { - ngx_stream_limit_conn_cleanup(cln->data); - cln = cln->next; - } - - pool->cleanup = cln; -} - - -static ngx_int_t -ngx_stream_limit_conn_init_zone(ngx_shm_zone_t *shm_zone, void *data) -{ - ngx_stream_limit_conn_ctx_t *octx = data; - - size_t len; - ngx_stream_limit_conn_ctx_t *ctx; - - ctx = shm_zone->data; - - if (octx) { - if (ctx->key.value.len != octx->key.value.len - || ngx_strncmp(ctx->key.value.data, octx->key.value.data, - ctx->key.value.len) - != 0) - { - ngx_log_error(NGX_LOG_EMERG, shm_zone->shm.log, 0, - "limit_conn_zone \"%V\" uses the \"%V\" key " - "while previously it used the \"%V\" key", - &shm_zone->shm.name, &ctx->key.value, - &octx->key.value); - return NGX_ERROR; - } - - ctx->sh = octx->sh; - ctx->shpool = octx->shpool; - - return NGX_OK; - } - - ctx->shpool = (ngx_slab_pool_t *) shm_zone->shm.addr; - - if (shm_zone->shm.exists) { - ctx->sh = ctx->shpool->data; - - return NGX_OK; - } - - ctx->sh = ngx_slab_alloc(ctx->shpool, - sizeof(ngx_stream_limit_conn_shctx_t)); - if (ctx->sh == NULL) { - return NGX_ERROR; - } - - ctx->shpool->data = ctx->sh; - - ngx_rbtree_init(&ctx->sh->rbtree, &ctx->sh->sentinel, - ngx_stream_limit_conn_rbtree_insert_value); - - len = sizeof(" in limit_conn_zone \"\"") + shm_zone->shm.name.len; - - ctx->shpool->log_ctx = ngx_slab_alloc(ctx->shpool, len); - if (ctx->shpool->log_ctx == NULL) { - return NGX_ERROR; - } - - ngx_sprintf(ctx->shpool->log_ctx, " in limit_conn_zone \"%V\"%Z", - &shm_zone->shm.name); - - return NGX_OK; -} - - -static ngx_int_t -ngx_stream_limit_conn_status_variable(ngx_stream_session_t *s, - ngx_stream_variable_value_t *v, uintptr_t data) -{ - if (s->limit_conn_status == 0) { - v->not_found = 1; - return NGX_OK; - } - - v->valid = 1; - v->no_cacheable = 0; - v->not_found = 0; - v->len = ngx_stream_limit_conn_status[s->limit_conn_status - 1].len; - v->data = ngx_stream_limit_conn_status[s->limit_conn_status - 1].data; - - return NGX_OK; -} - - -static void * -ngx_stream_limit_conn_create_conf(ngx_conf_t *cf) -{ - ngx_stream_limit_conn_conf_t *conf; - - conf = ngx_pcalloc(cf->pool, sizeof(ngx_stream_limit_conn_conf_t)); - if (conf == NULL) { - return NULL; - } - - /* - * set by ngx_pcalloc(): - * - * conf->limits.elts = NULL; - */ - - conf->log_level = NGX_CONF_UNSET_UINT; - conf->dry_run = NGX_CONF_UNSET; - - return conf; -} - - -static char * -ngx_stream_limit_conn_merge_conf(ngx_conf_t *cf, void *parent, void *child) -{ - ngx_stream_limit_conn_conf_t *prev = parent; - ngx_stream_limit_conn_conf_t *conf = child; - - if (conf->limits.elts == NULL) { - conf->limits = prev->limits; - } - - ngx_conf_merge_uint_value(conf->log_level, prev->log_level, NGX_LOG_ERR); - - ngx_conf_merge_value(conf->dry_run, prev->dry_run, 0); - - return NGX_CONF_OK; -} - - -static char * -ngx_stream_limit_conn_zone(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) -{ - u_char *p; - ssize_t size; - ngx_str_t *value, name, s; - ngx_uint_t i; - ngx_shm_zone_t *shm_zone; - ngx_stream_limit_conn_ctx_t *ctx; - ngx_stream_compile_complex_value_t ccv; - - value = cf->args->elts; - - ctx = ngx_pcalloc(cf->pool, sizeof(ngx_stream_limit_conn_ctx_t)); - if (ctx == NULL) { - return NGX_CONF_ERROR; - } - - ngx_memzero(&ccv, sizeof(ngx_stream_compile_complex_value_t)); - - ccv.cf = cf; - ccv.value = &value[1]; - ccv.complex_value = &ctx->key; - - if (ngx_stream_compile_complex_value(&ccv) != NGX_OK) { - return NGX_CONF_ERROR; - } - - size = 0; - name.len = 0; - - for (i = 2; i < cf->args->nelts; i++) { - - if (ngx_strncmp(value[i].data, "zone=", 5) == 0) { - - name.data = value[i].data + 5; - - p = (u_char *) ngx_strchr(name.data, ':'); - - if (p == NULL) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "invalid zone size \"%V\"", &value[i]); - return NGX_CONF_ERROR; - } - - name.len = p - name.data; - - s.data = p + 1; - s.len = value[i].data + value[i].len - s.data; - - size = ngx_parse_size(&s); - - if (size == NGX_ERROR) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "invalid zone size \"%V\"", &value[i]); - return NGX_CONF_ERROR; - } - - if (size < (ssize_t) (8 * ngx_pagesize)) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "zone \"%V\" is too small", &value[i]); - return NGX_CONF_ERROR; - } - - continue; - } - - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "invalid parameter \"%V\"", &value[i]); - return NGX_CONF_ERROR; - } - - if (name.len == 0) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "\"%V\" must have \"zone\" parameter", - &cmd->name); - return NGX_CONF_ERROR; - } - - shm_zone = ngx_shared_memory_add(cf, &name, size, - &ngx_stream_limit_conn_module); - if (shm_zone == NULL) { - return NGX_CONF_ERROR; - } - - if (shm_zone->data) { - ctx = shm_zone->data; - - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "%V \"%V\" is already bound to key \"%V\"", - &cmd->name, &name, &ctx->key.value); - return NGX_CONF_ERROR; - } - - shm_zone->init = ngx_stream_limit_conn_init_zone; - shm_zone->data = ctx; - - return NGX_CONF_OK; -} - - -static char * -ngx_stream_limit_conn(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) -{ - ngx_shm_zone_t *shm_zone; - ngx_stream_limit_conn_conf_t *lccf = conf; - ngx_stream_limit_conn_limit_t *limit, *limits; - - ngx_str_t *value; - ngx_int_t n; - ngx_uint_t i; - - value = cf->args->elts; - - shm_zone = ngx_shared_memory_add(cf, &value[1], 0, - &ngx_stream_limit_conn_module); - if (shm_zone == NULL) { - return NGX_CONF_ERROR; - } - - limits = lccf->limits.elts; - - if (limits == NULL) { - if (ngx_array_init(&lccf->limits, cf->pool, 1, - sizeof(ngx_stream_limit_conn_limit_t)) - != NGX_OK) - { - return NGX_CONF_ERROR; - } - } - - for (i = 0; i < lccf->limits.nelts; i++) { - if (shm_zone == limits[i].shm_zone) { - return "is duplicate"; - } - } - - n = ngx_atoi(value[2].data, value[2].len); - if (n <= 0) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "invalid number of connections \"%V\"", &value[2]); - return NGX_CONF_ERROR; - } - - if (n > 65535) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "connection limit must be less 65536"); - return NGX_CONF_ERROR; - } - - limit = ngx_array_push(&lccf->limits); - if (limit == NULL) { - return NGX_CONF_ERROR; - } - - limit->conn = n; - limit->shm_zone = shm_zone; - - return NGX_CONF_OK; -} - - -static ngx_int_t -ngx_stream_limit_conn_add_variables(ngx_conf_t *cf) -{ - ngx_stream_variable_t *var, *v; - - for (v = ngx_stream_limit_conn_vars; v->name.len; v++) { - var = ngx_stream_add_variable(cf, &v->name, v->flags); - if (var == NULL) { - return NGX_ERROR; - } - - var->get_handler = v->get_handler; - var->data = v->data; - } - - return NGX_OK; -} - - -static ngx_int_t -ngx_stream_limit_conn_init(ngx_conf_t *cf) -{ - ngx_stream_handler_pt *h; - ngx_stream_core_main_conf_t *cmcf; - - cmcf = ngx_stream_conf_get_module_main_conf(cf, ngx_stream_core_module); - - h = ngx_array_push(&cmcf->phases[NGX_STREAM_PREACCESS_PHASE].handlers); - if (h == NULL) { - return NGX_ERROR; - } - - *h = ngx_stream_limit_conn_handler; - - return NGX_OK; -} diff --git a/src/deps/src/nginx-1.30.3/src/stream/ngx_stream_log_module.c b/src/deps/src/nginx-1.30.3/src/stream/ngx_stream_log_module.c deleted file mode 100644 index 0ff7f42444..0000000000 --- a/src/deps/src/nginx-1.30.3/src/stream/ngx_stream_log_module.c +++ /dev/null @@ -1,1596 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#include -#include -#include - -#if (NGX_ZLIB) -#include -#endif - - -typedef struct ngx_stream_log_op_s ngx_stream_log_op_t; - -typedef u_char *(*ngx_stream_log_op_run_pt) (ngx_stream_session_t *s, - u_char *buf, ngx_stream_log_op_t *op); - -typedef size_t (*ngx_stream_log_op_getlen_pt) (ngx_stream_session_t *s, - uintptr_t data); - - -struct ngx_stream_log_op_s { - size_t len; - ngx_stream_log_op_getlen_pt getlen; - ngx_stream_log_op_run_pt run; - uintptr_t data; -}; - - -typedef struct { - ngx_str_t name; - ngx_array_t *flushes; - ngx_array_t *ops; /* array of ngx_stream_log_op_t */ -} ngx_stream_log_fmt_t; - - -typedef struct { - ngx_array_t formats; /* array of ngx_stream_log_fmt_t */ -} ngx_stream_log_main_conf_t; - - -typedef struct { - u_char *start; - u_char *pos; - u_char *last; - - ngx_event_t *event; - ngx_msec_t flush; - ngx_int_t gzip; -} ngx_stream_log_buf_t; - - -typedef struct { - ngx_array_t *lengths; - ngx_array_t *values; -} ngx_stream_log_script_t; - - -typedef struct { - ngx_open_file_t *file; - ngx_stream_log_script_t *script; - time_t disk_full_time; - time_t error_log_time; - ngx_syslog_peer_t *syslog_peer; - ngx_stream_log_fmt_t *format; - ngx_stream_complex_value_t *filter; -} ngx_stream_log_t; - - -typedef struct { - ngx_array_t *logs; /* array of ngx_stream_log_t */ - - ngx_open_file_cache_t *open_file_cache; - time_t open_file_cache_valid; - ngx_uint_t open_file_cache_min_uses; - - ngx_uint_t off; /* unsigned off:1 */ -} ngx_stream_log_srv_conf_t; - - -typedef struct { - ngx_str_t name; - size_t len; - ngx_stream_log_op_run_pt run; -} ngx_stream_log_var_t; - - -#define NGX_STREAM_LOG_ESCAPE_DEFAULT 0 -#define NGX_STREAM_LOG_ESCAPE_JSON 1 -#define NGX_STREAM_LOG_ESCAPE_NONE 2 - - -static void ngx_stream_log_write(ngx_stream_session_t *s, ngx_stream_log_t *log, - u_char *buf, size_t len); -static ssize_t ngx_stream_log_script_write(ngx_stream_session_t *s, - ngx_stream_log_script_t *script, u_char **name, u_char *buf, size_t len); - -#if (NGX_ZLIB) -static ssize_t ngx_stream_log_gzip(ngx_fd_t fd, u_char *buf, size_t len, - ngx_int_t level, ngx_log_t *log); - -static void *ngx_stream_log_gzip_alloc(void *opaque, u_int items, u_int size); -static void ngx_stream_log_gzip_free(void *opaque, void *address); -#endif - -static void ngx_stream_log_flush(ngx_open_file_t *file, ngx_log_t *log); -static void ngx_stream_log_flush_handler(ngx_event_t *ev); - -static ngx_int_t ngx_stream_log_variable_compile(ngx_conf_t *cf, - ngx_stream_log_op_t *op, ngx_str_t *value, ngx_uint_t escape); -static size_t ngx_stream_log_variable_getlen(ngx_stream_session_t *s, - uintptr_t data); -static u_char *ngx_stream_log_variable(ngx_stream_session_t *s, u_char *buf, - ngx_stream_log_op_t *op); -static uintptr_t ngx_stream_log_escape(u_char *dst, u_char *src, size_t size); -static size_t ngx_stream_log_json_variable_getlen(ngx_stream_session_t *s, - uintptr_t data); -static u_char *ngx_stream_log_json_variable(ngx_stream_session_t *s, - u_char *buf, ngx_stream_log_op_t *op); -static size_t ngx_stream_log_unescaped_variable_getlen(ngx_stream_session_t *s, - uintptr_t data); -static u_char *ngx_stream_log_unescaped_variable(ngx_stream_session_t *s, - u_char *buf, ngx_stream_log_op_t *op); - - -static void *ngx_stream_log_create_main_conf(ngx_conf_t *cf); -static void *ngx_stream_log_create_srv_conf(ngx_conf_t *cf); -static char *ngx_stream_log_merge_srv_conf(ngx_conf_t *cf, void *parent, - void *child); -static char *ngx_stream_log_set_log(ngx_conf_t *cf, ngx_command_t *cmd, - void *conf); -static char *ngx_stream_log_set_format(ngx_conf_t *cf, ngx_command_t *cmd, - void *conf); -static char *ngx_stream_log_compile_format(ngx_conf_t *cf, - ngx_array_t *flushes, ngx_array_t *ops, ngx_array_t *args, ngx_uint_t s); -static char *ngx_stream_log_open_file_cache(ngx_conf_t *cf, ngx_command_t *cmd, - void *conf); -static ngx_int_t ngx_stream_log_init(ngx_conf_t *cf); - - -static ngx_command_t ngx_stream_log_commands[] = { - - { ngx_string("log_format"), - NGX_STREAM_MAIN_CONF|NGX_CONF_2MORE, - ngx_stream_log_set_format, - NGX_STREAM_MAIN_CONF_OFFSET, - 0, - NULL }, - - { ngx_string("access_log"), - NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_1MORE, - ngx_stream_log_set_log, - NGX_STREAM_SRV_CONF_OFFSET, - 0, - NULL }, - - { ngx_string("open_log_file_cache"), - NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_TAKE1234, - ngx_stream_log_open_file_cache, - NGX_STREAM_SRV_CONF_OFFSET, - 0, - NULL }, - - ngx_null_command -}; - - -static ngx_stream_module_t ngx_stream_log_module_ctx = { - NULL, /* preconfiguration */ - ngx_stream_log_init, /* postconfiguration */ - - ngx_stream_log_create_main_conf, /* create main configuration */ - NULL, /* init main configuration */ - - ngx_stream_log_create_srv_conf, /* create server configuration */ - ngx_stream_log_merge_srv_conf /* merge server configuration */ -}; - - -ngx_module_t ngx_stream_log_module = { - NGX_MODULE_V1, - &ngx_stream_log_module_ctx, /* module context */ - ngx_stream_log_commands, /* module directives */ - NGX_STREAM_MODULE, /* module type */ - NULL, /* init master */ - NULL, /* init module */ - NULL, /* init process */ - NULL, /* init thread */ - NULL, /* exit thread */ - NULL, /* exit process */ - NULL, /* exit master */ - NGX_MODULE_V1_PADDING -}; - - -static ngx_int_t -ngx_stream_log_handler(ngx_stream_session_t *s) -{ - u_char *line, *p; - size_t len, size; - ssize_t n; - ngx_str_t val; - ngx_uint_t i, l; - ngx_stream_log_t *log; - ngx_stream_log_op_t *op; - ngx_stream_log_buf_t *buffer; - ngx_stream_log_srv_conf_t *lscf; - - ngx_log_debug0(NGX_LOG_DEBUG_STREAM, s->connection->log, 0, - "stream log handler"); - - lscf = ngx_stream_get_module_srv_conf(s, ngx_stream_log_module); - - if (lscf->off || lscf->logs == NULL) { - return NGX_OK; - } - - log = lscf->logs->elts; - for (l = 0; l < lscf->logs->nelts; l++) { - - if (log[l].filter) { - if (ngx_stream_complex_value(s, log[l].filter, &val) != NGX_OK) { - return NGX_ERROR; - } - - if (val.len == 0 || (val.len == 1 && val.data[0] == '0')) { - continue; - } - } - - if (ngx_time() == log[l].disk_full_time) { - - /* - * on FreeBSD writing to a full filesystem with enabled softupdates - * may block process for much longer time than writing to non-full - * filesystem, so we skip writing to a log for one second - */ - - continue; - } - - ngx_stream_script_flush_no_cacheable_variables(s, - log[l].format->flushes); - - len = 0; - op = log[l].format->ops->elts; - for (i = 0; i < log[l].format->ops->nelts; i++) { - if (op[i].len == 0) { - len += op[i].getlen(s, op[i].data); - - } else { - len += op[i].len; - } - } - - if (log[l].syslog_peer) { - - /* length of syslog's PRI and HEADER message parts */ - len += sizeof("<255>Jan 01 00:00:00 ") - 1 - + ngx_cycle->hostname.len + 1 - + log[l].syslog_peer->tag.len + 2; - - goto alloc_line; - } - - len += NGX_LINEFEED_SIZE; - - buffer = log[l].file ? log[l].file->data : NULL; - - if (buffer) { - - if (len > (size_t) (buffer->last - buffer->pos)) { - - ngx_stream_log_write(s, &log[l], buffer->start, - buffer->pos - buffer->start); - - buffer->pos = buffer->start; - } - - if (len <= (size_t) (buffer->last - buffer->pos)) { - - p = buffer->pos; - - if (buffer->event && p == buffer->start) { - ngx_add_timer(buffer->event, buffer->flush); - } - - for (i = 0; i < log[l].format->ops->nelts; i++) { - p = op[i].run(s, p, &op[i]); - } - - ngx_linefeed(p); - - buffer->pos = p; - - continue; - } - - if (buffer->event && buffer->event->timer_set) { - ngx_del_timer(buffer->event); - } - } - - alloc_line: - - line = ngx_pnalloc(s->connection->pool, len); - if (line == NULL) { - return NGX_ERROR; - } - - p = line; - - if (log[l].syslog_peer) { - p = ngx_syslog_add_header(log[l].syslog_peer, line); - } - - for (i = 0; i < log[l].format->ops->nelts; i++) { - p = op[i].run(s, p, &op[i]); - } - - if (log[l].syslog_peer) { - - size = p - line; - - n = ngx_syslog_send(log[l].syslog_peer, line, size); - - if (n < 0) { - ngx_log_error(NGX_LOG_WARN, s->connection->log, 0, - "send() to syslog failed"); - - } else if ((size_t) n != size) { - ngx_log_error(NGX_LOG_WARN, s->connection->log, 0, - "send() to syslog has written only %z of %uz", - n, size); - } - - continue; - } - - ngx_linefeed(p); - - ngx_stream_log_write(s, &log[l], line, p - line); - } - - return NGX_OK; -} - - -static void -ngx_stream_log_write(ngx_stream_session_t *s, ngx_stream_log_t *log, - u_char *buf, size_t len) -{ - u_char *name; - time_t now; - ssize_t n; - ngx_err_t err; -#if (NGX_ZLIB) - ngx_stream_log_buf_t *buffer; -#endif - - if (log->script == NULL) { - name = log->file->name.data; - -#if (NGX_ZLIB) - buffer = log->file->data; - - if (buffer && buffer->gzip) { - n = ngx_stream_log_gzip(log->file->fd, buf, len, buffer->gzip, - s->connection->log); - } else { - n = ngx_write_fd(log->file->fd, buf, len); - } -#else - n = ngx_write_fd(log->file->fd, buf, len); -#endif - - } else { - name = NULL; - n = ngx_stream_log_script_write(s, log->script, &name, buf, len); - } - - if (n == (ssize_t) len) { - return; - } - - now = ngx_time(); - - if (n == -1) { - err = ngx_errno; - - if (err == NGX_ENOSPC) { - log->disk_full_time = now; - } - - if (now - log->error_log_time > 59) { - ngx_log_error(NGX_LOG_ALERT, s->connection->log, err, - ngx_write_fd_n " to \"%s\" failed", name); - - log->error_log_time = now; - } - - return; - } - - if (now - log->error_log_time > 59) { - ngx_log_error(NGX_LOG_ALERT, s->connection->log, 0, - ngx_write_fd_n " to \"%s\" was incomplete: %z of %uz", - name, n, len); - - log->error_log_time = now; - } -} - - -static ssize_t -ngx_stream_log_script_write(ngx_stream_session_t *s, - ngx_stream_log_script_t *script, u_char **name, u_char *buf, size_t len) -{ - ssize_t n; - ngx_str_t log; - ngx_open_file_info_t of; - ngx_stream_log_srv_conf_t *lscf; - - if (ngx_stream_script_run(s, &log, script->lengths->elts, 1, - script->values->elts) - == NULL) - { - /* simulate successful logging */ - return len; - } - - log.data[log.len - 1] = '\0'; - *name = log.data; - - ngx_log_debug1(NGX_LOG_DEBUG_STREAM, s->connection->log, 0, - "stream log \"%s\"", log.data); - - lscf = ngx_stream_get_module_srv_conf(s, ngx_stream_log_module); - - ngx_memzero(&of, sizeof(ngx_open_file_info_t)); - - of.log = 1; - of.valid = lscf->open_file_cache_valid; - of.min_uses = lscf->open_file_cache_min_uses; - of.directio = NGX_OPEN_FILE_DIRECTIO_OFF; - - if (ngx_open_cached_file(lscf->open_file_cache, &log, &of, - s->connection->pool) - != NGX_OK) - { - if (of.err == 0) { - /* simulate successful logging */ - return len; - } - - ngx_log_error(NGX_LOG_CRIT, s->connection->log, ngx_errno, - "%s \"%s\" failed", of.failed, log.data); - /* simulate successful logging */ - return len; - } - - ngx_log_debug1(NGX_LOG_DEBUG_STREAM, s->connection->log, 0, - "stream log #%d", of.fd); - - n = ngx_write_fd(of.fd, buf, len); - - return n; -} - - -#if (NGX_ZLIB) - -static ssize_t -ngx_stream_log_gzip(ngx_fd_t fd, u_char *buf, size_t len, ngx_int_t level, - ngx_log_t *log) -{ - int rc, wbits, memlevel; - u_char *out; - size_t size; - ssize_t n; - z_stream zstream; - ngx_err_t err; - ngx_pool_t *pool; - - wbits = MAX_WBITS; - memlevel = MAX_MEM_LEVEL - 1; - - while ((ssize_t) len < ((1 << (wbits - 1)) - 262)) { - wbits--; - memlevel--; - } - - /* - * This is a formula from deflateBound() for conservative upper bound of - * compressed data plus 18 bytes of gzip wrapper. - */ - - size = len + ((len + 7) >> 3) + ((len + 63) >> 6) + 5 + 18; - - ngx_memzero(&zstream, sizeof(z_stream)); - - pool = ngx_create_pool(256, log); - if (pool == NULL) { - /* simulate successful logging */ - return len; - } - - pool->log = log; - - zstream.zalloc = ngx_stream_log_gzip_alloc; - zstream.zfree = ngx_stream_log_gzip_free; - zstream.opaque = pool; - - out = ngx_pnalloc(pool, size); - if (out == NULL) { - goto done; - } - - zstream.next_in = buf; - zstream.avail_in = len; - zstream.next_out = out; - zstream.avail_out = size; - - rc = deflateInit2(&zstream, (int) level, Z_DEFLATED, wbits + 16, memlevel, - Z_DEFAULT_STRATEGY); - - if (rc != Z_OK) { - ngx_log_error(NGX_LOG_ALERT, log, 0, "deflateInit2() failed: %d", rc); - goto done; - } - - ngx_log_debug4(NGX_LOG_DEBUG_STREAM, log, 0, - "deflate in: ni:%p no:%p ai:%ud ao:%ud", - zstream.next_in, zstream.next_out, - zstream.avail_in, zstream.avail_out); - - rc = deflate(&zstream, Z_FINISH); - - if (rc != Z_STREAM_END) { - ngx_log_error(NGX_LOG_ALERT, log, 0, - "deflate(Z_FINISH) failed: %d", rc); - goto done; - } - - ngx_log_debug5(NGX_LOG_DEBUG_STREAM, log, 0, - "deflate out: ni:%p no:%p ai:%ud ao:%ud rc:%d", - zstream.next_in, zstream.next_out, - zstream.avail_in, zstream.avail_out, - rc); - - size -= zstream.avail_out; - - rc = deflateEnd(&zstream); - - if (rc != Z_OK) { - ngx_log_error(NGX_LOG_ALERT, log, 0, "deflateEnd() failed: %d", rc); - goto done; - } - - n = ngx_write_fd(fd, out, size); - - if (n != (ssize_t) size) { - err = (n == -1) ? ngx_errno : 0; - - ngx_destroy_pool(pool); - - ngx_set_errno(err); - return -1; - } - -done: - - ngx_destroy_pool(pool); - - /* simulate successful logging */ - return len; -} - - -static void * -ngx_stream_log_gzip_alloc(void *opaque, u_int items, u_int size) -{ - ngx_pool_t *pool = opaque; - - ngx_log_debug2(NGX_LOG_DEBUG_STREAM, pool->log, 0, - "gzip alloc: n:%ud s:%ud", items, size); - - return ngx_palloc(pool, items * size); -} - - -static void -ngx_stream_log_gzip_free(void *opaque, void *address) -{ -#if 0 - ngx_pool_t *pool = opaque; - - ngx_log_debug1(NGX_LOG_DEBUG_STREAM, pool->log, 0, - "gzip free: %p", address); -#endif -} - -#endif - - -static void -ngx_stream_log_flush(ngx_open_file_t *file, ngx_log_t *log) -{ - size_t len; - ssize_t n; - ngx_stream_log_buf_t *buffer; - - buffer = file->data; - - len = buffer->pos - buffer->start; - - if (len == 0) { - return; - } - -#if (NGX_ZLIB) - if (buffer->gzip) { - n = ngx_stream_log_gzip(file->fd, buffer->start, len, buffer->gzip, - log); - } else { - n = ngx_write_fd(file->fd, buffer->start, len); - } -#else - n = ngx_write_fd(file->fd, buffer->start, len); -#endif - - if (n == -1) { - ngx_log_error(NGX_LOG_ALERT, log, ngx_errno, - ngx_write_fd_n " to \"%s\" failed", - file->name.data); - - } else if ((size_t) n != len) { - ngx_log_error(NGX_LOG_ALERT, log, 0, - ngx_write_fd_n " to \"%s\" was incomplete: %z of %uz", - file->name.data, n, len); - } - - buffer->pos = buffer->start; - - if (buffer->event && buffer->event->timer_set) { - ngx_del_timer(buffer->event); - } -} - - -static void -ngx_stream_log_flush_handler(ngx_event_t *ev) -{ - ngx_log_debug0(NGX_LOG_DEBUG_EVENT, ev->log, 0, - "stream log buffer flush handler"); - - ngx_stream_log_flush(ev->data, ev->log); -} - - -static u_char * -ngx_stream_log_copy_short(ngx_stream_session_t *s, u_char *buf, - ngx_stream_log_op_t *op) -{ - size_t len; - uintptr_t data; - - len = op->len; - data = op->data; - - while (len--) { - *buf++ = (u_char) (data & 0xff); - data >>= 8; - } - - return buf; -} - - -static u_char * -ngx_stream_log_copy_long(ngx_stream_session_t *s, u_char *buf, - ngx_stream_log_op_t *op) -{ - return ngx_cpymem(buf, (u_char *) op->data, op->len); -} - - -static ngx_int_t -ngx_stream_log_variable_compile(ngx_conf_t *cf, ngx_stream_log_op_t *op, - ngx_str_t *value, ngx_uint_t escape) -{ - ngx_int_t index; - - index = ngx_stream_get_variable_index(cf, value); - if (index == NGX_ERROR) { - return NGX_ERROR; - } - - op->len = 0; - - switch (escape) { - case NGX_STREAM_LOG_ESCAPE_JSON: - op->getlen = ngx_stream_log_json_variable_getlen; - op->run = ngx_stream_log_json_variable; - break; - - case NGX_STREAM_LOG_ESCAPE_NONE: - op->getlen = ngx_stream_log_unescaped_variable_getlen; - op->run = ngx_stream_log_unescaped_variable; - break; - - default: /* NGX_STREAM_LOG_ESCAPE_DEFAULT */ - op->getlen = ngx_stream_log_variable_getlen; - op->run = ngx_stream_log_variable; - } - - op->data = index; - - return NGX_OK; -} - - -static size_t -ngx_stream_log_variable_getlen(ngx_stream_session_t *s, uintptr_t data) -{ - uintptr_t len; - ngx_stream_variable_value_t *value; - - value = ngx_stream_get_indexed_variable(s, data); - - if (value == NULL || value->not_found) { - return 1; - } - - len = ngx_stream_log_escape(NULL, value->data, value->len); - - value->escape = len ? 1 : 0; - - return value->len + len * 3; -} - - -static u_char * -ngx_stream_log_variable(ngx_stream_session_t *s, u_char *buf, - ngx_stream_log_op_t *op) -{ - ngx_stream_variable_value_t *value; - - value = ngx_stream_get_indexed_variable(s, op->data); - - if (value == NULL || value->not_found) { - *buf = '-'; - return buf + 1; - } - - if (value->escape == 0) { - return ngx_cpymem(buf, value->data, value->len); - - } else { - return (u_char *) ngx_stream_log_escape(buf, value->data, value->len); - } -} - - -static uintptr_t -ngx_stream_log_escape(u_char *dst, u_char *src, size_t size) -{ - ngx_uint_t n; - static u_char hex[] = "0123456789ABCDEF"; - - static uint32_t escape[] = { - 0xffffffff, /* 1111 1111 1111 1111 1111 1111 1111 1111 */ - - /* ?>=< ;:98 7654 3210 /.-, +*)( '&%$ #"! */ - 0x00000004, /* 0000 0000 0000 0000 0000 0000 0000 0100 */ - - /* _^]\ [ZYX WVUT SRQP ONML KJIH GFED CBA@ */ - 0x10000000, /* 0001 0000 0000 0000 0000 0000 0000 0000 */ - - /* ~}| {zyx wvut srqp onml kjih gfed cba` */ - 0x80000000, /* 1000 0000 0000 0000 0000 0000 0000 0000 */ - - 0xffffffff, /* 1111 1111 1111 1111 1111 1111 1111 1111 */ - 0xffffffff, /* 1111 1111 1111 1111 1111 1111 1111 1111 */ - 0xffffffff, /* 1111 1111 1111 1111 1111 1111 1111 1111 */ - 0xffffffff, /* 1111 1111 1111 1111 1111 1111 1111 1111 */ - }; - - - if (dst == NULL) { - - /* find the number of the characters to be escaped */ - - n = 0; - - while (size) { - if (escape[*src >> 5] & (1U << (*src & 0x1f))) { - n++; - } - src++; - size--; - } - - return (uintptr_t) n; - } - - while (size) { - if (escape[*src >> 5] & (1U << (*src & 0x1f))) { - *dst++ = '\\'; - *dst++ = 'x'; - *dst++ = hex[*src >> 4]; - *dst++ = hex[*src & 0xf]; - src++; - - } else { - *dst++ = *src++; - } - size--; - } - - return (uintptr_t) dst; -} - - -static size_t -ngx_stream_log_json_variable_getlen(ngx_stream_session_t *s, uintptr_t data) -{ - uintptr_t len; - ngx_stream_variable_value_t *value; - - value = ngx_stream_get_indexed_variable(s, data); - - if (value == NULL || value->not_found) { - return 0; - } - - len = ngx_escape_json(NULL, value->data, value->len); - - value->escape = len ? 1 : 0; - - return value->len + len; -} - - -static u_char * -ngx_stream_log_json_variable(ngx_stream_session_t *s, u_char *buf, - ngx_stream_log_op_t *op) -{ - ngx_stream_variable_value_t *value; - - value = ngx_stream_get_indexed_variable(s, op->data); - - if (value == NULL || value->not_found) { - return buf; - } - - if (value->escape == 0) { - return ngx_cpymem(buf, value->data, value->len); - - } else { - return (u_char *) ngx_escape_json(buf, value->data, value->len); - } -} - - -static size_t -ngx_stream_log_unescaped_variable_getlen(ngx_stream_session_t *s, - uintptr_t data) -{ - ngx_stream_variable_value_t *value; - - value = ngx_stream_get_indexed_variable(s, data); - - if (value == NULL || value->not_found) { - return 0; - } - - value->escape = 0; - - return value->len; -} - - -static u_char * -ngx_stream_log_unescaped_variable(ngx_stream_session_t *s, u_char *buf, - ngx_stream_log_op_t *op) -{ - ngx_stream_variable_value_t *value; - - value = ngx_stream_get_indexed_variable(s, op->data); - - if (value == NULL || value->not_found) { - return buf; - } - - return ngx_cpymem(buf, value->data, value->len); -} - - -static void * -ngx_stream_log_create_main_conf(ngx_conf_t *cf) -{ - ngx_stream_log_main_conf_t *conf; - - conf = ngx_pcalloc(cf->pool, sizeof(ngx_stream_log_main_conf_t)); - if (conf == NULL) { - return NULL; - } - - if (ngx_array_init(&conf->formats, cf->pool, 4, - sizeof(ngx_stream_log_fmt_t)) - != NGX_OK) - { - return NULL; - } - - return conf; -} - - -static void * -ngx_stream_log_create_srv_conf(ngx_conf_t *cf) -{ - ngx_stream_log_srv_conf_t *conf; - - conf = ngx_pcalloc(cf->pool, sizeof(ngx_stream_log_srv_conf_t)); - if (conf == NULL) { - return NULL; - } - - conf->open_file_cache = NGX_CONF_UNSET_PTR; - - return conf; -} - - -static char * -ngx_stream_log_merge_srv_conf(ngx_conf_t *cf, void *parent, void *child) -{ - ngx_stream_log_srv_conf_t *prev = parent; - ngx_stream_log_srv_conf_t *conf = child; - - if (conf->open_file_cache == NGX_CONF_UNSET_PTR) { - - conf->open_file_cache = prev->open_file_cache; - conf->open_file_cache_valid = prev->open_file_cache_valid; - conf->open_file_cache_min_uses = prev->open_file_cache_min_uses; - - if (conf->open_file_cache == NGX_CONF_UNSET_PTR) { - conf->open_file_cache = NULL; - } - } - - if (conf->logs || conf->off) { - return NGX_CONF_OK; - } - - conf->logs = prev->logs; - conf->off = prev->off; - - return NGX_CONF_OK; -} - - -static char * -ngx_stream_log_set_log(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) -{ - ngx_stream_log_srv_conf_t *lscf = conf; - - ssize_t size; - ngx_int_t gzip; - ngx_uint_t i, n; - ngx_msec_t flush; - ngx_str_t *value, name, s; - ngx_stream_log_t *log; - ngx_syslog_peer_t *peer; - ngx_stream_log_buf_t *buffer; - ngx_stream_log_fmt_t *fmt; - ngx_stream_script_compile_t sc; - ngx_stream_log_main_conf_t *lmcf; - ngx_stream_compile_complex_value_t ccv; - - value = cf->args->elts; - - if (ngx_strcmp(value[1].data, "off") == 0) { - lscf->off = 1; - if (cf->args->nelts == 2) { - return NGX_CONF_OK; - } - - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "invalid parameter \"%V\"", &value[2]); - return NGX_CONF_ERROR; - } - - if (lscf->logs == NULL) { - lscf->logs = ngx_array_create(cf->pool, 2, sizeof(ngx_stream_log_t)); - if (lscf->logs == NULL) { - return NGX_CONF_ERROR; - } - } - - lmcf = ngx_stream_conf_get_module_main_conf(cf, ngx_stream_log_module); - - log = ngx_array_push(lscf->logs); - if (log == NULL) { - return NGX_CONF_ERROR; - } - - ngx_memzero(log, sizeof(ngx_stream_log_t)); - - - if (ngx_strncmp(value[1].data, "syslog:", 7) == 0) { - - peer = ngx_pcalloc(cf->pool, sizeof(ngx_syslog_peer_t)); - if (peer == NULL) { - return NGX_CONF_ERROR; - } - - if (ngx_syslog_process_conf(cf, peer) != NGX_CONF_OK) { - return NGX_CONF_ERROR; - } - - log->syslog_peer = peer; - - goto process_formats; - } - - n = ngx_stream_script_variables_count(&value[1]); - - if (n == 0) { - log->file = ngx_conf_open_file(cf->cycle, &value[1]); - if (log->file == NULL) { - return NGX_CONF_ERROR; - } - - } else { - if (ngx_conf_full_name(cf->cycle, &value[1], 0) != NGX_OK) { - return NGX_CONF_ERROR; - } - - log->script = ngx_pcalloc(cf->pool, sizeof(ngx_stream_log_script_t)); - if (log->script == NULL) { - return NGX_CONF_ERROR; - } - - ngx_memzero(&sc, sizeof(ngx_stream_script_compile_t)); - - sc.cf = cf; - sc.source = &value[1]; - sc.lengths = &log->script->lengths; - sc.values = &log->script->values; - sc.variables = n; - sc.complete_lengths = 1; - sc.complete_values = 1; - - if (ngx_stream_script_compile(&sc) != NGX_OK) { - return NGX_CONF_ERROR; - } - } - -process_formats: - - if (cf->args->nelts >= 3) { - name = value[2]; - - } else { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "log format is not specified"); - return NGX_CONF_ERROR; - } - - fmt = lmcf->formats.elts; - for (i = 0; i < lmcf->formats.nelts; i++) { - if (fmt[i].name.len == name.len - && ngx_strcasecmp(fmt[i].name.data, name.data) == 0) - { - log->format = &fmt[i]; - break; - } - } - - if (log->format == NULL) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "unknown log format \"%V\"", &name); - return NGX_CONF_ERROR; - } - - size = 0; - flush = 0; - gzip = 0; - - for (i = 3; i < cf->args->nelts; i++) { - - if (ngx_strncmp(value[i].data, "buffer=", 7) == 0) { - s.len = value[i].len - 7; - s.data = value[i].data + 7; - - size = ngx_parse_size(&s); - - if (size == NGX_ERROR || size == 0) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "invalid buffer size \"%V\"", &s); - return NGX_CONF_ERROR; - } - - continue; - } - - if (ngx_strncmp(value[i].data, "flush=", 6) == 0) { - s.len = value[i].len - 6; - s.data = value[i].data + 6; - - flush = ngx_parse_time(&s, 0); - - if (flush == (ngx_msec_t) NGX_ERROR || flush == 0) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "invalid flush time \"%V\"", &s); - return NGX_CONF_ERROR; - } - - continue; - } - - if (ngx_strncmp(value[i].data, "gzip", 4) == 0 - && (value[i].len == 4 || value[i].data[4] == '=')) - { -#if (NGX_ZLIB) - if (size == 0) { - size = 64 * 1024; - } - - if (value[i].len == 4) { - gzip = Z_BEST_SPEED; - continue; - } - - s.len = value[i].len - 5; - s.data = value[i].data + 5; - - gzip = ngx_atoi(s.data, s.len); - - if (gzip < 1 || gzip > 9) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "invalid compression level \"%V\"", &s); - return NGX_CONF_ERROR; - } - - continue; - -#else - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "nginx was built without zlib support"); - return NGX_CONF_ERROR; -#endif - } - - if (ngx_strncmp(value[i].data, "if=", 3) == 0) { - s.len = value[i].len - 3; - s.data = value[i].data + 3; - - ngx_memzero(&ccv, sizeof(ngx_stream_compile_complex_value_t)); - - ccv.cf = cf; - ccv.value = &s; - ccv.complex_value = ngx_palloc(cf->pool, - sizeof(ngx_stream_complex_value_t)); - if (ccv.complex_value == NULL) { - return NGX_CONF_ERROR; - } - - if (ngx_stream_compile_complex_value(&ccv) != NGX_OK) { - return NGX_CONF_ERROR; - } - - log->filter = ccv.complex_value; - - continue; - } - - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "invalid parameter \"%V\"", &value[i]); - return NGX_CONF_ERROR; - } - - if (flush && size == 0) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "no buffer is defined for access_log \"%V\"", - &value[1]); - return NGX_CONF_ERROR; - } - - if (size) { - - if (log->script) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "buffered logs cannot have variables in name"); - return NGX_CONF_ERROR; - } - - if (log->syslog_peer) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "logs to syslog cannot be buffered"); - return NGX_CONF_ERROR; - } - - if (log->file->data) { - buffer = log->file->data; - - if (buffer->last - buffer->start != size - || buffer->flush != flush - || buffer->gzip != gzip) - { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "access_log \"%V\" already defined " - "with conflicting parameters", - &value[1]); - return NGX_CONF_ERROR; - } - - return NGX_CONF_OK; - } - - buffer = ngx_pcalloc(cf->pool, sizeof(ngx_stream_log_buf_t)); - if (buffer == NULL) { - return NGX_CONF_ERROR; - } - - buffer->start = ngx_pnalloc(cf->pool, size); - if (buffer->start == NULL) { - return NGX_CONF_ERROR; - } - - buffer->pos = buffer->start; - buffer->last = buffer->start + size; - - if (flush) { - buffer->event = ngx_pcalloc(cf->pool, sizeof(ngx_event_t)); - if (buffer->event == NULL) { - return NGX_CONF_ERROR; - } - - buffer->event->data = log->file; - buffer->event->handler = ngx_stream_log_flush_handler; - buffer->event->log = &cf->cycle->new_log; - buffer->event->cancelable = 1; - - buffer->flush = flush; - } - - buffer->gzip = gzip; - - log->file->flush = ngx_stream_log_flush; - log->file->data = buffer; - } - - return NGX_CONF_OK; -} - - -static char * -ngx_stream_log_set_format(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) -{ - ngx_stream_log_main_conf_t *lmcf = conf; - - ngx_str_t *value; - ngx_uint_t i; - ngx_stream_log_fmt_t *fmt; - - value = cf->args->elts; - - fmt = lmcf->formats.elts; - for (i = 0; i < lmcf->formats.nelts; i++) { - if (fmt[i].name.len == value[1].len - && ngx_strcmp(fmt[i].name.data, value[1].data) == 0) - { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "duplicate \"log_format\" name \"%V\"", - &value[1]); - return NGX_CONF_ERROR; - } - } - - fmt = ngx_array_push(&lmcf->formats); - if (fmt == NULL) { - return NGX_CONF_ERROR; - } - - fmt->name = value[1]; - - fmt->flushes = ngx_array_create(cf->pool, 4, sizeof(ngx_int_t)); - if (fmt->flushes == NULL) { - return NGX_CONF_ERROR; - } - - fmt->ops = ngx_array_create(cf->pool, 16, sizeof(ngx_stream_log_op_t)); - if (fmt->ops == NULL) { - return NGX_CONF_ERROR; - } - - return ngx_stream_log_compile_format(cf, fmt->flushes, fmt->ops, - cf->args, 2); -} - - -static char * -ngx_stream_log_compile_format(ngx_conf_t *cf, ngx_array_t *flushes, - ngx_array_t *ops, ngx_array_t *args, ngx_uint_t s) -{ - u_char *data, *p, ch; - size_t i, len; - ngx_str_t *value, var; - ngx_int_t *flush; - ngx_uint_t bracket, escape; - ngx_stream_log_op_t *op; - - escape = NGX_STREAM_LOG_ESCAPE_DEFAULT; - value = args->elts; - - if (s < args->nelts && ngx_strncmp(value[s].data, "escape=", 7) == 0) { - data = value[s].data + 7; - - if (ngx_strcmp(data, "json") == 0) { - escape = NGX_STREAM_LOG_ESCAPE_JSON; - - } else if (ngx_strcmp(data, "none") == 0) { - escape = NGX_STREAM_LOG_ESCAPE_NONE; - - } else if (ngx_strcmp(data, "default") != 0) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "unknown log format escaping \"%s\"", data); - return NGX_CONF_ERROR; - } - - s++; - } - - for ( /* void */ ; s < args->nelts; s++) { - - i = 0; - - while (i < value[s].len) { - - op = ngx_array_push(ops); - if (op == NULL) { - return NGX_CONF_ERROR; - } - - data = &value[s].data[i]; - - if (value[s].data[i] == '$') { - - if (++i == value[s].len) { - goto invalid; - } - - if (value[s].data[i] == '{') { - bracket = 1; - - if (++i == value[s].len) { - goto invalid; - } - - var.data = &value[s].data[i]; - - } else { - bracket = 0; - var.data = &value[s].data[i]; - } - - for (var.len = 0; i < value[s].len; i++, var.len++) { - ch = value[s].data[i]; - - if (ch == '}' && bracket) { - i++; - bracket = 0; - break; - } - - if ((ch >= 'A' && ch <= 'Z') - || (ch >= 'a' && ch <= 'z') - || (ch >= '0' && ch <= '9') - || ch == '_') - { - continue; - } - - break; - } - - if (bracket) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "the closing bracket in \"%V\" " - "variable is missing", &var); - return NGX_CONF_ERROR; - } - - if (var.len == 0) { - goto invalid; - } - - if (ngx_stream_log_variable_compile(cf, op, &var, escape) - != NGX_OK) - { - return NGX_CONF_ERROR; - } - - if (flushes) { - - flush = ngx_array_push(flushes); - if (flush == NULL) { - return NGX_CONF_ERROR; - } - - *flush = op->data; /* variable index */ - } - - continue; - } - - i++; - - while (i < value[s].len && value[s].data[i] != '$') { - i++; - } - - len = &value[s].data[i] - data; - - if (len) { - - op->len = len; - op->getlen = NULL; - - if (len <= sizeof(uintptr_t)) { - op->run = ngx_stream_log_copy_short; - op->data = 0; - - while (len--) { - op->data <<= 8; - op->data |= data[len]; - } - - } else { - op->run = ngx_stream_log_copy_long; - - p = ngx_pnalloc(cf->pool, len); - if (p == NULL) { - return NGX_CONF_ERROR; - } - - ngx_memcpy(p, data, len); - op->data = (uintptr_t) p; - } - } - } - } - - return NGX_CONF_OK; - -invalid: - - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, "invalid parameter \"%s\"", data); - - return NGX_CONF_ERROR; -} - - -static char * -ngx_stream_log_open_file_cache(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) -{ - ngx_stream_log_srv_conf_t *lscf = conf; - - time_t inactive, valid; - ngx_str_t *value, s; - ngx_int_t max, min_uses; - ngx_uint_t i; - - if (lscf->open_file_cache != NGX_CONF_UNSET_PTR) { - return "is duplicate"; - } - - value = cf->args->elts; - - max = 0; - inactive = 10; - valid = 60; - min_uses = 1; - - for (i = 1; i < cf->args->nelts; i++) { - - if (ngx_strncmp(value[i].data, "max=", 4) == 0) { - - max = ngx_atoi(value[i].data + 4, value[i].len - 4); - if (max == NGX_ERROR) { - goto failed; - } - - continue; - } - - if (ngx_strncmp(value[i].data, "inactive=", 9) == 0) { - - s.len = value[i].len - 9; - s.data = value[i].data + 9; - - inactive = ngx_parse_time(&s, 1); - if (inactive == (time_t) NGX_ERROR) { - goto failed; - } - - continue; - } - - if (ngx_strncmp(value[i].data, "min_uses=", 9) == 0) { - - min_uses = ngx_atoi(value[i].data + 9, value[i].len - 9); - if (min_uses == NGX_ERROR) { - goto failed; - } - - continue; - } - - if (ngx_strncmp(value[i].data, "valid=", 6) == 0) { - - s.len = value[i].len - 6; - s.data = value[i].data + 6; - - valid = ngx_parse_time(&s, 1); - if (valid == (time_t) NGX_ERROR) { - goto failed; - } - - continue; - } - - if (ngx_strcmp(value[i].data, "off") == 0) { - - lscf->open_file_cache = NULL; - - continue; - } - - failed: - - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "invalid \"open_log_file_cache\" parameter \"%V\"", - &value[i]); - return NGX_CONF_ERROR; - } - - if (lscf->open_file_cache == NULL) { - return NGX_CONF_OK; - } - - if (max == 0) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "\"open_log_file_cache\" must have \"max\" parameter"); - return NGX_CONF_ERROR; - } - - lscf->open_file_cache = ngx_open_file_cache_init(cf->pool, max, inactive); - - if (lscf->open_file_cache) { - - lscf->open_file_cache_valid = valid; - lscf->open_file_cache_min_uses = min_uses; - - return NGX_CONF_OK; - } - - return NGX_CONF_ERROR; -} - - -static ngx_int_t -ngx_stream_log_init(ngx_conf_t *cf) -{ - ngx_stream_handler_pt *h; - ngx_stream_core_main_conf_t *cmcf; - - cmcf = ngx_stream_conf_get_module_main_conf(cf, ngx_stream_core_module); - - h = ngx_array_push(&cmcf->phases[NGX_STREAM_LOG_PHASE].handlers); - if (h == NULL) { - return NGX_ERROR; - } - - *h = ngx_stream_log_handler; - - return NGX_OK; -} diff --git a/src/deps/src/nginx-1.30.3/src/stream/ngx_stream_map_module.c b/src/deps/src/nginx-1.30.3/src/stream/ngx_stream_map_module.c deleted file mode 100644 index ef06b2de87..0000000000 --- a/src/deps/src/nginx-1.30.3/src/stream/ngx_stream_map_module.c +++ /dev/null @@ -1,588 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#include -#include -#include - - -typedef struct { - ngx_uint_t hash_max_size; - ngx_uint_t hash_bucket_size; -} ngx_stream_map_conf_t; - - -typedef struct { - ngx_hash_keys_arrays_t keys; - - ngx_array_t *values_hash; -#if (NGX_PCRE) - ngx_array_t regexes; -#endif - - ngx_stream_variable_value_t *default_value; - ngx_conf_t *cf; - unsigned hostnames:1; - unsigned no_cacheable:1; -} ngx_stream_map_conf_ctx_t; - - -typedef struct { - ngx_stream_map_t map; - ngx_stream_complex_value_t value; - ngx_stream_variable_value_t *default_value; - ngx_uint_t hostnames; /* unsigned hostnames:1 */ -} ngx_stream_map_ctx_t; - - -static int ngx_libc_cdecl ngx_stream_map_cmp_dns_wildcards(const void *one, - const void *two); -static void *ngx_stream_map_create_conf(ngx_conf_t *cf); -static char *ngx_stream_map_block(ngx_conf_t *cf, ngx_command_t *cmd, - void *conf); -static char *ngx_stream_map(ngx_conf_t *cf, ngx_command_t *dummy, void *conf); - - -static ngx_command_t ngx_stream_map_commands[] = { - - { ngx_string("map"), - NGX_STREAM_MAIN_CONF|NGX_CONF_BLOCK|NGX_CONF_TAKE2, - ngx_stream_map_block, - NGX_STREAM_MAIN_CONF_OFFSET, - 0, - NULL }, - - { ngx_string("map_hash_max_size"), - NGX_STREAM_MAIN_CONF|NGX_CONF_TAKE1, - ngx_conf_set_num_slot, - NGX_STREAM_MAIN_CONF_OFFSET, - offsetof(ngx_stream_map_conf_t, hash_max_size), - NULL }, - - { ngx_string("map_hash_bucket_size"), - NGX_STREAM_MAIN_CONF|NGX_CONF_TAKE1, - ngx_conf_set_num_slot, - NGX_STREAM_MAIN_CONF_OFFSET, - offsetof(ngx_stream_map_conf_t, hash_bucket_size), - NULL }, - - ngx_null_command -}; - - -static ngx_stream_module_t ngx_stream_map_module_ctx = { - NULL, /* preconfiguration */ - NULL, /* postconfiguration */ - - ngx_stream_map_create_conf, /* create main configuration */ - NULL, /* init main configuration */ - - NULL, /* create server configuration */ - NULL /* merge server configuration */ -}; - - -ngx_module_t ngx_stream_map_module = { - NGX_MODULE_V1, - &ngx_stream_map_module_ctx, /* module context */ - ngx_stream_map_commands, /* module directives */ - NGX_STREAM_MODULE, /* module type */ - NULL, /* init master */ - NULL, /* init module */ - NULL, /* init process */ - NULL, /* init thread */ - NULL, /* exit thread */ - NULL, /* exit process */ - NULL, /* exit master */ - NGX_MODULE_V1_PADDING -}; - - -static ngx_int_t -ngx_stream_map_variable(ngx_stream_session_t *s, ngx_stream_variable_value_t *v, - uintptr_t data) -{ - ngx_stream_map_ctx_t *map = (ngx_stream_map_ctx_t *) data; - - ngx_str_t val, str; - ngx_stream_complex_value_t *cv; - ngx_stream_variable_value_t *value; - - ngx_log_debug0(NGX_LOG_DEBUG_STREAM, s->connection->log, 0, - "stream map started"); - - if (ngx_stream_complex_value(s, &map->value, &val) != NGX_OK) { - return NGX_ERROR; - } - - if (map->hostnames && val.len > 0 && val.data[val.len - 1] == '.') { - val.len--; - } - - value = ngx_stream_map_find(s, &map->map, &val); - - if (value == NULL) { - value = map->default_value; - } - - if (!value->valid) { - cv = (ngx_stream_complex_value_t *) value->data; - - if (ngx_stream_complex_value(s, cv, &str) != NGX_OK) { - return NGX_ERROR; - } - - v->valid = 1; - v->no_cacheable = 0; - v->not_found = 0; - v->len = str.len; - v->data = str.data; - - } else { - *v = *value; - } - - ngx_log_debug2(NGX_LOG_DEBUG_STREAM, s->connection->log, 0, - "stream map: \"%V\" \"%v\"", &val, v); - - return NGX_OK; -} - - -static void * -ngx_stream_map_create_conf(ngx_conf_t *cf) -{ - ngx_stream_map_conf_t *mcf; - - mcf = ngx_palloc(cf->pool, sizeof(ngx_stream_map_conf_t)); - if (mcf == NULL) { - return NULL; - } - - mcf->hash_max_size = NGX_CONF_UNSET_UINT; - mcf->hash_bucket_size = NGX_CONF_UNSET_UINT; - - return mcf; -} - - -static char * -ngx_stream_map_block(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) -{ - ngx_stream_map_conf_t *mcf = conf; - - char *rv; - ngx_str_t *value, name; - ngx_conf_t save; - ngx_pool_t *pool; - ngx_hash_init_t hash; - ngx_stream_map_ctx_t *map; - ngx_stream_variable_t *var; - ngx_stream_map_conf_ctx_t ctx; - ngx_stream_compile_complex_value_t ccv; - - if (mcf->hash_max_size == NGX_CONF_UNSET_UINT) { - mcf->hash_max_size = 2048; - } - - if (mcf->hash_bucket_size == NGX_CONF_UNSET_UINT) { - mcf->hash_bucket_size = ngx_cacheline_size; - - } else { - mcf->hash_bucket_size = ngx_align(mcf->hash_bucket_size, - ngx_cacheline_size); - } - - map = ngx_pcalloc(cf->pool, sizeof(ngx_stream_map_ctx_t)); - if (map == NULL) { - return NGX_CONF_ERROR; - } - - value = cf->args->elts; - - ngx_memzero(&ccv, sizeof(ngx_stream_compile_complex_value_t)); - - ccv.cf = cf; - ccv.value = &value[1]; - ccv.complex_value = &map->value; - - if (ngx_stream_compile_complex_value(&ccv) != NGX_OK) { - return NGX_CONF_ERROR; - } - - name = value[2]; - - if (name.data[0] != '$') { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "invalid variable name \"%V\"", &name); - return NGX_CONF_ERROR; - } - - name.len--; - name.data++; - - var = ngx_stream_add_variable(cf, &name, NGX_STREAM_VAR_CHANGEABLE); - if (var == NULL) { - return NGX_CONF_ERROR; - } - - var->get_handler = ngx_stream_map_variable; - var->data = (uintptr_t) map; - - pool = ngx_create_pool(NGX_DEFAULT_POOL_SIZE, cf->log); - if (pool == NULL) { - return NGX_CONF_ERROR; - } - - ctx.keys.pool = cf->pool; - ctx.keys.temp_pool = pool; - - if (ngx_hash_keys_array_init(&ctx.keys, NGX_HASH_LARGE) != NGX_OK) { - ngx_destroy_pool(pool); - return NGX_CONF_ERROR; - } - - ctx.values_hash = ngx_pcalloc(pool, sizeof(ngx_array_t) * ctx.keys.hsize); - if (ctx.values_hash == NULL) { - ngx_destroy_pool(pool); - return NGX_CONF_ERROR; - } - -#if (NGX_PCRE) - if (ngx_array_init(&ctx.regexes, cf->pool, 2, - sizeof(ngx_stream_map_regex_t)) - != NGX_OK) - { - ngx_destroy_pool(pool); - return NGX_CONF_ERROR; - } -#endif - - ctx.default_value = NULL; - ctx.cf = &save; - ctx.hostnames = 0; - ctx.no_cacheable = 0; - - save = *cf; - cf->pool = pool; - cf->ctx = &ctx; - cf->handler = ngx_stream_map; - cf->handler_conf = conf; - - rv = ngx_conf_parse(cf, NULL); - - *cf = save; - - if (rv != NGX_CONF_OK) { - ngx_destroy_pool(pool); - return rv; - } - - if (ctx.no_cacheable) { - var->flags |= NGX_STREAM_VAR_NOCACHEABLE; - } - - map->default_value = ctx.default_value ? ctx.default_value: - &ngx_stream_variable_null_value; - - map->hostnames = ctx.hostnames; - - hash.key = ngx_hash_key_lc; - hash.max_size = mcf->hash_max_size; - hash.bucket_size = mcf->hash_bucket_size; - hash.name = "map_hash"; - hash.pool = cf->pool; - - if (ctx.keys.keys.nelts) { - hash.hash = &map->map.hash.hash; - hash.temp_pool = NULL; - - if (ngx_hash_init(&hash, ctx.keys.keys.elts, ctx.keys.keys.nelts) - != NGX_OK) - { - ngx_destroy_pool(pool); - return NGX_CONF_ERROR; - } - } - - if (ctx.keys.dns_wc_head.nelts) { - - ngx_qsort(ctx.keys.dns_wc_head.elts, - (size_t) ctx.keys.dns_wc_head.nelts, - sizeof(ngx_hash_key_t), ngx_stream_map_cmp_dns_wildcards); - - hash.hash = NULL; - hash.temp_pool = pool; - - if (ngx_hash_wildcard_init(&hash, ctx.keys.dns_wc_head.elts, - ctx.keys.dns_wc_head.nelts) - != NGX_OK) - { - ngx_destroy_pool(pool); - return NGX_CONF_ERROR; - } - - map->map.hash.wc_head = (ngx_hash_wildcard_t *) hash.hash; - } - - if (ctx.keys.dns_wc_tail.nelts) { - - ngx_qsort(ctx.keys.dns_wc_tail.elts, - (size_t) ctx.keys.dns_wc_tail.nelts, - sizeof(ngx_hash_key_t), ngx_stream_map_cmp_dns_wildcards); - - hash.hash = NULL; - hash.temp_pool = pool; - - if (ngx_hash_wildcard_init(&hash, ctx.keys.dns_wc_tail.elts, - ctx.keys.dns_wc_tail.nelts) - != NGX_OK) - { - ngx_destroy_pool(pool); - return NGX_CONF_ERROR; - } - - map->map.hash.wc_tail = (ngx_hash_wildcard_t *) hash.hash; - } - -#if (NGX_PCRE) - - if (ctx.regexes.nelts) { - map->map.regex = ctx.regexes.elts; - map->map.nregex = ctx.regexes.nelts; - } - -#endif - - ngx_destroy_pool(pool); - - return rv; -} - - -static int ngx_libc_cdecl -ngx_stream_map_cmp_dns_wildcards(const void *one, const void *two) -{ - ngx_hash_key_t *first, *second; - - first = (ngx_hash_key_t *) one; - second = (ngx_hash_key_t *) two; - - return ngx_dns_strcmp(first->key.data, second->key.data); -} - - -static char * -ngx_stream_map(ngx_conf_t *cf, ngx_command_t *dummy, void *conf) -{ - u_char *data; - size_t len; - ngx_int_t rv; - ngx_str_t *value, v; - ngx_uint_t i, key; - ngx_stream_map_conf_ctx_t *ctx; - ngx_stream_complex_value_t cv, *cvp; - ngx_stream_variable_value_t *var, **vp; - ngx_stream_compile_complex_value_t ccv; - - ctx = cf->ctx; - - value = cf->args->elts; - - if (cf->args->nelts == 1 - && ngx_strcmp(value[0].data, "hostnames") == 0) - { - ctx->hostnames = 1; - return NGX_CONF_OK; - } - - if (cf->args->nelts == 1 - && ngx_strcmp(value[0].data, "volatile") == 0) - { - ctx->no_cacheable = 1; - return NGX_CONF_OK; - } - - if (cf->args->nelts != 2) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "invalid number of the map parameters"); - return NGX_CONF_ERROR; - } - - if (ngx_strcmp(value[0].data, "include") == 0) { - return ngx_conf_include(cf, dummy, conf); - } - - key = 0; - - for (i = 0; i < value[1].len; i++) { - key = ngx_hash(key, value[1].data[i]); - } - - key %= ctx->keys.hsize; - - vp = ctx->values_hash[key].elts; - - if (vp) { - for (i = 0; i < ctx->values_hash[key].nelts; i++) { - - if (vp[i]->valid) { - data = vp[i]->data; - len = vp[i]->len; - - } else { - cvp = (ngx_stream_complex_value_t *) vp[i]->data; - data = cvp->value.data; - len = cvp->value.len; - } - - if (value[1].len != len) { - continue; - } - - if (ngx_strncmp(value[1].data, data, len) == 0) { - var = vp[i]; - goto found; - } - } - - } else { - if (ngx_array_init(&ctx->values_hash[key], cf->pool, 4, - sizeof(ngx_stream_variable_value_t *)) - != NGX_OK) - { - return NGX_CONF_ERROR; - } - } - - var = ngx_palloc(ctx->keys.pool, sizeof(ngx_stream_variable_value_t)); - if (var == NULL) { - return NGX_CONF_ERROR; - } - - v.len = value[1].len; - v.data = ngx_pstrdup(ctx->keys.pool, &value[1]); - if (v.data == NULL) { - return NGX_CONF_ERROR; - } - - ngx_memzero(&ccv, sizeof(ngx_stream_compile_complex_value_t)); - - ccv.cf = ctx->cf; - ccv.value = &v; - ccv.complex_value = &cv; - - if (ngx_stream_compile_complex_value(&ccv) != NGX_OK) { - return NGX_CONF_ERROR; - } - - if (cv.lengths != NULL) { - cvp = ngx_palloc(ctx->keys.pool, sizeof(ngx_stream_complex_value_t)); - if (cvp == NULL) { - return NGX_CONF_ERROR; - } - - *cvp = cv; - - var->len = 0; - var->data = (u_char *) cvp; - var->valid = 0; - - } else { - var->len = v.len; - var->data = v.data; - var->valid = 1; - } - - var->no_cacheable = 0; - var->not_found = 0; - - vp = ngx_array_push(&ctx->values_hash[key]); - if (vp == NULL) { - return NGX_CONF_ERROR; - } - - *vp = var; - -found: - - if (ngx_strcmp(value[0].data, "default") == 0) { - - if (ctx->default_value) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "duplicate default map parameter"); - return NGX_CONF_ERROR; - } - - ctx->default_value = var; - - return NGX_CONF_OK; - } - -#if (NGX_PCRE) - - if (value[0].len && value[0].data[0] == '~') { - ngx_regex_compile_t rc; - ngx_stream_map_regex_t *regex; - u_char errstr[NGX_MAX_CONF_ERRSTR]; - - regex = ngx_array_push(&ctx->regexes); - if (regex == NULL) { - return NGX_CONF_ERROR; - } - - value[0].len--; - value[0].data++; - - ngx_memzero(&rc, sizeof(ngx_regex_compile_t)); - - if (value[0].data[0] == '*') { - value[0].len--; - value[0].data++; - rc.options = NGX_REGEX_CASELESS; - } - - rc.pattern = value[0]; - rc.err.len = NGX_MAX_CONF_ERRSTR; - rc.err.data = errstr; - - regex->regex = ngx_stream_regex_compile(ctx->cf, &rc); - if (regex->regex == NULL) { - return NGX_CONF_ERROR; - } - - regex->value = var; - - return NGX_CONF_OK; - } - -#endif - - if (value[0].len && value[0].data[0] == '\\') { - value[0].len--; - value[0].data++; - } - - rv = ngx_hash_add_key(&ctx->keys, &value[0], var, - (ctx->hostnames) ? NGX_HASH_WILDCARD_KEY : 0); - - if (rv == NGX_OK) { - return NGX_CONF_OK; - } - - if (rv == NGX_DECLINED) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "invalid hostname or wildcard \"%V\"", &value[0]); - } - - if (rv == NGX_BUSY) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "conflicting parameter \"%V\"", &value[0]); - } - - return NGX_CONF_ERROR; -} diff --git a/src/deps/src/nginx-1.30.3/src/stream/ngx_stream_pass_module.c b/src/deps/src/nginx-1.30.3/src/stream/ngx_stream_pass_module.c deleted file mode 100644 index 1d671087c3..0000000000 --- a/src/deps/src/nginx-1.30.3/src/stream/ngx_stream_pass_module.c +++ /dev/null @@ -1,336 +0,0 @@ - -/* - * Copyright (C) Roman Arutyunyan - * Copyright (C) Nginx, Inc. - */ - - -#include -#include -#include - - -#define NGX_STREAM_PASS_MAX_PASSES 10 - - -typedef struct { - ngx_addr_t *addr; - ngx_stream_complex_value_t *addr_value; -} ngx_stream_pass_srv_conf_t; - - -static void ngx_stream_pass_handler(ngx_stream_session_t *s); -static ngx_int_t ngx_stream_pass_check_cycle(ngx_connection_t *c); -static void ngx_stream_pass_cleanup(void *data); -static ngx_int_t ngx_stream_pass_match(ngx_listening_t *ls, ngx_addr_t *addr); -static void *ngx_stream_pass_create_srv_conf(ngx_conf_t *cf); -static char *ngx_stream_pass(ngx_conf_t *cf, ngx_command_t *cmd, void *conf); - - -static ngx_command_t ngx_stream_pass_commands[] = { - - { ngx_string("pass"), - NGX_STREAM_SRV_CONF|NGX_CONF_TAKE1, - ngx_stream_pass, - NGX_STREAM_SRV_CONF_OFFSET, - 0, - NULL }, - - ngx_null_command -}; - - -static ngx_stream_module_t ngx_stream_pass_module_ctx = { - NULL, /* preconfiguration */ - NULL, /* postconfiguration */ - - NULL, /* create main configuration */ - NULL, /* init main configuration */ - - ngx_stream_pass_create_srv_conf, /* create server configuration */ - NULL /* merge server configuration */ -}; - - -ngx_module_t ngx_stream_pass_module = { - NGX_MODULE_V1, - &ngx_stream_pass_module_ctx, /* module context */ - ngx_stream_pass_commands, /* module directives */ - NGX_STREAM_MODULE, /* module type */ - NULL, /* init master */ - NULL, /* init module */ - NULL, /* init process */ - NULL, /* init thread */ - NULL, /* exit thread */ - NULL, /* exit process */ - NULL, /* exit master */ - NGX_MODULE_V1_PADDING -}; - - -static void -ngx_stream_pass_handler(ngx_stream_session_t *s) -{ - ngx_url_t u; - ngx_str_t url; - ngx_addr_t *addr; - ngx_uint_t i; - ngx_listening_t *ls; - ngx_connection_t *c; - ngx_stream_pass_srv_conf_t *pscf; - - c = s->connection; - - c->log->action = "passing connection to port"; - - if (c->type == SOCK_DGRAM) { - ngx_log_error(NGX_LOG_ERR, c->log, 0, "cannot pass udp connection"); - goto failed; - } - - if (c->buffer && c->buffer->pos != c->buffer->last) { - ngx_log_error(NGX_LOG_ERR, c->log, 0, - "cannot pass connection with preread data"); - goto failed; - } - - pscf = ngx_stream_get_module_srv_conf(s, ngx_stream_pass_module); - - addr = pscf->addr; - - if (addr == NULL) { - if (ngx_stream_complex_value(s, pscf->addr_value, &url) != NGX_OK) { - goto failed; - } - - ngx_memzero(&u, sizeof(ngx_url_t)); - - u.url = url; - u.no_resolve = 1; - - if (ngx_parse_url(c->pool, &u) != NGX_OK) { - if (u.err) { - ngx_log_error(NGX_LOG_ERR, c->log, 0, - "%s in pass \"%V\"", u.err, &u.url); - } - - goto failed; - } - - if (u.naddrs == 0) { - ngx_log_error(NGX_LOG_ERR, c->log, 0, - "no addresses in pass \"%V\"", &u.url); - goto failed; - } - - if (u.no_port) { - ngx_log_error(NGX_LOG_ERR, c->log, 0, - "no port in pass \"%V\"", &u.url); - goto failed; - } - - addr = &u.addrs[0]; - } - - ngx_log_debug1(NGX_LOG_DEBUG_STREAM, c->log, 0, - "stream pass addr: \"%V\"", &addr->name); - - if (ngx_stream_pass_check_cycle(c) != NGX_OK) { - goto failed; - } - - ls = ngx_cycle->listening.elts; - - for (i = 0; i < ngx_cycle->listening.nelts; i++) { - - if (ngx_stream_pass_match(&ls[i], addr) != NGX_OK) { - continue; - } - - c->listening = &ls[i]; - - c->data = NULL; - c->buffer = NULL; - - *c->log = c->listening->log; - c->log->handler = NULL; - c->log->data = NULL; - - c->local_sockaddr = addr->sockaddr; - c->local_socklen = addr->socklen; - - c->listening->handler(c); - - return; - } - - ngx_log_error(NGX_LOG_ERR, c->log, 0, - "port not found for \"%V\"", &addr->name); - - ngx_stream_finalize_session(s, NGX_STREAM_OK); - - return; - -failed: - - ngx_stream_finalize_session(s, NGX_STREAM_INTERNAL_SERVER_ERROR); -} - - -static ngx_int_t -ngx_stream_pass_check_cycle(ngx_connection_t *c) -{ - ngx_uint_t *num; - ngx_pool_cleanup_t *cln; - - for (cln = c->pool->cleanup; cln; cln = cln->next) { - if (cln->handler != ngx_stream_pass_cleanup) { - continue; - } - - num = cln->data; - - if (++(*num) > NGX_STREAM_PASS_MAX_PASSES) { - ngx_log_error(NGX_LOG_ERR, c->log, 0, "stream pass cycle"); - return NGX_ERROR; - } - - return NGX_OK; - } - - cln = ngx_pool_cleanup_add(c->pool, sizeof(ngx_uint_t)); - if (cln == NULL) { - return NGX_ERROR; - } - - cln->handler = ngx_stream_pass_cleanup; - - num = cln->data; - *num = 1; - - return NGX_OK; -} - - -static void -ngx_stream_pass_cleanup(void *data) -{ - return; -} - - -static ngx_int_t -ngx_stream_pass_match(ngx_listening_t *ls, ngx_addr_t *addr) -{ - if (ls->type == SOCK_DGRAM) { - return NGX_DECLINED; - } - - if (!ls->wildcard) { - return ngx_cmp_sockaddr(ls->sockaddr, ls->socklen, - addr->sockaddr, addr->socklen, 1); - } - - if (ls->sockaddr->sa_family == addr->sockaddr->sa_family - && ngx_inet_get_port(ls->sockaddr) == ngx_inet_get_port(addr->sockaddr)) - { - return NGX_OK; - } - - return NGX_DECLINED; -} - - -static void * -ngx_stream_pass_create_srv_conf(ngx_conf_t *cf) -{ - ngx_stream_pass_srv_conf_t *conf; - - conf = ngx_pcalloc(cf->pool, sizeof(ngx_stream_pass_srv_conf_t)); - if (conf == NULL) { - return NULL; - } - - /* - * set by ngx_pcalloc(): - * - * conf->addr = NULL; - * conf->addr_value = NULL; - */ - - return conf; -} - - -static char * -ngx_stream_pass(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) -{ - ngx_stream_pass_srv_conf_t *pscf = conf; - - ngx_url_t u; - ngx_str_t *value, *url; - ngx_stream_complex_value_t cv; - ngx_stream_core_srv_conf_t *cscf; - ngx_stream_compile_complex_value_t ccv; - - if (pscf->addr || pscf->addr_value) { - return "is duplicate"; - } - - cscf = ngx_stream_conf_get_module_srv_conf(cf, ngx_stream_core_module); - - cscf->handler = ngx_stream_pass_handler; - - value = cf->args->elts; - - url = &value[1]; - - ngx_memzero(&ccv, sizeof(ngx_stream_compile_complex_value_t)); - - ccv.cf = cf; - ccv.value = url; - ccv.complex_value = &cv; - - if (ngx_stream_compile_complex_value(&ccv) != NGX_OK) { - return NGX_CONF_ERROR; - } - - if (cv.lengths) { - pscf->addr_value = ngx_palloc(cf->pool, - sizeof(ngx_stream_complex_value_t)); - if (pscf->addr_value == NULL) { - return NGX_CONF_ERROR; - } - - *pscf->addr_value = cv; - - return NGX_CONF_OK; - } - - ngx_memzero(&u, sizeof(ngx_url_t)); - - u.url = *url; - u.no_resolve = 1; - - if (ngx_parse_url(cf->pool, &u) != NGX_OK) { - if (u.err) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "%s in \"%V\" of the \"pass\" directive", - u.err, &u.url); - } - - return NGX_CONF_ERROR; - } - - if (u.naddrs == 0) { - return "has no addresses"; - } - - if (u.no_port) { - return "has no port"; - } - - pscf->addr = &u.addrs[0]; - - return NGX_CONF_OK; -} diff --git a/src/deps/src/nginx-1.30.3/src/stream/ngx_stream_proxy_module.c b/src/deps/src/nginx-1.30.3/src/stream/ngx_stream_proxy_module.c deleted file mode 100644 index 300bdf6818..0000000000 --- a/src/deps/src/nginx-1.30.3/src/stream/ngx_stream_proxy_module.c +++ /dev/null @@ -1,2683 +0,0 @@ - -/* - * Copyright (C) Roman Arutyunyan - * Copyright (C) Nginx, Inc. - */ - - -#include -#include -#include - - -typedef struct { - ngx_addr_t *addr; - ngx_stream_complex_value_t *value; -#if (NGX_HAVE_TRANSPARENT_PROXY) - ngx_uint_t transparent; /* unsigned transparent:1; */ -#endif -} ngx_stream_upstream_local_t; - - -typedef struct { - ngx_msec_t connect_timeout; - ngx_msec_t timeout; - ngx_msec_t next_upstream_timeout; - size_t buffer_size; - ngx_stream_complex_value_t *upload_rate; - ngx_stream_complex_value_t *download_rate; - ngx_uint_t requests; - ngx_uint_t responses; - ngx_uint_t next_upstream_tries; - ngx_flag_t next_upstream; - ngx_flag_t proxy_protocol; - ngx_flag_t half_close; - ngx_stream_upstream_local_t *local; - ngx_flag_t socket_keepalive; - -#if (NGX_STREAM_SSL) - ngx_flag_t ssl_enable; - ngx_flag_t ssl_session_reuse; - ngx_uint_t ssl_protocols; - ngx_str_t ssl_ciphers; - ngx_stream_complex_value_t *ssl_name; - ngx_flag_t ssl_server_name; - - ngx_flag_t ssl_verify; - ngx_uint_t ssl_verify_depth; - ngx_str_t ssl_trusted_certificate; - ngx_str_t ssl_crl; - ngx_stream_complex_value_t *ssl_certificate; - ngx_stream_complex_value_t *ssl_certificate_key; - ngx_ssl_cache_t *ssl_certificate_cache; - ngx_array_t *ssl_passwords; - ngx_array_t *ssl_conf_commands; - - ngx_ssl_t *ssl; -#endif - - ngx_stream_upstream_srv_conf_t *upstream; - ngx_stream_complex_value_t *upstream_value; -} ngx_stream_proxy_srv_conf_t; - - -static void ngx_stream_proxy_handler(ngx_stream_session_t *s); -static ngx_int_t ngx_stream_proxy_eval(ngx_stream_session_t *s, - ngx_stream_proxy_srv_conf_t *pscf); -static ngx_int_t ngx_stream_proxy_set_local(ngx_stream_session_t *s, - ngx_stream_upstream_t *u, ngx_stream_upstream_local_t *local); -static void ngx_stream_proxy_connect(ngx_stream_session_t *s); -static void ngx_stream_proxy_init_upstream(ngx_stream_session_t *s); -static void ngx_stream_proxy_resolve_handler(ngx_resolver_ctx_t *ctx); -static void ngx_stream_proxy_upstream_handler(ngx_event_t *ev); -static void ngx_stream_proxy_downstream_handler(ngx_event_t *ev); -static void ngx_stream_proxy_process_connection(ngx_event_t *ev, - ngx_uint_t from_upstream); -static void ngx_stream_proxy_connect_handler(ngx_event_t *ev); -static ngx_int_t ngx_stream_proxy_test_connect(ngx_connection_t *c); -static void ngx_stream_proxy_process(ngx_stream_session_t *s, - ngx_uint_t from_upstream, ngx_uint_t do_write); -static ngx_int_t ngx_stream_proxy_test_finalize(ngx_stream_session_t *s, - ngx_uint_t from_upstream); -static void ngx_stream_proxy_next_upstream(ngx_stream_session_t *s); -static void ngx_stream_proxy_finalize(ngx_stream_session_t *s, ngx_uint_t rc); -static u_char *ngx_stream_proxy_log_error(ngx_log_t *log, u_char *buf, - size_t len); - -static void *ngx_stream_proxy_create_srv_conf(ngx_conf_t *cf); -static char *ngx_stream_proxy_merge_srv_conf(ngx_conf_t *cf, void *parent, - void *child); -static char *ngx_stream_proxy_pass(ngx_conf_t *cf, ngx_command_t *cmd, - void *conf); -static char *ngx_stream_proxy_bind(ngx_conf_t *cf, ngx_command_t *cmd, - void *conf); - -#if (NGX_STREAM_SSL) - -static ngx_int_t ngx_stream_proxy_send_proxy_protocol(ngx_stream_session_t *s); -static char *ngx_stream_proxy_ssl_certificate_cache(ngx_conf_t *cf, - ngx_command_t *cmd, void *conf); -static char *ngx_stream_proxy_ssl_password_file(ngx_conf_t *cf, - ngx_command_t *cmd, void *conf); -static char *ngx_stream_proxy_ssl_conf_command_check(ngx_conf_t *cf, void *post, - void *data); -static void ngx_stream_proxy_ssl_init_connection(ngx_stream_session_t *s); -static void ngx_stream_proxy_ssl_handshake(ngx_connection_t *pc); -static void ngx_stream_proxy_ssl_save_session(ngx_connection_t *c); -static ngx_int_t ngx_stream_proxy_ssl_name(ngx_stream_session_t *s); -static ngx_int_t ngx_stream_proxy_ssl_certificate(ngx_stream_session_t *s); -static ngx_int_t ngx_stream_proxy_merge_ssl(ngx_conf_t *cf, - ngx_stream_proxy_srv_conf_t *conf, ngx_stream_proxy_srv_conf_t *prev); -static ngx_int_t ngx_stream_proxy_merge_ssl_passwords(ngx_conf_t *cf, - ngx_stream_proxy_srv_conf_t *conf, ngx_stream_proxy_srv_conf_t *prev); -static ngx_int_t ngx_stream_proxy_set_ssl(ngx_conf_t *cf, - ngx_stream_proxy_srv_conf_t *pscf); - - -static ngx_conf_bitmask_t ngx_stream_proxy_ssl_protocols[] = { - { ngx_string("SSLv2"), NGX_SSL_SSLv2 }, - { ngx_string("SSLv3"), NGX_SSL_SSLv3 }, - { ngx_string("TLSv1"), NGX_SSL_TLSv1 }, - { ngx_string("TLSv1.1"), NGX_SSL_TLSv1_1 }, - { ngx_string("TLSv1.2"), NGX_SSL_TLSv1_2 }, - { ngx_string("TLSv1.3"), NGX_SSL_TLSv1_3 }, - { ngx_null_string, 0 } -}; - -static ngx_conf_post_t ngx_stream_proxy_ssl_conf_command_post = - { ngx_stream_proxy_ssl_conf_command_check }; - -#endif - - -static ngx_conf_deprecated_t ngx_conf_deprecated_proxy_downstream_buffer = { - ngx_conf_deprecated, "proxy_downstream_buffer", "proxy_buffer_size" -}; - -static ngx_conf_deprecated_t ngx_conf_deprecated_proxy_upstream_buffer = { - ngx_conf_deprecated, "proxy_upstream_buffer", "proxy_buffer_size" -}; - - -static ngx_command_t ngx_stream_proxy_commands[] = { - - { ngx_string("proxy_pass"), - NGX_STREAM_SRV_CONF|NGX_CONF_TAKE1, - ngx_stream_proxy_pass, - NGX_STREAM_SRV_CONF_OFFSET, - 0, - NULL }, - - { ngx_string("proxy_bind"), - NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_TAKE12, - ngx_stream_proxy_bind, - NGX_STREAM_SRV_CONF_OFFSET, - 0, - NULL }, - - { ngx_string("proxy_socket_keepalive"), - NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_FLAG, - ngx_conf_set_flag_slot, - NGX_STREAM_SRV_CONF_OFFSET, - offsetof(ngx_stream_proxy_srv_conf_t, socket_keepalive), - NULL }, - - { ngx_string("proxy_connect_timeout"), - NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_TAKE1, - ngx_conf_set_msec_slot, - NGX_STREAM_SRV_CONF_OFFSET, - offsetof(ngx_stream_proxy_srv_conf_t, connect_timeout), - NULL }, - - { ngx_string("proxy_timeout"), - NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_TAKE1, - ngx_conf_set_msec_slot, - NGX_STREAM_SRV_CONF_OFFSET, - offsetof(ngx_stream_proxy_srv_conf_t, timeout), - NULL }, - - { ngx_string("proxy_buffer_size"), - NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_TAKE1, - ngx_conf_set_size_slot, - NGX_STREAM_SRV_CONF_OFFSET, - offsetof(ngx_stream_proxy_srv_conf_t, buffer_size), - NULL }, - - { ngx_string("proxy_downstream_buffer"), - NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_TAKE1, - ngx_conf_set_size_slot, - NGX_STREAM_SRV_CONF_OFFSET, - offsetof(ngx_stream_proxy_srv_conf_t, buffer_size), - &ngx_conf_deprecated_proxy_downstream_buffer }, - - { ngx_string("proxy_upstream_buffer"), - NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_TAKE1, - ngx_conf_set_size_slot, - NGX_STREAM_SRV_CONF_OFFSET, - offsetof(ngx_stream_proxy_srv_conf_t, buffer_size), - &ngx_conf_deprecated_proxy_upstream_buffer }, - - { ngx_string("proxy_upload_rate"), - NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_TAKE1, - ngx_stream_set_complex_value_size_slot, - NGX_STREAM_SRV_CONF_OFFSET, - offsetof(ngx_stream_proxy_srv_conf_t, upload_rate), - NULL }, - - { ngx_string("proxy_download_rate"), - NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_TAKE1, - ngx_stream_set_complex_value_size_slot, - NGX_STREAM_SRV_CONF_OFFSET, - offsetof(ngx_stream_proxy_srv_conf_t, download_rate), - NULL }, - - { ngx_string("proxy_requests"), - NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_TAKE1, - ngx_conf_set_num_slot, - NGX_STREAM_SRV_CONF_OFFSET, - offsetof(ngx_stream_proxy_srv_conf_t, requests), - NULL }, - - { ngx_string("proxy_responses"), - NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_TAKE1, - ngx_conf_set_num_slot, - NGX_STREAM_SRV_CONF_OFFSET, - offsetof(ngx_stream_proxy_srv_conf_t, responses), - NULL }, - - { ngx_string("proxy_next_upstream"), - NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_FLAG, - ngx_conf_set_flag_slot, - NGX_STREAM_SRV_CONF_OFFSET, - offsetof(ngx_stream_proxy_srv_conf_t, next_upstream), - NULL }, - - { ngx_string("proxy_next_upstream_tries"), - NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_TAKE1, - ngx_conf_set_num_slot, - NGX_STREAM_SRV_CONF_OFFSET, - offsetof(ngx_stream_proxy_srv_conf_t, next_upstream_tries), - NULL }, - - { ngx_string("proxy_next_upstream_timeout"), - NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_TAKE1, - ngx_conf_set_msec_slot, - NGX_STREAM_SRV_CONF_OFFSET, - offsetof(ngx_stream_proxy_srv_conf_t, next_upstream_timeout), - NULL }, - - { ngx_string("proxy_protocol"), - NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_FLAG, - ngx_conf_set_flag_slot, - NGX_STREAM_SRV_CONF_OFFSET, - offsetof(ngx_stream_proxy_srv_conf_t, proxy_protocol), - NULL }, - - { ngx_string("proxy_half_close"), - NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_FLAG, - ngx_conf_set_flag_slot, - NGX_STREAM_SRV_CONF_OFFSET, - offsetof(ngx_stream_proxy_srv_conf_t, half_close), - NULL }, - -#if (NGX_STREAM_SSL) - - { ngx_string("proxy_ssl"), - NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_FLAG, - ngx_conf_set_flag_slot, - NGX_STREAM_SRV_CONF_OFFSET, - offsetof(ngx_stream_proxy_srv_conf_t, ssl_enable), - NULL }, - - { ngx_string("proxy_ssl_session_reuse"), - NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_FLAG, - ngx_conf_set_flag_slot, - NGX_STREAM_SRV_CONF_OFFSET, - offsetof(ngx_stream_proxy_srv_conf_t, ssl_session_reuse), - NULL }, - - { ngx_string("proxy_ssl_protocols"), - NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_1MORE, - ngx_conf_set_bitmask_slot, - NGX_STREAM_SRV_CONF_OFFSET, - offsetof(ngx_stream_proxy_srv_conf_t, ssl_protocols), - &ngx_stream_proxy_ssl_protocols }, - - { ngx_string("proxy_ssl_ciphers"), - NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_TAKE1, - ngx_conf_set_str_slot, - NGX_STREAM_SRV_CONF_OFFSET, - offsetof(ngx_stream_proxy_srv_conf_t, ssl_ciphers), - NULL }, - - { ngx_string("proxy_ssl_name"), - NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_TAKE1, - ngx_stream_set_complex_value_slot, - NGX_STREAM_SRV_CONF_OFFSET, - offsetof(ngx_stream_proxy_srv_conf_t, ssl_name), - NULL }, - - { ngx_string("proxy_ssl_server_name"), - NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_FLAG, - ngx_conf_set_flag_slot, - NGX_STREAM_SRV_CONF_OFFSET, - offsetof(ngx_stream_proxy_srv_conf_t, ssl_server_name), - NULL }, - - { ngx_string("proxy_ssl_verify"), - NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_FLAG, - ngx_conf_set_flag_slot, - NGX_STREAM_SRV_CONF_OFFSET, - offsetof(ngx_stream_proxy_srv_conf_t, ssl_verify), - NULL }, - - { ngx_string("proxy_ssl_verify_depth"), - NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_TAKE1, - ngx_conf_set_num_slot, - NGX_STREAM_SRV_CONF_OFFSET, - offsetof(ngx_stream_proxy_srv_conf_t, ssl_verify_depth), - NULL }, - - { ngx_string("proxy_ssl_trusted_certificate"), - NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_TAKE1, - ngx_conf_set_str_slot, - NGX_STREAM_SRV_CONF_OFFSET, - offsetof(ngx_stream_proxy_srv_conf_t, ssl_trusted_certificate), - NULL }, - - { ngx_string("proxy_ssl_crl"), - NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_TAKE1, - ngx_conf_set_str_slot, - NGX_STREAM_SRV_CONF_OFFSET, - offsetof(ngx_stream_proxy_srv_conf_t, ssl_crl), - NULL }, - - { ngx_string("proxy_ssl_certificate"), - NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_TAKE1, - ngx_stream_set_complex_value_zero_slot, - NGX_STREAM_SRV_CONF_OFFSET, - offsetof(ngx_stream_proxy_srv_conf_t, ssl_certificate), - NULL }, - - { ngx_string("proxy_ssl_certificate_key"), - NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_TAKE1, - ngx_stream_set_complex_value_zero_slot, - NGX_STREAM_SRV_CONF_OFFSET, - offsetof(ngx_stream_proxy_srv_conf_t, ssl_certificate_key), - NULL }, - - { ngx_string("proxy_ssl_certificate_cache"), - NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_TAKE123, - ngx_stream_proxy_ssl_certificate_cache, - NGX_STREAM_SRV_CONF_OFFSET, - 0, - NULL }, - - { ngx_string("proxy_ssl_password_file"), - NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_TAKE1, - ngx_stream_proxy_ssl_password_file, - NGX_STREAM_SRV_CONF_OFFSET, - 0, - NULL }, - - { ngx_string("proxy_ssl_conf_command"), - NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_TAKE2, - ngx_conf_set_keyval_slot, - NGX_STREAM_SRV_CONF_OFFSET, - offsetof(ngx_stream_proxy_srv_conf_t, ssl_conf_commands), - &ngx_stream_proxy_ssl_conf_command_post }, - -#endif - - ngx_null_command -}; - - -static ngx_stream_module_t ngx_stream_proxy_module_ctx = { - NULL, /* preconfiguration */ - NULL, /* postconfiguration */ - - NULL, /* create main configuration */ - NULL, /* init main configuration */ - - ngx_stream_proxy_create_srv_conf, /* create server configuration */ - ngx_stream_proxy_merge_srv_conf /* merge server configuration */ -}; - - -ngx_module_t ngx_stream_proxy_module = { - NGX_MODULE_V1, - &ngx_stream_proxy_module_ctx, /* module context */ - ngx_stream_proxy_commands, /* module directives */ - NGX_STREAM_MODULE, /* module type */ - NULL, /* init master */ - NULL, /* init module */ - NULL, /* init process */ - NULL, /* init thread */ - NULL, /* exit thread */ - NULL, /* exit process */ - NULL, /* exit master */ - NGX_MODULE_V1_PADDING -}; - - -static void -ngx_stream_proxy_handler(ngx_stream_session_t *s) -{ - u_char *p; - ngx_str_t *host; - ngx_uint_t i; - ngx_connection_t *c; - ngx_resolver_ctx_t *ctx, temp; - ngx_stream_upstream_t *u; - ngx_stream_core_srv_conf_t *cscf; - ngx_stream_proxy_srv_conf_t *pscf; - ngx_stream_upstream_srv_conf_t *uscf, **uscfp; - ngx_stream_upstream_main_conf_t *umcf; - - c = s->connection; - - pscf = ngx_stream_get_module_srv_conf(s, ngx_stream_proxy_module); - - ngx_log_debug0(NGX_LOG_DEBUG_STREAM, c->log, 0, - "proxy connection handler"); - - u = ngx_pcalloc(c->pool, sizeof(ngx_stream_upstream_t)); - if (u == NULL) { - ngx_stream_proxy_finalize(s, NGX_STREAM_INTERNAL_SERVER_ERROR); - return; - } - - s->upstream = u; - - s->log_handler = ngx_stream_proxy_log_error; - - u->requests = 1; - - u->peer.log = c->log; - u->peer.log_error = NGX_ERROR_ERR; - - if (ngx_stream_proxy_set_local(s, u, pscf->local) != NGX_OK) { - ngx_stream_proxy_finalize(s, NGX_STREAM_INTERNAL_SERVER_ERROR); - return; - } - - if (pscf->socket_keepalive) { - u->peer.so_keepalive = 1; - } - - u->peer.type = c->type; - u->start_sec = ngx_time(); - - c->write->handler = ngx_stream_proxy_downstream_handler; - c->read->handler = ngx_stream_proxy_downstream_handler; - - s->upstream_states = ngx_array_create(c->pool, 1, - sizeof(ngx_stream_upstream_state_t)); - if (s->upstream_states == NULL) { - ngx_stream_proxy_finalize(s, NGX_STREAM_INTERNAL_SERVER_ERROR); - return; - } - - p = ngx_pnalloc(c->pool, pscf->buffer_size); - if (p == NULL) { - ngx_stream_proxy_finalize(s, NGX_STREAM_INTERNAL_SERVER_ERROR); - return; - } - - u->downstream_buf.start = p; - u->downstream_buf.end = p + pscf->buffer_size; - u->downstream_buf.pos = p; - u->downstream_buf.last = p; - - if (c->read->ready) { - ngx_post_event(c->read, &ngx_posted_events); - } - - if (pscf->upstream_value) { - if (ngx_stream_proxy_eval(s, pscf) != NGX_OK) { - ngx_stream_proxy_finalize(s, NGX_STREAM_INTERNAL_SERVER_ERROR); - return; - } - } - - if (u->resolved == NULL) { - - uscf = pscf->upstream; - - } else { - -#if (NGX_STREAM_SSL) - u->ssl_name = u->resolved->host; -#endif - - host = &u->resolved->host; - - umcf = ngx_stream_get_module_main_conf(s, ngx_stream_upstream_module); - - uscfp = umcf->upstreams.elts; - - for (i = 0; i < umcf->upstreams.nelts; i++) { - - uscf = uscfp[i]; - - if (uscf->host.len == host->len - && ((uscf->port == 0 && u->resolved->no_port) - || uscf->port == u->resolved->port) - && ngx_strncasecmp(uscf->host.data, host->data, host->len) == 0) - { - goto found; - } - } - - if (u->resolved->sockaddr) { - - if (u->resolved->port == 0 - && u->resolved->sockaddr->sa_family != AF_UNIX) - { - ngx_log_error(NGX_LOG_ERR, c->log, 0, - "no port in upstream \"%V\"", host); - ngx_stream_proxy_finalize(s, NGX_STREAM_INTERNAL_SERVER_ERROR); - return; - } - - if (ngx_stream_upstream_create_round_robin_peer(s, u->resolved) - != NGX_OK) - { - ngx_stream_proxy_finalize(s, NGX_STREAM_INTERNAL_SERVER_ERROR); - return; - } - - ngx_stream_proxy_connect(s); - - return; - } - - if (u->resolved->port == 0) { - ngx_log_error(NGX_LOG_ERR, c->log, 0, - "no port in upstream \"%V\"", host); - ngx_stream_proxy_finalize(s, NGX_STREAM_INTERNAL_SERVER_ERROR); - return; - } - - temp.name = *host; - - cscf = ngx_stream_get_module_srv_conf(s, ngx_stream_core_module); - - ctx = ngx_resolve_start(cscf->resolver, &temp); - if (ctx == NULL) { - ngx_stream_proxy_finalize(s, NGX_STREAM_INTERNAL_SERVER_ERROR); - return; - } - - if (ctx == NGX_NO_RESOLVER) { - ngx_log_error(NGX_LOG_ERR, c->log, 0, - "no resolver defined to resolve %V", host); - ngx_stream_proxy_finalize(s, NGX_STREAM_INTERNAL_SERVER_ERROR); - return; - } - - ctx->name = *host; - ctx->handler = ngx_stream_proxy_resolve_handler; - ctx->data = s; - ctx->timeout = cscf->resolver_timeout; - - u->resolved->ctx = ctx; - - if (ngx_resolve_name(ctx) != NGX_OK) { - u->resolved->ctx = NULL; - ngx_stream_proxy_finalize(s, NGX_STREAM_INTERNAL_SERVER_ERROR); - return; - } - - return; - } - -found: - - if (uscf == NULL) { - ngx_log_error(NGX_LOG_ALERT, c->log, 0, "no upstream configuration"); - ngx_stream_proxy_finalize(s, NGX_STREAM_INTERNAL_SERVER_ERROR); - return; - } - - u->upstream = uscf; - -#if (NGX_STREAM_SSL) - u->ssl_name = uscf->host; -#endif - - if (uscf->peer.init(s, uscf) != NGX_OK) { - ngx_stream_proxy_finalize(s, NGX_STREAM_INTERNAL_SERVER_ERROR); - return; - } - - u->peer.start_time = ngx_current_msec; - - if (pscf->next_upstream_tries - && u->peer.tries > pscf->next_upstream_tries) - { - u->peer.tries = pscf->next_upstream_tries; - } - - ngx_stream_proxy_connect(s); -} - - -static ngx_int_t -ngx_stream_proxy_eval(ngx_stream_session_t *s, - ngx_stream_proxy_srv_conf_t *pscf) -{ - ngx_str_t host; - ngx_url_t url; - ngx_stream_upstream_t *u; - - if (ngx_stream_complex_value(s, pscf->upstream_value, &host) != NGX_OK) { - return NGX_ERROR; - } - - ngx_memzero(&url, sizeof(ngx_url_t)); - - url.url = host; - url.no_resolve = 1; - - if (ngx_parse_url(s->connection->pool, &url) != NGX_OK) { - if (url.err) { - ngx_log_error(NGX_LOG_ERR, s->connection->log, 0, - "%s in upstream \"%V\"", url.err, &url.url); - } - - return NGX_ERROR; - } - - u = s->upstream; - - u->resolved = ngx_pcalloc(s->connection->pool, - sizeof(ngx_stream_upstream_resolved_t)); - if (u->resolved == NULL) { - return NGX_ERROR; - } - - if (url.addrs) { - u->resolved->sockaddr = url.addrs[0].sockaddr; - u->resolved->socklen = url.addrs[0].socklen; - u->resolved->name = url.addrs[0].name; - u->resolved->naddrs = 1; - } - - u->resolved->host = url.host; - u->resolved->port = url.port; - u->resolved->no_port = url.no_port; - - return NGX_OK; -} - - -static ngx_int_t -ngx_stream_proxy_set_local(ngx_stream_session_t *s, ngx_stream_upstream_t *u, - ngx_stream_upstream_local_t *local) -{ - ngx_int_t rc; - ngx_str_t val; - ngx_addr_t *addr; - - if (local == NULL) { - u->peer.local = NULL; - return NGX_OK; - } - -#if (NGX_HAVE_TRANSPARENT_PROXY) - u->peer.transparent = local->transparent; -#endif - - if (local->value == NULL) { - u->peer.local = local->addr; - return NGX_OK; - } - - if (ngx_stream_complex_value(s, local->value, &val) != NGX_OK) { - return NGX_ERROR; - } - - if (val.len == 0) { - u->peer.local = NULL; - return NGX_OK; - } - - addr = ngx_palloc(s->connection->pool, sizeof(ngx_addr_t)); - if (addr == NULL) { - return NGX_ERROR; - } - - rc = ngx_parse_addr_port(s->connection->pool, addr, val.data, val.len); - if (rc == NGX_ERROR) { - return NGX_ERROR; - } - - if (rc != NGX_OK) { - ngx_log_error(NGX_LOG_ERR, s->connection->log, 0, - "invalid local address \"%V\"", &val); - u->peer.local = NULL; - return NGX_OK; - } - - addr->name = val; - u->peer.local = addr; - - return NGX_OK; -} - - -static void -ngx_stream_proxy_connect(ngx_stream_session_t *s) -{ - ngx_int_t rc; - ngx_connection_t *c, *pc; - ngx_stream_upstream_t *u; - ngx_stream_proxy_srv_conf_t *pscf; - - c = s->connection; - - c->log->action = "connecting to upstream"; - - pscf = ngx_stream_get_module_srv_conf(s, ngx_stream_proxy_module); - - u = s->upstream; - - u->connected = 0; - u->proxy_protocol = pscf->proxy_protocol; - - if (u->state) { - u->state->response_time = ngx_current_msec - u->start_time; - } - - u->state = ngx_array_push(s->upstream_states); - if (u->state == NULL) { - ngx_stream_proxy_finalize(s, NGX_STREAM_INTERNAL_SERVER_ERROR); - return; - } - - ngx_memzero(u->state, sizeof(ngx_stream_upstream_state_t)); - - u->start_time = ngx_current_msec; - - u->state->connect_time = (ngx_msec_t) -1; - u->state->first_byte_time = (ngx_msec_t) -1; - u->state->response_time = (ngx_msec_t) -1; - - rc = ngx_event_connect_peer(&u->peer); - - ngx_log_debug1(NGX_LOG_DEBUG_STREAM, c->log, 0, "proxy connect: %i", rc); - - if (rc == NGX_ERROR) { - ngx_stream_proxy_finalize(s, NGX_STREAM_INTERNAL_SERVER_ERROR); - return; - } - - u->state->peer = u->peer.name; - -#if (NGX_STREAM_UPSTREAM_ZONE) - if (u->upstream && u->upstream->shm_zone - && (u->upstream->flags & NGX_STREAM_UPSTREAM_MODIFY)) - { - u->state->peer = ngx_palloc(s->connection->pool, - sizeof(ngx_str_t) + u->peer.name->len); - if (u->state->peer == NULL) { - ngx_stream_proxy_finalize(s, NGX_STREAM_INTERNAL_SERVER_ERROR); - return; - } - - u->state->peer->len = u->peer.name->len; - u->state->peer->data = (u_char *) (u->state->peer + 1); - ngx_memcpy(u->state->peer->data, u->peer.name->data, u->peer.name->len); - - u->peer.name = u->state->peer; - } -#endif - - if (rc == NGX_BUSY) { - ngx_log_error(NGX_LOG_ERR, c->log, 0, "no live upstreams"); - ngx_stream_proxy_finalize(s, NGX_STREAM_BAD_GATEWAY); - return; - } - - if (rc == NGX_DECLINED) { - ngx_stream_proxy_next_upstream(s); - return; - } - - /* rc == NGX_OK || rc == NGX_AGAIN || rc == NGX_DONE */ - - pc = u->peer.connection; - - pc->data = s; - pc->log = c->log; - pc->pool = c->pool; - pc->read->log = c->log; - pc->write->log = c->log; - - if (rc != NGX_AGAIN) { - ngx_stream_proxy_init_upstream(s); - return; - } - - pc->read->handler = ngx_stream_proxy_connect_handler; - pc->write->handler = ngx_stream_proxy_connect_handler; - - ngx_add_timer(pc->write, pscf->connect_timeout); -} - - -static void -ngx_stream_proxy_init_upstream(ngx_stream_session_t *s) -{ - u_char *p; - ngx_chain_t *cl; - ngx_connection_t *c, *pc; - ngx_log_handler_pt handler; - ngx_stream_upstream_t *u; - ngx_stream_core_srv_conf_t *cscf; - ngx_stream_proxy_srv_conf_t *pscf; - - u = s->upstream; - pc = u->peer.connection; - - cscf = ngx_stream_get_module_srv_conf(s, ngx_stream_core_module); - - if (pc->type == SOCK_STREAM - && cscf->tcp_nodelay - && ngx_tcp_nodelay(pc) != NGX_OK) - { - ngx_stream_proxy_next_upstream(s); - return; - } - - pscf = ngx_stream_get_module_srv_conf(s, ngx_stream_proxy_module); - -#if (NGX_STREAM_SSL) - - if (pc->type == SOCK_STREAM && pscf->ssl_enable) { - - if (u->proxy_protocol) { - if (ngx_stream_proxy_send_proxy_protocol(s) != NGX_OK) { - return; - } - - u->proxy_protocol = 0; - } - - if (pc->ssl == NULL) { - ngx_stream_proxy_ssl_init_connection(s); - return; - } - } - -#endif - - c = s->connection; - - if (c->log->log_level >= NGX_LOG_INFO) { - ngx_str_t str; - u_char addr[NGX_SOCKADDR_STRLEN]; - - str.len = NGX_SOCKADDR_STRLEN; - str.data = addr; - - if (ngx_connection_local_sockaddr(pc, &str, 1) == NGX_OK) { - handler = c->log->handler; - c->log->handler = NULL; - - ngx_log_error(NGX_LOG_INFO, c->log, 0, - "%sproxy %V connected to %V", - pc->type == SOCK_DGRAM ? "udp " : "", - &str, u->peer.name); - - c->log->handler = handler; - } - } - - u->state->connect_time = ngx_current_msec - u->start_time; - - if (u->peer.notify) { - u->peer.notify(&u->peer, u->peer.data, - NGX_STREAM_UPSTREAM_NOTIFY_CONNECT); - } - - if (u->upstream_buf.start == NULL) { - p = ngx_pnalloc(c->pool, pscf->buffer_size); - if (p == NULL) { - ngx_stream_proxy_finalize(s, NGX_STREAM_INTERNAL_SERVER_ERROR); - return; - } - - u->upstream_buf.start = p; - u->upstream_buf.end = p + pscf->buffer_size; - u->upstream_buf.pos = p; - u->upstream_buf.last = p; - } - - if (c->buffer && c->buffer->pos <= c->buffer->last) { - ngx_log_debug1(NGX_LOG_DEBUG_STREAM, c->log, 0, - "stream proxy add preread buffer: %uz", - c->buffer->last - c->buffer->pos); - - cl = ngx_chain_get_free_buf(c->pool, &u->free); - if (cl == NULL) { - ngx_stream_proxy_finalize(s, NGX_STREAM_INTERNAL_SERVER_ERROR); - return; - } - - *cl->buf = *c->buffer; - - cl->buf->tag = (ngx_buf_tag_t) &ngx_stream_proxy_module; - cl->buf->temporary = (cl->buf->pos == cl->buf->last) ? 0 : 1; - cl->buf->flush = 1; - - cl->next = u->upstream_out; - u->upstream_out = cl; - } - - if (u->proxy_protocol) { - ngx_log_debug0(NGX_LOG_DEBUG_STREAM, c->log, 0, - "stream proxy add PROXY protocol header"); - - cl = ngx_chain_get_free_buf(c->pool, &u->free); - if (cl == NULL) { - ngx_stream_proxy_finalize(s, NGX_STREAM_INTERNAL_SERVER_ERROR); - return; - } - - p = ngx_pnalloc(c->pool, NGX_PROXY_PROTOCOL_V1_MAX_HEADER); - if (p == NULL) { - ngx_stream_proxy_finalize(s, NGX_STREAM_INTERNAL_SERVER_ERROR); - return; - } - - cl->buf->pos = p; - - p = ngx_proxy_protocol_write(c, p, - p + NGX_PROXY_PROTOCOL_V1_MAX_HEADER); - if (p == NULL) { - ngx_stream_proxy_finalize(s, NGX_STREAM_INTERNAL_SERVER_ERROR); - return; - } - - cl->buf->last = p; - cl->buf->temporary = 1; - cl->buf->flush = 0; - cl->buf->last_buf = 0; - cl->buf->tag = (ngx_buf_tag_t) &ngx_stream_proxy_module; - - cl->next = u->upstream_out; - u->upstream_out = cl; - - u->proxy_protocol = 0; - } - - u->upload_rate = ngx_stream_complex_value_size(s, pscf->upload_rate, 0); - u->download_rate = ngx_stream_complex_value_size(s, pscf->download_rate, 0); - - u->connected = 1; - - pc->read->handler = ngx_stream_proxy_upstream_handler; - pc->write->handler = ngx_stream_proxy_upstream_handler; - - if (pc->read->ready) { - ngx_post_event(pc->read, &ngx_posted_events); - } - - ngx_stream_proxy_process(s, 0, 1); -} - - -#if (NGX_STREAM_SSL) - -static ngx_int_t -ngx_stream_proxy_send_proxy_protocol(ngx_stream_session_t *s) -{ - u_char *p; - ssize_t n, size; - ngx_connection_t *c, *pc; - ngx_stream_upstream_t *u; - ngx_stream_proxy_srv_conf_t *pscf; - u_char buf[NGX_PROXY_PROTOCOL_V1_MAX_HEADER]; - - c = s->connection; - - ngx_log_debug0(NGX_LOG_DEBUG_STREAM, c->log, 0, - "stream proxy send PROXY protocol header"); - - p = ngx_proxy_protocol_write(c, buf, - buf + NGX_PROXY_PROTOCOL_V1_MAX_HEADER); - if (p == NULL) { - ngx_stream_proxy_finalize(s, NGX_STREAM_INTERNAL_SERVER_ERROR); - return NGX_ERROR; - } - - u = s->upstream; - - pc = u->peer.connection; - - size = p - buf; - - n = pc->send(pc, buf, size); - - if (n == NGX_AGAIN) { - if (ngx_handle_write_event(pc->write, 0) != NGX_OK) { - ngx_stream_proxy_finalize(s, NGX_STREAM_INTERNAL_SERVER_ERROR); - return NGX_ERROR; - } - - pscf = ngx_stream_get_module_srv_conf(s, ngx_stream_proxy_module); - - ngx_add_timer(pc->write, pscf->timeout); - - pc->write->handler = ngx_stream_proxy_connect_handler; - - return NGX_AGAIN; - } - - if (n == NGX_ERROR) { - ngx_stream_proxy_finalize(s, NGX_STREAM_OK); - return NGX_ERROR; - } - - if (n != size) { - - /* - * PROXY protocol specification: - * The sender must always ensure that the header - * is sent at once, so that the transport layer - * maintains atomicity along the path to the receiver. - */ - - ngx_log_error(NGX_LOG_ERR, c->log, 0, - "could not send PROXY protocol header at once"); - - ngx_stream_proxy_finalize(s, NGX_STREAM_INTERNAL_SERVER_ERROR); - - return NGX_ERROR; - } - - return NGX_OK; -} - - -static char * -ngx_stream_proxy_ssl_certificate_cache(ngx_conf_t *cf, ngx_command_t *cmd, - void *conf) -{ - ngx_stream_proxy_srv_conf_t *pscf = conf; - - time_t inactive, valid; - ngx_str_t *value, s; - ngx_int_t max; - ngx_uint_t i; - - if (pscf->ssl_certificate_cache != NGX_CONF_UNSET_PTR) { - return "is duplicate"; - } - - value = cf->args->elts; - - max = 0; - inactive = 10; - valid = 60; - - for (i = 1; i < cf->args->nelts; i++) { - - if (ngx_strncmp(value[i].data, "max=", 4) == 0) { - - max = ngx_atoi(value[i].data + 4, value[i].len - 4); - if (max <= 0) { - goto failed; - } - - continue; - } - - if (ngx_strncmp(value[i].data, "inactive=", 9) == 0) { - - s.len = value[i].len - 9; - s.data = value[i].data + 9; - - inactive = ngx_parse_time(&s, 1); - if (inactive == (time_t) NGX_ERROR) { - goto failed; - } - - continue; - } - - if (ngx_strncmp(value[i].data, "valid=", 6) == 0) { - - s.len = value[i].len - 6; - s.data = value[i].data + 6; - - valid = ngx_parse_time(&s, 1); - if (valid == (time_t) NGX_ERROR) { - goto failed; - } - - continue; - } - - if (ngx_strcmp(value[i].data, "off") == 0) { - - pscf->ssl_certificate_cache = NULL; - - continue; - } - - failed: - - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "invalid parameter \"%V\"", &value[i]); - return NGX_CONF_ERROR; - } - - if (pscf->ssl_certificate_cache == NULL) { - return NGX_CONF_OK; - } - - if (max == 0) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "\"proxy_ssl_certificate_cache\" must have " - "the \"max\" parameter"); - return NGX_CONF_ERROR; - } - - pscf->ssl_certificate_cache = ngx_ssl_cache_init(cf->pool, max, valid, - inactive); - if (pscf->ssl_certificate_cache == NULL) { - return NGX_CONF_ERROR; - } - - return NGX_CONF_OK; -} - - -static char * -ngx_stream_proxy_ssl_password_file(ngx_conf_t *cf, ngx_command_t *cmd, - void *conf) -{ - ngx_stream_proxy_srv_conf_t *pscf = conf; - - ngx_str_t *value; - - if (pscf->ssl_passwords != NGX_CONF_UNSET_PTR) { - return "is duplicate"; - } - - value = cf->args->elts; - - pscf->ssl_passwords = ngx_ssl_read_password_file(cf, &value[1]); - - if (pscf->ssl_passwords == NULL) { - return NGX_CONF_ERROR; - } - - return NGX_CONF_OK; -} - - -static char * -ngx_stream_proxy_ssl_conf_command_check(ngx_conf_t *cf, void *post, void *data) -{ -#ifndef SSL_CONF_FLAG_FILE - return "is not supported on this platform"; -#else - return NGX_CONF_OK; -#endif -} - - -static void -ngx_stream_proxy_ssl_init_connection(ngx_stream_session_t *s) -{ - ngx_int_t rc; - ngx_connection_t *pc; - ngx_stream_upstream_t *u; - ngx_stream_proxy_srv_conf_t *pscf; - - u = s->upstream; - - pc = u->peer.connection; - - pscf = ngx_stream_get_module_srv_conf(s, ngx_stream_proxy_module); - - if (ngx_ssl_create_connection(pscf->ssl, pc, NGX_SSL_BUFFER|NGX_SSL_CLIENT) - != NGX_OK) - { - ngx_stream_proxy_finalize(s, NGX_STREAM_INTERNAL_SERVER_ERROR); - return; - } - - if (pscf->ssl_server_name || pscf->ssl_verify) { - if (ngx_stream_proxy_ssl_name(s) != NGX_OK) { - ngx_stream_proxy_finalize(s, NGX_STREAM_INTERNAL_SERVER_ERROR); - return; - } - } - - if (pscf->ssl_certificate - && pscf->ssl_certificate->value.len - && (pscf->ssl_certificate->lengths - || pscf->ssl_certificate_key->lengths)) - { - if (ngx_stream_proxy_ssl_certificate(s) != NGX_OK) { - ngx_stream_proxy_finalize(s, NGX_STREAM_INTERNAL_SERVER_ERROR); - return; - } - } - - if (pscf->ssl_session_reuse) { - pc->ssl->save_session = ngx_stream_proxy_ssl_save_session; - - if (u->peer.set_session(&u->peer, u->peer.data) != NGX_OK) { - ngx_stream_proxy_finalize(s, NGX_STREAM_INTERNAL_SERVER_ERROR); - return; - } - } - - s->connection->log->action = "SSL handshaking to upstream"; - - rc = ngx_ssl_handshake(pc); - - if (rc == NGX_AGAIN) { - - if (!pc->write->timer_set) { - ngx_add_timer(pc->write, pscf->connect_timeout); - } - - pc->ssl->handler = ngx_stream_proxy_ssl_handshake; - return; - } - - ngx_stream_proxy_ssl_handshake(pc); -} - - -static void -ngx_stream_proxy_ssl_handshake(ngx_connection_t *pc) -{ - long rc; - ngx_stream_session_t *s; - ngx_stream_upstream_t *u; - ngx_stream_proxy_srv_conf_t *pscf; - - s = pc->data; - - pscf = ngx_stream_get_module_srv_conf(s, ngx_stream_proxy_module); - - if (pc->ssl->handshaked) { - - if (pscf->ssl_verify) { - rc = SSL_get_verify_result(pc->ssl->connection); - - if (rc != X509_V_OK) { - ngx_log_error(NGX_LOG_ERR, pc->log, 0, - "upstream SSL certificate verify error: (%l:%s)", - rc, X509_verify_cert_error_string(rc)); - goto failed; - } - - u = s->upstream; - - if (ngx_ssl_check_host(pc, &u->ssl_name) != NGX_OK) { - ngx_log_error(NGX_LOG_ERR, pc->log, 0, - "upstream SSL certificate does not match \"%V\"", - &u->ssl_name); - goto failed; - } - } - - if (pc->write->timer_set) { - ngx_del_timer(pc->write); - } - - ngx_stream_proxy_init_upstream(s); - - return; - } - -failed: - - ngx_stream_proxy_next_upstream(s); -} - - -static void -ngx_stream_proxy_ssl_save_session(ngx_connection_t *c) -{ - ngx_stream_session_t *s; - ngx_stream_upstream_t *u; - - s = c->data; - u = s->upstream; - - u->peer.save_session(&u->peer, u->peer.data); -} - - -static ngx_int_t -ngx_stream_proxy_ssl_name(ngx_stream_session_t *s) -{ - u_char *p, *last; - ngx_str_t name; - ngx_stream_upstream_t *u; - ngx_stream_proxy_srv_conf_t *pscf; - - pscf = ngx_stream_get_module_srv_conf(s, ngx_stream_proxy_module); - - u = s->upstream; - - if (pscf->ssl_name) { - if (ngx_stream_complex_value(s, pscf->ssl_name, &name) != NGX_OK) { - return NGX_ERROR; - } - - } else { - name = u->ssl_name; - } - - if (name.len == 0) { - goto done; - } - - /* - * ssl name here may contain port, strip it for compatibility - * with the http module - */ - - p = name.data; - last = name.data + name.len; - - if (*p == '[') { - p = ngx_strlchr(p, last, ']'); - - if (p == NULL) { - p = name.data; - } - } - - p = ngx_strlchr(p, last, ':'); - - if (p != NULL) { - name.len = p - name.data; - } - - if (!pscf->ssl_server_name) { - goto done; - } - -#ifdef SSL_CTRL_SET_TLSEXT_HOSTNAME - - /* as per RFC 6066, literal IPv4 and IPv6 addresses are not permitted */ - - if (name.len == 0 || *name.data == '[') { - goto done; - } - - if (ngx_inet_addr(name.data, name.len) != INADDR_NONE) { - goto done; - } - - /* - * SSL_set_tlsext_host_name() needs a null-terminated string, - * hence we explicitly null-terminate name here - */ - - p = ngx_pnalloc(s->connection->pool, name.len + 1); - if (p == NULL) { - return NGX_ERROR; - } - - (void) ngx_cpystrn(p, name.data, name.len + 1); - - name.data = p; - - ngx_log_debug1(NGX_LOG_DEBUG_STREAM, s->connection->log, 0, - "upstream SSL server name: \"%s\"", name.data); - - if (SSL_set_tlsext_host_name(u->peer.connection->ssl->connection, - (char *) name.data) - == 0) - { - ngx_ssl_error(NGX_LOG_ERR, s->connection->log, 0, - "SSL_set_tlsext_host_name(\"%s\") failed", name.data); - return NGX_ERROR; - } - -#endif - -done: - - u->ssl_name = name; - - return NGX_OK; -} - - -static ngx_int_t -ngx_stream_proxy_ssl_certificate(ngx_stream_session_t *s) -{ - ngx_str_t cert, key; - ngx_connection_t *c; - ngx_stream_proxy_srv_conf_t *pscf; - - c = s->upstream->peer.connection; - - pscf = ngx_stream_get_module_srv_conf(s, ngx_stream_proxy_module); - - if (ngx_stream_complex_value(s, pscf->ssl_certificate, &cert) - != NGX_OK) - { - return NGX_ERROR; - } - - ngx_log_debug1(NGX_LOG_DEBUG_STREAM, c->log, 0, - "stream upstream ssl cert: \"%s\"", cert.data); - - if (*cert.data == '\0') { - return NGX_OK; - } - - if (ngx_stream_complex_value(s, pscf->ssl_certificate_key, &key) - != NGX_OK) - { - return NGX_ERROR; - } - - ngx_log_debug1(NGX_LOG_DEBUG_STREAM, c->log, 0, - "stream upstream ssl key: \"%s\"", key.data); - - if (ngx_ssl_connection_certificate(c, c->pool, &cert, &key, - pscf->ssl_certificate_cache, - pscf->ssl_passwords) - != NGX_OK) - { - return NGX_ERROR; - } - - return NGX_OK; -} - -#endif - - -static void -ngx_stream_proxy_downstream_handler(ngx_event_t *ev) -{ - ngx_stream_proxy_process_connection(ev, ev->write); -} - - -static void -ngx_stream_proxy_resolve_handler(ngx_resolver_ctx_t *ctx) -{ - ngx_stream_session_t *s; - ngx_stream_upstream_t *u; - ngx_stream_proxy_srv_conf_t *pscf; - ngx_stream_upstream_resolved_t *ur; - - s = ctx->data; - - u = s->upstream; - ur = u->resolved; - - ngx_log_debug0(NGX_LOG_DEBUG_STREAM, s->connection->log, 0, - "stream upstream resolve"); - - if (ctx->state) { - ngx_log_error(NGX_LOG_ERR, s->connection->log, 0, - "%V could not be resolved (%i: %s)", - &ctx->name, ctx->state, - ngx_resolver_strerror(ctx->state)); - - ngx_stream_proxy_finalize(s, NGX_STREAM_INTERNAL_SERVER_ERROR); - return; - } - - ur->naddrs = ctx->naddrs; - ur->addrs = ctx->addrs; - -#if (NGX_DEBUG) - { - u_char text[NGX_SOCKADDR_STRLEN]; - ngx_str_t addr; - ngx_uint_t i; - - addr.data = text; - - for (i = 0; i < ctx->naddrs; i++) { - addr.len = ngx_sock_ntop(ur->addrs[i].sockaddr, ur->addrs[i].socklen, - text, NGX_SOCKADDR_STRLEN, 0); - - ngx_log_debug1(NGX_LOG_DEBUG_STREAM, s->connection->log, 0, - "name was resolved to %V", &addr); - } - } -#endif - - if (ngx_stream_upstream_create_round_robin_peer(s, ur) != NGX_OK) { - ngx_stream_proxy_finalize(s, NGX_STREAM_INTERNAL_SERVER_ERROR); - return; - } - - ngx_resolve_name_done(ctx); - ur->ctx = NULL; - - u->peer.start_time = ngx_current_msec; - - pscf = ngx_stream_get_module_srv_conf(s, ngx_stream_proxy_module); - - if (pscf->next_upstream_tries - && u->peer.tries > pscf->next_upstream_tries) - { - u->peer.tries = pscf->next_upstream_tries; - } - - ngx_stream_proxy_connect(s); -} - - -static void -ngx_stream_proxy_upstream_handler(ngx_event_t *ev) -{ - ngx_stream_proxy_process_connection(ev, !ev->write); -} - - -static void -ngx_stream_proxy_process_connection(ngx_event_t *ev, ngx_uint_t from_upstream) -{ - ngx_connection_t *c, *pc; - ngx_log_handler_pt handler; - ngx_stream_session_t *s; - ngx_stream_upstream_t *u; - ngx_stream_proxy_srv_conf_t *pscf; - - c = ev->data; - s = c->data; - u = s->upstream; - - if (c->close) { - ngx_log_error(NGX_LOG_INFO, c->log, 0, "shutdown timeout"); - ngx_stream_proxy_finalize(s, NGX_STREAM_OK); - return; - } - - c = s->connection; - pc = u->peer.connection; - - pscf = ngx_stream_get_module_srv_conf(s, ngx_stream_proxy_module); - - if (ev->timedout) { - ev->timedout = 0; - - if (ev->delayed) { - ev->delayed = 0; - - if (!ev->ready) { - if (ngx_handle_read_event(ev, 0) != NGX_OK) { - ngx_stream_proxy_finalize(s, - NGX_STREAM_INTERNAL_SERVER_ERROR); - return; - } - - if (u->connected && !c->read->delayed && !pc->read->delayed) { - ngx_add_timer(c->write, pscf->timeout); - } - - return; - } - - } else { - if (s->connection->type == SOCK_DGRAM) { - - if (pscf->responses == NGX_MAX_INT32_VALUE - || (u->responses >= pscf->responses * u->requests)) - { - - /* - * successfully terminate timed out UDP session - * if expected number of responses was received - */ - - handler = c->log->handler; - c->log->handler = NULL; - - ngx_log_error(NGX_LOG_INFO, c->log, 0, - "udp timed out" - ", packets from/to client:%ui/%ui" - ", bytes from/to client:%O/%O" - ", bytes from/to upstream:%O/%O", - u->requests, u->responses, - s->received, c->sent, u->received, - pc ? pc->sent : 0); - - c->log->handler = handler; - - ngx_stream_proxy_finalize(s, NGX_STREAM_OK); - return; - } - - ngx_connection_error(pc, NGX_ETIMEDOUT, "upstream timed out"); - - pc->read->error = 1; - - ngx_stream_proxy_finalize(s, NGX_STREAM_BAD_GATEWAY); - - return; - } - - ngx_connection_error(c, NGX_ETIMEDOUT, "connection timed out"); - - ngx_stream_proxy_finalize(s, NGX_STREAM_OK); - - return; - } - - } else if (ev->delayed) { - - ngx_log_debug0(NGX_LOG_DEBUG_STREAM, c->log, 0, - "stream connection delayed"); - - if (ngx_handle_read_event(ev, 0) != NGX_OK) { - ngx_stream_proxy_finalize(s, NGX_STREAM_INTERNAL_SERVER_ERROR); - } - - return; - } - - if (from_upstream && !u->connected) { - return; - } - - ngx_stream_proxy_process(s, from_upstream, ev->write); -} - - -static void -ngx_stream_proxy_connect_handler(ngx_event_t *ev) -{ - ngx_connection_t *c; - ngx_stream_session_t *s; - - c = ev->data; - s = c->data; - - if (ev->timedout) { - ngx_log_error(NGX_LOG_ERR, c->log, NGX_ETIMEDOUT, "upstream timed out"); - ngx_stream_proxy_next_upstream(s); - return; - } - - ngx_del_timer(c->write); - - ngx_log_debug0(NGX_LOG_DEBUG_STREAM, c->log, 0, - "stream proxy connect upstream"); - - if (ngx_stream_proxy_test_connect(c) != NGX_OK) { - ngx_stream_proxy_next_upstream(s); - return; - } - - ngx_stream_proxy_init_upstream(s); -} - - -static ngx_int_t -ngx_stream_proxy_test_connect(ngx_connection_t *c) -{ - int err; - socklen_t len; - -#if (NGX_HAVE_KQUEUE) - - if (ngx_event_flags & NGX_USE_KQUEUE_EVENT) { - err = c->write->kq_errno ? c->write->kq_errno : c->read->kq_errno; - - if (err) { - (void) ngx_connection_error(c, err, - "kevent() reported that connect() failed"); - return NGX_ERROR; - } - - } else -#endif - { - err = 0; - len = sizeof(int); - - /* - * BSDs and Linux return 0 and set a pending error in err - * Solaris returns -1 and sets errno - */ - - if (getsockopt(c->fd, SOL_SOCKET, SO_ERROR, (void *) &err, &len) - == -1) - { - err = ngx_socket_errno; - } - - if (err) { - (void) ngx_connection_error(c, err, "connect() failed"); - return NGX_ERROR; - } - } - - return NGX_OK; -} - - -static void -ngx_stream_proxy_process(ngx_stream_session_t *s, ngx_uint_t from_upstream, - ngx_uint_t do_write) -{ - char *recv_action, *send_action; - off_t *received, limit; - size_t size, limit_rate; - ssize_t n; - ngx_buf_t *b; - ngx_int_t rc; - ngx_uint_t flags, *packets; - ngx_msec_t delay; - ngx_chain_t *cl, **ll, **out, **busy; - ngx_connection_t *c, *pc, *src, *dst; - ngx_log_handler_pt handler; - ngx_stream_upstream_t *u; - ngx_stream_proxy_srv_conf_t *pscf; - - u = s->upstream; - - c = s->connection; - pc = u->connected ? u->peer.connection : NULL; - - if (c->type == SOCK_DGRAM && (ngx_terminate || ngx_exiting)) { - - /* socket is already closed on worker shutdown */ - - handler = c->log->handler; - c->log->handler = NULL; - - ngx_log_error(NGX_LOG_INFO, c->log, 0, "disconnected on shutdown"); - - c->log->handler = handler; - - ngx_stream_proxy_finalize(s, NGX_STREAM_OK); - return; - } - - pscf = ngx_stream_get_module_srv_conf(s, ngx_stream_proxy_module); - - if (from_upstream) { - src = pc; - dst = c; - b = &u->upstream_buf; - limit_rate = u->download_rate; - received = &u->received; - packets = &u->responses; - out = &u->downstream_out; - busy = &u->downstream_busy; - recv_action = "proxying and reading from upstream"; - send_action = "proxying and sending to client"; - - } else { - src = c; - dst = pc; - b = &u->downstream_buf; - limit_rate = u->upload_rate; - received = &s->received; - packets = &u->requests; - out = &u->upstream_out; - busy = &u->upstream_busy; - recv_action = "proxying and reading from client"; - send_action = "proxying and sending to upstream"; - } - - for ( ;; ) { - - if (do_write && dst) { - - if (*out || *busy || dst->buffered) { - c->log->action = send_action; - - rc = ngx_stream_top_filter(s, *out, from_upstream); - - if (rc == NGX_ERROR) { - ngx_stream_proxy_finalize(s, NGX_STREAM_OK); - return; - } - - ngx_chain_update_chains(c->pool, &u->free, busy, out, - (ngx_buf_tag_t) &ngx_stream_proxy_module); - - if (*busy == NULL) { - b->pos = b->start; - b->last = b->start; - } - } - } - - size = b->end - b->last; - - if (size && src->read->ready && !src->read->delayed) { - - if (limit_rate) { - limit = (off_t) limit_rate * (ngx_time() - u->start_sec + 1) - - *received; - - if (limit <= 0) { - src->read->delayed = 1; - delay = (ngx_msec_t) (- limit * 1000 / limit_rate + 1); - ngx_add_timer(src->read, delay); - break; - } - - if (c->type == SOCK_STREAM && (off_t) size > limit) { - size = (size_t) limit; - } - } - - c->log->action = recv_action; - - n = src->recv(src, b->last, size); - - if (n == NGX_AGAIN) { - break; - } - - if (n == NGX_ERROR) { - src->read->eof = 1; - n = 0; - } - - if (n >= 0) { - if (limit_rate) { - delay = (ngx_msec_t) (n * 1000 / limit_rate); - - if (delay > 0) { - src->read->delayed = 1; - ngx_add_timer(src->read, delay); - } - } - - if (from_upstream) { - if (u->state->first_byte_time == (ngx_msec_t) -1) { - u->state->first_byte_time = ngx_current_msec - - u->start_time; - } - } - - for (ll = out; *ll; ll = &(*ll)->next) { /* void */ } - - cl = ngx_chain_get_free_buf(c->pool, &u->free); - if (cl == NULL) { - ngx_stream_proxy_finalize(s, - NGX_STREAM_INTERNAL_SERVER_ERROR); - return; - } - - *ll = cl; - - cl->buf->pos = b->last; - cl->buf->last = b->last + n; - cl->buf->tag = (ngx_buf_tag_t) &ngx_stream_proxy_module; - - cl->buf->temporary = (n ? 1 : 0); - cl->buf->last_buf = src->read->eof; - cl->buf->flush = !src->read->eof; - - (*packets)++; - *received += n; - b->last += n; - do_write = 1; - - continue; - } - } - - break; - } - - c->log->action = "proxying connection"; - - if (ngx_stream_proxy_test_finalize(s, from_upstream) == NGX_OK) { - return; - } - - flags = src->read->eof ? NGX_CLOSE_EVENT : 0; - - if (ngx_handle_read_event(src->read, flags) != NGX_OK) { - ngx_stream_proxy_finalize(s, NGX_STREAM_INTERNAL_SERVER_ERROR); - return; - } - - if (dst) { - - if (dst->type == SOCK_STREAM && pscf->half_close - && src->read->eof && !u->half_closed && !dst->buffered) - { - if (ngx_shutdown_socket(dst->fd, NGX_WRITE_SHUTDOWN) == -1) { - ngx_connection_error(c, ngx_socket_errno, - ngx_shutdown_socket_n " failed"); - - ngx_stream_proxy_finalize(s, NGX_STREAM_INTERNAL_SERVER_ERROR); - return; - } - - u->half_closed = 1; - ngx_log_debug1(NGX_LOG_DEBUG_STREAM, s->connection->log, 0, - "stream proxy %s socket shutdown", - from_upstream ? "client" : "upstream"); - } - - if (ngx_handle_write_event(dst->write, 0) != NGX_OK) { - ngx_stream_proxy_finalize(s, NGX_STREAM_INTERNAL_SERVER_ERROR); - return; - } - - if (!c->read->delayed && !pc->read->delayed) { - ngx_add_timer(c->write, pscf->timeout); - - } else if (c->write->timer_set) { - ngx_del_timer(c->write); - } - } -} - - -static ngx_int_t -ngx_stream_proxy_test_finalize(ngx_stream_session_t *s, - ngx_uint_t from_upstream) -{ - ngx_connection_t *c, *pc; - ngx_log_handler_pt handler; - ngx_stream_upstream_t *u; - ngx_stream_proxy_srv_conf_t *pscf; - - pscf = ngx_stream_get_module_srv_conf(s, ngx_stream_proxy_module); - - c = s->connection; - u = s->upstream; - pc = u->connected ? u->peer.connection : NULL; - - if (c->type == SOCK_DGRAM) { - - if (pscf->requests && u->requests < pscf->requests) { - return NGX_DECLINED; - } - - if (pscf->requests) { - ngx_delete_udp_connection(c); - } - - if (pscf->responses == NGX_MAX_INT32_VALUE - || u->responses < pscf->responses * u->requests) - { - return NGX_DECLINED; - } - - if (pc == NULL || c->buffered || pc->buffered) { - return NGX_DECLINED; - } - - handler = c->log->handler; - c->log->handler = NULL; - - ngx_log_error(NGX_LOG_INFO, c->log, 0, - "udp done" - ", packets from/to client:%ui/%ui" - ", bytes from/to client:%O/%O" - ", bytes from/to upstream:%O/%O", - u->requests, u->responses, - s->received, c->sent, u->received, pc ? pc->sent : 0); - - c->log->handler = handler; - - ngx_stream_proxy_finalize(s, NGX_STREAM_OK); - - return NGX_OK; - } - - /* c->type == SOCK_STREAM */ - - if (pc == NULL - || (!c->read->eof && !pc->read->eof) - || (!c->read->eof && c->buffered) - || (!pc->read->eof && pc->buffered)) - { - return NGX_DECLINED; - } - - if (pscf->half_close) { - /* avoid closing live connections until both read ends get EOF */ - if (!(c->read->eof && pc->read->eof && !c->buffered && !pc->buffered)) { - return NGX_DECLINED; - } - } - - handler = c->log->handler; - c->log->handler = NULL; - - ngx_log_error(NGX_LOG_INFO, c->log, 0, - "%s disconnected" - ", bytes from/to client:%O/%O" - ", bytes from/to upstream:%O/%O", - from_upstream ? "upstream" : "client", - s->received, c->sent, u->received, pc ? pc->sent : 0); - - c->log->handler = handler; - - ngx_stream_proxy_finalize(s, NGX_STREAM_OK); - - return NGX_OK; -} - - -static void -ngx_stream_proxy_next_upstream(ngx_stream_session_t *s) -{ - ngx_msec_t timeout; - ngx_connection_t *pc; - ngx_stream_upstream_t *u; - ngx_stream_proxy_srv_conf_t *pscf; - - ngx_log_debug0(NGX_LOG_DEBUG_STREAM, s->connection->log, 0, - "stream proxy next upstream"); - - u = s->upstream; - pc = u->peer.connection; - - if (pc && pc->buffered) { - ngx_log_error(NGX_LOG_ERR, s->connection->log, 0, - "buffered data on next upstream"); - ngx_stream_proxy_finalize(s, NGX_STREAM_INTERNAL_SERVER_ERROR); - return; - } - - if (s->connection->type == SOCK_DGRAM) { - u->upstream_out = NULL; - } - - if (u->peer.sockaddr) { - u->peer.free(&u->peer, u->peer.data, NGX_PEER_FAILED); - u->peer.sockaddr = NULL; - } - - pscf = ngx_stream_get_module_srv_conf(s, ngx_stream_proxy_module); - - timeout = pscf->next_upstream_timeout; - - if (u->peer.tries == 0 - || !pscf->next_upstream - || (timeout && ngx_current_msec - u->peer.start_time >= timeout)) - { - ngx_stream_proxy_finalize(s, NGX_STREAM_BAD_GATEWAY); - return; - } - - if (pc) { - ngx_log_debug1(NGX_LOG_DEBUG_STREAM, s->connection->log, 0, - "close proxy upstream connection: %d", pc->fd); - -#if (NGX_STREAM_SSL) - if (pc->ssl) { - pc->ssl->no_wait_shutdown = 1; - pc->ssl->no_send_shutdown = 1; - - (void) ngx_ssl_shutdown(pc); - } -#endif - - u->state->bytes_received = u->received; - u->state->bytes_sent = pc->sent; - - ngx_close_connection(pc); - u->peer.connection = NULL; - } - - ngx_stream_proxy_connect(s); -} - - -static void -ngx_stream_proxy_finalize(ngx_stream_session_t *s, ngx_uint_t rc) -{ - ngx_uint_t state; - ngx_connection_t *pc; - ngx_stream_upstream_t *u; - - ngx_log_debug1(NGX_LOG_DEBUG_STREAM, s->connection->log, 0, - "finalize stream proxy: %i", rc); - - u = s->upstream; - - if (u == NULL) { - goto noupstream; - } - - if (u->resolved && u->resolved->ctx) { - ngx_resolve_name_done(u->resolved->ctx); - u->resolved->ctx = NULL; - } - - pc = u->peer.connection; - - if (u->state) { - if (u->state->response_time == (ngx_msec_t) -1) { - u->state->response_time = ngx_current_msec - u->start_time; - } - - if (pc) { - u->state->bytes_received = u->received; - u->state->bytes_sent = pc->sent; - } - } - - if (u->peer.free && u->peer.sockaddr) { - state = 0; - - if (pc && pc->type == SOCK_DGRAM - && (pc->read->error || pc->write->error)) - { - state = NGX_PEER_FAILED; - } - - u->peer.free(&u->peer, u->peer.data, state); - u->peer.sockaddr = NULL; - } - - if (pc) { - ngx_log_debug1(NGX_LOG_DEBUG_STREAM, s->connection->log, 0, - "close stream proxy upstream connection: %d", pc->fd); - -#if (NGX_STREAM_SSL) - if (pc->ssl) { - pc->ssl->no_wait_shutdown = 1; - (void) ngx_ssl_shutdown(pc); - } -#endif - - ngx_close_connection(pc); - u->peer.connection = NULL; - } - -noupstream: - - ngx_stream_finalize_session(s, rc); -} - - -static u_char * -ngx_stream_proxy_log_error(ngx_log_t *log, u_char *buf, size_t len) -{ - u_char *p; - ngx_connection_t *pc; - ngx_stream_session_t *s; - ngx_stream_upstream_t *u; - - s = log->data; - - u = s->upstream; - - p = buf; - - if (u->peer.name) { - p = ngx_snprintf(p, len, ", upstream: \"%V\"", u->peer.name); - len -= p - buf; - } - - pc = u->peer.connection; - - p = ngx_snprintf(p, len, - ", bytes from/to client:%O/%O" - ", bytes from/to upstream:%O/%O", - s->received, s->connection->sent, - u->received, pc ? pc->sent : 0); - - return p; -} - - -static void * -ngx_stream_proxy_create_srv_conf(ngx_conf_t *cf) -{ - ngx_stream_proxy_srv_conf_t *conf; - - conf = ngx_pcalloc(cf->pool, sizeof(ngx_stream_proxy_srv_conf_t)); - if (conf == NULL) { - return NULL; - } - - /* - * set by ngx_pcalloc(): - * - * conf->ssl_protocols = 0; - * conf->ssl_ciphers = { 0, NULL }; - * conf->ssl_trusted_certificate = { 0, NULL }; - * conf->ssl_crl = { 0, NULL }; - * - * conf->ssl = NULL; - * conf->upstream = NULL; - * conf->upstream_value = NULL; - */ - - conf->connect_timeout = NGX_CONF_UNSET_MSEC; - conf->timeout = NGX_CONF_UNSET_MSEC; - conf->next_upstream_timeout = NGX_CONF_UNSET_MSEC; - conf->buffer_size = NGX_CONF_UNSET_SIZE; - conf->upload_rate = NGX_CONF_UNSET_PTR; - conf->download_rate = NGX_CONF_UNSET_PTR; - conf->requests = NGX_CONF_UNSET_UINT; - conf->responses = NGX_CONF_UNSET_UINT; - conf->next_upstream_tries = NGX_CONF_UNSET_UINT; - conf->next_upstream = NGX_CONF_UNSET; - conf->proxy_protocol = NGX_CONF_UNSET; - conf->local = NGX_CONF_UNSET_PTR; - conf->socket_keepalive = NGX_CONF_UNSET; - conf->half_close = NGX_CONF_UNSET; - -#if (NGX_STREAM_SSL) - conf->ssl_enable = NGX_CONF_UNSET; - conf->ssl_session_reuse = NGX_CONF_UNSET; - conf->ssl_name = NGX_CONF_UNSET_PTR; - conf->ssl_server_name = NGX_CONF_UNSET; - conf->ssl_verify = NGX_CONF_UNSET; - conf->ssl_verify_depth = NGX_CONF_UNSET_UINT; - conf->ssl_certificate = NGX_CONF_UNSET_PTR; - conf->ssl_certificate_key = NGX_CONF_UNSET_PTR; - conf->ssl_certificate_cache = NGX_CONF_UNSET_PTR; - conf->ssl_passwords = NGX_CONF_UNSET_PTR; - conf->ssl_conf_commands = NGX_CONF_UNSET_PTR; -#endif - - return conf; -} - - -static char * -ngx_stream_proxy_merge_srv_conf(ngx_conf_t *cf, void *parent, void *child) -{ - ngx_stream_proxy_srv_conf_t *prev = parent; - ngx_stream_proxy_srv_conf_t *conf = child; - - ngx_conf_merge_msec_value(conf->connect_timeout, - prev->connect_timeout, 60000); - - ngx_conf_merge_msec_value(conf->timeout, - prev->timeout, 10 * 60000); - - ngx_conf_merge_msec_value(conf->next_upstream_timeout, - prev->next_upstream_timeout, 0); - - ngx_conf_merge_size_value(conf->buffer_size, - prev->buffer_size, 16384); - - ngx_conf_merge_ptr_value(conf->upload_rate, prev->upload_rate, NULL); - - ngx_conf_merge_ptr_value(conf->download_rate, prev->download_rate, NULL); - - ngx_conf_merge_uint_value(conf->requests, - prev->requests, 0); - - ngx_conf_merge_uint_value(conf->responses, - prev->responses, NGX_MAX_INT32_VALUE); - - ngx_conf_merge_uint_value(conf->next_upstream_tries, - prev->next_upstream_tries, 0); - - ngx_conf_merge_value(conf->next_upstream, prev->next_upstream, 1); - - ngx_conf_merge_value(conf->proxy_protocol, prev->proxy_protocol, 0); - - ngx_conf_merge_ptr_value(conf->local, prev->local, NULL); - - ngx_conf_merge_value(conf->socket_keepalive, - prev->socket_keepalive, 0); - - ngx_conf_merge_value(conf->half_close, prev->half_close, 0); - -#if (NGX_STREAM_SSL) - - if (ngx_stream_proxy_merge_ssl(cf, conf, prev) != NGX_OK) { - return NGX_CONF_ERROR; - } - - ngx_conf_merge_value(conf->ssl_enable, prev->ssl_enable, 0); - - ngx_conf_merge_value(conf->ssl_session_reuse, - prev->ssl_session_reuse, 1); - - ngx_conf_merge_bitmask_value(conf->ssl_protocols, prev->ssl_protocols, - (NGX_CONF_BITMASK_SET|NGX_SSL_DEFAULT_PROTOCOLS)); - - ngx_conf_merge_str_value(conf->ssl_ciphers, prev->ssl_ciphers, "DEFAULT"); - - ngx_conf_merge_ptr_value(conf->ssl_name, prev->ssl_name, NULL); - - ngx_conf_merge_value(conf->ssl_server_name, prev->ssl_server_name, 0); - - ngx_conf_merge_value(conf->ssl_verify, prev->ssl_verify, 0); - - ngx_conf_merge_uint_value(conf->ssl_verify_depth, - prev->ssl_verify_depth, 1); - - ngx_conf_merge_str_value(conf->ssl_trusted_certificate, - prev->ssl_trusted_certificate, ""); - - ngx_conf_merge_str_value(conf->ssl_crl, prev->ssl_crl, ""); - - ngx_conf_merge_ptr_value(conf->ssl_certificate, - prev->ssl_certificate, NULL); - - ngx_conf_merge_ptr_value(conf->ssl_certificate_key, - prev->ssl_certificate_key, NULL); - - ngx_conf_merge_ptr_value(conf->ssl_certificate_cache, - prev->ssl_certificate_cache, NULL); - - if (ngx_stream_proxy_merge_ssl_passwords(cf, conf, prev) != NGX_OK) { - return NGX_CONF_ERROR; - } - - ngx_conf_merge_ptr_value(conf->ssl_conf_commands, - prev->ssl_conf_commands, NULL); - - if (conf->ssl_enable && ngx_stream_proxy_set_ssl(cf, conf) != NGX_OK) { - return NGX_CONF_ERROR; - } - -#endif - - return NGX_CONF_OK; -} - - -#if (NGX_STREAM_SSL) - -static ngx_int_t -ngx_stream_proxy_merge_ssl(ngx_conf_t *cf, ngx_stream_proxy_srv_conf_t *conf, - ngx_stream_proxy_srv_conf_t *prev) -{ - ngx_uint_t preserve; - - if (conf->ssl_protocols == 0 - && conf->ssl_ciphers.data == NULL - && conf->ssl_certificate == NGX_CONF_UNSET_PTR - && conf->ssl_certificate_key == NGX_CONF_UNSET_PTR - && conf->ssl_passwords == NGX_CONF_UNSET_PTR - && conf->ssl_verify == NGX_CONF_UNSET - && conf->ssl_verify_depth == NGX_CONF_UNSET_UINT - && conf->ssl_trusted_certificate.data == NULL - && conf->ssl_crl.data == NULL - && conf->ssl_session_reuse == NGX_CONF_UNSET - && conf->ssl_conf_commands == NGX_CONF_UNSET_PTR) - { - if (prev->ssl) { - conf->ssl = prev->ssl; - return NGX_OK; - } - - preserve = 1; - - } else { - preserve = 0; - } - - conf->ssl = ngx_pcalloc(cf->pool, sizeof(ngx_ssl_t)); - if (conf->ssl == NULL) { - return NGX_ERROR; - } - - conf->ssl->log = cf->log; - - /* - * special handling to preserve conf->ssl - * in the "stream" section to inherit it to all servers - */ - - if (preserve) { - prev->ssl = conf->ssl; - } - - return NGX_OK; -} - - -static ngx_int_t -ngx_stream_proxy_merge_ssl_passwords(ngx_conf_t *cf, - ngx_stream_proxy_srv_conf_t *conf, ngx_stream_proxy_srv_conf_t *prev) -{ - ngx_uint_t preserve; - - ngx_conf_merge_ptr_value(conf->ssl_passwords, prev->ssl_passwords, NULL); - - if (conf->ssl_certificate == NULL - || conf->ssl_certificate->value.len == 0 - || conf->ssl_certificate_key == NULL) - { - return NGX_OK; - } - - if (conf->ssl_certificate->lengths == NULL - && conf->ssl_certificate_key->lengths == NULL) - { - if (conf->ssl_passwords && conf->ssl_passwords->pool == NULL) { - /* un-preserve empty password list */ - conf->ssl_passwords = NULL; - } - - return NGX_OK; - } - - if (conf->ssl_passwords && conf->ssl_passwords->pool != cf->temp_pool) { - /* already preserved */ - return NGX_OK; - } - - preserve = (conf->ssl_passwords == prev->ssl_passwords) ? 1 : 0; - - conf->ssl_passwords = ngx_ssl_preserve_passwords(cf, conf->ssl_passwords); - if (conf->ssl_passwords == NULL) { - return NGX_ERROR; - } - - /* - * special handling to keep a preserved ssl_passwords copy - * in the previous configuration to inherit it to all children - */ - - if (preserve) { - prev->ssl_passwords = conf->ssl_passwords; - } - - return NGX_OK; -} - - -static ngx_int_t -ngx_stream_proxy_set_ssl(ngx_conf_t *cf, ngx_stream_proxy_srv_conf_t *pscf) -{ - ngx_pool_cleanup_t *cln; - - if (pscf->ssl->ctx) { - return NGX_OK; - } - - if (ngx_ssl_create(pscf->ssl, pscf->ssl_protocols, NULL) != NGX_OK) { - return NGX_ERROR; - } - - cln = ngx_pool_cleanup_add(cf->pool, 0); - if (cln == NULL) { - ngx_ssl_cleanup_ctx(pscf->ssl); - return NGX_ERROR; - } - - cln->handler = ngx_ssl_cleanup_ctx; - cln->data = pscf->ssl; - - if (ngx_ssl_ciphers(cf, pscf->ssl, &pscf->ssl_ciphers, 0) != NGX_OK) { - return NGX_ERROR; - } - - if (pscf->ssl_certificate - && pscf->ssl_certificate->value.len) - { - if (pscf->ssl_certificate_key == NULL) { - ngx_log_error(NGX_LOG_EMERG, cf->log, 0, - "no \"proxy_ssl_certificate_key\" is defined " - "for certificate \"%V\"", - &pscf->ssl_certificate->value); - return NGX_ERROR; - } - - if (pscf->ssl_certificate->lengths == NULL - && pscf->ssl_certificate_key->lengths == NULL) - { - if (ngx_ssl_certificate(cf, pscf->ssl, - &pscf->ssl_certificate->value, - &pscf->ssl_certificate_key->value, - pscf->ssl_passwords) - != NGX_OK) - { - return NGX_ERROR; - } - } - } - - if (pscf->ssl_verify) { - if (pscf->ssl_trusted_certificate.len == 0) { - ngx_log_error(NGX_LOG_EMERG, cf->log, 0, - "no proxy_ssl_trusted_certificate for proxy_ssl_verify"); - return NGX_ERROR; - } - - if (ngx_ssl_trusted_certificate(cf, pscf->ssl, - &pscf->ssl_trusted_certificate, - pscf->ssl_verify_depth) - != NGX_OK) - { - return NGX_ERROR; - } - - if (ngx_ssl_crl(cf, pscf->ssl, &pscf->ssl_crl) != NGX_OK) { - return NGX_ERROR; - } - } - - if (ngx_ssl_client_session_cache(cf, pscf->ssl, pscf->ssl_session_reuse) - != NGX_OK) - { - return NGX_ERROR; - } - - if (ngx_ssl_conf_commands(cf, pscf->ssl, pscf->ssl_conf_commands) - != NGX_OK) - { - return NGX_ERROR; - } - - return NGX_OK; -} - -#endif - - -static char * -ngx_stream_proxy_pass(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) -{ - ngx_stream_proxy_srv_conf_t *pscf = conf; - - ngx_url_t u; - ngx_str_t *value, *url; - ngx_stream_complex_value_t cv; - ngx_stream_core_srv_conf_t *cscf; - ngx_stream_compile_complex_value_t ccv; - - if (pscf->upstream || pscf->upstream_value) { - return "is duplicate"; - } - - cscf = ngx_stream_conf_get_module_srv_conf(cf, ngx_stream_core_module); - - cscf->handler = ngx_stream_proxy_handler; - - value = cf->args->elts; - - url = &value[1]; - - ngx_memzero(&ccv, sizeof(ngx_stream_compile_complex_value_t)); - - ccv.cf = cf; - ccv.value = url; - ccv.complex_value = &cv; - - if (ngx_stream_compile_complex_value(&ccv) != NGX_OK) { - return NGX_CONF_ERROR; - } - - if (cv.lengths) { - pscf->upstream_value = ngx_palloc(cf->pool, - sizeof(ngx_stream_complex_value_t)); - if (pscf->upstream_value == NULL) { - return NGX_CONF_ERROR; - } - - *pscf->upstream_value = cv; - - return NGX_CONF_OK; - } - - ngx_memzero(&u, sizeof(ngx_url_t)); - - u.url = *url; - u.no_resolve = 1; - - pscf->upstream = ngx_stream_upstream_add(cf, &u, 0); - if (pscf->upstream == NULL) { - return NGX_CONF_ERROR; - } - - return NGX_CONF_OK; -} - - -static char * -ngx_stream_proxy_bind(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) -{ - ngx_stream_proxy_srv_conf_t *pscf = conf; - - ngx_int_t rc; - ngx_str_t *value; - ngx_stream_complex_value_t cv; - ngx_stream_upstream_local_t *local; - ngx_stream_compile_complex_value_t ccv; - - if (pscf->local != NGX_CONF_UNSET_PTR) { - return "is duplicate"; - } - - value = cf->args->elts; - - if (cf->args->nelts == 2 && ngx_strcmp(value[1].data, "off") == 0) { - pscf->local = NULL; - return NGX_CONF_OK; - } - - ngx_memzero(&ccv, sizeof(ngx_stream_compile_complex_value_t)); - - ccv.cf = cf; - ccv.value = &value[1]; - ccv.complex_value = &cv; - - if (ngx_stream_compile_complex_value(&ccv) != NGX_OK) { - return NGX_CONF_ERROR; - } - - local = ngx_pcalloc(cf->pool, sizeof(ngx_stream_upstream_local_t)); - if (local == NULL) { - return NGX_CONF_ERROR; - } - - pscf->local = local; - - if (cv.lengths) { - local->value = ngx_palloc(cf->pool, sizeof(ngx_stream_complex_value_t)); - if (local->value == NULL) { - return NGX_CONF_ERROR; - } - - *local->value = cv; - - } else { - local->addr = ngx_palloc(cf->pool, sizeof(ngx_addr_t)); - if (local->addr == NULL) { - return NGX_CONF_ERROR; - } - - rc = ngx_parse_addr_port(cf->pool, local->addr, value[1].data, - value[1].len); - - switch (rc) { - case NGX_OK: - local->addr->name = value[1]; - break; - - case NGX_DECLINED: - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "invalid address \"%V\"", &value[1]); - /* fall through */ - - default: - return NGX_CONF_ERROR; - } - } - - if (cf->args->nelts > 2) { - if (ngx_strcmp(value[2].data, "transparent") == 0) { -#if (NGX_HAVE_TRANSPARENT_PROXY) - ngx_core_conf_t *ccf; - - ccf = (ngx_core_conf_t *) ngx_get_conf(cf->cycle->conf_ctx, - ngx_core_module); - - ccf->transparent = 1; - local->transparent = 1; -#else - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "transparent proxying is not supported " - "on this platform, ignored"); -#endif - } else { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "invalid parameter \"%V\"", &value[2]); - return NGX_CONF_ERROR; - } - } - - return NGX_CONF_OK; -} diff --git a/src/deps/src/nginx-1.30.3/src/stream/ngx_stream_realip_module.c b/src/deps/src/nginx-1.30.3/src/stream/ngx_stream_realip_module.c deleted file mode 100644 index 603f5973b8..0000000000 --- a/src/deps/src/nginx-1.30.3/src/stream/ngx_stream_realip_module.c +++ /dev/null @@ -1,401 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#include -#include -#include - - -typedef struct { - ngx_array_t *from; /* array of ngx_cidr_t */ -} ngx_stream_realip_srv_conf_t; - - -typedef struct { - struct sockaddr *sockaddr; - socklen_t socklen; - ngx_str_t addr_text; -} ngx_stream_realip_ctx_t; - - -static ngx_int_t ngx_stream_realip_handler(ngx_stream_session_t *s); -static ngx_int_t ngx_stream_realip_set_addr(ngx_stream_session_t *s, - ngx_addr_t *addr); -static char *ngx_stream_realip_from(ngx_conf_t *cf, ngx_command_t *cmd, - void *conf); -static void *ngx_stream_realip_create_srv_conf(ngx_conf_t *cf); -static char *ngx_stream_realip_merge_srv_conf(ngx_conf_t *cf, void *parent, - void *child); -static ngx_int_t ngx_stream_realip_add_variables(ngx_conf_t *cf); -static ngx_int_t ngx_stream_realip_init(ngx_conf_t *cf); - - -static ngx_int_t ngx_stream_realip_remote_addr_variable(ngx_stream_session_t *s, - ngx_stream_variable_value_t *v, uintptr_t data); -static ngx_int_t ngx_stream_realip_remote_port_variable(ngx_stream_session_t *s, - ngx_stream_variable_value_t *v, uintptr_t data); - - -static ngx_command_t ngx_stream_realip_commands[] = { - - { ngx_string("set_real_ip_from"), - NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_TAKE1, - ngx_stream_realip_from, - NGX_STREAM_SRV_CONF_OFFSET, - 0, - NULL }, - - ngx_null_command -}; - - -static ngx_stream_module_t ngx_stream_realip_module_ctx = { - ngx_stream_realip_add_variables, /* preconfiguration */ - ngx_stream_realip_init, /* postconfiguration */ - - NULL, /* create main configuration */ - NULL, /* init main configuration */ - - ngx_stream_realip_create_srv_conf, /* create server configuration */ - ngx_stream_realip_merge_srv_conf /* merge server configuration */ -}; - - -ngx_module_t ngx_stream_realip_module = { - NGX_MODULE_V1, - &ngx_stream_realip_module_ctx, /* module context */ - ngx_stream_realip_commands, /* module directives */ - NGX_STREAM_MODULE, /* module type */ - NULL, /* init master */ - NULL, /* init module */ - NULL, /* init process */ - NULL, /* init thread */ - NULL, /* exit thread */ - NULL, /* exit process */ - NULL, /* exit master */ - NGX_MODULE_V1_PADDING -}; - - -static ngx_stream_variable_t ngx_stream_realip_vars[] = { - - { ngx_string("realip_remote_addr"), NULL, - ngx_stream_realip_remote_addr_variable, 0, 0, 0 }, - - { ngx_string("realip_remote_port"), NULL, - ngx_stream_realip_remote_port_variable, 0, 0, 0 }, - - ngx_stream_null_variable -}; - - -static ngx_int_t -ngx_stream_realip_handler(ngx_stream_session_t *s) -{ - ngx_addr_t addr; - ngx_connection_t *c; - ngx_stream_realip_srv_conf_t *rscf; - - rscf = ngx_stream_get_module_srv_conf(s, ngx_stream_realip_module); - - if (rscf->from == NULL) { - return NGX_DECLINED; - } - - c = s->connection; - - if (c->proxy_protocol == NULL) { - return NGX_DECLINED; - } - - if (ngx_cidr_match(c->sockaddr, rscf->from) != NGX_OK) { - return NGX_DECLINED; - } - - if (ngx_parse_addr(c->pool, &addr, c->proxy_protocol->src_addr.data, - c->proxy_protocol->src_addr.len) - != NGX_OK) - { - return NGX_DECLINED; - } - - ngx_inet_set_port(addr.sockaddr, c->proxy_protocol->src_port); - - return ngx_stream_realip_set_addr(s, &addr); -} - - -static ngx_int_t -ngx_stream_realip_set_addr(ngx_stream_session_t *s, ngx_addr_t *addr) -{ - size_t len; - u_char *p; - u_char text[NGX_SOCKADDR_STRLEN]; - ngx_connection_t *c; - ngx_stream_realip_ctx_t *ctx; - - c = s->connection; - - ctx = ngx_palloc(c->pool, sizeof(ngx_stream_realip_ctx_t)); - if (ctx == NULL) { - return NGX_ERROR; - } - - len = ngx_sock_ntop(addr->sockaddr, addr->socklen, text, - NGX_SOCKADDR_STRLEN, 0); - if (len == 0) { - return NGX_ERROR; - } - - p = ngx_pnalloc(c->pool, len); - if (p == NULL) { - return NGX_ERROR; - } - - ngx_memcpy(p, text, len); - - ngx_stream_set_ctx(s, ctx, ngx_stream_realip_module); - - ctx->sockaddr = c->sockaddr; - ctx->socklen = c->socklen; - ctx->addr_text = c->addr_text; - - c->sockaddr = addr->sockaddr; - c->socklen = addr->socklen; - c->addr_text.len = len; - c->addr_text.data = p; - - return NGX_DECLINED; -} - - -static char * -ngx_stream_realip_from(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) -{ - ngx_stream_realip_srv_conf_t *rscf = conf; - - ngx_int_t rc; - ngx_str_t *value; - ngx_url_t u; - ngx_cidr_t c, *cidr; - ngx_uint_t i; - struct sockaddr_in *sin; -#if (NGX_HAVE_INET6) - struct sockaddr_in6 *sin6; -#endif - - value = cf->args->elts; - - if (rscf->from == NULL) { - rscf->from = ngx_array_create(cf->pool, 2, - sizeof(ngx_cidr_t)); - if (rscf->from == NULL) { - return NGX_CONF_ERROR; - } - } - -#if (NGX_HAVE_UNIX_DOMAIN) - - if (ngx_strcmp(value[1].data, "unix:") == 0) { - cidr = ngx_array_push(rscf->from); - if (cidr == NULL) { - return NGX_CONF_ERROR; - } - - cidr->family = AF_UNIX; - return NGX_CONF_OK; - } - -#endif - - rc = ngx_ptocidr(&value[1], &c); - - if (rc != NGX_ERROR) { - if (rc == NGX_DONE) { - ngx_conf_log_error(NGX_LOG_WARN, cf, 0, - "low address bits of %V are meaningless", - &value[1]); - } - - cidr = ngx_array_push(rscf->from); - if (cidr == NULL) { - return NGX_CONF_ERROR; - } - - *cidr = c; - - return NGX_CONF_OK; - } - - ngx_memzero(&u, sizeof(ngx_url_t)); - u.host = value[1]; - - if (ngx_inet_resolve_host(cf->pool, &u) != NGX_OK) { - if (u.err) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "%s in set_real_ip_from \"%V\"", - u.err, &u.host); - } - - return NGX_CONF_ERROR; - } - - cidr = ngx_array_push_n(rscf->from, u.naddrs); - if (cidr == NULL) { - return NGX_CONF_ERROR; - } - - ngx_memzero(cidr, u.naddrs * sizeof(ngx_cidr_t)); - - for (i = 0; i < u.naddrs; i++) { - cidr[i].family = u.addrs[i].sockaddr->sa_family; - - switch (cidr[i].family) { - -#if (NGX_HAVE_INET6) - case AF_INET6: - sin6 = (struct sockaddr_in6 *) u.addrs[i].sockaddr; - cidr[i].u.in6.addr = sin6->sin6_addr; - ngx_memset(cidr[i].u.in6.mask.s6_addr, 0xff, 16); - break; -#endif - - default: /* AF_INET */ - sin = (struct sockaddr_in *) u.addrs[i].sockaddr; - cidr[i].u.in.addr = sin->sin_addr.s_addr; - cidr[i].u.in.mask = 0xffffffff; - break; - } - } - - return NGX_CONF_OK; -} - - -static void * -ngx_stream_realip_create_srv_conf(ngx_conf_t *cf) -{ - ngx_stream_realip_srv_conf_t *conf; - - conf = ngx_pcalloc(cf->pool, sizeof(ngx_stream_realip_srv_conf_t)); - if (conf == NULL) { - return NULL; - } - - /* - * set by ngx_pcalloc(): - * - * conf->from = NULL; - */ - - return conf; -} - - -static char * -ngx_stream_realip_merge_srv_conf(ngx_conf_t *cf, void *parent, void *child) -{ - ngx_stream_realip_srv_conf_t *prev = parent; - ngx_stream_realip_srv_conf_t *conf = child; - - if (conf->from == NULL) { - conf->from = prev->from; - } - - return NGX_CONF_OK; -} - - -static ngx_int_t -ngx_stream_realip_add_variables(ngx_conf_t *cf) -{ - ngx_stream_variable_t *var, *v; - - for (v = ngx_stream_realip_vars; v->name.len; v++) { - var = ngx_stream_add_variable(cf, &v->name, v->flags); - if (var == NULL) { - return NGX_ERROR; - } - - var->get_handler = v->get_handler; - var->data = v->data; - } - - return NGX_OK; -} - - -static ngx_int_t -ngx_stream_realip_init(ngx_conf_t *cf) -{ - ngx_stream_handler_pt *h; - ngx_stream_core_main_conf_t *cmcf; - - cmcf = ngx_stream_conf_get_module_main_conf(cf, ngx_stream_core_module); - - h = ngx_array_push(&cmcf->phases[NGX_STREAM_POST_ACCEPT_PHASE].handlers); - if (h == NULL) { - return NGX_ERROR; - } - - *h = ngx_stream_realip_handler; - - return NGX_OK; -} - - -static ngx_int_t -ngx_stream_realip_remote_addr_variable(ngx_stream_session_t *s, - ngx_stream_variable_value_t *v, uintptr_t data) -{ - ngx_str_t *addr_text; - ngx_stream_realip_ctx_t *ctx; - - ctx = ngx_stream_get_module_ctx(s, ngx_stream_realip_module); - - addr_text = ctx ? &ctx->addr_text : &s->connection->addr_text; - - v->len = addr_text->len; - v->valid = 1; - v->no_cacheable = 0; - v->not_found = 0; - v->data = addr_text->data; - - return NGX_OK; -} - - -static ngx_int_t -ngx_stream_realip_remote_port_variable(ngx_stream_session_t *s, - ngx_stream_variable_value_t *v, uintptr_t data) -{ - ngx_uint_t port; - struct sockaddr *sa; - ngx_stream_realip_ctx_t *ctx; - - ctx = ngx_stream_get_module_ctx(s, ngx_stream_realip_module); - - sa = ctx ? ctx->sockaddr : s->connection->sockaddr; - - v->len = 0; - v->valid = 1; - v->no_cacheable = 0; - v->not_found = 0; - - v->data = ngx_pnalloc(s->connection->pool, sizeof("65535") - 1); - if (v->data == NULL) { - return NGX_ERROR; - } - - port = ngx_inet_get_port(sa); - - if (port > 0 && port < 65536) { - v->len = ngx_sprintf(v->data, "%ui", port) - v->data; - } - - return NGX_OK; -} diff --git a/src/deps/src/nginx-1.30.3/src/stream/ngx_stream_return_module.c b/src/deps/src/nginx-1.30.3/src/stream/ngx_stream_return_module.c deleted file mode 100644 index 9301b025a9..0000000000 --- a/src/deps/src/nginx-1.30.3/src/stream/ngx_stream_return_module.c +++ /dev/null @@ -1,218 +0,0 @@ - -/* - * Copyright (C) Roman Arutyunyan - * Copyright (C) Nginx, Inc. - */ - - -#include -#include -#include - - -typedef struct { - ngx_stream_complex_value_t text; -} ngx_stream_return_srv_conf_t; - - -typedef struct { - ngx_chain_t *out; -} ngx_stream_return_ctx_t; - - -static void ngx_stream_return_handler(ngx_stream_session_t *s); -static void ngx_stream_return_write_handler(ngx_event_t *ev); - -static void *ngx_stream_return_create_srv_conf(ngx_conf_t *cf); -static char *ngx_stream_return(ngx_conf_t *cf, ngx_command_t *cmd, void *conf); - - -static ngx_command_t ngx_stream_return_commands[] = { - - { ngx_string("return"), - NGX_STREAM_SRV_CONF|NGX_CONF_TAKE1, - ngx_stream_return, - NGX_STREAM_SRV_CONF_OFFSET, - 0, - NULL }, - - ngx_null_command -}; - - -static ngx_stream_module_t ngx_stream_return_module_ctx = { - NULL, /* preconfiguration */ - NULL, /* postconfiguration */ - - NULL, /* create main configuration */ - NULL, /* init main configuration */ - - ngx_stream_return_create_srv_conf, /* create server configuration */ - NULL /* merge server configuration */ -}; - - -ngx_module_t ngx_stream_return_module = { - NGX_MODULE_V1, - &ngx_stream_return_module_ctx, /* module context */ - ngx_stream_return_commands, /* module directives */ - NGX_STREAM_MODULE, /* module type */ - NULL, /* init master */ - NULL, /* init module */ - NULL, /* init process */ - NULL, /* init thread */ - NULL, /* exit thread */ - NULL, /* exit process */ - NULL, /* exit master */ - NGX_MODULE_V1_PADDING -}; - - -static void -ngx_stream_return_handler(ngx_stream_session_t *s) -{ - ngx_str_t text; - ngx_buf_t *b; - ngx_connection_t *c; - ngx_stream_return_ctx_t *ctx; - ngx_stream_return_srv_conf_t *rscf; - - c = s->connection; - - c->log->action = "returning text"; - - rscf = ngx_stream_get_module_srv_conf(s, ngx_stream_return_module); - - if (ngx_stream_complex_value(s, &rscf->text, &text) != NGX_OK) { - ngx_stream_finalize_session(s, NGX_STREAM_INTERNAL_SERVER_ERROR); - return; - } - - ngx_log_debug1(NGX_LOG_DEBUG_STREAM, c->log, 0, - "stream return text: \"%V\"", &text); - - if (text.len == 0) { - ngx_stream_finalize_session(s, NGX_STREAM_OK); - return; - } - - ctx = ngx_pcalloc(c->pool, sizeof(ngx_stream_return_ctx_t)); - if (ctx == NULL) { - ngx_stream_finalize_session(s, NGX_STREAM_INTERNAL_SERVER_ERROR); - return; - } - - ngx_stream_set_ctx(s, ctx, ngx_stream_return_module); - - b = ngx_calloc_buf(c->pool); - if (b == NULL) { - ngx_stream_finalize_session(s, NGX_STREAM_INTERNAL_SERVER_ERROR); - return; - } - - b->memory = 1; - b->pos = text.data; - b->last = text.data + text.len; - b->last_buf = 1; - - ctx->out = ngx_alloc_chain_link(c->pool); - if (ctx->out == NULL) { - ngx_stream_finalize_session(s, NGX_STREAM_INTERNAL_SERVER_ERROR); - return; - } - - ctx->out->buf = b; - ctx->out->next = NULL; - - c->write->handler = ngx_stream_return_write_handler; - - ngx_stream_return_write_handler(c->write); -} - - -static void -ngx_stream_return_write_handler(ngx_event_t *ev) -{ - ngx_connection_t *c; - ngx_stream_session_t *s; - ngx_stream_return_ctx_t *ctx; - - c = ev->data; - s = c->data; - - if (ev->timedout) { - ngx_connection_error(c, NGX_ETIMEDOUT, "connection timed out"); - ngx_stream_finalize_session(s, NGX_STREAM_OK); - return; - } - - ctx = ngx_stream_get_module_ctx(s, ngx_stream_return_module); - - if (ngx_stream_top_filter(s, ctx->out, 1) == NGX_ERROR) { - ngx_stream_finalize_session(s, NGX_STREAM_INTERNAL_SERVER_ERROR); - return; - } - - ctx->out = NULL; - - if (!c->buffered) { - ngx_log_debug0(NGX_LOG_DEBUG_STREAM, c->log, 0, - "stream return done sending"); - ngx_stream_finalize_session(s, NGX_STREAM_OK); - return; - } - - if (ngx_handle_write_event(ev, 0) != NGX_OK) { - ngx_stream_finalize_session(s, NGX_STREAM_INTERNAL_SERVER_ERROR); - return; - } - - ngx_add_timer(ev, 5000); -} - - -static void * -ngx_stream_return_create_srv_conf(ngx_conf_t *cf) -{ - ngx_stream_return_srv_conf_t *conf; - - conf = ngx_pcalloc(cf->pool, sizeof(ngx_stream_return_srv_conf_t)); - if (conf == NULL) { - return NULL; - } - - return conf; -} - - -static char * -ngx_stream_return(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) -{ - ngx_stream_return_srv_conf_t *rscf = conf; - - ngx_str_t *value; - ngx_stream_core_srv_conf_t *cscf; - ngx_stream_compile_complex_value_t ccv; - - if (rscf->text.value.data) { - return "is duplicate"; - } - - value = cf->args->elts; - - ngx_memzero(&ccv, sizeof(ngx_stream_compile_complex_value_t)); - - ccv.cf = cf; - ccv.value = &value[1]; - ccv.complex_value = &rscf->text; - - if (ngx_stream_compile_complex_value(&ccv) != NGX_OK) { - return NGX_CONF_ERROR; - } - - cscf = ngx_stream_conf_get_module_srv_conf(cf, ngx_stream_core_module); - - cscf->handler = ngx_stream_return_handler; - - return NGX_CONF_OK; -} diff --git a/src/deps/src/nginx-1.30.3/src/stream/ngx_stream_script.c b/src/deps/src/nginx-1.30.3/src/stream/ngx_stream_script.c deleted file mode 100644 index c447e152f8..0000000000 --- a/src/deps/src/nginx-1.30.3/src/stream/ngx_stream_script.c +++ /dev/null @@ -1,1021 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#include -#include -#include - - -static ngx_int_t ngx_stream_script_init_arrays( - ngx_stream_script_compile_t *sc); -static ngx_int_t ngx_stream_script_done(ngx_stream_script_compile_t *sc); -static ngx_int_t ngx_stream_script_add_copy_code( - ngx_stream_script_compile_t *sc, ngx_str_t *value, ngx_uint_t last); -static ngx_int_t ngx_stream_script_add_var_code( - ngx_stream_script_compile_t *sc, ngx_str_t *name); -#if (NGX_PCRE) -static ngx_int_t ngx_stream_script_add_capture_code( - ngx_stream_script_compile_t *sc, ngx_uint_t n); -#endif -static ngx_int_t ngx_stream_script_add_full_name_code( - ngx_stream_script_compile_t *sc); -static size_t ngx_stream_script_full_name_len_code( - ngx_stream_script_engine_t *e); -static void ngx_stream_script_full_name_code(ngx_stream_script_engine_t *e); - - -#define ngx_stream_script_exit (u_char *) &ngx_stream_script_exit_code - -static uintptr_t ngx_stream_script_exit_code = (uintptr_t) NULL; - - -void -ngx_stream_script_flush_complex_value(ngx_stream_session_t *s, - ngx_stream_complex_value_t *val) -{ - ngx_uint_t *index; - - index = val->flushes; - - if (index) { - while (*index != (ngx_uint_t) -1) { - - if (s->variables[*index].no_cacheable) { - s->variables[*index].valid = 0; - s->variables[*index].not_found = 0; - } - - index++; - } - } -} - - -ngx_int_t -ngx_stream_complex_value(ngx_stream_session_t *s, - ngx_stream_complex_value_t *val, ngx_str_t *value) -{ - size_t len; - ngx_stream_script_code_pt code; - ngx_stream_script_engine_t e; - ngx_stream_script_len_code_pt lcode; - - if (val->lengths == NULL) { - *value = val->value; - return NGX_OK; - } - - ngx_stream_script_flush_complex_value(s, val); - - ngx_memzero(&e, sizeof(ngx_stream_script_engine_t)); - - e.ip = val->lengths; - e.session = s; - e.flushed = 1; - - len = 0; - - while (*(uintptr_t *) e.ip) { - lcode = *(ngx_stream_script_len_code_pt *) e.ip; - len += lcode(&e); - } - - value->len = len; - value->data = ngx_pnalloc(s->connection->pool, len); - if (value->data == NULL) { - return NGX_ERROR; - } - - e.ip = val->values; - e.pos = value->data; - e.buf = *value; - - while (*(uintptr_t *) e.ip) { - code = *(ngx_stream_script_code_pt *) e.ip; - code((ngx_stream_script_engine_t *) &e); - } - - *value = e.buf; - - return NGX_OK; -} - - -size_t -ngx_stream_complex_value_size(ngx_stream_session_t *s, - ngx_stream_complex_value_t *val, size_t default_value) -{ - size_t size; - ngx_str_t value; - - if (val == NULL) { - return default_value; - } - - if (val->lengths == NULL) { - return val->u.size; - } - - if (ngx_stream_complex_value(s, val, &value) != NGX_OK) { - return default_value; - } - - size = ngx_parse_size(&value); - - if (size == (size_t) NGX_ERROR) { - ngx_log_error(NGX_LOG_ERR, s->connection->log, 0, - "invalid size \"%V\"", &value); - return default_value; - } - - return size; -} - - -ngx_int_t -ngx_stream_compile_complex_value(ngx_stream_compile_complex_value_t *ccv) -{ - ngx_str_t *v; - ngx_uint_t i, n, nv, nc; - ngx_array_t flushes, lengths, values, *pf, *pl, *pv; - ngx_stream_script_compile_t sc; - - v = ccv->value; - - nv = 0; - nc = 0; - - for (i = 0; i < v->len; i++) { - if (v->data[i] == '$') { - if (v->data[i + 1] >= '1' && v->data[i + 1] <= '9') { - nc++; - - } else { - nv++; - } - } - } - - if ((v->len == 0 || v->data[0] != '$') - && (ccv->conf_prefix || ccv->root_prefix)) - { - if (ngx_conf_full_name(ccv->cf->cycle, v, ccv->conf_prefix) != NGX_OK) { - return NGX_ERROR; - } - - ccv->conf_prefix = 0; - ccv->root_prefix = 0; - } - - ccv->complex_value->value = *v; - ccv->complex_value->flushes = NULL; - ccv->complex_value->lengths = NULL; - ccv->complex_value->values = NULL; - - if (nv == 0 && nc == 0) { - return NGX_OK; - } - - n = nv + 1; - - if (ngx_array_init(&flushes, ccv->cf->pool, n, sizeof(ngx_uint_t)) - != NGX_OK) - { - return NGX_ERROR; - } - - n = nv * (2 * sizeof(ngx_stream_script_copy_code_t) - + sizeof(ngx_stream_script_var_code_t)) - + sizeof(uintptr_t); - - if (ngx_array_init(&lengths, ccv->cf->pool, n, 1) != NGX_OK) { - return NGX_ERROR; - } - - n = (nv * (2 * sizeof(ngx_stream_script_copy_code_t) - + sizeof(ngx_stream_script_var_code_t)) - + sizeof(uintptr_t) - + v->len - + sizeof(uintptr_t) - 1) - & ~(sizeof(uintptr_t) - 1); - - if (ngx_array_init(&values, ccv->cf->pool, n, 1) != NGX_OK) { - return NGX_ERROR; - } - - pf = &flushes; - pl = &lengths; - pv = &values; - - ngx_memzero(&sc, sizeof(ngx_stream_script_compile_t)); - - sc.cf = ccv->cf; - sc.source = v; - sc.flushes = &pf; - sc.lengths = &pl; - sc.values = &pv; - sc.complete_lengths = 1; - sc.complete_values = 1; - sc.zero = ccv->zero; - sc.conf_prefix = ccv->conf_prefix; - sc.root_prefix = ccv->root_prefix; - - if (ngx_stream_script_compile(&sc) != NGX_OK) { - return NGX_ERROR; - } - - if (flushes.nelts) { - ccv->complex_value->flushes = flushes.elts; - ccv->complex_value->flushes[flushes.nelts] = (ngx_uint_t) -1; - } - - ccv->complex_value->lengths = lengths.elts; - ccv->complex_value->values = values.elts; - - return NGX_OK; -} - - -char * -ngx_stream_set_complex_value_slot(ngx_conf_t *cf, ngx_command_t *cmd, - void *conf) -{ - char *p = conf; - - ngx_str_t *value; - ngx_stream_complex_value_t **cv; - ngx_stream_compile_complex_value_t ccv; - - cv = (ngx_stream_complex_value_t **) (p + cmd->offset); - - if (*cv != NGX_CONF_UNSET_PTR && *cv != NULL) { - return "is duplicate"; - } - - *cv = ngx_palloc(cf->pool, sizeof(ngx_stream_complex_value_t)); - if (*cv == NULL) { - return NGX_CONF_ERROR; - } - - value = cf->args->elts; - - ngx_memzero(&ccv, sizeof(ngx_stream_compile_complex_value_t)); - - ccv.cf = cf; - ccv.value = &value[1]; - ccv.complex_value = *cv; - - if (ngx_stream_compile_complex_value(&ccv) != NGX_OK) { - return NGX_CONF_ERROR; - } - - return NGX_CONF_OK; -} - - -char * -ngx_stream_set_complex_value_zero_slot(ngx_conf_t *cf, ngx_command_t *cmd, - void *conf) -{ - char *p = conf; - - ngx_str_t *value; - ngx_stream_complex_value_t **cv; - ngx_stream_compile_complex_value_t ccv; - - cv = (ngx_stream_complex_value_t **) (p + cmd->offset); - - if (*cv != NGX_CONF_UNSET_PTR) { - return "is duplicate"; - } - - *cv = ngx_palloc(cf->pool, sizeof(ngx_stream_complex_value_t)); - if (*cv == NULL) { - return NGX_CONF_ERROR; - } - - value = cf->args->elts; - - ngx_memzero(&ccv, sizeof(ngx_stream_compile_complex_value_t)); - - ccv.cf = cf; - ccv.value = &value[1]; - ccv.complex_value = *cv; - ccv.zero = 1; - - if (ngx_stream_compile_complex_value(&ccv) != NGX_OK) { - return NGX_CONF_ERROR; - } - - return NGX_CONF_OK; -} - - -char * -ngx_stream_set_complex_value_size_slot(ngx_conf_t *cf, ngx_command_t *cmd, - void *conf) -{ - char *p = conf; - - char *rv; - ngx_stream_complex_value_t *cv; - - rv = ngx_stream_set_complex_value_slot(cf, cmd, conf); - - if (rv != NGX_CONF_OK) { - return rv; - } - - cv = *(ngx_stream_complex_value_t **) (p + cmd->offset); - - if (cv->lengths) { - return NGX_CONF_OK; - } - - cv->u.size = ngx_parse_size(&cv->value); - if (cv->u.size == (size_t) NGX_ERROR) { - return "invalid value"; - } - - return NGX_CONF_OK; -} - - -ngx_uint_t -ngx_stream_script_variables_count(ngx_str_t *value) -{ - ngx_uint_t i, n; - - for (n = 0, i = 0; i < value->len; i++) { - if (value->data[i] == '$') { - n++; - } - } - - return n; -} - - -ngx_int_t -ngx_stream_script_compile(ngx_stream_script_compile_t *sc) -{ - u_char ch; - ngx_str_t name; - ngx_uint_t i, bracket; - - if (ngx_stream_script_init_arrays(sc) != NGX_OK) { - return NGX_ERROR; - } - - for (i = 0; i < sc->source->len; /* void */ ) { - - name.len = 0; - - if (sc->source->data[i] == '$') { - - if (++i == sc->source->len) { - goto invalid_variable; - } - - if (sc->source->data[i] >= '1' && sc->source->data[i] <= '9') { -#if (NGX_PCRE) - ngx_uint_t n; - - n = sc->source->data[i] - '0'; - - if (ngx_stream_script_add_capture_code(sc, n) != NGX_OK) { - return NGX_ERROR; - } - - i++; - - continue; -#else - ngx_conf_log_error(NGX_LOG_EMERG, sc->cf, 0, - "using variable \"$%c\" requires " - "PCRE library", sc->source->data[i]); - return NGX_ERROR; -#endif - } - - if (sc->source->data[i] == '{') { - bracket = 1; - - if (++i == sc->source->len) { - goto invalid_variable; - } - - name.data = &sc->source->data[i]; - - } else { - bracket = 0; - name.data = &sc->source->data[i]; - } - - for ( /* void */ ; i < sc->source->len; i++, name.len++) { - ch = sc->source->data[i]; - - if (ch == '}' && bracket) { - i++; - bracket = 0; - break; - } - - if ((ch >= 'A' && ch <= 'Z') - || (ch >= 'a' && ch <= 'z') - || (ch >= '0' && ch <= '9') - || ch == '_') - { - continue; - } - - break; - } - - if (bracket) { - ngx_conf_log_error(NGX_LOG_EMERG, sc->cf, 0, - "the closing bracket in \"%V\" " - "variable is missing", &name); - return NGX_ERROR; - } - - if (name.len == 0) { - goto invalid_variable; - } - - sc->variables++; - - if (ngx_stream_script_add_var_code(sc, &name) != NGX_OK) { - return NGX_ERROR; - } - - continue; - } - - name.data = &sc->source->data[i]; - - while (i < sc->source->len) { - - if (sc->source->data[i] == '$') { - break; - } - - i++; - name.len++; - } - - sc->size += name.len; - - if (ngx_stream_script_add_copy_code(sc, &name, (i == sc->source->len)) - != NGX_OK) - { - return NGX_ERROR; - } - } - - return ngx_stream_script_done(sc); - -invalid_variable: - - ngx_conf_log_error(NGX_LOG_EMERG, sc->cf, 0, "invalid variable name"); - - return NGX_ERROR; -} - - -u_char * -ngx_stream_script_run(ngx_stream_session_t *s, ngx_str_t *value, - void *code_lengths, size_t len, void *code_values) -{ - ngx_uint_t i; - ngx_stream_script_code_pt code; - ngx_stream_script_engine_t e; - ngx_stream_core_main_conf_t *cmcf; - ngx_stream_script_len_code_pt lcode; - - cmcf = ngx_stream_get_module_main_conf(s, ngx_stream_core_module); - - for (i = 0; i < cmcf->variables.nelts; i++) { - if (s->variables[i].no_cacheable) { - s->variables[i].valid = 0; - s->variables[i].not_found = 0; - } - } - - ngx_memzero(&e, sizeof(ngx_stream_script_engine_t)); - - e.ip = code_lengths; - e.session = s; - e.flushed = 1; - - while (*(uintptr_t *) e.ip) { - lcode = *(ngx_stream_script_len_code_pt *) e.ip; - len += lcode(&e); - } - - - value->len = len; - value->data = ngx_pnalloc(s->connection->pool, len); - if (value->data == NULL) { - return NULL; - } - - e.ip = code_values; - e.pos = value->data; - - while (*(uintptr_t *) e.ip) { - code = *(ngx_stream_script_code_pt *) e.ip; - code((ngx_stream_script_engine_t *) &e); - } - - return e.pos; -} - - -void -ngx_stream_script_flush_no_cacheable_variables(ngx_stream_session_t *s, - ngx_array_t *indices) -{ - ngx_uint_t n, *index; - - if (indices) { - index = indices->elts; - for (n = 0; n < indices->nelts; n++) { - if (s->variables[index[n]].no_cacheable) { - s->variables[index[n]].valid = 0; - s->variables[index[n]].not_found = 0; - } - } - } -} - - -static ngx_int_t -ngx_stream_script_init_arrays(ngx_stream_script_compile_t *sc) -{ - ngx_uint_t n; - - if (sc->flushes && *sc->flushes == NULL) { - n = sc->variables ? sc->variables : 1; - *sc->flushes = ngx_array_create(sc->cf->pool, n, sizeof(ngx_uint_t)); - if (*sc->flushes == NULL) { - return NGX_ERROR; - } - } - - if (*sc->lengths == NULL) { - n = sc->variables * (2 * sizeof(ngx_stream_script_copy_code_t) - + sizeof(ngx_stream_script_var_code_t)) - + sizeof(uintptr_t); - - *sc->lengths = ngx_array_create(sc->cf->pool, n, 1); - if (*sc->lengths == NULL) { - return NGX_ERROR; - } - } - - if (*sc->values == NULL) { - n = (sc->variables * (2 * sizeof(ngx_stream_script_copy_code_t) - + sizeof(ngx_stream_script_var_code_t)) - + sizeof(uintptr_t) - + sc->source->len - + sizeof(uintptr_t) - 1) - & ~(sizeof(uintptr_t) - 1); - - *sc->values = ngx_array_create(sc->cf->pool, n, 1); - if (*sc->values == NULL) { - return NGX_ERROR; - } - } - - sc->variables = 0; - - return NGX_OK; -} - - -static ngx_int_t -ngx_stream_script_done(ngx_stream_script_compile_t *sc) -{ - ngx_str_t zero; - uintptr_t *code; - - if (sc->zero) { - - zero.len = 1; - zero.data = (u_char *) "\0"; - - if (ngx_stream_script_add_copy_code(sc, &zero, 0) != NGX_OK) { - return NGX_ERROR; - } - } - - if (sc->conf_prefix || sc->root_prefix) { - if (ngx_stream_script_add_full_name_code(sc) != NGX_OK) { - return NGX_ERROR; - } - } - - if (sc->complete_lengths) { - code = ngx_stream_script_add_code(*sc->lengths, sizeof(uintptr_t), - NULL); - if (code == NULL) { - return NGX_ERROR; - } - - *code = (uintptr_t) NULL; - } - - if (sc->complete_values) { - code = ngx_stream_script_add_code(*sc->values, sizeof(uintptr_t), - &sc->main); - if (code == NULL) { - return NGX_ERROR; - } - - *code = (uintptr_t) NULL; - } - - return NGX_OK; -} - - -void * -ngx_stream_script_add_code(ngx_array_t *codes, size_t size, void *code) -{ - u_char *elts, **p; - void *new; - - elts = codes->elts; - - new = ngx_array_push_n(codes, size); - if (new == NULL) { - return NULL; - } - - if (code) { - if (elts != codes->elts) { - p = code; - *p += (u_char *) codes->elts - elts; - } - } - - return new; -} - - -static ngx_int_t -ngx_stream_script_add_copy_code(ngx_stream_script_compile_t *sc, - ngx_str_t *value, ngx_uint_t last) -{ - u_char *p; - size_t size, len, zero; - ngx_stream_script_copy_code_t *code; - - zero = (sc->zero && last); - len = value->len + zero; - - code = ngx_stream_script_add_code(*sc->lengths, - sizeof(ngx_stream_script_copy_code_t), - NULL); - if (code == NULL) { - return NGX_ERROR; - } - - code->code = (ngx_stream_script_code_pt) (void *) - ngx_stream_script_copy_len_code; - code->len = len; - - size = (sizeof(ngx_stream_script_copy_code_t) + len + sizeof(uintptr_t) - 1) - & ~(sizeof(uintptr_t) - 1); - - code = ngx_stream_script_add_code(*sc->values, size, &sc->main); - if (code == NULL) { - return NGX_ERROR; - } - - code->code = ngx_stream_script_copy_code; - code->len = len; - - p = ngx_cpymem((u_char *) code + sizeof(ngx_stream_script_copy_code_t), - value->data, value->len); - - if (zero) { - *p = '\0'; - sc->zero = 0; - } - - return NGX_OK; -} - - -size_t -ngx_stream_script_copy_len_code(ngx_stream_script_engine_t *e) -{ - ngx_stream_script_copy_code_t *code; - - code = (ngx_stream_script_copy_code_t *) e->ip; - - e->ip += sizeof(ngx_stream_script_copy_code_t); - - return code->len; -} - - -void -ngx_stream_script_copy_code(ngx_stream_script_engine_t *e) -{ - u_char *p; - ngx_stream_script_copy_code_t *code; - - code = (ngx_stream_script_copy_code_t *) e->ip; - - p = e->pos; - - if (!e->skip) { - e->pos = ngx_copy(p, e->ip + sizeof(ngx_stream_script_copy_code_t), - code->len); - } - - e->ip += sizeof(ngx_stream_script_copy_code_t) - + ((code->len + sizeof(uintptr_t) - 1) & ~(sizeof(uintptr_t) - 1)); - - ngx_log_debug2(NGX_LOG_DEBUG_STREAM, e->session->connection->log, 0, - "stream script copy: \"%*s\"", e->pos - p, p); -} - - -static ngx_int_t -ngx_stream_script_add_var_code(ngx_stream_script_compile_t *sc, ngx_str_t *name) -{ - ngx_int_t index, *p; - ngx_stream_script_var_code_t *code; - - index = ngx_stream_get_variable_index(sc->cf, name); - - if (index == NGX_ERROR) { - return NGX_ERROR; - } - - if (sc->flushes) { - p = ngx_array_push(*sc->flushes); - if (p == NULL) { - return NGX_ERROR; - } - - *p = index; - } - - code = ngx_stream_script_add_code(*sc->lengths, - sizeof(ngx_stream_script_var_code_t), - NULL); - if (code == NULL) { - return NGX_ERROR; - } - - code->code = (ngx_stream_script_code_pt) (void *) - ngx_stream_script_copy_var_len_code; - code->index = (uintptr_t) index; - - code = ngx_stream_script_add_code(*sc->values, - sizeof(ngx_stream_script_var_code_t), - &sc->main); - if (code == NULL) { - return NGX_ERROR; - } - - code->code = ngx_stream_script_copy_var_code; - code->index = (uintptr_t) index; - - return NGX_OK; -} - - -size_t -ngx_stream_script_copy_var_len_code(ngx_stream_script_engine_t *e) -{ - ngx_stream_variable_value_t *value; - ngx_stream_script_var_code_t *code; - - code = (ngx_stream_script_var_code_t *) e->ip; - - e->ip += sizeof(ngx_stream_script_var_code_t); - - if (e->flushed) { - value = ngx_stream_get_indexed_variable(e->session, code->index); - - } else { - value = ngx_stream_get_flushed_variable(e->session, code->index); - } - - if (value && !value->not_found) { - return value->len; - } - - return 0; -} - - -void -ngx_stream_script_copy_var_code(ngx_stream_script_engine_t *e) -{ - u_char *p; - ngx_stream_variable_value_t *value; - ngx_stream_script_var_code_t *code; - - code = (ngx_stream_script_var_code_t *) e->ip; - - e->ip += sizeof(ngx_stream_script_var_code_t); - - if (!e->skip) { - - if (e->flushed) { - value = ngx_stream_get_indexed_variable(e->session, code->index); - - } else { - value = ngx_stream_get_flushed_variable(e->session, code->index); - } - - if (value && !value->not_found) { - p = e->pos; - e->pos = ngx_copy(p, value->data, value->len); - - ngx_log_debug2(NGX_LOG_DEBUG_STREAM, - e->session->connection->log, 0, - "stream script var: \"%*s\"", e->pos - p, p); - } - } -} - - -#if (NGX_PCRE) - -static ngx_int_t -ngx_stream_script_add_capture_code(ngx_stream_script_compile_t *sc, - ngx_uint_t n) -{ - ngx_stream_script_copy_capture_code_t *code; - - code = ngx_stream_script_add_code(*sc->lengths, - sizeof(ngx_stream_script_copy_capture_code_t), - NULL); - if (code == NULL) { - return NGX_ERROR; - } - - code->code = (ngx_stream_script_code_pt) (void *) - ngx_stream_script_copy_capture_len_code; - code->n = 2 * n; - - - code = ngx_stream_script_add_code(*sc->values, - sizeof(ngx_stream_script_copy_capture_code_t), - &sc->main); - if (code == NULL) { - return NGX_ERROR; - } - - code->code = ngx_stream_script_copy_capture_code; - code->n = 2 * n; - - if (sc->ncaptures < n) { - sc->ncaptures = n; - } - - return NGX_OK; -} - - -size_t -ngx_stream_script_copy_capture_len_code(ngx_stream_script_engine_t *e) -{ - int *cap; - ngx_uint_t n; - ngx_stream_session_t *s; - ngx_stream_script_copy_capture_code_t *code; - - s = e->session; - - code = (ngx_stream_script_copy_capture_code_t *) e->ip; - - e->ip += sizeof(ngx_stream_script_copy_capture_code_t); - - n = code->n; - - if (n < s->ncaptures) { - cap = s->captures; - return cap[n + 1] - cap[n]; - } - - return 0; -} - - -void -ngx_stream_script_copy_capture_code(ngx_stream_script_engine_t *e) -{ - int *cap; - u_char *p, *pos; - ngx_uint_t n; - ngx_stream_session_t *s; - ngx_stream_script_copy_capture_code_t *code; - - s = e->session; - - code = (ngx_stream_script_copy_capture_code_t *) e->ip; - - e->ip += sizeof(ngx_stream_script_copy_capture_code_t); - - n = code->n; - - pos = e->pos; - - if (n < s->ncaptures) { - cap = s->captures; - p = s->captures_data; - e->pos = ngx_copy(pos, &p[cap[n]], cap[n + 1] - cap[n]); - } - - ngx_log_debug2(NGX_LOG_DEBUG_STREAM, e->session->connection->log, 0, - "stream script capture: \"%*s\"", e->pos - pos, pos); -} - -#endif - - -static ngx_int_t -ngx_stream_script_add_full_name_code(ngx_stream_script_compile_t *sc) -{ - ngx_stream_script_full_name_code_t *code; - - code = ngx_stream_script_add_code(*sc->lengths, - sizeof(ngx_stream_script_full_name_code_t), - NULL); - if (code == NULL) { - return NGX_ERROR; - } - - code->code = (ngx_stream_script_code_pt) (void *) - ngx_stream_script_full_name_len_code; - code->conf_prefix = sc->conf_prefix; - - code = ngx_stream_script_add_code(*sc->values, - sizeof(ngx_stream_script_full_name_code_t), &sc->main); - if (code == NULL) { - return NGX_ERROR; - } - - code->code = ngx_stream_script_full_name_code; - code->conf_prefix = sc->conf_prefix; - - return NGX_OK; -} - - -static size_t -ngx_stream_script_full_name_len_code(ngx_stream_script_engine_t *e) -{ - ngx_stream_script_full_name_code_t *code; - - code = (ngx_stream_script_full_name_code_t *) e->ip; - - e->ip += sizeof(ngx_stream_script_full_name_code_t); - - return code->conf_prefix ? ngx_cycle->conf_prefix.len: - ngx_cycle->prefix.len; -} - - -static void -ngx_stream_script_full_name_code(ngx_stream_script_engine_t *e) -{ - ngx_stream_script_full_name_code_t *code; - - ngx_str_t value, *prefix; - - code = (ngx_stream_script_full_name_code_t *) e->ip; - - value.data = e->buf.data; - value.len = e->pos - e->buf.data; - - prefix = code->conf_prefix ? (ngx_str_t *) &ngx_cycle->conf_prefix: - (ngx_str_t *) &ngx_cycle->prefix; - - if (ngx_get_full_name(e->session->connection->pool, prefix, &value) - != NGX_OK) - { - e->ip = ngx_stream_script_exit; - return; - } - - e->buf = value; - - ngx_log_debug1(NGX_LOG_DEBUG_STREAM, e->session->connection->log, 0, - "stream script fullname: \"%V\"", &value); - - e->ip += sizeof(ngx_stream_script_full_name_code_t); -} diff --git a/src/deps/src/nginx-1.30.3/src/stream/ngx_stream_script.h b/src/deps/src/nginx-1.30.3/src/stream/ngx_stream_script.h deleted file mode 100644 index d8f3740470..0000000000 --- a/src/deps/src/nginx-1.30.3/src/stream/ngx_stream_script.h +++ /dev/null @@ -1,137 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#ifndef _NGX_STREAM_SCRIPT_H_INCLUDED_ -#define _NGX_STREAM_SCRIPT_H_INCLUDED_ - - -#include -#include -#include - - -typedef struct { - u_char *ip; - u_char *pos; - ngx_stream_variable_value_t *sp; - - ngx_str_t buf; - ngx_str_t line; - - unsigned flushed:1; - unsigned skip:1; - - ngx_stream_session_t *session; -} ngx_stream_script_engine_t; - - -typedef struct { - ngx_conf_t *cf; - ngx_str_t *source; - - ngx_array_t **flushes; - ngx_array_t **lengths; - ngx_array_t **values; - - ngx_uint_t variables; - ngx_uint_t ncaptures; - ngx_uint_t size; - - void *main; - - unsigned complete_lengths:1; - unsigned complete_values:1; - unsigned zero:1; - unsigned conf_prefix:1; - unsigned root_prefix:1; -} ngx_stream_script_compile_t; - - -typedef struct { - ngx_str_t value; - ngx_uint_t *flushes; - void *lengths; - void *values; - - union { - size_t size; - } u; -} ngx_stream_complex_value_t; - - -typedef struct { - ngx_conf_t *cf; - ngx_str_t *value; - ngx_stream_complex_value_t *complex_value; - - unsigned zero:1; - unsigned conf_prefix:1; - unsigned root_prefix:1; -} ngx_stream_compile_complex_value_t; - - -typedef void (*ngx_stream_script_code_pt) (ngx_stream_script_engine_t *e); -typedef size_t (*ngx_stream_script_len_code_pt) (ngx_stream_script_engine_t *e); - - -typedef struct { - ngx_stream_script_code_pt code; - uintptr_t len; -} ngx_stream_script_copy_code_t; - - -typedef struct { - ngx_stream_script_code_pt code; - uintptr_t index; -} ngx_stream_script_var_code_t; - - -typedef struct { - ngx_stream_script_code_pt code; - uintptr_t n; -} ngx_stream_script_copy_capture_code_t; - - -typedef struct { - ngx_stream_script_code_pt code; - uintptr_t conf_prefix; -} ngx_stream_script_full_name_code_t; - - -void ngx_stream_script_flush_complex_value(ngx_stream_session_t *s, - ngx_stream_complex_value_t *val); -ngx_int_t ngx_stream_complex_value(ngx_stream_session_t *s, - ngx_stream_complex_value_t *val, ngx_str_t *value); -size_t ngx_stream_complex_value_size(ngx_stream_session_t *s, - ngx_stream_complex_value_t *val, size_t default_value); -ngx_int_t ngx_stream_compile_complex_value( - ngx_stream_compile_complex_value_t *ccv); -char *ngx_stream_set_complex_value_slot(ngx_conf_t *cf, ngx_command_t *cmd, - void *conf); -char *ngx_stream_set_complex_value_zero_slot(ngx_conf_t *cf, ngx_command_t *cmd, - void *conf); -char *ngx_stream_set_complex_value_size_slot(ngx_conf_t *cf, ngx_command_t *cmd, - void *conf); - - -ngx_uint_t ngx_stream_script_variables_count(ngx_str_t *value); -ngx_int_t ngx_stream_script_compile(ngx_stream_script_compile_t *sc); -u_char *ngx_stream_script_run(ngx_stream_session_t *s, ngx_str_t *value, - void *code_lengths, size_t reserved, void *code_values); -void ngx_stream_script_flush_no_cacheable_variables(ngx_stream_session_t *s, - ngx_array_t *indices); - -void *ngx_stream_script_add_code(ngx_array_t *codes, size_t size, void *code); - -size_t ngx_stream_script_copy_len_code(ngx_stream_script_engine_t *e); -void ngx_stream_script_copy_code(ngx_stream_script_engine_t *e); -size_t ngx_stream_script_copy_var_len_code(ngx_stream_script_engine_t *e); -void ngx_stream_script_copy_var_code(ngx_stream_script_engine_t *e); -size_t ngx_stream_script_copy_capture_len_code(ngx_stream_script_engine_t *e); -void ngx_stream_script_copy_capture_code(ngx_stream_script_engine_t *e); - -#endif /* _NGX_STREAM_SCRIPT_H_INCLUDED_ */ diff --git a/src/deps/src/nginx-1.30.3/src/stream/ngx_stream_set_module.c b/src/deps/src/nginx-1.30.3/src/stream/ngx_stream_set_module.c deleted file mode 100644 index 9b34a6099f..0000000000 --- a/src/deps/src/nginx-1.30.3/src/stream/ngx_stream_set_module.c +++ /dev/null @@ -1,226 +0,0 @@ - -/* - * Copyright (C) Pavel Pautov - * Copyright (C) Nginx, Inc. - */ - - -#include -#include -#include - - -typedef struct { - ngx_int_t index; - ngx_stream_set_variable_pt set_handler; - uintptr_t data; - ngx_stream_complex_value_t value; -} ngx_stream_set_cmd_t; - - -typedef struct { - ngx_array_t commands; -} ngx_stream_set_srv_conf_t; - - -static ngx_int_t ngx_stream_set_handler(ngx_stream_session_t *s); -static ngx_int_t ngx_stream_set_var(ngx_stream_session_t *s, - ngx_stream_variable_value_t *v, uintptr_t data); -static ngx_int_t ngx_stream_set_init(ngx_conf_t *cf); -static void *ngx_stream_set_create_srv_conf(ngx_conf_t *cf); -static char *ngx_stream_set(ngx_conf_t *cf, ngx_command_t *cmd, void *conf); - - -static ngx_command_t ngx_stream_set_commands[] = { - - { ngx_string("set"), - NGX_STREAM_SRV_CONF|NGX_CONF_TAKE2, - ngx_stream_set, - NGX_STREAM_SRV_CONF_OFFSET, - 0, - NULL }, - - ngx_null_command -}; - - -static ngx_stream_module_t ngx_stream_set_module_ctx = { - NULL, /* preconfiguration */ - ngx_stream_set_init, /* postconfiguration */ - - NULL, /* create main configuration */ - NULL, /* init main configuration */ - - ngx_stream_set_create_srv_conf, /* create server configuration */ - NULL /* merge server configuration */ -}; - - -ngx_module_t ngx_stream_set_module = { - NGX_MODULE_V1, - &ngx_stream_set_module_ctx, /* module context */ - ngx_stream_set_commands, /* module directives */ - NGX_STREAM_MODULE, /* module type */ - NULL, /* init master */ - NULL, /* init module */ - NULL, /* init process */ - NULL, /* init thread */ - NULL, /* exit thread */ - NULL, /* exit process */ - NULL, /* exit master */ - NGX_MODULE_V1_PADDING -}; - - -static ngx_int_t -ngx_stream_set_handler(ngx_stream_session_t *s) -{ - ngx_str_t str; - ngx_uint_t i; - ngx_stream_set_cmd_t *cmds; - ngx_stream_set_srv_conf_t *scf; - ngx_stream_variable_value_t vv; - - scf = ngx_stream_get_module_srv_conf(s, ngx_stream_set_module); - cmds = scf->commands.elts; - vv = ngx_stream_variable_null_value; - - for (i = 0; i < scf->commands.nelts; i++) { - if (ngx_stream_complex_value(s, &cmds[i].value, &str) != NGX_OK) { - return NGX_ERROR; - } - - if (cmds[i].set_handler != NULL) { - vv.len = str.len; - vv.data = str.data; - cmds[i].set_handler(s, &vv, cmds[i].data); - - } else { - s->variables[cmds[i].index].len = str.len; - s->variables[cmds[i].index].valid = 1; - s->variables[cmds[i].index].no_cacheable = 0; - s->variables[cmds[i].index].not_found = 0; - s->variables[cmds[i].index].data = str.data; - } - } - - return NGX_DECLINED; -} - - -static ngx_int_t -ngx_stream_set_var(ngx_stream_session_t *s, ngx_stream_variable_value_t *v, - uintptr_t data) -{ - *v = ngx_stream_variable_null_value; - - return NGX_OK; -} - - -static ngx_int_t -ngx_stream_set_init(ngx_conf_t *cf) -{ - ngx_stream_handler_pt *h; - ngx_stream_core_main_conf_t *cmcf; - - cmcf = ngx_stream_conf_get_module_main_conf(cf, ngx_stream_core_module); - - h = ngx_array_push(&cmcf->phases[NGX_STREAM_PREACCESS_PHASE].handlers); - if (h == NULL) { - return NGX_ERROR; - } - - *h = ngx_stream_set_handler; - - return NGX_OK; -} - - -static void * -ngx_stream_set_create_srv_conf(ngx_conf_t *cf) -{ - ngx_stream_set_srv_conf_t *conf; - - conf = ngx_pcalloc(cf->pool, sizeof(ngx_stream_set_srv_conf_t)); - if (conf == NULL) { - return NULL; - } - - /* - * set by ngx_pcalloc(): - * - * conf->commands = { NULL }; - */ - - return conf; -} - - -static char * -ngx_stream_set(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) -{ - ngx_stream_set_srv_conf_t *scf = conf; - - ngx_str_t *args; - ngx_int_t index; - ngx_stream_set_cmd_t *set_cmd; - ngx_stream_variable_t *v; - ngx_stream_compile_complex_value_t ccv; - - args = cf->args->elts; - - if (args[1].data[0] != '$') { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "invalid variable name \"%V\"", &args[1]); - return NGX_CONF_ERROR; - } - - args[1].len--; - args[1].data++; - - v = ngx_stream_add_variable(cf, &args[1], - NGX_STREAM_VAR_CHANGEABLE|NGX_STREAM_VAR_WEAK); - if (v == NULL) { - return NGX_CONF_ERROR; - } - - index = ngx_stream_get_variable_index(cf, &args[1]); - if (index == NGX_ERROR) { - return NGX_CONF_ERROR; - } - - if (v->get_handler == NULL) { - v->get_handler = ngx_stream_set_var; - } - - if (scf->commands.elts == NULL) { - if (ngx_array_init(&scf->commands, cf->pool, 1, - sizeof(ngx_stream_set_cmd_t)) - != NGX_OK) - { - return NGX_CONF_ERROR; - } - } - - set_cmd = ngx_array_push(&scf->commands); - if (set_cmd == NULL) { - return NGX_CONF_ERROR; - } - - set_cmd->index = index; - set_cmd->set_handler = v->set_handler; - set_cmd->data = v->data; - - ngx_memzero(&ccv, sizeof(ngx_stream_compile_complex_value_t)); - - ccv.cf = cf; - ccv.value = &args[2]; - ccv.complex_value = &set_cmd->value; - - if (ngx_stream_compile_complex_value(&ccv) != NGX_OK) { - return NGX_CONF_ERROR; - } - - return NGX_CONF_OK; -} diff --git a/src/deps/src/nginx-1.30.3/src/stream/ngx_stream_split_clients_module.c b/src/deps/src/nginx-1.30.3/src/stream/ngx_stream_split_clients_module.c deleted file mode 100644 index af6c8a1b46..0000000000 --- a/src/deps/src/nginx-1.30.3/src/stream/ngx_stream_split_clients_module.c +++ /dev/null @@ -1,244 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#include -#include -#include - - -typedef struct { - uint32_t percent; - ngx_stream_variable_value_t value; -} ngx_stream_split_clients_part_t; - - -typedef struct { - ngx_stream_complex_value_t value; - ngx_array_t parts; -} ngx_stream_split_clients_ctx_t; - - -static char *ngx_conf_split_clients_block(ngx_conf_t *cf, ngx_command_t *cmd, - void *conf); -static char *ngx_stream_split_clients(ngx_conf_t *cf, ngx_command_t *dummy, - void *conf); - -static ngx_command_t ngx_stream_split_clients_commands[] = { - - { ngx_string("split_clients"), - NGX_STREAM_MAIN_CONF|NGX_CONF_BLOCK|NGX_CONF_TAKE2, - ngx_conf_split_clients_block, - NGX_STREAM_MAIN_CONF_OFFSET, - 0, - NULL }, - - ngx_null_command -}; - - -static ngx_stream_module_t ngx_stream_split_clients_module_ctx = { - NULL, /* preconfiguration */ - NULL, /* postconfiguration */ - - NULL, /* create main configuration */ - NULL, /* init main configuration */ - - NULL, /* create server configuration */ - NULL /* merge server configuration */ -}; - - -ngx_module_t ngx_stream_split_clients_module = { - NGX_MODULE_V1, - &ngx_stream_split_clients_module_ctx, /* module context */ - ngx_stream_split_clients_commands, /* module directives */ - NGX_STREAM_MODULE, /* module type */ - NULL, /* init master */ - NULL, /* init module */ - NULL, /* init process */ - NULL, /* init thread */ - NULL, /* exit thread */ - NULL, /* exit process */ - NULL, /* exit master */ - NGX_MODULE_V1_PADDING -}; - - -static ngx_int_t -ngx_stream_split_clients_variable(ngx_stream_session_t *s, - ngx_stream_variable_value_t *v, uintptr_t data) -{ - ngx_stream_split_clients_ctx_t *ctx = - (ngx_stream_split_clients_ctx_t *) data; - - uint32_t hash; - ngx_str_t val; - ngx_uint_t i; - ngx_stream_split_clients_part_t *part; - - *v = ngx_stream_variable_null_value; - - if (ngx_stream_complex_value(s, &ctx->value, &val) != NGX_OK) { - return NGX_OK; - } - - hash = ngx_murmur_hash2(val.data, val.len); - - part = ctx->parts.elts; - - for (i = 0; i < ctx->parts.nelts; i++) { - - ngx_log_debug2(NGX_LOG_DEBUG_STREAM, s->connection->log, 0, - "stream split: %uD %uD", hash, part[i].percent); - - if (hash < part[i].percent || part[i].percent == 0) { - *v = part[i].value; - return NGX_OK; - } - } - - return NGX_OK; -} - - -static char * -ngx_conf_split_clients_block(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) -{ - char *rv; - uint32_t sum, last; - ngx_str_t *value, name; - ngx_uint_t i; - ngx_conf_t save; - ngx_stream_variable_t *var; - ngx_stream_split_clients_ctx_t *ctx; - ngx_stream_split_clients_part_t *part; - ngx_stream_compile_complex_value_t ccv; - - ctx = ngx_pcalloc(cf->pool, sizeof(ngx_stream_split_clients_ctx_t)); - if (ctx == NULL) { - return NGX_CONF_ERROR; - } - - value = cf->args->elts; - - ngx_memzero(&ccv, sizeof(ngx_stream_compile_complex_value_t)); - - ccv.cf = cf; - ccv.value = &value[1]; - ccv.complex_value = &ctx->value; - - if (ngx_stream_compile_complex_value(&ccv) != NGX_OK) { - return NGX_CONF_ERROR; - } - - name = value[2]; - - if (name.data[0] != '$') { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "invalid variable name \"%V\"", &name); - return NGX_CONF_ERROR; - } - - name.len--; - name.data++; - - var = ngx_stream_add_variable(cf, &name, NGX_STREAM_VAR_CHANGEABLE); - if (var == NULL) { - return NGX_CONF_ERROR; - } - - var->get_handler = ngx_stream_split_clients_variable; - var->data = (uintptr_t) ctx; - - if (ngx_array_init(&ctx->parts, cf->pool, 2, - sizeof(ngx_stream_split_clients_part_t)) - != NGX_OK) - { - return NGX_CONF_ERROR; - } - - save = *cf; - cf->ctx = ctx; - cf->handler = ngx_stream_split_clients; - cf->handler_conf = conf; - - rv = ngx_conf_parse(cf, NULL); - - *cf = save; - - if (rv != NGX_CONF_OK) { - return rv; - } - - sum = 0; - last = 0; - part = ctx->parts.elts; - - for (i = 0; i < ctx->parts.nelts; i++) { - sum = part[i].percent ? sum + part[i].percent : 10000; - if (sum > 10000) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "percent total is greater than 100%%"); - return NGX_CONF_ERROR; - } - - if (part[i].percent) { - last += part[i].percent * (uint64_t) 0xffffffff / 10000; - part[i].percent = last; - } - } - - return rv; -} - - -static char * -ngx_stream_split_clients(ngx_conf_t *cf, ngx_command_t *dummy, void *conf) -{ - ngx_int_t n; - ngx_str_t *value; - ngx_stream_split_clients_ctx_t *ctx; - ngx_stream_split_clients_part_t *part; - - ctx = cf->ctx; - value = cf->args->elts; - - part = ngx_array_push(&ctx->parts); - if (part == NULL) { - return NGX_CONF_ERROR; - } - - if (value[0].len == 1 && value[0].data[0] == '*') { - part->percent = 0; - - } else { - if (value[0].len == 0 || value[0].data[value[0].len - 1] != '%') { - goto invalid; - } - - n = ngx_atofp(value[0].data, value[0].len - 1, 2); - if (n == NGX_ERROR || n == 0) { - goto invalid; - } - - part->percent = (uint32_t) n; - } - - part->value.len = value[1].len; - part->value.valid = 1; - part->value.no_cacheable = 0; - part->value.not_found = 0; - part->value.data = value[1].data; - - return NGX_CONF_OK; - -invalid: - - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "invalid percent value \"%V\"", &value[0]); - return NGX_CONF_ERROR; -} diff --git a/src/deps/src/nginx-1.30.3/src/stream/ngx_stream_ssl_module.c b/src/deps/src/nginx-1.30.3/src/stream/ngx_stream_ssl_module.c deleted file mode 100644 index 0e17cff4d9..0000000000 --- a/src/deps/src/nginx-1.30.3/src/stream/ngx_stream_ssl_module.c +++ /dev/null @@ -1,1784 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#include -#include -#include - - -typedef ngx_int_t (*ngx_ssl_variable_handler_pt)(ngx_connection_t *c, - ngx_pool_t *pool, ngx_str_t *s); - - -#define NGX_DEFAULT_CIPHERS "HIGH:!aNULL:!MD5" -#define NGX_DEFAULT_ECDH_CURVE "auto" - - -static ngx_int_t ngx_stream_ssl_handler(ngx_stream_session_t *s); -static ngx_int_t ngx_stream_ssl_init_connection(ngx_ssl_t *ssl, - ngx_connection_t *c); -static void ngx_stream_ssl_handshake_handler(ngx_connection_t *c); -#ifdef SSL_CTRL_SET_TLSEXT_HOSTNAME -static int ngx_stream_ssl_servername(ngx_ssl_conn_t *ssl_conn, int *ad, - void *arg); -#endif -#ifdef TLSEXT_TYPE_application_layer_protocol_negotiation -static int ngx_stream_ssl_alpn_select(ngx_ssl_conn_t *ssl_conn, - const unsigned char **out, unsigned char *outlen, - const unsigned char *in, unsigned int inlen, void *arg); -#endif -#ifdef SSL_R_CERT_CB_ERROR -static int ngx_stream_ssl_certificate(ngx_ssl_conn_t *ssl_conn, void *arg); -#endif -static ngx_int_t ngx_stream_ssl_static_variable(ngx_stream_session_t *s, - ngx_stream_variable_value_t *v, uintptr_t data); -static ngx_int_t ngx_stream_ssl_variable(ngx_stream_session_t *s, - ngx_stream_variable_value_t *v, uintptr_t data); - -static ngx_int_t ngx_stream_ssl_add_variables(ngx_conf_t *cf); -static void *ngx_stream_ssl_create_srv_conf(ngx_conf_t *cf); -static char *ngx_stream_ssl_merge_srv_conf(ngx_conf_t *cf, void *parent, - void *child); - -static ngx_int_t ngx_stream_ssl_compile_certificates(ngx_conf_t *cf, - ngx_stream_ssl_srv_conf_t *conf); - -static char *ngx_stream_ssl_certificate_cache(ngx_conf_t *cf, - ngx_command_t *cmd, void *conf); -static char *ngx_stream_ssl_password_file(ngx_conf_t *cf, ngx_command_t *cmd, - void *conf); -static char *ngx_stream_ssl_session_cache(ngx_conf_t *cf, ngx_command_t *cmd, - void *conf); -static char *ngx_stream_ssl_ocsp_cache(ngx_conf_t *cf, ngx_command_t *cmd, - void *conf); -static char *ngx_stream_ssl_alpn(ngx_conf_t *cf, ngx_command_t *cmd, - void *conf); - -static char *ngx_stream_ssl_conf_command_check(ngx_conf_t *cf, void *post, - void *data); - -static ngx_int_t ngx_stream_ssl_init(ngx_conf_t *cf); - - -static ngx_conf_bitmask_t ngx_stream_ssl_protocols[] = { - { ngx_string("SSLv2"), NGX_SSL_SSLv2 }, - { ngx_string("SSLv3"), NGX_SSL_SSLv3 }, - { ngx_string("TLSv1"), NGX_SSL_TLSv1 }, - { ngx_string("TLSv1.1"), NGX_SSL_TLSv1_1 }, - { ngx_string("TLSv1.2"), NGX_SSL_TLSv1_2 }, - { ngx_string("TLSv1.3"), NGX_SSL_TLSv1_3 }, - { ngx_null_string, 0 } -}; - - -static ngx_conf_enum_t ngx_stream_ssl_verify[] = { - { ngx_string("off"), 0 }, - { ngx_string("on"), 1 }, - { ngx_string("optional"), 2 }, - { ngx_string("optional_no_ca"), 3 }, - { ngx_null_string, 0 } -}; - - -static ngx_conf_enum_t ngx_stream_ssl_ocsp[] = { - { ngx_string("off"), 0 }, - { ngx_string("on"), 1 }, - { ngx_string("leaf"), 2 }, - { ngx_null_string, 0 } -}; - - -static ngx_conf_post_t ngx_stream_ssl_conf_command_post = - { ngx_stream_ssl_conf_command_check }; - - -static ngx_command_t ngx_stream_ssl_commands[] = { - - { ngx_string("ssl_handshake_timeout"), - NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_TAKE1, - ngx_conf_set_msec_slot, - NGX_STREAM_SRV_CONF_OFFSET, - offsetof(ngx_stream_ssl_srv_conf_t, handshake_timeout), - NULL }, - - { ngx_string("ssl_certificate"), - NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_TAKE1, - ngx_conf_set_str_array_slot, - NGX_STREAM_SRV_CONF_OFFSET, - offsetof(ngx_stream_ssl_srv_conf_t, certificates), - NULL }, - - { ngx_string("ssl_certificate_key"), - NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_TAKE1, - ngx_conf_set_str_array_slot, - NGX_STREAM_SRV_CONF_OFFSET, - offsetof(ngx_stream_ssl_srv_conf_t, certificate_keys), - NULL }, - - { ngx_string("ssl_certificate_cache"), - NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_TAKE123, - ngx_stream_ssl_certificate_cache, - NGX_STREAM_SRV_CONF_OFFSET, - 0, - NULL }, - - { ngx_string("ssl_ech_file"), - NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_TAKE1, - ngx_conf_set_str_array_slot, - NGX_STREAM_SRV_CONF_OFFSET, - offsetof(ngx_stream_ssl_srv_conf_t, ech_files), - NULL }, - - { ngx_string("ssl_password_file"), - NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_TAKE1, - ngx_stream_ssl_password_file, - NGX_STREAM_SRV_CONF_OFFSET, - 0, - NULL }, - - { ngx_string("ssl_certificate_compression"), - NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_FLAG, - ngx_conf_set_flag_slot, - NGX_STREAM_SRV_CONF_OFFSET, - offsetof(ngx_stream_ssl_srv_conf_t, certificate_compression), - NULL }, - - { ngx_string("ssl_dhparam"), - NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_TAKE1, - ngx_conf_set_str_slot, - NGX_STREAM_SRV_CONF_OFFSET, - offsetof(ngx_stream_ssl_srv_conf_t, dhparam), - NULL }, - - { ngx_string("ssl_ecdh_curve"), - NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_TAKE1, - ngx_conf_set_str_slot, - NGX_STREAM_SRV_CONF_OFFSET, - offsetof(ngx_stream_ssl_srv_conf_t, ecdh_curve), - NULL }, - - { ngx_string("ssl_protocols"), - NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_1MORE, - ngx_conf_set_bitmask_slot, - NGX_STREAM_SRV_CONF_OFFSET, - offsetof(ngx_stream_ssl_srv_conf_t, protocols), - &ngx_stream_ssl_protocols }, - - { ngx_string("ssl_ciphers"), - NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_TAKE1, - ngx_conf_set_str_slot, - NGX_STREAM_SRV_CONF_OFFSET, - offsetof(ngx_stream_ssl_srv_conf_t, ciphers), - NULL }, - - { ngx_string("ssl_verify_client"), - NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_TAKE1, - ngx_conf_set_enum_slot, - NGX_STREAM_SRV_CONF_OFFSET, - offsetof(ngx_stream_ssl_srv_conf_t, verify), - &ngx_stream_ssl_verify }, - - { ngx_string("ssl_verify_depth"), - NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_TAKE1, - ngx_conf_set_num_slot, - NGX_STREAM_SRV_CONF_OFFSET, - offsetof(ngx_stream_ssl_srv_conf_t, verify_depth), - NULL }, - - { ngx_string("ssl_client_certificate"), - NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_TAKE1, - ngx_conf_set_str_slot, - NGX_STREAM_SRV_CONF_OFFSET, - offsetof(ngx_stream_ssl_srv_conf_t, client_certificate), - NULL }, - - { ngx_string("ssl_trusted_certificate"), - NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_TAKE1, - ngx_conf_set_str_slot, - NGX_STREAM_SRV_CONF_OFFSET, - offsetof(ngx_stream_ssl_srv_conf_t, trusted_certificate), - NULL }, - - { ngx_string("ssl_prefer_server_ciphers"), - NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_FLAG, - ngx_conf_set_flag_slot, - NGX_STREAM_SRV_CONF_OFFSET, - offsetof(ngx_stream_ssl_srv_conf_t, prefer_server_ciphers), - NULL }, - - { ngx_string("ssl_session_cache"), - NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_TAKE12, - ngx_stream_ssl_session_cache, - NGX_STREAM_SRV_CONF_OFFSET, - 0, - NULL }, - - { ngx_string("ssl_session_tickets"), - NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_FLAG, - ngx_conf_set_flag_slot, - NGX_STREAM_SRV_CONF_OFFSET, - offsetof(ngx_stream_ssl_srv_conf_t, session_tickets), - NULL }, - - { ngx_string("ssl_session_ticket_key"), - NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_TAKE1, - ngx_conf_set_str_array_slot, - NGX_STREAM_SRV_CONF_OFFSET, - offsetof(ngx_stream_ssl_srv_conf_t, session_ticket_keys), - NULL }, - - { ngx_string("ssl_session_timeout"), - NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_TAKE1, - ngx_conf_set_sec_slot, - NGX_STREAM_SRV_CONF_OFFSET, - offsetof(ngx_stream_ssl_srv_conf_t, session_timeout), - NULL }, - - { ngx_string("ssl_crl"), - NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_TAKE1, - ngx_conf_set_str_slot, - NGX_STREAM_SRV_CONF_OFFSET, - offsetof(ngx_stream_ssl_srv_conf_t, crl), - NULL }, - - { ngx_string("ssl_ocsp"), - NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_TAKE1, - ngx_conf_set_enum_slot, - NGX_STREAM_SRV_CONF_OFFSET, - offsetof(ngx_stream_ssl_srv_conf_t, ocsp), - &ngx_stream_ssl_ocsp }, - - { ngx_string("ssl_ocsp_responder"), - NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_TAKE1, - ngx_conf_set_str_slot, - NGX_STREAM_SRV_CONF_OFFSET, - offsetof(ngx_stream_ssl_srv_conf_t, ocsp_responder), - NULL }, - - { ngx_string("ssl_ocsp_cache"), - NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_TAKE1, - ngx_stream_ssl_ocsp_cache, - NGX_STREAM_SRV_CONF_OFFSET, - 0, - NULL }, - - { ngx_string("ssl_stapling"), - NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_FLAG, - ngx_conf_set_flag_slot, - NGX_STREAM_SRV_CONF_OFFSET, - offsetof(ngx_stream_ssl_srv_conf_t, stapling), - NULL }, - - { ngx_string("ssl_stapling_file"), - NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_TAKE1, - ngx_conf_set_str_slot, - NGX_STREAM_SRV_CONF_OFFSET, - offsetof(ngx_stream_ssl_srv_conf_t, stapling_file), - NULL }, - - { ngx_string("ssl_stapling_responder"), - NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_TAKE1, - ngx_conf_set_str_slot, - NGX_STREAM_SRV_CONF_OFFSET, - offsetof(ngx_stream_ssl_srv_conf_t, stapling_responder), - NULL }, - - { ngx_string("ssl_stapling_verify"), - NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_FLAG, - ngx_conf_set_flag_slot, - NGX_STREAM_SRV_CONF_OFFSET, - offsetof(ngx_stream_ssl_srv_conf_t, stapling_verify), - NULL }, - - { ngx_string("ssl_conf_command"), - NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_TAKE2, - ngx_conf_set_keyval_slot, - NGX_STREAM_SRV_CONF_OFFSET, - offsetof(ngx_stream_ssl_srv_conf_t, conf_commands), - &ngx_stream_ssl_conf_command_post }, - - { ngx_string("ssl_reject_handshake"), - NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_FLAG, - ngx_conf_set_flag_slot, - NGX_STREAM_SRV_CONF_OFFSET, - offsetof(ngx_stream_ssl_srv_conf_t, reject_handshake), - NULL }, - - { ngx_string("ssl_alpn"), - NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_1MORE, - ngx_stream_ssl_alpn, - NGX_STREAM_SRV_CONF_OFFSET, - 0, - NULL }, - - ngx_null_command -}; - - -static ngx_stream_module_t ngx_stream_ssl_module_ctx = { - ngx_stream_ssl_add_variables, /* preconfiguration */ - ngx_stream_ssl_init, /* postconfiguration */ - - NULL, /* create main configuration */ - NULL, /* init main configuration */ - - ngx_stream_ssl_create_srv_conf, /* create server configuration */ - ngx_stream_ssl_merge_srv_conf /* merge server configuration */ -}; - - -ngx_module_t ngx_stream_ssl_module = { - NGX_MODULE_V1, - &ngx_stream_ssl_module_ctx, /* module context */ - ngx_stream_ssl_commands, /* module directives */ - NGX_STREAM_MODULE, /* module type */ - NULL, /* init master */ - NULL, /* init module */ - NULL, /* init process */ - NULL, /* init thread */ - NULL, /* exit thread */ - NULL, /* exit process */ - NULL, /* exit master */ - NGX_MODULE_V1_PADDING -}; - - -static ngx_stream_variable_t ngx_stream_ssl_vars[] = { - - { ngx_string("ssl_protocol"), NULL, ngx_stream_ssl_static_variable, - (uintptr_t) ngx_ssl_get_protocol, NGX_STREAM_VAR_CHANGEABLE, 0 }, - - { ngx_string("ssl_cipher"), NULL, ngx_stream_ssl_static_variable, - (uintptr_t) ngx_ssl_get_cipher_name, NGX_STREAM_VAR_CHANGEABLE, 0 }, - - { ngx_string("ssl_ciphers"), NULL, ngx_stream_ssl_variable, - (uintptr_t) ngx_ssl_get_ciphers, NGX_STREAM_VAR_CHANGEABLE, 0 }, - - { ngx_string("ssl_curve"), NULL, ngx_stream_ssl_variable, - (uintptr_t) ngx_ssl_get_curve, NGX_STREAM_VAR_CHANGEABLE, 0 }, - - { ngx_string("ssl_curves"), NULL, ngx_stream_ssl_variable, - (uintptr_t) ngx_ssl_get_curves, NGX_STREAM_VAR_CHANGEABLE, 0 }, - - { ngx_string("ssl_sigalg"), NULL, ngx_stream_ssl_variable, - (uintptr_t) ngx_ssl_get_sigalg, NGX_STREAM_VAR_CHANGEABLE, 0 }, - - { ngx_string("ssl_session_id"), NULL, ngx_stream_ssl_variable, - (uintptr_t) ngx_ssl_get_session_id, NGX_STREAM_VAR_CHANGEABLE, 0 }, - - { ngx_string("ssl_session_reused"), NULL, ngx_stream_ssl_variable, - (uintptr_t) ngx_ssl_get_session_reused, NGX_STREAM_VAR_CHANGEABLE, 0 }, - - { ngx_string("ssl_server_name"), NULL, ngx_stream_ssl_variable, - (uintptr_t) ngx_ssl_get_server_name, NGX_STREAM_VAR_CHANGEABLE, 0 }, - - { ngx_string("ssl_alpn_protocol"), NULL, ngx_stream_ssl_variable, - (uintptr_t) ngx_ssl_get_alpn_protocol, NGX_STREAM_VAR_CHANGEABLE, 0 }, - - { ngx_string("ssl_ech_status"), NULL, ngx_stream_ssl_variable, - (uintptr_t) ngx_ssl_get_ech_status, NGX_STREAM_VAR_CHANGEABLE, 0 }, - - { ngx_string("ssl_ech_outer_server_name"), NULL, ngx_stream_ssl_variable, - (uintptr_t) ngx_ssl_get_ech_outer_server_name, - NGX_STREAM_VAR_CHANGEABLE, 0 }, - - { ngx_string("ssl_client_cert"), NULL, ngx_stream_ssl_variable, - (uintptr_t) ngx_ssl_get_certificate, NGX_STREAM_VAR_CHANGEABLE, 0 }, - - { ngx_string("ssl_client_raw_cert"), NULL, ngx_stream_ssl_variable, - (uintptr_t) ngx_ssl_get_raw_certificate, - NGX_STREAM_VAR_CHANGEABLE, 0 }, - - { ngx_string("ssl_client_escaped_cert"), NULL, ngx_stream_ssl_variable, - (uintptr_t) ngx_ssl_get_escaped_certificate, - NGX_STREAM_VAR_CHANGEABLE, 0 }, - - { ngx_string("ssl_client_s_dn"), NULL, ngx_stream_ssl_variable, - (uintptr_t) ngx_ssl_get_subject_dn, NGX_STREAM_VAR_CHANGEABLE, 0 }, - - { ngx_string("ssl_client_i_dn"), NULL, ngx_stream_ssl_variable, - (uintptr_t) ngx_ssl_get_issuer_dn, NGX_STREAM_VAR_CHANGEABLE, 0 }, - - { ngx_string("ssl_client_serial"), NULL, ngx_stream_ssl_variable, - (uintptr_t) ngx_ssl_get_serial_number, NGX_STREAM_VAR_CHANGEABLE, 0 }, - - { ngx_string("ssl_client_fingerprint"), NULL, ngx_stream_ssl_variable, - (uintptr_t) ngx_ssl_get_fingerprint, NGX_STREAM_VAR_CHANGEABLE, 0 }, - - { ngx_string("ssl_client_verify"), NULL, ngx_stream_ssl_variable, - (uintptr_t) ngx_ssl_get_client_verify, NGX_STREAM_VAR_CHANGEABLE, 0 }, - - { ngx_string("ssl_client_v_start"), NULL, ngx_stream_ssl_variable, - (uintptr_t) ngx_ssl_get_client_v_start, NGX_STREAM_VAR_CHANGEABLE, 0 }, - - { ngx_string("ssl_client_v_end"), NULL, ngx_stream_ssl_variable, - (uintptr_t) ngx_ssl_get_client_v_end, NGX_STREAM_VAR_CHANGEABLE, 0 }, - - { ngx_string("ssl_client_v_remain"), NULL, ngx_stream_ssl_variable, - (uintptr_t) ngx_ssl_get_client_v_remain, NGX_STREAM_VAR_CHANGEABLE, 0 }, - - { ngx_string("ssl_client_sigalg"), NULL, ngx_stream_ssl_variable, - (uintptr_t) ngx_ssl_get_client_sigalg, NGX_STREAM_VAR_CHANGEABLE, 0 }, - - ngx_stream_null_variable -}; - - -static ngx_str_t ngx_stream_ssl_sess_id_ctx = ngx_string("STREAM"); - - -static ngx_int_t -ngx_stream_ssl_handler(ngx_stream_session_t *s) -{ - long rc; - X509 *cert; - ngx_int_t rv; - const char *str; - ngx_connection_t *c; - ngx_stream_ssl_srv_conf_t *sscf; - - if (!s->ssl) { - return NGX_OK; - } - - c = s->connection; - - sscf = ngx_stream_get_module_srv_conf(s, ngx_stream_ssl_module); - - if (c->ssl == NULL) { - c->log->action = "SSL handshaking"; - - rv = ngx_stream_ssl_init_connection(&sscf->ssl, c); - - if (rv != NGX_OK) { - return rv; - } - } - - if (sscf->verify) { - rc = SSL_get_verify_result(c->ssl->connection); - - if (rc != X509_V_OK - && (sscf->verify != 3 || !ngx_ssl_verify_error_optional(rc))) - { - ngx_log_error(NGX_LOG_INFO, c->log, 0, - "client SSL certificate verify error: (%l:%s)", - rc, X509_verify_cert_error_string(rc)); - - ngx_ssl_remove_cached_session(c->ssl->session_ctx, - (SSL_get0_session(c->ssl->connection))); - return NGX_ERROR; - } - - if (sscf->verify == 1) { - cert = SSL_get_peer_certificate(c->ssl->connection); - - if (cert == NULL) { - ngx_log_error(NGX_LOG_INFO, c->log, 0, - "client sent no required SSL certificate"); - - ngx_ssl_remove_cached_session(c->ssl->session_ctx, - (SSL_get0_session(c->ssl->connection))); - return NGX_ERROR; - } - - X509_free(cert); - } - - if (ngx_ssl_ocsp_get_status(c, &str) != NGX_OK) { - ngx_log_error(NGX_LOG_INFO, c->log, 0, - "client SSL certificate verify error: %s", str); - - ngx_ssl_remove_cached_session(c->ssl->session_ctx, - (SSL_get0_session(c->ssl->connection))); - return NGX_ERROR; - } - } - - return NGX_OK; -} - - -static ngx_int_t -ngx_stream_ssl_init_connection(ngx_ssl_t *ssl, ngx_connection_t *c) -{ - ngx_int_t rc; - ngx_stream_session_t *s; - ngx_stream_ssl_srv_conf_t *sscf; - ngx_stream_core_srv_conf_t *cscf; - - s = c->data; - - cscf = ngx_stream_get_module_srv_conf(s, ngx_stream_core_module); - - if (cscf->tcp_nodelay && ngx_tcp_nodelay(c) != NGX_OK) { - return NGX_ERROR; - } - - if (ngx_ssl_create_connection(ssl, c, 0) != NGX_OK) { - return NGX_ERROR; - } - - rc = ngx_ssl_handshake(c); - - if (rc == NGX_ERROR) { - return NGX_ERROR; - } - - if (rc == NGX_AGAIN) { - sscf = ngx_stream_get_module_srv_conf(s, ngx_stream_ssl_module); - - ngx_add_timer(c->read, sscf->handshake_timeout); - - c->ssl->handler = ngx_stream_ssl_handshake_handler; - - return NGX_AGAIN; - } - - /* rc == NGX_OK */ - - return NGX_OK; -} - - -static void -ngx_stream_ssl_handshake_handler(ngx_connection_t *c) -{ - ngx_stream_session_t *s; - - s = c->data; - - if (!c->ssl->handshaked) { - ngx_stream_finalize_session(s, NGX_STREAM_INTERNAL_SERVER_ERROR); - return; - } - - if (c->read->timer_set) { - ngx_del_timer(c->read); - } - - ngx_stream_core_run_phases(s); -} - - -#ifdef SSL_CTRL_SET_TLSEXT_HOSTNAME - -static int -ngx_stream_ssl_servername(ngx_ssl_conn_t *ssl_conn, int *ad, void *arg) -{ - ngx_int_t rc; - ngx_str_t host; - const char *servername; - ngx_connection_t *c; - ngx_stream_session_t *s; - ngx_stream_ssl_srv_conf_t *sscf; - ngx_stream_core_srv_conf_t *cscf; - - c = ngx_ssl_get_connection(ssl_conn); - - if (c->ssl->handshaked) { - *ad = SSL_AD_NO_RENEGOTIATION; - return SSL_TLSEXT_ERR_ALERT_FATAL; - } - - if (c->ssl->sni_accepted) { - return SSL_TLSEXT_ERR_OK; - } - - if (c->ssl->handshake_rejected) { - *ad = SSL_AD_UNRECOGNIZED_NAME; - return SSL_TLSEXT_ERR_ALERT_FATAL; - } - - s = c->data; - - if (arg) { - host = *(ngx_str_t *) arg; - - if (host.data == NULL) { - ngx_log_debug0(NGX_LOG_DEBUG_STREAM, c->log, 0, - "SSL server name: null"); - goto done; - } - - } else { - servername = SSL_get_servername(ssl_conn, TLSEXT_NAMETYPE_host_name); - - if (servername == NULL) { - ngx_log_debug0(NGX_LOG_DEBUG_STREAM, c->log, 0, - "SSL server name: null"); - goto done; - } - - host.len = ngx_strlen(servername); - host.data = (u_char *) servername; - } - - ngx_log_debug1(NGX_LOG_DEBUG_STREAM, c->log, 0, - "SSL server name: \"%V\"", &host); - - if (host.len == 0) { - goto done; - } - - rc = ngx_stream_validate_host(&host, c->pool, 1); - - if (rc == NGX_ERROR) { - goto error; - } - - if (rc == NGX_DECLINED) { - goto done; - } - - rc = ngx_stream_find_virtual_server(s, &host, &cscf); - - if (rc == NGX_ERROR) { - goto error; - } - - if (rc == NGX_DECLINED) { - goto done; - } - - s->srv_conf = cscf->ctx->srv_conf; - - ngx_set_connection_log(c, cscf->error_log); - - sscf = ngx_stream_get_module_srv_conf(cscf->ctx, ngx_stream_ssl_module); - - if (sscf->ssl.ctx) { - if (SSL_set_SSL_CTX(ssl_conn, sscf->ssl.ctx) == NULL) { - goto error; - } - - /* - * SSL_set_SSL_CTX() only changes certs as of 1.0.0d - * adjust other things we care about - */ - - SSL_set_verify(ssl_conn, SSL_CTX_get_verify_mode(sscf->ssl.ctx), - SSL_CTX_get_verify_callback(sscf->ssl.ctx)); - - SSL_set_verify_depth(ssl_conn, SSL_CTX_get_verify_depth(sscf->ssl.ctx)); - -#if OPENSSL_VERSION_NUMBER >= 0x009080dfL - /* only in 0.9.8m+ */ - SSL_clear_options(ssl_conn, SSL_get_options(ssl_conn) & - ~SSL_CTX_get_options(sscf->ssl.ctx)); -#endif - - SSL_set_options(ssl_conn, SSL_CTX_get_options(sscf->ssl.ctx)); - -#ifdef SSL_OP_NO_RENEGOTIATION - SSL_set_options(ssl_conn, SSL_OP_NO_RENEGOTIATION); -#endif - } - -done: - - sscf = ngx_stream_get_module_srv_conf(s, ngx_stream_ssl_module); - - if (sscf->reject_handshake) { - c->ssl->handshake_rejected = 1; - *ad = SSL_AD_UNRECOGNIZED_NAME; - return SSL_TLSEXT_ERR_ALERT_FATAL; - } - - c->ssl->sni_accepted = 1; - return SSL_TLSEXT_ERR_OK; - -error: - - *ad = SSL_AD_INTERNAL_ERROR; - return SSL_TLSEXT_ERR_ALERT_FATAL; -} - -#endif - - -#ifdef TLSEXT_TYPE_application_layer_protocol_negotiation - -static int -ngx_stream_ssl_alpn_select(ngx_ssl_conn_t *ssl_conn, const unsigned char **out, - unsigned char *outlen, const unsigned char *in, unsigned int inlen, - void *arg) -{ - ngx_str_t *alpn; -#if (NGX_DEBUG) - unsigned int i; - ngx_connection_t *c; - - c = ngx_ssl_get_connection(ssl_conn); - - for (i = 0; i < inlen; i += in[i] + 1) { - ngx_log_debug2(NGX_LOG_DEBUG_STREAM, c->log, 0, - "SSL ALPN supported by client: %*s", - (size_t) in[i], &in[i + 1]); - } - -#endif - - alpn = arg; - - if (SSL_select_next_proto((unsigned char **) out, outlen, alpn->data, - alpn->len, in, inlen) - != OPENSSL_NPN_NEGOTIATED) - { - return SSL_TLSEXT_ERR_ALERT_FATAL; - } - - ngx_log_debug2(NGX_LOG_DEBUG_STREAM, c->log, 0, - "SSL ALPN selected: %*s", (size_t) *outlen, *out); - - return SSL_TLSEXT_ERR_OK; -} - -#endif - - -#ifdef SSL_R_CERT_CB_ERROR - -static int -ngx_stream_ssl_certificate(ngx_ssl_conn_t *ssl_conn, void *arg) -{ - ngx_str_t cert, key; - ngx_uint_t i, nelts; - ngx_connection_t *c; - ngx_stream_session_t *s; - ngx_stream_ssl_srv_conf_t *sscf; - ngx_stream_complex_value_t *certs, *keys; - - c = ngx_ssl_get_connection(ssl_conn); - - if (c->ssl->handshaked) { - return 0; - } - - s = c->data; - - sscf = arg; - - nelts = sscf->certificate_values->nelts; - certs = sscf->certificate_values->elts; - keys = sscf->certificate_key_values->elts; - - for (i = 0; i < nelts; i++) { - - if (ngx_stream_complex_value(s, &certs[i], &cert) != NGX_OK) { - return 0; - } - - ngx_log_debug1(NGX_LOG_DEBUG_STREAM, c->log, 0, - "ssl cert: \"%s\"", cert.data); - - if (ngx_stream_complex_value(s, &keys[i], &key) != NGX_OK) { - return 0; - } - - ngx_log_debug1(NGX_LOG_DEBUG_STREAM, c->log, 0, - "ssl key: \"%s\"", key.data); - - if (ngx_ssl_connection_certificate(c, c->pool, &cert, &key, - sscf->certificate_cache, - sscf->passwords) - != NGX_OK) - { - return 0; - } - } - - return 1; -} - -#endif - - -static ngx_int_t -ngx_stream_ssl_static_variable(ngx_stream_session_t *s, - ngx_stream_variable_value_t *v, uintptr_t data) -{ - ngx_ssl_variable_handler_pt handler = (ngx_ssl_variable_handler_pt) data; - - size_t len; - ngx_str_t str; - - if (s->connection->ssl) { - - (void) handler(s->connection, NULL, &str); - - v->data = str.data; - - for (len = 0; v->data[len]; len++) { /* void */ } - - v->len = len; - v->valid = 1; - v->no_cacheable = 0; - v->not_found = 0; - - return NGX_OK; - } - - v->not_found = 1; - - return NGX_OK; -} - - -static ngx_int_t -ngx_stream_ssl_variable(ngx_stream_session_t *s, - ngx_stream_variable_value_t *v, uintptr_t data) -{ - ngx_ssl_variable_handler_pt handler = (ngx_ssl_variable_handler_pt) data; - - ngx_str_t str; - - if (s->connection->ssl) { - - if (handler(s->connection, s->connection->pool, &str) != NGX_OK) { - return NGX_ERROR; - } - - v->len = str.len; - v->data = str.data; - - if (v->len) { - v->valid = 1; - v->no_cacheable = 0; - v->not_found = 0; - - return NGX_OK; - } - } - - v->not_found = 1; - - return NGX_OK; -} - - -static ngx_int_t -ngx_stream_ssl_add_variables(ngx_conf_t *cf) -{ - ngx_stream_variable_t *var, *v; - - for (v = ngx_stream_ssl_vars; v->name.len; v++) { - var = ngx_stream_add_variable(cf, &v->name, v->flags); - if (var == NULL) { - return NGX_ERROR; - } - - var->get_handler = v->get_handler; - var->data = v->data; - } - - return NGX_OK; -} - - -static void * -ngx_stream_ssl_create_srv_conf(ngx_conf_t *cf) -{ - ngx_stream_ssl_srv_conf_t *sscf; - - sscf = ngx_pcalloc(cf->pool, sizeof(ngx_stream_ssl_srv_conf_t)); - if (sscf == NULL) { - return NULL; - } - - /* - * set by ngx_pcalloc(): - * - * sscf->protocols = 0; - * sscf->certificate_values = NULL; - * sscf->dhparam = { 0, NULL }; - * sscf->ecdh_curve = { 0, NULL }; - * sscf->client_certificate = { 0, NULL }; - * sscf->trusted_certificate = { 0, NULL }; - * sscf->crl = { 0, NULL }; - * sscf->alpn = { 0, NULL }; - * sscf->ciphers = { 0, NULL }; - * sscf->shm_zone = NULL; - * sscf->ocsp_responder = { 0, NULL }; - * sscf->stapling_file = { 0, NULL }; - * sscf->stapling_responder = { 0, NULL }; - */ - - sscf->handshake_timeout = NGX_CONF_UNSET_MSEC; - sscf->certificates = NGX_CONF_UNSET_PTR; - sscf->certificate_keys = NGX_CONF_UNSET_PTR; - sscf->certificate_cache = NGX_CONF_UNSET_PTR; - sscf->ech_files = NGX_CONF_UNSET_PTR; - sscf->passwords = NGX_CONF_UNSET_PTR; - sscf->conf_commands = NGX_CONF_UNSET_PTR; - sscf->prefer_server_ciphers = NGX_CONF_UNSET; - sscf->certificate_compression = NGX_CONF_UNSET; - sscf->reject_handshake = NGX_CONF_UNSET; - sscf->verify = NGX_CONF_UNSET_UINT; - sscf->verify_depth = NGX_CONF_UNSET_UINT; - sscf->builtin_session_cache = NGX_CONF_UNSET; - sscf->session_timeout = NGX_CONF_UNSET; - sscf->session_tickets = NGX_CONF_UNSET; - sscf->session_ticket_keys = NGX_CONF_UNSET_PTR; - sscf->ocsp = NGX_CONF_UNSET_UINT; - sscf->ocsp_cache_zone = NGX_CONF_UNSET_PTR; - sscf->stapling = NGX_CONF_UNSET; - sscf->stapling_verify = NGX_CONF_UNSET; - - return sscf; -} - - -static char * -ngx_stream_ssl_merge_srv_conf(ngx_conf_t *cf, void *parent, void *child) -{ - ngx_stream_ssl_srv_conf_t *prev = parent; - ngx_stream_ssl_srv_conf_t *conf = child; - - ngx_pool_cleanup_t *cln; - - ngx_conf_merge_msec_value(conf->handshake_timeout, - prev->handshake_timeout, 60000); - - ngx_conf_merge_value(conf->session_timeout, - prev->session_timeout, 300); - - ngx_conf_merge_value(conf->prefer_server_ciphers, - prev->prefer_server_ciphers, 0); - - ngx_conf_merge_value(conf->certificate_compression, - prev->certificate_compression, 0); - - ngx_conf_merge_value(conf->reject_handshake, prev->reject_handshake, 0); - - ngx_conf_merge_bitmask_value(conf->protocols, prev->protocols, - (NGX_CONF_BITMASK_SET|NGX_SSL_DEFAULT_PROTOCOLS)); - - ngx_conf_merge_uint_value(conf->verify, prev->verify, 0); - ngx_conf_merge_uint_value(conf->verify_depth, prev->verify_depth, 1); - - ngx_conf_merge_ptr_value(conf->certificates, prev->certificates, NULL); - ngx_conf_merge_ptr_value(conf->certificate_keys, prev->certificate_keys, - NULL); - - ngx_conf_merge_ptr_value(conf->certificate_cache, prev->certificate_cache, - NULL); - - ngx_conf_merge_ptr_value(conf->ech_files, prev->ech_files, NULL); - - ngx_conf_merge_ptr_value(conf->passwords, prev->passwords, NULL); - - ngx_conf_merge_str_value(conf->dhparam, prev->dhparam, ""); - - ngx_conf_merge_str_value(conf->client_certificate, prev->client_certificate, - ""); - ngx_conf_merge_str_value(conf->trusted_certificate, - prev->trusted_certificate, ""); - ngx_conf_merge_str_value(conf->crl, prev->crl, ""); - ngx_conf_merge_str_value(conf->alpn, prev->alpn, ""); - - ngx_conf_merge_str_value(conf->ecdh_curve, prev->ecdh_curve, - NGX_DEFAULT_ECDH_CURVE); - - ngx_conf_merge_str_value(conf->ciphers, prev->ciphers, NGX_DEFAULT_CIPHERS); - - ngx_conf_merge_ptr_value(conf->conf_commands, prev->conf_commands, NULL); - - ngx_conf_merge_uint_value(conf->ocsp, prev->ocsp, 0); - ngx_conf_merge_str_value(conf->ocsp_responder, prev->ocsp_responder, ""); - ngx_conf_merge_ptr_value(conf->ocsp_cache_zone, - prev->ocsp_cache_zone, NULL); - - ngx_conf_merge_value(conf->stapling, prev->stapling, 0); - ngx_conf_merge_value(conf->stapling_verify, prev->stapling_verify, 0); - ngx_conf_merge_str_value(conf->stapling_file, prev->stapling_file, ""); - ngx_conf_merge_str_value(conf->stapling_responder, - prev->stapling_responder, ""); - - conf->ssl.log = cf->log; - - if (conf->certificates) { - - if (conf->certificate_keys == NULL - || conf->certificate_keys->nelts < conf->certificates->nelts) - { - ngx_log_error(NGX_LOG_EMERG, cf->log, 0, - "no \"ssl_certificate_key\" is defined " - "for certificate \"%V\"", - ((ngx_str_t *) conf->certificates->elts) - + conf->certificates->nelts - 1); - return NGX_CONF_ERROR; - } - - } else if (!conf->reject_handshake) { - return NGX_CONF_OK; - } - - if (ngx_ssl_create(&conf->ssl, conf->protocols, NULL) != NGX_OK) { - return NGX_CONF_ERROR; - } - - cln = ngx_pool_cleanup_add(cf->pool, 0); - if (cln == NULL) { - ngx_ssl_cleanup_ctx(&conf->ssl); - return NGX_CONF_ERROR; - } - - cln->handler = ngx_ssl_cleanup_ctx; - cln->data = &conf->ssl; - -#ifdef SSL_CTRL_SET_TLSEXT_HOSTNAME - { - static ngx_ssl_client_hello_arg cb = { ngx_stream_ssl_servername }; - - if (ngx_ssl_set_client_hello_callback(&conf->ssl, &cb) != NGX_OK) { - return NGX_CONF_ERROR; - } - - SSL_CTX_set_tlsext_servername_callback(conf->ssl.ctx, - ngx_stream_ssl_servername); - } -#endif - -#ifdef TLSEXT_TYPE_application_layer_protocol_negotiation - if (conf->alpn.len) { - SSL_CTX_set_alpn_select_cb(conf->ssl.ctx, ngx_stream_ssl_alpn_select, - &conf->alpn); - } -#endif - - if (ngx_ssl_ciphers(cf, &conf->ssl, &conf->ciphers, - conf->prefer_server_ciphers) - != NGX_OK) - { - return NGX_CONF_ERROR; - } - - if (ngx_stream_ssl_compile_certificates(cf, conf) != NGX_OK) { - return NGX_CONF_ERROR; - } - - if (conf->certificate_values) { - -#ifdef SSL_R_CERT_CB_ERROR - - /* install callback to lookup certificates */ - - SSL_CTX_set_cert_cb(conf->ssl.ctx, ngx_stream_ssl_certificate, conf); - -#else - ngx_log_error(NGX_LOG_EMERG, cf->log, 0, - "variables in " - "\"ssl_certificate\" and \"ssl_certificate_key\" " - "directives are not supported on this platform"); - return NGX_CONF_ERROR; -#endif - - } else if (conf->certificates) { - - /* configure certificates */ - - if (ngx_ssl_certificates(cf, &conf->ssl, conf->certificates, - conf->certificate_keys, conf->passwords) - != NGX_OK) - { - return NGX_CONF_ERROR; - } - - if (ngx_ssl_certificate_compression(cf, &conf->ssl, - conf->certificate_compression) - != NGX_OK) - { - return NGX_CONF_ERROR; - } - } - - if (conf->verify) { - - if (conf->verify != 3 - && conf->client_certificate.len == 0 - && conf->trusted_certificate.len == 0) - { - ngx_log_error(NGX_LOG_EMERG, cf->log, 0, - "no ssl_client_certificate or " - "ssl_trusted_certificate for ssl_verify_client"); - return NGX_CONF_ERROR; - } - - if (ngx_ssl_client_certificate(cf, &conf->ssl, - &conf->client_certificate, - conf->verify_depth) - != NGX_OK) - { - return NGX_CONF_ERROR; - } - } - - if (ngx_ssl_trusted_certificate(cf, &conf->ssl, - &conf->trusted_certificate, - conf->verify_depth) - != NGX_OK) - { - return NGX_CONF_ERROR; - } - - if (ngx_ssl_crl(cf, &conf->ssl, &conf->crl) != NGX_OK) { - return NGX_CONF_ERROR; - } - - if (conf->ocsp) { - - if (conf->verify == 3) { - ngx_log_error(NGX_LOG_EMERG, cf->log, 0, - "\"ssl_ocsp\" is incompatible with " - "\"ssl_verify_client optional_no_ca\""); - return NGX_CONF_ERROR; - } - - if (ngx_ssl_ocsp(cf, &conf->ssl, &conf->ocsp_responder, conf->ocsp, - conf->ocsp_cache_zone) - != NGX_OK) - { - return NGX_CONF_ERROR; - } - } - - if (ngx_ssl_dhparam(cf, &conf->ssl, &conf->dhparam) != NGX_OK) { - return NGX_CONF_ERROR; - } - - if (ngx_ssl_ech_files(cf, &conf->ssl, conf->ech_files) != NGX_OK) { - return NGX_CONF_ERROR; - } - - if (ngx_ssl_ecdh_curve(cf, &conf->ssl, &conf->ecdh_curve) != NGX_OK) { - return NGX_CONF_ERROR; - } - - ngx_conf_merge_value(conf->builtin_session_cache, - prev->builtin_session_cache, NGX_SSL_NONE_SCACHE); - - if (conf->shm_zone == NULL) { - conf->shm_zone = prev->shm_zone; - } - - if (ngx_ssl_session_cache(&conf->ssl, &ngx_stream_ssl_sess_id_ctx, - conf->certificates, conf->builtin_session_cache, - conf->shm_zone, conf->session_timeout) - != NGX_OK) - { - return NGX_CONF_ERROR; - } - - ngx_conf_merge_value(conf->session_tickets, - prev->session_tickets, 1); - -#ifdef SSL_OP_NO_TICKET - if (!conf->session_tickets) { - SSL_CTX_set_options(conf->ssl.ctx, SSL_OP_NO_TICKET); - } -#endif - - ngx_conf_merge_ptr_value(conf->session_ticket_keys, - prev->session_ticket_keys, NULL); - - if (ngx_ssl_session_ticket_keys(cf, &conf->ssl, conf->session_ticket_keys) - != NGX_OK) - { - return NGX_CONF_ERROR; - } - - if (conf->stapling) { - - if (conf->certificate_compression) { - ngx_log_error(NGX_LOG_EMERG, cf->log, 0, - "\"ssl_stapling\" is incompatible with " - "\"ssl_certificate_compression\""); - return NGX_CONF_ERROR; - } - - if (ngx_ssl_stapling(cf, &conf->ssl, &conf->stapling_file, - &conf->stapling_responder, conf->stapling_verify) - != NGX_OK) - { - return NGX_CONF_ERROR; - } - } - - if (ngx_ssl_conf_commands(cf, &conf->ssl, conf->conf_commands) != NGX_OK) { - return NGX_CONF_ERROR; - } - - return NGX_CONF_OK; -} - - -static ngx_int_t -ngx_stream_ssl_compile_certificates(ngx_conf_t *cf, - ngx_stream_ssl_srv_conf_t *conf) -{ - ngx_str_t *cert, *key; - ngx_uint_t i, nelts; - ngx_stream_complex_value_t *cv; - ngx_stream_compile_complex_value_t ccv; - - if (conf->certificates == NULL) { - return NGX_OK; - } - - cert = conf->certificates->elts; - key = conf->certificate_keys->elts; - nelts = conf->certificates->nelts; - - for (i = 0; i < nelts; i++) { - - if (ngx_stream_script_variables_count(&cert[i])) { - goto found; - } - - if (ngx_stream_script_variables_count(&key[i])) { - goto found; - } - } - - return NGX_OK; - -found: - - conf->certificate_values = ngx_array_create(cf->pool, nelts, - sizeof(ngx_stream_complex_value_t)); - if (conf->certificate_values == NULL) { - return NGX_ERROR; - } - - conf->certificate_key_values = ngx_array_create(cf->pool, nelts, - sizeof(ngx_stream_complex_value_t)); - if (conf->certificate_key_values == NULL) { - return NGX_ERROR; - } - - for (i = 0; i < nelts; i++) { - - cv = ngx_array_push(conf->certificate_values); - if (cv == NULL) { - return NGX_ERROR; - } - - ngx_memzero(&ccv, sizeof(ngx_stream_compile_complex_value_t)); - - ccv.cf = cf; - ccv.value = &cert[i]; - ccv.complex_value = cv; - ccv.zero = 1; - - if (ngx_stream_compile_complex_value(&ccv) != NGX_OK) { - return NGX_ERROR; - } - - cv = ngx_array_push(conf->certificate_key_values); - if (cv == NULL) { - return NGX_ERROR; - } - - ngx_memzero(&ccv, sizeof(ngx_stream_compile_complex_value_t)); - - ccv.cf = cf; - ccv.value = &key[i]; - ccv.complex_value = cv; - ccv.zero = 1; - - if (ngx_stream_compile_complex_value(&ccv) != NGX_OK) { - return NGX_ERROR; - } - } - - conf->passwords = ngx_ssl_preserve_passwords(cf, conf->passwords); - if (conf->passwords == NULL) { - return NGX_ERROR; - } - - return NGX_OK; -} - - -static char * -ngx_stream_ssl_certificate_cache(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) -{ - ngx_stream_ssl_srv_conf_t *sscf = conf; - - time_t inactive, valid; - ngx_str_t *value, s; - ngx_int_t max; - ngx_uint_t i; - - if (sscf->certificate_cache != NGX_CONF_UNSET_PTR) { - return "is duplicate"; - } - - value = cf->args->elts; - - max = 0; - inactive = 10; - valid = 60; - - for (i = 1; i < cf->args->nelts; i++) { - - if (ngx_strncmp(value[i].data, "max=", 4) == 0) { - - max = ngx_atoi(value[i].data + 4, value[i].len - 4); - if (max <= 0) { - goto failed; - } - - continue; - } - - if (ngx_strncmp(value[i].data, "inactive=", 9) == 0) { - - s.len = value[i].len - 9; - s.data = value[i].data + 9; - - inactive = ngx_parse_time(&s, 1); - if (inactive == (time_t) NGX_ERROR) { - goto failed; - } - - continue; - } - - if (ngx_strncmp(value[i].data, "valid=", 6) == 0) { - - s.len = value[i].len - 6; - s.data = value[i].data + 6; - - valid = ngx_parse_time(&s, 1); - if (valid == (time_t) NGX_ERROR) { - goto failed; - } - - continue; - } - - if (ngx_strcmp(value[i].data, "off") == 0) { - - sscf->certificate_cache = NULL; - - continue; - } - - failed: - - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "invalid parameter \"%V\"", &value[i]); - return NGX_CONF_ERROR; - } - - if (sscf->certificate_cache == NULL) { - return NGX_CONF_OK; - } - - if (max == 0) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "\"ssl_certificate_cache\" must have " - "the \"max\" parameter"); - return NGX_CONF_ERROR; - } - - sscf->certificate_cache = ngx_ssl_cache_init(cf->pool, max, valid, - inactive); - if (sscf->certificate_cache == NULL) { - return NGX_CONF_ERROR; - } - - return NGX_CONF_OK; -} - - -static char * -ngx_stream_ssl_password_file(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) -{ - ngx_stream_ssl_srv_conf_t *sscf = conf; - - ngx_str_t *value; - - if (sscf->passwords != NGX_CONF_UNSET_PTR) { - return "is duplicate"; - } - - value = cf->args->elts; - - sscf->passwords = ngx_ssl_read_password_file(cf, &value[1]); - - if (sscf->passwords == NULL) { - return NGX_CONF_ERROR; - } - - return NGX_CONF_OK; -} - - -static char * -ngx_stream_ssl_session_cache(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) -{ - ngx_stream_ssl_srv_conf_t *sscf = conf; - - size_t len; - ngx_str_t *value, name, size; - ngx_int_t n; - ngx_uint_t i, j; - - value = cf->args->elts; - - for (i = 1; i < cf->args->nelts; i++) { - - if (ngx_strcmp(value[i].data, "off") == 0) { - sscf->builtin_session_cache = NGX_SSL_NO_SCACHE; - continue; - } - - if (ngx_strcmp(value[i].data, "none") == 0) { - sscf->builtin_session_cache = NGX_SSL_NONE_SCACHE; - continue; - } - - if (ngx_strcmp(value[i].data, "builtin") == 0) { - sscf->builtin_session_cache = NGX_SSL_DFLT_BUILTIN_SCACHE; - continue; - } - - if (value[i].len > sizeof("builtin:") - 1 - && ngx_strncmp(value[i].data, "builtin:", sizeof("builtin:") - 1) - == 0) - { - n = ngx_atoi(value[i].data + sizeof("builtin:") - 1, - value[i].len - (sizeof("builtin:") - 1)); - - if (n == NGX_ERROR) { - goto invalid; - } - - sscf->builtin_session_cache = n; - - continue; - } - - if (value[i].len > sizeof("shared:") - 1 - && ngx_strncmp(value[i].data, "shared:", sizeof("shared:") - 1) - == 0) - { - len = 0; - - for (j = sizeof("shared:") - 1; j < value[i].len; j++) { - if (value[i].data[j] == ':') { - break; - } - - len++; - } - - if (len == 0 || j == value[i].len) { - goto invalid; - } - - name.len = len; - name.data = value[i].data + sizeof("shared:") - 1; - - size.len = value[i].len - j - 1; - size.data = name.data + len + 1; - - n = ngx_parse_size(&size); - - if (n == NGX_ERROR) { - goto invalid; - } - - if (n < (ngx_int_t) (8 * ngx_pagesize)) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "session cache \"%V\" is too small", - &value[i]); - - return NGX_CONF_ERROR; - } - - sscf->shm_zone = ngx_shared_memory_add(cf, &name, n, - &ngx_stream_ssl_module); - if (sscf->shm_zone == NULL) { - return NGX_CONF_ERROR; - } - - sscf->shm_zone->init = ngx_ssl_session_cache_init; - - continue; - } - - goto invalid; - } - - if (sscf->shm_zone && sscf->builtin_session_cache == NGX_CONF_UNSET) { - sscf->builtin_session_cache = NGX_SSL_NO_BUILTIN_SCACHE; - } - - return NGX_CONF_OK; - -invalid: - - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "invalid session cache \"%V\"", &value[i]); - - return NGX_CONF_ERROR; -} - - -static char * -ngx_stream_ssl_ocsp_cache(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) -{ - ngx_stream_ssl_srv_conf_t *sscf = conf; - - size_t len; - ngx_int_t n; - ngx_str_t *value, name, size; - ngx_uint_t j; - - if (sscf->ocsp_cache_zone != NGX_CONF_UNSET_PTR) { - return "is duplicate"; - } - - value = cf->args->elts; - - if (ngx_strcmp(value[1].data, "off") == 0) { - sscf->ocsp_cache_zone = NULL; - return NGX_CONF_OK; - } - - if (value[1].len <= sizeof("shared:") - 1 - || ngx_strncmp(value[1].data, "shared:", sizeof("shared:") - 1) != 0) - { - goto invalid; - } - - len = 0; - - for (j = sizeof("shared:") - 1; j < value[1].len; j++) { - if (value[1].data[j] == ':') { - break; - } - - len++; - } - - if (len == 0 || j == value[1].len) { - goto invalid; - } - - name.len = len; - name.data = value[1].data + sizeof("shared:") - 1; - - size.len = value[1].len - j - 1; - size.data = name.data + len + 1; - - n = ngx_parse_size(&size); - - if (n == NGX_ERROR) { - goto invalid; - } - - if (n < (ngx_int_t) (8 * ngx_pagesize)) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "OCSP cache \"%V\" is too small", &value[1]); - - return NGX_CONF_ERROR; - } - - sscf->ocsp_cache_zone = ngx_shared_memory_add(cf, &name, n, - &ngx_stream_ssl_module_ctx); - if (sscf->ocsp_cache_zone == NULL) { - return NGX_CONF_ERROR; - } - - sscf->ocsp_cache_zone->init = ngx_ssl_ocsp_cache_init; - - return NGX_CONF_OK; - -invalid: - - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "invalid OCSP cache \"%V\"", &value[1]); - - return NGX_CONF_ERROR; -} - - -static char * -ngx_stream_ssl_alpn(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) -{ -#ifdef TLSEXT_TYPE_application_layer_protocol_negotiation - - ngx_stream_ssl_srv_conf_t *sscf = conf; - - u_char *p; - size_t len; - ngx_str_t *value; - ngx_uint_t i; - - if (sscf->alpn.len) { - return "is duplicate"; - } - - value = cf->args->elts; - - len = 0; - - for (i = 1; i < cf->args->nelts; i++) { - - if (value[i].len > 255) { - return "protocol too long"; - } - - len += value[i].len + 1; - } - - sscf->alpn.data = ngx_pnalloc(cf->pool, len); - if (sscf->alpn.data == NULL) { - return NGX_CONF_ERROR; - } - - p = sscf->alpn.data; - - for (i = 1; i < cf->args->nelts; i++) { - *p++ = value[i].len; - p = ngx_cpymem(p, value[i].data, value[i].len); - } - - sscf->alpn.len = len; - - return NGX_CONF_OK; - -#else - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "the \"ssl_alpn\" directive requires OpenSSL " - "with ALPN support"); - return NGX_CONF_ERROR; -#endif -} - - -static char * -ngx_stream_ssl_conf_command_check(ngx_conf_t *cf, void *post, void *data) -{ -#ifndef SSL_CONF_FLAG_FILE - return "is not supported on this platform"; -#else - return NGX_CONF_OK; -#endif -} - - -static ngx_int_t -ngx_stream_ssl_init(ngx_conf_t *cf) -{ - ngx_uint_t a, p, s; - ngx_stream_handler_pt *h; - ngx_stream_conf_addr_t *addr; - ngx_stream_conf_port_t *port; - ngx_stream_ssl_srv_conf_t *sscf; - ngx_stream_core_srv_conf_t **cscfp, *cscf; - ngx_stream_core_main_conf_t *cmcf; - - cmcf = ngx_stream_conf_get_module_main_conf(cf, ngx_stream_core_module); - cscfp = cmcf->servers.elts; - - for (s = 0; s < cmcf->servers.nelts; s++) { - - sscf = cscfp[s]->ctx->srv_conf[ngx_stream_ssl_module.ctx_index]; - - if (sscf->ssl.ctx == NULL) { - continue; - } - - cscf = cscfp[s]->ctx->srv_conf[ngx_stream_core_module.ctx_index]; - - if (sscf->stapling) { - if (ngx_ssl_stapling_resolver(cf, &sscf->ssl, cscf->resolver, - cscf->resolver_timeout) - != NGX_OK) - { - return NGX_ERROR; - } - } - - if (sscf->ocsp) { - if (ngx_ssl_ocsp_resolver(cf, &sscf->ssl, cscf->resolver, - cscf->resolver_timeout) - != NGX_OK) - { - return NGX_ERROR; - } - } - } - - h = ngx_array_push(&cmcf->phases[NGX_STREAM_SSL_PHASE].handlers); - if (h == NULL) { - return NGX_ERROR; - } - - *h = ngx_stream_ssl_handler; - - if (cmcf->ports == NULL) { - return NGX_OK; - } - - port = cmcf->ports->elts; - for (p = 0; p < cmcf->ports->nelts; p++) { - - addr = port[p].addrs.elts; - for (a = 0; a < port[p].addrs.nelts; a++) { - - if (!addr[a].opt.ssl) { - continue; - } - - cscf = addr[a].default_server; - sscf = cscf->ctx->srv_conf[ngx_stream_ssl_module.ctx_index]; - - if (sscf->certificates) { - continue; - } - - if (!sscf->reject_handshake) { - ngx_log_error(NGX_LOG_EMERG, cf->log, 0, - "no \"ssl_certificate\" is defined for " - "the \"listen ... ssl\" directive in %s:%ui", - cscf->file_name, cscf->line); - return NGX_ERROR; - } - - /* - * if no certificates are defined in the default server, - * check all non-default server blocks - */ - - cscfp = addr[a].servers.elts; - for (s = 0; s < addr[a].servers.nelts; s++) { - - cscf = cscfp[s]; - sscf = cscf->ctx->srv_conf[ngx_stream_ssl_module.ctx_index]; - - if (sscf->certificates || sscf->reject_handshake) { - continue; - } - - ngx_log_error(NGX_LOG_EMERG, cf->log, 0, - "no \"ssl_certificate\" is defined for " - "the \"listen ... ssl\" directive in %s:%ui", - cscf->file_name, cscf->line); - return NGX_ERROR; - } - } - } - - return NGX_OK; -} diff --git a/src/deps/src/nginx-1.30.3/src/stream/ngx_stream_ssl_module.h b/src/deps/src/nginx-1.30.3/src/stream/ngx_stream_ssl_module.h deleted file mode 100644 index 6fdd8f88cd..0000000000 --- a/src/deps/src/nginx-1.30.3/src/stream/ngx_stream_ssl_module.h +++ /dev/null @@ -1,75 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#ifndef _NGX_STREAM_SSL_H_INCLUDED_ -#define _NGX_STREAM_SSL_H_INCLUDED_ - - -#include -#include -#include - - -typedef struct { - ngx_msec_t handshake_timeout; - - ngx_flag_t prefer_server_ciphers; - ngx_flag_t certificate_compression; - ngx_flag_t reject_handshake; - - ngx_ssl_t ssl; - - ngx_uint_t protocols; - - ngx_uint_t verify; - ngx_uint_t verify_depth; - - ssize_t builtin_session_cache; - - time_t session_timeout; - - ngx_array_t *certificates; - ngx_array_t *certificate_keys; - - ngx_array_t *certificate_values; - ngx_array_t *certificate_key_values; - - ngx_ssl_cache_t *certificate_cache; - - ngx_str_t dhparam; - ngx_str_t ecdh_curve; - ngx_str_t client_certificate; - ngx_str_t trusted_certificate; - ngx_str_t crl; - ngx_str_t alpn; - - ngx_str_t ciphers; - - ngx_array_t *ech_files; - ngx_array_t *passwords; - ngx_array_t *conf_commands; - - ngx_shm_zone_t *shm_zone; - - ngx_flag_t session_tickets; - ngx_array_t *session_ticket_keys; - - ngx_uint_t ocsp; - ngx_str_t ocsp_responder; - ngx_shm_zone_t *ocsp_cache_zone; - - ngx_flag_t stapling; - ngx_flag_t stapling_verify; - ngx_str_t stapling_file; - ngx_str_t stapling_responder; -} ngx_stream_ssl_srv_conf_t; - - -extern ngx_module_t ngx_stream_ssl_module; - - -#endif /* _NGX_STREAM_SSL_H_INCLUDED_ */ diff --git a/src/deps/src/nginx-1.30.3/src/stream/ngx_stream_ssl_preread_module.c b/src/deps/src/nginx-1.30.3/src/stream/ngx_stream_ssl_preread_module.c deleted file mode 100644 index 3fc83ff2f4..0000000000 --- a/src/deps/src/nginx-1.30.3/src/stream/ngx_stream_ssl_preread_module.c +++ /dev/null @@ -1,715 +0,0 @@ - -/* - * Copyright (C) Nginx, Inc. - */ - - -#include -#include -#include - - -typedef struct { - ngx_flag_t enabled; -} ngx_stream_ssl_preread_srv_conf_t; - - -typedef struct { - size_t left; - size_t size; - size_t ext; - u_char *pos; - u_char *dst; - u_char buf[4]; - u_char version[2]; - ngx_str_t host; - ngx_str_t alpn; - ngx_log_t *log; - ngx_pool_t *pool; - ngx_uint_t state; -} ngx_stream_ssl_preread_ctx_t; - - -static ngx_int_t ngx_stream_ssl_preread_handler(ngx_stream_session_t *s); -static ngx_int_t ngx_stream_ssl_preread_parse_record( - ngx_stream_ssl_preread_ctx_t *ctx, u_char *pos, u_char *last); -static ngx_int_t ngx_stream_ssl_preread_servername(ngx_stream_session_t *s, - ngx_str_t *servername); -static ngx_int_t ngx_stream_ssl_preread_protocol_variable( - ngx_stream_session_t *s, ngx_stream_variable_value_t *v, uintptr_t data); -static ngx_int_t ngx_stream_ssl_preread_server_name_variable( - ngx_stream_session_t *s, ngx_stream_variable_value_t *v, uintptr_t data); -static ngx_int_t ngx_stream_ssl_preread_alpn_protocols_variable( - ngx_stream_session_t *s, ngx_stream_variable_value_t *v, uintptr_t data); -static ngx_int_t ngx_stream_ssl_preread_add_variables(ngx_conf_t *cf); -static void *ngx_stream_ssl_preread_create_srv_conf(ngx_conf_t *cf); -static char *ngx_stream_ssl_preread_merge_srv_conf(ngx_conf_t *cf, void *parent, - void *child); -static ngx_int_t ngx_stream_ssl_preread_init(ngx_conf_t *cf); - - -static ngx_command_t ngx_stream_ssl_preread_commands[] = { - - { ngx_string("ssl_preread"), - NGX_STREAM_MAIN_CONF|NGX_STREAM_SRV_CONF|NGX_CONF_FLAG, - ngx_conf_set_flag_slot, - NGX_STREAM_SRV_CONF_OFFSET, - offsetof(ngx_stream_ssl_preread_srv_conf_t, enabled), - NULL }, - - ngx_null_command -}; - - -static ngx_stream_module_t ngx_stream_ssl_preread_module_ctx = { - ngx_stream_ssl_preread_add_variables, /* preconfiguration */ - ngx_stream_ssl_preread_init, /* postconfiguration */ - - NULL, /* create main configuration */ - NULL, /* init main configuration */ - - ngx_stream_ssl_preread_create_srv_conf, /* create server configuration */ - ngx_stream_ssl_preread_merge_srv_conf /* merge server configuration */ -}; - - -ngx_module_t ngx_stream_ssl_preread_module = { - NGX_MODULE_V1, - &ngx_stream_ssl_preread_module_ctx, /* module context */ - ngx_stream_ssl_preread_commands, /* module directives */ - NGX_STREAM_MODULE, /* module type */ - NULL, /* init master */ - NULL, /* init module */ - NULL, /* init process */ - NULL, /* init thread */ - NULL, /* exit thread */ - NULL, /* exit process */ - NULL, /* exit master */ - NGX_MODULE_V1_PADDING -}; - - -static ngx_stream_variable_t ngx_stream_ssl_preread_vars[] = { - - { ngx_string("ssl_preread_protocol"), NULL, - ngx_stream_ssl_preread_protocol_variable, 0, 0, 0 }, - - { ngx_string("ssl_preread_server_name"), NULL, - ngx_stream_ssl_preread_server_name_variable, 0, 0, 0 }, - - { ngx_string("ssl_preread_alpn_protocols"), NULL, - ngx_stream_ssl_preread_alpn_protocols_variable, 0, 0, 0 }, - - ngx_stream_null_variable -}; - - -static ngx_int_t -ngx_stream_ssl_preread_handler(ngx_stream_session_t *s) -{ - u_char *last, *p; - size_t len; - ngx_int_t rc; - ngx_connection_t *c; - ngx_stream_ssl_preread_ctx_t *ctx; - ngx_stream_ssl_preread_srv_conf_t *sscf; - - c = s->connection; - - ngx_log_debug0(NGX_LOG_DEBUG_STREAM, c->log, 0, "ssl preread handler"); - - sscf = ngx_stream_get_module_srv_conf(s, ngx_stream_ssl_preread_module); - - if (!sscf->enabled) { - return NGX_DECLINED; - } - - if (c->type != SOCK_STREAM) { - return NGX_DECLINED; - } - - if (c->buffer == NULL) { - return NGX_AGAIN; - } - - ctx = ngx_stream_get_module_ctx(s, ngx_stream_ssl_preread_module); - if (ctx == NULL) { - ctx = ngx_pcalloc(c->pool, sizeof(ngx_stream_ssl_preread_ctx_t)); - if (ctx == NULL) { - return NGX_ERROR; - } - - ngx_stream_set_ctx(s, ctx, ngx_stream_ssl_preread_module); - - ctx->pool = c->pool; - ctx->log = c->log; - ctx->pos = c->buffer->pos; - } - - p = ctx->pos; - last = c->buffer->last; - - while (last - p >= 5) { - - if ((p[0] & 0x80) && p[2] == 1 && (p[3] == 0 || p[3] == 3)) { - ngx_log_debug0(NGX_LOG_DEBUG_STREAM, ctx->log, 0, - "ssl preread: version 2 ClientHello"); - ctx->version[0] = p[3]; - ctx->version[1] = p[4]; - return NGX_OK; - } - - if (p[0] != 0x16) { - ngx_log_debug0(NGX_LOG_DEBUG_STREAM, ctx->log, 0, - "ssl preread: not a handshake"); - ngx_stream_set_ctx(s, NULL, ngx_stream_ssl_preread_module); - return NGX_DECLINED; - } - - if (p[1] != 3) { - ngx_log_debug0(NGX_LOG_DEBUG_STREAM, ctx->log, 0, - "ssl preread: unsupported SSL version"); - ngx_stream_set_ctx(s, NULL, ngx_stream_ssl_preread_module); - return NGX_DECLINED; - } - - len = (p[3] << 8) + p[4]; - - /* read the whole record before parsing */ - if ((size_t) (last - p) < len + 5) { - break; - } - - p += 5; - - rc = ngx_stream_ssl_preread_parse_record(ctx, p, p + len); - - if (rc == NGX_DECLINED) { - ngx_stream_set_ctx(s, NULL, ngx_stream_ssl_preread_module); - return NGX_DECLINED; - } - - if (rc == NGX_OK) { - return ngx_stream_ssl_preread_servername(s, &ctx->host); - } - - if (rc != NGX_AGAIN) { - return rc; - } - - p += len; - } - - ctx->pos = p; - - return NGX_AGAIN; -} - - -static ngx_int_t -ngx_stream_ssl_preread_parse_record(ngx_stream_ssl_preread_ctx_t *ctx, - u_char *pos, u_char *last) -{ - size_t left, n, size, ext; - u_char *dst, *p; - - enum { - sw_start = 0, - sw_header, /* handshake msg_type, length */ - sw_version, /* client_version */ - sw_random, /* random */ - sw_sid_len, /* session_id length */ - sw_sid, /* session_id */ - sw_cs_len, /* cipher_suites length */ - sw_cs, /* cipher_suites */ - sw_cm_len, /* compression_methods length */ - sw_cm, /* compression_methods */ - sw_ext, /* extension */ - sw_ext_header, /* extension_type, extension_data length */ - sw_sni_len, /* SNI length */ - sw_sni_host_head, /* SNI name_type, host_name length */ - sw_sni_host, /* SNI host_name */ - sw_alpn_len, /* ALPN length */ - sw_alpn_proto_len, /* ALPN protocol_name length */ - sw_alpn_proto_data, /* ALPN protocol_name */ - sw_supver_len /* supported_versions length */ - } state; - - ngx_log_debug2(NGX_LOG_DEBUG_STREAM, ctx->log, 0, - "ssl preread: state %ui left %z", ctx->state, ctx->left); - - state = ctx->state; - size = ctx->size; - left = ctx->left; - ext = ctx->ext; - dst = ctx->dst; - p = ctx->buf; - - for ( ;; ) { - n = ngx_min((size_t) (last - pos), size); - - if (dst) { - dst = ngx_cpymem(dst, pos, n); - } - - pos += n; - size -= n; - left -= n; - - if (size != 0) { - break; - } - - switch (state) { - - case sw_start: - state = sw_header; - dst = p; - size = 4; - left = size; - break; - - case sw_header: - if (p[0] != 1) { - ngx_log_debug0(NGX_LOG_DEBUG_STREAM, ctx->log, 0, - "ssl preread: not a client hello"); - return NGX_DECLINED; - } - - state = sw_version; - dst = ctx->version; - size = 2; - left = (p[1] << 16) + (p[2] << 8) + p[3]; - break; - - case sw_version: - state = sw_random; - dst = NULL; - size = 32; - break; - - case sw_random: - state = sw_sid_len; - dst = p; - size = 1; - break; - - case sw_sid_len: - state = sw_sid; - dst = NULL; - size = p[0]; - break; - - case sw_sid: - state = sw_cs_len; - dst = p; - size = 2; - break; - - case sw_cs_len: - state = sw_cs; - dst = NULL; - size = (p[0] << 8) + p[1]; - break; - - case sw_cs: - state = sw_cm_len; - dst = p; - size = 1; - break; - - case sw_cm_len: - state = sw_cm; - dst = NULL; - size = p[0]; - break; - - case sw_cm: - if (left == 0) { - /* no extensions */ - return NGX_OK; - } - - state = sw_ext; - dst = p; - size = 2; - break; - - case sw_ext: - if (left == 0) { - return NGX_OK; - } - - state = sw_ext_header; - dst = p; - size = 4; - break; - - case sw_ext_header: - if (p[0] == 0 && p[1] == 0 && ctx->host.data == NULL) { - /* SNI extension */ - state = sw_sni_len; - dst = p; - size = 2; - break; - } - - if (p[0] == 0 && p[1] == 16 && ctx->alpn.data == NULL) { - /* ALPN extension */ - state = sw_alpn_len; - dst = p; - size = 2; - break; - } - - if (p[0] == 0 && p[1] == 43) { - /* supported_versions extension */ - state = sw_supver_len; - dst = p; - size = 1; - break; - } - - state = sw_ext; - dst = NULL; - size = (p[2] << 8) + p[3]; - break; - - case sw_sni_len: - ext = (p[0] << 8) + p[1]; - state = sw_sni_host_head; - dst = p; - size = 3; - break; - - case sw_sni_host_head: - if (p[0] != 0) { - ngx_log_debug0(NGX_LOG_DEBUG_STREAM, ctx->log, 0, - "ssl preread: SNI hostname type is not DNS"); - return NGX_DECLINED; - } - - size = (p[1] << 8) + p[2]; - - if (ext < 3 + size) { - ngx_log_debug0(NGX_LOG_DEBUG_STREAM, ctx->log, 0, - "ssl preread: SNI format error"); - return NGX_DECLINED; - } - ext -= 3 + size; - - ctx->host.data = ngx_pnalloc(ctx->pool, size); - if (ctx->host.data == NULL) { - return NGX_ERROR; - } - - state = sw_sni_host; - dst = ctx->host.data; - break; - - case sw_sni_host: - ctx->host.len = (p[1] << 8) + p[2]; - - state = sw_ext; - dst = NULL; - size = ext; - break; - - case sw_alpn_len: - ext = (p[0] << 8) + p[1]; - - ctx->alpn.data = ngx_pnalloc(ctx->pool, ext); - if (ctx->alpn.data == NULL) { - return NGX_ERROR; - } - - state = sw_alpn_proto_len; - dst = p; - size = 1; - break; - - case sw_alpn_proto_len: - size = p[0]; - - if (size == 0) { - ngx_log_debug0(NGX_LOG_DEBUG_STREAM, ctx->log, 0, - "ssl preread: ALPN empty protocol"); - return NGX_DECLINED; - } - - if (ext < 1 + size) { - ngx_log_debug0(NGX_LOG_DEBUG_STREAM, ctx->log, 0, - "ssl preread: ALPN format error"); - return NGX_DECLINED; - } - ext -= 1 + size; - - state = sw_alpn_proto_data; - dst = ctx->alpn.data + ctx->alpn.len; - break; - - case sw_alpn_proto_data: - ctx->alpn.len += p[0]; - - ngx_log_debug1(NGX_LOG_DEBUG_STREAM, ctx->log, 0, - "ssl preread: ALPN protocols \"%V\"", &ctx->alpn); - - if (ext) { - ctx->alpn.data[ctx->alpn.len++] = ','; - - state = sw_alpn_proto_len; - dst = p; - size = 1; - break; - } - - state = sw_ext; - dst = NULL; - size = 0; - break; - - case sw_supver_len: - ngx_log_debug0(NGX_LOG_DEBUG_STREAM, ctx->log, 0, - "ssl preread: supported_versions"); - - /* set TLSv1.3 */ - ctx->version[0] = 3; - ctx->version[1] = 4; - - state = sw_ext; - dst = NULL; - size = p[0]; - break; - } - - if (left < size) { - ngx_log_debug0(NGX_LOG_DEBUG_STREAM, ctx->log, 0, - "ssl preread: failed to parse handshake"); - return NGX_DECLINED; - } - } - - ctx->state = state; - ctx->size = size; - ctx->left = left; - ctx->ext = ext; - ctx->dst = dst; - - return NGX_AGAIN; -} - - -static ngx_int_t -ngx_stream_ssl_preread_servername(ngx_stream_session_t *s, - ngx_str_t *servername) -{ - ngx_int_t rc; - ngx_str_t host; - ngx_connection_t *c; - ngx_stream_core_srv_conf_t *cscf; - - c = s->connection; - - ngx_log_debug1(NGX_LOG_DEBUG_STREAM, c->log, 0, - "SSL preread server name: \"%V\"", servername); - - if (servername->len == 0) { - return NGX_OK; - } - - host = *servername; - - rc = ngx_stream_validate_host(&host, c->pool, 0); - - if (rc == NGX_ERROR) { - return NGX_ERROR; - } - - if (rc == NGX_DECLINED) { - return NGX_OK; - } - - rc = ngx_stream_find_virtual_server(s, &host, &cscf); - - if (rc == NGX_ERROR) { - return NGX_ERROR; - } - - if (rc == NGX_DECLINED) { - return NGX_OK; - } - - s->srv_conf = cscf->ctx->srv_conf; - - ngx_set_connection_log(c, cscf->error_log); - - return NGX_OK; -} - - -static ngx_int_t -ngx_stream_ssl_preread_protocol_variable(ngx_stream_session_t *s, - ngx_variable_value_t *v, uintptr_t data) -{ - ngx_str_t version; - ngx_stream_ssl_preread_ctx_t *ctx; - - ctx = ngx_stream_get_module_ctx(s, ngx_stream_ssl_preread_module); - - if (ctx == NULL) { - v->not_found = 1; - return NGX_OK; - } - - /* SSL_get_version() format */ - - ngx_str_null(&version); - - switch (ctx->version[0]) { - case 0: - switch (ctx->version[1]) { - case 2: - ngx_str_set(&version, "SSLv2"); - break; - } - break; - case 3: - switch (ctx->version[1]) { - case 0: - ngx_str_set(&version, "SSLv3"); - break; - case 1: - ngx_str_set(&version, "TLSv1"); - break; - case 2: - ngx_str_set(&version, "TLSv1.1"); - break; - case 3: - ngx_str_set(&version, "TLSv1.2"); - break; - case 4: - ngx_str_set(&version, "TLSv1.3"); - break; - } - } - - v->valid = 1; - v->no_cacheable = 0; - v->not_found = 0; - v->len = version.len; - v->data = version.data; - - return NGX_OK; -} - - -static ngx_int_t -ngx_stream_ssl_preread_server_name_variable(ngx_stream_session_t *s, - ngx_variable_value_t *v, uintptr_t data) -{ - ngx_stream_ssl_preread_ctx_t *ctx; - - ctx = ngx_stream_get_module_ctx(s, ngx_stream_ssl_preread_module); - - if (ctx == NULL) { - v->not_found = 1; - return NGX_OK; - } - - v->valid = 1; - v->no_cacheable = 0; - v->not_found = 0; - v->len = ctx->host.len; - v->data = ctx->host.data; - - return NGX_OK; -} - - -static ngx_int_t -ngx_stream_ssl_preread_alpn_protocols_variable(ngx_stream_session_t *s, - ngx_variable_value_t *v, uintptr_t data) -{ - ngx_stream_ssl_preread_ctx_t *ctx; - - ctx = ngx_stream_get_module_ctx(s, ngx_stream_ssl_preread_module); - - if (ctx == NULL) { - v->not_found = 1; - return NGX_OK; - } - - v->valid = 1; - v->no_cacheable = 0; - v->not_found = 0; - v->len = ctx->alpn.len; - v->data = ctx->alpn.data; - - return NGX_OK; -} - - -static ngx_int_t -ngx_stream_ssl_preread_add_variables(ngx_conf_t *cf) -{ - ngx_stream_variable_t *var, *v; - - for (v = ngx_stream_ssl_preread_vars; v->name.len; v++) { - var = ngx_stream_add_variable(cf, &v->name, v->flags); - if (var == NULL) { - return NGX_ERROR; - } - - var->get_handler = v->get_handler; - var->data = v->data; - } - - return NGX_OK; -} - - -static void * -ngx_stream_ssl_preread_create_srv_conf(ngx_conf_t *cf) -{ - ngx_stream_ssl_preread_srv_conf_t *conf; - - conf = ngx_pcalloc(cf->pool, sizeof(ngx_stream_ssl_preread_srv_conf_t)); - if (conf == NULL) { - return NULL; - } - - conf->enabled = NGX_CONF_UNSET; - - return conf; -} - - -static char * -ngx_stream_ssl_preread_merge_srv_conf(ngx_conf_t *cf, void *parent, void *child) -{ - ngx_stream_ssl_preread_srv_conf_t *prev = parent; - ngx_stream_ssl_preread_srv_conf_t *conf = child; - - ngx_conf_merge_value(conf->enabled, prev->enabled, 0); - - return NGX_CONF_OK; -} - - -static ngx_int_t -ngx_stream_ssl_preread_init(ngx_conf_t *cf) -{ - ngx_stream_handler_pt *h; - ngx_stream_core_main_conf_t *cmcf; - - cmcf = ngx_stream_conf_get_module_main_conf(cf, ngx_stream_core_module); - - h = ngx_array_push(&cmcf->phases[NGX_STREAM_PREREAD_PHASE].handlers); - if (h == NULL) { - return NGX_ERROR; - } - - *h = ngx_stream_ssl_preread_handler; - - return NGX_OK; -} diff --git a/src/deps/src/nginx-1.30.3/src/stream/ngx_stream_upstream.c b/src/deps/src/nginx-1.30.3/src/stream/ngx_stream_upstream.c deleted file mode 100644 index 006672cdf8..0000000000 --- a/src/deps/src/nginx-1.30.3/src/stream/ngx_stream_upstream.c +++ /dev/null @@ -1,868 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#include -#include -#include - - -static ngx_int_t ngx_stream_upstream_add_variables(ngx_conf_t *cf); -static ngx_int_t ngx_stream_upstream_addr_variable(ngx_stream_session_t *s, - ngx_stream_variable_value_t *v, uintptr_t data); -static ngx_int_t ngx_stream_upstream_response_time_variable( - ngx_stream_session_t *s, ngx_stream_variable_value_t *v, uintptr_t data); -static ngx_int_t ngx_stream_upstream_bytes_variable(ngx_stream_session_t *s, - ngx_stream_variable_value_t *v, uintptr_t data); - -static char *ngx_stream_upstream(ngx_conf_t *cf, ngx_command_t *cmd, - void *dummy); -static char *ngx_stream_upstream_server(ngx_conf_t *cf, ngx_command_t *cmd, - void *conf); -#if (NGX_STREAM_UPSTREAM_ZONE) -static char *ngx_stream_upstream_resolver(ngx_conf_t *cf, ngx_command_t *cmd, - void *conf); -#endif - -static void *ngx_stream_upstream_create_main_conf(ngx_conf_t *cf); -static char *ngx_stream_upstream_init_main_conf(ngx_conf_t *cf, void *conf); - - -static ngx_command_t ngx_stream_upstream_commands[] = { - - { ngx_string("upstream"), - NGX_STREAM_MAIN_CONF|NGX_CONF_BLOCK|NGX_CONF_TAKE1, - ngx_stream_upstream, - 0, - 0, - NULL }, - - { ngx_string("server"), - NGX_STREAM_UPS_CONF|NGX_CONF_1MORE, - ngx_stream_upstream_server, - NGX_STREAM_SRV_CONF_OFFSET, - 0, - NULL }, - -#if (NGX_STREAM_UPSTREAM_ZONE) - - { ngx_string("resolver"), - NGX_STREAM_UPS_CONF|NGX_CONF_1MORE, - ngx_stream_upstream_resolver, - NGX_STREAM_SRV_CONF_OFFSET, - 0, - NULL }, - - { ngx_string("resolver_timeout"), - NGX_STREAM_UPS_CONF|NGX_CONF_TAKE1, - ngx_conf_set_msec_slot, - NGX_STREAM_SRV_CONF_OFFSET, - offsetof(ngx_stream_upstream_srv_conf_t, resolver_timeout), - NULL }, - -#endif - - ngx_null_command -}; - - -static ngx_stream_module_t ngx_stream_upstream_module_ctx = { - ngx_stream_upstream_add_variables, /* preconfiguration */ - NULL, /* postconfiguration */ - - ngx_stream_upstream_create_main_conf, /* create main configuration */ - ngx_stream_upstream_init_main_conf, /* init main configuration */ - - NULL, /* create server configuration */ - NULL /* merge server configuration */ -}; - - -ngx_module_t ngx_stream_upstream_module = { - NGX_MODULE_V1, - &ngx_stream_upstream_module_ctx, /* module context */ - ngx_stream_upstream_commands, /* module directives */ - NGX_STREAM_MODULE, /* module type */ - NULL, /* init master */ - NULL, /* init module */ - NULL, /* init process */ - NULL, /* init thread */ - NULL, /* exit thread */ - NULL, /* exit process */ - NULL, /* exit master */ - NGX_MODULE_V1_PADDING -}; - - -static ngx_stream_variable_t ngx_stream_upstream_vars[] = { - - { ngx_string("upstream_addr"), NULL, - ngx_stream_upstream_addr_variable, 0, - NGX_STREAM_VAR_NOCACHEABLE, 0 }, - - { ngx_string("upstream_bytes_sent"), NULL, - ngx_stream_upstream_bytes_variable, 0, - NGX_STREAM_VAR_NOCACHEABLE, 0 }, - - { ngx_string("upstream_connect_time"), NULL, - ngx_stream_upstream_response_time_variable, 2, - NGX_STREAM_VAR_NOCACHEABLE, 0 }, - - { ngx_string("upstream_first_byte_time"), NULL, - ngx_stream_upstream_response_time_variable, 1, - NGX_STREAM_VAR_NOCACHEABLE, 0 }, - - { ngx_string("upstream_session_time"), NULL, - ngx_stream_upstream_response_time_variable, 0, - NGX_STREAM_VAR_NOCACHEABLE, 0 }, - - { ngx_string("upstream_bytes_received"), NULL, - ngx_stream_upstream_bytes_variable, 1, - NGX_STREAM_VAR_NOCACHEABLE, 0 }, - - ngx_stream_null_variable -}; - - -static ngx_int_t -ngx_stream_upstream_add_variables(ngx_conf_t *cf) -{ - ngx_stream_variable_t *var, *v; - - for (v = ngx_stream_upstream_vars; v->name.len; v++) { - var = ngx_stream_add_variable(cf, &v->name, v->flags); - if (var == NULL) { - return NGX_ERROR; - } - - var->get_handler = v->get_handler; - var->data = v->data; - } - - return NGX_OK; -} - - -static ngx_int_t -ngx_stream_upstream_addr_variable(ngx_stream_session_t *s, - ngx_stream_variable_value_t *v, uintptr_t data) -{ - u_char *p; - size_t len; - ngx_uint_t i; - ngx_stream_upstream_state_t *state; - - v->valid = 1; - v->no_cacheable = 0; - v->not_found = 0; - - if (s->upstream_states == NULL || s->upstream_states->nelts == 0) { - v->not_found = 1; - return NGX_OK; - } - - len = 0; - state = s->upstream_states->elts; - - for (i = 0; i < s->upstream_states->nelts; i++) { - if (state[i].peer) { - len += state[i].peer->len; - } - - len += 2; - } - - p = ngx_pnalloc(s->connection->pool, len); - if (p == NULL) { - return NGX_ERROR; - } - - v->data = p; - - i = 0; - - for ( ;; ) { - if (state[i].peer) { - p = ngx_cpymem(p, state[i].peer->data, state[i].peer->len); - } - - if (++i == s->upstream_states->nelts) { - break; - } - - *p++ = ','; - *p++ = ' '; - } - - v->len = p - v->data; - - return NGX_OK; -} - - -static ngx_int_t -ngx_stream_upstream_bytes_variable(ngx_stream_session_t *s, - ngx_stream_variable_value_t *v, uintptr_t data) -{ - u_char *p; - size_t len; - ngx_uint_t i; - ngx_stream_upstream_state_t *state; - - v->valid = 1; - v->no_cacheable = 0; - v->not_found = 0; - - if (s->upstream_states == NULL || s->upstream_states->nelts == 0) { - v->not_found = 1; - return NGX_OK; - } - - len = s->upstream_states->nelts * (NGX_OFF_T_LEN + 2); - - p = ngx_pnalloc(s->connection->pool, len); - if (p == NULL) { - return NGX_ERROR; - } - - v->data = p; - - i = 0; - state = s->upstream_states->elts; - - for ( ;; ) { - - if (data == 1) { - p = ngx_sprintf(p, "%O", state[i].bytes_received); - - } else { - p = ngx_sprintf(p, "%O", state[i].bytes_sent); - } - - if (++i == s->upstream_states->nelts) { - break; - } - - *p++ = ','; - *p++ = ' '; - } - - v->len = p - v->data; - - return NGX_OK; -} - - -static ngx_int_t -ngx_stream_upstream_response_time_variable(ngx_stream_session_t *s, - ngx_stream_variable_value_t *v, uintptr_t data) -{ - u_char *p; - size_t len; - ngx_uint_t i; - ngx_msec_int_t ms; - ngx_stream_upstream_state_t *state; - - v->valid = 1; - v->no_cacheable = 0; - v->not_found = 0; - - if (s->upstream_states == NULL || s->upstream_states->nelts == 0) { - v->not_found = 1; - return NGX_OK; - } - - len = s->upstream_states->nelts * (NGX_TIME_T_LEN + 4 + 2); - - p = ngx_pnalloc(s->connection->pool, len); - if (p == NULL) { - return NGX_ERROR; - } - - v->data = p; - - i = 0; - state = s->upstream_states->elts; - - for ( ;; ) { - - if (data == 1) { - ms = state[i].first_byte_time; - - } else if (data == 2) { - ms = state[i].connect_time; - - } else { - ms = state[i].response_time; - } - - if (ms != -1) { - ms = ngx_max(ms, 0); - p = ngx_sprintf(p, "%T.%03M", (time_t) ms / 1000, ms % 1000); - - } else { - *p++ = '-'; - } - - if (++i == s->upstream_states->nelts) { - break; - } - - *p++ = ','; - *p++ = ' '; - } - - v->len = p - v->data; - - return NGX_OK; -} - - -static char * -ngx_stream_upstream(ngx_conf_t *cf, ngx_command_t *cmd, void *dummy) -{ - char *rv; - void *mconf; - ngx_str_t *value; - ngx_url_t u; - ngx_uint_t m; - ngx_conf_t pcf; - ngx_stream_module_t *module; - ngx_stream_conf_ctx_t *ctx, *stream_ctx; - ngx_stream_upstream_srv_conf_t *uscf; - - ngx_memzero(&u, sizeof(ngx_url_t)); - - value = cf->args->elts; - u.host = value[1]; - u.no_resolve = 1; - u.no_port = 1; - - uscf = ngx_stream_upstream_add(cf, &u, NGX_STREAM_UPSTREAM_CREATE - |NGX_STREAM_UPSTREAM_MODIFY - |NGX_STREAM_UPSTREAM_WEIGHT - |NGX_STREAM_UPSTREAM_MAX_CONNS - |NGX_STREAM_UPSTREAM_MAX_FAILS - |NGX_STREAM_UPSTREAM_FAIL_TIMEOUT - |NGX_STREAM_UPSTREAM_DOWN - |NGX_STREAM_UPSTREAM_BACKUP); - if (uscf == NULL) { - return NGX_CONF_ERROR; - } - - - ctx = ngx_pcalloc(cf->pool, sizeof(ngx_stream_conf_ctx_t)); - if (ctx == NULL) { - return NGX_CONF_ERROR; - } - - stream_ctx = cf->ctx; - ctx->main_conf = stream_ctx->main_conf; - - /* the upstream{}'s srv_conf */ - - ctx->srv_conf = ngx_pcalloc(cf->pool, - sizeof(void *) * ngx_stream_max_module); - if (ctx->srv_conf == NULL) { - return NGX_CONF_ERROR; - } - - ctx->srv_conf[ngx_stream_upstream_module.ctx_index] = uscf; - - uscf->srv_conf = ctx->srv_conf; - - for (m = 0; cf->cycle->modules[m]; m++) { - if (cf->cycle->modules[m]->type != NGX_STREAM_MODULE) { - continue; - } - - module = cf->cycle->modules[m]->ctx; - - if (module->create_srv_conf) { - mconf = module->create_srv_conf(cf); - if (mconf == NULL) { - return NGX_CONF_ERROR; - } - - ctx->srv_conf[cf->cycle->modules[m]->ctx_index] = mconf; - } - } - - uscf->servers = ngx_array_create(cf->pool, 4, - sizeof(ngx_stream_upstream_server_t)); - if (uscf->servers == NULL) { - return NGX_CONF_ERROR; - } - - - /* parse inside upstream{} */ - - pcf = *cf; - cf->ctx = ctx; - cf->cmd_type = NGX_STREAM_UPS_CONF; - - rv = ngx_conf_parse(cf, NULL); - - *cf = pcf; - - if (rv != NGX_CONF_OK) { - return rv; - } - - if (uscf->servers->nelts == 0) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "no servers are inside upstream"); - return NGX_CONF_ERROR; - } - - return rv; -} - - -static char * -ngx_stream_upstream_server(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) -{ - ngx_stream_upstream_srv_conf_t *uscf = conf; - - time_t fail_timeout; - ngx_str_t *value, s; - ngx_url_t u; - ngx_int_t weight, max_conns, max_fails; - ngx_uint_t i; -#if (NGX_STREAM_UPSTREAM_ZONE) - ngx_uint_t resolve; -#endif - ngx_stream_upstream_server_t *us; - - us = ngx_array_push(uscf->servers); - if (us == NULL) { - return NGX_CONF_ERROR; - } - - ngx_memzero(us, sizeof(ngx_stream_upstream_server_t)); - - value = cf->args->elts; - - weight = 1; - max_conns = 0; - max_fails = 1; - fail_timeout = 10; -#if (NGX_STREAM_UPSTREAM_ZONE) - resolve = 0; -#endif - - for (i = 2; i < cf->args->nelts; i++) { - - if (ngx_strncmp(value[i].data, "weight=", 7) == 0) { - - if (!(uscf->flags & NGX_STREAM_UPSTREAM_WEIGHT)) { - goto not_supported; - } - - weight = ngx_atoi(&value[i].data[7], value[i].len - 7); - - if (weight == NGX_ERROR || weight == 0) { - goto invalid; - } - - continue; - } - - if (ngx_strncmp(value[i].data, "max_conns=", 10) == 0) { - - if (!(uscf->flags & NGX_STREAM_UPSTREAM_MAX_CONNS)) { - goto not_supported; - } - - max_conns = ngx_atoi(&value[i].data[10], value[i].len - 10); - - if (max_conns == NGX_ERROR) { - goto invalid; - } - - continue; - } - - if (ngx_strncmp(value[i].data, "max_fails=", 10) == 0) { - - if (!(uscf->flags & NGX_STREAM_UPSTREAM_MAX_FAILS)) { - goto not_supported; - } - - max_fails = ngx_atoi(&value[i].data[10], value[i].len - 10); - - if (max_fails == NGX_ERROR) { - goto invalid; - } - - continue; - } - - if (ngx_strncmp(value[i].data, "fail_timeout=", 13) == 0) { - - if (!(uscf->flags & NGX_STREAM_UPSTREAM_FAIL_TIMEOUT)) { - goto not_supported; - } - - s.len = value[i].len - 13; - s.data = &value[i].data[13]; - - fail_timeout = ngx_parse_time(&s, 1); - - if (fail_timeout == (time_t) NGX_ERROR) { - goto invalid; - } - - continue; - } - - if (ngx_strcmp(value[i].data, "backup") == 0) { - - if (!(uscf->flags & NGX_STREAM_UPSTREAM_BACKUP)) { - goto not_supported; - } - - us->backup = 1; - - continue; - } - - if (ngx_strcmp(value[i].data, "down") == 0) { - - if (!(uscf->flags & NGX_STREAM_UPSTREAM_DOWN)) { - goto not_supported; - } - - us->down = NGX_STREAM_UPSTREAM_FAILED; - - continue; - } - -#if (NGX_STREAM_UPSTREAM_ZONE) - if (ngx_strcmp(value[i].data, "resolve") == 0) { - resolve = 1; - continue; - } - - if (ngx_strncmp(value[i].data, "service=", 8) == 0) { - - us->service.len = value[i].len - 8; - us->service.data = &value[i].data[8]; - - if (us->service.len == 0) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, "service is empty"); - return NGX_CONF_ERROR; - } - - continue; - } -#endif - - goto invalid; - } - - ngx_memzero(&u, sizeof(ngx_url_t)); - - u.url = value[1]; - -#if (NGX_STREAM_UPSTREAM_ZONE) - if (resolve) { - /* resolve at run time */ - u.no_resolve = 1; - } - - if (us->service.len && !resolve) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "service upstream \"%V\" requires " - "\"resolve\" parameter", - &u.url); - return NGX_CONF_ERROR; - } - -#endif - - if (ngx_parse_url(cf->pool, &u) != NGX_OK) { - if (u.err) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "%s in upstream \"%V\"", u.err, &u.url); - } - - return NGX_CONF_ERROR; - } - - if (u.no_port -#if (NGX_STREAM_UPSTREAM_ZONE) - && us->service.len == 0 -#endif - ) - { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "no port in upstream \"%V\"", &u.url); - return NGX_CONF_ERROR; - } - - us->name = u.url; - -#if (NGX_STREAM_UPSTREAM_ZONE) - - if (us->service.len && !u.no_port) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "service upstream \"%V\" may not have port", - &us->name); - - return NGX_CONF_ERROR; - } - - if (us->service.len && u.naddrs) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "service upstream \"%V\" requires domain name", - &us->name); - - return NGX_CONF_ERROR; - } - - if (resolve && u.naddrs == 0) { - ngx_addr_t *addr; - - /* save port */ - - addr = ngx_pcalloc(cf->pool, sizeof(ngx_addr_t)); - if (addr == NULL) { - return NGX_CONF_ERROR; - } - - addr->sockaddr = ngx_palloc(cf->pool, u.socklen); - if (addr->sockaddr == NULL) { - return NGX_CONF_ERROR; - } - - ngx_memcpy(addr->sockaddr, &u.sockaddr, u.socklen); - - addr->socklen = u.socklen; - - us->addrs = addr; - us->naddrs = 1; - - us->host = u.host; - - } else { - us->addrs = u.addrs; - us->naddrs = u.naddrs; - } - -#else - - us->addrs = u.addrs; - us->naddrs = u.naddrs; - -#endif - - us->weight = weight; - us->max_conns = max_conns; - us->max_fails = max_fails; - us->fail_timeout = fail_timeout; - - return NGX_CONF_OK; - -invalid: - - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "invalid parameter \"%V\"", &value[i]); - - return NGX_CONF_ERROR; - -not_supported: - - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "balancing method does not support parameter \"%V\"", - &value[i]); - - return NGX_CONF_ERROR; -} - - -#if (NGX_STREAM_UPSTREAM_ZONE) - -static char * -ngx_stream_upstream_resolver(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) -{ - ngx_stream_upstream_srv_conf_t *uscf = conf; - - ngx_str_t *value; - - if (uscf->resolver) { - return "is duplicate"; - } - - value = cf->args->elts; - - uscf->resolver = ngx_resolver_create(cf, &value[1], cf->args->nelts - 1); - if (uscf->resolver == NULL) { - return NGX_CONF_ERROR; - } - - return NGX_CONF_OK; -} - -#endif - - -ngx_stream_upstream_srv_conf_t * -ngx_stream_upstream_add(ngx_conf_t *cf, ngx_url_t *u, ngx_uint_t flags) -{ - ngx_uint_t i; - ngx_stream_upstream_server_t *us; - ngx_stream_upstream_srv_conf_t *uscf, **uscfp; - ngx_stream_upstream_main_conf_t *umcf; - - if (!(flags & NGX_STREAM_UPSTREAM_CREATE)) { - - if (ngx_parse_url(cf->pool, u) != NGX_OK) { - if (u->err) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "%s in upstream \"%V\"", u->err, &u->url); - } - - return NULL; - } - } - - umcf = ngx_stream_conf_get_module_main_conf(cf, ngx_stream_upstream_module); - - uscfp = umcf->upstreams.elts; - - for (i = 0; i < umcf->upstreams.nelts; i++) { - - if (uscfp[i]->host.len != u->host.len - || ngx_strncasecmp(uscfp[i]->host.data, u->host.data, u->host.len) - != 0) - { - continue; - } - - if ((flags & NGX_STREAM_UPSTREAM_CREATE) - && (uscfp[i]->flags & NGX_STREAM_UPSTREAM_CREATE)) - { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "duplicate upstream \"%V\"", &u->host); - return NULL; - } - - if ((uscfp[i]->flags & NGX_STREAM_UPSTREAM_CREATE) && !u->no_port) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "upstream \"%V\" may not have port %d", - &u->host, u->port); - return NULL; - } - - if ((flags & NGX_STREAM_UPSTREAM_CREATE) && !uscfp[i]->no_port) { - ngx_log_error(NGX_LOG_EMERG, cf->log, 0, - "upstream \"%V\" may not have port %d in %s:%ui", - &u->host, uscfp[i]->port, - uscfp[i]->file_name, uscfp[i]->line); - return NULL; - } - - if (uscfp[i]->port != u->port) { - continue; - } - - if (flags & NGX_STREAM_UPSTREAM_CREATE) { - uscfp[i]->flags = flags; - } - - return uscfp[i]; - } - - uscf = ngx_pcalloc(cf->pool, sizeof(ngx_stream_upstream_srv_conf_t)); - if (uscf == NULL) { - return NULL; - } - - uscf->flags = flags; - uscf->host = u->host; - uscf->file_name = cf->conf_file->file.name.data; - uscf->line = cf->conf_file->line; - uscf->port = u->port; - uscf->no_port = u->no_port; -#if (NGX_STREAM_UPSTREAM_ZONE) - uscf->resolver_timeout = NGX_CONF_UNSET_MSEC; -#endif - - if (u->naddrs == 1 && (u->port || u->family == AF_UNIX)) { - uscf->servers = ngx_array_create(cf->pool, 1, - sizeof(ngx_stream_upstream_server_t)); - if (uscf->servers == NULL) { - return NULL; - } - - us = ngx_array_push(uscf->servers); - if (us == NULL) { - return NULL; - } - - ngx_memzero(us, sizeof(ngx_stream_upstream_server_t)); - - us->addrs = u->addrs; - us->naddrs = 1; - } - - uscfp = ngx_array_push(&umcf->upstreams); - if (uscfp == NULL) { - return NULL; - } - - *uscfp = uscf; - - return uscf; -} - - -static void * -ngx_stream_upstream_create_main_conf(ngx_conf_t *cf) -{ - ngx_stream_upstream_main_conf_t *umcf; - - umcf = ngx_pcalloc(cf->pool, sizeof(ngx_stream_upstream_main_conf_t)); - if (umcf == NULL) { - return NULL; - } - - if (ngx_array_init(&umcf->upstreams, cf->pool, 4, - sizeof(ngx_stream_upstream_srv_conf_t *)) - != NGX_OK) - { - return NULL; - } - - return umcf; -} - - -static char * -ngx_stream_upstream_init_main_conf(ngx_conf_t *cf, void *conf) -{ - ngx_stream_upstream_main_conf_t *umcf = conf; - - ngx_uint_t i; - ngx_stream_upstream_init_pt init; - ngx_stream_upstream_srv_conf_t **uscfp; - - uscfp = umcf->upstreams.elts; - - for (i = 0; i < umcf->upstreams.nelts; i++) { - - init = uscfp[i]->peer.init_upstream - ? uscfp[i]->peer.init_upstream - : ngx_stream_upstream_init_round_robin; - - if (init(cf, uscfp[i]) != NGX_OK) { - return NGX_CONF_ERROR; - } - } - - return NGX_CONF_OK; -} diff --git a/src/deps/src/nginx-1.30.3/src/stream/ngx_stream_upstream.h b/src/deps/src/nginx-1.30.3/src/stream/ngx_stream_upstream.h deleted file mode 100644 index c581aa0be5..0000000000 --- a/src/deps/src/nginx-1.30.3/src/stream/ngx_stream_upstream.h +++ /dev/null @@ -1,165 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#ifndef _NGX_STREAM_UPSTREAM_H_INCLUDED_ -#define _NGX_STREAM_UPSTREAM_H_INCLUDED_ - - -#include -#include -#include -#include - - -#define NGX_STREAM_UPSTREAM_CREATE 0x0001 -#define NGX_STREAM_UPSTREAM_WEIGHT 0x0002 -#define NGX_STREAM_UPSTREAM_MAX_FAILS 0x0004 -#define NGX_STREAM_UPSTREAM_FAIL_TIMEOUT 0x0008 -#define NGX_STREAM_UPSTREAM_DOWN 0x0010 -#define NGX_STREAM_UPSTREAM_BACKUP 0x0020 -#define NGX_STREAM_UPSTREAM_MODIFY 0x0040 -#define NGX_STREAM_UPSTREAM_MAX_CONNS 0x0100 - - -#define NGX_STREAM_UPSTREAM_NOTIFY_CONNECT 0x1 - - -typedef struct { - ngx_array_t upstreams; - /* ngx_stream_upstream_srv_conf_t */ -} ngx_stream_upstream_main_conf_t; - - -typedef struct ngx_stream_upstream_srv_conf_s ngx_stream_upstream_srv_conf_t; - - -typedef ngx_int_t (*ngx_stream_upstream_init_pt)(ngx_conf_t *cf, - ngx_stream_upstream_srv_conf_t *us); -typedef ngx_int_t (*ngx_stream_upstream_init_peer_pt)(ngx_stream_session_t *s, - ngx_stream_upstream_srv_conf_t *us); - - -typedef struct { - ngx_stream_upstream_init_pt init_upstream; - ngx_stream_upstream_init_peer_pt init; - void *data; -} ngx_stream_upstream_peer_t; - - -typedef struct { - ngx_str_t name; - ngx_addr_t *addrs; - ngx_uint_t naddrs; - ngx_uint_t weight; - ngx_uint_t max_conns; - ngx_uint_t max_fails; - time_t fail_timeout; - ngx_msec_t slow_start; - ngx_uint_t down; - - unsigned backup:1; - -#if (NGX_STREAM_UPSTREAM_ZONE) - ngx_str_t host; - ngx_str_t service; -#endif -} ngx_stream_upstream_server_t; - - -struct ngx_stream_upstream_srv_conf_s { - ngx_stream_upstream_peer_t peer; - void **srv_conf; - - ngx_array_t *servers; - /* ngx_stream_upstream_server_t */ - - ngx_uint_t flags; - ngx_str_t host; - u_char *file_name; - ngx_uint_t line; - in_port_t port; - ngx_uint_t no_port; /* unsigned no_port:1 */ - -#if (NGX_STREAM_UPSTREAM_ZONE) - ngx_shm_zone_t *shm_zone; - ngx_resolver_t *resolver; - ngx_msec_t resolver_timeout; -#endif -}; - - -typedef struct { - ngx_msec_t response_time; - ngx_msec_t connect_time; - ngx_msec_t first_byte_time; - off_t bytes_sent; - off_t bytes_received; - - ngx_str_t *peer; -} ngx_stream_upstream_state_t; - - -typedef struct { - ngx_str_t host; - in_port_t port; - ngx_uint_t no_port; /* unsigned no_port:1 */ - - ngx_uint_t naddrs; - ngx_resolver_addr_t *addrs; - - struct sockaddr *sockaddr; - socklen_t socklen; - ngx_str_t name; - - ngx_resolver_ctx_t *ctx; -} ngx_stream_upstream_resolved_t; - - -typedef struct { - ngx_peer_connection_t peer; - - ngx_buf_t downstream_buf; - ngx_buf_t upstream_buf; - - ngx_chain_t *free; - ngx_chain_t *upstream_out; - ngx_chain_t *upstream_busy; - ngx_chain_t *downstream_out; - ngx_chain_t *downstream_busy; - - off_t received; - time_t start_sec; - ngx_uint_t requests; - ngx_uint_t responses; - ngx_msec_t start_time; - - size_t upload_rate; - size_t download_rate; - - ngx_str_t ssl_name; - - ngx_stream_upstream_srv_conf_t *upstream; - ngx_stream_upstream_resolved_t *resolved; - ngx_stream_upstream_state_t *state; - unsigned connected:1; - unsigned proxy_protocol:1; - unsigned half_closed:1; -} ngx_stream_upstream_t; - - -ngx_stream_upstream_srv_conf_t *ngx_stream_upstream_add(ngx_conf_t *cf, - ngx_url_t *u, ngx_uint_t flags); - - -#define ngx_stream_conf_upstream_srv_conf(uscf, module) \ - uscf->srv_conf[module.ctx_index] - - -extern ngx_module_t ngx_stream_upstream_module; - - -#endif /* _NGX_STREAM_UPSTREAM_H_INCLUDED_ */ diff --git a/src/deps/src/nginx-1.30.3/src/stream/ngx_stream_upstream_hash_module.c b/src/deps/src/nginx-1.30.3/src/stream/ngx_stream_upstream_hash_module.c deleted file mode 100644 index 20fca6c0d8..0000000000 --- a/src/deps/src/nginx-1.30.3/src/stream/ngx_stream_upstream_hash_module.c +++ /dev/null @@ -1,755 +0,0 @@ - -/* - * Copyright (C) Roman Arutyunyan - * Copyright (C) Nginx, Inc. - */ - - -#include -#include -#include - - -typedef struct { - uint32_t hash; - ngx_str_t *server; -} ngx_stream_upstream_chash_point_t; - - -typedef struct { - ngx_uint_t number; - ngx_stream_upstream_chash_point_t point[1]; -} ngx_stream_upstream_chash_points_t; - - -typedef struct { -#if (NGX_STREAM_UPSTREAM_ZONE) - ngx_uint_t config; -#endif - ngx_stream_complex_value_t key; - ngx_stream_upstream_chash_points_t *points; -} ngx_stream_upstream_hash_srv_conf_t; - - -typedef struct { - /* the round robin data must be first */ - ngx_stream_upstream_rr_peer_data_t rrp; - ngx_stream_upstream_hash_srv_conf_t *conf; - ngx_str_t key; - ngx_uint_t tries; - ngx_uint_t rehash; - uint32_t hash; - ngx_event_get_peer_pt get_rr_peer; -} ngx_stream_upstream_hash_peer_data_t; - - -static ngx_int_t ngx_stream_upstream_init_hash(ngx_conf_t *cf, - ngx_stream_upstream_srv_conf_t *us); -static ngx_int_t ngx_stream_upstream_init_hash_peer(ngx_stream_session_t *s, - ngx_stream_upstream_srv_conf_t *us); -static ngx_int_t ngx_stream_upstream_get_hash_peer(ngx_peer_connection_t *pc, - void *data); - -static ngx_int_t ngx_stream_upstream_init_chash(ngx_conf_t *cf, - ngx_stream_upstream_srv_conf_t *us); -static ngx_int_t ngx_stream_upstream_update_chash(ngx_pool_t *pool, - ngx_stream_upstream_srv_conf_t *us); -static int ngx_libc_cdecl - ngx_stream_upstream_chash_cmp_points(const void *one, const void *two); -static ngx_uint_t ngx_stream_upstream_find_chash_point( - ngx_stream_upstream_chash_points_t *points, uint32_t hash); -static ngx_int_t ngx_stream_upstream_init_chash_peer(ngx_stream_session_t *s, - ngx_stream_upstream_srv_conf_t *us); -static ngx_int_t ngx_stream_upstream_get_chash_peer(ngx_peer_connection_t *pc, - void *data); - -static void *ngx_stream_upstream_hash_create_conf(ngx_conf_t *cf); -static char *ngx_stream_upstream_hash(ngx_conf_t *cf, ngx_command_t *cmd, - void *conf); - - -static ngx_command_t ngx_stream_upstream_hash_commands[] = { - - { ngx_string("hash"), - NGX_STREAM_UPS_CONF|NGX_CONF_TAKE12, - ngx_stream_upstream_hash, - NGX_STREAM_SRV_CONF_OFFSET, - 0, - NULL }, - - ngx_null_command -}; - - -static ngx_stream_module_t ngx_stream_upstream_hash_module_ctx = { - NULL, /* preconfiguration */ - NULL, /* postconfiguration */ - - NULL, /* create main configuration */ - NULL, /* init main configuration */ - - ngx_stream_upstream_hash_create_conf, /* create server configuration */ - NULL /* merge server configuration */ -}; - - -ngx_module_t ngx_stream_upstream_hash_module = { - NGX_MODULE_V1, - &ngx_stream_upstream_hash_module_ctx, /* module context */ - ngx_stream_upstream_hash_commands, /* module directives */ - NGX_STREAM_MODULE, /* module type */ - NULL, /* init master */ - NULL, /* init module */ - NULL, /* init process */ - NULL, /* init thread */ - NULL, /* exit thread */ - NULL, /* exit process */ - NULL, /* exit master */ - NGX_MODULE_V1_PADDING -}; - - -static ngx_int_t -ngx_stream_upstream_init_hash(ngx_conf_t *cf, - ngx_stream_upstream_srv_conf_t *us) -{ - if (ngx_stream_upstream_init_round_robin(cf, us) != NGX_OK) { - return NGX_ERROR; - } - - us->peer.init = ngx_stream_upstream_init_hash_peer; - - return NGX_OK; -} - - -static ngx_int_t -ngx_stream_upstream_init_hash_peer(ngx_stream_session_t *s, - ngx_stream_upstream_srv_conf_t *us) -{ - ngx_stream_upstream_hash_srv_conf_t *hcf; - ngx_stream_upstream_hash_peer_data_t *hp; - - hp = ngx_palloc(s->connection->pool, - sizeof(ngx_stream_upstream_hash_peer_data_t)); - if (hp == NULL) { - return NGX_ERROR; - } - - s->upstream->peer.data = &hp->rrp; - - if (ngx_stream_upstream_init_round_robin_peer(s, us) != NGX_OK) { - return NGX_ERROR; - } - - s->upstream->peer.get = ngx_stream_upstream_get_hash_peer; - - hcf = ngx_stream_conf_upstream_srv_conf(us, - ngx_stream_upstream_hash_module); - - if (ngx_stream_complex_value(s, &hcf->key, &hp->key) != NGX_OK) { - return NGX_ERROR; - } - - ngx_log_debug1(NGX_LOG_DEBUG_STREAM, s->connection->log, 0, - "upstream hash key:\"%V\"", &hp->key); - - hp->conf = hcf; - hp->tries = 0; - hp->rehash = 0; - hp->hash = 0; - hp->get_rr_peer = ngx_stream_upstream_get_round_robin_peer; - - return NGX_OK; -} - - -static ngx_int_t -ngx_stream_upstream_get_hash_peer(ngx_peer_connection_t *pc, void *data) -{ - ngx_stream_upstream_hash_peer_data_t *hp = data; - - time_t now; - u_char buf[NGX_INT_T_LEN]; - size_t size; - uint32_t hash; - ngx_int_t w; - uintptr_t m; - ngx_uint_t n, p; - ngx_stream_upstream_rr_peer_t *peer; - - ngx_log_debug1(NGX_LOG_DEBUG_STREAM, pc->log, 0, - "get hash peer, try: %ui", pc->tries); - - ngx_stream_upstream_rr_peers_rlock(hp->rrp.peers); - - if (hp->tries > 20 || hp->rrp.peers->number < 2 || hp->key.len == 0) { - ngx_stream_upstream_rr_peers_unlock(hp->rrp.peers); - return hp->get_rr_peer(pc, &hp->rrp); - } - -#if (NGX_STREAM_UPSTREAM_ZONE) - if (hp->rrp.peers->config && hp->rrp.config != *hp->rrp.peers->config) { - ngx_stream_upstream_rr_peers_unlock(hp->rrp.peers); - return hp->get_rr_peer(pc, &hp->rrp); - } -#endif - - now = ngx_time(); - - pc->connection = NULL; - - for ( ;; ) { - - /* - * Hash expression is compatible with Cache::Memcached: - * ((crc32([REHASH] KEY) >> 16) & 0x7fff) + PREV_HASH - * with REHASH omitted at the first iteration. - */ - - ngx_crc32_init(hash); - - if (hp->rehash > 0) { - size = ngx_sprintf(buf, "%ui", hp->rehash) - buf; - ngx_crc32_update(&hash, buf, size); - } - - ngx_crc32_update(&hash, hp->key.data, hp->key.len); - ngx_crc32_final(hash); - - hash = (hash >> 16) & 0x7fff; - - hp->hash += hash; - hp->rehash++; - - w = hp->hash % hp->rrp.peers->total_weight; - peer = hp->rrp.peers->peer; - p = 0; - - while (w >= peer->weight) { - w -= peer->weight; - peer = peer->next; - p++; - } - - n = p / (8 * sizeof(uintptr_t)); - m = (uintptr_t) 1 << p % (8 * sizeof(uintptr_t)); - - if (hp->rrp.tried[n] & m) { - goto next; - } - - ngx_stream_upstream_rr_peer_lock(hp->rrp.peers, peer); - - ngx_log_debug2(NGX_LOG_DEBUG_STREAM, pc->log, 0, - "get hash peer, value:%uD, peer:%ui", hp->hash, p); - - if (peer->down) { - ngx_stream_upstream_rr_peer_unlock(hp->rrp.peers, peer); - goto next; - } - - if (peer->max_fails - && peer->fails >= peer->max_fails - && now - peer->checked <= peer->fail_timeout) - { - ngx_stream_upstream_rr_peer_unlock(hp->rrp.peers, peer); - goto next; - } - - if (peer->max_conns && peer->conns >= peer->max_conns) { - ngx_stream_upstream_rr_peer_unlock(hp->rrp.peers, peer); - goto next; - } - - break; - - next: - - if (++hp->tries > 20) { - ngx_stream_upstream_rr_peers_unlock(hp->rrp.peers); - return hp->get_rr_peer(pc, &hp->rrp); - } - } - - hp->rrp.current = peer; - ngx_stream_upstream_rr_peer_ref(hp->rrp.peers, peer); - - pc->sockaddr = peer->sockaddr; - pc->socklen = peer->socklen; - pc->name = &peer->name; - - peer->conns++; - - if (now - peer->checked > peer->fail_timeout) { - peer->checked = now; - } - - ngx_stream_upstream_rr_peer_unlock(hp->rrp.peers, peer); - ngx_stream_upstream_rr_peers_unlock(hp->rrp.peers); - - hp->rrp.tried[n] |= m; - - return NGX_OK; -} - - -static ngx_int_t -ngx_stream_upstream_init_chash(ngx_conf_t *cf, - ngx_stream_upstream_srv_conf_t *us) -{ - if (ngx_stream_upstream_init_round_robin(cf, us) != NGX_OK) { - return NGX_ERROR; - } - - us->peer.init = ngx_stream_upstream_init_chash_peer; - -#if (NGX_STREAM_UPSTREAM_ZONE) - if (us->shm_zone) { - return NGX_OK; - } -#endif - - return ngx_stream_upstream_update_chash(cf->pool, us); -} - - -static ngx_int_t -ngx_stream_upstream_update_chash(ngx_pool_t *pool, - ngx_stream_upstream_srv_conf_t *us) -{ - u_char *host, *port, c; - size_t host_len, port_len, size; - uint32_t hash, base_hash; - ngx_str_t *server; - ngx_uint_t npoints, i, j; - ngx_stream_upstream_rr_peer_t *peer; - ngx_stream_upstream_rr_peers_t *peers; - ngx_stream_upstream_chash_points_t *points; - ngx_stream_upstream_hash_srv_conf_t *hcf; - union { - uint32_t value; - u_char byte[4]; - } prev_hash; - - hcf = ngx_stream_conf_upstream_srv_conf(us, - ngx_stream_upstream_hash_module); - - if (hcf->points) { - ngx_free(hcf->points); - hcf->points = NULL; - } - - peers = us->peer.data; - npoints = peers->total_weight * 160; - - size = sizeof(ngx_stream_upstream_chash_points_t) - - sizeof(ngx_stream_upstream_chash_point_t) - + sizeof(ngx_stream_upstream_chash_point_t) * npoints; - - points = pool ? ngx_palloc(pool, size) : ngx_alloc(size, ngx_cycle->log); - if (points == NULL) { - return NGX_ERROR; - } - - points->number = 0; - - if (npoints == 0) { - hcf->points = points; - return NGX_OK; - } - - for (peer = peers->peer; peer; peer = peer->next) { - server = &peer->server; - - /* - * Hash expression is compatible with Cache::Memcached::Fast: - * crc32(HOST \0 PORT PREV_HASH). - */ - - if (server->len >= 5 - && ngx_strncasecmp(server->data, (u_char *) "unix:", 5) == 0) - { - host = server->data + 5; - host_len = server->len - 5; - port = NULL; - port_len = 0; - goto done; - } - - for (j = 0; j < server->len; j++) { - c = server->data[server->len - j - 1]; - - if (c == ':') { - host = server->data; - host_len = server->len - j - 1; - port = server->data + server->len - j; - port_len = j; - goto done; - } - - if (c < '0' || c > '9') { - break; - } - } - - host = server->data; - host_len = server->len; - port = NULL; - port_len = 0; - - done: - - ngx_crc32_init(base_hash); - ngx_crc32_update(&base_hash, host, host_len); - ngx_crc32_update(&base_hash, (u_char *) "", 1); - ngx_crc32_update(&base_hash, port, port_len); - - prev_hash.value = 0; - npoints = peer->weight * 160; - - for (j = 0; j < npoints; j++) { - hash = base_hash; - - ngx_crc32_update(&hash, prev_hash.byte, 4); - ngx_crc32_final(hash); - - points->point[points->number].hash = hash; - points->point[points->number].server = server; - points->number++; - -#if (NGX_HAVE_LITTLE_ENDIAN) - prev_hash.value = hash; -#else - prev_hash.byte[0] = (u_char) (hash & 0xff); - prev_hash.byte[1] = (u_char) ((hash >> 8) & 0xff); - prev_hash.byte[2] = (u_char) ((hash >> 16) & 0xff); - prev_hash.byte[3] = (u_char) ((hash >> 24) & 0xff); -#endif - } - } - - ngx_qsort(points->point, - points->number, - sizeof(ngx_stream_upstream_chash_point_t), - ngx_stream_upstream_chash_cmp_points); - - for (i = 0, j = 1; j < points->number; j++) { - if (points->point[i].hash != points->point[j].hash) { - points->point[++i] = points->point[j]; - } - } - - points->number = i + 1; - - hcf->points = points; - - return NGX_OK; -} - - -static int ngx_libc_cdecl -ngx_stream_upstream_chash_cmp_points(const void *one, const void *two) -{ - ngx_stream_upstream_chash_point_t *first = - (ngx_stream_upstream_chash_point_t *) one; - ngx_stream_upstream_chash_point_t *second = - (ngx_stream_upstream_chash_point_t *) two; - - if (first->hash < second->hash) { - return -1; - - } else if (first->hash > second->hash) { - return 1; - - } else { - return 0; - } -} - - -static ngx_uint_t -ngx_stream_upstream_find_chash_point(ngx_stream_upstream_chash_points_t *points, - uint32_t hash) -{ - ngx_uint_t i, j, k; - ngx_stream_upstream_chash_point_t *point; - - /* find first point >= hash */ - - point = &points->point[0]; - - i = 0; - j = points->number; - - while (i < j) { - k = (i + j) / 2; - - if (hash > point[k].hash) { - i = k + 1; - - } else if (hash < point[k].hash) { - j = k; - - } else { - return k; - } - } - - return i; -} - - -static ngx_int_t -ngx_stream_upstream_init_chash_peer(ngx_stream_session_t *s, - ngx_stream_upstream_srv_conf_t *us) -{ - uint32_t hash; - ngx_stream_upstream_hash_srv_conf_t *hcf; - ngx_stream_upstream_hash_peer_data_t *hp; - - if (ngx_stream_upstream_init_hash_peer(s, us) != NGX_OK) { - return NGX_ERROR; - } - - s->upstream->peer.get = ngx_stream_upstream_get_chash_peer; - - hp = s->upstream->peer.data; - hcf = ngx_stream_conf_upstream_srv_conf(us, - ngx_stream_upstream_hash_module); - - hash = ngx_crc32_long(hp->key.data, hp->key.len); - - ngx_stream_upstream_rr_peers_rlock(hp->rrp.peers); - -#if (NGX_STREAM_UPSTREAM_ZONE) - if (hp->rrp.peers->config - && (hcf->points == NULL || hcf->config != *hp->rrp.peers->config)) - { - if (ngx_stream_upstream_update_chash(NULL, us) != NGX_OK) { - ngx_stream_upstream_rr_peers_unlock(hp->rrp.peers); - return NGX_ERROR; - } - - hcf->config = *hp->rrp.peers->config; - } -#endif - - if (hcf->points->number) { - hp->hash = ngx_stream_upstream_find_chash_point(hcf->points, hash); - } - - ngx_stream_upstream_rr_peers_unlock(hp->rrp.peers); - - return NGX_OK; -} - - -static ngx_int_t -ngx_stream_upstream_get_chash_peer(ngx_peer_connection_t *pc, void *data) -{ - ngx_stream_upstream_hash_peer_data_t *hp = data; - - time_t now; - intptr_t m; - ngx_str_t *server; - ngx_int_t total; - ngx_uint_t i, n, best_i; - ngx_stream_upstream_rr_peer_t *peer, *best; - ngx_stream_upstream_chash_point_t *point; - ngx_stream_upstream_chash_points_t *points; - ngx_stream_upstream_hash_srv_conf_t *hcf; - - ngx_log_debug1(NGX_LOG_DEBUG_STREAM, pc->log, 0, - "get consistent hash peer, try: %ui", pc->tries); - - ngx_stream_upstream_rr_peers_wlock(hp->rrp.peers); - - if (hp->tries > 20 || hp->rrp.peers->single || hp->key.len == 0) { - ngx_stream_upstream_rr_peers_unlock(hp->rrp.peers); - return hp->get_rr_peer(pc, &hp->rrp); - } - - pc->connection = NULL; - - if (hp->rrp.peers->number == 0) { - pc->name = hp->rrp.peers->name; - ngx_stream_upstream_rr_peers_unlock(hp->rrp.peers); - return NGX_BUSY; - } - -#if (NGX_STREAM_UPSTREAM_ZONE) - if (hp->rrp.peers->config && hp->rrp.config != *hp->rrp.peers->config) { - pc->name = hp->rrp.peers->name; - ngx_stream_upstream_rr_peers_unlock(hp->rrp.peers); - return NGX_BUSY; - } -#endif - - now = ngx_time(); - hcf = hp->conf; - - points = hcf->points; - point = &points->point[0]; - - for ( ;; ) { - server = point[hp->hash % points->number].server; - - ngx_log_debug2(NGX_LOG_DEBUG_STREAM, pc->log, 0, - "consistent hash peer:%uD, server:\"%V\"", - hp->hash, server); - - best = NULL; - best_i = 0; - total = 0; - - for (peer = hp->rrp.peers->peer, i = 0; - peer; - peer = peer->next, i++) - { - n = i / (8 * sizeof(uintptr_t)); - m = (uintptr_t) 1 << i % (8 * sizeof(uintptr_t)); - - if (hp->rrp.tried[n] & m) { - continue; - } - - if (peer->down) { - continue; - } - - if (peer->max_fails - && peer->fails >= peer->max_fails - && now - peer->checked <= peer->fail_timeout) - { - continue; - } - - if (peer->max_conns && peer->conns >= peer->max_conns) { - continue; - } - - if (peer->server.len != server->len - || ngx_strncmp(peer->server.data, server->data, server->len) - != 0) - { - continue; - } - - peer->current_weight += peer->effective_weight; - total += peer->effective_weight; - - if (peer->effective_weight < peer->weight) { - peer->effective_weight++; - } - - if (best == NULL || peer->current_weight > best->current_weight) { - best = peer; - best_i = i; - } - } - - if (best) { - best->current_weight -= total; - break; - } - - hp->hash++; - hp->tries++; - - if (hp->tries > 20) { - ngx_stream_upstream_rr_peers_unlock(hp->rrp.peers); - return hp->get_rr_peer(pc, &hp->rrp); - } - } - - hp->rrp.current = best; - ngx_stream_upstream_rr_peer_ref(hp->rrp.peers, best); - - pc->sockaddr = best->sockaddr; - pc->socklen = best->socklen; - pc->name = &best->name; - - best->conns++; - - if (now - best->checked > best->fail_timeout) { - best->checked = now; - } - - ngx_stream_upstream_rr_peers_unlock(hp->rrp.peers); - - n = best_i / (8 * sizeof(uintptr_t)); - m = (uintptr_t) 1 << best_i % (8 * sizeof(uintptr_t)); - - hp->rrp.tried[n] |= m; - - return NGX_OK; -} - - -static void * -ngx_stream_upstream_hash_create_conf(ngx_conf_t *cf) -{ - ngx_stream_upstream_hash_srv_conf_t *conf; - - conf = ngx_palloc(cf->pool, sizeof(ngx_stream_upstream_hash_srv_conf_t)); - if (conf == NULL) { - return NULL; - } - - conf->points = NULL; - - return conf; -} - - -static char * -ngx_stream_upstream_hash(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) -{ - ngx_stream_upstream_hash_srv_conf_t *hcf = conf; - - ngx_str_t *value; - ngx_stream_upstream_srv_conf_t *uscf; - ngx_stream_compile_complex_value_t ccv; - - value = cf->args->elts; - - ngx_memzero(&ccv, sizeof(ngx_stream_compile_complex_value_t)); - - ccv.cf = cf; - ccv.value = &value[1]; - ccv.complex_value = &hcf->key; - - if (ngx_stream_compile_complex_value(&ccv) != NGX_OK) { - return NGX_CONF_ERROR; - } - - uscf = ngx_stream_conf_get_module_srv_conf(cf, ngx_stream_upstream_module); - - if (uscf->peer.init_upstream) { - ngx_conf_log_error(NGX_LOG_WARN, cf, 0, - "load balancing method redefined"); - } - - uscf->flags = NGX_STREAM_UPSTREAM_CREATE - |NGX_STREAM_UPSTREAM_MODIFY - |NGX_STREAM_UPSTREAM_WEIGHT - |NGX_STREAM_UPSTREAM_MAX_CONNS - |NGX_STREAM_UPSTREAM_MAX_FAILS - |NGX_STREAM_UPSTREAM_FAIL_TIMEOUT - |NGX_STREAM_UPSTREAM_DOWN; - - if (cf->args->nelts == 2) { - uscf->peer.init_upstream = ngx_stream_upstream_init_hash; - - } else if (ngx_strcmp(value[2].data, "consistent") == 0) { - uscf->peer.init_upstream = ngx_stream_upstream_init_chash; - - } else { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "invalid parameter \"%V\"", &value[2]); - return NGX_CONF_ERROR; - } - - return NGX_CONF_OK; -} diff --git a/src/deps/src/nginx-1.30.3/src/stream/ngx_stream_upstream_least_conn_module.c b/src/deps/src/nginx-1.30.3/src/stream/ngx_stream_upstream_least_conn_module.c deleted file mode 100644 index 6e8360440e..0000000000 --- a/src/deps/src/nginx-1.30.3/src/stream/ngx_stream_upstream_least_conn_module.c +++ /dev/null @@ -1,322 +0,0 @@ - -/* - * Copyright (C) Maxim Dounin - * Copyright (C) Nginx, Inc. - */ - - -#include -#include -#include - - -static ngx_int_t ngx_stream_upstream_init_least_conn_peer( - ngx_stream_session_t *s, ngx_stream_upstream_srv_conf_t *us); -static ngx_int_t ngx_stream_upstream_get_least_conn_peer( - ngx_peer_connection_t *pc, void *data); -static char *ngx_stream_upstream_least_conn(ngx_conf_t *cf, ngx_command_t *cmd, - void *conf); - - -static ngx_command_t ngx_stream_upstream_least_conn_commands[] = { - - { ngx_string("least_conn"), - NGX_STREAM_UPS_CONF|NGX_CONF_NOARGS, - ngx_stream_upstream_least_conn, - 0, - 0, - NULL }, - - ngx_null_command -}; - - -static ngx_stream_module_t ngx_stream_upstream_least_conn_module_ctx = { - NULL, /* preconfiguration */ - NULL, /* postconfiguration */ - - NULL, /* create main configuration */ - NULL, /* init main configuration */ - - NULL, /* create server configuration */ - NULL /* merge server configuration */ -}; - - -ngx_module_t ngx_stream_upstream_least_conn_module = { - NGX_MODULE_V1, - &ngx_stream_upstream_least_conn_module_ctx, /* module context */ - ngx_stream_upstream_least_conn_commands, /* module directives */ - NGX_STREAM_MODULE, /* module type */ - NULL, /* init master */ - NULL, /* init module */ - NULL, /* init process */ - NULL, /* init thread */ - NULL, /* exit thread */ - NULL, /* exit process */ - NULL, /* exit master */ - NGX_MODULE_V1_PADDING -}; - - -static ngx_int_t -ngx_stream_upstream_init_least_conn(ngx_conf_t *cf, - ngx_stream_upstream_srv_conf_t *us) -{ - ngx_log_debug0(NGX_LOG_DEBUG_STREAM, cf->log, 0, - "init least conn"); - - if (ngx_stream_upstream_init_round_robin(cf, us) != NGX_OK) { - return NGX_ERROR; - } - - us->peer.init = ngx_stream_upstream_init_least_conn_peer; - - return NGX_OK; -} - - -static ngx_int_t -ngx_stream_upstream_init_least_conn_peer(ngx_stream_session_t *s, - ngx_stream_upstream_srv_conf_t *us) -{ - ngx_log_debug0(NGX_LOG_DEBUG_STREAM, s->connection->log, 0, - "init least conn peer"); - - if (ngx_stream_upstream_init_round_robin_peer(s, us) != NGX_OK) { - return NGX_ERROR; - } - - s->upstream->peer.get = ngx_stream_upstream_get_least_conn_peer; - - return NGX_OK; -} - - -static ngx_int_t -ngx_stream_upstream_get_least_conn_peer(ngx_peer_connection_t *pc, void *data) -{ - ngx_stream_upstream_rr_peer_data_t *rrp = data; - - time_t now; - uintptr_t m; - ngx_int_t rc, total; - ngx_uint_t i, n, p, many; - ngx_stream_upstream_rr_peer_t *peer, *best; - ngx_stream_upstream_rr_peers_t *peers; - - ngx_log_debug1(NGX_LOG_DEBUG_STREAM, pc->log, 0, - "get least conn peer, try: %ui", pc->tries); - - if (rrp->peers->single) { - return ngx_stream_upstream_get_round_robin_peer(pc, rrp); - } - - pc->connection = NULL; - - now = ngx_time(); - - peers = rrp->peers; - - ngx_stream_upstream_rr_peers_wlock(peers); - -#if (NGX_STREAM_UPSTREAM_ZONE) - if (peers->config && rrp->config != *peers->config) { - goto busy; - } -#endif - - best = NULL; - total = 0; - -#if (NGX_SUPPRESS_WARN) - many = 0; - p = 0; -#endif - - for (peer = peers->peer, i = 0; - peer; - peer = peer->next, i++) - { - n = i / (8 * sizeof(uintptr_t)); - m = (uintptr_t) 1 << i % (8 * sizeof(uintptr_t)); - - if (rrp->tried[n] & m) { - continue; - } - - if (peer->down) { - continue; - } - - if (peer->max_fails - && peer->fails >= peer->max_fails - && now - peer->checked <= peer->fail_timeout) - { - continue; - } - - if (peer->max_conns && peer->conns >= peer->max_conns) { - continue; - } - - /* - * select peer with least number of connections; if there are - * multiple peers with the same number of connections, select - * based on round-robin - */ - - if (best == NULL - || peer->conns * best->weight < best->conns * peer->weight) - { - best = peer; - many = 0; - p = i; - - } else if (peer->conns * best->weight == best->conns * peer->weight) { - many = 1; - } - } - - if (best == NULL) { - ngx_log_debug0(NGX_LOG_DEBUG_STREAM, pc->log, 0, - "get least conn peer, no peer found"); - - goto failed; - } - - if (many) { - ngx_log_debug0(NGX_LOG_DEBUG_STREAM, pc->log, 0, - "get least conn peer, many"); - - for (peer = best, i = p; - peer; - peer = peer->next, i++) - { - n = i / (8 * sizeof(uintptr_t)); - m = (uintptr_t) 1 << i % (8 * sizeof(uintptr_t)); - - if (rrp->tried[n] & m) { - continue; - } - - if (peer->down) { - continue; - } - - if (peer->conns * best->weight != best->conns * peer->weight) { - continue; - } - - if (peer->max_fails - && peer->fails >= peer->max_fails - && now - peer->checked <= peer->fail_timeout) - { - continue; - } - - if (peer->max_conns && peer->conns >= peer->max_conns) { - continue; - } - - peer->current_weight += peer->effective_weight; - total += peer->effective_weight; - - if (peer->effective_weight < peer->weight) { - peer->effective_weight++; - } - - if (peer->current_weight > best->current_weight) { - best = peer; - p = i; - } - } - } - - best->current_weight -= total; - - if (now - best->checked > best->fail_timeout) { - best->checked = now; - } - - pc->sockaddr = best->sockaddr; - pc->socklen = best->socklen; - pc->name = &best->name; - - best->conns++; - - rrp->current = best; - ngx_stream_upstream_rr_peer_ref(peers, best); - - n = p / (8 * sizeof(uintptr_t)); - m = (uintptr_t) 1 << p % (8 * sizeof(uintptr_t)); - - rrp->tried[n] |= m; - - ngx_stream_upstream_rr_peers_unlock(peers); - - return NGX_OK; - -failed: - - if (peers->next) { - ngx_log_debug0(NGX_LOG_DEBUG_STREAM, pc->log, 0, - "get least conn peer, backup servers"); - - rrp->peers = peers->next; - - n = (rrp->peers->number + (8 * sizeof(uintptr_t) - 1)) - / (8 * sizeof(uintptr_t)); - - for (i = 0; i < n; i++) { - rrp->tried[i] = 0; - } - - ngx_stream_upstream_rr_peers_unlock(peers); - - rc = ngx_stream_upstream_get_least_conn_peer(pc, rrp); - - if (rc != NGX_BUSY) { - return rc; - } - - ngx_stream_upstream_rr_peers_wlock(peers); - } - -#if (NGX_STREAM_UPSTREAM_ZONE) -busy: -#endif - - ngx_stream_upstream_rr_peers_unlock(peers); - - pc->name = peers->name; - - return NGX_BUSY; -} - - -static char * -ngx_stream_upstream_least_conn(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) -{ - ngx_stream_upstream_srv_conf_t *uscf; - - uscf = ngx_stream_conf_get_module_srv_conf(cf, ngx_stream_upstream_module); - - if (uscf->peer.init_upstream) { - ngx_conf_log_error(NGX_LOG_WARN, cf, 0, - "load balancing method redefined"); - } - - uscf->peer.init_upstream = ngx_stream_upstream_init_least_conn; - - uscf->flags = NGX_STREAM_UPSTREAM_CREATE - |NGX_STREAM_UPSTREAM_MODIFY - |NGX_STREAM_UPSTREAM_WEIGHT - |NGX_STREAM_UPSTREAM_MAX_CONNS - |NGX_STREAM_UPSTREAM_MAX_FAILS - |NGX_STREAM_UPSTREAM_FAIL_TIMEOUT - |NGX_STREAM_UPSTREAM_DOWN - |NGX_STREAM_UPSTREAM_BACKUP; - - return NGX_CONF_OK; -} diff --git a/src/deps/src/nginx-1.30.3/src/stream/ngx_stream_upstream_random_module.c b/src/deps/src/nginx-1.30.3/src/stream/ngx_stream_upstream_random_module.c deleted file mode 100644 index 71f76f8d82..0000000000 --- a/src/deps/src/nginx-1.30.3/src/stream/ngx_stream_upstream_random_module.c +++ /dev/null @@ -1,531 +0,0 @@ - -/* - * Copyright (C) Nginx, Inc. - */ - - -#include -#include -#include - - -typedef struct { - ngx_stream_upstream_rr_peer_t *peer; - ngx_uint_t range; -} ngx_stream_upstream_random_range_t; - - -typedef struct { - ngx_uint_t two; -#if (NGX_STREAM_UPSTREAM_ZONE) - ngx_uint_t config; -#endif - ngx_stream_upstream_random_range_t *ranges; -} ngx_stream_upstream_random_srv_conf_t; - - -typedef struct { - /* the round robin data must be first */ - ngx_stream_upstream_rr_peer_data_t rrp; - - ngx_stream_upstream_random_srv_conf_t *conf; - u_char tries; -} ngx_stream_upstream_random_peer_data_t; - - -static ngx_int_t ngx_stream_upstream_init_random(ngx_conf_t *cf, - ngx_stream_upstream_srv_conf_t *us); -static ngx_int_t ngx_stream_upstream_update_random(ngx_pool_t *pool, - ngx_stream_upstream_srv_conf_t *us); - -static ngx_int_t ngx_stream_upstream_init_random_peer(ngx_stream_session_t *s, - ngx_stream_upstream_srv_conf_t *us); -static ngx_int_t ngx_stream_upstream_get_random_peer(ngx_peer_connection_t *pc, - void *data); -static ngx_int_t ngx_stream_upstream_get_random2_peer(ngx_peer_connection_t *pc, - void *data); -static ngx_uint_t ngx_stream_upstream_peek_random_peer( - ngx_stream_upstream_rr_peers_t *peers, - ngx_stream_upstream_random_peer_data_t *rp); -static void *ngx_stream_upstream_random_create_conf(ngx_conf_t *cf); -static char *ngx_stream_upstream_random(ngx_conf_t *cf, ngx_command_t *cmd, - void *conf); - - -static ngx_command_t ngx_stream_upstream_random_commands[] = { - - { ngx_string("random"), - NGX_STREAM_UPS_CONF|NGX_CONF_NOARGS|NGX_CONF_TAKE12, - ngx_stream_upstream_random, - NGX_STREAM_SRV_CONF_OFFSET, - 0, - NULL }, - - ngx_null_command -}; - - -static ngx_stream_module_t ngx_stream_upstream_random_module_ctx = { - NULL, /* preconfiguration */ - NULL, /* postconfiguration */ - - NULL, /* create main configuration */ - NULL, /* init main configuration */ - - ngx_stream_upstream_random_create_conf, /* create server configuration */ - NULL /* merge server configuration */ -}; - - -ngx_module_t ngx_stream_upstream_random_module = { - NGX_MODULE_V1, - &ngx_stream_upstream_random_module_ctx, /* module context */ - ngx_stream_upstream_random_commands, /* module directives */ - NGX_STREAM_MODULE, /* module type */ - NULL, /* init master */ - NULL, /* init module */ - NULL, /* init process */ - NULL, /* init thread */ - NULL, /* exit thread */ - NULL, /* exit process */ - NULL, /* exit master */ - NGX_MODULE_V1_PADDING -}; - - -static ngx_int_t -ngx_stream_upstream_init_random(ngx_conf_t *cf, - ngx_stream_upstream_srv_conf_t *us) -{ - ngx_log_debug0(NGX_LOG_DEBUG_STREAM, cf->log, 0, "init random"); - - if (ngx_stream_upstream_init_round_robin(cf, us) != NGX_OK) { - return NGX_ERROR; - } - - us->peer.init = ngx_stream_upstream_init_random_peer; - -#if (NGX_STREAM_UPSTREAM_ZONE) - if (us->shm_zone) { - return NGX_OK; - } -#endif - - return ngx_stream_upstream_update_random(cf->pool, us); -} - - -static ngx_int_t -ngx_stream_upstream_update_random(ngx_pool_t *pool, - ngx_stream_upstream_srv_conf_t *us) -{ - size_t size; - ngx_uint_t i, total_weight; - ngx_stream_upstream_rr_peer_t *peer; - ngx_stream_upstream_rr_peers_t *peers; - ngx_stream_upstream_random_range_t *ranges; - ngx_stream_upstream_random_srv_conf_t *rcf; - - rcf = ngx_stream_conf_upstream_srv_conf(us, - ngx_stream_upstream_random_module); - if (rcf->ranges) { - ngx_free(rcf->ranges); - rcf->ranges = NULL; - } - - peers = us->peer.data; - - size = peers->number * sizeof(ngx_stream_upstream_random_range_t); - - ranges = pool ? ngx_palloc(pool, size) : ngx_alloc(size, ngx_cycle->log); - if (ranges == NULL) { - return NGX_ERROR; - } - - total_weight = 0; - - for (peer = peers->peer, i = 0; peer; peer = peer->next, i++) { - ranges[i].peer = peer; - ranges[i].range = total_weight; - total_weight += peer->weight; - } - - rcf->ranges = ranges; - - return NGX_OK; -} - - -static ngx_int_t -ngx_stream_upstream_init_random_peer(ngx_stream_session_t *s, - ngx_stream_upstream_srv_conf_t *us) -{ - ngx_stream_upstream_random_srv_conf_t *rcf; - ngx_stream_upstream_random_peer_data_t *rp; - - ngx_log_debug0(NGX_LOG_DEBUG_STREAM, s->connection->log, 0, - "init random peer"); - - rcf = ngx_stream_conf_upstream_srv_conf(us, - ngx_stream_upstream_random_module); - - rp = ngx_palloc(s->connection->pool, - sizeof(ngx_stream_upstream_random_peer_data_t)); - if (rp == NULL) { - return NGX_ERROR; - } - - s->upstream->peer.data = &rp->rrp; - - if (ngx_stream_upstream_init_round_robin_peer(s, us) != NGX_OK) { - return NGX_ERROR; - } - - if (rcf->two) { - s->upstream->peer.get = ngx_stream_upstream_get_random2_peer; - - } else { - s->upstream->peer.get = ngx_stream_upstream_get_random_peer; - } - - rp->conf = rcf; - rp->tries = 0; - - ngx_stream_upstream_rr_peers_rlock(rp->rrp.peers); - -#if (NGX_STREAM_UPSTREAM_ZONE) - if (rp->rrp.peers->config - && (rcf->ranges == NULL || rcf->config != *rp->rrp.peers->config)) - { - if (ngx_stream_upstream_update_random(NULL, us) != NGX_OK) { - ngx_stream_upstream_rr_peers_unlock(rp->rrp.peers); - return NGX_ERROR; - } - - rcf->config = *rp->rrp.peers->config; - } -#endif - - ngx_stream_upstream_rr_peers_unlock(rp->rrp.peers); - - return NGX_OK; -} - - -static ngx_int_t -ngx_stream_upstream_get_random_peer(ngx_peer_connection_t *pc, void *data) -{ - ngx_stream_upstream_random_peer_data_t *rp = data; - - time_t now; - uintptr_t m; - ngx_uint_t i, n; - ngx_stream_upstream_rr_peer_t *peer; - ngx_stream_upstream_rr_peers_t *peers; - ngx_stream_upstream_rr_peer_data_t *rrp; - - ngx_log_debug1(NGX_LOG_DEBUG_STREAM, pc->log, 0, - "get random peer, try: %ui", pc->tries); - - rrp = &rp->rrp; - peers = rrp->peers; - - ngx_stream_upstream_rr_peers_rlock(peers); - - if (rp->tries > 20 || peers->number < 2) { - ngx_stream_upstream_rr_peers_unlock(peers); - return ngx_stream_upstream_get_round_robin_peer(pc, rrp); - } - -#if (NGX_STREAM_UPSTREAM_ZONE) - if (peers->config && rrp->config != *peers->config) { - ngx_stream_upstream_rr_peers_unlock(peers); - return ngx_stream_upstream_get_round_robin_peer(pc, rrp); - } -#endif - - pc->cached = 0; - pc->connection = NULL; - - now = ngx_time(); - - for ( ;; ) { - - i = ngx_stream_upstream_peek_random_peer(peers, rp); - - peer = rp->conf->ranges[i].peer; - - n = i / (8 * sizeof(uintptr_t)); - m = (uintptr_t) 1 << i % (8 * sizeof(uintptr_t)); - - if (rrp->tried[n] & m) { - goto next; - } - - ngx_stream_upstream_rr_peer_lock(peers, peer); - - if (peer->down) { - ngx_stream_upstream_rr_peer_unlock(peers, peer); - goto next; - } - - if (peer->max_fails - && peer->fails >= peer->max_fails - && now - peer->checked <= peer->fail_timeout) - { - ngx_stream_upstream_rr_peer_unlock(peers, peer); - goto next; - } - - if (peer->max_conns && peer->conns >= peer->max_conns) { - ngx_stream_upstream_rr_peer_unlock(peers, peer); - goto next; - } - - break; - - next: - - if (++rp->tries > 20) { - ngx_stream_upstream_rr_peers_unlock(peers); - return ngx_stream_upstream_get_round_robin_peer(pc, rrp); - } - } - - rrp->current = peer; - ngx_stream_upstream_rr_peer_ref(peers, peer); - - if (now - peer->checked > peer->fail_timeout) { - peer->checked = now; - } - - pc->sockaddr = peer->sockaddr; - pc->socklen = peer->socklen; - pc->name = &peer->name; - - peer->conns++; - - ngx_stream_upstream_rr_peer_unlock(peers, peer); - ngx_stream_upstream_rr_peers_unlock(peers); - - rrp->tried[n] |= m; - - return NGX_OK; -} - - -static ngx_int_t -ngx_stream_upstream_get_random2_peer(ngx_peer_connection_t *pc, void *data) -{ - ngx_stream_upstream_random_peer_data_t *rp = data; - - time_t now; - uintptr_t m; - ngx_uint_t i, n, p; - ngx_stream_upstream_rr_peer_t *peer, *prev; - ngx_stream_upstream_rr_peers_t *peers; - ngx_stream_upstream_rr_peer_data_t *rrp; - - ngx_log_debug1(NGX_LOG_DEBUG_STREAM, pc->log, 0, - "get random2 peer, try: %ui", pc->tries); - - rrp = &rp->rrp; - peers = rrp->peers; - - ngx_stream_upstream_rr_peers_wlock(peers); - - if (rp->tries > 20 || peers->number < 2) { - ngx_stream_upstream_rr_peers_unlock(peers); - return ngx_stream_upstream_get_round_robin_peer(pc, rrp); - } - -#if (NGX_STREAM_UPSTREAM_ZONE) - if (peers->config && rrp->config != *peers->config) { - ngx_stream_upstream_rr_peers_unlock(peers); - return ngx_stream_upstream_get_round_robin_peer(pc, rrp); - } -#endif - - pc->cached = 0; - pc->connection = NULL; - - now = ngx_time(); - - prev = NULL; - -#if (NGX_SUPPRESS_WARN) - p = 0; -#endif - - for ( ;; ) { - - i = ngx_stream_upstream_peek_random_peer(peers, rp); - - peer = rp->conf->ranges[i].peer; - - if (peer == prev) { - goto next; - } - - n = i / (8 * sizeof(uintptr_t)); - m = (uintptr_t) 1 << i % (8 * sizeof(uintptr_t)); - - if (rrp->tried[n] & m) { - goto next; - } - - if (peer->down) { - goto next; - } - - if (peer->max_fails - && peer->fails >= peer->max_fails - && now - peer->checked <= peer->fail_timeout) - { - goto next; - } - - if (peer->max_conns && peer->conns >= peer->max_conns) { - goto next; - } - - if (prev) { - if (peer->conns * prev->weight > prev->conns * peer->weight) { - peer = prev; - n = p / (8 * sizeof(uintptr_t)); - m = (uintptr_t) 1 << p % (8 * sizeof(uintptr_t)); - } - - break; - } - - prev = peer; - p = i; - - next: - - if (++rp->tries > 20) { - ngx_stream_upstream_rr_peers_unlock(peers); - return ngx_stream_upstream_get_round_robin_peer(pc, rrp); - } - } - - rrp->current = peer; - ngx_stream_upstream_rr_peer_ref(peers, peer); - - if (now - peer->checked > peer->fail_timeout) { - peer->checked = now; - } - - pc->sockaddr = peer->sockaddr; - pc->socklen = peer->socklen; - pc->name = &peer->name; - - peer->conns++; - - ngx_stream_upstream_rr_peers_unlock(peers); - - rrp->tried[n] |= m; - - return NGX_OK; -} - - -static ngx_uint_t -ngx_stream_upstream_peek_random_peer(ngx_stream_upstream_rr_peers_t *peers, - ngx_stream_upstream_random_peer_data_t *rp) -{ - ngx_uint_t i, j, k, x; - - x = ngx_random() % peers->total_weight; - - i = 0; - j = peers->number; - - while (j - i > 1) { - k = (i + j) / 2; - - if (x < rp->conf->ranges[k].range) { - j = k; - - } else { - i = k; - } - } - - return i; -} - - -static void * -ngx_stream_upstream_random_create_conf(ngx_conf_t *cf) -{ - ngx_stream_upstream_random_srv_conf_t *conf; - - conf = ngx_pcalloc(cf->pool, sizeof(ngx_stream_upstream_random_srv_conf_t)); - if (conf == NULL) { - return NULL; - } - - /* - * set by ngx_pcalloc(): - * - * conf->two = 0; - */ - - return conf; -} - - -static char * -ngx_stream_upstream_random(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) -{ - ngx_stream_upstream_random_srv_conf_t *rcf = conf; - - ngx_str_t *value; - ngx_stream_upstream_srv_conf_t *uscf; - - uscf = ngx_stream_conf_get_module_srv_conf(cf, ngx_stream_upstream_module); - - if (uscf->peer.init_upstream) { - ngx_conf_log_error(NGX_LOG_WARN, cf, 0, - "load balancing method redefined"); - } - - uscf->peer.init_upstream = ngx_stream_upstream_init_random; - - uscf->flags = NGX_STREAM_UPSTREAM_CREATE - |NGX_STREAM_UPSTREAM_MODIFY - |NGX_STREAM_UPSTREAM_WEIGHT - |NGX_STREAM_UPSTREAM_MAX_CONNS - |NGX_STREAM_UPSTREAM_MAX_FAILS - |NGX_STREAM_UPSTREAM_FAIL_TIMEOUT - |NGX_STREAM_UPSTREAM_DOWN; - - if (cf->args->nelts == 1) { - return NGX_CONF_OK; - } - - value = cf->args->elts; - - if (ngx_strcmp(value[1].data, "two") == 0) { - rcf->two = 1; - - } else { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "invalid parameter \"%V\"", &value[1]); - return NGX_CONF_ERROR; - } - - if (cf->args->nelts == 2) { - return NGX_CONF_OK; - } - - if (ngx_strcmp(value[2].data, "least_conn") != 0) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "invalid parameter \"%V\"", &value[2]); - return NGX_CONF_ERROR; - } - - return NGX_CONF_OK; -} diff --git a/src/deps/src/nginx-1.30.3/src/stream/ngx_stream_upstream_round_robin.c b/src/deps/src/nginx-1.30.3/src/stream/ngx_stream_upstream_round_robin.c deleted file mode 100644 index dd80322c8b..0000000000 --- a/src/deps/src/nginx-1.30.3/src/stream/ngx_stream_upstream_round_robin.c +++ /dev/null @@ -1,1075 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#include -#include -#include - - -#define ngx_stream_upstream_tries(p) ((p)->tries \ - + ((p)->next ? (p)->next->tries : 0)) - - -static ngx_stream_upstream_rr_peer_t *ngx_stream_upstream_get_peer( - ngx_stream_upstream_rr_peer_data_t *rrp); -static void ngx_stream_upstream_notify_round_robin_peer( - ngx_peer_connection_t *pc, void *data, ngx_uint_t state); - -#if (NGX_STREAM_SSL) - -static ngx_int_t ngx_stream_upstream_set_round_robin_peer_session( - ngx_peer_connection_t *pc, void *data); -static void ngx_stream_upstream_save_round_robin_peer_session( - ngx_peer_connection_t *pc, void *data); -static ngx_int_t ngx_stream_upstream_empty_set_session( - ngx_peer_connection_t *pc, void *data); -static void ngx_stream_upstream_empty_save_session(ngx_peer_connection_t *pc, - void *data); - -#endif - - -ngx_int_t -ngx_stream_upstream_init_round_robin(ngx_conf_t *cf, - ngx_stream_upstream_srv_conf_t *us) -{ - ngx_url_t u; - ngx_uint_t i, j, n, r, w, t; - ngx_stream_upstream_server_t *server; - ngx_stream_upstream_rr_peer_t *peer, **peerp; - ngx_stream_upstream_rr_peers_t *peers, *backup; -#if (NGX_STREAM_UPSTREAM_ZONE) - ngx_uint_t resolve; - ngx_stream_core_srv_conf_t *cscf; - ngx_stream_upstream_rr_peer_t **rpeerp; -#endif - - us->peer.init = ngx_stream_upstream_init_round_robin_peer; - - if (us->servers) { - server = us->servers->elts; - - n = 0; - r = 0; - w = 0; - t = 0; - -#if (NGX_STREAM_UPSTREAM_ZONE) - resolve = 0; -#endif - - for (i = 0; i < us->servers->nelts; i++) { - -#if (NGX_STREAM_UPSTREAM_ZONE) - if (server[i].host.len) { - resolve = 1; - } -#endif - - if (server[i].backup) { - continue; - } - -#if (NGX_STREAM_UPSTREAM_ZONE) - if (server[i].host.len) { - r++; - continue; - } -#endif - - n += server[i].naddrs; - w += server[i].naddrs * server[i].weight; - - if (!server[i].down) { - t += server[i].naddrs; - } - } - -#if (NGX_STREAM_UPSTREAM_ZONE) - if (us->shm_zone) { - - if (resolve && !(us->flags & NGX_STREAM_UPSTREAM_MODIFY)) { - ngx_log_error(NGX_LOG_EMERG, cf->log, 0, - "load balancing method does not support" - " resolving names at run time in" - " upstream \"%V\" in %s:%ui", - &us->host, us->file_name, us->line); - return NGX_ERROR; - } - - cscf = ngx_stream_conf_get_module_srv_conf(cf, - ngx_stream_core_module); - - if (us->resolver == NULL) { - us->resolver = cscf->resolver; - } - - /* - * Without "resolver_timeout" in stream{} the merged value is unset. - */ - ngx_conf_merge_msec_value(us->resolver_timeout, - cscf->resolver_timeout, 30000); - - if (resolve - && (us->resolver == NULL - || us->resolver->connections.nelts == 0)) - { - ngx_log_error(NGX_LOG_EMERG, cf->log, 0, - "no resolver defined to resolve names" - " at run time in upstream \"%V\" in %s:%ui", - &us->host, us->file_name, us->line); - return NGX_ERROR; - } - - } else if (resolve) { - - ngx_log_error(NGX_LOG_EMERG, cf->log, 0, - "resolving names at run time requires" - " upstream \"%V\" in %s:%ui" - " to be in shared memory", - &us->host, us->file_name, us->line); - return NGX_ERROR; - } -#endif - - if (n + r == 0) { - ngx_log_error(NGX_LOG_EMERG, cf->log, 0, - "no servers in upstream \"%V\" in %s:%ui", - &us->host, us->file_name, us->line); - return NGX_ERROR; - } - - peers = ngx_pcalloc(cf->pool, sizeof(ngx_stream_upstream_rr_peers_t)); - if (peers == NULL) { - return NGX_ERROR; - } - - peer = ngx_pcalloc(cf->pool, sizeof(ngx_stream_upstream_rr_peer_t) - * (n + r)); - if (peer == NULL) { - return NGX_ERROR; - } - - peers->single = (n == 1); - peers->number = n; - peers->weighted = (w != n); - peers->total_weight = w; - peers->tries = t; - peers->name = &us->host; - - n = 0; - peerp = &peers->peer; - -#if (NGX_STREAM_UPSTREAM_ZONE) - rpeerp = &peers->resolve; -#endif - - for (i = 0; i < us->servers->nelts; i++) { - if (server[i].backup) { - continue; - } - -#if (NGX_STREAM_UPSTREAM_ZONE) - if (server[i].host.len) { - - peer[n].host = ngx_pcalloc(cf->pool, - sizeof(ngx_stream_upstream_host_t)); - if (peer[n].host == NULL) { - return NGX_ERROR; - } - - peer[n].host->name = server[i].host; - peer[n].host->service = server[i].service; - - peer[n].sockaddr = server[i].addrs[0].sockaddr; - peer[n].socklen = server[i].addrs[0].socklen; - peer[n].name = server[i].addrs[0].name; - peer[n].weight = server[i].weight; - peer[n].effective_weight = server[i].weight; - peer[n].current_weight = 0; - peer[n].max_conns = server[i].max_conns; - peer[n].max_fails = server[i].max_fails; - peer[n].fail_timeout = server[i].fail_timeout; - peer[n].down = server[i].down; - peer[n].server = server[i].name; - *rpeerp = &peer[n]; - rpeerp = &peer[n].next; - n++; - - continue; - } -#endif - - for (j = 0; j < server[i].naddrs; j++) { - peer[n].sockaddr = server[i].addrs[j].sockaddr; - peer[n].socklen = server[i].addrs[j].socklen; - peer[n].name = server[i].addrs[j].name; - peer[n].weight = server[i].weight; - peer[n].effective_weight = server[i].weight; - peer[n].current_weight = 0; - peer[n].max_conns = server[i].max_conns; - peer[n].max_fails = server[i].max_fails; - peer[n].fail_timeout = server[i].fail_timeout; - peer[n].down = server[i].down; - peer[n].server = server[i].name; - - *peerp = &peer[n]; - peerp = &peer[n].next; - n++; - } - } - - us->peer.data = peers; - - /* backup servers */ - - n = 0; - r = 0; - w = 0; - t = 0; - - for (i = 0; i < us->servers->nelts; i++) { - if (!server[i].backup) { - continue; - } - -#if (NGX_STREAM_UPSTREAM_ZONE) - if (server[i].host.len) { - r++; - continue; - } -#endif - - n += server[i].naddrs; - w += server[i].naddrs * server[i].weight; - - if (!server[i].down) { - t += server[i].naddrs; - } - } - - if (n == 0 -#if (NGX_STREAM_UPSTREAM_ZONE) - && !resolve -#endif - ) { - return NGX_OK; - } - - if (n + r == 0 && !(us->flags & NGX_STREAM_UPSTREAM_BACKUP)) { - return NGX_OK; - } - - backup = ngx_pcalloc(cf->pool, sizeof(ngx_stream_upstream_rr_peers_t)); - if (backup == NULL) { - return NGX_ERROR; - } - - peer = ngx_pcalloc(cf->pool, sizeof(ngx_stream_upstream_rr_peer_t) - * (n + r)); - if (peer == NULL) { - return NGX_ERROR; - } - - if (n > 0) { - peers->single = 0; - } - - backup->single = 0; - backup->number = n; - backup->weighted = (w != n); - backup->total_weight = w; - backup->tries = t; - backup->name = &us->host; - - n = 0; - peerp = &backup->peer; - -#if (NGX_STREAM_UPSTREAM_ZONE) - rpeerp = &backup->resolve; -#endif - - for (i = 0; i < us->servers->nelts; i++) { - if (!server[i].backup) { - continue; - } - -#if (NGX_STREAM_UPSTREAM_ZONE) - if (server[i].host.len) { - - peer[n].host = ngx_pcalloc(cf->pool, - sizeof(ngx_stream_upstream_host_t)); - if (peer[n].host == NULL) { - return NGX_ERROR; - } - - peer[n].host->name = server[i].host; - peer[n].host->service = server[i].service; - - peer[n].sockaddr = server[i].addrs[0].sockaddr; - peer[n].socklen = server[i].addrs[0].socklen; - peer[n].name = server[i].addrs[0].name; - peer[n].weight = server[i].weight; - peer[n].effective_weight = server[i].weight; - peer[n].current_weight = 0; - peer[n].max_conns = server[i].max_conns; - peer[n].max_fails = server[i].max_fails; - peer[n].fail_timeout = server[i].fail_timeout; - peer[n].down = server[i].down; - peer[n].server = server[i].name; - *rpeerp = &peer[n]; - rpeerp = &peer[n].next; - n++; - - continue; - } -#endif - - for (j = 0; j < server[i].naddrs; j++) { - peer[n].sockaddr = server[i].addrs[j].sockaddr; - peer[n].socklen = server[i].addrs[j].socklen; - peer[n].name = server[i].addrs[j].name; - peer[n].weight = server[i].weight; - peer[n].effective_weight = server[i].weight; - peer[n].current_weight = 0; - peer[n].max_conns = server[i].max_conns; - peer[n].max_fails = server[i].max_fails; - peer[n].fail_timeout = server[i].fail_timeout; - peer[n].down = server[i].down; - peer[n].server = server[i].name; - - *peerp = &peer[n]; - peerp = &peer[n].next; - n++; - } - } - - peers->next = backup; - - return NGX_OK; - } - - - /* an upstream implicitly defined by proxy_pass, etc. */ - - if (us->port == 0) { - ngx_log_error(NGX_LOG_EMERG, cf->log, 0, - "no port in upstream \"%V\" in %s:%ui", - &us->host, us->file_name, us->line); - return NGX_ERROR; - } - - ngx_memzero(&u, sizeof(ngx_url_t)); - - u.host = us->host; - u.port = us->port; - - if (ngx_inet_resolve_host(cf->pool, &u) != NGX_OK) { - if (u.err) { - ngx_log_error(NGX_LOG_EMERG, cf->log, 0, - "%s in upstream \"%V\" in %s:%ui", - u.err, &us->host, us->file_name, us->line); - } - - return NGX_ERROR; - } - - n = u.naddrs; - - peers = ngx_pcalloc(cf->pool, sizeof(ngx_stream_upstream_rr_peers_t)); - if (peers == NULL) { - return NGX_ERROR; - } - - peer = ngx_pcalloc(cf->pool, sizeof(ngx_stream_upstream_rr_peer_t) * n); - if (peer == NULL) { - return NGX_ERROR; - } - - peers->single = (n == 1); - peers->number = n; - peers->weighted = 0; - peers->total_weight = n; - peers->tries = n; - peers->name = &us->host; - - peerp = &peers->peer; - - for (i = 0; i < u.naddrs; i++) { - peer[i].sockaddr = u.addrs[i].sockaddr; - peer[i].socklen = u.addrs[i].socklen; - peer[i].name = u.addrs[i].name; - peer[i].weight = 1; - peer[i].effective_weight = 1; - peer[i].current_weight = 0; - peer[i].max_conns = 0; - peer[i].max_fails = 1; - peer[i].fail_timeout = 10; - *peerp = &peer[i]; - peerp = &peer[i].next; - } - - us->peer.data = peers; - - /* implicitly defined upstream has no backup servers */ - - return NGX_OK; -} - - -ngx_int_t -ngx_stream_upstream_init_round_robin_peer(ngx_stream_session_t *s, - ngx_stream_upstream_srv_conf_t *us) -{ - ngx_uint_t n; - ngx_stream_upstream_rr_peer_data_t *rrp; - - rrp = s->upstream->peer.data; - - if (rrp == NULL) { - rrp = ngx_palloc(s->connection->pool, - sizeof(ngx_stream_upstream_rr_peer_data_t)); - if (rrp == NULL) { - return NGX_ERROR; - } - - s->upstream->peer.data = rrp; - } - - rrp->peers = us->peer.data; - rrp->current = NULL; - - ngx_stream_upstream_rr_peers_rlock(rrp->peers); - -#if (NGX_STREAM_UPSTREAM_ZONE) - rrp->config = rrp->peers->config ? *rrp->peers->config : 0; -#endif - - n = rrp->peers->number; - - if (rrp->peers->next && rrp->peers->next->number > n) { - n = rrp->peers->next->number; - } - - s->upstream->peer.tries = ngx_stream_upstream_tries(rrp->peers); - - ngx_stream_upstream_rr_peers_unlock(rrp->peers); - - if (n <= 8 * sizeof(uintptr_t)) { - rrp->tried = &rrp->data; - rrp->data = 0; - - } else { - n = (n + (8 * sizeof(uintptr_t) - 1)) / (8 * sizeof(uintptr_t)); - - rrp->tried = ngx_pcalloc(s->connection->pool, n * sizeof(uintptr_t)); - if (rrp->tried == NULL) { - return NGX_ERROR; - } - } - - s->upstream->peer.get = ngx_stream_upstream_get_round_robin_peer; - s->upstream->peer.free = ngx_stream_upstream_free_round_robin_peer; - s->upstream->peer.notify = ngx_stream_upstream_notify_round_robin_peer; - -#if (NGX_STREAM_SSL) - s->upstream->peer.set_session = - ngx_stream_upstream_set_round_robin_peer_session; - s->upstream->peer.save_session = - ngx_stream_upstream_save_round_robin_peer_session; -#endif - - return NGX_OK; -} - - -ngx_int_t -ngx_stream_upstream_create_round_robin_peer(ngx_stream_session_t *s, - ngx_stream_upstream_resolved_t *ur) -{ - u_char *p; - size_t len; - socklen_t socklen; - ngx_uint_t i, n; - struct sockaddr *sockaddr; - ngx_stream_upstream_rr_peer_t *peer, **peerp; - ngx_stream_upstream_rr_peers_t *peers; - ngx_stream_upstream_rr_peer_data_t *rrp; - - rrp = s->upstream->peer.data; - - if (rrp == NULL) { - rrp = ngx_palloc(s->connection->pool, - sizeof(ngx_stream_upstream_rr_peer_data_t)); - if (rrp == NULL) { - return NGX_ERROR; - } - - s->upstream->peer.data = rrp; - } - - peers = ngx_pcalloc(s->connection->pool, - sizeof(ngx_stream_upstream_rr_peers_t)); - if (peers == NULL) { - return NGX_ERROR; - } - - peer = ngx_pcalloc(s->connection->pool, - sizeof(ngx_stream_upstream_rr_peer_t) * ur->naddrs); - if (peer == NULL) { - return NGX_ERROR; - } - - peers->single = (ur->naddrs == 1); - peers->number = ur->naddrs; - peers->tries = ur->naddrs; - peers->name = &ur->host; - - if (ur->sockaddr) { - peer[0].sockaddr = ur->sockaddr; - peer[0].socklen = ur->socklen; - peer[0].name = ur->name; - peer[0].weight = 1; - peer[0].effective_weight = 1; - peer[0].current_weight = 0; - peer[0].max_conns = 0; - peer[0].max_fails = 1; - peer[0].fail_timeout = 10; - peers->peer = peer; - - } else { - peerp = &peers->peer; - - for (i = 0; i < ur->naddrs; i++) { - - socklen = ur->addrs[i].socklen; - - sockaddr = ngx_palloc(s->connection->pool, socklen); - if (sockaddr == NULL) { - return NGX_ERROR; - } - - ngx_memcpy(sockaddr, ur->addrs[i].sockaddr, socklen); - ngx_inet_set_port(sockaddr, ur->port); - - p = ngx_pnalloc(s->connection->pool, NGX_SOCKADDR_STRLEN); - if (p == NULL) { - return NGX_ERROR; - } - - len = ngx_sock_ntop(sockaddr, socklen, p, NGX_SOCKADDR_STRLEN, 1); - - peer[i].sockaddr = sockaddr; - peer[i].socklen = socklen; - peer[i].name.len = len; - peer[i].name.data = p; - peer[i].weight = 1; - peer[i].effective_weight = 1; - peer[i].current_weight = 0; - peer[i].max_conns = 0; - peer[i].max_fails = 1; - peer[i].fail_timeout = 10; - *peerp = &peer[i]; - peerp = &peer[i].next; - } - } - - rrp->peers = peers; - rrp->current = NULL; - rrp->config = 0; - - if (rrp->peers->number <= 8 * sizeof(uintptr_t)) { - rrp->tried = &rrp->data; - rrp->data = 0; - - } else { - n = (rrp->peers->number + (8 * sizeof(uintptr_t) - 1)) - / (8 * sizeof(uintptr_t)); - - rrp->tried = ngx_pcalloc(s->connection->pool, n * sizeof(uintptr_t)); - if (rrp->tried == NULL) { - return NGX_ERROR; - } - } - - s->upstream->peer.get = ngx_stream_upstream_get_round_robin_peer; - s->upstream->peer.free = ngx_stream_upstream_free_round_robin_peer; - s->upstream->peer.tries = ngx_stream_upstream_tries(rrp->peers); -#if (NGX_STREAM_SSL) - s->upstream->peer.set_session = ngx_stream_upstream_empty_set_session; - s->upstream->peer.save_session = ngx_stream_upstream_empty_save_session; -#endif - - return NGX_OK; -} - - -ngx_int_t -ngx_stream_upstream_get_round_robin_peer(ngx_peer_connection_t *pc, void *data) -{ - ngx_stream_upstream_rr_peer_data_t *rrp = data; - - ngx_int_t rc; - ngx_uint_t i, n; - ngx_stream_upstream_rr_peer_t *peer; - ngx_stream_upstream_rr_peers_t *peers; - - ngx_log_debug1(NGX_LOG_DEBUG_STREAM, pc->log, 0, - "get rr peer, try: %ui", pc->tries); - - pc->connection = NULL; - - peers = rrp->peers; - ngx_stream_upstream_rr_peers_wlock(peers); - -#if (NGX_STREAM_UPSTREAM_ZONE) - if (peers->config && rrp->config != *peers->config) { - goto busy; - } -#endif - - if (peers->single) { - peer = peers->peer; - - if (peer->down) { - goto failed; - } - - if (peer->max_conns && peer->conns >= peer->max_conns) { - goto failed; - } - - rrp->current = peer; - ngx_stream_upstream_rr_peer_ref(peers, peer); - - } else { - - /* there are several peers */ - - peer = ngx_stream_upstream_get_peer(rrp); - - if (peer == NULL) { - goto failed; - } - - ngx_log_debug2(NGX_LOG_DEBUG_STREAM, pc->log, 0, - "get rr peer, current: %p %i", - peer, peer->current_weight); - } - - pc->sockaddr = peer->sockaddr; - pc->socklen = peer->socklen; - pc->name = &peer->name; - - peer->conns++; - - ngx_stream_upstream_rr_peers_unlock(peers); - - return NGX_OK; - -failed: - - if (peers->next) { - - ngx_log_debug0(NGX_LOG_DEBUG_STREAM, pc->log, 0, "backup servers"); - - rrp->peers = peers->next; - - n = (rrp->peers->number + (8 * sizeof(uintptr_t) - 1)) - / (8 * sizeof(uintptr_t)); - - for (i = 0; i < n; i++) { - rrp->tried[i] = 0; - } - - ngx_stream_upstream_rr_peers_unlock(peers); - - rc = ngx_stream_upstream_get_round_robin_peer(pc, rrp); - - if (rc != NGX_BUSY) { - return rc; - } - - ngx_stream_upstream_rr_peers_wlock(peers); - } - -#if (NGX_STREAM_UPSTREAM_ZONE) -busy: -#endif - - ngx_stream_upstream_rr_peers_unlock(peers); - - pc->name = peers->name; - - return NGX_BUSY; -} - - -static ngx_stream_upstream_rr_peer_t * -ngx_stream_upstream_get_peer(ngx_stream_upstream_rr_peer_data_t *rrp) -{ - time_t now; - uintptr_t m; - ngx_int_t total; - ngx_uint_t i, n, p; - ngx_stream_upstream_rr_peer_t *peer, *best; - - now = ngx_time(); - - best = NULL; - total = 0; - -#if (NGX_SUPPRESS_WARN) - p = 0; -#endif - - for (peer = rrp->peers->peer, i = 0; - peer; - peer = peer->next, i++) - { - n = i / (8 * sizeof(uintptr_t)); - m = (uintptr_t) 1 << i % (8 * sizeof(uintptr_t)); - - if (rrp->tried[n] & m) { - continue; - } - - if (peer->down) { - continue; - } - - if (peer->max_fails - && peer->fails >= peer->max_fails - && now - peer->checked <= peer->fail_timeout) - { - continue; - } - - if (peer->max_conns && peer->conns >= peer->max_conns) { - continue; - } - - peer->current_weight += peer->effective_weight; - total += peer->effective_weight; - - if (peer->effective_weight < peer->weight) { - peer->effective_weight++; - } - - if (best == NULL || peer->current_weight > best->current_weight) { - best = peer; - p = i; - } - } - - if (best == NULL) { - return NULL; - } - - rrp->current = best; - ngx_stream_upstream_rr_peer_ref(rrp->peers, best); - - n = p / (8 * sizeof(uintptr_t)); - m = (uintptr_t) 1 << p % (8 * sizeof(uintptr_t)); - - rrp->tried[n] |= m; - - best->current_weight -= total; - - if (now - best->checked > best->fail_timeout) { - best->checked = now; - } - - return best; -} - - -void -ngx_stream_upstream_free_round_robin_peer(ngx_peer_connection_t *pc, void *data, - ngx_uint_t state) -{ - ngx_stream_upstream_rr_peer_data_t *rrp = data; - - time_t now; - ngx_stream_upstream_rr_peer_t *peer; - - ngx_log_debug2(NGX_LOG_DEBUG_STREAM, pc->log, 0, - "free rr peer %ui %ui", pc->tries, state); - - peer = rrp->current; - - ngx_stream_upstream_rr_peers_rlock(rrp->peers); - ngx_stream_upstream_rr_peer_lock(rrp->peers, peer); - - if (rrp->peers->single) { - - if (peer->fails) { - peer->fails = 0; - } - - peer->conns--; - - if (ngx_stream_upstream_rr_peer_unref(rrp->peers, peer) == NGX_OK) { - ngx_stream_upstream_rr_peer_unlock(rrp->peers, peer); - } - - ngx_stream_upstream_rr_peers_unlock(rrp->peers); - - pc->tries = 0; - return; - } - - if (state & NGX_PEER_FAILED) { - now = ngx_time(); - - peer->fails++; - peer->accessed = now; - peer->checked = now; - - if (peer->max_fails) { - peer->effective_weight -= peer->weight / peer->max_fails; - - if (peer->fails >= peer->max_fails) { - ngx_log_error(NGX_LOG_WARN, pc->log, 0, - "upstream server temporarily disabled"); - } - } - - ngx_log_debug2(NGX_LOG_DEBUG_STREAM, pc->log, 0, - "free rr peer failed: %p %i", - peer, peer->effective_weight); - - if (peer->effective_weight < 0) { - peer->effective_weight = 0; - } - - } else { - - /* mark peer live if check passed */ - - if (peer->accessed < peer->checked) { - peer->fails = 0; - } - } - - peer->conns--; - - if (ngx_stream_upstream_rr_peer_unref(rrp->peers, peer) == NGX_OK) { - ngx_stream_upstream_rr_peer_unlock(rrp->peers, peer); - } - - ngx_stream_upstream_rr_peers_unlock(rrp->peers); - - if (pc->tries) { - pc->tries--; - } -} - - -static void -ngx_stream_upstream_notify_round_robin_peer(ngx_peer_connection_t *pc, - void *data, ngx_uint_t type) -{ - ngx_stream_upstream_rr_peer_data_t *rrp = data; - - ngx_stream_upstream_rr_peer_t *peer; - - peer = rrp->current; - - if (type == NGX_STREAM_UPSTREAM_NOTIFY_CONNECT - && pc->connection->type == SOCK_STREAM) - { - ngx_stream_upstream_rr_peers_rlock(rrp->peers); - ngx_stream_upstream_rr_peer_lock(rrp->peers, peer); - - if (peer->accessed < peer->checked) { - peer->fails = 0; - } - - ngx_stream_upstream_rr_peer_unlock(rrp->peers, peer); - ngx_stream_upstream_rr_peers_unlock(rrp->peers); - } -} - - -#if (NGX_STREAM_SSL) - -static ngx_int_t -ngx_stream_upstream_set_round_robin_peer_session(ngx_peer_connection_t *pc, - void *data) -{ - ngx_stream_upstream_rr_peer_data_t *rrp = data; - - ngx_int_t rc; - ngx_ssl_session_t *ssl_session; - ngx_stream_upstream_rr_peer_t *peer; -#if (NGX_STREAM_UPSTREAM_ZONE) - int len; - const u_char *p; - ngx_stream_upstream_rr_peers_t *peers; -#endif - - peer = rrp->current; - -#if (NGX_STREAM_UPSTREAM_ZONE) - peers = rrp->peers; - - if (peers->shpool) { - ngx_stream_upstream_rr_peers_rlock(peers); - ngx_stream_upstream_rr_peer_lock(peers, peer); - - if (peer->ssl_session == NULL) { - ngx_stream_upstream_rr_peer_unlock(peers, peer); - ngx_stream_upstream_rr_peers_unlock(peers); - return NGX_OK; - } - - len = peer->ssl_session_len; - - ngx_memcpy(ngx_ssl_session_buffer, peer->ssl_session, len); - - ngx_stream_upstream_rr_peer_unlock(peers, peer); - ngx_stream_upstream_rr_peers_unlock(peers); - - p = ngx_ssl_session_buffer; - ssl_session = d2i_SSL_SESSION(NULL, &p, len); - - rc = ngx_ssl_set_session(pc->connection, ssl_session); - - ngx_log_debug1(NGX_LOG_DEBUG_STREAM, pc->log, 0, - "set session: %p", ssl_session); - - ngx_ssl_free_session(ssl_session); - - return rc; - } -#endif - - ssl_session = peer->ssl_session; - - rc = ngx_ssl_set_session(pc->connection, ssl_session); - - ngx_log_debug1(NGX_LOG_DEBUG_STREAM, pc->log, 0, - "set session: %p", ssl_session); - - return rc; -} - - -static void -ngx_stream_upstream_save_round_robin_peer_session(ngx_peer_connection_t *pc, - void *data) -{ - ngx_stream_upstream_rr_peer_data_t *rrp = data; - - ngx_ssl_session_t *old_ssl_session, *ssl_session; - ngx_stream_upstream_rr_peer_t *peer; -#if (NGX_STREAM_UPSTREAM_ZONE) - int len; - u_char *p; - ngx_stream_upstream_rr_peers_t *peers; -#endif - -#if (NGX_STREAM_UPSTREAM_ZONE) - peers = rrp->peers; - - if (peers->shpool) { - - ssl_session = ngx_ssl_get0_session(pc->connection); - - if (ssl_session == NULL) { - return; - } - - len = i2d_SSL_SESSION(ssl_session, NULL); - - ngx_log_debug2(NGX_LOG_DEBUG_STREAM, pc->log, 0, - "save session: %p:%d", ssl_session, len); - - /* do not cache too big session */ - - if (len > NGX_SSL_MAX_SESSION_SIZE) { - return; - } - - p = ngx_ssl_session_buffer; - (void) i2d_SSL_SESSION(ssl_session, &p); - - peer = rrp->current; - - ngx_stream_upstream_rr_peers_rlock(peers); - ngx_stream_upstream_rr_peer_lock(peers, peer); - - if (len > peer->ssl_session_len) { - ngx_shmtx_lock(&peers->shpool->mutex); - - if (peer->ssl_session) { - ngx_slab_free_locked(peers->shpool, peer->ssl_session); - } - - peer->ssl_session = ngx_slab_alloc_locked(peers->shpool, len); - - ngx_shmtx_unlock(&peers->shpool->mutex); - - if (peer->ssl_session == NULL) { - peer->ssl_session_len = 0; - - ngx_stream_upstream_rr_peer_unlock(peers, peer); - ngx_stream_upstream_rr_peers_unlock(peers); - return; - } - - peer->ssl_session_len = len; - } - - ngx_memcpy(peer->ssl_session, ngx_ssl_session_buffer, len); - - ngx_stream_upstream_rr_peer_unlock(peers, peer); - ngx_stream_upstream_rr_peers_unlock(peers); - - return; - } -#endif - - ssl_session = ngx_ssl_get_session(pc->connection); - - if (ssl_session == NULL) { - return; - } - - ngx_log_debug1(NGX_LOG_DEBUG_STREAM, pc->log, 0, - "save session: %p", ssl_session); - - peer = rrp->current; - - old_ssl_session = peer->ssl_session; - peer->ssl_session = ssl_session; - - if (old_ssl_session) { - - ngx_log_debug1(NGX_LOG_DEBUG_STREAM, pc->log, 0, - "old session: %p", old_ssl_session); - - ngx_ssl_free_session(old_ssl_session); - } -} - - -static ngx_int_t -ngx_stream_upstream_empty_set_session(ngx_peer_connection_t *pc, void *data) -{ - return NGX_OK; -} - - -static void -ngx_stream_upstream_empty_save_session(ngx_peer_connection_t *pc, void *data) -{ - return; -} - -#endif diff --git a/src/deps/src/nginx-1.30.3/src/stream/ngx_stream_upstream_round_robin.h b/src/deps/src/nginx-1.30.3/src/stream/ngx_stream_upstream_round_robin.h deleted file mode 100644 index d36c2ad069..0000000000 --- a/src/deps/src/nginx-1.30.3/src/stream/ngx_stream_upstream_round_robin.h +++ /dev/null @@ -1,232 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#ifndef _NGX_STREAM_UPSTREAM_ROUND_ROBIN_H_INCLUDED_ -#define _NGX_STREAM_UPSTREAM_ROUND_ROBIN_H_INCLUDED_ - - -#include -#include -#include - - -#define NGX_STREAM_UPSTREAM_FAILED 1 - - -typedef struct ngx_stream_upstream_rr_peers_s ngx_stream_upstream_rr_peers_t; -typedef struct ngx_stream_upstream_rr_peer_s ngx_stream_upstream_rr_peer_t; - - -#if (NGX_STREAM_UPSTREAM_ZONE) - -typedef struct { - ngx_event_t event; /* must be first */ - ngx_uint_t worker; - ngx_str_t name; - ngx_str_t service; - time_t valid; - ngx_stream_upstream_rr_peers_t *peers; - ngx_stream_upstream_rr_peer_t *peer; -} ngx_stream_upstream_host_t; - -#endif - - -struct ngx_stream_upstream_rr_peer_s { - struct sockaddr *sockaddr; - socklen_t socklen; - ngx_str_t name; - ngx_str_t server; - - ngx_int_t current_weight; - ngx_int_t effective_weight; - ngx_int_t weight; - - ngx_uint_t conns; - ngx_uint_t max_conns; - - ngx_uint_t fails; - time_t accessed; - time_t checked; - - ngx_uint_t max_fails; - time_t fail_timeout; - ngx_msec_t slow_start; - ngx_msec_t start_time; - - ngx_uint_t down; - - void *ssl_session; - int ssl_session_len; - -#if (NGX_STREAM_UPSTREAM_ZONE) - unsigned zombie:1; - - ngx_atomic_t lock; - ngx_uint_t refs; - ngx_stream_upstream_host_t *host; -#endif - - ngx_stream_upstream_rr_peer_t *next; - - NGX_COMPAT_BEGIN(14) - NGX_COMPAT_END -}; - - -struct ngx_stream_upstream_rr_peers_s { - ngx_uint_t number; - -#if (NGX_STREAM_UPSTREAM_ZONE) - ngx_slab_pool_t *shpool; - ngx_atomic_t rwlock; - ngx_uint_t *config; - ngx_stream_upstream_rr_peer_t *resolve; - ngx_stream_upstream_rr_peers_t *zone_next; -#endif - - ngx_uint_t total_weight; - ngx_uint_t tries; - - unsigned single:1; - unsigned weighted:1; - - ngx_str_t *name; - - ngx_stream_upstream_rr_peers_t *next; - - ngx_stream_upstream_rr_peer_t *peer; -}; - - -#if (NGX_STREAM_UPSTREAM_ZONE) - -#define ngx_stream_upstream_rr_peers_rlock(peers) \ - \ - if (peers->shpool) { \ - ngx_rwlock_rlock(&peers->rwlock); \ - } - -#define ngx_stream_upstream_rr_peers_wlock(peers) \ - \ - if (peers->shpool) { \ - ngx_rwlock_wlock(&peers->rwlock); \ - } - -#define ngx_stream_upstream_rr_peers_unlock(peers) \ - \ - if (peers->shpool) { \ - ngx_rwlock_unlock(&peers->rwlock); \ - } - - -#define ngx_stream_upstream_rr_peer_lock(peers, peer) \ - \ - if (peers->shpool) { \ - ngx_rwlock_wlock(&peer->lock); \ - } - -#define ngx_stream_upstream_rr_peer_unlock(peers, peer) \ - \ - if (peers->shpool) { \ - ngx_rwlock_unlock(&peer->lock); \ - } - - -#define ngx_stream_upstream_rr_peer_ref(peers, peer) \ - (peer)->refs++; - - -static ngx_inline void -ngx_stream_upstream_rr_peer_free_locked(ngx_stream_upstream_rr_peers_t *peers, - ngx_stream_upstream_rr_peer_t *peer) -{ - if (peer->refs) { - peer->zombie = 1; - return; - } - - ngx_slab_free_locked(peers->shpool, peer->sockaddr); - ngx_slab_free_locked(peers->shpool, peer->name.data); - - if (peer->server.data) { - ngx_slab_free_locked(peers->shpool, peer->server.data); - } - -#if (NGX_STREAM_SSL) - if (peer->ssl_session) { - ngx_slab_free_locked(peers->shpool, peer->ssl_session); - } -#endif - - ngx_slab_free_locked(peers->shpool, peer); -} - - -static ngx_inline void -ngx_stream_upstream_rr_peer_free(ngx_stream_upstream_rr_peers_t *peers, - ngx_stream_upstream_rr_peer_t *peer) -{ - ngx_shmtx_lock(&peers->shpool->mutex); - ngx_stream_upstream_rr_peer_free_locked(peers, peer); - ngx_shmtx_unlock(&peers->shpool->mutex); -} - - -static ngx_inline ngx_int_t -ngx_stream_upstream_rr_peer_unref(ngx_stream_upstream_rr_peers_t *peers, - ngx_stream_upstream_rr_peer_t *peer) -{ - peer->refs--; - - if (peers->shpool == NULL) { - return NGX_OK; - } - - if (peer->refs == 0 && peer->zombie) { - ngx_stream_upstream_rr_peer_free(peers, peer); - return NGX_DONE; - } - - return NGX_OK; -} - -#else - -#define ngx_stream_upstream_rr_peers_rlock(peers) -#define ngx_stream_upstream_rr_peers_wlock(peers) -#define ngx_stream_upstream_rr_peers_unlock(peers) -#define ngx_stream_upstream_rr_peer_lock(peers, peer) -#define ngx_stream_upstream_rr_peer_unlock(peers, peer) -#define ngx_stream_upstream_rr_peer_ref(peers, peer) -#define ngx_stream_upstream_rr_peer_unref(peers, peer) NGX_OK - -#endif - - -typedef struct { - ngx_uint_t config; - ngx_stream_upstream_rr_peers_t *peers; - ngx_stream_upstream_rr_peer_t *current; - uintptr_t *tried; - uintptr_t data; -} ngx_stream_upstream_rr_peer_data_t; - - -ngx_int_t ngx_stream_upstream_init_round_robin(ngx_conf_t *cf, - ngx_stream_upstream_srv_conf_t *us); -ngx_int_t ngx_stream_upstream_init_round_robin_peer(ngx_stream_session_t *s, - ngx_stream_upstream_srv_conf_t *us); -ngx_int_t ngx_stream_upstream_create_round_robin_peer(ngx_stream_session_t *s, - ngx_stream_upstream_resolved_t *ur); -ngx_int_t ngx_stream_upstream_get_round_robin_peer(ngx_peer_connection_t *pc, - void *data); -void ngx_stream_upstream_free_round_robin_peer(ngx_peer_connection_t *pc, - void *data, ngx_uint_t state); - - -#endif /* _NGX_STREAM_UPSTREAM_ROUND_ROBIN_H_INCLUDED_ */ diff --git a/src/deps/src/nginx-1.30.3/src/stream/ngx_stream_upstream_zone_module.c b/src/deps/src/nginx-1.30.3/src/stream/ngx_stream_upstream_zone_module.c deleted file mode 100644 index a6874dc33d..0000000000 --- a/src/deps/src/nginx-1.30.3/src/stream/ngx_stream_upstream_zone_module.c +++ /dev/null @@ -1,1005 +0,0 @@ - -/* - * Copyright (C) Ruslan Ermilov - * Copyright (C) Nginx, Inc. - */ - - -#include -#include -#include - - -static char *ngx_stream_upstream_zone(ngx_conf_t *cf, ngx_command_t *cmd, - void *conf); -static ngx_int_t ngx_stream_upstream_init_zone(ngx_shm_zone_t *shm_zone, - void *data); -static ngx_stream_upstream_rr_peers_t *ngx_stream_upstream_zone_copy_peers( - ngx_slab_pool_t *shpool, ngx_stream_upstream_srv_conf_t *uscf, - ngx_stream_upstream_srv_conf_t *ouscf); -static ngx_stream_upstream_rr_peer_t *ngx_stream_upstream_zone_copy_peer( - ngx_stream_upstream_rr_peers_t *peers, ngx_stream_upstream_rr_peer_t *src); -static ngx_int_t ngx_stream_upstream_zone_preresolve( - ngx_stream_upstream_rr_peer_t *resolve, - ngx_stream_upstream_rr_peers_t *peers, - ngx_stream_upstream_rr_peer_t *oresolve, - ngx_stream_upstream_rr_peers_t *opeers); -static void ngx_stream_upstream_zone_set_single( - ngx_stream_upstream_srv_conf_t *uscf); -static void ngx_stream_upstream_zone_remove_peer_locked( - ngx_stream_upstream_rr_peers_t *peers, ngx_stream_upstream_rr_peer_t *peer); -static ngx_int_t ngx_stream_upstream_zone_init_worker(ngx_cycle_t *cycle); -static void ngx_stream_upstream_zone_resolve_timer(ngx_event_t *event); -static void ngx_stream_upstream_zone_resolve_handler(ngx_resolver_ctx_t *ctx); - - -static ngx_command_t ngx_stream_upstream_zone_commands[] = { - - { ngx_string("zone"), - NGX_STREAM_UPS_CONF|NGX_CONF_TAKE12, - ngx_stream_upstream_zone, - 0, - 0, - NULL }, - - ngx_null_command -}; - - -static ngx_stream_module_t ngx_stream_upstream_zone_module_ctx = { - NULL, /* preconfiguration */ - NULL, /* postconfiguration */ - - NULL, /* create main configuration */ - NULL, /* init main configuration */ - - NULL, /* create server configuration */ - NULL /* merge server configuration */ -}; - - -ngx_module_t ngx_stream_upstream_zone_module = { - NGX_MODULE_V1, - &ngx_stream_upstream_zone_module_ctx, /* module context */ - ngx_stream_upstream_zone_commands, /* module directives */ - NGX_STREAM_MODULE, /* module type */ - NULL, /* init master */ - NULL, /* init module */ - ngx_stream_upstream_zone_init_worker, /* init process */ - NULL, /* init thread */ - NULL, /* exit thread */ - NULL, /* exit process */ - NULL, /* exit master */ - NGX_MODULE_V1_PADDING -}; - - -static char * -ngx_stream_upstream_zone(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) -{ - ssize_t size; - ngx_str_t *value; - ngx_stream_upstream_srv_conf_t *uscf; - ngx_stream_upstream_main_conf_t *umcf; - - uscf = ngx_stream_conf_get_module_srv_conf(cf, ngx_stream_upstream_module); - umcf = ngx_stream_conf_get_module_main_conf(cf, ngx_stream_upstream_module); - - value = cf->args->elts; - - if (!value[1].len) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "invalid zone name \"%V\"", &value[1]); - return NGX_CONF_ERROR; - } - - if (cf->args->nelts == 3) { - size = ngx_parse_size(&value[2]); - - if (size == NGX_ERROR) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "invalid zone size \"%V\"", &value[2]); - return NGX_CONF_ERROR; - } - - if (size < (ssize_t) (8 * ngx_pagesize)) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "zone \"%V\" is too small", &value[1]); - return NGX_CONF_ERROR; - } - - } else { - size = 0; - } - - uscf->shm_zone = ngx_shared_memory_add(cf, &value[1], size, - &ngx_stream_upstream_module); - if (uscf->shm_zone == NULL) { - return NGX_CONF_ERROR; - } - - uscf->shm_zone->init = ngx_stream_upstream_init_zone; - uscf->shm_zone->data = umcf; - - uscf->shm_zone->noreuse = 1; - - return NGX_CONF_OK; -} - - -static ngx_int_t -ngx_stream_upstream_init_zone(ngx_shm_zone_t *shm_zone, void *data) -{ - size_t len; - ngx_uint_t i, j; - ngx_slab_pool_t *shpool; - ngx_stream_upstream_rr_peers_t *peers, **peersp; - ngx_stream_upstream_srv_conf_t *uscf, *ouscf, **uscfp, **ouscfp; - ngx_stream_upstream_main_conf_t *umcf, *oumcf; - - shpool = (ngx_slab_pool_t *) shm_zone->shm.addr; - umcf = shm_zone->data; - uscfp = umcf->upstreams.elts; - - if (shm_zone->shm.exists) { - peers = shpool->data; - - for (i = 0; i < umcf->upstreams.nelts; i++) { - uscf = uscfp[i]; - - if (uscf->shm_zone != shm_zone) { - continue; - } - - uscf->peer.data = peers; - peers = peers->zone_next; - } - - return NGX_OK; - } - - len = sizeof(" in upstream zone \"\"") + shm_zone->shm.name.len; - - shpool->log_ctx = ngx_slab_alloc(shpool, len); - if (shpool->log_ctx == NULL) { - return NGX_ERROR; - } - - ngx_sprintf(shpool->log_ctx, " in upstream zone \"%V\"%Z", - &shm_zone->shm.name); - - - /* copy peers to shared memory */ - - peersp = (ngx_stream_upstream_rr_peers_t **) (void *) &shpool->data; - oumcf = data; - - for (i = 0; i < umcf->upstreams.nelts; i++) { - uscf = uscfp[i]; - - if (uscf->shm_zone != shm_zone) { - continue; - } - - ouscf = NULL; - - if (oumcf) { - ouscfp = oumcf->upstreams.elts; - - for (j = 0; j < oumcf->upstreams.nelts; j++) { - - if (ouscfp[j]->shm_zone == NULL) { - continue; - } - - if (ouscfp[j]->shm_zone->shm.name.len != shm_zone->shm.name.len - || ngx_memcmp(ouscfp[j]->shm_zone->shm.name.data, - shm_zone->shm.name.data, - shm_zone->shm.name.len) - != 0) - { - continue; - } - - if (ouscfp[j]->host.len == uscf->host.len - && ngx_memcmp(ouscfp[j]->host.data, uscf->host.data, - uscf->host.len) - == 0) - { - ouscf = ouscfp[j]; - break; - } - } - } - - peers = ngx_stream_upstream_zone_copy_peers(shpool, uscf, ouscf); - if (peers == NULL) { - return NGX_ERROR; - } - - *peersp = peers; - peersp = &peers->zone_next; - } - - return NGX_OK; -} - - -static ngx_stream_upstream_rr_peers_t * -ngx_stream_upstream_zone_copy_peers(ngx_slab_pool_t *shpool, - ngx_stream_upstream_srv_conf_t *uscf, ngx_stream_upstream_srv_conf_t *ouscf) -{ - ngx_str_t *name; - ngx_uint_t *config; - ngx_stream_upstream_rr_peer_t *peer, **peerp; - ngx_stream_upstream_rr_peers_t *peers, *opeers, *backup; - - opeers = (ouscf ? ouscf->peer.data : NULL); - - config = ngx_slab_calloc(shpool, sizeof(ngx_uint_t)); - if (config == NULL) { - return NULL; - } - - peers = ngx_slab_alloc(shpool, sizeof(ngx_stream_upstream_rr_peers_t)); - if (peers == NULL) { - return NULL; - } - - ngx_memcpy(peers, uscf->peer.data, sizeof(ngx_stream_upstream_rr_peers_t)); - - name = ngx_slab_alloc(shpool, sizeof(ngx_str_t)); - if (name == NULL) { - return NULL; - } - - name->data = ngx_slab_alloc(shpool, peers->name->len); - if (name->data == NULL) { - return NULL; - } - - ngx_memcpy(name->data, peers->name->data, peers->name->len); - name->len = peers->name->len; - - peers->name = name; - - peers->shpool = shpool; - peers->config = config; - - for (peerp = &peers->peer; *peerp; peerp = &peer->next) { - /* pool is unlocked */ - peer = ngx_stream_upstream_zone_copy_peer(peers, *peerp); - if (peer == NULL) { - return NULL; - } - - *peerp = peer; - (*peers->config)++; - } - - for (peerp = &peers->resolve; *peerp; peerp = &peer->next) { - peer = ngx_stream_upstream_zone_copy_peer(peers, *peerp); - if (peer == NULL) { - return NULL; - } - - *peerp = peer; - (*peers->config)++; - } - - if (opeers) { - - if (ngx_stream_upstream_zone_preresolve(peers->resolve, peers, - opeers->resolve, opeers) - != NGX_OK) - { - return NULL; - } - } - - if (peers->next == NULL) { - goto done; - } - - backup = ngx_slab_alloc(shpool, sizeof(ngx_stream_upstream_rr_peers_t)); - if (backup == NULL) { - return NULL; - } - - ngx_memcpy(backup, peers->next, sizeof(ngx_stream_upstream_rr_peers_t)); - - backup->name = name; - - backup->shpool = shpool; - backup->config = config; - - for (peerp = &backup->peer; *peerp; peerp = &peer->next) { - /* pool is unlocked */ - peer = ngx_stream_upstream_zone_copy_peer(backup, *peerp); - if (peer == NULL) { - return NULL; - } - - *peerp = peer; - (*backup->config)++; - } - - for (peerp = &backup->resolve; *peerp; peerp = &peer->next) { - peer = ngx_stream_upstream_zone_copy_peer(backup, *peerp); - if (peer == NULL) { - return NULL; - } - - *peerp = peer; - (*backup->config)++; - } - - peers->next = backup; - - if (opeers && opeers->next) { - - if (ngx_stream_upstream_zone_preresolve(peers->resolve, backup, - opeers->resolve, opeers->next) - != NGX_OK) - { - return NULL; - } - - if (ngx_stream_upstream_zone_preresolve(backup->resolve, backup, - opeers->next->resolve, - opeers->next) - != NGX_OK) - { - return NULL; - } - } - -done: - - uscf->peer.data = peers; - - ngx_stream_upstream_zone_set_single(uscf); - - return peers; -} - - -static ngx_stream_upstream_rr_peer_t * -ngx_stream_upstream_zone_copy_peer(ngx_stream_upstream_rr_peers_t *peers, - ngx_stream_upstream_rr_peer_t *src) -{ - ngx_slab_pool_t *pool; - ngx_stream_upstream_rr_peer_t *dst; - - pool = peers->shpool; - - dst = ngx_slab_calloc_locked(pool, sizeof(ngx_stream_upstream_rr_peer_t)); - if (dst == NULL) { - return NULL; - } - - if (src) { - ngx_memcpy(dst, src, sizeof(ngx_stream_upstream_rr_peer_t)); - dst->sockaddr = NULL; - dst->name.data = NULL; - dst->server.data = NULL; - dst->host = NULL; - } - - dst->sockaddr = ngx_slab_calloc_locked(pool, sizeof(ngx_sockaddr_t)); - if (dst->sockaddr == NULL) { - goto failed; - } - - dst->name.data = ngx_slab_calloc_locked(pool, NGX_SOCKADDR_STRLEN); - if (dst->name.data == NULL) { - goto failed; - } - - if (src) { - ngx_memcpy(dst->sockaddr, src->sockaddr, src->socklen); - ngx_memcpy(dst->name.data, src->name.data, src->name.len); - - dst->server.data = ngx_slab_alloc_locked(pool, src->server.len); - if (dst->server.data == NULL) { - goto failed; - } - - ngx_memcpy(dst->server.data, src->server.data, src->server.len); - - if (src->host) { - dst->host = ngx_slab_calloc_locked(pool, - sizeof(ngx_stream_upstream_host_t)); - if (dst->host == NULL) { - goto failed; - } - - dst->host->name.data = ngx_slab_alloc_locked(pool, - src->host->name.len); - if (dst->host->name.data == NULL) { - goto failed; - } - - dst->host->peers = peers; - dst->host->peer = dst; - - dst->host->name.len = src->host->name.len; - ngx_memcpy(dst->host->name.data, src->host->name.data, - src->host->name.len); - - if (src->host->service.len) { - dst->host->service.data = ngx_slab_alloc_locked(pool, - src->host->service.len); - if (dst->host->service.data == NULL) { - goto failed; - } - - dst->host->service.len = src->host->service.len; - ngx_memcpy(dst->host->service.data, src->host->service.data, - src->host->service.len); - } - } - } - - return dst; - -failed: - - if (dst->host) { - if (dst->host->name.data) { - ngx_slab_free_locked(pool, dst->host->name.data); - } - - ngx_slab_free_locked(pool, dst->host); - } - - if (dst->server.data) { - ngx_slab_free_locked(pool, dst->server.data); - } - - if (dst->name.data) { - ngx_slab_free_locked(pool, dst->name.data); - } - - if (dst->sockaddr) { - ngx_slab_free_locked(pool, dst->sockaddr); - } - - ngx_slab_free_locked(pool, dst); - - return NULL; -} - - -static ngx_int_t -ngx_stream_upstream_zone_preresolve(ngx_stream_upstream_rr_peer_t *resolve, - ngx_stream_upstream_rr_peers_t *peers, - ngx_stream_upstream_rr_peer_t *oresolve, - ngx_stream_upstream_rr_peers_t *opeers) -{ - in_port_t port; - ngx_str_t *server; - ngx_stream_upstream_host_t *host; - ngx_stream_upstream_rr_peer_t *peer, *template, *opeer, **peerp; - - if (resolve == NULL || oresolve == NULL) { - return NGX_OK; - } - - for (peerp = &peers->peer; *peerp; peerp = &(*peerp)->next) { - /* void */ - } - - ngx_stream_upstream_rr_peers_rlock(opeers); - - for (template = resolve; template; template = template->next) { - for (opeer = oresolve; opeer; opeer = opeer->next) { - - if (opeer->host->name.len != template->host->name.len - || ngx_memcmp(opeer->host->name.data, - template->host->name.data, - template->host->name.len) - != 0) - { - continue; - } - - if (opeer->host->service.len != template->host->service.len - || ngx_memcmp(opeer->host->service.data, - template->host->service.data, - template->host->service.len) - != 0) - { - continue; - } - - host = opeer->host; - - for (opeer = opeers->peer; opeer; opeer = opeer->next) { - - if (opeer->host != host) { - continue; - } - - peer = ngx_stream_upstream_zone_copy_peer(peers, NULL); - if (peer == NULL) { - ngx_stream_upstream_rr_peers_unlock(opeers); - return NGX_ERROR; - } - - ngx_memcpy(peer->sockaddr, opeer->sockaddr, opeer->socklen); - - if (template->host->service.len == 0) { - port = ngx_inet_get_port(template->sockaddr); - ngx_inet_set_port(peer->sockaddr, port); - } - - peer->socklen = opeer->socklen; - - peer->name.len = ngx_sock_ntop(peer->sockaddr, peer->socklen, - peer->name.data, - NGX_SOCKADDR_STRLEN, 1); - - peer->host = template->host; - - template->host->valid = host->valid; - - server = template->host->service.len ? &opeer->server - : &template->server; - - peer->server.data = ngx_slab_alloc(peers->shpool, server->len); - if (peer->server.data == NULL) { - ngx_stream_upstream_rr_peers_unlock(opeers); - return NGX_ERROR; - } - - ngx_memcpy(peer->server.data, server->data, server->len); - peer->server.len = server->len; - - if (host->service.len == 0) { - peer->weight = template->weight; - - } else { - peer->weight = (template->weight != 1 ? template->weight - : opeer->weight); - } - - peer->effective_weight = peer->weight; - peer->max_conns = template->max_conns; - peer->max_fails = template->max_fails; - peer->fail_timeout = template->fail_timeout; - peer->down = template->down; - - (*peers->config)++; - - *peerp = peer; - peerp = &peer->next; - - peers->number++; - peers->tries += (peer->down == 0); - peers->total_weight += peer->weight; - peers->weighted = (peers->total_weight != peers->number); - } - - break; - } - } - - ngx_stream_upstream_rr_peers_unlock(opeers); - return NGX_OK; -} - - -static void -ngx_stream_upstream_zone_set_single(ngx_stream_upstream_srv_conf_t *uscf) -{ - ngx_stream_upstream_rr_peers_t *peers; - - peers = uscf->peer.data; - - if (peers->number == 1 - && (peers->next == NULL || peers->next->number == 0)) - { - peers->single = 1; - - } else { - peers->single = 0; - } -} - - -static void -ngx_stream_upstream_zone_remove_peer_locked( - ngx_stream_upstream_rr_peers_t *peers, ngx_stream_upstream_rr_peer_t *peer) -{ - peers->total_weight -= peer->weight; - peers->number--; - peers->tries -= (peer->down == 0); - (*peers->config)++; - peers->weighted = (peers->total_weight != peers->number); - - ngx_stream_upstream_rr_peer_free(peers, peer); -} - - -static ngx_int_t -ngx_stream_upstream_zone_init_worker(ngx_cycle_t *cycle) -{ - time_t now; - ngx_msec_t timer; - ngx_uint_t i; - ngx_event_t *event; - ngx_stream_upstream_rr_peer_t *peer; - ngx_stream_upstream_rr_peers_t *peers; - ngx_stream_upstream_srv_conf_t *uscf, **uscfp; - ngx_stream_upstream_main_conf_t *umcf; - - if (ngx_process != NGX_PROCESS_WORKER - && ngx_process != NGX_PROCESS_SINGLE) - { - return NGX_OK; - } - - now = ngx_time(); - umcf = ngx_stream_cycle_get_module_main_conf(cycle, - ngx_stream_upstream_module); - - if (umcf == NULL) { - return NGX_OK; - } - - uscfp = umcf->upstreams.elts; - - for (i = 0; i < umcf->upstreams.nelts; i++) { - - uscf = uscfp[i]; - - if (uscf->shm_zone == NULL) { - continue; - } - - peers = uscf->peer.data; - - do { - ngx_stream_upstream_rr_peers_wlock(peers); - - for (peer = peers->resolve; peer; peer = peer->next) { - - if (peer->host->worker != ngx_worker) { - continue; - } - - event = &peer->host->event; - ngx_memzero(event, sizeof(ngx_event_t)); - - event->data = uscf; - event->handler = ngx_stream_upstream_zone_resolve_timer; - event->log = cycle->log; - event->cancelable = 1; - - timer = (peer->host->valid > now) - ? (ngx_msec_t) 1000 * (peer->host->valid - now) : 1; - - ngx_add_timer(event, timer); - } - - ngx_stream_upstream_rr_peers_unlock(peers); - - peers = peers->next; - - } while (peers); - } - - return NGX_OK; -} - - -static void -ngx_stream_upstream_zone_resolve_timer(ngx_event_t *event) -{ - ngx_resolver_ctx_t *ctx; - ngx_stream_upstream_host_t *host; - ngx_stream_upstream_srv_conf_t *uscf; - - host = (ngx_stream_upstream_host_t *) event; - uscf = event->data; - - ctx = ngx_resolve_start(uscf->resolver, NULL); - if (ctx == NULL) { - goto retry; - } - - if (ctx == NGX_NO_RESOLVER) { - ngx_log_error(NGX_LOG_ERR, event->log, 0, - "no resolver defined to resolve %V", &host->name); - return; - } - - ctx->name = host->name; - ctx->handler = ngx_stream_upstream_zone_resolve_handler; - ctx->data = host; - ctx->timeout = uscf->resolver_timeout; - ctx->service = host->service; - ctx->cancelable = 1; - - if (ngx_resolve_name(ctx) == NGX_OK) { - return; - } - -retry: - - ngx_add_timer(event, ngx_max(uscf->resolver_timeout, 1000)); -} - - -#define ngx_stream_upstream_zone_addr_marked(addr) \ - ((uintptr_t) (addr)->sockaddr & 1) - -#define ngx_stream_upstream_zone_mark_addr(addr) \ - (addr)->sockaddr = (struct sockaddr *) ((uintptr_t) (addr)->sockaddr | 1) - -#define ngx_stream_upstream_zone_unmark_addr(addr) \ - (addr)->sockaddr = \ - (struct sockaddr *) ((uintptr_t) (addr)->sockaddr & ~((uintptr_t) 1)) - -static void -ngx_stream_upstream_zone_resolve_handler(ngx_resolver_ctx_t *ctx) -{ - time_t now; - u_short min_priority; - in_port_t port; - ngx_str_t *server; - ngx_msec_t timer; - ngx_uint_t i, j, backup, addr_backup; - ngx_event_t *event; - ngx_resolver_addr_t *addr; - ngx_resolver_srv_name_t *srv; - ngx_stream_upstream_host_t *host; - ngx_stream_upstream_rr_peer_t *peer, *template, **peerp; - ngx_stream_upstream_rr_peers_t *peers; - ngx_stream_upstream_srv_conf_t *uscf; - - host = ctx->data; - event = &host->event; - uscf = event->data; - peers = host->peers; - template = host->peer; - - ngx_stream_upstream_rr_peers_wlock(peers); - - now = ngx_time(); - - for (i = 0; i < ctx->nsrvs; i++) { - srv = &ctx->srvs[i]; - - if (srv->state) { - ngx_log_error(NGX_LOG_ERR, event->log, 0, - "%V could not be resolved (%i: %s) " - "while resolving service %V of %V", - &srv->name, srv->state, - ngx_resolver_strerror(srv->state), &ctx->service, - &ctx->name); - } - } - - if (ctx->state) { - if (ctx->service.len) { - ngx_log_error(NGX_LOG_ERR, event->log, 0, - "service %V of %V could not be resolved (%i: %s)", - &ctx->service, &ctx->name, ctx->state, - ngx_resolver_strerror(ctx->state)); - - } else { - ngx_log_error(NGX_LOG_ERR, event->log, 0, - "%V could not be resolved (%i: %s)", - &ctx->name, ctx->state, - ngx_resolver_strerror(ctx->state)); - } - - if (ctx->state != NGX_RESOLVE_NXDOMAIN) { - ngx_stream_upstream_rr_peers_unlock(peers); - - ngx_resolve_name_done(ctx); - - ngx_add_timer(event, ngx_max(uscf->resolver_timeout, 1000)); - return; - } - - /* NGX_RESOLVE_NXDOMAIN */ - - ctx->naddrs = 0; - } - - backup = 0; - min_priority = 65535; - - for (i = 0; i < ctx->naddrs; i++) { - min_priority = ngx_min(ctx->addrs[i].priority, min_priority); - } - -#if (NGX_DEBUG) - { - u_char text[NGX_SOCKADDR_STRLEN]; - size_t len; - - for (i = 0; i < ctx->naddrs; i++) { - len = ngx_sock_ntop(ctx->addrs[i].sockaddr, ctx->addrs[i].socklen, - text, NGX_SOCKADDR_STRLEN, 1); - - ngx_log_debug7(NGX_LOG_DEBUG_STREAM, event->log, 0, - "name %V was resolved to %*s " - "s:\"%V\" n:\"%V\" w:%d %s", - &host->name, len, text, &host->service, - &ctx->addrs[i].name, ctx->addrs[i].weight, - ctx->addrs[i].priority != min_priority ? "backup" : ""); - } - } -#endif - -again: - - for (peerp = &peers->peer; *peerp; /* void */ ) { - peer = *peerp; - - if (peer->host != host) { - goto next; - } - - for (j = 0; j < ctx->naddrs; j++) { - - addr = &ctx->addrs[j]; - - addr_backup = (addr->priority != min_priority); - if (addr_backup != backup) { - continue; - } - - if (ngx_stream_upstream_zone_addr_marked(addr)) { - continue; - } - - if (ngx_cmp_sockaddr(peer->sockaddr, peer->socklen, - addr->sockaddr, addr->socklen, - host->service.len != 0) - != NGX_OK) - { - continue; - } - - if (host->service.len) { - if (addr->name.len != peer->server.len - || ngx_strncmp(addr->name.data, peer->server.data, - addr->name.len)) - { - continue; - } - - if (template->weight == 1 && addr->weight != peer->weight) { - continue; - } - } - - ngx_stream_upstream_zone_mark_addr(addr); - - goto next; - } - - *peerp = peer->next; - ngx_stream_upstream_zone_remove_peer_locked(peers, peer); - - ngx_stream_upstream_zone_set_single(uscf); - - continue; - - next: - - peerp = &peer->next; - } - - for (i = 0; i < ctx->naddrs; i++) { - - addr = &ctx->addrs[i]; - - addr_backup = (addr->priority != min_priority); - if (addr_backup != backup) { - continue; - } - - if (ngx_stream_upstream_zone_addr_marked(addr)) { - ngx_stream_upstream_zone_unmark_addr(addr); - continue; - } - - ngx_shmtx_lock(&peers->shpool->mutex); - peer = ngx_stream_upstream_zone_copy_peer(peers, NULL); - ngx_shmtx_unlock(&peers->shpool->mutex); - - if (peer == NULL) { - ngx_log_error(NGX_LOG_ERR, event->log, 0, - "cannot add new server to upstream \"%V\", " - "memory exhausted", peers->name); - goto done; - } - - ngx_memcpy(peer->sockaddr, addr->sockaddr, addr->socklen); - - if (host->service.len == 0) { - port = ngx_inet_get_port(template->sockaddr); - ngx_inet_set_port(peer->sockaddr, port); - } - - peer->socklen = addr->socklen; - - peer->name.len = ngx_sock_ntop(peer->sockaddr, peer->socklen, - peer->name.data, NGX_SOCKADDR_STRLEN, 1); - - peer->host = template->host; - - server = host->service.len ? &addr->name : &template->server; - - peer->server.data = ngx_slab_alloc(peers->shpool, server->len); - if (peer->server.data == NULL) { - ngx_stream_upstream_rr_peer_free(peers, peer); - - ngx_log_error(NGX_LOG_ERR, event->log, 0, - "cannot add new server to upstream \"%V\", " - "memory exhausted", peers->name); - goto done; - } - - peer->server.len = server->len; - ngx_memcpy(peer->server.data, server->data, server->len); - - if (host->service.len == 0) { - peer->weight = template->weight; - - } else { - peer->weight = (template->weight != 1 ? template->weight - : addr->weight); - } - - peer->effective_weight = peer->weight; - peer->max_conns = template->max_conns; - peer->max_fails = template->max_fails; - peer->fail_timeout = template->fail_timeout; - peer->down = template->down; - - *peerp = peer; - peerp = &peer->next; - - peers->number++; - peers->tries += (peer->down == 0); - peers->total_weight += peer->weight; - peers->weighted = (peers->total_weight != peers->number); - (*peers->config)++; - - ngx_stream_upstream_zone_set_single(uscf); - } - - if (host->service.len && peers->next) { - ngx_stream_upstream_rr_peers_unlock(peers); - - peers = peers->next; - backup = 1; - - ngx_stream_upstream_rr_peers_wlock(peers); - - goto again; - } - -done: - - host->valid = ctx->valid; - - ngx_stream_upstream_rr_peers_unlock(peers); - - while (++i < ctx->naddrs) { - ngx_stream_upstream_zone_unmark_addr(&ctx->addrs[i]); - } - - timer = (ngx_msec_t) 1000 * (ctx->valid > now ? ctx->valid - now + 1 : 1); - - ngx_resolve_name_done(ctx); - - ngx_add_timer(event, timer); -} diff --git a/src/deps/src/nginx-1.30.3/src/stream/ngx_stream_variables.c b/src/deps/src/nginx-1.30.3/src/stream/ngx_stream_variables.c deleted file mode 100644 index 4658104e12..0000000000 --- a/src/deps/src/nginx-1.30.3/src/stream/ngx_stream_variables.c +++ /dev/null @@ -1,1340 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#include -#include -#include -#include - -static ngx_stream_variable_t *ngx_stream_add_prefix_variable(ngx_conf_t *cf, - ngx_str_t *name, ngx_uint_t flags); - -static ngx_int_t ngx_stream_variable_binary_remote_addr( - ngx_stream_session_t *s, ngx_stream_variable_value_t *v, uintptr_t data); -static ngx_int_t ngx_stream_variable_remote_addr(ngx_stream_session_t *s, - ngx_stream_variable_value_t *v, uintptr_t data); -static ngx_int_t ngx_stream_variable_remote_port(ngx_stream_session_t *s, - ngx_stream_variable_value_t *v, uintptr_t data); -static ngx_int_t ngx_stream_variable_proxy_protocol_addr( - ngx_stream_session_t *s, ngx_stream_variable_value_t *v, uintptr_t data); -static ngx_int_t ngx_stream_variable_proxy_protocol_port( - ngx_stream_session_t *s, ngx_stream_variable_value_t *v, uintptr_t data); -static ngx_int_t ngx_stream_variable_proxy_protocol_tlv( - ngx_stream_session_t *s, ngx_stream_variable_value_t *v, uintptr_t data); -static ngx_int_t ngx_stream_variable_server_addr(ngx_stream_session_t *s, - ngx_stream_variable_value_t *v, uintptr_t data); -static ngx_int_t ngx_stream_variable_server_port(ngx_stream_session_t *s, - ngx_stream_variable_value_t *v, uintptr_t data); -static ngx_int_t ngx_stream_variable_server_name(ngx_stream_session_t *s, - ngx_stream_variable_value_t *v, uintptr_t data); -static ngx_int_t ngx_stream_variable_bytes(ngx_stream_session_t *s, - ngx_stream_variable_value_t *v, uintptr_t data); -static ngx_int_t ngx_stream_variable_session_time(ngx_stream_session_t *s, - ngx_stream_variable_value_t *v, uintptr_t data); -static ngx_int_t ngx_stream_variable_status(ngx_stream_session_t *s, - ngx_stream_variable_value_t *v, uintptr_t data); -static ngx_int_t ngx_stream_variable_connection(ngx_stream_session_t *s, - ngx_stream_variable_value_t *v, uintptr_t data); - -static ngx_int_t ngx_stream_variable_nginx_version(ngx_stream_session_t *s, - ngx_stream_variable_value_t *v, uintptr_t data); -static ngx_int_t ngx_stream_variable_hostname(ngx_stream_session_t *s, - ngx_stream_variable_value_t *v, uintptr_t data); -static ngx_int_t ngx_stream_variable_pid(ngx_stream_session_t *s, - ngx_stream_variable_value_t *v, uintptr_t data); -static ngx_int_t ngx_stream_variable_msec(ngx_stream_session_t *s, - ngx_stream_variable_value_t *v, uintptr_t data); -static ngx_int_t ngx_stream_variable_time_iso8601(ngx_stream_session_t *s, - ngx_stream_variable_value_t *v, uintptr_t data); -static ngx_int_t ngx_stream_variable_time_local(ngx_stream_session_t *s, - ngx_stream_variable_value_t *v, uintptr_t data); -static ngx_int_t ngx_stream_variable_protocol(ngx_stream_session_t *s, - ngx_stream_variable_value_t *v, uintptr_t data); - - -static ngx_stream_variable_t ngx_stream_core_variables[] = { - - { ngx_string("binary_remote_addr"), NULL, - ngx_stream_variable_binary_remote_addr, 0, 0, 0 }, - - { ngx_string("remote_addr"), NULL, - ngx_stream_variable_remote_addr, 0, 0, 0 }, - - { ngx_string("remote_port"), NULL, - ngx_stream_variable_remote_port, 0, 0, 0 }, - - { ngx_string("proxy_protocol_addr"), NULL, - ngx_stream_variable_proxy_protocol_addr, - offsetof(ngx_proxy_protocol_t, src_addr), 0, 0 }, - - { ngx_string("proxy_protocol_port"), NULL, - ngx_stream_variable_proxy_protocol_port, - offsetof(ngx_proxy_protocol_t, src_port), 0, 0 }, - - { ngx_string("proxy_protocol_server_addr"), NULL, - ngx_stream_variable_proxy_protocol_addr, - offsetof(ngx_proxy_protocol_t, dst_addr), 0, 0 }, - - { ngx_string("proxy_protocol_server_port"), NULL, - ngx_stream_variable_proxy_protocol_port, - offsetof(ngx_proxy_protocol_t, dst_port), 0, 0 }, - - { ngx_string("proxy_protocol_tlv_"), NULL, - ngx_stream_variable_proxy_protocol_tlv, - 0, NGX_STREAM_VAR_PREFIX, 0 }, - - { ngx_string("server_addr"), NULL, - ngx_stream_variable_server_addr, 0, 0, 0 }, - - { ngx_string("server_port"), NULL, - ngx_stream_variable_server_port, 0, 0, 0 }, - - { ngx_string("server_name"), NULL, ngx_stream_variable_server_name, - 0, 0, 0 }, - - { ngx_string("bytes_sent"), NULL, ngx_stream_variable_bytes, - 0, 0, 0 }, - - { ngx_string("bytes_received"), NULL, ngx_stream_variable_bytes, - 1, 0, 0 }, - - { ngx_string("session_time"), NULL, ngx_stream_variable_session_time, - 0, NGX_STREAM_VAR_NOCACHEABLE, 0 }, - - { ngx_string("status"), NULL, ngx_stream_variable_status, - 0, NGX_STREAM_VAR_NOCACHEABLE, 0 }, - - { ngx_string("connection"), NULL, - ngx_stream_variable_connection, 0, 0, 0 }, - - { ngx_string("nginx_version"), NULL, ngx_stream_variable_nginx_version, - 0, 0, 0 }, - - { ngx_string("hostname"), NULL, ngx_stream_variable_hostname, - 0, 0, 0 }, - - { ngx_string("pid"), NULL, ngx_stream_variable_pid, - 0, 0, 0 }, - - { ngx_string("msec"), NULL, ngx_stream_variable_msec, - 0, NGX_STREAM_VAR_NOCACHEABLE, 0 }, - - { ngx_string("time_iso8601"), NULL, ngx_stream_variable_time_iso8601, - 0, NGX_STREAM_VAR_NOCACHEABLE, 0 }, - - { ngx_string("time_local"), NULL, ngx_stream_variable_time_local, - 0, NGX_STREAM_VAR_NOCACHEABLE, 0 }, - - { ngx_string("protocol"), NULL, - ngx_stream_variable_protocol, 0, 0, 0 }, - - ngx_stream_null_variable -}; - - -ngx_stream_variable_value_t ngx_stream_variable_null_value = - ngx_stream_variable(""); -ngx_stream_variable_value_t ngx_stream_variable_true_value = - ngx_stream_variable("1"); - - -static ngx_uint_t ngx_stream_variable_depth = 100; - - -ngx_stream_variable_t * -ngx_stream_add_variable(ngx_conf_t *cf, ngx_str_t *name, ngx_uint_t flags) -{ - ngx_int_t rc; - ngx_uint_t i; - ngx_hash_key_t *key; - ngx_stream_variable_t *v; - ngx_stream_core_main_conf_t *cmcf; - - if (name->len == 0) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "invalid variable name \"$\""); - return NULL; - } - - if (flags & NGX_STREAM_VAR_PREFIX) { - return ngx_stream_add_prefix_variable(cf, name, flags); - } - - cmcf = ngx_stream_conf_get_module_main_conf(cf, ngx_stream_core_module); - - key = cmcf->variables_keys->keys.elts; - for (i = 0; i < cmcf->variables_keys->keys.nelts; i++) { - if (name->len != key[i].key.len - || ngx_strncasecmp(name->data, key[i].key.data, name->len) != 0) - { - continue; - } - - v = key[i].value; - - if (!(v->flags & NGX_STREAM_VAR_CHANGEABLE)) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "the duplicate \"%V\" variable", name); - return NULL; - } - - if (!(flags & NGX_STREAM_VAR_WEAK)) { - v->flags &= ~NGX_STREAM_VAR_WEAK; - } - - return v; - } - - v = ngx_palloc(cf->pool, sizeof(ngx_stream_variable_t)); - if (v == NULL) { - return NULL; - } - - v->name.len = name->len; - v->name.data = ngx_pnalloc(cf->pool, name->len); - if (v->name.data == NULL) { - return NULL; - } - - ngx_strlow(v->name.data, name->data, name->len); - - v->set_handler = NULL; - v->get_handler = NULL; - v->data = 0; - v->flags = flags; - v->index = 0; - - rc = ngx_hash_add_key(cmcf->variables_keys, &v->name, v, 0); - - if (rc == NGX_ERROR) { - return NULL; - } - - if (rc == NGX_BUSY) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "conflicting variable name \"%V\"", name); - return NULL; - } - - return v; -} - - -static ngx_stream_variable_t * -ngx_stream_add_prefix_variable(ngx_conf_t *cf, ngx_str_t *name, - ngx_uint_t flags) -{ - ngx_uint_t i; - ngx_stream_variable_t *v; - ngx_stream_core_main_conf_t *cmcf; - - cmcf = ngx_stream_conf_get_module_main_conf(cf, ngx_stream_core_module); - - v = cmcf->prefix_variables.elts; - for (i = 0; i < cmcf->prefix_variables.nelts; i++) { - if (name->len != v[i].name.len - || ngx_strncasecmp(name->data, v[i].name.data, name->len) != 0) - { - continue; - } - - v = &v[i]; - - if (!(v->flags & NGX_STREAM_VAR_CHANGEABLE)) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "the duplicate \"%V\" variable", name); - return NULL; - } - - if (!(flags & NGX_STREAM_VAR_WEAK)) { - v->flags &= ~NGX_STREAM_VAR_WEAK; - } - - return v; - } - - v = ngx_array_push(&cmcf->prefix_variables); - if (v == NULL) { - return NULL; - } - - v->name.len = name->len; - v->name.data = ngx_pnalloc(cf->pool, name->len); - if (v->name.data == NULL) { - return NULL; - } - - ngx_strlow(v->name.data, name->data, name->len); - - v->set_handler = NULL; - v->get_handler = NULL; - v->data = 0; - v->flags = flags; - v->index = 0; - - return v; -} - - -ngx_int_t -ngx_stream_get_variable_index(ngx_conf_t *cf, ngx_str_t *name) -{ - ngx_uint_t i; - ngx_stream_variable_t *v; - ngx_stream_core_main_conf_t *cmcf; - - if (name->len == 0) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "invalid variable name \"$\""); - return NGX_ERROR; - } - - cmcf = ngx_stream_conf_get_module_main_conf(cf, ngx_stream_core_module); - - v = cmcf->variables.elts; - - if (v == NULL) { - if (ngx_array_init(&cmcf->variables, cf->pool, 4, - sizeof(ngx_stream_variable_t)) - != NGX_OK) - { - return NGX_ERROR; - } - - } else { - for (i = 0; i < cmcf->variables.nelts; i++) { - if (name->len != v[i].name.len - || ngx_strncasecmp(name->data, v[i].name.data, name->len) != 0) - { - continue; - } - - return i; - } - } - - v = ngx_array_push(&cmcf->variables); - if (v == NULL) { - return NGX_ERROR; - } - - v->name.len = name->len; - v->name.data = ngx_pnalloc(cf->pool, name->len); - if (v->name.data == NULL) { - return NGX_ERROR; - } - - ngx_strlow(v->name.data, name->data, name->len); - - v->set_handler = NULL; - v->get_handler = NULL; - v->data = 0; - v->flags = 0; - v->index = cmcf->variables.nelts - 1; - - return v->index; -} - - -ngx_stream_variable_value_t * -ngx_stream_get_indexed_variable(ngx_stream_session_t *s, ngx_uint_t index) -{ - ngx_stream_variable_t *v; - ngx_stream_core_main_conf_t *cmcf; - - cmcf = ngx_stream_get_module_main_conf(s, ngx_stream_core_module); - - if (cmcf->variables.nelts <= index) { - ngx_log_error(NGX_LOG_ALERT, s->connection->log, 0, - "unknown variable index: %ui", index); - return NULL; - } - - if (s->variables[index].not_found || s->variables[index].valid) { - return &s->variables[index]; - } - - v = cmcf->variables.elts; - - if (ngx_stream_variable_depth == 0) { - ngx_log_error(NGX_LOG_ERR, s->connection->log, 0, - "cycle while evaluating variable \"%V\"", - &v[index].name); - return NULL; - } - - ngx_stream_variable_depth--; - - if (v[index].get_handler(s, &s->variables[index], v[index].data) - == NGX_OK) - { - ngx_stream_variable_depth++; - - if (v[index].flags & NGX_STREAM_VAR_NOCACHEABLE) { - s->variables[index].no_cacheable = 1; - } - - return &s->variables[index]; - } - - ngx_stream_variable_depth++; - - s->variables[index].valid = 0; - s->variables[index].not_found = 1; - - return NULL; -} - - -ngx_stream_variable_value_t * -ngx_stream_get_flushed_variable(ngx_stream_session_t *s, ngx_uint_t index) -{ - ngx_stream_variable_value_t *v; - - v = &s->variables[index]; - - if (v->valid || v->not_found) { - if (!v->no_cacheable) { - return v; - } - - v->valid = 0; - v->not_found = 0; - } - - return ngx_stream_get_indexed_variable(s, index); -} - - -ngx_stream_variable_value_t * -ngx_stream_get_variable(ngx_stream_session_t *s, ngx_str_t *name, - ngx_uint_t key) -{ - size_t len; - ngx_uint_t i, n; - ngx_stream_variable_t *v; - ngx_stream_variable_value_t *vv; - ngx_stream_core_main_conf_t *cmcf; - - cmcf = ngx_stream_get_module_main_conf(s, ngx_stream_core_module); - - v = ngx_hash_find(&cmcf->variables_hash, key, name->data, name->len); - - if (v) { - if (v->flags & NGX_STREAM_VAR_INDEXED) { - return ngx_stream_get_flushed_variable(s, v->index); - } - - if (ngx_stream_variable_depth == 0) { - ngx_log_error(NGX_LOG_ERR, s->connection->log, 0, - "cycle while evaluating variable \"%V\"", name); - return NULL; - } - - ngx_stream_variable_depth--; - - vv = ngx_palloc(s->connection->pool, - sizeof(ngx_stream_variable_value_t)); - - if (vv && v->get_handler(s, vv, v->data) == NGX_OK) { - ngx_stream_variable_depth++; - return vv; - } - - ngx_stream_variable_depth++; - return NULL; - } - - vv = ngx_palloc(s->connection->pool, sizeof(ngx_stream_variable_value_t)); - if (vv == NULL) { - return NULL; - } - - len = 0; - - v = cmcf->prefix_variables.elts; - n = cmcf->prefix_variables.nelts; - - for (i = 0; i < cmcf->prefix_variables.nelts; i++) { - if (name->len >= v[i].name.len && name->len > len - && ngx_strncmp(name->data, v[i].name.data, v[i].name.len) == 0) - { - len = v[i].name.len; - n = i; - } - } - - if (n != cmcf->prefix_variables.nelts) { - if (v[n].get_handler(s, vv, (uintptr_t) name) == NGX_OK) { - return vv; - } - - return NULL; - } - - vv->not_found = 1; - - return vv; -} - - -static ngx_int_t -ngx_stream_variable_binary_remote_addr(ngx_stream_session_t *s, - ngx_stream_variable_value_t *v, uintptr_t data) -{ - struct sockaddr_in *sin; -#if (NGX_HAVE_INET6) - struct sockaddr_in6 *sin6; -#endif - - switch (s->connection->sockaddr->sa_family) { - -#if (NGX_HAVE_INET6) - case AF_INET6: - sin6 = (struct sockaddr_in6 *) s->connection->sockaddr; - - v->len = sizeof(struct in6_addr); - v->valid = 1; - v->no_cacheable = 0; - v->not_found = 0; - v->data = sin6->sin6_addr.s6_addr; - - break; -#endif - -#if (NGX_HAVE_UNIX_DOMAIN) - case AF_UNIX: - - v->len = s->connection->addr_text.len; - v->valid = 1; - v->no_cacheable = 0; - v->not_found = 0; - v->data = s->connection->addr_text.data; - - break; -#endif - - default: /* AF_INET */ - sin = (struct sockaddr_in *) s->connection->sockaddr; - - v->len = sizeof(in_addr_t); - v->valid = 1; - v->no_cacheable = 0; - v->not_found = 0; - v->data = (u_char *) &sin->sin_addr; - - break; - } - - return NGX_OK; -} - - -static ngx_int_t -ngx_stream_variable_remote_addr(ngx_stream_session_t *s, - ngx_stream_variable_value_t *v, uintptr_t data) -{ - v->len = s->connection->addr_text.len; - v->valid = 1; - v->no_cacheable = 0; - v->not_found = 0; - v->data = s->connection->addr_text.data; - - return NGX_OK; -} - - -static ngx_int_t -ngx_stream_variable_remote_port(ngx_stream_session_t *s, - ngx_stream_variable_value_t *v, uintptr_t data) -{ - ngx_uint_t port; - - v->len = 0; - v->valid = 1; - v->no_cacheable = 0; - v->not_found = 0; - - v->data = ngx_pnalloc(s->connection->pool, sizeof("65535") - 1); - if (v->data == NULL) { - return NGX_ERROR; - } - - port = ngx_inet_get_port(s->connection->sockaddr); - - if (port > 0 && port < 65536) { - v->len = ngx_sprintf(v->data, "%ui", port) - v->data; - } - - return NGX_OK; -} - - -static ngx_int_t -ngx_stream_variable_proxy_protocol_addr(ngx_stream_session_t *s, - ngx_stream_variable_value_t *v, uintptr_t data) -{ - ngx_str_t *addr; - ngx_proxy_protocol_t *pp; - - pp = s->connection->proxy_protocol; - if (pp == NULL) { - v->not_found = 1; - return NGX_OK; - } - - addr = (ngx_str_t *) ((char *) pp + data); - - v->len = addr->len; - v->valid = 1; - v->no_cacheable = 0; - v->not_found = 0; - v->data = addr->data; - - return NGX_OK; -} - - -static ngx_int_t -ngx_stream_variable_proxy_protocol_port(ngx_stream_session_t *s, - ngx_stream_variable_value_t *v, uintptr_t data) -{ - ngx_uint_t port; - ngx_proxy_protocol_t *pp; - - pp = s->connection->proxy_protocol; - if (pp == NULL) { - v->not_found = 1; - return NGX_OK; - } - - v->len = 0; - v->valid = 1; - v->no_cacheable = 0; - v->not_found = 0; - - v->data = ngx_pnalloc(s->connection->pool, sizeof("65535") - 1); - if (v->data == NULL) { - return NGX_ERROR; - } - - port = *(in_port_t *) ((char *) pp + data); - - if (port > 0 && port < 65536) { - v->len = ngx_sprintf(v->data, "%ui", port) - v->data; - } - - return NGX_OK; -} - - -static ngx_int_t -ngx_stream_variable_proxy_protocol_tlv(ngx_stream_session_t *s, - ngx_stream_variable_value_t *v, uintptr_t data) -{ - ngx_str_t *name = (ngx_str_t *) data; - - ngx_int_t rc; - ngx_str_t tlv, value; - - tlv.len = name->len - (sizeof("proxy_protocol_tlv_") - 1); - tlv.data = name->data + sizeof("proxy_protocol_tlv_") - 1; - - rc = ngx_proxy_protocol_get_tlv(s->connection, &tlv, &value); - - if (rc == NGX_ERROR) { - return NGX_ERROR; - } - - if (rc == NGX_DECLINED) { - v->not_found = 1; - return NGX_OK; - } - - v->len = value.len; - v->valid = 1; - v->no_cacheable = 0; - v->not_found = 0; - v->data = value.data; - - return NGX_OK; -} - - -static ngx_int_t -ngx_stream_variable_server_addr(ngx_stream_session_t *s, - ngx_stream_variable_value_t *v, uintptr_t data) -{ - ngx_str_t str; - u_char addr[NGX_SOCKADDR_STRLEN]; - - str.len = NGX_SOCKADDR_STRLEN; - str.data = addr; - - if (ngx_connection_local_sockaddr(s->connection, &str, 0) != NGX_OK) { - return NGX_ERROR; - } - - str.data = ngx_pnalloc(s->connection->pool, str.len); - if (str.data == NULL) { - return NGX_ERROR; - } - - ngx_memcpy(str.data, addr, str.len); - - v->len = str.len; - v->valid = 1; - v->no_cacheable = 0; - v->not_found = 0; - v->data = str.data; - - return NGX_OK; -} - - -static ngx_int_t -ngx_stream_variable_server_port(ngx_stream_session_t *s, - ngx_stream_variable_value_t *v, uintptr_t data) -{ - ngx_uint_t port; - - v->len = 0; - v->valid = 1; - v->no_cacheable = 0; - v->not_found = 0; - - if (ngx_connection_local_sockaddr(s->connection, NULL, 0) != NGX_OK) { - return NGX_ERROR; - } - - v->data = ngx_pnalloc(s->connection->pool, sizeof("65535") - 1); - if (v->data == NULL) { - return NGX_ERROR; - } - - port = ngx_inet_get_port(s->connection->local_sockaddr); - - if (port > 0 && port < 65536) { - v->len = ngx_sprintf(v->data, "%ui", port) - v->data; - } - - return NGX_OK; -} - - -static ngx_int_t -ngx_stream_variable_server_name(ngx_stream_session_t *s, - ngx_stream_variable_value_t *v, uintptr_t data) -{ - ngx_stream_core_srv_conf_t *cscf; - - cscf = ngx_stream_get_module_srv_conf(s, ngx_stream_core_module); - - v->len = cscf->server_name.len; - v->valid = 1; - v->no_cacheable = 0; - v->not_found = 0; - v->data = cscf->server_name.data; - - return NGX_OK; -} - - -static ngx_int_t -ngx_stream_variable_bytes(ngx_stream_session_t *s, - ngx_stream_variable_value_t *v, uintptr_t data) -{ - u_char *p; - - p = ngx_pnalloc(s->connection->pool, NGX_OFF_T_LEN); - if (p == NULL) { - return NGX_ERROR; - } - - if (data == 1) { - v->len = ngx_sprintf(p, "%O", s->received) - p; - - } else { - v->len = ngx_sprintf(p, "%O", s->connection->sent) - p; - } - - v->valid = 1; - v->no_cacheable = 0; - v->not_found = 0; - v->data = p; - - return NGX_OK; -} - - -static ngx_int_t -ngx_stream_variable_session_time(ngx_stream_session_t *s, - ngx_stream_variable_value_t *v, uintptr_t data) -{ - u_char *p; - ngx_time_t *tp; - ngx_msec_int_t ms; - - p = ngx_pnalloc(s->connection->pool, NGX_TIME_T_LEN + 4); - if (p == NULL) { - return NGX_ERROR; - } - - tp = ngx_timeofday(); - - ms = (ngx_msec_int_t) - ((tp->sec - s->start_sec) * 1000 + (tp->msec - s->start_msec)); - ms = ngx_max(ms, 0); - - v->len = ngx_sprintf(p, "%T.%03M", (time_t) ms / 1000, ms % 1000) - p; - v->valid = 1; - v->no_cacheable = 0; - v->not_found = 0; - v->data = p; - - return NGX_OK; -} - - -static ngx_int_t -ngx_stream_variable_status(ngx_stream_session_t *s, - ngx_stream_variable_value_t *v, uintptr_t data) -{ - v->data = ngx_pnalloc(s->connection->pool, NGX_INT_T_LEN); - if (v->data == NULL) { - return NGX_ERROR; - } - - v->len = ngx_sprintf(v->data, "%03ui", s->status) - v->data; - v->valid = 1; - v->no_cacheable = 0; - v->not_found = 0; - - return NGX_OK; -} - - -static ngx_int_t -ngx_stream_variable_connection(ngx_stream_session_t *s, - ngx_stream_variable_value_t *v, uintptr_t data) -{ - u_char *p; - - p = ngx_pnalloc(s->connection->pool, NGX_ATOMIC_T_LEN); - if (p == NULL) { - return NGX_ERROR; - } - - v->len = ngx_sprintf(p, "%uA", s->connection->number) - p; - v->valid = 1; - v->no_cacheable = 0; - v->not_found = 0; - v->data = p; - - return NGX_OK; -} - - -static ngx_int_t -ngx_stream_variable_nginx_version(ngx_stream_session_t *s, - ngx_stream_variable_value_t *v, uintptr_t data) -{ - v->len = sizeof(NGINX_VERSION) - 1; - v->valid = 1; - v->no_cacheable = 0; - v->not_found = 0; - v->data = (u_char *) NGINX_VERSION; - - return NGX_OK; -} - - -static ngx_int_t -ngx_stream_variable_hostname(ngx_stream_session_t *s, - ngx_stream_variable_value_t *v, uintptr_t data) -{ - v->len = ngx_cycle->hostname.len; - v->valid = 1; - v->no_cacheable = 0; - v->not_found = 0; - v->data = ngx_cycle->hostname.data; - - return NGX_OK; -} - - -static ngx_int_t -ngx_stream_variable_pid(ngx_stream_session_t *s, - ngx_stream_variable_value_t *v, uintptr_t data) -{ - u_char *p; - - p = ngx_pnalloc(s->connection->pool, NGX_INT64_LEN); - if (p == NULL) { - return NGX_ERROR; - } - - v->len = ngx_sprintf(p, "%P", ngx_pid) - p; - v->valid = 1; - v->no_cacheable = 0; - v->not_found = 0; - v->data = p; - - return NGX_OK; -} - - -static ngx_int_t -ngx_stream_variable_msec(ngx_stream_session_t *s, - ngx_stream_variable_value_t *v, uintptr_t data) -{ - u_char *p; - ngx_time_t *tp; - - p = ngx_pnalloc(s->connection->pool, NGX_TIME_T_LEN + 4); - if (p == NULL) { - return NGX_ERROR; - } - - tp = ngx_timeofday(); - - v->len = ngx_sprintf(p, "%T.%03M", tp->sec, tp->msec) - p; - v->valid = 1; - v->no_cacheable = 0; - v->not_found = 0; - v->data = p; - - return NGX_OK; -} - - -static ngx_int_t -ngx_stream_variable_time_iso8601(ngx_stream_session_t *s, - ngx_stream_variable_value_t *v, uintptr_t data) -{ - u_char *p; - - p = ngx_pnalloc(s->connection->pool, ngx_cached_http_log_iso8601.len); - if (p == NULL) { - return NGX_ERROR; - } - - ngx_memcpy(p, ngx_cached_http_log_iso8601.data, - ngx_cached_http_log_iso8601.len); - - v->len = ngx_cached_http_log_iso8601.len; - v->valid = 1; - v->no_cacheable = 0; - v->not_found = 0; - v->data = p; - - return NGX_OK; -} - - -static ngx_int_t -ngx_stream_variable_time_local(ngx_stream_session_t *s, - ngx_stream_variable_value_t *v, uintptr_t data) -{ - u_char *p; - - p = ngx_pnalloc(s->connection->pool, ngx_cached_http_log_time.len); - if (p == NULL) { - return NGX_ERROR; - } - - ngx_memcpy(p, ngx_cached_http_log_time.data, ngx_cached_http_log_time.len); - - v->len = ngx_cached_http_log_time.len; - v->valid = 1; - v->no_cacheable = 0; - v->not_found = 0; - v->data = p; - - return NGX_OK; -} - - -static ngx_int_t -ngx_stream_variable_protocol(ngx_stream_session_t *s, - ngx_stream_variable_value_t *v, uintptr_t data) -{ - v->len = 3; - v->valid = 1; - v->no_cacheable = 0; - v->not_found = 0; - v->data = (u_char *) (s->connection->type == SOCK_DGRAM ? "UDP" : "TCP"); - - return NGX_OK; -} - - -void * -ngx_stream_map_find(ngx_stream_session_t *s, ngx_stream_map_t *map, - ngx_str_t *match) -{ - void *value; - u_char *low; - size_t len; - ngx_uint_t key; - - len = match->len; - - if (len) { - low = ngx_pnalloc(s->connection->pool, len); - if (low == NULL) { - return NULL; - } - - } else { - low = NULL; - } - - key = ngx_hash_strlow(low, match->data, len); - - value = ngx_hash_find_combined(&map->hash, key, low, len); - if (value) { - return value; - } - -#if (NGX_PCRE) - - if (len && map->nregex) { - ngx_int_t n; - ngx_uint_t i; - ngx_stream_map_regex_t *reg; - - reg = map->regex; - - for (i = 0; i < map->nregex; i++) { - - n = ngx_stream_regex_exec(s, reg[i].regex, match); - - if (n == NGX_OK) { - return reg[i].value; - } - - if (n == NGX_DECLINED) { - continue; - } - - /* NGX_ERROR */ - - return NULL; - } - } - -#endif - - return NULL; -} - - -#if (NGX_PCRE) - -static ngx_int_t -ngx_stream_variable_not_found(ngx_stream_session_t *s, - ngx_stream_variable_value_t *v, uintptr_t data) -{ - v->not_found = 1; - return NGX_OK; -} - - -ngx_stream_regex_t * -ngx_stream_regex_compile(ngx_conf_t *cf, ngx_regex_compile_t *rc) -{ - u_char *p; - size_t size; - ngx_str_t name; - ngx_uint_t i, n; - ngx_stream_variable_t *v; - ngx_stream_regex_t *re; - ngx_stream_regex_variable_t *rv; - ngx_stream_core_main_conf_t *cmcf; - - rc->pool = cf->pool; - - if (ngx_regex_compile(rc) != NGX_OK) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, "%V", &rc->err); - return NULL; - } - - re = ngx_pcalloc(cf->pool, sizeof(ngx_stream_regex_t)); - if (re == NULL) { - return NULL; - } - - re->regex = rc->regex; - re->ncaptures = rc->captures; - re->name = rc->pattern; - - cmcf = ngx_stream_conf_get_module_main_conf(cf, ngx_stream_core_module); - cmcf->ncaptures = ngx_max(cmcf->ncaptures, re->ncaptures); - - n = (ngx_uint_t) rc->named_captures; - - if (n == 0) { - return re; - } - - rv = ngx_palloc(rc->pool, n * sizeof(ngx_stream_regex_variable_t)); - if (rv == NULL) { - return NULL; - } - - re->variables = rv; - re->nvariables = n; - - size = rc->name_size; - p = rc->names; - - for (i = 0; i < n; i++) { - rv[i].capture = 2 * ((p[0] << 8) + p[1]); - - name.data = &p[2]; - name.len = ngx_strlen(name.data); - - v = ngx_stream_add_variable(cf, &name, NGX_STREAM_VAR_CHANGEABLE); - if (v == NULL) { - return NULL; - } - - rv[i].index = ngx_stream_get_variable_index(cf, &name); - if (rv[i].index == NGX_ERROR) { - return NULL; - } - - v->get_handler = ngx_stream_variable_not_found; - - p += size; - } - - return re; -} - - -ngx_int_t -ngx_stream_regex_exec(ngx_stream_session_t *s, ngx_stream_regex_t *re, - ngx_str_t *str) -{ - ngx_int_t rc, index; - ngx_uint_t i, n, len; - ngx_stream_variable_value_t *vv; - ngx_stream_core_main_conf_t *cmcf; - - cmcf = ngx_stream_get_module_main_conf(s, ngx_stream_core_module); - - if (re->ncaptures) { - len = cmcf->ncaptures; - - if (s->captures == NULL) { - s->captures = ngx_palloc(s->connection->pool, len * sizeof(int)); - if (s->captures == NULL) { - return NGX_ERROR; - } - } - - } else { - len = 0; - } - - rc = ngx_regex_exec(re->regex, str, s->captures, len); - - if (rc == NGX_REGEX_NO_MATCHED) { - return NGX_DECLINED; - } - - if (rc < 0) { - ngx_log_error(NGX_LOG_ALERT, s->connection->log, 0, - ngx_regex_exec_n " failed: %i on \"%V\" using \"%V\"", - rc, str, &re->name); - return NGX_ERROR; - } - - for (i = 0; i < re->nvariables; i++) { - - n = re->variables[i].capture; - index = re->variables[i].index; - vv = &s->variables[index]; - - vv->len = s->captures[n + 1] - s->captures[n]; - vv->valid = 1; - vv->no_cacheable = 0; - vv->not_found = 0; - vv->data = &str->data[s->captures[n]]; - -#if (NGX_DEBUG) - { - ngx_stream_variable_t *v; - - v = cmcf->variables.elts; - - ngx_log_debug2(NGX_LOG_DEBUG_STREAM, s->connection->log, 0, - "stream regex set $%V to \"%v\"", &v[index].name, vv); - } -#endif - } - - s->ncaptures = rc * 2; - s->captures_data = str->data; - - return NGX_OK; -} - -#endif - - -ngx_int_t -ngx_stream_variables_add_core_vars(ngx_conf_t *cf) -{ - ngx_stream_variable_t *cv, *v; - ngx_stream_core_main_conf_t *cmcf; - - cmcf = ngx_stream_conf_get_module_main_conf(cf, ngx_stream_core_module); - - cmcf->variables_keys = ngx_pcalloc(cf->temp_pool, - sizeof(ngx_hash_keys_arrays_t)); - if (cmcf->variables_keys == NULL) { - return NGX_ERROR; - } - - cmcf->variables_keys->pool = cf->pool; - cmcf->variables_keys->temp_pool = cf->pool; - - if (ngx_hash_keys_array_init(cmcf->variables_keys, NGX_HASH_SMALL) - != NGX_OK) - { - return NGX_ERROR; - } - - if (ngx_array_init(&cmcf->prefix_variables, cf->pool, 8, - sizeof(ngx_stream_variable_t)) - != NGX_OK) - { - return NGX_ERROR; - } - - for (cv = ngx_stream_core_variables; cv->name.len; cv++) { - v = ngx_stream_add_variable(cf, &cv->name, cv->flags); - if (v == NULL) { - return NGX_ERROR; - } - - *v = *cv; - } - - return NGX_OK; -} - - -ngx_int_t -ngx_stream_variables_init_vars(ngx_conf_t *cf) -{ - size_t len; - ngx_uint_t i, n; - ngx_hash_key_t *key; - ngx_hash_init_t hash; - ngx_stream_variable_t *v, *av, *pv; - ngx_stream_core_main_conf_t *cmcf; - - /* set the handlers for the indexed stream variables */ - - cmcf = ngx_stream_conf_get_module_main_conf(cf, ngx_stream_core_module); - - v = cmcf->variables.elts; - pv = cmcf->prefix_variables.elts; - key = cmcf->variables_keys->keys.elts; - - for (i = 0; i < cmcf->variables.nelts; i++) { - - for (n = 0; n < cmcf->variables_keys->keys.nelts; n++) { - - av = key[n].value; - - if (v[i].name.len == key[n].key.len - && ngx_strncmp(v[i].name.data, key[n].key.data, v[i].name.len) - == 0) - { - v[i].get_handler = av->get_handler; - v[i].data = av->data; - - av->flags |= NGX_STREAM_VAR_INDEXED; - v[i].flags = av->flags; - - av->index = i; - - if (av->get_handler == NULL - || (av->flags & NGX_STREAM_VAR_WEAK)) - { - break; - } - - goto next; - } - } - - len = 0; - av = NULL; - - for (n = 0; n < cmcf->prefix_variables.nelts; n++) { - if (v[i].name.len >= pv[n].name.len && v[i].name.len > len - && ngx_strncmp(v[i].name.data, pv[n].name.data, pv[n].name.len) - == 0) - { - av = &pv[n]; - len = pv[n].name.len; - } - } - - if (av) { - v[i].get_handler = av->get_handler; - v[i].data = (uintptr_t) &v[i].name; - v[i].flags = av->flags; - - goto next; - } - - if (v[i].get_handler == NULL) { - ngx_log_error(NGX_LOG_EMERG, cf->log, 0, - "unknown \"%V\" variable", &v[i].name); - return NGX_ERROR; - } - - next: - continue; - } - - - for (n = 0; n < cmcf->variables_keys->keys.nelts; n++) { - av = key[n].value; - - if (av->flags & NGX_STREAM_VAR_NOHASH) { - key[n].key.data = NULL; - } - } - - - hash.hash = &cmcf->variables_hash; - hash.key = ngx_hash_key; - hash.max_size = cmcf->variables_hash_max_size; - hash.bucket_size = cmcf->variables_hash_bucket_size; - hash.name = "variables_hash"; - hash.pool = cf->pool; - hash.temp_pool = NULL; - - if (ngx_hash_init(&hash, cmcf->variables_keys->keys.elts, - cmcf->variables_keys->keys.nelts) - != NGX_OK) - { - return NGX_ERROR; - } - - cmcf->variables_keys = NULL; - - return NGX_OK; -} diff --git a/src/deps/src/nginx-1.30.3/src/stream/ngx_stream_variables.h b/src/deps/src/nginx-1.30.3/src/stream/ngx_stream_variables.h deleted file mode 100644 index 4ead2a6240..0000000000 --- a/src/deps/src/nginx-1.30.3/src/stream/ngx_stream_variables.h +++ /dev/null @@ -1,113 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#ifndef _NGX_STREAM_VARIABLES_H_INCLUDED_ -#define _NGX_STREAM_VARIABLES_H_INCLUDED_ - - -#include -#include -#include - - -typedef ngx_variable_value_t ngx_stream_variable_value_t; - -#define ngx_stream_variable(v) { sizeof(v) - 1, 1, 0, 0, 0, (u_char *) v } - -typedef struct ngx_stream_variable_s ngx_stream_variable_t; - -typedef void (*ngx_stream_set_variable_pt) (ngx_stream_session_t *s, - ngx_stream_variable_value_t *v, uintptr_t data); -typedef ngx_int_t (*ngx_stream_get_variable_pt) (ngx_stream_session_t *s, - ngx_stream_variable_value_t *v, uintptr_t data); - - -#define NGX_STREAM_VAR_CHANGEABLE 1 -#define NGX_STREAM_VAR_NOCACHEABLE 2 -#define NGX_STREAM_VAR_INDEXED 4 -#define NGX_STREAM_VAR_NOHASH 8 -#define NGX_STREAM_VAR_WEAK 16 -#define NGX_STREAM_VAR_PREFIX 32 - - -struct ngx_stream_variable_s { - ngx_str_t name; /* must be first to build the hash */ - ngx_stream_set_variable_pt set_handler; - ngx_stream_get_variable_pt get_handler; - uintptr_t data; - ngx_uint_t flags; - ngx_uint_t index; -}; - -#define ngx_stream_null_variable { ngx_null_string, NULL, NULL, 0, 0, 0 } - - -ngx_stream_variable_t *ngx_stream_add_variable(ngx_conf_t *cf, ngx_str_t *name, - ngx_uint_t flags); -ngx_int_t ngx_stream_get_variable_index(ngx_conf_t *cf, ngx_str_t *name); -ngx_stream_variable_value_t *ngx_stream_get_indexed_variable( - ngx_stream_session_t *s, ngx_uint_t index); -ngx_stream_variable_value_t *ngx_stream_get_flushed_variable( - ngx_stream_session_t *s, ngx_uint_t index); - -ngx_stream_variable_value_t *ngx_stream_get_variable(ngx_stream_session_t *s, - ngx_str_t *name, ngx_uint_t key); - - -#if (NGX_PCRE) - -typedef struct { - ngx_uint_t capture; - ngx_int_t index; -} ngx_stream_regex_variable_t; - - -typedef struct { - ngx_regex_t *regex; - ngx_uint_t ncaptures; - ngx_stream_regex_variable_t *variables; - ngx_uint_t nvariables; - ngx_str_t name; -} ngx_stream_regex_t; - - -typedef struct { - ngx_stream_regex_t *regex; - void *value; -} ngx_stream_map_regex_t; - - -ngx_stream_regex_t *ngx_stream_regex_compile(ngx_conf_t *cf, - ngx_regex_compile_t *rc); -ngx_int_t ngx_stream_regex_exec(ngx_stream_session_t *s, ngx_stream_regex_t *re, - ngx_str_t *str); - -#endif - - -typedef struct { - ngx_hash_combined_t hash; -#if (NGX_PCRE) - ngx_stream_map_regex_t *regex; - ngx_uint_t nregex; -#endif -} ngx_stream_map_t; - - -void *ngx_stream_map_find(ngx_stream_session_t *s, ngx_stream_map_t *map, - ngx_str_t *match); - - -ngx_int_t ngx_stream_variables_add_core_vars(ngx_conf_t *cf); -ngx_int_t ngx_stream_variables_init_vars(ngx_conf_t *cf); - - -extern ngx_stream_variable_value_t ngx_stream_variable_null_value; -extern ngx_stream_variable_value_t ngx_stream_variable_true_value; - - -#endif /* _NGX_STREAM_VARIABLES_H_INCLUDED_ */ diff --git a/src/deps/src/nginx-1.30.3/src/stream/ngx_stream_write_filter_module.c b/src/deps/src/nginx-1.30.3/src/stream/ngx_stream_write_filter_module.c deleted file mode 100644 index 07dc7b52e3..0000000000 --- a/src/deps/src/nginx-1.30.3/src/stream/ngx_stream_write_filter_module.c +++ /dev/null @@ -1,306 +0,0 @@ - -/* - * Copyright (C) Igor Sysoev - * Copyright (C) Nginx, Inc. - */ - - -#include -#include -#include - - -typedef struct { - ngx_chain_t *from_upstream; - ngx_chain_t *from_downstream; -} ngx_stream_write_filter_ctx_t; - - -static ngx_int_t ngx_stream_write_filter(ngx_stream_session_t *s, - ngx_chain_t *in, ngx_uint_t from_upstream); -static ngx_int_t ngx_stream_write_filter_init(ngx_conf_t *cf); - - -static ngx_stream_module_t ngx_stream_write_filter_module_ctx = { - NULL, /* preconfiguration */ - ngx_stream_write_filter_init, /* postconfiguration */ - - NULL, /* create main configuration */ - NULL, /* init main configuration */ - - NULL, /* create server configuration */ - NULL /* merge server configuration */ -}; - - -ngx_module_t ngx_stream_write_filter_module = { - NGX_MODULE_V1, - &ngx_stream_write_filter_module_ctx, /* module context */ - NULL, /* module directives */ - NGX_STREAM_MODULE, /* module type */ - NULL, /* init master */ - NULL, /* init module */ - NULL, /* init process */ - NULL, /* init thread */ - NULL, /* exit thread */ - NULL, /* exit process */ - NULL, /* exit master */ - NGX_MODULE_V1_PADDING -}; - - -static ngx_int_t -ngx_stream_write_filter(ngx_stream_session_t *s, ngx_chain_t *in, - ngx_uint_t from_upstream) -{ - off_t size; - ngx_uint_t last, flush, sync; - ngx_chain_t *cl, *ln, **ll, **out, *chain; - ngx_connection_t *c; - ngx_stream_write_filter_ctx_t *ctx; - - ctx = ngx_stream_get_module_ctx(s, ngx_stream_write_filter_module); - - if (ctx == NULL) { - ctx = ngx_pcalloc(s->connection->pool, - sizeof(ngx_stream_write_filter_ctx_t)); - if (ctx == NULL) { - return NGX_ERROR; - } - - ngx_stream_set_ctx(s, ctx, ngx_stream_write_filter_module); - } - - if (from_upstream) { - c = s->connection; - out = &ctx->from_upstream; - - } else { - c = s->upstream->peer.connection; - out = &ctx->from_downstream; - } - - if (c->error) { - return NGX_ERROR; - } - - size = 0; - flush = 0; - sync = 0; - last = 0; - ll = out; - - /* find the size, the flush point and the last link of the saved chain */ - - for (cl = *out; cl; cl = cl->next) { - ll = &cl->next; - - ngx_log_debug7(NGX_LOG_DEBUG_EVENT, c->log, 0, - "write old buf t:%d f:%d %p, pos %p, size: %z " - "file: %O, size: %O", - cl->buf->temporary, cl->buf->in_file, - cl->buf->start, cl->buf->pos, - cl->buf->last - cl->buf->pos, - cl->buf->file_pos, - cl->buf->file_last - cl->buf->file_pos); - - if (ngx_buf_size(cl->buf) == 0 && !ngx_buf_special(cl->buf)) { - ngx_log_error(NGX_LOG_ALERT, c->log, 0, - "zero size buf in writer " - "t:%d r:%d f:%d %p %p-%p %p %O-%O", - cl->buf->temporary, - cl->buf->recycled, - cl->buf->in_file, - cl->buf->start, - cl->buf->pos, - cl->buf->last, - cl->buf->file, - cl->buf->file_pos, - cl->buf->file_last); - - ngx_debug_point(); - return NGX_ERROR; - } - - if (ngx_buf_size(cl->buf) < 0) { - ngx_log_error(NGX_LOG_ALERT, c->log, 0, - "negative size buf in writer " - "t:%d r:%d f:%d %p %p-%p %p %O-%O", - cl->buf->temporary, - cl->buf->recycled, - cl->buf->in_file, - cl->buf->start, - cl->buf->pos, - cl->buf->last, - cl->buf->file, - cl->buf->file_pos, - cl->buf->file_last); - - ngx_debug_point(); - return NGX_ERROR; - } - - size += ngx_buf_size(cl->buf); - - if (cl->buf->flush || cl->buf->recycled) { - flush = 1; - } - - if (cl->buf->sync) { - sync = 1; - } - - if (cl->buf->last_buf) { - last = 1; - } - } - - /* add the new chain to the existent one */ - - for (ln = in; ln; ln = ln->next) { - cl = ngx_alloc_chain_link(c->pool); - if (cl == NULL) { - return NGX_ERROR; - } - - cl->buf = ln->buf; - *ll = cl; - ll = &cl->next; - - ngx_log_debug7(NGX_LOG_DEBUG_EVENT, c->log, 0, - "write new buf t:%d f:%d %p, pos %p, size: %z " - "file: %O, size: %O", - cl->buf->temporary, cl->buf->in_file, - cl->buf->start, cl->buf->pos, - cl->buf->last - cl->buf->pos, - cl->buf->file_pos, - cl->buf->file_last - cl->buf->file_pos); - - if (ngx_buf_size(cl->buf) == 0 && !ngx_buf_special(cl->buf)) { - ngx_log_error(NGX_LOG_ALERT, c->log, 0, - "zero size buf in writer " - "t:%d r:%d f:%d %p %p-%p %p %O-%O", - cl->buf->temporary, - cl->buf->recycled, - cl->buf->in_file, - cl->buf->start, - cl->buf->pos, - cl->buf->last, - cl->buf->file, - cl->buf->file_pos, - cl->buf->file_last); - - ngx_debug_point(); - return NGX_ERROR; - } - - if (ngx_buf_size(cl->buf) < 0) { - ngx_log_error(NGX_LOG_ALERT, c->log, 0, - "negative size buf in writer " - "t:%d r:%d f:%d %p %p-%p %p %O-%O", - cl->buf->temporary, - cl->buf->recycled, - cl->buf->in_file, - cl->buf->start, - cl->buf->pos, - cl->buf->last, - cl->buf->file, - cl->buf->file_pos, - cl->buf->file_last); - - ngx_debug_point(); - return NGX_ERROR; - } - - size += ngx_buf_size(cl->buf); - - if (cl->buf->flush || cl->buf->recycled) { - flush = 1; - } - - if (cl->buf->sync) { - sync = 1; - } - - if (cl->buf->last_buf) { - last = 1; - } - } - - *ll = NULL; - - ngx_log_debug3(NGX_LOG_DEBUG_STREAM, c->log, 0, - "stream write filter: l:%ui f:%ui s:%O", last, flush, size); - - if (size == 0 - && !(c->buffered & NGX_LOWLEVEL_BUFFERED) - && !(last && c->need_last_buf) - && !(flush && c->need_flush_buf)) - { - if (last || flush || sync) { - for (cl = *out; cl; /* void */) { - ln = cl; - cl = cl->next; - ngx_free_chain(c->pool, ln); - } - - *out = NULL; - c->buffered &= ~NGX_STREAM_WRITE_BUFFERED; - - return NGX_OK; - } - - ngx_log_error(NGX_LOG_ALERT, c->log, 0, - "the stream output chain is empty"); - - ngx_debug_point(); - - return NGX_ERROR; - } - - chain = c->send_chain(c, *out, 0); - - ngx_log_debug1(NGX_LOG_DEBUG_STREAM, c->log, 0, - "stream write filter %p", chain); - - if (chain == NGX_CHAIN_ERROR) { - c->error = 1; - return NGX_ERROR; - } - - for (cl = *out; cl && cl != chain; /* void */) { - ln = cl; - cl = cl->next; - ngx_free_chain(c->pool, ln); - } - - *out = chain; - - if (chain) { - if (c->shared) { - ngx_log_error(NGX_LOG_ALERT, c->log, 0, - "shared connection is busy"); - return NGX_ERROR; - } - - c->buffered |= NGX_STREAM_WRITE_BUFFERED; - return NGX_AGAIN; - } - - c->buffered &= ~NGX_STREAM_WRITE_BUFFERED; - - if (c->buffered & NGX_LOWLEVEL_BUFFERED) { - return NGX_AGAIN; - } - - return NGX_OK; -} - - -static ngx_int_t -ngx_stream_write_filter_init(ngx_conf_t *cf) -{ - ngx_stream_top_filter = ngx_stream_write_filter; - - return NGX_OK; -} diff --git a/src/linux/Dockerfile-fedora-43 b/src/linux/Dockerfile-fedora-43 index 947483d5bc..394ae56ccc 100644 --- a/src/linux/Dockerfile-fedora-43 +++ b/src/linux/Dockerfile-fedora-43 @@ -2,7 +2,7 @@ FROM fedora:43@sha256:762d73ba1c455232b0272c5d445a34f36c4b9f421cbc05ce8102552325 ENV OS=fedora ENV OS_VERSION=43 -ENV NGINX_VERSION=1.30.3 +ENV NGINX_VERSION=1.30.4 # Install Nginx, fpm and dependencies RUN dnf update -y && \ diff --git a/src/linux/Dockerfile-fedora-44 b/src/linux/Dockerfile-fedora-44 index 698fa78035..80dd860c09 100644 --- a/src/linux/Dockerfile-fedora-44 +++ b/src/linux/Dockerfile-fedora-44 @@ -2,7 +2,7 @@ FROM fedora:44@sha256:6c75d5bf57cb0fa5aa4b92c6a83c86c791644496d9ac230de7711f5b8e ENV OS=fedora ENV OS_VERSION=44 -ENV NGINX_VERSION=1.30.3 +ENV NGINX_VERSION=1.30.4 # Install Nginx, fpm and dependencies RUN dnf update -y && \ diff --git a/src/linux/fpm-fedora-43 b/src/linux/fpm-fedora-43 index 6ed67a1a40..c14b81b16f 100644 --- a/src/linux/fpm-fedora-43 +++ b/src/linux/fpm-fedora-43 @@ -3,7 +3,7 @@ --license agpl3 --version %VERSION% --architecture %ARCH% ---depends bash --depends 'nginx = 2:1.30.3' --depends 'nginx-mod-stream = 2:1.30.3' --depends python3.12 --depends libcurl-devel --depends libxml2 --depends yajl --depends lmdb-libs --depends geoip-devel --depends gd --depends sudo --depends procps --depends lsof --depends pcre2 --depends libpq --depends libcap --depends openssl --depends logrotate --depends mysql --depends postgresql --depends sqlite3 --depends unzip --depends tar --depends ssdeep-libs --depends curl +--depends bash --depends 'nginx = 2:1.30.4' --depends 'nginx-mod-stream = 2:1.30.4' --depends python3.12 --depends libcurl-devel --depends libxml2 --depends yajl --depends lmdb-libs --depends geoip-devel --depends gd --depends sudo --depends procps --depends lsof --depends pcre2 --depends libpq --depends libcap --depends openssl --depends logrotate --depends mysql --depends postgresql --depends sqlite3 --depends unzip --depends tar --depends ssdeep-libs --depends curl --description "BunkerWeb %VERSION% for Fedora 43" --url "https://www.bunkerweb.io" --maintainer "Bunkerity " diff --git a/src/linux/fpm-fedora-44 b/src/linux/fpm-fedora-44 index 104aa80f56..0d3d9c4d17 100644 --- a/src/linux/fpm-fedora-44 +++ b/src/linux/fpm-fedora-44 @@ -3,7 +3,7 @@ --license agpl3 --version %VERSION% --architecture %ARCH% ---depends bash --depends 'nginx = 2:1.30.3' --depends 'nginx-mod-stream = 2:1.30.3' --depends python3.12 --depends libcurl-devel --depends libxml2 --depends yajl --depends lmdb-libs --depends geoip-devel --depends gd --depends sudo --depends procps --depends lsof --depends pcre2 --depends libpq --depends libcap --depends openssl --depends logrotate --depends mysql --depends postgresql --depends sqlite3 --depends unzip --depends tar --depends ssdeep-libs --depends curl +--depends bash --depends 'nginx = 2:1.30.4' --depends 'nginx-mod-stream = 2:1.30.4' --depends python3.12 --depends libcurl-devel --depends libxml2 --depends yajl --depends lmdb-libs --depends geoip-devel --depends gd --depends sudo --depends procps --depends lsof --depends pcre2 --depends libpq --depends libcap --depends openssl --depends logrotate --depends mysql --depends postgresql --depends sqlite3 --depends unzip --depends tar --depends ssdeep-libs --depends curl --description "BunkerWeb %VERSION% for Fedora 44" --url "https://www.bunkerweb.io" --maintainer "Bunkerity " diff --git a/tests/linux/Dockerfile-fedora-43 b/tests/linux/Dockerfile-fedora-43 index d74269523a..e567bec4ef 100644 --- a/tests/linux/Dockerfile-fedora-43 +++ b/tests/linux/Dockerfile-fedora-43 @@ -1,7 +1,7 @@ FROM fedora:43@sha256:762d73ba1c455232b0272c5d445a34f36c4b9f421cbc05ce8102552325b6a222 ENV container=docker -ENV NGINX_VERSION=1.30.3 +ENV NGINX_VERSION=1.30.4 RUN dnf -y update \ && dnf -y install systemd \ diff --git a/tests/linux/Dockerfile-fedora-44 b/tests/linux/Dockerfile-fedora-44 index 17e54f0f26..e151176d99 100644 --- a/tests/linux/Dockerfile-fedora-44 +++ b/tests/linux/Dockerfile-fedora-44 @@ -1,7 +1,7 @@ FROM fedora:44@sha256:6c75d5bf57cb0fa5aa4b92c6a83c86c791644496d9ac230de7711f5b8ec3b898 ENV container=docker -ENV NGINX_VERSION=1.30.3 +ENV NGINX_VERSION=1.30.4 RUN dnf -y update \ && dnf -y install systemd \ From 306e6eebe30b8419ed44bbae231cad70d5152788 Mon Sep 17 00:00:00 2001 From: TheophileDiot Date: Thu, 23 Jul 2026 09:33:53 +0200 Subject: [PATCH 03/25] build(linux): remove FreeBSD packaging FreeBSD is now served by the official www/bunkerweb port, which builds from the source tarball with its own rc.d scripts and patches and uses none of this machinery. The in-repo lane was never wired into CI, its packages were never published, and its dep-build script no longer matched the pinned nginx sources. --- BUILD.md | 61 +-- src/deps/install-freebsd.sh | 320 -------------- src/deps/misc/lua.patch1 | 9 - src/deps/misc/lua.patch2 | 35 -- src/linux/build-freebsd.sh | 494 ---------------------- src/linux/bunkerweb.newsyslog.conf | 16 - src/linux/fpm-freebsd | 13 - src/linux/fpm.sh | 6 - src/linux/package.sh | 8 - src/linux/rc.d/bunkerweb | 74 ---- src/linux/rc.d/bunkerweb_api | 74 ---- src/linux/rc.d/bunkerweb_scheduler | 74 ---- src/linux/rc.d/bunkerweb_ui | 74 ---- src/linux/scripts/afterRemoveDEB.sh | 10 - src/linux/scripts/afterRemoveFreeBSD.sh | 175 -------- src/linux/scripts/afterRemoveRPM.sh | 10 - src/linux/scripts/beforeInstallFreeBSD.sh | 40 -- src/linux/scripts/postinstall-freebsd.sh | 434 ------------------- src/linux/scripts/postinstall.sh | 10 - 19 files changed, 2 insertions(+), 1935 deletions(-) delete mode 100644 src/deps/install-freebsd.sh delete mode 100644 src/deps/misc/lua.patch1 delete mode 100644 src/deps/misc/lua.patch2 delete mode 100755 src/linux/build-freebsd.sh delete mode 100644 src/linux/bunkerweb.newsyslog.conf delete mode 100644 src/linux/fpm-freebsd delete mode 100644 src/linux/rc.d/bunkerweb delete mode 100644 src/linux/rc.d/bunkerweb_api delete mode 100644 src/linux/rc.d/bunkerweb_scheduler delete mode 100644 src/linux/rc.d/bunkerweb_ui delete mode 100644 src/linux/scripts/afterRemoveFreeBSD.sh delete mode 100644 src/linux/scripts/beforeInstallFreeBSD.sh delete mode 100644 src/linux/scripts/postinstall-freebsd.sh diff --git a/BUILD.md b/BUILD.md index 13f35bd523..537c175ad8 100644 --- a/BUILD.md +++ b/BUILD.md @@ -8,10 +8,11 @@ This document covers: - Community container images (`bunkerweb`, `scheduler`, `autoconf`, `ui`, `api`, `all-in-one`) - Linux packages (`.deb`, `.rpm`) -- FreeBSD package (`.pkg`) All commands are expected to be run from the repository root. +FreeBSD users: BunkerWeb is available as an official port, see . + ## Build Standards - Build from a clean, up-to-date working tree. @@ -23,8 +24,6 @@ All commands are expected to be run from the repository root. - For containers and Linux packages: - Docker (Buildx recommended) -- For FreeBSD package: - - A native FreeBSD 14 host or VM ## Artifact Matrix @@ -32,7 +31,6 @@ All commands are expected to be run from the repository root. | ---------------------------- | ------------------------------------------------- | ----------------------------------------- | | Community container images | `src/*/Dockerfile` | `docker build -f -t .` | | Linux packages (`deb`/`rpm`) | `src/linux/Dockerfile-*` + `src/linux/package.sh` | `./src/linux/package.sh ` | -| FreeBSD package (`pkg`) | `src/linux/build-freebsd.sh` | `bash src/linux/build-freebsd.sh` | ## Build Community Container Images @@ -199,65 +197,10 @@ Notes: - For RPM, use Linux arch naming (`x86_64`, `aarch64`, ...). - For DEB, use Debian arch naming (`amd64`, `arm64`, ...). - `curl` is a runtime requirement for scheduler ACME integrations (notably ZeroSSL/EAB flows). -- `package.sh` intentionally does not build FreeBSD packages in Docker. - Dockerfiles for Linux package builders are preconfigured with their package type: - Debian/Ubuntu Dockerfiles run `fpm.sh deb` - Fedora/RHEL Dockerfiles run `fpm.sh rpm` -## Build FreeBSD Package (`.pkg`) - -FreeBSD packages must be built on FreeBSD. - -### Preflight requirements - -- Use a native FreeBSD 14 host/VM. -- Run the build as `root` (or with equivalent privileges), because the build script installs packages and stages files under system paths. -- Ensure dependency sources are initialized: - -```sh -bash src/deps/init_deps.sh -``` - -- Install build prerequisites: - -```sh -pkg bootstrap -f -pkg update -f -pkg install -y bash git wget curl gtar pigz gmake pkgconf autoconf automake libtool \ - rust ruby rubygem-fpm nginx sudo lsof unzip openssl sqlite3 pcre2 lmdb ssdeep \ - libxml2 yajl libgd libmaxminddb libffi python311 py311-pip py311-setuptools \ - py311-wheel py311-sqlite3 postgresql18-client -``` - -**Security Note**: The final package has **zero runtime dependencies on compiler toolchains**. Only security-relevant libraries (TLS, XML parsing, GeoIP, etc.) are required at runtime, meeting security requirements for production firewall appliances. - -### Quick build (recommended) - -```sh -bash src/linux/build-freebsd.sh -``` - -Output: - -- `bunkerweb-.pkg` (or `bunkerweb-dev.pkg`, depending on `src/VERSION`) in the repository root - -### Installing the package - -Before installing the BunkerWeb package on a production system, ensure runtime dependencies are installed: - -```sh -pkg install -y bash nginx python311 py311-sqlite3 curl libxml2 yajl libgd \ - sudo lsof libmaxminddb libffi openssl sqlite3 unzip pcre2 lmdb ssdeep -``` - -**Note**: No compiler packages (gcc, clang, etc.) are required at runtime. - -Then install BunkerWeb: - -```sh -pkg install -y ./bunkerweb-.pkg -``` - ## CI Parity (Reference) If you want local builds to match CI behavior, use these workflow references: diff --git a/src/deps/install-freebsd.sh b/src/deps/install-freebsd.sh deleted file mode 100644 index a54be6f15e..0000000000 --- a/src/deps/install-freebsd.sh +++ /dev/null @@ -1,320 +0,0 @@ -#!/usr/local/bin/bash - -function do_and_check_cmd() { - if [ "$CHANGE_DIR" != "" ] ; then - cd "$CHANGE_DIR" || return 1 - fi - output=$("$@" 2>&1) - ret="$?" - if [ $ret -ne 0 ] ; then - echo "❌ Error from command : $*" - echo "$output" - exit $ret - fi -} - -if [ -n "${NTASK:-}" ]; then - : -elif command -v nproc >/dev/null 2>&1; then - NTASK="$(nproc)" -elif command -v sysctl >/dev/null 2>&1; then - NTASK="$(sysctl -n hw.ncpu 2>/dev/null || echo 1)" -else - NTASK=1 -fi - -case "$NTASK" in - ''|*[!0-9]*|0) NTASK=1 ;; -esac - -# Detect a working C/C++ toolchain (base-system Clang or fallback). -if command -v gcc >/dev/null 2>&1; then - BUILD_CC="$(command -v gcc)" - BUILD_CXX="$(command -v g++ 2>/dev/null || true)" -elif command -v cc >/dev/null 2>&1; then - BUILD_CC="$(command -v cc)" - BUILD_CXX="$(command -v c++ 2>/dev/null || true)" -fi - -if [ -z "$BUILD_CC" ]; then - echo "❌ Error: no C compiler found" - exit 1 -fi - -if [ -z "$BUILD_CXX" ]; then - BUILD_CXX="$BUILD_CC" -fi - -export CC="${CC:-$BUILD_CC}" -export CXX="${CXX:-$BUILD_CXX}" - -# Some upstream Makefiles hardcode `gcc`/`g++` instead of honoring CC/CXX. -# Provide temporary wrappers so builds use the detected toolchain. -COMPAT_BIN_DIR="/tmp/bunkerweb/toolchain/bin" -mkdir -p "$COMPAT_BIN_DIR" - -if ! command -v gcc >/dev/null 2>&1; then - ln -sf "$CC" "$COMPAT_BIN_DIR/gcc" -fi - -if ! command -v g++ >/dev/null 2>&1; then - ln -sf "$CXX" "$COMPAT_BIN_DIR/g++" -fi - -export PATH="$COMPAT_BIN_DIR:$PATH" - -# Compiling and installing lua -echo "ℹ️ Compiling and installing lua-5.1.5" -export CHANGE_DIR="/tmp/bunkerweb/deps/src/lua-5.1.5" -# Use the 'bsd' platform target instead of 'freebsd': both set the same -# MYCFLAGS="-DLUA_USE_POSIX -DLUA_USE_DLOPEN" but 'freebsd' hard-codes -# MYLIBS="-Wl,-E -lreadline" which requires readline to be installed. -# 'bsd' omits readline (MYLIBS="-Wl,-E"), which is correct for a -# non-interactive WAF environment. -do_and_check_cmd gmake "CC=$CC" "CFLAGS=-O2 -Wall -fPIC -DLUA_USE_DLOPEN" "LFLAGS=-Wl,-rpath,/usr/share/bunkerweb/deps/lib" -j "$NTASK" bsd -do_and_check_cmd gmake INSTALL_TOP=/usr/share/bunkerweb/deps install - -# Compiling and installing libmaxminddb -echo "ℹ️ Compiling and installing libmaxminddb" -# TODO : temp fix run it twice... -chmod +x /tmp/bunkerweb/deps/src/libmaxminddb/bootstrap -cd /tmp/bunkerweb/deps/src/libmaxminddb && ./bootstrap > /dev/null 2>&1 -export CHANGE_DIR="/tmp/bunkerweb/deps/src/libmaxminddb" -do_and_check_cmd ./bootstrap -do_and_check_cmd ./configure --prefix=/usr/share/bunkerweb/deps --disable-tests -do_and_check_cmd gmake -j "$NTASK" -# FreeBSD: Skip man page installation (no pandoc available) -# Install binaries, libraries, and headers -echo "ℹ️ Installing libmaxminddb components (skipping man pages)" -do_and_check_cmd gmake install-exec -do_and_check_cmd gmake install-includeHEADERS -# Install pkgconfig file manually -do_and_check_cmd mkdir -p /usr/share/bunkerweb/deps/lib/pkgconfig -do_and_check_cmd cp src/libmaxminddb.pc /usr/share/bunkerweb/deps/lib/pkgconfig/ - -# Compiling and installing zlib -echo "ℹ️ Compiling and installing zlib" -export CHANGE_DIR="/tmp/bunkerweb/deps/src/zlib" -do_and_check_cmd chmod +x "configure" -do_and_check_cmd ./configure --prefix=/usr/share/bunkerweb/deps --libdir=/usr/share/bunkerweb/deps/lib/lua -do_and_check_cmd gmake -j "$NTASK" -do_and_check_cmd gmake install - -# Compiling and installing ModSecurity -echo "ℹ️ Compiling and installing ModSecurity" -# temp fix : Debian run it twice -# TODO : patch it in clone.sh -do_and_check_cmd mv /tmp/bunkerweb/deps/src/libinjection /tmp/bunkerweb/deps/src/modsecurity/others/libinjection -do_and_check_cmd mv /tmp/bunkerweb/deps/src/mbedtls /tmp/bunkerweb/deps/src/modsecurity/others/mbedtls -export CHANGE_DIR="/tmp/bunkerweb/deps/src/modsecurity" -export CXXFLAGS="${CXXFLAGS} -include cstdint" -# ModSecurity is C++ and its shared library embeds a dependency on the C++ -# runtime it was compiled against. Using Clang (FreeBSD base system) links -# against /usr/lib/libc++ which is always present — no additional package is -# needed at runtime, keeping the installed footprint minimal and secure. -if command -v clang++ >/dev/null 2>&1; then - MODSEC_CC="clang" - MODSEC_CXX="clang++" - echo "ℹ️ Compiling ModSecurity with Clang (base-system libc++)" -else - MODSEC_CC="cc" - MODSEC_CXX="c++" - echo "ℹ️ Compiling ModSecurity with base-system cc/c++" -fi -export CC="$MODSEC_CC" -export CXX="$MODSEC_CXX" -do_and_check_cmd chmod +x "build.sh" -do_and_check_cmd ./build.sh -do_and_check_cmd sh build.sh -ARGS="--disable-dependency-tracking --disable-static --disable-examples --disable-doxygen-doc --disable-doxygen-html --disable-valgrind-memcheck --disable-valgrind-helgrind --prefix=/usr/share/bunkerweb/deps --with-maxmind=/usr/share/bunkerweb/deps --with-pcre2" -# shellcheck disable=SC2086 -do_and_check_cmd ./configure $ARGS -do_and_check_cmd gmake -j "$NTASK" -do_and_check_cmd gmake install-strip - -# Restore build compiler for subsequent components. -export CC="$BUILD_CC" -export CXX="$BUILD_CXX" - -# Compiling and installing luajit -echo "ℹ️ Compiling and installing luajit" -export CHANGE_DIR="/tmp/bunkerweb/deps/src/luajit" -do_and_check_cmd gmake "CC=$CC" "HOST_CC=$CC" -j "$NTASK" -do_and_check_cmd gmake PREFIX=/usr/share/bunkerweb/deps install - -# Installing lua-resty-core -echo "ℹ️ Installing openresty/lua-resty-core" -export CHANGE_DIR="/tmp/bunkerweb/deps/src/lua-resty-core" -do_and_check_cmd gmake PREFIX=/usr/share/bunkerweb/deps install - -# Installing lua-resty-lrucache -echo "ℹ️ Installing lua-resty-lrucache" -export CHANGE_DIR="/tmp/bunkerweb/deps/src/lua-resty-lrucache" -do_and_check_cmd gmake PREFIX=/usr/share/bunkerweb/deps install - -# Installing lua-resty-dns -echo "ℹ️ Installing lua-resty-dns" -export CHANGE_DIR="/tmp/bunkerweb/deps/src/lua-resty-dns" -do_and_check_cmd gmake PREFIX=/usr/share/bunkerweb/deps install - -# Installing lua-resty-session -echo "ℹ️ Installing lua-resty-session" -export CHANGE_DIR="/tmp/bunkerweb/deps/src/lua-resty-session" -do_and_check_cmd /usr/local/bin/bash -c "cp -rf lib/resty/* /usr/share/bunkerweb/deps/lib/lua/resty/" - -# Installing lua-resty-random -echo "ℹ️ Installing lua-resty-random" -export CHANGE_DIR="/tmp/bunkerweb/deps/src/lua-resty-random" -do_and_check_cmd gmake PREFIX=/usr/share/bunkerweb/deps install - -# Installing lua-resty-string -echo "ℹ️ Installing lua-resty-string" -export CHANGE_DIR="/tmp/bunkerweb/deps/src/lua-resty-string" -do_and_check_cmd gmake PREFIX=/usr/share/bunkerweb/deps install - -# Compiling and installing lua-cjson -echo "ℹ️ Compiling and installing lua-cjson" -export CHANGE_DIR="/tmp/bunkerweb/deps/src/lua-cjson" -do_and_check_cmd gmake LUA_INCLUDE_DIR=/usr/share/bunkerweb/deps/include -j "$NTASK" -do_and_check_cmd gmake PREFIX=/usr/share/bunkerweb/deps LUA_CMODULE_DIR=/usr/share/bunkerweb/deps/lib/lua LUA_MODULE_DIR=/usr/share/bunkerweb/deps/lib/lua install -do_and_check_cmd gmake PREFIX=/usr/share/bunkerweb/deps LUA_CMODULE_DIR=/usr/share/bunkerweb/deps/lib/lua LUA_MODULE_DIR=/usr/share/bunkerweb/deps/lib/lua install-extra - -# Compiling and installing lua-gd -echo "ℹ️ Compiling and installing lua-gd" -export CHANGE_DIR="/tmp/bunkerweb/deps/src/lua-gd" -do_and_check_cmd gmake "CFLAGS=-O3 -Wall -fPIC -fomit-frame-pointer -I/usr/share/bunkerweb/deps/include -I/usr/local/include -DVERSION=\\\"2.0.33r3\\\"" "LFLAGS=-shared -L/usr/share/bunkerweb/deps/lib -L/usr/local/lib -llua -lgd -Wl,-rpath=/usr/share/bunkerweb/deps/lib -Wl,-rpath=/usr/local/lib" LUABIN=/usr/share/bunkerweb/deps/bin/lua -j "$NTASK" -do_and_check_cmd gmake INSTALL_PATH=/usr/share/bunkerweb/deps/lib/lua install - -# Download and install lua-resty-http -echo "ℹ️ Installing lua-resty-http" -export CHANGE_DIR="/tmp/bunkerweb/deps/src/lua-resty-http" -do_and_check_cmd gmake PREFIX=/usr/share/bunkerweb/deps install - -# Download and install lualogging -echo "ℹ️ Installing lualogging" -export CHANGE_DIR="/tmp/bunkerweb/deps/src/lualogging" -do_and_check_cmd /usr/local/bin/bash -c "cp -rf src/* /usr/share/bunkerweb/deps/lib/lua/" - -# Compiling and installing luasocket -echo "ℹ️ Compiling and installing luasocket" -export CHANGE_DIR="/tmp/bunkerweb/deps/src/luasocket" -do_and_check_cmd gmake LUAINC_freebsd=/usr/share/bunkerweb/deps/include -j "$NTASK" freebsd -do_and_check_cmd gmake prefix=/usr/share/bunkerweb/deps CDIR_freebsd=lib/lua LDIR_freebsd=lib/lua install - -# Compiling and installing luasec -echo "ℹ️ Compiling and installing luasec" -export CHANGE_DIR="/tmp/bunkerweb/deps/src/luasec" -do_and_check_cmd gmake INC_PATH=-I/usr/share/bunkerweb/deps/include LIB_PATH=-L/usr/share/bunkerweb/deps/lib bsd -j "$NTASK" -do_and_check_cmd gmake LUACPATH=/usr/share/bunkerweb/deps/lib/lua LUAPATH=/usr/share/bunkerweb/deps/lib/lua install - -# Installing lua-resty-ipmatcher -echo "ℹ️ Installing lua-resty-ipmatcher" -export CHANGE_DIR="/tmp/bunkerweb/deps/src/lua-resty-ipmatcher" -do_and_check_cmd gmake INST_PREFIX=/usr/share/bunkerweb/deps INST_LIBDIR=/usr/share/bunkerweb/deps/lib/lua INST_LUADIR=/usr/share/bunkerweb/deps/lib/lua install - -# Installing lua-resty-redis -echo "ℹ️ Installing lua-resty-redis" -export CHANGE_DIR="/tmp/bunkerweb/deps/src/lua-resty-redis" -do_and_check_cmd gmake PREFIX=/usr/share/bunkerweb/deps LUA_LIB_DIR=/usr/share/bunkerweb/deps/lib/lua install - -# Installing lua-resty-upload -echo "ℹ️ Installing lua-resty-upload" -export CHANGE_DIR="/tmp/bunkerweb/deps/src/lua-resty-upload" -do_and_check_cmd gmake PREFIX=/usr/share/bunkerweb/deps LUA_LIB_DIR=/usr/share/bunkerweb/deps/lib/lua install - -# Installing lujit-geoip -echo "ℹ️ Installing luajit-geoip" -export CHANGE_DIR="/tmp/bunkerweb/deps/src/luajit-geoip" -do_and_check_cmd /usr/local/bin/bash -c "cp -rf geoip /usr/share/bunkerweb/deps/lib/lua/" - -# Installing lbase64 -echo "ℹ️ Installing lbase64" -export CHANGE_DIR="/tmp/bunkerweb/deps/src/lbase64" -do_and_check_cmd /usr/local/bin/bash -c "cp -f base64.lua /usr/share/bunkerweb/deps/lib/lua/" - -# Installing lua-resty-env -echo "ℹ️ Installing lua-resty-env" -export CHANGE_DIR="/tmp/bunkerweb/deps/src/lua-resty-env" -do_and_check_cmd /usr/local/bin/bash -c "cp -f src/resty/env.lua /usr/share/bunkerweb/deps/lib/lua/resty/" - -# Installing lua-resty-mlcache -echo "ℹ️ Installing lua-resty-mlcache" -export CHANGE_DIR="/tmp/bunkerweb/deps/src/lua-resty-mlcache" -do_and_check_cmd /usr/local/bin/bash -c "cp -rf lib/resty/* /usr/share/bunkerweb/deps/lib/lua/resty/" - -# Installing lua-resty-template -echo "ℹ️ Installing lua-resty-template" -export CHANGE_DIR="/tmp/bunkerweb/deps/src/lua-resty-template" -do_and_check_cmd /usr/local/bin/bash -c "cp -rf lib/resty/* /usr/share/bunkerweb/deps/lib/lua/resty/" - -# Installing lua-resty-lock -echo "ℹ️ Installing lua-resty-lock" -export CHANGE_DIR="/tmp/bunkerweb/deps/src/lua-resty-lock" -do_and_check_cmd gmake PREFIX=/usr/share/bunkerweb/deps LUA_LIB_DIR=/usr/share/bunkerweb/deps/lib/lua install - -# Installing lua-resty-openssl -echo "ℹ️ Installing lua-resty-openssl" -export CHANGE_DIR="/tmp/bunkerweb/deps/src/lua-resty-openssl" -do_and_check_cmd gmake PREFIX=/usr/share/bunkerweb/deps LUA_LIB_DIR=/usr/share/bunkerweb/deps/lib/lua install - -# Installing lua-ffi-zlib -echo "ℹ️ Installing lua-ffi-zlib" -export CHANGE_DIR="/tmp/bunkerweb/deps/src/lua-ffi-zlib" -do_and_check_cmd /usr/local/bin/bash -c "cp -f lib/ffi-zlib.lua /usr/share/bunkerweb/deps/lib/lua/" - -# Installing lua-resty-signal -echo "ℹ️ Installing lua-resty-signal" -export CHANGE_DIR="/tmp/bunkerweb/deps/src/lua-resty-signal" -do_and_check_cmd gmake PREFIX=/usr/share/bunkerweb/deps -j "$NTASK" -do_and_check_cmd gmake PREFIX=/usr/share/bunkerweb/deps LUA_LIB_DIR=/usr/share/bunkerweb/deps/lib/lua install - -# Installing lua-resty-redis-connector -echo "ℹ️ Installing lua-resty-redis-connector" -export CHANGE_DIR="/tmp/bunkerweb/deps/src/lua-resty-redis-connector" -do_and_check_cmd gmake SHELL=/usr/local/bin/bash PREFIX=/usr/share/bunkerweb/deps LUA_LIB_DIR=/usr/share/bunkerweb/deps/lib/lua install - -# Patch modsec module -export CHANGE_DIR="/tmp/bunkerweb/deps/misc" -do_and_check_cmd /usr/local/bin/bash -c "cp -f ngx_http_modsecurity_access.c /tmp/bunkerweb/deps/src/modsecurity-nginx/src/" - -# Move brotli to ngx_brotli deps directory -if [ ! -d "/tmp/bunkerweb/deps/src/ngx_brotli/deps" ] ; then - do_and_check_cmd mkdir /tmp/bunkerweb/deps/src/ngx_brotli/deps -fi -do_and_check_cmd mv /tmp/bunkerweb/deps/src/brotli /tmp/bunkerweb/deps/src/ngx_brotli/deps/brotli - -# Compile dynamic modules -echo "ℹ️ Compiling and installing dynamic modules" -CONFARGS="$(nginx -V 2>&1 | sed -n -e 's/^.*arguments: //p')" -CONFARGS="${CONFARGS/-Os -fomit-frame-pointer -g/-Os}" -CONFARGS="$(echo -n "$CONFARGS" | sed "s/--with-ld-opt=-Wl/--with-ld-opt='-lpcre2-8 -Wl'/")" -CONFARGS="$(echo -n "$CONFARGS" | sed "s/--with-ld-opt='-Wl/--with-ld-opt='-lpcre2-8 -Wl/")" - -# Set CFALGS -export CFLAGS="$CFLAGS -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=1" - -# Detect FreeBSD major version to select the correct nginx source directory. -FREEBSD_MAJOR="$(uname -r | cut -d. -f1)" -if [ "$FREEBSD_MAJOR" = "14" ]; then - NGINX_SRC_DIR="/tmp/bunkerweb/deps/src/nginx-1.28.0" -else - NGINX_SRC_DIR="/tmp/bunkerweb/deps/src/nginx" -fi -export CHANGE_DIR="$NGINX_SRC_DIR" -do_and_check_cmd mv auto/configure ./ -echo '#!/usr/local/bin/bash' > "${CHANGE_DIR}/configure-fix.sh" -echo "./configure $CONFARGS --add-dynamic-module=/tmp/bunkerweb/deps/src/headers-more-nginx-module --add-dynamic-module=/tmp/bunkerweb/deps/src/nginx_cookie_flag_module --add-dynamic-module=/tmp/bunkerweb/deps/src/lua-nginx-module --add-dynamic-module=/tmp/bunkerweb/deps/src/ngx_brotli --add-dynamic-module=/tmp/bunkerweb/deps/src/ngx_devel_kit --add-dynamic-module=/tmp/bunkerweb/deps/src/stream-lua-nginx-module" --add-dynamic-module=/tmp/bunkerweb/deps/src/modsecurity-nginx --add-dynamic-module=/tmp/bunkerweb/deps/src/lua-upstream-nginx-module >> "${CHANGE_DIR}/configure-fix.sh" - -do_and_check_cmd chmod +x "configure" -do_and_check_cmd chmod +x "configure-fix.sh" -export LUAJIT_LIB="/usr/share/bunkerweb/deps/lib -Wl,-rpath,/usr/share/bunkerweb/deps/lib" -export LUAJIT_INC="/usr/share/bunkerweb/deps/include/luajit-2.1" -export MODSECURITY_LIB="/usr/share/bunkerweb/deps/lib" -export MODSECURITY_INC="/usr/share/bunkerweb/deps/include" -do_and_check_cmd ./configure-fix.sh -do_and_check_cmd gmake -j "$NTASK" modules -do_and_check_cmd mkdir /usr/share/bunkerweb/modules -do_and_check_cmd /usr/local/bin/bash -c "mv ./objs/*.so /usr/share/bunkerweb/modules/" - -# Dependencies are installed -echo "ℹ️ Dependencies for BunkerWeb successfully compiled and installed !" diff --git a/src/deps/misc/lua.patch1 b/src/deps/misc/lua.patch1 deleted file mode 100644 index 4ed3e75306..0000000000 --- a/src/deps/misc/lua.patch1 +++ /dev/null @@ -1,9 +0,0 @@ -@@ -43,7 +43,7 @@ - # What to install. - TO_BIN= lua luac - TO_INC= lua.h luaconf.h lualib.h lauxlib.h ../etc/lua.hpp --TO_LIB= liblua.a -+TO_LIB= liblua.a liblua.so - TO_MAN= lua.1 luac.1 - - # Lua version and release. \ No newline at end of file diff --git a/src/deps/misc/lua.patch2 b/src/deps/misc/lua.patch2 deleted file mode 100644 index 64cec1e14b..0000000000 --- a/src/deps/misc/lua.patch2 +++ /dev/null @@ -1,35 +0,0 @@ -@@ -8,7 +8,7 @@ - PLAT= none - - CC= gcc --CFLAGS= -O2 -Wall $(MYCFLAGS) -+CFLAGS= -O2 -Wall $(MYCFLAGS) -fPIC - AR= ar rcu - RANLIB= ranlib - RM= rm -f -@@ -23,6 +23,7 @@ - PLATS= aix ansi bsd freebsd generic linux macosx mingw posix solaris - - LUA_A= liblua.a -+LUA_SO= liblua.so - CORE_O= lapi.o lcode.o ldebug.o ldo.o ldump.o lfunc.o lgc.o llex.o lmem.o \ - lobject.o lopcodes.o lparser.o lstate.o lstring.o ltable.o ltm.o \ - lundump.o lvm.o lzio.o -@@ -36,7 +37,7 @@ - LUAC_O= luac.o print.o - - ALL_O= $(CORE_O) $(LIB_O) $(LUA_O) $(LUAC_O) --ALL_T= $(LUA_A) $(LUA_T) $(LUAC_T) -+ALL_T= $(LUA_A) $(LUA_T) $(LUAC_T) $(LUA_SO) - ALL_A= $(LUA_A) - - default: $(PLAT) -@@ -54,6 +55,9 @@ - $(LUA_T): $(LUA_O) $(LUA_A) - $(CC) -o $@ $(MYLDFLAGS) $(LUA_O) $(LUA_A) $(LIBS) - -+$(LUA_SO): $(CORE_O) $(LIB_O) -+ $(CC) -o $@ -shared -fPIC $? -ldl -lm -+ - $(LUAC_T): $(LUAC_O) $(LUA_A) - $(CC) -o $@ $(MYLDFLAGS) $(LUAC_O) $(LUA_A) $(LIBS) \ No newline at end of file diff --git a/src/linux/build-freebsd.sh b/src/linux/build-freebsd.sh deleted file mode 100755 index 20f7860f71..0000000000 --- a/src/linux/build-freebsd.sh +++ /dev/null @@ -1,494 +0,0 @@ -#!/bin/sh -set -eu - -# ------------------------------------------------------------ -# Logging helpers -# ------------------------------------------------------------ -log() { echo "[INFO] $*"; } -warn() { echo "[WARN] $*" >&2; } -err() { echo "[ERROR] $*" >&2; exit 1; } - -# ------------------------------------------------------------ -# OS check -# ------------------------------------------------------------ -[ "$(uname -s)" = "FreeBSD" ] || err "This script must be run on FreeBSD" - -# ------------------------------------------------------------ -# Parallelism settings -# ------------------------------------------------------------ -cpu_count() { - if command -v nproc >/dev/null 2>&1; then - nproc - return 0 - fi - - if command -v sysctl >/dev/null 2>&1; then - sysctl -n hw.ncpu 2>/dev/null || true - return 0 - fi - - echo 1 -} - -NCPU="$(cpu_count)" -case "$NCPU" in - ''|*[!0-9]*|0) NCPU=1 ;; -esac - -# Keep build tools aligned on the same parallelism level. -export NTASK="$NCPU" -export MAKEFLAGS="-j$NCPU" -export CMAKE_BUILD_PARALLEL_LEVEL="$NCPU" -export CARGO_BUILD_JOBS="$NCPU" -log "Using $NCPU parallel build job(s)" - -# ------------------------------------------------------------ -# Paths -# ------------------------------------------------------------ -SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" -REPO_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)" - -STAGEDIR="/tmp/bunkerweb-stage" -OUTPUT_DIR="${OUTPUT_DIR:-$REPO_ROOT}" -KEEP_STAGE=0 -TAR_WRAP_DIR="" -DEPS_WORKDIR="" -HOST_BW_BACKUP="" -HOST_BW_LINK_CREATED=0 - -if [ -n "${FPM_DEBUG:-}" ]; then - KEEP_STAGE=1 -fi - -cleanup() { - if [ "$HOST_BW_LINK_CREATED" -eq 1 ] && [ -L /usr/share/bunkerweb ]; then - rm -f /usr/share/bunkerweb - fi - if [ -n "$HOST_BW_BACKUP" ] && [ -e "$HOST_BW_BACKUP" ]; then - mv "$HOST_BW_BACKUP" /usr/share/bunkerweb - fi - [ -n "$DEPS_WORKDIR" ] && rm -rf "$DEPS_WORKDIR" - if [ "$KEEP_STAGE" -eq 1 ]; then - log "Keeping staging directory for debugging: $STAGEDIR" - return 0 - fi - [ -n "$TAR_WRAP_DIR" ] && rm -rf "$TAR_WRAP_DIR" - rm -rf "$STAGEDIR" -} -trap cleanup EXIT - -# ------------------------------------------------------------ -# Package metadata -# ------------------------------------------------------------ -PKG_NAME="bunkerweb" -WWW="https://www.bunkerweb.io" -MAINTAINER="Bunkerity " -LICENSE="AGPLv3" -VERSION="$(tr -d '\n' < "$REPO_ROOT/src/VERSION")" -ARCH="$(uname -m)" -ABI="$(pkg config abi)" -OSVER_CURRENT="$(echo "$ABI" | awk -F: '{print $2}')" -FREEBSD_OSVERSION="${FREEBSD_OSVERSION:-$OSVER_CURRENT}" -if [ "$FREEBSD_OSVERSION" != "$OSVER_CURRENT" ]; then - err "FREEBSD_OSVERSION=$FREEBSD_OSVERSION does not match current ABI ($OSVER_CURRENT). Build on the target OS version." -fi - -# Runtime dependencies (FreeBSD-native) -# These are the ONLY packages required on a production firewall. -# No compilers, debuggers, or development tools may appear here. -PKG_DEPS=" -bash -nginx -python311 -py311-sqlite3 -curl -libxml2 -yajl -libgd -sudo -lsof -libmaxminddb -libffi -openssl -sqlite3 -unzip -pcre2 -lmdb -ssdeep -" - -# Build-only dependencies (never shipped in the package) -BUILD_DEPS=" -ruby -rubygem-fpm -gtar -pigz -rust -py311-pip -py311-setuptools -py311-wheel -postgresql18-client -git -wget -gmake -autoconf -automake -libtool -pkgconf -" - -# ------------------------------------------------------------ -# Ensure runtime deps exist on builder -# ------------------------------------------------------------ -log "Ensuring runtime dependencies are installed..." -for p in $PKG_DEPS; do - pkg info -e "$p" >/dev/null 2>&1 || pkg install -y "$p" -done - -log "Ensuring build dependencies are installed..." -for p in $BUILD_DEPS; do - pkg info -e "$p" >/dev/null 2>&1 || pkg install -y "$p" -done - -# ------------------------------------------------------------ -# Prepare staging tree -# ------------------------------------------------------------ -log "Preparing staging tree..." -rm -rf "$STAGEDIR" -mkdir -p \ - "$STAGEDIR/usr/share/bunkerweb" \ - "$STAGEDIR/usr/share/bunkerweb/scripts" \ - "$STAGEDIR/usr/share/bunkerweb/rc.d" \ - "$STAGEDIR/usr/bin" \ - "$STAGEDIR/etc/newsyslog.conf.d" - -BW_DIR="$STAGEDIR/usr/share/bunkerweb" - -# ------------------------------------------------------------ -# Build BunkerWeb-managed nginx module stack (staged) -# ------------------------------------------------------------ -if [ ! -d "$REPO_ROOT/src/deps/src" ] || [ ! -d "$REPO_ROOT/src/deps/misc" ]; then - err "Missing src/deps sources. Run: bash src/deps/init_deps.sh" -fi - -log "Building BunkerWeb-managed nginx modules and Lua dependencies (staged)..." -DEPS_WORKDIR="/tmp/bunkerweb" -rm -rf "$DEPS_WORKDIR" -mkdir -p "$DEPS_WORKDIR/deps" -cp -r "$REPO_ROOT/src/deps/src" "$DEPS_WORKDIR/deps/" -cp -r "$REPO_ROOT/src/deps/misc" "$DEPS_WORKDIR/deps/" -cp "$REPO_ROOT/src/deps/install-freebsd.sh" "$DEPS_WORKDIR/deps/install-freebsd.sh" -chmod +x "$DEPS_WORKDIR/deps/install-freebsd.sh" - -if [ -e /usr/share/bunkerweb ] || [ -L /usr/share/bunkerweb ]; then - HOST_BW_BACKUP="$(mktemp -d /tmp/bunkerweb-host-prefix.XXXXXX)" - rmdir "$HOST_BW_BACKUP" - mv /usr/share/bunkerweb "$HOST_BW_BACKUP" -fi -mkdir -p /usr/share -ln -s "$BW_DIR" /usr/share/bunkerweb -HOST_BW_LINK_CREATED=1 - -/usr/local/bin/bash "$DEPS_WORKDIR/deps/install-freebsd.sh" - -rm -f /usr/share/bunkerweb -HOST_BW_LINK_CREATED=0 -if [ -n "$HOST_BW_BACKUP" ] && [ -e "$HOST_BW_BACKUP" ]; then - mv "$HOST_BW_BACKUP" /usr/share/bunkerweb - HOST_BW_BACKUP="" -fi - -# ------------------------------------------------------------ -# Python dependencies (staged into deps/python) -# ------------------------------------------------------------ -log "Installing Python dependencies (staged)..." -PY_DEPS="$BW_DIR/deps/python" -mkdir -p "$PY_DEPS" - -python3.11 -m pip install --no-cache-dir --require-hashes --break-system-packages -r "$REPO_ROOT/src/deps/requirements.txt" -python3.11 -m pip install --no-cache-dir --require-hashes --target "$PY_DEPS" \ - -r "$REPO_ROOT/src/scheduler/requirements.txt" \ - -r "$REPO_ROOT/src/ui/requirements.txt" \ - -r "$REPO_ROOT/src/api/requirements.txt" \ - -r "$REPO_ROOT/src/common/gen/requirements.txt" \ - -r "$REPO_ROOT/src/common/db/requirements.arm.txt" - -# Apply BunkerWeb patches to vendored Python deps before they are tarballed -# (DNS alias / CNAME delegation for certbot). -F0 fails the build loudly on -# any context drift instead of fuzzing onto the wrong code. -log "Applying BunkerWeb patches to vendored Python deps..." -patch -p1 -F0 --dry-run -d "$PY_DEPS" < "$REPO_ROOT/src/deps/misc/certbot-dns-alias.patch" -patch -p1 -F0 --no-backup-if-mismatch -d "$PY_DEPS" < "$REPO_ROOT/src/deps/misc/certbot-dns-alias.patch" -grep -q '_load_domain_aliases' "$PY_DEPS/certbot/plugins/dns_common.py" - -log "Compressing staged dependencies (inside stage)..." -( - cd "$BW_DIR" - if command -v pigz >/dev/null 2>&1; then - tar -cf deps.tar deps - pigz -1 -p "$NCPU" deps.tar - else - tar -czf deps.tar.gz deps - fi - rm -rf deps -) - -# ------------------------------------------------------------ -# Copy BunkerWeb sources -# ------------------------------------------------------------ -log "Copying BunkerWeb files into stage..." - -cp -r "$REPO_ROOT/src/bw/loading" "$BW_DIR/" -cp -r "$REPO_ROOT/src/bw/lua" "$BW_DIR/" -cp -r "$REPO_ROOT/src/bw/misc" "$BW_DIR/" - -cp -r "$REPO_ROOT/src/common/api" "$BW_DIR/" -cp -r "$REPO_ROOT/src/common/cli" "$BW_DIR/" -cp -r "$REPO_ROOT/src/common/confs" "$BW_DIR/" -cp -r "$REPO_ROOT/src/common/core" "$BW_DIR/" -cp -r "$REPO_ROOT/src/common/db" "$BW_DIR/" -cp -r "$REPO_ROOT/src/common/gen" "$BW_DIR/" -cp -r "$REPO_ROOT/src/common/helpers" "$BW_DIR/" -cp -r "$REPO_ROOT/src/common/utils" "$BW_DIR/" -cp "$REPO_ROOT/src/common/settings.json" "$BW_DIR/" - -cp -r "$REPO_ROOT/src/scheduler" "$BW_DIR/" -cp -r "$REPO_ROOT/src/ui" "$BW_DIR/" -cp -r "$REPO_ROOT/src/api" "$BW_DIR/" -cp "$REPO_ROOT/src/VERSION" "$BW_DIR/" - -# rc.d scripts -if [ -d "$REPO_ROOT/src/linux/rc.d" ]; then - cp -r "$REPO_ROOT/src/linux/rc.d/." "$BW_DIR/rc.d/" -fi - -# pkg lifecycle scripts -cp "$SCRIPT_DIR/scripts/beforeInstallFreeBSD.sh" "$BW_DIR/scripts/" 2>/dev/null || true -cp "$SCRIPT_DIR/scripts/postinstall-freebsd.sh" "$BW_DIR/scripts/" 2>/dev/null || true -cp "$SCRIPT_DIR/scripts/afterRemoveFreeBSD.sh" "$BW_DIR/scripts/" 2>/dev/null || true - -# runtime service scripts required by rc.d units -cp "$SCRIPT_DIR/scripts/start.sh" "$BW_DIR/scripts/" 2>/dev/null || true -cp "$SCRIPT_DIR/scripts/bunkerweb-scheduler.sh" "$BW_DIR/scripts/" 2>/dev/null || true -cp "$SCRIPT_DIR/scripts/bunkerweb-ui.sh" "$BW_DIR/scripts/" 2>/dev/null || true -cp "$SCRIPT_DIR/scripts/bunkerweb-api.sh" "$BW_DIR/scripts/" 2>/dev/null || true - -# ------------------------------------------------------------ -# bwcli wrapper (NO symlink) -# ------------------------------------------------------------ -log "Creating bwcli wrapper..." -cat >"$STAGEDIR/usr/bin/bwcli" <<'EOF' -#!/bin/sh -exec /usr/local/bin/python3.11 /usr/share/bunkerweb/cli/main.py "$@" -EOF -chmod 0755 "$STAGEDIR/usr/bin/bwcli" - -# ------------------------------------------------------------ -# newsyslog config -# ------------------------------------------------------------ -if [ -f "$SCRIPT_DIR/bunkerweb.newsyslog.conf" ]; then - cp "$SCRIPT_DIR/bunkerweb.newsyslog.conf" \ - "$STAGEDIR/etc/newsyslog.conf.d/bunkerweb.conf" -fi - -# ------------------------------------------------------------ -# fpm scripts -# ------------------------------------------------------------ -# Build package with fpm -# ------------------------------------------------------------ -log "Creating package with fpm..." -mkdir -p "$OUTPUT_DIR" -FPM_OUTPUT="${OUTPUT_DIR}/${PKG_NAME}-${VERSION}.pkg" -rm -f "$FPM_OUTPUT" - -if [ -n "${FPM_DEBUG:-}" ]; then - log "FPM_DEBUG enabled: running tar preflight and enabling verbose fpm logging" - FPM_DEBUG_ENABLED=1 - TAR_TEST="$(mktemp /tmp/bunkerweb-tar-test.XXXXXX.txz)" - if ! tar -Jcf "$TAR_TEST" -C "$STAGEDIR" .; then - err "tar preflight failed; see error above" - fi - rm -f "$TAR_TEST" -else - FPM_DEBUG_ENABLED=0 -fi - -if command -v gtar >/dev/null 2>&1; then - TAR_WRAP_DIR="$(mktemp -d /tmp/bunkerweb-tar-wrap.XXXXXX)" - cat >"$TAR_WRAP_DIR/tar" <<'EOF' -#!/bin/sh -exec gtar "$@" -EOF - chmod 0755 "$TAR_WRAP_DIR/tar" -else - err "gtar is required for fpm FreeBSD packaging (BSD tar lacks --transform)" -fi - -FPM_OSVERSION_OPT="" -FPM_BIN="${FPM_BIN:-}" - -resolve_fpm_bin() { - if [ -n "$FPM_BIN" ] && [ -x "$FPM_BIN" ]; then - return 0 - fi - - gem_bindir="$(ruby -e 'require "rubygems"; puts Gem.bindir' 2>/dev/null || true)" - if [ -n "$gem_bindir" ] && [ -x "$gem_bindir/fpm" ]; then - FPM_BIN="$gem_bindir/fpm" - return 0 - fi - - FPM_BIN="$(command -v fpm || true)" -} - -fpm_supports_osversion() { - "$FPM_BIN" --help 2>&1 | grep -q -- '--freebsd-osversion' -} - -resolve_fpm_bin -if [ -z "$FPM_BIN" ] || [ ! -x "$FPM_BIN" ]; then - err "fpm not found on PATH" -fi - -if ! fpm_supports_osversion; then - log "Upgrading fpm to a version that supports --freebsd-osversion..." - gem install -N fpm - resolve_fpm_bin -fi - -if fpm_supports_osversion; then - FPM_OSVERSION_OPT="--freebsd-osversion" -else - if [ "$FREEBSD_OSVERSION" != "13" ]; then - err "fpm does not support --freebsd-osversion after upgrade; cannot build for FreeBSD $FREEBSD_OSVERSION" - fi - warn "fpm does not support --freebsd-osversion; proceeding with default (FreeBSD 13)" -fi - -check_script() { - script="$1" - [ -f "$script" ] || return 0 - - if ! sh -n "$script"; then - err "Shell syntax check failed: $script" - fi - - if [ -n "$(LC_ALL=C tr -d '\t\n\r -~' < "$script")" ]; then - err "Non-ASCII characters found in: $script" - fi -} - -check_script "$BW_DIR/scripts/beforeInstallFreeBSD.sh" -check_script "$BW_DIR/scripts/postinstall-freebsd.sh" -check_script "$BW_DIR/scripts/afterRemoveFreeBSD.sh" - -build_deps_json() { - python3.11 - "$1" <<'PY' -import json -import subprocess -import sys - -deps = {} -raw_deps = sys.argv[1] if len(sys.argv) > 1 else "" -for dep in raw_deps.split(): - try: - out = subprocess.check_output(["pkg", "query", "%n\t%o\t%v", dep], text=True).strip() - except subprocess.CalledProcessError: - continue - if not out: - continue - name, origin, version = out.split("\t") - deps[name] = {"origin": origin, "version": version} - -print(json.dumps(deps, separators=(",", ":"))) -PY -} - -augment_pkg_manifest() { - package_path="$1" - deps_json="$2" - edit_dir="$(mktemp -d /tmp/bunkerweb-pkg-edit.XXXXXX)" - - tar -xJf "$package_path" -C "$edit_dir" - python3.11 - "$edit_dir/+MANIFEST" "$edit_dir/+COMPACT_MANIFEST" "$deps_json" <<'PY' -import json -import sys - -manifest_path = sys.argv[1] -compact_manifest_path = sys.argv[2] -deps = json.loads(sys.argv[3] or "{}") - -with open(manifest_path, "r", encoding="utf-8") as f: - manifest = json.load(f) - -manifest["deps"] = deps - -with open(manifest_path, "w", encoding="utf-8") as f: - json.dump(manifest, f, separators=(",", ":")) - -with open(compact_manifest_path, "r", encoding="utf-8") as f: - compact_manifest = json.load(f) - -compact_manifest["deps"] = deps - -with open(compact_manifest_path, "w", encoding="utf-8") as f: - json.dump(compact_manifest, f, separators=(",", ":")) -PY - - ( - cd "$edit_dir" - find etc usr \( -type f -o -type l \) | LC_ALL=C sort > .pkg-filelist - gtar -Jcf "$package_path" --transform='s|^[^+]|/&|' +COMPACT_MANIFEST +MANIFEST -T .pkg-filelist - rm -f .pkg-filelist - ) - rm -rf "$edit_dir" -} - -( - cd "$STAGEDIR" - export PATH="$TAR_WRAP_DIR:$PATH" - set -- -s dir -t freebsd \ - -n "$PKG_NAME" \ - -v "$VERSION" \ - --architecture "$ARCH" \ - --license "$LICENSE" \ - --url "$WWW" \ - --maintainer "$MAINTAINER" \ - --description "BunkerWeb ${VERSION} for FreeBSD" - - if [ "$FPM_DEBUG_ENABLED" -eq 1 ]; then - set -- "$@" --verbose --log debug --debug-workspace - fi - - if [ -n "$FPM_OSVERSION_OPT" ]; then - set -- "$@" "$FPM_OSVERSION_OPT" "$FREEBSD_OSVERSION" - fi - - for dep in $PKG_DEPS; do - set -- "$@" --depends "$dep" - done - - if [ -f "$BW_DIR/scripts/beforeInstallFreeBSD.sh" ]; then - set -- "$@" --before-install "$BW_DIR/scripts/beforeInstallFreeBSD.sh" - fi - if [ -f "$BW_DIR/scripts/postinstall-freebsd.sh" ]; then - set -- "$@" --after-install "$BW_DIR/scripts/postinstall-freebsd.sh" - fi - if [ -f "$BW_DIR/scripts/afterRemoveFreeBSD.sh" ]; then - set -- "$@" --after-remove "$BW_DIR/scripts/afterRemoveFreeBSD.sh" - fi - - set -- "$@" -p "$FPM_OUTPUT" . - - "$FPM_BIN" "$@" -) - -[ -f "$FPM_OUTPUT" ] || err "Package built but output file not found" - -DEPS_JSON="$(build_deps_json "$PKG_DEPS")" -augment_pkg_manifest "$FPM_OUTPUT" "$DEPS_JSON" - -log "Package built successfully:" -log " $FPM_OUTPUT" -log "Install with:" -log " pkg install -y \"$FPM_OUTPUT\"" diff --git a/src/linux/bunkerweb.newsyslog.conf b/src/linux/bunkerweb.newsyslog.conf deleted file mode 100644 index 0eefe7d949..0000000000 --- a/src/linux/bunkerweb.newsyslog.conf +++ /dev/null @@ -1,16 +0,0 @@ -# BunkerWeb log rotation configuration for FreeBSD -# See newsyslog.conf(5) for details -# -# logfilename [owner:group] mode count size when flags [/pid_file] [sig_num] - -# Main service logs -/var/log/bunkerweb/access.log nginx:nginx 640 7 * @T00 JC -/var/log/bunkerweb/error.log nginx:nginx 640 7 * @T00 JC -/var/log/bunkerweb/modsec_audit.log nginx:nginx 640 7 * @T00 JC - -# Component logs -/var/log/bunkerweb/scheduler.log nginx:nginx 640 7 * @T00 JC -/var/log/bunkerweb/ui.log nginx:nginx 640 7 * @T00 JC -/var/log/bunkerweb/ui-access.log nginx:nginx 640 7 * @T00 JC -/var/log/bunkerweb/api.log nginx:nginx 640 7 * @T00 JC -/var/log/bunkerweb/api-access.log nginx:nginx 640 7 * @T00 JC diff --git a/src/linux/fpm-freebsd b/src/linux/fpm-freebsd deleted file mode 100644 index 9ac32ca411..0000000000 --- a/src/linux/fpm-freebsd +++ /dev/null @@ -1,13 +0,0 @@ --s dir ---name bunkerweb ---license agpl3 ---version %VERSION% ---architecture %ARCH% ---depends bash --depends nginx --depends python311 --depends libxml2 --depends yajl --depends libgd --depends sudo --depends lsof --depends libmaxminddb --depends libffi --depends openssl --depends sqlite3 --depends unzip --depends pcre2 --depends lmdb --depends ssdeep --depends curl ---description "BunkerWeb %VERSION% for FreeBSD" ---url "https://www.bunkerweb.io" ---maintainer "Bunkerity " ---before-install /usr/share/bunkerweb/scripts/beforeInstallFreeBSD.sh ---after-install /usr/share/bunkerweb/scripts/postinstall-freebsd.sh ---after-remove /usr/share/bunkerweb/scripts/afterRemoveFreeBSD.sh -/usr/share/bunkerweb/=/usr/share/bunkerweb/ /usr/share/bunkerweb/rc.d/=/usr/share/bunkerweb/rc.d/ /usr/bin/bwcli=/usr/bin/bwcli /etc/bunkerweb/=/etc/bunkerweb /var/log/bunkerweb/=/var/log/bunkerweb /var/cache/bunkerweb/=/var/cache/bunkerweb /var/lib/bunkerweb/=/var/lib/bunkerweb /var/tmp/bunkerweb/=/var/tmp/bunkerweb /var/run/bunkerweb/=/var/run/bunkerweb /etc/newsyslog.conf.d/bunkerweb.conf=/etc/newsyslog.conf.d/bunkerweb.conf diff --git a/src/linux/fpm.sh b/src/linux/fpm.sh index a2fb0f5f28..8bd503b0cb 100644 --- a/src/linux/fpm.sh +++ b/src/linux/fpm.sh @@ -18,9 +18,6 @@ if [ -z "$FPM_SKIP_COMPRESSION" ]; then elif [ "$1" == "rpm" ]; then echo "[DEBUG] Compression enabled: gzip" FPM_OPTS="$FPM_OPTS --rpm-compression gzip" - elif [ "$1" == "freebsd" ]; then - echo "[DEBUG] Building FreeBSD package" - # FreeBSD packages use txz compression by default fi else echo "[DEBUG] Compression skipped" @@ -28,9 +25,6 @@ fi # Determine output extension PKG_EXT="$1" -if [ "$1" == "freebsd" ]; then - PKG_EXT="pkg" -fi # shellcheck disable=SC2086 fpm -t "$1" -p "/data/bunkerweb.${PKG_EXT}" $FPM_OPTS diff --git a/src/linux/package.sh b/src/linux/package.sh index 6adfeaf2e8..3868c1825a 100644 --- a/src/linux/package.sh +++ b/src/linux/package.sh @@ -40,14 +40,6 @@ fi type="deb" if [[ "$linux" = fedora* ]] || [ "$linux" = "centos" ] || [[ "$linux" = rhel* ]] ; then type="rpm" -elif [[ "$linux" = freebsd* ]] ; then - type="freebsd" -fi - -# FreeBSD packages cannot be built in Docker - show instructions -if [ "$type" = "freebsd" ] ; then - echo "⚠️ FreeBSD packages cannot be built in Docker." - exit 0 fi do_and_check_cmd docker run --rm -v "${package_dir}:/data" "local/bunkerweb-${linux}:latest" "$type" diff --git a/src/linux/rc.d/bunkerweb b/src/linux/rc.d/bunkerweb deleted file mode 100644 index 5624666684..0000000000 --- a/src/linux/rc.d/bunkerweb +++ /dev/null @@ -1,74 +0,0 @@ -#!/bin/sh - -# PROVIDE: bunkerweb -# REQUIRE: LOGIN DAEMON NETWORKING -# KEYWORD: shutdown -# -# Add the following line to /etc/rc.conf to enable bunkerweb: -# -# bunkerweb_enable="YES" -# - -. /etc/rc.subr - -name="bunkerweb" -rcvar="${name}_enable" -desc="BunkerWeb Web Application Firewall service" - -load_rc_config $name - -: ${bunkerweb_enable:="NO"} -: ${bunkerweb_user:="root"} -: ${bunkerweb_group:="nginx"} -: ${bunkerweb_pidfile:="/var/run/bunkerweb/nginx.pid"} -: ${bunkerweb_wrapper_pidfile:="/var/run/bunkerweb/bunkerweb-wrapper.pid"} - -pidfile="${bunkerweb_pidfile}" -start_cmd="${name}_start" -stop_cmd="${name}_stop" -reload_cmd="${name}_reload" -status_cmd="${name}_status" -extra_commands="reload" - -bunkerweb_start() -{ - echo "Starting ${name}." - mkdir -p /var/run/bunkerweb - /usr/sbin/daemon -f -p "${bunkerweb_wrapper_pidfile}" /usr/local/bin/bash /usr/share/bunkerweb/scripts/start.sh start -} - -bunkerweb_stop() -{ - if [ -f "${pidfile}" ]; then - echo "Stopping ${name}." - /usr/local/bin/bash /usr/share/bunkerweb/scripts/start.sh stop - else - echo "${name} is not running." - fi - if [ -f "${bunkerweb_wrapper_pidfile}" ]; then - wrapper_pid=$(cat "${bunkerweb_wrapper_pidfile}" 2>/dev/null) - [ -n "${wrapper_pid}" ] && kill "${wrapper_pid}" 2>/dev/null || true - rm -f "${bunkerweb_wrapper_pidfile}" - fi -} - -bunkerweb_reload() -{ - echo "Reloading ${name}." - /usr/local/bin/bash /usr/share/bunkerweb/scripts/start.sh reload -} - -bunkerweb_status() -{ - if [ -f "${pidfile}" ]; then - pid=$(cat "${pidfile}") - if kill -0 "${pid}" 2>/dev/null; then - echo "${name} is running as pid ${pid}." - return 0 - fi - fi - echo "${name} is not running." - return 1 -} - -run_rc_command "$1" diff --git a/src/linux/rc.d/bunkerweb_api b/src/linux/rc.d/bunkerweb_api deleted file mode 100644 index 65e356a015..0000000000 --- a/src/linux/rc.d/bunkerweb_api +++ /dev/null @@ -1,74 +0,0 @@ -#!/bin/sh - -# PROVIDE: bunkerweb_api -# REQUIRE: LOGIN DAEMON NETWORKING -# KEYWORD: shutdown -# -# Add the following line to /etc/rc.conf to enable bunkerweb_api: -# -# bunkerweb_api_enable="YES" -# - -. /etc/rc.subr - -name="bunkerweb_api" -rcvar="${name}_enable" -desc="BunkerWeb API service" - -load_rc_config $name - -: ${bunkerweb_api_enable:="NO"} -: ${bunkerweb_api_user:="root"} -: ${bunkerweb_api_group:="nginx"} -: ${bunkerweb_api_pidfile:="/var/run/bunkerweb/api.pid"} -: ${bunkerweb_api_wrapper_pidfile:="/var/run/bunkerweb/api-wrapper.pid"} - -pidfile="${bunkerweb_api_pidfile}" -start_cmd="${name}_start" -stop_cmd="${name}_stop" -reload_cmd="${name}_reload" -status_cmd="${name}_status" -extra_commands="reload" - -bunkerweb_api_start() -{ - echo "Starting ${name}." - mkdir -p /var/run/bunkerweb - /usr/sbin/daemon -f -p "${bunkerweb_api_wrapper_pidfile}" /usr/local/bin/bash /usr/share/bunkerweb/scripts/bunkerweb-api.sh start -} - -bunkerweb_api_stop() -{ - if [ -f "${pidfile}" ]; then - echo "Stopping ${name}." - /usr/local/bin/bash /usr/share/bunkerweb/scripts/bunkerweb-api.sh stop - else - echo "${name} is not running." - fi - if [ -f "${bunkerweb_api_wrapper_pidfile}" ]; then - wrapper_pid=$(cat "${bunkerweb_api_wrapper_pidfile}" 2>/dev/null) - [ -n "${wrapper_pid}" ] && kill "${wrapper_pid}" 2>/dev/null || true - rm -f "${bunkerweb_api_wrapper_pidfile}" - fi -} - -bunkerweb_api_reload() -{ - echo "Reloading ${name}." - /usr/local/bin/bash /usr/share/bunkerweb/scripts/bunkerweb-api.sh reload -} - -bunkerweb_api_status() -{ - if [ -f "${pidfile}" ]; then - pid=$(cat "${pidfile}") - if kill -0 "${pid}" 2>/dev/null; then - echo "${name} is running as pid ${pid}." - return 0 - fi - fi - echo "${name} is not running." - return 1 -} - -run_rc_command "$1" diff --git a/src/linux/rc.d/bunkerweb_scheduler b/src/linux/rc.d/bunkerweb_scheduler deleted file mode 100644 index 77b65bbbba..0000000000 --- a/src/linux/rc.d/bunkerweb_scheduler +++ /dev/null @@ -1,74 +0,0 @@ -#!/bin/sh - -# PROVIDE: bunkerweb_scheduler -# REQUIRE: LOGIN DAEMON NETWORKING -# KEYWORD: shutdown -# -# Add the following line to /etc/rc.conf to enable bunkerweb_scheduler: -# -# bunkerweb_scheduler_enable="YES" -# - -. /etc/rc.subr - -name="bunkerweb_scheduler" -rcvar="${name}_enable" -desc="BunkerWeb Scheduler service" - -load_rc_config $name - -: ${bunkerweb_scheduler_enable:="NO"} -: ${bunkerweb_scheduler_user:="root"} -: ${bunkerweb_scheduler_group:="nginx"} -: ${bunkerweb_scheduler_pidfile:="/var/run/bunkerweb/scheduler.pid"} -: ${bunkerweb_scheduler_wrapper_pidfile:="/var/run/bunkerweb/scheduler-wrapper.pid"} - -pidfile="${bunkerweb_scheduler_pidfile}" -start_cmd="${name}_start" -stop_cmd="${name}_stop" -reload_cmd="${name}_reload" -status_cmd="${name}_status" -extra_commands="reload" - -bunkerweb_scheduler_start() -{ - echo "Starting ${name}." - mkdir -p /var/run/bunkerweb - /usr/sbin/daemon -f -p "${bunkerweb_scheduler_wrapper_pidfile}" /usr/local/bin/bash /usr/share/bunkerweb/scripts/bunkerweb-scheduler.sh start -} - -bunkerweb_scheduler_stop() -{ - if [ -f "${pidfile}" ]; then - echo "Stopping ${name}." - /usr/local/bin/bash /usr/share/bunkerweb/scripts/bunkerweb-scheduler.sh stop - else - echo "${name} is not running." - fi - if [ -f "${bunkerweb_scheduler_wrapper_pidfile}" ]; then - wrapper_pid=$(cat "${bunkerweb_scheduler_wrapper_pidfile}" 2>/dev/null) - [ -n "${wrapper_pid}" ] && kill "${wrapper_pid}" 2>/dev/null || true - rm -f "${bunkerweb_scheduler_wrapper_pidfile}" - fi -} - -bunkerweb_scheduler_reload() -{ - echo "Reloading ${name}." - /usr/local/bin/bash /usr/share/bunkerweb/scripts/bunkerweb-scheduler.sh reload -} - -bunkerweb_scheduler_status() -{ - if [ -f "${pidfile}" ]; then - pid=$(cat "${pidfile}") - if kill -0 "${pid}" 2>/dev/null; then - echo "${name} is running as pid ${pid}." - return 0 - fi - fi - echo "${name} is not running." - return 1 -} - -run_rc_command "$1" diff --git a/src/linux/rc.d/bunkerweb_ui b/src/linux/rc.d/bunkerweb_ui deleted file mode 100644 index 4de0b25edc..0000000000 --- a/src/linux/rc.d/bunkerweb_ui +++ /dev/null @@ -1,74 +0,0 @@ -#!/bin/sh - -# PROVIDE: bunkerweb_ui -# REQUIRE: LOGIN DAEMON NETWORKING -# KEYWORD: shutdown -# -# Add the following line to /etc/rc.conf to enable bunkerweb_ui: -# -# bunkerweb_ui_enable="YES" -# - -. /etc/rc.subr - -name="bunkerweb_ui" -rcvar="${name}_enable" -desc="BunkerWeb UI service" - -load_rc_config $name - -: ${bunkerweb_ui_enable:="NO"} -: ${bunkerweb_ui_user:="root"} -: ${bunkerweb_ui_group:="nginx"} -: ${bunkerweb_ui_pidfile:="/var/run/bunkerweb/ui.pid"} -: ${bunkerweb_ui_wrapper_pidfile:="/var/run/bunkerweb/ui-wrapper.pid"} - -pidfile="${bunkerweb_ui_pidfile}" -start_cmd="${name}_start" -stop_cmd="${name}_stop" -reload_cmd="${name}_reload" -status_cmd="${name}_status" -extra_commands="reload" - -bunkerweb_ui_start() -{ - echo "Starting ${name}." - mkdir -p /var/run/bunkerweb - /usr/sbin/daemon -f -p "${bunkerweb_ui_wrapper_pidfile}" /usr/local/bin/bash /usr/share/bunkerweb/scripts/bunkerweb-ui.sh start -} - -bunkerweb_ui_stop() -{ - if [ -f "${pidfile}" ]; then - echo "Stopping ${name}." - /usr/local/bin/bash /usr/share/bunkerweb/scripts/bunkerweb-ui.sh stop - else - echo "${name} is not running." - fi - if [ -f "${bunkerweb_ui_wrapper_pidfile}" ]; then - wrapper_pid=$(cat "${bunkerweb_ui_wrapper_pidfile}" 2>/dev/null) - [ -n "${wrapper_pid}" ] && kill "${wrapper_pid}" 2>/dev/null || true - rm -f "${bunkerweb_ui_wrapper_pidfile}" - fi -} - -bunkerweb_ui_reload() -{ - echo "Reloading ${name}." - /usr/local/bin/bash /usr/share/bunkerweb/scripts/bunkerweb-ui.sh reload -} - -bunkerweb_ui_status() -{ - if [ -f "${pidfile}" ]; then - pid=$(cat "${pidfile}") - if kill -0 "${pid}" 2>/dev/null; then - echo "${name} is running as pid ${pid}." - return 0 - fi - fi - echo "${name} is not running." - return 1 -} - -run_rc_command "$1" diff --git a/src/linux/scripts/afterRemoveDEB.sh b/src/linux/scripts/afterRemoveDEB.sh index 79cf9925c8..1558452a08 100644 --- a/src/linux/scripts/afterRemoveDEB.sh +++ b/src/linux/scripts/afterRemoveDEB.sh @@ -1,15 +1,5 @@ #!/bin/bash -# Detect if running on FreeBSD and delegate to FreeBSD-specific script -if [ "$(uname)" = "FreeBSD" ]; then - if [ -f /usr/share/bunkerweb/scripts/afterRemoveFreeBSD.sh ]; then - exec /usr/share/bunkerweb/scripts/afterRemoveFreeBSD.sh "$@" - else - echo "❌ FreeBSD afterRemove script not found" - exit 1 - fi -fi - # Function to run a command and check its return code function do_and_check_cmd() { output=$("$@" 2>&1) diff --git a/src/linux/scripts/afterRemoveFreeBSD.sh b/src/linux/scripts/afterRemoveFreeBSD.sh deleted file mode 100644 index 9df538c28c..0000000000 --- a/src/linux/scripts/afterRemoveFreeBSD.sh +++ /dev/null @@ -1,175 +0,0 @@ -#!/bin/sh - -# FreeBSD afterRemove script for BunkerWeb -# Uses rc.d init system instead of systemd - -# Function to run a command and check its return code -do_and_check_cmd() { - "$@" - ret=$? - if [ $ret -ne 0 ]; then - echo "[ERROR] Command failed: $*" - exit $ret - fi -} - -# Remove rc.d services -remove_rcd_services() { - service_prefix=$1 - echo "[INFO] Searching for rc.d services related to $service_prefix" - - for service_file in "/usr/local/etc/rc.d/${service_prefix}"*; do - if [ -f "$service_file" ]; then - service_name=$(basename "$service_file") - echo "[INFO] Found service: $service_name" - echo "[INFO] Removing $service_name service" - - # Stop service if running - if service "$service_name" status >/dev/null 2>&1; then - service "$service_name" stop || echo "[INFO] Service $service_name already stopped." - fi - - # Disable service in rc.conf - sysrc -x "${service_name}_enable" 2>/dev/null || true - - # Remove the service file - do_and_check_cmd rm -f "$service_file" - fi - done -} - -# Remove directories or files if they exist -remove_path() { - path=$1 - description=$2 - - if [ -e "$path" ]; then - echo "[INFO] Removing $description ($path)" - do_and_check_cmd rm -rf "$path" - else - echo "[INFO] $description ($path) does not exist. Skipping." - fi -} - -print_leftover_hint() { - echo "[INFO] Logs and upgrade backups are NEVER auto-removed." - echo "[INFO] Logs: rm -rf /var/log/bunkerweb" - echo "[INFO] Backups: rm -f /var/tmp/variables.env /var/tmp/ui.env /var/tmp/scheduler.env \\" - echo "[INFO] /var/tmp/api.env /var/tmp/api.yml /var/tmp/db.sqlite3 \\" - echo "[INFO] /var/tmp/bunkerweb_upgrade" -} - -# Perform actions for package removal -remove() { - echo "[INFO] Package is being uninstalled" - - # Retro-tighten 0644 backups left by pre-fix versions. - chmod 0600 /var/tmp/variables.env /var/tmp/ui.env /var/tmp/scheduler.env \ - /var/tmp/api.env /var/tmp/api.yml /var/tmp/db.sqlite3 2>/dev/null || true - - # Stop nginx if it is active - if service nginx status >/dev/null 2>&1; then - echo "[INFO] Stopping nginx service" - service nginx stop || true - fi - - # Dynamically remove all related rc.d services - remove_rcd_services "bunkerweb" - - # /etc, /var/lib, /var/log, /var/tmp backups preserved — admin disposes. - remove_path "/usr/share/bunkerweb" "application files" - remove_path "/usr/local/etc/sudoers.d/bunkerweb-nginx-reload" "BunkerWeb sudoers reload rule" - remove_path "/var/tmp/bunkerweb" "temporary files" - remove_path "/var/run/bunkerweb" "runtime files" - remove_path "/var/cache/bunkerweb" "cache files" - remove_path "/usr/bin/bwcli" "CLI binary" - - echo "[INFO] BunkerWeb successfully uninstalled" - echo "[INFO] Preserved: /etc/bunkerweb, /var/lib/bunkerweb" - echo "[INFO] To purge configs + data run: rm -rf /etc/bunkerweb /var/lib/bunkerweb" - print_leftover_hint -} - -# Perform actions for package purge -purge() { - echo "[INFO] Package is being purged" - remove - - # Logs and /var/tmp backups deliberately kept on purge — admin disposes. - remove_path "/var/lib/bunkerweb" "data files" - remove_path "/etc/bunkerweb" "configuration files" - - echo "[INFO] BunkerWeb successfully purged" - print_leftover_hint -} - -# Check for root privileges -if [ "$(id -u)" -ne 0 ]; then - echo "[ERROR] This script must be run as root" - exit 1 -fi - -# Detect operating system -DISTRO_ID="" - -if [ -f /etc/os-release ]; then - # shellcheck disable=SC1091 - . /etc/os-release - DISTRO_ID=$(echo "$ID" | tr "[:upper:]" "[:lower:]") - echo "[INFO] Detected OS from /etc/os-release: $DISTRO_ID" -elif [ "$(uname)" = "FreeBSD" ]; then - DISTRO_ID="freebsd" - echo "[INFO] Detected FreeBSD from uname" -else - echo "[ERROR] Unable to detect operating system" - exit 1 -fi - -# Support only FreeBSD systems -if [ "$DISTRO_ID" != "freebsd" ]; then - echo "[ERROR] Unsupported operating system: $DISTRO_ID" - echo "[INFO] This script is for FreeBSD only" - exit 1 -fi - -# Handle script arguments -case "$1" in - deinstall) - remove - ;; - POST-DEINSTALL) - remove - ;; - purge) - purge - ;; - *) - echo "[INFO] Package is being upgraded" - # Backup important files during upgrade - remove_path "/var/tmp/variables.env" "temporary environment variables" - remove_path "/var/tmp/ui.env" "UI environment variables" - remove_path "/var/tmp/scheduler.env" "Scheduler environment variables" - remove_path "/var/tmp/api.env" "API environment variables" - remove_path "/var/tmp/db.sqlite3" "database" - # install -m 0600 (atomic) — /var/tmp is mode 1777, must not leak creds. - if [ -f /etc/bunkerweb/variables.env ]; then - do_and_check_cmd install -m 0600 -o root -g wheel /etc/bunkerweb/variables.env /var/tmp/variables.env - fi - if [ -f /etc/bunkerweb/ui.env ]; then - do_and_check_cmd install -m 0600 -o root -g wheel /etc/bunkerweb/ui.env /var/tmp/ui.env - fi - if [ -f /etc/bunkerweb/scheduler.env ]; then - do_and_check_cmd install -m 0600 -o root -g wheel /etc/bunkerweb/scheduler.env /var/tmp/scheduler.env - fi - if [ -f /etc/bunkerweb/api.env ]; then - do_and_check_cmd install -m 0600 -o root -g wheel /etc/bunkerweb/api.env /var/tmp/api.env - fi - if [ -f /etc/bunkerweb/api.yml ]; then - do_and_check_cmd install -m 0600 -o root -g wheel /etc/bunkerweb/api.yml /var/tmp/api.yml - fi - if [ -f /var/lib/bunkerweb/db.sqlite3 ]; then - do_and_check_cmd install -m 0600 -o root -g wheel /var/lib/bunkerweb/db.sqlite3 /var/tmp/db.sqlite3 - fi - do_and_check_cmd touch /var/tmp/bunkerweb_upgrade - ;; -esac diff --git a/src/linux/scripts/afterRemoveRPM.sh b/src/linux/scripts/afterRemoveRPM.sh index 6b102b4107..570cdf8bc4 100644 --- a/src/linux/scripts/afterRemoveRPM.sh +++ b/src/linux/scripts/afterRemoveRPM.sh @@ -1,15 +1,5 @@ #!/bin/bash -# Detect if running on FreeBSD and delegate to FreeBSD-specific script -if [ "$(uname)" = "FreeBSD" ]; then - if [ -f /usr/share/bunkerweb/scripts/afterRemoveFreeBSD.sh ]; then - exec /usr/share/bunkerweb/scripts/afterRemoveFreeBSD.sh "$@" - else - echo "❌ FreeBSD afterRemove script not found" - exit 1 - fi -fi - # Function to run a command and check its return code function do_and_check_cmd() { output=$("$@" 2>&1) diff --git a/src/linux/scripts/beforeInstallFreeBSD.sh b/src/linux/scripts/beforeInstallFreeBSD.sh deleted file mode 100644 index a8f6cf278d..0000000000 --- a/src/linux/scripts/beforeInstallFreeBSD.sh +++ /dev/null @@ -1,40 +0,0 @@ -#!/bin/sh - -# FreeBSD beforeInstall script for BunkerWeb - -# Function to run a command and check its return code -do_and_check_cmd() { - "$@" - ret=$? - if [ $ret -ne 0 ]; then - echo "[ERROR] Command failed: $*" - exit $ret - fi - return 0 -} - -if [ -d /etc/nginx ]; then - output_path="/etc/nginx_backup" - if [ ! -d "$output_path" ]; then - echo "[INFO] Copy /etc/nginx to $output_path" - do_and_check_cmd cp -R /etc/nginx "$output_path" - else - echo "[INFO] Backup directory $output_path already exists, skipping backup" - fi -fi - -# If version is older than or equal to 1.5.12 then create another file -if [ -f /usr/share/bunkerweb/VERSION ] && grep -Eq "^(0|1\\.[0-4])(\\..*)?$|^1\\.5\\.([0-9]|1[0-2])$" /usr/share/bunkerweb/VERSION; then - do_and_check_cmd touch /var/tmp/bunkerweb_enable_scheduler -fi - -# Create nginx user and group if they do not exist (FreeBSD specific) -if ! pw groupshow nginx >/dev/null 2>&1; then - echo "[INFO] Creating nginx group..." - pw groupadd nginx -fi - -if ! pw usershow nginx >/dev/null 2>&1; then - echo "[INFO] Creating nginx user..." - pw useradd nginx -g nginx -d /nonexistent -s /usr/sbin/nologin -c "nginx user" -fi diff --git a/src/linux/scripts/postinstall-freebsd.sh b/src/linux/scripts/postinstall-freebsd.sh deleted file mode 100644 index fe806b0fe0..0000000000 --- a/src/linux/scripts/postinstall-freebsd.sh +++ /dev/null @@ -1,434 +0,0 @@ -#!/bin/sh - -# FreeBSD postinstall script for BunkerWeb -# Uses rc.d init system instead of systemd - -# Function to run a command and check its return code -do_and_check_cmd() { - "$@" - ret=$? - if [ $ret -ne 0 ]; then - echo "[ERROR] Command failed: $*" - exit $ret - fi - return 0 -} - -# Decompress deps directory with pigz for fastest decompression -echo "Decompressing deps directory..." -cd /usr/share/bunkerweb || exit 1 -if [ -f "deps.tar.gz" ]; then - rm -rf deps - # Use pigz if available, fallback to gzip - if command -v pigz >/dev/null 2>&1; then - tar --use-compress-program="pigz -d" -xf deps.tar.gz - else - tar -xzf deps.tar.gz - fi - rm -f deps.tar.gz - echo "Decompression completed successfully" -else - echo "No compressed deps directory found, skipping decompression" -fi - -# Give all the permissions to the nginx user -echo "Setting ownership for all necessary directories to nginx user and group..." -do_and_check_cmd mkdir -p /var/cache/bunkerweb /var/lib/bunkerweb /etc/bunkerweb /var/tmp/bunkerweb /var/run/bunkerweb /var/log/bunkerweb -# Ensure a generic python3 entrypoint exists for components that invoke /usr/bin/env python3. -if [ ! -x /usr/local/bin/python3 ]; then - for pybin in /usr/local/bin/python3.13 /usr/local/bin/python3.12 /usr/local/bin/python3.11 /usr/local/bin/python3.10 /usr/bin/python3; do - if [ -x "$pybin" ]; then - do_and_check_cmd ln -sf "$pybin" /usr/local/bin/python3 - break - fi - done -fi -# FreeBSD nginx package uses /usr/local/etc/nginx, while BunkerWeb defaults to /etc/nginx. -# Keep both paths aligned so existing templates and scripts continue to work. -if [ ! -e /etc/nginx ] && [ -d /usr/local/etc/nginx ]; then - do_and_check_cmd ln -s /usr/local/etc/nginx /etc/nginx -fi -do_and_check_cmd chown -R root:nginx /usr/share/bunkerweb -do_and_check_cmd chown -R nginx:nginx /var/cache/bunkerweb /var/lib/bunkerweb /etc/bunkerweb /var/tmp/bunkerweb /var/run/bunkerweb /var/log/bunkerweb - -# Allow nginx worker to trigger only rc reload via sudo in API /reload fallback. -if [ -d /usr/local/etc/sudoers.d ]; then - cat > /usr/local/etc/sudoers.d/bunkerweb-nginx-reload << 'EOF' -nginx ALL=(root) NOPASSWD: /usr/sbin/service bunkerweb reload -EOF - chmod 440 /usr/local/etc/sudoers.d/bunkerweb-nginx-reload -fi - -chmod 755 /var/log/bunkerweb -chmod 770 /var/cache/bunkerweb/ /var/tmp/bunkerweb/ /var/run/bunkerweb/ -# Ensure temp dir enforces group inheritance and no access for others -chmod 2770 /var/tmp/bunkerweb/ -chmod -R 550 /usr/share/bunkerweb/ -find . \( -path "./api" -o -path "./scheduler" -o -path "./ui" -o -path "./cli" -o -path "./lua" -o -path "./core" -o -path "./db" -o -path "./gen" -o -path "./utils" -o -path "./helpers" -o -path "./scripts" -o -path "./deps" \) -prune -o -type f -print0 | xargs -0 chmod 440 -find api/ scheduler/ ui/ cli/ lua/ core/ db/ gen/ utils/ helpers/ scripts/ deps/ -type f ! -path "deps/python/bin/*" ! -name "*.lua" ! -name "*.py" ! -name "*.pyc" ! -name "*.sh" ! -name "*.so" -print0 | xargs -0 chmod 440 -if [ -d db/alembic/ ]; then - chmod -R 770 db/alembic/ -fi - -# Retro-tighten 0644 backups left by pre-fix versions. -chmod 0600 /var/tmp/variables.env /var/tmp/ui.env /var/tmp/scheduler.env \ - /var/tmp/api.env /var/tmp/api.yml /var/tmp/db.sqlite3 2>/dev/null || true - -# Function to migrate files from old locations to new ones -migrate_file() { - old_path="$1" - new_path="$2" - - if [ -f "$old_path" ]; then - echo "Old file $old_path found!" - if [ ! -f /var/tmp/bunkerweb_upgrade ]; then - touch /var/tmp/bunkerweb_upgrade - fi - echo "Copying old file to new location: $new_path..." - cp "$old_path" "$new_path" - echo "Removing old file..." - do_and_check_cmd rm -f "$old_path" - do_and_check_cmd chown root:nginx "$new_path" - do_and_check_cmd chmod 660 "$new_path" - return 0 - else - echo "Old file $old_path not found. Skipping copy..." - return 1 - fi -} - -# Migrate configuration files from old to new locations -migrate_file "/var/tmp/variables.env" "/etc/bunkerweb/variables.env" -migrate_file "/var/tmp/scheduler.env" "/etc/bunkerweb/scheduler.env" -migrate_file "/var/tmp/ui.env" "/etc/bunkerweb/ui.env" -migrate_file "/var/tmp/api.env" "/etc/bunkerweb/api.env" -migrate_file "/var/tmp/api.yml" "/etc/bunkerweb/api.yml" -migrate_file "/var/tmp/db.sqlite3" "/var/lib/bunkerweb/db.sqlite3" - -# Create /var/www/html if needed -if [ ! -d /var/www/html ]; then - echo "Creating /var/www/html directory ..." - do_and_check_cmd mkdir -p /var/www/html - do_and_check_cmd chmod 750 /var/www/html - do_and_check_cmd chown root:nginx /var/www/html -else - echo "/var/www/html directory already exists, skipping copy..." -fi - -# FreeBSD: Install rc.d scripts -echo "Installing rc.d service scripts..." -for script in bunkerweb bunkerweb_scheduler bunkerweb_ui bunkerweb_api; do - if [ -f "/usr/share/bunkerweb/rc.d/${script}" ]; then - do_and_check_cmd cp "/usr/share/bunkerweb/rc.d/${script}" "/usr/local/etc/rc.d/${script}" - do_and_check_cmd chmod 555 "/usr/local/etc/rc.d/${script}" - fi -done - -# Parse selected keys from variables.env in a POSIX-sh friendly way. -get_env_value() { - key="$1" - env_file="$2" - - [ -f "$env_file" ] || return 0 - awk -F "=" -v key="$key" '$1 == key {sub(/^[^=]*=/, ""); print; exit}' "$env_file" -} - -MANAGER_MODE=$(get_env_value "MANAGER_MODE" "/etc/bunkerweb/variables.env") -WORKER_MODE=$(get_env_value "WORKER_MODE" "/etc/bunkerweb/variables.env") -SERVICE_BUNKERWEB=$(get_env_value "SERVICE_BUNKERWEB" "/etc/bunkerweb/variables.env") -SERVICE_SCHEDULER=$(get_env_value "SERVICE_SCHEDULER" "/etc/bunkerweb/variables.env") -SERVICE_UI=$(get_env_value "SERVICE_UI" "/etc/bunkerweb/variables.env") -SERVICE_API=$(get_env_value "SERVICE_API" "/etc/bunkerweb/variables.env") -UI_WIZARD=$(get_env_value "UI_WIZARD" "/etc/bunkerweb/variables.env") - -# Resolve whether the topology was DECLARED this run — fresh install or an explicit -# mode/service signal (here read back from variables.env). On a bare `pkg upgrade` with -# no signal we mutate no persistent state: no self-heal of enabled-but-stopped units, -# no install-type marker write, leaving the upgrade-time detector to infer. Single gate -# behind the marker write and the enabled-but-stopped leg of the self-heal branches. -FRESH_INSTALL="no" -[ ! -f /var/tmp/bunkerweb_upgrade ] && FRESH_INSTALL="yes" -RESOLVED_INSTALL_TYPE="" -EXPLICIT_TOPOLOGY="no" -if [ "${WORKER_MODE:-no}" = "yes" ] && [ "${MANAGER_MODE:-no}" != "yes" ]; then - RESOLVED_INSTALL_TYPE="worker"; EXPLICIT_TOPOLOGY="yes" -elif [ "${MANAGER_MODE:-no}" = "yes" ] && [ "${WORKER_MODE:-no}" != "yes" ]; then - RESOLVED_INSTALL_TYPE="manager"; EXPLICIT_TOPOLOGY="yes" -elif [ "${SERVICE_API:-no}" = "yes" ] && [ "${SERVICE_BUNKERWEB:-yes}" = "no" ] && [ "${SERVICE_SCHEDULER:-yes}" = "no" ] && [ "${SERVICE_UI:-yes}" = "no" ]; then - RESOLVED_INSTALL_TYPE="api"; EXPLICIT_TOPOLOGY="yes" -elif [ "${SERVICE_BUNKERWEB:-yes}" = "no" ] && [ "${SERVICE_SCHEDULER:-no}" = "yes" ] && [ "${SERVICE_UI:-yes}" = "no" ]; then - RESOLVED_INSTALL_TYPE="scheduler"; EXPLICIT_TOPOLOGY="yes" -elif [ "${SERVICE_BUNKERWEB:-yes}" = "no" ] && [ "${SERVICE_UI:-no}" = "yes" ] && [ "${SERVICE_SCHEDULER:-yes}" = "no" ]; then - RESOLVED_INSTALL_TYPE="ui"; EXPLICIT_TOPOLOGY="yes" -else - RESOLVED_INSTALL_TYPE="full" -fi -TOPOLOGY_DECLARED="no" -{ [ "$FRESH_INSTALL" = "yes" ] || [ "$EXPLICIT_TOPOLOGY" = "yes" ]; } && TOPOLOGY_DECLARED="yes" - -# FreeBSD: Stop nginx if running -if service nginx status >/dev/null 2>&1; then - echo "[STOP] Stopping nginx service..." - service nginx stop || true -fi - -# Helper functions for FreeBSD service management -service_is_enabled() { - service_name="$1" - rc_conf_file="/etc/rc.conf.d/${service_name}" - - if [ -f "$rc_conf_file" ]; then - enabled_value=$(sysrc -f "$rc_conf_file" -n "${service_name}_enable" 2>/dev/null || true) - echo "$enabled_value" | grep -qi "yes" - return $? - fi - - sysrc -n "${service_name}_enable" 2>/dev/null | grep -qi "yes" -} - -service_is_running() { - service "$1" status >/dev/null 2>&1 -} - -service_enable() { - service_name="$1" - rc_conf_file="/etc/rc.conf.d/${service_name}" - mkdir -p /etc/rc.conf.d - sysrc -f "$rc_conf_file" "${service_name}_enable=YES" >/dev/null 2>&1 -} - -service_disable() { - service_name="$1" - rc_conf_file="/etc/rc.conf.d/${service_name}" - mkdir -p /etc/rc.conf.d - sysrc -f "$rc_conf_file" "${service_name}_enable=NO" >/dev/null 2>&1 -} - -service_start() { - # Avoid running long-lived foreground commands during pkg transactions. - # rc.d services can be started manually right after installation. - echo "[INFO] Skipping automatic start of $1 during package installation." - echo "[INFO] Start it manually with: service $1 start" - return 0 -} - -service_stop() { - service "$1" stop 2>/dev/null || true -} - -service_restart() { - # Avoid blocking package upgrades in post-install hooks. - echo "[INFO] Skipping automatic restart of $1 during package installation." - echo "[INFO] Restart it manually with: service $1 restart" - return 0 -} - -# Manage the BunkerWeb service -echo "Configuring BunkerWeb service..." - -# Logic: enable if (standalone mode) OR (worker mode only) AND service not disabled -if { - # Standalone mode (no manager or worker specified) - { [ -z "$MANAGER_MODE" ] && [ -z "$WORKER_MODE" ]; } || - # Worker mode only (manager disabled or unset, worker enabled) - { [ -z "$MANAGER_MODE" ] || { [ "${MANAGER_MODE:-yes}" = "no" ] && [ "${WORKER_MODE:-no}" != "no" ]; }; } -} && [ "$SERVICE_BUNKERWEB" != "no" ]; then - # Upgrade scenario - if [ -f /var/tmp/bunkerweb_upgrade ]; then - if service_is_running bunkerweb; then - echo "[INFO] Restarting the BunkerWeb service after upgrade..." - do_and_check_cmd service_restart bunkerweb - fi - # Fresh installation scenario - else - echo "[INFO] Enabling and starting the BunkerWeb service..." - do_and_check_cmd service_enable bunkerweb - do_and_check_cmd service_start bunkerweb - fi -# Disable BunkerWeb if it should not be running but is still active, or — only when the -# topology was declared this run — enabled-but-stopped. Clearing leftovers keeps rc.d -# state consistent with the real topology so upgrade-time detection stays correct; on a -# bare upgrade we never touch enabled-but-stopped units. -elif service_is_running bunkerweb || { [ "$TOPOLOGY_DECLARED" = "yes" ] && service_is_enabled bunkerweb; }; then - echo "[STOP] Disabling and stopping the BunkerWeb service..." - service_stop bunkerweb - service_disable bunkerweb -else - echo "[INFO] BunkerWeb service is not enabled in the current configuration." -fi - -# Manage the BunkerWeb Scheduler service -echo "Configuring BunkerWeb Scheduler service..." - -# Enable scheduler if: (standalone mode OR manager-only mode) AND service not disabled -if { - # Standalone mode (no manager or worker specified) - { [ -z "$MANAGER_MODE" ] && [ -z "$WORKER_MODE" ]; } || - # Manager-only mode (manager enabled, worker disabled) - { [ "${MANAGER_MODE:-yes}" != "no" ] && [ "${WORKER_MODE:-no}" = "no" ]; } -} && [ "$SERVICE_SCHEDULER" != "no" ]; then - # Fresh installation or explicit scheduler enablement - if [ -f /var/tmp/bunkerweb_enable_scheduler ] || [ ! -f /var/tmp/bunkerweb_upgrade ]; then - echo "[INFO] Enabling and starting the BunkerWeb Scheduler service..." - do_and_check_cmd service_enable bunkerweb_scheduler - do_and_check_cmd service_start bunkerweb_scheduler - - # Clean up scheduler enablement flag if it exists - if [ -f /var/tmp/bunkerweb_enable_scheduler ]; then - echo "[INFO] Removing scheduler enablement flag..." - do_and_check_cmd rm -f /var/tmp/bunkerweb_enable_scheduler - fi - # Upgrade scenario - else - # Restart the scheduler service only if it is already running - if service_is_running bunkerweb_scheduler; then - echo "[INFO] Restarting the BunkerWeb Scheduler service after upgrade..." - do_and_check_cmd service_restart bunkerweb_scheduler - fi - fi -# Disable scheduler if it should not be running but is still active, or — only when the -# topology was declared this run — enabled-but-stopped. -elif service_is_running bunkerweb_scheduler || { [ "$TOPOLOGY_DECLARED" = "yes" ] && service_is_enabled bunkerweb_scheduler; }; then - echo "[STOP] Disabling and stopping the BunkerWeb Scheduler service..." - service_stop bunkerweb_scheduler - service_disable bunkerweb_scheduler -else - echo "[INFO] BunkerWeb Scheduler service is not enabled in the current configuration." -fi - -# Manage the BunkerWeb UI service -echo "Configuring BunkerWeb UI service..." - -# Determine if BunkerWeb UI should be enabled based on modes -if { - # Standalone mode (no manager or worker specified) - { [ -z "$MANAGER_MODE" ] && [ -z "$WORKER_MODE" ]; } || - # Manager-only mode (manager enabled, worker disabled) - { [ "${MANAGER_MODE:-yes}" != "no" ] && [ "${WORKER_MODE:-no}" = "no" ]; } -} && [ "$SERVICE_UI" != "no" ]; then - # Fresh installation or explicit UI enablement - if [ ! -f /var/tmp/bunkerweb_upgrade ]; then - if [ "${UI_WIZARD:-yes}" != "no" ]; then - echo "[INFO] Setting up BunkerWeb UI with wizard..." - - # Create default configuration for new installations - if [ ! -f /etc/bunkerweb/variables.env ] || grep -q "IS_LOADING=yes" /etc/bunkerweb/variables.env; then - cat > /etc/bunkerweb/variables.env << EOF -DNS_RESOLVERS=9.9.9.9 149.112.112.112 8.8.8.8 8.8.4.4 -HTTP_PORT=80 -HTTPS_PORT=443 -API_LISTEN_IP=127.0.0.1 -MULTISITE=yes -UI_HOST=http://127.0.0.1:7000 -SERVER_NAME= -EOF - fi - - # Create empty UI environment file if it does not exist - if [ ! -f /etc/bunkerweb/ui.env ]; then - touch /etc/bunkerweb/ui.env - fi - - # Set proper permissions - do_and_check_cmd chown root:nginx /etc/bunkerweb/ui.env /etc/bunkerweb/variables.env - do_and_check_cmd chmod 660 /etc/bunkerweb/ui.env /etc/bunkerweb/variables.env - - echo "[INFO] Enabling and starting the BunkerWeb UI service..." - do_and_check_cmd service_enable bunkerweb_ui - do_and_check_cmd service_start bunkerweb_ui - - echo "[INFO] The setup wizard is enabled." - echo "[INFO] Start the UI service, then complete initial configuration at: https://your-ip-address-or-fqdn/setup" - echo "" - echo "[WARN] Note: Make sure that your firewall settings allow access to this URL." - echo "" - elif [ "$SERVICE_UI" = "yes" ]; then - echo "[INFO] Enabling and starting the BunkerWeb UI service..." - do_and_check_cmd service_enable bunkerweb_ui - do_and_check_cmd service_start bunkerweb_ui - else - echo "[INFO] BunkerWeb UI service is not enabled in the current configuration." - fi - # Upgrade scenario - else - # Restart the UI service only if it is already running - if service_is_running bunkerweb_ui; then - echo "[INFO] Restarting the BunkerWeb UI service after upgrade..." - do_and_check_cmd service_restart bunkerweb_ui - fi - fi -# Disable UI if it should not be running but is still active, or — only when the -# topology was declared this run — enabled-but-stopped. -elif service_is_running bunkerweb_ui || { [ "$TOPOLOGY_DECLARED" = "yes" ] && service_is_enabled bunkerweb_ui; }; then - echo "[STOP] Disabling and stopping the BunkerWeb UI service..." - service_stop bunkerweb_ui - service_disable bunkerweb_ui -else - echo "[INFO] BunkerWeb UI service is not enabled in the current configuration." -fi - -# Manage the BunkerWeb API service -echo "Configuring BunkerWeb API service..." - -# Enable API only when explicitly requested (via env or flag) -if [ "${SERVICE_API:-no}" = "yes" ]; then - # Fresh installation or explicit API enablement - if [ ! -f /var/tmp/bunkerweb_upgrade ]; then - echo "[INFO] Enabling and starting the BunkerWeb API service..." - do_and_check_cmd service_enable bunkerweb_api - do_and_check_cmd service_start bunkerweb_api - else - # Restart API only if already running - if service_is_running bunkerweb_api; then - echo "[INFO] Restarting the BunkerWeb API service after upgrade..." - do_and_check_cmd service_restart bunkerweb_api - fi - fi -elif service_is_running bunkerweb_api || { [ "$TOPOLOGY_DECLARED" = "yes" ] && service_is_enabled bunkerweb_api; }; then - echo "[STOP] Disabling and stopping the BunkerWeb API service..." - service_stop bunkerweb_api - service_disable bunkerweb_api -else - echo "[INFO] BunkerWeb API service is not enabled in the current configuration." -fi - -# Record the resolved install type so future upgrades detect it deterministically -# instead of inferring from rc.d state. Only written when the topology was declared this -# run (fresh install, or explicit mode/service signal) — a bare `pkg upgrade` carries no -# intent, so we must NOT stamp the standalone "full" default onto a legacy -# worker/scheduler/ui/api host and have it override inference forever. -INSTALL_TYPE_MARKER="/usr/share/bunkerweb/INSTALL_TYPE" -if [ "$TOPOLOGY_DECLARED" = "yes" ] && [ -n "$RESOLVED_INSTALL_TYPE" ]; then - echo "$RESOLVED_INSTALL_TYPE" > "$INSTALL_TYPE_MARKER" 2>/dev/null \ - && chmod 0644 "$INSTALL_TYPE_MARKER" 2>/dev/null \ - || echo "[INFO] Note: could not persist install-type marker at $INSTALL_TYPE_MARKER" -fi - -if [ -f /var/tmp/bunkerweb_upgrade ]; then - rm -f /var/tmp/bunkerweb_upgrade - echo "BunkerWeb has been successfully upgraded!" -else - echo "BunkerWeb has been successfully installed!" -fi - -echo "" -echo "For more information on BunkerWeb, visit:" -echo " * Official website: https://www.bunkerweb.io" -echo " * Documentation: https://docs.bunkerweb.io" -echo " * Community Support: https://discord.bunkerity.com" -echo " * Commercial Support: https://panel.bunkerweb.io/store/support" -echo "[INFO] Thank you for using BunkerWeb!" - -echo "" -echo "[INFO] FreeBSD Notes:" -echo " * Services are managed via rc.d: service bunkerweb start|stop|restart" -echo " * Enable services in /etc/rc.conf.d: sysrc -f /etc/rc.conf.d/bunkerweb bunkerweb_enable=YES" -echo " * Configuration files are in /etc/bunkerweb/" -echo "" -echo "[INFO] External Database Clients:" -echo " * If you plan on using an external database (MariaDB, MySQL, or PostgreSQL)," -echo " install the client package that matches your database server version." -echo " You can list available clients with:" -echo " pkg search mariadb" -echo " pkg search mysql" -echo " pkg search postgresql" diff --git a/src/linux/scripts/postinstall.sh b/src/linux/scripts/postinstall.sh index 1913baab4f..26604c0062 100644 --- a/src/linux/scripts/postinstall.sh +++ b/src/linux/scripts/postinstall.sh @@ -1,15 +1,5 @@ #!/bin/bash -# Detect if running on FreeBSD and delegate to FreeBSD-specific script -if [ "$(uname)" = "FreeBSD" ]; then - if [ -f /usr/share/bunkerweb/scripts/postinstall-freebsd.sh ]; then - exec /usr/share/bunkerweb/scripts/postinstall-freebsd.sh "$@" - else - echo "❌ FreeBSD postinstall script not found" - exit 1 - fi -fi - # Function to run a command and check its return code function do_and_check_cmd() { output=$("$@" 2>&1) From 2bb4f139dec7a193d577f6e9be1e66d2b41155d8 Mon Sep 17 00:00:00 2001 From: TheophileDiot Date: Thu, 23 Jul 2026 12:14:19 +0200 Subject: [PATCH 04/25] feat(headers): sync Permissions-Policy defaults with Chromium --- docs/de/features.md | 3 ++- docs/es/features.md | 3 ++- docs/features.md | 3 ++- docs/fr/features.md | 3 ++- docs/zh/features.md | 3 ++- src/common/confs/default-server-http.conf | 2 +- src/common/core/errors/errors.lua | 2 +- src/common/core/headers/README.de.md | 3 ++- src/common/core/headers/README.es.md | 3 ++- src/common/core/headers/README.fr.md | 3 ++- src/common/core/headers/README.md | 3 ++- src/common/core/headers/README.zh.md | 3 ++- src/common/core/headers/plugin.json | 4 ++-- src/common/core/misc/confs/default-server-http/page.conf | 2 +- src/common/core/templates/templates/high.json | 2 +- src/common/core/templates/templates/medium.json | 2 +- src/ui/main.py | 2 +- 17 files changed, 28 insertions(+), 18 deletions(-) diff --git a/docs/de/features.md b/docs/de/features.md index 28b5efc5a4..8c7a1befe3 100644 --- a/docs/de/features.md +++ b/docs/de/features.md @@ -2875,7 +2875,7 @@ Führen Sie die folgenden Schritte aus, um die Headers-Funktion zu konfigurieren | `X_CONTENT_TYPE_OPTIONS` | `nosniff` | multisite | nein | **X-Content-Type-Options:** Verhindert, dass Browser MIME-Sniffing betreiben, und schützt so vor Drive-by-Download-Angriffen. | | `X_DNS_PREFETCH_CONTROL` | `off` | multisite | nein | **X-DNS-Prefetch-Control:** Reguliert das DNS-Prefetching, um unbeabsichtigte Netzwerkanfragen zu reduzieren und die Privatsphäre zu verbessern. | | `REFERRER_POLICY` | `strict-origin-when-cross-origin` | multisite | nein | **Referrer Policy:** Steuert die Menge der gesendeten Referrer-Informationen und schützt die Privatsphäre der Benutzer. | - | `PERMISSIONS_POLICY` | `accelerometer=(), ambient-light-sensor=(), attribution-reporting=(), autoplay=(), battery=(), ...` | multisite | nein | **Permissions Policy:** Beschränkt den Zugriff auf Browserfunktionen und reduziert potenzielle Angriffsvektoren. | + | `PERMISSIONS_POLICY` | `accelerometer=(), ambient-light-sensor=(), attribution-reporting=(), autoplay=(), bluetooth=(), ...` | multisite | nein | **Permissions Policy:** Beschränkt den Zugriff auf Browserfunktionen und reduziert potenzielle Angriffsvektoren. | | `KEEP_UPSTREAM_HEADERS` | `Content-Security-Policy Content-Security-Policy-Report-Only Permissions-Policy X-Frame-Options` | multisite | nein | **Header beibehalten:** Behält ausgewählte Upstream-Header bei, was die Integration von Altsystemen erleichtert und gleichzeitig die Sicherheit aufrechterhält. | !!! tip "Bewährte Praktiken" @@ -2883,6 +2883,7 @@ Führen Sie die folgenden Schritte aus, um die Headers-Funktion zu konfigurieren - Verwenden Sie Tools wie das [Mozilla Observatory](https://observatory.mozilla.org/), um Ihre Header-Konfiguration zu validieren. - Testen Sie CSP im `Report-Only`-Modus, bevor Sie es erzwingen, um zu vermeiden, dass die Funktionalität beeinträchtigt wird. - Im `Report-Only`-Modus wird ein vom Upstream gesendeter `Content-Security-Policy`- oder `Content-Security-Policy-Report-Only`-Header standardmäßig beibehalten (`KEEP_UPSTREAM_HEADERS`); entfernen Sie den Header-Namen aus dieser Einstellung, damit die eigene Richtlinie von BunkerWeb Vorrang hat. + - Die standardmäßige `PERMISSIONS_POLICY` blockiert auch Client Hints (`ch-*`-Direktiven); wenn ein Dienst auf `Accept-CH` angewiesen ist (zum Beispiel Client-Hint-basierte responsive Bilder oder die Dunkelmodus-Erkennung über `Sec-CH-Prefers-Color-Scheme`), passen Sie `PERMISSIONS_POLICY` an, um die benötigten `ch-*`-Funktionen wieder zuzulassen (zum Beispiel `ch-dpr=(self)`). === "Cookie-Einstellungen" diff --git a/docs/es/features.md b/docs/es/features.md index a4217ba59d..d68e073a2b 100644 --- a/docs/es/features.md +++ b/docs/es/features.md @@ -2928,7 +2928,7 @@ Siga estos pasos para configurar y usar la función de Cabeceras: | `X_CONTENT_TYPE_OPTIONS` | `nosniff` | multisite | no | **X-Content-Type-Options:** Evita que los navegadores realicen "MIME-sniffing", protegiendo contra ataques de descarga no autorizada (drive-by download). | | `X_DNS_PREFETCH_CONTROL` | `off` | multisite | no | **X-DNS-Prefetch-Control:** Regula la captación previa de DNS para reducir las solicitudes de red no intencionadas y mejorar la privacidad. | | `REFERRER_POLICY` | `strict-origin-when-cross-origin` | multisite | no | **Política de Referencia:** Controla la cantidad de información de referencia enviada, salvaguardando la privacidad del usuario. | -| `PERMISSIONS_POLICY` | `accelerometer=(), ambient-light-sensor=(), attribution-reporting=(), autoplay=(), battery=(), ...` | multisite | no | **Política de Permisos:** Restringe el acceso a las funciones del navegador, reduciendo los posibles vectores de ataque. | +| `PERMISSIONS_POLICY` | `accelerometer=(), ambient-light-sensor=(), attribution-reporting=(), autoplay=(), bluetooth=(), ...` | multisite | no | **Política de Permisos:** Restringe el acceso a las funciones del navegador, reduciendo los posibles vectores de ataque. | | `KEEP_UPSTREAM_HEADERS` | `Content-Security-Policy Content-Security-Policy-Report-Only Permissions-Policy X-Frame-Options` | multisite | no | **Conservar Cabeceras:** Preserva las cabeceras de origen seleccionadas, ayudando a la integración con sistemas heredados mientras se mantiene la seguridad. | !!! tip "Mejores Prácticas" @@ -2936,6 +2936,7 @@ Siga estos pasos para configurar y usar la función de Cabeceras: - Use herramientas como [Mozilla Observatory](https://observatory.mozilla.org/) para validar la configuración de sus cabeceras. - Pruebe el CSP en modo `Report-Only` antes de aplicarlo para evitar romper la funcionalidad. - En modo `Report-Only`, una cabecera `Content-Security-Policy` o `Content-Security-Policy-Report-Only` enviada por el origen se conserva de forma predeterminada (`KEEP_UPSTREAM_HEADERS`); elimine el nombre de la cabecera de ese ajuste para que la propia política de BunkerWeb tenga prioridad. + - La `PERMISSIONS_POLICY` predeterminada también bloquea los client hints (directivas `ch-*`); si un servicio depende de `Accept-CH` (por ejemplo, imágenes responsivas basadas en client hints o la detección del modo oscuro mediante `Sec-CH-Prefers-Color-Scheme`), anule `PERMISSIONS_POLICY` para volver a permitir las funciones `ch-*` necesarias (por ejemplo, `ch-dpr=(self)`). === "Configuración de Cookies" diff --git a/docs/features.md b/docs/features.md index 1bbe0908e4..1ea583309a 100644 --- a/docs/features.md +++ b/docs/features.md @@ -2942,7 +2942,7 @@ Follow these steps to configure and use the Headers feature: | `X_CONTENT_TYPE_OPTIONS` | `nosniff` | multisite | no | **X-Content-Type-Options:** Prevents browsers from MIME-sniffing, protecting against drive-by download attacks. | | `X_DNS_PREFETCH_CONTROL` | `off` | multisite | no | **X-DNS-Prefetch-Control:** Regulates DNS prefetching to reduce unintentional network requests and enhance privacy. | | `REFERRER_POLICY` | `strict-origin-when-cross-origin` | multisite | no | **Referrer Policy:** Controls the amount of referrer information sent, safeguarding user privacy. | - | `PERMISSIONS_POLICY` | `accelerometer=(), ambient-light-sensor=(), attribution-reporting=(), autoplay=(), battery=(), ...` | multisite | no | **Permissions Policy:** Restricts browser feature access, reducing potential attack vectors. | + | `PERMISSIONS_POLICY` | `accelerometer=(), ambient-light-sensor=(), attribution-reporting=(), autoplay=(), bluetooth=(), ...` | multisite | no | **Permissions Policy:** Restricts browser feature access, reducing potential attack vectors. | | `KEEP_UPSTREAM_HEADERS` | `Content-Security-Policy Content-Security-Policy-Report-Only Permissions-Policy X-Frame-Options` | multisite | no | **Keep Headers:** Preserves selected upstream headers, aiding legacy integration while maintaining security. | !!! tip "Best Practices" @@ -2950,6 +2950,7 @@ Follow these steps to configure and use the Headers feature: - Use tools like [Mozilla Observatory](https://observatory.mozilla.org/) to validate your header configuration. - Test CSP in `Report-Only` mode before enforcing it to avoid breaking functionality. - In `Report-Only` mode, an upstream `Content-Security-Policy` or `Content-Security-Policy-Report-Only` header is preserved by default (`KEEP_UPSTREAM_HEADERS`); remove the header name from that setting for BunkerWeb's own policy to take precedence. + - The default `PERMISSIONS_POLICY` also blocks client hints (`ch-*` directives); if a service relies on `Accept-CH` (for example client-hint responsive images or `Sec-CH-Prefers-Color-Scheme` dark-mode detection), override `PERMISSIONS_POLICY` to re-allow the needed `ch-*` features (for example `ch-dpr=(self)`). === "Cookie Settings" diff --git a/docs/fr/features.md b/docs/fr/features.md index ea7823a35a..58d1cb772a 100644 --- a/docs/fr/features.md +++ b/docs/fr/features.md @@ -2838,7 +2838,7 @@ Suivez ces étapes pour configurer et utiliser la fonctionnalité Headers : | `X_CONTENT_TYPE_OPTIONS` | `nosniff` | multisite | non | **X-Content-Type-Options :** Empêche les navigateurs de "MIME-sniffer", protégeant contre les attaques de type "drive-by download". | | `X_DNS_PREFETCH_CONTROL` | `off` | multisite | non | **X-DNS-Prefetch-Control :** Régule le préchargement DNS pour réduire les requêtes réseau involontaires et améliorer la confidentialité. | | `REFERRER_POLICY` | `strict-origin-when-cross-origin` | multisite | non | **Politique de Referrer :** Contrôle la quantité d'informations de référent envoyées, protégeant la vie privée de l'utilisateur. | - | `PERMISSIONS_POLICY` | `accelerometer=(), ambient-light-sensor=(), attribution-reporting=(), autoplay=(), battery=(), ...` | multisite | non | **Politique de permissions :** Restreint l'accès aux fonctionnalités du navigateur, réduisant les vecteurs d'attaque potentiels. | + | `PERMISSIONS_POLICY` | `accelerometer=(), ambient-light-sensor=(), attribution-reporting=(), autoplay=(), bluetooth=(), ...` | multisite | non | **Politique de permissions :** Restreint l'accès aux fonctionnalités du navigateur, réduisant les vecteurs d'attaque potentiels. | | `KEEP_UPSTREAM_HEADERS` | `Content-Security-Policy Content-Security-Policy-Report-Only Permissions-Policy X-Frame-Options` | multisite | non | **Conserver les en-têtes :** Préserve les en-têtes en amont sélectionnés, facilitant l'intégration héritée tout en maintenant la sécurité. | !!! tip "Bonnes pratiques" @@ -2846,6 +2846,7 @@ Suivez ces étapes pour configurer et utiliser la fonctionnalité Headers : - Utilisez des outils comme [Mozilla Observatory](https://observatory.mozilla.org/) pour valider la configuration de vos en-têtes. - Testez la CSP en mode `Report-Only` avant de l'appliquer pour éviter de casser des fonctionnalités. - En mode `Report-Only`, un en-tête `Content-Security-Policy` ou `Content-Security-Policy-Report-Only` fourni par l'amont est conservé par défaut (`KEEP_UPSTREAM_HEADERS`) ; retirez le nom de l'en-tête de ce paramètre pour que la politique de BunkerWeb prenne le dessus. + - La `PERMISSIONS_POLICY` par défaut bloque également les client hints (directives `ch-*`) ; si un service dépend d'`Accept-CH` (par exemple des images adaptatives basées sur les client hints ou la détection du mode sombre via `Sec-CH-Prefers-Color-Scheme`), personnalisez `PERMISSIONS_POLICY` pour réautoriser les fonctionnalités `ch-*` nécessaires (par exemple `ch-dpr=(self)`). === "Paramètres des cookies" diff --git a/docs/zh/features.md b/docs/zh/features.md index f2ae9f986c..2ce91b207f 100644 --- a/docs/zh/features.md +++ b/docs/zh/features.md @@ -2938,7 +2938,7 @@ STREAM 支持 :x: | `X_CONTENT_TYPE_OPTIONS` | `nosniff` | multisite | 否 | **X-Content-Type-Options:** 防止浏览器进行 MIME 嗅探,防止路过式下载攻击。 | | `X_DNS_PREFETCH_CONTROL` | `off` | multisite | 否 | **X-DNS-Prefetch-Control:** 调节 DNS 预取以减少无意的网络请求并增强隐私。 | | `REFERRER_POLICY` | `strict-origin-when-cross-origin` | multisite | 否 | **Referrer Policy:** 控制发送的引荐来源信息的数量,保护用户隐私。 | - | `PERMISSIONS_POLICY` | `accelerometer=(), ambient-light-sensor=(), attribution-reporting=(), autoplay=(), battery=(), ...` | multisite | 否 | **Permissions Policy:** 限制浏览器功能访问,减少潜在的攻击向量。 | + | `PERMISSIONS_POLICY` | `accelerometer=(), ambient-light-sensor=(), attribution-reporting=(), autoplay=(), bluetooth=(), ...` | multisite | 否 | **Permissions Policy:** 限制浏览器功能访问,减少潜在的攻击向量。 | | `KEEP_UPSTREAM_HEADERS` | `Content-Security-Policy Content-Security-Policy-Report-Only Permissions-Policy X-Frame-Options` | multisite | 否 | **保留标头:** 保留选定的上游标头,在保持安全性的同时帮助旧版集成。 | !!! tip "最佳实践" @@ -2946,6 +2946,7 @@ STREAM 支持 :x: - 使用像 [Mozilla Observatory](https://observatory.mozilla.org/) 这样的工具来验证您的标头配置。 - 在强制执行 CSP 之前,在 `Report-Only` 模式下进行测试,以避免破坏功能。 - 在 `Report-Only` 模式下,上游发送的 `Content-Security-Policy` 或 `Content-Security-Policy-Report-Only` 标头默认会被保留(`KEEP_UPSTREAM_HEADERS`);从该设置中移除相应的标头名称,BunkerWeb 自身的策略才会生效。 + - 默认的 `PERMISSIONS_POLICY` 也会阻止客户端提示(`ch-*` 指令);如果某个服务依赖 `Accept-CH`(例如基于客户端提示的响应式图片或通过 `Sec-CH-Prefers-Color-Scheme` 进行的深色模式检测),请覆盖 `PERMISSIONS_POLICY` 以重新允许所需的 `ch-*` 功能(例如 `ch-dpr=(self)`)。 === "Cookie 设置" diff --git a/src/common/confs/default-server-http.conf b/src/common/confs/default-server-http.conf index 35386390f7..f198a284f5 100644 --- a/src/common/confs/default-server-http.conf +++ b/src/common/confs/default-server-http.conf @@ -215,7 +215,7 @@ server { ngx.header["Referrer-Policy"] = "no-referrer" -- Override Permissions-Policy header - ngx.header["Permissions-Policy"] = "accelerometer=(), ambient-light-sensor=(), attribution-reporting=(), autoplay=(), battery=(), bluetooth=(), browsing-topics=(), camera=(), compute-pressure=(), display-capture=(), encrypted-media=(), execution-while-not-rendered=(), execution-while-out-of-viewport=(), fullscreen=(), gamepad=(), geolocation=(), gyroscope=(), hid=(), identity-credentials-get=(), idle-detection=(), local-fonts=(), magnetometer=(), microphone=(), midi=(), otp-credentials=(), payment=(), picture-in-picture=(), publickey-credentials-create=(), publickey-credentials-get=(), screen-wake-lock=(), serial=(), speaker-selection=(), storage-access=(), usb=(), web-share=(), window-management=(), xr-spatial-tracking=(), interest-cohort=(), language-detector=(), language-model=(), proofreader=(), rewriter=(), translator=(), writer=()" + ngx.header["Permissions-Policy"] = "accelerometer=(), ambient-light-sensor=(), attribution-reporting=(), autoplay=(), battery=(), bluetooth=(), browsing-topics=(), camera=(), compute-pressure=(), display-capture=(), encrypted-media=(), execution-while-not-rendered=(), execution-while-out-of-viewport=(), fullscreen=(), gamepad=(), geolocation=(), gyroscope=(), hid=(), identity-credentials-get=(), idle-detection=(), local-fonts=(), magnetometer=(), microphone=(), midi=(), otp-credentials=(), payment=(), picture-in-picture=(), publickey-credentials-create=(), publickey-credentials-get=(), screen-wake-lock=(), serial=(), speaker-selection=(), storage-access=(), usb=(), web-share=(), window-management=(), xr-spatial-tracking=(), interest-cohort=(), language-detector=(), language-model=(), proofreader=(), rewriter=(), translator=(), writer=(), ch-device-memory=(), ch-downlink=(), ch-dpr=(), ch-ect=(), ch-prefers-color-scheme=(), ch-prefers-reduced-motion=(), ch-prefers-reduced-transparency=(), ch-rtt=(), ch-save-data=(), ch-ua=(), ch-ua-arch=(), ch-ua-bitness=(), ch-ua-form-factors=(), ch-ua-full-version=(), ch-ua-full-version-list=(), ch-ua-mobile=(), ch-ua-model=(), ch-ua-platform=(), ch-ua-platform-version=(), ch-ua-wow64=(), ch-viewport-height=(), ch-viewport-width=(), ch-width=(), device-attributes=(), digital-credentials-create=(), digital-credentials-get=(), focus-without-user-activation=(), join-ad-interest-group=(), keyboard-map=(), manual-text=(), media-playback-while-not-visible=(), private-aggregation=(), record-ad-auction-events=(), run-ad-auction=(), shared-storage=(), shared-storage-select-url=(), tools=(), unload=(), vertical-scroll=(), web-app-installation=(), webnn=()" -- Override Content-Type header ngx.header["Content-Type"] = "text/html; charset=utf-8" diff --git a/src/common/core/errors/errors.lua b/src/common/core/errors/errors.lua index d37163c061..78a8692d7e 100644 --- a/src/common/core/errors/errors.lua +++ b/src/common/core/errors/errors.lua @@ -158,7 +158,7 @@ function errors:render_template(code) -- Override Permissions-Policy header ngx.header["Permissions-Policy"] = - "accelerometer=(), ambient-light-sensor=(), attribution-reporting=(), autoplay=(), battery=(), bluetooth=(), browsing-topics=(), camera=(), compute-pressure=(), display-capture=(), encrypted-media=(), execution-while-not-rendered=(), execution-while-out-of-viewport=(), fullscreen=(), gamepad=(), geolocation=(), gyroscope=(), hid=(), identity-credentials-get=(), idle-detection=(), local-fonts=(), magnetometer=(), microphone=(), midi=(), otp-credentials=(), payment=(), picture-in-picture=(), publickey-credentials-create=(), publickey-credentials-get=(), screen-wake-lock=(), serial=(), speaker-selection=(), storage-access=(), usb=(), web-share=(), window-management=(), xr-spatial-tracking=(), interest-cohort=(), language-detector=(), language-model=(), proofreader=(), rewriter=(), translator=(), writer=()" + "accelerometer=(), ambient-light-sensor=(), attribution-reporting=(), autoplay=(), battery=(), bluetooth=(), browsing-topics=(), camera=(), compute-pressure=(), display-capture=(), encrypted-media=(), execution-while-not-rendered=(), execution-while-out-of-viewport=(), fullscreen=(), gamepad=(), geolocation=(), gyroscope=(), hid=(), identity-credentials-get=(), idle-detection=(), local-fonts=(), magnetometer=(), microphone=(), midi=(), otp-credentials=(), payment=(), picture-in-picture=(), publickey-credentials-create=(), publickey-credentials-get=(), screen-wake-lock=(), serial=(), speaker-selection=(), storage-access=(), usb=(), web-share=(), window-management=(), xr-spatial-tracking=(), interest-cohort=(), language-detector=(), language-model=(), proofreader=(), rewriter=(), translator=(), writer=(), ch-device-memory=(), ch-downlink=(), ch-dpr=(), ch-ect=(), ch-prefers-color-scheme=(), ch-prefers-reduced-motion=(), ch-prefers-reduced-transparency=(), ch-rtt=(), ch-save-data=(), ch-ua=(), ch-ua-arch=(), ch-ua-bitness=(), ch-ua-form-factors=(), ch-ua-full-version=(), ch-ua-full-version-list=(), ch-ua-mobile=(), ch-ua-model=(), ch-ua-platform=(), ch-ua-platform-version=(), ch-ua-wow64=(), ch-viewport-height=(), ch-viewport-width=(), ch-width=(), device-attributes=(), digital-credentials-create=(), digital-credentials-get=(), focus-without-user-activation=(), join-ad-interest-group=(), keyboard-map=(), manual-text=(), media-playback-while-not-visible=(), private-aggregation=(), record-ad-auction-events=(), run-ad-auction=(), shared-storage=(), shared-storage-select-url=(), tools=(), unload=(), vertical-scroll=(), web-app-installation=(), webnn=()" -- Override Content-Type header ngx.header["Content-Type"] = "text/html; charset=utf-8" diff --git a/src/common/core/headers/README.de.md b/src/common/core/headers/README.de.md index 8b350d8795..651b3109f4 100644 --- a/src/common/core/headers/README.de.md +++ b/src/common/core/headers/README.de.md @@ -43,7 +43,7 @@ Führen Sie die folgenden Schritte aus, um die Headers-Funktion zu konfigurieren | `X_CONTENT_TYPE_OPTIONS` | `nosniff` | multisite | nein | **X-Content-Type-Options:** Verhindert, dass Browser MIME-Sniffing betreiben, und schützt so vor Drive-by-Download-Angriffen. | | `X_DNS_PREFETCH_CONTROL` | `off` | multisite | nein | **X-DNS-Prefetch-Control:** Reguliert das DNS-Prefetching, um unbeabsichtigte Netzwerkanfragen zu reduzieren und die Privatsphäre zu verbessern. | | `REFERRER_POLICY` | `strict-origin-when-cross-origin` | multisite | nein | **Referrer Policy:** Steuert die Menge der gesendeten Referrer-Informationen und schützt die Privatsphäre der Benutzer. | - | `PERMISSIONS_POLICY` | `accelerometer=(), ambient-light-sensor=(), attribution-reporting=(), autoplay=(), battery=(), ...` | multisite | nein | **Permissions Policy:** Beschränkt den Zugriff auf Browserfunktionen und reduziert potenzielle Angriffsvektoren. | + | `PERMISSIONS_POLICY` | `accelerometer=(), ambient-light-sensor=(), attribution-reporting=(), autoplay=(), bluetooth=(), ...` | multisite | nein | **Permissions Policy:** Beschränkt den Zugriff auf Browserfunktionen und reduziert potenzielle Angriffsvektoren. | | `KEEP_UPSTREAM_HEADERS` | `Content-Security-Policy Content-Security-Policy-Report-Only Permissions-Policy X-Frame-Options` | multisite | nein | **Header beibehalten:** Behält ausgewählte Upstream-Header bei, was die Integration von Altsystemen erleichtert und gleichzeitig die Sicherheit aufrechterhält. | !!! tip "Bewährte Praktiken" @@ -51,6 +51,7 @@ Führen Sie die folgenden Schritte aus, um die Headers-Funktion zu konfigurieren - Verwenden Sie Tools wie das [Mozilla Observatory](https://observatory.mozilla.org/), um Ihre Header-Konfiguration zu validieren. - Testen Sie CSP im `Report-Only`-Modus, bevor Sie es erzwingen, um zu vermeiden, dass die Funktionalität beeinträchtigt wird. - Im `Report-Only`-Modus wird ein vom Upstream gesendeter `Content-Security-Policy`- oder `Content-Security-Policy-Report-Only`-Header standardmäßig beibehalten (`KEEP_UPSTREAM_HEADERS`); entfernen Sie den Header-Namen aus dieser Einstellung, damit die eigene Richtlinie von BunkerWeb Vorrang hat. + - Die standardmäßige `PERMISSIONS_POLICY` blockiert auch Client Hints (`ch-*`-Direktiven); wenn ein Dienst auf `Accept-CH` angewiesen ist (zum Beispiel Client-Hint-basierte responsive Bilder oder die Dunkelmodus-Erkennung über `Sec-CH-Prefers-Color-Scheme`), passen Sie `PERMISSIONS_POLICY` an, um die benötigten `ch-*`-Funktionen wieder zuzulassen (zum Beispiel `ch-dpr=(self)`). === "Cookie-Einstellungen" diff --git a/src/common/core/headers/README.es.md b/src/common/core/headers/README.es.md index e3de832de6..17276e95d9 100644 --- a/src/common/core/headers/README.es.md +++ b/src/common/core/headers/README.es.md @@ -43,7 +43,7 @@ Siga estos pasos para configurar y usar la función de Cabeceras: | `X_CONTENT_TYPE_OPTIONS` | `nosniff` | multisite | no | **X-Content-Type-Options:** Evita que los navegadores realicen "MIME-sniffing", protegiendo contra ataques de descarga no autorizada (drive-by download). | | `X_DNS_PREFETCH_CONTROL` | `off` | multisite | no | **X-DNS-Prefetch-Control:** Regula la captación previa de DNS para reducir las solicitudes de red no intencionadas y mejorar la privacidad. | | `REFERRER_POLICY` | `strict-origin-when-cross-origin` | multisite | no | **Política de Referencia:** Controla la cantidad de información de referencia enviada, salvaguardando la privacidad del usuario. | -| `PERMISSIONS_POLICY` | `accelerometer=(), ambient-light-sensor=(), attribution-reporting=(), autoplay=(), battery=(), ...` | multisite | no | **Política de Permisos:** Restringe el acceso a las funciones del navegador, reduciendo los posibles vectores de ataque. | +| `PERMISSIONS_POLICY` | `accelerometer=(), ambient-light-sensor=(), attribution-reporting=(), autoplay=(), bluetooth=(), ...` | multisite | no | **Política de Permisos:** Restringe el acceso a las funciones del navegador, reduciendo los posibles vectores de ataque. | | `KEEP_UPSTREAM_HEADERS` | `Content-Security-Policy Content-Security-Policy-Report-Only Permissions-Policy X-Frame-Options` | multisite | no | **Conservar Cabeceras:** Preserva las cabeceras de origen seleccionadas, ayudando a la integración con sistemas heredados mientras se mantiene la seguridad. | !!! tip "Mejores Prácticas" @@ -51,6 +51,7 @@ Siga estos pasos para configurar y usar la función de Cabeceras: - Use herramientas como [Mozilla Observatory](https://observatory.mozilla.org/) para validar la configuración de sus cabeceras. - Pruebe el CSP en modo `Report-Only` antes de aplicarlo para evitar romper la funcionalidad. - En modo `Report-Only`, una cabecera `Content-Security-Policy` o `Content-Security-Policy-Report-Only` enviada por el origen se conserva de forma predeterminada (`KEEP_UPSTREAM_HEADERS`); elimine el nombre de la cabecera de ese ajuste para que la propia política de BunkerWeb tenga prioridad. + - La `PERMISSIONS_POLICY` predeterminada también bloquea los client hints (directivas `ch-*`); si un servicio depende de `Accept-CH` (por ejemplo, imágenes responsivas basadas en client hints o la detección del modo oscuro mediante `Sec-CH-Prefers-Color-Scheme`), anule `PERMISSIONS_POLICY` para volver a permitir las funciones `ch-*` necesarias (por ejemplo, `ch-dpr=(self)`). === "Configuración de Cookies" diff --git a/src/common/core/headers/README.fr.md b/src/common/core/headers/README.fr.md index 992cac4746..a80744a800 100644 --- a/src/common/core/headers/README.fr.md +++ b/src/common/core/headers/README.fr.md @@ -43,7 +43,7 @@ Suivez ces étapes pour configurer et utiliser la fonctionnalité Headers : | `X_CONTENT_TYPE_OPTIONS` | `nosniff` | multisite | non | **X-Content-Type-Options :** Empêche les navigateurs de "MIME-sniffer", protégeant contre les attaques de type "drive-by download". | | `X_DNS_PREFETCH_CONTROL` | `off` | multisite | non | **X-DNS-Prefetch-Control :** Régule le préchargement DNS pour réduire les requêtes réseau involontaires et améliorer la confidentialité. | | `REFERRER_POLICY` | `strict-origin-when-cross-origin` | multisite | non | **Politique de Referrer :** Contrôle la quantité d'informations de référent envoyées, protégeant la vie privée de l'utilisateur. | - | `PERMISSIONS_POLICY` | `accelerometer=(), ambient-light-sensor=(), attribution-reporting=(), autoplay=(), battery=(), ...` | multisite | non | **Politique de permissions :** Restreint l'accès aux fonctionnalités du navigateur, réduisant les vecteurs d'attaque potentiels. | + | `PERMISSIONS_POLICY` | `accelerometer=(), ambient-light-sensor=(), attribution-reporting=(), autoplay=(), bluetooth=(), ...` | multisite | non | **Politique de permissions :** Restreint l'accès aux fonctionnalités du navigateur, réduisant les vecteurs d'attaque potentiels. | | `KEEP_UPSTREAM_HEADERS` | `Content-Security-Policy Content-Security-Policy-Report-Only Permissions-Policy X-Frame-Options` | multisite | non | **Conserver les en-têtes :** Préserve les en-têtes en amont sélectionnés, facilitant l'intégration héritée tout en maintenant la sécurité. | !!! tip "Bonnes pratiques" @@ -51,6 +51,7 @@ Suivez ces étapes pour configurer et utiliser la fonctionnalité Headers : - Utilisez des outils comme [Mozilla Observatory](https://observatory.mozilla.org/) pour valider la configuration de vos en-têtes. - Testez la CSP en mode `Report-Only` avant de l'appliquer pour éviter de casser des fonctionnalités. - En mode `Report-Only`, un en-tête `Content-Security-Policy` ou `Content-Security-Policy-Report-Only` fourni par l'amont est conservé par défaut (`KEEP_UPSTREAM_HEADERS`) ; retirez le nom de l'en-tête de ce paramètre pour que la politique de BunkerWeb prenne le dessus. + - La `PERMISSIONS_POLICY` par défaut bloque également les client hints (directives `ch-*`) ; si un service dépend d'`Accept-CH` (par exemple des images adaptatives basées sur les client hints ou la détection du mode sombre via `Sec-CH-Prefers-Color-Scheme`), personnalisez `PERMISSIONS_POLICY` pour réautoriser les fonctionnalités `ch-*` nécessaires (par exemple `ch-dpr=(self)`). === "Paramètres des cookies" diff --git a/src/common/core/headers/README.md b/src/common/core/headers/README.md index 74b7acecac..545d944b4a 100644 --- a/src/common/core/headers/README.md +++ b/src/common/core/headers/README.md @@ -43,7 +43,7 @@ Follow these steps to configure and use the Headers feature: | `X_CONTENT_TYPE_OPTIONS` | `nosniff` | multisite | no | **X-Content-Type-Options:** Prevents browsers from MIME-sniffing, protecting against drive-by download attacks. | | `X_DNS_PREFETCH_CONTROL` | `off` | multisite | no | **X-DNS-Prefetch-Control:** Regulates DNS prefetching to reduce unintentional network requests and enhance privacy. | | `REFERRER_POLICY` | `strict-origin-when-cross-origin` | multisite | no | **Referrer Policy:** Controls the amount of referrer information sent, safeguarding user privacy. | - | `PERMISSIONS_POLICY` | `accelerometer=(), ambient-light-sensor=(), attribution-reporting=(), autoplay=(), battery=(), ...` | multisite | no | **Permissions Policy:** Restricts browser feature access, reducing potential attack vectors. | + | `PERMISSIONS_POLICY` | `accelerometer=(), ambient-light-sensor=(), attribution-reporting=(), autoplay=(), bluetooth=(), ...` | multisite | no | **Permissions Policy:** Restricts browser feature access, reducing potential attack vectors. | | `KEEP_UPSTREAM_HEADERS` | `Content-Security-Policy Content-Security-Policy-Report-Only Permissions-Policy X-Frame-Options` | multisite | no | **Keep Headers:** Preserves selected upstream headers, aiding legacy integration while maintaining security. | !!! tip "Best Practices" @@ -51,6 +51,7 @@ Follow these steps to configure and use the Headers feature: - Use tools like [Mozilla Observatory](https://observatory.mozilla.org/) to validate your header configuration. - Test CSP in `Report-Only` mode before enforcing it to avoid breaking functionality. - In `Report-Only` mode, an upstream `Content-Security-Policy` or `Content-Security-Policy-Report-Only` header is preserved by default (`KEEP_UPSTREAM_HEADERS`); remove the header name from that setting for BunkerWeb's own policy to take precedence. + - The default `PERMISSIONS_POLICY` also blocks client hints (`ch-*` directives); if a service relies on `Accept-CH` (for example client-hint responsive images or `Sec-CH-Prefers-Color-Scheme` dark-mode detection), override `PERMISSIONS_POLICY` to re-allow the needed `ch-*` features (for example `ch-dpr=(self)`). === "Cookie Settings" diff --git a/src/common/core/headers/README.zh.md b/src/common/core/headers/README.zh.md index b7393265d3..6ad70c4c47 100644 --- a/src/common/core/headers/README.zh.md +++ b/src/common/core/headers/README.zh.md @@ -43,7 +43,7 @@ | `X_CONTENT_TYPE_OPTIONS` | `nosniff` | multisite | 否 | **X-Content-Type-Options:** 防止浏览器进行 MIME 嗅探,防止路过式下载攻击。 | | `X_DNS_PREFETCH_CONTROL` | `off` | multisite | 否 | **X-DNS-Prefetch-Control:** 调节 DNS 预取以减少无意的网络请求并增强隐私。 | | `REFERRER_POLICY` | `strict-origin-when-cross-origin` | multisite | 否 | **Referrer Policy:** 控制发送的引荐来源信息的数量,保护用户隐私。 | - | `PERMISSIONS_POLICY` | `accelerometer=(), ambient-light-sensor=(), attribution-reporting=(), autoplay=(), battery=(), ...` | multisite | 否 | **Permissions Policy:** 限制浏览器功能访问,减少潜在的攻击向量。 | + | `PERMISSIONS_POLICY` | `accelerometer=(), ambient-light-sensor=(), attribution-reporting=(), autoplay=(), bluetooth=(), ...` | multisite | 否 | **Permissions Policy:** 限制浏览器功能访问,减少潜在的攻击向量。 | | `KEEP_UPSTREAM_HEADERS` | `Content-Security-Policy Content-Security-Policy-Report-Only Permissions-Policy X-Frame-Options` | multisite | 否 | **保留标头:** 保留选定的上游标头,在保持安全性的同时帮助旧版集成。 | !!! tip "最佳实践" @@ -51,6 +51,7 @@ - 使用像 [Mozilla Observatory](https://observatory.mozilla.org/) 这样的工具来验证您的标头配置。 - 在强制执行 CSP 之前,在 `Report-Only` 模式下进行测试,以避免破坏功能。 - 在 `Report-Only` 模式下,上游发送的 `Content-Security-Policy` 或 `Content-Security-Policy-Report-Only` 标头默认会被保留(`KEEP_UPSTREAM_HEADERS`);从该设置中移除相应的标头名称,BunkerWeb 自身的策略才会生效。 + - 默认的 `PERMISSIONS_POLICY` 也会阻止客户端提示(`ch-*` 指令);如果某个服务依赖 `Accept-CH`(例如基于客户端提示的响应式图片或通过 `Sec-CH-Prefers-Color-Scheme` 进行的深色模式检测),请覆盖 `PERMISSIONS_POLICY` 以重新允许所需的 `ch-*` 功能(例如 `ch-dpr=(self)`)。 === "Cookie 设置" diff --git a/src/common/core/headers/plugin.json b/src/common/core/headers/plugin.json index b20a6f123b..bf51144dbf 100644 --- a/src/common/core/headers/plugin.json +++ b/src/common/core/headers/plugin.json @@ -90,11 +90,11 @@ }, "PERMISSIONS_POLICY": { "context": "multisite", - "default": "accelerometer=(), ambient-light-sensor=(), attribution-reporting=(), autoplay=(), bluetooth=(), browsing-topics=(), camera=(), compute-pressure=(), display-capture=(), encrypted-media=(), fullscreen=(), geolocation=(), gyroscope=(), hid=(), identity-credentials-get=(), idle-detection=(), local-fonts=(), magnetometer=(), microphone=(), midi=(), otp-credentials=(), payment=(), picture-in-picture=(), publickey-credentials-create=(), publickey-credentials-get=(), screen-wake-lock=(), serial=(), storage-access=(), usb=(), web-share=(), window-management=(), xr-spatial-tracking=(), aria-notify=(), captured-surface-control=(), cross-origin-isolated=(), deferred-fetch=(), deferred-fetch-minimal=(), language-detector=(), language-model=(), on-device-speech-recognition=(), proofreader=(), rewriter=(), summarizer=(), translator=(), wildcards=(), writer=(), private-state-token-issuance=(), private-state-token-redemption=(), ch-ua-high-entropy-values=(), gamepad=(), local-network=(), local-network-access=(), loopback-network=(), interest-cohort=()", + "default": "accelerometer=(), ambient-light-sensor=(), attribution-reporting=(), autoplay=(), bluetooth=(), browsing-topics=(), camera=(), compute-pressure=(), display-capture=(), encrypted-media=(), fullscreen=(), geolocation=(), gyroscope=(), hid=(), identity-credentials-get=(), idle-detection=(), local-fonts=(), magnetometer=(), microphone=(), midi=(), otp-credentials=(), payment=(), picture-in-picture=(), publickey-credentials-create=(), publickey-credentials-get=(), screen-wake-lock=(), serial=(), storage-access=(), usb=(), web-share=(), window-management=(), xr-spatial-tracking=(), aria-notify=(), captured-surface-control=(), cross-origin-isolated=(), deferred-fetch=(), deferred-fetch-minimal=(), language-detector=(), language-model=(), on-device-speech-recognition=(), proofreader=(), rewriter=(), summarizer=(), translator=(), writer=(), private-state-token-issuance=(), private-state-token-redemption=(), ch-ua-high-entropy-values=(), gamepad=(), local-network=(), local-network-access=(), loopback-network=(), interest-cohort=(), ch-device-memory=(), ch-downlink=(), ch-dpr=(), ch-ect=(), ch-prefers-color-scheme=(), ch-prefers-reduced-motion=(), ch-prefers-reduced-transparency=(), ch-rtt=(), ch-save-data=(), ch-ua=(), ch-ua-arch=(), ch-ua-bitness=(), ch-ua-form-factors=(), ch-ua-full-version=(), ch-ua-full-version-list=(), ch-ua-mobile=(), ch-ua-model=(), ch-ua-platform=(), ch-ua-platform-version=(), ch-ua-wow64=(), ch-viewport-height=(), ch-viewport-width=(), ch-width=(), device-attributes=(), digital-credentials-create=(), digital-credentials-get=(), execution-while-not-rendered=(), execution-while-out-of-viewport=(), focus-without-user-activation=(), join-ad-interest-group=(), keyboard-map=(), manual-text=(), media-playback-while-not-visible=(), private-aggregation=(), record-ad-auction-events=(), run-ad-auction=(), shared-storage=(), shared-storage-select-url=(), speaker-selection=(), tools=(), unload=(), vertical-scroll=(), web-app-installation=(), webnn=()", "help": "Value for the Permissions-Policy header.", "id": "permissions-policy", "label": "Permissions-Policy", - "regex": "^(?![ ])(,? ?([a-z\\-]+)=(\\*|\\(( ?(self|\\u0022https?:\\/\\/[\\-\\w@:%.+~#=]+[\\-\\w\\(\\)!@:%+.~#?&\\/=$]*\\u0022)(?=[ \\)]))*\\)))*$", + "regex": "^(?![ ])(,? ?([a-z0-9\\-]+)=(\\*|\\(( ?(self|\\u0022https?:\\/\\/[\\-\\w@:%.+~#=]+[\\-\\w\\(\\)!@:%+.~#?&\\/=$]*\\u0022)(?=[ \\)]))*\\)))*$", "type": "multivalue", "separator": ", " }, diff --git a/src/common/core/misc/confs/default-server-http/page.conf b/src/common/core/misc/confs/default-server-http/page.conf index 9250881fcc..45281df146 100644 --- a/src/common/core/misc/confs/default-server-http/page.conf +++ b/src/common/core/misc/confs/default-server-http/page.conf @@ -45,7 +45,7 @@ location / { ngx.header["Referrer-Policy"] = "no-referrer" -- Override Permissions-Policy header - ngx.header["Permissions-Policy"] = "accelerometer=(), ambient-light-sensor=(), attribution-reporting=(), autoplay=(), battery=(), bluetooth=(), browsing-topics=(), camera=(), compute-pressure=(), display-capture=(), encrypted-media=(), execution-while-not-rendered=(), execution-while-out-of-viewport=(), fullscreen=(), gamepad=(), geolocation=(), gyroscope=(), hid=(), identity-credentials-get=(), idle-detection=(), local-fonts=(), magnetometer=(), microphone=(), midi=(), otp-credentials=(), payment=(), picture-in-picture=(), publickey-credentials-create=(), publickey-credentials-get=(), screen-wake-lock=(), serial=(), speaker-selection=(), storage-access=(), usb=(), web-share=(), window-management=(), xr-spatial-tracking=(), interest-cohort=(), language-detector=(), language-model=(), proofreader=(), rewriter=(), translator=(), writer=()" + ngx.header["Permissions-Policy"] = "accelerometer=(), ambient-light-sensor=(), attribution-reporting=(), autoplay=(), battery=(), bluetooth=(), browsing-topics=(), camera=(), compute-pressure=(), display-capture=(), encrypted-media=(), execution-while-not-rendered=(), execution-while-out-of-viewport=(), fullscreen=(), gamepad=(), geolocation=(), gyroscope=(), hid=(), identity-credentials-get=(), idle-detection=(), local-fonts=(), magnetometer=(), microphone=(), midi=(), otp-credentials=(), payment=(), picture-in-picture=(), publickey-credentials-create=(), publickey-credentials-get=(), screen-wake-lock=(), serial=(), speaker-selection=(), storage-access=(), usb=(), web-share=(), window-management=(), xr-spatial-tracking=(), interest-cohort=(), language-detector=(), language-model=(), proofreader=(), rewriter=(), translator=(), writer=(), ch-device-memory=(), ch-downlink=(), ch-dpr=(), ch-ect=(), ch-prefers-color-scheme=(), ch-prefers-reduced-motion=(), ch-prefers-reduced-transparency=(), ch-rtt=(), ch-save-data=(), ch-ua=(), ch-ua-arch=(), ch-ua-bitness=(), ch-ua-form-factors=(), ch-ua-full-version=(), ch-ua-full-version-list=(), ch-ua-mobile=(), ch-ua-model=(), ch-ua-platform=(), ch-ua-platform-version=(), ch-ua-wow64=(), ch-viewport-height=(), ch-viewport-width=(), ch-width=(), device-attributes=(), digital-credentials-create=(), digital-credentials-get=(), focus-without-user-activation=(), join-ad-interest-group=(), keyboard-map=(), manual-text=(), media-playback-while-not-visible=(), private-aggregation=(), record-ad-auction-events=(), run-ad-auction=(), shared-storage=(), shared-storage-select-url=(), tools=(), unload=(), vertical-scroll=(), web-app-installation=(), webnn=()" -- Override Content-Type header ngx.header["Content-Type"] = "text/html; charset=utf-8" diff --git a/src/common/core/templates/templates/high.json b/src/common/core/templates/templates/high.json index 346334b1ef..2495ea333b 100644 --- a/src/common/core/templates/templates/high.json +++ b/src/common/core/templates/templates/high.json @@ -37,7 +37,7 @@ "SSL_PROTOCOLS": "TLSv1.2 TLSv1.3", "COOKIE_FLAGS": "* HttpOnly SameSite=Lax", "CONTENT_SECURITY_POLICY": "object-src 'none'; form-action 'self'; frame-ancestors 'self';", - "PERMISSIONS_POLICY": "accelerometer=(), ambient-light-sensor=(), attribution-reporting=(), autoplay=(), bluetooth=(), browsing-topics=(), camera=(), compute-pressure=(), display-capture=(), encrypted-media=(), fullscreen=(), geolocation=(), gyroscope=(), hid=(), identity-credentials-get=(), idle-detection=(), local-fonts=(), magnetometer=(), microphone=(), midi=(), otp-credentials=(), payment=(), picture-in-picture=(), publickey-credentials-create=(), publickey-credentials-get=(), screen-wake-lock=(), serial=(), storage-access=(), usb=(), web-share=(), window-management=(), xr-spatial-tracking=(), aria-notify=(), captured-surface-control=(), cross-origin-isolated=(), deferred-fetch=(), deferred-fetch-minimal=(), language-detector=(), language-model=(), on-device-speech-recognition=(), proofreader=(), rewriter=(), summarizer=(), translator=(), wildcards=(), writer=(), private-state-token-issuance=(), private-state-token-redemption=(), ch-ua-high-entropy-values=(), gamepad=(), local-network=(), local-network-access=(), loopback-network=(), interest-cohort=()", + "PERMISSIONS_POLICY": "accelerometer=(), ambient-light-sensor=(), attribution-reporting=(), autoplay=(), bluetooth=(), browsing-topics=(), camera=(), compute-pressure=(), display-capture=(), encrypted-media=(), fullscreen=(), geolocation=(), gyroscope=(), hid=(), identity-credentials-get=(), idle-detection=(), local-fonts=(), magnetometer=(), microphone=(), midi=(), otp-credentials=(), payment=(), picture-in-picture=(), publickey-credentials-create=(), publickey-credentials-get=(), screen-wake-lock=(), serial=(), storage-access=(), usb=(), web-share=(), window-management=(), xr-spatial-tracking=(), aria-notify=(), captured-surface-control=(), cross-origin-isolated=(), deferred-fetch=(), deferred-fetch-minimal=(), language-detector=(), language-model=(), on-device-speech-recognition=(), proofreader=(), rewriter=(), summarizer=(), translator=(), writer=(), private-state-token-issuance=(), private-state-token-redemption=(), ch-ua-high-entropy-values=(), gamepad=(), local-network=(), local-network-access=(), loopback-network=(), interest-cohort=(), ch-device-memory=(), ch-downlink=(), ch-dpr=(), ch-ect=(), ch-prefers-color-scheme=(), ch-prefers-reduced-motion=(), ch-prefers-reduced-transparency=(), ch-rtt=(), ch-save-data=(), ch-ua=(), ch-ua-arch=(), ch-ua-bitness=(), ch-ua-form-factors=(), ch-ua-full-version=(), ch-ua-full-version-list=(), ch-ua-mobile=(), ch-ua-model=(), ch-ua-platform=(), ch-ua-platform-version=(), ch-ua-wow64=(), ch-viewport-height=(), ch-viewport-width=(), ch-width=(), device-attributes=(), digital-credentials-create=(), digital-credentials-get=(), execution-while-not-rendered=(), execution-while-out-of-viewport=(), focus-without-user-activation=(), join-ad-interest-group=(), keyboard-map=(), manual-text=(), media-playback-while-not-visible=(), private-aggregation=(), record-ad-auction-events=(), run-ad-auction=(), shared-storage=(), shared-storage-select-url=(), speaker-selection=(), tools=(), unload=(), vertical-scroll=(), web-app-installation=(), webnn=()", "KEEP_UPSTREAM_HEADERS": "Content-Security-Policy Content-Security-Policy-Report-Only Permissions-Policy X-Frame-Options", "REFERRER_POLICY": "no-referrer", "USE_CORS": "no", diff --git a/src/common/core/templates/templates/medium.json b/src/common/core/templates/templates/medium.json index ad47f8be88..db6257c765 100644 --- a/src/common/core/templates/templates/medium.json +++ b/src/common/core/templates/templates/medium.json @@ -37,7 +37,7 @@ "SSL_PROTOCOLS": "TLSv1.2 TLSv1.3", "COOKIE_FLAGS": "* SameSite=Lax", "CONTENT_SECURITY_POLICY": "", - "PERMISSIONS_POLICY": "accelerometer=(), ambient-light-sensor=(), attribution-reporting=(), autoplay=(), bluetooth=(), browsing-topics=(), camera=(), compute-pressure=(), display-capture=(), encrypted-media=(), fullscreen=(), geolocation=(), gyroscope=(), hid=(), identity-credentials-get=(), idle-detection=(), local-fonts=(), magnetometer=(), microphone=(), midi=(), otp-credentials=(), payment=(), picture-in-picture=(), publickey-credentials-create=(), publickey-credentials-get=(), screen-wake-lock=(), serial=(), storage-access=(), usb=(), web-share=(), window-management=(), xr-spatial-tracking=(), aria-notify=(), captured-surface-control=(), cross-origin-isolated=(), deferred-fetch=(), deferred-fetch-minimal=(), language-detector=(), language-model=(), on-device-speech-recognition=(), proofreader=(), rewriter=(), summarizer=(), translator=(), wildcards=(), writer=(), private-state-token-issuance=(), private-state-token-redemption=(), ch-ua-high-entropy-values=(), gamepad=(), local-network=(), local-network-access=(), loopback-network=(), interest-cohort=()", + "PERMISSIONS_POLICY": "accelerometer=(), ambient-light-sensor=(), attribution-reporting=(), autoplay=(), bluetooth=(), browsing-topics=(), camera=(), compute-pressure=(), display-capture=(), encrypted-media=(), fullscreen=(), geolocation=(), gyroscope=(), hid=(), identity-credentials-get=(), idle-detection=(), local-fonts=(), magnetometer=(), microphone=(), midi=(), otp-credentials=(), payment=(), picture-in-picture=(), publickey-credentials-create=(), publickey-credentials-get=(), screen-wake-lock=(), serial=(), storage-access=(), usb=(), web-share=(), window-management=(), xr-spatial-tracking=(), aria-notify=(), captured-surface-control=(), cross-origin-isolated=(), deferred-fetch=(), deferred-fetch-minimal=(), language-detector=(), language-model=(), on-device-speech-recognition=(), proofreader=(), rewriter=(), summarizer=(), translator=(), writer=(), private-state-token-issuance=(), private-state-token-redemption=(), ch-ua-high-entropy-values=(), gamepad=(), local-network=(), local-network-access=(), loopback-network=(), interest-cohort=(), ch-device-memory=(), ch-downlink=(), ch-dpr=(), ch-ect=(), ch-prefers-color-scheme=(), ch-prefers-reduced-motion=(), ch-prefers-reduced-transparency=(), ch-rtt=(), ch-save-data=(), ch-ua=(), ch-ua-arch=(), ch-ua-bitness=(), ch-ua-form-factors=(), ch-ua-full-version=(), ch-ua-full-version-list=(), ch-ua-mobile=(), ch-ua-model=(), ch-ua-platform=(), ch-ua-platform-version=(), ch-ua-wow64=(), ch-viewport-height=(), ch-viewport-width=(), ch-width=(), device-attributes=(), digital-credentials-create=(), digital-credentials-get=(), execution-while-not-rendered=(), execution-while-out-of-viewport=(), focus-without-user-activation=(), join-ad-interest-group=(), keyboard-map=(), manual-text=(), media-playback-while-not-visible=(), private-aggregation=(), record-ad-auction-events=(), run-ad-auction=(), shared-storage=(), shared-storage-select-url=(), speaker-selection=(), tools=(), unload=(), vertical-scroll=(), web-app-installation=(), webnn=()", "KEEP_UPSTREAM_HEADERS": "*", "REFERRER_POLICY": "strict-origin-when-cross-origin", "USE_CORS": "yes", diff --git a/src/ui/main.py b/src/ui/main.py index 92efc79bf3..5d05d3e4dd 100644 --- a/src/ui/main.py +++ b/src/ui/main.py @@ -1403,7 +1403,7 @@ def set_security_headers(response): # * Permissions-Policy header to prevent unwanted behavior response.headers["Permissions-Policy"] = ( - "accelerometer=(), ambient-light-sensor=(), attribution-reporting=(), autoplay=(), battery=(), bluetooth=(), browsing-topics=(), camera=(), compute-pressure=(), display-capture=(), encrypted-media=(), execution-while-not-rendered=(), execution-while-out-of-viewport=(), fullscreen=(), gamepad=(), geolocation=(), gyroscope=(), hid=(), identity-credentials-get=(), idle-detection=(), local-fonts=(), magnetometer=(), microphone=(), midi=(), otp-credentials=(), payment=(), picture-in-picture=(), publickey-credentials-create=(), publickey-credentials-get=(), screen-wake-lock=(), serial=(), speaker-selection=(), storage-access=(), usb=(), web-share=(), window-management=(), xr-spatial-tracking=(), interest-cohort=(), language-detector=(), language-model=(), proofreader=(), rewriter=(), translator=(), writer=()" + "accelerometer=(), ambient-light-sensor=(), attribution-reporting=(), autoplay=(), battery=(), bluetooth=(), browsing-topics=(), camera=(), compute-pressure=(), display-capture=(), encrypted-media=(), execution-while-not-rendered=(), execution-while-out-of-viewport=(), fullscreen=(), gamepad=(), geolocation=(), gyroscope=(), hid=(), identity-credentials-get=(), idle-detection=(), local-fonts=(), magnetometer=(), microphone=(), midi=(), otp-credentials=(), payment=(), picture-in-picture=(), publickey-credentials-create=(), publickey-credentials-get=(), screen-wake-lock=(), serial=(), speaker-selection=(), storage-access=(), usb=(), web-share=(), window-management=(), xr-spatial-tracking=(), interest-cohort=(), language-detector=(), language-model=(), proofreader=(), rewriter=(), translator=(), writer=(), ch-device-memory=(), ch-downlink=(), ch-dpr=(), ch-ect=(), ch-prefers-color-scheme=(), ch-prefers-reduced-motion=(), ch-prefers-reduced-transparency=(), ch-rtt=(), ch-save-data=(), ch-ua=(), ch-ua-arch=(), ch-ua-bitness=(), ch-ua-form-factors=(), ch-ua-full-version=(), ch-ua-full-version-list=(), ch-ua-mobile=(), ch-ua-model=(), ch-ua-platform=(), ch-ua-platform-version=(), ch-ua-wow64=(), ch-viewport-height=(), ch-viewport-width=(), ch-width=(), device-attributes=(), digital-credentials-create=(), digital-credentials-get=(), focus-without-user-activation=(), join-ad-interest-group=(), keyboard-map=(), manual-text=(), media-playback-while-not-visible=(), private-aggregation=(), record-ad-auction-events=(), run-ad-auction=(), shared-storage=(), shared-storage-select-url=(), tools=(), unload=(), vertical-scroll=(), web-app-installation=(), webnn=()" ) for hook in app.config["AFTER_REQUEST_HOOKS"]: From 907b3aa931dad02f5b62c6d6c4139075aa478162 Mon Sep 17 00:00:00 2001 From: TheophileDiot Date: Thu, 23 Jul 2026 15:02:01 +0200 Subject: [PATCH 05/25] fix(db): anchor-aware persistence for multiple-group settings --- src/common/db/Database.py | 175 +++++++- .../test_default_multiple_sibling_lock.py | 383 ++++++++++++++++++ 2 files changed, 545 insertions(+), 13 deletions(-) create mode 100644 tests/unit/test_default_multiple_sibling_lock.py diff --git a/src/common/db/Database.py b/src/common/db/Database.py index db078295be..13276d02b9 100644 --- a/src/common/db/Database.py +++ b/src/common/db/Database.py @@ -2032,8 +2032,11 @@ def check_value(key: str, value: str, setting: dict, template_default: Optional[ global_config[key] = value # Collect necessary data before threading - settings_data = session.query(Settings.id, Settings.default, Settings.plugin_id, Settings.type).all() - settings_dict = {s.id: {"default": self._empty_if_none(s.default), "plugin_id": s.plugin_id, "type": s.type} for s in settings_data} + settings_data = session.query(Settings.id, Settings.default, Settings.plugin_id, Settings.type, Settings.multiple).all() + settings_dict = { + s.id: {"default": self._empty_if_none(s.default), "plugin_id": s.plugin_id, "type": s.type, "multiple": s.multiple} + for s in settings_data + } # Collect existing service settings existing_service_settings = session.query( @@ -2053,16 +2056,71 @@ def check_value(key: str, value: str, setting: dict, template_default: Optional[ for s in existing_service_settings } - # Collect template settings + # Collect template settings. NB: use a distinct loop variable — reusing `template` here would + # clobber the config's USE_TEMPLATE id (set above) with a row object, silently breaking the + # service-template fallback and every `templates.get(template, ...)` lookup below. templates = {} - for template in ( + for template_row in ( session.query(Template_settings) .with_entities(Template_settings.template_id, Template_settings.setting_id, Template_settings.suffix, Template_settings.default) .order_by(Template_settings.order) ): - if template.template_id not in templates: - templates[template.template_id] = {} - templates[template.template_id][(template.setting_id, template.suffix or 0)] = template.default + if template_row.template_id not in templates: + templates[template_row.template_id] = {} + templates[template_row.template_id][(template_row.setting_id, template_row.suffix or 0)] = template_row.default + + def compute_anchored_slots(cfg: Dict[str, str], cfg_template: str) -> set: + # A multiple-group slot (group, suffix>=1) is "anchored" when at least one of its members in + # the incoming config differs from its (template-or-plugin) default. get_config re-materialises + # EVERY member of a detected slot at its default, so the config round-trip re-ingests those + # default siblings; an anchored slot survives on its non-default member's row, so its default + # siblings are spurious material and may be dropped (persisting them locks the field in the UI). + # A slot with NO anchor is a user-declared all-default slot that must be kept, else it vanishes. + anchored = set() + for anchor_key, anchor_value in cfg.items(): + anchor_suffix = 0 + anchor_base = anchor_key + if self.SUFFIX_RX.search(anchor_base): + anchor_suffix = int(anchor_base.split("_")[-1]) + anchor_base = anchor_base[: -len(str(anchor_suffix)) - 1] + if anchor_suffix == 0: + continue + anchor_setting = settings_dict.get(anchor_base) + if not anchor_setting or not anchor_setting.get("multiple"): + continue + anchor_default = templates.get(cfg_template, {}).get((anchor_base, anchor_suffix)) if cfg_template else None + if anchor_default is None: + anchor_default = anchor_setting["default"] + if anchor_value != anchor_default: + anchored.add((anchor_setting["multiple"], anchor_suffix)) + return anchored + + def compute_template_slots(cfg_template: str) -> set: + # A slot is ALSO kept alive by a template that defines ANY member at that suffix: get_config + # rebuilds such a slot from Template_settings with no row, so its default members must NOT be + # persisted (they would become spurious, field-locking rows). Keyed per (group, suffix) to also + # cover the partial-template case (a template's HOST_1 keeps its sibling TIMEOUT_1's slot alive). + slots = set() + for member_id, member_suffix in templates.get(cfg_template, {}): + if member_suffix and member_suffix > 0: + member_setting = settings_dict.get(member_id) + if member_setting and member_setting.get("multiple"): + slots.add((member_setting["multiple"], member_suffix)) + return slots + + def slot_flags(setting: dict, suffix: int, value: str, template_setting_default: Optional[str], alive_slots: set) -> Tuple[bool, bool]: + # (is_spurious_default_sibling, is_anchorless_multiple_member) for a suffixed multiple member. + # alive_slots = slots kept alive by an anchor row OR a template definition. + # - spurious : a default-valued member of a KEPT-ALIVE slot -> drop it (stays editable; the + # slot survives via its anchor member or its template). + # - anchorless : a member of a slot kept alive by NOTHING -> must be persisted even at its + # default, else the whole user-declared all-default slot would vanish. + group = setting.get("multiple") + if suffix <= 0 or group is None: + return False, False + slot_default = template_setting_default if template_setting_default is not None else setting["default"] + alive = (group, suffix) in alive_slots + return (value == slot_default and alive), (not alive) def process_service(server_name: str, service_config: Dict[str, str], db_ids: Dict[str, dict]): local_to_put = [] @@ -2073,6 +2131,7 @@ def process_service(server_name: str, service_config: Dict[str, str], db_ids: Di local_service_template_change = False service_template = service_config.get("USE_TEMPLATE", template) + alive_slots = compute_anchored_slots(service_config, service_template) | compute_template_slots(service_template) for original_key, value in service_config.items(): suffix = 0 @@ -2116,9 +2175,28 @@ def process_service(server_name: str, service_config: Dict[str, str], db_ids: Di template_setting_default = templates.get(service_template, {}).get((key, suffix)) local_service_template_change = True + is_spurious_default_sibling, is_anchorless_multiple_member = slot_flags( + setting, suffix, value, template_setting_default, alive_slots + ) + # A default sibling of a kept-alive slot (anchor row or template) is spurious round-trip + # material: drop it (and clean any stale row) so the field stays editable; the slot survives. + if is_spurious_default_sibling: + if service_setting and self._methods_are_compatible( + method, service_setting["method"], allow_scheduler_override=scheduler_can_override(f"{server_name}_{original_key}", value) + ): + self.logger.debug(f"Removing spurious default multiple-group setting {key}_{suffix} for service {server_name}") + local_to_delete.append( + {"model": Services_settings, "filter": {"service_id": server_name, "setting_id": key, "suffix": suffix}} + ) + if value_changed: + local_changed_plugins.add(setting["plugin_id"]) + continue + # Determine if we need to add, update, or delete if not service_setting: - if check_value(key, value, setting, template_setting_default, suffix): + # A member of an ANCHORLESS slot must be persisted even at its default value, otherwise + # the entire user-declared all-default slot would never materialise (vanish). + if check_value(key, value, setting, template_setting_default, suffix) and not is_anchorless_multiple_member: continue self.logger.debug(f"Adding setting {key} for service {server_name}") @@ -2143,7 +2221,14 @@ def process_service(server_name: str, service_config: Dict[str, str], db_ids: Di if should_update_value: local_changed_plugins.add(setting["plugin_id"]) - if should_update_value and check_value(key, value, setting, template_setting_default, suffix): + # Editing a value down to its default removes the row (defaults are implicit) — + # EXCEPT for a member of an anchorless slot, where dropping the last rows would vanish + # the whole user-declared slot; there we persist the default value instead. + if ( + should_update_value + and check_value(key, value, setting, template_setting_default, suffix) + and not is_anchorless_multiple_member + ): self.logger.debug(f"Removing setting {key} for service {server_name}") local_to_delete.append( {"model": Services_settings, "filter": {"service_id": server_name, "setting_id": key, "suffix": suffix}} @@ -2176,6 +2261,8 @@ def process_global_settings(global_config: Dict[str, str]): local_changed_plugins = set() local_service_template_change = False + alive_slots = compute_anchored_slots(global_config, template) | compute_template_slots(template) + for original_key, value in global_config.items(): suffix = 0 key = deepcopy(original_key) @@ -2208,8 +2295,25 @@ def process_global_settings(global_config: Dict[str, str]): template_setting_default = templates.get(template, {}).get((key, suffix)) local_service_template_change = True + is_spurious_default_sibling, is_anchorless_multiple_member = slot_flags( + setting, suffix, value, template_setting_default, alive_slots + ) + # A default sibling of a kept-alive global multiple slot (anchor row or template) is + # spurious round-trip material: drop it so the field stays editable on the global page. + if is_spurious_default_sibling: + if global_value and self._methods_are_compatible( + method, global_value.method, allow_scheduler_override=scheduler_can_override(original_key, value) + ): + self.logger.debug(f"Removing spurious default global multiple-group setting {key}_{suffix}") + local_to_delete.append({"model": Global_values, "filter": {"setting_id": key, "suffix": suffix}}) + if value_changed: + local_changed_plugins.add(setting["plugin_id"]) + continue + if not global_value: - if check_value(key, value, setting, template_setting_default, suffix, True): + # A member of an ANCHORLESS slot must be persisted even at its default value, otherwise + # the entire user-declared all-default slot would never materialise (vanish). + if check_value(key, value, setting, template_setting_default, suffix, True) and not is_anchorless_multiple_member: continue self.logger.debug(f"Adding global setting {key}") @@ -2227,7 +2331,13 @@ def process_global_settings(global_config: Dict[str, str]): if should_update_value: local_changed_plugins.add(setting["plugin_id"]) - if should_update_value and check_value(key, value, setting, template_setting_default, suffix, True): + # Editing a value down to its default removes the row — except for a member of an + # anchorless slot, where that would vanish the whole user-declared slot; persist instead. + if ( + should_update_value + and check_value(key, value, setting, template_setting_default, suffix, True) + and not is_anchorless_multiple_member + ): self.logger.debug(f"Removing global setting {key}") local_to_delete.append({"model": Global_values, "filter": {"setting_id": key, "suffix": suffix}}) continue @@ -2304,6 +2414,38 @@ def process_global_settings(global_config: Dict[str, str]): ) changed_services = True + # Anchor-awareness for multiple-group slots (mirrors compute_anchored_slots in the multisite + # branch): a slot whose members are ALL at their default has no "anchor" row, so its default + # members must still be persisted here, otherwise the whole user-declared slot would vanish. + # Assumes multiple-setting defaults are non-NULL strings (true for all core plugins); a NULL + # default would need _empty_if_none normalization to match the per-key check below. + nm_multiple = { + s.id: (self._empty_if_none(s.default), s.multiple) for s in session.query(Settings.id, Settings.default, Settings.multiple).all() + } + nm_template_defaults = {} + nm_template_slots = set() # (group, suffix) kept alive by the template -> must not be persisted + if template: + for ts in ( + session.query(Template_settings) + .with_entities(Template_settings.setting_id, Template_settings.suffix, Template_settings.default) + .filter_by(template_id=template) + ): + nm_template_defaults[(ts.setting_id, ts.suffix or 0)] = ts.default + if ts.suffix and ts.suffix > 0 and ts.setting_id in nm_multiple and nm_multiple[ts.setting_id][1]: + nm_template_slots.add((nm_multiple[ts.setting_id][1], ts.suffix)) + nm_anchored_slots = set() + for anchor_key, anchor_value in config.items(): + anchor_suffix = 0 + anchor_base = anchor_key + if self.SUFFIX_RX.search(anchor_base): + anchor_suffix = int(anchor_base.split("_")[-1]) + anchor_base = anchor_base[: -len(str(anchor_suffix)) - 1] + if anchor_suffix == 0 or anchor_base not in nm_multiple or not nm_multiple[anchor_base][1]: + continue + anchor_default = nm_template_defaults.get((anchor_base, anchor_suffix), nm_multiple[anchor_base][0]) + if anchor_value != anchor_default: + nm_anchored_slots.add((nm_multiple[anchor_base][1], anchor_suffix)) + for original_key, value in config.items(): key = deepcopy(original_key) suffix = 0 @@ -2341,8 +2483,15 @@ def process_global_settings(global_config: Dict[str, str]): ) service_template_change = True + nm_mult = nm_multiple.get(key, (None, None))[1] + nm_is_anchorless = ( + suffix > 0 and nm_mult is not None and (nm_mult, suffix) not in nm_anchored_slots and (nm_mult, suffix) not in nm_template_slots + ) + nm_default = template_setting.default if template_setting is not None else setting.default + if not global_value: - if value == (template_setting.default if template_setting is not None else setting.default): + # An anchorless slot's default member must be persisted, else the whole slot vanishes. + if value == nm_default and not nm_is_anchorless: continue self.logger.debug(f"Adding global setting {key}") @@ -2360,7 +2509,7 @@ def process_global_settings(global_config: Dict[str, str]): if should_update_value: changed_plugins.add(setting.plugin_id) - if should_update_value and value == (template_setting.default if template_setting is not None else setting.default): + if should_update_value and value == nm_default and not nm_is_anchorless: self.logger.debug(f"Removing global setting {key}") to_delete.append({"model": Global_values, "filter": {"setting_id": key, "suffix": suffix}}) continue diff --git a/tests/unit/test_default_multiple_sibling_lock.py b/tests/unit/test_default_multiple_sibling_lock.py new file mode 100644 index 0000000000..fcee01a4ef --- /dev/null +++ b/tests/unit/test_default_multiple_sibling_lock.py @@ -0,0 +1,383 @@ +"""Regression tests for the multiple-group default-sibling lock bug. + +A multisite "multiple" group (e.g. reverse-proxy #1) has members the user never sets. The scheduler +config round-trip (db.get_config materialises every group member at its default -> variables.env -> +save_config(method="scheduler")) must NOT persist those default-valued siblings as Services_settings +rows: a persisted non-ui/api/default method row renders the field disabled in the Web UI even though +the value is an untouched default. + +Covers both directions: +- a fresh default sibling is not persisted (is_default_value recognises the plugin default); +- a pre-existing corrupted scheduler row holding a default value self-heals (is removed) on the next + scheduler save. +""" + +from copy import deepcopy +from json import loads +from pathlib import Path +from sys import path as sys_path +from tempfile import TemporaryDirectory +from types import SimpleNamespace +from unittest import TestCase + +REPO_ROOT = Path(__file__).resolve().parents[2] +for _extra_path in (REPO_ROOT / "src" / "common" / "db", REPO_ROOT / "src" / "common" / "utils"): + _extra_path_str = str(_extra_path) + if _extra_path_str not in sys_path: + sys_path.insert(0, _extra_path_str) + +from Database import Database # type: ignore # noqa: E402 +from model import Services_settings, Global_values, Templates, Template_steps, Template_settings # type: ignore # noqa: E402 + +SERVICE = "app.example.com" + + +def _multiple_setting(setting_id: str, default: str, group: str = "test-rp", context: str = "multisite") -> dict: + return { + "context": context, + "default": default, + "help": setting_id, + "id": setting_id.lower().replace("_", "-"), + "label": setting_id, + "regex": "^.*$", + "type": "text", + "multiple": group, + } + + +def _test_plugin() -> dict: + return { + "id": "testrp", + "name": "Test RP", + "description": "Multiple groups for testing", + "version": "1.0", + "stream": "no", + "type": "core", + "method": "manual", + "settings": { + # Anchored group: HOST has an empty default, so a real slot must set it (non-default anchor). + "TEST_RP_HOST": _multiple_setting("TEST_RP_HOST", ""), # user-set, non-default + "TEST_RP_TIMEOUT": _multiple_setting("TEST_RP_TIMEOUT", "60s"), # untouched default sibling + # Anchorless group (limit-req shape): BOTH members have non-empty defaults, so an all-default + # slot is a valid user-declared configuration that must NOT vanish. + "TEST_LIM_URL": _multiple_setting("TEST_LIM_URL", "/", "test-lim"), + "TEST_LIM_RATE": _multiple_setting("TEST_LIM_RATE", "2r/s", "test-lim"), + # GLOBAL multi-member group (access-logs shape) — same anchored-sibling / anchorless logic + # applies to global settings via process_global_settings. + "TEST_GLOG_FILE": _multiple_setting("TEST_GLOG_FILE", "/log", "test-glog", "global"), + "TEST_GLOG_FMT": _multiple_setting("TEST_GLOG_FMT", "combined", "test-glog", "global"), + }, + } + + +class DefaultMultipleSiblingLockTest(TestCase): + def setUp(self): + self.tmpdir = TemporaryDirectory() + db_path = Path(self.tmpdir.name) / "test.sqlite3" + self.logger = SimpleNamespace(info=lambda *_a: None, warning=lambda *_a: None, error=lambda *_a: None, debug=lambda *_a: None) + self.db = Database(self.logger, sqlalchemy_string=f"sqlite:///{db_path}") + general = loads((REPO_ROOT / "src" / "common" / "settings.json").read_text()) + ret, err = self.db.init_tables([general, deepcopy(_test_plugin())]) + self.assertFalse(err, err) + + def tearDown(self): + self.db.close() + self.tmpdir.cleanup() + + def _rows(self, setting_id: str, suffix: int): + with self.db._db_session() as session: + return session.query(Services_settings).filter_by(service_id=SERVICE, setting_id=setting_id, suffix=suffix).all() + + def _grows(self, setting_id: str, suffix: int): + with self.db._db_session() as session: + return session.query(Global_values).filter_by(setting_id=setting_id, suffix=suffix).all() + + def _mk_template(self, *settings): + # settings: iterable of (setting_id, default, suffix) + from datetime import datetime + + now = datetime.now().astimezone() + with self.db._db_session() as session: + session.add(Templates(id="tmpl", name="Tmpl", plugin_id=None, method="manual", creation_date=now, last_update=now)) + session.flush() + session.add(Template_steps(id=1, template_id="tmpl", title="Step", subtitle=None)) + for order, (sid, default, suffix) in enumerate(settings, 1): + session.add(Template_settings(template_id="tmpl", setting_id=sid, step_id=1, default=default, suffix=suffix, order=order)) + session.commit() + + def _use_template(self, extra=None): + # A service that uses the template, round-tripped through get_config -> save_config. + init = {"SERVER_NAME": SERVICE, "MULTISITE": "yes", f"{SERVICE}_SERVER_NAME": SERVICE, f"{SERVICE}_USE_TEMPLATE": "tmpl"} + if extra: + init.update(extra) + self.assertNotIsInstance(self.db.save_config(init, "scheduler", changed=False), str) + self.assertNotIsInstance(self.db.save_config(self.db.get_config(methods=False), "scheduler", changed=False), str) + + def _seeded(self, **extra): + # Build a save_config dict the way real callers do: bare defaults seeded via get_config, then + # the explicit overrides. Needed so is_default_value takes its realistic (non-clean) branch. + cfg = self.db.get_config(methods=False) + cfg.update({"SERVER_NAME": SERVICE, "MULTISITE": "yes", f"{SERVICE}_SERVER_NAME": SERVICE}) + cfg.update(extra) + return cfg + + def _establish_service(self): + # A multisite service with a user-provided _1 group member (HOST_1). This creates the suffix-1 + # row that later makes get_config materialise the whole group's siblings. + initial = { + "SERVER_NAME": SERVICE, + "MULTISITE": "yes", + f"{SERVICE}_SERVER_NAME": SERVICE, + f"{SERVICE}_TEST_RP_HOST_1": "http://custom:8080", + } + err = self.db.save_config(initial, "scheduler", changed=False) + self.assertNotIsInstance(err, str, err) + self.assertEqual(len(self._rows("TEST_RP_HOST", 1)), 1) + + def test_default_sibling_not_persisted_as_scheduler_row(self): + self._establish_service() + + # Emulate the scheduler round-trip: get_config materialises TEST_RP_TIMEOUT_1=60s, then + # save_config(method="scheduler") re-ingests the full default-filled config. + full = self.db.get_config(methods=False) + self.assertEqual(full.get(f"{SERVICE}_TEST_RP_TIMEOUT_1"), "60s") + err = self.db.save_config(full, "scheduler", changed=False) + self.assertNotIsInstance(err, str, err) + + # The untouched default sibling must NOT get a persisted row (else it renders disabled in the UI). + self.assertEqual(self._rows("TEST_RP_TIMEOUT", 1), []) + # The user-set member is untouched. + self.assertEqual(len(self._rows("TEST_RP_HOST", 1)), 1) + + def test_stale_default_sibling_row_self_heals(self): + self._establish_service() + + # Simulate an already-corrupted lock: a scheduler row holding the plugin default value. + with self.db._db_session() as session: + session.add(Services_settings(service_id=SERVICE, setting_id="TEST_RP_TIMEOUT", value="60s", suffix=1, method="scheduler")) + session.commit() + self.assertEqual(len(self._rows("TEST_RP_TIMEOUT", 1)), 1) + + full = self.db.get_config(methods=False) + err = self.db.save_config(full, "scheduler", changed=False) + self.assertNotIsInstance(err, str, err) + + # The redundant default row is removed on the next scheduler save -> the field becomes editable. + self.assertEqual(self._rows("TEST_RP_TIMEOUT", 1), []) + + def test_non_default_sibling_is_preserved(self): + # Regression guard: the self-heal must NEVER delete a sibling whose value differs from the + # plugin default. Set TIMEOUT_1=30s (default is 60s) and confirm it survives round-trips. + self._establish_service() + with self.db._db_session() as session: + session.add(Services_settings(service_id=SERVICE, setting_id="TEST_RP_TIMEOUT", value="30s", suffix=1, method="scheduler")) + session.commit() + + for _ in range(2): + full = self.db.get_config(methods=False) + err = self.db.save_config(full, "scheduler", changed=False) + self.assertNotIsInstance(err, str, err) + + rows = self._rows("TEST_RP_TIMEOUT", 1) + self.assertEqual(len(rows), 1) + self.assertEqual(rows[0].value, "30s") + + def test_round_trip_is_idempotent(self): + # After the first self-heal, further scheduler round-trips must make NO further changes + # (no re-creation of default rows, no delete churn) -> no reload loop. + self._establish_service() + counts = [] + for _ in range(3): + full = self.db.get_config(methods=False) + err = self.db.save_config(full, "scheduler", changed=False) + self.assertNotIsInstance(err, str, err) + with self.db._db_session() as session: + counts.append(session.query(Services_settings).filter_by(service_id=SERVICE).filter(Services_settings.suffix == 1).count()) + # Only the HOST_1 anchor persists; the default TIMEOUT_1 sibling never accumulates -> stable. + self.assertEqual(counts, [1, 1, 1]) + + def test_ui_method_default_sibling_also_self_heals(self): + # The bug (and the fix) apply to UI/API saves too, not just scheduler: a ui-method default + # sibling row is likewise cleaned when compatible with the save method. + self._establish_service() + with self.db._db_session() as session: + session.add(Services_settings(service_id=SERVICE, setting_id="TEST_RP_TIMEOUT", value="60s", suffix=1, method="ui")) + session.commit() + self.assertEqual(len(self._rows("TEST_RP_TIMEOUT", 1)), 1) + + # A ui save carrying the default value self-heals the redundant ui row. + edit = { + "SERVER_NAME": SERVICE, + "MULTISITE": "yes", + f"{SERVICE}_SERVER_NAME": SERVICE, + f"{SERVICE}_TEST_RP_HOST_1": "http://custom:8080", + f"{SERVICE}_TEST_RP_TIMEOUT_1": "60s", + } + err = self.db.save_config(edit, "ui", changed=False) + self.assertNotIsInstance(err, str, err) + self.assertEqual(self._rows("TEST_RP_TIMEOUT", 1), []) + # The user-set HOST_1 (ui) is untouched. + self.assertEqual(len(self._rows("TEST_RP_HOST", 1)), 1) + + def test_anchorless_all_default_slot_is_preserved(self): + # THE key regression guard: for an anchorless group (limit-req shape), a slot whose members are + # ALL at their defaults is a valid user-declared config and must survive every round-trip. If it + # vanished, a rate-limit rule (or similar) declared at default values would be silently dropped. + # Build the config the way real callers (Configurator / get_config) do: bare defaults seeded for + # every setting, plus the explicit service-prefixed slot values. + initial = self.db.get_config(methods=False) + initial["SERVER_NAME"] = SERVICE + initial["MULTISITE"] = "yes" + initial[f"{SERVICE}_SERVER_NAME"] = SERVICE + initial[f"{SERVICE}_TEST_LIM_URL_1"] = "/" # equals plugin default + initial[f"{SERVICE}_TEST_LIM_RATE_1"] = "2r/s" # equals plugin default + err = self.db.save_config(initial, "scheduler", changed=False) + self.assertNotIsInstance(err, str, err) + self.assertEqual(len(self._rows("TEST_LIM_URL", 1)), 1) + self.assertEqual(len(self._rows("TEST_LIM_RATE", 1)), 1) + + for _ in range(2): + full = self.db.get_config(methods=False) + err = self.db.save_config(full, "scheduler", changed=False) + self.assertNotIsInstance(err, str, err) + + # Slot still present after repeated round-trips -> did NOT vanish. + self.assertEqual(len(self._rows("TEST_LIM_URL", 1)), 1) + self.assertEqual(len(self._rows("TEST_LIM_RATE", 1)), 1) + + def test_anchored_slot_keeps_anchor_drops_only_default_member(self): + # A slot with a non-default anchor (URL=/api) keeps the anchor and drops just the default sibling + # (RATE=2r/s), so the anchor renders and the default field stays editable. + initial = { + "SERVER_NAME": SERVICE, + "MULTISITE": "yes", + f"{SERVICE}_SERVER_NAME": SERVICE, + f"{SERVICE}_TEST_LIM_URL_1": "/api", # non-default anchor + f"{SERVICE}_TEST_LIM_RATE_1": "2r/s", # default sibling of an anchored slot + } + err = self.db.save_config(initial, "scheduler", changed=False) + self.assertNotIsInstance(err, str, err) + full = self.db.get_config(methods=False) + err = self.db.save_config(full, "scheduler", changed=False) + self.assertNotIsInstance(err, str, err) + + rows = self._rows("TEST_LIM_URL", 1) + self.assertEqual(len(rows), 1) + self.assertEqual(rows[0].value, "/api") + self.assertEqual(self._rows("TEST_LIM_RATE", 1), []) + + def test_bare_save_anchorless_slot_does_not_vanish(self): + # C1: a bare save that submits ONLY service-prefixed keys (no unprefixed base default) must still + # persist an all-default anchorless slot. Previously is_default_value's clean branch skipped it → vanish. + bare = { + "SERVER_NAME": SERVICE, + "MULTISITE": "yes", + f"{SERVICE}_SERVER_NAME": SERVICE, + f"{SERVICE}_TEST_LIM_URL_1": "/", # default value, bare save (no base key seeded) + f"{SERVICE}_TEST_LIM_RATE_1": "2r/s", + } + err = self.db.save_config(bare, "ui", changed=False) + self.assertNotIsInstance(err, str, err) + self.assertEqual(len(self._rows("TEST_LIM_URL", 1)), 1) + self.assertEqual(len(self._rows("TEST_LIM_RATE", 1)), 1) + + def test_global_anchored_slot_drops_default_sibling(self): + # A global multiple slot with a non-default anchor keeps the anchor and drops its default sibling, + # so the sibling stays editable on the global settings page (not locked as method=scheduler). + cfg = self._seeded(TEST_GLOG_FILE_1="/custom", TEST_GLOG_FMT_1="combined") + err = self.db.save_config(cfg, "scheduler", changed=False) + self.assertNotIsInstance(err, str, err) + cfg = self._seeded(TEST_GLOG_FILE_1="/custom", TEST_GLOG_FMT_1="combined") + err = self.db.save_config(cfg, "scheduler", changed=False) + self.assertNotIsInstance(err, str, err) + + anchor = self._grows("TEST_GLOG_FILE", 1) + self.assertEqual(len(anchor), 1) + self.assertEqual(anchor[0].value, "/custom") + self.assertEqual(self._grows("TEST_GLOG_FMT", 1), []) # default sibling dropped -> editable + + def test_edit_anchored_slot_down_to_all_default_does_not_vanish(self): + # D1: an EXISTING anchored slot edited down to all-default values must not vanish. The delete-to-default + # branch would otherwise drop the last rows; the slot must persist at its default values instead. + create = { + "SERVER_NAME": SERVICE, + "MULTISITE": "yes", + f"{SERVICE}_SERVER_NAME": SERVICE, + f"{SERVICE}_TEST_LIM_URL_1": "/api", + f"{SERVICE}_TEST_LIM_RATE_1": "10r/s", + } + self.assertNotIsInstance(self.db.save_config(create, "ui", changed=False), str) + self.assertEqual(len(self._rows("TEST_LIM_URL", 1)), 1) + self.assertEqual(len(self._rows("TEST_LIM_RATE", 1)), 1) + + # Edit both members down to their plugin defaults (bare save -> delete-to-default path). + edit = { + "SERVER_NAME": SERVICE, + "MULTISITE": "yes", + f"{SERVICE}_SERVER_NAME": SERVICE, + f"{SERVICE}_TEST_LIM_URL_1": "/", + f"{SERVICE}_TEST_LIM_RATE_1": "2r/s", + } + self.assertNotIsInstance(self.db.save_config(edit, "ui", changed=False), str) + url = self._rows("TEST_LIM_URL", 1) + rate = self._rows("TEST_LIM_RATE", 1) + self.assertEqual(len(url), 1) + self.assertEqual(url[0].value, "/") + self.assertEqual(len(rate), 1) + self.assertEqual(rate[0].value, "2r/s") + + def test_non_multisite_anchorless_slot_does_not_vanish(self): + # The non-multisite (MULTISITE=no) save path is a separate branch; it must also persist an + # all-default anchorless slot instead of skipping every member (which vanished the slot). + cfg = self.db.get_config(methods=False) + cfg.update({"SERVER_NAME": SERVICE, "MULTISITE": "no", "TEST_LIM_URL_1": "/", "TEST_LIM_RATE_1": "2r/s"}) + err = self.db.save_config(cfg, "scheduler", changed=False) + self.assertNotIsInstance(err, str, err) + with self.db._db_session() as session: + self.assertEqual(session.query(Global_values).filter_by(setting_id="TEST_LIM_URL", suffix=1).count(), 1) + self.assertEqual(session.query(Global_values).filter_by(setting_id="TEST_LIM_RATE", suffix=1).count(), 1) + + def test_non_multisite_anchored_slot_keeps_anchor_skips_default(self): + # Non-multisite anchored slot: the non-default anchor persists; the default sibling is skipped + # (stays editable). No lock, no vanish. + cfg = self.db.get_config(methods=False) + cfg.update({"SERVER_NAME": SERVICE, "MULTISITE": "no", "TEST_LIM_URL_1": "/api", "TEST_LIM_RATE_1": "2r/s"}) + err = self.db.save_config(cfg, "scheduler", changed=False) + self.assertNotIsInstance(err, str, err) + with self.db._db_session() as session: + self.assertEqual(session.query(Global_values).filter_by(setting_id="TEST_LIM_URL", suffix=1).count(), 1) + self.assertEqual(session.query(Global_values).filter_by(setting_id="TEST_LIM_RATE", suffix=1).count(), 0) + + def test_template_defined_slot_not_persisted(self): + # A template that defines a full multiple slot keeps it alive without rows; the round-trip must NOT + # persist its members (they would become spurious, field-locking rows). + self._mk_template(("TEST_RP_HOST", "tmplhost", 1), ("TEST_RP_TIMEOUT", "60s", 1)) + self._use_template() + self.assertEqual(self._rows("TEST_RP_HOST", 1), []) + self.assertEqual(self._rows("TEST_RP_TIMEOUT", 1), []) + + def test_template_partial_slot_not_persisted(self): + # Template defines only HOST_1; its sibling TIMEOUT_1's slot is kept alive by that HOST_1, so + # TIMEOUT_1 must also NOT be persisted. + self._mk_template(("TEST_RP_HOST", "tmplhost", 1)) + self._use_template() + self.assertEqual(self._rows("TEST_RP_HOST", 1), []) + self.assertEqual(self._rows("TEST_RP_TIMEOUT", 1), []) + + def test_template_slot_user_override_persists(self): + # A user override of a template slot member (non-default) is persisted; the template-default member is + # not. The round-trip (get_config -> save_config) also verifies global settings survive process_global_settings. + self._mk_template(("TEST_RP_HOST", "tmplhost", 1)) + self._use_template({f"{SERVICE}_TEST_RP_TIMEOUT_1": "30s"}) + self.assertEqual(self._rows("TEST_RP_HOST", 1), []) + rows = self._rows("TEST_RP_TIMEOUT", 1) + self.assertEqual(len(rows), 1) + self.assertEqual(rows[0].value, "30s") + + def test_global_anchorless_slot_bare_save_does_not_vanish(self): + # A global all-default anchorless slot declared via a BARE save (no unprefixed base default) must + # persist. Previously is_default_value's clean branch skipped it → the slot vanished. + bare = {"SERVER_NAME": SERVICE, "MULTISITE": "yes", f"{SERVICE}_SERVER_NAME": SERVICE, "TEST_GLOG_FMT_1": "combined"} + err = self.db.save_config(bare, "scheduler", changed=False) + self.assertNotIsInstance(err, str, err) + self.assertEqual(len(self._grows("TEST_GLOG_FMT", 1)), 1) From d92f226161cfef0adea7624005945cd06b886bc7 Mon Sep 17 00:00:00 2001 From: TheophileDiot Date: Thu, 23 Jul 2026 15:44:02 +0200 Subject: [PATCH 06/25] docs(mcp): sync MCP server example and docs to bunkerweb-mcp 0.2.0 --- docs/advanced.md | 8 ++++---- docs/de/advanced.md | 19 ++++--------------- docs/es/advanced.md | 19 ++++--------------- docs/fr/advanced.md | 19 ++++--------------- docs/zh/advanced.md | 19 ++++--------------- examples/mcp-stack/docker-compose.yml | 2 +- 6 files changed, 21 insertions(+), 65 deletions(-) diff --git a/docs/advanced.md b/docs/advanced.md index 1ed0c5560b..461c3922c9 100644 --- a/docs/advanced.md +++ b/docs/advanced.md @@ -3323,7 +3323,7 @@ The **BunkerWeb MCP server** enables AI assistants like **Claude Code** and **Cl ### Features -- **37 tools** for managing instances, services, configs, bans, plugins, jobs, and cache +- **43 tools** for managing instances, services, configs, bans, plugins, jobs, and cache - **MCP resources** for read-only access (`@config://global`, `@bans://active`, etc.) - **Multiple transports**: Stdio, HTTP, WebSocket @@ -3345,7 +3345,7 @@ services: - bw-mcp bw-mcp: - image: bunkerity/bunkerweb-mcp:v0.1.0 + image: bunkerity/bunkerweb-mcp:0.2.0 ports: - "127.0.0.1:8080:8080" environment: @@ -3394,7 +3394,7 @@ mcp: # Container image configuration repository: docker.io/bunkerity/bunkerweb-mcp - tag: v0.1.0 + tag: 0.2.0 # MCP server settings config: @@ -3441,7 +3441,7 @@ kubectl port-forward svc/mcp-bunkerweb 8080:8080 - **Network policies** to restrict pod-to-pod communication - **Port-forward** instead of exposing externally (recommended for development) -For full documentation, visit the [BunkerWeb MCP repository](https://github.com/bunkerity/mcp-bunkerweb). +For full documentation, visit the [BunkerWeb MCP repository](https://github.com/bunkerity/bunkerweb-mcp). ## Migration crown pro icon (PRO) {#migration-pro} diff --git a/docs/de/advanced.md b/docs/de/advanced.md index 99285d6098..d096d13c96 100644 --- a/docs/de/advanced.md +++ b/docs/de/advanced.md @@ -3322,7 +3322,7 @@ Der **BunkerWeb MCP-Server** ermöglicht es KI-Assistenten wie **Claude Code** u ### Funktionen -- **37 Tools** zur Verwaltung von Instanzen, Diensten, Konfigurationen, Sperren, Plugins, Jobs und Cache +- **43 Tools** zur Verwaltung von Instanzen, Diensten, Konfigurationen, Sperren, Plugins, Jobs und Cache - **MCP-Ressourcen** für schreibgeschützten Zugriff (`@config://global`, `@bans://active`, usw.) - **Mehrere Transporte**: Stdio, HTTP, WebSocket @@ -3344,7 +3344,7 @@ services: - bw-mcp bw-mcp: - image: bunkerity/bunkerweb-mcp:v0.1.0 + image: bunkerity/bunkerweb-mcp:0.2.0 ports: - "127.0.0.1:8080:8080" environment: @@ -3372,17 +3372,6 @@ services: } ``` -=== "CLI" - - ```bash - # MCP-Server über HTTP hinzufügen - claude mcp add --transport http bunkerweb --scope local http://localhost:8080/mcp - - # Oder über stdio (lokale Installation) - pip install mcp-bunkerweb - claude mcp add --transport stdio bunkerweb --scope local -- mcp-bunkerweb - ``` - Beispielanfragen: ``` @@ -3404,7 +3393,7 @@ mcp: # Container-Image-Konfiguration repository: docker.io/bunkerity/bunkerweb-mcp - tag: v0.1.0 + tag: 0.2.0 # MCP-Server-Einstellungen config: @@ -3451,7 +3440,7 @@ kubectl port-forward svc/mcp-bunkerweb 8080:8080 - **Netzwerkrichtlinien** zur Einschränkung der Pod-zu-Pod-Kommunikation - **Port-Forward** anstelle von externem Zugriff (empfohlen für Entwicklung) -Die vollständige Dokumentation finden Sie im [BunkerWeb MCP Repository](https://github.com/bunkerity/mcp-bunkerweb). +Die vollständige Dokumentation finden Sie im [BunkerWeb MCP Repository](https://github.com/bunkerity/bunkerweb-mcp). ## Migration crown pro icon (PRO) {#migration-pro} diff --git a/docs/es/advanced.md b/docs/es/advanced.md index 534128f13e..2adcbe1c8f 100644 --- a/docs/es/advanced.md +++ b/docs/es/advanced.md @@ -3322,7 +3322,7 @@ El **servidor MCP de BunkerWeb** permite que asistentes de IA como **Claude Code ### Características -- **37 herramientas** para gestionar instancias, servicios, configuraciones, baneos, plugins, jobs y caché +- **43 herramientas** para gestionar instancias, servicios, configuraciones, baneos, plugins, jobs y caché - **Recursos MCP** para acceso de solo lectura (`@config://global`, `@bans://active`, etc.) - **Múltiples transportes**: Stdio, HTTP, WebSocket @@ -3344,7 +3344,7 @@ services: - bw-mcp bw-mcp: - image: bunkerity/bunkerweb-mcp:v0.1.0 + image: bunkerity/bunkerweb-mcp:0.2.0 ports: - "127.0.0.1:8080:8080" environment: @@ -3372,17 +3372,6 @@ services: } ``` -=== "CLI" - - ```bash - # Añadir el servidor MCP vía HTTP - claude mcp add --transport http bunkerweb --scope local http://localhost:8080/mcp - - # O vía stdio (instalación local) - pip install mcp-bunkerweb - claude mcp add --transport stdio bunkerweb --scope local -- mcp-bunkerweb - ``` - Ejemplos de consultas: ``` @@ -3404,7 +3393,7 @@ mcp: # Configuración de la imagen del contenedor repository: docker.io/bunkerity/bunkerweb-mcp - tag: v0.1.0 + tag: 0.2.0 # Configuración del servidor MCP config: @@ -3451,7 +3440,7 @@ kubectl port-forward svc/mcp-bunkerweb 8080:8080 - **Políticas de red** para restringir la comunicación entre pods - **Port-forward** en lugar de exponer externamente (recomendado para desarrollo) -Para la documentación completa, visita el [repositorio BunkerWeb MCP](https://github.com/bunkerity/mcp-bunkerweb). +Para la documentación completa, visita el [repositorio BunkerWeb MCP](https://github.com/bunkerity/bunkerweb-mcp). ## Migración crown pro icon (PRO) {#migration-pro} diff --git a/docs/fr/advanced.md b/docs/fr/advanced.md index 3a9a852936..06799ebeba 100644 --- a/docs/fr/advanced.md +++ b/docs/fr/advanced.md @@ -3321,7 +3321,7 @@ Le **serveur MCP BunkerWeb** permet aux assistants IA comme **Claude Code** et * ### Fonctionnalités -- **37 outils** pour gérer les instances, services, configurations, bans, plugins, jobs et cache +- **43 outils** pour gérer les instances, services, configurations, bans, plugins, jobs et cache - **Ressources MCP** pour un accès en lecture seule (`@config://global`, `@bans://active`, etc.) - **Plusieurs transports** : Stdio, HTTP, WebSocket @@ -3343,7 +3343,7 @@ services: - bw-mcp bw-mcp: - image: bunkerity/bunkerweb-mcp:v0.1.0 + image: bunkerity/bunkerweb-mcp:0.2.0 ports: - "127.0.0.1:8080:8080" environment: @@ -3371,17 +3371,6 @@ services: } ``` -=== "CLI" - - ```bash - # Ajouter le serveur MCP via HTTP - claude mcp add --transport http bunkerweb --scope local http://localhost:8080/mcp - - # Ou via stdio (installation locale) - pip install mcp-bunkerweb - claude mcp add --transport stdio bunkerweb --scope local -- mcp-bunkerweb - ``` - Exemples de requêtes : ``` @@ -3403,7 +3392,7 @@ mcp: # Configuration de l'image repository: docker.io/bunkerity/bunkerweb-mcp - tag: v0.1.0 + tag: 0.2.0 # Paramètres du serveur MCP config: @@ -3450,7 +3439,7 @@ kubectl port-forward svc/mcp-bunkerweb 8080:8080 - **Politiques réseau** pour restreindre la communication entre pods - **Port-forward** au lieu d'exposer externellement (recommandé pour le développement) -Pour la documentation complète, visitez le [dépôt BunkerWeb MCP](https://github.com/bunkerity/mcp-bunkerweb). +Pour la documentation complète, visitez le [dépôt BunkerWeb MCP](https://github.com/bunkerity/bunkerweb-mcp). ## Migration crown pro icon (PRO) {#migration-pro} diff --git a/docs/zh/advanced.md b/docs/zh/advanced.md index 87bd9f0bda..ad697e694f 100644 --- a/docs/zh/advanced.md +++ b/docs/zh/advanced.md @@ -3319,7 +3319,7 @@ S3 备份工具可以无缝地自动化数据保护,类似于社区备份插 ### 功能 -- **37 个工具**用于管理实例、服务、配置、封禁、插件、任务和缓存 +- **43 个工具**用于管理实例、服务、配置、封禁、插件、任务和缓存 - **MCP 资源**用于只读访问(`@config://global`、`@bans://active` 等) - **多种传输方式**:Stdio、HTTP、WebSocket @@ -3341,7 +3341,7 @@ services: - bw-mcp bw-mcp: - image: bunkerity/bunkerweb-mcp:v0.1.0 + image: bunkerity/bunkerweb-mcp:0.2.0 ports: - "127.0.0.1:8080:8080" environment: @@ -3369,17 +3369,6 @@ services: } ``` -=== "CLI" - - ```bash - # 通过 HTTP 添加 MCP 服务器 - claude mcp add --transport http bunkerweb --scope local http://localhost:8080/mcp - - # 或通过 stdio(本地安装) - pip install mcp-bunkerweb - claude mcp add --transport stdio bunkerweb --scope local -- mcp-bunkerweb - ``` - 查询示例: ``` @@ -3401,7 +3390,7 @@ mcp: # 容器镜像配置 repository: docker.io/bunkerity/bunkerweb-mcp - tag: v0.1.0 + tag: 0.2.0 # MCP 服务器设置 config: @@ -3448,7 +3437,7 @@ kubectl port-forward svc/mcp-bunkerweb 8080:8080 - 使用**网络策略**限制 Pod 间通信 - 使用 **port-forward** 而不是外部暴露(推荐用于开发环境) -完整文档请访问 [BunkerWeb MCP 仓库](https://github.com/bunkerity/mcp-bunkerweb)。 +完整文档请访问 [BunkerWeb MCP 仓库](https://github.com/bunkerity/bunkerweb-mcp)。 ## 迁移 crown pro icon (PRO) {#migration-pro} diff --git a/examples/mcp-stack/docker-compose.yml b/examples/mcp-stack/docker-compose.yml index 4a19279e96..8ddbd40c3c 100644 --- a/examples/mcp-stack/docker-compose.yml +++ b/examples/mcp-stack/docker-compose.yml @@ -59,7 +59,7 @@ services: - bw-mcp bw-mcp: - image: bunkerity/bunkerweb-mcp:v0.1.0 + image: bunkerity/bunkerweb-mcp:0.2.0 ports: - "127.0.0.1:8080:8080" # Bind to localhost only — do not expose to the network without authentication environment: From c7bd7755110ebcf97c007654bfd0648878b97275 Mon Sep 17 00:00:00 2001 From: TheophileDiot Date: Fri, 24 Jul 2026 10:08:48 +0200 Subject: [PATCH 07/25] fix: validate environment variable names --- src/common/helpers/utils.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/common/helpers/utils.sh b/src/common/helpers/utils.sh index a13037ef4d..8dbfd5e1b3 100644 --- a/src/common/helpers/utils.sh +++ b/src/common/helpers/utils.sh @@ -120,14 +120,14 @@ function get_nginx_conf_dir() { echo "/etc/nginx" } -# Export key/value pairs from a simple env file (KEY=VALUE lines). +# Export shell-compatible key/value pairs from a simple env file (KEY=VALUE lines). function export_env_file() { local env_file=$1 [ -f "$env_file" ] || return 0 while IFS='=' read -r key value; do [[ -z "$key" || "$key" =~ ^# ]] && continue key=$(echo "$key" | xargs) - [[ -z "$key" ]] && continue + [[ "$key" =~ ^[A-Za-z_][A-Za-z0-9_]*$ ]] || continue export "$key=$value" done < "$env_file" } From c8b9001004ffb88811c6597865b1d2bbb5b0bca9 Mon Sep 17 00:00:00 2001 From: TheophileDiot Date: Fri, 24 Jul 2026 16:43:31 +0200 Subject: [PATCH 08/25] fix(ui): Improve UI performance for reports, logs, home, and plugin catalogs --- CHANGELOG.md | 7 +- src/ui/app/models/config.py | 64 ++- src/ui/app/models/instance.py | 131 +++++- src/ui/app/routes/logs.py | 39 +- src/ui/app/static/js/pages/reports.js | 12 + .../test_default_multiple_sibling_lock.py | 383 ------------------ 6 files changed, 226 insertions(+), 410 deletions(-) delete mode 100644 tests/unit/test_default_multiple_sibling_lock.py diff --git a/CHANGELOG.md b/CHANGELOG.md index 6762c162d6..f90393ee1a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,11 @@ # Changelog -## v1.6.14~rc1 - 2026/07/?? +## v1.6.14~rc2 - 2026/07/?? + +- [PERF] `ui`: make the Reports, Logs, and Home pages fast when many blocked-request reports are stored in Redis: fetch a single report by id from the newest end instead of scanning the whole list, share the Home page aggregation across workers through Redis instead of recomputing it in every worker, cache the Logs line count until the file changes or is rotated, and pause the Reports auto-refresh while the browser tab is in the background. Also honor the `k`/`m` suffix on `METRICS_MAX_BLOCKED_REQUESTS_REDIS` when bounding report reads. +- [PERF] `ui`: memoize the plugin catalog and rebuild it only when plugins change instead of on every request, cutting the fixed overhead paid on every page load. + +## v1.6.14~rc1 - 2026/07/23 - [BUGFIX] `mtls`: the Scheduler now validates the client CA bundle and CRL, caches them, and distributes them to every instance instead of shipping the raw configured path straight into the NGINX configuration, so a Scheduler-only mount works as documented instead of causing "cannot load certificate" errors on instances that cannot read that path. Adds `MTLS_CA_CERTIFICATE_DATA` and `MTLS_CRL_DATA` to supply either file inline as base64 or plaintext PEM. - [BUGFIX] `backup`: support MySQL 9 and MariaDB 12 backup/restore with current authentication, TLS, and privilege defaults while preserving compatibility with older servers; refresh the documented database compatibility matrix, including PostgreSQL 18. diff --git a/src/ui/app/models/config.py b/src/ui/app/models/config.py index 5c9e8c3b37..55b303e851 100644 --- a/src/ui/app/models/config.py +++ b/src/ui/app/models/config.py @@ -17,6 +17,42 @@ def __init__(self, db, data) -> None: self.__db = db self.__data = data self.__ignore_regex_check = getenv("IGNORE_REGEX_CHECK", "no").lower() == "yes" + # Per-process cache of the plugin catalog (get_plugins). Keyed by _type, + # invalidated by a plugin-change signal, so the ~6-query catalog build is + # paid once per plugin change instead of on every request. Bounded to one + # entry per _type. Only the with_data=False catalog is cached. + self.__plugins_cache: dict = {} + + def _plugins_cache_version(self): + """A value that changes only when the plugin catalog itself changes + (plugins installed/removed/updated/reloaded), NOT when setting values are + edited. Returns None if it can't be determined, in which case get_plugins + skips the cache and always recomputes. + + Note: this deliberately does not track ``init_tables`` core-plugin schema + writes. That is safe only because core plugins change solely on an image + upgrade (which restarts the UI, emptying this per-process cache) and core + settings are backstopped by ``settings.json`` in ``get_plugins_settings``. + A future "hot-reload core plugins without restart" feature would need a + signal added here. + """ + try: + metadata = self.__db.get_metadata() + except Exception: + return None + # get_metadata swallows read errors and returns its default dict flagged + # with "default": don't cache against an unreliable version, recompute. + if metadata.get("default"): + return None + plugins_config_changed = metadata.get("plugins_config_changed") + return ( + metadata.get("last_external_plugins_change"), + metadata.get("last_pro_plugins_change"), + bool(metadata.get("external_plugins_changed")), + bool(metadata.get("pro_plugins_changed")), + bool(metadata.get("reload_ui_plugins")), + tuple(sorted(plugins_config_changed.items())) if isinstance(plugins_config_changed, dict) else plugins_config_changed, + ) def gen_conf( self, @@ -77,12 +113,30 @@ def get_plugins_settings(self) -> dict: } def get_plugins(self, *, _type: Literal["all", "external", "ui", "pro"] = "all", with_data: bool = False) -> dict: - db_plugins = self.__db.get_plugins(_type=_type, with_data=with_data) - + # with_data payloads are large and only requested on specific user actions + # (plugin/template pages), never on the per-request render path, so they are + # not cached. The hot path is get_plugins() (with_data=False) on every request. + version = None if with_data else self._plugins_cache_version() + + db_plugins = None + if version is not None: + cached = self.__plugins_cache.get(_type) + if cached is not None and cached[0] == version: + db_plugins = cached[1] + + if db_plugins is None: + db_plugins = self.__db.get_plugins(_type=_type, with_data=with_data) + if version is not None: + self.__plugins_cache[_type] = (version, db_plugins) + + # Reshape a FRESH catalog on every call (new outer + per-plugin dicts, "id" + # dropped) so callers get an unaliased object exactly like the original + # code did. A caller mutating the returned dict can never poison the cache, + # and db_plugins is never mutated (no ``.pop``), so the cached raw result + # stays intact for the next reshape. plugins = {"general": {}} - - for plugin in db_plugins.copy(): - plugins[plugin.pop("id")] = plugin + for plugin in db_plugins: + plugins[plugin["id"]] = {k: v for k, v in plugin.items() if k != "id"} return plugins diff --git a/src/ui/app/models/instance.py b/src/ui/app/models/instance.py index 23cbe0f7aa..4dcf8efac8 100644 --- a/src/ui/app/models/instance.py +++ b/src/ui/app/models/instance.py @@ -2,9 +2,10 @@ from contextlib import suppress from datetime import datetime, timedelta from heapq import heappush, heapreplace -from json import loads +from json import dumps as json_dumps, loads from operator import itemgetter from os import getenv +from re import fullmatch from threading import Lock from time import monotonic from traceback import format_exc @@ -20,7 +21,10 @@ # Short-lived process-local cache for home page aggregates. /home recomputes a # full 7-day Redis aggregation on every load; caching it for a few seconds makes # repeated/concurrent loads near-instant. Per-process (each gunicorn worker has -# its own); data can be up to _HOME_AGG_CACHE_TTL seconds stale. +# its own), backed by a shared Redis snapshot (see _get/_set_shared_home_aggregates) +# so workers reuse one computation. Worst-case staleness is ~2x _HOME_AGG_CACHE_TTL: +# a worker can adopt another's snapshot near its TTL edge and hold it locally for a +# further TTL. Fine for a coarse 7-day dashboard. _HOME_AGG_CACHE: dict[tuple, tuple[float, dict]] = {} _HOME_AGG_CACHE_TTL = 30.0 # Serializes cache misses so concurrent /home loads compute the aggregation once @@ -50,6 +54,28 @@ def _copy_home_aggregates(agg: dict) -> dict: _REDIS_UNSET = object() +def _parse_count(value: Any, default: int = 0) -> int: + """Parse a plain integer or ``k``/``m`` shorthand (``10k``, ``1m``). + + Mirrors the Lua metrics ``parse_count`` (regex ``^%d+[kKmM]?$``) so the UI scan + cap honours the same ``METRICS_MAX_BLOCKED_REQUESTS_REDIS`` value the Redis list + is trimmed to, instead of ``int("10k")`` throwing and silently falling back. + Only digits plus an optional ``k``/``m`` suffix are accepted; anything else + (``1.5k``, negatives, exponents) returns ``default``, matching the Lua parser + and the config-schema regex rather than diverging from them. + """ + if isinstance(value, (int, float)): + return int(value) + try: + s = str(value).strip().lower() + except Exception: + return default + match = fullmatch(r"(\d+)([km]?)", s) + if not match: + return default + return int(match.group(1)) * {"": 1, "k": 1000, "m": 1000000}[match.group(2)] + + class Instance: hostname: str name: str @@ -246,7 +272,7 @@ def _get_max_blocked_requests_redis(self) -> int: default_max = 100000 try: config = self.__db.get_config(global_only=True, methods=False) - value = int(config.get("METRICS_MAX_BLOCKED_REQUESTS_REDIS", default_max)) + value = _parse_count(config.get("METRICS_MAX_BLOCKED_REQUESTS_REDIS", default_max), default_max) return max(0, value) except Exception: return default_max @@ -574,17 +600,12 @@ def get_report_data( if max_redis_requests == 0: return {} scan_start_idx = self._get_redis_scan_start_index(redis_client, max_redis_requests) - matched_report = None - matched_date = float("-inf") - for report in self._iter_redis_requests(redis_client, chunk_size=2000, start_index=scan_start_idx): - if str(report.get("id", "")) != report_id: - continue - report_date = float(report.get("date", 0) or 0) - if report_date >= matched_date: - matched_date = report_date - matched_report = report - if matched_report is not None: - return matched_report.get("data", {}) + # Iterate newest-first and stop at the first match: the tail-most + # occurrence of an id is its most recent one, so this avoids the + # full O(N) scan the forward loop needed to pick the max-date match. + for report in self._iter_redis_requests_reverse(redis_client, chunk_size=2000, start_index=scan_start_idx): + if str(report.get("id", "")) == report_id: + return report.get("data", {}) except Exception as e: LOGGER.warning(f"Failed to fetch report data from Redis: {e}") @@ -969,6 +990,41 @@ def _iter_redis_requests(self, redis_client, chunk_size: int = 2000, start_index break start = s + def _iter_redis_requests_reverse(self, redis_client, chunk_size: int = 2000, start_index: int = 0): + """Lazily yield decoded reports newest-first (tail -> head). + + RPUSH appends the newest report at the tail, and the list is written in + chronological order, so the first match a caller finds here is the most + recent occurrence of an id. Lets single-id lookups break early instead of + scanning the whole capped window (which is what the forward iterator + forces when it must pick the max-date match). + """ + try: + total = int(redis_client.llen("requests") or 0) + except Exception: + # Redis flaky: yield nothing so single-id callers fall through to the + # instance-API fallback (unlike the forward iterator's chunk-based + # termination — reverse callers early-break, so there is nothing to salvage). + return + low = max(0, start_index) + hi = total - 1 + while hi >= low: + lo = max(low, hi - chunk_size + 1) + try: + chunk = redis_client.lrange("requests", lo, hi) + except Exception: + return + if not chunk: + return + for report_raw in reversed(chunk): + try: + report = loads(report_raw) + except Exception: + continue + if isinstance(report, dict): + yield report + hi = lo - 1 + def _iter_instance_api_requests(self): """Fetch requests from BunkerWeb instance API (fallback when Redis is unavailable). @@ -1060,11 +1116,58 @@ def _fresh(): if hit is not None: return _copy_home_aggregates(hit) + # Cross-worker shared cache: another gunicorn worker may have computed + # this within the TTL. Read it from Redis before paying the full O(N) + # scan, so N workers don't each rescan the whole requests list. + shared = self._get_shared_home_aggregates(redis_client, cache_key) + if shared is not None: + _HOME_AGG_CACHE[cache_key] = (monotonic(), shared) + return _copy_home_aggregates(shared) + result = self._compute_home_aggregates(hours, top_ips_limit, redis_client) _HOME_AGG_CACHE[cache_key] = (monotonic(), result) + # ponytail: no distributed lock — on a cold miss up to N workers may + # each compute once before the first write lands (same as the old + # per-worker behaviour); afterwards all workers read the shared key. + self._set_shared_home_aggregates(redis_client, cache_key, result) # Hand the caller a copy; the cached object stays private. return _copy_home_aggregates(result) + @staticmethod + def _home_agg_redis_key(cache_key: tuple) -> str: + hours, top_ips_limit = cache_key + return f"metrics:home_agg:{hours}:{top_ips_limit}" + + def _get_shared_home_aggregates(self, redis_client, cache_key: tuple) -> Optional[dict]: + """Read a home-aggregates snapshot another worker stored in Redis. + + Returns None on miss/error. ``request_statuses`` keys are ints in-process + but JSON stringifies them, so they are converted back. + """ + if not redis_client: + return None + try: + raw = redis_client.get(self._home_agg_redis_key(cache_key)) + except Exception: + return None + if not raw: + return None + try: + data = loads(raw) + statuses = data.get("request_statuses") or {} + data["request_statuses"] = {int(k): v for k, v in statuses.items()} + return data + except Exception: + return None + + def _set_shared_home_aggregates(self, redis_client, cache_key: tuple, result: dict) -> None: + """Publish a home-aggregates snapshot to Redis with the same TTL as the + per-worker cache (volatile so it stays evictable under volatile-lru).""" + if not redis_client: + return + with suppress(Exception): + redis_client.set(self._home_agg_redis_key(cache_key), json_dumps(result), px=int(_HOME_AGG_CACHE_TTL * 1000)) + def _compute_home_aggregates(self, hours: int, top_ips_limit: int, redis_client: Any) -> dict[str, Any]: """Compute home aggregates from Redis (or the instance-API fallback). diff --git a/src/ui/app/routes/logs.py b/src/ui/app/routes/logs.py index 640586d3bb..b2c1688b1a 100644 --- a/src/ui/app/routes/logs.py +++ b/src/ui/app/routes/logs.py @@ -30,6 +30,34 @@ _stream_lock = threading.Lock() _active_streams = 0 +# Cache total line counts keyed by file identity: a repeat load of an unchanged +# file skips the full-file line scan (the dominant per-load cost on large logs). +# Identity = (st_dev, st_ino, st_size, st_mtime_ns) so a ROTATED log (same path, +# new inode, possibly same size + coarse mtime) is never served a stale count. +# ponytail: an actively-growing log changes size/mtime and still pays one full +# count per load (plus islice from the start for the latest page); a byte-offset +# index over appended bytes would make that incremental — add it if profiling +# shows active-log latency matters. +_LINECOUNT_CACHE: dict[str, tuple[tuple, int]] = {} +_LINECOUNT_LOCK = threading.Lock() + + +def _count_lines_cached(file_path: Path, stat_result) -> int: + key = str(file_path) + identity = (stat_result.st_dev, stat_result.st_ino, stat_result.st_size, stat_result.st_mtime_ns) + with _LINECOUNT_LOCK: + cached = _LINECOUNT_CACHE.get(key) + if cached and cached[0] == identity: + return cached[1] + # Count without holding the whole file in memory (one line resident at a time). + total = 0 + with file_path.open(encoding="utf-8", errors="replace") as f: + for _ in f: + total += 1 + with _LINECOUNT_LOCK: + _LINECOUNT_CACHE[key] = (identity, total) + return total + def _list_log_files(): """Return {'main': [...], 'letsencrypt': [...]} of the available *.log files.""" @@ -106,12 +134,10 @@ def logs_page(): if file_path is None or not file_path.is_file(): return Response("No such file", 404) - # Count lines without holding the whole file in memory (avoids OOM on - # very large logs — only one line is resident at a time). - total_lines = 0 - with file_path.open(encoding="utf-8", errors="replace") as f: - for _ in f: - total_lines += 1 + # Stat once, then count lines through an (size, mtime)-keyed cache so a + # repeat load of an unchanged log skips the full-file scan. + stat = file_path.stat() + total_lines = _count_lines_cached(file_path, stat) # Ceil division so an exact multiple of PAGE_SIZE doesn't add a spurious # trailing empty page (which would be the default "latest" view). page_num = max(1, -(-total_lines // PAGE_SIZE)) @@ -128,7 +154,6 @@ def logs_page(): with file_path.open(encoding="utf-8", errors="replace") as f: raw_logs = "".join(islice(f, start, start + PAGE_SIZE)).rstrip("\n") - stat = file_path.stat() file_meta = {"size": stat.st_size, "lines": total_lines, "mtime": stat.st_mtime} return render_template( diff --git a/src/ui/app/static/js/pages/reports.js b/src/ui/app/static/js/pages/reports.js index cd684af9ed..f8d95d7952 100644 --- a/src/ui/app/static/js/pages/reports.js +++ b/src/ui/app/static/js/pages/reports.js @@ -438,6 +438,10 @@ $(document).ready(function () { .addClass("btn-primary"); autoRefreshInterval = setInterval(() => { if (!autoRefresh) return; + // Skip the poll while the tab is backgrounded so a hidden tab with + // auto-refresh on stops hitting /reports/fetch + /reports/filters every + // 10s. A visibilitychange listener refreshes once when it returns. + if (document.hidden) return; $("#reports").DataTable().ajax.reload(null, false); }, 10000); // 10 seconds } else { @@ -457,6 +461,14 @@ $(document).ready(function () { }, }; + // When the tab comes back to the foreground with auto-refresh on, reload once + // immediately instead of waiting up to 10s (polls are skipped while hidden). + document.addEventListener("visibilitychange", () => { + if (!document.hidden && autoRefresh) { + $("#reports").DataTable().ajax.reload(null, false); + } + }); + // Initialize DataTable const reports_config = { tableSelector: "#reports", diff --git a/tests/unit/test_default_multiple_sibling_lock.py b/tests/unit/test_default_multiple_sibling_lock.py deleted file mode 100644 index fcee01a4ef..0000000000 --- a/tests/unit/test_default_multiple_sibling_lock.py +++ /dev/null @@ -1,383 +0,0 @@ -"""Regression tests for the multiple-group default-sibling lock bug. - -A multisite "multiple" group (e.g. reverse-proxy #1) has members the user never sets. The scheduler -config round-trip (db.get_config materialises every group member at its default -> variables.env -> -save_config(method="scheduler")) must NOT persist those default-valued siblings as Services_settings -rows: a persisted non-ui/api/default method row renders the field disabled in the Web UI even though -the value is an untouched default. - -Covers both directions: -- a fresh default sibling is not persisted (is_default_value recognises the plugin default); -- a pre-existing corrupted scheduler row holding a default value self-heals (is removed) on the next - scheduler save. -""" - -from copy import deepcopy -from json import loads -from pathlib import Path -from sys import path as sys_path -from tempfile import TemporaryDirectory -from types import SimpleNamespace -from unittest import TestCase - -REPO_ROOT = Path(__file__).resolve().parents[2] -for _extra_path in (REPO_ROOT / "src" / "common" / "db", REPO_ROOT / "src" / "common" / "utils"): - _extra_path_str = str(_extra_path) - if _extra_path_str not in sys_path: - sys_path.insert(0, _extra_path_str) - -from Database import Database # type: ignore # noqa: E402 -from model import Services_settings, Global_values, Templates, Template_steps, Template_settings # type: ignore # noqa: E402 - -SERVICE = "app.example.com" - - -def _multiple_setting(setting_id: str, default: str, group: str = "test-rp", context: str = "multisite") -> dict: - return { - "context": context, - "default": default, - "help": setting_id, - "id": setting_id.lower().replace("_", "-"), - "label": setting_id, - "regex": "^.*$", - "type": "text", - "multiple": group, - } - - -def _test_plugin() -> dict: - return { - "id": "testrp", - "name": "Test RP", - "description": "Multiple groups for testing", - "version": "1.0", - "stream": "no", - "type": "core", - "method": "manual", - "settings": { - # Anchored group: HOST has an empty default, so a real slot must set it (non-default anchor). - "TEST_RP_HOST": _multiple_setting("TEST_RP_HOST", ""), # user-set, non-default - "TEST_RP_TIMEOUT": _multiple_setting("TEST_RP_TIMEOUT", "60s"), # untouched default sibling - # Anchorless group (limit-req shape): BOTH members have non-empty defaults, so an all-default - # slot is a valid user-declared configuration that must NOT vanish. - "TEST_LIM_URL": _multiple_setting("TEST_LIM_URL", "/", "test-lim"), - "TEST_LIM_RATE": _multiple_setting("TEST_LIM_RATE", "2r/s", "test-lim"), - # GLOBAL multi-member group (access-logs shape) — same anchored-sibling / anchorless logic - # applies to global settings via process_global_settings. - "TEST_GLOG_FILE": _multiple_setting("TEST_GLOG_FILE", "/log", "test-glog", "global"), - "TEST_GLOG_FMT": _multiple_setting("TEST_GLOG_FMT", "combined", "test-glog", "global"), - }, - } - - -class DefaultMultipleSiblingLockTest(TestCase): - def setUp(self): - self.tmpdir = TemporaryDirectory() - db_path = Path(self.tmpdir.name) / "test.sqlite3" - self.logger = SimpleNamespace(info=lambda *_a: None, warning=lambda *_a: None, error=lambda *_a: None, debug=lambda *_a: None) - self.db = Database(self.logger, sqlalchemy_string=f"sqlite:///{db_path}") - general = loads((REPO_ROOT / "src" / "common" / "settings.json").read_text()) - ret, err = self.db.init_tables([general, deepcopy(_test_plugin())]) - self.assertFalse(err, err) - - def tearDown(self): - self.db.close() - self.tmpdir.cleanup() - - def _rows(self, setting_id: str, suffix: int): - with self.db._db_session() as session: - return session.query(Services_settings).filter_by(service_id=SERVICE, setting_id=setting_id, suffix=suffix).all() - - def _grows(self, setting_id: str, suffix: int): - with self.db._db_session() as session: - return session.query(Global_values).filter_by(setting_id=setting_id, suffix=suffix).all() - - def _mk_template(self, *settings): - # settings: iterable of (setting_id, default, suffix) - from datetime import datetime - - now = datetime.now().astimezone() - with self.db._db_session() as session: - session.add(Templates(id="tmpl", name="Tmpl", plugin_id=None, method="manual", creation_date=now, last_update=now)) - session.flush() - session.add(Template_steps(id=1, template_id="tmpl", title="Step", subtitle=None)) - for order, (sid, default, suffix) in enumerate(settings, 1): - session.add(Template_settings(template_id="tmpl", setting_id=sid, step_id=1, default=default, suffix=suffix, order=order)) - session.commit() - - def _use_template(self, extra=None): - # A service that uses the template, round-tripped through get_config -> save_config. - init = {"SERVER_NAME": SERVICE, "MULTISITE": "yes", f"{SERVICE}_SERVER_NAME": SERVICE, f"{SERVICE}_USE_TEMPLATE": "tmpl"} - if extra: - init.update(extra) - self.assertNotIsInstance(self.db.save_config(init, "scheduler", changed=False), str) - self.assertNotIsInstance(self.db.save_config(self.db.get_config(methods=False), "scheduler", changed=False), str) - - def _seeded(self, **extra): - # Build a save_config dict the way real callers do: bare defaults seeded via get_config, then - # the explicit overrides. Needed so is_default_value takes its realistic (non-clean) branch. - cfg = self.db.get_config(methods=False) - cfg.update({"SERVER_NAME": SERVICE, "MULTISITE": "yes", f"{SERVICE}_SERVER_NAME": SERVICE}) - cfg.update(extra) - return cfg - - def _establish_service(self): - # A multisite service with a user-provided _1 group member (HOST_1). This creates the suffix-1 - # row that later makes get_config materialise the whole group's siblings. - initial = { - "SERVER_NAME": SERVICE, - "MULTISITE": "yes", - f"{SERVICE}_SERVER_NAME": SERVICE, - f"{SERVICE}_TEST_RP_HOST_1": "http://custom:8080", - } - err = self.db.save_config(initial, "scheduler", changed=False) - self.assertNotIsInstance(err, str, err) - self.assertEqual(len(self._rows("TEST_RP_HOST", 1)), 1) - - def test_default_sibling_not_persisted_as_scheduler_row(self): - self._establish_service() - - # Emulate the scheduler round-trip: get_config materialises TEST_RP_TIMEOUT_1=60s, then - # save_config(method="scheduler") re-ingests the full default-filled config. - full = self.db.get_config(methods=False) - self.assertEqual(full.get(f"{SERVICE}_TEST_RP_TIMEOUT_1"), "60s") - err = self.db.save_config(full, "scheduler", changed=False) - self.assertNotIsInstance(err, str, err) - - # The untouched default sibling must NOT get a persisted row (else it renders disabled in the UI). - self.assertEqual(self._rows("TEST_RP_TIMEOUT", 1), []) - # The user-set member is untouched. - self.assertEqual(len(self._rows("TEST_RP_HOST", 1)), 1) - - def test_stale_default_sibling_row_self_heals(self): - self._establish_service() - - # Simulate an already-corrupted lock: a scheduler row holding the plugin default value. - with self.db._db_session() as session: - session.add(Services_settings(service_id=SERVICE, setting_id="TEST_RP_TIMEOUT", value="60s", suffix=1, method="scheduler")) - session.commit() - self.assertEqual(len(self._rows("TEST_RP_TIMEOUT", 1)), 1) - - full = self.db.get_config(methods=False) - err = self.db.save_config(full, "scheduler", changed=False) - self.assertNotIsInstance(err, str, err) - - # The redundant default row is removed on the next scheduler save -> the field becomes editable. - self.assertEqual(self._rows("TEST_RP_TIMEOUT", 1), []) - - def test_non_default_sibling_is_preserved(self): - # Regression guard: the self-heal must NEVER delete a sibling whose value differs from the - # plugin default. Set TIMEOUT_1=30s (default is 60s) and confirm it survives round-trips. - self._establish_service() - with self.db._db_session() as session: - session.add(Services_settings(service_id=SERVICE, setting_id="TEST_RP_TIMEOUT", value="30s", suffix=1, method="scheduler")) - session.commit() - - for _ in range(2): - full = self.db.get_config(methods=False) - err = self.db.save_config(full, "scheduler", changed=False) - self.assertNotIsInstance(err, str, err) - - rows = self._rows("TEST_RP_TIMEOUT", 1) - self.assertEqual(len(rows), 1) - self.assertEqual(rows[0].value, "30s") - - def test_round_trip_is_idempotent(self): - # After the first self-heal, further scheduler round-trips must make NO further changes - # (no re-creation of default rows, no delete churn) -> no reload loop. - self._establish_service() - counts = [] - for _ in range(3): - full = self.db.get_config(methods=False) - err = self.db.save_config(full, "scheduler", changed=False) - self.assertNotIsInstance(err, str, err) - with self.db._db_session() as session: - counts.append(session.query(Services_settings).filter_by(service_id=SERVICE).filter(Services_settings.suffix == 1).count()) - # Only the HOST_1 anchor persists; the default TIMEOUT_1 sibling never accumulates -> stable. - self.assertEqual(counts, [1, 1, 1]) - - def test_ui_method_default_sibling_also_self_heals(self): - # The bug (and the fix) apply to UI/API saves too, not just scheduler: a ui-method default - # sibling row is likewise cleaned when compatible with the save method. - self._establish_service() - with self.db._db_session() as session: - session.add(Services_settings(service_id=SERVICE, setting_id="TEST_RP_TIMEOUT", value="60s", suffix=1, method="ui")) - session.commit() - self.assertEqual(len(self._rows("TEST_RP_TIMEOUT", 1)), 1) - - # A ui save carrying the default value self-heals the redundant ui row. - edit = { - "SERVER_NAME": SERVICE, - "MULTISITE": "yes", - f"{SERVICE}_SERVER_NAME": SERVICE, - f"{SERVICE}_TEST_RP_HOST_1": "http://custom:8080", - f"{SERVICE}_TEST_RP_TIMEOUT_1": "60s", - } - err = self.db.save_config(edit, "ui", changed=False) - self.assertNotIsInstance(err, str, err) - self.assertEqual(self._rows("TEST_RP_TIMEOUT", 1), []) - # The user-set HOST_1 (ui) is untouched. - self.assertEqual(len(self._rows("TEST_RP_HOST", 1)), 1) - - def test_anchorless_all_default_slot_is_preserved(self): - # THE key regression guard: for an anchorless group (limit-req shape), a slot whose members are - # ALL at their defaults is a valid user-declared config and must survive every round-trip. If it - # vanished, a rate-limit rule (or similar) declared at default values would be silently dropped. - # Build the config the way real callers (Configurator / get_config) do: bare defaults seeded for - # every setting, plus the explicit service-prefixed slot values. - initial = self.db.get_config(methods=False) - initial["SERVER_NAME"] = SERVICE - initial["MULTISITE"] = "yes" - initial[f"{SERVICE}_SERVER_NAME"] = SERVICE - initial[f"{SERVICE}_TEST_LIM_URL_1"] = "/" # equals plugin default - initial[f"{SERVICE}_TEST_LIM_RATE_1"] = "2r/s" # equals plugin default - err = self.db.save_config(initial, "scheduler", changed=False) - self.assertNotIsInstance(err, str, err) - self.assertEqual(len(self._rows("TEST_LIM_URL", 1)), 1) - self.assertEqual(len(self._rows("TEST_LIM_RATE", 1)), 1) - - for _ in range(2): - full = self.db.get_config(methods=False) - err = self.db.save_config(full, "scheduler", changed=False) - self.assertNotIsInstance(err, str, err) - - # Slot still present after repeated round-trips -> did NOT vanish. - self.assertEqual(len(self._rows("TEST_LIM_URL", 1)), 1) - self.assertEqual(len(self._rows("TEST_LIM_RATE", 1)), 1) - - def test_anchored_slot_keeps_anchor_drops_only_default_member(self): - # A slot with a non-default anchor (URL=/api) keeps the anchor and drops just the default sibling - # (RATE=2r/s), so the anchor renders and the default field stays editable. - initial = { - "SERVER_NAME": SERVICE, - "MULTISITE": "yes", - f"{SERVICE}_SERVER_NAME": SERVICE, - f"{SERVICE}_TEST_LIM_URL_1": "/api", # non-default anchor - f"{SERVICE}_TEST_LIM_RATE_1": "2r/s", # default sibling of an anchored slot - } - err = self.db.save_config(initial, "scheduler", changed=False) - self.assertNotIsInstance(err, str, err) - full = self.db.get_config(methods=False) - err = self.db.save_config(full, "scheduler", changed=False) - self.assertNotIsInstance(err, str, err) - - rows = self._rows("TEST_LIM_URL", 1) - self.assertEqual(len(rows), 1) - self.assertEqual(rows[0].value, "/api") - self.assertEqual(self._rows("TEST_LIM_RATE", 1), []) - - def test_bare_save_anchorless_slot_does_not_vanish(self): - # C1: a bare save that submits ONLY service-prefixed keys (no unprefixed base default) must still - # persist an all-default anchorless slot. Previously is_default_value's clean branch skipped it → vanish. - bare = { - "SERVER_NAME": SERVICE, - "MULTISITE": "yes", - f"{SERVICE}_SERVER_NAME": SERVICE, - f"{SERVICE}_TEST_LIM_URL_1": "/", # default value, bare save (no base key seeded) - f"{SERVICE}_TEST_LIM_RATE_1": "2r/s", - } - err = self.db.save_config(bare, "ui", changed=False) - self.assertNotIsInstance(err, str, err) - self.assertEqual(len(self._rows("TEST_LIM_URL", 1)), 1) - self.assertEqual(len(self._rows("TEST_LIM_RATE", 1)), 1) - - def test_global_anchored_slot_drops_default_sibling(self): - # A global multiple slot with a non-default anchor keeps the anchor and drops its default sibling, - # so the sibling stays editable on the global settings page (not locked as method=scheduler). - cfg = self._seeded(TEST_GLOG_FILE_1="/custom", TEST_GLOG_FMT_1="combined") - err = self.db.save_config(cfg, "scheduler", changed=False) - self.assertNotIsInstance(err, str, err) - cfg = self._seeded(TEST_GLOG_FILE_1="/custom", TEST_GLOG_FMT_1="combined") - err = self.db.save_config(cfg, "scheduler", changed=False) - self.assertNotIsInstance(err, str, err) - - anchor = self._grows("TEST_GLOG_FILE", 1) - self.assertEqual(len(anchor), 1) - self.assertEqual(anchor[0].value, "/custom") - self.assertEqual(self._grows("TEST_GLOG_FMT", 1), []) # default sibling dropped -> editable - - def test_edit_anchored_slot_down_to_all_default_does_not_vanish(self): - # D1: an EXISTING anchored slot edited down to all-default values must not vanish. The delete-to-default - # branch would otherwise drop the last rows; the slot must persist at its default values instead. - create = { - "SERVER_NAME": SERVICE, - "MULTISITE": "yes", - f"{SERVICE}_SERVER_NAME": SERVICE, - f"{SERVICE}_TEST_LIM_URL_1": "/api", - f"{SERVICE}_TEST_LIM_RATE_1": "10r/s", - } - self.assertNotIsInstance(self.db.save_config(create, "ui", changed=False), str) - self.assertEqual(len(self._rows("TEST_LIM_URL", 1)), 1) - self.assertEqual(len(self._rows("TEST_LIM_RATE", 1)), 1) - - # Edit both members down to their plugin defaults (bare save -> delete-to-default path). - edit = { - "SERVER_NAME": SERVICE, - "MULTISITE": "yes", - f"{SERVICE}_SERVER_NAME": SERVICE, - f"{SERVICE}_TEST_LIM_URL_1": "/", - f"{SERVICE}_TEST_LIM_RATE_1": "2r/s", - } - self.assertNotIsInstance(self.db.save_config(edit, "ui", changed=False), str) - url = self._rows("TEST_LIM_URL", 1) - rate = self._rows("TEST_LIM_RATE", 1) - self.assertEqual(len(url), 1) - self.assertEqual(url[0].value, "/") - self.assertEqual(len(rate), 1) - self.assertEqual(rate[0].value, "2r/s") - - def test_non_multisite_anchorless_slot_does_not_vanish(self): - # The non-multisite (MULTISITE=no) save path is a separate branch; it must also persist an - # all-default anchorless slot instead of skipping every member (which vanished the slot). - cfg = self.db.get_config(methods=False) - cfg.update({"SERVER_NAME": SERVICE, "MULTISITE": "no", "TEST_LIM_URL_1": "/", "TEST_LIM_RATE_1": "2r/s"}) - err = self.db.save_config(cfg, "scheduler", changed=False) - self.assertNotIsInstance(err, str, err) - with self.db._db_session() as session: - self.assertEqual(session.query(Global_values).filter_by(setting_id="TEST_LIM_URL", suffix=1).count(), 1) - self.assertEqual(session.query(Global_values).filter_by(setting_id="TEST_LIM_RATE", suffix=1).count(), 1) - - def test_non_multisite_anchored_slot_keeps_anchor_skips_default(self): - # Non-multisite anchored slot: the non-default anchor persists; the default sibling is skipped - # (stays editable). No lock, no vanish. - cfg = self.db.get_config(methods=False) - cfg.update({"SERVER_NAME": SERVICE, "MULTISITE": "no", "TEST_LIM_URL_1": "/api", "TEST_LIM_RATE_1": "2r/s"}) - err = self.db.save_config(cfg, "scheduler", changed=False) - self.assertNotIsInstance(err, str, err) - with self.db._db_session() as session: - self.assertEqual(session.query(Global_values).filter_by(setting_id="TEST_LIM_URL", suffix=1).count(), 1) - self.assertEqual(session.query(Global_values).filter_by(setting_id="TEST_LIM_RATE", suffix=1).count(), 0) - - def test_template_defined_slot_not_persisted(self): - # A template that defines a full multiple slot keeps it alive without rows; the round-trip must NOT - # persist its members (they would become spurious, field-locking rows). - self._mk_template(("TEST_RP_HOST", "tmplhost", 1), ("TEST_RP_TIMEOUT", "60s", 1)) - self._use_template() - self.assertEqual(self._rows("TEST_RP_HOST", 1), []) - self.assertEqual(self._rows("TEST_RP_TIMEOUT", 1), []) - - def test_template_partial_slot_not_persisted(self): - # Template defines only HOST_1; its sibling TIMEOUT_1's slot is kept alive by that HOST_1, so - # TIMEOUT_1 must also NOT be persisted. - self._mk_template(("TEST_RP_HOST", "tmplhost", 1)) - self._use_template() - self.assertEqual(self._rows("TEST_RP_HOST", 1), []) - self.assertEqual(self._rows("TEST_RP_TIMEOUT", 1), []) - - def test_template_slot_user_override_persists(self): - # A user override of a template slot member (non-default) is persisted; the template-default member is - # not. The round-trip (get_config -> save_config) also verifies global settings survive process_global_settings. - self._mk_template(("TEST_RP_HOST", "tmplhost", 1)) - self._use_template({f"{SERVICE}_TEST_RP_TIMEOUT_1": "30s"}) - self.assertEqual(self._rows("TEST_RP_HOST", 1), []) - rows = self._rows("TEST_RP_TIMEOUT", 1) - self.assertEqual(len(rows), 1) - self.assertEqual(rows[0].value, "30s") - - def test_global_anchorless_slot_bare_save_does_not_vanish(self): - # A global all-default anchorless slot declared via a BARE save (no unprefixed base default) must - # persist. Previously is_default_value's clean branch skipped it → the slot vanished. - bare = {"SERVER_NAME": SERVICE, "MULTISITE": "yes", f"{SERVICE}_SERVER_NAME": SERVICE, "TEST_GLOG_FMT_1": "combined"} - err = self.db.save_config(bare, "scheduler", changed=False) - self.assertNotIsInstance(err, str, err) - self.assertEqual(len(self._grows("TEST_GLOG_FMT", 1)), 1) From 564b369a6525163c32c296a0861231f87099eb1b Mon Sep 17 00:00:00 2001 From: TheophileDiot Date: Mon, 27 Jul 2026 10:20:23 +0200 Subject: [PATCH 09/25] fix(metrics): keep reports when datastore fills --- CHANGELOG.md | 2 ++ docs/de/features.md | 23 ++++++++++--------- docs/es/features.md | 23 ++++++++++--------- docs/features.md | 23 ++++++++++--------- docs/fr/features.md | 23 ++++++++++--------- docs/zh/features.md | 23 ++++++++++--------- src/common/core/metrics/README.de.md | 3 +++ src/common/core/metrics/README.es.md | 3 +++ src/common/core/metrics/README.fr.md | 3 +++ src/common/core/metrics/README.md | 3 +++ src/common/core/metrics/README.zh.md | 3 +++ src/common/core/metrics/metrics.lua | 33 +++++++++++++++++++++++++--- src/ui/app/static/locales/ar.json | 1 + src/ui/app/static/locales/bn.json | 1 + src/ui/app/static/locales/br.json | 1 + src/ui/app/static/locales/de.json | 1 + src/ui/app/static/locales/en.json | 1 + src/ui/app/static/locales/es.json | 1 + src/ui/app/static/locales/fr.json | 1 + src/ui/app/static/locales/hi.json | 1 + src/ui/app/static/locales/it.json | 1 + src/ui/app/static/locales/ko.json | 1 + src/ui/app/static/locales/pl.json | 1 + src/ui/app/static/locales/pt.json | 1 + src/ui/app/static/locales/ru.json | 1 + src/ui/app/static/locales/tl.json | 1 + src/ui/app/static/locales/tr.json | 1 + src/ui/app/static/locales/tw.json | 1 + src/ui/app/static/locales/ur.json | 1 + src/ui/app/static/locales/zh.json | 1 + src/ui/app/templates/reports.html | 26 +++++++++++++--------- 31 files changed, 146 insertions(+), 63 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f90393ee1a..f5ced6b1ab 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,8 @@ - [PERF] `ui`: make the Reports, Logs, and Home pages fast when many blocked-request reports are stored in Redis: fetch a single report by id from the newest end instead of scanning the whole list, share the Home page aggregation across workers through Redis instead of recomputing it in every worker, cache the Logs line count until the file changes or is rotated, and pause the Reports auto-refresh while the browser tab is in the background. Also honor the `k`/`m` suffix on `METRICS_MAX_BLOCKED_REQUESTS_REDIS` when bounding report reads. - [PERF] `ui`: memoize the plugin catalog and rebuild it only when plugins change instead of on every request, cutting the fixed overhead paid on every page load. +- [BUGFIX] `metrics`: when the metrics memory zone fills up, shed the oldest blocked-request reports instead of silently discarding a worker's whole history, and warn that `METRICS_MEMORY_SIZE` needs raising. +- [UI] Reports page: document the retention model, a rolling buffer capped per worker that is cleared on restart unless Redis is enabled. ## v1.6.14~rc1 - 2026/07/23 diff --git a/docs/de/features.md b/docs/de/features.md index 8c7a1befe3..3c1abe5511 100644 --- a/docs/de/features.md +++ b/docs/de/features.md @@ -2866,17 +2866,17 @@ Führen Sie die folgenden Schritte aus, um die Headers-Funktion zu konfigurieren - **X-Frame-Options:** Blockiert Clickjacking-Versuche durch die Kontrolle der Iframe-Einbettung. - **Referrer Policy:** Begrenzt das Durchsickern sensibler Informationen über Referrer-Header. - | Einstellung | Standard | Kontext | Mehrfach | Beschreibung | - | ------------------------------------- | --------------------------------------------------------------------------------------------------- | --------- | -------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------- | - | `STRICT_TRANSPORT_SECURITY` | `max-age=63072000; includeSubDomains; preload` | multisite | nein | **HSTS:** Erzwingt sichere HTTPS-Verbindungen und verringert das Risiko von Man-in-the-Middle-Angriffen. | - | `CONTENT_SECURITY_POLICY` | `object-src 'none'; form-action 'self'; frame-ancestors 'self';` | multisite | nein | **CSP:** Beschränkt das Laden von Ressourcen auf vertrauenswürdige Quellen und mindert Cross-Site-Scripting- und Dateninjektionsangriffe. | - | `CONTENT_SECURITY_POLICY_REPORT_ONLY` | `no` | multisite | nein | **CSP-Berichtsmodus:** Meldet Verstöße, ohne Inhalte zu blockieren, und hilft beim Testen von Sicherheitsrichtlinien, während Protokolle erfasst werden. | - | `X_FRAME_OPTIONS` | `SAMEORIGIN` | multisite | nein | **X-Frame-Options:** Verhindert Clickjacking, indem es steuert, ob Ihre Website in einem Frame dargestellt werden kann. | - | `X_CONTENT_TYPE_OPTIONS` | `nosniff` | multisite | nein | **X-Content-Type-Options:** Verhindert, dass Browser MIME-Sniffing betreiben, und schützt so vor Drive-by-Download-Angriffen. | - | `X_DNS_PREFETCH_CONTROL` | `off` | multisite | nein | **X-DNS-Prefetch-Control:** Reguliert das DNS-Prefetching, um unbeabsichtigte Netzwerkanfragen zu reduzieren und die Privatsphäre zu verbessern. | - | `REFERRER_POLICY` | `strict-origin-when-cross-origin` | multisite | nein | **Referrer Policy:** Steuert die Menge der gesendeten Referrer-Informationen und schützt die Privatsphäre der Benutzer. | + | Einstellung | Standard | Kontext | Mehrfach | Beschreibung | + | ------------------------------------- | ----------------------------------------------------------------------------------------------------- | --------- | -------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------- | + | `STRICT_TRANSPORT_SECURITY` | `max-age=63072000; includeSubDomains; preload` | multisite | nein | **HSTS:** Erzwingt sichere HTTPS-Verbindungen und verringert das Risiko von Man-in-the-Middle-Angriffen. | + | `CONTENT_SECURITY_POLICY` | `object-src 'none'; form-action 'self'; frame-ancestors 'self';` | multisite | nein | **CSP:** Beschränkt das Laden von Ressourcen auf vertrauenswürdige Quellen und mindert Cross-Site-Scripting- und Dateninjektionsangriffe. | + | `CONTENT_SECURITY_POLICY_REPORT_ONLY` | `no` | multisite | nein | **CSP-Berichtsmodus:** Meldet Verstöße, ohne Inhalte zu blockieren, und hilft beim Testen von Sicherheitsrichtlinien, während Protokolle erfasst werden. | + | `X_FRAME_OPTIONS` | `SAMEORIGIN` | multisite | nein | **X-Frame-Options:** Verhindert Clickjacking, indem es steuert, ob Ihre Website in einem Frame dargestellt werden kann. | + | `X_CONTENT_TYPE_OPTIONS` | `nosniff` | multisite | nein | **X-Content-Type-Options:** Verhindert, dass Browser MIME-Sniffing betreiben, und schützt so vor Drive-by-Download-Angriffen. | + | `X_DNS_PREFETCH_CONTROL` | `off` | multisite | nein | **X-DNS-Prefetch-Control:** Reguliert das DNS-Prefetching, um unbeabsichtigte Netzwerkanfragen zu reduzieren und die Privatsphäre zu verbessern. | + | `REFERRER_POLICY` | `strict-origin-when-cross-origin` | multisite | nein | **Referrer Policy:** Steuert die Menge der gesendeten Referrer-Informationen und schützt die Privatsphäre der Benutzer. | | `PERMISSIONS_POLICY` | `accelerometer=(), ambient-light-sensor=(), attribution-reporting=(), autoplay=(), bluetooth=(), ...` | multisite | nein | **Permissions Policy:** Beschränkt den Zugriff auf Browserfunktionen und reduziert potenzielle Angriffsvektoren. | - | `KEEP_UPSTREAM_HEADERS` | `Content-Security-Policy Content-Security-Policy-Report-Only Permissions-Policy X-Frame-Options` | multisite | nein | **Header beibehalten:** Behält ausgewählte Upstream-Header bei, was die Integration von Altsystemen erleichtert und gleichzeitig die Sicherheit aufrechterhält. | + | `KEEP_UPSTREAM_HEADERS` | `Content-Security-Policy Content-Security-Policy-Report-Only Permissions-Policy X-Frame-Options` | multisite | nein | **Header beibehalten:** Behält ausgewählte Upstream-Header bei, was die Integration von Altsystemen erleichtert und gleichzeitig die Sicherheit aufrechterhält. | !!! tip "Bewährte Praktiken" - Überprüfen und aktualisieren Sie Ihre Sicherheits-Header regelmäßig, um sie an die sich entwickelnden Sicherheitsstandards anzupassen. @@ -3632,6 +3632,9 @@ Zum Beispiel gibt `/metrics/requests` Informationen über blockierte Anfragen zu !!! note "Worker-spezifischer Speicher" Jeder NGINX-Worker verwaltet seine eigenen Metriken im Speicher. Beim Zugriff auf Metriken über die API werden die Daten aller Worker automatisch aggregiert, um eine vollständige Ansicht zu erhalten. +!!! warning "Aufbewahrung der Berichte" + Berichte über blockierte Anfragen sind ein rollierender Puffer, kein Audit-Log. Sobald das Limit erreicht ist, werden die ältesten Berichte verworfen, um Platz für neue zu schaffen. Die in der Web-UI angezeigte Gesamtzahl bleibt deshalb konstant: ohne Redis liegt diese Obergrenze bei `METRICS_MAX_BLOCKED_REQUESTS` multipliziert mit der Anzahl der NGINX-Worker jeder Instanz, mit Redis bei `METRICS_MAX_BLOCKED_REQUESTS_REDIS`. Berichte liegen im Shared Memory und werden bei jedem Neustart von BunkerWeb gelöscht, auch bei Paket-Upgrades, sofern Redis nicht aktiviert und persistent ist. Leiten Sie die NGINX-Logs an einen Syslog-Server oder ein SIEM weiter, wenn Sie eine langfristige Aufbewahrung benötigen. + ### Beispielkonfigurationen === "Grundlegende Konfiguration" diff --git a/docs/es/features.md b/docs/es/features.md index d68e073a2b..3593bedfd5 100644 --- a/docs/es/features.md +++ b/docs/es/features.md @@ -2919,17 +2919,17 @@ Siga estos pasos para configurar y usar la función de Cabeceras: - **X-Frame-Options:** Bloquea los intentos de clickjacking controlando la incrustación de iframes. - **Referrer Policy:** Limita la fuga de información sensible a través de las cabeceras de referencia. -| Ajuste | Valor por defecto | Contexto | Múltiple | Descripción | -| ------------------------------------- | --------------------------------------------------------------------------------------------------- | --------- | -------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `STRICT_TRANSPORT_SECURITY` | `max-age=63072000; includeSubDomains; preload` | multisite | no | **HSTS:** Impone conexiones HTTPS seguras, reduciendo los riesgos de ataques de intermediario (man-in-the-middle). | -| `CONTENT_SECURITY_POLICY` | `object-src 'none'; form-action 'self'; frame-ancestors 'self';` | multisite | no | **CSP:** Restringe la carga de recursos a fuentes de confianza, mitigando los ataques de cross-site scripting e inyección de datos. | -| `CONTENT_SECURITY_POLICY_REPORT_ONLY` | `no` | multisite | no | **Modo de Informe CSP:** Informa de las violaciones sin bloquear el contenido, ayudando a probar las políticas de seguridad mientras se capturan los registros. | -| `X_FRAME_OPTIONS` | `SAMEORIGIN` | multisite | no | **X-Frame-Options:** Previene el clickjacking controlando si su sitio puede ser enmarcado (framed). | -| `X_CONTENT_TYPE_OPTIONS` | `nosniff` | multisite | no | **X-Content-Type-Options:** Evita que los navegadores realicen "MIME-sniffing", protegiendo contra ataques de descarga no autorizada (drive-by download). | -| `X_DNS_PREFETCH_CONTROL` | `off` | multisite | no | **X-DNS-Prefetch-Control:** Regula la captación previa de DNS para reducir las solicitudes de red no intencionadas y mejorar la privacidad. | -| `REFERRER_POLICY` | `strict-origin-when-cross-origin` | multisite | no | **Política de Referencia:** Controla la cantidad de información de referencia enviada, salvaguardando la privacidad del usuario. | +| Ajuste | Valor por defecto | Contexto | Múltiple | Descripción | +| ------------------------------------- | ----------------------------------------------------------------------------------------------------- | --------- | -------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `STRICT_TRANSPORT_SECURITY` | `max-age=63072000; includeSubDomains; preload` | multisite | no | **HSTS:** Impone conexiones HTTPS seguras, reduciendo los riesgos de ataques de intermediario (man-in-the-middle). | +| `CONTENT_SECURITY_POLICY` | `object-src 'none'; form-action 'self'; frame-ancestors 'self';` | multisite | no | **CSP:** Restringe la carga de recursos a fuentes de confianza, mitigando los ataques de cross-site scripting e inyección de datos. | +| `CONTENT_SECURITY_POLICY_REPORT_ONLY` | `no` | multisite | no | **Modo de Informe CSP:** Informa de las violaciones sin bloquear el contenido, ayudando a probar las políticas de seguridad mientras se capturan los registros. | +| `X_FRAME_OPTIONS` | `SAMEORIGIN` | multisite | no | **X-Frame-Options:** Previene el clickjacking controlando si su sitio puede ser enmarcado (framed). | +| `X_CONTENT_TYPE_OPTIONS` | `nosniff` | multisite | no | **X-Content-Type-Options:** Evita que los navegadores realicen "MIME-sniffing", protegiendo contra ataques de descarga no autorizada (drive-by download). | +| `X_DNS_PREFETCH_CONTROL` | `off` | multisite | no | **X-DNS-Prefetch-Control:** Regula la captación previa de DNS para reducir las solicitudes de red no intencionadas y mejorar la privacidad. | +| `REFERRER_POLICY` | `strict-origin-when-cross-origin` | multisite | no | **Política de Referencia:** Controla la cantidad de información de referencia enviada, salvaguardando la privacidad del usuario. | | `PERMISSIONS_POLICY` | `accelerometer=(), ambient-light-sensor=(), attribution-reporting=(), autoplay=(), bluetooth=(), ...` | multisite | no | **Política de Permisos:** Restringe el acceso a las funciones del navegador, reduciendo los posibles vectores de ataque. | -| `KEEP_UPSTREAM_HEADERS` | `Content-Security-Policy Content-Security-Policy-Report-Only Permissions-Policy X-Frame-Options` | multisite | no | **Conservar Cabeceras:** Preserva las cabeceras de origen seleccionadas, ayudando a la integración con sistemas heredados mientras se mantiene la seguridad. | +| `KEEP_UPSTREAM_HEADERS` | `Content-Security-Policy Content-Security-Policy-Report-Only Permissions-Policy X-Frame-Options` | multisite | no | **Conservar Cabeceras:** Preserva las cabeceras de origen seleccionadas, ayudando a la integración con sistemas heredados mientras se mantiene la seguridad. | !!! tip "Mejores Prácticas" - Revise y actualice regularmente sus cabeceras de seguridad para alinearse con los estándares de seguridad en evolución. @@ -3684,6 +3684,9 @@ Por ejemplo, `/metrics/requests` devuelve información sobre las solicitudes blo !!! note "Almacenamiento Específico del Trabajador" Cada trabajador de NGINX mantiene sus propias métricas en la memoria. Al acceder a las métricas a través de la API, los datos de todos los trabajadores se agregan automáticamente para proporcionar una vista completa. +!!! warning "Retención de los Informes" + Los informes de peticiones bloqueadas son un búfer circular, no un registro de auditoría. Una vez alcanzado el límite, los informes más antiguos se descartan para dejar sitio a los nuevos, por lo que el total mostrado en la interfaz web se estanca: sin Redis ese techo es `METRICS_MAX_BLOCKED_REQUESTS` multiplicado por el número de trabajadores de NGINX de cada instancia, y con Redis es `METRICS_MAX_BLOCKED_REQUESTS_REDIS`. Los informes residen en memoria compartida y se borran cada vez que BunkerWeb se reinicia, incluidas las actualizaciones de paquetes, salvo que Redis esté habilitado y sea persistente. Envíe los registros de NGINX a un servidor syslog o a un SIEM si necesita una retención a largo plazo. + ### Configuraciones de Ejemplo === "Configuración Básica" diff --git a/docs/features.md b/docs/features.md index 1ea583309a..9a07becd62 100644 --- a/docs/features.md +++ b/docs/features.md @@ -2933,17 +2933,17 @@ Follow these steps to configure and use the Headers feature: - **X-Frame-Options:** Blocks clickjacking attempts by controlling iframe embedding. - **Referrer Policy:** Limits sensitive information leakage through referrer headers. - | Setting | Default | Context | Multiple | Description | - | ------------------------------------- | --------------------------------------------------------------------------------------------------- | --------- | -------- | ---------------------------------------------------------------------------------------------------------------------------- | - | `STRICT_TRANSPORT_SECURITY` | `max-age=63072000; includeSubDomains; preload` | multisite | no | **HSTS:** Enforces secure HTTPS connections, reducing risks of man-in-the-middle attacks. | - | `CONTENT_SECURITY_POLICY` | `object-src 'none'; form-action 'self'; frame-ancestors 'self';` | multisite | no | **CSP:** Restricts resource loading to trusted sources, mitigating cross-site scripting and data injection attacks. | - | `CONTENT_SECURITY_POLICY_REPORT_ONLY` | `no` | multisite | no | **CSP Report Mode:** Reports violations without blocking content, helping in testing security policies while capturing logs. | - | `X_FRAME_OPTIONS` | `SAMEORIGIN` | multisite | no | **X-Frame-Options:** Prevents clickjacking by controlling whether your site can be framed. | - | `X_CONTENT_TYPE_OPTIONS` | `nosniff` | multisite | no | **X-Content-Type-Options:** Prevents browsers from MIME-sniffing, protecting against drive-by download attacks. | - | `X_DNS_PREFETCH_CONTROL` | `off` | multisite | no | **X-DNS-Prefetch-Control:** Regulates DNS prefetching to reduce unintentional network requests and enhance privacy. | - | `REFERRER_POLICY` | `strict-origin-when-cross-origin` | multisite | no | **Referrer Policy:** Controls the amount of referrer information sent, safeguarding user privacy. | + | Setting | Default | Context | Multiple | Description | + | ------------------------------------- | ----------------------------------------------------------------------------------------------------- | --------- | -------- | ---------------------------------------------------------------------------------------------------------------------------- | + | `STRICT_TRANSPORT_SECURITY` | `max-age=63072000; includeSubDomains; preload` | multisite | no | **HSTS:** Enforces secure HTTPS connections, reducing risks of man-in-the-middle attacks. | + | `CONTENT_SECURITY_POLICY` | `object-src 'none'; form-action 'self'; frame-ancestors 'self';` | multisite | no | **CSP:** Restricts resource loading to trusted sources, mitigating cross-site scripting and data injection attacks. | + | `CONTENT_SECURITY_POLICY_REPORT_ONLY` | `no` | multisite | no | **CSP Report Mode:** Reports violations without blocking content, helping in testing security policies while capturing logs. | + | `X_FRAME_OPTIONS` | `SAMEORIGIN` | multisite | no | **X-Frame-Options:** Prevents clickjacking by controlling whether your site can be framed. | + | `X_CONTENT_TYPE_OPTIONS` | `nosniff` | multisite | no | **X-Content-Type-Options:** Prevents browsers from MIME-sniffing, protecting against drive-by download attacks. | + | `X_DNS_PREFETCH_CONTROL` | `off` | multisite | no | **X-DNS-Prefetch-Control:** Regulates DNS prefetching to reduce unintentional network requests and enhance privacy. | + | `REFERRER_POLICY` | `strict-origin-when-cross-origin` | multisite | no | **Referrer Policy:** Controls the amount of referrer information sent, safeguarding user privacy. | | `PERMISSIONS_POLICY` | `accelerometer=(), ambient-light-sensor=(), attribution-reporting=(), autoplay=(), bluetooth=(), ...` | multisite | no | **Permissions Policy:** Restricts browser feature access, reducing potential attack vectors. | - | `KEEP_UPSTREAM_HEADERS` | `Content-Security-Policy Content-Security-Policy-Report-Only Permissions-Policy X-Frame-Options` | multisite | no | **Keep Headers:** Preserves selected upstream headers, aiding legacy integration while maintaining security. | + | `KEEP_UPSTREAM_HEADERS` | `Content-Security-Policy Content-Security-Policy-Report-Only Permissions-Policy X-Frame-Options` | multisite | no | **Keep Headers:** Preserves selected upstream headers, aiding legacy integration while maintaining security. | !!! tip "Best Practices" - Regularly review and update your security headers to align with evolving security standards. @@ -3700,6 +3700,9 @@ For example, `/metrics/requests` returns information about blocked requests. !!! note "Worker-Specific Storage" Each NGINX worker maintains its own metrics in memory. When accessing metrics through the API, data from all workers is automatically aggregated to provide a complete view. +!!! warning "Report Retention" + Blocked-request reports are a rolling buffer, not an audit log. Once the limit is reached, the oldest reports are dropped to make room for new ones, so the total shown in the web UI plateaus: without Redis that ceiling is `METRICS_MAX_BLOCKED_REQUESTS` multiplied by the number of NGINX workers on each instance, and with Redis it is `METRICS_MAX_BLOCKED_REQUESTS_REDIS`. Reports live in shared memory and are cleared whenever BunkerWeb restarts, including package upgrades, unless Redis is enabled and persisted. Ship the NGINX logs to a syslog server or a SIEM if you need long-term retention. + ### Example Configurations === "Basic Configuration" diff --git a/docs/fr/features.md b/docs/fr/features.md index 58d1cb772a..972244a40d 100644 --- a/docs/fr/features.md +++ b/docs/fr/features.md @@ -2829,17 +2829,17 @@ Suivez ces étapes pour configurer et utiliser la fonctionnalité Headers : - **X-Frame-Options :** Bloque les tentatives de clickjacking en contrôlant l'intégration des iframes. - **Referrer Policy :** Limite les fuites d'informations sensibles via les en-têtes referrer. - | Paramètre | Défaut | Contexte | Multiple | Description | - | ------------------------------------- | --------------------------------------------------------------------------------------------------- | --------- | -------- | --------------------------------------------------------------------------------------------------------------------------------------------------------- | - | `STRICT_TRANSPORT_SECURITY` | `max-age=63072000; includeSubDomains; preload` | multisite | non | **HSTS :** Force les connexions HTTPS sécurisées, réduisant les risques d'attaques de type "man-in-the-middle". | - | `CONTENT_SECURITY_POLICY` | `object-src 'none'; form-action 'self'; frame-ancestors 'self';` | multisite | non | **CSP :** Restreint le chargement des ressources aux sources de confiance, atténuant les attaques de type cross-site scripting et d'injection de données. | - | `CONTENT_SECURITY_POLICY_REPORT_ONLY` | `no` | multisite | non | **Mode rapport CSP :** Signale les violations sans bloquer le contenu, aidant à tester les politiques de sécurité tout en capturant les journaux. | - | `X_FRAME_OPTIONS` | `SAMEORIGIN` | multisite | non | **X-Frame-Options :** Empêche le clickjacking en contrôlant si votre site peut être intégré dans une frame. | - | `X_CONTENT_TYPE_OPTIONS` | `nosniff` | multisite | non | **X-Content-Type-Options :** Empêche les navigateurs de "MIME-sniffer", protégeant contre les attaques de type "drive-by download". | - | `X_DNS_PREFETCH_CONTROL` | `off` | multisite | non | **X-DNS-Prefetch-Control :** Régule le préchargement DNS pour réduire les requêtes réseau involontaires et améliorer la confidentialité. | - | `REFERRER_POLICY` | `strict-origin-when-cross-origin` | multisite | non | **Politique de Referrer :** Contrôle la quantité d'informations de référent envoyées, protégeant la vie privée de l'utilisateur. | + | Paramètre | Défaut | Contexte | Multiple | Description | + | ------------------------------------- | ----------------------------------------------------------------------------------------------------- | --------- | -------- | --------------------------------------------------------------------------------------------------------------------------------------------------------- | + | `STRICT_TRANSPORT_SECURITY` | `max-age=63072000; includeSubDomains; preload` | multisite | non | **HSTS :** Force les connexions HTTPS sécurisées, réduisant les risques d'attaques de type "man-in-the-middle". | + | `CONTENT_SECURITY_POLICY` | `object-src 'none'; form-action 'self'; frame-ancestors 'self';` | multisite | non | **CSP :** Restreint le chargement des ressources aux sources de confiance, atténuant les attaques de type cross-site scripting et d'injection de données. | + | `CONTENT_SECURITY_POLICY_REPORT_ONLY` | `no` | multisite | non | **Mode rapport CSP :** Signale les violations sans bloquer le contenu, aidant à tester les politiques de sécurité tout en capturant les journaux. | + | `X_FRAME_OPTIONS` | `SAMEORIGIN` | multisite | non | **X-Frame-Options :** Empêche le clickjacking en contrôlant si votre site peut être intégré dans une frame. | + | `X_CONTENT_TYPE_OPTIONS` | `nosniff` | multisite | non | **X-Content-Type-Options :** Empêche les navigateurs de "MIME-sniffer", protégeant contre les attaques de type "drive-by download". | + | `X_DNS_PREFETCH_CONTROL` | `off` | multisite | non | **X-DNS-Prefetch-Control :** Régule le préchargement DNS pour réduire les requêtes réseau involontaires et améliorer la confidentialité. | + | `REFERRER_POLICY` | `strict-origin-when-cross-origin` | multisite | non | **Politique de Referrer :** Contrôle la quantité d'informations de référent envoyées, protégeant la vie privée de l'utilisateur. | | `PERMISSIONS_POLICY` | `accelerometer=(), ambient-light-sensor=(), attribution-reporting=(), autoplay=(), bluetooth=(), ...` | multisite | non | **Politique de permissions :** Restreint l'accès aux fonctionnalités du navigateur, réduisant les vecteurs d'attaque potentiels. | - | `KEEP_UPSTREAM_HEADERS` | `Content-Security-Policy Content-Security-Policy-Report-Only Permissions-Policy X-Frame-Options` | multisite | non | **Conserver les en-têtes :** Préserve les en-têtes en amont sélectionnés, facilitant l'intégration héritée tout en maintenant la sécurité. | + | `KEEP_UPSTREAM_HEADERS` | `Content-Security-Policy Content-Security-Policy-Report-Only Permissions-Policy X-Frame-Options` | multisite | non | **Conserver les en-têtes :** Préserve les en-têtes en amont sélectionnés, facilitant l'intégration héritée tout en maintenant la sécurité. | !!! tip "Bonnes pratiques" - Révisez et mettez à jour régulièrement vos en-têtes de sécurité pour vous conformer aux normes de sécurité en constante évolution. @@ -3584,6 +3584,9 @@ Par exemple, `/metrics/requests` renvoie des informations sur les requêtes bloq !!! note "Stockage spécifique aux workers" Chaque worker NGINX maintient ses propres métriques en mémoire. Lors de l'accès aux métriques via l'API, les données de tous les workers sont automatiquement agrégées pour fournir une vue complète. +!!! warning "Rétention des rapports" + Les rapports de requêtes bloquées forment un tampon circulaire, pas un journal d'audit. Une fois la limite atteinte, les rapports les plus anciens sont supprimés pour laisser place aux nouveaux, ce qui fait plafonner le total affiché dans la Web UI : sans Redis, ce plafond vaut `METRICS_MAX_BLOCKED_REQUESTS` multiplié par le nombre de workers NGINX de chaque instance, et avec Redis il vaut `METRICS_MAX_BLOCKED_REQUESTS_REDIS`. Les rapports résident en mémoire partagée et sont effacés à chaque redémarrage de BunkerWeb, y compris lors des mises à jour de paquets, sauf si Redis est activé et persistant. Exportez les logs NGINX vers un serveur syslog ou un SIEM si vous avez besoin d'une rétention longue durée. + ### Exemples de configuration === "Configuration de base" diff --git a/docs/zh/features.md b/docs/zh/features.md index 2ce91b207f..20240ed6a1 100644 --- a/docs/zh/features.md +++ b/docs/zh/features.md @@ -2929,17 +2929,17 @@ STREAM 支持 :x: - **X-Frame-Options:** 通过控制 iframe 嵌入来阻止点击劫持尝试。 - **Referrer Policy:** 通过 referrer 头限制敏感信息的泄露。 - | 设置 | 默认值 | 上下文 | 多个 | 描述 | - | ------------------------------------- | --------------------------------------------------------------------------------------------------- | --------- | ---- | --------------------------------------------------------------------------------- | - | `STRICT_TRANSPORT_SECURITY` | `max-age=63072000; includeSubDomains; preload` | multisite | 否 | **HSTS:** 强制执行安全的 HTTPS 连接,降低中间人攻击的风险。 | - | `CONTENT_SECURITY_POLICY` | `object-src 'none'; form-action 'self'; frame-ancestors 'self';` | multisite | 否 | **CSP:** 将资源加载限制在受信任的来源,减轻跨站脚本和数据注入攻击。 | - | `CONTENT_SECURITY_POLICY_REPORT_ONLY` | `no` | multisite | 否 | **CSP 报告模式:** 报告违规行为而不阻止内容,有助于在测试安全策略的同时捕获日志。 | - | `X_FRAME_OPTIONS` | `SAMEORIGIN` | multisite | 否 | **X-Frame-Options:** 通过控制您的网站是否可以被框架化来防止点击劫持。 | - | `X_CONTENT_TYPE_OPTIONS` | `nosniff` | multisite | 否 | **X-Content-Type-Options:** 防止浏览器进行 MIME 嗅探,防止路过式下载攻击。 | - | `X_DNS_PREFETCH_CONTROL` | `off` | multisite | 否 | **X-DNS-Prefetch-Control:** 调节 DNS 预取以减少无意的网络请求并增强隐私。 | - | `REFERRER_POLICY` | `strict-origin-when-cross-origin` | multisite | 否 | **Referrer Policy:** 控制发送的引荐来源信息的数量,保护用户隐私。 | + | 设置 | 默认值 | 上下文 | 多个 | 描述 | + | ------------------------------------- | ----------------------------------------------------------------------------------------------------- | --------- | ---- | --------------------------------------------------------------------------------- | + | `STRICT_TRANSPORT_SECURITY` | `max-age=63072000; includeSubDomains; preload` | multisite | 否 | **HSTS:** 强制执行安全的 HTTPS 连接,降低中间人攻击的风险。 | + | `CONTENT_SECURITY_POLICY` | `object-src 'none'; form-action 'self'; frame-ancestors 'self';` | multisite | 否 | **CSP:** 将资源加载限制在受信任的来源,减轻跨站脚本和数据注入攻击。 | + | `CONTENT_SECURITY_POLICY_REPORT_ONLY` | `no` | multisite | 否 | **CSP 报告模式:** 报告违规行为而不阻止内容,有助于在测试安全策略的同时捕获日志。 | + | `X_FRAME_OPTIONS` | `SAMEORIGIN` | multisite | 否 | **X-Frame-Options:** 通过控制您的网站是否可以被框架化来防止点击劫持。 | + | `X_CONTENT_TYPE_OPTIONS` | `nosniff` | multisite | 否 | **X-Content-Type-Options:** 防止浏览器进行 MIME 嗅探,防止路过式下载攻击。 | + | `X_DNS_PREFETCH_CONTROL` | `off` | multisite | 否 | **X-DNS-Prefetch-Control:** 调节 DNS 预取以减少无意的网络请求并增强隐私。 | + | `REFERRER_POLICY` | `strict-origin-when-cross-origin` | multisite | 否 | **Referrer Policy:** 控制发送的引荐来源信息的数量,保护用户隐私。 | | `PERMISSIONS_POLICY` | `accelerometer=(), ambient-light-sensor=(), attribution-reporting=(), autoplay=(), bluetooth=(), ...` | multisite | 否 | **Permissions Policy:** 限制浏览器功能访问,减少潜在的攻击向量。 | - | `KEEP_UPSTREAM_HEADERS` | `Content-Security-Policy Content-Security-Policy-Report-Only Permissions-Policy X-Frame-Options` | multisite | 否 | **保留标头:** 保留选定的上游标头,在保持安全性的同时帮助旧版集成。 | + | `KEEP_UPSTREAM_HEADERS` | `Content-Security-Policy Content-Security-Policy-Report-Only Permissions-Policy X-Frame-Options` | multisite | 否 | **保留标头:** 保留选定的上游标头,在保持安全性的同时帮助旧版集成。 | !!! tip "最佳实践" - 定期审查和更新您的安全标头,以与不断发展的安全标准保持一致。 @@ -3694,6 +3694,9 @@ STREAM 支持 :warning: !!! note "工作进程特定存储" 每个 NGINX 工作进程都在内存中维护自己的指标。通过 API 访问指标时,会自动聚合所有工作进程的数据以提供完整的视图。 +!!! warning "报告保留" + 被拦截请求的报告是一个循环缓冲区,而非审计日志。达到上限后,最旧的报告会被丢弃以便存放新报告,因此 Web UI 中显示的总数会停滞不前:未启用 Redis 时,该上限为 `METRICS_MAX_BLOCKED_REQUESTS` 乘以每个实例的 NGINX 工作进程数;启用 Redis 时则为 `METRICS_MAX_BLOCKED_REQUESTS_REDIS`。报告保存在共享内存中,除非启用并持久化 Redis,否则每次重启 BunkerWeb(包括软件包升级)都会被清空。如需长期保留,请将 NGINX 日志发送到 syslog 服务器或 SIEM。 + ### 配置示例 === "基本配置" diff --git a/src/common/core/metrics/README.de.md b/src/common/core/metrics/README.de.md index 33b58ada4b..3f30741c7f 100644 --- a/src/common/core/metrics/README.de.md +++ b/src/common/core/metrics/README.de.md @@ -108,6 +108,9 @@ Zum Beispiel gibt `/metrics/requests` Informationen über blockierte Anfragen zu !!! note "Worker-spezifischer Speicher" Jeder NGINX-Worker verwaltet seine eigenen Metriken im Speicher. Beim Zugriff auf Metriken über die API werden die Daten aller Worker automatisch aggregiert, um eine vollständige Ansicht zu erhalten. +!!! warning "Aufbewahrung der Berichte" + Berichte über blockierte Anfragen sind ein rollierender Puffer, kein Audit-Log. Sobald das Limit erreicht ist, werden die ältesten Berichte verworfen, um Platz für neue zu schaffen. Die in der Web-UI angezeigte Gesamtzahl bleibt deshalb konstant: ohne Redis liegt diese Obergrenze bei `METRICS_MAX_BLOCKED_REQUESTS` multipliziert mit der Anzahl der NGINX-Worker jeder Instanz, mit Redis bei `METRICS_MAX_BLOCKED_REQUESTS_REDIS`. Berichte liegen im Shared Memory und werden bei jedem Neustart von BunkerWeb gelöscht, auch bei Paket-Upgrades, sofern Redis nicht aktiviert und persistent ist. Leiten Sie die NGINX-Logs an einen Syslog-Server oder ein SIEM weiter, wenn Sie eine langfristige Aufbewahrung benötigen. + ### Beispielkonfigurationen === "Grundlegende Konfiguration" diff --git a/src/common/core/metrics/README.es.md b/src/common/core/metrics/README.es.md index 49f20b05e8..b82bb3f68c 100644 --- a/src/common/core/metrics/README.es.md +++ b/src/common/core/metrics/README.es.md @@ -108,6 +108,9 @@ Por ejemplo, `/metrics/requests` devuelve información sobre las solicitudes blo !!! note "Almacenamiento Específico del Trabajador" Cada trabajador de NGINX mantiene sus propias métricas en la memoria. Al acceder a las métricas a través de la API, los datos de todos los trabajadores se agregan automáticamente para proporcionar una vista completa. +!!! warning "Retención de los Informes" + Los informes de peticiones bloqueadas son un búfer circular, no un registro de auditoría. Una vez alcanzado el límite, los informes más antiguos se descartan para dejar sitio a los nuevos, por lo que el total mostrado en la interfaz web se estanca: sin Redis ese techo es `METRICS_MAX_BLOCKED_REQUESTS` multiplicado por el número de trabajadores de NGINX de cada instancia, y con Redis es `METRICS_MAX_BLOCKED_REQUESTS_REDIS`. Los informes residen en memoria compartida y se borran cada vez que BunkerWeb se reinicia, incluidas las actualizaciones de paquetes, salvo que Redis esté habilitado y sea persistente. Envíe los registros de NGINX a un servidor syslog o a un SIEM si necesita una retención a largo plazo. + ### Configuraciones de Ejemplo === "Configuración Básica" diff --git a/src/common/core/metrics/README.fr.md b/src/common/core/metrics/README.fr.md index d3b16ce45f..25c7997038 100644 --- a/src/common/core/metrics/README.fr.md +++ b/src/common/core/metrics/README.fr.md @@ -108,6 +108,9 @@ Par exemple, `/metrics/requests` renvoie des informations sur les requêtes bloq !!! note "Stockage spécifique aux workers" Chaque worker NGINX maintient ses propres métriques en mémoire. Lors de l'accès aux métriques via l'API, les données de tous les workers sont automatiquement agrégées pour fournir une vue complète. +!!! warning "Rétention des rapports" + Les rapports de requêtes bloquées forment un tampon circulaire, pas un journal d'audit. Une fois la limite atteinte, les rapports les plus anciens sont supprimés pour laisser place aux nouveaux, ce qui fait plafonner le total affiché dans la Web UI : sans Redis, ce plafond vaut `METRICS_MAX_BLOCKED_REQUESTS` multiplié par le nombre de workers NGINX de chaque instance, et avec Redis il vaut `METRICS_MAX_BLOCKED_REQUESTS_REDIS`. Les rapports résident en mémoire partagée et sont effacés à chaque redémarrage de BunkerWeb, y compris lors des mises à jour de paquets, sauf si Redis est activé et persistant. Exportez les logs NGINX vers un serveur syslog ou un SIEM si vous avez besoin d'une rétention longue durée. + ### Exemples de configuration === "Configuration de base" diff --git a/src/common/core/metrics/README.md b/src/common/core/metrics/README.md index 206abc4e6e..845e3cd946 100644 --- a/src/common/core/metrics/README.md +++ b/src/common/core/metrics/README.md @@ -109,6 +109,9 @@ For example, `/metrics/requests` returns information about blocked requests. !!! note "Worker-Specific Storage" Each NGINX worker maintains its own metrics in memory. When accessing metrics through the API, data from all workers is automatically aggregated to provide a complete view. +!!! warning "Report Retention" + Blocked-request reports are a rolling buffer, not an audit log. Once the limit is reached, the oldest reports are dropped to make room for new ones, so the total shown in the web UI plateaus: without Redis that ceiling is `METRICS_MAX_BLOCKED_REQUESTS` multiplied by the number of NGINX workers on each instance, and with Redis it is `METRICS_MAX_BLOCKED_REQUESTS_REDIS`. Reports live in shared memory and are cleared whenever BunkerWeb restarts, including package upgrades, unless Redis is enabled and persisted. Ship the NGINX logs to a syslog server or a SIEM if you need long-term retention. + ### Example Configurations === "Basic Configuration" diff --git a/src/common/core/metrics/README.zh.md b/src/common/core/metrics/README.zh.md index 96b140b886..4fde99b324 100644 --- a/src/common/core/metrics/README.zh.md +++ b/src/common/core/metrics/README.zh.md @@ -108,6 +108,9 @@ !!! note "工作进程特定存储" 每个 NGINX 工作进程都在内存中维护自己的指标。通过 API 访问指标时,会自动聚合所有工作进程的数据以提供完整的视图。 +!!! warning "报告保留" + 被拦截请求的报告是一个循环缓冲区,而非审计日志。达到上限后,最旧的报告会被丢弃以便存放新报告,因此 Web UI 中显示的总数会停滞不前:未启用 Redis 时,该上限为 `METRICS_MAX_BLOCKED_REQUESTS` 乘以每个实例的 NGINX 工作进程数;启用 Redis 时则为 `METRICS_MAX_BLOCKED_REQUESTS_REDIS`。报告保存在共享内存中,除非启用并持久化 Redis,否则每次重启 BunkerWeb(包括软件包升级)都会被清空。如需长期保留,请将 NGINX 日志发送到 syslog 服务器或 SIEM。 + ### 配置示例 === "基本配置" diff --git a/src/common/core/metrics/metrics.lua b/src/common/core/metrics/metrics.lua index c0445bcb8a..c9c995557e 100644 --- a/src/common/core/metrics/metrics.lua +++ b/src/common/core/metrics/metrics.lua @@ -8,7 +8,6 @@ local utils = require "bunkerweb.utils" local metrics = class("metrics", plugin) local ngx = ngx local ERR = ngx.ERR -local INFO = ngx.INFO local WARN = ngx.WARN local null = ngx.null local unescape_uri = ngx.unescape_uri @@ -556,10 +555,38 @@ function metrics:timer() -- Push to dict (with LRU eviction if needed) local ok ok, err = self.metrics_datastore:set_with_retries(key .. "_" .. wid, value) + -- Shed the oldest half rather than the whole history: set_with_retries already + -- force-evicted, so "no memory" means the dict is undersized, and dropping every + -- stored entry to make one write fit loses far more than needed. The halving is + -- kept in the LRU, so later cycles start from the reduced size. + while not ok and err == "no memory" do + local live = lru:get(key) + if type(live) ~= "table" or #live < 2 then + break + end + for _ = 1, math.floor(#live / 2) do + table_remove(live, 1) + end + lru:set(key, live) + self:log_throttled( + WARN, + "datastore_shed_" .. key, + "not enough memory in the metrics datastore, halved LRU key " + .. key + .. " to " + .. #live + .. " entries : raise METRICS_MEMORY_SIZE" + ) + ok, err = self.metrics_datastore:set_with_retries(key .. "_" .. wid, encode(live)) + end if not ok then - -- If there isn't enough memory : we fallback to delete everything + -- Nothing left to shed : drop the key so the next cycle starts clean if err == "no memory" then - self.logger:log(INFO, "not enough memory in the metrics datastore, purging LRU key " .. key) + self:log_throttled( + WARN, + "datastore_purge_" .. key, + "not enough memory in the metrics datastore, purging LRU key " .. key + ) lru:delete(key) else ret = false diff --git a/src/ui/app/static/locales/ar.json b/src/ui/app/static/locales/ar.json index 5f783e84e6..48b04ebc89 100644 --- a/src/ui/app/static/locales/ar.json +++ b/src/ui/app/static/locales/ar.json @@ -1042,6 +1042,7 @@ } }, "reports": { + "retention_notice": "التقارير مخزَّنة في ذاكرة مؤقتة دائرية داخل الذاكرة: تُحذف أقدم الإدخالات عند بلوغ الحد المُهيَّأ. وما لم يكن Redis مفعَّلاً، تُمحى التقارير أيضاً عند إعادة تشغيل BunkerWeb.", "security_incident": "حادث أمني", "security_report_data": "بيانات تقرير الأمان" }, diff --git a/src/ui/app/static/locales/bn.json b/src/ui/app/static/locales/bn.json index 02c7dcc9ed..9e45cb20c9 100644 --- a/src/ui/app/static/locales/bn.json +++ b/src/ui/app/static/locales/bn.json @@ -1042,6 +1042,7 @@ } }, "reports": { + "retention_notice": "রিপোর্টগুলি মেমোরিতে একটি রোলিং বাফারে রাখা হয়: নির্ধারিত সীমায় পৌঁছালে সবচেয়ে পুরোনো এন্ট্রিগুলি মুছে ফেলা হয়। Redis সক্রিয় না থাকলে, BunkerWeb পুনরায় চালু হলে সেগুলিও মুছে যায়।", "security_incident": "নিরাপত্তা ঘটনা", "security_report_data": "নিরাপত্তা রিপোর্টের ডেটা" }, diff --git a/src/ui/app/static/locales/br.json b/src/ui/app/static/locales/br.json index 784a98c175..80790f61c8 100644 --- a/src/ui/app/static/locales/br.json +++ b/src/ui/app/static/locales/br.json @@ -1042,6 +1042,7 @@ } }, "reports": { + "retention_notice": "Os relatórios são um buffer circular em memória: as entradas mais antigas são descartadas quando o limite configurado é atingido. A menos que o Redis esteja habilitado, eles também são apagados quando o BunkerWeb reinicia.", "security_incident": "Incidente de Segurança", "security_report_data": "Dados do Relatório de Segurança" }, diff --git a/src/ui/app/static/locales/de.json b/src/ui/app/static/locales/de.json index 303668038f..e03f67181e 100644 --- a/src/ui/app/static/locales/de.json +++ b/src/ui/app/static/locales/de.json @@ -1042,6 +1042,7 @@ } }, "reports": { + "retention_notice": "Berichte sind ein rollierender Puffer im Arbeitsspeicher: Die ältesten Einträge werden verworfen, sobald das konfigurierte Limit erreicht ist. Sofern Redis nicht aktiviert ist, werden sie zudem bei einem Neustart von BunkerWeb gelöscht.", "security_incident": "Sicherheitsvorfall", "security_report_data": "Daten des Sicherheitsberichts" }, diff --git a/src/ui/app/static/locales/en.json b/src/ui/app/static/locales/en.json index 7068315573..7414a74498 100644 --- a/src/ui/app/static/locales/en.json +++ b/src/ui/app/static/locales/en.json @@ -1049,6 +1049,7 @@ } }, "reports": { + "retention_notice": "Reports are a rolling in-memory buffer: the oldest entries are dropped once the configured limit is reached. Unless Redis is enabled, they are also cleared when BunkerWeb restarts.", "security_incident": "Security Incident", "security_report_data": "Security Report Data" }, diff --git a/src/ui/app/static/locales/es.json b/src/ui/app/static/locales/es.json index 2dc2be9f4a..0b69fb6af9 100644 --- a/src/ui/app/static/locales/es.json +++ b/src/ui/app/static/locales/es.json @@ -1042,6 +1042,7 @@ } }, "reports": { + "retention_notice": "Los informes son un búfer circular en memoria: las entradas más antiguas se descartan cuando se alcanza el límite configurado. A menos que Redis esté habilitado, también se borran al reiniciar BunkerWeb.", "security_incident": "Incidente de Seguridad", "security_report_data": "Datos del Informe de Seguridad" }, diff --git a/src/ui/app/static/locales/fr.json b/src/ui/app/static/locales/fr.json index 9927180a4b..91ae51c237 100644 --- a/src/ui/app/static/locales/fr.json +++ b/src/ui/app/static/locales/fr.json @@ -1042,6 +1042,7 @@ } }, "reports": { + "retention_notice": "Les rapports sont un tampon circulaire en mémoire : les entrées les plus anciennes sont supprimées une fois la limite configurée atteinte. Sauf si Redis est activé, ils sont également effacés au redémarrage de BunkerWeb.", "security_incident": "Incident de sécurité", "security_report_data": "Données du rapport de sécurité" }, diff --git a/src/ui/app/static/locales/hi.json b/src/ui/app/static/locales/hi.json index 1bfe97c1b8..cc91c98d11 100644 --- a/src/ui/app/static/locales/hi.json +++ b/src/ui/app/static/locales/hi.json @@ -1042,6 +1042,7 @@ } }, "reports": { + "retention_notice": "रिपोर्ट मेमोरी में एक रोलिंग बफ़र के रूप में रखी जाती हैं: निर्धारित सीमा तक पहुँचने पर सबसे पुरानी प्रविष्टियाँ हटा दी जाती हैं। जब तक Redis सक्षम न हो, BunkerWeb के पुनः आरंभ होने पर भी ये मिट जाती हैं।", "security_incident": "सुरक्षा घटना", "security_report_data": "सुरक्षा रिपोर्ट डेटा" }, diff --git a/src/ui/app/static/locales/it.json b/src/ui/app/static/locales/it.json index f93fd4d573..b4f6ebe047 100644 --- a/src/ui/app/static/locales/it.json +++ b/src/ui/app/static/locales/it.json @@ -1042,6 +1042,7 @@ } }, "reports": { + "retention_notice": "I report sono un buffer circolare in memoria: le voci più vecchie vengono eliminate al raggiungimento del limite configurato. A meno che Redis non sia abilitato, vengono inoltre cancellati al riavvio di BunkerWeb.", "security_incident": "Incidente di Sicurezza", "security_report_data": "Dati del Report di Sicurezza" }, diff --git a/src/ui/app/static/locales/ko.json b/src/ui/app/static/locales/ko.json index 89f187528e..69b7db3c91 100644 --- a/src/ui/app/static/locales/ko.json +++ b/src/ui/app/static/locales/ko.json @@ -1042,6 +1042,7 @@ } }, "reports": { + "retention_notice": "보고서는 메모리에 저장되는 순환 버퍼입니다. 설정된 한도에 도달하면 가장 오래된 항목부터 삭제됩니다. Redis를 사용하지 않는 경우 BunkerWeb을 다시 시작할 때도 모두 삭제됩니다.", "security_incident": "보안 사고", "security_report_data": "보안 보고서 데이터" }, diff --git a/src/ui/app/static/locales/pl.json b/src/ui/app/static/locales/pl.json index af11cad141..c5e327b2d4 100644 --- a/src/ui/app/static/locales/pl.json +++ b/src/ui/app/static/locales/pl.json @@ -1042,6 +1042,7 @@ } }, "reports": { + "retention_notice": "Raporty są buforem cyklicznym w pamięci: najstarsze wpisy są usuwane po osiągnięciu skonfigurowanego limitu. Jeśli Redis nie jest włączony, są one również czyszczone przy ponownym uruchomieniu BunkerWeb.", "security_incident": "Incydent bezpieczeństwa", "security_report_data": "Dane raportu bezpieczeństwa" }, diff --git a/src/ui/app/static/locales/pt.json b/src/ui/app/static/locales/pt.json index 9321a135b7..f78dd75e02 100644 --- a/src/ui/app/static/locales/pt.json +++ b/src/ui/app/static/locales/pt.json @@ -1042,6 +1042,7 @@ } }, "reports": { + "retention_notice": "Os relatórios são um buffer circular em memória: as entradas mais antigas são descartadas quando o limite configurado é atingido. A menos que o Redis esteja ativado, também são apagados quando o BunkerWeb reinicia.", "security_incident": "Incidente de Segurança", "security_report_data": "Dados do Relatório de Segurança" }, diff --git a/src/ui/app/static/locales/ru.json b/src/ui/app/static/locales/ru.json index 471c4cb6d6..c105d1303b 100644 --- a/src/ui/app/static/locales/ru.json +++ b/src/ui/app/static/locales/ru.json @@ -1042,6 +1042,7 @@ } }, "reports": { + "retention_notice": "Отчёты хранятся в кольцевом буфере в оперативной памяти: самые старые записи удаляются при достижении заданного лимита. Если Redis не включён, они также очищаются при перезапуске BunkerWeb.", "security_incident": "Инцидент безопасности", "security_report_data": "Данные отчета о безопасности" }, diff --git a/src/ui/app/static/locales/tl.json b/src/ui/app/static/locales/tl.json index 1760ae42e8..c35acee29c 100644 --- a/src/ui/app/static/locales/tl.json +++ b/src/ui/app/static/locales/tl.json @@ -1042,6 +1042,7 @@ } }, "reports": { + "retention_notice": "Ang mga ulat ay isang rolling in-memory buffer: inaalis ang pinakalumang mga entry kapag naabot na ang nakatakdang limitasyon. Maliban kung naka-enable ang Redis, nabubura rin ang mga ito kapag nag-restart ang BunkerWeb.", "security_incident": "Insidente ng Seguridad", "security_report_data": "Data ng Ulat ng Seguridad" }, diff --git a/src/ui/app/static/locales/tr.json b/src/ui/app/static/locales/tr.json index e47758bf06..5bbb0ab1d1 100644 --- a/src/ui/app/static/locales/tr.json +++ b/src/ui/app/static/locales/tr.json @@ -1042,6 +1042,7 @@ } }, "reports": { + "retention_notice": "Raporlar bellekte tutulan dairesel bir arabellektir: yapılandırılan sınıra ulaşıldığında en eski kayıtlar silinir. Redis etkin değilse, BunkerWeb yeniden başlatıldığında da temizlenirler.", "security_incident": "Güvenlik Olayı", "security_report_data": "Güvenlik Raporu Verisi" }, diff --git a/src/ui/app/static/locales/tw.json b/src/ui/app/static/locales/tw.json index 074a138f46..fe4dcfbd92 100644 --- a/src/ui/app/static/locales/tw.json +++ b/src/ui/app/static/locales/tw.json @@ -1042,6 +1042,7 @@ } }, "reports": { + "retention_notice": "報告儲存在記憶體中的循環緩衝區內:達到設定的上限後,最舊的紀錄會被捨棄。除非啟用 Redis,否則重新啟動 BunkerWeb 時報告也會被清空。", "security_incident": "安全事件", "security_report_data": "安全報告資料" }, diff --git a/src/ui/app/static/locales/ur.json b/src/ui/app/static/locales/ur.json index 9302a58526..fbb5f5acae 100644 --- a/src/ui/app/static/locales/ur.json +++ b/src/ui/app/static/locales/ur.json @@ -1042,6 +1042,7 @@ } }, "reports": { + "retention_notice": "رپورٹس میموری میں ایک رولنگ بفر کے طور پر محفوظ ہوتی ہیں: مقررہ حد تک پہنچنے پر سب سے پرانی اندراجات حذف کر دی جاتی ہیں۔ جب تک Redis فعال نہ ہو، BunkerWeb کے دوبارہ شروع ہونے پر بھی یہ صاف ہو جاتی ہیں۔", "security_incident": "سیکیورٹی واقعہ", "security_report_data": "سیکیورٹی رپورٹ ڈیٹا" }, diff --git a/src/ui/app/static/locales/zh.json b/src/ui/app/static/locales/zh.json index 609d66f566..bf2abfed29 100644 --- a/src/ui/app/static/locales/zh.json +++ b/src/ui/app/static/locales/zh.json @@ -1042,6 +1042,7 @@ } }, "reports": { + "retention_notice": "报告存储在内存中的循环缓冲区内:达到配置的上限后,最早的记录会被丢弃。除非启用 Redis,否则重启 BunkerWeb 时报告也会被清空。", "security_incident": "安全事件", "security_report_data": "安全报告数据" }, diff --git a/src/ui/app/templates/reports.html b/src/ui/app/templates/reports.html index cff9ca0f36..bc13e4444e 100644 --- a/src/ui/app/templates/reports.html +++ b/src/ui/app/templates/reports.html @@ -27,17 +27,23 @@
-
-
- - TZ: - - +
+

+ + Reports are a rolling in-memory buffer: the oldest entries are dropped once the configured limit is reached. Unless Redis is enabled, they are also cleared when BunkerWeb restarts. +

+
+
+ + TZ: + + +
+ IP Geolocation by DB-IP
- IP Geolocation by DB-IP
From 2bb0159a9c3a4c2fc718ef92c49a0940d502dbc1 Mon Sep 17 00:00:00 2001 From: TheophileDiot Date: Mon, 27 Jul 2026 10:22:25 +0200 Subject: [PATCH 10/25] fix(metrics): never sync an evicted LRU counter as the string "nil" --- CHANGELOG.md | 2 + src/common/core/metrics/metrics.lua | 229 ++++++++++++++-------------- src/ui/app/models/instance.py | 12 +- src/ui/app/utils.py | 11 +- 4 files changed, 138 insertions(+), 116 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f5ced6b1ab..199b1cb8d1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,8 @@ - [PERF] `ui`: make the Reports, Logs, and Home pages fast when many blocked-request reports are stored in Redis: fetch a single report by id from the newest end instead of scanning the whole list, share the Home page aggregation across workers through Redis instead of recomputing it in every worker, cache the Logs line count until the file changes or is rotated, and pause the Reports auto-refresh while the browser tab is in the background. Also honor the `k`/`m` suffix on `METRICS_MAX_BLOCKED_REQUESTS_REDIS` when bounding report reads. - [PERF] `ui`: memoize the plugin catalog and rebuild it only when plugins change instead of on every request, cutting the fixed overhead paid on every page load. - [BUGFIX] `metrics`: when the metrics memory zone fills up, shed the oldest blocked-request reports instead of silently discarding a worker's whole history, and warn that `METRICS_MEMORY_SIZE` needs raising. +- [BUGFIX] `metrics`: stop storing the literal string `nil` in Redis for a counter evicted from a worker's LRU mid-sync, which made the `misc`, `blacklist` and `greylist` plugin pages return a 500. +- [BUGFIX] `ui`: an unreadable counter no longer breaks a whole plugin page, and no longer hides the workers that reported real counts. - [UI] Reports page: document the retention model, a rolling buffer capped per worker that is cleared on restart unless Redis is enabled. ## v1.6.14~rc1 - 2026/07/23 diff --git a/src/common/core/metrics/metrics.lua b/src/common/core/metrics/metrics.lua index c9c995557e..9247506523 100644 --- a/src/common/core/metrics/metrics.lua +++ b/src/common/core/metrics/metrics.lua @@ -465,133 +465,140 @@ function metrics:timer() for _, key in ipairs(lru:get_keys()) do -- Get LRU data local value = lru:get(key) - if self.redis_ok then - if key == "requests" then - for _, request in ipairs(value) do - if not request.synced then - local v = {} - for i, field in ipairs(REQUEST_FACET_FIELDS) do - v[i] = get_request_facet_value(request, field) - end - local ok - ok, err = self:redis_call( - "eval", - PUSH_SCRIPT, - 1, - "requests", - encode(request), - v[1], - v[2], - v[3], - v[4], - v[5], - v[6], - v[7], - v[8] - ) - if not ok then - self:log_throttled( - ERR, - "sync_request", - "Can't sync request to Redis: " .. (err or "unknown error") + -- get_keys() returns a snapshot and every redis_call below yields, so a + -- concurrent log() can evict this key from the (full) LRU in between. A miss + -- must never be written out: tostring(nil) stores the literal string "nil" in + -- Redis, and a nil datastore value deletes the entry. Skip it and let the next + -- cycle resync whatever is still live. + if value ~= nil then + if self.redis_ok then + if key == "requests" then + for _, request in ipairs(value) do + if not request.synced then + local v = {} + for i, field in ipairs(REQUEST_FACET_FIELDS) do + v[i] = get_request_facet_value(request, field) + end + local ok + ok, err = self:redis_call( + "eval", + PUSH_SCRIPT, + 1, + "requests", + encode(request), + v[1], + v[2], + v[3], + v[4], + v[5], + v[6], + v[7], + v[8] ) - break - end - request.synced = true - end - end - - -- Update LRU cache - lru:set("requests", value) - elseif key ~= "setup" and self.variables["METRICS_SAVE_TO_REDIS"] == "yes" then - -- Sync other metrics (counters and tables) to Redis with optimized data structures - local redis_key = "metrics:" .. key .. ":" .. wid - local ok - if type(value) == "table" then - -- Use Redis list for table values - ok, err = self:redis_call("del", redis_key) - if ok then - for _, item in ipairs(value) do - local item_value = type(item) == "table" and encode(item) or tostring(item) - ok, err = self:redis_call("rpush", redis_key, item_value) if not ok then self:log_throttled( ERR, - "sync_table_item", - "Can't push metric table item " .. key .. " to Redis: " .. err + "sync_request", + "Can't sync request to Redis: " .. (err or "unknown error") ) break end + request.synced = true end - else - self:log_throttled( - ERR, - "sync_table_clear", - "Can't clear metric table " .. key .. " in Redis: " .. err - ) - end - elseif type(value) == "number" then - -- Use Redis string for numeric counters - ok, err = self:redis_call("set", redis_key, value) - if not ok then - self:log_throttled( - ERR, - "sync_counter", - "Can't sync metric counter " .. key .. " to Redis: " .. err - ) end - else - -- Use Redis string for other types - ok, err = self:redis_call("set", redis_key, tostring(value)) - if not ok then - self:log_throttled(ERR, "sync_other", "Can't sync metric " .. key .. " to Redis: " .. err) + + -- Update LRU cache + lru:set("requests", value) + elseif key ~= "setup" and self.variables["METRICS_SAVE_TO_REDIS"] == "yes" then + -- Sync other metrics (counters and tables) to Redis with optimized data structures + local redis_key = "metrics:" .. key .. ":" .. wid + local ok + if type(value) == "table" then + -- Use Redis list for table values + ok, err = self:redis_call("del", redis_key) + if ok then + for _, item in ipairs(value) do + local item_value = type(item) == "table" and encode(item) or tostring(item) + ok, err = self:redis_call("rpush", redis_key, item_value) + if not ok then + self:log_throttled( + ERR, + "sync_table_item", + "Can't push metric table item " .. key .. " to Redis: " .. err + ) + break + end + end + else + self:log_throttled( + ERR, + "sync_table_clear", + "Can't clear metric table " .. key .. " in Redis: " .. err + ) + end + elseif type(value) == "number" then + -- Use Redis string for numeric counters + ok, err = self:redis_call("set", redis_key, value) + if not ok then + self:log_throttled( + ERR, + "sync_counter", + "Can't sync metric counter " .. key .. " to Redis: " .. err + ) + end + else + -- Use Redis string for other types + ok, err = self:redis_call("set", redis_key, tostring(value)) + if not ok then + self:log_throttled(ERR, "sync_other", "Can't sync metric " .. key .. " to Redis: " .. err) + end end end end - end - if type(value) == "table" then - value = encode(value) - end - -- Push to dict (with LRU eviction if needed) - local ok - ok, err = self.metrics_datastore:set_with_retries(key .. "_" .. wid, value) - -- Shed the oldest half rather than the whole history: set_with_retries already - -- force-evicted, so "no memory" means the dict is undersized, and dropping every - -- stored entry to make one write fit loses far more than needed. The halving is - -- kept in the LRU, so later cycles start from the reduced size. - while not ok and err == "no memory" do - local live = lru:get(key) - if type(live) ~= "table" or #live < 2 then - break + if type(value) == "table" then + value = encode(value) end - for _ = 1, math.floor(#live / 2) do - table_remove(live, 1) - end - lru:set(key, live) - self:log_throttled( - WARN, - "datastore_shed_" .. key, - "not enough memory in the metrics datastore, halved LRU key " - .. key - .. " to " - .. #live - .. " entries : raise METRICS_MEMORY_SIZE" - ) - ok, err = self.metrics_datastore:set_with_retries(key .. "_" .. wid, encode(live)) - end - if not ok then - -- Nothing left to shed : drop the key so the next cycle starts clean - if err == "no memory" then + -- Push to dict (with LRU eviction if needed) + local ok + ok, err = self.metrics_datastore:set_with_retries(key .. "_" .. wid, value) + -- Shed the oldest half rather than the whole history: set_with_retries already + -- force-evicted, so "no memory" means the dict is undersized, and dropping every + -- stored entry to make one write fit loses far more than needed. The halving is + -- kept in the LRU, so later cycles start from the reduced size. + while not ok and err == "no memory" do + local live = lru:get(key) + if type(live) ~= "table" or #live < 2 then + break + end + for _ = 1, math.floor(#live / 2) do + table_remove(live, 1) + end + lru:set(key, live) self:log_throttled( WARN, - "datastore_purge_" .. key, - "not enough memory in the metrics datastore, purging LRU key " .. key + "datastore_shed_" .. key, + "not enough memory in the metrics datastore, halved LRU key " + .. key + .. " to " + .. #live + .. " entries : raise METRICS_MEMORY_SIZE" ) - lru:delete(key) - else - ret = false - ret_err = err - self:log_throttled(ERR, "datastore_set", "can't set " .. key .. "_" .. wid .. " : " .. err) + ok, err = self.metrics_datastore:set_with_retries(key .. "_" .. wid, encode(live)) + end + if not ok then + -- Nothing left to shed : drop the key so the next cycle starts clean + if err == "no memory" then + self:log_throttled( + WARN, + "datastore_purge_" .. key, + "not enough memory in the metrics datastore, purging LRU key " .. key + ) + lru:delete(key) + else + ret = false + ret_err = err + self:log_throttled(ERR, "datastore_set", "can't set " .. key .. "_" .. wid .. " : " .. err) + end end end end diff --git a/src/ui/app/models/instance.py b/src/ui/app/models/instance.py index 4dcf8efac8..b55b867d3a 100644 --- a/src/ui/app/models/instance.py +++ b/src/ui/app/models/instance.py @@ -1536,11 +1536,15 @@ def _pipeline_values(value_keys, issue): # Aggregate values for the same metric name across workers if metric_name in redis_metrics: - if isinstance(redis_metrics[metric_name], (int, float)) and isinstance(decoded_value, (int, float)): + current = redis_metrics[metric_name] + if isinstance(current, (int, float)) and isinstance(decoded_value, (int, float)): redis_metrics[metric_name] += decoded_value - elif isinstance(redis_metrics[metric_name], list) and isinstance(decoded_value, list): - redis_metrics[metric_name].extend(decoded_value) - # For other types, just use the latest value + elif isinstance(current, list) and isinstance(decoded_value, list): + current.extend(decoded_value) + elif isinstance(decoded_value, (int, float)) and not isinstance(current, (int, float)): + # A garbage per-worker key (SCAN order is arbitrary, so it can + # land first) must not shadow the workers that hold real counts. + redis_metrics[metric_name] = decoded_value else: redis_metrics[metric_name] = decoded_value diff --git a/src/ui/app/utils.py b/src/ui/app/utils.py index 863e78e601..6ac2edd5c1 100644 --- a/src/ui/app/utils.py +++ b/src/ui/app/utils.py @@ -373,7 +373,16 @@ def flash(message: str, category: str = "success", i18n_key: Optional[str] = Non def human_readable_number(value: Union[str, int]) -> str: - value = int(value) + try: + value = int(value) + except (TypeError, ValueError): + try: + value = int(float(value)) + except (TypeError, ValueError, OverflowError): + # A counter can reach the template non-numeric (metric lost to a worker + # restart or an LRU eviction, stale value left in Redis). One unreadable + # card must not take the whole plugin page down with a 500. + return "N/A" if value >= 1_000_000: return f"{value/1_000_000:.1f}M" # noqa: E226 elif value >= 1_000: From a035b4369da89c5b399a0cc078559fe1fbdf7924 Mon Sep 17 00:00:00 2001 From: TheophileDiot Date: Mon, 27 Jul 2026 11:17:18 +0200 Subject: [PATCH 11/25] fix(scheduler): keep os.environ identity across reloads --- .../ticket-3755-le-dns-env-stale/.gitignore | 3 + .../ticket-3755-le-dns-env-stale/README.md | 114 ++++++++++++++++ .../bind/bwtest.lan.zone | 13 ++ .../bind/named.conf | 34 +++++ .../create-service.py | 104 +++++++++++++++ .../docker-compose.baseline.yml | 6 + .../docker-compose.yml | 126 ++++++++++++++++++ .../pebble-config.json | 12 ++ .../dev/ticket-3755-le-dns-env-stale/setup.sh | 85 ++++++++++++ .../core/letsencrypt/jobs/certbot-new.py | 44 ++++++ .../core/letsencrypt/jobs/certbot-renew.py | 5 + .../letsencrypt/jobs/letsencrypt_utils.py | 67 +++++++++- src/scheduler/JobScheduler.py | 40 +++++- 13 files changed, 642 insertions(+), 11 deletions(-) create mode 100644 misc/dev/ticket-3755-le-dns-env-stale/.gitignore create mode 100644 misc/dev/ticket-3755-le-dns-env-stale/README.md create mode 100644 misc/dev/ticket-3755-le-dns-env-stale/bind/bwtest.lan.zone create mode 100644 misc/dev/ticket-3755-le-dns-env-stale/bind/named.conf create mode 100755 misc/dev/ticket-3755-le-dns-env-stale/create-service.py create mode 100644 misc/dev/ticket-3755-le-dns-env-stale/docker-compose.baseline.yml create mode 100644 misc/dev/ticket-3755-le-dns-env-stale/docker-compose.yml create mode 100644 misc/dev/ticket-3755-le-dns-env-stale/pebble-config.json create mode 100755 misc/dev/ticket-3755-le-dns-env-stale/setup.sh diff --git a/misc/dev/ticket-3755-le-dns-env-stale/.gitignore b/misc/dev/ticket-3755-le-dns-env-stale/.gitignore new file mode 100644 index 0000000000..c9ad500299 --- /dev/null +++ b/misc/dev/ticket-3755-le-dns-env-stale/.gitignore @@ -0,0 +1,3 @@ +# Build artifacts, all regenerated by setup.sh +certs/ +generated/ diff --git a/misc/dev/ticket-3755-le-dns-env-stale/README.md b/misc/dev/ticket-3755-le-dns-env-stale/README.md new file mode 100644 index 0000000000..af34c00601 --- /dev/null +++ b/misc/dev/ticket-3755-le-dns-env-stale/README.md @@ -0,0 +1,114 @@ +# Ticket #3755: DNS-01 credentials invisible to `certbot-new` until AIO restart + +Reproduction rig for . + +A service created in the Web UI with an RFC2136 DNS-01 challenge saves its +`LETS_ENCRYPT_DNS_CREDENTIAL_ITEM*` values correctly, but `certbot-new` reports +`DNS challenge selected but no DNS credentials are configured, skipping generation.` +until the container is restarted. + +## Root cause + +`JobScheduler` rebound `os.environ` to a new dict on every reload. Jobs run in-process, and +`letsencrypt_utils.py` captures `environ` at import (`from os import environ`). Job helper +modules stay in `sys.modules` across reloads, so that captured reference froze on the +snapshot taken at container start, and `extract_provider()` iterated it. `certbot-new.py` +itself uses `getenv`, which is late-bound: that is why it found the new service but not its +credentials. + +## What the rig contains + +| Service | Role | +|---|---| +| `bunkerweb-all-in-one` | Built from `src/all-in-one/Dockerfile`; matches the reporter's integration, and puts the scheduler and the UI in one container so they share `/var/log/bunkerweb` | +| `bind9` (`10.30.55.53`) | Authoritative for `bwtest.lan`, accepts TSIG-signed RFC2136 dynamic updates | +| `pebble` (`10.30.55.14`) | Local ACME CA; `-dnsserver 10.30.55.53:53` makes its DNS-01 validation query our bind9 | +| `bw-db` | MariaDB | +| `app` | Upstream for the reverse proxy | + +`setup.sh` generates a local CA plus a Pebble server certificate, and regenerates two patched +job files under `generated/`. BunkerWeb hardcodes the Let's Encrypt directory URLs with no +setting to override them, so pointing at a local ACME server means patching both +`letsencrypt_utils.py` (the directory constant, used for account bookkeeping) and +`certbot-new.py` (`certbot certonly` is invoked with no `--server` at all, so the constant +alone never reaches certbot). Each copy is regenerated from the repo on every run and the +script refuses to continue if it differs from its source by anything but the intended lines, +so the rig always exercises current code. + +Only `app1.bwtest.lan` exists at container start, and it does not use Let's Encrypt. Every +DNS-01 service is created afterwards through the Web UI. That ordering is the whole point: +the bug only shows for configuration that arrives after the process started. + +## Run + +```bash +./setup.sh +docker compose build +docker compose up -d + +# Services are created after the container is up, which is the whole point: +./create-service.py app2 dns # RFC2136 DNS-01 with full credentials +./create-service.py app3 dns # again later, to cover repeated reloads +./create-service.py app4 dns-nocreds # misconfigured, for the UI-signal check +./create-service.py app2 delete +``` + +To reproduce the bug instead of the fix, add the overlay that restores the pre-fix +`JobScheduler`: + +```bash +docker compose -f docker-compose.yml -f docker-compose.baseline.yml up -d +``` + +Web UI: , `admin` / `P@ssw0rd`. HTTPS is on `8443`, HTTP on `8355`, so reach a +service with `curl --resolve app2.bwtest.lan:8443:127.0.0.1 -k https://app2.bwtest.lan:8443/`. + +### Credential items to enter (matching the reporter's) + +Create service `app2.bwtest.lan` in Advanced mode with `AUTO_LETS_ENCRYPT=yes`, +`LETS_ENCRYPT_CHALLENGE=dns`, `LETS_ENCRYPT_DNS_PROVIDER=rfc2136`, +`LETS_ENCRYPT_DNS_PROPAGATION=10`, and: + +``` +LETS_ENCRYPT_DNS_CREDENTIAL_ITEM=server 10.30.55.53 +LETS_ENCRYPT_DNS_CREDENTIAL_ITEM_1=port 53 +LETS_ENCRYPT_DNS_CREDENTIAL_ITEM_2=name bunkerweb-certbot. +LETS_ENCRYPT_DNS_CREDENTIAL_ITEM_3=secret QrmNE3WJEYEMVtupVSWlznHxxTyIdR2I4LRiVPGWwpM= +LETS_ENCRYPT_DNS_CREDENTIAL_ITEM_4=algorithm HMAC-SHA256 +LETS_ENCRYPT_DNS_CREDENTIAL_ITEM_5=sign_query false +LETS_ENCRYPT_DNS_CREDENTIAL_DECODE_BASE64*=no +``` + +`server`, `port`, `name`, `secret`, `algorithm` and `sign_query` are accepted aliases of the +`dns_rfc2136_*` fields (`letsencrypt_providers.py`), so these are the reporter's exact values. + +## Checks + +All six were run and passed on 2026-07-27. + +1. **Baseline reproduces the report** (with `docker-compose.baseline.yml`). After creating + `app2` post-start: + `[Service: app2.bwtest.lan] DNS challenge selected but no DNS credentials are configured, skipping generation.` +2. **Restart workaround** (still pre-fix). `docker compose restart bunkerweb-all-in-one`, no + config change, and the same service issues a certificate. Together with check 1 this pins + the cause on the environment snapshot, nothing else. +3. **Fixed: no restart needed.** `Certificate(s) for app2.bwtest.lan generated successfully.` + in the container that was already running when the service was created. `docker compose + logs bind9 | grep "updating zone"` shows the TSIG-signed add and delete of the + `_acme-challenge` TXT, and `openssl s_client -connect 127.0.0.1:8443 -servername + app2.bwtest.lan` reports `issuer=CN = Pebble Intermediate CA`. +4. **Multi-reload.** `app3` created after `app2` had already succeeded also issues with no + restart, so `os.environ` identity holds past the first reload, not only once. +5. **Prune.** After deleting `app2`, the next `certbot-new` run processes only `app3` and + `app4`. The old rebind dropped stale `{service}_*` keys for free; the fix does it + explicitly. +6. **UI signal.** `app4` (DNS-01, no credentials) gives `bw_jobs_runs.success = 0` for + `certbot-new`, a red cross on `/jobs`, while the healthy runs stay green. `/logs` lists + `letsencrypt_certbot-new.log` and renders both the warning and + `Skipped certificate generation for 1 service(s) with an invalid Let's Encrypt configuration: app4.bwtest.lan`. + +## Teardown + +```bash +docker compose down -v +``` diff --git a/misc/dev/ticket-3755-le-dns-env-stale/bind/bwtest.lan.zone b/misc/dev/ticket-3755-le-dns-env-stale/bind/bwtest.lan.zone new file mode 100644 index 0000000000..51278f732d --- /dev/null +++ b/misc/dev/ticket-3755-le-dns-env-stale/bind/bwtest.lan.zone @@ -0,0 +1,13 @@ +$TTL 60 +@ IN SOA ns.bwtest.lan. admin.bwtest.lan. ( + 1 ; serial + 60 ; refresh + 60 ; retry + 600 ; expire + 60 ) ; minimum +@ IN NS ns.bwtest.lan. +ns IN A 10.30.55.53 +app1 IN A 10.30.55.10 +app2 IN A 10.30.55.10 +app3 IN A 10.30.55.10 +app4 IN A 10.30.55.10 diff --git a/misc/dev/ticket-3755-le-dns-env-stale/bind/named.conf b/misc/dev/ticket-3755-le-dns-env-stale/bind/named.conf new file mode 100644 index 0000000000..45c96dad2e --- /dev/null +++ b/misc/dev/ticket-3755-le-dns-env-stale/bind/named.conf @@ -0,0 +1,34 @@ +key "bunkerweb-certbot." { + algorithm hmac-sha256; + secret "QrmNE3WJEYEMVtupVSWlznHxxTyIdR2I4LRiVPGWwpM="; +}; + +options { + directory "/var/lib/bind"; + listen-on { any; }; + listen-on-v6 { none; }; + allow-query { any; }; + recursion no; + dnssec-validation no; + pid-file none; +}; + +logging { + channel stdout { + stderr; + severity info; + print-time yes; + print-severity yes; + print-category yes; + }; + category update { stdout; }; + category update-security { stdout; }; + category queries { stdout; }; + category default { stdout; }; +}; + +zone "bwtest.lan" { + type master; + file "/var/lib/bind/bwtest.lan.zone"; + allow-update { key "bunkerweb-certbot."; }; +}; diff --git a/misc/dev/ticket-3755-le-dns-env-stale/create-service.py b/misc/dev/ticket-3755-le-dns-env-stale/create-service.py new file mode 100755 index 0000000000..2b4656fcea --- /dev/null +++ b/misc/dev/ticket-3755-le-dns-env-stale/create-service.py @@ -0,0 +1,104 @@ +#!/usr/bin/env python3 +"""Create (or delete) a service through the real Web UI, after the container has started. + +Posts to the same blueprint the Save button posts to, so the whole UI path runs: form +validation, Config.gen_conf, Database.save_config, the config_changed flags. Scripted only +so the six credential rows are deterministic. + +Usage: + ./create-service.py app2 dns # RFC2136 DNS-01 with full credentials + ./create-service.py app4 dns-nocreds # DNS-01 with no credentials (misconfigured) + ./create-service.py app2 delete +""" + +from sys import argv, exit as sys_exit + +from bs4 import BeautifulSoup +from requests import Session + +UI = "http://localhost:7355" +USERNAME = "admin" +PASSWORD = "P@ssw0rd" +ZONE = "bwtest.lan" + +DNS_CREDENTIALS = ( + "server 10.30.55.53", + "port 53", + "name bunkerweb-certbot.", + "secret QrmNE3WJEYEMVtupVSWlznHxxTyIdR2I4LRiVPGWwpM=", + "algorithm HMAC-SHA256", + "sign_query false", +) + + +def csrf(session: Session, url: str) -> str: + page = session.get(url) + page.raise_for_status() + token = BeautifulSoup(page.text, "html.parser").find("input", {"name": "csrf_token"}) + if not token: + raise RuntimeError(f"no csrf_token on {url}") + return token["value"] + + +def login(session: Session) -> None: + session.post( + f"{UI}/login", + data={"csrf_token": csrf(session, f"{UI}/login"), "username": USERNAME, "password": PASSWORD}, + ).raise_for_status() + + +def build(name: str, kind: str) -> dict: + server_name = f"{name}.{ZONE}" + variables = { + "SERVER_NAME": server_name, + "IS_DRAFT": "no", + "USE_REVERSE_PROXY": "yes", + "REVERSE_PROXY_URL": "/", + "REVERSE_PROXY_HOST": "http://app:8080", + "AUTO_LETS_ENCRYPT": "yes", + "EMAIL_LETS_ENCRYPT": f"admin@{ZONE}", + "LETS_ENCRYPT_CHALLENGE": "dns", + "LETS_ENCRYPT_DNS_PROVIDER": "rfc2136", + "LETS_ENCRYPT_DNS_PROPAGATION": "10", + } + + if kind == "dns": + for index, item in enumerate(DNS_CREDENTIALS): + suffix = "" if index == 0 else f"_{index}" + variables[f"LETS_ENCRYPT_DNS_CREDENTIAL_ITEM{suffix}"] = item + variables[f"LETS_ENCRYPT_DNS_CREDENTIAL_DECODE_BASE64{suffix}"] = "no" + elif kind != "dns-nocreds": + raise SystemExit(f"unknown kind {kind!r}") + + return variables + + +def main() -> int: + if len(argv) != 3: + raise SystemExit(__doc__) + name, kind = argv[1], argv[2] + server_name = f"{name}.{ZONE}" + + session = Session() + login(session) + + if kind == "delete": + response = session.post( + f"{UI}/services/delete", + # The route does request.form["services"].split(","), so a bare CSV of ids. + data={"csrf_token": csrf(session, f"{UI}/services"), "services": server_name}, + ) + response.raise_for_status() + print(f"deleted {server_name} -> HTTP {response.status_code}") + return 0 + + url = f"{UI}/services/new?mode=advanced" + variables = build(name, kind) | {"csrf_token": csrf(session, url)} + response = session.post(url, data=variables) + response.raise_for_status() + print(f"created {server_name} ({kind}) -> HTTP {response.status_code} {response.url}") + return 0 + + +if __name__ == "__main__": + sys_exit(main()) diff --git a/misc/dev/ticket-3755-le-dns-env-stale/docker-compose.baseline.yml b/misc/dev/ticket-3755-le-dns-env-stale/docker-compose.baseline.yml new file mode 100644 index 0000000000..46ea7cff99 --- /dev/null +++ b/misc/dev/ticket-3755-le-dns-env-stale/docker-compose.baseline.yml @@ -0,0 +1,6 @@ +# Overlay that reverts ONLY the JobScheduler fix, to reproduce the bug before/after. +# docker compose -f docker-compose.yml -f docker-compose.baseline.yml up -d +services: + bunkerweb-all-in-one: + volumes: + - ./generated/JobScheduler.head.py:/usr/share/bunkerweb/scheduler/JobScheduler.py:ro diff --git a/misc/dev/ticket-3755-le-dns-env-stale/docker-compose.yml b/misc/dev/ticket-3755-le-dns-env-stale/docker-compose.yml new file mode 100644 index 0000000000..ce1b64470e --- /dev/null +++ b/misc/dev/ticket-3755-le-dns-env-stale/docker-compose.yml @@ -0,0 +1,126 @@ +services: + bunkerweb-all-in-one: + build: + context: ../../.. + dockerfile: ./src/all-in-one/Dockerfile + args: + SKIP_MINIFY: "yes" + container_name: bw-3755-aio + depends_on: + - bw-db + - bind9 + - pebble + ports: + # Deliberately off the usual 80/443/7000 so this rig can run beside other dev stacks. + - 8355:8080/tcp + - 8443:8443/tcp + - 7355:7000/tcp + volumes: + - bw-storage:/data + - ./certs:/certs:ro + # Only difference from the built image: issuance points at Pebble. See setup.sh. + - ./generated/letsencrypt_utils.py:/usr/share/bunkerweb/core/letsencrypt/jobs/letsencrypt_utils.py:ro + - ./generated/certbot-new.py:/usr/share/bunkerweb/core/letsencrypt/jobs/certbot-new.py:ro + environment: + DATABASE_URI: "mariadb+pymysql://bunkerweb:secret@bw-db:3306/db" + MULTISITE: "yes" + # Only app1 exists at container start, and it does NOT use Let's Encrypt. + # Every DNS-01 service is created afterwards through the Web UI: that is the bug. + SERVER_NAME: "app1.bwtest.lan" + app1.bwtest.lan_USE_REVERSE_PROXY: "yes" + app1.bwtest.lan_REVERSE_PROXY_URL: "/" + app1.bwtest.lan_REVERSE_PROXY_HOST: "http://app:8080" + + USE_BUNKERNET: "no" + USE_BLACKLIST: "no" + USE_WHITELIST: "no" + SEND_ANONYMOUS_REPORT: "no" + SERVE_FILES: "no" + DISABLE_DEFAULT_SERVER: "no" + GENERATE_SELF_SIGNED_SSL: "yes" + LOG_LEVEL: "info" + CUSTOM_LOG_LEVEL: "debug" + + # Trust the local ACME CA (certbot / acme go through requests). + REQUESTS_CA_BUNDLE: "/certs/ca.crt" + + # UI + ADMIN_USERNAME: "admin" + ADMIN_PASSWORD: "P@ssw0rd" + FLASK_SECRET: "secret" + CHECK_PRIVATE_IP: "no" + SESSIONS_CHECK_IP: "no" + MAX_WORKERS: "1" + MAX_THREADS: "4" + restart: "no" + networks: + bw-le: + ipv4_address: 10.30.55.10 + + bw-db: + image: mariadb:11 + container_name: bw-3755-db + command: --max-allowed-packet=67108864 + environment: + MYSQL_RANDOM_ROOT_PASSWORD: "yes" + MYSQL_DATABASE: "db" + MYSQL_USER: "bunkerweb" + MYSQL_PASSWORD: "secret" + volumes: + - bw-data:/var/lib/mysql + restart: "no" + networks: + - bw-le + + # Authoritative DNS for bwtest.lan, accepting TSIG-signed RFC2136 updates. + bind9: + image: internetsystemsconsortium/bind9:9.20 + container_name: bw-3755-bind9 + volumes: + - ./bind/named.conf:/etc/bind/named.conf:ro + - ./bind/bwtest.lan.zone:/zones/bwtest.lan.zone:ro + # The zone must live somewhere writable: dynamic updates rewrite it and its journal. + # entrypoint, not command: the image's own entrypoint already execs named. + entrypoint: + - sh + - -c + - "mkdir -p /var/lib/bind && cp /zones/bwtest.lan.zone /var/lib/bind/ && chown -R bind:bind /var/lib/bind && exec named -g -c /etc/bind/named.conf -u bind" + restart: "no" + networks: + bw-le: + ipv4_address: 10.30.55.53 + + # Local ACME CA. -dnsserver makes its DNS-01 validation query our bind9. + pebble: + image: ghcr.io/letsencrypt/pebble:latest + container_name: bw-3755-pebble + depends_on: + - bind9 + command: -config /test/config/pebble-config.json -dnsserver 10.30.55.53:53 + environment: + PEBBLE_VA_NOSLEEP: "1" + volumes: + - ./pebble-config.json:/test/config/pebble-config.json:ro + - ./certs:/certs:ro + restart: "no" + networks: + bw-le: + ipv4_address: 10.30.55.14 + + app: + image: nginxdemos/nginx-hello + container_name: bw-3755-app + restart: "no" + networks: + - bw-le + +volumes: + bw-data: + bw-storage: + +networks: + bw-le: + ipam: + driver: default + config: + - subnet: 10.30.55.0/24 diff --git a/misc/dev/ticket-3755-le-dns-env-stale/pebble-config.json b/misc/dev/ticket-3755-le-dns-env-stale/pebble-config.json new file mode 100644 index 0000000000..eace331480 --- /dev/null +++ b/misc/dev/ticket-3755-le-dns-env-stale/pebble-config.json @@ -0,0 +1,12 @@ +{ + "pebble": { + "listenAddress": "0.0.0.0:14000", + "managementListenAddress": "0.0.0.0:15000", + "certificate": "/certs/pebble.crt", + "privateKey": "/certs/pebble.key", + "httpPort": 80, + "tlsPort": 443, + "ocspResponderURL": "", + "externalAccountBindingRequired": false + } +} diff --git a/misc/dev/ticket-3755-le-dns-env-stale/setup.sh b/misc/dev/ticket-3755-le-dns-env-stale/setup.sh new file mode 100755 index 0000000000..de965255bf --- /dev/null +++ b/misc/dev/ticket-3755-le-dns-env-stale/setup.sh @@ -0,0 +1,85 @@ +#!/usr/bin/env bash +# Generate the local ACME CA + Pebble server certificate, and the two patched job files +# that point issuance at Pebble instead of Let's Encrypt. +# +# BunkerWeb hardcodes the Let's Encrypt directory URLs and exposes no setting to override +# them, so reaching a local ACME server means patching: +# * letsencrypt_utils.py -> the directory constant, used for account bookkeeping +# * certbot-new.py -> `certbot certonly` is invoked with no --server at all, so +# the constant alone never reaches certbot +# Both copies are regenerated from the repo on every run and each is checked to differ +# from its source by exactly the intended lines, so the rig always tests current code. +set -euo pipefail + +cd "$(dirname "$0")" + +UTILS_SRC="../../../src/common/core/letsencrypt/jobs/letsencrypt_utils.py" +NEW_SRC="../../../src/common/core/letsencrypt/jobs/certbot-new.py" +PEBBLE_URL="https://pebble:14000/dir" + +mkdir -p certs generated + +if [ ! -f certs/ca.crt ]; then + echo "==> Generating local ACME CA and Pebble server certificate" + # keyUsage/basicConstraints are not optional: OpenSSL refuses a CA without them + # ("CA cert does not include key usage extension"). + openssl req -x509 -newkey rsa:2048 -nodes -days 3650 \ + -keyout certs/ca.key -out certs/ca.crt \ + -subj "/CN=BunkerWeb 3755 test CA" \ + -addext "basicConstraints=critical,CA:TRUE" \ + -addext "keyUsage=critical,digitalSignature,keyCertSign,cRLSign" 2>/dev/null + + openssl req -newkey rsa:2048 -nodes \ + -keyout certs/pebble.key -out certs/pebble.csr \ + -subj "/CN=pebble" 2>/dev/null + + openssl x509 -req -in certs/pebble.csr -CA certs/ca.crt -CAkey certs/ca.key \ + -CAcreateserial -days 3650 -out certs/pebble.crt \ + -extfile <(printf "subjectAltName=DNS:pebble,DNS:localhost,IP:10.30.55.14,IP:127.0.0.1\nbasicConstraints=critical,CA:FALSE\nkeyUsage=critical,digitalSignature,keyEncipherment\nextendedKeyUsage=serverAuth\n") 2>/dev/null + + rm -f certs/pebble.csr + chmod 644 certs/*.crt certs/*.key +else + echo "==> Reusing existing certs/" +fi + +echo "==> Patching the ACME directory constant -> ${PEBBLE_URL}" +sed "s#^LETSENCRYPT_PRODUCTION_DIRECTORY = .*#LETSENCRYPT_PRODUCTION_DIRECTORY = \"${PEBBLE_URL}\"#" \ + "${UTILS_SRC}" > generated/letsencrypt_utils.py + +if ! grep -q "^LETSENCRYPT_PRODUCTION_DIRECTORY = \"${PEBBLE_URL}\"$" generated/letsencrypt_utils.py; then + echo "FAILED: the ACME directory constant was not patched, check ${UTILS_SRC}" >&2 + exit 1 +fi + +echo "==> Patching certbot certonly to pass --server ${PEBBLE_URL}" +sed "s#^ \"--break-my-certs\",\$# \"--server\",\n \"${PEBBLE_URL}\",\n \"--break-my-certs\",#" \ + "${NEW_SRC}" > generated/certbot-new.py + +if ! grep -q "^ \"${PEBBLE_URL}\",\$" generated/certbot-new.py; then + echo "FAILED: --server was not injected, the certonly command in ${NEW_SRC} changed shape" >&2 + exit 1 +fi + +# Each generated copy must differ from its source only by the intended lines. +check_drift() { + local src="$1" gen="$2" filter="$3" name="$4" + if ! diff -q <(grep -vE "${filter}" "${src}") <(grep -vE "${filter}" "${gen}") > /dev/null; then + echo "FAILED: generated/${name} differs from ${src} beyond the intended patch" >&2 + diff <(grep -vE "${filter}" "${src}") <(grep -vE "${filter}" "${gen}") >&2 || true + exit 1 + fi +} + +check_drift "${UTILS_SRC}" generated/letsencrypt_utils.py '^LETSENCRYPT_PRODUCTION_DIRECTORY = ' letsencrypt_utils.py +check_drift "${NEW_SRC}" generated/certbot-new.py "^ \"(--server|${PEBBLE_URL//\//\\/})\",\$" certbot-new.py + +# Pre-fix JobScheduler for docker-compose.baseline.yml, so the bug can be reproduced. +echo "==> Extracting the pre-fix JobScheduler for the baseline overlay" +git -C ../../.. show HEAD:src/scheduler/JobScheduler.py > generated/JobScheduler.head.py +if ! grep -q "os.environ = self.__base_env.copy()" generated/JobScheduler.head.py; then + echo "NOTE: HEAD no longer contains the os.environ rebind, so the baseline overlay is a no-op." >&2 + echo " Point it at the commit before the fix to reproduce the bug." >&2 +fi + +echo "==> Ready. Next: docker compose build && docker compose up -d" diff --git a/src/common/core/letsencrypt/jobs/certbot-new.py b/src/common/core/letsencrypt/jobs/certbot-new.py index 442cef678b..9bf44a4a2d 100644 --- a/src/common/core/letsencrypt/jobs/certbot-new.py +++ b/src/common/core/letsencrypt/jobs/certbot-new.py @@ -46,6 +46,7 @@ PROVIDERS, certbot_log_backup_flags, ZEROSSL_BOT_SCRIPT, + attach_job_log_file, build_certbot_env, extract_provider, get_expected_acme_directory, @@ -61,6 +62,10 @@ LOGGER = getLogger("LETS-ENCRYPT.NEW") LOGGER_CERTBOT = getLogger("LETS-ENCRYPT.NEW.CERTBOT") +# Attach before any service is inspected: the "skipping generation" warnings that used to +# be visible only in `docker logs` are emitted while building the per-service config. +attach_job_log_file(LOGGER, "certbot-new.log", LOGS_DIR) + ZEROSSL_API_KEY_HASHES_PATH = DATA_PATH.joinpath("renewal", ".bw-zerossl-api-key-hashes.json") MERGE_LOCK = Lock() RUNNING_LOCK = Lock() @@ -262,6 +267,11 @@ def env(key: str, default: Optional[str] = None) -> str: wildcard = env("USE_LETS_ENCRYPT_WILDCARD", "no").lower() == "yes" activated = env("AUTO_LETS_ENCRYPT", "no").lower() == "yes" and env("LETS_ENCRYPT_PASSTHROUGH", "no").lower() == "no" staging = env("USE_LETS_ENCRYPT_STAGING", "no").lower() == "yes" + # Set when the service asked for a certificate but its configuration makes issuance + # impossible. Distinguishes "not using Let's Encrypt" (a green job) from "wants a + # certificate and cannot get one" (a red job the operator has to look at). Settings + # that merely fall back to a default are not misconfigurations. + misconfigured = False if acme_server not in ACME_SERVER_TYPES: if activated: @@ -271,6 +281,7 @@ def env(key: str, default: Optional[str] = None) -> str: # User-friendly checks if activated and not server_names_val: LOGGER.warning(f"[Service: {service}] SERVER_NAME is empty. Please set a valid server name, skipping generation.") + misconfigured = True activated = False if email_val: @@ -283,6 +294,7 @@ def env(key: str, default: Optional[str] = None) -> str: if acme_server == "zerossl" and not email_val and not zerossl_api_key and activated: LOGGER.warning(f"[Service: {service}] ZeroSSL requires EMAIL_LETS_ENCRYPT or LETS_ENCRYPT_ZEROSSL_API_KEY. Skipping generation.") + misconfigured = True activated = False if acme_server == "zerossl" and staging: @@ -339,6 +351,7 @@ def env(key: str, default: Optional[str] = None) -> str: if activated and challenge_val not in CHALLENGE_TYPES: LOGGER.warning(f"[Service: {service}] LETS_ENCRYPT_CHALLENGE '{challenge_val}' is invalid. Must be one of {CHALLENGE_TYPES!r}, skipping generation.") + misconfigured = True activated = False if custom_profile: @@ -370,17 +383,20 @@ def env(key: str, default: Optional[str] = None) -> str: if not authenticator: if activated: LOGGER.warning(f"[Service: {service}] DNS challenge selected but no DNS provider is configured, skipping generation.") + misconfigured = misconfigured or activated activated = False elif authenticator not in PROVIDERS: if activated: LOGGER.warning( f"[Service: {service}] DNS provider '{authenticator}' is not supported. Must be one of {list(PROVIDERS.keys())!r}, skipping generation." ) + misconfigured = misconfigured or activated activated = False else: credential_key = f"{service}_LETS_ENCRYPT_DNS_CREDENTIAL_ITEM" if IS_MULTISITE else "LETS_ENCRYPT_DNS_CREDENTIAL_ITEM" provider = extract_provider(service, credential_key, authenticator, decode_base64, LOGGER) if not provider: + misconfigured = misconfigured or activated activated = False else: authenticator = "manual" @@ -393,6 +409,7 @@ def env(key: str, default: Optional[str] = None) -> str: return server_names, { "server_names": "", "activated": activated, + "misconfigured": misconfigured, "acme_server": acme_server, "acme_server_url": get_expected_acme_directory(acme_server, staging), "zerossl_api_key": zerossl_api_key, @@ -416,6 +433,11 @@ def env(key: str, default: Optional[str] = None) -> str: } +def list_misconfigured(services: Dict[str, Dict[str, Union[str, bool, int, Dict[str, str]]]]) -> List[str]: + """Names of services that asked for a certificate but cannot get one, sorted.""" + return sorted(name for name, config in services.items() if config.get("misconfigured")) + + def extract_wildcard_groups(domains: List[str]) -> Dict[str, List[str]]: cleaned_labels: List[List[str]] = [] @@ -823,9 +845,18 @@ def generate_certificate(service: str, config: Dict[str, Union[str, bool, int, D services[cert_name] = config if not any(service["activated"] for service in services.values()): + misconfigured_services = list_misconfigured(services) + if misconfigured_services: + LOGGER.error( + "Let's Encrypt is enabled but no certificate can be requested, invalid configuration for " + f"{len(misconfigured_services)} service(s): {', '.join(misconfigured_services)}" + ) + sys_exit(2) LOGGER.info("No services uses Let's Encrypt, skipping generation of new certificates...") sys_exit(0) + # Still needed before certbot runs: sets the umask and sweeps unwritable log files. + # The job's own log file is attached earlier, at import, without that side effect. prepare_logs_dir(LOGS_DIR, LOGGER) JOB = Job(LOGGER, __file__.replace("new", "renew")) @@ -933,6 +964,7 @@ def generate_certificate(service: str, config: Dict[str, Union[str, bool, int, D psl_rules = parse_psl(psl_lines) if check_psl_blacklist(list(normalize_server_names(config["server_names"])), psl_rules, server_name): + config["misconfigured"] = True config["activated"] = False continue @@ -1041,6 +1073,18 @@ def generate_certificate(service: str, config: Dict[str, Union[str, bool, int, D finally: stop_progress_monitor() + misconfigured_services = list_misconfigured(services) + if misconfigured_services: + LOGGER.error( + f"Skipped certificate generation for {len(misconfigured_services)} service(s) with an invalid " + f"Let's Encrypt configuration: {', '.join(misconfigured_services)}" + ) + # Only escalate when nothing was generated. status 1 means certbot succeeded and the + # scheduler still owes those certificates an nginx reload, which a status >= 2 would + # suppress, leaving freshly issued certificates unserved. + if status == 0: + status = 2 + if CACHE_PATH.is_dir(): # * Clean up unused credential files used_credential_files = set() diff --git a/src/common/core/letsencrypt/jobs/certbot-renew.py b/src/common/core/letsencrypt/jobs/certbot-renew.py index 39abdcecb7..42835fe04a 100644 --- a/src/common/core/letsencrypt/jobs/certbot-renew.py +++ b/src/common/core/letsencrypt/jobs/certbot-renew.py @@ -21,6 +21,7 @@ LETSENCRYPT_LOGS_DIR as LOGS_DIR, LETSENCRYPT_WORK_DIR as WORK_DIR, ZEROSSL_BOT_SCRIPT, + attach_job_log_file, build_certbot_env, certbot_log_backup_flags, is_zerossl_used_in_env, @@ -35,6 +36,10 @@ LOGGER = getLogger("LETS-ENCRYPT.RENEW") LOGGER_CERTBOT = getLogger("LETS-ENCRYPT.RENEW.CERTBOT") + +# Same rationale as certbot-new: in Docker these lines otherwise only reach `docker logs`. +attach_job_log_file(LOGGER, "certbot-renew.log", LOGS_DIR) + CERTBOT_TIMEOUT = 900 # 15 minutes max for a single certbot invocation status = 0 diff --git a/src/common/core/letsencrypt/jobs/letsencrypt_utils.py b/src/common/core/letsencrypt/jobs/letsencrypt_utils.py index 86404edfa3..5c2a49aa10 100644 --- a/src/common/core/letsencrypt/jobs/letsencrypt_utils.py +++ b/src/common/core/letsencrypt/jobs/letsencrypt_utils.py @@ -1,5 +1,7 @@ from base64 import b64decode from json import loads as json_loads +from logging import Formatter +from logging.handlers import RotatingFileHandler from os import ( O_CREAT, O_NOFOLLOW, @@ -26,6 +28,7 @@ from pydantic import ValidationError from common_utils import bytes_hash # type: ignore +from logger import DATE_FORMAT, LOG_FORMAT # type: ignore from letsencrypt_providers import ( BunnyNetProvider, ClouDNSProvider, @@ -70,6 +73,10 @@ LETSENCRYPT_WORK_DIR = join(sep, "var", "lib", "bunkerweb", "letsencrypt") LETSENCRYPT_LOGS_DIR = join(sep, "var", "log", "bunkerweb", "letsencrypt") +# Name tagged on the per-job log handler so re-running a job cannot stack duplicates. +JOB_LOG_HANDLER_NAME = "bw-letsencrypt-job-log" +JOB_LOG_MAX_BYTES = 1_000_000 + LETSENCRYPT_PRODUCTION_DIRECTORY = "https://acme-v02.api.letsencrypt.org/directory" LETSENCRYPT_STAGING_DIRECTORY = "https://acme-staging-v02.api.letsencrypt.org/directory" ZEROSSL_DIRECTORY = "https://acme.zerossl.com/v2/DV90" @@ -354,25 +361,71 @@ def build_certbot_env(job, deps_path: str, base_env: Optional[Dict[str, str]] = return cmd_env -def prepare_logs_dir(logs_dir: Union[str, Path], logger) -> None: - """Ensure the Let's Encrypt logs directory is writable by the running user.""" - try: - umask(0o007) - except BaseException: - logger.debug("Failed to set umask to 007 for letsencrypt logs") +def ensure_logs_dir(logs_dir: Union[str, Path], logger) -> Optional[Path]: + """Create the Let's Encrypt logs directory and return it, or ``None`` if unusable. + Split out of :func:`prepare_logs_dir` so a caller can get the directory without also + taking that function's process-global ``umask`` side effect. + """ logs_path = Path(logs_dir) try: logs_path.mkdir(parents=True, exist_ok=True) except BaseException as e: logger.error(f"Failed to create Let's Encrypt logs directory {logs_path}: {e}") - return + return None try: logs_path.chmod(0o2770) except BaseException as e: logger.debug(f"Failed to set permissions on {logs_path}: {e}") + return logs_path + + +def attach_job_log_file(logger, file_name: str, logs_dir: Union[str, Path] = LETSENCRYPT_LOGS_DIR) -> None: + """Mirror ``logger``'s own records into ``/`` for the Web UI. + + In Docker the scheduler logs only to stdout, so a refused or skipped issuance was + invisible outside ``docker logs``. The UI's Let's Encrypt log view globs + ``/*.log*``, which until now only ever contained certbot's own log, and + certbot never runs on the skip paths. Child loggers (``.CERTBOT``) propagate + here, so they are covered without attaching twice. + + Idempotent: job modules are re-executed on every scheduler reload but ``getLogger`` + returns the same object, so an unguarded call would stack a handler per reload. + """ + if any(handler.get_name() == JOB_LOG_HANDLER_NAME for handler in logger.handlers): + return + + logs_path = ensure_logs_dir(logs_dir, logger) + if logs_path is None: + return + + try: + backup_count = max(0, int((environ.get("LETS_ENCRYPT_MAX_LOG_BACKUPS", "") or "50").strip())) + except ValueError: + backup_count = 50 + + try: + handler = RotatingFileHandler(logs_path.joinpath(file_name), maxBytes=JOB_LOG_MAX_BYTES, backupCount=backup_count) + handler.set_name(JOB_LOG_HANDLER_NAME) + handler.setFormatter(Formatter(LOG_FORMAT, DATE_FORMAT)) + logger.addHandler(handler) + except BaseException as e: + logger.error(f"Failed to attach the Let's Encrypt job log file {logs_path.joinpath(file_name)}: {e}") + + +def prepare_logs_dir(logs_dir: Union[str, Path], logger) -> None: + """Ensure the Let's Encrypt logs directory is writable by the running user.""" + try: + umask(0o007) + except BaseException: + logger.debug("Failed to set umask to 007 for letsencrypt logs") + + logs_path = ensure_logs_dir(logs_dir, logger) + if logs_path is None: + return + for log_file in logs_path.glob("*.log*"): try: if access(log_file, W_OK): diff --git a/src/scheduler/JobScheduler.py b/src/scheduler/JobScheduler.py index b271fd83cf..79116e6f96 100644 --- a/src/scheduler/JobScheduler.py +++ b/src/scheduler/JobScheduler.py @@ -60,6 +60,8 @@ def __init__( self.db = db or Database(self.__logger) # Store only essential environment variables to reduce memory usage self.__base_env = os.environ.copy() + # The dict published as ``os.environ`` once the first config is set. See __set_env. + self.__job_env: Optional[Dict[str, Any]] = None self.__lock = lock self.__thread_lock = Lock() self.__job_success = True @@ -133,8 +135,39 @@ def env(self) -> Dict[str, Any]: @env.setter def env(self, env: Dict[str, Any]): - os.environ = self.__base_env.copy() # Reset to base environment - os.environ.update(env) # Update with new environment + self.__set_env(env) + + def __set_env(self, env: Dict[str, Any]) -> None: + """Publish ``base_env | env`` as ``os.environ`` without ever changing its identity. + + Jobs run in-process and a job helper module that does ``from os import environ`` + binds whatever object ``os.environ`` is at its first import. Those helpers stay in + ``sys.modules`` across reloads (``cleanup_modules`` only drops the ``bw_job_*`` + entrypoints), so rebinding ``os.environ`` on every reload froze them on a + start-time snapshot: a service created after startup was invisible to them, and + only a restart brought it back. Mutate the same dict instead. + + Never ``clear()`` first. The SIGHUP handler runs in this very thread between two + bytecodes and reads ``getenv("PATH")`` / ``getenv("DATABASE_URI")`` to build the + env of the config-saver subprocess, so ``os.environ`` must never be observable + half-empty. Update, then prune. + + The prune loop is load-bearing, not tidying: a deleted service must lose its + ``{service}_*`` keys, which resetting from ``base_env`` used to do for free. + + Callers must hold the main thread with no job batch in flight. This mutates a dict + other modules read directly, so a concurrent ``environ.items()`` would raise + ``RuntimeError``. ``run_once``/``run_pending`` join every job future before + returning, and ``reload()`` calls this before starting a batch. + """ + new_env = self.__base_env | env + if self.__job_env is None: + self.__job_env = new_env + os.environ = self.__job_env # single atomic rebind, already fully populated + return + self.__job_env.update(new_env) + for key in self.__job_env.keys() - new_env.keys(): + del self.__job_env[key] def update_jobs(self): self.__jobs = self.__get_jobs() @@ -561,8 +594,7 @@ def reload( # Clear module cache on reload to pick up changes self.cleanup_modules() - os.environ = self.__base_env.copy() - os.environ.update(env) # Update with new environment + self.__set_env(env) super().__init__(apis or self.apis) self.clear() self.update_jobs() From 753d240b5a3845862b6519753fd0b3e73b4b13bd Mon Sep 17 00:00:00 2001 From: TheophileDiot Date: Mon, 27 Jul 2026 11:28:12 +0200 Subject: [PATCH 12/25] chore: Update CHNAGELOG.md --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 199b1cb8d1..26d8aed4eb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,8 @@ - [BUGFIX] `metrics`: when the metrics memory zone fills up, shed the oldest blocked-request reports instead of silently discarding a worker's whole history, and warn that `METRICS_MEMORY_SIZE` needs raising. - [BUGFIX] `metrics`: stop storing the literal string `nil` in Redis for a counter evicted from a worker's LRU mid-sync, which made the `misc`, `blacklist` and `greylist` plugin pages return a 500. - [BUGFIX] `ui`: an unreadable counter no longer breaks a whole plugin page, and no longer hides the workers that reported real counts. +- [BUGFIX] `scheduler`: refresh the job environment in place instead of replacing it on every reload, so jobs stop reading a snapshot of the configuration taken at startup. A DNS-01 service created or edited in the web UI got no certificate until the container was restarted. (Fixes #3755) +- [BUGFIX] `letsencrypt`: fail the `certbot-new` job when a service cannot get the certificate it asked for instead of reporting success, and write each job's output to `certbot-new.log` and `certbot-renew.log` so the Jobs and Logs pages show why. - [UI] Reports page: document the retention model, a rolling buffer capped per worker that is cleared on restart unless Redis is enabled. ## v1.6.14~rc1 - 2026/07/23 From 6396a2236a8304e6ead1c1d65d9bec7504d0dfeb Mon Sep 17 00:00:00 2001 From: TheophileDiot Date: Mon, 27 Jul 2026 17:37:13 +0200 Subject: [PATCH 13/25] fix: Fix Lua variable fallback for partial service settings Keep global values visible when per-service tables lack the requested variable. --- src/bw/lua/bunkerweb/utils.lua | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/bw/lua/bunkerweb/utils.lua b/src/bw/lua/bunkerweb/utils.lua index 5c6178a956..8d714444e7 100644 --- a/src/bw/lua/bunkerweb/utils.lua +++ b/src/bw/lua/bunkerweb/utils.lua @@ -78,7 +78,9 @@ utils.get_variable = function(variable, site_search, ctx) else server_name = var.server_name end - if variables[server_name] then + -- Keep the global value when the service has no entry of its own, otherwise a + -- partially populated per-service table hides settings that do exist globally. + if variables[server_name] and variables[server_name][variable] ~= nil then value = variables[server_name][variable] end end From d5403c6e13db67f980c88f7079d9c80bb2320abd Mon Sep 17 00:00:00 2001 From: TheophileDiot Date: Mon, 27 Jul 2026 17:50:52 +0200 Subject: [PATCH 14/25] fix(lua): throttle missing-setting logs instead of erroring per request --- src/bw/lua/bunkerweb/plugin.lua | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/bw/lua/bunkerweb/plugin.lua b/src/bw/lua/bunkerweb/plugin.lua index 9b22543b44..66ad398d05 100644 --- a/src/bw/lua/bunkerweb/plugin.lua +++ b/src/bw/lua/bunkerweb/plugin.lua @@ -8,6 +8,7 @@ local utils = require "bunkerweb.utils" local plugin = class("plugin") local cjson = require "cjson" local ERR = ngx.ERR +local WARN = ngx.WARN local get_phase = ngx.get_phase local get_variable = utils.get_variable local get_ctx_obj = utils.get_ctx_obj @@ -78,7 +79,11 @@ function plugin:initialize(id, ctx) for k, v in pairs(metadata.settings) do value, err = get_variable(k, v.context == "multisite" and self.is_request) if value == nil then - self.logger:log(ERR, "can't get " .. k .. " variable : " .. err) + -- A setting declared on disk but absent from the generated config means the + -- database is out of sync, not that this request failed. Plugins treat a nil + -- value as "feature disabled", so throttle instead of logging per request. + -- The key set is bounded by the settings this plugin declares. + self:log_throttled(WARN, "missing_variable_" .. k, "can't get " .. k .. " variable : " .. err) end self.variables[k] = value end From 60bf0d78308fa638e6c604ee5528a96ef385900f Mon Sep 17 00:00:00 2001 From: TheophileDiot Date: Mon, 27 Jul 2026 17:51:25 +0200 Subject: [PATCH 15/25] fix(whitelist): merge configured WHITELIST_* into the stored lists --- src/common/core/whitelist/whitelist.lua | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/common/core/whitelist/whitelist.lua b/src/common/core/whitelist/whitelist.lua index 783796675c..c0dad9700b 100644 --- a/src/common/core/whitelist/whitelist.lua +++ b/src/common/core/whitelist/whitelist.lua @@ -117,6 +117,16 @@ function whitelist:init() end f:close() end + -- Merge the manually configured entries. The stored lists are what + -- utils.is_ip_whitelisted and the default server read, and without this they + -- only ever contain what the URL download job wrote. + local setting = get_variable("WHITELIST_" .. kind, true, { bw = { server_name = key } }) + if setting then + for data in setting:gmatch("%S+") do + table.insert(whitelists[kind], data) + i = i + 1 + end + end whitelists[kind] = deduplicate_list(whitelists[kind]) end From ad83bdbf79eac33fa0acb8a1493518df084faed7 Mon Sep 17 00:00:00 2001 From: TheophileDiot Date: Mon, 27 Jul 2026 17:51:59 +0200 Subject: [PATCH 16/25] fix(access): let a whitelisted IP through an active ban --- src/common/confs/server-http/access-lua.conf | 32 +++++++++++++------ .../server-stream/preread-stream-lua.conf | 24 ++++++++++---- 2 files changed, 41 insertions(+), 15 deletions(-) diff --git a/src/common/confs/server-http/access-lua.conf b/src/common/confs/server-http/access-lua.conf index bb74250e82..418efffbcd 100644 --- a/src/common/confs/server-http/access-lua.conf +++ b/src/common/confs/server-http/access-lua.conf @@ -30,6 +30,7 @@ access_by_lua_block { local new_plugin = helpers.new_plugin local call_plugin = helpers.call_plugin local is_whitelisted = utils.is_whitelisted + local is_ip_whitelisted = utils.is_ip_whitelisted local is_banned = utils.is_banned local set_reason = utils.set_reason local get_deny_status = utils.get_deny_status @@ -76,17 +77,30 @@ access_by_lua_block { if banned == nil then logger:log(ERR, "can't check if IP " .. ctx.bw.remote_addr .. " is banned : " .. reason) elseif banned then - ctx.bw.is_banned = true - set_reason(reason, reason_data, ctx, security_mode) - save_ctx(ctx) - if security_mode == "block" then + -- The flag checked above only reflects the whitelist cache, and the sole code + -- that fills it runs later in the plugin chain, which this branch exits before + -- reaching. Without an authoritative re-check here, a banned IP could never be + -- rescued by whitelisting it. + local whitelisted, wl_info = is_ip_whitelisted(ctx.bw.remote_addr, ctx.bw.server_name) + if whitelisted == nil then + logger:log(ERR, "can't check whitelist for banned IP " .. ctx.bw.remote_addr .. " : " .. wl_info) + end + if whitelisted then + logger:log(WARN, + "IP " .. ctx.bw.remote_addr .. " is banned with reason " .. reason .. " but is whitelisted (info : " .. wl_info .. "), ignoring the ban") + else + ctx.bw.is_banned = true + set_reason(reason, reason_data, ctx, security_mode) + save_ctx(ctx) + if security_mode == "block" then + logger:log(WARN, + "IP " .. ctx.bw.remote_addr .. " is banned with reason " .. reason .. " (" .. tostring(ttl) .. "s remaining)") + return exit(get_deny_status()) + end logger:log(WARN, - "IP " .. ctx.bw.remote_addr .. " is banned with reason " .. reason .. " (" .. tostring(ttl) .. "s remaining)") - return exit(get_deny_status()) + "detected IP " .. ctx.bw.remote_addr .. " ban with reason " .. reason .. " (" .. tostring(ttl) .. "s remaining)") + return exit(OK) end - logger:log(WARN, - "detected IP " .. ctx.bw.remote_addr .. " ban with reason " .. reason .. " (" .. tostring(ttl) .. "s remaining)") - return exit(OK) else logger:log(INFO, "IP " .. ctx.bw.remote_addr .. " is not banned") end diff --git a/src/common/confs/server-stream/preread-stream-lua.conf b/src/common/confs/server-stream/preread-stream-lua.conf index ceb3c64431..d87b3d36ae 100644 --- a/src/common/confs/server-stream/preread-stream-lua.conf +++ b/src/common/confs/server-stream/preread-stream-lua.conf @@ -17,6 +17,7 @@ preread_by_lua_block { local new_plugin = helpers.new_plugin local call_plugin = helpers.call_plugin local is_whitelisted = utils.is_whitelisted + local is_ip_whitelisted = utils.is_ip_whitelisted local is_banned = utils.is_banned local set_reason = utils.set_reason local get_deny_status = utils.get_deny_status @@ -52,12 +53,23 @@ preread_by_lua_block { if banned == nil then logger:log(ERR, "can't check if IP " .. ctx.bw.remote_addr .. " is banned : " .. reason) elseif banned then - ctx.bw.is_banned = true - set_reason(reason, {}, ctx) - save_ctx(ctx) - logger:log(WARN, - "IP " .. ctx.bw.remote_addr .. " is banned with reason " .. reason .. " (" .. tostring(ttl) .. "s remaining)") - return exit(get_deny_status()) + -- Same reason as the HTTP access phase: the flag above only reflects the + -- whitelist cache, which nothing can fill while the IP stays banned. + local whitelisted, wl_info = is_ip_whitelisted(ctx.bw.remote_addr, ctx.bw.server_name) + if whitelisted == nil then + logger:log(ERR, "can't check whitelist for banned IP " .. ctx.bw.remote_addr .. " : " .. wl_info) + end + if whitelisted then + logger:log(WARN, + "IP " .. ctx.bw.remote_addr .. " is banned with reason " .. reason .. " but is whitelisted (info : " .. wl_info .. "), ignoring the ban") + else + ctx.bw.is_banned = true + set_reason(reason, {}, ctx) + save_ctx(ctx) + logger:log(WARN, + "IP " .. ctx.bw.remote_addr .. " is banned with reason " .. reason .. " (" .. tostring(ttl) .. "s remaining)") + return exit(get_deny_status()) + end else logger:log(INFO, "IP " .. ctx.bw.remote_addr .. " is not banned") end From c07b550a40474ffe452346ecb4562960b5c3ba3c Mon Sep 17 00:00:00 2001 From: TheophileDiot Date: Mon, 27 Jul 2026 17:52:27 +0200 Subject: [PATCH 17/25] fix(autoconf): fail loudly when a Kubernetes watch stops streaming --- .../controllers/KubernetesController.py | 37 +++++++++++++++++-- 1 file changed, 34 insertions(+), 3 deletions(-) diff --git a/src/autoconf/controllers/KubernetesController.py b/src/autoconf/controllers/KubernetesController.py index ec1d8bcb7f..7239d52223 100644 --- a/src/autoconf/controllers/KubernetesController.py +++ b/src/autoconf/controllers/KubernetesController.py @@ -2,7 +2,8 @@ from contextlib import suppress from logging import DEBUG -from os import getenv +from os import getenv, sep +from pathlib import Path from re import compile as re_compile, split as re_split from threading import Lock, Thread from time import sleep, time @@ -15,6 +16,9 @@ from controllers.Controller import Controller +# Written by main.py once the controller starts and checked by healthcheck-autoconf.sh. +HEALTHY_PATH = Path(sep, "var", "tmp", "bunkerweb", "autoconf.healthy") + class KubernetesController(Controller): def __init__(self): @@ -554,6 +558,22 @@ def _log_event_summary(self) -> None: self._logger.info(f"Detected Kubernetes changes: {summary}") self._event_summary.clear() + def _mark_unhealthy(self, why: str) -> None: + """Drop the health marker so the orchestrator can restart a controller whose + watches are no longer streaming. Rebuilding the process is what recovers a + credential the API server has started rejecting.""" + self._logger.error(f"Marking autoconf unhealthy: {why}") + with suppress(OSError): + HEALTHY_PATH.unlink(missing_ok=True) + + def _mark_healthy(self) -> None: + if HEALTHY_PATH.is_file(): + return + with suppress(OSError): + HEALTHY_PATH.parent.mkdir(parents=True, exist_ok=True) + HEALTHY_PATH.write_text("ok") + self._logger.info("Kubernetes watch is streaming again, autoconf marked healthy") + def _get_stream_with_retries(self, watch_type, what, retries=5): attempt = 0 ignored = False @@ -570,14 +590,24 @@ def _get_stream_with_retries(self, watch_type, what, retries=5): attempt += 1 continue self._logger.debug(format_exc()) - self._logger.error(f"Unexpected ApiException while watching {watch_type}:\n{e}") + if e.status in (401, 403): + self._logger.error( + f"Kubernetes rejected our credentials while watching {watch_type} ({e.status} {e.reason}), " + f"check the ServiceAccount token and its permissions:\n{e}" + ) + else: + self._logger.error(f"Unexpected ApiException while watching {watch_type}:\n{e}") except Exception as e: self._logger.debug(format_exc()) self._logger.error(f"Unexpected error while watching {watch_type}:\n{e}") attempt += 1 self._logger.warning(f"Retrying {watch_type} in 5 seconds...") sleep(5) - self._logger.error(f"Failed to watch {watch_type} after {retries} retries.") + # Returning here would end the caller's for loop without an exception, which reads + # as a clean stream close: the watch would restart instantly, forever, while the + # controller reconciled nothing and still looked healthy. + self._mark_unhealthy(f"watch for {watch_type} failed {retries} times in a row") + raise RuntimeError(f"Failed to watch {watch_type} after {retries} retries") def _get_watchers(self) -> Dict[str, Any]: raise NotImplementedError @@ -589,6 +619,7 @@ def _watch(self, watch_type, what): applied = False try: for event in self._get_stream_with_retries(watch_type, what): + self._mark_healthy() applied = False self._internal_lock.acquire() locked = True From 06b2532a891baaf40a929885176058515c035b4a Mon Sep 17 00:00:00 2001 From: TheophileDiot Date: Mon, 27 Jul 2026 17:53:38 +0200 Subject: [PATCH 18/25] chore: update CHANGELOG.md --- CHANGELOG.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 26d8aed4eb..03b3361e81 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,9 @@ - [BUGFIX] `ui`: an unreadable counter no longer breaks a whole plugin page, and no longer hides the workers that reported real counts. - [BUGFIX] `scheduler`: refresh the job environment in place instead of replacing it on every reload, so jobs stop reading a snapshot of the configuration taken at startup. A DNS-01 service created or edited in the web UI got no certificate until the container was restarted. (Fixes #3755) - [BUGFIX] `letsencrypt`: fail the `certbot-new` job when a service cannot get the certificate it asked for instead of reporting success, and write each job's output to `certbot-new.log` and `certbot-renew.log` so the Jobs and Logs pages show why. +- [BUGFIX] `whitelist`: whitelisting a banned IP now lifts the block on HTTP and stream services, and manually configured `WHITELIST_*` values are honored by the default server and badbehavior checks instead of only the entries downloaded from `WHITELIST_*_URLS`. (Refs #3708) +- [BUGFIX] `core`: a setting missing from a service's configuration falls back to its global value, and a setting declared by a plugin but absent from the configuration is logged once per minute at warning level instead of at error level on every request. (Refs #3746) +- [BUGFIX] `autoconf`: a Kubernetes watch that exhausts its retries now backs off and marks the container unhealthy instead of silently restarting forever while reporting healthy. (Refs #3750) - [UI] Reports page: document the retention model, a rolling buffer capped per worker that is cleared on restart unless Redis is enabled. ## v1.6.14~rc1 - 2026/07/23 From efb152adee8139a252a6b26132a7ac1f94bed316 Mon Sep 17 00:00:00 2001 From: TheophileDiot Date: Tue, 28 Jul 2026 09:45:07 +0200 Subject: [PATCH 19/25] [#3750] docs(autoconf): give the Kubernetes controller a liveness probe --- CHANGELOG.md | 2 +- misc/integrations/k8s.mariadb.ui.yml | 8 ++++++++ misc/integrations/k8s.mariadb.yml | 8 ++++++++ misc/integrations/k8s.mysql.ui.yml | 8 ++++++++ misc/integrations/k8s.mysql.yml | 8 ++++++++ misc/integrations/k8s.oracle.ui.yml | 8 ++++++++ misc/integrations/k8s.oracle.yml | 8 ++++++++ misc/integrations/k8s.postgres.ui.yml | 8 ++++++++ misc/integrations/k8s.postgres.yml | 8 ++++++++ 9 files changed, 65 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 03b3361e81..41459690a1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,7 +11,7 @@ - [BUGFIX] `letsencrypt`: fail the `certbot-new` job when a service cannot get the certificate it asked for instead of reporting success, and write each job's output to `certbot-new.log` and `certbot-renew.log` so the Jobs and Logs pages show why. - [BUGFIX] `whitelist`: whitelisting a banned IP now lifts the block on HTTP and stream services, and manually configured `WHITELIST_*` values are honored by the default server and badbehavior checks instead of only the entries downloaded from `WHITELIST_*_URLS`. (Refs #3708) - [BUGFIX] `core`: a setting missing from a service's configuration falls back to its global value, and a setting declared by a plugin but absent from the configuration is logged once per minute at warning level instead of at error level on every request. (Refs #3746) -- [BUGFIX] `autoconf`: a Kubernetes watch that exhausts its retries now backs off and marks the container unhealthy instead of silently restarting forever while reporting healthy. (Refs #3750) +- [BUGFIX] `autoconf`: a Kubernetes watch that exhausts its retries now backs off and marks the container unhealthy instead of silently restarting forever while reporting healthy, and the Kubernetes manifests give the controller a liveness probe so it gets restarted. (Refs #3750) - [UI] Reports page: document the retention model, a rolling buffer capped per worker that is cleared on restart unless Redis is enabled. ## v1.6.14~rc1 - 2026/07/23 diff --git a/misc/integrations/k8s.mariadb.ui.yml b/misc/integrations/k8s.mariadb.ui.yml index 70c32d0f5f..98cb5d49bd 100644 --- a/misc/integrations/k8s.mariadb.ui.yml +++ b/misc/integrations/k8s.mariadb.ui.yml @@ -119,6 +119,14 @@ spec: value: "yes" - name: "DATABASE_URI" value: "mariadb+pymysql://bunkerweb:changeme@svc-bunkerweb-db:3306/db" + livenessProbe: + exec: + command: + - /usr/share/bunkerweb/helpers/healthcheck-autoconf.sh + initialDelaySeconds: 60 + periodSeconds: 10 + timeoutSeconds: 10 + failureThreshold: 6 --- apiVersion: apps/v1 kind: Deployment diff --git a/misc/integrations/k8s.mariadb.yml b/misc/integrations/k8s.mariadb.yml index c91e6b81fd..c75e63cf50 100644 --- a/misc/integrations/k8s.mariadb.yml +++ b/misc/integrations/k8s.mariadb.yml @@ -130,6 +130,14 @@ spec: value: "yes" - name: "DATABASE_URI" value: "mariadb+pymysql://bunkerweb:changeme@svc-bunkerweb-db:3306/db" + livenessProbe: + exec: + command: + - /usr/share/bunkerweb/helpers/healthcheck-autoconf.sh + initialDelaySeconds: 60 + periodSeconds: 10 + timeoutSeconds: 10 + failureThreshold: 6 --- apiVersion: apps/v1 kind: Deployment diff --git a/misc/integrations/k8s.mysql.ui.yml b/misc/integrations/k8s.mysql.ui.yml index 9cc9501f6d..d15b9a5d82 100644 --- a/misc/integrations/k8s.mysql.ui.yml +++ b/misc/integrations/k8s.mysql.ui.yml @@ -119,6 +119,14 @@ spec: value: "yes" - name: "DATABASE_URI" value: "mysql+pymysql://bunkerweb:changeme@svc-bunkerweb-db:3306/db" + livenessProbe: + exec: + command: + - /usr/share/bunkerweb/helpers/healthcheck-autoconf.sh + initialDelaySeconds: 60 + periodSeconds: 10 + timeoutSeconds: 10 + failureThreshold: 6 --- apiVersion: apps/v1 kind: Deployment diff --git a/misc/integrations/k8s.mysql.yml b/misc/integrations/k8s.mysql.yml index df00e4d8d5..ec93dd77a4 100644 --- a/misc/integrations/k8s.mysql.yml +++ b/misc/integrations/k8s.mysql.yml @@ -130,6 +130,14 @@ spec: value: "yes" - name: "DATABASE_URI" value: "mysql+pymysql://bunkerweb:changeme@svc-bunkerweb-db:3306/db" + livenessProbe: + exec: + command: + - /usr/share/bunkerweb/helpers/healthcheck-autoconf.sh + initialDelaySeconds: 60 + periodSeconds: 10 + timeoutSeconds: 10 + failureThreshold: 6 --- apiVersion: apps/v1 kind: Deployment diff --git a/misc/integrations/k8s.oracle.ui.yml b/misc/integrations/k8s.oracle.ui.yml index 56ed485e45..ebd3b5e41c 100644 --- a/misc/integrations/k8s.oracle.ui.yml +++ b/misc/integrations/k8s.oracle.ui.yml @@ -116,6 +116,14 @@ spec: value: "yes" - name: "DATABASE_URI" value: "oracle://bunkerweb:changeme@svc-bunkerweb-db:1521?service_name=FREEPDB1" + livenessProbe: + exec: + command: + - /usr/share/bunkerweb/helpers/healthcheck-autoconf.sh + initialDelaySeconds: 60 + periodSeconds: 10 + timeoutSeconds: 10 + failureThreshold: 6 --- apiVersion: apps/v1 kind: Deployment diff --git a/misc/integrations/k8s.oracle.yml b/misc/integrations/k8s.oracle.yml index deedcb1397..09906f1f7e 100644 --- a/misc/integrations/k8s.oracle.yml +++ b/misc/integrations/k8s.oracle.yml @@ -127,6 +127,14 @@ spec: value: "yes" - name: "DATABASE_URI" value: "oracle://bunkerweb:changeme@svc-bunkerweb-db:1521?service_name=FREEPDB1" + livenessProbe: + exec: + command: + - /usr/share/bunkerweb/helpers/healthcheck-autoconf.sh + initialDelaySeconds: 60 + periodSeconds: 10 + timeoutSeconds: 10 + failureThreshold: 6 --- apiVersion: apps/v1 kind: Deployment diff --git a/misc/integrations/k8s.postgres.ui.yml b/misc/integrations/k8s.postgres.ui.yml index f20c1eaa1a..8ebccf6a15 100644 --- a/misc/integrations/k8s.postgres.ui.yml +++ b/misc/integrations/k8s.postgres.ui.yml @@ -119,6 +119,14 @@ spec: value: "yes" - name: "DATABASE_URI" value: "postgresql://bunkerweb:changeme@svc-bunkerweb-db:5432/db" + livenessProbe: + exec: + command: + - /usr/share/bunkerweb/helpers/healthcheck-autoconf.sh + initialDelaySeconds: 60 + periodSeconds: 10 + timeoutSeconds: 10 + failureThreshold: 6 --- apiVersion: apps/v1 kind: Deployment diff --git a/misc/integrations/k8s.postgres.yml b/misc/integrations/k8s.postgres.yml index f976e2f276..ce563055d2 100644 --- a/misc/integrations/k8s.postgres.yml +++ b/misc/integrations/k8s.postgres.yml @@ -130,6 +130,14 @@ spec: value: "yes" - name: "DATABASE_URI" value: "postgresql://bunkerweb:changeme@svc-bunkerweb-db:5432/db" + livenessProbe: + exec: + command: + - /usr/share/bunkerweb/helpers/healthcheck-autoconf.sh + initialDelaySeconds: 60 + periodSeconds: 10 + timeoutSeconds: 10 + failureThreshold: 6 --- apiVersion: apps/v1 kind: Deployment From 881138a02938e0009f646a7e111e8b5b406805d6 Mon Sep 17 00:00:00 2001 From: TheophileDiot Date: Tue, 28 Jul 2026 09:46:01 +0200 Subject: [PATCH 20/25] [#3754] feat(crowdsec): allow running the embedded agent without the Central API --- CHANGELOG.md | 2 ++ docs/de/integrations.md | 33 +++++++++++++++++++++++++++++++-- docs/es/integrations.md | 33 +++++++++++++++++++++++++++++++-- docs/fr/integrations.md | 33 +++++++++++++++++++++++++++++++-- docs/integrations.md | 33 +++++++++++++++++++++++++++++++-- docs/zh/integrations.md | 33 +++++++++++++++++++++++++++++++-- src/all-in-one/entrypoint.sh | 10 +++++++++- src/common/gen/Configurator.py | 1 + 8 files changed, 167 insertions(+), 11 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 41459690a1..d8886b9251 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,8 @@ - [BUGFIX] `whitelist`: whitelisting a banned IP now lifts the block on HTTP and stream services, and manually configured `WHITELIST_*` values are honored by the default server and badbehavior checks instead of only the entries downloaded from `WHITELIST_*_URLS`. (Refs #3708) - [BUGFIX] `core`: a setting missing from a service's configuration falls back to its global value, and a setting declared by a plugin but absent from the configuration is logged once per minute at warning level instead of at error level on every request. (Refs #3746) - [BUGFIX] `autoconf`: a Kubernetes watch that exhausts its retries now backs off and marks the container unhealthy instead of silently restarting forever while reporting healthy, and the Kubernetes manifests give the controller a liveness probe so it gets restarted. (Refs #3750) +- [FEATURE] `all-in-one`: add `DISABLE_ONLINE_API`, same name as the official CrowdSec images, to run CrowdSec without registering to the Central API. (Refs #3754) +- [DOCS] `all-in-one`: document what CrowdSec Central API registration transmits, and correct the parser opt-out variable to `CROWDSEC_DISABLE_PARSERS`. - [UI] Reports page: document the retention model, a rolling buffer capped per worker that is cleared on restart unless Redis is enabled. ## v1.6.14~rc1 - 2026/07/23 diff --git a/docs/de/integrations.md b/docs/de/integrations.md index ea371d2ddd..f5899c23f4 100644 --- a/docs/de/integrations.md +++ b/docs/de/integrations.md @@ -1454,6 +1454,10 @@ docker run -d \ 2. Standard-Sammlungen und -Parser **installieren oder aktualisieren**. 3. Den Bouncer `crowdsec-bunkerweb-bouncer/v1.6` **konfigurieren**. +!!! warning "Die Registrierung meldet Ihre Instanz bei der CrowdSec Central API an" + + Schritt 1 registriert den Agenten bei der Central API (CAPI) von CrowdSec, und das ist ein Austausch in beide Richtungen. Ihre Instanz **erhält** die Community-Blocklist und **sendet** ein Signal für jede Alarmmeldung, die von einem unveränderten Hub-Szenario ausgelöst wird: Name, Hash und Version des Szenarios, Zeitstempel der Entscheidung, eine Maschinenkennung sowie die auffällige IP-Adresse samt Geolokalisierungsdaten, sofern verfügbar. Eigene Szenarien, geänderte Szenarien und manuelle Entscheidungen werden nicht übertragen. Siehe [Central API deaktivieren](#central-api-deaktivieren) für einen rein lokalen Betrieb. + --- #### Standard-Sammlungen & Parser @@ -1511,14 +1515,14 @@ docker run -d \ #### Deaktivieren bestimmter Parser -Wenn Sie die Standardeinrichtung beibehalten, aber einen oder mehrere Parser explizit deaktivieren möchten, geben Sie eine durch Leerzeichen getrennte Liste über `CROWDSEC_DISABLED_PARSERS` an: +Wenn Sie die Standardeinrichtung beibehalten, aber einen oder mehrere Parser explizit deaktivieren möchten, geben Sie eine durch Leerzeichen getrennte Liste über `CROWDSEC_DISABLE_PARSERS` an: ```bash docker run -d \ --name bunkerweb-aio \ -v bw-storage:/data \ -e USE_CROWDSEC=yes \ - -e CROWDSEC_DISABLED_PARSERS="crowdsecurity/geoip-enrich foo/bar-parser" \ + -e CROWDSEC_DISABLE_PARSERS="crowdsecurity/geoip-enrich foo/bar-parser" \ -p 80:8080/tcp \ -p 443:8443/tcp \ -p 443:8443/udp \ @@ -1531,6 +1535,31 @@ Hinweise: --- +#### Central API deaktivieren + +Um CrowdSec vollständig lokal zu betreiben, ohne Registrierung und ohne Datenverkehr zu den Servern von CrowdSec, setzen Sie `DISABLE_ONLINE_API` auf `true`: + +```bash +docker run -d \ + --name bunkerweb-aio \ + -v bw-storage:/data \ + -e USE_CROWDSEC=yes \ + -e DISABLE_ONLINE_API=true \ + -p 80:8080/tcp \ + -p 443:8443/tcp \ + -p 443:8443/udp \ + bunkerity/bunkerweb-all-in-one:1.6.14-rc1 +``` + +Es ist derselbe Variablenname wie in den offiziellen CrowdSec-Images, eine bestehende Konfiguration lässt sich also übernehmen. + +Hinweise: +- Ihre Instanz **sendet** keine Angriffssignale mehr und **erhält** keine Community-Blocklist mehr. Lokale Erkennung und Abwehr bleiben unverändert: Die installierten Szenarien laufen weiter und sperren weiterhin. +- Die Einstellung wird bei jedem Start gelesen, Sie können sie also später wieder aktivieren. War die Instanz bereits registriert, werden die gespeicherten Zugangsdaten beim Deaktivieren entfernt, und beim erneuten Aktivieren wird neu registriert. +- Gilt nur, wenn CrowdSec im Container läuft. Zeigt `CROWDSEC_API` auf eine entfernte Instanz, zählt deren Central-API-Einstellung. + +--- + #### AppSec-Umschalter CrowdSec [AppSec](https://docs.crowdsec.net/docs/appsec/intro/?utm_source=external-docs&utm_medium=cta&utm_campaign=bunker-web-docs)-Funktionen – angetrieben durch die Sammlungen `appsec-virtual-patching` und `appsec-generic-rules` – sind **standardmäßig aktiviert**. diff --git a/docs/es/integrations.md b/docs/es/integrations.md index 9b06c485d1..cba22abb06 100644 --- a/docs/es/integrations.md +++ b/docs/es/integrations.md @@ -1455,6 +1455,10 @@ docker run -d \ 2. **Instalará o actualizará** las colecciones y analizadores predeterminados. 3. **Configurará** el bouncer `crowdsec-bunkerweb-bouncer/v1.6`. +!!! warning "El registro inscribe su instancia en la API central de CrowdSec" + + El paso 1 registra el agente en la API central (CAPI) de CrowdSec, y es un intercambio en ambos sentidos. Su instancia **recibe** la lista de bloqueo comunitaria y **envía** una señal por cada alerta generada por un escenario del hub sin modificar: el nombre del escenario, su hash y versión, la marca de tiempo de la decisión, un identificador de máquina y la dirección IP infractora con datos de geolocalización cuando están disponibles. Los escenarios personalizados, los escenarios modificados y las decisiones manuales no se envían. Consulte [Desactivar la API central](#desactivar-la-api-central) si desea una instalación puramente local. + --- #### Colecciones y Analizadores Predeterminados @@ -1512,14 +1516,14 @@ docker run -d \ #### Deshabilitar Analizadores Específicos -Si quieres mantener la configuración predeterminada pero deshabilitar explícitamente uno o más analizadores, proporciona una lista separada por espacios a través de `CROWDSEC_DISABLED_PARSERS`: +Si quieres mantener la configuración predeterminada pero deshabilitar explícitamente uno o más analizadores, proporciona una lista separada por espacios a través de `CROWDSEC_DISABLE_PARSERS`: ```bash docker run -d \ --name bunkerweb-aio \ -v bw-storage:/data \ -e USE_CROWDSEC=yes \ - -e CROWDSEC_DISABLED_PARSERS="crowdsecurity/geoip-enrich foo/bar-parser" \ + -e CROWDSEC_DISABLE_PARSERS="crowdsecurity/geoip-enrich foo/bar-parser" \ -p 80:8080/tcp \ -p 443:8443/tcp \ -p 443:8443/udp \ @@ -1532,6 +1536,31 @@ Notas: --- +#### Desactivar la API central + +Para ejecutar CrowdSec de forma totalmente local, sin registro y sin tráfico hacia los servidores de CrowdSec, establezca `DISABLE_ONLINE_API` en `true`: + +```bash +docker run -d \ + --name bunkerweb-aio \ + -v bw-storage:/data \ + -e USE_CROWDSEC=yes \ + -e DISABLE_ONLINE_API=true \ + -p 80:8080/tcp \ + -p 443:8443/tcp \ + -p 443:8443/udp \ + bunkerity/bunkerweb-all-in-one:1.6.14-rc1 +``` + +Es el mismo nombre de variable que usan las imágenes oficiales de CrowdSec, por lo que una configuración existente sigue siendo válida. + +Notas: +- Su instancia deja de **enviar** señales de ataque y de **recibir** la lista de bloqueo comunitaria. La detección y la remediación locales no cambian: los escenarios instalados siguen ejecutándose y baneando. +- El ajuste se lee en cada arranque, así que puede volver a activarlo más adelante. Si la instancia ya estaba registrada, las credenciales almacenadas se eliminan al desactivarlo, y se realiza un nuevo registro si lo vuelve a activar. +- Solo se aplica cuando CrowdSec se ejecuta dentro del contenedor. Si `CROWDSEC_API` apunta a una instancia remota, lo que cuenta es el ajuste de esa instancia. + +--- + #### Conmutador de AppSec Las características de [AppSec](https://docs.crowdsec.net/docs/appsec/intro/?utm_source=external-docs&utm_medium=cta&utm_campaign=bunker-web-docs) de CrowdSec —impulsadas por las colecciones `appsec-virtual-patching` y `appsec-generic-rules`— están **habilitadas por defecto**. diff --git a/docs/fr/integrations.md b/docs/fr/integrations.md index 9a43ea8599..3fe42c5892 100644 --- a/docs/fr/integrations.md +++ b/docs/fr/integrations.md @@ -1462,6 +1462,10 @@ docker run -d \ 2. **Installez ou mettez à niveau** les collections et les analyseurs par défaut. 3. **Configurez** le `crowdsec-bunkerweb-bouncer/v1.6` videur. +!!! warning "L'enregistrement inscrit votre instance auprès de l'API centrale de CrowdSec" + + L'étape 1 enregistre l'agent auprès de l'API centrale (CAPI) de CrowdSec, et il s'agit d'un échange bidirectionnel. Votre instance **reçoit** la liste de blocage communautaire, et elle **envoie** un signal pour chaque alerte déclenchée par un scénario du hub non modifié : le nom du scénario, son hash et sa version, l'horodatage de la décision, un identifiant de machine, ainsi que l'adresse IP fautive avec ses données de géolocalisation lorsqu'elles sont disponibles. Les scénarios personnalisés, les scénarios modifiés et les décisions manuelles ne sont pas transmis. Voir [Désactiver l'API centrale](#desactiver-lapi-centrale) pour une installation purement locale. + --- #### Collections et analyseurs par défaut @@ -1518,14 +1522,14 @@ docker run -d \ #### Désactiver des analyseurs spécifiques -Si vous souhaitez conserver la configuration par défaut tout en désactivant explicitement un ou plusieurs analyseurs, fournissez une liste séparée par des espaces via `CROWDSEC_DISABLED_PARSERS` : +Si vous souhaitez conserver la configuration par défaut tout en désactivant explicitement un ou plusieurs analyseurs, fournissez une liste séparée par des espaces via `CROWDSEC_DISABLE_PARSERS` : ```bash docker run -d \ --name bunkerweb-aio \ -v bw-storage:/data \ -e USE_CROWDSEC=yes \ - -e CROWDSEC_DISABLED_PARSERS="crowdsecurity/geoip-enrich foo/bar-parser" \ + -e CROWDSEC_DISABLE_PARSERS="crowdsecurity/geoip-enrich foo/bar-parser" \ -p 80:8080/tcp \ -p 443:8443/tcp \ -p 443:8443/udp \ @@ -1538,6 +1542,31 @@ Notes : --- +#### Désactiver l'API centrale + +Pour faire fonctionner CrowdSec entièrement en local, sans enregistrement ni trafic vers les serveurs de CrowdSec, définissez `DISABLE_ONLINE_API` à `true` : + +```bash +docker run -d \ + --name bunkerweb-aio \ + -v bw-storage:/data \ + -e USE_CROWDSEC=yes \ + -e DISABLE_ONLINE_API=true \ + -p 80:8080/tcp \ + -p 443:8443/tcp \ + -p 443:8443/udp \ + bunkerity/bunkerweb-all-in-one:1.6.14-rc1 +``` + +Il s'agit du même nom de variable que celui utilisé par les images officielles CrowdSec, une configuration existante reste donc valable. + +Notes : +- Votre instance cesse d'**envoyer** des signaux d'attaque et de **recevoir** la liste de blocage communautaire. La détection et la remédiation locales ne changent pas : les scénarios installés continuent de tourner et de bannir. +- Le réglage est lu à chaque démarrage, vous pouvez donc le réactiver plus tard. Si l'instance était déjà enregistrée, les identifiants stockés sont supprimés lors de la désactivation, et un nouvel enregistrement est effectué si vous la réactivez. +- Ne s'applique que si CrowdSec tourne dans le conteneur. Si `CROWDSEC_API` pointe vers une instance distante, c'est le réglage de cette instance qui compte. + +--- + #### Basculement AppSec Les fonctionnalités [CrowdSec AppSec](https://docs.crowdsec.net/docs/appsec/intro/?utm_source=external-docs&utm_medium=cta&utm_campaign=bunker-web-docs), optimisées par les collections `appsec-virtual-patching` et `appsec-generic-rules` , sont **activées par défaut**. diff --git a/docs/integrations.md b/docs/integrations.md index 00124a4c71..37eafe9696 100644 --- a/docs/integrations.md +++ b/docs/integrations.md @@ -1467,6 +1467,10 @@ docker run -d \ 2. **Install or upgrade** default collections & parsers. 3. **Configure** the `crowdsec-bunkerweb-bouncer/v1.6` bouncer. +!!! warning "Registration enrolls your instance with the CrowdSec Central API" + + Step 1 registers the agent with CrowdSec's Central API (CAPI), which is a two-way exchange. Your instance **receives** the community blocklist, and it **sends** a signal for every alert raised by an unmodified hub scenario: the scenario name, hash and version, the decision timestamp, a machine identifier, and the offending IP address with geolocation data where available. Custom scenarios, modified scenarios, and manual decisions are not sent. See [Disable the Central API](#disable-the-central-api) if you want a local-only setup. + --- #### Default Collections & Parsers @@ -1524,14 +1528,14 @@ docker run -d \ #### Disable Specific Parsers -If you want to keep the default setup but explicitly disable one or more parsers, provide a space-separated list via `CROWDSEC_DISABLED_PARSERS`: +If you want to keep the default setup but explicitly disable one or more parsers, provide a space-separated list via `CROWDSEC_DISABLE_PARSERS`: ```bash docker run -d \ --name bunkerweb-aio \ -v bw-storage:/data \ -e USE_CROWDSEC=yes \ - -e CROWDSEC_DISABLED_PARSERS="crowdsecurity/geoip-enrich foo/bar-parser" \ + -e CROWDSEC_DISABLE_PARSERS="crowdsecurity/geoip-enrich foo/bar-parser" \ -p 80:8080/tcp \ -p 443:8443/tcp \ -p 443:8443/udp \ @@ -1544,6 +1548,31 @@ Notes: --- +#### Disable the Central API + +To run CrowdSec entirely locally, with no registration and no traffic to CrowdSec's servers, set `DISABLE_ONLINE_API` to `true`: + +```bash +docker run -d \ + --name bunkerweb-aio \ + -v bw-storage:/data \ + -e USE_CROWDSEC=yes \ + -e DISABLE_ONLINE_API=true \ + -p 80:8080/tcp \ + -p 443:8443/tcp \ + -p 443:8443/udp \ + bunkerity/bunkerweb-all-in-one:1.6.14-rc1 +``` + +This is the same variable name used by the official CrowdSec images, so an existing configuration carries over. + +Notes: +- Your instance stops **sending** attack signals and stops **receiving** the community blocklist. Local detection and remediation are unaffected: the scenarios you have installed keep running and keep banning. +- The setting is read on every start, so you can turn it back on later. If the instance was already registered, the stored credentials are removed when you disable it, and a fresh registration is performed if you re-enable it. +- Only applies when CrowdSec runs inside the container. If `CROWDSEC_API` points at a remote instance, the Central API setting of that instance is what counts. + +--- + #### AppSec Toggle CrowdSec [AppSec](https://docs.crowdsec.net/docs/appsec/intro/?utm_source=external-docs&utm_medium=cta&utm_campaign=bunker-web-docs) features—powered by the `appsec-virtual-patching` and `appsec-generic-rules` collections—are **enabled by default**. diff --git a/docs/zh/integrations.md b/docs/zh/integrations.md index c778982045..2f937a9eb6 100644 --- a/docs/zh/integrations.md +++ b/docs/zh/integrations.md @@ -1455,6 +1455,10 @@ docker run -d \ 2. **安装或升级**默认的集合和解析器。 3. **配置** `crowdsec-bunkerweb-bouncer/v1.6` 拦截器。 +!!! warning "注册会将您的实例接入 CrowdSec 中央 API" + + 第 1 步会将代理注册到 CrowdSec 的中央 API(CAPI),这是一个双向交换。您的实例会**接收**社区封禁列表,同时会为每一条由未修改的 Hub 场景触发的告警**发送**信号:场景名称、哈希与版本、决策时间戳、机器标识,以及攻击者 IP 地址和可用时的地理位置数据。自定义场景、被修改的场景和手动决策不会被发送。如需纯本地部署,请参阅[禁用中央 API](#禁用中央-api)。 + --- #### 默认集合和解析器 @@ -1512,14 +1516,14 @@ docker run -d \ #### 禁用特定解析器 -如果您想保留默认设置但明确禁用一个或多个解析器,请通过 `CROWDSEC_DISABLED_PARSERS` 提供一个以空格分隔的列表: +如果您想保留默认设置但明确禁用一个或多个解析器,请通过 `CROWDSEC_DISABLE_PARSERS` 提供一个以空格分隔的列表: ```bash docker run -d \ --name bunkerweb-aio \ -v bw-storage:/data \ -e USE_CROWDSEC=yes \ - -e CROWDSEC_DISABLED_PARSERS="crowdsecurity/geoip-enrich foo/bar-parser" \ + -e CROWDSEC_DISABLE_PARSERS="crowdsecurity/geoip-enrich foo/bar-parser" \ -p 80:8080/tcp \ -p 443:8443/tcp \ -p 443:8443/udp \ @@ -1532,6 +1536,31 @@ docker run -d \ --- +#### 禁用中央 API + +若要让 CrowdSec 完全在本地运行,不进行注册、也不与 CrowdSec 服务器通信,请将 `DISABLE_ONLINE_API` 设为 `true`: + +```bash +docker run -d \ + --name bunkerweb-aio \ + -v bw-storage:/data \ + -e USE_CROWDSEC=yes \ + -e DISABLE_ONLINE_API=true \ + -p 80:8080/tcp \ + -p 443:8443/tcp \ + -p 443:8443/udp \ + bunkerity/bunkerweb-all-in-one:1.6.14-rc1 +``` + +这与 CrowdSec 官方镜像使用的变量名相同,现有配置可以直接沿用。 + +注意事项: +- 您的实例将停止**发送**攻击信号,也不再**接收**社区封禁列表。本地检测与处置不受影响:已安装的场景照常运行并继续封禁。 +- 该设置在每次启动时读取,因此之后可以重新启用。如果实例此前已注册,禁用时会删除已存储的凭据,重新启用时会再次注册。 +- 仅在 CrowdSec 于容器内运行时生效。若 `CROWDSEC_API` 指向远程实例,则以该实例的中央 API 设置为准。 + +--- + #### AppSec 开关 CrowdSec [AppSec](https://docs.crowdsec.net/docs/appsec/intro/?utm_source=external-docs&utm_medium=cta&utm_campaign=bunker-web-docs) 功能——由 `appsec-virtual-patching` 和 `appsec-generic-rules` 集合提供支持——**默认启用**。 diff --git a/src/all-in-one/entrypoint.sh b/src/all-in-one/entrypoint.sh index 9e820ef380..fe02928a13 100644 --- a/src/all-in-one/entrypoint.sh +++ b/src/all-in-one/entrypoint.sh @@ -275,7 +275,15 @@ if [ "${USE_CROWDSEC}" = "yes" ] && [[ "${CROWDSEC_API:-http://127.0.0.1:8000}" cscli hub update log "ENTRYPOINT" "ℹ️" "[CROWDSEC] Updated CrowdSec hub." - if [ ! -s /var/lib/crowdsec/online_api_credentials.yaml ]; then + # Same name as the official CrowdSec images, which drop the online_client block rather + # than emptying the credentials file. + if [[ "${DISABLE_ONLINE_API,,}" == "true" || "${DISABLE_ONLINE_API,,}" == "yes" ]]; then + if grep -q "^ online_client:$" /etc/crowdsec/config.yaml; then + sed -i '/^ online_client:$/,+1d' /etc/crowdsec/config.yaml + fi + rm -f /var/lib/crowdsec/online_api_credentials.yaml + log "ENTRYPOINT" "ℹ️" "[CROWDSEC] Central API disabled, skipping registration. No signal will be sent to CrowdSec and no community blocklist will be pulled." + elif [ ! -s /var/lib/crowdsec/online_api_credentials.yaml ]; then log "ENTRYPOINT" "ℹ️" "[CROWDSEC] No Central API credentials found. Registering machine..." cscli capi register log "ENTRYPOINT" "✅" "[CROWDSEC] Machine registered successfully." diff --git a/src/common/gen/Configurator.py b/src/common/gen/Configurator.py index 616b8c22d2..3106e18019 100644 --- a/src/common/gen/Configurator.py +++ b/src/common/gen/Configurator.py @@ -83,6 +83,7 @@ def __init__( "IGNORE_REGEX_CHECK", "CROWDSEC_DISABLE_PARSERS", "CROWDSEC_EXTRA_COLLECTIONS", + "DISABLE_ONLINE_API", "HIDE_SERVICE_LOGS", "LOG_TYPES", "LOG_FILE_PATH", From e8fb3a6fae091aaf3da6354b1be877b1e6a5bb5a Mon Sep 17 00:00:00 2001 From: TheophileDiot Date: Tue, 28 Jul 2026 09:55:20 +0200 Subject: [PATCH 21/25] [#3754] fix(crowdsec): restore the online_client block when DISABLE_ONLINE_API goes away --- src/all-in-one/entrypoint.sh | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/src/all-in-one/entrypoint.sh b/src/all-in-one/entrypoint.sh index fe02928a13..a5ec8e2478 100644 --- a/src/all-in-one/entrypoint.sh +++ b/src/all-in-one/entrypoint.sh @@ -278,15 +278,23 @@ if [ "${USE_CROWDSEC}" = "yes" ] && [[ "${CROWDSEC_API:-http://127.0.0.1:8000}" # Same name as the official CrowdSec images, which drop the online_client block rather # than emptying the credentials file. if [[ "${DISABLE_ONLINE_API,,}" == "true" || "${DISABLE_ONLINE_API,,}" == "yes" ]]; then - if grep -q "^ online_client:$" /etc/crowdsec/config.yaml; then + if [ ! -f /etc/crowdsec/config.yaml.capi ]; then + cp /etc/crowdsec/config.yaml /etc/crowdsec/config.yaml.capi sed -i '/^ online_client:$/,+1d' /etc/crowdsec/config.yaml fi rm -f /var/lib/crowdsec/online_api_credentials.yaml log "ENTRYPOINT" "ℹ️" "[CROWDSEC] Central API disabled, skipping registration. No signal will be sent to CrowdSec and no community blocklist will be pulled." - elif [ ! -s /var/lib/crowdsec/online_api_credentials.yaml ]; then - log "ENTRYPOINT" "ℹ️" "[CROWDSEC] No Central API credentials found. Registering machine..." - cscli capi register - log "ENTRYPOINT" "✅" "[CROWDSEC] Machine registered successfully." + else + # /etc/crowdsec survives a restart, so put the block back if a previous run removed it. + if [ -f /etc/crowdsec/config.yaml.capi ]; then + mv /etc/crowdsec/config.yaml.capi /etc/crowdsec/config.yaml + log "ENTRYPOINT" "ℹ️" "[CROWDSEC] Central API re-enabled, restored the previous configuration." + fi + if [ ! -s /var/lib/crowdsec/online_api_credentials.yaml ]; then + log "ENTRYPOINT" "ℹ️" "[CROWDSEC] No Central API credentials found. Registering machine..." + cscli capi register + log "ENTRYPOINT" "✅" "[CROWDSEC] Machine registered successfully." + fi fi if [ ! -f /var/lib/crowdsec/local_api_credentials.yaml ] || ! grep -q "login" /var/lib/crowdsec/local_api_credentials.yaml; then From 26d95ce4fb0d9675b1fef3f61e00de154af778d1 Mon Sep 17 00:00:00 2001 From: TheophileDiot Date: Tue, 28 Jul 2026 10:56:58 +0200 Subject: [PATCH 22/25] fix(ui): tell the user when a lost session discards their submitted change --- CHANGELOG.md | 1 + src/ui/app/routes/login.py | 10 ++++++++++ src/ui/app/templates/login.html | 3 +++ src/ui/main.py | 6 ++++++ 4 files changed, 20 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index d8886b9251..efacbbd05a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,6 +14,7 @@ - [BUGFIX] `autoconf`: a Kubernetes watch that exhausts its retries now backs off and marks the container unhealthy instead of silently restarting forever while reporting healthy, and the Kubernetes manifests give the controller a liveness probe so it gets restarted. (Refs #3750) - [FEATURE] `all-in-one`: add `DISABLE_ONLINE_API`, same name as the official CrowdSec images, to run CrowdSec without registering to the Central API. (Refs #3754) - [DOCS] `all-in-one`: document what CrowdSec Central API registration transmits, and correct the parser opt-out variable to `CROWDSEC_DISABLE_PARSERS`. +- [BUGFIX] `ui`: a form submitted after the session ended now reports that the change was not saved, instead of redirecting to the login page and redrawing the old values as if nothing had happened. (Refs #3751, #3752) - [UI] Reports page: document the retention model, a rolling buffer capped per worker that is cleared on restart unless Redis is enabled. ## v1.6.14~rc1 - 2026/07/23 diff --git a/src/ui/app/routes/login.py b/src/ui/app/routes/login.py index ed6ca85b3a..241e32f174 100644 --- a/src/ui/app/routes/login.py +++ b/src/ui/app/routes/login.py @@ -10,6 +10,11 @@ login = Blueprint("login", __name__) +# Reasons the app can redirect here with, mapped to what the user is told. +LOGIN_NOTICES = { + "session_expired": "Your session ended before your change could be saved, so nothing was changed. Log in and try again.", +} + @login.route("/login", methods=["GET", "POST"]) def login_page(): @@ -113,4 +118,9 @@ def login_page(): "is_totp": bool(current_user.totp_secret), } | ({"error": "Invalid username or password"} if fail else {}) + # Looked up, never echoed: whatever is in the query string must not reach the page. + notice = LOGIN_NOTICES.get(request.args.get("reason", "")) + if notice: + kwargs["notice"] = notice + return render_template("login.html", **kwargs), 401 if fail else 200 diff --git a/src/ui/app/templates/login.html b/src/ui/app/templates/login.html index 9990508226..3b665d9372 100644 --- a/src/ui/app/templates/login.html +++ b/src/ui/app/templates/login.html @@ -55,6 +55,9 @@
+ {% if notice %} + + {% endif %}
Date: Tue, 28 Jul 2026 16:26:24 +0200 Subject: [PATCH 23/25] crowdsec: initialize bouncer for service-level activation - Fix CrowdSec checks when globally disabled but enabled per service - Document the nil bouncer error and previously unchecked requests --- CHANGELOG.md | 1 + src/common/core/crowdsec/crowdsec.lua | 24 +++++++++++++++++++++--- 2 files changed, 22 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index efacbbd05a..130de6e537 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,7 @@ - [BUGFIX] `whitelist`: whitelisting a banned IP now lifts the block on HTTP and stream services, and manually configured `WHITELIST_*` values are honored by the default server and badbehavior checks instead of only the entries downloaded from `WHITELIST_*_URLS`. (Refs #3708) - [BUGFIX] `core`: a setting missing from a service's configuration falls back to its global value, and a setting declared by a plugin but absent from the configuration is logged once per minute at warning level instead of at error level on every request. (Refs #3746) - [BUGFIX] `autoconf`: a Kubernetes watch that exhausts its retries now backs off and marks the container unhealthy instead of silently restarting forever while reporting healthy, and the Kubernetes manifests give the controller a liveness probe so it gets restarted. (Refs #3750) +- [BUGFIX] `crowdsec`: enabling CrowdSec on individual services while it stays off globally now works. The bouncer was never initialized in that configuration, so every request logged `attempt to index field 'conf' (a nil value)` and was let through unchecked. - [FEATURE] `all-in-one`: add `DISABLE_ONLINE_API`, same name as the official CrowdSec images, to run CrowdSec without registering to the Central API. (Refs #3754) - [DOCS] `all-in-one`: document what CrowdSec Central API registration transmits, and correct the parser opt-out variable to `CROWDSEC_DISABLE_PARSERS`. - [BUGFIX] `ui`: a form submitted after the session ended now reports that the change was not saved, instead of redirecting to the login page and redrawing the old values as if nothing had happened. (Refs #3751, #3752) diff --git a/src/common/core/crowdsec/crowdsec.lua b/src/common/core/crowdsec/crowdsec.lua index b9d4522651..93c2393607 100644 --- a/src/common/core/crowdsec/crowdsec.lua +++ b/src/common/core/crowdsec/crowdsec.lua @@ -9,6 +9,7 @@ local ngx = ngx local ERR = ngx.ERR local HTTP_INTERNAL_SERVER_ERROR = ngx.HTTP_INTERNAL_SERVER_ERROR local HTTP_OK = ngx.HTTP_OK +local has_variable = utils.has_variable local get_deny_status = utils.get_deny_status local cs_init = cs.init local cs_allow = cs.Allow @@ -18,9 +19,26 @@ function crowdsec:initialize(ctx) plugin.initialize(self, "crowdsec", ctx) end +function crowdsec:is_needed() + -- Loading case + if self.is_loading then + return false + end + -- Request phases (no default) + if self.is_request and (self.ctx.bw.server_name ~= "_") then + return self.variables["USE_CROWDSEC"] == "yes" + end + -- Other cases : at least one service uses it + local is_needed, err = has_variable("USE_CROWDSEC", "yes") + if is_needed == nil then + self.logger:log(ERR, "can't check USE_CROWDSEC variable : " .. err) + end + return is_needed +end + function crowdsec:init() -- Check if init is needed - if self.variables["USE_CROWDSEC"] ~= "yes" or self.is_loading then + if not self:is_needed() then return self:ret(true, "init not needed") end -- Init CS @@ -34,7 +52,7 @@ end function crowdsec:access() -- Check if CS is activated - if self.variables["USE_CROWDSEC"] ~= "yes" then + if not self:is_needed() then return self:ret(true, "CrowdSec plugin not enabled") end -- Do the check @@ -52,7 +70,7 @@ end function crowdsec:api() if self.ctx.bw.uri == "/crowdsec/ping" and self.ctx.bw.request_method == "POST" then -- Check crowdsec connection - if self.variables["USE_CROWDSEC"] ~= "yes" then + if not self:is_needed() then return self:ret(true, "CrowdSec plugin is not enabled", HTTP_OK) end From 35087d958ce600cdec77ff09e8a30f7fbbed5711 Mon Sep 17 00:00:00 2001 From: TheophileDiot Date: Tue, 28 Jul 2026 16:53:35 +0200 Subject: [PATCH 24/25] Road to 1.6.14~rc2 --- .github/ISSUE_TEMPLATE/bug_report.yml | 2 +- README.md | 86 +++++++------- docs/advanced.md | 110 ++++++++--------- docs/api.md | 8 +- docs/concepts.md | 4 +- docs/de/advanced.md | 110 ++++++++--------- docs/de/api.md | 8 +- docs/de/concepts.md | 4 +- docs/de/features.md | 4 +- docs/de/integrations.md | 112 +++++++++--------- docs/de/plugins.md | 14 +-- docs/de/quickstart-guide.md | 34 +++--- docs/de/upgrading.md | 42 +++---- docs/de/web-ui.md | 8 +- docs/es/advanced.md | 110 ++++++++--------- docs/es/api.md | 8 +- docs/es/concepts.md | 4 +- docs/es/features.md | 4 +- docs/es/integrations.md | 112 +++++++++--------- docs/es/plugins.md | 12 +- docs/es/quickstart-guide.md | 34 +++--- docs/es/upgrading.md | 42 +++---- docs/es/web-ui.md | 8 +- docs/features.md | 4 +- docs/fr/advanced.md | 110 ++++++++--------- docs/fr/api.md | 8 +- docs/fr/concepts.md | 4 +- docs/fr/features.md | 4 +- docs/fr/integrations.md | 112 +++++++++--------- docs/fr/plugins.md | 12 +- docs/fr/quickstart-guide.md | 34 +++--- docs/fr/upgrading.md | 42 +++---- docs/fr/web-ui.md | 8 +- docs/integrations.md | 112 +++++++++--------- docs/plugins.md | 12 +- docs/quickstart-guide.md | 34 +++--- docs/upgrading.md | 42 +++---- docs/web-ui.md | 6 +- docs/zh/advanced.md | 110 ++++++++--------- docs/zh/api.md | 8 +- docs/zh/concepts.md | 4 +- docs/zh/features.md | 4 +- docs/zh/integrations.md | 112 +++++++++--------- docs/zh/plugins.md | 12 +- docs/zh/quickstart-guide.md | 34 +++--- docs/zh/upgrading.md | 42 +++---- docs/zh/web-ui.md | 8 +- examples/authelia/docker-compose.yml | 4 +- examples/authentik/docker-compose.yml | 4 +- .../behind-reverse-proxy/docker-compose.yml | 4 +- examples/bigbluebutton/docker-compose.yml | 4 +- examples/cors/docker-compose.yml | 4 +- examples/dns-cloudflare/docker-compose.yml | 4 +- examples/dns-desec/docker-compose.yml | 4 +- examples/dns-digitalocean/docker-compose.yml | 4 +- examples/dns-dnsimple/docker-compose.yml | 4 +- examples/dns-dnsmadeeasy/docker-compose.yml | 4 +- examples/dns-gehirn/docker-compose.yml | 4 +- examples/dns-google/docker-compose.yml | 4 +- examples/dns-linode/docker-compose.yml | 4 +- examples/dns-luadns/docker-compose.yml | 4 +- examples/dns-nsone/docker-compose.yml | 4 +- examples/dns-ovh/docker-compose.yml | 4 +- examples/dns-rfc2136/docker-compose.yml | 4 +- examples/dns-route53/docker-compose.yml | 4 +- examples/dns-sakuracloud/docker-compose.yml | 4 +- examples/dns-scaleway/docker-compose.yml | 4 +- examples/docker-configs/docker-compose.yml | 4 +- examples/drupal/docker-compose.yml | 4 +- examples/ghost/docker-compose.yml | 4 +- examples/gogs/docker-compose.yml | 4 +- examples/hardened/docker-compose.yml | 4 +- examples/jellyfin/docker-compose.yml | 4 +- examples/joomla/docker-compose.yml | 4 +- examples/load-balancer/docker-compose.yml | 4 +- examples/magento/docker-compose.yml | 4 +- examples/mattermost/docker-compose.yml | 4 +- examples/mcp-stack/docker-compose.yml | 6 +- examples/mongo-express/docker-compose.yml | 4 +- examples/moodle/docker-compose.yml | 4 +- examples/nextcloud/docker-compose.yml | 4 +- examples/passbolt/docker-compose.yml | 4 +- examples/php-cookie-flags/docker-compose.yml | 4 +- examples/php-multisite/docker-compose.yml | 4 +- examples/php-singlesite/docker-compose.yml | 4 +- examples/prestashop/docker-compose.yml | 4 +- examples/proxy-protocol/docker-compose.yml | 4 +- examples/radarr/docker-compose.yml | 4 +- examples/redmine/docker-compose.yml | 4 +- .../docker-compose.yml | 4 +- .../docker-compose.yml | 4 +- .../docker-compose.yml | 4 +- examples/stream-multisite/docker-compose.yml | 4 +- examples/syslog/docker-compose.yml | 4 +- examples/tomcat/docker-compose.yml | 4 +- .../tor-hidden-service/docker-compose.yml | 4 +- examples/web-ui/docker-compose.wizard.yml | 6 +- examples/web-ui/docker-compose.yml | 6 +- examples/wordpress/docker-compose.yml | 4 +- misc/install-bunkerweb.sh | 2 +- misc/integrations/all-in-one.mariadb.ui.yml | 2 +- misc/integrations/all-in-one.mariadb.yml | 2 +- misc/integrations/all-in-one.mysql.ui.yml | 2 +- misc/integrations/all-in-one.mysql.yml | 2 +- misc/integrations/all-in-one.oracle.ui.yml | 2 +- misc/integrations/all-in-one.oracle.yml | 2 +- misc/integrations/all-in-one.postgres.ui.yml | 2 +- misc/integrations/all-in-one.postgres.yml | 2 +- misc/integrations/all-in-one.yml | 2 +- misc/integrations/autoconf.mariadb.ui.yml | 8 +- misc/integrations/autoconf.mariadb.yml | 6 +- misc/integrations/autoconf.mysql.ui.yml | 8 +- misc/integrations/autoconf.mysql.yml | 6 +- misc/integrations/autoconf.oracle.ui.yml | 8 +- misc/integrations/autoconf.oracle.yml | 6 +- misc/integrations/autoconf.postgres.ui.yml | 8 +- misc/integrations/autoconf.postgres.yml | 6 +- misc/integrations/docker.mariadb.ui.yml | 6 +- misc/integrations/docker.mariadb.yml | 4 +- misc/integrations/docker.mysql.ui.yml | 6 +- misc/integrations/docker.mysql.yml | 4 +- misc/integrations/docker.oracle.ui.yml | 6 +- misc/integrations/docker.oracle.yml | 4 +- misc/integrations/docker.postgres.ui.yml | 6 +- misc/integrations/docker.postgres.yml | 4 +- misc/integrations/docker.yml | 4 +- misc/integrations/k8s.mariadb.ui.yml | 8 +- misc/integrations/k8s.mariadb.yml | 6 +- misc/integrations/k8s.mysql.ui.yml | 8 +- misc/integrations/k8s.mysql.yml | 6 +- misc/integrations/k8s.oracle.ui.yml | 8 +- misc/integrations/k8s.oracle.yml | 6 +- misc/integrations/k8s.postgres.ui.yml | 8 +- misc/integrations/k8s.postgres.yml | 6 +- publiccode.yml | 6 +- pyproject.toml | 2 +- src/VERSION | 2 +- src/all-in-one/Dockerfile | 2 +- src/api/Dockerfile | 2 +- src/autoconf/Dockerfile | 2 +- src/bw/Dockerfile | 2 +- src/common/core/crowdsec/README.de.md | 4 +- src/common/core/crowdsec/README.es.md | 4 +- src/common/core/crowdsec/README.fr.md | 4 +- src/common/core/crowdsec/README.md | 4 +- src/common/core/crowdsec/README.zh.md | 4 +- src/common/db/Database.py | 4 +- src/common/db/model.py | 2 +- src/scheduler/Dockerfile | 2 +- src/ui/Dockerfile | 2 +- 150 files changed, 1098 insertions(+), 1098 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml index 3e612da172..88d03ba984 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yml +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -51,7 +51,7 @@ body: label: BunkerWeb version description: What version of BunkerWeb are you running? placeholder: Version - value: 1.6.14~rc1 + value: 1.6.14~rc2 validations: required: true - type: dropdown diff --git a/README.md b/README.md index 8bbee4a500..71e917bf00 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@

- BunkerWeb logo + BunkerWeb logo

@@ -40,7 +40,7 @@ | 🧩 Templates | - 🛡️ Examples + 🛡️ Examples
💬 Chat | @@ -60,14 +60,14 @@ # BunkerWeb

- Overview banner + Overview banner

BunkerWeb is a next-generation, open-source Web Application Firewall (WAF). -Being a full-featured web server (based on [NGINX](https://nginx.org/) under the hood), it will protect your web services to make them "secure by default." BunkerWeb integrates seamlessly into your existing environments ([Linux](https://docs.bunkerweb.io/1.6.14~rc1/integrations/?utm_campaign=self&utm_source=github#linux), [Docker](https://docs.bunkerweb.io/1.6.14~rc1/integrations/?utm_campaign=self&utm_source=github#docker), [Swarm](https://docs.bunkerweb.io/1.6.14~rc1/integrations/?utm_campaign=self&utm_source=github#swarm), [Kubernetes](https://docs.bunkerweb.io/1.6.14~rc1/integrations/?utm_campaign=self&utm_source=github#kubernetes), …) as a reverse proxy and is fully configurable (don't panic, there is an [awesome web UI](https://docs.bunkerweb.io/1.6.14~rc1/web-ui/?utm_campaign=self&utm_source=github) if you don't like the CLI) to meet your own use cases. In other words, cybersecurity is no longer a hassle. +Being a full-featured web server (based on [NGINX](https://nginx.org/) under the hood), it will protect your web services to make them "secure by default." BunkerWeb integrates seamlessly into your existing environments ([Linux](https://docs.bunkerweb.io/1.6.14~rc2/integrations/?utm_campaign=self&utm_source=github#linux), [Docker](https://docs.bunkerweb.io/1.6.14~rc2/integrations/?utm_campaign=self&utm_source=github#docker), [Swarm](https://docs.bunkerweb.io/1.6.14~rc2/integrations/?utm_campaign=self&utm_source=github#swarm), [Kubernetes](https://docs.bunkerweb.io/1.6.14~rc2/integrations/?utm_campaign=self&utm_source=github#kubernetes), …) as a reverse proxy and is fully configurable (don't panic, there is an [awesome web UI](https://docs.bunkerweb.io/1.6.14~rc2/web-ui/?utm_campaign=self&utm_source=github) if you don't like the CLI) to meet your own use cases. In other words, cybersecurity is no longer a hassle. -BunkerWeb contains primary [security features](https://docs.bunkerweb.io/1.6.14~rc1/advanced/?utm_campaign=self&utm_source=github#security-tuning) as part of the core but can be easily extended with additional ones thanks to a [plugin system](https://docs.bunkerweb.io/1.6.14~rc1/plugins/?utm_campaign=self&utm_source=github). +BunkerWeb contains primary [security features](https://docs.bunkerweb.io/1.6.14~rc2/advanced/?utm_campaign=self&utm_source=github#security-tuning) as part of the core but can be easily extended with additional ones thanks to a [plugin system](https://docs.bunkerweb.io/1.6.14~rc2/plugins/?utm_campaign=self&utm_source=github). ## Why BunkerWeb? @@ -94,7 +94,7 @@ A non-exhaustive list of security features: - **Block known bad IPs** with external blacklists and DNSBL - And much more... -Learn more about the core security features in the [security tuning](https://docs.bunkerweb.io/1.6.14~rc1/advanced/?utm_campaign=self&utm_source=github#security-tuning) section of the documentation. +Learn more about the core security features in the [security tuning](https://docs.bunkerweb.io/1.6.14~rc2/advanced/?utm_campaign=self&utm_source=github#security-tuning) section of the documentation. ## Demo @@ -129,13 +129,13 @@ When using BunkerWeb, you have the choice of the version you want to use: open-s Whether it's enhanced security, an enriched user experience, or technical monitoring, the BunkerWeb PRO version allows you to fully benefit from BunkerWeb and meet your professional needs. -In the documentation or the user interface, PRO features are annotated with a crown crown pro icon to distinguish them from those integrated into the open-source version. +In the documentation or the user interface, PRO features are annotated with a crown crown pro icon to distinguish them from those integrated into the open-source version. You can upgrade from the open-source version to the PRO one easily and at any time. The process is straightforward: - Claim your [free trial on the BunkerWeb panel](https://panel.bunkerweb.io/store/bunkerweb-pro?utm_campaign=self&utm_source=doc) by using the `freetrial` promo code at checkout - Once connected to the client area, copy your PRO license key -- Paste your license key into BunkerWeb using the [web UI](https://docs.bunkerweb.io/1.6.14~rc1/web-ui/#upgrade-to-pro) or a [specific setting](https://docs.bunkerweb.io/1.6.14~rc1/features/#pro) +- Paste your license key into BunkerWeb using the [web UI](https://docs.bunkerweb.io/1.6.14~rc2/web-ui/#upgrade-to-pro) or a [specific setting](https://docs.bunkerweb.io/1.6.14~rc2/features/#pro) Do not hesitate to visit the [BunkerWeb panel](https://panel.bunkerweb.io/knowledgebase?utm_campaign=self&utm_source=doc) or [contact us](https://panel.bunkerweb.io/contact.php?utm_campaign=self&utm_source=doc) if you have any questions regarding the PRO version. @@ -168,10 +168,10 @@ Community and social networks: # Concepts

- Concepts banner + Concepts banner

-You will find more information about the key concepts of BunkerWeb in the [documentation](https://docs.bunkerweb.io/1.6.14~rc1/concepts/?utm_campaign=self&utm_source=github). +You will find more information about the key concepts of BunkerWeb in the [documentation](https://docs.bunkerweb.io/1.6.14~rc2/concepts/?utm_campaign=self&utm_source=github). ## Integrations @@ -179,12 +179,12 @@ The first concept is the integration of BunkerWeb into the target environment. W The following integrations are officially supported: -- [Docker](https://docs.bunkerweb.io/1.6.14~rc1/integrations/?utm_campaign=self&utm_source=github#docker) -- [Linux](https://docs.bunkerweb.io/1.6.14~rc1/integrations/?utm_campaign=self&utm_source=github#linux) -- [Docker autoconf](https://docs.bunkerweb.io/1.6.14~rc1/integrations/?utm_campaign=self&utm_source=github#docker-autoconf) -- [Kubernetes](https://docs.bunkerweb.io/1.6.14~rc1/integrations/?utm_campaign=self&utm_source=github#kubernetes) -- [Swarm](https://docs.bunkerweb.io/1.6.14~rc1/integrations/?utm_campaign=self&utm_source=github#swarm) -- [Microsoft Azure](https://docs.bunkerweb.io/1.6.14~rc1/integrations/?utm_campaign=self&utm_source=github#microsoft-azure) +- [Docker](https://docs.bunkerweb.io/1.6.14~rc2/integrations/?utm_campaign=self&utm_source=github#docker) +- [Linux](https://docs.bunkerweb.io/1.6.14~rc2/integrations/?utm_campaign=self&utm_source=github#linux) +- [Docker autoconf](https://docs.bunkerweb.io/1.6.14~rc2/integrations/?utm_campaign=self&utm_source=github#docker-autoconf) +- [Kubernetes](https://docs.bunkerweb.io/1.6.14~rc2/integrations/?utm_campaign=self&utm_source=github#kubernetes) +- [Swarm](https://docs.bunkerweb.io/1.6.14~rc2/integrations/?utm_campaign=self&utm_source=github#swarm) +- [Microsoft Azure](https://docs.bunkerweb.io/1.6.14~rc2/integrations/?utm_campaign=self&utm_source=github#microsoft-azure) ## Settings @@ -214,7 +214,7 @@ When multisite mode is enabled, BunkerWeb will serve and protect multiple web ap ## Custom configurations -Because meeting all the use cases only using the settings is not an option (even with [external plugins](https://docs.bunkerweb.io/1.6.14~rc1/plugins/?utm_campaign=self&utm_source=github)), you can use custom configurations to solve your specific challenges. +Because meeting all the use cases only using the settings is not an option (even with [external plugins](https://docs.bunkerweb.io/1.6.14~rc2/plugins/?utm_campaign=self&utm_source=github)), you can use custom configurations to solve your specific challenges. Under the hood, BunkerWeb uses the notorious NGINX web server, that's why you can leverage its configuration system for your specific needs. Custom NGINX configurations can be included in different [contexts](https://docs.nginx.com/nginx/admin-guide/basic-functionality/managing-configuration-files/#contexts) like HTTP or server (all servers and/or specific server block). @@ -223,7 +223,7 @@ Another core component of BunkerWeb is the ModSecurity Web Application Firewall: ## Database

- Database model + Database model

The state of the current configuration of BunkerWeb is stored in a backend database which contains the following data: @@ -252,7 +252,7 @@ In other words, the scheduler is the brain of BunkerWeb.