Skip to content

Commit

Permalink
Merge from upstream: POST support.
Browse files Browse the repository at this point in the history
  • Loading branch information
Jakub Wieczorek committed Jul 28, 2009
1 parent a480c70 commit c430c9a
Show file tree
Hide file tree
Showing 11 changed files with 172 additions and 32 deletions.
58 changes: 54 additions & 4 deletions autotests/opensearchengine/tst_opensearchengine.cpp
Expand Up @@ -77,6 +77,7 @@ private slots:
void parseTemplate();
void languageCodes_data();
void languageCodes();
void requestMethods();
};

// Subclass that exposes the protected functions.
Expand Down Expand Up @@ -167,11 +168,17 @@ class SuggestionsTestNetworkAccessManager : public QNetworkAccessManager
{
}

QNetworkRequest lastRequest;
Operation lastOperation;
bool lastOutgoingData;

protected:
QNetworkReply *createRequest(QNetworkAccessManager::Operation operation, const QNetworkRequest &request, QIODevice *outgoingData = 0)
{
Q_UNUSED(operation);
Q_UNUSED(outgoingData);
lastOperation = operation;
lastRequest = request;
lastOutgoingData = (bool)outgoingData;

return new SuggestionsTestNetworkReply(request, 0);
}
};
Expand Down Expand Up @@ -421,6 +428,9 @@ void tst_OpenSearchEngine::operatorequal_data()
QTest::newRow("imageUrl") << QString() << QString() << QString("x") << QString() << QString()
<< Parameters() << Parameters()
<< false;
QTest::newRow("parameters") << QString() << QString() << QString() << QString() << QString()
<< (Parameters() << OpenSearchEngine::Parameter("a", "b")) << Parameters()
<< false;
}

// public bool operator==(OpenSearchEngine const &other) const
Expand Down Expand Up @@ -477,19 +487,28 @@ void tst_OpenSearchEngine::providesSuggestions()
void tst_OpenSearchEngine::requestSuggestions_data()
{
QTest::addColumn<QString>("searchTerm");
QTest::newRow("null") << QString();
QTest::newRow("foo") << QString("foo");
QTest::addColumn<QString>("method");
QTest::addColumn<QNetworkAccessManager::Operation>("lastOperation");
QTest::newRow("null") << QString() << QString() << QNetworkAccessManager::GetOperation;
QTest::newRow("foo") << QString("foo") << QString("get") << QNetworkAccessManager::GetOperation;
QTest::newRow("bar") << QString("bar") << QString("post") << QNetworkAccessManager::PostOperation;
QTest::newRow("baz") << QString("baz") << QString("put") << QNetworkAccessManager::GetOperation;
}

Q_DECLARE_METATYPE(QNetworkAccessManager::Operation)
// public void requestSuggestions(QString const &searchTerm)
void tst_OpenSearchEngine::requestSuggestions()
{
QFETCH(QString, searchTerm);
QFETCH(QString, method);
QFETCH(QNetworkAccessManager::Operation, lastOperation);

SuggestionsTestNetworkAccessManager manager;
SubOpenSearchEngine engine;
engine.setNetworkAccessManager(&manager);
engine.setSuggestionsMethod(method);
engine.setSuggestionsUrlTemplate("http://foobar.baz");
engine.setSuggestionsParameters(Parameters() << OpenSearchEngine::Parameter("a", "b"));

QVERIFY(engine.providesSuggestions());

Expand All @@ -506,6 +525,9 @@ void tst_OpenSearchEngine::requestSuggestions()
QStringList suggestions;
suggestions << "sears" << "search engines" << "search engine" << "search" << "sears.com" << "seattle times";
QCOMPARE(spy.at(0).at(0).toStringList(), suggestions);

QCOMPARE(manager.lastOperation, lastOperation);
QCOMPARE(manager.lastOutgoingData, lastOperation == QNetworkAccessManager::PostOperation);
}
}

Expand Down Expand Up @@ -760,6 +782,34 @@ void tst_OpenSearchEngine::languageCodes()
QCOMPARE(engine.call_parseTemplate(QString("foo"), QString("http://foobar.baz/?l={language}")), url);
}

