Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 25 additions & 0 deletions examples/wangle/echo/BUILD
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
licenses(["notice"])

cc_binary(
name = "echo_server",
visibility = ["//visibility:public"],
srcs = ["EchoServer.cpp"],
deps = [
"//third_party/wangle:wangle",
"//third_party/folly:folly",
"//third_party/glog:glog"
]
)

cc_binary(
name = "echo_client",
visibility = ["//visibility:public"],
srcs = ["EchoClient.cpp"],
deps = [
"//third_party/wangle:wangle",
"//third_party/folly:folly",
"//third_party/glog:glog"
]
)


77 changes: 77 additions & 0 deletions examples/wangle/echo/EchoClient.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
#include <gflags/gflags.h>
#include <iostream>
#include <wangle/bootstrap/ClientBootstrap.h>
#include <wangle/channel/AsyncSocketHandler.h>
#include <wangle/channel/EventBaseHandler.h>
#include <wangle/codec/LineBasedFrameDecoder.h>
#include <wangle/codec/StringCodec.h>

using namespace folly;
using namespace wangle;

DEFINE_int32(port, 8080, "echo server port");
DEFINE_string(host, "::1", "echo server address");

typedef Pipeline<folly::IOBufQueue&, std::string> EchoPipeline;

// the handler for receiving messages back from the server
class EchoHandler : public HandlerAdapter<std::string> {
public:
virtual void read(Context* ctx, std::string msg) override {
std::cout << "received back: " << msg;
}
virtual void readException(Context* ctx, exception_wrapper e) override {
std::cout << exceptionStr(e) << std::endl;
close(ctx);
}
virtual void readEOF(Context* ctx) override {
std::cout << "EOF received :(" << std::endl;
close(ctx);
}
};

// chains the handlers together to define the response pipeline
class EchoPipelineFactory : public PipelineFactory<EchoPipeline> {
public:
EchoPipeline::Ptr newPipeline(std::shared_ptr<AsyncTransportWrapper> sock) {
auto pipeline = EchoPipeline::create();
pipeline->addBack(AsyncSocketHandler(sock));
pipeline->addBack(
EventBaseHandler()); // ensure we can write from any thread
pipeline->addBack(LineBasedFrameDecoder(8192, false));
pipeline->addBack(StringCodec());
pipeline->addBack(EchoHandler());
pipeline->finalize();
return pipeline;
}
};

int main(int argc, char** argv) {
gflags::ParseCommandLineFlags(&argc, &argv, true);

ClientBootstrap<EchoPipeline> client;
client.group(std::make_shared<wangle::IOThreadPoolExecutor>(1));
client.pipelineFactory(std::make_shared<EchoPipelineFactory>());
auto pipeline = client.connect(SocketAddress(FLAGS_host, FLAGS_port)).get();

try {
while (true) {
std::string line;
std::getline(std::cin, line);
if (line == "") {
break;
}

pipeline->write(line + "\r\n").get();
if (line == "bye") {
pipeline->close();
break;
}
}
} catch (const std::exception& e) {
std::cout << exceptionStr(e) << std::endl;
}

return 0;
}

48 changes: 48 additions & 0 deletions examples/wangle/echo/EchoServer.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
#include <gflags/gflags.h>
#include <wangle/bootstrap/ServerBootstrap.h>
#include <wangle/channel/AsyncSocketHandler.h>
#include <wangle/codec/LineBasedFrameDecoder.h>
#include <wangle/codec/StringCodec.h>

using namespace folly;
using namespace wangle;

DEFINE_int32(port, 8080, "echo server port");

typedef Pipeline<IOBufQueue&, std::string> EchoPipeline;

// the main logic of our echo server; receives a string and writes it straight
// back
class EchoHandler : public HandlerAdapter<std::string> {
public:
virtual void read(Context* ctx, std::string msg) override {
std::cout << "handling " << msg << std::endl;
write(ctx, msg + "\r\n");
}
};

// where we define the chain of handlers for each messeage received
class EchoPipelineFactory : public PipelineFactory<EchoPipeline> {
public:
EchoPipeline::Ptr newPipeline(std::shared_ptr<AsyncTransportWrapper> sock) {
auto pipeline = EchoPipeline::create();
pipeline->addBack(AsyncSocketHandler(sock));
pipeline->addBack(LineBasedFrameDecoder(8192));
pipeline->addBack(StringCodec());
pipeline->addBack(EchoHandler());
pipeline->finalize();
return pipeline;
}
};

int main(int argc, char** argv) {
gflags::ParseCommandLineFlags(&argc, &argv, true);

ServerBootstrap<EchoPipeline> server;
server.childPipeline(std::make_shared<EchoPipelineFactory>());
server.bind(FLAGS_port);
server.waitForStop();

return 0;
}

13 changes: 13 additions & 0 deletions examples/wangle/echo/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
# Wangle Examples

This directory provides examples of using the Wangle Echo Server.

## Compiling

Echo Server:

`bazel build //examples/wangle/echo:echo_server`

Echo Client:

`bazel build //examples/wangle/echo:echo_client`
18 changes: 18 additions & 0 deletions third_party/wangle/BUILD
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,23 @@ cc_library(
]
)

cc_library(
name = "codec",
visibility = ["//visibility:public"],
includes = [
"upstream",
],
hdrs = glob(["upstream/wangle/codec/*.h"]),
srcs = [
"upstream/wangle/codec/LineBasedFrameDecoder.cpp",
"upstream/wangle/codec/LengthFieldPrepender.cpp",
"upstream/wangle/codec/LengthFieldBasedFrameDecoder.cpp"
],
deps = [
":channel"
]
)

# Disabled because dependings on boost/thread
#
# cc_test(
Expand Down Expand Up @@ -119,5 +136,6 @@ cc_library(
":channel",
":concurrent",
":ssl",
":codec"
]
)