/* DBOX Module Copyright (C) 1994-2000 Daniel Kroening Purpose: */ #include #include #include #include #include #include #include #include #include #include "http.h" #include void httpt::parse_command() { char *t1, *t2, old; method=UNKNOWN; if(command=="") { url=version=""; return; } // // Methode // char *c=strdup(command.c_str()); t2=c; while(*t2!=' ' && *t2!='\t' && *t2!=0) t2++; old=*t2; *t2=0; if(stringcasecmp(command, "GET")==0) method=GET; else if(stringcasecmp(command, "PUT")==0) method=PUT; else if(stringcasecmp(command, "POST")==0) method=POST; *t2=old; while(*t2==' ' || *t2=='\t') t2++; t1=t2; if(t1[0]==0) { url=version=""; free((void *)c); return; } // // URL // while(*t2!=' ' && *t2!='\t' && *t2!=0 && *t2!='?') t2++; old=*t2; *t2=0; url=t1; decode_url(url); *t2=old; if(old=='?') { t1=t2+1; while(*t2!=' ' && *t2!='\t' && *t2!=0) t2++; old=*t2; *t2=0; parse_parameter(t1); *t2=old; } while(*t2==' ' || *t2=='\t') t2++; t1=t2; if(t1[0]==0) { version=""; free(c); return; } // // Version // version=t1; free(c); } void httpt::parse_parameter(char *str) { char *t; parametert p; if(str==NULL) return; t=str; while(*t!=0) { if(*t==-1) *t=' '; t++; } while(str[0]!=0) { t=strchr(str, '='); if(t==NULL) return; *t=0; p.n=parameter; string _name=str; decode_url(_name); p.name=strdup(_name.c_str()); *t='='; str=t+1; string _inhalt; t=strchr(str, '&'); if(t==NULL) { _inhalt=str; str=""; } else { *t=0; _inhalt=str; *t='&'; str=t+1; } decode_url(_inhalt); p.inhalt=strdup(_inhalt.c_str()); parameter=new parametert; *parameter=p; } } const char *httpt::getparameter(const char *name) { return get_parameterfromlist(name, parameter); } const char *httpt::get_parameter(const string &name) { return get_parameterfromlist(name.c_str(), parameter); } const char *httpt::get_header(const char *name) { return get_parameterfromlist(name, header); } const char *httpt::get_parameterfromlist(const char *name, parametert *list) { parametert *p; p=list; while(p!=NULL) { if(stricmp(name, p->name)==0) return p->inhalt; p=p->n; } return NULL; } httpt::httpt() { parameter=header=NULL; method=UNKNOWN; } void httpt::clear() { command=url=version=""; if(parameter!=NULL) { parametert *p; while(parameter!=NULL) { p=parameter->n; free(parameter->name); free(parameter->inhalt); delete parameter; parameter=p; } } } void httpt::basic_auth(char *username, char *password, int maxlen) { const char *header; char buffer[1000], *tptr; int len; username[0]=password[0]=0; header=get_header("Authorization"); if(header==NULL) return; if(strncmp(header, "Basic ", 6)!=0) return; header+=6; len=base64_decode(header, buffer, 999); buffer[len]=0; tptr=strchr(buffer, ':'); if(tptr==NULL) return; *(tptr++)=0; strmaxcpy(username, buffer, maxlen-1); strmaxcpy(password, tptr, maxlen-1); } httpt::~httpt() { clear(); } void httpt::decode_url(string &url) { char mime_data=0; int status=0; const string buffer=url; url=""; for(unsigned i=0; i