Compare commits

...

35 Commits
v0.9 ... master

Author SHA1 Message Date
bel 46de2a126c can pass ip 2025-10-19 21:24:24 -06:00
bel 981c850edf add access logger option 2023-08-17 17:08:10 -06:00
bel 1a4be5d384 :wqastub 2023-08-17 16:40:55 -06:00
bel a1b6ca009f k 2023-05-07 19:41:09 -06:00
bel e3908bae2e k 2023-05-07 19:36:45 -06:00
bel 6a92a82363 up go mod gzip 2023-05-07 19:18:36 -06:00
bel 04ebdea6e6 no bin 2023-04-28 16:01:56 -06:00
bel 8b742bedc4 no bin 2023-04-28 16:01:50 -06:00
bel c46d4ea7db up gzip 2023-04-28 15:58:21 -06:00
Bel LaPointe 0ff452b107 gogs.inhome 2023-04-10 11:14:58 -06:00
Bel LaPointe ffce678ff6 stub 2023-04-10 11:10:59 -06:00
bel eaa8debb73 no binary 2022-07-09 16:36:57 -06:00
bel 3727e2ee5e support for basic auth 2022-07-09 16:27:49 -06:00
bel 7fabfcd14d got md ok 2022-07-09 16:18:11 -06:00
bel 19c13c43f6 log 2022-07-09 15:56:21 -06:00
bel fc7451ab40 add https only forwarding 2022-07-09 15:49:14 -06:00
bel c8e09a989d add -ro for read-only tag 2022-07-09 15:21:11 -06:00
bel 7b04c49f4a change default bundle.css 2022-06-26 21:33:25 -06:00
bel de57779200 whoops 2022-06-26 21:30:02 -06:00
bel d706a2c4a3 Merge branch 'master' of https://gogs.inhome.blapointe.com/local/simpleserve 2022-06-26 21:29:26 -06:00
bel 90252d971f sub gomod 2022-06-26 21:27:15 -06:00
Bel LaPointe 16c4ade51b up go mod 2021-11-29 12:44:02 -07:00
Bel LaPointe 58e8a594eb go mod 2021-09-17 08:24:09 -06:00
Bel LaPointe 0002243ffd whoops 2021-08-17 12:56:02 -06:00
Bel LaPointe d90ef4c1a5 del 2020-11-07 09:48:01 -07:00
Bel LaPointe 1c45c4d7a2 More overload 2020-09-28 14:45:19 -06:00
bel c130c3af69 Set navs to toc class 2020-09-28 14:15:39 -06:00
Bel LaPointe 2dd49e169a repeat bg just in case 2020-09-28 13:37:56 -06:00
Bel LaPointe 06b849ed2e Tune up md for prettiness 2020-09-28 13:34:29 -06:00
Bel LaPointe db6caf7c28 DND css in 2020-09-28 09:55:53 -06:00
Bel LaPointe 84955c01b5 Render markdown as html by default 2020-09-28 09:51:39 -06:00
Bel LaPointe f373524377 Remove exectuables 2020-09-05 12:11:08 -06:00
Bel LaPointe ea3554912c Export helper 2020-07-23 23:23:26 -06:00
bel 66a35fcf10 More types 2020-04-13 20:47:42 +00:00
bel 05ef683334 More content types 2020-04-13 13:00:30 +00:00
9 changed files with 468 additions and 56 deletions

3
.gitignore vendored
View File

@ -1,5 +1,6 @@
*.key
simpleserve
/simpleserve
/exec-*
*.crt
*.pem
*.swp

1
deploy_erazuno.sh Normal file
View File

@ -0,0 +1 @@
GOOS=linux GOARCH=arm GOARM=5 CGO_ENABLED=0 go build -a -installsuffix cgo -o exec-simpleserve && scp -i $HOME/.ssh/id_rsa ./exec-simpleserve zach@192.168.1.123:/var/services/homes/zach/erazuno/exec-simpleserve.new; rm ./exec-simpleserve

14
go.mod Normal file
View File

@ -0,0 +1,14 @@
module gogs.inhome.blapointe.com/local/simpleserve
go 1.18
require (
gogs.inhome.blapointe.com/local/args v0.0.0-20230410154220-44370f257b34
gogs.inhome.blapointe.com/local/gziphttp v0.0.0-20230508014052-4ccd700640fc
gogs.inhome.blapointe.com/local/notes-server v0.0.0-20230410171406-a4d39d38dc55
)
require (
github.com/gomarkdown/markdown v0.0.0-20220607163217-45f7c050e2d1 // indirect
gopkg.in/yaml.v2 v2.4.0 // indirect
)

213
go.sum Normal file
View File

