# sozu-command-lib, tools to communicate with the Sōzu proxy
The sozu proxy can receive dynamic configuration changes through a unix socket.
This library defines the communication protocol, the message format, the required
structures, serialization and deserialization code.
## Command messages are defined in protobuf
Protobuf is a language-agnostic, binary serialization format
used to efficiently transmit structured data between different systems and languages.
The idea is to define the data _once_ in this format, so that various libraries
of various languages can translate it to their own.
All types are defined in the `command.proto` file.
There are two main types received by, and sent from, Sōzu:
- `Request`
- `Response`
They look like this, in protobuf:
```protobuf
// A message received by Sōzu to change its state or query information
message Request {
oneof request_type {
// save Sōzu's parseable state as a file, with a path
string save_state = 1;
// load a state file, given its path
string load_state = 2;
/*
40 more requests
*/
}
}
```
```protobuf
// Response to a request
message Response {
// wether the request was a success, a failure, or is processing
required ResponseStatus status = 1 [default = FAILURE];
// a success or error message
required string message = 2;
// response data, if any
optional ResponseContent content = 3;
}
```
These are serialized in binary, NOT in plain text formats like JSON.
A response can have 3 possible status:
- `Ok`: the task was done
- `Failure`: there was an unrecoverable error
- `Processing`: the task was started but may not finish right away
As an example, in a soft shutdown, the shutdown message is sent to all
the workers, and they acknowledge the message by sending an answer
with the `Processing` status: in a soft shutdown, a worker stops accepting
new connections but keeps the active ones and exits when they are no longer
active. Once all connections are done, a worker will send an answer
with the same id and the `Ok` status.