modification de requête

Questions sur le développement d'Apache et de ses modules.

Modérateur : Modérateurs

gaetan
Nouveau membre
Messages : 2
Inscription : lun. 28 juil. 2008, 11:39

modification de requête

Messagepar gaetan » jeu. 31 juil. 2008, 11:10

Bonjour,

Je souhaite utiliser le module proxy avec une requête préalablement modifier par mon module (en C).
Est-il possible de modifier le corps d’une requête dans un module de façon à ce que ces modifications soient vues par les modules suivants.
Merci.

gaetan
Nouveau membre
Messages : 2
Inscription : lun. 28 juil. 2008, 11:39

Re: modification de requête

Messagepar gaetan » ven. 05 sept. 2008, 15:09

Pour ceux que cela intéresse, voici la solution à la quel je suis arrivé (pour apache 2.0.49) :

// mod_forwardNewRequest.c

module AP_MODULE_DECLARE_DATA forwardNewRequest_module;

static int forwardNewRequest_handler(request_rec *r) {
// Contrôle que le module proxy est disponible
if(ap_find_linked_module("mod_proxy.c") == NULL) {
return HTTP_mumble;
}

// affectation de l'URL cible
r->filename = "proxy:http://httpd.apache.org/docs/2.0/mod/mod_proxy.html";

// Remplacement des entêtes http de la requete d'origine par les entêtes de la nouvelle requête
apr_table_clear(r->headers_in);
apr_table_set(r->headers_in, "Max-Forwards", "10");
// ...

// Ajout de l'entête Content-Length avec la longueur correspondant à la nouvelle requête
char val[8];
sprintf(val, "%ld", strlen("<?xml version=\"1.0\" encoding=\"UTF-8\"?><contenue de la requête>"));
apr_table_set(r->headers_in, "Content-Length", val);

// now make sure the request gets handled by the proxy handler
r->proxyreq = PROXYREQ_REVERSE;
r->handler = "proxy-server";
return DECLINED;
}

static void substitueCorpsRequeteFilterInsert(request_rec *r) {
ap_add_input_filter("SubstitueCorpsRequeteFilterIn", NULL, r, r->connection);
}

typedef struct { char * corps; apr_off_t lgCorps; apr_off_t lgDejaLu;
} substitueCorpsRequeteFilterInContext;

static apr_status_t substitueCorpsRequeteFilterIn(ap_filter_t *f, apr_bucket_brigade *pbb, ap_input_mode_t eMode, apr_read_type_e eBlock, apr_off_t nBytes)
{
substitueCorpsRequeteFilterInContext *ctx = f->ctx;
apr_bucket * b, *nextb;

// Si on n'est pas appelé par le mod_proxy, on délègue la lecture au filtre suivant
if(eMode != AP_MODE_READBYTES || strcmp(f->r->handler, "proxy-server")) {
return ap_get_brigade(f->next, pbb, eMode, eBlock, nBytes);
}

// Si le contexte du filtre est nul, c'est le premier appel pour cette requête, on crée le contexte et on récupère le corps de la nouvelle requête à rediriger
if (!ctx) {
f->ctx = ctx = apr_pcalloc(f->r->pool, sizeof(*ctx));
ctx->corps = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><contenue de la requete>";
ctx->lgCorps = strlen("<contenue de la requête>");
ctx->lgDejaLu = 0;
}

// La longueur du seau est initialisé à la longueur de ce qui reste à lire
apr_off_t lgBkt = ctx->lgCorps - ctx->lgDejaLu;

// si le reste à lire est supérieur à la taille indiqué par l'appelant, on prend la taille de l'appelant
if(lgBkt > nBytes) {
lgBkt = nBytes;
}
else {
// Sinon on peut retourner la totalité du reste à lire et conclure par un seau de fin de flux
b = apr_bucket_eos_create(f->r->connection->bucket_alloc);
APR_BRIGADE_INSERT_TAIL(pbb, b);
}

b = apr_bucket_heap_create(&ctx->corps[ctx->lgDejaLu], lgBkt, 0, f->r->connection->bucket_alloc);
APR_BRIGADE_INSERT_HEAD(pbb, b);

ctx->lgDejaLu += lgBkt;

return APR_SUCCESS;
}

static void forwardNewRequest_register_hooks(apr_pool_t *p)
{
static const char * const aszSuc[]={ "mod_proxy.c", NULL };
ap_hook_handler(forwardNewRequest_handler, NULL, aszSuc, APR_HOOK_MIDDLE);
ap_hook_insert_filter(substitueCorpsRequeteFilterInsert, NULL, NULL, APR_HOOK_MIDDLE);
ap_register_input_filter("SubstitueCorpsRequeteFilterIn", substitueCorpsRequeteFilterIn, NULL, AP_FTYPE_RESOURCE);
}

module AP_MODULE_DECLARE_DATA forwardNewRequest_module = {
STANDARD20_MODULE_STUFF,
NULL, /* create per-dir config structures */
NULL, /* merge per-dir config structures */
NULL, /* create per-server config structures */
NULL, /* merge per-server config structures */
NULL, /* table of config file commands */
forwardNewRequest_register_hooks /* register hooks */
};


Et voici la configuration dans httpd.conf :

LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_http_module modules/proxy_http.so
ProxyRequests Off
<Proxy http://localhost:80/forwardNewRequest/*>
Order deny,allow
Allow from all
</Proxy>
ProxyPass / http:// httpd.apache.org/
ProxyPassReverse / http://httpd.apache.org/

LoadModule forwardNewRequest_module modules/mod_forwardNewRequest.so
<Location /forwardNewRequest>
SetHandler forwardNewRequest
</Location>

LaPogne
Nouveau membre
Messages : 8
Inscription : jeu. 21 août 2008, 18:33

Re: modification de requête

Messagepar LaPogne » ven. 05 sept. 2008, 18:48

Beau boulot, c'est pas moi qu'aurait pu t'aider :D


Revenir vers « Développement Apache »

Qui est en ligne ?

Utilisateurs parcourant ce forum : Aucun utilisateur inscrit et 1 invité