FLAT
CouperSevenval TechnologiesDocker ImageGithub
develop
develop
  • Changelog
  • FLAT
  • Administration
    • Configuration
    • Docker
    • Logging
  • Cookbook
    • Using the Built-in Mocking
    • Performing Additional Checks on JWT Access Tokens
    • Logging Custom Fields
    • Using Environment Variables
    • Handling Errors with an Error Flow
    • File Serving
    • Forwarding a Request to an Upstream API
    • Extracting Common Initialization Flow Tasks
    • Encoding and Decoding JWT
    • Passing Header Fields to the Client
    • How can I pass an arbitrary header field to an upstream system?
    • Performing Additional Checks on JWT Access Tokens
    • Proxying requests to Upstream APIs
    • Increasing the Request Timeout
    • How can I see what the client requested?
    • Using Swagger UI for API Documentation
    • Testing API Requests
    • Testing with Backend Requests
    • Testing Templates
    • Sending POST Requests
    • Processing Upstream Responses
    • Protecting Access using JWT Tokens
  • Reference
    • Configuration
    • Debugging
    • flat CLI
    • Flow
    • Variables
    • OpenAPI / Swagger Integration
    • OpenAPI
      • CORS - Cross-Origin Resource Sharing
    • OpenAPI
      • Differences from Swagger
    • OpenAPI
      • Mocking
    • OpenAPI
      • Routing
    • OpenAPI
      • Security
    • OpenAPI
      • Upstream APIs
    • OpenAPI
      • Validation
    • Flow Actions
      • assert Action
      • auth Action
      • backend-flow Action
      • copy Action
      • debug Action
      • dump Action
      • echo Action
      • error Action
      • eval Action
      • log Action
      • nameshave Action
      • pass-body Action
      • proxy-request Action
      • regex Action
      • request Action
      • requests Action
      • serve Action
      • set-config Action
      • set-env Action
      • set-response-headers Action
      • set-status Action
      • sub-flow Action
      • template Action
      • test-request Action
      • xslt Action
    • Functions
      • apply-codecs()
      • array-reverse()
      • array()
      • base64-decode()
      • base64-encode()
      • body()
      • calc-signature()
      • capitalize-first()
      • content()
      • decrypt-xml()
      • decrypt()
      • encrypt()
      • ends-with()
      • file-exists()
      • fit-document()
      • fit-log()
      • fit-serialize()
      • get-log()
      • has-class()
      • html-parse()
      • join()
      • json-doc()
      • json-parse()
      • json-stringify()
      • json-to-csv()
      • json-to-xml()
      • jwt-decode()
      • jwt-encode()
      • ldap-lookup()
      • ldap-query()
      • lookup()
      • matches()
      • md5()
      • replace()
      • sort()
      • split()
      • tolower()
      • toupper()
      • trim()
      • unixtime()
      • urldecode(), url-decode()
      • urlencode(), url-encode()
      • uuid3() and uuid4()
      • verify-signature()
      • verify-xmldsig()
      • xml-parse()
      • xml-to-json()
    • Templating
      • {{,}}
      • Comment {{// …}}
      • Dot {{.}}
      • Conditional `{{if <condition>}} … {{elseif <condition> }} … {{else}} … {{end}}
      • loop
      • ?? Operator
      • Object XML Notation (OXN)
      • Pair Producer {{: …}}
      • Placeholder
      • Template Variables
      • with
    • Testing
  • Tutorial
Powered by GitBook
On this page

Was this helpful?

  1. Cookbook

File Serving

PreviousHandling Errors with an Error FlowNextForwarding a Request to an Upstream API

Last updated 5 years ago

Was this helpful?

Sometimes you want to serve local files, e.g. HTML, JavaScript, or CSS. This is a task for the defined in conf/flow.xml and the .

📎 Note: In the following we assume that the basePath in swagger.yaml is not / so that the default flow will actually be effective.

First, we create flow.xml in conf with the following content:

<flow>
  <serve dir="../htdocs" fallback-doc="/index.html"/>
</flow>

This assumes that the local files should be found in an htdocs directory next to conf (dir="../htdocs") and that there is an index.html fallback document in the htdocs directory.

So, let's create htdocs/index.html

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>Fallback page</title>
    <link rel="stylesheet" href="/styles.css">
    <script src="/script.js"></script>
  </head>
  <body>
    <h1>Fallback page</h1>
  </body>
</html>

and some assets:

$ echo 'body { background-color: red }' > htdocs/styles.css
$ echo 'document.write("Hello!")'       > htdocs/script.js

Finally, we create another HTML document in a different directory:

$ mkdir -p htdocs/some/where

$ echo '<html><body><h1>Somewhere</h1></body></html>' > htdocs/some/where/index.html

Let's go surfin' now:

$ curl -si localhost:8080
HTTP/1.1 200 OK
Server: FLAT
Content-Type: text/html
…

    <h1>Fallback page</h1>
  </body>
</html>

$ curl -si localhost:8080/styles.css
HTTP/1.1 200 OK
…
Content-Type: text/css

body { background-color: red }

Note the redirection when we request /some/where without the trailing /:

$ curl -si --location localhost:8080/some/where
HTTP/1.1 301 Moved Permanently
Server: FLAT
Location: /some/where/
Content-Type: text/html
…

HTTP/1.1 200 OK
…
<html><body><h1>Somewhere</h1></body></html>

FLAT responds with index.html just like a web server would do.

📎 Note: Requests to missing resources always return the fallback document. Therefore, any resources therein must be absolutely referenced.

$ curl -si localhost:8080/not/existing/
HTTP/1.1 200 OK
Server: FLAT
Content-Type: text/html
…

    <h1>Fallback page</h1>
  </body>
</html>
serve action
default flow