1
0
Fork 0

Patch from Melchior Franz to add support for indexed property names.

This commit is contained in:
curt 2002-02-04 21:10:36 +00:00
parent 4a40bb1151
commit 463f8bcb50
2 changed files with 55 additions and 4 deletions

View file

@ -100,6 +100,7 @@ void HttpdChannel::foundTerminator (void) {
unsigned int pos = rest.find( " " ); unsigned int pos = rest.find( " " );
if ( pos != string::npos ) { if ( pos != string::npos ) {
request = rest.substr( 0, pos ); request = rest.substr( 0, pos );
request = urlDecode(request);
} else { } else {
request = "/"; request = "/";
} }
@ -176,6 +177,11 @@ void HttpdChannel::foundTerminator (void) {
for (int i = 0; i < node->nChildren(); i++) { for (int i = 0; i < node->nChildren(); i++) {
SGPropertyNode *child = node->getChild(i); SGPropertyNode *child = node->getChild(i);
string name = child->getName(); string name = child->getName();
if ( node->getChild(name, 1) ) {
char buf[16];
sprintf(buf, "[%d]", child->getIndex());
name += buf;
}
string line = ""; string line = "";
if ( child->nChildren() > 0 ) { if ( child->nChildren() > 0 ) {
line += "<B><A HREF=\""; line += "<B><A HREF=\"";
@ -183,7 +189,7 @@ void HttpdChannel::foundTerminator (void) {
if ( request.substr(request.length() - 1, 1) != (string)"/" ) { if ( request.substr(request.length() - 1, 1) != (string)"/" ) {
line += "/"; line += "/";
} }
line += name; line += urlEncode(name);
line += "\">"; line += "\">";
line += name; line += name;
line += "</A></B>"; line += "</A></B>";
@ -197,7 +203,7 @@ void HttpdChannel::foundTerminator (void) {
if ( request.substr(request.length() - 1, 1) != (string)"/" ) { if ( request.substr(request.length() - 1, 1) != (string)"/" ) {
line += "/"; line += "/";
} }
line += name; line += urlEncode(name);
line += "\">("; line += "\">(";
line += value; line += value;
line += ")</A><BR>"; line += ")</A><BR>";
@ -210,12 +216,12 @@ void HttpdChannel::foundTerminator (void) {
string value = node->getStringValue(); string value = node->getStringValue();
response += "<form method=\"GET\" action=\""; response += "<form method=\"GET\" action=\"";
response += request; response += urlEncode(request);
response += "\">"; response += "\">";
response += "<B>"; response += "<B>";
response += request; response += request;
response += "</B> = "; response += "</B> = ";
response += "<input type=text name=value size=\"5\" value=\""; response += "<input type=text name=value size=\"15\" value=\"";
response += value; response += value;
response += "\" maxlength=2047>"; response += "\" maxlength=2047>";
response += "<input type=submit value=\"update\" name=\"submit\">"; response += "<input type=submit value=\"update\" name=\"submit\">";
@ -249,3 +255,45 @@ void HttpdChannel::foundTerminator (void) {
buffer.remove(); buffer.remove();
} }
// encode everything but "a-zA-Z0-9_.-/"
string HttpdChannel::urlEncode(string s) {
string r = "";
for ( int i = 0; i < (int)s.length(); i++ ) {
if ( isalnum(s[i]) || s[i] == '_' || s[i] == '.'
|| s[i] == '-' || s[i] == '/' ) {
r += s[i];
} else {
char buf[16];
sprintf(buf, "%%%02X", (unsigned char)s[i]);
r += buf;
}
}
return r;
}
string HttpdChannel::urlDecode(string s) {
string r = "";
int max = s.length();
int a, b;
for ( int i = 0; i < max; i++ ) {
if ( s[i] == '+' ) {
r += ' ';
} else if ( s[i] == '%' && i + 2 < max
&& isxdigit(s[i + 1])
&& isxdigit(s[i + 2]) ) {
i++;
a = isdigit(s[i]) ? s[i] - '0' : toupper(s[i]) - 'A' + 10;
i++;
b = isdigit(s[i]) ? s[i] - '0' : toupper(s[i]) - 'A' + 10;
r += (char)(a * 16 + b);
} else {
r += s[i];
}
}
return r;
}

View file

@ -45,6 +45,9 @@ class HttpdChannel : public netChat
netBuffer buffer ; netBuffer buffer ;
string urlEncode(string);
string urlDecode(string);
public: public:
HttpdChannel() : buffer(512) { setTerminator("\r\n"); } HttpdChannel() : buffer(512) { setTerminator("\r\n"); }