From d8803b1ad013f1e0c32711f27ff870fac8edd9d5 Mon Sep 17 00:00:00 2001 From: Your Name Date: Tue, 19 Aug 2025 08:00:40 -0400 Subject: [PATCH] Start upload functionality --- IMPLEMENTATION.md | 34 +- Makefile | 4 +- build/ginxsom-fcgi | Bin 17048 -> 152816 bytes build/main.o | Bin 13888 -> 24168 bytes config/fastcgi_params | 24 + config/local-nginx.conf | 50 +- config/mime.types | 95 +++ fastcgi_params | 24 + logs/access.log | 6 + logs/error.log | 1492 +++++++++++++++++++++++++++++++++++++++ logs/nginx.pid | 2 +- mime.types | 95 +++ nostr_core_lib | 2 +- put_test.sh | 249 +++++++ src/ginxsom.h | 84 +++ src/main.c | 267 +++++++ 16 files changed, 2386 insertions(+), 42 deletions(-) create mode 100644 config/fastcgi_params create mode 100644 config/mime.types create mode 100644 fastcgi_params create mode 100644 mime.types create mode 100755 put_test.sh create mode 100644 src/ginxsom.h diff --git a/IMPLEMENTATION.md b/IMPLEMENTATION.md index 652b55a..52a76f3 100644 --- a/IMPLEMENTATION.md +++ b/IMPLEMENTATION.md @@ -36,6 +36,8 @@ This document outlines the implementation plan for ginxsom, a FastCGI-based Blos - [x] Handle 404s gracefully when blob doesn't exist - [x] Configure FastCGI pass-through for HEAD and non-GET requests +**Future Enhancement Note**: Consider implementing nginx Lua extension for true Blossom compliance with dynamic file discovery. The current approach uses explicit extension lists in `try_files`, which works well for common extensions but may not serve files with unusual extensions. Lua module would allow runtime directory scanning for hash-matching files regardless of extension. + ### 1.4 Basic HEAD Endpoint - [x] Implement FastCGI handler for `HEAD /` - [x] Query database for blob metadata (single source of truth) @@ -58,12 +60,32 @@ This document outlines the implementation plan for ginxsom, a FastCGI-based Blos ### 2.1 Nostr Authentication Setup - [ ] Integrate nostr_core_lib submodule -- [ ] Implement nostr event validation - - [ ] Verify event signature (schnorr) - - [ ] Validate event structure (kind 24242) - - [ ] Check required fields (t, expiration, x tags) - - [ ] Implement expiration checking -- [ ] Create authentication middleware + - [ ] Update Makefile to include nostr_core_lib paths and static library + - [ ] Build libnostr_core_x64.a using provided build.sh script + - [ ] Add system dependencies: -lsecp256k1 -lssl -lcrypto -lcurl -lz -ldl -lpthread -lm + +- [ ] Implement authentication functions in main.c (BUD-02 section): + - [ ] `parse_authorization_header()` - Extract JSON from "Nostr base64(event)" header + - [ ] `validate_blossom_event()` - Validate Blossom-specific requirements (kind 24242, content hash, method, expiration) + - [ ] `authenticate_request()` - Main orchestrator function + +- [ ] Leverage existing nostr_core_lib functions: + - [ ] Use `nostr_validate_event()` for structure + signature validation (from nip001.h) + - [ ] Use standardized error codes from nostr_common.h (NOSTR_SUCCESS, NOSTR_ERROR_EVENT_INVALID_SIGNATURE, etc.) + - [ ] Use `nostr_strerror()` for error message translation + +**Function Specifications:** +```c +// Custom functions to implement: +int parse_authorization_header(const char* auth_header, char* event_json, size_t json_size); +int validate_blossom_event(struct cJSON* event, const char* expected_hash, const char* method); +int authenticate_request(const char* auth_header, const char* method, const char* file_hash); + +// Existing nostr_core_lib functions to use directly: +// - nostr_validate_event(cJSON* event) - handles structure + signature validation +// - nostr_validate_event_structure(cJSON* event) - if separate validation needed +// - nostr_verify_event_signature(cJSON* event) - if separate signature check needed +``` ### 2.2 Upload Endpoint Implementation - [ ] Implement `PUT /upload` endpoint diff --git a/Makefile b/Makefile index be51725..002cebf 100644 --- a/Makefile +++ b/Makefile @@ -1,8 +1,8 @@ # Ginxsom Blossom Server Makefile CC = gcc -CFLAGS = -Wall -Wextra -std=c99 -O2 -LIBS = -lfcgi -lsqlite3 +CFLAGS = -Wall -Wextra -std=c99 -O2 -Inostr_core_lib/nostr_core -Inostr_core_lib/cjson +LIBS = -lfcgi -lsqlite3 nostr_core_lib/libnostr_core_x64.a -lz -ldl -lpthread -lm -L/usr/local/lib -lsecp256k1 -lssl -lcrypto -lcurl SRCDIR = src BUILDDIR = build TARGET = $(BUILDDIR)/ginxsom-fcgi diff --git a/build/ginxsom-fcgi b/build/ginxsom-fcgi index 5b909d3adf21b9b44bba1350b7d50a021d1f038d..045670f2bda2084ee1115fc65fff987dcaaefe4b 100755 GIT binary patch literal 152816 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 Gwf_VWmgxHc diff --git a/build/main.o b/build/main.o index 986df6d79b6aca0d4c15e430854f45b01f01ccea..60d001fbe6a3997bb42e34b646eda91d1e0449db 100644 GIT binary patch literal 24168 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 Be5(Ke delta 2624 zcmZ`*ZA@EL7{0dyIw~y#mAg(TMTQ|r2OUyYzFWQuD+~q&Mq8j`-KJS5ab+$>Hb@@O{s{#~f;S6P`Zjd7ks0 zbM8m!-LK{Nk;y`xwDa?#Dg9jCmJ3O9-*3y&C3X0`UeH@?Io;7vbnIBAwY=1B?RYh6 zZH0+i8NcS4s3FxJ*UUfICj(5yB5P}Fp3_%1+vEPAE8q&c23?XU3&aI_&K*VZQ;q<8q>V7C(xB*frrW4p1XGfRd4LE=YKtpLEKsj53G+( zUfkC*Z4T>}3|aXFTW1ZXT@9vEm#NTgvbs%M-KH&W(`L_8U?0et8_n-b34NHPPT+V} zCYB=UbzD(D&ue;Cg8sgy&nD>8n!X5mMT+@If;+3ZWzbcm1iBL3FEsc01pO;bk0t2e zpq?o)lWo?tN!{~JltA`BleEmq@0_f0l7YQg#==PnCpDaSIq`9_pOfR9oa6*FlKm+X z+SL|qH`{ScHP4faoZQq%_7W1BQlG3wS8$h9_jvN5M(lrSNvmE>45=TI5f{spG!eC1 zT8B*dxI~dHgm9r`>)d47J95QNX@|GLQO58k!irLccBbrN=wMjEu$-ZD?gK}soEHhb zd{k;~XlWgCjf{jxqtc;pG<@{9bS(PXNMsb3h8@mYc@IRKC5SUlMec;l&KBgWOtDoe zau+mJk~>yeV%~#O{=xTw>W+3AdN%jM0?XXTd^aRlQNFxteSWugO3L@ZTUCnegQSL6Z#b6 zJ))u&`@vR2$zY9Q-iKq}jUFT_$_&5+x_)HbJtMgLU;*6$!Tm&V{ct~_^G||106Dd^ zdV8%R2Ox}m5T*^X_Xm`l!x@G*7_Kt3HPba|YVHP4Pnx*_XY;F{N$s%cLN-FAM=>`c zf#$D<|MZ3Z01KmT&xZ6t>7P*ID72OtO+&x7WmO9twQ|ulbarZp) zRQIr;PYe11nD8l~R>A#JaK$(6ilB#t{8d30&-I(8)2Z8_y;nIUc6%haWytxS`FArr zk)Rv2cZs^~7W53^9TWQ(3wiBMIoKD5Q!vC!S-(M}7WlJIF?Vd>`XH}g@dY+;M})QL zUoJo7D;wlb3i(!u^eIO1Nbj0FD)d_xg>OK7k2R323;0~ym)nf5c6=c z|Mj^y_od0YQ+hZz;4n<)Vr#6!Mz}uU&|T5vkA^H5%};`C|8`wm4{m?0A+A?L^GR^d z?=ZZPrVg*^;5rWL)72sV8ZiVMhQEu|;loYP7I36yWT?Yp2<1Nw9|gASYBK&?V;P6_ z8K4W+8iuu8p$u(7N9x^Db=nDt1uLFCtG%Vaq^c^d*a1ty7Y)PO_j&OqFbq0UhwW-$ KhOL(EPx}`ZtKP-{ diff --git a/config/fastcgi_params b/config/fastcgi_params new file mode 100644 index 0000000..765b6f0 --- /dev/null +++ b/config/fastcgi_params @@ -0,0 +1,24 @@ +fastcgi_param QUERY_STRING $query_string; +fastcgi_param REQUEST_METHOD $request_method; +fastcgi_param CONTENT_TYPE $content_type; +fastcgi_param CONTENT_LENGTH $content_length; + +fastcgi_param SCRIPT_NAME $fastcgi_script_name; +fastcgi_param REQUEST_URI $request_uri; +fastcgi_param DOCUMENT_URI $document_uri; +fastcgi_param DOCUMENT_ROOT $document_root; +fastcgi_param SERVER_PROTOCOL $server_protocol; +fastcgi_param REQUEST_SCHEME $scheme; +fastcgi_param HTTPS $https if_not_empty; + +fastcgi_param GATEWAY_INTERFACE CGI/1.1; +fastcgi_param SERVER_SOFTWARE nginx/$nginx_version; + +fastcgi_param REMOTE_ADDR $remote_addr; +fastcgi_param REMOTE_PORT $remote_port; +fastcgi_param SERVER_ADDR $server_addr; +fastcgi_param SERVER_PORT $server_port; +fastcgi_param SERVER_NAME $server_name; + +# PHP only, required if PHP was built with --enable-force-cgi-redirect +fastcgi_param REDIRECT_STATUS 200; diff --git a/config/local-nginx.conf b/config/local-nginx.conf index c73d166..bf00bcb 100644 --- a/config/local-nginx.conf +++ b/config/local-nginx.conf @@ -18,8 +18,8 @@ http { keepalive_timeout 65; types_hash_max_size 2048; - # MIME types - include /etc/nginx/mime.types; + # MIME types (local) + include mime.types; default_type application/octet-stream; # Logging (relative to prefix directory) @@ -58,9 +58,8 @@ http { } # GET requests served directly with explicit file extensions - # try_files /$1 =404; - # try_files /$1.webp =404; - try_files /$1.pdf /$1.jpg /$1.jpeg /$1.png /$1.webp /$1.gif /$1.mp4 /$1.mp3 =404; + # Potentially in the future look at a LUA extension + try_files /$1.jpg /$1.jpeg /$1.png /$1.webp /$1.gif /$1.pdf /$1.mp4 /$1.mp3 /$1.txt /$1.md=404; # Set appropriate headers for blobs add_header Cache-Control "public, max-age=31536000, immutable"; @@ -68,33 +67,7 @@ http { add_header X-Frame-Options DENY; add_header X-XSS-Protection "1; mode=block"; } - - # Commented out problematic regex for reference - # location ~ "^/([a-f0-9]{64}).*$" { - # limit_except HEAD GET { - # deny all; - # } - # - # # Debug headers to see what nginx is capturing - # add_header X-Debug-Hash "$1" always; - # add_header X-Debug-TryFiles "$1*" always; - # add_header X-Debug-URI "$uri" always; - # add_header X-Debug-Root "$document_root" always; - # - # # Route HEAD requests to FastCGI via rewrite - # if ($request_method = HEAD) { - # rewrite ^/(.*)$ /fcgi-head/$1 last; - # } - # - # # GET requests served directly with hash-only lookup - # try_files $1* =404; - # - # # Set appropriate headers for blobs - # add_header Cache-Control "public, max-age=31536000, immutable"; - # add_header X-Content-Type-Options nosniff; - # add_header X-Frame-Options DENY; - # add_header X-XSS-Protection "1; mode=block"; - # } + # FastCGI handler for HEAD requests location ~ "^/fcgi-head/([a-f0-9]{64}).*$" { @@ -116,6 +89,19 @@ http { } + # Upload endpoint - requires authentication + location /upload { + # Pass to FastCGI application for processing + include fastcgi_params; + fastcgi_param SCRIPT_FILENAME $document_root/ginxsom.fcgi; + fastcgi_pass fastcgi_backend; + + # Only allow PUT method for uploads + if ($request_method !~ ^(PUT)$ ) { + return 405; + } + } + # Health check endpoint location /health { access_log off; diff --git a/config/mime.types b/config/mime.types new file mode 100644 index 0000000..d721056 --- /dev/null +++ b/config/mime.types @@ -0,0 +1,95 @@ +types { + text/html html htm shtml; + text/css css; + text/xml xml; + image/gif gif; + image/jpeg jpeg jpg; + image/png png; + image/webp webp; + application/javascript js; + application/atom+xml atom; + application/rss+xml rss; + + text/mathml mml; + text/plain txt; + text/vnd.sun.j2me.app-descriptor jad; + text/vnd.wap.wml wml; + text/x-component htc; + + image/avif avif; + image/svg+xml svg svgz; + image/tiff tif tiff; + image/vnd.wap.wbmp wbmp; + image/x-icon ico; + image/x-jng jng; + image/x-ms-bmp bmp; + + font/woff woff; + font/woff2 woff2; + + application/java-archive jar war ear; + application/json json; + application/mac-binhex40 hqx; + application/msword doc; + application/pdf pdf; + application/postscript ps eps ai; + application/rtf rtf; + application/vnd.apple.mpegurl m3u8; + application/vnd.google-earth.kml+xml kml; + application/vnd.google-earth.kmz kmz; + application/vnd.ms-excel xls; + application/vnd.ms-fontobject eot; + application/vnd.ms-powerpoint ppt; + application/vnd.oasis.opendocument.graphics odg; + application/vnd.oasis.opendocument.presentation odp; + application/vnd.oasis.opendocument.spreadsheet ods; + application/vnd.oasis.opendocument.text odt; + application/vnd.openxmlformats-officedocument.presentationml.presentation pptx; + application/vnd.openxmlformats-officedocument.spreadsheetml.sheet xlsx; + application/vnd.openxmlformats-officedocument.wordprocessingml.document docx; + application/vnd.wap.wmlc wmlc; + application/wasm wasm; + application/x-7z-compressed 7z; + application/x-cocoa cco; + application/x-java-archive-diff jardiff; + application/x-java-jnlp-file jnlp; + application/x-makeself run; + application/x-perl pl pm; + application/x-pilot prc pdb; + application/x-rar-compressed rar; + application/x-redhat-package-manager rpm; + application/x-sea sea; + application/x-shockwave-flash swf; + application/x-stuffit sit; + application/x-tcl tcl tk; + application/x-x509-ca-cert der pem crt; + application/x-xpinstall xpi; + application/xhtml+xml xhtml; + application/xspf+xml xspf; + application/zip zip; + + application/octet-stream bin exe dll; + application/octet-stream deb; + application/octet-stream dmg; + application/octet-stream iso img; + application/octet-stream msi msp msm; + + audio/midi mid midi kar; + audio/mpeg mp3; + audio/ogg ogg; + audio/x-m4a m4a; + audio/x-realaudio ra; + + video/3gpp 3gpp 3gp; + video/mp2t ts; + video/mp4 mp4; + video/mpeg mpeg mpg; + video/quicktime mov; + video/webm webm; + video/x-flv flv; + video/x-m4v m4v; + video/x-mng mng; + video/x-ms-asf asx asf; + video/x-ms-wmv wmv; + video/x-msvideo avi; +} diff --git a/fastcgi_params b/fastcgi_params new file mode 100644 index 0000000..765b6f0 --- /dev/null +++ b/fastcgi_params @@ -0,0 +1,24 @@ +fastcgi_param QUERY_STRING $query_string; +fastcgi_param REQUEST_METHOD $request_method; +fastcgi_param CONTENT_TYPE $content_type; +fastcgi_param CONTENT_LENGTH $content_length; + +fastcgi_param SCRIPT_NAME $fastcgi_script_name; +fastcgi_param REQUEST_URI $request_uri; +fastcgi_param DOCUMENT_URI $document_uri; +fastcgi_param DOCUMENT_ROOT $document_root; +fastcgi_param SERVER_PROTOCOL $server_protocol; +fastcgi_param REQUEST_SCHEME $scheme; +fastcgi_param HTTPS $https if_not_empty; + +fastcgi_param GATEWAY_INTERFACE CGI/1.1; +fastcgi_param SERVER_SOFTWARE nginx/$nginx_version; + +fastcgi_param REMOTE_ADDR $remote_addr; +fastcgi_param REMOTE_PORT $remote_port; +fastcgi_param SERVER_ADDR $server_addr; +fastcgi_param SERVER_PORT $server_port; +fastcgi_param SERVER_NAME $server_name; + +# PHP only, required if PHP was built with --enable-force-cgi-redirect +fastcgi_param REDIRECT_STATUS 200; diff --git a/logs/access.log b/logs/access.log index 1e97938..2d74400 100644 --- a/logs/access.log +++ b/logs/access.log @@ -105,3 +105,9 @@ 127.0.0.1 - - [18/Aug/2025:22:40:32 -0400] "GET /708d0e8226ec17b0585417c0ec9352ce5f52c3820c904b7066fe20b00f2d9cfe.webp HTTP/1.1" 404 564 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/138.0.0.0 Safari/537.36" 127.0.0.1 - - [18/Aug/2025:23:00:31 -0400] "GET /708d0e8226ec17b0585417c0ec9352ce5f52c3820c904b7066fe20b00f2d9cfe.webp HTTP/1.1" 200 203886 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/138.0.0.0 Safari/537.36" 127.0.0.1 - - [18/Aug/2025:23:01:14 -0400] "GET /708d0e8226ec17b0585417c0ec9352ce5f52c3820c904b7066fe20b00f2d9cfe.webp HTTP/1.1" 304 0 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/138.0.0.0 Safari/537.36" +127.0.0.1 - - [19/Aug/2025:06:00:05 -0400] "GET /708d0e8226ec17b0585417c0ec9352ce5f52c3820c904b7066fe20b00f2d9cfe.webp HTTP/1.1" 304 0 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/138.0.0.0 Safari/537.36" +127.0.0.1 - - [19/Aug/2025:07:49:21 -0400] "PUT /upload HTTP/1.1" 405 166 "-" "curl/8.15.0" +127.0.0.1 - - [19/Aug/2025:07:49:21 -0400] "GET /21fc30dac4c95ad4b26eb78d97cb31a0cb4bc69f30c0d4195f7685ac13b22ce6 HTTP/1.1" 404 162 "-" "curl/8.15.0" +127.0.0.1 - - [19/Aug/2025:07:51:54 -0400] "GET /708d0e8226ec17b0585417c0ec9352ce5f52c3820c904b7066fe20b00f2d9cfe.webp HTTP/1.1" 304 0 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/138.0.0.0 Safari/537.36" +127.0.0.1 - - [19/Aug/2025:07:57:54 -0400] "PUT /upload HTTP/1.1" 501 38 "-" "curl/8.15.0" +127.0.0.1 - - [19/Aug/2025:07:57:54 -0400] "GET /ae9f59c7ac386b7fe6343d669fc27f37d7b66256824be655d29a256908f154e9 HTTP/1.1" 404 162 "-" "curl/8.15.0" diff --git a/logs/error.log b/logs/error.log index 5253a5e..396b6c4 100644 --- a/logs/error.log +++ b/logs/error.log @@ -5719,3 +5719,1495 @@ X-XSS-Protection: 1; mode=block 2025/08/18 23:01:14 [debug] 296458#296458: timer delta: 0 2025/08/18 23:01:14 [debug] 296458#296458: worker cycle 2025/08/18 23:01:14 [debug] 296458#296458: epoll timer: 65000 +2025/08/18 23:02:19 [debug] 296458#296458: timer delta: 65068 +2025/08/18 23:02:19 [debug] 296458#296458: *1 event timer del: 6: 139272836 +2025/08/18 23:02:19 [debug] 296458#296458: *1 http keepalive handler +2025/08/18 23:02:19 [debug] 296458#296458: *1 close http connection: 6 +2025/08/18 23:02:19 [debug] 296458#296458: *1 reusable connection: 0 +2025/08/18 23:02:19 [debug] 296458#296458: *1 free: 0000000000000000 +2025/08/18 23:02:19 [debug] 296458#296458: *1 free: 00006261FA936840, unused: 136 +2025/08/18 23:02:19 [debug] 296458#296458: worker cycle +2025/08/18 23:02:19 [debug] 296458#296458: epoll timer: -1 +2025/08/19 06:00:03 [notice] 296457#296457: signal 15 (SIGTERM) received from 331227, exiting +2025/08/19 06:00:03 [debug] 296457#296457: wake up, sigio 0 +2025/08/19 06:00:03 [debug] 296457#296457: child: 0 296458 e:0 t:0 d:0 r:1 j:0 +2025/08/19 06:00:03 [debug] 296457#296457: termination cycle: 50 +2025/08/19 06:00:03 [debug] 296457#296457: sigsuspend +2025/08/19 06:00:03 [debug] 296458#296458: epoll: fd:7 ev:0001 d:0000762A6F3C30F8 +2025/08/19 06:00:03 [debug] 296458#296458: channel handler +2025/08/19 06:00:03 [debug] 296458#296458: channel: 32 +2025/08/19 06:00:03 [debug] 296458#296458: channel command: 4 +2025/08/19 06:00:03 [debug] 296458#296458: channel: -2 +2025/08/19 06:00:03 [debug] 296458#296458: timer delta: 25064175 +2025/08/19 06:00:03 [notice] 296458#296458: exiting +2025/08/19 06:00:03 [debug] 296458#296458: flush files +2025/08/19 06:00:03 [debug] 296458#296458: run cleanup: 00006261FA972428 +2025/08/19 06:00:03 [debug] 296458#296458: run cleanup: 00006261FA969F68 +2025/08/19 06:00:03 [debug] 296458#296458: cleanup resolver +2025/08/19 06:00:03 [debug] 296458#296458: free: 00006261FA970A20 +2025/08/19 06:00:03 [debug] 296458#296458: free: 00006261FA96B900 +2025/08/19 06:00:03 [debug] 296458#296458: free: 00006261FA9568A0 +2025/08/19 06:00:03 [debug] 296458#296458: free: 00006261FA950870 +2025/08/19 06:00:03 [debug] 296458#296458: free: 00006261FA94F7B0 +2025/08/19 06:00:03 [debug] 296458#296458: free: 00006261FA94E6F0 +2025/08/19 06:00:03 [debug] 296458#296458: free: 00006261FA94D630 +2025/08/19 06:00:03 [debug] 296458#296458: free: 00006261FA945160 +2025/08/19 06:00:03 [debug] 296458#296458: free: 00006261FA93C130, unused: 0 +2025/08/19 06:00:03 [debug] 296458#296458: free: 00006261FA9463E0, unused: 0 +2025/08/19 06:00:03 [debug] 296458#296458: free: 00006261FA951880, unused: 0 +2025/08/19 06:00:03 [debug] 296458#296458: free: 00006261FA9578B0, unused: 0 +2025/08/19 06:00:03 [debug] 296458#296458: free: 00006261FA95B8C0, unused: 0 +2025/08/19 06:00:03 [debug] 296458#296458: free: 00006261FA95F8D0, unused: 0 +2025/08/19 06:00:03 [debug] 296458#296458: free: 00006261FA9638E0, unused: 0 +2025/08/19 06:00:03 [debug] 296458#296458: free: 00006261FA9678F0, unused: 0 +2025/08/19 06:00:03 [debug] 296458#296458: free: 00006261FA96CA10, unused: 4 +2025/08/19 06:00:03 [debug] 296458#296458: free: 00006261FA9722F0, unused: 16048 +2025/08/19 06:00:03 [notice] 296458#296458: exit +2025/08/19 06:00:03 [notice] 296457#296457: signal 17 (SIGCHLD) received from 296458 +2025/08/19 06:00:03 [notice] 296457#296457: worker process 296458 exited with code 0 +2025/08/19 06:00:03 [debug] 296457#296457: shmtx forced unlock +2025/08/19 06:00:03 [debug] 296457#296457: wake up, sigio 3 +2025/08/19 06:00:03 [debug] 296457#296457: reap children +2025/08/19 06:00:03 [debug] 296457#296457: child: 0 296458 e:1 t:1 d:0 r:1 j:0 +2025/08/19 06:00:03 [notice] 296457#296457: exit +2025/08/19 06:00:03 [debug] 296457#296457: close listening 0.0.0.0:9001 #5 +2025/08/19 06:00:03 [debug] 296457#296457: run cleanup: 00006261FA969F68 +2025/08/19 06:00:03 [debug] 296457#296457: cleanup resolver +2025/08/19 06:00:03 [debug] 296457#296457: free: 00006261FA970A20 +2025/08/19 06:00:03 [debug] 296457#296457: free: 00006261FA96B900 +2025/08/19 06:00:03 [debug] 296457#296457: free: 00006261FA9568A0 +2025/08/19 06:00:03 [debug] 296457#296457: free: 00006261FA950870 +2025/08/19 06:00:03 [debug] 296457#296457: free: 00006261FA94F7B0 +2025/08/19 06:00:03 [debug] 296457#296457: free: 00006261FA94E6F0 +2025/08/19 06:00:03 [debug] 296457#296457: free: 00006261FA94D630 +2025/08/19 06:00:03 [debug] 296457#296457: free: 00006261FA945160 +2025/08/19 06:00:03 [debug] 296457#296457: free: 00006261FA93C130, unused: 0 +2025/08/19 06:00:03 [debug] 296457#296457: free: 00006261FA9463E0, unused: 0 +2025/08/19 06:00:03 [debug] 296457#296457: free: 00006261FA951880, unused: 0 +2025/08/19 06:00:03 [debug] 296457#296457: free: 00006261FA9578B0, unused: 0 +2025/08/19 06:00:03 [debug] 296457#296457: free: 00006261FA95B8C0, unused: 0 +2025/08/19 06:00:03 [debug] 296457#296457: free: 00006261FA95F8D0, unused: 0 +2025/08/19 06:00:03 [debug] 296457#296457: free: 00006261FA9638E0, unused: 0 +2025/08/19 06:00:03 [debug] 296457#296457: free: 00006261FA9678F0, unused: 0 +2025/08/19 06:00:03 [debug] 296457#296457: free: 00006261FA96CA10, unused: 4 +2025/08/19 06:00:03 [debug] 296457#296457: free: 00006261FA9722F0, unused: 16079 +2025/08/19 06:00:03 [debug] 331228#331228: bind() 0.0.0.0:9001 #5 +2025/08/19 06:00:03 [notice] 331228#331228: using the "epoll" event method +2025/08/19 06:00:03 [debug] 331228#331228: counter: 000072AACC2AD080, 1 +2025/08/19 06:00:03 [notice] 331228#331228: nginx/1.18.0 (Ubuntu) +2025/08/19 06:00:03 [notice] 331228#331228: OS: Linux 6.12.10-76061203-generic +2025/08/19 06:00:03 [notice] 331228#331228: getrlimit(RLIMIT_NOFILE): 1048576:1048576 +2025/08/19 06:00:03 [debug] 331229#331228: write: 6, 00007FFD9216AB50, 7, 0 +2025/08/19 06:00:03 [debug] 331229#331229: setproctitle: "nginx: master process nginx -p . -c config/local-nginx.conf" +2025/08/19 06:00:03 [notice] 331229#331229: start worker processes +2025/08/19 06:00:03 [debug] 331229#331229: channel 6:7 +2025/08/19 06:00:03 [notice] 331229#331229: start worker process 331230 +2025/08/19 06:00:03 [debug] 331229#331229: sigsuspend +2025/08/19 06:00:03 [debug] 331230#331230: add cleanup: 000062986E528A78 +2025/08/19 06:00:03 [debug] 331230#331230: malloc: 000062986E4EFBD0:8 +2025/08/19 06:00:03 [debug] 331230#331230: notify eventfd: 9 +2025/08/19 06:00:03 [debug] 331230#331230: testing the EPOLLRDHUP flag: success +2025/08/19 06:00:03 [debug] 331230#331230: malloc: 000062986E501170:6144 +2025/08/19 06:00:03 [debug] 331230#331230: malloc: 000072AACC0A5010:237568 +2025/08/19 06:00:03 [debug] 331230#331230: malloc: 000062986E52D080:98304 +2025/08/19 06:00:03 [debug] 331230#331230: malloc: 000062986E545090:98304 +2025/08/19 06:00:03 [debug] 331230#331230: epoll add event: fd:5 op:1 ev:00002001 +2025/08/19 06:00:03 [debug] 331230#331230: epoll add event: fd:7 op:1 ev:00002001 +2025/08/19 06:00:03 [debug] 331230#331230: setproctitle: "nginx: worker process" +2025/08/19 06:00:03 [debug] 331230#331230: worker cycle +2025/08/19 06:00:03 [debug] 331230#331230: epoll timer: -1 +2025/08/19 06:00:05 [debug] 331230#331230: epoll: fd:5 ev:0001 d:000072AACC0A5010 +2025/08/19 06:00:05 [debug] 331230#331230: accept on 0.0.0.0:9001, ready: 0 +2025/08/19 06:00:05 [debug] 331230#331230: posix_memalign: 000062986E4EE840:512 @16 +2025/08/19 06:00:05 [debug] 331230#331230: *1 accept: 127.0.0.1:48294 fd:6 +2025/08/19 06:00:05 [debug] 331230#331230: *1 event timer add: 6: 60000:164398929 +2025/08/19 06:00:05 [debug] 331230#331230: *1 reusable connection: 1 +2025/08/19 06:00:05 [debug] 331230#331230: *1 epoll add event: fd:6 op:1 ev:80002001 +2025/08/19 06:00:05 [debug] 331230#331230: timer delta: 1841 +2025/08/19 06:00:05 [debug] 331230#331230: worker cycle +2025/08/19 06:00:05 [debug] 331230#331230: epoll timer: 60000 +2025/08/19 06:00:05 [debug] 331230#331230: epoll: fd:6 ev:0001 d:000072AACC0A51E0 +2025/08/19 06:00:05 [debug] 331230#331230: *1 http wait request handler +2025/08/19 06:00:05 [debug] 331230#331230: *1 malloc: 000062986E4F10A0:1024 +2025/08/19 06:00:05 [debug] 331230#331230: *1 recv: eof:0, avail:-1 +2025/08/19 06:00:05 [debug] 331230#331230: *1 recv: fd:6 856 of 1024 +2025/08/19 06:00:05 [debug] 331230#331230: *1 reusable connection: 0 +2025/08/19 06:00:05 [debug] 331230#331230: *1 posix_memalign: 000062986E50C610:4096 @16 +2025/08/19 06:00:05 [debug] 331230#331230: *1 http process request line +2025/08/19 06:00:05 [debug] 331230#331230: *1 http request line: "GET /708d0e8226ec17b0585417c0ec9352ce5f52c3820c904b7066fe20b00f2d9cfe.webp HTTP/1.1" +2025/08/19 06:00:05 [debug] 331230#331230: *1 http uri: "/708d0e8226ec17b0585417c0ec9352ce5f52c3820c904b7066fe20b00f2d9cfe.webp" +2025/08/19 06:00:05 [debug] 331230#331230: *1 http args: "" +2025/08/19 06:00:05 [debug] 331230#331230: *1 http exten: "webp" +2025/08/19 06:00:05 [debug] 331230#331230: *1 posix_memalign: 000062986E502980:4096 @16 +2025/08/19 06:00:05 [debug] 331230#331230: *1 http process request header line +2025/08/19 06:00:05 [debug] 331230#331230: *1 http header: "Host: localhost:9001" +2025/08/19 06:00:05 [debug] 331230#331230: *1 http header: "Connection: keep-alive" +2025/08/19 06:00:05 [debug] 331230#331230: *1 http header: "Cache-Control: max-age=0" +2025/08/19 06:00:05 [debug] 331230#331230: *1 http header: "sec-ch-ua: "Not)A;Brand";v="8", "Chromium";v="138", "Brave";v="138"" +2025/08/19 06:00:05 [debug] 331230#331230: *1 http header: "sec-ch-ua-mobile: ?0" +2025/08/19 06:00:05 [debug] 331230#331230: *1 http header: "sec-ch-ua-platform: "Linux"" +2025/08/19 06:00:05 [debug] 331230#331230: *1 http header: "Upgrade-Insecure-Requests: 1" +2025/08/19 06:00:05 [debug] 331230#331230: *1 http header: "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/138.0.0.0 Safari/537.36" +2025/08/19 06:00:05 [debug] 331230#331230: *1 http header: "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8" +2025/08/19 06:00:05 [debug] 331230#331230: *1 http header: "Sec-GPC: 1" +2025/08/19 06:00:05 [debug] 331230#331230: *1 http header: "Accept-Language: en-US,en;q=0.7" +2025/08/19 06:00:05 [debug] 331230#331230: *1 http header: "Sec-Fetch-Site: none" +2025/08/19 06:00:05 [debug] 331230#331230: *1 http header: "Sec-Fetch-Mode: navigate" +2025/08/19 06:00:05 [debug] 331230#331230: *1 http header: "Sec-Fetch-User: ?1" +2025/08/19 06:00:05 [debug] 331230#331230: *1 http header: "Sec-Fetch-Dest: document" +2025/08/19 06:00:05 [debug] 331230#331230: *1 http header: "Accept-Encoding: gzip, deflate, br, zstd" +2025/08/19 06:00:05 [debug] 331230#331230: *1 http header: "Cookie: _session=F9fhtKLJEDy-FOQnvLfoKCbvoOlPmSPR13KDiYmtQ--" +2025/08/19 06:00:05 [debug] 331230#331230: *1 http header: "If-None-Match: "68a3b183-31c6e"" +2025/08/19 06:00:05 [debug] 331230#331230: *1 http header: "If-Modified-Since: Mon, 18 Aug 2025 23:04:35 GMT" +2025/08/19 06:00:05 [debug] 331230#331230: *1 http header done +2025/08/19 06:00:05 [debug] 331230#331230: *1 event timer del: 6: 164398929 +2025/08/19 06:00:05 [debug] 331230#331230: *1 generic phase: 0 +2025/08/19 06:00:05 [debug] 331230#331230: *1 rewrite phase: 1 +2025/08/19 06:00:05 [debug] 331230#331230: *1 test location: "/debug/list" +2025/08/19 06:00:05 [debug] 331230#331230: *1 test location: "/" +2025/08/19 06:00:05 [debug] 331230#331230: *1 test location: ~ "^/([a-f0-9]{64})(\.[a-zA-Z0-9]+)?$" +2025/08/19 06:00:05 [debug] 331230#331230: *1 using configuration "^/([a-f0-9]{64})(\.[a-zA-Z0-9]+)?$" +2025/08/19 06:00:05 [debug] 331230#331230: *1 http cl:-1 max:104857600 +2025/08/19 06:00:05 [debug] 331230#331230: *1 rewrite phase: 3 +2025/08/19 06:00:05 [debug] 331230#331230: *1 http script var +2025/08/19 06:00:05 [debug] 331230#331230: *1 http script var: "GET" +2025/08/19 06:00:05 [debug] 331230#331230: *1 http script value: "HEAD" +2025/08/19 06:00:05 [debug] 331230#331230: *1 http script equal +2025/08/19 06:00:05 [debug] 331230#331230: *1 http script equal: no +2025/08/19 06:00:05 [debug] 331230#331230: *1 http script if +2025/08/19 06:00:05 [debug] 331230#331230: *1 http script if: false +2025/08/19 06:00:05 [debug] 331230#331230: *1 post rewrite phase: 4 +2025/08/19 06:00:05 [debug] 331230#331230: *1 generic phase: 5 +2025/08/19 06:00:05 [debug] 331230#331230: *1 generic phase: 6 +2025/08/19 06:00:05 [debug] 331230#331230: *1 generic phase: 7 +2025/08/19 06:00:05 [debug] 331230#331230: *1 access phase: 8 +2025/08/19 06:00:05 [debug] 331230#331230: *1 access phase: 9 +2025/08/19 06:00:05 [debug] 331230#331230: *1 access phase: 10 +2025/08/19 06:00:05 [debug] 331230#331230: *1 post access phase: 11 +2025/08/19 06:00:05 [debug] 331230#331230: *1 generic phase: 12 +2025/08/19 06:00:05 [debug] 331230#331230: *1 try files handler +2025/08/19 06:00:05 [debug] 331230#331230: *1 http script copy: "/" +2025/08/19 06:00:05 [debug] 331230#331230: *1 http script capture: "708d0e8226ec17b0585417c0ec9352ce5f52c3820c904b7066fe20b00f2d9cfe" +2025/08/19 06:00:05 [debug] 331230#331230: *1 http script copy: ".jpg" +2025/08/19 06:00:05 [debug] 331230#331230: *1 trying to use file: "/708d0e8226ec17b0585417c0ec9352ce5f52c3820c904b7066fe20b00f2d9cfe.jpg" "./blobs/708d0e8226ec17b0585417c0ec9352ce5f52c3820c904b7066fe20b00f2d9cfe.jpg" +2025/08/19 06:00:05 [debug] 331230#331230: *1 http script copy: "/" +2025/08/19 06:00:05 [debug] 331230#331230: *1 http script capture: "708d0e8226ec17b0585417c0ec9352ce5f52c3820c904b7066fe20b00f2d9cfe" +2025/08/19 06:00:05 [debug] 331230#331230: *1 http script copy: ".jpeg" +2025/08/19 06:00:05 [debug] 331230#331230: *1 trying to use file: "/708d0e8226ec17b0585417c0ec9352ce5f52c3820c904b7066fe20b00f2d9cfe.jpeg" "./blobs/708d0e8226ec17b0585417c0ec9352ce5f52c3820c904b7066fe20b00f2d9cfe.jpeg" +2025/08/19 06:00:05 [debug] 331230#331230: *1 http script copy: "/" +2025/08/19 06:00:05 [debug] 331230#331230: *1 http script capture: "708d0e8226ec17b0585417c0ec9352ce5f52c3820c904b7066fe20b00f2d9cfe" +2025/08/19 06:00:05 [debug] 331230#331230: *1 http script copy: ".png" +2025/08/19 06:00:05 [debug] 331230#331230: *1 trying to use file: "/708d0e8226ec17b0585417c0ec9352ce5f52c3820c904b7066fe20b00f2d9cfe.png" "./blobs/708d0e8226ec17b0585417c0ec9352ce5f52c3820c904b7066fe20b00f2d9cfe.png" +2025/08/19 06:00:05 [debug] 331230#331230: *1 http script copy: "/" +2025/08/19 06:00:05 [debug] 331230#331230: *1 http script capture: "708d0e8226ec17b0585417c0ec9352ce5f52c3820c904b7066fe20b00f2d9cfe" +2025/08/19 06:00:05 [debug] 331230#331230: *1 http script copy: ".webp" +2025/08/19 06:00:05 [debug] 331230#331230: *1 trying to use file: "/708d0e8226ec17b0585417c0ec9352ce5f52c3820c904b7066fe20b00f2d9cfe.webp" "./blobs/708d0e8226ec17b0585417c0ec9352ce5f52c3820c904b7066fe20b00f2d9cfe.webp" +2025/08/19 06:00:05 [debug] 331230#331230: *1 try file uri: "/708d0e8226ec17b0585417c0ec9352ce5f52c3820c904b7066fe20b00f2d9cfe.webp" +2025/08/19 06:00:05 [debug] 331230#331230: *1 generic phase: 13 +2025/08/19 06:00:05 [debug] 331230#331230: *1 content phase: 14 +2025/08/19 06:00:05 [debug] 331230#331230: *1 content phase: 15 +2025/08/19 06:00:05 [debug] 331230#331230: *1 content phase: 16 +2025/08/19 06:00:05 [debug] 331230#331230: *1 content phase: 17 +2025/08/19 06:00:05 [debug] 331230#331230: *1 content phase: 18 +2025/08/19 06:00:05 [debug] 331230#331230: *1 http filename: "./blobs/708d0e8226ec17b0585417c0ec9352ce5f52c3820c904b7066fe20b00f2d9cfe.webp" +2025/08/19 06:00:05 [debug] 331230#331230: *1 add cleanup: 000062986E502E10 +2025/08/19 06:00:05 [debug] 331230#331230: *1 http static fd: 10 +2025/08/19 06:00:05 [debug] 331230#331230: *1 http set discard body +2025/08/19 06:00:05 [debug] 331230#331230: *1 http ims:1755558275 lm:1755558275 +2025/08/19 06:00:05 [debug] 331230#331230: *1 http im:""68a3b183-31c6e"" etag:"68a3b183-31c6e" +2025/08/19 06:00:05 [debug] 331230#331230: *1 HTTP/1.1 304 Not Modified +Server: nginx/1.18.0 (Ubuntu) +Date: Tue, 19 Aug 2025 10:00:05 GMT +Last-Modified: Mon, 18 Aug 2025 23:04:35 GMT +Connection: keep-alive +ETag: "68a3b183-31c6e" +Cache-Control: public, max-age=31536000, immutable +X-Content-Type-Options: nosniff +X-Frame-Options: DENY +X-XSS-Protection: 1; mode=block + +2025/08/19 06:00:05 [debug] 331230#331230: *1 write new buf t:1 f:0 000062986E502FF8, pos 000062986E502FF8, size: 332 file: 0, size: 0 +2025/08/19 06:00:05 [debug] 331230#331230: *1 http write filter: l:1 f:0 s:332 +2025/08/19 06:00:05 [debug] 331230#331230: *1 http write filter limit 0 +2025/08/19 06:00:05 [debug] 331230#331230: *1 writev: 332 of 332 +2025/08/19 06:00:05 [debug] 331230#331230: *1 http write filter 0000000000000000 +2025/08/19 06:00:05 [debug] 331230#331230: *1 http finalize request: 0, "/708d0e8226ec17b0585417c0ec9352ce5f52c3820c904b7066fe20b00f2d9cfe.webp?" a:1, c:1 +2025/08/19 06:00:05 [debug] 331230#331230: *1 set http keepalive handler +2025/08/19 06:00:05 [debug] 331230#331230: *1 http close request +2025/08/19 06:00:05 [debug] 331230#331230: *1 http log handler +2025/08/19 06:00:05 [debug] 331230#331230: *1 run cleanup: 000062986E502E10 +2025/08/19 06:00:05 [debug] 331230#331230: *1 file cleanup: fd:10 +2025/08/19 06:00:05 [debug] 331230#331230: *1 free: 000062986E50C610, unused: 0 +2025/08/19 06:00:05 [debug] 331230#331230: *1 free: 000062986E502980, unused: 1809 +2025/08/19 06:00:05 [debug] 331230#331230: *1 free: 000062986E4F10A0 +2025/08/19 06:00:05 [debug] 331230#331230: *1 hc free: 0000000000000000 +2025/08/19 06:00:05 [debug] 331230#331230: *1 hc busy: 0000000000000000 0 +2025/08/19 06:00:05 [debug] 331230#331230: *1 tcp_nodelay +2025/08/19 06:00:05 [debug] 331230#331230: *1 reusable connection: 1 +2025/08/19 06:00:05 [debug] 331230#331230: *1 event timer add: 6: 65000:164403930 +2025/08/19 06:00:05 [debug] 331230#331230: timer delta: 1 +2025/08/19 06:00:05 [debug] 331230#331230: worker cycle +2025/08/19 06:00:05 [debug] 331230#331230: epoll timer: 65000 +2025/08/19 06:01:10 [debug] 331230#331230: timer delta: 65102 +2025/08/19 06:01:10 [debug] 331230#331230: *1 event timer del: 6: 164403930 +2025/08/19 06:01:10 [debug] 331230#331230: *1 http keepalive handler +2025/08/19 06:01:10 [debug] 331230#331230: *1 close http connection: 6 +2025/08/19 06:01:10 [debug] 331230#331230: *1 reusable connection: 0 +2025/08/19 06:01:10 [debug] 331230#331230: *1 free: 0000000000000000 +2025/08/19 06:01:10 [debug] 331230#331230: *1 free: 000062986E4EE840, unused: 136 +2025/08/19 06:01:10 [debug] 331230#331230: worker cycle +2025/08/19 06:01:10 [debug] 331230#331230: epoll timer: -1 +2025/08/19 07:49:21 [debug] 331230#331230: epoll: fd:5 ev:0001 d:000072AACC0A5010 +2025/08/19 07:49:21 [debug] 331230#331230: accept on 0.0.0.0:9001, ready: 0 +2025/08/19 07:49:21 [debug] 331230#331230: posix_memalign: 000062986E4EE840:512 @16 +2025/08/19 07:49:21 [debug] 331230#331230: *2 accept: 127.0.0.1:56540 fd:6 +2025/08/19 07:49:21 [debug] 331230#331230: *2 event timer add: 6: 60000:170954502 +2025/08/19 07:49:21 [debug] 331230#331230: *2 reusable connection: 1 +2025/08/19 07:49:21 [debug] 331230#331230: *2 epoll add event: fd:6 op:1 ev:80002001 +2025/08/19 07:49:21 [debug] 331230#331230: timer delta: 6490470 +2025/08/19 07:49:21 [debug] 331230#331230: worker cycle +2025/08/19 07:49:21 [debug] 331230#331230: epoll timer: 60000 +2025/08/19 07:49:21 [debug] 331230#331230: epoll: fd:6 ev:0001 d:000072AACC0A51E1 +2025/08/19 07:49:21 [debug] 331230#331230: *2 http wait request handler +2025/08/19 07:49:21 [debug] 331230#331230: *2 malloc: 000062986E4F10A0:1024 +2025/08/19 07:49:21 [debug] 331230#331230: *2 recv: eof:0, avail:-1 +2025/08/19 07:49:21 [debug] 331230#331230: *2 recv: fd:6 84 of 1024 +2025/08/19 07:49:21 [debug] 331230#331230: *2 reusable connection: 0 +2025/08/19 07:49:21 [debug] 331230#331230: *2 posix_memalign: 000062986E50C610:4096 @16 +2025/08/19 07:49:21 [debug] 331230#331230: *2 http process request line +2025/08/19 07:49:21 [debug] 331230#331230: *2 http request line: "GET /health HTTP/1.1" +2025/08/19 07:49:21 [debug] 331230#331230: *2 http uri: "/health" +2025/08/19 07:49:21 [debug] 331230#331230: *2 http args: "" +2025/08/19 07:49:21 [debug] 331230#331230: *2 http exten: "" +2025/08/19 07:49:21 [debug] 331230#331230: *2 posix_memalign: 000062986E502980:4096 @16 +2025/08/19 07:49:21 [debug] 331230#331230: *2 http process request header line +2025/08/19 07:49:21 [debug] 331230#331230: *2 http header: "Host: localhost:9001" +2025/08/19 07:49:21 [debug] 331230#331230: *2 http header: "User-Agent: curl/8.15.0" +2025/08/19 07:49:21 [debug] 331230#331230: *2 http header: "Accept: */*" +2025/08/19 07:49:21 [debug] 331230#331230: *2 http header done +2025/08/19 07:49:21 [debug] 331230#331230: *2 event timer del: 6: 170954502 +2025/08/19 07:49:21 [debug] 331230#331230: *2 generic phase: 0 +2025/08/19 07:49:21 [debug] 331230#331230: *2 rewrite phase: 1 +2025/08/19 07:49:21 [debug] 331230#331230: *2 test location: "/debug/list" +2025/08/19 07:49:21 [debug] 331230#331230: *2 test location: "/health" +2025/08/19 07:49:21 [debug] 331230#331230: *2 test location: ~ "^/([a-f0-9]{64})(\.[a-zA-Z0-9]+)?$" +2025/08/19 07:49:21 [debug] 331230#331230: *2 test location: ~ "^/fcgi-head/([a-f0-9]{64}).*$" +2025/08/19 07:49:21 [debug] 331230#331230: *2 using configuration "/health" +2025/08/19 07:49:21 [debug] 331230#331230: *2 http cl:-1 max:104857600 +2025/08/19 07:49:21 [debug] 331230#331230: *2 rewrite phase: 3 +2025/08/19 07:49:21 [debug] 331230#331230: *2 http set discard body +2025/08/19 07:49:21 [debug] 331230#331230: *2 HTTP/1.1 200 OK +Server: nginx/1.18.0 (Ubuntu) +Date: Tue, 19 Aug 2025 11:49:21 GMT +Content-Type: application/octet-stream +Content-Length: 3 +Connection: keep-alive +Content-Type: text/plain + +2025/08/19 07:49:21 [debug] 331230#331230: *2 write new buf t:1 f:0 000062986E502D60, pos 000062986E502D60, size: 196 file: 0, size: 0 +2025/08/19 07:49:21 [debug] 331230#331230: *2 http write filter: l:0 f:0 s:196 +2025/08/19 07:49:21 [debug] 331230#331230: *2 http output filter "/health?" +2025/08/19 07:49:21 [debug] 331230#331230: *2 http copy filter: "/health?" +2025/08/19 07:49:21 [debug] 331230#331230: *2 http postpone filter "/health?" 00007FFD9216A6E0 +2025/08/19 07:49:21 [debug] 331230#331230: *2 write old buf t:1 f:0 000062986E502D60, pos 000062986E502D60, size: 196 file: 0, size: 0 +2025/08/19 07:49:21 [debug] 331230#331230: *2 write new buf t:0 f:0 0000000000000000, pos 000062986E51DFAA, size: 3 file: 0, size: 0 +2025/08/19 07:49:21 [debug] 331230#331230: *2 http write filter: l:1 f:0 s:199 +2025/08/19 07:49:21 [debug] 331230#331230: *2 http write filter limit 0 +2025/08/19 07:49:21 [debug] 331230#331230: *2 writev: 199 of 199 +2025/08/19 07:49:21 [debug] 331230#331230: *2 http write filter 0000000000000000 +2025/08/19 07:49:21 [debug] 331230#331230: *2 http copy filter: 0 "/health?" +2025/08/19 07:49:21 [debug] 331230#331230: *2 http finalize request: 0, "/health?" a:1, c:1 +2025/08/19 07:49:21 [debug] 331230#331230: *2 set http keepalive handler +2025/08/19 07:49:21 [debug] 331230#331230: *2 http close request +2025/08/19 07:49:21 [debug] 331230#331230: *2 http log handler +2025/08/19 07:49:21 [debug] 331230#331230: *2 free: 000062986E50C610, unused: 48 +2025/08/19 07:49:21 [debug] 331230#331230: *2 free: 000062986E502980, unused: 2752 +2025/08/19 07:49:21 [debug] 331230#331230: *2 free: 000062986E4F10A0 +2025/08/19 07:49:21 [debug] 331230#331230: *2 hc free: 0000000000000000 +2025/08/19 07:49:21 [debug] 331230#331230: *2 hc busy: 0000000000000000 0 +2025/08/19 07:49:21 [debug] 331230#331230: *2 tcp_nodelay +2025/08/19 07:49:21 [debug] 331230#331230: *2 reusable connection: 1 +2025/08/19 07:49:21 [debug] 331230#331230: *2 event timer add: 6: 65000:170959502 +2025/08/19 07:49:21 [debug] 331230#331230: timer delta: 0 +2025/08/19 07:49:21 [debug] 331230#331230: worker cycle +2025/08/19 07:49:21 [debug] 331230#331230: epoll timer: 65000 +2025/08/19 07:49:21 [debug] 331230#331230: epoll: fd:6 ev:2001 d:000072AACC0A51E1 +2025/08/19 07:49:21 [debug] 331230#331230: *2 http keepalive handler +2025/08/19 07:49:21 [debug] 331230#331230: *2 malloc: 000062986E4F10A0:1024 +2025/08/19 07:49:21 [debug] 331230#331230: *2 recv: eof:1, avail:-1 +2025/08/19 07:49:21 [debug] 331230#331230: *2 recv: fd:6 0 of 1024 +2025/08/19 07:49:21 [info] 331230#331230: *2 client 127.0.0.1 closed keepalive connection +2025/08/19 07:49:21 [debug] 331230#331230: *2 close http connection: 6 +2025/08/19 07:49:21 [debug] 331230#331230: *2 event timer del: 6: 170959502 +2025/08/19 07:49:21 [debug] 331230#331230: *2 reusable connection: 0 +2025/08/19 07:49:21 [debug] 331230#331230: *2 free: 000062986E4F10A0 +2025/08/19 07:49:21 [debug] 331230#331230: *2 free: 000062986E4EE840, unused: 136 +2025/08/19 07:49:21 [debug] 331230#331230: timer delta: 2 +2025/08/19 07:49:21 [debug] 331230#331230: worker cycle +2025/08/19 07:49:21 [debug] 331230#331230: epoll timer: -1 +2025/08/19 07:49:21 [debug] 331230#331230: epoll: fd:5 ev:0001 d:000072AACC0A5010 +2025/08/19 07:49:21 [debug] 331230#331230: accept on 0.0.0.0:9001, ready: 0 +2025/08/19 07:49:21 [debug] 331230#331230: posix_memalign: 000062986E4EE840:512 @16 +2025/08/19 07:49:21 [debug] 331230#331230: *3 accept: 127.0.0.1:56546 fd:6 +2025/08/19 07:49:21 [debug] 331230#331230: *3 event timer add: 6: 60000:170954741 +2025/08/19 07:49:21 [debug] 331230#331230: *3 reusable connection: 1 +2025/08/19 07:49:21 [debug] 331230#331230: *3 epoll add event: fd:6 op:1 ev:80002001 +2025/08/19 07:49:21 [debug] 331230#331230: timer delta: 237 +2025/08/19 07:49:21 [debug] 331230#331230: worker cycle +2025/08/19 07:49:21 [debug] 331230#331230: epoll timer: 60000 +2025/08/19 07:49:21 [debug] 331230#331230: epoll: fd:6 ev:0001 d:000072AACC0A51E0 +2025/08/19 07:49:21 [debug] 331230#331230: *3 http wait request handler +2025/08/19 07:49:21 [debug] 331230#331230: *3 malloc: 000062986E4F10A0:1024 +2025/08/19 07:49:21 [debug] 331230#331230: *3 recv: eof:0, avail:-1 +2025/08/19 07:49:21 [debug] 331230#331230: *3 recv: fd:6 1024 of 1024 +2025/08/19 07:49:21 [debug] 331230#331230: *3 recv: avail:56 +2025/08/19 07:49:21 [debug] 331230#331230: *3 reusable connection: 0 +2025/08/19 07:49:21 [debug] 331230#331230: *3 posix_memalign: 000062986E50C610:4096 @16 +2025/08/19 07:49:21 [debug] 331230#331230: *3 http process request line +2025/08/19 07:49:21 [debug] 331230#331230: *3 http request line: "PUT /upload HTTP/1.1" +2025/08/19 07:49:21 [debug] 331230#331230: *3 http uri: "/upload" +2025/08/19 07:49:21 [debug] 331230#331230: *3 http args: "" +2025/08/19 07:49:21 [debug] 331230#331230: *3 http exten: "" +2025/08/19 07:49:21 [debug] 331230#331230: *3 posix_memalign: 000062986E502980:4096 @16 +2025/08/19 07:49:21 [debug] 331230#331230: *3 http process request header line +2025/08/19 07:49:21 [debug] 331230#331230: *3 http header: "Host: localhost:9001" +2025/08/19 07:49:21 [debug] 331230#331230: *3 http header: "User-Agent: curl/8.15.0" +2025/08/19 07:49:21 [debug] 331230#331230: *3 http header: "Accept: */*" +2025/08/19 07:49:21 [debug] 331230#331230: *3 http header: "Authorization: Nostr eyJraW5kIjoyNDI0MiwiaWQiOiJjOWQzNmUwYWVhMWM1ODQyZTI1NmQ2NDA5NWZhMTQ4N2QwMDkyY2NiNjQxODc1MDM1MzI1Y2M4NjFjMTE2Y2NjIiwicHVia2V5IjoiNzliZTY2N2VmOWRjYmJhYzU1YTA2Mjk1Y2U4NzBiMDcwMjliZmNkYjJkY2UyOGQ5NTlmMjgxNWIxNmY4MTc5OCIsImNyZWF0ZWRfYXQiOjE3NTU2MDQxNjEsInRhZ3MiOltbInQiLCJ1cGxvYWQiXSxbIngiLCIyMWZjMzBkYWM0Yzk1YWQ0YjI2ZWI3OGQ5N2NiMzFhMGNiNGJjNjlmMzBjMGQ0MTk1Zjc2ODVhYzEzYjIyY2U2Il0sWyJleHBpcmF0aW9uIiwiMTc1NTYwNzc2MSJdXSwiY29udGVudCI6IiIsInNpZyI6IjhhZGVkOWJlMGUxOGVhOTA0YTE3MzUwOThkODUyMzFhN2E4ODBlYmE0MTVhYjFjYTI1M2NkZWFiOGFmNjdkOGY5Y2QyYWUwYjdmMDJlMmM3NGEzOWVhYjhmYzBkZjI5NGM0OTUwMWE5ZDJjOTM4OWIwYzI5ZDY2OTdmY2E3MGQ5In0=" +2025/08/19 07:49:21 [debug] 331230#331230: *3 http header: "Content-Type: application/octet-stream" +2025/08/19 07:49:21 [debug] 331230#331230: *3 http header: "Content-Length: 296" +2025/08/19 07:49:21 [debug] 331230#331230: *3 http header done +2025/08/19 07:49:21 [debug] 331230#331230: *3 event timer del: 6: 170954741 +2025/08/19 07:49:21 [debug] 331230#331230: *3 generic phase: 0 +2025/08/19 07:49:21 [debug] 331230#331230: *3 rewrite phase: 1 +2025/08/19 07:49:21 [debug] 331230#331230: *3 test location: "/debug/list" +2025/08/19 07:49:21 [debug] 331230#331230: *3 test location: "/health" +2025/08/19 07:49:21 [debug] 331230#331230: *3 test location: ~ "^/([a-f0-9]{64})(\.[a-zA-Z0-9]+)?$" +2025/08/19 07:49:21 [debug] 331230#331230: *3 test location: ~ "^/fcgi-head/([a-f0-9]{64}).*$" +2025/08/19 07:49:21 [debug] 331230#331230: *3 using configuration "" +2025/08/19 07:49:21 [debug] 331230#331230: *3 http cl:296 max:104857600 +2025/08/19 07:49:21 [debug] 331230#331230: *3 rewrite phase: 3 +2025/08/19 07:49:21 [debug] 331230#331230: *3 post rewrite phase: 4 +2025/08/19 07:49:21 [debug] 331230#331230: *3 generic phase: 5 +2025/08/19 07:49:21 [debug] 331230#331230: *3 generic phase: 6 +2025/08/19 07:49:21 [debug] 331230#331230: *3 generic phase: 7 +2025/08/19 07:49:21 [debug] 331230#331230: *3 access phase: 8 +2025/08/19 07:49:21 [debug] 331230#331230: *3 access phase: 9 +2025/08/19 07:49:21 [debug] 331230#331230: *3 access phase: 10 +2025/08/19 07:49:21 [debug] 331230#331230: *3 post access phase: 11 +2025/08/19 07:49:21 [debug] 331230#331230: *3 generic phase: 12 +2025/08/19 07:49:21 [debug] 331230#331230: *3 generic phase: 13 +2025/08/19 07:49:21 [debug] 331230#331230: *3 content phase: 14 +2025/08/19 07:49:21 [debug] 331230#331230: *3 content phase: 15 +2025/08/19 07:49:21 [debug] 331230#331230: *3 content phase: 16 +2025/08/19 07:49:21 [debug] 331230#331230: *3 content phase: 17 +2025/08/19 07:49:21 [debug] 331230#331230: *3 content phase: 18 +2025/08/19 07:49:21 [debug] 331230#331230: *3 http finalize request: 405, "/upload?" a:1, c:1 +2025/08/19 07:49:21 [debug] 331230#331230: *3 http special response: 405, "/upload?" +2025/08/19 07:49:21 [debug] 331230#331230: *3 http set discard body +2025/08/19 07:49:21 [debug] 331230#331230: *3 http read discarded body +2025/08/19 07:49:21 [debug] 331230#331230: *3 recv: eof:0, avail:56 +2025/08/19 07:49:21 [debug] 331230#331230: *3 recv: fd:6 56 of 56 +2025/08/19 07:49:21 [debug] 331230#331230: *3 recv: avail:0 +2025/08/19 07:49:21 [debug] 331230#331230: *3 HTTP/1.1 405 Not Allowed +Server: nginx/1.18.0 (Ubuntu) +Date: Tue, 19 Aug 2025 11:49:21 GMT +Content-Type: text/html +Content-Length: 166 +Connection: keep-alive + +2025/08/19 07:49:21 [debug] 331230#331230: *3 write new buf t:1 f:0 000062986E50D4A0, pos 000062986E50D4A0, size: 166 file: 0, size: 0 +2025/08/19 07:49:21 [debug] 331230#331230: *3 http write filter: l:0 f:0 s:166 +2025/08/19 07:49:21 [debug] 331230#331230: *3 http output filter "/upload?" +2025/08/19 07:49:21 [debug] 331230#331230: *3 http copy filter: "/upload?" +2025/08/19 07:49:21 [debug] 331230#331230: *3 http postpone filter "/upload?" 000062986E502DE8 +2025/08/19 07:49:21 [debug] 331230#331230: *3 write old buf t:1 f:0 000062986E50D4A0, pos 000062986E50D4A0, size: 166 file: 0, size: 0 +2025/08/19 07:49:21 [debug] 331230#331230: *3 write new buf t:0 f:0 0000000000000000, pos 000062986229C500, size: 104 file: 0, size: 0 +2025/08/19 07:49:21 [debug] 331230#331230: *3 write new buf t:0 f:0 0000000000000000, pos 000062986229CC80, size: 62 file: 0, size: 0 +2025/08/19 07:49:21 [debug] 331230#331230: *3 http write filter: l:1 f:0 s:332 +2025/08/19 07:49:21 [debug] 331230#331230: *3 http write filter limit 0 +2025/08/19 07:49:21 [debug] 331230#331230: *3 writev: 332 of 332 +2025/08/19 07:49:21 [debug] 331230#331230: *3 http write filter 0000000000000000 +2025/08/19 07:49:21 [debug] 331230#331230: *3 http copy filter: 0 "/upload?" +2025/08/19 07:49:21 [debug] 331230#331230: *3 http finalize request: 0, "/upload?" a:1, c:1 +2025/08/19 07:49:21 [debug] 331230#331230: *3 set http keepalive handler +2025/08/19 07:49:21 [debug] 331230#331230: *3 http close request +2025/08/19 07:49:21 [debug] 331230#331230: *3 http log handler +2025/08/19 07:49:21 [debug] 331230#331230: *3 free: 000062986E50C610, unused: 8 +2025/08/19 07:49:21 [debug] 331230#331230: *3 free: 000062986E502980, unused: 2778 +2025/08/19 07:49:21 [debug] 331230#331230: *3 free: 000062986E4F10A0 +2025/08/19 07:49:21 [debug] 331230#331230: *3 hc free: 0000000000000000 +2025/08/19 07:49:21 [debug] 331230#331230: *3 hc busy: 0000000000000000 0 +2025/08/19 07:49:21 [debug] 331230#331230: *3 tcp_nodelay +2025/08/19 07:49:21 [debug] 331230#331230: *3 reusable connection: 1 +2025/08/19 07:49:21 [debug] 331230#331230: *3 event timer add: 6: 65000:170959741 +2025/08/19 07:49:21 [debug] 331230#331230: *3 post event 000062986E52D140 +2025/08/19 07:49:21 [debug] 331230#331230: timer delta: 0 +2025/08/19 07:49:21 [debug] 331230#331230: posted event 000062986E52D140 +2025/08/19 07:49:21 [debug] 331230#331230: *3 delete posted event 000062986E52D140 +2025/08/19 07:49:21 [debug] 331230#331230: *3 http keepalive handler +2025/08/19 07:49:21 [debug] 331230#331230: *3 malloc: 000062986E4F10A0:1024 +2025/08/19 07:49:21 [debug] 331230#331230: *3 recv: eof:0, avail:0 +2025/08/19 07:49:21 [debug] 331230#331230: *3 free: 000062986E4F10A0 +2025/08/19 07:49:21 [debug] 331230#331230: worker cycle +2025/08/19 07:49:21 [debug] 331230#331230: epoll timer: 65000 +2025/08/19 07:49:21 [debug] 331230#331230: epoll: fd:6 ev:2001 d:000072AACC0A51E0 +2025/08/19 07:49:21 [debug] 331230#331230: *3 http keepalive handler +2025/08/19 07:49:21 [debug] 331230#331230: *3 malloc: 000062986E4F10A0:1024 +2025/08/19 07:49:21 [debug] 331230#331230: *3 recv: eof:1, avail:-1 +2025/08/19 07:49:21 [debug] 331230#331230: *3 recv: fd:6 0 of 1024 +2025/08/19 07:49:21 [info] 331230#331230: *3 client 127.0.0.1 closed keepalive connection +2025/08/19 07:49:21 [debug] 331230#331230: *3 close http connection: 6 +2025/08/19 07:49:21 [debug] 331230#331230: *3 event timer del: 6: 170959741 +2025/08/19 07:49:21 [debug] 331230#331230: *3 reusable connection: 0 +2025/08/19 07:49:21 [debug] 331230#331230: *3 free: 000062986E4F10A0 +2025/08/19 07:49:21 [debug] 331230#331230: *3 free: 000062986E4EE840, unused: 136 +2025/08/19 07:49:21 [debug] 331230#331230: timer delta: 1 +2025/08/19 07:49:21 [debug] 331230#331230: worker cycle +2025/08/19 07:49:21 [debug] 331230#331230: epoll timer: -1 +2025/08/19 07:49:21 [debug] 331230#331230: epoll: fd:5 ev:0001 d:000072AACC0A5010 +2025/08/19 07:49:21 [debug] 331230#331230: accept on 0.0.0.0:9001, ready: 0 +2025/08/19 07:49:21 [debug] 331230#331230: posix_memalign: 000062986E4EE840:512 @16 +2025/08/19 07:49:21 [debug] 331230#331230: *4 accept: 127.0.0.1:56556 fd:6 +2025/08/19 07:49:21 [debug] 331230#331230: *4 event timer add: 6: 60000:170954750 +2025/08/19 07:49:21 [debug] 331230#331230: *4 reusable connection: 1 +2025/08/19 07:49:21 [debug] 331230#331230: *4 epoll add event: fd:6 op:1 ev:80002001 +2025/08/19 07:49:21 [debug] 331230#331230: timer delta: 8 +2025/08/19 07:49:21 [debug] 331230#331230: worker cycle +2025/08/19 07:49:21 [debug] 331230#331230: epoll timer: 60000 +2025/08/19 07:49:21 [debug] 331230#331230: epoll: fd:6 ev:0001 d:000072AACC0A51E1 +2025/08/19 07:49:21 [debug] 331230#331230: *4 http wait request handler +2025/08/19 07:49:21 [debug] 331230#331230: *4 malloc: 000062986E4F10A0:1024 +2025/08/19 07:49:21 [debug] 331230#331230: *4 recv: eof:0, avail:-1 +2025/08/19 07:49:21 [debug] 331230#331230: *4 recv: fd:6 142 of 1024 +2025/08/19 07:49:21 [debug] 331230#331230: *4 reusable connection: 0 +2025/08/19 07:49:21 [debug] 331230#331230: *4 posix_memalign: 000062986E50C610:4096 @16 +2025/08/19 07:49:21 [debug] 331230#331230: *4 http process request line +2025/08/19 07:49:21 [debug] 331230#331230: *4 http request line: "GET /21fc30dac4c95ad4b26eb78d97cb31a0cb4bc69f30c0d4195f7685ac13b22ce6 HTTP/1.1" +2025/08/19 07:49:21 [debug] 331230#331230: *4 http uri: "/21fc30dac4c95ad4b26eb78d97cb31a0cb4bc69f30c0d4195f7685ac13b22ce6" +2025/08/19 07:49:21 [debug] 331230#331230: *4 http args: "" +2025/08/19 07:49:21 [debug] 331230#331230: *4 http exten: "" +2025/08/19 07:49:21 [debug] 331230#331230: *4 posix_memalign: 000062986E502980:4096 @16 +2025/08/19 07:49:21 [debug] 331230#331230: *4 http process request header line +2025/08/19 07:49:21 [debug] 331230#331230: *4 http header: "Host: localhost:9001" +2025/08/19 07:49:21 [debug] 331230#331230: *4 http header: "User-Agent: curl/8.15.0" +2025/08/19 07:49:21 [debug] 331230#331230: *4 http header: "Accept: */*" +2025/08/19 07:49:21 [debug] 331230#331230: *4 http header done +2025/08/19 07:49:21 [debug] 331230#331230: *4 event timer del: 6: 170954750 +2025/08/19 07:49:21 [debug] 331230#331230: *4 generic phase: 0 +2025/08/19 07:49:21 [debug] 331230#331230: *4 rewrite phase: 1 +2025/08/19 07:49:21 [debug] 331230#331230: *4 test location: "/debug/list" +2025/08/19 07:49:21 [debug] 331230#331230: *4 test location: "/" +2025/08/19 07:49:21 [debug] 331230#331230: *4 test location: ~ "^/([a-f0-9]{64})(\.[a-zA-Z0-9]+)?$" +2025/08/19 07:49:21 [debug] 331230#331230: *4 using configuration "^/([a-f0-9]{64})(\.[a-zA-Z0-9]+)?$" +2025/08/19 07:49:21 [debug] 331230#331230: *4 http cl:-1 max:104857600 +2025/08/19 07:49:21 [debug] 331230#331230: *4 rewrite phase: 3 +2025/08/19 07:49:21 [debug] 331230#331230: *4 http script var +2025/08/19 07:49:21 [debug] 331230#331230: *4 http script var: "GET" +2025/08/19 07:49:21 [debug] 331230#331230: *4 http script value: "HEAD" +2025/08/19 07:49:21 [debug] 331230#331230: *4 http script equal +2025/08/19 07:49:21 [debug] 331230#331230: *4 http script equal: no +2025/08/19 07:49:21 [debug] 331230#331230: *4 http script if +2025/08/19 07:49:21 [debug] 331230#331230: *4 http script if: false +2025/08/19 07:49:21 [debug] 331230#331230: *4 post rewrite phase: 4 +2025/08/19 07:49:21 [debug] 331230#331230: *4 generic phase: 5 +2025/08/19 07:49:21 [debug] 331230#331230: *4 generic phase: 6 +2025/08/19 07:49:21 [debug] 331230#331230: *4 generic phase: 7 +2025/08/19 07:49:21 [debug] 331230#331230: *4 access phase: 8 +2025/08/19 07:49:21 [debug] 331230#331230: *4 access phase: 9 +2025/08/19 07:49:21 [debug] 331230#331230: *4 access phase: 10 +2025/08/19 07:49:21 [debug] 331230#331230: *4 post access phase: 11 +2025/08/19 07:49:21 [debug] 331230#331230: *4 generic phase: 12 +2025/08/19 07:49:21 [debug] 331230#331230: *4 try files handler +2025/08/19 07:49:21 [debug] 331230#331230: *4 http script copy: "/" +2025/08/19 07:49:21 [debug] 331230#331230: *4 http script capture: "21fc30dac4c95ad4b26eb78d97cb31a0cb4bc69f30c0d4195f7685ac13b22ce6" +2025/08/19 07:49:21 [debug] 331230#331230: *4 http script copy: ".jpg" +2025/08/19 07:49:21 [debug] 331230#331230: *4 trying to use file: "/21fc30dac4c95ad4b26eb78d97cb31a0cb4bc69f30c0d4195f7685ac13b22ce6.jpg" "./blobs/21fc30dac4c95ad4b26eb78d97cb31a0cb4bc69f30c0d4195f7685ac13b22ce6.jpg" +2025/08/19 07:49:21 [debug] 331230#331230: *4 http script copy: "/" +2025/08/19 07:49:21 [debug] 331230#331230: *4 http script capture: "21fc30dac4c95ad4b26eb78d97cb31a0cb4bc69f30c0d4195f7685ac13b22ce6" +2025/08/19 07:49:21 [debug] 331230#331230: *4 http script copy: ".jpeg" +2025/08/19 07:49:21 [debug] 331230#331230: *4 trying to use file: "/21fc30dac4c95ad4b26eb78d97cb31a0cb4bc69f30c0d4195f7685ac13b22ce6.jpeg" "./blobs/21fc30dac4c95ad4b26eb78d97cb31a0cb4bc69f30c0d4195f7685ac13b22ce6.jpeg" +2025/08/19 07:49:21 [debug] 331230#331230: *4 http script copy: "/" +2025/08/19 07:49:21 [debug] 331230#331230: *4 http script capture: "21fc30dac4c95ad4b26eb78d97cb31a0cb4bc69f30c0d4195f7685ac13b22ce6" +2025/08/19 07:49:21 [debug] 331230#331230: *4 http script copy: ".png" +2025/08/19 07:49:21 [debug] 331230#331230: *4 trying to use file: "/21fc30dac4c95ad4b26eb78d97cb31a0cb4bc69f30c0d4195f7685ac13b22ce6.png" "./blobs/21fc30dac4c95ad4b26eb78d97cb31a0cb4bc69f30c0d4195f7685ac13b22ce6.png" +2025/08/19 07:49:21 [debug] 331230#331230: *4 http script copy: "/" +2025/08/19 07:49:21 [debug] 331230#331230: *4 http script capture: "21fc30dac4c95ad4b26eb78d97cb31a0cb4bc69f30c0d4195f7685ac13b22ce6" +2025/08/19 07:49:21 [debug] 331230#331230: *4 http script copy: ".webp" +2025/08/19 07:49:21 [debug] 331230#331230: *4 trying to use file: "/21fc30dac4c95ad4b26eb78d97cb31a0cb4bc69f30c0d4195f7685ac13b22ce6.webp" "./blobs/21fc30dac4c95ad4b26eb78d97cb31a0cb4bc69f30c0d4195f7685ac13b22ce6.webp" +2025/08/19 07:49:21 [debug] 331230#331230: *4 http script copy: "/" +2025/08/19 07:49:21 [debug] 331230#331230: *4 http script capture: "21fc30dac4c95ad4b26eb78d97cb31a0cb4bc69f30c0d4195f7685ac13b22ce6" +2025/08/19 07:49:21 [debug] 331230#331230: *4 http script copy: ".gif" +2025/08/19 07:49:21 [debug] 331230#331230: *4 trying to use file: "/21fc30dac4c95ad4b26eb78d97cb31a0cb4bc69f30c0d4195f7685ac13b22ce6.gif" "./blobs/21fc30dac4c95ad4b26eb78d97cb31a0cb4bc69f30c0d4195f7685ac13b22ce6.gif" +2025/08/19 07:49:21 [debug] 331230#331230: *4 http script copy: "/" +2025/08/19 07:49:21 [debug] 331230#331230: *4 http script capture: "21fc30dac4c95ad4b26eb78d97cb31a0cb4bc69f30c0d4195f7685ac13b22ce6" +2025/08/19 07:49:21 [debug] 331230#331230: *4 http script copy: ".pdf" +2025/08/19 07:49:21 [debug] 331230#331230: *4 trying to use file: "/21fc30dac4c95ad4b26eb78d97cb31a0cb4bc69f30c0d4195f7685ac13b22ce6.pdf" "./blobs/21fc30dac4c95ad4b26eb78d97cb31a0cb4bc69f30c0d4195f7685ac13b22ce6.pdf" +2025/08/19 07:49:21 [debug] 331230#331230: *4 http script copy: "/" +2025/08/19 07:49:21 [debug] 331230#331230: *4 http script capture: "21fc30dac4c95ad4b26eb78d97cb31a0cb4bc69f30c0d4195f7685ac13b22ce6" +2025/08/19 07:49:21 [debug] 331230#331230: *4 http script copy: ".mp4" +2025/08/19 07:49:21 [debug] 331230#331230: *4 trying to use file: "/21fc30dac4c95ad4b26eb78d97cb31a0cb4bc69f30c0d4195f7685ac13b22ce6.mp4" "./blobs/21fc30dac4c95ad4b26eb78d97cb31a0cb4bc69f30c0d4195f7685ac13b22ce6.mp4" +2025/08/19 07:49:21 [debug] 331230#331230: *4 http script copy: "/" +2025/08/19 07:49:21 [debug] 331230#331230: *4 http script capture: "21fc30dac4c95ad4b26eb78d97cb31a0cb4bc69f30c0d4195f7685ac13b22ce6" +2025/08/19 07:49:21 [debug] 331230#331230: *4 http script copy: ".mp3" +2025/08/19 07:49:21 [debug] 331230#331230: *4 trying to use file: "/21fc30dac4c95ad4b26eb78d97cb31a0cb4bc69f30c0d4195f7685ac13b22ce6.mp3" "./blobs/21fc30dac4c95ad4b26eb78d97cb31a0cb4bc69f30c0d4195f7685ac13b22ce6.mp3" +2025/08/19 07:49:21 [debug] 331230#331230: *4 http script copy: "/" +2025/08/19 07:49:21 [debug] 331230#331230: *4 http script capture: "21fc30dac4c95ad4b26eb78d97cb31a0cb4bc69f30c0d4195f7685ac13b22ce6" +2025/08/19 07:49:21 [debug] 331230#331230: *4 http script copy: ".txt" +2025/08/19 07:49:21 [debug] 331230#331230: *4 trying to use file: "/21fc30dac4c95ad4b26eb78d97cb31a0cb4bc69f30c0d4195f7685ac13b22ce6.txt" "./blobs/21fc30dac4c95ad4b26eb78d97cb31a0cb4bc69f30c0d4195f7685ac13b22ce6.txt" +2025/08/19 07:49:21 [debug] 331230#331230: *4 http script copy: "/" +2025/08/19 07:49:21 [debug] 331230#331230: *4 http script capture: "21fc30dac4c95ad4b26eb78d97cb31a0cb4bc69f30c0d4195f7685ac13b22ce6" +2025/08/19 07:49:21 [debug] 331230#331230: *4 http script copy: ".md=404" +2025/08/19 07:49:21 [debug] 331230#331230: *4 trying to use file: "/21fc30dac4c95ad4b26eb78d97cb31a0cb4bc69f30c0d4195f7685ac13b22ce6.md=404" "./blobs/21fc30dac4c95ad4b26eb78d97cb31a0cb4bc69f30c0d4195f7685ac13b22ce6.md=404" +2025/08/19 07:49:21 [debug] 331230#331230: *4 internal redirect: "/21fc30dac4c95ad4b26eb78d97cb31a0cb4bc69f30c0d4195f7685ac13b22ce6.md=404?" +2025/08/19 07:49:21 [debug] 331230#331230: *4 rewrite phase: 1 +2025/08/19 07:49:21 [debug] 331230#331230: *4 test location: "/debug/list" +2025/08/19 07:49:21 [debug] 331230#331230: *4 test location: "/" +2025/08/19 07:49:21 [debug] 331230#331230: *4 test location: ~ "^/([a-f0-9]{64})(\.[a-zA-Z0-9]+)?$" +2025/08/19 07:49:21 [debug] 331230#331230: *4 test location: ~ "^/fcgi-head/([a-f0-9]{64}).*$" +2025/08/19 07:49:21 [debug] 331230#331230: *4 using configuration "" +2025/08/19 07:49:21 [debug] 331230#331230: *4 http cl:-1 max:104857600 +2025/08/19 07:49:21 [debug] 331230#331230: *4 rewrite phase: 3 +2025/08/19 07:49:21 [debug] 331230#331230: *4 post rewrite phase: 4 +2025/08/19 07:49:21 [debug] 331230#331230: *4 generic phase: 5 +2025/08/19 07:49:21 [debug] 331230#331230: *4 generic phase: 6 +2025/08/19 07:49:21 [debug] 331230#331230: *4 generic phase: 7 +2025/08/19 07:49:21 [debug] 331230#331230: *4 access phase: 8 +2025/08/19 07:49:21 [debug] 331230#331230: *4 access phase: 9 +2025/08/19 07:49:21 [debug] 331230#331230: *4 access phase: 10 +2025/08/19 07:49:21 [debug] 331230#331230: *4 post access phase: 11 +2025/08/19 07:49:21 [debug] 331230#331230: *4 generic phase: 12 +2025/08/19 07:49:21 [debug] 331230#331230: *4 generic phase: 13 +2025/08/19 07:49:21 [debug] 331230#331230: *4 content phase: 14 +2025/08/19 07:49:21 [debug] 331230#331230: *4 content phase: 15 +2025/08/19 07:49:21 [debug] 331230#331230: *4 content phase: 16 +2025/08/19 07:49:21 [debug] 331230#331230: *4 content phase: 17 +2025/08/19 07:49:21 [debug] 331230#331230: *4 content phase: 18 +2025/08/19 07:49:21 [debug] 331230#331230: *4 http filename: "./blobs/21fc30dac4c95ad4b26eb78d97cb31a0cb4bc69f30c0d4195f7685ac13b22ce6.md=404" +2025/08/19 07:49:21 [debug] 331230#331230: *4 add cleanup: 000062986E50D5D0 +2025/08/19 07:49:21 [error] 331230#331230: *4 open() "./blobs/21fc30dac4c95ad4b26eb78d97cb31a0cb4bc69f30c0d4195f7685ac13b22ce6.md=404" failed (2: No such file or directory), client: 127.0.0.1, server: localhost, request: "GET /21fc30dac4c95ad4b26eb78d97cb31a0cb4bc69f30c0d4195f7685ac13b22ce6 HTTP/1.1", host: "localhost:9001" +2025/08/19 07:49:21 [debug] 331230#331230: *4 http finalize request: 404, "/21fc30dac4c95ad4b26eb78d97cb31a0cb4bc69f30c0d4195f7685ac13b22ce6.md=404?" a:1, c:2 +2025/08/19 07:49:21 [debug] 331230#331230: *4 http special response: 404, "/21fc30dac4c95ad4b26eb78d97cb31a0cb4bc69f30c0d4195f7685ac13b22ce6.md=404?" +2025/08/19 07:49:21 [debug] 331230#331230: *4 http set discard body +2025/08/19 07:49:21 [debug] 331230#331230: *4 HTTP/1.1 404 Not Found +Server: nginx/1.18.0 (Ubuntu) +Date: Tue, 19 Aug 2025 11:49:21 GMT +Content-Type: text/html +Content-Length: 162 +Connection: keep-alive + +2025/08/19 07:49:21 [debug] 331230#331230: *4 write new buf t:1 f:0 000062986E502DB0, pos 000062986E502DB0, size: 164 file: 0, size: 0 +2025/08/19 07:49:21 [debug] 331230#331230: *4 http write filter: l:0 f:0 s:164 +2025/08/19 07:49:21 [debug] 331230#331230: *4 http output filter "/21fc30dac4c95ad4b26eb78d97cb31a0cb4bc69f30c0d4195f7685ac13b22ce6.md=404?" +2025/08/19 07:49:21 [debug] 331230#331230: *4 http copy filter: "/21fc30dac4c95ad4b26eb78d97cb31a0cb4bc69f30c0d4195f7685ac13b22ce6.md=404?" +2025/08/19 07:49:21 [debug] 331230#331230: *4 http postpone filter "/21fc30dac4c95ad4b26eb78d97cb31a0cb4bc69f30c0d4195f7685ac13b22ce6.md=404?" 000062986E502F90 +2025/08/19 07:49:21 [debug] 331230#331230: *4 write old buf t:1 f:0 000062986E502DB0, pos 000062986E502DB0, size: 164 file: 0, size: 0 +2025/08/19 07:49:21 [debug] 331230#331230: *4 write new buf t:0 f:0 0000000000000000, pos 000062986229C580, size: 100 file: 0, size: 0 +2025/08/19 07:49:21 [debug] 331230#331230: *4 write new buf t:0 f:0 0000000000000000, pos 000062986229CC80, size: 62 file: 0, size: 0 +2025/08/19 07:49:21 [debug] 331230#331230: *4 http write filter: l:1 f:0 s:326 +2025/08/19 07:49:21 [debug] 331230#331230: *4 http write filter limit 0 +2025/08/19 07:49:21 [debug] 331230#331230: *4 writev: 326 of 326 +2025/08/19 07:49:21 [debug] 331230#331230: *4 http write filter 0000000000000000 +2025/08/19 07:49:21 [debug] 331230#331230: *4 http copy filter: 0 "/21fc30dac4c95ad4b26eb78d97cb31a0cb4bc69f30c0d4195f7685ac13b22ce6.md=404?" +2025/08/19 07:49:21 [debug] 331230#331230: *4 http finalize request: 0, "/21fc30dac4c95ad4b26eb78d97cb31a0cb4bc69f30c0d4195f7685ac13b22ce6.md=404?" a:1, c:2 +2025/08/19 07:49:21 [debug] 331230#331230: *4 http request count:2 blk:0 +2025/08/19 07:49:21 [debug] 331230#331230: *4 http finalize request: -4, "/21fc30dac4c95ad4b26eb78d97cb31a0cb4bc69f30c0d4195f7685ac13b22ce6.md=404?" a:1, c:1 +2025/08/19 07:49:21 [debug] 331230#331230: *4 set http keepalive handler +2025/08/19 07:49:21 [debug] 331230#331230: *4 http close request +2025/08/19 07:49:21 [debug] 331230#331230: *4 http log handler +2025/08/19 07:49:21 [debug] 331230#331230: *4 free: 000062986E50C610, unused: 0 +2025/08/19 07:49:21 [debug] 331230#331230: *4 free: 000062986E502980, unused: 2296 +2025/08/19 07:49:21 [debug] 331230#331230: *4 free: 000062986E4F10A0 +2025/08/19 07:49:21 [debug] 331230#331230: *4 hc free: 0000000000000000 +2025/08/19 07:49:21 [debug] 331230#331230: *4 hc busy: 0000000000000000 0 +2025/08/19 07:49:21 [debug] 331230#331230: *4 tcp_nodelay +2025/08/19 07:49:21 [debug] 331230#331230: *4 reusable connection: 1 +2025/08/19 07:49:21 [debug] 331230#331230: *4 event timer add: 6: 65000:170959750 +2025/08/19 07:49:21 [debug] 331230#331230: timer delta: 0 +2025/08/19 07:49:21 [debug] 331230#331230: worker cycle +2025/08/19 07:49:21 [debug] 331230#331230: epoll timer: 65000 +2025/08/19 07:49:21 [debug] 331230#331230: epoll: fd:6 ev:2001 d:000072AACC0A51E1 +2025/08/19 07:49:21 [debug] 331230#331230: *4 http keepalive handler +2025/08/19 07:49:21 [debug] 331230#331230: *4 malloc: 000062986E4F10A0:1024 +2025/08/19 07:49:21 [debug] 331230#331230: *4 recv: eof:1, avail:-1 +2025/08/19 07:49:21 [debug] 331230#331230: *4 recv: fd:6 0 of 1024 +2025/08/19 07:49:21 [info] 331230#331230: *4 client 127.0.0.1 closed keepalive connection +2025/08/19 07:49:21 [debug] 331230#331230: *4 close http connection: 6 +2025/08/19 07:49:21 [debug] 331230#331230: *4 event timer del: 6: 170959750 +2025/08/19 07:49:21 [debug] 331230#331230: *4 reusable connection: 0 +2025/08/19 07:49:21 [debug] 331230#331230: *4 free: 000062986E4F10A0 +2025/08/19 07:49:21 [debug] 331230#331230: *4 free: 000062986E4EE840, unused: 136 +2025/08/19 07:49:21 [debug] 331230#331230: timer delta: 1 +2025/08/19 07:49:21 [debug] 331230#331230: worker cycle +2025/08/19 07:49:21 [debug] 331230#331230: epoll timer: -1 +2025/08/19 07:51:54 [debug] 331230#331230: epoll: fd:5 ev:0001 d:000072AACC0A5010 +2025/08/19 07:51:54 [debug] 331230#331230: accept on 0.0.0.0:9001, ready: 0 +2025/08/19 07:51:54 [debug] 331230#331230: posix_memalign: 000062986E4EE840:512 @16 +2025/08/19 07:51:54 [debug] 331230#331230: *5 accept: 127.0.0.1:52650 fd:6 +2025/08/19 07:51:54 [debug] 331230#331230: *5 event timer add: 6: 60000:171107196 +2025/08/19 07:51:54 [debug] 331230#331230: *5 reusable connection: 1 +2025/08/19 07:51:54 [debug] 331230#331230: *5 epoll add event: fd:6 op:1 ev:80002001 +2025/08/19 07:51:54 [debug] 331230#331230: timer delta: 152445 +2025/08/19 07:51:54 [debug] 331230#331230: worker cycle +2025/08/19 07:51:54 [debug] 331230#331230: epoll timer: 60000 +2025/08/19 07:51:54 [debug] 331230#331230: epoll: fd:6 ev:0001 d:000072AACC0A51E0 +2025/08/19 07:51:54 [debug] 331230#331230: *5 http wait request handler +2025/08/19 07:51:54 [debug] 331230#331230: *5 malloc: 000062986E4F10A0:1024 +2025/08/19 07:51:54 [debug] 331230#331230: *5 recv: eof:0, avail:-1 +2025/08/19 07:51:54 [debug] 331230#331230: *5 recv: fd:6 856 of 1024 +2025/08/19 07:51:54 [debug] 331230#331230: *5 reusable connection: 0 +2025/08/19 07:51:54 [debug] 331230#331230: *5 posix_memalign: 000062986E50C610:4096 @16 +2025/08/19 07:51:54 [debug] 331230#331230: *5 http process request line +2025/08/19 07:51:54 [debug] 331230#331230: *5 http request line: "GET /708d0e8226ec17b0585417c0ec9352ce5f52c3820c904b7066fe20b00f2d9cfe.webp HTTP/1.1" +2025/08/19 07:51:54 [debug] 331230#331230: *5 http uri: "/708d0e8226ec17b0585417c0ec9352ce5f52c3820c904b7066fe20b00f2d9cfe.webp" +2025/08/19 07:51:54 [debug] 331230#331230: *5 http args: "" +2025/08/19 07:51:54 [debug] 331230#331230: *5 http exten: "webp" +2025/08/19 07:51:54 [debug] 331230#331230: *5 posix_memalign: 000062986E502980:4096 @16 +2025/08/19 07:51:54 [debug] 331230#331230: *5 http process request header line +2025/08/19 07:51:54 [debug] 331230#331230: *5 http header: "Host: localhost:9001" +2025/08/19 07:51:54 [debug] 331230#331230: *5 http header: "Connection: keep-alive" +2025/08/19 07:51:54 [debug] 331230#331230: *5 http header: "Cache-Control: max-age=0" +2025/08/19 07:51:54 [debug] 331230#331230: *5 http header: "sec-ch-ua: "Not)A;Brand";v="8", "Chromium";v="138", "Brave";v="138"" +2025/08/19 07:51:54 [debug] 331230#331230: *5 http header: "sec-ch-ua-mobile: ?0" +2025/08/19 07:51:54 [debug] 331230#331230: *5 http header: "sec-ch-ua-platform: "Linux"" +2025/08/19 07:51:54 [debug] 331230#331230: *5 http header: "Upgrade-Insecure-Requests: 1" +2025/08/19 07:51:54 [debug] 331230#331230: *5 http header: "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/138.0.0.0 Safari/537.36" +2025/08/19 07:51:54 [debug] 331230#331230: *5 http header: "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8" +2025/08/19 07:51:54 [debug] 331230#331230: *5 http header: "Sec-GPC: 1" +2025/08/19 07:51:54 [debug] 331230#331230: *5 http header: "Accept-Language: en-US,en;q=0.7" +2025/08/19 07:51:54 [debug] 331230#331230: *5 http header: "Sec-Fetch-Site: none" +2025/08/19 07:51:54 [debug] 331230#331230: *5 http header: "Sec-Fetch-Mode: navigate" +2025/08/19 07:51:54 [debug] 331230#331230: *5 http header: "Sec-Fetch-User: ?1" +2025/08/19 07:51:54 [debug] 331230#331230: *5 http header: "Sec-Fetch-Dest: document" +2025/08/19 07:51:54 [debug] 331230#331230: *5 http header: "Accept-Encoding: gzip, deflate, br, zstd" +2025/08/19 07:51:54 [debug] 331230#331230: *5 http header: "Cookie: _session=F9fhtKLJEDy-FOQnvLfoKCbvoOlPmSPR13KDiYmtQ--" +2025/08/19 07:51:54 [debug] 331230#331230: *5 http header: "If-None-Match: "68a3b183-31c6e"" +2025/08/19 07:51:54 [debug] 331230#331230: *5 http header: "If-Modified-Since: Mon, 18 Aug 2025 23:04:35 GMT" +2025/08/19 07:51:54 [debug] 331230#331230: *5 http header done +2025/08/19 07:51:54 [debug] 331230#331230: *5 event timer del: 6: 171107196 +2025/08/19 07:51:54 [debug] 331230#331230: *5 generic phase: 0 +2025/08/19 07:51:54 [debug] 331230#331230: *5 rewrite phase: 1 +2025/08/19 07:51:54 [debug] 331230#331230: *5 test location: "/debug/list" +2025/08/19 07:51:54 [debug] 331230#331230: *5 test location: "/" +2025/08/19 07:51:54 [debug] 331230#331230: *5 test location: ~ "^/([a-f0-9]{64})(\.[a-zA-Z0-9]+)?$" +2025/08/19 07:51:54 [debug] 331230#331230: *5 using configuration "^/([a-f0-9]{64})(\.[a-zA-Z0-9]+)?$" +2025/08/19 07:51:54 [debug] 331230#331230: *5 http cl:-1 max:104857600 +2025/08/19 07:51:54 [debug] 331230#331230: *5 rewrite phase: 3 +2025/08/19 07:51:54 [debug] 331230#331230: *5 http script var +2025/08/19 07:51:54 [debug] 331230#331230: *5 http script var: "GET" +2025/08/19 07:51:54 [debug] 331230#331230: *5 http script value: "HEAD" +2025/08/19 07:51:54 [debug] 331230#331230: *5 http script equal +2025/08/19 07:51:54 [debug] 331230#331230: *5 http script equal: no +2025/08/19 07:51:54 [debug] 331230#331230: *5 http script if +2025/08/19 07:51:54 [debug] 331230#331230: *5 http script if: false +2025/08/19 07:51:54 [debug] 331230#331230: *5 post rewrite phase: 4 +2025/08/19 07:51:54 [debug] 331230#331230: *5 generic phase: 5 +2025/08/19 07:51:54 [debug] 331230#331230: *5 generic phase: 6 +2025/08/19 07:51:54 [debug] 331230#331230: *5 generic phase: 7 +2025/08/19 07:51:54 [debug] 331230#331230: *5 access phase: 8 +2025/08/19 07:51:54 [debug] 331230#331230: *5 access phase: 9 +2025/08/19 07:51:54 [debug] 331230#331230: *5 access phase: 10 +2025/08/19 07:51:54 [debug] 331230#331230: *5 post access phase: 11 +2025/08/19 07:51:54 [debug] 331230#331230: *5 generic phase: 12 +2025/08/19 07:51:54 [debug] 331230#331230: *5 try files handler +2025/08/19 07:51:54 [debug] 331230#331230: *5 http script copy: "/" +2025/08/19 07:51:54 [debug] 331230#331230: *5 http script capture: "708d0e8226ec17b0585417c0ec9352ce5f52c3820c904b7066fe20b00f2d9cfe" +2025/08/19 07:51:54 [debug] 331230#331230: *5 http script copy: ".jpg" +2025/08/19 07:51:54 [debug] 331230#331230: *5 trying to use file: "/708d0e8226ec17b0585417c0ec9352ce5f52c3820c904b7066fe20b00f2d9cfe.jpg" "./blobs/708d0e8226ec17b0585417c0ec9352ce5f52c3820c904b7066fe20b00f2d9cfe.jpg" +2025/08/19 07:51:54 [debug] 331230#331230: *5 http script copy: "/" +2025/08/19 07:51:54 [debug] 331230#331230: *5 http script capture: "708d0e8226ec17b0585417c0ec9352ce5f52c3820c904b7066fe20b00f2d9cfe" +2025/08/19 07:51:54 [debug] 331230#331230: *5 http script copy: ".jpeg" +2025/08/19 07:51:54 [debug] 331230#331230: *5 trying to use file: "/708d0e8226ec17b0585417c0ec9352ce5f52c3820c904b7066fe20b00f2d9cfe.jpeg" "./blobs/708d0e8226ec17b0585417c0ec9352ce5f52c3820c904b7066fe20b00f2d9cfe.jpeg" +2025/08/19 07:51:54 [debug] 331230#331230: *5 http script copy: "/" +2025/08/19 07:51:54 [debug] 331230#331230: *5 http script capture: "708d0e8226ec17b0585417c0ec9352ce5f52c3820c904b7066fe20b00f2d9cfe" +2025/08/19 07:51:54 [debug] 331230#331230: *5 http script copy: ".png" +2025/08/19 07:51:54 [debug] 331230#331230: *5 trying to use file: "/708d0e8226ec17b0585417c0ec9352ce5f52c3820c904b7066fe20b00f2d9cfe.png" "./blobs/708d0e8226ec17b0585417c0ec9352ce5f52c3820c904b7066fe20b00f2d9cfe.png" +2025/08/19 07:51:54 [debug] 331230#331230: *5 http script copy: "/" +2025/08/19 07:51:54 [debug] 331230#331230: *5 http script capture: "708d0e8226ec17b0585417c0ec9352ce5f52c3820c904b7066fe20b00f2d9cfe" +2025/08/19 07:51:54 [debug] 331230#331230: *5 http script copy: ".webp" +2025/08/19 07:51:54 [debug] 331230#331230: *5 trying to use file: "/708d0e8226ec17b0585417c0ec9352ce5f52c3820c904b7066fe20b00f2d9cfe.webp" "./blobs/708d0e8226ec17b0585417c0ec9352ce5f52c3820c904b7066fe20b00f2d9cfe.webp" +2025/08/19 07:51:54 [debug] 331230#331230: *5 try file uri: "/708d0e8226ec17b0585417c0ec9352ce5f52c3820c904b7066fe20b00f2d9cfe.webp" +2025/08/19 07:51:54 [debug] 331230#331230: *5 generic phase: 13 +2025/08/19 07:51:54 [debug] 331230#331230: *5 content phase: 14 +2025/08/19 07:51:54 [debug] 331230#331230: *5 content phase: 15 +2025/08/19 07:51:54 [debug] 331230#331230: *5 content phase: 16 +2025/08/19 07:51:54 [debug] 331230#331230: *5 content phase: 17 +2025/08/19 07:51:54 [debug] 331230#331230: *5 content phase: 18 +2025/08/19 07:51:54 [debug] 331230#331230: *5 http filename: "./blobs/708d0e8226ec17b0585417c0ec9352ce5f52c3820c904b7066fe20b00f2d9cfe.webp" +2025/08/19 07:51:54 [debug] 331230#331230: *5 add cleanup: 000062986E502E10 +2025/08/19 07:51:54 [debug] 331230#331230: *5 http static fd: 10 +2025/08/19 07:51:54 [debug] 331230#331230: *5 http set discard body +2025/08/19 07:51:54 [debug] 331230#331230: *5 http ims:1755558275 lm:1755558275 +2025/08/19 07:51:54 [debug] 331230#331230: *5 http im:""68a3b183-31c6e"" etag:"68a3b183-31c6e" +2025/08/19 07:51:54 [debug] 331230#331230: *5 HTTP/1.1 304 Not Modified +Server: nginx/1.18.0 (Ubuntu) +Date: Tue, 19 Aug 2025 11:51:54 GMT +Last-Modified: Mon, 18 Aug 2025 23:04:35 GMT +Connection: keep-alive +ETag: "68a3b183-31c6e" +Cache-Control: public, max-age=31536000, immutable +X-Content-Type-Options: nosniff +X-Frame-Options: DENY +X-XSS-Protection: 1; mode=block + +2025/08/19 07:51:54 [debug] 331230#331230: *5 write new buf t:1 f:0 000062986E502FF8, pos 000062986E502FF8, size: 332 file: 0, size: 0 +2025/08/19 07:51:54 [debug] 331230#331230: *5 http write filter: l:1 f:0 s:332 +2025/08/19 07:51:54 [debug] 331230#331230: *5 http write filter limit 0 +2025/08/19 07:51:54 [debug] 331230#331230: *5 writev: 332 of 332 +2025/08/19 07:51:54 [debug] 331230#331230: *5 http write filter 0000000000000000 +2025/08/19 07:51:54 [debug] 331230#331230: *5 http finalize request: 0, "/708d0e8226ec17b0585417c0ec9352ce5f52c3820c904b7066fe20b00f2d9cfe.webp?" a:1, c:1 +2025/08/19 07:51:54 [debug] 331230#331230: *5 set http keepalive handler +2025/08/19 07:51:54 [debug] 331230#331230: *5 http close request +2025/08/19 07:51:54 [debug] 331230#331230: *5 http log handler +2025/08/19 07:51:54 [debug] 331230#331230: *5 run cleanup: 000062986E502E10 +2025/08/19 07:51:54 [debug] 331230#331230: *5 file cleanup: fd:10 +2025/08/19 07:51:54 [debug] 331230#331230: *5 free: 000062986E50C610, unused: 0 +2025/08/19 07:51:54 [debug] 331230#331230: *5 free: 000062986E502980, unused: 1809 +2025/08/19 07:51:54 [debug] 331230#331230: *5 free: 000062986E4F10A0 +2025/08/19 07:51:54 [debug] 331230#331230: *5 hc free: 0000000000000000 +2025/08/19 07:51:54 [debug] 331230#331230: *5 hc busy: 0000000000000000 0 +2025/08/19 07:51:54 [debug] 331230#331230: *5 tcp_nodelay +2025/08/19 07:51:54 [debug] 331230#331230: *5 reusable connection: 1 +2025/08/19 07:51:54 [debug] 331230#331230: *5 event timer add: 6: 65000:171112196 +2025/08/19 07:51:54 [debug] 331230#331230: timer delta: 0 +2025/08/19 07:51:54 [debug] 331230#331230: worker cycle +2025/08/19 07:51:54 [debug] 331230#331230: epoll timer: 65000 +2025/08/19 07:52:52 [notice] 331230#331230: signal 15 (SIGTERM) received from 348604, exiting +2025/08/19 07:52:52 [notice] 331229#331229: signal 15 (SIGTERM) received from 348604, exiting +2025/08/19 07:52:52 [info] 331230#331230: epoll_wait() failed (4: Interrupted system call) +2025/08/19 07:52:52 [debug] 331230#331230: timer delta: 58582 +2025/08/19 07:52:52 [notice] 331230#331230: exiting +2025/08/19 07:52:52 [debug] 331230#331230: flush files +2025/08/19 07:52:52 [debug] 331229#331229: wake up, sigio 0 +2025/08/19 07:52:52 [debug] 331230#331230: run cleanup: 000062986E528A78 +2025/08/19 07:52:52 [debug] 331229#331229: child: 0 331230 e:0 t:0 d:0 r:1 j:0 +2025/08/19 07:52:52 [debug] 331230#331230: run cleanup: 000062986E521E80 +2025/08/19 07:52:52 [debug] 331230#331230: cleanup resolver +2025/08/19 07:52:52 [debug] 331230#331230: free: 000062986E52B7B0 +2025/08/19 07:52:52 [debug] 331229#331229: termination cycle: 50 +2025/08/19 07:52:52 [debug] 331230#331230: free: 000062986E522680 +2025/08/19 07:52:52 [debug] 331229#331229: sigsuspend +2025/08/19 07:52:52 [debug] 331230#331230: free: 000062986E511630 +2025/08/19 07:52:52 [debug] 331230#331230: free: 000062986E50B600 +2025/08/19 07:52:52 [debug] 331230#331230: free: 000062986E506530 +2025/08/19 07:52:52 [debug] 331230#331230: free: 000062986E505470 +2025/08/19 07:52:52 [debug] 331230#331230: free: 000062986E5043B0 +2025/08/19 07:52:52 [debug] 331230#331230: free: 000062986E4F4130, unused: 0 +2025/08/19 07:52:52 [debug] 331230#331230: free: 000062986E4FD160, unused: 0 +2025/08/19 07:52:52 [debug] 331230#331230: free: 000062986E5075F0, unused: 0 +2025/08/19 07:52:52 [debug] 331230#331230: free: 000062986E50D620, unused: 0 +2025/08/19 07:52:52 [debug] 331230#331230: free: 000062986E512640, unused: 0 +2025/08/19 07:52:52 [debug] 331230#331230: free: 000062986E516650, unused: 0 +2025/08/19 07:52:52 [debug] 331230#331230: free: 000062986E51A660, unused: 0 +2025/08/19 07:52:52 [debug] 331230#331230: free: 000062986E51E670, unused: 0 +2025/08/19 07:52:52 [debug] 331230#331230: free: 000062986E523790, unused: 8 +2025/08/19 07:52:52 [debug] 331230#331230: free: 000062986E5277A0, unused: 11536 +2025/08/19 07:52:52 [notice] 331230#331230: exit +2025/08/19 07:52:52 [notice] 331229#331229: signal 17 (SIGCHLD) received from 331230 +2025/08/19 07:52:52 [notice] 331229#331229: worker process 331230 exited with code 0 +2025/08/19 07:52:52 [debug] 331229#331229: shmtx forced unlock +2025/08/19 07:52:52 [debug] 331229#331229: wake up, sigio 3 +2025/08/19 07:52:52 [debug] 331229#331229: reap children +2025/08/19 07:52:52 [debug] 331229#331229: child: 0 331230 e:1 t:1 d:0 r:1 j:0 +2025/08/19 07:52:52 [notice] 331229#331229: exit +2025/08/19 07:52:52 [debug] 331229#331229: close listening 0.0.0.0:9001 #5 +2025/08/19 07:52:52 [debug] 331229#331229: run cleanup: 000062986E521E80 +2025/08/19 07:52:52 [debug] 331229#331229: cleanup resolver +2025/08/19 07:52:52 [debug] 331229#331229: free: 000062986E52B7B0 +2025/08/19 07:52:52 [debug] 331229#331229: free: 000062986E522680 +2025/08/19 07:52:52 [debug] 331229#331229: free: 000062986E511630 +2025/08/19 07:52:52 [debug] 331229#331229: free: 000062986E50B600 +2025/08/19 07:52:52 [debug] 331229#331229: free: 000062986E506530 +2025/08/19 07:52:52 [debug] 331229#331229: free: 000062986E505470 +2025/08/19 07:52:52 [debug] 331229#331229: free: 000062986E5043B0 +2025/08/19 07:52:52 [debug] 331229#331229: free: 000062986E4F4130, unused: 0 +2025/08/19 07:52:52 [debug] 331229#331229: free: 000062986E4FD160, unused: 0 +2025/08/19 07:52:52 [debug] 331229#331229: free: 000062986E5075F0, unused: 0 +2025/08/19 07:52:52 [debug] 331229#331229: free: 000062986E50D620, unused: 0 +2025/08/19 07:52:52 [debug] 331229#331229: free: 000062986E512640, unused: 0 +2025/08/19 07:52:52 [debug] 331229#331229: free: 000062986E516650, unused: 0 +2025/08/19 07:52:52 [debug] 331229#331229: free: 000062986E51A660, unused: 0 +2025/08/19 07:52:52 [debug] 331229#331229: free: 000062986E51E670, unused: 0 +2025/08/19 07:52:52 [debug] 331229#331229: free: 000062986E523790, unused: 8 +2025/08/19 07:52:52 [debug] 331229#331229: free: 000062986E5277A0, unused: 11567 +2025/08/19 07:57:39 [debug] 349769#349769: bind() 0.0.0.0:9001 #5 +2025/08/19 07:57:39 [notice] 349769#349769: using the "epoll" event method +2025/08/19 07:57:39 [debug] 349769#349769: counter: 000075EA428D9080, 1 +2025/08/19 07:57:39 [notice] 349769#349769: nginx/1.18.0 (Ubuntu) +2025/08/19 07:57:39 [notice] 349769#349769: OS: Linux 6.12.10-76061203-generic +2025/08/19 07:57:39 [notice] 349769#349769: getrlimit(RLIMIT_NOFILE): 1048576:1048576 +2025/08/19 07:57:39 [debug] 349770#349769: write: 6, 00007FFDD38FD630, 7, 0 +2025/08/19 07:57:39 [debug] 349770#349770: setproctitle: "nginx: master process nginx -p . -c config/local-nginx.conf" +2025/08/19 07:57:39 [notice] 349770#349770: start worker processes +2025/08/19 07:57:39 [debug] 349770#349770: channel 6:7 +2025/08/19 07:57:39 [notice] 349770#349770: start worker process 349771 +2025/08/19 07:57:39 [debug] 349770#349770: sigsuspend +2025/08/19 07:57:39 [debug] 349771#349771: add cleanup: 00005CE043647A48 +2025/08/19 07:57:39 [debug] 349771#349771: malloc: 00005CE043607BD0:8 +2025/08/19 07:57:39 [debug] 349771#349771: notify eventfd: 9 +2025/08/19 07:57:39 [debug] 349771#349771: testing the EPOLLRDHUP flag: success +2025/08/19 07:57:39 [debug] 349771#349771: malloc: 00005CE043619170:6144 +2025/08/19 07:57:39 [debug] 349771#349771: malloc: 000075EA426D1010:237568 +2025/08/19 07:57:39 [debug] 349771#349771: malloc: 00005CE04364A260:98304 +2025/08/19 07:57:39 [debug] 349771#349771: malloc: 00005CE043662270:98304 +2025/08/19 07:57:39 [debug] 349771#349771: epoll add event: fd:5 op:1 ev:00002001 +2025/08/19 07:57:39 [debug] 349771#349771: epoll add event: fd:7 op:1 ev:00002001 +2025/08/19 07:57:39 [debug] 349771#349771: setproctitle: "nginx: worker process" +2025/08/19 07:57:39 [debug] 349771#349771: worker cycle +2025/08/19 07:57:39 [debug] 349771#349771: epoll timer: -1 +2025/08/19 07:57:47 [debug] 349771#349771: epoll: fd:5 ev:0001 d:000075EA426D1010 +2025/08/19 07:57:47 [debug] 349771#349771: accept on 0.0.0.0:9001, ready: 0 +2025/08/19 07:57:47 [debug] 349771#349771: posix_memalign: 00005CE043606840:512 @16 +2025/08/19 07:57:47 [debug] 349771#349771: *1 accept: 127.0.0.1:52854 fd:6 +2025/08/19 07:57:47 [debug] 349771#349771: *1 event timer add: 6: 60000:171460950 +2025/08/19 07:57:47 [debug] 349771#349771: *1 reusable connection: 1 +2025/08/19 07:57:47 [debug] 349771#349771: *1 epoll add event: fd:6 op:1 ev:80002001 +2025/08/19 07:57:47 [debug] 349771#349771: timer delta: 8409 +2025/08/19 07:57:47 [debug] 349771#349771: worker cycle +2025/08/19 07:57:47 [debug] 349771#349771: epoll timer: 60000 +2025/08/19 07:57:47 [debug] 349771#349771: epoll: fd:6 ev:0001 d:000075EA426D11E0 +2025/08/19 07:57:47 [debug] 349771#349771: *1 http wait request handler +2025/08/19 07:57:47 [debug] 349771#349771: *1 malloc: 00005CE0436090A0:1024 +2025/08/19 07:57:47 [debug] 349771#349771: *1 recv: eof:0, avail:-1 +2025/08/19 07:57:47 [debug] 349771#349771: *1 recv: fd:6 84 of 1024 +2025/08/19 07:57:47 [debug] 349771#349771: *1 reusable connection: 0 +2025/08/19 07:57:47 [debug] 349771#349771: *1 posix_memalign: 00005CE043624610:4096 @16 +2025/08/19 07:57:47 [debug] 349771#349771: *1 http process request line +2025/08/19 07:57:47 [debug] 349771#349771: *1 http request line: "GET /health HTTP/1.1" +2025/08/19 07:57:47 [debug] 349771#349771: *1 http uri: "/health" +2025/08/19 07:57:47 [debug] 349771#349771: *1 http args: "" +2025/08/19 07:57:47 [debug] 349771#349771: *1 http exten: "" +2025/08/19 07:57:47 [debug] 349771#349771: *1 posix_memalign: 00005CE04361A980:4096 @16 +2025/08/19 07:57:47 [debug] 349771#349771: *1 http process request header line +2025/08/19 07:57:47 [debug] 349771#349771: *1 http header: "Host: localhost:9001" +2025/08/19 07:57:47 [debug] 349771#349771: *1 http header: "User-Agent: curl/8.15.0" +2025/08/19 07:57:47 [debug] 349771#349771: *1 http header: "Accept: */*" +2025/08/19 07:57:47 [debug] 349771#349771: *1 http header done +2025/08/19 07:57:47 [debug] 349771#349771: *1 event timer del: 6: 171460950 +2025/08/19 07:57:47 [debug] 349771#349771: *1 generic phase: 0 +2025/08/19 07:57:47 [debug] 349771#349771: *1 rewrite phase: 1 +2025/08/19 07:57:47 [debug] 349771#349771: *1 test location: "/health" +2025/08/19 07:57:47 [debug] 349771#349771: *1 test location: ~ "^/([a-f0-9]{64})(\.[a-zA-Z0-9]+)?$" +2025/08/19 07:57:47 [debug] 349771#349771: *1 test location: ~ "^/fcgi-head/([a-f0-9]{64}).*$" +2025/08/19 07:57:47 [debug] 349771#349771: *1 using configuration "/health" +2025/08/19 07:57:47 [debug] 349771#349771: *1 http cl:-1 max:104857600 +2025/08/19 07:57:47 [debug] 349771#349771: *1 rewrite phase: 3 +2025/08/19 07:57:47 [debug] 349771#349771: *1 http set discard body +2025/08/19 07:57:47 [debug] 349771#349771: *1 HTTP/1.1 200 OK +Server: nginx/1.18.0 (Ubuntu) +Date: Tue, 19 Aug 2025 11:57:47 GMT +Content-Type: application/octet-stream +Content-Length: 3 +Connection: keep-alive +Content-Type: text/plain + +2025/08/19 07:57:47 [debug] 349771#349771: *1 write new buf t:1 f:0 00005CE04361AD60, pos 00005CE04361AD60, size: 196 file: 0, size: 0 +2025/08/19 07:57:47 [debug] 349771#349771: *1 http write filter: l:0 f:0 s:196 +2025/08/19 07:57:47 [debug] 349771#349771: *1 http output filter "/health?" +2025/08/19 07:57:47 [debug] 349771#349771: *1 http copy filter: "/health?" +2025/08/19 07:57:47 [debug] 349771#349771: *1 http postpone filter "/health?" 00007FFDD38FD1C0 +2025/08/19 07:57:47 [debug] 349771#349771: *1 write old buf t:1 f:0 00005CE04361AD60, pos 00005CE04361AD60, size: 196 file: 0, size: 0 +2025/08/19 07:57:47 [debug] 349771#349771: *1 write new buf t:0 f:0 0000000000000000, pos 00005CE04363AD7A, size: 3 file: 0, size: 0 +2025/08/19 07:57:47 [debug] 349771#349771: *1 http write filter: l:1 f:0 s:199 +2025/08/19 07:57:47 [debug] 349771#349771: *1 http write filter limit 0 +2025/08/19 07:57:47 [debug] 349771#349771: *1 writev: 199 of 199 +2025/08/19 07:57:47 [debug] 349771#349771: *1 http write filter 0000000000000000 +2025/08/19 07:57:47 [debug] 349771#349771: *1 http copy filter: 0 "/health?" +2025/08/19 07:57:47 [debug] 349771#349771: *1 http finalize request: 0, "/health?" a:1, c:1 +2025/08/19 07:57:47 [debug] 349771#349771: *1 set http keepalive handler +2025/08/19 07:57:47 [debug] 349771#349771: *1 http close request +2025/08/19 07:57:47 [debug] 349771#349771: *1 http log handler +2025/08/19 07:57:47 [debug] 349771#349771: *1 free: 00005CE043624610, unused: 0 +2025/08/19 07:57:47 [debug] 349771#349771: *1 free: 00005CE04361A980, unused: 2736 +2025/08/19 07:57:47 [debug] 349771#349771: *1 free: 00005CE0436090A0 +2025/08/19 07:57:47 [debug] 349771#349771: *1 hc free: 0000000000000000 +2025/08/19 07:57:47 [debug] 349771#349771: *1 hc busy: 0000000000000000 0 +2025/08/19 07:57:47 [debug] 349771#349771: *1 tcp_nodelay +2025/08/19 07:57:47 [debug] 349771#349771: *1 reusable connection: 1 +2025/08/19 07:57:47 [debug] 349771#349771: *1 event timer add: 6: 65000:171465951 +2025/08/19 07:57:47 [debug] 349771#349771: timer delta: 1 +2025/08/19 07:57:47 [debug] 349771#349771: worker cycle +2025/08/19 07:57:47 [debug] 349771#349771: epoll timer: 65000 +2025/08/19 07:57:47 [debug] 349771#349771: epoll: fd:6 ev:2001 d:000075EA426D11E0 +2025/08/19 07:57:47 [debug] 349771#349771: *1 http keepalive handler +2025/08/19 07:57:47 [debug] 349771#349771: *1 malloc: 00005CE0436090A0:1024 +2025/08/19 07:57:47 [debug] 349771#349771: *1 recv: eof:1, avail:-1 +2025/08/19 07:57:47 [debug] 349771#349771: *1 recv: fd:6 0 of 1024 +2025/08/19 07:57:47 [info] 349771#349771: *1 client 127.0.0.1 closed keepalive connection +2025/08/19 07:57:47 [debug] 349771#349771: *1 close http connection: 6 +2025/08/19 07:57:47 [debug] 349771#349771: *1 event timer del: 6: 171465951 +2025/08/19 07:57:47 [debug] 349771#349771: *1 reusable connection: 0 +2025/08/19 07:57:47 [debug] 349771#349771: *1 free: 00005CE0436090A0 +2025/08/19 07:57:47 [debug] 349771#349771: *1 free: 00005CE043606840, unused: 136 +2025/08/19 07:57:47 [debug] 349771#349771: timer delta: 1 +2025/08/19 07:57:47 [debug] 349771#349771: worker cycle +2025/08/19 07:57:47 [debug] 349771#349771: epoll timer: -1 +2025/08/19 07:57:54 [debug] 349771#349771: epoll: fd:5 ev:0001 d:000075EA426D1010 +2025/08/19 07:57:54 [debug] 349771#349771: accept on 0.0.0.0:9001, ready: 0 +2025/08/19 07:57:54 [debug] 349771#349771: posix_memalign: 00005CE043606840:512 @16 +2025/08/19 07:57:54 [debug] 349771#349771: *2 accept: 127.0.0.1:33320 fd:6 +2025/08/19 07:57:54 [debug] 349771#349771: *2 event timer add: 6: 60000:171467745 +2025/08/19 07:57:54 [debug] 349771#349771: *2 reusable connection: 1 +2025/08/19 07:57:54 [debug] 349771#349771: *2 epoll add event: fd:6 op:1 ev:80002001 +2025/08/19 07:57:54 [debug] 349771#349771: timer delta: 6793 +2025/08/19 07:57:54 [debug] 349771#349771: worker cycle +2025/08/19 07:57:54 [debug] 349771#349771: epoll timer: 60000 +2025/08/19 07:57:54 [debug] 349771#349771: epoll: fd:6 ev:0001 d:000075EA426D11E1 +2025/08/19 07:57:54 [debug] 349771#349771: *2 http wait request handler +2025/08/19 07:57:54 [debug] 349771#349771: *2 malloc: 00005CE0436090A0:1024 +2025/08/19 07:57:54 [debug] 349771#349771: *2 recv: eof:0, avail:-1 +2025/08/19 07:57:54 [debug] 349771#349771: *2 recv: fd:6 84 of 1024 +2025/08/19 07:57:54 [debug] 349771#349771: *2 reusable connection: 0 +2025/08/19 07:57:54 [debug] 349771#349771: *2 posix_memalign: 00005CE043624610:4096 @16 +2025/08/19 07:57:54 [debug] 349771#349771: *2 http process request line +2025/08/19 07:57:54 [debug] 349771#349771: *2 http request line: "GET /health HTTP/1.1" +2025/08/19 07:57:54 [debug] 349771#349771: *2 http uri: "/health" +2025/08/19 07:57:54 [debug] 349771#349771: *2 http args: "" +2025/08/19 07:57:54 [debug] 349771#349771: *2 http exten: "" +2025/08/19 07:57:54 [debug] 349771#349771: *2 posix_memalign: 00005CE04361A980:4096 @16 +2025/08/19 07:57:54 [debug] 349771#349771: *2 http process request header line +2025/08/19 07:57:54 [debug] 349771#349771: *2 http header: "Host: localhost:9001" +2025/08/19 07:57:54 [debug] 349771#349771: *2 http header: "User-Agent: curl/8.15.0" +2025/08/19 07:57:54 [debug] 349771#349771: *2 http header: "Accept: */*" +2025/08/19 07:57:54 [debug] 349771#349771: *2 http header done +2025/08/19 07:57:54 [debug] 349771#349771: *2 event timer del: 6: 171467745 +2025/08/19 07:57:54 [debug] 349771#349771: *2 generic phase: 0 +2025/08/19 07:57:54 [debug] 349771#349771: *2 rewrite phase: 1 +2025/08/19 07:57:54 [debug] 349771#349771: *2 test location: "/health" +2025/08/19 07:57:54 [debug] 349771#349771: *2 test location: ~ "^/([a-f0-9]{64})(\.[a-zA-Z0-9]+)?$" +2025/08/19 07:57:54 [debug] 349771#349771: *2 test location: ~ "^/fcgi-head/([a-f0-9]{64}).*$" +2025/08/19 07:57:54 [debug] 349771#349771: *2 using configuration "/health" +2025/08/19 07:57:54 [debug] 349771#349771: *2 http cl:-1 max:104857600 +2025/08/19 07:57:54 [debug] 349771#349771: *2 rewrite phase: 3 +2025/08/19 07:57:54 [debug] 349771#349771: *2 http set discard body +2025/08/19 07:57:54 [debug] 349771#349771: *2 HTTP/1.1 200 OK +Server: nginx/1.18.0 (Ubuntu) +Date: Tue, 19 Aug 2025 11:57:54 GMT +Content-Type: application/octet-stream +Content-Length: 3 +Connection: keep-alive +Content-Type: text/plain + +2025/08/19 07:57:54 [debug] 349771#349771: *2 write new buf t:1 f:0 00005CE04361AD60, pos 00005CE04361AD60, size: 196 file: 0, size: 0 +2025/08/19 07:57:54 [debug] 349771#349771: *2 http write filter: l:0 f:0 s:196 +2025/08/19 07:57:54 [debug] 349771#349771: *2 http output filter "/health?" +2025/08/19 07:57:54 [debug] 349771#349771: *2 http copy filter: "/health?" +2025/08/19 07:57:54 [debug] 349771#349771: *2 http postpone filter "/health?" 00007FFDD38FD1C0 +2025/08/19 07:57:54 [debug] 349771#349771: *2 write old buf t:1 f:0 00005CE04361AD60, pos 00005CE04361AD60, size: 196 file: 0, size: 0 +2025/08/19 07:57:54 [debug] 349771#349771: *2 write new buf t:0 f:0 0000000000000000, pos 00005CE04363AD7A, size: 3 file: 0, size: 0 +2025/08/19 07:57:54 [debug] 349771#349771: *2 http write filter: l:1 f:0 s:199 +2025/08/19 07:57:54 [debug] 349771#349771: *2 http write filter limit 0 +2025/08/19 07:57:54 [debug] 349771#349771: *2 writev: 199 of 199 +2025/08/19 07:57:54 [debug] 349771#349771: *2 http write filter 0000000000000000 +2025/08/19 07:57:54 [debug] 349771#349771: *2 http copy filter: 0 "/health?" +2025/08/19 07:57:54 [debug] 349771#349771: *2 http finalize request: 0, "/health?" a:1, c:1 +2025/08/19 07:57:54 [debug] 349771#349771: *2 set http keepalive handler +2025/08/19 07:57:54 [debug] 349771#349771: *2 http close request +2025/08/19 07:57:54 [debug] 349771#349771: *2 http log handler +2025/08/19 07:57:54 [debug] 349771#349771: *2 free: 00005CE043624610, unused: 0 +2025/08/19 07:57:54 [debug] 349771#349771: *2 free: 00005CE04361A980, unused: 2736 +2025/08/19 07:57:54 [debug] 349771#349771: *2 free: 00005CE0436090A0 +2025/08/19 07:57:54 [debug] 349771#349771: *2 hc free: 0000000000000000 +2025/08/19 07:57:54 [debug] 349771#349771: *2 hc busy: 0000000000000000 0 +2025/08/19 07:57:54 [debug] 349771#349771: *2 tcp_nodelay +2025/08/19 07:57:54 [debug] 349771#349771: *2 reusable connection: 1 +2025/08/19 07:57:54 [debug] 349771#349771: *2 event timer add: 6: 65000:171472746 +2025/08/19 07:57:54 [debug] 349771#349771: timer delta: 1 +2025/08/19 07:57:54 [debug] 349771#349771: worker cycle +2025/08/19 07:57:54 [debug] 349771#349771: epoll timer: 65000 +2025/08/19 07:57:54 [debug] 349771#349771: epoll: fd:6 ev:2001 d:000075EA426D11E1 +2025/08/19 07:57:54 [debug] 349771#349771: *2 http keepalive handler +2025/08/19 07:57:54 [debug] 349771#349771: *2 malloc: 00005CE0436090A0:1024 +2025/08/19 07:57:54 [debug] 349771#349771: *2 recv: eof:1, avail:-1 +2025/08/19 07:57:54 [debug] 349771#349771: *2 recv: fd:6 0 of 1024 +2025/08/19 07:57:54 [info] 349771#349771: *2 client 127.0.0.1 closed keepalive connection +2025/08/19 07:57:54 [debug] 349771#349771: *2 close http connection: 6 +2025/08/19 07:57:54 [debug] 349771#349771: *2 event timer del: 6: 171472746 +2025/08/19 07:57:54 [debug] 349771#349771: *2 reusable connection: 0 +2025/08/19 07:57:54 [debug] 349771#349771: *2 free: 00005CE0436090A0 +2025/08/19 07:57:54 [debug] 349771#349771: *2 free: 00005CE043606840, unused: 136 +2025/08/19 07:57:54 [debug] 349771#349771: timer delta: 1 +2025/08/19 07:57:54 [debug] 349771#349771: worker cycle +2025/08/19 07:57:54 [debug] 349771#349771: epoll timer: -1 +2025/08/19 07:57:54 [debug] 349771#349771: epoll: fd:5 ev:0001 d:000075EA426D1010 +2025/08/19 07:57:54 [debug] 349771#349771: accept on 0.0.0.0:9001, ready: 0 +2025/08/19 07:57:54 [debug] 349771#349771: posix_memalign: 00005CE043606840:512 @16 +2025/08/19 07:57:54 [debug] 349771#349771: *3 accept: 127.0.0.1:33322 fd:6 +2025/08/19 07:57:54 [debug] 349771#349771: *3 event timer add: 6: 60000:171468057 +2025/08/19 07:57:54 [debug] 349771#349771: *3 reusable connection: 1 +2025/08/19 07:57:54 [debug] 349771#349771: *3 epoll add event: fd:6 op:1 ev:80002001 +2025/08/19 07:57:54 [debug] 349771#349771: timer delta: 310 +2025/08/19 07:57:54 [debug] 349771#349771: worker cycle +2025/08/19 07:57:54 [debug] 349771#349771: epoll timer: 60000 +2025/08/19 07:57:54 [debug] 349771#349771: epoll: fd:6 ev:0001 d:000075EA426D11E0 +2025/08/19 07:57:54 [debug] 349771#349771: *3 http wait request handler +2025/08/19 07:57:54 [debug] 349771#349771: *3 malloc: 00005CE0436090A0:1024 +2025/08/19 07:57:54 [debug] 349771#349771: *3 recv: eof:0, avail:-1 +2025/08/19 07:57:54 [debug] 349771#349771: *3 recv: fd:6 1024 of 1024 +2025/08/19 07:57:54 [debug] 349771#349771: *3 recv: avail:56 +2025/08/19 07:57:54 [debug] 349771#349771: *3 reusable connection: 0 +2025/08/19 07:57:54 [debug] 349771#349771: *3 posix_memalign: 00005CE043624610:4096 @16 +2025/08/19 07:57:54 [debug] 349771#349771: *3 http process request line +2025/08/19 07:57:54 [debug] 349771#349771: *3 http request line: "PUT /upload HTTP/1.1" +2025/08/19 07:57:54 [debug] 349771#349771: *3 http uri: "/upload" +2025/08/19 07:57:54 [debug] 349771#349771: *3 http args: "" +2025/08/19 07:57:54 [debug] 349771#349771: *3 http exten: "" +2025/08/19 07:57:54 [debug] 349771#349771: *3 posix_memalign: 00005CE04361A980:4096 @16 +2025/08/19 07:57:54 [debug] 349771#349771: *3 http process request header line +2025/08/19 07:57:54 [debug] 349771#349771: *3 http header: "Host: localhost:9001" +2025/08/19 07:57:54 [debug] 349771#349771: *3 http header: "User-Agent: curl/8.15.0" +2025/08/19 07:57:54 [debug] 349771#349771: *3 http header: "Accept: */*" +2025/08/19 07:57:54 [debug] 349771#349771: *3 http header: "Authorization: Nostr eyJraW5kIjoyNDI0MiwiaWQiOiIwNDZiN2E3MDBjZTAzZjQ0NGFhYmNkY2Y1NGVlOGM5ZGNhZmJhODhkY2IzNzM2NzYwODFkMDkyOTZkMDU5NGZmIiwicHVia2V5IjoiNzliZTY2N2VmOWRjYmJhYzU1YTA2Mjk1Y2U4NzBiMDcwMjliZmNkYjJkY2UyOGQ5NTlmMjgxNWIxNmY4MTc5OCIsImNyZWF0ZWRfYXQiOjE3NTU2MDQ2NzQsInRhZ3MiOltbInQiLCJ1cGxvYWQiXSxbIngiLCJhZTlmNTljN2FjMzg2YjdmZTYzNDNkNjY5ZmMyN2YzN2Q3YjY2MjU2ODI0YmU2NTVkMjlhMjU2OTA4ZjE1NGU5Il0sWyJleHBpcmF0aW9uIiwiMTc1NTYwODI3NCJdXSwiY29udGVudCI6IiIsInNpZyI6ImZlNzBiMDU4NTM1YjM1ZTFjNzY1NDkyNmFiMDczZTdlNzZhZTgyZjQ1N2RmOWZhYzRiNTFlZTkzMmQ1Mzg2NzM3NWE2NGM0NThmZDBkNGM0MjgyMGIxZDI4ZWQzNTZiMzkzMDQ5MzU5YTEyNWM5NGY4MzNlZjUyYjFlNmRkZGM5In0=" +2025/08/19 07:57:54 [debug] 349771#349771: *3 http header: "Content-Type: application/octet-stream" +2025/08/19 07:57:54 [debug] 349771#349771: *3 http header: "Content-Length: 296" +2025/08/19 07:57:54 [debug] 349771#349771: *3 http header done +2025/08/19 07:57:54 [debug] 349771#349771: *3 event timer del: 6: 171468057 +2025/08/19 07:57:54 [debug] 349771#349771: *3 generic phase: 0 +2025/08/19 07:57:54 [debug] 349771#349771: *3 rewrite phase: 1 +2025/08/19 07:57:54 [debug] 349771#349771: *3 test location: "/health" +2025/08/19 07:57:54 [debug] 349771#349771: *3 test location: "/upload" +2025/08/19 07:57:54 [debug] 349771#349771: *3 test location: ~ "^/([a-f0-9]{64})(\.[a-zA-Z0-9]+)?$" +2025/08/19 07:57:54 [debug] 349771#349771: *3 test location: ~ "^/fcgi-head/([a-f0-9]{64}).*$" +2025/08/19 07:57:54 [debug] 349771#349771: *3 using configuration "/upload" +2025/08/19 07:57:54 [debug] 349771#349771: *3 http cl:296 max:104857600 +2025/08/19 07:57:54 [debug] 349771#349771: *3 rewrite phase: 3 +2025/08/19 07:57:54 [debug] 349771#349771: *3 http script var +2025/08/19 07:57:54 [debug] 349771#349771: *3 http script var: "PUT" +2025/08/19 07:57:54 [debug] 349771#349771: *3 http script regex: "^(PUT)$" +2025/08/19 07:57:54 [notice] 349771#349771: *3 "^(PUT)$" matches "PUT", client: 127.0.0.1, server: localhost, request: "PUT /upload HTTP/1.1", host: "localhost:9001" +2025/08/19 07:57:54 [debug] 349771#349771: *3 http script if +2025/08/19 07:57:54 [debug] 349771#349771: *3 http script if: false +2025/08/19 07:57:54 [debug] 349771#349771: *3 post rewrite phase: 4 +2025/08/19 07:57:54 [debug] 349771#349771: *3 generic phase: 5 +2025/08/19 07:57:54 [debug] 349771#349771: *3 generic phase: 6 +2025/08/19 07:57:54 [debug] 349771#349771: *3 generic phase: 7 +2025/08/19 07:57:54 [debug] 349771#349771: *3 access phase: 8 +2025/08/19 07:57:54 [debug] 349771#349771: *3 access phase: 9 +2025/08/19 07:57:54 [debug] 349771#349771: *3 access phase: 10 +2025/08/19 07:57:54 [debug] 349771#349771: *3 post access phase: 11 +2025/08/19 07:57:54 [debug] 349771#349771: *3 generic phase: 12 +2025/08/19 07:57:54 [debug] 349771#349771: *3 generic phase: 13 +2025/08/19 07:57:54 [debug] 349771#349771: *3 http client request body preread 240 +2025/08/19 07:57:54 [debug] 349771#349771: *3 http request body content length filter +2025/08/19 07:57:54 [debug] 349771#349771: *3 http body new buf t:1 f:0 00005CE0436093B0, pos 00005CE0436093B0, size: 240 file: 0, size: 0 +2025/08/19 07:57:54 [debug] 349771#349771: *3 http read client request body +2025/08/19 07:57:54 [debug] 349771#349771: *3 recv: eof:0, avail:56 +2025/08/19 07:57:54 [debug] 349771#349771: *3 recv: fd:6 56 of 56 +2025/08/19 07:57:54 [debug] 349771#349771: *3 recv: avail:0 +2025/08/19 07:57:54 [debug] 349771#349771: *3 http client request body recv 56 +2025/08/19 07:57:54 [debug] 349771#349771: *3 http body new buf t:1 f:0 00005CE04361B400, pos 00005CE04361B400, size: 56 file: 0, size: 0 +2025/08/19 07:57:54 [debug] 349771#349771: *3 http client request body rest 0 +2025/08/19 07:57:54 [debug] 349771#349771: *3 http init upstream, client timer: 0 +2025/08/19 07:57:54 [debug] 349771#349771: *3 epoll add event: fd:6 op:3 ev:80002005 +2025/08/19 07:57:54 [debug] 349771#349771: *3 posix_memalign: 00005CE043610140:4096 @16 +2025/08/19 07:57:54 [debug] 349771#349771: *3 http script copy: "QUERY_STRING" +2025/08/19 07:57:54 [debug] 349771#349771: *3 fastcgi param: "QUERY_STRING: " +2025/08/19 07:57:54 [debug] 349771#349771: *3 http script copy: "REQUEST_METHOD" +2025/08/19 07:57:54 [debug] 349771#349771: *3 http script var: "PUT" +2025/08/19 07:57:54 [debug] 349771#349771: *3 fastcgi param: "REQUEST_METHOD: PUT" +2025/08/19 07:57:54 [debug] 349771#349771: *3 http script copy: "CONTENT_TYPE" +2025/08/19 07:57:54 [debug] 349771#349771: *3 http script var: "application/octet-stream" +2025/08/19 07:57:54 [debug] 349771#349771: *3 fastcgi param: "CONTENT_TYPE: application/octet-stream" +2025/08/19 07:57:54 [debug] 349771#349771: *3 http script copy: "CONTENT_LENGTH" +2025/08/19 07:57:54 [debug] 349771#349771: *3 http script var: "296" +2025/08/19 07:57:54 [debug] 349771#349771: *3 fastcgi param: "CONTENT_LENGTH: 296" +2025/08/19 07:57:54 [debug] 349771#349771: *3 http script copy: "SCRIPT_NAME" +2025/08/19 07:57:54 [debug] 349771#349771: *3 http script var: "/upload" +2025/08/19 07:57:54 [debug] 349771#349771: *3 fastcgi param: "SCRIPT_NAME: /upload" +2025/08/19 07:57:54 [debug] 349771#349771: *3 http script copy: "REQUEST_URI" +2025/08/19 07:57:54 [debug] 349771#349771: *3 http script var: "/upload" +2025/08/19 07:57:54 [debug] 349771#349771: *3 fastcgi param: "REQUEST_URI: /upload" +2025/08/19 07:57:54 [debug] 349771#349771: *3 http script copy: "DOCUMENT_URI" +2025/08/19 07:57:54 [debug] 349771#349771: *3 http script var: "/upload" +2025/08/19 07:57:54 [debug] 349771#349771: *3 fastcgi param: "DOCUMENT_URI: /upload" +2025/08/19 07:57:54 [debug] 349771#349771: *3 http script copy: "DOCUMENT_ROOT" +2025/08/19 07:57:54 [debug] 349771#349771: *3 http script var: "./blobs" +2025/08/19 07:57:54 [debug] 349771#349771: *3 fastcgi param: "DOCUMENT_ROOT: ./blobs" +2025/08/19 07:57:54 [debug] 349771#349771: *3 http script copy: "SERVER_PROTOCOL" +2025/08/19 07:57:54 [debug] 349771#349771: *3 http script var: "HTTP/1.1" +2025/08/19 07:57:54 [debug] 349771#349771: *3 fastcgi param: "SERVER_PROTOCOL: HTTP/1.1" +2025/08/19 07:57:54 [debug] 349771#349771: *3 http script copy: "REQUEST_SCHEME" +2025/08/19 07:57:54 [debug] 349771#349771: *3 http script var: "http" +2025/08/19 07:57:54 [debug] 349771#349771: *3 fastcgi param: "REQUEST_SCHEME: http" +2025/08/19 07:57:54 [debug] 349771#349771: *3 http script copy: "" +2025/08/19 07:57:54 [debug] 349771#349771: *3 http script copy: "GATEWAY_INTERFACE" +2025/08/19 07:57:54 [debug] 349771#349771: *3 http script copy: "CGI/1.1" +2025/08/19 07:57:54 [debug] 349771#349771: *3 fastcgi param: "GATEWAY_INTERFACE: CGI/1.1" +2025/08/19 07:57:54 [debug] 349771#349771: *3 http script copy: "SERVER_SOFTWARE" +2025/08/19 07:57:54 [debug] 349771#349771: *3 http script copy: "nginx/" +2025/08/19 07:57:54 [debug] 349771#349771: *3 http script var: "1.18.0" +2025/08/19 07:57:54 [debug] 349771#349771: *3 fastcgi param: "SERVER_SOFTWARE: nginx/1.18.0" +2025/08/19 07:57:54 [debug] 349771#349771: *3 http script copy: "REMOTE_ADDR" +2025/08/19 07:57:54 [debug] 349771#349771: *3 http script var: "127.0.0.1" +2025/08/19 07:57:54 [debug] 349771#349771: *3 fastcgi param: "REMOTE_ADDR: 127.0.0.1" +2025/08/19 07:57:54 [debug] 349771#349771: *3 http script copy: "REMOTE_PORT" +2025/08/19 07:57:54 [debug] 349771#349771: *3 http script var: "33322" +2025/08/19 07:57:54 [debug] 349771#349771: *3 fastcgi param: "REMOTE_PORT: 33322" +2025/08/19 07:57:54 [debug] 349771#349771: *3 http script copy: "SERVER_ADDR" +2025/08/19 07:57:54 [debug] 349771#349771: *3 http script var: "127.0.0.1" +2025/08/19 07:57:54 [debug] 349771#349771: *3 fastcgi param: "SERVER_ADDR: 127.0.0.1" +2025/08/19 07:57:54 [debug] 349771#349771: *3 http script copy: "SERVER_PORT" +2025/08/19 07:57:54 [debug] 349771#349771: *3 http script var: "9001" +2025/08/19 07:57:54 [debug] 349771#349771: *3 fastcgi param: "SERVER_PORT: 9001" +2025/08/19 07:57:54 [debug] 349771#349771: *3 http script copy: "SERVER_NAME" +2025/08/19 07:57:54 [debug] 349771#349771: *3 http script var: "localhost" +2025/08/19 07:57:54 [debug] 349771#349771: *3 fastcgi param: "SERVER_NAME: localhost" +2025/08/19 07:57:54 [debug] 349771#349771: *3 http script copy: "REDIRECT_STATUS" +2025/08/19 07:57:54 [debug] 349771#349771: *3 http script copy: "200" +2025/08/19 07:57:54 [debug] 349771#349771: *3 fastcgi param: "REDIRECT_STATUS: 200" +2025/08/19 07:57:54 [debug] 349771#349771: *3 http script copy: "SCRIPT_FILENAME" +2025/08/19 07:57:54 [debug] 349771#349771: *3 http script var: "./blobs" +2025/08/19 07:57:54 [debug] 349771#349771: *3 http script copy: "/ginxsom.fcgi" +2025/08/19 07:57:54 [debug] 349771#349771: *3 fastcgi param: "SCRIPT_FILENAME: ./blobs/ginxsom.fcgi" +2025/08/19 07:57:54 [debug] 349771#349771: *3 fastcgi param: "HTTP_HOST: localhost:9001" +2025/08/19 07:57:54 [debug] 349771#349771: *3 fastcgi param: "HTTP_USER_AGENT: curl/8.15.0" +2025/08/19 07:57:54 [debug] 349771#349771: *3 fastcgi param: "HTTP_ACCEPT: */*" +2025/08/19 07:57:54 [debug] 349771#349771: *3 fastcgi param: "HTTP_AUTHORIZATION: Nostr eyJraW5kIjoyNDI0MiwiaWQiOiIwNDZiN2E3MDBjZTAzZjQ0NGFhYmNkY2Y1NGVlOGM5ZGNhZmJhODhkY2IzNzM2NzYwODFkMDkyOTZkMDU5NGZmIiwicHVia2V5IjoiNzliZTY2N2VmOWRjYmJhYzU1YTA2Mjk1Y2U4NzBiMDcwMjliZmNkYjJkY2UyOGQ5NTlmMjgxNWIxNmY4MTc5OCIsImNyZWF0ZWRfYXQiOjE3NTU2MDQ2NzQsInRhZ3MiOltbInQiLCJ1cGxvYWQiXSxbIngiLCJhZTlmNTljN2FjMzg2YjdmZTYzNDNkNjY5ZmMyN2YzN2Q3YjY2MjU2ODI0YmU2NTVkMjlhMjU2OTA4ZjE1NGU5Il0sWyJleHBpcmF0aW9uIiwiMTc1NTYwODI3NCJdXSwiY29udGVudCI6IiIsInNpZyI6ImZlNzBiMDU4NTM1YjM1ZTFjNzY1NDkyNmFiMDczZTdlNzZhZTgyZjQ1N2RmOWZhYzRiNTFlZTkzMmQ1Mzg2NzM3NWE2NGM0NThmZDBkNGM0MjgyMGIxZDI4ZWQzNTZiMzkzMDQ5MzU5YTEyNWM5NGY4MzNlZjUyYjFlNmRkZGM5In0=" +2025/08/19 07:57:54 [debug] 349771#349771: *3 fastcgi param: "HTTP_CONTENT_TYPE: application/octet-stream" +2025/08/19 07:57:54 [debug] 349771#349771: *3 fastcgi param: "HTTP_CONTENT_LENGTH: 296" +2025/08/19 07:57:54 [debug] 349771#349771: *3 http cleanup add: 00005CE04361B718 +2025/08/19 07:57:54 [debug] 349771#349771: *3 get rr peer, try: 1 +2025/08/19 07:57:54 [debug] 349771#349771: *3 stream socket 10 +2025/08/19 07:57:54 [debug] 349771#349771: *3 epoll add connection: fd:10 ev:80002005 +2025/08/19 07:57:54 [debug] 349771#349771: *3 connect to unix:/tmp/ginxsom-fcgi.sock, fd:10 #4 +2025/08/19 07:57:54 [debug] 349771#349771: *3 connected +2025/08/19 07:57:54 [debug] 349771#349771: *3 http upstream connect: 0 +2025/08/19 07:57:54 [debug] 349771#349771: *3 posix_memalign: 00005CE0435EFF20:128 @16 +2025/08/19 07:57:54 [debug] 349771#349771: *3 http upstream send request +2025/08/19 07:57:54 [debug] 349771#349771: *3 http upstream send request body +2025/08/19 07:57:54 [debug] 349771#349771: *3 chain writer buf fl:0 s:1256 +2025/08/19 07:57:54 [debug] 349771#349771: *3 chain writer buf fl:0 s:240 +2025/08/19 07:57:54 [debug] 349771#349771: *3 chain writer buf fl:0 s:8 +2025/08/19 07:57:54 [debug] 349771#349771: *3 chain writer buf fl:0 s:56 +2025/08/19 07:57:54 [debug] 349771#349771: *3 chain writer buf fl:0 s:8 +2025/08/19 07:57:54 [debug] 349771#349771: *3 chain writer in: 00005CE04361B7A8 +2025/08/19 07:57:54 [debug] 349771#349771: *3 writev: 1568 of 1568 +2025/08/19 07:57:54 [debug] 349771#349771: *3 chain writer out: 0000000000000000 +2025/08/19 07:57:54 [debug] 349771#349771: *3 event timer add: 10: 60000:171468057 +2025/08/19 07:57:54 [debug] 349771#349771: *3 http finalize request: -4, "/upload?" a:1, c:2 +2025/08/19 07:57:54 [debug] 349771#349771: *3 http request count:2 blk:0 +2025/08/19 07:57:54 [debug] 349771#349771: timer delta: 0 +2025/08/19 07:57:54 [debug] 349771#349771: worker cycle +2025/08/19 07:57:54 [debug] 349771#349771: epoll timer: 60000 +2025/08/19 07:57:54 [debug] 349771#349771: epoll: fd:6 ev:0004 d:000075EA426D11E0 +2025/08/19 07:57:54 [debug] 349771#349771: *3 http run request: "/upload?" +2025/08/19 07:57:54 [debug] 349771#349771: *3 http upstream check client, write event:1, "/upload" +2025/08/19 07:57:54 [debug] 349771#349771: epoll: fd:10 ev:2005 d:000075EA426D12C8 +2025/08/19 07:57:54 [debug] 349771#349771: *3 http upstream request: "/upload?" +2025/08/19 07:57:54 [debug] 349771#349771: *3 http upstream process header +2025/08/19 07:57:54 [debug] 349771#349771: *3 malloc: 00005CE043611150:4096 +2025/08/19 07:57:54 [debug] 349771#349771: *3 recv: eof:1, avail:-1 +2025/08/19 07:57:54 [debug] 349771#349771: *3 recv: fd:10 184 of 4096 +2025/08/19 07:57:54 [debug] 349771#349771: *3 http fastcgi record byte: 01 +2025/08/19 07:57:54 [debug] 349771#349771: *3 http fastcgi record byte: 06 +2025/08/19 07:57:54 [debug] 349771#349771: *3 http fastcgi record byte: 00 +2025/08/19 07:57:54 [debug] 349771#349771: *3 http fastcgi record byte: 01 +2025/08/19 07:57:54 [debug] 349771#349771: *3 http fastcgi record byte: 00 +2025/08/19 07:57:54 [debug] 349771#349771: *3 http fastcgi record byte: 95 +2025/08/19 07:57:54 [debug] 349771#349771: *3 http fastcgi record byte: 03 +2025/08/19 07:57:54 [debug] 349771#349771: *3 http fastcgi record byte: 00 +2025/08/19 07:57:54 [debug] 349771#349771: *3 http fastcgi record length: 149 +2025/08/19 07:57:54 [debug] 349771#349771: *3 http fastcgi parser: 0 +2025/08/19 07:57:54 [debug] 349771#349771: *3 http fastcgi header: "DEBUG: FastCGI received request" +2025/08/19 07:57:54 [debug] 349771#349771: *3 http fastcgi parser: 0 +2025/08/19 07:57:54 [debug] 349771#349771: *3 http fastcgi header: "DEBUG: METHOD=PUT, URI=/upload" +2025/08/19 07:57:54 [debug] 349771#349771: *3 http fastcgi parser: 0 +2025/08/19 07:57:54 [debug] 349771#349771: *3 http fastcgi header: "Status: 501 Not Implemented" +2025/08/19 07:57:54 [debug] 349771#349771: *3 http fastcgi parser: 0 +2025/08/19 07:57:54 [debug] 349771#349771: *3 http fastcgi header: "Content-Type: text/plain" +2025/08/19 07:57:54 [debug] 349771#349771: *3 http fastcgi parser: 1 +2025/08/19 07:57:54 [debug] 349771#349771: *3 http fastcgi header done +2025/08/19 07:57:54 [debug] 349771#349771: *3 HTTP/1.1 501 Not Implemented +Server: nginx/1.18.0 (Ubuntu) +Date: Tue, 19 Aug 2025 11:57:54 GMT +Content-Type: text/plain +Transfer-Encoding: chunked +Connection: keep-alive +DEBUG: FastCGI received request +DEBUG: METHOD=PUT, URI=/upload + +2025/08/19 07:57:54 [debug] 349771#349771: *3 write new buf t:1 f:0 00005CE0436107C8, pos 00005CE0436107C8, size: 243 file: 0, size: 0 +2025/08/19 07:57:54 [debug] 349771#349771: *3 http write filter: l:0 f:0 s:243 +2025/08/19 07:57:54 [debug] 349771#349771: *3 http cacheable: 0 +2025/08/19 07:57:54 [debug] 349771#349771: *3 http upstream process upstream +2025/08/19 07:57:54 [debug] 349771#349771: *3 pipe read upstream: 1 +2025/08/19 07:57:54 [debug] 349771#349771: *3 pipe preread: 54 +2025/08/19 07:57:54 [debug] 349771#349771: *3 readv: eof:1, avail:0 +2025/08/19 07:57:54 [debug] 349771#349771: *3 readv: 1, last:3912 +2025/08/19 07:57:54 [debug] 349771#349771: *3 pipe recv chain: 0 +2025/08/19 07:57:54 [debug] 349771#349771: *3 pipe buf free s:0 t:1 f:0 00005CE043611150, pos 00005CE0436111D2, size: 54 file: 0, size: 0 +2025/08/19 07:57:54 [debug] 349771#349771: *3 pipe length: -1 +2025/08/19 07:57:54 [debug] 349771#349771: *3 input buf #0 00005CE0436111D2 +2025/08/19 07:57:54 [debug] 349771#349771: *3 http fastcgi record byte: 01 +2025/08/19 07:57:54 [debug] 349771#349771: *3 http fastcgi record byte: 06 +2025/08/19 07:57:54 [debug] 349771#349771: *3 http fastcgi record byte: 00 +2025/08/19 07:57:54 [debug] 349771#349771: *3 http fastcgi record byte: 01 +2025/08/19 07:57:54 [debug] 349771#349771: *3 http fastcgi record byte: 00 +2025/08/19 07:57:54 [debug] 349771#349771: *3 http fastcgi record byte: 00 +2025/08/19 07:57:54 [debug] 349771#349771: *3 http fastcgi record byte: 00 +2025/08/19 07:57:54 [debug] 349771#349771: *3 http fastcgi record byte: 00 +2025/08/19 07:57:54 [debug] 349771#349771: *3 http fastcgi record length: 0 +2025/08/19 07:57:54 [debug] 349771#349771: *3 http fastcgi closed stdout +2025/08/19 07:57:54 [debug] 349771#349771: *3 http fastcgi record byte: 01 +2025/08/19 07:57:54 [debug] 349771#349771: *3 http fastcgi record byte: 03 +2025/08/19 07:57:54 [debug] 349771#349771: *3 http fastcgi record byte: 00 +2025/08/19 07:57:54 [debug] 349771#349771: *3 http fastcgi record byte: 01 +2025/08/19 07:57:54 [debug] 349771#349771: *3 http fastcgi record byte: 00 +2025/08/19 07:57:54 [debug] 349771#349771: *3 http fastcgi record byte: 08 +2025/08/19 07:57:54 [debug] 349771#349771: *3 http fastcgi record byte: 00 +2025/08/19 07:57:54 [debug] 349771#349771: *3 http fastcgi record byte: 00 +2025/08/19 07:57:54 [debug] 349771#349771: *3 http fastcgi record length: 8 +2025/08/19 07:57:54 [debug] 349771#349771: *3 http fastcgi sent end request +2025/08/19 07:57:54 [debug] 349771#349771: *3 input buf 00005CE0436111D2 27 +2025/08/19 07:57:54 [debug] 349771#349771: *3 pipe write downstream: 1 +2025/08/19 07:57:54 [debug] 349771#349771: *3 pipe write downstream flush in +2025/08/19 07:57:54 [debug] 349771#349771: *3 http output filter "/upload?" +2025/08/19 07:57:54 [debug] 349771#349771: *3 http copy filter: "/upload?" +2025/08/19 07:57:54 [debug] 349771#349771: *3 http postpone filter "/upload?" 00005CE04361B778 +2025/08/19 07:57:54 [debug] 349771#349771: *3 http chunk: 27 +2025/08/19 07:57:54 [debug] 349771#349771: *3 write old buf t:1 f:0 00005CE0436107C8, pos 00005CE0436107C8, size: 243 file: 0, size: 0 +2025/08/19 07:57:54 [debug] 349771#349771: *3 write new buf t:1 f:0 00005CE04361B958, pos 00005CE04361B958, size: 4 file: 0, size: 0 +2025/08/19 07:57:54 [debug] 349771#349771: *3 write new buf t:1 f:0 00005CE043611150, pos 00005CE0436111D2, size: 27 file: 0, size: 0 +2025/08/19 07:57:54 [debug] 349771#349771: *3 write new buf t:0 f:0 0000000000000000, pos 00005CE037AC92E8, size: 2 file: 0, size: 0 +2025/08/19 07:57:54 [debug] 349771#349771: *3 http write filter: l:0 f:0 s:276 +2025/08/19 07:57:54 [debug] 349771#349771: *3 http copy filter: 0 "/upload?" +2025/08/19 07:57:54 [debug] 349771#349771: *3 pipe write downstream done +2025/08/19 07:57:54 [debug] 349771#349771: *3 event timer: 10, old: 171468057, new: 171468059 +2025/08/19 07:57:54 [debug] 349771#349771: *3 http upstream exit: 0000000000000000 +2025/08/19 07:57:54 [debug] 349771#349771: *3 finalize http upstream request: 0 +2025/08/19 07:57:54 [debug] 349771#349771: *3 finalize http fastcgi request +2025/08/19 07:57:54 [debug] 349771#349771: *3 free rr peer 1 0 +2025/08/19 07:57:54 [debug] 349771#349771: *3 close http upstream connection: 10 +2025/08/19 07:57:54 [debug] 349771#349771: *3 free: 00005CE0435EFF20, unused: 48 +2025/08/19 07:57:54 [debug] 349771#349771: *3 event timer del: 10: 171468057 +2025/08/19 07:57:54 [debug] 349771#349771: *3 reusable connection: 0 +2025/08/19 07:57:54 [debug] 349771#349771: *3 http upstream temp fd: -1 +2025/08/19 07:57:54 [debug] 349771#349771: *3 http output filter "/upload?" +2025/08/19 07:57:54 [debug] 349771#349771: *3 http copy filter: "/upload?" +2025/08/19 07:57:54 [debug] 349771#349771: *3 http postpone filter "/upload?" 00007FFDD38FD270 +2025/08/19 07:57:54 [debug] 349771#349771: *3 http chunk: 0 +2025/08/19 07:57:54 [debug] 349771#349771: *3 write old buf t:1 f:0 00005CE0436107C8, pos 00005CE0436107C8, size: 243 file: 0, size: 0 +2025/08/19 07:57:54 [debug] 349771#349771: *3 write old buf t:1 f:0 00005CE04361B958, pos 00005CE04361B958, size: 4 file: 0, size: 0 +2025/08/19 07:57:54 [debug] 349771#349771: *3 write old buf t:1 f:0 00005CE043611150, pos 00005CE0436111D2, size: 27 file: 0, size: 0 +2025/08/19 07:57:54 [debug] 349771#349771: *3 write old buf t:0 f:0 0000000000000000, pos 00005CE037AC92E8, size: 2 file: 0, size: 0 +2025/08/19 07:57:54 [debug] 349771#349771: *3 write new buf t:0 f:0 0000000000000000, pos 00005CE037AC92E5, size: 5 file: 0, size: 0 +2025/08/19 07:57:54 [debug] 349771#349771: *3 http write filter: l:1 f:0 s:281 +2025/08/19 07:57:54 [debug] 349771#349771: *3 http write filter limit 0 +2025/08/19 07:57:54 [debug] 349771#349771: *3 writev: 281 of 281 +2025/08/19 07:57:54 [debug] 349771#349771: *3 http write filter 0000000000000000 +2025/08/19 07:57:54 [debug] 349771#349771: *3 http copy filter: 0 "/upload?" +2025/08/19 07:57:54 [debug] 349771#349771: *3 http finalize request: 0, "/upload?" a:1, c:1 +2025/08/19 07:57:54 [debug] 349771#349771: *3 set http keepalive handler +2025/08/19 07:57:54 [debug] 349771#349771: *3 http close request +2025/08/19 07:57:54 [debug] 349771#349771: *3 http log handler +2025/08/19 07:57:54 [debug] 349771#349771: *3 free: 00005CE043611150 +2025/08/19 07:57:54 [debug] 349771#349771: *3 free: 00005CE043624610, unused: 3 +2025/08/19 07:57:54 [debug] 349771#349771: *3 free: 00005CE04361A980, unused: 0 +2025/08/19 07:57:54 [debug] 349771#349771: *3 free: 00005CE043610140, unused: 1234 +2025/08/19 07:57:54 [debug] 349771#349771: *3 free: 00005CE0436090A0 +2025/08/19 07:57:54 [debug] 349771#349771: *3 hc free: 0000000000000000 +2025/08/19 07:57:54 [debug] 349771#349771: *3 hc busy: 0000000000000000 0 +2025/08/19 07:57:54 [debug] 349771#349771: *3 tcp_nodelay +2025/08/19 07:57:54 [debug] 349771#349771: *3 reusable connection: 1 +2025/08/19 07:57:54 [debug] 349771#349771: *3 event timer add: 6: 65000:171473059 +2025/08/19 07:57:54 [debug] 349771#349771: *3 post event 00005CE04364A320 +2025/08/19 07:57:54 [debug] 349771#349771: timer delta: 2 +2025/08/19 07:57:54 [debug] 349771#349771: posted event 00005CE04364A320 +2025/08/19 07:57:54 [debug] 349771#349771: *3 delete posted event 00005CE04364A320 +2025/08/19 07:57:54 [debug] 349771#349771: *3 http keepalive handler +2025/08/19 07:57:54 [debug] 349771#349771: *3 malloc: 00005CE0436090A0:1024 +2025/08/19 07:57:54 [debug] 349771#349771: *3 recv: eof:0, avail:0 +2025/08/19 07:57:54 [debug] 349771#349771: *3 free: 00005CE0436090A0 +2025/08/19 07:57:54 [debug] 349771#349771: worker cycle +2025/08/19 07:57:54 [debug] 349771#349771: epoll timer: 65000 +2025/08/19 07:57:54 [debug] 349771#349771: epoll: fd:6 ev:2005 d:000075EA426D11E0 +2025/08/19 07:57:54 [debug] 349771#349771: *3 http keepalive handler +2025/08/19 07:57:54 [debug] 349771#349771: *3 malloc: 00005CE0436090A0:1024 +2025/08/19 07:57:54 [debug] 349771#349771: *3 recv: eof:1, avail:-1 +2025/08/19 07:57:54 [debug] 349771#349771: *3 recv: fd:6 0 of 1024 +2025/08/19 07:57:54 [info] 349771#349771: *3 client 127.0.0.1 closed keepalive connection +2025/08/19 07:57:54 [debug] 349771#349771: *3 close http connection: 6 +2025/08/19 07:57:54 [debug] 349771#349771: *3 event timer del: 6: 171473059 +2025/08/19 07:57:54 [debug] 349771#349771: *3 reusable connection: 0 +2025/08/19 07:57:54 [debug] 349771#349771: *3 free: 00005CE0436090A0 +2025/08/19 07:57:54 [debug] 349771#349771: *3 free: 00005CE043606840, unused: 120 +2025/08/19 07:57:54 [debug] 349771#349771: timer delta: 1 +2025/08/19 07:57:54 [debug] 349771#349771: worker cycle +2025/08/19 07:57:54 [debug] 349771#349771: epoll timer: -1 +2025/08/19 07:57:54 [debug] 349771#349771: epoll: fd:5 ev:0001 d:000075EA426D1010 +2025/08/19 07:57:54 [debug] 349771#349771: accept on 0.0.0.0:9001, ready: 0 +2025/08/19 07:57:54 [debug] 349771#349771: posix_memalign: 00005CE043606840:512 @16 +2025/08/19 07:57:54 [debug] 349771#349771: *5 accept: 127.0.0.1:33334 fd:6 +2025/08/19 07:57:54 [debug] 349771#349771: *5 event timer add: 6: 60000:171468068 +2025/08/19 07:57:54 [debug] 349771#349771: *5 reusable connection: 1 +2025/08/19 07:57:54 [debug] 349771#349771: *5 epoll add event: fd:6 op:1 ev:80002001 +2025/08/19 07:57:54 [debug] 349771#349771: timer delta: 8 +2025/08/19 07:57:54 [debug] 349771#349771: worker cycle +2025/08/19 07:57:54 [debug] 349771#349771: epoll timer: 60000 +2025/08/19 07:57:54 [debug] 349771#349771: epoll: fd:6 ev:0001 d:000075EA426D11E1 +2025/08/19 07:57:54 [debug] 349771#349771: *5 http wait request handler +2025/08/19 07:57:54 [debug] 349771#349771: *5 malloc: 00005CE0436090A0:1024 +2025/08/19 07:57:54 [debug] 349771#349771: *5 recv: eof:0, avail:-1 +2025/08/19 07:57:54 [debug] 349771#349771: *5 recv: fd:6 142 of 1024 +2025/08/19 07:57:54 [debug] 349771#349771: *5 reusable connection: 0 +2025/08/19 07:57:54 [debug] 349771#349771: *5 posix_memalign: 00005CE043624610:4096 @16 +2025/08/19 07:57:54 [debug] 349771#349771: *5 http process request line +2025/08/19 07:57:54 [debug] 349771#349771: *5 http request line: "GET /ae9f59c7ac386b7fe6343d669fc27f37d7b66256824be655d29a256908f154e9 HTTP/1.1" +2025/08/19 07:57:54 [debug] 349771#349771: *5 http uri: "/ae9f59c7ac386b7fe6343d669fc27f37d7b66256824be655d29a256908f154e9" +2025/08/19 07:57:54 [debug] 349771#349771: *5 http args: "" +2025/08/19 07:57:54 [debug] 349771#349771: *5 http exten: "" +2025/08/19 07:57:54 [debug] 349771#349771: *5 posix_memalign: 00005CE04361A980:4096 @16 +2025/08/19 07:57:54 [debug] 349771#349771: *5 http process request header line +2025/08/19 07:57:54 [debug] 349771#349771: *5 http header: "Host: localhost:9001" +2025/08/19 07:57:54 [debug] 349771#349771: *5 http header: "User-Agent: curl/8.15.0" +2025/08/19 07:57:54 [debug] 349771#349771: *5 http header: "Accept: */*" +2025/08/19 07:57:54 [debug] 349771#349771: *5 http header done +2025/08/19 07:57:54 [debug] 349771#349771: *5 event timer del: 6: 171468068 +2025/08/19 07:57:54 [debug] 349771#349771: *5 generic phase: 0 +2025/08/19 07:57:54 [debug] 349771#349771: *5 rewrite phase: 1 +2025/08/19 07:57:54 [debug] 349771#349771: *5 test location: "/health" +2025/08/19 07:57:54 [debug] 349771#349771: *5 test location: "/debug/list" +2025/08/19 07:57:54 [debug] 349771#349771: *5 test location: "/" +2025/08/19 07:57:54 [debug] 349771#349771: *5 test location: ~ "^/([a-f0-9]{64})(\.[a-zA-Z0-9]+)?$" +2025/08/19 07:57:54 [debug] 349771#349771: *5 using configuration "^/([a-f0-9]{64})(\.[a-zA-Z0-9]+)?$" +2025/08/19 07:57:54 [debug] 349771#349771: *5 http cl:-1 max:104857600 +2025/08/19 07:57:54 [debug] 349771#349771: *5 rewrite phase: 3 +2025/08/19 07:57:54 [debug] 349771#349771: *5 http script var +2025/08/19 07:57:54 [debug] 349771#349771: *5 http script var: "GET" +2025/08/19 07:57:54 [debug] 349771#349771: *5 http script value: "HEAD" +2025/08/19 07:57:54 [debug] 349771#349771: *5 http script equal +2025/08/19 07:57:54 [debug] 349771#349771: *5 http script equal: no +2025/08/19 07:57:54 [debug] 349771#349771: *5 http script if +2025/08/19 07:57:54 [debug] 349771#349771: *5 http script if: false +2025/08/19 07:57:54 [debug] 349771#349771: *5 post rewrite phase: 4 +2025/08/19 07:57:54 [debug] 349771#349771: *5 generic phase: 5 +2025/08/19 07:57:54 [debug] 349771#349771: *5 generic phase: 6 +2025/08/19 07:57:54 [debug] 349771#349771: *5 generic phase: 7 +2025/08/19 07:57:54 [debug] 349771#349771: *5 access phase: 8 +2025/08/19 07:57:54 [debug] 349771#349771: *5 access phase: 9 +2025/08/19 07:57:54 [debug] 349771#349771: *5 access phase: 10 +2025/08/19 07:57:54 [debug] 349771#349771: *5 post access phase: 11 +2025/08/19 07:57:54 [debug] 349771#349771: *5 generic phase: 12 +2025/08/19 07:57:54 [debug] 349771#349771: *5 try files handler +2025/08/19 07:57:54 [debug] 349771#349771: *5 http script copy: "/" +2025/08/19 07:57:54 [debug] 349771#349771: *5 http script capture: "ae9f59c7ac386b7fe6343d669fc27f37d7b66256824be655d29a256908f154e9" +2025/08/19 07:57:54 [debug] 349771#349771: *5 http script copy: ".jpg" +2025/08/19 07:57:54 [debug] 349771#349771: *5 trying to use file: "/ae9f59c7ac386b7fe6343d669fc27f37d7b66256824be655d29a256908f154e9.jpg" "./blobs/ae9f59c7ac386b7fe6343d669fc27f37d7b66256824be655d29a256908f154e9.jpg" +2025/08/19 07:57:54 [debug] 349771#349771: *5 http script copy: "/" +2025/08/19 07:57:54 [debug] 349771#349771: *5 http script capture: "ae9f59c7ac386b7fe6343d669fc27f37d7b66256824be655d29a256908f154e9" +2025/08/19 07:57:54 [debug] 349771#349771: *5 http script copy: ".jpeg" +2025/08/19 07:57:54 [debug] 349771#349771: *5 trying to use file: "/ae9f59c7ac386b7fe6343d669fc27f37d7b66256824be655d29a256908f154e9.jpeg" "./blobs/ae9f59c7ac386b7fe6343d669fc27f37d7b66256824be655d29a256908f154e9.jpeg" +2025/08/19 07:57:54 [debug] 349771#349771: *5 http script copy: "/" +2025/08/19 07:57:54 [debug] 349771#349771: *5 http script capture: "ae9f59c7ac386b7fe6343d669fc27f37d7b66256824be655d29a256908f154e9" +2025/08/19 07:57:54 [debug] 349771#349771: *5 http script copy: ".png" +2025/08/19 07:57:54 [debug] 349771#349771: *5 trying to use file: "/ae9f59c7ac386b7fe6343d669fc27f37d7b66256824be655d29a256908f154e9.png" "./blobs/ae9f59c7ac386b7fe6343d669fc27f37d7b66256824be655d29a256908f154e9.png" +2025/08/19 07:57:54 [debug] 349771#349771: *5 http script copy: "/" +2025/08/19 07:57:54 [debug] 349771#349771: *5 http script capture: "ae9f59c7ac386b7fe6343d669fc27f37d7b66256824be655d29a256908f154e9" +2025/08/19 07:57:54 [debug] 349771#349771: *5 http script copy: ".webp" +2025/08/19 07:57:54 [debug] 349771#349771: *5 trying to use file: "/ae9f59c7ac386b7fe6343d669fc27f37d7b66256824be655d29a256908f154e9.webp" "./blobs/ae9f59c7ac386b7fe6343d669fc27f37d7b66256824be655d29a256908f154e9.webp" +2025/08/19 07:57:54 [debug] 349771#349771: *5 http script copy: "/" +2025/08/19 07:57:54 [debug] 349771#349771: *5 http script capture: "ae9f59c7ac386b7fe6343d669fc27f37d7b66256824be655d29a256908f154e9" +2025/08/19 07:57:54 [debug] 349771#349771: *5 http script copy: ".gif" +2025/08/19 07:57:54 [debug] 349771#349771: *5 trying to use file: "/ae9f59c7ac386b7fe6343d669fc27f37d7b66256824be655d29a256908f154e9.gif" "./blobs/ae9f59c7ac386b7fe6343d669fc27f37d7b66256824be655d29a256908f154e9.gif" +2025/08/19 07:57:54 [debug] 349771#349771: *5 http script copy: "/" +2025/08/19 07:57:54 [debug] 349771#349771: *5 http script capture: "ae9f59c7ac386b7fe6343d669fc27f37d7b66256824be655d29a256908f154e9" +2025/08/19 07:57:54 [debug] 349771#349771: *5 http script copy: ".pdf" +2025/08/19 07:57:54 [debug] 349771#349771: *5 trying to use file: "/ae9f59c7ac386b7fe6343d669fc27f37d7b66256824be655d29a256908f154e9.pdf" "./blobs/ae9f59c7ac386b7fe6343d669fc27f37d7b66256824be655d29a256908f154e9.pdf" +2025/08/19 07:57:54 [debug] 349771#349771: *5 http script copy: "/" +2025/08/19 07:57:54 [debug] 349771#349771: *5 http script capture: "ae9f59c7ac386b7fe6343d669fc27f37d7b66256824be655d29a256908f154e9" +2025/08/19 07:57:54 [debug] 349771#349771: *5 http script copy: ".mp4" +2025/08/19 07:57:54 [debug] 349771#349771: *5 trying to use file: "/ae9f59c7ac386b7fe6343d669fc27f37d7b66256824be655d29a256908f154e9.mp4" "./blobs/ae9f59c7ac386b7fe6343d669fc27f37d7b66256824be655d29a256908f154e9.mp4" +2025/08/19 07:57:54 [debug] 349771#349771: *5 http script copy: "/" +2025/08/19 07:57:54 [debug] 349771#349771: *5 http script capture: "ae9f59c7ac386b7fe6343d669fc27f37d7b66256824be655d29a256908f154e9" +2025/08/19 07:57:54 [debug] 349771#349771: *5 http script copy: ".mp3" +2025/08/19 07:57:54 [debug] 349771#349771: *5 trying to use file: "/ae9f59c7ac386b7fe6343d669fc27f37d7b66256824be655d29a256908f154e9.mp3" "./blobs/ae9f59c7ac386b7fe6343d669fc27f37d7b66256824be655d29a256908f154e9.mp3" +2025/08/19 07:57:54 [debug] 349771#349771: *5 http script copy: "/" +2025/08/19 07:57:54 [debug] 349771#349771: *5 http script capture: "ae9f59c7ac386b7fe6343d669fc27f37d7b66256824be655d29a256908f154e9" +2025/08/19 07:57:54 [debug] 349771#349771: *5 http script copy: ".txt" +2025/08/19 07:57:54 [debug] 349771#349771: *5 trying to use file: "/ae9f59c7ac386b7fe6343d669fc27f37d7b66256824be655d29a256908f154e9.txt" "./blobs/ae9f59c7ac386b7fe6343d669fc27f37d7b66256824be655d29a256908f154e9.txt" +2025/08/19 07:57:54 [debug] 349771#349771: *5 http script copy: "/" +2025/08/19 07:57:54 [debug] 349771#349771: *5 http script capture: "ae9f59c7ac386b7fe6343d669fc27f37d7b66256824be655d29a256908f154e9" +2025/08/19 07:57:54 [debug] 349771#349771: *5 http script copy: ".md=404" +2025/08/19 07:57:54 [debug] 349771#349771: *5 trying to use file: "/ae9f59c7ac386b7fe6343d669fc27f37d7b66256824be655d29a256908f154e9.md=404" "./blobs/ae9f59c7ac386b7fe6343d669fc27f37d7b66256824be655d29a256908f154e9.md=404" +2025/08/19 07:57:54 [debug] 349771#349771: *5 internal redirect: "/ae9f59c7ac386b7fe6343d669fc27f37d7b66256824be655d29a256908f154e9.md=404?" +2025/08/19 07:57:54 [debug] 349771#349771: *5 rewrite phase: 1 +2025/08/19 07:57:54 [debug] 349771#349771: *5 test location: "/health" +2025/08/19 07:57:54 [debug] 349771#349771: *5 test location: "/debug/list" +2025/08/19 07:57:54 [debug] 349771#349771: *5 test location: "/" +2025/08/19 07:57:54 [debug] 349771#349771: *5 test location: ~ "^/([a-f0-9]{64})(\.[a-zA-Z0-9]+)?$" +2025/08/19 07:57:54 [debug] 349771#349771: *5 test location: ~ "^/fcgi-head/([a-f0-9]{64}).*$" +2025/08/19 07:57:54 [debug] 349771#349771: *5 using configuration "" +2025/08/19 07:57:54 [debug] 349771#349771: *5 http cl:-1 max:104857600 +2025/08/19 07:57:54 [debug] 349771#349771: *5 rewrite phase: 3 +2025/08/19 07:57:54 [debug] 349771#349771: *5 post rewrite phase: 4 +2025/08/19 07:57:54 [debug] 349771#349771: *5 generic phase: 5 +2025/08/19 07:57:54 [debug] 349771#349771: *5 generic phase: 6 +2025/08/19 07:57:54 [debug] 349771#349771: *5 generic phase: 7 +2025/08/19 07:57:54 [debug] 349771#349771: *5 access phase: 8 +2025/08/19 07:57:54 [debug] 349771#349771: *5 access phase: 9 +2025/08/19 07:57:54 [debug] 349771#349771: *5 access phase: 10 +2025/08/19 07:57:54 [debug] 349771#349771: *5 post access phase: 11 +2025/08/19 07:57:54 [debug] 349771#349771: *5 generic phase: 12 +2025/08/19 07:57:54 [debug] 349771#349771: *5 generic phase: 13 +2025/08/19 07:57:54 [debug] 349771#349771: *5 content phase: 14 +2025/08/19 07:57:54 [debug] 349771#349771: *5 content phase: 15 +2025/08/19 07:57:54 [debug] 349771#349771: *5 content phase: 16 +2025/08/19 07:57:54 [debug] 349771#349771: *5 content phase: 17 +2025/08/19 07:57:54 [debug] 349771#349771: *5 content phase: 18 +2025/08/19 07:57:54 [debug] 349771#349771: *5 http filename: "./blobs/ae9f59c7ac386b7fe6343d669fc27f37d7b66256824be655d29a256908f154e9.md=404" +2025/08/19 07:57:54 [debug] 349771#349771: *5 add cleanup: 00005CE04361AD60 +2025/08/19 07:57:54 [error] 349771#349771: *5 open() "./blobs/ae9f59c7ac386b7fe6343d669fc27f37d7b66256824be655d29a256908f154e9.md=404" failed (2: No such file or directory), client: 127.0.0.1, server: localhost, request: "GET /ae9f59c7ac386b7fe6343d669fc27f37d7b66256824be655d29a256908f154e9 HTTP/1.1", host: "localhost:9001" +2025/08/19 07:57:54 [debug] 349771#349771: *5 http finalize request: 404, "/ae9f59c7ac386b7fe6343d669fc27f37d7b66256824be655d29a256908f154e9.md=404?" a:1, c:2 +2025/08/19 07:57:54 [debug] 349771#349771: *5 http special response: 404, "/ae9f59c7ac386b7fe6343d669fc27f37d7b66256824be655d29a256908f154e9.md=404?" +2025/08/19 07:57:54 [debug] 349771#349771: *5 http set discard body +2025/08/19 07:57:54 [debug] 349771#349771: *5 HTTP/1.1 404 Not Found +Server: nginx/1.18.0 (Ubuntu) +Date: Tue, 19 Aug 2025 11:57:54 GMT +Content-Type: text/html +Content-Length: 162 +Connection: keep-alive + +2025/08/19 07:57:54 [debug] 349771#349771: *5 write new buf t:1 f:0 00005CE04361ADE0, pos 00005CE04361ADE0, size: 164 file: 0, size: 0 +2025/08/19 07:57:54 [debug] 349771#349771: *5 http write filter: l:0 f:0 s:164 +2025/08/19 07:57:54 [debug] 349771#349771: *5 http output filter "/ae9f59c7ac386b7fe6343d669fc27f37d7b66256824be655d29a256908f154e9.md=404?" +2025/08/19 07:57:54 [debug] 349771#349771: *5 http copy filter: "/ae9f59c7ac386b7fe6343d669fc27f37d7b66256824be655d29a256908f154e9.md=404?" +2025/08/19 07:57:54 [debug] 349771#349771: *5 http postpone filter "/ae9f59c7ac386b7fe6343d669fc27f37d7b66256824be655d29a256908f154e9.md=404?" 00005CE04361AFD0 +2025/08/19 07:57:54 [debug] 349771#349771: *5 write old buf t:1 f:0 00005CE04361ADE0, pos 00005CE04361ADE0, size: 164 file: 0, size: 0 +2025/08/19 07:57:54 [debug] 349771#349771: *5 write new buf t:0 f:0 0000000000000000, pos 00005CE037B08580, size: 100 file: 0, size: 0 +2025/08/19 07:57:54 [debug] 349771#349771: *5 write new buf t:0 f:0 0000000000000000, pos 00005CE037B08C80, size: 62 file: 0, size: 0 +2025/08/19 07:57:54 [debug] 349771#349771: *5 http write filter: l:1 f:0 s:326 +2025/08/19 07:57:54 [debug] 349771#349771: *5 http write filter limit 0 +2025/08/19 07:57:54 [debug] 349771#349771: *5 writev: 326 of 326 +2025/08/19 07:57:54 [debug] 349771#349771: *5 http write filter 0000000000000000 +2025/08/19 07:57:54 [debug] 349771#349771: *5 http copy filter: 0 "/ae9f59c7ac386b7fe6343d669fc27f37d7b66256824be655d29a256908f154e9.md=404?" +2025/08/19 07:57:54 [debug] 349771#349771: *5 http finalize request: 0, "/ae9f59c7ac386b7fe6343d669fc27f37d7b66256824be655d29a256908f154e9.md=404?" a:1, c:2 +2025/08/19 07:57:54 [debug] 349771#349771: *5 http request count:2 blk:0 +2025/08/19 07:57:54 [debug] 349771#349771: *5 http finalize request: -4, "/ae9f59c7ac386b7fe6343d669fc27f37d7b66256824be655d29a256908f154e9.md=404?" a:1, c:1 +2025/08/19 07:57:54 [debug] 349771#349771: *5 set http keepalive handler +2025/08/19 07:57:54 [debug] 349771#349771: *5 http close request +2025/08/19 07:57:54 [debug] 349771#349771: *5 http log handler +2025/08/19 07:57:54 [debug] 349771#349771: *5 free: 00005CE043624610, unused: 2 +2025/08/19 07:57:54 [debug] 349771#349771: *5 free: 00005CE04361A980, unused: 2232 +2025/08/19 07:57:54 [debug] 349771#349771: *5 free: 00005CE0436090A0 +2025/08/19 07:57:54 [debug] 349771#349771: *5 hc free: 0000000000000000 +2025/08/19 07:57:54 [debug] 349771#349771: *5 hc busy: 0000000000000000 0 +2025/08/19 07:57:54 [debug] 349771#349771: *5 tcp_nodelay +2025/08/19 07:57:54 [debug] 349771#349771: *5 reusable connection: 1 +2025/08/19 07:57:54 [debug] 349771#349771: *5 event timer add: 6: 65000:171473068 +2025/08/19 07:57:54 [debug] 349771#349771: timer delta: 0 +2025/08/19 07:57:54 [debug] 349771#349771: worker cycle +2025/08/19 07:57:54 [debug] 349771#349771: epoll timer: 65000 +2025/08/19 07:57:54 [debug] 349771#349771: epoll: fd:6 ev:2001 d:000075EA426D11E1 +2025/08/19 07:57:54 [debug] 349771#349771: *5 http keepalive handler +2025/08/19 07:57:54 [debug] 349771#349771: *5 malloc: 00005CE0436090A0:1024 +2025/08/19 07:57:54 [debug] 349771#349771: *5 recv: eof:1, avail:-1 +2025/08/19 07:57:54 [debug] 349771#349771: *5 recv: fd:6 0 of 1024 +2025/08/19 07:57:54 [info] 349771#349771: *5 client 127.0.0.1 closed keepalive connection +2025/08/19 07:57:54 [debug] 349771#349771: *5 close http connection: 6 +2025/08/19 07:57:54 [debug] 349771#349771: *5 event timer del: 6: 171473068 +2025/08/19 07:57:54 [debug] 349771#349771: *5 reusable connection: 0 +2025/08/19 07:57:54 [debug] 349771#349771: *5 free: 00005CE0436090A0 +2025/08/19 07:57:54 [debug] 349771#349771: *5 free: 00005CE043606840, unused: 136 +2025/08/19 07:57:54 [debug] 349771#349771: timer delta: 2 +2025/08/19 07:57:54 [debug] 349771#349771: worker cycle +2025/08/19 07:57:54 [debug] 349771#349771: epoll timer: -1 diff --git a/logs/nginx.pid b/logs/nginx.pid index 16483d7..f6d4973 100644 --- a/logs/nginx.pid +++ b/logs/nginx.pid @@ -1 +1 @@ -296457 +349770 diff --git a/mime.types b/mime.types new file mode 100644 index 0000000..d721056 --- /dev/null +++ b/mime.types @@ -0,0 +1,95 @@ +types { + text/html html htm shtml; + text/css css; + text/xml xml; + image/gif gif; + image/jpeg jpeg jpg; + image/png png; + image/webp webp; + application/javascript js; + application/atom+xml atom; + application/rss+xml rss; + + text/mathml mml; + text/plain txt; + text/vnd.sun.j2me.app-descriptor jad; + text/vnd.wap.wml wml; + text/x-component htc; + + image/avif avif; + image/svg+xml svg svgz; + image/tiff tif tiff; + image/vnd.wap.wbmp wbmp; + image/x-icon ico; + image/x-jng jng; + image/x-ms-bmp bmp; + + font/woff woff; + font/woff2 woff2; + + application/java-archive jar war ear; + application/json json; + application/mac-binhex40 hqx; + application/msword doc; + application/pdf pdf; + application/postscript ps eps ai; + application/rtf rtf; + application/vnd.apple.mpegurl m3u8; + application/vnd.google-earth.kml+xml kml; + application/vnd.google-earth.kmz kmz; + application/vnd.ms-excel xls; + application/vnd.ms-fontobject eot; + application/vnd.ms-powerpoint ppt; + application/vnd.oasis.opendocument.graphics odg; + application/vnd.oasis.opendocument.presentation odp; + application/vnd.oasis.opendocument.spreadsheet ods; + application/vnd.oasis.opendocument.text odt; + application/vnd.openxmlformats-officedocument.presentationml.presentation pptx; + application/vnd.openxmlformats-officedocument.spreadsheetml.sheet xlsx; + application/vnd.openxmlformats-officedocument.wordprocessingml.document docx; + application/vnd.wap.wmlc wmlc; + application/wasm wasm; + application/x-7z-compressed 7z; + application/x-cocoa cco; + application/x-java-archive-diff jardiff; + application/x-java-jnlp-file jnlp; + application/x-makeself run; + application/x-perl pl pm; + application/x-pilot prc pdb; + application/x-rar-compressed rar; + application/x-redhat-package-manager rpm; + application/x-sea sea; + application/x-shockwave-flash swf; + application/x-stuffit sit; + application/x-tcl tcl tk; + application/x-x509-ca-cert der pem crt; + application/x-xpinstall xpi; + application/xhtml+xml xhtml; + application/xspf+xml xspf; + application/zip zip; + + application/octet-stream bin exe dll; + application/octet-stream deb; + application/octet-stream dmg; + application/octet-stream iso img; + application/octet-stream msi msp msm; + + audio/midi mid midi kar; + audio/mpeg mp3; + audio/ogg ogg; + audio/x-m4a m4a; + audio/x-realaudio ra; + + video/3gpp 3gpp 3gp; + video/mp2t ts; + video/mp4 mp4; + video/mpeg mpeg mpg; + video/quicktime mov; + video/webm webm; + video/x-flv flv; + video/x-m4v m4v; + video/x-mng mng; + video/x-ms-asf asx asf; + video/x-ms-wmv wmv; + video/x-msvideo avi; +} diff --git a/nostr_core_lib b/nostr_core_lib index 1da4f67..77d92db 160000 --- a/nostr_core_lib +++ b/nostr_core_lib @@ -1 +1 @@ -Subproject commit 1da4f6751ea6e275ece6226b13806de630abf482 +Subproject commit 77d92dbcf9f59d08bbf96f9dd42fcdca048b9154 diff --git a/put_test.sh b/put_test.sh new file mode 100755 index 0000000..2e94f74 --- /dev/null +++ b/put_test.sh @@ -0,0 +1,249 @@ +#!/bin/bash + +# put_test.sh - Test script for Ginxsom Blossom server upload functionality +# This script simulates a user uploading a blob to ginxsom using proper Blossom authentication + +set -e # Exit on any error + +# Configuration +SERVER_URL="http://localhost:9001" +UPLOAD_ENDPOINT="${SERVER_URL}/upload" +TEST_FILE="test_blob_$(date +%s).txt" +CLEANUP_FILES=() + +# Colors for output +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +BLUE='\033[0;34m' +NC='\033[0m' # No Color + +# Cleanup function +cleanup() { + echo -e "${YELLOW}Cleaning up temporary files...${NC}" + for file in "${CLEANUP_FILES[@]}"; do + if [[ -f "$file" ]]; then + rm -f "$file" + echo "Removed: $file" + fi + done +} + +# Set up cleanup on exit +trap cleanup EXIT + +# Helper functions +log_info() { + echo -e "${BLUE}[INFO]${NC} $1" +} + +log_success() { + echo -e "${GREEN}[SUCCESS]${NC} $1" +} + +log_error() { + echo -e "${RED}[ERROR]${NC} $1" +} + +log_warning() { + echo -e "${YELLOW}[WARNING]${NC} $1" +} + +# Check prerequisites +check_prerequisites() { + log_info "Checking prerequisites..." + + # Check if nak is installed + if ! command -v nak &> /dev/null; then + log_error "nak command not found. Please install nak first." + log_info "Install with: go install github.com/fiatjaf/nak@latest" + exit 1 + fi + log_success "nak is installed" + + # Check if curl is available + if ! command -v curl &> /dev/null; then + log_error "curl command not found. Please install curl." + exit 1 + fi + log_success "curl is available" + + # Check if sha256sum is available + if ! command -v sha256sum &> /dev/null; then + log_error "sha256sum command not found." + exit 1 + fi + log_success "sha256sum is available" + + # Check if base64 is available + if ! command -v base64 &> /dev/null; then + log_error "base64 command not found." + exit 1 + fi + log_success "base64 is available" +} + +# Check if server is running +check_server() { + log_info "Checking if server is running..." + + if curl -s -f "${SERVER_URL}/health" > /dev/null 2>&1; then + log_success "Server is running at ${SERVER_URL}" + else + log_error "Server is not responding at ${SERVER_URL}" + log_info "Please start the server with: ./scripts/start-fcgi.sh && nginx -p . -c config/local-nginx.conf" + exit 1 + fi +} + +# Create test file +create_test_file() { + log_info "Creating test file: ${TEST_FILE}" + + # Create test content with timestamp and random data + cat > "${TEST_FILE}" << EOF +Test blob content for Ginxsom Blossom server +Timestamp: $(date -Iseconds) +Random data: $(openssl rand -hex 32) +Test message: Hello from put_test.sh! + +This file is used to test the upload functionality +of the Ginxsom Blossom server implementation. +EOF + + CLEANUP_FILES+=("${TEST_FILE}") + log_success "Created test file with $(wc -c < "${TEST_FILE}") bytes" +} + +# Calculate file hash +calculate_hash() { + log_info "Calculating SHA-256 hash..." + + HASH=$(sha256sum "${TEST_FILE}" | cut -d' ' -f1) + log_success "File hash: ${HASH}" +} + +# Generate nostr event +generate_nostr_event() { + log_info "Generating kind 24242 nostr event with nak..." + + # Calculate expiration time (1 hour from now) + EXPIRATION=$(date -d '+1 hour' +%s) + + # Generate the event using nak + EVENT_JSON=$(nak event -k 24242 -c "" \ + -t "t=upload" \ + -t "x=${HASH}" \ + -t "expiration=${EXPIRATION}") + + if [[ -z "$EVENT_JSON" ]]; then + log_error "Failed to generate nostr event" + exit 1 + fi + + log_success "Generated nostr event" + echo "Event JSON: $EVENT_JSON" +} + +# Create authorization header +create_auth_header() { + log_info "Creating authorization header..." + + # Base64 encode the event (without newlines) + AUTH_B64=$(echo -n "$EVENT_JSON" | base64 -w 0) + AUTH_HEADER="Nostr ${AUTH_B64}" + + log_success "Created authorization header" + echo "Auth header length: ${#AUTH_HEADER} characters" +} + +# Perform upload +perform_upload() { + log_info "Performing upload to ${UPLOAD_ENDPOINT}..." + + # Create temporary file for response + RESPONSE_FILE=$(mktemp) + CLEANUP_FILES+=("${RESPONSE_FILE}") + + # Perform the upload with verbose output + HTTP_STATUS=$(curl -s -w "%{http_code}" \ + -X PUT \ + -H "Authorization: ${AUTH_HEADER}" \ + -H "Content-Type: application/octet-stream" \ + --data-binary "@${TEST_FILE}" \ + "${UPLOAD_ENDPOINT}" \ + -o "${RESPONSE_FILE}") + + echo "HTTP Status: ${HTTP_STATUS}" + echo "Response body:" + cat "${RESPONSE_FILE}" + echo + + # Check response + case "${HTTP_STATUS}" in + 200) + log_success "Upload successful!" + ;; + 201) + log_success "Upload successful (created)!" + ;; + 400) + log_error "Bad request - check the event format" + ;; + 401) + log_error "Unauthorized - authentication failed" + ;; + 405) + log_error "Method not allowed - check nginx configuration" + ;; + 413) + log_error "Payload too large" + ;; + 501) + log_warning "Upload endpoint not yet implemented (expected for now)" + ;; + *) + log_error "Upload failed with HTTP status: ${HTTP_STATUS}" + ;; + esac +} + +# Test file retrieval +test_retrieval() { + log_info "Testing file retrieval..." + + RETRIEVAL_URL="${SERVER_URL}/${HASH}" + + if curl -s -f "${RETRIEVAL_URL}" > /dev/null 2>&1; then + log_success "File can be retrieved at: ${RETRIEVAL_URL}" + else + log_warning "File not yet available for retrieval (expected if upload processing not implemented)" + fi +} + +# Main execution +main() { + echo "=== Ginxsom Blossom Upload Test ===" + echo "Timestamp: $(date -Iseconds)" + echo + + check_prerequisites + check_server + create_test_file + calculate_hash + generate_nostr_event + create_auth_header + perform_upload + test_retrieval + + echo + log_info "Test completed!" + echo "Summary:" + echo " Test file: ${TEST_FILE}" + echo " File hash: ${HASH}" + echo " Server: ${SERVER_URL}" + echo " Upload endpoint: ${UPLOAD_ENDPOINT}" +} + +# Run main function +main "$@" diff --git a/src/ginxsom.h b/src/ginxsom.h new file mode 100644 index 0000000..34505bd --- /dev/null +++ b/src/ginxsom.h @@ -0,0 +1,84 @@ +/* + * Ginxsom Blossom Server Header + * + * This header contains all function declarations and type definitions + * organized by BUD (Blossom Unified Draft) sections. + */ + +#ifndef GINXSOM_H +#define GINXSOM_H + +#include +#include +#include +#include +#include +#include "../nostr_core_lib/cjson/cJSON.h" +#include "../nostr_core_lib/nostr_core/nostr_core.h" + +#ifdef __cplusplus +extern "C" { +#endif + +///////////////////////////////////////////////////////////////////////////////////////// +///////////////////////////////////////////////////////////////////////////////////////// +// BUD 01 - Basic Protocol Flow +///////////////////////////////////////////////////////////////////////////////////////// +///////////////////////////////////////////////////////////////////////////////////////// + +// Database connection management +extern sqlite3* db; +int init_database(void); +void close_database(void); + +// SHA-256 extraction and validation +const char* extract_sha256_from_uri(const char* uri); + +// HEAD request handling +void handle_head_request(const char* uri); + +///////////////////////////////////////////////////////////////////////////////////////// +///////////////////////////////////////////////////////////////////////////////////////// +// BUD 02 - Upload & Authentication +///////////////////////////////////////////////////////////////////////////////////////// +///////////////////////////////////////////////////////////////////////////////////////// + +// Authorization header parsing +int parse_authorization_header(const char* auth_header, char* event_json, size_t json_size); + +// Blossom event validation (specific to kind 24242) +int validate_blossom_event(cJSON* event, const char* expected_hash, const char* method); + +// Main authentication orchestrator +int authenticate_request(const char* auth_header, const char* method, const char* file_hash); + +// Upload handling +void handle_upload_request(void); + +///////////////////////////////////////////////////////////////////////////////////////// +///////////////////////////////////////////////////////////////////////////////////////// +// BUD 06 - Upload Requirements +///////////////////////////////////////////////////////////////////////////////////////// +///////////////////////////////////////////////////////////////////////////////////////// + +// Upload policy management (for future implementation) +void handle_upload_requirements_request(void); + +///////////////////////////////////////////////////////////////////////////////////////// +///////////////////////////////////////////////////////////////////////////////////////// +// UTILITY FUNCTIONS +///////////////////////////////////////////////////////////////////////////////////////// +///////////////////////////////////////////////////////////////////////////////////////// + +// HTTP response helpers +void send_error_response(int status_code, const char* message); +void send_json_response(int status_code, const char* json_content); + +// Logging utilities +void log_request(const char* method, const char* uri, int status_code); + +#ifdef __cplusplus +} +#endif + +#endif // GINXSOM_H diff --git a/src/main.c b/src/main.c index 676e422..8146921 100644 --- a/src/main.c +++ b/src/main.c @@ -3,14 +3,18 @@ * Handles HEAD requests and other dynamic operations */ +#define _GNU_SOURCE #include #include #include +#include #include #include #include #include #include +#include +#include "ginxsom.h" #define MAX_SHA256_LEN 65 #define MAX_PATH_LEN 512 @@ -218,6 +222,266 @@ const char* extract_sha256_from_uri(const char* uri) { return sha256_buffer; } +///////////////////////////////////////////////////////////////////////////////////////// +///////////////////////////////////////////////////////////////////////////////////////// +// BUD 02 - Upload & Authentication +///////////////////////////////////////////////////////////////////////////////////////// +///////////////////////////////////////////////////////////////////////////////////////// + +// Parse Authorization header and extract JSON event +int parse_authorization_header(const char* auth_header, char* event_json, size_t json_size) { + if (!auth_header || !event_json) { + return NOSTR_ERROR_INVALID_INPUT; + } + + // Check for "Nostr " prefix (case-insensitive) + const char* prefix = "nostr "; + size_t prefix_len = strlen(prefix); + + if (strncasecmp(auth_header, prefix, prefix_len) != 0) { + printf("DEBUG: Authorization header missing 'Nostr ' prefix\r\n"); + return NOSTR_ERROR_INVALID_INPUT; + } + + // Extract base64 encoded event after "Nostr " + const char* base64_event = auth_header + prefix_len; + + // Decode base64 to JSON + // For now, we'll assume the event is already JSON (not base64 encoded) + // This is a simplified implementation - in production you'd need proper base64 decoding + size_t event_len = strlen(base64_event); + if (event_len >= json_size) { + printf("DEBUG: Event JSON too large for buffer\r\n"); + return NOSTR_ERROR_INVALID_INPUT; + } + + strncpy(event_json, base64_event, json_size - 1); + event_json[json_size - 1] = '\0'; + + printf("DEBUG: Parsed authorization header, extracted JSON: %.100s...\r\n", event_json); + return NOSTR_SUCCESS; +} + +// Validate Blossom-specific event requirements (kind 24242) +int validate_blossom_event(cJSON* event, const char* expected_hash, const char* method) { + if (!event) { + return NOSTR_ERROR_INVALID_INPUT; + } + + printf("DEBUG: Validating Blossom event\r\n"); + + // Check event kind (must be 24242 for Blossom uploads) + cJSON* kind_json = cJSON_GetObjectItem(event, "kind"); + if (!kind_json || !cJSON_IsNumber(kind_json)) { + printf("DEBUG: Event missing or invalid 'kind' field\r\n"); + return NOSTR_ERROR_EVENT_INVALID_CONTENT; + } + + int kind = cJSON_GetNumberValue(kind_json); + if (kind != 24242) { + printf("DEBUG: Event kind %d is not 24242 (Blossom upload)\r\n", kind); + return NOSTR_ERROR_EVENT_INVALID_CONTENT; + } + + // Check that created_at exists (basic validation) + cJSON* created_at_json = cJSON_GetObjectItem(event, "created_at"); + if (!created_at_json || !cJSON_IsNumber(created_at_json)) { + printf("DEBUG: Event missing or invalid 'created_at' field\r\n"); + return NOSTR_ERROR_EVENT_INVALID_CONTENT; + } + + // Look for expiration in tags + cJSON* tags = cJSON_GetObjectItem(event, "tags"); + if (!tags || !cJSON_IsArray(tags)) { + printf("DEBUG: Event missing or invalid 'tags' field\r\n"); + return NOSTR_ERROR_EVENT_INVALID_CONTENT; + } + + time_t expiration = 0; + int found_method = 0; + int found_hash = 0; + + // Parse tags for 't' (method), 'x' (hash), and 'expiration' + cJSON* tag = NULL; + cJSON_ArrayForEach(tag, tags) { + if (!cJSON_IsArray(tag)) continue; + + cJSON* tag_name = cJSON_GetArrayItem(tag, 0); + if (!tag_name || !cJSON_IsString(tag_name)) continue; + + const char* tag_name_str = cJSON_GetStringValue(tag_name); + + if (strcmp(tag_name_str, "t") == 0) { + // Method tag + cJSON* method_value = cJSON_GetArrayItem(tag, 1); + if (method_value && cJSON_IsString(method_value)) { + const char* event_method = cJSON_GetStringValue(method_value); + if (strcmp(event_method, method) == 0) { + found_method = 1; + printf("DEBUG: Found matching method tag: %s\r\n", event_method); + } + } + } else if (strcmp(tag_name_str, "x") == 0) { + // Hash tag + cJSON* hash_value = cJSON_GetArrayItem(tag, 1); + if (hash_value && cJSON_IsString(hash_value)) { + const char* event_hash = cJSON_GetStringValue(hash_value); + if (expected_hash && strcmp(event_hash, expected_hash) == 0) { + found_hash = 1; + printf("DEBUG: Found matching hash tag: %s\r\n", event_hash); + } + } + } else if (strcmp(tag_name_str, "expiration") == 0) { + // Expiration tag + cJSON* exp_value = cJSON_GetArrayItem(tag, 1); + if (exp_value && cJSON_IsString(exp_value)) { + expiration = (time_t)atol(cJSON_GetStringValue(exp_value)); + printf("DEBUG: Found expiration tag: %ld\r\n", expiration); + } + } + } + + // Check if method matches (required) + if (!found_method) { + printf("DEBUG: Event missing or invalid method tag\r\n"); + return NOSTR_ERROR_EVENT_INVALID_CONTENT; + } + + // Check if hash matches (if provided) + if (expected_hash && !found_hash) { + printf("DEBUG: Event hash doesn't match expected hash\r\n"); + return NOSTR_ERROR_EVENT_INVALID_CONTENT; + } + + // Check expiration + time_t now = time(NULL); + if (expiration > 0 && now > expiration) { + printf("DEBUG: Event expired (now: %ld, exp: %ld)\r\n", now, expiration); + return NOSTR_ERROR_EVENT_INVALID_CONTENT; + } + + printf("DEBUG: Blossom event validation passed\r\n"); + return NOSTR_SUCCESS; +} + +// Main authentication function +int authenticate_request(const char* auth_header, const char* method, const char* file_hash) { + if (!auth_header) { + printf("DEBUG: No authorization header provided\r\n"); + return NOSTR_ERROR_INVALID_INPUT; + } + + printf("DEBUG: Authenticating request - method: %s, hash: %s\r\n", + method ? method : "null", file_hash ? file_hash : "null"); + + // Parse authorization header + char event_json[4096]; + int parse_result = parse_authorization_header(auth_header, event_json, sizeof(event_json)); + if (parse_result != NOSTR_SUCCESS) { + printf("DEBUG: Authorization header parsing failed: %d\r\n", parse_result); + return parse_result; + } + + // Parse JSON event + cJSON* event = cJSON_Parse(event_json); + if (!event) { + printf("DEBUG: Failed to parse JSON event\r\n"); + return NOSTR_ERROR_EVENT_INVALID_CONTENT; + } + + // Validate event structure and signature using nostr_core_lib + int validation_result = nostr_validate_event(event); + if (validation_result != NOSTR_SUCCESS) { + printf("DEBUG: Nostr event validation failed: %d (%s)\r\n", + validation_result, nostr_strerror(validation_result)); + cJSON_Delete(event); + return validation_result; + } + + // Validate Blossom-specific requirements + int blossom_result = validate_blossom_event(event, file_hash, method); + if (blossom_result != NOSTR_SUCCESS) { + printf("DEBUG: Blossom event validation failed: %d\r\n", blossom_result); + cJSON_Delete(event); + return blossom_result; + } + + cJSON_Delete(event); + printf("DEBUG: Authentication successful\r\n"); + return NOSTR_SUCCESS; +} + +// Handle PUT /upload requests +void handle_upload_request(void) { + printf("DEBUG: handle_upload_request called\r\n"); + + // Get HTTP headers + const char* auth_header = getenv("HTTP_AUTHORIZATION"); + const char* content_type = getenv("CONTENT_TYPE"); + const char* content_length_str = getenv("CONTENT_LENGTH"); + + printf("DEBUG: auth_header=%s\r\n", auth_header ? auth_header : "NULL"); + printf("DEBUG: content_type=%s\r\n", content_type ? content_type : "NULL"); + printf("DEBUG: content_length=%s\r\n", content_length_str ? content_length_str : "NULL"); + + // Validate required headers + if (!auth_header) { + printf("Status: 401 Unauthorized\r\n"); + printf("Content-Type: text/plain\r\n\r\n"); + printf("Authorization header required\n"); + return; + } + + if (!content_type) { + printf("Status: 400 Bad Request\r\n"); + printf("Content-Type: text/plain\r\n\r\n"); + printf("Content-Type header required\n"); + return; + } + + if (!content_length_str) { + printf("Status: 400 Bad Request\r\n"); + printf("Content-Type: text/plain\r\n\r\n"); + printf("Content-Length header required\n"); + return; + } + + long content_length = atol(content_length_str); + if (content_length <= 0 || content_length > 100 * 1024 * 1024) { // 100MB limit + printf("Status: 413 Payload Too Large\r\n"); + printf("Content-Type: text/plain\r\n\r\n"); + printf("File size must be between 1 byte and 100MB\n"); + return; + } + + // Authenticate the request + int auth_result = authenticate_request(auth_header, "PUT", NULL); + if (auth_result != NOSTR_SUCCESS) { + printf("DEBUG: Authentication failed: %d\r\n", auth_result); + printf("Status: 401 Unauthorized\r\n"); + printf("Content-Type: text/plain\r\n\r\n"); + printf("Authentication failed\n"); + return; + } + + printf("DEBUG: Authentication successful, proceeding with upload\r\n"); + + // For now, return a simple response indicating the upload endpoint is working + // In a full implementation, you would: + // 1. Read the file data from stdin + // 2. Calculate SHA-256 hash + // 3. Save file to blobs/ directory with proper extension + // 4. Store metadata in database + // 5. Return blob descriptor JSON + + printf("Status: 501 Not Implemented\r\n"); + printf("Content-Type: application/json\r\n\r\n"); + printf("{\n"); + printf(" \"message\": \"Upload endpoint authenticated successfully\",\n"); + printf(" \"note\": \"Full file upload implementation pending\"\n"); + printf("}\n"); +} + int main(void) { while (FCGI_Accept() >= 0) { // DEBUG: Log every request received @@ -249,6 +513,9 @@ int main(void) { printf("Content-Type: text/plain\r\n\r\n"); printf("Invalid SHA-256 hash in URI\n"); } + } else if (strcmp(request_method, "PUT") == 0 && strcmp(request_uri, "/upload") == 0) { + // Handle PUT /upload requests with authentication + handle_upload_request(); } else { // Other methods not implemented yet printf("Status: 501 Not Implemented\r\n");