A collection of C++ HTTP libraries including an easy to use HTTP server.

Overview

Proxygen: Facebook's C++ HTTP Libraries

Linux Build Status macOS Build Status

This project comprises the core C++ HTTP abstractions used at Facebook. Internally, it is used as the basis for building many HTTP servers, proxies, and clients. This release focuses on the common HTTP abstractions and our simple HTTPServer framework. Future releases will provide simple client APIs as well. The framework supports HTTP/1.1, SPDY/3, SPDY/3.1, HTTP/2, and HTTP/3. The goal is to provide a simple, performant, and modern C++ HTTP library.

We have a Google group for general discussions at https://groups.google.com/d/forum/facebook-proxygen.

The original blog post also has more background on the project.

Installing

Note that currently this project has been tested on Ubuntu 18.04 and Mac OSX although it likely works on many other platforms.

You will need at least 3 GiB of memory to compile proxygen and its dependencies.

Easy Install

Just run ./build.sh from the proxygen/ directory to get and build all the dependencies and proxygen. You can run the tests manually with cd _build/ && make test. Then run ./install.sh to install it. You can remove the temporary build directory (_build) and ./build.sh && ./install.sh to rebase the dependencies, and then rebuild and reinstall proxygen.

Other Platforms

If you are running on another platform, you may need to install several packages first. Proxygen and folly are all Autotools based projects.

Introduction

Directory structure and contents:

Directory Purpose
proxygen/external/ Contains non-installed 3rd-party code proxygen depends on.
proxygen/lib/ Core networking abstractions.
proxygen/lib/http/ HTTP specific code. (including HTTP/2 and HTTP/3)
proxygen/lib/services/ Connection management and server code.
proxygen/lib/utils/ Miscellaneous helper code.
proxygen/httpserver/ Contains code wrapping proxygen/lib/ for building simple C++ http servers. We recommend building on top of these APIs.

Architecture

The central abstractions to understand in proxygen/lib are the session, codec, transaction, and handler. These are the lowest level abstractions, and we don't generally recommend building off of these directly.

When bytes are read off the wire, the HTTPCodec stored inside HTTPSession parses these into higher-level objects and associates with it a transaction identifier. The codec then calls into HTTPSession which is responsible for maintaining the mapping between transaction identifier and HTTPTransaction objects. Each HTTP request/response pair has a separate HTTPTransaction object. Finally, HTTPTransaction forwards the call to a handler object which implements HTTPTransaction:: Handler. The handler is responsible for implementing business logic for the request or response.

The handler then calls back into the transaction to generate egress (whether the egress is a request or response). The call flows from the transaction back to the session, which uses the codec to convert the higher-level semantics of the particular call into the appropriate bytes to send on the wire.

The same handler and transaction interfaces are used to both create requests and handle responses. The API is generic enough to allow both. HTTPSession is specialized slightly differently depending on whether you are using the connection to issue or respond to HTTP requests.

Core Proxygen Architecture

Moving into higher levels of abstraction, proxygen/HTTP server has a simpler set of APIs and is the recommended way to interface with proxygen when acting as a server if you don't need the full control of the lower level abstractions.

The basic components here are HTTPServer, RequestHandlerFactory, and RequestHandler. An HTTPServer takes some configuration and is given a RequestHandlerFactory. Once the server is started, the installed RequestHandlerFactory spawns a RequestHandler for each HTTP request. RequestHandler is a simple interface users of the library implement. Subclasses of RequestHandler should use the inherited protected member ResponseHandler* downstream_ to send the response.

Using it

Proxygen is a library. After installing it, you can build your C++ server. Try cd ing to the directory containing the echo server at proxygen/httpserver/samples/echo/.

After building proxygen you can start the echo server with _build/proxygen/httpserver/proxygen_echo and verify it works using curl in a different terminal:

