Patch from Melchior Franz to add support for indexed property names.
This commit is contained in:
parent
4a40bb1151
commit
463f8bcb50
2 changed files with 55 additions and 4 deletions
|
@ -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;
|
||||||
|
}
|
||||||
|
|
|
@ -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"); }
|
||||||
|
|
Loading…
Add table
Reference in a new issue