You are viewing a plain text version of this content. The canonical link for it is here.
Posted to modules-dev@httpd.apache.org by amol tambe <am...@yahoo.com> on 2006/11/03 14:55:33 UTC

Apache doesn�t close connection with the client

Hello,

I am trying to write a protocol module for Apache
which will encrypt data and send to-from Apache. (I
can not use mod_SSL for some reasons). My module code
builds and loads fine.
After the module is loaded, when I send a simple GET
request to my Apache server as follows
	https://localhost/cgi-bin/hello_name.exe?name=Rhino

I get the expected output from my CGI at the client
but then my client hangs waiting for more
response/data from the server.

Since this is a protocol module, it directly reads
from socket and writes to the socket. The functions
that read and write to a socket respectively are
SSCryptoRead() and SSCryptoWrite(). After I read the
data using SSCryptoRead, I insert it into the buckets
so that is passed to my content generator which is the
CGI (hello_name.exe) as shown in the URL above. Then
in the output filters, I grab the generated data and
encrypt and send it back to the client using function
SSCryptoWrite.

I doubt if my problem could be related to not
inserting and EOS bucket. But I am not sure if I am
supposed to enter an EOS bucket or Apache would do it
for me.
I am also not sure if I need so set something like
KEEP-ALIVE or CLOSE in my request or response. Since
my code is much like SSL, I tried looking up the SSL
code but I could not find anything of help. Can anyone
point me to what might be missing here? Are there any
special steps to be taken while writing a protocol
module? 

An extract of my module code is pasted below...


module AP_MODULE_DECLARE_DATA  ss_module = {
    STANDARD20_MODULE_STUFF,
    NULL,
    NULL,
    ss_config_server_create,
    NULL,
    ss_config_cmds,
    ss_register_hooks
};


static void ss_register_hooks (apr_pool_t *p) {
	ap_register_input_filter  (ss_io_filter,
ss_io_filter_input,  NULL, AP_FTYPE_CONNECTION + 5);
	ap_register_output_filter (ss_io_filter,
ss_io_filter_output, NULL, AP_FTYPE_CONNECTION + 5);
	ap_hook_post_config       (ss_init_Module,           
 NULL, NULL, APR_HOOK_MIDDLE);
	ap_hook_pre_connection   
(ss_hook_pre_connection,NULL,NULL, APR_HOOK_MIDDLE);
}

static apr_status_t ss_io_filter_input(ap_filter_t *f,
apr_bucket_brigade *bb, ap_input_mode_t mode,
apr_read_type_e block, apr_off_t readbytes) {
	.
	.
	.
	len =
SSSecureRead(inctx->filter_ctx->session_ctx->session,
buf, &len);
	if (len > 0) {
		apr_bucket *bucket =
apr_bucket_transient_create(inctx->buffer, len,
f->c->bucket_alloc);
		APR_BRIGADE_INSERT_TAIL(bb, bucket);
	}
	return APR_SUCCESS;
}

static apr_status_t ss_io_filter_output(ap_filter_t
*f, apr_bucket_brigade *bb) {
	.
	.
	.
	while (!APR_BRIGADE_EMPTY(bb)) {
		apr_bucket *bucket = APR_BRIGADE_FIRST(bb);

		if (APR_BUCKET_IS_EOS(bucket) ||
APR_BUCKET_IS_FLUSH(bucket)) {
			if (ss_filter_out_flush(filter_ctx->pWriteptr) < 0)

				status = outctx->rc;
			break;
		}
		else if (AP_BUCKET_IS_EOC(bucket)) {
			if ((status = ap_pass_brigade(f->next, bb)) !=
APR_SUCCESS) 
				return status;
			break;
		}
		else {
			const char *data;
			apr_size_t len;
			/*Read the data from the buckets and write it to
the socket*/
			status = apr_bucket_read(bucket, &data, &len,
rblock);
			res =
SSCryptoWrite(filter_ctx->session_ctx->session, data,
len);
		}
	}

	return APR_SUCCESS;
}

Any suggestions/pointers would be highly appreciated.

Thanks,


Amol


 
____________________________________________________________________________________
Get your email and see which of your friends are online - Right on the New Yahoo.com 
(http://www.yahoo.com/preview)