2013-04-03 5 views
0

Pour le développement d'un proxy inverse personnalisé (écrit en C++), je souhaite effectuer une traduction en temps réel des URI dans le contenu HTML. Par exemple, si je veux accéder à une ressource sur http://myserver/ en utilisant http://my-reverse-proxy/myserver, tous les liens absolus et supérieurs tels que http://myserver/somecontent1.ext ou /somecontent2.ext doivent être modifiés.Traduction en temps réel du contenu HTML en C/C++

Une balise HTML

<img src="/sample.png"> 

serait donc traduit à

<img src="/myserver/sample.png"> 

De mon point de vue, il y a des approches:

1) Utilisation d'expressions régulières et remplacement de chaîne pour trouver toutes les balises HTML associées et leurs chemins à l'aide de groupes de capture et de remplacement de chaîne.

2) Analyser tout le contenu HTML, faire une transformation dans l'arbre d'analyse et réimprimer le résultat dans une ressource HTML valide.

Et c'est ce que cette question est tout: Avez-vous des expériences quelle solution pourrait être plus rapide et peut-être même plus raisonnable? Connaissez-vous un cadre que je pourrais utiliser pour ne pas réinventer la roue? Comme ce processus devrait être utilisé plus tard pour les ressources CSS et XML, il ne devrait pas s'agir d'une solution dépendant du HTML.

Merci d'avance!

+0

Si vous envisagez de l'utiliser pour CSS, votre option 2 n'est pas possible ... – FredericS

+0

@FredericS Je pourrais analyser et tokenize CSS, pourquoi cela ne fonctionnerait-il pas? En utilisant quelque chose comme [SDF] (http://www.program-transformation.org/Sdf/SdfLanguage), je pourrais même réaliser l'analyse de CSS en ligne dans du contenu HTML. – muffel

+0

que vous pouvez analyser à la fois CSS et XML, mais les langues ne sont pas du tout similaires. Vous aurez un analyseur CSS-dépendant, un analyseur HTML/XML-dépendant et une réutilisation de code minimale (la partie de transformation commune sera probablement votre option 1 mais sur des noeuds spécifiques de vos arborescences) – FredericS

Répondre

0

Les serveurs proxy fonctionnent généralement en étant serveurs. Ils gèrent toutes les requêtes HTTP, modifient les URL demandées, puis transmettent la requête modifiée au serveur de l'autre côté.

Vous devriez vous en tenir à ce paradigme. C'est beaucoup plus facile et plus efficace que de déblayer les fichiers eux-mêmes. Tout ce qui est fait en temps réel peut être fait au moment de la demande.

En outre, il devrait probablement être demandé: pourquoi un personnalisé proxy inverse? De telles choses existent déjà.

+0

Le serveur que je développe consiste à fournir un accès externe aux ressources internes. Comme les ressources internes ne peuvent pas être modifiées (comme l'interface web d'un boîtier décodeur ou d'un équipement domotique), et que certains périphériques externes comme les smartphones ne peuvent pas se connecter à des ressources partielles utilisant des serveurs proxy (HTTP-), j'ai vraiment besoin De cette façon: Un navigateur Web se connecte au système proxy distant. Le site Web cible est identifié en utilisant le chemin URI (comme '/ myserver'), et le proxy inverse est le 'médiateur' qui interfère entre le navigateur et le serveur Web cible. – muffel

+0

@muffel, pourquoi votre serveur ne redirige-t-il pas simplement toutes les demandes vers le proxy? c'est-à-dire rediriger toute requête sur 'http: // myserver /' vers http: // my-reverse-proxy/myserver'? –

+0

Parce que le serveur ne pourrait alors intercepter aucune requête après la première. Exemple: Je veux accéder à 'myserver' en utilisant un webbrowser qui n'a pas de paramètres pour les serveurs proxy. Tout ce que je peux faire est d'ouvrir une URL.J'accède donc 'http: // reverse-proxy/myserver' qui est traduit en' http: // myserver'. Ce résultat contient une image '' que le navigateur chargerait en tant que 'http: // reverse-proxy/a.png' au lieu de' http: // reverse-proxy/myserver/a.png'. De nombreux navigateurs mobiles ne peuvent pas utiliser les serveurs proxy sur les connexions Internet 3G, mais je veux aussi les adresser. – muffel