| Index: mojo/examples/http_server/http_server.cc
|
| diff --git a/mojo/examples/http_server/http_server.cc b/mojo/examples/http_server/http_server.cc
|
| deleted file mode 100644
|
| index 24e4fe7642078fc3e712822c6eb4012932adf6e2..0000000000000000000000000000000000000000
|
| --- a/mojo/examples/http_server/http_server.cc
|
| +++ /dev/null
|
| @@ -1,203 +0,0 @@
|
| -// 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 <arpa/inet.h>
|
| -
|
| -#include "base/bind.h"
|
| -#include "base/memory/weak_ptr.h"
|
| -#include "mojo/common/handle_watcher.h"
|
| -#include "mojo/public/c/system/main.h"
|
| -#include "mojo/public/cpp/application/application_delegate.h"
|
| -#include "mojo/public/cpp/application/application_impl.h"
|
| -#include "mojo/public/cpp/application/application_runner.h"
|
| -#include "mojo/public/cpp/system/data_pipe.h"
|
| -#include "mojo/services/public/interfaces/network/network_service.mojom.h"
|
| -
|
| -namespace mojo {
|
| -namespace examples {
|
| -
|
| -// The canned response that this server replies to each request with.
|
| -const char kResponse[] =
|
| - "HTTP/1.0 200 OK\n"
|
| - "Content-Type: text/html; charset=utf-8\n"
|
| - "\n"
|
| - "Hello, world\n";
|
| -
|
| -// Represents one connection to a client. This connection will manage its own
|
| -// lifetime and will delete itself when the connection is closed.
|
| -class Connection {
|
| - public:
|
| - Connection(TCPConnectedSocketPtr conn,
|
| - ScopedDataPipeProducerHandle sender,
|
| - ScopedDataPipeConsumerHandle receiver)
|
| - : connection_(conn.Pass()),
|
| - sender_(sender.Pass()),
|
| - receiver_(receiver.Pass()),
|
| - weak_ptr_factory_(this),
|
| - response_(kResponse),
|
| - response_offset_(0) {
|
| - WriteMore();
|
| - }
|
| -
|
| - ~Connection() {
|
| - }
|
| -
|
| - private:
|
| - void OnSenderReady(MojoResult result) {
|
| - WriteMore();
|
| - }
|
| -
|
| - void WriteMore() {
|
| - uint32_t num_bytes =
|
| - static_cast<uint32_t>(response_.size() - response_offset_);
|
| - // TODO(brettw) write chunks (ideally capped at some small size to
|
| - // illustrate how it works even in the presence of our relatively small
|
| - // reply) rather than specifying ALL_OR_NONE. See below.
|
| - MojoResult result = WriteDataRaw(
|
| - sender_.get(), &response_[response_offset_], &num_bytes,
|
| - MOJO_WRITE_DATA_FLAG_ALL_OR_NONE);
|
| - if (result == MOJO_RESULT_SHOULD_WAIT) {
|
| - num_bytes = 0;
|
| - } else if (result != MOJO_RESULT_OK) {
|
| - printf("Error writing to pipe.\n");
|
| - delete this;
|
| - return;
|
| - }
|
| -
|
| - response_offset_ += num_bytes;
|
| -
|
| - if (response_offset_ == response_.size()) {
|
| - // Connection complete.
|
| - delete this;
|
| - return;
|
| - }
|
| -
|
| - // Wait for sender to be writable.
|
| - // TODO(brettw) we won't actually get here since we ALL_OR_NONE was
|
| - // specified above. This call won't work because the message loop is not a
|
| - // Chromium message loop. Instead, we probably need to use
|
| - // Environment::GetDefaultAsyncWaiter to wait on the handles and remove the
|
| - // ALL_OR_NONE flag.
|
| - sender_watcher_.Start(
|
| - sender_.get(),
|
| - MOJO_HANDLE_SIGNAL_WRITABLE, MOJO_DEADLINE_INDEFINITE,
|
| - base::Bind(&Connection::OnSenderReady, weak_ptr_factory_.GetWeakPtr()));
|
| - }
|
| -
|
| - TCPConnectedSocketPtr connection_;
|
| - ScopedDataPipeProducerHandle sender_;
|
| - ScopedDataPipeConsumerHandle receiver_;
|
| -
|
| - base::WeakPtrFactory<Connection> weak_ptr_factory_;
|
| - common::HandleWatcher sender_watcher_;
|
| -
|
| - std::string response_;
|
| - size_t response_offset_;
|
| -};
|
| -
|
| -class HttpServerApp : public ApplicationDelegate {
|
| - public:
|
| - virtual void Initialize(ApplicationImpl* app) override {
|
| - app->ConnectToService("mojo:network_service", &network_service_);
|
| - Start();
|
| - }
|
| -
|
| - private:
|
| - void OnSocketBound(NetworkErrorPtr err, NetAddressPtr bound_address) {
|
| - if (err->code != 0) {
|
| - printf("Bound err = %d\n", err->code);
|
| - return;
|
| - }
|
| -
|
| - printf("Got address %d.%d.%d.%d:%d\n",
|
| - (int)bound_address->ipv4->addr[0],
|
| - (int)bound_address->ipv4->addr[1],
|
| - (int)bound_address->ipv4->addr[2],
|
| - (int)bound_address->ipv4->addr[3],
|
| - (int)bound_address->ipv4->port);
|
| - }
|
| -
|
| - void OnSocketListening(NetworkErrorPtr err) {
|
| - if (err->code != 0) {
|
| - printf("Listen err = %d\n", err->code);
|
| - return;
|
| - }
|
| - printf("Waiting for incoming connections...\n");
|
| - }
|
| -
|
| - void OnConnectionAccepted(NetworkErrorPtr err, NetAddressPtr remote_address) {
|
| - if (err->code != 0) {
|
| - printf("Accepted socket error = %d\n", err->code);
|
| - return;
|
| - }
|
| -
|
| - new Connection(pending_connected_socket_.Pass(),
|
| - pending_send_handle_.Pass(),
|
| - pending_receive_handle_.Pass());
|
| -
|
| - // Ready for another connection.
|
| - WaitForNextConnection();
|
| - }
|
| -
|
| - void WaitForNextConnection() {
|
| - // Need two pipes (one for each direction).
|
| - ScopedDataPipeConsumerHandle send_consumer_handle;
|
| - MojoResult result = CreateDataPipe(
|
| - nullptr, &pending_send_handle_, &send_consumer_handle);
|
| - assert(result == MOJO_RESULT_OK);
|
| -
|
| - ScopedDataPipeProducerHandle receive_producer_handle;
|
| - result = CreateDataPipe(
|
| - nullptr, &receive_producer_handle, &pending_receive_handle_);
|
| - assert(result == MOJO_RESULT_OK);
|
| - MOJO_ALLOW_UNUSED_LOCAL(result);
|
| -
|
| - server_socket_->Accept(send_consumer_handle.Pass(),
|
| - receive_producer_handle.Pass(),
|
| - GetProxy(&pending_connected_socket_),
|
| - base::Bind(&HttpServerApp::OnConnectionAccepted,
|
| - base::Unretained(this)));
|
| - }
|
| -
|
| - void Start() {
|
| - NetAddressPtr net_address(NetAddress::New());
|
| - net_address->family = NET_ADDRESS_FAMILY_IPV4;
|
| - net_address->ipv4 = NetAddressIPv4::New();
|
| - net_address->ipv4->addr.resize(4);
|
| - net_address->ipv4->addr[0] = 127;
|
| - net_address->ipv4->addr[1] = 0;
|
| - net_address->ipv4->addr[2] = 0;
|
| - net_address->ipv4->addr[3] = 1;
|
| - net_address->ipv4->port = 0;
|
| -
|
| - // Note that we can start using the proxies right away even thought the
|
| - // callbacks have not been called yet. If a previous step fails, they'll
|
| - // all fail.
|
| - network_service_->CreateTCPBoundSocket(
|
| - net_address.Pass(),
|
| - GetProxy(&bound_socket_),
|
| - base::Bind(&HttpServerApp::OnSocketBound, base::Unretained(this)));
|
| - bound_socket_->StartListening(GetProxy(
|
| - &server_socket_),
|
| - base::Bind(&HttpServerApp::OnSocketListening, base::Unretained(this)));
|
| - WaitForNextConnection();
|
| - }
|
| -
|
| - NetworkServicePtr network_service_;
|
| - TCPBoundSocketPtr bound_socket_;
|
| - TCPServerSocketPtr server_socket_;
|
| -
|
| - ScopedDataPipeProducerHandle pending_send_handle_;
|
| - ScopedDataPipeConsumerHandle pending_receive_handle_;
|
| - TCPConnectedSocketPtr pending_connected_socket_;
|
| -};
|
| -
|
| -} // namespace examples
|
| -} // namespace mojo
|
| -
|
| -MojoResult MojoMain(MojoHandle shell_handle) {
|
| - mojo::ApplicationRunner runner(new mojo::examples::HttpServerApp);
|
| - return runner.Run(shell_handle);
|
| -}
|
|
|