void HttpClientHandler::handleRequest() { header = QHttpRequestHeader(header_data); // Out(SYS_WEB|LOG_DEBUG) << "Parsing request : " << header.toString() << endl; if (header.method() == "POST") { if (header.hasContentLength()) { request_data.resize(header.contentLength()); state = WAITING_FOR_CONTENT; bytes_read = 0; if (client->bytesAvailable() > 0) readyToRead(); } } else if (header.method() == "GET") { srv->handleGet(this,header); header_data = ""; request_data.resize(0); } else { srv->handleUnsupportedMethod(this); } }
void HttpRequestParser::writeHeader(const QByteArray& ba) { m_error = false; // Parse header m_header = QHttpRequestHeader(ba); QUrl url = QUrl::fromEncoded(m_header.path().toAscii()); m_path = url.path(); // Parse GET parameters QListIterator<QPair<QString, QString> > i(url.queryItems()); while (i.hasNext()) { QPair<QString, QString> pair = i.next(); m_getMap[pair.first] = pair.second; } }
bool HttpServer::readRequestHeader() { #ifdef DEBUG_XMLRPC qDebug() << this << "readRequestHeader()"; #endif // code from qhttp.cpp bool end = false; QByteArray tmp; QByteArray rn("\r\n",2), n("\n",1); while (!end && socket->canReadLine()) { tmp = socket->readLine(); if (tmp == rn || tmp == n || tmp.isEmpty()) end = true; else requestHeaderBody.append( tmp ); } if( !end ) { #ifdef DEBUG_XMLRPC qDebug() << this << "readRequestHeader(): waiting more data, readed" << endl << requestHeaderBody; #endif return false; } requestHeader = QHttpRequestHeader( requestHeaderBody ); requestHeaderBody.clear(); requestBody.clear(); if( requestHeader.isValid() ) { #ifdef DEBUG_XMLRPC qDebug() << this << "readRequestHeader(): header valid" << endl << requestHeader.toString(); #endif return true; } qWarning() << this << "readRequestHeader(): invalid requestHeader, emit parseError()" << endl << requestHeader.toString(); emit parseError( this ); return false; }
QString GoogleTranslateHttp::request(const QString &text, const QString &fromLanguage, const QString &toLanguage) { const QString &word = GoogleTranslateUtil::getSearchWord(text); qDebug() << "Searching " << word << " from = " << fromLanguage << " to = " << toLanguage; QString url = QString("/translate_a/t?client=t&sl="+ fromLanguage + "&tl=" + toLanguage); setHost("www.google.com"); QHttpRequestHeader header = QHttpRequestHeader("POST", url, 1, 1); header.setValue("Host", "www.google.com"); header.setValue("User-Agent", "Mozilla/5.0"); header.setContentLength(word.length()); QByteArray ba("text="); ba.append(word.toUtf8()); QHttp::request(header, ba); loop.exec(); return QString::fromUtf8(readAll()); }
void CEditorWidget::translateIt() { m_Http->abort(); QString text = QString::fromUtf8(QUrl::toPercentEncoding( plainTextEdit_Input->text() )); QString url = QString("/translate_a/t?client=t&sl=" + QString( gGoogleLang[comboBox_LangSrc->currentIndex()].code ) + "&tl=" + QString( gGoogleLang[comboBox_LangDest->currentIndex()].code ) ); QHttpRequestHeader header = QHttpRequestHeader("POST", url, 1, 1); header.setValue("Host", "www.google.com"); header.setValue("User-Agent", "Mozilla/5.0"); header.setValue("Accept-Encoding", "deflate"); header.setContentLength( text.length() ); header.setValue("Connection", "Close"); QByteArray ba("text="); ba.append( text ); m_Http->setHost("www.google.com"); m_Http->request(header,ba); setBlocking( true ); }
void InspectorServerRequestHandlerQt::tcpReadyRead() { QHttpRequestHeader header; bool isWebSocket = false; if (!m_tcpConnection) return; if (!m_endOfHeaders) { while (m_tcpConnection->bytesAvailable() && !m_endOfHeaders) { QByteArray line = m_tcpConnection->readLine(); m_data.append(line); if (line == "\r\n") m_endOfHeaders = true; } if (m_endOfHeaders) { header = QHttpRequestHeader(QString::fromLatin1(m_data)); if (header.isValid()) { m_path = header.path(); m_contentType = header.contentType().toLatin1(); m_contentLength = header.contentLength(); if (header.hasKey("Upgrade") && (header.value("Upgrade") == QLatin1String("WebSocket"))) isWebSocket = true; m_data.clear(); } } } if (m_endOfHeaders) { QStringList pathAndQuery = m_path.split("?"); m_path = pathAndQuery[0]; QStringList words = m_path.split(QString::fromLatin1("/")); if (isWebSocket) { // switch to websocket-style WebSocketService messaging if (m_tcpConnection) { m_tcpConnection->disconnect(SIGNAL(readyRead())); connect(m_tcpConnection, SIGNAL(readyRead()), SLOT(webSocketReadyRead())); QByteArray key3 = m_tcpConnection->read(8); quint32 number1 = parseWebSocketChallengeNumber(header.value("Sec-WebSocket-Key1")); quint32 number2 = parseWebSocketChallengeNumber(header.value("Sec-WebSocket-Key2")); char responseData[16]; generateWebSocketChallengeResponse(number1, number2, (unsigned char*)key3.data(), (unsigned char*)responseData); QByteArray response(responseData, sizeof(responseData)); QHttpResponseHeader responseHeader(101, "WebSocket Protocol Handshake", 1, 1); responseHeader.setValue("Upgrade", header.value("Upgrade")); responseHeader.setValue("Connection", header.value("Connection")); responseHeader.setValue("Sec-WebSocket-Origin", header.value("Origin")); responseHeader.setValue("Sec-WebSocket-Location", ("ws://" + header.value("Host") + m_path)); responseHeader.setContentLength(response.size()); m_tcpConnection->write(responseHeader.toString().toLatin1()); m_tcpConnection->write(response); m_tcpConnection->flush(); if ((words.size() == 4) && (words[1] == QString::fromLatin1("devtools")) && (words[2] == QString::fromLatin1("page"))) { int pageNum = words[3].toInt(); m_inspectorClient = m_server->inspectorClientForPage(pageNum); // Attach remoteFrontendChannel to inspector, also transferring ownership. if (m_inspectorClient) m_inspectorClient->attachAndReplaceRemoteFrontend(new RemoteFrontendChannel(this)); } } return; } if (m_contentLength && (m_tcpConnection->bytesAvailable() < m_contentLength)) return; QByteArray content = m_tcpConnection->read(m_contentLength); m_endOfHeaders = false; QByteArray response; int code = 200; QString text = QString::fromLatin1("OK"); // If no path is specified, generate an index page. if ((m_path == "") || (m_path == "/")) { QString indexHtml = "<html><head><title>Remote Web Inspector</title></head><body><ul>\n"; for (QMap<int, InspectorClientQt* >::const_iterator it = m_server->m_inspectorClients.begin(); it != m_server->m_inspectorClients.end(); ++it) { indexHtml.append(QString("<li><a href=\"/webkit/inspector/inspector.html?page=%1\">%2</li>\n") .arg(it.key()) .arg(it.value()->m_inspectedWebPage->mainFrame()->url().toString())); } indexHtml.append("</ul></body></html>"); response = indexHtml.toLatin1(); } else { QString path = QString(":%1").arg(m_path); QFile file(path); // It seems that there should be an enum or define for these status codes somewhere in Qt or WebKit, // but grep fails to turn one up. // QNetwork uses the numeric values directly. if (file.exists()) { file.open(QIODevice::ReadOnly); response = file.readAll(); } else { code = 404; text = QString::fromLatin1("Not OK"); } } QHttpResponseHeader responseHeader(code, text, 1, 0); responseHeader.setContentLength(response.size()); if (!m_contentType.isEmpty()) responseHeader.setContentType(QString::fromLatin1(m_contentType)); QByteArray asciiHeader = responseHeader.toString().toAscii(); m_tcpConnection->write(asciiHeader); m_tcpConnection->write(response); m_tcpConnection->flush(); m_tcpConnection->close(); return; } }