/* ====================================================================
 * The Apache Software License, Version 1.1
 *
 * Copyright (c) 2000 The Apache Software Foundation.  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.
 *
 * 3. The end-user documentation included with the redistribution,
 *    if any, must include the following acknowledgment:
 *       "This product includes software developed by the
 *        Apache Software Foundation (http://www.apache.org/)."
 *    Alternately, this acknowledgment may appear in the software itself,
 *    if and wherever such third-party acknowledgments normally appear.
 *
 * 4. The names "Apache" and "Apache Software Foundation" must
 *    not be used to endorse or promote products derived from this
 *    software without prior written permission. For written
 *    permission, please contact apache@apache.org.
 *
 * 5. Products derived from this software may not be called "Apache",
 *    nor may "Apache" appear in their name, without prior written
 *    permission of the Apache Software Foundation.
 *
 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED 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 APACHE SOFTWARE FOUNDATION OR
 * ITS 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.
 * ====================================================================
 *
 * This software consists of voluntary contributions made by many
 * individuals on behalf of the Apache Software Foundation.  For more
 * information on the Apache Software Foundation, please see
 * <http://www.apache.org/>.
 *
 * Portions of this software are based upon public domain software
 * originally written at the National Center for Supercomputing Applications,
 * University of Illinois, Urbana-Champaign.
 */

#include "mod_tcl.h"

extern Tcl_Interp			*interp;
extern apr_array_header_t	*fcache;
extern request_rec			*_r;
extern apr_pool_t			*_pconf;
extern char					*current_namespace;
extern int					read_post_ok;

static int sorted = 0, r_size = 0, connection_size = 0, server_size = 0;

const uint8_t base64[] = {
	"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
};

const uint8_t inv_base64[128] =
{
	255, 255, 255, 255, 255, 255, 255, 255,
	255, 255, 255, 255, 255, 255, 255, 255, 
	255, 255, 255, 255, 255, 255, 255, 255,
	255, 255, 255, 255, 255, 255, 255, 255, 
	255, 255, 255, 255, 255, 255, 255, 255,
	255, 255, 255,  62, 255, 255, 255,  63, 
	52,  53,  54,  55,  56,  57,  58,  59,
	60,  61, 255, 255, 255, 255, 255, 255, 
	255,   0,   1,   2,   3,   4,   5,   6,
	7,   8,   9,  10,  11,  12,  13,  14, 
	15,  16,  17,  18,  19,  20,  21,  22,
	23,  24,  25, 255, 255, 255, 255, 255, 
	255,  26,  27,  28,  29,  30,  31,  32,
	33,  34,  35,  36,  37,  38,  39,  40, 
	41,  42,  43,  44,  45,  46,  47,  48,
	49,  50,  51, 255, 255, 255, 255, 255,
};

static size_t is_base64_buf(uint8_t *buf, size_t buf_len)
{
	size_t i;

	for (i = 0; i < buf_len; i++) {
      /* Accept equal sign. */
		if (buf[i] == '=') {
			continue;
		}
      /* Don't accept anything else which isn't in base64. */
		if (buf[i] > 127) {
			break;
		}

		if (inv_base64[buf[i]] == 255) {
			break;
		}
	}

	return i;
}

static uint8_t* buf_to_base64(const uint8_t *buf, size_t buf_len)
{
	uint8_t *out;
	size_t i, j;
	uint32_t limb;

	out = (uint8_t*) malloc(((buf_len * 8 + 5) / 6) + 5);

	for (i = 0, j = 0, limb = 0; i + 2 < buf_len; i += 3, j += 4) {
		limb =
			((uint32_t) buf[i] << 16) |
			((uint32_t) buf[i + 1] << 8) |
			((uint32_t) buf[i + 2]);

		out[j] = base64[(limb >> 18) & 63];
		out[j + 1] = base64[(limb >> 12) & 63];
		out[j + 2] = base64[(limb >> 6) & 63];
		out[j + 3] = base64[(limb) & 63];
	}
  
	switch (buf_len - i) {
	  case 0:
		break;
	  case 1:
		limb = ((uint32_t) buf[i]);
		out[j++] = base64[(limb >> 2) & 63];
		out[j++] = base64[(limb << 4) & 63];
		out[j++] = '=';
		out[j++] = '=';
		break;
	  case 2:
		limb = ((uint32_t) buf[i] << 8) | ((uint32_t) buf[i + 1]);
		out[j++] = base64[(limb >> 10) & 63];
		out[j++] = base64[(limb >> 4) & 63];
		out[j++] = base64[(limb << 2) & 63];
		out[j++] = '=';
		break;
	  default:
		// something wonkey happened...
		break;
	}

	out[j] = '\0';

	return out;
}

static uint8_t* base64_to_buf(uint8_t *str, size_t *buf_len)
{
	uint8_t *buf;
	int i, j, len;
	uint32_t limb;

	len = strlen((char *) str);
	*buf_len = (len * 6 + 7) / 8;
	buf = (uint8_t*) malloc(*buf_len);
  
	for (i = 0, j = 0, limb = 0; i + 3 < len; i += 4) {
		if (str[i] == '=' || str[i + 1] == '=' || str[i + 2] == '=' || str[i + 3] == '=') {
			if (str[i] == '=' || str[i + 1] == '=') {
				break;
			}
          
			if (str[i + 2] == '=') {
				limb =
					((uint32_t) inv_base64[str[i]] << 6) |
					((uint32_t) inv_base64[str[i + 1]]);
				buf[j] = (uint8_t) (limb >> 4) & 0xff;
				j++;
			}
			else {
				limb =
					((uint32_t) inv_base64[str[i]] << 12) |
					((uint32_t) inv_base64[str[i + 1]] << 6) |
					((uint32_t) inv_base64[str[i + 2]]);
				buf[j] = (uint8_t) (limb >> 10) & 0xff;
				buf[j + 1] = (uint8_t) (limb >> 2) & 0xff;
				j += 2;
			}
		}
		else {
			limb =
				((uint32_t) inv_base64[str[i]] << 18) |
				((uint32_t) inv_base64[str[i + 1]] << 12) |
				((uint32_t) inv_base64[str[i + 2]] << 6) |
				((uint32_t) inv_base64[str[i + 3]]);
          
			buf[j] = (uint8_t) (limb >> 16) & 0xff;
			buf[j + 1] = (uint8_t) (limb >> 8) & 0xff;
			buf[j + 2] = (uint8_t) (limb) & 0xff;
			j += 3;
		}
	}

	*buf_len = j;
  
	return buf;
}

static uint8_t* base64_remove_whitespace(const uint8_t *str, size_t len)
{
	uint8_t *cp;
	size_t i, j;

	if (len == 0) {
		len = strlen((char *) str);
	}
	
	cp = (uint8_t*) malloc(len + 1);

	for (i = 0, j = 0; i < len; i++) {
		if (!(str[i] & 128)) {
			if (inv_base64[str[i]] != 255 || str[i] == '=') {
				cp[j++] = str[i];
			}
		}
	}

	cp[j] = '\0';
  
	return cp;
}

static char* mstrstr(char *haystack, char *needle, size_t n, size_t m)
{
	size_t i;
	
	if (m >= n) {
		if (!memcmp(haystack, needle, n)) {
			return haystack;
		}
		else {
			return NULL;
		}
	}
	
	for (i = 0; (i + m) < n; i++, haystack++) {
		if (!memcmp(haystack, needle, m)) {
			return haystack;
		}
	}
	
	return NULL;
}

