The uwsgi Protocol
The uwsgi (lowercase!) protocol is the native protocol used by the uWSGI server.
It is a binary protocol that can carry any type of data. The first 4 bytes of a uwsgi packet describe the type of the data contained by the packet.
Every uwsgi request generates a response in the uwsgi format.
Even the web server handlers obey this rule, as an HTTP response is a valid uwsgi packet (look at the modifier1
= 72).
The protocol works mainly via TCP but the master process can bind to a UDP Unicast/Multicast for The embedded SNMP server or cluster management/messaging requests.
SCTP support is being worked on.
uwsgi packet header
- struct uwsgi_packet_header {
- uint8_t modifier1;
- uint16_t datasize;
- uint8_t modifier2;
- };
Unless otherwise specified the datasize
value contains the size (16-bit little endian) of the packet body.
Packet descriptions
modifier1 | datasize | modifier2 | packet type |
---|---|---|---|
0 | size of WSGI block vars (HTTP request body excluded) | 0 | Standard WSGI request followed by the HTTP request body |
1 | reserved for UNBIT | ||
2 | reserved for UNBIT | ||
3 | reserved for UNBIT | ||
5 | size of PSGI block vars (HTTP request body excluded) | 0 | Standard PSGI request followed by the HTTP request body |
6 | size of LUA WSAPI block vars (HTTP request body excluded) | 0 | Standard LUA/WSAPI request followed by the HTTP request body |
7 | size of RACK block vars (HTTP request body excluded) | 0 | Standard RACK request followed by the HTTP request body |
8 | size of JWSGI/Ring block vars (HTTP request body excluded) | 0 | Standard JVM request for The JWSGI interface and The Clojure/Ring JVM request handler followed by the HTTP request body |
9 | size of CGI block vars (HTTP request body excluded) | 0 | Standard Running CGI scripts on uWSGI request followed by the HTTP request body |
10 | size of block vars | 0- 255 | Management interface request: setup flag specified by modifier2. For a list of management flag look at ManagementFlag |
14 | size of CGI block vars (HTTP request body excluded) | 0 | Standard Running PHP scripts in uWSGI request followed by the HTTP request body |
15 | size of Mono ASP.NET block vars (HTTP request body excluded) | 0 | Standard The Mono ASP.NET plugin request followed by the HTTP request body |
17 | size of Spooler block vars | 0- 255 | The uWSGI Spooler request, the block vars is converted to a dictionary/hash/table and passed to the spooler callable. The second modifier is currently ignored. |
18 | size of CGI block vars | 0-255 | direct call to c-like symbols |
22 | size of code string | 0- 255 | Raw Code evaluation. The interpreter is chosen by the modifier2. 0 is Python, 5 is Perl.It does not return a valid uwsgi response, but a raw string (that may be an HTTP response) |
23 | size of CGI vars | 0- 255 | invoke the The XSLT plugin |
24 | size of CGI vars | 0- 255 | invoke the uWSGI V8 support |
25 | size of CGI vars | 0- 255 | invoke the The GridFS plugin |
26 | size of CGI vars | 0- 255 | invoke the The GlusterFS plugin |
27 | 0 | 0- 255 | call the FastFuncs specified by the modifier2 field |
28 | 0 | 0- 255 | invoke the The RADOS plugin |
30 | size of WSGI block vars (HTTP request body excluded) | 0 (if defined the size of the block vars is 24bit le, for now none of the webserver handlers support this feature) | Standard WSGI request followed by the HTTP request body. The PATH_INFO is automatically modified, removing the SCRIPT_NAME from it |
31 | size of block vars | 0- 255 | Generic message passing (reserved) |
32 | size of char array | 0- 255 | array of char passing (reserved) |
33 | size of marshal object | 0- 255 | marshalled/serialzed object passing (reserved) |
48 | snmp specific | snmp specific | identify a SNMP request/response (mainly via UDP) |
72 | chr(TT) | chr(P) | Corresponds to the ‘HTTP’ string and signals that this is a raw HTTP response. |
73 | announce message size (for sanity check) | announce type (0 = hostname) | announce message |
74 | multicast message size (for sanity check) | 0 | array of chars; a custom multicast message managed by uwsgi.multicast_manager |
95 | cluster membership dict size | action | add/remove/enable/disable node from a cluster. Action may be 0 = add, 1 = remove, 2 = enable, 3 = disable. Add action requires a dict of at least 3 keys: hostname , address and workers |
96 | log message size | 0 | Remote logging (clustering/multicast/unicast) |
97 | 0 | 0, 1 | brutal reload request (0 request - 1 confirmation) |
98 | 0 | 0, 1 | graceful reload request (0 request - 1 confirmation) |
99 | size of options dictionary (if response) | 0, 1 | request configuration data from a uwsgi node (even via multicast) |
100 | 0 | 0, 1 | PING- PONG if modifier2 is 0 it is a PING request otherwise it is a PONG (a response). Useful for cluster health- check |
101 | size of packet | 0 | ECHO service |
109 | size of clean payload | 0 to 255 | legion msg (UDP, the body is encrypted) |
110 | size of payload | 0 to 255 | uwsgi_signal framework (payload is optional), modifier2 is the signal num |
111 | size of packet | 0, 1, 2, 3 | Cache operations. 0: read, 1: write, 2: delete, 3: dict_based |
123 | size of packet | - | special modifier for signaling corerouters about special conditions |
173 | size of packet | 0, 1 | RPC. The packet is an uwsgi array where the first item is the name of the function and the following are the args (if modifier2 is 1 the RPC will be ‘raw’ and all of the response will be returned to the app, uwsgi header included, if available. |
200 | 0 | 0 | Close mark for persistent connections |
224 | size of packet | 0 | Subscription packet. see SubscriptionServer |
255 | 0 | 0- 255 | Generic response. Request dependent. For example a spooler response set 0 for a failed spool or 1 for a successful one |
The uwsgi vars
The uwsgi block vars represent a dictionary/hash. Every key-value is encoded in this way:
- struct uwsgi_var {
- uint16_t key_size;
- uint8_t key[key_size];
- uint16_t val_size;
- uint8_t val[val_size];
- }