---- oh...@cox.net wrote: > Hi, > > I'm not sure if this is the appropriate list, or if I should post on the > regular httpd list... > > I've been trying to work with an Apache module, mod_limitipconn: > > http://dominia.org/djao/limitipconn2.html > > This is with Apache 2.2.8/2.2.11. > > Our use case is slightly different that the original one for this module. > The original code is designed to limit the number of connections from any > given IP address, whereas in my case, we want to limit the total number of > connections to the entire Apache server instance. > > To do that, I commented out one line (an 'if'), as shown below: > > /* Count up the number of connections we are handling right now from > * this IP address */ > /* This is modified to not do strcmp(address, ws_record->client check, in > order > to count ALL connections to this server. */ > for (i = 0; i < server_limit; ++i) { > for (j = 0; j < thread_limit; ++j) { > ws_record = ap_get_scoreboard_worker(i, j); > switch (ws_record->status) { > case SERVER_BUSY_READ: > case SERVER_BUSY_WRITE: > case SERVER_BUSY_KEEPALIVE: > case SERVER_BUSY_LOG: > case SERVER_BUSY_DNS: > case SERVER_CLOSING: > case SERVER_GRACEFUL: > /* > if (strcmp(address, ws_record->client) == 0) > */ > ip_count++; > break; > default: > break; > } > } > } > > and, after I rebuilt the module, it seems to work ok. > > Now, I'm trying to get the module's directive "NoIPLimit" to work. > > According to the README, plus reading the code, the way that this is suppose > to work is that if you specify a MIME type string (substring, actually), the > module won't "count" requests that have any of the MIME types in the > directive. > > I have the Apache LogLevel set to debug, and it looks like the "content_type" > that the module is retrieving from ALL requests is "text/plain", and I have > confirmed that the actual MIME types are not "text/plain" (I see things like > "image/gif", "text/css", etc.), so the "NoIPLimit" directive doesn't work. > > From reading the code, I think that the "content_type" is set in this snippet: > > /* Only check the MIME-type if we have MIME-type stuff in our config. > The extra subreq can be quite expensive. */ > if(cfg->no_limit->nelts > 0 || cfg->excl_limit->nelts > 0) { > /* Look up the Content-type of this request. We need a subrequest > * here since this module might be called before the URI has been > * translated into a MIME type. */ > content_type = ap_sub_req_lookup_uri(r->uri, r, NULL)->content_type; > > /* If there's no Content-type, use the default. */ > if (!content_type) { > content_type = ap_default_type(r); > } > > ap_log_rerror(APLOG_MARK, APLOG_DEBUG, 0, r, > "mod_limitipconn: uri: %s Content-Type: %s", > r->uri, content_type); > > /* Cycle through the exempt list; if our content_type is exempt, > * return OK */ > for (i = 0; i < cfg->no_limit->nelts; i++) { > if ((ap_strcasecmp_match(content_type, nolim[i]) == 0) > || (strncmp(nolim[i], content_type, strlen(nolim[i])) == 0)) > { > ap_log_rerror(APLOG_MARK, APLOG_DEBUG, 0, r, > "mod_limitipconn: OK: %s exempt", content_type); > return DECLINED; > } > } > > and, in particular: > > content_type = ap_sub_req_lookup_uri(r->uri, r, NULL)->content_type; > > /* If there's no Content-type, use the default. */ > if (!content_type) { > content_type = ap_default_type(r); > } > > I'm not that familiar with Apache module development, but reading the docs, > it *seems* like the above *should* work. > > I'm assuming you all on this list *are* familiar with module development, so > I was wondering if you might be able to tell me what, if anything, is wrong > with that code (i.e., why is "content_type" not being set with the actual > content type? > > Thanks in advance!! > > Jim
Hi, BTW, here's an example of the Apache debug output for mod_limitipconn that illustrates what I'm seeing: [Sun Nov 15 02:21:09 2009] [debug] mod_limitipconn.c(143): [client 192.168.xx.yy] mod_limitipconn: uri: /anewwsclient/css/body.css Content-Type: text/plain, referer: http://foo.host.com/anewwsclient As you can see, the URI is for a .css, but the Content-Type comes back as "text/plain, referer: http://foo.host.com/anewwsclient", then, since the mod_limitipconn code checks for the MIME types in the NoIPLimit directive, (e.g., image/* text/css/*), it fails to detect this as a MIME type that it should ignore. Shouldn't the Content-Type be something like "text/css, referer: http://foo.host.com/anewwsclient"? Jim