static int read_post_data(request_rec *r, Tcl_Interp *interp, char *boundary)
{
	int rc, lpos = 0, blen = strlen(boundary);
	char *lbuf, *ptr;
	long remaining;
	
	if ((rc = ap_setup_client_block(r, REQUEST_CHUNKED_ERROR)) != OK) {
		return rc;
	}
	
	remaining = r->remaining;
	lbuf = (char*) apr_palloc(r->pool, remaining + 1);

	if (ap_should_client_block(r)) {
		char buf[HUGE_STRING_LEN];
		int len_read;
		
//		ap_hard_timeout("read_post_data", r);
		
		while ((len_read = ap_get_client_block(r, buf, sizeof(buf))) > 0) {
//			ap_reset_timeout(r);
			
			memcpy(lbuf + lpos, buf, len_read);
			lpos += len_read;
		}
		
		lbuf[lpos] = '\0';
		
//		ap_kill_timeout(r);
	}
	
	ptr = strstr(lbuf, boundary);
	remaining -= (ptr - lbuf - sizeof(char*));
	lbuf = ptr;
	
	while (1) {
		int i, vlen;
		char *key, *val, *filename, *eptr;
		
		if (!ptr) {
			ap_log_error(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, 0, r->server, "read_post_data(...): bad boundry condition in multipart/form-data");
			return DECLINED;
		}
		
		if ((*(ptr + blen + 1) == '-') && (*(ptr + blen + 1) == '-')) {
			return OK;
		}
		
		lbuf += (blen + 2);
		remaining -= (blen + 2);
		
		eptr = strstr(lbuf, "\r\n\r\n");
		
		if (!eptr) {
			ap_log_error(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, 0, r->server, "read_post_data(...): bad headers in multipart/form-data");
			return DECLINED;
		}
		
		ptr = lbuf;
		
		memset(eptr + 2, 0, 2);
		remaining -= (eptr - lbuf - sizeof(char*));
		lbuf = eptr + 4;
		
		while (*ptr) {
			char *xptr = ap_getword(r->pool, (const char**) &ptr, ' ');
			
			if (!strcmp("Content-Disposition:", xptr)) {
				xptr = strstr(ptr, "name=");
				
				if (!xptr) {
					ap_log_error(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, 0, r->server, "read_post_data(...): bad `Content-Disposition:' header");
					return DECLINED;
				}
				
				xptr += 6;
				
				for (i = 0; xptr[i] != '"'; i++) {
					;
				}
				
				key = (char*) apr_palloc(r->pool, i + 1);
				
				memcpy(key, xptr, i);
				key[i] = '\0';
				
				xptr = strstr(ptr, "filename=");
				
				if (xptr) {
					char *file_key, *file_val;
					
					xptr += 10;
					
					for (i = 0; xptr[i] != '"'; i++) {
						;
					}
					
					file_val = (char*) apr_palloc(r->pool, i + 1);
					
					memcpy(file_val, xptr, i);
					file_val[i] = '\0';
					
					file_key = apr_psprintf(r->pool, "%s_filename", key);
					
					set_varb(interp, "::pram", file_key, file_val, i);
				}
				
				break;
			}
			
			ptr = strstr(ptr, "\r\n");
			ptr += 2;
		}
		
		ptr = mstrstr(lbuf, boundary, remaining, blen);
		
		vlen = (ptr - lbuf) - sizeof(char*);
		
		if (vlen <= 0) {
			val = (char*) malloc(1);
			val[0] = '\0';
			vlen = 0;
		}
		else {
			val = (char*) malloc(vlen + 1);
			
			memcpy(val, lbuf, vlen);
			val[vlen] = '\0';
		}

		set_varb(interp, "::pram", key, val, vlen);
		
		free(val);
		
		lbuf = ptr;
		remaining -= vlen;
	}
	
	return DECLINED;
}

static int read_post(request_rec *r, Tcl_Interp *interp)
{
	int rc;
	const char *val, *key;
	char *rbuf;
	
	if ((rc = ap_setup_client_block(r, REQUEST_CHUNKED_ERROR)) != OK) {
		return rc;
	}
	
	if (ap_should_client_block(r)) {
		char buf[HUGE_STRING_LEN];
		int rsize, len_read, rpos = 0;
		long length = r->remaining;
		
		rbuf = (char*) apr_pcalloc(r->pool, length + 1);
		
//		ap_hard_timeout("read_post", r);
		
		while ((len_read = ap_get_client_block(r, buf, sizeof(buf))) > 0) {
//			ap_reset_timeout(r);
			
			if ((rpos + len_read) > length) {
				rsize = length - rpos;
			}
			else {
				rsize = len_read;
			}
			
			memcpy(rbuf + rpos, buf, rsize);
			rpos += rsize;
		}
		
//		ap_kill_timeout(r);
	}
	
//	ap_log_error(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, r->server, 0, "read_post(...): %u, rbuf = %s", getpid(), rbuf);
	
	while (rbuf && *rbuf && (val = ap_getword(r->pool, (const char**) &rbuf, '&'))) {
		key = ap_getword(r->pool, &val, '=');
		
		ap_unescape_url((char*) key);
		ap_unescape_url((char*) val);
		
		if (!key || !val) {
			ap_log_error(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, 0, r->server, "read_post(...): invalid key or value, key = %s, val = %s", key, val);
			break;
		}
		
		set_var(interp, "::pram", (char*) key, (char*) val);
	}
	
	return OK;
}

static int read_post_init(request_rec *r, Tcl_Interp *interp)
{
	const char *type = apr_table_get(r->headers_in, "Content-Type");
	char *boundary;
	
	if (read_post_ok) {
		read_post_ok = 0;
	}
	else {
		/* already read */
		return OK;
	}
	
	if (!strcmp(type, "application/x-www-form-urlencoded")) {
		return read_post(r, interp);
	}
	else if (strstr(type, "multipart/form-data")) {
		boundary = strstr(type, "boundary=");
		
		if (!boundary) {
			ap_log_error(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, 0, r->server, "read_post_init(...): no boundry in multipart/form-data");
			return DECLINED;
		}
		
		boundary += 9;
		
		return read_post_data(r, interp, boundary);
	}
	else {
		ap_log_error(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, 0, r->server, "read_post_init(...): unknown, Content-Type: %s", type);
		
		return DECLINED;
	}
}

static Tcl_Obj* r_the_request(void)
{
	return Tcl_NewStringObj(_r->the_request, -1);
}

static Tcl_Obj* r_assbackwards(void)
{
	return Tcl_NewIntObj(_r->assbackwards);
}

static Tcl_Obj* r_proxyreq(void)
{
	return Tcl_NewIntObj(_r->proxyreq);
}

static Tcl_Obj* r_header_only(void)
{
	return Tcl_NewIntObj(_r->header_only);
}

static Tcl_Obj* r_protocol(void)
{
	return Tcl_NewStringObj(_r->protocol, -1);
}

static Tcl_Obj* r_proto_num(void)
{
	return Tcl_NewIntObj(_r->proto_num);
}

static Tcl_Obj* r_hostname(void)
{
	return Tcl_NewStringObj(_r->hostname, -1);
}

static Tcl_Obj* r_request_time(void)
{
	return Tcl_NewLongObj(_r->request_time);
}

static Tcl_Obj* r_status_line(void)
{
	return Tcl_NewStringObj(_r->status_line, -1);
}

static Tcl_Obj* r_status(void)
{
	return Tcl_NewIntObj(_r->status);
}

static Tcl_Obj* r_method(void)
{
	return Tcl_NewStringObj(_r->method, -1);
}

static Tcl_Obj* r_method_number(void)
{
	return Tcl_NewIntObj(_r->method_number);
}

static Tcl_Obj* r_allowed(void)
{
	return Tcl_NewIntObj(_r->allowed);
}

/* hasn't been implemented ? */
static Tcl_Obj* r_allowed_xmethods(void)
{
	return Tcl_NewStringObj("", -1);
}

static Tcl_Obj* r_allowed_methods(void)
{
	Tcl_Obj *obj = Tcl_NewObj();
	int i;
	char **method_list = (char**) _r->allowed_methods->method_list->elts;
	
	Tcl_ListObjAppendElement(interp, obj, Tcl_NewIntObj(_r->allowed_methods->method_mask));
	
	for (i = 0; i < _r->allowed_methods->method_list->nelts; i++) {
		Tcl_ListObjAppendElement(interp, obj, Tcl_NewStringObj(method_list[i], -1));
	}
	
	return obj;
}

static Tcl_Obj* r_sent_bodyct(void)
{
	return Tcl_NewIntObj(_r->sent_bodyct);
}

static Tcl_Obj* r_bytes_sent(void)
{
	return Tcl_NewIntObj(_r->bytes_sent);
}

static Tcl_Obj* r_mtime(void)
{
	return Tcl_NewLongObj(_r->mtime);
}

static Tcl_Obj* r_chunked(void)
{
	return Tcl_NewIntObj(_r->chunked);
}

static Tcl_Obj* r_boundary(void)
{
	return Tcl_NewStringObj(_r->boundary, -1);
}

static Tcl_Obj* r_range(void)
{
	return Tcl_NewStringObj(_r->range, -1);
}

static Tcl_Obj* r_clength(void)
{
	return Tcl_NewLongObj(_r->clength);
}

static Tcl_Obj* r_remaining(void)
{
	return Tcl_NewLongObj(_r->remaining);
}

static Tcl_Obj* r_read_length(void)
{
	return Tcl_NewLongObj(_r->read_length);
}

static Tcl_Obj* r_read_body(void)
{
	return Tcl_NewIntObj(_r->read_body);
}

static Tcl_Obj* r_read_chunked(void)
{
	return Tcl_NewIntObj(_r->read_chunked);
}

static Tcl_Obj* r_expecting_100(void)
{
	return Tcl_NewIntObj(_r->expecting_100);
}

static Tcl_Obj* r_headers_in(void)
{
	Tcl_Obj *obj = Tcl_NewObj();
	int i;
	apr_array_header_t *ha = apr_table_elts(_r->headers_in);
	apr_table_entry_t *hte = (apr_table_entry_t*) ha->elts;

	for (i = 0; i < ha->nelts; i++) {
		Tcl_SetVar2Ex(interp, "headers_in", hte[i].key, Tcl_NewStringObj(hte[i].val, -1), 0);
		Tcl_ListObjAppendElement(interp, obj, Tcl_NewStringObj(hte[i].key, -1));
	}
	
	return obj;
}

