/** * Called by MHD_get_connection_values to add headers to a request obect. * @param cls a pointer to an HttpRequest object. * @param key the header name * @param value the header value */ static int AddHeaders(void *cls, enum MHD_ValueKind kind, const char *key, const char *value) { HttpRequest *request = static_cast<HttpRequest*>(cls); string key_string = key; string value_string = value; request->AddHeader(key, value); return MHD_YES; (void) kind; }
// static HttpRequestParser::ParseRes HttpRequestParser::Parse(HttpRequest& request) { //PluginLog(INFO) << "Parsing\n" << request.data() << "END"; HttpRequestParser::ParseRes previousParseRes = request.parse_res(); HttpRequestParser::ParseStatus status = previousParseRes.status; size_t currentPos = previousParseRes.stoppedAt; const std::string& requestString = request.data(); const char* start = requestString.c_str(); // Oh-oh, we're outside of bounds. Return error. if (currentPos >= requestString.size()) { return HttpRequestParser::ParseRes(HttpRequestParser::ERROR, currentPos); } // Advance to needed position. start += currentPos; StringPiece method; StringPiece url; StringPiece http; size_t pieceLen = 0; while ((status != ERROR) && (status != FINISHED)) { switch (status) { case START: start = requestString.c_str(); status = METHOD; break; case METHOD: { char nextChar = getChar(requestString, currentPos); switch (nextChar) { case '\0': status = FINISHED; break; case ' ': method.m_start = start; method.m_length = pieceLen; currentPos++; start = &requestString[currentPos]; pieceLen = 0; status = URL; break; default: pieceLen++; currentPos++; break; } } break; case URL: { char nextChar = getChar(requestString, currentPos); switch (nextChar) { case '\0': status = FINISHED; break; case ' ': url.m_start = start; url.m_length = pieceLen; currentPos++; start = &requestString[currentPos]; pieceLen = 0; status = HTTP; break; default: pieceLen++; currentPos++; break; } } break; case HTTP: { char nextChar = getChar(requestString, currentPos); switch (nextChar) { case '\0': status = FINISHED; break; case '\r': currentPos++; break; case '\n': http.m_start = start; http.m_length = pieceLen; currentPos++; start = &requestString[currentPos]; pieceLen = 0; status = HEADER; break; default: pieceLen++; currentPos++; break; } } break; case HEADER: { char nextChar = getChar(requestString, currentPos); switch (nextChar) { case '\0': status = FINISHED; break; case '\r': currentPos++; break; case '\n': { StringPiece header; header.m_start = start; header.m_length = pieceLen; request.AddHeader(header); currentPos++; start = &requestString[currentPos]; pieceLen = 0; status = HEADER_NEWLINE; } break; default: pieceLen++; currentPos++; break; } } break; case HEADER_NEWLINE: { char nextChar = getChar(requestString, currentPos); switch (nextChar) { case '\r': currentPos++; break; case '\n': status = FINISHED; break; default: status = HEADER; break; } } break; default: status = MORE_DATA; break; } } HttpRequestParser::ParseRes out(status, currentPos); request.set_request_method(MethodFromStringPiece(method)); request.set_resource_path(url); request.set_http_ver(HttpVerFromStringPiece(http)); request.set_parse_res(out); return out; }
UINT CDropbox::RequestAcceessTokenAsync(void *owner, void* param) { HWND hwndDlg = (HWND)param; CDropbox *instance = (CDropbox*)owner; EnableWindow(GetDlgItem(hwndDlg, IDC_AUTHORIZE), FALSE); SetDlgItemText(hwndDlg, IDC_AUTH_STATUS, TranslateT("in process...")); if (instance->HasAccessToken()) instance->DestroyAcceessToken(); char requestToken[128]; GetDlgItemTextA(hwndDlg, IDC_REQUEST_CODE, requestToken, SIZEOF(requestToken)); char data[1024]; mir_snprintf( data, SIZEOF(data), "grant_type=authorization_code&code=%s", requestToken); HttpRequest *request = new HttpRequest(instance->hNetlibUser, REQUEST_POST, DROPBOX_API_URL "/oauth2/token"); request->AddBasicAuthHeader(DROPBOX_API_KEY, DROPBOX_API_SECRET); request->AddHeader("Content-Type", "application/x-www-form-urlencoded"); request->pData = mir_strdup(data); request->dataLength = (int)strlen(data); mir_ptr<NETLIBHTTPREQUEST> response(request->Send()); delete request; MCONTACT hContact = instance->GetDefaultContact(); if (response) { JSONROOT root(response->pData); if (root) { if (response->resultCode == HTTP_STATUS_OK) { JSONNODE *node = json_get(root, "access_token"); ptrA access_token = ptrA(mir_u2a(json_as_string(node))); db_set_s(NULL, MODULE, "TokenSecret", access_token); if (hContact) { if (db_get_w(hContact, MODULE, "Status", ID_STATUS_OFFLINE) == ID_STATUS_OFFLINE) db_set_w(hContact, MODULE, "Status", ID_STATUS_ONLINE); } instance->RequestAccountInfo(); if (hwndDlg) SetDlgItemText(hwndDlg, IDC_AUTH_STATUS, TranslateT("you have been authorized")); /*else ShowNotification(TranslateT("you have been authorized"), MB_ICONINFORMATION);*/ } else { JSONNODE *node = json_get(root, "error_description"); ptrW error_description(json_as_string(node)); if (hwndDlg) SetDlgItemText(hwndDlg, IDC_AUTH_STATUS, error_description); /*else ShowNotification((wchar_t*)error_description, MB_ICONERROR);*/ } } } else { if (hwndDlg) SetDlgItemText(hwndDlg, IDC_AUTH_STATUS, TranslateT("server does not respond")); HandleHttpResponseError(instance->hNetlibUser, response); } SetDlgItemTextA(hwndDlg, IDC_REQUEST_CODE, ""); return 0; }