
#include <ngx_core.h>
#include <ngx_config_command.h>
#include <ngx_http.h>
#include <ngx_http_write_filter.h>
#include <ngx_http_output_filter.h>
#include <ngx_http_index_handler.h>


int ngx_max_module;

/* STUB: gobal srv and loc conf */
void **ngx_srv_conf;
void **ngx_loc_conf;


int ngx_http_config_modules(ngx_pool_t *pool, ngx_http_module_t **modules)
{
    int i;

    for (i = 0; modules[i]; i++) {
        modules[i]->index = i;
    }

    ngx_max_module = i;

    ngx_test_null(ngx_srv_conf,
                  ngx_pcalloc(pool, sizeof(void *) * ngx_max_module),
                  NGX_ERROR);
    ngx_test_null(ngx_loc_conf,
                  ngx_pcalloc(pool, sizeof(void *) * ngx_max_module),
                  NGX_ERROR);

    for (i = 0; modules[i]; i++) {
        if (modules[i]->create_srv_conf)
            ngx_srv_conf[i] = modules[i]->create_srv_conf(pool);

        if (modules[i]->create_loc_conf)
            ngx_loc_conf[i] = modules[i]->create_loc_conf(pool);
    }
}

int ngx_http_init_modules(ngx_pool_t *pool, ngx_http_module_t **modules)
{
    int i;

    for (i = 0; modules[i]; i++) {
        if (modules[i]->init_module)
            modules[i]->init_module(pool);
    }
}

int ngx_http_init_filters(ngx_pool_t *pool, ngx_http_module_t **modules)
{
    int i;
    int (*filter)(ngx_http_request_t *r, ngx_chain_t *ch);

    filter = ngx_http_write_filter;

    for (i = 0; modules[i]; i++) {
        if (modules[i]->init_output_body_filter)
            modules[i]->init_output_body_filter(&filter);
    }
}


/* STUB */
ngx_http_output_filter_set_stub(ngx_pool_t *pool, ngx_http_module_t **modules)
{
    int i;
    ngx_command_t *cmd;

    for (i = 0; modules[i]; i++) {
        if (modules[i] == &ngx_http_output_filter_module) {
            for (cmd = modules[i]->commands; cmd->name; cmd++) {
                if (strcmp(cmd->name, "output_buffer") == 0) {
                    cmd->set(ngx_loc_conf[i], cmd->offset, "32768");
                }
            }
        }
    }
}

ngx_http_write_filter_set_stub(ngx_pool_t *pool, ngx_http_module_t **modules)
{
    int i;
    ngx_command_t *cmd;

    for (i = 0; modules[i]; i++) {
        if (modules[i] == &ngx_http_write_filter_module) {
            for (cmd = modules[i]->commands; cmd->name; cmd++) {
                if (strcmp(cmd->name, "write_buffer") == 0) {
                    cmd->set(ngx_loc_conf[i], cmd->offset, "1500");
                }
            }
        }
    }
}

ngx_http_index_set_stub(ngx_pool_t *pool, ngx_http_module_t **modules)
{
    int i;
    ngx_command_t *cmd;

    for (i = 0; modules[i]; i++) {
        if (modules[i] == &ngx_http_index_module) {
            for (cmd = modules[i]->commands; cmd->name; cmd++) {
                if (strcmp(cmd->name, "index") == 0) {
                    cmd->set(pool, ngx_loc_conf[i], "index.html");
                }
            }
        }
    }
}
