-
Notifications
You must be signed in to change notification settings - Fork 19
Wiki Request Runtime
이 문서는 현재 소스코드 기준 wiki.php의 main request path를 정리한다.
sequenceDiagram
participant PHP as wiki.php
participant Config as Config
participant DB as WikiDB
participant User as init_requests
participant Session as _session_start
participant Main as wiki_main
PHP->>Config: getConfig("config.php")
PHP->>PHP: require wikilib/cache/timer
PHP->>Config: load_cached_site_config(host)
PHP->>DB: new WikiDB(Config)
PHP->>User: init_requests(options)
User-->>PHP: options id, user prefs, theme data
PHP->>Session: PHP/MONIWIKI cookie 검증
PHP->>PHP: 초기 cache/CORS header 설정
PHP->>Main: wiki_main(options)
중요한 순서 제약은 init_requests($options)가 _session_start()보다 먼저 실행된다는 점이다. 따라서 session cleanup은 나중에 wiki_main($options)로 전달되는 동일한 $options 배열에 반영되어야 한다.
wiki_main($options)는 $options['pagename'] 또는 설정된 front page에서 시작한다.
POST 요청에서는 다음 처리를 한다.
-
$_POST에서 예약 필드retstr,header를 제거한다. -
action,value,goto,popup을 계산한다. - legacy raw-post와 drawing path를 지원한다.
-
goto나action이 없는 빈 POST 요청은Status: 405 Not allowed로 거부한다.
GET/HEAD 요청에서는 다음 처리를 한다.
-
$_GET에서 예약 필드retstr,header를 제거한다. -
action,value,goto,rev,refresh,popup을 읽는다. -
refresh는 비익명 사용자에게만 허용한다.
그 다음 action=Name/ajax, action=Name/macro 같은 action mode를 해석하고, 정규화된 page/action을 $options에 저장한 뒤 예약 필드 call, prefix를 제거한다.
요청 parsing 이후에는 다음 처리를 한다.
- action 요청에 대해
pageToKeyname()으로 page key 길이 제한을 적용한다. - 정의되어 있으면
local_pre_check($action, $options)가 실행될 수 있다. - 설정된 ruleset이 robot을 분류하거나 staff member를 추가할 수 있다.
-
WikiPage를 만들고, 기존 페이지라면 page instruction을 읽는다. - robot, GET, HEAD 요청을 위한 static page 상태를 준비한다.
- HEAD와 conditional GET은 일반 rendering 전에 반환될 수 있다.
action이 비어 있거나 show인 경우 런타임은 다음 흐름을 따른다.
-
value또는goto를do_goto()로 redirect한다. -
auto_search가 적용되지 않는 missing page는notfound로 보낸다. -
control_read가 켜져 있으면 read access를 강제한다. -
Formatter를 통해 header와 title을 보낸다. - cache 설정과 page instruction이 허용하면 page HTML cache를 사용한다.
- cached HTML load 이후 dynamic macro를 확장한다.
- extra macro와 footer를 보낸다.
show가 아닌 action의 흐름은 다음과 같다.
flowchart TD
Action["action 문자열"] --> Alias["myplugins alias"]
Alias --> Allowed["security->is_allowed(action, options)"]
Allowed --> Mode{"action mode"}
Mode -->|ajax/macro| ModeAllowed["전체 action 권한 검사"]
Mode -->|none| Protected["POST protected action password 검사"]
ModeAllowed --> DispatchMode["ajax_repl 또는 macro_repl"]
Protected --> Resolver["getPlugin(action)"]
Resolver --> Include["plugin basename include"]
Include --> Call["do_action 또는 do_post_action"]
POST action handler는 호출 직전에 $_POST가 $options로 merge된다. GET action handler는 do_* 호출 시 $_GET이 merge되고, do_post_*는 선택된 값만 받는다.
인증 상태 일관성은 caller의 $options 배열을 reference로 받는 _session_start()에서 처리한다. Plugin dispatch 시점에는 이미 여러 권한 경로가 $options['id']를 사용했을 수 있으므로, stale identity state를 무효화할 올바른 위치는 이 중앙 경계다.