Giter VIP home page Giter VIP logo

winasio's Introduction

winasio

Windows extension for boost-asio. Header only. Alpha, WIP. ci codecov

Compenents

NamedPipe ASIO Server and Client

boost::winasio::named_pipe_acceptor is a drop in replacement for boost::asio::basic_socket_acceptor.

boost::winasio::named_pipe is a drop in replacement for boost::asio::basic_stream_socket.

One build a named_pipe server and client with all asio socket functionalities.

Counter part in other languages:

Coroutine Example Snippet:

  winnet::named_pipe_protocol<net::any_io_executor>::endpoint ep(
      "\\\\.\\pipe\\mynamedpipe");
  winnet::named_pipe_protocol<net::any_io_executor>::acceptor acceptor(executor,
                                                                       ep);
  for (;;) {
    winnet::named_pipe_protocol<net::any_io_executor>::pipe socket =
        co_await acceptor.async_accept(use_awaitable);
    std::cout << "listener spawing" << std::endl;
    co_spawn(executor, echo(std::move(socket)), detached);
  }

See examples for full code.

Windows Http Api (http.sys)

Windows Http Api

Utilize asio overlapped io intergration with executors. Provide asio style wrapper for async operation with http.sys.

Winhttp

Winhttp

Provide asio style wrapper for Winhttp running in async mode. All winhttp apis are converted to async version, compatible with both coroutine and callback styles.

Coroutine Example Snippet:

  co_await h_request.async_send(NULL,                    // headers
                                0,                       // header len
                                WINHTTP_NO_REQUEST_DATA, // optional
                                0,                       // optional len
                                0,                       // total len
                                net::use_awaitable);

  std::vector<BYTE> body_buff;
  auto dybuff = net::dynamic_buffer(body_buff);

  co_await h_request.async_recieve_response(net::use_awaitable);
  std::size_t len = 0;
  do {
    len =
        co_await h_request.async_query_data_available(net::use_awaitable);
    auto buff = dybuff.prepare(len + 1);
    std::size_t read_len = co_await h_request.async_read_data(
        (LPVOID)buff.data(), static_cast<DWORD>(len), net::use_awaitable);
    BOOST_REQUIRE_EQUAL(read_len, len);
    dybuff.commit(len);
  } while (len > 0);

See Example Test for full code.

Internals

See Internals.md for implmentation details.

Dependency

asio/boost-asio Install as part of boost: boost windows install

Licensing

Boost Software License - Version 1.0

winasio's People

Contributors

youyuanwu avatar mvpete avatar allenhan2 avatar

Watchers

 avatar

winasio's Issues

Design finalize http.sys high level api

http_connection, winnet::http::simple_request and winnet::http::simple_response are exposed for ease of use for a server application.
Currently http server to user logic is handled by a handler function:

auto handler = [](const winnet::http::simple_request &request,

We need to improve and finalize this API.

One example of high level API is this: https://github.com/nghttp2/nghttp2-asio
https://www.nghttp2.org/documentation/libnghttp2_asio.html

Macro out logs

There are various debug boost log lines all across the implementation files, and it is useful for debugging while developing this lib.
When doing benchmarks, such logs may degrade performance even though the log filter is specified.

So debugs should be macro-ed out our wrapped in #ifdef lines.

Migrate to http api version 2

More details: https://learn.microsoft.com/en-us/windows/win32/http/versioning-in-http-2-0

  • Migrate HttpAddUrl
    Currently winasio is using HttpAddUrl:
HTTPAPI_LINKAGE ULONG HttpAddUrl(
  [in] HANDLE RequestQueueHandle,
  [in] PCWSTR FullyQualifiedUrl,
       PVOID  Reserved
);

but https://learn.microsoft.com/en-us/windows/win32/api/http/nf-http-httpaddurl
says

Starting with HTTP Server API Version 2.0, applications should call [HttpAddUrlToUrlGroup](https://learn.microsoft.com/en-us/windows/desktop/api/http/nf-http-httpaddurltourlgroup) to register a URL; HttpAddUrl should not be used.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.