Re: input buffer?

Toby DiPasquale <[email protected]>
Newsgroups gmane.network.mathopd
Message-ID <[email protected]>
Hi all,

	I figured it out. For anyone looking for the body of a POST
request in mathopd, here's how a function in C to get it easily.

NOTE: This function must be called AFTER process_headers(), preferably in
it's own code module, similar to how imap.c, dump.c, dummy.c, redirect.c
and cgi.c are set up.

<code>
/* get the POST body from the stream */
char *get_post_body (struct request *r)
{
	int rv, size;
	char *buffer;

	size = atoi (r->in_content_length);
        input_buffer = malloc (size);
        fcntl (r->cn->fd, F_SETFL, 0);
        rv = recv (r->cn->fd, input_buffer, size, MSG_PEEK);
        if (rv == -1)
        {
                switch (errno) {
                default:
			log_d (
			  "get_post_body: error reading from %d",
			  r->cn->ip);
			lerror ("recv");
		case ECONNRESET:
                	r->cn->action = HC_CLOSING;
                case EAGAIN:
                	return 0;
                }
        }
        if (rv == 0)
        {
                log_d ("get_post_body: body empty");
                r->cn->action = HC_CLOSING;
                return 0;
        }
	fcntl (r->cn->fd, F_SETFL, O_NONBLOCK);
	return buffer;
}
</code>

Hope this helps someone!

<< T o b i a s   D i P a s q u a l e >>
web: http://cbcg.net/
mailto: [email protected]
trade: Software Engineer 
skillset: Linux/BSD/UNIX/C/Java/Ruby

On Wed, 27 Mar 2002, Toby DiPasquale wrote:

> Hi all,
> 
> 	Where is the data from the client request held? What I mean is,
> where does the data get put to be read from the pool and request structs
> in mathopd? What is the preferred method of reading this data and using
> it? For example, consider the following request:
> 
> === BEGIN request =========================
> POST /RPC2 HTTP/1.0
> User-Agent: Frontier/5.1.2 (WinNT)
> Host: betty.userland.com
> Content-Type: text/xml
> Content-length: 181
> 
> <?xml version="1.0"?>
> <methodCall>
> <methodName>examples.getStateName</methodName>
>  <params>
>   <param>
>    <value><i4>41</i4></value>
>   </param>
>  </params>
> </methodCall>
> 
> === END request =========================
> 
> Where, in mathopd, would the portion of the request starting with "<?xml
> version="1.0"?>" be stored? And what is the preferred method of accessing
> that data without SIGSEGV'ing the process every time one of these requests
> comes in?
> 
> << T o b i a s   D i P a s q u a l e >>
> web: http://cbcg.net/
> mailto: [email protected]
> trade: Software Engineer 
> skillset: Linux/BSD/UNIX/C/Java/Ruby
> 
>
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.