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())); }
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; }
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; }
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; }