Hi,<br>
<br>
I know that I can customize my error pages (404, ...) with &quot;error.num&quot; key (ex : error.404&nbsp;&nbsp; myError.html) in kloned.conf.<br>
But I wish use the same error page (.kl1 or .klx) for all errors.<br>
To do this I must give a GET or POST variable at my error page (ex : error.kl1?no=404).<br>
<br>
For example :<br>
<br>
(kloned.conf)<br>
=================================================<br>
app_http<br>
{<br>
&nbsp;&nbsp;&nbsp; type&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; http<br>
&nbsp;&nbsp;&nbsp; addr.type&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IPv4<br>
&nbsp;&nbsp;&nbsp; addr.port&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 80<br>
&nbsp;&nbsp;&nbsp; dir_root&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /www<br>
&nbsp;&nbsp;&nbsp; <br>
&nbsp;&nbsp;&nbsp; error<br>
&nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 400&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; /error.kl1?no=400<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 404 &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; /error.kl1?no=404<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ...<br>
&nbsp;&nbsp;&nbsp; }<br>
}<br>
=================================================<br>
<br>
(error.kl1)<br>
=================================================<br>
&lt;%!<br>
static const char *errorno;<br>
%&gt;&lt;%<br>
errorno = request_get_arg(request,&quot;no&quot;);<br>
%&gt;&lt;html&gt;<br>
&lt;body&gt;<br>
&nbsp; &lt;h1&gt;&lt;%= errorno %&gt; Error&lt;/h1&gt;<br>
&lt;/body&gt;<br>
&lt;/html&gt;<br>
=================================================<br>
<br>
However this example doesn&#39;t actually.<br>
<br><br>I have searched a solution to perform this.<br>If I comment the line 421 &quot;if(http_is_valid_uri(rq, err_page, strlen(err_page)))&quot;<br>of &quot;http_print_error_page()&quot; function in &quot;src/libhttp/http.c&quot;, my custom error page with GET parameter is printed in my web-browser.<br>
So the solution is to modify &quot;http_print_error_page()&quot; function OR to pass the single URL (without GET parameter) at this function. It should be just see the base of URI is valid (ex : <a href="http://localhost/myerror.kl1?no=404">http://localhost/myerror.kl1?no=404</a> &nbsp; =&gt;&nbsp; <a href="http://localhost/myerror.kl1">http://localhost/myerror.kl1</a> ).<br>
<br>Here a solution that I tested with successfull :<br>
=================================================<br>static int http_print_error_page(http_t *h, request_t *rq, response_t *rs, <br>&nbsp;&nbsp;&nbsp; int http_status)<br>{<br>&nbsp;&nbsp;&nbsp; enum { BUFSZ = 64 };<br>&nbsp;&nbsp;&nbsp; const char *err_page;<br>&nbsp;&nbsp;&nbsp; char buf[BUFSZ];<br>
&nbsp;&nbsp;&nbsp; vhost_t *vhost;<br><br>&nbsp;&nbsp;&nbsp; int i; // new meter for new &quot;for&quot; loop<br>&nbsp;&nbsp;&nbsp; char uri[255]; // URL wihout GET parameter. 255 is the max length of URL<br><br>&nbsp;&nbsp;&nbsp; dbg_err_if (h == NULL);<br>&nbsp;&nbsp;&nbsp; dbg_err_if (rq == NULL);<br>
&nbsp;&nbsp;&nbsp; dbg_err_if (rs == NULL);<br>&nbsp;&nbsp;&nbsp; dbg_err_if (http_status == 0);<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; /* clean dirty header fields (not for redirects) */<br>&nbsp;&nbsp;&nbsp; if(http_status != 302)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dbg_err_if(header_clear(response_get_header(rs)));<br>
<br>&nbsp;&nbsp;&nbsp; /* add default header fields */<br>&nbsp;&nbsp;&nbsp; dbg_err_if(http_add_default_header(h, rq, rs));<br><br>&nbsp;&nbsp;&nbsp; /* disable page caching */<br>&nbsp;&nbsp;&nbsp; dbg_err_if(response_disable_caching(rs));<br><br>&nbsp;&nbsp;&nbsp; /* looking for user provided error page */<br>
&nbsp;&nbsp;&nbsp; dbg_err_if(u_snprintf(buf, BUFSZ, &quot;error.%d&quot;, http_status));<br>&nbsp;&nbsp;&nbsp; if((vhost = http_get_vhost(h, rq)) == NULL)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; err_page = u_config_get_subkey_value(h-&gt;config, buf);<br>&nbsp;&nbsp;&nbsp; else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; err_page = u_config_get_subkey_value(vhost-&gt;config, buf);<br>
<br>&nbsp;&nbsp;&nbsp; if(err_page &amp;&amp; !request_set_uri(rq, err_page, NULL, NULL))<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dbg_err_if(http_resolv_request(h, rq));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //copy of err_page without GET parameter<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; memset(uri,&#39;\0&#39;,255);<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; for(i=0;i&lt;strlen(err_page);i++)<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if(err_page[i]==&#39;?&#39;)<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; break;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; uri[i]=err_page[i];<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //if(http_is_valid_uri(rq, err_page, strlen(err_page))) //old test of URI<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if(http_is_valid_uri(rq, uri, strlen(uri))) //new test of URI<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* user provided error page found */<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; broker_serve(h-&gt;broker, h, rq, rs);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return 0;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* page not found */<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; warn(&quot;%d handler page (%s) not found&quot;, http_status, err_page);<br>&nbsp;&nbsp;&nbsp; }<br><br>&nbsp;&nbsp;&nbsp; /* be sure that the status code is properly set */<br>&nbsp;&nbsp;&nbsp; response_set_status(rs, http_status);<br>
<br>&nbsp;&nbsp;&nbsp; response_print_header(rs);<br><br>&nbsp;&nbsp;&nbsp; if(request_get_method(rq) == HM_HEAD)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return 0; /* just the header is requested */<br><br>&nbsp;&nbsp;&nbsp; /* print default error page */<br>&nbsp;&nbsp;&nbsp; dbg_err_if(io_printf(response_io(rs), <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &quot;&lt;!DOCTYPE HTML PUBLIC \&quot;-//IETF//DTD HTML 2.0//EN\&quot;&gt;&quot;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &quot;&lt;html&gt;&lt;head&gt;&lt;title&gt;%d %s&lt;/title&gt;&lt;/head&gt;\n&quot;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &quot;&lt;body&gt;&lt;h1&gt;%s&lt;/h1&gt;&lt;p&gt;URL: %s&lt;/p&gt;&lt;hr&gt;&quot;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &quot;&lt;address&gt;KLone/%s web server - <a href="http://www.koanlogic.com">www.koanlogic.com</a>&lt;/address&gt;&quot;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &quot;&lt;/body&gt;&lt;/html&gt;&quot;, <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; http_status, http_get_status_desc(http_status), <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; http_get_status_desc(http_status), <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (request_get_uri(rq) ? request_get_uri(rq) : &quot;&quot;),<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; KLONE_VERSION<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ) &lt; 0);<br><br>&nbsp;&nbsp;&nbsp; return 0;<br>err:<br>&nbsp;&nbsp;&nbsp; return ~0;<br>}<br>
=================================================<br><br>In this solution, I choose 255 for the max length of URI. This value should be your value that I don&#39;t known.<br><br>What do you think of this solution ?<br>
<br><br>
Bye.<br clear="all"><br>-- <br>Mickaël AUGER<br><br>