2017-01-04 1 views
2

Je construis un système de lecture d'enregistrements Dockerised pour m'aider à enregistrer des sites Web, afin que je puisse concevoir des scrapers à l'aide d'une version locale plutôt que réelle. Cela signifie que je ne submerge pas un site Web avec des demandes automatisées et que j'ai l'avantage de ne pas avoir besoin d'être connecté au Web pour travailler.Can WireMock peut-il lire des demandes provenant de plusieurs domaines?

J'ai utilisé le WireMock basé sur Java en interne, qui enregistre à partir d'une file d'éraflures de sites en utilisant Wget. J'utilise le WireMock API pour lire diverses informations sur les mappages qu'il enregistre.

Cependant, j'ai repéré à partir d'une réponse de cartographie que l'information de domaine ne semble pas être enregistrée (sauf si elle est en-tête de réponse par accident). Voir la réponse suivante __admin/mappings:

{ 

    "result": { 
     "ok": true, 
     "list": [ 
      { 
       "id": "794d609f-99b9-376d-b6b8-04dab161c023", 
       "uuid": "794d609f-99b9-376d-b6b8-04dab161c023", 
       "request": { 
        "url": "/robots.txt", 
        "method": "GET" 
       }, 
       "response": { 
        "status": 404, 
        "bodyFileName": "body-robots.txt-j9qqJ.txt", 
        "headers": { 
         "Server": "nginx/1.0.15", 
         "Date": "Wed, 04 Jan 2017 21:04:40 GMT", 
         "Content-Type": "text/html", 
         "Connection": "keep-alive" 
        } 
       } 
      }, 
      { 
       "id": "e246fac2-f9ad-3799-b7b7-066941408b8b", 
       "uuid": "e246fac2-f9ad-3799-b7b7-066941408b8b", 
       "request": { 
        "url": "/about/careers/", 
        "method": "GET" 
       }, 
       "response": { 
        "status": 200, 
        "bodyFileName": "body-about-careers-GhVqy.txt", 
        "headers": { 
         "Server": "nginx/1.0.15", 
         "Date": "Wed, 04 Jan 2017 21:04:35 GMT", 
         "Content-Type": "text/html", 
         "Last-Modified": "Wed, 04 Jan 2017 12:52:12 GMT", 
         "Connection": "keep-alive", 
         "X-CACHE-URI": "/about/careers/", 
         "Accept-Ranges": "bytes" 
        } 
       } 
      }, 
      { 
       "id": "def378f5-a93c-333e-9663-edcd30c936d7", 
       "uuid": "def378f5-a93c-333e-9663-edcd30c936d7", 
       "request": { 
        "url": "/about/careers/feed/", 
        "method": "GET" 
       }, 
       "response": { 
        "status": 200, 
        "bodyFileName": "body-careers-feed-Fd2fO.xml", 
        "headers": { 
         "Server": "nginx/1.0.15", 
         "Date": "Wed, 04 Jan 2017 21:04:45 GMT", 
         "Content-Type": "application/rss+xml; charset=UTF-8", 
         "Transfer-Encoding": "chunked", 
         "Connection": "keep-alive", 
         "X-Powered-By": "PHP/5.3.3", 
         "Vary": "Cookie", 
         "X-Pingback": "http://www.example.com/xmlrpc.php", 
         "Last-Modified": "Thu, 06 Jun 2013 14:01:52 GMT", 
         "ETag": "\"765fc03186b121a764133349f8b716df\"", 
         "X-Robots-Tag": "noindex, follow", 
         "Link": "<http://www.example.com/?p=2680>; rel=shortlink", 
         "X-CACHE-URI": "null cache" 
        } 
       } 
      }, 
      { 
       "id": "616ca6d7-6e57-4c10-8b57-f6f3dabc0930", 
       "uuid": "616ca6d7-6e57-4c10-8b57-f6f3dabc0930", 
       "request": { 
        "method": "ANY" 
       }, 
       "response": { 
        "status": 200, 
        "proxyBaseUrl": "http://www.example.com" 
       }, 
       "priority": 10 
      } 
     ] 
    } 

} 

Le seul enregistrement clair d'une URL est dans l'entrée finale contre proxyBaseUrl, et étant donné que je devais specify a URL in the console call je suis inquiet que si j'enregistre contre un autre domaine, la domaine dont chacun est originaire sera perdu. Cela signifierait qu'en mode lecture, WireMock ne serait capable de lire qu'à partir d'un domaine, et que je devrais le redémarrer et le pointer vers un autre cache afin de lire des sites différents. Ce n'est pas réalisable pour mon cas d'utilisation, alors y a-t-il un moyen de contourner ce problème?

(J'ai fait un peu de travail avec Mountebank, et je serais prêt à y passer, même si je trouve WireMock généralement plus facile à utiliser.Mon arrangement limité de Mountebank est qu'il souffre du même problème de domaine unique, bien que Je suis heureux d'être corrigé sur ce point, je serais heureux d'échanger avec n'importe quel proxy HTTP d'enregistreur basé sur l'API Open Source robuste, si abandonner WireMock est la seule solution.

Répondre

3

Il est possible de servir des stubs WireMock pour plusieurs domaines en ajoutant un critère d'en-tête Host dans vos demandes. En supposant que votre fichier DNS/hôte mappe tous les domaines pertinents à l'adresse IP de votre serveur WireMock, cela le fera se comporter comme un hébergement virtuel sur un serveur Web ordinaire. Le principal problème est que l'enregistreur n'ajoutera pas l'en-tête de l'hôte à vos mappages, vous devrez donc le faire vous-même par la suite, ou pirater l'enregistreur pour le faire à la volée.

J'ai envisagé d'ajouter un meilleur support pour cela, alors surveillez cet espace.

Je suggère également de vérifier Hoverfly, qui semble déjà résoudre ce problème assez bien.

+0

Ah génial, merci Tom - Je vais essayer ça. Comme [enregistrement est par domaine de toute façon] (http://stackoverflow.com/q/41049289/472495), j'imagine que je peux faire quelque chose pour modifier les nouvelles requêtes à la fin de la phase d'enregistrement. – halfer

+0

Hoverfly semble intéressant, mais n'offre pas de fonctionnalité de suppression par ID dans [son API HTTP] (http://hoverfly.io/reference/#api), ce dont je pense avoir besoin. Cependant, vous avez raison de dire qu'il semble déjà enregistrer et servir à partir de plusieurs domaines, alors peut-être que ce serait un bon plan de sauvegarde. – halfer

+0

Aha, J'ai été bloqué précédemment sur la façon d'ajouter des filtres dans le système de requête, crois qu'il s'agit de simples paires clé-valeur. Je viens de voir comment le faire [d'ici] (http://wiremock.org/docs/request-matching/), tous bien documentés! – halfer