All Projects → boazsegev → Facil.io

boazsegev / Facil.io

Licence: mit
Your high performance web application C framework

Programming Languages

c
50402 projects - #5 most used programming language

Projects that are alternatives of or similar to Facil.io

Iodine
iodine - HTTP / WebSockets Server for Ruby with Pub/Sub support
Stars: ✭ 720 (-48.31%)
Mutual labels:  redis-client, pubsub, websocket-server, webserver
Netclient Ios
Versatile HTTP Networking in Swift
Stars: ✭ 117 (-91.6%)
Mutual labels:  json, framework, networking
Cppwebframework
​The C++ Web Framework (CWF) is a MVC web framework, Open Source, under MIT License, using C++ with Qt to be used in the development of web applications.
Stars: ✭ 348 (-75.02%)
Mutual labels:  json, framework, webserver
Beast
HTTP and WebSocket built on Boost.Asio in C++11
Stars: ✭ 3,241 (+132.66%)
Mutual labels:  networking, websockets, websocket-server
Microwebsrv
A micro HTTP Web server that supports WebSockets, html/python language templating and routing handlers, for MicroPython (used on Pycom modules & ESP32)
Stars: ✭ 420 (-69.85%)
Mutual labels:  websockets, websocket-server, webserver
Ulfius
Web Framework to build REST APIs, Webservices or any HTTP endpoint in C language. Can stream large amount of data, integrate JSON data with Jansson, and create websocket services
Stars: ✭ 666 (-52.19%)
Mutual labels:  json, websockets, websocket-server
Nano
Lightweight, facility, high performance golang based game server framework
Stars: ✭ 1,888 (+35.53%)
Mutual labels:  json, networking, websocket-server
Rockgo
A developing game server framework,based on Entity Component System(ECS).
Stars: ✭ 532 (-61.81%)
Mutual labels:  concurrency, websockets, websocket-server
Libzmq
ZeroMQ core engine in C++, implements ZMTP/3.1
Stars: ✭ 7,418 (+432.52%)
Mutual labels:  concurrency, pubsub, networking
Carrot
🥕 Build multi-device AR applications
Stars: ✭ 32 (-97.7%)
Mutual labels:  framework, networking, websockets
Pnet
High level Java network library
Stars: ✭ 49 (-96.48%)
Mutual labels:  framework, networking
Vibe.d
Official vibe.d development
Stars: ✭ 1,043 (-25.13%)
Mutual labels:  concurrency, networking
Websockets Chat
Laravel WebSockets chat
Stars: ✭ 44 (-96.84%)
Mutual labels:  websockets, websocket-server
Uvicorn Gunicorn Fastapi Docker
Docker image with Uvicorn managed by Gunicorn for high-performance FastAPI web applications in Python 3.6 and above with performance auto-tuning. Optionally with Alpine Linux.
Stars: ✭ 1,014 (-27.21%)
Mutual labels:  json, websockets
Danode
Small and flexible web server written using the D 2.0 language
Stars: ✭ 50 (-96.41%)
Mutual labels:  framework, webserver
Angel
A polished, production-ready backend framework in Dart for the VM, AOT, and Flutter.
Stars: ✭ 1,055 (-24.26%)
Mutual labels:  framework, websocket-server
Framework
IONDV. Framework is a high level framework for enterprise web applications development.
Stars: ✭ 54 (-96.12%)
Mutual labels:  json, framework
Lance
Multiplayer game server based on Node.JS
Stars: ✭ 1,161 (-16.65%)
Mutual labels:  networking, websockets
Devis
A microservices framework for Node.js
Stars: ✭ 72 (-94.83%)
Mutual labels:  json, framework
Embedio
A tiny, cross-platform, module based web server for .NET
Stars: ✭ 1,007 (-27.71%)
Mutual labels:  websockets, webserver

GitHub Build Status Codacy Badge codecov