static Tcl_Obj* r_headers_out(void)
{
	Tcl_Obj *obj = Tcl_NewObj();
	int i;
	apr_array_header_t *ha = apr_table_elts(_r->headers_out);
	apr_table_entry_t *hte = (apr_table_entry_t*) ha->elts;

	for (i = 0; i < ha->nelts; i++) {
		Tcl_SetVar2Ex(interp, "headers_out", hte[i].key, Tcl_NewStringObj(hte[i].val, -1), 0);
		Tcl_ListObjAppendElement(interp, obj, Tcl_NewStringObj(hte[i].key, -1));
	}
	
	return obj;
}

static Tcl_Obj* r_err_headers_out(void)
{
	Tcl_Obj *obj = Tcl_NewObj();
	int i;
	apr_array_header_t *ha = apr_table_elts(_r->err_headers_out);
	apr_table_entry_t *hte = (apr_table_entry_t*) ha->elts;

	for (i = 0; i < ha->nelts; i++) {
		Tcl_SetVar2Ex(interp, "err_headers_out", hte[i].key, Tcl_NewStringObj(hte[i].val, -1), 0);
		Tcl_ListObjAppendElement(interp, obj, Tcl_NewStringObj(hte[i].key, -1));
	}
	
	return obj;
}

/* ap_create_environment() sets ::env */
static Tcl_Obj* r_subprocess_env(void)
{
	Tcl_Obj *obj = Tcl_NewObj();
	int i;
	apr_array_header_t *ha = apr_table_elts(_r->subprocess_env);
	apr_table_entry_t *hte = (apr_table_entry_t*) ha->elts;

	for (i = 0; i < ha->nelts; i++) {
		Tcl_SetVar2Ex(interp, "subprocess_env", hte[i].key, Tcl_NewStringObj(hte[i].val, -1), 0);
		Tcl_ListObjAppendElement(interp, obj, Tcl_NewStringObj(hte[i].key, -1));
	}
	
	return obj;
}

static Tcl_Obj* r_notes(void)
{
	Tcl_Obj *obj = Tcl_NewObj();
	int i;
	apr_array_header_t *ha = apr_table_elts(_r->notes);
	apr_table_entry_t *hte = (apr_table_entry_t*) ha->elts;

	for (i = 0; i < ha->nelts; i++) {
		Tcl_SetVar2Ex(interp, "notes", hte[i].key, Tcl_NewStringObj(hte[i].val, -1), 0);
		Tcl_ListObjAppendElement(interp, obj, Tcl_NewStringObj(hte[i].key, -1));
	}
	
	return obj;
}

static Tcl_Obj* r_content_type(void)
{
	return Tcl_NewStringObj(_r->content_type, -1);
}

static Tcl_Obj* r_handler(void)
{
	return Tcl_NewStringObj(_r->handler, -1);
}

static Tcl_Obj* r_content_encoding(void)
{
	return Tcl_NewStringObj(_r->content_encoding, -1);
}

static Tcl_Obj* r_content_languages(void)
{
	Tcl_Obj *obj = Tcl_NewObj();
	int i;
	char **content_languages = (char**) _r->content_languages->elts;

	for (i = 0; i < _r->content_languages->nelts; i++) {
		Tcl_ListObjAppendElement(interp, obj, Tcl_NewStringObj(content_languages[i], -1));
	}
	
	return obj;
}

static Tcl_Obj* r_vlist_validator(void)
{
	return Tcl_NewStringObj(_r->vlist_validator, -1);
}

static Tcl_Obj* r_user(void)
{
	return Tcl_NewStringObj(_r->user, -1);
}

static Tcl_Obj* r_ap_auth_type(void)
{
	return Tcl_NewStringObj(_r->ap_auth_type, -1);
}

static Tcl_Obj* r_no_cache(void)
{
	return Tcl_NewIntObj(_r->no_cache);
}

static Tcl_Obj* r_no_local_copy(void)
{
	return Tcl_NewIntObj(_r->no_local_copy);
}

static Tcl_Obj* r_unparsed_uri(void)
{
	return Tcl_NewStringObj(_r->unparsed_uri, -1);
}

static Tcl_Obj* r_uri(void)
{
	return Tcl_NewStringObj(_r->uri, -1);
}

static Tcl_Obj* r_filename(void)
{
	return Tcl_NewStringObj(_r->filename, -1);
}

static Tcl_Obj* r_path_info(void)
{
	return Tcl_NewStringObj(_r->path_info, -1);
}

static Tcl_Obj* r_args(void)
{
	return Tcl_NewStringObj(_r->args, -1);
}

static Tcl_Obj* r_parsed_uri(void)
{
	Tcl_Obj *obj = Tcl_NewObj();
	
	Tcl_ListObjAppendElement(interp, obj, Tcl_NewStringObj(_r->parsed_uri.scheme, -1));
	Tcl_ListObjAppendElement(interp, obj, Tcl_NewStringObj(_r->parsed_uri.hostinfo, -1));
	Tcl_ListObjAppendElement(interp, obj, Tcl_NewStringObj(_r->parsed_uri.user, -1));
	Tcl_ListObjAppendElement(interp, obj, Tcl_NewStringObj(_r->parsed_uri.password, -1));
	Tcl_ListObjAppendElement(interp, obj, Tcl_NewStringObj(_r->parsed_uri.hostname, -1));
	Tcl_ListObjAppendElement(interp, obj, Tcl_NewStringObj(_r->parsed_uri.port_str, -1));
	Tcl_ListObjAppendElement(interp, obj, Tcl_NewStringObj(_r->parsed_uri.path, -1));
	Tcl_ListObjAppendElement(interp, obj, Tcl_NewStringObj(_r->parsed_uri.query, -1));
	Tcl_ListObjAppendElement(interp, obj, Tcl_NewStringObj(_r->parsed_uri.fragment, -1));
	
	/* is the rest important? */
	
	return obj;
}

/* variables in r->connection */

static Tcl_Obj* r_connection_remote_ip(void)
{
	return Tcl_NewStringObj(_r->connection->remote_ip, -1);
}

static Tcl_Obj* r_connection_remote_host(void)
{
	return Tcl_NewStringObj(_r->connection->remote_host, -1);
}

static Tcl_Obj* r_connection_remote_logname(void)
{
	return Tcl_NewStringObj(_r->connection->remote_logname, -1);
}

static Tcl_Obj* r_connection_aborted(void)
{
	return Tcl_NewIntObj(_r->connection->aborted);
}

static Tcl_Obj* r_connection_keepalive(void)
{
	return Tcl_NewIntObj(_r->connection->keepalive);
}

static Tcl_Obj* r_connection_keptalive(void)
{
	return Tcl_NewIntObj(_r->connection->keptalive);
}

static Tcl_Obj* r_connection_double_reverse(void)
{
	return Tcl_NewIntObj(_r->connection->double_reverse);
}

static Tcl_Obj* r_connection_keepalives(void)
{
	return Tcl_NewIntObj(_r->connection->keepalives);
}

static Tcl_Obj* r_connection_local_ip(void)
{
	return Tcl_NewStringObj(_r->connection->local_ip, -1);
}

static Tcl_Obj* r_connection_local_host(void)
{
	return Tcl_NewStringObj(_r->connection->local_host, -1);
}

static Tcl_Obj* r_connection_id(void)
{
	return Tcl_NewLongObj(_r->connection->id);
}

static Tcl_Obj* r_connection_notes(void)
{
	Tcl_Obj *obj = Tcl_NewObj();
	int i;
	apr_array_header_t *ha = apr_table_elts(_r->connection->notes);
	apr_table_entry_t *hte = (apr_table_entry_t*) ha->elts;

	for (i = 0; i < ha->nelts; i++) {
		Tcl_SetVar2Ex(interp, "connection_notes", hte[i].key, Tcl_NewStringObj(hte[i].val, -1), 0);
		Tcl_ListObjAppendElement(interp, obj, Tcl_NewStringObj(hte[i].key, -1));
	}
	
	return obj;
}

static Tcl_Obj* r_connection_remain(void)
{
	return Tcl_NewLongObj(_r->connection->remain);
}

static Tcl_Obj* r_server_defn_name(void)
{
	return Tcl_NewStringObj(_r->server->defn_name, -1);
}

static Tcl_Obj* r_server_defn_line_number(void)
{
	return Tcl_NewIntObj(_r->server->defn_line_number);
}

static Tcl_Obj* r_server_server_admin(void)
{
	return Tcl_NewStringObj(_r->server->server_admin, -1);
}

static Tcl_Obj* r_server_server_hostname(void)
{
	return Tcl_NewStringObj(_r->server->server_hostname, -1);
}

static Tcl_Obj* r_server_port(void)
{
	return Tcl_NewIntObj(_r->server->port);
}

static Tcl_Obj* r_server_error_fname(void)
{
	return Tcl_NewStringObj(_r->server->error_fname, -1);
}

static Tcl_Obj* r_server_loglevel(void)
{
	return Tcl_NewIntObj(_r->server->loglevel);
}

static Tcl_Obj* r_server_is_virtual(void)
{
	return Tcl_NewIntObj(_r->server->is_virtual);
}