void tst_OpenSearchEngine::requestMethods()
{
SubOpenSearchEngine engine;

QCOMPARE(engine.searchMethod(), QString("get"));
QCOMPARE(engine.suggestionsMethod(), QString("get"));

engine.setSearchMethod("post");
QCOMPARE(engine.searchMethod(), QString("post"));
QCOMPARE(engine.suggestionsMethod(), QString("get"));

engine.setSearchMethod("get");
QCOMPARE(engine.searchMethod(), QString("get"));
QCOMPARE(engine.suggestionsMethod(), QString("get"));

engine.setSuggestionsMethod("PoSt");
QCOMPARE(engine.searchMethod(), QString("get"));
QCOMPARE(engine.suggestionsMethod(), QString("post"));

engine.setSearchMethod("foo");
QCOMPARE(engine.searchMethod(), QString("get"));
QCOMPARE(engine.suggestionsMethod(), QString("post"));

engine.setSuggestionsMethod("bar");
QCOMPARE(engine.searchMethod(), QString("get"));
QCOMPARE(engine.suggestionsMethod(), QString("post"));
}

QTEST_MAIN(tst_OpenSearchEngine)
#include "tst_opensearchengine.moc"

2 changes: 1 addition & 1 deletion autotests/opensearchreader/testfile1.xml
Expand Up @@ -3,7 +3,7 @@
<ShortName>Wikipedia (en)</ShortName>
<Description >Full text search in the English Wikipedia</Description>
<Url method="get" type="application/rss+xml" template="http://en.wikipedia.org/rss" />
<Url method="get" type="text/html" template="http://en.wikipedia.org/bar" />
<Url method="post" type="text/html" template="http://en.wikipedia.org/bar" />
<Url method="get" type="application/x-suggestions+json" template="http://en.wikipedia.org/foo" />
<Url method="get" template="http://en.wikipedia.org/baz" />
<Image width="16" height="16">http://en.wikipedia.org/favicon.ico</Image>
Expand Down
2 changes: 1 addition & 1 deletion autotests/opensearchreader/testfile3.xml
Expand Up @@ -6,7 +6,7 @@
<Param name="q" value="{searchTerms}"/>
<Parameter name="b" value="foo"/>
</Url>
<Url method="get" type="application/x-suggestions+json" template="http://github.com/suggestions">
<Url method="post" type="application/x-suggestions+json" template="http://github.com/suggestions">
<Parameter name="bar" value="baz"/>
</Url>
</OpenSearchDescription>
24 changes: 16 additions & 8 deletions autotests/opensearchreader/tst_opensearchreader.cpp
Expand Up @@ -71,37 +71,41 @@ void tst_OpenSearchReader::read_data()
QTest::addColumn<QString>("imageUrl");
QTest::addColumn<OpenSearchEngine::Parameters>("searchParameters");
QTest::addColumn<OpenSearchEngine::Parameters>("suggestionsParameters");
QTest::addColumn<QString>("searchMethod");
QTest::addColumn<QString>("suggestionsMethod");

QTest::newRow("null") << QString(":/doesNotExist") << false << QString() << QString() << QString() << QString()
<< QString() << OpenSearchEngine::Parameters() << OpenSearchEngine::Parameters();
<< QString() << OpenSearchEngine::Parameters() << OpenSearchEngine::Parameters() << QString("get") << QString("get");

QTest::newRow("testfile1") << QString(":/testfile1.xml") << true << QString("Wikipedia (en)")
<< QString("Full text search in the English Wikipedia") << QString("http://en.wikipedia.org/bar")
<< QString("http://en.wikipedia.org/foo") << QString("http://en.wikipedia.org/favicon.ico")
<< OpenSearchEngine::Parameters() << OpenSearchEngine::Parameters();
<< OpenSearchEngine::Parameters() << OpenSearchEngine::Parameters() << QString("post") << QString("get");

QTest::newRow("testfile2") << QString(":/testfile2.xml") << false << QString("Wikipedia (en)")
<< QString() << QString() << QString("http://en.wikipedia.org/foo") << QString("http://en.wikipedia.org/favicon.ico")
<< OpenSearchEngine::Parameters() << OpenSearchEngine::Parameters();
<< OpenSearchEngine::Parameters() << OpenSearchEngine::Parameters() << QString("get") << QString("get");

