fantos commited on
Commit
f61de90
Β·
verified Β·
1 Parent(s): 0c90c0c

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +165 -42
app.py CHANGED
@@ -1,45 +1,168 @@
1
  import gradio as gr
2
- import utils
3
-
4
- def choose_encode(inp_im,inp_mark,cho):
5
- if cho == "stegan":
6
- out_im, out_msg = utils.encode(inp_im,inp_mark)
7
- return out_im,out_msg
8
- if cho == "pnginfo":
9
- out_im, out_msg = utils.png_encode(inp_im,inp_mark)
10
- return out_im,out_msg
11
-
12
- css = """
13
- footer {
14
- visibility: hidden;
15
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
16
  """
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
17
 
18
- with gr.Blocks(css=css) as app:
19
- gr.HTML("""<a href="https://visitorbadge.io/status?path=https%3A%2F%2Ffantos-watermark.hf.space">
20
- <img src="https://api.visitorbadge.io/api/visitors?path=https%3A%2F%2Ffantos-watermark.hf.space&countColor=%23263759" />
21
- </a>""")
22
-
23
- with gr.Tab("Add Watermark"):
24
- cho = gr.Radio(choices=["stegan", "pnginfo"], value="stegan")
25
- with gr.Row():
26
- with gr.Column():
27
- inp_im = gr.Image(label="Input Image", type="filepath")
28
- inp_mark = gr.Textbox(label="Watermark")
29
- mark_btn = gr.Button("Add Watermark")
30
- msg_box = gr.Textbox(label="System Message")
31
- with gr.Column():
32
- out_im = gr.Image(label="Watermarked Image")
33
-
34
- with gr.Tab("Detect Watermark"):
35
- with gr.Row():
36
- with gr.Column():
37
- det_im = gr.Image(label="Watermarked Image", type="filepath")
38
- det_btn = gr.Button("Detect")
39
- with gr.Column():
40
- det_msg = gr.Textbox(label="Detected Watermark", lines=6, max_lines=50)
41
-
42
- mark_btn.click(choose_encode, [inp_im, inp_mark, cho], [out_im, msg_box])
43
- det_btn.click(utils.decode, [det_im], det_msg)
44
-
45
- app.launch()
 
1
  import gradio as gr
2
+ import aiohttp
3
+ import asyncio
4
+ import time
5
+ from datetime import datetime
6
+ import random
7
+
8
+ async def make_session_request(url, session_id, request_id):
9
+ """각 μ„Έμ…˜λ³„ μš”μ²­μ„ μ²˜λ¦¬ν•˜λŠ” ν•¨μˆ˜"""
10
+ async with aiohttp.ClientSession() as session:
11
+ headers = {
12
+ 'User-Agent': f'Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/{random.randint(70, 100)}.0',
13
+ 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
14
+ 'Accept-Language': 'en-US,en;q=0.5',
15
+ 'Connection': 'keep-alive',
16
+ 'DNT': '1',
17
+ 'Upgrade-Insecure-Requests': '1'
18
+ }
19
+ start_time = time.time()
20
+ try:
21
+ async with session.get(url, headers=headers, ssl=False, timeout=30) as response:
22
+ await response.read() # μ‹€μ œλ‘œ μ½˜ν…μΈ λ₯Ό 읽음
23
+ end_time = time.time()
24
+ return {
25
+ 'session_id': session_id,
26
+ 'request_id': request_id,
27
+ 'status': response.status,
28
+ 'time': end_time - start_time,
29
+ 'timestamp': datetime.now().strftime('%H:%M:%S.%f')[:-3]
30
+ }
31
+ except Exception as e:
32
+ end_time = time.time()
33
+ return {
34
+ 'session_id': session_id,
35
+ 'request_id': request_id,
36
+ 'status': f"Error: {str(e)}",
37
+ 'time': end_time - start_time,
38
+ 'timestamp': datetime.now().strftime('%H:%M:%S.%f')[:-3]
39
+ }
40
+
41
+ async def run_session(url, session_id, num_requests, progress_queue):
42
+ """각 μ„Έμ…˜μ˜ μš”μ²­λ“€μ„ κ΄€λ¦¬ν•˜λŠ” ν•¨μˆ˜"""
43
+ tasks = []
44
+ for i in range(num_requests):
45
+ task = make_session_request(url, session_id, i+1)
46
+ tasks.append(task)
47
+ await asyncio.sleep(random.uniform(0.1, 0.5)) # μžμ—°μŠ€λŸ¬μš΄ μš”μ²­ 간격
48
+
49
+ results = await asyncio.gather(*tasks)
50
+ await progress_queue.put((session_id, len(results)))
51
+ return results
52
+
53
+ async def load_test(url, num_sessions, requests_per_session, progress=gr.Progress()):
54
+ """메인 ν…ŒμŠ€νŠΈ ν•¨μˆ˜"""
55
+ if not url.startswith(('http://', 'https://')):
56
+ url = 'http://' + url
57
+
58
+ start_time = time.time()
59
+ progress_queue = asyncio.Queue()
60
+ total_requests = num_sessions * requests_per_session
61
+ completed_requests = 0
62
+
63
+ # ν”„λ‘œκ·Έλ ˆμŠ€ λͺ¨λ‹ˆν„°λ§μ„ μœ„ν•œ 비동기 ν•¨μˆ˜
64
+ async def monitor_progress():
65
+ nonlocal completed_requests
66
+ while completed_requests < total_requests:
67
+ session_id, count = await progress_queue.get()
68
+ completed_requests += count
69
+ progress(completed_requests / total_requests,
70
+ desc=f"μ§„ν–‰ 쀑... ({completed_requests}/{total_requests} requests)")
71
+
72
+ # λͺ¨λ“  μ„Έμ…˜ μ‹œμž‘
73
+ tasks = []
74
+ for session_id in range(num_sessions):
75
+ task = run_session(url, session_id + 1, requests_per_session, progress_queue)
76
+ tasks.append(task)
77
+
78
+ # ν”„λ‘œκ·Έλ ˆμŠ€ λͺ¨λ‹ˆν„°λ§ νƒœμŠ€ν¬ μ‹œμž‘
79
+ monitor_task = asyncio.create_task(monitor_progress())
80
+
81
+ # λͺ¨λ“  μ„Έμ…˜μ˜ κ²°κ³Ό μˆ˜μ§‘
82
+ all_results = []
83
+ for session_results in await asyncio.gather(*tasks):
84
+ all_results.extend(session_results)
85
+
86
+ await monitor_task
87
+
88
+ end_time = time.time()
89
+ total_time = end_time - start_time
90
+
91
+ # κ²°κ³Ό 뢄석
92
+ success_count = sum(1 for r in all_results if isinstance(r['status'], int) and 200 <= r['status'] < 300)
93
+ failed_count = len(all_results) - success_count
94
+ response_times = [r['time'] for r in all_results]
95
+
96
+ result_text = f"""ν…ŒμŠ€νŠΈ κ²°κ³Ό:
97
+ ======================
98
+ 총 μ„Έμ…˜ 수: {num_sessions}
99
+ μ„Έμ…˜λ‹Ή μš”μ²­ 수: {requests_per_session}
100
+ 총 μš”μ²­ 수: {total_requests}
101
+ 성곡: {success_count}
102
+ μ‹€νŒ¨: {failed_count}
103
+ 총 μ†Œμš” μ‹œκ°„: {total_time:.2f}초
104
+ μ΄ˆλ‹Ή μš”μ²­ 수: {total_requests/total_time:.1f}
105
+
106
+ 응닡 μ‹œκ°„ 톡계:
107
+ - 평균: {sum(response_times)/len(response_times):.3f}초
108
+ - μ΅œμ†Œ: {min(response_times):.3f}초
109
+ - μ΅œλŒ€: {max(response_times):.3f}초
110
+
111
+ 상세 μš”μ²­ 둜그:
112
+ ======================
113
  """