static Tcl_Obj* r_server_addrs(void)
{
	Tcl_Obj *obj = Tcl_NewObj();
	
	Tcl_ListObjAppendElement(interp, obj, Tcl_NewIntObj(_r->server->addrs->host_port));
	Tcl_ListObjAppendElement(interp, obj, Tcl_NewStringObj(_r->server->addrs->virthost, -1));
	
	return obj;
}

static Tcl_Obj* r_server_timeout(void)
{
	return Tcl_NewIntObj(_r->server->timeout);
}

static Tcl_Obj* r_server_keep_alive_timeout(void)
{
	return Tcl_NewIntObj(_r->server->keep_alive_timeout);
}

static Tcl_Obj* r_server_keep_alive_max(void)
{
	return Tcl_NewIntObj(_r->server->keep_alive_max);
}

static Tcl_Obj* r_server_keep_alive(void)
{
	return Tcl_NewIntObj(_r->server->keep_alive);
}

static Tcl_Obj* r_server_path(void)
{
	return Tcl_NewStringObj(_r->server->path, -1);
}

static Tcl_Obj* r_server_names(void)
{
	Tcl_Obj *obj = Tcl_NewObj();
	int i;
	char **a = (char**) _r->server->names->elts;
	
	for (i = 0; i < _r->server->names->nelts; i++) {
		Tcl_ListObjAppendElement(interp, obj, Tcl_NewStringObj(a[i], -1));
	}
	
	return obj;
}

static Tcl_Obj* r_server_wild_names(void)
{
	Tcl_Obj *obj = Tcl_NewObj();
	int i;
	char **a = (char**) _r->server->wild_names->elts;
	
	for (i = 0; i < _r->server->wild_names->nelts; i++) {
		Tcl_ListObjAppendElement(interp, obj, Tcl_NewStringObj(a[i], -1));
	}
	
	return obj;
}

static Tcl_Obj* r_server_limit_req_line(void)
{
	return Tcl_NewIntObj(_r->server->limit_req_line);
}

static Tcl_Obj* r_server_limit_req_fieldsize(void)
{
	return Tcl_NewIntObj(_r->server->limit_req_fieldsize);
}

static Tcl_Obj* r_server_limit_req_fields(void)
{
	return Tcl_NewIntObj(_r->server->limit_req_fields);
}

/* sets */
static int r_set_the_request(int objc, Tcl_Obj *CONST objv[])
{
	_r->the_request = apr_pstrdup(_r->pool, Tcl_GetString(objv[2]));
	
	return TCL_OK;
}

static int r_set_assbackwards(int objc, Tcl_Obj *CONST objv[])
{
	Tcl_GetIntFromObj(interp, objv[2], &(_r->assbackwards));
	
	return TCL_OK;
}

static int r_set_proxyreq(int objc, Tcl_Obj *CONST objv[])
{
	Tcl_GetIntFromObj(interp, objv[2], &(_r->proxyreq));
	
	return TCL_OK;
}

static int r_set_header_only(int objc, Tcl_Obj *CONST objv[])
{
	Tcl_GetIntFromObj(interp, objv[2], &(_r->header_only));
	
	return TCL_OK;
}

static int r_set_protocol(int objc, Tcl_Obj *CONST objv[])
{
	_r->protocol = apr_pstrdup(_r->pool, Tcl_GetString(objv[2]));
	
	return TCL_OK;
}

static int r_set_proto_num(int objc, Tcl_Obj *CONST objv[])
{
	Tcl_GetIntFromObj(interp, objv[2], &(_r->proto_num));
	
	return TCL_OK;
}

static int r_set_allowed(int objc, Tcl_Obj *CONST objv[])
{
	Tcl_GetIntFromObj(interp, objv[2], &(_r->allowed));
	
	return TCL_OK;
}

/* ? */
static int r_set_allowed_xmethods(int objc, Tcl_Obj *CONST objv[])
{	
	return TCL_OK;
}

static int r_set_allowed_methods(int objc, Tcl_Obj *CONST objv[])
{
	int xxobjc;
	Tcl_Obj **xxobjv;
	int i;
	
	if (objc != 4) {
		Tcl_WrongNumArgs(interp, 2, objv, "method_mask method_list");
		return TCL_ERROR;
	}
	
	Tcl_GetIntFromObj(interp, objv[2], &(_r->allowed_methods->method_mask));
	
	if (Tcl_ListObjGetElements(interp, objv[3], &xxobjc, &xxobjv) == TCL_ERROR) {
		return TCL_ERROR;
	}
	
	_r->allowed_methods->method_list = apr_make_array(_r->allowed_methods->method_list->cont, xxobjc, sizeof(char*));
	
	for (i = 0; i < xxobjc; i++) {
		char *xx = apr_push_array(_r->allowed_methods->method_list);
		
		xx = apr_pstrdup(_r->allowed_methods->method_list->cont, Tcl_GetString(xxobjv[i]));
	}
	
	return TCL_OK;
}

static int r_set_headers_out(int objc, Tcl_Obj *CONST objv[])
{
	if (objc != 4) {
		Tcl_WrongNumArgs(interp, 2, objv, "header_name header");
		return TCL_ERROR;
	}
	
	apr_table_set(_r->headers_out, Tcl_GetString(objv[2]), Tcl_GetString(objv[3]));
	
	return TCL_OK;
}

static int r_set_err_headers_out(int objc, Tcl_Obj *CONST objv[])
{
	if (objc != 4) {
		Tcl_WrongNumArgs(interp, 2, objv, "header_name header");
		return TCL_ERROR;
	}
	
	apr_table_set(_r->err_headers_out, Tcl_GetString(objv[2]), Tcl_GetString(objv[3]));
	
	return TCL_OK;
}

static int r_set_subprocess_env(int objc, Tcl_Obj *CONST objv[])
{
	if (objc != 4) {
		Tcl_WrongNumArgs(interp, 2, objv, "variable_name variable");
		return TCL_ERROR;
	}
	
	apr_table_set(_r->subprocess_env, Tcl_GetString(objv[2]), Tcl_GetString(objv[3]));
	
	return TCL_OK;
}

static int r_set_notes(int objc, Tcl_Obj *CONST objv[])
{
	if (objc != 4) {
		Tcl_WrongNumArgs(interp, 2, objv, "note_name note");
		return TCL_ERROR;
	}
	
	apr_table_set(_r->notes, Tcl_GetString(objv[2]), Tcl_GetString(objv[3]));
	
	return TCL_OK;
}

static int r_set_content_type(int objc, Tcl_Obj *CONST objv[])
{
	_r->content_type = apr_pstrdup(_r->pool, Tcl_GetString(objv[2]));
	
	return TCL_OK;
}

static int r_set_content_encoding(int objc, Tcl_Obj *CONST objv[])
{
	_r->content_encoding = apr_pstrdup(_r->pool, Tcl_GetString(objv[2]));
	
	return TCL_OK;
}

static int r_set_content_languages(int objc, Tcl_Obj *CONST objv[])
{
	int xxobjc;
	Tcl_Obj **xxobjv;
	int i;
	
	if (Tcl_ListObjGetElements(interp, objv[2], &xxobjc, &xxobjv) == TCL_ERROR) {
		return TCL_ERROR;
	}
	
	_r->content_languages = apr_make_array(_r->content_languages->cont, xxobjc, sizeof(char*));
	
	for (i = 0; i < xxobjc; i++) {
		char *xx = apr_push_array(_r->content_languages);
		
		xx = apr_pstrdup(_r->content_languages->cont, Tcl_GetString(xxobjv[i]));
	}
	
	return TCL_OK;
}

static int r_set_vlist_validator(int objc, Tcl_Obj *CONST objv[])
{
	_r->vlist_validator = apr_pstrdup(_r->pool, Tcl_GetString(objv[2]));
	
	return TCL_OK;
}

static int r_set_user(int objc, Tcl_Obj *CONST objv[])
{
	_r->user = apr_pstrdup(_r->pool, Tcl_GetString(objv[2]));
	
	return TCL_OK;
}

static int r_set_ap_auth_type(int objc, Tcl_Obj *CONST objv[])
{
	_r->ap_auth_type = apr_pstrdup(_r->pool, Tcl_GetString(objv[2]));
	
	return TCL_OK;
}

static int r_set_no_cache(int objc, Tcl_Obj *CONST objv[])
{
	Tcl_GetIntFromObj(interp, objv[2], &(_r->no_cache));
	
	return TCL_OK;
}

static int r_set_no_local_copy(int objc, Tcl_Obj *CONST objv[])
{
	Tcl_GetIntFromObj(interp, objv[2], &(_r->no_local_copy));
	
	return TCL_OK;
}

static int r_set_unparsed_uri(int objc, Tcl_Obj *CONST objv[])
{
	_r->unparsed_uri = apr_pstrdup(_r->pool, Tcl_GetString(objv[2]));
	
	return TCL_OK;
}

static int r_set_uri(int objc, Tcl_Obj *CONST objv[])
{
	_r->uri = apr_pstrdup(_r->pool, Tcl_GetString(objv[2]));
	
	return TCL_OK;
}

