mirror of
				https://github.com/Frooodle/Stirling-PDF.git
				synced 2025-10-25 11:17:28 +02:00 
			
		
		
		
	# Description of Changes Previously, the dropdown menu in the pipeline configuration displayed all endpoints, including disabled ones, and allowed API calls to them. Changes: - Updated EndpointInterceptor to correctly parse request URIs and match them to corresponding endpoint names in settings.yml, ensuring disabled endpoints are blocked. - Added a new API endpoint in SettingsController to expose the endpointStatus map, allowing the frontend to check which endpoints are disabled. - Updated pipeline.js to use this new API and hide disabled endpoints from the dropdown menu. Tests: - Created a new Docker Compose setup using a custom settings.yml where all endpoints are disabled. - Implemented a test script to run this setup, send API requests to disabled endpoints, and verify they are correctly blocked. [Bug Fix Video](https://youtu.be/L1z3jZh8z8E) Closes #2881 --- ## Checklist ### General - [x] I have read the [Contribution Guidelines](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/CONTRIBUTING.md) - [x] I have read the [Stirling-PDF Developer Guide](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/DeveloperGuide.md) (if applicable) - [ ] I have read the [How to add new languages to Stirling-PDF](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/HowToAddNewLanguage.md) (if applicable) - [x] I have performed a self-review of my own code - [x] My changes generate no new warnings ### Documentation - [ ] I have updated relevant docs on [Stirling-PDF's doc repo](https://github.com/Stirling-Tools/Stirling-Tools.github.io/blob/main/docs/) (if functionality has heavily changed) - [ ] I have read the section [Add New Translation Tags](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/HowToAddNewLanguage.md#add-new-translation-tags) (for new translation tags only) ### UI Changes (if applicable) - [ ] Screenshots or videos demonstrating the UI changes are attached (e.g., as comments or direct attachments in the PR) ### Testing (if applicable) - [x] I have tested my changes locally. Refer to the [Testing Guide](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/DeveloperGuide.md#6-testing) for more details. --------- Co-authored-by: Anthony Stirling <77850077+Frooodle@users.noreply.github.com>
		
			
				
	
	
		
			184 lines
		
	
	
		
			4.9 KiB
		
	
	
	
		
			Bash
		
	
	
	
	
	
			
		
		
	
	
			184 lines
		
	
	
		
			4.9 KiB
		
	
	
	
		
			Bash
		
	
	
	
	
	
| #!/bin/bash
 | |
| 
 | |
| # Function to check a single endpoint
 | |
| check_endpoint() {
 | |
|   local endpoint=$(echo "$1" | tr -d '\r') # Remove carriage returns
 | |
|   local base_url=$(echo "$2" | tr -d '\r')
 | |
|   local full_url="${base_url}${endpoint}"
 | |
|   local timeout=10
 | |
|   local result_file="$3"
 | |
|   local api_key="$4"
 | |
| 
 | |
|   # Use curl to fetch the endpoint with timeout
 | |
| 
 | |
|   response=$(curl -s -w "\n%{http_code}" --max-time $timeout \
 | |
|   -H "accept: */*" \
 | |
|   -H "Content-Type: multipart/form-data" \
 | |
|   -F "additional_field=" \
 | |
|   "$full_url")
 | |
|   if [ $? -ne 0 ]; then
 | |
|     echo "FAILED - Connection error or timeout $full_url" >> "$result_file"
 | |
|     return 1
 | |
|   fi
 | |
| 
 | |
|   # Split response into body and status code
 | |
|   HTTP_STATUS=$(echo "$response" | tail -n1)
 | |
|   BODY=$(echo "$response" | sed '$d')
 | |
| 
 | |
|   # Check HTTP status
 | |
|   if [ "$HTTP_STATUS" != "403" ]; then
 | |
|     echo "FAILED - HTTP Status: $HTTP_STATUS - $full_url" >> "$result_file"
 | |
|     return 1
 | |
|   fi
 | |
| 
 | |
|   echo "OK - $full_url" >> "$result_file"
 | |
|   return 0
 | |
| }
 | |
| 
 | |
| # Function to test an endpoint and update counters
 | |
| test_endpoint() {
 | |
|   local endpoint="$1"
 | |
|   local base_url="$2"
 | |
|   local tmp_dir="$3"
 | |
|   local endpoint_index="$4"
 | |
|   local api_key="$5"
 | |
|   local result_file="${tmp_dir}/result_${endpoint_index}.txt"
 | |
| 
 | |
|   if ! check_endpoint "$endpoint" "$base_url" "$result_file" "$api_key"; then
 | |
|     echo "1" > "${tmp_dir}/failed_${endpoint_index}"
 | |
|   else
 | |
|     echo "0" > "${tmp_dir}/failed_${endpoint_index}"
 | |
|   fi
 | |
| }
 | |
| 
 | |
| # Main function to test all endpoints from the list in parallel
 | |
