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

webdav chunked size

# python upload/download 시 tqdm 으로 progressbar 표시한다.
# download 는 resp=requests.get(... stream=True) 와 resp.iter_content 로 스트림으로 받는 있는 데이터 사이즈를 파악할 수 있다.
# upload 는 async 와 async with aiohttp.ClientSession() 를 사용해 표시한다.
# tqdm 참고
# 그런데 upload(aiohttp > seesion > put) 시 http://httpbin.org/put 는 동작되는데
# webdav(http의 확장으로 COPY, MOVE, MKCOL(mkdir), PROPFIND(조회) 등 파일관리 메소드들 제공) 서버(https://github.com/mar10/wsgidav)에서는
# 다음 코드에서 진행되지 않고 CPU 100%를 사용하는 문제가 발생했다.
# 이 상태에서 요청을 계속 하면 서버 행 상태가 된다.
buf = environ["wsgi.input"].readline()

# 관련해서 비슷한 이슈가 오래전에 있어 수정이 되었다.
# chunk 사이즈 명시를 누락하는것 rfc2616(https://datatracker.ietf.org/doc/html/rfc2616#section-3.6.1) 명세를 위한반것으로 예외케이스를 추가한것으로 보인다.

# 클라이언트에서 X_EXPECTED_ENTITY_LENGTH 로 전체보낼 크기를 명시하고
# User-Agent 를 Darwin 으로 명시한다.
headers = {}
# headers["X_EXPECTED_ENTITY_LENGTH"] = repr(os.fstat(fileobj.fileno()).st_size) # fileobject case
headers["X_EXPECTED_ENTITY_LENGTH"] = repr(os.path.getsize(filename))
headers["User-Agent"] = "Darwin"

# 이제 put 을 하면 webdav 의 _stream_data_chunked > Darwin 조건에 다음과 같이 버크 크기를 알수 있어 진행된다.
buf = environ.get("HTTP_X_EXPECTED_ENTITY_LENGTH", "0")

# aiohttp 는 기본 Agent 가 다음과 같았고,
Python/3.9 aiohttp/3.7.4.post0

# 별도 chunk 크기를 명시하는 것이 없다. 
# 암튼 mar10 의 wsgidav chunk put 처리에는 예외 케이스가 있어
# 위처럼 클라이언트를 수정하던 wsgidav 서버 조건을 수정해야 한다.

# 참고로 User-Agent 없이 X_EXPECTED_ENTITY_LENGTH 만 설정하면 좋을것 같아서 문의함

# 이것땜에 한참 고생함ㅠㅠ, 힘들게 원인 파악한 기념으로 개비스콘 짤 생성~ㅋ