app.d 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. import std.stdio;
  2. import std.socket;
  3. import std.array;
  4. import mir.ser;
  5. import mir.ser.json;
  6. import std.range.primitives;
  7. import glow.xbuf;
  8. import photon, photon.http;
  9. struct Message
  10. {
  11. string message;
  12. }
  13. class BenchmarkProcessor : HttpProcessor {
  14. HttpHeader[] plainText = [HttpHeader("Content-Type", "text/plain; charset=utf-8")];
  15. HttpHeader[] json = [HttpHeader("Content-Type", "application/json")];
  16. Buffer!char jsonBuf;
  17. this(Socket sock) {
  18. super(sock);
  19. jsonBuf = Buffer!char(256);
  20. }
  21. override void handle(HttpRequest req) {
  22. if (req.uri == "/plaintext") {
  23. respondWith("Hello, world!", HttpStatus.OK, plainText);
  24. } else if(req.uri == "/json") {
  25. jsonBuf.clear();
  26. serializeJsonPretty!""(jsonBuf, Message("Hello, World!"));
  27. respondWith(jsonBuf.data, HttpStatus.OK, json);
  28. } else {
  29. respondWith("Not found", HttpStatus.NotFound, plainText);
  30. }
  31. }
  32. }
  33. void server_worker(Socket client) {
  34. scope processor = new BenchmarkProcessor(client);
  35. try {
  36. processor.run();
  37. }
  38. catch(Exception e) {
  39. debug stderr.writeln(e);
  40. }
  41. }
  42. void server() {
  43. Socket server = new TcpSocket();
  44. server.setOption(SocketOptionLevel.SOCKET, SocketOption.REUSEADDR, true);
  45. server.bind(new InternetAddress("0.0.0.0", 8080));
  46. server.listen(1000);
  47. debug writeln("Started server");
  48. void processClient(Socket client) {
  49. go(() => server_worker(client));
  50. }
  51. while(true) {
  52. try {
  53. debug writeln("Waiting for server.accept()");
  54. Socket client = server.accept();
  55. debug writeln("New client accepted");
  56. processClient(client);
  57. }
  58. catch(Exception e) {
  59. writefln("Failure to accept %s", e);
  60. }
  61. }
  62. }
  63. void main() {
  64. initPhoton();
  65. go(() => server());
  66. runScheduler();
  67. }