Exemple #1
0
void CrashSender::RedirectFinished() {
  QNetworkReply* reply = qobject_cast<QNetworkReply*>(sender());
  if (!reply) {
    progress_->close();
    return;
  }

  reply->deleteLater();

  QUrl url =
      reply->attribute(QNetworkRequest::RedirectionTargetAttribute).toUrl();
  if (!url.isValid()) {
    progress_->close();
    return;
  }

  // Read the file's data
  QByteArray file_data = file_->readAll();

  // Find a boundary that doesn't exist in the file
  QByteArray boundary;
  forever {
    boundary = "--------------" + QString::number(qrand(), 16).toAscii();
    if (!file_data.contains(boundary)) {
      break;
    }
  }

  QNetworkRequest req(url);
  req.setHeader(QNetworkRequest::ContentTypeHeader,
                "multipart/form-data; boundary=" + boundary);

  // Construct the multipart/form-data
  QByteArray form_data;
  form_data.reserve(file_data.size() + 1024);
  form_data.append("--");
  form_data.append(boundary);
  form_data.append(
      "\nContent-Disposition: form-data; name=\"data\"; "
      "filename=\"data.dmp\"\n");
  form_data.append("Content-Type: application/octet-stream\n\n");
  form_data.append(file_data);
  form_data.append("\n--");
  form_data.append(boundary);
  form_data.append("--");

  progress_->setMaximum(form_data.size());

  // Upload the data
  reply = network_->post(req, form_data);
  connect(reply, SIGNAL(uploadProgress(qint64, qint64)),
          SLOT(UploadProgress(qint64)));
  connect(reply, SIGNAL(finished()), progress_, SLOT(close()));
}
Exemple #2
0
BOOL CHttpRequestSender::WriteTrailingBoundary(HINTERNET hRequest)
{
  BOOL bRet = FALSE;

  CString sText;
  bRet= FormatTrailingBoundary(sText);
  if(!bRet)
    return FALSE;
  
  strconv_t strconv;
  LPCSTR pszText = strconv.t2a(sText);
  if(pszText==NULL)
    return FALSE;

  DWORD dwBytesWritten = 0;
  bRet=InternetWriteFile(hRequest, pszText, (DWORD)strlen(pszText), &dwBytesWritten);
	if(!bRet)
    return FALSE;

  UploadProgress(dwBytesWritten);

  return TRUE;
}
Exemple #3
0
BOOL CHttpRequestSender::WriteAttachmentPart(HINTERNET hRequest, CString sName)
{
  BOOL bRet = FALSE;
    
  /* Write part header */
  CString sHeader;
  bRet= FormatAttachmentPartHeader(sName, sHeader);
  if(!bRet)
  {
    m_Assync->SetProgress(_T("Error formatting attachment part header."), 0);
    return FALSE;
  }
  
  strconv_t strconv;
  LPCSTR pszHeader = strconv.t2a(sHeader);
  if(pszHeader==NULL)
  {
    m_Assync->SetProgress(_T("Error converting attachment part header to ASCII."), 0);
    return FALSE;
  }

  DWORD dwBytesWritten = 0;
  bRet=InternetWriteFile(hRequest, pszHeader, (DWORD)strlen(pszHeader), &dwBytesWritten);
	if(!bRet)
  {
    m_Assync->SetProgress(_T("Error uploading attachment part header."), 0);
    return FALSE;
  }
  UploadProgress(dwBytesWritten);

  /* Write attachment data */

  std::map<CString, CHttpRequestFile>::iterator it = m_Request.m_aIncludedFiles.find(sName);
  if(it==m_Request.m_aIncludedFiles.end())
  {
    m_Assync->SetProgress(_T("Error searching for attachment part name."), 0);
    return FALSE; 
  }

  CString sFileName = it->second.m_sSrcFileName.GetBuffer(0);
  HANDLE hFile = CreateFile(sFileName, 
     GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, NULL, NULL); 
  if(hFile==INVALID_HANDLE_VALUE)
  {    
    m_Assync->SetProgress(_T("Error opening attachment file."), 0);
    return FALSE; 
  }

  BYTE pBuffer[1024];
  DWORD dwBytesRead = 0;
  for(;;)
  {
    if(m_Assync->IsCancelled())
      return FALSE;

    bRet = ReadFile(hFile, pBuffer, 1024, &dwBytesRead, NULL);
    if(!bRet)
    {
      m_Assync->SetProgress(_T("Error reading data from attachment file."), 0);
      CloseHandle(hFile);
      return FALSE;
    }

    if(dwBytesRead==0)
      break; // EOF

    DWORD dwBytesWritten = 0;
    bRet=InternetWriteFile(hRequest, pBuffer, dwBytesRead, &dwBytesWritten);
	  if(!bRet)
    {
      m_Assync->SetProgress(_T("Error uploading attachment part data."), 0);
      return FALSE;
    }
    UploadProgress(dwBytesWritten);
  }

  CloseHandle(hFile);

  /* Write part footer */

  CString sFooter;
  bRet= FormatAttachmentPartFooter(sName, sFooter);
  if(!bRet)
  {
    m_Assync->SetProgress(_T("Error formatting attachment part footer."), 0);
    return FALSE;
  }
  
  LPCSTR pszFooter = strconv.t2a(sFooter);
  if(pszFooter==NULL)
  {
    m_Assync->SetProgress(_T("Error converting attachment part footer to ASCII."), 0);
    return FALSE;
  }

  bRet=InternetWriteFile(hRequest, pszFooter, (DWORD)strlen(pszFooter), &dwBytesWritten);
	if(!bRet)
  {
    m_Assync->SetProgress(_T("Error uploading attachment part footer."), 0);
    return FALSE;
  }
  UploadProgress(dwBytesWritten);

  return TRUE;
}
Exemple #4
0
BOOL CHttpRequestSender::WriteTextPart(HINTERNET hRequest, CString sName)
{
  BOOL bRet = FALSE;
    
  /* Write part header */
  CString sHeader;
  bRet= FormatTextPartHeader(sName, sHeader);
  if(!bRet)
  {
    m_Assync->SetProgress(_T("Error formatting text part header."), 0);
    return FALSE;
  }
  
  strconv_t strconv;
  LPCSTR pszHeader = strconv.t2a(sHeader);
  if(pszHeader==NULL)
  {
    m_Assync->SetProgress(_T("Error converting text part header to ASCII."), 0);
    return FALSE;
  }

  DWORD dwBytesWritten = 0;
  bRet=InternetWriteFile(hRequest, pszHeader, (DWORD)strlen(pszHeader), &dwBytesWritten);
	if(!bRet)
  {
    m_Assync->SetProgress(_T("Error uploading text part header."), 0);
    return FALSE;
  }
  UploadProgress(dwBytesWritten);

  /* Write form data */

  std::map<CString, std::string>::iterator it = m_Request.m_aTextFields.find(sName);
  if(it==m_Request.m_aTextFields.end())
  {
    m_Assync->SetProgress(_T("Error searching for text part header name."), 0);
    return FALSE; 
  }
  
  size_t nDataSize = it->second.length();
  int pos = 0;    
  DWORD dwBytesRead = 0;
  for(;;)
  {
    if(m_Assync->IsCancelled())
    {
      return FALSE;
    }

    dwBytesRead = (DWORD)MIN(1024, nDataSize-pos);    
    if(dwBytesRead==0)
      break; // EOF

    std::string sBuffer = it->second.substr(pos, dwBytesRead);
    
    DWORD dwBytesWritten = 0;
    bRet=InternetWriteFile(hRequest, sBuffer.c_str(), dwBytesRead, &dwBytesWritten);
	  if(!bRet)
    {
      m_Assync->SetProgress(_T("Error uploading text part data."), 0);
      return FALSE;
    }
    UploadProgress(dwBytesWritten);

    pos += dwBytesRead;    
  }

  /* Write part footer */

  CString sFooter;
  bRet= FormatTextPartFooter(sName, sFooter);
  if(!bRet)
  {
    m_Assync->SetProgress(_T("Error formatting text part footer."), 0);
    return FALSE;
  }
  
  LPCSTR pszFooter = strconv.t2a(sFooter);
  if(pszFooter==NULL)
  {
    m_Assync->SetProgress(_T("Error converting text part footer to ASCII."), 0);
    return FALSE;
  }

  bRet=InternetWriteFile(hRequest, pszFooter, (DWORD)strlen(pszFooter), &dwBytesWritten);
	if(!bRet)
  {
    m_Assync->SetProgress(_T("Error uploading text part footer."), 0);
    return FALSE;
  }
  UploadProgress(dwBytesWritten);

  return TRUE;
}