facil.io is a C micro-framework for web applications. facil.io includes:

  • A fast HTTP/1.1 and Websocket static file + application server.
  • Support for custom network protocols for both server and client connections.
  • Dynamic types designed with web applications in mind (Strings, Hashes, Arrays etc').
  • Performant JSON parsing and formatting for easy network communication.
  • A pub/sub process cluster engine for local and Websocket pub/sub.
  • Optional connectivity with Redis.

facil.io provides high performance TCP/IP network services to Linux / BSD (and macOS) by using an evented design (as well as thread pool and forking support) and provides an easy solution to the C10K problem.

You can read more about facil.io on the facil.io website.

Important to Note

The master branch on the git repo is the development branch and is likely to be broken at any given time (especially when working on major revisions, as I am at the moment).

Please select a release version for any production needs.

Who's running on facil.io

An HTTP example

#include "http.h" /* the HTTP facil.io extension */

// We'll use this callback in `http_listen`, to handles HTTP requests
void on_request(http_s *request);

// These will contain pre-allocated values that we will use often
FIOBJ HTTP_X_DATA;

// Listen to HTTP requests and start facil.io
int main(int argc, char const **argv) {
  // allocating values we use often
  HTTP_X_DATA = fiobj_str_new("X-Data", 6);
  // listen on port 3000 and any available network binding (NULL == 0.0.0.0)
  http_listen("3000", NULL, .on_request = on_request, .log = 1);
  // start the server
  facil_run(.threads = 1);
  // deallocating the common values
  fiobj_free(HTTP_X_DATA);
}

// Easy HTTP handling
void on_request(http_s *request) {
  http_set_cookie(request, .name = "my_cookie", .name_len = 9, .value = "data",
                  .value_len = 4);
  http_set_header(request, HTTP_HEADER_CONTENT_TYPE,
                  http_mimetype_find("txt", 3));
  http_set_header(request, HTTP_X_DATA, fiobj_str_new("my data", 7));
  http_send_body(request, "Hello World!\r\n", 14);
}

Using facil.io in your project

It's possible to either start a new project with facil.io or simply add it to an existing one. GNU make is the default build system and CMake is also supported.

facil.io should be C99 compatible.

Starting a new project with facil.io

To start a new project using the facil.io framework, run the following command in the terminal (change appname to whatever you want):

 $ bash <(curl -s https://raw.githubusercontent.com/boazsegev/facil.io/master/scripts/new/app) appname

You can review the script here. In short, it will create a new folder, download a copy of the stable branch, add some demo boiler plate code and run make clean (which is required to build the tmp folder structure).

Next, edit the makefile to remove any generic features you don't need, such as the DUMP_LIB feature, the DEBUG flag or the DISAMS disassembler and start development.

Credit to @benjcal for suggesting the script.

Notice: The master branch is the development branch. Please select the latest release tag for the latest stable release version.

Adding facil.io to an existing project

facil.io is a source code library, so it's easy to copy the source code into an existing project and start using the library right away.

The make libdump command will dump all the relevant files in a single folder called libdump, and you can copy them all or divide them into header ands source files.

It's also possible to compile the facil.io library separately using the make lib command.

Using facil.io as a CMake submodule

facil.io also supports both git and CMake submodules. Credit to @OwenDelahoy (PR#8).

First, add the repository as a submodule using git:

git submodule add https://github.com/boazsegev/facil.io.git

Then add the following line the project's CMakeLists.txt

add_subdirectory(facil.io)

Using facil.io with Meson

facil.io is available at Meson Wrap DB.

First, install the wrap file:

meson wrap install facil

Then add the following line to your project's meson.build:

facil_dep = subproject('facil').get_variable('facil_dep')

More Examples

The examples folder includes code examples for a telnet echo protocol, a Simple Hello World server, an example for Websocket pub/sub with (optional) Redis, etc'.

You can find more information on the facil.io website


Forking, Contributing and all that Jazz

The contribution guide can be found here.

Sure, why not. If you can add Solaris or Windows support to evio and sock, that could mean facil would become available for use on these platforms as well.

If you encounter any issues, open an issue (or, even better, a pull request with a fix) - that would be great :-)

Hit me up if you want to:

  • Write tests... I always need more tests...

  • Help me write HPACK / HTTP2 protocol support.

  • Help me design / write a generic HTTP routing helper library for the http_s struct.

  • If you want to help me write a new SSL/TLS library or have an SSL/TLS solution we can fit into facil (as source code)... Note: SSL/TLS solutions should fit both client and server modes.

  • If you want to help promote the library, that would be great as well. Perhaps publish benchmarks or share your story.

  • Writing documentation into the facil.io website would be great. I keep the source code documentation fairly updated, but the documentation should be copied to the docs folder to get the documentation website up and running.

Note that the project description data, including the texts, logos, images, and/or trademarks, for each open source project belongs to its rightful owner. If you wish to add or remove any projects, please contact us at [email protected].