Skip to content

Commit

Permalink
Support the FastAPI app being mounted.
Browse files Browse the repository at this point in the history
  • Loading branch information
nsthorat committed Feb 13, 2024
1 parent c683213 commit ebf0981
Show file tree
Hide file tree
Showing 7 changed files with 68 additions and 46 deletions.
8 changes: 3 additions & 5 deletions integration_tests/fastapi_integration.py
Original file line number Diff line number Diff line change
@@ -1,16 +1,14 @@
"""Integration tests where the FastAPI app is mounted."""
import lilac.server
import uvicorn
from fastapi import FastAPI

app = FastAPI()


@app.get('/')
def read_main():
"""The main endpoint."""
return {'message': 'Hello World from main app'}


app.mount('/lilac', lilac.server.app)

if __name__ == '__main__':
uvicorn.run(app, host='0.0.0.0', port=8000)
app.mount('/lilac_sub', lilac.server.app)
29 changes: 29 additions & 0 deletions integration_tests/fastapi_mount_test.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
# Tests the FastAPI server when it is mounted as a sub-path.

MOUNT_PATH='lilac_sub'

# Find a free port.
PORT=$(python -c 'import socket; s=socket.socket(); s.bind(("", 0)); print(s.getsockname()[1]); s.close()');

poetry run uvicorn integration_tests.fastapi_integration:app --port $PORT &
pid="$!"


URL="http://localhost:$PORT/"
start_time="$(date -u +%s)"
TIMEOUT_SEC=15
until curl --fail --silent "$URL" > /dev/null; do
sleep 1
current_time="$(date -u +%s)"
elapsed_seconds=$(($current_time-$start_time))
if [ $elapsed_seconds -gt $TIMEOUT_SEC ]; then
echo "Timeout $TIMEOUT_SEC seconds to reach server."
kill $pid
exit 1
fi
done


curl --fail --silent "http://localhost:$PORT/lilac_sub/api/v1/tasks/"

curl --fail --silent "http://localhost:$PORT/lilac_sub/"
30 changes: 2 additions & 28 deletions integration_tests/run_integration_tests.sh
Original file line number Diff line number Diff line change
Expand Up @@ -2,34 +2,8 @@

set -e # Fail if any of the commands below fail.

# Make sure the CLI succeeds for test_data.
mkdir -p test_data
touch test_data/lilac.yml

# Find a free port.
PORT=$(python -c 'import socket; s=socket.socket(); s.bind(("", 0)); print(s.getsockname()[1]); s.close()');


poetry run lilac start ./test_data --port $PORT &
pid="$!"

URL="http://localhost:$PORT/docs"
start_time="$(date -u +%s)"
TIMEOUT_SEC=15
until curl --fail --silent "$URL" > /dev/null; do
sleep 1
current_time="$(date -u +%s)"
elapsed_seconds=$(($current_time-$start_time))
if [ $elapsed_seconds -gt $TIMEOUT_SEC ]; then
echo "Timeout $TIMEOUT_SEC seconds to reach server."
kill $pid
exit 1
fi
done

echo "GET request to $URL succeeded."

kill $pid
./integration_tests/start_server_test.sh
./integration_tests/fastapi_mount_test.sh

echo
echo "CLI integration tests passed."
Expand Down
32 changes: 32 additions & 0 deletions integration_tests/start_server_test.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
# Tests that the lilac server starts from the CLI.

set -e # Fail if any of the commands below fail.

# Make sure the CLI succeeds for test_data.
mkdir -p test_data
touch test_data/lilac.yml

# Find a free port.
PORT=$(python -c 'import socket; s=socket.socket(); s.bind(("", 0)); print(s.getsockname()[1]); s.close()');


poetry run lilac start ./test_data --port $PORT &
pid="$!"

URL="http://localhost:$PORT/docs"
start_time="$(date -u +%s)"
TIMEOUT_SEC=15
until curl --fail --silent "$URL" > /dev/null; do
sleep 1
current_time="$(date -u +%s)"
elapsed_seconds=$(($current_time-$start_time))
if [ $elapsed_seconds -gt $TIMEOUT_SEC ]; then
echo "Timeout $TIMEOUT_SEC seconds to reach server."
kill $pid
exit 1
fi
done

echo "GET request to $URL succeeded."

kill $pid
10 changes: 1 addition & 9 deletions lilac/server.py
Original file line number Diff line number Diff line change
Expand Up @@ -96,20 +96,12 @@ def __init__(self, app: ASGIApp) -> None:
async def __call__(self, scope: Scope, receive: Receive, send: Send) -> None:
"""Redirect trailing slashes to non-trailing slashes."""
url = URL(scope=scope).path
print('url=', url)
root_path = scope.get('root_path') or ''
ends_with_slash = (
url.endswith('/')
and url != '/'
and root_path
and url != root_path
and url != root_path + '/'
and not url.startswith(root_path + '/api')
url.endswith('/') and url != '/' and root_path and not url.startswith(root_path + '/api')
)
# ends_with_slash = url.endswith('/') and url != '/' and not url.startswith('/api')

if scope['type'] == 'http' and ends_with_slash:
print('redirectiong to', url.rstrip('/'))
new_url = url.rstrip('/')
response = RedirectResponse(url=new_url, status_code=307)
await response(scope, receive, send)
Expand Down
4 changes: 1 addition & 3 deletions run_server_dev.sh
Original file line number Diff line number Diff line change
Expand Up @@ -16,9 +16,7 @@ if [ "$1" ]; then
else
export LILAC_PROJECT_DIR="./data"
fi
# poetry run uvicorn lilac.server:app --reload --port 5432 --host 0.0.0.0 \
# --reload-dir lilac &
poetry run uvicorn integration_tests.fastapi_integration:app --reload --port 5432 --host 0.0.0.0 \
poetry run uvicorn lilac.server:app --reload --port 5432 --host 0.0.0.0 \
--reload-dir lilac &
pid[1]=$!

Expand Down
1 change: 0 additions & 1 deletion web/blueprint/src/routes/+layout.svelte
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,6 @@
// Set the base URL for the OpenAPI requests when the app is served from a subdir.
OpenAPI.BASE = base;
console.log('base=', base);
const routeToPage: Record<string, AppPage> = {
'': 'home',
Expand Down

0 comments on commit ebf0981

Please sign in to comment.