Как переслать запрос POST на HTTP-сервере Apache

Есть клиент, который реализован в Nodejs. Я хочу отправить почтовый запрос на HTTP-сервер Apache, а затем этот запрос должен быть перенаправлен на внутренний сервер (он находится где-то еще). Поэтому я реализовал клиент Node js и модуль Apache. Запрос и ответ между этими двумя в порядке. Теперь моя проблема заключается в том, как перенаправить этот запрос с HTTP-сервера Apache на внутренний сервер.

Nodejs client.js

var request = require('request');
var userDetails={
    username:"username",
    password:"abc123"

}
var optsSingup = {
    url: "http://localhost:80/a",
    method: "POST",
    headers: {
        "Content-Type": "application/x-www-form-urlencoded"
    },
    form:{

        username:userDetails.username,
        password:userDetails.password,

    }

};

request(optsSingup, function (err, res, body) {
    console.log('error', err);
    //console.log('status', res.statusCode);
    console.log('body', body);
});

Модуль Apache (я следовал этому руководству http://httpd.apache.org/docs/2.4/developer/modguide.html пример mod_example_config.c). Здесь я поделюсь обработчиком моего модуля. Другие части аналогичны mod_example_config.c.

 typedef struct {
    const char* key;
    const char* value;
 } keyValuePair;

 static int example_handler(request_rec *r)
{

        formData = readPost(r);
        if (formData) {
        int i;
        for (i = 0; &formData[i]; i++) {
                if (formData[i].key && formData[i].value) {
                        ap_rprintf(r, "%s = %s\n", formData[i].key, formData[i].value);
                 } else if (formData[i].key) {
                        ap_rprintf(r, "%s\n", formData[i].key);
                } else if (formData[i].value) {
                    ap_rprintf(r, "= %s\n", formData[i].value);
                 } else {
                    break;
                }
        }
        }
        return OK;
        }


    keyValuePair* readPost(request_rec* r) {
    apr_array_header_t *pairs = NULL;
    apr_off_t len;
    apr_size_t size;
    int res;
    int i = 0;
    char *buffer;
    keyValuePair* kvp;

    res = ap_parse_form_data(r, NULL, &pairs, -1, HUGE_STRING_LEN);
    if (res != OK || !pairs) return NULL; 
    kvp = apr_pcalloc(r->pool, sizeof(keyValuePair) * (pairs->nelts + 1));
    while (pairs && !apr_is_empty_array(pairs)) {
        ap_form_pair_t *pair = (ap_form_pair_t *) apr_array_pop(pairs);
        apr_brigade_length(pair->value, 1, &len);
        size = (apr_size_t) len;
        buffer = apr_palloc(r->pool, size + 1);
        apr_brigade_flatten(pair->value, buffer, &size);
        buffer[len] = 0;
        kvp[i].key = apr_pstrdup(r->pool, pair->name);
        kvp[i].value = buffer;
        i++;
    }
    return kvp;
    }

person GPrathap    schedule 14.01.2015    source источник
comment
Вы должны использовать модуль mod_proxy и настроить его как обратный прокси (шлюз). Mod proxy будет легко пересылать запросы на ваш внутренний сервер. В этом нет необходимости изобретать велосипед. http://httpd.apache.org/docs/current/mod/mod_proxy.html   -  person Boris    schedule 20.01.2015


Ответы (1)


На самом деле это не правильный способ сделать это. См. ответ в этом вопросе Как установить обработчик набора для запрос прокси

person GPrathap    schedule 19.04.2015