-const char jcc_rcs[] = "$Id: jcc.c,v 1.88 2002/03/27 14:32:43 david__schmidt Exp $";
+const char jcc_rcs[] = "$Id: jcc.c,v 1.91 2002/04/08 20:35:58 swa Exp $";
/*********************************************************************
*
* File : $Source: /cvsroot/ijbswa/current/jcc.c,v $
*
* Revisions :
* $Log: jcc.c,v $
+ * Revision 1.91 2002/04/08 20:35:58 swa
+ * fixed JB spelling
+ *
+ * Revision 1.90 2002/04/02 14:57:28 oes
+ * Made sending wafers independent of FEATURE_COOKIE_JAR
+ *
+ * Revision 1.89 2002/03/31 17:18:59 jongfoster
+ * Win32 only: Enabling STRICT to fix a VC++ compile warning.
+ *
* Revision 1.88 2002/03/27 14:32:43 david__schmidt
* More compiler warning message maintenance
*
len = read_socket(csp->cfd, buf, sizeof(buf));
if (len <= 0) break; /* error! */
-
- add_to_iob(csp, buf, len);
+
+ /*
+ * If there is no memory left for buffering the
+ * request, there is nothing we can do but hang up
+ */
+ if (add_to_iob(csp, buf, len))
+ {
+ return;
+ }
req = get_header(csp);
enlist(csp->headers, http->cmd);
-#ifdef FEATURE_COOKIE_JAR
/*
- * If we're logging cookies in a cookie jar, and the user has not
- * supplied any wafers, and the user has not told us to suppress the
- * vanilla wafer, then send the vanilla wafer.
+ * If the user has not supplied any wafers, and the user has not
+ * told us to suppress the vanilla wafer, then send the vanilla wafer.
*/
- if ((csp->config->jarfile != NULL)
- && list_is_empty(csp->action->multi[ACTION_MULTI_WAFER])
+ if (list_is_empty(csp->action->multi[ACTION_MULTI_WAFER])
&& ((csp->action->flags & ACTION_VANILLA_WAFER) != 0))
{
enlist(csp->action->multi[ACTION_MULTI_WAFER], VANILLA_WAFER);
}
-#endif /* def FEATURE_COOKIE_JAR */
#ifdef FEATURE_KILL_POPUPS
log_error(LOG_LEVEL_ERROR, "read from client failed: %E");
return;
}
- add_to_iob(csp, buf, len);
+
+ /*
+ * If there is no memory left for buffering the
+ * request, there is nothing we can do but hang up
+ */
+ if (add_to_iob(csp, buf, len))
+ {
+ return;
+ }
continue;
}
{
if (content_filter)
{
- add_to_iob(csp, buf, len);
-
/*
- * If the buffer limit will be reached on the next read,
- * switch to non-filtering mode, i.e. make & write the
- * header, flush the socket and get out of the way.
+ * If there is no memory left for buffering the content, or the buffer limit
+ * has been reached, switch to non-filtering mode, i.e. make & write the
+ * header, flush the iob and buf, and get out of the way.
*/
- if (((size_t)(csp->iob->eod - csp->iob->buf)) + (size_t)BUFFER_SIZE > csp->config->buffer_limit)
+ if (add_to_iob(csp, buf, len))
{
size_t hdrlen;
+ int flushed;
- log_error(LOG_LEVEL_ERROR, "Buffer size limit reached! Flushing and stepping back.");
+ log_error(LOG_LEVEL_ERROR, "Flushing header and buffers. Stepping back from filtering.");
hdr = sed(server_patterns, add_server_headers, csp);
if (hdr == NULL)
{
- /* FIXME Should handle error properly */
- log_error(LOG_LEVEL_FATAL, "Out of memory parsing server header");
+ /*
+ * Memory is too tight to even generate the header.
+ * Send our static "Out-of-memory" page.
+ */
+ log_error(LOG_LEVEL_ERROR, "Out of memory while trying to flush.");
+ rsp = cgi_error_memory();
+
+ if (write_socket(csp->cfd, rsp->head, rsp->head_length)
+ || write_socket(csp->cfd, rsp->body, rsp->content_length))
+ {
+ log_error(LOG_LEVEL_ERROR, "write to: %s failed: %E", http->host);
+ }
+ return;
}
hdrlen = strlen(hdr);
- byte_count += hdrlen;
if (write_socket(csp->cfd, hdr, hdrlen)
- || ((len = flush_socket(csp->cfd, csp)) < 0))
+ || ((flushed = flush_socket(csp->cfd, csp)) < 0)
+ || (write_socket(csp->cfd, buf, len)))
{
- log_error(LOG_LEVEL_CONNECT, "write header to client failed: %E");
+ log_error(LOG_LEVEL_CONNECT, "Flush header and buffers to client failed: %E");
freez(hdr);
return;
}
+ byte_count += hdrlen + flushed + len;
freez(hdr);
- byte_count += len;
-
content_filter = NULL;
server_body = 1;
* parsing an "out of body experience" ?
*/
- /* buffer up the data we just read */
- add_to_iob(csp, buf, len);
+ /*
+ * buffer up the data we just read. If that fails,
+ * there's little we can do but send our static
+ * out-of-memory page.
+ */
+ if (add_to_iob(csp, buf, len))
+ {
+ log_error(LOG_LEVEL_ERROR, "Out of memory while looking for end of server headers.");
+ rsp = cgi_error_memory();
+
+ if (write_socket(csp->cfd, rsp->head, rsp->head_length)
+ || write_socket(csp->cfd, rsp->body, rsp->content_length))
+ {
+ log_error(LOG_LEVEL_ERROR, "write to: %s failed: %E", http->host);
+ }
+ return;
+ }
/* get header lines from the iob */
log_error(LOG_LEVEL_ERROR, "can't fork: %E");
- sprintf(buf , "JunkBuster: can't fork: errno = %d", errno);
+ sprintf(buf , "Privoxy: can't fork: errno = %d", errno);
write_socket(csp->cfd, buf, strlen(buf));
close_socket(csp->cfd);