static int r_set_path_info(int objc, Tcl_Obj *CONST objv[])
{
	_r->path_info = apr_pstrdup(_r->pool, Tcl_GetString(objv[2]));
	
	return TCL_OK;
}

static int r_set_args(int objc, Tcl_Obj *CONST objv[])
{
	_r->args = apr_pstrdup(_r->pool, Tcl_GetString(objv[2]));
	
	return TCL_OK;
}

static int r_set_parsed_uri(int objc, Tcl_Obj *CONST objv[])
{
	Tcl_SetObjResult(interp, Tcl_NewIntObj(ap_parse_uri_components(_r->pool, Tcl_GetString(objv[2]), &(_r->parsed_uri))));
		
	return TCL_OK;
}

static int r_set_connection_notes(int objc, Tcl_Obj *CONST objv[])
{
	if (objc != 4) {
		Tcl_WrongNumArgs(interp, 2, objv, "note_name note");
		return TCL_ERROR;
	}
	
	apr_table_set(_r->connection->notes, Tcl_GetString(objv[2]), Tcl_GetString(objv[3]));
	
	return TCL_OK;
}


typedef Tcl_Obj* (*fy_t)(void);
typedef int (*fx_t)(int objc, Tcl_Obj *CONST objv[]);

typedef struct {
	char	*var;
	fy_t	rd_func;
	fx_t	wr_func;
} r_table;

static int r_find(const void *x, const void *y)
{
	return strcmp(((r_table*) x)->var, ((r_table*) y)->var);
}

r_table r_tbl[] = {
	{ "allowed",			r_allowed,			r_set_allowed			},
	{ "allowed_methods",	r_allowed_methods,	r_set_allowed_methods	},
	{ "allowed_xmethods",	r_allowed_xmethods,	r_set_allowed_xmethods	},
	{ "ap_auth_type",		r_ap_auth_type,		r_set_ap_auth_type		},
	{ "args",				r_args,				r_set_args				},
	{ "assbackwards",		r_assbackwards,		r_set_assbackwards		},
	{ "boundary",			r_boundary,			NULL					},
	{ "bytes_sent",			r_bytes_sent,		NULL					},
	{ "chunked",			r_chunked,			NULL					},
	{ "clength",			r_clength,			NULL					},
	{ "content_encoding",	r_content_encoding,	r_set_content_encoding	},
/*	{ "content_languages",	r_content_languages,r_set_content_languages	}, this is fuct up, and I have no idea why */
	{ "content_type",		r_content_type,		r_set_content_type		},
	{ "err_headers_out",	r_err_headers_out,	r_set_err_headers_out	},
	{ "expecting_100",		r_expecting_100,	NULL					},
	{ "filename",			r_filename,			NULL					},
	{ "handler",			r_handler,			NULL					},
	{ "headers_in",			r_headers_in,		NULL					},
	{ "headers_out",		r_headers_out,		r_set_headers_out		},
	{ "header_only",		r_header_only,		r_set_header_only		},
	{ "hostname",			r_hostname,			NULL					},
	{ "method",				r_method,			NULL					},
	{ "method_number",		r_method_number,	NULL					},
	{ "mtime",				r_mtime,			NULL					},
	{ "notes",				r_notes,			r_set_notes				},
	{ "no_cache",			r_no_cache,			r_set_no_cache			},
	{ "no_local_copy",		r_no_local_copy,	r_set_no_local_copy		},
	{ "parsed_uri",			r_parsed_uri,		r_set_parsed_uri		},
	{ "path_info",			r_path_info,		r_set_path_info			},
	{ "protocol",			r_protocol,			r_set_protocol			},
	{ "proto_num",			r_proto_num,		r_set_proto_num			},
	{ "proxyreq",			r_proxyreq,			r_set_proxyreq			},
	{ "range",				r_range,			NULL					},
	{ "read_body",			r_read_body,		NULL					},
	{ "read_chunked",		r_read_chunked,		NULL					},
	{ "read_length",		r_read_length,		NULL					},
	{ "remaining",			r_remaining,		NULL					},
	{ "request_time",		r_request_time,		NULL					},
	{ "sent_bodyct",		r_sent_bodyct,		NULL					},
	{ "status",				r_status,			NULL					},
	{ "status_line",		r_status_line,		NULL					},
	{ "subprocess_env",		r_subprocess_env,	r_set_subprocess_env	},
	{ "the_request",		r_the_request,		r_set_the_request		},
	{ "unparsed_uri",		r_unparsed_uri,		r_set_unparsed_uri		},
	{ "uri",				r_uri,				r_set_uri				},
	{ "user",				r_user,				r_set_user				},
	{ "vlist_validator",	r_vlist_validator,	r_set_vlist_validator	},
	{ NULL,					NULL,				NULL					}
};

r_table r_connection_tbl[] = {
	{ "remote_ip",			r_connection_remote_ip,			NULL					},
	{ "remote_host",		r_connection_remote_host,		NULL					},
	{ "remote_logname",		r_connection_remote_logname,	NULL					},
	{ "aborted",			r_connection_aborted,			NULL					},
	{ "keepalive",			r_connection_keepalive,			NULL					},
	{ "keptalive",			r_connection_keptalive,			NULL					},
	{ "doublereverse",		r_connection_double_reverse,	NULL					},
	{ "keepalives",			r_connection_keepalives,		NULL					},
	{ "local_ip",			r_connection_local_ip,			NULL					},
	{ "local_host",			r_connection_local_host,		NULL					},
	{ "id",					r_connection_id,				NULL					},
	{ "notes",				r_connection_notes,				r_set_connection_notes	},
	{ "remain",				r_connection_remain,			NULL					},
	{ NULL,					NULL,							NULL					}
};

r_table r_server_tbl[] = {
	{ "defn_name",				r_server_defn_name,				NULL	},
	{ "defn_line_number",		r_server_defn_line_number,		NULL	},
	{ "server_admin",			r_server_server_admin,			NULL	},
	{ "server_hostname",		r_server_server_hostname,		NULL	},
	{ "port",					r_server_port,					NULL	},
	{ "error_fname",			r_server_error_fname,			NULL	},
	{ "loglevel",				r_server_loglevel,				NULL	},
	{ "is_virtual",				r_server_is_virtual,			NULL	},
	{ "addrs",					r_server_addrs,					NULL	},
	{ "timeout",				r_server_timeout,				NULL	},
	{ "keep_alive_timeout",		r_server_keep_alive_timeout,	NULL	},
	{ "keep_alive_max",			r_server_keep_alive_max,		NULL	},
	{ "keep_alive",				r_server_keep_alive,			NULL	},
	{ "path",					r_server_path,					NULL	},
	{ "names",					r_server_names,					NULL	},
	{ "wild_names",				r_server_wild_names,			NULL	},
	{ "limit_req_line",			r_server_limit_req_line,		NULL	},
	{ "limit_req_fieldsize",	r_server_limit_req_fieldsize,	NULL	},
	{ "limit_req_fields",		r_server_limit_req_fields,		NULL	},
	{ NULL,						NULL,							NULL	}
};

int cmd_r(ClientData cd, Tcl_Interp *ixx, int objc, Tcl_Obj *CONST objv[])
{
	char *xx = NULL, *yy = NULL;
	r_table *r_table_ptr, key;
	
	switch (objc) {
	  case 3: yy = Tcl_GetString(objv[2]);
	  case 2: xx = Tcl_GetString(objv[1]);	break;
	  default:
		Tcl_WrongNumArgs(interp, 1, objv, "variable");
		return TCL_ERROR;
	}

	if (!sorted) {
		for (; r_tbl[r_size].var != NULL; r_size++);
		for (; r_connection_tbl[connection_size].var != NULL; connection_size++);
		for (; r_server_tbl[server_size].var != NULL; server_size++);
		
		qsort(r_tbl, r_size, sizeof(r_table), r_find);
		qsort(r_connection_tbl, connection_size, sizeof(r_table), r_find);
		qsort(r_server_tbl, server_size, sizeof(r_table), r_find);
		
		sorted = 1;
	}
	
	if (!strcmp(xx, "server")) {
		if (!yy) {
			Tcl_WrongNumArgs(interp, 2, objv, "variable");
			return TCL_ERROR;
		}
		
		key.var = yy;
		r_table_ptr = (r_table*) bsearch(&key, r_server_tbl, server_size, sizeof(r_table), r_find);
	}
	else if (!strcmp(xx, "connection")) {
		if (!yy) {
			Tcl_WrongNumArgs(interp, 2, objv, "variable");
			return TCL_ERROR;
		}
		
		key.var = yy;
		r_table_ptr = (r_table*) bsearch(&key, r_connection_tbl, connection_size, sizeof(r_table), r_find);
	}
	else {
		key.var = xx;
		r_table_ptr = (r_table*) bsearch(&key, r_tbl, r_size, sizeof(r_table), r_find);
	}
	
	if (!r_table_ptr) {
		char *p;
		
		asprintf(&p, "%s is not known in structure.", xx);
		Tcl_AddObjErrorInfo(interp, p, -1);
		
		free(p);
		
		return TCL_ERROR;
	}
	
	Tcl_SetObjResult(interp, r_table_ptr->rd_func());
	
	return TCL_OK;
}

