Skip to content

Wiki Request Runtime

Won-Kyu Park edited this page Aug 8, 2026 · 2 revisions

Wiki 요청 런타임

이 문서는 현재 소스코드 기준 wiki.php의 main request path를 정리한다.

Bootstrap 순서

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)
Loading

중요한 순서 제약은 init_requests($options)_session_start()보다 먼저 실행된다는 점이다. 따라서 session cleanup은 나중에 wiki_main($options)로 전달되는 동일한 $options 배열에 반영되어야 한다.

wiki_main의 요청 parsing

wiki_main($options)$options['pagename'] 또는 설정된 front page에서 시작한다.

POST 요청에서는 다음 처리를 한다.

  • $_POST에서 예약 필드 retstr, header를 제거한다.
  • action, value, goto, popup을 계산한다.
  • legacy raw-post와 drawing path를 지원한다.
  • gotoaction이 없는 빈 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를 제거한다.

Page와 policy 준비

요청 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 전에 반환될 수 있다.

Show 경로

action이 비어 있거나 show인 경우 런타임은 다음 흐름을 따른다.

  • value 또는 gotodo_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를 보낸다.

Action dispatch 경로

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"]
Loading

POST action handler는 호출 직전에 $_POST$options로 merge된다. GET action handler는 do_* 호출 시 $_GET이 merge되고, do_post_*는 선택된 값만 받는다.

Main identity 경계

인증 상태 일관성은 caller의 $options 배열을 reference로 받는 _session_start()에서 처리한다. Plugin dispatch 시점에는 이미 여러 권한 경로가 $options['id']를 사용했을 수 있으므로, stale identity state를 무효화할 올바른 위치는 이 중앙 경계다.

Clone this wiki locally