114
+
115
+ all_results.sort(key=lambda x: x['timestamp'])
116
+ for r in all_results[:50]: # 처음 50개 μš”μ²­λ§Œ ν‘œμ‹œ
117
+ result_text += f"[{r['timestamp']}] Session {r['session_id']:2d} - Request {r['request_id']:3d} - Status: {r['status']} - Time: {r['time']:.3f}s\n"
118
+
119
+ if len(all_results) > 50:
120
+ result_text += f"\n... 및 {len(all_results) - 50}개의 μΆ”κ°€ μš”μ²­"
121
+
122
+ return result_text
123
+
124
+ def sync_load_test(url, num_sessions, requests_per_session, progress=gr.Progress()):
125
+ return asyncio.run(load_test(url, int(num_sessions), int(requests_per_session), progress))
126
+
127
+ with gr.Blocks() as demo:
128
+ gr.Markdown("# λ™μ‹œ 접속 λΆ€ν•˜ ν…ŒμŠ€νŠΈ")
129
+
130
+ with gr.Row():
131
+ url_input = gr.Textbox(
132
+ label="λŒ€μƒ URL",
133
+ placeholder="example.com or http://example.com"
134
+ )
135
+
136
+ with gr.Row():
137
+ session_count = gr.Number(
138
+ label="λ™μ‹œ μ„Έμ…˜ 수",
139
+ value=10,
140
+ minimum=1,
141
+ maximum=100,
142
+ step=1
143
+ )
144
+ requests_per_session = gr.Number(
145
+ label="μ„Έμ…˜λ‹Ή μš”μ²­ 수",
146
+ value=10,
147
+ minimum=1,
148
+ maximum=100,
149
+ step=1
150
+ )
151
+
152
+ with gr.Row():
153
+ test_button = gr.Button("ν…ŒμŠ€νŠΈ μ‹œμž‘", variant="primary")
154
+
155
+ with gr.Row():
156
+ output = gr.Textbox(
157
+ label="ν…ŒμŠ€νŠΈ κ²°κ³Ό",
158
+ lines=30
159
+ )
160
+
161
+ test_button.click(
162
+ fn=sync_load_test,
163
+ inputs=[url_input, session_count, requests_per_session],
164
+ outputs=output
165
+ )
166
 
167
+ demo.queue()
168
+ demo.launch()