static int read_post()

in tcl_cmds.c [395:441]


static int read_post(request_rec *r, Tcl_Interp *interp)
{
	int rc;
	const char *val, *key;
	char *nm_var = apr_psprintf(r->pool, "%s::pram", r->filename);
	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);
		
		while ((len_read = ap_get_client_block(r, buf, sizeof(buf))) > 0) {
			if ((rpos + len_read) > length) {
				rsize = length - rpos;
			}
			else {
				rsize = len_read;
			}
			
			memcpy(rbuf + rpos, buf, rsize);
			rpos += rsize;
		}
	}
	
	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, nm_var, (char*) key, "%s", (char*) val);
	}
	
	return OK;
}