// . the url being reuqested // . removes &code= facebook cruft bool HttpRequest::getCurrentUrl ( SafeBuf &cu ) { // makre sure we got enough room if ( ! cu.reserve ( m_hostLen + 64 + m_plen + 1 + 1 ) ) return false; // need a "Host: " char *host = m_host; cu.safePrintf("http"); if ( m_isSSL ) cu.pushChar('s'); cu.safePrintf("://%s",host); const char *path = m_path; int32_t plen = m_plen; if ( ! path ) { path = "/"; plen = 1; } // . scan path and change \0 back to = or & // . similar logic in HttpServer.cpp for logging! char *dst = cu.getBufPtr(); const char *src = path; const char *srcEnd = path + plen; char dd = '='; for ( ; src < srcEnd ; src++ , dst++ ) { *dst = *src; if ( *src ) continue; *dst = dd; if ( dd == '=' ) dd = '&'; else dd = '='; } *dst = '\0'; // cut it off at facebook's &code= char *buf = cu.getBufStart(); char *code = strstr( buf,"&code="); if ( ! code ) code = strstr(buf,"?code="); // hack that off if there if ( code ) { *code = '\0'; dst = code; } // update length cu.setLength( dst - cu.getBufStart() ); return true; }
bool HttpRequest::getCurrentUrlPath ( SafeBuf &cup ) { // makre sure we got enough room if ( ! cup.reserve ( m_plen + 1 + 1 ) ) return false; const char *path = m_path; int32_t plen = m_plen; if ( ! path ) { path = "/"; plen = 1; } // . scan path and change \0 back to = or & // . similar logic in HttpServer.cpp for logging! char *dst = cup.getBufPtr(); char *start = dst; const char *src = path; const char *srcEnd = path + plen; // stop if we hit '?' for ( ; src < srcEnd && *src != '?' ; src++ , dst++ ) { *dst = *src; } cup.incrementLength(dst - start); *dst = '\0'; return true; }