QTest::newRow("testfile3") << QString(":/testfile3.xml") << true << QString("GitHub") << QString("Search GitHub")
<< QString("http://github.com/search") << QString("http://github.com/suggestions") << QString()
<< (OpenSearchEngine::Parameters() << OpenSearchEngine::Parameter(QString("q"), QString("{searchTerms}"))
<< OpenSearchEngine::Parameter(QString("b"), QString("foo")))
<< (OpenSearchEngine::Parameters() << OpenSearchEngine::Parameter(QString("bar"), QString("baz")));
<< (OpenSearchEngine::Parameters() << OpenSearchEngine::Parameter(QString("bar"), QString("baz")))
<< QString("get") << QString("post");

QTest::newRow("testfile4") << QString(":/testfile4.xml") << true << QString("Google") << QString("Google Web Search")
<< QString("http://www.google.com/search?bar") << QString("http://suggestqueries.google.com/complete/foo")
<< QString("http://www.google.com/favicon.ico") << OpenSearchEngine::Parameters() << OpenSearchEngine::Parameters();
<< QString("http://www.google.com/favicon.ico") << OpenSearchEngine::Parameters()
<< OpenSearchEngine::Parameters() << QString("get") << QString("get");

QTest::newRow("testfile5") << QString(":/testfile5.xml") << false << QString() << QString() << QString() << QString()
<< QString() << OpenSearchEngine::Parameters() << OpenSearchEngine::Parameters();
<< QString() << OpenSearchEngine::Parameters() << OpenSearchEngine::Parameters() << QString("get") << QString("get");

QTest::newRow("testfile6") << QString(":/testfile6.xml") << false << QString() << QString() << QString() << QString()
<< QString() << OpenSearchEngine::Parameters() << OpenSearchEngine::Parameters();
<< QString() << OpenSearchEngine::Parameters() << OpenSearchEngine::Parameters() << QString("get") << QString("get");

QTest::newRow("testfile7") << QString(":/testfile7.xml") << false << QString() << QString() << QString() << QString()
<< QString() << OpenSearchEngine::Parameters() << OpenSearchEngine::Parameters();
<< QString() << OpenSearchEngine::Parameters() << OpenSearchEngine::Parameters() << QString("get") << QString("get");
}

void tst_OpenSearchReader::read()
Expand All @@ -115,6 +119,8 @@ void tst_OpenSearchReader::read()
QFETCH(QString, imageUrl);
QFETCH(OpenSearchEngine::Parameters, searchParameters);
QFETCH(OpenSearchEngine::Parameters, suggestionsParameters);
QFETCH(QString, searchMethod);
QFETCH(QString, suggestionsMethod);

QFile file(fileName);
file.open(QIODevice::ReadOnly);
Expand All @@ -129,6 +135,8 @@ void tst_OpenSearchReader::read()
QCOMPARE(engine->searchParameters(), searchParameters);
QCOMPARE(engine->suggestionsParameters(), suggestionsParameters);
QCOMPARE(engine->imageUrl(), imageUrl);
QCOMPARE(engine->searchMethod(), searchMethod);
QCOMPARE(engine->suggestionsMethod(), suggestionsMethod);

delete engine;
}
Expand Down
2 changes: 1 addition & 1 deletion autotests/opensearchwriter/testfile2.xml
Expand Up @@ -3,5 +3,5 @@
<ShortName>Arora!</ShortName>
<Description>a cross platform web browser built using Qt and WebKit</Description>
<Url method="get" type="text/html" template="http://foobar.barfoo/search"/>
<Url method="get" type="application/x-suggestions+json" template="http://foobar.barfoo/suggest"/>
<Url method="post" type="application/x-suggestions+json" template="http://foobar.barfoo/suggest"/>
</OpenSearchDescription>
2 changes: 1 addition & 1 deletion autotests/opensearchwriter/testfile3.xml
Expand Up @@ -2,7 +2,7 @@
<OpenSearchDescription xmlns="http://a9.com/-/spec/opensearch/1.1/">
<ShortName>Foo Bar</ShortName>
<Description>Bar Foo</Description>
<Url method="get" type="text/html" template="http://foobar.barfoo/search" xmlns:p="http://a9.com/-/spec/opensearch/extensions/parameters/1.0/">
<Url method="post" type="text/html" template="http://foobar.barfoo/search" xmlns:p="http://a9.com/-/spec/opensearch/extensions/parameters/1.0/">
<p:Parameter name="q" value="{searchTerms}"/>
<p:Parameter name="a" value="foo"/>
</Url>
Expand Down
15 changes: 12 additions & 3 deletions autotests/opensearchwriter/tst_opensearchwriter.cpp
Expand Up @@ -69,19 +69,24 @@ void tst_OpenSearchWriter::write_data()
QTest::addColumn<QString>("imageUrl");
QTest::addColumn<OpenSearchEngine::Parameters>("searchParameters");
QTest::addColumn<OpenSearchEngine::Parameters>("suggestionsParameters");
QTest::addColumn<QString>("searchMethod");
QTest::addColumn<QString>("suggestionsMethod");
QTest::addColumn<QString>("fileName");

