@@ -1,33 +1,31 @@
1 1 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
<title>CGI Server Extensions</title>
2 2 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
3 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- <h2>1.0 Introduction</h2>
4 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
5 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- If you have a [./server.wiki|Fossil server] for your project,
6 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- you can add [https://en.wikipedia.org/wiki/Common_Gateway_Interface|CGI]
7 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- extensions to that server. These extensions work like
8 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- any other CGI program, except that they also have access to the Fossil
9 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- login information and can (optionally) leverage the "skins" of Fossil
10 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- so that they appear to be more tightly integrated into the project.
3 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ If you choose to have a [./server.wiki|central server] for your Fossil-based
4 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ project (which is entirely optional - Fossil can be use an a pure peer-to-peer
5 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ mode) then you can also add CGI extensions to the Fossil websiteite d. These
6 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ extensions work like any other CGI program, except that they also have access
7 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ to the Fossil login information, so that they can restrict access based on
8 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ the currently logged in user. The CGI output can be a stand-alone webpage,
9 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ or it can be incorporated into the Fossil site using the standard Fossil
10 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ header and footer.
11 11 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
12 12 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
An example of where this is useful is the
13 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- [https://sqlite.org/src/ext/checklist|checklist application] on
14 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- the [https://sqlite.org/|SQLite] project. The checklist
13 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ [checklist application](https://sqlite.org/src/ext/checklist) on
14 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ the [SQLite](https://sqlite.org/) project. The checklist
15 15 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
helps the SQLite developers track which release tests have passed,
16 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- or failed, or are still to be done. The checklist program began as a
16 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ or failed, or are still to be done. The checklist used to be a
17 17 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
stand-alone CGI which kept its own private user database and implemented
18 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- its own permissions and login system and provided its own CSS. By
19 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- converting checklist into a Fossil extension, the same login that works
20 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- for the [https://sqlite.org/src|main SQLite source repository] also works
21 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- for the checklist. Permission to change elements of the checklist
22 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- is tied on permission to check-in to the main source repository. And
23 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- the standard Fossil header menu and footer appear on each page of
24 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- the checklist.
25 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
26 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- <h2>2.0 How It Works</h2>
27 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
28 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- CGI Extensions are disabled by default.
18 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ its on permissions and login system. By converting checklist into
19 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ a Fossil extension, the same login that works for the
20 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ [main SQLite source repository](https://sqlite.org/src) also works
21 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for the checklist. And permission to change elements of the checklist
22 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ is based on permission to check-in to the main source repository.
23 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
24 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ <h2>How It Works</h2>
25 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
26 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Extensions are off by default.
29 27 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
An administrator activates the CGI extension mechanism by specifying
30 28 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
an "Extension Root Directory" or "extroot" as part of the server setup.
31 29 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
If the Fossil server is itself run as CGI, then add a line to the CGI
32 30 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
script file that says:
33 31 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@@ -37,12 +35,12 @@
37 35 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
38 36 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Or, if the Fossil server is begin run as using the "fossil server" or
39 37 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
"fossil ui" or "fossil http" commands, then add an extra
40 38 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
"--extroot <i>DIRECTORY</i>" option to that command.
41 39 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
42 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- The <i>DIRECTORY</i> is the DOCUMENT_ROOT for the CGI.
43 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- Files in the DOCUMENT_ROOT are accessed via URLs like this:
40 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ The <i>DIRECTORY</i> thus specified becomes the DOCUMENT_ROOT for the
41 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ CGI. Files in the DOCUMENT_ROOT are accessed via URLs like this:
44 42 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
45 43 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
<blockquote>
46 44 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
https://example-project.org/ext/<i>FILENAME</i>
47 45 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
</blockquote>
48 46 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@@ -49,231 +47,5 @@
49 47 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
In other words, access files in DOCUMENT_ROOT by appending the filename
50 48 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
relative to DOCUMENT_ROOT to the [/help?cmd=/ext|/ext]
51 49 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
page of the Fossil server.
52 50 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Files that are readable but not executable are returned as static
53 51 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
content. Files that are executable are run as CGI.
54 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
55 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- <h3>2.1 Example #1</h3>
56 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
57 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- The source code repository for SQLite is a Fossil server that is run
58 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- as CGI. The URL for the source code repository is [https://sqlite.org/src].
59 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- The CGI script looks like this:
60 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
61 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- <blockquote><verbatim>
62 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #!/usr/bin/fossil
63 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- repository: /fossil/sqlite.fossil
64 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- errorlog: /logs/errors.txt
65 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- extroot: /sqlite-src-ext
66 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- </verbatim></blockquote>
67 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
68 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- The "extroot: /sqlite-src-ext" line tells Fossil that it should look for
69 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- extension CGIs in the /sqlite-src-ext directory. (All of this is happening
70 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- inside of a chroot jail, so putting the document root in a top-level
71 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- directory is a reasonable thing to do.)
72 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
73 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- When a URL like "https://sqlite.org/src/ext/checklist" is received by the
74 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- main webserver, it figures out that the /src part refers to the main
75 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- Fossil CGI script and so it runs that script. Fossil gets the remainder
76 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- of the URL to work with: "/ext/checklist". Fossil extracts the "/ext"
77 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- prefix and uses that to determine that this a CGI extension request.
78 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- Then it takes the leftover "/checklist" part and appends it to the
79 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- "extroot" to get the filename "/sqlite-src-ext/checklist". Fossil finds
80 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- that file to be executable, so it runs it as CGI and returns the result.
81 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
82 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- The /sqlite-src-ext/checklist file is a
83 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- [https://wapp.tcl.tk|Wapp program]. The current source code to the
84 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- this program can be seen at
85 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- [https://www.sqlite.org/src/ext/checklist/self] and
86 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- recent historical versions are available at
87 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- [https://sqlite.org/docsrc/finfo/misc/checklist.tcl] with
88 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- older legacy at [https://sqlite.org/checklistapp/timeline?n=all]
89 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
90 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- There is a cascade of CGIs happening here. The webserver that receives
91 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- the initial HTTP request runs Fossil as a CGI based on the
92 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- "https://sqlite.org/src" portion of the URL. The Fossil instance then
93 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- runs the checklist sub-CGI based on the "/ext/checklists" suffix. The
94 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- output of the sub-CGI is read by Fossil and then relayed on to the
95 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- main webserver which in turn relays the result back to the original client.
96 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
97 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- <h3>2.2 Example #2</h3>
98 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
99 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- The [https://fossil-scm.org/home|Fossil self-hosting repository] is also
100 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- a CGI that looks like this:
101 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
102 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- <blockquote><verbatim>
103 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #!/usr/bin/fossil
104 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- repository: /fossil/fossil.fossil
105 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- errorlog: /logs/errors.txt
106 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- extroot: /fossil-extroot
107 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- </verbatim></blockquote>
108 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
109 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- The extroot for this Fossil server is /fossil-extroot and in that directory
110 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- is an executable file named "fileup1" - another [https://wapp.tcl.tk|Wapp]
111 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- script. (The extension mechanism does not have to use Wapp. You can use
112 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- any kind of program you like. But the creator of SQLite and Fossil is fond
113 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- of [https://www.tcl.tk|Tcl/Tk] and so he tends to gravitate toward Tcl-based
114 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- technologies like Wapp.) The fileup1 script is a demo program that lets
115 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- the user upload a file using a form, and then displays that file in the reply.
116 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- There is a link on the page that causes the fileup1 script to return a copy
117 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- of its own source-code, so you can see how it works.
118 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
119 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- <h2>3.0 CGI Inputs</h2>
120 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
121 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- The /ext extension mechanism is an ordinary CGI interface. Parameters
122 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- are passed to the CGI program using environment variables. The following
123 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- standard CGI environment variables are supported:
124 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
125 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- * AUTH_TYPE
126 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- * AUTH_CONTENT
127 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- * CONTENT_LENGTH
128 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- * CONTENT_TYPE
129 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- * DOCUMENT_ROOT
130 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- * GATEWAY_INTERFACE
131 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- * HTTP_ACCEPT
132 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- * HTTP_ACCEPT_ENCODING
133 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- * HTTP_COOKIE
134 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- * HTTP_HOST
135 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- * HTTP_IF_MODIFIED_SINCE
136 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- * HTTP_IF_NONE_MATCH
137 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- * HTTP_REFERER
138 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- * HTTP_USER_AGENT
139 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- * PATH_INFO
140 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- * QUERY_STRING
141 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- * REMOTE_ADDR
142 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- * REMOTE_USER
143 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- * REQUEST_METHOD
144 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- * REQUEST_URI
145 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- * SCRIPT_DIRECTORY
146 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- * SCRIPT_FILENAME
147 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- * SCRIPT_NAME
148 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- * SERVER_NAME
149 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- * SERVER_PORT
150 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- * SERVER_PROTOCOL
151 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
152 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- Do a web search for
153 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- "[https://duckduckgo.com/?q=cgi+environment_variables|cgi environment variables]"
154 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- to find more detail about what each of the above variables mean and how
155 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- they are used.
156 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- Live listings of the values of some or all of these environment variables
157 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- can be found at links like these:
158 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
159 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- * [https://fossil-scm.org/home/test_env]
160 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- * [https://sqlite.org/src/ext/checklist/env]
161 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
162 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- In addition to the standard CGI environment variables listed above,
163 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- Fossil adds the following:
164 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
165 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- * FOSSIL_CAPABILITIES
166 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- * FOSSIL_REPOSITORY
167 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- * FOSSIL_USER
168 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
169 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- The FOSSIL_USER string is the name of the logged-in user. This variable
170 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- is missing or is an empty string if the user is not logged in. The
171 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- FOSSIL_CAPABILITIES string is a list of
172 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- [/setup_ulist_notes|Fossil capability letters] that
173 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- indicate what permissions the user has on the Fossil repository.
174 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- The FOSSIL_REPOSITORY environment variable gives the filename of the
175 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- Fossil repository that is running.
176 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
177 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- The [https://sqlite.org/src/ext/checklist|checklist application] uses the
178 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- FOSSIL_USER environment variable to determine the name of the user and
179 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- the FOSSIL_CAPABILITIES variable to determine if the user is allowed to
180 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- mark off changes to the checklist. Only users with check-in permission
181 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- to the Fossil repository are allowed to mark off checklist items. That
182 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- means that the FOSSIL_CAPABILITIES string must contain the letter "i".
183 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- Search for "FOSSIL_CAPABILITIES" in the
184 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- [https://sqlite.org/src/ext/checklist/self|source listing] to see how
185 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- this happens.
186 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
187 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- If the HTTP request includes content (for example if this is a POST request)
188 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- then the CONTENT_LENGTH value will be positive and the data for the content
189 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- will be readable on standard input.
190 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
191 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- <h2>4.0 CGI Outputs</h2>
192 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
193 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- CGI programs construct a reply by writing to standard output. The first
194 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- few lines of output are parameters intended for the webserver that invoked
195 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- the CGI. These are followed by a blank line and then the content.
196 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
197 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- Typical parameter output looks like this:
198 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
199 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- <blockquote><verbatim>
200 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- Status: 200 Ok
201 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- Content-Type: text/html
202 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- </verbatim></blockquote>
203 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
204 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- CGI programs can return any content type they want - they are not restricted
205 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- to text replies. It is OK for a CGI program to return (for example)
206 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- image/png.
207 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
208 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- The fields of the CGI response header can be any valid HTTP header fields.
209 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- Those that Fossil does not understand are simply relayed back to up the
210 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- line to the requester.
211 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
212 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- Fossil takes special action with some content types. If the Content-Type
213 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- is "application/x-fossil-wiki" or "application/x-markdown" then Fossil
214 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- converts the content from [/wiki_rules|Fossil-Wiki] or
215 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- [/md_rules|Markdown] into HTML, adding its
216 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- own header and footer text according to the repository skin. Content
217 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- of type "text/html" is normally passed straight through
218 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- unchanged. However, if the text/html content is of the form:
219 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
220 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- <blockquote><verbatim>
221 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- <div class='fossil-doc' data-title='DOCUMENT TITLE'>
222 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ... HTML content there ...
223 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- </div>
224 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- </verbatim></blockquote>
225 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
226 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- In other words, if the outer-most markup of the HTML is a <div>
227 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- element with a single class of "fossil-doc",
228 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- then Fossil will adds its own header and footer to the HTML. The
229 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- page title contained in the added header will be extracted from the
230 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- "data-title" attribute.
231 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
232 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- Except for the three cases noted above, Fossil makes no changes or
233 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- additions to the CGI-generated content. Fossil just passes the verbatim
234 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- content back up the stack towards the requester.
235 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
236 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- <h2>5.0 Filename Restrictions</h2>
237 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
238 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- For security reasons, Fossil places restrictions on the names of files
239 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- in the extroot directory that can participate in the extension CGI
240 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- mechanism:
241 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
242 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- 1. Filenames must consist of only ASCII alphanumeric characters,
243 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ".", "_", and "-", and of course "/" as the file separator.
244 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- Files with names that includes spaces or
245 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- other punctuation or special characters are ignored.
246 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
247 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- 2. No element of the pathname can begin with "." or "-". Files or
248 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- directories whose names begin with "." or "-" are ignored.
249 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
250 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- If a CGI program requires separate data files, it is safe to put those
251 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- files in the same directory as the CGI program itself as long as the names
252 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- of the data files contain special characters that cause them to be ignored
253 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- by Fossil.
254 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
255 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- <h2>6.0 Trouble-Shooting Hints</h2>
256 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
257 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- Remember that the /ext will return any file in the extroot directory
258 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- hierarchy as static content if the file is readable but not executable.
259 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- When initially setting up the /ext mechanism, it is sometimes helpful
260 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- to verify that you are able to receive static content prior to working
261 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- on getting your CGIs working. Also remember that CGIs must be
262 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- executable files.
263 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
264 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- Fossil likes to run inside a chroot jail, and will automatically put
265 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- itself inside a chroot jail if it can. The sub-CGI program will also
266 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- run inside this same chroot jail. Make sure all embedded pathnames
267 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- have been adjusted accordingly and that all resources needed by the
268 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- CGI program are available within the chroot jail.
269 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
270 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- If anything goes wrong while trying to process an /ext page, Fossil
271 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- returns a 404 Not Found error with no details. However, if the requester
272 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- is logged in as a user that has Debug privilege (capability letter "D")
273 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- then additional diagnostic information may be included in the output.
274 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
275 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- If the /ext page has a "fossil-ext-debug=1" query parameter and if
276 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- the requester is logged in as a user with Debug privilege, then the
277 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- CGI output is returned verbatim, as text/plain and with the original
278 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- header intact. This is useful for trying diagnosing problems with the
279 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- CGI script.
280 52 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!