| test_all_endpoints() {
 | |
|   local endpoint_file="$1"
 | |
|   local base_url="${2:-"http://localhost:8080"}"
 | |
|   local api_key="$3"
 | |
|   local max_parallel="${4:-10}"  # Default to 10 parallel processes
 | |
|   local failed_count=0
 | |
|   local total_count=0
 | |
|   local start_time=$(date +%s)
 | |
|   local tmp_dir=$(mktemp -d)
 | |
|   local active_jobs=0
 | |
|   local endpoint_index=0
 | |
| 
 | |
|   echo "Starting endpoint tests..."
 | |
|   echo "Base URL: $base_url"
 | |
|   echo "Number of lines: $(wc -l < "$endpoint_file")"
 | |
|   echo "Max parallel jobs: $max_parallel"
 | |
|   echo "----------------------------------------"
 | |
| 
 | |
|   # Process each endpoint
 | |
|   while IFS= read -r endpoint || [ -n "$endpoint" ]; do
 | |
|     # Skip empty lines and comments
 | |
|     [[ -z "$endpoint" || "$endpoint" =~ ^#.*$ ]] && continue
 | |
| 
 | |
|     ((total_count++))
 | |
|     ((endpoint_index++))
 | |
| 
 | |
|     # Run the check in background
 | |
|     test_endpoint "$endpoint" "$base_url" "$tmp_dir" "$endpoint_index" "$api_key" &
 | |
| 
 | |
|     # Track the job
 | |
|     ((active_jobs++))
 | |
| 
 | |
|     # If we've reached max_parallel, wait for a job to finish
 | |
|     if [ $active_jobs -ge $max_parallel ]; then
 | |
|       wait -n  # Wait for any child process to exit
 | |
|       ((active_jobs--))
 | |
|     fi
 | |
|   done < "$endpoint_file"
 | |
| 
 | |
|   # Wait for remaining jobs to finish
 | |
|   wait
 | |
| 
 | |
|   # Print results in order and count failures
 | |
|   for i in $(seq 1 $endpoint_index); do
 | |
|     if [ -f "${tmp_dir}/result_${i}.txt" ]; then
 | |
|       cat "${tmp_dir}/result_${i}.txt"
 | |
|     fi
 | |
| 
 | |
|     if [ -f "${tmp_dir}/failed_${i}" ]; then
 | |
|       failed_count=$((failed_count + $(cat "${tmp_dir}/failed_${i}")))
 | |
|     fi
 | |
|   done
 | |
| 
 | |
|   # Clean up
 | |
|   rm -rf "$tmp_dir"
 | |
| 
 | |
|   local end_time=$(date +%s)
 | |
|   local duration=$((end_time - start_time))
 | |
| 
 | |
|   echo "----------------------------------------"
 | |
|   echo "Test Summary:"
 | |
|   echo "Total tests: $total_count"
 | |
|   echo "Failed tests: $failed_count"
 | |
|   echo "Passed tests: $((total_count - failed_count))"
 | |
|   echo "Duration: ${duration} seconds"
 | |
| 
 | |
|   return $failed_count
 | |
| }
 | |
| 
 | |
| # Print usage information
 | |
| usage() {
 | |
|   echo "Usage: $0 [-f endpoint_file] [-b base_url] [-k api_key] [-p max_parallel]"
 | |
|   echo "Options:"
 | |
|   echo "  -f endpoint_file Path to file containing endpoints to test (required)"
 | |
|   echo "  -b base_url      Base URL to prepend to test endpoints (default: http://localhost:8080)"
 | |
|   echo "  -k api_key       API key to use for authentication (required)"
 | |
|   echo "  -p max_parallel  Maximum number of parallel requests (default: 10)"
 | |
|   exit 1
 | |
| }
 | |
| 
 | |
| # Main execution
 | |
| main() {
 | |
|   local endpoint_file=""
 | |
|   local base_url="http://localhost:8080"
 | |
|   local api_key="123456789"
 | |
|   local max_parallel=10
 | |
| 
 | |
|   # Parse command line options
 | |
|   while getopts ":f:b:h" opt; do
 | |
|     case $opt in
 | |
|       f) endpoint_file="$OPTARG" ;;
 | |
|       b) base_url="$OPTARG" ;;
 | |
|       h) usage ;;
 | |
|       \?) echo "Invalid option -$OPTARG" >&2; usage ;;
 | |
|     esac
 | |
|   done
 | |
| 
 | |
|   # Check if endpoint file is provided
 | |
|   if [ -z "$endpoint_file" ]; then
 | |
|     echo "Error: Endpoint file is required"
 | |
|     usage
 | |
|   fi
 | |
| 
 | |
|   # Check if endpoint file exists
 | |
|   if [ ! -f "$endpoint_file" ]; then
 | |
|     echo "Error: Endpoint list file not found: $endpoint_file"
 | |
|     exit 1
 | |
|   fi
 | |
| 
 | |
|   # Check if API key is provided
 | |
|   if [ -z "$api_key" ]; then
 | |
|     echo "Error: API key is required"
 | |
|     usage
 | |
|   fi
 | |
| 
 | |
|   # Run tests using the endpoint list
 | |
|   if test_all_endpoints "$endpoint_file" "$base_url" "$api_key" "$max_parallel"; then
 | |
|     echo "All endpoint tests passed!"
 | |
|     exit 0
 | |
|   else
 | |
|     echo "Some endpoint tests failed!"
 | |
|     exit 1
 | |
|   fi
 | |
| }
 | |
| 
 | |
| # Run main if script is executed directly
 | |
| if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then
 | |
|   main "$@"
 | |
| fi
 |