Rack fournit une interface minimale, modulaire et adaptable pour développer des applications Web dans Ruby. En encapsulant les requêtes et les réponses HTTP de la manière la plus simple possible, il unifie et distille le pont entre les serveurs Web, les frameworks Web et l'application Web en un seul appel de méthode.
Les détails exacts sont décrits dans la spécification du rack, à laquelle toutes les applications du rack doivent se conformer.
Version | Soutien |
---|---|
3.1.x | Corrections de bugs et correctifs de sécurité. |
3.0.x | Correctifs de sécurité uniquement. |
2.2.x | Correctifs de sécurité uniquement. |
<= 2.1.x | Fin du support. |
Veuillez consulter la politique de sécurité pour plus d'informations.
Il s'agit de la dernière version de Rack. Il contient des corrections de bugs et des correctifs de sécurité. Veuillez consulter le journal des modifications pour obtenir des informations détaillées sur des modifications spécifiques.
Cette version du rack contient des modifications importantes qui sont détaillées dans le guide de mise à niveau. Il est recommandé de passer au Rack 3 dès que possible pour recevoir les dernières fonctionnalités et correctifs de sécurité.
Cette version de Rack reçoit uniquement des correctifs de sécurité et des efforts doivent être faits pour migrer vers Rack 3.
À partir de Ruby 3.4, la dépendance base64
ne sera plus une gemme par défaut et peut provoquer un avertissement ou une erreur concernant l'absence base64
. Pour corriger cela, ajoutez base64
comme dépendance à votre projet.
Ajoutez la gem rack à votre bundle d'applications ou suivez les instructions fournies par un framework Web pris en charge :
# Install it generally:
$ gem install rack
# or, add it to your current application gemfile:
$ bundle add rack
Si vous avez besoin de fonctionnalités de Rack::Session
ou bin/rackup
veuillez ajouter ces gemmes séparément.
$ gem install rack-session rackup
Créez un fichier appelé config.ru
avec le contenu suivant :
run do | env |
[ 200 , { } , [ "Hello World" ] ]
end
Exécutez-le à l'aide de la gemme rackup ou d'un autre serveur Web pris en charge.
$ gem install rackup
$ rackup
# In another shell:
$ curl http://localhost:9292
Hello World
Rack est pris en charge par une large gamme de serveurs, notamment :
Vous devrez consulter la documentation du serveur pour connaître les fonctionnalités et les limitations dont ils peuvent disposer. En général, toute application Rack valide fonctionnera de la même manière sur tous ces serveurs, sans rien changer.
Rack fournit une gemme distincte, rackup, qui est une interface générique pour exécuter une application Rack sur les serveurs pris en charge, notamment WEBRick
, Puma
, Falcon
et autres.
Ces frameworks et bien d’autres prennent en charge la spécification Rack :
Entre le serveur et le framework, Rack peut être personnalisé selon les besoins de vos applications à l'aide d'un middleware. Rack lui-même est livré avec le middleware suivant :
Rack::CommonLogger
pour créer des fichiers journaux de style Apache.Rack::ConditionalGet
pour renvoyer les réponses Not Modified lorsque la réponse n’a pas changé.Rack::Config
pour modifier l'environnement avant de traiter la requête.Rack::ContentLength
pour définir un en-tête de content-length
en fonction de la taille du corps.Rack::ContentType
pour définir un en-tête content-type
par défaut pour les réponses.Rack::Deflater
pour compresser les réponses avec gzip.Rack::ETag
pour définir l'en-tête etag
sur les corps qui peuvent être mis en mémoire tampon.Rack::Events
pour fournir des hooks faciles lorsqu'une demande est reçue et lorsque la réponse est envoyée.Rack::Files
pour servir des fichiers statiques.Rack::Head
pour renvoyer un corps vide pour les requêtes HEAD.Rack::Lint
pour vérifier la conformité à la spécification du rack.Rack::Lock
pour sérialiser les requêtes à l'aide d'un mutex.Rack::MethodOverride
pour modifier la méthode de requête en fonction d'un paramètre soumis.Rack::Recursive
pour inclure des données provenant d'autres chemins dans l'application et pour effectuer des redirections internes.Rack::Reloader
pour recharger les fichiers s'ils ont été modifiés.Rack::Runtime
pour inclure un en-tête de réponse avec le temps nécessaire au traitement de la demande.Rack::Sendfile
pour travailler avec des serveurs Web pouvant utiliser un service de fichiers optimisé pour les chemins du système de fichiers.Rack::ShowException
pour détecter les exceptions non gérées et les présenter de manière agréable et utile avec une trace cliquable.Rack::ShowStatus
pour utiliser de belles pages d'erreur pour les réponses d'erreur client vides.Rack::Static
pour un service plus configurable de fichiers statiques.Rack::TempfileReaper
pour supprimer les fichiers temporaires créés lors d'une requête.Tous ces composants utilisent la même interface, qui est décrite en détail dans la spécification du rack. Ces composants optionnels peuvent être utilisés comme vous le souhaitez.
Si vous souhaitez développer en dehors des frameworks existants, implémenter les vôtres ou développer des middlewares, Rack fournit de nombreuses aides pour créer des applications Rack rapidement et sans faire les mêmes tâches Web partout :
Rack::Request
qui fournit également l'analyse des chaînes de requête et la gestion en plusieurs parties.Rack::Response
pour une génération pratique de réponses HTTP et une gestion des cookies.Rack::MockRequest
et Rack::MockResponse
pour des tests efficaces et rapides de l'application Rack sans véritables allers-retours HTTP.Rack::Cascade
pour essayer des applications Rack supplémentaires si une application renvoie une réponse introuvable ou une méthode non prise en charge.Rack::Directory
pour servir les fichiers dans un répertoire donné, avec des index de répertoire.Rack::MediaType
pour analyser les en-têtes de type de contenu.Rack::Mime
pour déterminer le type de contenu en fonction de l'extension du fichier.Rack::RewindableInput
pour rendre n'importe quel objet IO rembobinable, en utilisant un tampon de fichier temporaire.Rack::URLMap
pour acheminer vers plusieurs applications au sein du même processus. Rack expose plusieurs paramètres de configuration pour contrôler diverses fonctionnalités de l'implémentation.
param_depth_limit
Rack :: Utils . param_depth_limit = 32 # default
Quantité maximale d'imbrication autorisée dans les paramètres. Par exemple, si la valeur est 3, cette chaîne de requête serait autorisée :
?a[b][c]=d
mais cette chaîne de requête ne serait pas autorisée :
?a[b][c][d]=e
La limitation de la profondeur empêche un éventuel débordement de pile lors de l'analyse des paramètres.
multipart_file_limit
Rack :: Utils . multipart_file_limit = 128 # default
Nombre maximum de pièces avec un nom de fichier qu'une requête peut contenir. Accepter trop de parties peut conduire le serveur à manquer de descripteurs de fichiers.
La valeur par défaut est 128, ce qui signifie qu'une seule requête ne peut pas télécharger plus de 128 fichiers à la fois. Réglé sur 0 pour aucune limite.
Peut également être défini via la variable d'environnement RACK_MULTIPART_FILE_LIMIT
.
(Ceci est également appelé multipart_part_limit
et RACK_MULTIPART_PART_LIMIT
pour des raisons de compatibilité)
multipart_total_part_limit
Nombre total maximum de parties qu'une demande peut contenir, de tout type, y compris les champs de formulaire de type fichier et non-fichier.
La valeur par défaut est 4 096, ce qui signifie qu’une seule requête ne peut pas contenir plus de 4 096 parties.
Réglé sur 0 pour aucune limite.
Peut également être défini via la variable d'environnement RACK_MULTIPART_TOTAL_PART_LIMIT
.
Voir CHANGELOG.md.
Voir CONTRIBUTING.md pour des détails spécifiques sur la façon d'apporter une contribution à Rack.
Veuillez publier des bogues, des suggestions et des correctifs sur les problèmes GitHub.
Veuillez consulter notre politique de sécurité pour connaître le processus de divulgation responsable et de signalement des bogues de sécurité. En raison de l'utilisation généralisée de la bibliothèque, il est fortement préférable que nous gérions le timing afin de fournir des correctifs viables au moment de la divulgation. Votre aide dans cette affaire est grandement appréciée.
rackup
Un outil utile pour exécuter des applications Rack à partir de la ligne de commande, notamment Rackup::Server
(anciennement Rack::Server
) pour les serveurs de script.
rack-contrib
La pléthore de middleware utiles a créé le besoin d’un projet qui collecte de nouveaux middleware Rack. rack-contrib
comprend une variété de composants complémentaires pour Rack et il est facile de contribuer à de nouveaux modules.
rack-session
Fournit une gestion pratique des sessions pour Rack.
L'équipe Rack Core, composée de
et les anciens du Rack
je tiens à remercier :
Rack::Deflater
.Rack::ContentType
.Rack::Response
.Rack::Response
.Rack est publié sous la licence MIT.