/[mod_czs]/mod_czs.c
This is repository of my old source code which isn't updated any more. Go to git.rot13.org for current projects!
ViewVC logotype

Annotation of /mod_czs.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.13 - (hide annotations)
Sun Aug 13 20:11:51 2000 UTC (23 years, 7 months ago) by dpavlin
Branch: MAIN
Changes since 1.12: +75 -46 lines
File MIME type: text/plain
partial mac support, support all text* contnet-types

1 dpavlin 1.1 /*
2     * mod_czs -- nuke iso8859-2 characters
3 dpavlin 1.11 * sets `Contnet-type: text/html; charset=foobar' based on user agent string
4     * from client browser
5     *
6 dpavlin 1.1 * Dobrica Pavlinusic <dpavlin@rot13.org>
7 dpavlin 1.11 * Robert Avilov <ravilov@linux.hr> (some fixes of ua_charset part)
8 dpavlin 1.1 *
9     * based on mod_format by Stephen F. Booth and
10     * mod_mocrify by Peter Triller, Ernst Bachmann
11     *
12     * Usage: httpd.conf
13     * AddHandler czs .html
14     *
15     * This program is free software; you can redistribute it and/or modify
16     * it under the terms of the GNU General Public License as published by
17     * the Free Software Foundation; either version 2 of the License, or
18     * (at your option) any later version.
19     *
20     * This program is distributed in the hope that it will be useful,
21     * but WITHOUT ANY WARRANTY; without even the implied warranty of
22     * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
23     * GNU General Public License for more details.
24     *
25     * You should have received a copy of the GNU General Public License
26     * along with this program; if not, write to the Free Software
27     * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
28     */
29    
30     #include "httpd.h"
31     #include "http_main.h"
32     #include "http_config.h"
33     #include "http_log.h"
34     #include "http_protocol.h"
35    
36     module MODULE_VAR_EXPORT mod_czs;
37    
38     FILE *in;
39    
40     static int czs_handler(request_rec *r) {
41    
42     char buffer[MAX_STRING_LEN] = "undefined buffer content";
43 dpavlin 1.13 char *b,*do_czs,*do_mac;
44 dpavlin 1.11 char *rexp = "< *META *HTTP-EQUIV=\"(Content-Type)\" *CONTENT=\"(text/html[^\"]+)\" *>";
45     regex_t *regexp;
46     int nsub = 10;
47     regmatch_t regm[10];
48     int i,f_ch=MAX_STRING_LEN,l_ch=0;
49 dpavlin 1.1
50     if(r->method_number != M_GET)
51     return DECLINED;
52     if(r->finfo.st_mode == 0)
53     return NOT_FOUND;
54    
55 dpavlin 1.13 do_czs = (char *)ap_table_get(r->notes,"do_czs");
56     do_mac = (char *)ap_table_get(r->notes,"do_mac");
57    
58 dpavlin 1.1 in = ap_pfopen(r->pool, r->filename, "r");
59    
60     if(in == NULL) {
61     ap_log_reason("file permissions deny server access", r->filename, r);
62     return FORBIDDEN;
63     }
64 dpavlin 1.7 #ifdef DEBUG
65 dpavlin 1.13 ap_table_setn(r->headers_out, "X-czs_filename", r->filename);
66     if (r->args != 0) {
67     ap_table_setn(r->headers_out, "X-czs_args", r->args);
68 dpavlin 1.1 }
69 dpavlin 1.13 ap_table_setn(r->headers_out, "X-do_czs", do_czs);
70     ap_table_setn(r->headers_out, "X-do_mac", do_mac);
71     ap_table_setn(r->headers_out, "X-content-type", r->content_type);
72 dpavlin 1.7 #endif
73 dpavlin 1.1
74 dpavlin 1.9 #ifdef TEST_QUERYSTRINGV
75 dpavlin 1.13 if (r->args == 0 && do_czs == NULL && do_mac == NULL || ap_strcasestr(r->content_type,"cgi") != NULL) {
76 dpavlin 1.5 #else
77 dpavlin 1.13 if (do_czs == NULL && do_mac == NULL || ap_strcasestr(r->content_type,"cgi") != NULL) {
78 dpavlin 1.5 #endif
79 dpavlin 1.9 return DECLINED;
80     /* ap_send_fd(in, r); */
81 dpavlin 1.1 } else {
82 dpavlin 1.9
83 dpavlin 1.11 regexp = ap_pregcomp(r->pool, rexp, REG_EXTENDED | REG_ICASE );
84    
85     if (regexp == NULL) {
86     ap_log_rerror(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, r,
87     "unable to compile pattern \"%s\"", rexp);
88     return DECLINED;
89     }
90    
91 dpavlin 1.9 ap_soft_timeout("send", r);
92     ap_send_http_header(r);
93    
94     if(r->header_only) {
95     ap_kill_timeout(r);
96     ap_pfclose(r->pool, in);
97     return OK;
98     }
99 dpavlin 1.5
100 dpavlin 1.11
101 dpavlin 1.5 while(fgets(buffer,MAX_STRING_LEN,in)) {
102 dpavlin 1.13 if (do_czs != NULL) {
103     for(i=0; i<MAX_STRING_LEN && buffer[i]; i++) {
104     switch ( buffer[i] ) {
105     case '¹': buffer[i]='s'; break;
106     case 'ð': buffer[i]='d'; break;
107     case 'è': buffer[i]='c'; break;
108     case 'æ': buffer[i]='c'; break;
109     case '¾': buffer[i]='z'; break;
110     case '©': buffer[i]='S'; break;
111     case 'Ð': buffer[i]='D'; break;
112     case 'È': buffer[i]='C'; break;
113     case 'Æ': buffer[i]='C'; break;
114     case '®': buffer[i]='Z'; break;
115     }
116 dpavlin 1.5 }
117 dpavlin 1.1 }
118 dpavlin 1.11
119    
120     if (ap_regexec(regexp, buffer, nsub, regm, 0) == 0) {
121     #if 0
122     ap_rprintf(r,"<!-- num replacements: %02x buffer:\n%s\n",nsub,buffer);
123     ap_rprintf(r,"\n-->\n",i,regm[i].rm_so,regm[i].rm_eo);
124     #endif
125     for (i=0; i<10; i++) {
126     if (regm[i].rm_so != -1) {
127     if (regm[i].rm_so < f_ch)
128     f_ch = regm[i].rm_so;
129     if (regm[i].rm_eo > l_ch)
130     l_ch = regm[i].rm_eo;
131     }
132     #if 0
133     ap_rprintf(r,"<!-- %02x: %02x-%02x -->\n",i,regm[i].rm_so,regm[i].rm_eo);
134     #endif
135     }
136     buffer[f_ch]=0;
137     ap_rprintf(r,"%s", ap_pstrcat(r->pool, buffer,"<!-- removed charset -->", buffer+l_ch, NULL));
138     } else {
139     ap_rprintf(r,"%s",buffer);
140     }
141 dpavlin 1.1 }
142 dpavlin 1.11 /* ap_pregfree(r->pool, regexp); */
143 dpavlin 1.1 }
144    
145     ap_kill_timeout(r);
146     ap_pfclose(r->pool, in);
147     return OK;
148     }
149    
150 dpavlin 1.10 int translate_path(request_rec *r) {
151     char *uri = r->uri;
152     request_rec *subr;
153 dpavlin 1.13 char *ct;
154     char *ua;
155    
156     #ifdef DEBUG
157     ap_table_setn(r->headers_out, "X-translate-uri", r->uri);
158     #endif
159 dpavlin 1.10
160 dpavlin 1.13 if (uri[0]=='/' && (uri[1] | 0x20) =='c' && (uri[2] | 0x20)=='z' && (uri[3] | 0x20) =='s' && uri[4]=='/') {
161     subr = (request_rec *) ap_sub_req_lookup_uri(r->uri+4, r);
162     r->filename=ap_pstrdup(r->pool, subr->filename);
163     ct = (char *)subr->content_type;
164     if (ct == NULL) return DECLINED; /* hm? */
165 dpavlin 1.10 #ifdef DEBUG
166 dpavlin 1.13 ap_table_setn(r->headers_out, "X-translate-sub-ct", ct);
167 dpavlin 1.10 #endif
168 dpavlin 1.13 ap_table_setn(r->notes,"do_czs",ap_pstrdup(r->pool,"1"));
169     ap_destroy_sub_req(subr);
170     return OK;
171     }
172    
173     ua = (char *)ap_table_get(r->headers_in, "User-Agent");
174     if (ua == NULL) ua = "unknown";
175    
176     #ifdef DEBUG
177     ap_table_setn(r->headers_out, "X-translate-UA", ua);
178 dpavlin 1.10 #endif
179 dpavlin 1.13
180     if (uri[0]=='/' && (uri[1] | 0x20) =='m' && (uri[2] | 0x20)=='a' && (uri[3] | 0x20) =='c' && uri[4]=='/') {
181 dpavlin 1.10 subr = (request_rec *) ap_sub_req_lookup_uri(r->uri+4, r);
182     r->filename=ap_pstrdup(r->pool, subr->filename);
183 dpavlin 1.13 ct = (char *)subr->content_type;
184     if (ct == NULL) return DECLINED; /* hm? */
185 dpavlin 1.10 #ifdef DEBUG
186 dpavlin 1.13 ap_table_setn(r->headers_out, "X-translate-sub-ct", ct);
187 dpavlin 1.10 #endif
188 dpavlin 1.13 /* will store User-Agent in do_mac as true value */
189     if (ap_strcasestr(ua, "Mac"))
190     ap_table_setn(r->notes,"do_mac",ua);
191     else {
192     ap_table_setn(r->headers_out, "Location", r->uri+4);
193     return REDIRECT;
194 dpavlin 1.10 }
195     ap_destroy_sub_req(subr);
196     return OK;
197     }
198    
199 dpavlin 1.13 #if 0
200     if (ap_strcasestr(ua, "Mac")) {
201     ap_table_setn(r->headers_out, "Location", ap_pstrcat(r->pool, "/mac/", r->uri, NULL));
202     return REDIRECT;
203     }
204     #endif
205    
206 dpavlin 1.10 return DECLINED;
207     }
208 dpavlin 1.11
209     static int add_charset_header(request_rec * r)
210     {
211 dpavlin 1.13 char *ua, *ct;
212 dpavlin 1.11
213 dpavlin 1.13 ua = (char *)ap_table_get(r->notes, "do_mac");
214     ct = (char *)r->content_type;
215 dpavlin 1.11
216     if (ct != NULL && !ap_table_get(r->notes,"do_czs")) {
217    
218 dpavlin 1.13 if (ap_strcasestr(ct, "text") == NULL)
219 dpavlin 1.11 return DECLINED; /* Don't mess with other types */
220    
221 dpavlin 1.13 if (ua) { /* do_mac */
222     if (ap_strcasestr(ua, "MSIE") != NULL)
223     r->content_type = ap_pstrcat(r->pool, ct,"; charset=x-mac-roman", NULL);
224 dpavlin 1.11 else
225 dpavlin 1.13 r->content_type = ap_pstrcat(r->pool, ct,"; charset=MacCE", NULL);
226 dpavlin 1.11 } else
227 dpavlin 1.13 r->content_type = ap_pstrcat(r->pool, ct,"; charset=iso-8859-2", NULL);
228 dpavlin 1.11 }
229    
230     #ifdef DEBUG
231     ap_table_setn(r->headers_out, "X-Content-Type", ct);
232     ap_table_setn(r->headers_out, "X-new-Content-Type", r->content_type);
233     ap_table_setn(r->headers_out, "X-User-Agent", ua);
234     #endif
235     return DECLINED;
236     }
237    
238    
239 dpavlin 1.1 /* Dispatch list of content handlers */
240     static const handler_rec czs_handlers[] = {
241     { "czs", czs_handler },
242     { NULL, NULL }
243     };
244    
245     /* Dispatch list for API hooks */
246     module MODULE_VAR_EXPORT czs_module = {
247     STANDARD_MODULE_STUFF,
248     NULL, /* module initializer */
249     NULL, /* create per-dir config structures */
250     NULL, /* merge per-dir config structures */
251     NULL, /* create per-server config structures */
252     NULL, /* merge per-server config structures */
253     NULL, /* table of config file commands */
254     czs_handlers, /* [#8] MIME-typed-dispatched handlers */
255     translate_path, /* [#1] URI to filename translation */
256     NULL, /* [#4] validate user id from request */
257     NULL, /* [#5] check if the user is ok _here_ */
258     NULL, /* [#2] check access by host address */
259     NULL, /* [#6] determine MIME type */
260 dpavlin 1.11 add_charset_header, /* [#7] pre-run fixups */
261 dpavlin 1.1 NULL, /* [#9] log a transaction */
262     NULL, /* [#3] header parser */
263     NULL, /* child_init */
264     NULL, /* child_exit */
265     NULL /* [#0] post read-request */
266 dpavlin 1.8 #ifdef EAPI
267     ,NULL, /* EAPI: add_module */
268     NULL, /* EAPI: remove_module */
269     NULL, /* EAPI: rewrite_command */
270     NULL /* EAPI: new_connection */
271     #endif
272 dpavlin 1.1 };
273    

  ViewVC Help
Powered by ViewVC 1.1.26