Bug #9106 » 0001-Modified-hello-example-for-test-of-webrequest-leak.patch
| examples/hello/hello.C | ||
|---|---|---|
|
#include <Wt/WApplication.h>
|
||
|
#include <Wt/WBreak.h>
|
||
|
#include <Wt/WDialog.h>
|
||
|
#include <Wt/WContainerWidget.h>
|
||
|
#include <Wt/WLineEdit.h>
|
||
|
#include <Wt/WPushButton.h>
|
||
|
#include <Wt/WServer.h>
|
||
|
#include <Wt/WTimer.h>
|
||
|
#include <Wt/WText.h>
|
||
|
#if !defined(WT_WIN32)
|
||
|
#include <signal.h>
|
||
|
#endif
|
||
|
#define STRSTREAM_LOG
|
||
|
#if defined(STRSTREAM_LOG)
|
||
|
#include <sstream>
|
||
|
#endif
|
||
|
/*
|
||
|
* A simple hello world application class which demonstrates how to react
|
||
|
* to events, read input, and give feed-back.
|
||
| ... | ... | |
|
private:
|
||
|
Wt::WLineEdit *nameEdit_;
|
||
|
Wt::WText *greeting_;
|
||
|
Wt::Core::observing_ptr<Wt::WDialog> idleTimeoutDialog_;
|
||
|
void greet();
|
||
|
void idleTimeout() override;
|
||
|
};
|
||
|
/*
|
||
| ... | ... | |
|
greeting_->setText("Hello there, " + nameEdit_->text());
|
||
|
}
|
||
|
void HelloApplication::idleTimeout()
|
||
|
{
|
||
|
log("info") << "HelloApplication: idleTimeout() called";
|
||
|
if (idleTimeoutDialog_)
|
||
|
return; // Prevent multiple dialogs
|
||
|
log("info") << "HelloApplication: idleTimeout() about to show dialog";
|
||
|
idleTimeoutDialog_ = addChild(Wt::cpp14::make_unique<Wt::WDialog>("Idle timeout"));
|
||
|
idleTimeoutDialog_->contents()->addNew<Wt::WText>("This session has timed-out, "
|
||
|
"press 'restart' to continue using the application");
|
||
|
auto btn = idleTimeoutDialog_->footer()->addNew<Wt::WPushButton>("restart");
|
||
|
btn->setLink(bookmarkUrl());
|
||
|
btn->setFocus();
|
||
|
idleTimeoutDialog_->show();
|
||
|
quit();
|
||
|
}
|
||
|
#if defined(STRSTREAM_LOG)
|
||
|
class BufferLog {
|
||
|
public:
|
||
|
~BufferLog() {
|
||
|
ss_ << std::ends;
|
||
|
std::cerr << ss_.str() << std::endl;
|
||
|
}
|
||
|
void setup() {
|
||
|
Wt::logInstance().setStream(ss_);
|
||
|
};
|
||
|
private:
|
||
|
std::ostringstream ss_;
|
||
|
};
|
||
|
#endif
|
||
|
int WRun(int argc, char *argv[], Wt::ApplicationCreator createApplication)
|
||
|
{
|
||
|
// insure buffered log contents are sent to stderr on exit
|
||
|
BufferLog bufferLog;
|
||
|
try {
|
||
|
Wt::WServer server(argv[0], "");
|
||
|
try {
|
||
|
server.setServerConfiguration(argc, argv, WTHTTP_CONFIGURATION);
|
||
|
// override the default log output established in setServerConfiguration
|
||
|
bufferLog.setup();
|
||
|
server.addEntryPoint(Wt::EntryPointType::Application, createApplication);
|
||
|
if (server.start()) {
|
||
|
#ifdef WT_THREADED
|
||
|
// MacOSX + valgrind:
|
||
|
// for (;;) { sleep(100); }
|
||
|
int sig = Wt::WServer::waitForShutdown();
|
||
|
Wt::log("info") << "shutdown (signal = " << sig << ")";
|
||
|
#endif
|
||
|
server.stop();
|
||
|
#ifdef WT_THREADED
|
||
|
#ifndef WT_WIN32
|
||
|
if (sig == SIGHUP)
|
||
|
// Mac OSX: _NSGetEnviron()
|
||
|
Wt::WServer::restart(argc, argv, nullptr);
|
||
|
#endif // WIN32
|
||
|
#endif // WT_THREADED
|
||
|
}
|
||
|
return 0;
|
||
|
} catch (std::exception& e) {
|
||
|
Wt::log("error") << "fatal: " << e.what();
|
||
|
return 1;
|
||
|
}
|
||
|
} catch (Wt::WServer::Exception& e) {
|
||
|
Wt::log("error") << "fatal: " << e.what();
|
||
|
return 1;
|
||
|
} catch (std::exception& e) {
|
||
|
Wt::log("error") << "fatal: " << e.what();
|
||
|
return 1;
|
||
|
}
|
||
|
}
|
||
|
int main(int argc, char **argv)
|
||
|
{
|
||
|
/*
|
||
| ... | ... | |
|
* support. The function should return a newly instantiated application
|
||
|
* object.
|
||
|
*/
|
||
|
return Wt::WRun(argc, argv, [](const Wt::WEnvironment &env) {
|
||
|
return WRun(argc, argv, [](const Wt::WEnvironment &env) {
|
||
|
/*
|
||
|
* You could read information from the environment to decide whether
|
||
|
* the user has permission to start a new application
|
||
| examples/hello/wt_config.xml | ||
|---|---|---|
|
<server>
|
||
|
<application-settings location="*">
|
||
|
<session-management>
|
||
|
<timeout>90</timeout>
|
||
|
<idle-timeout>120</idle-timeout>
|
||
|
</session-management>
|
||
|
<log-config>* -debug debug:websession debug:wthttp debug:wthttp/async</log-config>
|
||
|
<web-sockets>true</web-sockets>
|
||
|
</application-settings>
|
||
|
</server>
|
||
| examples/hello/wt_config_less_debug.xml | ||
|---|---|---|
|
<server>
|
||
|
<application-settings location="*">
|
||
|
<session-management>
|
||
|
<timeout>90</timeout>
|
||
|
<idle-timeout>120</idle-timeout>
|
||
|
</session-management>
|
||
|
<log-config>* -debug</log-config>
|
||
|
<web-sockets>true</web-sockets>
|
||
|
</application-settings>
|
||
|
</server>
|
||
| src/http/WtReply.C | ||
|---|---|---|
|
fetchMoreDataCallback_ = callBack;
|
||
|
if (sending_ != 0) {
|
||
|
LOG_DEBUG("WtReply::send(): still busy sending... ignoring");
|
||
|
LOG_INFO("WtReply::send(): still busy sending... ignoring");
|
||
|
return;
|
||
|
}
|
||