int cmd_r_set(ClientData cd, Tcl_Interp *ixx, int objc, Tcl_Obj *CONST objv[])
{
	char *xx, *yy;
	r_table *r_table_ptr, key;
	
	switch (objc) {
	  default:
	  case 3: yy = Tcl_GetString(objv[2]);
	  case 2: xx = Tcl_GetString(objv[1]);	break;
	  case 1:
		Tcl_WrongNumArgs(interp, 1, objv, "variable");
		return TCL_ERROR;
	}
	
	if (!sorted) {
		for (; r_tbl[r_size].var != NULL; r_size++);
		for (; r_connection_tbl[connection_size].var != NULL; connection_size++);
		for (; r_server_tbl[server_size].var != NULL; server_size++);
		
		qsort(r_tbl, r_size, sizeof(r_table), r_find);
		qsort(r_connection_tbl, connection_size, sizeof(r_table), r_find);
		qsort(r_server_tbl, server_size, sizeof(r_table), r_find);
		
		sorted = 1;
	}
	
	if (!strcmp(xx, "server")) {
		if (!yy) {
			Tcl_WrongNumArgs(interp, 2, objv, "variable ?variables?");
			return TCL_ERROR;
		}
		
		key.var = yy;
		r_table_ptr = (r_table*) bsearch(&key, r_server_tbl, server_size, sizeof(r_table), r_find);
	}
	else if (!strcmp(xx, "connection")) {
		if (!yy) {
			Tcl_WrongNumArgs(interp, 2, objv, "variable ?variables?");
			return TCL_ERROR;
		}
		
		key.var = yy;
		r_table_ptr = (r_table*) bsearch(&key, r_connection_tbl, connection_size, sizeof(r_table), r_find);
	}
	else {
		key.var = xx;
		r_table_ptr = (r_table*) bsearch(&key, r_tbl, r_size, sizeof(r_table), r_find);
	}
	
	if (!r_table_ptr) {
		char *p;
		
		asprintf(&p, "%s is not known in structure.", xx);
		Tcl_AddObjErrorInfo(interp, p, -1);
		
		free(p);
		
		return TCL_ERROR;
	}
	
	if (r_table_ptr->wr_func) {
		return r_table_ptr->wr_func(objc, objv);
	}
	else {
		Tcl_AddObjErrorInfo(interp, "this variable is not writable", -1);
		return TCL_ERROR;
	}
}

int cmd_read_post(ClientData cd, Tcl_Interp *ixx, int objc, Tcl_Obj *CONST objv[])
{
	if (read_post_init(_r, interp) != OK) {
		ap_log_error(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, 0, _r->server, "cmd_read_post(...): read failed");
		Tcl_AddErrorInfo(interp, "read failed");
		
		return TCL_ERROR;
	}
	
	return TCL_OK;
}

int cmd_abort(ClientData cd, Tcl_Interp *ixx, int objc, Tcl_Obj *CONST objv[])
{
	if (objc == 2) {
		Tcl_AddObjErrorInfo(interp, Tcl_GetString(objv[1]), -1);
	}
	
	return TCL_ERROR;
}

int cmd_random(ClientData cd, Tcl_Interp *ixx, int objc, Tcl_Obj *CONST objv[])
{
	Tcl_SetObjResult(interp, Tcl_NewLongObj(random()));
	
	return TCL_OK;
}

int cmd_srandom(ClientData cd, Tcl_Interp *ixx, int objc, Tcl_Obj *CONST objv[])
{
	int i;
	
	if (objc != 2) {
		Tcl_WrongNumArgs(interp, 1, objv, "integer");
		
		return TCL_ERROR;
	}
	
	Tcl_GetIntFromObj(interp, objv[1], &i);
	srandom((unsigned int) i);
	
	return TCL_OK;
}

int cmd_base64_encode(ClientData cd, Tcl_Interp *ixx, int objc, Tcl_Obj *CONST objv[])
{
	uint8_t *data, *enc_data;
	int length;
	
	if (objc != 2) {
		Tcl_WrongNumArgs(interp, 1, objv, "data");
		
		return TCL_ERROR;
	}
	
	data = Tcl_GetByteArrayFromObj(objv[1], &length);
	enc_data = buf_to_base64(data, length);
	Tcl_SetObjResult(interp, Tcl_NewStringObj((char*) enc_data, -1));
	
	free(enc_data);
	
	return TCL_OK;
}

int cmd_base64_decode(ClientData cd, Tcl_Interp *ixx, int objc, Tcl_Obj *CONST objv[])
{
	uint8_t *enc_data, *ws_data, *data;
	size_t length;
	Tcl_Obj *obj;
	
	if (objc != 2) {
		Tcl_WrongNumArgs(interp, 1, objv, "string");
		
		return TCL_ERROR;
	}
	
	enc_data = (uint8_t*) Tcl_GetString(objv[1]);
	ws_data = base64_remove_whitespace(enc_data, 0);
	data = base64_to_buf(data, &length);
	
	obj = Tcl_NewObj();
	Tcl_SetByteArrayObj(obj, (unsigned char*) data, length);
	
	free(ws_data);
	free(data);
	
	return TCL_OK;
}

/* http_core.h */

int cmd_ap_allow_options(ClientData cd, Tcl_Interp *ixx, int objc, Tcl_Obj *CONST objv[])
{
	Tcl_SetObjResult(ixx, Tcl_NewIntObj(ap_allow_options(_r)));
	
	return TCL_OK;
}

int cmd_ap_allow_overrides(ClientData cd, Tcl_Interp *ixx, int objc, Tcl_Obj *CONST objv[])
{
	Tcl_SetObjResult(ixx, Tcl_NewIntObj(ap_allow_overrides(_r)));
	
	return TCL_OK;
}

int cmd_ap_default_type(ClientData cd, Tcl_Interp *ixx, int objc, Tcl_Obj *CONST objv[])
{
	Tcl_SetObjResult(ixx, Tcl_NewStringObj(ap_default_type(_r), -1));
	
	return TCL_OK;
}

int cmd_ap_document_root(ClientData cd, Tcl_Interp *ixx, int objc, Tcl_Obj *CONST objv[])
{
	Tcl_SetObjResult(ixx, Tcl_NewStringObj(ap_document_root(_r), -1));
	
	return TCL_OK;
}

int cmd_ap_get_remote_host(ClientData cd, Tcl_Interp *ixx, int objc, Tcl_Obj *CONST objv[])
{
	int i;
	
	if (objc != 2) {
		Tcl_WrongNumArgs(interp, 1, objv, "type");
		
		return TCL_ERROR;
	}
	
	Tcl_GetIntFromObj(interp, objv[1], &i);
	Tcl_SetObjResult(ixx, Tcl_NewStringObj(ap_get_remote_host(_r->connection, _r->per_dir_config, i), -1));
	
	return TCL_OK;
}

int cmd_ap_get_remote_logname(ClientData cd, Tcl_Interp *ixx, int objc, Tcl_Obj *CONST objv[])
{
	Tcl_SetObjResult(ixx, Tcl_NewStringObj(ap_get_remote_logname(_r), -1));
	
	return TCL_OK;
}

int cmd_ap_construct_url(ClientData cd, Tcl_Interp *ixx, int objc, Tcl_Obj *CONST objv[])
{
	if (objc != 2) {
		Tcl_WrongNumArgs(interp, 1, objv, "uri");
		
		return TCL_ERROR;
	}
	
	Tcl_SetObjResult(ixx, Tcl_NewStringObj(ap_construct_url(_r->pool, Tcl_GetString(objv[1]), _r), -1));
	
	return TCL_OK;
}

int cmd_ap_get_server_name(ClientData cd, Tcl_Interp *ixx, int objc, Tcl_Obj *CONST objv[])
{
	Tcl_SetObjResult(ixx, Tcl_NewStringObj(ap_get_server_name(_r), -1));
	
	return TCL_OK;
}

int cmd_ap_get_server_port(ClientData cd, Tcl_Interp *ixx, int objc, Tcl_Obj *CONST objv[])
{
	/* int should suffice since ports are usually unsigned short */
	Tcl_SetObjResult(ixx, Tcl_NewIntObj(ap_get_server_port(_r)));
	
	return TCL_OK;
}

int cmd_ap_get_limit_req_body(ClientData cd, Tcl_Interp *ixx, int objc, Tcl_Obj *CONST objv[])
{
	/* ap_get_limit_req_body returns an unsigned long, its possible it could overflow in TCL
	   as it doesn't appear to have any unsigned support... it might be possible to assign it
	   to a double?
	*/
	Tcl_SetObjResult(ixx, Tcl_NewLongObj(ap_get_limit_req_body(_r)));
	
	return TCL_OK;
}

int cmd_ap_get_limit_xml_body(ClientData cd, Tcl_Interp *ixx, int objc, Tcl_Obj *CONST objv[])
{
	Tcl_SetObjResult(ixx, Tcl_NewIntObj(ap_get_limit_xml_body(_r)));
	
	return TCL_OK;
}

