| CMS/프레임워크 | Rhymix 2.1 |
|---|---|
| 개발 언어 | PHP 8.4 |
해당 내용은 AI가 서드파티 라이믹스1 시절에 만든 애드온의 기능을 수정하면서 발견한 오류를 수정하고
해결하면서 관련 문제라고 보고 받은 내용이라 적습니다.
깃헙에는 Ai작성글은 QNA를 통해 문의하라는 내용을 확인하여 QNA에 일단 남겨봅니다.
### 증상
addon에서 `exit()`/`die()`를 응답 내용 없이 호출하면(예: before_module_proc 훅에서 검증 실패 시
setError()/setMessage()만 하고 exit() 호출, echo/print 없이), 서버는 완전히 빈(0바이트) 응답을 보냅니다.
클라이언트는 이 빈 응답을 jQuery의 dataType:"json"으로 파싱하면서 `data`가 null이 되는데,
common.js / xml_handler.js의 AJAX 성공 핸들러가 이를 체크하지 않고 바로 접근합니다.
- common/js/common.js
- common/js/xml_handler.js
두 파일 모두 다음과 같은 코드가 있습니다:
if (data._rx_debug) {
data._rx_debug.page_title = "AJAX : " + ...
...
}
`data`가 null이면 여기서 "Cannot read properties of null (reading '_rx_debug')" 형태의
TypeError가 발생하고, 이후 처리(에러 메시지 표시, 리다이렉트 등)가 전혀 실행되지 않습니다.
사용자 입장에서는 버튼을 눌러도 아무 반응이 없는 것처럼 보입니다.
### 재현 방법
1. 임의의 addon을 before_module_proc 등에서 훅
2. 검증 실패 조건에서 아무 출력 없이 exit() 호출
3. 클라이언트에서 해당 act를 exec_json 등으로 호출 → 빈 응답 수신 → 콘솔에 TypeError
### 근본 원인
서드파티 addon이 응답 규약을 어기고 빈 응답을 보내는 것 자체는 addon의 버그이지만,
코어의 AJAX 응답 처리 코드가 이런 상황에 대해 방어적이지 않아서 조용히 죽어버리는 게 문제입니다.
플러그인 구조상 코어는 addon이 항상 올바른 응답을 보낸다고 가정하면 안 된다고 생각합니다.
### 제안하는 수정
common.js, xml_handler.js에서 `data._rx_debug` 접근 전에 null 체크만 추가하면 됩니다.
if (data && data._rx_debug) {
...
}
이렇게 하면 응답이 비어있는 경우에도 최소한 조용히 죽지 않고, 정상적으로 에러 처리 흐름을 타게 됩니다.
루딩
Lv. 1
댓글 4
음.. 응답이 json 포맷이 아니라면 아예 실패 핸들러로 가야 할 것 같은데
왜 성공 핸들러로 들어가서 오류를 일으키는지 의문이네요.
제보 감사합니다.
최신 코어 기준으로 테스트해 보니 jQuery 2.2.x에서만 발생하는 문제로 보입니다.
jQuery 3.7.x를 선택하면 0바이트 응답시 에러 핸들러 쪽으로 가네요.
아 감사합니다 제가 라이믹스 설정에서 3.x 버전대 선택을 안해서 생긴 문제인 것 같습니다
정말 data가 null인 상태로 성공 핸들러로 넘어온다면 data._rx_debug에 조건을 붙이더라도 그 후에 data를 참조하는 모든 조건문에서 계속 문제가 생길 수밖에 없습니다. 그렇다고 한 번 성공 핸들러로 넘어온 것을 실패 핸들러로 도로 보내자면 로직이 꽤 복잡해지고요.
jQuery 2.2.x에 대한 버그 수정을 기대할 수도 없는 상황이고, 어차피 권장하지 않는 구 버전이니 코어에서는 최소한의 방어만 해두도록 하겠습니다.