2009-09-07 7 views
1

Je vois qu'il ya une option dans :user_sslattachment_fu qui vérifie le fichier amazon_s3.yml afin de servir des fichiers via https: //Le traitement des fichiers sur HTTPS est-il dynamiquement basé sur request.ssl? avec attachment_fu

Dans le s3_backend.rb vous avez cette méthode:

def self.protocol 
     @protocol ||= s3_config[:use_ssl] ? 'https://' : 'http://' 
    end 

Mais cela lui permet alors de servir toutes les pièces jointes s3 avec SSL. Je voudrais rendre dynamique en fonction si la demande actuelle a été faite par https: // i.e.:

if request.ssl? 
    @protocol = "https://" 
    else 
    @protocol = "http://" 
    end 

Comment puis-je faire fonctionner de cette façon? J'ai essayé de modifier la méthode et obtenir le NameError: variable locale non définie ou méthode `demande » pour Technoweenie :: AttachmentFu :: :: backends S3Backend: Module erreur

Répondre

0

Le problème est que la méthode que vous êtes La modification (Technoweenie::AttachmentFu::Backends::AWS::S3.protocol) est statique et n'a pas accès au fichier ou à la requête en question. Celui que vous voulez modifier est Technoweenie::AttachmentFu::Backends::AWS::S3#s3_url(thumbnail). Vous devrez ajouter un argument d'options afin que votre contrôleur puisse passer s'il veut SSL ou non, puisque ce paquetage au niveau du modèle ne comprend pas les problèmes au niveau du contrôleur comme "demande actuelle" (et ne devrait pas le faire).

La vraie réponse, cependant, est "vous ne voulez probablement pas faire cela." Si le client dit quelque chose comme "nous avons un modèle freemium dans lequel seuls nos clients payants obtiennent des transferts SSL de leurs photos," vous devriez repousser: "plus difficile pour paralyser les transferts de fichiers SSL, et il est susceptible de simplement introduire des bugs Sur la route, pensons à une autre option freemium à proposer. " Si le client ne s'en soucie pas vraiment, vous pouvez également activer SSL pour tous les téléchargements.

+1

je lance encore dans des problèmes avec les navigateurs ne voulant pas afficher des images sur une page si elles sont servies sur SSL alors que la page elle-même ne l'est pas, en gardant toutes les références sur la page comme "http" ou tout comme "https" corrige bien. –

+0

Mike, C'est à peu près le problème que j'essaie de résoudre. Spécifiquement concernant les erreurs d'avertissement de sécurité IE 7/8 ... –

+0

Gaius, Merci, je vais tenter le coup. –

0

Ceci est un problème important qui doit être résolu correctement, ou les implications sont assez désagréables (en particulier si vous ne testez pas dans IE, les erreurs et les avertissements peuvent glisser par vous). Ma solution est de mettre ce qui suit dans ApplicationController

around_filter :set_attachment_fu_protocol 

def set_attachment_fu_protocol 
    protocol = Technoweenie::AttachmentFu::Backends::S3Backend.instance_variable_get(:@protocol) 
    Technoweenie::AttachmentFu::Backends::S3Backend.instance_variable_set(:@protocol, request.protocol) 
    yield 
ensure 
    Technoweenie::AttachmentFu::Backends::S3Backend.instance_variable_set(:@protocol, protocol) 
end 

Cette solution a été conçue pour avoir les propriétés suivantes:

  • ne nécessite pas patcher attachment_fu
  • Définit le protocole de S3 Backend par demande
  • Réinitialise le protocole même si une exception se produit
  • Conserve la valeur par défaut: u se_ssl réglage si vous utilisez de la console
  • Ne nécessite pas l'around_filter être universelle, elle remet toujours à l'état d'origine après chaque demande
Questions connexes