| tag name | v0.61.0 (201518e04490d545494b2a6c30103456eb7a460f) |
| tag date | 2026-02-09 12:39:32 +0700 |
| tagged by | Shulhan <ms@kilabit.info> |
| tagged object | commit c516c2c44d... |
| download | pakakeh.go-0.61.0.tar.xz |
|---|
Release pakakeh.go v0.61.0 (2026-02-08)
=== all
š§ all: convert license and copyright to use SPDX identifiers
With the help of spdxconv tool, we able to bulk update all files license
and copyright format to comply with SPDX formats.
=== cmd/httpdfs
š¼ cmd/httpdfs: implement systemd socket activation
The httpdfs program now can be activated using systemd.socket(5).
=== lib/dns
š¼ lib/dns: use separate ServeMux for handling DoH
Using the [http.DefaultServeMux] will cause panic when the server
restarted manually using Stop-Start flow.
š¼ lib/dns: skip caching empty answer only for query type A
Previously, we did not store response with empty RR answer for all
record types. Meanwhile, some domains still does not have AAAA(28) and
HTTPS(65) records set, but browser will requesting them. So, to minimize
traffic for those query we skip caching only for query type A and cache
the rest of types.
š¼ lib/dns: remove DebugLevelDNS
The DebugLevelDNS log the error on DNS level, for example empty answer,
error on name, class not implemented, refused; which is now on by
default.
š± lib/dns: add option to set hook on server when receiving answer
The hook function, OnAnswerReceived, will be triggered when server
receive valid answer but before its put to caches.
š± lib/dns: add method to set TTL on Message
The SetTTL method set all RRs answer time to live.
š¼ lib/dns: print the answer TTL in DebugLevelCache
The log level cache changed to the following format,
... {MSG_ID QNAME TYPE TTL} ...
where MSG_ID is the message ID, QNAME is the question name, TYPE is the
type of question, and TTL is the time-to-live of the answer.
š¼ lib/dns: simplify log message for DebugLevelCache
For each logged request, there should be one line of response logged,
success or fail.
This changes remove redundant log "^" (request forwarded) and "~"
(answer is expired). The final log would be only "+" (new answer
cached), or "#" (answer updated), or "!" (error).
š¼ lib/dns: increase the client default timeout from 6 to 60 seconds
The 6 seconds timeout will works only on fast, stable connection.
On some environment with bad network connection, it will cause I/O
timeout during recv and this affect the whole internet connections, like
browsing. Since the browser wait for domain to be resolved but it does
not get the response, it send another query. The next query also got
timeout again.
Increasing to 10-30 seconds also does not help on that environment.
After some tests, 60 seconds is the lower timeout limit that reduce the
I/O timeout.
It is better that we receive the response and store it to caches, so the
next query can be handled quickly, rather than timeout and retrying with
the same error.
This method accept second paramter "format", default to
'%h,%at,%an,%ae,%sā which print short hash, author commit timestamp,
author name, author email, and subject; respectively separated by comma.
=== lib/git
š± lib/git: expose the API for IgnorePattern
The IgnorePattern is not exclusive to git only. Some program, like
REUSE, use the same pattern in the REUSE.toml path configuration.
š± lib/git: add method LogFollow
The LogFollow method return history of single file path, following
rename.
š± lib/git: add Git type with method IsIgnored
The Git type is for working with single git repository.
The [Git.IsIgnored] method is to check if the path is ignored by git.
This is processed by matching it with all of the pattern in the
".gitignore" file from the path directory and its parent until the root
of Git repository.
The Git type implement Equaler interface. The Equaler interface provide
the method Equal that when implemented can be used to compare two
instances of struct.
š± lib/git: implement Gitignore
Gitignore is a type that represent ".gitignore" file.
There are two ways to populate Gitignore, by using [LoadGitignore]
function, or by using [Gitignore.Parse] method.
After the Gitignore created, one can check if a path is ignored by using
[Gitignore.IsIgnored] method, relative to the Gitignore directory.
=== lib/http
šŖµ lib/http: change HandleFS redirect status code to 301
According to MDN Redirections in HTTP the HTTP status 302 Found use case
is for "Web page (that) is temporarily unavailable for unforeseen
reasons.".
This probably to re-route the page until the original page is fixed.
While HTTP status 301 is for "Reorganization of a website.".
Since the redirection in HandleFS only happen when user access directory
without slash, we should make it permanent.
š¼ lib/http: set HandleFS to always end with slash "/"
Previously, if request to directory does not end with "/", the HTTP
server will return the index.html of that directory. This cause relative
link inside the index.html broken when visited from browser.
This changes make the request to directory always end with "/" by
redirecting the request with status 303 Found.
š± lib/http: add field Listener to ServerOptions
The field Listener allow user to pass [net.Listener] for accepting new
connection using [http.Serve] or [http.ServeTLS].
šŖµ lib/http: add second return value, statusCode, to FSHandler
Non-zero status code indicates that the function already response to the
request, and the server will return immediately.
Zero status code indicates that the function did not process the
request, it is up to server to process the returned node out.
=== lib/ini
š¼ lib/ini: improve error message when parsing variable name
Display the invalid character in the error message with quote, so space
can detected. Also, export the error variable so external caller can
detect it using the variable.
=== lib/os
š± lib/os: add function IsBinaryStream
The IsBinaryStream return true if the content has more than 75%
non-printable characters, excluding spaces.
While at it, replace the body of IsBinary with it and update the test
cases to use the internal files.
=== lib/systemd
š± lib/systemd: new package for socket-based activation
The lib/systemd package implement function Listeners that return list of
file descriptor as [net.Listener], that enable program to run with
systemd.socket(5) based activation.
=== lib/test
š¼ lib/test: ignore line prefixed with "//"
The first line in test data file may contains line prefixed with "//" as
comment. The use case is for license and copyright lines.
š± lib/test: implement method ExtractInput on Data
Given the path to directory destDir, create all of the [test.Data.Input]
with key as its file name.
If the input name contains "/", the path before the base name will be
created along with its parent as long as it is under the destDir.
For example, given input name "a/b/c.txt", it will create path "a/b/"
inside destDir first, followed by file "c.txt" inside that path.
š¼ lib/test: export the constant for default data file name suffix
Also, fix typo on the LoadDataDir regarding suffix by replacing it with
the exported constant.
-----BEGIN PGP SIGNATURE-----
iHUEABYKAB0WIQSyS35x1RIQ2SkuGz5KU2C1AMnE8AUCaYlzFgAKCRBKU2C1AMnE
8CjNAP9yi+98/zoz/ULwtupVhMrgYOgCBKwv9wT7PhBIMbLBKQD+JHRamT9wN0+y
UkGrDfLtHQROOK7/5xvBEuvjdMn5tg8=
=AlpC
-----END PGP SIGNATURE-----
