diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..7665f8e --- /dev/null +++ b/.gitignore @@ -0,0 +1,10 @@ +objs/* +!objs/ndk_* +.pc/ +.vscode/ +modules/media-framework/ +modules/nginx-srt-module/ +modules/nginx-vod-module/ +Makefile +*.orig +*.txt \ No newline at end of file diff --git a/.hgtags b/.hgtags new file mode 100644 index 0000000..0dc64a5 --- /dev/null +++ b/.hgtags @@ -0,0 +1,483 @@ +551102312e19b704cd22bd7254a9444b9ea14e96 release-0.1.0 +23fb87bddda14ce9faec90f774085634106aded4 release-0.1.1 +295d97d70c698585705345f1a8f92b02e63d6d0d release-0.1.2 +ded1284520cc939ad5ae6ddab39925375e64237d release-0.1.3 +0491b909ef7612d8411f1f59054186c1f3471b52 release-0.1.4 +a88a3e4e158fade0aaa6f3eb25597d5ced2c1075 release-0.1.5 +1f31dc6d33a3a4e65240b08066bf186df9e33b79 release-0.1.6 +5aecc125bc33d81d6214c91d73eb44230a903dde release-0.1.7 +bbd6b0b4a2b15ef8c8f1aaf7b027b6da47303524 release-0.1.8 +2ff194b74f1e60cd04670986973e3b1a6aa3bece release-0.1.9 +31ee1b50354fb829564b81a6f34e8d6ceb2d3f48 release-0.1.10 +8e8f3af115b5b903b2b8f3335de971f18891246f release-0.1.11 +c3c2848fc081e19aec5ffa97e468ad20ddb81df0 release-0.1.12 +ad1e9ebf93bb5ae4c748d471fad2de8a0afc4d2a release-0.1.13 +c5240858380136a67bec261c59b1532560b57885 release-0.1.14 +fd661d14a7fad212e326a7dad6234ea0de992fbf release-0.1.15 +621229427cba1b0af417ff2a101fc4f17a7d93c8 release-0.1.16 +4ebe09b07e3021f1a63b459903ec58f162183b26 release-0.1.17 +31ff3e943e1675a2caf745ba7a981244445d4c98 release-0.1.18 +45a460f82aec80b0f61136aa09f412436d42203a release-0.1.19 +0f836f0288eee4980f57736d50a7a60fa082d8e9 release-0.1.20 +975f62e77f0244f1b631f740be77c72c8f2da1de release-0.1.21 +fc9909c369b2b4716304ac8e38da57b8fb781211 release-0.1.22 +d7c90bb5ce83dab08715e98f9c7b81c7df4b37be release-0.1.23 +64d9afb209da0cd4a917202b7b77e51cc23e2229 release-0.1.24 +d4ea69372b946dc4ec37fc3f5ddd93ff7c3da675 release-0.1.25 +b1648294f6935e993e436fd8a68bca75c74c826d release-0.1.26 +ee66921ecd47a7fa459f70f4a9d660f91f6a1b94 release-0.1.27 +cd3117ad9aab9c58c6f7e677e551e1adbdeaba54 release-0.1.28 +9b8c906f6e63ec2c71cecebfff35819a7d32227d release-0.1.29 +c12967aadd8726daf2d85e3f3e622d89c42db176 release-0.1.30 +fbbf16224844e7d560c00043e8ade8a560415bba release-0.1.31 +417a087c9c4d9abb9b0b9b3f787aff515c43c035 release-0.1.32 +dadfa78d227027348d7f9d1e7b7093d06ba545a0 release-0.1.33 +12234c998d83bfbbaa305273b3dd1b855ca325dc release-0.1.34 +6f00349b98e5f706b82115c6e4dc84456fc0d770 release-0.1.35 +2019117e6b38cc3e89fe4f56a23b271479c627a6 release-0.1.36 +09b42134ac0c42625340f16628e29690a04f8db5 release-0.1.37 +7fa11e5c6e9612ecff5eb58274cc846ae742d1d2 release-0.1.38 +e5d7d0334fdb946133c17523c198800142ac9fe9 release-0.1.39 +c3bd8cdabb8f73e5600a91f198eb7df6fac65e92 release-0.1.40 +d6e48c08d718bf5a9e58c20a37e8ae172bff1139 release-0.1.41 +563ad09abf5042eb41e8ecaf5b4e6c9deaa42731 release-0.1.42 +c9ad0d9c7d59b2fa2a5fe669f1e88debd03e6c04 release-0.1.43 +371c1cee100d7a1b0e6cad4d188e05c98a641ee7 release-0.1.44 +b09ee85d0ac823e36861491eedfc4dfafe282997 release-0.1.45 +511a89da35ada16ae806667d699f9610b4f8499a release-0.2.0 +0148586012ab3dde69b394ec5a389d44bb11c869 release-0.2.1 +818fbd4750b99d14d2736212c939855a11b1f1ef release-0.2.2 +e16a8d574da511622b97d6237d005f40f2cddb30 release-0.2.3 +483cca23060331f2078b1c2984870d80f288ad41 release-0.2.4 +45033d85b30e3f12c407b7cfc518d76e0eda0263 release-0.2.5 +7bd37aef1e7e87858c12b124e253e98558889b50 release-0.2.6 +ecd9c160f25b7a7075dd93383d98a0fc8d8c0a41 release-0.3.0 +c1f965ef97188fd7ef81342dcf8719da18c554d2 release-0.3.1 +e48ebafc69393fc94fecfdf9997c4179fd1ce473 release-0.3.2 +9c2f3ed7a24711d3b42b124d5f831155c8beff95 release-0.3.3 +7c1369d37c7eb0017c28ebcaa0778046f5aafdcc release-0.3.4 +1af2fcb3be8a63796b6b23a488049c92a6bc12f4 release-0.3.5 +174f1e853e1e831b01000aeccfd06a9c8d4d95a2 release-0.3.6 +458b6c3fea65a894c99dd429334a77bb164c7e83 release-0.3.7 +58475592100cb792c125101b6d2d898f5adada30 release-0.3.8 +fcd6fc7ff7f9b132c35193d834e6e7d05026c716 release-0.3.9 +4d9ea73a627a914d364e83e20c58eb1283f4031d release-0.3.10 +4c5c2c55975c1152b5ca5d5d55b32d4dd7945f7a release-0.3.11 +326634fb9d47912ad94221dc2f8fa4bec424d40c release-0.3.12 +4e296b7d25bf62390ca2afb599e395426b94f785 release-0.3.13 +401de5a43ba5a8acdb9c52465193c0ea7354afe7 release-0.3.14 +284cc140593bb16ac71094acd509ab415ff4837d release-0.3.15 +d4e858a5751a7fd08e64586795ed7d336011fbc0 release-0.3.16 +8c0cdd81580eb76d774cfc5724de68e7e5cbbdc2 release-0.3.17 +425af804d968f30eeff01e33b808bc2e8c467f2c release-0.3.18 +ebc68d8ca4962fe3531b7e13444f7ac4395d9c6e release-0.3.19 +9262f520ce214d3d5fd7c842891519336ef85ca6 release-0.3.20 +869b6444d2341a587183859d4df736c7f3381169 release-0.3.21 +77f77f53214a0e3a68fef8226c15532b54f2c365 release-0.3.22 +858700ae46b453ea111b966b6d03f2c21ddcb94e release-0.3.23 +5dac8c7fb71b86aafed8ea352305e7f85759f72e release-0.3.24 +77cdfe394a94a625955e7585e09983b3af9b889b release-0.3.25 +608cf78b24ef7baaf9705e4715a361f26bb16ba9 release-0.3.26 +3f8a2132b93d66ac19bec006205a304a68524a0b release-0.3.27 +c73c5c58c619c22dd3a5a26c91bb0567a62c6930 release-0.3.28 +5ef026a2ac7481f04154f29ab49377bf99aaf96f release-0.3.29 +51b27717f140b71a2e9158807d79da17c888ce4c release-0.3.30 +7a16e281c01f1c7ab3b79c64b43ddb754ea7935e release-0.3.31 +93e85a79757c49d502e42a1cb8264a0f133b0b00 release-0.3.32 +0216fd1471f386168545f772836156761eddec08 release-0.3.33 +fbed40ce7cb4fd7203fecc22a617b9ce5b950fb3 release-0.3.34 +387450de0b4d21652f0b6242a5e26a31e3be8d8c release-0.3.35 +65bf042c0b4f39f18a235464c52f980e9fa24f6b release-0.3.36 +5d2b8078c1c2593b95ec50acfeeafbefa65be344 release-0.3.37 +f971949ffb585d400e0f15508a56232a0f897c80 release-0.3.38 +18268abd340cb351e0c01b9c44e9f8cc05492364 release-0.3.39 +e60fe4cf1d4ea3c34be8c49047c712c6d46c1727 release-0.3.40 +715d243270806d38be776fc3ed826d97514a73d6 release-0.3.41 +5e8fb59c18c19347a5607fb5af075fe1e2925b9a release-0.3.42 +947c6fd27699e0199249ad592151f844c8a900b0 release-0.3.43 +4946078f0a79e6cc952d3e410813aac9b8bda650 release-0.3.44 +95d7da23ea5315a6e9255ce036ed2c51f091f180 release-0.3.45 +1e720b0be7ecd92358da8a60944669fa493e78cd release-0.3.46 +39b7d7b33c918d8f4abc86c4075052d8c19da3c7 release-0.3.47 +7cbef16c71a1f43a07f8141f02e0135c775f0f5b release-0.3.48 +4c8cd5ae5cc100add5c08c252d991b82b1838c6b release-0.3.49 +400711951595aef7cd2ef865b84b31df52b15782 release-0.3.50 +649c9063d0fda23620eaeaf0f6393be0a672ebe7 release-0.3.51 +9079ee4735aefa98165bb2cb26dee4f58d58c1d7 release-0.3.52 +6d5c1535bb9dcd891c5963971f767421a334a728 release-0.3.53 +5fd7a5e990477189c40718c8c3e01002a2c20b81 release-0.3.54 +63a820b0bc6ca629c8e45a069b52d622ddc27a2d release-0.3.55 +562806624c4afb1687cba83bc1852f5d0fecbac3 release-0.3.56 +cec32b3753acf610ac1a6227d14032c1a89d6319 release-0.3.57 +b80f94fa2197b99db5e033fec92e0426d1fe5026 release-0.3.58 +e924670896abe2769ea0fcfd2058b405bed8e8ec release-0.3.59 +921a7ce4baf42fd1091b7e40f89c858c6b23053e release-0.3.60 +df95dcff753a6dc5e94257302aea02c18c7a7c87 release-0.3.61 +7e24168b0853ee7e46c9c7b943ef077dc64f17f5 release-0.4.0 +8183d4ba50f8500465efb27e66dd23f98775dd21 release-0.4.1 +610267a772c7bf911b499d37f66c21ce8f2ebaf7 release-0.4.2 +39dd0b045441e21512e0a6061a03d0df63414d8b release-0.4.3 +5e42c1615f4de0079bd4d8913886d588ce6a295d release-0.4.4 +40266f92b829a870808b3d4ee54c8fccdecbd2d6 release-0.4.5 +56e33c6efee7ff63cdc52bd1cf172bde195079df release-0.4.6 +119bad43bfd493400c57a05848eada2c35a46810 release-0.4.7 +0f404f82a1343cb4e4b277a44e3417385798e5e5 release-0.4.8 +d24a717314365c857b9f283d6072c2a427d5e342 release-0.4.9 +d6f0a00015fdef861fd67fb583b9690638650656 release-0.4.10 +e372368dadd7b2ecd0182b2f1b11db86fc27b2c3 release-0.4.11 +fd57967d850d2361072c72562d1ed03598473478 release-0.4.12 +979045fdcbd20cf7188545c1c589ff240251f890 release-0.4.13 +93c94cfa9f78f0a5740595dde4466ec4fba664f8 release-0.4.14 +589ee12e8d7c2ae5e4f4676bcc7a1279a76f9e8e release-0.5.0 +13416db8a807e5acb4021bc3c581203de57e2f50 release-0.5.1 +06c58edc88831fb31c492a8eddcf2c6056567f18 release-0.5.2 +e2ac5fa41bcba14adbbb722d45c083c30c07bb5c release-0.5.3 +393dbc659df15ccd411680b5c1ce87ed86d4c144 release-0.5.4 +38cc7bd8e04f2c519fd4526c12841a876be353cb release-0.5.5 +6d1fcec2ea79101c756316c015f72e75f601a5ab release-0.5.6 +aed8a9de62456c4b360358bc112ccca32ce02e8d release-0.5.7 +7642f45af67d805452df2667486201c36efaff85 release-0.5.8 +779216610662c3a459935d506f66a9b16b9c9576 release-0.5.9 +9eeb585454f3daa30cf768e95c088a092fe229b9 release-0.5.10 +bb491c8197e38ca10ae63b1f1ecb36bf6fdaf950 release-0.5.11 +613369e08810f36bbcc9734ef1059a03ccbf5e16 release-0.5.12 +bd796ef5c9c9dd34bfac20261b98685e0410122a release-0.5.13 +8a730c49f906d783b47e4b44d735efd083936c64 release-0.5.14 +cb447039152d85e9145139ff2575a6199b9af9d4 release-0.5.15 +64854c7c95d04f838585ca08492823000503fa61 release-0.5.16 +d1ffcf84ea1244f659145c36ff28de6fcdf528b2 release-0.5.17 +796a6e30ca9d29504195c10210dbc8deced0ae83 release-0.5.18 +1f81c711d2a039e1f93b9b515065a2235372d455 release-0.5.19 +8e8f6082654aedb4438c8fca408cfc316c7c5a2a release-0.5.20 +e9551132f7dd40da5719dd5bcf924c86f1436f85 release-0.5.21 +533a252896c4d1cff1586ae42129d610f7497811 release-0.5.22 +f461a49b6c747e0b67f721f2be172902afea5528 release-0.5.23 +2d5ef73671f690b65bf6d9e22e7155f68f484d5a release-0.5.24 +77bf42576050862c268e267ef3e508b145845a25 release-0.5.25 +2aefee4d4ed69eb7567680bf27a2efd212232488 release-0.6.0 +7ac0fe9bec9a2b5f8e191f6fdd6922bfd916a6cb release-0.6.1 +4882735ebc71eeec0fbfe645bdfdb31306872d82 release-0.6.2 +b94731c73d0922f472ff938b9d252ba29020f20c release-0.6.3 +13e649b813d6ccba5db33a61e08ebe09d683cd5b release-0.6.4 +80de622646b0059fd4c553eff47c391bf7503b89 release-0.6.5 +3b05edb2619d5935023b979ee7a9611b61b6c9e5 release-0.6.6 +1dcfd375100c4479611f71efb99271d0a3059215 release-0.6.7 +0228185d4c5772947b842e856ad74cf7f7fd52f3 release-0.6.8 +d1879c52326ecac45c713203670f54220879911e release-0.6.9 +5a80c6ccbe2ad24fa3d4ff6f9fe4a2b07408d19d release-0.6.10 +f88a8b0b39601b19cd740e4db614ab0b5b874686 release-0.6.11 +5557460a7247a1602ae96efd1d0ccf781344cb58 release-0.6.12 +451b02cc770a794cd41363461b446948ae1d8bc8 release-0.6.13 +537b6ef014c4a133e0ab0b7dc817508e0647e315 release-0.6.14 +5e68764f0d6e91a983170fa806e7450a9e9b33fe release-0.6.15 +158aa4e8cc46fcf9504a61469d22daf3476b17bf release-0.6.16 +d8fcca555542619228d9fab89e1665b993f8c3ee release-0.6.17 +60707ebc037086cf004736a0d4979e2a608da033 release-0.6.18 +3c2a99d3a71af846855be35e62edb9a12f363f44 release-0.6.19 +3e0a27f9358ffc1b5249e0ea2311ce7da5c8967e release-0.6.20 +143f4d65b1c875d6563ccb7f653d9157afc72194 release-0.6.21 +95e6160d2b7d0af8ffd1b95a23cadadf8f0b3f6d release-0.6.22 +69a03d5e3b6e6660079ef1ef172db7ac08d8370e release-0.6.23 +3e2a58fb48f1e1a99ebf851e0d47a7034c52ae22 release-0.6.24 +3b8607c05a8bebcfa59235c2126a70d737f0ccf5 release-0.6.25 +07ad5b2606614c4be4ee720c46cf4af126059d31 release-0.6.26 +be531addfabe5214f409d457140c1038af10d199 release-0.6.27 +58f05255d3a345d04baef5cff0ca1ae0ac7ecebb release-0.6.28 +eb2bd21dc8d03f6c94016f04ffb9adaf83a2b606 release-0.6.29 +55408deb3cd171efa9b81d23d7a1dd1ccde0b839 release-0.6.30 +d4288915bba73c4c3c9cf5d39d34e86879eb2b45 release-0.6.31 +0a189588830b8629c4dfea68feb49af36b59e4a9 release-0.7.0 +6ab27a06f3346cf9ec8737f5dbcc82dd4031e30f release-0.7.1 +a07e258cef3b0a0b6e76a6ff4ba4651c5facc85a release-0.7.2 +9992c4583513d2804fc2e7fec860fbc7ab043009 release-0.7.3 +4dc24d50230fbadfc037a414a86390db2de69dd2 release-0.7.4 +9527137b4354a648a229c7169850c7c65272c00d release-0.7.5 +c2f0f7cf306f302254beae512bda18713922375c release-0.7.6 +bbcf6d75556fdcee8bd4aba8f6c27014be9920ee release-0.7.7 +43bde71f0bbe5a33b161760d7f9f980d50386597 release-0.7.8 +769f0dd7081e9011394f264aa22aa66fd79730d8 release-0.7.9 +511edfa732da637f5f0c9476335df7dca994706d release-0.7.10 +0e7023bf6b2461309c29885935443449a41be807 release-0.7.11 +9ad1bd2b21d93902863807528e426862aedee737 release-0.7.12 +d90ea21e24ea35379aef50c5d70564158e110a15 release-0.7.13 +c07d2d20d95c83d804079bbdcecbce4a0c8282f0 release-0.7.14 +0cd7bb051f67eac2b179fb9f9cc988b9ba18ed76 release-0.7.15 +eab2e87deba73ae6abd9cc740e8d4365bed96322 release-0.7.16 +91d7a9eb8ade90e9421d7b1e3c2e47a6bc427876 release-0.7.17 +fc10f7b5cb1305fb930f8ac40b46882d0828d61e release-0.7.18 +9dba9779e37e5969a2d408c792084fd7acfec062 release-0.7.19 +61838d1bcbddc7bc4dd9f30d535573a6fddca8f9 release-0.7.20 +5f665d0fa6a5f6e748157f2ccbc445b2db8125d0 release-0.7.21 +24763afa5efe91e54f00b2ae5b87666eb6c08c3b release-0.7.22 +0562fb355a25266150cbe8c8d4e00f55e3654df3 release-0.7.23 +19c452ecd083550816873a8a31eb3ed9879085e6 release-0.7.24 +46b68faf271d6fdcaaf3ad2c69f6167ea9e9fa28 release-0.7.25 +d04bfca0c7e3ae2e4422bc1d383553139d6f0a19 release-0.7.26 +9425d9c7f8ead95b00a3929a9a5e487e0e3c8499 release-0.7.27 +fbc3e7e8b3ee756568a875f87d8a954a2f9d3bf6 release-0.7.28 +5176dfdf153fc785b18604197d58806f919829ad release-0.7.29 +87e07ccdf0a4ec53458d9d7a4ea66e1239910968 release-0.7.30 +9fddd7e1a7a27f8463867f41a461aad57df461b2 release-0.7.31 +780b2ba1ec6daf6e3773774e26b05b9ff0d5483e release-0.7.32 +83027471a25385b1c671968be761e9aa7a8591a7 release-0.7.33 +1e9a362c3dcee221ca6e34308c483ed93867aca2 release-0.7.34 +c7ee9e15717b54ead5f4a554686e74abe66c6b07 release-0.7.35 +b84548abe9b9d4f4e203f848696e52c8c82c308f release-0.7.36 +3286f0bab8e77dbc7ebb370b1dc379592ccff123 release-0.7.37 +11a4e2ed5b166b9c9f119171aa399a9e3aa4684a release-0.7.38 +f822655d4120629977794c32d3b969343b6c30db release-0.7.39 +8a350e49d2b6751296db6d8e27277ccf63ed412a release-0.7.40 +c4a56c197eeafd71fc1caef7a9d890a330e3c23d release-0.7.41 +a9575a57a5443df39611774cf3840e9088132b0e release-0.7.42 +7503d95d6eadad14c28b2db183ba09848265274b release-0.7.43 +9be652e9114435fc6f1fdec84c0458d56702db91 release-0.7.44 +797e070d480a34b31ddac0d364784773f1bbbcf9 release-0.7.45 +9b5037e7ec7db25875c40f9d1cf20a853388b124 release-0.7.46 +d1d0e6d7ff0ca3c0dd1be1ef1cfff2e3fd0b4e1c release-0.7.47 +9816fb28eda599bfd53940e6d3b6617d1ecb6323 release-0.7.48 +452b9d09df8e3f2fb04b2a33d04d2f3a6436eb34 release-0.7.49 +e4350efa7cf7a0e868c2236a1137de8a33bd8ec6 release-0.7.50 +f51f2bec766c8b6d7e1799d904f18f8ea631bd44 release-0.7.51 +18e39e566781c9c187e2eb62bebd9d669d68f08c release-0.7.52 +b073eaa1dcea296a3488b83d455fab6621a73932 release-0.7.53 +01c6fe6c2a55998434cd3b05dd10ca487ac3fb6c release-0.7.54 +3ed9377e686f2521e6ec15873084381033fb490d release-0.7.55 +a1e44954549c35023b409f728c678be8bf898148 release-0.7.56 +fbb1918a85e38a7becdb1a001dbaf5933f23a919 release-0.7.57 +87f4a49a9cc34a5b11c8784cc5ea89e97b4b2bd8 release-0.7.58 +0c22cb4862c8beb4ee1b9e4627125162a29a5304 release-0.7.59 +82d56c2425ef857cd430b8530a3f9e1127145a67 release-0.8.0 +f4acb784b53cd952559567971b97dde1e818a2b6 release-0.8.1 +b3503597c1a0f0f378afdc5e5e5b85e2c095a4be release-0.8.2 +c98da980514a02ba81c421b25bf91803ffffddf3 release-0.8.3 +db34ec0c53c4b9dec12ffdf70caf89a325ab9577 release-0.8.4 +0914802433b8678ba2cdf91280766f00f4b9b76e release-0.8.5 +ff52ee9e6422f3759f43a442b7ba615595b3a3d4 release-0.8.6 +7607237b4829fff1f60999f4663c50ed9d5182f7 release-0.8.7 +1cef1807bc12cb05ac52fb0e7a0f111d3760b569 release-0.8.8 +a40f8475511d74a468ade29c1505e8986600d7a3 release-0.8.9 +2d9faf2260df6c3e5d4aa1781493c31f27a557d0 release-0.8.10 +d0d61c32331a6505381b5218318f7b69db167ca8 release-0.8.11 +ca7a1c6c798a7eb5b294d4ac3179ec87ecf297d3 release-0.8.12 +81c8277cd8ed55febcb2dd9d9213076f6c0ccb09 release-0.8.13 +3089486a8dc5844b5b6e9f78d536b4b26f7ffa16 release-0.8.14 +d364c2c12dd9723a2dfac3f096f5e55d4cfe6838 release-0.8.15 +52163a1027c3efd6b4c461b60a2ca6266c23e193 release-0.8.16 +06564e9a2d9ec5852132c212e85eda0bf1300307 release-0.8.17 +7aaa959da85e09e29bcac3b1cadec35b0a25b64d release-0.8.18 +4bc73c644329a510da4e96b7241b80ead7772f83 release-0.8.19 +ea3d168fb99c32a5c3545717ecc61e85a375e5dd release-0.8.20 +27951ca037e63dae45ff5b6279124c224ae1255a release-0.8.21 +d56c8b5df517c2bf6e7bc2827b8bf3e08cda90e1 release-0.8.22 +3c6ac062b379b126212cbb27e98a3c8275ef381a release-0.8.23 +89b9173476de14688b1418fbf7df10f91d1719ef release-0.8.24 +aa550cb4159ae0d566006e091fb1c7a888771050 release-0.8.25 +06ce92293f6a65651b08c466f90f55bd69984b98 release-0.8.26 +ea50b0d79ef1d7d901cd0e4dcd7373447849d719 release-0.8.27 +e68b1c35cad86105ff1c5b240f53442f4c36356e release-0.8.28 +78d3582a30afe63fc0adb17c3ac8891a64e47146 release-0.8.29 +9852c5965a3292a1b6127dbb4da9fce4912d898a release-0.8.30 +4f84115914490e572bcbee5069157b7334df2744 release-0.8.31 +59dee6f7f3afeb1fad6ed5983756e48c81ad2a5c release-0.8.32 +a4456378d234c07038456cf32bfe3c651f1d5e82 release-0.8.33 +21cb50799a20575a42f9733342d37a426f79db4d release-0.8.34 +7cb3cb8d78ef7ae63561733ed91fd07933896bc8 release-0.8.35 +aed68639d4eb6afe944b7fb50499c16f7f3f503c release-0.8.36 +265b7fd2ae21c75bbffa5115b83a0123d6c4acb4 release-0.8.37 +fa5f1ca353c0c5aa5415f51d72fd7bbcc02d1ed7 release-0.8.38 +af10bf9d4c6532850aa1f70cdf7504bd109b284c release-0.8.39 +4846ec9f83cb5bc4c8519d5641b35fb9b190430c release-0.8.40 +718b4cb3faf7efe4e0648140f064bf7a92c3f7e8 release-0.8.41 +b5a3065749093282ddd19845e0b77ffc2e54333e release-0.8.42 +34df9fb22fed415cdad52def04095dc6d4b48222 release-0.8.43 +00ec8cd76fb89af27363b76c40d9f88bf4679c3b release-0.8.44 +e16dd52a0d226c23dcae9a11252564a04753bbed release-0.8.45 +f034d9173df0a433e0bbcf5974f12ea9eb9076c0 release-0.8.46 +4434dc967087315efcd0658206a67fe6c85528f3 release-0.8.47 +0b65c962e0cd6783a854877b52c903cb058eec8c release-0.8.48 +a2b7e94b9807e981866bf07e37b715847d1b7120 release-0.8.49 +e7bdb8edc1bab2bc352a9fb6ce765c46575c35bf release-0.8.50 +21dacebd12f65cb57ceb8d2688db5b07fad6e06d release-0.8.51 +67dd7533b99c8945b5b8b5b393504d4e003a1c50 release-0.8.52 +010468d890dbac33a4cae6dfb2017db70721b2fe release-0.8.53 +62b599022a2fa625b526c2ad1711dc6db7d66786 release-0.9.0 +71281dd73b17a0ead5535d531afaee098da723cb release-0.9.1 +16cff36b0e49fc9fdeee13b2e92690286bcc1b3d release-0.9.2 +b7b306325972661117694879d3e22faf4cf0df32 release-0.9.3 +fe671505a8ea86a76f0358b3ec4de84a9037ac2b release-0.9.4 +70542931bc5436d1bbd38f152245d93ac063968d release-0.9.5 +27e2f3b7a3db1819c5d0ba28327ceaba84a13c4e release-0.9.6 +657d05d63915ce2f6c4d763091059f5f85bb10e5 release-0.9.7 +e0fd9f36005923b8f98d1ba1ea583cb7625f318f release-1.0.0 +f8f89eb4e0c27e857ec517d893d4f9a454985084 release-1.0.1 +c50df367648e53d55e80b60a447c9c66caa0d326 release-1.0.2 +80d586db316512b5a9d39f00fe185f7f91523f52 release-1.0.3 +c9c2805ac9245cc48ce6efeba2b4a444f859d6aa release-1.0.4 +fa2c37b1122c2c983b6e91d1188e387d72dde4d6 release-1.0.5 +f31aea5b06654c9163be5acd6d9b7aaf0fdf6b33 release-1.1.0 +44bf95f670656fae01ccb266b3863843ea13d324 release-1.1.1 +da1289482a143dfa016769649bdff636c26f53c8 release-1.1.2 +bac8ba08a6570bac2ecd3bf2ad64b0ac3030c903 release-1.1.3 +911060bc8221d4113a693ae97952a1fa88663ca8 release-1.1.4 +e47531dfabbf8e5f8b8aff9ff353642ea4aa7abb release-1.1.5 +f9ddecfe331462f870a95e4c1c3ba1bb8f19f2d3 release-1.1.6 +378c297bb7459fb99aa9c77decac0d35391a3932 release-1.1.7 +71600ce67510af093d4bc0117a78b3b4678c6b3a release-1.1.8 +482d7d907f1ab92b78084d8b8631ed0eb7dd08f7 release-1.1.9 +c7e65deabf0db5109e8d8f6cf64cd3fb7633a3d1 release-1.1.10 +9590f0cf5aab8e6e0b0c8ae59c70187b2b97d886 release-1.1.11 +ade8fc136430cfc04a8d0885c757968b0987d56c release-1.1.12 +6a6836e65827fd3cb10a406e7bbbe36e0dad8736 release-1.1.13 +6845f4ac909233f5a08ed8a51de137713a888328 release-1.1.14 +2397e9c72f1bc5eac67006e12ad3e33e0ea9ba74 release-1.1.15 +7b7c49639a7bceecabf4963c60b26b65a77d6ce0 release-1.1.16 +f7e1113a9a1648cad122543e7080e895cf2d88f4 release-1.1.17 +2b22743c3079b41233ded0fc35af8aa89bcfab91 release-1.1.18 +0f0b425659e0b26f5bc8ea14a42dbf34de2eaba6 release-1.1.19 +f582d662cc408eb7a132c21f4b298b71d0701abb release-1.2.0 +9ee68d629722f583d43d92271f2eb84281afc630 release-1.3.0 +61b6a3438afef630774e568eefd89c53e3b93287 release-1.3.1 +7ccd50a0a455f2f2d3b241f376e1193ad956196d release-1.2.1 +0000000000000000000000000000000000000000 release-1.2.1 +50107e2d96bbfc2c59e46f889b1a5f68dd10cf19 release-1.3.2 +2c5e1e88c8cf710caf551c5c67eba00443601efe release-1.3.3 +a43447fb82aa03eabcd85352758ae14606a84d35 release-1.3.4 +90f3b4ea7992a7bf9385851a3e77173363091eea release-1.3.5 +3aeb14f88daeb973e4708310daa3dc68ac1200f7 release-1.3.6 +dafd375f1c882b15fa4a9b7aa7c801c55082395e release-1.3.7 +ab7ce0eb4cf78a656750ab1d8e55ef61f7e535ec release-1.3.8 +1b1a9337a7399ad3cdc5e3a2f9fbaaec990271d5 release-1.3.9 +2c053b2572694eb9cd4aed26a498b6cb1f51bbcc release-1.3.10 +36409ac209872ce53019f084e4e07467c5d9d25e release-1.3.11 +560dc55e90c13860a79d8f3e0d67a81c7b0257bb release-1.3.12 +dc195ffe0965b2b9072f8e213fe74ecce38f6773 release-1.3.13 +e04428778567dd4de329bbbe97ad653e22801612 release-1.3.14 +cd84e467c72967b9f5fb4d96bfc708c93edeb634 release-1.3.15 +23159600bdea695db8f9d2890aaf73424303e49c release-1.3.16 +7809529022b83157067e7d1e2fb65d57db5f4d99 release-1.4.0 +48a84bc3ff074a65a63e353b9796ff2b14239699 release-1.5.0 +99eed1a88fc33f32d66e2ec913874dfef3e12fcc release-1.5.1 +5bdca4812974011731e5719a6c398b54f14a6d61 release-1.5.2 +644a079526295aca11c52c46cb81e3754e6ad4ad release-1.5.3 +376a5e7694004048a9d073e4feb81bb54ee3ba91 release-1.5.4 +60e0409b9ec7ee194c6d8102f0656598cc4a6cfe release-1.5.5 +70c5cd3a61cb476c2afb3a61826e59c7cda0b7a7 release-1.5.6 +9ba2542d75bf62a3972278c63561fc2ef5ec573a release-1.5.7 +eaa76f24975948b0ce8be01838d949122d44ed67 release-1.5.8 +5a1759f33b7fa6270e1617c08d7e655b7b127f26 release-1.5.9 +b798fc020e3a84ef68e6c9f47865a319c826d33c release-1.5.10 +f995a10d4c7e9a817157a6ce7b753297ad32897e release-1.5.11 +97b47d95e4449cbde976657cf8cbbc118351ffe0 release-1.5.12 +fd722b890eabc600394349730a093f50dac31639 release-1.5.13 +d161d68df8be32e5cbf72b07db1a707714827803 release-1.7.0 +0351a6d89c3dbcc7a76295024ba6b70e27b9a497 release-1.7.1 +0bd223a546192fdf2e862f33938f4ec2a3b5b283 release-1.7.2 +fe7cd01828d5ca7491059f0690bb4453645eb28b release-1.7.3 +cbb146b120296852e781079d5138b04495bab6df release-1.7.4 +fe129aa02db9001d220f1db7c3c056f79482c111 release-1.7.5 +a8d111bb68847f61d682a3c8792fecb2e52efa2c release-1.7.6 +6d2fbc30f8a7f70136cf08f32d5ff3179d524873 release-1.7.7 +d5ea659b8bab2d6402a2266efa691f705e84001e release-1.7.8 +34b201c1abd1e2d4faeae4650a21574771a03c0e release-1.7.9 +860cfbcc4606ee36d898a9cd0c5ae8858db984d6 release-1.7.10 +2b3b737b5456c05cd63d3d834f4fb4d3776953d0 release-1.7.11 +3ef00a71f56420a9c3e9cec311c9a2109a015d67 release-1.7.12 +53d850fe292f157d2fb999c52788ec1dc53c91ed release-1.9.0 +884a967c369f73ab16ea859670d690fb094d3850 release-1.9.1 +3a32d6e7404a79a0973bcd8d0b83181c5bf66074 release-1.9.2 +e27a215601292872f545a733859e06d01af1017d release-1.9.3 +5cb7e2eed2031e32d2e5422caf9402758c38a6ad release-1.9.4 +942475e10cb47654205ede7ccbe7d568698e665b release-1.9.5 +b78018cfaa2f0ec20494fccb16252daa87c48a31 release-1.9.6 +54117529e40b988590ea2d38aae909b0b191663f release-1.9.7 +1bdc497c81607d854e3edf8b9a3be324c3d136b6 release-1.9.8 +ef107f3ddc237a3007e2769ec04adde0dcf627fa release-1.9.9 +be00ca08e41a69e585b6aff70a725ed6c9e1a876 release-1.9.10 +fe66cff450a95beed36a2515210eb2d7ef62c9d3 release-1.9.11 +ead3907d74f90a14d1646f1b2b56ba01d3d11702 release-1.9.12 +5936b7ed929237f1a73b467f662611cdc0309e51 release-1.9.13 +4106db71cbcb9c8274700199ac17e520902c6c0f release-1.9.14 +13070ecfda67397985f0e986eb9c42ecb46d05b5 release-1.9.15 +271ee30c6791847980cd139d31807541f5e569bf release-1.11.0 +cb783d9cc19761e14e1285d91c38f4b84d0b8756 release-1.11.1 +4d3b3a13a8cf5fc3351a7f167d1c13325e00f21c release-1.11.2 +b83a067949a3384a49fd3d943eb8d0997b31f87b release-1.11.3 +953512ca02c6f63b4fcbbc3e10d0d9835896bf99 release-1.11.4 +5253015a339aaca0a3111473d3e931b6d4752393 release-1.11.5 +5e371426b3bcba4312ce08606194b89b758927d1 release-1.11.6 +5c8f60faf33ca8926473d2da27b4c3c417bd4630 release-1.11.7 +4591da489a30f790def29bc5987f43409b503cae release-1.11.8 +20a45c768e5ed26b740679d0e22045c98727c3cc release-1.11.9 +1ad0999a7ded3d4fb01c7acf8ff57c80b643da7e release-1.11.10 +d8b321a876d6254e9e98795e3b194ef053290354 release-1.11.11 +7f394e433f0003222aa6531931ecc0b24740d5e4 release-1.11.12 +3d0e8655f897959e48cc74e87670bb5492a58871 release-1.11.13 +3671096a45bce570a2afa20b9faf42c7fb0f7e66 release-1.13.0 +539f7893ecb96bee60965528c8958d7eb2f1ce6b release-1.13.1 +5be2b25bdc65775a85f18f68a4be4f58c7384415 release-1.13.2 +8457ce87640f9bfe6221c4ac4466ced20e03bebe release-1.13.3 +bbc642c813c829963ce8197c0ca237ab7601f3d4 release-1.13.4 +0d45b4cf7c2e4e626a5a16e1fe604402ace1cea5 release-1.13.5 +f87da7d9ca02b8ced4caa6c5eb9013ccd47b0117 release-1.13.6 +47cca243d0ed39bf5dcb9859184affc958b79b6f release-1.13.7 +20ca4bcff108d3e66977f4d97508637093492287 release-1.13.8 +fb1212c7eca4c5328fe17d6cd95b010c67336aac release-1.13.9 +31c929e16910c38492581ef474e72fa67c28f124 release-1.13.10 +64179f242cb55fc206bca59de9bfdc4cf5ebcec7 release-1.13.11 +051e5fa03b92b8a564f6b12debd483d267391e82 release-1.13.12 +990b3e885636d763b97ed02d0d2cfc161a4e0c09 release-1.15.0 +4189160cb946bb38d0bc0a452b5eb4cdd8979fb5 release-1.15.1 +b234199c7ed8a156a6bb98f7ff58302c857c954f release-1.15.2 +28b3e17ca7eba1e6a0891afde0e4bc5bcc99c861 release-1.15.3 +49d49835653857daa418e68d6cbfed4958c78fca release-1.15.4 +f062e43d74fc2578bb100a9e82a953efa1eb9e4e release-1.15.5 +2351853ce6867b6166823bdf94333c0a76633c0a release-1.15.6 +051a039ce1c7e09144de4a4846669ec7116cecea release-1.15.7 +ee551e3f6dba336c0d875e266d7d55385f379b42 release-1.15.8 +d2fd76709909767fc727a5b4affcf1dc9ca488a7 release-1.15.9 +75f5c7f628411c79c7044102049f7ab4f7a246e7 release-1.15.10 +5155d0296a5ef9841f035920527ffdb771076b44 release-1.15.11 +0130ca3d58437b3c7c707cdddd813d530c68da9a release-1.15.12 +054c1c46395caff79bb4caf16f40b331f71bb6dd release-1.17.0 +7816bd7dabf6ee86c53c073b90a7143161546e06 release-1.17.1 +2fc9f853a6b7cd29dc84e0af2ed3cf78e0da6ca8 release-1.17.2 +ed4303aa1b31a9aad5440640c0840d9d0af45fed release-1.17.3 +ce2ced3856909f36f8130c99eaa4dbdbae636ddc release-1.17.4 +9af0dddbddb2c368bfedd2801bc100ffad01e19b release-1.17.5 +de68d0d94320cbf033599c6f3ca37e5335c67fd7 release-1.17.6 +e56295fe0ea76bf53b06bffa77a2d3a9a335cb8c release-1.17.7 +fdacd273711ddf20f778c1fb91529ab53979a454 release-1.17.8 +5e8d52bca714d4b85284ddb649d1ba4a3ca978a8 release-1.17.9 +c44970de01474f6f3e01b0adea85ec1d03e3a5f2 release-1.17.10 +cbe6ba650211541310618849168631ce0b788f35 release-1.19.0 +062920e2f3bf871ef7a3d8496edec1b3065faf80 release-1.19.1 +a7b46539f507e6c64efa0efda69ad60b6f4ffbce release-1.19.2 +3cbc2602325f0ac08917a4397d76f5155c34b7b1 release-1.19.3 +dc0cc425fa63a80315f6efb68697cadb6626cdf2 release-1.19.4 +8e5b068f761cd512d10c9671fbde0b568c1fd08b release-1.19.5 +f618488eb769e0ed74ef0d93cd118d2ad79ef94d release-1.19.6 +3fa6e2095a7a51acc630517e1c27a7b7ac41f7b3 release-1.19.7 +8c65d21464aaa5923775f80c32474adc7a320068 release-1.19.8 +da571b8eaf8f30f36c43b3c9b25e01e31f47149c release-1.19.9 +ffcbb9980ee2bad27b4d7b1cd680b14ff47b29aa release-1.19.10 +df34dcc9ac072ffd0945e5a1f3eb7987e8275375 release-1.21.0 +a68ac0677f8553b1f84d357bc9da114731ab5f47 release-1.21.1 +bfbc52374adcbf2f9060afd62de940f6fab3bba5 release-1.21.2 +2217a9c1d0b86026f22700b3c089545db1964f55 release-1.21.3 +39be8a682c58308d9399cddd57e37f9fdb7bdf3e release-1.21.4 +d986378168fd4d70e0121cabac274c560cca9bdf release-1.21.5 +714eb4b2c09e712fb2572a2164ce2bf67638ccac release-1.21.6 +5da2c0902e8e2aa4534008a582a60c61c135960e release-1.23.0 +a63d0a70afea96813ba6667997bc7d68b5863f0d release-1.23.1 +aa901551a7ebad1e8b0f8c11cb44e3424ba29707 release-1.23.2 +ff3afd1ce6a6b65057741df442adfaa71a0e2588 release-1.23.3 +ac779115ed6ee4f3039e9aea414a54e560450ee2 release-1.23.4 +12dcf92b0c2c68552398f19644ce3104459807d7 release-1.25.0 +f8134640e8615448205785cf00b0bc810489b495 release-1.25.1 +1d839f05409d1a50d0f15a2bf36547001f99ae40 release-1.25.2 +294a3d07234f8f65d7b0e0b0e2c5b05c12c5da0a release-1.25.3 +173a0a7dbce569adbb70257c6ec4f0f6bc585009 release-1.25.4 +8618e4d900cc71082fbe7dc72af087937d64faf5 release-1.25.5 +a58202a8c41bf0bd97eef1b946e13105a105520d release-1.26.0 +a63c124e34bcf2d1d1feb8d40ff075103b967c4c release-1.26.1 +e4c5da06073ca24e2ffc5c8f8b8d7833a926356f release-1.26.2 diff --git a/CHANGES b/CHANGES index c356ba7..9c2fb00 100644 --- a/CHANGES +++ b/CHANGES @@ -1,15 +1,310 @@ -Changes with nginx 1.22.1 19 Oct 2022 +Changes with nginx 1.26.3 05 Feb 2025 + + *) Security: insufficient check in virtual servers handling with TLSv1.3 + SNI allowed to reuse SSL sessions in a different virtual server, to + bypass client SSL certificates verification (CVE-2025-23419). + + *) Bugfix: in the ngx_http_mp4_module. + Thanks to Nils Bars. + + *) Workaround: "gzip filter failed to use preallocated memory" alerts + appeared in logs when using zlib-ng. + + *) Bugfix: nginx could not build libatomic library using the library + sources if the --with-libatomic=DIR option was used. + + *) Bugfix: nginx now ignores QUIC version negotiation packets from + clients. + + *) Bugfix: nginx could not be built on Solaris 10 and earlier with the + ngx_http_v3_module. + + *) Bugfixes in HTTP/3. + + +Changes with nginx 1.26.2 14 Aug 2024 + + *) Security: processing of a specially crafted mp4 file by the + ngx_http_mp4_module might cause a worker process crash + (CVE-2024-7347). + Thanks to Nils Bars. + + +Changes with nginx 1.26.1 29 May 2024 + + *) Security: when using HTTP/3, processing of a specially crafted QUIC + session might cause a worker process crash, worker process memory + disclosure on systems with MTU larger than 4096 bytes, or might have + potential other impact (CVE-2024-32760, CVE-2024-31079, + CVE-2024-35200, CVE-2024-34161). + Thanks to Nils Bars of CISPA. + + *) Bugfix: reduced memory consumption for long-lived requests if "gzip", + "gunzip", "ssi", "sub_filter", or "grpc_pass" directives are used. + + *) Bugfix: nginx could not be built by gcc 14 if the --with-libatomic + option was used. + Thanks to Edgar Bonet. + + *) Bugfix: in HTTP/3. + + +Changes with nginx 1.26.0 23 Apr 2024 + + *) 1.26.x stable branch. + + +Changes with nginx 1.25.5 16 Apr 2024 + + *) Feature: virtual servers in the stream module. + + *) Feature: the ngx_stream_pass_module. + + *) Feature: the "deferred", "accept_filter", and "setfib" parameters of + the "listen" directive in the stream module. + + *) Feature: cache line size detection for some architectures. + Thanks to Piotr Sikora. + + *) Feature: support for Homebrew on Apple Silicon. + Thanks to Piotr Sikora. + + *) Bugfix: Windows cross-compilation bugfixes and improvements. + Thanks to Piotr Sikora. + + *) Bugfix: unexpected connection closure while using 0-RTT in QUIC. + Thanks to Vladimir Khomutov. + + +Changes with nginx 1.25.4 14 Feb 2024 + + *) Security: when using HTTP/3 a segmentation fault might occur in a + worker process while processing a specially crafted QUIC session + (CVE-2024-24989, CVE-2024-24990). + + *) Bugfix: connections with pending AIO operations might be closed + prematurely during graceful shutdown of old worker processes. + + *) Bugfix: socket leak alerts no longer logged when fast shutdown was + requested after graceful shutdown of old worker processes. + + *) Bugfix: a socket descriptor error, a socket leak, or a segmentation + fault in a worker process (for SSL proxying) might occur if AIO was + used in a subrequest. + + *) Bugfix: a segmentation fault might occur in a worker process if SSL + proxying was used along with the "image_filter" directive and errors + with code 415 were redirected with the "error_page" directive. + + *) Bugfixes and improvements in HTTP/3. + + +Changes with nginx 1.25.3 24 Oct 2023 + + *) Change: improved detection of misbehaving clients when using HTTP/2. + + *) Feature: startup speedup when using a large number of locations. + Thanks to Yusuke Nojima. + + *) Bugfix: a segmentation fault might occur in a worker process when + using HTTP/2 without SSL; the bug had appeared in 1.25.1. + + *) Bugfix: the "Status" backend response header line with an empty + reason phrase was handled incorrectly. + + *) Bugfix: memory leak during reconfiguration when using the PCRE2 + library. + Thanks to ZhenZhong Wu. + + *) Bugfixes and improvements in HTTP/3. + + +Changes with nginx 1.25.2 15 Aug 2023 + + *) Feature: path MTU discovery when using HTTP/3. + + *) Feature: TLS_AES_128_CCM_SHA256 cipher suite support when using + HTTP/3. + + *) Change: now nginx uses appname "nginx" when loading OpenSSL + configuration. + + *) Change: now nginx does not try to load OpenSSL configuration if the + --with-openssl option was used to built OpenSSL and the OPENSSL_CONF + environment variable is not set. + + *) Bugfix: in the $body_bytes_sent variable when using HTTP/3. + + *) Bugfix: in HTTP/3. + + +Changes with nginx 1.25.1 13 Jun 2023 + + *) Feature: the "http2" directive, which enables HTTP/2 on a per-server + basis; the "http2" parameter of the "listen" directive is now + deprecated. + + *) Change: HTTP/2 server push support has been removed. + + *) Change: the deprecated "ssl" directive is not supported anymore. + + *) Bugfix: in HTTP/3 when using OpenSSL. + + +Changes with nginx 1.25.0 23 May 2023 + + *) Feature: experimental HTTP/3 support. + + +Changes with nginx 1.23.4 28 Mar 2023 + + *) Change: now TLSv1.3 protocol is enabled by default. + + *) Change: now nginx issues a warning if protocol parameters of a + listening socket are redefined. + + *) Change: now nginx closes connections with lingering if pipelining was + used by the client. + + *) Feature: byte ranges support in the ngx_http_gzip_static_module. + + *) Bugfix: port ranges in the "listen" directive did not work; the bug + had appeared in 1.23.3. + Thanks to Valentin Bartenev. + + *) Bugfix: incorrect location might be chosen to process a request if a + prefix location longer than 255 characters was used in the + configuration. + + *) Bugfix: non-ASCII characters in file names on Windows were not + supported by the ngx_http_autoindex_module, the ngx_http_dav_module, + and the "include" directive. + + *) Change: the logging level of the "data length too long", "length too + short", "bad legacy version", "no shared signature algorithms", "bad + digest length", "missing sigalgs extension", "encrypted length too + long", "bad length", "bad key update", "mixed handshake and non + handshake data", "ccs received early", "data between ccs and + finished", "packet length too long", "too many warn alerts", "record + too small", and "got a fin before a ccs" SSL errors has been lowered + from "crit" to "info". + + *) Bugfix: a socket leak might occur when using HTTP/2 and the + "error_page" directive to redirect errors with code 400. + + *) Bugfix: messages about logging to syslog errors did not contain + information that the errors happened while logging to syslog. + Thanks to Safar Safarly. + + *) Workaround: "gzip filter failed to use preallocated memory" alerts + appeared in logs when using zlib-ng. + + *) Bugfix: in the mail proxy server. + + +Changes with nginx 1.23.3 13 Dec 2022 + + *) Bugfix: an error might occur when reading PROXY protocol version 2 + header with large number of TLVs. + + *) Bugfix: a segmentation fault might occur in a worker process if SSI + was used to process subrequests created by other modules. + Thanks to Ciel Zhao. + + *) Workaround: when a hostname used in the "listen" directive resolves + to multiple addresses, nginx now ignores duplicates within these + addresses. + + *) Bugfix: nginx might hog CPU during unbuffered proxying if SSL + connections to backends were used. + + +Changes with nginx 1.23.2 19 Oct 2022 *) Security: processing of a specially crafted mp4 file by the ngx_http_mp4_module might cause a worker process crash, worker process memory disclosure, or might have potential other impact (CVE-2022-41741, CVE-2022-41742). + *) Feature: the "$proxy_protocol_tlv_..." variables. -Changes with nginx 1.22.0 24 May 2022 + *) Feature: TLS session tickets encryption keys are now automatically + rotated when using shared memory in the "ssl_session_cache" + directive. - *) 1.22.x stable branch. + *) Change: the logging level of the "bad record type" SSL errors has + been lowered from "crit" to "info". + Thanks to Murilo Andrade. + + *) Change: now when using shared memory in the "ssl_session_cache" + directive the "could not allocate new session" errors are logged at + the "warn" level instead of "alert" and not more often than once per + second. + + *) Bugfix: nginx/Windows could not be built with OpenSSL 3.0.x. + + *) Bugfix: in logging of the PROXY protocol errors. + Thanks to Sergey Brester. + + *) Workaround: shared memory from the "ssl_session_cache" directive was + spent on sessions using TLS session tickets when using TLSv1.3 with + OpenSSL. + + *) Workaround: timeout specified with the "ssl_session_timeout" + directive did not work when using TLSv1.3 with OpenSSL or BoringSSL. + + +Changes with nginx 1.23.1 19 Jul 2022 + + *) Feature: memory usage optimization in configurations with SSL + proxying. + + *) Feature: looking up of IPv4 addresses while resolving now can be + disabled with the "ipv4=off" parameter of the "resolver" directive. + + *) Change: the logging level of the "bad key share", "bad extension", + "bad cipher", and "bad ecpoint" SSL errors has been lowered from + "crit" to "info". + + *) Bugfix: while returning byte ranges nginx did not remove the + "Content-Range" header line if it was present in the original backend + response. + + *) Bugfix: a proxied response might be truncated during reconfiguration + on Linux; the bug had appeared in 1.17.5. + + +Changes with nginx 1.23.0 21 Jun 2022 + + *) Change in internal API: now header lines are represented as linked + lists. + + *) Change: now nginx combines arbitrary header lines with identical + names when sending to FastCGI, SCGI, and uwsgi backends, in the + $r->header_in() method of the ngx_http_perl_module, and during lookup + of the "$http_...", "$sent_http_...", "$sent_trailer_...", + "$upstream_http_...", and "$upstream_trailer_..." variables. + + *) Bugfix: if there were multiple "Vary" header lines in the backend + response, nginx only used the last of them when caching. + + *) Bugfix: if there were multiple "WWW-Authenticate" header lines in the + backend response and errors with code 401 were intercepted or the + "auth_request" directive was used, nginx only sent the first of the + header lines to the client. + + *) Change: the logging level of the "application data after close + notify" SSL errors has been lowered from "crit" to "info". + + *) Bugfix: connections might hang if nginx was built on Linux 2.6.17 or + newer, but was used on systems without EPOLLRDHUP support, notably + with epoll emulation layers; the bug had appeared in 1.17.5. + Thanks to Marcus Ball. + + *) Bugfix: nginx did not cache the response if the "Expires" response + header line disabled caching, but following "Cache-Control" header + line enabled caching. Changes with nginx 1.21.6 25 Jan 2022 diff --git a/CHANGES.ru b/CHANGES.ru index 9ee9e11..0d1ba20 100644 --- a/CHANGES.ru +++ b/CHANGES.ru @@ -1,5 +1,235 @@ -Изменения в nginx 1.22.1 19.10.2022 +Изменения в nginx 1.26.3 05.02.2025 + + *) Безопасность: недостаточная проверка в обработке виртуальных серверов + при использовании SNI в TLSv1.3 позволяла повторно использовать + SSL-сессию в контексте другого виртуального сервера, чтобы обойти + проверку клиентских SSL-сертификатов (CVE-2025-23419). + + *) Исправление: в модуле ngx_http_mp4_module. + Спасибо Nils Bars. + + *) Изменение: при использовании zlib-ng в логах появлялись сообщения + "gzip filter failed to use preallocated memory". + + *) Исправление: nginx не мог собрать библиотеку libatomic из исходных + текстов, если использовался параметр --with-libatomic=DIR. + + *) Исправление: теперь nginx игнорирует пакеты согласования версий QUIC + от клиентов. + + *) Исправление: nginx не собирался на Solaris 10 и более ранних с + модулем ngx_http_v3_module. + + *) Исправления в HTTP/3. + + +Изменения в nginx 1.26.2 14.08.2024 + + *) Безопасность: обработка специально созданного mp4-файла модулем + ngx_http_mp4_module могла приводить к падению рабочего процесса + (CVE-2024-7347). + Спасибо Nils Bars. + + +Изменения в nginx 1.26.1 29.05.2024 + + *) Безопасность: при использовании HTTP/3 обработка специально созданной + QUIC-сессии могла приводить к падению рабочего процесса, отправке + клиенту содержимого памяти рабочего процесса на системах с MTU больше + 4096 байт, а также потенциально могла иметь другие последствия + (CVE-2024-32760, CVE-2024-31079, CVE-2024-35200, CVE-2024-34161). + Спасибо Nils Bars из CISPA. + + *) Исправление: уменьшено потребление памяти для долгоживущих запросов, + если используются директивы gzip, gunzip, ssi, sub_filter или + grpc_pass. + + *) Исправление: nginx не собирался gcc 14, если использовался параметр + --with-libatomic. + Спасибо Edgar Bonet. + + *) Исправление: в HTTP/3. + + +Изменения в nginx 1.26.0 23.04.2024 + + *) Стабильная ветка 1.26.x. + + +Изменения в nginx 1.25.5 16.04.2024 + + *) Добавление: виртуальные сервера в модуле stream. + + *) Добавление: модуль ngx_stream_pass_module. + + *) Добавление: параметры deferred, accept_filter и setfib директивы + listen в модуле stream. + + *) Добавление: определение размера строки кеша процессора для некоторых + архитектур. + Спасибо Piotr Sikora. + + *) Добавление: поддержка Homebrew на Apple Silicon. + Спасибо Piotr Sikora. + + *) Исправление: улучшения и исправления кросс-компиляции для Windows. + Спасибо Piotr Sikora. + + *) Исправление: неожиданное закрытие соединения при использовании 0-RTT + в QUIC. + Спасибо Владимиру Хомутову. + + +Изменения в nginx 1.25.4 14.02.2024 + + *) Безопасность: при использовании HTTP/3 в рабочем процессе мог + произойти segmentation fault во время обработки специально созданной + QUIC-сессии (CVE-2024-24989, CVE-2024-24990). + + *) Исправление: соединения с незавершенными AIO-операциями могли + закрываться преждевременно во время плавного завершения старых + рабочих процессов. + + *) Исправление: теперь nginx не пишет в лог сообщения об утечке сокетов, + если во время плавного завершения старых рабочих процессов было + запрошено быстрое завершение. + + *) Исправление: при использовании AIO в подзапросе могла происходить + ошибка на сокете, утечка сокетов, либо segmentation fault в рабочем + процессе (при SSL-проксировании). + + *) Исправление: в рабочем процессе мог произойти segmentation fault, + если использовалось SSL-проксирование и директива image_filter, а + ошибки с кодом 415 перенаправлялись с помощью директивы error_page. + + *) Исправления и улучшения в HTTP/3. + + +Изменения в nginx 1.25.3 24.10.2023 + + *) Изменение: улучшено детектирование некорректного поведения клиентов + при использовании HTTP/2. + + *) Добавление: уменьшение времени запуска при использовании большого + количества location'ов. + Спасибо Yusuke Nojima. + + *) Исправление: при использовании HTTP/2 без SSL в рабочем процессе мог + произойти segmentation fault; ошибка появилась в 1.25.1. + + *) Исправление: строка "Status" в заголовке ответа бэкенда с пустой + поясняющей фразой обрабатывалась некорректно. + + *) Исправление: утечки памяти во время переконфигурации при + использовании библиотеки PCRE2. + Спасибо ZhenZhong Wu. + + *) Исправления и улучшения в HTTP/3. + + +Изменения в nginx 1.25.2 15.08.2023 + + *) Добавление: path MTU discovery при использовании HTTP/3. + + *) Добавление: поддержка шифра TLS_AES_128_CCM_SHA256 при использовании + HTTP/3. + + *) Изменение: теперь при загрузке конфигурации OpenSSL nginx использует + appname "nginx". + + *) Изменение: теперь nginx не пытается загружать конфигурацию OpenSSL, + если для сборки OpenSSL использовался параметр --with-openssl и + переменная окружения OPENSSL_CONF не установлена. + + *) Исправление: в переменной $body_bytes_sent при использовании HTTP/3. + + *) Исправление: в HTTP/3. + + +Изменения в nginx 1.25.1 13.06.2023 + + *) Добавление: директива http2, позволяющая включать HTTP/2 в отдельных + блоках server; параметр http2 директивы listen объявлен устаревшим. + + *) Изменение: поддержка HTTP/2 server push упразднена. + + *) Изменение: устаревшая директива ssl больше не поддерживается. + + *) Исправление: в HTTP/3 при использовании OpenSSL. + + +Изменения в nginx 1.25.0 23.05.2023 + + *) Добавление: экспериментальная поддержка HTTP/3. + + +Изменения в nginx 1.23.4 28.03.2023 + + *) Изменение: теперь протокол TLSv1.3 разрешён по умолчанию. + + *) Изменение: теперь nginx выдаёт предупреждение при переопределении + параметров listen-сокета, задающих используемые протоколы. + + *) Изменение: теперь, если клиент использует pipelining, nginx закрывает + соединения с ожиданием дополнительных данных (lingering close). + + *) Добавление: поддержка byte ranges для ответов модуля + ngx_http_gzip_static_module. + + *) Исправление: диапазоны портов в директиве listen не работали; ошибка + появилась в 1.23.3. + Спасибо Валентину Бартеневу. + + *) Исправление: для обработки запроса мог быть выбран неверный location, + если в конфигурации использовался префиксный location длиннее 255 + символов. + + *) Исправление: не-ASCII символы в именах файлов на Windows не + поддерживались модулями ngx_http_autoindex_module и + ngx_http_dav_module, а также директивой include. + + *) Изменение: уровень логгирования ошибок SSL "data length too long", + "length too short", "bad legacy version", "no shared signature + algorithms", "bad digest length", "missing sigalgs extension", + "encrypted length too long", "bad length", "bad key update", "mixed + handshake and non handshake data", "ccs received early", "data + between ccs and finished", "packet length too long", "too many warn + alerts", "record too small", и "got a fin before a ccs" понижен с + уровня crit до info. + + *) Исправление: при использовании HTTP/2 и директивы error_page для + перенаправления ошибок с кодом 400 могла происходить утечка сокетов. + + *) Исправление: сообщения об ошибках записи в syslog не содержали + информации о том, что ошибки происходили в процессе записи в syslog. + Спасибо Safar Safarly. + + *) Изменение: при использовании zlib-ng в логах появлялись сообщения + "gzip filter failed to use preallocated memory". + + *) Исправление: в почтовом прокси-сервере. + + +Изменения в nginx 1.23.3 13.12.2022 + + *) Исправление: при чтении заголовка протокола PROXY версии 2, + содержащего большое количество TLV, могла возникать ошибка. + + *) Исправление: при использовании SSI для обработки подзапросов, + созданных другими модулями, в рабочем процессе мог произойти + segmentation fault. + Спасибо Ciel Zhao. + + *) Изменение: теперь, если при преобразовании в адреса имени хоста, + указанного в директиве listen, возвращается несколько адресов, nginx + игнорирует дубликаты среди этих адресов. + + *) Исправление: nginx мог нагружать процессор при небуферизированном + проксировании, если использовались SSL-соединения с бэкендами. + + +Изменения в nginx 1.23.2 19.10.2022 *) Безопасность: обработка специально созданного mp4-файла модулем ngx_http_mp4_module могла приводить к падению рабочего процесса, @@ -7,10 +237,84 @@ потенциально могла иметь другие последствия (CVE-2022-41741, CVE-2022-41742). + *) Добавление: переменные "$proxy_protocol_tlv_...". -Изменения в nginx 1.22.0 24.05.2022 + *) Добавление: ключи шифрования TLS session tickets теперь автоматически + меняются при использовании разделяемой памяти в ssl_session_cache. - *) Стабильная ветка 1.22.x. + *) Изменение: уровень логгирования ошибок SSL "bad record type" понижен + с уровня crit до info. + Спасибо Murilo Andrade. + + *) Изменение: теперь при использовании разделяемой памяти в + ssl_session_cache сообщения "could not allocate new session" + логгируются на уровне warn вместо alert и не чаще одного раза в + секунду. + + *) Исправление: nginx/Windows не собирался с OpenSSL 3.0.x. + + *) Исправление: в логгировании ошибок протокола PROXY. + Спасибо Сергею Брестеру. + + *) Изменение: при использовании TLSv1.3 с OpenSSL разделяемая память из + ssl_session_cache расходовалась в том числе на сессии, использующие + TLS session tickets. + + *) Изменение: таймаут, заданный с помощью директивы ssl_session_timeout, + не работал при использовании TLSv1.3 с OpenSSL или BoringSSL. + + +Изменения в nginx 1.23.1 19.07.2022 + + *) Добавление: оптимизация использования памяти в конфигурациях с + SSL-проксированием. + + *) Добавление: теперь с помощью параметра "ipv4=off" директивы + "resolver" можно запретить поиск IPv4-адресов при преобразовании имён + в адреса. + + *) Изменение: уровень логгирования ошибок SSL "bad key share", "bad + extension", "bad cipher" и "bad ecpoint" понижен с уровня crit до + info. + + *) Исправление: при возврате диапазонов nginx не удалял строку заголовка + "Content-Range", если она присутствовала в исходном ответе бэкенда. + + *) Исправление: проксированный ответ мог быть отправлен не полностью при + переконфигурации на Linux; ошибка появилась в 1.17.5. + + +Изменения в nginx 1.23.0 21.06.2022 + + *) Изменение во внутреннем API: теперь строки заголовков представлены + связными списками. + + *) Изменение: теперь nginx объединяет произвольные строки заголовков с + одинаковыми именами при отправке на FastCGI-, SCGI- и uwsgi-бэкенды, + в методе $r->header_in() модуля ngx_http_perl_module, и при доступе + через переменные "$http_...", "$sent_http_...", "$sent_trailer_...", + "$upstream_http_..." и "$upstream_trailer_...". + + *) Исправление: если в заголовке ответа бэкенда было несколько строк + "Vary", при кэшировании nginx учитывал только последнюю из них. + + *) Исправление: если в заголовке ответа бэкенда было несколько строк + "WWW-Authenticate" и использовался перехват ошибок с кодом 401 от + бэкенда или директива auth_request, nginx пересылал клиенту только + первую из этих строк. + + *) Изменение: уровень логгирования ошибок SSL "application data after + close notify" понижен с уровня crit до info. + + *) Исправление: соединения могли зависать, если nginx был собран на + Linux 2.6.17 и новее, а использовался на системах без поддержки + EPOLLRDHUP, в частности, на системах с эмуляцией epoll; ошибка + появилась в 1.17.5. + Спасибо Marcus Ball. + + *) Исправление: nginx не кэшировал ответ, если строка заголовка ответа + "Expires" запрещала кэширование, а последующая строка заголовка + "Cache-Control" разрешала кэширование. Изменения в nginx 1.21.6 25.01.2022 diff --git a/LICENSE b/LICENSE index fdedcb7..985470e 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ /* * Copyright (C) 2002-2021 Igor Sysoev - * Copyright (C) 2011-2022 Nginx, Inc. + * Copyright (C) 2011-2024 Nginx, Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without diff --git a/auto/cc/conf b/auto/cc/conf index afbca62..ba31cb8 100644 --- a/auto/cc/conf +++ b/auto/cc/conf @@ -117,7 +117,7 @@ else . auto/cc/acc ;; - msvc*) + msvc) # MSVC++ 6.0 SP2, MSVC++ Toolkit 2003 . auto/cc/msvc diff --git a/auto/cc/msvc b/auto/cc/msvc index 68435ff..567bac7 100644 --- a/auto/cc/msvc +++ b/auto/cc/msvc @@ -11,8 +11,8 @@ # MSVC 2015 (14.0) cl 19.00 -NGX_MSVC_VER=`$NGX_WINE $CC 2>&1 | grep 'Compiler Version' 2>&1 \ - | sed -e 's/^.* Version \(.*\)/\1/'` +NGX_MSVC_VER=`$NGX_WINE $CC 2>&1 | grep 'C/C++.* [0-9][0-9]*\.[0-9]' 2>&1 \ + | sed -e 's/^.* \([0-9][0-9]*\.[0-9].*\)/\1/'` echo " + cl version: $NGX_MSVC_VER" @@ -22,6 +22,21 @@ have=NGX_COMPILER value="\"cl $NGX_MSVC_VER\"" . auto/define ngx_msvc_ver=`echo $NGX_MSVC_VER | sed -e 's/^\([0-9]*\).*/\1/'` +# detect x64 builds + +case "$NGX_MSVC_VER" in + + *x64) + NGX_MACHINE=amd64 + ;; + + *) + NGX_MACHINE=i386 + ;; + +esac + + # optimizations # maximize speed, equivalent to -Og -Oi -Ot -Oy -Ob2 -Gs -GF -Gy diff --git a/auto/install b/auto/install index c764fdd..7f73e4b 100644 --- a/auto/install +++ b/auto/install @@ -112,7 +112,7 @@ install: build $NGX_INSTALL_PERL_MODULES test ! -f '\$(DESTDIR)$NGX_SBIN_PATH' \\ || mv '\$(DESTDIR)$NGX_SBIN_PATH' \\ '\$(DESTDIR)$NGX_SBIN_PATH.old' - cp $NGX_OBJS/nginx '\$(DESTDIR)$NGX_SBIN_PATH' + cp $NGX_OBJS/nginx$ngx_binext '\$(DESTDIR)$NGX_SBIN_PATH' test -d '\$(DESTDIR)$NGX_CONF_PREFIX' \\ || mkdir -p '\$(DESTDIR)$NGX_CONF_PREFIX' diff --git a/auto/lib/geoip/conf b/auto/lib/geoip/conf index 8302aae..47165b1 100644 --- a/auto/lib/geoip/conf +++ b/auto/lib/geoip/conf @@ -64,6 +64,23 @@ if [ $ngx_found = no ]; then fi +if [ $ngx_found = no ]; then + + # Homebrew on Apple Silicon + + ngx_feature="GeoIP library in /opt/homebrew/" + ngx_feature_path="/opt/homebrew/include" + + if [ $NGX_RPATH = YES ]; then + ngx_feature_libs="-R/opt/homebrew/lib -L/opt/homebrew/lib -lGeoIP" + else + ngx_feature_libs="-L/opt/homebrew/lib -lGeoIP" + fi + + . auto/feature +fi + + if [ $ngx_found = yes ]; then CORE_INCS="$CORE_INCS $ngx_feature_path" diff --git a/auto/lib/google-perftools/conf b/auto/lib/google-perftools/conf index 7f1a911..94dadac 100644 --- a/auto/lib/google-perftools/conf +++ b/auto/lib/google-perftools/conf @@ -46,6 +46,22 @@ if [ $ngx_found = no ]; then fi +if [ $ngx_found = no ]; then + + # Homebrew on Apple Silicon + + ngx_feature="Google perftools in /opt/homebrew/" + + if [ $NGX_RPATH = YES ]; then + ngx_feature_libs="-R/opt/homebrew/lib -L/opt/homebrew/lib -lprofiler" + else + ngx_feature_libs="-L/opt/homebrew/lib -lprofiler" + fi + + . auto/feature +fi + + if [ $ngx_found = yes ]; then CORE_LIBS="$CORE_LIBS $ngx_feature_libs" diff --git a/auto/lib/libatomic/conf b/auto/lib/libatomic/conf index d1e484a..dfdc1a6 100644 --- a/auto/lib/libatomic/conf +++ b/auto/lib/libatomic/conf @@ -7,8 +7,8 @@ if [ $NGX_LIBATOMIC != YES ]; then have=NGX_HAVE_LIBATOMIC . auto/have CORE_INCS="$CORE_INCS $NGX_LIBATOMIC/src" - LINK_DEPS="$LINK_DEPS $NGX_LIBATOMIC/src/libatomic_ops.a" - CORE_LIBS="$CORE_LIBS $NGX_LIBATOMIC/src/libatomic_ops.a" + LINK_DEPS="$LINK_DEPS $NGX_LIBATOMIC/build/lib/libatomic_ops.a" + CORE_LIBS="$CORE_LIBS $NGX_LIBATOMIC/build/lib/libatomic_ops.a" else @@ -19,7 +19,7 @@ else #include " ngx_feature_path= ngx_feature_libs="-latomic_ops" - ngx_feature_test="long n = 0; + ngx_feature_test="AO_t n = 0; if (!AO_compare_and_swap(&n, 0, 1)) return 1; if (AO_fetch_and_add(&n, 1) != 1) diff --git a/auto/lib/libatomic/make b/auto/lib/libatomic/make index c90318e..530c746 100644 --- a/auto/lib/libatomic/make +++ b/auto/lib/libatomic/make @@ -3,14 +3,19 @@ # Copyright (C) Nginx, Inc. + case $NGX_LIBATOMIC in + /*) ngx_prefix="$NGX_LIBATOMIC/build" ;; + *) ngx_prefix="$PWD/$NGX_LIBATOMIC/build" ;; + esac + cat << END >> $NGX_MAKEFILE -$NGX_LIBATOMIC/src/libatomic_ops.a: $NGX_LIBATOMIC/Makefile - cd $NGX_LIBATOMIC && \$(MAKE) +$NGX_LIBATOMIC/build/lib/libatomic_ops.a: $NGX_LIBATOMIC/Makefile + cd $NGX_LIBATOMIC && \$(MAKE) && \$(MAKE) install $NGX_LIBATOMIC/Makefile: $NGX_MAKEFILE cd $NGX_LIBATOMIC \\ && if [ -f Makefile ]; then \$(MAKE) distclean; fi \\ - && ./configure + && ./configure --prefix=$ngx_prefix END diff --git a/auto/lib/libgd/conf b/auto/lib/libgd/conf index 6786397..07f5656 100644 --- a/auto/lib/libgd/conf +++ b/auto/lib/libgd/conf @@ -65,6 +65,23 @@ if [ $ngx_found = no ]; then fi +if [ $ngx_found = no ]; then + + # Homebrew on Apple Silicon + + ngx_feature="GD library in /opt/homebrew/" + ngx_feature_path="/opt/homebrew/include" + + if [ $NGX_RPATH = YES ]; then + ngx_feature_libs="-R/opt/homebrew/lib -L/opt/homebrew/lib -lgd" + else + ngx_feature_libs="-L/opt/homebrew/lib -lgd" + fi + + . auto/feature +fi + + if [ $ngx_found = yes ]; then CORE_INCS="$CORE_INCS $ngx_feature_path" diff --git a/auto/lib/openssl/conf b/auto/lib/openssl/conf index 4fb52df..fdf430d 100644 --- a/auto/lib/openssl/conf +++ b/auto/lib/openssl/conf @@ -5,12 +5,19 @@ if [ $OPENSSL != NONE ]; then + have=NGX_OPENSSL . auto/have + have=NGX_SSL . auto/have + + have=NGX_OPENSSL_NO_CONFIG . auto/have + + if [ $USE_OPENSSL_QUIC = YES ]; then + have=NGX_QUIC . auto/have + have=NGX_QUIC_OPENSSL_COMPAT . auto/have + fi + case "$CC" in cl | bcc32) - have=NGX_OPENSSL . auto/have - have=NGX_SSL . auto/have - CFLAGS="$CFLAGS -DNO_SYS_TYPES_H" CORE_INCS="$CORE_INCS $OPENSSL/openssl/include" @@ -33,9 +40,6 @@ if [ $OPENSSL != NONE ]; then ;; *) - have=NGX_OPENSSL . auto/have - have=NGX_SSL . auto/have - CORE_INCS="$CORE_INCS $OPENSSL/.openssl/include" CORE_DEPS="$CORE_DEPS $OPENSSL/.openssl/include/openssl/ssl.h" CORE_LIBS="$CORE_LIBS $OPENSSL/.openssl/lib/libssl.a" @@ -118,11 +122,58 @@ else . auto/feature fi + if [ $ngx_found = no ]; then + + # Homebrew on Apple Silicon + + ngx_feature="OpenSSL library in /opt/homebrew/" + ngx_feature_path="/opt/homebrew/include" + + if [ $NGX_RPATH = YES ]; then + ngx_feature_libs="-R/opt/homebrew/lib -L/opt/homebrew/lib -lssl -lcrypto" + else + ngx_feature_libs="-L/opt/homebrew/lib -lssl -lcrypto" + fi + + ngx_feature_libs="$ngx_feature_libs $NGX_LIBDL $NGX_LIBPTHREAD" + + . auto/feature + fi + if [ $ngx_found = yes ]; then have=NGX_SSL . auto/have CORE_INCS="$CORE_INCS $ngx_feature_path" CORE_LIBS="$CORE_LIBS $ngx_feature_libs" OPENSSL=YES + + if [ $USE_OPENSSL_QUIC = YES ]; then + + ngx_feature="OpenSSL QUIC support" + ngx_feature_name="NGX_QUIC" + ngx_feature_test="SSL_set_quic_method(NULL, NULL)" + . auto/feature + + if [ $ngx_found = no ]; then + have=NGX_QUIC_OPENSSL_COMPAT . auto/have + + ngx_feature="OpenSSL QUIC compatibility" + ngx_feature_test="SSL_CTX_add_custom_ext(NULL, 0, 0, + NULL, NULL, NULL, NULL, NULL)" + . auto/feature + fi + + if [ $ngx_found = no ]; then +cat << END + +$0: error: certain modules require OpenSSL QUIC support. +You can either do not enable the modules, or install the OpenSSL library with +QUIC support into the system, or build the OpenSSL library with QUIC support +statically from the source with nginx by using --with-openssl= option. + +END + exit 1 + fi + fi fi fi diff --git a/auto/lib/openssl/make b/auto/lib/openssl/make index 126a238..a7e9369 100644 --- a/auto/lib/openssl/make +++ b/auto/lib/openssl/make @@ -7,11 +7,24 @@ case "$CC" in cl) + case "$NGX_MACHINE" in + + amd64) + OPENSSL_TARGET=VC-WIN64A + ;; + + *) + OPENSSL_TARGET=VC-WIN32 + ;; + + esac + cat << END >> $NGX_MAKEFILE $OPENSSL/openssl/include/openssl/ssl.h: $NGX_MAKEFILE \$(MAKE) -f auto/lib/openssl/makefile.msvc \ - OPENSSL="$OPENSSL" OPENSSL_OPT="$OPENSSL_OPT" + OPENSSL="$OPENSSL" OPENSSL_OPT="$OPENSSL_OPT" \ + OPENSSL_TARGET="$OPENSSL_TARGET" END diff --git a/auto/lib/openssl/makefile.msvc b/auto/lib/openssl/makefile.msvc index 5b90dcb..ed17cde 100644 --- a/auto/lib/openssl/makefile.msvc +++ b/auto/lib/openssl/makefile.msvc @@ -6,7 +6,7 @@ all: cd $(OPENSSL) - perl Configure VC-WIN32 no-shared \ + perl Configure $(OPENSSL_TARGET) no-shared no-threads \ --prefix="%cd%/openssl" \ --openssldir="%cd%/openssl/ssl" \ $(OPENSSL_OPT) diff --git a/auto/lib/pcre/conf b/auto/lib/pcre/conf index 20c1caf..cdf1809 100644 --- a/auto/lib/pcre/conf +++ b/auto/lib/pcre/conf @@ -182,6 +182,22 @@ else . auto/feature fi + if [ $ngx_found = no ]; then + + # Homebrew on Apple Silicon + + ngx_feature="PCRE library in /opt/homebrew/" + ngx_feature_path="/opt/homebrew/include" + + if [ $NGX_RPATH = YES ]; then + ngx_feature_libs="-R/opt/homebrew/lib -L/opt/homebrew/lib -lpcre" + else + ngx_feature_libs="-L/opt/homebrew/lib -lpcre" + fi + + . auto/feature + fi + if [ $ngx_found = yes ]; then CORE_INCS="$CORE_INCS $ngx_feature_path" CORE_LIBS="$CORE_LIBS $ngx_feature_libs" diff --git a/auto/lib/pcre/make b/auto/lib/pcre/make index 839ef29..182590a 100644 --- a/auto/lib/pcre/make +++ b/auto/lib/pcre/make @@ -36,7 +36,8 @@ if [ $PCRE_LIBRARY = PCRE2 ]; then pcre2_valid_utf.c \ pcre2_xclass.c" - ngx_pcre_test="pcre2_convert.c \ + ngx_pcre_test="pcre2_chkdint.c \ + pcre2_convert.c \ pcre2_extuni.c \ pcre2_find_bracket.c \ pcre2_script_run.c \ diff --git a/auto/make b/auto/make index ef7c9f6..fad0844 100644 --- a/auto/make +++ b/auto/make @@ -2,13 +2,19 @@ # Copyright (C) Igor Sysoev # Copyright (C) Nginx, Inc. +basename_last2() { + local basename_1=`basename \`dirname $1\`` + local basename_2=$(basename "$1") + echo $(printf "$basename_1/$basename_2" | sed 's/\.\.\///') +} echo "creating $NGX_MAKEFILE" mkdir -p $NGX_OBJS/src/core $NGX_OBJS/src/event $NGX_OBJS/src/event/modules \ + $NGX_OBJS/src/event/quic \ $NGX_OBJS/src/os/unix $NGX_OBJS/src/os/win32 \ - $NGX_OBJS/src/http $NGX_OBJS/src/http/v2 $NGX_OBJS/src/http/modules \ - $NGX_OBJS/src/http/modules/perl \ + $NGX_OBJS/src/http $NGX_OBJS/src/http/v2 $NGX_OBJS/src/http/v3 \ + $NGX_OBJS/src/http/modules $NGX_OBJS/src/http/modules/perl \ $NGX_OBJS/src/mail \ $NGX_OBJS/src/stream \ $NGX_OBJS/src/misc @@ -173,7 +179,7 @@ ngx_all_srcs=`echo $ngx_all_srcs | sed -e "s/\//$ngx_regex_dirsep/g"` for ngx_src in $NGX_ADDON_SRCS do - ngx_obj="addon/`basename \`dirname $ngx_src\``" + ngx_obj="addon/`basename_last2 \`dirname $ngx_src\``" test -d $NGX_OBJS/$ngx_obj || mkdir -p $NGX_OBJS/$ngx_obj @@ -412,7 +418,7 @@ if test -n "$NGX_ADDON_SRCS"; then for ngx_src in $NGX_ADDON_SRCS do - ngx_obj="addon/`basename \`dirname $ngx_src\``" + ngx_obj="addon/`basename_last2 \`dirname $ngx_src\``" ngx_obj=`echo $ngx_obj/\`basename $ngx_src\` \ | sed -e "s/\//$ngx_regex_dirsep/g"` @@ -575,7 +581,7 @@ END ngx_obj=$ngx_src ;; *) - ngx_obj="addon/`basename \`dirname $ngx_src\``" + ngx_obj="addon/`basename_last2 \`dirname $ngx_src\``" mkdir -p $NGX_OBJS/$ngx_obj ngx_obj="$ngx_obj/`basename $ngx_src`" ;; @@ -637,7 +643,7 @@ END ngx_obj=`echo $ngx_source | sed -e "s/\//$ngx_regex_dirsep/g"` ;; *) - ngx_obj="addon/`basename \`dirname $ngx_source\``" + ngx_obj="addon/`basename_last2 \`dirname $ngx_source\``" ngx_obj=`echo $ngx_obj/\`basename $ngx_source\` \ | sed -e "s/\//$ngx_regex_dirsep/g"` ;; diff --git a/auto/modules b/auto/modules index 94867bf..1a5e421 100644 --- a/auto/modules +++ b/auto/modules @@ -102,7 +102,7 @@ if [ $HTTP = YES ]; then fi - if [ $HTTP_V2 = YES ]; then + if [ $HTTP_V2 = YES -o $HTTP_V3 = YES ]; then HTTP_SRCS="$HTTP_SRCS $HTTP_HUFF_SRCS" fi @@ -124,6 +124,7 @@ if [ $HTTP = YES ]; then # ngx_http_header_filter # ngx_http_chunked_filter # ngx_http_v2_filter + # ngx_http_v3_filter # ngx_http_range_header_filter # ngx_http_gzip_filter # ngx_http_postpone_filter @@ -156,6 +157,7 @@ if [ $HTTP = YES ]; then ngx_http_header_filter_module \ ngx_http_chunked_filter_module \ ngx_http_v2_filter_module \ + ngx_http_v3_filter_module \ ngx_http_range_header_filter_module \ ngx_http_gzip_filter_module \ ngx_http_postpone_filter_module \ @@ -217,6 +219,17 @@ if [ $HTTP = YES ]; then . auto/module fi + if [ $HTTP_V3 = YES ]; then + ngx_module_name=ngx_http_v3_filter_module + ngx_module_incs= + ngx_module_deps= + ngx_module_srcs=src/http/v3/ngx_http_v3_filter_module.c + ngx_module_libs= + ngx_module_link=$HTTP_V3 + + . auto/module + fi + if :; then ngx_module_name=ngx_http_range_header_filter_module ngx_module_incs= @@ -410,7 +423,6 @@ if [ $HTTP = YES ]; then if [ $HTTP_V2 = YES ]; then have=NGX_HTTP_V2 . auto/have - have=NGX_HTTP_HEADERS . auto/have ngx_module_name=ngx_http_v2_module ngx_module_incs=src/http/v2 @@ -426,6 +438,32 @@ if [ $HTTP = YES ]; then . auto/module fi + if [ $HTTP_V3 = YES ]; then + USE_OPENSSL_QUIC=YES + HTTP_SSL=YES + + have=NGX_HTTP_V3 . auto/have + + ngx_module_name=ngx_http_v3_module + ngx_module_incs=src/http/v3 + ngx_module_deps="src/http/v3/ngx_http_v3.h \ + src/http/v3/ngx_http_v3_encode.h \ + src/http/v3/ngx_http_v3_parse.h \ + src/http/v3/ngx_http_v3_table.h \ + src/http/v3/ngx_http_v3_uni.h" + ngx_module_srcs="src/http/v3/ngx_http_v3.c \ + src/http/v3/ngx_http_v3_encode.c \ + src/http/v3/ngx_http_v3_parse.c \ + src/http/v3/ngx_http_v3_table.c \ + src/http/v3/ngx_http_v3_uni.c \ + src/http/v3/ngx_http_v3_request.c \ + src/http/v3/ngx_http_v3_module.c" + ngx_module_libs= + ngx_module_link=$HTTP_V3 + + . auto/module + fi + if :; then ngx_module_name=ngx_http_static_module ngx_module_incs= @@ -1128,6 +1166,16 @@ if [ $STREAM != NO ]; then . auto/module fi + if [ $STREAM_PASS = YES ]; then + ngx_module_name=ngx_stream_pass_module + ngx_module_deps= + ngx_module_srcs=src/stream/ngx_stream_pass_module.c + ngx_module_libs= + ngx_module_link=$STREAM_PASS + + . auto/module + fi + if [ $STREAM_SET = YES ]; then ngx_module_name=ngx_stream_set_module ngx_module_deps= @@ -1272,6 +1320,63 @@ if [ $USE_OPENSSL = YES ]; then fi +if [ $USE_OPENSSL_QUIC = YES ]; then + ngx_module_type=CORE + ngx_module_name=ngx_quic_module + ngx_module_incs= + ngx_module_deps="src/event/quic/ngx_event_quic.h \ + src/event/quic/ngx_event_quic_transport.h \ + src/event/quic/ngx_event_quic_protection.h \ + src/event/quic/ngx_event_quic_connection.h \ + src/event/quic/ngx_event_quic_frames.h \ + src/event/quic/ngx_event_quic_connid.h \ + src/event/quic/ngx_event_quic_migration.h \ + src/event/quic/ngx_event_quic_streams.h \ + src/event/quic/ngx_event_quic_ssl.h \ + src/event/quic/ngx_event_quic_tokens.h \ + src/event/quic/ngx_event_quic_ack.h \ + src/event/quic/ngx_event_quic_output.h \ + src/event/quic/ngx_event_quic_socket.h \ + src/event/quic/ngx_event_quic_openssl_compat.h" + ngx_module_srcs="src/event/quic/ngx_event_quic.c \ + src/event/quic/ngx_event_quic_udp.c \ + src/event/quic/ngx_event_quic_transport.c \ + src/event/quic/ngx_event_quic_protection.c \ + src/event/quic/ngx_event_quic_frames.c \ + src/event/quic/ngx_event_quic_connid.c \ + src/event/quic/ngx_event_quic_migration.c \ + src/event/quic/ngx_event_quic_streams.c \ + src/event/quic/ngx_event_quic_ssl.c \ + src/event/quic/ngx_event_quic_tokens.c \ + src/event/quic/ngx_event_quic_ack.c \ + src/event/quic/ngx_event_quic_output.c \ + src/event/quic/ngx_event_quic_socket.c \ + src/event/quic/ngx_event_quic_openssl_compat.c" + + ngx_module_libs= + ngx_module_link=YES + ngx_module_order= + + . auto/module + + if [ $QUIC_BPF = YES -a $SO_COOKIE_FOUND = YES ]; then + ngx_module_type=CORE + ngx_module_name=ngx_quic_bpf_module + ngx_module_incs= + ngx_module_deps= + ngx_module_srcs="src/event/quic/ngx_event_quic_bpf.c \ + src/event/quic/ngx_event_quic_bpf_code.c" + ngx_module_libs= + ngx_module_link=YES + ngx_module_order= + + . auto/module + + have=NGX_QUIC_BPF . auto/have + fi +fi + + if [ $USE_PCRE = YES ]; then ngx_module_type=CORE ngx_module_name=ngx_regex_module diff --git a/auto/options b/auto/options index 48f3a1a..6a6e990 100644 --- a/auto/options +++ b/auto/options @@ -45,6 +45,8 @@ USE_THREADS=NO NGX_FILE_AIO=NO +QUIC_BPF=NO + HTTP=YES NGX_HTTP_LOG_PATH= @@ -59,6 +61,7 @@ HTTP_CHARSET=YES HTTP_GZIP=YES HTTP_SSL=NO HTTP_V2=NO +HTTP_V3=NO HTTP_SSI=YES HTTP_REALIP=NO HTTP_XSLT=NO @@ -124,6 +127,7 @@ STREAM_GEOIP=NO STREAM_MAP=YES STREAM_SPLIT_CLIENTS=YES STREAM_RETURN=YES +STREAM_PASS=YES STREAM_SET=YES STREAM_UPSTREAM_HASH=YES STREAM_UPSTREAM_LEAST_CONN=YES @@ -149,6 +153,7 @@ PCRE_JIT=NO PCRE2=YES USE_OPENSSL=NO +USE_OPENSSL_QUIC=NO OPENSSL=NONE USE_ZLIB=NO @@ -166,6 +171,8 @@ USE_GEOIP=NO NGX_GOOGLE_PERFTOOLS=NO NGX_CPP_TEST=NO +SO_COOKIE_FOUND=NO + NGX_LIBATOMIC=NO NGX_CPU_CACHE_LINE= @@ -211,6 +218,8 @@ do --with-file-aio) NGX_FILE_AIO=YES ;; + --without-quic_bpf_module) QUIC_BPF=NONE ;; + --with-ipv6) NGX_POST_CONF_MSG="$NGX_POST_CONF_MSG $0: warning: the \"--with-ipv6\" option is deprecated" @@ -228,6 +237,7 @@ $0: warning: the \"--with-ipv6\" option is deprecated" --with-http_ssl_module) HTTP_SSL=YES ;; --with-http_v2_module) HTTP_V2=YES ;; + --with-http_v3_module) HTTP_V3=YES ;; --with-http_realip_module) HTTP_REALIP=YES ;; --with-http_addition_module) HTTP_ADDITION=YES ;; --with-http_xslt_module) HTTP_XSLT=YES ;; @@ -328,6 +338,7 @@ use the \"--with-mail_ssl_module\" option instead" --without-stream_split_clients_module) STREAM_SPLIT_CLIENTS=NO ;; --without-stream_return_module) STREAM_RETURN=NO ;; + --without-stream_pass_module) STREAM_PASS=NO ;; --without-stream_set_module) STREAM_SET=NO ;; --without-stream_upstream_hash_module) STREAM_UPSTREAM_HASH=NO ;; @@ -443,8 +454,11 @@ cat << END --with-file-aio enable file AIO support + --without-quic_bpf_module disable ngx_quic_bpf_module + --with-http_ssl_module enable ngx_http_ssl_module --with-http_v2_module enable ngx_http_v2_module + --with-http_v3_module enable ngx_http_v3_module --with-http_realip_module enable ngx_http_realip_module --with-http_addition_module enable ngx_http_addition_module --with-http_xslt_module enable ngx_http_xslt_module @@ -544,6 +558,7 @@ cat << END --without-stream_split_clients_module disable ngx_stream_split_clients_module --without-stream_return_module disable ngx_stream_return_module + --without-stream_pass_module disable ngx_stream_pass_module --without-stream_set_module disable ngx_stream_set_module --without-stream_upstream_hash_module disable ngx_stream_upstream_hash_module diff --git a/auto/os/conf b/auto/os/conf index 7c6cb69..bb0ce4e 100644 --- a/auto/os/conf +++ b/auto/os/conf @@ -110,11 +110,26 @@ case "$NGX_MACHINE" in NGX_MACH_CACHE_LINE=64 ;; - aarch64 ) + aarch64 | arm64) have=NGX_ALIGNMENT value=16 . auto/define NGX_MACH_CACHE_LINE=64 ;; + ppc64* | powerpc64*) + have=NGX_ALIGNMENT value=16 . auto/define + NGX_MACH_CACHE_LINE=128 + ;; + + riscv64) + have=NGX_ALIGNMENT value=16 . auto/define + NGX_MACH_CACHE_LINE=64 + ;; + + s390x) + have=NGX_ALIGNMENT value=16 . auto/define + NGX_MACH_CACHE_LINE=256 + ;; + *) have=NGX_ALIGNMENT value=16 . auto/define NGX_MACH_CACHE_LINE=32 diff --git a/auto/os/linux b/auto/os/linux index 74b5870..bc0556b 100644 --- a/auto/os/linux +++ b/auto/os/linux @@ -228,8 +228,71 @@ ngx_feature_test="struct crypt_data cd; crypt_r(\"key\", \"salt\", &cd);" . auto/feature +if [ $ngx_found = yes ]; then + CRYPT_LIB="-lcrypt" +fi + ngx_include="sys/vfs.h"; . auto/include +# BPF sockhash + +ngx_feature="BPF sockhash" +ngx_feature_name="NGX_HAVE_BPF" +ngx_feature_run=no +ngx_feature_incs="#include + #include " +ngx_feature_path= +ngx_feature_libs= +ngx_feature_test="union bpf_attr attr = { 0 }; + + attr.map_flags = 0; + attr.map_type = BPF_MAP_TYPE_SOCKHASH; + + syscall(__NR_bpf, 0, &attr, 0);" +. auto/feature + +if [ $ngx_found = yes ]; then + CORE_SRCS="$CORE_SRCS src/core/ngx_bpf.c" + CORE_DEPS="$CORE_DEPS src/core/ngx_bpf.h" + + if [ $QUIC_BPF != NONE ]; then + QUIC_BPF=YES + fi +fi + + +ngx_feature="SO_COOKIE" +ngx_feature_name="NGX_HAVE_SO_COOKIE" +ngx_feature_run=no +ngx_feature_incs="#include + $NGX_INCLUDE_INTTYPES_H" +ngx_feature_path= +ngx_feature_libs= +ngx_feature_test="socklen_t optlen = sizeof(uint64_t); + uint64_t cookie; + getsockopt(0, SOL_SOCKET, SO_COOKIE, &cookie, &optlen)" +. auto/feature + +if [ $ngx_found = yes ]; then + SO_COOKIE_FOUND=YES +fi + + +# UDP segmentation offloading + +ngx_feature="UDP_SEGMENT" +ngx_feature_name="NGX_HAVE_UDP_SEGMENT" +ngx_feature_run=no +ngx_feature_incs="#include + #include " +ngx_feature_path= +ngx_feature_libs= +ngx_feature_test="socklen_t optlen = sizeof(int); + int val; + getsockopt(0, SOL_UDP, UDP_SEGMENT, &val, &optlen)" +. auto/feature + + CC_AUX_FLAGS="$cc_aux_flags -D_GNU_SOURCE -D_FILE_OFFSET_BITS=64" diff --git a/auto/os/win32 b/auto/os/win32 index b821ae6..bce764b 100644 --- a/auto/os/win32 +++ b/auto/os/win32 @@ -18,7 +18,7 @@ ngx_binext=".exe" case "$NGX_CC_NAME" in - gcc) + clang | gcc) CORE_LIBS="$CORE_LIBS -ladvapi32 -lws2_32" MAIN_LINK="$MAIN_LINK -Wl,--export-all-symbols" MAIN_LINK="$MAIN_LINK -Wl,--out-implib=$NGX_OBJS/libnginx.a" diff --git a/auto/sources b/auto/sources index 156f797..46408ee 100644 --- a/auto/sources +++ b/auto/sources @@ -83,13 +83,14 @@ CORE_SRCS="src/core/nginx.c \ EVENT_MODULES="ngx_events_module ngx_event_core_module" -EVENT_INCS="src/event src/event/modules" +EVENT_INCS="src/event src/event/modules src/event/quic" EVENT_DEPS="src/event/ngx_event.h \ src/event/ngx_event_timer.h \ src/event/ngx_event_posted.h \ src/event/ngx_event_connect.h \ - src/event/ngx_event_pipe.h" + src/event/ngx_event_pipe.h \ + src/event/ngx_event_udp.h" EVENT_SRCS="src/event/ngx_event.c \ src/event/ngx_event_timer.c \ diff --git a/auto/unix b/auto/unix index 8671019..f29e69c 100644 --- a/auto/unix +++ b/auto/unix @@ -448,6 +448,54 @@ ngx_feature_test="setsockopt(0, IPPROTO_IPV6, IPV6_RECVPKTINFO, NULL, 0)" . auto/feature +# IP packet fragmentation + +ngx_feature="IP_MTU_DISCOVER" +ngx_feature_name="NGX_HAVE_IP_MTU_DISCOVER" +ngx_feature_run=no +ngx_feature_incs="#include + #include " +ngx_feature_path= +ngx_feature_libs= +ngx_feature_test="(void) IP_PMTUDISC_DO; + setsockopt(0, IPPROTO_IP, IP_MTU_DISCOVER, NULL, 0)" +. auto/feature + + +ngx_feature="IPV6_MTU_DISCOVER" +ngx_feature_name="NGX_HAVE_IPV6_MTU_DISCOVER" +ngx_feature_run=no +ngx_feature_incs="#include + #include " +ngx_feature_path= +ngx_feature_libs= +ngx_feature_test="(void) IPV6_PMTUDISC_DO; + setsockopt(0, IPPROTO_IPV6, IPV6_MTU_DISCOVER, NULL, 0)" +. auto/feature + + +ngx_feature="IP_DONTFRAG" +ngx_feature_name="NGX_HAVE_IP_DONTFRAG" +ngx_feature_run=no +ngx_feature_incs="#include + #include " +ngx_feature_path= +ngx_feature_libs= +ngx_feature_test="setsockopt(0, IPPROTO_IP, IP_DONTFRAG, NULL, 0)" +. auto/feature + + +ngx_feature="IPV6_DONTFRAG" +ngx_feature_name="NGX_HAVE_IPV6_DONTFRAG" +ngx_feature_run=no +ngx_feature_incs="#include + #include " +ngx_feature_path= +ngx_feature_libs= +ngx_feature_test="setsockopt(0, IPPROTO_IP, IPV6_DONTFRAG, NULL, 0)" +. auto/feature + + ngx_feature="TCP_DEFER_ACCEPT" ngx_feature_name="NGX_HAVE_DEFERRED_ACCEPT" ngx_feature_run=no diff --git a/configure b/configure index 474d69e..5b88ebb 100755 --- a/configure +++ b/configure @@ -44,6 +44,7 @@ if test -z "$NGX_PLATFORM"; then else echo "building for $NGX_PLATFORM" NGX_SYSTEM=$NGX_PLATFORM + NGX_MACHINE=i386 fi . auto/cc/conf diff --git a/configure.docker.sh b/configure.docker.sh new file mode 100755 index 0000000..4131c20 --- /dev/null +++ b/configure.docker.sh @@ -0,0 +1,69 @@ +#!/bin/bash +./configure \ + --with-cc-opt="-g -O2 -fstack-protector-strong -Wformat -Werror=format-security -fPIC -D_FORTIFY_SOURCE=2 -I/tmp/build/quickjs/" \ + --with-ld-opt="-Wl,-z,relro -Wl,-z,now -fPIC -L/tmp/build/quickjs/" \ + --sbin-path=/usr/local/sbin/nginx \ + --conf-path=/video_server/nginx/nginx.conf \ + --error-log-path=/var/log/nginx/error.log \ + --pid-path=/var/run/nginx/nginx.pid \ + --lock-path=/var/lock/nginx/nginx.lock \ + --http-log-path=/var/log/nginx/access.log \ + --http-client-body-temp-path=/tmp/nginx-client-body \ + --with-compat \ + --with-debug \ + --with-pcre-jit \ + --with-http_ssl_module \ + --with-http_stub_status_module \ + --with-http_realip_module \ + --with-http_auth_request_module \ + --with-http_v2_module \ + --with-http_dav_module \ + --with-http_slice_module \ + --with-threads \ + --with-http_addition_module \ + --with-http_flv_module \ + --with-http_gunzip_module \ + --with-http_gzip_static_module \ + --with-http_mp4_module \ + --with-http_random_index_module \ + --with-http_secure_link_module \ + --with-http_sub_module \ + --with-mail_ssl_module \ + --with-stream_ssl_module \ + --with-stream_ssl_preread_module \ + --with-stream_realip_module \ + --with-http_geoip_module=dynamic \ + --with-http_image_filter_module=dynamic \ + --with-http_perl_module=dynamic \ + --with-http_xslt_module=dynamic \ + --with-mail=dynamic \ + --with-stream=dynamic \ + --with-stream_geoip_module=dynamic \ + --add-module=./modules_deb/libnginx-mod-http-ndk-0.3.4 \ + --add-dynamic-module=./modules_deb/libnginx-mod-http-brotli-1.0.0~rc \ + --add-dynamic-module=./modules_deb/libnginx-mod-http-cache-purge-2.5.3 \ + --add-dynamic-module=./modules_deb/libnginx-mod-http-echo-0.63 \ + --add-dynamic-module=./modules_deb/libnginx-mod-http-geoip2-3.4 \ + --add-dynamic-module=./modules_deb/libnginx-mod-http-headers-more-filter-0.38 \ + --add-dynamic-module=./modules_deb/libnginx-mod-http-memc-0.20 \ + --add-dynamic-module=./modules_deb/libnginx-mod-http-set-misc-0.33 \ + --add-dynamic-module=./modules_deb/libnginx-mod-http-srcache-filter-0.33 \ + --add-dynamic-module=./modules_deb/libnginx-mod-http-subs-filter-0.6.4 \ + --add-dynamic-module=./modules_deb/libnginx-mod-http-upstream-fair-0.0~git20120408.a18b409 \ + --add-dynamic-module=./modules_deb/libnginx-mod-nchan-1.3.7+dfsg \ + --add-dynamic-module=./modules/njs/nginx \ + --add-dynamic-module=./modules/nginx-vod-module \ + --add-module=./modules/media-framework/nginx-common \ + --add-dynamic-module=./modules/nginx-stream-preread-str-module \ + --add-dynamic-module=./modules/media-framework/nginx-kmp-in-module \ + --add-dynamic-module=./modules/media-framework/nginx-kmp-out-module \ + --add-dynamic-module=./modules/media-framework/nginx-rtmp-module \ + --add-dynamic-module=./modules/media-framework/nginx-rtmp-kmp-module \ + --add-dynamic-module=./modules/media-framework/nginx-mpegts-module \ + --add-dynamic-module=./modules/media-framework/nginx-mpegts-kmp-module \ + --add-dynamic-module=./modules/media-framework/nginx-kmp-cc-module \ + --add-dynamic-module=./modules/media-framework/nginx-kmp-rtmp-module \ + --add-dynamic-module=./modules/media-framework/nginx-live-module \ + --add-dynamic-module=./modules/nginx-srt-module \ + --add-dynamic-module=./modules/media-framework/nginx-pckg-module \ + --add-dynamic-module=./modules/nginx-secure-token-module \ No newline at end of file diff --git a/configure.sh b/configure.sh new file mode 100755 index 0000000..3d780fe --- /dev/null +++ b/configure.sh @@ -0,0 +1,66 @@ +#!/bin/bash +./configure \ + --with-cc-opt="-g -O2 -fstack-protector-strong -Wformat -Werror=format-security -fPIC -D_FORTIFY_SOURCE=2 -I/usr/local/include/quickjs/" \ + --with-ld-opt="-Wl,-z,relro -Wl,-z,now -fPIC -L/usr/local/lib/quickjs/" \ + --prefix=/usr/local/temp/nginx/ \ + --error-log-path=stderr \ + --lock-path=/var/lock/nginx.lock \ + --pid-path=/run/nginx.pid \ + --with-compat \ + --with-debug \ + --with-pcre-jit \ + --with-http_ssl_module \ + --with-http_stub_status_module \ + --with-http_realip_module \ + --with-http_auth_request_module \ + --with-http_v2_module \ + --with-http_dav_module \ + --with-http_slice_module \ + --with-threads \ + --with-http_addition_module \ + --with-http_flv_module \ + --with-http_gunzip_module \ + --with-http_gzip_static_module \ + --with-http_mp4_module \ + --with-http_random_index_module \ + --with-http_secure_link_module \ + --with-http_sub_module \ + --with-mail_ssl_module \ + --with-stream_ssl_module \ + --with-stream_ssl_preread_module \ + --with-stream_realip_module \ + --with-http_geoip_module=dynamic \ + --with-http_image_filter_module=dynamic \ + --with-http_perl_module=dynamic \ + --with-http_xslt_module=dynamic \ + --with-mail=dynamic \ + --with-stream=dynamic \ + --with-stream_geoip_module=dynamic \ + --add-module=./modules_deb/libnginx-mod-http-ndk-0.3.4 \ + --add-dynamic-module=./modules_deb/libnginx-mod-http-brotli-1.0.0~rc \ + --add-dynamic-module=./modules_deb/libnginx-mod-http-cache-purge-2.5.3 \ + --add-dynamic-module=./modules_deb/libnginx-mod-http-echo-0.63 \ + --add-dynamic-module=./modules_deb/libnginx-mod-http-geoip2-3.4 \ + --add-dynamic-module=./modules_deb/libnginx-mod-http-headers-more-filter-0.38 \ + --add-dynamic-module=./modules_deb/libnginx-mod-http-memc-0.20 \ + --add-dynamic-module=./modules_deb/libnginx-mod-http-set-misc-0.33 \ + --add-dynamic-module=./modules_deb/libnginx-mod-http-srcache-filter-0.33 \ + --add-dynamic-module=./modules_deb/libnginx-mod-http-subs-filter-0.6.4 \ + --add-dynamic-module=./modules_deb/libnginx-mod-http-upstream-fair-0.0~git20120408.a18b409 \ + --add-dynamic-module=./modules_deb/libnginx-mod-nchan-1.3.7+dfsg \ + --add-dynamic-module=./modules/njs/nginx \ + --add-dynamic-module=./modules/nginx-vod-module \ + --add-module=./modules/media-framework/nginx-common \ + --add-dynamic-module=./modules/nginx-stream-preread-str-module \ + --add-dynamic-module=./modules/media-framework/nginx-kmp-in-module \ + --add-dynamic-module=./modules/media-framework/nginx-kmp-out-module \ + --add-dynamic-module=./modules/media-framework/nginx-rtmp-module \ + --add-dynamic-module=./modules/media-framework/nginx-rtmp-kmp-module \ + --add-dynamic-module=./modules/media-framework/nginx-mpegts-module \ + --add-dynamic-module=./modules/media-framework/nginx-mpegts-kmp-module \ + --add-dynamic-module=./modules/media-framework/nginx-kmp-cc-module \ + --add-dynamic-module=./modules/media-framework/nginx-kmp-rtmp-module \ + --add-dynamic-module=./modules/media-framework/nginx-live-module \ + --add-dynamic-module=./modules/nginx-srt-module \ + --add-dynamic-module=./modules/media-framework/nginx-pckg-module \ + --add-dynamic-module=./modules/nginx-secure-token-module \ No newline at end of file diff --git a/contrib/vim/syntax/nginx.vim b/contrib/vim/syntax/nginx.vim index 6828cd3..29eef7a 100644 --- a/contrib/vim/syntax/nginx.vim +++ b/contrib/vim/syntax/nginx.vim @@ -65,12 +65,12 @@ syn match ngxListenComment '#.*$' \ contained \ nextgroup=@ngxListenParams skipwhite skipempty syn keyword ngxListenOptions contained - \ default_server ssl http2 proxy_protocol + \ default_server ssl quic proxy_protocol \ setfib fastopen backlog rcvbuf sndbuf accept_filter deferred bind \ ipv6only reuseport so_keepalive \ nextgroup=@ngxListenParams skipwhite skipempty syn keyword ngxListenOptionsDeprecated contained - \ spdy + \ http2 \ nextgroup=@ngxListenParams skipwhite skipempty syn cluster ngxListenParams \ contains=ngxListenParam,ngxListenString,ngxListenComment @@ -90,7 +90,6 @@ syn keyword ngxDirectiveBlock contained if syn keyword ngxDirectiveBlock contained geo syn keyword ngxDirectiveBlock contained map syn keyword ngxDirectiveBlock contained split_clients -syn keyword ngxDirectiveBlock contained match syn keyword ngxDirectiveImportant contained include syn keyword ngxDirectiveImportant contained root @@ -111,19 +110,13 @@ syn keyword ngxDirectiveControl contained set syn keyword ngxDirectiveError contained error_page syn keyword ngxDirectiveError contained post_action -syn keyword ngxDirectiveDeprecated contained limit_zone syn keyword ngxDirectiveDeprecated contained proxy_downstream_buffer syn keyword ngxDirectiveDeprecated contained proxy_upstream_buffer -syn keyword ngxDirectiveDeprecated contained spdy_chunk_size -syn keyword ngxDirectiveDeprecated contained spdy_headers_comp -syn keyword ngxDirectiveDeprecated contained spdy_keepalive_timeout -syn keyword ngxDirectiveDeprecated contained spdy_max_concurrent_streams -syn keyword ngxDirectiveDeprecated contained spdy_pool_size -syn keyword ngxDirectiveDeprecated contained spdy_recv_buffer_size -syn keyword ngxDirectiveDeprecated contained spdy_recv_timeout -syn keyword ngxDirectiveDeprecated contained spdy_streams_index_size -syn keyword ngxDirectiveDeprecated contained ssl -syn keyword ngxDirectiveDeprecated contained upstream_conf +syn keyword ngxDirectiveDeprecated contained http2_idle_timeout +syn keyword ngxDirectiveDeprecated contained http2_max_field_size +syn keyword ngxDirectiveDeprecated contained http2_max_header_size +syn keyword ngxDirectiveDeprecated contained http2_max_requests +syn keyword ngxDirectiveDeprecated contained http2_recv_timeout syn keyword ngxDirective contained absolute_redirect syn keyword ngxDirective contained accept_mutex @@ -141,7 +134,6 @@ syn keyword ngxDirective contained alias syn keyword ngxDirective contained allow syn keyword ngxDirective contained ancient_browser syn keyword ngxDirective contained ancient_browser_value -syn keyword ngxDirective contained api syn keyword ngxDirective contained auth_basic syn keyword ngxDirective contained auth_basic_user_file syn keyword ngxDirective contained auth_delay @@ -149,14 +141,6 @@ syn keyword ngxDirective contained auth_http syn keyword ngxDirective contained auth_http_header syn keyword ngxDirective contained auth_http_pass_client_cert syn keyword ngxDirective contained auth_http_timeout -syn keyword ngxDirective contained auth_jwt -syn keyword ngxDirective contained auth_jwt_claim_set -syn keyword ngxDirective contained auth_jwt_header_set -syn keyword ngxDirective contained auth_jwt_key_file -syn keyword ngxDirective contained auth_jwt_key_request -syn keyword ngxDirective contained auth_jwt_leeway -syn keyword ngxDirective contained auth_jwt_require -syn keyword ngxDirective contained auth_jwt_type syn keyword ngxDirective contained auth_request syn keyword ngxDirective contained auth_request_set syn keyword ngxDirective contained autoindex @@ -197,8 +181,6 @@ syn keyword ngxDirective contained error_log syn keyword ngxDirective contained etag syn keyword ngxDirective contained eventport_events syn keyword ngxDirective contained expires -syn keyword ngxDirective contained f4f -syn keyword ngxDirective contained f4f_buffer_size syn keyword ngxDirective contained fastcgi_bind syn keyword ngxDirective contained fastcgi_buffer_size syn keyword ngxDirective contained fastcgi_buffering @@ -215,7 +197,6 @@ syn keyword ngxDirective contained fastcgi_cache_max_range_offset syn keyword ngxDirective contained fastcgi_cache_methods syn keyword ngxDirective contained fastcgi_cache_min_uses syn keyword ngxDirective contained fastcgi_cache_path -syn keyword ngxDirective contained fastcgi_cache_purge syn keyword ngxDirective contained fastcgi_cache_revalidate syn keyword ngxDirective contained fastcgi_cache_use_stale syn keyword ngxDirective contained fastcgi_cache_valid @@ -299,28 +280,20 @@ syn keyword ngxDirective contained gzip_types syn keyword ngxDirective contained gzip_vary syn keyword ngxDirective contained gzip_window syn keyword ngxDirective contained hash -syn keyword ngxDirective contained health_check -syn keyword ngxDirective contained health_check_timeout -syn keyword ngxDirective contained hls -syn keyword ngxDirective contained hls_buffers -syn keyword ngxDirective contained hls_forward_args -syn keyword ngxDirective contained hls_fragment -syn keyword ngxDirective contained hls_mp4_buffer_size -syn keyword ngxDirective contained hls_mp4_max_buffer_size +syn keyword ngxDirective contained http2 syn keyword ngxDirective contained http2_body_preread_size syn keyword ngxDirective contained http2_chunk_size -syn keyword ngxDirective contained http2_idle_timeout syn keyword ngxDirective contained http2_max_concurrent_pushes syn keyword ngxDirective contained http2_max_concurrent_streams -syn keyword ngxDirective contained http2_max_field_size -syn keyword ngxDirective contained http2_max_header_size -syn keyword ngxDirective contained http2_max_requests syn keyword ngxDirective contained http2_pool_size syn keyword ngxDirective contained http2_push syn keyword ngxDirective contained http2_push_preload syn keyword ngxDirective contained http2_recv_buffer_size -syn keyword ngxDirective contained http2_recv_timeout syn keyword ngxDirective contained http2_streams_index_size +syn keyword ngxDirective contained http3 +syn keyword ngxDirective contained http3_hq +syn keyword ngxDirective contained http3_max_concurrent_streams +syn keyword ngxDirective contained http3_stream_buffer_size syn keyword ngxDirective contained if_modified_since syn keyword ngxDirective contained ignore_invalid_headers syn keyword ngxDirective contained image_filter @@ -339,30 +312,32 @@ syn keyword ngxDirective contained ip_hash syn keyword ngxDirective contained js_access syn keyword ngxDirective contained js_body_filter syn keyword ngxDirective contained js_content +syn keyword ngxDirective contained js_fetch_buffer_size syn keyword ngxDirective contained js_fetch_ciphers +syn keyword ngxDirective contained js_fetch_max_response_buffer_size syn keyword ngxDirective contained js_fetch_protocols +syn keyword ngxDirective contained js_fetch_timeout syn keyword ngxDirective contained js_fetch_trusted_certificate +syn keyword ngxDirective contained js_fetch_verify syn keyword ngxDirective contained js_fetch_verify_depth syn keyword ngxDirective contained js_filter syn keyword ngxDirective contained js_header_filter syn keyword ngxDirective contained js_import -syn keyword ngxDirective contained js_include syn keyword ngxDirective contained js_path +syn keyword ngxDirective contained js_preload_object syn keyword ngxDirective contained js_preread syn keyword ngxDirective contained js_set +syn keyword ngxDirective contained js_shared_dict_zone syn keyword ngxDirective contained js_var syn keyword ngxDirective contained keepalive syn keyword ngxDirective contained keepalive_disable syn keyword ngxDirective contained keepalive_requests syn keyword ngxDirective contained keepalive_time syn keyword ngxDirective contained keepalive_timeout -syn keyword ngxDirective contained keyval -syn keyword ngxDirective contained keyval_zone syn keyword ngxDirective contained kqueue_changes syn keyword ngxDirective contained kqueue_events syn keyword ngxDirective contained large_client_header_buffers syn keyword ngxDirective contained least_conn -syn keyword ngxDirective contained least_time syn keyword ngxDirective contained limit_conn syn keyword ngxDirective contained limit_conn_dry_run syn keyword ngxDirective contained limit_conn_log_level @@ -391,7 +366,6 @@ syn keyword ngxDirective contained max_ranges syn keyword ngxDirective contained memcached_bind syn keyword ngxDirective contained memcached_buffer_size syn keyword ngxDirective contained memcached_connect_timeout -syn keyword ngxDirective contained memcached_force_ranges syn keyword ngxDirective contained memcached_gzip_flag syn keyword ngxDirective contained memcached_next_upstream syn keyword ngxDirective contained memcached_next_upstream_timeout @@ -407,14 +381,11 @@ syn keyword ngxDirective contained modern_browser syn keyword ngxDirective contained modern_browser_value syn keyword ngxDirective contained mp4 syn keyword ngxDirective contained mp4_buffer_size -syn keyword ngxDirective contained mp4_limit_rate -syn keyword ngxDirective contained mp4_limit_rate_after syn keyword ngxDirective contained mp4_max_buffer_size syn keyword ngxDirective contained mp4_start_key_frame syn keyword ngxDirective contained msie_padding syn keyword ngxDirective contained msie_refresh syn keyword ngxDirective contained multi_accept -syn keyword ngxDirective contained ntlm syn keyword ngxDirective contained open_file_cache syn keyword ngxDirective contained open_file_cache_errors syn keyword ngxDirective contained open_file_cache_events @@ -457,7 +428,6 @@ syn keyword ngxDirective contained proxy_cache_max_range_offset syn keyword ngxDirective contained proxy_cache_methods syn keyword ngxDirective contained proxy_cache_min_uses syn keyword ngxDirective contained proxy_cache_path -syn keyword ngxDirective contained proxy_cache_purge syn keyword ngxDirective contained proxy_cache_revalidate syn keyword ngxDirective contained proxy_cache_use_stale syn keyword ngxDirective contained proxy_cache_valid @@ -495,7 +465,6 @@ syn keyword ngxDirective contained proxy_requests syn keyword ngxDirective contained proxy_responses syn keyword ngxDirective contained proxy_send_lowat syn keyword ngxDirective contained proxy_send_timeout -syn keyword ngxDirective contained proxy_session_drop syn keyword ngxDirective contained proxy_set_body syn keyword ngxDirective contained proxy_set_header syn keyword ngxDirective contained proxy_smtp_auth @@ -520,7 +489,11 @@ syn keyword ngxDirective contained proxy_temp_file_write_size syn keyword ngxDirective contained proxy_temp_path syn keyword ngxDirective contained proxy_timeout syn keyword ngxDirective contained proxy_upload_rate -syn keyword ngxDirective contained queue +syn keyword ngxDirective contained quic_active_connection_id_limit +syn keyword ngxDirective contained quic_bpf +syn keyword ngxDirective contained quic_gso +syn keyword ngxDirective contained quic_host_key +syn keyword ngxDirective contained quic_retry syn keyword ngxDirective contained random syn keyword ngxDirective contained random_index syn keyword ngxDirective contained read_ahead @@ -551,7 +524,6 @@ syn keyword ngxDirective contained scgi_cache_max_range_offset syn keyword ngxDirective contained scgi_cache_methods syn keyword ngxDirective contained scgi_cache_min_uses syn keyword ngxDirective contained scgi_cache_path -syn keyword ngxDirective contained scgi_cache_purge syn keyword ngxDirective contained scgi_cache_revalidate syn keyword ngxDirective contained scgi_cache_use_stale syn keyword ngxDirective contained scgi_cache_valid @@ -590,9 +562,6 @@ syn keyword ngxDirective contained server_name_in_redirect syn keyword ngxDirective contained server_names_hash_bucket_size syn keyword ngxDirective contained server_names_hash_max_size syn keyword ngxDirective contained server_tokens -syn keyword ngxDirective contained session_log -syn keyword ngxDirective contained session_log_format -syn keyword ngxDirective contained session_log_zone syn keyword ngxDirective contained set_real_ip_from syn keyword ngxDirective contained slice syn keyword ngxDirective contained smtp_auth @@ -640,12 +609,6 @@ syn keyword ngxDirective contained ssl_trusted_certificate syn keyword ngxDirective contained ssl_verify_client syn keyword ngxDirective contained ssl_verify_depth syn keyword ngxDirective contained starttls -syn keyword ngxDirective contained state -syn keyword ngxDirective contained status -syn keyword ngxDirective contained status_format -syn keyword ngxDirective contained status_zone -syn keyword ngxDirective contained sticky -syn keyword ngxDirective contained sticky_cookie_insert syn keyword ngxDirective contained stub_status syn keyword ngxDirective contained sub_filter syn keyword ngxDirective contained sub_filter_last_modified @@ -688,7 +651,6 @@ syn keyword ngxDirective contained uwsgi_cache_max_range_offset syn keyword ngxDirective contained uwsgi_cache_methods syn keyword ngxDirective contained uwsgi_cache_min_uses syn keyword ngxDirective contained uwsgi_cache_path -syn keyword ngxDirective contained uwsgi_cache_purge syn keyword ngxDirective contained uwsgi_cache_revalidate syn keyword ngxDirective contained uwsgi_cache_use_stale syn keyword ngxDirective contained uwsgi_cache_valid @@ -752,6 +714,62 @@ syn keyword ngxDirective contained xslt_string_param syn keyword ngxDirective contained xslt_stylesheet syn keyword ngxDirective contained xslt_types syn keyword ngxDirective contained zone + +" nginx-plus commercial extensions directives + +syn keyword ngxDirectiveBlock contained match +syn keyword ngxDirectiveBlock contained otel_exporter + +syn keyword ngxDirective contained api +syn keyword ngxDirective contained auth_jwt +syn keyword ngxDirective contained auth_jwt_claim_set +syn keyword ngxDirective contained auth_jwt_header_set +syn keyword ngxDirective contained auth_jwt_key_cache +syn keyword ngxDirective contained auth_jwt_key_file +syn keyword ngxDirective contained auth_jwt_key_request +syn keyword ngxDirective contained auth_jwt_leeway +syn keyword ngxDirective contained auth_jwt_require +syn keyword ngxDirective contained auth_jwt_type +syn keyword ngxDirective contained f4f +syn keyword ngxDirective contained f4f_buffer_size +syn keyword ngxDirective contained fastcgi_cache_purge +syn keyword ngxDirective contained health_check +syn keyword ngxDirective contained health_check_timeout +syn keyword ngxDirective contained hls +syn keyword ngxDirective contained hls_buffers +syn keyword ngxDirective contained hls_forward_args +syn keyword ngxDirective contained hls_fragment +syn keyword ngxDirective contained hls_mp4_buffer_size +syn keyword ngxDirective contained hls_mp4_max_buffer_size +syn keyword ngxDirective contained internal_redirect +syn keyword ngxDirective contained keyval +syn keyword ngxDirective contained keyval_zone +syn keyword ngxDirective contained least_time +syn keyword ngxDirective contained mp4_limit_rate +syn keyword ngxDirective contained mp4_limit_rate_after +syn keyword ngxDirective contained mqtt +syn keyword ngxDirective contained mqtt_preread +syn keyword ngxDirective contained mqtt_rewrite_buffer_size +syn keyword ngxDirective contained mqtt_set_connect +syn keyword ngxDirective contained ntlm +syn keyword ngxDirective contained otel_service_name +syn keyword ngxDirective contained otel_span_attr +syn keyword ngxDirective contained otel_span_name +syn keyword ngxDirective contained otel_trace +syn keyword ngxDirective contained otel_trace_context +syn keyword ngxDirective contained proxy_cache_purge +syn keyword ngxDirective contained proxy_session_drop +syn keyword ngxDirective contained queue +syn keyword ngxDirective contained scgi_cache_purge +syn keyword ngxDirective contained session_log +syn keyword ngxDirective contained session_log_format +syn keyword ngxDirective contained session_log_zone +syn keyword ngxDirective contained state +syn keyword ngxDirective contained status +syn keyword ngxDirective contained status_format +syn keyword ngxDirective contained status_zone +syn keyword ngxDirective contained sticky +syn keyword ngxDirective contained uwsgi_cache_purge syn keyword ngxDirective contained zone_sync syn keyword ngxDirective contained zone_sync_buffers syn keyword ngxDirective contained zone_sync_connect_retry_interval @@ -775,61 +793,12 @@ syn keyword ngxDirective contained zone_sync_ssl_verify_depth syn keyword ngxDirective contained zone_sync_timeout " 3rd party modules list taken from -" https://github.com/freebsd/freebsd-ports/blob/master/www/nginx-devel/Makefile -" ----------------------------------------------------------------------------- +" https://github.com/freebsd/freebsd-ports/blob/main/www/nginx-devel/Makefile.extmod +" ---------------------------------------------------------------------------------- -" Accept Language -" https://github.com/giom/nginx_accept_language_module -syn keyword ngxDirectiveThirdParty contained set_from_accept_language - -" Digest Authentication -" https://github.com/atomx/nginx-http-auth-digest -syn keyword ngxDirectiveThirdParty contained auth_digest -syn keyword ngxDirectiveThirdParty contained auth_digest_drop_time -syn keyword ngxDirectiveThirdParty contained auth_digest_evasion_time -syn keyword ngxDirectiveThirdParty contained auth_digest_expires -syn keyword ngxDirectiveThirdParty contained auth_digest_maxtries -syn keyword ngxDirectiveThirdParty contained auth_digest_replays -syn keyword ngxDirectiveThirdParty contained auth_digest_shm_size -syn keyword ngxDirectiveThirdParty contained auth_digest_timeout -syn keyword ngxDirectiveThirdParty contained auth_digest_user_file - -" SPNEGO Authentication -" https://github.com/stnoonan/spnego-http-auth-nginx-module -syn keyword ngxDirectiveThirdParty contained auth_gss -syn keyword ngxDirectiveThirdParty contained auth_gss_allow_basic_fallback -syn keyword ngxDirectiveThirdParty contained auth_gss_authorized_principal -syn keyword ngxDirectiveThirdParty contained auth_gss_authorized_principal_regex -syn keyword ngxDirectiveThirdParty contained auth_gss_constrained_delegation -syn keyword ngxDirectiveThirdParty contained auth_gss_delegate_credentials -syn keyword ngxDirectiveThirdParty contained auth_gss_force_realm -syn keyword ngxDirectiveThirdParty contained auth_gss_format_full -syn keyword ngxDirectiveThirdParty contained auth_gss_keytab -syn keyword ngxDirectiveThirdParty contained auth_gss_map_to_local -syn keyword ngxDirectiveThirdParty contained auth_gss_realm -syn keyword ngxDirectiveThirdParty contained auth_gss_service_ccache -syn keyword ngxDirectiveThirdParty contained auth_gss_service_name - -" LDAP Authentication -" https://github.com/kvspb/nginx-auth-ldap -syn keyword ngxDirectiveThirdParty contained auth_ldap -syn keyword ngxDirectiveThirdParty contained auth_ldap_cache_enabled -syn keyword ngxDirectiveThirdParty contained auth_ldap_cache_expiration_time -syn keyword ngxDirectiveThirdParty contained auth_ldap_cache_size -syn keyword ngxDirectiveThirdParty contained auth_ldap_servers -syn keyword ngxDirectiveThirdParty contained auth_ldap_servers_size -syn keyword ngxDirectiveThirdParty contained ldap_server - -" PAM Authentication -" https://github.com/sto/ngx_http_auth_pam_module -syn keyword ngxDirectiveThirdParty contained auth_pam -syn keyword ngxDirectiveThirdParty contained auth_pam_service_name -syn keyword ngxDirectiveThirdParty contained auth_pam_set_pam_env - -" AJP protocol proxy -" https://github.com/yaoweibin/nginx_ajp_module -syn keyword ngxDirectiveThirdParty contained ajp_buffers +" https://github.com/msva/nginx_ajp_module syn keyword ngxDirectiveThirdParty contained ajp_buffer_size +syn keyword ngxDirectiveThirdParty contained ajp_buffers syn keyword ngxDirectiveThirdParty contained ajp_busy_buffers_size syn keyword ngxDirectiveThirdParty contained ajp_cache syn keyword ngxDirectiveThirdParty contained ajp_cache_key @@ -850,11 +819,13 @@ syn keyword ngxDirectiveThirdParty contained ajp_keep_conn syn keyword ngxDirectiveThirdParty contained ajp_max_data_packet_size syn keyword ngxDirectiveThirdParty contained ajp_max_temp_file_size syn keyword ngxDirectiveThirdParty contained ajp_next_upstream +syn keyword ngxDirectiveThirdParty contained ajp_param syn keyword ngxDirectiveThirdParty contained ajp_pass syn keyword ngxDirectiveThirdParty contained ajp_pass_header syn keyword ngxDirectiveThirdParty contained ajp_pass_request_body syn keyword ngxDirectiveThirdParty contained ajp_pass_request_headers syn keyword ngxDirectiveThirdParty contained ajp_read_timeout +syn keyword ngxDirectiveThirdParty contained ajp_script_url syn keyword ngxDirectiveThirdParty contained ajp_secret syn keyword ngxDirectiveThirdParty contained ajp_send_lowat syn keyword ngxDirectiveThirdParty contained ajp_send_timeout @@ -865,7 +836,12 @@ syn keyword ngxDirectiveThirdParty contained ajp_temp_path syn keyword ngxDirectiveThirdParty contained ajp_upstream_fail_timeout syn keyword ngxDirectiveThirdParty contained ajp_upstream_max_fails -" AWS proxy +" https://github.com/openresty/array-var-nginx-module +syn keyword ngxDirectiveThirdParty contained array_join +syn keyword ngxDirectiveThirdParty contained array_map +syn keyword ngxDirectiveThirdParty contained array_map_op +syn keyword ngxDirectiveThirdParty contained array_split + " https://github.com/anomalizer/ngx_aws_auth syn keyword ngxDirectiveThirdParty contained aws_access_key syn keyword ngxDirectiveThirdParty contained aws_endpoint @@ -874,65 +850,32 @@ syn keyword ngxDirectiveThirdParty contained aws_s3_bucket syn keyword ngxDirectiveThirdParty contained aws_sign syn keyword ngxDirectiveThirdParty contained aws_signing_key -" embedding Clojure or Java or Groovy programs -" https://github.com/nginx-clojure/nginx-clojure -syn keyword ngxDirectiveThirdParty contained access_handler_code -syn keyword ngxDirectiveThirdParty contained access_handler_name -syn keyword ngxDirectiveThirdParty contained access_handler_property -syn keyword ngxDirectiveThirdParty contained access_handler_type -syn keyword ngxDirectiveThirdParty contained always_read_body -syn keyword ngxDirectiveThirdParty contained auto_upgrade_ws -syn keyword ngxDirectiveThirdParty contained body_filter_code -syn keyword ngxDirectiveThirdParty contained body_filter_name -syn keyword ngxDirectiveThirdParty contained body_filter_property -syn keyword ngxDirectiveThirdParty contained body_filter_type -syn keyword ngxDirectiveThirdParty contained content_handler_code -syn keyword ngxDirectiveThirdParty contained content_handler_name -syn keyword ngxDirectiveThirdParty contained content_handler_property -syn keyword ngxDirectiveThirdParty contained content_handler_type -syn keyword ngxDirectiveThirdParty contained handler_code -syn keyword ngxDirectiveThirdParty contained handler_name -syn keyword ngxDirectiveThirdParty contained handlers_lazy_init -syn keyword ngxDirectiveThirdParty contained handler_type -syn keyword ngxDirectiveThirdParty contained header_filter_code -syn keyword ngxDirectiveThirdParty contained header_filter_name -syn keyword ngxDirectiveThirdParty contained header_filter_property -syn keyword ngxDirectiveThirdParty contained header_filter_type -syn keyword ngxDirectiveThirdParty contained jvm_classpath -syn keyword ngxDirectiveThirdParty contained jvm_classpath_check -syn keyword ngxDirectiveThirdParty contained jvm_exit_handler_code -syn keyword ngxDirectiveThirdParty contained jvm_exit_handler_name -syn keyword ngxDirectiveThirdParty contained jvm_handler_type -syn keyword ngxDirectiveThirdParty contained jvm_init_handler_code -syn keyword ngxDirectiveThirdParty contained jvm_init_handler_name -syn keyword ngxDirectiveThirdParty contained jvm_options -syn keyword ngxDirectiveThirdParty contained jvm_path -syn keyword ngxDirectiveThirdParty contained jvm_var -syn keyword ngxDirectiveThirdParty contained jvm_workers -syn keyword ngxDirectiveThirdParty contained log_handler_code -syn keyword ngxDirectiveThirdParty contained log_handler_name -syn keyword ngxDirectiveThirdParty contained log_handler_property -syn keyword ngxDirectiveThirdParty contained log_handler_type -syn keyword ngxDirectiveThirdParty contained max_balanced_tcp_connections -syn keyword ngxDirectiveThirdParty contained rewrite_handler_code -syn keyword ngxDirectiveThirdParty contained rewrite_handler_name -syn keyword ngxDirectiveThirdParty contained rewrite_handler_property -syn keyword ngxDirectiveThirdParty contained rewrite_handler_type -syn keyword ngxDirectiveThirdParty contained shared_map -syn keyword ngxDirectiveThirdParty contained write_page_size +" https://github.com/google/ngx_brotli +syn keyword ngxDirectiveThirdParty contained brotli +syn keyword ngxDirectiveThirdParty contained brotli_buffers +syn keyword ngxDirectiveThirdParty contained brotli_comp_level +syn keyword ngxDirectiveThirdParty contained brotli_min_length +syn keyword ngxDirectiveThirdParty contained brotli_static +syn keyword ngxDirectiveThirdParty contained brotli_types +syn keyword ngxDirectiveThirdParty contained brotli_window +" https://github.com/torden/ngx_cache_purge +syn keyword ngxDirectiveThirdParty contained cache_purge_response_type + +" https://github.com/AirisX/nginx_cookie_flag_module +syn keyword ngxDirectiveThirdParty contained set_cookie_flag -" Certificate Transparency " https://github.com/grahamedgecombe/nginx-ct syn keyword ngxDirectiveThirdParty contained ssl_ct syn keyword ngxDirectiveThirdParty contained ssl_ct_static_scts -" ngx_echo " https://github.com/openresty/echo-nginx-module +syn keyword ngxDirectiveThirdParty contained echo syn keyword ngxDirectiveThirdParty contained echo_abort_parent syn keyword ngxDirectiveThirdParty contained echo_after_body syn keyword ngxDirectiveThirdParty contained echo_before_body syn keyword ngxDirectiveThirdParty contained echo_blocking_sleep +syn keyword ngxDirectiveThirdParty contained echo_duplicate syn keyword ngxDirectiveThirdParty contained echo_end syn keyword ngxDirectiveThirdParty contained echo_exec syn keyword ngxDirectiveThirdParty contained echo_flush @@ -942,28 +885,102 @@ syn keyword ngxDirectiveThirdParty contained echo_location_async syn keyword ngxDirectiveThirdParty contained echo_read_request_body syn keyword ngxDirectiveThirdParty contained echo_request_body syn keyword ngxDirectiveThirdParty contained echo_reset_timer +syn keyword ngxDirectiveThirdParty contained echo_sleep syn keyword ngxDirectiveThirdParty contained echo_status syn keyword ngxDirectiveThirdParty contained echo_subrequest syn keyword ngxDirectiveThirdParty contained echo_subrequest_async -" FastDFS -" https://github.com/happyfish100/fastdfs-nginx-module -syn keyword ngxDirectiveThirdParty contained ngx_fastdfs_module +" https://github.com/openresty/drizzle-nginx-module +syn keyword ngxDirectiveThirdParty contained drizzle_buffer_size +syn keyword ngxDirectiveThirdParty contained drizzle_connect_timeout +syn keyword ngxDirectiveThirdParty contained drizzle_dbname +syn keyword ngxDirectiveThirdParty contained drizzle_keepalive +syn keyword ngxDirectiveThirdParty contained drizzle_module_header +syn keyword ngxDirectiveThirdParty contained drizzle_pass +syn keyword ngxDirectiveThirdParty contained drizzle_query +syn keyword ngxDirectiveThirdParty contained drizzle_recv_cols_timeout +syn keyword ngxDirectiveThirdParty contained drizzle_recv_rows_timeout +syn keyword ngxDirectiveThirdParty contained drizzle_send_query_timeout +syn keyword ngxDirectiveThirdParty contained drizzle_server +syn keyword ngxDirectiveThirdParty contained drizzle_status + +" https://github.com/ZigzagAK/ngx_dynamic_upstream +syn keyword ngxDirectiveThirdParty contained dns_add_down +syn keyword ngxDirectiveThirdParty contained dns_ipv6 +syn keyword ngxDirectiveThirdParty contained dns_update +syn keyword ngxDirectiveThirdParty contained dynamic_state_file +syn keyword ngxDirectiveThirdParty contained dynamic_upstream + +" https://github.com/openresty/encrypted-session-nginx-module +syn keyword ngxDirectiveThirdParty contained encrypted_session_expires +syn keyword ngxDirectiveThirdParty contained encrypted_session_iv +syn keyword ngxDirectiveThirdParty contained encrypted_session_key +syn keyword ngxDirectiveThirdParty contained set_decrypt_session +syn keyword ngxDirectiveThirdParty contained set_encrypt_session + +" https://github.com/calio/form-input-nginx-module +syn keyword ngxDirectiveThirdParty contained set_form_input +syn keyword ngxDirectiveThirdParty contained set_form_input_multi + +" https://github.com/nieoding/nginx-gridfs +syn keyword ngxDirectiveThirdParty contained gridfs +syn keyword ngxDirectiveThirdParty contained mongo -" ngx_headers_more " https://github.com/openresty/headers-more-nginx-module syn keyword ngxDirectiveThirdParty contained more_clear_headers syn keyword ngxDirectiveThirdParty contained more_clear_input_headers syn keyword ngxDirectiveThirdParty contained more_set_headers syn keyword ngxDirectiveThirdParty contained more_set_input_headers -" NGINX WebDAV missing commands support (PROPFIND & OPTIONS) +" https://github.com/dvershinin/nginx_accept_language_module +syn keyword ngxDirectiveThirdParty contained set_from_accept_language + +" https://github.com/atomx/nginx-http-auth-digest +syn keyword ngxDirectiveThirdParty contained auth_digest +syn keyword ngxDirectiveThirdParty contained auth_digest_drop_time +syn keyword ngxDirectiveThirdParty contained auth_digest_evasion_time +syn keyword ngxDirectiveThirdParty contained auth_digest_expires +syn keyword ngxDirectiveThirdParty contained auth_digest_maxtries +syn keyword ngxDirectiveThirdParty contained auth_digest_replays +syn keyword ngxDirectiveThirdParty contained auth_digest_shm_size +syn keyword ngxDirectiveThirdParty contained auth_digest_timeout +syn keyword ngxDirectiveThirdParty contained auth_digest_user_file + +" https://github.com/stnoonan/spnego-http-auth-nginx-module +syn keyword ngxDirectiveThirdParty contained auth_gss +syn keyword ngxDirectiveThirdParty contained auth_gss_allow_basic_fallback +syn keyword ngxDirectiveThirdParty contained auth_gss_authorized_principal +syn keyword ngxDirectiveThirdParty contained auth_gss_authorized_principal_regex +syn keyword ngxDirectiveThirdParty contained auth_gss_constrained_delegation +syn keyword ngxDirectiveThirdParty contained auth_gss_delegate_credentials +syn keyword ngxDirectiveThirdParty contained auth_gss_force_realm +syn keyword ngxDirectiveThirdParty contained auth_gss_format_full +syn keyword ngxDirectiveThirdParty contained auth_gss_keytab +syn keyword ngxDirectiveThirdParty contained auth_gss_map_to_local +syn keyword ngxDirectiveThirdParty contained auth_gss_realm +syn keyword ngxDirectiveThirdParty contained auth_gss_service_ccache +syn keyword ngxDirectiveThirdParty contained auth_gss_service_name +syn keyword ngxDirectiveThirdParty contained auth_gss_zone_name + +" https://github.com/kvspb/nginx-auth-ldap +syn keyword ngxDirectiveThirdParty contained auth_ldap +syn keyword ngxDirectiveThirdParty contained auth_ldap_cache_enabled +syn keyword ngxDirectiveThirdParty contained auth_ldap_cache_expiration_time +syn keyword ngxDirectiveThirdParty contained auth_ldap_cache_size +syn keyword ngxDirectiveThirdParty contained auth_ldap_servers +syn keyword ngxDirectiveThirdParty contained auth_ldap_servers_size +syn keyword ngxDirectiveThirdParty contained ldap_server + +" https://github.com/sto/ngx_http_auth_pam_module +syn keyword ngxDirectiveThirdParty contained auth_pam +syn keyword ngxDirectiveThirdParty contained auth_pam_service_name +syn keyword ngxDirectiveThirdParty contained auth_pam_set_pam_env + " https://github.com/arut/nginx-dav-ext-module syn keyword ngxDirectiveThirdParty contained dav_ext_lock syn keyword ngxDirectiveThirdParty contained dav_ext_lock_zone syn keyword ngxDirectiveThirdParty contained dav_ext_methods -" ngx_eval " https://github.com/openresty/nginx-eval-module syn keyword ngxDirectiveThirdParty contained eval syn keyword ngxDirectiveThirdParty contained eval_buffer_size @@ -971,9 +988,9 @@ syn keyword ngxDirectiveThirdParty contained eval_escalate syn keyword ngxDirectiveThirdParty contained eval_override_content_type syn keyword ngxDirectiveThirdParty contained eval_subrequest_in_memory -" Fancy Index " https://github.com/aperezdc/ngx-fancyindex syn keyword ngxDirectiveThirdParty contained fancyindex +syn keyword ngxDirectiveThirdParty contained fancyindex_case_sensitive syn keyword ngxDirectiveThirdParty contained fancyindex_css_href syn keyword ngxDirectiveThirdParty contained fancyindex_default_sort syn keyword ngxDirectiveThirdParty contained fancyindex_directories_first @@ -988,40 +1005,29 @@ syn keyword ngxDirectiveThirdParty contained fancyindex_show_dotfiles syn keyword ngxDirectiveThirdParty contained fancyindex_show_path syn keyword ngxDirectiveThirdParty contained fancyindex_time_format -" Footer filter " https://github.com/alibaba/nginx-http-footer-filter syn keyword ngxDirectiveThirdParty contained footer syn keyword ngxDirectiveThirdParty contained footer_types -" ngx_http_geoip2_module " https://github.com/leev/ngx_http_geoip2_module syn keyword ngxDirectiveThirdParty contained geoip2 syn keyword ngxDirectiveThirdParty contained geoip2_proxy syn keyword ngxDirectiveThirdParty contained geoip2_proxy_recursive -" A version of the Nginx HTTP stub status module that outputs in JSON format -" https://github.com/nginx-modules/nginx-json-status-module -syn keyword ngxDirectiveThirdParty contained json_status -syn keyword ngxDirectiveThirdParty contained json_status_type +" https://github.com/ip2location/ip2location-nginx +syn keyword ngxDirectiveThirdParty contained ip2location_database +syn keyword ngxDirectiveThirdParty contained ip2location_proxy +syn keyword ngxDirectiveThirdParty contained ip2location_proxy_recursive -" MogileFS client for nginx -" https://github.com/vkholodkov/nginx-mogilefs-module -syn keyword ngxDirectiveThirdParty contained mogilefs_class -syn keyword ngxDirectiveThirdParty contained mogilefs_connect_timeout -syn keyword ngxDirectiveThirdParty contained mogilefs_domain -syn keyword ngxDirectiveThirdParty contained mogilefs_methods -syn keyword ngxDirectiveThirdParty contained mogilefs_noverify -syn keyword ngxDirectiveThirdParty contained mogilefs_pass -syn keyword ngxDirectiveThirdParty contained mogilefs_read_timeout -syn keyword ngxDirectiveThirdParty contained mogilefs_send_timeout -syn keyword ngxDirectiveThirdParty contained mogilefs_tracker +" https://github.com/ip2location/ip2proxy-nginx +syn keyword ngxDirectiveThirdParty contained ip2proxy_database +syn keyword ngxDirectiveThirdParty contained ip2proxy_proxy +syn keyword ngxDirectiveThirdParty contained ip2proxy_proxy_recursive -" Ancient nginx plugin; probably not useful to anyone " https://github.com/kr/nginx-notice syn keyword ngxDirectiveThirdParty contained notice syn keyword ngxDirectiveThirdParty contained notice_type -" nchan " https://github.com/slact/nchan syn keyword ngxDirectiveThirdParty contained nchan_access_control_allow_credentials syn keyword ngxDirectiveThirdParty contained nchan_access_control_allow_origin @@ -1034,8 +1040,8 @@ syn keyword ngxDirectiveThirdParty contained nchan_benchmark_publisher_distribut syn keyword ngxDirectiveThirdParty contained nchan_benchmark_subscriber_distribution syn keyword ngxDirectiveThirdParty contained nchan_benchmark_subscribers_per_channel syn keyword ngxDirectiveThirdParty contained nchan_benchmark_time -syn keyword ngxDirectiveThirdParty contained nchan_channel_events_channel_id syn keyword ngxDirectiveThirdParty contained nchan_channel_event_string +syn keyword ngxDirectiveThirdParty contained nchan_channel_events_channel_id syn keyword ngxDirectiveThirdParty contained nchan_channel_group syn keyword ngxDirectiveThirdParty contained nchan_channel_group_accounting syn keyword ngxDirectiveThirdParty contained nchan_channel_id @@ -1073,12 +1079,32 @@ syn keyword ngxDirectiveThirdParty contained nchan_publisher_upstream_request syn keyword ngxDirectiveThirdParty contained nchan_pubsub syn keyword ngxDirectiveThirdParty contained nchan_pubsub_channel_id syn keyword ngxDirectiveThirdParty contained nchan_pubsub_location +syn keyword ngxDirectiveThirdParty contained nchan_redis_accurate_subscriber_count syn keyword ngxDirectiveThirdParty contained nchan_redis_cluster_check_interval +syn keyword ngxDirectiveThirdParty contained nchan_redis_cluster_check_interval_backoff +syn keyword ngxDirectiveThirdParty contained nchan_redis_cluster_check_interval_jitter +syn keyword ngxDirectiveThirdParty contained nchan_redis_cluster_check_interval_max +syn keyword ngxDirectiveThirdParty contained nchan_redis_cluster_check_interval_min +syn keyword ngxDirectiveThirdParty contained nchan_redis_cluster_connect_timeout +syn keyword ngxDirectiveThirdParty contained nchan_redis_cluster_max_failing_time +syn keyword ngxDirectiveThirdParty contained nchan_redis_cluster_recovery_delay +syn keyword ngxDirectiveThirdParty contained nchan_redis_cluster_recovery_delay_backoff +syn keyword ngxDirectiveThirdParty contained nchan_redis_cluster_recovery_delay_jitter +syn keyword ngxDirectiveThirdParty contained nchan_redis_cluster_recovery_delay_max +syn keyword ngxDirectiveThirdParty contained nchan_redis_cluster_recovery_delay_min +syn keyword ngxDirectiveThirdParty contained nchan_redis_command_timeout syn keyword ngxDirectiveThirdParty contained nchan_redis_connect_timeout syn keyword ngxDirectiveThirdParty contained nchan_redis_discovered_ip_range_blacklist syn keyword ngxDirectiveThirdParty contained nchan_redis_fakesub_timer_interval syn keyword ngxDirectiveThirdParty contained nchan_redis_idle_channel_cache_timeout +syn keyword ngxDirectiveThirdParty contained nchan_redis_idle_channel_keepalive_backoff +syn keyword ngxDirectiveThirdParty contained nchan_redis_idle_channel_keepalive_jitter +syn keyword ngxDirectiveThirdParty contained nchan_redis_idle_channel_keepalive_max +syn keyword ngxDirectiveThirdParty contained nchan_redis_idle_channel_keepalive_min +syn keyword ngxDirectiveThirdParty contained nchan_redis_idle_channel_keepalive_safety_margin +syn keyword ngxDirectiveThirdParty contained nchan_redis_load_scripts_unconditionally syn keyword ngxDirectiveThirdParty contained nchan_redis_namespace +syn keyword ngxDirectiveThirdParty contained nchan_redis_node_connect_timeout syn keyword ngxDirectiveThirdParty contained nchan_redis_nostore_fastpublish syn keyword ngxDirectiveThirdParty contained nchan_redis_optimize_target syn keyword ngxDirectiveThirdParty contained nchan_redis_pass @@ -1086,6 +1112,13 @@ syn keyword ngxDirectiveThirdParty contained nchan_redis_pass_inheritable syn keyword ngxDirectiveThirdParty contained nchan_redis_password syn keyword ngxDirectiveThirdParty contained nchan_redis_ping_interval syn keyword ngxDirectiveThirdParty contained nchan_redis_publish_msgpacked_max_size +syn keyword ngxDirectiveThirdParty contained nchan_redis_reconnect_delay +syn keyword ngxDirectiveThirdParty contained nchan_redis_reconnect_delay_backoff +syn keyword ngxDirectiveThirdParty contained nchan_redis_reconnect_delay_jitter +syn keyword ngxDirectiveThirdParty contained nchan_redis_reconnect_delay_max +syn keyword ngxDirectiveThirdParty contained nchan_redis_reconnect_delay_min +syn keyword ngxDirectiveThirdParty contained nchan_redis_retry_commands +syn keyword ngxDirectiveThirdParty contained nchan_redis_retry_commands_max_wait syn keyword ngxDirectiveThirdParty contained nchan_redis_server syn keyword ngxDirectiveThirdParty contained nchan_redis_ssl syn keyword ngxDirectiveThirdParty contained nchan_redis_ssl_ciphers @@ -1104,6 +1137,9 @@ syn keyword ngxDirectiveThirdParty contained nchan_redis_tls_server_name syn keyword ngxDirectiveThirdParty contained nchan_redis_tls_trusted_certificate syn keyword ngxDirectiveThirdParty contained nchan_redis_tls_trusted_certificate_path syn keyword ngxDirectiveThirdParty contained nchan_redis_tls_verify_certificate +syn keyword ngxDirectiveThirdParty contained nchan_redis_upstream_stats +syn keyword ngxDirectiveThirdParty contained nchan_redis_upstream_stats_disconnected_timeout +syn keyword ngxDirectiveThirdParty contained nchan_redis_upstream_stats_enabled syn keyword ngxDirectiveThirdParty contained nchan_redis_url syn keyword ngxDirectiveThirdParty contained nchan_redis_username syn keyword ngxDirectiveThirdParty contained nchan_redis_wait_after_connecting @@ -1113,10 +1149,10 @@ syn keyword ngxDirectiveThirdParty contained nchan_store_messages syn keyword ngxDirectiveThirdParty contained nchan_stub_status syn keyword ngxDirectiveThirdParty contained nchan_sub_channel_id syn keyword ngxDirectiveThirdParty contained nchan_subscribe_existing_channels_only +syn keyword ngxDirectiveThirdParty contained nchan_subscribe_request syn keyword ngxDirectiveThirdParty contained nchan_subscriber syn keyword ngxDirectiveThirdParty contained nchan_subscriber_channel_id syn keyword ngxDirectiveThirdParty contained nchan_subscriber_compound_etag_message_id -syn keyword ngxDirectiveThirdParty contained nchan_subscribe_request syn keyword ngxDirectiveThirdParty contained nchan_subscriber_first_message syn keyword ngxDirectiveThirdParty contained nchan_subscriber_http_raw_stream_separator syn keyword ngxDirectiveThirdParty contained nchan_subscriber_info @@ -1145,7 +1181,6 @@ syn keyword ngxDirectiveThirdParty contained push_subscriber syn keyword ngxDirectiveThirdParty contained push_subscriber_concurrency syn keyword ngxDirectiveThirdParty contained push_subscriber_timeout -" Push Stream " https://github.com/wandenberg/nginx-push-stream-module syn keyword ngxDirectiveThirdParty contained push_stream_allow_connections_to_events_channel syn keyword ngxDirectiveThirdParty contained push_stream_allowed_origins @@ -1184,23 +1219,6 @@ syn keyword ngxDirectiveThirdParty contained push_stream_websocket_allow_publish syn keyword ngxDirectiveThirdParty contained push_stream_wildcard_channel_max_qtd syn keyword ngxDirectiveThirdParty contained push_stream_wildcard_channel_prefix -" redis module -" https://www.nginx.com/resources/wiki/modules/redis/ -syn keyword ngxDirectiveThirdParty contained redis_bind -syn keyword ngxDirectiveThirdParty contained redis_buffer_size -syn keyword ngxDirectiveThirdParty contained redis_connect_timeout -syn keyword ngxDirectiveThirdParty contained redis_gzip_flag -syn keyword ngxDirectiveThirdParty contained redis_next_upstream -syn keyword ngxDirectiveThirdParty contained redis_pass -syn keyword ngxDirectiveThirdParty contained redis_read_timeout -syn keyword ngxDirectiveThirdParty contained redis_send_timeout - -" ngx_http_response -" http://catap.ru/downloads/nginx/ -syn keyword ngxDirectiveThirdParty contained response -syn keyword ngxDirectiveThirdParty contained response_type - -" nginx_substitutions_filter " https://github.com/yaoweibin/ngx_http_substitutions_filter_module syn keyword ngxDirectiveThirdParty contained subs_buffers syn keyword ngxDirectiveThirdParty contained subs_filter @@ -1208,7 +1226,6 @@ syn keyword ngxDirectiveThirdParty contained subs_filter_bypass syn keyword ngxDirectiveThirdParty contained subs_filter_types syn keyword ngxDirectiveThirdParty contained subs_line_buffer_size -" Tarantool nginx upstream module " https://github.com/tarantool/nginx_upstream_module syn keyword ngxDirectiveThirdParty contained tnt_allowed_indexes syn keyword ngxDirectiveThirdParty contained tnt_allowed_spaces @@ -1238,44 +1255,28 @@ syn keyword ngxDirectiveThirdParty contained tnt_set_header syn keyword ngxDirectiveThirdParty contained tnt_update syn keyword ngxDirectiveThirdParty contained tnt_upsert -" A module for nginx web server for handling file uploads using multipart/form-data encoding (RFC 1867) -" https://github.com/Austinb/nginx-upload-module +" https://github.com/fdintino/nginx-upload-module +syn keyword ngxDirectiveThirdParty contained upload_add_header syn keyword ngxDirectiveThirdParty contained upload_aggregate_form_field -syn keyword ngxDirectiveThirdParty contained upload_archive_elm -syn keyword ngxDirectiveThirdParty contained upload_archive_elm_separator -syn keyword ngxDirectiveThirdParty contained upload_archive_path -syn keyword ngxDirectiveThirdParty contained upload_archive_path_separator syn keyword ngxDirectiveThirdParty contained upload_buffer_size syn keyword ngxDirectiveThirdParty contained upload_cleanup -syn keyword ngxDirectiveThirdParty contained upload_content_type -syn keyword ngxDirectiveThirdParty contained upload_discard -syn keyword ngxDirectiveThirdParty contained upload_field_name -syn keyword ngxDirectiveThirdParty contained upload_file_crc32 -syn keyword ngxDirectiveThirdParty contained upload_file_md5 -syn keyword ngxDirectiveThirdParty contained upload_file_md5_uc -syn keyword ngxDirectiveThirdParty contained upload_file_name -syn keyword ngxDirectiveThirdParty contained upload_file_sha1 -syn keyword ngxDirectiveThirdParty contained upload_file_sha1_uc -syn keyword ngxDirectiveThirdParty contained upload_file_size -syn keyword ngxDirectiveThirdParty contained upload_filter +syn keyword ngxDirectiveThirdParty contained upload_empty_fiels_names +syn keyword ngxDirectiveThirdParty contained upload_limit_rate syn keyword ngxDirectiveThirdParty contained upload_max_file_size syn keyword ngxDirectiveThirdParty contained upload_max_output_body_len syn keyword ngxDirectiveThirdParty contained upload_max_part_header_len +syn keyword ngxDirectiveThirdParty contained upload_merge_buffer_size syn keyword ngxDirectiveThirdParty contained upload_pass syn keyword ngxDirectiveThirdParty contained upload_pass_args syn keyword ngxDirectiveThirdParty contained upload_pass_form_field +syn keyword ngxDirectiveThirdParty contained upload_range_header_buffer_size +syn keyword ngxDirectiveThirdParty contained upload_resumable syn keyword ngxDirectiveThirdParty contained upload_set_form_field +syn keyword ngxDirectiveThirdParty contained upload_state_store syn keyword ngxDirectiveThirdParty contained upload_store syn keyword ngxDirectiveThirdParty contained upload_store_access -syn keyword ngxDirectiveThirdParty contained upload_tmp_path -syn keyword ngxDirectiveThirdParty contained upload_unzip -syn keyword ngxDirectiveThirdParty contained upload_unzip_buffers -syn keyword ngxDirectiveThirdParty contained upload_unzip_hash -syn keyword ngxDirectiveThirdParty contained upload_unzip_max_file_name_len -syn keyword ngxDirectiveThirdParty contained upload_unzip_window -syn keyword ngxDirectiveThirdParty contained upload_void_content_type +syn keyword ngxDirectiveThirdParty contained upload_tame_arrays -" nginx-upload-progress-module " https://github.com/masterzen/nginx-upload-progress-module syn keyword ngxDirectiveThirdParty contained report_uploads syn keyword ngxDirectiveThirdParty contained track_uploads @@ -1288,7 +1289,6 @@ syn keyword ngxDirectiveThirdParty contained upload_progress_jsonp_output syn keyword ngxDirectiveThirdParty contained upload_progress_jsonp_parameter syn keyword ngxDirectiveThirdParty contained upload_progress_template -" Health checks upstreams for nginx " https://github.com/yaoweibin/nginx_upstream_check_module syn keyword ngxDirectiveThirdParty contained check syn keyword ngxDirectiveThirdParty contained check_fastcgi_param @@ -1298,13 +1298,15 @@ syn keyword ngxDirectiveThirdParty contained check_keepalive_requests syn keyword ngxDirectiveThirdParty contained check_shm_size syn keyword ngxDirectiveThirdParty contained check_status -" The fair load balancer module for nginx -" https://github.com/cryptofuture/nginx-upstream-fair +" https://github.com/jaygooby/nginx-upstream-fair syn keyword ngxDirectiveThirdParty contained fair syn keyword ngxDirectiveThirdParty contained upstream_fair_shm_size -" Nginx Video Thumb Extractor Module -" https://github.com/wandenberg/nginx-video-thumbextractor-module +" https://github.com/ayty-adrianomartins/nginx-sticky-module-ng +syn keyword ngxDirectiveThirdParty contained sticky_hide_cookie +syn keyword ngxDirectiveThirdParty contained sticky_no_fallback + +" https://github.com/Novetta/nginx-video-thumbextractor-module syn keyword ngxDirectiveThirdParty contained video_thumbextractor syn keyword ngxDirectiveThirdParty contained video_thumbextractor_image_height syn keyword ngxDirectiveThirdParty contained video_thumbextractor_image_width @@ -1329,43 +1331,14 @@ syn keyword ngxDirectiveThirdParty contained video_thumbextractor_tile_sample_in syn keyword ngxDirectiveThirdParty contained video_thumbextractor_video_filename syn keyword ngxDirectiveThirdParty contained video_thumbextractor_video_second -" drizzle-nginx-module - Upstream module for talking to MySQL and Drizzle directly -" https://github.com/openresty/drizzle-nginx-module -syn keyword ngxDirectiveThirdParty contained drizzle_buffer_size -syn keyword ngxDirectiveThirdParty contained drizzle_connect_timeout -syn keyword ngxDirectiveThirdParty contained drizzle_dbname -syn keyword ngxDirectiveThirdParty contained drizzle_keepalive -syn keyword ngxDirectiveThirdParty contained drizzle_module_header -syn keyword ngxDirectiveThirdParty contained drizzle_pass -syn keyword ngxDirectiveThirdParty contained drizzle_query -syn keyword ngxDirectiveThirdParty contained drizzle_recv_cols_timeout -syn keyword ngxDirectiveThirdParty contained drizzle_recv_rows_timeout -syn keyword ngxDirectiveThirdParty contained drizzle_send_query_timeout -syn keyword ngxDirectiveThirdParty contained drizzle_server -syn keyword ngxDirectiveThirdParty contained drizzle_status +" https://github.com/calio/iconv-nginx-module +syn keyword ngxDirectiveThirdParty contained iconv_buffer_size +syn keyword ngxDirectiveThirdParty contained iconv_filter +syn keyword ngxDirectiveThirdParty contained set_iconv -" ngx_dynamic_upstream -" https://github.com/cubicdaiya/ngx_dynamic_upstream -syn keyword ngxDirectiveThirdParty contained dynamic_upstream - -" encrypt and decrypt nginx variable values -" https://github.com/openresty/encrypted-session-nginx-module -syn keyword ngxDirectiveThirdParty contained encrypted_session_expires -syn keyword ngxDirectiveThirdParty contained encrypted_session_iv -syn keyword ngxDirectiveThirdParty contained encrypted_session_key -syn keyword ngxDirectiveThirdParty contained set_decrypt_session -syn keyword ngxDirectiveThirdParty contained set_encrypt_session - -" serve content directly from MongoDB's GridFS -" https://github.com/mdirolf/nginx-gridfs -syn keyword ngxDirectiveThirdParty contained gridfs -syn keyword ngxDirectiveThirdParty contained mongo - -" Adds support for arithmetic operations to NGINX config -" https://github.com/arut/nginx-let-module +" https://github.com/baysao/nginx-let-module syn keyword ngxDirectiveThirdParty contained let -" ngx_http_lua_module - Embed the power of Lua into Nginx HTTP Servers " https://github.com/openresty/lua-nginx-module syn keyword ngxDirectiveThirdParty contained access_by_lua syn keyword ngxDirectiveThirdParty contained access_by_lua_block @@ -1417,6 +1390,8 @@ syn keyword ngxDirectiveThirdParty contained lua_socket_pool_size syn keyword ngxDirectiveThirdParty contained lua_socket_read_timeout syn keyword ngxDirectiveThirdParty contained lua_socket_send_lowat syn keyword ngxDirectiveThirdParty contained lua_socket_send_timeout +syn keyword ngxDirectiveThirdParty contained lua_ssl_certificate +syn keyword ngxDirectiveThirdParty contained lua_ssl_certificate_key syn keyword ngxDirectiveThirdParty contained lua_ssl_ciphers syn keyword ngxDirectiveThirdParty contained lua_ssl_conf_command syn keyword ngxDirectiveThirdParty contained lua_ssl_crl @@ -1431,6 +1406,8 @@ syn keyword ngxDirectiveThirdParty contained rewrite_by_lua syn keyword ngxDirectiveThirdParty contained rewrite_by_lua_block syn keyword ngxDirectiveThirdParty contained rewrite_by_lua_file syn keyword ngxDirectiveThirdParty contained rewrite_by_lua_no_postpone +syn keyword ngxDirectiveThirdParty contained server_rewrite_by_lua_block +syn keyword ngxDirectiveThirdParty contained server_rewrite_by_lua_file syn keyword ngxDirectiveThirdParty contained set_by_lua syn keyword ngxDirectiveThirdParty contained set_by_lua_block syn keyword ngxDirectiveThirdParty contained set_by_lua_file @@ -1443,7 +1420,16 @@ syn keyword ngxDirectiveThirdParty contained ssl_session_fetch_by_lua_file syn keyword ngxDirectiveThirdParty contained ssl_session_store_by_lua_block syn keyword ngxDirectiveThirdParty contained ssl_session_store_by_lua_file -" ngx_memc - An extended version of the standard memcached module +" https://github.com/Taymindis/nginx-link-function +syn keyword ngxDirectiveThirdParty contained ngx_link_func_add_prop +syn keyword ngxDirectiveThirdParty contained ngx_link_func_add_req_header +syn keyword ngxDirectiveThirdParty contained ngx_link_func_ca_cert +syn keyword ngxDirectiveThirdParty contained ngx_link_func_call +syn keyword ngxDirectiveThirdParty contained ngx_link_func_download_link_lib +syn keyword ngxDirectiveThirdParty contained ngx_link_func_lib +syn keyword ngxDirectiveThirdParty contained ngx_link_func_shm_size +syn keyword ngxDirectiveThirdParty contained ngx_link_func_subrequest + " https://github.com/openresty/memc-nginx-module syn keyword ngxDirectiveThirdParty contained memc_buffer_size syn keyword ngxDirectiveThirdParty contained memc_cmds_allowed @@ -1457,21 +1443,24 @@ syn keyword ngxDirectiveThirdParty contained memc_send_timeout syn keyword ngxDirectiveThirdParty contained memc_upstream_fail_timeout syn keyword ngxDirectiveThirdParty contained memc_upstream_max_fails -" ModSecurity web application firewall -" https://github.com/SpiderLabs/ModSecurity/tree/master -syn keyword ngxDirectiveThirdParty contained ModSecurityConfig -syn keyword ngxDirectiveThirdParty contained ModSecurityEnabled -syn keyword ngxDirectiveThirdParty contained pool_context_hash_size +" https://github.com/SpiderLabs/ModSecurity-nginx +syn keyword ngxDirectiveThirdParty contained modsecurity +syn keyword ngxDirectiveThirdParty contained modsecurity_rules +syn keyword ngxDirectiveThirdParty contained modsecurity_rules_file +syn keyword ngxDirectiveThirdParty contained modsecurity_rules_remote +syn keyword ngxDirectiveThirdParty contained modsecurity_transaction_id -" NAXSI is an open-source, high performance, low rules maintenance WAF for NGINX " https://github.com/nbs-system/naxsi syn keyword ngxDirectiveThirdParty contained BasicRule syn keyword ngxDirectiveThirdParty contained CheckRule syn keyword ngxDirectiveThirdParty contained DeniedUrl +syn keyword ngxDirectiveThirdParty contained IgnoreCIDR +syn keyword ngxDirectiveThirdParty contained IgnoreIP syn keyword ngxDirectiveThirdParty contained LearningMode syn keyword ngxDirectiveThirdParty contained LibInjectionSql syn keyword ngxDirectiveThirdParty contained LibInjectionXss syn keyword ngxDirectiveThirdParty contained MainRule +syn keyword ngxDirectiveThirdParty contained NaxsiLogFile syn keyword ngxDirectiveThirdParty contained SecRulesDisabled syn keyword ngxDirectiveThirdParty contained SecRulesEnabled syn keyword ngxDirectiveThirdParty contained basic_rule @@ -1481,17 +1470,31 @@ syn keyword ngxDirectiveThirdParty contained learning_mode syn keyword ngxDirectiveThirdParty contained libinjection_sql syn keyword ngxDirectiveThirdParty contained libinjection_xss syn keyword ngxDirectiveThirdParty contained main_rule +syn keyword ngxDirectiveThirdParty contained naxsi_log syn keyword ngxDirectiveThirdParty contained rules_disabled syn keyword ngxDirectiveThirdParty contained rules_enabled -" Phusion Passenger -" https://www.phusionpassenger.com/library/config/nginx/reference/ +" https://github.com/opentracing-contrib/nginx-opentracing +syn keyword ngxDirectiveThirdParty contained opentracing +syn keyword ngxDirectiveThirdParty contained opentracing_fastcgi_propagate_context +syn keyword ngxDirectiveThirdParty contained opentracing_grpc_propagate_context +syn keyword ngxDirectiveThirdParty contained opentracing_load_tracer +syn keyword ngxDirectiveThirdParty contained opentracing_location_operation_name +syn keyword ngxDirectiveThirdParty contained opentracing_operation_name +syn keyword ngxDirectiveThirdParty contained opentracing_propagate_context +syn keyword ngxDirectiveThirdParty contained opentracing_tag +syn keyword ngxDirectiveThirdParty contained opentracing_trace_locations +syn keyword ngxDirectiveThirdParty contained opentracing_trust_incoming_span + +" https://github.com/phusion/passenger syn keyword ngxDirectiveThirdParty contained passenger_abort_on_startup_error syn keyword ngxDirectiveThirdParty contained passenger_abort_websockets_on_process_shutdown syn keyword ngxDirectiveThirdParty contained passenger_admin_panel_auth_type syn keyword ngxDirectiveThirdParty contained passenger_admin_panel_password syn keyword ngxDirectiveThirdParty contained passenger_admin_panel_url syn keyword ngxDirectiveThirdParty contained passenger_admin_panel_username +syn keyword ngxDirectiveThirdParty contained passenger_analytics_log_group +syn keyword ngxDirectiveThirdParty contained passenger_analytics_log_user syn keyword ngxDirectiveThirdParty contained passenger_anonymous_telemetry_proxy syn keyword ngxDirectiveThirdParty contained passenger_app_env syn keyword ngxDirectiveThirdParty contained passenger_app_file_descriptor_ulimit @@ -1499,20 +1502,25 @@ syn keyword ngxDirectiveThirdParty contained passenger_app_group_name syn keyword ngxDirectiveThirdParty contained passenger_app_log_file syn keyword ngxDirectiveThirdParty contained passenger_app_rights syn keyword ngxDirectiveThirdParty contained passenger_app_root +syn keyword ngxDirectiveThirdParty contained passenger_app_start_command syn keyword ngxDirectiveThirdParty contained passenger_app_type syn keyword ngxDirectiveThirdParty contained passenger_base_uri syn keyword ngxDirectiveThirdParty contained passenger_buffer_response syn keyword ngxDirectiveThirdParty contained passenger_buffer_size +syn keyword ngxDirectiveThirdParty contained passenger_buffer_upload syn keyword ngxDirectiveThirdParty contained passenger_buffers syn keyword ngxDirectiveThirdParty contained passenger_busy_buffers_size syn keyword ngxDirectiveThirdParty contained passenger_concurrency_model syn keyword ngxDirectiveThirdParty contained passenger_core_file_descriptor_ulimit syn keyword ngxDirectiveThirdParty contained passenger_ctl syn keyword ngxDirectiveThirdParty contained passenger_data_buffer_dir +syn keyword ngxDirectiveThirdParty contained passenger_debug_log_file syn keyword ngxDirectiveThirdParty contained passenger_debugger syn keyword ngxDirectiveThirdParty contained passenger_default_group syn keyword ngxDirectiveThirdParty contained passenger_default_user +syn keyword ngxDirectiveThirdParty contained passenger_direct_instance_request_address syn keyword ngxDirectiveThirdParty contained passenger_disable_anonymous_telemetry +syn keyword ngxDirectiveThirdParty contained passenger_disable_log_prefix syn keyword ngxDirectiveThirdParty contained passenger_disable_security_update_check syn keyword ngxDirectiveThirdParty contained passenger_document_root syn keyword ngxDirectiveThirdParty contained passenger_dump_config_manifest @@ -1548,8 +1556,10 @@ syn keyword ngxDirectiveThirdParty contained passenger_nodejs syn keyword ngxDirectiveThirdParty contained passenger_pass_header syn keyword ngxDirectiveThirdParty contained passenger_pool_idle_time syn keyword ngxDirectiveThirdParty contained passenger_pre_start +syn keyword ngxDirectiveThirdParty contained passenger_preload_bundler syn keyword ngxDirectiveThirdParty contained passenger_python syn keyword ngxDirectiveThirdParty contained passenger_read_timeout +syn keyword ngxDirectiveThirdParty contained passenger_request_buffering syn keyword ngxDirectiveThirdParty contained passenger_request_queue_overflow_status_code syn keyword ngxDirectiveThirdParty contained passenger_resist_deployment_errors syn keyword ngxDirectiveThirdParty contained passenger_response_buffer_high_watermark @@ -1561,36 +1571,36 @@ syn keyword ngxDirectiveThirdParty contained passenger_security_update_check_pro syn keyword ngxDirectiveThirdParty contained passenger_set_header syn keyword ngxDirectiveThirdParty contained passenger_show_version_in_header syn keyword ngxDirectiveThirdParty contained passenger_socket_backlog +syn keyword ngxDirectiveThirdParty contained passenger_spawn_dir +syn keyword ngxDirectiveThirdParty contained passenger_spawn_exception_status_code syn keyword ngxDirectiveThirdParty contained passenger_spawn_method syn keyword ngxDirectiveThirdParty contained passenger_start_timeout syn keyword ngxDirectiveThirdParty contained passenger_startup_file syn keyword ngxDirectiveThirdParty contained passenger_stat_throttle_rate syn keyword ngxDirectiveThirdParty contained passenger_sticky_sessions +syn keyword ngxDirectiveThirdParty contained passenger_sticky_sessions_cookie_attributes syn keyword ngxDirectiveThirdParty contained passenger_sticky_sessions_cookie_name +syn keyword ngxDirectiveThirdParty contained passenger_temp_path syn keyword ngxDirectiveThirdParty contained passenger_thread_count syn keyword ngxDirectiveThirdParty contained passenger_turbocaching +syn keyword ngxDirectiveThirdParty contained passenger_use_global_queue syn keyword ngxDirectiveThirdParty contained passenger_user syn keyword ngxDirectiveThirdParty contained passenger_user_switching syn keyword ngxDirectiveThirdParty contained passenger_vary_turbocache_by_cookie -syn keyword ngxDirectiveThirdPartyDeprecated contained passenger_analytics_log_group -syn keyword ngxDirectiveThirdPartyDeprecated contained passenger_analytics_log_user -syn keyword ngxDirectiveThirdPartyDeprecated contained passenger_debug_log_file -syn keyword ngxDirectiveThirdPartyDeprecated contained passenger_use_global_queue -syn keyword ngxDirectiveThirdPartyDeprecated contained rack_env -syn keyword ngxDirectiveThirdPartyDeprecated contained rails_app_spawner_idle_time -syn keyword ngxDirectiveThirdPartyDeprecated contained rails_env -syn keyword ngxDirectiveThirdPartyDeprecated contained rails_framework_spawner_idle_time -syn keyword ngxDirectiveThirdPartyDeprecated contained rails_spawn_method -syn keyword ngxDirectiveThirdPartyDeprecated contained union_station_filter -syn keyword ngxDirectiveThirdPartyDeprecated contained union_station_gateway_address -syn keyword ngxDirectiveThirdPartyDeprecated contained union_station_gateway_cert -syn keyword ngxDirectiveThirdPartyDeprecated contained union_station_gateway_port -syn keyword ngxDirectiveThirdPartyDeprecated contained union_station_key -syn keyword ngxDirectiveThirdPartyDeprecated contained union_station_proxy_address -syn keyword ngxDirectiveThirdPartyDeprecated contained union_station_support +syn keyword ngxDirectiveThirdParty contained rack_env +syn keyword ngxDirectiveThirdParty contained rails_app_spawner_idle_time +syn keyword ngxDirectiveThirdParty contained rails_env +syn keyword ngxDirectiveThirdParty contained rails_framework_spawner_idle_time +syn keyword ngxDirectiveThirdParty contained rails_spawn_method +syn keyword ngxDirectiveThirdParty contained union_station_filter +syn keyword ngxDirectiveThirdParty contained union_station_gateway_address +syn keyword ngxDirectiveThirdParty contained union_station_gateway_cert +syn keyword ngxDirectiveThirdParty contained union_station_gateway_port +syn keyword ngxDirectiveThirdParty contained union_station_key +syn keyword ngxDirectiveThirdParty contained union_station_proxy_address +syn keyword ngxDirectiveThirdParty contained union_station_support -" ngx_postgres is an upstream module that allows nginx to communicate directly with PostgreSQL database -" https://github.com/FRiCKLE/ngx_postgres +" https://github.com/konstruxi/ngx_postgres syn keyword ngxDirectiveThirdParty contained postgres_connect_timeout syn keyword ngxDirectiveThirdParty contained postgres_escape syn keyword ngxDirectiveThirdParty contained postgres_keepalive @@ -1602,7 +1612,6 @@ syn keyword ngxDirectiveThirdParty contained postgres_rewrite syn keyword ngxDirectiveThirdParty contained postgres_server syn keyword ngxDirectiveThirdParty contained postgres_set -" ngx_rds_csv - Nginx output filter module to convert Resty-DBD-Streams (RDS) to Comma-Separated Values (CSV) " https://github.com/openresty/rds-csv-nginx-module syn keyword ngxDirectiveThirdParty contained rds_csv syn keyword ngxDirectiveThirdParty contained rds_csv_buffer_size @@ -1611,7 +1620,6 @@ syn keyword ngxDirectiveThirdParty contained rds_csv_field_name_header syn keyword ngxDirectiveThirdParty contained rds_csv_field_separator syn keyword ngxDirectiveThirdParty contained rds_csv_row_terminator -" ngx_rds_json - an output filter that formats Resty DBD Streams generated by ngx_drizzle and others to JSON " https://github.com/openresty/rds-json-nginx-module syn keyword ngxDirectiveThirdParty contained rds_json syn keyword ngxDirectiveThirdParty contained rds_json_buffer_size @@ -1624,7 +1632,6 @@ syn keyword ngxDirectiveThirdParty contained rds_json_root syn keyword ngxDirectiveThirdParty contained rds_json_success_property syn keyword ngxDirectiveThirdParty contained rds_json_user_property -" ngx_redis2 - Nginx upstream module for the Redis 2.0 protocol " https://github.com/openresty/redis2-nginx-module syn keyword ngxDirectiveThirdParty contained redis2_bind syn keyword ngxDirectiveThirdParty contained redis2_buffer_size @@ -1638,7 +1645,6 @@ syn keyword ngxDirectiveThirdParty contained redis2_raw_query syn keyword ngxDirectiveThirdParty contained redis2_read_timeout syn keyword ngxDirectiveThirdParty contained redis2_send_timeout -" NGINX-based Media Streaming Server " https://github.com/arut/nginx-rtmp-module syn keyword ngxDirectiveThirdParty contained ack_window syn keyword ngxDirectiveThirdParty contained application @@ -1750,7 +1756,6 @@ syn keyword ngxDirectiveThirdParty contained sync syn keyword ngxDirectiveThirdParty contained wait_key syn keyword ngxDirectiveThirdParty contained wait_video -" ngx_set_misc - Various set_xxx directives added to nginx's rewrite module (md5/sha1, sql/json quoting, and many more) " https://github.com/openresty/set-misc-nginx-module syn keyword ngxDirectiveThirdParty contained set_base32_alphabet syn keyword ngxDirectiveThirdParty contained set_base32_padding @@ -1770,6 +1775,7 @@ syn keyword ngxDirectiveThirdParty contained set_hmac_sha1 syn keyword ngxDirectiveThirdParty contained set_hmac_sha256 syn keyword ngxDirectiveThirdParty contained set_if_empty syn keyword ngxDirectiveThirdParty contained set_local_today +syn keyword ngxDirectiveThirdParty contained set_md5 syn keyword ngxDirectiveThirdParty contained set_misc_base32_padding syn keyword ngxDirectiveThirdParty contained set_quote_json_str syn keyword ngxDirectiveThirdParty contained set_quote_pgsql_str @@ -1778,20 +1784,18 @@ syn keyword ngxDirectiveThirdParty contained set_random syn keyword ngxDirectiveThirdParty contained set_rotate syn keyword ngxDirectiveThirdParty contained set_secure_random_alphanum syn keyword ngxDirectiveThirdParty contained set_secure_random_lcalpha +syn keyword ngxDirectiveThirdParty contained set_sha1 syn keyword ngxDirectiveThirdParty contained set_unescape_uri -" nginx-sflow-module " https://github.com/sflow/nginx-sflow-module syn keyword ngxDirectiveThirdParty contained sflow -" Shibboleth auth request module for Nginx " https://github.com/nginx-shib/nginx-http-shibboleth syn keyword ngxDirectiveThirdParty contained shib_request syn keyword ngxDirectiveThirdParty contained shib_request_set syn keyword ngxDirectiveThirdParty contained shib_request_use_headers -" nginx module which adds ability to cache static files -" https://github.com/FRiCKLE/ngx_slowfs_cache +" https://github.com/baysao/ngx_slowfs_cache syn keyword ngxDirectiveThirdParty contained slowfs_big_file_size syn keyword ngxDirectiveThirdParty contained slowfs_cache syn keyword ngxDirectiveThirdParty contained slowfs_cache_key @@ -1801,18 +1805,6 @@ syn keyword ngxDirectiveThirdParty contained slowfs_cache_purge syn keyword ngxDirectiveThirdParty contained slowfs_cache_valid syn keyword ngxDirectiveThirdParty contained slowfs_temp_path -" Dynamic Image Transformation Module For nginx -" https://github.com/cubicdaiya/ngx_small_light -syn keyword ngxDirectiveThirdParty contained small_light -syn keyword ngxDirectiveThirdParty contained small_light_buffer -syn keyword ngxDirectiveThirdParty contained small_light_getparam_mode -syn keyword ngxDirectiveThirdParty contained small_light_imlib2_temp_dir -syn keyword ngxDirectiveThirdParty contained small_light_material_dir -syn keyword ngxDirectiveThirdParty contained small_light_pattern_define -syn keyword ngxDirectiveThirdParty contained small_light_radius_max -syn keyword ngxDirectiveThirdParty contained small_light_sigma_max - -" ngx_srcache - Transparent subrequest-based caching layout for arbitrary nginx locations " https://github.com/openresty/srcache-nginx-module syn keyword ngxDirectiveThirdParty contained srcache_buffer syn keyword ngxDirectiveThirdParty contained srcache_default_expire @@ -1835,7 +1827,6 @@ syn keyword ngxDirectiveThirdParty contained srcache_store_ranges syn keyword ngxDirectiveThirdParty contained srcache_store_skip syn keyword ngxDirectiveThirdParty contained srcache_store_statuses -" NGINX-based VOD Packager " https://github.com/kaltura/nginx-vod-module syn keyword ngxDirectiveThirdParty contained vod syn keyword ngxDirectiveThirdParty contained vod_align_segments_to_key_frames @@ -1875,6 +1866,7 @@ syn keyword ngxDirectiveThirdParty contained vod_live_window_duration syn keyword ngxDirectiveThirdParty contained vod_manifest_duration_policy syn keyword ngxDirectiveThirdParty contained vod_manifest_segment_durations_mode syn keyword ngxDirectiveThirdParty contained vod_mapping_cache +syn keyword ngxDirectiveThirdParty contained vod_max_frame_count syn keyword ngxDirectiveThirdParty contained vod_max_frames_size syn keyword ngxDirectiveThirdParty contained vod_max_mapping_response_size syn keyword ngxDirectiveThirdParty contained vod_max_metadata_size @@ -1901,6 +1893,7 @@ syn keyword ngxDirectiveThirdParty contained vod_response_cache syn keyword ngxDirectiveThirdParty contained vod_secret_key syn keyword ngxDirectiveThirdParty contained vod_segment_count_policy syn keyword ngxDirectiveThirdParty contained vod_segment_duration +syn keyword ngxDirectiveThirdParty contained vod_segment_max_frame_count syn keyword ngxDirectiveThirdParty contained vod_segments_base_url syn keyword ngxDirectiveThirdParty contained vod_source_clip_map_uri syn keyword ngxDirectiveThirdParty contained vod_speed_param_name @@ -1910,7 +1903,6 @@ syn keyword ngxDirectiveThirdParty contained vod_tracks_param_name syn keyword ngxDirectiveThirdParty contained vod_upstream_extra_args syn keyword ngxDirectiveThirdParty contained vod_upstream_location -" Nginx virtual host traffic status module " https://github.com/vozlt/nginx-module-vts syn keyword ngxDirectiveThirdParty contained vhost_traffic_status syn keyword ngxDirectiveThirdParty contained vhost_traffic_status_average_method @@ -1934,7 +1926,6 @@ syn keyword ngxDirectiveThirdParty contained vhost_traffic_status_limit_traffic_ syn keyword ngxDirectiveThirdParty contained vhost_traffic_status_set_by_filter syn keyword ngxDirectiveThirdParty contained vhost_traffic_status_zone -" xss-nginx-module - Native cross-site scripting support in nginx " https://github.com/openresty/xss-nginx-module syn keyword ngxDirectiveThirdParty contained xss_callback_arg syn keyword ngxDirectiveThirdParty contained xss_check_status @@ -1943,471 +1934,6 @@ syn keyword ngxDirectiveThirdParty contained xss_input_types syn keyword ngxDirectiveThirdParty contained xss_output_type syn keyword ngxDirectiveThirdParty contained xss_override_status -" Add support for array-typed variables to nginx config files -" https://github.com/openresty/array-var-nginx-module -syn keyword ngxDirectiveThirdParty contained array_join -syn keyword ngxDirectiveThirdParty contained array_map -syn keyword ngxDirectiveThirdParty contained array_map_op -syn keyword ngxDirectiveThirdParty contained array_split - -" NGINX module for Brotli compression -" https://github.com/eustas/ngx_brotli -syn keyword ngxDirectiveThirdParty contained brotli -syn keyword ngxDirectiveThirdParty contained brotli_buffers -syn keyword ngxDirectiveThirdParty contained brotli_comp_level -syn keyword ngxDirectiveThirdParty contained brotli_min_length -syn keyword ngxDirectiveThirdParty contained brotli_static -syn keyword ngxDirectiveThirdParty contained brotli_types -syn keyword ngxDirectiveThirdParty contained brotli_window - -" form-input-nginx-module -" https://github.com/calio/form-input-nginx-module -syn keyword ngxDirectiveThirdParty contained set_form_input -syn keyword ngxDirectiveThirdParty contained set_form_input_multi - -" character conversion nginx module using libiconv -" https://github.com/calio/iconv-nginx-module -syn keyword ngxDirectiveThirdParty contained iconv_buffer_size -syn keyword ngxDirectiveThirdParty contained iconv_filter -syn keyword ngxDirectiveThirdParty contained set_iconv - -" 3rd party modules list taken from -" https://www.nginx.com/resources/wiki/modules/ -" --------------------------------------------- - -" Nginx Module for Authenticating Akamai G2O requests -" https://github.com/kaltura/nginx_mod_akamai_g2o -syn keyword ngxDirectiveThirdParty contained g2o -syn keyword ngxDirectiveThirdParty contained g2o_data_header -syn keyword ngxDirectiveThirdParty contained g2o_hash_function -syn keyword ngxDirectiveThirdParty contained g2o_key -syn keyword ngxDirectiveThirdParty contained g2o_log_level -syn keyword ngxDirectiveThirdParty contained g2o_nonce -syn keyword ngxDirectiveThirdParty contained g2o_sign_header -syn keyword ngxDirectiveThirdParty contained g2o_time_window -syn keyword ngxDirectiveThirdParty contained g2o_version - -" nginx_lua_module -" https://github.com/alacner/nginx_lua_module -syn keyword ngxDirectiveThirdParty contained lua_file - -" Nginx Audio Track for HTTP Live Streaming -" https://github.com/flavioribeiro/nginx-audio-track-for-hls-module -syn keyword ngxDirectiveThirdParty contained ngx_hls_audio_track -syn keyword ngxDirectiveThirdParty contained ngx_hls_audio_track_output_format -syn keyword ngxDirectiveThirdParty contained ngx_hls_audio_track_output_header -syn keyword ngxDirectiveThirdParty contained ngx_hls_audio_track_rootpath - -" A Nginx module to dump backtrace when a worker process exits abnormally -" https://github.com/alibaba/nginx-backtrace -syn keyword ngxDirectiveThirdParty contained backtrace_log -syn keyword ngxDirectiveThirdParty contained backtrace_max_stack_size - -" circle_gif module -" https://github.com/evanmiller/nginx_circle_gif -syn keyword ngxDirectiveThirdParty contained circle_gif -syn keyword ngxDirectiveThirdParty contained circle_gif_max_radius -syn keyword ngxDirectiveThirdParty contained circle_gif_min_radius -syn keyword ngxDirectiveThirdParty contained circle_gif_step_radius - -" Upstream Consistent Hash -" https://github.com/replay/ngx_http_consistent_hash -syn keyword ngxDirectiveThirdParty contained consistent_hash - -" Nginx module for etags on dynamic content -" https://github.com/kali/nginx-dynamic-etags -syn keyword ngxDirectiveThirdParty contained dynamic_etags - -" Enhanced Nginx Memcached Module -" https://github.com/bpaquet/ngx_http_enhanced_memcached_module -syn keyword ngxDirectiveThirdParty contained enhanced_memcached_allow_delete -syn keyword ngxDirectiveThirdParty contained enhanced_memcached_allow_put -syn keyword ngxDirectiveThirdParty contained enhanced_memcached_bind -syn keyword ngxDirectiveThirdParty contained enhanced_memcached_buffer_size -syn keyword ngxDirectiveThirdParty contained enhanced_memcached_connect_timeout -syn keyword ngxDirectiveThirdParty contained enhanced_memcached_flush -syn keyword ngxDirectiveThirdParty contained enhanced_memcached_flush_namespace -syn keyword ngxDirectiveThirdParty contained enhanced_memcached_hash_keys_with_md5 -syn keyword ngxDirectiveThirdParty contained enhanced_memcached_pass -syn keyword ngxDirectiveThirdParty contained enhanced_memcached_read_timeout -syn keyword ngxDirectiveThirdParty contained enhanced_memcached_send_timeout -syn keyword ngxDirectiveThirdParty contained enhanced_memcached_stats - -" nginx max connections queue -" https://github.com/ezmobius/nginx-ey-balancer -syn keyword ngxDirectiveThirdParty contained max_connections_max_queue_length -syn keyword ngxDirectiveThirdParty contained max_connections_queue_timeout - -" Nginx module for POST authentication and authorization -" https://github.com/veruu/ngx_form_auth -syn keyword ngxDirectiveThirdParty contained form_auth -syn keyword ngxDirectiveThirdParty contained form_auth_login -syn keyword ngxDirectiveThirdParty contained form_auth_pam_service -syn keyword ngxDirectiveThirdParty contained form_auth_password -syn keyword ngxDirectiveThirdParty contained form_auth_remote_user - -" ngx_http_accounting_module -" https://github.com/Lax/ngx_http_accounting_module -syn keyword ngxDirectiveThirdParty contained accounting -syn keyword ngxDirectiveThirdParty contained accounting_id -syn keyword ngxDirectiveThirdParty contained accounting_interval -syn keyword ngxDirectiveThirdParty contained accounting_log -syn keyword ngxDirectiveThirdParty contained accounting_perturb - -" concatenating files in a given context: CSS and JS files usually -" https://github.com/alibaba/nginx-http-concat -syn keyword ngxDirectiveThirdParty contained concat -syn keyword ngxDirectiveThirdParty contained concat_delimiter -syn keyword ngxDirectiveThirdParty contained concat_ignore_file_error -syn keyword ngxDirectiveThirdParty contained concat_max_files -syn keyword ngxDirectiveThirdParty contained concat_types -syn keyword ngxDirectiveThirdParty contained concat_unique - -" update upstreams' config by restful interface -" https://github.com/yzprofile/ngx_http_dyups_module -syn keyword ngxDirectiveThirdParty contained dyups_interface -syn keyword ngxDirectiveThirdParty contained dyups_shm_zone_size - -" add given content to the end of the response according to the condition specified -" https://github.com/flygoast/ngx_http_footer_if_filter -syn keyword ngxDirectiveThirdParty contained footer_if - -" NGINX HTTP Internal Redirect Module -" https://github.com/flygoast/ngx_http_internal_redirect -syn keyword ngxDirectiveThirdParty contained internal_redirect_if -syn keyword ngxDirectiveThirdParty contained internal_redirect_if_no_postpone - -" nginx-ip-blocker -" https://github.com/tmthrgd/nginx-ip-blocker -syn keyword ngxDirectiveThirdParty contained ip_blocker - -" IP2Location Nginx -" https://github.com/chrislim2888/ip2location-nginx -syn keyword ngxDirectiveThirdParty contained ip2location_database - -" Limit upload rate -" https://github.com/cfsego/limit_upload_rate -syn keyword ngxDirectiveThirdParty contained limit_upload_rate -syn keyword ngxDirectiveThirdParty contained limit_upload_rate_after -syn keyword ngxDirectiveThirdParty contained limit_upload_rate_log_level - -" limit the number of connections to upstream -" https://github.com/cfsego/nginx-limit-upstream -syn keyword ngxDirectiveThirdParty contained limit_upstream_conn -syn keyword ngxDirectiveThirdParty contained limit_upstream_log_level -syn keyword ngxDirectiveThirdParty contained limit_upstream_zone - -" conditional accesslog for nginx -" https://github.com/cfsego/ngx_log_if -syn keyword ngxDirectiveThirdParty contained access_log_bypass_if - -" log messages over ZeroMQ -" https://github.com/alticelabs/nginx-log-zmq -syn keyword ngxDirectiveThirdParty contained log_zmq_endpoint -syn keyword ngxDirectiveThirdParty contained log_zmq_format -syn keyword ngxDirectiveThirdParty contained log_zmq_off -syn keyword ngxDirectiveThirdParty contained log_zmq_server - -" simple module to uppercase/lowercase strings in the nginx config -" https://github.com/replay/ngx_http_lower_upper_case -syn keyword ngxDirectiveThirdParty contained lower -syn keyword ngxDirectiveThirdParty contained upper - -" content filter for nginx, which returns the md5 hash of the content otherwise returned -" https://github.com/kainswor/nginx_md5_filter -syn keyword ngxDirectiveThirdParty contained md5_filter - -" Non-blocking upstream module for Nginx to connect to MongoDB -" https://github.com/simpl/ngx_mongo -syn keyword ngxDirectiveThirdParty contained mongo_auth -syn keyword ngxDirectiveThirdParty contained mongo_bind -syn keyword ngxDirectiveThirdParty contained mongo_buffer_size -syn keyword ngxDirectiveThirdParty contained mongo_buffering -syn keyword ngxDirectiveThirdParty contained mongo_buffers -syn keyword ngxDirectiveThirdParty contained mongo_busy_buffers_size -syn keyword ngxDirectiveThirdParty contained mongo_connect_timeout -syn keyword ngxDirectiveThirdParty contained mongo_json -syn keyword ngxDirectiveThirdParty contained mongo_next_upstream -syn keyword ngxDirectiveThirdParty contained mongo_pass -syn keyword ngxDirectiveThirdParty contained mongo_query -syn keyword ngxDirectiveThirdParty contained mongo_read_timeout -syn keyword ngxDirectiveThirdParty contained mongo_send_timeout - -" Nginx OCSP processing module designed for response caching -" https://github.com/kyprizel/nginx_ocsp_proxy-module -syn keyword ngxDirectiveThirdParty contained ocsp_cache_timeout -syn keyword ngxDirectiveThirdParty contained ocsp_proxy - -" Nginx OpenSSL version check at startup -" https://github.com/apcera/nginx-openssl-version -syn keyword ngxDirectiveThirdParty contained openssl_builddate_minimum -syn keyword ngxDirectiveThirdParty contained openssl_version_minimum - -" Automatic PageSpeed optimization module for Nginx -" https://github.com/pagespeed/ngx_pagespeed -syn keyword ngxDirectiveThirdParty contained pagespeed - -" PECL Memcache standard hashing compatible loadbalancer for Nginx -" https://github.com/replay/ngx_http_php_memcache_standard_balancer -syn keyword ngxDirectiveThirdParty contained hash_key - -" nginx module to parse php sessions -" https://github.com/replay/ngx_http_php_session -syn keyword ngxDirectiveThirdParty contained php_session_parse -syn keyword ngxDirectiveThirdParty contained php_session_strip_formatting - -" Nginx HTTP rDNS module -" https://github.com/flant/nginx-http-rdns -syn keyword ngxDirectiveThirdParty contained rdns -syn keyword ngxDirectiveThirdParty contained rdns_allow -syn keyword ngxDirectiveThirdParty contained rdns_deny - -" Streaming regular expression replacement in response bodies -" https://github.com/openresty/replace-filter-nginx-module -syn keyword ngxDirectiveThirdParty contained replace_filter -syn keyword ngxDirectiveThirdParty contained replace_filter_last_modified -syn keyword ngxDirectiveThirdParty contained replace_filter_max_buffered_size -syn keyword ngxDirectiveThirdParty contained replace_filter_skip -syn keyword ngxDirectiveThirdParty contained replace_filter_types - -" Link RRDtool's graphing facilities directly into nginx -" https://github.com/evanmiller/mod_rrd_graph -syn keyword ngxDirectiveThirdParty contained rrd_graph -syn keyword ngxDirectiveThirdParty contained rrd_graph_root - -" Module for nginx to proxy rtmp using http protocol -" https://github.com/kwojtek/nginx-rtmpt-proxy-module -syn keyword ngxDirectiveThirdParty contained rtmpt_proxy -syn keyword ngxDirectiveThirdParty contained rtmpt_proxy_http_timeout -syn keyword ngxDirectiveThirdParty contained rtmpt_proxy_rtmp_timeout -syn keyword ngxDirectiveThirdParty contained rtmpt_proxy_stat -syn keyword ngxDirectiveThirdParty contained rtmpt_proxy_stylesheet -syn keyword ngxDirectiveThirdParty contained rtmpt_proxy_target - -" Syntactically Awesome NGINX Module -" https://github.com/mneudert/sass-nginx-module -syn keyword ngxDirectiveThirdParty contained sass_compile -syn keyword ngxDirectiveThirdParty contained sass_error_log -syn keyword ngxDirectiveThirdParty contained sass_include_path -syn keyword ngxDirectiveThirdParty contained sass_indent -syn keyword ngxDirectiveThirdParty contained sass_is_indented_syntax -syn keyword ngxDirectiveThirdParty contained sass_linefeed -syn keyword ngxDirectiveThirdParty contained sass_output_style -syn keyword ngxDirectiveThirdParty contained sass_precision -syn keyword ngxDirectiveThirdParty contained sass_source_comments -syn keyword ngxDirectiveThirdParty contained sass_source_map_embed - -" Nginx Selective Cache Purge Module -" https://github.com/wandenberg/nginx-selective-cache-purge-module -syn keyword ngxDirectiveThirdParty contained selective_cache_purge_query -syn keyword ngxDirectiveThirdParty contained selective_cache_purge_redis_database -syn keyword ngxDirectiveThirdParty contained selective_cache_purge_redis_host -syn keyword ngxDirectiveThirdParty contained selective_cache_purge_redis_password -syn keyword ngxDirectiveThirdParty contained selective_cache_purge_redis_port -syn keyword ngxDirectiveThirdParty contained selective_cache_purge_redis_unix_socket - -" cconv nginx module -" https://github.com/liseen/set-cconv-nginx-module -syn keyword ngxDirectiveThirdParty contained set_cconv_to_simp -syn keyword ngxDirectiveThirdParty contained set_cconv_to_trad -syn keyword ngxDirectiveThirdParty contained set_pinyin_to_normal - -" Nginx module that allows the setting of variables to the value of a variety of hashes -" https://github.com/simpl/ngx_http_set_hash -syn keyword ngxDirectiveThirdParty contained set_md5 -syn keyword ngxDirectiveThirdParty contained set_md5_upper -syn keyword ngxDirectiveThirdParty contained set_murmur2 -syn keyword ngxDirectiveThirdParty contained set_murmur2_upper -syn keyword ngxDirectiveThirdParty contained set_sha1 -syn keyword ngxDirectiveThirdParty contained set_sha1_upper - -" Nginx module to set the language of a request based on a number of options -" https://github.com/simpl/ngx_http_set_lang -syn keyword ngxDirectiveThirdParty contained lang_cookie -syn keyword ngxDirectiveThirdParty contained lang_get_var -syn keyword ngxDirectiveThirdParty contained lang_host -syn keyword ngxDirectiveThirdParty contained lang_list -syn keyword ngxDirectiveThirdParty contained lang_post_var -syn keyword ngxDirectiveThirdParty contained lang_referer -syn keyword ngxDirectiveThirdParty contained set_lang -syn keyword ngxDirectiveThirdParty contained set_lang_method - -" Nginx Sorted Querystring Module -" https://github.com/wandenberg/nginx-sorted-querystring-module -syn keyword ngxDirectiveThirdParty contained sorted_querysting_filter_parameter - -" Nginx upstream module for Sphinx 2.x search daemon -" https://github.com/reeteshranjan/sphinx2-nginx-module -syn keyword ngxDirectiveThirdParty contained sphinx2_bind -syn keyword ngxDirectiveThirdParty contained sphinx2_buffer_size -syn keyword ngxDirectiveThirdParty contained sphinx2_connect_timeout -syn keyword ngxDirectiveThirdParty contained sphinx2_next_upstream -syn keyword ngxDirectiveThirdParty contained sphinx2_pass -syn keyword ngxDirectiveThirdParty contained sphinx2_read_timeout -syn keyword ngxDirectiveThirdParty contained sphinx2_send_timeout - -" Nginx module for retrieving user attributes and groups from SSSD -" https://github.com/veruu/ngx_sssd_info -syn keyword ngxDirectiveThirdParty contained sssd_info -syn keyword ngxDirectiveThirdParty contained sssd_info_attribute -syn keyword ngxDirectiveThirdParty contained sssd_info_attribute_separator -syn keyword ngxDirectiveThirdParty contained sssd_info_attributes -syn keyword ngxDirectiveThirdParty contained sssd_info_group -syn keyword ngxDirectiveThirdParty contained sssd_info_group_separator -syn keyword ngxDirectiveThirdParty contained sssd_info_groups -syn keyword ngxDirectiveThirdParty contained sssd_info_output_to - -" An nginx module for sending statistics to statsd -" https://github.com/zebrafishlabs/nginx-statsd -syn keyword ngxDirectiveThirdParty contained statsd_count -syn keyword ngxDirectiveThirdParty contained statsd_sample_rate -syn keyword ngxDirectiveThirdParty contained statsd_server -syn keyword ngxDirectiveThirdParty contained statsd_timing - -" ngx_stream_echo - TCP/stream echo module for NGINX (a port of the ngx_http_echo module) -" https://github.com/openresty/stream-echo-nginx-module -syn keyword ngxDirectiveThirdParty contained echo -syn keyword ngxDirectiveThirdParty contained echo_client_error_log_level -syn keyword ngxDirectiveThirdParty contained echo_discard_request -syn keyword ngxDirectiveThirdParty contained echo_duplicate -syn keyword ngxDirectiveThirdParty contained echo_flush_wait -syn keyword ngxDirectiveThirdParty contained echo_lingering_close -syn keyword ngxDirectiveThirdParty contained echo_lingering_time -syn keyword ngxDirectiveThirdParty contained echo_lingering_timeout -syn keyword ngxDirectiveThirdParty contained echo_read_buffer_size -syn keyword ngxDirectiveThirdParty contained echo_read_bytes -syn keyword ngxDirectiveThirdParty contained echo_read_line -syn keyword ngxDirectiveThirdParty contained echo_read_timeout -syn keyword ngxDirectiveThirdParty contained echo_request_data -syn keyword ngxDirectiveThirdParty contained echo_send_timeout -syn keyword ngxDirectiveThirdParty contained echo_sleep - -" Embed the power of Lua into NGINX TCP/UDP servers -" https://github.com/openresty/stream-lua-nginx-module -syn keyword ngxDirectiveThirdParty contained lua_add_variable -syn keyword ngxDirectiveThirdParty contained preread_by_lua_block -syn keyword ngxDirectiveThirdParty contained preread_by_lua_file -syn keyword ngxDirectiveThirdParty contained preread_by_lua_no_postpone - -" nginx-upsync-module -" https://github.com/weibocom/nginx-upsync-module -syn keyword ngxDirectiveThirdParty contained upstream_show -syn keyword ngxDirectiveThirdParty contained upsync -syn keyword ngxDirectiveThirdParty contained upsync_dump_path -syn keyword ngxDirectiveThirdParty contained upsync_lb - -" Whitespace stripper for nginx -" https://github.com/evanmiller/mod_strip -syn keyword ngxDirectiveThirdParty contained strip - -" Split one big HTTP/Range request to multiple subrange requesets -" https://github.com/Qihoo360/ngx_http_subrange_module -syn keyword ngxDirectiveThirdParty contained subrange - -" summarizer-nginx-module -" https://github.com/reeteshranjan/summarizer-nginx-module -syn keyword ngxDirectiveThirdParty contained summarizer_bind -syn keyword ngxDirectiveThirdParty contained summarizer_buffer_size -syn keyword ngxDirectiveThirdParty contained summarizer_connect_timeout -syn keyword ngxDirectiveThirdParty contained summarizer_next_upstream -syn keyword ngxDirectiveThirdParty contained summarizer_pass -syn keyword ngxDirectiveThirdParty contained summarizer_read_timeout -syn keyword ngxDirectiveThirdParty contained summarizer_send_timeout - -" nginx module providing API to communicate with supervisord and manage (start/stop) backends on-demand -" https://github.com/FRiCKLE/ngx_supervisord -syn keyword ngxDirectiveThirdParty contained supervisord -syn keyword ngxDirectiveThirdParty contained supervisord_inherit_backend_status -syn keyword ngxDirectiveThirdParty contained supervisord_name -syn keyword ngxDirectiveThirdParty contained supervisord_start -syn keyword ngxDirectiveThirdParty contained supervisord_stop - -" simple robot mitigation module using cookie based challenge/response technique. Not supported any more. -" https://github.com/kyprizel/testcookie-nginx-module -syn keyword ngxDirectiveThirdParty contained testcookie -syn keyword ngxDirectiveThirdParty contained testcookie_arg -syn keyword ngxDirectiveThirdParty contained testcookie_deny_keepalive -syn keyword ngxDirectiveThirdParty contained testcookie_domain -syn keyword ngxDirectiveThirdParty contained testcookie_expires -syn keyword ngxDirectiveThirdParty contained testcookie_fallback -syn keyword ngxDirectiveThirdParty contained testcookie_get_only -syn keyword ngxDirectiveThirdParty contained testcookie_httponly_flag -syn keyword ngxDirectiveThirdParty contained testcookie_https_location -syn keyword ngxDirectiveThirdParty contained testcookie_internal -syn keyword ngxDirectiveThirdParty contained testcookie_max_attempts -syn keyword ngxDirectiveThirdParty contained testcookie_name -syn keyword ngxDirectiveThirdParty contained testcookie_p3p -syn keyword ngxDirectiveThirdParty contained testcookie_pass -syn keyword ngxDirectiveThirdParty contained testcookie_path -syn keyword ngxDirectiveThirdParty contained testcookie_port_in_redirect -syn keyword ngxDirectiveThirdParty contained testcookie_redirect_via_refresh -syn keyword ngxDirectiveThirdParty contained testcookie_refresh_encrypt_cookie -syn keyword ngxDirectiveThirdParty contained testcookie_refresh_encrypt_cookie_iv -syn keyword ngxDirectiveThirdParty contained testcookie_refresh_encrypt_cookie_key -syn keyword ngxDirectiveThirdParty contained testcookie_refresh_status -syn keyword ngxDirectiveThirdParty contained testcookie_refresh_template -syn keyword ngxDirectiveThirdParty contained testcookie_samesite -syn keyword ngxDirectiveThirdParty contained testcookie_secret -syn keyword ngxDirectiveThirdParty contained testcookie_secure_flag -syn keyword ngxDirectiveThirdParty contained testcookie_session -syn keyword ngxDirectiveThirdParty contained testcookie_whitelist - -" ngx_http_types_filter_module -" https://github.com/flygoast/ngx_http_types_filter -syn keyword ngxDirectiveThirdParty contained types_filter -syn keyword ngxDirectiveThirdParty contained types_filter_use_default - -" A module allowing the nginx to use files embedded in a zip file -" https://github.com/youzee/nginx-unzip-module -syn keyword ngxDirectiveThirdParty contained file_in_unzip -syn keyword ngxDirectiveThirdParty contained file_in_unzip_archivefile -syn keyword ngxDirectiveThirdParty contained file_in_unzip_extract - -" An asynchronous domain name resolve module for nginx upstream -" https://github.com/wdaike/ngx_upstream_jdomain -syn keyword ngxDirectiveThirdParty contained jdomain - -" Nginx url encoding converting module -" https://github.com/vozlt/nginx-module-url -syn keyword ngxDirectiveThirdParty contained url_encoding_convert -syn keyword ngxDirectiveThirdParty contained url_encoding_convert_alloc_size -syn keyword ngxDirectiveThirdParty contained url_encoding_convert_alloc_size_x -syn keyword ngxDirectiveThirdParty contained url_encoding_convert_from -syn keyword ngxDirectiveThirdParty contained url_encoding_convert_phase -syn keyword ngxDirectiveThirdParty contained url_encoding_convert_to - -" A nginx module to match browsers and crawlers -" https://github.com/alibaba/nginx-http-user-agent -syn keyword ngxDirectiveThirdParty contained user_agent - -" nginx load-balancer module implementing ketama consistent hashing -" https://github.com/flygoast/ngx_http_upstream_ketama_chash -syn keyword ngxDirectiveThirdParty contained ketama_chash - -" nginx-sticky-module-ng -" https://github.com/ayty-adrianomartins/nginx-sticky-module-ng -syn keyword ngxDirectiveThirdParty contained sticky_no_fallback - -" dynamic linking and call the function of your application -" https://github.com/Taymindis/nginx-link-function -syn keyword ngxDirectiveThirdParty contained ngx_link_func_add_prop -syn keyword ngxDirectiveThirdParty contained ngx_link_func_add_req_header -syn keyword ngxDirectiveThirdParty contained ngx_link_func_ca_cert -syn keyword ngxDirectiveThirdParty contained ngx_link_func_call -syn keyword ngxDirectiveThirdParty contained ngx_link_func_download_link_lib -syn keyword ngxDirectiveThirdParty contained ngx_link_func_lib -syn keyword ngxDirectiveThirdParty contained ngx_link_func_shm_size -syn keyword ngxDirectiveThirdParty contained ngx_link_func_subrequest - -" purge content from FastCGI, proxy, SCGI and uWSGI caches -" https://github.com/torden/ngx_cache_purge -syn keyword ngxDirectiveThirdParty contained cache_purge_response_type - -" set the flags "HttpOnly", "secure" and "SameSite" for cookies -" https://github.com/AirisX/nginx_cookie_flag_module -syn keyword ngxDirectiveThirdParty contained set_cookie_flag - -" Embed websockify into Nginx (convert any tcp connection into websocket) " https://github.com/tg123/websockify-nginx-module syn keyword ngxDirectiveThirdParty contained websockify_buffer_size syn keyword ngxDirectiveThirdParty contained websockify_connect_timeout @@ -2415,54 +1941,13 @@ syn keyword ngxDirectiveThirdParty contained websockify_pass syn keyword ngxDirectiveThirdParty contained websockify_read_timeout syn keyword ngxDirectiveThirdParty contained websockify_send_timeout -" IP2Location Nginx -" https://github.com/ip2location/ip2location-nginx -syn keyword ngxDirectiveThirdParty contained ip2location_addresstype -syn keyword ngxDirectiveThirdParty contained ip2location_areacode -syn keyword ngxDirectiveThirdParty contained ip2location_category -syn keyword ngxDirectiveThirdParty contained ip2location_city -syn keyword ngxDirectiveThirdParty contained ip2location_country_long -syn keyword ngxDirectiveThirdParty contained ip2location_country_short -syn keyword ngxDirectiveThirdParty contained ip2location_domain -syn keyword ngxDirectiveThirdParty contained ip2location_elevation -syn keyword ngxDirectiveThirdParty contained ip2location_iddcode -syn keyword ngxDirectiveThirdParty contained ip2location_isp -syn keyword ngxDirectiveThirdParty contained ip2location_latitude -syn keyword ngxDirectiveThirdParty contained ip2location_longitude -syn keyword ngxDirectiveThirdParty contained ip2location_mcc -syn keyword ngxDirectiveThirdParty contained ip2location_mnc -syn keyword ngxDirectiveThirdParty contained ip2location_mobilebrand -syn keyword ngxDirectiveThirdParty contained ip2location_netspeed -syn keyword ngxDirectiveThirdParty contained ip2location_proxy -syn keyword ngxDirectiveThirdParty contained ip2location_proxy_recursive -syn keyword ngxDirectiveThirdParty contained ip2location_region -syn keyword ngxDirectiveThirdParty contained ip2location_timezone -syn keyword ngxDirectiveThirdParty contained ip2location_usagetype -syn keyword ngxDirectiveThirdParty contained ip2location_weatherstationcode -syn keyword ngxDirectiveThirdParty contained ip2location_weatherstationname -syn keyword ngxDirectiveThirdParty contained ip2location_zipcode - -" IP2Proxy module for Nginx -" https://github.com/ip2location/ip2proxy-nginx -syn keyword ngxDirectiveThirdParty contained ip2proxy_as -syn keyword ngxDirectiveThirdParty contained ip2proxy_asn -syn keyword ngxDirectiveThirdParty contained ip2proxy_city -syn keyword ngxDirectiveThirdParty contained ip2proxy_country_long -syn keyword ngxDirectiveThirdParty contained ip2proxy_country_short -syn keyword ngxDirectiveThirdParty contained ip2proxy_database -syn keyword ngxDirectiveThirdParty contained ip2proxy_domain -syn keyword ngxDirectiveThirdParty contained ip2proxy_isp -syn keyword ngxDirectiveThirdParty contained ip2proxy_is_proxy -syn keyword ngxDirectiveThirdParty contained ip2proxy_last_seen -syn keyword ngxDirectiveThirdParty contained ip2proxy_provider -syn keyword ngxDirectiveThirdParty contained ip2proxy_proxy -syn keyword ngxDirectiveThirdParty contained ip2proxy_proxy_recursive -syn keyword ngxDirectiveThirdParty contained ip2proxy_proxy_type -syn keyword ngxDirectiveThirdParty contained ip2proxy_region -syn keyword ngxDirectiveThirdParty contained ip2proxy_threat -syn keyword ngxDirectiveThirdParty contained ip2proxy_usage_type - - +" https://github.com/vozlt/nginx-module-sts +syn keyword ngxDirectiveThirdParty contained stream_server_traffic_status +syn keyword ngxDirectiveThirdParty contained stream_server_traffic_status_average_method +syn keyword ngxDirectiveThirdParty contained stream_server_traffic_status_display +syn keyword ngxDirectiveThirdParty contained stream_server_traffic_status_display_format +syn keyword ngxDirectiveThirdParty contained stream_server_traffic_status_display_jsonp +syn keyword ngxDirectiveThirdParty contained stream_server_traffic_status_zone " highlight diff --git a/debian/README.Packaging b/debian/README.source similarity index 68% rename from debian/README.Packaging rename to debian/README.source index 47a582f..dc71efa 100644 --- a/debian/README.Packaging +++ b/debian/README.source @@ -1,8 +1,7 @@ Debian Packaging ================ -We use git-buildpackage for packaging. Our repository can be found at -git.debian.org:/git/collab-maint/nginx.git. +We use git-buildpackage for packaging. Workflow for Unstable ===================== @@ -14,15 +13,9 @@ Dynamic Modules Since v1.9.11 Nginx added dynamic module support. This will sanitize the nginx packaging flow in the long term, but there is a lot work to be done -in order to get there. We will gradually convert all modules to dynamic +in order to get there. We gradually convert all modules to dynamic as they add support for it. -Currently nginx modules need to be build together with nginx, but this -will be fixed upstream [0]. Since we already ship 3rd party modules under -debian/modules/ we will start shipping module packages (libnginx-mod) from -the same source. Once upstream implements separated building we will -split each module to a separate source. - [0] https://www.nginx.com/blog/dynamic-modules-nginx-1-9-11/ Workflow for Experimental @@ -34,7 +27,7 @@ as they lack security support. The workflow we use is based on the assumption that packaging work happens on origin/master and experimental builds are a trivial patch away from that. -The direct consequense of treating experimental as a patchset for origin/master +The direct consequence of treating experimental as a patchset for origin/master is that the relevant branches are forced-pushed whenever we release a new 1.11.x version. In other words, **it is not safe to base your work on the experimental branch**. @@ -67,11 +60,4 @@ them. Older 1.11.x releases are not referenced by any branch, but they can be found by the relevant debian/* tag. -3rd party experimental workflow -=============================== - -As we described, it is better not base you work on our forced-pushed -experimental branch. A better approach would be to maintain a custom-build -branch that is rebased to our latest experimental branch (basically git rebase ---onto the relevant commits should work). diff --git a/debian/changelog b/debian/changelog index 3bcf095..8ec0edd 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,4 +1,246 @@ -nginx (1.22.1-2~exp2) UNRELEASED; urgency=medium +nginx (1.26.3-3) unstable; urgency=medium + + [ Jan Mojžíš ] + * d/changelog: fix whitespace in 1.26.3-2 record + * d/control: add libnginx-mod-http-lua dependency for nginx-extras package + for riscv64 platform + + [ Thomas Ward ] + * d/nginx-common.nginx.service: Add ConditionFileIsExecutable to + SystemD service file, prevents starting of service if nginx is + not installed (which can happen if nginx-common is installed + independently from `nginx` itself (Closes: #1098477) + + -- Jan Mojžíš Thu, 15 May 2025 15:31:38 +0200 + +nginx (1.26.3-2) unstable; urgency=medium + + * Team upload + * Upload to unstable + + -- Jérémy Lal Fri, 07 Feb 2025 12:53:11 +0100 + +nginx (1.26.3-1) experimental; urgency=medium + + * Team upload + * New upstream version 1.26.3 + + -- Jérémy Lal Wed, 05 Feb 2025 19:08:02 +0100 + +nginx (1.26.2-1) experimental; urgency=medium + + * Team upload + * New upstream version 1.26.2 + * Add Sergey Kandaurov pgp public key + * Drop upstream patches + + [ Jan Mojžíš ] + * d/gbp.conf: add upstream-signatures = on + * d/{control,copyright}: update my email to "janmojzis@debian.org" + * d/copyright: bump my copyright year + + -- Jérémy Lal Sun, 02 Feb 2025 21:08:45 +0100 + +nginx (1.26.0-3) unstable; urgency=medium + + * d/control: Resolve dependency loop between nginx and nginx-common. + (Fixes: #1082373) + + -- Thomas Ward Fri, 20 Sep 2024 21:35:42 -0400 + +nginx (1.26.0-2) unstable; urgency=medium + + [ Jan Mojžíš ] + * d/rules: enable QUIC and HTTP/3 module (Closes: 1070488) + * d/control: bump Standards-Version: 4.7.0, no changes + * d/p/nginx-1.26.1.patch add, backport changes from the nginx 1.26.1 and fix + CVE-2024-32760, CVE-2024-31079, CVE-2024-35200, CVE-2024-34161 + * d/p/CVE-2024-7347.patch add, backport CVE-2024-7347 fix (Closes: 1078971) + * d/libnginx-mod.abisubstvars updated comment when ABI needs to be changed + + [ Thomas Ward ] + * d/conf/nginx.conf: Update default options for current security + practices and standards. SSL protos, disable prefer server + ciphers, hide server tokens/versions in responses. + + -- Jan Mojžíš Mon, 19 Aug 2024 18:46:30 +0200 + +nginx (1.26.0-1) unstable; urgency=medium + + * New upstream version 1.26.0 + * nginx ABI release: nginx-abi-1.26.0-1 (Closes: 1069997) + * d/libnginx-mod.abisubstvars: remove third-party modules version constraints + * d/u/signing-key.asc add Roman Arutyunyan’s PGP public key, + the key is used to sign the 1.26.0 release + * d/p/CVE-2023-44487.patch remove, fixed in upstream + * d/ufw/nginx update, add QUICK, thanks Marcus Bointon + * d/conf/mime.types add application/xslt+xml, thanks K. Widholm + * d/copyright: updated copyright related to new upstream version + * d/copyright: bump my copyright year + * d/conf/nginx.conf: add worker_cpu_affinity auto (Closes: 1063659) + * d/gbp.conf: add sign-tags = True, [pull] track-missing = True, + [import-orig] merge-mode = replace + + -- Jan Mojžíš Sun, 05 May 2024 18:48:05 +0200 + +nginx (1.24.0-2) unstable; urgency=medium + + * d/control added dependency nginx-common to nginx (Closes: 1039905) + After nginx installation, the nginx-common package is installed + automatically due to its dependencies. The nginx-common package includes + the systemd unit, which becomes enabled and activated upon installation. + When the nginx is removed, nginx-common package and the systemd unit will + remain in the system. Adding a dependency nginx-common to nginx solves + this problem. + * d/control fixed binNMU safe dependency declaration nginx to nginx-common, + nginx is 'any', nginx-common is 'all' -> dependency '= ${source:Version}' + * d/rules removed override_dh_strip, migration to automatic debug symbols is + already done, fixes debug-symbol-migration-possibly-complete lint. warning + * d/po/ro.po added Romanian debconf translation. (Closes: 1033084), + Thanks to Remus-Gabriel Chelu + * d/po/sv.po added Swedish debconf translation. (Closes: 1050443), + Thanks to Peter Kvillegård + * d/conf/mime.types added video/ogg, video/x-matroska (Closes: 1028144) + * d/p/CVE-2023-44487.patch adds additional mitigations for CVE-2023-44487 + that according to NGINX developers on nginx-devel are already suitably + mitigated with the default config options for keepalive. (Closes: 1053770) + * d/control added nginx-dev dependency on ${nginx:abi} + * d/debhelper/nginx_mod.pm automatic libnginx-mod-stream dependencies + + -- Jan Mojžíš Wed, 11 Oct 2023 01:17:51 +0200 + +nginx (1.24.0-1) unstable; urgency=medium + + * New upstream version 1.24.0 + * nginx ABI release: nginx-abi-1.24.0-1 + * d/libnginx-mod.abisubstvars update version constraints of the 3rd party + modules + * d/p/bug-{1024605,973861}.patch removed, fixed in upstream + * d/copyright: updated copyright for files src/event/ngx_event_udp.h, + src/os/win32/ngx_dlopen + + -- Jan Mojžíš Tue, 27 Jun 2023 23:19:31 +0200 + +nginx (1.22.1-9) unstable; urgency=medium + + * d/control: nginx-common Breaks+Replaces: nginx (<< 1.22.1-8) + (Closes: 1032929) + + -- Jan Mojžíš Tue, 14 Mar 2023 16:19:32 +0100 + +nginx (1.22.1-8) unstable; urgency=medium + + * Main change: + Configuration files returned to nginx-common package. This fixes + the serious problem of losing configuration files during upgrade. + This is a rollback of a change made in 1.22.1-6 (Closes: 1032517) + * d/control: fix nginx-full dependencies + * d/libnginx-mod.abisubstvars: update libnginx-mod-http-lua version + + -- Jan Mojžíš Tue, 14 Mar 2023 06:53:32 +0100 + +nginx (1.22.1-7) unstable; urgency=medium + + * nginx ABI release: nginx-abi-1.22.1-7 + * nginx ABI: Nginx now provides nginx-abi- to better manage + dependencies between nginx and 3rd party modules. Credit to Jérémy Lal. + * switched to libpcre2 (Closes: 1000013) + * d/p/bug-973861: added, lingering close for connections with pipelined + requests. The patch is backported from the upstream. (Closes: 973861) + * d/gbb.conf: switched to debian branch main (debian-branch = main) + * d/copyright: updated to be compatible with 'cme update dpkg-copyright' + + -- Jan Mojžíš Mon, 13 Feb 2023 13:04:16 +0100 + +nginx (1.22.1-6) unstable; urgency=medium + + * Main change: + Nginx binary moved to package nginx, also moved basic + configuration files from nginx-common to package nginx. + The packages nginx-{light,core,extras,common} are replaced + by a metapackage. (Closes: 1025763) + Users should simply install 'nginx' and 'libnginx-mod-...' + instead of these packages. + * Additional changes: + * d/nginx-{light,core,extras,full,common}.NEWS: added warning that + nginx-{light,core,extras,full,common} are deprecated + * d/control: fixed dependencies for safe binNMU + * d/copyright: updated debian/* copyright + * d/copyright: added missing copyright for d/apport/* + * d/copyright: added missing GPL-2+ copyright for d/debhelper/dh_nginx + * d/copyright: added missing copyright for d/help/examples/nginx_modsite + * d/po/it.po: added Italian debconf translation. (Closes: 1019160) + * d/control: removed dependency on obsolete package lsb-base + * d/control: bump Standards-Version: 4.6.2, no changes + + -- Jan Mojžíš Wed, 08 Feb 2023 17:20:27 +0100 + +nginx (1.22.1-5) unstable; urgency=medium + + [ Jan Mojžíš ] + * Since version 1.22.1-5 all third party modules are removed from Debian NGINX + package and all these modules are maintained in separate external packages. + Removed namely these remaining modules: + - libnginx-mod-http-geoip2 + - libnginx-mod-stream-geoip2 + - libnginx-mod-http-auth-pam + - libnginx-mod-http-echo + - libnginx-mod-http-upstream-fair + - libnginx-mod-http-headers-more-filter + - libnginx-mod-http-cache-purge + - libnginx-mod-http-fancyindex + - libnginx-mod-http-uploadprogress + - libnginx-mod-http-subs-filter + - libnginx-mod-http-dav-ext + * d/tests: all *-simple and *-deps tests updated to check if nginx works + after installation/reload/restart for all flavours + * d/control: updated nginx-common dependency, fixes lintian warning + maybe-not-arch-all-binnmuable + + [ Jérémy Lal ] + * d/rules: default error-log-path is stderr (--error-log-path=stderr) + instead of hardcoded /var/log/nginx/error.log (Closes: 1025858) + * dh nginx: auto-detect build-dependency on ndk-dev + * dh nginx: absolute /usr/sbin/nginx path for nginx tests + * d/p/nginx-ssl_cert_cb_yield.patch SSL_CTX_set_cert_cb() callback yielding + patch update + * d/conf/nginx.conf: Set global error_log to /var/log/error.log + Now that error_log default value is stderr, it is possible + to override that config using nginx -g 'error_log stderr;' + + [ Miao Wang ] + * d/control: removed unnecessary dependencies after removing 3rd party modules + * d/rules: enabled stream_realip_module (--with-stream_realip_module) + * d/rules: explicitly disabled pcre2 (--without-pcre2) + + -- Jan Mojžíš Tue, 20 Dec 2022 10:36:19 +0100 + +nginx (1.22.1-4) unstable; urgency=medium + + * d/t/*-module-deps: updated, added curl timeout 300 seconds and + added nginx restart before calling curl + * d/t/*-module-deps: update: + - added tests for new ext. module libnginx-mod-http-set-misc + - added tests for new ext. module libnginx-mod-http-brotli-filter + - added tests for new ext. module libnginx-mod-http-brotli-static + - added tests for new ext. module libnginx-mod-http-memc + - added tests for new ext. module libnginx-mod-http-srcache-filter + * removed 3th party modules and moved to separate packages: + - libnginx-mod-nchan module + - libnginx-mod-rtmp module + - libnginx-mod-http-ndk module + + -- Jan Mojžíš Thu, 08 Dec 2022 14:15:15 +0100 + +nginx (1.22.1-3) unstable; urgency=medium + + * d/control: added Multi-Arch: foreign for package nginx-dev + * d/rules: enabled NDK upstream list module NDK_UPSTREAM_LIST + * d/p/bug-1024605.patch: added header Forwarded: not-needed + + -- Jan Mojžíš Mon, 05 Dec 2022 18:25:16 +0100 + +nginx (1.22.1-2) unstable; urgency=medium [ Jan Mojžíš ] * d/control: fixed spelling-error-in-description @@ -8,14 +250,21 @@ nginx (1.22.1-2~exp2) UNRELEASED; urgency=medium * d/p/bug-1024605.patch added: fixes problem when a subrequest has SSI enabled but its main request does not, the SSI module may crash the worker due to NULL-pointer dereference. The patch is backported from the upstream + (Closes: 1024605) * d/control: updated implicit dependencies of third-party modules for easier transition to third-party modules in separate packages. [ Jérémy Lal ] * d/debhelper: set nginx_mod buildsystem by default * d/control: nginx-dev provides dh-sequence-nginx (Closes: #1024879) + * d/control: remove Uploaders that are part of nginx-team, + keep only the most recent active one, per policy 5.6.3. - -- Jan Mojžíš Sun, 27 Nov 2022 16:12:17 +0100 + [ Debian Janitor ] + * Remove constraints unnecessary since buster (oldstable): + + nginx-dev: Drop versioned constraint on dpkg-dev in Depends. + + -- Jan Mojžíš Wed, 30 Nov 2022 17:39:42 +0100 nginx (1.22.1-1) unstable; urgency=medium diff --git a/debian/conf/mime.types b/debian/conf/mime.types index 692b16c..cf968c0 100644 --- a/debian/conf/mime.types +++ b/debian/conf/mime.types @@ -1,96 +1,101 @@ - types { - text/html html htm shtml; - text/css css; - text/xml xml; - image/gif gif; - image/jpeg jpeg jpg; - application/javascript js; - application/atom+xml atom; - application/rss+xml rss; + text/html html htm shtml; + text/css css; + text/xml xml; + image/gif gif; + image/jpeg jpeg jpg; + 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; + 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/png png; - image/svg+xml svg svgz; - image/tiff tif tiff; - image/vnd.wap.wbmp wbmp; - image/webp webp; - image/x-icon ico; - image/x-jng jng; - image/x-ms-bmp bmp; + image/avif avif; + image/png png; + image/svg+xml svg svgz; + image/tiff tif tiff; + image/vnd.wap.wbmp wbmp; + image/webp webp; + image/x-icon ico; + image/x-jng jng; + image/x-ms-bmp bmp; - font/woff woff; - font/woff2 woff2; + 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/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/xslt+xml xsl xslt; + 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; + 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; + 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; + video/3gpp 3gpp 3gp; + video/mp2t ts; + video/mp4 mp4; + video/mpeg mpeg mpg; + video/ogg ogv; + video/quicktime mov; + video/webm webm; + video/x-flv flv; + video/x-m4v m4v; + video/x-matroska mkv; + video/x-mng mng; + video/x-ms-asf asx asf; + video/x-ms-wmv wmv; + video/x-msvideo avi; } diff --git a/debian/conf/nginx.conf b/debian/conf/nginx.conf index 136753e..68a8fd4 100644 --- a/debian/conf/nginx.conf +++ b/debian/conf/nginx.conf @@ -1,6 +1,8 @@ user www-data; worker_processes auto; +worker_cpu_affinity auto; pid /run/nginx.pid; +error_log /var/log/nginx/error.log; include /etc/nginx/modules-enabled/*.conf; events { @@ -17,7 +19,7 @@ http { sendfile on; tcp_nopush on; types_hash_max_size 2048; - # server_tokens off; + server_tokens off; # Recommended practice is to turn this off # server_names_hash_bucket_size 64; # server_name_in_redirect off; @@ -29,15 +31,14 @@ http { # SSL Settings ## - ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3; # Dropping SSLv3, ref: POODLE - ssl_prefer_server_ciphers on; + ssl_protocols TLSv1.2 TLSv1.3; # Dropping SSLv3 (POODLE), TLS 1.0, 1.1 + ssl_prefer_server_ciphers off; # Don't force server cipher order. ## # Logging Settings ## access_log /var/log/nginx/access.log; - error_log /var/log/nginx/error.log; ## # Gzip Settings diff --git a/debian/control b/debian/control index f464dd8..47749f4 100644 --- a/debian/control +++ b/debian/control @@ -2,43 +2,36 @@ Source: nginx Section: httpd Priority: optional Maintainer: Debian Nginx Maintainers -Uploaders: Christos Trochalakis , - Ondřej Nový , - Thomas Ward , - Jan Mojžíš , +Uploaders: Jan Mojžíš Build-Depends: debhelper-compat (= 13), libexpat-dev, libgd-dev, libgeoip-dev, - libhiredis-dev, - libmaxminddb-dev, - libmhash-dev, - libpam0g-dev, - libpcre3-dev, + libpcre2-dev, libperl-dev, libssl-dev, libxslt1-dev, po-debconf, - quilt, zlib1g-dev -Standards-Version: 4.6.1 +Standards-Version: 4.7.0 Homepage: https://nginx.org Vcs-Git: https://salsa.debian.org/nginx-team/nginx.git Vcs-Browser: https://salsa.debian.org/nginx-team/nginx Rules-Requires-Root: no Package: nginx -Architecture: all -Depends: nginx-core (<< ${source:Version}.1~) | nginx-full (<< ${source:Version}.1~) | nginx-light (<< ${source:Version}.1~) | nginx-extras (<< ${source:Version}.1~), - nginx-core (>= ${source:Version}) | nginx-full (>= ${source:Version}) | nginx-light (>= ${source:Version}) | nginx-extras (>= ${source:Version}), - ${misc:Depends} +Architecture: any +Depends: ${misc:Depends}, + ${shlibs:Depends}, + iproute2, + nginx-common (= ${source:Version}), +Breaks: nginx-light (<< 1.22.1-6~), nginx-extras (<< 1.22.1-6~), nginx-core (<< 1.22.1-6~), +Replaces: nginx-light (<< 1.22.1-6~), nginx-extras (<< 1.22.1-6~), nginx-core (<< 1.22.1-6~), +Provides: httpd, httpd-cgi, ${nginx:abi} Description: small, powerful, scalable web/proxy server Nginx ("engine X") is a high-performance web and reverse proxy server created by Igor Sysoev. It can be used both as a standalone web server and as a proxy to reduce the load on back-end HTTP or mail servers. - . - This is a dependency package to install either nginx-core (by default), - nginx-full, nginx-light or nginx-extras. Package: nginx-doc Architecture: all @@ -53,9 +46,11 @@ Description: small, powerful, scalable web/proxy server - documentation This package provides extra documentation to help unleash the power of Nginx. Package: nginx-common +Breaks: nginx (<< 1.22.1-8) +Replaces: nginx (<< 1.22.1-8) Architecture: all Multi-Arch: foreign -Depends: lsb-base, ${misc:Depends} +Depends: ${misc:Depends} Suggests: fcgiwrap, nginx-doc, ssl-cert Description: small, powerful, scalable web/proxy server - common files Nginx ("engine X") is a high-performance web and reverse proxy server @@ -67,20 +62,11 @@ Description: small, powerful, scalable web/proxy server - common files Package: nginx-dev Architecture: all -Depends: ${misc:Depends}, - debhelper-compat (= 13), - dpkg-dev (>= 1.15.5), - libgd-dev, - libgeoip-dev, - libpcre3-dev, - libperl-dev, - libssl-dev, - libxslt1-dev, - po-debconf, - quilt, - zlib1g-dev, - nginx-core (<< ${source:Version}.1~) | nginx-light (<< ${source:Version}.1~) | nginx-extras (<< ${source:Version}.1~), - nginx-core (>= ${source:Version}) | nginx-light (>= ${source:Version}) | nginx-extras (>= ${source:Version}) +Multi-Arch: foreign +Depends: ${misc:Depends}, ${S:Build-Depends}, + ${nginx:abi}, + nginx (<< ${source:Version}.1~), + nginx (>= ${source:Version}), Provides: dh-sequence-nginx Description: nginx web/proxy server - development headers Nginx ("engine X") is a high-performance web and reverse proxy server @@ -92,28 +78,31 @@ Description: nginx web/proxy server - development headers additions to the Debian nginx web/proxy server packages. Package: nginx-core -Architecture: any -Depends: libnginx-mod-http-geoip (= ${binary:Version}), - libnginx-mod-http-image-filter (= ${binary:Version}), - libnginx-mod-http-xslt-filter (= ${binary:Version}), - libnginx-mod-mail (= ${binary:Version}), - libnginx-mod-stream (= ${binary:Version}), - libnginx-mod-stream-geoip (= ${binary:Version}), - nginx-common (= ${source:Version}), - iproute2, +Architecture: all +Depends: libnginx-mod-http-geoip (>= ${source:Version}), + libnginx-mod-http-geoip (<< ${source:Version}.1~), + libnginx-mod-http-image-filter (>= ${source:Version}), + libnginx-mod-http-image-filter (<< ${source:Version}.1~), + libnginx-mod-http-xslt-filter (>= ${source:Version}), + libnginx-mod-http-xslt-filter (<< ${source:Version}.1~), + libnginx-mod-mail (>= ${source:Version}), + libnginx-mod-mail (<< ${source:Version}.1~), + libnginx-mod-stream (>= ${source:Version}), + libnginx-mod-stream (<< ${source:Version}.1~), + libnginx-mod-stream-geoip (>= ${source:Version}), + libnginx-mod-stream-geoip (<< ${source:Version}.1~), + nginx (>= ${source:Version}), + nginx (<< ${source:Version}.1~), ${misc:Depends}, ${shlibs:Depends} Breaks: nginx-full (<< 1.18.0-1), Replaces: nginx-full (<< 1.18.0-1), -Provides: httpd, httpd-cgi, nginx -Conflicts: nginx-extras, nginx-light -Suggests: nginx-doc (= ${source:Version}) Description: nginx web/proxy server (standard version) Nginx ("engine X") is a high-performance web and reverse proxy server created by Igor Sysoev. It can be used both as a standalone web server and as a proxy to reduce the load on back-end HTTP or mail servers. . - This package provides a version of nginx identical to that of nginx-full, + This metapackage provides a version of nginx identical to that of nginx-full, but without any third-party modules, and only modules in the original nginx code base. . @@ -139,12 +128,10 @@ Depends: libnginx-mod-http-auth-pam, libnginx-mod-http-subs-filter, libnginx-mod-http-upstream-fair, libnginx-mod-stream-geoip2, - nginx-core (>= ${source:Version}), - nginx-core (<< ${source:Version}.1~), + nginx (>= ${source:Version}), + nginx (<< ${source:Version}.1~), ${misc:Depends}, ${shlibs:Depends} -Provides: httpd, httpd-cgi, nginx -Suggests: nginx-doc (= ${source:Version}) Description: nginx web/proxy server (standard version with 3rd parties) Nginx ("engine X") is a high-performance web and reverse proxy server created by Igor Sysoev. It can be used both as a standalone web server @@ -171,21 +158,18 @@ Description: nginx web/proxy server (standard version with 3rd parties) Upstream Fair Queue. Package: nginx-light -Architecture: any -Depends: libnginx-mod-http-echo (>= ${binary:Version}), - nginx-common (= ${source:Version}), - iproute2, +Architecture: all +Depends: libnginx-mod-http-echo, + nginx (>= ${source:Version}), + nginx (<< ${source:Version}.1~), ${misc:Depends}, ${shlibs:Depends} -Provides: httpd, httpd-cgi, nginx -Conflicts: nginx-extras, nginx-core -Suggests: nginx-doc (= ${source:Version}) Description: nginx web/proxy server (basic version) Nginx ("engine X") is a high-performance web and reverse proxy server created by Igor Sysoev. It can be used both as a standalone web server and as a proxy to reduce the load on back-end HTTP or mail servers. . - This package provides a very light version of nginx with only the + This metapackage provides a very light version of nginx with only the minimal set of features and modules. . STANDARD HTTP MODULES: Core, Access, Auth Basic, Auto Index, Empty GIF, @@ -199,39 +183,35 @@ Description: nginx web/proxy server (basic version) Package: nginx-extras Architecture: any -Depends: libnginx-mod-http-auth-pam (>= ${binary:Version}), - libnginx-mod-http-cache-purge (>= ${binary:Version}), - libnginx-mod-http-dav-ext (>= ${binary:Version}), - libnginx-mod-http-echo (>= ${binary:Version}), - libnginx-mod-http-fancyindex (>= ${binary:Version}), +Depends: nginx (= ${binary:Version}), libnginx-mod-http-geoip (= ${binary:Version}), - libnginx-mod-http-geoip2 (>= ${binary:Version}), - libnginx-mod-http-headers-more-filter (>= ${binary:Version}), libnginx-mod-http-image-filter (= ${binary:Version}), - libnginx-mod-http-lua (>=1:0.10.22-3~) [amd64 arm64 armel armhf i386 mips64el mipsel s390x powerpc], libnginx-mod-http-perl (= ${binary:Version}), - libnginx-mod-http-subs-filter (>= ${binary:Version}), - libnginx-mod-http-uploadprogress (>= ${binary:Version}), - libnginx-mod-http-upstream-fair (>= ${binary:Version}), libnginx-mod-http-xslt-filter (= ${binary:Version}), libnginx-mod-mail (= ${binary:Version}), - libnginx-mod-nchan (>= ${binary:Version}), libnginx-mod-stream (= ${binary:Version}), libnginx-mod-stream-geoip (= ${binary:Version}), - libnginx-mod-stream-geoip2 (>= ${binary:Version}), - nginx-common (= ${source:Version}), - iproute2, + libnginx-mod-http-auth-pam, + libnginx-mod-http-cache-purge, + libnginx-mod-http-dav-ext, + libnginx-mod-http-echo, + libnginx-mod-http-fancyindex, + libnginx-mod-http-geoip2, + libnginx-mod-http-headers-more-filter, + libnginx-mod-http-lua [amd64 arm64 armel armhf i386 mips64el mipsel s390x riscv64 powerpc], + libnginx-mod-http-subs-filter, + libnginx-mod-http-uploadprogress, + libnginx-mod-http-upstream-fair, + libnginx-mod-nchan, + libnginx-mod-stream-geoip2, ${misc:Depends}, ${shlibs:Depends} -Provides: httpd, httpd-cgi, nginx -Conflicts: nginx-core, nginx-light -Suggests: nginx-doc (= ${source:Version}) Description: nginx web/proxy server (extended version) Nginx ("engine X") is a high-performance web and reverse proxy server created by Igor Sysoev. It can be used both as a standalone web server and as a proxy to reduce the load on back-end HTTP or mail servers. . - This package provides a version of nginx with the standard modules, plus + This metapackage provides a version of nginx with the standard modules, plus extra features and modules such as the Perl module, which allows the addition of Perl in configuration files. . @@ -263,17 +243,6 @@ Description: GeoIP HTTP module for Nginx Those variables include country, region, city, latitude, longitude, postal code, etc. -Package: libnginx-mod-http-geoip2 -Architecture: any -Depends: ${misc:Depends}, ${shlibs:Depends}, -Recommends: nginx, -Description: GeoIP2 HTTP module for Nginx - The ngx_http_geoip2 module creates variables with values depending on the - client IP address, using the precompiled MaxMind GeoIP2 databases. - . - Those variables include country, region, city, latitude, longitude, postal - code, etc. - Package: libnginx-mod-http-image-filter Architecture: any Depends: ${misc:Depends}, ${shlibs:Depends}, @@ -329,18 +298,6 @@ Description: GeoIP Stream module for Nginx Those variables include country, region, city, latitude, longitude, postal code, etc. -Package: libnginx-mod-stream-geoip2 -Architecture: any -Depends: ${misc:Depends}, ${shlibs:Depends}, - libnginx-mod-stream (= ${binary:Version}), -Recommends: nginx, -Description: GeoIP2 Stream module for Nginx - The ngx_stream_geoip2 module creates variables with values depending on the - client IP address, using the precompiled MaxMind GeoIP2 databases. - . - Those variables include country, region, city, latitude, longitude, postal - code, etc. - Package: libnginx-mod-http-perl Architecture: any Depends: ${misc:Depends}, ${perl:Depends}, ${shlibs:Depends}, @@ -352,165 +309,3 @@ Description: Perl module for Nginx in Perl and insert Perl calls into SSI. . Note that this module is marked experimental. - -Package: libnginx-mod-http-auth-pam -Architecture: any -Depends: ${misc:Depends}, ${shlibs:Depends}, -Recommends: nginx, -Description: PAM authentication module for Nginx - The nginx_http_auth_pam module enables authentication using PAM. - . - The module uses PAM as a backend for simple http authentication. It - also allows setting the pam service name to allow more fine grained control. - -Package: libnginx-mod-http-ndk -Architecture: any -Depends: ${misc:Depends}, ${shlibs:Depends}, -Recommends: nginx, -Description: Nginx Development Kit module - The NDK is an Nginx module that is designed to extend the core functionality of - the excellent Nginx webserver in a way that can be used as a basis of other - Nginx modules. - . - It has functions and macros to deal with generic tasks that don't currently - have generic code as part of the core distribution. The NDK itself adds few - features that are seen from a user's point of view - it's just designed to help - reduce the code that Nginx module developers need to write. - -Package: libnginx-mod-http-ndk-dev -Architecture: all -Depends: libnginx-mod-http-ndk (<< ${source:Version}.1~), libnginx-mod-http-ndk (>= ${source:Version}), - nginx-dev (>= ${source:Version}), nginx-dev (<< ${source:Version}.1~), ${misc:Depends} -Description: Nginx Development Kit module - development files - The NDK is an Nginx module that is designed to extend the core functionality of - the excellent Nginx webserver in a way that can be used as a basis of other - Nginx modules. - . - This package provides development headers and necessary config scripts - for the Nginx development kit module, useful to develop and link third party - additions to the Debian nginx web/proxy server packages using Nginx - development kit module. - . - Development files. - -Package: libnginx-mod-nchan -Architecture: any -Depends: ${misc:Depends}, ${shlibs:Depends}, -Recommends: nginx, -Description: Fast, flexible pub/sub server for Nginx - Nchan is a scalable, flexible pub/sub server for the modern web, It can be - configured as a standalone server, or as a shim between your application and - tens, thousands, or millions of live subscribers. It can buffer messages in - memory, on-disk, or via Redis. All connections are handled asynchronously and - distributed among any number of worker processes. It can also scale to many - nginx server instances with Redis. - . - Full documentation available at https://nchan.slact.net - -Package: libnginx-mod-http-echo -Architecture: any -Depends: ${misc:Depends}, ${shlibs:Depends}, -Recommends: nginx, -Description: Bring echo and more shell style goodies to Nginx - Echo module wraps lots of Nginx internal APIs for streaming input and output, - parallel/sequential subrequests, timers and sleeping, as well as various meta - data accessing. - . - Basically it provides various utilities that help testing and debugging of - other modules by trivially emulating different kinds of faked subrequest - locations. - . - People will also find it useful in real-world applications that need to: - . - 1. Serve static contents directly from memory. - 2. Wrap the upstream response with custom header and footer (kinda like the - addition module but with contents read directly from the config file and - Nginx variables). - 3. Merge contents of various "Nginx locations" (i.e., subrequests) together in - a single main request (using echo_location and its friends). - -Package: libnginx-mod-http-upstream-fair -Architecture: any -Depends: ${misc:Depends}, ${shlibs:Depends}, -Recommends: nginx, -Description: Nginx Upstream Fair Proxy Load Balancer - The Nginx fair proxy balancer enhances the standard round-robin load balancer - provided with Nginx so that it tracks busy backend servers and adjusts - balancing accordingly. - -Package: libnginx-mod-http-headers-more-filter -Architecture: any -Depends: ${misc:Depends}, ${shlibs:Depends}, -Recommends: nginx, -Description: Set and clear input and output headers for Nginx - The Headers More module allows you to add, set, or clear any output or input - header that you specify. - . - This is an enhanced version of the standard headers module because it provides - more utilities like resetting or clearing "builtin headers" like Content-Type, - Content-Length, and Server. - -Package: libnginx-mod-http-cache-purge -Architecture: any -Depends: ${misc:Depends}, ${shlibs:Depends}, -Recommends: nginx, -Description: Purge content from Nginx caches - Cache Purge module adds purging capabilities to Nginx. It allows purging - content from caches used by all of Nginx proxy modules, like FastCGI, Proxy, - SCGI and uWSGI. - -Package: libnginx-mod-http-fancyindex -Architecture: any -Depends: ${misc:Depends}, ${shlibs:Depends}, -Suggests: nginx, -Description: Fancy indexes module for the Nginx - The Fancy Index module makes possible the generation of file listings, like - the built-in autoindex module does, but adding a touch of style by introducing - ways to customize the result. - -Package: libnginx-mod-http-uploadprogress -Architecture: any -Depends: ${misc:Depends}, ${shlibs:Depends}, -Recommends: nginx, -Description: Upload progress system for Nginx - Upload progress module is an implementation of an upload progress system, that - monitors RFC1867 POST uploads as they are transmitted to upstream servers. - . - It works by tracking the uploads proxied by Nginx to upstream servers without - analysing the uploaded content and offers a web API to report upload progress - in Javscript, Json or any other format. - -Package: libnginx-mod-http-subs-filter -Architecture: any -Depends: ${misc:Depends}, ${shlibs:Depends}, -Recommends: nginx, -Description: Substitution filter module for Nginx - Substitution Nginx module can do both regular expression and fixed string - substitutions on response bodies. The module is quite different from Nginx's - native Substitution module. It scans the output chains buffer and - matches string line by line, just like Apache's mod_substitute. - -Package: libnginx-mod-http-dav-ext -Architecture: any -Depends: ${misc:Depends}, ${shlibs:Depends}, -Recommends: nginx, -Description: WebDAV missing commands support for Nginx - WebDAV Ext module complements the Nginx WebDAV module to provide a full - WebDAV support. - . - WebDAV Ext provides the missing PROPFIND & OPTIONS methods. - -Package: libnginx-mod-rtmp -Architecture: any -Depends: ${misc:Depends}, ${shlibs:Depends}, -Recommends: nginx, -Description: RTMP support for Nginx - The nginx RTMP module is a fully-featured streaming solution implemented in - nginx. - . - It provides the following features: - - Live streaming with RTMP, HLS and MPEG-DASH; - - RTMP Video on Demand from local or HTTP sources; - - Stream relay support via a push or pull model; - - Integrated stream recording; - - and more. diff --git a/debian/copyright b/debian/copyright index 2aabc8d..0536a8c 100644 --- a/debian/copyright +++ b/debian/copyright @@ -3,32 +3,12 @@ Upstream-Name: nginx Source: https://nginx.org/en/download.html Files: * -Copyright: 2002-2021, Igor Sysoev - 2011-2022, Nginx, Inc. - Maxim Dounin - Valentin V. Bartenev - Roman Arutyunyan - Ruslan Ermilov -License: BSD-2-clause - -Files: src/core/ngx_murmurhash.c -Copyright: Copyright (C) Austin Appleby -License: public-domain - All MurmurHash versions are public domain software, and the author - disclaims all copyright to their code. - - -Files: src/stream/ngx_stream_set_module.c -Copyright: Copyright (C) Pavel Pautov - Copyright (C) Nginx, Inc. -License: BSD-2-clause - -Files: src/http/modules/ngx_http_scgi_module.c - src/http/modules/ngx_http_uwsgi_module.c -Copyright: 2009-2010, Unbit S.a.s. - 2008, Manlio Perillo (manlio.perillo@gmail.com) - Igor Sysoev - Nginx, Inc. +Copyright: Valentin V. Bartenev + Ruslan Ermilov + Roman Arutyunyan + Maxim Dounin + 2011-2024, Nginx, Inc. + 2002-2021, Igor Sysoev License: BSD-2-clause Files: contrib/geo2nginx.pl @@ -36,107 +16,67 @@ Copyright: 2005, Andrei Nigmatulin License: BSD-2-clause Files: debian/* -Copyright: 2007-2009, Fabio Tranchitella - 2008, Jose Parrella - 2009-2014, Kartik Mistry - 2010-2014, Michael Lustfield - 2011 Dmitry E. Oboukhov - 2011-2013, Cyril Lavier - 2013-2016, Christos Trochalakis - 2019-2022, Thomas Ward - 2020-2022, Ondřej Nový +Copyright: 2022-2025, Jan Mojžíš + 2020-2022, Ondřej Nový + 2019-2022, Thomas Ward + 2013-2016, Christos Trochalakis + 2011-2013, Cyril Lavier + 2011, Dmitry E. Oboukhov + 2010-2014, Michael Lustfield + 2009-2014, Kartik Mistry + 2008, Jose Parrella + 2007-2009, Fabio Tranchitella +License: BSD-2-clause + +Files: debian/apport/* +Copyright: 2015, Thomas Ward License: BSD-2-clause Files: debian/debhelper/* -Copyright: 2022 Miao Wang +Copyright: 2022, Miao Wang License: Expat -Files: debian/modules/http-headers-more-filter/* -Copyright: 2009-2017, Yichun "agentzh" Zhang (章亦春) , CloudFlare Inc. - 2010-2013, Bernd Dorn - Igor Sysoev +Files: debian/debhelper/dh_nginx +Copyright: 2016, Christos Trochalakis +License: GPL-2+ + +Files: debian/ngx-conf/ngx-conf +Copyright: 2015, Michael Lustfield +License: Expat + +Files: man/* +Copyright: Nginx, Inc. + 2010, 2019, Sergey A. Osokin License: BSD-2-clause -Files: debian/modules/http-geoip2/* -Copyright: 2014, Lee Valentine -License: BSD-2-clause - -Files: debian/modules/http-ndk/* -Copyright: 2010-2018, Marcus Clyne -License: BSD-3-clause - -Files: debian/modules/http-ndk/src/hash/md5.h - debian/modules/http-ndk/src/hash/sha.h -Copyright: 1995-1998, Eric Young -License: BSD-4-clause - -Files: debian/modules/http-ndk/src/hash/murmurhash2.c +Files: src/core/ngx_murmurhash.c Copyright: Austin Appleby License: public-domain All MurmurHash versions are public domain software, and the author disclaims all copyright to their code. -Files: debian/modules/http-auth-pam/* -Copyright: 2008-2020, Sergio Talens Oliag +Files: src/http/modules/ngx_http_scgi_module.c +Copyright: Nginx, Inc. + Manlio Perillo (manlio.perillo@gmail.com) + Igor Sysoev License: BSD-2-clause -Files: debian/modules/http-echo/* -Copyright: 2009-2014, Yichun "agentzh" Zhang +Files: src/http/modules/ngx_http_uwsgi_module.c +Copyright: Nginx, Inc. + Igor Sysoev + 2009, 2010, Unbit S.a.s. + 2008, Manlio Perillo (manlio.perillo@gmail.com) License: BSD-2-clause -Files: debian/modules/http-upstream-fair/* -Copyright: 2007, Grzegorz Nosek - Igor Sysoev +Files: src/http/ngx_http_huff_encode.c +Copyright: Valentin V. Bartenev + Nginx, Inc. + 2015, Vlad Krasnov License: BSD-2-clause -Files: debian/modules/nchan/* -Copyright: 2009-2016, Leo Ponomarev (slact) - 2014, Wandenberg Peixoto - Alexander Lyalin - Rogério Carvalho Schneider -License: Expat - -Files: debian/modules/nchan/src/store/redis/hiredis/* -Copyright: 2006-2014, Salvatore Sanfilippo - 2010-2011, Pieter Noordhuis - 2015, Matt Stancliff - Jan-Erik Rediger -License: BSD-3-clause - -Files: debian/modules/nchan/src/store/redis/cmp.* -Copyright: 2017, Charles Gunyon -License: Expat - -Files: debian/modules/http-uploadprogress/* -Copyright: 2007, Brice Figureau - 2002-2007, Igor Sysoev -License: BSD-2-clause - -Files: debian/modules/http-cache-purge/* -Copyright: 2009-2014, FRiCKLE , - 2009-2014, Piotr Sikora -License: BSD-2-clause - -Files: debian/modules/http-dav-ext/* -Copyright: 2012-2018, Roman Arutyunyan -License: BSD-2-clause - -Files: debian/modules/http-fancyindex/* -Copyright: 2007-2016, Adrian Perez -License: BSD-2-clause - -Files: debian/modules/http-subs-filter/* -Copyright: 2014, Weibin Yao -License: BSD-2-clause - -Files: debian/modules/http-subs-filter/test/* -Copyright: 2009-2011, Taobao Inc., Alibaba Group - Antoine BONAVITA "" - agentzh (章亦春) "" -License: BSD-3-clause - -Files: debian/modules/rtmp/* -Copyright: 2012-2014, Roman Arutyunyan +Files: src/stream/ngx_stream_set_module.c +Copyright: Pavel Pautov + Nginx, Inc. License: BSD-2-clause License: BSD-2-clause @@ -164,58 +104,6 @@ License: BSD-2-clause (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -License: BSD-3-clause - All rights reserved. - . - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are - met: - 1. Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - 2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - 3. Neither the name of the University nor the names of its contributors - may be used to endorse or promote products derived from this - software without specific prior written permission. - . - THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS - BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR - BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR - OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF - ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -License: BSD-4-clause - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions - are met: - 1. Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - 2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - 4. Neither the name of the University nor the names of its contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - . - THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - SUCH DAMAGE. - License: Expat Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to @@ -234,3 +122,15 @@ License: Expat LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +License: GPL-2+ + This is free software, licensed under: + . + The GNU General Public License, Version 2, June 1991 + . + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; version 2 dated June, 1991, or (at + your option) any later version. + On Debian systems, the complete text of version 2 of the GNU General + Public License can be found in '/usr/share/common-licenses/GPL-2'. diff --git a/debian/debhelper/dh_nginx b/debian/debhelper/dh_nginx index f2b9bb5..9100220 100755 --- a/debian/debhelper/dh_nginx +++ b/debian/debhelper/dh_nginx @@ -23,17 +23,28 @@ use strict; use File::Find; use Debian::Debhelper::Dh_Lib; - +use Dpkg::Substvars; =head1 NAME dh_nginx - register configuration snippets to the nginx web server =cut - +my $nginx_in_tree; +my $abi; sub nginx_depends { - return 'nginx-common (= ${source:Version})' + if (!$abi) { + my $sv = Dpkg::Substvars->new(); + if ($nginx_in_tree) { + $sv->load("debian/libnginx-mod.abisubstvars"); + } + else { + $sv->load("/usr/share/nginx/src/debian/libnginx-mod.abisubstvars"); + } + $abi = $sv->get("nginx:abi"); + } + return "$abi"; } sub nginx_api_installdir @@ -161,8 +172,6 @@ dh_nginx is heavily influnced by dh_apache2 written by Arno Toell ## main code starts here ## -my $nginx_in_tree; - init(options => { "e|noenable" => \$dh{NOENABLE}, "in-nginx-tree" => \$nginx_in_tree, @@ -268,30 +277,24 @@ foreach my $package ((@{$dh{DOPACKAGES}})) } } - my @postinst_autoscripts; + my @postinst_autoscripts; - if ($#{$PACKAGE_TYPE{'has_a_module'}} >= 0) - { - if ($package !~ m/libnginx-mod-\w+?/) - { - warning("Package $package appears to be an Nginx module. It should comply to the package naming scheme libnginx-mod-\n"); - } - if ($nginx_in_tree){ - addsubstvar($package, "misc:Depends", nginx_depends()); - } else { - my $ngx_ver = `grep 'define NGINX_VERSION' /usr/share/nginx/src/src/core/nginx.h | sed -e 's/^.*"\\(.*\\)".*/\\1/'`; - chomp($ngx_ver); - addsubstvar($package, "misc:Depends", "nginx-common (>= $ngx_ver), nginx-common (<< $ngx_ver.1~)"); - } + if ($#{$PACKAGE_TYPE{'has_a_module'}} >= 0) + { + if ($package !~ m/libnginx-mod-\w+?/) + { + warning("Package $package appears to be an Nginx module. It should comply to the package naming scheme libnginx-mod-\n"); + } + addsubstvar($package, "misc:Depends", nginx_depends()); - my $modules = ""; - foreach my $module (@{$PACKAGE_TYPE{'has_a_module'}}) - { - $modules .= "$module "; - } + my $modules = ""; + foreach my $module (@{$PACKAGE_TYPE{'has_a_module'}}) + { + $modules .= "$module "; + } - push @postinst_autoscripts, ["module", $modules]; - } + push @postinst_autoscripts, ["module", $modules]; + } if (! $dh{NOSCRIPTS}) { diff --git a/debian/debhelper/nginx_mod.pm b/debian/debhelper/nginx_mod.pm index d771cef..1b1ecaf 100644 --- a/debian/debhelper/nginx_mod.pm +++ b/debian/debhelper/nginx_mod.pm @@ -7,7 +7,9 @@ package Debian::Debhelper::Buildsystem::nginx_mod; use strict; use warnings; -use Debian::Debhelper::Dh_Lib qw(error doit); +use Dpkg::Deps qw(deps_parse); +use Dpkg::Control::Info; +use Debian::Debhelper::Dh_Lib qw(error doit getpackages addsubstvar); use File::Spec; use parent qw(Debian::Debhelper::Buildsystem::makefile); use Config; @@ -23,84 +25,114 @@ sub check_auto_buildable { } sub _NGINX_SRC_DIR { - "/usr/share/nginx/src" + "/usr/share/nginx/src" } -sub _LUAJIT_INC { - "/usr/include/luajit-2.1" -} - -sub _LUAJIT_LIB { - "/usr/lib/x86_64-linux-gnu/libluajit-5.1.so" +sub _NDK_SRC_DIR { + "/usr/share/nginx-ndk/src" } sub new { my $class=shift; my $this= $class->SUPER::new(@_); + my $ngx_ver = `grep 'define NGINX_VERSION' /usr/share/nginx/src/src/core/nginx.h | sed -e 's/^.*"\\(.*\\)".*/\\1/'`; + chomp($ngx_ver); $this->prefer_out_of_source_building(@_); + $this->{has_ndk} = $this->has_build_dep("libnginx-mod-http-ndk-dev"); + $this->{has_stream} = $this->has_build_dep("libnginx-mod-stream"); + foreach my $cur (getpackages('arch')) { + if ($this->{has_ndk} == 1) { + addsubstvar($cur, "misc:Depends", "libnginx-mod-http-ndk"); + } + if ($this->{has_stream} == 1) { + addsubstvar($cur, "misc:Depends", "libnginx-mod-stream (>= $ngx_ver), libnginx-mod-stream (<< $ngx_ver.1~)"); + } + } return $this; } sub configure { my $this=shift; - doit({ - "chdir" => $this->_NGINX_SRC_DIR, - "update_env" => { - "src_dir" => $this->get_sourcedir, - "bld_dir" => $this->get_builddir, - "pwd_dir" => $this->{cwd}, - "LUAJIT_INC" => $this->_LUAJIT_INC, - "LUAJIT_LIB" => $this->_LUAJIT_LIB - }, - }, "bash", "-c", '. ./conf_flags - ./configure \\ - --with-cc-opt="$(cd "$pwd_dir/$src_dir"; dpkg-buildflags --get CFLAGS) -fPIC $(cd "$pwd_dir/$src_dir"; dpkg-buildflags --get CPPFLAGS)" \\ - --with-ld-opt="$(cd "$pwd_dir/$src_dir"; dpkg-buildflags --get LDFLAGS) -fPIC" \\ - "${NGX_CONF_FLAGS[@]}" \\ - --add-dynamic-module="$pwd_dir/$src_dir" \\ - --builddir="$pwd_dir/$bld_dir" \\ - "$@"', "dummy", @_); + doit({ + "chdir" => $this->_NGINX_SRC_DIR, + "update_env" => { + "src_dir" => $this->get_sourcedir, + "bld_dir" => $this->get_builddir, + "pwd_dir" => $this->{cwd}, + }, + }, "bash", "-c", '. ./conf_flags + ./configure \\ + --with-cc-opt="$(cd "$pwd_dir/$src_dir"; dpkg-buildflags --get CFLAGS) -fPIC $(cd "$pwd_dir/$src_dir"; dpkg-buildflags --get CPPFLAGS)" \\ + --with-ld-opt="$(cd "$pwd_dir/$src_dir"; dpkg-buildflags --get LDFLAGS) -fPIC" \\ + "${NGX_CONF_FLAGS[@]}" \\ + --add-dynamic-module="$pwd_dir/$src_dir" \\ + --builddir="$pwd_dir/$bld_dir" \\ + ' . ($this->{has_ndk} ? '--add-module=' . $this->_NDK_SRC_DIR : '') . ' \\ + ' . ($this->{has_stream} ? '--with-stream' : '') . ' \\ + "$@"', "dummy", @_); } sub build { my $this=shift; - - $this->do_make("-f", File::Spec->catfile($this->{cwd}, $this->get_buildpath("Makefile")), "-C", $this->_NGINX_SRC_DIR, "modules"); + + $this->do_make("-f", File::Spec->catfile($this->{cwd}, $this->get_buildpath("Makefile")), "-C", $this->_NGINX_SRC_DIR, "modules"); } sub test { - my $this=shift; - $this->doit_in_builddir("bash", "-e", "-o", "pipefail", "-c", ' - tmp_conf=$(mktemp -p .) - for pre_dep in "$@"; do - echo "load_module modules/$pre_dep;" >> "$tmp_conf" - done - for i in *.so; do - echo "load_module $PWD/$i;" >> "$tmp_conf" - done - echo "events{}" >> "$tmp_conf" - nginx -g "error_log /dev/null; pid /dev/null;" -t -q -c "$PWD/$tmp_conf" - rm -f "$tmp_conf" - ', "dummy", @_); + my $this=shift; + + if ( $this->{has_ndk} and !grep( /^ndk_http_module.so$/, @_ ) ) { + unshift @_, "ndk_http_module.so"; + } + + if ( $this->{has_stream} and !grep( /^ngx_stream_module.so$/, @_ ) ) { + unshift @_, "ngx_stream_module.so"; + } + + $this->doit_in_builddir("bash", "-e", "-o", "pipefail", "-c", ' + tmp_conf=$(mktemp -p .) + for pre_dep in "$@"; do + echo "load_module modules/$pre_dep;" >> "$tmp_conf" + done + for i in *.so; do + echo "load_module $PWD/$i;" >> "$tmp_conf" + done + echo "events{}" >> "$tmp_conf" + /usr/sbin/nginx -g "error_log /dev/null; pid /dev/null;" -t -q -c "$PWD/$tmp_conf" + rm -f "$tmp_conf" + ', "dummy", @_); } sub install { my $this=shift; my $destdir=shift; - $this->doit_in_builddir("bash", "-e", "-o", "pipefail", "-c", ' - destdir=$1 - mkdir -p "$destdir/usr/lib/nginx/modules" - for i in *.so; do - cp "$i" "$destdir/usr/lib/nginx/modules/" - done - ', "dummy", $destdir); + $this->doit_in_builddir("bash", "-e", "-o", "pipefail", "-c", ' + destdir=$1 + mkdir -p "$destdir/usr/lib/nginx/modules" + for i in *.so; do + cp "$i" "$destdir/usr/lib/nginx/modules/" + done + ', "dummy", $destdir); } sub clean { - my $this=shift; - $this->rmdir_builddir(); + my $this=shift; + $this->rmdir_builddir(); +} + +sub has_build_dep { + my $this=shift; + my $bd=shift; + my $control = Dpkg::Control::Info->new()->get_source(); + my $depends = deps_parse($control->{'Build-Depends'}); + foreach (split /,\s+/,$depends) { + if ($_ =~ /$bd/) { + return 1; + } + } + return 0; } 1 diff --git a/debian/gbp.conf b/debian/gbp.conf index a14a699..44bfd7d 100644 --- a/debian/gbp.conf +++ b/debian/gbp.conf @@ -1,4 +1,13 @@ [DEFAULT] -pristine-tar = True +debian-branch = main upstream-branch = upstream upstream-tag = upstream/%(version)s +pristine-tar = True +sign-tags = True +upstream-signatures = on + +[import-orig] +merge-mode = replace + +[pull] +track-missing = True diff --git a/debian/libnginx-mod-http-auth-pam.nginx b/debian/libnginx-mod-http-auth-pam.nginx deleted file mode 100755 index 78c206f..0000000 --- a/debian/libnginx-mod-http-auth-pam.nginx +++ /dev/null @@ -1,13 +0,0 @@ -#!/usr/bin/perl -w - -use File::Basename; - -# Guess module name -$module = basename($0, '.nginx'); -$module =~ s/^libnginx-mod-//; - -$modulepath = $module; -$modulepath =~ s/-/_/g; - -print "mod debian/build-extras/objs/ngx_${modulepath}_module.so\n"; -print "mod debian/libnginx-mod.conf/mod-${module}.conf\n"; diff --git a/debian/libnginx-mod-http-cache-purge.nginx b/debian/libnginx-mod-http-cache-purge.nginx deleted file mode 100755 index 78c206f..0000000 --- a/debian/libnginx-mod-http-cache-purge.nginx +++ /dev/null @@ -1,13 +0,0 @@ -#!/usr/bin/perl -w - -use File::Basename; - -# Guess module name -$module = basename($0, '.nginx'); -$module =~ s/^libnginx-mod-//; - -$modulepath = $module; -$modulepath =~ s/-/_/g; - -print "mod debian/build-extras/objs/ngx_${modulepath}_module.so\n"; -print "mod debian/libnginx-mod.conf/mod-${module}.conf\n"; diff --git a/debian/libnginx-mod-http-dav-ext.nginx b/debian/libnginx-mod-http-dav-ext.nginx deleted file mode 100755 index 78c206f..0000000 --- a/debian/libnginx-mod-http-dav-ext.nginx +++ /dev/null @@ -1,13 +0,0 @@ -#!/usr/bin/perl -w - -use File::Basename; - -# Guess module name -$module = basename($0, '.nginx'); -$module =~ s/^libnginx-mod-//; - -$modulepath = $module; -$modulepath =~ s/-/_/g; - -print "mod debian/build-extras/objs/ngx_${modulepath}_module.so\n"; -print "mod debian/libnginx-mod.conf/mod-${module}.conf\n"; diff --git a/debian/libnginx-mod-http-echo.nginx b/debian/libnginx-mod-http-echo.nginx deleted file mode 100755 index 78c206f..0000000 --- a/debian/libnginx-mod-http-echo.nginx +++ /dev/null @@ -1,13 +0,0 @@ -#!/usr/bin/perl -w - -use File::Basename; - -# Guess module name -$module = basename($0, '.nginx'); -$module =~ s/^libnginx-mod-//; - -$modulepath = $module; -$modulepath =~ s/-/_/g; - -print "mod debian/build-extras/objs/ngx_${modulepath}_module.so\n"; -print "mod debian/libnginx-mod.conf/mod-${module}.conf\n"; diff --git a/debian/libnginx-mod-http-fancyindex.nginx b/debian/libnginx-mod-http-fancyindex.nginx deleted file mode 100755 index 78c206f..0000000 --- a/debian/libnginx-mod-http-fancyindex.nginx +++ /dev/null @@ -1,13 +0,0 @@ -#!/usr/bin/perl -w - -use File::Basename; - -# Guess module name -$module = basename($0, '.nginx'); -$module =~ s/^libnginx-mod-//; - -$modulepath = $module; -$modulepath =~ s/-/_/g; - -print "mod debian/build-extras/objs/ngx_${modulepath}_module.so\n"; -print "mod debian/libnginx-mod.conf/mod-${module}.conf\n"; diff --git a/debian/libnginx-mod-http-geoip.nginx b/debian/libnginx-mod-http-geoip.nginx index 78c206f..0ca730a 100755 --- a/debian/libnginx-mod-http-geoip.nginx +++ b/debian/libnginx-mod-http-geoip.nginx @@ -9,5 +9,5 @@ $module =~ s/^libnginx-mod-//; $modulepath = $module; $modulepath =~ s/-/_/g; -print "mod debian/build-extras/objs/ngx_${modulepath}_module.so\n"; +print "mod debian/build-bin/objs/ngx_${modulepath}_module.so\n"; print "mod debian/libnginx-mod.conf/mod-${module}.conf\n"; diff --git a/debian/libnginx-mod-http-geoip2.nginx b/debian/libnginx-mod-http-geoip2.nginx deleted file mode 100755 index 78c206f..0000000 --- a/debian/libnginx-mod-http-geoip2.nginx +++ /dev/null @@ -1,13 +0,0 @@ -#!/usr/bin/perl -w - -use File::Basename; - -# Guess module name -$module = basename($0, '.nginx'); -$module =~ s/^libnginx-mod-//; - -$modulepath = $module; -$modulepath =~ s/-/_/g; - -print "mod debian/build-extras/objs/ngx_${modulepath}_module.so\n"; -print "mod debian/libnginx-mod.conf/mod-${module}.conf\n"; diff --git a/debian/libnginx-mod-http-headers-more-filter.nginx b/debian/libnginx-mod-http-headers-more-filter.nginx deleted file mode 100755 index 78c206f..0000000 --- a/debian/libnginx-mod-http-headers-more-filter.nginx +++ /dev/null @@ -1,13 +0,0 @@ -#!/usr/bin/perl -w - -use File::Basename; - -# Guess module name -$module = basename($0, '.nginx'); -$module =~ s/^libnginx-mod-//; - -$modulepath = $module; -$modulepath =~ s/-/_/g; - -print "mod debian/build-extras/objs/ngx_${modulepath}_module.so\n"; -print "mod debian/libnginx-mod.conf/mod-${module}.conf\n"; diff --git a/debian/libnginx-mod-http-image-filter.nginx b/debian/libnginx-mod-http-image-filter.nginx index 78c206f..0ca730a 100755 --- a/debian/libnginx-mod-http-image-filter.nginx +++ b/debian/libnginx-mod-http-image-filter.nginx @@ -9,5 +9,5 @@ $module =~ s/^libnginx-mod-//; $modulepath = $module; $modulepath =~ s/-/_/g; -print "mod debian/build-extras/objs/ngx_${modulepath}_module.so\n"; +print "mod debian/build-bin/objs/ngx_${modulepath}_module.so\n"; print "mod debian/libnginx-mod.conf/mod-${module}.conf\n"; diff --git a/debian/libnginx-mod-http-ndk-dev.install b/debian/libnginx-mod-http-ndk-dev.install deleted file mode 100644 index 980066f..0000000 --- a/debian/libnginx-mod-http-ndk-dev.install +++ /dev/null @@ -1,5 +0,0 @@ -debian/build-ndksrc/auto usr/share/nginx-ndk/src/ -debian/build-ndksrc/src usr/share/nginx-ndk/src/ -debian/build-ndksrc/objs usr/share/nginx-ndk/src/ -debian/build-ndksrc/config usr/share/nginx-ndk/src/ -debian/build-ndksrc/ngx_auto_lib_core usr/share/nginx-ndk/src/ \ No newline at end of file diff --git a/debian/libnginx-mod-http-ndk.nginx b/debian/libnginx-mod-http-ndk.nginx deleted file mode 100644 index 562723b..0000000 --- a/debian/libnginx-mod-http-ndk.nginx +++ /dev/null @@ -1,2 +0,0 @@ -mod debian/build-extras/objs/ndk_http_module.so -mod debian/libnginx-mod.conf/mod-http-ndk.conf 10 diff --git a/debian/libnginx-mod-http-perl.install b/debian/libnginx-mod-http-perl.install index 14ca692..7382eca 100755 --- a/debian/libnginx-mod-http-perl.install +++ b/debian/libnginx-mod-http-perl.install @@ -3,5 +3,5 @@ use Config; my $vendorarch = substr($Config{vendorarch}, 1); -print "debian/build-extras/objs/src/http/modules/perl/blib/arch/auto/nginx/* $vendorarch/auto/nginx\n"; -print "debian/build-extras/objs/src/http/modules/perl/blib/lib/nginx.pm $vendorarch\n"; +print "debian/build-bin/objs/src/http/modules/perl/blib/arch/auto/nginx/* $vendorarch/auto/nginx\n"; +print "debian/build-bin/objs/src/http/modules/perl/blib/lib/nginx.pm $vendorarch\n"; diff --git a/debian/libnginx-mod-http-perl.nginx b/debian/libnginx-mod-http-perl.nginx index 78c206f..0ca730a 100755 --- a/debian/libnginx-mod-http-perl.nginx +++ b/debian/libnginx-mod-http-perl.nginx @@ -9,5 +9,5 @@ $module =~ s/^libnginx-mod-//; $modulepath = $module; $modulepath =~ s/-/_/g; -print "mod debian/build-extras/objs/ngx_${modulepath}_module.so\n"; +print "mod debian/build-bin/objs/ngx_${modulepath}_module.so\n"; print "mod debian/libnginx-mod.conf/mod-${module}.conf\n"; diff --git a/debian/libnginx-mod-http-subs-filter.nginx b/debian/libnginx-mod-http-subs-filter.nginx deleted file mode 100755 index 78c206f..0000000 --- a/debian/libnginx-mod-http-subs-filter.nginx +++ /dev/null @@ -1,13 +0,0 @@ -#!/usr/bin/perl -w - -use File::Basename; - -# Guess module name -$module = basename($0, '.nginx'); -$module =~ s/^libnginx-mod-//; - -$modulepath = $module; -$modulepath =~ s/-/_/g; - -print "mod debian/build-extras/objs/ngx_${modulepath}_module.so\n"; -print "mod debian/libnginx-mod.conf/mod-${module}.conf\n"; diff --git a/debian/libnginx-mod-http-uploadprogress.nginx b/debian/libnginx-mod-http-uploadprogress.nginx deleted file mode 100755 index 78c206f..0000000 --- a/debian/libnginx-mod-http-uploadprogress.nginx +++ /dev/null @@ -1,13 +0,0 @@ -#!/usr/bin/perl -w - -use File::Basename; - -# Guess module name -$module = basename($0, '.nginx'); -$module =~ s/^libnginx-mod-//; - -$modulepath = $module; -$modulepath =~ s/-/_/g; - -print "mod debian/build-extras/objs/ngx_${modulepath}_module.so\n"; -print "mod debian/libnginx-mod.conf/mod-${module}.conf\n"; diff --git a/debian/libnginx-mod-http-upstream-fair.nginx b/debian/libnginx-mod-http-upstream-fair.nginx deleted file mode 100755 index 78c206f..0000000 --- a/debian/libnginx-mod-http-upstream-fair.nginx +++ /dev/null @@ -1,13 +0,0 @@ -#!/usr/bin/perl -w - -use File::Basename; - -# Guess module name -$module = basename($0, '.nginx'); -$module =~ s/^libnginx-mod-//; - -$modulepath = $module; -$modulepath =~ s/-/_/g; - -print "mod debian/build-extras/objs/ngx_${modulepath}_module.so\n"; -print "mod debian/libnginx-mod.conf/mod-${module}.conf\n"; diff --git a/debian/libnginx-mod-http-xslt-filter.nginx b/debian/libnginx-mod-http-xslt-filter.nginx index 78c206f..0ca730a 100755 --- a/debian/libnginx-mod-http-xslt-filter.nginx +++ b/debian/libnginx-mod-http-xslt-filter.nginx @@ -9,5 +9,5 @@ $module =~ s/^libnginx-mod-//; $modulepath = $module; $modulepath =~ s/-/_/g; -print "mod debian/build-extras/objs/ngx_${modulepath}_module.so\n"; +print "mod debian/build-bin/objs/ngx_${modulepath}_module.so\n"; print "mod debian/libnginx-mod.conf/mod-${module}.conf\n"; diff --git a/debian/libnginx-mod-mail.nginx b/debian/libnginx-mod-mail.nginx index 78c206f..0ca730a 100755 --- a/debian/libnginx-mod-mail.nginx +++ b/debian/libnginx-mod-mail.nginx @@ -9,5 +9,5 @@ $module =~ s/^libnginx-mod-//; $modulepath = $module; $modulepath =~ s/-/_/g; -print "mod debian/build-extras/objs/ngx_${modulepath}_module.so\n"; +print "mod debian/build-bin/objs/ngx_${modulepath}_module.so\n"; print "mod debian/libnginx-mod.conf/mod-${module}.conf\n"; diff --git a/debian/libnginx-mod-nchan.nginx b/debian/libnginx-mod-nchan.nginx deleted file mode 100755 index 78c206f..0000000 --- a/debian/libnginx-mod-nchan.nginx +++ /dev/null @@ -1,13 +0,0 @@ -#!/usr/bin/perl -w - -use File::Basename; - -# Guess module name -$module = basename($0, '.nginx'); -$module =~ s/^libnginx-mod-//; - -$modulepath = $module; -$modulepath =~ s/-/_/g; - -print "mod debian/build-extras/objs/ngx_${modulepath}_module.so\n"; -print "mod debian/libnginx-mod.conf/mod-${module}.conf\n"; diff --git a/debian/libnginx-mod-rtmp.docs b/debian/libnginx-mod-rtmp.docs deleted file mode 100644 index e5c5c00..0000000 --- a/debian/libnginx-mod-rtmp.docs +++ /dev/null @@ -1 +0,0 @@ -debian/modules/rtmp/README.md diff --git a/debian/libnginx-mod-rtmp.examples b/debian/libnginx-mod-rtmp.examples deleted file mode 100644 index 563f038..0000000 --- a/debian/libnginx-mod-rtmp.examples +++ /dev/null @@ -1 +0,0 @@ -debian/modules/rtmp/stat.xsl diff --git a/debian/libnginx-mod-rtmp.nginx b/debian/libnginx-mod-rtmp.nginx deleted file mode 100755 index 78c206f..0000000 --- a/debian/libnginx-mod-rtmp.nginx +++ /dev/null @@ -1,13 +0,0 @@ -#!/usr/bin/perl -w - -use File::Basename; - -# Guess module name -$module = basename($0, '.nginx'); -$module =~ s/^libnginx-mod-//; - -$modulepath = $module; -$modulepath =~ s/-/_/g; - -print "mod debian/build-extras/objs/ngx_${modulepath}_module.so\n"; -print "mod debian/libnginx-mod.conf/mod-${module}.conf\n"; diff --git a/debian/libnginx-mod-stream-geoip.nginx b/debian/libnginx-mod-stream-geoip.nginx index 9acb103..438ee46 100755 --- a/debian/libnginx-mod-stream-geoip.nginx +++ b/debian/libnginx-mod-stream-geoip.nginx @@ -9,5 +9,5 @@ $module =~ s/^libnginx-mod-//; $modulepath = $module; $modulepath =~ s/-/_/g; -print "mod debian/build-extras/objs/ngx_${modulepath}_module.so\n"; +print "mod debian/build-bin/objs/ngx_${modulepath}_module.so\n"; print "mod debian/libnginx-mod.conf/mod-${module}.conf 70\n"; diff --git a/debian/libnginx-mod-stream-geoip2.nginx b/debian/libnginx-mod-stream-geoip2.nginx deleted file mode 100755 index 9acb103..0000000 --- a/debian/libnginx-mod-stream-geoip2.nginx +++ /dev/null @@ -1,13 +0,0 @@ -#!/usr/bin/perl -w - -use File::Basename; - -# Guess module name -$module = basename($0, '.nginx'); -$module =~ s/^libnginx-mod-//; - -$modulepath = $module; -$modulepath =~ s/-/_/g; - -print "mod debian/build-extras/objs/ngx_${modulepath}_module.so\n"; -print "mod debian/libnginx-mod.conf/mod-${module}.conf 70\n"; diff --git a/debian/libnginx-mod-stream.nginx b/debian/libnginx-mod-stream.nginx index 78c206f..0ca730a 100755 --- a/debian/libnginx-mod-stream.nginx +++ b/debian/libnginx-mod-stream.nginx @@ -9,5 +9,5 @@ $module =~ s/^libnginx-mod-//; $modulepath = $module; $modulepath =~ s/-/_/g; -print "mod debian/build-extras/objs/ngx_${modulepath}_module.so\n"; +print "mod debian/build-bin/objs/ngx_${modulepath}_module.so\n"; print "mod debian/libnginx-mod.conf/mod-${module}.conf\n"; diff --git a/debian/libnginx-mod.abisubstvars b/debian/libnginx-mod.abisubstvars new file mode 100644 index 0000000..57261d4 --- /dev/null +++ b/debian/libnginx-mod.abisubstvars @@ -0,0 +1,11 @@ +# ABI must be changed: +# - when upstream nginx version is changed +# - when module signature is changed (e.g. time_t change from 32bit integer to 64bit integer https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=1069997) +# - when symbols/structures/... (exported from header files) are changed +# +# ABI format: nginx-abi-{UPSTREAM_VERSION}-{SUFFIX} +# the {SUFFIX} provides a mechanism on rare cases when there have to be ABI +# changes without upgrading the upstream nginx version, e.g. security updates +# in oldstable + +nginx:abi=nginx-abi-1.26.3-1 diff --git a/debian/libnginx-mod.conf/mod-http-auth-pam.conf b/debian/libnginx-mod.conf/mod-http-auth-pam.conf deleted file mode 100644 index 2eb6752..0000000 --- a/debian/libnginx-mod.conf/mod-http-auth-pam.conf +++ /dev/null @@ -1 +0,0 @@ -load_module modules/ngx_http_auth_pam_module.so; diff --git a/debian/libnginx-mod.conf/mod-http-cache-purge.conf b/debian/libnginx-mod.conf/mod-http-cache-purge.conf deleted file mode 100644 index 5974b1f..0000000 --- a/debian/libnginx-mod.conf/mod-http-cache-purge.conf +++ /dev/null @@ -1 +0,0 @@ -load_module modules/ngx_http_cache_purge_module.so; diff --git a/debian/libnginx-mod.conf/mod-http-dav-ext.conf b/debian/libnginx-mod.conf/mod-http-dav-ext.conf deleted file mode 100644 index e852329..0000000 --- a/debian/libnginx-mod.conf/mod-http-dav-ext.conf +++ /dev/null @@ -1 +0,0 @@ -load_module modules/ngx_http_dav_ext_module.so; diff --git a/debian/libnginx-mod.conf/mod-http-echo.conf b/debian/libnginx-mod.conf/mod-http-echo.conf deleted file mode 100644 index a82ee29..0000000 --- a/debian/libnginx-mod.conf/mod-http-echo.conf +++ /dev/null @@ -1 +0,0 @@ -load_module modules/ngx_http_echo_module.so; diff --git a/debian/libnginx-mod.conf/mod-http-fancyindex.conf b/debian/libnginx-mod.conf/mod-http-fancyindex.conf deleted file mode 100644 index 4aa4f2f..0000000 --- a/debian/libnginx-mod.conf/mod-http-fancyindex.conf +++ /dev/null @@ -1 +0,0 @@ -load_module modules/ngx_http_fancyindex_module.so; diff --git a/debian/libnginx-mod.conf/mod-http-geoip2.conf b/debian/libnginx-mod.conf/mod-http-geoip2.conf deleted file mode 100644 index 9441b29..0000000 --- a/debian/libnginx-mod.conf/mod-http-geoip2.conf +++ /dev/null @@ -1 +0,0 @@ -load_module modules/ngx_http_geoip2_module.so; diff --git a/debian/libnginx-mod.conf/mod-http-headers-more-filter.conf b/debian/libnginx-mod.conf/mod-http-headers-more-filter.conf deleted file mode 100644 index 266d84e..0000000 --- a/debian/libnginx-mod.conf/mod-http-headers-more-filter.conf +++ /dev/null @@ -1 +0,0 @@ -load_module modules/ngx_http_headers_more_filter_module.so; diff --git a/debian/libnginx-mod.conf/mod-http-lua.conf b/debian/libnginx-mod.conf/mod-http-lua.conf deleted file mode 100644 index f6311f4..0000000 --- a/debian/libnginx-mod.conf/mod-http-lua.conf +++ /dev/null @@ -1 +0,0 @@ -load_module modules/ngx_http_lua_module.so; diff --git a/debian/libnginx-mod.conf/mod-http-subs-filter.conf b/debian/libnginx-mod.conf/mod-http-subs-filter.conf deleted file mode 100644 index fe34b6c..0000000 --- a/debian/libnginx-mod.conf/mod-http-subs-filter.conf +++ /dev/null @@ -1 +0,0 @@ -load_module modules/ngx_http_subs_filter_module.so; diff --git a/debian/libnginx-mod.conf/mod-http-uploadprogress.conf b/debian/libnginx-mod.conf/mod-http-uploadprogress.conf deleted file mode 100644 index edc0c0b..0000000 --- a/debian/libnginx-mod.conf/mod-http-uploadprogress.conf +++ /dev/null @@ -1 +0,0 @@ -load_module modules/ngx_http_uploadprogress_module.so; diff --git a/debian/libnginx-mod.conf/mod-http-upstream-fair.conf b/debian/libnginx-mod.conf/mod-http-upstream-fair.conf deleted file mode 100644 index 62750b5..0000000 --- a/debian/libnginx-mod.conf/mod-http-upstream-fair.conf +++ /dev/null @@ -1 +0,0 @@ -load_module modules/ngx_http_upstream_fair_module.so; diff --git a/debian/libnginx-mod.conf/mod-nchan.conf b/debian/libnginx-mod.conf/mod-nchan.conf deleted file mode 100644 index 0a524e5..0000000 --- a/debian/libnginx-mod.conf/mod-nchan.conf +++ /dev/null @@ -1 +0,0 @@ -load_module modules/ngx_nchan_module.so; diff --git a/debian/libnginx-mod.conf/mod-rtmp.conf b/debian/libnginx-mod.conf/mod-rtmp.conf deleted file mode 100644 index 4e87e6e..0000000 --- a/debian/libnginx-mod.conf/mod-rtmp.conf +++ /dev/null @@ -1 +0,0 @@ -load_module modules/ngx_rtmp_module.so; diff --git a/debian/libnginx-mod.conf/mod-stream-geoip2.conf b/debian/libnginx-mod.conf/mod-stream-geoip2.conf deleted file mode 100644 index 4072597..0000000 --- a/debian/libnginx-mod.conf/mod-stream-geoip2.conf +++ /dev/null @@ -1 +0,0 @@ -load_module modules/ngx_stream_geoip2_module.so; diff --git a/debian/modules/control b/debian/modules/control deleted file mode 100644 index b3e517e..0000000 --- a/debian/modules/control +++ /dev/null @@ -1,74 +0,0 @@ -Module: http-headers-more-filter -Homepage: https://github.com/agentzh/headers-more-nginx-module -Version: 0.33 -Files-Excluded: .gitignore .gitattributes .travis.yml - -Module: http-ndk -Homepage: https://github.com/simpl/ngx_devel_kit/ -Version: 0.3.1 - -Module: http-auth-pam -Homepage: https://github.com/sto/ngx_http_auth_pam_module -Version: 1.5.3 - -Module: http-echo -Homepage: https://github.com/agentzh/echo-nginx-module -Version: 0.62 -Files-Excluded: .gitignore .gitattributes .travis.yml - -Module: http-geoip2 -Homepage: https://github.com/leev/ngx_http_geoip2_module -Version: 3.3 - -Module: http-lua -Homepage: https://github.com/openresty/lua-nginx-module -Version: v0.10.13 -Patch: - openssl-1.1.0.patch - discover-luajit-2.1.patch -Files-Excluded: .gitignore .gitattributes .travis.yml .github - -Module: http-upstream-fair -Homepage: https://github.com/gnosek/nginx-upstream-fair -Version: a18b409 -Patch: - dynamic-module.patch - openssl-1.1.0.patch - drop-default-port.patch - -Module: nchan -Homepage: https://github.com/slact/nchan -Version: 1.2.15 -Files-Excluded: dev nchan_logo.png NchanSubscriber.js src/hiredis nchan - -Module: http-uploadprogress -Homepage: https://github.com/masterzen/nginx-upload-progress-module -Files-Excluded: test -Version: 0.9.2 - -Module: http-cache-purge -Homepage: https://github.com/FRiCKLE/ngx_cache_purge/ -Version: 2.3 -Patch: - dynamic-module.patch - segfault-1.11.6.patch - -Module: http-dav-ext -Homepage: https://github.com/arut/nginx-dav-ext-module -Version: 3.0.0 - -Module: http-fancyindex -Homepage: https://github.com/aperezdc/ngx-fancyindex -Version: 0.5.2 -Files-Excluded: .gitignore .travis.yml - -Module: http-subs-filter -Homepage: https://github.com/yaoweibin/ngx_http_substitutions_filter_module -Version: 0.6.4 -Patch: dynamic-module.patch - -Module: rtmp -Homepage: https://github.com/arut/nginx-rtmp-module -Files-Excluded: test -Version: 1.2.2 - diff --git a/debian/modules/http-auth-pam/ChangeLog b/debian/modules/http-auth-pam/ChangeLog deleted file mode 100644 index 5974d79..0000000 --- a/debian/modules/http-auth-pam/ChangeLog +++ /dev/null @@ -1,63 +0,0 @@ -2021-08-23 sto@mixinet.net - - * Version 1.5.3. - * Always load after ngx_http_access_module (patch provided by khimaros, see - https://github.com/sto/ngx_http_auth_pam_module/pull/26) - -2020-06-23 sto@mixinet.net - - * Version 1.5.2. - * Log authentication errors as errors instead of debug (patch provided by - Juha Koho, see https://github.com/sto/ngx_http_auth_pam_module/pull/11) - * Send client IP address to PAM (patch provided by Marcin Łojewski, see - https://github.com/sto/ngx_http_auth_pam_module/pull/14) - -2016-04-06 sto@iti.es - - * Version 1.5.1. - * Fix building alongside other modules in nginx 1.9.11+ (patch provided by - Graham Edgecombe ) - -2016-03-23 sto@iti.es - - * Version 1.5. - * Added support to build module dynamically (patch provided by Sjir - Bagmeijer ). - * Log PAM error and info messages to nginx log files (patch provided by - André Caron ). - -2015-02-04 sto@iti.es - - * Version 1.4. - * Cleanup PAM responses on error, the module was not doing it, causing - memory leaks (thanks to Michael Koziarski for the report). - -2013-09-17 sto@iti.es - - * Version 1.3. - * Added support to export HOST and REQUEST variables to the PAM ENVIRONMENT. - Thanks to Ruben Jenster for the initial patch, his version is available - from https://github.com/r10r/ngx_http_auth_pam_module; my version uses his - implementation but only if the user sets the ``pam_auth_set_pam_env`` - flag. - * Fixed bug from http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=+721702 - (ngx_module_t commands array should end with a ngx_null_command); the bug - was already fixed on the PAM_ENV patch, but I forgot about it until I went - back to my svn repository to add the debian patch... better latter than - never... ;) - -2010-11-15 sto@iti.upv.es - - * Version 1.2. - * Fixed possible memory leak when authentication fails, pam_end has to - be called to free memory (thanks to Neil Chintomby). - -2009-01-26 sto@iti.upv.es - - * Version 1.1. - * Fixed ngx_log_debugX calls, no we use the correct X value on each - call. - -2008-09-17 sto@iti.upv.es - - * Initial version (1.0). diff --git a/debian/modules/http-auth-pam/README.md b/debian/modules/http-auth-pam/README.md deleted file mode 100644 index 975bafe..0000000 --- a/debian/modules/http-auth-pam/README.md +++ /dev/null @@ -1,95 +0,0 @@ -# ngx_http_auth_pam_module - -## Nginx module to use PAM for simple http authentication - -### Compilation - -When compiling from source build as usual adding the ``--add-module`` option: - - ./configure --add-module=$PATH_TO_MODULE - -or if you want to build the module as dynamic use the ``--add-dynamic-module`` -option. - -If you are using a Debian GNU/Linux distribution install the ``nginx-full`` -package; the module has been included in the debian package since version -``1.1.6-1``, so it is available on all stable distributions since the *wheezy* -release. - -### Configuration - -The module only has two directives: - -- ``auth_pam``: This is the http authentication realm. If given the value - ``off`` the module is disabled (needed when we want to override the value - set on a lower-level directive). - -- ``auth_pam_service_name``: this is the PAM service name and by default it is - set to ``nginx``. - -### Examples - -To protect everything under ``/secure`` you will add the following to the -``nginx.conf`` file: - - location /secure { - auth_pam "Secure Zone"; - auth_pam_service_name "nginx"; - } - -Note that the module runs as the web server user, so the PAM modules used must -be able to authenticate the users without being root; that means that if you -want to use the ``pam_unix.so`` module to autenticate users you need to let the -web server user to read the ``/etc/shadow`` file if that does not scare you (on -Debian like systems you can add the ``www-data`` user to the ``shadow`` group). - -As an example, to authenticate users against an LDAP server (using the -``pam_ldap.so`` module) you will use an ``/etc/pam.d/nginx`` like the -following: - - auth required /lib/security/pam_ldap.so - account required /lib/security/pam_ldap.so - -If you also want to limit the users from LDAP that can authenticate you can -use the ``pam_listfile.so`` module; to limit who can access resources under -``/restricted`` add the following to the ``nginx.conf`` file: - - location /restricted { - auth_pam "Restricted Zone"; - auth_pam_service_name "nginx_restricted"; - } - -Use the following ``/etc/pam.d/nginx_restricted`` file: - - auth required /lib/security/pam_listfile.so onerr=fail item=user \ - sense=allow file=/etc/nginx/restricted_users - auth required /lib/security/pam_ldap.so - account required /lib/security/pam_ldap.so - -And add the users allowed to authenticate to the ``/etc/nginx/restricted_users`` -(remember that the web server user has to be able to read this file). - -### PAM Environment - -If you want use the ``pam_exec.so`` plugin for request based authentication the -module can add to the PAM environment the ``HOST`` and ``REQUEST`` variables if -you set the ``auth_pam_set_pam_env`` flag:: - - location /pam_exec_protected { - auth_pam "Exec Zone"; - auth_pam_service_name "nginx_exec"; - auth_pam_set_pam_env on; - } - -With this configuration if you access an URL like: - - http://localhost:8000/pam_exec_protected/page?foo=yes&bar=too - -the PAM environment will include the following variables: - - HOST=localhost:8000 - REQUEST=GET /pam_exec_protected/page?foo=yes&bar=too HTTP/1.1 - -You may use this information for request based authentication. -You need a recent pam release (>= version 1.0.90) to expose environment -variables to pam_exec. diff --git a/debian/modules/http-auth-pam/VERSION b/debian/modules/http-auth-pam/VERSION deleted file mode 100644 index 8af85be..0000000 --- a/debian/modules/http-auth-pam/VERSION +++ /dev/null @@ -1 +0,0 @@ -1.5.3 diff --git a/debian/modules/http-auth-pam/config b/debian/modules/http-auth-pam/config deleted file mode 100644 index 6965eea..0000000 --- a/debian/modules/http-auth-pam/config +++ /dev/null @@ -1,17 +0,0 @@ -ngx_addon_name=ngx_http_auth_pam_module - -if test -n "$ngx_module_link"; then - ngx_module_type=HTTP - ngx_module_name=ngx_http_auth_pam_module - ngx_module_incs= - ngx_module_deps= - ngx_module_srcs="$ngx_addon_dir/ngx_http_auth_pam_module.c" - ngx_module_libs="-lpam" - ngx_module_order="$ngx_module_name ngx_http_access_module" - - . auto/module -else - HTTP_MODULES="$HTTP_MODULES ngx_http_auth_pam_module" - NGX_ADDON_SRCS="$NGX_ADDON_SRCS $ngx_addon_dir/ngx_http_auth_pam_module.c" - CORE_LIBS="$CORE_LIBS -lpam" -fi diff --git a/debian/modules/http-auth-pam/ngx_http_auth_pam_module.c b/debian/modules/http-auth-pam/ngx_http_auth_pam_module.c deleted file mode 100644 index 55eeb92..0000000 --- a/debian/modules/http-auth-pam/ngx_http_auth_pam_module.c +++ /dev/null @@ -1,482 +0,0 @@ -/* - * Copyright (C) 2008-2020 Sergio Talens-Oliag - * - * Based on nginx's 'ngx_http_auth_basic_module.c' by Igor Sysoev and apache's - * 'mod_auth_pam.c' by Ingo Luetkebolhe. - * - * File: ngx_http_auth_pam_module.c - */ - -#include -#include -#include -#include - -#define NGX_PAM_SERVICE_NAME "nginx" - -/* Module context data */ -typedef struct { - ngx_str_t passwd; -} ngx_http_auth_pam_ctx_t; - -/* PAM authinfo */ -typedef struct { - ngx_str_t username; - ngx_str_t password; - ngx_log_t *log; -} ngx_pam_authinfo; - -/* Module configuration struct */ -typedef struct { - ngx_str_t realm; /* http basic auth realm */ - ngx_str_t service_name; /* pam service name */ - ngx_flag_t set_pam_env; /* flag that indicates if we should export - variables to PAM or NOT */ -} ngx_http_auth_pam_loc_conf_t; - -/* Module handler */ -static ngx_int_t ngx_http_auth_pam_handler(ngx_http_request_t *r); - -/* Function that authenticates the user -- is the only function that uses PAM */ -static ngx_int_t ngx_http_auth_pam_authenticate(ngx_http_request_t *r, - ngx_http_auth_pam_ctx_t *ctx, - ngx_str_t *passwd, void *conf); - -static ngx_int_t ngx_http_auth_pam_set_realm(ngx_http_request_t *r, - ngx_str_t *realm); - -static void *ngx_http_auth_pam_create_loc_conf(ngx_conf_t *cf); - -static char *ngx_http_auth_pam_merge_loc_conf(ngx_conf_t *cf, - void *parent, void *child); - -static ngx_int_t ngx_http_auth_pam_init(ngx_conf_t *cf); - -static char *ngx_http_auth_pam(ngx_conf_t *cf, void *post, void *data); - -static ngx_conf_post_handler_pt ngx_http_auth_pam_p = ngx_http_auth_pam; - -static int ngx_auth_pam_talker(int num_msg, const struct pam_message ** msg, - struct pam_response ** resp, void *appdata_ptr); - -static ngx_command_t ngx_http_auth_pam_commands[] = { - - { ngx_string("auth_pam"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LMT_CONF - |NGX_CONF_TAKE1, - ngx_conf_set_str_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_auth_pam_loc_conf_t, realm), - &ngx_http_auth_pam_p }, - - { ngx_string("auth_pam_service_name"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LMT_CONF - |NGX_CONF_TAKE1, - ngx_conf_set_str_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_auth_pam_loc_conf_t, service_name), - NULL }, - - { ngx_string("auth_pam_set_pam_env"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LMT_CONF - |NGX_CONF_FLAG, - ngx_conf_set_flag_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_auth_pam_loc_conf_t, set_pam_env), - NULL }, - - ngx_null_command -}; - - -static ngx_http_module_t ngx_http_auth_pam_module_ctx = { - NULL, /* preconfiguration */ - ngx_http_auth_pam_init, /* postconfiguration */ - - NULL, /* create main configuration */ - NULL, /* init main configuration */ - - NULL, /* create server configuration */ - NULL, /* merge server configuration */ - - ngx_http_auth_pam_create_loc_conf, /* create location configuration */ - ngx_http_auth_pam_merge_loc_conf /* merge location configuration */ -}; - - -ngx_module_t ngx_http_auth_pam_module = { - NGX_MODULE_V1, - &ngx_http_auth_pam_module_ctx, /* module context */ - ngx_http_auth_pam_commands, /* module directives */ - NGX_HTTP_MODULE, /* module type */ - NULL, /* init master */ - NULL, /* init module */ - NULL, /* init process */ - NULL, /* init thread */ - NULL, /* exit thread */ - NULL, /* exit process */ - NULL, /* exit master */ - NGX_MODULE_V1_PADDING -}; - - -/* - * Function to free PAM_CONV responses if an error is returned. - */ -static void -free_resp(int num_msg, struct pam_response *response) -{ - int i; - if (response == NULL) - return; - for (i = 0; i < num_msg; i++) { - if (response[i].resp) { - /* clear before freeing -- may be a password */ - bzero(response[i].resp, strlen(response[i].resp)); - free(response[i].resp); - response[i].resp = NULL; - } - } - free(response); -} - -/* - * ngx_auth_pam_talker: supply authentication information to PAM when asked - * - * Assumptions: - * A password is asked for by requesting input without echoing - * A username is asked for by requesting input _with_ echoing - */ -static int -ngx_auth_pam_talker(int num_msg, const struct pam_message ** msg, - struct pam_response ** resp, void *appdata_ptr) -{ - int i; - ngx_pam_authinfo *ainfo; - struct pam_response *response; - - ainfo = (ngx_pam_authinfo *) appdata_ptr; - response = NULL; - - /* parameter sanity checking */ - if (!resp || !msg || !ainfo) - return PAM_CONV_ERR; - - /* allocate memory to store response */ - response = malloc(num_msg * sizeof(struct pam_response)); - if (!response) - return PAM_CONV_ERR; - - /* copy values */ - for (i = 0; i < num_msg; i++) { - /* initialize to safe values */ - response[i].resp_retcode = 0; - response[i].resp = 0; - - /* select response based on requested output style */ - switch (msg[i]->msg_style) { - case PAM_PROMPT_ECHO_ON: - /* on memory allocation failure, auth fails */ - response[i].resp = strdup((const char *)ainfo->username.data); - break; - case PAM_PROMPT_ECHO_OFF: - response[i].resp = strdup((const char *)ainfo->password.data); - break; - case PAM_ERROR_MSG: - ngx_log_error(NGX_LOG_ERR, ainfo->log, 0, - "PAM: \'%s\'.", msg[i]->msg); - break; - case PAM_TEXT_INFO: - ngx_log_error(NGX_LOG_INFO, ainfo->log, 0, - "PAM: \'%s\'.", msg[i]->msg); - break; - default: - free_resp(i, response); - return PAM_CONV_ERR; - } - } - /* everything okay, set PAM response values */ - *resp = response; - return PAM_SUCCESS; -} - -static ngx_int_t -ngx_http_auth_pam_handler(ngx_http_request_t *r) -{ - ngx_int_t rc; - ngx_http_auth_pam_ctx_t *ctx; - ngx_http_auth_pam_loc_conf_t *alcf; - - alcf = ngx_http_get_module_loc_conf(r, ngx_http_auth_pam_module); - - if (alcf->realm.len == 0) { - return NGX_DECLINED; - } - - ctx = ngx_http_get_module_ctx(r, ngx_http_auth_pam_module); - - if (ctx) { - return ngx_http_auth_pam_authenticate(r, ctx, &ctx->passwd, alcf); - } - - /* Decode http auth user and passwd, leaving values on the request */ - rc = ngx_http_auth_basic_user(r); - - if (rc == NGX_DECLINED) { - return ngx_http_auth_pam_set_realm(r, &alcf->realm); - } - - if (rc == NGX_ERROR) { - return NGX_HTTP_INTERNAL_SERVER_ERROR; - } - - /* Check user & password using PAM */ - return ngx_http_auth_pam_authenticate(r, ctx, &ctx->passwd, alcf); -} - -/** - * create a key value pair from the given key and value string - */ -static void set_to_pam_env(pam_handle_t *pamh, ngx_http_request_t *r, - char *key, char *value) -{ - if (key != NULL && value != NULL) { - size_t size = strlen(key) + strlen(value) + 1 * sizeof(char); - char *key_value_pair = ngx_palloc(r->pool, size); - sprintf(key_value_pair, "%s=%s", key, value); - - pam_putenv(pamh, key_value_pair); - } -} - -/** - * creates a '\0' terminated string from the given ngx_str_t - * - * @param source nginx string structure with data and length - * @param pool pool of the request used for memory allocation - */ -static char* ngx_strncpy_s(ngx_str_t source, ngx_pool_t *pool) -{ - // allocate memory in pool - char* destination = ngx_palloc(pool, source.len + 1); - strncpy(destination, (char *) source.data, source.len); - // add null terminator - destination[source.len] = '\0'; - return destination; -} - -/** - * enrich pam environment with request parameters - */ -static void add_request_info_to_pam_env(pam_handle_t *pamh, - ngx_http_request_t *r) -{ - char *request_info = ngx_strncpy_s(r->request_line, r->pool); - char *host_info = ngx_strncpy_s(r->headers_in.host->value, r->pool); - - set_to_pam_env(pamh, r, "REQUEST", request_info); - set_to_pam_env(pamh, r, "HOST", host_info); -} - -static ngx_int_t -ngx_http_auth_pam_authenticate(ngx_http_request_t *r, - ngx_http_auth_pam_ctx_t *ctx, ngx_str_t *passwd, - void *conf) -{ - ngx_int_t rc; - ngx_http_auth_pam_loc_conf_t *alcf; - - ngx_pam_authinfo ainfo; - struct pam_conv conv_info; /* PAM struct */ - pam_handle_t *pamh; - u_char *service_name; - - alcf = conf; - - size_t len; - u_char *uname_buf, *p; - - /** - * Get username and password, note that r->headers_in.user contains the - * string 'user:pass', so we need to copy the username - **/ - for (len = 0; len < r->headers_in.user.len; len++) { - if (r->headers_in.user.data[len] == ':') { - break; - } - } - uname_buf = ngx_palloc(r->pool, len+1); - if (uname_buf == NULL) { - return NGX_HTTP_INTERNAL_SERVER_ERROR; - } - p = ngx_cpymem(uname_buf, r->headers_in.user.data , len); - *p ='\0'; - - ainfo.username.data = uname_buf; - ainfo.username.len = len; - - ainfo.password.data = r->headers_in.passwd.data; - ainfo.password.len = r->headers_in.passwd.len; - - ainfo.log = r->connection->log; - - conv_info.conv = &ngx_auth_pam_talker; - conv_info.appdata_ptr = (void *) &ainfo; - - pamh = NULL; - - /* Initialize PAM */ - if (alcf->service_name.data == NULL) { - service_name = (u_char *) NGX_PAM_SERVICE_NAME; - } else { - service_name = alcf->service_name.data; - } - if ((rc = pam_start((const char *) service_name, - (const char *) ainfo.username.data, - &conv_info, - &pamh)) != PAM_SUCCESS) { - ngx_log_error(NGX_LOG_CRIT, r->connection->log, 0, - "PAM: Could not start pam service: %s", - pam_strerror(pamh, rc)); - return NGX_HTTP_INTERNAL_SERVER_ERROR; - } - - /* send client IP address to PAM */ - char *client_ip_addr = ngx_strncpy_s(r->connection->addr_text, r->pool); - if ((rc = pam_set_item(pamh, PAM_RHOST, client_ip_addr)) != PAM_SUCCESS) { - ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "PAM: Could not set item PAM_RHOST: %s", - pam_strerror(pamh, rc)); - return NGX_HTTP_INTERNAL_SERVER_ERROR; - } - - if (alcf->set_pam_env) { - add_request_info_to_pam_env(pamh, r); - } - - /* try to authenticate user, log error on failure */ - if ((rc = pam_authenticate(pamh, - PAM_DISALLOW_NULL_AUTHTOK)) != PAM_SUCCESS) { - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "PAM: user '%s' - not authenticated: %s", - ainfo.username.data, pam_strerror(pamh, rc)); - pam_end(pamh, PAM_SUCCESS); - return ngx_http_auth_pam_set_realm(r, &alcf->realm); - } /* endif authenticate */ - - /* check that the account is healthy */ - if ((rc = pam_acct_mgmt(pamh, PAM_DISALLOW_NULL_AUTHTOK)) != PAM_SUCCESS) { - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "PAM: user '%s' - invalid account: %s", - ainfo.username.data, pam_strerror(pamh, rc)); - pam_end(pamh, PAM_SUCCESS); - return ngx_http_auth_pam_set_realm(r, &alcf->realm); - } - - pam_end(pamh, PAM_SUCCESS); - return NGX_OK; -} - -static ngx_int_t -ngx_http_auth_pam_set_realm(ngx_http_request_t *r, ngx_str_t *realm) -{ - r->headers_out.www_authenticate = ngx_list_push(&r->headers_out.headers); - if (r->headers_out.www_authenticate == NULL) { - return NGX_HTTP_INTERNAL_SERVER_ERROR; - } - - r->headers_out.www_authenticate->hash = 1; - r->headers_out.www_authenticate->key.len = sizeof("WWW-Authenticate") - 1; - r->headers_out.www_authenticate->key.data = (u_char *) "WWW-Authenticate"; - r->headers_out.www_authenticate->value = *realm; - - return NGX_HTTP_UNAUTHORIZED; -} - -static void * -ngx_http_auth_pam_create_loc_conf(ngx_conf_t *cf) -{ - ngx_http_auth_pam_loc_conf_t *conf; - - conf = ngx_pcalloc(cf->pool, sizeof(ngx_http_auth_pam_loc_conf_t)); - if (conf == NULL) { - return NGX_CONF_ERROR; - } - - /* Strings are already NULL, but the flags have to be marked as unset */ - conf->set_pam_env = NGX_CONF_UNSET; - - return conf; -} - -static char * -ngx_http_auth_pam_merge_loc_conf(ngx_conf_t *cf, void *parent, void *child) -{ - ngx_http_auth_pam_loc_conf_t *prev = parent; - ngx_http_auth_pam_loc_conf_t *conf = child; - - if (conf->realm.data == NULL) { - conf->realm = prev->realm; - } - - if (conf->service_name.data == NULL) { - conf->service_name = prev->service_name; - } - - /* By default set_pam_env is off */ - ngx_conf_merge_value(conf->set_pam_env, prev->set_pam_env, 0); - - return NGX_CONF_OK; -} - -static ngx_int_t -ngx_http_auth_pam_init(ngx_conf_t *cf) -{ - ngx_http_handler_pt *h; - ngx_http_core_main_conf_t *cmcf; - - cmcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_core_module); - - h = ngx_array_push(&cmcf->phases[NGX_HTTP_ACCESS_PHASE].handlers); - if (h == NULL) { - return NGX_ERROR; - } - - *h = ngx_http_auth_pam_handler; - - return NGX_OK; -} - -static char * -ngx_http_auth_pam(ngx_conf_t *cf, void *post, void *data) -{ - ngx_str_t *realm = data; - - size_t len; - u_char *basic, *p; - - if (ngx_strcmp(realm->data, "off") == 0) { - realm->len = 0; - realm->data = (u_char *) ""; - - return NGX_CONF_OK; - } - - len = sizeof("Basic realm=\"") - 1 + realm->len + 1; - - basic = ngx_palloc(cf->pool, len); - if (basic == NULL) { - return NGX_CONF_ERROR; - } - - p = ngx_cpymem(basic, "Basic realm=\"", sizeof("Basic realm=\"") - 1); - p = ngx_cpymem(p, realm->data, realm->len); - *p = '"'; - - realm->len = len; - realm->data = basic; - - return NGX_CONF_OK; -} - -/* File: ngx_http_auth_pam_module.c */ diff --git a/debian/modules/http-cache-purge/README.md b/debian/modules/http-cache-purge/README.md deleted file mode 100644 index 3b42e32..0000000 --- a/debian/modules/http-cache-purge/README.md +++ /dev/null @@ -1,171 +0,0 @@ -About -===== -`ngx_cache_purge` is `nginx` module which adds ability to purge content from -`FastCGI`, `proxy`, `SCGI` and `uWSGI` caches. - - -Sponsors -======== -Work on the original patch was fully funded by [yo.se](http://yo.se). - - -Status -====== -This module is production-ready. - - -Configuration directives (same location syntax) -=============================================== -fastcgi_cache_purge -------------------- -* **syntax**: `fastcgi_cache_purge on|off| [from all| [.. ]]` -* **default**: `none` -* **context**: `http`, `server`, `location` - -Allow purging of selected pages from `FastCGI`'s cache. - - -proxy_cache_purge ------------------ -* **syntax**: `proxy_cache_purge on|off| [from all| [.. ]]` -* **default**: `none` -* **context**: `http`, `server`, `location` - -Allow purging of selected pages from `proxy`'s cache. - - -scgi_cache_purge ----------------- -* **syntax**: `scgi_cache_purge on|off| [from all| [.. ]]` -* **default**: `none` -* **context**: `http`, `server`, `location` - -Allow purging of selected pages from `SCGI`'s cache. - - -uwsgi_cache_purge ------------------ -* **syntax**: `uwsgi_cache_purge on|off| [from all| [.. ]]` -* **default**: `none` -* **context**: `http`, `server`, `location` - -Allow purging of selected pages from `uWSGI`'s cache. - - -Configuration directives (separate location syntax) -=================================================== -fastcgi_cache_purge -------------------- -* **syntax**: `fastcgi_cache_purge zone_name key` -* **default**: `none` -* **context**: `location` - -Sets area and key used for purging selected pages from `FastCGI`'s cache. - - -proxy_cache_purge ------------------ -* **syntax**: `proxy_cache_purge zone_name key` -* **default**: `none` -* **context**: `location` - -Sets area and key used for purging selected pages from `proxy`'s cache. - - -scgi_cache_purge ----------------- -* **syntax**: `scgi_cache_purge zone_name key` -* **default**: `none` -* **context**: `location` - -Sets area and key used for purging selected pages from `SCGI`'s cache. - - -uwsgi_cache_purge ------------------ -* **syntax**: `uwsgi_cache_purge zone_name key` -* **default**: `none` -* **context**: `location` - -Sets area and key used for purging selected pages from `uWSGI`'s cache. - - -Sample configuration (same location syntax) -=========================================== - http { - proxy_cache_path /tmp/cache keys_zone=tmpcache:10m; - - server { - location / { - proxy_pass http://127.0.0.1:8000; - proxy_cache tmpcache; - proxy_cache_key $uri$is_args$args; - proxy_cache_purge PURGE from 127.0.0.1; - } - } - } - - -Sample configuration (separate location syntax) -=============================================== - http { - proxy_cache_path /tmp/cache keys_zone=tmpcache:10m; - - server { - location / { - proxy_pass http://127.0.0.1:8000; - proxy_cache tmpcache; - proxy_cache_key $uri$is_args$args; - } - - location ~ /purge(/.*) { - allow 127.0.0.1; - deny all; - proxy_cache_purge tmpcache $1$is_args$args; - } - } - } - - -Testing -======= -`ngx_cache_purge` comes with complete test suite based on [Test::Nginx](http://github.com/agentzh/test-nginx). - -You can test it by running: - -`$ prove` - - -License -======= - Copyright (c) 2009-2014, FRiCKLE - Copyright (c) 2009-2014, Piotr Sikora - All rights reserved. - - This project was fully funded by yo.se. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions - are met: - 1. Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - 2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - -See also -======== -- [ngx_slowfs_cache](http://github.com/FRiCKLE/ngx_slowfs_cache). diff --git a/debian/modules/http-cache-purge/TODO.md b/debian/modules/http-cache-purge/TODO.md deleted file mode 100644 index e279043..0000000 --- a/debian/modules/http-cache-purge/TODO.md +++ /dev/null @@ -1,7 +0,0 @@ -Features that __will not__ be added to `ngx_cache_purge`: - -* Support for prefixed purges (`/purge/images/*`). - Reason: Impossible with current cache implementation. - -* Support for wildcard/regex purges (`/purge/*.jpg`). - Reason: Impossible with current cache implementation. diff --git a/debian/modules/http-dav-ext/LICENSE b/debian/modules/http-dav-ext/LICENSE deleted file mode 100644 index c68a7d4..0000000 --- a/debian/modules/http-dav-ext/LICENSE +++ /dev/null @@ -1,22 +0,0 @@ -Copyright (C) 2012-2018 Roman Arutyunyan -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. -2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR -ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/debian/modules/http-dav-ext/README.rst b/debian/modules/http-dav-ext/README.rst deleted file mode 100644 index 092056e..0000000 --- a/debian/modules/http-dav-ext/README.rst +++ /dev/null @@ -1,188 +0,0 @@ -******************** -nginx-dav-ext-module -******************** - -nginx_ WebDAV_ PROPFIND,OPTIONS,LOCK,UNLOCK support. - -.. contents:: - - -About -===== - -The standard ngx_http_dav_module_ provides partial WebDAV_ implementation and -only supports GET,HEAD,PUT,DELETE,MKCOL,COPY,MOVE methods. - -For full WebDAV_ support in nginx_ you need to enable the standard -ngx_http_dav_module_ as well as this module for the missing methods. - - -Build -===== - -Building nginx_ with the module: - -.. code-block:: bash - - # static module - $ ./configure --with-http_dav_module --add-module=/path/to/nginx-dav-ext-module - - # dynamic module - $ ./configure --with-http_dav_module --add-dynamic-module=/path/to/nginx-dav-ext-module - -Trying to compile nginx_ with this module but without ngx_http_dav_module_ will -result in compilation error. - - -Requirements -============ - -- nginx_ version >= 1.13.4 -- ``libxml2`` + ``libxslt`` - -The ``libxslt`` library is technically redundant and is only required since this -combination is supported by nginx_ for the xslt module. -Using builtin nginx mechanisms for linking against third-party libraries -brings certain compatibility benefits. -However this redundancy can be easily eliminated in the ``config`` file. - - -Testing -======= - -The module tests require standard nginx-tests_ and Perl ``HTTP::DAV`` library. - -.. code-block:: bash - - $ export PERL5LIB=/path/to/nginx-tests/lib - $ export TEST_NGINX_BINARY=/path/to/nginx - $ prove t - - -Locking -======= - -- Only the exclusive write locks are supported, which is the only type of locks - described in the WebDAV_ specification. - -- All currently held locks are kept in a list. - Checking if an object is constrained by a lock requires O(n) operations. - A huge number of simultaneously held locks may degrade performance. - Thus it is not recommended to have a large lock timeout which would increase - the number of locks. - - -Directives -========== - -dav_ext_methods ---------------- - -========== ==== -*Syntax:* ``dav_ext_methods [PROPFIND] [OPTIONS] [LOCK] [UNLOCK]`` -*Context:* http, server, location -========== ==== - -Enables support for the specified WebDAV methods in the current scope. - -dav_ext_lock_zone ------------------ - -========== ==== -*Syntax:* ``dav_ext_lock_zone zone=NAME:SIZE [timeout=TIMEOUT]`` -*Context:* http -========== ==== - -Defines a shared zone for WebDAV locks with specified NAME and SIZE. -Also, defines a lock expiration TIMEOUT. -Default lock timeout value is 1 minute. - - -dav_ext_lock ------------- - -========== ==== -*Syntax:* ``dav_ext_lock zone=NAME`` -*Context:* http, server, location -========== ==== - -Enables WebDAV locking in the specified scope. -Locks are stored in the shared zone specified by NAME. -This zone must be defined with the ``dav_ext_lock_zone`` directive. - -Note that even though this directive enables locking capabilities in the -current scope, HTTP methods LOCK and UNLOCK should also be explicitly specified -in the ``dav_ext_methods``. - - -Example 1 -========= - -Simple lockless example:: - - location / { - root /data/www; - - dav_methods PUT DELETE MKCOL COPY MOVE; - dav_ext_methods PROPFIND OPTIONS; - } - - -Example 2 -========= - -WebDAV with locking:: - - http { - dav_ext_lock_zone zone=foo:10m; - - ... - - server { - ... - - location / { - root /data/www; - - dav_methods PUT DELETE MKCOL COPY MOVE; - dav_ext_methods PROPFIND OPTIONS LOCK UNLOCK; - dav_ext_lock zone=foo; - } - } - } - - -Example 3 -========= - -WebDAV with locking which works with MacOS client:: - - http { - dav_ext_lock_zone zone=foo:10m; - - ... - - server { - ... - - location / { - root /data/www; - - # enable creating directories without trailing slash - set $x $uri$request_method; - if ($x ~ [^/]MKCOL$) { - rewrite ^(.*)$ $1/; - } - - dav_methods PUT DELETE MKCOL COPY MOVE; - dav_ext_methods PROPFIND OPTIONS LOCK UNLOCK; - dav_ext_lock zone=foo; - } - } - } - -.. _ngx_http_dav_module: http://nginx.org/en/docs/http/ngx_http_dav_module.html -.. _nginx-tests: http://hg.nginx.org/nginx-tests -.. _nginx: http://nginx.org -.. _WebDAV: https://tools.ietf.org/html/rfc4918 -.. _`RFC4918 If Header`: https://tools.ietf.org/html/rfc4918#section-10.4 diff --git a/debian/modules/http-dav-ext/config b/debian/modules/http-dav-ext/config deleted file mode 100644 index 91ae1b3..0000000 --- a/debian/modules/http-dav-ext/config +++ /dev/null @@ -1,17 +0,0 @@ -ngx_addon_name=ngx_http_dav_ext_module - -ngx_module_type=HTTP -ngx_module_name=ngx_http_dav_ext_module - -# nginx has robust builtin support for linking against -# libxml2+libxslt. This is definitelty the right way to go if -# building nginx with the xslt module, in which case libxslt will -# be linked anyway. In other cases libxslt is just redundant. -# If that's a big deal, libxml2 can be linked directly: -# ngx_module_libs=-lxml2 - -ngx_module_libs=LIBXSLT - -ngx_module_srcs="$ngx_addon_dir/ngx_http_dav_ext_module.c" - -. auto/module diff --git a/debian/modules/http-dav-ext/ngx_http_dav_ext_module.c b/debian/modules/http-dav-ext/ngx_http_dav_ext_module.c deleted file mode 100644 index 0d6d067..0000000 --- a/debian/modules/http-dav-ext/ngx_http_dav_ext_module.c +++ /dev/null @@ -1,2181 +0,0 @@ - -/* - * Copyright (C) Roman Arutyunyan - */ - - -#include -#include -#include -#include - - -#define NGX_HTTP_DAV_EXT_OFF 2 - -#define NGX_HTTP_DAV_EXT_PREALLOCATE 50 - -#define NGX_HTTP_DAV_EXT_NODE_PROPFIND 0x01 -#define NGX_HTTP_DAV_EXT_NODE_PROP 0x02 -#define NGX_HTTP_DAV_EXT_NODE_PROPNAME 0x04 -#define NGX_HTTP_DAV_EXT_NODE_ALLPROP 0x08 - -#define NGX_HTTP_DAV_EXT_PROP_DISPLAYNAME 0x01 -#define NGX_HTTP_DAV_EXT_PROP_GETCONTENTLENGTH 0x02 -#define NGX_HTTP_DAV_EXT_PROP_GETLASTMODIFIED 0x04 -#define NGX_HTTP_DAV_EXT_PROP_RESOURCETYPE 0x08 -#define NGX_HTTP_DAV_EXT_PROP_LOCKDISCOVERY 0x10 -#define NGX_HTTP_DAV_EXT_PROP_SUPPORTEDLOCK 0x20 - -#define NGX_HTTP_DAV_EXT_PROP_ALL 0x7f -#define NGX_HTTP_DAV_EXT_PROP_NAMES 0x80 - - -typedef struct { - ngx_str_t uri; - ngx_str_t name; - time_t mtime; - off_t size; - - time_t lock_expire; - ngx_str_t lock_root; - uint32_t lock_token; - - unsigned dir:1; - unsigned lock_supported:1; - unsigned lock_infinite:1; -} ngx_http_dav_ext_entry_t; - - -typedef struct { - ngx_uint_t nodes; - ngx_uint_t props; -} ngx_http_dav_ext_xml_ctx_t; - - -typedef struct { - ngx_uint_t methods; - ngx_shm_zone_t *shm_zone; -} ngx_http_dav_ext_loc_conf_t; - - -typedef struct { - ngx_queue_t queue; - uint32_t token; - time_t expire; - ngx_uint_t infinite; /* unsigned infinite:1; */ - size_t len; - u_char data[1]; -} ngx_http_dav_ext_node_t; - - -typedef struct { - ngx_queue_t queue; -} ngx_http_dav_ext_lock_sh_t; - - -typedef struct { - time_t timeout; - ngx_slab_pool_t *shpool; - ngx_http_dav_ext_lock_sh_t *sh; -} ngx_http_dav_ext_lock_t; - - -static ngx_int_t ngx_http_dav_ext_precontent_handler(ngx_http_request_t *r); -static ngx_int_t ngx_http_dav_ext_strip_uri(ngx_http_request_t *r, - ngx_str_t *uri); -static ngx_int_t ngx_http_dav_ext_verify_lock(ngx_http_request_t *r, - ngx_str_t *uri, ngx_uint_t delete_lock); -static ngx_http_dav_ext_node_t *ngx_http_dav_ext_lock_lookup( - ngx_http_request_t *r, ngx_http_dav_ext_lock_t *lock, ngx_str_t *uri, - ngx_int_t depth); - -static ngx_int_t ngx_http_dav_ext_content_handler(ngx_http_request_t *r); -static void ngx_http_dav_ext_propfind_handler(ngx_http_request_t *r); -static void ngx_http_dav_ext_propfind_xml_start(void *data, - const xmlChar *localname, const xmlChar *prefix, const xmlChar *uri, - int nb_namespaces, const xmlChar **namespaces, int nb_attributes, - int nb_defaulted, const xmlChar **attributes); -static void ngx_http_dav_ext_propfind_xml_end(void *data, - const xmlChar *localname, const xmlChar *prefix, const xmlChar *uri); -static ngx_int_t ngx_http_dav_ext_propfind(ngx_http_request_t *r, - ngx_uint_t props); -static ngx_int_t ngx_http_dav_ext_set_locks(ngx_http_request_t *r, - ngx_http_dav_ext_entry_t *entry); -static ngx_int_t ngx_http_dav_ext_propfind_response(ngx_http_request_t *r, - ngx_array_t *entries, ngx_uint_t props); -static ngx_int_t ngx_http_dav_ext_lock_handler(ngx_http_request_t *r); -static ngx_int_t ngx_http_dav_ext_lock_response(ngx_http_request_t *r, - ngx_uint_t status, time_t timeout, ngx_uint_t depth, uint32_t token); -static ngx_int_t ngx_http_dav_ext_unlock_handler(ngx_http_request_t *r); - -static ngx_int_t ngx_http_dav_ext_depth(ngx_http_request_t *r, - ngx_int_t default_depth); -static uint32_t ngx_http_dav_ext_lock_token(ngx_http_request_t *r); -static uint32_t ngx_http_dav_ext_if(ngx_http_request_t *r, ngx_str_t *uri); -static uintptr_t ngx_http_dav_ext_format_propfind(ngx_http_request_t *r, - u_char *dst, ngx_http_dav_ext_entry_t *entry, ngx_uint_t props); -static uintptr_t ngx_http_dav_ext_format_lockdiscovery(ngx_http_request_t *r, - u_char *dst, ngx_http_dav_ext_entry_t *entry); -static uintptr_t ngx_http_dav_ext_format_token(u_char *dst, uint32_t token, - ngx_uint_t brackets); - -static ngx_int_t ngx_http_dav_ext_init_zone(ngx_shm_zone_t *shm_zone, - void *data); -static void *ngx_http_dav_ext_create_loc_conf(ngx_conf_t *cf); -static char *ngx_http_dav_ext_merge_loc_conf(ngx_conf_t *cf, void *parent, - void *child); -static char *ngx_http_dav_ext_lock_zone(ngx_conf_t *cf, ngx_command_t *cmd, - void *conf); -static char *ngx_http_dav_ext_lock(ngx_conf_t *cf, ngx_command_t *cmd, - void *conf); -static ngx_int_t ngx_http_dav_ext_init(ngx_conf_t *cf); - - -static ngx_conf_bitmask_t ngx_http_dav_ext_methods_mask[] = { - { ngx_string("off"), NGX_HTTP_DAV_EXT_OFF }, - { ngx_string("propfind"), NGX_HTTP_PROPFIND }, - { ngx_string("options"), NGX_HTTP_OPTIONS }, - { ngx_string("lock"), NGX_HTTP_LOCK }, - { ngx_string("unlock"), NGX_HTTP_UNLOCK }, - { ngx_null_string, 0 } -}; - - -static ngx_command_t ngx_http_dav_ext_commands[] = { - - { ngx_string("dav_ext_methods"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE, - ngx_conf_set_bitmask_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_dav_ext_loc_conf_t, methods), - &ngx_http_dav_ext_methods_mask }, - - { ngx_string("dav_ext_lock_zone"), - NGX_HTTP_MAIN_CONF|NGX_CONF_TAKE12, - ngx_http_dav_ext_lock_zone, - 0, - 0, - NULL }, - - { ngx_string("dav_ext_lock"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1, - ngx_http_dav_ext_lock, - NGX_HTTP_LOC_CONF_OFFSET, - 0, - NULL }, - - ngx_null_command -}; - - -static ngx_http_module_t ngx_http_dav_ext_module_ctx = { - NULL, /* preconfiguration */ - ngx_http_dav_ext_init, /* postconfiguration */ - - NULL, /* create main configuration */ - NULL, /* init main configuration */ - - NULL, /* create server configuration */ - NULL, /* merge server configuration */ - - ngx_http_dav_ext_create_loc_conf, /* create location configuration */ - ngx_http_dav_ext_merge_loc_conf, /* merge location configuration */ -}; - - -ngx_module_t ngx_http_dav_ext_module = { - NGX_MODULE_V1, - &ngx_http_dav_ext_module_ctx, /* module context */ - ngx_http_dav_ext_commands, /* module directives */ - NGX_HTTP_MODULE, /* module type */ - NULL, /* init master */ - NULL, /* init module */ - NULL, /* init process */ - NULL, /* init thread */ - NULL, /* exit thread */ - NULL, /* exit process */ - NULL, /* exit master */ - NGX_MODULE_V1_PADDING -}; - - -static ngx_int_t -ngx_http_dav_ext_precontent_handler(ngx_http_request_t *r) -{ - ngx_str_t uri; - ngx_int_t rc; - ngx_uint_t delete_lock; - ngx_table_elt_t *dest; - ngx_http_dav_ext_loc_conf_t *dlcf; - - dlcf = ngx_http_get_module_loc_conf(r, ngx_http_dav_ext_module); - - if (dlcf->shm_zone == NULL) { - return NGX_DECLINED; - } - - if (r->method & (NGX_HTTP_PUT|NGX_HTTP_DELETE|NGX_HTTP_MKCOL|NGX_HTTP_MOVE)) - { - delete_lock = (r->method & (NGX_HTTP_DELETE|NGX_HTTP_MOVE)) ? 1 : 0; - - rc = ngx_http_dav_ext_verify_lock(r, &r->uri, delete_lock); - if (rc != NGX_OK) { - return rc; - } - } - - if (r->method & (NGX_HTTP_MOVE|NGX_HTTP_COPY)) { - dest = r->headers_in.destination; - if (dest == NULL) { - return NGX_DECLINED; - } - - uri.data = dest->value.data; - uri.len = dest->value.len; - - if (ngx_http_dav_ext_strip_uri(r, &uri) != NGX_OK) { - return NGX_DECLINED; - } - - rc = ngx_http_dav_ext_verify_lock(r, &uri, 0); - if (rc != NGX_OK) { - return rc; - } - } - - return NGX_DECLINED; -} - - -static ngx_int_t -ngx_http_dav_ext_strip_uri(ngx_http_request_t *r, ngx_str_t *uri) -{ - u_char *p, *last, *host; - size_t len; - - if (uri->data[0] == '/') { - ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "http dav_ext strip uri:\"%V\" unchanged", uri); - return NGX_OK; - } - - len = r->headers_in.server.len; - - if (len == 0) { - goto failed; - } - -#if (NGX_HTTP_SSL) - - if (r->connection->ssl) { - if (ngx_strncmp(uri->data, "https://", sizeof("https://") - 1) != 0) { - goto failed; - } - - host = uri->data + sizeof("https://") - 1; - - } else -#endif - { - if (ngx_strncmp(uri->data, "http://", sizeof("http://") - 1) != 0) { - goto failed; - } - - host = uri->data + sizeof("http://") - 1; - } - - if (ngx_strncmp(host, r->headers_in.server.data, len) != 0) { - goto failed; - } - - last = uri->data + uri->len; - - for (p = host + len; p != last; p++) { - if (*p == '/') { - ngx_log_debug3(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "http dav_ext strip uri \"%V\" \"%*s\"", - uri, last - p, p); - - uri->data = p; - uri->len = last - p; - - return NGX_OK; - } - } - -failed: - - ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "http dav_ext strip uri \"%V\" failed", uri); - - return NGX_DECLINED; -} - - -static ngx_int_t -ngx_http_dav_ext_verify_lock(ngx_http_request_t *r, ngx_str_t *uri, - ngx_uint_t delete_lock) -{ - uint32_t token; - ngx_http_dav_ext_node_t *node; - ngx_http_dav_ext_lock_t *lock; - ngx_http_dav_ext_loc_conf_t *dlcf; - - ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "http dav_ext verify lock \"%V\"", uri); - - token = ngx_http_dav_ext_if(r, uri); - - dlcf = ngx_http_get_module_loc_conf(r, ngx_http_dav_ext_module); - lock = dlcf->shm_zone->data; - - ngx_shmtx_lock(&lock->shpool->mutex); - - node = ngx_http_dav_ext_lock_lookup(r, lock, uri, -1); - if (node == NULL) { - ngx_shmtx_unlock(&lock->shpool->mutex); - return NGX_OK; - } - - if (token == 0) { - ngx_shmtx_unlock(&lock->shpool->mutex); - return 423; /* Locked */ - } - - if (token != node->token) { - ngx_shmtx_unlock(&lock->shpool->mutex); - return NGX_HTTP_PRECONDITION_FAILED; - } - - /* - * RFC4918: - * If a request causes the lock-root of any lock to become an - * unmapped URL, then the lock MUST also be deleted by that request. - */ - - if (delete_lock && node->len == uri->len) { - ngx_queue_remove(&node->queue); - ngx_slab_free_locked(lock->shpool, node); - } - - ngx_shmtx_unlock(&lock->shpool->mutex); - - return NGX_OK; -} - - -static ngx_http_dav_ext_node_t * -ngx_http_dav_ext_lock_lookup(ngx_http_request_t *r, - ngx_http_dav_ext_lock_t *lock, ngx_str_t *uri, ngx_int_t depth) -{ - time_t now; - ngx_queue_t *q; - ngx_http_dav_ext_node_t *node; - - ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "http dav_ext lock lookup \"%V\"", uri); - - if (uri->len == 0) { - return NULL; - } - - now = ngx_time(); - - while (!ngx_queue_empty(&lock->sh->queue)) { - q = ngx_queue_head(&lock->sh->queue); - node = (ngx_http_dav_ext_node_t *) q; - - if (node->expire >= now) { - break; - } - - ngx_queue_remove(q); - ngx_slab_free_locked(lock->shpool, node); - } - - for (q = ngx_queue_head(&lock->sh->queue); - q != ngx_queue_sentinel(&lock->sh->queue); - q = ngx_queue_next(q)) - { - node = (ngx_http_dav_ext_node_t *) q; - - if (uri->len >= node->len) { - if (ngx_memcmp(uri->data, node->data, node->len)) { - continue; - } - - if (uri->len > node->len) { - if (node->data[node->len - 1] != '/') { - continue; - } - - if (!node->infinite - && ngx_strlchr(uri->data + node->len, - uri->data + uri->len - 1, '/')) - { - continue; - } - } - - ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "http dav_ext lock found \"%*s\"", - node->len, node->data); - - return node; - } - - /* uri->len < node->len */ - - if (depth >= 0) { - if (ngx_memcmp(node->data, uri->data, uri->len)) { - continue; - } - - if (uri->data[uri->len - 1] != '/') { - continue; - } - - if (depth == 0 - && ngx_strlchr(node->data + uri->len, - node->data + node->len - 1, '/')) - { - continue; - } - - ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "http dav_ext lock found \"%*s\"", - node->len, node->data); - - return node; - } - } - - ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "http dav_ext lock not found"); - - return NULL; -} - - -static ngx_int_t -ngx_http_dav_ext_content_handler(ngx_http_request_t *r) -{ - ngx_int_t rc; - ngx_table_elt_t *h; - ngx_http_dav_ext_loc_conf_t *dlcf; - - dlcf = ngx_http_get_module_loc_conf(r, ngx_http_dav_ext_module); - - if (!(r->method & dlcf->methods)) { - return NGX_DECLINED; - } - - switch (r->method) { - - case NGX_HTTP_PROPFIND: - - ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "http dav_ext propfind"); - - rc = ngx_http_read_client_request_body(r, - ngx_http_dav_ext_propfind_handler); - if (rc >= NGX_HTTP_SPECIAL_RESPONSE) { - return rc; - } - - return NGX_DONE; - - case NGX_HTTP_OPTIONS: - - ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "http dav_ext options"); - - rc = ngx_http_discard_request_body(r); - - if (rc != NGX_OK) { - return rc; - } - - h = ngx_list_push(&r->headers_out.headers); - if (h == NULL) { - return NGX_HTTP_INTERNAL_SERVER_ERROR; - } - - ngx_str_set(&h->key, "DAV"); - h->value.len = 1; - h->value.data = (u_char *) (dlcf->shm_zone ? "2" : "1"); - h->hash = 1; - - h = ngx_list_push(&r->headers_out.headers); - if (h == NULL) { - return NGX_HTTP_INTERNAL_SERVER_ERROR; - } - - /* XXX */ - ngx_str_set(&h->key, "Allow"); - ngx_str_set(&h->value, - "GET,HEAD,PUT,DELETE,MKCOL,COPY,MOVE,PROPFIND,OPTIONS,LOCK,UNLOCK"); - h->hash = 1; - - r->headers_out.status = NGX_HTTP_OK; - r->headers_out.content_length_n = 0; - - rc = ngx_http_send_header(r); - - if (rc == NGX_ERROR || rc > NGX_OK || r->header_only) { - return rc; - } - - return ngx_http_send_special(r, NGX_HTTP_LAST); - - case NGX_HTTP_LOCK: - - if (dlcf->shm_zone == NULL) { - return NGX_HTTP_NOT_ALLOWED; - } - - ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "http dav_ext lock"); - - /* - * Body is expected to carry the requested lock type, but - * since we only support write/exclusive locks, we ignore it. - * Ideally we could throw an error if a lock of another type - * is requested, but the amount of work required for that is - * not worth it. - */ - - rc = ngx_http_discard_request_body(r); - - if (rc != NGX_OK) { - return rc; - } - - return ngx_http_dav_ext_lock_handler(r); - - case NGX_HTTP_UNLOCK: - - if (dlcf->shm_zone == NULL) { - return NGX_HTTP_NOT_ALLOWED; - } - - ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "http dav_ext unlock"); - - rc = ngx_http_discard_request_body(r); - - if (rc != NGX_OK) { - return rc; - } - - return ngx_http_dav_ext_unlock_handler(r); - } - - return NGX_DECLINED; -} - - -static void -ngx_http_dav_ext_propfind_handler(ngx_http_request_t *r) -{ - off_t len; - ngx_buf_t *b; - ngx_chain_t *cl; - xmlSAXHandler sax; - xmlParserCtxtPtr pctx; - ngx_http_dav_ext_xml_ctx_t xctx; - - ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "http dav_ext propfind handler"); - - ngx_memzero(&xctx, sizeof(ngx_http_dav_ext_xml_ctx_t)); - ngx_memzero(&sax, sizeof(xmlSAXHandler)); - - sax.initialized = XML_SAX2_MAGIC; - sax.startElementNs = ngx_http_dav_ext_propfind_xml_start; - sax.endElementNs = ngx_http_dav_ext_propfind_xml_end; - - pctx = xmlCreatePushParserCtxt(&sax, &xctx, NULL, 0, NULL); - if (pctx == NULL) { - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "xmlCreatePushParserCtxt() failed"); - ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR); - return; - } - - len = 0; - - for (cl = r->request_body->bufs; cl; cl = cl->next) { - b = cl->buf; - - if (b->in_file) { - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "PROPFIND client body is in file, " - "you may want to increase client_body_buffer_size"); - xmlFreeParserCtxt(pctx); - ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR); - return; - } - - if (ngx_buf_special(b)) { - continue; - } - - len += b->last - b->pos; - - if (xmlParseChunk(pctx, (const char *) b->pos, b->last - b->pos, - b->last_buf)) - { - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "xmlParseChunk() failed"); - xmlFreeParserCtxt(pctx); - ngx_http_finalize_request(r, NGX_HTTP_BAD_REQUEST); - return; - } - } - - xmlFreeParserCtxt(pctx); - - if (len == 0) { - - /* - * For easier debugging treat bodiless requests - * as if they expect all properties. - */ - - xctx.props = NGX_HTTP_DAV_EXT_PROP_ALL; - } - - ngx_http_finalize_request(r, ngx_http_dav_ext_propfind(r, xctx.props)); -} - - -static void -ngx_http_dav_ext_propfind_xml_start(void *data, const xmlChar *localname, - const xmlChar *prefix, const xmlChar *uri, int nb_namespaces, - const xmlChar **namespaces, int nb_attributes, int nb_defaulted, - const xmlChar **attributes) -{ - ngx_http_dav_ext_xml_ctx_t *xctx = data; - - if (ngx_strcmp(localname, "propfind") == 0) { - xctx->nodes ^= NGX_HTTP_DAV_EXT_NODE_PROPFIND; - } - - if (ngx_strcmp(localname, "prop") == 0) { - xctx->nodes ^= NGX_HTTP_DAV_EXT_NODE_PROP; - } - - if (ngx_strcmp(localname, "propname") == 0) { - xctx->nodes ^= NGX_HTTP_DAV_EXT_NODE_PROPNAME; - } - - if (ngx_strcmp(localname, "allprop") == 0) { - xctx->nodes ^= NGX_HTTP_DAV_EXT_NODE_ALLPROP; - } -} - - -static void -ngx_http_dav_ext_propfind_xml_end(void *data, const xmlChar *localname, - const xmlChar *prefix, const xmlChar *uri) -{ - ngx_http_dav_ext_xml_ctx_t *xctx = data; - - if (xctx->nodes & NGX_HTTP_DAV_EXT_NODE_PROPFIND) { - - if (xctx->nodes & NGX_HTTP_DAV_EXT_NODE_PROP) { - if (ngx_strcmp(localname, "displayname") == 0) { - xctx->props |= NGX_HTTP_DAV_EXT_PROP_DISPLAYNAME; - } - - if (ngx_strcmp(localname, "getcontentlength") == 0) { - xctx->props |= NGX_HTTP_DAV_EXT_PROP_GETCONTENTLENGTH; - } - - if (ngx_strcmp(localname, "getlastmodified") == 0) { - xctx->props |= NGX_HTTP_DAV_EXT_PROP_GETLASTMODIFIED; - } - - if (ngx_strcmp(localname, "resourcetype") == 0) { - xctx->props |= NGX_HTTP_DAV_EXT_PROP_RESOURCETYPE; - } - - if (ngx_strcmp(localname, "lockdiscovery") == 0) { - xctx->props |= NGX_HTTP_DAV_EXT_PROP_LOCKDISCOVERY; - } - - if (ngx_strcmp(localname, "supportedlock") == 0) { - xctx->props |= NGX_HTTP_DAV_EXT_PROP_SUPPORTEDLOCK; - } - } - - if (xctx->nodes & NGX_HTTP_DAV_EXT_NODE_PROPNAME) { - xctx->props |= NGX_HTTP_DAV_EXT_PROP_NAMES; - } - - if (xctx->nodes & NGX_HTTP_DAV_EXT_NODE_ALLPROP) { - xctx->props = NGX_HTTP_DAV_EXT_PROP_ALL; - } - } - - ngx_http_dav_ext_propfind_xml_start(data, localname, prefix, uri, - 0, NULL, 0, 0, NULL); -} - - -static ngx_int_t -ngx_http_dav_ext_propfind(ngx_http_request_t *r, ngx_uint_t props) -{ - size_t root, allocated; - u_char *p, *last, *filename; - ngx_int_t rc; - ngx_err_t err; - ngx_str_t path, name; - ngx_dir_t dir; - ngx_uint_t depth; - ngx_array_t entries; - ngx_file_info_t fi; - ngx_http_dav_ext_entry_t *entry; - - if (ngx_array_init(&entries, r->pool, 40, sizeof(ngx_http_dav_ext_entry_t)) - != NGX_OK) - { - return NGX_HTTP_INTERNAL_SERVER_ERROR; - } - - rc = ngx_http_dav_ext_depth(r, 0); - - if (rc == NGX_ERROR) { - return NGX_HTTP_BAD_REQUEST; - } - - if (rc == NGX_MAX_INT_T_VALUE) { - - /* - * RFC4918: - * 403 Forbidden - A server MAY reject PROPFIND requests on - * collections with depth header of "Infinity", in which case - * it SHOULD use this error with the precondition code - * 'propfind-finite-depth' inside the error body. - */ - - return NGX_HTTP_FORBIDDEN; - } - - depth = rc; - - last = ngx_http_map_uri_to_path(r, &path, &root, - NGX_HTTP_DAV_EXT_PREALLOCATE); - if (last == NULL) { - return NGX_HTTP_INTERNAL_SERVER_ERROR; - } - - allocated = path.len; - path.len = last - path.data; - - if (path.len > 1 && path.data[path.len - 1] == '/') { - path.len--; - - } else { - last++; - } - - path.data[path.len] = '\0'; - - ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "http dav_ext propfind path: \"%s\"", path.data); - - if (ngx_file_info(path.data, &fi) == NGX_FILE_ERROR) { - return NGX_HTTP_NOT_FOUND; - } - - if (r->uri.len < 2) { - name = r->uri; - - } else { - name.data = &r->uri.data[r->uri.len - 1]; - name.len = (name.data[0] == '/') ? 0 : 1; - - while (name.data != r->uri.data) { - p = name.data - 1; - if (*p == '/') { - break; - } - - name.data--; - name.len++; - } - } - - entry = ngx_array_push(&entries); - if (entry == NULL) { - return NGX_HTTP_INTERNAL_SERVER_ERROR; - } - - ngx_memzero(entry, sizeof(ngx_http_dav_ext_entry_t)); - - entry->uri = r->uri; - entry->name = name; - entry->dir = ngx_is_dir(&fi); - entry->mtime = ngx_file_mtime(&fi); - entry->size = ngx_file_size(&fi); - - if (ngx_http_dav_ext_set_locks(r, entry) != NGX_OK) { - return NGX_HTTP_INTERNAL_SERVER_ERROR; - } - - ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "http dav_ext propfind name:\"%V\", uri:\"%V\"", - &entry->name, &entry->uri); - - if (depth == 0 || !entry->dir) { - return ngx_http_dav_ext_propfind_response(r, &entries, props); - } - - if (ngx_open_dir(&path, &dir) == NGX_ERROR) { - ngx_log_error(NGX_LOG_CRIT, r->connection->log, ngx_errno, - ngx_open_dir_n " \"%s\" failed", path.data); - return NGX_HTTP_INTERNAL_SERVER_ERROR; - } - - rc = NGX_OK; - - filename = path.data; - filename[path.len] = '/'; - - for ( ;; ) { - ngx_set_errno(0); - - if (ngx_read_dir(&dir) == NGX_ERROR) { - err = ngx_errno; - - if (err != NGX_ENOMOREFILES) { - ngx_log_error(NGX_LOG_CRIT, r->connection->log, err, - ngx_read_dir_n " \"%V\" failed", &path); - rc = NGX_HTTP_INTERNAL_SERVER_ERROR; - } - - break; - } - - name.len = ngx_de_namelen(&dir); - name.data = ngx_de_name(&dir); - - if (name.data[0] == '.') { - continue; - } - - ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "http dav_ext propfind child path: \"%s\"", name.data); - - entry = ngx_array_push(&entries); - if (entry == NULL) { - rc = NGX_HTTP_INTERNAL_SERVER_ERROR; - break; - } - - ngx_memzero(entry, sizeof(ngx_http_dav_ext_entry_t)); - - if (!dir.valid_info) { - - if (path.len + 1 + name.len + 1 > allocated) { - allocated = path.len + 1 + name.len + 1 - + NGX_HTTP_DAV_EXT_PREALLOCATE; - - filename = ngx_pnalloc(r->pool, allocated); - if (filename == NULL) { - rc = NGX_HTTP_INTERNAL_SERVER_ERROR; - break; - } - - last = ngx_cpystrn(filename, path.data, path.len + 1); - *last++ = '/'; - } - - ngx_cpystrn(last, name.data, name.len + 1); - - if (ngx_de_info(filename, &dir) == NGX_FILE_ERROR) { - ngx_log_error(NGX_LOG_CRIT, r->connection->log, ngx_errno, - ngx_de_info_n " \"%s\" failed", filename); - rc = NGX_HTTP_INTERNAL_SERVER_ERROR; - break; - } - } - - p = ngx_pnalloc(r->pool, name.len); - if (p == NULL) { - rc = NGX_HTTP_INTERNAL_SERVER_ERROR; - break; - } - - ngx_memcpy(p, name.data, name.len); - entry->name.data = p; - entry->name.len = name.len; - - p = ngx_pnalloc(r->pool, r->uri.len + 1 + name.len + 1); - if (p == NULL) { - rc = NGX_HTTP_INTERNAL_SERVER_ERROR; - break; - } - - entry->uri.data = p; - - p = ngx_cpymem(p, r->uri.data, r->uri.len); - if (r->uri.len && r->uri.data[r->uri.len - 1] != '/') { - *p++ = '/'; - } - - p = ngx_cpymem(p, name.data, name.len); - if (ngx_de_is_dir(&dir)) { - *p++ = '/'; - } - - entry->uri.len = p - entry->uri.data; - entry->dir = ngx_de_is_dir(&dir); - entry->mtime = ngx_de_mtime(&dir); - entry->size = ngx_de_size(&dir); - - if (ngx_http_dav_ext_set_locks(r, entry) != NGX_OK) { - rc = NGX_HTTP_INTERNAL_SERVER_ERROR; - break; - } - - ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "http dav_ext propfind child name:\"%V\", uri:\"%V\"", - &entry->name, &entry->uri); - } - - if (ngx_close_dir(&dir) == NGX_ERROR) { - ngx_log_error(NGX_LOG_ALERT, r->connection->log, ngx_errno, - ngx_close_dir_n " \"%V\" failed", &path); - } - - if (rc != NGX_OK) { - return rc; - } - - return ngx_http_dav_ext_propfind_response(r, &entries, props); -} - - -static ngx_int_t -ngx_http_dav_ext_set_locks(ngx_http_request_t *r, - ngx_http_dav_ext_entry_t *entry) -{ - ngx_http_dav_ext_node_t *node; - ngx_http_dav_ext_lock_t *lock; - ngx_http_dav_ext_loc_conf_t *dlcf; - - dlcf = ngx_http_get_module_loc_conf(r, ngx_http_dav_ext_module); - - if (dlcf->shm_zone == NULL) { - entry->lock_supported = 0; - return NGX_OK; - } - - entry->lock_supported = 1; - - lock = dlcf->shm_zone->data; - - ngx_shmtx_lock(&lock->shpool->mutex); - - node = ngx_http_dav_ext_lock_lookup(r, lock, &entry->uri, -1); - if (node == NULL) { - ngx_shmtx_unlock(&lock->shpool->mutex); - return NGX_OK; - } - - entry->lock_infinite = node->infinite ? 1 : 0; - entry->lock_expire = node->expire; - entry->lock_token = node->token; - - entry->lock_root.data = ngx_pnalloc(r->pool, node->len); - if (entry->lock_root.data == NULL) { - ngx_shmtx_unlock(&lock->shpool->mutex); - return NGX_ERROR; - } - - ngx_memcpy(entry->lock_root.data, node->data, node->len); - entry->lock_root.len = node->len; - - ngx_shmtx_unlock(&lock->shpool->mutex); - - return NGX_OK; -} - - -static ngx_int_t -ngx_http_dav_ext_propfind_response(ngx_http_request_t *r, ngx_array_t *entries, - ngx_uint_t props) -{ - size_t len; - u_char *p; - uintptr_t escape; - ngx_buf_t *b; - ngx_int_t rc; - ngx_uint_t n; - ngx_chain_t cl; - ngx_http_dav_ext_entry_t *entry; - - static u_char head[] = - "\n" - "\n"; - - static u_char tail[] = - "\n"; - - entry = entries->elts; - - for (n = 0; n < entries->nelts; n++) { - escape = 2 * ngx_escape_uri(NULL, entry[n].uri.data, entry[n].uri.len, - NGX_ESCAPE_URI); - if (escape == 0) { - continue; - } - - p = ngx_pnalloc(r->pool, entry[n].uri.len + escape); - if (p == NULL) { - return NGX_HTTP_INTERNAL_SERVER_ERROR; - } - - entry[n].uri.len = (u_char *) ngx_escape_uri(p, entry[n].uri.data, - entry[n].uri.len, - NGX_ESCAPE_URI) - - p; - entry[n].uri.data = p; - } - - len = sizeof(head) - 1 + sizeof(tail) - 1; - - for (n = 0; n < entries->nelts; n++) { - len += ngx_http_dav_ext_format_propfind(r, NULL, &entry[n], props); - } - - b = ngx_create_temp_buf(r->pool, len); - if (b == NULL) { - return NGX_HTTP_INTERNAL_SERVER_ERROR; - } - - b->last = ngx_cpymem(b->last, head, sizeof(head) - 1); - - for (n = 0; n < entries->nelts; n++) { - b->last = (u_char *) ngx_http_dav_ext_format_propfind(r, b->last, - &entry[n], props); - } - - b->last = ngx_cpymem(b->last, tail, sizeof(tail) - 1); - - b->last_buf = (r == r->main) ? 1 : 0; - b->last_in_chain = 1; - - cl.buf = b; - cl.next = NULL; - - r->headers_out.status = 207; - ngx_str_set(&r->headers_out.status_line, "207 Multi-Status"); - - r->headers_out.content_length_n = b->last - b->pos; - - r->headers_out.content_type_len = sizeof("text/xml") - 1; - ngx_str_set(&r->headers_out.content_type, "text/xml"); - r->headers_out.content_type_lowcase = NULL; - - ngx_str_set(&r->headers_out.charset, "utf-8"); - - rc = ngx_http_send_header(r); - - if (rc == NGX_ERROR || rc > NGX_OK || r->header_only) { - return rc; - } - - return ngx_http_output_filter(r, &cl); -} - - -static ngx_int_t -ngx_http_dav_ext_lock_handler(ngx_http_request_t *r) -{ - u_char *last; - size_t n, root; - time_t now; - uint32_t token, new_token; - ngx_fd_t fd; - ngx_int_t rc, depth; - ngx_str_t path; - ngx_uint_t status; - ngx_file_info_t fi; - ngx_http_dav_ext_lock_t *lock; - ngx_http_dav_ext_node_t *node; - ngx_http_dav_ext_loc_conf_t *dlcf; - - if (r->uri.len == 0) { - return NGX_HTTP_BAD_REQUEST; - } - - dlcf = ngx_http_get_module_loc_conf(r, ngx_http_dav_ext_module); - lock = dlcf->shm_zone->data; - - /* - * RFC4918: - * If no Depth header is submitted on a LOCK request, then the request - * MUST act as if a "Depth:infinity" had been submitted. - */ - - rc = ngx_http_dav_ext_depth(r, NGX_MAX_INT_T_VALUE); - - if (rc == NGX_ERROR || rc == 1) { - - /* - * RFC4918: - * Values other than 0 or infinity MUST NOT be used with the Depth - * header on a LOCK method. - */ - - return NGX_HTTP_BAD_REQUEST; - } - - depth = rc; - - token = ngx_http_dav_ext_if(r, &r->uri); - - do { - new_token = ngx_random(); - } while (new_token == 0); - - now = ngx_time(); - - ngx_shmtx_lock(&lock->shpool->mutex); - - node = ngx_http_dav_ext_lock_lookup(r, lock, &r->uri, depth); - - if (node) { - if (token == 0) { - ngx_shmtx_unlock(&lock->shpool->mutex); - return 423; /* Locked */ - } - - if (node->token != token) { - ngx_shmtx_unlock(&lock->shpool->mutex); - return NGX_HTTP_PRECONDITION_FAILED; - } - - ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "http dav_ext refresh lock"); - - node->expire = now + lock->timeout; - - ngx_queue_remove(&node->queue); - ngx_queue_insert_tail(&lock->sh->queue, &node->queue); - - ngx_shmtx_unlock(&lock->shpool->mutex); - - return ngx_http_dav_ext_lock_response(r, NGX_HTTP_OK, lock->timeout, - depth, token); - } - - n = sizeof(ngx_http_dav_ext_node_t) + r->uri.len - 1; - - node = ngx_slab_alloc_locked(lock->shpool, n); - if (node == NULL) { - ngx_shmtx_unlock(&lock->shpool->mutex); - return NGX_HTTP_INTERNAL_SERVER_ERROR; - } - - ngx_memzero(node, sizeof(ngx_http_dav_ext_node_t)); - - ngx_memcpy(&node->data, r->uri.data, r->uri.len); - - node->len = r->uri.len; - node->token = new_token; - node->expire = now + lock->timeout; - node->infinite = (depth ? 1 : 0); - - ngx_queue_insert_tail(&lock->sh->queue, &node->queue); - - ngx_shmtx_unlock(&lock->shpool->mutex); - - ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "http dav_ext add lock"); - - last = ngx_http_map_uri_to_path(r, &path, &root, 0); - if (last == NULL) { - return NGX_HTTP_INTERNAL_SERVER_ERROR; - } - - *last = '\0'; - - status = NGX_HTTP_OK; - - if (ngx_file_info(path.data, &fi) == NGX_FILE_ERROR) { - - /* - * RFC4918: - * A successful lock request to an unmapped URL MUST result in the - * creation of a locked (non-collection) resource with empty content. - */ - - fd = ngx_open_file(path.data, NGX_FILE_RDONLY, NGX_FILE_CREATE_OR_OPEN, - NGX_FILE_DEFAULT_ACCESS); - - if (fd == NGX_INVALID_FILE) { - - /* - * RFC4918: - * 409 (Conflict) - A resource cannot be created at the destination - * until one or more intermediate collections have been created. - * The server MUST NOT create those intermediate collections - * automatically. - */ - - ngx_log_error(NGX_LOG_ERR, r->connection->log, ngx_errno, - ngx_open_file_n " \"%s\" failed", path.data); - return NGX_HTTP_CONFLICT; - } - - if (ngx_close_file(fd) == NGX_FILE_ERROR) { - ngx_log_error(NGX_LOG_ALERT, r->connection->log, ngx_errno, - ngx_close_file_n " \"%s\" failed", path.data); - return NGX_HTTP_INTERNAL_SERVER_ERROR; - } - - status = NGX_HTTP_CREATED; - } - - return ngx_http_dav_ext_lock_response(r, status, lock->timeout, depth, - new_token); -} - - -static ngx_int_t -ngx_http_dav_ext_lock_response(ngx_http_request_t *r, ngx_uint_t status, - time_t timeout, ngx_uint_t depth, uint32_t token) -{ - size_t len; - time_t now; - u_char *p; - ngx_int_t rc; - ngx_buf_t *b; - ngx_chain_t cl; - ngx_table_elt_t *h; - ngx_http_dav_ext_entry_t entry; - - static u_char head[] = - "\n" - "\n"; - - static u_char tail[] = - "\n"; - - now = ngx_time(); - - ngx_memzero(&entry, sizeof(ngx_http_dav_ext_entry_t)); - - entry.lock_expire = now + timeout; - entry.lock_root = r->uri; - entry.lock_infinite = depth ? 1 : 0; - entry.lock_token = token; - - len = sizeof(head) - 1 - + ngx_http_dav_ext_format_lockdiscovery(r, NULL, &entry) - + sizeof(tail) - 1; - - b = ngx_create_temp_buf(r->pool, len); - if (b == NULL) { - return NGX_HTTP_INTERNAL_SERVER_ERROR; - } - - b->last = ngx_cpymem(b->last, head, sizeof(head) - 1); - b->last = (u_char *) ngx_http_dav_ext_format_lockdiscovery(r, b->last, - &entry); - b->last = ngx_cpymem(b->last, tail, sizeof(tail) - 1); - - b->last_buf = (r == r->main) ? 1 : 0; - b->last_in_chain = 1; - - cl.buf = b; - cl.next = NULL; - - r->headers_out.status = status; - r->headers_out.content_length_n = b->last - b->pos; - - r->headers_out.content_type_len = sizeof("text/xml") - 1; - ngx_str_set(&r->headers_out.content_type, "text/xml"); - r->headers_out.content_type_lowcase = NULL; - - ngx_str_set(&r->headers_out.charset, "utf-8"); - - h = ngx_list_push(&r->headers_out.headers); - if (h == NULL) { - return NGX_HTTP_INTERNAL_SERVER_ERROR; - } - - ngx_str_set(&h->key, "Lock-Token"); - - p = ngx_pnalloc(r->pool, ngx_http_dav_ext_format_token(NULL, token, 1)); - if (p == NULL) { - return NGX_HTTP_INTERNAL_SERVER_ERROR; - } - - h->value.data = p; - h->value.len = (u_char *) ngx_http_dav_ext_format_token(p, token, 1) - p; - h->hash = 1; - - rc = ngx_http_send_header(r); - - if (rc == NGX_ERROR || rc > NGX_OK || r->header_only) { - return rc; - } - - return ngx_http_output_filter(r, &cl); -} - - -static ngx_int_t -ngx_http_dav_ext_unlock_handler(ngx_http_request_t *r) -{ - uint32_t token; - ngx_http_dav_ext_lock_t *lock; - ngx_http_dav_ext_node_t *node; - ngx_http_dav_ext_loc_conf_t *dlcf; - - token = ngx_http_dav_ext_lock_token(r); - - dlcf = ngx_http_get_module_loc_conf(r, ngx_http_dav_ext_module); - lock = dlcf->shm_zone->data; - - ngx_shmtx_lock(&lock->shpool->mutex); - - node = ngx_http_dav_ext_lock_lookup(r, lock, &r->uri, -1); - - if (node == NULL || node->token != token) { - ngx_shmtx_unlock(&lock->shpool->mutex); - return NGX_HTTP_NO_CONTENT; - } - - ngx_queue_remove(&node->queue); - ngx_slab_free_locked(lock->shpool, node); - - ngx_shmtx_unlock(&lock->shpool->mutex); - - ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "http dav_ext delete lock"); - - return NGX_HTTP_NO_CONTENT; -} - - -static ngx_int_t -ngx_http_dav_ext_depth(ngx_http_request_t *r, ngx_int_t default_depth) -{ - ngx_table_elt_t *depth; - - depth = r->headers_in.depth; - - if (depth == NULL) { - return default_depth; - } - - if (depth->value.len == 1) { - - if (depth->value.data[0] == '0') { - return 0; - } - - if (depth->value.data[0] == '1') { - return 1; - } - - } else { - - if (depth->value.len == sizeof("infinity") - 1 - && ngx_strcmp(depth->value.data, "infinity") == 0) - { - return NGX_MAX_INT_T_VALUE; - } - } - - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "client sent invalid \"Depth\" header: \"%V\"", - &depth->value); - - return NGX_ERROR; -} - - -static uint32_t -ngx_http_dav_ext_lock_token(ngx_http_request_t *r) -{ - u_char *p, ch; - uint32_t token; - ngx_uint_t i, n; - ngx_list_part_t *part; - ngx_table_elt_t *header; - - static u_char name[] = "lock-token"; - - part = &r->headers_in.headers.part; - header = part->elts; - - for (i = 0; /* void */ ; i++) { - - if (i >= part->nelts) { - if (part->next == NULL) { - break; - } - - part = part->next; - header = part->elts; - i = 0; - } - - for (n = 0; n < sizeof(name) - 1 && n < header[i].key.len; n++) { - ch = header[i].key.data[n]; - - if (ch >= 'A' && ch <= 'Z') { - ch |= 0x20; - } - - if (name[n] != ch) { - break; - } - } - - if (n == sizeof(name) - 1 && n == header[i].key.len) { - p = header[i].value.data; - - if (ngx_strncmp(p, "= '0' && ch <= '9') { - token = token * 16 + (ch - '0'); - continue; - } - - ch = (u_char) (ch | 0x20); - - if (ch >= 'a' && ch <= 'f') { - token = token * 16 + (ch - 'a' + 10); - continue; - } - - return 0; - } - - if (*p != '>') { - return 0; - } - - return token; - } - } - - return 0; -} - - -static uint32_t -ngx_http_dav_ext_if(ngx_http_request_t *r, ngx_str_t *uri) -{ - u_char *p, ch; - uint32_t token; - ngx_str_t tag; - ngx_uint_t i, n; - ngx_list_part_t *part; - ngx_table_elt_t *header; - - static u_char name[] = "if"; - - ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "http dav_ext if \"%V\"", uri); - - part = &r->headers_in.headers.part; - header = part->elts; - - for (i = 0; /* void */ ; i++) { - - if (i >= part->nelts) { - if (part->next == NULL) { - break; - } - - part = part->next; - header = part->elts; - i = 0; - } - - for (n = 0; n < sizeof(name) - 1 && n < header[i].key.len; n++) { - ch = header[i].key.data[n]; - - if (ch >= 'A' && ch <= 'Z') { - ch |= 0x20; - } - - if (name[n] != ch) { - break; - } - } - - if (n == sizeof(name) - 1 && n == header[i].key.len) { - p = header[i].value.data; - tag = r->uri; - - while (*p != '\0') { - ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "http dav_ext if list \"%s\"", p); - - while (*p == ' ') { p++; } - - if (*p == '<') { - tag.data = ++p; - - while (*p != '\0' && *p != '>') { p++; } - - if (*p == '\0') { - break; - } - - tag.len = p++ - tag.data; - - (void) ngx_http_dav_ext_strip_uri(r, &tag); - - while (*p == ' ') { p++; } - } - - if (*p != '(') { - break; - } - - p++; - - if (tag.len == 0 - || tag.len > uri->len - || (tag.len < uri->len && tag.data[tag.len - 1] != '/') - || ngx_memcmp(tag.data, uri->data, tag.len)) - { - ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "http dav_ext if tag mismatch \"%V\"", &tag); - - while (*p != '\0' && *p != ')') { p++; } - - if (*p == ')') { - p++; - } - - continue; - } - - while (*p != '\0') { - ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "http dav_ext if condition \"%s\"", p); - - while (*p == ' ') { p++; } - - if (ngx_strncmp(p, "Not", 3) == 0) { - p += 3; - while (*p == ' ') { p++; } - goto next; - } - - if (*p == '[') { - p++; - while (*p != '\0' && *p != ']') { p++; } - goto next; - } - - if (ngx_strncmp(p, "= '0' && ch <= '9') { - token = token * 16 + (ch - '0'); - continue; - } - - ch = (u_char) (ch | 0x20); - - if (ch >= 'a' && ch <= 'f') { - token = token * 16 + (ch - 'a' + 10); - continue; - } - - goto next; - } - - if (*p != '>') { - goto next; - } - - ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "http dav_ext if token: %uxD", token); - - return token; - - next: - - while (*p != '\0' && *p != ' ' && *p != ')') { p++; } - - if (*p == ')') { - p++; - break; - } - } - } - - ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "http dav_ext if header mismatch"); - } - } - - return 0; -} - - -static uintptr_t -ngx_http_dav_ext_format_propfind(ngx_http_request_t *r, u_char *dst, - ngx_http_dav_ext_entry_t *entry, ngx_uint_t props) -{ - size_t len; - - static u_char head[] = - "\n" - ""; - - /* uri */ - - static u_char prop[] = - "\n" - "\n" - "\n"; - - /* properties */ - - static u_char tail[] = - "\n" - "HTTP/1.1 200 OK\n" - "\n" - "\n"; - - static u_char names[] = - "\n" - "\n" - "\n" - "\n" - "\n" - "\n"; - - static u_char supportedlock[] = - "\n" - "\n" - "\n" - "\n"; - - if (dst == NULL) { - len = sizeof(head) - 1 - + sizeof(prop) - 1 - + sizeof(tail) - 1; - - len += entry->uri.len + ngx_escape_html(NULL, entry->uri.data, - entry->uri.len); - - if (props & NGX_HTTP_DAV_EXT_PROP_NAMES) { - len += sizeof(names) - 1; - - } else { - len += sizeof("" - "\n" - - "" - "\n" - - "" - "Mon, 28 Sep 1970 06:00:00 GMT" - "\n" - - "" - "" - "\n" - - "\n" - "\n") - 1; - - /* displayname */ - len += entry->name.len - + ngx_escape_html(NULL, entry->name.data, entry->name.len); - - /* getcontentlength */ - len += NGX_OFF_T_LEN; - - /* lockdiscovery */ - len += ngx_http_dav_ext_format_lockdiscovery(r, NULL, entry); - - /* supportedlock */ - if (entry->lock_supported) { - len += sizeof(supportedlock) - 1; - } - } - - return len; - } - - dst = ngx_cpymem(dst, head, sizeof(head) - 1); - dst = (u_char *) ngx_escape_html(dst, entry->uri.data, entry->uri.len); - dst = ngx_cpymem(dst, prop, sizeof(prop) - 1); - - if (props & NGX_HTTP_DAV_EXT_PROP_NAMES) { - dst = ngx_cpymem(dst, names, sizeof(names) - 1); - - } else { - if (props & NGX_HTTP_DAV_EXT_PROP_DISPLAYNAME) { - dst = ngx_cpymem(dst, "", - sizeof("") - 1); - dst = (u_char *) ngx_escape_html(dst, entry->name.data, - entry->name.len); - dst = ngx_cpymem(dst, "\n", - sizeof("\n") - 1); - } - - if (props & NGX_HTTP_DAV_EXT_PROP_GETCONTENTLENGTH) { - if (!entry->dir) { - dst = ngx_sprintf(dst, "%O" - "\n", entry->size); - } - } - - if (props & NGX_HTTP_DAV_EXT_PROP_GETLASTMODIFIED) { - dst = ngx_cpymem(dst, "", - sizeof("") - 1); - dst = ngx_http_time(dst, entry->mtime); - dst = ngx_cpymem(dst, "\n", - sizeof("\n") - 1); - } - - if (props & NGX_HTTP_DAV_EXT_PROP_RESOURCETYPE) { - dst = ngx_cpymem(dst, "", - sizeof("") - 1); - - if (entry->dir) { - dst = ngx_cpymem(dst, "", - sizeof("") - 1); - } - - dst = ngx_cpymem(dst, "\n", - sizeof("\n") - 1); - } - - if (props & NGX_HTTP_DAV_EXT_PROP_LOCKDISCOVERY) { - dst = (u_char *) ngx_http_dav_ext_format_lockdiscovery(r, dst, - entry); - } - - if (props & NGX_HTTP_DAV_EXT_PROP_SUPPORTEDLOCK) { - dst = ngx_cpymem(dst, "\n", - sizeof("\n") - 1); - - if (entry->lock_supported) { - dst = ngx_cpymem(dst, supportedlock, sizeof(supportedlock) - 1); - } - - dst = ngx_cpymem(dst, "\n", - sizeof("\n") - 1); - } - } - - dst = ngx_cpymem(dst, tail, sizeof(tail) - 1); - - return (uintptr_t) dst; -} - - -static uintptr_t -ngx_http_dav_ext_format_lockdiscovery(ngx_http_request_t *r, u_char *dst, - ngx_http_dav_ext_entry_t *entry) -{ - size_t len; - time_t now; - - if (dst == NULL) { - if (entry->lock_token == 0) { - return sizeof("\n") - 1; - } - - len = sizeof("\n" - "\n" - "\n" - "\n" - "infinity\n" - "Second-\n" - "\n" - "\n" - "\n" - "\n") - 1; - - /* timeout */ - len += NGX_TIME_T_LEN; - - /* token */ - len += ngx_http_dav_ext_format_token(NULL, entry->lock_token, 0); - - /* lockroot */ - len += entry->lock_root.len + ngx_escape_html(NULL, - entry->lock_root.data, - entry->lock_root.len); - return len; - } - - if (entry->lock_token == 0) { - dst = ngx_cpymem(dst, "\n", - sizeof("\n") - 1); - return (uintptr_t) dst; - } - - now = ngx_time(); - - dst = ngx_cpymem(dst, "\n", - sizeof("\n") - 1); - - dst = ngx_cpymem(dst, "\n", - sizeof("\n") - 1); - - dst = ngx_cpymem(dst, "\n", - sizeof("\n") - 1); - - dst = ngx_cpymem(dst, "\n", - sizeof("\n") - 1); - - dst = ngx_sprintf(dst, "%s\n", - entry->lock_infinite ? "infinity" : "0"); - - dst = ngx_sprintf(dst, "Second-%T\n", - entry->lock_expire - now); - - dst = ngx_cpymem(dst, "", - sizeof("") - 1); - dst = (u_char *) ngx_http_dav_ext_format_token(dst, entry->lock_token, 0); - dst = ngx_cpymem(dst, "\n", - sizeof("\n") - 1); - - dst = ngx_cpymem(dst, "", - sizeof("") - 1); - dst = (u_char *) ngx_escape_html(dst, entry->lock_root.data, - entry->lock_root.len); - dst = ngx_cpymem(dst, "\n", - sizeof("\n") - 1); - - dst = ngx_cpymem(dst, "\n", - sizeof("\n") - 1); - - dst = ngx_cpymem(dst, "\n", - sizeof("\n") - 1); - - return (uintptr_t) dst; -} - - -static uintptr_t -ngx_http_dav_ext_format_token(u_char *dst, uint32_t token, ngx_uint_t brackets) -{ - ngx_uint_t n; - - static u_char hex[] = "0123456789abcdef"; - - if (dst == NULL) { - return sizeof("") - 1 + (brackets ? 2 : 0); - } - - if (brackets) { - *dst++ = '<'; - } - - dst = ngx_cpymem(dst, "urn:", 4); - - for (n = 0; n < 4; n++) { - *dst++ = hex[token >> 28]; - *dst++ = hex[(token >> 24) & 0xf]; - token <<= 8; - } - - if (brackets) { - *dst++ = '>'; - } - - return (uintptr_t) dst; -} - - -static ngx_int_t -ngx_http_dav_ext_init_zone(ngx_shm_zone_t *shm_zone, void *data) -{ - ngx_http_dav_ext_lock_t *olock = data; - - size_t len; - ngx_http_dav_ext_lock_t *lock; - - lock = shm_zone->data; - - if (olock) { - lock->sh = olock->sh; - lock->shpool = olock->shpool; - return NGX_OK; - } - - lock->shpool = (ngx_slab_pool_t *) shm_zone->shm.addr; - - if (shm_zone->shm.exists) { - lock->sh = lock->shpool->data; - return NGX_OK; - } - - lock->sh = ngx_slab_alloc(lock->shpool, sizeof(ngx_http_dav_ext_lock_sh_t)); - if (lock->sh == NULL) { - return NGX_ERROR; - } - - lock->shpool->data = lock->sh; - - ngx_queue_init(&lock->sh->queue); - - len = sizeof(" in dav_ext zone \"\"") + shm_zone->shm.name.len; - - lock->shpool->log_ctx = ngx_slab_alloc(lock->shpool, len); - if (lock->shpool->log_ctx == NULL) { - return NGX_ERROR; - } - - ngx_sprintf(lock->shpool->log_ctx, " in dav_ext zone \"%V\"%Z", - &shm_zone->shm.name); - - return NGX_OK; -} - - -static void * -ngx_http_dav_ext_create_loc_conf(ngx_conf_t *cf) -{ - ngx_http_dav_ext_loc_conf_t *conf; - - conf = ngx_pcalloc(cf->pool, sizeof(ngx_http_dav_ext_loc_conf_t)); - if (conf == NULL) { - return NULL; - } - - /* - * set by ngx_pcalloc(): - * - * conf->shm_zone = NULL; - */ - - return conf; -} - - -static char * -ngx_http_dav_ext_merge_loc_conf(ngx_conf_t *cf, void *parent, void *child) -{ - ngx_http_dav_ext_loc_conf_t *prev = parent; - ngx_http_dav_ext_loc_conf_t *conf = child; - - ngx_conf_merge_bitmask_value(conf->methods, prev->methods, - (NGX_CONF_BITMASK_SET|NGX_HTTP_DAV_EXT_OFF)); - - if (conf->shm_zone == NULL) { - conf->shm_zone = prev->shm_zone; - } - - return NGX_CONF_OK; -} - - -static char * -ngx_http_dav_ext_lock_zone(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) -{ - u_char *p; - time_t timeout; - ssize_t size; - ngx_str_t *value, name, s; - ngx_uint_t i; - ngx_shm_zone_t *shm_zone; - ngx_http_dav_ext_lock_t *lock; - - value = cf->args->elts; - - name.len = 0; - size = 0; - timeout = 60; - - for (i = 1; i < cf->args->nelts; i++) { - - if (ngx_strncmp(value[i].data, "zone=", 5) == 0) { - - name.data = value[i].data + 5; - - p = (u_char *) ngx_strchr(name.data, ':'); - - if (p == NULL) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "invalid zone size \"%V\"", &value[i]); - return NGX_CONF_ERROR; - } - - name.len = p - name.data; - - s.data = p + 1; - s.len = value[i].data + value[i].len - s.data; - - size = ngx_parse_size(&s); - - if (size == NGX_ERROR) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "invalid zone size \"%V\"", &value[i]); - return NGX_CONF_ERROR; - } - - if (size < (ssize_t) (8 * ngx_pagesize)) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "zone \"%V\" is too small", &value[i]); - return NGX_CONF_ERROR; - } - - continue; - } - - if (ngx_strncmp(value[i].data, "timeout=", 8) == 0) { - - s.len = value[i].len - 8; - s.data = value[i].data + 8; - - timeout = ngx_parse_time(&s, 1); - if (timeout == (time_t) NGX_ERROR || timeout == 0) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "invalid timeout value \"%V\"", &value[i]); - return NGX_CONF_ERROR; - } - - continue; - } - - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "invalid parameter \"%V\"", &value[i]); - return NGX_CONF_ERROR; - } - - if (name.len == 0) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "\"%V\" must have \"zone\" parameter", - &cmd->name); - return NGX_CONF_ERROR; - } - - lock = ngx_pcalloc(cf->pool, sizeof(ngx_http_dav_ext_lock_t)); - if (lock == NULL) { - return NGX_CONF_ERROR; - } - - lock->timeout = timeout; - - shm_zone = ngx_shared_memory_add(cf, &name, size, - &ngx_http_dav_ext_module); - if (shm_zone == NULL) { - return NGX_CONF_ERROR; - } - - if (shm_zone->data) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "duplicate zone \"%V\"", &name); - return NGX_CONF_ERROR; - } - - shm_zone->init = ngx_http_dav_ext_init_zone; - shm_zone->data = lock; - - return NGX_CONF_OK; -} - - -static char * -ngx_http_dav_ext_lock(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) -{ - ngx_http_dav_ext_loc_conf_t *dlcf = conf; - - ngx_str_t *value, s; - ngx_uint_t i; - ngx_shm_zone_t *shm_zone; - - if (dlcf->shm_zone) { - return "is duplicate"; - } - - value = cf->args->elts; - - shm_zone = NULL; - - for (i = 1; i < cf->args->nelts; i++) { - - if (ngx_strncmp(value[i].data, "zone=", 5) == 0) { - - s.len = value[i].len - 5; - s.data = value[i].data + 5; - - shm_zone = ngx_shared_memory_add(cf, &s, 0, - &ngx_http_dav_ext_module); - if (shm_zone == NULL) { - return NGX_CONF_ERROR; - } - - continue; - } - - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "invalid parameter \"%V\"", &value[i]); - return NGX_CONF_ERROR; - } - - if (shm_zone == NULL) { - ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, - "\"%V\" must have \"zone\" parameter", &cmd->name); - return NGX_CONF_ERROR; - } - - dlcf->shm_zone = shm_zone; - - return NGX_CONF_OK; -} - - -static ngx_int_t -ngx_http_dav_ext_init(ngx_conf_t *cf) -{ - ngx_http_handler_pt *h; - ngx_http_core_main_conf_t *cmcf; - - cmcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_core_module); - - h = ngx_array_push(&cmcf->phases[NGX_HTTP_PRECONTENT_PHASE].handlers); - if (h == NULL) { - return NGX_ERROR; - } - - *h = ngx_http_dav_ext_precontent_handler; - - h = ngx_array_push(&cmcf->phases[NGX_HTTP_CONTENT_PHASE].handlers); - if (h == NULL) { - return NGX_ERROR; - } - - *h = ngx_http_dav_ext_content_handler; - - return NGX_OK; -} diff --git a/debian/modules/http-dav-ext/t/dav_ext.t b/debian/modules/http-dav-ext/t/dav_ext.t deleted file mode 100644 index 00327e2..0000000 --- a/debian/modules/http-dav-ext/t/dav_ext.t +++ /dev/null @@ -1,141 +0,0 @@ -#!/usr/bin/perl - -# (C) Roman Arutyunyan - -# Tests for nginx-dav-ext-module. - -############################################################################### - -use warnings; -use strict; - -use Test::More; - -BEGIN { use FindBin; chdir($FindBin::Bin); } - -use lib 'lib'; -use Test::Nginx; -use HTTP::DAV - -############################################################################### - -select STDERR; $| = 1; -select STDOUT; $| = 1; - -my $t = Test::Nginx->new()->has(qw/http dav/)->plan(20); - -$t->write_file_expand('nginx.conf', <<'EOF'); - -%%TEST_GLOBALS%% - -daemon off; - -events { -} - -http { - %%TEST_GLOBALS_HTTP%% - - dav_ext_lock_zone zone=foo:10m timeout=10s; - - server { - listen 127.0.0.1:8080; - server_name localhost; - - location / { - dav_methods PUT DELETE MKCOL COPY MOVE; - dav_ext_methods PROPFIND OPTIONS LOCK UNLOCK; - dav_ext_lock zone=foo; - } - } -} - -EOF - -$t->write_file('foo', 'foo'); - -$t->run(); - -############################################################################### - -my $url = "http://127.0.0.1:8080"; - -my $content; - -my $d = HTTP::DAV->new(); -$d->open($url); - -my $d2 = HTTP::DAV->new(); -$d2->open($url); - -#debug: -#$d->DebugLevel(3); -#see /tmp/perldav_debug.txt. - -my $p = $d->propfind('/', 1); -is($p->is_collection, 1, 'propfind dir collection'); -is($p->get_property('displayname'), '/', 'propfind dir displayname'); -is($p->get_uri(), 'http://127.0.0.1:8080/', 'propfind dir uri'); - -$p = $d->propfind('/foo'); -is($p->is_collection, 0, 'propfind file collection'); -is($p->get_property('displayname'), 'foo', 'propfind file displayname'); -is($p->get_uri(), 'http://127.0.0.1:8080/foo', 'propfind file uri'); -is($p->get_property('getcontentlength'), '3', 'propfind file size'); - -$d->lock('/foo'); -is($d->lock('/foo'), 0, 'prevent double lock'); - -$d->unlock('/foo'); -is($d->lock('/foo'), 1, 'relock'); - -$d->lock('/bar'); -$p = $d->propfind('/bar'); -is($p->get_property('displayname'), 'bar', 'lock creates a file'); - -$d->get('/bar', \$content) or $content = 'none'; -is($content, '', 'lock creates an empty file'); - -$content = "bar"; -$d->put(\$content, '/bar'); -$d->get('/bar', \$content) or $content = ''; -is($content, 'bar', 'put lock'); - -$content = "qux"; -$d2->put(\$content, '/bar'); -$d2->get('/bar', \$content) or $content = ''; -isnt($content, 'qux', 'prevent put lock'); - -$d->mkcol('/d/'); -$d->lock('/d/'); -$d->copy('/bar', '/d/bar'); -$d->get('/d/bar', \$content) or $content = ''; -is($content, 'bar', 'copy lock'); - -$d2->copy('/bar', '/d/qux'); -$d2->get('/d/qux', \$content) or $content = ''; -isnt($content, 'bar', 'prevent copy lock'); - -$d2->delete('/d/bar'); -$d2->get('/d/bar', \$content) or $content = ''; -is($content, 'bar', 'prevent delete lock'); - -$d->delete('/d/bar'); -$d->get('/d/bar', \$content) or $content = ''; -is($content, '', 'delete lock'); - -$d->mkcol('/d/c/'); -$p = $d->propfind('/d/c/'); -is($p->is_collection, 1, 'mkcol lock'); - -$d2->mkcol('/d/e/'); -is($d2->propfind('/d/e/'), 0, 'prevent mkcol lock'); - -$d->unlock('/d/'); -$d->lock('/d/', -depth=>"0"); -$content = 'qux'; -$d2->put(\$content, '/d/c/qux'); -$d2->get('/d/c/qux', \$content) or $content = ''; -is($content, 'qux', 'put to a depth-0-locked subdirectory'); - -############################################################################### diff --git a/debian/modules/http-echo/util/releng b/debian/modules/http-echo/util/releng deleted file mode 100755 index b3ad9f2..0000000 --- a/debian/modules/http-echo/util/releng +++ /dev/null @@ -1,8 +0,0 @@ -#!/bin/bash - -./update-readme -ack '.{81}' src/ngx_http_*.[ch] -ack '(?<=\#define)\s*DDEBUG\s*[12]' src -echo ======================================= -ack '(?<=This document describes echo-nginx-module v)\d+\.\d+' README - diff --git a/debian/modules/http-fancyindex/.github/workflows/ci.yml b/debian/modules/http-fancyindex/.github/workflows/ci.yml deleted file mode 100644 index a7bb1f8..0000000 --- a/debian/modules/http-fancyindex/.github/workflows/ci.yml +++ /dev/null @@ -1,40 +0,0 @@ ---- -name: Build -on: [pull_request] - -jobs: - build: - strategy: - fail-fast: false - matrix: - compiler: [gcc, clang] - dynamic: [0, 1] - nginx: - # Mainline - - 1.21.3 - # Stable. - - 1.20.1 - # First version with loadable module support. - - 1.9.15 - # Oldest supported version. - - 0.8.55 - exclude: - - nginx: 0.8.55 - dynamic: 1 - runs-on: ubuntu-18.04 - env: - CFLAGS: "-Wno-error" - steps: - - name: Checkout - uses: actions/checkout@v2 - - name: Install Packages - run: | - sudo apt update - sudo apt install -y libpcre3-dev libssl-dev - t/get-pup || echo 'Tests needing pup will be skipped' - - name: Test - env: - CC: ${{ matrix.compiler }} - run: | - CC=${{ matrix.compiler }} - t/build-and-run ${{ matrix.nginx }} ${{ matrix.dynamic }} diff --git a/debian/modules/http-fancyindex/CHANGELOG.md b/debian/modules/http-fancyindex/CHANGELOG.md deleted file mode 100644 index ebeb379..0000000 --- a/debian/modules/http-fancyindex/CHANGELOG.md +++ /dev/null @@ -1,199 +0,0 @@ -# Change Log -All notable changes to this project will be documented in this file. - -## [Unreleased] - -## [0.5.2] - 2021-10-28 -### Fixed -- Properly escape file names to ensure that file names are never renreded - as HTML. (Patch by Anthony Ryan <>, - [#128](https://github.com/aperezdc/ngx-fancyindex/pull/128).) - -## [0.5.1] - 2020-10-26 -### Fixed -- Properly handle optional second argument to `fancyindex_header` and - `fancyindex_footer` - ([#117](https://github.com/aperezdc/ngx-fancyindex/issues/117)). - -## [0.5.0] - 2020-10-24 -### Added -- New option `fancyindex_show_dotfiles`. (Path by Joshua Shaffer - <>.) -- The `fancyindex_header` and `fancyindex_footer` options now support local - files properly, by means of a `local` flag. (Patches by JoungKyun Kim - <> and Adrián Pérez <>.) - -### Changed -- Improved performance of directory entry sorting, which should be quite - noticeable for directories with thousands of files. (Patch by - [Yuxiang Zhang](https://github.com/z4yx).) -- The minimum Nginx version supported by the module is now 0.8.x. - -### Fixed -- Properly escape square brackets in directory entry names when the module - is built with older versions of Nginx. (Patch by Adrián Pérez - <>.) -- Fix directory entry listing not being shown when using the - [nginx-auth-ldap](https://github.com/kvspb/nginx-auth-ldap) module. (Patch - by JoungKyun Kim <>.) - -## [0.4.4] - 2020-02-19 -### Added -- New option `fancyindex_hide_parent_dir`, which disables generating - links to parent directories in listings. (Patch by Kawai Ryota - <>.) - -### Changed -- Each table row is now separated by a new line (as a matter of fact, - a `CRLF` sequence), which makes it easier to parse output using simple - text tools. (Patch by Anders Trier <>.) -- Some corrections and additions to the README file. (Patches by Nicolas - Carpi <> and David Beitey <>.) - -### Fixed -- Use correct character references for `&` characters in table sorter URLs - within the template (Patch by David Beitey <>.) -- Properly encode filenames when used as URI components. - -## [0.4.3] - 2018-07-03 -### Added -- Table cells now have class names, which allows for better CSS styling. - (Patch by qjqqyy <>.) -- The test suite now can parse and check elements from the HTML returned - by the module, thanks to the [pup](https://github.com/EricChiang/pup) - tool. - -### Fixed -- Sorting by file size now works correctly. - (Patch by qjqqyy <>.) - -## [0.4.2] - 2017-08-19 -### Changed -- Generated HTML from the default template is now proper HTML5, and it should - pass validation (#52). -- File sizes now have decimal positions when using `fancyindex_exact_size off`. - (Patch by Anders Trier <>.) -- Multiple updates to `README.rst` (Patches by Danila Vershinin - <>, Iulian Onofrei, Lilian Besson, and Nick Geoghegan - <>.) - -### Fixed -- Sorting by file size now also works correctly for directories which contain - files of sizes bigger than `INT_MAX`. (#74, fix suggestion by Chris Young.) -- Custom headers which fail to declare an UTF-8 encoding no longer cause table - header arrows to be rendered incorrectly by browsers (#50). -- Fix segmentation fault when opening directories with empty files (#61, patch - by Catgirl <>.) - -## [0.4.1] - 2016-08-18 -### Added -- New `fancyindex_directories_first` configuration directive (enabled by - default), which allows setting whether directories are sorted before other - files. (Patch by Luke Zapart <>.) - -### Fixed -- Fix index files not working when the fancyindex module is in use (#46). - - -## [0.4.0] - 2016-06-08 -### Added -- The module can now be built as a [dynamic - module](https://www.nginx.com/resources/wiki/extending/converting/). - (Patch by Róbert Nagy <>.) -- New configuration directive `fancyindex_show_path`, which allows hiding the - `

` header which contains the current path. - (Patch by Thomas P. <>.) - -### Changed -- Directory and file links in listings now have a title="..." attribute. - (Patch by `@janglapuk` <>.) - -### Fixed -- Fix for hung requests when the module is used along with `ngx_pagespeed`. - (Patch by Otto van der Schaaf <>.) - - -## [0.3.6] - 2016-01-26 -### Added -- New feature: Allow filtering out symbolic links using the - `fancyindex_hide_symlinks` configuration directive. (Idea and prototype - patch by Thomas Wemm.) -- New feature: Allow specifying the format of timestamps using the - `fancyindex_time_format` configuration directive. (Idea suggested by Xiao - Meng <>). - -### Changed -- Listings in top-level directories will not generate a "Parent Directory" - link as first element of the listing. (Patch by Thomas P.) - -### Fixed -- Fix propagation and overriding of the `fancyindex_css_href` setting inside - nested locations. -- Minor changes in the code to allow building cleanly under Windows with - Visual Studio 2013. (Patch by Y. Yuan <>). - - -## [0.3.5] - 2015-02-19 -### Added -- New feature: Allow setting the default sort criterion using the - `fancyindex_default_sort` configuration directive. (Patch by - Алексей Урбанский). -- New feature: Allow changing the maximum length of file names, using - the `fancyindex_name_length` configuration directive. (Patch by - Martin Herkt). - -### Changed -- Renames `NEWS.rst` to `CHANGELOG.md`, which follows the recommendations - from [Keep a Change Log](http://keepachangelog.com/). -- Configuring Nginx without the `http_addition_module` will generate a - warning during configuration, as it is needed for the `fancyindex_footer` - and `fancyindex_header` directives. - - -## [0.3.4] - 2014-09-03 - -### Added -- Viewport is now defined in the generated HTML, which works better - for mobile devices. - -### Changed -- Even-odd row styling moved to the CSS using :nth-child(). This - makes the HTML served to clients smaller. - - -## [0.3.3] - 2013-10-25 - -### Added -- New feature: table headers in the default template are now clickable - to set the sorting criteria and direction of the index entries. - (https://github.com/aperezdc/ngx-fancyindex/issues/7) - - -## [0.3.2] - 2013-06-05 - -### Fixed -- Solved a bug that would leave certain clients stalled forever. -- Improved handling of subrequests for non-builtin headers/footers. - - -## [0.3.1] - 2011-04-04 - -### Added -- `NEWS.rst` file, to act as change log. - - -[Unreleased]: https://github.com/aperezdc/ngx-fancyindex/compare/v0.5.2...HEAD -[0.5.2]: https://github.com/aperezdc/ngx-fancyindex/compare/v0.5.1...v0.5.2 -[0.5.1]: https://github.com/aperezdc/ngx-fancyindex/compare/v0.5.0...v0.5.1 -[0.5.0]: https://github.com/aperezdc/ngx-fancyindex/compare/v0.4.4...v0.5.0 -[0.4.4]: https://github.com/aperezdc/ngx-fancyindex/compare/v0.4.3...v0.4.4 -[0.4.3]: https://github.com/aperezdc/ngx-fancyindex/compare/v0.4.2...v0.4.3 -[0.4.2]: https://github.com/aperezdc/ngx-fancyindex/compare/v0.4.1...v0.4.2 -[0.4.1]: https://github.com/aperezdc/ngx-fancyindex/compare/v0.4.0...v0.4.1 -[0.4.0]: https://github.com/aperezdc/ngx-fancyindex/compare/v0.3.6...v0.4.0 -[0.3.6]: https://github.com/aperezdc/ngx-fancyindex/compare/v0.3.5...v0.3.6 -[0.3.5]: https://github.com/aperezdc/ngx-fancyindex/compare/v0.3.4...v0.3.5 -[0.3.4]: https://github.com/aperezdc/ngx-fancyindex/compare/v0.3.3...v0.3.4 -[0.3.3]: https://github.com/aperezdc/ngx-fancyindex/compare/v0.3.2...v0.3.3 -[0.3.2]: https://github.com/aperezdc/ngx-fancyindex/compare/v0.3.1...v0.3.2 -[0.3.1]: https://github.com/aperezdc/ngx-fancyindex/compare/v0.3...v0.3.1 diff --git a/debian/modules/http-fancyindex/HACKING.md b/debian/modules/http-fancyindex/HACKING.md deleted file mode 100644 index 4c8608a..0000000 --- a/debian/modules/http-fancyindex/HACKING.md +++ /dev/null @@ -1,29 +0,0 @@ -# Fancy Index module Hacking HOW-TO - -## How to modify the template - -The template is in the `template.html` file. Note that comment markers are -used to control how the `template.awk` Awk script generates the C header -which gets ultimately included in the compiled object code. Comment markers -have the `` format. Here `identifier` must be -a valid C identifier. All the text following the marker until the next -marker will be flattened into a C string. - -If the identifier is `NONE` (capitalized) the text from that marker up to -the next marker will be discarded. - - -## Regenerating the C header - -You will need Awk. I hope any decent implementation will do, but the GNU one -is known to work flawlessly. Just do: - - $ awk -f template.awk template.html > template.h - -If your copy of `awk` is not the GNU implementation, you will need to -install it and use `gawk` instead in the command line above. - -This includes macOS where the current built-in `awk` (currently version -20070501 at time of testing on 10.13.6) doesn't apply correctly and causes -characters to be omitted from the output. `gawk` can be installed with a -package manager such as [Homebrew](https://brew.sh). diff --git a/debian/modules/http-fancyindex/LICENSE b/debian/modules/http-fancyindex/LICENSE deleted file mode 100644 index 9fd66ee..0000000 --- a/debian/modules/http-fancyindex/LICENSE +++ /dev/null @@ -1,20 +0,0 @@ -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions -are met: -1. Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. -2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - -THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS ``AS IS'' AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY -OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF -SUCH DAMAGE. diff --git a/debian/modules/http-fancyindex/README.rst b/debian/modules/http-fancyindex/README.rst deleted file mode 100644 index c61a6a4..0000000 --- a/debian/modules/http-fancyindex/README.rst +++ /dev/null @@ -1,319 +0,0 @@ -======================== -Nginx Fancy Index module -======================== - -.. image:: https://travis-ci.com/aperezdc/ngx-fancyindex.svg?branch=master - :target: https://travis-ci.com/aperezdc/ngx-fancyindex - :alt: Build Status - -.. contents:: - -The Fancy Index module makes possible the generation of file listings, like -the built-in `autoindex `__ -module does, but adding a touch of style. This is possible because the module -allows a certain degree of customization of the generated content: - -* Custom headers. Either local or stored remotely. -* Custom footers. Either local or stored remotely. -* Add you own CSS style rules. -* Allow choosing to sort elements by name (default), modification time, or - size; both ascending (default), or descending. - -This module is designed to work with Nginx_, a high performance open source web -server written by `Igor Sysoev `__. - - -Requirements -============ - -CentOS 7 -~~~~~~~~ - -For users of the `official stable `__ Nginx repository, `extra packages repository with dynamic modules `__ is available and fancyindex is included. - -Install directly:: - - yum install https://extras.getpagespeed.com/redhat/7/x86_64/RPMS/nginx-module-fancyindex-1.12.0.0.4.1-1.el7.gps.x86_64.rpm - -Alternatively, add extras repository first (for future updates) and install the module:: - - yum install nginx-module-fancyindex - -Then load the module in `/etc/nginx/nginx.conf` using:: - - load_module "modules/ngx_http_fancyindex_module.so"; - -Other platforms -~~~~~~~~~~~~~~~ - -In most other cases you will need the sources for Nginx_. Any version starting -from the 0.8 series should work. - -In order to use the ``fancyindex_header_`` and ``fancyindex_footer_`` directives -you will also need the `ngx_http_addition_module `_ -built into Nginx. - - -Building -======== - -1. Unpack the Nginx_ sources:: - - $ gunzip -c nginx-?.?.?.tar.gz | tar -xvf - - -2. Unpack the sources for the fancy indexing module:: - - $ gunzip -c nginx-fancyindex-?.?.?.tar.gz | tar -xvf - - -3. Change to the directory which contains the Nginx_ sources, run the - configuration script with the desired options and be sure to put an - ``--add-module`` flag pointing to the directory which contains the source - of the fancy indexing module:: - - $ cd nginx-?.?.? - $ ./configure --add-module=../nginx-fancyindex-?.?.? \ - [--with-http_addition_module] [extra desired options] - - Since version 0.4.0, the module can also be built as a - `dynamic module `_, - using ``--add-dynamic-module=…`` instead and - ``load_module "modules/ngx_http_fancyindex_module.so";`` - in the configuration file - -4. Build and install the software:: - - $ make - - And then, as ``root``:: - - # make install - -5. Configure Nginx_ by using the modules' configuration directives_. - - -Example -======= - -You can test the default built-in style by adding the following lines into -a ``server`` section in your Nginx_ configuration file:: - - location / { - fancyindex on; # Enable fancy indexes. - fancyindex_exact_size off; # Output human-readable file sizes. - } - - -Themes -~~~~~~ - -The following themes demonstrate the level of customization which can be -achieved using the module: - -* `Theme `__ by - `@TheInsomniac `__. Uses custom header and - footer. -* `Theme `__ by - `@Naereen `__. Uses custom header and footer, the - header includes search field to filter by filename using JavaScript. -* `Theme `__ by - `@fraoustin `__. Responsive theme using - Material Design elements. -* `Theme `__ by - `@alehaa `__. Simple, flat theme based on - Bootstrap 4 and FontAwesome. - - -Directives -========== - -fancyindex -~~~~~~~~~~ -:Syntax: *fancyindex* [*on* | *off*] -:Default: fancyindex off -:Context: http, server, location -:Description: - Enables or disables fancy directory indexes. - -fancyindex_default_sort -~~~~~~~~~~~~~~~~~~~~~~~ -:Syntax: *fancyindex_default_sort* [*name* | *size* | *date* | *name_desc* | *size_desc* | *date_desc*] -:Default: fancyindex_default_sort name -:Context: http, server, location -:Description: - Defines sorting criterion by default. - -fancyindex_directories_first -~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -:Syntax: *fancyindex_directories_first* [*on* | *off*] -:Default: fancyindex_directories_first on -:Context: http, server, location -:Description: - If enabled (default setting), groups directories together and sorts them - before all regular files. If disabled, directories are sorted together with files. - -fancyindex_css_href -~~~~~~~~~~~~~~~~~~~ -:Syntax: *fancyindex_css_href uri* -:Default: fancyindex_css_href "" -:Context: http, server, location -:Description: - Allows inserting a link to a CSS style sheet in generated listings. The - provided *uri* parameter will be inserted as-is in a ```` HTML tag. - The link is inserted after the built-in CSS rules, so you can override the - default styles. - -fancyindex_exact_size -~~~~~~~~~~~~~~~~~~~~~ -:Syntax: *fancyindex_exact_size* [*on* | *off*] -:Default: fancyindex_exact_size on -:Context: http, server, location -:Description: - Defines how to represent file sizes in the directory listing; either - accurately, or rounding off to the kilobyte, the megabyte and the - gigabyte. - -fancyindex_name_length -~~~~~~~~~~~~~~~~~~~~~~ -:Syntax: *fancyindex_name_length length* -:Default: fancyindex_name_length 50 -:Context: http, server, location -:Description: - Defines the maximum file name length limit in bytes. - -fancyindex_footer -~~~~~~~~~~~~~~~~~ -:Syntax: *fancyindex_footer path* [*subrequest* | *local*] -:Default: fancyindex_footer "" -:Context: http, server, location -:Description: - Specifies which file should be inserted at the foot of directory listings. - If set to an empty string, the default footer supplied by the module will - be sent. The optional parameter indicates whether the *path* is to be - treated as an URI to load using a *subrequest* (the default), or whether - it refers to a *local* file. - -.. note:: Using this directive needs the ngx_http_addition_module_ built - into Nginx. - -.. warning:: When inserting custom header/footer a subrequest will be - issued so potentially any URL can be used as source for them. Although it - will work with external URLs, only using internal ones is supported. - External URLs are totally untested and using them will make Nginx_ block - while waiting for the subrequest to complete. If you feel like external - header/footer is a must-have for you, please - `let me know `__. - -fancyindex_header -~~~~~~~~~~~~~~~~~ -:Syntax: *fancyindex_header path* [*subrequest* | *local*] -:Default: fancyindex_header "" -:Context: http, server, location -:Description: - Specifies which file should be inserted at the head of directory listings. - If set to an empty string, the default header supplied by the module will - be sent. The optional parameter indicates whether the *path* is to be - treated as an URI to load using a *subrequest* (the default), or whether - it refers to a *local* file. - -.. note:: Using this directive needs the ngx_http_addition_module_ built - into Nginx. - -fancyindex_show_path -~~~~~~~~~~~~~~~~~~~~ -:Syntax: *fancyindex_show_path* [*on* | *off*] -:Default: fancyindex_show_path on -:Context: http, server, location -:Description: - Whether to output or not the path and the closing

tag after the header. - This is useful when you want to handle the path displaying with a PHP script - for example. - -.. warning:: This directive can be turned off only if a custom header is provided - using fancyindex_header. - -fancyindex_show_dotfiles -~~~~~~~~~~~~~~~~~~~~ -:Syntax: *fancyindex_show_dotfiles* [*on* | *off*] -:Default: fancyindex_show_dotfiles off -:Context: http, server, location -:Description: - Whether to list files that are proceeded with a dot. Normal convention is to - hide these. - -fancyindex_ignore -~~~~~~~~~~~~~~~~~ -:Syntax: *fancyindex_ignore string1 [string2 [... stringN]]* -:Default: No default. -:Context: http, server, location -:Description: - Specifies a list of file names which will be not be shown in generated - listings. If Nginx was built with PCRE support strings are interpreted as - regular expressions. - -fancyindex_hide_symlinks -~~~~~~~~~~~~~~~~~~~~~~~~ -:Syntax: *fancyindex_hide_symlinks* [*on* | *off*] -:Default: fancyindex_hide_symlinks off -:Context: http, server, location -:Description: - When enabled, generated listings will not contain symbolic links. - -fancyindex_hide_parent_dir -~~~~~~~~~~~~~~~~~~~~~~~~ -:Syntax: *fancyindex_hide_parent_dir* [*on* | *off*] -:Default: fancyindex_hide_parent_dir off -:Context: http, server, location -:Description: - When enabled, it will not show parent directory. - -fancyindex_localtime -~~~~~~~~~~~~~~~~~~~~ -:Syntax: *fancyindex_localtime* [*on* | *off*] -:Default: fancyindex_localtime off -:Context: http, server, location -:Description: - Enables showing file times as local time. Default is “off” (GMT time). - -fancyindex_time_format -~~~~~~~~~~~~~~~~~~~~~~ -:Syntax: *fancyindex_time_format* string -:Default: fancyindex_time_format "%Y-%b-%d %H:%M" -:Context: http, server, location -:Description: - Format string used for timestamps. The format specifiers are a subset of - those supported by the `strftime `_ - function, and the behavior is locale-independent (for example, day and month - names are always in English). The supported formats are: - - * ``%a``: Abbreviated name of the day of the week. - * ``%A``: Full name of the day of the week. - * ``%b``: Abbreviated month name. - * ``%B``: Full month name. - * ``%d``: Day of the month as a decimal number (range 01 to 31). - * ``%e``: Like ``%d``, the day of the month as a decimal number, but a - leading zero is replaced by a space. - * ``%F``: Equivalent to ``%Y-%m-%d`` (the ISO 8601 date format). - * ``%H``: Hour as a decimal number using a 24-hour clock (range 00 - to 23). - * ``%I``: Hour as a decimal number using a 12-hour clock (range 01 to 12). - * ``%k``: Hour (24-hour clock) as a decimal number (range 0 to 23); - single digits are preceded by a blank. - * ``%l``: Hour (12-hour clock) as a decimal number (range 1 to 12); single - digits are preceded by a blank. - * ``%m``: Month as a decimal number (range 01 to 12). - * ``%M``: Minute as a decimal number (range 00 to 59). - * ``%p``: Either "AM" or "PM" according to the given time value. - * ``%P``: Like ``%p`` but in lowercase: "am" or "pm". - * ``%r``: Time in a.m. or p.m. notation. Equivalent to ``%I:%M:%S %p``. - * ``%R``: Time in 24-hour notation (``%H:%M``). - * ``%S``: Second as a decimal number (range 00 to 60). - * ``%T``: Time in 24-hour notation (``%H:%M:%S``). - * ``%u``: Day of the week as a decimal, range 1 to 7, Monday being 1. - * ``%w``: Day of the week as a decimal, range 0 to 6, Monday being 0. - * ``%y``: Year as a decimal number without a century (range 00 to 99). - * ``%Y``: Year as a decimal number including the century. - - -.. _nginx: https://nginx.org - -.. vim:ft=rst:spell:spelllang=en: diff --git a/debian/modules/http-fancyindex/config b/debian/modules/http-fancyindex/config deleted file mode 100644 index 4ef3809..0000000 --- a/debian/modules/http-fancyindex/config +++ /dev/null @@ -1,20 +0,0 @@ -# vim:ft=sh: -ngx_addon_name=ngx_http_fancyindex_module - -if [ "$ngx_module_link" = DYNAMIC ] ; then - ngx_module_type=HTTP - ngx_module_name=ngx_http_fancyindex_module - ngx_module_srcs="$ngx_addon_dir/ngx_http_fancyindex_module.c" - ngx_module_deps="$ngx_addon_dir/template.h" - ngx_module_order="$ngx_module_name ngx_http_autoindex_module" - . auto/module -else - # XXX: Insert fancyindex module *after* index module! - # - HTTP_MODULES=`echo "${HTTP_MODULES}" | sed -e \ - 's/ngx_http_index_module/ngx_http_fancyindex_module ngx_http_index_module/'` - NGX_ADDON_SRCS="$NGX_ADDON_SRCS $ngx_addon_dir/ngx_http_fancyindex_module.c" - if [ $HTTP_ADDITION != YES ] ; then - echo " - The 'addition' filter is needed for fancyindex_{header,footer}, but it was disabled" - fi -fi diff --git a/debian/modules/http-fancyindex/ngx_http_fancyindex_module.c b/debian/modules/http-fancyindex/ngx_http_fancyindex_module.c deleted file mode 100644 index d5f1722..0000000 --- a/debian/modules/http-fancyindex/ngx_http_fancyindex_module.c +++ /dev/null @@ -1,1615 +0,0 @@ -/* - * ngx_http_fancyindex_module.c - * Copyright © 2007-2016 Adrian Perez - * - * Module used for fancy indexing of directories. Features and differences - * with the stock nginx autoindex module: - * - * - Output is a table instead of a
 element with embedded  links.
- *  - Header and footer may be added to every generated directory listing.
- *  - Default header and/or footer are generated if custom ones are not
- *    configured. Files used for header and footer can only be local path
- *    names (i.e. you cannot insert the result of a subrequest.)
- *  - Proper HTML is generated: it should validate both as XHTML 1.0 Strict
- *    and HTML 4.01.
- *
- * Base functionality heavy based upon the stock nginx autoindex module,
- * which in turn was made by Igor Sysoev, like the majority of nginx.
- *
- * Distributed under terms of the BSD license.
- */
-
-#include 
-#include 
-#include 
-#include 
-
-#include "template.h"
-
-#if defined(__GNUC__) && (__GNUC__ >= 3)
-# define ngx_force_inline __attribute__((__always_inline__))
-#else /* !__GNUC__ */
-# define ngx_force_inline
-#endif /* __GNUC__ */
-
-
-static const char *short_weekday[] = {
-    "Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun",
-};
-static const char *long_weekday[] = {
-    "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Sunday",
-};
-static const char *short_month[] = {
-    "Jan", "Feb", "Mar", "Apr", "May", "Jun",
-    "Jul", "Aug", "Sep", "Oct", "Nov", "Dec",
-};
-static const char *long_month[] = {
-    "January", "February", "March", "April", "May", "June", "July",
-    "August", "September", "October", "November", "December",
-};
-
-
-#define DATETIME_FORMATS(F_, t) \
-    F_ ('a',  3, "%3s",  short_weekday[((t)->ngx_tm_wday + 6) % 7]) \
-    F_ ('A',  9, "%s",   long_weekday [((t)->ngx_tm_wday + 6) % 7]) \
-    F_ ('b',  3, "%3s",  short_month[(t)->ngx_tm_mon - 1]         ) \
-    F_ ('B',  9, "%s",   long_month [(t)->ngx_tm_mon - 1]         ) \
-    F_ ('d',  2, "%02d", (t)->ngx_tm_mday                         ) \
-    F_ ('e',  2, "%2d",  (t)->ngx_tm_mday                         ) \
-    F_ ('F', 10, "%d-%02d-%02d",                                    \
-                  (t)->ngx_tm_year,                                 \
-                  (t)->ngx_tm_mon,                                  \
-                  (t)->ngx_tm_mday                                ) \
-    F_ ('H',  2, "%02d", (t)->ngx_tm_hour                         ) \
-    F_ ('I',  2, "%02d", ((t)->ngx_tm_hour % 12) + 1              ) \
-    F_ ('k',  2, "%2d",  (t)->ngx_tm_hour                         ) \
-    F_ ('l',  2, "%2d",  ((t)->ngx_tm_hour % 12) + 1              ) \
-    F_ ('m',  2, "%02d", (t)->ngx_tm_mon                          ) \
-    F_ ('M',  2, "%02d", (t)->ngx_tm_min                          ) \
-    F_ ('p',  2, "%2s",  (((t)->ngx_tm_hour < 12) ? "AM" : "PM")  ) \
-    F_ ('P',  2, "%2s",  (((t)->ngx_tm_hour < 12) ? "am" : "pm")  ) \
-    F_ ('r', 11, "%02d:%02d:%02d %2s",                              \
-                 ((t)->ngx_tm_hour % 12) + 1,                       \
-                 (t)->ngx_tm_min,                                   \
-                 (t)->ngx_tm_sec,                                   \
-                 (((t)->ngx_tm_hour < 12) ? "AM" : "PM")          ) \
-    F_ ('R',  5, "%02d:%02d", (t)->ngx_tm_hour, (t)->ngx_tm_min   ) \
-    F_ ('S',  2, "%02d", (t)->ngx_tm_sec                          ) \
-    F_ ('T',  8, "%02d:%02d:%02d",                                  \
-                 (t)->ngx_tm_hour,                                  \
-                 (t)->ngx_tm_min,                                   \
-                 (t)->ngx_tm_sec                                  ) \
-    F_ ('u',  1, "%1d", (((t)->ngx_tm_wday + 6) % 7) + 1          ) \
-    F_ ('w',  1, "%1d", ((t)->ngx_tm_wday + 6) % 7                ) \
-    F_ ('y',  2, "%02d", (t)->ngx_tm_year % 100                   ) \
-    F_ ('Y',  4, "%04d", (t)->ngx_tm_year                         )
-
-
-static size_t
-ngx_fancyindex_timefmt_calc_size (const ngx_str_t *fmt)
-{
-#define DATETIME_CASE(letter, fmtlen, fmt, ...) \
-        case letter: result += (fmtlen); break;
-
-    size_t i, result = 0;
-    for (i = 0; i < fmt->len; i++) {
-        if (fmt->data[i] == '%') {
-            if (++i >= fmt->len) {
-                result++;
-                break;
-            }
-            switch (fmt->data[i]) {
-                DATETIME_FORMATS(DATETIME_CASE,)
-                default:
-                    result++;
-            }
-        } else {
-            result++;
-        }
-    }
-    return result;
-
-#undef DATETIME_CASE
-}
-
-
-static u_char*
-ngx_fancyindex_timefmt (u_char *buffer, const ngx_str_t *fmt, const ngx_tm_t *tm)
-{
-#define DATETIME_CASE(letter, fmtlen, fmt, ...) \
-        case letter: buffer = ngx_snprintf(buffer, fmtlen, fmt, ##__VA_ARGS__); break;
-
-    size_t i;
-    for (i = 0; i < fmt->len; i++) {
-        if (fmt->data[i] == '%') {
-            if (++i >= fmt->len) {
-                *buffer++ = '%';
-                break;
-            }
-            switch (fmt->data[i]) {
-                DATETIME_FORMATS(DATETIME_CASE, tm)
-                default:
-                    *buffer++ = fmt->data[i];
-            }
-        } else {
-            *buffer++ = fmt->data[i];
-        }
-    }
-    return buffer;
-
-#undef DATETIME_CASE
-}
-
-typedef struct {
-    ngx_str_t path;
-    ngx_str_t local;
-} ngx_fancyindex_headerfooter_conf_t;
-
-/**
- * Configuration structure for the fancyindex module. The configuration
- * commands defined in the module do fill in the members of this structure.
- */
-typedef struct {
-    ngx_flag_t enable;         /**< Module is enabled. */
-    ngx_uint_t default_sort;   /**< Default sort criterion. */
-    ngx_flag_t dirs_first;     /**< Group directories together first when sorting */
-    ngx_flag_t localtime;      /**< File mtime dates are sent in local time. */
-    ngx_flag_t exact_size;     /**< Sizes are sent always in bytes. */
-    ngx_uint_t name_length;    /**< Maximum length of file names in bytes. */
-    ngx_flag_t hide_symlinks;  /**< Hide symbolic links in listings. */
-    ngx_flag_t show_path;      /**< Whether to display or not the path + '' after the header */
-    ngx_flag_t hide_parent;    /**< Hide parent directory. */
-    ngx_flag_t show_dot_files; /**< Show files that start with a dot.*/
-
-    ngx_str_t  css_href;       /**< Link to a CSS stylesheet, or empty if none. */
-    ngx_str_t  time_format;    /**< Format used for file timestamps. */
-
-    ngx_array_t *ignore;       /**< List of files to ignore in listings. */
-
-    ngx_fancyindex_headerfooter_conf_t header;
-    ngx_fancyindex_headerfooter_conf_t footer;
-} ngx_http_fancyindex_loc_conf_t;
-
-#define NGX_HTTP_FANCYINDEX_SORT_CRITERION_NAME       0
-#define NGX_HTTP_FANCYINDEX_SORT_CRITERION_SIZE       1
-#define NGX_HTTP_FANCYINDEX_SORT_CRITERION_DATE       2
-#define NGX_HTTP_FANCYINDEX_SORT_CRITERION_NAME_DESC  3
-#define NGX_HTTP_FANCYINDEX_SORT_CRITERION_SIZE_DESC  4
-#define NGX_HTTP_FANCYINDEX_SORT_CRITERION_DATE_DESC  5
-
-static ngx_conf_enum_t ngx_http_fancyindex_sort_criteria[] = {
-    { ngx_string("name"), NGX_HTTP_FANCYINDEX_SORT_CRITERION_NAME },
-    { ngx_string("size"), NGX_HTTP_FANCYINDEX_SORT_CRITERION_SIZE },
-    { ngx_string("date"), NGX_HTTP_FANCYINDEX_SORT_CRITERION_DATE },
-    { ngx_string("name_desc"), NGX_HTTP_FANCYINDEX_SORT_CRITERION_NAME_DESC },
-    { ngx_string("size_desc"), NGX_HTTP_FANCYINDEX_SORT_CRITERION_SIZE_DESC },
-    { ngx_string("date_desc"), NGX_HTTP_FANCYINDEX_SORT_CRITERION_DATE_DESC },
-    { ngx_null_string, 0 }
-};
-
-enum {
-    NGX_HTTP_FANCYINDEX_HEADERFOOTER_SUBREQUEST,
-    NGX_HTTP_FANCYINDEX_HEADERFOOTER_LOCAL,
-};
-
-static ngx_uint_t
-headerfooter_kind(const ngx_str_t *value)
-{
-    static const struct {
-        ngx_str_t name;
-        ngx_uint_t value;
-    } values[] = {
-        { ngx_string("subrequest"), NGX_HTTP_FANCYINDEX_HEADERFOOTER_SUBREQUEST },
-        { ngx_string("local"), NGX_HTTP_FANCYINDEX_HEADERFOOTER_LOCAL },
-    };
-
-    unsigned i;
-
-    for (i = 0; i < sizeof(values) / sizeof(values[0]); i++) {
-        if (value->len == values[i].name.len &&
-            ngx_strcasecmp(value->data, values[i].name.data) == 0)
-        {
-            return values[i].value;
-        }
-    }
-
-    return NGX_CONF_UNSET_UINT;
-}
-
-static char*
-ngx_fancyindex_conf_set_headerfooter(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
-{
-    ngx_fancyindex_headerfooter_conf_t *item =
-        (void*) (((char*) conf) + cmd->offset);
-    ngx_str_t *values = cf->args->elts;
-
-    if (item->path.data)
-        return "is duplicate";
-
-    item->path = values[1];
-
-    /* Kind of path. Default is "subrequest". */
-    ngx_uint_t kind = NGX_HTTP_FANCYINDEX_HEADERFOOTER_SUBREQUEST;
-    if (cf->args->nelts == 3) {
-        kind = headerfooter_kind(&values[2]);
-        if (kind == NGX_CONF_UNSET_UINT) {
-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
-                               "unknown header/footer kind \"%V\"", &values[2]);
-            return NGX_CONF_ERROR;
-        }
-    }
-
-    if (kind == NGX_HTTP_FANCYINDEX_HEADERFOOTER_LOCAL) {
-        ngx_file_t file;
-        ngx_file_info_t fi;
-        ssize_t n;
-
-        ngx_memzero(&file, sizeof(ngx_file_t));
-        file.log = cf->log;
-        file.fd = ngx_open_file(item->path.data, NGX_FILE_RDONLY, 0, 0);
-        if (file.fd == NGX_INVALID_FILE) {
-            ngx_conf_log_error(NGX_LOG_EMERG, cf, ngx_errno,
-                               "cannot open file \"%V\"", &values[1]);
-            return NGX_CONF_ERROR;
-        }
-
-        if (ngx_fd_info(file.fd, &fi) == NGX_FILE_ERROR) {
-            ngx_close_file(file.fd);
-            ngx_conf_log_error(NGX_LOG_EMERG, cf, ngx_errno,
-                               "cannot get info for file \"%V\"", &values[1]);
-            return NGX_CONF_ERROR;
-        }
-
-        item->local.len = ngx_file_size(&fi);
-        item->local.data = ngx_pcalloc(cf->pool, item->local.len + 1);
-        if (item->local.data == NULL) {
-            ngx_close_file(file.fd);
-            return NGX_CONF_ERROR;
-        }
-
-        n = item->local.len;
-        while (n > 0) {
-            ssize_t r = ngx_read_file(&file,
-                                      item->local.data + file.offset,
-                                      n,
-                                      file.offset);
-            if (r == NGX_ERROR) {
-                ngx_close_file(file.fd);
-                ngx_conf_log_error(NGX_LOG_EMERG, cf, ngx_errno,
-                                   "cannot read file \"%V\"", &values[1]);
-                return NGX_CONF_ERROR;
-            }
-
-            n -= r;
-        }
-        item->local.data[item->local.len] = '\0';
-    }
-
-    return NGX_CONF_OK;
-}
-
-#define NGX_HTTP_FANCYINDEX_PREALLOCATE  50
-
-
-/**
- * Calculates the length of a NULL-terminated string. It is ugly having to
- * remember to substract 1 from the sizeof result.
- */
-#define ngx_sizeof_ssz(_s)  (sizeof(_s) - 1)
-
-/**
- * Compute the length of a statically allocated array
- */
-#define DIM(x) (sizeof(x)/sizeof(*(x)))
-
-/**
- * Copy a static zero-terminated string. Useful to output template
- * string pieces into a temporary buffer.
- */
-#define ngx_cpymem_ssz(_p, _t) \
-	(ngx_cpymem((_p), (_t), sizeof(_t) - 1))
-
-/**
- * Copy a ngx_str_t.
- */
-#define ngx_cpymem_str(_p, _s) \
-	(ngx_cpymem((_p), (_s).data, (_s).len))
-
-/**
- * Check whether a particular bit is set in a particular value.
- */
-#define ngx_has_flag(_where, _what) \
-	(((_where) & (_what)) == (_what))
-
-
-
-
-typedef struct {
-    ngx_str_t      name;
-    size_t         utf_len;
-    ngx_uint_t     escape;
-    ngx_uint_t     escape_html;
-    ngx_uint_t     dir;
-    time_t         mtime;
-    off_t          size;
-} ngx_http_fancyindex_entry_t;
-
-
-
-static int ngx_libc_cdecl
-    ngx_http_fancyindex_cmp_entries_name_desc(const void *one, const void *two);
-static int ngx_libc_cdecl
-    ngx_http_fancyindex_cmp_entries_size_desc(const void *one, const void *two);
-static int ngx_libc_cdecl
-    ngx_http_fancyindex_cmp_entries_mtime_desc(const void *one, const void *two);
-static int ngx_libc_cdecl
-    ngx_http_fancyindex_cmp_entries_name_asc(const void *one, const void *two);
-static int ngx_libc_cdecl
-    ngx_http_fancyindex_cmp_entries_size_asc(const void *one, const void *two);
-static int ngx_libc_cdecl
-    ngx_http_fancyindex_cmp_entries_mtime_asc(const void *one, const void *two);
-
-static ngx_int_t ngx_http_fancyindex_error(ngx_http_request_t *r,
-    ngx_dir_t *dir, ngx_str_t *name);
-
-static ngx_int_t ngx_http_fancyindex_init(ngx_conf_t *cf);
-
-static void *ngx_http_fancyindex_create_loc_conf(ngx_conf_t *cf);
-
-static char *ngx_http_fancyindex_merge_loc_conf(ngx_conf_t *cf,
-    void *parent, void *child);
-
-static char *ngx_http_fancyindex_ignore(ngx_conf_t    *cf,
-                                        ngx_command_t *cmd,
-                                        void          *conf);
-
-static uintptr_t
-    ngx_fancyindex_escape_filename(u_char *dst, u_char*src, size_t size);
-
-/*
- * These are used only once per handler invocation. We can tell GCC to
- * inline them always, if possible (see how ngx_force_inline is defined
- * above).
- */
-static ngx_inline ngx_buf_t*
-    make_header_buf(ngx_http_request_t *r, const ngx_str_t css_href)
-    ngx_force_inline;
-
-
-static ngx_command_t  ngx_http_fancyindex_commands[] = {
-
-    { ngx_string("fancyindex"),
-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,
-      ngx_conf_set_flag_slot,
-      NGX_HTTP_LOC_CONF_OFFSET,
-      offsetof(ngx_http_fancyindex_loc_conf_t, enable),
-      NULL },
-
-    { ngx_string("fancyindex_default_sort"),
-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,
-      ngx_conf_set_enum_slot,
-      NGX_HTTP_LOC_CONF_OFFSET,
-      offsetof(ngx_http_fancyindex_loc_conf_t, default_sort),
-      &ngx_http_fancyindex_sort_criteria },
-
-    { ngx_string("fancyindex_directories_first"),
-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,
-      ngx_conf_set_flag_slot,
-      NGX_HTTP_LOC_CONF_OFFSET,
-      offsetof(ngx_http_fancyindex_loc_conf_t, dirs_first),
-      NULL },
-
-    { ngx_string("fancyindex_localtime"),
-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,
-      ngx_conf_set_flag_slot,
-      NGX_HTTP_LOC_CONF_OFFSET,
-      offsetof(ngx_http_fancyindex_loc_conf_t, localtime),
-      NULL },
-
-    { ngx_string("fancyindex_exact_size"),
-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,
-      ngx_conf_set_flag_slot,
-      NGX_HTTP_LOC_CONF_OFFSET,
-      offsetof(ngx_http_fancyindex_loc_conf_t, exact_size),
-      NULL },
-
-    { ngx_string("fancyindex_name_length"),
-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,
-      ngx_conf_set_num_slot,
-      NGX_HTTP_LOC_CONF_OFFSET,
-      offsetof(ngx_http_fancyindex_loc_conf_t, name_length),
-      NULL },
-
-    { ngx_string("fancyindex_header"),
-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE12,
-      ngx_fancyindex_conf_set_headerfooter,
-      NGX_HTTP_LOC_CONF_OFFSET,
-      offsetof(ngx_http_fancyindex_loc_conf_t, header),
-      NULL },
-
-    { ngx_string("fancyindex_footer"),
-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE12,
-      ngx_fancyindex_conf_set_headerfooter,
-      NGX_HTTP_LOC_CONF_OFFSET,
-      offsetof(ngx_http_fancyindex_loc_conf_t, footer),
-      NULL },
-
-    { ngx_string("fancyindex_css_href"),
-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,
-      ngx_conf_set_str_slot,
-      NGX_HTTP_LOC_CONF_OFFSET,
-      offsetof(ngx_http_fancyindex_loc_conf_t, css_href),
-      NULL },
-
-    { ngx_string("fancyindex_ignore"),
-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE,
-      ngx_http_fancyindex_ignore,
-      NGX_HTTP_LOC_CONF_OFFSET,
-      0,
-      NULL },
-
-    { ngx_string("fancyindex_hide_symlinks"),
-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,
-      ngx_conf_set_flag_slot,
-      NGX_HTTP_LOC_CONF_OFFSET,
-      offsetof(ngx_http_fancyindex_loc_conf_t, hide_symlinks),
-      NULL },
-
-    { ngx_string("fancyindex_show_path"),
-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,
-      ngx_conf_set_flag_slot,
-      NGX_HTTP_LOC_CONF_OFFSET,
-      offsetof(ngx_http_fancyindex_loc_conf_t, show_path),
-      NULL },
-
-    { ngx_string("fancyindex_show_dotfiles"),
-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,
-      ngx_conf_set_flag_slot,
-      NGX_HTTP_LOC_CONF_OFFSET,
-      offsetof(ngx_http_fancyindex_loc_conf_t, show_dot_files),
-      NULL },
-
-    { ngx_string("fancyindex_hide_parent_dir"),
-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,
-      ngx_conf_set_flag_slot,
-      NGX_HTTP_LOC_CONF_OFFSET,
-      offsetof(ngx_http_fancyindex_loc_conf_t, hide_parent),
-      NULL },
-
-    { ngx_string("fancyindex_time_format"),
-      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,
-      ngx_conf_set_str_slot,
-      NGX_HTTP_LOC_CONF_OFFSET,
-      offsetof(ngx_http_fancyindex_loc_conf_t, time_format),
-      NULL },
-
-    ngx_null_command
-};
-
-
-static ngx_http_module_t  ngx_http_fancyindex_module_ctx = {
-    NULL,                                  /* preconfiguration */
-    ngx_http_fancyindex_init,              /* postconfiguration */
-
-    NULL,                                  /* create main configuration */
-    NULL,                                  /* init main configuration */
-
-    NULL,                                  /* create server configuration */
-    NULL,                                  /* merge server configuration */
-
-    ngx_http_fancyindex_create_loc_conf,   /* create location configuration */
-    ngx_http_fancyindex_merge_loc_conf     /* merge location configuration */
-};
-
-
-ngx_module_t  ngx_http_fancyindex_module = {
-    NGX_MODULE_V1,
-    &ngx_http_fancyindex_module_ctx,       /* module context */
-    ngx_http_fancyindex_commands,          /* module directives */
-    NGX_HTTP_MODULE,                       /* module type */
-    NULL,                                  /* init master */
-    NULL,                                  /* init module */
-    NULL,                                  /* init process */
-    NULL,                                  /* init thread */
-    NULL,                                  /* exit thread */
-    NULL,                                  /* exit process */
-    NULL,                                  /* exit master */
-    NGX_MODULE_V1_PADDING
-};
-
-
-
-static const ngx_str_t css_href_pre =
-    ngx_string("\n");
-
-
-#ifdef NGX_ESCAPE_URI_COMPONENT
-static inline uintptr_t
-ngx_fancyindex_escape_filename(u_char *dst, u_char *src, size_t size)
-{
-    return ngx_escape_uri(dst, src, size, NGX_ESCAPE_URI_COMPONENT);
-}
-#else /* !NGX_ESCAPE_URI_COMPONENT */
-static uintptr_t
-ngx_fancyindex_escape_filename(u_char *dst, u_char *src, size_t size)
-{
-    /*
-     * The ngx_escape_uri() function will not escape colons or the
-     * ? character, which signals the beginning of the query string.
-     * So we handle those characters ourselves.
-     *
-     * TODO: Get rid of this once ngx_escape_uri() works as expected!
-     */
-
-    u_int escapes = 0;
-    u_char *psrc = src;
-    size_t psize = size;
-
-    while (psize--) {
-        switch (*psrc++) {
-            case ':':
-            case '?':
-            case '[':
-            case ']':
-                escapes++;
-                break;
-        }
-    }
-
-    if (dst == NULL) {
-        return escapes + ngx_escape_uri(NULL, src, size, NGX_ESCAPE_HTML);
-    }
-    else if (escapes == 0) {
-        /* No need to do extra escaping, avoid the temporary buffer */
-        return ngx_escape_uri(dst, src, size, NGX_ESCAPE_HTML);
-    }
-    else {
-        uintptr_t uescapes = ngx_escape_uri(NULL, src, size, NGX_ESCAPE_HTML);
-        size_t bufsz = size + 2 * uescapes;
-
-        /*
-         * GCC and CLANG both support stack-allocated variable length
-         * arrays. Take advantage of that to avoid a malloc-free cycle.
-         */
-#if defined(__GNUC__) || defined(__clang__)
-        u_char cbuf[bufsz];
-        u_char *buf = cbuf;
-#else  /* __GNUC__ || __clang__ */
-        u_char *buf = (u_char*) malloc(sizeof(u_char) * bufsz);
-#endif /* __GNUC__ || __clang__ */
-
-        ngx_escape_uri(buf, src, size, NGX_ESCAPE_HTML);
-
-        while (bufsz--) {
-            switch (*buf) {
-                case ':':
-                    *dst++ = '%';
-                    *dst++ = '3';
-                    *dst++ = 'A';
-                    break;
-                case '?':
-                    *dst++ = '%';
-                    *dst++ = '3';
-                    *dst++ = 'F';
-                    break;
-                case '[':
-                    *dst++ = '%';
-                    *dst++ = '5';
-                    *dst++ = 'B';
-                    break;
-                case ']':
-                    *dst++ = '%';
-                    *dst++ = '5';
-                    *dst++ = 'D';
-                    break;
-                default:
-                    *dst++ = *buf;
-            }
-            buf++;
-        }
-
-#if !defined(__GNUC__) && !defined(__clang__)
-        free(buf);
-#endif /* !__GNUC__ && !__clang__ */
-
-        return escapes + uescapes;
-    }
-}
-#endif /* NGX_ESCAPE_URI_COMPONENT */
-
-
-static ngx_inline ngx_buf_t*
-make_header_buf(ngx_http_request_t *r, const ngx_str_t css_href)
-{
-    ngx_buf_t *b;
-    size_t blen = r->uri.len
-        + ngx_sizeof_ssz(t01_head1)
-        + ngx_sizeof_ssz(t02_head2)
-        + ngx_sizeof_ssz(t03_head3)
-        + ngx_sizeof_ssz(t04_body1)
-        ;
-
-    if (css_href.len) {
-        blen += css_href_pre.len \
-              + css_href.len \
-              + css_href_post.len
-              ;
-    }
-
-    if ((b = ngx_create_temp_buf(r->pool, blen)) == NULL)
-        return NULL;
-
-    b->last = ngx_cpymem_ssz(b->last, t01_head1);
-
-    if (css_href.len) {
-        b->last = ngx_cpymem_str(b->last, css_href_pre);
-        b->last = ngx_cpymem_str(b->last, css_href);
-        b->last = ngx_cpymem_str(b->last, css_href_post);
-    }
-
-    b->last = ngx_cpymem_ssz(b->last, t02_head2);
-    b->last = ngx_cpymem_str(b->last, r->uri);
-    b->last = ngx_cpymem_ssz(b->last, t03_head3);
-    b->last = ngx_cpymem_ssz(b->last, t04_body1);
-
-    return b;
-}
-
-
-static ngx_inline ngx_int_t
-make_content_buf(
-        ngx_http_request_t *r, ngx_buf_t **pb,
-        ngx_http_fancyindex_loc_conf_t *alcf)
-{
-    ngx_http_fancyindex_entry_t *entry;
-
-    int (*sort_cmp_func)(const void *, const void *);
-    const char  *sort_url_args = "";
-
-    off_t        length;
-    size_t       len, root, copy, allocated, escape_html;
-    int64_t      multiplier;
-    u_char      *filename, *last;
-    ngx_tm_t     tm;
-    ngx_array_t  entries;
-    ngx_time_t  *tp;
-    ngx_uint_t   i, j;
-    ngx_str_t    path;
-    ngx_dir_t    dir;
-    ngx_buf_t   *b;
-
-    static const char    *sizes[]  = { "EiB", "PiB", "TiB", "GiB", "MiB", "KiB", "B" };
-    static const int64_t  exbibyte = 1024LL * 1024LL * 1024LL *
-                                     1024LL * 1024LL * 1024LL;
-
-    /*
-     * NGX_DIR_MASK_LEN is lesser than NGX_HTTP_FANCYINDEX_PREALLOCATE
-     */
-    if ((last = ngx_http_map_uri_to_path(r, &path, &root,
-                    NGX_HTTP_FANCYINDEX_PREALLOCATE)) == NULL)
-        return NGX_HTTP_INTERNAL_SERVER_ERROR;
-
-    allocated = path.len;
-    path.len  = last - path.data - 1;
-    path.data[path.len] = '\0';
-
-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
-                   "http fancyindex: \"%s\"", path.data);
-
-    if (ngx_open_dir(&path, &dir) == NGX_ERROR) {
-        ngx_int_t rc, err = ngx_errno;
-        ngx_uint_t level;
-
-        if (err == NGX_ENOENT || err == NGX_ENOTDIR || err == NGX_ENAMETOOLONG) {
-            level = NGX_LOG_ERR;
-            rc = NGX_HTTP_NOT_FOUND;
-        } else if (err == NGX_EACCES) {
-            level = NGX_LOG_ERR;
-            rc = NGX_HTTP_FORBIDDEN;
-        } else {
-            level = NGX_LOG_CRIT;
-            rc = NGX_HTTP_INTERNAL_SERVER_ERROR;
-        }
-
-        ngx_log_error(level, r->connection->log, err,
-                ngx_open_dir_n " \"%s\" failed", path.data);
-
-        return rc;
-    }
-
-#if (NGX_SUPPRESS_WARN)
-    /* MSVC thinks 'entries' may be used without having been initialized */
-    ngx_memzero(&entries, sizeof(ngx_array_t));
-#endif /* NGX_SUPPRESS_WARN */
-
-
-    if (ngx_array_init(&entries, r->pool, 40,
-                sizeof(ngx_http_fancyindex_entry_t)) != NGX_OK)
-        return ngx_http_fancyindex_error(r, &dir, &path);
-
-    filename = path.data;
-    filename[path.len] = '/';
-
-    /* Read directory entries and their associated information. */
-    for (;;) {
-        ngx_set_errno(0);
-
-        if (ngx_read_dir(&dir) == NGX_ERROR) {
-            ngx_int_t err = ngx_errno;
-
-            if (err != NGX_ENOMOREFILES) {
-                ngx_log_error(NGX_LOG_CRIT, r->connection->log, err,
-                        ngx_read_dir_n " \"%V\" failed", &path);
-                return ngx_http_fancyindex_error(r, &dir, &path);
-            }
-            break;
-        }
-
-        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
-                       "http fancyindex file: \"%s\"", ngx_de_name(&dir));
-
-        len = ngx_de_namelen(&dir);
-
-        if (!alcf->show_dot_files && ngx_de_name(&dir)[0] == '.')
-            continue;
-
-        if (alcf->hide_symlinks && ngx_de_is_link (&dir))
-            continue;
-
-#if NGX_PCRE
-        {
-            ngx_str_t str;
-            str.len = len;
-            str.data = ngx_de_name(&dir);
-
-            if (alcf->ignore && ngx_regex_exec_array(alcf->ignore, &str,
-                                                     r->connection->log)
-                != NGX_DECLINED)
-            {
-                continue;
-            }
-        }
-#else /* !NGX_PCRE */
-        if (alcf->ignore) {
-            u_int match_found = 0;
-            ngx_str_t *s = alcf->ignore->elts;
-
-            for (i = 0; i < alcf->ignore->nelts; i++, s++) {
-                if (ngx_strcmp(ngx_de_name(&dir), s->data) == 0) {
-                    match_found = 1;
-                    break;
-                }
-            }
-
-            if (match_found) {
-                continue;
-            }
-        }
-#endif /* NGX_PCRE */
-
-        if (!dir.valid_info) {
-            /* 1 byte for '/' and 1 byte for terminating '\0' */
-            if (path.len + 1 + len + 1 > allocated) {
-                allocated = path.len + 1 + len + 1
-                          + NGX_HTTP_FANCYINDEX_PREALLOCATE;
-
-                if ((filename = ngx_palloc(r->pool, allocated)) == NULL)
-                    return ngx_http_fancyindex_error(r, &dir, &path);
-
-                last = ngx_cpystrn(filename, path.data, path.len + 1);
-                *last++ = '/';
-            }
-
-            ngx_cpystrn(last, ngx_de_name(&dir), len + 1);
-
-            if (ngx_de_info(filename, &dir) == NGX_FILE_ERROR) {
-                ngx_int_t err = ngx_errno;
-
-                if (err != NGX_ENOENT) {
-                    ngx_log_error(NGX_LOG_ERR, r->connection->log, err,
-                            ngx_de_info_n " \"%s\" failed", filename);
-                    continue;
-                }
-
-                if (ngx_de_link_info(filename, &dir) == NGX_FILE_ERROR) {
-                    ngx_log_error(NGX_LOG_CRIT, r->connection->log, ngx_errno,
-                            ngx_de_link_info_n " \"%s\" failed", filename);
-                    return ngx_http_fancyindex_error(r, &dir, &path);
-                }
-            }
-        }
-
-        if ((entry = ngx_array_push(&entries)) == NULL)
-            return ngx_http_fancyindex_error(r, &dir, &path);
-
-        entry->name.len  = len;
-        entry->name.data = ngx_palloc(r->pool, len + 1);
-        if (entry->name.data == NULL)
-            return ngx_http_fancyindex_error(r, &dir, &path);
-
-        ngx_cpystrn(entry->name.data, ngx_de_name(&dir), len + 1);
-        entry->escape = 2 * ngx_fancyindex_escape_filename(NULL,
-                                                           ngx_de_name(&dir),
-                                                           len);
-        entry->escape_html = ngx_escape_html(NULL,
-                                             entry->name.data,
-                                             entry->name.len);
-
-        entry->dir     = ngx_de_is_dir(&dir);
-        entry->mtime   = ngx_de_mtime(&dir);
-        entry->size    = ngx_de_size(&dir);
-        entry->utf_len = (r->headers_out.charset.len == 5 &&
-                ngx_strncasecmp(r->headers_out.charset.data, (u_char*) "utf-8", 5) == 0)
-            ?  ngx_utf8_length(entry->name.data, entry->name.len)
-            : len;
-    }
-
-    if (ngx_close_dir(&dir) == NGX_ERROR) {
-        ngx_log_error(NGX_LOG_ALERT, r->connection->log, ngx_errno,
-                ngx_close_dir_n " \"%s\" failed", &path);
-    }
-
-    /*
-     * Calculate needed buffer length.
-     */
-
-    escape_html = ngx_escape_html(NULL, r->uri.data, r->uri.len);
-
-    if (alcf->show_path)
-        len = r->uri.len + escape_html
-          + ngx_sizeof_ssz(t05_body2)
-          + ngx_sizeof_ssz(t06_list1)
-          + ngx_sizeof_ssz(t_parentdir_entry)
-          + ngx_sizeof_ssz(t07_list2)
-          + ngx_fancyindex_timefmt_calc_size (&alcf->time_format) * entries.nelts
-          ;
-   else
-        len = r->uri.len + escape_html
-          + ngx_sizeof_ssz(t06_list1)
-          + ngx_sizeof_ssz(t_parentdir_entry)
-          + ngx_sizeof_ssz(t07_list2)
-          + ngx_fancyindex_timefmt_calc_size (&alcf->time_format) * entries.nelts
-          ;
-
-    /*
-     * If we are a the root of the webserver (URI =  "/" --> length of 1),
-     * do not display the "Parent Directory" link.
-     */
-    if (r->uri.len == 1) {
-        len -= ngx_sizeof_ssz(t_parentdir_entry);
-    }
-
-    entry = entries.elts;
-    for (i = 0; i < entries.nelts; i++) {
-        /*
-         * Genearated table rows are as follows, unneeded whitespace
-         * is stripped out:
-         *
-         *   
-         *     fname
-         *     sizedate
-         *   
-         */
-        len += ngx_sizeof_ssz("")
-            + entry[i].name.len + entry[i].utf_len + entry[i].escape_html
-            + alcf->name_length + ngx_sizeof_ssz(">")
-            + ngx_sizeof_ssz("")
-            + 20 /* File size */
-            + ngx_sizeof_ssz("")    /* Date prefix */
-            + ngx_sizeof_ssz("\n") /* Date suffix */
-            + 2 /* CR LF */
-            ;
-    }
-
-    if ((b = ngx_create_temp_buf(r->pool, len)) == NULL)
-        return NGX_HTTP_INTERNAL_SERVER_ERROR;
-
-    /*
-     * Determine the sorting criteria. URL arguments look like:
-     *
-     *    C=x[&O=y]
-     *
-     * Where x={M,S,N} and y={A,D}
-     */
-    if ((r->args.len == 3 || (r->args.len == 7 && r->args.data[3] == '&')) &&
-        r->args.data[0] == 'C' && r->args.data[1] == '=')
-    {
-        /* Determine whether the direction of the sorting */
-        ngx_int_t sort_descending = r->args.len == 7
-                                 && r->args.data[4] == 'O'
-                                 && r->args.data[5] == '='
-                                 && r->args.data[6] == 'D';
-
-        /* Pick the sorting criteria */
-        switch (r->args.data[2]) {
-            case 'M': /* Sort by mtime */
-                if (sort_descending) {
-                    sort_cmp_func = ngx_http_fancyindex_cmp_entries_mtime_desc;
-                    if (alcf->default_sort != NGX_HTTP_FANCYINDEX_SORT_CRITERION_DATE_DESC)
-                        sort_url_args = "?C=M&O=D";
-                }
-                else {
-                    sort_cmp_func = ngx_http_fancyindex_cmp_entries_mtime_asc;
-                    if (alcf->default_sort != NGX_HTTP_FANCYINDEX_SORT_CRITERION_DATE)
-                        sort_url_args = "?C=M&O=A";
-                }
-                break;
-            case 'S': /* Sort by size */
-                if (sort_descending) {
-                    sort_cmp_func = ngx_http_fancyindex_cmp_entries_size_desc;
-                    if (alcf->default_sort != NGX_HTTP_FANCYINDEX_SORT_CRITERION_SIZE_DESC)
-                        sort_url_args = "?C=S&O=D";
-                }
-                else {
-                    sort_cmp_func = ngx_http_fancyindex_cmp_entries_size_asc;
-                        if (alcf->default_sort != NGX_HTTP_FANCYINDEX_SORT_CRITERION_SIZE)
-                    sort_url_args = "?C=S&O=A";
-                }
-                break;
-            case 'N': /* Sort by name */
-            default:
-                if (sort_descending) {
-                    sort_cmp_func = ngx_http_fancyindex_cmp_entries_name_desc;
-                    if (alcf->default_sort != NGX_HTTP_FANCYINDEX_SORT_CRITERION_NAME_DESC)
-                        sort_url_args = "?C=N&O=D";
-                }
-                else {
-                    sort_cmp_func = ngx_http_fancyindex_cmp_entries_name_asc;
-                    if (alcf->default_sort != NGX_HTTP_FANCYINDEX_SORT_CRITERION_NAME)
-                        sort_url_args = "?C=N&O=A";
-                }
-                break;
-        }
-    }
-    else {
-        switch (alcf->default_sort) {
-            case NGX_HTTP_FANCYINDEX_SORT_CRITERION_DATE_DESC:
-                sort_cmp_func = ngx_http_fancyindex_cmp_entries_mtime_desc;
-                break;
-            case NGX_HTTP_FANCYINDEX_SORT_CRITERION_DATE:
-                sort_cmp_func = ngx_http_fancyindex_cmp_entries_mtime_asc;
-                break;
-            case NGX_HTTP_FANCYINDEX_SORT_CRITERION_SIZE_DESC:
-                sort_cmp_func = ngx_http_fancyindex_cmp_entries_size_desc;
-                break;
-            case NGX_HTTP_FANCYINDEX_SORT_CRITERION_SIZE:
-                sort_cmp_func = ngx_http_fancyindex_cmp_entries_size_asc;
-                break;
-            case NGX_HTTP_FANCYINDEX_SORT_CRITERION_NAME_DESC:
-                sort_cmp_func = ngx_http_fancyindex_cmp_entries_name_desc;
-                break;
-            case NGX_HTTP_FANCYINDEX_SORT_CRITERION_NAME:
-            default:
-                sort_cmp_func = ngx_http_fancyindex_cmp_entries_name_asc;
-                break;
-        }
-    }
-
-    /* Sort entries, if needed */
-    if (entries.nelts > 1) {
-        if (alcf->dirs_first)
-        {
-            ngx_http_fancyindex_entry_t *l, *r;
-
-            l = entry;
-            r = entry + entries.nelts - 1;
-            while (l < r)
-            {
-                while (l < r && l->dir)
-                    l++;
-                while (l < r && !r->dir)
-                    r--;
-                if (l < r) {
-                    /* Now l points a file while r points a directory */
-                    ngx_http_fancyindex_entry_t tmp;
-                    tmp = *l;
-                    *l = *r;
-                    *r = tmp;
-                }
-            }
-            if (r->dir)
-                r++;
-
-            if (r > entry)
-                /* Sort directories */
-                ngx_qsort(entry, (size_t)(r - entry),
-                        sizeof(ngx_http_fancyindex_entry_t), sort_cmp_func);
-            if (r < entry + entries.nelts)
-                /* Sort files */
-                ngx_qsort(r, (size_t)(entry + entries.nelts - r),
-                        sizeof(ngx_http_fancyindex_entry_t), sort_cmp_func);
-        } else {
-            ngx_qsort(entry, (size_t)entries.nelts,
-                    sizeof(ngx_http_fancyindex_entry_t), sort_cmp_func);
-        }
-    }
-
-    /* Display the path, if needed */
-    if (alcf->show_path){
-        b->last = last = (u_char *) ngx_escape_html(b->last, r->uri.data, r->uri.len);
-        b->last = ngx_cpymem_ssz(b->last, t05_body2);
-    }
-
-    /* Open the  tag */
-    b->last = ngx_cpymem_ssz(b->last, t06_list1);
-
-    tp = ngx_timeofday();
-
-    /* "Parent dir" entry, always first if displayed */
-    if (r->uri.len > 1 && alcf->hide_parent == 0) {
-        b->last = ngx_cpymem_ssz(b->last,
-                                 ""
-                                 ""
-                                 ""
-                                 ""
-                                 ""
-                                 CRLF);
-    }
-
-    /* Entries for directories and files */
-    for (i = 0; i < entries.nelts; i++) {
-        b->last = ngx_cpymem_ssz(b->last, "");
-
-        *b->last++ = CR;
-        *b->last++ = LF;
-    }
-
-    /* Output table bottom */
-    b->last = ngx_cpymem_ssz(b->last, t07_list2);
-
-    *pb = b;
-    return NGX_OK;
-}
-
-
-
-static ngx_int_t
-ngx_http_fancyindex_handler(ngx_http_request_t *r)
-{
-    ngx_http_request_t             *sr;
-    ngx_str_t                      *sr_uri;
-    ngx_str_t                       rel_uri;
-    ngx_int_t                       rc;
-    ngx_http_fancyindex_loc_conf_t *alcf;
-    ngx_chain_t                     out[3] = {
-        { NULL, NULL }, { NULL, NULL}, { NULL, NULL }};
-
-
-    if (r->uri.data[r->uri.len - 1] != '/') {
-        return NGX_DECLINED;
-    }
-
-    /* TODO: Win32 */
-#if defined(nginx_version) \
-    && ((nginx_version < 7066) \
-        || ((nginx_version > 8000) && (nginx_version < 8038)))
-    if (r->zero_in_uri) {
-        return NGX_DECLINED;
-    }
-#endif
-
-    if (!(r->method & (NGX_HTTP_GET|NGX_HTTP_HEAD))) {
-        return NGX_DECLINED;
-    }
-
-    alcf = ngx_http_get_module_loc_conf(r, ngx_http_fancyindex_module);
-
-    if (!alcf->enable) {
-        return NGX_DECLINED;
-    }
-
-    if ((rc = make_content_buf(r, &out[0].buf, alcf)) != NGX_OK)
-        return rc;
-
-    out[0].buf->last_in_chain = 1;
-
-    r->headers_out.status = NGX_HTTP_OK;
-    r->headers_out.content_type_len  = ngx_sizeof_ssz("text/html");
-    r->headers_out.content_type.len  = ngx_sizeof_ssz("text/html");
-    r->headers_out.content_type.data = (u_char *) "text/html";
-
-    rc = ngx_http_send_header(r);
-    if (rc == NGX_ERROR || rc > NGX_OK || r->header_only)
-        return rc;
-
-    if (alcf->header.path.len > 0 && alcf->header.local.len == 0) {
-        /* URI is configured, make Nginx take care of with a subrequest. */
-        sr_uri = &alcf->header.path;
-
-        if (*sr_uri->data != '/') {
-            /* Relative path */
-            rel_uri.len  = r->uri.len + alcf->header.path.len;
-            rel_uri.data = ngx_palloc(r->pool, rel_uri.len);
-            if (rel_uri.data == NULL) {
-                return NGX_HTTP_INTERNAL_SERVER_ERROR;
-            }
-            ngx_memcpy(ngx_cpymem(rel_uri.data, r->uri.data, r->uri.len),
-                    alcf->header.path.data, alcf->header.path.len);
-            sr_uri = &rel_uri;
-        }
-
-        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
-                "http fancyindex: header subrequest \"%V\"", sr_uri);
-
-        rc = ngx_http_subrequest(r, sr_uri, NULL, &sr, NULL, 0);
-        if (rc == NGX_ERROR || rc == NGX_DONE) {
-            ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
-                    "http fancyindex: header subrequest for \"%V\" failed", sr_uri);
-            return rc;
-        }
-
-        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
-                "http fancyindex: header subrequest status = %i",
-                sr->headers_out.status);
-        /* ngx_http_subrequest returns NGX_OK(0), not NGX_HTTP_OK(200) */
-        if (sr->headers_out.status != NGX_OK) {
-            /*
-             * XXX: Should we write a message to the error log just in case
-             * we get something different from a 404?
-             */
-            goto add_builtin_header;
-        }
-    }
-    else {
-add_builtin_header:
-        /* Make space before */
-        out[1].next = out[0].next;
-        out[1].buf  = out[0].buf;
-        /* Chain header buffer */
-        out[0].next = &out[1];
-        if (alcf->header.local.len > 0) {
-            /* Header buffer is local, make a buffer pointing to the data. */
-            out[0].buf = ngx_calloc_buf(r->pool);
-            if (out[0].buf == NULL)
-                return NGX_ERROR;
-            out[0].buf->memory = 1;
-            out[0].buf->pos = alcf->header.local.data;
-            out[0].buf->last = alcf->header.local.data + alcf->header.local.len;
-        } else {
-            /* Prepare a buffer with the contents of the builtin header. */
-            out[0].buf = make_header_buf(r, alcf->css_href);
-        }
-    }
-
-    /* If footer is disabled, chain up footer buffer. */
-    if (alcf->footer.path.len == 0 || alcf->footer.local.len > 0) {
-        ngx_uint_t last = (alcf->header.path.len == 0) ? 2 : 1;
-
-        out[last-1].next = &out[last];
-        out[last].buf = ngx_calloc_buf(r->pool);
-        if (out[last].buf == NULL)
-            return NGX_ERROR;
-
-        out[last].buf->memory = 1;
-        if (alcf->footer.local.len > 0) {
-            out[last].buf->pos = alcf->footer.local.data;
-            out[last].buf->last = alcf->footer.local.data + alcf->footer.local.len;
-        } else {
-            out[last].buf->pos = (u_char*) t08_foot1;
-            out[last].buf->last = (u_char*) t08_foot1 + sizeof(t08_foot1) - 1;
-        }
-
-        out[last-1].buf->last_in_chain = 0;
-        out[last].buf->last_in_chain   = 1;
-        out[last].buf->last_buf        = 1;
-        /* Send everything with a single call :D */
-        return ngx_http_output_filter(r, &out[0]);
-    }
-
-    /*
-     * If we reach here, we were asked to send a custom footer. We need to:
-     * partially send whatever is referenced from out[0] and then send the
-     * footer as a subrequest. If the subrequest fails, we should send the
-     * standard footer as well.
-     */
-    rc = ngx_http_output_filter(r, &out[0]);
-
-    if (rc != NGX_OK && rc != NGX_AGAIN)
-        return NGX_HTTP_INTERNAL_SERVER_ERROR;
-
-    /* URI is configured, make Nginx take care of with a subrequest. */
-    sr_uri = &alcf->footer.path;
-
-    if (*sr_uri->data != '/') {
-        /* Relative path */
-        rel_uri.len  = r->uri.len + alcf->footer.path.len;
-        rel_uri.data = ngx_palloc(r->pool, rel_uri.len);
-        if (rel_uri.data == NULL) {
-            return NGX_HTTP_INTERNAL_SERVER_ERROR;
-        }
-        ngx_memcpy(ngx_cpymem(rel_uri.data, r->uri.data, r->uri.len),
-                alcf->footer.path.data, alcf->footer.path.len);
-        sr_uri = &rel_uri;
-    }
-
-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
-            "http fancyindex: footer subrequest \"%V\"", sr_uri);
-
-    rc = ngx_http_subrequest(r, sr_uri, NULL, &sr, NULL, 0);
-    if (rc == NGX_ERROR || rc == NGX_DONE) {
-        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
-                "http fancyindex: footer subrequest for \"%V\" failed", sr_uri);
-        return rc;
-    }
-
-    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
-            "http fancyindex: header subrequest status = %i",
-            sr->headers_out.status);
-
-    /* see above: ngx_http_subrequest resturns NGX_OK (0) not NGX_HTTP_OK (200) */
-    if (sr->headers_out.status != NGX_OK) {
-        /*
-         * XXX: Should we write a message to the error log just in case
-         * we get something different from a 404?
-         */
-        out[0].next = NULL;
-        out[0].buf = ngx_calloc_buf(r->pool);
-        if (out[0].buf == NULL)
-            return NGX_ERROR;
-        out[0].buf->memory = 1;
-        out[0].buf->pos = (u_char*) t08_foot1;
-        out[0].buf->last = (u_char*) t08_foot1 + sizeof(t08_foot1) - 1;
-        out[0].buf->last_in_chain = 1;
-        out[0].buf->last_buf = 1;
-        /* Directly send out the builtin footer */
-        return ngx_http_output_filter(r, &out[0]);
-    }
-
-    return (r != r->main) ? rc : ngx_http_send_special(r, NGX_HTTP_LAST);
-}
-
-
-static int ngx_libc_cdecl
-ngx_http_fancyindex_cmp_entries_name_desc(const void *one, const void *two)
-{
-    ngx_http_fancyindex_entry_t *first = (ngx_http_fancyindex_entry_t *) one;
-    ngx_http_fancyindex_entry_t *second = (ngx_http_fancyindex_entry_t *) two;
-
-    return (int) ngx_strcmp(second->name.data, first->name.data);
-}
-
-
-static int ngx_libc_cdecl
-ngx_http_fancyindex_cmp_entries_size_desc(const void *one, const void *two)
-{
-    ngx_http_fancyindex_entry_t *first = (ngx_http_fancyindex_entry_t *) one;
-    ngx_http_fancyindex_entry_t *second = (ngx_http_fancyindex_entry_t *) two;
-
-    return (first->size < second->size) - (first->size > second->size);
-}
-
-
-static int ngx_libc_cdecl
-ngx_http_fancyindex_cmp_entries_mtime_desc(const void *one, const void *two)
-{
-    ngx_http_fancyindex_entry_t *first = (ngx_http_fancyindex_entry_t *) one;
-    ngx_http_fancyindex_entry_t *second = (ngx_http_fancyindex_entry_t *) two;
-
-    return (int) (second->mtime - first->mtime);
-}
-
-
-static int ngx_libc_cdecl
-ngx_http_fancyindex_cmp_entries_name_asc(const void *one, const void *two)
-{
-    ngx_http_fancyindex_entry_t *first = (ngx_http_fancyindex_entry_t *) one;
-    ngx_http_fancyindex_entry_t *second = (ngx_http_fancyindex_entry_t *) two;
-
-    return (int) ngx_strcmp(first->name.data, second->name.data);
-}
-
-
-static int ngx_libc_cdecl
-ngx_http_fancyindex_cmp_entries_size_asc(const void *one, const void *two)
-{
-    ngx_http_fancyindex_entry_t *first = (ngx_http_fancyindex_entry_t *) one;
-    ngx_http_fancyindex_entry_t *second = (ngx_http_fancyindex_entry_t *) two;
-
-    return (first->size > second->size) - (first->size < second->size);
-}
-
-
-static int ngx_libc_cdecl
-ngx_http_fancyindex_cmp_entries_mtime_asc(const void *one, const void *two)
-{
-    ngx_http_fancyindex_entry_t *first = (ngx_http_fancyindex_entry_t *) one;
-    ngx_http_fancyindex_entry_t *second = (ngx_http_fancyindex_entry_t *) two;
-
-    return (int) (first->mtime - second->mtime);
-}
-
-
-static ngx_int_t
-ngx_http_fancyindex_error(ngx_http_request_t *r, ngx_dir_t *dir, ngx_str_t *name)
-{
-    if (ngx_close_dir(dir) == NGX_ERROR) {
-        ngx_log_error(NGX_LOG_ALERT, r->connection->log, ngx_errno,
-                      ngx_close_dir_n " \"%V\" failed", name);
-    }
-
-    return NGX_HTTP_INTERNAL_SERVER_ERROR;
-}
-
-
-static void *
-ngx_http_fancyindex_create_loc_conf(ngx_conf_t *cf)
-{
-    ngx_http_fancyindex_loc_conf_t  *conf;
-
-    conf = ngx_pcalloc(cf->pool, sizeof(ngx_http_fancyindex_loc_conf_t));
-    if (conf == NULL) {
-        return NGX_CONF_ERROR;
-    }
-
-    /*
-     * Set by ngx_pcalloc:
-     *    conf->header.*.len     = 0
-     *    conf->header.*.data    = NULL
-     *    conf->footer.*.len     = 0
-     *    conf->footer.*.data    = NULL
-     *    conf->css_href.len     = 0
-     *    conf->css_href.data    = NULL
-     *    conf->time_format.len  = 0
-     *    conf->time_format.data = NULL
-     */
-    conf->enable         = NGX_CONF_UNSET;
-    conf->default_sort   = NGX_CONF_UNSET_UINT;
-    conf->dirs_first     = NGX_CONF_UNSET;
-    conf->localtime      = NGX_CONF_UNSET;
-    conf->name_length    = NGX_CONF_UNSET_UINT;
-    conf->exact_size     = NGX_CONF_UNSET;
-    conf->ignore         = NGX_CONF_UNSET_PTR;
-    conf->hide_symlinks  = NGX_CONF_UNSET;
-    conf->show_path      = NGX_CONF_UNSET;
-    conf->hide_parent    = NGX_CONF_UNSET;
-    conf->show_dot_files = NGX_CONF_UNSET;
-
-    return conf;
-}
-
-
-static char *
-ngx_http_fancyindex_merge_loc_conf(ngx_conf_t *cf, void *parent, void *child)
-{
-    ngx_http_fancyindex_loc_conf_t *prev = parent;
-    ngx_http_fancyindex_loc_conf_t *conf = child;
-
-    (void) cf; /* unused */
-
-    ngx_conf_merge_value(conf->enable, prev->enable, 0);
-    ngx_conf_merge_uint_value(conf->default_sort, prev->default_sort, NGX_HTTP_FANCYINDEX_SORT_CRITERION_NAME);
-    ngx_conf_merge_value(conf->dirs_first, prev->dirs_first, 1);
-    ngx_conf_merge_value(conf->localtime, prev->localtime, 0);
-    ngx_conf_merge_value(conf->exact_size, prev->exact_size, 1);
-    ngx_conf_merge_value(conf->show_path, prev->show_path, 1);
-    ngx_conf_merge_value(conf->show_dot_files, prev->show_dot_files, 0);
-    ngx_conf_merge_uint_value(conf->name_length, prev->name_length, 50);
-
-    ngx_conf_merge_str_value(conf->header.path, prev->header.path, "");
-    ngx_conf_merge_str_value(conf->header.path, prev->header.local, "");
-    ngx_conf_merge_str_value(conf->footer.path, prev->footer.path, "");
-    ngx_conf_merge_str_value(conf->footer.path, prev->footer.local, "");
-
-    ngx_conf_merge_str_value(conf->css_href, prev->css_href, "");
-    ngx_conf_merge_str_value(conf->time_format, prev->time_format, "%Y-%b-%d %H:%M");
-
-    ngx_conf_merge_ptr_value(conf->ignore, prev->ignore, NULL);
-    ngx_conf_merge_value(conf->hide_symlinks, prev->hide_symlinks, 0);
-    ngx_conf_merge_value(conf->hide_parent, prev->hide_parent, 0);
-
-    /* Just make sure we haven't disabled the show_path directive without providing a custom header */
-    if (conf->show_path == 0 && conf->header.path.len == 0)
-    {
-        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, "FancyIndex : cannot set show_path to off without providing a custom header !");
-        return NGX_CONF_ERROR;
-    }
-
-    return NGX_CONF_OK;
-}
-
-
-static char*
-ngx_http_fancyindex_ignore(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
-{
-    ngx_http_fancyindex_loc_conf_t *alcf = conf;
-    ngx_str_t *value;
-
-    (void) cmd; /* unused */
-
-#if (NGX_PCRE)
-    ngx_uint_t          i;
-    ngx_regex_elt_t    *re;
-    ngx_regex_compile_t rc;
-    u_char              errstr[NGX_MAX_CONF_ERRSTR];
-
-    if (alcf->ignore == NGX_CONF_UNSET_PTR) {
-        alcf->ignore = ngx_array_create(cf->pool, 2, sizeof(ngx_regex_elt_t));
-        if (alcf->ignore == NULL) {
-            return NGX_CONF_ERROR;
-        }
-    }
-
-    value = cf->args->elts;
-
-    ngx_memzero(&rc, sizeof(ngx_regex_compile_t));
-
-    rc.err.data = errstr;
-    rc.err.len  = NGX_MAX_CONF_ERRSTR;
-    rc.pool     = cf->pool;
-
-    for (i = 1; i < cf->args->nelts; i++) {
-        re = ngx_array_push(alcf->ignore);
-        if (re == NULL) {
-            return NGX_CONF_ERROR;
-        }
-
-        rc.pattern = value[i];
-        rc.options = NGX_REGEX_CASELESS;
-
-        if (ngx_regex_compile(&rc) != NGX_OK) {
-            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, "%V", &rc.err);
-            return NGX_CONF_ERROR;
-        }
-
-        re->name  = value[i].data;
-        re->regex = rc.regex;
-    }
-
-    return NGX_CONF_OK;
-#else /* !NGX_PCRE */
-    ngx_uint_t i;
-    ngx_str_t *str;
-
-    if (alcf->ignore == NGX_CONF_UNSET_PTR) {
-        alcf->ignore = ngx_array_create(cf->pool, 2, sizeof(ngx_str_t));
-        if (alcf->ignore == NULL) {
-            return NGX_CONF_ERROR;
-        }
-    }
-
-    value = cf->args->elts;
-
-    for (i = 1; i < cf->args->nelts; i++) {
-        str = ngx_array_push(alcf->ignore);
-        if (str == NULL) {
-            return NGX_CONF_ERROR;
-        }
-
-        str->data = value[i].data;
-        str->len  = value[i].len;
-    }
-
-    return NGX_CONF_OK;
-#endif /* NGX_PCRE */
-
-}
-
-
-static ngx_int_t
-ngx_http_fancyindex_init(ngx_conf_t *cf)
-{
-    ngx_http_handler_pt        *h;
-    ngx_http_core_main_conf_t  *cmcf;
-
-    cmcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_core_module);
-
-    h = ngx_array_push(&cmcf->phases[NGX_HTTP_CONTENT_PHASE].handlers);
-    if (h == NULL) {
-        return NGX_ERROR;
-    }
-
-    *h = ngx_http_fancyindex_handler;
-
-    return NGX_OK;
-}
-
-/* vim:et:sw=4:ts=4:
- */
diff --git a/debian/modules/http-fancyindex/t/00-build-artifacts.test b/debian/modules/http-fancyindex/t/00-build-artifacts.test
deleted file mode 100644
index b9bc1ac..0000000
--- a/debian/modules/http-fancyindex/t/00-build-artifacts.test
+++ /dev/null
@@ -1,22 +0,0 @@
-#! /bin/bash
-cat <<---
-This test checks that the built Nginx either has the dynamic fancyindex
-module available, or that it's not there (for static builds).
---
-
-readonly nginx_path="${PREFIX}/sbin/nginx"
-readonly so_path="${PREFIX}/modules/ngx_http_fancyindex_module.so"
-
-if [[ ! -x ${nginx_path} ]] ; then
-	fail "executable binary not found at '%s'\n" "${nginx_path}"
-fi
-
-if ${DYNAMIC} ; then
-	if [[ ! -r ${so_path} ]] ; then
-		fail "module not found at '%s'\n" "${so_path}"
-	fi
-else
-	if [[ -r ${so_path} ]] ; then
-		fail "module should not exist at '%s'\n" "${so_path}"
-	fi
-fi
diff --git a/debian/modules/http-fancyindex/t/01-smoke-hasindex.test b/debian/modules/http-fancyindex/t/01-smoke-hasindex.test
deleted file mode 100644
index 19706a4..0000000
--- a/debian/modules/http-fancyindex/t/01-smoke-hasindex.test
+++ /dev/null
@@ -1,7 +0,0 @@
-#! /bin/bash
-cat <<---
-This test fetches the root directory served by Nginx, which has no index file,
-and checks that the output contains something that resembles a directory index.
---
-nginx_start
-grep 'Index of' <( fetch )
diff --git a/debian/modules/http-fancyindex/t/02-smoke-indexisfancy.test b/debian/modules/http-fancyindex/t/02-smoke-indexisfancy.test
deleted file mode 100644
index 10cc403..0000000
--- a/debian/modules/http-fancyindex/t/02-smoke-indexisfancy.test
+++ /dev/null
@@ -1,11 +0,0 @@
-#! /bin/bash
-cat <<---
-This test fetches the root directory served by Nginx, which has no index file,
-and checks that the output contains something that resembles the output from
-the fancyindex module.
---
-nginx_start
-content=$(fetch --with-headers)
-grep 'Index of /' <<< "${content}"  # It is an index
-grep '\'  <<< "${content}"  # It contains a table
-grep '^  Content-Type:[[:space:]]*text/html' <<< "${content}"
diff --git a/debian/modules/http-fancyindex/t/03-exact_size_off.test b/debian/modules/http-fancyindex/t/03-exact_size_off.test
deleted file mode 100644
index cdc61ec..0000000
--- a/debian/modules/http-fancyindex/t/03-exact_size_off.test
+++ /dev/null
@@ -1,8 +0,0 @@
-#! /bin/bash
-cat <<---
-We test if the output from using "fancyindex_exact_size off" looks sane
---
-nginx_start 'fancyindex_exact_size off;'
-content=$(fetch)
-grep -e '[1-9]\.[0-9] KiB'  <<< "${content}"
-grep -E '[0-9]+ B'  <<< "${content}"
diff --git a/debian/modules/http-fancyindex/t/04-hasindex-html.test b/debian/modules/http-fancyindex/t/04-hasindex-html.test
deleted file mode 100644
index 69ac222..0000000
--- a/debian/modules/http-fancyindex/t/04-hasindex-html.test
+++ /dev/null
@@ -1,24 +0,0 @@
-#! /bin/bash
-cat <<---
-This test fetches the root directory served by Nginx, which has no index
-file, and checks the output contains a few HTML elements know to exist in
-a directory index.
---
-use pup
-nginx_start
-
-content=$( fetch )
-
-# Check page title
-[[ $(pup -p title text{} <<< "${content}") = 'Index of /' ]]
-
-# Check table headers
-[[ $(pup -n body table thead th a:first-child <<< "${content}") -eq 3 ]]
-{
-	read -r name_label
-	read -r size_label
-	read -r date_label
-} < <(  pup -p body table thead th a:first-child text{} <<< "${content}" )
-[[ ${name_label} = File\ Name ]]
-[[ ${size_label} = File\ Size ]]
-[[ ${date_label} = Date ]]
diff --git a/debian/modules/http-fancyindex/t/05-sort-by-size.test b/debian/modules/http-fancyindex/t/05-sort-by-size.test
deleted file mode 100644
index 23fade9..0000000
--- a/debian/modules/http-fancyindex/t/05-sort-by-size.test
+++ /dev/null
@@ -1,36 +0,0 @@
-#! /bin/bash
-cat <<---
-This test validates that the sorting by file size works.
---
-use pup
-nginx_start
-
-# Ascending sort.
-previous=''
-while read -r size ; do
-	if [[ ${size} = - ]] ; then
-		continue
-	fi
-	if [[ -z ${previous} ]] ; then
-		previous=${size}
-		continue
-	fi
-	[[ ${previous} -le ${size} ]] || fail \
-		'Size %d should be smaller than %d\n' "${previous}" "${size}"
-done < <( fetch '/?C=S&O=A' \
-	    | pup -p body table tbody 'td:nth-child(2)' text{} )
-
-# Descending sort.
-previous=''
-while read -r size ; do
-	if [[ ${size} = - ]] ; then
-		continue
-	fi
-	if [[ -z ${previous} ]] ; then
-		previous=${size}
-		continue
-	fi
-	[[ ${previous} -ge ${size} ]] || fail \
-		'Size %d should be greater than %d\n' "${previous}" "${size}"
-done < <( fetch '/?C=S&O=D' \
-	    | pup -p body table tbody 'td:nth-child(2)' text{} )
diff --git a/debian/modules/http-fancyindex/t/06-hide_parent.test b/debian/modules/http-fancyindex/t/06-hide_parent.test
deleted file mode 100644
index 494c958..0000000
--- a/debian/modules/http-fancyindex/t/06-hide_parent.test
+++ /dev/null
@@ -1,23 +0,0 @@
-#! /bin/bash
-cat <<---
-This test check the output using "fancyindex_hide_parent_dir on"
---
-use pup
-nginx_start 'fancyindex_hide_parent_dir on;'
-
-content=$( fetch /child-directory/ )
-
-# Check page title
-[[ $(pup -p title text{} <<< "${content}") = "Index of /child-directory/" ]]
-
-# Check table headers
-[[ $(pup -n body table tbody tr:first-child td <<< "${content}") -eq 3 ]]
-{
-	read -r name_label
-	read -r size_label
-	read -r date_label
-} < <(  pup -p body table tbody tr:first-child td text{} <<< "${content}" )
-[[ ${name_label} != Parent\ Directory/ ]]
-[[ ${name_label} = empty-file.txt ]]
-[[ ${size_label} != - ]]
-[[ ${date_label} != - ]]
diff --git a/debian/modules/http-fancyindex/t/07-directory-first.test b/debian/modules/http-fancyindex/t/07-directory-first.test
deleted file mode 100644
index 82c37cc..0000000
--- a/debian/modules/http-fancyindex/t/07-directory-first.test
+++ /dev/null
@@ -1,50 +0,0 @@
-#! /bin/bash
-cat <<---
-This test check the output using "fancyindex_directories_first on"
---
-use pup
-
-for d in "008d" "000d" "004d" ; do
-	mkdir -p "${TESTDIR}/dir_first/${d}"
-done
-for f in "005f" "001f" "003f"; do
-	touch "${TESTDIR}/dir_first/${f}"
-done
-for d in "006d" "002d" ; do
-	mkdir -p "${TESTDIR}/dir_first/${d}"
-done
-
-nginx_start 'fancyindex_directories_first on;'
-previous=''
-cur_type=''
-while read -r name ; do
-	case "$name" in
-	*Parent*)
-		;;
-	*d*)
-		echo "dir $name"
-		[[ "$cur_type" = f ]] && fail 'Directories should come before Files'
-		cur_type=d
-		if [[ -z ${previous} ]] ; then
-			previous=${name}
-		else
-			[[ ${previous} < ${name} ]] || fail \
-				'Name %s should come before %s\n' "${previous}" "${name}"
-		fi
-		;;
-	*f*)
-		echo "file $name"
-		[[ -z "$cur_type" ]] && fail 'Directories should come before Files'
-		if [[ "$cur_type" = d ]] ; then
-			cur_type=f
-			previous=${name}
-		else
-			[[ ${previous} < ${name} ]] || fail \
-				'Name %s should come before %s\n' "${previous}" "${name}"
-		fi
-		;;
-	esac
-done < <( fetch '/dir_first/' \
-		| pup -p body table tbody 'td:nth-child(1)' text{} )
-
-nginx_is_running || fail "Nginx died"
diff --git a/debian/modules/http-fancyindex/t/07-show_dotfiles.test b/debian/modules/http-fancyindex/t/07-show_dotfiles.test
deleted file mode 100644
index 6b56410..0000000
--- a/debian/modules/http-fancyindex/t/07-show_dotfiles.test
+++ /dev/null
@@ -1,21 +0,0 @@
-#! /bin/bash
-cat <<---
-Test the option to show dotfiles.
---
-# Turn it on.
-nginx_start 'fancyindex_show_dotfiles on;'
-on_content=$(fetch /show_dotfiles/)
-nginx_stop
-if [ $(grep '.okay'  <<< "${on_content}") -ne 0 ] ; then
-    exit 1
-fi
-
-# Turn it off.
-nginx_start
-off_content=$(fetch /show_dotfiles/)
-nginx_stop
-if [ $(grep '.okay'  <<< "${on_content}") -eq 0] ; then
-    exit 1
-fi
-
-exit 0
diff --git a/debian/modules/http-fancyindex/t/08-local-footer.test b/debian/modules/http-fancyindex/t/08-local-footer.test
deleted file mode 100644
index 6d6318b..0000000
--- a/debian/modules/http-fancyindex/t/08-local-footer.test
+++ /dev/null
@@ -1,17 +0,0 @@
-#! /bin/bash
-cat <<---
-This test checks that a local footer can be included with
-"fancyindex_header ... local"
---
-use pup
-
-cat > "${TESTDIR}/footer" <yes
-EOF
-
-nginx_start "fancyindex_footer \"${TESTDIR}/footer\" local;"
-
-T=$(fetch / | pup -p body 'div#customfooter' text{})
-[[ $T == yes ]] ||  fail 'Custom header missing'
-
-nginx_is_running || fail 'Nginx died'
diff --git a/debian/modules/http-fancyindex/t/09-local-header.test b/debian/modules/http-fancyindex/t/09-local-header.test
deleted file mode 100644
index 455b966..0000000
--- a/debian/modules/http-fancyindex/t/09-local-header.test
+++ /dev/null
@@ -1,17 +0,0 @@
-#! /bin/bash
-cat <<---
-This test checks that a local header can be included with
-"fancyindex_header ... local"
---
-use pup
-
-cat > "${TESTDIR}/header" <yes
-EOF
-
-nginx_start "fancyindex_header \"${TESTDIR}/header\" local;"
-
-T=$(fetch / | pup -p body 'div#customheader' text{})
-[[ $T == yes ]] ||  fail 'Custom header missing'
-
-nginx_is_running || fail 'Nginx died'
diff --git a/debian/modules/http-fancyindex/t/10-local-headerfooter.test b/debian/modules/http-fancyindex/t/10-local-headerfooter.test
deleted file mode 100644
index 6adfb45..0000000
--- a/debian/modules/http-fancyindex/t/10-local-headerfooter.test
+++ /dev/null
@@ -1,26 +0,0 @@
-#! /bin/bash
-cat <<---
-This test checks that both a local header and footer can be included with
-"fancyindex_{header,footer} ... local"
---
-use pup
-
-cat > "${TESTDIR}/header" <yes
-EOF
-cat > "${TESTDIR}/footer" <yes
-EOF
-
-nginx_start "fancyindex_header \"${TESTDIR}/header\" local;
-             fancyindex_footer \"${TESTDIR}/footer\" local;"
-
-P=$(fetch /)
-
-H=$(pup -p body 'div#customheader' text{} <<< "$P")
-[[ $H == yes ]] ||  fail 'Custom header missing'
-
-F=$(pup -p body 'div#customfooter' text{} <<< "$P")
-[[ $F == yes ]] || fail 'Custom footer missing'
-
-nginx_is_running || fail 'Nginx died'
diff --git a/debian/modules/http-fancyindex/t/11-local-footer-nested.test b/debian/modules/http-fancyindex/t/11-local-footer-nested.test
deleted file mode 100644
index 0530853..0000000
--- a/debian/modules/http-fancyindex/t/11-local-footer-nested.test
+++ /dev/null
@@ -1,31 +0,0 @@
-#! /bin/bash
-cat <<---
-This test checks that local footers are correctly included in presence of
-directives in nested locations:
-
-	fancyindex_footer  local;
-	location /sub {
-		fancyindex_footer  local;
-	}
-
---
-use pup
-
-echo '
yes
' > "${TESTDIR}/top-footer" -echo '
yes
' > "${TESTDIR}/sub-footer" - -nginx_start "fancyindex_footer \"${TESTDIR}/top-footer\" local; - location /child-directory { - fancyindex_footer \"${TESTDIR}/sub-footer\" local; - }" - -T=$(fetch /) -echo "$T" > "$TESTDIR/top.html" -[[ $(pup -p body 'div#topfooter' text{} <<< "$T") = yes ]] || fail 'Custom header missing at /' -[[ -z $(pup -p body 'div#subfooter' text{} <<< "$T") ]] || fail 'Wrong header at /' - -T=$(fetch /child-directory/) -[[ $(pup -p body 'div#subfooter' text{} <<< "$T") = yes ]] || fail 'Custom header missing at /sub/' -[[ -z $(pup -p body 'div#topfooter' text{} <<< "$T") ]] || fail 'Wrong header at /sub/' - -nginx_is_running || fail 'Nginx died' diff --git a/debian/modules/http-fancyindex/t/12-local-footer-nested.test b/debian/modules/http-fancyindex/t/12-local-footer-nested.test deleted file mode 100644 index 7c0aef7..0000000 --- a/debian/modules/http-fancyindex/t/12-local-footer-nested.test +++ /dev/null @@ -1,11 +0,0 @@ -#! /bin/bash -cat <<--- -This test checks that the configuration file is properly parsed if there -is only one parameter passed to the fancyndex_header and fancyindex_footer -configuration directives. --- - -nginx_start 'fancyindex_header "/header"; - fancyindex_footer "/footer";' - -nginx_is_running || fail 'Nginx died' diff --git a/debian/modules/http-fancyindex/t/bug61-empty-file-segfault.test b/debian/modules/http-fancyindex/t/bug61-empty-file-segfault.test deleted file mode 100644 index d9c5a40..0000000 --- a/debian/modules/http-fancyindex/t/bug61-empty-file-segfault.test +++ /dev/null @@ -1,16 +0,0 @@ -#! /bin/bash -cat <<--- -Bug #61: Listing a directory with an empty file crashes Nginx -https://github.com/aperezdc/ngx-fancyindex/issues/61 --- - -# Prepare an empty directory with an empty file -mkdir -p "${TESTDIR}/bug61" -touch "${TESTDIR}/bug61/bug61.txt" - -nginx_start 'fancyindex_exact_size off;' -content=$(fetch /bug61/) -test -n "${content}" || fail "Empty response" -echo "Response:" -echo "${content}" -nginx_is_running || fail "Nginx died" diff --git a/debian/modules/http-fancyindex/t/bug95-square-brackets.test b/debian/modules/http-fancyindex/t/bug95-square-brackets.test deleted file mode 100644 index 16e1ddc..0000000 --- a/debian/modules/http-fancyindex/t/bug95-square-brackets.test +++ /dev/null @@ -1,19 +0,0 @@ -#! /bin/bash -cat <<--- -Bug #95: FancyIndex does not encode square brackets -https://github.com/aperezdc/ngx-fancyindex/issues/95 --- -use pup - -# Prepare a directory with a file that contains square brackets in the name. -mkdir -p "${TESTDIR}/bug95" -touch "${TESTDIR}"/bug95/'bug[95].txt' - -nginx_start -content=$(fetch /bug95/) -test -n "${content}" || fail 'Empty response' - -expected_href='bug%5B95%5D.txt' -obtained_href=$(pup -p body tbody 'tr:nth-child(2)' a 'attr{href}' <<< "${content}") -test "${expected_href}" = "${obtained_href}" || \ - fail 'Expected: %s - Obtained: %s' "${expected_href}" "${obtained_href}" diff --git a/debian/modules/http-fancyindex/t/build-and-run b/debian/modules/http-fancyindex/t/build-and-run deleted file mode 100755 index 68584b7..0000000 --- a/debian/modules/http-fancyindex/t/build-and-run +++ /dev/null @@ -1,25 +0,0 @@ -#! /bin/bash -set -e - -if [[ $# -lt 1 || $# -gt 2 ]] ; then - echo "Usage: $0 [1]" 1>&2 - exit 1 -fi - -readonly NGINX=$1 - -if [[ $2 -eq 1 ]] ; then - readonly DYNAMIC=$2 -fi - -cd "$(dirname "$0")/.." -wget -O - http://nginx.org/download/nginx-${NGINX}.tar.gz | tar -xzf - -rm -rf prefix/ -cd nginx-${NGINX} -./configure \ - --add-${DYNAMIC:+dynamic-}module=.. \ - --with-http_addition_module \ - --prefix="$(pwd)/../prefix" -make install -cd .. -exec ./t/run prefix ${DYNAMIC} diff --git a/debian/modules/http-fancyindex/t/get-pup b/debian/modules/http-fancyindex/t/get-pup deleted file mode 100755 index 613dac7..0000000 --- a/debian/modules/http-fancyindex/t/get-pup +++ /dev/null @@ -1,81 +0,0 @@ -#! /bin/bash -set -e - -declare -r VERSION='0.4.0' -declare -r SHASUMS='\ -75c27caa0008a9cc639beb7506077ad9f32facbffcc4e815e999eaf9588a527e pup_v0.4.0_darwin_386.zip -c539a697efee2f8e56614a54cb3b215338e00de1f6a7c2fa93144ab6e1db8ebe pup_v0.4.0_darwin_amd64.zip -259eee82c7d7d766f1b8f93a382be21dcfefebc855a9ce8124fd78717f9df439 pup_v0.4.0_dragonfly_amd64.zip -ba0fe5e87a24cab818e5d2efdd7540714ddfb1b7246600135915c666fdf1a601 pup_v0.4.0_freebsd_386.zip -1838ef84ec1f961e8009d19a4d1e6a23b926ee315da3d60c08878f3d69af5692 pup_v0.4.0_freebsd_amd64.zip -6886a9c60a912a810d012610bc3f784f0417999ff7d7df833a0695b9af60395b pup_v0.4.0_freebsd_arm.zip -e486b32ca07552cd3aa713cbf2f9d1b6e210ddb51d34b3090c7643f465828057 pup_v0.4.0_linux_386.zip -ec3d29e9fb375b87ac492c8b546ad6be84b0c0b49dab7ff4c6b582eac71ba01c pup_v0.4.0_linux_amd64.zip -c09b669fa8240f4f869dee7d34ee3c7ea620a0280cee1ea7d559593bcdd062c9 pup_v0.4.0_linux_arm64.zip -ebf70b3c76c02e0202c94af7ef06dcb3ecc866d1b9b84453d43fe01fa5dd5870 pup_v0.4.0_linux_arm.zip -a98a4d1f3c3a103e8ebe1a7aba9cb9d3cb045003208ca6f5f3d54889a225f267 pup_v0.4.0_linux_mips64le.zip -8e471cf6cfa118b2497bb3f42a7a48c52d0096107f748f37216855c8ab94f8e5 pup_v0.4.0_linux_mips64.zip -cfda9375eba65f710e052b1b59893c228c3fc92b0510756bb3f02c25938eee30 pup_v0.4.0_linux_ppc64le.zip -91a1e07ffb2c373d6053252e4de732f5db78c8eace49c6e1a0ef52402ecdf56c pup_v0.4.0_linux_ppc64.zip -fdc9b28a3daac5ad096023e1647292a7eccea6d9b1686f871307dae9f3bd064f pup_v0.4.0_nacl_386.zip -c8d3c9b56783bd5a55446f4580e1835606b2b945da2d1417ed509c5927a5f8bc pup_v0.4.0_nacl_amd64p32.zip -48c068c4353672528c8c3447a536208b0719f1e6d0f8fab8416b38b63ad0c1d9 pup_v0.4.0_nacl_arm.zip -7a27497b2f0be95c51bb2cbc25da12efba682c4f766bc5abc5742e9fc8d1eeb0 pup_v0.4.0_netbsd_386.zip -71a1808eb1b6442aa45d1de9e1c4fca543b2754c1aff5ba3d62b3456f9519691 pup_v0.4.0_netbsd_amd64.zip -928e6691b11c68ae3f28826848a13dc5c1c9673848fe7cf7f80dd76c9fb6e8a6 pup_v0.4.0_netbsd_arm.zip -5aca20a9b3264d2fde5a8d32f213c434edf9570ee6fae18953b8fff09d2976e2 pup_v0.4.0_openbsd_386.zip -e965c6f04b897240d84c60e2c18226deb231a657c5583680f58a61051ff5a100 pup_v0.4.0_openbsd_amd64.zip -30bc88a1e06606f4f3449af9fbf586f97c2e958677460a72bb1a168f67c4911c pup_v0.4.0_openbsd_arm.zip -9d50decf4572292f187cfec84660648d648336bc6109e1f032b1699ba1d28549 pup_v0.4.0_plan9_386.zip -1b2a6bd2388ddd691ca429497d88b2b047ec8dfb7bce9436925cb2f30632bf8e pup_v0.4.0_plan9_amd64.zip -0835de9c10a9e2b3b958b82d148da49eaafc695fe4a018cbaf7bb861b455583f pup_v0.4.0_solaris_amd64.zip -01acae220b69fb1ba8477d0e7f4d7669ef5de147966dc819cf75a845af74c5f3 pup_v0.4.0_windows_386.zip -6755cbd43e94eaf173689e93e914c7056a2249c2977e5b90024fb397f9b45ba4 pup_v0.4.0_windows_amd64.zip -' - -declare -r BASEURL="https://github.com/ericchiang/pup/releases/download/v${VERSION}" -declare -r TDIR=$(dirname "$0") -ARCH='' -OS='' - -case $(uname -m) in - x86_64 | amd64 ) ARCH=amd64 ;; - i[3456]86 ) ARCH=386 ;; -esac - -OS=$(uname -s | tr 'A-Z' 'a-z') -case ${OS} in - linux | freebsd | openbsd | netbsd | darwin ) ;; - * ) OS='' -esac - -if [[ -z ${ARCH} || -z ${OS} ]] ; then - echo "pup ${VERSION} is not available for $(uname -s) on $(uname -m)" 1>&2 - exit 1 -fi - -declare -r ZIPFILE="pup_v${VERSION}_${OS}_${ARCH}.zip" -EXPECT_SHA='' - -while read sum fname ; do - if [[ ${fname} = ${ZIPFILE} ]] ; then - EXPECT_SHA=${sum} - break - fi -done <<< "${SHASUMS}" - -wget -cO "${TDIR}/${ZIPFILE}" "${BASEURL}/${ZIPFILE}" - -read -r GOT_SHA _ < <( sha256sum "${TDIR}/${ZIPFILE}" ) -if [[ ${EXPECT_SHA} = ${GOT_SHA} ]] ; then - echo "Checksum for ${ZIPFILE} verified :-)" -else - rm -f "${TDIR}/${ZIPFILE}" "${TDIR}/pup" - echo "Checksum for ${ZIPFILE} does not match :-(" - echo " Expected: ${EXPECT_SHA}" - echo " Got: ${GOT_SHA}" - exit 2 -fi 1>&2 - -rm -f "${TDIR}/pup" -unzip "${TDIR}/${ZIPFILE}" pup -d "${TDIR}" diff --git a/debian/modules/http-fancyindex/t/has-index.test b/debian/modules/http-fancyindex/t/has-index.test deleted file mode 100644 index cf34207..0000000 --- a/debian/modules/http-fancyindex/t/has-index.test +++ /dev/null @@ -1,7 +0,0 @@ -#! /bin/bash -cat <<--- -This test ensures that the "index.html" is returned instead of a directory -listing when fetching a directory which contains an index file. --- -nginx_start -diff -u "${TESTDIR}/has-index/index.html" <( fetch /has-index/ ) 1>&2 diff --git a/debian/modules/http-fancyindex/t/has-index/index.html b/debian/modules/http-fancyindex/t/has-index/index.html deleted file mode 100644 index 419ae86..0000000 --- a/debian/modules/http-fancyindex/t/has-index/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - - Index file test - - - This is index.html. - - diff --git a/debian/modules/http-fancyindex/t/nginx.conf b/debian/modules/http-fancyindex/t/nginx.conf deleted file mode 100644 index 2b99a3d..0000000 --- a/debian/modules/http-fancyindex/t/nginx.conf +++ /dev/null @@ -1,25 +0,0 @@ -worker_processes 1; - - -events { - worker_connections 1024; -} - -http { - include mime.types; - default_type application/octet-stream; - sendfile on; - keepalive_timeout 65; - server { - listen 80; - server_name localhost; - location / { - root html; - index index.html index.htm; - } - error_page 500 502 503 504 /50x.html; - location = /50x.html { - root html; - } - } -} diff --git a/debian/modules/http-fancyindex/t/preamble b/debian/modules/http-fancyindex/t/preamble deleted file mode 100644 index 26f2819..0000000 --- a/debian/modules/http-fancyindex/t/preamble +++ /dev/null @@ -1,111 +0,0 @@ -#! /bin/bash -# -# preamble -# Copyright (C) 2016 Adrian Perez -# -# Distributed under terms of the MIT license. -# - -function nginx_conf_generate () { - if ${DYNAMIC} ; then - echo 'load_module modules/ngx_http_fancyindex_module.so;' - fi - cat <<-EOF - worker_processes 1; - events { worker_connections 1024; } - http { - include mime.types; - default_type application/octet-stream; - sendfile on; - keepalive_timeout 65; - server { - server_name localhost; - listen 127.0.0.1:${NGINX_PORT}; - root ${TESTDIR}; - error_page 500 502 503 504 /50x.html; - location = /50x.html { root html; } - location / { - index index.html; - fancyindex on; - $* - } - } - } - EOF -} - -readonly NGINX_CONF="${PREFIX}/conf/nginx.conf" -readonly NGINX_PID="${PREFIX}/logs/nginx.pid" - -NGINX_PORT=$(ss -4Htnl | awk '{ sub("[^:]+:", "", $4) ; seen[$4]=1 } -END { p=1025 ; while (seen[p]) p++; print p}') -readonly NGINX_PORT - -rm -f "${NGINX_CONF}" "${NGINX_PID}" -mkdir -p "${PREFIX}/logs" - -function pup () { - if [[ -x ${TESTDIR}/pup ]] ; then - "${TESTDIR}/pup" "$@" - else - skip 'Test uses "pup", which is not available' - fi -} - -function use () { - case $1 in - pup ) [[ -x ${TESTDIR}/pup ]] \ - || skip 'Test uses "pup", which is unavailable\n' ;; - * ) warn "Invalid 'use' flag: '%s'\n'" "$1" ;; - esac -} - -function nginx () { - env - PATH="${PATH}" "${PREFIX}/sbin/nginx" "$@" -} - -function nginx_conf () { - nginx_conf_generate "$@" > "${NGINX_CONF}" -} - -function nginx_is_running () { - [[ -r ${NGINX_PID} ]] && kill -0 $(< "${NGINX_PID}") -} - -function nginx_stop () { - if nginx_is_running ; then nginx -s stop ; fi - rm -f "${NGINX_PID}" -} -trap nginx_stop EXIT - -function nginx_start () { - if [[ $# -gt 0 || ! -r ${NGINX_CONF} ]] ; then nginx_conf "$@" ; fi - nginx_stop # Ensure that it is not running. - nginx -} - -function fetch () { - local -a opts=( -q ) - if [[ $1 = --with-headers ]] ; then - opts+=( -S ) - shift - fi - wget "${opts[@]}" -O- "http://localhost:${NGINX_PORT}${1:-/}" 2>&1 -} - -function skip () { - printf '(--) ' - printf "$@" - exit 111 -} 1>&2 - -function fail () { - printf '(FF) ' - printf "$@" - exit 1 -} 1>&2 - -function warn () { - printf '(WW) ' - printf "$@" -} 1>&2 diff --git a/debian/modules/http-fancyindex/t/run b/debian/modules/http-fancyindex/t/run deleted file mode 100755 index 9988fa2..0000000 --- a/debian/modules/http-fancyindex/t/run +++ /dev/null @@ -1,86 +0,0 @@ -#!/bin/bash -set -e - -if [[ $# -lt 1 || $# -gt 2 ]] ; then - echo "Usage: $0 [1]" 1>&2 - exit 1 -fi - -# Obtain the absolute path to the tests directory -pushd "$(dirname "$0")" &> /dev/null -readonly T=$(pwd) -popd &> /dev/null -export T - -# Same for the nginx prefix directory -pushd "$1" &> /dev/null -readonly prefix=$(pwd) -popd &> /dev/null - -dynamic=false -if [[ $# -gt 1 && $2 -eq 1 ]] ; then - dynamic=true -fi -readonly dynamic - -declare -a t_pass=( ) -declare -a t_fail=( ) -declare -a t_skip=( ) - -for t in `ls "$T"/*.test | sort -R` ; do - name="t/${t##*/}" - name=${name%.test} - printf "${name} ... " - errfile="${name}.err" - outfile="${name}.out" - shfile="${name}.sh" - cat > "${shfile}" <<-EOF - readonly DYNAMIC=${dynamic} - readonly TESTDIR='$T' - readonly PREFIX='${prefix}' - $(< "$T/preamble") - $(< "$t") - EOF - if bash -e "${shfile}" > "${outfile}" 2> "${errfile}" ; then - t_pass+=( "${name}" ) - printf 'passed\n' - elif [[ $? -eq 111 ]] ; then - t_skip+=( "${name}" ) - printf 'skipped\n' - else - t_fail+=( "${name}" ) - printf 'failed\n' - fi -done - -for name in "${t_fail[@]}" ; do - echo - printf '=== %s.out\n' "${name}" - cat "${name}.out" - echo - printf '=== %s.err\n' "${name}" - cat "${name}.err" - echo -done - -if [[ ${#t_skip[@]} -gt 0 ]] ; then - echo - printf 'Skipped tests:\n' - for name in "${t_skip[@]}" ; do - reason=$(grep '^(\-\-) ' "${name}.err" | head -1) - if [[ -z ${reason} ]] ; then - reason='No reason given' - else - reason=${reason:5} - fi - printf ' - %s: %s\n' "${name}" "${reason:-No reason given}" - done - echo -fi - -printf '=== passed/skipped/failed/total: %d/%d/%d/%d\n' \ - ${#t_pass[@]} ${#t_skip[@]} ${#t_fail[@]} $(( ${#t_pass[@]} + ${#t_fail[@]} )) - -if [[ ${#t_fail[@]} -gt 0 ]] ; then - exit 1 -fi diff --git a/debian/modules/http-fancyindex/t/show_dotfiles/.okay b/debian/modules/http-fancyindex/t/show_dotfiles/.okay deleted file mode 100644 index e69de29..0000000 diff --git a/debian/modules/http-fancyindex/template.awk b/debian/modules/http-fancyindex/template.awk deleted file mode 100755 index f9ec4a6..0000000 --- a/debian/modules/http-fancyindex/template.awk +++ /dev/null @@ -1,52 +0,0 @@ -#! /usr/bin/awk -f -# -# Copyright © Adrian Perez -# -# Converts an HTML template into a C header suitable for inclusion. -# Take a look at the HACKING.rst file to know how to use it :-) -# -# This code is placed in the public domain. - -BEGIN { - varname = 0; - print "/* Automagically generated, do not edit! */" - vars_count = 0; -} - -/^$/ { - if (varname) print ";"; - if ($3 == "NONE") { - varname = 0; - next; - } - varname = $3; - vars[vars_count++] = varname; - print "static const u_char " varname "[] = \"\""; - next; -} - -/^$/ { - if (!varname) next; - print "\"\\n\""; - next; -} - -{ - if (!varname) next; - # Order matters - gsub(/[\t\v\n\r\f]+/, ""); - gsub(/\\/, "\\\\"); - gsub(/"/, "\\\""); - print "\"" $0 "\"" -} - - -END { - if (varname) print ";"; - print "#define NFI_TEMPLATE_SIZE (0 \\"; - for (var in vars) { - print "\t+ nfi_sizeof_ssz(" vars[var] ") \\"; - } - print "\t)" -} - diff --git a/debian/modules/http-fancyindex/template.h b/debian/modules/http-fancyindex/template.h deleted file mode 100644 index 2d6604b..0000000 --- a/debian/modules/http-fancyindex/template.h +++ /dev/null @@ -1,94 +0,0 @@ -/* Automagically generated, do not edit! */ -static const u_char t01_head1[] = "" -"" -"" -"" -"" -"" -"" -"\n" -; -static const u_char t02_head2[] = "" -"\n" -"Index of " -; -static const u_char t03_head3[] = "" -"" -"\n" -"" -; -static const u_char t04_body1[] = "" -"" -"

Index of " -; -static const u_char t05_body2[] = "" -"

" -"\n" -; -static const u_char t06_list1[] = "" -"
last = ngx_cpymem(b->last, - sort_url_args, - ngx_sizeof_ssz("?C=N&O=A")); - } - b->last = ngx_cpymem_ssz(b->last, - "\">Parent directory/--
last, - entry[i].name.data, - entry[i].name.len); - - b->last += entry[i].name.len + entry[i].escape; - - } else { - b->last = ngx_cpymem_str(b->last, entry[i].name); - } - - if (entry[i].dir) { - *b->last++ = '/'; - if (*sort_url_args) { - b->last = ngx_cpymem(b->last, - sort_url_args, - ngx_sizeof_ssz("?C=x&O=y")); - } - } - - *b->last++ = '"'; - b->last = ngx_cpymem_ssz(b->last, " title=\""); - b->last = (u_char *) ngx_escape_html(b->last, entry[i].name.data, entry[i].name.len); - *b->last++ = '"'; - *b->last++ = '>'; - - len = entry[i].utf_len; - - if (entry[i].name.len != len) { - if (len > alcf->name_length) { - copy = alcf->name_length - 3 + 1; - } else { - copy = alcf->name_length + 1; - } - - last = b->last; - b->last = ngx_utf8_cpystrn(b->last, entry[i].name.data, - copy, entry[i].name.len); - - b->last = (u_char *) ngx_escape_html(last, entry[i].name.data, b->last - last); - last = b->last; - - } else { - if (len > alcf->name_length) { - b->last = (u_char *) ngx_escape_html(b->last, entry[i].name.data, alcf->name_length + 1); - } else { - b->last = (u_char *) ngx_escape_html(b->last, entry[i].name.data, entry[i].name.len); - } - last = b->last - 3; - } - - if (len > alcf->name_length) { - b->last = ngx_cpymem_ssz(last, "..>"); - - } else { - if (entry[i].dir && alcf->name_length - len > 0) { - *b->last++ = '/'; - len++; - } - - b->last = ngx_cpymem_ssz(b->last, ""); - } - - if (alcf->exact_size) { - if (entry[i].dir) { - *b->last++ = '-'; - } else { - b->last = ngx_sprintf(b->last, "%19O", entry[i].size); - } - - } else { - if (entry[i].dir) { - *b->last++ = '-'; - } else { - length = entry[i].size; - multiplier = exbibyte; - - for (j = 0; j < DIM(sizes) - 1 && length < multiplier; j++) - multiplier /= 1024; - - /* If we are showing the filesize in bytes, do not show a decimal */ - if (j == DIM(sizes) - 1) - b->last = ngx_sprintf(b->last, "%O %s", length, sizes[j]); - else - b->last = ngx_sprintf(b->last, "%.1f %s", - (float) length / multiplier, sizes[j]); - } - } - - ngx_gmtime(entry[i].mtime + tp->gmtoff * 60 * alcf->localtime, &tm); - b->last = ngx_cpymem_ssz(b->last, ""); - b->last = ngx_fancyindex_timefmt(b->last, &alcf->time_format, &tm); - b->last = ngx_cpymem_ssz(b->last, "
" -"" -"" -"" -"" -"" -"" -"" -"\n" -"" -; -static const u_char t_parentdir_entry[] = "" -"" -"" -"" -"" -"" -"\n" -; -static const u_char t07_list2[] = "" -"" -"
File Name  ↓ File Size  ↓ Date  ↓ 
Parent directory/--
" -; -static const u_char t08_foot1[] = "" -"" -"" -; -#define NFI_TEMPLATE_SIZE (0 \ - + nfi_sizeof_ssz(t01_head1) \ - + nfi_sizeof_ssz(t02_head2) \ - + nfi_sizeof_ssz(t03_head3) \ - + nfi_sizeof_ssz(t04_body1) \ - + nfi_sizeof_ssz(t05_body2) \ - + nfi_sizeof_ssz(t06_list1) \ - + nfi_sizeof_ssz(t_parentdir_entry) \ - + nfi_sizeof_ssz(t07_list2) \ - + nfi_sizeof_ssz(t08_foot1) \ - ) diff --git a/debian/modules/http-fancyindex/template.html b/debian/modules/http-fancyindex/template.html deleted file mode 100644 index b2a3174..0000000 --- a/debian/modules/http-fancyindex/template.html +++ /dev/null @@ -1,93 +0,0 @@ - - - - - - - - - - - Index of -<!-- var NONE --> - /path/to/somewhere -<!-- var t03_head3 --> - - - - - -

Index of - - /path/to/somewhere - -

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
File Name  ↓ File Size  ↓ Date  ↓ 
--
test file 1123kBdate
test file 2321MBdate
test file 3666date
- - - diff --git a/debian/modules/http-subs-filter/config b/debian/modules/http-subs-filter/config deleted file mode 100644 index fdb016c..0000000 --- a/debian/modules/http-subs-filter/config +++ /dev/null @@ -1,3 +0,0 @@ -ngx_addon_name=ngx_http_subs_filter_module -HTTP_AUX_FILTER_MODULES="$HTTP_AUX_FILTER_MODULES ngx_http_subs_filter_module" -NGX_ADDON_SRCS="$NGX_ADDON_SRCS $ngx_addon_dir/ngx_http_subs_filter_module.c" diff --git a/debian/modules/http-uploadprogress/CHANGES b/debian/modules/http-uploadprogress/CHANGES deleted file mode 100644 index 1de19aa..0000000 --- a/debian/modules/http-uploadprogress/CHANGES +++ /dev/null @@ -1,111 +0,0 @@ -nginx_upload_progress release 0.9.2 03 Aug 2016 - - * Allow to build as an externally loadable module (thanks to Peter Tonoli). - -nginx_upload_progress release 0.9.0 06 Apr 2012 - - * INCOMPATIBLE CHANGE: JSONP is now the default output for nginx upload - progress module. To restore the old behavior, add: - upload_progress_java_output - to your nginx configuration (thanks to drewbuschhorn for this work). - - * Add instructions in the README on how to use this module with JQuery - AJAX. - -nginx_upload_progress release 0.8.4 24 Feb 2012 - - * Fix compatibility with nginx 1.1.15 - -nginx_upload_progress release 0.8.3 11 Sep 2011 - - * HTTP redirects (ie 3xx range) shouldn't be reported as an error (thanks to - Pierre-Yves Kerembellec) - - * Fix a double remove in the rb tree due to an uninitialized flag (thanks to - Theo Cushion) - -nginx_upload_progress release 0.8.2 07 Nov 2010 - - * Session ID query string parameter name is now configurable (thanks to - Pierre-Yves Kerembellec) - -nginx_upload_progress release 0.8.1 27 Feb 2010 - - * Fixed find_node so that it can find correctly nodes when there is an - hash collision (thanks to Markus Doppelbauer for his detailed bug report - and test case). - -nginx_upload_progress release 0.8 19 Dec 2009 - - * fixed segfault at start on some platforms (reported by Vladimir - Getmanshchuk and Denis Denisenko) - - * implemented JSONP output (thanks to Bruno Deferrari) - - * X-Progress-ID can now be the last parameter in the request (thanks to - Bruno Deferrari) - -nginx_upload_progress release 0.7 21 Nov 2009 - - * fixed segfault when uploads are aborted (thanks to Markus Doppelbauer for - his bug report) - - * session ID header name is now configurable (thanks to Valery Kholodkov) - - * Added directive to format output as pure json (thanks to Valery Kholodkov) - - * Added directive to format output with configurable template (thanks to - Valery Kholodkov) - - * Added directive to set a probe response content-type (thanks to Valery - Kholodkov) - - * Added upload status variables (needs a status patch) (thanks to Valery - Kholodkov) - -nginx_upload_progress release 0.6 12 Sep 2009 - - * fixed node corruption when cleaning uploads (thanks to Vladimir - Getmanshchuk for his detailed report) - -nginx_upload_progress release 0.5 28 Jun 2008 - - * fixed progress probes returning "done" when upload was still in progress - (thanks to Alexandr Kutuzov for his detailed report) - - * fixed stuck worker process because of rescheduled timer when issuing a - reload or graceful quit (thanks to Alexandr Kutuzov for his detailed - report) - -nginx_upload_progress release 0.4 18 May 2008 - - * Incompatible change: track_uploads MUST be the last directive of a location - it also must be in a proxy_pass or fastcgi_pass location. - - * fixed multiple worker_process issue - - * fixed several crash conditions - -nginx_upload_progress release 0.3 06 May 2008 - - * fixed crash if the upload was denied by nginx because of any error - condition (thanks to Michal Drapiewski for his detailed report) - - * report original upload error condition to client in the upload progress - probe - - * case-insensitive checking of the X-Progress-ID header to overcome Internet - Explorer XMLHttpRequest issue. - -nginx_upload_progress release 0.2 10 Oct 2007 - - * the system now remembers old active uploads for 1 minute to be - able to send back either error status or done status to upload - progress probes. - - * track of HTTP error 413 (request entity too large) is implemented - and the error status '413' is returned. - -nginx_upload_progress release 0.1 3 Oct 2007 - - * public release diff --git a/debian/modules/http-uploadprogress/LICENSE b/debian/modules/http-uploadprogress/LICENSE deleted file mode 100644 index 9dd8c0d..0000000 --- a/debian/modules/http-uploadprogress/LICENSE +++ /dev/null @@ -1,25 +0,0 @@ -/* - * Copyright (C) 2007 Brice FIGUREAU - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - */ diff --git a/debian/modules/http-uploadprogress/Makefile b/debian/modules/http-uploadprogress/Makefile deleted file mode 100644 index 96730d9..0000000 --- a/debian/modules/http-uploadprogress/Makefile +++ /dev/null @@ -1,8 +0,0 @@ -dist: CHANGES README LICENSE config ngx_http_uploadprogress_module.c - tar czvf ../nginx_uploadprogress_module-0.7.tar.gz \ - ../nginx_uploadprogress_module/CHANGES \ - ../nginx_uploadprogress_module/README \ - ../nginx_uploadprogress_module/LICENSE \ - ../nginx_uploadprogress_module/config \ - ../nginx_uploadprogress_module/ngx_http_uploadprogress_module.c - diff --git a/debian/modules/http-uploadprogress/README b/debian/modules/http-uploadprogress/README deleted file mode 100644 index addd6cc..0000000 --- a/debian/modules/http-uploadprogress/README +++ /dev/null @@ -1,329 +0,0 @@ -Nginx Upload Progress Module -============================ - -Introduction -============ - -nginx_uploadprogress_module is an implementation of an upload progress system, that monitors -RFC1867 POST upload as they are transmitted to upstream servers. - -It works by tracking the uploads proxied by Nginx to upstream servers without -analysing the uploaded content and offers a web API to report upload progress in Javscript, Json or any -other format (through the help of templates). - -It works because Nginx acts as an accelerator of an upstream server, storing uploaded POST content -on disk, before transmitting it to the upstream server. Each individual POST upload request -should contain a progress unique identifier. - -This module is Copyright (c) 2007-2012 Brice Figureau, and is licensed under the BSD license (see LICENSE). - * rbtree and shm_zone code is based on Igor Sysoev limit_zone Nginx module. - * expire header code is based on Igor Sysoev header_filter Nginx module. - -The JSON idea and the mechanism idea are based on Lighttpd mod_uploadprogress: -http://blog.lighttpd.net/articles/2006/08/01/mod_uploadprogress-is-back - - -WARNING: - * when compiled with --with-debug, this module will produce high number of log messages. - -INCOMPATIBLE CHANGES -==================== - -v0.9.0: - -JSONP is now the default output of the progress probes. If you rely on this module serving -the deprecated java output use: - upload_progress_java_output -in the progress probe location. - - -Installation -============ - -nginx_uploadprogress_module has been tested with Nginx 0.6.x, 0.7.x, 0.8.x and 1.0.x. - -Download the Nginx sources from http://nginx.net/ and unpack it. - -To build Nginx, change to the directory which contains the Nginx -sources, and run the configuration script making sure to add the path -to the nginx_uploadprogress_module sources using the --add-module option: :: - - $ ./configure --add-module=/path/to/nginx_uploadprogress_module/ - -Now you can build and install the software: - - $ make - -and as root: - - $ make install - - -Configuration -============= - -Each upload request should be assigned a unique identifier. This unique identifier will be used -to store the request and reference it to report. -This identifier can be transmitted either as a GET argument or as an HTTP header whose name is X-Progress-ID. - -upload_progress -+++++++++++++++ - :Syntax: upload_progress - :Default: none - :Context: http - :Description: - This directive enables the upload progress module and reserve bytes to the which - will be used to store the per-connection tracking information. - -track_uploads -+++++++++++++ - :Syntax: track_uploads - :Default: none - :Context: location - :Description: - This directive enables tracking uploads for the current location. Each POST landing in this location will register - the request in the upload progress tracker. - Since Nginx doesn't support yet RFC 1867 upload, the location must be a proxy_pass or fastcgi location. - The POST _must_ have a query parameter called X-Progress-ID (or an HTTP header of the same name) whose value is the - unique identifier used to get progress information. If the POST has no such information, the upload will not be tracked. - The tracked connections are kept at most seconds after they have been finished to be able to serve - useful information to upload progress probes. - WARNING: this directive must be the last directive of the location. It must be in a proxy_pass or - fastcgi_pass location. - -report_uploads -++++++++++++++ - :Syntax: report_uploads - :Default: none - :Context: location - :Description: - This directive allows a location to report the upload progress that is tracked by track_uploads for . - The returned document is a Javascript text with the possible 4 results by default: - * the upload request hasn't been registered yet or is unknown: - new Object({ 'state' : 'starting' }) - - * the upload request has ended: - new Object({ 'state' : 'done' }) - - * the upload request generated an HTTP error - new Object({ 'state' : 'error', 'status' : }) - one error code that can be of use to track for the client is 413 (request entity too large). - - * the upload request is in progress: - new Object({ 'state' : 'uploading', 'received' : , 'size' : }) - - It is possible to return pure json instead of this javascript (see upload_progress_json_output). - It is also possible to configure completely the response format with the directive: - upload_progress_template - - The HTTP request to this location must have a X-Progress-ID parameter or HTTP header containing a valid - unique identifier of an in progress upload. - -upload_progress_content_type -++++++++++++++++++++++++++++ - :Syntax: upload_progress_content_type - :Default: text/javascript - :Context: location - :Description: - This directive allows to change the upload progress probe response content-type. - -upload_progress_header -++++++++++++++++++++++ - :Syntax: upload_progress_header - :Default: X-Progress-ID - :Context: location - :Description: - This directive allows to change the header name of the progress ID. - -upload_progress_jsonp_parameter -++++++++++++++++++++++ - :Syntax: upload_progress_jsonp_parameter - :Default: callback - :Context: location - :Description: - This directive allows to change the name of the GET parameter with the jsonp callback name. - -upload_progress_java_output -+++++++++++++++++++++++++++ - :Syntax: upload_progress_java_output - :Default: N/A - :Context: location - :Description: - This directive sets everything to output as eval() javascript compatible code. - -upload_progress_json_output -+++++++++++++++++++++++++++ - :Syntax: upload_progress_json_output - :Default: N/A - :Context: location - :Description: - This directive sets everything to output as pure json. - -upload_progress_jsonp_output -++++++++++++++++++++++++++++ - :Syntax: upload_progress_jsonp_output - :Default: N/A - :Context: location - :Description: - This directive sets everything to output as jsonp (like json output, but with callback). - -upload_progress_template -++++++++++++++++++++++++ - :Syntax: upload_progress_template