레이블이 python인 게시물을 표시합니다. 모든 게시물 표시
레이블이 python인 게시물을 표시합니다. 모든 게시물 표시

2025년 3월 15일 토요일

Python 으로 작성한 리버스 프록시 코드 (Flask 사용 내부 테스트용)

파이썬으로 작성한 리버스프록시 코드. 안드로이드 앱이 외부 접속을 할 때 https 가 아니면 안되는 경우가 있어서 제작함.


from flask import Flask, request, Response
import requests
import logging
from logging.handlers import RotatingFileHandler

app = Flask(__name__)
# netsh advfirewall firewall add rule name="Allow [EXTERNAL_PORT]" dir=in action=allow protocol=TCP localport=[EXTERNAL_PORT]
# 포워딩할 대상 URL (내부 HTTP 서버)
INTERNAL_PORT = 54321  # 내부 서버 포트 (예시)
TARGET = f"http://127.0.0.1:{INTERNAL_PORT}"

# 로그 파일 설정: server.log 파일에 최대 10,000바이트까지 저장하며, 1개의 백업 파일 생성
handler = RotatingFileHandler('server.log', maxBytes=10000, backupCount=1, encoding='utf-8')
handler.setLevel(logging.INFO)
formatter = logging.Formatter('%(asctime)s %(levelname)s: %(message)s')
handler.setFormatter(formatter)
app.logger.addHandler(handler)
app.logger.setLevel(logging.INFO)

# 모든 경로와 HTTP 메서드를 처리하도록 라우팅
@app.route('/', defaults={'path': ''}, methods=['GET', 'POST', 'PUT', 'DELETE', 'PATCH', 'OPTIONS'])
@app.route('/', methods=['GET', 'POST', 'PUT', 'DELETE', 'PATCH', 'OPTIONS'])
def proxy(path):
    target_url = f"{TARGET}/{path}"
    app.logger.info(f"Request: {request.method} {request.url} -> Forwarding to: {target_url}")
    
    headers = {key: value for key, value in request.headers if key.lower() != 'host'}
    
    # 대상 서버에 요청 전송
    resp = requests.request(
        method=request.method,
        url=target_url,
        headers=headers,
        params=request.args,
        data=request.get_data(),
        cookies=request.cookies,
        allow_redirects=False
    )
    
    app.logger.info(f"Response: Status code {resp.status_code} from {target_url}")
    
    # 대상 서버의 응답을 그대로 클라이언트에 전달
    response = Response(resp.content, resp.status_code)
    for key, value in resp.headers.items():
        response.headers[key] = value
    return response

if __name__ == '__main__':
    # Let's Encrypt 인증서 사용 (인증서 파일 경로는 마스킹 처리됨)
    ssl_context = ("[인증서 경로]/fullchain.pem", "[인증서 경로]/privkey.pem")
    EXTERNAL_PORT = 12345  # 외부에 노출될 포트 (예시)
    app.logger.info(f"Starting HTTPS reverse proxy server on port {EXTERNAL_PORT} with Let's Encrypt certificate")
    app.run(host='0.0.0.0', port=EXTERNAL_PORT, ssl_context=ssl_context)


2020년 2월 6일 목요일

Python 폴더 내 모든 wav 파일의 length를 가져와 모두 합치기 (duration 초 누산)

python 3.6.6 에서 확인했습니다.
wave 파일을 읽어서 frame수 / rate를 하면 길이가 sec으로 나옵니다.



#path_dir에 wav파일만 있다고 가정합니다.
#path_dir 에 있는 모든 파일을 읽어서 list에 넣고 length(duration)을 모두 더합니다.

import wave
import contextlib
import os
#import sys

path_dir = '드라이브:/경로/경로/' #경로 끝에 / 꼭 붙이기
file_list =os.listdir(path_dir) #경로 읽어 파일명 리스트 만들기
file_list.sort() #정렬

# 누적값 초기화
acc = 0

for i in file_list:

 with contextlib.closing(wave.open(path_dir + i,'r')) as f:
  frames = f.getnframes()
  rate = f.getframerate()
  duration = frames / float(rate)
  #print(duration)
  acc += duration #누적값

#결과 출력
print (acc)