| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134 |
- /*
- * sample http server
- * more detail see examples/httpd
- *
- */
- #include "HttpServer.h"
- #include "hthread.h" // import hv_gettid
- #include "hasync.h" // import hv::async
- using namespace hv;
- /*
- * #define TEST_HTTPS 1
- *
- * @build ./configure --with-openssl && make clean && make
- *
- * @server bin/http_server_test 8080
- *
- * @client curl -v http://127.0.0.1:8080/ping
- * curl -v https://127.0.0.1:8443/ping --insecure
- * bin/curl -v http://127.0.0.1:8080/ping
- * bin/curl -v https://127.0.0.1:8443/ping
- *
- */
- #define TEST_HTTPS 0
- int main(int argc, char** argv) {
- HV_MEMCHECK;
- int port = 0;
- if (argc > 1) {
- port = atoi(argv[1]);
- }
- if (port == 0) port = 8080;
- HttpService router;
- /* Static file service */
- // curl -v http://ip:port/
- router.Static("/", "./html");
- /* Forward proxy service */
- router.EnableForwardProxy();
- // curl -v http://httpbin.org/get --proxy http://127.0.0.1:8080
- router.AddTrustProxy("*httpbin.org");
- /* Reverse proxy service */
- // curl -v http://ip:port/httpbin/get
- router.Proxy("/httpbin/", "http://httpbin.org/");
- /* API handlers */
- // curl -v http://ip:port/ping
- router.GET("/ping", [](HttpRequest* req, HttpResponse* resp) {
- return resp->String("pong");
- });
- // curl -v http://ip:port/data
- router.GET("/data", [](HttpRequest* req, HttpResponse* resp) {
- static char data[] = "0123456789";
- return resp->Data(data, 10 /*, false */);
- });
- // curl -v http://ip:port/paths
- router.GET("/paths", [&router](HttpRequest* req, HttpResponse* resp) {
- return resp->Json(router.Paths());
- });
- // curl -v http://ip:port/get?env=1
- router.GET("/get", [](const HttpContextPtr& ctx) {
- hv::Json resp;
- resp["origin"] = ctx->ip();
- resp["url"] = ctx->url();
- resp["args"] = ctx->params();
- resp["headers"] = ctx->headers();
- return ctx->send(resp.dump(2));
- });
- // curl -v http://ip:port/echo -d "hello,world!"
- router.POST("/echo", [](const HttpContextPtr& ctx) {
- return ctx->send(ctx->body(), ctx->type());
- });
- // curl -v http://ip:port/user/123
- router.GET("/user/{id}", [](const HttpContextPtr& ctx) {
- hv::Json resp;
- resp["id"] = ctx->param("id");
- return ctx->send(resp.dump(2));
- });
- // curl -v http://ip:port/async
- router.GET("/async", [](const HttpRequestPtr& req, const HttpResponseWriterPtr& writer) {
- writer->Begin();
- writer->WriteHeader("X-Response-tid", hv_gettid());
- writer->WriteHeader("Content-Type", "text/plain");
- writer->WriteBody("This is an async response.\n");
- writer->End();
- });
- // middleware
- router.AllowCORS();
- router.Use([](HttpRequest* req, HttpResponse* resp) {
- resp->SetHeader("X-Request-tid", hv::to_string(hv_gettid()));
- return HTTP_STATUS_NEXT;
- });
- HttpServer server;
- server.service = &router;
- server.port = port;
- #if TEST_HTTPS
- server.https_port = 8443;
- hssl_ctx_opt_t param;
- memset(¶m, 0, sizeof(param));
- param.crt_file = "cert/server.crt";
- param.key_file = "cert/server.key";
- param.endpoint = HSSL_SERVER;
- if (server.newSslCtx(¶m) != 0) {
- fprintf(stderr, "new SSL_CTX failed!\n");
- return -20;
- }
- #endif
- // uncomment to test multi-processes
- // server.setProcessNum(4);
- // uncomment to test multi-threads
- // server.setThreadNum(4);
- server.start();
- // press Enter to stop
- while (getchar() != '\n');
- hv::async::cleanup();
- return 0;
- }
|