QTest::newRow("testfile1") << QString("Foo Bar") << QString("Bar Foo") << QString("http://foobar.barfoo/search") << QString()
<< QString() << OpenSearchEngine::Parameters() << OpenSearchEngine::Parameters() << QString(":/testfile1.xml");
<< QString() << OpenSearchEngine::Parameters() << OpenSearchEngine::Parameters()
<< QString() << QString("get") << QString(":/testfile1.xml");

QTest::newRow("testfile2") << QString("Arora!") << QString("a cross platform web browser built using Qt and WebKit")
<< QString("http://foobar.barfoo/search") << QString("http://foobar.barfoo/suggest") << QString()
<< OpenSearchEngine::Parameters() << OpenSearchEngine::Parameters() << QString(":/testfile2.xml");
<< OpenSearchEngine::Parameters() << OpenSearchEngine::Parameters()
<< QString("get") << QString("post") << QString(":/testfile2.xml");

QTest::newRow("testile3") << QString("Foo Bar") << QString("Bar Foo") << QString("http://foobar.barfoo/search")
<< QString("http://foobar.barfoo/suggest") << QString()
<< (OpenSearchEngine::Parameters() << OpenSearchEngine::Parameter("q", "{searchTerms}") << OpenSearchEngine::Parameter("a", "foo"))
<< (OpenSearchEngine::Parameters() << OpenSearchEngine::Parameter("q", "{searchTerms}")) << QString(":/testfile3.xml");
<< (OpenSearchEngine::Parameters() << OpenSearchEngine::Parameter("q", "{searchTerms}"))
<< QString("post") << QString("foo") << QString(":/testfile3.xml");
}

void tst_OpenSearchWriter::write()
Expand All @@ -93,6 +98,8 @@ void tst_OpenSearchWriter::write()
QFETCH(QString, imageUrl);
QFETCH(OpenSearchEngine::Parameters, searchParameters);
QFETCH(OpenSearchEngine::Parameters, suggestionsParameters);
QFETCH(QString, searchMethod);
QFETCH(QString, suggestionsMethod);
QFETCH(QString, fileName);

OpenSearchEngine engine;
Expand All @@ -105,6 +112,8 @@ void tst_OpenSearchWriter::write()
engine.setImageUrl(imageUrl);
engine.setSearchParameters(searchParameters);
engine.setSuggestionsParameters(suggestionsParameters);
engine.setSearchMethod(searchMethod);
engine.setSuggestionsMethod(suggestionsMethod);

QByteArray output;
QBuffer buffer(&output);
Expand Down
77 changes: 67 additions & 10 deletions src/opensearch/opensearchengine.cpp
Expand Up @@ -22,7 +22,6 @@
#include <qbuffer.h>
#include <qcoreapplication.h>
#include <qlocale.h>
#include <qnetworkaccessmanager.h>
#include <qnetworkrequest.h>
#include <qnetworkreply.h>
#include <qregexp.h>
Expand Down Expand Up @@ -82,10 +81,14 @@
*/
OpenSearchEngine::OpenSearchEngine(QObject *parent)
: QObject(parent)
, m_searchMethod(QLatin1String("get"))
, m_suggestionsMethod(QLatin1String("get"))
, m_networkAccessManager(0)
, m_suggestionsReply(0)
, m_scriptEngine(0)
{
m_requestMethods.insert(QLatin1String("get"), QNetworkAccessManager::GetOperation);
m_requestMethods.insert(QLatin1String("post"), QNetworkAccessManager::PostOperation);
}