@ -0,0 +1,213 @@
bazil.org/fuse v0.0.0-20180421153158-65cc252bf669/go.mod h1:Xbm+BRKSBEpa4q4hTSxohYNQpsxXPbPry4JJWOB3LB8=
cloud.google.com/go v0.33.1/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
github.com/Azure/azure-pipeline-go v0.1.8/go.mod h1:XA1kFWRVhSK+KNFiOhfv83Fv8L9achrP7OxIzeTn1Yg=
github.com/Azure/azure-storage-blob-go v0.0.0-20181023070848-cf01652132cc/go.mod h1:oGfmITT1V6x//CswqY2gtAHND+xIP64/qL7a5QJix0Y=
github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8=
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
github.com/Unknwon/goconfig v0.0.0-20181105214110-56bd8ab18619/go.mod h1:wngxua9XCNjvHjDiTiV26DaKDT+0c63QR6H5hjVUUxw=
github.com/a8m/tree v0.0.0-20180321023834-3cf936ce15d6/go.mod h1:FSdwKX97koS5efgm8WevNf7XS3PqtyFkKDDXrz778cg=
github.com/abbot/go-http-auth v0.4.0/go.mod h1:Cz6ARTIzApMJDzh5bRMSUou6UMSp0IEXg9km/ci7TJM=
github.com/anacrolix/dms v0.0.0-20180117034613-8af4925bffb5/go.mod h1:DGqLjaZ3ziKKNRt+U5Q9PLWJ52Q/4rxfaaH/b3QYKaE=
github.com/aws/aws-sdk-go v1.15.81/go.mod h1:E3/ieXAlvM0XWO57iftYVDLLvQ824smPP3ATZkfNZeM=
github.com/billziss-gh/cgofuse v1.1.0/go.mod h1:LJjoaUojlVjgo5GQoEJTcJNqZJeRU0nCR84CyxKt2YM=
github.com/boltdb/bolt v1.3.1/go.mod h1:clJnj/oiGkjum5o1McbSZDSLxVThjynRyGBgiAx27Ps=
github.com/coreos/bbolt v0.0.0-20180318001526-af9db2027c98/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk=
github.com/cpuguy83/go-md2man v1.0.8/go.mod h1:N6JayAiVKtlHSnuTCeuLSQVs75hb8q+dYQLjr7cDsKY=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/djherbis/times v1.1.0/go.mod h1:CGMZlo255K5r4Yw0b9RRfFQpM2y7uOmxg4jm9HsaVf8=
github.com/dropbox/dropbox-sdk-go-unofficial v5.4.0+incompatible/go.mod h1:lr+LhMM3F6Y3lW1T9j2U5l7QeuWm87N9+PPXo3yH4qY=
github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk=
github.com/fairlyblank/md2min v0.0.0-20171213131418-39cd6e9904ac/go.mod h1:QAobgT+CwT/SRphqV6Jrz5jt3wkW9Q72QNquEvh6dLk=
github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
github.com/gobuffalo/attrs v0.0.0-20190224210810-a9411de4debd/go.mod h1:4duuawTqi2wkkpB4ePgWMaai6/Kc6WEz83bhFwpHzj0=
github.com/gobuffalo/depgen v0.0.0-20190329151759-d478694a28d3/go.mod h1:3STtPUQYuzV0gBVOY3vy6CfMm/ljR4pABfrTeHNLHUY=
github.com/gobuffalo/depgen v0.1.0/go.mod h1:+ifsuy7fhi15RWncXQQKjWS9JPkdah5sZvtHc2RXGlg=
github.com/gobuffalo/envy v1.6.15/go.mod h1:n7DRkBerg/aorDM8kbduw5dN3oXGswK5liaSCx4T5NI=
github.com/gobuffalo/envy v1.7.0/go.mod h1:n7DRkBerg/aorDM8kbduw5dN3oXGswK5liaSCx4T5NI=
github.com/gobuffalo/flect v0.1.0/go.mod h1:d2ehjJqGOH/Kjqcoz+F7jHTBbmDb38yXA598Hb50EGs=
github.com/gobuffalo/flect v0.1.1/go.mod h1:8JCgGVbRjJhVgD6399mQr4fx5rRfGKVzFjbj6RE/9UI=
github.com/gobuffalo/flect v0.1.3/go.mod h1:8JCgGVbRjJhVgD6399mQr4fx5rRfGKVzFjbj6RE/9UI=
github.com/gobuffalo/genny v0.0.0-20190329151137-27723ad26ef9/go.mod h1:rWs4Z12d1Zbf19rlsn0nurr75KqhYp52EAGGxTbBhNk=
github.com/gobuffalo/genny v0.0.0-20190403191548-3ca520ef0d9e/go.mod h1:80lIj3kVJWwOrXWWMRzzdhW3DsrdjILVil/SFKBzF28=
github.com/gobuffalo/genny v0.1.0/go.mod h1:XidbUqzak3lHdS//TPu2OgiFB+51Ur5f7CSnXZ/JDvo=
github.com/gobuffalo/genny v0.1.1/go.mod h1:5TExbEyY48pfunL4QSXxlDOmdsD44RRq4mVZ0Ex28Xk=
github.com/gobuffalo/gitgen v0.0.0-20190315122116-cc086187d211/go.mod h1:vEHJk/E9DmhejeLeNt7UVvlSGv3ziL+djtTr3yyzcOw=
github.com/gobuffalo/gogen v0.0.0-20190315121717-8f38393713f5/go.mod h1:V9QVDIxsgKNZs6L2IYiGR8datgMhB577vzTDqypH360=
github.com/gobuffalo/gogen v0.1.0/go.mod h1:8NTelM5qd8RZ15VjQTFkAW6qOMx5wBbW4dSCS3BY8gg=
github.com/gobuffalo/gogen v0.1.1/go.mod h1:y8iBtmHmGc4qa3urIyo1shvOD8JftTtfcKi+71xfDNE=
github.com/gobuffalo/logger v0.0.0-20190315122211-86e12af44bc2/go.mod h1:QdxcLw541hSGtBnhUc4gaNIXRjiDppFGaDqzbrBd3v8=
github.com/gobuffalo/mapi v1.0.1/go.mod h1:4VAGh89y6rVOvm5A8fKFxYG+wIW6LO1FMTG9hnKStFc=
github.com/gobuffalo/mapi v1.0.2/go.mod h1:4VAGh89y6rVOvm5A8fKFxYG+wIW6LO1FMTG9hnKStFc=
github.com/gobuffalo/packd v0.0.0-20190315124812-a385830c7fc0/go.mod h1:M2Juc+hhDXf/PnmBANFCqx4DM3wRbgDvnVWeG2RIxq4=
github.com/gobuffalo/packd v0.1.0/go.mod h1:M2Juc+hhDXf/PnmBANFCqx4DM3wRbgDvnVWeG2RIxq4=
github.com/gobuffalo/packr/v2 v2.0.9/go.mod h1:emmyGweYTm6Kdper+iywB6YK5YzuKchGtJQZ0Odn4pQ=
github.com/gobuffalo/packr/v2 v2.2.0/go.mod h1:CaAwI0GPIAv+5wKLtv8Afwl+Cm78K/I/VCm/3ptBN+0=
github.com/gobuffalo/syncx v0.0.0-20190224160051-33c29581e754/go.mod h1:HhnNqWY95UYwwW3uSASeV7vtgYkT2t16hJgV3AEPUpw=
github.com/goftp/file-driver v0.0.0-20180502053751-5d604a0fc0c9/go.mod h1:GpOj6zuVBG3Inr9qjEnuVTgBlk2lZ1S9DcoFiXWyKss=
github.com/goftp/server v0.0.0-20190111142836-88de73f463af/go.mod h1:k/SS6VWkxY7dHPhoMQ8IdRu8L4lQtmGbhyXGg+vCnXE=
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
github.com/gomarkdown/markdown v0.0.0-20220607163217-45f7c050e2d1 h1:wAupuFkZ/yq219/mSbqDtMfUZQY0gTYEtoz3/LKtppU=
github.com/gomarkdown/markdown v0.0.0-20220607163217-45f7c050e2d1/go.mod h1:JDGcbDT52eL4fju3sZ4TeHGsQwhG9nbDV21aMyhwPoA=
github.com/gomodule/redigo v1.8.5/go.mod h1:P9dn9mFrCBvWhGE1wpxx6fgq7BAeLBk+UUUzlpkBYO0=
github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck=
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
github.com/gopherjs/gopherjs v0.0.0-20181103185306-d547d1d9531e/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8=
github.com/jlaffaye/ftp v0.0.0-20181101112434-47f21d10f0ee/go.mod h1:lli8NYPQOFy3O++YmYbqVgOcQ1JPCwdOy+5zSjKJ9qY=
github.com/jmespath/go-jmespath v0.0.0-20160202185014-0b12d6b521d8/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k=
github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k=
github.com/joho/godotenv v1.3.0/go.mod h1:7hK45KPybAkOC6peb+G5yklZfMxEjkZhHbwpqxOKXbg=
github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
github.com/jtolds/gls v4.2.1+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=
github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=
github.com/kardianos/osext v0.0.0-20170510131534-ae77be60afb1/go.mod h1:1NbS8ALrpOvjt0rHPNLyCIeMtbizbir8U//inJ+zuB8=
github.com/karrick/godirwalk v1.8.0/go.mod h1:H5KPZjojv4lE+QYImBI8xVtrBRgYrIVsaRPx4tDPEn4=
github.com/karrick/godirwalk v1.10.3/go.mod h1:RoGL9dQei4vP9ilrpETWE8CLOZ1kiN0LhBygSwrAsHA=
github.com/klauspost/compress v1.9.5/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A=
github.com/klauspost/cpuid v1.2.3/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek=
github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg=
github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI=
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE=
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
github.com/markbates/oncer v0.0.0-20181203154359-bf2de49a0be2/go.mod h1:Ld9puTsIW75CHf65OeIOkyKbteujpZVXDpWK6YGZbxE=
github.com/markbates/safe v1.0.1/go.mod h1:nAqgmRi7cY2nqMc92/bSEeQA+R4OheNU2T1kNSCBdG0=
github.com/mattn/go-runewidth v0.0.3/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU=
github.com/minio/md5-simd v1.1.0/go.mod h1:XpBqgZULrMYD3R+M28PcmP0CkI7PEMzB3U77ZrKZ0Gw=
github.com/minio/minio-go/v6 v6.0.57/go.mod h1:5+R/nM9Pwrh0vqF+HbYYDQ84wdUFPyXHkrdT4AIkifM=
github.com/minio/sha256-simd v0.1.1/go.mod h1:B5e1o+1/KgNmWrSQK08Y6Z1Vb5pwIktudl0J58iy0KM=
github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc=
github.com/ncw/go-acd v0.0.0-20171120105400-887eb06ab6a2/go.mod h1:MLIrzg7gp/kzVBxRE1olT7CWYMCklcUWU+ekoxOD9x0=
github.com/ncw/rclone v1.46.0/go.mod h1:+uFY4HNpat/yXXIEin5ETWXxIwEplC+eDe/vT8vlk1w=
github.com/ncw/swift v1.0.44/go.mod h1:23YIA4yWVnGwv2dQlN4bB7egfYX6YLn0Yo/S6zZO/ZM=
github.com/nsf/termbox-go v0.0.0-20181027232701-60ab7e3d12ed/go.mod h1:IuKpRQcYE1Tfu+oAQqaLisqDeXgjyyltCfsaoYN18NQ=
github.com/okzk/sdnotify v0.0.0-20180710141335-d9becc38acbd/go.mod h1:4soZNh0zW0LtYGdQ416i0jO0EIqMGcbtaspRS4BDvRQ=
github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
github.com/patrickmn/go-cache v2.1.0+incompatible/go.mod h1:3Qf8kWWT7OJRJbdiICTKqZju1ZixQ/KpMGzzAfe6+WQ=
github.com/pelletier/go-toml v1.7.0/go.mod h1:vwGMzjaWMwyfHwgIBhI2YUM4fB6nL6lVAvS1LBMMhTE=
github.com/pengsrc/go-shared v0.2.0/go.mod h1:jVblp62SafmidSkvWrXyxAme3gaTfEtWwRPGz5cpvHg=
github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pkg/sftp v1.8.3/go.mod h1:NxmoDg/QLVWluQDUYG7XBZTLUpKeFa8e3aMf1BfjyHk=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/rfjakob/eme v0.0.0-20171028163933-2222dbd4ba46/go.mod h1:U2bmx0hDj8EyDdcxmD5t3XHDnBFnyNNc22n1R4008eM=
github.com/rogpeppe/go-internal v1.1.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
github.com/rogpeppe/go-internal v1.2.2/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g=
github.com/russross/blackfriday v1.6.0/go.mod h1:ti0ldHuxg49ri4ksnFxlkCfN+hvslNlmVHqNRXXJNAY=
github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
github.com/sevlyar/go-daemon v0.1.4/go.mod h1:6dJpPatBT9eUwM5VCw9Bt6CdX9Tk6UWvhW3MebLDRKE=
github.com/shurcooL/httpfs v0.0.0-20171119174359-809beceb2371/go.mod h1:ZY1cvUeJuFPAdZ/B6v7RHavJWZn2YPVFQ1OSXhCGOkg=
github.com/shurcooL/vfsgen v0.0.0-20181202132449-6a9ea43bcacd/go.mod h1:TrYk7fJVaAttu97ZZKrO9UbRa8izdowaMIZcxYMbVaw=
github.com/sirupsen/logrus v1.4.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q=
github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=
github.com/sirupsen/logrus v1.5.0/go.mod h1:+F7Ogzej0PZc/94MaYx/nvG9jOFMD2osvC3s+Squfpo=
github.com/skratchdot/open-golang v0.0.0-20160302144031-75fb7ed4208c/go.mod h1:sUM3LWHvSMaG192sy56D9F7CNvL7jUJVXoqM1QKLnog=
github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=
github.com/smartystreets/goconvey v0.0.0-20181108003508-044398e4856c/go.mod h1:XDJAKZRPZ1CvBcN2aX5YOUTYGHki24fSF0Iv48Ibg0s=
github.com/smartystreets/goconvey v0.0.0-20190330032615-68dc04aab96a/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=
github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ=
github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/syndtr/goleveldb v1.0.0/go.mod h1:ZVVdQEZoIme9iO1Ch2Jdy24qqXrMMOU6lpPAyBWyWuQ=
github.com/t3rm1n4l/go-mega v0.0.0-20190205172012-55a226cf41da/go.mod h1:XWL4vDyd3JKmJx+hZWUVgCNmmhZ2dTBcaNDcxH465s0=
github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk=
github.com/xanzy/ssh-agent v0.2.0/go.mod h1:0NyE30eGUDliuLEHJgYte/zncp2zdTStcOnWhgSqHD8=
github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI=
github.com/xdg-go/scram v1.0.2/go.mod h1:1WAq6h33pAW+iRreB34OORO2Nf7qel3VV3fjBj+hCSs=
github.com/xdg-go/stringprep v1.0.2/go.mod h1:8F9zXuvzgwmyT5DUm4GUfZGDdT3W+LCvS6+da4O5kxM=
github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d/go.mod h1:rHwXgn7JulP+udvsHwJoVG1YGAP6VLg4y9I5dyZdqmA=
github.com/yuin/goldmark v1.3.4-0.20210326114109-75d8cce5b78c/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
github.com/yunify/qingstor-sdk-go v2.2.15+incompatible/go.mod h1:w6wqLDQ5bBTzxGJ55581UrSwLrsTAsdo9N6yX/8d9RY=
go.mongodb.org/mongo-driver v1.7.2/go.mod h1:Q4oFMbo1+MSNqICAdYMlC/zSTrwCogR4R8NzkI+yfU8=
gogs.inhome.blapointe.com/local/args v0.0.0-20230410154220-44370f257b34 h1:0tuX5dfOksiOQD1vbJjVNVTVxTTIng7UrUdSLF5T+Ao=
gogs.inhome.blapointe.com/local/args v0.0.0-20230410154220-44370f257b34/go.mod h1:YG9n3Clg7683ohkVnJK2hdX8bBS9EojIsd1qPZumX0Y=
gogs.inhome.blapointe.com/local/gziphttp v0.0.0-20230410171240-32da87640b26/go.mod h1:Sdj/NB9h3xrzPDqViQAHoDhA5gmpHkrWRXUauvLSA74=
gogs.inhome.blapointe.com/local/gziphttp v0.0.0-20230508014052-4ccd700640fc h1:ayxolpOV9uIm8rGdmtz03d5JlnbSmFF8daKjmwrZZ1o=
gogs.inhome.blapointe.com/local/gziphttp v0.0.0-20230508014052-4ccd700640fc/go.mod h1:Sdj/NB9h3xrzPDqViQAHoDhA5gmpHkrWRXUauvLSA74=
gogs.inhome.blapointe.com/local/logb v0.0.0-20230410154319-880efa39d871/go.mod h1:E0pLNvMLzY0Kth1W078y+06z1AUyVMWnChMpRFf4w2Q=
gogs.inhome.blapointe.com/local/notes-server v0.0.0-20230410171406-a4d39d38dc55 h1:WRN6wfRNgKGJJ0MyEnY6DzAQQbzJDTeMdQiuoO/Ib3g=
gogs.inhome.blapointe.com/local/notes-server v0.0.0-20230410171406-a4d39d38dc55/go.mod h1:TcdL6JdQXp2624U28X/ZKtv+UZuHEWZBI9qRrVFNFpc=
gogs.inhome.blapointe.com/local/oauth2 v0.0.0-20230410162733-d39498ff8454/go.mod h1:YDG4DAUbmKcQUDWdZAJyoUtX+N2zQIFQ0fz88lAPuiU=
gogs.inhome.blapointe.com/local/router v0.0.0-20230410162418-08ccdc13df87/go.mod h1:FCXhK6+lzJcxBsptnei6vw9pChuQvr4NtuosngjVJDk=
gogs.inhome.blapointe.com/local/storage v0.0.0-20230410162102-db39d7b02e29/go.mod h1:zk8Fe2Ezc2f6oOe2yllsbEhXqssUU1K2faoS0eQ9alY=
golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
golang.org/x/crypto v0.0.0-20190131182504-b8fe1690c613/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/crypto v0.0.0-20190422162423-af44ce270edf/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE=
golang.org/x/crypto v0.0.0-20190513172903-22d7a77e9e5f/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20200302210943-78000ba7a073/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=
golang.org/x/oauth2 v0.0.0-20181120190819-8f65e3013eba/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20190412183630-56d357773e84/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20181122145206-62eef0e2fa9b/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190403152447-81d4e9dc473e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190419153524-e8e3143a4f4a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190531175056-4c3a928424d2/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
golang.org/x/tools v0.0.0-20190329151228-23e29df326fe/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
golang.org/x/tools v0.0.0-20190416151739-9c9e1878f421/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
golang.org/x/tools v0.0.0-20190420181800-aa740d480789/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
golang.org/x/tools v0.0.0-20190531172133-b3315ee88b7d/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
google.golang.org/api v0.0.0-20181120235003-faade3cbb06a/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0=
google.golang.org/appengine v1.3.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY=
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=
gopkg.in/ini.v1 v1.42.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw=
gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=

