Examples
File and Web Serving
Couper contains a Web server for simple file serving and also takes care of the more complex web serving of SPA assets.
server "example" {
  files {
    document_root = "htdocs"
  }
  spa {
    bootstrap_file = "htdocs/index.html"
    paths = ["/**"]
  }
}
The files block configures Couper's file server. It needs to know which directory to serve (document_root).
The spa block is responsible for serving the bootstrap document for all paths that match the paths list.
Exposing APIs
Couper's main concept is exposing APIs via the configuration block endpoint, fetching data from upstream or remote services, represented by the configuration block backend.
server "example"{
  endpoint "/public/**"{
    proxy {
      backend {
        origin = "https://httpbin.org"
        path = "/**"
      }
    }
  }
}
This basic configuration defines an upstream backend service (https://httpbin.org) and "mounts" it on the local API endpoint /public/**.
An incoming request /public/foo will result in an outgoing request https://httpbin.org/foo.
Securing APIs
Access control is controlled by an access control attribute that can be set for many blocks.
server "example" {
  endpoint "/private/**" {
    access_control = ["accessToken"]
    proxy {
      backend {
        origin = "https://httpbin.org"
        path = "/**"
      }
    }
  }
  definitions {
    jwt "accessToken" {
      signature_algorithm = "RS256"
      key_file = "keys/public.pem"
    }
  }
}
This configuration protects the endpoint /private/** with the access control "accessToken" configured in the definitions block.
Routing: Path Mapping
api "my_api" {
  base_path = "/api/v1"
  endpoint "/login/**" {
    proxy {
      backend {
        origin = "http://identityprovider:8080"
      }
    }
  }
  endpoint "/cart/**" {
    proxy {
      url = "http://cartservice:8080/api/v1/**"
    }
  }
  endpoint "/account/{id}" {
    proxy {
      backend {
        path = "/user/${request.param.id}/info"
        origin = "http://accountservice:8080"
      }
    }
  }
}
| Incoming request | Outgoing request | 
|---|---|
| /api/v1/login/foo | http://identityprovider:8080/login/foo | 
| /api/v1/cart/items | http://cartservice:8080/api/v1/items | 
| /api/v1/account/brenda | http://accountservice:8080/user/brenda/info | 
Using Variables and Expressions
An example to send an additional header with client request header to a configured backend and gets evaluated on per-request basis:
server {
  endpoint "/" {
    proxy {
      backend {
        origin = "https://httpbin.org/"
        path = "/anything"
        set_request_headers = {
          # simple variable lookup
          x-uuid = request.id
          # template string
          user-agent = "myproxyClient/${request.headers.app-version}"
          # expressions and function calls
          x-env-user = env.USER != "" ? to_upper(env.USER) : "UNKNOWN"
        }
      }
    }
  }
}