108 lines
3.1 KiB
Text
108 lines
3.1 KiB
Text
|
|
# Crawailer Test Server Configuration
|
||
|
|
# Serves controlled test content for reliable JavaScript API testing
|
||
|
|
|
||
|
|
{
|
||
|
|
auto_https off
|
||
|
|
}
|
||
|
|
|
||
|
|
# Main test site hub
|
||
|
|
localhost:8083, test.crawailer.local:8083 {
|
||
|
|
root * /srv
|
||
|
|
file_server browse
|
||
|
|
|
||
|
|
# Enable CORS for testing
|
||
|
|
header {
|
||
|
|
Access-Control-Allow-Origin *
|
||
|
|
Access-Control-Allow-Methods "GET, POST, PUT, DELETE, OPTIONS"
|
||
|
|
Access-Control-Allow-Headers *
|
||
|
|
}
|
||
|
|
|
||
|
|
# Health check endpoint
|
||
|
|
respond /health "OK" 200
|
||
|
|
|
||
|
|
# API endpoints for dynamic testing
|
||
|
|
handle /api/* {
|
||
|
|
header Content-Type "application/json"
|
||
|
|
respond /api/users `{"users": [{"id": 1, "name": "Alice"}, {"id": 2, "name": "Bob"}], "total": 2}`
|
||
|
|
respond /api/products `{"products": [{"id": 1, "name": "Widget", "price": 19.99}, {"id": 2, "name": "Gadget", "price": 29.99}], "total": 2}`
|
||
|
|
respond /api/slow `{"message": "Slow response", "timestamp": "{{now.Unix}}"}`
|
||
|
|
respond /api/error `{"error": "Simulated error", "code": 500}` 500
|
||
|
|
}
|
||
|
|
|
||
|
|
# Static content with JavaScript
|
||
|
|
handle /static/* {
|
||
|
|
root * /srv/static
|
||
|
|
file_server
|
||
|
|
}
|
||
|
|
|
||
|
|
# SPA routes - serve index.html for client-side routing
|
||
|
|
handle /spa/* {
|
||
|
|
root * /srv/spa
|
||
|
|
try_files {path} /index.html
|
||
|
|
file_server
|
||
|
|
}
|
||
|
|
|
||
|
|
# E-commerce demo
|
||
|
|
handle /shop/* {
|
||
|
|
root * /srv/ecommerce
|
||
|
|
try_files {path} /index.html
|
||
|
|
file_server
|
||
|
|
}
|
||
|
|
|
||
|
|
# News/blog demo
|
||
|
|
handle /news/* {
|
||
|
|
root * /srv/news
|
||
|
|
try_files {path} /index.html
|
||
|
|
file_server
|
||
|
|
}
|
||
|
|
|
||
|
|
# Documentation sites
|
||
|
|
handle /docs/* {
|
||
|
|
root * /srv/docs
|
||
|
|
file_server
|
||
|
|
}
|
||
|
|
|
||
|
|
# Default handler
|
||
|
|
handle {
|
||
|
|
root * /srv/hub
|
||
|
|
try_files {path} /index.html
|
||
|
|
file_server
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
# Subdomain for different scenarios
|
||
|
|
spa.test.crawailer.local:8083 {
|
||
|
|
root * /srv/spa
|
||
|
|
file_server
|
||
|
|
try_files {path} /index.html
|
||
|
|
}
|
||
|
|
|
||
|
|
ecommerce.test.crawailer.local:8083 {
|
||
|
|
root * /srv/ecommerce
|
||
|
|
file_server
|
||
|
|
try_files {path} /index.html
|
||
|
|
}
|
||
|
|
|
||
|
|
docs.test.crawailer.local:8083 {
|
||
|
|
root * /srv/docs
|
||
|
|
file_server
|
||
|
|
}
|
||
|
|
|
||
|
|
api.test.crawailer.local:8083 {
|
||
|
|
header Content-Type "application/json"
|
||
|
|
|
||
|
|
respond /v1/users `{"users": [{"id": 1, "name": "Alice", "email": "alice@test.com"}, {"id": 2, "name": "Bob", "email": "bob@test.com"}]}`
|
||
|
|
respond /v1/products `{"products": [{"id": 1, "name": "JavaScript Widget", "price": 25.99, "inStock": true}, {"id": 2, "name": "React Component", "price": 15.50, "inStock": false}]}`
|
||
|
|
respond /v1/analytics `{"pageViews": 1234, "uniqueVisitors": 567, "conversionRate": 0.125, "timestamp": "{{now.Unix}}"}`
|
||
|
|
|
||
|
|
# Simulate different response times
|
||
|
|
respond /v1/fast `{"message": "Fast response", "latency": "< 100ms"}` 200
|
||
|
|
respond /v1/slow `{"message": "Slow response", "latency": "> 3s"}`
|
||
|
|
|
||
|
|
# Error simulation
|
||
|
|
respond /v1/error `{"error": "Internal server error", "message": "Database connection failed"}` 500
|
||
|
|
respond /v1/timeout `{"error": "Request timeout"}` 408
|
||
|
|
|
||
|
|
# Default 404
|
||
|
|
respond * `{"error": "Endpoint not found", "available": ["/v1/users", "/v1/products", "/v1/analytics"]}` 404
|
||
|
|
}
|