| 26 | namespace process { |
| 27 | |
| 28 | Future<http::Response> Logging::toggle( |
| 29 | const http::Request& request, |
| 30 | const Option<http::authentication::Principal>&) |
| 31 | { |
| 32 | Option<std::string> level = request.url.query.get("level"); |
| 33 | Option<std::string> duration = request.url.query.get("duration"); |
| 34 | |
| 35 | if (level.isNone() && duration.isNone()) { |
| 36 | return http::OK(stringify(FLAGS_v) + "\n"); |
| 37 | } |
| 38 | |
| 39 | if (level.isSome() && duration.isNone()) { |
| 40 | return http::BadRequest("Expecting 'duration=value' in query.\n"); |
| 41 | } else if (level.isNone() && duration.isSome()) { |
| 42 | return http::BadRequest("Expecting 'level=value' in query.\n"); |
| 43 | } |
| 44 | |
| 45 | Try<int> v = numify<int>(level.get()); |
| 46 | |
| 47 | if (v.isError()) { |
| 48 | return http::BadRequest(v.error() + ".\n"); |
| 49 | } |
| 50 | |
| 51 | if (v.get() < 0) { |
| 52 | return http::BadRequest( |
| 53 | "Invalid level '" + stringify(v.get()) + "'.\n"); |
| 54 | } else if (v.get() < original) { |
| 55 | return http::BadRequest( |
| 56 | "'" + stringify(v.get()) + "' < original level.\n"); |
| 57 | } |
| 58 | |
| 59 | Try<Duration> d = Duration::parse(duration.get()); |
| 60 | |
| 61 | if (d.isError()) { |
| 62 | return http::BadRequest(d.error() + ".\n"); |
| 63 | } |
| 64 | |
| 65 | return set_level(v.get(), d.get()) |
| 66 | .then([]() -> http::Response { |
| 67 | return http::OK(); |
| 68 | }); |
| 69 | } |
| 70 | |
| 71 | |
| 72 | Future<Nothing> Logging::set_level(int level, const Duration& duration) |