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 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 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99
|
/************************************************************************/
/* */
/* Simple io streams using PUT or POST input of a CGI request. */
/* */
/************************************************************************/
# include "appUtilConfig.h"
# include <stdlib.h>
# include <string.h>
# include <unistd.h>
# include <sioCgiIn.h>
# include <appDebugon.h>
typedef struct CgiInputStream
{
int cisContentLength;
int cisConsumed;
int cisExhausted;
} CgiInputStream;
static int sioInCgiClose( void * voidcis )
{ free( voidcis ); return 0; }
static int sioInCgiSeek( void * voidcis,
long pos )
{ LDEB(pos); return -1; }
static int sioInCgiReadBytes( void * voidcis,
unsigned char * buffer,
int count )
{
CgiInputStream * cis= (CgiInputStream *)voidcis;
int done= 0;
if ( cis->cisExhausted )
{ return -1; }
while( done < count && cis->cisConsumed < cis->cisContentLength )
{
int todo= count- done;
int got;
if ( todo > cis->cisContentLength- cis->cisConsumed )
{ todo= cis->cisContentLength- cis->cisConsumed; }
got= read( 0, buffer, todo );
if ( got < 1 )
{ cis->cisExhausted= 1; break; }
done += got; cis->cisConsumed += got; buffer += got;
}
return done;
}
extern SimpleInputStream * sioInCgiOpen( CGIRequest * cgir )
{
SimpleInputStream * sis;
CgiInputStream * cis;
int res;
int null;
long contentLength= 0;
if ( ! cgir->cgirRequestMethod )
{ XDEB(cgir->cgirRequestMethod); return (SimpleInputStream *)0; }
if ( strcmp( cgir->cgirRequestMethod, "POST" ) &&
strcmp( cgir->cgirRequestMethod, "PUT" ) )
{ SDEB(cgir->cgirRequestMethod); return (SimpleInputStream *)0; }
if ( cgir->cgirStdinUsed )
{ LDEB(cgir->cgirStdinUsed); return (SimpleInputStream *)0; }
res= appTagvalGetLongValue( &contentLength, &null,
cgir->cgirEnvironmentValues, "CONTENT_LENGTH" );
if ( res || null )
{ LLDEB(res,null); return (SimpleInputStream *)0; }
cis= malloc( sizeof(CgiInputStream) );
if ( ! cis )
{ XDEB(cis); return (SimpleInputStream *)0; }
cis->cisContentLength= contentLength;
cis->cisConsumed= 0;
cis->cisExhausted= 0;
sis= sioInOpen( (void *)cis,
sioInCgiReadBytes, sioInCgiSeek, sioInCgiClose );
if ( ! sis )
{ XDEB(sis); free( cis ); return (SimpleInputStream *)0; }
cgir->cgirStdinUsed= 1;
return sis;
}
|