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.

Comments
  • 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
  • StreamError details

    StreamError details

    I am using proxygen and keep on getting StreamError. I have gone through ProxyGen code and I believe this error arises because there is an HTTP error (abort unacknowledged message) when sending/ or receiving. Is there a way to obtain more insight/granularity on whether the error is from a HTTP request or response?

    opened by hadisajj2 6
  • Add CMake option ALLOW_NONEMPTY_204_RESPONSE

    Add CMake option ALLOW_NONEMPTY_204_RESPONSE

    RFC2616 is very strict when it comes to "204 No Content" responses, requiring them to actually be empty. However, not everyone follows this (that is, they return content in 204 responses), causing otherwise valid HTTP responses to be rejected.

    This PR adds a CMake option ALLOW_NONEMPTY_204_RESPONSE (which sets a preprocessor macro with the same name) that disables rejecting 204 responses with content, so that you can instead ignore the body of the response in those cases.

    CLA Signed 
    opened by DailyMats 4
  • Add LibUnwind as a dependency of glog::glog (#82)

    Add LibUnwind as a dependency of glog::glog (#82)

    Summary: X-link: https://github.com/facebookincubator/fizz/pull/82

    X-link: https://github.com/facebookincubator/velox/pull/2487

    X-link: https://github.com/facebookincubator/hsthrift/pull/101

    X-link: https://github.com/facebookincubator/katran/pull/172

    X-link: https://github.com/facebookincubator/mvfst/pull/273

    X-link: https://github.com/fairinternal/AIRStore/pull/38

    LibUnwind is a dependency of glog according to objdump. This diff adds ${LIBUNWIND_LIBRARY} to the CMake imported library glog::glog as an element in the IMPORTED_LINK_INTERFACE_LIBRARIES property.

    Without this diff, there will be a linker error like this:

    /usr/bin/ld: /usr/lib/x86_64-linux-gnu/libglog.so: undefined reference to symbol '_Ux86_64_getcontext'
    //usr/lib/x86_64-linux-gnu/libunwind.so.8: error adding symbols: DSO missing from command line
    collect2: error: ld returned 1 exit status
    

    Differential Revision: D39340650

    CLA Signed fb-exported 
    opened by Atry 2
  • set IMPORTED_LINK_INTERFACE_LIBRARIES to ${LIBGFLAGS_LIBRARY} for glog::glog (#31)

    set IMPORTED_LINK_INTERFACE_LIBRARIES to ${LIBGFLAGS_LIBRARY} for glog::glog (#31)

    Summary: X-link: https://github.com/facebook/fb303/pull/31

    Previously Folly provided a polyfill of the GflagsFlagSaver symbol, which was removed since https://github.com/facebook/folly/commit/4dadde1256f74e756510a499c86459967f78afb9. Therefore, the glog should solve the GflagsFlagSaver symbol from gflags.

    This diff added gflags libraries as a dependency of the CMake project glog::glog into fbcode_builder's FindGlog.cmake, so that the fbcode_builder users will be able to automatically link with gflags.

    Differential Revision: D39220438

    CLA Signed fb-exported 
    opened by Atry 2
  • 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
Releases(v2022.12.26.00)
  • v2022.12.26.00(Dec 26, 2022)

    Automated release from TagIt

    File Hashes
    • SHA2-256(proxygen-v2022.12.26.00.zip)= 0b4d1172032515938cc2493f895b35c9795df64e2579ae81415ee74bcff1121f
    • SHA2-512(proxygen-v2022.12.26.00.zip)= 76b2ddbc9ea5e78b3506063cbf85f6e7277aac0dbdf1b1a5cb4cb33531a6c11ff3a4ba9824853c83e245429026a01fca60e7f1d5699570f68ca44e385256ae28
    • SHA2-256(proxygen-v2022.12.26.00.tar.gz)= 0a069370c4acefa13e647ec6c6a05d8146dd14a76294531e7f53e73fa6b485c3
    • SHA2-512(proxygen-v2022.12.26.00.tar.gz)= e365afc0a41c73a4e0a5f8adf0b97a196e11b266cb3e2b060cc73dae38ea8ba87228148484984a64b2a529eba5891d0ba78c2c007aa81790a9a69e4a3ab55a58
    Source code(tar.gz)
    Source code(zip)
    proxygen-v2022.12.26.00.tar.gz(1.04 MB)
    proxygen-v2022.12.26.00.zip(1.41 MB)
  • v2022.12.19.00(Dec 19, 2022)

    Automated release from TagIt

    File Hashes
    • SHA2-256(proxygen-v2022.12.19.00.zip)= c4ce4193b63313b5da3609c44fa8ef706aa394ed6aeaf636ccb9561724bc97c6
    • SHA2-512(proxygen-v2022.12.19.00.zip)= d97b29d7d1fed41eee7421e6e1b3a39f14ea45e1b648e14955dbfd18c9693c79c68bcbd768ce594c9ca908d94c85cfbdc8d55e5905d889942b5f981bb040c888
    • SHA2-256(proxygen-v2022.12.19.00.tar.gz)= 4997437e3ef107dba718d840d536176d9263f0cc1420b26ce13517d08ad8e869
    • SHA2-512(proxygen-v2022.12.19.00.tar.gz)= 4f4aaa4587a38632904f31e97ff30e4e3430b6d2244819519b104de8df2834e07dd62fba3523d733b108ead6799f751cba3de6de984abc084f63190d345a3041
    Source code(tar.gz)
    Source code(zip)
    proxygen-v2022.12.19.00.tar.gz(1.04 MB)
    proxygen-v2022.12.19.00.zip(1.41 MB)
  • v2022.12.12.00(Dec 12, 2022)

    Automated release from TagIt

    File Hashes
    • SHA2-256(proxygen-v2022.12.12.00.zip)= 2497a2ab94297def2621dc922d59510d5e7f7792f2cb0c39ef06193a3a534ed4
    • SHA2-512(proxygen-v2022.12.12.00.zip)= b1c2fd53c68b8a4dc262f16146d05e9833575ff2606454d7d649efb810551a8530eacfe479ed8f53ba54e09690b4c280ac0b837cf10f241ded8abb146e9511e7
    • SHA2-256(proxygen-v2022.12.12.00.tar.gz)= 6df790ca755662ec87e189b4e6d1d0a5559e7224edf50b54ce77df7ce8fbb5ca
    • SHA2-512(proxygen-v2022.12.12.00.tar.gz)= a82e5c22edab7bcc3f8d0e08e30416d9309792c734cfa99f4168c77a5475cfcc8ff012db264c01a19f4298a6258263f722db627d26a7f8d2793cb49738360fc5
    Source code(tar.gz)
    Source code(zip)
    proxygen-v2022.12.12.00.tar.gz(1.04 MB)
    proxygen-v2022.12.12.00.zip(1.41 MB)
  • v2022.12.05.00(Dec 5, 2022)

    Automated release from TagIt

    File Hashes
    • SHA2-256(proxygen-v2022.12.05.00.zip)= 0ebd2f1d25a7e6d6a7be2e6e498bcc2b2cc58d4775a701f6aaa10842cb86c651
    • SHA2-512(proxygen-v2022.12.05.00.zip)= c9b6f9fa56ae4a731bcf67805dd3fa5b62477d42ef19d9b139f73b39718940cbf928760b7ac364e0c2cd28974a0efcc1a35937cef1ec9b5525eb4e63df47a718
    • SHA2-256(proxygen-v2022.12.05.00.tar.gz)= a1deb4a2d41cc4fc0b1d0a04163ebc7dfb92196979cc1cba789fc388f5766258
    • SHA2-512(proxygen-v2022.12.05.00.tar.gz)= cf85421ec43cb0ed5d7d28cd9a270a7696f89119ffb0a9102dbce65e254e5b9498b74dc651c048b300912a00cc73c9d8de70df82a703ffc89987247a8b610b7d
    Source code(tar.gz)
    Source code(zip)
    proxygen-v2022.12.05.00.tar.gz(1.04 MB)
    proxygen-v2022.12.05.00.zip(1.41 MB)
  • v2022.11.28.00(Nov 28, 2022)

    Automated release from TagIt

    File Hashes
    • SHA256(proxygen-v2022.11.28.00.zip)= 1b074ddd0b3e5cae431389ca460ab93b8d3a4b6413a57e049611b27f0814eb0b
    • SHA512(proxygen-v2022.11.28.00.zip)= a46cd658971e887122eb69c07ad1c7dad78904f0711a6162743de3746a5f487e67751a5d1f308812d27838b20571fa50c781cc1a1732b524cc407419e816b708
    • SHA256(proxygen-v2022.11.28.00.tar.gz)= 30bab984adf4d08fb2a8ffce39b5d92c0d1aaa89200fbf0f630139adae491df7
    • SHA512(proxygen-v2022.11.28.00.tar.gz)= 1ff4b6c0cf5f7a98ff3554a42922de9b600858b78e92758c22e370e9d84599c8c168f73c2be64b36b5dac38c23a61392fbe581fed37e0ce5fce24ed90d1deae3
    Source code(tar.gz)
    Source code(zip)
    proxygen-v2022.11.28.00.tar.gz(1.04 MB)
    proxygen-v2022.11.28.00.zip(1.42 MB)
  • v2022.11.14.00(Nov 14, 2022)

    Automated release from TagIt

    File Hashes
    • SHA256(proxygen-v2022.11.14.00.zip)= 313d8f2848b2c9b00104cf5c6087b0797c3a50ece1a51e2fa27b0cbc459c6559
    • SHA512(proxygen-v2022.11.14.00.zip)= 8030d4bd016632ccdf8320972067ebdf7ad23889d7140ad44fc4e014b66603a10a8b1c86a0119c5b75de9ccdf8888ddf8e02e2eb28b30c1901489de1509891be
    • SHA256(proxygen-v2022.11.14.00.tar.gz)= f8b51811ae4fdef2334a22aa1a0a9108b3001a41e94dd8e917ae818f5baea74b
    • SHA512(proxygen-v2022.11.14.00.tar.gz)= c27ade11f65973e55cce3276e2dc0df093b5edbb2fb6d118ecd9e29ad779325534dd3bb10efc77d4dd446e239083f9a5ff40d10025e20b5d2c6ff58cecc1dd0c
    Source code(tar.gz)
    Source code(zip)
    proxygen-v2022.11.14.00.tar.gz(1.03 MB)
    proxygen-v2022.11.14.00.zip(1.40 MB)
  • v2022.11.07.00(Nov 7, 2022)

    Automated release from TagIt

    File Hashes
    • SHA256(proxygen-v2022.11.07.00.zip)= 313d8f2848b2c9b00104cf5c6087b0797c3a50ece1a51e2fa27b0cbc459c6559
    • SHA512(proxygen-v2022.11.07.00.zip)= 8030d4bd016632ccdf8320972067ebdf7ad23889d7140ad44fc4e014b66603a10a8b1c86a0119c5b75de9ccdf8888ddf8e02e2eb28b30c1901489de1509891be
    • SHA256(proxygen-v2022.11.07.00.tar.gz)= f8b51811ae4fdef2334a22aa1a0a9108b3001a41e94dd8e917ae818f5baea74b
    • SHA512(proxygen-v2022.11.07.00.tar.gz)= c27ade11f65973e55cce3276e2dc0df093b5edbb2fb6d118ecd9e29ad779325534dd3bb10efc77d4dd446e239083f9a5ff40d10025e20b5d2c6ff58cecc1dd0c
    Source code(tar.gz)
    Source code(zip)
    proxygen-v2022.11.07.00.tar.gz(1.03 MB)
    proxygen-v2022.11.07.00.zip(1.40 MB)
  • v2022.10.31.00(Oct 31, 2022)

    Automated release from TagIt

    File Hashes
    • SHA256(proxygen-v2022.10.31.00.zip)= 45663df2f3a4ed88409b2304d34f2fec37e8cae70e78ae2f484c6954b287c97d
    • SHA512(proxygen-v2022.10.31.00.zip)= d281b5879808064b8e18c70dda374a022d24ecea60b4a3cf7aeace231246cb09f7ed70b633bfeec956bd25c6282afea9f1d470559216f9e0c6275d3b4b25f827
    • SHA256(proxygen-v2022.10.31.00.tar.gz)= f900841376830285f67e9af0057d035d6d18b89e8148be24bb7f8f16d974ecae
    • SHA512(proxygen-v2022.10.31.00.tar.gz)= ba1556bbef7fe028f597c1f483f9c9b8e19731278c7d582a95a0ae68d6a867f732da03e09fe32a66cb328f8acd1940eb8e9f00210f431cb0581c79109d57a288
    Source code(tar.gz)
    Source code(zip)
    proxygen-v2022.10.31.00.tar.gz(1.03 MB)
    proxygen-v2022.10.31.00.zip(1.40 MB)
  • v2022.10.24.00(Oct 24, 2022)

    Automated release from TagIt

    File Hashes
    • SHA256(proxygen-v2022.10.24.00.zip)= 622a3c1f301d25d6fd9ba67cdb5de7e29b922135a55b8478b722cf5bd2183d3c
    • SHA512(proxygen-v2022.10.24.00.zip)= 168b9aa1389c27d6dca9c7594dd328556783cd5bf1d88b60f4c3e98133462e363f95833f902178f92adfbd22708fa17184f956366b30e67bb7e1f9dbdf0f7b1d
    • SHA256(proxygen-v2022.10.24.00.tar.gz)= c286f04ff77cb6f541f81940f51efffc8bb06cf2e7aaba624a8151389d32d13a
    • SHA512(proxygen-v2022.10.24.00.tar.gz)= 7ce8d442a37cc9525cfb9a26d2a5441b4bc8966e54b5de2f9eb240eafde3ac762c75005104e59592ce24d7956c027f8fde3d465fcc70043bb0e620a34c8b4377
    Source code(tar.gz)
    Source code(zip)
    proxygen-v2022.10.24.00.tar.gz(1.03 MB)
    proxygen-v2022.10.24.00.zip(1.40 MB)
  • v2022.10.17.00(Oct 17, 2022)

    Automated release from TagIt

    File Hashes
    • SHA256(proxygen-v2022.10.17.00.zip)= b6be1f2d3bab837d60f388d562ac6a53e3d1b5221dd42433ce821230ebb54b72
    • SHA512(proxygen-v2022.10.17.00.zip)= 49af747674ba426e2c2b04383f2a4f3260cd2ad64b0b385541702e0703ac86fbd3b84a8ebd9f46876e52295457d0971275df194b83c731d86a0ed4a883b3e610
    • SHA256(proxygen-v2022.10.17.00.tar.gz)= 2f89e7d57d266504a191a74dad5f611c72467ab1bab077e0298368d7429901cb
    • SHA512(proxygen-v2022.10.17.00.tar.gz)= 40169763f379825248cd99290ffd0e2b10b5788bb33062458394eae1fb8bbb39c959074cc64c99a141cfb15a5d9066b08d58fab6ef193487253dc0ca0c2c00c8
    Source code(tar.gz)
    Source code(zip)
    proxygen-v2022.10.17.00.tar.gz(1.03 MB)
    proxygen-v2022.10.17.00.zip(1.40 MB)
  • v2022.10.10.00(Oct 10, 2022)

    Automated release from TagIt

    File Hashes
    • SHA256(proxygen-v2022.10.10.00.zip)= 6202491efc343e2c1a3c3d99b7b971fefcddf2f870245715a2e37a41496b5536
    • SHA512(proxygen-v2022.10.10.00.zip)= 3ea9474e32cff3f08814ed96b113bd7e631cd5a45a66b53a105e1177271a82e562f293bb100b0f1f67b63df9d2e4cd31ce03532827d9f199455bc3cd63264b79
    • SHA256(proxygen-v2022.10.10.00.tar.gz)= 17770d461266c8bb75519fb46c65652b6269d161e5d14758b9606fe9a3cdf1d5
    • SHA512(proxygen-v2022.10.10.00.tar.gz)= bb8c9d40e2a715511525cf9d0f6ec2ad5a49bfe6ab9ce69ef16b4895205e0d644ebfaef37bc8d244b0e4ec21ad667daaad5d0dd58860babf5f24d30fad792860
    Source code(tar.gz)
    Source code(zip)
    proxygen-v2022.10.10.00.tar.gz(1.03 MB)
    proxygen-v2022.10.10.00.zip(1.40 MB)
  • v2022.10.03.00(Oct 3, 2022)

    Automated release from TagIt

    File Hashes
    • SHA256(proxygen-v2022.10.03.00.zip)= 05eea59f7991aa04a0373004da422691d7dc3574517b8c3f0ae19b4cef00c7c2
    • SHA512(proxygen-v2022.10.03.00.zip)= f58e10994a02f9958e0e6e52e899f8b7a71654a0d29388fb4774d1ade5c9fd495a49bcc45ac820f1660da7baa02f088382da2a1e79e3d6ecc37d795d0570f53a
    • SHA256(proxygen-v2022.10.03.00.tar.gz)= 5c008136071baa3c8644ad23e4dc96043905b492efc8626cd9ff9a01e6b6b57f
    • SHA512(proxygen-v2022.10.03.00.tar.gz)= 3283032a24eabbdc51e9ee54a8fa8a88e7285fc6b01714ba20b4651da2ca382b6cbb58a1d19967b99d2e37e539aeb62f724ba7320992808d9547c4b24cc8e69d
    Source code(tar.gz)
    Source code(zip)
    proxygen-v2022.10.03.00.tar.gz(1.03 MB)
    proxygen-v2022.10.03.00.zip(1.40 MB)
  • v2022.09.26.00(Sep 26, 2022)

    Automated release from TagIt

    File Hashes
    • SHA256(proxygen-v2022.09.26.00.zip)= 3a20436fab82b5e300a6b972830c0929efa53cc6a8673345290ac4c63c2a3902
    • SHA512(proxygen-v2022.09.26.00.zip)= 0948ea156289aa700086c2cc77fd5cb6c7f9529e5c61a1a9c49c94fb14a7068bb33e83149bbec06b7845ee34038c5998c3138efa4d52c08391f82035c7484dd5
    • SHA256(proxygen-v2022.09.26.00.tar.gz)= 4ef46244ce965e1d298edb43948e302ed57bc115ba0f0a572327bc738f950b6f
    • SHA512(proxygen-v2022.09.26.00.tar.gz)= 43bfd8a35838f1ad1af07a60ec80ff635d43d0496074bdbd960236bfb42996d3540a44c497b6db7edcff4bf5c213ce64e15b9d1e6c4105e5ef299c41c746e6bb
    Source code(tar.gz)
    Source code(zip)
    proxygen-v2022.09.26.00.tar.gz(1.03 MB)
    proxygen-v2022.09.26.00.zip(1.40 MB)
  • v2022.09.19.00(Sep 19, 2022)

    Automated release from TagIt

    File Hashes
    • SHA256(proxygen-v2022.09.19.00.zip)= 155e03677c2ffbd8ca93a27d759208fc5aa8a197f6e7125e2d7a446a5cf0af26
    • SHA512(proxygen-v2022.09.19.00.zip)= fecdbbd4c9c582053ac0e155d27ac621c66caafbe1bd8da54f59a4bc624f264bd904a97f532367b573de0f1f7e387e09e1cfbea3f55a9594d526de6d4a37007e
    • SHA256(proxygen-v2022.09.19.00.tar.gz)= 05c2412aa238dd341c67bb15d9503e1cf526025a099a8c0030f02b777d9d9ae3
    • SHA512(proxygen-v2022.09.19.00.tar.gz)= c81d3bd246104c0a3b801d9216b3c2723be6ddc43f6e70aaf1e040d6c02e66256ede6637a4d85d7c105816d408b48b064556c0fec8da9f257de141e802eac59c
    Source code(tar.gz)
    Source code(zip)
    proxygen-v2022.09.19.00.tar.gz(1.03 MB)
    proxygen-v2022.09.19.00.zip(1.40 MB)
  • v2022.09.12.00(Sep 12, 2022)

    Automated release from TagIt

    File Hashes
    • SHA256(proxygen-v2022.09.12.00.zip)= b1d28d5c8edf481a65dc0317a41613f1a7eef317a8494acd7406c8062f49a13f
    • SHA512(proxygen-v2022.09.12.00.zip)= 426e3b4756f7006369a4fef7059e3bb24f62fc1402ea18e5d6a77b06fd30676cb002d2a62e0dae0449e1770a738bf333aaa3e31bd7afd591081c783e56bc1864
    • SHA256(proxygen-v2022.09.12.00.tar.gz)= c2d6bb07a249d90a008067f1176c21416eebc34551c78f9da6e04e94d0b47f95
    • SHA512(proxygen-v2022.09.12.00.tar.gz)= 1fc0b979a5c80372ae6fcb81a97bdeb9af2d6406e87df3c318d1048294aec838cc14ba14c746da201e4abce8a91480ed1674bd98aaebe667105c90e323ec2161
    Source code(tar.gz)
    Source code(zip)
    proxygen-v2022.09.12.00.tar.gz(1.03 MB)
    proxygen-v2022.09.12.00.zip(1.40 MB)
  • v2022.09.05.00(Sep 5, 2022)

    Automated release from TagIt

    File Hashes
    • SHA256(proxygen-v2022.09.05.00.zip)= 30ed4b78b1e7244f447581b94f264e052aa267a9499881667a99fe3321d2d040
    • SHA512(proxygen-v2022.09.05.00.zip)= 4ddeabc504e3e1fde4a6f767a47be36068e4cf3ebb53735e3eb6c24150b39bc1dc2a809a8ce1135ab6f145b62616839a2b6ee511436a3bfaeb3d9d7d80ce7fe7
    • SHA256(proxygen-v2022.09.05.00.tar.gz)= f6eacbc3e3503761f70edbd68b795cab63b1484724bb7d273766e35e2f3c2295
    • SHA512(proxygen-v2022.09.05.00.tar.gz)= ee0ba885ac54718ef6daffae93aa1960316de7e7a6d07440285befc3c004dca9a10bdc7f60065f2a68b5d4165633aae8532bf83739a9479c5cc4b963856b4806
    Source code(tar.gz)
    Source code(zip)
    proxygen-v2022.09.05.00.tar.gz(1.02 MB)
    proxygen-v2022.09.05.00.zip(1.40 MB)
  • v2022.08.29.00(Aug 29, 2022)

    Automated release from TagIt

    File Hashes
    • SHA256(proxygen-v2022.08.29.00.zip)= fcc9423f2a1415fb8701350b6bedc129a4829b598887f0f225ad78807b5d98fa
    • SHA512(proxygen-v2022.08.29.00.zip)= 7953e02280443fd2f5de1b0a6e8ec56e210105e184875eabf164a4e7f33a18dce7b3e487c02a613689c36f61f8adf620531a13c2b7e76e7d9608bfc3991bfed4
    • SHA256(proxygen-v2022.08.29.00.tar.gz)= dee85b01bb7572673d02533f1e4a5392df614227f875f35c9e46d542bd5cf281
    • SHA512(proxygen-v2022.08.29.00.tar.gz)= 7bb600708b9e7edd6f6f57758506e83434e0c07c33aa61573476c217e8853cbd5af35e7465dbe7771483ac1ea4590e8afc5ec3530cf2953987671041114af8a2
    Source code(tar.gz)
    Source code(zip)
    proxygen-v2022.08.29.00.tar.gz(1.03 MB)
    proxygen-v2022.08.29.00.zip(1.41 MB)
  • v2022.08.22.00(Aug 22, 2022)

    Automated release from TagIt

    File Hashes
    • SHA256(proxygen-v2022.08.22.00.zip)= 3d85d723b841dcde66c74fad5cf0593dd39b99f6d0fade5f206d25617ff6f60c
    • SHA512(proxygen-v2022.08.22.00.zip)= 52bc2e653e4a86df0fc4e7b700a4ff281c804e1efef0d3a0be973bd76095c894045a7b6bd3a573b2f06be848ceea4101787cf0a9f3491c5529b82e72b60fe3bb
    • SHA256(proxygen-v2022.08.22.00.tar.gz)= c7aafcc0a2ba42302441b1cefc261c807342941f09498fea22c4e24d2e7dd18c
    • SHA512(proxygen-v2022.08.22.00.tar.gz)= c921f6ac71f39121c68d946f58ffe4aa810f129ffabd288604b241ccd60df1c0de3af20a0c2fd210987ef2ab58ad278193418ad97aa8f8976e0ca1f506f722ba
    Source code(tar.gz)
    Source code(zip)
    proxygen-v2022.08.22.00.tar.gz(1.03 MB)
    proxygen-v2022.08.22.00.zip(1.41 MB)
  • v2022.08.15.00(Aug 15, 2022)

    Automated release from TagIt

    File Hashes
    • SHA256(proxygen-v2022.08.15.00.zip)= 017399140528145bed204a5707a3b82db8a7e28036586efd4d9432fd6915c2e6
    • SHA512(proxygen-v2022.08.15.00.zip)= 9638ef68b128cec5ebad49565479b05f0089d60d8110bde93014e0bd5aa5ff32f56eb5fef5eeda7fee97e4510018b7d807b97913478e829160b5bea2096990db
    • SHA256(proxygen-v2022.08.15.00.tar.gz)= 46f44d8085bdeb2983e4d667fec48ec97cf53ef720c4eca90ccf2f3e35f787cc
    • SHA512(proxygen-v2022.08.15.00.tar.gz)= 363184487046d6b476aea0fff12f37feb902f5fda3284d9846fef18e1131c55b19f73789c4d0e66c07762b05b1e2be555871b681c8b76739c7188370c8a3163c
    Source code(tar.gz)
    Source code(zip)
    proxygen-v2022.08.15.00.tar.gz(1.03 MB)
    proxygen-v2022.08.15.00.zip(1.41 MB)
  • 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)
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.2k Dec 30, 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
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 139 Dec 26, 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 14 Nov 28, 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 Dec 30, 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 924 Jan 6, 2023
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 888 Dec 30, 2022
BingBing 60 Dec 15, 2022
Ole Christian Eidheim 741 Dec 27, 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 208 Nov 12, 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
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 97 Dec 22, 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
tiny HTTP parser written in C (used in HTTP::Parser::XS et al.)

PicoHTTPParser Copyright (c) 2009-2014 Kazuho Oku, Tokuhiro Matsuno, Daisuke Murase, Shigeo Mitsunari PicoHTTPParser is a tiny, primitive, fast HTTP r

H2O 1.6k Jan 1, 2023
cuehttp is a modern c++ middleware framework for http(http/https)/websocket(ws/wss).

cuehttp 简介 cuehttp是一个使用Modern C++(C++17)编写的跨平台、高性能、易用的HTTP/WebSocket框架。基于中间件模式可以方便、高效、优雅的增加功能。cuehttp基于boost.asio开发,使用picohttpparser进行HTTP协议解析。内部依赖了nl

xcyl 29 Dec 17, 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 8.3k Dec 31, 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 958 Jan 3, 2023
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 711 Dec 27, 2022