- - Privoxy can (re)compress buffered content before delivering
- it to the client. Disabled by default as most users wouldn't
- benefit from it.
- - The +fast-redirects{check-decoded-url} action checks URL
- segments separately. If there are other parameters behind
- the redirect URL, this makes it unnecessary to cut them off
- by additionally using a +redirect{} pcrs command.
- Initial patch submitted by Jamie Zawinski in #3429848.
- - When loading action sections, verify that the referenced filters
- exist. Currently missing filters only result in an error message,
- but eventually the severity will be upgraded to fatal.
- - Allow to bind to multiple separate addresses.
- Patch set submitted by Petr Pisar in #3354485.
- - Set socket_error to errno if connecting fails in rfc2553_connect_to()
- Previously rejected direct connections could be incorrectly reported
- as DNS issues if Privoxy was compiled with IPv6 support.
- - Adjust url_code_map[] so spaces are replaced with %20 instead of '+'
- While '+' can be used by client's submitting form data, this is not
- actually what Privoxy is using the lookups for. This is more of a
- cosmetic issue and doesn't fix any known problems.
- - When compiled without FEATURE_FAST_REDIRECTS, do not silently
- ignore +fast-redirect{} directives
- - Added a workaround for GNU libc's strptime() reporting negative
- year values when the parsed year is only specified with two digits.
- On affected systems cookies with such a date would not be turned
- into session cookies by the +session-cookies-only action.
- Reported by Vaeinoe in #3403560
- - Fixed bind failures with certain GNU libc versions if no non-loopback
- IP address has been configured on the system. This is mainly an issue
- if the system is using DHCP and Privoxy is started before the network
- is completely configured.
- Reported by Raphael Marichez in #3349356.
- Additional insight from Petr Pisar.
- - Privoxy log messages now use the ISO 8601 date format %Y-%m-%d.
- It's only slightly longer than the old format, but contains
- the full date including the year and allows sorting by date
- (when grepping in multiple log files) without hassle.
- - In get_last_url(), do not bother trying to decode URLs that do
- not contain at least one '%' sign. It reduces the log noise and
- a number of unnecessary memory allocations.
- - In case of SOCKS5 failures, dump the socks response in the log message.
- - Simplify the signal setup in main()
- - Streamline socks5_connect() slightly
- - In socks5_connect(), require a complete socks response from the server
- Previously Privoxy didn't care how much data the server response
- contained as long as the first two bytes contained the expected
- values. While at it, shrink the buffer size so Privoxy can't read
- more than a whole socks response.
- - In chat(), do not bother to generate a client request in case of
- direct CONNECT requests. It will not be used anyway.
- - Reduce server_last_modified()'s stack size.
- - Shorten get_http_time() by using strftime().
- - Constify the known_http_methods pointers in unknown_method().
- - Constify the time_formats pointers in parse_header_time().
- - Constify the formerly_valid_actions pointers in action_used_to_be_valid().
- - Introduce a GNUMakefile MAN_PAGE variable that defaults to privoxy.1.
- The Debian package uses section 8 for the man page and this
- should simplify the patch.
- - Deduplicate the INADDR_NONE definition for Solaris by moving it to jbsockets.h
- - In block_url(), ditch the obsolete workaround for ancient Netscape versions
- that supposedly couldn't properly deal with status code 403.
- - Remove a useless NULL pointer check in load_trustfile().
- - Remove two useless NULL pointer checks in load_one_re_filterfile().
- - Change url_code_map[] from an array of pointers to an array of arrays
- It removes an unnecessary layer of indirection and on 64bit system reduces
- the size of the binary a bit.
- - Fix various typos. Fixes taken from Debian's 29_typos.dpatch by Roland Rosenfeld.
- - Add a dok-tidy GNUMakefile target to clean up the messy HTML
- generated by the other dok targets.
- - GNUisms in the GNUMakefile have been removed.
- - Change the HTTP version in static responses to 1.1
- - Synced config.sub and config.guess with upstream
- 2011-11-11/386c7218162c145f5f9e1ff7f558a3fbb66c37c5.
- - Add a dedicated function to parse the values of toggles. Reduces duplicated
- code in load_config() and provides better error handling. Invalid or missing
- toggle values are now a fatal error instead of being silently ignored.
- - Terminate HTML lines in static error messages with \n instead of \r\n.
- - Simplify cgi_error_unknown() a bit.
- - In LogPutString(), don't bother looking at pszText when not
- actually logging anything.
- - Change ssplit()'s fourth parameter from int to size_t.
- Fixes a clang complaint.
- - Add a warning that the statistics currently can't be trusted.
- Mention Privoxy-Log-Parser's --statistics option as
- an alternative for the time being.
- - In rfc2553_connect_to(), start setting cgi->error_message on error
- - Change the expected status code returned for http://p.p/die depending
- on whether or not FEATURE_GRACEFUL_TERMINATION is available.
- - In cgi_die(), mark the client connection for closing.
- If the client will fetch the style sheet through another connection
- it gets the main thread out of the accept() state and should thus
- trigger the actual shutdown.
- - Add a proper CGI message for cgi_die().
- - Don't enforce a logical line length limit in read_config_line()
- - Slightly refactor server_last_modified() to remove useless gmtime*() calls
- - In get_content_type(), also recognize '.jpeg' as JPEG extension
- - Add '.png' to the list of recognized file extensions in get_content_type()
- - In block_url(), consistently use the block reason "Request blocked by Privoxy"
- In two places the reason was "Request for blocked URL" which hides the
- fact that the request got blocked by Privoxy and isn't necessarily
- correct as the block may be due to tags.
- - In listen_loop(), reload the configuration files after accepting
- a new connection instead of before.
- Previously the first connection that arrived after a configuration
- change would still be handled with the old configuration.
- - In chat()'s receive-data loop, skip a client socket check if
- the socket will be written to right away anyway. This can
- increase the transfer speed for unfiltered content on fast
- network connections.
- - The socket timeout is used for SOCKS negotiations as well which
- previously couldn't timeout.
- - Don't keep the client connection alive if any configuration file
- changed since the time the connection came in. This is closer to
- Privoxy's behaviour before keep-alive support for client connection
- has been added and also less confusing in general.
- - Treat all Content-Type header values containing the pattern
- 'script' as a sign of text. Reported by pribog in #3134970.
+ - Add a receive-buffer-size directive which can be used to
+ set the size of the previously statically allocated buffer
+ in handle_established_connection().
+ Increasing the buffer size increases Privoxy's memory usage but
+ can lower the number of context switches and thereby reduce the
+ CPU usage and potentially increase the throughput.
+ This is mostly relevant for fast network connections and
+ large downloads that don't require filtering.
+ Sponsored by: Robert Klemme
+ - Add a listen-backlog directive which specifies the backlog
+ value passed to listen().
+ Sponsored by: Robert Klemme
+ - Add an enable-accept-filter directive which allows to
+ toggle accept filter support at run time when compiled
+ with FEATURE_ACCEPT_FILTER support.
+ It makes testing more convenient and now that it's
+ optional we can emit an error message if enabling
+ the accept filter fails.
+ Sponsored by: Robert Klemme
+ - Add a delay-response{} action.
+ This is useful to tar pit JavaScript requests that
+ are endlessly retried in case of blocks. It can also
+ be used to simulate a slow Internet connection.
+ Sponsored by: Robert Klemme
+ - Add a 'trusted-cgi-referrer' directive.
+ It allows to configure another page or site that can be used
+ to reach sensitive CGI resources.
+ Sponsored by: Robert Klemme
+ - Add a --fuzz mode which exposes Privoxy internals to input
+ from files or stdout.
+ Mainly tested with American Fuzzy Lop. For details see:
+ https://www.fabiankeil.de/talks/fuzzing-on-freebsd/
+ This work was partially funded with donations and done
+ as part of the Privoxy month in 2015.
+ - Consistently use the U(ngreedy) flag in the 'img-reorder' filter.
+ - listen_loop(): Reuse a single thread attribute object
+ The object doesn't change and creating a new one for
+ every thread is a waste of (CPU) time.
+ Sponsored by: Robert Klemme
+ - Free csp resources in the thread that belongs to the csp instead
+ of the main thread which has enough on its plate already.
+ Sponsored by: Robert Klemme
+ - Improve 'socket timeout reached' message.
+ Log the timeout that was triggered and downgrade the
+ log level to LOG_LEVEL_CONNECT to reduce the log noise
+ with common debug settings.
+ The timeout isn't necessary the result of an error and
+ usually merely indicates that Privoxy's socket timeout
+ is lower than the relevant timeouts used by client and
+ server.
+ Sponsored by: Robert Klemme
+ - Explicitly taint the server socket in case of CONNECT requests.
+ This doesn't fix any known problems, but makes
+ some log messages less confusing.
+ - Let write_pid_file() terminate if the pid file can't be opened.
+ Logging the issue at info level is unlikely to help.
+ - log_error(): Reduce the mutex-protected area by not using a
+ heap-allocated buffer that is shared between all threads.
+ This increases performance and reduces the latency with
+ verbose debug settings and multiple concurrent connections.
+ Sponsored by: Robert Klemme
+ - Let zalloc() use calloc() if it's available.
+ In some situations using calloc() can be faster than
+ malloc() + memset() and it should never be slower.
+ In the real world the impact of this change is not
+ expected to be noticeable.
+ Sponsored by: Robert Klemme
+ - Never use select() when poll() is available.
+ On most platforms select() is limited by FD_SETSIZE while
+ poll() is not. This was a scaling issue for multi-user setups.
+ Using poll() has no downside other than the usual risk
+ that code modifications may introduce new bugs that have
+ yet to be found and fixed.
+ At least in theory this commit could also reduce the latency
+ when there are lots of connections and select() would use
+ "bit fields in arrays of integers" to store file descriptors.
+ Another side effect is that Privoxy no longer has to stop
+ monitoring the client sockets when pipelined requests are
+ waiting but can't be read yet.
+ This code keeps the select()-based code behind ifdefs for
+ now but hopefully it can be removed soonish to make the
+ code more readable.
+ Sponsored by: Robert Klemme
+ - Add a 'reproducible-tarball-dist' target.
+ It's currently separate from the "tarball-dist" target
+ because it requires a tar implementation with mtree spec
+ support.
+ It's far from being perfect and does not enforce a
+ reproducible mode, but it's better than nothing.
+ - Use arc4random() if it's available.
+ While Privoxy doesn't need high quality pseudo-random numbers
+ there's no reason not to use them when we can and this silences
+ a warning emitted by code checkers that can't tell whether or not
+ the quality matters.
+ - Show the FEATURE_EXTERNAL_FILTERS status on the status page.
+ Better late than never. Previously a couple of tests weren't
+ executed as Privoxy-Regression-Test couldn't detect that the
+ FEATURE_EXTERNAL_FILTERS dependency was satisfied.
+ - Ditch FEATURE_IMAGE_DETECT_MSIE.
+ It's an obsolete workaround we inherited from Junkbuster
+ and was already disabled by default.
+ Users that feel the urge to work around issues with
+ image requests coming from an Internet Explorer version
+ from more than 15 years ago can still do this using tags.
+ - Consistently use strdup_or_die() instead of strdup() in
+ cases where allocation failures aren't expected.
+ Using strdup_or_die() allows to remove a couple of explicit
+ error checks which slightly reduces the size of the binary.
+ - Insert a refresh tag into the /client-tags CGI page when
+ serving it while a client-specific tag is temporarily enabled.
+ This makes it less likely that the user ends up
+ looking at tag state that is out of date.
+ - Use absolute URLs in the client-tag forms.
+ It's more consistent with the rest of the CGI page
+ URLs and makes it more convenient to copy the forms
+ to external pages.
+ - cgi_error_disabled(): Use status code 403 and an appropriate response line
+ - Use a dedicated CGI handler to deal with tag-toggle requests
+ As a result the /client-tags page is now safe to reach without
+ trusted Referer header which makes bookmarking or linking to
+ it more convenient.
+ Finally, refreshing the /client-tags page to show the
+ current state can no longer unintentionally repeat the
+ previous toggle request.
+ - Don't add a "Connection" header for CONNECT requests.
+ Explicitly sending "Connection: close" is not necessary and
+ apparently it causes problems with some forwarding proxies
+ that will close the connection prematurely.
+ Reported by Marc Thomas.
+ - Fix compiler warnings.