vineet124jig commited on
Commit
5f2611d
·
verified ·
1 Parent(s): d941ffa

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +51 -1
app.py CHANGED
@@ -2,13 +2,63 @@ import gradio as gr
2
  import requests
3
  import json
4
  import os
 
 
 
 
 
5
 
6
  BASE_URL = "https://api.jigsawstack.com/v1"
7
  headers = {
8
  "x-api-key": os.getenv("JIGSAWSTACK_API_KEY")
9
  }
10
 
11
- def validate_nsfw(url):
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
12
  if not url or not url.strip():
13
  return None, "Error: Image URL is required.", None, None
14
 
 
2
  import requests
3
  import json
4
  import os
5
+ import time
6
+ from collections import defaultdict
7
+ from PIL import Image
8
+ import io
9
+
10
 
11
  BASE_URL = "https://api.jigsawstack.com/v1"
12
  headers = {
13
  "x-api-key": os.getenv("JIGSAWSTACK_API_KEY")
14
  }
15
 
16
+ # Rate limiting configuration
17
+ request_times = defaultdict(list)
18
+ MAX_REQUESTS = 1 # Maximum requests per time window
19
+ TIME_WINDOW = 3600 # Time window in seconds (1 hour)
20
+
21
+ def get_real_ip(request: gr.Request):
22
+ """Extract real IP address using x-forwarded-for header or fallback"""
23
+ if not request:
24
+ return "unknown"
25
+
26
+ forwarded = request.headers.get("x-forwarded-for")
27
+ if forwarded:
28
+ ip = forwarded.split(",")[0].strip() # First IP in the list is the client's
29
+ else:
30
+ ip = request.client.host # fallback
31
+ return ip
32
+
33
+ def check_rate_limit(request: gr.Request):
34
+ """Check if the current request exceeds rate limits"""
35
+ if not request:
36
+ return True, "Rate limit check failed - no request info"
37
+
38
+ ip = get_real_ip(request)
39
+ now = time.time()
40
+
41
+ # Clean up old timestamps outside the time window
42
+ request_times[ip] = [t for t in request_times[ip] if now - t < TIME_WINDOW]
43
+
44
+ # Check if rate limit exceeded
45
+ if len(request_times[ip]) >= MAX_REQUESTS:
46
+ time_remaining = int(TIME_WINDOW - (now - request_times[ip][0]))
47
+ time_remaining_minutes = round(time_remaining / 60, 1)
48
+ time_window_minutes = round(TIME_WINDOW / 60, 1)
49
+
50
+ return False, f"Rate limit exceeded. You can make {MAX_REQUESTS} requests per {time_window_minutes} minutes. Try again in {time_remaining_minutes} minutes."
51
+
52
+ # Add current request timestamp
53
+ request_times[ip].append(now)
54
+ return True, ""
55
+
56
+ def validate_nsfw(url, request: gr.Request):
57
+ # Check rate limit first
58
+ rate_limit_ok, rate_limit_msg = check_rate_limit(request)
59
+ if not rate_limit_ok:
60
+ return None, rate_limit_msg, None, None
61
+
62
  if not url or not url.strip():
63
  return None, "Error: Image URL is required.", None, None
64