/* * http-request-analyze.c -- HTTPのrequest lineを解析する(枠組みだけ) * ~yas/syspro/ipc/http-request-analyze.c */ #include /* fprintf() */ #include /* exit() */ #include /* strcmp() */ extern int http_receive_request( FILE *in, char *filename, size_t size ); extern char * chomp( char *str ); extern int string_split( char *str, char del, int *countp, char ***vecp ); extern void free_string_vector( int qc, char **vec ); extern int countchr( char *s, char c ); #define BUFFERSIZE 1024 int main( int argc, char *argv[] ) { char filename[BUFFERSIZE]; int res; if( argc != 1 ) { fprintf(stderr,"Usage: %s < request-filename\n",argv[0] ); exit( 1 ); } res = http_receive_request( stdin, filename, BUFFERSIZE ); if( res ) printf("filename is [%s].\n", filename ); else printf("Bad request.\n"); } int http_receive_request( FILE *in, char *filename, size_t size ) { /* 内容を変更しなさい。*/ char requestline[BUFFERSIZE] ; char rheader[BUFFERSIZE] ; snprintf( filename, size, "NOFILENAME"); if( fgets(requestline,BUFFERSIZE,in) <= 0 ) { printf("No request line.\n"); return( 0 ); } chomp( requestline ); /* remove \r\n */ printf("requestline is [%s]\n",requestline ); while( fgets(rheader,BUFFERSIZE,in) ) { chomp( rheader ); /* remove \r\n */ if( strcmp(rheader,"") == 0 ) break; printf("Ignored: %s\n",rheader ); } if( strchr(requestline,'<') || strstr(requestline,"..") ) { printf("Dangerous request line found.\n"); return( 0 ); } snprintf( filename, size, "%s", "change this." ); return( 1 ); } char * chomp( char *str ) { int len ; len = strlen( str ); if( len>=2 && str[len-2] == '\r' && str[len-1] == '\n' ) { str[len-2] = str[len-1] = 0; } else if( len >= 1 && (str[len-1] == '\r' || str[len-1] == '\n') ) { str[len-1] = 0; } return( str ); } int string_split( char *str, char del, int *countp, char ***vecp ) { char **vec ; int count_max, i, len ; char *s, *p ; if( str == 0 ) return( -1 ); count_max = countchr(str,del)+1 ; vec = malloc( sizeof(char *)*(count_max+1) ); if( vec == 0 ) return( -1 ); for( i=0 ; i