$ curl -v http://localhost:11000/
*   Trying 127.0.0.1...
* Connected to localhost (127.0.0.1) port 11000 (#0)
> GET / HTTP/1.1
> User-Agent: curl/7.35.0
> Host: localhost:11000
> Accept: */*
>
< HTTP/1.1 200 OK
< Request-Number: 1
< Date: Thu, 30 Oct 2014 17:07:36 GMT
< Connection: keep-alive
< Content-Length: 0
<
* Connection #0 to host localhost left intact

You can find other samples:

  • a simple server that supports HTTP/2 server push (_build/proxygen/httpserver/proxygen_push),
  • a simple server for static files (_build/proxygen/httpserver/proxygen_static)
  • a simple fwdproxy (_build/proxygen/httpserver/proxygen_proxy)
  • a curl-like client (_build/proxygen/httpclient/samples/curl/proxygen_curl)

QUIC and HTTP/3

Proxygen supports HTTP/3!

It depends on Facebook's mvfst library for the IETF QUIC transport implementation, so we have made that dependency optional. You can build the HTTP/3 code, tests and sample binaries with ./build.sh --with-quic.

This will also build a handy command-line utility that can be used as an HTTP/3 server and client.

Sample usage:

_build/proxygen/httpserver/hq --mode=server
_build/proxygen/httpserver/hq --mode=client --path=/

The utility supports the qlog logging format; just start the server with the --qlogger_path option and many knobs to tune both the quic transport and the http layer.

Documentation

We use Doxygen for Proxygen's internal documentation. You can generate a copy of these docs by running Doxygen Doxyfile from the project root. You'll want to look at html/namespaceproxygen.html to start. This will also generate folly documentation.

License

See LICENSE.

Contributing

Contributions to Proxygen are more than welcome. Read the guidelines in CONTRIBUTING.md. Make sure you've signed the CLA before sending in a pull request.

Whitehat

Facebook has a bounty program for the safe disclosure of security bugs. If you find a vulnerability, please go through the process outlined on that page and do not file a public issue.

Issues
  • Connection Pooling doesn't work

    Connection Pooling doesn't work

    I'm trying to implement a connection pool for the http client. I'm attempting to store for every remote address (host:port) a queue of HTTPUpstreamSessions that I can reuse. I'm having issues reusing those sessions. Looking through all handlers and callbacks of HTTPTransaction and HTTPUpstreamSession, I can't find a callback in which I can put the HTTPUpstreamSession back into the pool and have it reused, for a new transaction. Furthermore, if one of the transactions in the session receives a timeout, the session is destroyed.

    The performance for creating a new Session and transaction for every outbound request is pretty bad, which defeats the purposed of switching to Proxygen. Can anyone please point me to the right direction? Or there needs to be some code change for that?

    PS: Using regular HTTP 1.1, no ssl, simple request/response.

    Thanks

    opened by michaelpog 19
  • Add HTTP routing

    Add HTTP routing

    I have written a HTTP router by extending RequestHandlerFactory to multiplex paths to RequestHandler implementations. The routing uses a compacted prefix tree.

    Is this something you are interested in having in your repo or should I create a separate repo for it? If you are interested then I will merge it with tests into a public fork and then submit a PR.

    enhancement help wanted 
    opened by jamperry 18
  • How to create Persistent HTTPSession to serve multiple transactions

    How to create Persistent HTTPSession to serve multiple transactions

    Question

    We would like to implement a Http-Client which can cache the session and reuse the same HTTPSession for sub-sequent http-requests so, we can avoid new connection-creation for every new request. I have followed the example provided at CurlClientMain.cpp.

    Issue: I am not able to use created session (proxygen::HTTPUpstreamSession) more than once. HTTPConnector creates a session for very first time and creates a txn on it to serve a http-request. Once, given http-request executes fully, I am trying to reuse the same session by checking if that session is reusable using below condition. proxygen::HTTPUpstreamSession::isReusable() But once, a first txn completes it shutdowns the session and it's not reusable anymore and function call on session.isReusable() gives segmentation fault as session is already shutdown.

    Stacktrace:

    • I have tried to debug the issue and realized as soon as txn completes it shutdowns the session and I can get below stacktrace.
    • So, is there any way, I can create a persistent-session and cache the session and reuse it to create new transaction again to serve new http-request?

    Tag: v2018.04.02.00

    Thread 1 "serverTest" hit Breakpoint 1, proxygen::HTTPSession::checkForShutdown ([email protected]=0x7e1ad0) at session/HTTPSession.cpp:2092
    2092	in session/HTTPSession.cpp
    (gdb) bt
    #0  proxygen::HTTPSession::checkForShutdown ([email protected]=0x7e1ad0) at session/HTTPSession.cpp:2092
    #1  0x00007ffff785863b in proxygen::HTTPSession::shutdownTransport ([email protected]=0x7e1ad0, shutdownReads=<optimized out>, [email protected]=false, 
        shutdownWrites=<optimized out>, [email protected]=true, errorMsg="") at session/HTTPSession.cpp:2027
    #2  0x00007ffff7861027 in proxygen::HTTPSession::detach (this=0x7e1ad0, txn=<optimized out>) at session/HTTPSession.cpp:1607
    #3  0x00007ffff7830f02 in proxygen::HTTPTransaction::onDelayedDestroy (this=0x7e0928, delayed=<optimized out>) at session/HTTPTransaction.cpp:110
    #4  0x00007ffff78365a5 in proxygen::HTTPTransaction::processIngressEOM (this=0x7e0928) at session/HTTPTransaction.cpp:442
    #5  0x00007ffff7837ae5 in proxygen::HTTPTransaction::onIngressEOM ([email protected]=0x7e0928) at session/HTTPTransaction.cpp:437
    #6  0x00007ffff785d83d in proxygen::HTTPSession::onMessageComplete (this=0x7e1ad0, streamID=<optimized out>, upgrade=<optimized out>)
        at session/HTTPSession.cpp:853
    #7  0x00007ffff7883690 in proxygen::HTTP1xCodec::onMessageComplete ([email protected]=0x7e0820) at codec/HTTP1xCodec.cpp:1079
    #8  0x00007ffff78838ea in proxygen::HTTP1xCodec::onMessageCompleteCB (parser=<optimized out>) at codec/HTTP1xCodec.cpp:1232
    #9  0x00007ffff7845629 in proxygen::http_parser_execute ([email protected]=0x7e0838, settings=<optimized out>, 
        [email protected]=0x7e3110 "HTTP/1.1 200 OK \r\nHost: 127.0.0.1:9999\r\nContent-Length: 63\r\nAccept: */*\r\nUser-Agent: my-agent-http\r\nConnection: keep-alive\r\n\r\n{ \"key\" : \"x\", \"sKey\" : \"y\", \"token\" : \"z\" }\r\n", [email protected]=189)
        at ../../external/http_parser/http_parser_cpp.cpp:1982
    #10 0x00007ffff78856f8 in proxygen::HTTP1xCodec::onIngress (this=0x7e0820, buf=...) at codec/HTTP1xCodec.cpp:201
    #11 0x00007ffff78568f9 in proxygen::HTTPSession::processReadData ([email protected]=0x7e1ad0) at session/HTTPSession.cpp:487
    #12 0x00007ffff7856d13 in proxygen::HTTPSession::readDataAvailable (this=0x7e1ad0, readSize=189) at session/HTTPSession.cpp:440
    #13 0x00007ffff6e35f22 in folly::AsyncSocket::handleRead (this=0x7e0500) at io/async/AsyncSocket.cpp:1900
    #14 0x00007ffff6e30ff9 in folly::AsyncSocket::ioReady (this=0x7e0500, events=2) at io/async/AsyncSocket.cpp:1710
    #15 0x00007ffff586aa14 in event_base_loop () from /lib64/libevent-2.0.so.5
    #16 0x00007ffff6e57d1a in folly::EventBase::loopBody (this=0x7fffffffdce0, flags=<optimized out>) at io/async/EventBase.cpp:313
    
    opened by rdhabalia 17
  • Ubuntu16.04 complile

    Ubuntu16.04 complile "proxygen"(master version) get DSO error

    compile environment information: ubuntu16.04 64bit gcc-5.4 when i run proxygen deps.sh to compile proxygen. i got an error: libtool: link: ranlib .libs/libqcram.a libtool: link: rm -fr .libs/libqcram.lax libtool: link: ( cd ".libs" && rm -f "libqcram.la" && ln -s "../libqcram.la" "libqcram.la" ) /bin/bash ../../libtool --tag=CXX --mode=link g++ -std=gnu++14 -pthread -DLIBMC_FBTRACE_DISABLE -Wno-missing-field-initializers -Wno-deprecated -O3 -g -W -Wall -Wextra -Wno-unused-parameter -fno-strict-aliasing -g -O2 -o CompressionSimulator codec/compress/test/HTTPArchive.o codec/compress/experimental/simulator/Main.o codec/compress/experimental/simulator/CompressionSimulator.o libqpack.la libqcram.la libproxygenhttp.la ../services/libproxygenservices.la -liberty -lwangle -lfolly -lz -lssl -lcrypto -levent -lgflags -lglog -L/usr/lib64 -lpthread -pthread -lfolly -lglog -ldouble-conversion -lboost_system -lboost_thread libtool: link: g++ -std=gnu++14 -pthread -DLIBMC_FBTRACE_DISABLE -Wno-missing-field-initializers -Wno-deprecated -O3 -g -W -Wall -Wextra -Wno-unused-parameter -fno-strict-aliasing -g -O2 -o CompressionSimulator codec/compress/test/HTTPArchive.o codec/compress/experimental/simulator/Main.o codec/compress/experimental/simulator/CompressionSimulator.o -pthread ./.libs/libqpack.a -L/usr/lib64 ./.libs/libqcram.a ./.libs/libproxygenhttp.a ../services/.libs/libproxygenservices.a -liberty -lwangle -lz -lssl -lcrypto -levent -lgflags -lpthread -lfolly -lglog -ldouble-conversion -lboost_system -lboost_thread -pthread /usr/bin/ld: //usr/local/lib/libfolly.a(CacheLocality.cpp.o): undefined reference to symbol '[email protected]@GLIBC_2.2.5' //lib/x86_64-linux-gnu/libdl.so.2: error adding symbols: DSO missing from command line collect2: error: ld returned 1 exit status Makefile:916: recipe for target 'CompressionSimulator' failed make[5]: *** [CompressionSimulator] Error 1 make[5]: Leaving directory '/home/cxh/CLionProjects/proxygen/proxygen/lib/http' Makefile:1144: recipe for target 'all-recursive' failed make[4]: *** [all-recursive] Error 1 make[4]: Leaving directory '/home/cxh/CLionProjects/proxygen/proxygen/lib/http' Makefile:661: recipe for target 'all' failed make[3]: *** [all] Error 2 make[3]: Leaving directory '/home/cxh/CLionProjects/proxygen/proxygen/lib/http' Makefile:512: recipe for target 'all-recursive' failed make[2]: *** [all-recursive] Error 1 make[2]: Leaving directory '/home/cxh/CLionProjects/proxygen/proxygen/lib' Makefile:418: recipe for target 'all-recursive' failed make[1]: *** [all-recursive] Error 1 make[1]: Leaving directory '/home/cxh/CLionProjects/proxygen/proxygen' Makefile:350: recipe for target 'all' failed make: *** [all] Error 2

    i decide to add -ldl LDFLAGS in somewhere CMakeLists.txt to deal with the issues. But i couldn't known how to add it . So everyone can help me,give some ideas,thanks very much.

    opened by loveleon 16
  • void HTTPSession::scheduleWrite() does not run in EventBaseThread

    void HTTPSession::scheduleWrite() does not run in EventBaseThread

    Hello,

    I'm getting an error w/ the HTTPSession.

    Problem Setup:

    1. Start a simple http server w/ say an artificially high number of threads 30 or whatever.
    2. Don't respond to http callbacks for a while.. i.e:
    
    //wait for a while
    proxygen::ResponseBuilder(downstream_).status(200, "OK).sendEOM();
    
    

    Expected output:

    None, I just didn't expect the EventBase to crash.

    Source of the problem

    
    void
    HTTPSession::scheduleWrite() {
      // Do all the network writes for this connection in one batch at
      // the end of the current event loop iteration.  Writing in a
      // batch helps us packetize the network traffic more efficiently,
      // as well as saving a few system calls.
      if (!isLoopCallbackScheduled() &&
          (writeBuf_.front() || !txnEgressQueue_.empty())) {
        VLOG(5) << *this << " scheduling write callback";
        sock_->getEventBase()->runInLoop(this);
      }
    }
    
    

    eventBase->runInLoop(this)

    does this:

    
    
    void EventBase::runInLoop(LoopCallback* callback, bool thisIteration) {
      DCHECK(isInEventBaseThread());
      callback->cancelLoopCallback();
      callback->context_ = RequestContext::saveContext();
      if (runOnceCallbacks_ != nullptr && thisIteration) {
        runOnceCallbacks_->push_back(*callback);
      } else {
        loopCallbacks_.push_back(*callback);
      }
    }
    
    

    So the issue would be simply fix by

    auto eb = sock_->getEventBase();
    eb->runInEventBase([this, ](){ 
        eb->runInLoop(this);
    });
    
    

    Any thoughts? Happy to make the PR.

    opened by emaxerrno 16
  • For Travis just build Docker image.

    For Travis just build Docker image.

    Instead of removing Travis whatsoever, we could use the Travis to just build the Docker container, since it proves that the code is compiling fine.

    However there's one problem: the build takes too long on free Travis, so I have a hard time validating this pull request. It timed out.

    https://travis-ci.org/wkoszek/proxygen/builds/140990904

    Does Facebook have a commercial Travis account? Would you be willing to accept the pull request and start building proxygen again?

    CLA Signed GH Review: review-needed 
    opened by wkoszek 15
  • Unable to install Proxygen

    Unable to install Proxygen

    I ran the commands as mentioned (run ./deps.sh and then ./reinstall.sh) but the installation fails. Here are the last few lines of the make output: https://gist.github.com/vaibhav-kaushal/586b51257494d56e673a

    Basically it never gets out of that tests folder. Here is a screenshot:

    screenshot 2014-12-26 17 54 07

    I have waited for more than an hour, nothing happened. I tried reinstalling the things again and again but fails every time. I have an Ubuntu updated 14.04 (desktop). What might be the problem here?

    opened by vaibhav-kaushal 15
  • Segfault making SSL request

    Segfault making SSL request

    Most of my SSL request work okay but I am getting this segfault which seem to be coming from libcrypto searches for similar error say it might be openssl thing and should change the lib to some other ?

    https://gist.github.com/abhiguru/26eb6ac11f9b32f386578e97d940b55e

    #0 0x00007ffff709d384 in RSA_free () from /lib/x86_64-linux-gnu/libcrypto.so.1.0.0 No symbol table info available. #1 0x00007ffff7429356 in ?? () from /lib/x86_64-linux-gnu/libssl.so.1.0.0 No symbol table info available. #2 0x00007ffff7427e92 in SSL_free () from /lib/x86_64-linux-gnu/libssl.so.1.0.0 No symbol table info available. #3 0x00007ffff79efa3f in folly::AsyncSSLSocket::closeNow (this=0x7fffe00f1540) at io/async/AsyncSSLSocket.cpp:307 dg = {dd_ = 0x7fffe00f19d8} #4 0x0000555555931563 in proxygen::HTTPSession::shutdownTransport ([email protected]=0x7fffe0008910, [email protected]=false, shutdownWrites=, [email protected]=true, errorMsg="") at session/HTTPSession.cpp:1956 guard = {dd_ = 0x7fffe00089a0} notifyEgressShutdown = false notifyIngressShutdown = false error = #5 0x000055555593bbaa in proxygen::HTTPSession::detach (this=0x7fffe0008910, txn=) at session/HTTPSession.cpp:1554 guard = {dd_ = 0x7fffe00089a0} it = {first = 1, second = warning: RTTI symbol not found for class 'folly::HHWheelTimer::Callback'

    {folly::HHWheelTimer::Callback = {<boost::intrusive::list_base_hook<boost::intrusive::link_mode<(boost::intrusive::link_mode_type)2>, void, void>> = {<boost::intrusive::generic_hook<boost::intrusive::ci rcular_list_algorithms<boost::intrusive::list_node_traits<void*> >, boost::intrusive::dft_tag, (boost::intrusive::link_mode_type)2, (boost::intrusive::base_hook_type)1>> = {<boost::intrusive::node_holder< boost::intrusive::list_node<void*>, boost::intrusive::dft_tag, 1u>> = {<boost::intrusive::list_node<void*>> = {next_ = , prev_ = }, }, <boost::intrusive::hook_tags_definer<boost::intrusive::generic_hook<boost::intrusive::circular_list_algorithms<boost::intrusive::list_node_traits<void*>

    , boost::intrusive::dft_tag, (boost::intrusive::link_mode_type)2, (boost::intrusive::base_hook_type)1>, 1u>> = {}, }, }, vptr.Callback = <vtable for folly::HHWheelTimer::Callback+16>, wheel = , expiration_ = {r = 0}, bucket = -1, context = std::shared_ptr (empty) 0x0}, folly::DelayedDestructionBase = {boost::noncopyable_::noncopyable = {}, vptr.DelayedDestructionBase = <vtable for proxygen::HTTPTransaction+232>, guardCount = 0}, rateLimitCallback_ = warning: RTTI symbol not found for class 'folly::HHWheelTimer::Callback'

    {folly::HHWheelTimer::Callback = {<boost::intrusive::list_base_hook<boost::intrusive::link_mode<(boost::intrusive::link_mode_type)2>, void, void>> = {<boost::intrusive::generic_hook<boost::intrusive::ci rcular_list_algorithms<boost::intrusive::list_node_traits<void*> >, boost::intrusive::dft_tag, (boost::intrusive::link_mode_type)2, (boost::intrusive::base_hook_type)1>> = {<boost::intrusive::node_holder< boost::intrusive::list_node<void*>, boost::intrusive::dft_tag, 1u>> = {<boost::intrusive::list_node<void*>> = {next_ = , prev_ = }, }, <boost::intrusive::hook_tags_definer<boost::intrusive::generic_hook<boost::intrusive::circular_list_algorithms<boost::intrusive::list_node_traits<void *> >, boost::intrusive::dft_tag, (boost::intrusive::link_mode_type)2, (boost::intrusive::base_hook_type)1>, 1u>> = {}, }, }, vptr.Callback = <vtable for folly::HHWheelTimer::Callback+16>, wheel = , expiration_ = {r = 0}, bucket = -1, context = std::shared_ptr (empty) 0x0}, txn_ = warning: RTTI symbol not f ound for class 'folly::HHWheelTimer::Callback' }, deferredIngress_ = std::unique_ptr<std::queue<proxygen::HTTPEvent, std::deque<proxygen::HTTPEvent, std::allocatorproxygen::HTTPEvent > >> containing 0x0, maxDeferredIngress_ = 0, deferredEgressBody_ = {static kChainLengthNotCached = 18446744073709551615, options_ = {cacheChainLength = true}, chainLength_ = 0, head_ = std::unique_ptrfolly::IOBuf containing 0x0}, direction_ = proxygen::TransportDirection::UPSTREAM, id_ = 1, seqNo_ = 0, handler_ = , transport_ = , egressState_ = proxygen::HTTPTransactionEgressSMData::State::SendingDone, ingressState_ = proxygen::HTTPTransactionIngressSMData::State::ReceivingDone, timeout_ = {wheelTimerPtr_ = , wheelTimer_ = std::weak_ptr (empty) 0x0, wheelTimerGuard_ = {dd_ = }, defaultTimeoutMS_ = {r = 140737140213136}}, stats = , recvWindow = {outstanding_ = 0, capacity_ = 65536}, sendWindow_ = {outstanding_ = 0, capacity_ = 1048576}, transportCallback_ = , trailers_ = std::unique_ptrproxygen::HTTPHeaders containing 0x0, chunkHeaders_ = {<std::cxx11::List_base<proxygen::HTTPTransaction::Chunk, std::allocatorproxygen::HTTPTransaction::Chunk >> = { M_impl = {<std::allocator<std::List_nodeproxygen::HTTPTransaction::Chunk >> = {<gnu_cxx::new_allocator<std::List_nodeproxygen::HTTPTransaction::Chunk >> = {}, }, M_node = {std::__detail::_List_node_base = {M_next = , M_prev = }, M_storage = {M_storage = "\000\000\000\000\000\000\000"}}}}, }, egressQueue = , queueHandle = , recvToAck = 43425, assocStreamId = 0, pushedTransactions = std::set with 0 elements, priority = {streamDependency = 0, exclusive = false, weight = 15 '\017'}, insertDepth = 0, currentDepth = 1, cumulativeRatio = 0, egressCalls = 0, lastResponseStatus = 200, expectedContentLengthRemaining = {storage = {{hasValue = true, {paddingForHasValue_ = {true},

    opened by abhiguru 13
  • Server & Client duplicate singleton registration of folly::Singleton proxygen::SharedWheelTimer

    Server & Client duplicate singleton registration of folly::Singleton proxygen::SharedWheelTimer

    First, thanks very much for releasing proxygen. It's been a fantastic building block for us. We really appreciate it. I'm running into trouble trying to use proxygen sample client code inside a binary which runs proxygen::HTTPServer.

    To produce a similar error, apply the following patch:

    $ git diff Makefile.am
    diff --git a/proxygen/httpclient/samples/curl/Makefile.am b/proxygen/httpclient/samples/curl/Makefile
    index 6cbeaab..d3024e8 100644
    --- a/proxygen/httpclient/samples/curl/Makefile.am
    +++ b/proxygen/httpclient/samples/curl/Makefile.am
    @@ -11,7 +11,8 @@ libproxygencurl_la_SOURCES = \
    
     libproxygencurl_la_LIBADD = \
             ../../../lib/libproxygenlib.la \
    -       ../../../lib/http/libproxygenhttp.la
    +       ../../../lib/http/libproxygenhttp.la \
    +       ../../../httpserver/libproxygenhttpserver.la
    
     libproxygencurl_la_LDFLAGS=-static
    

    After a successful build & link (had to make clean to pickup changes), the following error:

    $ ./curl
    Double registration of singletons of the same underlying type; check for multiple definitions of type folly::Singleton<proxygen::SharedWheelTimer>
    Aborted (core dumped)
    

    The above exposes the symptom but isn't very useful. The symptom in my build is the following:

    • If linking to libproxygenhttpserver, there's an undefined reference to proxygen::HTTPUpstreamSession
    • If linking to libproxygenlib, there's an undefined reference to proxygen::HTTPServer
    • If linking to both, the error with double registration of proxygen::SharedWheelTimer
    • Note the proxgen .deb file does not include libproxygenhttp, so I haven't included that in my tests.

    I hope that this is sensible on some level. Thank you for your attention. -dg

    opened by suspend0 13
  • Folding HQ/H3 into HTTPServer

    Folding HQ/H3 into HTTPServer

    As per afrind's suggestion, opening an issue:

    #######################################################

    Is there a plan to "fold" HQ into HTTPServer proper ?

    Borrowing from sample EchoServer.cpp code, would love to have something like example below.

    With 0 changes to existing app, incorporate support for QUIC and later on, H3, in part related to HTTP .

    ################### using Protocol = HTTPServer::Protocol;

    DEFINE_int32(http_port, 11000, "Port to listen on with HTTP protocol"); DEFINE_int32(spdy_port, 11001, "Port to listen on with SPDY protocol"); DEFINE_int32(h2_port, 11002, "Port to listen on with HTTP/2 protocol"); DEFINE_int32(h3_port, 11003, "Port to listen on with HTTP/3 protocol");**

    ... HTTPServer server(std::move(options)); server.bind(IPs);

    // Start HTTPServer mainloop in a separate thread std::thread t([&] () { server.start(); });

    opened by psetevik 12
  • Body sent on HEAD request

    Body sent on HEAD request

    As noted at https://reviews.facebook.net/D38373 , Proxygen does not suppress the sending of the response body when the request is a HEAD request. In fact, even if the application sends no response data, if the HTTPMessage::chunked_ flag is set, HTTP1xCodec::generateEOM() will send an empty chunk "0\r\n", which is a protocol violation.

    It's arguable whether a Transfer-Encoding header should be sent on HEAD, but either way, the policy should be Proxygen's responsibility, rather than the application's, which means that the application should be allowed to call HTTPMessage::setIsChunked() on the response to a HEAD request without causing a protocol violation.

    I'm not sure how much help Proxygen should give to applications wishing to implement HEAD handling. Certainly, it should not require applications to send a response body to Proxygen to be discarded, since that is inefficient, but maybe Proxygen could automatically discard a response body if one is given.

    opened by tstarling 12
  • add `URL::join(string_view relative)` ?

    add `URL::join(string_view relative)` ?

    It would be very convenient to have URL::join function to construct a new URL from an existing URL and a relative path (for example one from Location server header on 302-redirect).

    Despite simplicity, implementation has some corner cases, including security sensitive ones, so it is better to have it implemented in a library than to left is an an exercise to a library user.

    opened by kvtb 0
  • Running demo HTTP/3 server via browser

    Running demo HTTP/3 server via browser

    Hi all. I'm trying to run the demo HTTP/3 server locally via Firefox, but it fails.

    I'm using the release v2022.07.04.00. The build and test were successful. I ran the demo hq server using the following command:

    _build/proxygen/httpserver/hq \
            --mode=server \
            --h2port=8080 \
            --port=8443 \
            --protocol=h3 \
            --cert=keys/cert.pem \
            --key=keys/key.key \
            --static-root=./
    

    I created a simple index.html file in the static-root dir, and tried to open it in Firefox with the link https://localhost:8443/index.html for HTTP/3. But the result was "Unable to connect". Meanwhile, the link https://localhost:8080/index.html for HTTP/2 was successful.

    I noticed a suggestion in https://github.com/facebook/proxygen/issues/353 saying that I might need to set the same port for both HTTP versions. I also tried that but still Firefox could only connect to the server via HTTP/2.

    I actually used quic-go to run HTTP/3 locally before, and it worked. So I don't think there was any problem with the browser.

    opened by chanh1964 2
  • HTTP3 and QUIC server/client

    HTTP3 and QUIC server/client

    Hello,

    I tried running _build/proxygen/httpserver/hq --mode=server _build/proxygen/httpserver/hq --mode=client --path=www.google.com

    and I got I0626 17:42:58.275476 236823 HQClient.cpp:61] HQClient connecting to [::1]:6666 I0626 17:42:58.278154 236823 CurlClient.cpp:187] Sending request for www.google.com I0626 17:42:58.278918 236823 CurlClient.cpp:273] Got EOM for www.google.com. Txn Time= 0 ms

    My question is that is this client really sending requests to the server to load the page address that we put after --path? Or there is no http3 client implementation in Proxygen yet? How can we check the responses from the server?

    Thanks.

    opened by NooshinEghbal 0
  • how to transfers files from client to servers

    how to transfers files from client to servers

    my code is like this:

    class SendFileClient : public proxygen::HTTPConnector::Callback,
                           public proxygen::HTTPTransactionHandler{
    void connectSuccess(proxygen::HTTPUpstreamSession* session) override{
    proxygen::HTTPTransaction* txn = session->newTransaction(this);
    proxygen::HTTPMessage request;
    request_.setMethod(proxygen::HTTPMethod::PUT);
      request_.setURL(url_.makeRelativeURL());
      request_.setSecure(false);
    
      if (!request_.getHeaders().getNumberOfValues(proxygen::HTTP_HEADER_USER_AGENT)) {
        request_.getHeaders().add(proxygen::HTTP_HEADER_USER_AGENT, "proxygen_curl");
      }
      if (!request_.getHeaders().getNumberOfValues(proxygen::HTTP_HEADER_HOST)) {
        request_.getHeaders().add(proxygen::HTTP_HEADER_HOST, url_.getHostAndPort());
      }
      if (!request_.getHeaders().getNumberOfValues(proxygen::HTTP_HEADER_ACCEPT)) {
        request_.getHeaders().add("Accept", "*/*");
      }
    txn_->sendHeaders(request_);
      const uint16_t kReadSize = 4096;
      int32_t fd = ::open("/tmp/sendFile", O_RDWR);
      while (true) {
        std::unique_ptr<folly::IOBuf> buf = folly::IOBuf::createCombined(kReadSize);
        int32_t len = ::read(fd, reinterpret_cast<char*>(buf->writableData()), kReadSize);
        if (len) {
          buf->append(len);
          txn_->sendBody(std::move(buf));
        } else {
          txn_->sendEOM();
          break;
        }
      }
      ::close(fd);
    }
    }
    
    class RecvFilesHandler : public proxygen::RequestHandler{
    void onRequest(std::unique_ptr<proxygen::HTTPMessage> headers) noexcept override{
    fd_ = ::open("/tmp/recvFile", O_RDWR | O_CREAT | O_TRUNC, S_IRUSR | S_IWUSR);
    }
    
    void onBody(std::unique_ptr<folly::IOBuf> body) noexcept override{
      ssize_t bytesWritten = ::write(fd_, body->data(), body->length());
    }
    
    void onEOM() noexcept override{
    ::close(fd_);
    }
    int fd_;
    }
    

    In my test, the RecvFilesHandler could receive headers, but can't receive the body. Did I miss something?

    opened by liwenhui-soul 0
  • chore: Included githubactions in the dependabot config

    chore: Included githubactions in the dependabot config

    This should help with keeping the GitHub actions updated on new releases. This will also help with keeping it secure.

    Dependabot helps in keeping the supply chain secure https://docs.github.com/en/code-security/dependabot

    GitHub actions up to date https://docs.github.com/en/code-security/dependabot/working-with-dependabot/keeping-your-actions-up-to-date-with-dependabot

    https://github.com/ossf/scorecard/blob/main/docs/checks.md#dependency-update-tool Signed-off-by: naveen [email protected]

    CLA Signed 
    opened by naveensrinivasan 0
  • chore: Set permissions for GitHub actions

    chore: Set permissions for GitHub actions

    Restrict the GitHub token permissions only to the required ones; this way, even if the attackers will succeed in compromising your workflow, they won’t be able to do much.

    • Included permissions for the action. https://github.com/ossf/scorecard/blob/main/docs/checks.md#token-permissions

    https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#permissions

    https://docs.github.com/en/actions/using-jobs/assigning-permissions-to-jobs

    Keeping your GitHub Actions and workflows secure Part 1: Preventing pwn requests

    Signed-off-by: neilnaveen [email protected]

    CLA Signed 
    opened by neilnaveen 0
Releases(v2022.08.08.00)
  • v2022.08.08.00(Aug 8, 2022)

    Automated release from TagIt

    File Hashes
    • SHA256(proxygen-v2022.08.08.00.zip)= 10c5e0020464769381ba88762e72194a6981eb649d3ae16ce785e4f186d3ef48
    • SHA512(proxygen-v2022.08.08.00.zip)= 53de545fc664d21278f248b7967b4765762f8fae33a392f092225883e4aa6adc7f61cc31a0668f57986db88a57c83d2868466f80fba7f31a1ba95b101bb3751b
    • SHA256(proxygen-v2022.08.08.00.tar.gz)= 134795b6ad8287836b87bcb6af191cb9991aafdd556505523f3b110e2ca599f7
    • SHA512(proxygen-v2022.08.08.00.tar.gz)= 0744366ace46862c788dd068beb2198c1390df09c330057436358085df551334f9b1bb5f490cbc496fe2e6dbf18bc146bfc8ec70c214714db921c9b5c8cb1bed
    Source code(tar.gz)
    Source code(zip)
    proxygen-v2022.08.08.00.tar.gz(1.03 MB)
    proxygen-v2022.08.08.00.zip(1.41 MB)
  • v2022.08.01.00(Aug 1, 2022)

    Automated release from TagIt

    File Hashes
    • SHA256(proxygen-v2022.08.01.00.zip)= 491947aa1cd6a6aee9793b634620994433acbc9d6a992adde7a055969952555b
    • SHA512(proxygen-v2022.08.01.00.zip)= a33a21aa8cdae0bb7b6482dccbbb71cdacb0ffcfbbcee9460d3a2879b985a2280f9e290efb9a39334efd76e79268a7511b75f5b6e19ebe9d2fb652563350e4f7
    • SHA256(proxygen-v2022.08.01.00.tar.gz)= df155359a37442abed689688f0ba4e61a811ba850b9d52cba62f32efda4b08b8
    • SHA512(proxygen-v2022.08.01.00.tar.gz)= a7e847b8b506e70b7a58be77273c2bf2f18c6bccb9a0ca8ea34c0ef5bd9b42505786bcb197c69bc4ebfae8911c751e282722fd83eefb1726d2ae1e7af9af62c1
    Source code(tar.gz)
    Source code(zip)
    proxygen-v2022.08.01.00.tar.gz(1.03 MB)
    proxygen-v2022.08.01.00.zip(1.41 MB)
  • v2022.07.25.00(Jul 25, 2022)

    Automated release from TagIt

    File Hashes
    • SHA256(proxygen-v2022.07.25.00.zip)= 52e35d55f0c63a0487d5a7a2ebe0b6e708f35d3020e8f40106e6ba3d8cb2c227
    • SHA512(proxygen-v2022.07.25.00.zip)= e0eee28b501281aa46e31d3557428fa3689c0d1316e36401f032b4bb17c1d4fbe249912cb3c84a8e7e64bed625c6cb7bc89801614987ce148d4e8d54b01c2d69
    • SHA256(proxygen-v2022.07.25.00.tar.gz)= e4a6a9da8aa8309f09c5ac2183704e18330fcd1f7bf4a101e074b788f58bb8c2
    • SHA512(proxygen-v2022.07.25.00.tar.gz)= 51b40fd4d1f43d38692f439e738b7480a8c4d91563cfac9d587e9b70e23d75da5db364ae051a4b71f047d5850bdfbe873b4af410b38d96d6191047555e5d1de8
    Source code(tar.gz)
    Source code(zip)
    proxygen-v2022.07.25.00.tar.gz(1.03 MB)
    proxygen-v2022.07.25.00.zip(1.41 MB)
  • v2022.07.18.00(Jul 18, 2022)

    Automated release from TagIt

    File Hashes
    • SHA256(proxygen-v2022.07.18.00.zip)= 27498e153fffc054f7abc369af2193ce49cab0965a95454ef54641f308095b2e
    • SHA512(proxygen-v2022.07.18.00.zip)= 09808831c5c61f3b811ff1d8879931c1a6f10196f1b30920fea096e6efb1d65379b99aef211adbcf4d9af2ba648827fb4d549abd48a3474360a771cdae60ec9c
    • SHA256(proxygen-v2022.07.18.00.tar.gz)= 73935625cec6eb220a1de53f7f84c8edc75ab302e5de3016bbe892b2edaf35a8
    • SHA512(proxygen-v2022.07.18.00.tar.gz)= f4537622d0db39053b62e921cca3accb6ce4cb676b52d9398ba5c5daa11f989771327738876f7ae212d09e80c86e6f9a9bf101678c054a70ed511b0ad88e7f9b
    Source code(tar.gz)
    Source code(zip)
    proxygen-v2022.07.18.00.tar.gz(1.03 MB)
    proxygen-v2022.07.18.00.zip(1.40 MB)
  • v2022.07.11.00(Jul 11, 2022)

    Automated release from TagIt

    File Hashes
    • SHA256(proxygen-v2022.07.11.00.zip)= 6bae4e6c5634367e98d44c638aecd630566048371da06bc1a850bf0ab2874881
    • SHA512(proxygen-v2022.07.11.00.zip)= 345ad22d1b3fa2853d7bbe421b679d036bd554a9a538b821c3c5352a477e3caadb2ca5ace6eb8b3b2f01a839260c44412b88ca185f3e2dddd95b1ebc9efbd2b4
    • SHA256(proxygen-v2022.07.11.00.tar.gz)= 3d5141b5bbe09811a3ee38fe30a6bcee5086b0850491931f35f235000876eb0f
    • SHA512(proxygen-v2022.07.11.00.tar.gz)= e8a183ffdf1ec47c44de272c98df96465af662888b981fb39c8a138b7993ef9daa6b7a32cb1016ac2aad25f3eaa0520c4ece00ddb365667c79f5a11dec79203c
    Source code(tar.gz)
    Source code(zip)
    proxygen-v2022.07.11.00.tar.gz(1.03 MB)
    proxygen-v2022.07.11.00.zip(1.40 MB)
  • v2022.07.04.00(Jul 4, 2022)

    Automated release from TagIt

    File Hashes
    • SHA256(proxygen-v2022.07.04.00.zip)= 73b01bc1c40a95fc484edc5b85e3cfc1323b0ea53af3cc3cd185e29a94c7cd23
    • SHA512(proxygen-v2022.07.04.00.zip)= 650b9d2ea26fcfb912e1e7267ca74f0b247646df5c6d6e5e5b581b8fe96cb0c4e4303dd6bbfedab457903eff926c121ca2745be8ca915e3123f8b9140e2b0987
    • SHA256(proxygen-v2022.07.04.00.tar.gz)= 4de47545a5beb9f3ac2ccdd62ae9def112b3cc361bb71820b9306a04f4bb40e9
    • SHA512(proxygen-v2022.07.04.00.tar.gz)= d47db3836c3d666da82a2b8fbb082c61fc1b50245ef47e5785fe531777b71bf629fad5a3620e302880dedc06b4ac97f381199a8d1450a3b4d1f1dddd38cc5054
    Source code(tar.gz)
    Source code(zip)
    proxygen-v2022.07.04.00.tar.gz(1.02 MB)
    proxygen-v2022.07.04.00.zip(1.40 MB)
  • v2022.06.27.00(Jun 27, 2022)

    Automated release from TagIt

    File Hashes
    • SHA256(proxygen-v2022.06.27.00.zip)= 3685a35c03f59c3f5f5044965368e6a9a3b7d4d6885db907a12bc078701357e7
    • SHA512(proxygen-v2022.06.27.00.zip)= e0461741a3c51edeae81fa8699dddb381d69945a35298e4b8a6f79558dd392ccb74f9fa8629c8bda1d18fdf610fe3f3b67ad3ad0a8d2ec04c8fd308154957587
    • SHA256(proxygen-v2022.06.27.00.tar.gz)= ba494bc80369830bd3742e617027160d6f335c2a482b0b0a1b87a86723c45b4a
    • SHA512(proxygen-v2022.06.27.00.tar.gz)= f3fd9ab99dac4d5ebfce92e94dbf42a5972e30c2ec6dbfd191512e67d938b52f742be848e905f527e08f7a756b3212da6b5534413af76fb54ac93147730adc85
    Source code(tar.gz)
    Source code(zip)
    proxygen-v2022.06.27.00.tar.gz(1.02 MB)
    proxygen-v2022.06.27.00.zip(1.40 MB)
  • v2022.06.20.00(Jun 20, 2022)

    Automated release from TagIt

    File Hashes
    • SHA256(proxygen-v2022.06.20.00.zip)= 578aa7961a9670b235662c85d72f400a220ef86573690fd27ef721f85ee4dd32
    • SHA512(proxygen-v2022.06.20.00.zip)= cd470f4d89ffaf0860cfdf0eb88be0acc0addaa11ab9ef384a8867f46527120b78a21cf630d7e8632aa52f032b31798b101006ec20c5619cfec99a210df5a6ff
    • SHA256(proxygen-v2022.06.20.00.tar.gz)= 8832a1a6566f55ad23b9762774adba5d802437452b28be2db5c0cc925495a977
    • SHA512(proxygen-v2022.06.20.00.tar.gz)= ea9ed289e0fbabc3085c70e900b6daab7d2b363b805b3157f2cdadb4920e54f1dab1ad81370d385539cb1b61612a3bc35927cd474860a0ccdf9055bbcbbfc34d
    Source code(tar.gz)
    Source code(zip)
    proxygen-v2022.06.20.00.tar.gz(1.02 MB)
    proxygen-v2022.06.20.00.zip(1.40 MB)
  • v2022.06.13.00(Jun 13, 2022)

    Automated release from TagIt

    File Hashes
    • SHA256(proxygen-v2022.06.13.00.zip)= 0987b0f4d6b26f5b6b270ede761d5ec5c2114fa4d48819d1010ee6f3b6079df3
    • SHA512(proxygen-v2022.06.13.00.zip)= 5838a0cf14d4263f3647aaef67c1f1414e3f2c46167a6a0b2a76459225e69f8f7742e20768c83e3a0b340dcfe87ca0ed63d766d5310631ef3d7a545e3cab2c59
    • SHA256(proxygen-v2022.06.13.00.tar.gz)= 39d5b1c7aef168360e67f843a7afd5902584666aa16aa079472ca5db2c22a119
    • SHA512(proxygen-v2022.06.13.00.tar.gz)= b09cfdd610dd19b89c754b6d3c9f0c7dfe2ce6f8acf0f3ce01810b7b1711a2b8eff0709b32ec76d6f5ba89f43c56d5751690bb67f2e7ff10a6340436288c3226
    Source code(tar.gz)
    Source code(zip)
    proxygen-v2022.06.13.00.tar.gz(1.02 MB)
    proxygen-v2022.06.13.00.zip(1.40 MB)
  • v2022.06.06.00(Jun 6, 2022)

    Automated release from TagIt

    File Hashes
    • SHA256(proxygen-v2022.06.06.00.zip)= d084bf481a3fb951671646030de1d1f560aa4173a29ef5d44fb2fcf04221eb67
    • SHA512(proxygen-v2022.06.06.00.zip)= 7972137a6ed922d5a55ededadc6359253dededaaafdb301d9aafefa258cddded216cd3fb3c93de6a4fe9f10bbb61c98360e6936ac52acc6fa59302b828986efe
    • SHA256(proxygen-v2022.06.06.00.tar.gz)= e6afff4e4316ef8cc6af1879233086fe99ee7208c39188e04de4e0bc08d5f9d8
    • SHA512(proxygen-v2022.06.06.00.tar.gz)= 1fbd6dc430a4b97f6be67879180359075f06f7880a52311750e6e83294082ad7502012a6a338c8b6e029cab7110e83c18ae5bc20e244f7c30fee73e70985466a
    Source code(tar.gz)
    Source code(zip)
    proxygen-v2022.06.06.00.tar.gz(1.01 MB)
    proxygen-v2022.06.06.00.zip(1.39 MB)
  • v2022.05.30.00(May 30, 2022)

    Automated release from TagIt

    File Hashes
    • SHA256(proxygen-v2022.05.30.00.zip)= 06719a4640a9677089261e95bc7a9403a2b3bbee41529e8d6c2df74b89e12a23
    • SHA512(proxygen-v2022.05.30.00.zip)= fe7539822e2b855b1860f71bdba95409acfdf516bd7b0d89f87142508bd2ad466666d4e2b1252e58d76a9870bc04fe92a53487e5ad1762cf3b913987c50cf033
    • SHA256(proxygen-v2022.05.30.00.tar.gz)= 7d119c775ad5ece2dd0f8ecc7980d0836f2c42776dcbfdca2822990598005be8
    • SHA512(proxygen-v2022.05.30.00.tar.gz)= 910c380f9ef58faad9b51b16db262529a1dac518124ad9e1743f51bfc892aeaf5b9305e7bd0f7215853d1f8e1b94ce6ce12ab38754238a63e2b4b3c2d7e323b1
    Source code(tar.gz)
    Source code(zip)
    proxygen-v2022.05.30.00.tar.gz(1.01 MB)
    proxygen-v2022.05.30.00.zip(1.39 MB)
  • v2022.05.23.00(May 23, 2022)

    Automated release from TagIt

    File Hashes
    • SHA256(proxygen-v2022.05.23.00.zip)= 1d138503a5c66536d14029d8c5055071c6a206d04a63d32a419c806df582df73
    • SHA512(proxygen-v2022.05.23.00.zip)= 304aa804747dfbe82dca69bddb50c08ca37be8b663ec43d506b652c428e4404393801022c7fae951343a906530b51d24a6f364b9c07a832591c0423ea534b7fc
    • SHA256(proxygen-v2022.05.23.00.tar.gz)= bf00ae383eb8fac37422dfbee2d61300a8cb7bb399a1f0d439f9fa778a8fe29d
    • SHA512(proxygen-v2022.05.23.00.tar.gz)= c738f48bea2e662fcb550c94fa42d8df6be2e45d0b066436b10c235dee6b644fea0d36470ffc33011a6976eab4e62cbcdb9a6b5b0cc9a9e41d4b1c1c47abcafe
    Source code(tar.gz)
    Source code(zip)
    proxygen-v2022.05.23.00.tar.gz(1.01 MB)
    proxygen-v2022.05.23.00.zip(1.39 MB)
  • v2022.05.16.00(May 16, 2022)

    Automated release from TagIt

    File Hashes
    • SHA256(proxygen-v2022.05.16.00.zip)= 9733a7c664ede06b6b5e8e53dcbf5fcc2943bcaf5c5b4efc3a0b6d8e553bdba3
    • SHA512(proxygen-v2022.05.16.00.zip)= cb658d380589f2e8430f7113939a4147f525ed3c228a1ff3a3412e211dde375df754193c500415041749db96dee0c8bbb95e8d6080582cd35c9ace32ac77c270
    • SHA256(proxygen-v2022.05.16.00.tar.gz)= 222d141c24cb0de0b488b3d094ec7334de9dbe30e89f2a1dffe069167e0af895
    • SHA512(proxygen-v2022.05.16.00.tar.gz)= 309892d0870e6d6a7a5fb2859344ba363bf3879ccaea511f7e4303e203c1fff627748c26d93462a1cec8ea987f725a56809e0b2c9b3db931047222bfffda95c1
    Source code(tar.gz)
    Source code(zip)
    proxygen-v2022.05.16.00.tar.gz(1.03 MB)
    proxygen-v2022.05.16.00.zip(1.41 MB)
  • v2022.05.09.00(May 9, 2022)

    Automated release from TagIt

    File Hashes
    • SHA256(proxygen-v2022.05.09.00.zip)= 06cbc4f0d209e1d27d403739d2af9b6b7969c93cb74c2f8183b07973fde6db9d
    • SHA512(proxygen-v2022.05.09.00.zip)= c196826c449bb1c9378807bf81ac76b08afa670d040573dd5ca3695b840dbeb0f6825bd9ad902ec56d15b15632e9ef953287e31ce41aa5aa7833b326fc322ff4
    • SHA256(proxygen-v2022.05.09.00.tar.gz)= 311c0179f99074fdef94e5066e4c8b96e89bbbb330294f89c56dd1dcbe9326ea
    • SHA512(proxygen-v2022.05.09.00.tar.gz)= 86fce0eb7835365b47beffd938a727d258949d79d2ca9bdedec54e4a01bcd4eb62fb8b9327c8aa589d5ac2de6aff5f5d9f47af78b7a0e315346525d4c11a6191
    Source code(tar.gz)
    Source code(zip)
    proxygen-v2022.05.09.00.tar.gz(1.03 MB)
    proxygen-v2022.05.09.00.zip(1.41 MB)
  • v2022.05.02.00(May 2, 2022)

    Automated release from TagIt

    File Hashes
    • SHA256(proxygen-v2022.05.02.00.zip)= bb147c9eb4382894323d6610f47a1eb694aef164f9c83b82f5e6d9c3197f7cee
    • SHA512(proxygen-v2022.05.02.00.zip)= f116e407b6823bbdd7b96584fed46642dbf4a0dcce4193afccbb69ca469f4186bce2e2c1d3ac5205d6f5c9a89548a4f971f1ccb04aadaf4cc2f13f82f409ddcf
    • SHA256(proxygen-v2022.05.02.00.tar.gz)= 68e8230565f4d04abd6e6d4176f6114754639b4a52649fc891d8303d086b29f3
    • SHA512(proxygen-v2022.05.02.00.tar.gz)= 54585a38861d1644cd8e440de498ae244772adcd80e753a5ea894b7ee3c303f6bc054902dca239dafcffd469f4081cb1f4455e0073f690149e4adde623b5b8da
    Source code(tar.gz)
    Source code(zip)
    proxygen-v2022.05.02.00.tar.gz(1.03 MB)
    proxygen-v2022.05.02.00.zip(1.41 MB)
  • v2022.04.25.00(Apr 25, 2022)

    Automated release from TagIt

    File Hashes
    • SHA256(proxygen-v2022.04.25.00.zip)= c9df94544b921f09ff8afcaef85b93af8cd96fc4e63adaa0146970feb231269c
    • SHA512(proxygen-v2022.04.25.00.zip)= 2a78528d63111c1cadee41d2ce928bf1b58e1c31562f02eb2bf268d1d62e068eedd86e04e0689154df52ca2523d60caeb1cbb4d762e0cebb9a56e369112dac51
    • SHA256(proxygen-v2022.04.25.00.tar.gz)= 4d3b89c09e3bc168622699b0b59708cc8480a41d22e7e9fc5b2da19ad2a51f6a
    • SHA512(proxygen-v2022.04.25.00.tar.gz)= 9318aefac9529ced4ddfa617263ee9a5214febe54e60b39bc32d08e1322d0c449fc07f7548e776c55a3d32e404924f55b15d8cdf7131e8d8e40346f2f71f9c16
    Source code(tar.gz)
    Source code(zip)
    proxygen-v2022.04.25.00.tar.gz(1.03 MB)
    proxygen-v2022.04.25.00.zip(1.42 MB)
  • v2022.04.18.00(Apr 18, 2022)

    Automated release from TagIt

    File Hashes
    • SHA256(proxygen-v2022.04.18.00.zip)= 796eed89fb4694bfd03aa5411eb0fdef7ff26a11c2126df5e78efb0ac864c5df
    • SHA512(proxygen-v2022.04.18.00.zip)= cfec842772ca4dcb7e523e1b4b7f0522afc7fb9f8957d206e06986ed1f3a27fb3740e9566933fad06c334eb4c6abbc801b565d73448bcb4cfc48c246689a02e7
    • SHA256(proxygen-v2022.04.18.00.tar.gz)= a45f05ee158fce489c8f9922a832b4d0f1e08642f9f0e96b4bfbc53f54fa78e0
    • SHA512(proxygen-v2022.04.18.00.tar.gz)= 55928532285b5b4b11db13d204b4760269870c607adda59ca180b891c52c8f365c4c254df6d81f0b452c8951245654204904ebe52df173a6a6bc2bba197283cf
    Source code(tar.gz)
    Source code(zip)
    proxygen-v2022.04.18.00.tar.gz(1.03 MB)
    proxygen-v2022.04.18.00.zip(1.42 MB)
  • v2022.04.11.00(Apr 11, 2022)

    Automated release from TagIt

    File Hashes
    • SHA256(proxygen-v2022.04.11.00.zip)= 4a2e5360ce734e7ab0dc9ae63e3bd0f98ad69030e3365f0859b824acf3ffef13
    • SHA512(proxygen-v2022.04.11.00.zip)= 2cf4e8e5f809c87870da1810237ca0c2a834db8546b8a8ec4dae2eeb03492ac5ad9ec8befe3433db87ce66a17209d32137fd0f19c66fcef4ede418d394a06daf
    • SHA256(proxygen-v2022.04.11.00.tar.gz)= 7d6143f2db9a5e984cbf0b3999dc7244b8f6dc2c5482a7101a75ac4c4d24e582
    • SHA512(proxygen-v2022.04.11.00.tar.gz)= bacddbb84659e0ba1e26c2a7351a20dda7d55362a44219cf1a87666f18a81ce8c30be754e8b1491847ae0654cfc9e69f6eb70827e129d4f24474488a24052f70
    Source code(tar.gz)
    Source code(zip)
    proxygen-v2022.04.11.00.tar.gz(1.03 MB)
    proxygen-v2022.04.11.00.zip(1.41 MB)
  • v2022.04.04.00(Apr 4, 2022)

    Automated release from TagIt

    File Hashes
    • SHA256(proxygen-v2022.04.04.00.zip)= 8600a89b698074323dcd60e550ee7d7636e20dd5fef34053036ec3a2b0ef74e4
    • SHA512(proxygen-v2022.04.04.00.zip)= 653e170e9bc2fd18bbcae0988925e14064965a9b6bd88eea35ae89c5c7e7fe162f2611a3fcdffe85394d313a430db937b51c8e7155e95cd728b8d7eef037635c
    • SHA256(proxygen-v2022.04.04.00.tar.gz)= 648f1bde10524b3628da8a738c2b9a685929c55c4b47de8e8e86849185eb73b6
    • SHA512(proxygen-v2022.04.04.00.tar.gz)= f653392cb0d7e2cde7cb262c6277eab4233c1a7a45edc49dc8a2870f72502df5f67e23491d1098c15df593691d735ba2b44a6573b833022245e4c5846836616a
    Source code(tar.gz)
    Source code(zip)
    proxygen-v2022.04.04.00.tar.gz(1.03 MB)
    proxygen-v2022.04.04.00.zip(1.41 MB)
  • v2022.03.28.00(Mar 28, 2022)

    Automated release from TagIt

    File Hashes
    • SHA256(proxygen-v2022.03.28.00.zip)= c2dac7e0021162ce3d5f9d0047bf988e1fef55cbce189d6c061176be26f736cf
    • SHA512(proxygen-v2022.03.28.00.zip)= 7cda7d8c5ffcab6bb8ab954b79df8815f76906e9ae4eea4b9130c06d8202370df8276327b5191fc4246febc6df69551bbd687980bd01d51e18154c95380d3375
    • SHA256(proxygen-v2022.03.28.00.tar.gz)= d387d2e5821610eca5522359b4416e173ac8a71ecdb20739d4b564d939a4275e
    • SHA512(proxygen-v2022.03.28.00.tar.gz)= b359add1f08944f9c8099648887b0ee0a5ee4fedc3d49440656ed583e4ee0898b1dd8ed15444d048a876c03b8186254e5c2fc59bfaa08ff3a18802efd4f34781
    Source code(tar.gz)
    Source code(zip)
    proxygen-v2022.03.28.00.tar.gz(1.03 MB)
    proxygen-v2022.03.28.00.zip(1.41 MB)
  • v2022.03.21.00(Mar 21, 2022)

    Automated release from TagIt

    File Hashes
    • SHA256(proxygen-v2022.03.21.00.zip)= d72a8eaf6ff7992bcf0b8429e38b18dc8f5b5bfb0de59f55b520826fea4621c9
    • SHA512(proxygen-v2022.03.21.00.zip)= 8cfb1a7a7100c91fe1c6eb5168eebff3d2c709863b03d37d92e12f8fc7668b82376170a8525cc5b16aa85cd4cd2b3572e54a834a68f4559b8c6650105043e7c9
    • SHA256(proxygen-v2022.03.21.00.tar.gz)= 5839cad76d5f3eb062513aa477521c24286f1b6a82f3db55bdb7b3a7f6c71596
    • SHA512(proxygen-v2022.03.21.00.tar.gz)= 231c209a91c1a71f157a330bb951b1a8f4c3c0c53f049bb53fd13f4691b3501699934469d6cf9c62c6c07f00881d5e52af73d99effa5c67aeb6b0c09dfb81b3f
    Source code(tar.gz)
    Source code(zip)
    proxygen-v2022.03.21.00.tar.gz(1.03 MB)
    proxygen-v2022.03.21.00.zip(1.41 MB)
  • v2022.03.14.00(Mar 14, 2022)

    Automated release from TagIt

    File Hashes
    • SHA256(proxygen-v2022.03.14.00.zip)= 8b2ba99118d40784edbc38017d2d5f74038c0d19b7f21798670778a3f6720c42
    • SHA512(proxygen-v2022.03.14.00.zip)= 8c5c59f308aa5ed729d67fd1f003111412f7a0787a61dd7b7ffa90c7898dbcb198d9aac88e93248697c678ca003504c0da9e3f1df57d1216396195e13c862fc1
    • SHA256(proxygen-v2022.03.14.00.tar.gz)= 775a7cb74b80b6a088f8fb700938f6faac18a1e853246e085c1669e7618b8adb
    • SHA512(proxygen-v2022.03.14.00.tar.gz)= fd2045c0ab343034db62d145af3cbb0ade17d6d3a853678994b88fbc5a4f234d2bb0447603476aa8e59b93dd90a37a1e582595bf28c8161afcd510845d4103d1
    Source code(tar.gz)
    Source code(zip)
    proxygen-v2022.03.14.00.tar.gz(1.03 MB)
    proxygen-v2022.03.14.00.zip(1.41 MB)
  • v2022.03.07.00(Mar 7, 2022)

    Automated release from TagIt

    File Hashes
    • SHA256(proxygen-v2022.03.07.00.zip)= 82dc468f46582f6c6cb58bb7b93caf6d5ec4d2933c8eb54fa5e1b17cdd5150ad
    • SHA512(proxygen-v2022.03.07.00.zip)= 16e32e61ebbc5b07a069a62a3ff176c2f1b8f3cea4468babb0bc523a1e30a78e8ab62319bf2189dc79a73cd108b2a6cf68d0dd3b23c1c5690fc9ea4f8730d604
    • SHA256(proxygen-v2022.03.07.00.tar.gz)= 72c886771c8ee46cb7fc80319cfcdf2174c3300dabacc3389d6689b4b890f4d6
    • SHA512(proxygen-v2022.03.07.00.tar.gz)= bcf402676db2a6c3c786a0ea166113a2ac57ff9537d246d9abcd7ae6a528945923ffcf082ad9db85f52cfa8f95c9633de24d307be3109cebfd2dc0891d064b00
    Source code(tar.gz)
    Source code(zip)
    proxygen-v2022.03.07.00.tar.gz(1.03 MB)
    proxygen-v2022.03.07.00.zip(1.41 MB)
  • v2022.02.28.00(Feb 28, 2022)

    Automated release from TagIt

    File Hashes
    • SHA256(proxygen-v2022.02.28.00.zip)= 81cd4d0433be1b57ba92fc45b53fb3f56cd4d78e677fa32ec0a7121ae6f3eefe
    • SHA512(proxygen-v2022.02.28.00.zip)= 1057dacd63574bb39e7da7b9ccffc12ac03a462583af36b0fae2fb42d1d7bfe6cf696e194a64303a9b47533befe459aa05d9756dd28d0ae0e299b7948f9d6ff8
    • SHA256(proxygen-v2022.02.28.00.tar.gz)= 7e79f6ba6c2c03c6dedd8b16f3856173235febeef432a2b207b2ed0a22103f2d
    • SHA512(proxygen-v2022.02.28.00.tar.gz)= 3376d441e0f65328fdeaea7ba108f9b896aaeb3f3bb8a9b40e9733fa8ccad00a6b570a9b18e3dbf2568fb3026f95d52a8c0b7cc8729b003f353f7bade41e7cd7
    Source code(tar.gz)
    Source code(zip)
    proxygen-v2022.02.28.00.tar.gz(1.03 MB)
    proxygen-v2022.02.28.00.zip(1.41 MB)
  • v2022.02.21.00(Feb 21, 2022)

    Automated release from TagIt

    File Hashes
    • SHA256(proxygen-v2022.02.21.00.zip)= fdd8b53f951c5e8653662e1f6f7f20002f140b4c18159775930c3ec16c7247a5
    • SHA512(proxygen-v2022.02.21.00.zip)= b4ba1ef294cf36624cf8e064212f53ec32fa4934f3a7cec0748771b6cd4697438a1cedf6ef15ceb074dd57a0a3b6a808670ebcff5e185216bdbe286d492ddd87
    • SHA256(proxygen-v2022.02.21.00.tar.gz)= f7d7124a4be1cedf6833e4c59561526f776ae6f9e56517501161d9631a2a0e33
    • SHA512(proxygen-v2022.02.21.00.tar.gz)= 00c80ac6c32d64ab77edaf00763f800046ab97e22b12c6d0c98e163ff08fe01b2ab303008c7bba7d1a35e8366311fc3366995ae2e3efab412200d8012e5173be
    Source code(tar.gz)
    Source code(zip)
    proxygen-v2022.02.21.00.tar.gz(1.03 MB)
    proxygen-v2022.02.21.00.zip(1.41 MB)
  • v2022.02.14.00(Feb 14, 2022)

    Automated release from TagIt

    File Hashes
    • SHA256(proxygen-v2022.02.14.00.zip)= 3a2dc9835019cc88ccbeadca60e5b718de556fb779d8f9e5c15baa9aa0320cf0
    • SHA512(proxygen-v2022.02.14.00.zip)= bd86854661e421dc9563aa0a7eefb3db95b9ee21fd040b7b1a940e20551f34ccbaff1efad3143bf1e00d1469a493e91ae2a82b129577c19134b6fd0dde8e5b53
    • SHA256(proxygen-v2022.02.14.00.tar.gz)= b1b7d897674697febf527689d08a6e1908b91b32de371e704cb0d57cc5d61fbd
    • SHA512(proxygen-v2022.02.14.00.tar.gz)= 33ac38abebf55f7f6058ee81834038027c29443fcbd7c2787f94a7cd0d9693a2e8e3c407c25b79bb574c25611fee71412c1d2af1746d808ec9b0857b579838a0
    Source code(tar.gz)
    Source code(zip)
    proxygen-v2022.02.14.00.tar.gz(1.03 MB)
    proxygen-v2022.02.14.00.zip(1.41 MB)
  • v2022.02.07.00(Feb 7, 2022)

    Automated release from TagIt

    File Hashes
    • SHA256(proxygen-v2022.02.07.00.zip)= 180b14b2c540f08f3b231c266cb237bc4644e4c5000c0cadb38047a6771531cc
    • SHA512(proxygen-v2022.02.07.00.zip)= e0a2aead7b2d44d3ba6847dfcaa310f92e461ed26dfd62722092f9a08ae1cb898391518550c8a2ca702fd239f08f3212ab53f5bfc4eea5c27b30a76c95183832
    • SHA256(proxygen-v2022.02.07.00.tar.gz)= 4b80aa8b043e70a43d021e68070006c0b20c38eba643d7e174a1d68387613274
    • SHA512(proxygen-v2022.02.07.00.tar.gz)= 58f040f1d09ee961cbe65b0123c49c05fdfafc8e5a180dfe62c91defad91e40b011747752025dd87e5c3ba98197bf82fdda2abfac3f64f7fefe47dec3670580f
    Source code(tar.gz)
    Source code(zip)
    proxygen-v2022.02.07.00.tar.gz(1.03 MB)
    proxygen-v2022.02.07.00.zip(1.41 MB)
  • v2022.01.31.00(Jan 31, 2022)

    Automated release from TagIt

    File Hashes
    • SHA256(proxygen-v2022.01.31.00.zip)= f87bf54c91f5a3f08f425f58237880ade0eb59e9ead1127462f788ec5d31ff96
    • SHA512(proxygen-v2022.01.31.00.zip)= 7758a1d789220428f46adf367db0fbb94813a7a29da3072d1f842e1fe8f310f3ab59170c5128a898486d349f07a2dbdd1453ee9b49f53eb94eb8a39a1bd2cd34
    • SHA256(proxygen-v2022.01.31.00.tar.gz)= 5360a8ccdfb2f5a6c7b3eed331ec7ab0e2c792d579c6fff499c85c516c11fe14
    • SHA512(proxygen-v2022.01.31.00.tar.gz)= de28da16c75b5283e8cc1adc1961d7e4782e124fa7c75abb1674018e43cb53bfa5a634a38a8259776d892206bd085ccf5c44e735a92bfb6c7dd3c15df85b7b41
    Source code(tar.gz)
    Source code(zip)
    proxygen-v2022.01.31.00.tar.gz(1.02 MB)
    proxygen-v2022.01.31.00.zip(1.40 MB)
  • v2022.01.24.00(Jan 24, 2022)

    Automated release from TagIt

    File Hashes
    • SHA256(proxygen-v2022.01.24.00.zip)= da7152e34bef8118fd22cd7c89308fcb86ee252c587ed14b4621e3a66df33346
    • SHA512(proxygen-v2022.01.24.00.zip)= 071a96565bba09a2c566be835bc3bbda8a86a2fd99bc413994b19c97521dd1060220dd772e721fb6f8c6c7abb24eacf7020eb3e4ee0992058b495b07324b288a
    • SHA256(proxygen-v2022.01.24.00.tar.gz)= 566138f25731f6bddf0d36d1e8a2d2c796c640008d332c5bcb6339423cf29906
    • SHA512(proxygen-v2022.01.24.00.tar.gz)= 62da3cca4655e5daa154b880781ea49d4483a5902d570566cfe6e6f462fad16c2d206e14dd0a105679da705c18629d4682d749a52983063fcb7cea4f9a658642
    Source code(tar.gz)
    Source code(zip)
    proxygen-v2022.01.24.00.tar.gz(1.02 MB)
    proxygen-v2022.01.24.00.zip(1.40 MB)
  • v2022.01.17.00(Jan 17, 2022)

    Automated release from TagIt

    File Hashes
    • SHA256(proxygen-v2022.01.17.00.zip)= 7c9dbbad77ef4017885dd2ac6682128e11bef30bfc771042e537028d3c5b2808
    • SHA512(proxygen-v2022.01.17.00.zip)= 7d36cb20e0953c7cebcd1cdc3b01413a4c4c80172bacdfb6b799d79cfcda752a4247b12f8c43c3fe12b831245274b4281efa6703307b831734da5c318de76b42
    • SHA256(proxygen-v2022.01.17.00.tar.gz)= 7fd9718c12e42b9c70474c3df513b09bff3ce76bfa658a7d270d1a4d2b48eb3b
    • SHA512(proxygen-v2022.01.17.00.tar.gz)= 824d22f689f63aa5f6bd5e5decb1d07ac268d34c39c346113a9b3d32405df7343651369104febd6d7cdcd0150a97f35686866c6d778d56a372ccae19a421bad9
    Source code(tar.gz)
    Source code(zip)
    proxygen-v2022.01.17.00.tar.gz(1.02 MB)
    proxygen-v2022.01.17.00.zip(1.40 MB)
Owner
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
Facebook
H2O - the optimized HTTP/1, HTTP/2, HTTP/3 server

H2O - an optimized HTTP server with support for HTTP/1.x, HTTP/2 and HTTP/3 (experimental) Copyright (c) 2014-2019 DeNA Co., Ltd., Kazuho Oku, Tatsuhi

H2O 10.1k Aug 4, 2022
Tiny HTTP Server on C, using only standard libraries

hell_o Linux only. Tiny HTTP Server on C, using only standard libraries. It is unfinished yet, going to add working interface and rewrite handler late

null 3 Feb 1, 2022
A project designed for the esp8266 D1 Mini or the esp8266 D1 Mini PRO to provide a wifi http server and dns server.

PS4 Server 9.00 This is a project designed for the esp8266 D1 Mini or the esp8266 D1 Mini PRO to provide a wifi http server and dns server. this is fo

null 13 Jun 7, 2022
Gromox - Groupware server backend with MAPI/HTTP, RPC/HTTP, IMAP, POP3 and PHP-MAPI support for grommunio

Gromox is the central groupware server component of grommunio. It is capable of serving as a replacement for Microsoft Exchange and compatibles. Conne

grommunio 120 Jul 2, 2022
Easy-to-use HTTP C library

LibHTTP LibHTTP is a C library easy-to-use which implements the base of the HTTP protocol. Info's about LibHTTP LibHTTP is an easy-to-use HTTP library

null 6 Dec 10, 2021
modern c++(c++17), cross-platform, header-only, easy to use http framework

cinatra--一个高效易用的c++ http框架 English | 中文 目录 使用cinatra常见问题汇总(FAQ) cinatra简介 如何使用 快速示例 性能测试 注意事项 roadmap 联系方式 cinatra简介 cinatra是一个高性能易用的http框架,它是用modern

qicosmos 1.4k Aug 13, 2022
Cross-platform, efficient, customizable, and robust asynchronous HTTP/WebSocket server C++14 library with the right balance between performance and ease of use

What Is RESTinio? RESTinio is a header-only C++14 library that gives you an embedded HTTP/Websocket server. It is based on standalone version of ASIO

Stiffstream 871 Aug 9, 2022
LibVNCServer/LibVNCClient are cross-platform C libraries that allow you to easily implement VNC server or client functionality in your program.

LibVNCServer: A library for easy implementation of a VNC server. Copyright (C) 2001-2003 Johannes E. Schindelin If you already used LibVNCServer, you

null 851 Aug 8, 2022
Ole Christian Eidheim 737 Aug 6, 2022
C library for easy WebSockets server.

libwebsock C library for easy WebSockets servers. This library allows a developer to quickly develop WebSocket servers by focusing on the actual logic

Payden Sutherland 205 Apr 23, 2022
an easy implementation of a multi-process tcp server and a multi-thread tcp client

一个TCP多进程服务器-多线程客户端的简单实现。 客户端类似Apache ab的测试功能,能够通过向某一个ip端口发送指定并发量和总数量的tcp短连接;服务端处理tcp短连接,每来一条消息就打印一条log。 使用cmake编译,建议在vscode里编译,或者命令行 # 终端进入目录 mkdir bu

adin 1 Nov 28, 2021
BingBing 54 Jul 27, 2022
The BNG Blaster is a test tool to simulate thousands of PPPoE or IPoE subscribers including IPTV, traffic verification and convergence testing capabilities.

RtBrick BNG Blaster The BNG Blaster is a test tool to simulate thousands of PPPoE or IPoE subscribers including IPTV, traffic verification and converg

RtBrick 90 Aug 8, 2022
C++ networking library including UniConf and a convenient D-Bus API

This is wvstreams, a nominally platform-independent networking and utilities library for C++. Some documentation is in the Docs/ directory. If that

null 27 Dec 29, 2021
LAppS - Lua Application Server for micro-services with default communication over WebSockets. The fastest and most vertically scalable WebSockets server implementation ever. Low latency C++ <-> Lua stack roundtrip.

LAppS - Lua Application Server This is an attempt to provide very easy to use Lua Application Server working over WebSockets protocol (RFC 6455). LApp

null 47 Apr 25, 2022
Windows named pipe server that forwards connections to given TCP server

PipeTcp An asynchronous Windows named pipe server that forwards connections to given TCP server. Pre-built binaries can be found in Releases. Invocati

Jinoh Kang 4 May 23, 2022
A C++ header-only HTTP/HTTPS server and client library

cpp-httplib A C++11 single-file header-only cross platform HTTP/HTTPS library. It's extremely easy to setup. Just include the httplib.h file in your c

null 7.6k Aug 15, 2022
Ultra fast and low latency asynchronous socket server & client C++ library with support TCP, SSL, UDP, HTTP, HTTPS, WebSocket protocols and 10K connections problem solution

CppServer Ultra fast and low latency asynchronous socket server & client C++ library with support TCP, SSL, UDP, HTTP, HTTPS, WebSocket protocols and

Ivan Shynkarenka 867 Aug 8, 2022
C++ library for creating an embedded Rest HTTP server (and more)

The libhttpserver reference manual Tl;dr libhttpserver is a C++ library for building high performance RESTful web servers. libhttpserver is built upon

Sebastiano Merlino 667 Aug 3, 2022