[Motta data fra <FORM> med POST]
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAKS_VARIABLE 20
/* Konvertere hex streng til riktig tegn */
char HexTilTegn(char *Hex)
{
char Tegn;
Tegn= (Hex[0]>='A' ? ((Hex[0]&0xdf)-'A')+10 : (Hex[0]-'0'));
Tegn*=16;
Tegn+=(Hex[1]>='A' ? ((Hex[1]&0xdf)-'A')+10 : (Hex[1]-'0'));
return(Tegn);
}
/* Redusere alle %xx til ett tegn */
char *Dekode(char *Streng)
{
int i,j;
for(i=0,j=0; Streng[j]; ++i,++j)
{ Streng[i]=Streng[j];
if(Streng[i]=='%')
{ Streng[i] = HexTilTegn(&Streng[j+1]);
j+=2; } }
Streng[i]='\0';
return(Streng);
}
/* Sette opp liste med variabelnavn og verdier */
char **HenteCgi(void)
{
int AntallBytes,i,AntallPar;
char *Buffer;
char *Strengpeker;
char **ParListe;
char **CgiListe;
/* Kontrollere at ting er som de skal */
if(strcmp(getenv("REQUEST_METHOD"),"POST"))
{ printf("Feil metode\n");
exit(1); }
/* Allokere plass til inndata */
if(!(AntallBytes=atoi(getenv("CONTENT_LENGTH"))))
{ printf("Ingen inndata\n");
exit(1); }
if(!(Buffer=(char*)malloc(AntallBytes+1)))
{ printf("Allokeringsfeil\n");
exit(1); }
/* Lese fra STDIN til allokert plass */
if(!fread(Buffer,AntallBytes,1,stdin))
{ printf("Inndata feil\n");
exit(1); }
Buffer[AntallBytes]='\0';
/* Endre plusser til mellomrom */
for(i=0; Buffer[i]; i++)
if(Buffer[i]=='+')
Buffer[i] =' ';
/* Splitte ved '&' tegn */
ParListe=(char**) malloc(MAKS_VARIABLE*sizeof(char**));
AntallPar=0;
Strengpeker=strtok(Buffer,"&");
while(Strengpeker!=NULL)
{ ParListe[AntallPar++]=strdup(Strengpeker);
Strengpeker=strtok(NULL,"&"); }
ParListe[AntallPar]=NULL; /* NULL-terminere liste */
/* Splitte igjen ved '=' tegn */
CgiListe=(char**) malloc((AntallPar*2+1)*sizeof(char**));
for(i=0; i<AntallPar; i++)
{ Strengpeker=strchr(ParListe[i],'=');
if(Strengpeker!=NULL)
{ *Strengpeker='\0';
CgiListe[i*2+1]=Dekode(strdup(Strengpeker+1)); }
else
CgiListe[i*2+1]=Dekode(strdup(""));
CgiListe[i*2]=strdup(ParListe[i]); }
CgiListe[AntallPar*2]=NULL; /* NULL-terminere liste */
/* Deallokere det vi ikke trenger og returnere */
for(i=0; ParListe[i]; i++) free(ParListe[i]);
free(ParListe);
free(Buffer);
return(CgiListe);
}
int main(void)
{
int i;
char **CgiListe;
/* Fortelle nettleser hva dette er */
printf("content-type: text/html\n\n");
printf("<html><body>\n");
/* Vise og deallokere variabelnavn og verdier */
CgiListe=HenteCgi();
for(i=0; CgiListe[i]; i++)
{ printf("%i: %s<br>\n",i,CgiListe[i]);
free(CgiListe[i]); }
/* Deallokere CgiListe og avslutte */
free(CgiListe);
printf("</body></html>");
fflush(stdout);
return 0;
}