Skip to main content

Request Handling Overview

This guide explains how MyCroCloud processes incoming HTTP requests and routes them to the appropriate target.

Request Flow​

When a request arrives at MyCroCloud, it goes through the following pipeline:

Request → App Resolution → CORS → Routing → Route Resolution → Authentication → Authorization → Validation → Response

1. App Resolution​

MyCroCloud first identifies which app should handle the request based on the incoming host header or app identifier.

2. CORS Handling​

Cross-Origin Resource Sharing (CORS) headers are processed if configured for the app.

3. Routing​

The routing middleware matches the request path against the app's routing configuration to determine where the request should be directed.

4. Route Resolution​

For API routes, the system resolves the specific route definition from the database.

5. Authentication & Authorization​

If the route requires authentication, the request is validated against the configured authentication scheme.

6. Response Generation​

Based on the route type, the response is generated:

  • Static: Returns a static response or file
  • Function: Executes a serverless function

Routing Configuration​

MyCroCloud uses a declarative routing configuration that determines how requests are handled. If no custom configuration is provided, a default configuration is applied.

Default Configuration​

{
"schemaVersion": "1.0",
"routes": [
{
"priority": 1,
"match": { "type": "Prefix", "path": "/api" },
"target": { "type": "Api", "stripPrefix": false }
},
{
"priority": 2,
"match": { "type": "Prefix", "path": "/" },
"target": { "type": "Static", "fallback": "/index.html" }
}
]
}

This default configuration:

  1. Routes all /api/* requests to API routes (keeping the full path for route lookup)
  2. Serves static files for all other requests, falling back to index.html for SPA support

Route Matching​

Routes are evaluated in order of priority (lower number = higher precedence). The first matching route handles the request.

Match Types​

TypeDescriptionExample
PrefixMatches if the path starts with the specified value/api matches /api/users, /api/orders
ExactMatches only if the path exactly equals the value/health only matches /health
RegexMatches using a regular expression^/v[0-9]+/.* matches /v1/users, /v2/orders

Target Types​

API Target​

Routes requests to API route definitions stored in the database.

{
"type": "Api",
"stripPrefix": true
}

Options:

  • stripPrefix: If true, removes the matched prefix from the path before route resolution

Static Target​

Serves static files from the app's latest build artifacts.

{
"type": "Static",
"fallback": "/index.html",
"rewrite": "/assets/main.js"
}

Options:

  • fallback: File to serve when the requested file is not found (useful for SPAs)
  • rewrite: Override the file path to serve
  • stripPrefix: Remove the matched prefix when looking up files

Example Configurations​

SPA with API Backend​

{
"schemaVersion": "1.0",
"routes": [
{
"name": "API Routes",
"priority": 1,
"match": { "type": "Prefix", "path": "/api" },
"target": { "type": "Api", "stripPrefix": false }
},
{
"name": "Static Assets",
"priority": 2,
"match": { "type": "Prefix", "path": "/" },
"target": { "type": "Static", "fallback": "/index.html" }
}
]
}

API Only (No Prefix Stripping)​

If your API routes are stored with the full path (e.g., /api/users), disable prefix stripping:

{
"schemaVersion": "1.0",
"routes": [
{
"priority": 1,
"match": { "type": "Prefix", "path": "/" },
"target": { "type": "Api", "stripPrefix": false }
}
]
}

Multiple API Versions​

{
"schemaVersion": "1.0",
"routes": [
{
"name": "API v2",
"priority": 1,
"match": { "type": "Prefix", "path": "/v2" },
"target": { "type": "Api", "stripPrefix": false }
},
{
"name": "API v1 (Legacy)",
"priority": 2,
"match": { "type": "Prefix", "path": "/v1" },
"target": { "type": "Api", "stripPrefix": false }
},
{
"name": "Default to v2",
"priority": 3,
"match": { "type": "Prefix", "path": "/api" },
"target": { "type": "Api", "stripPrefix": true }
}
]
}

Understanding stripPrefix​

The stripPrefix option is important for matching routes in the database. Here's how it works:

Request PathMatch PathstripPrefixPath Sent to Route Resolution
/api/users/apitrue/users
/api/users/apifalse/api/users
/v1/orders/v1true/orders
/v1/orders/v1false/v1/orders
tip

Make sure your route definitions in the database match the path that will be used for resolution. If you use stripPrefix: true with match path /api, your routes should be defined as /users, not /api/users.

Configuring Routing​

You can configure routing through:

  1. Dashboard: Navigate to App Settings > General > Routing Configuration
  2. API: POST /api/apps/{appId}/routing-config

The configuration editor in the dashboard provides a JSON editor with syntax highlighting for easy editing.