/*!
Expand Down Expand Up @@ -201,10 +204,12 @@ QUrl OpenSearchEngine::searchUrl(const QString &searchTerm) const

QUrl retVal = QUrl::fromEncoded(parseTemplate(searchTerm, m_searchUrlTemplate).toUtf8());

Parameters::const_iterator end = m_searchParameters.constEnd();
Parameters::const_iterator i = m_searchParameters.constBegin();
for (; i != end; ++i)
retVal.addQueryItem(i->first, parseTemplate(searchTerm, i->second));
if (m_searchMethod != QLatin1String("post")) {
Parameters::const_iterator end = m_searchParameters.constEnd();
Parameters::const_iterator i = m_searchParameters.constBegin();
for (; i != end; ++i)
retVal.addQueryItem(i->first, parseTemplate(searchTerm, i->second));
}

return retVal;
}
Expand Down Expand Up @@ -251,10 +256,12 @@ QUrl OpenSearchEngine::suggestionsUrl(const QString &searchTerm) const

QUrl retVal = QUrl::fromEncoded(parseTemplate(searchTerm, m_suggestionsUrlTemplate).toUtf8());

Parameters::const_iterator end = m_suggestionsParameters.constEnd();
Parameters::const_iterator i = m_suggestionsParameters.constBegin();
for (; i != end; ++i)
retVal.addQueryItem(i->first, parseTemplate(searchTerm, i->second));
if (m_suggestionsMethod != QLatin1String("post")) {
Parameters::const_iterator end = m_suggestionsParameters.constEnd();
Parameters::const_iterator i = m_suggestionsParameters.constBegin();
for (; i != end; ++i)
retVal.addQueryItem(i->first, parseTemplate(searchTerm, i->second));
}

return retVal;
}
Expand Down Expand Up @@ -293,6 +300,42 @@ void OpenSearchEngine::setSuggestionsParameters(const Parameters &suggestionsPar
m_suggestionsParameters = suggestionsParameters;
}

/*!
\property searchMethod
\brief HTTP request method that will be used to perform search requests
*/
QString OpenSearchEngine::searchMethod() const
{
return m_searchMethod;
}

void OpenSearchEngine::setSearchMethod(const QString &method)
{
QString requestMethod = method.toLower();
if (!m_requestMethods.contains(requestMethod))
return;

m_searchMethod = requestMethod;
}

/*!
\property suggestionsMethod
\brief HTTP request method that will be used to perform suggestions requests
*/
QString OpenSearchEngine::suggestionsMethod() const
{
return m_suggestionsMethod;
}

void OpenSearchEngine::setSuggestionsMethod(const QString &method)
{
QString requestMethod = method.toLower();
if (!m_requestMethods.contains(requestMethod))
return;

m_suggestionsMethod = requestMethod;
}

/*!
\property imageUrl
\brief the image URL of the engine
Expand Down Expand Up @@ -424,7 +467,21 @@ void OpenSearchEngine::requestSuggestions(const QString &searchTerm)
m_suggestionsReply = 0;
}

m_suggestionsReply = m_networkAccessManager->get(QNetworkRequest(suggestionsUrl(searchTerm)));
Q_ASSERT(m_requestMethods.contains(m_suggestionsMethod));
if (m_suggestionsMethod == QLatin1String("get")) {
m_suggestionsReply = m_networkAccessManager->get(QNetworkRequest(suggestionsUrl(searchTerm)));
} else {
QStringList parameters;

Parameters::const_iterator end = m_suggestionsParameters.constEnd();
Parameters::const_iterator i = m_suggestionsParameters.constBegin();
for (; i != end; ++i)
parameters.append(i->first + QLatin1String("=") + i->second);

QByteArray data = parameters.join(QLatin1String("&")).toUtf8();
m_suggestionsReply = m_networkAccessManager->post(QNetworkRequest(suggestionsUrl(searchTerm)), data);
}

connect(m_suggestionsReply, SIGNAL(finished()), this, SLOT(suggestionsObtained()));
}

Expand Down

0 comments on commit c430c9a

Please sign in to comment.