230
main.go
View File

@ -1,20 +1,12 @@
/*
Serve is a very simple static file server in go
Usage:
-p="8100": port to serve on
-d=".": the directory of static files to host
Navigating to http://localhost:8100 will display the index.html or directory
listing file.
*/
package main
import (
"bytes"
"encoding/json"
"errors"
"fmt"
"io"
"local/args"
"local/gziphttp"
"io/ioutil"
"log"
"net/http"
"net/http/httptest"
@ -22,6 +14,11 @@ import (
"path"
"regexp"
"strings"
"time"
"gogs.inhome.blapointe.com/local/args"
"gogs.inhome.blapointe.com/local/gziphttp"
"gogs.inhome.blapointe.com/local/notes-server/notes/md"
)
const (
@ -36,23 +33,106 @@ var (
func main() {
fs = args.NewArgSet()
fs.Append(args.STRING, "p", "port to serve", "8100")
fs.Append(args.STRING, "ip", "ip to serve", "")
fs.Append(args.STRING, "u", "user:pass for basic auth", "")
fs.Append(args.BOOL, "md", "whether to render markdown as html", true)
fs.Append(args.BOOL, "log", "emit access logs", false)
fs.Append(args.BOOL, "ro", "read only mode", false)
fs.Append(args.BOOL, "https", "https only", false)
fs.Append(args.STRING, "md-css", "css to load for md", "/dev/null")
fs.Append(args.STRING, "md-class", "class to wrap md", "phb")
fs.Append(args.STRING, "d", "static path to serve", "./public")
if err := fs.Parse(); err != nil {
panic(err)
}
d := fs.Get("d").GetString()
userPass := fs.Get("u").GetString()
md := fs.Get("md").GetBool()
ro := fs.Get("ro").GetBool()
https := fs.Get("https").GetBool()
mdCss := fs.Get("md-css").GetString()
mdClass := fs.Get("md-class").GetString()
accessLogging := fs.GetBool("log")
if mdCss != "" {
b, err := ioutil.ReadFile(mdCss)
if err != nil {
panic(err)
}
mdCss = fmt.Sprintf(`
<style>
body > div {
margin: auto;
overflow: auto;
}
.%s {
width: auto !important;
/*height: auto !important;*/
/*height: 100%% !important;
column-count: auto !important;
-webkit-column-count: auto !important;*/
overflow: auto !important;
background-repeat: repeat-x;
}
.%s h1 {
/*
column-span: none !important;
-webkit-column-span: none !important;
*/
}
.%s hr+table {
margin-top: 40px !important;
}
.%s nav {
/*
background: none !important;
*/
display: none;
}
%s
</style>`,
mdClass,
mdClass,
mdClass,
mdClass,
b,
)
}
ip := fs.Get("ip").GetString()
p := strings.TrimPrefix(fs.Get("p").GetString(), ":")
http.Handle("/", http.HandlerFunc(handler(d)))
http.Handle("/", http.HandlerFunc(handler(userPass, https, ro, d, md, mdCss, mdClass, accessLogging)))
log.Printf("Serving %s on HTTP port: %s\n", d, p)
log.Fatal(http.ListenAndServe(":"+p, nil))
log.Fatal(http.ListenAndServe(ip+":"+p, nil))
}
func handler(d string) http.HandlerFunc {
return gzip(endpoints(withDel(fserve(d))))
func handler(userPass string, https, ro bool, d string, md bool, mdCss, mdClass string, accessLogging bool) http.HandlerFunc {
return withAccessLogging(accessLogging, httpsOnly(https, gzip(basicAuth(userPass, endpoints(ro, withDel(ro, withMD(d, md, mdCss, mdClass, fserve(d))))))))
}
func withAccessLogging(enabled bool, h http.HandlerFunc) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
if r.URL.Host == "" {
r.URL.Host = r.Host
}
b, _ := json.Marshal(map[string]any{
"_ts": time.Now(),
"client": map[string]any{
"ip": r.RemoteAddr,
"forwarded-for": r.Header.Get("X-Forwarded-For"),
"user-agent": r.UserAgent(),
},
"request": map[string]any{
"method": r.Method,
"url": r.URL.String(),
"headers": r.Header,
},
})
fmt.Printf("%s\n", b)
h(w, r)
}
}
func writeMeta(w http.ResponseWriter) {
@ -73,6 +153,32 @@ func writeForm(w http.ResponseWriter) {
`, ENDPOINT_UPLOAD)
}
func basicAuth(userPass string, foo http.HandlerFunc) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
if userPass != "" {
u, p, ok := r.BasicAuth()
if !ok || u+":"+p != userPass {
w.Header().Set("WWW-Authenticate", "Basic")
w.WriteHeader(401)
return
}
}
foo(w, r)
}
}
func httpsOnly(https bool, foo http.HandlerFunc) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
if https && r.URL.Scheme != "https" {
log.Printf("redirecting: %+v", r.URL)
r.URL.Scheme = "https"
http.Redirect(w, r, r.URL.String(), http.StatusSeeOther)
return
}
foo(w, r)
}
}
func gzip(foo http.HandlerFunc) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
if gziphttp.Can(r) {
@ -84,22 +190,24 @@ func gzip(foo http.HandlerFunc) http.HandlerFunc {
}
}
func endpoints(foo http.HandlerFunc) http.HandlerFunc {
func endpoints(ro bool, foo http.HandlerFunc) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
if isDir(r) {
writeMeta(w)
writeForm(w)
if !ro {
writeForm(w)
}
}
if isUploaded(r) {
if !ro && isUploaded(r) {
if err := upload(w, r); err != nil {
fmt.Fprintln(w, err.Error())
}
} else if isDeleted(r) {
} else if !ro && isDeleted(r) {
if err := del(w, r); err != nil {
fmt.Fprintln(w, err.Error())
}
} else {
setContentTypeIfMedia(w, r)
gziphttp.SetContentTypeIfMedia(w, r)
foo(w, r)
}
}
@ -128,19 +236,44 @@ func isDir(r *http.Request) bool {
return true
}
func withDel(foo http.HandlerFunc) http.HandlerFunc {
func withMD(dir string, enabled bool, mdCss, mdClass string, foo http.HandlerFunc) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
realpath := toRealPath(r.URL.Path)
if enabled && !isDir(r) && path.Ext(realpath) == ".md" {
b, err := ioutil.ReadFile(realpath)
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
s, err := md.Gomarkdown(b, nil)
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
fmt.Fprintln(w, mdCss)
fmt.Fprintf(w, "<div class=%q>", mdClass)
s = strings.ReplaceAll(s, "<nav>", `<nav class="toc">`)
fmt.Fprintln(w, s)
fmt.Fprintf(w, "</div>")
} else {
foo(w, r)
}
}
}
func withDel(ro bool, foo http.HandlerFunc) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
if !isDir(r) {
foo(w, r)
return
}
fmt.Fprintln(w, `<a href=".."><input type="button" style="padding: .15em 4em .35em 4em" value=".."/></a>`+"\n")
fmt.Fprintln(w, `<a href=".."><input type="button" style="padding: .15em 4em .35em 4em" value=".."/></a>`)
w2 := httptest.NewRecorder()
foo(w2, r)
b := bytes.Split(w2.Body.Bytes(), []byte("\n"))
buff := bytes.NewBuffer(nil)
for i := range b {
if bytes.Contains(b[i], []byte("<a href=")) {
if !ro && bytes.Contains(b[i], []byte("<a href=")) {
re := regexp.MustCompile(`href="[^"]*"`)
match := re.Find(b[i])
if len(match) > 0 {
@ -204,57 +337,46 @@ func toRealPath(p string) string {
}
func setContentTypeIfMedia(w http.ResponseWriter, r *http.Request) {
ext := strings.ToLower(path.Ext(r.URL.Path))
if i := strings.LastIndex(ext, "."); i != -1 {
ext = ext[i:]
}
k := "Content-Type"
v := ""
switch ext {
switch strings.ToLower(path.Ext(r.URL.Path)) {
case ".mp4":
v = "video/mp4"
w.Header().Set("Content-Type", "video/mp4")
case ".mkv":
v = "video/x-matroska"
w.Header().Set("Content-Type", "video/x-matroska")
case ".mp3":
v = "audio/mpeg3"
w.Header().Set("Content-Type", "audio/mpeg3")
case ".epub", ".mobi":
k = "Content-Disposition"
v = "attachment"
w.Header().Set("Content-Disposition", "attachment")
case ".jpg", ".jpeg":
v = "image/jpeg"
w.Header().Set("Content-Type", "image/jpeg")
case ".gif":
v = "image/gif"
w.Header().Set("Content-Type", "image/gif")
case ".png":
v = "image/png"
w.Header().Set("Content-Type", "image/png")
case ".ico":
v = "image/x-icon"
w.Header().Set("Content-Type", "image/x-icon")
case ".svg":
v = "image/svg+xml"
w.Header().Set("Content-Type", "image/svg+xml")
case ".css":
v = "text/css"
w.Header().Set("Content-Type", "text/css")
case ".js":
v = "text/javascript"
w.Header().Set("Content-Type", "text/javascript")
case ".json":
v = "application/json"
w.Header().Set("Content-Type", "application/json")
case ".html", ".htm":
v = "text/html"
w.Header().Set("Content-Type", "text/html")
case ".pdf":
w.Header().Set("Content-Disposition", fmt.Sprintf("inline; filename=%q", path.Base(r.URL.Path)))
v = "application/pdf"
w.Header().Set("Content-Type", "application/pdf")
case ".webm":
v = "video/webm"
w.Header().Set("Content-Type", "video/webm")
case ".weba":
v = "audio/webm"
w.Header().Set("Content-Type", "audio/webm")
case ".webp":
v = "image/webp"
w.Header().Set("Content-Type", "image/webp")
case ".zip":
v = "application/zip"
w.Header().Set("Content-Type", "application/zip")
case ".7z":
v = "application/x-7z-compressed"
w.Header().Set("Content-Type", "application/x-7z-compressed")
case ".tar":
v = "application/x-tar"
default:
return
w.Header().Set("Content-Type", "application/x-tar")
}
w.Header().Set(k, v)
}

View File

@ -5,6 +5,8 @@ import (
"net/http/httptest"
"net/url"
"testing"
"gogs.inhome.blapointe.com/local/gziphttp"
)
func TestSetContentType(t *testing.T) {
@ -25,7 +27,7 @@ func TestSetContentType(t *testing.T) {
t.Run(name, func(t *testing.T) {
r := &http.Request{URL: &url.URL{Path: c.path}}
w := httptest.NewRecorder()
setContentTypeIfMedia(w, r)
gziphttp.SetContentTypeIfMedia(w, r)
if ct := w.Header().Get("Content-Type"); ct != c.want {
t.Errorf("wrong content type: want %q, got %q", c.want, ct)
}

View File

@ -0,0 +1,57 @@
# Hello
Teehee xddd
## World
For I am
**MARKDOWN**
## h2
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Quisque interdum maximus eleifend. Pellentesque viverra dapibus magna ac viverra. Proin viverra a nunc in condimentum. Sed a faucibus mauris. Mauris fringilla lacus in nulla egestas fermentum. Nunc porta sed libero a facilisis. Donec nisi sem, dictum vel nisl quis, tincidunt ultrices sapien. Nam posuere, nibh eu commodo laoreet, lacus eros malesuada mi, id suscipit metus nisl vitae massa. Sed pellentesque sapien sit amet dui tempor, nec facilisis eros hendrerit. Donec feugiat justo eros, nec faucibus sapien ultrices eget. Sed tincidunt elit id viverra suscipit. Integer efficitur, turpis ac pharetra bibendum, metus mauris elementum sem, vel luctus lectus libero in elit. Vestibulum pulvinar faucibus fringilla. Proin lobortis risus ex, vel cursus metus tincidunt et.
Quisque gravida velit nec rhoncus consectetur. Nulla vitae interdum metus, in sodales arcu. Nulla vel maximus neque. Interdum et malesuada fames ac ante ipsum primis in faucibus. Morbi sed imperdiet justo. Nulla mollis quam et mi volutpat, dictum accumsan ante luctus. Duis pharetra eu turpis non semper. Ut elementum dignissim eros. Sed facilisis erat ligula, quis mollis ex dignissim sit amet. Nunc at massa volutpat risus faucibus elementum non sit amet nulla. Quisque sodales tempor ligula, in tincidunt elit pulvinar ac. Nunc tincidunt mauris at ligula fermentum, ut sodales sapien efficitur. Nam iaculis erat pellentesque est venenatis pharetra. Aenean venenatis fermentum nunc at efficitur. Nulla ac nunc bibendum justo ornare tristique. Vivamus condimentum placerat mi.
### h3
Duis eget scelerisque nisi, in laoreet erat. In hac habitasse platea dictumst. Proin faucibus et felis sit amet mattis. Vivamus lobortis porta nibh non tincidunt. In congue varius lacus sit amet volutpat. Aenean consequat lorem at congue aliquet. Aliquam finibus facilisis ligula et dictum. Cras pretium nunc cursus, consectetur ante vel, luctus lacus. Cras convallis elit lectus, quis lobortis turpis ultricies tincidunt. Etiam metus elit, finibus condimentum neque vitae, eleifend lacinia nulla. Aliquam erat volutpat. Ut placerat nisi et ligula auctor laoreet. Ut suscipit tristique mollis. Vestibulum cursus ac mi vitae mollis.
Mauris finibus turpis felis, at porttitor mauris condimentum in. Pellentesque aliquam vehicula nisl in interdum. Mauris nec urna ullamcorper, tincidunt nisl sit amet, vestibulum massa. Proin at eros massa. Etiam ut tempor ipsum. Nam in aliquet nunc. Ut varius molestie vestibulum. Fusce eget dui magna. Suspendisse convallis nisi est, in accumsan ligula consequat ac. Ut blandit mauris ultricies dui scelerisque interdum. Quisque at vestibulum elit. In hac habitasse platea dictumst. Cras nec pellentesque nunc. Etiam quis tristique sapien, et porttitor ipsum.
### h3
In ligula dolor, blandit quis neque eget, aliquam pretium nunc. Etiam posuere sapien diam, nec lobortis eros blandit nec. Nunc augue risus, accumsan vel mi id, facilisis varius arcu. Donec varius finibus imperdiet. Etiam orci lacus, interdum nec quam sed, sollicitudin consectetur turpis. Proin porttitor id purus ut commodo. Donec eget dapibus lacus. Vivamus consequat arcu lacus, quis elementum lacus commodo vitae. Donec lobortis accumsan enim, id pretium sem gravida vel. Aliquam sit amet est velit.
Duis cursus tortor vel dolor tempus tristique. Nunc elementum pulvinar semper. Fusce in auctor nulla. Praesent convallis arcu eu turpis mattis efficitur. Fusce justo nunc, ullamcorper in leo vitae, lobortis scelerisque risus. Suspendisse pellentesque nunc nulla, et dignissim lectus porta sed. Curabitur eu lacinia odio. In molestie, quam nec hendrerit efficitur, est diam condimentum ligula, a luctus sem metus quis arcu. Praesent varius, tellus ac lobortis commodo, nulla lectus rhoncus quam, elementum mollis tellus sapien sit amet tellus. Quisque tincidunt risus in lectus sollicitudin blandit. Pellentesque ultrices mollis tellus sed mollis. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Duis a velit ligula. Curabitur feugiat condimentum dui eget tempus. Praesent in ex malesuada, suscipit dui et, vehicula felis. Praesent faucibus vestibulum sapien, in facilisis est iaculis nec.
Phasellus porttitor ultrices orci, ac elementum elit hendrerit non. In iaculis imperdiet augue sed dignissim. Sed bibendum velit metus, in interdum sem mollis a. Nullam dignissim dolor at tortor volutpat, et sagittis est ultricies. Cras vel justo malesuada, pellentesque tortor eget, condimentum est. Vestibulum posuere tortor quis porttitor varius. Phasellus facilisis augue sed augue suscipit, nec imperdiet enim posuere. Suspendisse commodo ipsum eros, quis hendrerit nisl aliquet non. Morbi tincidunt enim tortor, ac rutrum lacus tristique non.
### h3
Mauris pellentesque ac urna vel molestie. Duis eget facilisis mi. Maecenas tempus elit vitae nibh vulputate venenatis. Nunc luctus ex ut metus condimentum, vitae molestie nisl maximus. Cras finibus mi suscipit, egestas arcu quis, condimentum libero. Aliquam ornare elit erat, eget facilisis ipsum faucibus in. Donec vitae diam ac ex egestas aliquet vel vitae dui. Mauris commodo sed turpis id feugiat. Mauris finibus felis eget est suscipit, quis sollicitudin augue dictum.
Maecenas viverra ipsum et sem tempor, in venenatis tellus venenatis. Mauris quis dignissim odio. Mauris pulvinar nunc at tellus molestie, id tincidunt massa pellentesque. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Curabitur ut molestie erat, non dignissim sapien. Morbi vehicula nulla vitae lectus vulputate posuere. Donec eget enim rutrum, consectetur nisi sit amet, convallis purus. Nam ultrices felis ut velit hendrerit volutpat. Mauris commodo malesuada nisl. Quisque cursus commodo nunc, eu vulputate justo gravida ac.
Nullam quis vulputate mauris. Ut elementum suscipit magna sit amet facilisis. Maecenas luctus placerat leo et eleifend. Aliquam est tortor, efficitur eget placerat nec, tincidunt vel mauris. Quisque pellentesque sit amet mauris vel imperdiet. Pellentesque mollis felis vulputate, pellentesque justo ut, suscipit magna. Donec pulvinar ligula nec volutpat feugiat. Integer vel vulputate ex. Cras in dui dui. Integer ut rhoncus erat. Praesent et nulla laoreet, hendrerit neque nec, egestas lorem. Aenean fringilla mollis diam ac luctus. Etiam porta placerat eros, vel sagittis turpis tincidunt ac.
## h2
Aliquam eget ultricies arcu. Integer lobortis semper dignissim. Fusce accumsan sapien et vehicula condimentum. Nunc pharetra lorem in ultricies volutpat. Pellentesque pellentesque velit egestas justo viverra, sed dapibus diam laoreet. Donec placerat tellus lacinia ipsum cursus, quis mollis lectus interdum. Quisque sit amet est magna. Nullam vulputate lacinia nulla ac condimentum. Pellentesque gravida malesuada ornare.
## h2
Fusce convallis imperdiet nisl, sit amet gravida ante congue in. Pellentesque molestie ante sed mauris scelerisque, suscipit laoreet sem vulputate. Nulla vulputate eget mi ut ullamcorper. Phasellus efficitur efficitur dui, at sollicitudin tellus ultricies at. Nam non dapibus elit, id vehicula elit. Nullam sollicitudin placerat neque vel dictum. Aenean erat turpis, fermentum at enim a, dictum placerat leo. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Pellentesque ac lectus quam. Aliquam consequat justo nisl, eget dapibus risus commodo rhoncus. Donec ac quam et ipsum mollis imperdiet quis et diam. Integer porta posuere odio vitae bibendum. Fusce suscipit efficitur tellus tempus placerat. Integer vitae lectus pharetra, mollis justo sed, iaculis lorem. Donec maximus venenatis posuere.
Morbi et mauris purus. Morbi quis nisi libero. Ut tincidunt accumsan finibus. Ut tincidunt lobortis velit a tincidunt. Integer id dolor metus. Proin ac urna vitae quam iaculis interdum eu ultrices urna. Duis vel velit egestas, convallis quam quis, molestie velit. In eget libero quis quam lobortis dignissim id et augue.
## h2
Morbi molestie consectetur semper. Nunc vitae odio scelerisque, molestie justo ac, hendrerit dui. Quisque in ex leo. Pellentesque efficitur porta mauris id porta. Mauris tincidunt urna ullamcorper maximus feugiat. Aliquam augue justo, facilisis a orci quis, tristique accumsan orci. Mauris mollis ac quam laoreet tempor. Morbi et urna aliquam, porta ipsum sit amet, posuere purus. Duis nec vulputate nibh. Quisque nulla lectus, posuere vitae posuere id, vulputate vitae felis. Integer interdum massa eu libero vulputate, nec tempus ipsum porta. Donec id tortor vitae nisl lobortis pretium et dictum leo. Duis posuere, odio at imperdiet iaculis, arcu magna sollicitudin nisi, in iaculis mauris neque quis lorem. Aenean ullamcorper sagittis congue. Duis varius consequat velit, in iaculis urna finibus vitae.
#### h4
Maecenas consectetur, diam eget pellentesque sollicitudin, orci mauris malesuada erat, id placerat lorem neque et tortor. Sed a metus et elit varius egestas. Nam eget metus suscipit, cursus mi vel, rutrum sapien. Mauris ipsum arcu, vehicula id commodo sed, dignissim et neque. Nulla facilisi. Vestibulum nec erat a lorem tristique facilisis. Nam ac condimentum purus. Pellentesque porttitor odio sed quam fringilla, id mattis magna euismod. Nulla vehicula lectus vel tortor porttitor fringilla. Duis dictum massa eu accumsan posuere. Sed pretium vitae nulla at euismod. Etiam sodales lacus at leo iaculis, sed gravida velit luctus. Duis nec mauris ut dolor rutrum posuere. In ut mattis lorem. Duis in massa tortor. Donec non ex hendrerit, malesuada mi eget, iaculis turpis.

1
public/bundle.css Normal file

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long