src/server/daemon/request.c

Mon, 30 Jan 2017 20:54:20 +0100

author
Olaf Wintermann <olaf.wintermann@gmail.com>
date
Mon, 30 Jan 2017 20:54:20 +0100
changeset 168
5c752979bfd6
parent 145
1c93281ca4bf
child 415
d938228c382e
permissions
-rw-r--r--

fixes crash on broken urls

/*
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
 *
 * Copyright 2013 Olaf Wintermann. All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 *
 *   1. Redistributions of source code must retain the above copyright
 *      notice, this list of conditions and the following disclaimer.
 *
 *   2. Redistributions in binary form must reproduce the above copyright
 *      notice, this list of conditions and the following disclaimer in the
 *      documentation and/or other materials provided with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGE.
 */

#include "request.h"

#include "../util/pblock.h"
#include "httprequest.h"
#include "../public/vfs.h"


/* Code from req.cpp */
/* TODO: fremden Code durch eigenen ersetzen */

/* -------------------------- request_initialize -------------------------- */

int request_initialize(
        pool_handle_t *pool,
        HTTPRequest *hrq,
        NSAPIRequest *nrq)
{
    Request *rq = &nrq->rq;

    rq->vars = pblock_create_pool(pool, REQ_HASHSIZE);
    if (!rq->vars)
        return 1;
    rq->reqpb = pblock_create_pool(pool, REQ_HASHSIZE);
    if (!rq->reqpb)
        return 1;
    rq->loadhdrs = 0;
    rq->headers = pblock_create_pool(pool, REQ_HASHSIZE);
    if (!rq->headers)
        return 1;
    rq->senthdrs = 0;
    rq->srvhdrs = pblock_create_pool(pool, REQ_HASHSIZE);
    if (!rq->srvhdrs)
        return 1;

    rq->os = NULL;
    rq->tmpos = NULL;
    rq->statpath = NULL;
    rq->staterr = NULL;
    rq->finfo = NULL;
    rq->aclstate = 0;
    rq->acldirno = 0;
    rq->aclname = NULL;
    rq->aclpb = NULL;
    rq->acllist = NULL;
    rq->aclreqaccess = 0;
    rq->request_is_cacheable = 0;
    rq->directive_is_cacheable = 0;
    rq->cached_headers = NULL;
    rq->cached_headers_len = 0;
    rq->unused = NULL;
    //rq->req_start = ft_time(); // TODO: ft_time
    rq->protv_num = 0;
    rq->method_num = -1;
    //PR_ASSERT(sizeof(rq->rq_attr) == sizeof(RQATTR)); // TODO: assert
    *(RQATTR *) &rq->rq_attr = 0;
    //rq->hostname = pool_strdup(pool, hostname); // TODO: hostname
    rq->allowed = 0;
    rq->byterange = 0;
    rq->status_num = 0;
    rq->staterrno = 0;
    rq->orig_rq = rq;

    // TODO: nrq

    /* NSAPI execution context */
    nrq->context.last_req_code = REQ_NOACTION;

    nrq->context.objset_index = -1;
    nrq->context.dtable_index = 0;
    
    // host and port
        
    
    nrq->jvm_context = NULL;


    // new
    rq->status_num = -1;
    rq->vfs = NULL;
    rq->davCollection = NULL;
    
    return 0;
}

const VirtualServer* request_get_vs(Request *rq) {
    return ((NSAPIRequest*)rq)->vs;
}

struct stat* request_stat_path(const char *path, Request *rq) {
    // TODO: reimplement with vfs support
    // TODO: use pool
    struct stat *s = malloc(sizeof(struct stat));
    if(stat(path, s)) {
        free(s);
        return NULL;
    }
    // TODO: statpath and staterror
    rq->finfo = s;
    return s;
}

int request_set_path(sstr_t root, sstr_t path, pblock *vars) {
    // TODO: maybe replace this code with request_set_path from req.cpp
    
    // concat path
    size_t length = root.length + path.length;
    char *translated_path = alloca(length + 1);
    memcpy(translated_path, root.ptr, root.length);
    if(root.ptr[root.length-1] == '/') {
        memcpy(translated_path + root.length, path.ptr, path.length);
    } else {
        translated_path[root.length] = '/';
        memcpy(translated_path + root.length + 1, path.ptr, path.length);
        length++;
    }
    
    // add path to specified pblock
    pblock_kvinsert(
            pb_key_ppath,
            translated_path,
            length,
            vars);
    
    pblock_kvinsert(pb_key_ntrans_base, root.ptr, root.length, vars);
    
    return REQ_PROCEED;
}

void request_free(Request *rq) {
    // TODO: implement
}

Request* request_restart_internal(const char *uri, Request *rq) {
    // TODO: implement
    return NULL;
}


char* servact_translate_uri(char *uri, Session *sn) {
    // TODO: implement
    return NULL;
}

mercurial