summaryrefslogtreecommitdiffstats
path: root/chromium/mojo/examples/wget/wget.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/mojo/examples/wget/wget.cc')
-rw-r--r--chromium/mojo/examples/wget/wget.cc116
1 files changed, 116 insertions, 0 deletions
diff --git a/chromium/mojo/examples/wget/wget.cc b/chromium/mojo/examples/wget/wget.cc
new file mode 100644
index 00000000000..8a0ad5ecd9e
--- /dev/null
+++ b/chromium/mojo/examples/wget/wget.cc
@@ -0,0 +1,116 @@
+// Copyright 2014 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include <stdio.h>
+
+#include "mojo/public/cpp/application/application.h"
+#include "mojo/services/public/interfaces/network/network_service.mojom.h"
+#include "mojo/services/public/interfaces/network/url_loader.mojom.h"
+
+namespace mojo {
+namespace examples {
+
+class WGetApp : public Application, public URLLoaderClient {
+ public:
+ virtual void Initialize() MOJO_OVERRIDE {
+ ConnectTo("mojo:mojo_network_service", &network_service_);
+ Start();
+ }
+
+ private:
+ virtual void OnReceivedRedirect(URLResponsePtr response,
+ const String& new_url,
+ const String& new_method) MOJO_OVERRIDE {
+ PrintResponse(response);
+ }
+
+ virtual void OnReceivedResponse(URLResponsePtr response) MOJO_OVERRIDE {
+ PrintResponse(response);
+ PrintResponseBody();
+ Start();
+ }
+
+ virtual void OnReceivedError(NetworkErrorPtr error) MOJO_OVERRIDE {
+ printf("Got error: %d (%s)\n",
+ error->code, error->description.get().c_str());
+ }
+
+ virtual void OnReceivedEndOfResponseBody() MOJO_OVERRIDE {
+ // Ignored.
+ }
+
+ void Start() {
+ std::string url = PromptForURL();
+ printf("Loading: %s\n", url.c_str());
+
+ network_service_->CreateURLLoader(Get(&url_loader_));
+ url_loader_.set_client(this);
+
+ URLRequestPtr request(URLRequest::New());
+ request->url = url;
+ request->method = "GET";
+ request->auto_follow_redirects = true;
+
+ DataPipe data_pipe;
+ response_body_stream_ = data_pipe.consumer_handle.Pass();
+
+ url_loader_->Start(request.Pass(), data_pipe.producer_handle.Pass());
+ }
+
+ std::string PromptForURL() {
+ printf("Enter URL> ");
+ char buf[1024];
+ if (scanf("%1023s", buf) != 1)
+ buf[0] = '\0';
+ return buf;
+ }
+
+ void PrintResponse(const URLResponsePtr& response) {
+ printf(">>> Headers <<< \n");
+ printf(" %s\n", response->status_line.get().c_str());
+ if (response->headers) {
+ for (size_t i = 0; i < response->headers.size(); ++i)
+ printf(" %s\n", response->headers[i].get().c_str());
+ }
+ }
+
+ void PrintResponseBody() {
+ // Read response body in blocking fashion.
+ printf(">>> Body <<<\n");
+
+ for (;;) {
+ char buf[512];
+ uint32_t num_bytes = sizeof(buf);
+ MojoResult result = ReadDataRaw(
+ response_body_stream_.get(),
+ buf,
+ &num_bytes,
+ MOJO_READ_DATA_FLAG_NONE);
+ if (result == MOJO_RESULT_SHOULD_WAIT) {
+ Wait(response_body_stream_.get(),
+ MOJO_HANDLE_SIGNAL_READABLE,
+ MOJO_DEADLINE_INDEFINITE);
+ } else if (result == MOJO_RESULT_OK) {
+ fwrite(buf, num_bytes, 1, stdout);
+ } else {
+ break;
+ }
+ }
+
+ printf("\n>>> EOF <<<\n");
+ }
+
+ NetworkServicePtr network_service_;
+ URLLoaderPtr url_loader_;
+ ScopedDataPipeConsumerHandle response_body_stream_;
+};
+
+} // namespace examples
+
+// static
+Application* Application::Create() {
+ return new examples::WGetApp();
+}
+
+} // namespace mojo