/*! Loads a network request, \a req, into this frame. \note The view remains the same until enough data has arrived to display the new url. */ void QWebFrame::load(const QWebNetworkRequest &req) { if (d->parentFrame()) d->page->d->insideOpenCall = true; QUrl url = ensureAbsoluteUrl(req.url()); QHttpRequestHeader httpHeader = req.httpHeader(); QByteArray postData = req.postData(); WebCore::ResourceRequest request(url); QString method = httpHeader.method(); if (!method.isEmpty()) request.setHTTPMethod(method); QList<QPair<QString, QString> > values = httpHeader.values(); for (int i = 0; i < values.size(); ++i) { const QPair<QString, QString> &val = values.at(i); request.addHTTPHeaderField(val.first, val.second); } if (!postData.isEmpty()) request.setHTTPBody(WebCore::FormData::create(postData.constData(), postData.size())); d->frame->loader()->load(request, false); if (d->parentFrame()) d->page->d->insideOpenCall = false; }
/*---------------------------------------------------------------------------*/ QVariant HttpRecognizer::comment( IConnection* connection ) { Q_ASSERT (connection); if (!mConnections.contains( connection->networkInfo() )) return "No comment yet"; const HttpConnection con = mConnections.value( connection->networkInfo() ); const QHttpRequestHeader request = con.lastRequestHeader(); const QHttpResponseHeader response = con.lastResponseHeader(); return request.method() + " " + request.value( "host" ) + request.path() + (response.isValid() ? "\nHTTP " + QString::number( response.statusCode() ) + " " + response.reasonPhrase() : "" ); }
void MainWidget::request( QTcpSocket *id, const QHttpRequestHeader &header ) { mpMessageBuffer->addItem( header.toString() ); while( mpMessageBuffer->count() > 200 ) { QListWidgetItem *item = mpMessageBuffer->takeItem( 0 ); if( item ) { delete item; } } mpMessageBuffer->scrollToBottom(); #if 0 if( header.path() == "/favicon.ico" ) { QFile file( ":/favicon.ico" ); file.open( QIODevice::ReadOnly | QIODevice::Text ); emit response( id, QHttpResponseHeader( 200, "OK" ), file.readAll() ); file.close(); return; } #endif if( header.path() == "/wait" ) { mDelayList.append( id ); return; } if( header.path() == "/get" ) { QString reply( "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n" "<response>\n" " <reply>%1</reply>\n" " <artist>%2</artist>\n" " <title>%3</title>\n" " <album>%4</album>\n" " <track>%5</track>\n" "</response>\n" ); QByteArray replyMsg( reply.arg( Qt::escape( QString::fromUtf8(mMsg.constData()) ), Qt::escape( mTrackInfo.mArtist ), Qt::escape( mTrackInfo.mTitle ), Qt::escape( mTrackInfo.mAlbum ), QString::number(mTrackInfo.mTrackNr) ).toUtf8() ); emit response( id, QHttpResponseHeader( 200, "OK XML" ), replyMsg ); return; } QString html("<html>\n<head>\n<title>%1</title>\n" "<meta http-equiv='content-type' content='text/html; charset=UTF-8'>\n" "<link rel='shortcut icon' href='/favicon.ico' type='image/x-icon'>\n" "<script src='ajax.js' type='text/javascript'>\n" "</script>\n" "</head>\n<body>\n" "<h1>%2</h1>\n" "<p>HTTP Request: %3 %4</p>\n" "<table border='1'>\n" "<tr valign='top'><td>Artist:</td><td><textarea cols='80' rows='1' name='artist' wrap='off' readonly></textarea></td></tr>\n" "<tr valign='top'><td>Title:</td><td><textarea cols='80' rows='1' name='title' wrap='off' readonly></textarea></td></tr>\n" "<tr valign='top'><td>Album:</td><td><textarea cols='80' rows='1' name='album' wrap='off' readonly></textarea></td></tr>\n" "<tr valign='top'><td>Track:</td><td><textarea cols='80' rows='1' name='track' wrap='off' readonly></textarea></td></tr>\n" "<tr valign='top'><td>Reply:</td><td><textarea cols='80' rows='5' name='reply' wrap='off' readonly></textarea></td></tr>\n" "<tr valign='top'><td>Status:</td><td><input name='status' size='12' readonly>" "<input type='button' value='refresh' onclick='loadFields();'></td></tr>\n" "</table></body></html>\n" ); html = html.arg( QApplication::organizationName() + ": " + QApplication::applicationName(), QApplication::organizationName() + ": " + QApplication::applicationName(), header.method(), header.path() ); emit response( id, QHttpResponseHeader( 200, "OK" ), html.toUtf8() ); }
/*! * Handles incoming HTTP requests and dispatches them to the appropriate service. * * The \a requestID is an opaque value generated by the connector. * * Subclasses may override this function to perform preprocessing on each * request, but they must call the base class implementation in order to * generate and dispatch the appropriate events. * * To facilitate use with multi-threaded applications, the event will remain * valid until a response is posted. */ void QxtHttpSessionManager::incomingRequest(quint32 requestID, const QHttpRequestHeader& header, QxtWebContent* content) { QMultiHash<QString, QString> cookies; foreach(const QString& cookie, header.allValues("cookie")) // QHttpHeader is case-insensitive, thankfully { foreach(const QString& kv, cookie.split("; ")) { int pos = kv.indexOf('='); if (pos == -1) continue; cookies.insert(kv.left(pos), kv.mid(pos + 1)); } } int sessionID; QString sessionCookie = cookies.value(qxt_d().sessionCookieName); qxt_d().sessionLock.lock(); if (qxt_d().sessionKeys.contains(sessionCookie)) { sessionID = qxt_d().sessionKeys[sessionCookie]; if(!sessionID && header.majorVersion() > 0 && qxt_d().autoCreateSession) sessionID = newSession(); } else if (header.majorVersion() > 0 && qxt_d().autoCreateSession) { sessionID = newSession(); } else { sessionID = 0; } QIODevice* device = connector()->getRequestConnection(requestID); QxtHttpSessionManagerPrivate::ConnectionState& state = qxt_d().connectionState[device]; state.sessionID = sessionID; state.httpMajorVersion = header.majorVersion(); state.httpMinorVersion = header.minorVersion(); if (state.httpMajorVersion == 0 || (state.httpMajorVersion == 1 && state.httpMinorVersion == 0) || header.value("connection").toLower() == "close") state.keepAlive = false; else state.keepAlive = true; qxt_d().sessionLock.unlock(); QxtWebRequestEvent* event = new QxtWebRequestEvent(sessionID, requestID, QUrl::fromEncoded(header.path().toUtf8())); qxt_d().eventLock.lock(); qxt_d().pendingRequests.insert(QPair<int,int>(sessionID, requestID), event); qxt_d().eventLock.unlock(); QTcpSocket* socket = qobject_cast<QTcpSocket*>(device); if (socket) { event->remoteAddress = socket->peerAddress(); #if defined(QT_SECURETRANSPORT) || !defined(QT_NO_OPENSSL) QSslSocket* sslSocket = qobject_cast<QSslSocket*>(socket); if(sslSocket) { event->isSecure = true; event->clientCertificate = sslSocket->peerCertificate(); } #endif } event->method = header.method(); event->cookies = cookies; event->url.setScheme("http"); if (event->url.host().isEmpty()) event->url.setHost(header.value("host")); if (event->url.port() == -1) event->url.setPort(port()); event->contentType = header.contentType(); event->content = content; typedef QPair<QString, QString> StringPair; foreach(const StringPair& line, header.values()) { if (line.first.toLower() == "cookie") continue; event->headers.insert(line.first, line.second); } event->headers.insert("X-Request-Protocol", "HTTP/" + QString::number(state.httpMajorVersion) + '.' + QString::number(state.httpMinorVersion)); if (sessionID && session(sessionID)) { QxtAbstractWebService *service = session(sessionID); if(content) content->setParent(service); // Set content ownership to the service service->pageRequestedEvent(event); } else if (qxt_d().staticService) { qxt_d().staticService->pageRequestedEvent(event); } else { postEvent(new QxtWebErrorEvent(0, requestID, 500, "Internal Configuration Error")); } }