예제 #1
0
/**
 * 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;
}
예제 #2
0
// 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;
}
예제 #3
0
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;
}