UNIXworkcode

1 /* 2 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. 3 * 4 * Copyright 2013 Olaf Wintermann. All rights reserved. 5 * 6 * Redistribution and use in source and binary forms, with or without 7 * modification, are permitted provided that the following conditions are met: 8 * 9 * 1. Redistributions of source code must retain the above copyright 10 * notice, this list of conditions and the following disclaimer. 11 * 12 * 2. Redistributions in binary form must reproduce the above copyright 13 * notice, this list of conditions and the following disclaimer in the 14 * documentation and/or other materials provided with the distribution. 15 * 16 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 17 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 19 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE 20 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 21 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 22 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 23 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 24 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 25 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 26 * POSSIBILITY OF SUCH DAMAGE. 27 */ 28 29 #include "request.h" 30 31 #include "../util/pblock.h" 32 #include "httprequest.h" 33 #include "../public/vfs.h" 34 35 36 /* Code from req.cpp */ 37 /* TODO: fremden Code durch eigenen ersetzen */ 38 39 /* -------------------------- request_initialize -------------------------- */ 40 41 int request_initialize( 42 pool_handle_t *pool, 43 HTTPRequest *hrq, 44 NSAPIRequest *nrq) 45 { 46 Request *rq = &nrq->rq; 47 48 rq->vars = pblock_create_pool(pool, REQ_HASHSIZE); 49 if (!rq->vars) 50 return 1; 51 rq->reqpb = pblock_create_pool(pool, REQ_HASHSIZE); 52 if (!rq->reqpb) 53 return 1; 54 rq->loadhdrs = 0; 55 rq->headers = pblock_create_pool(pool, REQ_HASHSIZE); 56 if (!rq->headers) 57 return 1; 58 rq->senthdrs = 0; 59 rq->srvhdrs = pblock_create_pool(pool, REQ_HASHSIZE); 60 if (!rq->srvhdrs) 61 return 1; 62 63 rq->os = NULL; 64 rq->tmpos = NULL; 65 rq->statpath = NULL; 66 rq->staterr = NULL; 67 rq->finfo = NULL; 68 rq->aclstate = 0; 69 rq->acldirno = 0; 70 rq->aclname = NULL; 71 rq->aclpb = NULL; 72 rq->acllist = NULL; 73 rq->aclreqaccess = 0; 74 rq->request_is_cacheable = 0; 75 rq->directive_is_cacheable = 0; 76 rq->cached_headers = NULL; 77 rq->cached_headers_len = 0; 78 rq->unused = NULL; 79 //rq->req_start = ft_time(); // TODO: ft_time 80 rq->protv_num = 0; 81 rq->method_num = -1; 82 //PR_ASSERT(sizeof(rq->rq_attr) == sizeof(RQATTR)); // TODO: assert 83 *(RQATTR *) &rq->rq_attr = 0; 84 //rq->hostname = pool_strdup(pool, hostname); // TODO: hostname 85 rq->allowed = 0; 86 rq->byterange = 0; 87 rq->status_num = 0; 88 rq->staterrno = 0; 89 rq->orig_rq = rq; 90 91 // TODO: nrq 92 93 /* NSAPI execution context */ 94 nrq->context.last_req_code = REQ_NOACTION; 95 96 nrq->context.objset_index = -1; 97 nrq->context.dtable_index = 0; 98 99 // host and port 100 101 102 nrq->jvm_context = NULL; 103 104 105 // new 106 rq->status_num = -1; 107 rq->vfs = NULL; 108 rq->davCollection = NULL; 109 110 return 0; 111 } 112 113 const VirtualServer* request_get_vs(Request *rq) { 114 return ((NSAPIRequest*)rq)->vs; 115 } 116 117 struct stat* request_stat_path(const char *path, Request *rq) { 118 // TODO: reimplement with vfs support 119 // TODO: use pool 120 struct stat *s = malloc(sizeof(struct stat)); 121 if(stat(path, s)) { 122 free(s); 123 return NULL; 124 } 125 // TODO: statpath and staterror 126 rq->finfo = s; 127 return s; 128 } 129 130 int request_set_path(cxstring root, cxstring path, pblock *vars) { 131 // TODO: maybe replace this code with request_set_path from req.cpp 132 133 // concat path 134 size_t length = root.length + path.length; 135 char *translated_path = alloca(length + 1); 136 memcpy(translated_path, root.ptr, root.length); 137 if(root.ptr[root.length-1] == '/') { 138 memcpy(translated_path + root.length, path.ptr, path.length); 139 } else { 140 translated_path[root.length] = '/'; 141 memcpy(translated_path + root.length + 1, path.ptr, path.length); 142 length++; 143 } 144 145 // add path to specified pblock 146 pblock_kvinsert( 147 pb_key_ppath, 148 translated_path, 149 length, 150 vars); 151 152 pblock_kvinsert(pb_key_ntrans_base, root.ptr, root.length, vars); 153 154 return REQ_PROCEED; 155 } 156 157 void request_free(Request *rq) { 158 // TODO: implement 159 } 160 161 Request* request_restart_internal(const char *uri, Request *rq) { 162 // TODO: implement 163 return NULL; 164 } 165 166 167 char* servact_translate_uri(char *uri, Session *sn) { 168 // TODO: implement 169 return NULL; 170 } 171