000
08.06.2006, 20:55 Uhr
FunnyDingo
|
Hallo zusammen,
also ich versuche mich nun seit ca. 3 Monaten intensiv an C++ und dachte ich wäre schon recht weit gekommen.
Heute habe ich dann mit Hilfe des Internets versuche eine urldecode()-Funktion zu finden die mit C++-Strings umgehen kann. Besonders weit bin ich nicht gekommen, aber ich bin über dies hier gestolpert:
C++: |
#define H2B(a) ((a) <= '9' ? (a) - '0' : (a) - 55); #define ISXDIGIT(a) (((a) >= '0' && (a) <= '9') || ((a) >= 'A' && (a) <= 'F') || ((a) >= 'a' && (a) <= 'f'))
int url_decode(const char *src, const char *slim, char *dst, char *dlim) { int state = 0, code; char *start = dst;
if (dst >= dlim) { return 0; } dlim--; /* ensure spot for '\0' */
while (src < slim && dst < dlim) { switch (state) { case 0: if (*src == '%') { state = 1; } else { *dst++ = *src; } break; case 1: code = H2B(*src); case 2: if (ISXDIGIT(*src) == 0) { errno = EILSEQ; return -1; } if (state == 2) { *dst++ = (code * 16) + H2B(*src); state = 0; } else { state = 2; } break; } src++; } *dst = '\0'; /* I'll be back */
return dst - start; }
|
Parallel dazu möchte ich euch mal eine Funktion zeigen, die ich selbst geschreiben habe. Sie zerlegt einen HTTP (nicht ganz Protokoll konform) in ein Strukt. Das Strukt selbst spielt nun keine Rolle, sondern es geht ja eher um den Stil des Codes.
C++: |
bool netlib::parse_http_header(string &header_s, struct http_request *httpreq) { /////////////////////////////////// // Explode the header string /////////////////////////////////// vector<string> header = explode(header_s, "\r\n"); /////////////////////////////////// // Check the first line /////////////////////////////////// // The first line ist the request (GET or POST). If it isn't, return false if (header[0].substr(0, 3) == "GET" || header[0].substr(0, 4) == "POST") { if (header[0].substr(0, 3) == "GET") httpreq->method = HTTP_METHOD_GET; else httpreq->method = HTTP_METHOD_POST; // Split the line to get // REQUEST_TYPE URI HTTP_VERSION // (e.g. GET / HTTP/1.1) int pos1 = header[0].find_first_of(" ", 0); int pos2 = header[0].find_first_of(" ", pos1+1); string tmp = header[0].substr(pos1+1, pos2 - pos1 - 1); // Split the tmp URI to get the GET-Params pos1 = tmp.find_first_of("?", 0); if (pos1 == string::npos) { // There are no params. Save the // tmp uri as uri httpreq->uri = tmp; } else { // Save everything bevor ? as uri httpreq->uri = strToLower(tmp.substr(0, pos1)); string params_s = tmp.substr(pos1+1); // Explode the params by & vector<string> params = explode(params_s, "&"); for (int i = 0; i < params.size(); i++) { int pos1 = params[i].find_first_of("="); switch(pos1) { case string::npos: httpreq->params[params[i].substr(0, pos1)] = ""; break; case 0: continue; default: httpreq->params[params[i].substr(0, pos1)] = params[i].substr(pos1+1); break; } } } } else { return false; } /////////////////////////////////// // Check all other lines /////////////////////////////////// httpreq->content_length = 0; for(int i = 1; i < header.size(); i++) { string lower_line = strToLower(header[i]); if (lower_line.substr(0, 11) == "user-agent:") { httpreq->user_agent = header[i].substr(12); continue; } if (lower_line.substr(0, 5) == "host:") { httpreq->host = header[i].substr(6); continue; } if (lower_line.substr(0, 15) == "content-length:") { string tmp = lower_line.substr(16); httpreq->content_length = atoi(tmp.c_str()); continue; } if (i == (header.size() - 1) && httpreq->content_length > 0 && httpreq->method == HTTP_METHOD_POST) { // Explode the params by & vector<string> params = explode(header[i], "&"); for (int x = 0; x < params.size(); x++) { int pos1 = params[x].find_first_of("="); switch(pos1) { case string::npos: string key = url_decode(params[x].substr(0, pos1)); httpreq->params[key] = ""; break; case 0: continue; default: string key = url_decode(params[x].substr(0, pos1)); string value = url_decode(params[x].substr(pos1+1)); httpreq->params[key] = value; break; } } } } return true; } // EndFunc netlib::parse_http_header()
|
Ich finde, das mein Code viel verständlicher aussieht. Denke ich vielleicht (weil ich aus der PHP-Welt komme) zu sehr in "Skript-Sprache"? Ist der Code vielleicht soger ineffektiv? Oder vielleicht glaube ich das auch nur, weil ich den Code selber geschrieben habe und daher besser verstehe was er tut?
Ich würde mich freuen, wenn der ein oder andere da was zu sagen könnte.
lg, Funny -- "Der Computer ist die logische Weiterentwicklung des Menschen: Intelligenz ohne Moral." (John James Osborne)
Meine Website: http://www.funnydingo.de Dieser Post wurde am 08.06.2006 um 20:57 Uhr von FunnyDingo editiert. |