int cmd_ap_custom_response(ClientData cd, Tcl_Interp *ixx, int objc, Tcl_Obj *CONST objv[])
{
	int i;
	
	if (objc != 3) {
		Tcl_WrongNumArgs(interp, 1, objv, "status string");
		
		return TCL_ERROR;
	}
	
	Tcl_GetIntFromObj(interp, objv[1], &i);
	ap_custom_response(_r, i, Tcl_GetString(objv[2]));
	
	return TCL_OK;
}

int cmd_ap_exists_config_define(ClientData cd, Tcl_Interp *ixx, int objc, Tcl_Obj *CONST objv[])
{
	if (objc != 1) {
		Tcl_WrongNumArgs(interp, 1, objv, "name");
		
		return TCL_ERROR;
	}
	
	Tcl_SetObjResult(ixx, Tcl_NewIntObj(ap_exists_config_define(Tcl_GetString(objv[1]))));
	
	return TCL_OK;
}

int cmd_ap_auth_type(ClientData cd, Tcl_Interp *ixx, int objc, Tcl_Obj *CONST objv[])
{
	Tcl_SetObjResult(ixx, Tcl_NewStringObj(ap_auth_type(_r), -1));
	
	return TCL_OK;
}

int cmd_ap_auth_name(ClientData cd, Tcl_Interp *ixx, int objc, Tcl_Obj *CONST objv[])
{
	Tcl_SetObjResult(ixx, Tcl_NewStringObj(ap_auth_name(_r), -1));
	
	return TCL_OK;
}

int cmd_ap_satisfies(ClientData cd, Tcl_Interp *ixx, int objc, Tcl_Obj *CONST objv[])
{
	Tcl_SetObjResult(ixx, Tcl_NewIntObj(ap_satisfies(_r)));
	
	return TCL_OK;
}

int cmd_ap_requires(ClientData cd, Tcl_Interp *ixx, int objc, Tcl_Obj *CONST objv[])
{
	int i;
	const apr_array_header_t *a = ap_requires(_r);
	require_line *ra = (require_line*) a->elts;
	Tcl_Obj *obj = Tcl_NewObj();
	
	for (i = 0; i < a->nelts; i++) {
		Tcl_Obj *xobj = Tcl_NewObj();
		
		Tcl_ListObjAppendElement(ixx, xobj, Tcl_NewIntObj(ra[i].method_mask));
		Tcl_ListObjAppendElement(ixx, xobj, Tcl_NewStringObj(ra[i].requirement, -1));
		
		Tcl_ListObjAppendElement(ixx, obj, xobj);
	}
	
	Tcl_SetObjResult(ixx, obj);
	
	return TCL_OK;
}

/* http_log.h */

int cmd_ap_log_error(ClientData cd, Tcl_Interp *ixx, int objc, Tcl_Obj *CONST objv[])
{
	int i, j;
	
	if (objc != 4) {
		Tcl_WrongNumArgs(interp, 1, objv, "level status string");
		
		return TCL_ERROR;
	}
	
	Tcl_GetIntFromObj(interp, objv[1], &i);
	Tcl_GetIntFromObj(interp, objv[2], &j);
	
	ap_log_error(APLOG_MARK, i, j, _r->server, Tcl_GetString(objv[3]));
	
	return TCL_OK;
}

/* http_protocol.h */

int cmd_ap_send_http_header(ClientData cd, Tcl_Interp *ixx, int objc, Tcl_Obj *CONST objv[])
{
	Tcl_Obj *obj;
	
	obj = Tcl_GetVar2Ex(ixx, "content_type", NULL, 0);
	
	if (obj) {
		_r->content_type = Tcl_GetString(obj);
	}
	
	ap_send_http_header(_r);
	
	return TCL_OK;
}

int cmd_ap_send_http_trace(ClientData cd, Tcl_Interp *ixx, int objc, Tcl_Obj *CONST objv[])
{	
	Tcl_SetObjResult(ixx, Tcl_NewIntObj(ap_send_http_trace(_r)));
	
	return TCL_OK;
}

int cmd_ap_send_http_options(ClientData cd, Tcl_Interp *ixx, int objc, Tcl_Obj *CONST objv[])
{	
	Tcl_SetObjResult(ixx, Tcl_NewIntObj(ap_send_http_options(_r)));
	
	return TCL_OK;
}

int cmd_ap_finalize_request_protocol(ClientData cd, Tcl_Interp *ixx, int objc, Tcl_Obj *CONST objv[])
{	
	ap_finalize_request_protocol(_r);
	
	return TCL_OK;
}

int cmd_ap_send_error_response(ClientData cd, Tcl_Interp *ixx, int objc, Tcl_Obj *CONST objv[])
{
	int recursive_error;
	
	if (objc != 2) {
		Tcl_WrongNumArgs(interp, 1, objv, "recursive_error");
		
		return TCL_ERROR;
	}
	
	Tcl_GetIntFromObj(interp, objv[1], &recursive_error);
	
	ap_send_error_response(_r, recursive_error);
	
	return TCL_OK;
}

int cmd_ap_set_content_length(ClientData cd, Tcl_Interp *ixx, int objc, Tcl_Obj *CONST objv[])
{
	apr_off_t length;
	
	if (objc != 2) {
		Tcl_WrongNumArgs(interp, 1, objv, "length");
		
		return TCL_ERROR;
	}
	
	Tcl_GetIntFromObj(interp, objv[1], (int*) &length);
	
	ap_set_content_length(_r, length);
	
	return TCL_OK;
}

int cmd_ap_set_keepalive(ClientData cd, Tcl_Interp *ixx, int objc, Tcl_Obj *CONST objv[])
{	
	Tcl_SetObjResult(ixx, Tcl_NewIntObj(ap_set_keepalive(_r)));
	
	return TCL_OK;
}

int cmd_ap_rationalize_mtime(ClientData cd, Tcl_Interp *ixx, int objc, Tcl_Obj *CONST objv[])
{
	apr_time_t mtime;
	
	if (objc != 2) {
		Tcl_WrongNumArgs(interp, 1, objv, "mtime");
		
		return TCL_ERROR;
	}
	
	Tcl_GetIntFromObj(interp, objv[1], (int*) &mtime);
	
	Tcl_SetObjResult(ixx, Tcl_NewIntObj(ap_rationalize_mtime(_r, mtime)));
	
	return TCL_OK;
}

int cmd_ap_make_etag(ClientData cd, Tcl_Interp *ixx, int objc, Tcl_Obj *CONST objv[])
{
	int i;
	
	if (objc != 2) {
		Tcl_WrongNumArgs(interp, 1, objv, "force_weak");
		
		return TCL_ERROR;
	}
	
	Tcl_GetIntFromObj(interp, objv[1], &i);
	
	Tcl_SetObjResult(ixx, Tcl_NewStringObj(ap_make_etag(_r, i), -1));
	
	return TCL_OK;
}

int cmd_ap_set_etag(ClientData cd, Tcl_Interp *ixx, int objc, Tcl_Obj *CONST objv[])
{	
	ap_set_etag(_r);
	
	return TCL_OK;
}

int cmd_ap_set_last_modified(ClientData cd, Tcl_Interp *ixx, int objc, Tcl_Obj *CONST objv[])
{	
	ap_set_last_modified(_r);
	
	return TCL_OK;
}

int cmd_ap_meets_conditions(ClientData cd, Tcl_Interp *ixx, int objc, Tcl_Obj *CONST objv[])
{	
	Tcl_SetObjResult(ixx, Tcl_NewIntObj(ap_meets_conditions(_r)));
	
	return TCL_OK;
}

/* ... skipping method stuff ... */

int cmd_rputs(ClientData cd, Tcl_Interp *ixx, int objc, Tcl_Obj *CONST objv[])
{
	char *opt = NULL, *data;
	
	switch (objc) {
	  case 3:
		opt = Tcl_GetString(objv[1]);
		data = Tcl_GetString(objv[2]);
		break;
	  case 2:
		data = Tcl_GetString(objv[1]);
		break;
	  default:
		Tcl_WrongNumArgs(interp, 1, objv, "?-nonewline? string");
		return TCL_ERROR;
	}
	
	if (opt && strcmp(opt, "-nonewline")) {
		Tcl_WrongNumArgs(interp, 1, objv, "?-nonewline? string");
		return TCL_ERROR;
	}
	
	ap_rprintf(_r, "%s%s", data, opt ? "" : "\n");
	
	return TCL_OK;
}

int cmd_rwrite(ClientData cd, Tcl_Interp *ixx, int objc, Tcl_Obj *CONST objv[])
{
	char *data = NULL;
	int length;
	
	switch (objc) {
	  case 2:
		data = (char*) Tcl_GetByteArrayFromObj(objv[1], &length);
		break;
	  default:
		Tcl_WrongNumArgs(interp, 1, objv, "data");
		return TCL_ERROR;
	}
	
	ap_rwrite(data, length, _r);
	
	return TCL_OK;
}

