support headers in uri parser; slight reformatting

git-svn-id: http://svn.berlios.de/svnroot/repos/sems/trunk@1463 8eb893ce-cfd4-0310-b710-fb5ebe64c474
sayer/1.4-spce2.6
Stefan Sayer 17 years ago
parent eba6b14da0
commit d651b6a7b0

@ -160,17 +160,20 @@ static inline int skip_uri(const string& s, unsigned int pos)
}
return p;
}
#define uS0 0 // start
#define uS1 1 // protocol
#define uS2 2 // user / host
#define uS3 3 // host
#define uS3WSP 4 // wsp after host
#define uS4 5 // port
#define uS4WSP 6 // wsp after port
#define uS5 7 // params
#define uS5WSP 8 // wsp after params
#define uS6 9 // end
enum {
uS0= 0, // start
uSPROT, // protocol
uSUHOST, // user / host
uSHOST, // host
uSHOSTWSP, // wsp after host
uSPORT, // port
uSPORTWSP, // wsp after port
uSHDR, // header
uSHDRWSP, // wsp after header
uSPARAM, // params
uSPARAMWSP, // wsp after params
uS6 // end
};
/**
* parse uri into user, host, port, param
*
@ -191,101 +194,109 @@ bool AmUriParser::parse_uri() {
switch(st) {
case uS0: {
switch (c) {
case '<': { st = uS1; } break;
case '<': { st = uSPROT; } break;
default: {
if ((eq<=4)&&(toupper(c) ==sip_prot[eq]))
eq++;
if (eq==4) { // found sip:
st = uS2; p1 = pos;
st = uSUHOST; p1 = pos;
};
} break;
};
} break;
case uS1: {
if (c == ':') { st = uS2; p1 = pos;}
case uSPROT: {
if (c == ':') { st = uSUHOST; p1 = pos;}
} break;
case uS2: {
case uSUHOST: {
switch(c) {
case '@': {
uri_user = uri.substr(p1+1, pos-p1-1);
st = uS3; p1 = pos;
} ; break;
case ':': {
uri_host = uri.substr(p1+1, pos-p1-1);
st = uS4; p1 = pos;
}; break;
case ';': {
uri_host = uri.substr(p1+1, pos-p1-1);
st = uS5; p1 = pos;
}; break;
case '>': {
uri_host = uri.substr(p1+1, pos-p1-1);
st = uS6; p1 = pos;
}; break;
}
case '@': { uri_user = uri.substr(p1+1, pos-p1-1);
st = uSHOST; p1 = pos; }; break;
case ':': { uri_host = uri.substr(p1+1, pos-p1-1);
st = uSPORT; p1 = pos; }; break;
case '?': { uri_host = uri.substr(p1+1, pos-p1-1);
st = uSHDR; p1 = pos; }; break;
case ';': { uri_host = uri.substr(p1+1, pos-p1-1);
st = uSPARAM;p1 = pos; }; break;
case '>': { uri_host = uri.substr(p1+1, pos-p1-1);
st = uS6; p1 = pos; }; break;
};
} break;
case uS3: {
case uSHOST: {
switch (c) {
case ':': { uri_host = uri.substr(p1+1, pos-p1-1);
st = uS4; p1 = pos; }
break;
st = uSPORT; p1 = pos; } break;
case '?': { uri_host = uri.substr(p1+1, pos-p1-1);
st = uSHDR; p1 = pos; } break;
case ';': { uri_host = uri.substr(p1+1, pos-p1-1);
st = uS5; p1 = pos; }
break;
st = uSPARAM; p1 = pos; } break;
case '>': { uri_host = uri.substr(p1+1, pos-p1-1);
st = uS6; p1 = pos; }
break;
st = uS6; p1 = pos; } break;
case ' ':
case '\t': { uri_host = uri.substr(p1+1, pos-p1-1);
st = uS3WSP; p1 = pos; }
st = uSHOSTWSP; p1 = pos; }
break;
};
} break;
case uS3WSP: {
case uSHOSTWSP: {
switch (c) {
case ':': { st = uS4; p1 = pos; }
break;
case ';': { st = uS5; p1 = pos; }
break;
case '>': { st = uS6; p1 = pos; }
}
case uS4: {
case ':': { st = uSPORT; p1 = pos; } break;
case '?': { st = uSHDR; p1 = pos; } break;
case ';': { st = uSPARAM; p1 = pos; } break;
case '>': { st = uS6; p1 = pos; } break;
}
}; break;
case uSPORT: {
switch (c) {
case ';': { uri_port = uri.substr(p1+1, pos-p1-1);
st = uS5; p1 = pos; }
break;
st = uSPARAM; p1 = pos; } break;
case '?': { uri_port = uri.substr(p1+1, pos-p1-1);
st = uSHDR; p1 = pos; } break;
case '>': { uri_port = uri.substr(p1+1, pos-p1-1);
st = uS6; p1 = pos; }
break;
};
st = uS6; p1 = pos; } break;
case ' ':
case '\t':
{ uri_port = uri.substr(p1+1, pos-p1-1);
st = uS4WSP; p1 = pos; }
break;
case '\t':{ uri_port = uri.substr(p1+1, pos-p1-1);
st = uSPORTWSP; p1 = pos; } break;
};
} break;
case uS4WSP: {
case uSPORTWSP: {
switch (c) {
case ';': { st = uS5; p1 = pos; }
break;
case '>': { st = uS6; p1 = pos; }
break;
case '?': { st = uSHDR; p1 = pos; } break;
case ';': { st = uSPARAM; p1 = pos; } break;
case '>': { st = uS6; p1 = pos; } break;
};
} break;
case uS5: {
case uSHDR: {
switch (c) {
case ';': { uri_headers = uri.substr(p1+1, pos-p1-1);
st = uSPARAM; p1 = pos; }; break;
case '>': { uri_headers = uri.substr(p1+1, pos-p1-1);
st = uS6; p1 = pos; } break;
case '\t':
case ' ': { uri_headers = uri.substr(p1+1, pos-p1-1);
st = uSHDRWSP; p1 = pos; } break;
}
} break;
case uSHDRWSP: {
switch (c) {
case ';': { st = uSPARAM; p1 = pos; }; break;
case '>': { st = uS6; p1 = pos; } break;
}
} break;
case uSPARAM: {
switch (c) {
case '>': { uri_param = uri.substr(p1+1, pos-p1-1);
st = uS6; p1 = pos; }
break;
st = uS6; p1 = pos; } break;
case '\t':
case ' ': { uri_param = uri.substr(p1+1, pos-p1-1);
st = uS5WSP; p1 = pos; }
break; };
st = uSPARAMWSP; p1 = pos; } break;
};
} break;
case uS5WSP: {
case uSPARAMWSP: {
switch (c) {
case '>': { st = uS6; p1 = pos; }
break;
case '>': { st = uS6; p1 = pos; } break;
};
} break;
};
@ -293,12 +304,13 @@ bool AmUriParser::parse_uri() {
pos++;
}
switch(st) {
case uS2:
case uS3: uri_host = uri.substr(p1+1, pos-p1-1); break;
case uS4: uri_port = uri.substr(p1+1, pos-p1-1); break;
case uS5: uri_param = uri.substr(p1+1, pos-p1-1); break;
case uSUHOST:
case uSHOST: uri_host = uri.substr(p1+1, pos-p1-1); break;
case uSPORT: uri_port = uri.substr(p1+1, pos-p1-1); break;
case uSHDR: uri_headers = uri.substr(p1+1, pos-p1-1); break;
case uSPARAM: uri_param = uri.substr(p1+1, pos-p1-1); break;
case uS0:
case uS1: { DBG("ERROR while parsing uri\n"); return false; } break;
case uSPROT: { DBG("ERROR while parsing uri\n"); return false; } break;
};
return true;
}
@ -307,7 +319,7 @@ bool AmUriParser::parse_uri() {
#define pS1 1 // name
#define pS2 2 // val
/**
* parse params int param map
* parse params in param map
*
*/
bool AmUriParser::parse_params(const string& line, int& pos) {
@ -376,6 +388,7 @@ void AmUriParser::dump() {
DBG(" uri_user '%s'\n", uri_user.c_str());
DBG(" uri_host '%s'\n", uri_host.c_str());
DBG(" uri_port '%s'\n", uri_port.c_str());
DBG(" uri_hdr '%s'\n", uri_headers.c_str());
DBG(" uri_param '%s'\n", uri_param.c_str());
for (map<string, string>::iterator it = params.begin();
it != params.end(); it++)

@ -37,6 +37,7 @@ struct AmUriParser {
string uri_user;
string uri_host;
string uri_port;
string uri_headers;
string uri_param;
map<string, string> params;

Loading…
Cancel
Save