Skip to content

Commit 96afbb5

Browse files
committed
소켓 경계 정직화: requests는 Pyodide fetch, socket 심은 stdlib HTTP
requests/urllib3를 socket 심으로 돌려보고 실측한 결과 Pyodide에서 requests는 socket이 아니라 JS fetch(emscripten 백엔드)를 쓴다(Failed to fetch). 그래서 이 브리지는 안 타고 CORS 제약을 받는다. 정직하게 경계로 둔다. - SocketBridge는 stdlib HTTP 스택(urllib/http.client)을 진짜 소켓으로 돌린다 (http + https 실측 GREEN 3/3). requests를 소켓으로 돌리려면 Pyodide의 urllib3-fetch 패치를 되돌려야 하는데 깊고 취약해 스코프 밖. - 미사용 ssl 속성 스텁 제거(urllib3는 fetch라 안 씀, http.client HTTPS는 wrap_socket 패스스루만으로 이미 됨). socketCapProbe에서 requests 테스트 제거 + 경계 주석. - socketBridge README에 경계 명시.
1 parent 088a1e3 commit 96afbb5

2 files changed

Lines changed: 8 additions & 1 deletion

File tree

tests/attempts/socketBridge/README.md

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,4 +32,6 @@
3232
- **socketCapProbe GREEN 3/3 (src 능력 승격, http + https)**: `Runtime.enableSocketBridge({relayURL})`로 승격. 메인 스레드 Runtime에서 파이썬 socket.socket()/create_connection을 릴레이에 심하고(블로킹 recv = JSPI/run_sync, runAsync 경로), **`urllib.request.urlopen`이 진짜 소켓으로 HTTP 200**(`http://example.com/` 559바이트 516ms) **와 HTTPS 200**(`https://example.com/` 219ms)을 수신. HTTPS는 릴레이가 port 443에서 TLS 종단하고 파이썬 `ssl.SSLContext.wrap_socket`은 패스스루(이중 암호화 방지). http.client가 심한 socket(create_connection + makefile)을 그대로 써서 진짜 TCP로 왕복. **파이썬 HTTP 스택이 브라우저에서 진짜 소켓으로 http + https 둘 다 돈다.**
3333
- 실측 특정 버그: http.client는 `Connection: close` 응답에서 헤더만 읽고 소켓을 닫은 뒤 바디를 makefile로 읽는다(CPython 소켓은 refcount로 생존). `close()`가 즉시 WS를 닫으면 릴레이가 in-flight 응답을 끊어 truncation(IncompleteRead 559바이트). `close()`를 유예해 데이터 드레인이 끝나게 해결.
3434

35-
**의미**: 벽2 아웃바운드가 개념 -> 진짜 파이썬 소켓 -> **src 능력(http + https)**으로 완결됐다. `SocketBridge`가 공개 표면. 남은 것 = 릴레이 강화(Wisp 멀티플렉싱, in-tab TLS = e2e), requests/urllib3(urllib3의 ssl 속성 추가 심). 인바운드는 정직한 물리 벽으로 남는다(역터널 릴레이 = 별도 조각).
35+
**정직한 경계(실측)**: 이 브리지는 **stdlib HTTP 스택**(`urllib`/`http.client`)을 진짜 소켓으로 돌린다(http+https 실측). `requests`/`urllib3`는 Pyodide에서 socket이 아니라 **JS fetch(emscripten 백엔드)**를 써서(실측: `Failed to fetch`) 이 심을 안 타고 CORS 제약을 받는다. requests를 소켓으로 돌리려면 Pyodide의 urllib3-fetch 패치를 되돌려야 하는데 깊고 취약해 스코프 밖.
36+
37+
**의미**: 벽2 아웃바운드가 개념 -> 진짜 파이썬 소켓 -> **src 능력(http + https, stdlib HTTP 스택)**으로 완결됐다. `SocketBridge`가 공개 표면. 남은 강화 = 릴레이 Wisp 멀티플렉싱, in-tab TLS(e2e). 인바운드는 정직한 물리 벽으로 남는다(역터널 릴레이 = 별도 조각).

tests/attempts/socketBridge/socketCapProbe.html

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,11 @@ <h1>probe: SocketBridge 능력 - urllib이 진짜 소켓으로 (벽2 생태계)<
6262
const rs = rawS && rawS.toJs ? rawS.toJs() : rawS;
6363
check("urllib HTTPS over 릴레이 TLS -> 진짜 200", Array.isArray(rs) && rs[0] === 200 && rs[2] === true, rs ? `status=${rs[0]}, ${rs[1]}바이트, ${timings.httpsMs}ms` : "null");
6464
if (rawS && rawS.destroy) rawS.destroy();
65+
66+
// 경계(정직): requests/urllib3는 Pyodide에서 socket이 아니라 JS fetch(emscripten 백엔드)를 쓴다.
67+
// 그래서 이 socket 심을 안 타고 CORS 제약을 받는다("Failed to fetch"). 이 브리지는 stdlib HTTP
68+
// 스택(urllib/http.client, 위 http+https 실측)을 진짜 소켓으로 돌린다. requests를 소켓으로 돌리려면
69+
// Pyodide의 urllib3-fetch 패치를 되돌려야 하는데 깊고 취약해 스코프 밖(정직하게 벽으로 둔다).
6570
} catch (e) {
6671
if (!String(e).includes("__skip__")) check("예외 없음", false, String(e).slice(-300));
6772
}

0 commit comments

Comments
 (0)