✎ Edit on GitHub

Server

The server is responsible for accepting connections from clients, parsing their requests, and delivering them a response.

Default

Starting your Droplet with a default server is simple.

import Vapor

let drop = Droplet()

drop.run()

The default server will bind to host 0.0.0.0 at port 8080.

Config

If you are using a Config/servers.json file, this is where you can easily change your host and port or even boot multiple servers.

{
    "default": {
        "port": "$PORT:8080",
        "host": "0.0.0.0",
        "securityLayer": "none"
    }
}

The default servers.json is above. The port with try to resolve the environment variable $PORT or fallback to 8080.

Multiple

You can start multiple servers in the same application. This is especially useful if you want to boot an HTTP and HTTPS server side by side.

{
    "plaintext": {
        "port": "80",
        "host": "vapor.codes",
        "securityLayer": "none"
    },
    "secure": {
        "port": "443",
        "host": "vapor.codes",
        "securityLayer": "tls",
        "tls": {
            "certificates": "none",
            "signature": "selfSigned"
        }
    },
}

TLS

TLS (formerly SSL) can be configured with a variety of different certificate and signature types.

Verify

Verificiation of hosts and certificates can be disabled. They are enabled by default.

Note: Be extremely careful when disabling these options.

"tls": {
   "verifyHost": false,
   "verifyCertificates": false
}

Certificates

None

"tls": {
    "certificates": "none"
}

Chain

"tls": {
    "certificates": "chain",
    "chainFile": "/path/to/chainfile"
}

Files

"tls": {
    "certificates": "files",
    "certificateFile": "/path/to/cert.pem",
    "privateKeyFile": "/path/to/key.pem"
}

Certificate Authority

"tls": {
    "certificates": "ca"
}

Signature

Self Signed

"tls": {
    "signature": "selfSigned"
}

Signed File

"tls": {
    "signature": "signedFile",
    "caCertificateFile": "/path/to/file"
}

Signed Directory

"tls": {
    "signature": "signedDirectory",
    "caCertificateDirectory": "/path/to/dir"
}

Example

Here is an example servers.json file using certificate files with a self signed signature and host verification redundantly set to true.

{
    "secure": {
        "port": "8443",
        "host": "0.0.0.0",
        "securityLayer": "tls",
        "tls": {
            "verifyHost": true,
            "certificates": "files",
            "certificateFile": "/vapor/certs/cert.pem",
            "privateKeyFile": "/vapor/certs/key.pem",
            "signature": "selfSigned"
        }
    }
}

Manual

Servers can also be configured manually, without configuration files.

Note: If servers are configured programatically, they override any config settings.

Simple

The run method on the Droplet takes a dictionary of server configuration objects. The key is the name of the server.

import Vapor

let drop = Droplet()

drop.run(servers: [
    "default": (host: "vapor.codes", port: 8080, securityLayer: .none)
]

TLS

TLS can also be configured manually, and works similarly to the servers.json config files described above.

import Vapor
import TLS

let drop = Droplet()

let config = try TLS.Config(
    mode: .server,
    certificates: .files(
        certificateFile: "/Users/tanner/Desktop/certs/cert.pem", 
        privateKeyFile: "/Users/tanner/Desktop/certs/key.pem", 
        signature: .selfSigned
    ),
    verifyHost: true,
    verifyCertificates: true
)

drop.run(servers: [
    "plaintext": ("vapor.codes", 8080, .none),
    "secure": ("vapor.codes", 8443, .tls(config)),
])