int cmd_ap_rflush(ClientData cd, Tcl_Interp *ixx, int objc, Tcl_Obj *CONST objv[])
{	
	ap_rflush(_r);
	
	return TCL_OK;
}

/* skip ap_index_of_response() */

int cmd_ap_get_status_line(ClientData cd, Tcl_Interp *ixx, int objc, Tcl_Obj *CONST objv[])
{
	int status;
	
	if (objc != 2) {
		Tcl_WrongNumArgs(interp, 1, objv, "status");
		
		return TCL_ERROR;
	}
	
	Tcl_GetIntFromObj(interp, objv[1], &status);
	
	Tcl_SetObjResult(ixx, Tcl_NewStringObj(ap_get_status_line(status), -1));
	
	return TCL_OK;
}

int cmd_ap_setup_client_block(ClientData cd, Tcl_Interp *ixx, int objc, Tcl_Obj *CONST objv[])
{
	int read_policy;
	
	if (objc != 2) {
		Tcl_WrongNumArgs(interp, 1, objv, "read_policy");
		
		return TCL_ERROR;
	}
	
	Tcl_GetIntFromObj(interp, objv[1], &read_policy);
	
	Tcl_SetObjResult(ixx, Tcl_NewIntObj(ap_setup_client_block(_r, read_policy)));
	
	return TCL_OK;
}

int cmd_ap_get_client_block(ClientData cd, Tcl_Interp *ixx, int objc, Tcl_Obj *CONST objv[])
{
	int bufsiz;
	char *buffer;
	
	if (objc != 2) {
		Tcl_WrongNumArgs(interp, 1, objv, "bufsiz");
		
		return TCL_ERROR;
	}
	
	Tcl_GetIntFromObj(interp, objv[1], &bufsiz);
	
	buffer = malloc(bufsiz);
	
	bufsiz = ap_get_client_block(_r, buffer, bufsiz);
	
	Tcl_SetObjResult(ixx, Tcl_NewIntObj(bufsiz));
	
	if (bufsiz > 0) {
		Tcl_SetVar2Ex(interp, "R", NULL, Tcl_NewByteArrayObj(buffer, bufsiz), TCL_LEAVE_ERR_MSG);
	}
	
	return TCL_OK;
}

int cmd_ap_discard_request_body(ClientData cd, Tcl_Interp *ixx, int objc, Tcl_Obj *CONST objv[])
{	
	Tcl_SetObjResult(ixx, Tcl_NewIntObj(ap_discard_request_body(_r)));
	
	return TCL_OK;
}

int cmd_ap_note_auth_failure(ClientData cd, Tcl_Interp *ixx, int objc, Tcl_Obj *CONST objv[])
{	
	ap_note_auth_failure(_r);
	
	return TCL_OK;
}

int cmd_ap_note_basic_auth_failure(ClientData cd, Tcl_Interp *ixx, int objc, Tcl_Obj *CONST objv[])
{	
	ap_note_basic_auth_failure(_r);
	
	return TCL_OK;
}

int cmd_ap_note_digest_auth_failure(ClientData cd, Tcl_Interp *ixx, int objc, Tcl_Obj *CONST objv[])
{	
	ap_note_digest_auth_failure(_r);
	
	return TCL_OK;
}

int cmd_ap_get_basic_auth_pw(ClientData cd, Tcl_Interp *ixx, int objc, Tcl_Obj *CONST objv[])
{
	const char *pw;
	int xx;
	
	xx = ap_get_basic_auth_pw(_r, &pw);
	
	Tcl_SetObjResult(ixx, Tcl_NewIntObj(xx));

	if (xx != 0) {
		Tcl_SetVar2Ex(interp, "R", NULL, Tcl_NewStringObj(pw, -1), TCL_LEAVE_ERR_MSG);
	}
	
	return TCL_OK;
}

/* skip ap_set_sub_req_protocol() and ap_finalize_sub_req_protocol() */

int cmd_ap_parse_uri(ClientData cd, Tcl_Interp *ixx, int objc, Tcl_Obj *CONST objv[])
{
	if (objc != 2) {
		Tcl_WrongNumArgs(interp, 1, objv, "uri");
		
		return TCL_ERROR;
	}
	
	ap_parse_uri(_r, Tcl_GetString(objv[1]));
	
	return TCL_OK;
}

/* skip ap_getline(), not sure what it does yet */

int cmd_ap_method_number_of(ClientData cd, Tcl_Interp *ixx, int objc, Tcl_Obj *CONST objv[])
{
	if (objc != 2) {
		Tcl_WrongNumArgs(interp, 1, objv, "method");
		
		return TCL_ERROR;
	}
	
	Tcl_SetObjResult(ixx, Tcl_NewIntObj(ap_method_number_of(Tcl_GetString(objv[1]))));
	
	return TCL_OK;
}

int cmd_ap_method_name_of(ClientData cd, Tcl_Interp *ixx, int objc, Tcl_Obj *CONST objv[])
{
	int methnum;
	
	if (objc != 2) {
		Tcl_WrongNumArgs(interp, 1, objv, "method");
		
		return TCL_ERROR;
	}
	
	Tcl_GetIntFromObj(interp, objv[1], &methnum);
	
	Tcl_SetObjResult(ixx, Tcl_NewStringObj(ap_method_name_of(methnum), -1));
	
	return TCL_OK;
}

/* http_request.h */
 
/* skip sub requests ... */

int cmd_ap_internal_redirect(ClientData cd, Tcl_Interp *ixx, int objc, Tcl_Obj *CONST objv[])
{
	if (objc != 2) {
		Tcl_WrongNumArgs(interp, 1, objv, "uri");
		
		return TCL_ERROR;
	}
	
	ap_internal_redirect(Tcl_GetString(objv[1]), _r);
	
	return TCL_OK;
}

int cmd_ap_internal_redirect_handler(ClientData cd, Tcl_Interp *ixx, int objc, Tcl_Obj *CONST objv[])
{
	if (objc != 2) {
		Tcl_WrongNumArgs(interp, 1, objv, "uri");
		
		return TCL_ERROR;
	}
	
	ap_internal_redirect_handler(Tcl_GetString(objv[1]), _r);
	
	return TCL_OK;
}

int cmd_ap_some_auth_required(ClientData cd, Tcl_Interp *ixx, int objc, Tcl_Obj *CONST objv[])
{
	Tcl_SetObjResult(ixx, Tcl_NewIntObj(ap_some_auth_required(_r)));
	
	return TCL_OK;
}

/* skip ap_is_initial_req() */

int cmd_ap_update_mtime(ClientData cd, Tcl_Interp *ixx, int objc, Tcl_Obj *CONST objv[])
{
	int dependency_mtime;
	
	if (objc != 2) {
		Tcl_WrongNumArgs(interp, 1, objv, "dependency_mtime");
		
		return TCL_ERROR;
	}
	
	Tcl_GetIntFromObj(interp, objv[1], &dependency_mtime);
	
	ap_update_mtime(_r, dependency_mtime);
	
	return TCL_OK;
}

int cmd_ap_allow_methods(ClientData cd, Tcl_Interp *ixx, int objc, Tcl_Obj *CONST objv[])
{
	int reset;
	
	if (objc != 3) {
		Tcl_WrongNumArgs(interp, 1, objv, "reset methods");
		
		return TCL_ERROR;
	}
	
	Tcl_GetIntFromObj(interp, objv[1], &reset);
	
	ap_allow_methods(_r, reset, Tcl_GetString(objv[2]));
	
	return TCL_OK;
}

/* httpd.h */

int cmd_ap_get_server_version(ClientData cd, Tcl_Interp *ixx, int objc, Tcl_Obj *CONST objv[])
{
	Tcl_SetObjResult(ixx, Tcl_NewStringObj(ap_get_server_version(), -1));
	
	return TCL_OK;
}

int cmd_ap_add_version_component(ClientData cd, Tcl_Interp *ixx, int objc, Tcl_Obj *CONST objv[])
{
	if (objc != 2) {
		Tcl_WrongNumArgs(interp, 1, objv, "component");
		
		return TCL_ERROR;
	}
	
	ap_add_version_component(_pconf, Tcl_GetString(objv[1]));
	
	return TCL_OK;
}

int cmd_ap_get_server_built(ClientData cd, Tcl_Interp *ixx, int objc, Tcl_Obj *CONST objv[])
{
	Tcl_SetObjResult(ixx, Tcl_NewStringObj(ap_get_server_built(), -1));
	
	return TCL_OK;
}

/* util_script.h */

int cmd_ap_create_environment(ClientData cd, Tcl_Interp *ixx, int objc, Tcl_Obj *CONST objv[])
{
	char **env;
	int i;
	
	ap_add_cgi_vars(_r);
	ap_add_common_vars(_r);
	
	env = ap_create_environment(_r->pool, _r->subprocess_env);
	
	for (i = 0; env[i]; i++) {
		char *sptr = strchr(env[i], '=');
		
		*sptr = '\0';
		set_var(ixx, "::env", env[i], sptr + 1);
		*sptr = '=';
	}
	
	return TCL_OK;
}
