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 2095422..9c2fb00 100644 --- a/CHANGES +++ b/CHANGES @@ -1,10 +1,3312 @@ -Changes with nginx 1.2.1 05 Jun 2012 +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. + + *) Feature: TLS session tickets encryption keys are now automatically + rotated when using shared memory in the "ssl_session_cache" + directive. + + *) 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 + + *) Bugfix: when using EPOLLEXCLUSIVE on Linux client connections were + unevenly distributed among worker processes. + + *) Bugfix: nginx returned the "Connection: keep-alive" header line in + responses during graceful shutdown of old worker processes. + + *) Bugfix: in the "ssl_session_ticket_key" when using TLSv1.3. + + +Changes with nginx 1.21.5 28 Dec 2021 + + *) Change: now nginx is built with the PCRE2 library by default. + + *) Change: now nginx always uses sendfile(SF_NODISKIO) on FreeBSD. + + *) Feature: support for sendfile(SF_NOCACHE) on FreeBSD. + + *) Feature: the $ssl_curve variable. + + *) Bugfix: connections might hang when using HTTP/2 without SSL with the + "sendfile" and "aio" directives. + + +Changes with nginx 1.21.4 02 Nov 2021 + + *) Change: support for NPN instead of ALPN to establish HTTP/2 + connections has been removed. + + *) Change: now nginx rejects SSL connections if ALPN is used by the + client, but no supported protocols can be negotiated. + + *) Change: the default value of the "sendfile_max_chunk" directive was + changed to 2 megabytes. + + *) Feature: the "proxy_half_close" directive in the stream module. + + *) Feature: the "ssl_alpn" directive in the stream module. + + *) Feature: the $ssl_alpn_protocol variable. + + *) Feature: support for SSL_sendfile() when using OpenSSL 3.0. + + *) Feature: the "mp4_start_key_frame" directive in the + ngx_http_mp4_module. + Thanks to Tracey Jaquith. + + *) Bugfix: in the $content_length variable when using chunked transfer + encoding. + + *) Bugfix: after receiving a response with incorrect length from a + proxied backend nginx might nevertheless cache the connection. + Thanks to Awdhesh Mathpal. + + *) Bugfix: invalid headers from backends were logged at the "info" level + instead of "error"; the bug had appeared in 1.21.1. + + *) Bugfix: requests might hang when using HTTP/2 and the "aio_write" + directive. + + +Changes with nginx 1.21.3 07 Sep 2021 + + *) Change: optimization of client request body reading when using + HTTP/2. + + *) Bugfix: in request body filters internal API when using HTTP/2 and + buffering of the data being processed. + + +Changes with nginx 1.21.2 31 Aug 2021 + + *) Change: now nginx rejects HTTP/1.0 requests with the + "Transfer-Encoding" header line. + + *) Change: export ciphers are no longer supported. + + *) Feature: OpenSSL 3.0 compatibility. + + *) Feature: the "Auth-SSL-Protocol" and "Auth-SSL-Cipher" header lines + are now passed to the mail proxy authentication server. + Thanks to Rob Mueller. + + *) Feature: request body filters API now permits buffering of the data + being processed. + + *) Bugfix: backend SSL connections in the stream module might hang after + an SSL handshake. + + *) Bugfix: the security level, which is available in OpenSSL 1.1.0 or + newer, did not affect loading of the server certificates when set + with "@SECLEVEL=N" in the "ssl_ciphers" directive. + + *) Bugfix: SSL connections with gRPC backends might hang if select, + poll, or /dev/poll methods were used. + + *) Bugfix: when using HTTP/2 client request body was always written to + disk if the "Content-Length" header line was not present in the + request. + + +Changes with nginx 1.21.1 06 Jul 2021 + + *) Change: now nginx always returns an error for the CONNECT method. + + *) Change: now nginx always returns an error if both "Content-Length" + and "Transfer-Encoding" header lines are present in the request. + + *) Change: now nginx always returns an error if spaces or control + characters are used in the request line. + + *) Change: now nginx always returns an error if spaces or control + characters are used in a header name. + + *) Change: now nginx always returns an error if spaces or control + characters are used in the "Host" request header line. + + *) Change: optimization of configuration testing when using many + listening sockets. + + *) Bugfix: nginx did not escape """, "<", ">", "\", "^", "`", "{", "|", + and "}" characters when proxying with changed URI. + + *) Bugfix: SSL variables might be empty when used in logs; the bug had + appeared in 1.19.5. + + *) Bugfix: keepalive connections with gRPC backends might not be closed + after receiving a GOAWAY frame. + + *) Bugfix: reduced memory consumption for long-lived requests when + proxying with more than 64 buffers. + + +Changes with nginx 1.21.0 25 May 2021 + + *) Security: 1-byte memory overwrite might occur during DNS server + response processing if the "resolver" directive was used, allowing an + attacker who is able to forge UDP packets from the DNS server to + cause worker process crash or, potentially, arbitrary code execution + (CVE-2021-23017). + + *) Feature: variables support in the "proxy_ssl_certificate", + "proxy_ssl_certificate_key" "grpc_ssl_certificate", + "grpc_ssl_certificate_key", "uwsgi_ssl_certificate", and + "uwsgi_ssl_certificate_key" directives. + + *) Feature: the "max_errors" directive in the mail proxy module. + + *) Feature: the mail proxy module supports POP3 and IMAP pipelining. + + *) Feature: the "fastopen" parameter of the "listen" directive in the + stream module. + Thanks to Anbang Wen. + + *) Bugfix: special characters were not escaped during automatic redirect + with appended trailing slash. + + *) Bugfix: connections with clients in the mail proxy module might be + closed unexpectedly when using SMTP pipelining. + + +Changes with nginx 1.19.10 13 Apr 2021 + + *) Change: the default value of the "keepalive_requests" directive was + changed to 1000. + + *) Feature: the "keepalive_time" directive. + + *) Feature: the $connection_time variable. + + *) Workaround: "gzip filter failed to use preallocated memory" alerts + appeared in logs when using zlib-ng. + + +Changes with nginx 1.19.9 30 Mar 2021 + + *) Bugfix: nginx could not be built with the mail proxy module, but + without the ngx_mail_ssl_module; the bug had appeared in 1.19.8. + + *) Bugfix: "upstream sent response body larger than indicated content + length" errors might occur when working with gRPC backends; the bug + had appeared in 1.19.1. + + *) Bugfix: nginx might not close a connection till keepalive timeout + expiration if the connection was closed by the client while + discarding the request body. + + *) Bugfix: nginx might not detect that a connection was already closed + by the client when waiting for auth_delay or limit_req delay, or when + working with backends. + + *) Bugfix: in the eventport method. + + +Changes with nginx 1.19.8 09 Mar 2021 + + *) Feature: flags in the "proxy_cookie_flags" directive can now contain + variables. + + *) Feature: the "proxy_protocol" parameter of the "listen" directive, + the "proxy_protocol" and "set_real_ip_from" directives in mail proxy. + + *) Bugfix: HTTP/2 connections were immediately closed when using + "keepalive_timeout 0"; the bug had appeared in 1.19.7. + + *) Bugfix: some errors were logged as unknown if nginx was built with + glibc 2.32. + + *) Bugfix: in the eventport method. + + +Changes with nginx 1.19.7 16 Feb 2021 + + *) Change: connections handling in HTTP/2 has been changed to better + match HTTP/1.x; the "http2_recv_timeout", "http2_idle_timeout", and + "http2_max_requests" directives have been removed, the + "keepalive_timeout" and "keepalive_requests" directives should be + used instead. + + *) Change: the "http2_max_field_size" and "http2_max_header_size" + directives have been removed, the "large_client_header_buffers" + directive should be used instead. + + *) Feature: now, if free worker connections are exhausted, nginx starts + closing not only keepalive connections, but also connections in + lingering close. + + *) Bugfix: "zero size buf in output" alerts might appear in logs if an + upstream server returned an incorrect response during unbuffered + proxying; the bug had appeared in 1.19.1. + + *) Bugfix: HEAD requests were handled incorrectly if the "return" + directive was used with the "image_filter" or "xslt_stylesheet" + directives. + + *) Bugfix: in the "add_trailer" directive. + + +Changes with nginx 1.19.6 15 Dec 2020 + + *) Bugfix: "no live upstreams" errors if a "server" inside "upstream" + block was marked as "down". + + *) Bugfix: a segmentation fault might occur in a worker process if HTTPS + was used; the bug had appeared in 1.19.5. + + *) Bugfix: nginx returned the 400 response on requests like + "GET http://example.com?args HTTP/1.0". + + *) Bugfix: in the ngx_http_flv_module and ngx_http_mp4_module. + Thanks to Chris Newton. + + +Changes with nginx 1.19.5 24 Nov 2020 + + *) Feature: the -e switch. + + *) Feature: the same source files can now be specified in different + modules while building addon modules. + + *) Bugfix: SSL shutdown did not work when lingering close was used. + + *) Bugfix: "upstream sent frame for closed stream" errors might occur + when working with gRPC backends. + + *) Bugfix: in request body filters internal API. + + +Changes with nginx 1.19.4 27 Oct 2020 + + *) Feature: the "ssl_conf_command", "proxy_ssl_conf_command", + "grpc_ssl_conf_command", and "uwsgi_ssl_conf_command" directives. + + *) Feature: the "ssl_reject_handshake" directive. + + *) Feature: the "proxy_smtp_auth" directive in mail proxy. + + +Changes with nginx 1.19.3 29 Sep 2020 + + *) Feature: the ngx_stream_set_module. + + *) Feature: the "proxy_cookie_flags" directive. + + *) Feature: the "userid_flags" directive. + + *) Bugfix: the "stale-if-error" cache control extension was erroneously + applied if backend returned a response with status code 500, 502, + 503, 504, 403, 404, or 429. + + *) Bugfix: "[crit] cache file ... has too long header" messages might + appear in logs if caching was used and the backend returned responses + with the "Vary" header line. + + *) Workaround: "[crit] SSL_write() failed" messages might appear in logs + when using OpenSSL 1.1.1. + + *) Bugfix: "SSL_shutdown() failed (SSL: ... bad write retry)" messages + might appear in logs; the bug had appeared in 1.19.2. + + *) Bugfix: a segmentation fault might occur in a worker process when + using HTTP/2 if errors with code 400 were redirected to a proxied + location using the "error_page" directive. + + *) Bugfix: socket leak when using HTTP/2 and subrequests in the njs + module. + + +Changes with nginx 1.19.2 11 Aug 2020 + + *) Change: now nginx starts closing keepalive connections before all + free worker connections are exhausted, and logs a warning about this + to the error log. + + *) Change: optimization of client request body reading when using + chunked transfer encoding. + + *) Bugfix: memory leak if the "ssl_ocsp" directive was used. + + *) Bugfix: "zero size buf in output" alerts might appear in logs if a + FastCGI server returned an incorrect response; the bug had appeared + in 1.19.1. + + *) Bugfix: a segmentation fault might occur in a worker process if + different large_client_header_buffers sizes were used in different + virtual servers. + + *) Bugfix: SSL shutdown might not work. + + *) Bugfix: "SSL_shutdown() failed (SSL: ... bad write retry)" messages + might appear in logs. + + *) Bugfix: in the ngx_http_slice_module. + + *) Bugfix: in the ngx_http_xslt_filter_module. + + +Changes with nginx 1.19.1 07 Jul 2020 + + *) Change: the "lingering_close", "lingering_time", and + "lingering_timeout" directives now work when using HTTP/2. + + *) Change: now extra data sent by a backend are always discarded. + + *) Change: now after receiving a too short response from a FastCGI + server nginx tries to send the available part of the response to the + client, and then closes the client connection. + + *) Change: now after receiving a response with incorrect length from a + gRPC backend nginx stops response processing with an error. + + *) Feature: the "min_free" parameter of the "proxy_cache_path", + "fastcgi_cache_path", "scgi_cache_path", and "uwsgi_cache_path" + directives. + Thanks to Adam Bambuch. + + *) Bugfix: nginx did not delete unix domain listen sockets during + graceful shutdown on the SIGQUIT signal. + + *) Bugfix: zero length UDP datagrams were not proxied. + + *) Bugfix: proxying to uwsgi backends using SSL might not work. + Thanks to Guanzhong Chen. + + *) Bugfix: in error handling when using the "ssl_ocsp" directive. + + *) Bugfix: on XFS and NFS file systems disk cache size might be + calculated incorrectly. + + *) Bugfix: "negative size buf in writer" alerts might appear in logs if + a memcached server returned a malformed response. + + +Changes with nginx 1.19.0 26 May 2020 + + *) Feature: client certificate validation with OCSP. + + *) Bugfix: "upstream sent frame for closed stream" errors might occur + when working with gRPC backends. + + *) Bugfix: OCSP stapling might not work if the "resolver" directive was + not specified. + + *) Bugfix: connections with incorrect HTTP/2 preface were not logged. + + +Changes with nginx 1.17.10 14 Apr 2020 + + *) Feature: the "auth_delay" directive. + + +Changes with nginx 1.17.9 03 Mar 2020 + + *) Change: now nginx does not allow several "Host" request header lines. + + *) Bugfix: nginx ignored additional "Transfer-Encoding" request header + lines. + + *) Bugfix: socket leak when using HTTP/2. + + *) Bugfix: a segmentation fault might occur in a worker process if OCSP + stapling was used. + + *) Bugfix: in the ngx_http_mp4_module. + + *) Bugfix: nginx used status code 494 instead of 400 if errors with code + 494 were redirected with the "error_page" directive. + + *) Bugfix: socket leak when using subrequests in the njs module and the + "aio" directive. + + +Changes with nginx 1.17.8 21 Jan 2020 + + *) Feature: variables support in the "grpc_pass" directive. + + *) Bugfix: a timeout might occur while handling pipelined requests in an + SSL connection; the bug had appeared in 1.17.5. + + *) Bugfix: in the "debug_points" directive when using HTTP/2. + Thanks to Daniil Bondarev. + + +Changes with nginx 1.17.7 24 Dec 2019 + + *) Bugfix: a segmentation fault might occur on start or during + reconfiguration if the "rewrite" directive with an empty replacement + string was used in the configuration. + + *) Bugfix: a segmentation fault might occur in a worker process if the + "break" directive was used with the "alias" directive or with the + "proxy_pass" directive with a URI. + + *) Bugfix: the "Location" response header line might contain garbage if + the request URI was rewritten to the one containing a null character. + + *) Bugfix: requests with bodies were handled incorrectly when returning + redirections with the "error_page" directive; the bug had appeared in + 0.7.12. + + *) Bugfix: socket leak when using HTTP/2. + + *) Bugfix: a timeout might occur while handling pipelined requests in an + SSL connection; the bug had appeared in 1.17.5. + + *) Bugfix: in the ngx_http_dav_module. + + +Changes with nginx 1.17.6 19 Nov 2019 + + *) Feature: the $proxy_protocol_server_addr and + $proxy_protocol_server_port variables. + + *) Feature: the "limit_conn_dry_run" directive. + + *) Feature: the $limit_req_status and $limit_conn_status variables. + + +Changes with nginx 1.17.5 22 Oct 2019 + + *) Feature: now nginx uses ioctl(FIONREAD), if available, to avoid + reading from a fast connection for a long time. + + *) Bugfix: incomplete escaped characters at the end of the request URI + were ignored. + + *) Bugfix: "/." and "/.." at the end of the request URI were not + normalized. + + *) Bugfix: in the "merge_slashes" directive. + + *) Bugfix: in the "ignore_invalid_headers" directive. + Thanks to Alan Kemp. + + *) Bugfix: nginx could not be built with MinGW-w64 gcc 8.1 or newer. + + +Changes with nginx 1.17.4 24 Sep 2019 + + *) Change: better detection of incorrect client behavior in HTTP/2. + + *) Change: in handling of not fully read client request body when + returning errors in HTTP/2. + + *) Bugfix: the "worker_shutdown_timeout" directive might not work when + using HTTP/2. + + *) Bugfix: a segmentation fault might occur in a worker process when + using HTTP/2 and the "proxy_request_buffering" directive. + + *) Bugfix: the ECONNABORTED error log level was "crit" instead of + "error" on Windows when using SSL. + + *) Bugfix: nginx ignored extra data when using chunked transfer + encoding. + + *) Bugfix: nginx always returned the 500 error if the "return" directive + was used and an error occurred during reading client request body. + + *) Bugfix: in memory allocation error handling. + + +Changes with nginx 1.17.3 13 Aug 2019 + + *) Security: when using HTTP/2 a client might cause excessive memory + consumption and CPU usage (CVE-2019-9511, CVE-2019-9513, + CVE-2019-9516). + + *) Bugfix: "zero size buf" alerts might appear in logs when using + gzipping; the bug had appeared in 1.17.2. + + *) Bugfix: a segmentation fault might occur in a worker process if the + "resolver" directive was used in SMTP proxy. + + +Changes with nginx 1.17.2 23 Jul 2019 + + *) Change: minimum supported zlib version is 1.2.0.4. + Thanks to Ilya Leoshkevich. + + *) Change: the $r->internal_redirect() embedded perl method now expects + escaped URIs. + + *) Feature: it is now possible to switch to a named location using the + $r->internal_redirect() embedded perl method. + + *) Bugfix: in error handling in embedded perl. + + *) Bugfix: a segmentation fault might occur on start or during + reconfiguration if hash bucket size larger than 64 kilobytes was used + in the configuration. + + *) Bugfix: nginx might hog CPU during unbuffered proxying and when + proxying WebSocket connections if the select, poll, or /dev/poll + methods were used. + + *) Bugfix: in the ngx_http_xslt_filter_module. + + *) Bugfix: in the ngx_http_ssi_filter_module. + + +Changes with nginx 1.17.1 25 Jun 2019 + + *) Feature: the "limit_req_dry_run" directive. + + *) Feature: when using the "hash" directive inside the "upstream" block + an empty hash key now triggers round-robin balancing. + Thanks to Niklas Keller. + + *) Bugfix: a segmentation fault might occur in a worker process if + caching was used along with the "image_filter" directive, and errors + with code 415 were redirected with the "error_page" directive; the + bug had appeared in 1.11.10. + + *) Bugfix: a segmentation fault might occur in a worker process if + embedded perl was used; the bug had appeared in 1.7.3. + + +Changes with nginx 1.17.0 21 May 2019 + + *) Feature: variables support in the "limit_rate" and "limit_rate_after" + directives. + + *) Feature: variables support in the "proxy_upload_rate" and + "proxy_download_rate" directives in the stream module. + + *) Change: minimum supported OpenSSL version is 0.9.8. + + *) Change: now the postpone filter is always built. + + *) Bugfix: the "include" directive did not work inside the "if" and + "limit_except" blocks. + + *) Bugfix: in byte ranges processing. + + +Changes with nginx 1.15.12 16 Apr 2019 + + *) Bugfix: a segmentation fault might occur in a worker process if + variables were used in the "ssl_certificate" or "ssl_certificate_key" + directives and OCSP stapling was enabled. + + +Changes with nginx 1.15.11 09 Apr 2019 + + *) Bugfix: in the "ssl_stapling_file" directive on Windows. + + +Changes with nginx 1.15.10 26 Mar 2019 + + *) Change: when using a hostname in the "listen" directive nginx now + creates listening sockets for all addresses the hostname resolves to + (previously, only the first address was used). + + *) Feature: port ranges in the "listen" directive. + + *) Feature: loading of SSL certificates and secret keys from variables. + + *) Workaround: the $ssl_server_name variable might be empty when using + OpenSSL 1.1.1. + + *) Bugfix: nginx/Windows could not be built with Visual Studio 2015 or + newer; the bug had appeared in 1.15.9. + + +Changes with nginx 1.15.9 26 Feb 2019 + + *) Feature: variables support in the "ssl_certificate" and + "ssl_certificate_key" directives. + + *) Feature: the "poll" method is now available on Windows when using + Windows Vista or newer. + + *) Bugfix: if the "select" method was used on Windows and an error + occurred while establishing a backend connection, nginx waited for + the connection establishment timeout to expire. + + *) Bugfix: the "proxy_upload_rate" and "proxy_download_rate" directives + in the stream module worked incorrectly when proxying UDP datagrams. + + +Changes with nginx 1.15.8 25 Dec 2018 + + *) Feature: the $upstream_bytes_sent variable. + Thanks to Piotr Sikora. + + *) Feature: new directives in vim syntax highlighting scripts. + Thanks to Gena Makhomed. + + *) Bugfix: in the "proxy_cache_background_update" directive. + + *) Bugfix: in the "geo" directive when using unix domain listen sockets. + + *) Workaround: the "ignoring stale global SSL error ... bad length" + alerts might appear in logs when using the "ssl_early_data" directive + with OpenSSL. + + *) Bugfix: in nginx/Windows. + + *) Bugfix: in the ngx_http_autoindex_module on 32-bit platforms. + + +Changes with nginx 1.15.7 27 Nov 2018 + + *) Feature: the "proxy_requests" directive in the stream module. + + *) Feature: the "delay" parameter of the "limit_req" directive. + Thanks to Vladislav Shabanov and Peter Shchuchkin. + + *) Bugfix: memory leak on errors during reconfiguration. + + *) Bugfix: in the $upstream_response_time, $upstream_connect_time, and + $upstream_header_time variables. + + *) Bugfix: a segmentation fault might occur in a worker process if the + ngx_http_mp4_module was used on 32-bit platforms. + + +Changes with nginx 1.15.6 06 Nov 2018 + + *) Security: when using HTTP/2 a client might cause excessive memory + consumption (CVE-2018-16843) and CPU usage (CVE-2018-16844). + + *) Security: processing of a specially crafted mp4 file with the + ngx_http_mp4_module might result in worker process memory disclosure + (CVE-2018-16845). + + *) Feature: the "proxy_socket_keepalive", "fastcgi_socket_keepalive", + "grpc_socket_keepalive", "memcached_socket_keepalive", + "scgi_socket_keepalive", and "uwsgi_socket_keepalive" directives. + + *) Bugfix: if nginx was built with OpenSSL 1.1.0 and used with OpenSSL + 1.1.1, the TLS 1.3 protocol was always enabled. + + *) Bugfix: working with gRPC backends might result in excessive memory + consumption. + + +Changes with nginx 1.15.5 02 Oct 2018 + + *) Bugfix: a segmentation fault might occur in a worker process when + using OpenSSL 1.1.0h or newer; the bug had appeared in 1.15.4. + + *) Bugfix: of minor potential bugs. + + +Changes with nginx 1.15.4 25 Sep 2018 + + *) Feature: now the "ssl_early_data" directive can be used with OpenSSL. + + *) Bugfix: in the ngx_http_uwsgi_module. + Thanks to Chris Caputo. + + *) Bugfix: connections with some gRPC backends might not be cached when + using the "keepalive" directive. + + *) Bugfix: a socket leak might occur when using the "error_page" + directive to redirect early request processing errors, notably errors + with code 400. + + *) Bugfix: the "return" directive did not change the response code when + returning errors if the request was redirected by the "error_page" + directive. + + *) Bugfix: standard error pages and responses of the + ngx_http_autoindex_module module used the "bgcolor" attribute, and + might be displayed incorrectly when using custom color settings in + browsers. + Thanks to Nova DasSarma. + + *) Change: the logging level of the "no suitable key share" and "no + suitable signature algorithm" SSL errors has been lowered from "crit" + to "info". + + +Changes with nginx 1.15.3 28 Aug 2018 + + *) Feature: now TLSv1.3 can be used with BoringSSL. + + *) Feature: the "ssl_early_data" directive, currently available with + BoringSSL. + + *) Feature: the "keepalive_timeout" and "keepalive_requests" directives + in the "upstream" block. + + *) Bugfix: the ngx_http_dav_module did not truncate destination file + when copying a file over an existing one with the COPY method. + + *) Bugfix: the ngx_http_dav_module used zero access rights on the + destination file and did not preserve file modification time when + moving a file between different file systems with the MOVE method. + + *) Bugfix: the ngx_http_dav_module used default access rights when + copying a file with the COPY method. + + *) Workaround: some clients might not work when using HTTP/2; the bug + had appeared in 1.13.5. + + *) Bugfix: nginx could not be built with LibreSSL 2.8.0. + + +Changes with nginx 1.15.2 24 Jul 2018 + + *) Feature: the $ssl_preread_protocol variable in the + ngx_stream_ssl_preread_module. + + *) Feature: now when using the "reset_timedout_connection" directive + nginx will reset connections being closed with the 444 code. + + *) Change: a logging level of the "http request", "https proxy request", + "unsupported protocol", and "version too low" SSL errors has been + lowered from "crit" to "info". + + *) Bugfix: DNS requests were not resent if initial sending of a request + failed. + + *) Bugfix: the "reuseport" parameter of the "listen" directive was + ignored if the number of worker processes was specified after the + "listen" directive. + + *) Bugfix: when using OpenSSL 1.1.0 or newer it was not possible to + switch off "ssl_prefer_server_ciphers" in a virtual server if it was + switched on in the default server. + + *) Bugfix: SSL session reuse with upstream servers did not work with the + TLS 1.3 protocol. + + +Changes with nginx 1.15.1 03 Jul 2018 + + *) Feature: the "random" directive inside the "upstream" block. + + *) Feature: improved performance when using the "hash" and "ip_hash" + directives with the "zone" directive. + + *) Feature: the "reuseport" parameter of the "listen" directive now uses + SO_REUSEPORT_LB on FreeBSD 12. + + *) Bugfix: HTTP/2 server push did not work if SSL was terminated by a + proxy server in front of nginx. + + *) Bugfix: the "tcp_nopush" directive was always used on backend + connections. + + *) Bugfix: sending a disk-buffered request body to a gRPC backend might + fail. + + +Changes with nginx 1.15.0 05 Jun 2018 + + *) Change: the "ssl" directive is deprecated; the "ssl" parameter of the + "listen" directive should be used instead. + + *) Change: now nginx detects missing SSL certificates during + configuration testing when using the "ssl" parameter of the "listen" + directive. + + *) Feature: now the stream module can handle multiple incoming UDP + datagrams from a client within a single session. + + *) Bugfix: it was possible to specify an incorrect response code in the + "proxy_cache_valid" directive. + + *) Bugfix: nginx could not be built by gcc 8.1. + + *) Bugfix: logging to syslog stopped on local IP address changes. + + *) Bugfix: nginx could not be built by clang with CUDA SDK installed; + the bug had appeared in 1.13.8. + + *) Bugfix: "getsockopt(TCP_FASTOPEN) ... failed" messages might appear + in logs during binary upgrade when using unix domain listen sockets + on FreeBSD. + + *) Bugfix: nginx could not be built on Fedora 28 Linux. + + *) Bugfix: request processing rate might exceed configured rate when + using the "limit_req" directive. + + *) Bugfix: in handling of client addresses when using unix domain listen + sockets to work with datagrams on Linux. + + *) Bugfix: in memory allocation error handling. + + +Changes with nginx 1.13.12 10 Apr 2018 + + *) Bugfix: connections with gRPC backends might be closed unexpectedly + when returning a large response. + + +Changes with nginx 1.13.11 03 Apr 2018 + + *) Feature: the "proxy_protocol" parameter of the "listen" directive now + supports the PROXY protocol version 2. + + *) Bugfix: nginx could not be built with OpenSSL 1.1.1 statically on + Linux. + + *) Bugfix: in the "http_404", "http_500", etc. parameters of the + "proxy_next_upstream" directive. + + +Changes with nginx 1.13.10 20 Mar 2018 + + *) Feature: the "set" parameter of the "include" SSI directive now + allows writing arbitrary responses to a variable; the + "subrequest_output_buffer_size" directive defines maximum response + size. + + *) Feature: now nginx uses clock_gettime(CLOCK_MONOTONIC) if available, + to avoid timeouts being incorrectly triggered on system time changes. + + *) Feature: the "escape=none" parameter of the "log_format" directive. + Thanks to Johannes Baiter and Calin Don. + + *) Feature: the $ssl_preread_alpn_protocols variable in the + ngx_stream_ssl_preread_module. + + *) Feature: the ngx_http_grpc_module. + + *) Bugfix: in memory allocation error handling in the "geo" directive. + + *) Bugfix: when using variables in the "auth_basic_user_file" directive + a null character might appear in logs. + Thanks to Vadim Filimonov. + + +Changes with nginx 1.13.9 20 Feb 2018 + + *) Feature: HTTP/2 server push support; the "http2_push" and + "http2_push_preload" directives. + + *) Bugfix: "header already sent" alerts might appear in logs when using + cache; the bug had appeared in 1.9.13. + + *) Bugfix: a segmentation fault might occur in a worker process if the + "ssl_verify_client" directive was used and no SSL certificate was + specified in a virtual server. + + *) Bugfix: in the ngx_http_v2_module. + + *) Bugfix: in the ngx_http_dav_module. + + +Changes with nginx 1.13.8 26 Dec 2017 + + *) Feature: now nginx automatically preserves the CAP_NET_RAW capability + in worker processes when using the "transparent" parameter of the + "proxy_bind", "fastcgi_bind", "memcached_bind", "scgi_bind", and + "uwsgi_bind" directives. + + *) Feature: improved CPU cache line size detection. + Thanks to Debayan Ghosh. + + *) Feature: new directives in vim syntax highlighting scripts. + Thanks to Gena Makhomed. + + *) Bugfix: binary upgrade refused to work if nginx was re-parented to a + process with PID different from 1 after its parent process has + finished. + + *) Bugfix: the ngx_http_autoindex_module incorrectly handled requests + with bodies. + + *) Bugfix: in the "proxy_limit_rate" directive when used with the + "keepalive" directive. + + *) Bugfix: some parts of a response might be buffered when using + "proxy_buffering off" if the client connection used SSL. + Thanks to Patryk Lesiewicz. + + *) Bugfix: in the "proxy_cache_background_update" directive. + + *) Bugfix: it was not possible to start a parameter with a variable in + the "${name}" form with the name in curly brackets without enclosing + the parameter into single or double quotes. + + +Changes with nginx 1.13.7 21 Nov 2017 + + *) Bugfix: in the $upstream_status variable. + + *) Bugfix: a segmentation fault might occur in a worker process if a + backend returned a "101 Switching Protocols" response to a + subrequest. + + *) Bugfix: a segmentation fault occurred in a master process if a shared + memory zone size was changed during a reconfiguration and the + reconfiguration failed. + + *) Bugfix: in the ngx_http_fastcgi_module. + + *) Bugfix: nginx returned the 500 error if parameters without variables + were specified in the "xslt_stylesheet" directive. + + *) Workaround: "gzip filter failed to use preallocated memory" alerts + appeared in logs when using a zlib library variant from Intel. + + *) Bugfix: the "worker_shutdown_timeout" directive did not work when + using mail proxy and when proxying WebSocket connections. + + +Changes with nginx 1.13.6 10 Oct 2017 + + *) Bugfix: switching to the next upstream server in the stream module + did not work when using the "ssl_preread" directive. + + *) Bugfix: in the ngx_http_v2_module. + Thanks to Piotr Sikora. + + *) Bugfix: nginx did not support dates after the year 2038 on 32-bit + platforms with 64-bit time_t. + + *) Bugfix: in handling of dates prior to the year 1970 and after the + year 10000. + + *) Bugfix: in the stream module timeouts waiting for UDP datagrams from + upstream servers were not logged or logged at the "info" level + instead of "error". + + *) Bugfix: when using HTTP/2 nginx might return the 400 response without + logging the reason. + + *) Bugfix: in processing of corrupted cache files. + + *) Bugfix: cache control headers were ignored when caching errors + intercepted by error_page. + + *) Bugfix: when using HTTP/2 client request body might be corrupted. + + *) Bugfix: in handling of client addresses when using unix domain + sockets. + + *) Bugfix: nginx hogged CPU when using the "hash ... consistent" + directive in the upstream block if large weights were used and all or + most of the servers were unavailable. + + +Changes with nginx 1.13.5 05 Sep 2017 + + *) Feature: the $ssl_client_escaped_cert variable. + + *) Bugfix: the "ssl_session_ticket_key" directive and the "include" + parameter of the "geo" directive did not work on Windows. + + *) Bugfix: incorrect response length was returned on 32-bit platforms + when requesting more than 4 gigabytes with multiple ranges. + + *) Bugfix: the "expires modified" directive and processing of the + "If-Range" request header line did not use the response last + modification time if proxying without caching was used. + + +Changes with nginx 1.13.4 08 Aug 2017 + + *) Feature: the ngx_http_mirror_module. + + *) Bugfix: client connections might be dropped during configuration + testing when using the "reuseport" parameter of the "listen" + directive on Linux. + + *) Bugfix: request body might not be available in subrequests if it was + saved to a file and proxying was used. + + *) Bugfix: cleaning cache based on the "max_size" parameter did not work + on Windows. + + *) Bugfix: any shared memory allocation required 4096 bytes on Windows. + + *) Bugfix: nginx worker might be terminated abnormally when using the + "zone" directive inside the "upstream" block on Windows. + + +Changes with nginx 1.13.3 11 Jul 2017 + + *) Security: a specially crafted request might result in an integer + overflow and incorrect processing of ranges in the range filter, + potentially resulting in sensitive information leak (CVE-2017-7529). + + +Changes with nginx 1.13.2 27 Jun 2017 + + *) Change: nginx now returns 200 instead of 416 when a range starting + with 0 is requested from an empty file. + + *) Feature: the "add_trailer" directive. + Thanks to Piotr Sikora. + + *) Bugfix: nginx could not be built on Cygwin and NetBSD; the bug had + appeared in 1.13.0. + + *) Bugfix: nginx could not be built under MSYS2 / MinGW 64-bit. + Thanks to Orgad Shaneh. + + *) Bugfix: a segmentation fault might occur in a worker process when + using SSI with many includes and proxy_pass with variables. + + *) Bugfix: in the ngx_http_v2_module. + Thanks to Piotr Sikora. + + +Changes with nginx 1.13.1 30 May 2017 + + *) Feature: now a hostname can be used as the "set_real_ip_from" + directive parameter. + + *) Feature: vim syntax highlighting scripts improvements. + + *) Feature: the "worker_cpu_affinity" directive now works on DragonFly + BSD. + Thanks to Sepherosa Ziehau. + + *) Bugfix: SSL renegotiation on backend connections did not work when + using OpenSSL before 1.1.0. + + *) Workaround: nginx could not be built with Oracle Developer Studio + 12.5. + + *) Workaround: now cache manager ignores long locked cache entries when + cleaning cache based on the "max_size" parameter. + + *) Bugfix: client SSL connections were immediately closed if deferred + accept and the "proxy_protocol" parameter of the "listen" directive + were used. + + *) Bugfix: in the "proxy_cache_background_update" directive. + + *) Workaround: now the "tcp_nodelay" directive sets the TCP_NODELAY + option before an SSL handshake. + + +Changes with nginx 1.13.0 25 Apr 2017 + + *) Change: SSL renegotiation is now allowed on backend connections. + + *) Feature: the "rcvbuf" and "sndbuf" parameters of the "listen" + directives of the mail proxy and stream modules. + + *) Feature: the "return" and "error_page" directives can now be used to + return 308 redirections. + Thanks to Simon Leblanc. + + *) Feature: the "TLSv1.3" parameter of the "ssl_protocols" directive. + + *) Feature: when logging signals nginx now logs PID of the process which + sent the signal. + + *) Bugfix: in memory allocation error handling. + + *) Bugfix: if a server in the stream module listened on a wildcard + address, the source address of a response UDP datagram could differ + from the original datagram destination address. + + +Changes with nginx 1.11.13 04 Apr 2017 + + *) Feature: the "http_429" parameter of the "proxy_next_upstream", + "fastcgi_next_upstream", "scgi_next_upstream", and + "uwsgi_next_upstream" directives. + Thanks to Piotr Sikora. + + *) Bugfix: in memory allocation error handling. + + *) Bugfix: requests might hang when using the "sendfile" and + "timer_resolution" directives on Linux. + + *) Bugfix: requests might hang when using the "sendfile" and "aio_write" + directives with subrequests. + + *) Bugfix: in the ngx_http_v2_module. + Thanks to Piotr Sikora. + + *) Bugfix: a segmentation fault might occur in a worker process when + using HTTP/2. + + *) Bugfix: requests might hang when using the "limit_rate", + "sendfile_max_chunk", "limit_req" directives, or the $r->sleep() + embedded perl method with subrequests. + + *) Bugfix: in the ngx_http_slice_module. + + +Changes with nginx 1.11.12 24 Mar 2017 + + *) Bugfix: nginx might hog CPU; the bug had appeared in 1.11.11. + + +Changes with nginx 1.11.11 21 Mar 2017 + + *) Feature: the "worker_shutdown_timeout" directive. + + *) Feature: vim syntax highlighting scripts improvements. + Thanks to Wei-Ko Kao. + + *) Bugfix: a segmentation fault might occur in a worker process if the + $limit_rate variable was set to an empty string. + + *) Bugfix: the "proxy_cache_background_update", + "fastcgi_cache_background_update", "scgi_cache_background_update", + and "uwsgi_cache_background_update" directives might work incorrectly + if the "if" directive was used. + + *) Bugfix: a segmentation fault might occur in a worker process if + number of large_client_header_buffers in a virtual server was + different from the one in the default server. + + *) Bugfix: in the mail proxy server. + + +Changes with nginx 1.11.10 14 Feb 2017 + + *) Change: cache header format has been changed, previously cached + responses will be invalidated. + + *) Feature: support of "stale-while-revalidate" and "stale-if-error" + extensions in the "Cache-Control" backend response header line. + + *) Feature: the "proxy_cache_background_update", + "fastcgi_cache_background_update", "scgi_cache_background_update", + and "uwsgi_cache_background_update" directives. + + *) Feature: nginx is now able to cache responses with the "Vary" header + line up to 128 characters long (instead of 42 characters in previous + versions). + + *) Feature: the "build" parameter of the "server_tokens" directive. + Thanks to Tom Thorogood. + + *) Bugfix: "[crit] SSL_write() failed" messages might appear in logs + when handling requests with the "Expect: 100-continue" request header + line. + + *) Bugfix: the ngx_http_slice_module did not work in named locations. + + *) Bugfix: a segmentation fault might occur in a worker process when + using AIO after an "X-Accel-Redirect" redirection. + + *) Bugfix: reduced memory consumption for long-lived requests using + gzipping. + + +Changes with nginx 1.11.9 24 Jan 2017 + + *) Bugfix: nginx might hog CPU when using the stream module; the bug had + appeared in 1.11.5. + + *) Bugfix: EXTERNAL authentication mechanism in mail proxy was accepted + even if it was not enabled in the configuration. + + *) Bugfix: a segmentation fault might occur in a worker process if the + "ssl_verify_client" directive of the stream module was used. + + *) Bugfix: the "ssl_verify_client" directive of the stream module might + not work. + + *) Bugfix: closing keepalive connections due to no free worker + connections might be too aggressive. + Thanks to Joel Cunningham. + + *) Bugfix: an incorrect response might be returned when using the + "sendfile" directive on FreeBSD and macOS; the bug had appeared in + 1.7.8. + + *) Bugfix: a truncated response might be stored in cache when using the + "aio_write" directive. + + *) Bugfix: a socket leak might occur when using the "aio_write" + directive. + + +Changes with nginx 1.11.8 27 Dec 2016 + + *) Feature: the "absolute_redirect" directive. + + *) Feature: the "escape" parameter of the "log_format" directive. + + *) Feature: client SSL certificates verification in the stream module. + + *) Feature: the "ssl_session_ticket_key" directive supports AES256 + encryption of TLS session tickets when used with 80-byte keys. + + *) Feature: vim-commentary support in vim scripts. + Thanks to Armin Grodon. + + *) Bugfix: recursion when evaluating variables was not limited. + + *) Bugfix: in the ngx_stream_ssl_preread_module. + + *) Bugfix: if a server in an upstream in the stream module failed, it + was considered alive only when a test connection sent to it after + fail_timeout was closed; now a successfully established connection is + enough. + + *) Bugfix: nginx/Windows could not be built with 64-bit Visual Studio. + + *) Bugfix: nginx/Windows could not be built with OpenSSL 1.1.0. + + +Changes with nginx 1.11.7 13 Dec 2016 + + *) Change: now in case of a client certificate verification error the + $ssl_client_verify variable contains a string with the failure + reason, for example, "FAILED:certificate has expired". + + *) Feature: the $ssl_ciphers, $ssl_curves, $ssl_client_v_start, + $ssl_client_v_end, and $ssl_client_v_remain variables. + + *) Feature: the "volatile" parameter of the "map" directive. + + *) Bugfix: dependencies specified for a module were ignored while + building dynamic modules. + + *) Bugfix: when using HTTP/2 and the "limit_req" or "auth_request" + directives client request body might be corrupted; the bug had + appeared in 1.11.0. + + *) Bugfix: a segmentation fault might occur in a worker process when + using HTTP/2; the bug had appeared in 1.11.3. + + *) Bugfix: in the ngx_http_mp4_module. + Thanks to Congcong Hu. + + *) Bugfix: in the ngx_http_perl_module. + + +Changes with nginx 1.11.6 15 Nov 2016 + + *) Change: format of the $ssl_client_s_dn and $ssl_client_i_dn variables + has been changed to follow RFC 2253 (RFC 4514); values in the old + format are available in the $ssl_client_s_dn_legacy and + $ssl_client_i_dn_legacy variables. + + *) Change: when storing temporary files in a cache directory they will + be stored in the same subdirectories as corresponding cache files + instead of a separate subdirectory for temporary files. + + *) Feature: EXTERNAL authentication mechanism support in mail proxy. + Thanks to Robert Norris. + + *) Feature: WebP support in the ngx_http_image_filter_module. + + *) Feature: variables support in the "proxy_method" directive. + Thanks to Dmitry Lazurkin. + + *) Feature: the "http2_max_requests" directive in the + ngx_http_v2_module. + + *) Feature: the "proxy_cache_max_range_offset", + "fastcgi_cache_max_range_offset", "scgi_cache_max_range_offset", and + "uwsgi_cache_max_range_offset" directives. + + *) Bugfix: graceful shutdown of old worker processes might require + infinite time when using HTTP/2. + + *) Bugfix: in the ngx_http_mp4_module. + + *) Bugfix: "ignore long locked inactive cache entry" alerts might appear + in logs when proxying WebSocket connections with caching enabled. + + *) Bugfix: nginx did not write anything to log and returned a response + with code 502 instead of 504 when a timeout occurred during an SSL + handshake to a backend. + + +Changes with nginx 1.11.5 11 Oct 2016 + + *) Change: the --with-ipv6 configure option was removed, now IPv6 + support is configured automatically. + + *) Change: now if there are no available servers in an upstream, nginx + will not reset number of failures of all servers as it previously + did, but will wait for fail_timeout to expire. + + *) Feature: the ngx_stream_ssl_preread_module. + + *) Feature: the "server" directive in the "upstream" context supports + the "max_conns" parameter. + + *) Feature: the --with-compat configure option. + + *) Feature: "manager_files", "manager_threshold", and "manager_sleep" + parameters of the "proxy_cache_path", "fastcgi_cache_path", + "scgi_cache_path", and "uwsgi_cache_path" directives. + + *) Bugfix: flags passed by the --with-ld-opt configure option were not + used while building perl module. + + *) Bugfix: in the "add_after_body" directive when used with the + "sub_filter" directive. + + *) Bugfix: in the $realip_remote_addr variable. + + *) Bugfix: the "dav_access", "proxy_store_access", + "fastcgi_store_access", "scgi_store_access", and "uwsgi_store_access" + directives ignored permissions specified for user. + + *) Bugfix: unix domain listen sockets might not be inherited during + binary upgrade on Linux. + + *) Bugfix: nginx returned the 400 response on requests with the "-" + character in the HTTP method. + + +Changes with nginx 1.11.4 13 Sep 2016 + + *) Feature: the $upstream_bytes_received variable. + + *) Feature: the $bytes_received, $session_time, $protocol, $status, + $upstream_addr, $upstream_bytes_sent, $upstream_bytes_received, + $upstream_connect_time, $upstream_first_byte_time, and + $upstream_session_time variables in the stream module. + + *) Feature: the ngx_stream_log_module. + + *) Feature: the "proxy_protocol" parameter of the "listen" directive, + the $proxy_protocol_addr and $proxy_protocol_port variables in the + stream module. + + *) Feature: the ngx_stream_realip_module. + + *) Bugfix: nginx could not be built with the stream module and the + ngx_http_ssl_module, but without ngx_stream_ssl_module; the bug had + appeared in 1.11.3. + + *) Feature: the IP_BIND_ADDRESS_NO_PORT socket option was not used; the + bug had appeared in 1.11.2. + + *) Bugfix: in the "ranges" parameter of the "geo" directive. + + *) Bugfix: an incorrect response might be returned when using the "aio + threads" and "sendfile" directives; the bug had appeared in 1.9.13. + + +Changes with nginx 1.11.3 26 Jul 2016 + + *) Change: now the "accept_mutex" directive is turned off by default. + + *) Feature: now nginx uses EPOLLEXCLUSIVE on Linux. + + *) Feature: the ngx_stream_geo_module. + + *) Feature: the ngx_stream_geoip_module. + + *) Feature: the ngx_stream_split_clients_module. + + *) Feature: variables support in the "proxy_pass" and "proxy_ssl_name" + directives in the stream module. + + *) Bugfix: socket leak when using HTTP/2. + + *) Bugfix: in configure tests. + Thanks to Piotr Sikora. + + +Changes with nginx 1.11.2 05 Jul 2016 + + *) Change: now nginx always uses internal MD5 and SHA1 implementations; + the --with-md5 and --with-sha1 configure options were canceled. + + *) Feature: variables support in the stream module. + + *) Feature: the ngx_stream_map_module. + + *) Feature: the ngx_stream_return_module. + + *) Feature: a port can be specified in the "proxy_bind", "fastcgi_bind", + "memcached_bind", "scgi_bind", and "uwsgi_bind" directives. + + *) Feature: now nginx uses the IP_BIND_ADDRESS_NO_PORT socket option + when available. + + *) Bugfix: a segmentation fault might occur in a worker process when + using HTTP/2 and the "proxy_request_buffering" directive. + + *) Bugfix: the "Content-Length" request header line was always added to + requests passed to backends, including requests without body, when + using HTTP/2. + + *) Bugfix: "http request count is zero" alerts might appear in logs when + using HTTP/2. + + *) Bugfix: unnecessary buffering might occur when using the "sub_filter" + directive; the issue had appeared in 1.9.4. + + +Changes with nginx 1.11.1 31 May 2016 + + *) Security: a segmentation fault might occur in a worker process while + writing a specially crafted request body to a temporary file + (CVE-2016-4450); the bug had appeared in 1.3.9. + + +Changes with nginx 1.11.0 24 May 2016 + + *) Feature: the "transparent" parameter of the "proxy_bind", + "fastcgi_bind", "memcached_bind", "scgi_bind", and "uwsgi_bind" + directives. + + *) Feature: the $request_id variable. + + *) Feature: the "map" directive supports combinations of multiple + variables as resulting values. + + *) Feature: now nginx checks if EPOLLRDHUP events are supported by + kernel, and optimizes connection handling accordingly if the "epoll" + method is used. + + *) Feature: the "ssl_certificate" and "ssl_certificate_key" directives + can be specified multiple times to load certificates of different + types (for example, RSA and ECDSA). + + *) Feature: the "ssl_ecdh_curve" directive now allows specifying a list + of curves when using OpenSSL 1.0.2 or newer; by default a list built + into OpenSSL is used. + + *) Change: to use DHE ciphers it is now required to specify parameters + using the "ssl_dhparam" directive. + + *) Feature: the $proxy_protocol_port variable. + + *) Feature: the $realip_remote_port variable in the + ngx_http_realip_module. + + *) Feature: the ngx_http_realip_module is now able to set the client + port in addition to the address. + + *) Change: the "421 Misdirected Request" response now used when + rejecting requests to a virtual server different from one negotiated + during an SSL handshake; this improves interoperability with some + HTTP/2 clients when using client certificates. + + *) Change: HTTP/2 clients can now start sending request body + immediately; the "http2_body_preread_size" directive controls size of + the buffer used before nginx will start reading client request body. + + *) Bugfix: cached error responses were not updated when using the + "proxy_cache_bypass" directive. + + +Changes with nginx 1.9.15 19 Apr 2016 + + *) Bugfix: "recv() failed" errors might occur when using HHVM as a + FastCGI server. + + *) Bugfix: when using HTTP/2 and the "limit_req" or "auth_request" + directives a timeout or a "client violated flow control" error might + occur while reading client request body; the bug had appeared in + 1.9.14. + + *) Workaround: a response might not be shown by some browsers if HTTP/2 + was used and client request body was not fully read; the bug had + appeared in 1.9.14. + + *) Bugfix: connections might hang when using the "aio threads" + directive. + Thanks to Mindaugas Rasiukevicius. + + +Changes with nginx 1.9.14 05 Apr 2016 + + *) Feature: OpenSSL 1.1.0 compatibility. + + *) Feature: the "proxy_request_buffering", "fastcgi_request_buffering", + "scgi_request_buffering", and "uwsgi_request_buffering" directives + now work with HTTP/2. + + *) Bugfix: "zero size buf in output" alerts might appear in logs when + using HTTP/2. + + *) Bugfix: the "client_max_body_size" directive might work incorrectly + when using HTTP/2. + + *) Bugfix: of minor bugs in logging. + + +Changes with nginx 1.9.13 29 Mar 2016 + + *) Change: non-idempotent requests (POST, LOCK, PATCH) are no longer + passed to the next server by default if a request has been sent to a + backend; the "non_idempotent" parameter of the "proxy_next_upstream" + directive explicitly allows retrying such requests. + + *) Feature: the ngx_http_perl_module can be built dynamically. + + *) Feature: UDP support in the stream module. + + *) Feature: the "aio_write" directive. + + *) Feature: now cache manager monitors number of elements in caches and + tries to avoid cache keys zone overflows. + + *) Bugfix: "task already active" and "second aio post" alerts might + appear in logs when using the "sendfile" and "aio" directives with + subrequests. + + *) Bugfix: "zero size buf in output" alerts might appear in logs if + caching was used and a client closed a connection prematurely. + + *) Bugfix: connections with clients might be closed needlessly if + caching was used. + Thanks to Justin Li. + + *) Bugfix: nginx might hog CPU if the "sendfile" directive was used on + Linux or Solaris and a file being sent was changed during sending. + + *) Bugfix: connections might hang when using the "sendfile" and "aio + threads" directives. + + *) Bugfix: in the "proxy_pass", "fastcgi_pass", "scgi_pass", and + "uwsgi_pass" directives when using variables. + Thanks to Piotr Sikora. + + *) Bugfix: in the ngx_http_sub_filter_module. + + *) Bugfix: if an error occurred in a cached backend connection, the + request was passed to the next server regardless of the + proxy_next_upstream directive. + + *) Bugfix: "CreateFile() failed" errors when creating temporary files on + Windows. + + +Changes with nginx 1.9.12 24 Feb 2016 + + *) Feature: Huffman encoding of response headers in HTTP/2. + Thanks to Vlad Krasnov. + + *) Feature: the "worker_cpu_affinity" directive now supports more than + 64 CPUs. + + *) Bugfix: compatibility with 3rd party C++ modules; the bug had + appeared in 1.9.11. + Thanks to Piotr Sikora. + + *) Bugfix: nginx could not be built statically with OpenSSL on Linux; + the bug had appeared in 1.9.11. + + *) Bugfix: the "add_header ... always" directive with an empty value did + not delete "Last-Modified" and "ETag" header lines from error + responses. + + *) Workaround: "called a function you should not call" and "shutdown + while in init" messages might appear in logs when using OpenSSL + 1.0.2f. + + *) Bugfix: invalid headers might be logged incorrectly. + + *) Bugfix: socket leak when using HTTP/2. + + *) Bugfix: in the ngx_http_v2_module. + + +Changes with nginx 1.9.11 09 Feb 2016 + + *) Feature: TCP support in resolver. + + *) Feature: dynamic modules. + + *) Bugfix: the $request_length variable did not include size of request + headers when using HTTP/2. + + *) Bugfix: in the ngx_http_v2_module. + + +Changes with nginx 1.9.10 26 Jan 2016 + + *) Security: invalid pointer dereference might occur during DNS server + response processing if the "resolver" directive was used, allowing an + attacker who is able to forge UDP packets from the DNS server to + cause segmentation fault in a worker process (CVE-2016-0742). + + *) Security: use-after-free condition might occur during CNAME response + processing if the "resolver" directive was used, allowing an attacker + who is able to trigger name resolution to cause segmentation fault in + a worker process, or might have potential other impact + (CVE-2016-0746). + + *) Security: CNAME resolution was insufficiently limited if the + "resolver" directive was used, allowing an attacker who is able to + trigger arbitrary name resolution to cause excessive resource + consumption in worker processes (CVE-2016-0747). + + *) Feature: the "auto" parameter of the "worker_cpu_affinity" directive. + + *) Bugfix: the "proxy_protocol" parameter of the "listen" directive did + not work with IPv6 listen sockets. + + *) Bugfix: connections to upstream servers might be cached incorrectly + when using the "keepalive" directive. + + *) Bugfix: proxying used the HTTP method of the original request after + an "X-Accel-Redirect" redirection. + + +Changes with nginx 1.9.9 09 Dec 2015 + + *) Bugfix: proxying to unix domain sockets did not work when using + variables; the bug had appeared in 1.9.8. + + +Changes with nginx 1.9.8 08 Dec 2015 + + *) Feature: pwritev() support. + + *) Feature: the "include" directive inside the "upstream" block. + + *) Feature: the ngx_http_slice_module. + + *) Bugfix: a segmentation fault might occur in a worker process when + using LibreSSL; the bug had appeared in 1.9.6. + + *) Bugfix: nginx could not be built on OS X in some cases. + + +Changes with nginx 1.9.7 17 Nov 2015 + + *) Feature: the "nohostname" parameter of logging to syslog. + + *) Feature: the "proxy_cache_convert_head" directive. + + *) Feature: the $realip_remote_addr variable in the + ngx_http_realip_module. + + *) Bugfix: the "expires" directive might not work when using variables. + + *) Bugfix: a segmentation fault might occur in a worker process when + using HTTP/2; the bug had appeared in 1.9.6. + + *) Bugfix: if nginx was built with the ngx_http_v2_module it was + possible to use the HTTP/2 protocol even if the "http2" parameter of + the "listen" directive was not specified. + + *) Bugfix: in the ngx_http_v2_module. + + +Changes with nginx 1.9.6 27 Oct 2015 + + *) Bugfix: a segmentation fault might occur in a worker process when + using HTTP/2. + Thanks to Piotr Sikora and Denis Andzakovic. + + *) Bugfix: the $server_protocol variable was empty when using HTTP/2. + + *) Bugfix: backend SSL connections in the stream module might be timed + out unexpectedly. + + *) Bugfix: a segmentation fault might occur in a worker process if + different ssl_session_cache settings were used in different virtual + servers. + + *) Bugfix: nginx/Windows could not be built with MinGW gcc; the bug had + appeared in 1.9.4. + Thanks to Kouhei Sutou. + + *) Bugfix: time was not updated when the timer_resolution directive was + used on Windows. + + *) Miscellaneous minor fixes and improvements. + Thanks to Markus Linnala, Kurtis Nusbaum and Piotr Sikora. + + +Changes with nginx 1.9.5 22 Sep 2015 + + *) Feature: the ngx_http_v2_module (replaces ngx_http_spdy_module). + Thanks to Dropbox and Automattic for sponsoring this work. + + *) Change: now the "output_buffers" directive uses two buffers by + default. + + *) Change: now nginx limits subrequests recursion, not simultaneous + subrequests. + + *) Change: now nginx checks the whole cache key when returning a + response from cache. + Thanks to Gena Makhomed and Sergey Brester. + + *) Bugfix: "header already sent" alerts might appear in logs when using + cache; the bug had appeared in 1.7.5. + + *) Bugfix: "writev() failed (4: Interrupted system call)" errors might + appear in logs when using CephFS and the "timer_resolution" directive + on Linux. + + *) Bugfix: in invalid configurations handling. + Thanks to Markus Linnala. + + *) Bugfix: a segmentation fault occurred in a worker process if the + "sub_filter" directive was used at http level; the bug had appeared + in 1.9.4. + + +Changes with nginx 1.9.4 18 Aug 2015 + + *) Change: the "proxy_downstream_buffer" and "proxy_upstream_buffer" + directives of the stream module are replaced with the + "proxy_buffer_size" directive. + + *) Feature: the "tcp_nodelay" directive in the stream module. + + *) Feature: multiple "sub_filter" directives can be used simultaneously. + + *) Feature: variables support in the search string of the "sub_filter" + directive. + + *) Workaround: configuration testing might fail under Linux OpenVZ. + Thanks to Gena Makhomed. + + *) Bugfix: old worker processes might hog CPU after reconfiguration with + a large number of worker_connections. + + *) Bugfix: a segmentation fault might occur in a worker process if the + "try_files" and "alias" directives were used inside a location given + by a regular expression; the bug had appeared in 1.7.1. + + *) Bugfix: the "try_files" directive inside a nested location given by a + regular expression worked incorrectly if the "alias" directive was + used in the outer location. + + *) Bugfix: in hash table initialization error handling. + + *) Bugfix: nginx could not be built with Visual Studio 2015. + + +Changes with nginx 1.9.3 14 Jul 2015 + + *) Change: duplicate "http", "mail", and "stream" blocks are now + disallowed. + + *) Feature: connection limiting in the stream module. + + *) Feature: data rate limiting in the stream module. + + *) Bugfix: the "zone" directive inside the "upstream" block did not work + on Windows. + + *) Bugfix: compatibility with LibreSSL in the stream module. + Thanks to Piotr Sikora. + + *) Bugfix: in the "--builddir" configure parameter. + Thanks to Piotr Sikora. + + *) Bugfix: the "ssl_stapling_file" directive did not work; the bug had + appeared in 1.9.2. + Thanks to Faidon Liambotis and Brandon Black. + + *) Bugfix: a segmentation fault might occur in a worker process if the + "ssl_stapling" directive was used; the bug had appeared in 1.9.2. + Thanks to Matthew Baldwin. + + +Changes with nginx 1.9.2 16 Jun 2015 + + *) Feature: the "backlog" parameter of the "listen" directives of the + mail proxy and stream modules. + + *) Feature: the "allow" and "deny" directives in the stream module. + + *) Feature: the "proxy_bind" directive in the stream module. + + *) Feature: the "proxy_protocol" directive in the stream module. + + *) Feature: the -T switch. + + *) Feature: the REQUEST_SCHEME parameter added to the fastcgi.conf, + fastcgi_params, scgi_params, and uwsgi_params standard configuration + files. + + *) Bugfix: the "reuseport" parameter of the "listen" directive of the + stream module did not work. + + *) Bugfix: OCSP stapling might return an expired OCSP response in some + cases. + + +Changes with nginx 1.9.1 26 May 2015 + + *) Change: now SSLv3 protocol is disabled by default. + + *) Change: some long deprecated directives are not supported anymore. + + *) Feature: the "reuseport" parameter of the "listen" directive. + Thanks to Yingqi Lu at Intel and Sepherosa Ziehau. + + *) Feature: the $upstream_connect_time variable. + + *) Bugfix: in the "hash" directive on big-endian platforms. + + *) Bugfix: nginx might fail to start on some old Linux variants; the bug + had appeared in 1.7.11. + + *) Bugfix: in IP address parsing. + Thanks to Sergey Polovko. + + +Changes with nginx 1.9.0 28 Apr 2015 + + *) Change: obsolete aio and rtsig event methods have been removed. + + *) Feature: the "zone" directive inside the "upstream" block. + + *) Feature: the stream module. + + *) Feature: byte ranges support in the ngx_http_memcached_module. + Thanks to Martin Mlynář. + + *) Feature: shared memory can now be used on Windows versions with + address space layout randomization. + Thanks to Sergey Brester. + + *) Feature: the "error_log" directive can now be used on mail and server + levels in mail proxy. + + *) Bugfix: the "proxy_protocol" parameter of the "listen" directive did + not work if not specified in the first "listen" directive for a + listen socket. + + +Changes with nginx 1.7.12 07 Apr 2015 + + *) Feature: now the "tcp_nodelay" directive works with backend SSL + connections. + + *) Feature: now thread pools can be used to read cache file headers. + + *) Bugfix: in the "proxy_request_buffering" directive. + + *) Bugfix: a segmentation fault might occur in a worker process when + using thread pools on Linux. + + *) Bugfix: in error handling when using the "ssl_stapling" directive. + Thanks to Filipe da Silva. + + *) Bugfix: in the ngx_http_spdy_module. + + +Changes with nginx 1.7.11 24 Mar 2015 + + *) Change: the "sendfile" parameter of the "aio" directive is + deprecated; now nginx automatically uses AIO to pre-load data for + sendfile if both "aio" and "sendfile" directives are used. + + *) Feature: experimental thread pools support. + + *) Feature: the "proxy_request_buffering", "fastcgi_request_buffering", + "scgi_request_buffering", and "uwsgi_request_buffering" directives. + + *) Feature: request body filters experimental API. + + *) Feature: client SSL certificates support in mail proxy. + Thanks to Sven Peter, Franck Levionnois, and Filipe Da Silva. + + *) Feature: startup speedup when using the "hash ... consistent" + directive in the upstream block. + Thanks to Wai Keen Woon. + + *) Feature: debug logging into a cyclic memory buffer. + + *) Bugfix: in hash table handling. + Thanks to Chris West. + + *) Bugfix: in the "proxy_cache_revalidate" directive. + + *) Bugfix: SSL connections might hang if deferred accept or the + "proxy_protocol" parameter of the "listen" directive were used. + Thanks to James Hamlin. + + *) Bugfix: the $upstream_response_time variable might contain a wrong + value if the "image_filter" directive was used. + + *) Bugfix: in integer overflow handling. + Thanks to Régis Leroy. + + *) Bugfix: it was not possible to enable SSLv3 with LibreSSL. + + *) Bugfix: the "ignoring stale global SSL error ... called a function + you should not call" alerts appeared in logs when using LibreSSL. + + *) Bugfix: certificates specified by the "ssl_client_certificate" and + "ssl_trusted_certificate" directives were inadvertently used to + automatically construct certificate chains. + + +Changes with nginx 1.7.10 10 Feb 2015 + + *) Feature: the "use_temp_path" parameter of the "proxy_cache_path", + "fastcgi_cache_path", "scgi_cache_path", and "uwsgi_cache_path" + directives. + + *) Feature: the $upstream_header_time variable. + + *) Workaround: now on disk overflow nginx tries to write error logs once + a second only. + + *) Bugfix: the "try_files" directive did not ignore normal files while + testing directories. + Thanks to Damien Tournoud. + + *) Bugfix: alerts "sendfile() failed" if the "sendfile" directive was + used on OS X; the bug had appeared in 1.7.8. + + *) Bugfix: alerts "sem_post() failed" might appear in logs. + + *) Bugfix: nginx could not be built with musl libc. + Thanks to James Taylor. + + *) Bugfix: nginx could not be built on Tru64 UNIX. + Thanks to Goetz T. Fischer. + + +Changes with nginx 1.7.9 23 Dec 2014 + + *) Feature: variables support in the "proxy_cache", "fastcgi_cache", + "scgi_cache", and "uwsgi_cache" directives. + + *) Feature: variables support in the "expires" directive. + + *) Feature: loading of secret keys from hardware tokens with OpenSSL + engines. + Thanks to Dmitrii Pichulin. + + *) Feature: the "autoindex_format" directive. + + *) Bugfix: cache revalidation is now only used for responses with 200 + and 206 status codes. + Thanks to Piotr Sikora. + + *) Bugfix: the "TE" client request header line was passed to backends + while proxying. + + *) Bugfix: the "proxy_pass", "fastcgi_pass", "scgi_pass", and + "uwsgi_pass" directives might not work correctly inside the "if" and + "limit_except" blocks. + + *) Bugfix: the "proxy_store" directive with the "on" parameter was + ignored if the "proxy_store" directive with an explicitly specified + file path was used on a previous level. + + *) Bugfix: nginx could not be built with BoringSSL. + Thanks to Lukas Tribus. + + +Changes with nginx 1.7.8 02 Dec 2014 + + *) Change: now the "If-Modified-Since", "If-Range", etc. client request + header lines are passed to a backend while caching if nginx knows in + advance that the response will not be cached (e.g., when using + proxy_cache_min_uses). + + *) Change: now after proxy_cache_lock_timeout nginx sends a request to a + backend with caching disabled; the new directives + "proxy_cache_lock_age", "fastcgi_cache_lock_age", + "scgi_cache_lock_age", and "uwsgi_cache_lock_age" specify a time + after which the lock will be released and another attempt to cache a + response will be made. + + *) Change: the "log_format" directive can now be used only at http + level. + + *) Feature: the "proxy_ssl_certificate", "proxy_ssl_certificate_key", + "proxy_ssl_password_file", "uwsgi_ssl_certificate", + "uwsgi_ssl_certificate_key", and "uwsgi_ssl_password_file" + directives. + Thanks to Piotr Sikora. + + *) Feature: it is now possible to switch to a named location using + "X-Accel-Redirect". + Thanks to Toshikuni Fukaya. + + *) Feature: now the "tcp_nodelay" directive works with SPDY connections. + + *) Feature: new directives in vim syntax highliting scripts. + Thanks to Peter Wu. + + *) Bugfix: nginx ignored the "s-maxage" value in the "Cache-Control" + backend response header line. + Thanks to Piotr Sikora. + + *) Bugfix: in the ngx_http_spdy_module. + Thanks to Piotr Sikora. + + *) Bugfix: in the "ssl_password_file" directive when using OpenSSL + 0.9.8zc, 1.0.0o, 1.0.1j. + + *) Bugfix: alerts "header already sent" appeared in logs if the + "post_action" directive was used; the bug had appeared in 1.5.4. + + *) Bugfix: alerts "the http output chain is empty" might appear in logs + if the "postpone_output 0" directive was used with SSI includes. + + *) Bugfix: in the "proxy_cache_lock" directive with SSI subrequests. + Thanks to Yichun Zhang. + + +Changes with nginx 1.7.7 28 Oct 2014 + + *) Change: now nginx takes into account the "Vary" header line in a + backend response while caching. + + *) Feature: the "proxy_force_ranges", "fastcgi_force_ranges", + "scgi_force_ranges", and "uwsgi_force_ranges" directives. + + *) Feature: the "proxy_limit_rate", "fastcgi_limit_rate", + "scgi_limit_rate", and "uwsgi_limit_rate" directives. + + *) Feature: the "Vary" parameter of the "proxy_ignore_headers", + "fastcgi_ignore_headers", "scgi_ignore_headers", and + "uwsgi_ignore_headers" directives. + + *) Bugfix: the last part of a response received from a backend with + unbufferred proxy might not be sent to a client if "gzip" or "gunzip" + directives were used. + + *) Bugfix: in the "proxy_cache_revalidate" directive. + Thanks to Piotr Sikora. + + *) Bugfix: in error handling. + Thanks to Yichun Zhang and Daniil Bondarev. + + *) Bugfix: in the "proxy_next_upstream_tries" and + "proxy_next_upstream_timeout" directives. + Thanks to Feng Gu. + + *) Bugfix: nginx/Windows could not be built with MinGW-w64 gcc. + Thanks to Kouhei Sutou. + + +Changes with nginx 1.7.6 30 Sep 2014 + + *) Change: the deprecated "limit_zone" directive is not supported + anymore. + + *) Feature: the "limit_conn_zone" and "limit_req_zone" directives now + can be used with combinations of multiple variables. + + *) Bugfix: request body might be transmitted incorrectly when retrying a + FastCGI request to the next upstream server. + + *) Bugfix: in logging to syslog. + + +Changes with nginx 1.7.5 16 Sep 2014 + + *) Security: it was possible to reuse SSL sessions in unrelated contexts + if a shared SSL session cache or the same TLS session ticket key was + used for multiple "server" blocks (CVE-2014-3616). + Thanks to Antoine Delignat-Lavaud. + + *) Change: now the "stub_status" directive does not require a parameter. + + *) Feature: the "always" parameter of the "add_header" directive. + + *) Feature: the "proxy_next_upstream_tries", + "proxy_next_upstream_timeout", "fastcgi_next_upstream_tries", + "fastcgi_next_upstream_timeout", "memcached_next_upstream_tries", + "memcached_next_upstream_timeout", "scgi_next_upstream_tries", + "scgi_next_upstream_timeout", "uwsgi_next_upstream_tries", and + "uwsgi_next_upstream_timeout" directives. + + *) Bugfix: in the "if" parameter of the "access_log" directive. + + *) Bugfix: in the ngx_http_perl_module. + Thanks to Piotr Sikora. + + *) Bugfix: the "listen" directive of the mail proxy module did not allow + to specify more than two parameters. + + *) Bugfix: the "sub_filter" directive did not work with a string to + replace consisting of a single character. + + *) Bugfix: requests might hang if resolver was used and a timeout + occurred during a DNS request. + + *) Bugfix: in the ngx_http_spdy_module when using with AIO. + + *) Bugfix: a segmentation fault might occur in a worker process if the + "set" directive was used to change the "$http_...", "$sent_http_...", + or "$upstream_http_..." variables. + + *) Bugfix: in memory allocation error handling. + Thanks to Markus Linnala and Feng Gu. + + +Changes with nginx 1.7.4 05 Aug 2014 + + *) Security: pipelined commands were not discarded after STARTTLS + command in SMTP proxy (CVE-2014-3556); the bug had appeared in 1.5.6. + Thanks to Chris Boulton. + + *) Change: URI escaping now uses uppercase hexadecimal digits. + Thanks to Piotr Sikora. + + *) Feature: now nginx can be build with BoringSSL and LibreSSL. + Thanks to Piotr Sikora. + + *) Bugfix: requests might hang if resolver was used and a DNS server + returned a malformed response; the bug had appeared in 1.5.8. + + *) Bugfix: in the ngx_http_spdy_module. + Thanks to Piotr Sikora. + + *) Bugfix: the $uri variable might contain garbage when returning errors + with code 400. + Thanks to Sergey Bobrov. + + *) Bugfix: in error handling in the "proxy_store" directive and the + ngx_http_dav_module. + Thanks to Feng Gu. + + *) Bugfix: a segmentation fault might occur if logging of errors to + syslog was used; the bug had appeared in 1.7.1. + + *) Bugfix: the $geoip_latitude, $geoip_longitude, $geoip_dma_code, and + $geoip_area_code variables might not work. + Thanks to Yichun Zhang. + + *) Bugfix: in memory allocation error handling. + Thanks to Tatsuhiko Kubo and Piotr Sikora. + + +Changes with nginx 1.7.3 08 Jul 2014 + + *) Feature: weak entity tags are now preserved on response + modifications, and strong ones are changed to weak. + + *) Feature: cache revalidation now uses If-None-Match header if + possible. + + *) Feature: the "ssl_password_file" directive. + + *) Bugfix: the If-None-Match request header line was ignored if there + was no Last-Modified header in a response returned from cache. + + *) Bugfix: "peer closed connection in SSL handshake" messages were + logged at "info" level instead of "error" while connecting to + backends. + + *) Bugfix: in the ngx_http_dav_module module in nginx/Windows. + + *) Bugfix: SPDY connections might be closed prematurely if caching was + used. + + +Changes with nginx 1.7.2 17 Jun 2014 + + *) Feature: the "hash" directive inside the "upstream" block. + + *) Feature: defragmentation of free shared memory blocks. + Thanks to Wandenberg Peixoto and Yichun Zhang. + + *) Bugfix: a segmentation fault might occur in a worker process if the + default value of the "access_log" directive was used; the bug had + appeared in 1.7.0. + Thanks to Piotr Sikora. + + *) Bugfix: trailing slash was mistakenly removed from the last parameter + of the "try_files" directive. + + *) Bugfix: nginx could not be built on OS X in some cases. + + *) Bugfix: in the ngx_http_spdy_module. + + +Changes with nginx 1.7.1 27 May 2014 + + *) Feature: the "$upstream_cookie_..." variables. + + *) Feature: the $ssl_client_fingerprint variable. + + *) Feature: the "error_log" and "access_log" directives now support + logging to syslog. + + *) Feature: the mail proxy now logs client port on connect. + + *) Bugfix: memory leak if the "ssl_stapling" directive was used. + Thanks to Filipe da Silva. + + *) Bugfix: the "alias" directive used inside a location given by a + regular expression worked incorrectly if the "if" or "limit_except" + directives were used. + + *) Bugfix: the "charset" directive did not set a charset to encoded + backend responses. + + *) Bugfix: a "proxy_pass" directive without URI part might use original + request after the $args variable was set. + Thanks to Yichun Zhang. + + *) Bugfix: in the "none" parameter in the "smtp_auth" directive; the bug + had appeared in 1.5.6. + Thanks to Svyatoslav Nikolsky. + + *) Bugfix: if sub_filter and SSI were used together, then responses + might be transferred incorrectly. + + *) Bugfix: nginx could not be built with the --with-file-aio option on + Linux/aarch64. + + +Changes with nginx 1.7.0 24 Apr 2014 + + *) Feature: backend SSL certificate verification. + + *) Feature: support for SNI while working with SSL backends. + + *) Feature: the $ssl_server_name variable. + + *) Feature: the "if" parameter of the "access_log" directive. + + +Changes with nginx 1.5.13 08 Apr 2014 + + *) Change: improved hash table handling; the default values of the + "variables_hash_max_size" and "types_hash_bucket_size" were changed + to 1024 and 64 respectively. + + *) Feature: the ngx_http_mp4_module now supports the "end" argument. + + *) Feature: byte ranges support in the ngx_http_mp4_module and while + saving responses to cache. + + *) Bugfix: alerts "ngx_slab_alloc() failed: no memory" no longer logged + when using shared memory in the "ssl_session_cache" directive and in + the ngx_http_limit_req_module. + + *) Bugfix: the "underscores_in_headers" directive did not allow + underscore as a first character of a header. + Thanks to Piotr Sikora. + + *) Bugfix: cache manager might hog CPU on exit in nginx/Windows. + + *) Bugfix: nginx/Windows terminated abnormally if the + "ssl_session_cache" directive was used with the "shared" parameter. + + *) Bugfix: in the ngx_http_spdy_module. + + +Changes with nginx 1.5.12 18 Mar 2014 + + *) Security: a heap memory buffer overflow might occur in a worker + process while handling a specially crafted request by + ngx_http_spdy_module, potentially resulting in arbitrary code + execution (CVE-2014-0133). + Thanks to Lucas Molas, researcher at Programa STIC, Fundación Dr. + Manuel Sadosky, Buenos Aires, Argentina. + + *) Feature: the "proxy_protocol" parameters of the "listen" and + "real_ip_header" directives, the $proxy_protocol_addr variable. + + *) Bugfix: in the "fastcgi_next_upstream" directive. + Thanks to Lucas Molas. + + +Changes with nginx 1.5.11 04 Mar 2014 + + *) Security: memory corruption might occur in a worker process on 32-bit + platforms while handling a specially crafted request by + ngx_http_spdy_module, potentially resulting in arbitrary code + execution (CVE-2014-0088); the bug had appeared in 1.5.10. + Thanks to Lucas Molas, researcher at Programa STIC, Fundación Dr. + Manuel Sadosky, Buenos Aires, Argentina. + + *) Feature: the $ssl_session_reused variable. + + *) Bugfix: the "client_max_body_size" directive might not work when + reading a request body using chunked transfer encoding; the bug had + appeared in 1.3.9. + Thanks to Lucas Molas. + + *) Bugfix: a segmentation fault might occur in a worker process when + proxying WebSocket connections. + + *) Bugfix: a segmentation fault might occur in a worker process if the + ngx_http_spdy_module was used on 32-bit platforms; the bug had + appeared in 1.5.10. + + *) Bugfix: the $upstream_status variable might contain wrong data if the + "proxy_cache_use_stale" or "proxy_cache_revalidate" directives were + used. + Thanks to Piotr Sikora. + + *) Bugfix: a segmentation fault might occur in a worker process if + errors with code 400 were redirected to a named location using the + "error_page" directive. + + *) Bugfix: nginx/Windows could not be built with Visual Studio 2013. + + +Changes with nginx 1.5.10 04 Feb 2014 + + *) Feature: the ngx_http_spdy_module now uses SPDY 3.1 protocol. + Thanks to Automattic and MaxCDN for sponsoring this work. + + *) Feature: the ngx_http_mp4_module now skips tracks too short for a + seek requested. + + *) Bugfix: a segmentation fault might occur in a worker process if the + $ssl_session_id variable was used in logs; the bug had appeared in + 1.5.9. + + *) Bugfix: the $date_local and $date_gmt variables used wrong format + outside of the ngx_http_ssi_filter_module. + + *) Bugfix: client connections might be immediately closed if deferred + accept was used; the bug had appeared in 1.3.15. + + *) Bugfix: alerts "getsockopt(TCP_FASTOPEN) ... failed" appeared in logs + during binary upgrade on Linux; the bug had appeared in 1.5.8. + Thanks to Piotr Sikora. + + +Changes with nginx 1.5.9 22 Jan 2014 + + *) Change: now nginx expects escaped URIs in "X-Accel-Redirect" headers. + + *) Feature: the "ssl_buffer_size" directive. + + *) Feature: the "limit_rate" directive can now be used to rate limit + responses sent in SPDY connections. + + *) Feature: the "spdy_chunk_size" directive. + + *) Feature: the "ssl_session_tickets" directive. + Thanks to Dirkjan Bussink. + + *) Bugfix: the $ssl_session_id variable contained full session + serialized instead of just a session id. + Thanks to Ivan Ristić. + + *) Bugfix: nginx incorrectly handled escaped "?" character in the + "include" SSI command. + + *) Bugfix: the ngx_http_dav_module did not unescape destination URI of + the COPY and MOVE methods. + + *) Bugfix: resolver did not understand domain names with a trailing dot. + Thanks to Yichun Zhang. + + *) Bugfix: alerts "zero size buf in output" might appear in logs while + proxying; the bug had appeared in 1.3.9. + + *) Bugfix: a segmentation fault might occur in a worker process if the + ngx_http_spdy_module was used. + + *) Bugfix: proxied WebSocket connections might hang right after + handshake if the select, poll, or /dev/poll methods were used. + + *) Bugfix: the "xclient" directive of the mail proxy module incorrectly + handled IPv6 client addresses. + + +Changes with nginx 1.5.8 17 Dec 2013 + + *) Feature: IPv6 support in resolver. + + *) Feature: the "listen" directive supports the "fastopen" parameter. + Thanks to Mathew Rodley. + + *) Feature: SSL support in the ngx_http_uwsgi_module. + Thanks to Roberto De Ioris. + + *) Feature: vim syntax highlighting scripts were added to contrib. + Thanks to Evan Miller. + + *) Bugfix: a timeout might occur while reading client request body in an + SSL connection using chunked transfer encoding. + + *) Bugfix: the "master_process" directive did not work correctly in + nginx/Windows. + + *) Bugfix: the "setfib" parameter of the "listen" directive might not + work. + + *) Bugfix: in the ngx_http_spdy_module. + + +Changes with nginx 1.5.7 19 Nov 2013 + + *) Security: a character following an unescaped space in a request line + was handled incorrectly (CVE-2013-4547); the bug had appeared in + 0.8.41. + Thanks to Ivan Fratric of the Google Security Team. + + *) Change: a logging level of auth_basic errors about no user/password + provided has been lowered from "error" to "info". + + *) Feature: the "proxy_cache_revalidate", "fastcgi_cache_revalidate", + "scgi_cache_revalidate", and "uwsgi_cache_revalidate" directives. + + *) Feature: the "ssl_session_ticket_key" directive. + Thanks to Piotr Sikora. + + *) Bugfix: the directive "add_header Cache-Control ''" added a + "Cache-Control" response header line with an empty value. + + *) Bugfix: the "satisfy any" directive might return 403 error instead of + 401 if auth_request and auth_basic directives were used. + Thanks to Jan Marc Hoffmann. + + *) Bugfix: the "accept_filter" and "deferred" parameters of the "listen" + directive were ignored for listen sockets created during binary + upgrade. + Thanks to Piotr Sikora. + + *) Bugfix: some data received from a backend with unbufferred proxy + might not be sent to a client immediately if "gzip" or "gunzip" + directives were used. + Thanks to Yichun Zhang. + + *) Bugfix: in error handling in ngx_http_gunzip_filter_module. + + *) Bugfix: responses might hang if the ngx_http_spdy_module was used + with the "auth_request" directive. + + *) Bugfix: memory leak in nginx/Windows. + + +Changes with nginx 1.5.6 01 Oct 2013 + + *) Feature: the "fastcgi_buffering" directive. + + *) Feature: the "proxy_ssl_protocols" and "proxy_ssl_ciphers" + directives. + Thanks to Piotr Sikora. + + *) Feature: optimization of SSL handshakes when using long certificate + chains. + + *) Feature: the mail proxy supports SMTP pipelining. + + *) Bugfix: in the ngx_http_auth_basic_module when using "$apr1$" + password encryption method. + Thanks to Markus Linnala. + + *) Bugfix: in MacOSX, Cygwin, and nginx/Windows incorrect location might + be used to process a request if locations were given using characters + in different cases. + + *) Bugfix: automatic redirect with appended trailing slash for proxied + locations might not work. + + *) Bugfix: in the mail proxy server. + + *) Bugfix: in the ngx_http_spdy_module. + + +Changes with nginx 1.5.5 17 Sep 2013 + + *) Change: now nginx assumes HTTP/1.0 by default if it is not able to + detect protocol reliably. + + *) Feature: the "disable_symlinks" directive now uses O_PATH on Linux. + + *) Feature: now nginx uses EPOLLRDHUP events to detect premature + connection close by clients if the "epoll" method is used. + + *) Bugfix: in the "valid_referers" directive if the "server_names" + parameter was used. + + *) Bugfix: the $request_time variable did not work in nginx/Windows. + + *) Bugfix: in the "image_filter" directive. + Thanks to Lanshun Zhou. + + *) Bugfix: OpenSSL 1.0.1f compatibility. + Thanks to Piotr Sikora. + + +Changes with nginx 1.5.4 27 Aug 2013 + + *) Change: the "js" extension MIME type has been changed to + "application/javascript"; default value of the "charset_types" + directive was changed accordingly. + + *) Change: now the "image_filter" directive with the "size" parameter + returns responses with the "application/json" MIME type. + + *) Feature: the ngx_http_auth_request_module. + + *) Bugfix: a segmentation fault might occur on start or during + reconfiguration if the "try_files" directive was used with an empty + parameter. + + *) Bugfix: memory leak if relative paths were specified using variables + in the "root" or "auth_basic_user_file" directives. + + *) Bugfix: the "valid_referers" directive incorrectly executed regular + expressions if a "Referer" header started with "https://". + Thanks to Liangbin Li. + + *) Bugfix: responses might hang if subrequests were used and an SSL + handshake error happened during subrequest processing. + Thanks to Aviram Cohen. + + *) Bugfix: in the ngx_http_autoindex_module. + + *) Bugfix: in the ngx_http_spdy_module. + + +Changes with nginx 1.5.3 30 Jul 2013 + + *) Change in internal API: now u->length defaults to -1 if working with + backends in unbuffered mode. + + *) Change: now after receiving an incomplete response from a backend + server nginx tries to send an available part of the response to a + client, and then closes client connection. + + *) Bugfix: a segmentation fault might occur in a worker process if the + ngx_http_spdy_module was used with the "client_body_in_file_only" + directive. + + *) Bugfix: the "so_keepalive" parameter of the "listen" directive might + be handled incorrectly on DragonFlyBSD. + Thanks to Sepherosa Ziehau. + + *) Bugfix: in the ngx_http_xslt_filter_module. + + *) Bugfix: in the ngx_http_sub_filter_module. + + +Changes with nginx 1.5.2 02 Jul 2013 + + *) Feature: now several "error_log" directives can be used. + + *) Bugfix: the $r->header_in() embedded perl method did not return value + of the "Cookie" and "X-Forwarded-For" request header lines; the bug + had appeared in 1.3.14. + + *) Bugfix: in the ngx_http_spdy_module. + Thanks to Jim Radford. + + *) Bugfix: nginx could not be built on Linux with x32 ABI. + Thanks to Serguei Ivantsov. + + +Changes with nginx 1.5.1 04 Jun 2013 + + *) Feature: the "ssi_last_modified", "sub_filter_last_modified", and + "xslt_last_modified" directives. + Thanks to Alexey Kolpakov. + + *) Feature: the "http_403" parameter of the "proxy_next_upstream", + "fastcgi_next_upstream", "scgi_next_upstream", and + "uwsgi_next_upstream" directives. + + *) Feature: the "allow" and "deny" directives now support unix domain + sockets. + + *) Bugfix: nginx could not be built with the ngx_mail_ssl_module, but + without ngx_http_ssl_module; the bug had appeared in 1.3.14. + + *) Bugfix: in the "proxy_set_body" directive. + Thanks to Lanshun Zhou. + + *) Bugfix: in the "lingering_time" directive. + Thanks to Lanshun Zhou. + + *) Bugfix: the "fail_timeout" parameter of the "server" directive in the + "upstream" context might not work if "max_fails" parameter was used; + the bug had appeared in 1.3.0. + + *) Bugfix: a segmentation fault might occur in a worker process if the + "ssl_stapling" directive was used. + Thanks to Piotr Sikora. + + *) Bugfix: in the mail proxy server. + Thanks to Filipe Da Silva. + + *) Bugfix: nginx/Windows might stop accepting connections if several + worker processes were used. + + +Changes with nginx 1.5.0 07 May 2013 + + *) Security: a stack-based buffer overflow might occur in a worker + process while handling a specially crafted request, potentially + resulting in arbitrary code execution (CVE-2013-2028); the bug had + appeared in 1.3.9. + Thanks to Greg MacManus, iSIGHT Partners Labs. + + +Changes with nginx 1.4.0 24 Apr 2013 + + *) Bugfix: nginx could not be built with the ngx_http_perl_module if the + --with-openssl option was used; the bug had appeared in 1.3.16. + + *) Bugfix: in a request body handling in the ngx_http_perl_module; the + bug had appeared in 1.3.9. + + +Changes with nginx 1.3.16 16 Apr 2013 + + *) Bugfix: a segmentation fault might occur in a worker process if + subrequests were used; the bug had appeared in 1.3.9. + + *) Bugfix: the "tcp_nodelay" directive caused an error if a WebSocket + connection was proxied into a unix domain socket. + + *) Bugfix: the $upstream_response_length variable has an incorrect value + "0" if buffering was not used. + Thanks to Piotr Sikora. + + *) Bugfix: in the eventport and /dev/poll methods. + + +Changes with nginx 1.3.15 26 Mar 2013 + + *) Change: opening and closing a connection without sending any data in + it is no longer logged to access_log with error code 400. + + *) Feature: the ngx_http_spdy_module. + Thanks to Automattic for sponsoring this work. + + *) Feature: the "limit_req_status" and "limit_conn_status" directives. + Thanks to Nick Marden. + + *) Feature: the "image_filter_interlace" directive. + Thanks to Ian Babrou. + + *) Feature: $connections_waiting variable in the + ngx_http_stub_status_module. + + *) Feature: the mail proxy module now supports IPv6 backends. + + *) Bugfix: request body might be transmitted incorrectly when retrying a + request to the next upstream server; the bug had appeared in 1.3.9. + Thanks to Piotr Sikora. + + *) Bugfix: in the "client_body_in_file_only" directive; the bug had + appeared in 1.3.9. + + *) Bugfix: responses might hang if subrequests were used and a DNS error + happened during subrequest processing. + Thanks to Lanshun Zhou. + + *) Bugfix: in backend usage accounting. + + +Changes with nginx 1.3.14 05 Mar 2013 + + *) Feature: $connections_active, $connections_reading, and + $connections_writing variables in the ngx_http_stub_status_module. + + *) Feature: support of WebSocket connections in the + ngx_http_uwsgi_module and ngx_http_scgi_module. + + *) Bugfix: in virtual servers handling with SNI. + + *) Bugfix: new sessions were not always stored if the "ssl_session_cache + shared" directive was used and there was no free space in shared + memory. + Thanks to Piotr Sikora. + + *) Bugfix: multiple X-Forwarded-For headers were handled incorrectly. + Thanks to Neal Poole for sponsoring this work. + + *) Bugfix: in the ngx_http_mp4_module. + Thanks to Gernot Vormayr. + + +Changes with nginx 1.3.13 19 Feb 2013 + + *) Change: a compiler with name "cc" is now used by default. + + *) Feature: support for proxying of WebSocket connections. + Thanks to Apcera and CloudBees for sponsoring this work. + + *) Feature: the "auth_basic_user_file" directive supports "{SHA}" + password encryption method. + Thanks to Louis Opter. + + +Changes with nginx 1.3.12 05 Feb 2013 + + *) Feature: variables support in the "proxy_bind", "fastcgi_bind", + "memcached_bind", "scgi_bind", and "uwsgi_bind" directives. + + *) Feature: the $pipe, $request_length, $time_iso8601, and $time_local + variables can now be used not only in the "log_format" directive. + Thanks to Kiril Kalchev. + + *) Feature: IPv6 support in the ngx_http_geoip_module. + Thanks to Gregor KaliÅ¡nik. + + *) Bugfix: in the "proxy_method" directive. + + *) Bugfix: a segmentation fault might occur in a worker process if + resolver was used with the poll method. + + *) Bugfix: nginx might hog CPU during SSL handshake with a backend if + the select, poll, or /dev/poll methods were used. + + *) Bugfix: the "[crit] SSL_write() failed (SSL:)" error. + + *) Bugfix: in the "client_body_in_file_only" directive; the bug had + appeared in 1.3.9. + + *) Bugfix: in the "fastcgi_keep_conn" directive. + + +Changes with nginx 1.3.11 10 Jan 2013 + + *) Bugfix: a segmentation fault might occur if logging was used; the bug + had appeared in 1.3.10. + + *) Bugfix: the "proxy_pass" directive did not work with IP addresses + without port specified; the bug had appeared in 1.3.10. + + *) Bugfix: a segmentation fault occurred on start or during + reconfiguration if the "keepalive" directive was specified more than + once in a single upstream block. + + *) Bugfix: parameter "default" of the "geo" directive did not set + default value for IPv6 addresses. + + +Changes with nginx 1.3.10 25 Dec 2012 + + *) Change: domain names specified in configuration file are now resolved + to IPv6 addresses as well as IPv4 ones. + + *) Change: now if the "include" directive with mask is used on Unix + systems, included files are sorted in alphabetical order. + + *) Change: the "add_header" directive adds headers to 201 responses. + + *) Feature: the "geo" directive now supports IPv6 addresses in CIDR + notation. + + *) Feature: the "flush" and "gzip" parameters of the "access_log" + directive. + + *) Feature: variables support in the "auth_basic" directive. + + *) Bugfix: nginx could not be built with the ngx_http_perl_module in + some cases. + + *) Bugfix: a segmentation fault might occur in a worker process if the + ngx_http_xslt_module was used. + + *) Bugfix: nginx could not be built on MacOSX in some cases. + Thanks to Piotr Sikora. + + *) Bugfix: the "limit_rate" directive with high rates might result in + truncated responses on 32-bit platforms. + Thanks to Alexey Antropov. + + *) Bugfix: a segmentation fault might occur in a worker process if the + "if" directive was used. + Thanks to Piotr Sikora. + + *) Bugfix: a "100 Continue" response was issued with "413 Request Entity + Too Large" responses. + + *) Bugfix: the "image_filter", "image_filter_jpeg_quality" and + "image_filter_sharpen" directives might be inherited incorrectly. + Thanks to Ian Babrou. + + *) Bugfix: "crypt_r() failed" errors might appear if the "auth_basic" + directive was used on Linux. + + *) Bugfix: in backup servers handling. + Thanks to Thomas Chen. + + *) Bugfix: proxied HEAD requests might return incorrect response if the + "gzip" directive was used. + + +Changes with nginx 1.3.9 27 Nov 2012 + + *) Feature: support for chunked transfer encoding while reading client + request body. + + *) Feature: the $request_time and $msec variables can now be used not + only in the "log_format" directive. + + *) Bugfix: cache manager and cache loader processes might not be able to + start if more than 512 listen sockets were used. + + *) Bugfix: in the ngx_http_dav_module. + + +Changes with nginx 1.3.8 30 Oct 2012 + + *) Feature: the "optional_no_ca" parameter of the "ssl_verify_client" + directive. + Thanks to Mike Kazantsev and Eric O'Connor. + + *) Feature: the $bytes_sent, $connection, and $connection_requests + variables can now be used not only in the "log_format" directive. + Thanks to Benjamin Grössing. + + *) Feature: the "auto" parameter of the "worker_processes" directive. + + *) Bugfix: "cache file ... has md5 collision" alert. + + *) Bugfix: in the ngx_http_gunzip_filter_module. + + *) Bugfix: in the "ssl_stapling" directive. + + +Changes with nginx 1.3.7 02 Oct 2012 + + *) Feature: OCSP stapling support. + Thanks to Comodo, DigiCert and GlobalSign for sponsoring this work. + + *) Feature: the "ssl_trusted_certificate" directive. + + *) Feature: resolver now randomly rotates addresses returned from cache. + Thanks to Anton Jouline. + + *) Bugfix: OpenSSL 0.9.7 compatibility. + + +Changes with nginx 1.3.6 12 Sep 2012 + + *) Feature: the ngx_http_gunzip_filter_module. + + *) Feature: the "memcached_gzip_flag" directive. + + *) Feature: the "always" parameter of the "gzip_static" directive. + + *) Bugfix: in the "limit_req" directive; the bug had appeared in 1.1.14. + Thanks to Charles Chen. + + *) Bugfix: nginx could not be built by gcc 4.7 with -O2 optimization if + the --with-ipv6 option was used. + + +Changes with nginx 1.3.5 21 Aug 2012 + + *) Change: the ngx_http_mp4_module module no longer skips tracks in + formats other than H.264 and AAC. + + *) Bugfix: a segmentation fault might occur in a worker process if the + "map" directive was used with variables as values. + + *) Bugfix: a segmentation fault might occur in a worker process if the + "geo" directive was used with the "ranges" parameter but without the + "default" parameter; the bug had appeared in 0.8.43. + Thanks to Zhen Chen and Weibin Yao. + + *) Bugfix: in the -p command-line parameter handling. + + *) Bugfix: in the mail proxy server. + + *) Bugfix: of minor potential bugs. + Thanks to Coverity. + + *) Bugfix: nginx/Windows could not be built with Visual Studio 2005 + Express. + Thanks to HAYASHI Kentaro. + + +Changes with nginx 1.3.4 31 Jul 2012 + + *) Change: the "ipv6only" parameter is now turned on by default for + listening IPv6 sockets. + + *) Feature: the Clang compiler support. + + *) Bugfix: extra listening sockets might be created. + Thanks to Roman Odaisky. + + *) Bugfix: nginx/Windows might hog CPU if a worker process failed to + start. + Thanks to Ricardo Villalobos Guevara. + + *) Bugfix: the "proxy_pass_header", "fastcgi_pass_header", + "scgi_pass_header", "uwsgi_pass_header", "proxy_hide_header", + "fastcgi_hide_header", "scgi_hide_header", and "uwsgi_hide_header" + directives might be inherited incorrectly. + + +Changes with nginx 1.3.3 10 Jul 2012 + + *) Feature: entity tags support and the "etag" directive. + + *) Bugfix: trailing dot in a source value was not ignored if the "map" + directive was used with the "hostnames" parameter. + + *) Bugfix: incorrect location might be used to process a request if a + URI was changed via a "rewrite" directive before an internal redirect + to a named location. + + +Changes with nginx 1.3.2 26 Jun 2012 + + *) Change: the "single" parameter of the "keepalive" directive is now + ignored. + + *) Change: SSL compression is now disabled when using all versions of + OpenSSL, including ones prior to 1.0.0. + + *) Feature: it is now possible to use the "ip_hash" directive to balance + IPv6 clients. + + *) Feature: the $status variable can now be used not only in the + "log_format" directive. + + *) Bugfix: a segmentation fault might occur in a worker process on + shutdown if the "resolver" directive was used. + + *) Bugfix: a segmentation fault might occur in a worker process if the + ngx_http_mp4_module was used. + + *) Bugfix: in the ngx_http_mp4_module. + + *) Bugfix: a segmentation fault might occur in a worker process if + conflicting wildcard server names were used. + + *) Bugfix: nginx might be terminated abnormally on a SIGBUS signal on + ARM platform. + + *) Bugfix: an alert "sendmsg() failed (9: Bad file number)" on HP-UX + while reconfiguration. + + +Changes with nginx 1.3.1 05 Jun 2012 *) Security: now nginx/Windows ignores trailing dot in URI path component, and does not allow URIs with ":$" in it. Thanks to Vladimir Kochetkov, Positive Research Center. + *) Feature: the "proxy_pass", "fastcgi_pass", "scgi_pass", "uwsgi_pass" + directives, and the "server" directive inside the "upstream" block, + now support IPv6 addresses. + + *) Feature: the "resolver" directive now supports IPv6 addresses and an + optional port specification. + + *) Feature: the "least_conn" directive inside the "upstream" block. + + *) Feature: it is now possible to specify a weight for servers while + using the "ip_hash" directive. + + *) Bugfix: a segmentation fault might occur in a worker process if the + "image_filter" directive was used; the bug had appeared in 1.3.0. + + *) Bugfix: nginx could not be built with ngx_cpp_test_module; the bug + had appeared in 1.1.12. + + *) Bugfix: access to variables from SSI and embedded perl module might + not work after reconfiguration. + Thanks to Yichun Zhang. + + *) Bugfix: in the ngx_http_xslt_filter_module. + Thanks to Kuramoto Eiji. + + *) Bugfix: memory leak if $geoip_org variable was used. + Thanks to Denis F. Latypoff. + + *) Bugfix: in the "proxy_cookie_domain" and "proxy_cookie_path" + directives. + + +Changes with nginx 1.3.0 15 May 2012 + *) Feature: the "debug_connection" directive now supports IPv6 addresses and the "unix:" parameter. @@ -289,7 +3591,7 @@ Changes with nginx 1.1.11 12 Dec 2011 Changes with nginx 1.1.10 30 Nov 2011 - *) Bugfix: a segmentation fault occured in a worker process if AIO was + *) Bugfix: a segmentation fault occurred in a worker process if AIO was used on Linux; the bug had appeared in 1.1.9. @@ -398,7 +3700,7 @@ Changes with nginx 1.1.6 17 Oct 2011 sent to it after fail_timeout; the server will be considered alive if it will successfully respond to the request. - *) Change: now the 0x7F-0x1F characters are escaped as \xXX in an + *) Change: now the 0x7F-0xFF characters are escaped as \xXX in an access_log. *) Feature: "proxy/fastcgi/scgi/uwsgi_ignore_headers" directives support @@ -566,7 +3868,7 @@ Changes with nginx 1.1.0 01 Aug 2011 and proxies to an HTTPS backend. Thanks to Maxim Dounin. - *) Bugfix: in parameter validaiton of a "proxy_pass" directive with + *) Bugfix: in parameter validation of a "proxy_pass" directive with variables. Thanks to Lanshun Zhou. @@ -2453,7 +5755,7 @@ Changes with nginx 0.7.11 18 Aug 2008 *) Feature: the "proxy_ssl_session_reuse" directive. *) Bugfix: a "proxy_pass" directive without URI part might use original - request after the "X-Accel-Redirect" redirection was used; + request after the "X-Accel-Redirect" redirection was used. *) Bugfix: if a directory has search only rights and the first index file was absent, then nginx returned the 500 status code. @@ -3331,7 +6633,7 @@ Changes with nginx 0.5.22 29 May 2007 Changes with nginx 0.5.21 28 May 2007 *) Bugfix: if server has more than about ten locations, then regex - locations might be choosen not in that order as they were specified. + locations might be chosen not in that order as they were specified. *) Bugfix: a worker process may got caught in an endless loop on 64-bit platform, if the 33-rd or next in succession backend has failed. @@ -3417,7 +6719,7 @@ Changes with nginx 0.5.17 02 Apr 2007 *) Bugfix: in the HTTPS protocol in the "proxy_pass" directive. - *) Bugfix: in some cases non-cachable variables (such as $uri variable) + *) Bugfix: in some cases non-cacheable variables (such as $uri variable) returned old cached value. @@ -3442,7 +6744,7 @@ Changes with nginx 0.5.16 26 Mar 2007 Changes with nginx 0.5.15 19 Mar 2007 *) Feature: the mail proxy supports authenticated SMTP proxying and the - "smtp_auth", "smtp_capablities", and "xclient" directives. + "smtp_auth", "smtp_capabilities", and "xclient" directives. Thanks to Anton Yuzhaninov and Maxim Dounin. *) Feature: now the keep-alive connections are closed just after @@ -4543,7 +7845,7 @@ Changes with nginx 0.3.21 16 Jan 2006 *) Feature: the ngx_http_perl_module. - *) Change: the "valid_referers" directive allows the referreres without + *) Change: the "valid_referers" directive allows the referrers without URI part. @@ -4643,7 +7945,7 @@ Changes with nginx 0.3.15 07 Dec 2005 *) Feature: the "so_keepalive" directive in IMAP/POP3 proxy. *) Bugfix: if there are unclosed connection nginx now calls abort() only - on gracefull quit and active "debug_points" directive. + on graceful quit and active "debug_points" directive. Changes with nginx 0.3.14 05 Dec 2005 @@ -5184,7 +8486,7 @@ Changes with nginx 0.1.37 23 Jun 2005 *) Bugfix: the responses may be transferred not completely, if many parts or the big parts were included by SSI. - *) Bugfix: if all backends had returned the 404 reponse and the + *) Bugfix: if all backends had returned the 404 response and the "http_404" parameter of the "proxy_next_upstream" or "fastcgi_next_upstream" directives was used, then nginx started to request all backends again. @@ -5616,7 +8918,7 @@ Changes with nginx 0.1.16 25 Jan 2005 *) Bugfix: the compressed response encrypted by SSL may not transferred complete. - *) Bugfix: the TCP-specific TCP_NODELAY, TCP_NOPSUH, and TCP_CORK + *) Bugfix: the TCP-specific TCP_NODELAY, TCP_NOPUSH, and TCP_CORK options, are not used for the unix domain sockets. *) Feature: the rewrite directive supports the arguments rewriting. diff --git a/CHANGES.ru b/CHANGES.ru index 63ac53e..0d1ba20 100644 --- a/CHANGES.ru +++ b/CHANGES.ru @@ -1,11 +1,3383 @@ -Ð˜Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² nginx 1.2.1 05.06.2012 +Ð˜Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² 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 могла приводить к падению рабочего процеÑÑа, + отправке клиенту чаÑти Ñодержимого памÑти рабочего процеÑÑа, а также + потенциально могла иметь другие поÑледÑÑ‚Ð²Ð¸Ñ (CVE-2022-41741, + CVE-2022-41742). + + *) Добавление: переменные "$proxy_protocol_tlv_...". + + *) Добавление: ключи ÑˆÐ¸Ñ„Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ TLS session tickets теперь автоматичеÑки + менÑÑŽÑ‚ÑÑ Ð¿Ñ€Ð¸ иÑпользовании разделÑемой памÑти в ssl_session_cache. + + *) Изменение: уровень Ð»Ð¾Ð³Ð³Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¾ÑˆÐ¸Ð±Ð¾Ðº 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 + + *) ИÑправление: при иÑпользование EPOLLEXCLUSIVE на Linux раÑпределение + клиентÑких Ñоединений между рабочими процеÑÑами было неравномерным. + + *) ИÑправление: во Ð²Ñ€ÐµÐ¼Ñ Ð¿Ð»Ð°Ð²Ð½Ð¾Ð³Ð¾ Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð¸Ñ Ñтарых рабочих процеÑÑов + nginx возвращал в ответах Ñтроку заголовка "Connection: keep-alive". + + *) ИÑправление: в директиве ssl_session_ticket_key при иÑпользовании + TLSv1.3. + + +Ð˜Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² nginx 1.21.5 28.12.2021 + + *) Изменение: теперь nginx по умолчанию ÑобираетÑÑ Ñ Ð±Ð¸Ð±Ð»Ð¸Ð¾Ñ‚ÐµÐºÐ¾Ð¹ PCRE2. + + *) Изменение: теперь nginx вÑегда иÑпользует sendfile(SF_NODISKIO) на + FreeBSD. + + *) Добавление: поддержка sendfile(SF_NOCACHE) на FreeBSD. + + *) Добавление: Ð¿ÐµÑ€ÐµÐ¼ÐµÐ½Ð½Ð°Ñ $ssl_curve. + + *) ИÑправление: при иÑпользовании HTTP/2 без SSL вмеÑте Ñ Ð´Ð¸Ñ€ÐµÐºÑ‚Ð¸Ð²Ð°Ð¼Ð¸ + sendfile и aio ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ð¼Ð¾Ð³Ð»Ð¸ завиÑать. + + +Ð˜Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² nginx 1.21.4 02.11.2021 + + *) Изменение: поддержка NPN вмеÑто ALPN Ð´Ð»Ñ ÑƒÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ + HTTP/2-Ñоединений упразднена. + + *) Изменение: теперь nginx закрывает SSL Ñоединение, еÑли клиент + иÑпользует ALPN, но nginx не поддерживает ни один из приÑланных + клиентом протоколов. + + *) Изменение: в директиве sendfile_max_chunk значение по умолчанию + изменено на 2 мегабайта. + + *) Добавление: директива proxy_half_close в модуле stream. + + *) Добавление: директива ssl_alpn в модуле stream. + + *) Добавление: Ð¿ÐµÑ€ÐµÐ¼ÐµÐ½Ð½Ð°Ñ $ssl_alpn_protocol. + + *) Добавление: поддержка SSL_sendfile() при иÑпользовании OpenSSL 3.0. + + *) Добавление: директива mp4_start_key_frame в модуле + ngx_http_mp4_module. + СпаÑибо Tracey Jaquith. + + *) ИÑправление: в переменной $content_length при иÑпользовании chunked + transfer encoding. + + *) ИÑправление: при получении ответа некорректной длины от прокÑируемого + бÑкенда nginx мог тем не менее закÑшировать Ñоединение. + СпаÑибо Awdhesh Mathpal. + + *) ИÑправление: некорректные заголовки от бÑкендов логгировалиÑÑŒ на + уровне info вмеÑто error; ошибка поÑвилаÑÑŒ в 1.21.1. + + *) ИÑправление: при иÑпользовании HTTP/2 и директивы aio_write запроÑÑ‹ + могли завиÑать. + + +Ð˜Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² nginx 1.21.3 07.09.2021 + + *) Изменение: Ð¾Ð¿Ñ‚Ð¸Ð¼Ð¸Ð·Ð°Ñ†Ð¸Ñ Ñ‡Ñ‚ÐµÐ½Ð¸Ñ Ñ‚ÐµÐ»Ð° запроÑа при иÑпользовании HTTP/2. + + *) ИÑправление: во внутреннем API Ð´Ð»Ñ Ð¾Ð±Ñ€Ð°Ð±Ð¾Ñ‚ÐºÐ¸ тела запроÑа при + иÑпользовании HTTP/2 и буферизации обрабатываемых данных. + + +Ð˜Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² nginx 1.21.2 31.08.2021 + + *) Изменение: теперь nginx возвращает ошибку, еÑли в запроÑе по + протоколу HTTP/1.0 приÑутÑтвует Ñтрока заголовка "Transfer-Encoding". + + *) Изменение: ÑкÑпортные шифры больше не поддерживаютÑÑ. + + *) Добавление: ÑовмеÑтимоÑть Ñ OpenSSL 3.0. + + *) Добавление: теперь Ñерверу аутентификации почтового прокÑи-Ñервера + передаютÑÑ Ñтроки заголовка "Auth-SSL-Protocol" и "Auth-SSL-Cipher". + СпаÑибо Rob Mueller. + + *) Добавление: API Ð´Ð»Ñ Ð¾Ð±Ñ€Ð°Ð±Ð¾Ñ‚ÐºÐ¸ тела запроÑа теперь позволÑет + буферизировать обрабатываемые данные. + + *) ИÑправление: SSL-ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ðº бÑкендам в модуле stream могли завиÑать + поÑле SSL handshake. + + *) ИÑправление: уровень безопаÑноÑти, доÑтупный в OpenSSL 1.1.0 и новее, + не учитывалÑÑ Ð¿Ñ€Ð¸ загрузке Ñертификатов Ñервера, еÑли был задан через + "@SECLEVEL=N" в директиве ssl_ciphers. + + *) ИÑправление: SSL-ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ñ gRPC-бÑкендами могли завиÑать, еÑли + иÑпользовалиÑÑŒ методы select, poll или /dev/poll. + + *) ИÑправление: при иÑпользовании HTTP/2 тело запроÑа вÑегда + запиÑывалоÑÑŒ на диÑк, еÑли в запроÑе не было Ñтроки заголовка + "Content-Length". + + +Ð˜Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² nginx 1.21.1 06.07.2021 + + *) Изменение: теперь nginx Ð´Ð»Ñ Ð¼ÐµÑ‚Ð¾Ð´Ð° CONNECT вÑегда возвращает ошибку. + + *) Изменение: теперь nginx вÑегда возвращает ошибку, еÑли в запроÑе + одновременно приÑутÑтвуют Ñтроки заголовка "Content-Length" и + "Transfer-Encoding". + + *) Изменение: теперь nginx вÑегда возвращает ошибку, еÑли в Ñтроке + запроÑа иÑпользуютÑÑ Ð¿Ñ€Ð¾Ð±ÐµÐ»Ñ‹ или управлÑющие Ñимволы. + + *) Изменение: теперь nginx вÑегда возвращает ошибку, еÑли в имени + заголовка иÑпользуютÑÑ Ð¿Ñ€Ð¾Ð±ÐµÐ»Ñ‹ или управлÑющие Ñимволы. + + *) Изменение: теперь nginx вÑегда возвращает ошибку, еÑли в Ñтроке + "Host" заголовка запроÑа иÑпользуютÑÑ Ð¿Ñ€Ð¾Ð±ÐµÐ»Ñ‹ или управлÑющие + Ñимволы. + + *) Изменение: Ð¾Ð¿Ñ‚Ð¸Ð¼Ð¸Ð·Ð°Ñ†Ð¸Ñ Ñ‚ÐµÑÑ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ ÐºÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ð¸ при иÑпользовании + большого количеÑтва listen-Ñокетов. + + *) ИÑправление: nginx не Ñкранировал Ñимволы """, "<", ">", "\", "^", + "`", "{", "|", и "}" при прокÑировании Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸ÐµÐ¼ URI запроÑа. + + *) ИÑправление: SSL-переменные могли быть пуÑтыми при запиÑи в лог; + ошибка поÑвилаÑÑŒ в 1.19.5. + + *) ИÑправление: keepalive-ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ñ gRPC-бÑкендами могли не + закрыватьÑÑ Ð¿Ð¾Ñле Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ GOAWAY-фрейма. + + *) ИÑправление: уменьшено потребление памÑти Ð´Ð»Ñ Ð´Ð¾Ð»Ð³Ð¾Ð¶Ð¸Ð²ÑƒÑ‰Ð¸Ñ… запроÑов + при прокÑировании Ñ Ð¸Ñпользованием более 64 буферов. + + +Ð˜Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² nginx 1.21.0 25.05.2021 + + *) БезопаÑноÑть: при иÑпользовании директивы resolver во Ð²Ñ€ÐµÐ¼Ñ Ð¾Ð±Ñ€Ð°Ð±Ð¾Ñ‚ÐºÐ¸ + ответа DNS-Ñервера могла проиÑходить перезапиÑÑŒ одного байта памÑти, + что позволÑло атакующему, имеющему возможноÑть подделывать UDP-пакеты + от DNS-Ñервера, вызвать падение рабочего процеÑÑа или, потенциально, + выполнение произвольного кода (CVE-2021-23017). + + *) Добавление: директивы proxy_ssl_certificate, + proxy_ssl_certificate_key, grpc_ssl_certificate, + grpc_ssl_certificate_key, uwsgi_ssl_certificate и + uwsgi_ssl_certificate_key поддерживают переменные. + + *) Добавление: директива max_errors в почтовом прокÑи-Ñервере. + + *) Добавление: почтовый прокÑи-Ñервер поддерживает POP3 и IMAP + pipelining. + + *) Добавление: параметр fastopen директивы listen в модуле stream. + СпаÑибо Anbang Wen. + + *) ИÑправление: Ñпециальные Ñимволы не ÑкранировалиÑÑŒ при автоматичеÑком + перенаправлении Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸ÐµÐ¼ завершающего ÑлÑша. + + *) ИÑправление: при иÑпользовании SMTP pipelining ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ñ ÐºÐ»Ð¸ÐµÐ½Ñ‚Ð°Ð¼Ð¸ + в почтовом прокÑи-Ñервере могли неожиданно закрыватьÑÑ. + + +Ð˜Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² nginx 1.19.10 13.04.2021 + + *) Изменение: в директиве keepalive_requests значение по умолчанию + изменено на 1000. + + *) Добавление: директива keepalive_time. + + *) Добавление: Ð¿ÐµÑ€ÐµÐ¼ÐµÐ½Ð½Ð°Ñ $connection_time. + + *) Изменение: при иÑпользовании zlib-ng в логах поÑвлÑлиÑÑŒ ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ + "gzip filter failed to use preallocated memory". + + +Ð˜Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² nginx 1.19.9 30.03.2021 + + *) ИÑправление: nginx не ÑобиралÑÑ Ñ Ð¿Ð¾Ñ‡Ñ‚Ð¾Ð²Ñ‹Ð¼ прокÑи-Ñервером, но без + Ð¼Ð¾Ð´ÑƒÐ»Ñ ngx_mail_ssl_module; ошибка поÑвилаÑÑŒ в 1.19.8. + + *) ИÑправление: при работе Ñ gRPC-бÑкендами могли возникать ошибки + "upstream sent response body larger than indicated content length"; + ошибка поÑвилаÑÑŒ в 1.19.1. + + *) ИÑправление: еÑли клиент закрывал Ñоединение в момент отбраÑÑ‹Ð²Ð°Ð½Ð¸Ñ + тела запроÑа, nginx мог не закрыть Ñоединение до иÑÑ‚ÐµÑ‡ÐµÐ½Ð¸Ñ + keepalive-таймаута. + + *) ИÑправление: при ожидании задержки limit_req или auth_delay, а также + при работе Ñ Ð±Ñкендами nginx мог не обнаружить, что Ñоединение уже + закрыто клиентом. + + *) ИÑправление: в методе обработки Ñоединений eventport. + + +Ð˜Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² nginx 1.19.8 09.03.2021 + + *) Добавление: в директиве proxy_cookie_flags теперь флаги можно + задавать Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ переменных. + + *) Добавление: параметр proxy_protocol в директиве listen, директивы + proxy_protocol и set_real_ip_from в почтовом прокÑи-Ñервере. + + *) ИÑправление: HTTP/2-ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ñразу закрывалиÑÑŒ при иÑпользовании + "keepalive_timeout 0"; ошибка поÑвилаÑÑŒ в 1.19.7. + + *) ИÑправление: некоторые ошибки логгировалиÑÑŒ как неизвеÑтные, еÑли + nginx был Ñобран Ñ glibc 2.32. + + *) ИÑправление: в методе обработки Ñоединений eventport. + + +Ð˜Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² nginx 1.19.7 16.02.2021 + + *) Изменение: обработка Ñоединений в HTTP/2 была изменена и теперь более + ÑоответÑтвует HTTP/1.x; директивы http2_recv_timeout, + http2_idle_timeout и http2_max_requests упразднены, вмеÑто них + Ñледует иÑпользовать директивы keepalive_timeout и + keepalive_requests. + + *) Изменение: директивы http2_max_field_size и http2_max_header_size + упразднены, вмеÑто них Ñледует иÑпользовать директиву + large_client_header_buffers. + + *) Добавление: теперь при иÑчерпании Ñвободных Ñоединений nginx + закрывает не только keepalive-ÑоединениÑ, но и ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ð² lingering + close. + + *) ИÑправление: в логах могли поÑвлÑтьÑÑ ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ "zero size buf in + output", еÑли бÑкенд возвращал некорректный ответ при + небуферизированном прокÑировании; ошибка поÑвилаÑÑŒ в 1.19.1. + + *) ИÑправление: при иÑпользовании директивы return вмеÑте Ñ image_filter + или xslt_stylesheet HEAD-запроÑÑ‹ обрабатывалиÑÑŒ некорректно. + + *) ИÑправление: в директиве add_trailer. + + +Ð˜Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² nginx 1.19.6 15.12.2020 + + *) ИÑправление: ошибки "no live upstreams", еÑли server в блоке upstream + был помечен как down. + + *) ИÑправление: при иÑпользовании HTTPS в рабочем процеÑÑе мог произойти + segmentation fault; ошибка поÑвилаÑÑŒ в 1.19.5. + + *) ИÑправление: nginx возвращал ошибку 400 на запроÑÑ‹ вида + "GET http://example.com?args HTTP/1.0". + + *) ИÑправление: в модулÑÑ… ngx_http_flv_module и ngx_http_mp4_module. + СпаÑибо Chris Newton. + + +Ð˜Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² nginx 1.19.5 24.11.2020 + + *) Добавление: ключ -e. + + *) Добавление: при Ñборке дополнительных модулей теперь можно указывать + одни и те же иÑходные файлы в разных модулÑÑ…. + + *) ИÑправление: SSL shutdown не работал при закрытии Ñоединений Ñ + ожиданием дополнительных данных (lingering close). + + *) ИÑправление: при работе Ñ gRPC-бÑкендами могли возникать ошибки + "upstream sent frame for closed stream". + + *) ИÑправление: во внутреннем API Ð´Ð»Ñ Ð¾Ð±Ñ€Ð°Ð±Ð¾Ñ‚ÐºÐ¸ тела запроÑа. + + +Ð˜Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² nginx 1.19.4 27.10.2020 + + *) Добавление: директивы ssl_conf_command, proxy_ssl_conf_command, + grpc_ssl_conf_command и uwsgi_ssl_conf_command. + + *) Добавление: директива ssl_reject_handshake. + + *) Добавление: директива proxy_smtp_auth в почтовом прокÑи-Ñервере. + + +Ð˜Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² nginx 1.19.3 29.09.2020 + + *) Добавление: модуль ngx_stream_set_module. + + *) Добавление: директива proxy_cookie_flags. + + *) Добавление: директива userid_flags. + + *) ИÑправление: раÑширение ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ ÐºÑшированием stale-if-error + ошибочно применÑлоÑÑŒ, еÑли бÑкенд возвращал ответ Ñ ÐºÐ¾Ð´Ð¾Ð¼ 500, 502, + 503, 504, 403, 404 или 429. + + *) ИÑправление: еÑли иÑпользовалоÑÑŒ кÑширование и бÑкенд возвращал + ответы Ñ Ñтрокой заголовка Vary, в логах могли поÑвлÑтьÑÑ ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ + "[crit] cache file ... has too long header". + + *) Изменение: при иÑпользовании OpenSSL 1.1.1 в логах могли поÑвлÑтьÑÑ + ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ "[crit] SSL_write() failed". + + *) ИÑправление: в логах могли поÑвлÑтьÑÑ ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ "SSL_shutdown() + failed (SSL: ... bad write retry)"; ошибка поÑвилаÑÑŒ в 1.19.2. + + *) ИÑправление: при иÑпользовании HTTP/2 в рабочем процеÑÑе мог + произойти segmentation fault, еÑли ошибки Ñ ÐºÐ¾Ð´Ð¾Ð¼ 400 Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ + директивы error_page перенаправлÑлиÑÑŒ в прокÑируемый location. + + *) ИÑправление: утечки Ñокетов при иÑпользовании HTTP/2 и подзапроÑов в + модуле njs. + + +Ð˜Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² nginx 1.19.2 11.08.2020 + + *) Изменение: теперь nginx начинает закрывать keepalive-ÑоединениÑ, не + дожидаÑÑÑŒ иÑÑ‡ÐµÑ€Ð¿Ð°Ð½Ð¸Ñ Ð²Ñех Ñвободных Ñоединений, а также пишет об Ñтом + предупреждение в лог ошибок. + + *) Изменение: Ð¾Ð¿Ñ‚Ð¸Ð¼Ð¸Ð·Ð°Ñ†Ð¸Ñ Ñ‡Ñ‚ÐµÐ½Ð¸Ñ Ñ‚ÐµÐ»Ð° запроÑа при иÑпользовании chunked + transfer encoding. + + *) ИÑправление: утечки памÑти при иÑпользовании директивы ssl_ocsp. + + *) ИÑправление: в логах могли поÑвлÑтьÑÑ ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ "zero size buf in + output", еÑли FastCGI-Ñервер возвращал некорректный ответ; ошибка + поÑвилаÑÑŒ в 1.19.1. + + *) ИÑправление: в рабочем процеÑÑе мог произойти segmentation fault, + еÑли размеры large_client_header_buffers отличалиÑÑŒ в разных + виртуальных Ñерверах. + + *) ИÑправление: SSL shutdown мог не работать. + + *) ИÑправление: в логах могли поÑвлÑтьÑÑ ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ "SSL_shutdown() + failed (SSL: ... bad write retry)". + + *) ИÑправление: в модуле ngx_http_slice_module. + + *) ИÑправление: в модуле ngx_http_xslt_filter_module. + + +Ð˜Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² nginx 1.19.1 07.07.2020 + + *) Изменение: директивы lingering_close, lingering_time и + lingering_timeout теперь работают при иÑпользовании HTTP/2. + + *) Изменение: теперь лишние данные, приÑланные бÑкендом, вÑегда + отбраÑываютÑÑ. + + *) Изменение: теперь при получении Ñлишком короткого ответа от + FastCGI-Ñервера nginx пытаетÑÑ Ð¾Ñ‚Ð¿Ñ€Ð°Ð²Ð¸Ñ‚ÑŒ клиенту доÑтупную чаÑть + ответа, поÑле чего закрывает Ñоединение Ñ ÐºÐ»Ð¸ÐµÐ½Ñ‚Ð¾Ð¼. + + *) Изменение: теперь при получении ответа некорректной длины от + gRPC-бÑкенда nginx прекращает обработку ответа Ñ Ð¾ÑˆÐ¸Ð±ÐºÐ¾Ð¹. + + *) Добавление: параметр min_free в директивах proxy_cache_path, + fastcgi_cache_path, scgi_cache_path и uwsgi_cache_path. + СпаÑибо Adam Bambuch. + + *) ИÑправление: nginx не удалÑл unix domain listen-Ñокеты при плавном + завершении по Ñигналу SIGQUIT. + + *) ИÑправление: UDP-пакеты нулевого размера не прокÑировалиÑÑŒ. + + *) ИÑправление: прокÑирование на uwsgi-бÑкенды Ñ Ð¸Ñпользованием SSL + могло не работать. + СпаÑибо Guanzhong Chen. + + *) ИÑправление: в обработке ошибок при иÑпользовании директивы ssl_ocsp. + + *) ИÑправление: при иÑпользовании файловых ÑиÑтем XFS и NFS размер кÑша + на диÑке мог ÑчитатьÑÑ Ð½ÐµÐºÐ¾Ñ€Ñ€ÐµÐºÑ‚Ð½Ð¾. + + *) ИÑправление: еÑли Ñервер memcached возвращал некорректный ответ, в + логах могли поÑвлÑтьÑÑ ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ "negative size buf in writer". + + +Ð˜Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² nginx 1.19.0 26.05.2020 + + *) Добавление: проверка клиентÑких Ñертификатов Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ OCSP. + + *) ИÑправление: при работе Ñ gRPC-бÑкендами могли возникать ошибки + "upstream sent frame for closed stream". + + *) ИÑправление: OCSP stapling мог не работать, еÑли не была указана + директива resolver. + + *) ИÑправление: ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ñ Ð½ÐµÐºÐ¾Ñ€Ñ€ÐµÐºÑ‚Ð½Ñ‹Ð¼ HTTP/2 preface не + логгировалиÑÑŒ. + + +Ð˜Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² nginx 1.17.10 14.04.2020 + + *) Добавление: директива auth_delay. + + +Ð˜Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² nginx 1.17.9 03.03.2020 + + *) Изменение: теперь nginx не разрешает неÑколько Ñтрок "Host" в + заголовке запроÑа. + + *) ИÑправление: nginx игнорировал дополнительные Ñтроки + "Transfer-Encoding" в заголовке запроÑа. + + *) ИÑправление: утечки Ñокетов при иÑпользовании HTTP/2. + + *) ИÑправление: в рабочем процеÑÑе мог произойти segmentation fault, + еÑли иÑпользовалÑÑ OCSP stapling. + + *) ИÑправление: в модуле ngx_http_mp4_module. + + *) ИÑправление: при перенаправлении ошибок Ñ ÐºÐ¾Ð´Ð¾Ð¼ 494 Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ + директивы error_page nginx возвращал ответ Ñ ÐºÐ¾Ð´Ð¾Ð¼ 494 вмеÑто 400. + + *) ИÑправление: утечки Ñокетов при иÑпользовании подзапроÑов в модуле + njs и директивы aio. + + +Ð˜Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² nginx 1.17.8 21.01.2020 + + *) Добавление: директива grpc_pass поддерживает переменные. + + *) ИÑправление: при обработке pipelined-запроÑов по SSL-Ñоединению мог + произойти таймаут; ошибка поÑвилаÑÑŒ в 1.17.5. + + *) ИÑправление: в директиве debug_points при иÑпользовании HTTP/2. + СпаÑибо Даниилу Бондареву. + + +Ð˜Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² nginx 1.17.7 24.12.2019 + + *) ИÑправление: на Ñтарте или во Ð²Ñ€ÐµÐ¼Ñ Ð¿ÐµÑ€ÐµÐºÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ð¸ мог произойти + segmentation fault, еÑли в конфигурации иÑпользовалаÑÑŒ директива + rewrite Ñ Ð¿ÑƒÑтой Ñтрокой замены. + + *) ИÑправление: в рабочем процеÑÑе мог произойти segmentation fault, + еÑли директива break иÑпользовалаÑÑŒ ÑовмеÑтно Ñ Ð´Ð¸Ñ€ÐµÐºÑ‚Ð¸Ð²Ð¾Ð¹ alias или + директивой proxy_pass Ñ URI. + + *) ИÑправление: Ñтрока Location заголовка ответа могла Ñодержать муÑор, + еÑли URI запроÑа был изменён на URI, Ñодержащий нулевой Ñимвол. + + *) ИÑправление: при возврате перенаправлений Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ директивы + error_page запроÑÑ‹ Ñ Ñ‚ÐµÐ»Ð¾Ð¼ обрабатывалиÑÑŒ некорректно; ошибка + поÑвилаÑÑŒ в 0.7.12. + + *) ИÑправление: утечки Ñокетов при иÑпользовании HTTP/2. + + *) ИÑправление: при обработке pipelined-запроÑов по SSL-Ñоединению мог + произойти таймаут; ошибка поÑвилаÑÑŒ в 1.17.5. + + *) ИÑправление: в модуле ngx_http_dav_module. + + +Ð˜Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² nginx 1.17.6 19.11.2019 + + *) Добавление: переменные $proxy_protocol_server_addr и + $proxy_protocol_server_port. + + *) Добавление: директива limit_conn_dry_run. + + *) Добавление: переменные $limit_req_status и $limit_conn_status. + + +Ð˜Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² nginx 1.17.5 22.10.2019 + + *) Добавление: теперь nginx иÑпользует вызов ioctl(FIONREAD), еÑли он + доÑтупен, чтобы избежать Ñ‡Ñ‚ÐµÐ½Ð¸Ñ Ð¸Ð· быÑтрого ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ð² течение + долгого времени. + + *) ИÑправление: неполные закодированные Ñимволы в конце URI запроÑа + игнорировалиÑÑŒ. + + *) ИÑправление: "/." и "/.." в конце URI запроÑа не нормализовывалиÑÑŒ. + + *) ИÑправление: в директиве merge_slashes. + + *) ИÑправление: в директиве ignore_invalid_headers. + СпаÑибо Alan Kemp. + + *) ИÑправление: nginx не ÑобиралÑÑ Ñ MinGW-w64 gcc 8.1 и новее. + + +Ð˜Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² nginx 1.17.4 24.09.2019 + + *) Изменение: улучшено детектирование некорректного Ð¿Ð¾Ð²ÐµÐ´ÐµÐ½Ð¸Ñ ÐºÐ»Ð¸ÐµÐ½Ñ‚Ð¾Ð² в + HTTP/2. + + *) Изменение: в обработке непрочитанного тела запроÑа при возврате + ошибок в HTTP/2. + + *) ИÑправление: директива worker_shutdown_timeout могла не работать при + иÑпользовании HTTP/2. + + *) ИÑправление: при иÑпользовании HTTP/2 и директивы + proxy_request_buffering в рабочем процеÑÑе мог произойти segmentation + fault. + + *) ИÑправление: на Windows при иÑпользовании SSL уровень запиÑи в лог + ошибки ECONNABORTED был "crit" вмеÑто "error". + + *) ИÑправление: nginx игнорировал лишние данные при иÑпользовании + chunked transfer encoding. + + *) ИÑправление: еÑли иÑпользовалаÑÑŒ директива return и при чтении тела + запроÑа возникала ошибка, nginx вÑегда возвращал ошибку 500. + + *) ИÑправление: в обработке ошибок Ð²Ñ‹Ð´ÐµÐ»ÐµÐ½Ð¸Ñ Ð¿Ð°Ð¼Ñти. + + +Ð˜Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² nginx 1.17.3 13.08.2019 + + *) БезопаÑноÑть: при иÑпользовании HTTP/2 клиент мог вызвать чрезмерное + потребление памÑти и реÑурÑов процеÑÑора (CVE-2019-9511, + CVE-2019-9513, CVE-2019-9516). + + *) ИÑправление: при иÑпользовании ÑÐ¶Ð°Ñ‚Ð¸Ñ Ð² логах могли поÑвлÑтьÑÑ + ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ "zero size buf"; ошибка поÑвилаÑÑŒ в 1.17.2. + + *) ИÑправление: при иÑпользовании директивы resolver в SMTP + прокÑи-Ñервере в рабочем процеÑÑе мог произойти segmentation fault. + + +Ð˜Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² nginx 1.17.2 23.07.2019 + + *) Изменение: Ð¼Ð¸Ð½Ð¸Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ Ð¿Ð¾Ð´Ð´ÐµÑ€Ð¶Ð¸Ð²Ð°ÐµÐ¼Ð°Ñ Ð²ÐµÑ€ÑÐ¸Ñ zlib - 1.2.0.4. + СпаÑибо Илье Леошкевичу. + + *) Изменение: метод $r->internal_redirect() вÑтроенного перла теперь + ожидает закодированный URI. + + *) Добавление: теперь Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ метода $r->internal_redirect() + вÑтроенного перла можно перейти в именованный location. + + *) ИÑправление: в обработке ошибок во вÑтроенном перле. + + *) ИÑправление: на Ñтарте или во Ð²Ñ€ÐµÐ¼Ñ Ð¿ÐµÑ€ÐµÐºÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ð¸ мог произойти + segmentation fault, еÑли в конфигурации иÑпользовалоÑÑŒ значение hash + bucket size больше 64 килобайт. + + *) ИÑправление: при иÑпользовании методов обработки Ñоединений select, + poll и /dev/poll nginx мог нагружать процеÑÑор во Ð²Ñ€ÐµÐ¼Ñ + небуферизованного прокÑÐ¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¸ при прокÑировании + WebSocket-Ñоединений. + + *) ИÑправление: в модуле ngx_http_xslt_filter_module. + + *) ИÑправление: в модуле ngx_http_ssi_filter_module. + + +Ð˜Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² nginx 1.17.1 25.06.2019 + + *) Добавление: директива limit_req_dry_run. + + *) Добавление: при иÑпользовании директивы hash в блоке upstream пуÑтой + ключ Ñ…ÑÑˆÐ¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ñ‚ÐµÐ¿ÐµÑ€ÑŒ приводит к переключению на round-robin + баланÑировку. + СпаÑибо Niklas Keller. + + *) ИÑправление: в рабочем процеÑÑе мог произойти segmentation fault, + еÑли иÑпользовалоÑÑŒ кÑширование и директива image_filter, а ошибки Ñ + кодом 415 перенаправлÑлиÑÑŒ Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ директивы error_page; ошибка + поÑвилаÑÑŒ в 1.11.10. + + *) ИÑправление: в рабочем процеÑÑе мог произойти segmentation fault, + еÑли иÑпользовалÑÑ Ð²Ñтроенный перл; ошибка поÑвилаÑÑŒ в 1.7.3. + + +Ð˜Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² nginx 1.17.0 21.05.2019 + + *) Добавление: директивы limit_rate и limit_rate_after поддерживают + переменные. + + *) Добавление: директивы proxy_upload_rate и proxy_download_rate в + модуле stream поддерживают переменные. + + *) Изменение: Ð¼Ð¸Ð½Ð¸Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ Ð¿Ð¾Ð´Ð´ÐµÑ€Ð¶Ð¸Ð²Ð°ÐµÐ¼Ð°Ñ Ð²ÐµÑ€ÑÐ¸Ñ OpenSSL - 0.9.8. + + *) Изменение: теперь postpone-фильтр ÑобираетÑÑ Ð²Ñегда. + + *) ИÑправление: директива include не работала в блоках if и + limit_except. + + *) ИÑправление: в обработке byte ranges. + + +Ð˜Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² nginx 1.15.12 16.04.2019 + + *) ИÑправление: в рабочем процеÑÑе мог произойти segmentation fault, + еÑли в директивах ssl_certificate или ssl_certificate_key + иÑпользовалиÑÑŒ переменные и был включён OCSP stapling. + + +Ð˜Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² nginx 1.15.11 09.04.2019 + + *) ИÑправление: в директиве ssl_stapling_file на Windows. + + +Ð˜Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² nginx 1.15.10 26.03.2019 + + *) Изменение: теперь при иÑпользовании имени хоÑта в директиве listen + nginx Ñоздаёт listen-Ñокеты Ð´Ð»Ñ Ð²Ñех адреÑов, ÑоответÑтвующих Ñтому + имени (ранее иÑпользовалÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ первый адреÑ). + + *) Добавление: диапазоны портов в директиве listen. + + *) Добавление: возможноÑть загрузки SSL-Ñертификатов и Ñекретных ключей + из переменных. + + *) Изменение: Ð¿ÐµÑ€ÐµÐ¼ÐµÐ½Ð½Ð°Ñ $ssl_server_name могла быть пуÑтой при + иÑпользовании OpenSSL 1.1.1. + + *) ИÑправление: nginx/Windows не ÑобиралÑÑ Ñ Visual Studio 2015 и новее; + ошибка поÑвилаÑÑŒ в 1.15.9. + + +Ð˜Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² nginx 1.15.9 26.02.2019 + + *) Добавление: директивы ssl_certificate и ssl_certificate_key + поддерживают переменные. + + *) Добавление: метод poll теперь доÑтупен на Windows при иÑпользовании + Windows Vista и новее. + + *) ИÑправление: еÑли при иÑпользовании метода select на Windows + проиÑходила ошибка при уÑтановлении ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ñ Ð±Ñкендом, nginx + ожидал иÑÑ‚ÐµÑ‡ÐµÐ½Ð¸Ñ Ñ‚Ð°Ð¹Ð¼Ð°ÑƒÑ‚Ð° на уÑтановление ÑоединениÑ. + + *) ИÑправление: директивы proxy_upload_rate и proxy_download_rate в + модуле stream работали некорректно при прокÑировании UDP-пакетов. + + +Ð˜Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² nginx 1.15.8 25.12.2018 + + *) Добавление: Ð¿ÐµÑ€ÐµÐ¼ÐµÐ½Ð½Ð°Ñ $upstream_bytes_sent. + СпаÑибо Piotr Sikora. + + *) Добавление: новые директивы в Ñкриптах подÑветки ÑинтакÑиÑа Ð´Ð»Ñ vim. + СпаÑибо Геннадию Махомеду. + + *) ИÑправление: в директиве proxy_cache_background_update. + + *) ИÑправление: в директиве geo при иÑпользовании unix domain + listen-Ñокетов. + + *) Изменение: при иÑпользовании директивы ssl_early_data Ñ OpenSSL в + логах могли поÑвлÑтьÑÑ ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ "ignoring stale global SSL error ... + bad length". + + *) ИÑправление: в nginx/Windows. + + *) ИÑправление: в модуле ngx_http_autoindex_module на 32-битных + платформах. + + +Ð˜Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² nginx 1.15.7 27.11.2018 + + *) Добавление: директива proxy_requests в модуле stream. + + *) Добавление: параметр "delay" директивы "limit_req". + СпаÑибо ВладиÑлаву Шабанову и Петру Щучкину. + + *) ИÑправление: утечки памÑти в Ñлучае ошибок при переконфигурации. + + *) ИÑправление: в переменных $upstream_response_time, + $upstream_connect_time и $upstream_header_time. + + *) ИÑправление: в рабочем процеÑÑе мог произойти segmentation fault, + еÑли иÑпользовалÑÑ Ð¼Ð¾Ð´ÑƒÐ»ÑŒ ngx_http_mp4_module на 32-битных + платформах. + + +Ð˜Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² nginx 1.15.6 06.11.2018 + + *) БезопаÑноÑть: при иÑпользовании HTTP/2 клиент мог вызвать чрезмерное + потреблению памÑти (CVE-2018-16843) и реÑурÑов процеÑÑора + (CVE-2018-16844). + + *) БезопаÑноÑть: при обработке Ñпециально Ñозданного mp4-файла модулем + ngx_http_mp4_module Ñодержимое памÑти рабочего процеÑÑа могло быть + отправлено клиенту (CVE-2018-16845). + + *) Добавление: директивы proxy_socket_keepalive, + fastcgi_socket_keepalive, grpc_socket_keepalive, + memcached_socket_keepalive, scgi_socket_keepalive и + uwsgi_socket_keepalive. + + *) ИÑправление: еÑли nginx был Ñобран Ñ OpenSSL 1.1.0, а иÑпользовалÑÑ Ñ + OpenSSL 1.1.1, протокол TLS 1.3 вÑегда был разрешён. + + *) ИÑправление: при работе Ñ gRPC-бÑкендами могло раÑходоватьÑÑ Ð±Ð¾Ð»ÑŒÑˆÐ¾Ðµ + количеÑтво памÑти. + + +Ð˜Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² nginx 1.15.5 02.10.2018 + + *) ИÑправление: при иÑпользовании OpenSSL 1.1.0h и новее в рабочем + процеÑÑе мог произойти segmentation fault; ошибка поÑвилаÑÑŒ в 1.15.4. + + *) ИÑправление: незначительных потенциальных ошибок. + + +Ð˜Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² nginx 1.15.4 25.09.2018 + + *) Добавление: теперь директиву ssl_early_data можно иÑпользовать Ñ + OpenSSL. + + *) ИÑправление: в модуле ngx_http_uwsgi_module. + СпаÑибо Chris Caputo. + + *) ИÑправление: ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ðº некоторым gRPC-бÑкендам могли не + кÑшироватьÑÑ Ð¿Ñ€Ð¸ иÑпользовании директивы keepalive. + + *) ИÑправление: при иÑпользовании директивы error_page Ð´Ð»Ñ + Ð¿ÐµÑ€ÐµÐ½Ð°Ð¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¾ÑˆÐ¸Ð±Ð¾Ðº, возникающих на ранних Ñтапах обработки + запроÑа, в чаÑтноÑти ошибок Ñ ÐºÐ¾Ð´Ð¾Ð¼ 400, могла проиÑходить утечка + Ñокетов. + + *) ИÑправление: директива return при возврате ошибок не изменÑла код + ответа, еÑли Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð±Ñ‹Ð» перенаправлен Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ директивы error_page. + + *) ИÑправление: Ñтандартные ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð¾Ð± ошибках и ответы Ð¼Ð¾Ð´ÑƒÐ»Ñ + ngx_http_autoindex_module Ñодержали атрибут bgcolor, что могло + приводить к их некорректному отображению при иÑпользовании + пользовательÑких наÑтроек цветов в браузерах. + СпаÑибо Nova DasSarma. + + *) Изменение: уровень Ð»Ð¾Ð³Ð³Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¾ÑˆÐ¸Ð±Ð¾Ðº SSL "no suitable key share" и + "no suitable signature algorithm" понижен Ñ ÑƒÑ€Ð¾Ð²Ð½Ñ crit до info. + + +Ð˜Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² nginx 1.15.3 28.08.2018 + + *) Добавление: теперь TLSv1.3 можно иÑпользовать Ñ BoringSSL. + + *) Добавление: директива ssl_early_data, ÑÐµÐ¹Ñ‡Ð°Ñ Ð´Ð¾Ñтупна при + иÑпользовании BoringSSL. + + *) Добавление: директивы keepalive_timeout и keepalive_requests в блоке + upstream. + + *) ИÑправление: модуль ngx_http_dav_module при копировании файла поверх + ÑущеÑтвующего файла Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ метода COPY не обнулÑл целевой файл. + + *) ИÑправление: модуль ngx_http_dav_module при перемещении файла между + файловыми ÑиÑтемами Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ метода MOVE уÑтанавливал нулевые права + доÑтупа на результирующий файл и не ÑохранÑл Ð²Ñ€ÐµÐ¼Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ñ„Ð°Ð¹Ð»Ð°. + + *) ИÑправление: модуль ngx_http_dav_module при копировании файла Ñ + помощью метода COPY Ð´Ð»Ñ Ñ€ÐµÐ·ÑƒÐ»ÑŒÑ‚Ð¸Ñ€ÑƒÑŽÑ‰ÐµÐ³Ð¾ файла иÑпользовал права + доÑтупа по умолчанию. + + *) Изменение: некоторые клиенты могли не работать при иÑпользовании + HTTP/2; ошибка поÑвилаÑÑŒ в 1.13.5. + + *) ИÑправление: nginx не ÑобиралÑÑ Ñ LibreSSL 2.8.0. + + +Ð˜Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² nginx 1.15.2 24.07.2018 + + *) Добавление: Ð¿ÐµÑ€ÐµÐ¼ÐµÐ½Ð½Ð°Ñ $ssl_preread_protocol в модуле + ngx_stream_ssl_preread_module. + + *) Добавление: теперь при иÑпользовании директивы + reset_timedout_connection nginx ÑбраÑывает ÑоединениÑ, закрываемые Ñ + кодом 444. + + *) Изменение: уровень Ð»Ð¾Ð³Ð³Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¾ÑˆÐ¸Ð±Ð¾Ðº SSL "http request", "https + proxy request", "unsupported protocol" и "version too low" понижен Ñ + ÑƒÑ€Ð¾Ð²Ð½Ñ crit до info. + + *) ИÑправление: запроÑÑ‹ к DNS-Ñерверу не отправлÑлиÑÑŒ повторно, еÑли при + первой попытке отправки проиÑходила ошибка. + + *) ИÑправление: параметр reuseport директивы listen игнорировалÑÑ, еÑли + количеÑтво рабочих процеÑÑов было задано поÑле директивы listen. + + *) ИÑправление: при иÑпользовании OpenSSL 1.1.0 и новее директиву + ssl_prefer_server_ciphers Ð½ÐµÐ»ÑŒÐ·Ñ Ð±Ñ‹Ð»Ð¾ выключить в виртуальном + Ñервере, еÑли она была включена в Ñервере по умолчанию. + + *) ИÑправление: повторное иÑпользование SSL-ÑеÑÑий к бÑкендам не + работало Ñ Ð¿Ñ€Ð¾Ñ‚Ð¾ÐºÐ¾Ð»Ð¾Ð¼ TLS 1.3. + + +Ð˜Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² nginx 1.15.1 03.07.2018 + + *) Добавление: директива random в блоке upstream. + + *) Добавление: улучшена производительноÑть при иÑпользовании директив + hash и ip_hash ÑовмеÑтно Ñ Ð´Ð¸Ñ€ÐµÐºÑ‚Ð¸Ð²Ð¾Ð¹ zone. + + *) Добавление: параметр reuseport директивы listen теперь иÑпользует + SO_REUSEPORT_LB на FreeBSD 12. + + *) ИÑправление: HTTP/2 server push не работал, еÑли SSL терминировалÑÑ + прокÑи-Ñервером перед nginx'ом. + + *) ИÑправление: директива tcp_nopush вÑегда иÑпользовалаÑÑŒ Ð´Ð»Ñ + Ñоединений к бÑкендам. + + *) ИÑправление: при отправке Ñохранённого на диÑк тела запроÑа на + gRPC-бÑкенд могли возникать ошибки. + + +Ð˜Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² nginx 1.15.0 05.06.2018 + + *) Изменение: директива "ssl" теперь ÑчитаетÑÑ ÑƒÑтаревшей; вмеÑто неё + Ñледует иÑпользовать параметр ssl директивы listen. + + *) Изменение: теперь при иÑпользовании директивы listen Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð¾Ð¼ ssl + nginx определÑет отÑутÑтвие SSL-Ñертификатов при теÑтировании + конфигурации. + + *) Добавление: теперь модуль stream умеет обрабатывать неÑколько + входÑщих UDP-пакетов от клиента в рамках одной ÑеÑÑии. + + *) ИÑправление: в директиве proxy_cache_valid можно было указать + некорректный код ответа. + + *) ИÑправление: nginx не ÑобиралÑÑ gcc 8.1. + + *) ИÑправление: логгирование в syslog оÑтанавливалоÑÑŒ при изменении + локального IP-адреÑа. + + *) ИÑправление: nginx не ÑобиралÑÑ ÐºÐ¾Ð¼Ð¿Ð¸Ð»Ñтором clang, еÑли был + уÑтановлен CUDA SDK; ошибка поÑвилаÑÑŒ в 1.13.8. + + *) ИÑправление: при иÑпользовании unix domain listen-Ñокетов на FreeBSD + в процеÑÑе Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð¸ÑполнÑемого файла в логе могли поÑвлÑтьÑÑ + ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ "getsockopt(TCP_FASTOPEN) ... failed". + + *) ИÑправление: nginx не ÑобиралÑÑ Ð½Ð° Fedora 28 Linux. + + *) ИÑправление: при иÑпользовании директивы limit_req Ð·Ð°Ð´Ð°Ð½Ð½Ð°Ñ ÑкороÑть + обработки запроÑов могла не ÑоблюдатьÑÑ. + + *) ИÑправление: в обработке адреÑов клиентов при иÑпользовании unix + domain listen-Ñокетов Ð´Ð»Ñ Ñ€Ð°Ð±Ð¾Ñ‚Ñ‹ Ñ Ð´Ð°Ñ‚Ð°Ð³Ñ€Ð°Ð¼Ð¼Ð°Ð¼Ð¸ на Linux. + + *) ИÑправление: в обработке ошибок Ð²Ñ‹Ð´ÐµÐ»ÐµÐ½Ð¸Ñ Ð¿Ð°Ð¼Ñти. + + +Ð˜Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² nginx 1.13.12 10.04.2018 + + *) ИÑправление: при возврате большого ответа ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ñ gRPC-бÑкендами + могли неожиданно закрыватьÑÑ. + + +Ð˜Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² nginx 1.13.11 03.04.2018 + + *) Добавление: параметр proxy_protocol директивы listen теперь + поддерживает протокол PROXY верÑии 2. + + *) ИÑправление: nginx не ÑобиралÑÑ Ñ OpenSSL 1.1.1 ÑтатичеÑки на Linux. + + *) ИÑправление: в параметрах http_404, http_500 и им подобных директивы + proxy_next_upstream. + + +Ð˜Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² nginx 1.13.10 20.03.2018 + + *) Добавление: теперь параметр set в SSI-директиве include позволÑет + ÑохранÑть в переменную любые ответы; макÑимальный размер ответа + задаётÑÑ Ð´Ð¸Ñ€ÐµÐºÑ‚Ð¸Ð²Ð¾Ð¹ subrequest_output_buffer_size. + + *) Добавление: теперь nginx иÑпользует вызов + clock_gettime(CLOCK_MONOTONIC), еÑли он доÑтупен, что позволÑет + избежать некорректного ÑÑ€Ð°Ð±Ð°Ñ‚Ñ‹Ð²Ð°Ð½Ð¸Ñ Ñ‚Ð°Ð¹Ð¼Ð°ÑƒÑ‚Ð¾Ð² при изменениÑÑ… + ÑиÑтемного времени. + + *) Добавление: параметр "escape=none" директивы log_format. + СпаÑибо Johannes Baiter и Calin Don. + + *) Добавление: Ð¿ÐµÑ€ÐµÐ¼ÐµÐ½Ð½Ð°Ñ $ssl_preread_alpn_protocols в модуле + ngx_stream_ssl_preread_module. + + *) Добавление: модуль ngx_http_grpc_module. + + *) ИÑправление: в обработке ошибок Ð²Ñ‹Ð´ÐµÐ»ÐµÐ½Ð¸Ñ Ð¿Ð°Ð¼Ñти в директиве geo. + + *) ИÑправление: при иÑпользовании переменных в директиве + auth_basic_user_file в лог мог выводитьÑÑ Ñимвол '\0'. + СпаÑибо Вадиму Филимонову. + + +Ð˜Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² nginx 1.13.9 20.02.2018 + + *) Добавление: поддержка HTTP/2 server push; директивы http2_push и + http2_push_preload. + + *) ИÑправление: при иÑпользовании кÑша в логах могли поÑвлÑтьÑÑ + ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ "header already sent"; ошибка поÑвилаÑÑŒ в 1.9.13. + + *) ИÑправление: при иÑпользовании директивы ssl_verify_client в рабочем + процеÑÑе мог произойти segmentation fault, еÑли в виртуальном Ñервере + не был указан SSL-Ñертификат. + + *) ИÑправление: в модуле ngx_http_v2_module. + + *) ИÑправление: в модуле ngx_http_dav_module. + + +Ð˜Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² nginx 1.13.8 26.12.2017 + + *) Добавление: теперь при иÑпользовании параметра transparent директив + proxy_bind, fastcgi_bind, memcached_bind, scgi_bind и uwsgi_bind + nginx автоматичеÑки ÑохранÑет capability CAP_NET_RAW в рабочих + процеÑÑах. + + *) Добавление: ÑƒÐ»ÑƒÑ‡ÑˆÐµÐ½Ð¸Ñ Ð² определении размера Ñтроки кÑша процеÑÑора. + СпаÑибо Debayan Ghosh. + + *) Добавление: новые директивы в Ñкриптах подÑветки ÑинтакÑиÑа Ð´Ð»Ñ vim. + СпаÑибо Геннадию Махомеду. + + *) ИÑправление: процедура Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð¸ÑполнÑемого файла не работала, + еÑли поÑле Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð¸Ñ Ñ€Ð¾Ð´Ð¸Ñ‚ÐµÐ»ÑŒÑкого процеÑÑа новым родительÑким + процеÑÑом nginx'а ÑтановилÑÑ Ð¿Ñ€Ð¾Ñ†ÐµÑÑ Ñ PID, отличным от 1. + + *) ИÑправление: модуль ngx_http_autoindex_module неправильно обрабатывал + запроÑÑ‹ Ñ Ñ‚ÐµÐ»Ð¾Ð¼. + + *) ИÑправление: в директиве proxy_limit_rate при иÑпользовании Ñ + директивой keepalive. + + *) ИÑправление: при иÑпользовании "proxy_buffering off" чаÑть ответа + могла буферизироватьÑÑ, еÑли клиентÑкое Ñоединение иÑпользовало SSL. + СпаÑибо Patryk Lesiewicz. + + *) ИÑправление: в директиве proxy_cache_background_update. + + *) ИÑправление: переменную вида "${name}" Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼ в фигурных Ñкобках + Ð½ÐµÐ»ÑŒÐ·Ñ Ð±Ñ‹Ð»Ð¾ иÑпользовать в начале параметра не заключив веÑÑŒ параметр + в кавычки. + + +Ð˜Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² nginx 1.13.7 21.11.2017 + + *) ИÑправление: в переменной $upstream_status. + + *) ИÑправление: в рабочем процеÑÑе мог произойти segmentation fault, + еÑли бÑкенд возвращал ответ "101 Switching Protocols" на подзапроÑ. + + *) ИÑправление: еÑли при переконфигурации изменÑлÑÑ Ñ€Ð°Ð·Ð¼ÐµÑ€ зоны + разделÑемой памÑти и Ð¿ÐµÑ€ÐµÐºÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ Ð·Ð°Ð²ÐµÑ€ÑˆÐ°Ð»Ð°ÑÑŒ неудачно, то в + главном процеÑÑе проиÑходил segmentation fault. + + *) ИÑправление: в модуле ngx_http_fastcgi_module. + + *) ИÑправление: nginx возвращал ошибку 500, еÑли в директиве + xslt_stylesheet были заданы параметры без иÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¿ÐµÑ€ÐµÐ¼ÐµÐ½Ð½Ñ‹Ñ…. + + *) Изменение: при иÑпользовании варианта библиотеки zlib от Intel в лог + пиÑалиÑÑŒ ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ "gzip filter failed to use preallocated memory". + + *) ИÑправление: директива worker_shutdown_timeout не работала при + иÑпользовании почтового прокÑи-Ñервера и при прокÑировании + WebSocket-Ñоединений. + + +Ð˜Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² nginx 1.13.6 10.10.2017 + + *) ИÑправление: при иÑпользовании директивы ssl_preread в модуле stream + не работало переключение на Ñледующий бÑкенд. + + *) ИÑправление: в модуле ngx_http_v2_module. + СпаÑибо Piotr Sikora. + + *) ИÑправление: nginx не поддерживал даты поÑле 2038 года на 32-битных + платформах Ñ 64-битным time_t. + + *) ИÑправление: в обработке дат до 1970 года и поÑле 10000 года. + + *) ИÑправление: в модуле stream таймауты Ð¾Ð¶Ð¸Ð´Ð°Ð½Ð¸Ñ UDP-пакетов от + бÑкендов не логгировалиÑÑŒ или логгировалиÑÑŒ на уровне info вмеÑто + error. + + *) ИÑправление: при иÑпользовании HTTP/2 nginx мог вернуть ошибку 400, + не указав в логе причину. + + *) ИÑправление: в обработке повреждённых файлов кÑша. + + *) ИÑправление: при кÑшировании ошибок, перехваченных error_page, не + учитывалиÑÑŒ заголовки ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ ÐºÑшированием. + + *) ИÑправление: при иÑпользовании HTTP/2 тело запроÑа могло быть + повреждено. + + *) ИÑправление: в обработке адреÑов клиентов при иÑпользовании unix + domain Ñокетов. + + *) ИÑправление: при иÑпользовании директивы "hash ... consistent" в + блоке upstream nginx нагружал процеÑÑор, еÑли иÑпользовалиÑÑŒ большие + веÑа и вÑе или почти вÑе бÑкенды были недоÑтупны. + + +Ð˜Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² nginx 1.13.5 05.09.2017 + + *) Добавление: Ð¿ÐµÑ€ÐµÐ¼ÐµÐ½Ð½Ð°Ñ $ssl_client_escaped_cert. + + *) ИÑправление: директива ssl_session_ticket_key и параметр include + директивы geo не работали на Windows. + + *) ИÑправление: на 32-битных платформах при запроÑе более 4 гигабайт Ñ + помощью неÑкольких диапазонов возвращалаÑÑŒ Ð½ÐµÐºÐ¾Ñ€Ñ€ÐµÐºÑ‚Ð½Ð°Ñ Ð´Ð»Ð¸Ð½Ð° ответа. + + *) ИÑправление: директива "expires modified" и обработка Ñтроки If-Range + заголовка запроÑа не учитывали Ð²Ñ€ÐµÐ¼Ñ Ð¿Ð¾Ñледнего Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¾Ñ‚Ð²ÐµÑ‚Ð°, + еÑли иÑпользовалоÑÑŒ прокÑирование без кÑшированиÑ. + + +Ð˜Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² nginx 1.13.4 08.08.2017 + + *) Добавление: модуль ngx_http_mirror_module. + + *) ИÑправление: клиентÑкие ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ð¼Ð¾Ð³Ð»Ð¸ ÑбраÑыватьÑÑ Ð¿Ñ€Ð¸ + теÑтировании конфигурации, еÑли иÑпользовалÑÑ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€ reuseport + директивы listen на Linux. + + *) ИÑправление: тело запроÑа могло быть недоÑтупно в подзапроÑах, еÑли + оно было Ñохранено в файл и иÑпользовалоÑÑŒ прокÑирование. + + *) ИÑправление: очиÑтка кÑша по max_size не работала на Windows. + + *) ИÑправление: любое выделение разделÑемой памÑти на Windows требовало + 4096 байт памÑти. + + *) ИÑправление: при иÑпользовании директивы zone в блоке upstream на + Windows рабочий процеÑÑ Ð¼Ð¾Ð³ завершатьÑÑ Ð°Ð²Ð°Ñ€Ð¸Ð¹Ð½Ð¾. + + +Ð˜Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² nginx 1.13.3 11.07.2017 + + *) БезопаÑноÑть: Ñпециально Ñозданный Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð¼Ð¾Ð³ вызвать целочиÑленное + переполнение в range-фильтре и поÑледующую некорректную обработку + запрошенных диапазонов, что потенциально могло привеÑти к утечке + конфиденциальной информации (CVE-2017-7529). + + +Ð˜Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² nginx 1.13.2 27.06.2017 + + *) Изменение: теперь при запроÑе диапазона, начинающегоÑÑ Ñ 0, из + пуÑтого файла nginx возвращает ответ 200 вмеÑто 416. + + *) Добавление: директива add_trailer. + СпаÑибо Piotr Sikora. + + *) ИÑправление: nginx не ÑобиралÑÑ Ð¿Ð¾Ð´ Cygwin и NetBSD; ошибка поÑвилаÑÑŒ + в 1.13.0. + + *) ИÑправление: nginx не ÑобиралÑÑ Ð¿Ð¾Ð´ MSYS2 / MinGW 64-bit. + СпаÑибо Orgad Shaneh. + + *) ИÑправление: при иÑпользовании SSI Ñ Ð±Ð¾Ð»ÑŒÑˆÐ¸Ð¼ количеÑтвом подзапроÑов + и proxy_pass Ñ Ð¿ÐµÑ€ÐµÐ¼ÐµÐ½Ð½Ñ‹Ð¼Ð¸ в рабочем процеÑÑе мог произойти + segmentation fault. + + *) ИÑправление: в модуле ngx_http_v2_module. + СпаÑибо Piotr Sikora. + + +Ð˜Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² nginx 1.13.1 30.05.2017 + + *) Добавление: теперь в качеÑтве параметра директивы set_real_ip_from + можно указывать Ð¸Ð¼Ñ Ñ…Ð¾Ñта. + + *) Добавление: ÑƒÐ»ÑƒÑ‡ÑˆÐµÐ½Ð¸Ñ Ð² Ñкриптах подÑветки ÑинтакÑиÑа Ð´Ð»Ñ vim. + + *) Добавление: директива worker_cpu_affinity теперь работает на + DragonFly BSD. + СпаÑибо Sepherosa Ziehau. + + *) ИÑправление: SSL renegotiation в ÑоединениÑÑ… к бÑкендам не работал + при иÑпользовании OpenSSL до 1.1.0. + + *) Изменение: nginx не ÑобиралÑÑ Ñ Oracle Developer Studio 12.5. + + *) Изменение: теперь cache manager пропуÑкает заблокированные запиÑи при + очиÑтке кÑша по max_size. + + *) ИÑправление: клиентÑкие SSL-ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ñразу закрывалиÑÑŒ, еÑли + иÑпользовалÑÑ Ð¾Ñ‚Ð»Ð¾Ð¶ÐµÐ½Ð½Ñ‹Ð¹ accept и параметр proxy_protocol директивы + listen. + + *) ИÑправление: в директиве proxy_cache_background_update. + + *) Изменение: теперь директива tcp_nodelay уÑтанавливает опцию + TCP_NODELAY перед SSL handshake. + + +Ð˜Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² nginx 1.13.0 25.04.2017 + + *) Изменение: теперь SSL renegotiation допуÑкаетÑÑ Ð² ÑоединениÑÑ… к + бÑкендам. + + *) Добавление: параметры rcvbuf и sndbuf директив listen в почтовом + прокÑи-Ñервере и модуле stream. + + *) Добавление: директивы return и error_page теперь могут иÑпользоватьÑÑ + Ð´Ð»Ñ Ð²Ð¾Ð·Ð²Ñ€Ð°Ñ‚Ð° перенаправлений Ñ ÐºÐ¾Ð´Ð¾Ð¼ 308. + СпаÑибо Simon Leblanc. + + *) Добавление: параметр TLSv1.3 в директиве ssl_protocols. + + *) Добавление: при логгировании Ñигналов теперь указываетÑÑ PID + отправившего Ñигнал процеÑÑа. + + *) ИÑправление: в обработке ошибок Ð²Ñ‹Ð´ÐµÐ»ÐµÐ½Ð¸Ñ Ð¿Ð°Ð¼Ñти. + + *) ИÑправление: еÑли Ñервер в модуле stream Ñлушал на wildcard-адреÑе, + иÑходÑщий Ð°Ð´Ñ€ÐµÑ Ð¾Ñ‚Ð²ÐµÑ‚Ð½Ð¾Ð³Ð¾ UDP-пакета мог отличатьÑÑ Ð¾Ñ‚ адреÑа + Ð½Ð°Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð¸Ñходного пакета. + + +Ð˜Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² nginx 1.11.13 04.04.2017 + + *) Добавление: параметр http_429 в директивах proxy_next_upstream, + fastcgi_next_upstream, scgi_next_upstream и uwsgi_next_upstream. + СпаÑибо Piotr Sikora. + + *) ИÑправление: в обработке ошибок Ð²Ñ‹Ð´ÐµÐ»ÐµÐ½Ð¸Ñ Ð¿Ð°Ð¼Ñти. + + *) ИÑправление: при иÑпользовании директив sendfile и timer_resolution + на Linux запроÑÑ‹ могли завиÑать. + + *) ИÑправление: при иÑпользовании Ñ Ð¿Ð¾Ð´Ð·Ð°Ð¿Ñ€Ð¾Ñами директив sendfile и + aio_write запроÑÑ‹ могли завиÑать. + + *) ИÑправление: в модуле ngx_http_v2_module. + СпаÑибо Piotr Sikora. + + *) ИÑправление: при иÑпользовании HTTP/2 в рабочем процеÑÑе мог + произойти segmentation fault. + + *) ИÑправление: запроÑÑ‹ могли завиÑать при иÑпользовании Ñ Ð¿Ð¾Ð´Ð·Ð°Ð¿Ñ€Ð¾Ñами + директив limit_rate, sendfile_max_chunk, limit_req или метода + $r->sleep() вÑтроенного перла. + + *) ИÑправление: в модуле ngx_http_slice_module. + + +Ð˜Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² nginx 1.11.12 24.03.2017 + + *) ИÑправление: nginx мог нагружать процеÑÑор; ошибка поÑвилаÑÑŒ в + 1.11.11. + + +Ð˜Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² nginx 1.11.11 21.03.2017 + + *) Добавление: директива worker_shutdown_timeout. + + *) Добавление: ÑƒÐ»ÑƒÑ‡ÑˆÐµÐ½Ð¸Ñ Ð² Ñкриптах подÑветки ÑинтакÑиÑа Ð´Ð»Ñ vim. + СпаÑибо Wei-Ko Kao. + + *) ИÑправление: при попытке уÑтановить переменную $limit_rate в пуÑтую + Ñтроку в рабочем процеÑÑе мог произойти segmentation fault. + + *) ИÑправление: директивы proxy_cache_background_update, + fastcgi_cache_background_update, scgi_cache_background_update и + uwsgi_cache_background_update могли работать некорректно, еÑли + иÑпользовалаÑÑŒ директива if. + + *) ИÑправление: в рабочем процеÑÑе мог произойти segmentation fault, + еÑли количеÑтво large_client_header_buffers в виртуальном Ñервере + отличалоÑÑŒ от такового в Ñервере по умолчанию. + + *) ИÑправление: в почтовом прокÑи-Ñервере. + + +Ð˜Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² nginx 1.11.10 14.02.2017 + + *) Изменение: формат заголовка кÑша был изменен, ранее закÑшированные + ответы будут загружены заново. + + *) Добавление: поддержка раÑширений stale-while-revalidate и + stale-if-error в Ñтроке "Cache-Control" в заголовке ответа бÑкенда. + + *) Добавление: директивы proxy_cache_background_update, + fastcgi_cache_background_update, scgi_cache_background_update и + uwsgi_cache_background_update. + + *) Добавление: теперь nginx может кÑшировать ответы Ñо Ñтрокой Vary + заголовка длиной до 128 Ñимволов (вмеÑто 42 Ñимволов в предыдущих + верÑиÑÑ…). + + *) Добавление: параметр build директивы server_tokens. + СпаÑибо Tom Thorogood. + + *) ИÑправление: при обработке запроÑов Ñо Ñтрокой "Expect: 100-continue" + в заголовке запроÑа в логах могли поÑвлÑтьÑÑ ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ "[crit] + SSL_write() failed". + + *) ИÑправление: модуль ngx_http_slice_module не работал в именованных + location'ах. + + *) ИÑправление: при иÑпользовании AIO поÑле Ð¿ÐµÑ€ÐµÐ½Ð°Ð¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð·Ð°Ð¿Ñ€Ð¾Ñа Ñ + помощью X-Accel-Redirect в рабочем процеÑÑе мог произойти + segmentation fault. + + *) ИÑправление: уменьшено потребление памÑти Ð´Ð»Ñ Ð´Ð¾Ð»Ð³Ð¾Ð¶Ð¸Ð²ÑƒÑ‰Ð¸Ñ… запроÑов, + иÑпользующих Ñжатие. + + +Ð˜Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² nginx 1.11.9 24.01.2017 + + *) ИÑправление: при иÑпользовании Ð¼Ð¾Ð´ÑƒÐ»Ñ stream nginx мог нагружать + процеÑÑор; ошибка поÑвилаÑÑŒ в 1.11.5. + + *) ИÑправление: метод аутентификации EXTERNAL в почтовом прокÑи-Ñервере + можно было иÑпользовать, даже еÑли он не был разрешён в конфигурации. + + *) ИÑправление: при иÑпользовании директивы ssl_verify_client Ð¼Ð¾Ð´ÑƒÐ»Ñ + stream в рабочем процеÑÑе мог произойти segmentation fault. + + *) ИÑправление: директива ssl_verify_client Ð¼Ð¾Ð´ÑƒÐ»Ñ stream могла не + работать. + + *) ИÑправление: при иÑчерпании рабочим процеÑÑом Ñвободных Ñоединений + keepalive-ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ð¼Ð¾Ð³Ð»Ð¸ закрыватьÑÑ Ð¸Ð·Ð»Ð¸ÑˆÐ½Ðµ агреÑÑивно. + СпаÑибо Joel Cunningham. + + *) ИÑправление: при иÑпользовании директивы sendfile на FreeBSD и macOS + мог возвращатьÑÑ Ð½ÐµÐºÐ¾Ñ€Ñ€ÐµÐºÑ‚Ð½Ñ‹Ð¹ ответ; ошибка поÑвилаÑÑŒ в 1.7.8. + + *) ИÑправление: при иÑпользовании директивы aio_write ответ мог + ÑохранÑтьÑÑ Ð² кÑш не полноÑтью. + + *) ИÑправление: при иÑпользовании директивы aio_write могла проиÑходить + утечка Ñокетов. + + +Ð˜Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² nginx 1.11.8 27.12.2016 + + *) Добавление: директива absolute_redirect. + + *) Добавление: параметр escape директивы log_format. + + *) Добавление: проверка клиентÑких SSL-Ñертификатов в модуле stream. + + *) Добавление: директива ssl_session_ticket_key поддерживает шифрование + TLS session tickets Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ AES256 при иÑпользовании Ñ 80-байтными + ключами. + + *) Добавление: поддержка vim-commentary в Ñкриптах Ð´Ð»Ñ vim. + СпаÑибо Armin Grodon. + + *) ИÑправление: рекурÑÐ¸Ñ Ð¿Ñ€Ð¸ получении значений переменных не + ограничивалаÑÑŒ. + + *) ИÑправление: в модуле ngx_stream_ssl_preread_module. + + *) ИÑправление: еÑли Ñервер, опиÑанный в блоке upstream в модуле stream, + был признан неработающим, то поÑле иÑÑ‚ÐµÑ‡ÐµÐ½Ð¸Ñ fail_timeout он + признавалÑÑ Ñ€Ð°Ð±Ð¾Ñ‚Ð°ÑŽÑ‰Ð¸Ð¼ только поÑле Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð¸Ñ Ñ‚ÐµÑтового ÑоединениÑ; + теперь доÑтаточно, чтобы Ñоединение было уÑпешно уÑтановлено. + + *) ИÑправление: nginx/Windows не ÑобиралÑÑ Ñ 64-битным Visual Studio. + + *) ИÑправление: nginx/Windows не ÑобиралÑÑ Ñ OpenSSL 1.1.0. + + +Ð˜Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² nginx 1.11.7 13.12.2016 + + *) Изменение: Ð¿ÐµÑ€ÐµÐ¼ÐµÐ½Ð½Ð°Ñ $ssl_client_verify теперь в Ñлучае ошибки + проверки клиентÑкого Ñертификата Ñодержит Ñтроку Ñ Ð¾Ð¿Ð¸Ñанием ошибки, + например, "FAILED:certificate has expired". + + *) Добавление: переменные $ssl_ciphers, $ssl_curves, + $ssl_client_v_start, $ssl_client_v_end и $ssl_client_v_remain. + + *) Добавление: параметр volatile директивы map. + + *) ИÑправление: при Ñборке динамичеÑких модулей не учитывалиÑÑŒ заданные + Ð´Ð»Ñ Ð¼Ð¾Ð´ÑƒÐ»Ñ Ð·Ð°Ð²Ð¸ÑимоÑти. + + *) ИÑправление: при иÑпользовании HTTP/2 и директив limit_req или + auth_request тело запроÑа могло быть повреждено; ошибка поÑвилаÑÑŒ в + 1.11.0. + + *) ИÑправление: при иÑпользовании HTTP/2 в рабочем процеÑÑе мог + произойти segmentation fault; ошибка поÑвилаÑÑŒ в 1.11.3. + + *) ИÑправление: в модуле ngx_http_mp4_module. + СпаÑибо Congcong Hu. + + *) ИÑправление: в модуле ngx_http_perl_module. + + +Ð˜Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² nginx 1.11.6 15.11.2016 + + *) Изменение: формат переменных $ssl_client_s_dn и $ssl_client_i_dn + изменён на ÑоответÑтвующий RFC 2253 (RFC 4514); Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð² Ñтаром + формате доÑтупны через переменные $ssl_client_s_dn_legacy и + $ssl_client_i_dn_legacy. + + *) Изменение: при Ñохранении временных файлов в каталоге кÑша они теперь + раÑполагаютÑÑ Ð½Ðµ в отдельном подкаталоге Ð´Ð»Ñ Ð²Ñ€ÐµÐ¼ÐµÐ½Ð½Ñ‹Ñ… файлов, а в + том же подкаталоге, что и ÑоответÑтвующие файлы в кÑше. + + *) Добавление: поддержка метода аутентификации EXTERNAL в почтовом + прокÑи-Ñервере. + СпаÑибо Robert Norris. + + *) Добавление: поддержка WebP в модуле ngx_http_image_filter_module. + + *) Добавление: директива proxy_method поддерживает переменные. + СпаÑибо Дмитрию Лазуркину. + + *) Добавление: директива http2_max_requests в модуле ngx_http_v2_module. + + *) Добавление: директивы proxy_cache_max_range_offset, + fastcgi_cache_max_range_offset, scgi_cache_max_range_offset и + uwsgi_cache_max_range_offset. + + *) ИÑправление: плавное завершение Ñтарых рабочих процеÑÑов могло + занимать беÑконечное Ð²Ñ€ÐµÐ¼Ñ Ð¿Ñ€Ð¸ иÑпользовании HTTP/2. + + *) ИÑправление: в модуле ngx_http_mp4_module. + + *) ИÑправление: при прокÑировании WebSocket-Ñоединений и включённом + кÑшировании в логах могли поÑвлÑтьÑÑ ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ "ignore long locked + inactive cache entry". + + *) ИÑправление: еÑли во Ð²Ñ€ÐµÐ¼Ñ SSL handshake Ñ Ð±Ñкендом проиÑходил + таймаут, nginx ничего не пиÑал в лог и возвращал ответ Ñ ÐºÐ¾Ð´Ð¾Ð¼ 502 + вмеÑто 504. + + +Ð˜Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² nginx 1.11.5 11.10.2016 + + *) Изменение: параметр configure --with-ipv6 упразднён, поддержка IPv6 + теперь ÑобираетÑÑ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡ÐµÑки. + + *) Изменение: теперь, еÑли в блоке upstream не оказалоÑÑŒ доÑтупных + Ñерверов, nginx не ÑбраÑывает ÑтатиÑтику ошибок вÑех Ñерверов, как + делал ранее, а ожидает иÑÑ‚ÐµÑ‡ÐµÐ½Ð¸Ñ fail_timeout. + + *) Добавление: модуль ngx_stream_ssl_preread_module. + + *) Добавление: директива server в блоке upstream поддерживает параметр + max_conns. + + *) Добавление: параметр configure --with-compat. + + *) Добавление: параметры manager_files, manager_threshold и + manager_sleep директив proxy_cache_path, fastcgi_cache_path, + scgi_cache_path и uwsgi_cache_path. + + *) ИÑправление: при Ñборке perl-Ð¼Ð¾Ð´ÑƒÐ»Ñ Ð½Ðµ иÑпользовалиÑÑŒ флаги, заданные + Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ параметра configure --with-ld-opt. + + *) ИÑправление: в директиве add_after_body при иÑпользовании ÑовмеÑтно Ñ + директивой sub_filter. + + *) ИÑправление: в переменной $realip_remote_addr. + + *) ИÑправление: директивы dav_access, proxy_store_access, + fastcgi_store_access, scgi_store_access и uwsgi_store_access + игнорировали права, заданные Ð´Ð»Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ. + + *) ИÑправление: unix domain listen-Ñокеты могли не наÑледоватьÑÑ Ð¿Ñ€Ð¸ + обновлении иÑполнÑемого файла на Linux. + + *) ИÑправление: nginx возвращал ошибку 400 на запроÑÑ‹ Ñ Ñимволом "-" в + HTTP-методе. + + +Ð˜Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² nginx 1.11.4 13.09.2016 + + *) Добавление: Ð¿ÐµÑ€ÐµÐ¼ÐµÐ½Ð½Ð°Ñ $upstream_bytes_received. + + *) Добавление: переменные $bytes_received, $session_time, $protocol, + $status, $upstream_addr, $upstream_bytes_sent, + $upstream_bytes_received, $upstream_connect_time, + $upstream_first_byte_time и $upstream_session_time в модуле stream. + + *) Добавление: модуль ngx_stream_log_module. + + *) Добавление: параметр proxy_protocol в директиве listen, переменные + $proxy_protocol_addr и $proxy_protocol_port в модуле stream. + + *) Добавление: модуль ngx_stream_realip_module. + + *) ИÑправление: nginx не ÑобиралÑÑ Ñ Ð¼Ð¾Ð´ÑƒÐ»ÐµÐ¼ stream и модулем + ngx_http_ssl_module, но без Ð¼Ð¾Ð´ÑƒÐ»Ñ ngx_stream_ssl_module; ошибка + поÑвилаÑÑŒ в 1.11.3. + + *) Добавление: Ð¾Ð¿Ñ†Ð¸Ñ Ñокета IP_BIND_ADDRESS_NO_PORT не иÑпользовалаÑÑŒ; + ошибка поÑвилаÑÑŒ в 1.11.2. + + *) ИÑправление: в параметре ranges директивы geo. + + *) ИÑправление: при иÑпользовании директив "aio threads" и sendfile мог + возвращатьÑÑ Ð½ÐµÐºÐ¾Ñ€Ñ€ÐµÐºÑ‚Ð½Ñ‹Ð¹ ответ; ошибка поÑвилаÑÑŒ в 1.9.13. + + +Ð˜Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² nginx 1.11.3 26.07.2016 + + *) Изменение: теперь accept_mutex по умолчанию выключен. + + *) Добавление: теперь nginx иÑпользует EPOLLEXCLUSIVE на Linux. + + *) Добавление: модуль ngx_stream_geo_module. + + *) Добавление: модуль ngx_stream_geoip_module. + + *) Добавление: модуль ngx_stream_split_clients_module. + + *) Добавление: директивы proxy_pass и proxy_ssl_name в модуле stream + поддерживают переменные. + + *) ИÑправление: утечки Ñокетов при иÑпользовании HTTP/2. + + *) ИÑправление: в configure. + СпаÑибо Piotr Sikora. + + +Ð˜Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² nginx 1.11.2 05.07.2016 + + *) Изменение: теперь nginx вÑегда иÑпользует внутренние реализации MD5 и + SHA1; параметры configure --with-md5 и --with-sha1 упразднены. + + *) Добавление: поддержка переменных в модуле stream. + + *) Добавление: модуль ngx_stream_map_module. + + *) Добавление: модуль ngx_stream_return_module. + + *) Добавление: в директивах proxy_bind, fastcgi_bind, memcached_bind, + scgi_bind и uwsgi_bind теперь можно указывать порт. + + *) Добавление: теперь nginx иÑпользует опцию Ñокета + IP_BIND_ADDRESS_NO_PORT, еÑли она доÑтупна. + + *) ИÑправление: при иÑпользовании HTTP/2 и директивы + proxy_request_buffering в рабочем процеÑÑе мог произойти segmentation + fault. + + *) ИÑправление: при иÑпользовании HTTP/2 к запроÑам, передаваемым на + бÑкенд, вÑегда добавлÑлаÑÑŒ Ñтрока заголовка "Content-Length", даже + еÑли у запроÑа не было тела. + + *) ИÑправление: при иÑпользовании HTTP/2 в логах могли поÑвлÑтьÑÑ + ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ "http request count is zero". + + *) ИÑправление: при иÑпользовании директивы sub_filter могло + буферизироватьÑÑ Ð±Ð¾Ð»ÑŒÑˆÐµ данных, чем Ñто необходимо; проблема + поÑвилаÑÑŒ в 1.9.4. + + +Ð˜Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² nginx 1.11.1 31.05.2016 + + *) БезопаÑноÑть: при запиÑи тела Ñпециально Ñозданного запроÑа во + временный файл в рабочем процеÑÑе мог проиÑходить segmentation fault + (CVE-2016-4450); ошибка поÑвилаÑÑŒ в 1.3.9. + + +Ð˜Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² nginx 1.11.0 24.05.2016 + + *) Добавление: параметр transparent директив proxy_bind, fastcgi_bind, + memcached_bind, scgi_bind и uwsgi_bind. + + *) Добавление: Ð¿ÐµÑ€ÐµÐ¼ÐµÐ½Ð½Ð°Ñ $request_id. + + *) Добавление: директива map поддерживает комбинации неÑкольких + переменных в качеÑтве результирующих значений. + + *) Добавление: теперь при иÑпользовании метода epoll nginx проверÑет, + поддерживает ли Ñдро ÑÐ¾Ð±Ñ‹Ñ‚Ð¸Ñ EPOLLRDHUP, и ÑоответÑтвенно + оптимизирует обработку Ñоединений. + + *) Добавление: директивы ssl_certificate и ssl_certificate_key теперь + можно указывать неÑколько раз Ð´Ð»Ñ Ð·Ð°Ð³Ñ€ÑƒÐ·ÐºÐ¸ Ñертификатов разных типов + (например, RSA и ECDSA). + + *) Добавление: при иÑпользовании OpenSSL 1.0.2 и новее Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ + директивы ssl_ecdh_curve теперь можно задать ÑпиÑок кривых; по + умолчанию иÑпользуетÑÑ Ð²Ñтроенный в OpenSSL ÑпиÑок кривых. + + *) Изменение: Ð´Ð»Ñ Ð¸ÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ DHE-шифров теперь надо Ñвно задавать + файл параметров Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ директивы ssl_dhparam. + + *) Добавление: Ð¿ÐµÑ€ÐµÐ¼ÐµÐ½Ð½Ð°Ñ $proxy_protocol_port. + + *) Добавление: Ð¿ÐµÑ€ÐµÐ¼ÐµÐ½Ð½Ð°Ñ $realip_remote_port в модуле + ngx_http_realip_module. + + *) Добавление: модуль ngx_http_realip_module теперь позволÑет + уÑтанавливать не только адреÑ, но и порт клиента. + + *) Изменение: при попытке запроÑить виртуальный Ñервер, отличающийÑÑ Ð¾Ñ‚ + ÑоглаÑованного в процеÑÑе SSL handshake, теперь возвращаетÑÑ Ð¾Ñ‚Ð²ÐµÑ‚ + "421 Misdirected Request"; Ñто улучшает ÑовмеÑтимоÑть Ñ Ð½ÐµÐºÐ¾Ñ‚Ð¾Ñ€Ñ‹Ð¼Ð¸ + HTTP/2-клиентами в Ñлучае иÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ ÐºÐ»Ð¸ÐµÐ½Ñ‚Ñких Ñертификатов. + + *) Изменение: HTTP/2-клиенты теперь могут Ñразу приÑылать тело запроÑа; + директива http2_body_preread_size позволÑет указать размер буфера, + который будет иÑпользоватьÑÑ Ð´Ð¾ того, как nginx начнёт читать тело. + + *) ИÑправление: при иÑпользовании директивы proxy_cache_bypass не + обновлÑлиÑÑŒ закÑшированные ошибочные ответы. + + +Ð˜Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² nginx 1.9.15 19.04.2016 + + *) ИÑправление: при иÑпользовании HHVM в качеÑтве FastCGI-Ñервера могли + возникать ошибки "recv() failed". + + *) ИÑправление: при иÑпользовании HTTP/2 и директив limit_req или + auth_request при чтении тела запроÑа мог произойти таймаут или ошибка + "client violated flow control"; ошибка поÑвилаÑÑŒ в 1.9.14. + + *) Изменение: при иÑпользовании HTTP/2 ответ мог не показыватьÑÑ + некоторыми браузерами, еÑли тело запроÑа было прочитано не целиком; + ошибка поÑвилаÑÑŒ в 1.9.14. + + *) ИÑправление: при иÑпользовании директивы "aio threads" ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ + могли завиÑать. + СпаÑибо Mindaugas Rasiukevicius. + + +Ð˜Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² nginx 1.9.14 05.04.2016 + + *) Добавление: ÑовмеÑтимоÑть Ñ OpenSSL 1.1.0. + + *) Добавление: директивы proxy_request_buffering, + fastcgi_request_buffering, scgi_request_buffering и + uwsgi_request_buffering теперь работают при иÑпользовании HTTP/2. + + *) ИÑправление: при иÑпользовании HTTP/2 в логах могли поÑвлÑтьÑÑ + ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ "zero size buf in output". + + *) ИÑправление: при иÑпользовании HTTP/2 директива client_max_body_size + могла работать неверно. + + *) ИÑправление: незначительных ошибок логгированиÑ. + + +Ð˜Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² nginx 1.9.13 29.03.2016 + + *) Изменение: неидемпотентные запроÑÑ‹ (POST, LOCK, PATCH) теперь по + умолчанию не передаютÑÑ Ð½Ð° другой Ñервер, еÑли Ð·Ð°Ð¿Ñ€Ð¾Ñ ÑƒÐ¶Ðµ был + отправлен на бÑкенд; параметр non_idempotent директивы + proxy_next_upstream Ñвно разрешает повторÑть такие запроÑÑ‹. + + *) Добавление: модуль ngx_http_perl_module теперь можно Ñобрать + динамичеÑки. + + *) Добавление: поддержка UDP в модуле stream. + + *) Добавление: директива aio_write. + + *) Добавление: теперь cache manager Ñледит за количеÑтвом Ñлементов в + кÑше и ÑтараетÑÑ Ð½Ðµ допуÑкать переполнений зоны разделÑемой памÑти. + + *) ИÑправление: при иÑпользовании директив sendfile и aio Ñ Ð¿Ð¾Ð´Ð·Ð°Ð¿Ñ€Ð¾Ñами + в логах могли поÑвлÑтьÑÑ ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ "task already active" и "second + aio post". + + *) ИÑправление: при иÑпользовании кÑÑˆÐ¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð² логах могли поÑвлÑтьÑÑ + ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ "zero size buf in output", еÑли клиент закрывал Ñоединение + преждевременно. + + *) ИÑправление: при иÑпользовании кÑÑˆÐ¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ñ ÐºÐ»Ð¸ÐµÐ½Ñ‚Ð°Ð¼Ð¸ + могли закрыватьÑÑ Ð±ÐµÐ· необходимоÑти. + СпаÑибо Justin Li. + + *) ИÑправление: nginx мог нагружать процеÑÑор при иÑпользовании + директивы sendfile на Linux и Solaris, еÑли отправлÑемый файл был + изменён в процеÑÑе отправки. + + *) ИÑправление: при иÑпользовании директив sendfile и "aio threads" + ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ð¼Ð¾Ð³Ð»Ð¸ завиÑать. + + *) ИÑправление: в директивах proxy_pass, fastcgi_pass, scgi_pass и + uwsgi_pass при иÑпользовании переменных. + СпаÑибо Piotr Sikora. + + *) ИÑправление: в модуле ngx_http_sub_filter_module. + + *) ИÑправление: еÑли в закÑшированном Ñоединении к бÑкенду проиÑходила + ошибка, Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð¿ÐµÑ€ÐµÐ´Ð°Ð²Ð°Ð»ÑÑ Ð½Ð° другой Ñервер без учёта директивы + proxy_next_upstream. + + *) ИÑправление: ошибки "CreateFile() failed" при Ñоздании временных + файлов на Windows. + + +Ð˜Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² nginx 1.9.12 24.02.2016 + + *) Добавление: кодирование Хаффмана заголовков ответов в HTTP/2. + СпаÑибо Владу КраÑнову. + + *) Добавление: директива worker_cpu_affinity теперь поддерживает более + 64 процеÑÑоров. + + *) ИÑправление: ÑовмеÑтимоÑть Ñо Ñторонними модулÑми на C++; ошибка + поÑвилаÑÑŒ в 1.9.11. + СпаÑибо Piotr Sikora. + + *) ИÑправление: nginx не ÑобиралÑÑ ÑтатичеÑки Ñ OpenSSL на Linux; ошибка + поÑвилаÑÑŒ в 1.9.11. + + *) ИÑправление: директива "add_header ... always" Ñ Ð¿ÑƒÑтым значением не + удалÑла из заголовков ошибочных ответов Ñтроки Last-Modified и ETag. + + *) Изменение: при иÑпользовании OpenSSL 1.0.2f в логах могли поÑвлÑтьÑÑ + ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ "called a function you should not call" и "shutdown while + in init". + + *) ИÑправление: ошибочные заголовки могли логгироватьÑÑ Ð½ÐµÐºÐ¾Ñ€Ñ€ÐµÐºÑ‚Ð½Ð¾. + + *) ИÑправление: утечки Ñокетов при иÑпользовании HTTP/2. + + *) ИÑправление: в модуле ngx_http_v2_module. + + +Ð˜Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² nginx 1.9.11 09.02.2016 + + *) Добавление: теперь resolver поддерживает TCP. + + *) Добавление: динамичеÑкие модули. + + *) ИÑправление: при иÑпользовании HTTP/2 Ð¿ÐµÑ€ÐµÐ¼ÐµÐ½Ð½Ð°Ñ $request_length не + учитывала размер заголовков запроÑа. + + *) ИÑправление: в модуле ngx_http_v2_module. + + +Ð˜Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² nginx 1.9.10 26.01.2016 + + *) БезопаÑноÑть: при иÑпользовании директивы resolver во Ð²Ñ€ÐµÐ¼Ñ Ð¾Ð±Ñ€Ð°Ð±Ð¾Ñ‚ÐºÐ¸ + ответов DNS-Ñервера могло проиÑходить разыменование некорректного + адреÑа, что позволÑло атакующему, имеющему возможноÑть подделывать + UDP-пакеты от DNS-Ñервера, вызвать segmentation fault в рабочем + процеÑÑе (CVE-2016-0742). + + *) БезопаÑноÑть: при иÑпользовании директивы resolver во Ð²Ñ€ÐµÐ¼Ñ Ð¾Ð±Ñ€Ð°Ð±Ð¾Ñ‚ÐºÐ¸ + CNAME-запиÑей могло произойти обращение к ранее оÑвобождённой памÑти, + что позволÑло атакующему, имеющему возможноÑть инициировать + преобразование произвольных имён в адреÑа, вызвать segmentation fault + в рабочем процеÑÑе, а также потенциально могло иметь другие + поÑледÑÑ‚Ð²Ð¸Ñ (CVE-2016-0746). + + *) БезопаÑноÑть: при иÑпользовании директивы resolver во Ð²Ñ€ÐµÐ¼Ñ Ð¾Ð±Ñ€Ð°Ð±Ð¾Ñ‚ÐºÐ¸ + CNAME-запиÑей не во вÑех ÑлучаÑÑ… проверÑлоÑÑŒ ограничение на + макÑимальное количеÑтво запиÑей в цепочке, что позволÑло атакующему, + имеющему возможноÑть инициировать преобразование произвольных имён в + адреÑа, вызвать чрезмерное потребление реÑурÑов рабочими процеÑÑами + (CVE-2016-0747). + + *) Добавление: параметр auto директивы worker_cpu_affinity. + + *) ИÑправление: параметр proxy_protocol директивы listen не работал Ñ + IPv6 listen-Ñокетами. + + *) ИÑправление: при иÑпользовании директивы keepalive ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ðº + бÑкендам могли кÑшироватьÑÑ Ð½ÐµÐºÐ¾Ñ€Ñ€ÐµÐºÑ‚Ð½Ð¾. + + *) ИÑправление: поÑле Ð¿ÐµÑ€ÐµÐ½Ð°Ð¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð·Ð°Ð¿Ñ€Ð¾Ñа Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ X-Accel-Redirect + при прокÑировании иÑпользовалÑÑ HTTP-метод оригинального запроÑа. + + +Ð˜Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² nginx 1.9.9 09.12.2015 + + *) ИÑправление: прокÑирование в unix domain Ñокеты не работало при + иÑпользовании переменных; ошибка поÑвилаÑÑŒ в 1.9.8. + + +Ð˜Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² nginx 1.9.8 08.12.2015 + + *) Добавление: поддержка pwritev(). + + *) Добавление: директива include в блоке upstream. + + *) Добавление: модуль ngx_http_slice_module. + + *) ИÑправление: при иÑпользовании LibreSSL в рабочем процеÑÑе мог + произойти segmentation fault; ошибка поÑвилаÑÑŒ в 1.9.6. + + *) ИÑправление: nginx мог не ÑобиратьÑÑ Ð½Ð° OS X. + + +Ð˜Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² nginx 1.9.7 17.11.2015 + + *) Добавление: параметр nohostname Ð»Ð¾Ð³Ð³Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð² syslog. + + *) Добавление: директива proxy_cache_convert_head. + + *) Добавление: Ð¿ÐµÑ€ÐµÐ¼ÐµÐ½Ð½Ð°Ñ $realip_remote_addr в модуле + ngx_http_realip_module. + + *) ИÑправление: директива expires могла не Ñрабатывать при иÑпользовании + переменных. + + *) ИÑправление: при иÑпользовании HTTP/2 в рабочем процеÑÑе мог + произойти segmentation fault; ошибка поÑвилаÑÑŒ в 1.9.6. + + *) ИÑправление: еÑли nginx был Ñобран Ñ Ð¼Ð¾Ð´ÑƒÐ»ÐµÐ¼ ngx_http_v2_module, + протокол HTTP/2 мог быть иÑпользован клиентом, даже еÑли не был + указан параметр http2 директивы listen. + + *) ИÑправление: в модуле ngx_http_v2_module. + + +Ð˜Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² nginx 1.9.6 27.10.2015 + + *) ИÑправление: при иÑпользовании HTTP/2 в рабочем процеÑÑе мог + произойти segmentation fault. + СпаÑибо Piotr Sikora и Denis Andzakovic. + + *) ИÑправление: при иÑпользовании HTTP/2 Ð¿ÐµÑ€ÐµÐ¼ÐµÐ½Ð½Ð°Ñ $server_protocol + была пуÑтой. + + *) ИÑправление: SSL-ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ðº бÑкендам в модуле stream могли + неожиданно завершатьÑÑ Ð¿Ð¾ таймауту. + + *) ИÑправление: при иÑпользовании различных наÑтроек ssl_session_cache в + разных виртуальных Ñерверах в рабочем процеÑÑе мог произойти + segmentation fault. + + *) ИÑправление: nginx/Windows не ÑобиралÑÑ Ñ MinGW gcc; ошибка поÑвилаÑÑŒ + в 1.9.4. + СпаÑибо Kouhei Sutou. + + *) ИÑправление: при иÑпользовании директивы timer_resolution на Windows + Ð²Ñ€ÐµÐ¼Ñ Ð½Ðµ обновлÑлоÑÑŒ. + + *) Ðезначительные иÑÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¸ улучшениÑ. + СпаÑибо Markus Linnala, Kurtis Nusbaum и Piotr Sikora. + + +Ð˜Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² nginx 1.9.5 22.09.2015 + + *) Добавление: модуль ngx_http_v2_module (заменÑет модуль + ngx_http_spdy_module). + СпаÑибо Dropbox и Automattic за ÑпонÑирование разработки. + + *) Изменение: теперь по умолчанию директива output_buffers иÑпользует + два буфера. + + *) Изменение: теперь nginx ограничивает макÑимальную вложенноÑть + подзапроÑов, а не количеÑтво одновременных подзапроÑов. + + *) Изменение: теперь при возврате ответов из кÑша nginx проверÑет ключ + полноÑтью. + СпаÑибо Геннадию Махомеду и Сергею БреÑтеру. + + *) ИÑправление: при иÑпользовании кÑша в логах могли поÑвлÑтьÑÑ + ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ "header already sent"; ошибка поÑвилаÑÑŒ в 1.7.5. + + *) ИÑправление: при иÑпользовании CephFS и директивы timer_resolution на + Linux в логах могли поÑвлÑтьÑÑ ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ "writev() failed (4: + Interrupted system call)". + + *) ИÑправление: в обработке ошибок конфигурации. + СпаÑибо Markus Linnala. + + *) ИÑправление: при иÑпользовании директивы sub_filter на уровне http в + рабочем процеÑÑе проиÑходил segmentation fault; ошибка поÑвилаÑÑŒ в + 1.9.4. + + +Ð˜Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² nginx 1.9.4 18.08.2015 + + *) Изменение: директивы proxy_downstream_buffer и proxy_upstream_buffer + в модуле stream заменены директивой proxy_buffer_size. + + *) Добавление: директива tcp_nodelay в модуле stream. + + *) Добавление: теперь можно указать неÑколько директив sub_filter + одновременно. + + *) Добавление: директива sub_filter поддерживает переменные в Ñтроке + поиÑка. + + *) Изменение: теÑтирование конфигурации могло не работать под Linux + OpenVZ. + СпаÑибо Геннадию Махомеду. + + *) ИÑправление: поÑле переконфигурации Ñтарые рабочие процеÑÑÑ‹ могли + Ñильно нагружать процеÑÑор при больших значениÑÑ… worker_connections. + + *) ИÑправление: при ÑовмеÑтном иÑпользовании директив try_files и alias + внутри location'а, заданного регулÑрным выражением, в рабочем + процеÑÑе мог произойти segmentation fault; ошибка поÑвилаÑÑŒ в 1.7.1. + + *) ИÑправление: директива try_files внутри вложенного location'а, + заданного регулÑрным выражением, работала неправильно, еÑли во + внешнем location'е иÑпользовалаÑÑŒ директива alias. + + *) ИÑправление: в обработке ошибок при поÑтроении Ñ…Ñш-таблиц. + + *) ИÑправление: nginx не ÑобиралÑÑ Ñ Visual Studio 2015. + + +Ð˜Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² nginx 1.9.3 14.07.2015 + + *) Изменение: дублирующиеÑÑ Ð±Ð»Ð¾ÐºÐ¸ http, mail и stream теперь запрещены. + + *) Добавление: ограничение количеÑтва Ñоединений в модуле stream. + + *) Добавление: ограничение ÑкороÑти в модуле stream. + + *) ИÑправление: директива zone в блоке upstream не работала на Windows. + + *) ИÑправление: ÑовмеÑтимоÑть Ñ LibreSSL в модуле stream. + СпаÑибо Piotr Sikora. + + *) ИÑправление: в параметре --builddir в configure. + СпаÑибо Piotr Sikora. + + *) ИÑправление: директива ssl_stapling_file не работала; ошибка + поÑвилаÑÑŒ в 1.9.2. + СпаÑибо Faidon Liambotis и Brandon Black. + + *) ИÑправление: при иÑпользовании директивы ssl_stapling в рабочем + процеÑÑе мог произойти segmentation fault; ошибка поÑвилаÑÑŒ в 1.9.2. + СпаÑибо Matthew Baldwin. + + +Ð˜Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² nginx 1.9.2 16.06.2015 + + *) Добавление: параметр backlog директивы listen в почтовом + прокÑи-Ñервере и модуле stream. + + *) Добавление: директивы allow и deny в модуле stream. + + *) Добавление: директива proxy_bind в модуле stream. + + *) Добавление: директива proxy_protocol в модуле stream. + + *) Добавление: ключ -T. + + *) Добавление: параметр REQUEST_SCHEME добавлен в Ñтандартные + конфигурационные файлы fastcgi.conf, fastcgi_params, scgi_params и + uwsgi_params. + + *) ИÑправление: параметр reuseport директивы listen в модуле stream не + работал. + + *) ИÑправление: OCSP stapling в некоторых ÑлучаÑÑ… мог вернуть уÑтаревший + OCSP-ответ. + + +Ð˜Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² nginx 1.9.1 26.05.2015 + + *) Изменение: теперь протокол SSLv3 по умолчанию запрещён. + + *) Изменение: некоторые давно уÑтаревшие директивы больше не + поддерживаютÑÑ. + + *) Добавление: параметр reuseport директивы listen. + СпаÑибо Yingqi Lu из Intel и Sepherosa Ziehau. + + *) Добавление: Ð¿ÐµÑ€ÐµÐ¼ÐµÐ½Ð½Ð°Ñ $upstream_connect_time. + + *) ИÑправление: в директиве hash на big-endian платформах. + + *) ИÑправление: nginx мог не запуÑкатьÑÑ Ð½Ð° некоторых Ñтарых верÑиÑÑ… + Linux; ошибка поÑвилаÑÑŒ в 1.7.11. + + *) ИÑправление: в парÑинге IP-адреÑов. + СпаÑибо Сергею Половко. + + +Ð˜Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² nginx 1.9.0 28.04.2015 + + *) Изменение: уÑтаревшие методы обработки Ñоединений aio и rtsig больше + не поддерживаютÑÑ. + + *) Добавление: директива zone в блоке upstream. + + *) Добавление: модуль stream. + + *) Добавление: поддержка byte ranges Ð´Ð»Ñ Ð¾Ñ‚Ð²ÐµÑ‚Ð¾Ð² Ð¼Ð¾Ð´ÑƒÐ»Ñ + ngx_http_memcached_module. + СпаÑибо Martin Mlynář. + + *) Добавление: разделÑемую памÑть теперь можно иÑпользовать на верÑиÑÑ… + Windows Ñ Ñ€Ð°Ð½Ð´Ð¾Ð¼Ð¸Ð·Ð°Ñ†Ð¸ÐµÐ¹ адреÑного проÑтранÑтва. + СпаÑибо Сергею БреÑтеру. + + *) Добавление: директиву error_log теперь можно иÑпользовать на уровнÑÑ… + mail и server в почтовом прокÑи-Ñервере. + + *) ИÑправление: параметр proxy_protocol директивы listen не работал, + еÑли не был указан в первой директиве listen Ð´Ð»Ñ Ð´Ð°Ð½Ð½Ð¾Ð³Ð¾ + listen-Ñокета. + + +Ð˜Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² nginx 1.7.12 07.04.2015 + + *) Добавление: теперь директива tcp_nodelay работает Ð´Ð»Ñ SSL-Ñоединений + Ñ Ð±Ñкендами. + + *) Добавление: теперь потоки могут иÑпользоватьÑÑ Ð´Ð»Ñ Ñ‡Ñ‚ÐµÐ½Ð¸Ñ Ð·Ð°Ð³Ð¾Ð»Ð¾Ð²ÐºÐ¾Ð² + файлов в кÑше. + + *) ИÑправление: в директиве proxy_request_buffering. + + *) ИÑправление: при иÑпользовании потоков на Linux в рабочем процеÑÑе + мог произойти segmentation fault. + + *) ИÑправление: в обработке ошибок при иÑпользовании директивы + ssl_stapling. + СпаÑибо Filipe da Silva. + + *) ИÑправление: в модуле ngx_http_spdy_module. + + +Ð˜Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² nginx 1.7.11 24.03.2015 + + *) Изменение: параметр sendfile директивы aio более не нужен; теперь + nginx автоматичеÑки иÑпользует AIO Ð´Ð»Ñ Ð¿Ð¾Ð´Ð³Ñ€ÑƒÐ·ÐºÐ¸ данных Ð´Ð»Ñ sendfile, + еÑли одновременно иÑпользуютÑÑ Ð´Ð¸Ñ€ÐµÐºÑ‚Ð¸Ð²Ñ‹ aio и sendfile. + + *) Добавление: ÑкÑÐ¿ÐµÑ€Ð¸Ð¼ÐµÐ½Ñ‚Ð°Ð»ÑŒÐ½Ð°Ñ Ð¿Ð¾Ð´Ð´ÐµÑ€Ð¶ÐºÐ° потоков. + + *) Добавление: директивы proxy_request_buffering, + fastcgi_request_buffering, scgi_request_buffering и + uwsgi_request_buffering. + + *) Добавление: ÑкÑпериментальное API Ð´Ð»Ñ Ð¾Ð±Ñ€Ð°Ð±Ð¾Ñ‚ÐºÐ¸ тела запроÑа. + + *) Добавление: проверка клиентÑких SSL-Ñертификатов в почтовом + прокÑи-Ñервере. + СпаÑибо Sven Peter, Franck Levionnois и Filipe Da Silva. + + *) Добавление: уменьшение времени запуÑка при иÑпользовании директивы + "hash ... consistent" в блоке upstream. + СпаÑибо Wai Keen Woon. + + *) Добавление: отладочное логгирование в кольцевой буфер в памÑти. + + *) ИÑправление: в обработке Ñ…Ñш-таблиц. + СпаÑибо Chris West. + + *) ИÑправление: в директиве proxy_cache_revalidate. + + *) ИÑправление: SSL-ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ð¼Ð¾Ð³Ð»Ð¸ завиÑать, еÑли иÑпользовалÑÑ + отложенный accept или параметр proxy_protocol директивы listen. + СпаÑибо James Hamlin. + + *) ИÑправление: Ð¿ÐµÑ€ÐµÐ¼ÐµÐ½Ð½Ð°Ñ $upstream_response_time могла Ñодержать + неверное значение при иÑпользовании директивы image_filter. + + *) ИÑправление: в обработке целочиÑленных переполнений. + СпаÑибо Régis Leroy. + + *) ИÑправление: при иÑпользовании LibreSSL было невозможно включить + поддержку SSLv3. + + *) ИÑправление: при иÑпользовании LibreSSL в логах поÑвлÑлиÑÑŒ ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ + "ignoring stale global SSL error ... called a function you should not + call". + + *) ИÑправление: Ñертификаты, указанные в директивах + ssl_client_certificate и ssl_trusted_certificate, иÑпользовалиÑÑŒ Ð´Ð»Ñ + автоматичеÑкого поÑÑ‚Ñ€Ð¾ÐµÐ½Ð¸Ñ Ñ†ÐµÐ¿Ð¾Ñ‡ÐµÐº Ñертификатов. + + +Ð˜Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² nginx 1.7.10 10.02.2015 + + *) Добавление: параметр use_temp_path директив proxy_cache_path, + fastcgi_cache_path, scgi_cache_path и uwsgi_cache_path. + + *) Добавление: Ð¿ÐµÑ€ÐµÐ¼ÐµÐ½Ð½Ð°Ñ $upstream_header_time. + + *) Изменение: теперь при переполнении диÑка nginx пытаетÑÑ Ð¿Ð¸Ñать + error_log'и только раз в Ñекунду. + + *) ИÑправление: директива try_files при теÑтировании каталогов не + игнорировала обычные файлы. + СпаÑибо Damien Tournoud. + + *) ИÑправление: при иÑпользовании директивы sendfile на OS X возникали + ошибки "sendfile() failed"; ошибка поÑвилаÑÑŒ в nginx 1.7.8. + + *) ИÑправление: в лог могли пиÑатьÑÑ ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ "sem_post() failed". + + *) ИÑправление: nginx не ÑобиралÑÑ Ñ musl libc. + СпаÑибо James Taylor. + + *) ИÑправление: nginx не ÑобиралÑÑ Ð½Ð° Tru64 UNIX. + СпаÑибо Goetz T. Fischer. + + +Ð˜Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² nginx 1.7.9 23.12.2014 + + *) Добавление: директивы proxy_cache, fastcgi_cache, scgi_cache и + uwsgi_cache поддерживают переменные. + + *) Добавление: директива expires поддерживает переменные. + + *) Добавление: возможноÑть загрузки Ñекретных ключей Ñ Ð°Ð¿Ð¿Ð°Ñ€Ð°Ñ‚Ð½Ñ‹Ñ… + уÑтройÑтв Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ OpenSSL engines. + СпаÑибо Дмитрию Пичулину. + + *) Добавление: директива autoindex_format. + + *) ИÑправление: Ñ€ÐµÐ²Ð°Ð»Ð¸Ð´Ð°Ñ†Ð¸Ñ Ñлементов кÑша теперь иÑпользуетÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ + Ð´Ð»Ñ Ð¾Ñ‚Ð²ÐµÑ‚Ð¾Ð² Ñ ÐºÐ¾Ð´Ð°Ð¼Ð¸ 200 и 206. + СпаÑибо Piotr Sikora. + + *) ИÑправление: Ñтрока "TE" заголовка запроÑа клиента передавалаÑÑŒ на + бÑкенд при прокÑировании. + + *) ИÑправление: директивы proxy_pass, fastcgi_pass, scgi_pass и + uwsgi_pass могли неправильно работать внутри блоков if и + limit_except. + + *) ИÑправление: директива proxy_store Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð¾Ð¼ "on" игнорировалаÑÑŒ, + еÑли на предыдущем уровне иÑпользовалаÑÑŒ директива proxy_store Ñ Ñвно + заданным путём к файлам. + + *) ИÑправление: nginx не ÑобиралÑÑ Ñ BoringSSL. + СпаÑибо Lukas Tribus. + + +Ð˜Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² nginx 1.7.8 02.12.2014 + + *) Изменение: теперь Ñтроки "If-Modified-Since", "If-Range" и им + подобные в заголовке запроÑа клиента передаютÑÑ Ð±Ñкенду при + включённом кÑшировании, еÑли nginx заранее знает, что не будет + кÑшировать ответ (например, при иÑпользовании proxy_cache_min_uses). + + *) Изменение: теперь поÑле иÑÑ‚ÐµÑ‡ÐµÐ½Ð¸Ñ proxy_cache_lock_timeout nginx + отправлÑет Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð½Ð° бÑкенд без кÑшированиÑ; новые директивы + proxy_cache_lock_age, fastcgi_cache_lock_age, scgi_cache_lock_age и + uwsgi_cache_lock_age позволÑÑŽÑ‚ указать, через какое Ð²Ñ€ÐµÐ¼Ñ Ð±Ð»Ð¾ÐºÐ¸Ñ€Ð¾Ð²ÐºÐ° + будет принудительно ÑнÑта и будет Ñделана ещё одна попытка + закÑшировать ответ. + + *) Изменение: директива log_format теперь может иÑпользоватьÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ на + уровне http. + + *) Добавление: директивы proxy_ssl_certificate, + proxy_ssl_certificate_key, proxy_ssl_password_file, + uwsgi_ssl_certificate, uwsgi_ssl_certificate_key и + uwsgi_ssl_password_file. + СпаÑибо Piotr Sikora. + + *) Добавление: теперь Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ X-Accel-Redirect можно перейти в + именованный location. + СпаÑибо Toshikuni Fukaya. + + *) Добавление: теперь директива tcp_nodelay работает Ð´Ð»Ñ + SPDY-Ñоединений. + + *) Добавление: новые директивы в Ñкриптах подÑветки ÑинтакÑиÑа Ð´Ð»Ñ vim. + СпаÑибо Peter Wu. + + *) ИÑправление: nginx игнорировал значение "s-maxage" в Ñтроке + "Cache-Control" в заголовке ответа бÑкенда. + СпаÑибо Piotr Sikora. + + *) ИÑправление: в модуле ngx_http_spdy_module. + СпаÑибо Piotr Sikora. + + *) ИÑправление: в директиве ssl_password_file при иÑпользовании OpenSSL + 0.9.8zc, 1.0.0o, 1.0.1j. + + *) ИÑправление: при иÑпользовании директивы post_action в лог пиÑалиÑÑŒ + ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ "header already sent"; ошибка поÑвилаÑÑŒ в nginx 1.5.4. + + *) ИÑправление: при иÑпользовании директивы "postpone_output 0" Ñ + SSI-подзапроÑами в лог могли пиÑатьÑÑ ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ "the http output + chain is empty". + + *) ИÑправление: в директиве proxy_cache_lock при иÑпользовании + SSI-подзапроÑов. + СпаÑибо Yichun Zhang. + + +Ð˜Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² nginx 1.7.7 28.10.2014 + + *) Изменение: теперь nginx учитывает при кÑшировании Ñтроку "Vary" в + заголовке ответа бÑкенда. + + *) Добавление: директивы proxy_force_ranges, fastcgi_force_ranges, + scgi_force_ranges и uwsgi_force_ranges. + + *) Добавление: директивы proxy_limit_rate, fastcgi_limit_rate, + scgi_limit_rate и uwsgi_limit_rate. + + *) Добавление: параметр Vary директив proxy_ignore_headers, + fastcgi_ignore_headers, scgi_ignore_headers и uwsgi_ignore_headers. + + *) ИÑправление: поÑледнÑÑ Ñ‡Ð°Ñть ответа, полученного от бÑкенда при + небуферизированном прокÑировании, могла не отправлÑтьÑÑ ÐºÐ»Ð¸ÐµÐ½Ñ‚Ñƒ, еÑли + иÑпользовалиÑÑŒ директивы gzip или gunzip. + + *) ИÑправление: в директиве proxy_cache_revalidate. + СпаÑибо Piotr Sikora. + + *) ИÑправление: в обработке ошибок. + СпаÑибо Yichun Zhang и Даниилу Бондареву. + + *) ИÑправление: в директивах proxy_next_upstream_tries и + proxy_next_upstream_timeout. + СпаÑибо Feng Gu. + + *) ИÑправление: nginx/Windows не ÑобиралÑÑ Ñ MinGW-w64 gcc. + СпаÑибо Kouhei Sutou. + + +Ð˜Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² nginx 1.7.6 30.09.2014 + + *) Изменение: уÑÑ‚Ð°Ñ€ÐµÐ²ÑˆÐ°Ñ Ð´Ð¸Ñ€ÐµÐºÑ‚Ð¸Ð²Ð° limit_zone больше не поддерживаетÑÑ. + + *) Добавление: в директивах limit_conn_zone и limit_req_zone теперь + можно иÑпользовать комбинации неÑкольких переменных. + + *) ИÑправление: при повторной отправке FastCGI-запроÑа на бÑкенд тело + запроÑа могло передаватьÑÑ Ð½ÐµÐ¿Ñ€Ð°Ð²Ð¸Ð»ÑŒÐ½Ð¾. + + *) ИÑправление: в логгировании в syslog. + + +Ð˜Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² nginx 1.7.5 16.09.2014 + + *) БезопаÑноÑть: при иÑпользовании общего Ð´Ð»Ñ Ð½ÐµÑкольких блоков server + разделÑемого кÑша SSL-ÑеÑÑий или общего ключа Ð´Ð»Ñ ÑˆÐ¸Ñ„Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ TLS + session tickets было возможно повторно иÑпользовать SSL-ÑеÑÑию в + контекÑте другого блока server (CVE-2014-3616). + СпаÑибо Antoine Delignat-Lavaud. + + *) Изменение: директиву stub_status теперь можно указывать без + параметров. + + *) Добавление: параметр always директивы add_header. + + *) Добавление: директивы proxy_next_upstream_tries, + proxy_next_upstream_timeout, fastcgi_next_upstream_tries, + fastcgi_next_upstream_timeout, memcached_next_upstream_tries, + memcached_next_upstream_timeout, scgi_next_upstream_tries, + scgi_next_upstream_timeout, uwsgi_next_upstream_tries и + uwsgi_next_upstream_timeout. + + *) ИÑправление: в параметре if директивы access_log. + + *) ИÑправление: в модуле ngx_http_perl_module. + СпаÑибо Piotr Sikora. + + *) ИÑправление: директива listen почтового прокÑи-Ñервера не позволÑла + указать более двух параметров. + + *) ИÑправление: директива sub_filter не работала Ñ Ð·Ð°Ð¼ÐµÐ½Ñемой Ñтрокой из + одного Ñимвола. + + *) ИÑправление: запроÑÑ‹ могли завиÑать, еÑли иÑпользовалÑÑ resolver и в + процеÑÑе Ð¾Ð±Ñ€Ð°Ñ‰ÐµÐ½Ð¸Ñ Ðº DNS-Ñерверу проиÑходил таймаут. + + *) ИÑправление: в модуле ngx_http_spdy_module при иÑпользовании + ÑовмеÑтно Ñ AIO. + + *) ИÑправление: в рабочем процеÑÑе мог произойти segmentation fault, + еÑли Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ директивы set изменÑлиÑÑŒ переменные "$http_...", + "$sent_http_..." или "$upstream_http_...". + + *) ИÑправление: в обработке ошибок Ð²Ñ‹Ð´ÐµÐ»ÐµÐ½Ð¸Ñ Ð¿Ð°Ð¼Ñти. + СпаÑибо Markus Linnala и Feng Gu. + + +Ð˜Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² nginx 1.7.4 05.08.2014 + + *) БезопаÑноÑть: pipelined-команды не отбраÑывалиÑÑŒ поÑле команды + STARTTLS в SMTP прокÑи-Ñервере (CVE-2014-3556); ошибка поÑвилаÑÑŒ в + 1.5.6. + СпаÑибо Chris Boulton. + + *) Изменение: Ñкранирование Ñимволов в URI теперь иÑпользует + шеÑтнадцатеричные цифры в верхнем региÑтре. + СпаÑибо Piotr Sikora. + + *) Добавление: теперь nginx можно Ñобрать Ñ BoringSSL и LibreSSL. + СпаÑибо Piotr Sikora. + + *) ИÑправление: запроÑÑ‹ могли завиÑать, еÑли иÑпользовалÑÑ resolver и + DNS-Ñервер возвращал некорректный ответ; ошибка поÑвилаÑÑŒ в 1.5.8. + + *) ИÑправление: в модуле ngx_http_spdy_module. + СпаÑибо Piotr Sikora. + + *) ИÑправление: Ð¿ÐµÑ€ÐµÐ¼ÐµÐ½Ð½Ð°Ñ $uri могла Ñодержать муÑор при возврате + ошибок Ñ ÐºÐ¾Ð´Ð¾Ð¼ 400. + СпаÑибо Сергею Боброву. + + *) ИÑправление: в обработке ошибок в директиве proxy_store и в модуле + ngx_http_dav_module. + СпаÑибо Feng Gu. + + *) ИÑправление: при логгировании ошибок в syslog мог проиÑходить + segmentation fault; ошибка поÑвилаÑÑŒ в 1.7.1. + + *) ИÑправление: переменные $geoip_latitude, $geoip_longitude, + $geoip_dma_code и $geoip_area_code могли не работать. + СпаÑибо Yichun Zhang. + + *) ИÑправление: в обработке ошибок Ð²Ñ‹Ð´ÐµÐ»ÐµÐ½Ð¸Ñ Ð¿Ð°Ð¼Ñти. + СпаÑибо Tatsuhiko Kubo и Piotr Sikora. + + +Ð˜Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² nginx 1.7.3 08.07.2014 + + *) Добавление: weak entity tags теперь не удалÑÑŽÑ‚ÑÑ Ð¿Ñ€Ð¸ изменениÑÑ… + ответа, а strong entity tags преобразуютÑÑ Ð² weak. + + *) Добавление: Ñ€ÐµÐ²Ð°Ð»Ð¸Ð´Ð°Ñ†Ð¸Ñ Ñлементов кÑша теперь, еÑли Ñто возможно, + иÑпользует заголовок If-None-Match. + + *) Добавление: директива ssl_password_file. + + *) ИÑправление: при возврате ответа из кÑша заголовок запроÑа + If-None-Match игнорировалÑÑ, еÑли в ответе не было заголовка + Last-Modified. + + *) ИÑправление: ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ "peer closed connection in SSL handshake" при + Ñоединении Ñ Ð±Ñкендами логгировалиÑÑŒ на уровне info вмеÑто error. + + *) ИÑправление: в модуле ngx_http_dav_module в nginx/Windows. + + *) ИÑправление: SPDY-ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ð¼Ð¾Ð³Ð»Ð¸ неожиданно закрыватьÑÑ, еÑли + иÑпользовалоÑÑŒ кÑширование. + + +Ð˜Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² nginx 1.7.2 17.06.2014 + + *) Добавление: директива hash в блоке upstream. + + *) Добавление: Ð´ÐµÑ„Ñ€Ð°Ð³Ð¼ÐµÐ½Ñ‚Ð°Ñ†Ð¸Ñ Ñвободных блоков разделÑемой памÑти. + СпаÑибо Wandenberg Peixoto и Yichun Zhang. + + *) ИÑправление: в рабочем процеÑÑе мог произойти segmentation fault, + еÑли иÑпользовалоÑÑŒ значение access_log по умолчанию; ошибка + поÑвилаÑÑŒ в 1.7.0. + СпаÑибо Piotr Sikora. + + *) ИÑправление: завершающий ÑлÑш ошибочно удалÑлÑÑ Ð¸Ð· поÑледнего + параметра директивы try_files. + + *) ИÑправление: nginx мог не ÑобиратьÑÑ Ð½Ð° OS X. + + *) ИÑправление: в модуле ngx_http_spdy_module. + + +Ð˜Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² nginx 1.7.1 27.05.2014 + + *) Добавление: переменные "$upstream_cookie_...". + + *) Добавление: Ð¿ÐµÑ€ÐµÐ¼ÐµÐ½Ð½Ð°Ñ $ssl_client_fingerprint. + + *) Добавление: директивы error_log и access_log теперь поддерживают + логгирование в syslog. + + *) Добавление: почтовый прокÑи-Ñервер теперь логгирует порт клиента при + Ñоединении. + + *) ИÑправление: утечки памÑти при иÑпользовании директивы + "ssl_stapling". + СпаÑибо Filipe da Silva. + + *) ИÑправление: директива alias внутри location'а, заданного регулÑрным + выражением, работала неправильно, еÑли иÑпользовалиÑÑŒ директивы if + или limit_except. + + *) ИÑправление: директива charset не Ñтавила кодировку Ð´Ð»Ñ Ñжатых + ответов бÑкендов. + + *) ИÑправление: директива proxy_pass без URI могла иÑпользовать + оригинальный Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð¿Ð¾Ñле уÑтановки переменной $args. + СпаÑибо Yichun Zhang. + + *) ИÑправление: в работе параметра none директивы smtp_auth; ошибка + поÑвилаÑÑŒ в 1.5.6. + СпаÑибо СвÑтоÑлаву ÐикольÑкому. + + *) ИÑправление: при ÑовмеÑтном иÑпользовании sub_filter и SSI ответы + могли передаватьÑÑ Ð½ÐµÐ²ÐµÑ€Ð½Ð¾. + + *) ИÑправление: nginx не ÑобиралÑÑ Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð¾Ð¼ --with-file-aio на + Linux/aarch64. + + +Ð˜Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² nginx 1.7.0 24.04.2014 + + *) Добавление: проверка SSL-Ñертификатов бÑкендов. + + *) Добавление: поддержка SNI при работе Ñ Ð±Ñкендами по SSL. + + *) Добавление: Ð¿ÐµÑ€ÐµÐ¼ÐµÐ½Ð½Ð°Ñ $ssl_server_name. + + *) Добавление: параметр if директивы access_log. + + +Ð˜Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² nginx 1.5.13 08.04.2014 + + *) Изменение: улучшена обработка Ñ…Ñш-таблиц; в директивах + variables_hash_max_size и types_hash_bucket_size Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð¿Ð¾ + умолчанию изменены на 1024 и 64 ÑоответÑтвенно. + + *) Добавление: модуль ngx_http_mp4_module теперь понимает аргумент end. + + *) Добавление: поддержка byte ranges модулем ngx_http_mp4_module и при + Ñохранении ответов в кÑш. + + *) ИÑправление: теперь nginx не пишет в лог ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ "ngx_slab_alloc() + failed: no memory" при иÑпользовании разделÑемой памÑти в + ssl_session_cache и в модуле ngx_http_limit_req_module. + + *) ИÑправление: директива underscores_in_headers не разрешала + подчёркивание в первом Ñимволе заголовка. + СпаÑибо Piotr Sikora. + + *) ИÑправление: cache manager мог нагружать процеÑÑор при выходе в + nginx/Windows. + + *) ИÑправление: при иÑпользовании ssl_session_cache Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð¾Ð¼ shared + рабочий процеÑÑ nginx/Windows завершалÑÑ Ð°Ð²Ð°Ñ€Ð¸Ð¹Ð½Ð¾. + + *) ИÑправление: в модуле ngx_http_spdy_module. + + +Ð˜Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² nginx 1.5.12 18.03.2014 + + *) БезопаÑноÑть: при обработке Ñпециально Ñозданного запроÑа модулем + ngx_http_spdy_module могло проиÑходить переполнение буфера в рабочем + процеÑÑе, что потенциально могло приводить к выполнению произвольного + кода (CVE-2014-0133). + СпаÑибо Lucas Molas из Programa STIC, Fundación Dr. Manuel Sadosky, + Buenos Aires, Argentina. + + *) Добавление: параметр proxy_protocol в директивах listen и + real_ip_header, Ð¿ÐµÑ€ÐµÐ¼ÐµÐ½Ð½Ð°Ñ $proxy_protocol_addr. + + *) ИÑправление: в директиве fastcgi_next_upstream. + СпаÑибо Lucas Molas. + + +Ð˜Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² nginx 1.5.11 04.03.2014 + + *) БезопаÑноÑть: при обработке Ñпециально Ñозданного запроÑа модулем + ngx_http_spdy_module на 32-битных платформах могла повреждатьÑÑ + памÑть рабочего процеÑÑа, что потенциально могло приводить к + выполнению произвольного кода (CVE-2014-0088); ошибка поÑвилаÑÑŒ в + 1.5.10. + СпаÑибо Lucas Molas из Programa STIC, Fundación Dr. Manuel Sadosky, + Buenos Aires, Argentina. + + *) Добавление: Ð¿ÐµÑ€ÐµÐ¼ÐµÐ½Ð½Ð°Ñ $ssl_session_reused. + + *) ИÑправление: директива client_max_body_size могла не работать при + чтении тела запроÑа Ñ Ð¸Ñпользованием chunked transfer encoding; + ошибка поÑвилаÑÑŒ в 1.3.9. + СпаÑибо Lucas Molas. + + *) ИÑправление: при прокÑировании WebSocket-Ñоединений в рабочем + процеÑÑе мог произойти segmentation fault. + + *) ИÑправление: в рабочем процеÑÑе мог произойти segmentation fault, + еÑли иÑпользовалÑÑ Ð¼Ð¾Ð´ÑƒÐ»ÑŒ ngx_http_spdy_module на 32-битных + платформах; ошибка поÑвилаÑÑŒ в 1.5.10. + + *) ИÑправление: значение переменной $upstream_status могло быть + неверным, еÑли иÑпользовалиÑÑŒ директивы proxy_cache_use_stale или + proxy_cache_revalidate. + СпаÑибо Piotr Sikora. + + *) ИÑправление: в рабочем процеÑÑе мог произойти segmentation fault, + еÑли ошибки Ñ ÐºÐ¾Ð´Ð¾Ð¼ 400 Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ директивы error_page + перенаправлÑлиÑÑŒ в именованный location. + + *) ИÑправление: nginx/Windows не ÑобиралÑÑ Ñ Visual Studio 2013. + + +Ð˜Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² nginx 1.5.10 04.02.2014 + + *) Добавление: модуль ngx_http_spdy_module теперь иÑпользует протокол + SPDY 3.1. + СпаÑибо Automattic и MaxCDN за ÑпонÑирование разработки. + + *) Добавление: модуль ngx_http_mp4_module теперь пропуÑкает дорожки, + имеющие меньшую длину, чем Ð·Ð°Ð¿Ñ€Ð¾ÑˆÐµÐ½Ð½Ð°Ñ Ð¿ÐµÑ€ÐµÐ¼Ð¾Ñ‚ÐºÐ°. + + *) ИÑправление: в рабочем процеÑÑе мог произойти segmentation fault, + еÑли Ð¿ÐµÑ€ÐµÐ¼ÐµÐ½Ð½Ð°Ñ $ssl_session_id иÑпользовалаÑÑŒ при логгировании; + ошибка поÑвилаÑÑŒ в 1.5.9. + + *) ИÑправление: переменные $date_local и $date_gmt иÑпользовали неверный + формат вне Ð¼Ð¾Ð´ÑƒÐ»Ñ ngx_http_ssi_filter_module. + + *) ИÑправление: клиентÑкие ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ð¼Ð¾Ð³Ð»Ð¸ Ñразу закрыватьÑÑ, еÑли + иÑпользовалÑÑ Ð¾Ñ‚Ð»Ð¾Ð¶ÐµÐ½Ð½Ñ‹Ð¹ accept; ошибка поÑвилаÑÑŒ в 1.3.15. + + *) ИÑправление: ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ "getsockopt(TCP_FASTOPEN) ... failed" + запиÑывалиÑÑŒ в лог в процеÑÑе Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð¸ÑполнÑемого файла на Linux; + ошибка поÑвилаÑÑŒ в 1.5.8. + СпаÑибо Piotr Sikora. + + +Ð˜Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² nginx 1.5.9 22.01.2014 + + *) Изменение: теперь в заголовке X-Accel-Redirect nginx ожидает + закодированный URI. + + *) Добавление: директива ssl_buffer_size. + + *) Добавление: директиву limit_rate теперь можно иÑпользовать Ð´Ð»Ñ + Ð¾Ð³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸Ñ ÑкороÑти передачи ответов клиенту в SPDY-ÑоединениÑÑ…. + + *) Добавление: директива spdy_chunk_size. + + *) Добавление: директива ssl_session_tickets. + СпаÑибо Dirkjan Bussink. + + *) ИÑправление: Ð¿ÐµÑ€ÐµÐ¼ÐµÐ½Ð½Ð°Ñ $ssl_session_id Ñодержала вÑÑŽ ÑеÑÑию в + Ñериализованном виде вмеÑто её идентификатора. + СпаÑибо Ivan Ristić. + + *) ИÑправление: nginx неправильно обрабатывал закодированный Ñимвол "?" + в команде SSI include. + + *) ИÑправление: модуль ngx_http_dav_module не раÑкодировал целевой URI + при обработке методов COPY и MOVE. + + *) ИÑправление: resolver не понимал доменные имена Ñ Ñ‚Ð¾Ñ‡ÐºÐ¾Ð¹ в конце. + СпаÑибо Yichun Zhang. + + *) ИÑправление: при прокÑировании в логах могли поÑвлÑтьÑÑ ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ + "zero size buf in output"; ошибка поÑвилаÑÑŒ в 1.3.9. + + *) ИÑправление: в рабочем процеÑÑе мог произойти segmentation fault, + еÑли иÑпользовалÑÑ Ð¼Ð¾Ð´ÑƒÐ»ÑŒ ngx_http_spdy_module. + + *) ИÑправление: при иÑпользовании методов обработки Ñоединений select, + poll и /dev/poll прокÑируемые WebSocket-ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ð¼Ð¾Ð³Ð»Ð¸ завиÑать + Ñразу поÑле открытиÑ. + + *) ИÑправление: директива xclient почтового прокÑи-Ñервера некорректно + передавала IPv6-адреÑа. + + +Ð˜Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² nginx 1.5.8 17.12.2013 + + *) Добавление: теперь resolver поддерживает IPv6. + + *) Добавление: директива listen поддерживает параметр fastopen. + СпаÑибо Mathew Rodley. + + *) Добавление: поддержка SSL в модуле ngx_http_uwsgi_module. + СпаÑибо Roberto De Ioris. + + *) Добавление: Ñкрипты подÑветки ÑинтакÑиÑа Ð´Ð»Ñ vim добавлены в contrib. + СпаÑибо Evan Miller. + + *) ИÑправление: при чтении тела запроÑа Ñ Ð¸Ñпользованием chunked + transfer encoding по SSL-Ñоединению мог произойти таймаут. + + *) ИÑправление: директива master_process работала неправильно в + nginx/Windows. + + *) ИÑправление: параметр setfib директивы listen мог не работать. + + *) ИÑправление: в модуле ngx_http_spdy_module. + + +Ð˜Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² nginx 1.5.7 19.11.2013 + + *) БезопаÑноÑть: Ñимвол, Ñледующий за незакодированным пробелом в Ñтроке + запроÑа, обрабатывалÑÑ Ð½ÐµÐ¿Ñ€Ð°Ð²Ð¸Ð»ÑŒÐ½Ð¾ (CVE-2013-4547); ошибка поÑвилаÑÑŒ + в 0.8.41. + СпаÑибо Ivan Fratric из Google Security Team. + + *) Изменение: уровень Ð»Ð¾Ð³Ð³Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¾ÑˆÐ¸Ð±Ð¾Ðº auth_basic об отÑутÑтвии + Ð¿Ð°Ñ€Ð¾Ð»Ñ Ð¿Ð¾Ð½Ð¸Ð¶ÐµÐ½ Ñ ÑƒÑ€Ð¾Ð²Ð½Ñ error до info. + + *) Добавление: директивы proxy_cache_revalidate, + fastcgi_cache_revalidate, scgi_cache_revalidate и + uwsgi_cache_revalidate. + + *) Добавление: директива ssl_session_ticket_key. + СпаÑибо Piotr Sikora. + + *) ИÑправление: директива "add_header Cache-Control ''" добавлÑла Ñтроку + заголовка ответа "Cache-Control" Ñ Ð¿ÑƒÑтым значением. + + *) ИÑправление: директива "satisfy any" могла вернуть ошибку 403 вмеÑто + 401 при иÑпользовании директив auth_request и auth_basic. + СпаÑибо Jan Marc Hoffmann. + + *) ИÑправление: параметры accept_filter и deferred директивы listen + игнорировалиÑÑŒ Ð´Ð»Ñ listen-Ñокетов, Ñоздаваемых в процеÑÑе Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ + иÑполнÑемого файла. + СпаÑибо Piotr Sikora. + + *) ИÑправление: чаÑть данных, полученных от бÑкенда при + небуферизированном прокÑировании, могла не отправлÑтьÑÑ ÐºÐ»Ð¸ÐµÐ½Ñ‚Ñƒ + Ñразу, еÑли иÑпользовалиÑÑŒ директивы gzip или gunzip. + СпаÑибо Yichun Zhang. + + *) ИÑправление: в обработке ошибок в модуле + ngx_http_gunzip_filter_module. + + *) ИÑправление: ответы могли завиÑать, еÑли иÑпользовалÑÑ Ð¼Ð¾Ð´ÑƒÐ»ÑŒ + ngx_http_spdy_module и директива auth_request. + + *) ИÑправление: утечки памÑти в nginx/Windows. + + +Ð˜Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² nginx 1.5.6 01.10.2013 + + *) Добавление: директива fastcgi_buffering. + + *) Добавление: директивы proxy_ssl_protocols и proxy_ssl_ciphers. + СпаÑибо Piotr Sikora. + + *) Добавление: Ð¾Ð¿Ñ‚Ð¸Ð¼Ð¸Ð·Ð°Ñ†Ð¸Ñ SSL handshake при иÑпользовании длинных + цепочек Ñертификатов. + + *) Добавление: почтовый прокÑи-Ñервер поддерживает SMTP pipelining. + + *) ИÑправление: в модуле ngx_http_auth_basic_module при иÑпользовании + метода ÑˆÐ¸Ñ„Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¿Ð°Ñ€Ð¾Ð»ÐµÐ¹ "$apr1$". + СпаÑибо Markus Linnala. + + *) ИÑправление: на MacOSX, Cygwin и nginx/Windows Ð´Ð»Ñ Ð¾Ð±Ñ€Ð°Ð±Ð¾Ñ‚ÐºÐ¸ запроÑа + мог иÑпользоватьÑÑ Ð½ÐµÐ²ÐµÑ€Ð½Ñ‹Ð¹ location, еÑли Ð´Ð»Ñ Ð·Ð°Ð´Ð°Ð½Ð¸Ñ location'ов + иÑпользовалиÑÑŒ Ñимволы разных региÑтров. + + *) ИÑправление: автоматичеÑкое перенаправление Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸ÐµÐ¼ + завершающего ÑлÑша Ð´Ð»Ñ Ð¿Ñ€Ð¾ÐºÑированных location'ов могло не работать. + + *) ИÑправление: в почтовом прокÑи-Ñервере. + + *) ИÑправление: в модуле ngx_http_spdy_module. + + +Ð˜Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² nginx 1.5.5 17.09.2013 + + *) Изменение: теперь nginx по умолчанию иÑпользует HTTP/1.0, еÑли точно + определить протокол не удалоÑÑŒ. + + *) Добавление: директива disable_symlinks теперь иÑпользует O_PATH на + Linux. + + *) Добавление: Ð´Ð»Ñ Ð¾Ð¿Ñ€ÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ Ñ‚Ð¾Ð³Ð¾, что клиент закрыл Ñоединение, при + иÑпользовании метода epoll теперь иÑпользуютÑÑ ÑÐ¾Ð±Ñ‹Ñ‚Ð¸Ñ EPOLLRDHUP. + + *) ИÑправление: в директиве valid_referers при иÑпользовании параметра + server_names. + + *) ИÑправление: Ð¿ÐµÑ€ÐµÐ¼ÐµÐ½Ð½Ð°Ñ $request_time не работала в nginx/Windows. + + *) ИÑправление: в директиве image_filter. + СпаÑибо Lanshun Zhou. + + *) ИÑправление: ÑовмеÑтимоÑть Ñ OpenSSL 1.0.1f. + СпаÑибо Piotr Sikora. + + +Ð˜Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² nginx 1.5.4 27.08.2013 + + *) Изменение: MIME-тип Ð´Ð»Ñ Ñ€Ð°ÑÑˆÐ¸Ñ€ÐµÐ½Ð¸Ñ js изменён на + "application/javascript"; значение по умолчанию директивы + charset_types изменено ÑоответÑтвенно. + + *) Изменение: теперь директива image_filter Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð¾Ð¼ size возвращает + ответ Ñ MIME-типом "application/json". + + *) Добавление: модуль ngx_http_auth_request_module. + + *) ИÑправление: на Ñтарте или во Ð²Ñ€ÐµÐ¼Ñ Ð¿ÐµÑ€ÐµÐºÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ð¸ мог произойти + segmentation fault, еÑли иÑпользовалаÑÑŒ директива try_files Ñ Ð¿ÑƒÑтым + параметром. + + *) ИÑправление: утечки памÑти при иÑпользовании в директивах root и + auth_basic_user_file отноÑительных путей, заданных Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ + переменных. + + *) ИÑправление: директива valid_referers неправильно выполнÑла + регулÑрные выражениÑ, еÑли заголовок Referer начиналÑÑ Ñ "https://". + СпаÑибо Liangbin Li. + + *) ИÑправление: ответы могли завиÑать, еÑли иÑпользовалиÑÑŒ подзапроÑÑ‹ и + при обработке подзапроÑа проиÑходила ошибка во Ð²Ñ€ÐµÐ¼Ñ SSL handshake Ñ + бÑкендом. + СпаÑибо Aviram Cohen. + + *) ИÑправление: в модуле ngx_http_autoindex_module. + + *) ИÑправление: в модуле ngx_http_spdy_module. + + +Ð˜Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² nginx 1.5.3 30.07.2013 + + *) Изменение во внутреннем API: теперь при небуферизированной работе Ñ + бÑкендами u->length по умолчанию уÑтанавливаетÑÑ Ð² -1. + + *) Изменение: теперь при получении неполного ответа от бÑкенда nginx + отправлÑет полученную чаÑть ответа, поÑле чего закрывает Ñоединение Ñ + клиентом. + + *) ИÑправление: в рабочем процеÑÑе мог произойти segmentation fault, + еÑли иÑпользовалÑÑ Ð¼Ð¾Ð´ÑƒÐ»ÑŒ ngx_http_spdy_module и директива + client_body_in_file_only. + + *) ИÑправление: параметр so_keepalive директивы listen мог работать + некорректно на DragonFlyBSD. + СпаÑибо Sepherosa Ziehau. + + *) ИÑправление: в модуле ngx_http_xslt_filter_module. + + *) ИÑправление: в модуле ngx_http_sub_filter_module. + + +Ð˜Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² nginx 1.5.2 02.07.2013 + + *) Добавление: теперь можно иÑпользовать неÑколько директив error_log. + + *) ИÑправление: метод $r->header_in() вÑтроенного перла не возвращал + Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ñтрок "Cookie" и "X-Forwarded-For" из заголовка запроÑа; + ошибка поÑвилаÑÑŒ в 1.3.14. + + *) ИÑправление: в модуле ngx_http_spdy_module. + СпаÑибо Jim Radford. + + *) ИÑправление: nginx не ÑобиралÑÑ Ð½Ð° Linux при иÑпользовании x32 ABI. + СпаÑибо Сергею Иванцову. + + +Ð˜Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² nginx 1.5.1 04.06.2013 + + *) Добавление: директивы ssi_last_modified, sub_filter_last_modified и + xslt_last_modified. + СпаÑибо ÐлекÑею Колпакову. + + *) Добавление: параметр http_403 в директивах proxy_next_upstream, + fastcgi_next_upstream, scgi_next_upstream и uwsgi_next_upstream. + + *) Добавление: директивы allow и deny теперь поддерживают unix domain + Ñокеты. + + *) ИÑправление: nginx не ÑобиралÑÑ Ñ Ð¼Ð¾Ð´ÑƒÐ»ÐµÐ¼ ngx_mail_ssl_module, но без + Ð¼Ð¾Ð´ÑƒÐ»Ñ ngx_http_ssl_module; ошибка поÑвилаÑÑŒ в 1.3.14. + + *) ИÑправление: в директиве proxy_set_body. + СпаÑибо Lanshun Zhou. + + *) ИÑправление: в директиве lingering_time. + СпаÑибо Lanshun Zhou. + + *) ИÑправление: параметр fail_timeout директивы server в блоке upstream + мог не работать, еÑли иÑпользовалÑÑ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€ max_fails; ошибка + поÑвилаÑÑŒ в 1.3.0. + + *) ИÑправление: в рабочем процеÑÑе мог произойти segmentation fault, + еÑли иÑпользовалаÑÑŒ директива ssl_stapling. + СпаÑибо Piotr Sikora. + + *) ИÑправление: в почтовом прокÑи-Ñервере. + СпаÑибо Filipe Da Silva. + + *) ИÑправление: nginx/Windows мог переÑтать принимать ÑоединениÑ, еÑли + иÑпользовалоÑÑŒ неÑколько рабочих процеÑÑов. + + +Ð˜Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² nginx 1.5.0 07.05.2013 + + *) БезопаÑноÑть: при обработке Ñпециально Ñозданного запроÑа мог + перезапиÑыватьÑÑ Ñтек рабочего процеÑÑа, что могло приводить к + выполнению произвольного кода (CVE-2013-2028); ошибка поÑвилаÑÑŒ в + 1.3.9. + СпаÑибо Greg MacManus, iSIGHT Partners Labs. + + +Ð˜Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² nginx 1.4.0 24.04.2013 + + *) ИÑправление: nginx не ÑобиралÑÑ Ñ Ð¼Ð¾Ð´ÑƒÐ»ÐµÐ¼ ngx_http_perl_module, еÑли + иÑпользовалÑÑ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€ --with-openssl; ошибка поÑвилаÑÑŒ в 1.3.16. + + *) ИÑправление: в работе Ñ Ñ‚ÐµÐ»Ð¾Ð¼ запроÑа из Ð¼Ð¾Ð´ÑƒÐ»Ñ ngx_http_perl_module; + ошибка поÑвилаÑÑŒ в 1.3.9. + + +Ð˜Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² nginx 1.3.16 16.04.2013 + + *) ИÑправление: в рабочем процеÑÑе мог произойти segmentation fault, + еÑли иÑпользовалиÑÑŒ подзапроÑÑ‹; ошибка поÑвилаÑÑŒ в 1.3.9. + + *) ИÑправление: директива tcp_nodelay вызывала ошибку при прокÑировании + WebSocket-Ñоединений в unix domain Ñокет. + + *) ИÑправление: Ð¿ÐµÑ€ÐµÐ¼ÐµÐ½Ð½Ð°Ñ $upstream_response_length возвращала значение + "0", еÑли не иÑпользовалаÑÑŒ буферизациÑ. + СпаÑибо Piotr Sikora. + + *) ИÑправление: в методах обработки Ñоединений eventport и /dev/poll. + + +Ð˜Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² nginx 1.3.15 26.03.2013 + + *) Изменение: открытие и закрытие ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ð±ÐµÐ· отправки в нём + каких-либо данных больше не запиÑываетÑÑ Ð² access_log Ñ ÐºÐ¾Ð´Ð¾Ð¼ ошибки + 400. + + *) Добавление: модуль ngx_http_spdy_module. + СпаÑибо Automattic за ÑпонÑирование разработки. + + *) Добавление: директивы limit_req_status и limit_conn_status. + СпаÑибо Nick Marden. + + *) Добавление: директива image_filter_interlace. + СпаÑибо Ивану Боброву. + + *) Добавление: Ð¿ÐµÑ€ÐµÐ¼ÐµÐ½Ð½Ð°Ñ $connections_waiting в модуле + ngx_http_stub_status_module. + + *) Добавление: теперь почтовый прокÑи-Ñервер поддерживает IPv6-бÑкенды. + + *) ИÑправление: при повторной отправке запроÑа на бÑкенд тело запроÑа + могло передаватьÑÑ Ð½ÐµÐ¿Ñ€Ð°Ð²Ð¸Ð»ÑŒÐ½Ð¾; ошибка поÑвилаÑÑŒ в 1.3.9. + СпаÑибо Piotr Sikora. + + *) ИÑправление: в директиве client_body_in_file_only; ошибка поÑвилаÑÑŒ в + 1.3.9. + + *) ИÑправление: ответы могли завиÑать, еÑли иÑпользовалиÑÑŒ подзапроÑÑ‹ и + при обработке подзапроÑа проиÑходила DNS-ошибка. + СпаÑибо Lanshun Zhou. + + *) ИÑправление: в процедуре учёта иÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð±Ñкендов. + + +Ð˜Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² nginx 1.3.14 05.03.2013 + + *) Добавление: переменные $connections_active, $connections_reading и + $connections_writing в модуле ngx_http_stub_status_module. + + *) Добавление: поддержка WebSocket-Ñоединений в модулÑÑ… + ngx_http_uwsgi_module и ngx_http_scgi_module. + + *) ИÑправление: в обработке виртуальных Ñерверов при иÑпользовании SNI. + + *) ИÑправление: при иÑпользовании директивы "ssl_session_cache shared" + новые ÑеÑÑии могли не ÑохранÑтьÑÑ, еÑли заканчивалоÑÑŒ меÑто в + разделÑемой памÑти. + СпаÑибо Piotr Sikora. + + *) ИÑправление: неÑколько заголовков X-Forwarded-For обрабатывалиÑÑŒ + неправильно. + СпаÑибо Neal Poole за ÑпонÑирование разработки. + + *) ИÑправление: в модуле ngx_http_mp4_module. + СпаÑибо Gernot Vormayr. + + +Ð˜Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² nginx 1.3.13 19.02.2013 + + *) Изменение: теперь Ð´Ð»Ñ Ñборки по умолчанию иÑпользуетÑÑ ÐºÐ¾Ð¼Ð¿Ð¸Ð»Ñтор Ñ + именем "cc". + + *) Добавление: поддержка прокÑÐ¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ WebSocket-Ñоединений. + СпаÑибо Apcera и CloudBees за ÑпонÑирование разработки. + + *) Добавление: директива auth_basic_user_file поддерживает шифрование + паролей методом "{SHA}". + СпаÑибо Louis Opter. + + +Ð˜Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² nginx 1.3.12 05.02.2013 + + *) Добавление: директивы proxy_bind, fastcgi_bind, memcached_bind, + scgi_bind и uwsgi_bind поддерживают переменные. + + *) Добавление: переменные $pipe, $request_length, $time_iso8601 и + $time_local теперь можно иÑпользовать не только в директиве + log_format. + СпаÑибо Kiril Kalchev. + + *) Добавление: поддержка IPv6 в модуле ngx_http_geoip_module. + СпаÑибо Gregor KaliÅ¡nik. + + *) ИÑправление: директива proxy_method работала неверно, еÑли была + указана на уровне http. + + *) ИÑправление: в рабочем процеÑÑе мог произойти segmentation fault, + еÑли иÑпользовалÑÑ resolver и метод poll. + + *) ИÑправление: nginx мог нагружать процеÑÑор во Ð²Ñ€ÐµÐ¼Ñ SSL handshake Ñ + бÑкендом при иÑпользовании методов обработки Ñоединений select, poll + и /dev/poll. + + *) ИÑправление: ошибка "[crit] SSL_write() failed (SSL:)". + + *) ИÑправление: в директиве client_body_in_file_only; ошибка поÑвилаÑÑŒ в + 1.3.9. + + *) ИÑправление: в директиве fastcgi_keep_conn. + + +Ð˜Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² nginx 1.3.11 10.01.2013 + + *) ИÑправление: при запиÑи в лог мог проиÑходить segmentation fault; + ошибка поÑвилаÑÑŒ в 1.3.10. + + *) ИÑправление: директива proxy_pass не работала Ñ IP-адреÑами без + Ñвного ÑƒÐºÐ°Ð·Ð°Ð½Ð¸Ñ Ð¿Ð¾Ñ€Ñ‚Ð°; ошибка поÑвилаÑÑŒ в 1.3.10. + + *) ИÑправление: на Ñтарте или во Ð²Ñ€ÐµÐ¼Ñ Ð¿ÐµÑ€ÐµÐºÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ð¸ проиÑходил + segmentation fault, еÑли директива keepalive была указана неÑколько + раз в одном блоке upstream. + + *) ИÑправление: параметр default директивы geo не определÑл значение по + умолчанию Ð´Ð»Ñ IPv6-адреÑов. + + +Ð˜Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² nginx 1.3.10 25.12.2012 + + *) Изменение: Ð´Ð»Ñ ÑƒÐºÐ°Ð·Ð°Ð½Ð½Ñ‹Ñ… в конфигурационном файле доменных имён + теперь иÑпользуютÑÑ Ð½Ðµ только IPv4, но и IPv6 адреÑа. + + *) Изменение: теперь при иÑпользовании директивы include Ñ Ð¼Ð°Ñкой на + Unix-ÑиÑтемах включаемые файлы ÑортируютÑÑ Ð² алфавитном порÑдке. + + *) Изменение: директива add_header добавлÑет Ñтроки в ответы Ñ ÐºÐ¾Ð´Ð¾Ð¼ + 201. + + *) Добавление: директива geo теперь поддерживает IPv6 адреÑа в формате + CIDR. + + *) Добавление: параметры flush и gzip в директиве access_log. + + *) Добавление: директива auth_basic поддерживает переменные. + + *) ИÑправление: nginx в некоторых ÑлучаÑÑ… не ÑобиралÑÑ Ñ Ð¼Ð¾Ð´ÑƒÐ»ÐµÐ¼ + ngx_http_perl_module. + + *) ИÑправление: в рабочем процеÑÑе мог произойти segmentation fault, + еÑли иÑпользовалÑÑ Ð¼Ð¾Ð´ÑƒÐ»ÑŒ ngx_http_xslt_module. + + *) ИÑправление: nginx мог не ÑобиратьÑÑ Ð½Ð° MacOSX. + СпаÑибо Piotr Sikora. + + *) ИÑправление: при иÑпользовании директивы limit_rate Ñ Ð±Ð¾Ð»ÑŒÑˆÐ¸Ð¼Ð¸ + значениÑми ÑкороÑти на 32-битных ÑиÑтемах ответ мог возвращатьÑÑ Ð½Ðµ + целиком. + СпаÑибо ÐлекÑею Ðнтропову. + + *) ИÑправление: в рабочем процеÑÑе мог произойти segmentation fault, + еÑли иÑпользовалаÑÑŒ директива if. + СпаÑибо Piotr Sikora. + + *) ИÑправление: ответ "100 Continue" выдавалÑÑ Ð²Ð¼ÐµÑте Ñ Ð¾Ñ‚Ð²ÐµÑ‚Ð¾Ð¼ "413 + Request Entity Too Large". + + *) ИÑправление: директивы image_filter, image_filter_jpeg_quality и + image_filter_sharpen могли наÑледоватьÑÑ Ð½ÐµÐºÐ¾Ñ€Ñ€ÐµÐºÑ‚Ð½Ð¾. + СпаÑибо Ивану Боброву. + + *) ИÑправление: при иÑпользовании директивы auth_basic под Linux могли + возникать ошибки "crypt_r() failed". + + *) ИÑправление: в обработке backup-Ñерверов. + СпаÑибо Thomas Chen. + + *) ИÑправление: при прокÑировании HEAD-запроÑов мог возвращатьÑÑ + некорректный ответ, еÑли иÑпользовалаÑÑŒ директива gzip. + + +Ð˜Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² nginx 1.3.9 27.11.2012 + + *) Добавление: поддержка chunked transfer encoding при получении тела + запроÑа. + + *) Добавление: переменные $request_time и $msec теперь можно + иÑпользовать не только в директиве log_format. + + *) ИÑправление: cache manager и cache loader могли не запуÑкатьÑÑ, еÑли + иÑпользовалоÑÑŒ более 512 listen-Ñокетов. + + *) ИÑправление: в модуле ngx_http_dav_module. + + +Ð˜Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² nginx 1.3.8 30.10.2012 + + *) Добавление: параметр optional_no_ca директивы ssl_verify_client. + СпаÑибо Михаилу Казанцеву и Eric O'Connor. + + *) Добавление: переменные $bytes_sent, $connection и + $connection_requests теперь можно иÑпользовать не только в директиве + log_format. + СпаÑибо Benjamin Grössing. + + *) Добавление: параметр auto директивы worker_processes. + + *) ИÑправление: ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ "cache file ... has md5 collision". + + *) ИÑправление: в модуле ngx_http_gunzip_filter_module. + + *) ИÑправление: в директиве ssl_stapling. + + +Ð˜Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² nginx 1.3.7 02.10.2012 + + *) Добавление: поддержка OCSP stapling. + СпаÑибо Comodo, DigiCert и GlobalSign за ÑпонÑирование разработки. + + *) Добавление: директива ssl_trusted_certificate. + + *) Добавление: теперь resolver Ñлучайным образом менÑет порÑдок + возвращаемых закÑшированных адреÑов. + СпаÑибо Ðнтону Жулину. + + *) ИÑправление: ÑовмеÑтимоÑть Ñ OpenSSL 0.9.7. + + +Ð˜Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² nginx 1.3.6 12.09.2012 + + *) Добавление: модуль ngx_http_gunzip_filter_module. + + *) Добавление: директива memcached_gzip_flag. + + *) Добавление: параметр always директивы gzip_static. + + *) ИÑправление: в директиве "limit_req"; ошибка поÑвилаÑÑŒ в 1.1.14. + СпаÑибо Charles Chen. + + *) ИÑправление: nginx не ÑобиралÑÑ gcc 4.7 Ñ Ð¾Ð¿Ñ‚Ð¸Ð¼Ð¸Ð·Ð°Ñ†Ð¸ÐµÐ¹ -O2 еÑли + иÑпользовалÑÑ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€ --with-ipv6. + + +Ð˜Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² nginx 1.3.5 21.08.2012 + + *) Изменение: модуль ngx_http_mp4_module больше не отфильтровывает + дорожки в форматах, отличных от H.264 и AAC. + + *) ИÑправление: в рабочем процеÑÑе мог произойти segmentation fault, + еÑли в директиве map в качеÑтве значений иÑпользовалиÑÑŒ переменные. + + *) ИÑправление: в рабочем процеÑÑе мог произойти segmentation fault при + иÑпользовании директивы geo Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð¾Ð¼ ranges, но без параметра + default; ошибка поÑвилаÑÑŒ в 0.8.43. + СпаÑибо Zhen Chen и Weibin Yao. + + *) ИÑправление: в обработке параметра командной Ñтроки -p. + + *) ИÑправление: в почтовом прокÑи-Ñервере. + + *) ИÑправление: незначительных потенциальных ошибок. + СпаÑибо Coverity. + + *) ИÑправление: nginx/Windows не ÑобиралÑÑ Ñ Visual Studio 2005 Express. + СпаÑибо HAYASHI Kentaro. + + +Ð˜Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² nginx 1.3.4 31.07.2012 + + *) Изменение: теперь на Ñлушающих IPv6-Ñокетах параметр ipv6only включён + по умолчанию. + + *) Добавление: поддержка компилÑтора Clang. + + *) ИÑправление: могли ÑоздаватьÑÑ Ð»Ð¸ÑˆÐ½Ð¸Ðµ Ñлушающие Ñокеты. + СпаÑибо Роману ОдайÑкому. + + *) ИÑправление: nginx/Windows мог нагружать процеÑÑор, еÑли при запуÑке + рабочего процеÑÑа проиÑходила ошибка. + СпаÑибо Ricardo Villalobos Guevara. + + *) ИÑправление: директивы proxy_pass_header, fastcgi_pass_header, + scgi_pass_header, uwsgi_pass_header, proxy_hide_header, + fastcgi_hide_header, scgi_hide_header и uwsgi_hide_header могли + наÑледоватьÑÑ Ð½ÐµÐºÐ¾Ñ€Ñ€ÐµÐºÑ‚Ð½Ð¾. + + +Ð˜Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² nginx 1.3.3 10.07.2012 + + *) Добавление: поддержка entity tags и директива etag. + + *) ИÑправление: при иÑпользовании директивы map Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð¾Ð¼ hostnames + не игнорировалаÑÑŒ ÐºÐ¾Ð½ÐµÑ‡Ð½Ð°Ñ Ñ‚Ð¾Ñ‡ÐºÐ° в иÑходном значении. + + *) ИÑправление: Ð´Ð»Ñ Ð¾Ð±Ñ€Ð°Ð±Ð¾Ñ‚ÐºÐ¸ запроÑа мог иÑпользоватьÑÑ Ð½ÐµÐ²ÐµÑ€Ð½Ñ‹Ð¹ + location, еÑли переход в именованный location проиÑходил поÑле + Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ URI Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ директивы rewrite. + + +Ð˜Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² nginx 1.3.2 26.06.2012 + + *) Изменение: параметр single директивы keepalive теперь игнорируетÑÑ. + + *) Изменение: Ñжатие SSL теперь отключено в том чиÑле при иÑпользовании + OpenSSL Ñтарее 1.0.0. + + *) Добавление: директиву "ip_hash" теперь можно иÑпользовать Ð´Ð»Ñ + баланÑировки IPv6 клиентов. + + *) Добавление: переменную $status теперь можно иÑпользовать не только в + директиве log_format. + + *) ИÑправление: при завершении рабочего процеÑÑа мог произойти + segmentation fault, еÑли иÑпользовалаÑÑŒ директива resolver. + + *) ИÑправление: в рабочем процеÑÑе мог произойти segmentation fault, + еÑли иÑпользовалÑÑ Ð¼Ð¾Ð´ÑƒÐ»ÑŒ ngx_http_mp4_module. + + *) ИÑправление: в модуле ngx_http_mp4_module. + + *) ИÑправление: в рабочем процеÑÑе мог произойти segmentation fault, + еÑли иÑпользовалиÑÑŒ конфликтующие имена Ñерверов Ñ Ð¼Ð°Ñками. + + *) ИÑправление: на платформе ARM nginx мог аварийно завершатьÑÑ Ð¿Ð¾ + Ñигналу SIGBUS. + + *) ИÑправление: во Ð²Ñ€ÐµÐ¼Ñ Ð¿ÐµÑ€ÐµÐºÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ð¸ на HP-UX в лог запиÑывалÑÑ + alert "sendmsg() failed (9: Bad file number)". + + +Ð˜Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² nginx 1.3.1 05.06.2012 *) БезопаÑноÑть: теперь nginx/Windows игнорирует точку в конце компонента URI и не разрешает URI, Ñодержащие поÑледовательноÑть ":$". СпаÑибо Владимиру Кочеткову, Positive Research Center. + *) Добавление: директивы proxy_pass, fastcgi_pass, scgi_pass, uwsgi_pass + и директива server в блоке upstream теперь поддерживают IPv6-адреÑа. + + *) Добавление: в директиве resolver теперь можно указывать порт и + задавать IPv6-адреÑа DNS-Ñерверов. + + *) Добавление: директива least_conn в блоке upstream. + + *) Добавление: при иÑпользовании директивы ip_hash теперь можно задавать + веÑа Ñерверов. + + *) ИÑправление: в рабочем процеÑÑе мог произойти segmentation fault, + еÑли иÑпользовалаÑÑŒ директива image_filter; ошибка поÑвилаÑÑŒ в 1.3.0. + + *) ИÑправление: nginx не ÑобиралÑÑ Ñ Ð¼Ð¾Ð´ÑƒÐ»ÐµÐ¼ ngx_cpp_test_module; ошибка + поÑвилаÑÑŒ в 1.1.12. + + *) ИÑправление: доÑтуп к переменным из SSI и вÑтроенного перла мог не + работать поÑле переконфигурации. + СпаÑибо Yichun Zhang. + + *) ИÑправление: в модуле ngx_http_xslt_filter_module. + СпаÑибо Kuramoto Eiji. + + *) ИÑправление: утечки памÑти при иÑпользовании переменной $geoip_org. + СпаÑибо ДениÑу Латыпову. + + *) ИÑправление: в директивах proxy_cookie_domain и proxy_cookie_path. + + +Ð˜Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² nginx 1.3.0 15.05.2012 + *) Добавление: директива debug_connection теперь поддерживает IPv6-адреÑа и параметр "unix:". @@ -767,7 +4139,7 @@ Ð˜Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² nginx 0.9.2 06.12.2010 *) Добавление: поддержка Ñтроки "If-Unmodified-Since" в заголовке - запроÑе клиента. + запроÑа клиента. *) Изменение: иÑпользование accept(), еÑли accept4() не реализован; ошибка поÑвилаÑÑŒ в 0.9.0. @@ -2218,7 +5590,7 @@ умолчанию; ошибка поÑвилаÑÑŒ в 0.7.18. СпаÑибо МакÑиму Дунину. - *) ИÑправление: при прокÑировании SMPT nginx выдавал Ñообщение + *) ИÑправление: при прокÑировании SMTP nginx выдавал Ñообщение "250 2.0.0 OK" вмеÑто "235 2.0.0 OK"; ошибка поÑвилаÑÑŒ в 0.7.22. СпаÑибо МакÑиму Дунину. @@ -2715,7 +6087,7 @@ Ð˜Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² nginx 0.6.31 12.05.2008 *) ИÑправление: nginx не обрабатывал ответ FastCGI-Ñервера, еÑли Ñтрока - заголовка ответ была в конце запиÑи FastCGI; ошибка поÑвилаÑÑŒ в + заголовка ответа была в конце запиÑи FastCGI; ошибка поÑвилаÑÑŒ в 0.6.2. СпаÑибо Сергею Серову. @@ -3515,7 +6887,8 @@ Ð˜Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² nginx 0.5.15 19.03.2007 *) Добавление: почтовый прокÑи-Ñервер поддерживает аутентифицированное - SMTP-прокÑирование и директивы smtp_auth, smtp_capablities и xclient. + SMTP-прокÑирование и директивы smtp_auth, smtp_capabilities и + xclient. СпаÑибо Ðнтону Южанинову и МакÑиму Дунину. *) Добавление: теперь keep-alive ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ð·Ð°ÐºÑ€Ñ‹Ð²Ð°ÑŽÑ‚ÑÑ Ñразу же по @@ -3791,7 +7164,7 @@ *) Добавление: директива ip_hash в блоке upstream. - *) Добавление: ÑÑ‚Ð°Ñ‚ÑƒÑ WAIT в Ñтроке "Auth-Status" в заголовка ответа + *) Добавление: ÑÑ‚Ð°Ñ‚ÑƒÑ WAIT в Ñтроке "Auth-Status" в заголовке ответа Ñервера аутентификации IMAP/POP3 прокÑи. *) ИÑправление: nginx не ÑобиралÑÑ Ð½Ð° 64-битных платформах; ошибка @@ -3865,7 +7238,7 @@ Ð˜Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² nginx 0.4.11 25.10.2006 - *) Добавление: POP3 прокÑи поддерживает AUTH LOIGN PLAIN и CRAM-MD5. + *) Добавление: POP3 прокÑи поддерживает AUTH LOGIN PLAIN и CRAM-MD5. *) Добавление: модуль ngx_http_perl_module поддерживает метод $r->allow_ranges. @@ -4720,7 +8093,7 @@ *) Добавление: директива so_keepalive в IMAP/POP3 прокÑи. *) ИÑправление: nginx теперь вызывает abort() при обнаружении незакрытых - Ñоединений только при планом выходе и включённой директиве + Ñоединений только при плавном выходе и включённой директиве debug_points. @@ -5276,7 +8649,7 @@ Ð˜Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² nginx 0.1.36 15.06.2005 - *) Изменение: еÑли в заголовке запроÑе еÑть дублирующиеÑÑ Ñтроки "Host", + *) Изменение: еÑли в заголовке запроÑа еÑть дублирующиеÑÑ Ñтроки "Host", "Connection", "Content-Length" и "Authorization", то nginx теперь выдаёт ошибку 400. @@ -5704,7 +9077,7 @@ *) ИÑправление: при иÑпользовании SSL Ñжатый ответ мог передаватьÑÑ Ð½Ðµ до конца. - *) ИÑправление: опции TCP_NODELAY, TCP_NOPSUH и TCP_CORK, Ñпецифичные + *) ИÑправление: опции TCP_NODELAY, TCP_NOPUSH и TCP_CORK, Ñпецифичные Ð´Ð»Ñ TCP Ñокетов, не иÑпользуютÑÑ Ð´Ð»Ñ unix domain Ñокетов. *) Добавление: директива rewrite поддерживает перезапиÑывание @@ -5768,7 +9141,7 @@ *) Изменение: еÑли в URI вÑтречалÑÑ Ñимвол %3F, то он ÑчиталÑÑ Ð½Ð°Ñ‡Ð°Ð»Ð¾Ð¼ Ñтроки аргументов. - *) Добавление: поддержка unix domain Ñoкетов в модуле + *) Добавление: поддержка unix domain Ñокетов в модуле ngx_http_proxy_module. *) Добавление: директивы ssl_engine и ssl_ciphers. diff --git a/LICENSE b/LICENSE index 1bfc054..985470e 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,7 @@ /* - * Copyright (C) 2002-2012 Igor Sysoev - * Copyright (C) 2011,2012 Nginx, Inc. + * Copyright (C) 2002-2021 Igor Sysoev + * Copyright (C) 2011-2024 Nginx, Inc. + * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -11,10 +12,10 @@ * 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 + * THIS SOFTWARE IS PROVIDED BY THE 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 + * ARE DISCLAIMED. IN NO EVENT SHALL THE 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) diff --git a/auto/cc/acc b/auto/cc/acc index 6baee67..64fa671 100644 --- a/auto/cc/acc +++ b/auto/cc/acc @@ -12,4 +12,3 @@ CC_TEST_FLAGS="-Ae" PCRE_OPT="$PCRE_OPT -Ae" ZLIB_OPT="$ZLIB_OPT -Ae" -MD5_OPT="$MD5_OPT -Ae" diff --git a/auto/cc/bcc b/auto/cc/bcc index ec82e60..e990a9f 100644 --- a/auto/cc/bcc +++ b/auto/cc/bcc @@ -62,7 +62,6 @@ ngx_include_opt="-I" ngx_objout="-o" ngx_binout="-e" ngx_objext="obj" -ngx_binext=".exe" ngx_long_start='@&&| ' diff --git a/auto/cc/clang b/auto/cc/clang new file mode 100644 index 0000000..a962ee2 --- /dev/null +++ b/auto/cc/clang @@ -0,0 +1,99 @@ + +# Copyright (C) Nginx, Inc. + + +# clang + + +NGX_CLANG_VER=`$CC -v 2>&1 | grep 'version' 2>&1 \ + | sed -n -e 's/^.*clang version \(.*\)/\1/p' \ + -e 's/^.*LLVM version \(.*\)/\1/p'` + +echo " + clang version: $NGX_CLANG_VER" + +have=NGX_COMPILER value="\"clang $NGX_CLANG_VER\"" . auto/define + + +CC_TEST_FLAGS="-pipe" + + +# optimizations + +#NGX_CLANG_OPT="-O2" +#NGX_CLANG_OPT="-Oz" +NGX_CLANG_OPT="-O" + +case $CPU in + pentium) + # optimize for Pentium + CPU_OPT="-march=pentium" + NGX_CPU_CACHE_LINE=32 + ;; + + pentiumpro | pentium3) + # optimize for Pentium Pro, Pentium II and Pentium III + CPU_OPT="-march=pentiumpro" + NGX_CPU_CACHE_LINE=32 + ;; + + pentium4) + # optimize for Pentium 4 + CPU_OPT="-march=pentium4" + NGX_CPU_CACHE_LINE=128 + ;; + + athlon) + # optimize for Athlon + CPU_OPT="-march=athlon" + NGX_CPU_CACHE_LINE=64 + ;; + + opteron) + # optimize for Opteron + CPU_OPT="-march=opteron" + NGX_CPU_CACHE_LINE=64 + ;; + +esac + +CC_AUX_FLAGS="$CC_AUX_FLAGS $CPU_OPT" + + +CFLAGS="$CFLAGS -pipe $CPU_OPT" + +if [ ".$PCRE_OPT" = "." ]; then + PCRE_OPT="-O2 -pipe $CPU_OPT" +else + PCRE_OPT="$PCRE_OPT -pipe" +fi + +if [ ".$ZLIB_OPT" = "." ]; then + ZLIB_OPT="-O2 -pipe $CPU_OPT" +else + ZLIB_OPT="$ZLIB_OPT -pipe" +fi + + +# warnings + +CFLAGS="$CFLAGS $NGX_CLANG_OPT -Wall -Wextra -Wpointer-arith" +CFLAGS="$CFLAGS -Wconditional-uninitialized" +#CFLAGS="$CFLAGS -Wmissing-prototypes" + +# we have a lot of unused function arguments +CFLAGS="$CFLAGS -Wno-unused-parameter" + +# deprecated system OpenSSL library on OS X +if [ "$NGX_SYSTEM" = "Darwin" ]; then + CFLAGS="$CFLAGS -Wno-deprecated-declarations" +fi + +# stop on warning +CFLAGS="$CFLAGS -Werror" + +# debug +CFLAGS="$CFLAGS -g" + +if [ ".$CPP" = "." ]; then + CPP="$CC -E" +fi diff --git a/auto/cc/conf b/auto/cc/conf index c9118f2..ba31cb8 100644 --- a/auto/cc/conf +++ b/auto/cc/conf @@ -5,12 +5,17 @@ LINK="\$(CC)" +MAIN_LINK= +MODULE_LINK="-shared" + ngx_include_opt="-I " ngx_compile_opt="-c" +ngx_pic_opt="-fPIC" ngx_objout="-o " ngx_binout="-o " ngx_objext="o" ngx_binext= +ngx_modext=".so" ngx_long_start= ngx_long_end= @@ -43,6 +48,32 @@ if test -n "$CFLAGS"; then ngx_include_opt="-I" ;; + sunc) + + MAIN_LINK= + MODULE_LINK="-G" + + case "$NGX_MACHINE" in + + i86pc) + NGX_AUX=" src/os/unix/ngx_sunpro_x86.il" + ;; + + sun4u | sun4v) + NGX_AUX=" src/os/unix/ngx_sunpro_sparc64.il" + ;; + + esac + + case $CPU in + + amd64) + NGX_AUX=" src/os/unix/ngx_sunpro_amd64.il" + ;; + + esac + ;; + esac else @@ -56,6 +87,12 @@ else . auto/cc/gcc ;; + clang) + # Clang C compiler + + . auto/cc/clang + ;; + icc) # Intel C++ compiler 7.1, 8.0, 8.1 @@ -80,7 +117,7 @@ else . auto/cc/acc ;; - msvc*) + msvc) # MSVC++ 6.0 SP2, MSVC++ Toolkit 2003 . auto/cc/msvc @@ -127,22 +164,40 @@ if [ "$NGX_PLATFORM" != win32 ]; then fi - ngx_feature="gcc builtin atomic operations" - ngx_feature_name=NGX_HAVE_GCC_ATOMIC - ngx_feature_run=yes + ngx_feature="-Wl,-E switch" + ngx_feature_name= + ngx_feature_run=no ngx_feature_incs= ngx_feature_path= - ngx_feature_libs= - ngx_feature_test="long n = 0; - if (!__sync_bool_compare_and_swap(&n, 0, 1)) - return 1; - if (__sync_fetch_and_add(&n, 1) != 1) - return 1; - if (n != 2) - return 1; - __sync_synchronize();" + ngx_feature_libs=-Wl,-E + ngx_feature_test= . auto/feature + if [ $ngx_found = yes ]; then + MAIN_LINK="-Wl,-E" + fi + + + if [ "$NGX_CC_NAME" = "sunc" ]; then + echo "checking for gcc builtin atomic operations ... disabled" + else + ngx_feature="gcc builtin atomic operations" + ngx_feature_name=NGX_HAVE_GCC_ATOMIC + ngx_feature_run=yes + ngx_feature_incs= + ngx_feature_path= + ngx_feature_libs= + ngx_feature_test="long n = 0; + if (!__sync_bool_compare_and_swap(&n, 0, 1)) + return 1; + if (__sync_fetch_and_add(&n, 1) != 1) + return 1; + if (n != 2) + return 1; + __sync_synchronize();" + . auto/feature + fi + if [ "$NGX_CC_NAME" = "ccc" ]; then echo "checking for C99 variadic macros ... disabled" @@ -158,7 +213,7 @@ if [ "$NGX_PLATFORM" != win32 ]; then var(0, buf, \"%d\", 1); if (buf[0] != '1') return 1" . auto/feature - fi + fi ngx_feature="gcc variadic macros" @@ -174,6 +229,16 @@ if [ "$NGX_PLATFORM" != win32 ]; then . auto/feature + ngx_feature="gcc builtin 64 bit byteswap" + ngx_feature_name="NGX_HAVE_GCC_BSWAP64" + ngx_feature_run=no + ngx_feature_incs= + ngx_feature_path= + ngx_feature_libs= + ngx_feature_test="if (__builtin_bswap64(0)) return 1" + . auto/feature + + # ngx_feature="inline" # ngx_feature_name= # ngx_feature_run=no diff --git a/auto/cc/gcc b/auto/cc/gcc index de666a3..a5c5c18 100644 --- a/auto/cc/gcc +++ b/auto/cc/gcc @@ -128,12 +128,6 @@ else PCRE_OPT="$PCRE_OPT $PIPE" fi -if [ ".$MD5_OPT" = "." ]; then - MD5_OPT="-O2 -fomit-frame-pointer $PIPE $CPU_OPT" -else - MD5_OPT="$MD5_OPT $PIPE" -fi - if [ ".$ZLIB_OPT" = "." ]; then ZLIB_OPT="-O2 -fomit-frame-pointer $PIPE $CPU_OPT" else @@ -149,22 +143,24 @@ CFLAGS="$CFLAGS ${NGX_GCC_OPT:--O} -W" CFLAGS="$CFLAGS -Wall -Wpointer-arith" #CFLAGS="$CFLAGS -Wconversion" #CFLAGS="$CFLAGS -Winline" - +#CFLAGS="$CFLAGS -Wmissing-prototypes" case "$NGX_GCC_VER" in - 3.* | 4.* ) + 2.*) # we have a lot of the unused function arguments - CFLAGS="$CFLAGS -Wno-unused-parameter" - CFLAGS="$CFLAGS -Wunused-function" - CFLAGS="$CFLAGS -Wunused-variable" - CFLAGS="$CFLAGS -Wunused-value" - # 4.2.1 shows the warning in wrong places - #CFLAGS="$CFLAGS -Wunreachable-code" + CFLAGS="$CFLAGS -Wno-unused" ;; *) # we have a lot of the unused function arguments - CFLAGS="$CFLAGS -Wno-unused" + CFLAGS="$CFLAGS -Wno-unused-parameter" + # 4.2.1 shows the warning in wrong places + #CFLAGS="$CFLAGS -Wunreachable-code" + + # deprecated system OpenSSL library on OS X + if [ "$NGX_SYSTEM" = "Darwin" ]; then + CFLAGS="$CFLAGS -Wno-deprecated-declarations" + fi ;; esac diff --git a/auto/cc/icc b/auto/cc/icc index 1d83ed3..c47f6e4 100644 --- a/auto/cc/icc +++ b/auto/cc/icc @@ -43,10 +43,6 @@ if [ ".$PCRE_OPT" = "." ]; then PCRE_OPT="-O $CPU_OPT" fi -if [ ".$MD5_OPT" = "." ]; then - MD5_OPT="-O $CPU_OPT" -fi - if [ ".$ZLIB_OPT" = "." ]; then ZLIB_OPT="-O $CPU_OPT" fi @@ -89,7 +85,7 @@ CFLAGS="$CFLAGS -wd1419" case "$NGX_ICC_VER" in 9.*) - # "cc" clobber ignored, warnings for Liunx's htonl()/htons() + # "cc" clobber ignored, warnings for Linux's htonl()/htons() CFLAGS="$CFLAGS -wd1469" # explicit conversion of a 64-bit integral type to a smaller # integral type @@ -103,7 +99,7 @@ case "$NGX_ICC_VER" in ;; 8.*) - # "cc" clobber ignored, warnings for Liunx's htonl()/htons() + # "cc" clobber ignored, warnings for Linux's htonl()/htons() CFLAGS="$CFLAGS -wd1469" # floating-point equality and inequality comparisons are unreliable, # warning on SvTRUE() diff --git a/auto/cc/msvc b/auto/cc/msvc index a99d5a9..567bac7 100644 --- a/auto/cc/msvc +++ b/auto/cc/msvc @@ -3,9 +3,39 @@ # Copyright (C) Nginx, Inc. -# MSVC 6.0 SP2 -# MSVC Toolkit 2003 (7.1) -# MSVC 2005 Express Edition SP1 (8.0) +# MSVC 6.0 SP2 cl 12.00 +# MSVC Toolkit 2003 (7.1) cl 13.10 +# MSVC 2005 Express Edition SP1 (8.0) cl 14.00 +# MSVC 2008 Express Edition (9.0) cl 15.00 +# MSVC 2010 (10.0) cl 16.00 +# MSVC 2015 (14.0) cl 19.00 + + +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" + +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 @@ -73,9 +103,6 @@ CFLAGS="$CFLAGS -WX" # disable logo CFLAGS="$CFLAGS -nologo" - -LINK="\$(CC)" - # the link flags CORE_LINK="$CORE_LINK -link -verbose:lib" @@ -93,22 +120,23 @@ CORE_LIBS="$CORE_LIBS kernel32.lib user32.lib" #CORE_LINK="$CORE_LINK -subsystem:windows -entry:mainCRTStartup" # debug -# msvc8 under Wine issues -# Program database manager mismatch; please check your installation -if [ $NGX_CC_NAME != msvc8 ]; then - CFLAGS="$CFLAGS -Zi" +# msvc under Wine issues +# C1902: Program database manager mismatch; please check your installation +if [ -z "$NGX_WINE" ]; then + CFLAGS="$CFLAGS -Zi -Fd$NGX_OBJS/nginx.pdb" CORE_LINK="$CORE_LINK -debug" fi # MSVC 2005 supports C99 variadic macros -if [ $NGX_CC_NAME = msvc8 ]; then - have=NGX_HAVE_C99_VARIADIC_MACROS . auto/have +if [ "$ngx_msvc_ver" -ge 14 ]; then + have=NGX_HAVE_C99_VARIADIC_MACROS . auto/have fi # precompiled headers CORE_DEPS="$CORE_DEPS $NGX_OBJS/ngx_config.pch" +CORE_LINK="$CORE_LINK $NGX_OBJS/ngx_pch.obj" NGX_PCH="$NGX_OBJS/ngx_config.pch" NGX_BUILD_PCH="-Ycngx_config.h -Fp$NGX_OBJS/ngx_config.pch" NGX_USE_PCH="-Yungx_config.h -Fp$NGX_OBJS/ngx_config.pch" @@ -120,10 +148,15 @@ NGX_RCC="rc -fo$NGX_RES \$(CORE_INCS) $NGX_WIN32_RC" CORE_LINK="$NGX_RES $CORE_LINK" +# dynamic modules +#MAIN_LINK="-link -def:$NGX_OBJS/nginx.def" +#MODULE_LINK="-LD $NGX_OBJS/nginx.lib" + + +ngx_pic_opt= ngx_objout="-Fo" ngx_binout="-Fe" ngx_objext="obj" -ngx_binext=".exe" ngx_long_start='@<< ' diff --git a/auto/cc/name b/auto/cc/name index 7860c69..ded93f5 100644 --- a/auto/cc/name +++ b/auto/cc/name @@ -25,77 +25,46 @@ fi if [ "$CC" = cl ]; then - if `$NGX_WINE $CC -v 2>&1 \ - | grep '^Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 16' \ - >/dev/null 2>&1`; then + NGX_CC_NAME=msvc + echo " + using Microsoft Visual C++ compiler" - NGX_CC_NAME=msvc10 - echo " + using Microsoft Visual C++ 10 compiler" - - else if `$NGX_WINE $CC -v 2>&1 \ - | grep '^Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 14' \ - >/dev/null 2>&1`; then - - NGX_CC_NAME=msvc8 - echo " + using Microsoft Visual C++ 8 compiler" - - else if `$NGX_WINE $CC -v 2>&1 \ - | grep '^Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 13' \ - >/dev/null 2>&1`; then - - NGX_CC_NAME=msvc7 - echo " + using Microsoft Visual C++ 7 compiler" - - else - NGX_CC_NAME=msvc - echo " + using Microsoft Visual C++ compiler" - fi - fi - fi - -else -if [ "$CC" = wcl386 ]; then +elif [ "$CC" = wcl386 ]; then NGX_CC_NAME=owc echo " + using Open Watcom C compiler" -else -if [ "$CC" = bcc32 ]; then +elif [ "$CC" = bcc32 ]; then NGX_CC_NAME=bcc echo " + using Borland C++ compiler" -else -if `$CC -V 2>&1 | grep '^Intel(R) C' >/dev/null 2>&1`; then +elif `$CC -V 2>&1 | grep '^Intel(R) C' >/dev/null 2>&1`; then NGX_CC_NAME=icc echo " + using Intel C++ compiler" -else -if `$CC -v 2>&1 | grep 'gcc version' >/dev/null 2>&1`; then +elif `$CC -v 2>&1 | grep 'gcc version' >/dev/null 2>&1`; then NGX_CC_NAME=gcc echo " + using GNU C compiler" -else -if `$CC -V 2>&1 | grep 'Sun C' >/dev/null 2>&1`; then +elif `$CC -v 2>&1 | grep 'clang version' >/dev/null 2>&1`; then + NGX_CC_NAME=clang + echo " + using Clang C compiler" + +elif `$CC -v 2>&1 | grep 'LLVM version' >/dev/null 2>&1`; then + NGX_CC_NAME=clang + echo " + using Clang C compiler" + +elif `$CC -V 2>&1 | grep 'Sun C' >/dev/null 2>&1`; then NGX_CC_NAME=sunc echo " + using Sun C compiler" -else -if `$CC -V 2>&1 | grep '^Compaq C' >/dev/null 2>&1`; then +elif `$CC -V 2>&1 | grep '^Compaq C' >/dev/null 2>&1`; then NGX_CC_NAME=ccc echo " + using Compaq C compiler" -else -if `$CC -V 2>&1 | grep '^aCC: ' >/dev/null 2>&1`; then +elif `$CC -V 2>&1 | grep '^aCC: ' >/dev/null 2>&1`; then NGX_CC_NAME=acc echo " + using HP aC++ compiler" else NGX_CC_NAME=unknown -fi # acc -fi # ccc -fi # sunc -fi # icc -fi # gcc -fi # bcc -fi # owc -fi # msvc +fi diff --git a/auto/cc/owc b/auto/cc/owc index 22eb4c1..f7fd88c 100644 --- a/auto/cc/owc +++ b/auto/cc/owc @@ -65,10 +65,10 @@ have=NGX_HAVE_C99_VARIADIC_MACROS . auto/have # the precompiled headers -CORE_DEPS="$CORE_DEPS $NGX_OBJS/ngx_config.pch" -NGX_PCH="$NGX_OBJS/ngx_config.pch" -NGX_BUILD_PCH="-fhq=$NGX_OBJS/ngx_config.pch" -NGX_USE_PCH="-fh=$NGX_OBJS/ngx_config.pch" +#CORE_DEPS="$CORE_DEPS $NGX_OBJS/ngx_config.pch" +#NGX_PCH="$NGX_OBJS/ngx_config.pch" +#NGX_BUILD_PCH="-fhq=$NGX_OBJS/ngx_config.pch" +#NGX_USE_PCH="-fh=$NGX_OBJS/ngx_config.pch" # the link flags, built target is NT GUI mode application @@ -84,7 +84,6 @@ ngx_include_opt="-i=" ngx_objout="-fo" ngx_binout="-fe=" ngx_objext="obj" -ngx_binext=".exe" ngx_regex_dirsep='\\' ngx_dirsep="\\" diff --git a/auto/cc/sunc b/auto/cc/sunc index dd9cced..552c2d3 100644 --- a/auto/cc/sunc +++ b/auto/cc/sunc @@ -8,7 +8,10 @@ # Sun C 5.9 SunOS_i386 2007/05/03 Sun Studio 12 # Sun C 5.9 SunOS_sparc 2007/05/03 # Sun C 5.10 SunOS_i386 2009/06/03 Sun Studio 12.1 -# Sun C 5.11 SunOS_i386 2010/08/13 Sun Studio 12.2 +# Sun C 5.11 SunOS_i386 2010/08/13 Oracle Solaris Studio 12.2 +# Sun C 5.12 SunOS_i386 2011/11/16 Oracle Solaris Studio 12.3 +# Sun C 5.13 SunOS_i386 2014/10/20 Oracle Solaris Studio 12.4 +# Sun C 5.14 SunOS_i386 2016/05/31 Oracle Developer Studio 12.5 NGX_SUNC_VER=`$CC -V 2>&1 | grep 'Sun C' 2>&1 \ | sed -e 's/^.* Sun C \(.*\)/\1/'` @@ -20,7 +23,10 @@ have=NGX_COMPILER value="\"Sun C $NGX_SUNC_VER\"" . auto/define cat << END > $NGX_AUTOTEST.c -int main() { printf("%d", __SUNPRO_C); } +int main(void) { + printf("%d", __SUNPRO_C); + return 0; +} END @@ -30,7 +36,7 @@ if [ -x $NGX_AUTOTEST ]; then ngx_sunc_ver=`$NGX_AUTOTEST` fi -rm $NGX_AUTOTEST* +rm -rf $NGX_AUTOTEST* # 1424 == 0x590, Sun Studio 12 @@ -57,6 +63,9 @@ case "$NGX_MACHINE" in esac +MAIN_LINK= +MODULE_LINK="-G" + # optimizations @@ -142,10 +151,6 @@ if [ ".$PCRE_OPT" = "." ]; then PCRE_OPT="$ngx_fast $IPO $CPU_OPT" fi -if [ ".$MD5_OPT" = "." ]; then - MD5_OPT="$ngx_fast $IPO $CPU_OPT" -fi - if [ ".$ZLIB_OPT" = "." ]; then ZLIB_OPT="$ngx_fast $IPO $CPU_OPT" fi diff --git a/auto/endianess b/auto/endianness similarity index 60% rename from auto/endianess rename to auto/endianness index 452dd7c..1b552b6 100644 --- a/auto/endianess +++ b/auto/endianness @@ -3,14 +3,19 @@ # Copyright (C) Nginx, Inc. -echo $ngx_n "checking for system endianess ...$ngx_c" -echo >> $NGX_ERR -echo "checking for system endianess" >> $NGX_ERR +echo $ngx_n "checking for system byte ordering ...$ngx_c" + +cat << END >> $NGX_AUTOCONF_ERR + +---------------------------------------- +checking for system byte ordering + +END cat << END > $NGX_AUTOTEST.c -int main() { +int main(void) { int i = 0x11223344; char *p; @@ -28,18 +33,18 @@ eval "$ngx_test >> $NGX_AUTOCONF_ERR 2>&1" if [ -x $NGX_AUTOTEST ]; then if $NGX_AUTOTEST >/dev/null 2>&1; then - echo " little endianess" + echo " little endian" have=NGX_HAVE_LITTLE_ENDIAN . auto/have else - echo " big endianess" + echo " big endian" fi - rm $NGX_AUTOTEST* + rm -rf $NGX_AUTOTEST* else - rm $NGX_AUTOTEST* + rm -rf $NGX_AUTOTEST* echo - echo "$0: error: can not detect system endianess" + echo "$0: error: cannot detect system byte ordering" exit 1 fi diff --git a/auto/feature b/auto/feature index c13e51d..3561f59 100644 --- a/auto/feature +++ b/auto/feature @@ -31,7 +31,7 @@ cat << END > $NGX_AUTOTEST.c $NGX_INCLUDE_UNISTD_H $ngx_feature_incs -int main() { +int main(void) { $ngx_feature_test; return 0; } @@ -120,4 +120,4 @@ else echo "----------" >> $NGX_AUTOCONF_ERR fi -rm $NGX_AUTOTEST* +rm -rf $NGX_AUTOTEST* diff --git a/auto/include b/auto/include index 3466fda..c1bd364 100644 --- a/auto/include +++ b/auto/include @@ -20,7 +20,7 @@ cat << END > $NGX_AUTOTEST.c $NGX_INCLUDE_SYS_PARAM_H #include <$ngx_include> -int main() { +int main(void) { return 0; } @@ -45,9 +45,6 @@ if [ -x $NGX_AUTOTEST ]; then eval "NGX_INCLUDE_$ngx_name='#include <$ngx_include>'" - #STUB - eval "NGX_$ngx_name='#include <$ngx_include>'" - else echo " not found" @@ -58,4 +55,4 @@ else echo "----------" >> $NGX_AUTOCONF_ERR fi -rm $NGX_AUTOTEST* +rm -rf $NGX_AUTOTEST* diff --git a/auto/init b/auto/init index 910f529..f816dfc 100644 --- a/auto/init +++ b/auto/init @@ -48,4 +48,6 @@ default: build clean: rm -rf Makefile $NGX_OBJS + +.PHONY: default clean END diff --git a/auto/install b/auto/install index c2c0ade..7f73e4b 100644 --- a/auto/install +++ b/auto/install @@ -3,12 +3,12 @@ # Copyright (C) Nginx, Inc. -if [ $USE_PERL = YES ]; then +if [ $USE_PERL != NO ]; then cat << END >> $NGX_MAKEFILE install_perl_modules: - cd $NGX_OBJS/src/http/modules/perl && make install + cd $NGX_OBJS/src/http/modules/perl && \$(MAKE) install END NGX_INSTALL_PERL_MODULES=install_perl_modules @@ -20,16 +20,24 @@ case ".$NGX_SBIN_PATH" in ./*) ;; - .) - NGX_SBIN_PATH=$NGX_PREFIX/sbin/nginx - ;; - *) NGX_SBIN_PATH=$NGX_PREFIX/$NGX_SBIN_PATH ;; esac +case ".$NGX_MODULES_PATH" in + ./*) + ;; + + *) + NGX_MODULES_PATH=$NGX_PREFIX/$NGX_MODULES_PATH + ;; +esac + +NGX_MODULES_PATH=`dirname $NGX_MODULES_PATH/.` + + case ".$NGX_CONF_PATH" in ./*) ;; @@ -96,58 +104,57 @@ $NGX_OBJS/nginx.8: $NGX_MAN $NGX_AUTO_CONFIG_H -e "s|%%ERROR_LOG_PATH%%|${NGX_ERROR_LOG_PATH:-stderr}|" \\ < $NGX_MAN > \$@ -install: $NGX_OBJS${ngx_dirsep}nginx${ngx_binext} \ - $NGX_INSTALL_PERL_MODULES +install: build $NGX_INSTALL_PERL_MODULES test -d '\$(DESTDIR)$NGX_PREFIX' || mkdir -p '\$(DESTDIR)$NGX_PREFIX' - test -d '\$(DESTDIR)`dirname "$NGX_SBIN_PATH"`' \ + test -d '\$(DESTDIR)`dirname "$NGX_SBIN_PATH"`' \\ || mkdir -p '\$(DESTDIR)`dirname "$NGX_SBIN_PATH"`' - test ! -f '\$(DESTDIR)$NGX_SBIN_PATH' \ - || mv '\$(DESTDIR)$NGX_SBIN_PATH' \ + 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' \ + test -d '\$(DESTDIR)$NGX_CONF_PREFIX' \\ || mkdir -p '\$(DESTDIR)$NGX_CONF_PREFIX' cp conf/koi-win '\$(DESTDIR)$NGX_CONF_PREFIX' cp conf/koi-utf '\$(DESTDIR)$NGX_CONF_PREFIX' cp conf/win-utf '\$(DESTDIR)$NGX_CONF_PREFIX' - test -f '\$(DESTDIR)$NGX_CONF_PREFIX/mime.types' \ + test -f '\$(DESTDIR)$NGX_CONF_PREFIX/mime.types' \\ || cp conf/mime.types '\$(DESTDIR)$NGX_CONF_PREFIX' cp conf/mime.types '\$(DESTDIR)$NGX_CONF_PREFIX/mime.types.default' - test -f '\$(DESTDIR)$NGX_CONF_PREFIX/fastcgi_params' \ + test -f '\$(DESTDIR)$NGX_CONF_PREFIX/fastcgi_params' \\ || cp conf/fastcgi_params '\$(DESTDIR)$NGX_CONF_PREFIX' - cp conf/fastcgi_params \ + cp conf/fastcgi_params \\ '\$(DESTDIR)$NGX_CONF_PREFIX/fastcgi_params.default' - test -f '\$(DESTDIR)$NGX_CONF_PREFIX/fastcgi.conf' \ + test -f '\$(DESTDIR)$NGX_CONF_PREFIX/fastcgi.conf' \\ || cp conf/fastcgi.conf '\$(DESTDIR)$NGX_CONF_PREFIX' cp conf/fastcgi.conf '\$(DESTDIR)$NGX_CONF_PREFIX/fastcgi.conf.default' - test -f '\$(DESTDIR)$NGX_CONF_PREFIX/uwsgi_params' \ + test -f '\$(DESTDIR)$NGX_CONF_PREFIX/uwsgi_params' \\ || cp conf/uwsgi_params '\$(DESTDIR)$NGX_CONF_PREFIX' - cp conf/uwsgi_params \ + cp conf/uwsgi_params \\ '\$(DESTDIR)$NGX_CONF_PREFIX/uwsgi_params.default' - test -f '\$(DESTDIR)$NGX_CONF_PREFIX/scgi_params' \ + test -f '\$(DESTDIR)$NGX_CONF_PREFIX/scgi_params' \\ || cp conf/scgi_params '\$(DESTDIR)$NGX_CONF_PREFIX' - cp conf/scgi_params \ + cp conf/scgi_params \\ '\$(DESTDIR)$NGX_CONF_PREFIX/scgi_params.default' - test -f '\$(DESTDIR)$NGX_CONF_PATH' \ + test -f '\$(DESTDIR)$NGX_CONF_PATH' \\ || cp conf/nginx.conf '\$(DESTDIR)$NGX_CONF_PATH' cp conf/nginx.conf '\$(DESTDIR)$NGX_CONF_PREFIX/nginx.conf.default' - test -d '\$(DESTDIR)`dirname "$NGX_PID_PATH"`' \ + test -d '\$(DESTDIR)`dirname "$NGX_PID_PATH"`' \\ || mkdir -p '\$(DESTDIR)`dirname "$NGX_PID_PATH"`' - test -d '\$(DESTDIR)`dirname "$NGX_HTTP_LOG_PATH"`' || \ - mkdir -p '\$(DESTDIR)`dirname "$NGX_HTTP_LOG_PATH"`' + test -d '\$(DESTDIR)`dirname "$NGX_HTTP_LOG_PATH"`' \\ + || mkdir -p '\$(DESTDIR)`dirname "$NGX_HTTP_LOG_PATH"`' - test -d '\$(DESTDIR)$NGX_PREFIX/html' \ + test -d '\$(DESTDIR)$NGX_PREFIX/html' \\ || cp -R $NGX_HTML '\$(DESTDIR)$NGX_PREFIX' END @@ -155,24 +162,51 @@ END if test -n "$NGX_ERROR_LOG_PATH"; then cat << END >> $NGX_MAKEFILE - test -d '\$(DESTDIR)`dirname "$NGX_ERROR_LOG_PATH"`' || \ - mkdir -p '\$(DESTDIR)`dirname "$NGX_ERROR_LOG_PATH"`' + test -d '\$(DESTDIR)`dirname "$NGX_ERROR_LOG_PATH"`' \\ + || mkdir -p '\$(DESTDIR)`dirname "$NGX_ERROR_LOG_PATH"`' END fi +if test -n "$DYNAMIC_MODULES"; then + cat << END >> $NGX_MAKEFILE + + test -d '\$(DESTDIR)$NGX_MODULES_PATH' \\ + || mkdir -p '\$(DESTDIR)$NGX_MODULES_PATH' +END + +fi + + +for ngx_module in $DYNAMIC_MODULES +do + ngx_module=$ngx_module$ngx_modext + + cat << END >> $NGX_MAKEFILE + + test ! -f '\$(DESTDIR)$NGX_MODULES_PATH/$ngx_module' \\ + || mv '\$(DESTDIR)$NGX_MODULES_PATH/$ngx_module' \\ + '\$(DESTDIR)$NGX_MODULES_PATH/$ngx_module.old' + cp $NGX_OBJS/$ngx_module '\$(DESTDIR)$NGX_MODULES_PATH/$ngx_module' +END + +done + + # create Makefile cat << END >> Makefile build: \$(MAKE) -f $NGX_MAKEFILE - \$(MAKE) -f $NGX_MAKEFILE manpage install: \$(MAKE) -f $NGX_MAKEFILE install +modules: + \$(MAKE) -f $NGX_MAKEFILE modules + upgrade: $NGX_SBIN_PATH -t @@ -181,4 +215,6 @@ upgrade: test -f $NGX_PID_PATH.oldbin kill -QUIT \`cat $NGX_PID_PATH.oldbin\` + +.PHONY: build install modules upgrade END diff --git a/auto/lib/conf b/auto/lib/conf index e1e4475..2c7af10 100644 --- a/auto/lib/conf +++ b/auto/lib/conf @@ -7,7 +7,7 @@ if [ $USE_PCRE = YES -o $PCRE != NONE ]; then . auto/lib/pcre/conf else - if [ $USE_PCRE = DISABLED -a $HTTP_REWRITE = YES ]; then + if [ $USE_PCRE = DISABLED -a $HTTP = YES -a $HTTP_REWRITE = YES ]; then cat << END @@ -25,52 +25,23 @@ if [ $USE_OPENSSL = YES ]; then . auto/lib/openssl/conf fi -if [ $USE_MD5 = YES ]; then - - if [ $USE_OPENSSL = YES ]; then - have=NGX_HAVE_OPENSSL_MD5_H . auto/have - have=NGX_OPENSSL_MD5 . auto/have - have=NGX_HAVE_MD5 . auto/have - MD5=YES - MD5_LIB=OpenSSL - - else - . auto/lib/md5/conf - fi - -fi - -if [ $USE_SHA1 = YES ]; then - - if [ $USE_OPENSSL = YES ]; then - have=NGX_HAVE_OPENSSL_SHA1_H . auto/have - have=NGX_HAVE_SHA1 . auto/have - SHA1=YES - SHA1_LIB=OpenSSL - - else - . auto/lib/sha1/conf - fi - -fi - if [ $USE_ZLIB = YES ]; then . auto/lib/zlib/conf fi -if [ $USE_LIBXSLT = YES ]; then +if [ $USE_LIBXSLT != NO ]; then . auto/lib/libxslt/conf fi -if [ $USE_LIBGD = YES ]; then +if [ $USE_LIBGD != NO ]; then . auto/lib/libgd/conf fi -if [ $USE_PERL = YES ]; then +if [ $USE_PERL != NO ]; then . auto/lib/perl/conf fi -if [ $HTTP_GEOIP = YES ]; then +if [ $USE_GEOIP != NO ]; then . auto/lib/geoip/conf fi diff --git a/auto/lib/geoip/conf b/auto/lib/geoip/conf index 3764d76..47165b1 100644 --- a/auto/lib/geoip/conf +++ b/auto/lib/geoip/conf @@ -6,7 +6,7 @@ ngx_feature="GeoIP library" ngx_feature_name= ngx_feature_run=no - ngx_feature_incs= + ngx_feature_incs="#include " ngx_feature_path= ngx_feature_libs="-lGeoIP" ngx_feature_test="GeoIP_open(NULL, 0)" @@ -18,6 +18,7 @@ if [ $ngx_found = no ]; then # FreeBSD port ngx_feature="GeoIP library in /usr/local/" + ngx_feature_path="/usr/local/include" if [ $NGX_RPATH = YES ]; then ngx_feature_libs="-R/usr/local/lib -L/usr/local/lib -lGeoIP" @@ -34,7 +35,7 @@ if [ $ngx_found = no ]; then # NetBSD port ngx_feature="GeoIP library in /usr/pkg/" - ngx_feature_path="/usr/pkg/include/" + ngx_feature_path="/usr/pkg/include" if [ $NGX_RPATH = YES ]; then ngx_feature_libs="-R/usr/pkg/lib -L/usr/pkg/lib -lGeoIP" @@ -63,8 +64,42 @@ 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_LIBS="$CORE_LIBS $ngx_feature_libs" + + CORE_INCS="$CORE_INCS $ngx_feature_path" + + if [ $USE_GEOIP = YES ]; then + CORE_LIBS="$CORE_LIBS $ngx_feature_libs" + fi + + NGX_LIB_GEOIP=$ngx_feature_libs + + ngx_feature="GeoIP IPv6 support" + ngx_feature_name="NGX_HAVE_GEOIP_V6" + ngx_feature_run=no + ngx_feature_incs="#include + #include " + #ngx_feature_path= + #ngx_feature_libs= + ngx_feature_test="printf(\"%d\", GEOIP_CITY_EDITION_REV0_V6);" + . auto/feature else diff --git a/auto/lib/google-perftools/conf b/auto/lib/google-perftools/conf index 398ddd0..94dadac 100644 --- a/auto/lib/google-perftools/conf +++ b/auto/lib/google-perftools/conf @@ -9,7 +9,8 @@ ngx_feature_incs= ngx_feature_path= ngx_feature_libs="-lprofiler" - ngx_feature_test="ProfilerStop()" + ngx_feature_test="void ProfilerStop(void); + ProfilerStop()" . auto/feature @@ -29,6 +30,38 @@ if [ $ngx_found = no ]; then fi +if [ $ngx_found = no ]; then + + # MacPorts + + ngx_feature="Google perftools in /opt/local/" + + if [ $NGX_RPATH = YES ]; then + ngx_feature_libs="-R/opt/local/lib -L/opt/local/lib -lprofiler" + else + ngx_feature_libs="-L/opt/local/lib -lprofiler" + fi + + . auto/feature +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" @@ -36,7 +69,7 @@ else cat << END -$0: error: the Google perftool module requires the Google perftools +$0: error: the Google perftools module requires the Google perftools library. You can either do not enable the module or install the library. END 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 b84267b..530c746 100644 --- a/auto/lib/libatomic/make +++ b/auto/lib/libatomic/make @@ -3,12 +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 && ./configure + cd $NGX_LIBATOMIC \\ + && if [ -f Makefile ]; then \$(MAKE) distclean; fi \\ + && ./configure --prefix=$ngx_prefix END diff --git a/auto/lib/libgd/conf b/auto/lib/libgd/conf index b0bc74c..07f5656 100644 --- a/auto/lib/libgd/conf +++ b/auto/lib/libgd/conf @@ -9,7 +9,8 @@ ngx_feature_incs="#include " ngx_feature_path= ngx_feature_libs="-lgd" - ngx_feature_test="gdImagePtr img = gdImageCreateFromGifPtr(1, NULL);" + ngx_feature_test="gdImagePtr img = gdImageCreateFromGifPtr(1, NULL); + (void) img" . auto/feature @@ -35,7 +36,7 @@ if [ $ngx_found = no ]; then # NetBSD port ngx_feature="GD library in /usr/pkg/" - ngx_feature_path="/usr/pkg/include/" + ngx_feature_path="/usr/pkg/include" if [ $NGX_RPATH = YES ]; then ngx_feature_libs="-R/usr/pkg/lib -L/usr/pkg/lib -lgd" @@ -64,10 +65,38 @@ 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" - CORE_LIBS="$CORE_LIBS $ngx_feature_libs" + + if [ $USE_LIBGD = YES ]; then + CORE_LIBS="$CORE_LIBS $ngx_feature_libs" + fi + + NGX_LIB_LIBGD=$ngx_feature_libs + + ngx_feature="GD WebP support" + ngx_feature_name="NGX_HAVE_GD_WEBP" + ngx_feature_test="gdImagePtr img = gdImageCreateFromWebpPtr(1, NULL); + (void) img" + . auto/feature else diff --git a/auto/lib/libxslt/conf b/auto/lib/libxslt/conf index bc19d83..3063ac7 100644 --- a/auto/lib/libxslt/conf +++ b/auto/lib/libxslt/conf @@ -16,8 +16,8 @@ ngx_feature_libs="-lxml2 -lxslt" ngx_feature_test="xmlParserCtxtPtr ctxt = NULL; xsltStylesheetPtr sheet = NULL; - xmlDocPtr doc; - doc = xmlParseChunk(ctxt, NULL, 0, 0); + xmlDocPtr doc = NULL; + xmlParseChunk(ctxt, NULL, 0, 0); xsltApplyStylesheet(sheet, doc, NULL);" . auto/feature @@ -76,7 +76,12 @@ fi if [ $ngx_found = yes ]; then CORE_INCS="$CORE_INCS $ngx_feature_path" - CORE_LIBS="$CORE_LIBS $ngx_feature_libs" + + if [ $USE_LIBXSLT = YES ]; then + CORE_LIBS="$CORE_LIBS $ngx_feature_libs" + fi + + NGX_LIB_LIBXSLT=$ngx_feature_libs else @@ -152,5 +157,9 @@ fi if [ $ngx_found = yes ]; then - CORE_LIBS="$CORE_LIBS -lexslt" + if [ $USE_LIBXSLT = YES ]; then + CORE_LIBS="$CORE_LIBS -lexslt" + fi + + NGX_LIB_LIBXSLT="$NGX_LIB_LIBXSLT -lexslt" fi diff --git a/auto/lib/make b/auto/lib/make index 58a84a3..b64e329 100644 --- a/auto/lib/make +++ b/auto/lib/make @@ -7,14 +7,6 @@ if [ $PCRE != NONE -a $PCRE != NO -a $PCRE != YES ]; then . auto/lib/pcre/make fi -if [ $MD5 != NONE -a $MD5 != NO -a $MD5 != YES ]; then - . auto/lib/md5/make -fi - -if [ $SHA1 != NONE -a $SHA1 != NO -a $SHA1 != YES ]; then - . auto/lib/sha1/make -fi - if [ $OPENSSL != NONE -a $OPENSSL != NO -a $OPENSSL != YES ]; then . auto/lib/openssl/make fi @@ -27,6 +19,6 @@ if [ $NGX_LIBATOMIC != NO -a $NGX_LIBATOMIC != YES ]; then . auto/lib/libatomic/make fi -if [ $USE_PERL = YES ]; then +if [ $USE_PERL != NO ]; then . auto/lib/perl/make fi diff --git a/auto/lib/md5/conf b/auto/lib/md5/conf deleted file mode 100644 index f9c1ed9..0000000 --- a/auto/lib/md5/conf +++ /dev/null @@ -1,103 +0,0 @@ - -# Copyright (C) Igor Sysoev -# Copyright (C) Nginx, Inc. - - -if [ $MD5 != NONE ]; then - - if grep MD5_Init $MD5/md5.h 2>&1 >/dev/null; then - # OpenSSL md5 - OPENSSL_MD5=YES - have=NGX_HAVE_OPENSSL_MD5 . auto/have - have=NGX_OPENSSL_MD5 . auto/have - else - # rsaref md5 - OPENSSL_MD5=NO - fi - - have=NGX_HAVE_MD5 . auto/have - CORE_INCS="$CORE_INCS $MD5" - - case "$NGX_CC_NAME" in - - msvc* | owc* | bcc) - LINK_DEPS="$LINK_DEPS $MD5/md5.lib" - CORE_LIBS="$CORE_LIBS $MD5/md5.lib" - ;; - - icc*) - LINK_DEPS="$LINK_DEPS $MD5/libmd5.a" - - # to allow -ipo optimization we link with the *.o but not library - CORE_LIBS="$CORE_LIBS $MD5/md5_dgst.o" - - if [ $MD5_ASM = YES ]; then - CORE_LIBS="$CORE_LIBS $MD5/asm/mx86-elf.o" - fi - ;; - - *) - LINK_DEPS="$LINK_DEPS $MD5/libmd5.a" - CORE_LIBS="$CORE_LIBS $MD5/libmd5.a" - #CORE_LIBS="$CORE_LIBS -L $MD5 -lmd5" - ;; - - esac - -else - - if [ "$NGX_PLATFORM" != win32 ]; then - - MD5=NO - - # FreeBSD, Solaris 10 - - ngx_feature="system md library" - ngx_feature_name=NGX_HAVE_MD5 - ngx_feature_run=no - ngx_feature_incs="#include " - ngx_feature_path= - ngx_feature_libs="-lmd" - ngx_feature_test="MD5_CTX md5; MD5Init(&md5)" - . auto/feature - - ngx_md5_lib="system md" - - if [ $ngx_found = no ]; then - - # Solaris 8/9 - - ngx_feature="system md5 library" - ngx_feature_libs="-lmd5" - . auto/feature - - ngx_md5_lib="system md5" - fi - - if [ $ngx_found = no ]; then - - # OpenSSL crypto library - - ngx_feature="OpenSSL md5 crypto library" - ngx_feature_name="NGX_OPENSSL_MD5" - ngx_feature_incs="#include " - ngx_feature_libs="-lcrypto" - ngx_feature_test="MD5_CTX md5; MD5_Init(&md5)" - . auto/feature - - ngx_md5_lib="system crypto" - - if [ $ngx_found = yes ]; then - have=NGX_HAVE_OPENSSL_MD5_H . auto/have - have=NGX_HAVE_MD5 . auto/have - fi - fi - - if [ $ngx_found = yes ]; then - CORE_LIBS="$CORE_LIBS $ngx_feature_libs" - MD5=YES - MD5_LIB=$ngx_md5_lib - fi - fi - -fi diff --git a/auto/lib/md5/make b/auto/lib/md5/make deleted file mode 100644 index 81f138a..0000000 --- a/auto/lib/md5/make +++ /dev/null @@ -1,96 +0,0 @@ - -# Copyright (C) Igor Sysoev -# Copyright (C) Nginx, Inc. - - -case "$NGX_CC_NAME" in - - msvc*) - ngx_makefile=makefile.msvc - ngx_opt="CPU_OPT=\"$CPU_OPT\" LIBC=$LIBC MD5_ASM=$MD5_ASM" - ngx_md5="MD5=\"$MD5\"" - ;; - - owc*) - ngx_makefile=makefile.owc - ngx_opt="CPU_OPT=\"$CPU_OPT\"" - ngx_md5=`echo MD5=\"$MD5\" | sed -e "s/\//$ngx_regex_dirsep/g"` - ;; - - bcc) - ngx_makefile=makefile.bcc - ngx_opt="-DCPU_OPT=\"$CPU_OPT\" -DMD5_ASM=$MD5_ASM" - ngx_md5=`echo \-DMD5=\"$MD5\" | sed -e "s/\//$ngx_regex_dirsep/g"` - ;; - -esac - - -done=NO - - -case "$NGX_PLATFORM" in - - win32) - cat << END >> $NGX_MAKEFILE - -`echo "$MD5/md5.lib: $NGX_MAKEFILE" | sed -e "s/\//$ngx_regex_dirsep/g"` - \$(MAKE) -f auto/lib/md5/$ngx_makefile $ngx_opt $ngx_md5 - -END - - done=YES - ;; - - SunOS:*:i86pc) - if [ $MD5_ASM = YES ]; then - - cat << END >> $NGX_MAKEFILE - -$MD5/libmd5.a: $NGX_MAKEFILE - cd $MD5 \\ - && \$(MAKE) CFLAGS="$MD5_OPT -DSOL -DMD5_ASM -DL_ENDIAN" \\ - CC="\$(CC)" CPP="\$(CPP)" \\ - MD5_ASM_OBJ=asm/mx86-sol.o clean libmd5.a - -END - - done=YES - fi - ;; - - # FreeBSD: i386 - # Linux: i686 - - *:i386 | *:i686) - if [ $MD5_ASM = YES ]; then - - cat << END >> $NGX_MAKEFILE - -$MD5/libmd5.a: $NGX_MAKEFILE - cd $MD5 \\ - && \$(MAKE) CFLAGS="$MD5_OPT -DELF -DMD5_ASM -DL_ENDIAN" \\ - CC="\$(CC)" CPP="\$(CPP)" \\ - MD5_ASM_OBJ=asm/mx86-elf.o clean libmd5.a - -END - - done=YES - fi - ;; - -esac - - -if [ $done = NO ]; then - - cat << END >> $NGX_MAKEFILE - -$MD5/libmd5.a: $NGX_MAKEFILE - cd $MD5 \\ - && \$(MAKE) CFLAGS="$MD5_OPT" \\ - CC="\$(CC)" MD5_ASM_OBJ= clean libmd5.a - -END - -fi diff --git a/auto/lib/md5/makefile.bcc b/auto/lib/md5/makefile.bcc deleted file mode 100644 index eb6fb62..0000000 --- a/auto/lib/md5/makefile.bcc +++ /dev/null @@ -1,22 +0,0 @@ - -# Copyright (C) Igor Sysoev -# Copyright (C) Nginx, Inc. - - -CFLAGS = -q -O2 -tWM $(CPU_OPT) -DL_ENDIAN - -!if "$(MD5_ASM)" == "YES" - -md5.lib: - cd $(MD5) - bcc32 -c $(CFLAGS) -DMD5_ASM md5_dgst.c - tlib md5.lib +md5_dgst.obj +"asm\m-win32.obj" - -!else - -md5.lib: - cd $(MD5) - bcc32 -c $(CFLAGS) md5_dgst.c - tlib md5.lib +md5_dgst.obj - -!endif diff --git a/auto/lib/md5/makefile.msvc b/auto/lib/md5/makefile.msvc deleted file mode 100644 index 90d62fa..0000000 --- a/auto/lib/md5/makefile.msvc +++ /dev/null @@ -1,22 +0,0 @@ - -# Copyright (C) Igor Sysoev -# Copyright (C) Nginx, Inc. - - -CFLAGS = -nologo -O2 -Ob1 -Oi -Gs $(LIBC) $(CPU_OPT) -D L_ENDIAN - -!IF "$(MD5_ASM)" == "YES" - -md5.lib: - cd $(MD5) - cl -c $(CFLAGS) -D MD5_ASM md5_dgst.c - link -lib -out:md5.lib md5_dgst.obj asm/m-win32.obj - -!ELSE - -md5.lib: - cd $(MD5) - cl -c $(CFLAGS) md5_dgst.c - link -lib -out:md5.lib md5_dgst.obj - -!ENDIF diff --git a/auto/lib/md5/makefile.owc b/auto/lib/md5/makefile.owc deleted file mode 100644 index 78c1e61..0000000 --- a/auto/lib/md5/makefile.owc +++ /dev/null @@ -1,11 +0,0 @@ - -# Copyright (C) Igor Sysoev -# Copyright (C) Nginx, Inc. - - -CFLAGS = -zq -bt=nt -bm -ot -op -oi -oe -s $(CPU_OPT) - -md5.lib: - cd $(MD5) - wcl386 -c $(CFLAGS) -dL_ENDIAN md5_dgst.c - wlib -n md5.lib md5_dgst.obj diff --git a/auto/lib/openssl/conf b/auto/lib/openssl/conf index 528ee17..fdf430d 100644 --- a/auto/lib/openssl/conf +++ b/auto/lib/openssl/conf @@ -5,18 +5,33 @@ 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" CORE_DEPS="$CORE_DEPS $OPENSSL/openssl/include/openssl/ssl.h" - CORE_LIBS="$CORE_LIBS $OPENSSL/openssl/lib/ssleay32.lib" - CORE_LIBS="$CORE_LIBS $OPENSSL/openssl/lib/libeay32.lib" + + if [ -f $OPENSSL/ms/do_ms.bat ]; then + # before OpenSSL 1.1.0 + CORE_LIBS="$CORE_LIBS $OPENSSL/openssl/lib/ssleay32.lib" + CORE_LIBS="$CORE_LIBS $OPENSSL/openssl/lib/libeay32.lib" + else + # OpenSSL 1.1.0+ + CORE_LIBS="$CORE_LIBS $OPENSSL/openssl/lib/libssl.lib" + CORE_LIBS="$CORE_LIBS $OPENSSL/openssl/lib/libcrypto.lib" + fi # libeay32.lib requires gdi32.lib CORE_LIBS="$CORE_LIBS gdi32.lib" @@ -25,14 +40,16 @@ 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" CORE_LIBS="$CORE_LIBS $OPENSSL/.openssl/lib/libcrypto.a" CORE_LIBS="$CORE_LIBS $NGX_LIBDL" + CORE_LIBS="$CORE_LIBS $NGX_LIBPTHREAD" + + if [ "$NGX_PLATFORM" = win32 ]; then + CORE_LIBS="$CORE_LIBS -lgdi32 -lcrypt32 -lws2_32" + fi ;; esac @@ -47,14 +64,116 @@ else ngx_feature_run=no ngx_feature_incs="#include " ngx_feature_path= - ngx_feature_libs="-lssl -lcrypto" - ngx_feature_test="SSL_library_init()" + ngx_feature_libs="-lssl -lcrypto $NGX_LIBDL $NGX_LIBPTHREAD" + ngx_feature_test="SSL_CTX_set_options(NULL, 0)" . auto/feature + if [ $ngx_found = no ]; then + + # FreeBSD port + + ngx_feature="OpenSSL library in /usr/local/" + ngx_feature_path="/usr/local/include" + + if [ $NGX_RPATH = YES ]; then + ngx_feature_libs="-R/usr/local/lib -L/usr/local/lib -lssl -lcrypto" + else + ngx_feature_libs="-L/usr/local/lib -lssl -lcrypto" + fi + + ngx_feature_libs="$ngx_feature_libs $NGX_LIBDL $NGX_LIBPTHREAD" + + . auto/feature + fi + + if [ $ngx_found = no ]; then + + # NetBSD port + + ngx_feature="OpenSSL library in /usr/pkg/" + ngx_feature_path="/usr/pkg/include" + + if [ $NGX_RPATH = YES ]; then + ngx_feature_libs="-R/usr/pkg/lib -L/usr/pkg/lib -lssl -lcrypto" + else + ngx_feature_libs="-L/usr/pkg/lib -lssl -lcrypto" + fi + + ngx_feature_libs="$ngx_feature_libs $NGX_LIBDL $NGX_LIBPTHREAD" + + . auto/feature + fi + + if [ $ngx_found = no ]; then + + # MacPorts + + ngx_feature="OpenSSL library in /opt/local/" + ngx_feature_path="/opt/local/include" + + if [ $NGX_RPATH = YES ]; then + ngx_feature_libs="-R/opt/local/lib -L/opt/local/lib -lssl -lcrypto" + else + ngx_feature_libs="-L/opt/local/lib -lssl -lcrypto" + fi + + ngx_feature_libs="$ngx_feature_libs $NGX_LIBDL $NGX_LIBPTHREAD" + + . 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_LIBS="$CORE_LIBS $ngx_feature_libs $NGX_LIBDL" + 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 9090fcb..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 @@ -41,11 +54,6 @@ END ;; *) - case $USE_THREADS in - NO) OPENSSL_OPT="$OPENSSL_OPT no-threads" ;; - *) OPENSSL_OPT="$OPENSSL_OPT threads" ;; - esac - case $OPENSSL in /*) ngx_prefix="$OPENSSL/.openssl" ;; *) ngx_prefix="$PWD/$OPENSSL/.openssl" ;; @@ -55,10 +63,10 @@ END $OPENSSL/.openssl/include/openssl/ssl.h: $NGX_MAKEFILE cd $OPENSSL \\ - && \$(MAKE) clean \\ - && ./config --prefix=$ngx_prefix no-shared $OPENSSL_OPT \\ + && if [ -f Makefile ]; then \$(MAKE) clean; fi \\ + && ./config --prefix=$ngx_prefix no-shared no-threads $OPENSSL_OPT \\ && \$(MAKE) \\ - && \$(MAKE) install LIBDIR=lib + && \$(MAKE) install_sw LIBDIR=lib END diff --git a/auto/lib/openssl/makefile.msvc b/auto/lib/openssl/makefile.msvc index fc9e578..ed17cde 100644 --- a/auto/lib/openssl/makefile.msvc +++ b/auto/lib/openssl/makefile.msvc @@ -6,9 +6,16 @@ all: cd $(OPENSSL) - perl Configure VC-WIN32 no-shared --prefix=openssl $(OPENSSL_OPT) + perl Configure $(OPENSSL_TARGET) no-shared no-threads \ + --prefix="%cd%/openssl" \ + --openssldir="%cd%/openssl/ssl" \ + $(OPENSSL_OPT) - ms\do_ms - - $(MAKE) -f ms\nt.mak - $(MAKE) -f ms\nt.mak install + if exist ms\do_ms.bat ( \ + ms\do_ms \ + && $(MAKE) -f ms\nt.mak \ + && $(MAKE) -f ms\nt.mak install \ + ) else ( \ + $(MAKE) \ + && $(MAKE) install_sw \ + ) diff --git a/auto/lib/pcre/conf b/auto/lib/pcre/conf index 6a8c326..cdf1809 100644 --- a/auto/lib/pcre/conf +++ b/auto/lib/pcre/conf @@ -4,82 +4,62 @@ if [ $PCRE != NONE ]; then - CORE_INCS="$CORE_INCS $PCRE" - case "$NGX_CC_NAME" in + if [ -f $PCRE/src/pcre2.h.generic ]; then - msvc* | owc* | bcc) - have=NGX_PCRE . auto/have + PCRE_LIBRARY=PCRE2 + + have=NGX_PCRE . auto/have + have=NGX_PCRE2 . auto/have + + if [ "$NGX_PLATFORM" = win32 ]; then + have=PCRE2_STATIC . auto/have + fi + + CORE_INCS="$CORE_INCS $PCRE/src/" + CORE_DEPS="$CORE_DEPS $PCRE/src/pcre2.h" + + case "$NGX_CC_NAME" in + + msvc) + LINK_DEPS="$LINK_DEPS $PCRE/src/pcre2-8.lib" + CORE_LIBS="$CORE_LIBS $PCRE/src/pcre2-8.lib" + ;; + + *) + LINK_DEPS="$LINK_DEPS $PCRE/.libs/libpcre2-8.a" + CORE_LIBS="$CORE_LIBS $PCRE/.libs/libpcre2-8.a" + ;; + + esac + + else + + PCRE_LIBRARY=PCRE + + have=NGX_PCRE . auto/have + + if [ "$NGX_PLATFORM" = win32 ]; then have=PCRE_STATIC . auto/have - CORE_DEPS="$CORE_DEPS $PCRE/pcre.h" - LINK_DEPS="$LINK_DEPS $PCRE/pcre.lib" - CORE_LIBS="$CORE_LIBS $PCRE/pcre.lib" - ;; + fi - icc* ) - have=NGX_PCRE . auto/have - CORE_DEPS="$CORE_DEPS $PCRE/pcre.h" + CORE_INCS="$CORE_INCS $PCRE" + CORE_DEPS="$CORE_DEPS $PCRE/pcre.h" - LINK_DEPS="$LINK_DEPS $PCRE/.libs/libpcre.a" + case "$NGX_CC_NAME" in - echo $ngx_n "checking for PCRE library ...$ngx_c" + msvc | owc | bcc) + LINK_DEPS="$LINK_DEPS $PCRE/pcre.lib" + CORE_LIBS="$CORE_LIBS $PCRE/pcre.lib" + ;; - if [ -f $PCRE/pcre.h ]; then - ngx_pcre_ver=`grep PCRE_MAJOR $PCRE/pcre.h \ - | sed -e 's/^.*PCRE_MAJOR.* \(.*\)$/\1/'` - - else if [ -f $PCRE/configure.in ]; then - ngx_pcre_ver=`grep PCRE_MAJOR= $PCRE/configure.in \ - | sed -e 's/^.*=\(.*\)$/\1/'` - - else - ngx_pcre_ver=`grep pcre_major, $PCRE/configure.ac \ - | sed -e 's/^.*pcre_major,.*\[\(.*\)\].*$/\1/'` - fi - fi - - echo " $ngx_pcre_ver major version found" - - # to allow -ipo optimization we link with the *.o but not library - - case "$ngx_pcre_ver" in - 4|5) - CORE_LIBS="$CORE_LIBS $PCRE/pcre.o" - ;; - - 6) - CORE_LIBS="$CORE_LIBS $PCRE/pcre_chartables.o" - CORE_LIBS="$CORE_LIBS $PCRE/pcre_compile.o" - CORE_LIBS="$CORE_LIBS $PCRE/pcre_exec.o" - CORE_LIBS="$CORE_LIBS $PCRE/pcre_fullinfo.o" - CORE_LIBS="$CORE_LIBS $PCRE/pcre_globals.o" - CORE_LIBS="$CORE_LIBS $PCRE/pcre_tables.o" - CORE_LIBS="$CORE_LIBS $PCRE/pcre_try_flipped.o" - ;; - - *) - CORE_LIBS="$CORE_LIBS $PCRE/pcre_chartables.o" - CORE_LIBS="$CORE_LIBS $PCRE/pcre_compile.o" - CORE_LIBS="$CORE_LIBS $PCRE/pcre_exec.o" - CORE_LIBS="$CORE_LIBS $PCRE/pcre_fullinfo.o" - CORE_LIBS="$CORE_LIBS $PCRE/pcre_globals.o" - CORE_LIBS="$CORE_LIBS $PCRE/pcre_tables.o" - CORE_LIBS="$CORE_LIBS $PCRE/pcre_try_flipped.o" - CORE_LIBS="$CORE_LIBS $PCRE/pcre_newline.o" - ;; - - esac - ;; - - *) - have=NGX_PCRE . auto/have - CORE_DEPS="$CORE_DEPS $PCRE/pcre.h" - LINK_DEPS="$LINK_DEPS $PCRE/.libs/libpcre.a" - CORE_LIBS="$CORE_LIBS $PCRE/.libs/libpcre.a" - ;; - - esac + *) + LINK_DEPS="$LINK_DEPS $PCRE/.libs/libpcre.a" + CORE_LIBS="$CORE_LIBS $PCRE/.libs/libpcre.a" + ;; + esac + fi if [ $PCRE_JIT = YES ]; then have=NGX_HAVE_PCRE_JIT . auto/have @@ -89,8 +69,48 @@ if [ $PCRE != NONE ]; then else if [ "$NGX_PLATFORM" != win32 ]; then - PCRE=NO + fi + + if [ $PCRE = NO -a $PCRE2 != DISABLED ]; then + + ngx_feature="PCRE2 library" + ngx_feature_name="NGX_PCRE2" + ngx_feature_run=no + ngx_feature_incs="#define PCRE2_CODE_UNIT_WIDTH 8 + #include " + ngx_feature_path= + ngx_feature_libs="-lpcre2-8" + ngx_feature_test="pcre2_code *re; + re = pcre2_compile(NULL, 0, 0, NULL, NULL, NULL); + if (re == NULL) return 1" + . auto/feature + + if [ $ngx_found = no ]; then + + # pcre2-config + + ngx_pcre2_prefix=`pcre2-config --prefix 2>/dev/null` + + if [ -n "$ngx_pcre2_prefix" ]; then + ngx_feature="PCRE2 library in $ngx_pcre2_prefix" + ngx_feature_path=`pcre2-config --cflags \ + | sed -n -e 's/.*-I *\([^ ][^ ]*\).*/\1/p'` + ngx_feature_libs=`pcre2-config --libs8` + . auto/feature + fi + fi + + if [ $ngx_found = yes ]; then + have=NGX_PCRE . auto/have + CORE_INCS="$CORE_INCS $ngx_feature_path" + CORE_LIBS="$CORE_LIBS $ngx_feature_libs" + PCRE=YES + PCRE_LIBRARY=PCRE2 + fi + fi + + if [ $PCRE = NO ]; then ngx_feature="PCRE library" ngx_feature_name="NGX_PCRE" @@ -162,16 +182,34 @@ 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" PCRE=YES + PCRE_LIBRARY=PCRE fi if [ $PCRE = YES ]; then ngx_feature="PCRE JIT support" ngx_feature_name="NGX_HAVE_PCRE_JIT" ngx_feature_test="int jit = 0; + pcre_free_study(NULL); pcre_config(PCRE_CONFIG_JIT, &jit); if (jit != 1) return 1;" . auto/feature diff --git a/auto/lib/pcre/make b/auto/lib/pcre/make index 834779b..182590a 100644 --- a/auto/lib/pcre/make +++ b/auto/lib/pcre/make @@ -3,36 +3,142 @@ # Copyright (C) Nginx, Inc. -case "$NGX_CC_NAME" in +if [ $PCRE_LIBRARY = PCRE2 ]; then - msvc*) - ngx_makefile=makefile.msvc - ngx_opt="CPU_OPT=\"$CPU_OPT\" LIBC=$LIBC" - ngx_pcre="PCRE=\"$PCRE\"" - ;; + # PCRE2 - owc*) - ngx_makefile=makefile.owc - ngx_opt="CPU_OPT=\"$CPU_OPT\"" - ngx_pcre=`echo PCRE=\"$PCRE\" | sed -e "s/\//$ngx_regex_dirsep/g"` - ;; + if [ $NGX_CC_NAME = msvc ]; then - bcc) - ngx_makefile=makefile.bcc - ngx_opt="-DCPU_OPT=\"$CPU_OPT\"" - ngx_pcre=`echo \-DPCRE=\"$PCRE\" | sed -e "s/\//$ngx_regex_dirsep/g"` - ;; + # With PCRE2, it is not possible to compile all sources. + # Since list of source files changes between versions, we + # test files which might not be present. -esac + ngx_pcre_srcs="pcre2_auto_possess.c \ + pcre2_chartables.c \ + pcre2_compile.c \ + pcre2_config.c \ + pcre2_context.c \ + pcre2_dfa_match.c \ + pcre2_error.c \ + pcre2_jit_compile.c \ + pcre2_maketables.c \ + pcre2_match.c \ + pcre2_match_data.c \ + pcre2_newline.c \ + pcre2_ord2utf.c \ + pcre2_pattern_info.c \ + pcre2_string_utils.c \ + pcre2_study.c \ + pcre2_substitute.c \ + pcre2_substring.c \ + pcre2_tables.c \ + pcre2_ucd.c \ + pcre2_valid_utf.c \ + pcre2_xclass.c" + ngx_pcre_test="pcre2_chkdint.c \ + pcre2_convert.c \ + pcre2_extuni.c \ + pcre2_find_bracket.c \ + pcre2_script_run.c \ + pcre2_serialize.c" -case "$NGX_PLATFORM" in + for ngx_src in $ngx_pcre_test + do + if [ -f $PCRE/src/$ngx_src ]; then + ngx_pcre_srcs="$ngx_pcre_srcs $ngx_src" + fi + done - win32) + ngx_pcre_objs=`echo $ngx_pcre_srcs \ + | sed -e "s#\([^ ]*\.\)c#\1$ngx_objext#g"` + + ngx_pcre_srcs=`echo $ngx_pcre_srcs \ + | sed -e "s/ *\([^ ][^ ]*\)/$ngx_regex_cont\1/g"` + ngx_pcre_objs=`echo $ngx_pcre_objs \ + | sed -e "s/ *\([^ ][^ ]*\)/$ngx_regex_cont\1/g"` cat << END >> $NGX_MAKEFILE -`echo "$PCRE/pcre.lib: $NGX_MAKEFILE" | sed -e "s/\//$ngx_regex_dirsep/g"` +PCRE_CFLAGS = -O2 -Ob1 -Oi -Gs $LIBC $CPU_OPT +PCRE_FLAGS = -DHAVE_CONFIG_H -DPCRE2_STATIC -DPCRE2_CODE_UNIT_WIDTH=8 \\ + -DHAVE_MEMMOVE + +PCRE_SRCS = $ngx_pcre_srcs +PCRE_OBJS = $ngx_pcre_objs + +$PCRE/src/pcre2.h: + cd $PCRE/src \\ + && copy /y config.h.generic config.h \\ + && copy /y pcre2.h.generic pcre2.h \\ + && copy /y pcre2_chartables.c.dist pcre2_chartables.c + +$PCRE/src/pcre2-8.lib: $PCRE/src/pcre2.h $NGX_MAKEFILE + cd $PCRE/src \\ + && cl -nologo -c \$(PCRE_CFLAGS) -I . \$(PCRE_FLAGS) \$(PCRE_SRCS) \\ + && link -lib -out:pcre2-8.lib -verbose:lib \$(PCRE_OBJS) + +END + + else + + cat << END >> $NGX_MAKEFILE + +$PCRE/src/pcre2.h: $PCRE/Makefile + +$PCRE/Makefile: $NGX_MAKEFILE + cd $PCRE \\ + && if [ -f Makefile ]; then \$(MAKE) distclean; fi \\ + && CC="\$(CC)" CFLAGS="$PCRE_OPT" \\ + ./configure --disable-shared $PCRE_CONF_OPT + +$PCRE/.libs/libpcre2-8.a: $PCRE/Makefile + cd $PCRE \\ + && \$(MAKE) libpcre2-8.la + +END + + fi + + +else + + # PCRE + + case "$NGX_CC_NAME" in + + msvc) + ngx_makefile=makefile.msvc + ngx_opt="CPU_OPT=\"$CPU_OPT\" LIBC=$LIBC" + ngx_pcre="PCRE=\"$PCRE\"" + ;; + + owc) + ngx_makefile=makefile.owc + ngx_opt="CPU_OPT=\"$CPU_OPT\"" + ngx_pcre=`echo PCRE=\"$PCRE\" | sed -e "s/\//$ngx_regex_dirsep/g"` + ;; + + bcc) + ngx_makefile=makefile.bcc + ngx_opt="-DCPU_OPT=\"$CPU_OPT\"" + ngx_pcre=`echo \-DPCRE=\"$PCRE\" \ + | sed -e "s/\//$ngx_regex_dirsep/g"` + ;; + + *) + ngx_makefile= + ;; + + esac + + + if [ -n "$ngx_makefile" ]; then + + cat << END >> $NGX_MAKEFILE + +`echo "$PCRE/pcre.lib: $PCRE/pcre.h $NGX_MAKEFILE" \ + | sed -e "s/\//$ngx_regex_dirsep/g"` \$(MAKE) -f auto/lib/pcre/$ngx_makefile $ngx_pcre $ngx_opt `echo "$PCRE/pcre.h:" | sed -e "s/\//$ngx_regex_dirsep/g"` @@ -40,9 +146,8 @@ case "$NGX_PLATFORM" in END - ;; + else - *) cat << END >> $NGX_MAKEFILE $PCRE/pcre.h: $PCRE/Makefile @@ -59,6 +164,6 @@ $PCRE/.libs/libpcre.a: $PCRE/Makefile END - ;; + fi -esac +fi diff --git a/auto/lib/pcre/makefile.bcc b/auto/lib/pcre/makefile.bcc index 1c140d6..7a0f2be 100644 --- a/auto/lib/pcre/makefile.bcc +++ b/auto/lib/pcre/makefile.bcc @@ -4,7 +4,8 @@ CFLAGS = -q -O2 -tWM -w-8004 $(CPU_OPT) -PCREFLAGS = -DHAVE_CONFIG_H -DPCRE_STATIC -DPOSIX_MALLOC_THRESHOLD=10 +PCREFLAGS = -DHAVE_CONFIG_H -DPCRE_STATIC -DPOSIX_MALLOC_THRESHOLD=10 \ + -DSUPPORT_PCRE8 -DHAVE_MEMMOVE pcre.lib: @@ -12,8 +13,8 @@ pcre.lib: bcc32 -c $(CFLAGS) -I. $(PCREFLAGS) pcre_*.c - > pcre.lst - for %n in (*.obj) do @echo +%n & >> pcre.lst + copy /y nul pcre.lst + for %n in (*.obj) do @echo +%n ^^& >> pcre.lst echo + >> pcre.lst tlib pcre.lib @pcre.lst diff --git a/auto/lib/pcre/makefile.msvc b/auto/lib/pcre/makefile.msvc index 7a8da71..07fd9a2 100644 --- a/auto/lib/pcre/makefile.msvc +++ b/auto/lib/pcre/makefile.msvc @@ -4,7 +4,8 @@ CFLAGS = -O2 -Ob1 -Oi -Gs $(LIBC) $(CPU_OPT) -PCREFLAGS = -DHAVE_CONFIG_H -DPCRE_STATIC -DPOSIX_MALLOC_THRESHOLD=10 +PCREFLAGS = -DHAVE_CONFIG_H -DPCRE_STATIC -DPOSIX_MALLOC_THRESHOLD=10 \ + -DSUPPORT_PCRE8 -DHAVE_MEMMOVE pcre.lib: diff --git a/auto/lib/pcre/makefile.owc b/auto/lib/pcre/makefile.owc index bfb6920..122fd5b 100644 --- a/auto/lib/pcre/makefile.owc +++ b/auto/lib/pcre/makefile.owc @@ -4,7 +4,8 @@ CFLAGS = -c -zq -bt=nt -ot -op -oi -oe -s -bm $(CPU_OPT) -PCREFLAGS = -DHAVE_CONFIG_H -DPCRE_STATIC -DPOSIX_MALLOC_THRESHOLD=10 +PCREFLAGS = -DHAVE_CONFIG_H -DPCRE_STATIC -DPOSIX_MALLOC_THRESHOLD=10 & + -DSUPPORT_PCRE8 -DHAVE_MEMMOVE pcre.lib: diff --git a/auto/lib/perl/conf b/auto/lib/perl/conf index 52c7084..e16a1bc 100644 --- a/auto/lib/perl/conf +++ b/auto/lib/perl/conf @@ -12,16 +12,26 @@ NGX_PERL_VER=`$NGX_PERL -v 2>&1 | grep '^This is perl' 2>&1 \ if test -n "$NGX_PERL_VER"; then echo " + perl version: $NGX_PERL_VER" - if [ "`echo 'use 5.006001; print "OK"' | $NGX_PERL 2>&1`" != OK ]; then + if [ "`$NGX_PERL -e 'use 5.008006; print "OK"'`" != "OK" ]; then echo - echo "$0: error: perl 5.6.1 or higher is required" + echo "$0: error: perl 5.8.6 or higher is required" + echo + + exit 1; + fi + + if [ "`$NGX_PERL -MExtUtils::Embed -e 'print "OK"'`" != "OK" ]; then + echo + echo "$0: error: perl module ExtUtils::Embed is required" echo exit 1; fi - NGX_PERL_CFLAGS="$CFLAGS `$NGX_PERL -MExtUtils::Embed -e ccopts`" NGX_PM_CFLAGS=`$NGX_PERL -MExtUtils::Embed -e ccopts` + NGX_PM_LDFLAGS=`$NGX_PERL -MConfig -e 'print $Config{lddlflags}'` + + NGX_PERL_CFLAGS="$CFLAGS `$NGX_PERL -MExtUtils::Embed -e ccopts`" # gcc 4.1/4.2 warn about unused values in pTHX_ NGX_PERL_CFLAGS=`echo $NGX_PERL_CFLAGS \ @@ -32,6 +42,10 @@ if test -n "$NGX_PERL_VER"; then ngx_perl_ldopts=`$NGX_PERL -MExtUtils::Embed -e ldopts` + ngx_perl_dlext=`$NGX_PERL -MConfig -e 'print $Config{dlext}'` + ngx_perl_libdir="src/http/modules/perl/blib/arch/auto" + ngx_perl_module="$ngx_perl_libdir/nginx/nginx.$ngx_perl_dlext" + if $NGX_PERL -V:usemultiplicity | grep define > /dev/null; then have=NGX_HAVE_PERL_MULTIPLICITY . auto/have echo " + perl interpreter multiplicity found" @@ -42,8 +56,17 @@ if test -n "$NGX_PERL_VER"; then ngx_perl_ldopts=`echo $ngx_perl_ldopts | sed 's/ -pthread//'` fi - CORE_LINK="$CORE_LINK $ngx_perl_ldopts" - LINK_DEPS="$LINK_DEPS $NGX_OBJS/src/http/modules/perl/blib/arch/auto/nginx/nginx.so" + if [ "$NGX_SYSTEM" = "Darwin" ]; then + # OS X system perl wants to link universal binaries + ngx_perl_ldopts=`echo $ngx_perl_ldopts \ + | sed -e 's/-arch i386//' -e 's/-arch x86_64//'` + fi + + if [ $USE_PERL = YES ]; then + CORE_LINK="$CORE_LINK $ngx_perl_ldopts" + fi + + NGX_LIB_PERL="$ngx_perl_ldopts" if test -n "$NGX_PERL_MODULES"; then have=NGX_PERL_MODULES value="(u_char *) \"$NGX_PERL_MODULES\"" @@ -53,7 +76,7 @@ if test -n "$NGX_PERL_VER"; then else echo - echo "$0: error: perl 5.6.1 or higher is required" + echo "$0: error: perl 5.8.6 or higher is required" echo exit 1; diff --git a/auto/lib/perl/make b/auto/lib/perl/make index b4df01d..74e0f3a 100644 --- a/auto/lib/perl/make +++ b/auto/lib/perl/make @@ -5,32 +5,42 @@ cat << END >> $NGX_MAKEFILE -$NGX_OBJS/src/http/modules/perl/blib/arch/auto/nginx/nginx.so: \ - src/http/modules/perl/nginx.pm \ - src/http/modules/perl/nginx.xs \ - src/http/modules/perl/ngx_http_perl_module.h \ - $NGX_OBJS/src/http/modules/perl/Makefile - cp -p src/http/modules/perl/nginx.* $NGX_OBJS/src/http/modules/perl/ +$NGX_OBJS/src/http/modules/perl/ngx_http_perl_module.o: \\ + $NGX_OBJS/$ngx_perl_module - cd $NGX_OBJS/src/http/modules/perl && make +$NGX_OBJS/$ngx_perl_module: \\ + \$(CORE_DEPS) \$(HTTP_DEPS) \\ + src/http/modules/perl/ngx_http_perl_module.h \\ + $NGX_OBJS/src/http/modules/perl/Makefile + cd $NGX_OBJS/src/http/modules/perl && \$(MAKE) rm -rf $NGX_OBJS/install_perl -$NGX_OBJS/src/http/modules/perl/Makefile: \ - src/http/modules/perl/Makefile.PL \ - src/http/modules/perl/nginx.pm - cp -p src/http/modules/perl/nginx.* $NGX_OBJS/src/http/modules/perl/ +$NGX_OBJS/src/http/modules/perl/Makefile: \\ + $NGX_AUTO_CONFIG_H \\ + src/core/nginx.h \\ + src/http/modules/perl/Makefile.PL \\ + src/http/modules/perl/nginx.pm \\ + src/http/modules/perl/nginx.xs \\ + src/http/modules/perl/typemap + grep 'define NGINX_VERSION' src/core/nginx.h \\ + | sed -e 's/^.*"\(.*\)".*/\1/' > \\ + $NGX_OBJS/src/http/modules/perl/version + sed "s/%%VERSION%%/\`cat $NGX_OBJS/src/http/modules/perl/version\`/" \\ + src/http/modules/perl/nginx.pm > \\ + $NGX_OBJS/src/http/modules/perl/nginx.pm + cp -p src/http/modules/perl/nginx.xs $NGX_OBJS/src/http/modules/perl/ cp -p src/http/modules/perl/typemap $NGX_OBJS/src/http/modules/perl/ cp -p src/http/modules/perl/Makefile.PL $NGX_OBJS/src/http/modules/perl/ - cd $NGX_OBJS/src/http/modules/perl \ - && NGX_PM_CFLAGS="\$(NGX_PM_CFLAGS) -g $NGX_CC_OPT" \ - NGX_PCRE=$PCRE \ - NGX_OBJS=$NGX_OBJS \ - NGX_OPENSSL=$OPENSSL \ - $NGX_PERL Makefile.PL \ - LIB=$NGX_PERL_MODULES \ + cd $NGX_OBJS/src/http/modules/perl \\ + && NGX_PM_CFLAGS="\$(NGX_PM_CFLAGS) -g $NGX_CC_OPT" \\ + NGX_PM_LDFLAGS="$NGX_LD_OPT \$(NGX_PM_LDFLAGS)" \\ + NGX_INCS="$CORE_INCS $NGX_OBJS $HTTP_INCS" \\ + NGX_DEPS="\$(CORE_DEPS) \$(HTTP_DEPS)" \\ + $NGX_PERL Makefile.PL \\ + LIB=$NGX_PERL_MODULES \\ INSTALLSITEMAN3DIR=$NGX_PERL_MODULES_MAN END diff --git a/auto/lib/sha1/conf b/auto/lib/sha1/conf deleted file mode 100644 index 1e644c0..0000000 --- a/auto/lib/sha1/conf +++ /dev/null @@ -1,79 +0,0 @@ - -# Copyright (C) Igor Sysoev -# Copyright (C) Nginx, Inc. - - -if [ $SHA1 != NONE ]; then - - have=NGX_HAVE_SHA1 . auto/have - CORE_INCS="$CORE_INCS $SHA1" - - case "$NGX_CC_NAME" in - - msvc* | owc* | bcc) - LINK_DEPS="$LINK_DEPS $SHA1/sha1.lib" - CORE_LIBS="$CORE_LIBS $SHA1/sha1.lib" - ;; - - icc*) - LINK_DEPS="$LINK_DEPS $SHA1/libsha.a" - - # to allow -ipo optimization we link with the *.o but not library - CORE_LIBS="$CORE_LIBS $SHA1/sha1_dgst.o" - - if [ $SHA1_ASM = YES ]; then - CORE_LIBS="$CORE_LIBS $SHA1/asm/sx86-elf.o" - fi - ;; - - *) - LINK_DEPS="$LINK_DEPS $SHA1/libsha.a" - CORE_LIBS="$CORE_LIBS $SHA1/libsha.a" - #CORE_LIBS="$CORE_LIBS -L $SHA1 -lsha" - ;; - - esac - -else - - if [ "$NGX_PLATFORM" != win32 ]; then - - SHA1=NO - - # FreeBSD - - ngx_feature="sha1 in system md library" - ngx_feature_name=NGX_HAVE_SHA1 - ngx_feature_run=no - ngx_feature_incs="#include " - ngx_feature_path= - ngx_feature_libs="-lmd" - ngx_feature_test="SHA_CTX sha1; SHA1_Init(&sha1)" - . auto/feature - - ngx_sha1_lib="system md" - - if [ $ngx_found = no ]; then - - # OpenSSL crypto library - - ngx_feature="OpenSSL sha1 crypto library" - ngx_feature_incs="#include " - ngx_feature_libs="-lcrypto" - . auto/feature - - ngx_sha1_lib="system crypto" - - if [ $ngx_found = yes ]; then - have=NGX_HAVE_OPENSSL_SHA1_H . auto/have - fi - fi - - if [ $ngx_found = yes ]; then - CORE_LIBS="$CORE_LIBS $ngx_feature_libs" - SHA1=YES - SHA1_LIB=$ngx_sha1_lib - fi - fi - -fi diff --git a/auto/lib/sha1/make b/auto/lib/sha1/make deleted file mode 100644 index fc10aae..0000000 --- a/auto/lib/sha1/make +++ /dev/null @@ -1,96 +0,0 @@ - -# Copyright (C) Igor Sysoev -# Copyright (C) Nginx, Inc. - - -case "$NGX_CC_NAME" in - - msvc*) - ngx_makefile=makefile.msvc - ngx_opt="CPU_OPT=\"$CPU_OPT\" LIBC=$LIBC SHA1_ASM=$SHA1_ASM" - ngx_sha1="SHA1=\"$SHA1\"" - ;; - - owc*) - ngx_makefile=makefile.owc - ngx_opt="CPU_OPT=\"$CPU_OPT\"" - ngx_sha1=`echo SHA1=\"$SHA1\" | sed -e "s/\//$ngx_regex_dirsep/g"` - ;; - - bcc) - ngx_makefile=makefile.bcc - ngx_opt="-DCPU_OPT=\"$CPU_OPT\" -DSHA1_ASM=$SHA1_ASM" - ngx_sha1=`echo \-DSHA1=\"$SHA1\" | sed -e "s/\//$ngx_regex_dirsep/g"` - ;; - -esac - - -done=NO - - -case "$NGX_PLATFORM" in - - win32) - cat << END >> $NGX_MAKEFILE - -`echo "$SHA1/sha1.lib: $NGX_MAKEFILE" | sed -e "s/\//$ngx_regex_dirsep/g"` - \$(MAKE) -f auto/lib/sha1/$ngx_makefile $ngx_opt $ngx_sha1 - -END - - done=YES - ;; - - SunOS:*:i86pc) - if [ $SHA1_ASM = YES ]; then - - cat << END >> $NGX_MAKEFILE - -$SHA1/libsha.a: $NGX_MAKEFILE - cd $SHA1 \\ - && \$(MAKE) CFLAGS="$SHA1_OPT -DSOL -DSHA1_ASM -DL_ENDIAN" \\ - CC="\$(CC)" CPP="\$(CPP)" \\ - SHA_ASM_OBJ=asm/sx86-sol.o clean libsha.a - -END - - done=YES - fi - ;; - - # FreeBSD: i386 - # Linux: i686 - - *:i386 | *:i686) - if [ $SHA1_ASM = YES ]; then - - cat << END >> $NGX_MAKEFILE - -$SHA1/libsha.a: $NGX_MAKEFILE - cd $SHA1 \\ - && \$(MAKE) CFLAGS="$SHA1_OPT -DELF -DSHA1_ASM -DL_ENDIAN" \\ - CC="\$(CC)" CPP="\$(CPP)" \\ - SHA_ASM_OBJ=asm/sx86-elf.o clean libsha.a - -END - - done=YES - fi - ;; - -esac - - -if [ $done = NO ]; then - - cat << END >> $NGX_MAKEFILE - -$SHA1/libsha.a: $NGX_MAKEFILE - cd $SHA1 \\ - && \$(MAKE) CFLAGS="$SHA1_OPT" \\ - CC="\$(CC)" SHA_ASM_OBJ= clean libsha.a - -END - -fi diff --git a/auto/lib/sha1/makefile.bcc b/auto/lib/sha1/makefile.bcc deleted file mode 100644 index b0685fa..0000000 --- a/auto/lib/sha1/makefile.bcc +++ /dev/null @@ -1,22 +0,0 @@ - -# Copyright (C) Igor Sysoev -# Copyright (C) Nginx, Inc. - - -CFLAGS = -q -O2 -tWM $(CPU_OPT) -DL_ENDIAN - -!if "$(SHA1_ASM)" == "YES" - -sha1.lib: - cd $(SHA1) - bcc32 -c $(CFLAGS) -DSHA1_ASM sha1dgst.c - tlib sha1.lib +sha1dgst.obj +"asm\s-win32.obj" - -!else - -sha1.lib: - cd $(SHA1) - bcc32 -c $(CFLAGS) sha1dgst.c - tlib sha1.lib +sha1dgst.obj - -!endif diff --git a/auto/lib/sha1/makefile.msvc b/auto/lib/sha1/makefile.msvc deleted file mode 100644 index 3cbd21b..0000000 --- a/auto/lib/sha1/makefile.msvc +++ /dev/null @@ -1,22 +0,0 @@ - -# Copyright (C) Igor Sysoev -# Copyright (C) Nginx, Inc. - - -CFLAGS = -nologo -O2 -Ob1 -Oi -Gs $(LIBC) $(CPU_OPT) -D L_ENDIAN - -!IF "$(SHA1_ASM)" == "YES" - -sha1.lib: - cd $(SHA1) - cl -c $(CFLAGS) -D SHA1_ASM sha1dgst.c - link -lib -out:sha1.lib sha1dgst.obj asm/s-win32.obj - -!ELSE - -sha1.lib: - cd $(SHA1) - cl -c $(CFLAGS) sha1dgst.c - link -lib -out:sha1.lib sha1dgst.obj - -!ENDIF diff --git a/auto/lib/sha1/makefile.owc b/auto/lib/sha1/makefile.owc deleted file mode 100644 index fc095cc..0000000 --- a/auto/lib/sha1/makefile.owc +++ /dev/null @@ -1,11 +0,0 @@ - -# Copyright (C) Igor Sysoev -# Copyright (C) Nginx, Inc. - - -CFLAGS = -zq -bt=nt -bm -ot -op -oi -oe -s $(CPU_OPT) - -sha1.lib: - cd $(SHA1) - wcl386 -c $(CFLAGS) -dL_ENDIAN sha1dgst.c - wlib -n sha1.lib sha1dgst.obj diff --git a/auto/lib/test b/auto/lib/test deleted file mode 100644 index 907e235..0000000 --- a/auto/lib/test +++ /dev/null @@ -1,40 +0,0 @@ - -# Copyright (C) Igor Sysoev -# Copyright (C) Nginx, Inc. - - -echo $ngx_n "checking for $ngx_lib ...$ngx_c" - -cat << END >> $NGX_AUTOCONF_ERR - ----------------------------------------- -checking for $ngx_lib - -END - -ngx_found=no - -cat << END > $NGX_AUTOTEST.c - -$ngx_lib_incs - -int main() { - $ngx_lib_test; - return 0; -} - - -eval "$CC $cc_test_flags $ngx_lib_cflags \ - -o $NGX_AUTOTEST $NGX_AUTOTEST.c $ngx_libs \ - >> $NGX_ERR 2>&1" - -if [ -x $NGX_AUTOTEST ]; then - echo " found" - - ngx_found=yes - -else - echo " not found" -fi - -rm $NGX_AUTOTEST* diff --git a/auto/lib/zlib/conf b/auto/lib/zlib/conf index cefc874..239592e 100644 --- a/auto/lib/zlib/conf +++ b/auto/lib/zlib/conf @@ -8,12 +8,14 @@ if [ $ZLIB != NONE ]; then case "$NGX_CC_NAME" in - msvc* | owc* | bcc) + msvc | owc | bcc) + have=NGX_ZLIB . auto/have LINK_DEPS="$LINK_DEPS $ZLIB/zlib.lib" CORE_LIBS="$CORE_LIBS $ZLIB/zlib.lib" ;; - icc*) + icc) + have=NGX_ZLIB . auto/have LINK_DEPS="$LINK_DEPS $ZLIB/libz.a" # to allow -ipo optimization we link with the *.o but not library @@ -30,6 +32,7 @@ if [ $ZLIB != NONE ]; then ;; *) + have=NGX_ZLIB . auto/have LINK_DEPS="$LINK_DEPS $ZLIB/libz.a" CORE_LIBS="$CORE_LIBS $ZLIB/libz.a" #CORE_LIBS="$CORE_LIBS -L $ZLIB -lz" @@ -45,7 +48,7 @@ else # FreeBSD, Solaris, Linux ngx_feature="zlib library" - ngx_feature_name= + ngx_feature_name="NGX_ZLIB" ngx_feature_run=no ngx_feature_incs="#include " ngx_feature_path= diff --git a/auto/lib/zlib/make b/auto/lib/zlib/make index 9401a1d..0082ad5 100644 --- a/auto/lib/zlib/make +++ b/auto/lib/zlib/make @@ -5,14 +5,14 @@ case "$NGX_CC_NAME" in - msvc*) + msvc) ngx_makefile=makefile.msvc ngx_opt="CPU_OPT=\"$CPU_OPT\" LIBC=$LIBC" ngx_zlib="ZLIB=\"$ZLIB\"" ;; - owc*) + owc) ngx_makefile=makefile.owc ngx_opt="CPU_OPT=\"$CPU_OPT\"" ngx_zlib=`echo ZLIB=\"$ZLIB\" | sed -e "s/\//$ngx_regex_dirsep/g"` @@ -24,6 +24,10 @@ case "$NGX_CC_NAME" in ngx_zlib=`echo \-DZLIB=\"$ZLIB\" | sed -e "s/\//$ngx_regex_dirsep/g"` ;; + *) + ngx_makefile= + ;; + esac @@ -33,13 +37,30 @@ done=NO case "$NGX_PLATFORM" in win32) - cat << END >> $NGX_MAKEFILE + + if [ -n "$ngx_makefile" ]; then + cat << END >> $NGX_MAKEFILE `echo "$ZLIB/zlib.lib: $NGX_MAKEFILE" | sed -e "s/\//$ngx_regex_dirsep/g"` \$(MAKE) -f auto/lib/zlib/$ngx_makefile $ngx_opt $ngx_zlib END + else + + cat << END >> $NGX_MAKEFILE + +$ZLIB/libz.a: $NGX_MAKEFILE + cd $ZLIB \\ + && \$(MAKE) distclean \\ + && \$(MAKE) -f win32/Makefile.gcc \\ + CFLAGS="$ZLIB_OPT" CC="\$(CC)" \\ + libz.a + +END + + fi + done=YES ;; diff --git a/auto/lib/zlib/makefile.bcc b/auto/lib/zlib/makefile.bcc index 56f8356..97a30ea 100644 --- a/auto/lib/zlib/makefile.bcc +++ b/auto/lib/zlib/makefile.bcc @@ -8,8 +8,10 @@ CFLAGS = -q -O2 -tWM -w-8004 -w-8012 $(CPU_OPT) zlib.lib: cd $(ZLIB) - bcc32 -c $(CFLAGS) adler32.c crc32.c deflate.c trees.c zutil.c \ - compress.c + bcc32 -c $(CFLAGS) adler32.c crc32.c deflate.c \ + trees.c zutil.c compress.c \ + inflate.c inffast.c inftrees.c tlib zlib.lib +adler32.obj +crc32.obj +deflate.obj \ - +trees.obj +zutil.obj +compress.obj + +trees.obj +zutil.obj +compress.obj \ + +inflate.obj +inffast.obj +inftrees.obj diff --git a/auto/lib/zlib/makefile.msvc b/auto/lib/zlib/makefile.msvc index 2c7c1ae..6fbd691 100644 --- a/auto/lib/zlib/makefile.msvc +++ b/auto/lib/zlib/makefile.msvc @@ -8,7 +8,10 @@ CFLAGS = -nologo -O2 -Ob1 -Oi -Gs $(LIBC) $(CPU_OPT) zlib.lib: cd $(ZLIB) - cl -c $(CFLAGS) adler32.c crc32.c deflate.c trees.c zutil.c compress.c + cl -c $(CFLAGS) adler32.c crc32.c deflate.c \ + trees.c zutil.c compress.c \ + inflate.c inffast.c inftrees.c link -lib -out:zlib.lib adler32.obj crc32.obj deflate.obj \ - trees.obj zutil.obj compress.obj + trees.obj zutil.obj compress.obj \ + inflate.obj inffast.obj inftrees.obj diff --git a/auto/lib/zlib/makefile.owc b/auto/lib/zlib/makefile.owc index f75e66d..9e123be 100644 --- a/auto/lib/zlib/makefile.owc +++ b/auto/lib/zlib/makefile.owc @@ -9,6 +9,6 @@ zlib.lib: cd $(ZLIB) wcl386 -c $(CFLAGS) adler32.c crc32.c deflate.c trees.c zutil.c & - compress.c + compress.c inflate.c inffast.c inftrees.c wlib -n zlib.lib adler32.obj crc32.obj deflate.obj trees.obj & - zutil.obj compress.obj + zutil.obj compress.obj inflate.obj inffast.obj inftrees.obj diff --git a/auto/lib/zlib/patch.zlib.h b/auto/lib/zlib/patch.zlib.h deleted file mode 100644 index 122f7fa..0000000 --- a/auto/lib/zlib/patch.zlib.h +++ /dev/null @@ -1,10 +0,0 @@ ---- zlib.h Thu Jul 9 20:06:56 1998 -+++ zlib-1.1.3/zlib.h Tue Mar 22 13:41:04 2005 -@@ -709,7 +709,6 @@ - (0 in case of error). - */ - --ZEXTERN int ZEXPORTVA gzprintf OF((gzFile file, const char *format, ...)); - /* - Converts, formats, and writes the args to the compressed file under - control of the format string, as in fprintf. gzprintf returns the number of diff --git a/auto/make b/auto/make index e7f5490..fad0844 100644 --- a/auto/make +++ b/auto/make @@ -2,14 +2,21 @@ # 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/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 @@ -30,12 +37,13 @@ END if test -n "$NGX_PERL_CFLAGS"; then echo NGX_PERL_CFLAGS = $NGX_PERL_CFLAGS >> $NGX_MAKEFILE echo NGX_PM_CFLAGS = $NGX_PM_CFLAGS >> $NGX_MAKEFILE + echo NGX_PM_LDFLAGS = $NGX_PM_LDFLAGS >> $NGX_MAKEFILE fi # ALL_INCS, required by the addons and by OpenWatcom C precompiled headers -ngx_incs=`echo $CORE_INCS $NGX_OBJS $HTTP_INCS $MAIL_INCS\ +ngx_incs=`echo $CORE_INCS $NGX_OBJS $HTTP_INCS $MAIL_INCS $STREAM_INCS\ | sed -e "s/ *\([^ ][^ ]*\)/$ngx_regex_cont$ngx_include_opt\1/g" \ -e "s/\//$ngx_regex_dirsep/g"` @@ -49,7 +57,7 @@ END ngx_all_srcs="$CORE_SRCS" -# the core dependences and include pathes +# the core dependencies and include paths ngx_deps=`echo $CORE_DEPS $NGX_AUTO_CONFIG_H $NGX_PCH \ | sed -e "s/ *\([^ ][^ ]*\)/$ngx_regex_cont\1/g" \ @@ -69,7 +77,7 @@ CORE_INCS = $ngx_include_opt$ngx_incs END -# the http dependences and include pathes +# the http dependencies and include paths if [ $HTTP = YES ]; then @@ -95,11 +103,13 @@ END fi -# the mail dependences and include pathes +# the mail dependencies and include paths -if [ $MAIL = YES ]; then +if [ $MAIL != NO ]; then - ngx_all_srcs="$ngx_all_srcs $MAIL_SRCS" + if [ $MAIL = YES ]; then + ngx_all_srcs="$ngx_all_srcs $MAIL_SRCS" + fi ngx_deps=`echo $MAIL_DEPS \ | sed -e "s/ *\([^ ][^ ]*\)/$ngx_regex_cont\1/g" \ @@ -121,10 +131,38 @@ END fi -ngx_all_srcs="$ngx_all_srcs $NGX_MISC_SRCS" +# the stream dependencies and include paths + +if [ $STREAM != NO ]; then + + if [ $STREAM = YES ]; then + ngx_all_srcs="$ngx_all_srcs $STREAM_SRCS" + fi + + ngx_deps=`echo $STREAM_DEPS \ + | sed -e "s/ *\([^ ][^ ]*\)/$ngx_regex_cont\1/g" \ + -e "s/\//$ngx_regex_dirsep/g"` + + ngx_incs=`echo $STREAM_INCS \ + | sed -e "s/ *\([^ ][^ ]*\)/$ngx_regex_cont$ngx_include_opt\1/g" \ + -e "s/\//$ngx_regex_dirsep/g"` + + cat << END >> $NGX_MAKEFILE + +STREAM_DEPS = $ngx_deps -if test -n "$NGX_ADDON_SRCS"; then +STREAM_INCS = $ngx_include_opt$ngx_incs + +END + +fi + + +ngx_all_srcs="$ngx_all_srcs $MISC_SRCS" + + +if test -n "$NGX_ADDON_SRCS$DYNAMIC_MODULES"; then cat << END >> $NGX_MAKEFILE @@ -141,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 @@ -177,6 +215,7 @@ ngx_objs=`echo $ngx_all_objs $ngx_modules_obj \ | sed -e "s/ *\([^ ][^ ]*\)/$ngx_long_regex_cont\1/g" \ -e "s/\//$ngx_regex_dirsep/g"` +ngx_libs= if test -n "$NGX_LD_OPT$CORE_LIBS"; then ngx_libs=`echo $NGX_LD_OPT $CORE_LIBS \ | sed -e "s/\//$ngx_regex_dirsep/g" -e "s/^/$ngx_long_regex_cont/"` @@ -185,13 +224,22 @@ fi ngx_link=${CORE_LINK:+`echo $CORE_LINK \ | sed -e "s/\//$ngx_regex_dirsep/g" -e "s/^/$ngx_long_regex_cont/"`} +ngx_main_link=${MAIN_LINK:+`echo $MAIN_LINK \ + | sed -e "s/\//$ngx_regex_dirsep/g" -e "s/^/$ngx_long_regex_cont/"`} + cat << END >> $NGX_MAKEFILE -$NGX_OBJS${ngx_dirsep}nginx${ngx_binext}: $ngx_deps$ngx_spacer - \$(LINK) ${ngx_long_start}${ngx_binout}$NGX_OBJS${ngx_dirsep}nginx$ngx_long_cont$ngx_objs$ngx_libs$ngx_link +build: binary modules manpage + +binary: $NGX_OBJS${ngx_dirsep}nginx$ngx_binext + +$NGX_OBJS${ngx_dirsep}nginx$ngx_binext: $ngx_deps$ngx_spacer + \$(LINK) $ngx_long_start$ngx_binout$NGX_OBJS${ngx_dirsep}nginx$ngx_binext$ngx_long_cont$ngx_objs$ngx_libs$ngx_link$ngx_main_link $ngx_rcc -${ngx_long_end} +$ngx_long_end + +modules: END @@ -240,7 +288,7 @@ if [ $HTTP = YES ]; then ngx_cc="\$(CC) $ngx_compile_opt \$(CFLAGS) $ngx_use_pch \$(ALL_INCS)" else ngx_cc="\$(CC) $ngx_compile_opt \$(CFLAGS) \$(CORE_INCS) \$(HTTP_INCS)" - ngx_perl_cc="\$(CC) $ngx_compile_opt \$(NGX_PERL_CFLAGS) " + ngx_perl_cc="\$(CC) $ngx_compile_opt \$(NGX_PERL_CFLAGS)" ngx_perl_cc="$ngx_perl_cc \$(CORE_INCS) \$(HTTP_INCS)" fi @@ -271,7 +319,7 @@ $ngx_obj: \$(CORE_DEPS) \$(HTTP_DEPS)$ngx_cont$ngx_src END fi - done + done fi @@ -301,18 +349,48 @@ $ngx_obj: \$(CORE_DEPS) \$(MAIL_DEPS)$ngx_cont$ngx_src $ngx_cc$ngx_tab$ngx_objout$ngx_obj$ngx_tab$ngx_src$NGX_AUX END - done + done + +fi + + +# the stream sources + +if [ $STREAM = YES ]; then + + if test -n "$NGX_PCH"; then + ngx_cc="\$(CC) $ngx_compile_opt \$(CFLAGS) $ngx_use_pch \$(ALL_INCS)" + else + ngx_cc="\$(CC) $ngx_compile_opt \$(CFLAGS) \$(CORE_INCS) \$(STREAM_INCS)" + fi + + for ngx_src in $STREAM_SRCS + do + ngx_src=`echo $ngx_src | sed -e "s/\//$ngx_regex_dirsep/g"` + ngx_obj=`echo $ngx_src \ + | sed -e "s#^\(.*\.\)cpp\\$#$ngx_objs_dir\1$ngx_objext#g" \ + -e "s#^\(.*\.\)cc\\$#$ngx_objs_dir\1$ngx_objext#g" \ + -e "s#^\(.*\.\)c\\$#$ngx_objs_dir\1$ngx_objext#g" \ + -e "s#^\(.*\.\)S\\$#$ngx_objs_dir\1$ngx_objext#g"` + + cat << END >> $NGX_MAKEFILE + +$ngx_obj: \$(CORE_DEPS) \$(STREAM_DEPS)$ngx_cont$ngx_src + $ngx_cc$ngx_tab$ngx_objout$ngx_obj$ngx_tab$ngx_src$NGX_AUX + +END + done fi # the misc sources -if test -n "$NGX_MISC_SRCS"; then +if test -n "$MISC_SRCS"; then ngx_cc="\$(CC) $ngx_compile_opt \$(CFLAGS) $ngx_use_pch \$(ALL_INCS)" - for ngx_src in $NGX_MISC_SRCS + for ngx_src in $MISC_SRCS do ngx_src=`echo $ngx_src | sed -e "s/\//$ngx_regex_dirsep/g"` ngx_obj=`echo $ngx_src \ @@ -327,7 +405,7 @@ $ngx_obj: \$(CORE_DEPS) $ngx_cont$ngx_src $ngx_cc$ngx_tab$ngx_objout$ngx_obj$ngx_tab$ngx_src$NGX_AUX END - done + done fi @@ -340,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"` @@ -359,16 +437,16 @@ $ngx_obj: \$(ADDON_DEPS)$ngx_cont$ngx_src $ngx_cc$ngx_tab$ngx_objout$ngx_obj$ngx_tab$ngx_src$NGX_AUX END - done + done fi # the addons config.make -if test -n "$NGX_ADDONS"; then +if test -n "$NGX_ADDONS$DYNAMIC_ADDONS"; then - for ngx_addon_dir in $NGX_ADDONS + for ngx_addon_dir in $NGX_ADDONS $DYNAMIC_ADDONS do if test -f $ngx_addon_dir/config.make; then . $ngx_addon_dir/config.make @@ -415,3 +493,187 @@ $ngx_pch END fi + + +# dynamic modules + +if test -n "$NGX_PCH"; then + ngx_cc="\$(CC) $ngx_compile_opt $ngx_pic_opt \$(CFLAGS) $ngx_use_pch \$(ALL_INCS)" +else + ngx_cc="\$(CC) $ngx_compile_opt $ngx_pic_opt \$(CFLAGS) \$(ALL_INCS)" + ngx_perl_cc="\$(CC) $ngx_compile_opt $ngx_pic_opt \$(NGX_PERL_CFLAGS)" + ngx_perl_cc="$ngx_perl_cc \$(ALL_INCS)" +fi + +for ngx_module in $DYNAMIC_MODULES +do + eval ngx_module_srcs="\$${ngx_module}_SRCS" + eval ngx_module_shrd="\$${ngx_module}_SHRD" + eval eval ngx_module_libs="\\\"\$${ngx_module}_LIBS\\\"" + + eval ngx_module_modules="\$${ngx_module}_MODULES" + eval ngx_module_order="\$${ngx_module}_ORDER" + + ngx_modules_c=$NGX_OBJS/${ngx_module}_modules.c + + cat << END > $ngx_modules_c + +#include +#include + +END + + for mod in $ngx_module_modules + do + echo "extern ngx_module_t $mod;" >> $ngx_modules_c + done + + echo >> $ngx_modules_c + echo 'ngx_module_t *ngx_modules[] = {' >> $ngx_modules_c + + for mod in $ngx_module_modules + do + echo " &$mod," >> $ngx_modules_c + done + + cat << END >> $ngx_modules_c + NULL +}; + +END + + echo 'char *ngx_module_names[] = {' >> $ngx_modules_c + + for mod in $ngx_module_modules + do + echo " \"$mod\"," >> $ngx_modules_c + done + + cat << END >> $ngx_modules_c + NULL +}; + +END + + echo 'char *ngx_module_order[] = {' >> $ngx_modules_c + + for mod in $ngx_module_order + do + echo " \"$mod\"," >> $ngx_modules_c + done + + cat << END >> $ngx_modules_c + NULL +}; + +END + + ngx_modules_c=`echo $ngx_modules_c | sed -e "s/\//$ngx_regex_dirsep/g"` + + ngx_modules_obj=`echo $ngx_modules_c \ + | sed -e "s/\(.*\.\)c/\1$ngx_objext/"` + + ngx_module_objs= + for ngx_src in $ngx_module_srcs $ngx_module_shrd + do + case "$ngx_src" in + src/*) + ngx_obj=$ngx_src + ;; + *) + ngx_obj="addon/`basename_last2 \`dirname $ngx_src\``" + mkdir -p $NGX_OBJS/$ngx_obj + ngx_obj="$ngx_obj/`basename $ngx_src`" + ;; + esac + + ngx_module_objs="$ngx_module_objs $ngx_obj" + done + + ngx_module_objs=`echo $ngx_module_objs \ + | sed -e "s#\([^ ]*\.\)cpp#$NGX_OBJS\/\1$ngx_objext#g" \ + -e "s#\([^ ]*\.\)cc#$NGX_OBJS\/\1$ngx_objext#g" \ + -e "s#\([^ ]*\.\)c#$NGX_OBJS\/\1$ngx_objext#g" \ + -e "s#\([^ ]*\.\)S#$NGX_OBJS\/\1$ngx_objext#g"` + + ngx_deps=`echo $ngx_module_objs $ngx_modules_obj $LINK_DEPS \ + | sed -e "s/ *\([^ ][^ ]*\)/$ngx_regex_cont\1/g" \ + -e "s/\//$ngx_regex_dirsep/g"` + + ngx_objs=`echo $ngx_module_objs $ngx_modules_obj \ + | sed -e "s/ *\([^ ][^ ]*\)/$ngx_long_regex_cont\1/g" \ + -e "s/\//$ngx_regex_dirsep/g"` + + ngx_obj=$NGX_OBJS$ngx_dirsep$ngx_module$ngx_modext + + if [ "$NGX_PLATFORM" = win32 ]; then + ngx_module_libs="$CORE_LIBS $ngx_module_libs" + fi + + ngx_libs= + if test -n "$NGX_LD_OPT$ngx_module_libs"; then + ngx_libs=`echo $NGX_LD_OPT $ngx_module_libs \ + | sed -e "s/\//$ngx_regex_dirsep/g" -e "s/^/$ngx_long_regex_cont/"` + fi + + ngx_link=${CORE_LINK:+`echo $CORE_LINK \ + | sed -e "s/\//$ngx_regex_dirsep/g" -e "s/^/$ngx_long_regex_cont/"`} + + ngx_module_link=${MODULE_LINK:+`echo $MODULE_LINK \ + | sed -e "s/\//$ngx_regex_dirsep/g" -e "s/^/$ngx_long_regex_cont/"`} + + + cat << END >> $NGX_MAKEFILE + +modules: $ngx_obj + +$ngx_obj: $ngx_deps$ngx_spacer + \$(LINK) $ngx_long_start$ngx_binout$ngx_obj$ngx_long_cont$ngx_objs$ngx_libs$ngx_link$ngx_module_link +$ngx_long_end + +$ngx_modules_obj: \$(CORE_DEPS)$ngx_cont$ngx_modules_c + $ngx_cc$ngx_tab$ngx_objout$ngx_modules_obj$ngx_tab$ngx_modules_c$NGX_AUX + +END + + for ngx_source in $ngx_module_srcs + do + case "$ngx_source" in + src/*) + ngx_obj=`echo $ngx_source | sed -e "s/\//$ngx_regex_dirsep/g"` + ;; + *) + ngx_obj="addon/`basename_last2 \`dirname $ngx_source\``" + ngx_obj=`echo $ngx_obj/\`basename $ngx_source\` \ + | sed -e "s/\//$ngx_regex_dirsep/g"` + ;; + esac + + ngx_obj=`echo $ngx_obj \ + | sed -e "s#^\(.*\.\)cpp\\$#$ngx_objs_dir\1$ngx_objext#g" \ + -e "s#^\(.*\.\)cc\\$#$ngx_objs_dir\1$ngx_objext#g" \ + -e "s#^\(.*\.\)c\\$#$ngx_objs_dir\1$ngx_objext#g" \ + -e "s#^\(.*\.\)S\\$#$ngx_objs_dir\1$ngx_objext#g"` + + ngx_src=`echo $ngx_source | sed -e "s/\//$ngx_regex_dirsep/g"` + + if [ $ngx_source = src/http/modules/perl/ngx_http_perl_module.c ]; then + + cat << END >> $NGX_MAKEFILE + +$ngx_obj: \$(ADDON_DEPS)$ngx_cont$ngx_src + $ngx_perl_cc$ngx_tab$ngx_objout$ngx_obj$ngx_tab$ngx_src$NGX_AUX + +END + else + + cat << END >> $NGX_MAKEFILE + +$ngx_obj: \$(ADDON_DEPS)$ngx_cont$ngx_src + $ngx_cc$ngx_tab$ngx_objout$ngx_obj$ngx_tab$ngx_src$NGX_AUX + +END + + fi + done +done diff --git a/auto/module b/auto/module new file mode 100644 index 0000000..3857d04 --- /dev/null +++ b/auto/module @@ -0,0 +1,178 @@ + +# Copyright (C) Ruslan Ermilov +# Copyright (C) Nginx, Inc. + + +case $ngx_module_type in + HTTP_*) ngx_var=HTTP ;; + *) ngx_var=$ngx_module_type ;; +esac + + +if [ "$ngx_module_link" = DYNAMIC ]; then + + for ngx_module in $ngx_module_name; do + # extract the first name + break + done + + DYNAMIC_MODULES="$DYNAMIC_MODULES $ngx_module" + + eval ${ngx_module}_MODULES=\"$ngx_module_name\" + + if [ -z "$ngx_module_order" -a \ + \( "$ngx_module_type" = "HTTP_FILTER" \ + -o "$ngx_module_type" = "HTTP_AUX_FILTER" \) ] + then + eval ${ngx_module}_ORDER=\"$ngx_module_name \ + ngx_http_copy_filter_module\" + else + eval ${ngx_module}_ORDER=\"$ngx_module_order\" + fi + + srcs= + shrd= + for src in $ngx_module_srcs + do + found=no + for old in $DYNAMIC_MODULES_SRCS + do + if [ $src = $old ]; then + found=yes + break + fi + done + + if [ $found = no ]; then + srcs="$srcs $src" + else + shrd="$shrd $src" + fi + done + eval ${ngx_module}_SRCS=\"$srcs\" + eval ${ngx_module}_SHRD=\"$shrd\" + + DYNAMIC_MODULES_SRCS="$DYNAMIC_MODULES_SRCS $srcs" + + if test -n "$ngx_module_incs"; then + CORE_INCS="$CORE_INCS $ngx_module_incs" + fi + + if test -n "$ngx_module_deps"; then + NGX_ADDON_DEPS="$NGX_ADDON_DEPS $ngx_module_deps" + fi + + libs= + for lib in $ngx_module_libs + do + case $lib in + + LIBXSLT | LIBGD | GEOIP | PERL) + libs="$libs \$NGX_LIB_$lib" + + if eval [ "\$USE_${lib}" = NO ] ; then + eval USE_${lib}=DYNAMIC + fi + ;; + + PCRE | OPENSSL | ZLIB) + eval USE_${lib}=YES + ;; + + MD5 | SHA1) + # obsolete + ;; + + *) + libs="$libs $lib" + ;; + + esac + done + eval ${ngx_module}_LIBS=\'$libs\' + +elif [ "$ngx_module_link" = YES ]; then + + eval ${ngx_module_type}_MODULES=\"\$${ngx_module_type}_MODULES \ + $ngx_module_name\" + + eval ${ngx_var}_SRCS=\"\$${ngx_var}_SRCS $ngx_module_srcs\" + + if test -n "$ngx_module_incs"; then + eval ${ngx_var}_INCS=\"\$${ngx_var}_INCS $ngx_module_incs\" + fi + + if test -n "$ngx_module_deps"; then + eval ${ngx_var}_DEPS=\"\$${ngx_var}_DEPS $ngx_module_deps\" + fi + + for lib in $ngx_module_libs + do + case $lib in + + PCRE | OPENSSL | ZLIB | LIBXSLT | LIBGD | PERL | GEOIP) + eval USE_${lib}=YES + ;; + + MD5 | SHA1) + # obsolete + ;; + + *) + CORE_LIBS="$CORE_LIBS $lib" + ;; + + esac + done + +elif [ "$ngx_module_link" = ADDON ]; then + + eval ${ngx_module_type}_MODULES=\"\$${ngx_module_type}_MODULES \ + $ngx_module_name\" + + srcs= + for src in $ngx_module_srcs + do + found=no + for old in $NGX_ADDON_SRCS + do + if [ $src = $old ]; then + found=yes + break + fi + done + + if [ $found = no ]; then + srcs="$srcs $src" + fi + done + + NGX_ADDON_SRCS="$NGX_ADDON_SRCS $srcs" + + if test -n "$ngx_module_incs"; then + eval ${ngx_var}_INCS=\"\$${ngx_var}_INCS $ngx_module_incs\" + fi + + if test -n "$ngx_module_deps"; then + NGX_ADDON_DEPS="$NGX_ADDON_DEPS $ngx_module_deps" + fi + + for lib in $ngx_module_libs + do + case $lib in + + PCRE | OPENSSL | ZLIB | LIBXSLT | LIBGD | PERL | GEOIP) + eval USE_${lib}=YES + ;; + + MD5 | SHA1) + # obsolete + ;; + + *) + CORE_LIBS="$CORE_LIBS $lib" + ;; + + esac + done +fi diff --git a/auto/modules b/auto/modules index dab660f..1a5e421 100644 --- a/auto/modules +++ b/auto/modules @@ -42,320 +42,1204 @@ fi if [ $NGX_TEST_BUILD_EPOLL = YES ]; then have=NGX_HAVE_EPOLL . auto/have + have=NGX_HAVE_EPOLLRDHUP . auto/have + have=NGX_HAVE_EPOLLEXCLUSIVE . auto/have have=NGX_HAVE_EVENTFD . auto/have have=NGX_TEST_BUILD_EPOLL . auto/have EVENT_MODULES="$EVENT_MODULES $EPOLL_MODULE" CORE_SRCS="$CORE_SRCS $EPOLL_SRCS" fi -if [ $NGX_TEST_BUILD_RTSIG = YES ]; then - have=NGX_HAVE_RTSIG . auto/have - have=NGX_TEST_BUILD_RTSIG . auto/have - EVENT_MODULES="$EVENT_MODULES $RTSIG_MODULE" - CORE_SRCS="$CORE_SRCS $RTSIG_SRCS" -fi - if [ $NGX_TEST_BUILD_SOLARIS_SENDFILEV = YES ]; then have=NGX_TEST_BUILD_SOLARIS_SENDFILEV . auto/have CORE_SRCS="$CORE_SRCS $SOLARIS_SENDFILEV_SRCS" fi -if [ $HTTP != YES ]; then - have=NGX_CRYPT . auto/nohave - CRYPT_LIB= +if [ $HTTP = YES ]; then + HTTP_MODULES= + HTTP_DEPS= + HTTP_INCS= + + ngx_module_type=HTTP + + if :; then + ngx_module_name="ngx_http_module \ + ngx_http_core_module \ + ngx_http_log_module \ + ngx_http_upstream_module" + ngx_module_incs="src/http src/http/modules" + ngx_module_deps="src/http/ngx_http.h \ + src/http/ngx_http_request.h \ + src/http/ngx_http_config.h \ + src/http/ngx_http_core_module.h \ + src/http/ngx_http_cache.h \ + src/http/ngx_http_variables.h \ + src/http/ngx_http_script.h \ + src/http/ngx_http_upstream.h \ + src/http/ngx_http_upstream_round_robin.h" + ngx_module_srcs="src/http/ngx_http.c \ + src/http/ngx_http_core_module.c \ + src/http/ngx_http_special_response.c \ + src/http/ngx_http_request.c \ + src/http/ngx_http_parse.c \ + src/http/modules/ngx_http_log_module.c \ + src/http/ngx_http_request_body.c \ + src/http/ngx_http_variables.c \ + src/http/ngx_http_script.c \ + src/http/ngx_http_upstream.c \ + src/http/ngx_http_upstream_round_robin.c" + ngx_module_libs= + ngx_module_link=YES + + . auto/module + fi + + + if [ $HTTP_CACHE = YES ]; then + have=NGX_HTTP_CACHE . auto/have + HTTP_SRCS="$HTTP_SRCS $HTTP_FILE_CACHE_SRCS" + fi + + + if [ $HTTP_V2 = YES -o $HTTP_V3 = YES ]; then + HTTP_SRCS="$HTTP_SRCS $HTTP_HUFF_SRCS" + fi + + + # the module order is important + # ngx_http_static_module + # ngx_http_gzip_static_module + # ngx_http_dav_module + # ngx_http_autoindex_module + # ngx_http_index_module + # ngx_http_random_index_module + # + # ngx_http_access_module + # ngx_http_realip_module + # + # + # the filter order is important + # ngx_http_write_filter + # 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 + # ngx_http_ssi_filter + # ngx_http_charset_filter + # ngx_http_xslt_filter + # ngx_http_image_filter + # ngx_http_sub_filter + # ngx_http_addition_filter + # ngx_http_gunzip_filter + # ngx_http_userid_filter + # ngx_http_headers_filter + # ngx_http_copy_filter + # ngx_http_range_body_filter + # ngx_http_not_modified_filter + # ngx_http_slice_filter + + ngx_module_type=HTTP_FILTER + HTTP_FILTER_MODULES= + + ngx_module_order="ngx_http_static_module \ + ngx_http_gzip_static_module \ + ngx_http_dav_module \ + ngx_http_autoindex_module \ + ngx_http_index_module \ + ngx_http_random_index_module \ + ngx_http_access_module \ + ngx_http_realip_module \ + ngx_http_write_filter_module \ + 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 \ + ngx_http_ssi_filter_module \ + ngx_http_charset_filter_module \ + ngx_http_xslt_filter_module \ + ngx_http_image_filter_module \ + ngx_http_sub_filter_module \ + ngx_http_addition_filter_module \ + ngx_http_gunzip_filter_module \ + ngx_http_userid_filter_module \ + ngx_http_headers_filter_module \ + ngx_http_copy_filter_module \ + ngx_http_range_body_filter_module \ + ngx_http_not_modified_filter_module \ + ngx_http_slice_filter_module" + + if :; then + ngx_module_name=ngx_http_write_filter_module + ngx_module_incs= + ngx_module_deps= + ngx_module_srcs=src/http/ngx_http_write_filter_module.c + ngx_module_libs= + ngx_module_link=YES + + . auto/module + fi + + if :; then + ngx_module_name=ngx_http_header_filter_module + ngx_module_incs= + ngx_module_deps= + ngx_module_srcs=src/http/ngx_http_header_filter_module.c + ngx_module_libs= + ngx_module_link=YES + + . auto/module + fi + + if :; then + ngx_module_name=ngx_http_chunked_filter_module + ngx_module_incs= + ngx_module_deps= + ngx_module_srcs=src/http/modules/ngx_http_chunked_filter_module.c + ngx_module_libs= + ngx_module_link=YES + + . auto/module + fi + + if [ $HTTP_V2 = YES ]; then + ngx_module_name=ngx_http_v2_filter_module + ngx_module_incs= + ngx_module_deps= + ngx_module_srcs=src/http/v2/ngx_http_v2_filter_module.c + ngx_module_libs= + ngx_module_link=$HTTP_V2 + + . 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= + ngx_module_deps= + ngx_module_srcs=src/http/modules/ngx_http_range_filter_module.c + ngx_module_libs= + ngx_module_link=YES + + . auto/module + fi + + if [ $HTTP_GZIP = YES ]; then + have=NGX_HTTP_GZIP . auto/have + USE_ZLIB=YES + + ngx_module_name=ngx_http_gzip_filter_module + ngx_module_incs= + ngx_module_deps= + ngx_module_srcs=src/http/modules/ngx_http_gzip_filter_module.c + ngx_module_libs= + ngx_module_link=$HTTP_GZIP + + . auto/module + fi + + if :; then + ngx_module_name=ngx_http_postpone_filter_module + ngx_module_incs= + ngx_module_deps= + ngx_module_srcs=src/http/ngx_http_postpone_filter_module.c + ngx_module_libs= + ngx_module_link=YES + + . auto/module + fi + + if [ $HTTP_SSI = YES ]; then + have=NGX_HTTP_SSI . auto/have + + ngx_module_name=ngx_http_ssi_filter_module + ngx_module_incs= + ngx_module_deps=src/http/modules/ngx_http_ssi_filter_module.h + ngx_module_srcs=src/http/modules/ngx_http_ssi_filter_module.c + ngx_module_libs= + ngx_module_link=$HTTP_SSI + + . auto/module + fi + + if [ $HTTP_CHARSET = YES ]; then + ngx_module_name=ngx_http_charset_filter_module + ngx_module_incs= + ngx_module_deps= + ngx_module_srcs=src/http/modules/ngx_http_charset_filter_module.c + ngx_module_libs= + ngx_module_link=$HTTP_CHARSET + + . auto/module + fi + + if [ $HTTP_XSLT != NO ]; then + ngx_module_name=ngx_http_xslt_filter_module + ngx_module_incs= + ngx_module_deps= + ngx_module_srcs=src/http/modules/ngx_http_xslt_filter_module.c + ngx_module_libs=LIBXSLT + ngx_module_link=$HTTP_XSLT + + . auto/module + fi + + if [ $HTTP_IMAGE_FILTER != NO ]; then + ngx_module_name=ngx_http_image_filter_module + ngx_module_incs= + ngx_module_deps= + ngx_module_srcs=src/http/modules/ngx_http_image_filter_module.c + ngx_module_libs=LIBGD + ngx_module_link=$HTTP_IMAGE_FILTER + + . auto/module + fi + + if [ $HTTP_SUB = YES ]; then + ngx_module_name=ngx_http_sub_filter_module + ngx_module_incs= + ngx_module_deps= + ngx_module_srcs=src/http/modules/ngx_http_sub_filter_module.c + ngx_module_libs= + ngx_module_link=$HTTP_SUB + + . auto/module + fi + + if [ $HTTP_ADDITION = YES ]; then + ngx_module_name=ngx_http_addition_filter_module + ngx_module_incs= + ngx_module_deps= + ngx_module_srcs=src/http/modules/ngx_http_addition_filter_module.c + ngx_module_libs= + ngx_module_link=$HTTP_ADDITION + + . auto/module + fi + + if [ $HTTP_GUNZIP = YES ]; then + have=NGX_HTTP_GZIP . auto/have + USE_ZLIB=YES + + ngx_module_name=ngx_http_gunzip_filter_module + ngx_module_incs= + ngx_module_deps= + ngx_module_srcs=src/http/modules/ngx_http_gunzip_filter_module.c + ngx_module_libs= + ngx_module_link=$HTTP_GUNZIP + + . auto/module + fi + + if [ $HTTP_USERID = YES ]; then + ngx_module_name=ngx_http_userid_filter_module + ngx_module_incs= + ngx_module_deps= + ngx_module_srcs=src/http/modules/ngx_http_userid_filter_module.c + ngx_module_libs= + ngx_module_link=$HTTP_USERID + + . auto/module + fi + + if :; then + ngx_module_name=ngx_http_headers_filter_module + ngx_module_incs= + ngx_module_deps= + ngx_module_srcs=src/http/modules/ngx_http_headers_filter_module.c + ngx_module_libs= + ngx_module_link=YES + + . auto/module + fi + + + ngx_module_type=HTTP_INIT_FILTER + HTTP_INIT_FILTER_MODULES= + + if :; then + ngx_module_name=ngx_http_copy_filter_module + ngx_module_incs= + ngx_module_deps= + ngx_module_srcs=src/http/ngx_http_copy_filter_module.c + ngx_module_libs= + ngx_module_link=YES + + . auto/module + fi + + if :; then + ngx_module_name=ngx_http_range_body_filter_module + ngx_module_incs= + ngx_module_deps= + ngx_module_srcs= + ngx_module_libs= + ngx_module_link=YES + + . auto/module + fi + + if :; then + ngx_module_name=ngx_http_not_modified_filter_module + ngx_module_incs= + ngx_module_deps= + ngx_module_srcs=src/http/modules/ngx_http_not_modified_filter_module.c + ngx_module_libs= + ngx_module_link=YES + + . auto/module + fi + + if [ $HTTP_SLICE = YES ]; then + ngx_module_name=ngx_http_slice_filter_module + ngx_module_incs= + ngx_module_deps= + ngx_module_srcs=src/http/modules/ngx_http_slice_filter_module.c + ngx_module_libs= + ngx_module_link=$HTTP_SLICE + + . auto/module + fi + + + ngx_module_type=HTTP + + if [ $HTTP_V2 = YES ]; then + have=NGX_HTTP_V2 . auto/have + + ngx_module_name=ngx_http_v2_module + ngx_module_incs=src/http/v2 + ngx_module_deps="src/http/v2/ngx_http_v2.h \ + src/http/v2/ngx_http_v2_module.h" + ngx_module_srcs="src/http/v2/ngx_http_v2.c \ + src/http/v2/ngx_http_v2_table.c \ + src/http/v2/ngx_http_v2_encode.c \ + src/http/v2/ngx_http_v2_module.c" + ngx_module_libs= + ngx_module_link=$HTTP_V2 + + . 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= + ngx_module_deps= + ngx_module_srcs=src/http/modules/ngx_http_static_module.c + ngx_module_libs= + ngx_module_link=YES + + . auto/module + fi + + if [ $HTTP_GZIP_STATIC = YES ]; then + have=NGX_HTTP_GZIP . auto/have + + ngx_module_name=ngx_http_gzip_static_module + ngx_module_incs= + ngx_module_deps= + ngx_module_srcs=src/http/modules/ngx_http_gzip_static_module.c + ngx_module_libs= + ngx_module_link=$HTTP_GZIP_STATIC + + . auto/module + fi + + if [ $HTTP_DAV = YES ]; then + have=NGX_HTTP_DAV . auto/have + + ngx_module_name=ngx_http_dav_module + ngx_module_incs= + ngx_module_deps= + ngx_module_srcs=src/http/modules/ngx_http_dav_module.c + ngx_module_libs= + ngx_module_link=$HTTP_DAV + + . auto/module + fi + + if [ $HTTP_AUTOINDEX = YES ]; then + ngx_module_name=ngx_http_autoindex_module + ngx_module_incs= + ngx_module_deps= + ngx_module_srcs=src/http/modules/ngx_http_autoindex_module.c + ngx_module_libs= + ngx_module_link=$HTTP_AUTOINDEX + + . auto/module + fi + + if :; then + ngx_module_name=ngx_http_index_module + ngx_module_incs= + ngx_module_deps= + ngx_module_srcs=src/http/modules/ngx_http_index_module.c + ngx_module_libs= + ngx_module_link=YES + + . auto/module + fi + + if [ $HTTP_RANDOM_INDEX = YES ]; then + ngx_module_name=ngx_http_random_index_module + ngx_module_incs= + ngx_module_deps= + ngx_module_srcs=src/http/modules/ngx_http_random_index_module.c + ngx_module_libs= + ngx_module_link=$HTTP_RANDOM_INDEX + + . auto/module + fi + + if [ $HTTP_MIRROR = YES ]; then + ngx_module_name=ngx_http_mirror_module + ngx_module_incs= + ngx_module_deps= + ngx_module_srcs=src/http/modules/ngx_http_mirror_module.c + ngx_module_libs= + ngx_module_link=$HTTP_MIRROR + + . auto/module + fi + + if :; then + ngx_module_name=ngx_http_try_files_module + ngx_module_incs= + ngx_module_deps= + ngx_module_srcs=src/http/modules/ngx_http_try_files_module.c + ngx_module_libs= + ngx_module_link=YES + + . auto/module + fi + + if [ $HTTP_AUTH_REQUEST = YES ]; then + ngx_module_name=ngx_http_auth_request_module + ngx_module_incs= + ngx_module_deps= + ngx_module_srcs=src/http/modules/ngx_http_auth_request_module.c + ngx_module_libs= + ngx_module_link=$HTTP_AUTH_REQUEST + + . auto/module + fi + + if [ $HTTP_AUTH_BASIC = YES ]; then + have=NGX_CRYPT . auto/have + + ngx_module_name=ngx_http_auth_basic_module + ngx_module_incs= + ngx_module_deps= + ngx_module_srcs=src/http/modules/ngx_http_auth_basic_module.c + ngx_module_libs=$CRYPT_LIB + ngx_module_link=$HTTP_AUTH_BASIC + + . auto/module + fi + + if [ $HTTP_ACCESS = YES ]; then + ngx_module_name=ngx_http_access_module + ngx_module_incs= + ngx_module_deps= + ngx_module_srcs=src/http/modules/ngx_http_access_module.c + ngx_module_libs= + ngx_module_link=$HTTP_ACCESS + + . auto/module + fi + + if [ $HTTP_LIMIT_CONN = YES ]; then + ngx_module_name=ngx_http_limit_conn_module + ngx_module_incs= + ngx_module_deps= + ngx_module_srcs=src/http/modules/ngx_http_limit_conn_module.c + ngx_module_libs= + ngx_module_link=$HTTP_LIMIT_CONN + + . auto/module + fi + + if [ $HTTP_LIMIT_REQ = YES ]; then + ngx_module_name=ngx_http_limit_req_module + ngx_module_incs= + ngx_module_deps= + ngx_module_srcs=src/http/modules/ngx_http_limit_req_module.c + ngx_module_libs= + ngx_module_link=$HTTP_LIMIT_REQ + + . auto/module + fi + + if [ $HTTP_REALIP = YES ]; then + have=NGX_HTTP_REALIP . auto/have + have=NGX_HTTP_X_FORWARDED_FOR . auto/have + + ngx_module_name=ngx_http_realip_module + ngx_module_incs= + ngx_module_deps= + ngx_module_srcs=src/http/modules/ngx_http_realip_module.c + ngx_module_libs= + ngx_module_link=$HTTP_REALIP + + . auto/module + fi + + if [ $HTTP_STATUS = YES ]; then + ngx_module_name=ngx_http_status_module + ngx_module_incs= + ngx_module_deps= + ngx_module_srcs=src/http/modules/ngx_http_status_module.c + ngx_module_libs= + ngx_module_link=$HTTP_STATUS + + . auto/module + fi + + if [ $HTTP_GEO = YES ]; then + have=NGX_HTTP_X_FORWARDED_FOR . auto/have + + ngx_module_name=ngx_http_geo_module + ngx_module_incs= + ngx_module_deps= + ngx_module_srcs=src/http/modules/ngx_http_geo_module.c + ngx_module_libs= + ngx_module_link=$HTTP_GEO + + . auto/module + fi + + if [ $HTTP_GEOIP != NO ]; then + have=NGX_HTTP_X_FORWARDED_FOR . auto/have + + ngx_module_name=ngx_http_geoip_module + ngx_module_incs= + ngx_module_deps= + ngx_module_srcs=src/http/modules/ngx_http_geoip_module.c + ngx_module_libs=GEOIP + ngx_module_link=$HTTP_GEOIP + + . auto/module + fi + + if [ $HTTP_MAP = YES ]; then + ngx_module_name=ngx_http_map_module + ngx_module_incs= + ngx_module_deps= + ngx_module_srcs=src/http/modules/ngx_http_map_module.c + ngx_module_libs= + ngx_module_link=$HTTP_MAP + + . auto/module + fi + + if [ $HTTP_SPLIT_CLIENTS = YES ]; then + ngx_module_name=ngx_http_split_clients_module + ngx_module_incs= + ngx_module_deps= + ngx_module_srcs=src/http/modules/ngx_http_split_clients_module.c + ngx_module_libs= + ngx_module_link=$HTTP_SPLIT_CLIENTS + + . auto/module + fi + + if [ $HTTP_REFERER = YES ]; then + ngx_module_name=ngx_http_referer_module + ngx_module_incs= + ngx_module_deps= + ngx_module_srcs=src/http/modules/ngx_http_referer_module.c + ngx_module_libs= + ngx_module_link=$HTTP_REFERER + + . auto/module + fi + + if [ $HTTP_REWRITE = YES -a $USE_PCRE != DISABLED ]; then + USE_PCRE=YES + + ngx_module_name=ngx_http_rewrite_module + ngx_module_incs= + ngx_module_deps= + ngx_module_srcs=src/http/modules/ngx_http_rewrite_module.c + ngx_module_libs= + ngx_module_link=$HTTP_REWRITE + + . auto/module + fi + + if [ $HTTP_SSL = YES ]; then + USE_OPENSSL=YES + have=NGX_HTTP_SSL . auto/have + + ngx_module_name=ngx_http_ssl_module + ngx_module_incs= + ngx_module_deps=src/http/modules/ngx_http_ssl_module.h + ngx_module_srcs=src/http/modules/ngx_http_ssl_module.c + ngx_module_libs= + ngx_module_link=$HTTP_SSL + + . auto/module + fi + + if [ $HTTP_PROXY = YES ]; then + have=NGX_HTTP_X_FORWARDED_FOR . auto/have + + ngx_module_name=ngx_http_proxy_module + ngx_module_incs= + ngx_module_deps= + ngx_module_srcs=src/http/modules/ngx_http_proxy_module.c + ngx_module_libs= + ngx_module_link=$HTTP_PROXY + + . auto/module + fi + + if [ $HTTP_FASTCGI = YES ]; then + ngx_module_name=ngx_http_fastcgi_module + ngx_module_incs= + ngx_module_deps= + ngx_module_srcs=src/http/modules/ngx_http_fastcgi_module.c + ngx_module_libs= + ngx_module_link=$HTTP_FASTCGI + + . auto/module + fi + + if [ $HTTP_UWSGI = YES ]; then + ngx_module_name=ngx_http_uwsgi_module + ngx_module_incs= + ngx_module_deps= + ngx_module_srcs=src/http/modules/ngx_http_uwsgi_module.c + ngx_module_libs= + ngx_module_link=$HTTP_UWSGI + + . auto/module + fi + + if [ $HTTP_SCGI = YES ]; then + ngx_module_name=ngx_http_scgi_module + ngx_module_incs= + ngx_module_deps= + ngx_module_srcs=src/http/modules/ngx_http_scgi_module.c + ngx_module_libs= + ngx_module_link=$HTTP_SCGI + + . auto/module + fi + + if [ $HTTP_GRPC = YES -a $HTTP_V2 = YES ]; then + ngx_module_name=ngx_http_grpc_module + ngx_module_incs= + ngx_module_deps= + ngx_module_srcs=src/http/modules/ngx_http_grpc_module.c + ngx_module_libs= + ngx_module_link=$HTTP_GRPC + + . auto/module + fi + + if [ $HTTP_PERL != NO ]; then + ngx_module_name=ngx_http_perl_module + ngx_module_incs=src/http/modules/perl + ngx_module_deps=src/http/modules/perl/ngx_http_perl_module.h + ngx_module_srcs=src/http/modules/perl/ngx_http_perl_module.c + ngx_module_libs=PERL + ngx_module_link=$HTTP_PERL + + . auto/module + fi + + if [ $HTTP_MEMCACHED = YES ]; then + ngx_module_name=ngx_http_memcached_module + ngx_module_incs= + ngx_module_deps= + ngx_module_srcs=src/http/modules/ngx_http_memcached_module.c + ngx_module_libs= + ngx_module_link=$HTTP_MEMCACHED + + . auto/module + fi + + if [ $HTTP_EMPTY_GIF = YES ]; then + ngx_module_name=ngx_http_empty_gif_module + ngx_module_incs= + ngx_module_deps= + ngx_module_srcs=src/http/modules/ngx_http_empty_gif_module.c + ngx_module_libs= + ngx_module_link=$HTTP_EMPTY_GIF + + . auto/module + fi + + if [ $HTTP_BROWSER = YES ]; then + ngx_module_name=ngx_http_browser_module + ngx_module_incs= + ngx_module_deps= + ngx_module_srcs=src/http/modules/ngx_http_browser_module.c + ngx_module_libs= + ngx_module_link=$HTTP_BROWSER + + . auto/module + fi + + if [ $HTTP_SECURE_LINK = YES ]; then + ngx_module_name=ngx_http_secure_link_module + ngx_module_incs= + ngx_module_deps= + ngx_module_srcs=src/http/modules/ngx_http_secure_link_module.c + ngx_module_libs= + ngx_module_link=$HTTP_SECURE_LINK + + . auto/module + fi + + if [ $HTTP_DEGRADATION = YES ]; then + have=NGX_HTTP_DEGRADATION . auto/have + + ngx_module_name=ngx_http_degradation_module + ngx_module_incs= + ngx_module_deps= + ngx_module_srcs=src/http/modules/ngx_http_degradation_module.c + ngx_module_libs= + ngx_module_link=$HTTP_DEGRADATION + + . auto/module + fi + + if [ $HTTP_FLV = YES ]; then + ngx_module_name=ngx_http_flv_module + ngx_module_incs= + ngx_module_deps= + ngx_module_srcs=src/http/modules/ngx_http_flv_module.c + ngx_module_libs= + ngx_module_link=$HTTP_FLV + + . auto/module + fi + + if [ $HTTP_MP4 = YES ]; then + ngx_module_name=ngx_http_mp4_module + ngx_module_incs= + ngx_module_deps= + ngx_module_srcs=src/http/modules/ngx_http_mp4_module.c + ngx_module_libs= + ngx_module_link=$HTTP_MP4 + + . auto/module + fi + + if [ $HTTP_UPSTREAM_HASH = YES ]; then + ngx_module_name=ngx_http_upstream_hash_module + ngx_module_incs= + ngx_module_deps= + ngx_module_srcs=src/http/modules/ngx_http_upstream_hash_module.c + ngx_module_libs= + ngx_module_link=$HTTP_UPSTREAM_HASH + + . auto/module + fi + + if [ $HTTP_UPSTREAM_IP_HASH = YES ]; then + ngx_module_name=ngx_http_upstream_ip_hash_module + ngx_module_incs= + ngx_module_deps= + ngx_module_srcs=src/http/modules/ngx_http_upstream_ip_hash_module.c + ngx_module_libs= + ngx_module_link=$HTTP_UPSTREAM_IP_HASH + + . auto/module + fi + + if [ $HTTP_UPSTREAM_LEAST_CONN = YES ]; then + ngx_module_name=ngx_http_upstream_least_conn_module + ngx_module_incs= + ngx_module_deps= + ngx_module_srcs=src/http/modules/ngx_http_upstream_least_conn_module.c + ngx_module_libs= + ngx_module_link=$HTTP_UPSTREAM_LEAST_CONN + + . auto/module + fi + + if [ $HTTP_UPSTREAM_RANDOM = YES ]; then + ngx_module_name=ngx_http_upstream_random_module + ngx_module_incs= + ngx_module_deps= + ngx_module_srcs=src/http/modules/ngx_http_upstream_random_module.c + ngx_module_libs= + ngx_module_link=$HTTP_UPSTREAM_RANDOM + + . auto/module + fi + + if [ $HTTP_UPSTREAM_KEEPALIVE = YES ]; then + ngx_module_name=ngx_http_upstream_keepalive_module + ngx_module_incs= + ngx_module_deps= + ngx_module_srcs=src/http/modules/ngx_http_upstream_keepalive_module.c + ngx_module_libs= + ngx_module_link=$HTTP_UPSTREAM_KEEPALIVE + + . auto/module + fi + + if [ $HTTP_UPSTREAM_ZONE = YES ]; then + have=NGX_HTTP_UPSTREAM_ZONE . auto/have + + ngx_module_name=ngx_http_upstream_zone_module + ngx_module_incs= + ngx_module_deps= + ngx_module_srcs=src/http/modules/ngx_http_upstream_zone_module.c + ngx_module_libs= + ngx_module_link=$HTTP_UPSTREAM_ZONE + + . auto/module + fi + + if [ $HTTP_STUB_STATUS = YES ]; then + have=NGX_STAT_STUB . auto/have + + ngx_module_name=ngx_http_stub_status_module + ngx_module_incs= + ngx_module_deps= + ngx_module_srcs=src/http/modules/ngx_http_stub_status_module.c + ngx_module_libs= + ngx_module_link=$HTTP_STUB_STATUS + + . auto/module + fi fi -if [ $HTTP_CACHE = YES ]; then - USE_MD5=YES - have=NGX_HTTP_CACHE . auto/have - HTTP_SRCS="$HTTP_SRCS $HTTP_FILE_CACHE_SRCS" +if [ $MAIL != NO ]; then + MAIL_MODULES= + MAIL_DEPS= + MAIL_INCS= + + ngx_module_type=MAIL + ngx_module_libs= + ngx_module_link=YES + + ngx_module_order= + + ngx_module_name="ngx_mail_module ngx_mail_core_module" + ngx_module_incs="src/mail" + ngx_module_deps="src/mail/ngx_mail.h" + ngx_module_srcs="src/mail/ngx_mail.c \ + src/mail/ngx_mail_core_module.c \ + src/mail/ngx_mail_handler.c \ + src/mail/ngx_mail_parse.c" + + . auto/module + + ngx_module_incs= + + if [ $MAIL_SSL = YES ]; then + USE_OPENSSL=YES + have=NGX_MAIL_SSL . auto/have + + ngx_module_name=ngx_mail_ssl_module + ngx_module_deps=src/mail/ngx_mail_ssl_module.h + ngx_module_srcs=src/mail/ngx_mail_ssl_module.c + + . auto/module + fi + + if [ $MAIL_POP3 = YES ]; then + ngx_module_name=ngx_mail_pop3_module + ngx_module_deps=src/mail/ngx_mail_pop3_module.h + ngx_module_srcs="src/mail/ngx_mail_pop3_module.c \ + src/mail/ngx_mail_pop3_handler.c" + + . auto/module + fi + + if [ $MAIL_IMAP = YES ]; then + ngx_module_name=ngx_mail_imap_module + ngx_module_deps=src/mail/ngx_mail_imap_module.h + ngx_module_srcs="src/mail/ngx_mail_imap_module.c \ + src/mail/ngx_mail_imap_handler.c" + + . auto/module + fi + + if [ $MAIL_SMTP = YES ]; then + ngx_module_name=ngx_mail_smtp_module + ngx_module_deps=src/mail/ngx_mail_smtp_module.h + ngx_module_srcs="src/mail/ngx_mail_smtp_module.c \ + src/mail/ngx_mail_smtp_handler.c" + + . auto/module + fi + + ngx_module_name=ngx_mail_auth_http_module + ngx_module_deps= + ngx_module_srcs=src/mail/ngx_mail_auth_http_module.c + + . auto/module + + ngx_module_name=ngx_mail_proxy_module + ngx_module_deps= + ngx_module_srcs=src/mail/ngx_mail_proxy_module.c + + . auto/module + + ngx_module_name=ngx_mail_realip_module + ngx_module_deps= + ngx_module_srcs=src/mail/ngx_mail_realip_module.c + + . auto/module fi -if [ $HTTP_SSI = YES ]; then - HTTP_POSTPONE=YES +if [ $STREAM != NO ]; then + STREAM_MODULES= + STREAM_DEPS= + STREAM_INCS= + + ngx_module_type=STREAM + ngx_module_libs= + ngx_module_link=YES + + ngx_module_order= + + ngx_module_name="ngx_stream_module \ + ngx_stream_core_module \ + ngx_stream_log_module \ + ngx_stream_proxy_module \ + ngx_stream_upstream_module \ + ngx_stream_write_filter_module" + ngx_module_incs="src/stream" + ngx_module_deps="src/stream/ngx_stream.h \ + src/stream/ngx_stream_variables.h \ + src/stream/ngx_stream_script.h \ + src/stream/ngx_stream_upstream.h \ + src/stream/ngx_stream_upstream_round_robin.h" + ngx_module_srcs="src/stream/ngx_stream.c \ + src/stream/ngx_stream_variables.c \ + src/stream/ngx_stream_script.c \ + src/stream/ngx_stream_handler.c \ + src/stream/ngx_stream_core_module.c \ + src/stream/ngx_stream_log_module.c \ + src/stream/ngx_stream_proxy_module.c \ + src/stream/ngx_stream_upstream.c \ + src/stream/ngx_stream_upstream_round_robin.c \ + src/stream/ngx_stream_write_filter_module.c" + + . auto/module + + ngx_module_incs= + + if [ $STREAM_SSL = YES ]; then + USE_OPENSSL=YES + have=NGX_STREAM_SSL . auto/have + + ngx_module_name=ngx_stream_ssl_module + ngx_module_deps=src/stream/ngx_stream_ssl_module.h + ngx_module_srcs=src/stream/ngx_stream_ssl_module.c + ngx_module_libs= + ngx_module_link=$STREAM_SSL + + . auto/module + fi + + if [ $STREAM_REALIP = YES ]; then + ngx_module_name=ngx_stream_realip_module + ngx_module_deps= + ngx_module_srcs=src/stream/ngx_stream_realip_module.c + ngx_module_libs= + ngx_module_link=$STREAM_REALIP + + . auto/module + fi + + if [ $STREAM_LIMIT_CONN = YES ]; then + ngx_module_name=ngx_stream_limit_conn_module + ngx_module_deps= + ngx_module_srcs=src/stream/ngx_stream_limit_conn_module.c + ngx_module_libs= + ngx_module_link=$STREAM_LIMIT_CONN + + . auto/module + fi + + if [ $STREAM_ACCESS = YES ]; then + ngx_module_name=ngx_stream_access_module + ngx_module_deps= + ngx_module_srcs=src/stream/ngx_stream_access_module.c + ngx_module_libs= + ngx_module_link=$STREAM_ACCESS + + . auto/module + fi + + if [ $STREAM_GEO = YES ]; then + ngx_module_name=ngx_stream_geo_module + ngx_module_deps= + ngx_module_srcs=src/stream/ngx_stream_geo_module.c + ngx_module_libs= + ngx_module_link=$STREAM_GEO + + . auto/module + fi + + if [ $STREAM_GEOIP != NO ]; then + ngx_module_name=ngx_stream_geoip_module + ngx_module_deps= + ngx_module_srcs=src/stream/ngx_stream_geoip_module.c + ngx_module_libs=GEOIP + ngx_module_link=$STREAM_GEOIP + + . auto/module + fi + + if [ $STREAM_MAP = YES ]; then + ngx_module_name=ngx_stream_map_module + ngx_module_deps= + ngx_module_srcs=src/stream/ngx_stream_map_module.c + ngx_module_libs= + ngx_module_link=$STREAM_MAP + + . auto/module + fi + + if [ $STREAM_SPLIT_CLIENTS = YES ]; then + ngx_module_name=ngx_stream_split_clients_module + ngx_module_deps= + ngx_module_srcs=src/stream/ngx_stream_split_clients_module.c + ngx_module_libs= + ngx_module_link=$STREAM_SPLIT_CLIENTS + + . auto/module + fi + + if [ $STREAM_RETURN = YES ]; then + ngx_module_name=ngx_stream_return_module + ngx_module_deps= + ngx_module_srcs=src/stream/ngx_stream_return_module.c + ngx_module_libs= + ngx_module_link=$STREAM_RETURN + + . 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= + ngx_module_srcs=src/stream/ngx_stream_set_module.c + ngx_module_libs= + ngx_module_link=$STREAM_SET + + . auto/module + fi + + if [ $STREAM_UPSTREAM_HASH = YES ]; then + ngx_module_name=ngx_stream_upstream_hash_module + ngx_module_deps= + ngx_module_srcs=src/stream/ngx_stream_upstream_hash_module.c + ngx_module_libs= + ngx_module_link=$STREAM_UPSTREAM_HASH + + . auto/module + fi + + if [ $STREAM_UPSTREAM_LEAST_CONN = YES ]; then + ngx_module_name=ngx_stream_upstream_least_conn_module + ngx_module_deps= + ngx_module_srcs=src/stream/ngx_stream_upstream_least_conn_module.c + ngx_module_libs= + ngx_module_link=$STREAM_UPSTREAM_LEAST_CONN + + . auto/module + fi + + if [ $STREAM_UPSTREAM_RANDOM = YES ]; then + ngx_module_name=ngx_stream_upstream_random_module + ngx_module_deps= + ngx_module_srcs=src/stream/ngx_stream_upstream_random_module.c + ngx_module_libs= + ngx_module_link=$STREAM_UPSTREAM_RANDOM + + . auto/module + fi + + if [ $STREAM_UPSTREAM_ZONE = YES ]; then + have=NGX_STREAM_UPSTREAM_ZONE . auto/have + + ngx_module_name=ngx_stream_upstream_zone_module + ngx_module_deps= + ngx_module_srcs=src/stream/ngx_stream_upstream_zone_module.c + ngx_module_libs= + ngx_module_link=$STREAM_UPSTREAM_ZONE + + . auto/module + fi + + if [ $STREAM_SSL_PREREAD = YES ]; then + ngx_module_name=ngx_stream_ssl_preread_module + ngx_module_deps= + ngx_module_srcs=src/stream/ngx_stream_ssl_preread_module.c + ngx_module_libs= + ngx_module_link=$STREAM_SSL_PREREAD + + . auto/module + fi fi -if [ $HTTP_ADDITION = YES ]; then - HTTP_POSTPONE=YES -fi - - -# the module order is important -# ngx_http_static_module -# ngx_http_gzip_static_module -# ngx_http_dav_module -# ngx_http_autoindex_module -# ngx_http_index_module -# ngx_http_random_index_module -# -# ngx_http_access_module -# ngx_http_realip_module -# -# -# the filter order is important -# ngx_http_write_filter -# ngx_http_header_filter -# ngx_http_chunked_filter -# ngx_http_range_header_filter -# ngx_http_gzip_filter -# ngx_http_postpone_filter -# ngx_http_ssi_filter -# ngx_http_charset_filter -# ngx_http_xslt_filter -# ngx_http_image_filter -# ngx_http_sub_filter -# ngx_http_addition_filter -# ngx_http_userid_filter -# ngx_http_headers_filter -# ngx_http_copy_filter -# ngx_http_range_body_filter -# ngx_http_not_modified_filter - -HTTP_FILTER_MODULES="$HTTP_WRITE_FILTER_MODULE \ - $HTTP_HEADER_FILTER_MODULE \ - $HTTP_CHUNKED_FILTER_MODULE \ - $HTTP_RANGE_HEADER_FILTER_MODULE" - -if [ $HTTP_GZIP = YES ]; then - have=NGX_HTTP_GZIP . auto/have - USE_ZLIB=YES - HTTP_FILTER_MODULES="$HTTP_FILTER_MODULES $HTTP_GZIP_FILTER_MODULE" - HTTP_SRCS="$HTTP_SRCS $HTTP_GZIP_SRCS" -fi - -if [ $HTTP_POSTPONE = YES ]; then - HTTP_FILTER_MODULES="$HTTP_FILTER_MODULES $HTTP_POSTPONE_FILTER_MODULE" - HTTP_SRCS="$HTTP_SRCS $HTTP_POSTPONE_FILTER_SRCS" -fi - -if [ $HTTP_SSI = YES ]; then - have=NGX_HTTP_SSI . auto/have - HTTP_FILTER_MODULES="$HTTP_FILTER_MODULES $HTTP_SSI_FILTER_MODULE" - HTTP_DEPS="$HTTP_DEPS $HTTP_SSI_DEPS" - HTTP_SRCS="$HTTP_SRCS $HTTP_SSI_SRCS" -fi - -if [ $HTTP_CHARSET = YES ]; then - HTTP_FILTER_MODULES="$HTTP_FILTER_MODULES $HTTP_CHARSET_FILTER_MODULE" - HTTP_SRCS="$HTTP_SRCS $HTTP_CHARSET_SRCS" -fi - -if [ $HTTP_XSLT = YES ]; then - USE_LIBXSLT=YES - HTTP_FILTER_MODULES="$HTTP_FILTER_MODULES $HTTP_XSLT_FILTER_MODULE" - HTTP_SRCS="$HTTP_SRCS $HTTP_XSLT_SRCS" -fi - -if [ $HTTP_IMAGE_FILTER = YES ]; then - USE_LIBGD=YES - HTTP_FILTER_MODULES="$HTTP_FILTER_MODULES $HTTP_IMAGE_FILTER_MODULE" - HTTP_SRCS="$HTTP_SRCS $HTTP_IMAGE_SRCS" -fi - -if [ $HTTP_SUB = YES ]; then - HTTP_FILTER_MODULES="$HTTP_FILTER_MODULES $HTTP_SUB_FILTER_MODULE" - HTTP_SRCS="$HTTP_SRCS $HTTP_SUB_SRCS" -fi - -if [ $HTTP_ADDITION = YES ]; then - HTTP_FILTER_MODULES="$HTTP_FILTER_MODULES $HTTP_ADDITION_FILTER_MODULE" - HTTP_SRCS="$HTTP_SRCS $HTTP_ADDITION_SRCS" -fi - -if [ $HTTP_USERID = YES ]; then - HTTP_FILTER_MODULES="$HTTP_FILTER_MODULES $HTTP_USERID_FILTER_MODULE" - HTTP_SRCS="$HTTP_SRCS $HTTP_USERID_SRCS" -fi - -HTTP_MODULES="$HTTP_MODULES $HTTP_STATIC_MODULE" - -if [ $HTTP_GZIP_STATIC = YES ]; then - have=NGX_HTTP_GZIP . auto/have - HTTP_MODULES="$HTTP_MODULES $HTTP_GZIP_STATIC_MODULE" - HTTP_SRCS="$HTTP_SRCS $HTTP_GZIP_STATIC_SRCS" -fi - -if [ $HTTP_DAV = YES ]; then - have=NGX_HTTP_DAV . auto/have - HTTP_MODULES="$HTTP_MODULES $HTTP_DAV_MODULE" - HTTP_SRCS="$HTTP_SRCS $HTTP_DAV_SRCS" -fi - -if [ $HTTP_AUTOINDEX = YES ]; then - HTTP_MODULES="$HTTP_MODULES $HTTP_AUTOINDEX_MODULE" - HTTP_SRCS="$HTTP_SRCS $HTTP_AUTOINDEX_SRCS" -fi - -HTTP_MODULES="$HTTP_MODULES $HTTP_INDEX_MODULE" - -if [ $HTTP_RANDOM_INDEX = YES ]; then - HTTP_MODULES="$HTTP_MODULES $HTTP_RANDOM_INDEX_MODULE" - HTTP_SRCS="$HTTP_SRCS $HTTP_RANDOM_INDEX_SRCS" -fi - -if [ $HTTP_AUTH_BASIC = YES ]; then - USE_MD5=YES - USE_SHA1=YES - have=NGX_CRYPT . auto/have - HTTP_MODULES="$HTTP_MODULES $HTTP_AUTH_BASIC_MODULE" - HTTP_SRCS="$HTTP_SRCS $HTTP_AUTH_BASIC_SRCS" - CORE_LIBS="$CORE_LIBS $CRYPT_LIB" -fi - -if [ $HTTP_ACCESS = YES ]; then - HTTP_MODULES="$HTTP_MODULES $HTTP_ACCESS_MODULE" - HTTP_SRCS="$HTTP_SRCS $HTTP_ACCESS_SRCS" -fi - -if [ $HTTP_LIMIT_CONN = YES ]; then - HTTP_MODULES="$HTTP_MODULES $HTTP_LIMIT_CONN_MODULE" - HTTP_SRCS="$HTTP_SRCS $HTTP_LIMIT_CONN_SRCS" -fi - -if [ $HTTP_LIMIT_REQ = YES ]; then - HTTP_MODULES="$HTTP_MODULES $HTTP_LIMIT_REQ_MODULE" - HTTP_SRCS="$HTTP_SRCS $HTTP_LIMIT_REQ_SRCS" -fi - -if [ $HTTP_REALIP = YES ]; then - have=NGX_HTTP_REALIP . auto/have - HTTP_MODULES="$HTTP_MODULES $HTTP_REALIP_MODULE" - HTTP_SRCS="$HTTP_SRCS $HTTP_REALIP_SRCS" -fi - -if [ $HTTP_STATUS = YES ]; then - HTTP_MODULES="$HTTP_MODULES $HTTP_STATUS_MODULE" - HTTP_SRCS="$HTTP_SRCS $HTTP_STATUS_SRCS" -fi - -if [ $HTTP_GEO = YES ]; then - have=NGX_HTTP_GEO . auto/have - HTTP_MODULES="$HTTP_MODULES $HTTP_GEO_MODULE" - HTTP_SRCS="$HTTP_SRCS $HTTP_GEO_SRCS" -fi - -if [ $HTTP_GEOIP = YES ]; then - HTTP_MODULES="$HTTP_MODULES $HTTP_GEOIP_MODULE" - HTTP_SRCS="$HTTP_SRCS $HTTP_GEOIP_SRCS" -fi - -if [ $HTTP_MAP = YES ]; then - HTTP_MODULES="$HTTP_MODULES $HTTP_MAP_MODULE" - HTTP_SRCS="$HTTP_SRCS $HTTP_MAP_SRCS" -fi - -if [ $HTTP_SPLIT_CLIENTS = YES ]; then - HTTP_MODULES="$HTTP_MODULES $HTTP_SPLIT_CLIENTS_MODULE" - HTTP_SRCS="$HTTP_SRCS $HTTP_SPLIT_CLIENTS_SRCS" -fi - -if [ $HTTP_REFERER = YES ]; then - HTTP_MODULES="$HTTP_MODULES $HTTP_REFERER_MODULE" - HTTP_SRCS="$HTTP_SRCS $HTTP_REFERER_SRCS" -fi - -if [ $HTTP_REWRITE = YES -a $USE_PCRE != DISABLED ]; then - USE_PCRE=YES - HTTP_MODULES="$HTTP_MODULES $HTTP_REWRITE_MODULE" - HTTP_SRCS="$HTTP_SRCS $HTTP_REWRITE_SRCS" -fi - -if [ $HTTP_SSL = YES ]; then - USE_OPENSSL=YES - have=NGX_HTTP_SSL . auto/have - HTTP_MODULES="$HTTP_MODULES $HTTP_SSL_MODULE" - HTTP_DEPS="$HTTP_DEPS $HTTP_SSL_DEPS" - HTTP_SRCS="$HTTP_SRCS $HTTP_SSL_SRCS" -fi - -if [ $HTTP_PROXY = YES ]; then - have=NGX_HTTP_PROXY . auto/have - #USE_MD5=YES - HTTP_MODULES="$HTTP_MODULES $HTTP_PROXY_MODULE" - HTTP_DEPS="$HTTP_DEPS $HTTP_PROXY_DEPS" - HTTP_SRCS="$HTTP_SRCS $HTTP_PROXY_SRCS" -fi - -if [ $HTTP_FASTCGI = YES ]; then - HTTP_MODULES="$HTTP_MODULES $HTTP_FASTCGI_MODULE" - HTTP_SRCS="$HTTP_SRCS $HTTP_FASTCGI_SRCS" -fi - -if [ $HTTP_UWSGI = YES ]; then - HTTP_MODULES="$HTTP_MODULES $HTTP_UWSGI_MODULE" - HTTP_SRCS="$HTTP_SRCS $HTTP_UWSGI_SRCS" -fi - -if [ $HTTP_SCGI = YES ]; then - HTTP_MODULES="$HTTP_MODULES $HTTP_SCGI_MODULE" - HTTP_SRCS="$HTTP_SRCS $HTTP_SCGI_SRCS" -fi - -if [ $HTTP_PERL = YES ]; then - USE_PERL=YES - HTTP_MODULES="$HTTP_MODULES $HTTP_PERL_MODULE" - HTTP_INCS="$HTTP_INCS $HTTP_PERL_INCS" - HTTP_DEPS="$HTTP_DEPS $HTTP_PERL_DEPS" - HTTP_SRCS="$HTTP_SRCS $HTTP_PERL_SRCS" -fi - -if [ $HTTP_MEMCACHED = YES ]; then - HTTP_MODULES="$HTTP_MODULES $HTTP_MEMCACHED_MODULE" - HTTP_SRCS="$HTTP_SRCS $HTTP_MEMCACHED_SRCS" -fi - -if [ $HTTP_EMPTY_GIF = YES ]; then - HTTP_MODULES="$HTTP_MODULES $HTTP_EMPTY_GIF_MODULE" - HTTP_SRCS="$HTTP_SRCS $HTTP_EMPTY_GIF_SRCS" -fi - -if [ $HTTP_BROWSER = YES ]; then - HTTP_MODULES="$HTTP_MODULES $HTTP_BROWSER_MODULE" - HTTP_SRCS="$HTTP_SRCS $HTTP_BROWSER_SRCS" -fi - -if [ $HTTP_SECURE_LINK = YES ]; then - USE_MD5=YES - HTTP_MODULES="$HTTP_MODULES $HTTP_SECURE_LINK_MODULE" - HTTP_SRCS="$HTTP_SRCS $HTTP_SECURE_LINK_SRCS" -fi - -if [ $HTTP_DEGRADATION = YES ]; then - have=NGX_HTTP_DEGRADATION . auto/have - HTTP_MODULES="$HTTP_MODULES $HTTP_DEGRADATION_MODULE" - HTTP_SRCS="$HTTP_SRCS $HTTP_DEGRADATION_SRCS" -fi - -if [ $HTTP_FLV = YES ]; then - HTTP_MODULES="$HTTP_MODULES $HTTP_FLV_MODULE" - HTTP_SRCS="$HTTP_SRCS $HTTP_FLV_SRCS" -fi - -if [ $HTTP_MP4 = YES ]; then - HTTP_MODULES="$HTTP_MODULES $HTTP_MP4_MODULE" - HTTP_SRCS="$HTTP_SRCS $HTTP_MP4_SRCS" -fi - -if [ $HTTP_UPSTREAM_IP_HASH = YES ]; then - HTTP_MODULES="$HTTP_MODULES $HTTP_UPSTREAM_IP_HASH_MODULE" - HTTP_SRCS="$HTTP_SRCS $HTTP_UPSTREAM_IP_HASH_SRCS" -fi - -if [ $HTTP_UPSTREAM_KEEPALIVE = YES ]; then - HTTP_MODULES="$HTTP_MODULES $HTTP_UPSTREAM_KEEPALIVE_MODULE" - HTTP_SRCS="$HTTP_SRCS $HTTP_UPSTREAM_KEEPALIVE_SRCS" -fi - -if [ $HTTP_STUB_STATUS = YES ]; then - have=NGX_STAT_STUB . auto/have - HTTP_MODULES="$HTTP_MODULES ngx_http_stub_status_module" - HTTP_SRCS="$HTTP_SRCS src/http/modules/ngx_http_stub_status_module.c" -fi - #if [ -r $NGX_OBJS/auto ]; then # . $NGX_OBJS/auto #fi @@ -369,6 +1253,15 @@ if test -n "$NGX_ADDONS"; then do echo "adding module in $ngx_addon_dir" + ngx_module_type= + ngx_module_name= + ngx_module_incs= + ngx_module_deps= + ngx_module_srcs= + ngx_module_libs= + ngx_module_order= + ngx_module_link=ADDON + if test -f $ngx_addon_dir/config; then . $ngx_addon_dir/config @@ -382,82 +1275,216 @@ if test -n "$NGX_ADDONS"; then fi -if [ $MAIL_SSL = YES ]; then - have=NGX_MAIL_SSL . auto/have - USE_OPENSSL=YES +if test -n "$DYNAMIC_ADDONS"; then + + echo configuring additional dynamic modules + + for ngx_addon_dir in $DYNAMIC_ADDONS + do + echo "adding module in $ngx_addon_dir" + + ngx_module_type= + ngx_module_name= + ngx_module_incs= + ngx_module_deps= + ngx_module_srcs= + ngx_module_libs= + ngx_module_order= + ngx_module_link=DYNAMIC + + if test -f $ngx_addon_dir/config; then + . $ngx_addon_dir/config + + echo " + $ngx_addon_name was configured" + + else + echo "$0: error: no $ngx_addon_dir/config was found" + exit 1 + fi + done +fi + + +if [ $USE_OPENSSL = YES ]; then + ngx_module_type=CORE + ngx_module_name=ngx_openssl_module + ngx_module_incs= + ngx_module_deps=src/event/ngx_event_openssl.h + ngx_module_srcs="src/event/ngx_event_openssl.c + src/event/ngx_event_openssl_stapling.c" + ngx_module_libs= + ngx_module_link=YES + ngx_module_order= + + . auto/module +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 + ngx_module_incs= + ngx_module_deps=src/core/ngx_regex.h + ngx_module_srcs=src/core/ngx_regex.c + ngx_module_libs= + ngx_module_link=YES + ngx_module_order= + + . auto/module fi modules="$CORE_MODULES $EVENT_MODULES" -if [ $USE_OPENSSL = YES ]; then - modules="$modules $OPENSSL_MODULE" - CORE_DEPS="$CORE_DEPS $OPENSSL_DEPS" - CORE_SRCS="$CORE_SRCS $OPENSSL_SRCS" +# thread pool module should be initialized after events +if [ $USE_THREADS = YES ]; then + modules="$modules $THREAD_POOL_MODULE" fi -if [ $USE_PCRE = YES ]; then - modules="$modules $REGEX_MODULE" - CORE_DEPS="$CORE_DEPS $REGEX_DEPS" - CORE_SRCS="$CORE_SRCS $REGEX_SRCS" -fi if [ $HTTP = YES ]; then modules="$modules $HTTP_MODULES $HTTP_FILTER_MODULES \ - $HTTP_HEADERS_FILTER_MODULE \ - $HTTP_AUX_FILTER_MODULES \ - $HTTP_COPY_FILTER_MODULE \ - $HTTP_RANGE_BODY_FILTER_MODULE \ - $HTTP_NOT_MODIFIED_FILTER_MODULE" + $HTTP_AUX_FILTER_MODULES $HTTP_INIT_FILTER_MODULES" NGX_ADDON_DEPS="$NGX_ADDON_DEPS \$(HTTP_DEPS)" fi -if [ $MAIL = YES ]; then - modules="$modules $MAIL_MODULES" +if [ $MAIL != NO ]; then - if [ $MAIL_SSL = YES ]; then - modules="$modules $MAIL_SSL_MODULE" - MAIL_DEPS="$MAIL_DEPS $MAIL_SSL_DEPS" - MAIL_SRCS="$MAIL_SRCS $MAIL_SSL_SRCS" + if [ $MAIL = YES ]; then + modules="$modules $MAIL_MODULES" + + elif [ $MAIL = DYNAMIC ]; then + ngx_module_name=$MAIL_MODULES + ngx_module_incs= + ngx_module_deps= + ngx_module_srcs=$MAIL_SRCS + ngx_module_libs= + ngx_module_link=DYNAMIC + + . auto/module fi - if [ $MAIL_POP3 = YES ]; then - modules="$modules $MAIL_POP3_MODULE" - MAIL_DEPS="$MAIL_DEPS $MAIL_POP3_DEPS" - MAIL_SRCS="$MAIL_SRCS $MAIL_POP3_SRCS" - fi - - if [ $MAIL_IMAP = YES ]; then - modules="$modules $MAIL_IMAP_MODULE" - MAIL_DEPS="$MAIL_DEPS $MAIL_IMAP_DEPS" - MAIL_SRCS="$MAIL_SRCS $MAIL_IMAP_SRCS" - fi - - if [ $MAIL_SMTP = YES ]; then - modules="$modules $MAIL_SMTP_MODULE" - MAIL_DEPS="$MAIL_DEPS $MAIL_SMTP_DEPS" - MAIL_SRCS="$MAIL_SRCS $MAIL_SMTP_SRCS" - fi - - modules="$modules $MAIL_AUTH_HTTP_MODULE" - MAIL_SRCS="$MAIL_SRCS $MAIL_AUTH_HTTP_SRCS" - - modules="$modules $MAIL_PROXY_MODULE" - MAIL_SRCS="$MAIL_SRCS $MAIL_PROXY_SRCS" + NGX_ADDON_DEPS="$NGX_ADDON_DEPS \$(MAIL_DEPS)" fi +if [ $STREAM != NO ]; then + + if [ $STREAM = YES ]; then + modules="$modules $STREAM_MODULES" + + elif [ $STREAM = DYNAMIC ]; then + ngx_module_name=$STREAM_MODULES + ngx_module_incs= + ngx_module_deps= + ngx_module_srcs=$STREAM_SRCS + ngx_module_libs= + ngx_module_link=DYNAMIC + + . auto/module + fi + + NGX_ADDON_DEPS="$NGX_ADDON_DEPS \$(STREAM_DEPS)" +fi + + +ngx_module_type=MISC +MISC_MODULES= + if [ $NGX_GOOGLE_PERFTOOLS = YES ]; then - modules="$modules $NGX_GOOGLE_PERFTOOLS_MODULE" - NGX_MISC_SRCS="$NGX_MISC_SRCS $NGX_GOOGLE_PERFTOOLS_SRCS" + ngx_module_name=ngx_google_perftools_module + ngx_module_incs= + ngx_module_deps= + ngx_module_srcs=src/misc/ngx_google_perftools_module.c + ngx_module_libs= + ngx_module_link=$NGX_GOOGLE_PERFTOOLS + + . auto/module fi - if [ $NGX_CPP_TEST = YES ]; then - NGX_MISC_SRCS="$NGX_MISC_SRCS $NGX_CPP_TEST_SRCS" + ngx_module_name= + ngx_module_incs= + ngx_module_deps= + ngx_module_srcs=src/misc/ngx_cpp_test_module.cpp + ngx_module_libs=-lstdc++ + ngx_module_link=$NGX_CPP_TEST + + . auto/module +fi + +modules="$modules $MISC_MODULES" + + +if [ $NGX_COMPAT = YES ]; then + have=NGX_COMPAT . auto/have + have=NGX_HTTP_GZIP . auto/have + have=NGX_HTTP_DAV . auto/have + have=NGX_HTTP_REALIP . auto/have + have=NGX_HTTP_X_FORWARDED_FOR . auto/have + have=NGX_HTTP_HEADERS . auto/have + have=NGX_HTTP_UPSTREAM_ZONE . auto/have + have=NGX_STREAM_UPSTREAM_ZONE . auto/have fi @@ -488,3 +1515,16 @@ cat << END >> $NGX_MODULES_C }; END + +echo 'char *ngx_module_names[] = {' >> $NGX_MODULES_C + +for mod in $modules +do + echo " \"$mod\"," >> $NGX_MODULES_C +done + +cat << END >> $NGX_MODULES_C + NULL +}; + +END diff --git a/auto/options b/auto/options index 393be40..6a6e990 100644 --- a/auto/options +++ b/auto/options @@ -7,6 +7,7 @@ help=no NGX_PREFIX= NGX_SBIN_PATH= +NGX_MODULES_PATH= NGX_CONF_PREFIX= NGX_CONF_PATH= NGX_ERROR_LOG_PATH= @@ -14,8 +15,9 @@ NGX_PID_PATH= NGX_LOCK_PATH= NGX_USER= NGX_GROUP= +NGX_BUILD= -CC=${CC:-gcc} +CC=${CC:-cc} CPP= NGX_OBJS=objs @@ -29,7 +31,6 @@ NGX_RPATH=NO NGX_TEST_BUILD_DEVPOLL=NO NGX_TEST_BUILD_EVENTPORT=NO NGX_TEST_BUILD_EPOLL=NO -NGX_TEST_BUILD_RTSIG=NO NGX_TEST_BUILD_SOLARIS_SENDFILEV=NO NGX_PLATFORM= @@ -37,15 +38,14 @@ NGX_WINE= EVENT_FOUND=NO -EVENT_RTSIG=NO EVENT_SELECT=NO EVENT_POLL=NO -EVENT_AIO=NO USE_THREADS=NO NGX_FILE_AIO=NO -NGX_IPV6=NO + +QUIC_BPF=NO HTTP=YES @@ -60,8 +60,9 @@ HTTP_CACHE=YES HTTP_CHARSET=YES HTTP_GZIP=YES HTTP_SSL=NO +HTTP_V2=NO +HTTP_V3=NO HTTP_SSI=YES -HTTP_POSTPONE=NO HTTP_REALIP=NO HTTP_XSLT=NO HTTP_IMAGE_FILTER=NO @@ -70,7 +71,10 @@ HTTP_ADDITION=NO HTTP_DAV=NO HTTP_ACCESS=YES HTTP_AUTH_BASIC=YES +HTTP_AUTH_REQUEST=NO +HTTP_MIRROR=YES HTTP_USERID=YES +HTTP_SLICE=NO HTTP_AUTOINDEX=YES HTTP_RANDOM_INDEX=NO HTTP_STATUS=NO @@ -84,6 +88,7 @@ HTTP_PROXY=YES HTTP_FASTCGI=YES HTTP_UWSGI=YES HTTP_SCGI=YES +HTTP_GRPC=YES HTTP_PERL=NO HTTP_MEMCACHED=YES HTTP_LIMIT_CONN=YES @@ -94,9 +99,14 @@ HTTP_SECURE_LINK=NO HTTP_DEGRADATION=NO HTTP_FLV=NO HTTP_MP4=NO +HTTP_GUNZIP=NO HTTP_GZIP_STATIC=NO +HTTP_UPSTREAM_HASH=YES HTTP_UPSTREAM_IP_HASH=YES +HTTP_UPSTREAM_LEAST_CONN=YES +HTTP_UPSTREAM_RANDOM=YES HTTP_UPSTREAM_KEEPALIVE=YES +HTTP_UPSTREAM_ZONE=YES # STUB HTTP_STUB_STATUS=NO @@ -107,27 +117,45 @@ MAIL_POP3=YES MAIL_IMAP=YES MAIL_SMTP=YES +STREAM=NO +STREAM_SSL=NO +STREAM_REALIP=NO +STREAM_LIMIT_CONN=YES +STREAM_ACCESS=YES +STREAM_GEO=YES +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 +STREAM_UPSTREAM_RANDOM=YES +STREAM_UPSTREAM_ZONE=YES +STREAM_SSL_PREREAD=NO + +DYNAMIC_MODULES= +DYNAMIC_MODULES_SRCS= + NGX_ADDONS= +NGX_ADDON_SRCS= +NGX_ADDON_DEPS= +DYNAMIC_ADDONS= + +NGX_COMPAT=NO USE_PCRE=NO PCRE=NONE PCRE_OPT= PCRE_CONF_OPT= PCRE_JIT=NO +PCRE2=YES USE_OPENSSL=NO +USE_OPENSSL_QUIC=NO OPENSSL=NONE -USE_MD5=NO -MD5=NONE -MD5_OPT= -MD5_ASM=NO - -USE_SHA1=NO -SHA1=NONE -SHA1_OPT= -SHA1_ASM=NO - USE_ZLIB=NO ZLIB=NONE ZLIB_OPT= @@ -138,10 +166,13 @@ NGX_PERL=perl USE_LIBXSLT=NO USE_LIBGD=NO +USE_GEOIP=NO NGX_GOOGLE_PERFTOOLS=NO NGX_CPP_TEST=NO +SO_COOKIE_FOUND=NO + NGX_LIBATOMIC=NO NGX_CPU_CACHE_LINE= @@ -165,6 +196,7 @@ do --prefix=) NGX_PREFIX="!" ;; --prefix=*) NGX_PREFIX="$value" ;; --sbin-path=*) NGX_SBIN_PATH="$value" ;; + --modules-path=*) NGX_MODULES_PATH="$value" ;; --conf-path=*) NGX_CONF_PATH="$value" ;; --error-log-path=*) NGX_ERROR_LOG_PATH="$value";; --pid-path=*) NGX_PID_PATH="$value" ;; @@ -174,20 +206,24 @@ do --crossbuild=*) NGX_PLATFORM="$value" ;; + --build=*) NGX_BUILD="$value" ;; --builddir=*) NGX_OBJS="$value" ;; - --with-rtsig_module) EVENT_RTSIG=YES ;; --with-select_module) EVENT_SELECT=YES ;; --without-select_module) EVENT_SELECT=NONE ;; --with-poll_module) EVENT_POLL=YES ;; --without-poll_module) EVENT_POLL=NONE ;; - --with-aio_module) EVENT_AIO=YES ;; - #--with-threads=*) USE_THREADS="$value" ;; - #--with-threads) USE_THREADS="pthreads" ;; + --with-threads) USE_THREADS=YES ;; --with-file-aio) NGX_FILE_AIO=YES ;; - --with-ipv6) NGX_IPV6=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" + ;; --without-http) HTTP=NO ;; --without-http-cache) HTTP_CACHE=NO ;; @@ -200,19 +236,29 @@ do --http-scgi-temp-path=*) NGX_HTTP_SCGI_TEMP_PATH="$value" ;; --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 ;; + --with-http_xslt_module=dynamic) HTTP_XSLT=DYNAMIC ;; --with-http_image_filter_module) HTTP_IMAGE_FILTER=YES ;; + --with-http_image_filter_module=dynamic) + HTTP_IMAGE_FILTER=DYNAMIC ;; --with-http_geoip_module) HTTP_GEOIP=YES ;; + --with-http_geoip_module=dynamic) + HTTP_GEOIP=DYNAMIC ;; --with-http_sub_module) HTTP_SUB=YES ;; --with-http_dav_module) HTTP_DAV=YES ;; --with-http_flv_module) HTTP_FLV=YES ;; --with-http_mp4_module) HTTP_MP4=YES ;; + --with-http_gunzip_module) HTTP_GUNZIP=YES ;; --with-http_gzip_static_module) HTTP_GZIP_STATIC=YES ;; + --with-http_auth_request_module) HTTP_AUTH_REQUEST=YES ;; --with-http_random_index_module) HTTP_RANDOM_INDEX=YES ;; --with-http_secure_link_module) HTTP_SECURE_LINK=YES ;; --with-http_degradation_module) HTTP_DEGRADATION=YES ;; + --with-http_slice_module) HTTP_SLICE=YES ;; --without-http_charset_module) HTTP_CHARSET=NO ;; --without-http_gzip_module) HTTP_GZIP=NO ;; @@ -220,6 +266,7 @@ do --without-http_userid_module) HTTP_USERID=NO ;; --without-http_access_module) HTTP_ACCESS=NO ;; --without-http_auth_basic_module) HTTP_AUTH_BASIC=NO ;; + --without-http_mirror_module) HTTP_MIRROR=NO ;; --without-http_autoindex_module) HTTP_AUTOINDEX=NO ;; --without-http_status_module) HTTP_STATUS=NO ;; --without-http_geo_module) HTTP_GEO=NO ;; @@ -231,21 +278,23 @@ do --without-http_fastcgi_module) HTTP_FASTCGI=NO ;; --without-http_uwsgi_module) HTTP_UWSGI=NO ;; --without-http_scgi_module) HTTP_SCGI=NO ;; + --without-http_grpc_module) HTTP_GRPC=NO ;; --without-http_memcached_module) HTTP_MEMCACHED=NO ;; - --without-http_limit_zone_module) - HTTP_LIMIT_CONN=NO - NGX_POST_CONF_MSG="$NGX_POST_CONF_MSG -$0: warning: the \"--without-http_limit_zone_module\" option is deprecated, \ -use the \"--without-http_limit_conn_module\" option instead" - ;; --without-http_limit_conn_module) HTTP_LIMIT_CONN=NO ;; --without-http_limit_req_module) HTTP_LIMIT_REQ=NO ;; --without-http_empty_gif_module) HTTP_EMPTY_GIF=NO ;; --without-http_browser_module) HTTP_BROWSER=NO ;; + --without-http_upstream_hash_module) HTTP_UPSTREAM_HASH=NO ;; --without-http_upstream_ip_hash_module) HTTP_UPSTREAM_IP_HASH=NO ;; + --without-http_upstream_least_conn_module) + HTTP_UPSTREAM_LEAST_CONN=NO ;; + --without-http_upstream_random_module) + HTTP_UPSTREAM_RANDOM=NO ;; --without-http_upstream_keepalive_module) HTTP_UPSTREAM_KEEPALIVE=NO ;; + --without-http_upstream_zone_module) HTTP_UPSTREAM_ZONE=NO ;; --with-http_perl_module) HTTP_PERL=YES ;; + --with-http_perl_module=dynamic) HTTP_PERL=DYNAMIC ;; --with-perl_modules_path=*) NGX_PERL_MODULES="$value" ;; --with-perl=*) NGX_PERL="$value" ;; @@ -253,18 +302,60 @@ use the \"--without-http_limit_conn_module\" option instead" --with-http_stub_status_module) HTTP_STUB_STATUS=YES ;; --with-mail) MAIL=YES ;; + --with-mail=dynamic) MAIL=DYNAMIC ;; --with-mail_ssl_module) MAIL_SSL=YES ;; # STUB - --with-imap) MAIL=YES ;; - --with-imap_ssl_module) MAIL_SSL=YES ;; + --with-imap) + MAIL=YES + NGX_POST_CONF_MSG="$NGX_POST_CONF_MSG +$0: warning: the \"--with-imap\" option is deprecated, \ +use the \"--with-mail\" option instead" + ;; + --with-imap_ssl_module) + MAIL_SSL=YES + NGX_POST_CONF_MSG="$NGX_POST_CONF_MSG +$0: warning: the \"--with-imap_ssl_module\" option is deprecated, \ +use the \"--with-mail_ssl_module\" option instead" + ;; --without-mail_pop3_module) MAIL_POP3=NO ;; --without-mail_imap_module) MAIL_IMAP=NO ;; --without-mail_smtp_module) MAIL_SMTP=NO ;; + --with-stream) STREAM=YES ;; + --with-stream=dynamic) STREAM=DYNAMIC ;; + --with-stream_ssl_module) STREAM_SSL=YES ;; + --with-stream_realip_module) STREAM_REALIP=YES ;; + --with-stream_geoip_module) STREAM_GEOIP=YES ;; + --with-stream_geoip_module=dynamic) + STREAM_GEOIP=DYNAMIC ;; + --with-stream_ssl_preread_module) + STREAM_SSL_PREREAD=YES ;; + --without-stream_limit_conn_module) + STREAM_LIMIT_CONN=NO ;; + --without-stream_access_module) STREAM_ACCESS=NO ;; + --without-stream_geo_module) STREAM_GEO=NO ;; + --without-stream_map_module) STREAM_MAP=NO ;; + --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 ;; + --without-stream_upstream_least_conn_module) + STREAM_UPSTREAM_LEAST_CONN=NO ;; + --without-stream_upstream_random_module) + STREAM_UPSTREAM_RANDOM=NO ;; + --without-stream_upstream_zone_module) + STREAM_UPSTREAM_ZONE=NO ;; + --with-google_perftools_module) NGX_GOOGLE_PERFTOOLS=YES ;; --with-cpp_test_module) NGX_CPP_TEST=YES ;; --add-module=*) NGX_ADDONS="$NGX_ADDONS $value" ;; + --add-dynamic-module=*) DYNAMIC_ADDONS="$DYNAMIC_ADDONS $value" ;; + + --with-compat) NGX_COMPAT=YES ;; --with-cc=*) CC="$value" ;; --with-cpp=*) CPP="$value" ;; @@ -278,17 +369,36 @@ use the \"--without-http_limit_conn_module\" option instead" --with-pcre=*) PCRE="$value" ;; --with-pcre-opt=*) PCRE_OPT="$value" ;; --with-pcre-jit) PCRE_JIT=YES ;; + --without-pcre2) PCRE2=DISABLED ;; --with-openssl=*) OPENSSL="$value" ;; --with-openssl-opt=*) OPENSSL_OPT="$value" ;; - --with-md5=*) MD5="$value" ;; - --with-md5-opt=*) MD5_OPT="$value" ;; - --with-md5-asm) MD5_ASM=YES ;; + --with-md5=*) + NGX_POST_CONF_MSG="$NGX_POST_CONF_MSG +$0: warning: the \"--with-md5\" option is deprecated" + ;; + --with-md5-opt=*) + NGX_POST_CONF_MSG="$NGX_POST_CONF_MSG +$0: warning: the \"--with-md5-opt\" option is deprecated" + ;; + --with-md5-asm) + NGX_POST_CONF_MSG="$NGX_POST_CONF_MSG +$0: warning: the \"--with-md5-asm\" option is deprecated" + ;; - --with-sha1=*) SHA1="$value" ;; - --with-sha1-opt=*) SHA1_OPT="$value" ;; - --with-sha1-asm) SHA1_ASM=YES ;; + --with-sha1=*) + NGX_POST_CONF_MSG="$NGX_POST_CONF_MSG +$0: warning: the \"--with-sha1\" option is deprecated" + ;; + --with-sha1-opt=*) + NGX_POST_CONF_MSG="$NGX_POST_CONF_MSG +$0: warning: the \"--with-sha1-opt\" option is deprecated" + ;; + --with-sha1-asm) + NGX_POST_CONF_MSG="$NGX_POST_CONF_MSG +$0: warning: the \"--with-sha1-asm\" option is deprecated" + ;; --with-zlib=*) ZLIB="$value" ;; --with-zlib-opt=*) ZLIB_OPT="$value" ;; @@ -300,7 +410,6 @@ use the \"--without-http_limit_conn_module\" option instead" --test-build-devpoll) NGX_TEST_BUILD_DEVPOLL=YES ;; --test-build-eventport) NGX_TEST_BUILD_EVENTPORT=YES ;; --test-build-epoll) NGX_TEST_BUILD_EPOLL=YES ;; - --test-build-rtsig) NGX_TEST_BUILD_RTSIG=YES ;; --test-build-solaris-sendfilev) NGX_TEST_BUILD_SOLARIS_SENDFILEV=YES ;; *) @@ -322,6 +431,7 @@ cat << END --prefix=PATH set installation prefix --sbin-path=PATH set nginx binary pathname + --modules-path=PATH set modules path --conf-path=PATH set nginx.conf pathname --error-log-path=PATH set error log pathname --pid-path=PATH set nginx.pid pathname @@ -332,31 +442,43 @@ cat << END --group=GROUP set non-privileged group for worker processes + --build=NAME set build name --builddir=DIR set build directory - --with-rtsig_module enable rtsig module --with-select_module enable select module --without-select_module disable select module --with-poll_module enable poll module --without-poll_module disable poll module + --with-threads enable thread pool support + --with-file-aio enable file AIO support - --with-ipv6 enable IPv6 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 + --with-http_xslt_module=dynamic enable dynamic ngx_http_xslt_module --with-http_image_filter_module enable ngx_http_image_filter_module + --with-http_image_filter_module=dynamic + enable dynamic ngx_http_image_filter_module --with-http_geoip_module enable ngx_http_geoip_module + --with-http_geoip_module=dynamic enable dynamic ngx_http_geoip_module --with-http_sub_module enable ngx_http_sub_module --with-http_dav_module enable ngx_http_dav_module --with-http_flv_module enable ngx_http_flv_module --with-http_mp4_module enable ngx_http_mp4_module + --with-http_gunzip_module enable ngx_http_gunzip_module --with-http_gzip_static_module enable ngx_http_gzip_static_module + --with-http_auth_request_module enable ngx_http_auth_request_module --with-http_random_index_module enable ngx_http_random_index_module --with-http_secure_link_module enable ngx_http_secure_link_module --with-http_degradation_module enable ngx_http_degradation_module + --with-http_slice_module enable ngx_http_slice_module --with-http_stub_status_module enable ngx_http_stub_status_module --without-http_charset_module disable ngx_http_charset_module @@ -365,6 +487,7 @@ cat << END --without-http_userid_module disable ngx_http_userid_module --without-http_access_module disable ngx_http_access_module --without-http_auth_basic_module disable ngx_http_auth_basic_module + --without-http_mirror_module disable ngx_http_mirror_module --without-http_autoindex_module disable ngx_http_autoindex_module --without-http_geo_module disable ngx_http_geo_module --without-http_map_module disable ngx_http_map_module @@ -375,15 +498,27 @@ cat << END --without-http_fastcgi_module disable ngx_http_fastcgi_module --without-http_uwsgi_module disable ngx_http_uwsgi_module --without-http_scgi_module disable ngx_http_scgi_module + --without-http_grpc_module disable ngx_http_grpc_module --without-http_memcached_module disable ngx_http_memcached_module --without-http_limit_conn_module disable ngx_http_limit_conn_module --without-http_limit_req_module disable ngx_http_limit_req_module --without-http_empty_gif_module disable ngx_http_empty_gif_module --without-http_browser_module disable ngx_http_browser_module + --without-http_upstream_hash_module + disable ngx_http_upstream_hash_module --without-http_upstream_ip_hash_module disable ngx_http_upstream_ip_hash_module + --without-http_upstream_least_conn_module + disable ngx_http_upstream_least_conn_module + --without-http_upstream_random_module + disable ngx_http_upstream_random_module + --without-http_upstream_keepalive_module + disable ngx_http_upstream_keepalive_module + --without-http_upstream_zone_module + disable ngx_http_upstream_zone_module --with-http_perl_module enable ngx_http_perl_module + --with-http_perl_module=dynamic enable dynamic ngx_http_perl_module --with-perl_modules_path=PATH set Perl modules path --with-perl=PATH set perl binary pathname @@ -403,15 +538,44 @@ cat << END --without-http-cache disable HTTP cache --with-mail enable POP3/IMAP4/SMTP proxy module + --with-mail=dynamic enable dynamic POP3/IMAP4/SMTP proxy module --with-mail_ssl_module enable ngx_mail_ssl_module --without-mail_pop3_module disable ngx_mail_pop3_module --without-mail_imap_module disable ngx_mail_imap_module --without-mail_smtp_module disable ngx_mail_smtp_module + --with-stream enable TCP/UDP proxy module + --with-stream=dynamic enable dynamic TCP/UDP proxy module + --with-stream_ssl_module enable ngx_stream_ssl_module + --with-stream_realip_module enable ngx_stream_realip_module + --with-stream_geoip_module enable ngx_stream_geoip_module + --with-stream_geoip_module=dynamic enable dynamic ngx_stream_geoip_module + --with-stream_ssl_preread_module enable ngx_stream_ssl_preread_module + --without-stream_limit_conn_module disable ngx_stream_limit_conn_module + --without-stream_access_module disable ngx_stream_access_module + --without-stream_geo_module disable ngx_stream_geo_module + --without-stream_map_module disable ngx_stream_map_module + --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 + --without-stream_upstream_least_conn_module + disable ngx_stream_upstream_least_conn_module + --without-stream_upstream_random_module + disable ngx_stream_upstream_random_module + --without-stream_upstream_zone_module + disable ngx_stream_upstream_zone_module + --with-google_perftools_module enable ngx_google_perftools_module --with-cpp_test_module enable ngx_cpp_test_module - --add-module=PATH enable an external module + --add-module=PATH enable external module + --add-dynamic-module=PATH enable dynamic external module + + --with-compat dynamic modules compatibility --with-cc=PATH set C compiler pathname --with-cpp=PATH set C preprocessor pathname @@ -426,14 +590,7 @@ cat << END --with-pcre=DIR set path to PCRE library sources --with-pcre-opt=OPTIONS set additional build options for PCRE --with-pcre-jit build PCRE with JIT compilation support - - --with-md5=DIR set path to md5 library sources - --with-md5-opt=OPTIONS set additional build options for md5 - --with-md5-asm use md5 assembler sources - - --with-sha1=DIR set path to sha1 library sources - --with-sha1-opt=OPTIONS set additional build options for sha1 - --with-sha1-asm use sha1 assembler sources + --without-pcre2 do not use PCRE2 library --with-zlib=DIR set path to zlib library sources --with-zlib-opt=OPTIONS set additional build options for zlib @@ -455,24 +612,13 @@ END fi -if [ $HTTP = NO ]; then - HTTP_CHARSET=NO - HTTP_GZIP=NO - HTTP_SSI=NO - HTTP_USERID=NO - HTTP_ACCESS=NO - HTTP_STATUS=NO - HTTP_REWRITE=NO - HTTP_PROXY=NO - HTTP_FASTCGI=NO -fi - - if [ ".$NGX_PLATFORM" = ".win32" ]; then NGX_WINE=$WINE fi +NGX_SBIN_PATH=${NGX_SBIN_PATH:-sbin/nginx} +NGX_MODULES_PATH=${NGX_MODULES_PATH:-modules} NGX_CONF_PATH=${NGX_CONF_PATH:-conf/nginx.conf} NGX_CONF_PREFIX=`dirname $NGX_CONF_PATH` NGX_PID_PATH=${NGX_PID_PATH:-logs/nginx.pid} diff --git a/auto/os/conf b/auto/os/conf index 8c18a63..bb0ce4e 100644 --- a/auto/os/conf +++ b/auto/os/conf @@ -41,6 +41,14 @@ case "$NGX_PLATFORM" in ' ;; + NetBSD:*) + CORE_INCS="$UNIX_INCS" + CORE_DEPS="$UNIX_DEPS $POSIX_DEPS" + CORE_SRCS="$UNIX_SRCS" + + NGX_RPATH=YES + ;; + HP-UX:*) # HP/UX have=NGX_HPUX . auto/have_headers @@ -48,6 +56,7 @@ case "$NGX_PLATFORM" in CORE_DEPS="$UNIX_DEPS $POSIX_DEPS" CORE_SRCS="$UNIX_SRCS" CC_AUX_FLAGS="$CC_AUX_FLAGS -D_XOPEN_SOURCE -D_XOPEN_SOURCE_EXTENDED=1" + CC_AUX_FLAGS="$CC_AUX_FLAGS -D_HPUX_ALT_XOPEN_SOCKET_API" ;; OSF1:*) @@ -59,6 +68,15 @@ case "$NGX_PLATFORM" in CORE_SRCS="$UNIX_SRCS" ;; + GNU:*) + # GNU Hurd + have=NGX_GNU_HURD . auto/have_headers + CORE_INCS="$UNIX_INCS" + CORE_DEPS="$UNIX_DEPS $POSIX_DEPS" + CORE_SRCS="$UNIX_SRCS" + CC_AUX_FLAGS="$CC_AUX_FLAGS -D_GNU_SOURCE -D_FILE_OFFSET_BITS=64" + ;; + *) CORE_INCS="$UNIX_INCS" CORE_DEPS="$UNIX_DEPS $POSIX_DEPS" @@ -92,7 +110,28 @@ case "$NGX_MACHINE" in NGX_MACH_CACHE_LINE=64 ;; + 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/darwin b/auto/os/darwin index 590e036..429468f 100644 --- a/auto/os/darwin +++ b/auto/os/darwin @@ -14,6 +14,12 @@ CORE_SRCS="$UNIX_SRCS $DARWIN_SRCS" ngx_spacer=' ' +MAIN_LINK= +MODULE_LINK="-shared -Wl,-undefined,dynamic_lookup" + +CC_AUX_FLAGS="$CC_AUX_FLAGS -D__APPLE_USE_RFC_3542" + + # kqueue echo " + kqueue found" @@ -83,7 +89,6 @@ ngx_feature_test="int kq; # sendfile() -CC_AUX_FLAGS="$CC_AUX_FLAGS" ngx_feature="sendfile()" ngx_feature_name="NGX_HAVE_SENDFILE" ngx_feature_run=yes @@ -100,7 +105,6 @@ ngx_feature_test="int s = 0, fd = 1; . auto/feature if [ $ngx_found = yes ]; then - have=NGX_HAVE_SENDFILE . auto/have CORE_SRCS="$CORE_SRCS $DARWIN_SENDFILE_SRCS" fi @@ -111,6 +115,6 @@ ngx_feature_run=no ngx_feature_incs="#include " ngx_feature_path= ngx_feature_libs= -ngx_feature_test="int32_t lock, n; - n = OSAtomicCompareAndSwap32Barrier(0, 1, lock)" +ngx_feature_test="int32_t lock = 0; + if (!OSAtomicCompareAndSwap32Barrier(0, 1, &lock)) return 1" . auto/feature diff --git a/auto/os/freebsd b/auto/os/freebsd index 6aa823f..870bac4 100644 --- a/auto/os/freebsd +++ b/auto/os/freebsd @@ -44,10 +44,10 @@ if [ $osreldate -gt 300007 ]; then CORE_SRCS="$CORE_SRCS $FREEBSD_SENDFILE_SRCS" fi -if [ $osreldate -gt 502103 ]; then +if [ $osreldate -gt 1100093 ]; then echo " + sendfile()'s SF_NODISKIO found" - have=NGX_HAVE_AIO_SENDFILE . auto/have + have=NGX_HAVE_SENDFILE_NODISKIO . auto/have fi # POSIX semaphores @@ -78,7 +78,7 @@ fi NGX_KQUEUE_CHECKED=YES -# kqueue's NOTE_LAWAT +# kqueue's NOTE_LOWAT if [ \( $version -lt 500000 -a $version -ge 430000 \) \ -o $version -ge 500018 ] @@ -97,45 +97,6 @@ then fi -if [ $USE_THREADS = "rfork" ]; then - - echo " + using rfork()" - -# # kqueue's EVFILT_SIGNAL is safe -# -# if [ $version -gt 460101 ]; then -# echo " + kqueue's EVFILT_SIGNAL is safe" -# have=NGX_HAVE_SAFE_EVFILT_SIGNAL . auto/have -# else -# echo "$0: error: the kqueue's EVFILT_SIGNAL is unsafe on this" -# echo "FreeBSD version, so --with-threads=rfork could not be used" -# echo -# -# exit 1 -# fi -fi - - -if [ $EVENT_AIO = YES ]; then - if [ \( $version -lt 500000 -a $version -ge 430000 \) \ - -o $version -ge 500014 ] - then - have=NGX_HAVE_AIO . auto/have - EVENT_MODULES="$EVENT_MODULES $AIO_MODULE" - CORE_SRCS="$CORE_SRCS $AIO_SRCS" - else - -cat << END - -$0: error: the kqueue does not support AIO on this FreeBSD version - -END - - exit 1 - fi -fi - - # cpuset_setaffinity() if [ $version -ge 701000 ]; then diff --git a/auto/os/linux b/auto/os/linux index c506d3d..bc0556b 100644 --- a/auto/os/linux +++ b/auto/os/linux @@ -26,18 +26,6 @@ version=$((`uname -r \ version=${version:-0} -# enable the rt signals on Linux between 2.2.19 and 2.6.17 - -if [ \( $version -ge 131603 -a $version -lt 132626 \) -o $EVENT_RTSIG = YES ] -then - echo " + rt signals found" - have=NGX_HAVE_RTSIG . auto/have - EVENT_MODULES="$EVENT_MODULES $RTSIG_MODULE" - CORE_SRCS="$CORE_SRCS $RTSIG_SRCS" - EVENT_FOUND=YES -fi - - # posix_fadvise64() had been implemented in 2.5.60 if [ $version -lt 132412 ]; then @@ -56,6 +44,7 @@ ngx_feature_test="int efd = 0; struct epoll_event ee; ee.events = EPOLLIN|EPOLLOUT|EPOLLET; ee.data.ptr = NULL; + (void) ee; efd = epoll_create(100); if (efd == -1) return 1;" . auto/feature @@ -65,9 +54,82 @@ if [ $ngx_found = yes ]; then CORE_SRCS="$CORE_SRCS $EPOLL_SRCS" EVENT_MODULES="$EVENT_MODULES $EPOLL_MODULE" EVENT_FOUND=YES + + + # EPOLLRDHUP appeared in Linux 2.6.17, glibc 2.8 + + ngx_feature="EPOLLRDHUP" + ngx_feature_name="NGX_HAVE_EPOLLRDHUP" + ngx_feature_run=no + ngx_feature_incs="#include " + ngx_feature_path= + ngx_feature_libs= + ngx_feature_test="int efd = 0, fd = 0; + struct epoll_event ee; + ee.events = EPOLLIN|EPOLLRDHUP|EPOLLET; + ee.data.ptr = NULL; + epoll_ctl(efd, EPOLL_CTL_ADD, fd, &ee)" + . auto/feature + + + # EPOLLEXCLUSIVE appeared in Linux 4.5, glibc 2.24 + + ngx_feature="EPOLLEXCLUSIVE" + ngx_feature_name="NGX_HAVE_EPOLLEXCLUSIVE" + ngx_feature_run=no + ngx_feature_incs="#include " + ngx_feature_path= + ngx_feature_libs= + ngx_feature_test="int efd = 0, fd = 0; + struct epoll_event ee; + ee.events = EPOLLIN|EPOLLEXCLUSIVE; + ee.data.ptr = NULL; + epoll_ctl(efd, EPOLL_CTL_ADD, fd, &ee)" + . auto/feature + + + # eventfd() + + ngx_feature="eventfd()" + ngx_feature_name="NGX_HAVE_EVENTFD" + ngx_feature_run=no + ngx_feature_incs="#include " + ngx_feature_path= + ngx_feature_libs= + ngx_feature_test="(void) eventfd(0, 0)" + . auto/feature + + if [ $ngx_found = yes ]; then + have=NGX_HAVE_SYS_EVENTFD_H . auto/have + fi + + + if [ $ngx_found = no ]; then + + ngx_feature="eventfd() (SYS_eventfd)" + ngx_feature_incs="#include " + ngx_feature_test="(void) SYS_eventfd" + . auto/feature + fi fi +# O_PATH and AT_EMPTY_PATH were introduced in 2.6.39, glibc 2.14 + +ngx_feature="O_PATH" +ngx_feature_name="NGX_HAVE_O_PATH" +ngx_feature_run=no +ngx_feature_incs="#include + #include + #include " +ngx_feature_path= +ngx_feature_libs= +ngx_feature_test="int fd; struct stat sb; + fd = openat(AT_FDCWD, \".\", O_PATH|O_DIRECTORY|O_NOFOLLOW); + if (fstatat(fd, \"\", &sb, AT_EMPTY_PATH) != 0) return 1" +. auto/feature + + # sendfile() CC_AUX_FLAGS="$cc_aux_flags -D_GNU_SOURCE" @@ -120,17 +182,37 @@ ngx_feature_test="if (prctl(PR_SET_DUMPABLE, 1, 0, 0, 0) == -1) return 1" . auto/feature -# sched_setaffinity() +# prctl(PR_SET_KEEPCAPS) -ngx_feature="sched_setaffinity()" -ngx_feature_name="NGX_HAVE_SCHED_SETAFFINITY" -ngx_feature_run=no -ngx_feature_incs="#include " +ngx_feature="prctl(PR_SET_KEEPCAPS)" +ngx_feature_name="NGX_HAVE_PR_SET_KEEPCAPS" +ngx_feature_run=yes +ngx_feature_incs="#include " ngx_feature_path= ngx_feature_libs= -ngx_feature_test="cpu_set_t mask; - CPU_ZERO(&mask); - sched_setaffinity(0, sizeof(cpu_set_t), &mask)" +ngx_feature_test="if (prctl(PR_SET_KEEPCAPS, 1, 0, 0, 0) == -1) return 1" +. auto/feature + + +# capabilities + +ngx_feature="capabilities" +ngx_feature_name="NGX_HAVE_CAPABILITIES" +ngx_feature_run=no +ngx_feature_incs="#include + #include " +ngx_feature_path= +ngx_feature_libs= +ngx_feature_test="struct __user_cap_data_struct data; + struct __user_cap_header_struct header; + + header.version = _LINUX_CAPABILITY_VERSION_1; + data.effective = CAP_TO_MASK(CAP_NET_RAW); + data.permitted = 0; + + (void) header; + (void) data; + (void) SYS_capset" . auto/feature @@ -146,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/solaris b/auto/os/solaris index d39df0b..1dcfe84 100644 --- a/auto/os/solaris +++ b/auto/os/solaris @@ -52,7 +52,7 @@ ngx_feature_run=no ngx_feature_incs="#include " ngx_feature_path= ngx_feature_libs= -ngx_feature_test="int n = port_create()" +ngx_feature_test="(void) port_create()" . auto/feature if [ $ngx_found = yes ]; then diff --git a/auto/os/win32 b/auto/os/win32 index 21a54ba..bce764b 100644 --- a/auto/os/win32 +++ b/auto/os/win32 @@ -9,21 +9,31 @@ CORE_INCS="$WIN32_INCS" CORE_DEPS="$WIN32_DEPS" CORE_SRCS="$WIN32_SRCS $IOCP_SRCS" OS_CONFIG="$WIN32_CONFIG" -CORE_LIBS="$CORE_LIBS advapi32.lib ws2_32.lib" NGX_ICONS="$NGX_WIN32_ICONS" SELECT_SRCS=$WIN32_SELECT_SRCS +POLL_SRCS=$WIN32_POLL_SRCS + +ngx_pic_opt= +ngx_binext=".exe" + +case "$NGX_CC_NAME" in + + 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" + MODULE_LINK="-shared -L $NGX_OBJS -lnginx" + ;; + + *) + CORE_LIBS="$CORE_LIBS advapi32.lib ws2_32.lib" + ;; + +esac EVENT_MODULES="$EVENT_MODULES $IOCP_MODULE" -EVENT_FOUND=YES +#EVENT_FOUND=YES -if [ $EVENT_SELECT = NO ]; then - CORE_SRCS="$CORE_SRCS $SELECT_SRCS" - EVENT_MODULES="$EVENT_MODULES $SELECT_MODULE" -fi +have=NGX_HAVE_INET6 . auto/have -if [ $NGX_IPV6 = YES ]; then - have=NGX_HAVE_INET6 . auto/have -fi - -have=NGX_HAVE_AIO . auto/have have=NGX_HAVE_IOCP . auto/have diff --git a/auto/sources b/auto/sources index 374ad66..46408ee 100644 --- a/auto/sources +++ b/auto/sources @@ -19,6 +19,7 @@ CORE_DEPS="src/core/nginx.h \ src/core/ngx_queue.h \ src/core/ngx_string.h \ src/core/ngx_parse.h \ + src/core/ngx_parse_time.h \ src/core/ngx_inet.h \ src/core/ngx_file.h \ src/core/ngx_crc.h \ @@ -28,15 +29,19 @@ CORE_DEPS="src/core/nginx.h \ src/core/ngx_sha1.h \ src/core/ngx_rbtree.h \ src/core/ngx_radix_tree.h \ + src/core/ngx_rwlock.h \ src/core/ngx_slab.h \ src/core/ngx_times.h \ src/core/ngx_shmtx.h \ src/core/ngx_connection.h \ src/core/ngx_cycle.h \ src/core/ngx_conf_file.h \ + src/core/ngx_module.h \ src/core/ngx_resolver.h \ src/core/ngx_open_file_cache.h \ - src/core/ngx_crypt.h" + src/core/ngx_crypt.h \ + src/core/ngx_proxy_protocol.h \ + src/core/ngx_syslog.h" CORE_SRCS="src/core/nginx.c \ @@ -50,11 +55,13 @@ CORE_SRCS="src/core/nginx.c \ src/core/ngx_output_chain.c \ src/core/ngx_string.c \ src/core/ngx_parse.c \ + src/core/ngx_parse_time.c \ src/core/ngx_inet.c \ src/core/ngx_file.c \ src/core/ngx_crc32.c \ src/core/ngx_murmurhash.c \ src/core/ngx_md5.c \ + src/core/ngx_sha1.c \ src/core/ngx_rbtree.c \ src/core/ngx_radix_tree.c \ src/core/ngx_slab.c \ @@ -63,39 +70,33 @@ CORE_SRCS="src/core/nginx.c \ src/core/ngx_connection.c \ src/core/ngx_cycle.c \ src/core/ngx_spinlock.c \ + src/core/ngx_rwlock.c \ src/core/ngx_cpuinfo.c \ src/core/ngx_conf_file.c \ + src/core/ngx_module.c \ src/core/ngx_resolver.c \ src/core/ngx_open_file_cache.c \ - src/core/ngx_crypt.c" - - -REGEX_MODULE=ngx_regex_module -REGEX_DEPS=src/core/ngx_regex.h -REGEX_SRCS=src/core/ngx_regex.c - - -OPENSSL_MODULE=ngx_openssl_module -OPENSSL_DEPS=src/event/ngx_event_openssl.h -OPENSSL_SRCS=src/event/ngx_event_openssl.c + src/core/ngx_crypt.c \ + src/core/ngx_proxy_protocol.c \ + src/core/ngx_syslog.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_busy_lock.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 \ src/event/ngx_event_posted.c \ - src/event/ngx_event_busy_lock.c \ src/event/ngx_event_accept.c \ + src/event/ngx_event_udp.c \ src/event/ngx_event_connect.c \ src/event/ngx_event_pipe.c" @@ -106,6 +107,7 @@ WIN32_SELECT_SRCS=src/event/modules/ngx_win32_select_module.c POLL_MODULE=ngx_poll_module POLL_SRCS=src/event/modules/ngx_poll_module.c +WIN32_POLL_SRCS=src/event/modules/ngx_win32_poll_module.c KQUEUE_MODULE=ngx_kqueue_module KQUEUE_SRCS=src/event/modules/ngx_kqueue_module.c @@ -119,19 +121,9 @@ EVENTPORT_SRCS=src/event/modules/ngx_eventport_module.c EPOLL_MODULE=ngx_epoll_module EPOLL_SRCS=src/event/modules/ngx_epoll_module.c -RTSIG_MODULE=ngx_rtsig_module -RTSIG_SRCS=src/event/modules/ngx_rtsig_module.c - IOCP_MODULE=ngx_iocp_module IOCP_SRCS=src/event/modules/ngx_iocp_module.c -AIO_MODULE=ngx_aio_module -AIO_SRCS="src/event/modules/ngx_aio_module.c \ - src/os/unix/ngx_aio_read.c \ - src/os/unix/ngx_aio_write.c \ - src/os/unix/ngx_aio_read_chain.c \ - src/os/unix/ngx_aio_write_chain.c" - FILE_AIO_SRCS="src/os/unix/ngx_file_aio_read.c" LINUX_AIO_SRCS="src/os/unix/ngx_linux_aio_read.c" @@ -153,6 +145,7 @@ UNIX_DEPS="$CORE_DEPS $EVENT_DEPS \ src/os/unix/ngx_socket.h \ src/os/unix/ngx_os.h \ src/os/unix/ngx_user.h \ + src/os/unix/ngx_dlopen.h \ src/os/unix/ngx_process_cycle.h" # add to UNIX_DEPS @@ -176,6 +169,8 @@ UNIX_SRCS="$CORE_SRCS $EVENT_SRCS \ src/os/unix/ngx_udp_recv.c \ src/os/unix/ngx_send.c \ src/os/unix/ngx_writev_chain.c \ + src/os/unix/ngx_udp_send.c \ + src/os/unix/ngx_udp_sendmsg_chain.c \ src/os/unix/ngx_channel.c \ src/os/unix/ngx_shmem.c \ src/os/unix/ngx_process.c \ @@ -184,18 +179,21 @@ UNIX_SRCS="$CORE_SRCS $EVENT_SRCS \ src/os/unix/ngx_setproctitle.c \ src/os/unix/ngx_posix_init.c \ src/os/unix/ngx_user.c \ + src/os/unix/ngx_dlopen.c \ src/os/unix/ngx_process_cycle.c" POSIX_DEPS=src/os/unix/ngx_posix_config.h +THREAD_POOL_MODULE=ngx_thread_pool_module +THREAD_POOL_DEPS=src/core/ngx_thread_pool.h +THREAD_POOL_SRCS="src/core/ngx_thread_pool.c + src/os/unix/ngx_thread_cond.c + src/os/unix/ngx_thread_mutex.c + src/os/unix/ngx_thread_id.c" + FREEBSD_DEPS="src/os/unix/ngx_freebsd_config.h src/os/unix/ngx_freebsd.h" FREEBSD_SRCS=src/os/unix/ngx_freebsd_init.c FREEBSD_SENDFILE_SRCS=src/os/unix/ngx_freebsd_sendfile_chain.c -FREEBSD_RFORK_DEPS="src/os/unix/ngx_freebsd_rfork_thread.h" -FREEBSD_RFORK_SRCS="src/os/unix/ngx_freebsd_rfork_thread.c" -FREEBSD_RFORK_THREAD_SRCS="src/os/unix/rfork_thread.S" - -PTHREAD_SRCS="src/os/unix/ngx_pthread_thread.c" LINUX_DEPS="src/os/unix/ngx_linux_config.h src/os/unix/ngx_linux.h" LINUX_SRCS=src/os/unix/ngx_linux_init.c @@ -227,6 +225,7 @@ WIN32_DEPS="$CORE_DEPS $EVENT_DEPS \ src/os/win32/ngx_socket.h \ src/os/win32/ngx_os.h \ src/os/win32/ngx_user.h \ + src/os/win32/ngx_dlopen.h \ src/os/win32/ngx_process_cycle.h" WIN32_CONFIG=src/os/win32/ngx_win32_config.h @@ -247,6 +246,7 @@ WIN32_SRCS="$CORE_SRCS $EVENT_SRCS \ src/os/win32/ngx_wsasend_chain.c \ src/os/win32/ngx_win32_init.c \ src/os/win32/ngx_user.c \ + src/os/win32/ngx_dlopen.c \ src/os/win32/ngx_event_log.c \ src/os/win32/ngx_process_cycle.c \ src/event/ngx_event_acceptex.c" @@ -255,272 +255,7 @@ NGX_WIN32_ICONS="src/os/win32/nginx.ico" NGX_WIN32_RC="src/os/win32/nginx.rc" -# the http modules that have their logging formats -# must be after ngx_http_log_module - -HTTP_MODULES="ngx_http_module \ - ngx_http_core_module \ - ngx_http_log_module \ - ngx_http_upstream_module" - -HTTP_WRITE_FILTER_MODULE="ngx_http_write_filter_module" -HTTP_HEADER_FILTER_MODULE="ngx_http_header_filter_module" - -HTTP_POSTPONE_FILTER_MODULE=ngx_http_postpone_filter_module -HTTP_COPY_FILTER_MODULE=ngx_http_copy_filter_module - -HTTP_CHUNKED_FILTER_MODULE=ngx_http_chunked_filter_module -HTTP_HEADERS_FILTER_MODULE=ngx_http_headers_filter_module - -HTTP_RANGE_HEADER_FILTER_MODULE=ngx_http_range_header_filter_module -HTTP_RANGE_BODY_FILTER_MODULE=ngx_http_range_body_filter_module - -HTTP_NOT_MODIFIED_FILTER_MODULE=ngx_http_not_modified_filter_module - -HTTP_STATIC_MODULE=ngx_http_static_module -HTTP_INDEX_MODULE=ngx_http_index_module - -HTTP_INCS="src/http src/http/modules" - -HTTP_DEPS="src/http/ngx_http.h \ - src/http/ngx_http_request.h \ - src/http/ngx_http_config.h \ - src/http/ngx_http_core_module.h \ - src/http/ngx_http_cache.h \ - src/http/ngx_http_variables.h \ - src/http/ngx_http_script.h \ - src/http/ngx_http_upstream.h \ - src/http/ngx_http_upstream_round_robin.h \ - src/http/ngx_http_busy_lock.h" - -HTTP_SRCS="src/http/ngx_http.c \ - src/http/ngx_http_core_module.c \ - src/http/ngx_http_special_response.c \ - src/http/ngx_http_request.c \ - src/http/ngx_http_parse.c \ - src/http/ngx_http_header_filter_module.c \ - src/http/ngx_http_write_filter_module.c \ - src/http/ngx_http_copy_filter_module.c \ - src/http/modules/ngx_http_log_module.c \ - src/http/ngx_http_request_body.c \ - src/http/ngx_http_variables.c \ - src/http/ngx_http_script.c \ - src/http/ngx_http_upstream.c \ - src/http/ngx_http_upstream_round_robin.c \ - src/http/ngx_http_parse_time.c \ - src/http/modules/ngx_http_static_module.c \ - src/http/modules/ngx_http_index_module.c \ - src/http/modules/ngx_http_chunked_filter_module.c \ - src/http/modules/ngx_http_range_filter_module.c \ - src/http/modules/ngx_http_headers_filter_module.c \ - src/http/modules/ngx_http_not_modified_filter_module.c" - -# STUB -HTTP_SRCS="$HTTP_SRCS src/http/ngx_http_busy_lock.c" - -HTTP_POSTPONE_FILTER_SRCS=src/http/ngx_http_postpone_filter_module.c - HTTP_FILE_CACHE_SRCS=src/http/ngx_http_file_cache.c - -HTTP_CHARSET_FILTER_MODULE=ngx_http_charset_filter_module -HTTP_CHARSET_SRCS=src/http/modules/ngx_http_charset_filter_module.c - - -HTTP_GZIP_FILTER_MODULE=ngx_http_gzip_filter_module -HTTP_GZIP_SRCS=src/http/modules/ngx_http_gzip_filter_module.c - - -HTTP_SSI_FILTER_MODULE=ngx_http_ssi_filter_module -HTTP_SSI_DEPS=src/http/modules/ngx_http_ssi_filter_module.h -HTTP_SSI_SRCS=src/http/modules/ngx_http_ssi_filter_module.c - - -HTTP_XSLT_FILTER_MODULE=ngx_http_xslt_filter_module -HTTP_XSLT_SRCS=src/http/modules/ngx_http_xslt_filter_module.c - - -HTTP_IMAGE_FILTER_MODULE=ngx_http_image_filter_module -HTTP_IMAGE_SRCS=src/http/modules/ngx_http_image_filter_module.c - - -HTTP_SUB_FILTER_MODULE=ngx_http_sub_filter_module -HTTP_SUB_SRCS=src/http/modules/ngx_http_sub_filter_module.c - - -HTTP_USERID_FILTER_MODULE=ngx_http_userid_filter_module -HTTP_USERID_SRCS=src/http/modules/ngx_http_userid_filter_module.c - - -HTTP_REALIP_MODULE=ngx_http_realip_module -HTTP_REALIP_SRCS=src/http/modules/ngx_http_realip_module.c - - -HTTP_ADDITION_FILTER_MODULE=ngx_http_addition_filter_module -HTTP_ADDITION_SRCS=src/http/modules/ngx_http_addition_filter_module.c - - -HTTP_DAV_MODULE=ngx_http_dav_module -HTTP_DAV_SRCS=src/http/modules/ngx_http_dav_module.c - - -HTTP_ACCESS_MODULE=ngx_http_access_module -HTTP_ACCESS_SRCS=src/http/modules/ngx_http_access_module.c - - -HTTP_AUTH_BASIC_MODULE=ngx_http_auth_basic_module -HTTP_AUTH_BASIC_SRCS=src/http/modules/ngx_http_auth_basic_module.c - - -HTTP_AUTOINDEX_MODULE=ngx_http_autoindex_module -HTTP_AUTOINDEX_SRCS=src/http/modules/ngx_http_autoindex_module.c - - -HTTP_RANDOM_INDEX_MODULE=ngx_http_random_index_module -HTTP_RANDOM_INDEX_SRCS=src/http/modules/ngx_http_random_index_module.c - - -HTTP_STATUS_MODULE=ngx_http_status_module -HTTP_STATUS_SRCS=src/http/modules/ngx_http_status_module.c - - -HTTP_GEO_MODULE=ngx_http_geo_module -HTTP_GEO_SRCS=src/http/modules/ngx_http_geo_module.c - - -HTTP_GEOIP_MODULE=ngx_http_geoip_module -HTTP_GEOIP_SRCS=src/http/modules/ngx_http_geoip_module.c - - -HTTP_MAP_MODULE=ngx_http_map_module -HTTP_MAP_SRCS=src/http/modules/ngx_http_map_module.c - - -HTTP_SPLIT_CLIENTS_MODULE=ngx_http_split_clients_module -HTTP_SPLIT_CLIENTS_SRCS=src/http/modules/ngx_http_split_clients_module.c - - -HTTP_REFERER_MODULE=ngx_http_referer_module -HTTP_REFERER_SRCS=src/http/modules/ngx_http_referer_module.c - - -HTTP_REWRITE_MODULE=ngx_http_rewrite_module -HTTP_REWRITE_SRCS=src/http/modules/ngx_http_rewrite_module.c - - -HTTP_SSL_MODULE=ngx_http_ssl_module -HTTP_SSL_DEPS=src/http/modules/ngx_http_ssl_module.h -HTTP_SSL_SRCS=src/http/modules/ngx_http_ssl_module.c - - -HTTP_PROXY_MODULE=ngx_http_proxy_module -HTTP_PROXY_SRCS=src/http/modules/ngx_http_proxy_module.c - - -HTTP_FASTCGI_MODULE=ngx_http_fastcgi_module -HTTP_FASTCGI_SRCS=src/http/modules/ngx_http_fastcgi_module.c - - -HTTP_UWSGI_MODULE=ngx_http_uwsgi_module -HTTP_UWSGI_SRCS=src/http/modules/ngx_http_uwsgi_module.c - - -HTTP_SCGI_MODULE=ngx_http_scgi_module -HTTP_SCGI_SRCS=src/http/modules/ngx_http_scgi_module.c - - -HTTP_PERL_MODULE=ngx_http_perl_module -HTTP_PERL_INCS=src/http/modules/perl -HTTP_PERL_DEPS=src/http/modules/perl/ngx_http_perl_module.h -HTTP_PERL_SRCS=src/http/modules/perl/ngx_http_perl_module.c - - -HTTP_MEMCACHED_MODULE=ngx_http_memcached_module -HTTP_MEMCACHED_SRCS=src/http/modules/ngx_http_memcached_module.c - - -HTTP_LIMIT_CONN_MODULE=ngx_http_limit_conn_module -HTTP_LIMIT_CONN_SRCS=src/http/modules/ngx_http_limit_conn_module.c - - -HTTP_LIMIT_REQ_MODULE=ngx_http_limit_req_module -HTTP_LIMIT_REQ_SRCS=src/http/modules/ngx_http_limit_req_module.c - - -HTTP_EMPTY_GIF_MODULE=ngx_http_empty_gif_module -HTTP_EMPTY_GIF_SRCS=src/http/modules/ngx_http_empty_gif_module.c - - -HTTP_BROWSER_MODULE=ngx_http_browser_module -HTTP_BROWSER_SRCS=src/http/modules/ngx_http_browser_module.c - - -HTTP_SECURE_LINK_MODULE=ngx_http_secure_link_module -HTTP_SECURE_LINK_SRCS=src/http/modules/ngx_http_secure_link_module.c - - -HTTP_DEGRADATION_MODULE=ngx_http_degradation_module -HTTP_DEGRADATION_SRCS=src/http/modules/ngx_http_degradation_module.c - - -HTTP_FLV_MODULE=ngx_http_flv_module -HTTP_FLV_SRCS=src/http/modules/ngx_http_flv_module.c - - -HTTP_MP4_MODULE=ngx_http_mp4_module -HTTP_MP4_SRCS=src/http/modules/ngx_http_mp4_module.c - - -HTTP_GZIP_STATIC_MODULE=ngx_http_gzip_static_module -HTTP_GZIP_STATIC_SRCS=src/http/modules/ngx_http_gzip_static_module.c - - -HTTP_UPSTREAM_IP_HASH_MODULE=ngx_http_upstream_ip_hash_module -HTTP_UPSTREAM_IP_HASH_SRCS=src/http/modules/ngx_http_upstream_ip_hash_module.c - - -HTTP_UPSTREAM_KEEPALIVE_MODULE=ngx_http_upstream_keepalive_module -HTTP_UPSTREAM_KEEPALIVE_SRCS=" \ - src/http/modules/ngx_http_upstream_keepalive_module.c" - - -MAIL_INCS="src/mail" - -MAIL_DEPS="src/mail/ngx_mail.h" - -MAIL_MODULES="ngx_mail_module ngx_mail_core_module" - -MAIL_SRCS="src/mail/ngx_mail.c \ - src/mail/ngx_mail_core_module.c \ - src/mail/ngx_mail_handler.c \ - src/mail/ngx_mail_parse.c" - -MAIL_POP3_MODULE="ngx_mail_pop3_module" -MAIL_POP3_DEPS="src/mail/ngx_mail_pop3_module.h" -MAIL_POP3_SRCS="src/mail/ngx_mail_pop3_module.c \ - src/mail/ngx_mail_pop3_handler.c" - -MAIL_IMAP_MODULE="ngx_mail_imap_module" -MAIL_IMAP_DEPS="src/mail/ngx_mail_imap_module.h" -MAIL_IMAP_SRCS="src/mail/ngx_mail_imap_module.c \ - src/mail/ngx_mail_imap_handler.c" - -MAIL_SMTP_MODULE="ngx_mail_smtp_module" -MAIL_SMTP_DEPS="src/mail/ngx_mail_smtp_module.h" -MAIL_SMTP_SRCS="src/mail/ngx_mail_smtp_module.c \ - src/mail/ngx_mail_smtp_handler.c" - -MAIL_SSL_MODULE="ngx_mail_ssl_module" -MAIL_SSL_DEPS="src/mail/ngx_mail_ssl_module.h" -MAIL_SSL_SRCS="src/mail/ngx_mail_ssl_module.c" - -MAIL_AUTH_HTTP_MODULE="ngx_mail_auth_http_module" -MAIL_AUTH_HTTP_SRCS="src/mail/ngx_mail_auth_http_module.c" - -MAIL_PROXY_MODULE="ngx_mail_proxy_module" -MAIL_PROXY_SRCS="src/mail/ngx_mail_proxy_module.c" - -NGX_GOOGLE_PERFTOOLS_MODULE=ngx_google_perftools_module -NGX_GOOGLE_PERFTOOLS_SRCS=src/misc/ngx_google_perftools_module.c - -NGX_CPP_TEST_SRCS=src/misc/ngx_cpp_test_module.cpp +HTTP_HUFF_SRCS="src/http/ngx_http_huff_decode.c + src/http/ngx_http_huff_encode.c" diff --git a/auto/summary b/auto/summary index dcebec9..b3c07ee 100644 --- a/auto/summary +++ b/auto/summary @@ -3,43 +3,22 @@ # Copyright (C) Nginx, Inc. -### STUB - -if [ $USE_THREADS != NO ]; then - -cat << END - -$0: error: the threads support is broken now. - -END - exit 1 - fi - -### - - echo echo "Configuration summary" -#case $USE_THREADS in -# rfork) echo " + using rfork()ed threads" ;; -# pthreads) echo " + using libpthread threads library" ;; -# libthr) echo " + using FreeBSD libthr threads library" ;; -# libc_r) echo " + using FreeBSD libc_r threads library" ;; -# linuxthreads) echo " + using FreeBSD LinuxThreads port library" ;; -# NO) echo " + threads are not used" ;; -# *) echo " + using lib$USE_THREADS threads library" ;; -#esac +if [ $USE_THREADS = YES ]; then + echo " + using threads" +fi if [ $USE_PCRE = DISABLED ]; then echo " + PCRE library is disabled" else case $PCRE in - YES) echo " + using system PCRE library" ;; + YES) echo " + using system $PCRE_LIBRARY library" ;; NONE) echo " + PCRE library is not used" ;; - *) echo " + using PCRE library: $PCRE" ;; + *) echo " + using $PCRE_LIBRARY library: $PCRE" ;; esac fi @@ -49,20 +28,6 @@ case $OPENSSL in *) echo " + using OpenSSL library: $OPENSSL" ;; esac -case $MD5 in - YES) echo " + md5: using $MD5_LIB library" ;; - NONE) echo " + md5 library is not used" ;; - NO) echo " + using builtin md5 code" ;; - *) echo " + using md5 library: $MD5" ;; -esac - -case $SHA1 in - YES) echo " + sha1: using $SHA1_LIB library" ;; - NONE) echo " + sha1 library is not used" ;; - NO) echo " + sha1 library is not found" ;; - *) echo " + using sha1 library: $SHA1" ;; -esac - case $ZLIB in YES) echo " + using system zlib library" ;; NONE) echo " + zlib library is not used" ;; @@ -81,6 +46,7 @@ echo cat << END nginx path prefix: "$NGX_PREFIX" nginx binary file: "$NGX_SBIN_PATH" + nginx modules path: "$NGX_MODULES_PATH" nginx configuration prefix: "$NGX_CONF_PREFIX" nginx configuration file: "$NGX_CONF_PATH" nginx pid file: "$NGX_PID_PATH" diff --git a/auto/threads b/auto/threads new file mode 100644 index 0000000..943127f --- /dev/null +++ b/auto/threads @@ -0,0 +1,21 @@ + +# Copyright (C) Nginx, Inc. + + +if [ $USE_THREADS = YES ]; then + + if [ "$NGX_PLATFORM" = win32 ]; then + cat << END + +$0: --with-threads is not supported on Windows + +END + exit 1 + fi + + have=NGX_THREADS . auto/have + CORE_DEPS="$CORE_DEPS $THREAD_POOL_DEPS" + CORE_SRCS="$CORE_SRCS $THREAD_POOL_SRCS" + CORE_LIBS="$CORE_LIBS -lpthread" + NGX_LIBPTHREAD="-lpthread" +fi diff --git a/auto/types/sizeof b/auto/types/sizeof index e1d405c..480d8cf 100644 --- a/auto/types/sizeof +++ b/auto/types/sizeof @@ -25,7 +25,7 @@ $NGX_INCLUDE_UNISTD_H $NGX_INCLUDE_INTTYPES_H $NGX_INCLUDE_AUTO_CONFIG_H -int main() { +int main(void) { printf("%d", (int) sizeof($ngx_type)); return 0; } @@ -45,27 +45,14 @@ if [ -x $NGX_AUTOTEST ]; then fi -rm -f $NGX_AUTOTEST - - case $ngx_size in 4) - if [ "$ngx_type"="long" ]; then - ngx_max_value=2147483647L - else - ngx_max_value=2147483647 - fi - + ngx_max_value=2147483647 ngx_max_len='(sizeof("-2147483648") - 1)' ;; 8) - if [ "$ngx_type"="long long" ]; then - ngx_max_value=9223372036854775807LL - else - ngx_max_value=9223372036854775807L - fi - + ngx_max_value=9223372036854775807LL ngx_max_len='(sizeof("-9223372036854775808") - 1)' ;; @@ -79,6 +66,11 @@ case $ngx_size in echo $ngx_test >> $NGX_AUTOCONF_ERR echo "----------" >> $NGX_AUTOCONF_ERR + rm -rf $NGX_AUTOTEST* + exit 1 esac + +rm -rf $NGX_AUTOTEST* + diff --git a/auto/types/typedef b/auto/types/typedef index d812293..d54c289 100644 --- a/auto/types/typedef +++ b/auto/types/typedef @@ -27,7 +27,7 @@ do #include $NGX_INCLUDE_INTTYPES_H -int main() { +int main(void) { $ngx_try i = 0; return (int) i; } @@ -49,18 +49,23 @@ END fi fi - rm -f $NGX_AUTOTEST - if [ $ngx_found = no ]; then - echo $ngx_n " $ngx_try not found$ngx_c" + if [ $ngx_try = $ngx_type ]; then + echo $ngx_n " $ngx_try not found$ngx_c" + else + echo $ngx_n ", $ngx_try not found$ngx_c" + fi echo "----------" >> $NGX_AUTOCONF_ERR cat $NGX_AUTOTEST.c >> $NGX_AUTOCONF_ERR echo "----------" >> $NGX_AUTOCONF_ERR echo $ngx_test >> $NGX_AUTOCONF_ERR echo "----------" >> $NGX_AUTOCONF_ERR + fi - else + rm -rf $NGX_AUTOTEST* + + if [ $ngx_found != no ]; then break fi done diff --git a/auto/types/uintptr_t b/auto/types/uintptr_t index 2f19080..a33d6d0 100644 --- a/auto/types/uintptr_t +++ b/auto/types/uintptr_t @@ -4,17 +4,22 @@ echo $ngx_n "checking for uintptr_t ...$ngx_c" -echo >> $NGX_AUTOCONF_ERR -echo "checking for uintptr_t" >> $NGX_AUTOCONF_ERR + +cat << END >> $NGX_AUTOCONF_ERR + +---------------------------------------- +checking for uintptr_t + +END found=no cat << END > $NGX_AUTOTEST.c #include -$NGX_INTTYPES_H +$NGX_INCLUDE_INTTYPES_H -int main() { +int main(void) { uintptr_t i = 0; return (int) i; } @@ -33,7 +38,7 @@ else echo $ngx_n " uintptr_t not found" $ngx_c fi -rm $NGX_AUTOTEST* +rm -rf $NGX_AUTOTEST* if [ $found = no ]; then diff --git a/auto/unix b/auto/unix old mode 100755 new mode 100644 index 783219e..f29e69c --- a/auto/unix +++ b/auto/unix @@ -75,7 +75,7 @@ if test -z "$NGX_KQUEUE_CHECKED"; then ngx_feature_incs="#include " ngx_feature_path= ngx_feature_libs= - ngx_feature_test="int kq; kq = kqueue()" + ngx_feature_test="(void) kqueue()" . auto/feature if [ $ngx_found = yes ]; then @@ -92,7 +92,8 @@ if test -z "$NGX_KQUEUE_CHECKED"; then ngx_feature_path= ngx_feature_libs= ngx_feature_test="struct kevent kev; - kev.fflags = NOTE_LOWAT;" + kev.fflags = NOTE_LOWAT; + (void) kev" . auto/feature @@ -255,22 +256,23 @@ ngx_feature_test="struct statvfs fs; ngx_feature="dlopen()" -ngx_feature_name= +ngx_feature_name="NGX_HAVE_DLOPEN" ngx_feature_run=no ngx_feature_incs="#include " ngx_feature_path= ngx_feature_libs= -ngx_feature_test="dlopen(NULL, 0)" +ngx_feature_test="dlopen(NULL, RTLD_NOW | RTLD_GLOBAL); dlsym(NULL, \"\")" . auto/feature -if [ $ngx_found != yes ]; then +if [ $ngx_found = no ]; then ngx_feature="dlopen() in libdl" ngx_feature_libs="-ldl" . auto/feature if [ $ngx_found = yes ]; then + CORE_LIBS="$CORE_LIBS -ldl" NGX_LIBDL="-ldl" fi fi @@ -286,7 +288,7 @@ ngx_feature_test="sched_yield()" . auto/feature -if [ $ngx_found != yes ]; then +if [ $ngx_found = no ]; then ngx_feature="sched_yield() in librt" ngx_feature_libs="-lrt" @@ -298,13 +300,35 @@ if [ $ngx_found != yes ]; then fi +ngx_feature="sched_setaffinity()" +ngx_feature_name="NGX_HAVE_SCHED_SETAFFINITY" +ngx_feature_run=no +ngx_feature_incs="#include " +ngx_feature_path= +ngx_feature_libs= +ngx_feature_test="cpu_set_t mask; + CPU_ZERO(&mask); + sched_setaffinity(0, sizeof(cpu_set_t), &mask)" +. auto/feature + + ngx_feature="SO_SETFIB" ngx_feature_name="NGX_HAVE_SETFIB" ngx_feature_run=no ngx_feature_incs="#include " ngx_feature_path= ngx_feature_libs= -ngx_feature_test="setsockopt(0, SOL_SOCKET, SO_SETFIB, NULL, 4)" +ngx_feature_test="setsockopt(0, SOL_SOCKET, SO_SETFIB, NULL, 0)" +. auto/feature + + +ngx_feature="SO_REUSEPORT" +ngx_feature_name="NGX_HAVE_REUSEPORT" +ngx_feature_run=no +ngx_feature_incs="#include " +ngx_feature_path= +ngx_feature_libs= +ngx_feature_test="setsockopt(0, SOL_SOCKET, SO_REUSEPORT, NULL, 0)" . auto/feature @@ -318,6 +342,160 @@ ngx_feature_test="setsockopt(0, SOL_SOCKET, SO_ACCEPTFILTER, NULL, 0)" . auto/feature +# OpenBSD bind to any address for transparent proxying + +ngx_feature="SO_BINDANY" +ngx_feature_name="NGX_HAVE_TRANSPARENT_PROXY" +ngx_feature_run=no +ngx_feature_incs="#include " +ngx_feature_path= +ngx_feature_libs= +ngx_feature_test="setsockopt(0, SOL_SOCKET, SO_BINDANY, NULL, 0)" +. auto/feature + + +# Linux transparent proxying + +ngx_feature="IP_TRANSPARENT" +ngx_feature_name="NGX_HAVE_TRANSPARENT_PROXY" +ngx_feature_run=no +ngx_feature_incs="#include + #include " +ngx_feature_path= +ngx_feature_libs= +ngx_feature_test="setsockopt(0, IPPROTO_IP, IP_TRANSPARENT, NULL, 0)" +. auto/feature + + +# FreeBSD bind to any address for transparent proxying + +ngx_feature="IP_BINDANY" +ngx_feature_name="NGX_HAVE_TRANSPARENT_PROXY" +ngx_feature_run=no +ngx_feature_incs="#include + #include " +ngx_feature_path= +ngx_feature_libs= +ngx_feature_test="setsockopt(0, IPPROTO_IP, IP_BINDANY, NULL, 0)" +. auto/feature + + +# Linux IP_BIND_ADDRESS_NO_PORT + +ngx_feature="IP_BIND_ADDRESS_NO_PORT" +ngx_feature_name="NGX_HAVE_IP_BIND_ADDRESS_NO_PORT" +ngx_feature_run=no +ngx_feature_incs="#include + #include " +ngx_feature_path= +ngx_feature_libs= +ngx_feature_test="setsockopt(0, IPPROTO_IP, IP_BIND_ADDRESS_NO_PORT, NULL, 0)" +. auto/feature + + +# BSD way to get IPv4 datagram destination address + +ngx_feature="IP_RECVDSTADDR" +ngx_feature_name="NGX_HAVE_IP_RECVDSTADDR" +ngx_feature_run=no +ngx_feature_incs="#include + #include " +ngx_feature_path= +ngx_feature_libs= +ngx_feature_test="setsockopt(0, IPPROTO_IP, IP_RECVDSTADDR, NULL, 0)" +. auto/feature + + +# BSD way to set IPv4 datagram source address + +ngx_feature="IP_SENDSRCADDR" +ngx_feature_name="NGX_HAVE_IP_SENDSRCADDR" +ngx_feature_run=no +ngx_feature_incs="#include + #include " +ngx_feature_path= +ngx_feature_libs= +ngx_feature_test="setsockopt(0, IPPROTO_IP, IP_SENDSRCADDR, NULL, 0)" +. auto/feature + + +# Linux way to get IPv4 datagram destination address + +ngx_feature="IP_PKTINFO" +ngx_feature_name="NGX_HAVE_IP_PKTINFO" +ngx_feature_run=no +ngx_feature_incs="#include + #include " +ngx_feature_path= +ngx_feature_libs= +ngx_feature_test="struct in_pktinfo pkt; + pkt.ipi_spec_dst.s_addr = INADDR_ANY; + (void) pkt; + setsockopt(0, IPPROTO_IP, IP_PKTINFO, NULL, 0)" +. auto/feature + + +# RFC 3542 way to get IPv6 datagram destination address + +ngx_feature="IPV6_RECVPKTINFO" +ngx_feature_name="NGX_HAVE_IPV6_RECVPKTINFO" +ngx_feature_run=no +ngx_feature_incs="#include + #include " +ngx_feature_path= +ngx_feature_libs= +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 @@ -330,7 +508,7 @@ ngx_feature_test="setsockopt(0, IPPROTO_TCP, TCP_DEFER_ACCEPT, NULL, 0)" . auto/feature -ngx_feature="TCP_KEEPIDLE, TCP_KEEPINTVL, TCP_KEEPCNT" +ngx_feature="TCP_KEEPIDLE" ngx_feature_name="NGX_HAVE_KEEPALIVE_TUNABLE" ngx_feature_run=no ngx_feature_incs="#include @@ -344,6 +522,18 @@ ngx_feature_test="setsockopt(0, IPPROTO_TCP, TCP_KEEPIDLE, NULL, 0); . auto/feature +ngx_feature="TCP_FASTOPEN" +ngx_feature_name="NGX_HAVE_TCP_FASTOPEN" +ngx_feature_run=no +ngx_feature_incs="#include + #include + #include " +ngx_feature_path= +ngx_feature_libs= +ngx_feature_test="setsockopt(0, IPPROTO_TCP, TCP_FASTOPEN, NULL, 0)" +. auto/feature + + ngx_feature="TCP_INFO" ngx_feature_name="NGX_HAVE_TCP_INFO" ngx_feature_run=no @@ -379,43 +569,66 @@ if [ $NGX_FILE_AIO = YES ]; then ngx_feature_incs="#include " ngx_feature_path= ngx_feature_libs= - ngx_feature_test="int n; struct aiocb iocb; + ngx_feature_test="struct aiocb iocb; iocb.aio_sigevent.sigev_notify = SIGEV_KEVENT; - n = aio_read(&iocb)" + (void) aio_read(&iocb)" . auto/feature if [ $ngx_found = yes ]; then CORE_SRCS="$CORE_SRCS $FILE_AIO_SRCS" + fi - elif [ $ngx_found = no ]; then + if [ $ngx_found = no ]; then ngx_feature="Linux AIO support" ngx_feature_name="NGX_HAVE_FILE_AIO" ngx_feature_run=no ngx_feature_incs="#include - #include " + #include " ngx_feature_path= ngx_feature_libs= - ngx_feature_test="int n = SYS_eventfd; - struct iocb iocb; + ngx_feature_test="struct iocb iocb; iocb.aio_lio_opcode = IOCB_CMD_PREAD; iocb.aio_flags = IOCB_FLAG_RESFD; - iocb.aio_resfd = -1;" + iocb.aio_resfd = -1; + (void) iocb; + (void) eventfd(0, 0)" + . auto/feature + + if [ $ngx_found = yes ]; then + have=NGX_HAVE_EVENTFD . auto/have + have=NGX_HAVE_SYS_EVENTFD_H . auto/have + CORE_SRCS="$CORE_SRCS $LINUX_AIO_SRCS" + fi + fi + + if [ $ngx_found = no ]; then + + ngx_feature="Linux AIO support (SYS_eventfd)" + ngx_feature_incs="#include + #include " + ngx_feature_test="struct iocb iocb; + iocb.aio_lio_opcode = IOCB_CMD_PREAD; + iocb.aio_flags = IOCB_FLAG_RESFD; + iocb.aio_resfd = -1; + (void) iocb; + (void) SYS_eventfd" . auto/feature if [ $ngx_found = yes ]; then have=NGX_HAVE_EVENTFD . auto/have CORE_SRCS="$CORE_SRCS $LINUX_AIO_SRCS" + fi + fi - else - cat << END + if [ $ngx_found = no ]; then + cat << END $0: no supported file AIO was found Currently file AIO is supported on FreeBSD 4.3+ and Linux 2.6.22+ only END - exit 1 - fi + exit 1 fi fi @@ -439,15 +652,9 @@ ngx_param=NGX_PTR_SIZE; ngx_value=$ngx_size; . auto/types/value # POSIX types -case "$NGX_AUTO_CONFIG_H" in - /*) - NGX_INCLUDE_AUTO_CONFIG_H="#include \"$NGX_AUTO_CONFIG_H\"" - ;; - *) - NGX_INCLUDE_AUTO_CONFIG_H="#include \"../$NGX_AUTO_CONFIG_H\"" - ;; -esac +NGX_INCLUDE_AUTO_CONFIG_H="#include \"ngx_auto_config.h\"" +ngx_type="uint32_t"; ngx_types="u_int32_t"; . auto/types/typedef ngx_type="uint64_t"; ngx_types="u_int64_t"; . auto/types/typedef ngx_type="sig_atomic_t"; ngx_types="int"; . auto/types/typedef @@ -456,7 +663,7 @@ ngx_param=NGX_SIG_ATOMIC_T_SIZE; ngx_value=$ngx_size; . auto/types/value ngx_type="socklen_t"; ngx_types="int"; . auto/types/typedef -ngx_type="in_addr_t"; ngx_types="uint32_t"; . auto/types/typedef +ngx_type="in_addr_t"; ngx_types="uint32_t u_int32_t"; . auto/types/typedef ngx_type="in_port_t"; ngx_types="u_short"; . auto/types/typedef @@ -464,7 +671,7 @@ ngx_type="rlim_t"; ngx_types="int"; . auto/types/typedef . auto/types/uintptr_t -. auto/endianess +. auto/endianness ngx_type="size_t"; . auto/types/sizeof ngx_param=NGX_MAX_SIZE_T_VALUE; ngx_value=$ngx_max_value; . auto/types/value @@ -477,24 +684,24 @@ ngx_param=NGX_OFF_T_LEN; ngx_value=$ngx_max_len; . auto/types/value ngx_type="time_t"; . auto/types/sizeof ngx_param=NGX_TIME_T_SIZE; ngx_value=$ngx_size; . auto/types/value ngx_param=NGX_TIME_T_LEN; ngx_value=$ngx_max_len; . auto/types/value +ngx_param=NGX_MAX_TIME_T_VALUE; ngx_value=$ngx_max_value; . auto/types/value # syscalls, libc calls and some features -if [ $NGX_IPV6 = YES ]; then - ngx_feature="AF_INET6" - ngx_feature_name="NGX_HAVE_INET6" - ngx_feature_run=no - ngx_feature_incs="#include - #include - #include " - ngx_feature_path= - ngx_feature_libs= - ngx_feature_test="struct sockaddr_in6 sin6; - sin6.sin6_family = AF_INET6;" - . auto/feature -fi +ngx_feature="AF_INET6" +ngx_feature_name="NGX_HAVE_INET6" +ngx_feature_run=no +ngx_feature_incs="#include + #include + #include " +ngx_feature_path= +ngx_feature_libs= +ngx_feature_test="struct sockaddr_in6 sin6; + sin6.sin6_family = AF_INET6; + (void) sin6" +. auto/feature ngx_feature="setproctitle()" @@ -529,17 +736,49 @@ ngx_feature_test="char buf[1]; ssize_t n; n = pwrite(1, buf, 1, 0); . auto/feature -ngx_feature="sys_nerr" -ngx_feature_name="NGX_SYS_NERR" -ngx_feature_run=value -ngx_feature_incs='#include - #include ' +# pwritev() was introduced in FreeBSD 6 and Linux 2.6.30, glibc 2.10 + +ngx_feature="pwritev()" +ngx_feature_name="NGX_HAVE_PWRITEV" +ngx_feature_run=no +ngx_feature_incs='#include ' ngx_feature_path= ngx_feature_libs= -ngx_feature_test='printf("%d", sys_nerr);' +ngx_feature_test="char buf[1]; struct iovec vec[1]; ssize_t n; + vec[0].iov_base = buf; + vec[0].iov_len = 1; + n = pwritev(1, vec, 1, 0); + if (n == -1) return 1" . auto/feature +# strerrordesc_np(), introduced in glibc 2.32 + +ngx_feature="strerrordesc_np()" +ngx_feature_name="NGX_HAVE_STRERRORDESC_NP" +ngx_feature_run=no +ngx_feature_incs='#include ' +ngx_feature_path= +ngx_feature_libs= +ngx_feature_test="char *p; p = strerrordesc_np(0); + if (p == NULL) return 1" +. auto/feature + + +if [ $ngx_found = no ]; then + + ngx_feature="sys_nerr" + ngx_feature_name="NGX_SYS_NERR" + ngx_feature_run=value + ngx_feature_incs='#include + #include ' + ngx_feature_path= + ngx_feature_libs= + ngx_feature_test='printf("%d", sys_nerr);' + . auto/feature +fi + + if [ $ngx_found = no ]; then # Cygiwn defines _sys_nerr @@ -555,34 +794,6 @@ if [ $ngx_found = no ]; then fi -if [ $ngx_found = no ]; then - - # Solaris has no sys_nerr - ngx_feature='maximum errno' - ngx_feature_name=NGX_SYS_NERR - ngx_feature_run=value - ngx_feature_incs='#include - #include - #include ' - ngx_feature_path= - ngx_feature_libs= - ngx_feature_test='int n; - char *p; - for (n = 1; n < 1000; n++) { - errno = 0; - p = strerror(n); - if (errno == EINVAL - || p == NULL - || strncmp(p, "Unknown error", 13) == 0) - { - break; - } - } - printf("%d", n);' - . auto/feature -fi - - ngx_feature="localtime_r()" ngx_feature_name="NGX_HAVE_LOCALTIME_R" ngx_feature_run=no @@ -593,6 +804,30 @@ ngx_feature_test="struct tm t; time_t c=0; localtime_r(&c, &t)" . auto/feature +ngx_feature="clock_gettime(CLOCK_MONOTONIC)" +ngx_feature_name="NGX_HAVE_CLOCK_MONOTONIC" +ngx_feature_run=no +ngx_feature_incs="#include " +ngx_feature_path= +ngx_feature_libs= +ngx_feature_test="struct timespec ts; clock_gettime(CLOCK_MONOTONIC, &ts)" +. auto/feature + + +if [ $ngx_found = no ]; then + + # Linux before glibc 2.17, notably CentOS 6 + + ngx_feature="clock_gettime(CLOCK_MONOTONIC) in librt" + ngx_feature_libs="-lrt" + . auto/feature + + if [ $ngx_found = yes ]; then + CORE_LIBS="$CORE_LIBS -lrt" + fi +fi + + ngx_feature="posix_memalign()" ngx_feature_name="NGX_HAVE_POSIX_MEMALIGN" ngx_feature_run=no @@ -679,6 +914,7 @@ if [ $ngx_found = no ]; then if [ $ngx_found = yes ]; then CORE_LIBS="$CORE_LIBS -lpthread" + NGX_LIBPTHREAD="-lpthread" fi fi @@ -720,6 +956,18 @@ ngx_feature_test="int i = FIONBIO; printf(\"%d\", i)" . auto/feature +ngx_feature="ioctl(FIONREAD)" +ngx_feature_name="NGX_HAVE_FIONREAD" +ngx_feature_run=no +ngx_feature_incs="#include + #include + $NGX_INCLUDE_SYS_FILIO_H" +ngx_feature_path= +ngx_feature_libs= +ngx_feature_test="int i = FIONREAD; printf(\"%d\", i)" +. auto/feature + + ngx_feature="struct tm.tm_gmtoff" ngx_feature_name="NGX_HAVE_GMTOFF" ngx_feature_run=no @@ -766,6 +1014,16 @@ ngx_feature_test="sysconf(_SC_NPROCESSORS_ONLN)" . auto/feature +ngx_feature="sysconf(_SC_LEVEL1_DCACHE_LINESIZE)" +ngx_feature_name="NGX_HAVE_LEVEL1_DCACHE_LINESIZE" +ngx_feature_run=no +ngx_feature_incs= +ngx_feature_path= +ngx_feature_libs= +ngx_feature_test="sysconf(_SC_LEVEL1_DCACHE_LINESIZE)" +. auto/feature + + ngx_feature="openat(), fstatat()" ngx_feature_name="NGX_HAVE_OPENAT" ngx_feature_run=no @@ -778,3 +1036,17 @@ ngx_feature_test="struct stat sb; openat(AT_FDCWD, \".\", O_RDONLY|O_NOFOLLOW); fstatat(AT_FDCWD, \".\", &sb, AT_SYMLINK_NOFOLLOW);" . auto/feature + + +ngx_feature="getaddrinfo()" +ngx_feature_name="NGX_HAVE_GETADDRINFO" +ngx_feature_run=no +ngx_feature_incs="#include + #include + #include " +ngx_feature_path= +ngx_feature_libs= +ngx_feature_test='struct addrinfo *res; + if (getaddrinfo("localhost", NULL, NULL, &res) != 0) return 1; + freeaddrinfo(res)' +. auto/feature diff --git a/conf/fastcgi.conf b/conf/fastcgi.conf index ac9ff92..091738c 100644 --- a/conf/fastcgi.conf +++ b/conf/fastcgi.conf @@ -10,6 +10,7 @@ fastcgi_param REQUEST_URI $request_uri; fastcgi_param DOCUMENT_URI $document_uri; fastcgi_param DOCUMENT_ROOT $document_root; fastcgi_param SERVER_PROTOCOL $server_protocol; +fastcgi_param REQUEST_SCHEME $scheme; fastcgi_param HTTPS $https if_not_empty; fastcgi_param GATEWAY_INTERFACE CGI/1.1; diff --git a/conf/fastcgi_params b/conf/fastcgi_params index 71e2c2e..28decb9 100644 --- a/conf/fastcgi_params +++ b/conf/fastcgi_params @@ -9,6 +9,7 @@ fastcgi_param REQUEST_URI $request_uri; fastcgi_param DOCUMENT_URI $document_uri; fastcgi_param DOCUMENT_ROOT $document_root; fastcgi_param SERVER_PROTOCOL $server_protocol; +fastcgi_param REQUEST_SCHEME $scheme; fastcgi_param HTTPS $https if_not_empty; fastcgi_param GATEWAY_INTERFACE CGI/1.1; diff --git a/conf/mime.types b/conf/mime.types index 8a218b2..1c00d70 100644 --- a/conf/mime.types +++ b/conf/mime.types @@ -1,80 +1,99 @@ types { - text/html html htm shtml; - text/css css; - text/xml xml; - image/gif gif; - image/jpeg jpeg jpg; - application/x-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/png png; - image/tiff tif tiff; - image/vnd.wap.wbmp wbmp; - image/x-icon ico; - image/x-jng jng; - image/x-ms-bmp bmp; - image/svg+xml svg svgz; - image/webp webp; + 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; - application/java-archive jar war ear; - application/mac-binhex40 hqx; - application/msword doc; - application/pdf pdf; - application/postscript ps eps ai; - application/rtf rtf; - application/vnd.ms-excel xls; - application/vnd.ms-powerpoint ppt; - application/vnd.wap.wmlc wmlc; - application/vnd.google-earth.kml+xml kml; - application/vnd.google-earth.kmz kmz; - 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/zip zip; + font/woff woff; + font/woff2 woff2; - application/octet-stream bin exe dll; - application/octet-stream deb; - application/octet-stream dmg; - application/octet-stream eot; - application/octet-stream iso img; - application/octet-stream msi msp msm; + 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; - audio/midi mid midi kar; - audio/mpeg mp3; - audio/ogg ogg; - audio/x-m4a m4a; - audio/x-realaudio ra; + 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; - video/3gpp 3gpp 3gp; - 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; + audio/midi mid midi kar; + audio/mpeg mp3; + audio/ogg ogg; + audio/x-m4a m4a; + audio/x-realaudio ra; + + video/3gpp 3gpp 3gp; + video/mp2t ts; + video/mp4 mp4; + video/mpeg mpeg mpg; + video/quicktime mov; + video/webm webm; + video/x-flv flv; + video/x-m4v m4v; + video/x-mng mng; + video/x-ms-asf asx asf; + video/x-ms-wmv wmv; + video/x-msvideo avi; } diff --git a/conf/nginx.conf b/conf/nginx.conf index 3bb3389..29bc085 100644 --- a/conf/nginx.conf +++ b/conf/nginx.conf @@ -96,18 +96,17 @@ http { # HTTPS server # #server { - # listen 443; + # listen 443 ssl; # server_name localhost; - # ssl on; # ssl_certificate cert.pem; # ssl_certificate_key cert.key; + # ssl_session_cache shared:SSL:1m; # ssl_session_timeout 5m; - # ssl_protocols SSLv2 SSLv3 TLSv1; # ssl_ciphers HIGH:!aNULL:!MD5; - # ssl_prefer_server_ciphers on; + # ssl_prefer_server_ciphers on; # location / { # root html; diff --git a/conf/scgi_params b/conf/scgi_params index 47348ca..6d4ce4f 100644 --- a/conf/scgi_params +++ b/conf/scgi_params @@ -8,6 +8,7 @@ scgi_param DOCUMENT_URI $document_uri; scgi_param DOCUMENT_ROOT $document_root; scgi_param SCGI 1; scgi_param SERVER_PROTOCOL $server_protocol; +scgi_param REQUEST_SCHEME $scheme; scgi_param HTTPS $https if_not_empty; scgi_param REMOTE_ADDR $remote_addr; diff --git a/conf/uwsgi_params b/conf/uwsgi_params index f539451..09c732c 100644 --- a/conf/uwsgi_params +++ b/conf/uwsgi_params @@ -8,6 +8,7 @@ uwsgi_param REQUEST_URI $request_uri; uwsgi_param PATH_INFO $document_uri; uwsgi_param DOCUMENT_ROOT $document_root; uwsgi_param SERVER_PROTOCOL $server_protocol; +uwsgi_param REQUEST_SCHEME $scheme; uwsgi_param HTTPS $https if_not_empty; uwsgi_param REMOTE_ADDR $remote_addr; diff --git a/configure b/configure index 45ea154..5b88ebb 100755 --- a/configure +++ b/configure @@ -4,11 +4,14 @@ # Copyright (C) Nginx, Inc. +LC_ALL=C +export LC_ALL + . auto/options . auto/init . auto/sources -test -d $NGX_OBJS || mkdir $NGX_OBJS +test -d $NGX_OBJS || mkdir -p $NGX_OBJS echo > $NGX_AUTO_HEADERS_H echo > $NGX_AUTOCONF_ERR @@ -33,7 +36,7 @@ if test -z "$NGX_PLATFORM"; then NGX_PLATFORM="$NGX_SYSTEM:$NGX_RELEASE:$NGX_MACHINE"; case "$NGX_SYSTEM" in - MINGW32_*) + MINGW32_* | MINGW64_* | MSYS_*) NGX_PLATFORM=win32 ;; esac @@ -41,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 @@ -55,6 +59,7 @@ if [ "$NGX_PLATFORM" != win32 ]; then . auto/unix fi +. auto/threads . auto/modules . auto/lib/conf @@ -83,6 +88,10 @@ have=NGX_PID_PATH value="\"$NGX_PID_PATH\"" . auto/define have=NGX_LOCK_PATH value="\"$NGX_LOCK_PATH\"" . auto/define have=NGX_ERROR_LOG_PATH value="\"$NGX_ERROR_LOG_PATH\"" . auto/define +if [ ".$NGX_ERROR_LOG_PATH" = "." ]; then + have=NGX_ERROR_LOG_STDERR . auto/have +fi + have=NGX_HTTP_LOG_PATH value="\"$NGX_HTTP_LOG_PATH\"" . auto/define have=NGX_HTTP_CLIENT_TEMP_PATH value="\"$NGX_HTTP_CLIENT_TEMP_PATH\"" . auto/define @@ -105,4 +114,8 @@ have=NGX_HTTP_SCGI_TEMP_PATH value="\"$NGX_HTTP_SCGI_TEMP_PATH\"" have=NGX_USER value="\"$NGX_USER\"" . auto/define have=NGX_GROUP value="\"$NGX_GROUP\"" . auto/define +if [ ".$NGX_BUILD" != "." ]; then + have=NGX_BUILD value="\"$NGX_BUILD\"" . auto/define +fi + . auto/summary 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/README b/contrib/README index 094aa52..fec4b20 100644 --- a/contrib/README +++ b/contrib/README @@ -13,3 +13,9 @@ unicode2nginx by Maxim Dounin configuration file format. Two generated full maps for windows-1251 and koi8-r. + +vim by Evan Miller + + Syntax highlighting of nginx configuration for vim, to be + placed into ~/.vim/. + diff --git a/contrib/unicode2nginx/unicode-to-nginx.pl b/contrib/unicode2nginx/unicode-to-nginx.pl index daaf354..d113fed 100755 --- a/contrib/unicode2nginx/unicode-to-nginx.pl +++ b/contrib/unicode2nginx/unicode-to-nginx.pl @@ -10,7 +10,7 @@ # Needs perl 5.6 or later. -# Written by Maxim Dounin, mdounin@rambler-co.ru +# Written by Maxim Dounin, mdounin@mdounin.ru ############################################################################### @@ -33,7 +33,10 @@ while (<>) { # Produce UTF-8 sequence from character code; - my $un_utf8 = join('', map { sprintf("%02X", $_) } unpack("C*", pack("U", hex($un_code)))); + my $un_utf8 = join('', + map { sprintf("%02X", $_) } + unpack("U0C*", pack("U", hex($un_code))) + ); print " $cs_code $un_utf8 ; $un_name\n"; diff --git a/contrib/vim/ftdetect/nginx.vim b/contrib/vim/ftdetect/nginx.vim new file mode 100644 index 0000000..3ae470d --- /dev/null +++ b/contrib/vim/ftdetect/nginx.vim @@ -0,0 +1,4 @@ +au BufRead,BufNewFile *.nginx set ft=nginx +au BufRead,BufNewFile */etc/nginx/* set ft=nginx +au BufRead,BufNewFile */usr/local/nginx/conf/* set ft=nginx +au BufRead,BufNewFile nginx.conf set ft=nginx diff --git a/contrib/vim/ftplugin/nginx.vim b/contrib/vim/ftplugin/nginx.vim new file mode 100644 index 0000000..463eea9 --- /dev/null +++ b/contrib/vim/ftplugin/nginx.vim @@ -0,0 +1 @@ +setlocal commentstring=#\ %s diff --git a/contrib/vim/indent/nginx.vim b/contrib/vim/indent/nginx.vim new file mode 100644 index 0000000..8601366 --- /dev/null +++ b/contrib/vim/indent/nginx.vim @@ -0,0 +1,11 @@ +if exists("b:did_indent") + finish +endif +let b:did_indent = 1 + +setlocal indentexpr= + +" cindent actually works for nginx' simple file structure +setlocal cindent +" Just make sure that the comments are not reset as defs would be. +setlocal cinkeys-=0# diff --git a/contrib/vim/syntax/nginx.vim b/contrib/vim/syntax/nginx.vim new file mode 100644 index 0000000..29eef7a --- /dev/null +++ b/contrib/vim/syntax/nginx.vim @@ -0,0 +1,1979 @@ +" Vim syntax file +" Language: nginx.conf + +if exists("b:current_syntax") + finish +end + +let s:save_cpo = &cpo +set cpo&vim + +" general syntax + +if has("patch-7.4.1142") + " except control characters, ";", "{", and "}" + syn iskeyword 33-58,60-122,124,126-255 +endif + +syn match ngxName '\([^;{} \t\\]\|\\.\)\+' + \ contains=@ngxDirectives + \ nextgroup=@ngxParams skipwhite skipempty +syn match ngxParam '\(\${\|[^;{ \t\\]\|\\.\)\+' + \ contained + \ contains=ngxVariable + \ nextgroup=@ngxParams skipwhite skipempty +syn region ngxString start=+\z(["']\)+ end=+\z1+ skip=+\\\\\|\\\z1+ + \ contains=ngxVariableString + \ nextgroup=@ngxParams skipwhite skipempty +syn match ngxParamComment '#.*$' + \ nextgroup=@ngxParams skipwhite skipempty +syn match ngxSemicolon ';' contained +syn region ngxBlock start=+{+ end=+}+ contained + \ contains=@ngxTopLevel +syn match ngxComment '#.*$' + +syn match ngxVariable '\$\(\w\+\|{\w\+}\)' contained +syn match ngxVariableString '\$\(\w\+\|{\w\+}\)' contained + +syn cluster ngxTopLevel + \ contains=ngxName,ngxString,ngxComment +syn cluster ngxDirectives + \ contains=ngxDirective,ngxDirectiveBlock,ngxDirectiveImportant + \ add=ngxDirectiveControl,ngxDirectiveError,ngxDirectiveDeprecated + \ add=ngxDirectiveThirdParty,ngxDirectiveThirdPartyDeprecated +syn cluster ngxParams + \ contains=ngxParam,ngxString,ngxParamComment,ngxSemicolon,ngxBlock + +" boolean parameters + +syn keyword ngxBoolean contained on off + \ nextgroup=@ngxParams skipwhite skipempty +syn cluster ngxParams add=ngxBoolean + +" listen directive + +syn cluster ngxTopLevel add=ngxDirectiveListen +syn keyword ngxDirectiveListen listen + \ nextgroup=@ngxListenParams skipwhite skipempty +syn match ngxListenParam '\(\${\|[^;{ \t\\]\|\\.\)\+' + \ contained + \ nextgroup=@ngxListenParams skipwhite skipempty +syn region ngxListenString start=+\z(["']\)+ end=+\z1+ skip=+\\\\\|\\\z1+ + \ contained + \ nextgroup=@ngxListenParams skipwhite skipempty +syn match ngxListenComment '#.*$' + \ contained + \ nextgroup=@ngxListenParams skipwhite skipempty +syn keyword ngxListenOptions contained + \ 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 + \ http2 + \ nextgroup=@ngxListenParams skipwhite skipempty +syn cluster ngxListenParams + \ contains=ngxListenParam,ngxListenString,ngxListenComment + \ add=ngxListenOptions,ngxListenOptionsDeprecated + +syn keyword ngxDirectiveBlock contained http +syn keyword ngxDirectiveBlock contained stream +syn keyword ngxDirectiveBlock contained mail +syn keyword ngxDirectiveBlock contained events +syn keyword ngxDirectiveBlock contained server +syn keyword ngxDirectiveBlock contained types +syn keyword ngxDirectiveBlock contained location +syn keyword ngxDirectiveBlock contained upstream +syn keyword ngxDirectiveBlock contained charset_map +syn keyword ngxDirectiveBlock contained limit_except +syn keyword ngxDirectiveBlock contained if +syn keyword ngxDirectiveBlock contained geo +syn keyword ngxDirectiveBlock contained map +syn keyword ngxDirectiveBlock contained split_clients + +syn keyword ngxDirectiveImportant contained include +syn keyword ngxDirectiveImportant contained root +syn keyword ngxDirectiveImportant contained server_name +syn keyword ngxDirectiveImportant contained internal +syn keyword ngxDirectiveImportant contained proxy_pass +syn keyword ngxDirectiveImportant contained memcached_pass +syn keyword ngxDirectiveImportant contained fastcgi_pass +syn keyword ngxDirectiveImportant contained scgi_pass +syn keyword ngxDirectiveImportant contained uwsgi_pass +syn keyword ngxDirectiveImportant contained try_files + +syn keyword ngxDirectiveControl contained break +syn keyword ngxDirectiveControl contained return +syn keyword ngxDirectiveControl contained rewrite +syn keyword ngxDirectiveControl contained set + +syn keyword ngxDirectiveError contained error_page +syn keyword ngxDirectiveError contained post_action + +syn keyword ngxDirectiveDeprecated contained proxy_downstream_buffer +syn keyword ngxDirectiveDeprecated contained proxy_upstream_buffer +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 +syn keyword ngxDirective contained accept_mutex_delay +syn keyword ngxDirective contained acceptex_read +syn keyword ngxDirective contained access_log +syn keyword ngxDirective contained add_after_body +syn keyword ngxDirective contained add_before_body +syn keyword ngxDirective contained add_header +syn keyword ngxDirective contained add_trailer +syn keyword ngxDirective contained addition_types +syn keyword ngxDirective contained aio +syn keyword ngxDirective contained aio_write +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 auth_basic +syn keyword ngxDirective contained auth_basic_user_file +syn keyword ngxDirective contained auth_delay +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_request +syn keyword ngxDirective contained auth_request_set +syn keyword ngxDirective contained autoindex +syn keyword ngxDirective contained autoindex_exact_size +syn keyword ngxDirective contained autoindex_format +syn keyword ngxDirective contained autoindex_localtime +syn keyword ngxDirective contained charset +syn keyword ngxDirective contained charset_types +syn keyword ngxDirective contained chunked_transfer_encoding +syn keyword ngxDirective contained client_body_buffer_size +syn keyword ngxDirective contained client_body_in_file_only +syn keyword ngxDirective contained client_body_in_single_buffer +syn keyword ngxDirective contained client_body_temp_path +syn keyword ngxDirective contained client_body_timeout +syn keyword ngxDirective contained client_header_buffer_size +syn keyword ngxDirective contained client_header_timeout +syn keyword ngxDirective contained client_max_body_size +syn keyword ngxDirective contained connection_pool_size +syn keyword ngxDirective contained create_full_put_path +syn keyword ngxDirective contained daemon +syn keyword ngxDirective contained dav_access +syn keyword ngxDirective contained dav_methods +syn keyword ngxDirective contained debug_connection +syn keyword ngxDirective contained debug_points +syn keyword ngxDirective contained default_type +syn keyword ngxDirective contained degradation +syn keyword ngxDirective contained degrade +syn keyword ngxDirective contained deny +syn keyword ngxDirective contained devpoll_changes +syn keyword ngxDirective contained devpoll_events +syn keyword ngxDirective contained directio +syn keyword ngxDirective contained directio_alignment +syn keyword ngxDirective contained disable_symlinks +syn keyword ngxDirective contained empty_gif +syn keyword ngxDirective contained env +syn keyword ngxDirective contained epoll_events +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 fastcgi_bind +syn keyword ngxDirective contained fastcgi_buffer_size +syn keyword ngxDirective contained fastcgi_buffering +syn keyword ngxDirective contained fastcgi_buffers +syn keyword ngxDirective contained fastcgi_busy_buffers_size +syn keyword ngxDirective contained fastcgi_cache +syn keyword ngxDirective contained fastcgi_cache_background_update +syn keyword ngxDirective contained fastcgi_cache_bypass +syn keyword ngxDirective contained fastcgi_cache_key +syn keyword ngxDirective contained fastcgi_cache_lock +syn keyword ngxDirective contained fastcgi_cache_lock_age +syn keyword ngxDirective contained fastcgi_cache_lock_timeout +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_revalidate +syn keyword ngxDirective contained fastcgi_cache_use_stale +syn keyword ngxDirective contained fastcgi_cache_valid +syn keyword ngxDirective contained fastcgi_catch_stderr +syn keyword ngxDirective contained fastcgi_connect_timeout +syn keyword ngxDirective contained fastcgi_force_ranges +syn keyword ngxDirective contained fastcgi_hide_header +syn keyword ngxDirective contained fastcgi_ignore_client_abort +syn keyword ngxDirective contained fastcgi_ignore_headers +syn keyword ngxDirective contained fastcgi_index +syn keyword ngxDirective contained fastcgi_intercept_errors +syn keyword ngxDirective contained fastcgi_keep_conn +syn keyword ngxDirective contained fastcgi_limit_rate +syn keyword ngxDirective contained fastcgi_max_temp_file_size +syn keyword ngxDirective contained fastcgi_next_upstream +syn keyword ngxDirective contained fastcgi_next_upstream_timeout +syn keyword ngxDirective contained fastcgi_next_upstream_tries +syn keyword ngxDirective contained fastcgi_no_cache +syn keyword ngxDirective contained fastcgi_param +syn keyword ngxDirective contained fastcgi_pass_header +syn keyword ngxDirective contained fastcgi_pass_request_body +syn keyword ngxDirective contained fastcgi_pass_request_headers +syn keyword ngxDirective contained fastcgi_read_timeout +syn keyword ngxDirective contained fastcgi_request_buffering +syn keyword ngxDirective contained fastcgi_send_lowat +syn keyword ngxDirective contained fastcgi_send_timeout +syn keyword ngxDirective contained fastcgi_socket_keepalive +syn keyword ngxDirective contained fastcgi_split_path_info +syn keyword ngxDirective contained fastcgi_store +syn keyword ngxDirective contained fastcgi_store_access +syn keyword ngxDirective contained fastcgi_temp_file_write_size +syn keyword ngxDirective contained fastcgi_temp_path +syn keyword ngxDirective contained flv +syn keyword ngxDirective contained geoip_city +syn keyword ngxDirective contained geoip_country +syn keyword ngxDirective contained geoip_org +syn keyword ngxDirective contained geoip_proxy +syn keyword ngxDirective contained geoip_proxy_recursive +syn keyword ngxDirective contained google_perftools_profiles +syn keyword ngxDirective contained grpc_bind +syn keyword ngxDirective contained grpc_buffer_size +syn keyword ngxDirective contained grpc_connect_timeout +syn keyword ngxDirective contained grpc_hide_header +syn keyword ngxDirective contained grpc_ignore_headers +syn keyword ngxDirective contained grpc_intercept_errors +syn keyword ngxDirective contained grpc_next_upstream +syn keyword ngxDirective contained grpc_next_upstream_timeout +syn keyword ngxDirective contained grpc_next_upstream_tries +syn keyword ngxDirective contained grpc_pass +syn keyword ngxDirective contained grpc_pass_header +syn keyword ngxDirective contained grpc_read_timeout +syn keyword ngxDirective contained grpc_send_timeout +syn keyword ngxDirective contained grpc_set_header +syn keyword ngxDirective contained grpc_socket_keepalive +syn keyword ngxDirective contained grpc_ssl_certificate +syn keyword ngxDirective contained grpc_ssl_certificate_key +syn keyword ngxDirective contained grpc_ssl_ciphers +syn keyword ngxDirective contained grpc_ssl_conf_command +syn keyword ngxDirective contained grpc_ssl_crl +syn keyword ngxDirective contained grpc_ssl_name +syn keyword ngxDirective contained grpc_ssl_password_file +syn keyword ngxDirective contained grpc_ssl_protocols +syn keyword ngxDirective contained grpc_ssl_server_name +syn keyword ngxDirective contained grpc_ssl_session_reuse +syn keyword ngxDirective contained grpc_ssl_trusted_certificate +syn keyword ngxDirective contained grpc_ssl_verify +syn keyword ngxDirective contained grpc_ssl_verify_depth +syn keyword ngxDirective contained gunzip +syn keyword ngxDirective contained gunzip_buffers +syn keyword ngxDirective contained gzip +syn keyword ngxDirective contained gzip_buffers +syn keyword ngxDirective contained gzip_comp_level +syn keyword ngxDirective contained gzip_disable +syn keyword ngxDirective contained gzip_hash +syn keyword ngxDirective contained gzip_http_version +syn keyword ngxDirective contained gzip_min_length +syn keyword ngxDirective contained gzip_no_buffer +syn keyword ngxDirective contained gzip_proxied +syn keyword ngxDirective contained gzip_static +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 http2 +syn keyword ngxDirective contained http2_body_preread_size +syn keyword ngxDirective contained http2_chunk_size +syn keyword ngxDirective contained http2_max_concurrent_pushes +syn keyword ngxDirective contained http2_max_concurrent_streams +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_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 +syn keyword ngxDirective contained image_filter_buffer +syn keyword ngxDirective contained image_filter_interlace +syn keyword ngxDirective contained image_filter_jpeg_quality +syn keyword ngxDirective contained image_filter_sharpen +syn keyword ngxDirective contained image_filter_transparency +syn keyword ngxDirective contained image_filter_webp_quality +syn keyword ngxDirective contained imap_auth +syn keyword ngxDirective contained imap_capabilities +syn keyword ngxDirective contained imap_client_buffer +syn keyword ngxDirective contained index +syn keyword ngxDirective contained iocp_threads +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_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 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 limit_conn +syn keyword ngxDirective contained limit_conn_dry_run +syn keyword ngxDirective contained limit_conn_log_level +syn keyword ngxDirective contained limit_conn_status +syn keyword ngxDirective contained limit_conn_zone +syn keyword ngxDirective contained limit_rate +syn keyword ngxDirective contained limit_rate_after +syn keyword ngxDirective contained limit_req +syn keyword ngxDirective contained limit_req_dry_run +syn keyword ngxDirective contained limit_req_log_level +syn keyword ngxDirective contained limit_req_status +syn keyword ngxDirective contained limit_req_zone +syn keyword ngxDirective contained lingering_close +syn keyword ngxDirective contained lingering_time +syn keyword ngxDirective contained lingering_timeout +syn keyword ngxDirective contained load_module +syn keyword ngxDirective contained lock_file +syn keyword ngxDirective contained log_format +syn keyword ngxDirective contained log_not_found +syn keyword ngxDirective contained log_subrequest +syn keyword ngxDirective contained map_hash_bucket_size +syn keyword ngxDirective contained map_hash_max_size +syn keyword ngxDirective contained master_process +syn keyword ngxDirective contained max_errors +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_gzip_flag +syn keyword ngxDirective contained memcached_next_upstream +syn keyword ngxDirective contained memcached_next_upstream_timeout +syn keyword ngxDirective contained memcached_next_upstream_tries +syn keyword ngxDirective contained memcached_read_timeout +syn keyword ngxDirective contained memcached_send_timeout +syn keyword ngxDirective contained memcached_socket_keepalive +syn keyword ngxDirective contained merge_slashes +syn keyword ngxDirective contained min_delete_depth +syn keyword ngxDirective contained mirror +syn keyword ngxDirective contained mirror_request_body +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_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 open_file_cache +syn keyword ngxDirective contained open_file_cache_errors +syn keyword ngxDirective contained open_file_cache_events +syn keyword ngxDirective contained open_file_cache_min_uses +syn keyword ngxDirective contained open_file_cache_valid +syn keyword ngxDirective contained open_log_file_cache +syn keyword ngxDirective contained output_buffers +syn keyword ngxDirective contained override_charset +syn keyword ngxDirective contained pcre_jit +syn keyword ngxDirective contained perl +syn keyword ngxDirective contained perl_modules +syn keyword ngxDirective contained perl_require +syn keyword ngxDirective contained perl_set +syn keyword ngxDirective contained pid +syn keyword ngxDirective contained pop3_auth +syn keyword ngxDirective contained pop3_capabilities +syn keyword ngxDirective contained port_in_redirect +syn keyword ngxDirective contained post_acceptex +syn keyword ngxDirective contained postpone_gzipping +syn keyword ngxDirective contained postpone_output +syn keyword ngxDirective contained preread_buffer_size +syn keyword ngxDirective contained preread_timeout +syn keyword ngxDirective contained protocol +syn keyword ngxDirective contained proxy +syn keyword ngxDirective contained proxy_bind +syn keyword ngxDirective contained proxy_buffer +syn keyword ngxDirective contained proxy_buffer_size +syn keyword ngxDirective contained proxy_buffering +syn keyword ngxDirective contained proxy_buffers +syn keyword ngxDirective contained proxy_busy_buffers_size +syn keyword ngxDirective contained proxy_cache +syn keyword ngxDirective contained proxy_cache_background_update +syn keyword ngxDirective contained proxy_cache_bypass +syn keyword ngxDirective contained proxy_cache_convert_head +syn keyword ngxDirective contained proxy_cache_key +syn keyword ngxDirective contained proxy_cache_lock +syn keyword ngxDirective contained proxy_cache_lock_age +syn keyword ngxDirective contained proxy_cache_lock_timeout +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_revalidate +syn keyword ngxDirective contained proxy_cache_use_stale +syn keyword ngxDirective contained proxy_cache_valid +syn keyword ngxDirective contained proxy_connect_timeout +syn keyword ngxDirective contained proxy_cookie_domain +syn keyword ngxDirective contained proxy_cookie_flags +syn keyword ngxDirective contained proxy_cookie_path +syn keyword ngxDirective contained proxy_download_rate +syn keyword ngxDirective contained proxy_force_ranges +syn keyword ngxDirective contained proxy_half_close +syn keyword ngxDirective contained proxy_headers_hash_bucket_size +syn keyword ngxDirective contained proxy_headers_hash_max_size +syn keyword ngxDirective contained proxy_hide_header +syn keyword ngxDirective contained proxy_http_version +syn keyword ngxDirective contained proxy_ignore_client_abort +syn keyword ngxDirective contained proxy_ignore_headers +syn keyword ngxDirective contained proxy_intercept_errors +syn keyword ngxDirective contained proxy_limit_rate +syn keyword ngxDirective contained proxy_max_temp_file_size +syn keyword ngxDirective contained proxy_method +syn keyword ngxDirective contained proxy_next_upstream +syn keyword ngxDirective contained proxy_next_upstream_timeout +syn keyword ngxDirective contained proxy_next_upstream_tries +syn keyword ngxDirective contained proxy_no_cache +syn keyword ngxDirective contained proxy_pass_error_message +syn keyword ngxDirective contained proxy_pass_header +syn keyword ngxDirective contained proxy_pass_request_body +syn keyword ngxDirective contained proxy_pass_request_headers +syn keyword ngxDirective contained proxy_protocol +syn keyword ngxDirective contained proxy_protocol_timeout +syn keyword ngxDirective contained proxy_read_timeout +syn keyword ngxDirective contained proxy_redirect +syn keyword ngxDirective contained proxy_request_buffering +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_set_body +syn keyword ngxDirective contained proxy_set_header +syn keyword ngxDirective contained proxy_smtp_auth +syn keyword ngxDirective contained proxy_socket_keepalive +syn keyword ngxDirective contained proxy_ssl +syn keyword ngxDirective contained proxy_ssl_certificate +syn keyword ngxDirective contained proxy_ssl_certificate_key +syn keyword ngxDirective contained proxy_ssl_ciphers +syn keyword ngxDirective contained proxy_ssl_conf_command +syn keyword ngxDirective contained proxy_ssl_crl +syn keyword ngxDirective contained proxy_ssl_name +syn keyword ngxDirective contained proxy_ssl_password_file +syn keyword ngxDirective contained proxy_ssl_protocols +syn keyword ngxDirective contained proxy_ssl_server_name +syn keyword ngxDirective contained proxy_ssl_session_reuse +syn keyword ngxDirective contained proxy_ssl_trusted_certificate +syn keyword ngxDirective contained proxy_ssl_verify +syn keyword ngxDirective contained proxy_ssl_verify_depth +syn keyword ngxDirective contained proxy_store +syn keyword ngxDirective contained proxy_store_access +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 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 +syn keyword ngxDirective contained real_ip_header +syn keyword ngxDirective contained real_ip_recursive +syn keyword ngxDirective contained recursive_error_pages +syn keyword ngxDirective contained referer_hash_bucket_size +syn keyword ngxDirective contained referer_hash_max_size +syn keyword ngxDirective contained request_pool_size +syn keyword ngxDirective contained reset_timedout_connection +syn keyword ngxDirective contained resolver +syn keyword ngxDirective contained resolver_timeout +syn keyword ngxDirective contained rewrite_log +syn keyword ngxDirective contained satisfy +syn keyword ngxDirective contained scgi_bind +syn keyword ngxDirective contained scgi_buffer_size +syn keyword ngxDirective contained scgi_buffering +syn keyword ngxDirective contained scgi_buffers +syn keyword ngxDirective contained scgi_busy_buffers_size +syn keyword ngxDirective contained scgi_cache +syn keyword ngxDirective contained scgi_cache_background_update +syn keyword ngxDirective contained scgi_cache_bypass +syn keyword ngxDirective contained scgi_cache_key +syn keyword ngxDirective contained scgi_cache_lock +syn keyword ngxDirective contained scgi_cache_lock_age +syn keyword ngxDirective contained scgi_cache_lock_timeout +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_revalidate +syn keyword ngxDirective contained scgi_cache_use_stale +syn keyword ngxDirective contained scgi_cache_valid +syn keyword ngxDirective contained scgi_connect_timeout +syn keyword ngxDirective contained scgi_force_ranges +syn keyword ngxDirective contained scgi_hide_header +syn keyword ngxDirective contained scgi_ignore_client_abort +syn keyword ngxDirective contained scgi_ignore_headers +syn keyword ngxDirective contained scgi_intercept_errors +syn keyword ngxDirective contained scgi_limit_rate +syn keyword ngxDirective contained scgi_max_temp_file_size +syn keyword ngxDirective contained scgi_next_upstream +syn keyword ngxDirective contained scgi_next_upstream_timeout +syn keyword ngxDirective contained scgi_next_upstream_tries +syn keyword ngxDirective contained scgi_no_cache +syn keyword ngxDirective contained scgi_param +syn keyword ngxDirective contained scgi_pass_header +syn keyword ngxDirective contained scgi_pass_request_body +syn keyword ngxDirective contained scgi_pass_request_headers +syn keyword ngxDirective contained scgi_read_timeout +syn keyword ngxDirective contained scgi_request_buffering +syn keyword ngxDirective contained scgi_send_timeout +syn keyword ngxDirective contained scgi_socket_keepalive +syn keyword ngxDirective contained scgi_store +syn keyword ngxDirective contained scgi_store_access +syn keyword ngxDirective contained scgi_temp_file_write_size +syn keyword ngxDirective contained scgi_temp_path +syn keyword ngxDirective contained secure_link +syn keyword ngxDirective contained secure_link_md5 +syn keyword ngxDirective contained secure_link_secret +syn keyword ngxDirective contained send_lowat +syn keyword ngxDirective contained send_timeout +syn keyword ngxDirective contained sendfile +syn keyword ngxDirective contained sendfile_max_chunk +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 set_real_ip_from +syn keyword ngxDirective contained slice +syn keyword ngxDirective contained smtp_auth +syn keyword ngxDirective contained smtp_capabilities +syn keyword ngxDirective contained smtp_client_buffer +syn keyword ngxDirective contained smtp_greeting_delay +syn keyword ngxDirective contained source_charset +syn keyword ngxDirective contained ssi +syn keyword ngxDirective contained ssi_ignore_recycled_buffers +syn keyword ngxDirective contained ssi_last_modified +syn keyword ngxDirective contained ssi_min_file_chunk +syn keyword ngxDirective contained ssi_silent_errors +syn keyword ngxDirective contained ssi_types +syn keyword ngxDirective contained ssi_value_length +syn keyword ngxDirective contained ssl_alpn +syn keyword ngxDirective contained ssl_buffer_size +syn keyword ngxDirective contained ssl_certificate +syn keyword ngxDirective contained ssl_certificate_key +syn keyword ngxDirective contained ssl_ciphers +syn keyword ngxDirective contained ssl_client_certificate +syn keyword ngxDirective contained ssl_conf_command +syn keyword ngxDirective contained ssl_crl +syn keyword ngxDirective contained ssl_dhparam +syn keyword ngxDirective contained ssl_early_data +syn keyword ngxDirective contained ssl_ecdh_curve +syn keyword ngxDirective contained ssl_engine +syn keyword ngxDirective contained ssl_handshake_timeout +syn keyword ngxDirective contained ssl_ocsp +syn keyword ngxDirective contained ssl_ocsp_cache +syn keyword ngxDirective contained ssl_ocsp_responder +syn keyword ngxDirective contained ssl_password_file +syn keyword ngxDirective contained ssl_prefer_server_ciphers +syn keyword ngxDirective contained ssl_preread +syn keyword ngxDirective contained ssl_protocols +syn keyword ngxDirective contained ssl_reject_handshake +syn keyword ngxDirective contained ssl_session_cache +syn keyword ngxDirective contained ssl_session_ticket_key +syn keyword ngxDirective contained ssl_session_tickets +syn keyword ngxDirective contained ssl_session_timeout +syn keyword ngxDirective contained ssl_stapling +syn keyword ngxDirective contained ssl_stapling_file +syn keyword ngxDirective contained ssl_stapling_responder +syn keyword ngxDirective contained ssl_stapling_verify +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 stub_status +syn keyword ngxDirective contained sub_filter +syn keyword ngxDirective contained sub_filter_last_modified +syn keyword ngxDirective contained sub_filter_once +syn keyword ngxDirective contained sub_filter_types +syn keyword ngxDirective contained subrequest_output_buffer_size +syn keyword ngxDirective contained tcp_nodelay +syn keyword ngxDirective contained tcp_nopush +syn keyword ngxDirective contained thread_pool +syn keyword ngxDirective contained timeout +syn keyword ngxDirective contained timer_resolution +syn keyword ngxDirective contained types_hash_bucket_size +syn keyword ngxDirective contained types_hash_max_size +syn keyword ngxDirective contained underscores_in_headers +syn keyword ngxDirective contained uninitialized_variable_warn +syn keyword ngxDirective contained use +syn keyword ngxDirective contained user +syn keyword ngxDirective contained userid +syn keyword ngxDirective contained userid_domain +syn keyword ngxDirective contained userid_expires +syn keyword ngxDirective contained userid_flags +syn keyword ngxDirective contained userid_mark +syn keyword ngxDirective contained userid_name +syn keyword ngxDirective contained userid_p3p +syn keyword ngxDirective contained userid_path +syn keyword ngxDirective contained userid_service +syn keyword ngxDirective contained uwsgi_bind +syn keyword ngxDirective contained uwsgi_buffer_size +syn keyword ngxDirective contained uwsgi_buffering +syn keyword ngxDirective contained uwsgi_buffers +syn keyword ngxDirective contained uwsgi_busy_buffers_size +syn keyword ngxDirective contained uwsgi_cache +syn keyword ngxDirective contained uwsgi_cache_background_update +syn keyword ngxDirective contained uwsgi_cache_bypass +syn keyword ngxDirective contained uwsgi_cache_key +syn keyword ngxDirective contained uwsgi_cache_lock +syn keyword ngxDirective contained uwsgi_cache_lock_age +syn keyword ngxDirective contained uwsgi_cache_lock_timeout +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_revalidate +syn keyword ngxDirective contained uwsgi_cache_use_stale +syn keyword ngxDirective contained uwsgi_cache_valid +syn keyword ngxDirective contained uwsgi_connect_timeout +syn keyword ngxDirective contained uwsgi_force_ranges +syn keyword ngxDirective contained uwsgi_hide_header +syn keyword ngxDirective contained uwsgi_ignore_client_abort +syn keyword ngxDirective contained uwsgi_ignore_headers +syn keyword ngxDirective contained uwsgi_intercept_errors +syn keyword ngxDirective contained uwsgi_limit_rate +syn keyword ngxDirective contained uwsgi_max_temp_file_size +syn keyword ngxDirective contained uwsgi_modifier1 +syn keyword ngxDirective contained uwsgi_modifier2 +syn keyword ngxDirective contained uwsgi_next_upstream +syn keyword ngxDirective contained uwsgi_next_upstream_timeout +syn keyword ngxDirective contained uwsgi_next_upstream_tries +syn keyword ngxDirective contained uwsgi_no_cache +syn keyword ngxDirective contained uwsgi_param +syn keyword ngxDirective contained uwsgi_pass_header +syn keyword ngxDirective contained uwsgi_pass_request_body +syn keyword ngxDirective contained uwsgi_pass_request_headers +syn keyword ngxDirective contained uwsgi_read_timeout +syn keyword ngxDirective contained uwsgi_request_buffering +syn keyword ngxDirective contained uwsgi_send_timeout +syn keyword ngxDirective contained uwsgi_socket_keepalive +syn keyword ngxDirective contained uwsgi_ssl_certificate +syn keyword ngxDirective contained uwsgi_ssl_certificate_key +syn keyword ngxDirective contained uwsgi_ssl_ciphers +syn keyword ngxDirective contained uwsgi_ssl_conf_command +syn keyword ngxDirective contained uwsgi_ssl_crl +syn keyword ngxDirective contained uwsgi_ssl_name +syn keyword ngxDirective contained uwsgi_ssl_password_file +syn keyword ngxDirective contained uwsgi_ssl_protocols +syn keyword ngxDirective contained uwsgi_ssl_server_name +syn keyword ngxDirective contained uwsgi_ssl_session_reuse +syn keyword ngxDirective contained uwsgi_ssl_trusted_certificate +syn keyword ngxDirective contained uwsgi_ssl_verify +syn keyword ngxDirective contained uwsgi_ssl_verify_depth +syn keyword ngxDirective contained uwsgi_store +syn keyword ngxDirective contained uwsgi_store_access +syn keyword ngxDirective contained uwsgi_string +syn keyword ngxDirective contained uwsgi_temp_file_write_size +syn keyword ngxDirective contained uwsgi_temp_path +syn keyword ngxDirective contained valid_referers +syn keyword ngxDirective contained variables_hash_bucket_size +syn keyword ngxDirective contained variables_hash_max_size +syn keyword ngxDirective contained worker_aio_requests +syn keyword ngxDirective contained worker_connections +syn keyword ngxDirective contained worker_cpu_affinity +syn keyword ngxDirective contained worker_priority +syn keyword ngxDirective contained worker_processes +syn keyword ngxDirective contained worker_rlimit_core +syn keyword ngxDirective contained worker_rlimit_nofile +syn keyword ngxDirective contained worker_shutdown_timeout +syn keyword ngxDirective contained working_directory +syn keyword ngxDirective contained xclient +syn keyword ngxDirective contained xml_entities +syn keyword ngxDirective contained xslt_last_modified +syn keyword ngxDirective contained xslt_param +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 +syn keyword ngxDirective contained zone_sync_connect_timeout +syn keyword ngxDirective contained zone_sync_interval +syn keyword ngxDirective contained zone_sync_recv_buffer_size +syn keyword ngxDirective contained zone_sync_server +syn keyword ngxDirective contained zone_sync_ssl +syn keyword ngxDirective contained zone_sync_ssl_certificate +syn keyword ngxDirective contained zone_sync_ssl_certificate_key +syn keyword ngxDirective contained zone_sync_ssl_ciphers +syn keyword ngxDirective contained zone_sync_ssl_conf_command +syn keyword ngxDirective contained zone_sync_ssl_crl +syn keyword ngxDirective contained zone_sync_ssl_name +syn keyword ngxDirective contained zone_sync_ssl_password_file +syn keyword ngxDirective contained zone_sync_ssl_protocols +syn keyword ngxDirective contained zone_sync_ssl_server_name +syn keyword ngxDirective contained zone_sync_ssl_trusted_certificate +syn keyword ngxDirective contained zone_sync_ssl_verify +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/main/www/nginx-devel/Makefile.extmod +" ---------------------------------------------------------------------------------- + +" 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 +syn keyword ngxDirectiveThirdParty contained ajp_cache_lock +syn keyword ngxDirectiveThirdParty contained ajp_cache_lock_timeout +syn keyword ngxDirectiveThirdParty contained ajp_cache_methods +syn keyword ngxDirectiveThirdParty contained ajp_cache_min_uses +syn keyword ngxDirectiveThirdParty contained ajp_cache_path +syn keyword ngxDirectiveThirdParty contained ajp_cache_use_stale +syn keyword ngxDirectiveThirdParty contained ajp_cache_valid +syn keyword ngxDirectiveThirdParty contained ajp_connect_timeout +syn keyword ngxDirectiveThirdParty contained ajp_header_packet_buffer_size +syn keyword ngxDirectiveThirdParty contained ajp_hide_header +syn keyword ngxDirectiveThirdParty contained ajp_ignore_client_abort +syn keyword ngxDirectiveThirdParty contained ajp_ignore_headers +syn keyword ngxDirectiveThirdParty contained ajp_intercept_errors +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 +syn keyword ngxDirectiveThirdParty contained ajp_store +syn keyword ngxDirectiveThirdParty contained ajp_store_access +syn keyword ngxDirectiveThirdParty contained ajp_temp_file_write_size +syn keyword ngxDirectiveThirdParty contained ajp_temp_path +syn keyword ngxDirectiveThirdParty contained ajp_upstream_fail_timeout +syn keyword ngxDirectiveThirdParty contained ajp_upstream_max_fails + +" 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 +syn keyword ngxDirectiveThirdParty contained aws_key_scope +syn keyword ngxDirectiveThirdParty contained aws_s3_bucket +syn keyword ngxDirectiveThirdParty contained aws_sign +syn keyword ngxDirectiveThirdParty contained aws_signing_key + +" 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 + +" https://github.com/grahamedgecombe/nginx-ct +syn keyword ngxDirectiveThirdParty contained ssl_ct +syn keyword ngxDirectiveThirdParty contained ssl_ct_static_scts + +" 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 +syn keyword ngxDirectiveThirdParty contained echo_foreach_split +syn keyword ngxDirectiveThirdParty contained echo_location +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 + +" 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 + +" 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 + +" 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 + +" https://github.com/openresty/nginx-eval-module +syn keyword ngxDirectiveThirdParty contained eval +syn keyword ngxDirectiveThirdParty contained eval_buffer_size +syn keyword ngxDirectiveThirdParty contained eval_escalate +syn keyword ngxDirectiveThirdParty contained eval_override_content_type +syn keyword ngxDirectiveThirdParty contained eval_subrequest_in_memory + +" 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 +syn keyword ngxDirectiveThirdParty contained fancyindex_exact_size +syn keyword ngxDirectiveThirdParty contained fancyindex_footer +syn keyword ngxDirectiveThirdParty contained fancyindex_header +syn keyword ngxDirectiveThirdParty contained fancyindex_hide_parent_dir +syn keyword ngxDirectiveThirdParty contained fancyindex_hide_symlinks +syn keyword ngxDirectiveThirdParty contained fancyindex_ignore +syn keyword ngxDirectiveThirdParty contained fancyindex_localtime +syn keyword ngxDirectiveThirdParty contained fancyindex_show_dotfiles +syn keyword ngxDirectiveThirdParty contained fancyindex_show_path +syn keyword ngxDirectiveThirdParty contained fancyindex_time_format + +" https://github.com/alibaba/nginx-http-footer-filter +syn keyword ngxDirectiveThirdParty contained footer +syn keyword ngxDirectiveThirdParty contained footer_types + +" 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 + +" 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 + +" 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 + +" https://github.com/kr/nginx-notice +syn keyword ngxDirectiveThirdParty contained notice +syn keyword ngxDirectiveThirdParty contained notice_type + +" https://github.com/slact/nchan +syn keyword ngxDirectiveThirdParty contained nchan_access_control_allow_credentials +syn keyword ngxDirectiveThirdParty contained nchan_access_control_allow_origin +syn keyword ngxDirectiveThirdParty contained nchan_authorize_request +syn keyword ngxDirectiveThirdParty contained nchan_benchmark +syn keyword ngxDirectiveThirdParty contained nchan_benchmark_channels +syn keyword ngxDirectiveThirdParty contained nchan_benchmark_message_padding_bytes +syn keyword ngxDirectiveThirdParty contained nchan_benchmark_messages_per_channel_per_minute +syn keyword ngxDirectiveThirdParty contained nchan_benchmark_publisher_distribution +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_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 +syn keyword ngxDirectiveThirdParty contained nchan_channel_id_split_delimiter +syn keyword ngxDirectiveThirdParty contained nchan_channel_timeout +syn keyword ngxDirectiveThirdParty contained nchan_deflate_message_for_websocket +syn keyword ngxDirectiveThirdParty contained nchan_eventsource_event +syn keyword ngxDirectiveThirdParty contained nchan_eventsource_ping_comment +syn keyword ngxDirectiveThirdParty contained nchan_eventsource_ping_data +syn keyword ngxDirectiveThirdParty contained nchan_eventsource_ping_event +syn keyword ngxDirectiveThirdParty contained nchan_eventsource_ping_interval +syn keyword ngxDirectiveThirdParty contained nchan_group_location +syn keyword ngxDirectiveThirdParty contained nchan_group_max_channels +syn keyword ngxDirectiveThirdParty contained nchan_group_max_messages +syn keyword ngxDirectiveThirdParty contained nchan_group_max_messages_disk +syn keyword ngxDirectiveThirdParty contained nchan_group_max_messages_memory +syn keyword ngxDirectiveThirdParty contained nchan_group_max_subscribers +syn keyword ngxDirectiveThirdParty contained nchan_longpoll_multipart_response +syn keyword ngxDirectiveThirdParty contained nchan_max_channel_id_length +syn keyword ngxDirectiveThirdParty contained nchan_max_channel_subscribers +syn keyword ngxDirectiveThirdParty contained nchan_max_reserved_memory +syn keyword ngxDirectiveThirdParty contained nchan_message_buffer_length +syn keyword ngxDirectiveThirdParty contained nchan_message_max_buffer_length +syn keyword ngxDirectiveThirdParty contained nchan_message_temp_path +syn keyword ngxDirectiveThirdParty contained nchan_message_timeout +syn keyword ngxDirectiveThirdParty contained nchan_permessage_deflate_compression_level +syn keyword ngxDirectiveThirdParty contained nchan_permessage_deflate_compression_memlevel +syn keyword ngxDirectiveThirdParty contained nchan_permessage_deflate_compression_strategy +syn keyword ngxDirectiveThirdParty contained nchan_permessage_deflate_compression_window +syn keyword ngxDirectiveThirdParty contained nchan_pub_channel_id +syn keyword ngxDirectiveThirdParty contained nchan_publisher +syn keyword ngxDirectiveThirdParty contained nchan_publisher_channel_id +syn keyword ngxDirectiveThirdParty contained nchan_publisher_location +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 +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 +syn keyword ngxDirectiveThirdParty contained nchan_redis_ssl_client_certificate +syn keyword ngxDirectiveThirdParty contained nchan_redis_ssl_client_certificate_key +syn keyword ngxDirectiveThirdParty contained nchan_redis_ssl_server_name +syn keyword ngxDirectiveThirdParty contained nchan_redis_ssl_trusted_certificate +syn keyword ngxDirectiveThirdParty contained nchan_redis_ssl_trusted_certificate_path +syn keyword ngxDirectiveThirdParty contained nchan_redis_ssl_verify_certificate +syn keyword ngxDirectiveThirdParty contained nchan_redis_storage_mode +syn keyword ngxDirectiveThirdParty contained nchan_redis_subscribe_weights +syn keyword ngxDirectiveThirdParty contained nchan_redis_tls +syn keyword ngxDirectiveThirdParty contained nchan_redis_tls_ciphers +syn keyword ngxDirectiveThirdParty contained nchan_redis_tls_client_certificate +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 +syn keyword ngxDirectiveThirdParty contained nchan_shared_memory_size +syn keyword ngxDirectiveThirdParty contained nchan_storage_engine +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_subscriber_first_message +syn keyword ngxDirectiveThirdParty contained nchan_subscriber_http_raw_stream_separator +syn keyword ngxDirectiveThirdParty contained nchan_subscriber_info +syn keyword ngxDirectiveThirdParty contained nchan_subscriber_info_string +syn keyword ngxDirectiveThirdParty contained nchan_subscriber_last_message_id +syn keyword ngxDirectiveThirdParty contained nchan_subscriber_location +syn keyword ngxDirectiveThirdParty contained nchan_subscriber_message_id_custom_etag_header +syn keyword ngxDirectiveThirdParty contained nchan_subscriber_timeout +syn keyword ngxDirectiveThirdParty contained nchan_unsubscribe_request +syn keyword ngxDirectiveThirdParty contained nchan_use_redis +syn keyword ngxDirectiveThirdParty contained nchan_websocket_client_heartbeat +syn keyword ngxDirectiveThirdParty contained nchan_websocket_ping_interval +syn keyword ngxDirectiveThirdParty contained push_authorized_channels_only +syn keyword ngxDirectiveThirdParty contained push_channel_group +syn keyword ngxDirectiveThirdParty contained push_channel_timeout +syn keyword ngxDirectiveThirdParty contained push_max_channel_id_length +syn keyword ngxDirectiveThirdParty contained push_max_channel_subscribers +syn keyword ngxDirectiveThirdParty contained push_max_message_buffer_length +syn keyword ngxDirectiveThirdParty contained push_max_reserved_memory +syn keyword ngxDirectiveThirdParty contained push_message_buffer_length +syn keyword ngxDirectiveThirdParty contained push_message_timeout +syn keyword ngxDirectiveThirdParty contained push_min_message_buffer_length +syn keyword ngxDirectiveThirdParty contained push_publisher +syn keyword ngxDirectiveThirdParty contained push_store_messages +syn keyword ngxDirectiveThirdParty contained push_subscriber +syn keyword ngxDirectiveThirdParty contained push_subscriber_concurrency +syn keyword ngxDirectiveThirdParty contained push_subscriber_timeout + +" 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 +syn keyword ngxDirectiveThirdParty contained push_stream_authorized_channels_only +syn keyword ngxDirectiveThirdParty contained push_stream_channel_deleted_message_text +syn keyword ngxDirectiveThirdParty contained push_stream_channel_inactivity_time +syn keyword ngxDirectiveThirdParty contained push_stream_channel_info_on_publish +syn keyword ngxDirectiveThirdParty contained push_stream_channels_path +syn keyword ngxDirectiveThirdParty contained push_stream_channels_statistics +syn keyword ngxDirectiveThirdParty contained push_stream_events_channel_id +syn keyword ngxDirectiveThirdParty contained push_stream_footer_template +syn keyword ngxDirectiveThirdParty contained push_stream_header_template +syn keyword ngxDirectiveThirdParty contained push_stream_header_template_file +syn keyword ngxDirectiveThirdParty contained push_stream_last_event_id +syn keyword ngxDirectiveThirdParty contained push_stream_last_received_message_tag +syn keyword ngxDirectiveThirdParty contained push_stream_last_received_message_time +syn keyword ngxDirectiveThirdParty contained push_stream_longpolling_connection_ttl +syn keyword ngxDirectiveThirdParty contained push_stream_max_channel_id_length +syn keyword ngxDirectiveThirdParty contained push_stream_max_messages_stored_per_channel +syn keyword ngxDirectiveThirdParty contained push_stream_max_number_of_channels +syn keyword ngxDirectiveThirdParty contained push_stream_max_number_of_wildcard_channels +syn keyword ngxDirectiveThirdParty contained push_stream_max_subscribers_per_channel +syn keyword ngxDirectiveThirdParty contained push_stream_message_template +syn keyword ngxDirectiveThirdParty contained push_stream_message_ttl +syn keyword ngxDirectiveThirdParty contained push_stream_padding_by_user_agent +syn keyword ngxDirectiveThirdParty contained push_stream_ping_message_interval +syn keyword ngxDirectiveThirdParty contained push_stream_ping_message_text +syn keyword ngxDirectiveThirdParty contained push_stream_publisher +syn keyword ngxDirectiveThirdParty contained push_stream_shared_memory_size +syn keyword ngxDirectiveThirdParty contained push_stream_store_messages +syn keyword ngxDirectiveThirdParty contained push_stream_subscriber +syn keyword ngxDirectiveThirdParty contained push_stream_subscriber_connection_ttl +syn keyword ngxDirectiveThirdParty contained push_stream_timeout_with_body +syn keyword ngxDirectiveThirdParty contained push_stream_user_agent +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 + +" https://github.com/yaoweibin/ngx_http_substitutions_filter_module +syn keyword ngxDirectiveThirdParty contained subs_buffers +syn keyword ngxDirectiveThirdParty contained subs_filter +syn keyword ngxDirectiveThirdParty contained subs_filter_bypass +syn keyword ngxDirectiveThirdParty contained subs_filter_types +syn keyword ngxDirectiveThirdParty contained subs_line_buffer_size + +" https://github.com/tarantool/nginx_upstream_module +syn keyword ngxDirectiveThirdParty contained tnt_allowed_indexes +syn keyword ngxDirectiveThirdParty contained tnt_allowed_spaces +syn keyword ngxDirectiveThirdParty contained tnt_buffer_size +syn keyword ngxDirectiveThirdParty contained tnt_connect_timeout +syn keyword ngxDirectiveThirdParty contained tnt_delete +syn keyword ngxDirectiveThirdParty contained tnt_http_methods +syn keyword ngxDirectiveThirdParty contained tnt_http_rest_methods +syn keyword ngxDirectiveThirdParty contained tnt_in_multiplier +syn keyword ngxDirectiveThirdParty contained tnt_insert +syn keyword ngxDirectiveThirdParty contained tnt_method +syn keyword ngxDirectiveThirdParty contained tnt_multireturn_skip_count +syn keyword ngxDirectiveThirdParty contained tnt_next_upstream +syn keyword ngxDirectiveThirdParty contained tnt_next_upstream_timeout +syn keyword ngxDirectiveThirdParty contained tnt_next_upstream_tries +syn keyword ngxDirectiveThirdParty contained tnt_out_multiplier +syn keyword ngxDirectiveThirdParty contained tnt_pass +syn keyword ngxDirectiveThirdParty contained tnt_pass_http_request +syn keyword ngxDirectiveThirdParty contained tnt_pass_http_request_buffer_size +syn keyword ngxDirectiveThirdParty contained tnt_pure_result +syn keyword ngxDirectiveThirdParty contained tnt_read_timeout +syn keyword ngxDirectiveThirdParty contained tnt_replace +syn keyword ngxDirectiveThirdParty contained tnt_select +syn keyword ngxDirectiveThirdParty contained tnt_select_limit_max +syn keyword ngxDirectiveThirdParty contained tnt_send_timeout +syn keyword ngxDirectiveThirdParty contained tnt_set_header +syn keyword ngxDirectiveThirdParty contained tnt_update +syn keyword ngxDirectiveThirdParty contained tnt_upsert + +" 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_buffer_size +syn keyword ngxDirectiveThirdParty contained upload_cleanup +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_tame_arrays + +" https://github.com/masterzen/nginx-upload-progress-module +syn keyword ngxDirectiveThirdParty contained report_uploads +syn keyword ngxDirectiveThirdParty contained track_uploads +syn keyword ngxDirectiveThirdParty contained upload_progress +syn keyword ngxDirectiveThirdParty contained upload_progress_content_type +syn keyword ngxDirectiveThirdParty contained upload_progress_header +syn keyword ngxDirectiveThirdParty contained upload_progress_java_output +syn keyword ngxDirectiveThirdParty contained upload_progress_json_output +syn keyword ngxDirectiveThirdParty contained upload_progress_jsonp_output +syn keyword ngxDirectiveThirdParty contained upload_progress_jsonp_parameter +syn keyword ngxDirectiveThirdParty contained upload_progress_template + +" https://github.com/yaoweibin/nginx_upstream_check_module +syn keyword ngxDirectiveThirdParty contained check +syn keyword ngxDirectiveThirdParty contained check_fastcgi_param +syn keyword ngxDirectiveThirdParty contained check_http_expect_alive +syn keyword ngxDirectiveThirdParty contained check_http_send +syn keyword ngxDirectiveThirdParty contained check_keepalive_requests +syn keyword ngxDirectiveThirdParty contained check_shm_size +syn keyword ngxDirectiveThirdParty contained check_status + +" https://github.com/jaygooby/nginx-upstream-fair +syn keyword ngxDirectiveThirdParty contained fair +syn keyword ngxDirectiveThirdParty contained upstream_fair_shm_size + +" 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 +syn keyword ngxDirectiveThirdParty contained video_thumbextractor_jpeg_baseline +syn keyword ngxDirectiveThirdParty contained video_thumbextractor_jpeg_dpi +syn keyword ngxDirectiveThirdParty contained video_thumbextractor_jpeg_optimize +syn keyword ngxDirectiveThirdParty contained video_thumbextractor_jpeg_progressive_mode +syn keyword ngxDirectiveThirdParty contained video_thumbextractor_jpeg_quality +syn keyword ngxDirectiveThirdParty contained video_thumbextractor_jpeg_smooth +syn keyword ngxDirectiveThirdParty contained video_thumbextractor_next_time +syn keyword ngxDirectiveThirdParty contained video_thumbextractor_only_keyframe +syn keyword ngxDirectiveThirdParty contained video_thumbextractor_processes_per_worker +syn keyword ngxDirectiveThirdParty contained video_thumbextractor_threads +syn keyword ngxDirectiveThirdParty contained video_thumbextractor_tile_color +syn keyword ngxDirectiveThirdParty contained video_thumbextractor_tile_cols +syn keyword ngxDirectiveThirdParty contained video_thumbextractor_tile_margin +syn keyword ngxDirectiveThirdParty contained video_thumbextractor_tile_max_cols +syn keyword ngxDirectiveThirdParty contained video_thumbextractor_tile_max_rows +syn keyword ngxDirectiveThirdParty contained video_thumbextractor_tile_padding +syn keyword ngxDirectiveThirdParty contained video_thumbextractor_tile_rows +syn keyword ngxDirectiveThirdParty contained video_thumbextractor_tile_sample_interval +syn keyword ngxDirectiveThirdParty contained video_thumbextractor_video_filename +syn keyword ngxDirectiveThirdParty contained video_thumbextractor_video_second + +" 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 + +" https://github.com/baysao/nginx-let-module +syn keyword ngxDirectiveThirdParty contained let + +" https://github.com/openresty/lua-nginx-module +syn keyword ngxDirectiveThirdParty contained access_by_lua +syn keyword ngxDirectiveThirdParty contained access_by_lua_block +syn keyword ngxDirectiveThirdParty contained access_by_lua_file +syn keyword ngxDirectiveThirdParty contained access_by_lua_no_postpone +syn keyword ngxDirectiveThirdParty contained balancer_by_lua_block +syn keyword ngxDirectiveThirdParty contained balancer_by_lua_file +syn keyword ngxDirectiveThirdParty contained body_filter_by_lua +syn keyword ngxDirectiveThirdParty contained body_filter_by_lua_block +syn keyword ngxDirectiveThirdParty contained body_filter_by_lua_file +syn keyword ngxDirectiveThirdParty contained content_by_lua +syn keyword ngxDirectiveThirdParty contained content_by_lua_block +syn keyword ngxDirectiveThirdParty contained content_by_lua_file +syn keyword ngxDirectiveThirdParty contained exit_worker_by_lua_block +syn keyword ngxDirectiveThirdParty contained exit_worker_by_lua_file +syn keyword ngxDirectiveThirdParty contained header_filter_by_lua +syn keyword ngxDirectiveThirdParty contained header_filter_by_lua_block +syn keyword ngxDirectiveThirdParty contained header_filter_by_lua_file +syn keyword ngxDirectiveThirdParty contained init_by_lua +syn keyword ngxDirectiveThirdParty contained init_by_lua_block +syn keyword ngxDirectiveThirdParty contained init_by_lua_file +syn keyword ngxDirectiveThirdParty contained init_worker_by_lua +syn keyword ngxDirectiveThirdParty contained init_worker_by_lua_block +syn keyword ngxDirectiveThirdParty contained init_worker_by_lua_file +syn keyword ngxDirectiveThirdParty contained log_by_lua +syn keyword ngxDirectiveThirdParty contained log_by_lua_block +syn keyword ngxDirectiveThirdParty contained log_by_lua_file +syn keyword ngxDirectiveThirdParty contained lua_capture_error_log +syn keyword ngxDirectiveThirdParty contained lua_check_client_abort +syn keyword ngxDirectiveThirdParty contained lua_code_cache +syn keyword ngxDirectiveThirdParty contained lua_fake_shm +syn keyword ngxDirectiveThirdParty contained lua_http10_buffering +syn keyword ngxDirectiveThirdParty contained lua_load_resty_core +syn keyword ngxDirectiveThirdParty contained lua_malloc_trim +syn keyword ngxDirectiveThirdParty contained lua_max_pending_timers +syn keyword ngxDirectiveThirdParty contained lua_max_running_timers +syn keyword ngxDirectiveThirdParty contained lua_need_request_body +syn keyword ngxDirectiveThirdParty contained lua_package_cpath +syn keyword ngxDirectiveThirdParty contained lua_package_path +syn keyword ngxDirectiveThirdParty contained lua_regex_cache_max_entries +syn keyword ngxDirectiveThirdParty contained lua_regex_match_limit +syn keyword ngxDirectiveThirdParty contained lua_sa_restart +syn keyword ngxDirectiveThirdParty contained lua_shared_dict +syn keyword ngxDirectiveThirdParty contained lua_socket_buffer_size +syn keyword ngxDirectiveThirdParty contained lua_socket_connect_timeout +syn keyword ngxDirectiveThirdParty contained lua_socket_keepalive_timeout +syn keyword ngxDirectiveThirdParty contained lua_socket_log_errors +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 +syn keyword ngxDirectiveThirdParty contained lua_ssl_protocols +syn keyword ngxDirectiveThirdParty contained lua_ssl_trusted_certificate +syn keyword ngxDirectiveThirdParty contained lua_ssl_verify_depth +syn keyword ngxDirectiveThirdParty contained lua_thread_cache_max_entries +syn keyword ngxDirectiveThirdParty contained lua_transform_underscores_in_response_headers +syn keyword ngxDirectiveThirdParty contained lua_use_default_type +syn keyword ngxDirectiveThirdParty contained lua_worker_thread_vm_pool_size +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 +syn keyword ngxDirectiveThirdParty contained ssl_certificate_by_lua_block +syn keyword ngxDirectiveThirdParty contained ssl_certificate_by_lua_file +syn keyword ngxDirectiveThirdParty contained ssl_client_hello_by_lua_block +syn keyword ngxDirectiveThirdParty contained ssl_client_hello_by_lua_file +syn keyword ngxDirectiveThirdParty contained ssl_session_fetch_by_lua_block +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 + +" 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 +syn keyword ngxDirectiveThirdParty contained memc_connect_timeout +syn keyword ngxDirectiveThirdParty contained memc_flags_to_last_modified +syn keyword ngxDirectiveThirdParty contained memc_ignore_client_abort +syn keyword ngxDirectiveThirdParty contained memc_next_upstream +syn keyword ngxDirectiveThirdParty contained memc_pass +syn keyword ngxDirectiveThirdParty contained memc_read_timeout +syn keyword ngxDirectiveThirdParty contained memc_send_timeout +syn keyword ngxDirectiveThirdParty contained memc_upstream_fail_timeout +syn keyword ngxDirectiveThirdParty contained memc_upstream_max_fails + +" 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 + +" 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 +syn keyword ngxDirectiveThirdParty contained check_rule +syn keyword ngxDirectiveThirdParty contained denied_url +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 + +" 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 +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 +syn keyword ngxDirectiveThirdParty contained passenger_enabled +syn keyword ngxDirectiveThirdParty contained passenger_env_var +syn keyword ngxDirectiveThirdParty contained passenger_file_descriptor_log_file +syn keyword ngxDirectiveThirdParty contained passenger_fly_with +syn keyword ngxDirectiveThirdParty contained passenger_force_max_concurrent_requests_per_process +syn keyword ngxDirectiveThirdParty contained passenger_friendly_error_pages +syn keyword ngxDirectiveThirdParty contained passenger_group +syn keyword ngxDirectiveThirdParty contained passenger_headers_hash_bucket_size +syn keyword ngxDirectiveThirdParty contained passenger_headers_hash_max_size +syn keyword ngxDirectiveThirdParty contained passenger_ignore_client_abort +syn keyword ngxDirectiveThirdParty contained passenger_ignore_headers +syn keyword ngxDirectiveThirdParty contained passenger_instance_registry_dir +syn keyword ngxDirectiveThirdParty contained passenger_intercept_errors +syn keyword ngxDirectiveThirdParty contained passenger_load_shell_envvars +syn keyword ngxDirectiveThirdParty contained passenger_log_file +syn keyword ngxDirectiveThirdParty contained passenger_log_level +syn keyword ngxDirectiveThirdParty contained passenger_max_instances +syn keyword ngxDirectiveThirdParty contained passenger_max_instances_per_app +syn keyword ngxDirectiveThirdParty contained passenger_max_pool_size +syn keyword ngxDirectiveThirdParty contained passenger_max_preloader_idle_time +syn keyword ngxDirectiveThirdParty contained passenger_max_request_queue_size +syn keyword ngxDirectiveThirdParty contained passenger_max_request_queue_time +syn keyword ngxDirectiveThirdParty contained passenger_max_request_time +syn keyword ngxDirectiveThirdParty contained passenger_max_requests +syn keyword ngxDirectiveThirdParty contained passenger_memory_limit +syn keyword ngxDirectiveThirdParty contained passenger_meteor_app_settings +syn keyword ngxDirectiveThirdParty contained passenger_min_instances +syn keyword ngxDirectiveThirdParty contained passenger_monitor_log_file +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 +syn keyword ngxDirectiveThirdParty contained passenger_restart_dir +syn keyword ngxDirectiveThirdParty contained passenger_rolling_restarts +syn keyword ngxDirectiveThirdParty contained passenger_root +syn keyword ngxDirectiveThirdParty contained passenger_ruby +syn keyword ngxDirectiveThirdParty contained passenger_security_update_check_proxy +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 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 + +" 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 +syn keyword ngxDirectiveThirdParty contained postgres_output +syn keyword ngxDirectiveThirdParty contained postgres_pass +syn keyword ngxDirectiveThirdParty contained postgres_query +syn keyword ngxDirectiveThirdParty contained postgres_result_timeout +syn keyword ngxDirectiveThirdParty contained postgres_rewrite +syn keyword ngxDirectiveThirdParty contained postgres_server +syn keyword ngxDirectiveThirdParty contained postgres_set + +" https://github.com/openresty/rds-csv-nginx-module +syn keyword ngxDirectiveThirdParty contained rds_csv +syn keyword ngxDirectiveThirdParty contained rds_csv_buffer_size +syn keyword ngxDirectiveThirdParty contained rds_csv_content_type +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 + +" https://github.com/openresty/rds-json-nginx-module +syn keyword ngxDirectiveThirdParty contained rds_json +syn keyword ngxDirectiveThirdParty contained rds_json_buffer_size +syn keyword ngxDirectiveThirdParty contained rds_json_content_type +syn keyword ngxDirectiveThirdParty contained rds_json_errcode_key +syn keyword ngxDirectiveThirdParty contained rds_json_errstr_key +syn keyword ngxDirectiveThirdParty contained rds_json_format +syn keyword ngxDirectiveThirdParty contained rds_json_ret +syn keyword ngxDirectiveThirdParty contained rds_json_root +syn keyword ngxDirectiveThirdParty contained rds_json_success_property +syn keyword ngxDirectiveThirdParty contained rds_json_user_property + +" https://github.com/openresty/redis2-nginx-module +syn keyword ngxDirectiveThirdParty contained redis2_bind +syn keyword ngxDirectiveThirdParty contained redis2_buffer_size +syn keyword ngxDirectiveThirdParty contained redis2_connect_timeout +syn keyword ngxDirectiveThirdParty contained redis2_literal_raw_query +syn keyword ngxDirectiveThirdParty contained redis2_next_upstream +syn keyword ngxDirectiveThirdParty contained redis2_pass +syn keyword ngxDirectiveThirdParty contained redis2_query +syn keyword ngxDirectiveThirdParty contained redis2_raw_queries +syn keyword ngxDirectiveThirdParty contained redis2_raw_query +syn keyword ngxDirectiveThirdParty contained redis2_read_timeout +syn keyword ngxDirectiveThirdParty contained redis2_send_timeout + +" https://github.com/arut/nginx-rtmp-module +syn keyword ngxDirectiveThirdParty contained ack_window +syn keyword ngxDirectiveThirdParty contained application +syn keyword ngxDirectiveThirdParty contained buffer +syn keyword ngxDirectiveThirdParty contained buflen +syn keyword ngxDirectiveThirdParty contained busy +syn keyword ngxDirectiveThirdParty contained chunk_size +syn keyword ngxDirectiveThirdParty contained dash +syn keyword ngxDirectiveThirdParty contained dash_cleanup +syn keyword ngxDirectiveThirdParty contained dash_fragment +syn keyword ngxDirectiveThirdParty contained dash_nested +syn keyword ngxDirectiveThirdParty contained dash_path +syn keyword ngxDirectiveThirdParty contained dash_playlist_length +syn keyword ngxDirectiveThirdParty contained drop_idle_publisher +syn keyword ngxDirectiveThirdParty contained exec +syn keyword ngxDirectiveThirdParty contained exec_block +syn keyword ngxDirectiveThirdParty contained exec_kill_signal +syn keyword ngxDirectiveThirdParty contained exec_options +syn keyword ngxDirectiveThirdParty contained exec_play +syn keyword ngxDirectiveThirdParty contained exec_play_done +syn keyword ngxDirectiveThirdParty contained exec_publish +syn keyword ngxDirectiveThirdParty contained exec_publish_done +syn keyword ngxDirectiveThirdParty contained exec_pull +syn keyword ngxDirectiveThirdParty contained exec_push +syn keyword ngxDirectiveThirdParty contained exec_record_done +syn keyword ngxDirectiveThirdParty contained exec_static +syn keyword ngxDirectiveThirdParty contained hls_audio_buffer_size +syn keyword ngxDirectiveThirdParty contained hls_base_url +syn keyword ngxDirectiveThirdParty contained hls_cleanup +syn keyword ngxDirectiveThirdParty contained hls_continuous +syn keyword ngxDirectiveThirdParty contained hls_fragment_naming +syn keyword ngxDirectiveThirdParty contained hls_fragment_naming_granularity +syn keyword ngxDirectiveThirdParty contained hls_fragment_slicing +syn keyword ngxDirectiveThirdParty contained hls_fragments_per_key +syn keyword ngxDirectiveThirdParty contained hls_key_path +syn keyword ngxDirectiveThirdParty contained hls_key_url +syn keyword ngxDirectiveThirdParty contained hls_keys +syn keyword ngxDirectiveThirdParty contained hls_max_audio_delay +syn keyword ngxDirectiveThirdParty contained hls_max_fragment +syn keyword ngxDirectiveThirdParty contained hls_muxdelay +syn keyword ngxDirectiveThirdParty contained hls_nested +syn keyword ngxDirectiveThirdParty contained hls_path +syn keyword ngxDirectiveThirdParty contained hls_playlist_length +syn keyword ngxDirectiveThirdParty contained hls_sync +syn keyword ngxDirectiveThirdParty contained hls_type +syn keyword ngxDirectiveThirdParty contained hls_variant +syn keyword ngxDirectiveThirdParty contained idle_streams +syn keyword ngxDirectiveThirdParty contained interleave +syn keyword ngxDirectiveThirdParty contained live +syn keyword ngxDirectiveThirdParty contained max_connections +syn keyword ngxDirectiveThirdParty contained max_message +syn keyword ngxDirectiveThirdParty contained max_streams +syn keyword ngxDirectiveThirdParty contained meta +syn keyword ngxDirectiveThirdParty contained netcall_buffer +syn keyword ngxDirectiveThirdParty contained netcall_timeout +syn keyword ngxDirectiveThirdParty contained notify_method +syn keyword ngxDirectiveThirdParty contained notify_relay_redirect +syn keyword ngxDirectiveThirdParty contained notify_update_strict +syn keyword ngxDirectiveThirdParty contained notify_update_timeout +syn keyword ngxDirectiveThirdParty contained on_connect +syn keyword ngxDirectiveThirdParty contained on_disconnect +syn keyword ngxDirectiveThirdParty contained on_done +syn keyword ngxDirectiveThirdParty contained on_play +syn keyword ngxDirectiveThirdParty contained on_play_done +syn keyword ngxDirectiveThirdParty contained on_publish +syn keyword ngxDirectiveThirdParty contained on_publish_done +syn keyword ngxDirectiveThirdParty contained on_record_done +syn keyword ngxDirectiveThirdParty contained on_update +syn keyword ngxDirectiveThirdParty contained out_cork +syn keyword ngxDirectiveThirdParty contained out_queue +syn keyword ngxDirectiveThirdParty contained ping +syn keyword ngxDirectiveThirdParty contained ping_timeout +syn keyword ngxDirectiveThirdParty contained play +syn keyword ngxDirectiveThirdParty contained play_local_path +syn keyword ngxDirectiveThirdParty contained play_restart +syn keyword ngxDirectiveThirdParty contained play_temp_path +syn keyword ngxDirectiveThirdParty contained play_time_fix +syn keyword ngxDirectiveThirdParty contained publish_notify +syn keyword ngxDirectiveThirdParty contained publish_time_fix +syn keyword ngxDirectiveThirdParty contained pull +syn keyword ngxDirectiveThirdParty contained pull_reconnect +syn keyword ngxDirectiveThirdParty contained push +syn keyword ngxDirectiveThirdParty contained push_reconnect +syn keyword ngxDirectiveThirdParty contained record +syn keyword ngxDirectiveThirdParty contained record_append +syn keyword ngxDirectiveThirdParty contained record_interval +syn keyword ngxDirectiveThirdParty contained record_lock +syn keyword ngxDirectiveThirdParty contained record_max_frames +syn keyword ngxDirectiveThirdParty contained record_max_size +syn keyword ngxDirectiveThirdParty contained record_notify +syn keyword ngxDirectiveThirdParty contained record_path +syn keyword ngxDirectiveThirdParty contained record_suffix +syn keyword ngxDirectiveThirdParty contained record_unique +syn keyword ngxDirectiveThirdParty contained recorder +syn keyword ngxDirectiveThirdParty contained relay_buffer +syn keyword ngxDirectiveThirdParty contained respawn +syn keyword ngxDirectiveThirdParty contained respawn_timeout +syn keyword ngxDirectiveThirdParty contained rtmp +syn keyword ngxDirectiveThirdParty contained rtmp_auto_push +syn keyword ngxDirectiveThirdParty contained rtmp_auto_push_reconnect +syn keyword ngxDirectiveThirdParty contained rtmp_control +syn keyword ngxDirectiveThirdParty contained rtmp_socket_dir +syn keyword ngxDirectiveThirdParty contained rtmp_stat +syn keyword ngxDirectiveThirdParty contained rtmp_stat_stylesheet +syn keyword ngxDirectiveThirdParty contained session_relay +syn keyword ngxDirectiveThirdParty contained so_keepalive +syn keyword ngxDirectiveThirdParty contained stream_buckets +syn keyword ngxDirectiveThirdParty contained sync +syn keyword ngxDirectiveThirdParty contained wait_key +syn keyword ngxDirectiveThirdParty contained wait_video + +" https://github.com/openresty/set-misc-nginx-module +syn keyword ngxDirectiveThirdParty contained set_base32_alphabet +syn keyword ngxDirectiveThirdParty contained set_base32_padding +syn keyword ngxDirectiveThirdParty contained set_decode_base32 +syn keyword ngxDirectiveThirdParty contained set_decode_base64 +syn keyword ngxDirectiveThirdParty contained set_decode_base64url +syn keyword ngxDirectiveThirdParty contained set_decode_hex +syn keyword ngxDirectiveThirdParty contained set_encode_base32 +syn keyword ngxDirectiveThirdParty contained set_encode_base64 +syn keyword ngxDirectiveThirdParty contained set_encode_base64url +syn keyword ngxDirectiveThirdParty contained set_encode_hex +syn keyword ngxDirectiveThirdParty contained set_escape_uri +syn keyword ngxDirectiveThirdParty contained set_formatted_gmt_time +syn keyword ngxDirectiveThirdParty contained set_formatted_local_time +syn keyword ngxDirectiveThirdParty contained set_hashed_upstream +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 +syn keyword ngxDirectiveThirdParty contained set_quote_sql_str +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 + +" https://github.com/sflow/nginx-sflow-module +syn keyword ngxDirectiveThirdParty contained sflow + +" 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 + +" 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 +syn keyword ngxDirectiveThirdParty contained slowfs_cache_min_uses +syn keyword ngxDirectiveThirdParty contained slowfs_cache_path +syn keyword ngxDirectiveThirdParty contained slowfs_cache_purge +syn keyword ngxDirectiveThirdParty contained slowfs_cache_valid +syn keyword ngxDirectiveThirdParty contained slowfs_temp_path + +" https://github.com/openresty/srcache-nginx-module +syn keyword ngxDirectiveThirdParty contained srcache_buffer +syn keyword ngxDirectiveThirdParty contained srcache_default_expire +syn keyword ngxDirectiveThirdParty contained srcache_fetch +syn keyword ngxDirectiveThirdParty contained srcache_fetch_skip +syn keyword ngxDirectiveThirdParty contained srcache_header_buffer_size +syn keyword ngxDirectiveThirdParty contained srcache_ignore_content_encoding +syn keyword ngxDirectiveThirdParty contained srcache_max_expire +syn keyword ngxDirectiveThirdParty contained srcache_methods +syn keyword ngxDirectiveThirdParty contained srcache_request_cache_control +syn keyword ngxDirectiveThirdParty contained srcache_response_cache_control +syn keyword ngxDirectiveThirdParty contained srcache_store +syn keyword ngxDirectiveThirdParty contained srcache_store_hide_header +syn keyword ngxDirectiveThirdParty contained srcache_store_max_size +syn keyword ngxDirectiveThirdParty contained srcache_store_no_cache +syn keyword ngxDirectiveThirdParty contained srcache_store_no_store +syn keyword ngxDirectiveThirdParty contained srcache_store_pass_header +syn keyword ngxDirectiveThirdParty contained srcache_store_private +syn keyword ngxDirectiveThirdParty contained srcache_store_ranges +syn keyword ngxDirectiveThirdParty contained srcache_store_skip +syn keyword ngxDirectiveThirdParty contained srcache_store_statuses + +" https://github.com/kaltura/nginx-vod-module +syn keyword ngxDirectiveThirdParty contained vod +syn keyword ngxDirectiveThirdParty contained vod_align_segments_to_key_frames +syn keyword ngxDirectiveThirdParty contained vod_apply_dynamic_mapping +syn keyword ngxDirectiveThirdParty contained vod_base_url +syn keyword ngxDirectiveThirdParty contained vod_bootstrap_segment_durations +syn keyword ngxDirectiveThirdParty contained vod_cache_buffer_size +syn keyword ngxDirectiveThirdParty contained vod_clip_from_param_name +syn keyword ngxDirectiveThirdParty contained vod_clip_to_param_name +syn keyword ngxDirectiveThirdParty contained vod_drm_clear_lead_segment_count +syn keyword ngxDirectiveThirdParty contained vod_drm_enabled +syn keyword ngxDirectiveThirdParty contained vod_drm_info_cache +syn keyword ngxDirectiveThirdParty contained vod_drm_max_info_length +syn keyword ngxDirectiveThirdParty contained vod_drm_request_uri +syn keyword ngxDirectiveThirdParty contained vod_drm_single_key +syn keyword ngxDirectiveThirdParty contained vod_drm_upstream_location +syn keyword ngxDirectiveThirdParty contained vod_dynamic_clip_map_uri +syn keyword ngxDirectiveThirdParty contained vod_dynamic_mapping_cache +syn keyword ngxDirectiveThirdParty contained vod_encryption_iv_seed +syn keyword ngxDirectiveThirdParty contained vod_expires +syn keyword ngxDirectiveThirdParty contained vod_expires_live +syn keyword ngxDirectiveThirdParty contained vod_expires_live_time_dependent +syn keyword ngxDirectiveThirdParty contained vod_fallback_upstream_location +syn keyword ngxDirectiveThirdParty contained vod_force_continuous_timestamps +syn keyword ngxDirectiveThirdParty contained vod_force_playlist_type_vod +syn keyword ngxDirectiveThirdParty contained vod_force_sequence_index +syn keyword ngxDirectiveThirdParty contained vod_gop_look_ahead +syn keyword ngxDirectiveThirdParty contained vod_gop_look_behind +syn keyword ngxDirectiveThirdParty contained vod_ignore_edit_list +syn keyword ngxDirectiveThirdParty contained vod_initial_read_size +syn keyword ngxDirectiveThirdParty contained vod_lang_param_name +syn keyword ngxDirectiveThirdParty contained vod_last_modified +syn keyword ngxDirectiveThirdParty contained vod_last_modified_types +syn keyword ngxDirectiveThirdParty contained vod_live_mapping_cache +syn keyword ngxDirectiveThirdParty contained vod_live_response_cache +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 +syn keyword ngxDirectiveThirdParty contained vod_max_upstream_headers_size +syn keyword ngxDirectiveThirdParty contained vod_media_set_map_uri +syn keyword ngxDirectiveThirdParty contained vod_media_set_override_json +syn keyword ngxDirectiveThirdParty contained vod_metadata_cache +syn keyword ngxDirectiveThirdParty contained vod_min_single_nalu_per_frame_segment +syn keyword ngxDirectiveThirdParty contained vod_mode +syn keyword ngxDirectiveThirdParty contained vod_multi_uri_suffix +syn keyword ngxDirectiveThirdParty contained vod_notification_uri +syn keyword ngxDirectiveThirdParty contained vod_open_file_thread_pool +syn keyword ngxDirectiveThirdParty contained vod_output_buffer_pool +syn keyword ngxDirectiveThirdParty contained vod_parse_hdlr_name +syn keyword ngxDirectiveThirdParty contained vod_parse_udta_name +syn keyword ngxDirectiveThirdParty contained vod_path_response_postfix +syn keyword ngxDirectiveThirdParty contained vod_path_response_prefix +syn keyword ngxDirectiveThirdParty contained vod_performance_counters +syn keyword ngxDirectiveThirdParty contained vod_proxy_header_name +syn keyword ngxDirectiveThirdParty contained vod_proxy_header_value +syn keyword ngxDirectiveThirdParty contained vod_redirect_segments_url +syn keyword ngxDirectiveThirdParty contained vod_remote_upstream_location +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 +syn keyword ngxDirectiveThirdParty contained vod_status +syn keyword ngxDirectiveThirdParty contained vod_time_shift_param_name +syn keyword ngxDirectiveThirdParty contained vod_tracks_param_name +syn keyword ngxDirectiveThirdParty contained vod_upstream_extra_args +syn keyword ngxDirectiveThirdParty contained vod_upstream_location + +" https://github.com/vozlt/nginx-module-vts +syn keyword ngxDirectiveThirdParty contained vhost_traffic_status +syn keyword ngxDirectiveThirdParty contained vhost_traffic_status_average_method +syn keyword ngxDirectiveThirdParty contained vhost_traffic_status_bypass_limit +syn keyword ngxDirectiveThirdParty contained vhost_traffic_status_bypass_stats +syn keyword ngxDirectiveThirdParty contained vhost_traffic_status_display +syn keyword ngxDirectiveThirdParty contained vhost_traffic_status_display_format +syn keyword ngxDirectiveThirdParty contained vhost_traffic_status_display_jsonp +syn keyword ngxDirectiveThirdParty contained vhost_traffic_status_display_sum_key +syn keyword ngxDirectiveThirdParty contained vhost_traffic_status_dump +syn keyword ngxDirectiveThirdParty contained vhost_traffic_status_filter +syn keyword ngxDirectiveThirdParty contained vhost_traffic_status_filter_by_host +syn keyword ngxDirectiveThirdParty contained vhost_traffic_status_filter_by_set_key +syn keyword ngxDirectiveThirdParty contained vhost_traffic_status_filter_check_duplicate +syn keyword ngxDirectiveThirdParty contained vhost_traffic_status_filter_max_node +syn keyword ngxDirectiveThirdParty contained vhost_traffic_status_histogram_buckets +syn keyword ngxDirectiveThirdParty contained vhost_traffic_status_limit +syn keyword ngxDirectiveThirdParty contained vhost_traffic_status_limit_check_duplicate +syn keyword ngxDirectiveThirdParty contained vhost_traffic_status_limit_traffic +syn keyword ngxDirectiveThirdParty contained vhost_traffic_status_limit_traffic_by_set_key +syn keyword ngxDirectiveThirdParty contained vhost_traffic_status_set_by_filter +syn keyword ngxDirectiveThirdParty contained vhost_traffic_status_zone + +" https://github.com/openresty/xss-nginx-module +syn keyword ngxDirectiveThirdParty contained xss_callback_arg +syn keyword ngxDirectiveThirdParty contained xss_check_status +syn keyword ngxDirectiveThirdParty contained xss_get +syn keyword ngxDirectiveThirdParty contained xss_input_types +syn keyword ngxDirectiveThirdParty contained xss_output_type +syn keyword ngxDirectiveThirdParty contained xss_override_status + +" https://github.com/tg123/websockify-nginx-module +syn keyword ngxDirectiveThirdParty contained websockify_buffer_size +syn keyword ngxDirectiveThirdParty contained websockify_connect_timeout +syn keyword ngxDirectiveThirdParty contained websockify_pass +syn keyword ngxDirectiveThirdParty contained websockify_read_timeout +syn keyword ngxDirectiveThirdParty contained websockify_send_timeout + +" 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 + +hi def link ngxComment Comment +hi def link ngxParamComment Comment +hi def link ngxListenComment Comment +hi def link ngxVariable Identifier +hi def link ngxVariableString PreProc +hi def link ngxString String +hi def link ngxListenString String + +hi def link ngxBoolean Boolean +hi def link ngxDirectiveBlock Statement +hi def link ngxDirectiveImportant Type +hi def link ngxDirectiveListen Type +hi def link ngxDirectiveControl Keyword +hi def link ngxDirectiveError Constant +hi def link ngxDirectiveDeprecated Error +hi def link ngxDirective Identifier +hi def link ngxDirectiveThirdParty Special +hi def link ngxDirectiveThirdPartyDeprecated Error + +hi def link ngxListenOptions Keyword +hi def link ngxListenOptionsDeprecated Error + +let &cpo = s:save_cpo +unlet s:save_cpo + +let b:current_syntax = "nginx" diff --git a/debian/NEWS.Debian b/debian/NEWS.Debian deleted file mode 100644 index 0cba5c3..0000000 --- a/debian/NEWS.Debian +++ /dev/null @@ -1,50 +0,0 @@ -nginx (0.8.53-1) unstable; urgency=low - - As stated by upstream, the 0.7.x branch is consedered legacy and 0.8.x will - be the new stable branch. For this reason, the nginx maintainers decided to - upload 0.8.53 to unstable. - - -- Kartik Mistry Fri, 26 Nov 2010 19:42:09 +0530 - -nginx (0.7.59-1) unstable; urgency=low - - As stated by upstream, the 0.6.x branch is consedered legacy and 0.7.x will - be the new stable branch. For this reason, the nginx maintainers decided to - upload 0.7.59 to unstable. - - Should you get the following error while starting nginx: - - could not build the server_names_hash, you should increase - server_names_hash_bucket_size: 32 - - Please add the following parameter to your nginx.conf: - - server_names_hash_bucket_size 100; - - Where 100 is the size of your server names hash bucket. For more information - about this option, please read the following resources: - - http://wiki.nginx.org/NginxHttpCoreModule#server_names_hash_bucket_size - http://thread.gmane.org/gmane.comp.web.nginx.english/820/focus=821 - http://thread.gmane.org/gmane.comp.web.nginx.english/985/focus=989 - - -- Fabio Tranchitella Sun, 31 May 2009 18:30:10 +0200 - -nginx (0.6.30-2) unstable; urgency=low - - As of May 4th., nginx 0.5.x branch is considered legacy and 0.6.x will - be the new stable branch. The announcement was made by Igor Sysoev when - releasing the last 0.5.x version, nginx 0.5.36. - - Debian, the universal operating system, has provided binary packages for - both 0.5 and 0.6 branches in unstable and experimental, and will now offer - only 0.6 packages in the unstable distribution, starting with the - 0.6.30-1 package. - - In the future, Debian will also provide experimental packages for the - next testing branch of nginx, at the moment upstream announces it. - - Should you have any problem with nginx in Debian, please file a bug in - the Debian Bug Tracking System. - - -- Fabio Tranchitella Mon, 12 May 2008 14:24:53 +0200 diff --git a/debian/README.Debian b/debian/README.Debian deleted file mode 100644 index 510ec0b..0000000 --- a/debian/README.Debian +++ /dev/null @@ -1,9 +0,0 @@ -README for Debian ------------------ - - Files under /var/www/ are not supported as per Debian Policy. - Please see: http://lintian.debian.org/tags/dir-or-file-in-var-www.html and, - http://www.pathname.com/fhs/pub/fhs-2.3.html#THEVARHIERARCHY for more - details and explanations. - - -- Kartik Mistry Fri, 05 Mar 2010 13:31:15 +0530 diff --git a/debian/README.source b/debian/README.source new file mode 100644 index 0000000..dc71efa --- /dev/null +++ b/debian/README.source @@ -0,0 +1,63 @@ +Debian Packaging +================ + +We use git-buildpackage for packaging. + +Workflow for Unstable +===================== + +We use the standard git-buildpackage workflow. + +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 gradually convert all modules to dynamic +as they add support for it. + +[0] https://www.nginx.com/blog/dynamic-modules-nginx-1-9-11/ + +Workflow for Experimental +========================= + +Nginx mainline releases (1.11.x series) are been packaged for experimental, +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 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**. + +This is a brief description of our experimental branches and how we are using +them. + +* experimental-base + Force-pushed when origin/master changes. + + experimental-base tracks the changes needed for building the 1.11.x branch, + such as new configure parameters, etc. On new 1.11.x releases, it is rebased + on origin/master so it is always up-to-date with our latest packaging work. + +* experimental + Force-pushed on every 1.11.x release. + + This branch points to the latest 1.11.x release. + Before release this branch is reset to experimental-base, and then merged + with the new upstream-1.11 branch. Finally all the release specific changes + are commited (changelog entry etc) and the build is made. + +* upstream-1.11 + Pushed on every 1.11.x release. + + Before a new 1.11.x release origin/upstream is dummy merged (-s ours) into + ustream-1.11. This is a technicallity so we can avoid resolving conflicts + when a new 1.10.x release happens between two experimental releases. + +Older 1.11.x releases are not referenced by any branch, but they can be found +by the relevant debian/* tag. + + diff --git a/debian/apport/source_nginx.py b/debian/apport/source_nginx.py new file mode 100644 index 0000000..aec6e8e --- /dev/null +++ b/debian/apport/source_nginx.py @@ -0,0 +1,19 @@ +''' +apport package hook for nginx packages + +Copyright (c) 2015, Thomas Ward +''' + +import apport.hookutils +import os +import subprocess + +def add_info(report, ui): + if (report['Package'].split()[0] != 'nginx-common' + and report['ProblemType'] == 'Package' + and os.path.isdir('/run/systemd/system')): + report['Journalctl_Nginx.txt'] = apport.hookutils.command_output( + ['journalctl', '-xe', '--unit=nginx.service']) + report['SystemctlStatusFull_Nginx.txt'] = subprocess.Popen( + ['systemctl', '-l', 'status', 'nginx.service'], + stdout=subprocess.PIPE).communicate()[0] diff --git a/debian/autoscripts/postinst-nginx b/debian/autoscripts/postinst-nginx new file mode 100644 index 0000000..aa376d5 --- /dev/null +++ b/debian/autoscripts/postinst-nginx @@ -0,0 +1,26 @@ +for confpair in #NAMES# ; do + from=$(echo $confpair | cut -d: -f1) + to=$(echo $confpair | cut -d: -f2) + + if [ -L /etc/nginx/modules-enabled/$to.removed ]; then + rm /etc/nginx/modules-enabled/$to.removed + removed_link=true + else + removed_link=false + fi + + # Symlink on + # 1) Fresh installations + # 2) Reinstalls after automatic removes (preserve admin actions) + if [ -z "$2" -o "$removed_link" = "true" ]; then + ln -sf /usr/share/nginx/modules-available/$from \ + /etc/nginx/modules-enabled/$to + fi +done + +if [ "$1" = "configure" ] ; then + if which dpkg-trigger >/dev/null 2>&1 ; then + dpkg-trigger --no-await nginx-reload + fi + +fi diff --git a/debian/autoscripts/postrm-nginx b/debian/autoscripts/postrm-nginx new file mode 100644 index 0000000..8769983 --- /dev/null +++ b/debian/autoscripts/postrm-nginx @@ -0,0 +1,28 @@ +if [ "$1" = "purge" ] ; then + for confpair in #NAMES# ; do + from=$(echo $confpair | cut -d: -f1) + to=$(echo $confpair | cut -d: -f2) + + if [ -L /etc/nginx/modules-enabled/$to ]; then + rm /etc/nginx/modules-enabled/$to + fi + if [ -L /etc/nginx/modules-enabled/$to.removed ]; then + rm /etc/nginx/modules-enabled/$to.removed + fi + done +fi + +if [ "$1" = "remove" ] ; then + for confpair in #NAMES# ; do + from=$(echo $confpair | cut -d: -f1) + to=$(echo $confpair | cut -d: -f2) + + if [ -L /etc/nginx/modules-enabled/$to ]; then + mv /etc/nginx/modules-enabled/$to /etc/nginx/modules-enabled/$to.removed + fi + done + + if which dpkg-trigger >/dev/null 2>&1 ; then + dpkg-trigger --no-await nginx-reload + fi +fi diff --git a/debian/autoscripts/prerm-nginx b/debian/autoscripts/prerm-nginx new file mode 100644 index 0000000..c36a883 --- /dev/null +++ b/debian/autoscripts/prerm-nginx @@ -0,0 +1,10 @@ +if [ "$1" = "remove" ] || [ "$1" = "deconfigure" ] ; then + for confpair in #NAMES# ; do + from=$(echo $confpair | cut -d: -f1) + to=$(echo $confpair | cut -d: -f2) + + if [ -L /etc/nginx/modules-enabled/$to ]; then + mv /etc/nginx/modules-enabled/$to /etc/nginx/modules-enabled/$to.removed + fi + done +fi diff --git a/debian/changelog b/debian/changelog index 5a07c41..8ec0edd 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,46 +1,1680 @@ -nginx (1.2.1-2.2+wheezy4+deb7u1) wheezy-security; urgency=high +nginx (1.26.3-3) unstable; urgency=medium - * CVE-2017-7529: Fix an vulnerability in the range filter. A specially - crafted request could have resulted in an integer overflow and incorrect - processing of ranges, potentially resulting in sensitive information - leak. (Closes: #868109) + [ 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 - -- Chris Lamb Thu, 13 Jul 2017 09:06:49 +0100 + [ 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) -nginx (1.2.1-2.2+wheezy4) wheezy-security; urgency=high + -- 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 + * d/nginx-*.postinst: fixed postinst script, used invoke-rc.d instead of + pidof and ad-hoc tests, tnx Gioele Barabucci + * d/tests/ssi-module-test added, simple ngx_http_ssi_filter_module test + * 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. + + [ 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 + + [ Jan Mojžíš ] + * New upstream version 1.22.1 + * d/control: added implicit version of dependency libnginx-mod-http-lua + (>=1:0.10.22-3~), it is a rebuilt version with nginx 1.22.1. + * Added libnginx-mod-http-lua powerpc architecture + + [ Debian Janitor ] + * Fix day-of-week for changelog entry 0.5.11-1. + + -- Jan Mojžíš Thu, 10 Nov 2022 18:21:43 +0100 + +nginx (1.22.0-3.1) unstable; urgency=medium + + * Non-maintainer upload. + * No source change upload to rebuild with debhelper 13.10. + + -- Michael Biebl Sat, 15 Oct 2022 12:28:07 +0200 + +nginx (1.22.0-3) unstable; urgency=medium + + * d/changelog: fixed typo in bug number 61261 -> 861261 (Closes: 861261) + * d/p/nginx-ssl_cert_cb_yield.patch added (Closes: 884434) + * http-lua: removed the http-lua module and moved it to a separate package + + -- Jan Mojžíš Wed, 17 Aug 2022 18:38:15 +0200 + +nginx (1.22.0-2) unstable; urgency=medium + + [ Miao Wang ] + * adding a new libnginx-mod-http-ndk-dev package including necessary + headers to build a 3rd party module depending on ndk. + + [ Jan Mojžíš ] + * d/nginx-common.nginx.service: added Systemd dependency + Wants=network-online.target and updated Systemd "After" dependency to + recommended NGINX values, namely: + - network-online.target (Closes: 861261) (Closes: 1000406) + - remote-fs.target (Closes: 898896) + - nss-lookup.target + * d/p/0003-define_gnu_source-on-other-glibc-based-platforms.patch: forwarded + to upstream (Closes: 859082) + * d/t/reboot: added, tests if nginx works after reboot + * d/m/p/http-subs-filter/pcre2.patch: added PCRE2 support + * d/p/nginx-fix-pidfile.patch: Fix NGINX PIDfile handling to avoid + SystemD race condition, this fix is backported from Ubuntu (Closes: 876365) + * d/apport/source_nginx.py: Add apport hooks for additional bug + information gathering, the script is backported from Ubuntu (Closes: 963668) + * d/nginx-common.install: Add install rule for apport hooks. + + [ Debian Janitor ] + * Remove constraints unnecessary since buster: + + Build-Depends: Drop versioned constraint on dpkg-dev. + + nginx-common: Drop versioned constraint on lsb-base in Depends. + + nginx-core: Drop versioned constraint on nginx in Breaks. + + nginx-full: Drop versioned constraint on nginx in Breaks. + + nginx-light: Drop versioned constraint on nginx in Breaks. + + nginx-extras: Drop versioned constraint on nginx in Breaks. + + libnginx-mod-http-perl: Drop versioned constraint on nginx-extras in + Replaces. + + Remove 5 maintscript entries from 1 files. + + -- Jan Mojžíš Sun, 07 Aug 2022 16:14:59 +0200 + +nginx (1.22.0-1) unstable; urgency=medium + + [ Thomas Ward ] + * New upstream release (1.22.0) + * Additional changes: + * d/conf/mime.types: Fix a typo in font/woff2 extension in + mime.types. (Closes: #1010798) + * d/upstream/signing-key.asc: Additional signing keys observed + in upstream (Konstantin Pavlov ) during + upstream merge/import by Thomas Ward, additional signing key + was added to the keyring while keeping Maxim's key in signing + keys as well. + * d/copyright: Updated copyright for src/core/ngx_murmurhash.c + and debian/modules/http-ndk/src/hash/murmurhash2.c to be + public-domain (Closes: #1011936) + * d/control: Use libluajit-5.1-dev for s390x. + Due to src:luajit2 landing in Unstable, superseding src:luajit, + and due to luajit2 having s390x support, we can use s390x now + with luajit instead of standard Lua. + Thanks to Paul Gevers for the heads up on luajit2 supporting s390x. + * d/control: Use liblua for ppc64el - src:luajit2 is still not ppc64el + stable and there seems to be nobody willing to support it. (Closes: 1013807) + + [ Jan Mojžíš ] + * d/patches/CVE-2021-3618.patch removed, fix is included in new upstream + release + * d/copyright: bump nginx copyright years + * d/copyright: added copyright for src/stream/ngx_stream_set_module.c + * d/copyright: removed copyright for src/http/v2/ngx_http_v2_huff_encode.c + * d/control: bump Standards-Version to 4.6.1, no changes + + [ Bastian Germann ] + * d/copyright: Update copyright for d/debhelper/* + + [ Miao Wang ] + * dh_nginx: support auto generating module config files + * adding a new nginx-dev package including necessary headers and debhelper + scripts to build and package a 3rd party module. (Closes: 985133) + * d/p/0002-Make-sure-signature-stays-the-same-in-all-nginx-buil.patch + removed, because feature already implemented with --with-compat configure + option since 1.11.5 + + -- Thomas Ward Tue, 10 May 2022 12:08:02 -0400 + +nginx (1.20.2-2) unstable; urgency=medium + + [ Thomas Ward ] + * d/patches/CVE-2021-3618.patch: Include upstream changeset from NGINX + that adds mitigations into the Mail module for CVE-2021-3618.patch. + (Closes: #991328) + + [ Jan Mojžíš ] + * d/p/0003-define_gnu_source-on-other-glibc-based-platforms.patch update, + fixes build on hurd-i386 platform + + -- Thomas Ward Wed, 04 May 2022 16:04:59 -0400 + +nginx (1.20.2-1) unstable; urgency=medium + + [ OndÅ™ej Nový ] + * d/control: Update Uploaders for new maintainers. + + [ Thomas Ward ] + * Update to latest upstream Stable version (1.20.2) (Closes: #1008855) + * d/patches/Resolver-fixed-off-by-one-write-in-ngx_resolver + _copy.patch: Drop CVE-2021-23017 patch, as this is fixed in 1.20.1 + and we are now using 1.20.2 which already contains the patch. + * Refreshed d/patches/0002-Make-sure-signature-stays-the-same- + in-all-nginx-buil.patch (fuzz thanks to 1.20.2) + * d/conf/mime.types: Update mime.types to more match upstream mime.types + and include upstream changes with mime.types from 1.21.x via nginx.org + mercurial repository versions. + * d/control: Remove self from Uploaders per other Debian devs, who want + that commit to be done by someone on the current uploaders/maintainers + group instead. + + -- Thomas Ward Tue, 19 Apr 2022 09:50:42 -0400 + +nginx (1.18.0-9) unstable; urgency=medium + + [ Jan Mojžíš ] + * http-lua: Downgrade to 0.10.13 (Closes: #1008787). + * http-lua: Backport upstream bugfix for segfault in nginx core >= 1.15.0 + when libnginx-mod-http-lua is loaded and init_worker_by_lua* is used. + * d/control: Add mips64el,ppc64,kfreebsd-amd64 to list of luajit platforms. + * d/control: fix Homepage nginx.net -> nginx.org (Closes: #976158) + + [ Thomas Ward ] + * d/watch: Update watch syntax to match all even versions of NGINX releases + rather than use a watch syntax that is static to one specific version. + This will fix the untracked "New upstream stable versions" problem. + * d/control: Update 'uploaders' as Thomas Ward is now a maintainer in + the Salsa repository. + + -- Jan Mojžíš Tue, 05 Apr 2022 19:11:47 +0200 + +nginx (1.18.0-8) unstable; urgency=medium + + * Restore patch: + d/p/Resolver-fixed-off-by-one-write-in-ngx_resolver_copy.patch + + -- OndÅ™ej Nový Tue, 15 Mar 2022 13:23:06 +0100 + +nginx (1.18.0-7) unstable; urgency=medium + + [ OndÅ™ej Nový ] + * d/p/CVE-2019-20372.patch: Drop, applied upstream. + * http-auth-pam: Upgrade to 1.5.3. + * http-echo: Upgrade to 0.62. + * nchan: Upgrade to 1.2.15. + * http-fancyindex: Upgrade to 0.5.2. + * rtmp: Upgrade to 1.2.2. + * http-lua: Upgrade to 0.10.15 (Closes: #994178). + * http-lua: Rebase patch. + * nchan: Drop GCC 10 patch, applied upstream. + * d/watch: Bump version to 4. + * Bump standards version to 4.6.1 (no changes). + * d/copyright: Bump my copyright year. + + [ OndÅ™ej Surý ] + * Add arm64 and ppc64el to list of luajit platforms. + + [ Athos Ribeiro ] + * d/nginx-common.nginx.service: Fix service shutdown description to mention + SIGQUIT instead of SIGSTOP (LP: #1919965). + + -- OndÅ™ej Nový Tue, 15 Mar 2022 11:50:18 +0100 + +nginx (1.18.0-6.1) unstable; urgency=high + + * Non-maintainer upload. + * Resolver: fixed off-by-one write in ngx_resolver_copy() (CVE-2021-23017) + (Closes: #989095) + + -- Salvatore Bonaccorso Sat, 29 May 2021 16:21:37 +0200 + +nginx (1.18.0-6) unstable; urgency=medium + + * Fix GCC-10 compatibility (Closes: #957605). + + -- OndÅ™ej Nový Wed, 19 Aug 2020 15:27:02 +0200 + +nginx (1.18.0-5) unstable; urgency=medium + + * Prevented request smuggling in LUA + CVE-2020-11724 + Closes: #964950 + + -- OndÅ™ej Nový Tue, 14 Jul 2020 10:08:15 +0200 + +nginx (1.18.0-4) unstable; urgency=medium + + * Revert: libnginx-mod-* now depends on nginx- (Closes: #963860). + * Update ngx_http_auth_pam_module upstream URL. + * libnginx-mod-* recommends nginx now. + * http-auth-pam: Upgrade to 1.5.2 (Closes: #963567). + * d/copyright: Bump year of http-auth-pam. + + -- OndÅ™ej Nový Fri, 03 Jul 2020 09:34:49 +0200 + +nginx (1.18.0-3) unstable; urgency=medium + + * Source-only upload to allow migration. + + -- OndÅ™ej Nový Thu, 11 Jun 2020 15:14:59 +0200 + +nginx (1.18.0-2) unstable; urgency=medium + + [ OndÅ™ej Nový ] + * d/copyright: + - Update for upstream release + - Add Thomas Ward from Ubuntu for debian/* + * d/conf/sites-available/default: Update PHP path for PHP 7.4 + * d/conf/nginx.conf: + - Enable TLSv1.3 + - Remove tcp_nodelay on, which is same as default + - Remove keepalive_timeout 65 and use default value 75s. + - Remove trailing whitespaces + * Introduce nginx-core and make it new default for "nginx" + * Add stream-geoip and stream-geoip2 modules + * d/ngx-conf: Convert to Python 3 + * d/control: Add GeoIP2 into description + * Build dynamic modules only in extras flavour + * libnginx-mod-* now depends on nginx- + * Check if port 80 is free before starting during install + + [ OndÅ™ej Surý ] + * http-geoip2: Add ngx_http_geoip2_module 3.3 + + -- OndÅ™ej Nový Fri, 05 Jun 2020 18:28:40 +0200 + +nginx (1.18.0-1) unstable; urgency=medium + + [ OndÅ™ej Nový ] + * New upstream version 1.18.0 + * Add REMOTE_USER fastcgi param + * Use debhelper-compat instead of debian/compat + * Replace dh_systemd_enable with dh_installsystemd + * Set Rules-Requires-Root: no + * d/rules/dh_installinit: Replace --no-restart-on-upgrade with + --no-stop-on-upgrade + * Bump debhelper compat level to 13 + * Use package.maintscript instead of dpkg-maintscript-helper + * Bump standards version to 4.5.0 + * d/watch: Change to 1.18.x + * d/patches/CVE-2019-20372.patch: Rebase + * Convert d/ngxmod to Python 3 (Closes: #953025) + * nchan: Upgrade to 1.2.7 + * http-fancyindex: Upgrade to 0.4.4 + * d/copyright: Add myself for Debian part + * Add myself as uploader + + [ Mohamed Akram ] + * Enable --with-compat configure option (Closes: #897926) + + -- OndÅ™ej Nový Fri, 29 May 2020 19:03:30 +0200 + +nginx (1.16.1-3) unstable; urgency=high + + * Handle CVE-2019-20372, error page request smuggling + (Closes: #948579) + + -- Christos Trochalakis Sat, 11 Jan 2020 09:36:00 +0200 + +nginx (1.16.1-2) unstable; urgency=medium + + * http-lua: Downgrade to 0.10.13 (Closes: #941917) + Temporary fix FTBFS on architectures where Luajit is not available. + + -- Christos Trochalakis Sat, 12 Oct 2019 17:59:23 +0300 + +nginx (1.16.1-1) unstable; urgency=medium + + * New upstream version (Closes: #929200) + * Follow stable 1.16 releases (Closes: #929199) + * Drop already included debian patches + * http-ndk: Upgrade to 0.3.1 + * http-lua: Upgrade to 0.10.15 + + -- Christos Trochalakis Mon, 09 Sep 2019 18:24:43 +0300 + +nginx (1.14.2-3) unstable; urgency=high + + * Backport upstream fixes for 3 CVEs (Closes: #935037) + Those fixes affect Nginx HTTP/2 implementation, which might cause + excessive memory consumption and CPU usage. + (CVE-2019-9511, CVE-2019-9513, CVE-2019-9516). + + -- Christos Trochalakis Mon, 19 Aug 2019 11:30:08 +0300 + +nginx (1.14.2-2) unstable; urgency=medium + + [ Kartik Mistry ] + * po/tr.po: + + Added Turkish translation. Thanks Atila KOÇ + (Closes: #915728) [ Christos Trochalakis ] - * Fixes multiple resolver CVEs, - CVE-2016-0742, CVE-2016-0746, CVE-2016-0747 - Closes: #812806 + * http-dav-ext: Upgrade to 3.0.0 (Closes: #851651) + * Use a minimal export of the upstream signing key + * Bump Standards-Version, no changes needed - -- Christos Trochalakis Thu, 28 Jan 2016 13:42:29 +0200 + -- Christos Trochalakis Thu, 27 Dec 2018 12:49:34 +0200 -nginx (1.2.1-2.2+wheezy3) wheezy-security; urgency=high +nginx (1.14.2-1) unstable; urgency=medium - * debian/patches/fix-CVE-2014-3616.patch: - CVE-2014-3616: It was possible to reuse cached SSL sessions in - unrelated contexts, allowing virtual host confusion attacks in some - configurations by an attacker in a privileged network position. + [ Olaf van der Spek ] + * Reference PHP 7.3 (Closes: 913250) + + [ Christos Trochalakis ] + * Adjust fastcgi_split_path_info snippet to handle the `/example.php/` case + (Closes: #911398) + + -- Christos Trochalakis Thu, 13 Dec 2018 10:05:37 +0200 + +nginx (1.14.1-1) unstable; urgency=medium + + [ Kartik Mistry ] + * Removed unused lintian override. + * Fixed trailing whitespaces in changelog. + + [ Christos Trochalakis ] + * New upstream version. (Closes: #913090) + + CVE-2018-16843 Excessive memory usage in HTTP/2 + + CVE-2018-16844 Excessive CPU usage in HTTP/2 + + CVE-2018-16845 Memory disclosure in the ngx_http_mp4_module + + -- Christos Trochalakis Wed, 07 Nov 2018 07:16:00 +0200 + +nginx (1.14.0-1) unstable; urgency=medium + + [ Kartik Mistry ] + * debian/control: + + Removed duplicate Build-Depends. + + Use https in Homepage. + + [ Christos Trochalakis ] + * http-lua: Upgrade to 0.10.13 + * http-lua: Drop our OpenSSL patch, OpenSSL 1.1 is now supported upstream + * http-fancyindex: Upgrade to 0.4.3 + * Order nginx after nss-lookup.target to synchronize host/network name lookups + (Closes: #900790) + * Merge ru translations. + Thanks to Lev Lamberov (Closes: #883104) + + -- Christos Trochalakis Fri, 31 Aug 2018 15:28:04 +0300 + +nginx (1.13.12-1) unstable; urgency=medium + + * New upstream version + + -- Christos Trochalakis Wed, 11 Apr 2018 08:19:23 +0300 + +nginx (1.13.11-1) unstable; urgency=medium + + * New upstream version + + -- Christos Trochalakis Tue, 10 Apr 2018 14:55:11 +0300 + +nginx (1.13.10-1) unstable; urgency=medium + + * New upstream version + + -- Christos Trochalakis Wed, 21 Mar 2018 16:16:22 +0200 + +nginx (1.13.9-1) unstable; urgency=medium + + [ Michael Lustfield ] + * Remove non-uploading users + + [ Christos Trochalakis ] + * New upstream version 1.13.9 + * Move packaging repository to salsa.debian.org + * Bump Standards-Version to 4.1.3, no changes needed + + -- Christos Trochalakis Wed, 21 Feb 2018 11:24:53 +0200 + +nginx (1.13.8-1) unstable; urgency=medium + + * New upstream release. + + -- Christos Trochalakis Wed, 27 Dec 2017 09:24:36 +0200 + +nginx (1.13.7-1) unstable; urgency=medium + + [ Christos Trochalakis ] + * New upstream version 1.13.7 + * Bump Standards-Version, no changes needed + * debian/watch: switch to HTTPS for the upstream check + + [ Mpampis Kostas ] + * Automate modules watch & upgrade process (Closes: #869499) + + [ Christos Trochalakis ] + * Bits & pieces for ngxmod + * http-headers-more-filter: Upgrade to 0.33 + * http-echo: Upgrade to 0.61 + * http-lua: Upgrade to 0.10.11 + * http-dav-ext: Upgrade to 0.1.0 (Closes: #878611) + * http-fancyindex: Upgrade to 0.4.2 + * rtmp: Upgrade to 1.2.1 (Closes: #880718) + + -- Christos Trochalakis Thu, 14 Dec 2017 11:04:36 +0200 + +nginx (1.13.6-2) unstable; urgency=medium + + * rtmp: Ship docs & examples (Closes: #878368) + + -- Christos Trochalakis Fri, 13 Oct 2017 12:59:28 +0300 + +nginx (1.13.6-1) unstable; urgency=medium + + * New upstream version + * Normalize module paths in packaging repository + * Bump Standards-Version, no changes needed + * Drop dh-systemd dependency since we depend on debhelper >= 10 + + -- Christos Trochalakis Thu, 12 Oct 2017 10:37:29 +0300 + +nginx (1.13.5-1) unstable; urgency=medium + + * New upstream version 1.13.5 + * doc: Improve example WordPress configuration + Thanks to Larry Holish (Closes: #863343) + * Remove upstart conffile (Closes: #874319) + + -- Christos Trochalakis Wed, 06 Sep 2017 10:10:24 +0300 + +nginx (1.13.4-1) unstable; urgency=medium + + * New upstream version 1.13.4 + * nginx-lua: + + Add a simple lua autopkgtest + + Discover LuaJIT 2.1 (FTBFS) (Closes: #873319) + + Update to v0.10.10 + + Update OpenSSL 1.1 patch + + Drop patch to build against Nginx 1.11.11, now included upstream + * tests: Fix race between reload and curl's http request + * Explicitly disable autoreconf (debhelper 10) + * Drop Upstart configuration + * Bump Standards to 4.1.0 + + Switch all packages to Priority optional, extra is considered deprecated + + -- Christos Trochalakis Tue, 29 Aug 2017 10:49:03 +0300 + +nginx (1.13.3-1) unstable; urgency=high + + * New upstream version 1.13.3. + Fixes CVE-2017-7529 (Closes: #868109) + * Drop gzip_disable "msie6" directive. (Closes: #867024) + + -- Christos Trochalakis Wed, 12 Jul 2017 11:20:27 +0300 + +nginx (1.13.2-1) unstable; urgency=medium + + [ Christos Trochalakis ] + * New upstream version 1.13.2. + * Fix nginx-cache-purge segfaults (Closes: #866750) + * Merge ca translations. + Thanks to Alytidae (Closes: #865996) + * Merge es translations. + Thanks to Jonathan Bustillos (Closes: #855610) + * Merge pt translations. + Thanks to Rui Branco (Closes: #858741) + * Bump Standards to 4.0.0. + - Switch the copyright-format URL to https. + + [ Nicolas Dandrimont ] + * Introduce libnginx-mod-rtmp (Closes: #843777) + + -- Christos Trochalakis Mon, 03 Jul 2017 13:44:59 +0300 + +nginx (1.13.1-2) unstable; urgency=medium + + * Upload to unstable. + + -- Christos Trochalakis Tue, 20 Jun 2017 14:16:52 +0300 + +nginx (1.13.1-1) experimental; urgency=medium + + * New upstream version 1.13.1. + + -- Christos Trochalakis Wed, 31 May 2017 11:41:59 +0300 + +nginx (1.13.0-1) experimental; urgency=medium + + * New upstream release. + We now target nginx mainline (1.13.x). + + -- Christos Trochalakis Wed, 10 May 2017 11:40:38 +0300 + +nginx (1.12.0-1) experimental; urgency=medium + + [ Michael Lustfield ] + * debian/rules: + - Configure build flags to work with other arches and downstreams. + Thanks to Thomas Ward. + + [ Christos Trochalakis ] + * New upstream release. + * Patch nginx-upstream-fair to build against nginx 1.11.6. + * Patch nginx-lua to build against nginx 1.11.11. + * Patch nginx-echo to build against nginx 1.11.11. + * Drop curve list patch, it's included upstream. + * Drop perl build flags patch, it is now handled upstream. + * Enable SSL Preread builtin module on nginx-full & nginx-extras. + (Closes: #854214) + * Switch to debhelper 10, no changes needed. + + -- Christos Trochalakis Fri, 05 May 2017 11:16:30 +0300 + +nginx (1.10.3-1) unstable; urgency=medium + + * New upstream release. (Closes: #855113) + * Update Vcs fields to the new location. + The repo is now moved under the pkg-nginx namespace. + + -- Christos Trochalakis Wed, 15 Feb 2017 09:58:13 +0200 + +nginx (1.10.2-4) unstable; urgency=medium + + * Switch module reloading logic to dpkg triggers. + * Enable modules after a remove -> install cycle. + * Move module patches to debian/modules/patches. + * Backport curve list support from 1.11.x. (Closes: #846085) + * Add a NEWS entry regarding dynamic modules. + * Merge de,fr,nl,pt_BR,da translations. + Thanks to Chris Leick. (Closes: #843770) + Thanks to Julien Patriarca. (Closes: #844712) + Thanks to Frans Spiesschaert. (Closes: #845693) + Thanks to Adriano Rafael Gomes. (Closes: #846522) + Thanks to Joe Dalton. (Closes: #850857) + + -- Christos Trochalakis Sun, 22 Jan 2017 12:19:30 +0200 + +nginx (1.10.2-3) unstable; urgency=medium + + [ Michael Lustfield ] + * debian/conf/sites-enabled/default: + + Correcting location of default php-fpm socket. (Closes: #846145) + + [ Christos Trochalakis ] + * debian/rules: Correctly clean patched modules. + Thanks to Sven-Haegar Koch for the initial patch. (Closes: #844506) + * mod: Upgrade nchan to 1.0.8. (Closes: #844473) + * mod: Upgrade nginx-lua to 0.10.7. + * Update nginx-lua OpenSSL 1.1.0 patch. + * Reactivate PIE. + Thanks to Markus Waldeck for the suggestion. + * mod: Check if nginx binary exists before reloading. + * mod: Upgrade headers-mode to 0.32. + * mod: Upgrade development kit to 0.3.0. + + -- Christos Trochalakis Sat, 24 Dec 2016 12:11:21 +0200 + +nginx (1.10.2-2) unstable; urgency=medium + + * Build against OpenSSL 1.1.0. (Closes: #828453) + + Patch for nginx-lua by Alessandro Ghedini. + + Patch for nginx-upstream-fair by Kurt Roeckx. + * debian/modules: + + Rethink module patching logic. + + Convert dav-ext to a dynamic module package: + o libnginx-mod-http-dav-ext + + -- Christos Trochalakis Sat, 12 Nov 2016 09:18:12 +0200 + +nginx (1.10.2-1) unstable; urgency=high + + [ Christos Trochalakis ] + * New upstream release. + * debian/nginx-common.postinst: + + CVE-2016-1247: Secure log file handling (owner & permissions) + against privilege escalation attacks. /var/log/nginx is now owned + by root:adm. Thanks ro Dawid Golunski for the report. + Changing /var/log/nginx permissions effectively reopens #701112, + since log files can be world-readable. This is a trade-off until + a better log opening solution is implemented upstream (trac:376). + (Closes: #842295) + * debian/control: + + Version depend on lsb-base (>= 3.0-6). + Fixes lintian init.d-script-needs-depends-on-lsb-base. + * debian/nginx-*.lintian-overrides: + + Drop unused spelling-error-in-binary override. + + [ Michael Lustfield ] + * debian/conf/sites-available/default: + + Updated PHP sample configuration block. (Closes: #841230) + + -- Christos Trochalakis Sat, 29 Oct 2016 08:45:09 +0300 + +nginx (1.10.1-3) unstable; urgency=medium + + * debian/control: + + Drop nginx-*-dbg packages in favor of autogenerated -dbgsym packages. + + Remove relic Breaks/Replaces from nginx-common. + + Fix lsb-base dependencies. + + Switch Maintainer to the Nginx Packaging Team and keep active maintainers + as uploaders. Jose, Fabio, Dmitry & Cyril, thanks a lot for all your + contributions! + + -- Christos Trochalakis Thu, 15 Sep 2016 15:20:58 +0300 + +nginx (1.10.1-2) unstable; urgency=medium + + [ Christos Trochalakis ] + * debian/control: + + Don't allow building against liblua5.1-0-dev on architectures + that libluajit is available. + + Enable slice module on all flavors. (Closes: #815080) + + Enable SCGI & uWSGI module for nginx-light. + + Convert to dynamic module packages: + o libnginx-mod-nchan + o libnginx-mod-http-echo + o libnginx-mod-http-upstream-fair + o libnginx-mod-http-headers-more-filter + o libnginx-mod-http-cache-purge + o libnginx-mod-http-fancyindex + o libnginx-mod-http-uploadprogress + o libnginx-mod-http-subs-filter + * debian/modules: + + Replace http-push with nchan v1.0.2 (Closes: #836134) + + Upgrade nginx-lua to v0.10.6 + + Upgrade nginx-echo to v0.60 + + Upgrade headers-more to v0.31 + + Upgrade fancyindex to v0.4.1 + + Upgrade upload-progress to v0.9.2 + + [ Michael Lustfield ] + * debian/patches/0003-*.patch: + + Use _GNU_SOURCE on GNU/kFreeBSD. (Closes: #826061) + Thanks Steven Chamberlain for the patch. + * debian/nginx-*.postinst: + + Make nginx-*.postinst use invoke-rc.d. (Closes: #823435) + Thanks Simon Deziel for the patch. + + -- Christos Trochalakis Tue, 06 Sep 2016 11:06:26 +0300 + +nginx (1.10.1-1) unstable; urgency=medium + + [ Christos Trochalakis ] + * New upstream release (1.10.1) + Fixes CVE-2016-4450 + NULL pointer dereference while writing client request body. + (Closes: #825960) + + * debian/control: + + Generate dbgsym packages only if dh_strip supports it. + Thanks Faidon Liambotis for the hint. + + -- Christos Trochalakis Tue, 31 May 2016 22:01:25 +0300 + +nginx (1.10.0-1) unstable; urgency=medium + + [ Christos Trochalakis ] + * New upstream release (1.10.0) + + -- Christos Trochalakis Fri, 29 Apr 2016 10:31:46 +0300 + +nginx (1.9.14-2) unstable; urgency=medium + + [ Christos Trochalakis ] + * debian/control: + + Fix upgrading nginx-extras from testing. (Closes: #822553) + + Bump Standards to 3.9.8, no changes needed. + * debian/libnginx-mod-http-perl.lintian-overrides: + + Override wrong-section-according-to-package-name warning. + + -- Christos Trochalakis Wed, 27 Apr 2016 16:43:02 +0300 + +nginx (1.9.14-1) unstable; urgency=medium + + [ Christos Trochalakis ] + * New upstream release (1.9.14) (Closes: #812806) + * debian: + + Setup dynamic module flow, and implement a simple dh_nginx helper for + internal use. + + Split modules in libnginx-mod-* packages. + Not all modules are ready for dynamic building. + * debian/control: + + Enable http/2, thread pool & WebDAV on nginx-light. + In order for dynamic modules to be loadable in all nginx flavors we need + to ensure they share the same build signature. (Closes: #816095) + + nginx-common & nginx-doc are now 'Multi-Arch: foreign'. (Closes: #812484) + Thanks Elrond for the report and the initial patch. + + Use secure VCS uri (lintian). + + Bump Standards to 3.9.7. + * debian/rules: + + Disable PIE for now so we can build dynamic modules. + * debian/tests/control: + + Test if modules are loadable in nginx-light. + * debian/nginx-common.nginx.service: + + Documentation points to nginx man page. + * debian/modules/nginx-lua: + + Update nginx-lua to v0.12 and convert it to a dyn module. + Fixes buiding failures with nginx 1.9.11. + * debian/modules/nginx-auth-pam: + + Update http-auth-pam module to 1.5 and convert it to a dyn module. + (Closes: #819062) + + -- Christos Trochalakis Tue, 19 Apr 2016 11:05:35 +0300 + +nginx (1.9.10-1) unstable; urgency=medium + + [ Christos Trochalakis ] + * New upstream release (1.9.10) (Closes: #812806) + * debian/control: + + Drop python dependency from nginx-common. (Closes: #808699) + + -- Christos Trochalakis Tue, 26 Jan 2016 20:12:06 +0200 + +nginx (1.9.9-1) unstable; urgency=medium + + [ Michael Lustfield ] + * debian/nginx-common.nginx.logrotate: + + Switching logrotate to 14 days. (Closes: #805322) + + [ Christos Trochalakis ] + * New upstream release (1.9.9). + * debian/modules/nginx-lua: + + Update nginx-lua to v0.10.0. + + -- Christos Trochalakis Thu, 14 Jan 2016 10:40:35 +0200 + +nginx (1.9.6-2) unstable; urgency=medium + + [ Christos Trochalakis] + * debian/modules/nginx-lua: + + Update nginx-lua to v0.9.19 fixing HTTP/2 compatibility. + + -- Christos Trochalakis Fri, 13 Nov 2015 16:08:01 +0200 + +nginx (1.9.6-1) unstable; urgency=medium + + [ Christos Trochalakis] + * New upstream release. + * Enable http2 module in nginx-full & nginx-extras + + -- Christos Trochalakis Tue, 03 Nov 2015 08:59:21 +0200 + +nginx (1.9.4-1) unstable; urgency=medium + + [ Christos Trochalakis] + * New upstream release. + * debian/copyright: + + Fix licence order. + + -- Christos Trochalakis Mon, 24 Aug 2015 16:23:20 +0300 + +nginx (1.9.3-1) unstable; urgency=medium + + [ Christos Trochalakis] + * New upstream Release. (Closes: #789924) + * debian/control: + + Remove XS-Testsuite header, it is now automatically added when + `debian/tests/control` is present. + * debian/modules/nginx-lua: + + Update nginx-lua to v0.9.16 and drop our backported patches. + * debian/conf/*: + + Add REQUEST_SCHEME to fcgi, wsgi and scgi configs (sync with upstream). + + -- Christos Trochalakis Tue, 14 Jul 2015 20:24:52 +0300 + +nginx (1.9.2-1) unstable; urgency=medium + + [ Michael Lustfield ] + * debian/nginx-common.nginx.init: + + Init script now returns the proper exit status. (Closes: #788573) + + Cleaned up the init script to have consistent naming/structure. + + [ Christos Trochalakis ] + * New upstream Release. + * debian/rules: + + Add stream module to nginx-full & nginx-extras. + + Add thread pool support to nginx-full & nginx-extras. + * debian/modules/nginx-lua: + + Backport upstream's 9531e5e7 fixing build failure when thread pool + support is enabled. + + -- Christos Trochalakis Mon, 22 Jun 2015 10:16:19 +0300 + +nginx (1.9.1-1) unstable; urgency=medium + + [ Michael Lustfield ] + * debian/conf/nginx.conf: + + Switch worker_processes to auto. (Closes: #781711) + * debian/conf/sites-available/default: + + Add comment about disabling gzip in HTTPS. (Closes: #773332) + + Add comment about checking ssl_ciphers. (Closes: #765782) + * debian/modules/*: + + Updated nginx-auth-pam 1.3 -> 1.4. (Closes: #777120) + + Updated nginx-echo v0.56 -> v0.57. + + Updated nginx-lua v0.9.13 -> v0.9.15. + + Updated nginx-cache-purge 2.1 -> 2.3. + + Updated ngx-fancyindex v0.3.4 -> v0.3.5. + * debian/nginx-common.NEWS: + + Document potential issues with newer versions on i386. + * debian/nginx-common.{dirs,install}, debian/vim/*: + + Installing vim syntax highlighting from package. (Closes: #771609) + Thanks Emmanuel Bouthenot for building this patch. + * debian/nginx-common.nginx.upstart: + + Created file to support upstart jobs. (Closes: #745483) + Thanks Cameron Norman for building this file. + * debian/rules: + + Add hardening flags with dpkg-buildflags. (Closes: #747025, #781703) + Thanks Thomas Ward. + + Supply custom DEB_BUILD_MAINT_OPTIONS for debian_ldflags generation. + Thanks Thomas Ward. + + Added back missing module gunzip. (Closes: #782065) + Thanks Peter Wu for the initial patch. + * debian/modules/nginx-lua/*: + + Updated module version. (Closes: #762494) + * debian/ngx-conf/* + + Added configuration utility, not shipped yet. (Closes: #652108) + * debian/nginx-common.manpages: + + Replaced man page with upstream maintained version. (Closes: #781345) + * debian/nginx-common.install: + + Changed debian/index.html -> html/index.html. This installs the package + maintained version of this file as opposed to our out of date version. + + [ Christos Trochalakis ] + * New upstream release. Switching to mainline version. (Closes: #777677) + * debian/nginx-common.manpages: + + Build & ship manpages with binary packages. + * debian/rules: + + Adjust configure flags for limit_zone module (renamed to limit_conn). + * debian/modules/nginx-lua: + + Backport upstream's f4e1311 fixing build failure with mainline nginx. + * debian/control: + + Depend on libgd-dev now that jessie is released. + + -- Christos Trochalakis Fri, 12 Jun 2015 15:42:49 +0300 + +nginx (1.6.2-5) unstable; urgency=medium + + [ Christos Trochalakis ] + * debian/conf/nginx.conf: + + Drop SSLv3 protocol (POODLE), and prefer server ciphers + by default. (Closes: #767456) + * debian/copyright: + + Add copyright for ngx_http_substitutions_filter_module. + * debian/nginx-common.{preinst,postinst,postrm}: + + Remove /etc/nginx/naxsi-ui.conf conffile. (Closes: #768233) + * debian/README.Debian: + + Add a list of important changes since wheezy. + + -- Christos Trochalakis Sun, 30 Nov 2014 10:39:55 +0200 + +nginx (1.6.2-4) unstable; urgency=medium + + [ Christos Trochalakis ] + * debian/modules/nginx-development-kit: + + Upgrade v0.2.17-7-g24202b4 -> v0.2.19 + * debian/modules/nginx-echo: + + Upgrade v0.51 -> v0.56 + * debian/modules/nginx-upload-progress: + + Upgrade v0.9.0-0-ga788dea -> 0.9.1 + * debian/modules/ngx-fancy-index: + + Upgrade v0.3.3 -> v0.3.4 + * debian/copyright: + + Rewrite copyright file fixing various issues. + * debian/nginx-common.nginx.logrotate: + + Switch postrotate to the initscript's rotate command. + + -- Christos Trochalakis Sun, 19 Oct 2014 08:23:33 +0300 + +nginx (1.6.2-3) unstable; urgency=medium + + [ Christos Trochalakis ] + * Change the default document root to /var/www/html according to debian + policy 3.9.6.0. (Closes: #730382) + * Provide a new, debian specific, default landing page. + * debian/nginx-common.nginx.service: + + Graceful stopping of nginx was not handled correctly with systemd. + * debian/nginx-common.nginx.init: + + Gracefully stop nginx by default, we are switcing to a configurable + STOP/5/TERM/5/KILL/5 schedule. We are now in sync with the systemd + service file. (Closes: #762708) + * debian/conf: + + Introduce a `snippets/fastcgi-php.conf` snippet with a basic + php configuration that can be included when needed. (Closes: #762491) + + Introduce a `snippets/snakeoil.conf` snippet that enabled https + using the certs installed by the ssl-cert package. + + Suggest disabling SSLv3 in default site with a ref to POODLE. + * debian/control: + + nginx-common now suggests ssl-cert. + + -- Christos Trochalakis Thu, 16 Oct 2014 13:34:29 +0300 + +nginx (1.6.2-2) unstable; urgency=medium + + [ Christos Trochalakis ] + * Drop nginx-naxsi, nginx-naxsi-dbg, nginx-naxsi-ui packages. + (Closes: #746199, #737146, #712445) + * debian/conf/nginx.conf: + + Remove relic passenger stanga. + + -- Christos Trochalakis Fri, 26 Sep 2014 11:06:47 +0300 + +nginx (1.6.2-1) unstable; urgency=high + + [ Christos Trochalakis ] + * New upstream release. + CVE-2014-3616: "it was possible to reuse SSL sessions in unrelated + contexts if a shared SSL session cache or the same TLS session ticket + key was used for multiple "server" blocks". (Closes: #761940) - -- Christos Trochalakis Thu, 18 Sep 2014 15:25:04 +0300 + -- Christos Trochalakis Wed, 17 Sep 2014 11:19:01 +0300 -nginx (1.2.1-2.2+wheezy2) stable-security; urgency=high +nginx (1.6.1-2) unstable; urgency=medium - * debian/patches/fix-CVE-2013-4547.patch: - + Proper backtracking after space in a request line. - See: CVE:2013-4547 for more details. + [ Christos Trochalakis ] + * debian/control: + + Build nginx-extras against luajit (Closes: #755875) + * debian/modules/nginx-lua: + + Update nginx-lua to v0.9.12 + * debian/nginx-common.nginx.init: + + Better pidfile extraction from nginx.conf (Closes: #747329) + * debian/conf/mime.types: + + Upgrade to the latest upstream mime types. + As a consequence, nginx now uses "application/javascript" for + javascript files. + * debian/conf/nginx.conf: + + Add application/javascript to the gzip_types list. (Closes: #737176) + * debian/rules: + + Make naxsi module first in configure parameters. + Fixes erratic naxsi behaviour. (Closes: #758642) + * debian/conf/{koi-utf,koi-win,scgi_params,uwsgi_params}: + + Sync with upstream config files. + * debian/conf/fastcgi_params: + + Sync with upstream and remove `SCRIPT_FILENAME` parameter. + This change might break fastcgi sites. (Closes: #718639) + + debian/conf/fastcgi.conf: + + Ship upstream file. + * debian/nginx-common.NEWS: + + Document syncing conf files with upstream. + * debian/tests/control: + + Include some simple autopkgtests. + Thanks to Robie Basak for the initial patch. (Closes: #756391) + * debian/modules/nginx-http-push: + + Update to v0.73. + Fixes fd leak on reload. (Closes: #745921) - -- Christos Trochalakis Wed, 20 Nov 2013 00:36:19 +0200 + -- Christos Trochalakis Thu, 04 Sep 2014 13:00:46 +0300 -nginx (1.2.1-2.2+wheezy1) stable-security; urgency=high +nginx (1.6.1-1) unstable; urgency=medium - * debian/patches/fix-CVE-2013-2070.patch: - + Fixed the buffer overflow issue found on may 13th 2013. - See: CVE-2013-2070 for more details. + [ Christos Trochalakis ] + * New upstream release. + Handle CVE-2014-3556 SMTP STARTTLS vulnerability (Closes: #757196) + http://mailman.nginx.org/pipermail/nginx-announce/2014/000144.html - -- Cyril Lavier Wed, 05 Jun 2013 10:41:45 +0200 + -- Christos Trochalakis Wed, 06 Aug 2014 10:05:08 +0300 + +nginx (1.6.0-2) unstable; urgency=medium + + [ gregor herrmann ] + * Patch from Gregor Herrmann : + Fix "hardcodes /usr/lib/perl5": + - drop debian/nginx-extras.dirs, not needed, dh_install uses the + directories from debian/nginx-extras.install + - make debian/nginx-extras.install executable, and use $Config{vendorarch} + for the perl library path there + (Closes: #752796) + + -- Kartik Mistry Tue, 29 Jul 2014 04:56:03 +0000 + +nginx (1.6.0-1) unstable; urgency=medium + + [ Christos Trochalakis ] + * New upstream release. + * debian/rules: + + Enable auth request http module. (Closes: #725732) + * debian/patches/series: + + Remove backported openssl guard patch. + + -- Christos Trochalakis Thu, 24 Apr 2014 19:23:22 +0300 + +nginx (1.4.7-2) unstable; urgency=medium + + [ Christos Trochalakis ] + * debian/rules: + + Convert to dh $@ + As a side effect, fixes make dependency issues (Closes: #744050) + + -- Christos Trochalakis Thu, 17 Apr 2014 14:30:27 +0300 + +nginx (1.4.7-1) unstable; urgency=medium + + [ Christos Trochalakis ] + * New upstream release. (Closes: #742059) + + Fixes pottential arbitrary code execution (CVE-2014-0133) + Debian build was not vulnerable since it was compiled + with the --with-debug configure option. + * debian/modules/nginx-http-push: + + Update to v0.711 (Closes: #732251) + * debian/modules/headers-more-nginx-module: + + Update to v0.25, containing several bugfixes. + * debian/modules/nginx-echo: + + Update to v0.51, containing several bugfixes. + * debian/modules/nginx-dav-ext-module: + + Update to v0.0.3, containing some uri encoding fixes. + * debian/modules/ngx_http_substitutions_filter_module: + + Update to v0.6.4, containing some enhancements. + * debian/modules/nginx-auth-pam: + + Update to v1.3. + This version contains our downstream patch (See: #721702) + + -- Christos Trochalakis Tue, 18 Mar 2014 22:03:47 +0200 + +nginx (1.4.6-1) unstable; urgency=medium + + [ Christos Trochalakis ] + * New upstream release. + * debian/rules: + + Avoid double declaration of hardening flags. + + Expand buildflags so the build log is easier to follow. + + Switch to --with--cc-opt, --with-ld-opt configure flags. + Nginx is now compiled with --Werror, making all warnings + into errors. + + Split common configure options. + + Enable realip module for nginx-light. + + Enable debug module for nginx-light and nginx-extras. + * debian/patches/perl-use-dpkg-buildflags.patch: + + Rewrite patch to just just override LDDLFLAGS and not + CCFLAGS since this is handled by --with-cc-opt. + * debian/watch, debian/upstream/signing-key.asc: + + Fix upstream signature verification. + + -- Christos Trochalakis Tue, 04 Mar 2014 18:06:55 +0200 + +nginx (1.4.5-1) unstable; urgency=medium + + [ Christos Trochalakis ] + * New upstream release. + * debian/modules/nginx-lua: + + Update nginx-lua to v0.9.4 + * debian/nginx-naxsi-ui.preinst: + + Fix exit status issue (Closes: #735152) + * debian/control: + + Fix arch:all to arch:any dependencies + + Make nginx depend on specific flavor version + * debian/nginx-*.postinst: + + Make nginx start by default (Closes: #735551) + * debian/nginx-*.prerm: + + No need to check for invoke-rc.d, + correctly set the exit code on error + * debian/nginx-common.nginx.init: + + Rewrite some parts of the initscript + + Introduce rotate command + + Introduce upgrade command + + -- Christos Trochalakis Thu, 13 Feb 2014 11:41:49 +0200 + +nginx (1.4.4-4) unstable; urgency=medium + + [ Christos Trochalakis ] + * debian/nginx-common.postinst: + + Fix log re-opening issue due to wrong /var/log/nginx + permissions. (Closes: #734139) + + -- Christos Trochalakis Sat, 04 Jan 2014 09:41:40 +0200 + +nginx (1.4.4-3) unstable; urgency=medium + + [ Christos Trochalakis ] + * debian/nginx-naxsi-ui.postinst: + + Fix early exit issue (Closes: #715435) + + -- Christos Trochalakis Tue, 31 Dec 2013 11:47:07 +0200 + +nginx (1.4.4-2) unstable; urgency=low + + [ Michael Lustfield ] + * debian/control: + + Added Provides: httpd-cgi to packages. (Closes: #701508) + + Added other options to nginx depends. (Closes: #729860) + + Added Spdy to nginx-full package description. + * debian/nginx-common.nginx.init: + + Added missing line from patch. (Closes: #728103) + * debian/conf/sites-available/default: + + Changed ssl_protocols and ssl_ciphers. (Closes: 730142) + * debian/nginx-common.preinst: + + Modify permissions of /var/log/nginx. (Closes: #701112) + * debian/rules: + + Added spdy support to nginx-full. (Closes: #730432) + + [ Christos Trochalakis ] + * debian/nginx-doc,docs, debian/nginx-common.NEWS: + + Ship NEWS with nginx-common instead of nginx-doc. + * debian/conf/proxy_params: + + Host header should be passed unmodified to the proxied server. + + Pass X-Forwarded-Proto header to the proxied server. + * debian/control: + + Fix nginx-naxsi-ui Depends and Conflicts lines. + + [ Neutron Soutmun ] + * debian/patches/guard-use-of-deprecated-openssl-definition.patch: + + Fix FTBFS against the recent libssl-dev. (Closes: #733107) + + [ Kartik Mistry ] + * debian/control: + + Updated to Standards-Version 3.9.5 + * debian/watch, debian/upstream-signing-key.pgp: + + Use upstream PGP signature to verify by watch file. + + -- Kartik Mistry Fri, 27 Dec 2013 21:16:01 +0530 + +nginx (1.4.4-1) unstable; urgency=low + + [ Christos Trochalakis ] + * New upstream release. (Closes: #730012) + * debian/nginx-*.postinst: + + Wait for the new master to write its pid file before sending QUIT to the + old master. This solves an issue with systemd and the upgrade mechanism. + Systemd receives the SIGCHLD from the old master but it can't see the new + pid because the new master has not written it yet. As a result, it kills + everything inside the cgroup, including the new master. + * debian/modules/ngx-fancyindex: + + Upgrade Fancy Index module to v0.3.3 (Closes: #728721) + * debian/control: + + Remove Upload module from nginx-extras description (Closes: #729003) + + [ Michael Lustfield ] + * debian/control: + + Added spdy to package description (Closes: #728038) + * debian/nginx-common.nginx.init: + + Showing better start/stop messages. Thanks Pim van den Berg. + (Closes: #728103) + + -- Michael Lustfield Thu, 21 Nov 2013 19:25:50 +0530 + +nginx (1.4.3-2) unstable; urgency=low + + [ Kartik Mistry ] + * Renamed debian/nginx-common.service to debian/nginx-common.nginx.service so + it is installed properly for systemd. Thanks to Christos Trochalakis. + * Set debian/compat to 9 and updated debhelper dependency. + + [ Christos Trochalakis ] + * debian/rules, debian/nginx-common.dirs, + debian/debian-common.nginx.logrotate: + + Switch to dh_installlogrotate. + * debian/rules: + + *-stamp files are deleted by dh_clean. + + Remove unused mime-types target. + + Remove not needed config.sub and config.guess targets. + * debian/nginx-common.dirs: + + Don't ship an empty /run dir. + * debian/nginx-{light,full,extras}.lintian-overrides: + + Override false lintian spelling error warning. + + -- Kartik Mistry Wed, 16 Oct 2013 14:58:11 +0530 + +nginx (1.4.3-1) unstable; urgency=low + + [ Cyril Lavier ] + * debian/nginx-naxsi-ui.postinst, debian/nginx-naxsi-ui.preinst: + + Added missing arguments to have clean postinst/preinst scripts. + * debian/conf/fastcgi_params: + + Defined fastcgi param HTTPS the same as upstream default. + (Closes: #712989) + + [ Michael Lustfield ] + * conf/sites-available/default: + + Removed /doc/ section per bug #715804. + + [ Christos Trochalakis ] + * New upstream release. (Closes: #722640) + * debian/nginx-common.nginx.init: + + Better pidfile extraction from nginx.conf. We now accept multiple + spaces and tabs as a field separator. + * debian/modules/nginx-auth-pam: + + Fixed upstream bug. (Closes: #721702) + * debian/watch: + + Only check for stable releases. + * debian/conf/sites-available/default: + + Correctly fallback to 404 when the requested file is missing. + (Closes: #724232) + * debian/logrotate: + + Gracefully handle empty pidfile in logrotate script. + (Closes: #696797) + + [ Kartik Mistry ] + * Switch to dh-systemd (Closes: #713853) + + -- Kartik Mistry Thu, 10 Oct 2013 17:28:56 +0530 + +nginx (1.4.1-3) unstable; urgency=low + + [ Kartik Mistry ] + * debian/control: + + Changed libgd2-dev build-dep to libgd2-dev|libgd2-noxpm-dev allow + backporting (Closes: #711505) + + [ Cyril Lavier ] + * debian/nginx-naxsi-ui.preinst + + Added argument "install" to the preinst script. (Closes: #711590) + + -- Kartik Mistry Sun, 09 Jun 2013 13:07:52 +0530 + +nginx (1.4.1-2) unstable; urgency=medium + + [ Kartik Mistry] + * Urgency set to medium due to Security and RC bugs. + * debian/conf/sites-available/default: + + Fixed typo in listen ipv6only=on (Closes: #707684) + + [ Cyril Lavier ] + * debian/control: + + Replaced the build-dep libgd2-noxpm-dev to libgd2-dev as part of + the libgd2-{xpm,noxpm}-dev -> libgd2-dev transition. + * debian/nginx-naxsi-ui.preinst, debian/nginx-naxsi-ui.postinst, + debian/conf/naxsi-ui.conf.1.4.1: + + Added preinst script and renamed the new config file to avoid + prompting the user. (Closes: #707291) + * debian/rules: + + Made "debian/rules binary" enough to build binary package. + (Closes: #708522) + + -- Kartik Mistry Thu, 06 Jun 2013 12:55:23 +0530 + +nginx (1.4.1-1) unstable; urgency=low + + * New upstream release: + + Fixes arbitrary code execution (CVE-2013-2028). + * Uploaded to unstable. + * debian/control: + + Updated Standards-Version to 3.9.4 + + -- Kartik Mistry Tue, 07 May 2013 19:53:46 +0530 + +nginx (1.4.0-2) experimental; urgency=low + + [ OndÅ™ej Surý ] + * debian/modules/: + + Updated nginx-echo, nginx-cache-purge and naxsi modules. + + Removed useless .gitignore, .gitmodules files. + + [ Kartik Mistry ] + * debian/modules/nginx-upload: + + This module no longer works with 1.3.x and above. Removed as of now. + * debian/modules/ngx-fancyindex: + + Added Fancy Indexes module (Closes: #704210) + * debian/copyright: + + Fixed path for modules in Files: field. + + Updated copyright for debian/* + * debian/rules: + + Enabled spdy module (Closes: #706195). + * debian/control: + + Suggests: fcgiwrap (Closes: #701508). + + [ Cyril Lavier ] + * debian/conf/naxsi-ui.conf: + + Added configuration file for nginx-naxsi-ui using SQLite + (Closes: #699678). + * debian/nginx-naxsi-ui.config, debian/nginx-naxsi-ui.postinst, + debian/nginx-naxsi-ui.postrm, debian/nginx-naxsi-ui.prerm, + debian/nginx-naxsi-ui.templates: + + Removed these files as they are not necessary anymore with the + database engine switching from MySQL to SQLite. + * debian/control: + + Removed dependencies against MySQL. + * debian/rules, debian/modules/ngx_http_substitutions_filter_module, + debian/README.Modules-versions: + + Added http_substitutions_filter module. (Closes: #706456) + + -- Kartik Mistry Wed, 01 May 2013 10:48:43 +0530 + +nginx (1.4.0-1) experimental; urgency=low + + [ Kartik Mistry ] + * New upstream release (Closes: #706127). + * debian/rules, debian/modules/: + + Removed chunkin-nginx-module as it no longer supported for nginx 1.3.9+ + + Updated nginx-lua module to 0.8.0 + + Patched nginx-upload module as described in modules/README file. + * Refreshed debian/patches/perl-use-dpkg-buildflags.patch + * debian/logrotate: + + Set default log to keep for 52 weeks instead of 52 days. Thanks to + RjY for patch (Closes: #696440) + * debian/rules: + + Added cache purge module to nginx-extras. + * debian/control: + + Suggests: nginx-docs. Thanks to colliar for + reporting bug (Closes: #702923) + * debian/copyright: + + Updated copyright year. + + Fixed broken license text. + + [ Michael Lustfield ] + * debian/conf/sites-available/default: + + Added ipv6_only=on to default server block. (Closes: #700857) + + Added default_server to ipv4 default server block. Now matches ipv6. + * debian/rules: + + Removed obsolete --with-md5 and --with-sha1 + + -- Kartik Mistry Thu, 25 Apr 2013 12:51:45 +0530 + +nginx (1.2.6-1) unstable; urgency=low + + [ Kartik Mistry ] + * New upstream release. + * debian/nginx-common.nginx.init: + + Used log_*_msg instead of echo for better init messages. + + Added patch to check start-stop-daemon exit status, Thanks to + Sergey B Kirpichev (Closes: #695374). + * debian/po/ja.po: + + Added new Japanese translation. Thanks to victory + (Closes: #692481). + * debian/po/pt_BR.po: + + Added new Brazilian Portuguese translation. Thanks to + Adriano Rafael Gomes (Closes: #692481). + + [ Cyril Lavier ] + * debian/rules + + Added RealIP module in nginx-naxsi (Closes: #693302). + * debian/modules/nginx-cache-purge/ + + Updated nginx-cache-purge module with the 2.0 version. + * debian/modules/nginx-lua/ + + Updated nginx-lua module with the 0.7.8 version. + * debian/modules/nginx-echo/ + + Updated the nginx-echo module with the 0.41 version. + * debian/modules/headers-more-nginx-module/ + + Updated the Headers-more module with the 0.19 version. + * debian/modules/README.Modules-versions + + Updated the current version of modules following the updates. + + [ Michael Lustfield ] + * debian/conf/sites-available/default + + Uncommented listen lines to make server block default. + + -- Kartik Mistry Tue, 18 Dec 2012 10:29:18 +0530 + +nginx (1.2.4-2) unstable; urgency=low + + * debian/conf/nginx.conf: + + Fixed pid path to /run/nginx.pid in config. + * debian/po/*.po, debian/nginx-naxsi-ui.templates, debian/po/templates.pot: + + Fixed ^M characters in template file. Thanks to Christian Perrier + for help (Closes: #692191, #692335) + + -- Kartik Mistry Mon, 05 Nov 2012 13:05:34 +0530 + +nginx (1.2.4-1) unstable; urgency=low + + [ Michael Lustfield ] + * debian/nginx-common.nginx.init + + Added --retry to start-stop-daemon. (Closes: #682360) + + Added $named to Required-Start/Stop. (Closes: #679879) + + Added some other modifications after testing. (LP: #1033856) + * debian/rules: + + Added -DFORTIFY_SOURCE=2 -fstack-protector to build flags. + (Closes: #680712) + * debian/nginx-common.install: + + Moved default docs to /usr/share/nginx/html. (Closes: #1031515) + * debian/rules: + + Set prefix to /usr/share/nginx. + * debian/po/fr.po + + Updated French translation file. (Closes: #679601) + * debian/logrotate: + + Removed semicolon after an fi statement. (Closes: #683870) + * debian/copyright: + + Removed trailing slash from File: fields. + * Changed /var/run to /run in multiple files. (LP: #1050516) + * debian/nginx-common.dirs: + + Added /run to .dirs to avoid conflicts with backports. (LP: #1072641) + * debian/nginx-*.postinst: + + Added sites-enabled/available directory checks. (Closes: #688410) + - Thanks Andreas Marschke + + Moved the symlink creation to nginx-common. + * Updated debconf templates. + * conf/sites-available/default: + + Updated root to point at /usr/share/nginx/html instead of www. + + [ Kartik Mistry ] + * Acknowledged NMUs (Closes: #681758, #681381) + * New upstream release (Closes: #683704) + * debian/po/*.po: + + Removed ^M characters from headers. + + Fixed all files with recent unneeded template change. + + -- Kartik Mistry Tue, 30 Oct 2012 10:10:34 +0530 nginx (1.2.1-2.2) unstable; urgency=low @@ -1022,14 +2656,14 @@ nginx (0.7.61-2) unstable; urgency=low nginx (0.7.61-1) unstable; urgency=low * New upstream version: - *) Bugfix: nginx could not be built --without-http-cache; the bug had + *) Bugfix: nginx could not be built --without-http-cache; the bug had appeared in 0.7.60. - *) Bugfix: a segmentation fault occurred in worker process, if a - backend 401 error was intercepted and the backend did not set the + *) Bugfix: a segmentation fault occurred in worker process, if a + backend 401 error was intercepted and the backend did not set the "WWW-Authenticate" response header line. Thanks to Eugene Mychlo. *) Feature: the "keepalive_requests" directive. - *) Bugfix: in open_file_cache and proxy/fastcgi cache interaction on + *) Bugfix: in open_file_cache and proxy/fastcgi cache interaction on start up. *) Bugfix: open_file_cache might cache open file descriptors too long. *) Bugfix: XLST filter did not work in subrequests. @@ -1160,14 +2794,14 @@ nginx (0.5.33-1) unstable; urgency=low * New stable upstream release (Closes: #451173) * nginx now provides httpd, httpd-cgi virtual packages (Closes: #439468, #452025) - * sites-enabled/default link is now provided only on fresh + * sites-enabled/default link is now provided only on fresh installations (Closes: #432961) * Updated code for online upgrading of nginx (Closes: #445246) * Reviewed maintainer scripts for correct behaviour on updates (Closes: #452787, #435965) * Removed debian/nginx.links and debian/preinst. * Changing Maintainer address to bureado@debian.org. - * Welcoming Fabio Tranchitella as an nginx + * Welcoming Fabio Tranchitella as an nginx uploader for Debian. Thanks for your patches. -- Jose Parrella Sat, 08 Dec 2007 11:27:54 -0400 @@ -1175,7 +2809,7 @@ nginx (0.5.33-1) unstable; urgency=low nginx (0.5.30-1) unstable; urgency=low * New stable upstream release. - * Adding mime.types (and other upstream conffiles) to the package + * Adding mime.types (and other upstream conffiles) to the package since it was lost on 0.5.26 (Closes: #435964) -- Jose Parrella Sat, 04 Aug 2007 10:39:40 -0400 @@ -1205,7 +2839,7 @@ nginx (0.5.13-1) unstable; urgency=low nginx (0.5.12-2) unstable; urgency=low - * Patching src/core/ngx_shmtx.h in order to solve FTBFS problems in + * Patching src/core/ngx_shmtx.h in order to solve FTBFS problems in non-x86 archs (Thanks to Igor Sysoev) (Closes: #410884) -- Jose Parrella Wed, 14 Feb 2007 13:32:01 -0400 @@ -1221,7 +2855,7 @@ nginx (0.5.11-1) unstable; urgency=low * New upstream version. (Closes: #405983) - -- Jose Parrella Sun, 5 Feb 2007 19:35:56 -0400 + -- Jose Parrella Mon, 05 Feb 2007 19:35:56 -0400 nginx (0.4.13-2) unstable; urgency=low @@ -1261,4 +2895,3 @@ nginx (0.4.2-1) unstable; urgency=low * Tweaked the configuration file and the path handling for Debian. -- Jose Parrella Thu, 14 Sep 2006 11:40:20 -0400 - diff --git a/debian/compat b/debian/compat deleted file mode 100644 index 7ed6ff8..0000000 --- a/debian/compat +++ /dev/null @@ -1 +0,0 @@ -5 diff --git a/debian/conf/fastcgi.conf b/debian/conf/fastcgi.conf new file mode 100644 index 0000000..d53a628 --- /dev/null +++ b/debian/conf/fastcgi.conf @@ -0,0 +1,27 @@ + +fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; +fastcgi_param QUERY_STRING $query_string; +fastcgi_param REQUEST_METHOD $request_method; +fastcgi_param CONTENT_TYPE $content_type; +fastcgi_param CONTENT_LENGTH $content_length; + +fastcgi_param SCRIPT_NAME $fastcgi_script_name; +fastcgi_param REQUEST_URI $request_uri; +fastcgi_param DOCUMENT_URI $document_uri; +fastcgi_param DOCUMENT_ROOT $document_root; +fastcgi_param SERVER_PROTOCOL $server_protocol; +fastcgi_param REQUEST_SCHEME $scheme; +fastcgi_param HTTPS $https if_not_empty; + +fastcgi_param GATEWAY_INTERFACE CGI/1.1; +fastcgi_param SERVER_SOFTWARE nginx/$nginx_version; + +fastcgi_param REMOTE_ADDR $remote_addr; +fastcgi_param REMOTE_PORT $remote_port; +fastcgi_param REMOTE_USER $remote_user; +fastcgi_param SERVER_ADDR $server_addr; +fastcgi_param SERVER_PORT $server_port; +fastcgi_param SERVER_NAME $server_name; + +# PHP only, required if PHP was built with --enable-force-cgi-redirect +fastcgi_param REDIRECT_STATUS 200; diff --git a/debian/conf/fastcgi_params b/debian/conf/fastcgi_params index 1f28002..69c4387 100644 --- a/debian/conf/fastcgi_params +++ b/debian/conf/fastcgi_params @@ -1,25 +1,26 @@ -fastcgi_param QUERY_STRING $query_string; -fastcgi_param REQUEST_METHOD $request_method; -fastcgi_param CONTENT_TYPE $content_type; -fastcgi_param CONTENT_LENGTH $content_length; -fastcgi_param SCRIPT_FILENAME $request_filename; -fastcgi_param SCRIPT_NAME $fastcgi_script_name; -fastcgi_param REQUEST_URI $request_uri; -fastcgi_param DOCUMENT_URI $document_uri; -fastcgi_param DOCUMENT_ROOT $document_root; -fastcgi_param SERVER_PROTOCOL $server_protocol; +fastcgi_param QUERY_STRING $query_string; +fastcgi_param REQUEST_METHOD $request_method; +fastcgi_param CONTENT_TYPE $content_type; +fastcgi_param CONTENT_LENGTH $content_length; -fastcgi_param GATEWAY_INTERFACE CGI/1.1; -fastcgi_param SERVER_SOFTWARE nginx/$nginx_version; +fastcgi_param SCRIPT_NAME $fastcgi_script_name; +fastcgi_param REQUEST_URI $request_uri; +fastcgi_param DOCUMENT_URI $document_uri; +fastcgi_param DOCUMENT_ROOT $document_root; +fastcgi_param SERVER_PROTOCOL $server_protocol; +fastcgi_param REQUEST_SCHEME $scheme; +fastcgi_param HTTPS $https if_not_empty; -fastcgi_param REMOTE_ADDR $remote_addr; -fastcgi_param REMOTE_PORT $remote_port; -fastcgi_param SERVER_ADDR $server_addr; -fastcgi_param SERVER_PORT $server_port; -fastcgi_param SERVER_NAME $server_name; +fastcgi_param GATEWAY_INTERFACE CGI/1.1; +fastcgi_param SERVER_SOFTWARE nginx/$nginx_version; -fastcgi_param HTTPS $https; +fastcgi_param REMOTE_ADDR $remote_addr; +fastcgi_param REMOTE_PORT $remote_port; +fastcgi_param REMOTE_USER $remote_user; +fastcgi_param SERVER_ADDR $server_addr; +fastcgi_param SERVER_PORT $server_port; +fastcgi_param SERVER_NAME $server_name; # PHP only, required if PHP was built with --enable-force-cgi-redirect -fastcgi_param REDIRECT_STATUS 200; +fastcgi_param REDIRECT_STATUS 200; diff --git a/debian/conf/koi-utf b/debian/conf/koi-utf index 1edb947..e7974ff 100644 --- a/debian/conf/koi-utf +++ b/debian/conf/koi-utf @@ -1,108 +1,109 @@ + # This map is not a full koi8-r <> utf8 map: it does not contain -# box-drawing and some other characters. Besides this map contains +# box-drawing and some other characters. Besides this map contains # several koi8-u and Byelorussian letters which are not in koi8-r. # If you need a full and standard map, use contrib/unicode2nginx/koi-utf # map instead. -charset_map koi8-r utf-8 { +charset_map koi8-r utf-8 { - 80 E282AC; # euro + 80 E282AC ; # euro - 95 E280A2; # bullet + 95 E280A2 ; # bullet - 9A C2A0; #   + 9A C2A0 ; #   - 9E C2B7; # · + 9E C2B7 ; # · - A3 D191; # small yo - A4 D194; # small Ukrainian ye + A3 D191 ; # small yo + A4 D194 ; # small Ukrainian ye - A6 D196; # small Ukrainian i - A7 D197; # small Ukrainian yi + A6 D196 ; # small Ukrainian i + A7 D197 ; # small Ukrainian yi - AD D291; # small Ukrainian soft g - AE D19E; # small Byelorussian short u + AD D291 ; # small Ukrainian soft g + AE D19E ; # small Byelorussian short u - B0 C2B0; # ° + B0 C2B0 ; # ° - B3 D081; # capital YO - B4 D084; # capital Ukrainian YE + B3 D081 ; # capital YO + B4 D084 ; # capital Ukrainian YE - B6 D086; # capital Ukrainian I - B7 D087; # capital Ukrainian YI + B6 D086 ; # capital Ukrainian I + B7 D087 ; # capital Ukrainian YI - B9 E28496; # numero sign + B9 E28496 ; # numero sign - BD D290; # capital Ukrainian soft G - BE D18E; # capital Byelorussian short U + BD D290 ; # capital Ukrainian soft G + BE D18E ; # capital Byelorussian short U - BF C2A9; # (C) + BF C2A9 ; # (C) - C0 D18E; # small yu - C1 D0B0; # small a - C2 D0B1; # small b - C3 D186; # small ts - C4 D0B4; # small d - C5 D0B5; # small ye - C6 D184; # small f - C7 D0B3; # small g - C8 D185; # small kh - C9 D0B8; # small i - CA D0B9; # small j - CB D0BA; # small k - CC D0BB; # small l - CD D0BC; # small m - CE D0BD; # small n - CF D0BE; # small o + C0 D18E ; # small yu + C1 D0B0 ; # small a + C2 D0B1 ; # small b + C3 D186 ; # small ts + C4 D0B4 ; # small d + C5 D0B5 ; # small ye + C6 D184 ; # small f + C7 D0B3 ; # small g + C8 D185 ; # small kh + C9 D0B8 ; # small i + CA D0B9 ; # small j + CB D0BA ; # small k + CC D0BB ; # small l + CD D0BC ; # small m + CE D0BD ; # small n + CF D0BE ; # small o - D0 D0BF; # small p - D1 D18F; # small ya - D2 D180; # small r - D3 D181; # small s - D4 D182; # small t - D5 D183; # small u - D6 D0B6; # small zh - D7 D0B2; # small v - D8 D18C; # small soft sign - D9 D18B; # small y - DA D0B7; # small z - DB D188; # small sh - DC D18D; # small e - DD D189; # small shch - DE D187; # small ch - DF D18A; # small hard sign + D0 D0BF ; # small p + D1 D18F ; # small ya + D2 D180 ; # small r + D3 D181 ; # small s + D4 D182 ; # small t + D5 D183 ; # small u + D6 D0B6 ; # small zh + D7 D0B2 ; # small v + D8 D18C ; # small soft sign + D9 D18B ; # small y + DA D0B7 ; # small z + DB D188 ; # small sh + DC D18D ; # small e + DD D189 ; # small shch + DE D187 ; # small ch + DF D18A ; # small hard sign - E0 D0AE; # capital YU - E1 D090; # capital A - E2 D091; # capital B - E3 D0A6; # capital TS - E4 D094; # capital D - E5 D095; # capital YE - E6 D0A4; # capital F - E7 D093; # capital G - E8 D0A5; # capital KH - E9 D098; # capital I - EA D099; # capital J - EB D09A; # capital K - EC D09B; # capital L - ED D09C; # capital M - EE D09D; # capital N - EF D09E; # capital O + E0 D0AE ; # capital YU + E1 D090 ; # capital A + E2 D091 ; # capital B + E3 D0A6 ; # capital TS + E4 D094 ; # capital D + E5 D095 ; # capital YE + E6 D0A4 ; # capital F + E7 D093 ; # capital G + E8 D0A5 ; # capital KH + E9 D098 ; # capital I + EA D099 ; # capital J + EB D09A ; # capital K + EC D09B ; # capital L + ED D09C ; # capital M + EE D09D ; # capital N + EF D09E ; # capital O - F0 D09F; # capital P - F1 D0AF; # capital YA - F2 D0A0; # capital R - F3 D0A1; # capital S - F4 D0A2; # capital T - F5 D0A3; # capital U - F6 D096; # capital ZH - F7 D092; # capital V - F8 D0AC; # capital soft sign - F9 D0AB; # capital Y - FA D097; # capital Z - FB D0A8; # capital SH - FC D0AD; # capital E - FD D0A9; # capital SHCH - FE D0A7; # capital CH - FF D0AA; # capital hard sign + F0 D09F ; # capital P + F1 D0AF ; # capital YA + F2 D0A0 ; # capital R + F3 D0A1 ; # capital S + F4 D0A2 ; # capital T + F5 D0A3 ; # capital U + F6 D096 ; # capital ZH + F7 D092 ; # capital V + F8 D0AC ; # capital soft sign + F9 D0AB ; # capital Y + FA D097 ; # capital Z + FB D0A8 ; # capital SH + FC D0AD ; # capital E + FD D0A9 ; # capital SHCH + FE D0A7 ; # capital CH + FF D0AA ; # capital hard sign } diff --git a/debian/conf/koi-win b/debian/conf/koi-win index c6930fc..72afabe 100644 --- a/debian/conf/koi-win +++ b/debian/conf/koi-win @@ -1,102 +1,103 @@ -charset_map koi8-r windows-1251 { - 80 88; # euro +charset_map koi8-r windows-1251 { - 95 95; # bullet + 80 88 ; # euro - 9A A0; #   + 95 95 ; # bullet - 9E B7; # · + 9A A0 ; #   - A3 B8; # small yo - A4 BA; # small Ukrainian ye + 9E B7 ; # · - A6 B3; # small Ukrainian i - A7 BF; # small Ukrainian yi + A3 B8 ; # small yo + A4 BA ; # small Ukrainian ye - AD B4; # small Ukrainian soft g - AE A2; # small Byelorussian short u + A6 B3 ; # small Ukrainian i + A7 BF ; # small Ukrainian yi - B0 B0; # ° + AD B4 ; # small Ukrainian soft g + AE A2 ; # small Byelorussian short u - B3 A8; # capital YO - B4 AA; # capital Ukrainian YE + B0 B0 ; # ° - B6 B2; # capital Ukrainian I - B7 AF; # capital Ukrainian YI + B3 A8 ; # capital YO + B4 AA ; # capital Ukrainian YE - B9 B9; # numero sign + B6 B2 ; # capital Ukrainian I + B7 AF ; # capital Ukrainian YI - BD A5; # capital Ukrainian soft G - BE A1; # capital Byelorussian short U + B9 B9 ; # numero sign - BF A9; # (C) + BD A5 ; # capital Ukrainian soft G + BE A1 ; # capital Byelorussian short U - C0 FE; # small yu - C1 E0; # small a - C2 E1; # small b - C3 F6; # small ts - C4 E4; # small d - C5 E5; # small ye - C6 F4; # small f - C7 E3; # small g - C8 F5; # small kh - C9 E8; # small i - CA E9; # small j - CB EA; # small k - CC EB; # small l - CD EC; # small m - CE ED; # small n - CF EE; # small o + BF A9 ; # (C) - D0 EF; # small p - D1 FF; # small ya - D2 F0; # small r - D3 F1; # small s - D4 F2; # small t - D5 F3; # small u - D6 E6; # small zh - D7 E2; # small v - D8 FC; # small soft sign - D9 FB; # small y - DA E7; # small z - DB F8; # small sh - DC FD; # small e - DD F9; # small shch - DE F7; # small ch - DF FA; # small hard sign + C0 FE ; # small yu + C1 E0 ; # small a + C2 E1 ; # small b + C3 F6 ; # small ts + C4 E4 ; # small d + C5 E5 ; # small ye + C6 F4 ; # small f + C7 E3 ; # small g + C8 F5 ; # small kh + C9 E8 ; # small i + CA E9 ; # small j + CB EA ; # small k + CC EB ; # small l + CD EC ; # small m + CE ED ; # small n + CF EE ; # small o - E0 DE; # capital YU - E1 C0; # capital A - E2 C1; # capital B - E3 D6; # capital TS - E4 C4; # capital D - E5 C5; # capital YE - E6 D4; # capital F - E7 C3; # capital G - E8 D5; # capital KH - E9 C8; # capital I - EA C9; # capital J - EB CA; # capital K - EC CB; # capital L - ED CC; # capital M - EE CD; # capital N - EF CE; # capital O + D0 EF ; # small p + D1 FF ; # small ya + D2 F0 ; # small r + D3 F1 ; # small s + D4 F2 ; # small t + D5 F3 ; # small u + D6 E6 ; # small zh + D7 E2 ; # small v + D8 FC ; # small soft sign + D9 FB ; # small y + DA E7 ; # small z + DB F8 ; # small sh + DC FD ; # small e + DD F9 ; # small shch + DE F7 ; # small ch + DF FA ; # small hard sign - F0 CF; # capital P - F1 DF; # capital YA - F2 D0; # capital R - F3 D1; # capital S - F4 D2; # capital T - F5 D3; # capital U - F6 C6; # capital ZH - F7 C2; # capital V - F8 DC; # capital soft sign - F9 DB; # capital Y - FA C7; # capital Z - FB D8; # capital SH - FC DD; # capital E - FD D9; # capital SHCH - FE D7; # capital CH - FF DA; # capital hard sign + E0 DE ; # capital YU + E1 C0 ; # capital A + E2 C1 ; # capital B + E3 D6 ; # capital TS + E4 C4 ; # capital D + E5 C5 ; # capital YE + E6 D4 ; # capital F + E7 C3 ; # capital G + E8 D5 ; # capital KH + E9 C8 ; # capital I + EA C9 ; # capital J + EB CA ; # capital K + EC CB ; # capital L + ED CC ; # capital M + EE CD ; # capital N + EF CE ; # capital O + + F0 CF ; # capital P + F1 DF ; # capital YA + F2 D0 ; # capital R + F3 D1 ; # capital S + F4 D2 ; # capital T + F5 D3 ; # capital U + F6 C6 ; # capital ZH + F7 C2 ; # capital V + F8 DC ; # capital soft sign + F9 DB ; # capital Y + FA C7 ; # capital Z + FB D8 ; # capital SH + FC DD ; # capital E + FD D9 ; # capital SHCH + FE D7 ; # capital CH + FF DA ; # capital hard sign } diff --git a/debian/conf/mime.types b/debian/conf/mime.types index fcce4a5..cf968c0 100644 --- a/debian/conf/mime.types +++ b/debian/conf/mime.types @@ -1,79 +1,101 @@ types { - text/html html htm shtml; - text/css css; - text/xml xml rss; - image/gif gif; - image/jpeg jpeg jpg; - application/x-javascript js; - application/atom+xml atom; + 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/png png; - image/tiff tif tiff; - image/vnd.wap.wbmp wbmp; - image/x-icon ico; - image/x-jng jng; - image/x-ms-bmp bmp; - image/svg+xml svg svgz; + 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; - 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.ms-excel xls; - application/vnd.ms-powerpoint ppt; - application/vnd.wap.wmlc wmlc; - application/vnd.google-earth.kml+xml kml; - application/vnd.google-earth.kmz kmz; - 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/zip zip; + font/woff woff; + font/woff2 woff2; - application/octet-stream bin exe dll; - application/octet-stream deb; - application/octet-stream dmg; - application/octet-stream eot; - application/octet-stream iso img; - application/octet-stream msi msp msm; - application/ogg ogx; + 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; - audio/midi mid midi kar; - audio/mpeg mpga mpega mp2 mp3 m4a; - audio/ogg oga ogg spx; - audio/x-realaudio ra; - audio/webm weba; + 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; - video/3gpp 3gpp 3gp; - video/mp4 mp4; - video/mpeg mpeg mpg mpe; - video/ogg ogv; - video/quicktime mov; - video/webm webm; - video/x-flv flv; - video/x-mng mng; - video/x-ms-asf asx asf; - video/x-ms-wmv wmv; - video/x-msvideo avi; + 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/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/naxsi.rules b/debian/conf/naxsi.rules deleted file mode 100644 index fec21ea..0000000 --- a/debian/conf/naxsi.rules +++ /dev/null @@ -1,13 +0,0 @@ -# Sample rules file for default vhost. - -LearningMode; -SecRulesEnabled; -#SecRulesDisabled; -DeniedUrl "/RequestDenied"; - -## check rules -CheckRule "$SQL >= 8" BLOCK; -CheckRule "$RFI >= 8" BLOCK; -CheckRule "$TRAVERSAL >= 4" BLOCK; -CheckRule "$EVADE >= 4" BLOCK; -CheckRule "$XSS >= 8" BLOCK; diff --git a/debian/conf/naxsi_core.rules b/debian/conf/naxsi_core.rules deleted file mode 100644 index c922020..0000000 --- a/debian/conf/naxsi_core.rules +++ /dev/null @@ -1,75 +0,0 @@ -################################## -## INTERNAL RULES IDS:1-10 ## -################################## -#weird_request : 1 -#big_body : 2 -#no_content_type : 3 - -#MainRule "str:yesone" "msg:foobar test pattern" "mz:ARGS" "s:$SQL:42" id:1999; - -################################## -## SQL Injections IDs:1000-1099 ## -################################## -MainRule "rx:select|union|update|delete|insert|table|from|ascii|hex|unhex" "msg:sql keywords" "mz:BODY|URL|ARGS|$HEADERS_VAR:Cookie" "s:$SQL:4" id:1000; -MainRule "str:\"" "msg:double quote" "mz:BODY|URL|ARGS|$HEADERS_VAR:Cookie" "s:$SQL:4" id:1001; -MainRule "str:0x" "msg:0x, possible hex encoding" "mz:BODY|URL|ARGS|$HEADERS_VAR:Cookie" "s:$SQL:2" id:1002; -## Hardcore rules -MainRule "str:/*" "msg:mysql comment (/*)" "mz:BODY|URL|ARGS|$HEADERS_VAR:Cookie" "s:$SQL:8" id:1003; -MainRule "str:*/" "msg:mysql comment (*/)" "mz:BODY|URL|ARGS|$HEADERS_VAR:Cookie" "s:$SQL:8" id:1004; -MainRule "str:|" "msg:mysql keyword (|)" "mz:BODY|URL|ARGS|$HEADERS_VAR:Cookie" "s:$SQL:8" id:1005; -MainRule "rx:&&" "msg:mysql keyword (&&)" "mz:BODY|URL|ARGS|$HEADERS_VAR:Cookie" "s:$SQL:8" id:1006; -## end of hardcore rules -MainRule "str:--" "msg:mysql comment (--)" "mz:BODY|URL|ARGS|$HEADERS_VAR:Cookie" "s:$SQL:4" id:1007; -MainRule "str:;" "msg:; in stuff" "mz:BODY|URL|ARGS" "s:$SQL:4" id:1008; -MainRule "str:=" "msg:equal in var, probable sql/xss" "mz:ARGS|BODY" "s:$SQL:2" id:1009; -MainRule "str:(" "msg:parenthesis, probable sql/xss" "mz:ARGS|URL|BODY|$HEADERS_VAR:Cookie" "s:$SQL:4" id:1010; -MainRule "str:)" "msg:parenthesis, probable sql/xss" "mz:ARGS|URL|BODY|$HEADERS_VAR:Cookie" "s:$SQL:4" id:1011; -MainRule "str:'" "msg:simple quote" "mz:ARGS|BODY|URL|$HEADERS_VAR:Cookie" "s:$SQL:4" id:1013; -MainRule "str:\"" "msg:double quote" "mz:ARGS|BODY|URL|$HEADERS_VAR:Cookie" "s:$SQL:4" id:1014; -MainRule "str:," "msg:, in stuff" "mz:BODY|URL|ARGS|$HEADERS_VAR:Cookie" "s:$SQL:4" id:1015; -MainRule "str:#" "msg:mysql comment (#)" "mz:BODY|URL|ARGS|$HEADERS_VAR:Cookie" "s:$SQL:4" id:1016; - -############################### -## OBVIOUS RFI IDs:1100-1199 ## -############################### -MainRule "str:http://" "msg:html comment tag" "mz:ARGS|BODY|$HEADERS_VAR:Cookie" "s:$RFI:8" id:1100; -MainRule "str:https://" "msg:html comment tag" "mz:ARGS|BODY|$HEADERS_VAR:Cookie" "s:$RFI:8" id:1101; -MainRule "str:ftp://" "msg:html comment tag" "mz:ARGS|BODY|$HEADERS_VAR:Cookie" "s:$RFI:8" id:1102; -MainRule "str:php://" "msg:html comment tag" "mz:ARGS|BODY|$HEADERS_VAR:Cookie" "s:$RFI:8" id:1103; - -####################################### -## Directory traversal IDs:1200-1299 ## -####################################### -MainRule "str:.." "msg:html comment tag" "mz:ARGS|URL|BODY|$HEADERS_VAR:Cookie" "s:$TRAVERSAL:4" id:1200; -MainRule "str:/etc/passwd" "msg:html comment tag" "mz:ARGS|URL|BODY|$HEADERS_VAR:Cookie" "s:$TRAVERSAL:4" id:1202; -MainRule "str:c:\\" "msg:html comment tag" "mz:ARGS|URL|BODY|$HEADERS_VAR:Cookie" "s:$TRAVERSAL:4" id:1203; -MainRule "str:cmd.exe" "msg:html comment tag" "mz:ARGS|URL|BODY|$HEADERS_VAR:Cookie" "s:$TRAVERSAL:4" id:1204; -MainRule "str:\\" "msg:html comment tag" "mz:ARGS|URL|BODY|$HEADERS_VAR:Cookie" "s:$TRAVERSAL:4" id:1205; -#MainRule "str:/" "msg:slash in args" "mz:ARGS|BODY|$HEADERS_VAR:Cookie" "s:$TRAVERSAL:2" id:1206; -######################################## -## Cross Site Scripting IDs:1300-1399 ## -######################################## -MainRule "str:<" "msg:html open tag" "mz:ARGS|URL|BODY|$HEADERS_VAR:Cookie" "s:$XSS:8" id:1302; -MainRule "str:>" "msg:html close tag" "mz:ARGS|URL|BODY|$HEADERS_VAR:Cookie" "s:$XSS:8" id:1303; -MainRule "str:'" "msg:simple quote" "mz:ARGS|URL|BODY|$HEADERS_VAR:Cookie" "s:$XSS:8" id:1306; -MainRule "str:\"" "msg:double quote" "mz:ARGS|URL|BODY|$HEADERS_VAR:Cookie" "s:$XSS:8" id:1307; -MainRule "str:(" "msg:parenthesis" "mz:ARGS|URL|BODY|$HEADERS_VAR:Cookie" "s:$XSS:8" id:1308; -MainRule "str:)" "msg:parenthesis" "mz:ARGS|URL|BODY|$HEADERS_VAR:Cookie" "s:$XSS:8" id:1309; -MainRule "str:[" "msg:html close comment tag" "mz:BODY|URL|ARGS|$HEADERS_VAR:Cookie" "s:$XSS:4" id:1310; -MainRule "str:]" "msg:html close comment tag" "mz:BODY|URL|ARGS|$HEADERS_VAR:Cookie" "s:$XSS:4" id:1311; -MainRule "str:~" "msg:html close comment tag" "mz:BODY|URL|ARGS|$HEADERS_VAR:Cookie" "s:$XSS:4" id:1312; -MainRule "str:;" "msg:semi coma" "mz:ARGS|URL|BODY" "s:$XSS:8" id:1313; -MainRule "str:`" "msg:grave accent !" "mz:ARGS|URL|BODY|$HEADERS_VAR:Cookie" "s:$XSS:8" id:1314; -MainRule "rx:%[2|3]." "msg:double encoding !" "mz:ARGS|URL|BODY|$HEADERS_VAR:Cookie" "s:$XSS:8" id:1315; - -#################################### -## Evading tricks IDs: 1400-1500 ## -#################################### -MainRule "str:&#" "msg: utf7/8 encoding" "mz:ARGS|BODY|URL|$HEADERS_VAR:Cookie" "s:$EVADE:4" id:1400; -MainRule "str:%U" "msg: M$ encoding" "mz:ARGS|BODY|URL|$HEADERS_VAR:Cookie" "s:$EVADE:4" id:1401; -MainRule negative "rx:multipart/form-data|application/x-www-form-urlencoded" "msg:Content is neither mulipart/x-www-form.." "mz:$HEADERS_VAR:Content-type" "s:$EVADE:4" id:1402; - -############################# -## File uploads: 1500-1600 ## -############################# -MainRule "rx:.ph*|.asp*" "msg:asp/php file upload!" "mz:FILE_EXT" "s:$UPLOAD:8" id:1500; diff --git a/debian/conf/nginx.conf b/debian/conf/nginx.conf index c027ac5..68a8fd4 100644 --- a/debian/conf/nginx.conf +++ b/debian/conf/nginx.conf @@ -1,6 +1,9 @@ user www-data; -worker_processes 4; -pid /var/run/nginx.pid; +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 { worker_connections 768; @@ -15,10 +18,8 @@ http { sendfile on; tcp_nopush on; - tcp_nodelay on; - keepalive_timeout 65; 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; @@ -26,43 +27,31 @@ http { include /etc/nginx/mime.types; default_type application/octet-stream; + ## + # SSL Settings + ## + + 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 ## gzip on; - gzip_disable "msie6"; # gzip_vary on; # gzip_proxied any; # gzip_comp_level 6; # gzip_buffers 16 8k; # gzip_http_version 1.1; - # gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript; - - ## - # nginx-naxsi config - ## - # Uncomment it if you installed nginx-naxsi - ## - - #include /etc/nginx/naxsi_core.rules; - - ## - # nginx-passenger config - ## - # Uncomment it if you installed nginx-passenger - ## - - #passenger_root /usr; - #passenger_ruby /usr/bin/ruby; + # gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript; ## # Virtual Host Configs @@ -76,17 +65,17 @@ http { #mail { # # See sample authentication script at: # # http://wiki.nginx.org/ImapAuthenticateWithApachePhpScript -# +# # # auth_http localhost/auth.php; # # pop3_capabilities "TOP" "USER"; # # imap_capabilities "IMAP4rev1" "UIDPLUS"; -# +# # server { # listen localhost:110; # protocol pop3; # proxy on; # } -# +# # server { # listen localhost:143; # protocol imap; diff --git a/debian/conf/proxy_params b/debian/conf/proxy_params index 7fc3792..df75bc5 100644 --- a/debian/conf/proxy_params +++ b/debian/conf/proxy_params @@ -1,3 +1,4 @@ -proxy_set_header Host $host; +proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; +proxy_set_header X-Forwarded-Proto $scheme; diff --git a/debian/conf/scgi_params b/debian/conf/scgi_params index 76e8586..6d4ce4f 100644 --- a/debian/conf/scgi_params +++ b/debian/conf/scgi_params @@ -1,14 +1,17 @@ -scgi_param REQUEST_METHOD $request_method; -scgi_param REQUEST_URI $request_uri; -scgi_param QUERY_STRING $query_string; -scgi_param CONTENT_TYPE $content_type; -scgi_param DOCUMENT_URI $document_uri; -scgi_param DOCUMENT_ROOT $document_root; -scgi_param SCGI 1; -scgi_param SERVER_PROTOCOL $server_protocol; +scgi_param REQUEST_METHOD $request_method; +scgi_param REQUEST_URI $request_uri; +scgi_param QUERY_STRING $query_string; +scgi_param CONTENT_TYPE $content_type; -scgi_param REMOTE_ADDR $remote_addr; -scgi_param REMOTE_PORT $remote_port; -scgi_param SERVER_PORT $server_port; -scgi_param SERVER_NAME $server_name; +scgi_param DOCUMENT_URI $document_uri; +scgi_param DOCUMENT_ROOT $document_root; +scgi_param SCGI 1; +scgi_param SERVER_PROTOCOL $server_protocol; +scgi_param REQUEST_SCHEME $scheme; +scgi_param HTTPS $https if_not_empty; + +scgi_param REMOTE_ADDR $remote_addr; +scgi_param REMOTE_PORT $remote_port; +scgi_param SERVER_PORT $server_port; +scgi_param SERVER_NAME $server_name; diff --git a/debian/conf/sites-available/default b/debian/conf/sites-available/default index 1458ec4..c5af914 100644 --- a/debian/conf/sites-available/default +++ b/debian/conf/sites-available/default @@ -1,74 +1,65 @@ -# You may add here your -# server { -# ... -# } -# statements for each of your virtual hosts to this file - ## # You should look at the following URL's in order to grasp a solid understanding # of Nginx configuration files in order to fully unleash the power of Nginx. -# http://wiki.nginx.org/Pitfalls -# http://wiki.nginx.org/QuickStart -# http://wiki.nginx.org/Configuration +# https://www.nginx.com/resources/wiki/start/ +# https://www.nginx.com/resources/wiki/start/topics/tutorials/config_pitfalls/ +# https://wiki.debian.org/Nginx/DirectoryStructure # -# Generally, you will want to move this file somewhere, and start with a clean -# file but keep this around for reference. Or just disable in sites-enabled. +# In most cases, administrators will remove this file from sites-enabled/ and +# leave it as reference inside of sites-available where it will continue to be +# updated by the nginx packaging team. +# +# This file will automatically load configuration files provided by other +# applications, such as Drupal or Wordpress. These applications will be made +# available underneath a path with that package name, such as /drupal8. # # Please see /usr/share/doc/nginx-doc/examples/ for more detailed examples. ## +# Default server configuration +# server { - #listen 80; ## listen for ipv4; this line is default and implied - #listen [::]:80 default_server ipv6only=on; ## listen for ipv6 + listen 80 default_server; + listen [::]:80 default_server; - root /usr/share/nginx/www; - index index.html index.htm; + # SSL configuration + # + # listen 443 ssl default_server; + # listen [::]:443 ssl default_server; + # + # Note: You should disable gzip for SSL traffic. + # See: https://bugs.debian.org/773332 + # + # Read up on ssl_ciphers to ensure a secure configuration. + # See: https://bugs.debian.org/765782 + # + # Self signed certs generated by the ssl-cert package + # Don't use them in a production server! + # + # include snippets/snakeoil.conf; - # Make site accessible from http://localhost/ - server_name localhost; + root /var/www/html; + + # Add index.php to the list if you are using PHP + index index.html index.htm index.nginx-debian.html; + + server_name _; location / { # First attempt to serve request as file, then # as directory, then fall back to displaying a 404. - try_files $uri $uri/ /index.html; - # Uncomment to enable naxsi on this location - # include /etc/nginx/naxsi.rules + try_files $uri $uri/ =404; } - location /doc/ { - alias /usr/share/doc/; - autoindex on; - allow 127.0.0.1; - allow ::1; - deny all; - } - - # Only for nginx-naxsi used with nginx-naxsi-ui : process denied requests - #location /RequestDenied { - # proxy_pass http://127.0.0.1:8080; - #} - - #error_page 404 /404.html; - - # redirect server error pages to the static page /50x.html - # - #error_page 500 502 503 504 /50x.html; - #location = /50x.html { - # root /usr/share/nginx/www; - #} - - # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000 + # pass PHP scripts to FastCGI server # #location ~ \.php$ { - # fastcgi_split_path_info ^(.+\.php)(/.+)$; - # # NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini + # include snippets/fastcgi-php.conf; # - # # With php5-cgi alone: + # # With php-fpm (or other unix sockets): + # fastcgi_pass unix:/run/php/php7.4-fpm.sock; + # # With php-cgi (or other tcp sockets): # fastcgi_pass 127.0.0.1:9000; - # # With php5-fpm: - # fastcgi_pass unix:/var/run/php5-fpm.sock; - # fastcgi_index index.php; - # include fastcgi_params; #} # deny access to .htaccess files, if Apache's document root @@ -80,39 +71,19 @@ server { } -# another virtual host using mix of IP-, name-, and port-based configuration +# Virtual Host configuration for example.com +# +# You can move that to a different file under sites-available/ and symlink that +# to sites-enabled/ to enable it. # #server { -# listen 8000; -# listen somename:8080; -# server_name somename alias another.alias; -# root html; -# index index.html index.htm; -# -# location / { -# try_files $uri $uri/ =404; -# } -#} - - -# HTTPS server -# -#server { -# listen 443; -# server_name localhost; -# -# root html; -# index index.html index.htm; -# -# ssl on; -# ssl_certificate cert.pem; -# ssl_certificate_key cert.key; -# -# ssl_session_timeout 5m; -# -# ssl_protocols SSLv3 TLSv1; -# ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv3:+EXP; -# ssl_prefer_server_ciphers on; +# listen 80; +# listen [::]:80; +# +# server_name example.com; +# +# root /var/www/example.com; +# index index.html; # # location / { # try_files $uri $uri/ =404; diff --git a/debian/conf/snippets/fastcgi-php.conf b/debian/conf/snippets/fastcgi-php.conf new file mode 100644 index 0000000..467a9e7 --- /dev/null +++ b/debian/conf/snippets/fastcgi-php.conf @@ -0,0 +1,13 @@ +# regex to split $uri to $fastcgi_script_name and $fastcgi_path +fastcgi_split_path_info ^(.+?\.php)(/.*)$; + +# Check that the PHP script exists before passing it +try_files $fastcgi_script_name =404; + +# Bypass the fact that try_files resets $fastcgi_path_info +# see: http://trac.nginx.org/nginx/ticket/321 +set $path_info $fastcgi_path_info; +fastcgi_param PATH_INFO $path_info; + +fastcgi_index index.php; +include fastcgi.conf; diff --git a/debian/conf/snippets/snakeoil.conf b/debian/conf/snippets/snakeoil.conf new file mode 100644 index 0000000..ad26c3e --- /dev/null +++ b/debian/conf/snippets/snakeoil.conf @@ -0,0 +1,5 @@ +# Self signed certificates generated by the ssl-cert package +# Don't use them in a production server! + +ssl_certificate /etc/ssl/certs/ssl-cert-snakeoil.pem; +ssl_certificate_key /etc/ssl/private/ssl-cert-snakeoil.key; diff --git a/debian/conf/uwsgi_params b/debian/conf/uwsgi_params index 3f72dbf..09c732c 100644 --- a/debian/conf/uwsgi_params +++ b/debian/conf/uwsgi_params @@ -1,15 +1,17 @@ -uwsgi_param QUERY_STRING $query_string; -uwsgi_param REQUEST_METHOD $request_method; -uwsgi_param CONTENT_TYPE $content_type; -uwsgi_param CONTENT_LENGTH $content_length; -uwsgi_param REQUEST_URI $request_uri; -uwsgi_param PATH_INFO $document_uri; -uwsgi_param DOCUMENT_ROOT $document_root; -uwsgi_param SERVER_PROTOCOL $server_protocol; -uwsgi_param UWSGI_SCHEME $scheme; +uwsgi_param QUERY_STRING $query_string; +uwsgi_param REQUEST_METHOD $request_method; +uwsgi_param CONTENT_TYPE $content_type; +uwsgi_param CONTENT_LENGTH $content_length; -uwsgi_param REMOTE_ADDR $remote_addr; -uwsgi_param REMOTE_PORT $remote_port; -uwsgi_param SERVER_PORT $server_port; -uwsgi_param SERVER_NAME $server_name; +uwsgi_param REQUEST_URI $request_uri; +uwsgi_param PATH_INFO $document_uri; +uwsgi_param DOCUMENT_ROOT $document_root; +uwsgi_param SERVER_PROTOCOL $server_protocol; +uwsgi_param REQUEST_SCHEME $scheme; +uwsgi_param HTTPS $https if_not_empty; + +uwsgi_param REMOTE_ADDR $remote_addr; +uwsgi_param REMOTE_PORT $remote_port; +uwsgi_param SERVER_PORT $server_port; +uwsgi_param SERVER_NAME $server_name; diff --git a/debian/control b/debian/control index de4809b..47749f4 100644 --- a/debian/control +++ b/debian/control @@ -1,50 +1,43 @@ Source: nginx Section: httpd Priority: optional -Maintainer: Kartik Mistry -Uploaders: Jose Parrella , - Fabio Tranchitella , - Michael Lustfield , - Dmitry E. Oboukhov , - Cyril Lavier , - Christos Trochalakis -Build-Depends: autotools-dev, - debhelper (>= 7), - dpkg-dev (>= 1.15.7), +Maintainer: Debian Nginx Maintainers +Uploaders: Jan Mojžíš +Build-Depends: debhelper-compat (= 13), libexpat-dev, - libgd2-noxpm-dev, + libgd-dev, libgeoip-dev, - liblua5.1-dev, - libmhash-dev, - libpam0g-dev, - libpcre3-dev, + libpcre2-dev, libperl-dev, libssl-dev, libxslt1-dev, po-debconf, zlib1g-dev -Standards-Version: 3.9.3 -Homepage: http://nginx.net -Vcs-Git: git://anonscm.debian.org/collab-maint/nginx.git -Vcs-Browser: http://anonscm.debian.org/gitweb/?p=collab-maint/nginx.git;a=summary +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-full | nginx-light, - ${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-full (by default) or - nginx-light. Package: nginx-doc Architecture: all +Multi-Arch: foreign Section: doc -Depends: lsb-base (>= 3.2-14), - ${misc:Depends} +Depends: ${misc:Depends} Description: small, powerful, scalable web/proxy server - documentation 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 @@ -53,17 +46,12 @@ 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 -Depends: lsb-base (>= 3.2-14), - ${misc:Depends} -Replaces: nginx (<< 0.8.54-4), - nginx-extras (<< 0.8.54-4), - nginx-full (<< 0.8.54-4), - nginx-light (<< 0.8.54-4) -Breaks: nginx (<< 0.8.54-4), - nginx-extras (<< 0.8.54-4), - nginx-full (<< 0.8.54-4), - nginx-light (<< 0.8.54-4) +Multi-Arch: foreign +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 created by Igor Sysoev. It can be used both as a standalone web server @@ -72,223 +60,252 @@ Description: small, powerful, scalable web/proxy server - common files This package contains base configuration files used by all versions of nginx. -Package: nginx-full -Architecture: any -Depends: nginx-common (= ${source:Version}), +Package: nginx-dev +Architecture: all +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 + 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 development headers and necessary config scripts + for the nginx web/proxy server, useful to develop and link third party + additions to the Debian nginx web/proxy server packages. + +Package: nginx-core +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} -Provides: httpd, - nginx -Conflicts: nginx-extras, - nginx-light, - nginx-naxsi +Breaks: nginx-full (<< 1.18.0-1), +Replaces: nginx-full (<< 1.18.0-1), 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 with the complete set of - standard modules included (but omitting some of those included in - nginx-extra). + 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. . - STANDARD HTTP MODULES: Core, Access, Auth Basic, Auto Index, Browser, - Charset, Empty GIF, FastCGI, Geo, Gzip, Headers, Index, Limit Requests, - Limit Zone, Log, Map, Memcached, Proxy, Referer, Rewrite, SCGI, - Split Clients, SSI, Upstream, User ID, UWSGI. + STANDARD HTTP MODULES: Core, Access, Auth Basic, Auto Index, Browser, Empty + GIF, FastCGI, Geo, Limit Connections, Limit Requests, Map, Memcached, Proxy, + Referer, Rewrite, SCGI, Split Clients, UWSGI. . - OPTIONAL HTTP MODULES: Addition, Debug, GeoIP, Gzip Precompression, - HTTP Sub, Image Filter, IPv6, Real IP, SSL, Stub Status, Substitution, - WebDAV, XSLT. + OPTIONAL HTTP MODULES: Addition, Auth Request, Charset, WebDAV, GeoIP, Gunzip, + Gzip, Gzip Precompression, Headers, HTTP/2, Image Filter, Index, Log, Real IP, + Slice, SSI, SSL, SSL Preread, Stub Status, Substitution, Thread Pool, + Upstream, User ID, XSLT. . - MAIL MODULES: Mail Core, IMAP, POP3, SMTP, SSL. + OPTIONAL MAIL MODULES: Mail Core, Auth HTTP, Proxy, SSL, IMAP, POP3, SMTP. . - THIRD PARTY MODULES: Auth PAM, DAV Ext, Echo, Upstream Fair Queue. + OPTIONAL STREAM MODULES: Stream Core, GeoIP -Package: nginx-full-dbg -Architecture: any -Section: debug -Priority: extra -Depends: nginx-full (= ${binary:Version}), - ${misc:Depends} -Conflicts: nginx-extras-dbg, - nginx-light-dbg, - nginx-naxsi-dbg -Description: nginx web/proxy server (standard version) - debugging symbols +Package: nginx-full +Architecture: all +Depends: libnginx-mod-http-auth-pam, + libnginx-mod-http-dav-ext, + libnginx-mod-http-echo, + libnginx-mod-http-geoip2, + libnginx-mod-http-subs-filter, + libnginx-mod-http-upstream-fair, + libnginx-mod-stream-geoip2, + nginx (>= ${source:Version}), + nginx (<< ${source:Version}.1~), + ${misc:Depends}, + ${shlibs:Depends} +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 and as a proxy to reduce the load on back-end HTTP or mail servers. . - This package provides debugging symbols for nginx-full, to assist in debugging - issues that you may find. It should not be required for normal operation. + This metapackage provides a version of nginx with the complete set of + standard modules included (but omitting some of those included in + nginx-extras). + . + STANDARD HTTP MODULES: Core, Access, Auth Basic, Auto Index, Browser, Empty + GIF, FastCGI, Geo, Limit Connections, Limit Requests, Map, Memcached, Proxy, + Referer, Rewrite, SCGI, Split Clients, UWSGI. + . + OPTIONAL HTTP MODULES: Addition, Auth Request, Charset, WebDAV, GeoIP, Gunzip, + Gzip, Gzip Precompression, Headers, HTTP/2, Image Filter, Index, Log, Real IP, + Slice, SSI, SSL, Stream, SSL Preread, Stub Status, Substitution, Thread Pool, + Upstream, User ID, XSLT. + . + OPTIONAL MAIL MODULES: Mail Core, Auth HTTP, Proxy, SSL, IMAP, POP3, SMTP. + . + OPTIONAL STREAM MODULES: Stream Core, GeoIP, GeoIP2 + . + THIRD PARTY MODULES: Auth PAM, DAV Ext, Echo, GeoIP2, HTTP Substitutions + Upstream Fair Queue. Package: nginx-light -Architecture: any -Priority: extra -Depends: nginx-common (= ${source:Version}), +Architecture: all +Depends: libnginx-mod-http-echo, + nginx (>= ${source:Version}), + nginx (<< ${source:Version}.1~), ${misc:Depends}, ${shlibs:Depends} -Provides: httpd, - nginx -Conflicts: nginx-extras, - nginx-full, - nginx-naxsi 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, Charset, - Empty GIF, FastCGI, Gzip, Headers, Index, Log, Map, Proxy, Rewrite, Upstream. + STANDARD HTTP MODULES: Core, Access, Auth Basic, Auto Index, Empty GIF, + FastCGI, Map, Proxy, Rewrite, SCGI, uWSGI. . - OPTIONAL HTTP MODULES: Gzip Precompression, IPv6, SSL, Stub Status. + OPTIONAL HTTP MODULES: Auth Request, Charset, Gzip, Gzip Precompression, + Headers, HTTP/2, Index, Log, Real IP, Slice, SSI, SSL, Stub Status, Thread + Pool, WebDAV, Upstream. . THIRD PARTY MODULES: Echo. -Package: nginx-light-dbg -Architecture: any -Section: debug -Priority: extra -Depends: nginx-light (= ${binary:Version}), - ${misc:Depends} -Conflicts: nginx-extras-dbg, - nginx-full-dbg, - nginx-naxsi-dbg -Description: nginx web/proxy server (basic version) - debugging symbols - 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 debugging symbols for nginx-light, to assist in - debugging issues that you may find. It should not be required for normal - operation. - Package: nginx-extras Architecture: any -Priority: extra -Depends: nginx-common (= ${source:Version}), +Depends: nginx (= ${binary:Version}), + libnginx-mod-http-geoip (= ${binary:Version}), + libnginx-mod-http-image-filter (= ${binary:Version}), + libnginx-mod-http-perl (= ${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}), + 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}, - ${perl:Depends}, ${shlibs:Depends} -Provides: httpd, - nginx -Conflicts: nginx-full, - nginx-light, - nginx-naxsi 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. . - STANDARD HTTP MODULES: Core, Access, Auth Basic, Auto Index, Browser, - Charset, Empty GIF, FastCGI, Geo, Gzip, Headers, Index, Limit Requests, - Limit Zone, Log, Map, Memcached, Proxy, Referer, Rewrite, SCGI, - Split Clients, SSI, Upstream, User ID, UWSGI. + STANDARD HTTP MODULES: Core, Access, Auth Basic, Auto Index, Browser, Empty + GIF, FastCGI, Geo, Limit Connections, Limit Requests, Map, Memcached, Proxy, + Referer, Rewrite, SCGI, Split Clients, UWSGI. . - OPTIONAL HTTP MODULES: Addition, Debug, Embedded Perl, FLV, GeoIP, - Gzip Precompression, Image Filter, IPv6, MP4, Random Index, Real IP, - Secure Link, SSL, Stub Status, Substitution, WebDAV, XSLT. + OPTIONAL HTTP MODULES: Addition, Auth Request, Charset, WebDAV, FLV, GeoIP, + Gunzip, Gzip, Gzip Precompression, Headers, HTTP/2, Image Filter, Index, Log, + MP4, Embedded Perl, Random Index, Real IP, Slice, Secure Link, SSI, SSL, + SSL Preread, Stub Status, Substitution, Thread Pool, Upstream, User ID, XSLT. . - MAIL MODULES: Mail Core, IMAP, POP3, SMTP, SSL. + OPTIONAL MAIL MODULES: Mail Core, Auth HTTP, Proxy, SSL, IMAP, POP3, SMTP. . - THIRD PARTY MODULES: Auth PAM, Chunkin, DAV Ext, Echo, Embedded Lua, - HttpHeadersMore, http push, Nginx Development Kit, Upload module, - Upload Progress, Upstream Fair Queue. + OPTIONAL STREAM MODULES: Stream, GeoIP, GeoIP2 + . + THIRD PARTY MODULES: Auth PAM, Cache Purge, DAV Ext, Echo, Fancy Index, + GeoIP2, Headers More, Embedded Lua, HTTP Substitutions, Nchan, Upload Progress, + Upstream Fair Queue. -Package: nginx-extras-dbg +Package: libnginx-mod-http-geoip Architecture: any -Section: debug -Priority: extra -Depends: nginx-extras (= ${binary:Version}), - ${misc:Depends} -Conflicts: nginx-full-dbg, - nginx-light-dbg, - nginx-naxsi-dbg -Description: nginx web/proxy server (extended version) - debugging symbols - 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. +Depends: ${misc:Depends}, ${shlibs:Depends}, +Recommends: nginx, +Description: GeoIP HTTP module for Nginx + The ngx_http_geoip module creates variables with values depending on the + client IP address, using the precompiled MaxMind databases. . - This package provides debugging symbols for nginx-extras, to assist in - debugging issues that you may find. It should not be required for normal - operation. + Those variables include country, region, city, latitude, longitude, postal + code, etc. -Package: nginx-naxsi +Package: libnginx-mod-http-image-filter Architecture: any -Priority: extra -Depends: nginx-common (= ${source:Version}), - ${misc:Depends}, - ${shlibs:Depends} -Provides: httpd, - nginx -Conflicts: nginx-extras, - nginx-full, - nginx-light -Description: nginx web/proxy server (version with naxsi) - 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. +Depends: ${misc:Depends}, ${shlibs:Depends}, +Recommends: nginx, +Description: HTTP image filter module for Nginx + The ngx_http_image_filter module is a filter that transforms images in JPEG, + GIF, and PNG formats. . - This package provides a version of nginx with the basic modules, plus - the naxsi Web Application Firewall module. - . - STANDARD HTTP MODULES: Core, Access, Auth Basic, Auto Index, Browser, - Charset, Core, Empty GIF, FastCGI, Geo, Gzip, Headers, Index, - Limit Requests, Limit Zone, Log, Map, Memcached, Proxy, Referer, - Rewrite, Split Clients, SSI, Upstream, User ID. - . - OPTIONAL HTTP MODULES: IPv6, SSL, Stub Status. - . - THIRD PARTY MODULES: Naxsi, Cache Purge, Upstream Fair. + The module supports filters such as rotate, resize, crop, quality, sharpening, + interlacing and more. -Package: nginx-naxsi-dbg +Package: libnginx-mod-http-xslt-filter Architecture: any -Section: debug -Priority: extra -Depends: nginx-naxsi (= ${binary:Version}), - ${misc:Depends} -Conflicts: nginx-extras-dbg, - nginx-full-dbg, - nginx-light-dbg -Description: nginx web/proxy server (version with naxsi) - debugging symbols - 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. +Depends: ${misc:Depends}, ${shlibs:Depends}, +Recommends: nginx, +Description: XSLT Transformation module for Nginx + The ngx_http_xslt_filter module is a filter that transforms XML responses + using one or more XSLT stylesheets. . - This package provides debugging symbols for nginx-naxsi, to assist in - debugging issues that you may find. It should not be required for normal - operation. + The transformation can be adjusted by setting the relevant configuration + parameters. -Package: nginx-naxsi-ui -Architecture: all -Priority: extra -Depends: daemon, - dbconfig-common, - nginx-naxsi (>= ${source:Version}), - python-mysqldb, - python-twisted-web, - ${misc:Depends} -Recommends: mysql-server -Provides: httpd, - naxsi, - nginx -Conflicts: nginx-extras, - nginx-full, - nginx-light -Description: nginx web/proxy server - naxsi configuration front-end - 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. +Package: libnginx-mod-mail +Architecture: any +Depends: ${misc:Depends}, ${shlibs:Depends}, +Recommends: nginx, +Description: Mail module for Nginx + The nginx_mail module adds mail proxy support to nginx. . - This package provides the autolearning daemon and web user interface for - nginx's naxsi module. + The module supports proxying all the standard mail protocols such as IMAP, + POP3 & SMTP. + +Package: libnginx-mod-stream +Architecture: any +Depends: ${misc:Depends}, ${shlibs:Depends}, +Recommends: nginx, +Description: Stream module for Nginx + The nginx_stream module adds stream proxy support to nginx. . - It includes an interceptor (listening on TCP port 8080), which monitors - HTTP requests from naxsi, and an extractor (running on TCP port 8081), - which reads the database and prints reports about blocked requests. + Stream module supports loadbalancing & proxying to TCP servers. The module + also supports ACLs/connection limiting and configuring multiple operational + parameters. + +Package: libnginx-mod-stream-geoip +Architecture: any +Depends: ${misc:Depends}, ${shlibs:Depends}, + libnginx-mod-stream (= ${binary:Version}), +Recommends: nginx, +Description: GeoIP Stream module for Nginx + The ngx_stream_geoip module creates variables with values depending on the + client IP address, using the precompiled MaxMind 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}, +Recommends: nginx, +Description: Perl module for Nginx + Embed Perl runtime into nginx. + . + The ngx_http_perl module is used to implement location and variable handlers + in Perl and insert Perl calls into SSI. + . + Note that this module is marked experimental. diff --git a/debian/copyright b/debian/copyright index 72ca63d..0536a8c 100644 --- a/debian/copyright +++ b/debian/copyright @@ -1,153 +1,136 @@ -Format: http://www.debian.org/doc/packaging-manuals/copyright-format/1.0/ -Upstream-Name: Nginx -Source: http://nginx.net/ -Upstream-Contact: Igor Sysoev +Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/ +Upstream-Name: nginx +Source: https://nginx.org/en/download.html Files: * -Copyright: 2002-2012 Igor Sysoev - 2011,2012 Nginx, Inc. -License: - 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 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 +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 Copyright: 2005, Andrei Nigmatulin -License: - Same as upstream license. +License: BSD-2-clause -Files: modules/nginx-upstream-fair/ngx_http_upstream_fair_module.c -Copyright: 2007, Igor Sysoev, Grzegorz Nosek -License: - Same as upstream license. +Files: debian/* +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: modules/nginx-development-kit/* -Copyright: Marcus Clyne -License: - Same as upstream license. +Files: debian/apport/* +Copyright: 2015, Thomas Ward +License: BSD-2-clause -Files: modules/nginx-http-push/* -Copyright: 2009, Leo Ponomarev -License: - Same as upstream license. +Files: debian/debhelper/* +Copyright: 2022, Miao Wang +License: Expat -Files: modules/nginx-upload-progress/ngx_http_uploadprogress_module.c -Copyright: 2007, Brice Figureau - 2002-2007, Igor Sysoev -License: - Same as upstream license. +Files: debian/debhelper/dh_nginx +Copyright: 2016, Christos Trochalakis +License: GPL-2+ -Files: modules/agentzh-chunkin-nginx-module-*/* - modules/agentzh-headers-more-nginx-module-*/* -Copyright: 2009, Taobao Inc., Alibaba Group . - 2009-2011, Zhang "agentzh" Yichun (章亦春) . -License: - Same as upstream license. +Files: debian/ngx-conf/ngx-conf +Copyright: 2015, Michael Lustfield +License: Expat -Files: modules/nginx-auth-pam/* -Copyright: 2008-2010, Sergio Talens Oliag -License: - Same as upstream license. +Files: man/* +Copyright: Nginx, Inc. + 2010, 2019, Sergey A. Osokin +License: BSD-2-clause -Files: modules/nginx-cache-purge -Copyright: 2009-2011, FRiCKLE , - 2009-2011, Piotr Sikora -License: - Same as upstream license. +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: modules/nginx-dav-ext-module/ -Copyright: 2012, Arutyunyan Roman -License: - Same as upstream license. +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: modules/nginx-upload-module -Copyright: 2006, 2008, Valery Kholodkov -License: +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: src/http/ngx_http_huff_encode.c +Copyright: Valentin V. Bartenev + Nginx, Inc. + 2015, Vlad Krasnov +License: BSD-2-clause + +Files: src/stream/ngx_stream_set_module.c +Copyright: Pavel Pautov + Nginx, Inc. +License: BSD-2-clause + +License: BSD-2-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: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * 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. - * Neither the name of the Valery Kholodkov nor the - names of its contributors may be used to endorse or promote products - derived from this software without specific prior written permission. + modification, are permitted provided that the following conditions are + met: . - THIS SOFTWARE IS PROVIDED BY VALERY KHOLODKOV ''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 VALERY KHOLODKOV 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. + 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. -Files: modules/naxsi -Copyright: 2012, Thibault Koechlin -License: GPL-2+ with OpenSSL exception +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 + deal in the Software without restriction, including without limitation the + rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + . + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + . + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + 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. -Files: modules/naxsi/contrib/fp-reporter/fp-reporter.php -Copyright: 2011, Thibault 'bui' Koechlin, Didier Conchaudron -License: GPL-2+ with OpenSSL exception - -License: GPL-2+ with OpenSSL exception - This program is free software: you can redistribute it and/or modify +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, either version 2 of the License, or - (at your option) any later version. - . - In addition, as a special exception, the copyright holders give - permission to link the code of portions of this program with the - OpenSSL library under certain conditions as described in each - individual source file, and distribute linked combinations - including the two. - . - You must obey the GNU General Public License in all respects - for all of the code used other than OpenSSL. If you modify - file(s) with this exception, you may extend this exception to your - version of the file(s), but you are not obligated to do so. If you - do not wish to do so, delete this exception statement from your - version. If you delete this exception statement from all source - files in the program, then also delete it here. - . - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - . - You should have received a copy of the GNU General Public License - along with this program. If not, see . - . - On Debian systems, the complete text of the GNU General - Public Licenses can be found in "/usr/share/common-licenses/GPL-2" and - "/usr/share/common-licenses/GPL-3" - -Files: debian/* -Copyright: 2006-2010, Jose Parrella , - Fabio Tranchitella , - 2009-2012, Kartik Mistry , - 2012, Michael Lustfield , - Dmitry E. Oboukhov , - Cyril Lavier . -License: - Same as upstream license. + 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 new file mode 100755 index 0000000..9100220 --- /dev/null +++ b/debian/debhelper/dh_nginx @@ -0,0 +1,334 @@ +#! /usr/bin/perl + +# dh_nginx - Nginx configuration helper +# Copyright (C) 2016 Christos Trochalakis +# +# This program is licensed under the terms of the GNU General +# Public License veserion 2+ +# +# 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; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +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 +{ + 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 +{ + return "/usr/lib/nginx/modules/"; +} + +sub nginx_modules_conf_installdir +{ + return "usr/share/nginx/modules-available/" +} + +=head1 SYNOPSIS + +B [S>] [B<-n>|B<--noscripts>] [B<--in-nginx-tree>] + +=head1 DESCRIPTION + +B is a debhelper program that is responsible for correctly installing +Nginx configuration snippets and setting postinst, prerm and dependencies in +Nginx web server modules and web applications. + +It supports the following configuration types + +=over 4 + +=item * +Nginx modules + +=back + +=head1 INVOCATION + + %: + dh $@ --with nginx + +=head1 FILES + +=over 4 + +=item debian/I.nginx + +=item debian/nginx + +=back + +Lists files to be registered with the Nginx HTTP server. The file is +interpreted as line separated list of installation stanzas, where each entry +consists of whitespace separated values conforming to the file semantics below. + +When this file is missing but the name of the package looks like a nginx module, +the module load file and its loading priority is automatically generated inferring +from the package name. In this case, IB<.install> or other mechanisms +should be used for copying the B<.so> library into the correct place. + +=head2 FILE SEMANTICS + +Each line consists of a triple + +I I [I] + +where the values are interpreted as follows: + + +=head3 I + +Denotes the type of file to be installed. Recognized values are B for +Nginx modules. + +=head3 I + +Is interpreted as existing file name within the source package. No path +expansion is effectuated. Just like L, B can not +rename files. + +=head3 I + +Is inrerpreted as optional arguments if any, currently not used. + +=head2 MODULES + +Modules are handled specially and are determined by the B type. Modules must +have a I<.conf> suffix. In that case the file is interpreted as module load +file and is installed to I. If the file is ending +with a I<.so> suffix it is interpreted as actual module shared object and is +installed to the Nginx module directory, an optional numeric priority can be +set as the last argument to handle module dependencies. + +=head1 OPTIONS + +=over 4 + +=item B<-e>, B<--noenable> + +Install maintainer scripts accordingly, but do not enable the scripts or +configuration by default. + +=item B<-n>, B<--noscripts> + +Do not modify F/F/F maintainer scripts. + +=item B<--in-nginx-tree> + +Specify this option when building in-tree modules along with nginx. When +specified, nginx abi version is not required in package name. + +=back + +=head1 NOTES + +Note that this command is not idempotent. L should be called +between invocations of this command. Otherwise, it may cause multiple +instances of the same text to be added to maintainer scripts. + +=head1 AUTHOR + +This manual and L was written by Christos Trochalakis. +dh_nginx is heavily influnced by dh_apache2 written by Arno Toell +. + +=cut + + +## +## main code starts here +## + +init(options => { + "e|noenable" => \$dh{NOENABLE}, + "in-nginx-tree" => \$nginx_in_tree, +}); + +foreach my $package ((@{$dh{DOPACKAGES}})) +{ + my %PACKAGE_TYPE = ( + has_a_module => [], + ); + + my $file = pkgfile($package, "nginx"); + my $tmp = tmpdir($package); + my $installdir = $tmp . "/" . nginx_modules_conf_installdir(); + my $modinstalldir = $tmp . "/" . nginx_api_installdir(); + + if ($file){ + my @files_to_register = filedoublearray($file, ".") if $file; + foreach my $line (@files_to_register) + { + my $type = lc(shift @{$line}) if $line->[0]; + my $source = shift @{$line} if $line->[0]; + my @arguments = @{$line}; + my $destination; + + $type = "modules" if $type eq "mod"; + + verbose_print("$type -- $source -- @arguments\n\n"); + + if ($type eq "modules") + { + my $basesource = basename($source); + + if ($type eq "modules") + { + if ($basesource =~ m/\.conf$/) + { + my $enablename = $basesource; + my $prio = $#arguments >= 0 ? $arguments[0] : 50; + $destination = "$prio-$basesource"; + push @{$PACKAGE_TYPE{'has_a_module'}}, "$enablename:$destination"; + verbose_print("Installing module configuration $enablename into $installdir prio:$prio\n"); + } + elsif ($basesource =~ m/\.so$/) + { + verbose_print("Installing module binary $source into $modinstalldir\n"); + if (! -d $modinstalldir) + { + complex_doit("mkdir","-p", $modinstalldir); + complex_doit("chmod","755","$modinstalldir"); + } + complex_doit("cp", $source, $modinstalldir); + next; + } + + # TODO + error("module: \"$basesource\" needs .conf, .so or suffix") if $basesource !~ m/\.(conf|so)/; + } + + if (! -d $installdir) + { + complex_doit("mkdir","-p",$installdir); + complex_doit("chmod","755","$installdir"); + } + complex_doit("cp",$source,$installdir); + complex_doit("chmod","644","$installdir/$basesource"); + + } + else + { + error("Unknown parameter: $type\n"); + } + + } + } elsif ($package =~ /^libnginx-mod-/){ + verbose_print("$package might be a nginx module\n"); + + my $module = $package; + $module =~ s/^libnginx-mod-//; + verbose_print("Guessed module name: $module\n"); + + my $modulepath = $module; + $modulepath =~ s/-/_/g; + + if (-e "$modinstalldir/ngx_${modulepath}_module.so"){ + my $prio = 50; + if ($module =~ /^\w+-/ && !($module =~ /^http-/) ){ + $prio = 70; + } + verbose_print("Guessed load priority: $prio\n"); + + my $conf_name = "mod-$module.conf"; + install_dir($installdir); + verbose_print("Installing module configuration $conf_name into $installdir prio:$prio\n"); + open(MOD_CONF, $dh{NO_ACT} ? ">&STDERR" : ">$installdir/$conf_name") or error("open($installdir/$conf_name): $!"); + print(MOD_CONF "load_module modules/ngx_${modulepath}_module.so;\n"); + close(MOD_CONF); + chmod(0644, "$installdir/$conf_name") or error("chmod(0644, $installdir/$conf_name): $!"); + push @{$PACKAGE_TYPE{'has_a_module'}}, "$conf_name:$prio-$conf_name"; + } else { + verbose_print("$package is not a nginx module because $modinstalldir/ngx_${modulepath}_module.so not found"); + verbose_print("If it is not correct, check if the module is installed before invoking this script"); + } + } + + 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"); + } + addsubstvar($package, "misc:Depends", nginx_depends()); + + my $modules = ""; + foreach my $module (@{$PACKAGE_TYPE{'has_a_module'}}) + { + $modules .= "$module "; + } + + push @postinst_autoscripts, ["module", $modules]; + } + + if (! $dh{NOSCRIPTS}) + { + foreach my $ref (@postinst_autoscripts) + { + for my $script_type (qw/postinst prerm postrm/) + { + if ($script_type eq "postinst" && $dh{NOENABLE}) + { + next + } + + my %replacements = ( + NAMES => $ref->[1], + ); + + my $sed_command = ""; + foreach my $key (sort keys %replacements) + { + my $val = $replacements{$key}; + # Use a control char as separator for sed, to + # reduce escaping issues. Everything else is + # passed verbatim, i.e. it must not contain any + # shell or sed special characters. + my $sep = "\x17"; + $sed_command .= "s" . $sep . "#$key#" . + $sep . $val . + $sep . "g; "; + } + + autoscript($package, "$script_type", "$script_type-nginx", $sed_command); + } + } + } +} + +# vim: syntax=perl sw=8 sts=8 sr noet diff --git a/debian/debhelper/nginx.pm b/debian/debhelper/nginx.pm new file mode 100644 index 0000000..0e41120 --- /dev/null +++ b/debian/debhelper/nginx.pm @@ -0,0 +1,14 @@ +#!/usr/bin/perl +use warnings; +use strict; +use Debian::Debhelper::Dh_Lib; + +add_command_options( "dh_auto_test", "--buildsystem=nginx_mod" ); +add_command_options( "dh_auto_configure", "--buildsystem=nginx_mod" ); +add_command_options( "dh_auto_build", "--buildsystem=nginx_mod" ); +add_command_options( "dh_auto_install", "--buildsystem=nginx_mod" ); +add_command_options( "dh_auto_clean", "--buildsystem=nginx_mod" ); + +insert_after("dh_install", "dh_nginx"); + +1; diff --git a/debian/debhelper/nginx_mod.pm b/debian/debhelper/nginx_mod.pm new file mode 100644 index 0000000..1b1ecaf --- /dev/null +++ b/debian/debhelper/nginx_mod.pm @@ -0,0 +1,138 @@ +# A build system class for handling nginx modules. +# +# Copyright: © 2022 Miao Wang +# License: MIT + +package Debian::Debhelper::Buildsystem::nginx_mod; + +use strict; +use warnings; +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; + +sub DESCRIPTION { + "Nginx Module (config)" +} + +sub check_auto_buildable { + my ($this, $step) = @_; + + return 1 if -e $this->get_sourcepath("config"); +} + +sub _NGINX_SRC_DIR { + "/usr/share/nginx/src" +} + +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}, + }, + }, "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"); +} + +sub test { + 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); +} + +sub clean { + 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 af46c8f..44bfd7d 100644 --- a/debian/gbp.conf +++ b/debian/gbp.conf @@ -1,3 +1,13 @@ [DEFAULT] +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/help/examples/http b/debian/help/examples/http index bc3901d..bac9f90 100644 --- a/debian/help/examples/http +++ b/debian/help/examples/http @@ -38,14 +38,13 @@ http { ## gzip on; - gzip_disable "msie6"; # gzip_vary on; # gzip_proxied any; # gzip_comp_level 6; # gzip_buffers 16 8k; # gzip_http_version 1.1; - # gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript; + # gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript; ## # Virtual Host Configs diff --git a/debian/help/examples/virtual_hosts b/debian/help/examples/virtual_hosts index f1df45a..ee33a82 100644 --- a/debian/help/examples/virtual_hosts +++ b/debian/help/examples/virtual_hosts @@ -146,7 +146,7 @@ server { ssl_session_timeout 5m; ssl_protocols SSLv3 TLSv1; - ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv3:+EXP; + ssl_ciphers "HIGH:!aNULL:!MD5 or HIGH:!aNULL:!MD5:!3DES"; ssl_prefer_server_ciphers on; location / { diff --git a/debian/help/examples/wordpress b/debian/help/examples/wordpress index 6faf918..2d4c0ab 100644 --- a/debian/help/examples/wordpress +++ b/debian/help/examples/wordpress @@ -34,8 +34,8 @@ server { } # This location block protects against a known attack. It happens if - # the attacker uploads a non-php file and attempts to run it as a - # php file on the server. + # the attacker uploads a non-PHP file and attempts to run it as a + # PHP file on the server. location ~ \..*/.*\.php$ { return 403; } @@ -43,7 +43,7 @@ server { # This is our primary location block. The try_files directive will # attempt to serve the data in the order listed. First try the exact # request (such as an image or text file). If it doesn't exist, see if - # the directory exists. If not, then we move to the last options which + # the directory exists. If not, then we move to the last option which # passes the request to /index.php with the requested query. location / { try_files $uri $uri/ /index.php?q=$uri&$args; @@ -51,7 +51,7 @@ server { # If a PHP file is served, this block will handle the request. This block # works on the assumption you are using php-cgi listening on /tmp/phpcgi.socket. - # Please see the php example (usr/share/doc/nginx/exmaples/php) for more + # Please see the PHP example (/usr/share/doc/nginx-doc/php) for more # information about setting up PHP. # NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini location ~ \.php$ { @@ -61,12 +61,11 @@ server { fastcgi_intercept_errors on; fastcgi_pass unix:/tmp/phpcgi.socket; } - - # As mentioned above, Nignx is king of static. If we're serving a static - # file that ends with one of the following extensions, it is best to set - # a very high expires time. This will generate fewer requests for the - # file. These requests will be logged if found, but not if they don't - # exist. + + # If we're serving a static file that ends with one of the following + # extensions, it is best to set a very high expires time. This will + # generate fewer requests for the file. These requests will be logged if + # found, but not if they don't exist. location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ { expires max; log_not_found off; diff --git a/debian/libnginx-mod-http-geoip.nginx b/debian/libnginx-mod-http-geoip.nginx new file mode 100755 index 0000000..0ca730a --- /dev/null +++ b/debian/libnginx-mod-http-geoip.nginx @@ -0,0 +1,13 @@ +#!/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-bin/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 new file mode 100755 index 0000000..0ca730a --- /dev/null +++ b/debian/libnginx-mod-http-image-filter.nginx @@ -0,0 +1,13 @@ +#!/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-bin/objs/ngx_${modulepath}_module.so\n"; +print "mod debian/libnginx-mod.conf/mod-${module}.conf\n"; diff --git a/debian/libnginx-mod-http-perl.install b/debian/libnginx-mod-http-perl.install new file mode 100755 index 0000000..7382eca --- /dev/null +++ b/debian/libnginx-mod-http-perl.install @@ -0,0 +1,7 @@ +#!/usr/bin/perl -w + +use Config; + +my $vendorarch = substr($Config{vendorarch}, 1); +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 new file mode 100755 index 0000000..0ca730a --- /dev/null +++ b/debian/libnginx-mod-http-perl.nginx @@ -0,0 +1,13 @@ +#!/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-bin/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 new file mode 100755 index 0000000..0ca730a --- /dev/null +++ b/debian/libnginx-mod-http-xslt-filter.nginx @@ -0,0 +1,13 @@ +#!/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-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 new file mode 100755 index 0000000..0ca730a --- /dev/null +++ b/debian/libnginx-mod-mail.nginx @@ -0,0 +1,13 @@ +#!/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-bin/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 new file mode 100755 index 0000000..438ee46 --- /dev/null +++ b/debian/libnginx-mod-stream-geoip.nginx @@ -0,0 +1,13 @@ +#!/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-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.nginx b/debian/libnginx-mod-stream.nginx new file mode 100755 index 0000000..0ca730a --- /dev/null +++ b/debian/libnginx-mod-stream.nginx @@ -0,0 +1,13 @@ +#!/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-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-geoip.conf b/debian/libnginx-mod.conf/mod-http-geoip.conf new file mode 100644 index 0000000..9721986 --- /dev/null +++ b/debian/libnginx-mod.conf/mod-http-geoip.conf @@ -0,0 +1 @@ +load_module modules/ngx_http_geoip_module.so; diff --git a/debian/libnginx-mod.conf/mod-http-image-filter.conf b/debian/libnginx-mod.conf/mod-http-image-filter.conf new file mode 100644 index 0000000..dfa2939 --- /dev/null +++ b/debian/libnginx-mod.conf/mod-http-image-filter.conf @@ -0,0 +1 @@ +load_module modules/ngx_http_image_filter_module.so; diff --git a/debian/libnginx-mod.conf/mod-http-perl.conf b/debian/libnginx-mod.conf/mod-http-perl.conf new file mode 100644 index 0000000..ab3d02a --- /dev/null +++ b/debian/libnginx-mod.conf/mod-http-perl.conf @@ -0,0 +1 @@ +load_module modules/ngx_http_perl_module.so; diff --git a/debian/libnginx-mod.conf/mod-http-xslt-filter.conf b/debian/libnginx-mod.conf/mod-http-xslt-filter.conf new file mode 100644 index 0000000..a4f87ac --- /dev/null +++ b/debian/libnginx-mod.conf/mod-http-xslt-filter.conf @@ -0,0 +1 @@ +load_module modules/ngx_http_xslt_filter_module.so; diff --git a/debian/libnginx-mod.conf/mod-mail.conf b/debian/libnginx-mod.conf/mod-mail.conf new file mode 100644 index 0000000..cfd4a4d --- /dev/null +++ b/debian/libnginx-mod.conf/mod-mail.conf @@ -0,0 +1 @@ +load_module modules/ngx_mail_module.so; diff --git a/debian/libnginx-mod.conf/mod-stream-geoip.conf b/debian/libnginx-mod.conf/mod-stream-geoip.conf new file mode 100644 index 0000000..7195856 --- /dev/null +++ b/debian/libnginx-mod.conf/mod-stream-geoip.conf @@ -0,0 +1 @@ +load_module modules/ngx_stream_geoip_module.so; diff --git a/debian/libnginx-mod.conf/mod-stream.conf b/debian/libnginx-mod.conf/mod-stream.conf new file mode 100644 index 0000000..f2b2657 --- /dev/null +++ b/debian/libnginx-mod.conf/mod-stream.conf @@ -0,0 +1 @@ +load_module modules/ngx_stream_module.so; diff --git a/debian/libnginx-mod.nginx.skeleton b/debian/libnginx-mod.nginx.skeleton new file mode 100755 index 0000000..78c206f --- /dev/null +++ b/debian/libnginx-mod.nginx.skeleton @@ -0,0 +1,13 @@ +#!/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/modules/README.Modules-versions b/debian/modules/README.Modules-versions deleted file mode 100644 index e0f86a5..0000000 --- a/debian/modules/README.Modules-versions +++ /dev/null @@ -1,61 +0,0 @@ -README for Modules versions ---------------------------- - - This file lists third party modules built with nginx in Debian, homepage and - version. - - chunkin-nginx-module - https://github.com/agentzh/chunkin-nginx-module - Version: v0.23rc2-3-g85eca98 - - headers-more-nginx-module - https://github.com/agentzh/headers-more-nginx-module - Version: v0.17rc1-4-g33a82ed - - nginx-development-kit - https://github.com/simpl/ngx_devel_kit/ - Version: v0.2.17-7-g24202b4 - - nginx-auth-pam - http://web.iti.upv.es/~sto/nginx/ - Version: 1.2 - - nginx-echo - https://github.com/agentzh/echo-nginx-module - Version: v0.38rc2-7-g080c0a1 - - nginx-lua - Homepage: https://github.com/chaoslawful/lua-nginx-module - https://github.com/chaoslawful/lua-nginx-module.git - Version: v0.5.0rc29-6446ee71b8 - - nginx-upstream-fair - Homepage: https://github.com/gnosek/nginx-upstream-fair - Version: a18b409 - - nginx-push - Homepage: http://pushmodule.slact.net/#download - http://pushmodule.slact.net/downloads/nginx_http_push_module-0.692.tar.gz - Version: 0.692 - - nginx-upload - Homepage: https://github.com/vkholodkov/nginx-upload-module - Version: 2.2.0 - - nginx-upload-progress - Homepage: https://github.com/masterzen/nginx-upload-progress-module - https://nodeload.github.com/masterzen/nginx-upload-progress-module/tarball/master - rm -r debian/nginx-upload-progress/test - Version: v0.9.0-0-ga788dea - - naxsi - Homepage: http://code.google.com/p/naxsi/ - Version: 0.46-1 - - nginx-cache-purge - Homepage: http://labs.frickle.com/nginx_ngx_cache_purge/ - Version: 1.5 - - nginx-dav-ext-module - Homepage: https://github.com/arut/nginx-dav-ext-module - Version: v0.0.2-2-g54cebc1.tar.gz diff --git a/debian/modules/chunkin-nginx-module/NginxHttpChunkinModule.wiki b/debian/modules/chunkin-nginx-module/NginxHttpChunkinModule.wiki deleted file mode 100644 index a1bfd4d..0000000 --- a/debian/modules/chunkin-nginx-module/NginxHttpChunkinModule.wiki +++ /dev/null @@ -1,412 +0,0 @@ -= Name = - -'''chunkin-nginx-module''' - HTTP 1.1 chunked-encoding request body support for Nginx. - -''This module is not distributed with the Nginx source.'' See [[#Installation|the installation instructions]]. - -= Status = - -This module is considered production ready. - -= Version = - -This document describes chunkin-nginx-module [http://github.com/agentzh/chunkin-nginx-module/tarball/v0.21 v0.21] released on August 3, 2010. - -= Synopsis = - - - chunkin on; - - error_page 411 = @my_411_error; - location @my_411_error { - chunkin_resume; - } - - location /foo { - # your fastcgi_pass/proxy_pass/set/if and - # any other config directives go here... - } - ... - - - - chunkin on; - - error_page 411 = @my_411_error; - location @my_411_error { - chunkin_resume; - } - - location /bar { - chunkin_keepalive on; # WARNING: too experimental! - - # your fastcgi_pass/proxy_pass/set/if and - # any other config directives go here... - } - - -= Description = - -This module adds [http://tools.ietf.org/html/rfc2616#section-3.6.1 HTTP 1.1 chunked] input support for Nginx without the need of patching the Nginx core. - -Behind the scene, it registers an access-phase handler that will eagerly read and decode incoming request bodies when a Transfer-Encoding: chunked header triggers a 411 error page in Nginx. For requests that are not in the chunked transfer encoding, this module is a "no-op". - -To enable the magic, just turn on the [[#chunkin|chunkin]] config option and define a custom 411 error_page using [[#chunkin_resume|chunkin_resume]], like this: - - - server { - chunkin on; - - error_page 411 = @my_411_error; - location @my_411_error { - chunkin_resume; - } - - ... - } - - -No other modification is required in your nginx.conf file and everything should work out of the box including the standard [[NginxHttpProxyModule|proxy module]] (except for those [[#Known Issues|known issues]]). Note that the [[#chunkin|chunkin]] directive is not allowed in the location block while the [[#chunkin_resume|chunkin_resume]] directive is only allowed on in locations. - -The core module's [[NginxHttpCoreModule#client_body_buffer_size|client_body_buffer_size]], [[NginxHttpCoreModule#client_max_body_size|client_max_body_size]], and [[NginxHttpCoreModule#client_body_timeout|client_body_timeout]] directive settings are honored. Note that, the "body sizes" here always indicate chunked-encoded body, not the data that has already been decoded. Basically, the -chunked-encoded body will always be slightly larger than the original data that is not encoded. - -The [[NginxHttpCoreModule#client_body_in_file_only|client_body_in_file_only]] and [[NginxHttpCoreModule#client_body_in_single_buffer|client_body_in_single_buffer]] settings are followed partially. See [[#Known Issues|Know Issues]]. - -This module is not supposed to be merged into the Nginx core because I've used [http://www.complang.org/ragel/ Ragel] to generate the chunked encoding parser for joy :) - -== How it works == - -Nginx explicitly checks chunked Transfer-Encoding headers and absent content length header in its very -early phase. Well, as early as the ngx_http_process_request_header -function. So this module takes a rather tricky approach. That is, use an output filter to intercept the 411 Length Required error page response issued by ngx_http_process_request_header, -fix things and finally issue an internal redirect to the current location, -thus starting from those phases we all know and love, this time -bypassing the horrible ngx_http_process_request_header function. - -In the rewrite phase of the newly created request, this module eagerly reads in the chunked request body in a way similar to that of the standard ngx_http_read_client_request_body function, but using its own chunked parser generated by Ragel. The decoded request body will be put into r->request_body->bufs and a corresponding Content-Length header will be inserted into r->headers_in. - -Those modules using the standard ngx_http_read_client_request_body function to read the request body will just work out of box because ngx_http_read_client_request_body returns immediately when it sees r->request_body->bufs already exists. - -Special efforts have been made to reduce data copying and dynamic memory allocation. - -= Directives = - -== chunkin == -'''syntax:''' ''chunkin on|off'' - -'''default:''' ''off'' - -'''context:''' ''http, server'' - -Enables or disables this module's hooks. - -== chunkin_resume == -'''syntax:''' ''chunkin_resume'' - -'''default:''' ''none'' - -'''context:''' ''location'' - -This directive must be used in your custom 411 error page location to help this module work correctly. For example: - - - error_page 411 = @my_error; - location @my_error { - chunkin_resume; - } - - -For the technical reason behind the necessity of this directive, please read the nginx-devel thread [http://nginx.org/pipermail/nginx-devel/2009-December/000041.html Content-Length is not ignored for chunked requests: Nginx violates RFC 2616]. - -This directive was first introduced in the [[#v0.17|v0.17]] release. - -== chunkin_max_chunks_per_buf == -'''syntax:''' ''chunkin_max_chunks_per_buf '' - -'''default:''' ''512'' - -'''context:''' ''http, server, location'' - -Set the max chunk count threshold for the buffer determined by the [[NginxHttpCoreModule#client_body_buffer_size|client_body_buffer_size]] directive. -If the average chunk size is 1 KB and your [[NginxHttpCoreModule#client_body_buffer_size|client_body_buffer_size]] setting -is 1 meta bytes, then you should set this threshold to 1024 or 2048. - -When the raw body size is exceeding [[NginxHttpCoreModule#client_body_buffer_size|client_body_buffer_size]] ''or'' the chunk counter is exceeding this chunkin_max_chunks_per_buf setting, the decoded data will be temporarily buffered into disk files, and then the main buffer gets cleared and the chunk counter gets reset back to 0 (or 1 if there's a "pending chunk"). - -This directive was first introduced in the [[#v0.17|v0.17]] release. - -== chunkin_keepalive == -'''syntax:''' ''chunkin_keepalive on|off'' - -'''default:''' ''off'' - -'''context:''' ''http, server, location, if'' - -Turns on or turns off HTTP 1.1 keep-alive and HTTP 1.1 pipelining support. - -Keep-alive without pipelining should be quite stable but pipelining support is very preliminary, limited, and almost untested. - -This directive was first introduced in the [[#v0.07|v0.07 release]]. - -'''Technical note on the HTTP 1.1 pipeling support''' - -The basic idea is to copy the bytes left by my chunked parser in -r->request_body->buf over into r->header_in so that nginx's -ngx_http_set_keepalive and ngx_http_init_request functions will pick -it up for the subsequent pipelined requests. When the request body is -small enough to be completely preread into the r->header_in buffer, -then no data copy is needed here -- just setting r->header_in->pos -correctly will suffice. - -The only issue that remains is how to enlarge r->header_in when the -data left in r->request_body->buf is just too large to be hold in the -remaining room between r->header_in->pos and r->header_in->end. For -now, this module will just give up and simply turn off r->keepalive. - -I know we can always use exactly the remaining room in r->header_in as -the buffer size when reading data from c->recv, but's suboptimal when -the remaining room in r->header_in happens to be very small while -r->request_body->buf is quite large. - -I haven't fully grokked all the details among r->header_in, c->buffer, -busy/free lists and those so-called "large header buffers". Is there a -clean and safe way to reallocate or extend the r->header_in buffer? - -= Trouble Shooting = - -When combining this module with ngx_proxy and ngx_fastcgi, nginx sends a "Transfer-Encoding: " header which is invalid and not being treated well by some webservers on backend, for example, riak. So a work-around for now is to use the [http://wiki.nginx.org/NginxHttpHeadersMoreModule ngx_headers_more] module to remove the Transfer-Encoding completely, as in - - -chunkin on; - -error_page 411 = @my_411_error; - location @my_411_error { - chunkin_resume; -} - -location / { - more_clear_input_headers 'Transfer-Encoding'; - proxy_pass http://riak; -} - - -Thanks [http://github.com/hoodoos hoodoos] for sharing this trick :) - -= Installation = - -Grab the nginx source code from [http://nginx.net/ nginx.net], for example, -the version 0.8.41 (see [[#Compatibility|nginx compatibility]]), and then build the source with this module: - - - $ wget 'http://sysoev.ru/nginx/nginx-0.8.41.tar.gz' - $ tar -xzvf nginx-0.8.41.tar.gz - $ cd nginx-0.8.41/ - - # Here we assume you would install you nginx under /opt/nginx/. - $ ./configure --prefix=/opt/nginx \ - --add-module=/path/to/chunkin-nginx-module - - $ make -j2 - $ make install - - -Download the latest version of the release tarball of this module from [http://github.com/agentzh/chunkin-nginx-module/downloads chunkin-nginx-module file list]. - -== For Developers == - -The chunked parser is generated by [http://www.complang.org/ragel/ Ragel]. If you want to -regenerate the parser's C file, i.e., [http://github.com/agentzh/chunkin-nginx-module/blob/master/src/chunked_parser.c src/chunked_parser.c], use -the following command from the root of the chunkin module's source tree: - - - $ ragel -G2 src/chunked_parser.rl - - -= Packages from users = - -== Fedora 13 RPM files == - -The following source and binary rpm files are contributed by Ernest Folch, with nginx 0.8.54, ngx_chunkin v0.21 and ngx_headers_more v0.13: - -* [http://agentzh.org/misc/nginx/ernest/nginx-0.8.54-1.fc13.src.rpm nginx-0.8.54-1.fc13.src.rpm] -* [http://agentzh.org/misc/nginx/ernest/nginx-0.8.54-1.fc13.x86_64.rpm nginx-0.8.54-1.fc13.x86_64.rpm] - -= Compatibility = - -The following versions of Nginx should work with this module: - -* '''1.0.x''' (last tested: 1.0.2) -* '''0.8.x''' (last tested: 0.8.54) -* '''0.7.x >= 0.7.21''' (last tested: 0.7.67) - -Earlier versions of Nginx like 0.6.x and 0.5.x will ''not'' work. - -If you find that any particular version of Nginx above 0.7.21 does not work with this module, please consider [[#Report Bugs|reporting a bug]]. - -= Report Bugs = - -Although a lot of effort has been put into testing and code tuning, there must be some serious bugs lurking somewhere in this module. So whenever you are bitten by any quirks, please don't hesitate to - -# send a bug report or even patches to , -# or create a ticket on the [http://github.com/agentzh/chunkin-nginx-module/issues issue tracking interface] provided by GitHub. - -= Source Repository = - -Available on github at [http://github.com/agentzh/chunkin-nginx-module agentzh/chunkin-nginx-module]. - -= ChangeLog = - -== v0.21 == -* applied a patch from Gong Kaihui (龚开晖) to always call post_handler in ngx_http_chunkin_read_chunked_request_body. - -== v0.20 == -* fixed a bug that may read incomplete chunked body. thanks Gong Kaihui (龚开晖). -* fixed various memory issues in the implementation which may cause nginx processes to crash. -* added support for chunked PUT requests. -* now we always require "error_page 411 @resume" and no default (buggy) magic any more. thanks Gong Kaihui (龚开晖). - -== v0.19 == -* we now use ragel -G2 to generate the chunked parser and we're 36% faster. -* we now eagerly read the data octets in the chunked parser and we're 43% faster. - -== v0.18 == -* added support for chunk-extension to the chunked parser as per [http://tools.ietf.org/html/rfc2616#section-3.6.1 RFC 2616], but we just ignore them (if any) because we don't understand them. -* added more diagnostic information for certian error messages. - -== v0.17 == -* implemented the [[#chunkin_max_chunks_per_buf|chunkin_max_chunks_per_buf]] directive to allow overriding the default 512 setting. -* we now bypass nginx's [http://nginx.org/pipermail/nginx-devel/2009-December/000041.html discard requesty body bug] by requiring our users to define explicit 411 error_page with [[#chunkin_resume|chunkin_resume]] in the error page location. Thanks J for reporting related bugs. -* fixed r->phase_handler in our post read handler. our handler may run one more time before :P -* the chunkin handler now returns NGX_DECLINED rather than NGX_OK when our ngx_http_chunkin_read_chunked_request_body function returns NGX_OK, to avoid bypassing other access-phase handlers. - -== v0.16 == -* turned off ddebug in the previous release. thanks J for reporting it. - -== v0.15 == -* fixed a regression that ctx->chunks_count never incremented in earlier versions. - -== v0.14 == -* now we no longer skip those operations between the (interrupted) ngx_http_process_request_header and the server rewrite phase. this fixed the security issues regarding the [[NginxHttpCoreModule#internal|internal]] directive as well as SSL sessions. -* try to ignore CR/LF/SP/HT at the begining of the chunked body. -* now we allow HT as padding spaces and ignore leading CRLFs. -* improved diagnostic info in the error.log messages when parsefail occurs. - -== v0.11 == -* added a random valid-chunked-request generator in t/random.t. -* fixed a new connection leak issue caught by t/random.t. - -== v0.10 == -* fixed a serious bug in the chunked parser grammer: there would be ambiguity when CRLF appears in the chunked data sections. Thanks J for reporting it. - -== v0.08 == -* fixed gcc compilation errors on x86_64, thanks J for reporting it. -* used the latest Ragel 6.6 to generate the chunked_parser.c file in the source tree. - -== v0.07 == - -* marked the disgarded 411 error page's output chain bufs as consumed by setting buf->pos = buf->last. (See [http://nginx.org/pipermail/nginx-devel/2009-December/000025.html this nginx-devel thread] for more details.) -* added the [[#chunkin_keepalive|chunkin_keepalive]] directive which can enable HTTP 1.1 keep-alive and HTTP 1.1 pipelining, and defaults to off. -* fixed the alphtype bug in the Ragel parser spec; which caused rejection of non-ascii octets in the chunked data. Thanks J for his bug report. -* added Test::Nginx::Socket to test our nginx module on the socket level. Thanks J for his bug report. -* rewrote the bufs recycling part and preread-buf-to-rb-buf transition part, also refactored the Ragel parser spec, thus eliminating lots of serious bugs. -* provided better diagnostics in the error log message for "bad chunked body" parsefails in the chunked parser. For example: - - - 2009/12/02 17:35:52 [error] 32244#0: *1 bad chunked body (offset 7, near "4^M - hell <-- HERE o^M - 0^M - ^M - ", marked by " <-- HERE "). - , client: 127.0.0.1, server: localhost, request: "POST /main -HTTP/1.1", host: "localhost" - - -* added some code to let the chunked parser handle special 0-size chunks that are not the last chunk. -* fixed a connection leak bug regarding incorrect r->main->count reference counter handling for nginx 0.8.11+ (well, the ngx_http_read_client_request_body function in the nginx core also has this issue, I'll report it later.) - -== v0.06 == -* minor optimization: we won't traverse the output chain link if the chain count is not large enough. - -= Test Suite = - -This module comes with a Perl-driven test suite. The [http://github.com/agentzh/chunkin-nginx-module/tree/master/test/t/ test cases] are -[http://github.com/agentzh/chunkin-nginx-module/blob/master/test/t/sanity.t declarative] too. Thanks to the [http://search.cpan.org/perldoc?Test::Base Test::Base] module in the Perl world. - -To run it on your side: - - - $ cd test - $ PATH=/path/to/your/nginx-with-chunkin-module:$PATH prove -r t - - -You need to terminate any Nginx processes before running the test suite if you have changed the Nginx server binary. - -At the moment, [http://search.cpan.org/perldoc?LWP::UserAgent LWP::UserAgent] is used by the [http://github.com/agentzh/chunkin-nginx-module/blob/master/test/lib/Test/Nginx/LWP.pm test scaffold] for simplicity. - -Because a single nginx server (by default, localhost:1984) is used across all the test scripts (.t files), it's meaningless to run the test suite in parallel by specifying -jN when invoking the prove utility. - -Some parts of the test suite requires modules [[NginxHttpProxyModule|proxy]] and [[NginxHttpEchoModule|echo]] to be enabled as well when building Nginx. - -= Known Issues = - -* May not work with certain 3rd party modules like the [http://www.grid.net.ru/nginx/upload.en.html upload module] because it implements its own request body reading mechanism. -* "client_body_in_single_buffer on" may *not* be obeyed for short contents and fast network. -* "client_body_in_file_only on" may *not* be obeyed for short contents and fast network. -* HTTP 1.1 pipelining may not fully work yet. - -= TODO = - -* make the chunkin handler run at the end of the access phase rather than beginning. -* add support for trailers as specified in the [http://tools.ietf.org/html/rfc2616#section-3.6.1 RFC 2616]. -* fix the [[#Known Issues|known issues]]. - -= Getting involved = - -You'll be very welcomed to submit patches to the [[#Author|author]] or just ask for a commit bit to the [[#Source Repository|source repository]] on GitHub. - -= Author = - -agentzh (章亦春) '''' - -This wiki page is also maintained by the author himself, and everybody is encouraged to improve this page as well. - -= Copyright & License = - -The basic client request body reading code is based on the ngx_http_read_client_request_body function and its utility functions in the Nginx 0.8.20 core. This part of code is copyrighted by Igor Sysoev. - -Copyright (c) 2009, Taobao Inc., Alibaba Group ( http://www.taobao.com ). - -Copyright (c) 2009, agentzh . - -This module is licensed under the terms of the BSD license. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions -are met: - -* Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. -* 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. -* Neither the name of the Taobao Inc. 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 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 -HOLDER 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 = - -* The original thread on the Nginx mailing list that inspires this module's development: [http://forum.nginx.org/read.php?2,4453,20543 "'Content-Length' header for POSTs"]. -* The orginal announcement thread on the Nginx mailing list: [http://forum.nginx.org/read.php?2,22967 "The chunkin module: Experimental chunked input support for Nginx"]. -* The original [http://agentzh.spaces.live.com/blog/cns!FF3A735632E41548!481.entry blog post] about this module's initial development. -* The thread discussing chunked input support on the nginx-devel mailing list: [http://nginx.org/pipermail/nginx-devel/2009-December/000021.html "Chunked request body and HTTP header parser"]. -* The [[NginxHttpEchoModule|echo module]] for Nginx module's automated testing. -* [http://tools.ietf.org/html/rfc2616#section-3.6.1 RFC 2616 - Chunked Transfer Coding]. - diff --git a/debian/modules/chunkin-nginx-module/README b/debian/modules/chunkin-nginx-module/README deleted file mode 100644 index 58c7795..0000000 --- a/debian/modules/chunkin-nginx-module/README +++ /dev/null @@ -1,542 +0,0 @@ -Name - ngx_chunkin - HTTP 1.1 chunked-encoding request body support for Nginx. - - *This module is not distributed with the Nginx source.* See the - installation instructions. - -Status - This module is considered production ready. - -Version - This document describes ngx_chunkin v0.23rc2 - () released on - November 24, 2011. - -Synopsis - chunkin on; - - error_page 411 = @my_411_error; - location @my_411_error { - chunkin_resume; - } - - location /foo { - # your fastcgi_pass/proxy_pass/set/if and - # any other config directives go here... - } - ... - - chunkin on; - - error_page 411 = @my_411_error; - location @my_411_error { - chunkin_resume; - } - - location /bar { - chunkin_keepalive on; # WARNING: too experimental! - - # your fastcgi_pass/proxy_pass/set/if and - # any other config directives go here... - } - -Description - This module adds HTTP 1.1 chunked - () input support for - Nginx without the need of patching the Nginx core. - - Behind the scene, it registers an access-phase handler that will eagerly - read and decode incoming request bodies when a "Transfer-Encoding: - chunked" header triggers a 411 error page in Nginx. For requests that - are not in the "chunked" transfer encoding, this module is a "no-op". - - To enable the magic, just turn on the chunkin config option and define a - custom "411 error_page" using chunkin_resume, like this: - - server { - chunkin on; - - error_page 411 = @my_411_error; - location @my_411_error { - chunkin_resume; - } - - ... - } - - No other modification is required in your nginx.conf file and everything - should work out of the box including the standard [module - (HttpProxyModule)] (except for those known issues). Note that the - chunkin directive is not allowed in the location block while the - chunkin_resume directive is only allowed on in "locations". - - The core module's client_body_buffer_size, client_max_body_size, and - client_body_timeout directive settings are honored. Note that, the "body - sizes" here always indicate chunked-encoded body, not the data that has - already been decoded. Basically, the chunked-encoded body will always be - slightly larger than the original data that is not encoded. - - The client_body_in_file_only and client_body_in_single_buffer settings - are followed partially. See Know Issues. - - This module is not supposed to be merged into the Nginx core because - I've used Ragel () to generate the - chunked encoding parser for joy :) - - How it works - Nginx explicitly checks chunked "Transfer-Encoding" headers and absent - content length header in its very early phase. Well, as early as the - "ngx_http_process_request_header" function. So this module takes a - rather tricky approach. That is, use an output filter to intercept the - "411 Length Required" error page response issued by - "ngx_http_process_request_header", fix things and finally issue an - internal redirect to the current location, thus starting from those - phases we all know and love, this time bypassing the horrible - "ngx_http_process_request_header" function. - - In the "rewrite" phase of the newly created request, this module eagerly - reads in the chunked request body in a way similar to that of the - standard "ngx_http_read_client_request_body" function, but using its own - chunked parser generated by Ragel. The decoded request body will be put - into "r->request_body->bufs" and a corresponding "Content-Length" header - will be inserted into "r->headers_in". - - Those modules using the standard "ngx_http_read_client_request_body" - function to read the request body will just work out of box because - "ngx_http_read_client_request_body" returns immediately when it sees - "r->request_body->bufs" already exists. - - Special efforts have been made to reduce data copying and dynamic memory - allocation. - -Directives - chunkin - syntax: *chunkin on|off* - - default: *off* - - context: *http, server* - - phase: *access* - - Enables or disables this module's hooks. - - chunkin_resume - syntax: *chunkin_resume* - - default: *no* - - context: *location* - - phase: *content* - - This directive must be used in your custom "411 error page" location to - help this module work correctly. For example: - - error_page 411 = @my_error; - location @my_error { - chunkin_resume; - } - - For the technical reason behind the necessity of this directive, please - read the "nginx-devel" thread Content-Length is not ignored for chunked - requests: Nginx violates RFC 2616 - (). - - This directive was first introduced in the v0.17 release. - - chunkin_max_chunks_per_buf - syntax: *chunkin_max_chunks_per_buf * - - default: *512* - - context: *http, server, location* - - Set the max chunk count threshold for the buffer determined by the - client_body_buffer_size directive. If the average chunk size is "1 KB" - and your client_body_buffer_size setting is 1 meta bytes, then you - should set this threshold to 1024 or 2048. - - When the raw body size is exceeding client_body_buffer_size *or* the - chunk counter is exceeding this "chunkin_max_chunks_per_buf" setting, - the decoded data will be temporarily buffered into disk files, and then - the main buffer gets cleared and the chunk counter gets reset back to 0 - (or 1 if there's a "pending chunk"). - - This directive was first introduced in the v0.17 release. - - chunkin_keepalive - syntax: *chunkin_keepalive on|off* - - default: *off* - - context: *http, server, location, if* - - Turns on or turns off HTTP 1.1 keep-alive and HTTP 1.1 pipelining - support. - - Keep-alive without pipelining should be quite stable but pipelining - support is very preliminary, limited, and almost untested. - - This directive was first introduced in the v0.07 release. - - Technical note on the HTTP 1.1 pipeling support - - The basic idea is to copy the bytes left by my chunked parser in - "r->request_body->buf" over into "r->header_in" so that nginx's - "ngx_http_set_keepalive" and "ngx_http_init_request" functions will pick - it up for the subsequent pipelined requests. When the request body is - small enough to be completely preread into the "r->header_in" buffer, - then no data copy is needed here -- just setting "r->header_in->pos" - correctly will suffice. - - The only issue that remains is how to enlarge "r->header_in" when the - data left in "r->request_body->buf" is just too large to be hold in the - remaining room between "r->header_in->pos" and "r->header_in->end". For - now, this module will just give up and simply turn off "r->keepalive". - - I know we can always use exactly the remaining room in "r->header_in" as - the buffer size when reading data from "c->recv", but's suboptimal when - the remaining room in "r->header_in" happens to be very small while - "r->request_body->buf" is quite large. - - I haven't fully grokked all the details among "r->header_in", - "c->buffer", busy/free lists and those so-called "large header buffers". - Is there a clean and safe way to reallocate or extend the "r->header_in" - buffer? - -Installation - Grab the nginx source code from nginx.org (), for - example, the version 1.0.8 (see nginx compatibility), and then build the - source with this module: - - wget 'http://nginx.org/download/nginx-1.0.8.tar.gz' - tar -xzvf nginx-1.0.8.tar.gz - cd nginx-1.0.8/ - - # Here we assume you would install you nginx under /opt/nginx/. - ./configure --prefix=/opt/nginx \ - --add-module=/path/to/chunkin-nginx-module - - make -j2 - make install - - Download the latest version of the release tarball of this module from - chunkin-nginx-module file list - (). - - For Developers - The chunked parser is generated by Ragel - (). If you want to regenerate the - parser's C file, i.e., src/chunked_parser.c - (), use the following command from the root of the chunkin - module's source tree: - - $ ragel -G2 src/chunked_parser.rl - -Packages from users - Fedora 13 RPM files - The following source and binary rpm files are contributed by Ernest - Folch, with nginx 0.8.54, ngx_chunkin v0.21 and ngx_headers_more v0.13: - - * nginx-0.8.54-1.fc13.src.rpm - () - - * nginx-0.8.54-1.fc13.x86_64.rpm - () - -Compatibility - The following versions of Nginx should work with this module: - - * 1.1.x (last tested: 1.1.5) - - * 1.0.x (last tested: 1.0.10) - - * 0.8.x (last tested: 0.8.54) - - * 0.7.x >= 0.7.21 (last tested: 0.7.67) - - Earlier versions of Nginx like 0.6.x and 0.5.x will *not* work. - - If you find that any particular version of Nginx above 0.7.21 does not - work with this module, please consider reporting a bug. - -Report Bugs - Although a lot of effort has been put into testing and code tuning, - there must be some serious bugs lurking somewhere in this module. So - whenever you are bitten by any quirks, please don't hesitate to - - 1. send a bug report or even patches to , - - 2. or create a ticket on the issue tracking interface - () provided - by GitHub. - -Source Repository - Available on github at agentzh/chunkin-nginx-module - (). - -ChangeLog - v0.22 - * now we remove the request header Transfer-Encoding completely - because at least Apache will complain about the empty-value - "Transfer-Encoding" request header. thanks hoodoos and Sandesh - Kotwal. - - * now we allow DELETE requests with chunked request bodies per - hoodoos's request. - - * now we use the 2-clause BSD license. - - v0.21 - * applied a patch from Gong Kaihui (龚开晖) to always call "post_handler" - in "ngx_http_chunkin_read_chunked_request_body". - - v0.20 - * fixed a bug that may read incomplete chunked body. thanks Gong - Kaihui (龚开晖). - - * fixed various memory issues in the implementation which may cause - nginx processes to crash. - - * added support for chunked PUT requests. - - * now we always require "error_page 411 @resume" and no default - (buggy) magic any more. thanks Gong Kaihui (龚开晖). - - v0.19 - * we now use ragel -G2 to generate the chunked parser and we're 36% - faster. - - * we now eagerly read the data octets in the chunked parser and we're - 43% faster. - - v0.18 - * added support for "chunk-extension" to the chunked parser as per RFC - 2616 (), but we - just ignore them (if any) because we don't understand them. - - * added more diagnostic information for certian error messages. - - v0.17 - * implemented the chunkin_max_chunks_per_buf directive to allow - overriding the default 512 setting. - - * we now bypass nginx's discard requesty body bug - () - by requiring our users to define explicit "411 error_page" with - chunkin_resume in the error page location. Thanks J for reporting - related bugs. - - * fixed "r->phase_handler" in our post read handler. our handler may - run one more time before :P - - * the chunkin handler now returns "NGX_DECLINED" rather than "NGX_OK" - when our "ngx_http_chunkin_read_chunked_request_body" function - returns "NGX_OK", to avoid bypassing other access-phase handlers. - - v0.16 - * turned off ddebug in the previous release. thanks J for reporting - it. - - v0.15 - * fixed a regression that ctx->chunks_count never incremented in - earlier versions. - - v0.14 - * now we no longer skip those operations between the (interrupted) - ngx_http_process_request_header and the server rewrite phase. this - fixed the security issues regarding the internal directive as well - as SSL sessions. - - * try to ignore CR/LF/SP/HT at the begining of the chunked body. - - * now we allow HT as padding spaces and ignore leading CRLFs. - - * improved diagnostic info in the error.log messages when parsefail - occurs. - - v0.11 - * added a random valid-chunked-request generator in t/random.t. - - * fixed a new connection leak issue caught by t/random.t. - - v0.10 - * fixed a serious bug in the chunked parser grammer: there would be - ambiguity when CRLF appears in the chunked data sections. Thanks J - for reporting it. - - v0.08 - * fixed gcc compilation errors on x86_64, thanks J for reporting it. - - * used the latest Ragel 6.6 to generate the "chunked_parser.c" file in - the source tree. - - v0.07 - * marked the disgarded 411 error page's output chain bufs as consumed - by setting "buf->pos = buf->last". (See this nginx-devel thread - () - for more details.) - - * added the chunkin_keepalive directive which can enable HTTP 1.1 - keep-alive and HTTP 1.1 pipelining, and defaults to "off". - - * fixed the "alphtype" bug in the Ragel parser spec; which caused - rejection of non-ascii octets in the chunked data. Thanks J for his - bug report. - - * added "Test::Nginx::Socket" to test our nginx module on the socket - level. Thanks J for his bug report. - - * rewrote the bufs recycling part and preread-buf-to-rb-buf transition - part, also refactored the Ragel parser spec, thus eliminating lots - of serious bugs. - - * provided better diagnostics in the error log message for "bad - chunked body" parsefails in the chunked parser. For example: - - 2009/12/02 17:35:52 [error] 32244#0: *1 bad chunked body (offset 7, near "4^M - hell <-- HERE o^M - 0^M - ^M - ", marked by " <-- HERE "). - , client: 127.0.0.1, server: localhost, request: "POST /main - HTTP/1.1", host: "localhost" - - * added some code to let the chunked parser handle special 0-size - chunks that are not the last chunk. - - * fixed a connection leak bug regarding incorrect "r->main->count" - reference counter handling for nginx 0.8.11+ (well, the - "ngx_http_read_client_request_body" function in the nginx core also - has this issue, I'll report it later.) - - v0.06 - * minor optimization: we won't traverse the output chain link if the - chain count is not large enough. - -Test Suite - This module comes with a Perl-driven test suite. The test cases - () - are declarative - () too. Thanks to the Test::Base - () module in the Perl world. - - To run it on your side: - - $ cd test - $ PATH=/path/to/your/nginx-with-chunkin-module:$PATH prove -r t - - You need to terminate any Nginx processes before running the test suite - if you have changed the Nginx server binary. - - At the moment, LWP::UserAgent - () is used by the test - scaffold - () for simplicity. - - Because a single nginx server (by default, "localhost:1984") is used - across all the test scripts (".t" files), it's meaningless to run the - test suite in parallel by specifying "-jN" when invoking the "prove" - utility. - - Some parts of the test suite requires modules proxy and echo to be - enabled as well when building Nginx. - -Known Issues - * May not work with certain 3rd party modules like the upload module - () because it - implements its own request body reading mechanism. - - * "client_body_in_single_buffer on" may *not* be obeyed for short - contents and fast network. - - * "client_body_in_file_only on" may *not* be obeyed for short contents - and fast network. - - * HTTP 1.1 pipelining may not fully work yet. - -TODO - * make the chunkin handler run at the end of the "access phase" rather - than beginning. - - * add support for "trailers" as specified in the RFC 2616 - (). - - * fix the known issues. - -Getting involved - You'll be very welcomed to submit patches to the author or just ask for - a commit bit to the source repository on GitHub. - -Author - Zhang "agentzh" Yichun (章亦春) ** - - This wiki page is also maintained by the author himself, and everybody - is encouraged to improve this page as well. - -Copyright & License - The basic client request body reading code is based on the - "ngx_http_read_client_request_body" function and its utility functions - in the Nginx 0.8.20 core. This part of code is copyrighted by Igor - Sysoev. - - Copyright (c) 2009, 2010, 2011, Zhang "agentzh" Yichun (章亦春) - . - - This module is licensed under the terms of the BSD license. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are - met: - - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - - * 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. - - * Neither the name of the Taobao Inc. 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 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 - HOLDER 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 - * The original thread on the Nginx mailing list that inspires this - module's development: "'Content-Length' header for POSTs" - (). - - * The orginal announcement thread on the Nginx mailing list: "The - chunkin module: Experimental chunked input support for Nginx" - (). - - * The original blog post - () about this module's initial development. - - * The thread discussing chunked input support on the nginx-devel - mailing list: "Chunked request body and HTTP header parser" - () - . - - * The [module (HttpEchoModule)] for Nginx module's automated testing. - - * RFC 2616 - Chunked Transfer Coding - (). - diff --git a/debian/modules/chunkin-nginx-module/README.markdown b/debian/modules/chunkin-nginx-module/README.markdown deleted file mode 100644 index 3dd7b81..0000000 --- a/debian/modules/chunkin-nginx-module/README.markdown +++ /dev/null @@ -1,440 +0,0 @@ -Name -==== - -**ngx_chunkin** - HTTP 1.1 chunked-encoding request body support for Nginx. - -*This module is not distributed with the Nginx source.* See [the installation instructions](http://wiki.nginx.org/HttpChunkinModule#Installation). - -Status -====== - -This module is considered production ready. - -Version -======= - -This document describes ngx_chunkin [v0.23rc2](http://github.com/agentzh/chunkin-nginx-module/tags) released on November 24, 2011. - -Synopsis -======== - - - chunkin on; - - error_page 411 = @my_411_error; - location @my_411_error { - chunkin_resume; - } - - location /foo { - # your fastcgi_pass/proxy_pass/set/if and - # any other config directives go here... - } - ... - - - - chunkin on; - - error_page 411 = @my_411_error; - location @my_411_error { - chunkin_resume; - } - - location /bar { - chunkin_keepalive on; # WARNING: too experimental! - - # your fastcgi_pass/proxy_pass/set/if and - # any other config directives go here... - } - - -Description -=========== - -This module adds [HTTP 1.1 chunked](http://tools.ietf.org/html/rfc2616#section-3.6.1) input support for Nginx without the need of patching the Nginx core. - -Behind the scene, it registers an access-phase handler that will eagerly read and decode incoming request bodies when a `Transfer-Encoding: chunked` header triggers a `411` error page in Nginx. For requests that are not in the `chunked` transfer encoding, this module is a "no-op". - -To enable the magic, just turn on the [chunkin](http://wiki.nginx.org/HttpChunkinModule#chunkin) config option and define a custom `411 error_page` using [chunkin_resume](http://wiki.nginx.org/HttpChunkinModule#chunkin_resume), like this: - - - server { - chunkin on; - - error_page 411 = @my_411_error; - location @my_411_error { - chunkin_resume; - } - - ... - } - - -No other modification is required in your nginx.conf file and everything should work out of the box including the standard [proxy module](http://wiki.nginx.org/HttpProxyModule) (except for those [known issues](http://wiki.nginx.org/HttpChunkinModule#Known_Issues)). Note that the [chunkin](http://wiki.nginx.org/HttpChunkinModule#chunkin) directive is not allowed in the location block while the [chunkin_resume](http://wiki.nginx.org/HttpChunkinModule#chunkin_resume) directive is only allowed on in `locations`. - -The core module's [client_body_buffer_size](http://wiki.nginx.org/HttpCoreModule#client_body_buffer_size), [client_max_body_size](http://wiki.nginx.org/HttpCoreModule#client_max_body_size), and [client_body_timeout](http://wiki.nginx.org/HttpCoreModule#client_body_timeout) directive settings are honored. Note that, the "body sizes" here always indicate chunked-encoded body, not the data that has already been decoded. Basically, the -chunked-encoded body will always be slightly larger than the original data that is not encoded. - -The [client_body_in_file_only](http://wiki.nginx.org/HttpCoreModule#client_body_in_file_only) and [client_body_in_single_buffer](http://wiki.nginx.org/HttpCoreModule#client_body_in_single_buffer) settings are followed partially. See [Know Issues](http://wiki.nginx.org/HttpChunkinModule#Known_Issues). - -This module is not supposed to be merged into the Nginx core because I've used [Ragel](http://www.complang.org/ragel/) to generate the chunked encoding parser for joy :) - -How it works ------------- - -Nginx explicitly checks chunked `Transfer-Encoding` headers and absent content length header in its very -early phase. Well, as early as the `ngx_http_process_request_header` -function. So this module takes a rather tricky approach. That is, use an output filter to intercept the `411 Length Required` error page response issued by `ngx_http_process_request_header`, -fix things and finally issue an internal redirect to the current location, -thus starting from those phases we all know and love, this time -bypassing the horrible `ngx_http_process_request_header` function. - -In the `rewrite` phase of the newly created request, this module eagerly reads in the chunked request body in a way similar to that of the standard `ngx_http_read_client_request_body` function, but using its own chunked parser generated by Ragel. The decoded request body will be put into `r->request_body->bufs` and a corresponding `Content-Length` header will be inserted into `r->headers_in`. - -Those modules using the standard `ngx_http_read_client_request_body` function to read the request body will just work out of box because `ngx_http_read_client_request_body` returns immediately when it sees `r->request_body->bufs` already exists. - -Special efforts have been made to reduce data copying and dynamic memory allocation. - -Directives -========== - -chunkin -------- -**syntax:** *chunkin on|off* - -**default:** *off* - -**context:** *http, server* - -**phase:** *access* - -Enables or disables this module's hooks. - -chunkin_resume --------------- -**syntax:** *chunkin_resume* - -**default:** *no* - -**context:** *location* - -**phase:** *content* - -This directive must be used in your custom `411 error page` location to help this module work correctly. For example: - - - error_page 411 = @my_error; - location @my_error { - chunkin_resume; - } - - -For the technical reason behind the necessity of this directive, please read the `nginx-devel` thread [Content-Length is not ignored for chunked requests: Nginx violates RFC 2616](http://nginx.org/pipermail/nginx-devel/2009-December/000041.html). - -This directive was first introduced in the [v0.17](http://wiki.nginx.org/HttpChunkinModule#v0.17) release. - -chunkin_max_chunks_per_buf --------------------------- -**syntax:** *chunkin_max_chunks_per_buf <number>* - -**default:** *512* - -**context:** *http, server, location* - -Set the max chunk count threshold for the buffer determined by the [client_body_buffer_size](http://wiki.nginx.org/HttpCoreModule#client_body_buffer_size) directive. -If the average chunk size is `1 KB` and your [client_body_buffer_size](http://wiki.nginx.org/HttpCoreModule#client_body_buffer_size) setting -is 1 meta bytes, then you should set this threshold to `1024` or `2048`. - -When the raw body size is exceeding [client_body_buffer_size](http://wiki.nginx.org/HttpCoreModule#client_body_buffer_size) *or* the chunk counter is exceeding this `chunkin_max_chunks_per_buf` setting, the decoded data will be temporarily buffered into disk files, and then the main buffer gets cleared and the chunk counter gets reset back to 0 (or `1` if there's a "pending chunk"). - -This directive was first introduced in the [v0.17](http://wiki.nginx.org/HttpChunkinModule#v0.17) release. - -chunkin_keepalive ------------------ -**syntax:** *chunkin_keepalive on|off* - -**default:** *off* - -**context:** *http, server, location, if* - -Turns on or turns off HTTP 1.1 keep-alive and HTTP 1.1 pipelining support. - -Keep-alive without pipelining should be quite stable but pipelining support is very preliminary, limited, and almost untested. - -This directive was first introduced in the [v0.07 release](http://wiki.nginx.org/HttpChunkinModule#v0.07). - -**Technical note on the HTTP 1.1 pipeling support** - -The basic idea is to copy the bytes left by my chunked parser in -`r->request_body->buf` over into `r->header_in` so that nginx's -`ngx_http_set_keepalive` and `ngx_http_init_request` functions will pick -it up for the subsequent pipelined requests. When the request body is -small enough to be completely preread into the `r->header_in` buffer, -then no data copy is needed here -- just setting `r->header_in->pos` -correctly will suffice. - -The only issue that remains is how to enlarge `r->header_in` when the -data left in `r->request_body->buf` is just too large to be hold in the -remaining room between `r->header_in->pos` and `r->header_in->end`. For -now, this module will just give up and simply turn off `r->keepalive`. - -I know we can always use exactly the remaining room in `r->header_in` as -the buffer size when reading data from `c->recv`, but's suboptimal when -the remaining room in `r->header_in` happens to be very small while -`r->request_body->buf` is quite large. - -I haven't fully grokked all the details among `r->header_in`, `c->buffer`, -busy/free lists and those so-called "large header buffers". Is there a -clean and safe way to reallocate or extend the `r->header_in` buffer? - -Installation -============ - -Grab the nginx source code from [nginx.org](http://nginx.org/), for example, -the version 1.0.8 (see [nginx compatibility](http://wiki.nginx.org/HttpChunkinModule#Compatibility)), and then build the source with this module: - - - wget 'http://nginx.org/download/nginx-1.0.8.tar.gz' - tar -xzvf nginx-1.0.8.tar.gz - cd nginx-1.0.8/ - - # Here we assume you would install you nginx under /opt/nginx/. - ./configure --prefix=/opt/nginx \ - --add-module=/path/to/chunkin-nginx-module - - make -j2 - make install - - -Download the latest version of the release tarball of this module from [chunkin-nginx-module file list](http://github.com/agentzh/chunkin-nginx-module/tags). - -For Developers --------------- - -The chunked parser is generated by [Ragel](http://www.complang.org/ragel/). If you want to -regenerate the parser's C file, i.e., [src/chunked_parser.c](http://github.com/agentzh/chunkin-nginx-module/blob/master/src/chunked_parser.c), use -the following command from the root of the chunkin module's source tree: - - - $ ragel -G2 src/chunked_parser.rl - - -Packages from users -=================== - -Fedora 13 RPM files -------------------- - -The following source and binary rpm files are contributed by Ernest Folch, with nginx 0.8.54, ngx_chunkin v0.21 and ngx_headers_more v0.13: - -* [nginx-0.8.54-1.fc13.src.rpm](http://agentzh.org/misc/nginx/ernest/nginx-0.8.54-1.fc13.src.rpm) -* [nginx-0.8.54-1.fc13.x86_64.rpm](http://agentzh.org/misc/nginx/ernest/nginx-0.8.54-1.fc13.x86_64.rpm) - -Compatibility -============= - -The following versions of Nginx should work with this module: - -* **1.1.x** (last tested: 1.1.5) -* **1.0.x** (last tested: 1.0.10) -* **0.8.x** (last tested: 0.8.54) -* **0.7.x >= 0.7.21** (last tested: 0.7.67) - -Earlier versions of Nginx like 0.6.x and 0.5.x will *not* work. - -If you find that any particular version of Nginx above 0.7.21 does not work with this module, please consider [reporting a bug](http://wiki.nginx.org/HttpChunkinModule#Report_Bugs). - -Report Bugs -=========== - -Although a lot of effort has been put into testing and code tuning, there must be some serious bugs lurking somewhere in this module. So whenever you are bitten by any quirks, please don't hesitate to - -1. send a bug report or even patches to , -1. or create a ticket on the [issue tracking interface](http://github.com/agentzh/chunkin-nginx-module/issues) provided by GitHub. - -Source Repository -================= - -Available on github at [agentzh/chunkin-nginx-module](http://github.com/agentzh/chunkin-nginx-module). - -ChangeLog -========= - -v0.22 ------ -* now we remove the request header Transfer-Encoding completely because at least Apache will complain about the empty-value `Transfer-Encoding` request header. thanks hoodoos and Sandesh Kotwal. -* now we allow DELETE requests with chunked request bodies per hoodoos's request. -* now we use the 2-clause BSD license. - -v0.21 ------ -* applied a patch from Gong Kaihui (龚开晖) to always call `post_handler` in `ngx_http_chunkin_read_chunked_request_body`. - -v0.20 ------ -* fixed a bug that may read incomplete chunked body. thanks Gong Kaihui (龚开晖). -* fixed various memory issues in the implementation which may cause nginx processes to crash. -* added support for chunked PUT requests. -* now we always require "error_page 411 @resume" and no default (buggy) magic any more. thanks Gong Kaihui (龚开晖). - -v0.19 ------ -* we now use ragel -G2 to generate the chunked parser and we're 36% faster. -* we now eagerly read the data octets in the chunked parser and we're 43% faster. - -v0.18 ------ -* added support for `chunk-extension` to the chunked parser as per [RFC 2616](http://tools.ietf.org/html/rfc2616#section-3.6.1), but we just ignore them (if any) because we don't understand them. -* added more diagnostic information for certian error messages. - -v0.17 ------ -* implemented the [chunkin_max_chunks_per_buf](http://wiki.nginx.org/HttpChunkinModule#chunkin_max_chunks_per_buf) directive to allow overriding the default `512` setting. -* we now bypass nginx's [discard requesty body bug](http://nginx.org/pipermail/nginx-devel/2009-December/000041.html) by requiring our users to define explicit `411 error_page` with [chunkin_resume](http://wiki.nginx.org/HttpChunkinModule#chunkin_resume) in the error page location. Thanks J for reporting related bugs. -* fixed `r->phase_handler` in our post read handler. our handler may run one more time before :P -* the chunkin handler now returns `NGX_DECLINED` rather than `NGX_OK` when our `ngx_http_chunkin_read_chunked_request_body` function returns `NGX_OK`, to avoid bypassing other access-phase handlers. - -v0.16 ------ -* turned off ddebug in the previous release. thanks J for reporting it. - -v0.15 ------ -* fixed a regression that ctx->chunks_count never incremented in earlier versions. - -v0.14 ------ -* now we no longer skip those operations between the (interrupted) ngx_http_process_request_header and the server rewrite phase. this fixed the security issues regarding the [internal](http://wiki.nginx.org/HttpCoreModule#internal) directive as well as SSL sessions. -* try to ignore CR/LF/SP/HT at the begining of the chunked body. -* now we allow HT as padding spaces and ignore leading CRLFs. -* improved diagnostic info in the error.log messages when parsefail occurs. - -v0.11 ------ -* added a random valid-chunked-request generator in t/random.t. -* fixed a new connection leak issue caught by t/random.t. - -v0.10 ------ -* fixed a serious bug in the chunked parser grammer: there would be ambiguity when CRLF appears in the chunked data sections. Thanks J for reporting it. - -v0.08 ------ -* fixed gcc compilation errors on x86_64, thanks J for reporting it. -* used the latest Ragel 6.6 to generate the `chunked_parser.c` file in the source tree. - -v0.07 ------ - -* marked the disgarded 411 error page's output chain bufs as consumed by setting `buf->pos = buf->last`. (See [this nginx-devel thread](http://nginx.org/pipermail/nginx-devel/2009-December/000025.html) for more details.) -* added the [chunkin_keepalive](http://wiki.nginx.org/HttpChunkinModule#chunkin_keepalive) directive which can enable HTTP 1.1 keep-alive and HTTP 1.1 pipelining, and defaults to `off`. -* fixed the `alphtype` bug in the Ragel parser spec; which caused rejection of non-ascii octets in the chunked data. Thanks J for his bug report. -* added `Test::Nginx::Socket` to test our nginx module on the socket level. Thanks J for his bug report. -* rewrote the bufs recycling part and preread-buf-to-rb-buf transition part, also refactored the Ragel parser spec, thus eliminating lots of serious bugs. -* provided better diagnostics in the error log message for "bad chunked body" parsefails in the chunked parser. For example: - - - 2009/12/02 17:35:52 [error] 32244#0: *1 bad chunked body (offset 7, near "4^M - hell <-- HERE o^M - 0^M - ^M - ", marked by " <-- HERE "). - , client: 127.0.0.1, server: localhost, request: "POST /main - HTTP/1.1", host: "localhost" - - -* added some code to let the chunked parser handle special 0-size chunks that are not the last chunk. -* fixed a connection leak bug regarding incorrect `r->main->count` reference counter handling for nginx 0.8.11+ (well, the `ngx_http_read_client_request_body` function in the nginx core also has this issue, I'll report it later.) - -v0.06 ------ -* minor optimization: we won't traverse the output chain link if the chain count is not large enough. - -Test Suite -========== - -This module comes with a Perl-driven test suite. The [test cases](http://github.com/agentzh/chunkin-nginx-module/tree/master/test/t/) are -[declarative](http://github.com/agentzh/chunkin-nginx-module/blob/master/test/t/sanity.t) too. Thanks to the [Test::Base](http://search.cpan.org/perldoc?Test::Base) module in the Perl world. - -To run it on your side: - - - $ cd test - $ PATH=/path/to/your/nginx-with-chunkin-module:$PATH prove -r t - - -You need to terminate any Nginx processes before running the test suite if you have changed the Nginx server binary. - -At the moment, [LWP::UserAgent](http://search.cpan.org/perldoc?LWP::UserAgent) is used by the [test scaffold](http://github.com/agentzh/chunkin-nginx-module/blob/master/test/lib/Test/Nginx/LWP.pm) for simplicity. - -Because a single nginx server (by default, `localhost:1984`) is used across all the test scripts (`.t` files), it's meaningless to run the test suite in parallel by specifying `-jN` when invoking the `prove` utility. - -Some parts of the test suite requires modules [proxy](http://wiki.nginx.org/HttpProxyModule) and [echo](http://wiki.nginx.org/HttpEchoModule) to be enabled as well when building Nginx. - -Known Issues -============ - -* May not work with certain 3rd party modules like the [upload module](http://www.grid.net.ru/nginx/upload.en.html) because it implements its own request body reading mechanism. -* "client_body_in_single_buffer on" may *not* be obeyed for short contents and fast network. -* "client_body_in_file_only on" may *not* be obeyed for short contents and fast network. -* HTTP 1.1 pipelining may not fully work yet. - -TODO -==== - -* make the chunkin handler run at the end of the `access phase` rather than beginning. -* add support for `trailers` as specified in the [RFC 2616](http://tools.ietf.org/html/rfc2616#section-3.6.1). -* fix the [known issues](http://wiki.nginx.org/HttpChunkinModule#Known_Issues). - -Getting involved -================ - -You'll be very welcomed to submit patches to the [author](http://wiki.nginx.org/HttpChunkinModule#Author) or just ask for a commit bit to the [source repository](http://wiki.nginx.org/HttpChunkinModule#Source_Repository) on GitHub. - -Author -====== - -Zhang "agentzh" Yichun (章亦春) *<agentzh@gmail.com>* - -This wiki page is also maintained by the author himself, and everybody is encouraged to improve this page as well. - -Copyright & License -=================== - -The basic client request body reading code is based on the `ngx_http_read_client_request_body` function and its utility functions in the Nginx 0.8.20 core. This part of code is copyrighted by Igor Sysoev. - -Copyright (c) 2009, 2010, 2011, Zhang "agentzh" Yichun (章亦春) . - -This module is licensed under the terms of the BSD license. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions -are met: - -* Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. -* 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. -* Neither the name of the Taobao Inc. 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 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 -HOLDER 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 -======== - -* The original thread on the Nginx mailing list that inspires this module's development: ["'Content-Length' header for POSTs"](http://forum.nginx.org/read.php?2,4453,20543). -* The orginal announcement thread on the Nginx mailing list: ["The chunkin module: Experimental chunked input support for Nginx"](http://forum.nginx.org/read.php?2,22967). -* The original [blog post](http://agentzh.spaces.live.com/blog/cns!FF3A735632E41548!481.entry) about this module's initial development. -* The thread discussing chunked input support on the nginx-devel mailing list: ["Chunked request body and HTTP header parser"](http://nginx.org/pipermail/nginx-devel/2009-December/000021.html). -* The [echo module](http://wiki.nginx.org/HttpEchoModule) for Nginx module's automated testing. -* [RFC 2616 - Chunked Transfer Coding](http://tools.ietf.org/html/rfc2616#section-3.6.1). - diff --git a/debian/modules/chunkin-nginx-module/config b/debian/modules/chunkin-nginx-module/config deleted file mode 100644 index 91c14d4..0000000 --- a/debian/modules/chunkin-nginx-module/config +++ /dev/null @@ -1,5 +0,0 @@ -ngx_addon_name=ngx_http_chunkin_filter_module -HTTP_AUX_FILTER_MODULES="$HTTP_AUX_FILTER_MODULES ngx_http_chunkin_filter_module" -NGX_ADDON_SRCS="$NGX_ADDON_SRCS $ngx_addon_dir/src/ngx_http_chunkin_filter_module.c $ngx_addon_dir/src/ngx_http_chunkin_request_body.c $ngx_addon_dir/src/chunked_parser.c $ngx_addon_dir/src/ngx_http_chunkin_util.c" -NGX_ADDON_DEPS="$NGX_ADDON_DEPS $ngx_addon_dir/src/ddebug.h $ngx_addon_dir/src/ngx_http_chunkin_request_body.h $ngx_addon_dir/src/ngx_http_chunkin_filter_module.h $ngx_addon_dir/src/chunked_parser.h $ngx_addon_dir/src/ngx_http_chunkin_util.h" - diff --git a/debian/modules/chunkin-nginx-module/doc/HttpChunkinModule.wiki b/debian/modules/chunkin-nginx-module/doc/HttpChunkinModule.wiki deleted file mode 100644 index b097054..0000000 --- a/debian/modules/chunkin-nginx-module/doc/HttpChunkinModule.wiki +++ /dev/null @@ -1,400 +0,0 @@ -= Name = - -'''ngx_chunkin''' - HTTP 1.1 chunked-encoding request body support for Nginx. - -''This module is not distributed with the Nginx source.'' See [[#Installation|the installation instructions]]. - -= Status = - -This module is considered production ready. - -= Version = - -This document describes ngx_chunkin [http://github.com/agentzh/chunkin-nginx-module/tags v0.23rc2] released on November 24, 2011. - -= Synopsis = - - - chunkin on; - - error_page 411 = @my_411_error; - location @my_411_error { - chunkin_resume; - } - - location /foo { - # your fastcgi_pass/proxy_pass/set/if and - # any other config directives go here... - } - ... - - - - chunkin on; - - error_page 411 = @my_411_error; - location @my_411_error { - chunkin_resume; - } - - location /bar { - chunkin_keepalive on; # WARNING: too experimental! - - # your fastcgi_pass/proxy_pass/set/if and - # any other config directives go here... - } - - -= Description = - -This module adds [http://tools.ietf.org/html/rfc2616#section-3.6.1 HTTP 1.1 chunked] input support for Nginx without the need of patching the Nginx core. - -Behind the scene, it registers an access-phase handler that will eagerly read and decode incoming request bodies when a Transfer-Encoding: chunked header triggers a 411 error page in Nginx. For requests that are not in the chunked transfer encoding, this module is a "no-op". - -To enable the magic, just turn on the [[#chunkin|chunkin]] config option and define a custom 411 error_page using [[#chunkin_resume|chunkin_resume]], like this: - - - server { - chunkin on; - - error_page 411 = @my_411_error; - location @my_411_error { - chunkin_resume; - } - - ... - } - - -No other modification is required in your nginx.conf file and everything should work out of the box including the standard [[HttpProxyModule|proxy module]] (except for those [[#Known Issues|known issues]]). Note that the [[#chunkin|chunkin]] directive is not allowed in the location block while the [[#chunkin_resume|chunkin_resume]] directive is only allowed on in locations. - -The core module's [[HttpCoreModule#client_body_buffer_size|client_body_buffer_size]], [[HttpCoreModule#client_max_body_size|client_max_body_size]], and [[HttpCoreModule#client_body_timeout|client_body_timeout]] directive settings are honored. Note that, the "body sizes" here always indicate chunked-encoded body, not the data that has already been decoded. Basically, the -chunked-encoded body will always be slightly larger than the original data that is not encoded. - -The [[HttpCoreModule#client_body_in_file_only|client_body_in_file_only]] and [[HttpCoreModule#client_body_in_single_buffer|client_body_in_single_buffer]] settings are followed partially. See [[#Known Issues|Know Issues]]. - -This module is not supposed to be merged into the Nginx core because I've used [http://www.complang.org/ragel/ Ragel] to generate the chunked encoding parser for joy :) - -== How it works == - -Nginx explicitly checks chunked Transfer-Encoding headers and absent content length header in its very -early phase. Well, as early as the ngx_http_process_request_header -function. So this module takes a rather tricky approach. That is, use an output filter to intercept the 411 Length Required error page response issued by ngx_http_process_request_header, -fix things and finally issue an internal redirect to the current location, -thus starting from those phases we all know and love, this time -bypassing the horrible ngx_http_process_request_header function. - -In the rewrite phase of the newly created request, this module eagerly reads in the chunked request body in a way similar to that of the standard ngx_http_read_client_request_body function, but using its own chunked parser generated by Ragel. The decoded request body will be put into r->request_body->bufs and a corresponding Content-Length header will be inserted into r->headers_in. - -Those modules using the standard ngx_http_read_client_request_body function to read the request body will just work out of box because ngx_http_read_client_request_body returns immediately when it sees r->request_body->bufs already exists. - -Special efforts have been made to reduce data copying and dynamic memory allocation. - -= Directives = - -== chunkin == -'''syntax:''' ''chunkin on|off'' - -'''default:''' ''off'' - -'''context:''' ''http, server'' - -'''phase:''' ''access'' - -Enables or disables this module's hooks. - -== chunkin_resume == -'''syntax:''' ''chunkin_resume'' - -'''default:''' ''no'' - -'''context:''' ''location'' - -'''phase:''' ''content'' - -This directive must be used in your custom 411 error page location to help this module work correctly. For example: - - - error_page 411 = @my_error; - location @my_error { - chunkin_resume; - } - - -For the technical reason behind the necessity of this directive, please read the nginx-devel thread [http://nginx.org/pipermail/nginx-devel/2009-December/000041.html Content-Length is not ignored for chunked requests: Nginx violates RFC 2616]. - -This directive was first introduced in the [[#v0.17|v0.17]] release. - -== chunkin_max_chunks_per_buf == -'''syntax:''' ''chunkin_max_chunks_per_buf '' - -'''default:''' ''512'' - -'''context:''' ''http, server, location'' - -Set the max chunk count threshold for the buffer determined by the [[HttpCoreModule#client_body_buffer_size|client_body_buffer_size]] directive. -If the average chunk size is 1 KB and your [[HttpCoreModule#client_body_buffer_size|client_body_buffer_size]] setting -is 1 meta bytes, then you should set this threshold to 1024 or 2048. - -When the raw body size is exceeding [[HttpCoreModule#client_body_buffer_size|client_body_buffer_size]] ''or'' the chunk counter is exceeding this chunkin_max_chunks_per_buf setting, the decoded data will be temporarily buffered into disk files, and then the main buffer gets cleared and the chunk counter gets reset back to 0 (or 1 if there's a "pending chunk"). - -This directive was first introduced in the [[#v0.17|v0.17]] release. - -== chunkin_keepalive == -'''syntax:''' ''chunkin_keepalive on|off'' - -'''default:''' ''off'' - -'''context:''' ''http, server, location, if'' - -Turns on or turns off HTTP 1.1 keep-alive and HTTP 1.1 pipelining support. - -Keep-alive without pipelining should be quite stable but pipelining support is very preliminary, limited, and almost untested. - -This directive was first introduced in the [[#v0.07|v0.07 release]]. - -'''Technical note on the HTTP 1.1 pipeling support''' - -The basic idea is to copy the bytes left by my chunked parser in -r->request_body->buf over into r->header_in so that nginx's -ngx_http_set_keepalive and ngx_http_init_request functions will pick -it up for the subsequent pipelined requests. When the request body is -small enough to be completely preread into the r->header_in buffer, -then no data copy is needed here -- just setting r->header_in->pos -correctly will suffice. - -The only issue that remains is how to enlarge r->header_in when the -data left in r->request_body->buf is just too large to be hold in the -remaining room between r->header_in->pos and r->header_in->end. For -now, this module will just give up and simply turn off r->keepalive. - -I know we can always use exactly the remaining room in r->header_in as -the buffer size when reading data from c->recv, but's suboptimal when -the remaining room in r->header_in happens to be very small while -r->request_body->buf is quite large. - -I haven't fully grokked all the details among r->header_in, c->buffer, -busy/free lists and those so-called "large header buffers". Is there a -clean and safe way to reallocate or extend the r->header_in buffer? - -= Installation = - -Grab the nginx source code from [http://nginx.org/ nginx.org], for example, -the version 1.0.8 (see [[#Compatibility|nginx compatibility]]), and then build the source with this module: - - - wget 'http://nginx.org/download/nginx-1.0.8.tar.gz' - tar -xzvf nginx-1.0.8.tar.gz - cd nginx-1.0.8/ - - # Here we assume you would install you nginx under /opt/nginx/. - ./configure --prefix=/opt/nginx \ - --add-module=/path/to/chunkin-nginx-module - - make -j2 - make install - - -Download the latest version of the release tarball of this module from [http://github.com/agentzh/chunkin-nginx-module/tags chunkin-nginx-module file list]. - -== For Developers == - -The chunked parser is generated by [http://www.complang.org/ragel/ Ragel]. If you want to -regenerate the parser's C file, i.e., [http://github.com/agentzh/chunkin-nginx-module/blob/master/src/chunked_parser.c src/chunked_parser.c], use -the following command from the root of the chunkin module's source tree: - - - $ ragel -G2 src/chunked_parser.rl - - -= Packages from users = - -== Fedora 13 RPM files == - -The following source and binary rpm files are contributed by Ernest Folch, with nginx 0.8.54, ngx_chunkin v0.21 and ngx_headers_more v0.13: - -* [http://agentzh.org/misc/nginx/ernest/nginx-0.8.54-1.fc13.src.rpm nginx-0.8.54-1.fc13.src.rpm] -* [http://agentzh.org/misc/nginx/ernest/nginx-0.8.54-1.fc13.x86_64.rpm nginx-0.8.54-1.fc13.x86_64.rpm] - -= Compatibility = - -The following versions of Nginx should work with this module: - -* '''1.1.x''' (last tested: 1.1.5) -* '''1.0.x''' (last tested: 1.0.10) -* '''0.8.x''' (last tested: 0.8.54) -* '''0.7.x >= 0.7.21''' (last tested: 0.7.67) - -Earlier versions of Nginx like 0.6.x and 0.5.x will ''not'' work. - -If you find that any particular version of Nginx above 0.7.21 does not work with this module, please consider [[#Report Bugs|reporting a bug]]. - -= Report Bugs = - -Although a lot of effort has been put into testing and code tuning, there must be some serious bugs lurking somewhere in this module. So whenever you are bitten by any quirks, please don't hesitate to - -# send a bug report or even patches to , -# or create a ticket on the [http://github.com/agentzh/chunkin-nginx-module/issues issue tracking interface] provided by GitHub. - -= Source Repository = - -Available on github at [http://github.com/agentzh/chunkin-nginx-module agentzh/chunkin-nginx-module]. - -= ChangeLog = - -== v0.22 == -* now we remove the request header Transfer-Encoding completely because at least Apache will complain about the empty-value Transfer-Encoding request header. thanks hoodoos and Sandesh Kotwal. -* now we allow DELETE requests with chunked request bodies per hoodoos's request. -* now we use the 2-clause BSD license. - -== v0.21 == -* applied a patch from Gong Kaihui (龚开晖) to always call post_handler in ngx_http_chunkin_read_chunked_request_body. - -== v0.20 == -* fixed a bug that may read incomplete chunked body. thanks Gong Kaihui (龚开晖). -* fixed various memory issues in the implementation which may cause nginx processes to crash. -* added support for chunked PUT requests. -* now we always require "error_page 411 @resume" and no default (buggy) magic any more. thanks Gong Kaihui (龚开晖). - -== v0.19 == -* we now use ragel -G2 to generate the chunked parser and we're 36% faster. -* we now eagerly read the data octets in the chunked parser and we're 43% faster. - -== v0.18 == -* added support for chunk-extension to the chunked parser as per [http://tools.ietf.org/html/rfc2616#section-3.6.1 RFC 2616], but we just ignore them (if any) because we don't understand them. -* added more diagnostic information for certian error messages. - -== v0.17 == -* implemented the [[#chunkin_max_chunks_per_buf|chunkin_max_chunks_per_buf]] directive to allow overriding the default 512 setting. -* we now bypass nginx's [http://nginx.org/pipermail/nginx-devel/2009-December/000041.html discard requesty body bug] by requiring our users to define explicit 411 error_page with [[#chunkin_resume|chunkin_resume]] in the error page location. Thanks J for reporting related bugs. -* fixed r->phase_handler in our post read handler. our handler may run one more time before :P -* the chunkin handler now returns NGX_DECLINED rather than NGX_OK when our ngx_http_chunkin_read_chunked_request_body function returns NGX_OK, to avoid bypassing other access-phase handlers. - -== v0.16 == -* turned off ddebug in the previous release. thanks J for reporting it. - -== v0.15 == -* fixed a regression that ctx->chunks_count never incremented in earlier versions. - -== v0.14 == -* now we no longer skip those operations between the (interrupted) ngx_http_process_request_header and the server rewrite phase. this fixed the security issues regarding the [[HttpCoreModule#internal|internal]] directive as well as SSL sessions. -* try to ignore CR/LF/SP/HT at the begining of the chunked body. -* now we allow HT as padding spaces and ignore leading CRLFs. -* improved diagnostic info in the error.log messages when parsefail occurs. - -== v0.11 == -* added a random valid-chunked-request generator in t/random.t. -* fixed a new connection leak issue caught by t/random.t. - -== v0.10 == -* fixed a serious bug in the chunked parser grammer: there would be ambiguity when CRLF appears in the chunked data sections. Thanks J for reporting it. - -== v0.08 == -* fixed gcc compilation errors on x86_64, thanks J for reporting it. -* used the latest Ragel 6.6 to generate the chunked_parser.c file in the source tree. - -== v0.07 == - -* marked the disgarded 411 error page's output chain bufs as consumed by setting buf->pos = buf->last. (See [http://nginx.org/pipermail/nginx-devel/2009-December/000025.html this nginx-devel thread] for more details.) -* added the [[#chunkin_keepalive|chunkin_keepalive]] directive which can enable HTTP 1.1 keep-alive and HTTP 1.1 pipelining, and defaults to off. -* fixed the alphtype bug in the Ragel parser spec; which caused rejection of non-ascii octets in the chunked data. Thanks J for his bug report. -* added Test::Nginx::Socket to test our nginx module on the socket level. Thanks J for his bug report. -* rewrote the bufs recycling part and preread-buf-to-rb-buf transition part, also refactored the Ragel parser spec, thus eliminating lots of serious bugs. -* provided better diagnostics in the error log message for "bad chunked body" parsefails in the chunked parser. For example: - - - 2009/12/02 17:35:52 [error] 32244#0: *1 bad chunked body (offset 7, near "4^M - hell <-- HERE o^M - 0^M - ^M - ", marked by " <-- HERE "). - , client: 127.0.0.1, server: localhost, request: "POST /main -HTTP/1.1", host: "localhost" - - -* added some code to let the chunked parser handle special 0-size chunks that are not the last chunk. -* fixed a connection leak bug regarding incorrect r->main->count reference counter handling for nginx 0.8.11+ (well, the ngx_http_read_client_request_body function in the nginx core also has this issue, I'll report it later.) - -== v0.06 == -* minor optimization: we won't traverse the output chain link if the chain count is not large enough. - -= Test Suite = - -This module comes with a Perl-driven test suite. The [http://github.com/agentzh/chunkin-nginx-module/tree/master/test/t/ test cases] are -[http://github.com/agentzh/chunkin-nginx-module/blob/master/test/t/sanity.t declarative] too. Thanks to the [http://search.cpan.org/perldoc?Test::Base Test::Base] module in the Perl world. - -To run it on your side: - - - $ cd test - $ PATH=/path/to/your/nginx-with-chunkin-module:$PATH prove -r t - - -You need to terminate any Nginx processes before running the test suite if you have changed the Nginx server binary. - -At the moment, [http://search.cpan.org/perldoc?LWP::UserAgent LWP::UserAgent] is used by the [http://github.com/agentzh/chunkin-nginx-module/blob/master/test/lib/Test/Nginx/LWP.pm test scaffold] for simplicity. - -Because a single nginx server (by default, localhost:1984) is used across all the test scripts (.t files), it's meaningless to run the test suite in parallel by specifying -jN when invoking the prove utility. - -Some parts of the test suite requires modules [[HttpProxyModule|proxy]] and [[HttpEchoModule|echo]] to be enabled as well when building Nginx. - -= Known Issues = - -* May not work with certain 3rd party modules like the [http://www.grid.net.ru/nginx/upload.en.html upload module] because it implements its own request body reading mechanism. -* "client_body_in_single_buffer on" may *not* be obeyed for short contents and fast network. -* "client_body_in_file_only on" may *not* be obeyed for short contents and fast network. -* HTTP 1.1 pipelining may not fully work yet. - -= TODO = - -* make the chunkin handler run at the end of the access phase rather than beginning. -* add support for trailers as specified in the [http://tools.ietf.org/html/rfc2616#section-3.6.1 RFC 2616]. -* fix the [[#Known Issues|known issues]]. - -= Getting involved = - -You'll be very welcomed to submit patches to the [[#Author|author]] or just ask for a commit bit to the [[#Source Repository|source repository]] on GitHub. - -= Author = - -Zhang "agentzh" Yichun (章亦春) '''' - -This wiki page is also maintained by the author himself, and everybody is encouraged to improve this page as well. - -= Copyright & License = - -The basic client request body reading code is based on the ngx_http_read_client_request_body function and its utility functions in the Nginx 0.8.20 core. This part of code is copyrighted by Igor Sysoev. - -Copyright (c) 2009, 2010, 2011, Zhang "agentzh" Yichun (章亦春) . - -This module is licensed under the terms of the BSD license. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions -are met: - -* Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. -* 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. -* Neither the name of the Taobao Inc. 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 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 -HOLDER 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 = - -* The original thread on the Nginx mailing list that inspires this module's development: [http://forum.nginx.org/read.php?2,4453,20543 "'Content-Length' header for POSTs"]. -* The orginal announcement thread on the Nginx mailing list: [http://forum.nginx.org/read.php?2,22967 "The chunkin module: Experimental chunked input support for Nginx"]. -* The original [http://agentzh.spaces.live.com/blog/cns!FF3A735632E41548!481.entry blog post] about this module's initial development. -* The thread discussing chunked input support on the nginx-devel mailing list: [http://nginx.org/pipermail/nginx-devel/2009-December/000021.html "Chunked request body and HTTP header parser"]. -* The [[HttpEchoModule|echo module]] for Nginx module's automated testing. -* [http://tools.ietf.org/html/rfc2616#section-3.6.1 RFC 2616 - Chunked Transfer Coding]. - diff --git a/debian/modules/chunkin-nginx-module/misc/Makefile b/debian/modules/chunkin-nginx-module/misc/Makefile deleted file mode 100644 index c4e039b..0000000 --- a/debian/modules/chunkin-nginx-module/misc/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -%: %.c - gcc -Wall -O2 -o $@ $< - -%.c: %.rl - ragel -G2 $< - diff --git a/debian/modules/chunkin-nginx-module/misc/README b/debian/modules/chunkin-nginx-module/misc/README deleted file mode 100644 index 7588e1d..0000000 --- a/debian/modules/chunkin-nginx-module/misc/README +++ /dev/null @@ -1,10 +0,0 @@ -This is a standalone program that tests the chunked body parser. - -To build the "chunked" program, run the following command within this directory: - - $ make chunked - -Then invoke the program like this: - - $ perl -e 'print "5\r\nhello\r\n0\r\n\r\n"' | ./chunked - diff --git a/debian/modules/chunkin-nginx-module/misc/chunked.rl b/debian/modules/chunkin-nginx-module/misc/chunked.rl deleted file mode 100644 index 979cdc4..0000000 --- a/debian/modules/chunkin-nginx-module/misc/chunked.rl +++ /dev/null @@ -1,114 +0,0 @@ -#include -#include - -enum { - BUFSIZE = 256 -}; - -%% machine chunked; -%% write data; - -int main (int argc, char **argv) -{ - int cs, res = 0; - char *p, *pe, *eof; - char buf[BUFSIZE]; - size_t len = 0; - size_t bytes_read; - eof = NULL; - size_t data_bytes_read = 0, chunk_size = 0; - int chunk_size_order = 0; - - %%{ - action bad_last_chunk { - fprintf(stderr, "bad last chunk (offset %d).\n", p - buf); - } - - action bad_chunk_data { - fprintf(stderr, "bad chunk data " - "(bytes already read %d, bytes expected: %d): " - "offset %d.\n", data_bytes_read, chunk_size, p - buf); - } - - action test_len { - data_bytes_read < chunk_size - } - - action read_data_byte { - data_bytes_read++; - fprintf(stderr, "data bytes read: %d (char: %c)\n", - data_bytes_read, *p); - } - - action start_reading_size { - data_bytes_read = 0; - chunk_size = 0; - chunk_size_order = 0; - } - - action read_size { - chunk_size <<= 4; - chunk_size_order++; - if (*p >= 'A' && *p <= 'F') { - chunk_size |= 10 + *p - 'A'; - } else if (*p >= 'a' && *p <= 'f') { - chunk_size |= 10 + *p - 'a'; - } else { - chunk_size |= *p - '0'; - } - printf("INFO: chunk size: %d\n", chunk_size); - } - - action verify_data { - if (data_bytes_read != chunk_size) { - fprintf(stderr, "ERROR: chunk size not meet: " - "%d != %d\n", data_bytes_read, chunk_size); - fbreak; - } - } - - CRLF = "\r\n"; - - chunk_size = (xdigit+ - "0") >start_reading_size $read_size; - - chunk_data_octet = any - when test_len $err(bad_chunk_data) $read_data_byte; - - chunk_data = chunk_data_octet* %verify_data; - - chunk = chunk_size " "* CRLF - chunk_data CRLF; - - last_chunk = "0" " "* CRLF ${ fprintf(stderr, "in last chunk %d (cs: %d)\n", p - buf, cs); }; #$err(bad_last_chunk); - - main := (chunk* - last_chunk - CRLF) %err{ fprintf(stderr, "in end %d (cs: %d)\n", p - buf, cs); }; - - }%% - - %% write init; - - while (len < BUFSIZE) { - bytes_read = - fread(buf + len, sizeof(char), BUFSIZE - len, stdin); - if (bytes_read == 0) { - break; - } - len += bytes_read; - if (feof(stdin) || ferror(stdin)) { - break; - } - } - - p = buf; - pe = buf + len; - - %% write exec; - - printf("cs >= first_final: %d, execute = %i, p moved %d, " - "p remaining: %d\n", cs >= chunked_first_final, res, p - buf, pe - p); - - return 0; -} - diff --git a/debian/modules/chunkin-nginx-module/src/chunked_parser.c b/debian/modules/chunkin-nginx-module/src/chunked_parser.c deleted file mode 100644 index a474e34..0000000 --- a/debian/modules/chunkin-nginx-module/src/chunked_parser.c +++ /dev/null @@ -1,1395 +0,0 @@ - -#line 1 "src/chunked_parser.rl" -/* Copyright (C) agentzh */ - -#ifndef DDEBUG -#define DDEBUG 0 -#endif - -#include "ddebug.h" - -#include "chunked_parser.h" -#include "ngx_http_chunkin_util.h" - -#define ngx_chunkin_min(x, y) ((x) < (y) ? (x) : (y)) - -enum { - PRE_TEXT_LEN = 25, - POST_TEXT_LEN = 25 -}; - - -#line 20 "src/chunked_parser.rl" - -#line 25 "src/chunked_parser.c" -static const int chunked_start = 1; -static const int chunked_first_final = 43; -static const int chunked_error = 0; - -static const int chunked_en_main = 1; - - -#line 21 "src/chunked_parser.rl" - - -ngx_int_t -ngx_http_chunkin_init_chunked_parser(ngx_http_request_t *r, - ngx_http_chunkin_ctx_t *ctx) -{ - int cs; - - -#line 43 "src/chunked_parser.c" - { - cs = chunked_start; - } - -#line 30 "src/chunked_parser.rl" - - ctx->chunks = NULL; - ctx->next_chunk = NULL; - ctx->chunk = NULL; - ctx->chunk_size = 0; - ctx->chunk_size_order = 0; - ctx->chunk_bytes_read = 0; - - ctx->chunks_total_size = 0; - - ctx->parser_state = cs; - - return NGX_OK; -} - - -ngx_int_t -ngx_http_chunkin_run_chunked_parser(ngx_http_request_t *r, - ngx_http_chunkin_ctx_t *ctx, u_char **pos_addr, u_char *last, char *caller_info) -{ - int cs = ctx->parser_state; - ngx_connection_t *c = r->connection; - signed char *pos = (signed char *) *pos_addr; - signed char *p = (signed char *) *pos_addr; - signed char *pe = (signed char *) last; - signed char *eof = NULL; - ngx_buf_t *b; - ngx_flag_t done = 0; - ngx_str_t pre, post; - char* err_ctx = ""; - ngx_str_t user_agent = ngx_null_string; - ssize_t rest; - - -#line 236 "src/chunked_parser.rl" - - - -#line 87 "src/chunked_parser.c" - { - short _widec; - if ( p == pe ) - goto _test_eof; - switch ( cs ) - { -case 1: - if ( (*p) == 48 ) - goto tr0; - if ( (*p) < 65 ) { - if ( 49 <= (*p) && (*p) <= 57 ) - goto tr2; - } else if ( (*p) > 70 ) { - if ( 97 <= (*p) && (*p) <= 102 ) - goto tr2; - } else - goto tr2; - goto st0; -tr3: -#line 227 "src/chunked_parser.rl" - { err_ctx = "last_chunk"; } - goto st0; -tr9: -#line 168 "src/chunked_parser.rl" - { err_ctx = "CRLF"; } -#line 227 "src/chunked_parser.rl" - { err_ctx = "last_chunk"; } - goto st0; -tr11: -#line 168 "src/chunked_parser.rl" - { err_ctx = "CRLF"; } -#line 227 "src/chunked_parser.rl" - { err_ctx = "last_chunk"; } -#line 231 "src/chunked_parser.rl" - { err_ctx = "parser"; } - goto st0; -tr13: -#line 168 "src/chunked_parser.rl" - { err_ctx = "CRLF"; } -#line 231 "src/chunked_parser.rl" - { err_ctx = "parser"; } - goto st0; -tr23: -#line 168 "src/chunked_parser.rl" - { err_ctx = "CRLF"; } - goto st0; -tr29: -#line 218 "src/chunked_parser.rl" - { err_ctx = "chunk_size"; } -#line 221 "src/chunked_parser.rl" - { err_ctx = "chunk_ext"; } - goto st0; -tr33: -#line 168 "src/chunked_parser.rl" - { err_ctx = "CRLF"; } -#line 221 "src/chunked_parser.rl" - { err_ctx = "chunk_ext"; } - goto st0; -tr35: -#line 168 "src/chunked_parser.rl" - { err_ctx = "CRLF"; } -#line 221 "src/chunked_parser.rl" - { err_ctx = "chunk_ext"; } -#line 177 "src/chunked_parser.rl" - { err_ctx = "chunk_data"; } - goto st0; -tr37: -#line 177 "src/chunked_parser.rl" - { err_ctx = "chunk_data"; } - goto st0; -tr40: -#line 181 "src/chunked_parser.rl" - { err_ctx = "chunk_data_terminator"; } - goto st0; -tr43: -#line 221 "src/chunked_parser.rl" - { err_ctx = "chunk_ext"; } - goto st0; -#line 166 "src/chunked_parser.c" -st0: -cs = 0; - goto _out; -tr0: -#line 98 "src/chunked_parser.rl" - { - ctx->chunk_bytes_read = 0; - ctx->chunk_size = 0; - ctx->chunk_size_order = 0; - } -#line 104 "src/chunked_parser.rl" - { - ctx->chunk_size <<= 4; - ctx->chunk_size_order++; - if (*p >= 'A' && *p <= 'F') { - ctx->chunk_size |= 10 + *p - 'A'; - } else if (*p >= 'a' && *p <= 'f') { - ctx->chunk_size |= 10 + *p - 'a'; - } else { - ctx->chunk_size |= *p - '0'; - } - - ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0, - "chunkin: chunk size: %uz\n", ctx->chunk_size); - } - goto st2; -tr6: -#line 104 "src/chunked_parser.rl" - { - ctx->chunk_size <<= 4; - ctx->chunk_size_order++; - if (*p >= 'A' && *p <= 'F') { - ctx->chunk_size |= 10 + *p - 'A'; - } else if (*p >= 'a' && *p <= 'f') { - ctx->chunk_size |= 10 + *p - 'a'; - } else { - ctx->chunk_size |= *p - '0'; - } - - ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0, - "chunkin: chunk size: %uz\n", ctx->chunk_size); - } - goto st2; -st2: - if ( ++p == pe ) - goto _test_eof2; -case 2: -#line 214 "src/chunked_parser.c" - switch( (*p) ) { - case 9: goto st3; - case 13: goto st4; - case 32: goto st3; - case 48: goto tr6; - case 59: goto st7; - } - if ( (*p) < 65 ) { - if ( 49 <= (*p) && (*p) <= 57 ) - goto tr7; - } else if ( (*p) > 70 ) { - if ( 97 <= (*p) && (*p) <= 102 ) - goto tr7; - } else - goto tr7; - goto tr3; -st3: - if ( ++p == pe ) - goto _test_eof3; -case 3: - switch( (*p) ) { - case 9: goto st3; - case 13: goto st4; - case 32: goto st3; - case 59: goto st7; - } - goto tr3; -st4: - if ( ++p == pe ) - goto _test_eof4; -case 4: - if ( (*p) == 10 ) - goto st5; - goto tr9; -st5: - if ( ++p == pe ) - goto _test_eof5; -case 5: - if ( (*p) == 13 ) - goto st6; - goto tr11; -st6: - if ( ++p == pe ) - goto _test_eof6; -case 6: - if ( (*p) == 10 ) - goto tr14; - goto tr13; -tr14: -#line 66 "src/chunked_parser.rl" - { - done = 1; - } - goto st43; -st43: - if ( ++p == pe ) - goto _test_eof43; -case 43: -#line 273 "src/chunked_parser.c" - goto tr13; -st7: - if ( ++p == pe ) - goto _test_eof7; -case 7: - switch( (*p) ) { - case 9: goto st7; - case 32: goto st7; - case 34: goto st0; - case 44: goto st0; - case 47: goto st0; - case 123: goto st0; - case 125: goto st0; - case 127: goto st0; - } - if ( (*p) < 40 ) { - if ( 0 <= (*p) && (*p) <= 31 ) - goto st0; - } else if ( (*p) > 41 ) { - if ( (*p) > 64 ) { - if ( 91 <= (*p) && (*p) <= 93 ) - goto st0; - } else if ( (*p) >= 58 ) - goto st0; - } else - goto st0; - goto st8; -st8: - if ( ++p == pe ) - goto _test_eof8; -case 8: - switch( (*p) ) { - case 9: goto st9; - case 13: goto st4; - case 32: goto st9; - case 34: goto tr3; - case 44: goto tr3; - case 47: goto tr3; - case 59: goto st7; - case 61: goto st10; - case 123: goto tr3; - case 125: goto tr3; - case 127: goto tr3; - } - if ( (*p) < 40 ) { - if ( 0 <= (*p) && (*p) <= 31 ) - goto tr3; - } else if ( (*p) > 41 ) { - if ( (*p) > 64 ) { - if ( 91 <= (*p) && (*p) <= 93 ) - goto tr3; - } else if ( (*p) >= 58 ) - goto tr3; - } else - goto tr3; - goto st8; -st9: - if ( ++p == pe ) - goto _test_eof9; -case 9: - switch( (*p) ) { - case 9: goto st9; - case 13: goto st4; - case 32: goto st9; - case 59: goto st7; - case 61: goto st10; - } - goto tr3; -st10: - if ( ++p == pe ) - goto _test_eof10; -case 10: - switch( (*p) ) { - case 9: goto st10; - case 32: goto st10; - case 34: goto st12; - case 44: goto st0; - case 47: goto st0; - case 123: goto st0; - case 125: goto st0; - case 127: goto st0; - } - if ( (*p) < 40 ) { - if ( 0 <= (*p) && (*p) <= 31 ) - goto st0; - } else if ( (*p) > 41 ) { - if ( (*p) > 64 ) { - if ( 91 <= (*p) && (*p) <= 93 ) - goto st0; - } else if ( (*p) >= 58 ) - goto st0; - } else - goto st0; - goto st11; -st11: - if ( ++p == pe ) - goto _test_eof11; -case 11: - switch( (*p) ) { - case 9: goto st3; - case 13: goto st4; - case 32: goto st3; - case 34: goto tr3; - case 44: goto tr3; - case 47: goto tr3; - case 59: goto st7; - case 123: goto tr3; - case 125: goto tr3; - case 127: goto tr3; - } - if ( (*p) < 40 ) { - if ( 0 <= (*p) && (*p) <= 31 ) - goto tr3; - } else if ( (*p) > 41 ) { - if ( (*p) > 64 ) { - if ( 91 <= (*p) && (*p) <= 93 ) - goto tr3; - } else if ( (*p) >= 58 ) - goto tr3; - } else - goto tr3; - goto st11; -st12: - if ( ++p == pe ) - goto _test_eof12; -case 12: - switch( (*p) ) { - case 34: goto st3; - case 92: goto st13; - case 127: goto st0; - } - if ( (*p) > 8 ) { - if ( 10 <= (*p) && (*p) <= 31 ) - goto st0; - } else if ( (*p) >= 0 ) - goto st0; - goto st12; -st13: - if ( ++p == pe ) - goto _test_eof13; -case 13: - switch( (*p) ) { - case 13: goto st14; - case 34: goto st15; - case 92: goto st13; - } - goto st12; -st14: - if ( ++p == pe ) - goto _test_eof14; -case 14: - switch( (*p) ) { - case 34: goto st3; - case 92: goto st13; - case 127: goto tr23; - } - if ( (*p) > 8 ) { - if ( 10 <= (*p) && (*p) <= 31 ) - goto tr23; - } else if ( (*p) >= 0 ) - goto tr23; - goto st12; -st15: - if ( ++p == pe ) - goto _test_eof15; -case 15: - switch( (*p) ) { - case 9: goto st15; - case 13: goto st4; - case 32: goto st15; - case 34: goto st3; - case 59: goto st16; - case 92: goto st13; - case 127: goto tr3; - } - if ( 0 <= (*p) && (*p) <= 31 ) - goto tr3; - goto st12; -st16: - if ( ++p == pe ) - goto _test_eof16; -case 16: - switch( (*p) ) { - case 9: goto st16; - case 32: goto st16; - case 34: goto st3; - case 44: goto st12; - case 47: goto st12; - case 92: goto st13; - case 123: goto st12; - case 125: goto st12; - case 127: goto st0; - } - if ( (*p) < 40 ) { - if ( 0 <= (*p) && (*p) <= 31 ) - goto st0; - } else if ( (*p) > 41 ) { - if ( (*p) > 64 ) { - if ( 91 <= (*p) && (*p) <= 93 ) - goto st12; - } else if ( (*p) >= 58 ) - goto st12; - } else - goto st12; - goto st17; -st17: - if ( ++p == pe ) - goto _test_eof17; -case 17: - switch( (*p) ) { - case 9: goto st18; - case 13: goto st4; - case 32: goto st18; - case 34: goto st3; - case 44: goto st12; - case 47: goto st12; - case 59: goto st16; - case 61: goto st19; - case 92: goto st13; - case 123: goto st12; - case 125: goto st12; - case 127: goto tr3; - } - if ( (*p) < 40 ) { - if ( 0 <= (*p) && (*p) <= 31 ) - goto tr3; - } else if ( (*p) > 41 ) { - if ( (*p) > 64 ) { - if ( 91 <= (*p) && (*p) <= 93 ) - goto st12; - } else if ( (*p) >= 58 ) - goto st12; - } else - goto st12; - goto st17; -st18: - if ( ++p == pe ) - goto _test_eof18; -case 18: - switch( (*p) ) { - case 9: goto st18; - case 13: goto st4; - case 32: goto st18; - case 34: goto st3; - case 59: goto st16; - case 61: goto st19; - case 92: goto st13; - case 127: goto tr3; - } - if ( 0 <= (*p) && (*p) <= 31 ) - goto tr3; - goto st12; -st19: - if ( ++p == pe ) - goto _test_eof19; -case 19: - switch( (*p) ) { - case 9: goto st19; - case 32: goto st19; - case 34: goto st15; - case 44: goto st12; - case 47: goto st12; - case 92: goto st13; - case 123: goto st12; - case 125: goto st12; - case 127: goto st0; - } - if ( (*p) < 40 ) { - if ( 0 <= (*p) && (*p) <= 31 ) - goto st0; - } else if ( (*p) > 41 ) { - if ( (*p) > 64 ) { - if ( 91 <= (*p) && (*p) <= 93 ) - goto st12; - } else if ( (*p) >= 58 ) - goto st12; - } else - goto st12; - goto st20; -st20: - if ( ++p == pe ) - goto _test_eof20; -case 20: - switch( (*p) ) { - case 9: goto st15; - case 13: goto st4; - case 32: goto st15; - case 34: goto st3; - case 44: goto st12; - case 47: goto st12; - case 59: goto st16; - case 92: goto st13; - case 123: goto st12; - case 125: goto st12; - case 127: goto tr3; - } - if ( (*p) < 40 ) { - if ( 0 <= (*p) && (*p) <= 31 ) - goto tr3; - } else if ( (*p) > 41 ) { - if ( (*p) > 64 ) { - if ( 91 <= (*p) && (*p) <= 93 ) - goto st12; - } else if ( (*p) >= 58 ) - goto st12; - } else - goto st12; - goto st20; -tr2: -#line 98 "src/chunked_parser.rl" - { - ctx->chunk_bytes_read = 0; - ctx->chunk_size = 0; - ctx->chunk_size_order = 0; - } -#line 104 "src/chunked_parser.rl" - { - ctx->chunk_size <<= 4; - ctx->chunk_size_order++; - if (*p >= 'A' && *p <= 'F') { - ctx->chunk_size |= 10 + *p - 'A'; - } else if (*p >= 'a' && *p <= 'f') { - ctx->chunk_size |= 10 + *p - 'a'; - } else { - ctx->chunk_size |= *p - '0'; - } - - ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0, - "chunkin: chunk size: %uz\n", ctx->chunk_size); - } - goto st21; -tr7: -#line 104 "src/chunked_parser.rl" - { - ctx->chunk_size <<= 4; - ctx->chunk_size_order++; - if (*p >= 'A' && *p <= 'F') { - ctx->chunk_size |= 10 + *p - 'A'; - } else if (*p >= 'a' && *p <= 'f') { - ctx->chunk_size |= 10 + *p - 'a'; - } else { - ctx->chunk_size |= *p - '0'; - } - - ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0, - "chunkin: chunk size: %uz\n", ctx->chunk_size); - } - goto st21; -st21: - if ( ++p == pe ) - goto _test_eof21; -case 21: -#line 626 "src/chunked_parser.c" - switch( (*p) ) { - case 9: goto st22; - case 13: goto st23; - case 32: goto st22; - case 59: goto st28; - } - if ( (*p) < 65 ) { - if ( 48 <= (*p) && (*p) <= 57 ) - goto tr7; - } else if ( (*p) > 70 ) { - if ( 97 <= (*p) && (*p) <= 102 ) - goto tr7; - } else - goto tr7; - goto tr29; -st22: - if ( ++p == pe ) - goto _test_eof22; -case 22: - switch( (*p) ) { - case 9: goto st22; - case 13: goto st23; - case 32: goto st22; - case 59: goto st28; - } - goto tr29; -st23: - if ( ++p == pe ) - goto _test_eof23; -case 23: - if ( (*p) == 10 ) - goto st24; - goto tr33; -st24: - if ( ++p == pe ) - goto _test_eof24; -case 24: - _widec = (*p); - _widec = (short)(128 + ((*p) - -128)); - if ( -#line 70 "src/chunked_parser.rl" - - ctx->chunk_bytes_read < ctx->chunk_size - ) _widec += 256; - if ( 384 <= _widec && _widec <= 639 ) - goto tr36; - goto tr35; -tr36: -#line 119 "src/chunked_parser.rl" - { - ctx->chunk = ngx_http_chunkin_get_buf(r->pool, ctx); - - ctx->chunks_count++; - - if (ctx->chunks) { - *ctx->next_chunk = ctx->chunk; - } else { - ctx->chunks = ctx->chunk; - } - - ctx->next_chunk = &ctx->chunk->next; - - b = ctx->chunk->buf; - - b->last = b->pos = (u_char *) p; - b->memory = 1; - } -#line 74 "src/chunked_parser.rl" - { - /* optimization for buffered chunk data */ - - rest = ngx_chunkin_min( - (ssize_t)ctx->chunk_size - (ssize_t)ctx->chunk_bytes_read, - (ssize_t)(pe - p)); - - dd("moving %d, chunk size %d, read %d, rest %d", - (int)rest, - (int)ctx->chunk_size, - (int)ctx->chunk_bytes_read, - (int)rest); - - ctx->chunk_bytes_read += rest; - p += rest - 1; - ctx->chunk->buf->last = (u_char *)p + 1; - ctx->chunks_total_size += rest; - - /* dd("bytes read: %d (char '%c', bytes read %d, chunk size %d)", ctx->chunk->buf->last - ctx->chunk->buf->pos, *p, ctx->chunk_bytes_read, ctx->chunk_size); */ - ngx_log_debug2(NGX_LOG_DEBUG_HTTP, c->log, 0, - "chunkin: data bytes read: %uz (char: \"%c\")\n", - ctx->chunk_bytes_read, *p); - } - goto st25; -tr39: -#line 74 "src/chunked_parser.rl" - { - /* optimization for buffered chunk data */ - - rest = ngx_chunkin_min( - (ssize_t)ctx->chunk_size - (ssize_t)ctx->chunk_bytes_read, - (ssize_t)(pe - p)); - - dd("moving %d, chunk size %d, read %d, rest %d", - (int)rest, - (int)ctx->chunk_size, - (int)ctx->chunk_bytes_read, - (int)rest); - - ctx->chunk_bytes_read += rest; - p += rest - 1; - ctx->chunk->buf->last = (u_char *)p + 1; - ctx->chunks_total_size += rest; - - /* dd("bytes read: %d (char '%c', bytes read %d, chunk size %d)", ctx->chunk->buf->last - ctx->chunk->buf->pos, *p, ctx->chunk_bytes_read, ctx->chunk_size); */ - ngx_log_debug2(NGX_LOG_DEBUG_HTTP, c->log, 0, - "chunkin: data bytes read: %uz (char: \"%c\")\n", - ctx->chunk_bytes_read, *p); - } - goto st25; -st25: - if ( ++p == pe ) - goto _test_eof25; -case 25: -#line 749 "src/chunked_parser.c" - _widec = (*p); - if ( (*p) < 13 ) { - if ( (*p) <= 12 ) { - _widec = (short)(128 + ((*p) - -128)); - if ( -#line 70 "src/chunked_parser.rl" - - ctx->chunk_bytes_read < ctx->chunk_size - ) _widec += 256; - } - } else if ( (*p) > 13 ) { - if ( 14 <= (*p) ) - { _widec = (short)(128 + ((*p) - -128)); - if ( -#line 70 "src/chunked_parser.rl" - - ctx->chunk_bytes_read < ctx->chunk_size - ) _widec += 256; - } - } else { - _widec = (short)(128 + ((*p) - -128)); - if ( -#line 70 "src/chunked_parser.rl" - - ctx->chunk_bytes_read < ctx->chunk_size - ) _widec += 256; - } - if ( _widec == 269 ) - goto st26; - if ( 384 <= _widec && _widec <= 639 ) - goto tr39; - goto tr37; -st26: - if ( ++p == pe ) - goto _test_eof26; -case 26: - if ( (*p) == 10 ) - goto tr41; - goto tr40; -tr41: -#line 138 "src/chunked_parser.rl" - { - if (ctx->chunk_bytes_read != ctx->chunk_size) { - ngx_log_error(NGX_LOG_ERR, c->log, 0, - "ERROR: chunk size not met: " - "%uz != %uz\n", ctx->chunk_bytes_read, - ctx->chunk_size); - *pos_addr = (u_char*) p; - ctx->parser_state = chunked_error; - return NGX_ERROR; - } - - if (ctx->chunk_size == 0) { - /* remove the current chunk */ - ctx->chunk->next = ctx->free_bufs; - ctx->free_bufs = ctx->chunk; - ctx->chunk = ctx->last_complete_chunk; - if (ctx->last_complete_chunk) { - ctx->last_complete_chunk->next = NULL; - } else { - ctx->chunks = NULL; - } - } else { - ctx->last_complete_chunk = ctx->chunk; - } - } - goto st27; -st27: - if ( ++p == pe ) - goto _test_eof27; -case 27: -#line 821 "src/chunked_parser.c" - if ( (*p) == 48 ) - goto tr0; - if ( (*p) < 65 ) { - if ( 49 <= (*p) && (*p) <= 57 ) - goto tr2; - } else if ( (*p) > 70 ) { - if ( 97 <= (*p) && (*p) <= 102 ) - goto tr2; - } else - goto tr2; - goto tr40; -st28: - if ( ++p == pe ) - goto _test_eof28; -case 28: - switch( (*p) ) { - case 9: goto st28; - case 32: goto st28; - case 34: goto st0; - case 44: goto st0; - case 47: goto st0; - case 123: goto st0; - case 125: goto st0; - case 127: goto st0; - } - if ( (*p) < 40 ) { - if ( 0 <= (*p) && (*p) <= 31 ) - goto st0; - } else if ( (*p) > 41 ) { - if ( (*p) > 64 ) { - if ( 91 <= (*p) && (*p) <= 93 ) - goto st0; - } else if ( (*p) >= 58 ) - goto st0; - } else - goto st0; - goto st29; -st29: - if ( ++p == pe ) - goto _test_eof29; -case 29: - switch( (*p) ) { - case 9: goto st30; - case 13: goto st23; - case 32: goto st30; - case 34: goto tr43; - case 44: goto tr43; - case 47: goto tr43; - case 59: goto st28; - case 61: goto st31; - case 123: goto tr43; - case 125: goto tr43; - case 127: goto tr43; - } - if ( (*p) < 40 ) { - if ( 0 <= (*p) && (*p) <= 31 ) - goto tr43; - } else if ( (*p) > 41 ) { - if ( (*p) > 64 ) { - if ( 91 <= (*p) && (*p) <= 93 ) - goto tr43; - } else if ( (*p) >= 58 ) - goto tr43; - } else - goto tr43; - goto st29; -st30: - if ( ++p == pe ) - goto _test_eof30; -case 30: - switch( (*p) ) { - case 9: goto st30; - case 13: goto st23; - case 32: goto st30; - case 59: goto st28; - case 61: goto st31; - } - goto tr43; -st31: - if ( ++p == pe ) - goto _test_eof31; -case 31: - switch( (*p) ) { - case 9: goto st31; - case 32: goto st31; - case 34: goto st34; - case 44: goto st0; - case 47: goto st0; - case 123: goto st0; - case 125: goto st0; - case 127: goto st0; - } - if ( (*p) < 40 ) { - if ( 0 <= (*p) && (*p) <= 31 ) - goto st0; - } else if ( (*p) > 41 ) { - if ( (*p) > 64 ) { - if ( 91 <= (*p) && (*p) <= 93 ) - goto st0; - } else if ( (*p) >= 58 ) - goto st0; - } else - goto st0; - goto st32; -st32: - if ( ++p == pe ) - goto _test_eof32; -case 32: - switch( (*p) ) { - case 9: goto st33; - case 13: goto st23; - case 32: goto st33; - case 34: goto tr43; - case 44: goto tr43; - case 47: goto tr43; - case 59: goto st28; - case 123: goto tr43; - case 125: goto tr43; - case 127: goto tr43; - } - if ( (*p) < 40 ) { - if ( 0 <= (*p) && (*p) <= 31 ) - goto tr43; - } else if ( (*p) > 41 ) { - if ( (*p) > 64 ) { - if ( 91 <= (*p) && (*p) <= 93 ) - goto tr43; - } else if ( (*p) >= 58 ) - goto tr43; - } else - goto tr43; - goto st32; -st33: - if ( ++p == pe ) - goto _test_eof33; -case 33: - switch( (*p) ) { - case 9: goto st33; - case 13: goto st23; - case 32: goto st33; - case 59: goto st28; - } - goto tr43; -st34: - if ( ++p == pe ) - goto _test_eof34; -case 34: - switch( (*p) ) { - case 34: goto st33; - case 92: goto st35; - case 127: goto st0; - } - if ( (*p) > 8 ) { - if ( 10 <= (*p) && (*p) <= 31 ) - goto st0; - } else if ( (*p) >= 0 ) - goto st0; - goto st34; -st35: - if ( ++p == pe ) - goto _test_eof35; -case 35: - switch( (*p) ) { - case 13: goto st36; - case 34: goto st37; - case 92: goto st35; - } - goto st34; -st36: - if ( ++p == pe ) - goto _test_eof36; -case 36: - switch( (*p) ) { - case 34: goto st33; - case 92: goto st35; - case 127: goto tr23; - } - if ( (*p) > 8 ) { - if ( 10 <= (*p) && (*p) <= 31 ) - goto tr23; - } else if ( (*p) >= 0 ) - goto tr23; - goto st34; -st37: - if ( ++p == pe ) - goto _test_eof37; -case 37: - switch( (*p) ) { - case 9: goto st37; - case 13: goto st23; - case 32: goto st37; - case 34: goto st33; - case 59: goto st38; - case 92: goto st35; - case 127: goto tr43; - } - if ( 0 <= (*p) && (*p) <= 31 ) - goto tr43; - goto st34; -st38: - if ( ++p == pe ) - goto _test_eof38; -case 38: - switch( (*p) ) { - case 9: goto st38; - case 32: goto st38; - case 34: goto st33; - case 44: goto st34; - case 47: goto st34; - case 92: goto st35; - case 123: goto st34; - case 125: goto st34; - case 127: goto st0; - } - if ( (*p) < 40 ) { - if ( 0 <= (*p) && (*p) <= 31 ) - goto st0; - } else if ( (*p) > 41 ) { - if ( (*p) > 64 ) { - if ( 91 <= (*p) && (*p) <= 93 ) - goto st34; - } else if ( (*p) >= 58 ) - goto st34; - } else - goto st34; - goto st39; -st39: - if ( ++p == pe ) - goto _test_eof39; -case 39: - switch( (*p) ) { - case 9: goto st40; - case 13: goto st23; - case 32: goto st40; - case 34: goto st33; - case 44: goto st34; - case 47: goto st34; - case 59: goto st38; - case 61: goto st41; - case 92: goto st35; - case 123: goto st34; - case 125: goto st34; - case 127: goto tr43; - } - if ( (*p) < 40 ) { - if ( 0 <= (*p) && (*p) <= 31 ) - goto tr43; - } else if ( (*p) > 41 ) { - if ( (*p) > 64 ) { - if ( 91 <= (*p) && (*p) <= 93 ) - goto st34; - } else if ( (*p) >= 58 ) - goto st34; - } else - goto st34; - goto st39; -st40: - if ( ++p == pe ) - goto _test_eof40; -case 40: - switch( (*p) ) { - case 9: goto st40; - case 13: goto st23; - case 32: goto st40; - case 34: goto st33; - case 59: goto st38; - case 61: goto st41; - case 92: goto st35; - case 127: goto tr43; - } - if ( 0 <= (*p) && (*p) <= 31 ) - goto tr43; - goto st34; -st41: - if ( ++p == pe ) - goto _test_eof41; -case 41: - switch( (*p) ) { - case 9: goto st41; - case 32: goto st41; - case 34: goto st37; - case 44: goto st34; - case 47: goto st34; - case 92: goto st35; - case 123: goto st34; - case 125: goto st34; - case 127: goto st0; - } - if ( (*p) < 40 ) { - if ( 0 <= (*p) && (*p) <= 31 ) - goto st0; - } else if ( (*p) > 41 ) { - if ( (*p) > 64 ) { - if ( 91 <= (*p) && (*p) <= 93 ) - goto st34; - } else if ( (*p) >= 58 ) - goto st34; - } else - goto st34; - goto st42; -st42: - if ( ++p == pe ) - goto _test_eof42; -case 42: - switch( (*p) ) { - case 9: goto st37; - case 13: goto st23; - case 32: goto st37; - case 34: goto st33; - case 44: goto st34; - case 47: goto st34; - case 59: goto st38; - case 92: goto st35; - case 123: goto st34; - case 125: goto st34; - case 127: goto tr43; - } - if ( (*p) < 40 ) { - if ( 0 <= (*p) && (*p) <= 31 ) - goto tr43; - } else if ( (*p) > 41 ) { - if ( (*p) > 64 ) { - if ( 91 <= (*p) && (*p) <= 93 ) - goto st34; - } else if ( (*p) >= 58 ) - goto st34; - } else - goto st34; - goto st42; - } - _test_eof2: cs = 2; goto _test_eof; - _test_eof3: cs = 3; goto _test_eof; - _test_eof4: cs = 4; goto _test_eof; - _test_eof5: cs = 5; goto _test_eof; - _test_eof6: cs = 6; goto _test_eof; - _test_eof43: cs = 43; goto _test_eof; - _test_eof7: cs = 7; goto _test_eof; - _test_eof8: cs = 8; goto _test_eof; - _test_eof9: cs = 9; goto _test_eof; - _test_eof10: cs = 10; goto _test_eof; - _test_eof11: cs = 11; goto _test_eof; - _test_eof12: cs = 12; goto _test_eof; - _test_eof13: cs = 13; goto _test_eof; - _test_eof14: cs = 14; goto _test_eof; - _test_eof15: cs = 15; goto _test_eof; - _test_eof16: cs = 16; goto _test_eof; - _test_eof17: cs = 17; goto _test_eof; - _test_eof18: cs = 18; goto _test_eof; - _test_eof19: cs = 19; goto _test_eof; - _test_eof20: cs = 20; goto _test_eof; - _test_eof21: cs = 21; goto _test_eof; - _test_eof22: cs = 22; goto _test_eof; - _test_eof23: cs = 23; goto _test_eof; - _test_eof24: cs = 24; goto _test_eof; - _test_eof25: cs = 25; goto _test_eof; - _test_eof26: cs = 26; goto _test_eof; - _test_eof27: cs = 27; goto _test_eof; - _test_eof28: cs = 28; goto _test_eof; - _test_eof29: cs = 29; goto _test_eof; - _test_eof30: cs = 30; goto _test_eof; - _test_eof31: cs = 31; goto _test_eof; - _test_eof32: cs = 32; goto _test_eof; - _test_eof33: cs = 33; goto _test_eof; - _test_eof34: cs = 34; goto _test_eof; - _test_eof35: cs = 35; goto _test_eof; - _test_eof36: cs = 36; goto _test_eof; - _test_eof37: cs = 37; goto _test_eof; - _test_eof38: cs = 38; goto _test_eof; - _test_eof39: cs = 39; goto _test_eof; - _test_eof40: cs = 40; goto _test_eof; - _test_eof41: cs = 41; goto _test_eof; - _test_eof42: cs = 42; goto _test_eof; - - _test_eof: {} - if ( p == eof ) - { - switch ( cs ) { - case 14: - case 36: -#line 168 "src/chunked_parser.rl" - { err_ctx = "CRLF"; } - break; - case 25: -#line 177 "src/chunked_parser.rl" - { err_ctx = "chunk_data"; } - break; - case 26: - case 27: -#line 181 "src/chunked_parser.rl" - { err_ctx = "chunk_data_terminator"; } - break; - case 29: - case 30: - case 32: - case 33: - case 37: - case 39: - case 40: - case 42: -#line 221 "src/chunked_parser.rl" - { err_ctx = "chunk_ext"; } - break; - case 2: - case 3: - case 8: - case 9: - case 11: - case 15: - case 17: - case 18: - case 20: -#line 227 "src/chunked_parser.rl" - { err_ctx = "last_chunk"; } - break; - case 23: -#line 168 "src/chunked_parser.rl" - { err_ctx = "CRLF"; } -#line 221 "src/chunked_parser.rl" - { err_ctx = "chunk_ext"; } - break; - case 4: -#line 168 "src/chunked_parser.rl" - { err_ctx = "CRLF"; } -#line 227 "src/chunked_parser.rl" - { err_ctx = "last_chunk"; } - break; - case 6: -#line 168 "src/chunked_parser.rl" - { err_ctx = "CRLF"; } -#line 231 "src/chunked_parser.rl" - { err_ctx = "parser"; } - break; - case 21: - case 22: -#line 218 "src/chunked_parser.rl" - { err_ctx = "chunk_size"; } -#line 221 "src/chunked_parser.rl" - { err_ctx = "chunk_ext"; } - break; - case 24: -#line 168 "src/chunked_parser.rl" - { err_ctx = "CRLF"; } -#line 221 "src/chunked_parser.rl" - { err_ctx = "chunk_ext"; } -#line 177 "src/chunked_parser.rl" - { err_ctx = "chunk_data"; } - break; - case 5: -#line 168 "src/chunked_parser.rl" - { err_ctx = "CRLF"; } -#line 227 "src/chunked_parser.rl" - { err_ctx = "last_chunk"; } -#line 231 "src/chunked_parser.rl" - { err_ctx = "parser"; } - break; -#line 1277 "src/chunked_parser.c" - } - } - - _out: {} - } - -#line 239 "src/chunked_parser.rl" - - ctx->parser_state = cs; - - *pos_addr = (u_char *) p; - - if (p != pe) { - dd("ASSERTION FAILED: p != pe"); - } - - if (done) { - return NGX_OK; - } - - if (cs == chunked_error) { - -#if EXTENDED_DEBUG - - ngx_str_t headers_buf, preread_buf; - -#endif - - for (post.data = (u_char *) p, post.len = 0; - post.data + post.len != (u_char *) pe; post.len++) - { - if (post.len >= POST_TEXT_LEN) { - break; - } - } - - for (pre.data = (u_char *) p, pre.len = 0; - pre.data != (u_char *) pos; pre.data--, pre.len++) - { - if (pre.len >= PRE_TEXT_LEN) { - break; - } - } - - if (r->headers_in.user_agent) { - user_agent = r->headers_in.user_agent->value; - } - -#if EXTENDED_DEBUG - - headers_buf.data = r->header_in->start; - headers_buf.len = ctx->saved_header_in_pos - r->header_in->start; - - if (strcmp(caller_info, "preread") == 0) { - preread_buf.data = (u_char *) pos; - preread_buf.len = pe - pos; - - } else { - preread_buf.data = ctx->saved_header_in_pos; - preread_buf.len = r->header_in->pos - ctx->saved_header_in_pos; - } - -#endif - - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "bad chunked body (buf size %O, buf offset %O, " - "total decoded %uz, chunks count %d, " - "chunk size %uz, chunk data read %uz, " - "total to disk %uz, " - "raw body size %O, caller \"%s\", " - "plain_http %d, " - -#if (NGX_HTTP_SSL) - - "ssl %d, " -#endif - - "keepalive %d, err ctx \"%s\", " - "ctx ref count %ud, user agent \"%V\", " - -#if EXTENDED_DEBUG - - "headers \"%V\", preread \"%V\", " - -#endif - - "at char '%c' (%d), " - "near \"%V <-- HERE %V\", marked by \" <-- HERE \").\n", - (off_t) (pe - pos), (off_t) (p - pos), - ctx->chunks_total_size, ctx->chunks_count, - ctx->chunk_size, ctx->chunk_bytes_read, - ctx->chunks_written_size, - (off_t) ctx->raw_body_size, caller_info, - (int) r->plain_http, - -#if (NGX_HTTP_SSL) - - r->connection->ssl ? 1 : 0, - -#endif - - (int) r->keepalive, err_ctx, - ctx->count, &user_agent, - -#if EXTENDED_DEBUG - - &headers_buf, &preread_buf, - -#endif - - *p, *p, - &pre, &post); - - return NGX_ERROR; - } - - return NGX_AGAIN; -} - diff --git a/debian/modules/chunkin-nginx-module/src/chunked_parser.h b/debian/modules/chunkin-nginx-module/src/chunked_parser.h deleted file mode 100644 index 6f98c75..0000000 --- a/debian/modules/chunkin-nginx-module/src/chunked_parser.h +++ /dev/null @@ -1,14 +0,0 @@ -#ifndef CHUNKIN_CHUNKED_PARSER_H -#define CHUNKIN_CHUNKED_PARSER_H - -#include "ngx_http_chunkin_filter_module.h" - -ngx_int_t ngx_http_chunkin_init_chunked_parser(ngx_http_request_t *r, - ngx_http_chunkin_ctx_t *ctx); - -ngx_int_t ngx_http_chunkin_run_chunked_parser(ngx_http_request_t *r, - ngx_http_chunkin_ctx_t *ctx, u_char **pos_addr, u_char *last, - char *caller_info); - -#endif /* CHUNKIN_CHUNKED_PARSER_H */ - diff --git a/debian/modules/chunkin-nginx-module/src/chunked_parser.rl b/debian/modules/chunkin-nginx-module/src/chunked_parser.rl deleted file mode 100644 index c41e10f..0000000 --- a/debian/modules/chunkin-nginx-module/src/chunked_parser.rl +++ /dev/null @@ -1,350 +0,0 @@ -/* Copyright (C) agentzh */ - -#ifndef DDEBUG -#define DDEBUG 0 -#endif - -#include "ddebug.h" - -#include "chunked_parser.h" -#include "ngx_http_chunkin_util.h" - -#define ngx_chunkin_min(x, y) ((x) < (y) ? (x) : (y)) - -enum { - PRE_TEXT_LEN = 25, - POST_TEXT_LEN = 25 -}; - -%% machine chunked; -%% write data; - - -ngx_int_t -ngx_http_chunkin_init_chunked_parser(ngx_http_request_t *r, - ngx_http_chunkin_ctx_t *ctx) -{ - int cs; - - %% write init; - - ctx->chunks = NULL; - ctx->next_chunk = NULL; - ctx->chunk = NULL; - ctx->chunk_size = 0; - ctx->chunk_size_order = 0; - ctx->chunk_bytes_read = 0; - - ctx->chunks_total_size = 0; - - ctx->parser_state = cs; - - return NGX_OK; -} - - -ngx_int_t -ngx_http_chunkin_run_chunked_parser(ngx_http_request_t *r, - ngx_http_chunkin_ctx_t *ctx, u_char **pos_addr, u_char *last, char *caller_info) -{ - int cs = ctx->parser_state; - ngx_connection_t *c = r->connection; - signed char *pos = (signed char *) *pos_addr; - signed char *p = (signed char *) *pos_addr; - signed char *pe = (signed char *) last; - signed char *eof = NULL; - ngx_buf_t *b; - ngx_flag_t done = 0; - ngx_str_t pre, post; - char* err_ctx = ""; - ngx_str_t user_agent = ngx_null_string; - ssize_t rest; - - %%{ - #alphtype unsigned char; - - action finalize { - done = 1; - } - - action test_len { - ctx->chunk_bytes_read < ctx->chunk_size - } - - action read_data_byte { - /* optimization for buffered chunk data */ - - rest = ngx_chunkin_min( - (ssize_t)ctx->chunk_size - (ssize_t)ctx->chunk_bytes_read, - (ssize_t)(pe - p)); - - dd("moving %d, chunk size %d, read %d, rest %d", - (int)rest, - (int)ctx->chunk_size, - (int)ctx->chunk_bytes_read, - (int)rest); - - ctx->chunk_bytes_read += rest; - p += rest - 1; - ctx->chunk->buf->last = (u_char *)p + 1; - ctx->chunks_total_size += rest; - - /* dd("bytes read: %d (char '%c', bytes read %d, chunk size %d)", ctx->chunk->buf->last - ctx->chunk->buf->pos, *p, ctx->chunk_bytes_read, ctx->chunk_size); */ - ngx_log_debug2(NGX_LOG_DEBUG_HTTP, c->log, 0, - "chunkin: data bytes read: %uz (char: \"%c\")\n", - ctx->chunk_bytes_read, *p); - } - - action start_reading_size { - ctx->chunk_bytes_read = 0; - ctx->chunk_size = 0; - ctx->chunk_size_order = 0; - } - - action read_size { - ctx->chunk_size <<= 4; - ctx->chunk_size_order++; - if (*p >= 'A' && *p <= 'F') { - ctx->chunk_size |= 10 + *p - 'A'; - } else if (*p >= 'a' && *p <= 'f') { - ctx->chunk_size |= 10 + *p - 'a'; - } else { - ctx->chunk_size |= *p - '0'; - } - - ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0, - "chunkin: chunk size: %uz\n", ctx->chunk_size); - } - - action start_reading_data { - ctx->chunk = ngx_http_chunkin_get_buf(r->pool, ctx); - - ctx->chunks_count++; - - if (ctx->chunks) { - *ctx->next_chunk = ctx->chunk; - } else { - ctx->chunks = ctx->chunk; - } - - ctx->next_chunk = &ctx->chunk->next; - - b = ctx->chunk->buf; - - b->last = b->pos = (u_char *) p; - b->memory = 1; - } - - action verify_data { - if (ctx->chunk_bytes_read != ctx->chunk_size) { - ngx_log_error(NGX_LOG_ERR, c->log, 0, - "ERROR: chunk size not met: " - "%uz != %uz\n", ctx->chunk_bytes_read, - ctx->chunk_size); - *pos_addr = (u_char*) p; - ctx->parser_state = chunked_error; - return NGX_ERROR; - } - - if (ctx->chunk_size == 0) { - /* remove the current chunk */ - ctx->chunk->next = ctx->free_bufs; - ctx->free_bufs = ctx->chunk; - ctx->chunk = ctx->last_complete_chunk; - if (ctx->last_complete_chunk) { - ctx->last_complete_chunk->next = NULL; - } else { - ctx->chunks = NULL; - } - } else { - ctx->last_complete_chunk = ctx->chunk; - } - } - - CR = "\r"; - - LF = "\n"; - - CRLF = CR LF $err{ err_ctx = "CRLF"; }; - - chunk_size = (xdigit+ - "0"+) >start_reading_size $read_size; - - chunk_data_octet = any when test_len; - - chunk_data = (chunk_data_octet+) - >start_reading_data - $read_data_byte - $err{ err_ctx = "chunk_data"; } - ; - - chunk_data_terminator = CR when ! test_len LF - $err{ err_ctx = "chunk_data_terminator"; } - ; - - SP = ' '; - HT = '\t'; - - LWS = CRLF ? ( SP | HT )+; - - separator = "(" | ")" | "<" | ">" | "@" - | "," | ";" | ":" | "\\" | ["] - | "/" | "[" | "]" | "?" | "=" - | "{" | "}" | SP | HT - ; - - CTL = 0..31 | 127; - - token = (any -- (CTL | separator))+; - - chunk_ext_name = token; - - TEXT = (any -- CTL) | LWS; - - qdtext = TEXT -- ["]; - - CHAR = 0..127; - - quoted_pair = "\\" CHAR; - - quoted_string = ["] ( qdtext | quoted_pair )* ["]; - - chunk_ext_val = token | quoted_string; - - chunk_extension = ( ";" LWS* chunk_ext_name LWS* - ("=" LWS* chunk_ext_val LWS*) ? )* - ; - - chunk = chunk_size (LWS* -- CRLF) - $err{ err_ctx = "chunk_size"; } - (chunk_extension -- CRLF) ? - CRLF - $err{ err_ctx = "chunk_ext"; } - chunk_data chunk_data_terminator - @verify_data; - - last_chunk = "0"+ (LWS* -- CRLF) - (chunk_extension -- CRLF) ? - CRLF $err{ err_ctx = "last_chunk"; } - ; - - parser = chunk* last_chunk CRLF - $err{ err_ctx = "parser"; } - ; - - main := parser @finalize; - - }%% - - %% write exec; - - ctx->parser_state = cs; - - *pos_addr = (u_char *) p; - - if (p != pe) { - dd("ASSERTION FAILED: p != pe"); - } - - if (done) { - return NGX_OK; - } - - if (cs == chunked_error) { - -#if EXTENDED_DEBUG - - ngx_str_t headers_buf, preread_buf; - -#endif - - for (post.data = (u_char *) p, post.len = 0; - post.data + post.len != (u_char *) pe; post.len++) - { - if (post.len >= POST_TEXT_LEN) { - break; - } - } - - for (pre.data = (u_char *) p, pre.len = 0; - pre.data != (u_char *) pos; pre.data--, pre.len++) - { - if (pre.len >= PRE_TEXT_LEN) { - break; - } - } - - if (r->headers_in.user_agent) { - user_agent = r->headers_in.user_agent->value; - } - -#if EXTENDED_DEBUG - - headers_buf.data = r->header_in->start; - headers_buf.len = ctx->saved_header_in_pos - r->header_in->start; - - if (strcmp(caller_info, "preread") == 0) { - preread_buf.data = (u_char *) pos; - preread_buf.len = pe - pos; - - } else { - preread_buf.data = ctx->saved_header_in_pos; - preread_buf.len = r->header_in->pos - ctx->saved_header_in_pos; - } - -#endif - - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "bad chunked body (buf size %O, buf offset %O, " - "total decoded %uz, chunks count %d, " - "chunk size %uz, chunk data read %uz, " - "total to disk %uz, " - "raw body size %O, caller \"%s\", " - "plain_http %d, " - -#if (NGX_HTTP_SSL) - - "ssl %d, " -#endif - - "keepalive %d, err ctx \"%s\", " - "ctx ref count %ud, user agent \"%V\", " - -#if EXTENDED_DEBUG - - "headers \"%V\", preread \"%V\", " - -#endif - - "at char '%c' (%d), " - "near \"%V <-- HERE %V\", marked by \" <-- HERE \").\n", - (off_t) (pe - pos), (off_t) (p - pos), - ctx->chunks_total_size, ctx->chunks_count, - ctx->chunk_size, ctx->chunk_bytes_read, - ctx->chunks_written_size, - (off_t) ctx->raw_body_size, caller_info, - (int) r->plain_http, - -#if (NGX_HTTP_SSL) - - r->connection->ssl ? 1 : 0, - -#endif - - (int) r->keepalive, err_ctx, - ctx->count, &user_agent, - -#if EXTENDED_DEBUG - - &headers_buf, &preread_buf, - -#endif - - *p, *p, - &pre, &post); - - return NGX_ERROR; - } - - return NGX_AGAIN; -} - diff --git a/debian/modules/chunkin-nginx-module/src/ngx_http_chunkin_filter_module.c b/debian/modules/chunkin-nginx-module/src/ngx_http_chunkin_filter_module.c deleted file mode 100644 index 148f944..0000000 --- a/debian/modules/chunkin-nginx-module/src/ngx_http_chunkin_filter_module.c +++ /dev/null @@ -1,363 +0,0 @@ -/* Copyright (C) agentzh */ - -#define DDEBUG 0 -#include "ddebug.h" - -#include - -#include "ngx_http_chunkin_util.h" -#include "ngx_http_chunkin_filter_module.h" -#include "ngx_http_chunkin_request_body.h" - -enum { - DEFAULT_MAX_CHUNKS_PER_BUF = 512 -}; - -static ngx_int_t ngx_http_chunkin_resume_handler(ngx_http_request_t *r); - -static char* ngx_http_chunkin_resume(ngx_conf_t *cf, ngx_command_t *cmd, - void *conf); - -static void *ngx_http_chunkin_create_conf(ngx_conf_t *cf); -static char *ngx_http_chunkin_merge_conf(ngx_conf_t *cf, void *parent, - void *child); - -static ngx_int_t ngx_http_chunkin_handler(ngx_http_request_t *r); - -static ngx_int_t ngx_http_chunkin_init(ngx_conf_t *cf); - -static void ngx_http_chunkin_post_read(ngx_http_request_t *r); - - -static ngx_command_t ngx_http_chunkin_commands[] = { - - { ngx_string("chunkin"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_FLAG, - ngx_conf_set_flag_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_chunkin_conf_t, enabled), - NULL }, - - { ngx_string("chunkin_max_chunks_per_buf"), - 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_chunkin_conf_t, max_chunks_per_buf), - NULL }, - - { ngx_string("chunkin_resume"), - NGX_HTTP_LOC_CONF|NGX_CONF_NOARGS, - ngx_http_chunkin_resume, - NGX_HTTP_LOC_CONF_OFFSET, - 0, - NULL }, - - { ngx_string("chunkin_keepalive"), - NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF - |NGX_HTTP_LIF_CONF|NGX_CONF_FLAG, - ngx_conf_set_flag_slot, - NGX_HTTP_LOC_CONF_OFFSET, - offsetof(ngx_http_chunkin_conf_t, keepalive), - NULL }, - - ngx_null_command -}; - - -static ngx_http_module_t ngx_http_chunkin_filter_module_ctx = { - NULL, /* preconfiguration */ - ngx_http_chunkin_init, /* postconfiguration */ - - NULL, /* create main configuration */ - NULL, /* init main configuration */ - - NULL, /* create server configuration */ - NULL, /* merge server configuration */ - - ngx_http_chunkin_create_conf, /* create location configuration */ - ngx_http_chunkin_merge_conf /* merge location configuration */ -}; - - -ngx_module_t ngx_http_chunkin_filter_module = { - NGX_MODULE_V1, - &ngx_http_chunkin_filter_module_ctx, /* module context */ - ngx_http_chunkin_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 void * -ngx_http_chunkin_create_conf(ngx_conf_t *cf) -{ - ngx_http_chunkin_conf_t *conf; - - conf = ngx_palloc(cf->pool, sizeof(ngx_http_chunkin_conf_t)); - if (conf == NULL) { - return NULL; - } - - conf->enabled = NGX_CONF_UNSET; - conf->keepalive = NGX_CONF_UNSET; - conf->max_chunks_per_buf = NGX_CONF_UNSET_UINT; - - return conf; -} - - -static char * -ngx_http_chunkin_merge_conf(ngx_conf_t *cf, void *parent, void *child) -{ - ngx_http_chunkin_conf_t *prev = parent; - ngx_http_chunkin_conf_t *conf = child; - - ngx_conf_merge_value(conf->enabled, prev->enabled, 0); - ngx_conf_merge_value(conf->keepalive, prev->keepalive, 0); - ngx_conf_merge_uint_value(conf->max_chunks_per_buf, - prev->max_chunks_per_buf, - DEFAULT_MAX_CHUNKS_PER_BUF); - - return NGX_CONF_OK; -} - - -static ngx_flag_t -ngx_http_chunkin_is_chunked_encoding(ngx_http_request_t *r) -{ - dd("is chunked encoding..."); - - return r->headers_in.transfer_encoding && - r->headers_in.transfer_encoding->value.len >= 7 && - ngx_strcasestrn(r->headers_in.transfer_encoding->value.data, - "chunked", 7 - 1); -} - - -static ngx_int_t -ngx_http_chunkin_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_chunkin_handler; - - return NGX_OK; -} - - -static ngx_int_t -ngx_http_chunkin_handler(ngx_http_request_t *r) -{ - ngx_http_chunkin_ctx_t *ctx; - ngx_http_chunkin_conf_t *conf; - ngx_int_t rc; - - dd("entered chunkin handler..."); - - conf = ngx_http_get_module_loc_conf(r, ngx_http_chunkin_filter_module); - - if (!conf->enabled || r != r->main) { - dd("conf not enabled: %d", (int) conf->enabled); - - return NGX_DECLINED; - } - - ctx = ngx_http_get_module_ctx(r, ngx_http_chunkin_filter_module); - - if (ctx == NULL) { - dd("ctx not found"); - - return NGX_DECLINED; - } - - if (ctx->done) { - return NGX_DECLINED; - } - - if (ctx->waiting_more_body) { - return NGX_AGAIN; - } - - dd("reading chunked input eagerly..."); - - if (!conf->keepalive && r->keepalive) { - dd("dis-enabling r->keepalive..."); - r->keepalive = 0; - } - - dd_check_read_event_handler(r); - dd_check_write_event_handler(r); - - /* - rc = ngx_http_read_client_request_body(r, - ngx_http_chunkin_post_read); - */ - - ngx_http_chunkin_clear_transfer_encoding(r); - - r->header_in->pos = r->header_end + sizeof(CRLF) - 1; - - if (r->header_in->pos > r->header_in->last) { - ngx_log_error(NGX_LOG_INFO, r->connection->log, 0, - "chunkin: r->header_in->pos overflown"); - - return NGX_HTTP_INTERNAL_SERVER_ERROR; - } - - if (*(r->header_in->pos - 2) != CR || *(r->header_in->pos - 1) != LF) { - ngx_log_error(NGX_LOG_INFO, r->connection->log, 0, - "chunkin: r->header_in->pos not lead by CRLF"); - - return NGX_HTTP_INTERNAL_SERVER_ERROR; - } - - dd("chunkin handler: header_in->pos: %d", - (int)(r->header_in->pos - r->header_in->start)); - - rc = ngx_http_chunkin_read_chunked_request_body(r, - ngx_http_chunkin_post_read); - - if (rc >= NGX_HTTP_SPECIAL_RESPONSE) { - dd("read client request body returned special response %d", (int) rc); - return rc; - } - - dd("read client request body returned %d", (int) rc); - - if (rc == NGX_AGAIN) { - ctx->waiting_more_body = 1; - - return NGX_AGAIN; - } - - ctx->done = 1; - - return NGX_DECLINED; -} - - -static void -ngx_http_chunkin_post_read(ngx_http_request_t *r) -{ - ngx_http_chunkin_ctx_t *ctx; - - dd("post read"); - - dd_check_read_event_handler(r); - dd_check_write_event_handler(r); - - r->read_event_handler = ngx_http_block_reading; - - ctx = ngx_http_get_module_ctx(r, ngx_http_chunkin_filter_module); - - ctx->done = 1; - - if (ctx->waiting_more_body) { - ctx->waiting_more_body = 0; - ngx_http_core_run_phases(r); - } -} - - -static char* ngx_http_chunkin_resume(ngx_conf_t *cf, ngx_command_t *cmd, - void *conf) -{ - ngx_http_core_loc_conf_t *clcf; - - clcf = ngx_http_conf_get_module_loc_conf(cf, - ngx_http_core_module); - - clcf->handler = ngx_http_chunkin_resume_handler; - - return NGX_CONF_OK; -} - - -static ngx_int_t -ngx_http_chunkin_resume_handler(ngx_http_request_t *r) { - ngx_int_t rc; - ngx_http_chunkin_conf_t *conf; - ngx_http_chunkin_ctx_t *ctx; - - conf = ngx_http_get_module_loc_conf(r, ngx_http_chunkin_filter_module); - - dd("method: %.*s (%d)", (int) r->method_name.len, r->method_name.data, - (int) r->method); - - if (!conf->enabled || r != r->main - || (r->method != NGX_HTTP_PUT && r->method != NGX_HTTP_POST && - r->method != NGX_HTTP_DELETE)) - { - dd("conf not enabled or in subrequest or not POST nor PUT requests"); - - return NGX_HTTP_LENGTH_REQUIRED; - } - - if (r->method == NGX_HTTP_POST && - ! ngx_http_chunkin_is_chunked_encoding(r->main)) - { - dd("found POST request, but not chunked"); - return NGX_HTTP_LENGTH_REQUIRED; - } - - dd("chunked request test passed"); - - /* XXX just to fool the nginx core */ - r->headers_in.content_length_n = 1; - - ngx_http_chunkin_clear_transfer_encoding(r); - - ctx = ngx_http_get_module_ctx(r, ngx_http_chunkin_filter_module); - - if (ctx == NULL) { - ctx = ngx_pcalloc(r->pool, sizeof(ngx_http_chunkin_ctx_t)); - if (ctx == NULL) { - return NGX_ERROR; - } - - /* ctx->ignore_body is set to 0 */ - } - - r->discard_body = 0; - r->error_page = 0; - r->err_status = 0; - -#if 0 - r->method = NGX_HTTP_PUT; - r->headers_in.content_length = NULL; - r->headers_in.content_length_n = -1; -#endif - - rc = ngx_http_chunkin_process_request_header(r); - if (rc != NGX_OK) { - return rc; - } - -#if 0 - r->plain_http = 1; -#endif - - rc = ngx_http_chunkin_process_request(r); - if (rc != NGX_OK) { - return rc; - } - - return ngx_http_chunkin_internal_redirect(r, &r->main->uri, &r->main->args, - ctx); -} - diff --git a/debian/modules/chunkin-nginx-module/src/ngx_http_chunkin_filter_module.h b/debian/modules/chunkin-nginx-module/src/ngx_http_chunkin_filter_module.h deleted file mode 100644 index 8cb67e1..0000000 --- a/debian/modules/chunkin-nginx-module/src/ngx_http_chunkin_filter_module.h +++ /dev/null @@ -1,53 +0,0 @@ -#ifndef NGX_HTTP_CHUNKIN_FILTER_MODULE_H -#define NGX_HTTP_CHUNKIN_FILTER_MODULE_H - -#include -#include -#include - -typedef struct { - ngx_flag_t enabled; - ngx_flag_t keepalive; - ngx_uint_t max_chunks_per_buf; - -} ngx_http_chunkin_conf_t; - - -typedef struct { - ngx_flag_t ignore_body /* for output filters only */; - int parser_state; /* current state */ - - size_t chunk_bytes_read; - size_t chunk_size; - int chunk_size_order; - - size_t chunks_total_size; - size_t chunks_written_size; - ngx_uint_t chunks_count; - - off_t raw_body_size; - - ngx_chain_t *chunks; - ngx_chain_t **next_chunk; - ngx_chain_t *chunk; - - ngx_flag_t just_after_preread; - - ngx_chain_t *free_bufs; - ngx_chain_t *last_complete_chunk; - - u_char *saved_header_in_pos; - - ngx_uint_t count; - ngx_flag_t r_discard_body:1; - - ngx_flag_t done:1; - ngx_flag_t waiting_more_body:1; - -} ngx_http_chunkin_ctx_t; - - -extern ngx_module_t ngx_http_chunkin_filter_module; - -#endif /* NGX_HTTP_CHUNKIN_FILTER_MODULE_H */ - diff --git a/debian/modules/chunkin-nginx-module/src/ngx_http_chunkin_request_body.c b/debian/modules/chunkin-nginx-module/src/ngx_http_chunkin_request_body.c deleted file mode 100644 index e341fcd..0000000 --- a/debian/modules/chunkin-nginx-module/src/ngx_http_chunkin_request_body.c +++ /dev/null @@ -1,728 +0,0 @@ -/* Copyright (C) agentzh */ - -#define DDEBUG 0 - -#include "ddebug.h" - -#include "ngx_http_chunkin_util.h" -#include "chunked_parser.h" -#include "ngx_http_chunkin_filter_module.h" -#include "ngx_http_chunkin_request_body.h" - -enum { - MAX_CHUNKS_PER_DISK_WRITE = 512 -}; - -static ngx_int_t ngx_http_test_expect(ngx_http_request_t *r); - -static void ngx_http_chunkin_read_chunked_request_body_handler( - ngx_http_request_t *r); - -static ngx_int_t ngx_http_chunkin_do_read_chunked_request_body( - ngx_http_request_t *r); - -static ngx_int_t ngx_http_write_request_body(ngx_http_request_t *r, - ngx_chain_t *body, int chain_count); - - -/* this function's implementation is borrowed from nginx 0.8.20 - * and modified a lot to work with the chunked encoding. - * copyrighted (C) by Igor Sysoev */ -ngx_int_t -ngx_http_chunkin_read_chunked_request_body(ngx_http_request_t *r, - ngx_http_client_body_handler_pt post_handler) -{ - size_t preread; - size_t size; - ngx_http_request_body_t *rb; - ngx_http_core_loc_conf_t *clcf; - ngx_http_chunkin_ctx_t *ctx; - ngx_int_t rc; - - /* r->request_body_in_single_buf = 1; */ - /* r->request_body_in_file_only = 1; */ - - if (r->request_body || r->discard_body) { - post_handler(r); - return NGX_OK; - } - - if (ngx_http_test_expect(r) != NGX_OK) { - return NGX_HTTP_INTERNAL_SERVER_ERROR; - } - - rb = ngx_pcalloc(r->pool, sizeof(ngx_http_request_body_t)); - if (rb == NULL) { - return NGX_HTTP_INTERNAL_SERVER_ERROR; - } - - r->request_body = rb; - - clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module); - - rb->post_handler = post_handler; - - ctx = ngx_http_get_module_ctx(r, ngx_http_chunkin_filter_module); - if (ctx == NULL) { - return NGX_HTTP_INTERNAL_SERVER_ERROR; - } - - ctx->count++; - - ctx->saved_header_in_pos = r->header_in->pos; - - preread = r->header_in->last - r->header_in->pos; - - ngx_http_chunkin_init_chunked_parser(r, ctx); - - if (preread) { - ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "chunkin: http chunked client request body preread %uz", - preread); - - dd("raw chunked body %.*s", preread, r->header_in->pos); - - rc = ngx_http_chunkin_run_chunked_parser(r, ctx, - &r->header_in->pos, r->header_in->last, "preread"); - - if (rc >= NGX_HTTP_SPECIAL_RESPONSE) { - return rc; - } - - if (rc == NGX_ERROR) { - /* chunked body parsefail */ - return NGX_HTTP_BAD_REQUEST; - } - - if (rc == NGX_OK) { - /* TODO: take r->request_body_in_file_only - * into account */ - - dd("we have the whole chunked body in 'prepread'..."); - - dd("keepalive? %s", r->keepalive ? "yes" : "no"); - - dd("chunks total size: %d", ctx->chunks_total_size); - - rc = ngx_http_chunkin_set_content_length_header(r, - ctx->chunks_total_size); - - if (rc >= NGX_HTTP_SPECIAL_RESPONSE) { - return rc; - } - - rb->bufs = ctx->chunks; - if (rb->bufs) { - rb->buf = ctx->chunks->buf; - } - - dd("buf len: %d", rb->buf->last - rb->buf->pos); - - dd("buf left (len %d): %s", - (int) (r->header_in->last - r->header_in->pos), - r->header_in->pos); - - /* r->header_in->pos = r->header_in->last; */ - - r->request_length += r->header_in->pos - - ctx->saved_header_in_pos; - - ctx->raw_body_size += r->header_in->pos - - ctx->saved_header_in_pos; - - post_handler(r); - - return NGX_OK; - } - - if (rc != NGX_AGAIN) { - /* this is impossible to reach... */ - return NGX_HTTP_INTERNAL_SERVER_ERROR; - } - - size = r->header_in->last - r->header_in->pos; - if (size) { - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "chunkin: internal assertion failed: %O bytes " - "left in the r->header_in buffer but " - "the parser returns NGX_AGAIN", - (off_t) size); - - return NGX_HTTP_INTERNAL_SERVER_ERROR; - } - - dd("we need to read more chunked body in addition to 'prepread'..."); - - ctx->just_after_preread = 1; - - /* r->header_in->pos = r->header_in->last; */ - - r->request_length += preread; - - ctx->raw_body_size += preread; - } - - size = clcf->client_body_buffer_size; - if (ctx->chunks_total_size > size) { - size = ctx->chunks_total_size; - } - - dd("chunks total size after preread: %d, buf size: %d", - (int)ctx->chunks_total_size, (int)size); - - rb->buf = ngx_create_temp_buf(r->pool, size); - -#if 0 - /* XXX just for debugging... */ - ngx_memzero(rb->buf->start, rb->buf->end - rb->buf->start); -#endif - - if (rb->buf == NULL) { - return NGX_HTTP_INTERNAL_SERVER_ERROR; - } - - r->read_event_handler = ngx_http_chunkin_read_chunked_request_body_handler; - - rc = ngx_http_chunkin_do_read_chunked_request_body(r); - - return rc; -} - - -/* mostly a clone of the ngx_http_read_client_request_body_handler - * function in ngx_http_request_body.c of nginx 0.8.20. - * copyrighted by Igor Sysoev. */ -static void -ngx_http_chunkin_read_chunked_request_body_handler(ngx_http_request_t *r) -{ - ngx_int_t rc; - - if (r->connection->read->timedout) { - r->connection->timedout = 1; - - (void) ngx_http_discard_request_body(r); - - ngx_http_finalize_request(r, NGX_HTTP_REQUEST_TIME_OUT); - return; - } - - rc = ngx_http_chunkin_do_read_chunked_request_body(r); - - if (rc >= NGX_HTTP_SPECIAL_RESPONSE) { - ngx_http_finalize_request(r, rc); - } -} - - -/* mostly based on the ngx_http_do_read_client_request_body - * function in ngx_http_request_body.c of nginx 0.8.20. - * copyrighted by Igor Sysoev. */ -static ngx_int_t -ngx_http_chunkin_do_read_chunked_request_body(ngx_http_request_t *r) -{ - ngx_int_t rc; - size_t size; - ssize_t n; - ngx_buf_t *b; - ngx_connection_t *c; - ngx_http_request_body_t *rb; - ngx_http_core_loc_conf_t *clcf; - ngx_http_chunkin_ctx_t *ctx; - ngx_flag_t done; - ngx_chain_t *cl, *pending_chunk; - u_char *p; - ngx_http_chunkin_conf_t *conf; - - c = r->connection; - rb = r->request_body; - ctx = ngx_http_get_module_ctx(r, ngx_http_chunkin_filter_module); - - ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0, - "chunkin: http chunkin read chunked client request body"); - - done = 0; - - clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module); - - if (ctx->just_after_preread) { - ctx->just_after_preread = 0; - - dd("Just after preread and ctx->chunks defined (bytes read: %d, " - "chunk size: %d, last chars %c %c %c)", ctx->chunk_bytes_read, - ctx->chunk_size, *(r->header_in->pos - 2), - *(r->header_in->pos - 1), *r->header_in->pos); - - for (cl = ctx->chunks; cl; cl = cl->next) { - b = cl->buf; - - dd("before ngx_copy..."); - p = rb->buf->last; - rb->buf->last = ngx_copy(rb->buf->last, b->pos, b->last - b->pos); - dd("after ngx_copy..."); - - b->pos = p; - b->last = rb->buf->last; - } - } - - conf = ngx_http_get_module_loc_conf(r, ngx_http_chunkin_filter_module); - - for ( ;; ) { - for ( ;; ) { - /* - dd("client_max_body_size: %d, raw_body_size: %d", - (int)clcf->client_max_body_size, - (int)ctx->raw_body_size); - */ - - if (clcf->client_max_body_size - && clcf->client_max_body_size < ctx->raw_body_size) - { - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "chunkin: client intended to send too large body: " - "%O bytes", (off_t) ctx->raw_body_size); - - return NGX_HTTP_REQUEST_ENTITY_TOO_LARGE; - } - - /* dd("rb->buf pos: %d", (int) (rb->buf->last - rb->buf->pos)); */ - - if (rb->buf->last == rb->buf->end - || ctx->chunks_count > conf->max_chunks_per_buf) - { - if (ctx->chunks_count > conf->max_chunks_per_buf) { - dd("too many chounks already: %d (max %d, buf last %c)", - (int) ctx->chunks_count, - (int) conf->max_chunks_per_buf, - *(rb->buf->last - 2)); - } - - if (ctx->chunks == NULL - || (ctx->chunks_total_size - && ctx->chunks_total_size <= - ctx->chunks_written_size)) - { - ngx_log_error(NGX_LOG_WARN, c->log, 0, - "chunkin: the chunkin_max_chunks_per_buf or " - "max_client_body_size setting seems rather small " - "(chunks %snull, total decoded %d, " - "total written %d)", - (u_char *) (ctx->chunks ? "not " : ""), - (int) ctx->chunks_total_size, - (int) ctx->chunks_written_size); - - } else { - dd("save exceeding part to disk (%d bytes), buf size: %d, " - "chunks count: %d", - ctx->chunks_total_size - ctx->chunks_written_size, - rb->buf->end - rb->buf->start, - ctx->chunks_count); - - rc = ngx_http_write_request_body(r, ctx->chunks, - ctx->chunks_count); - - if (rc != NGX_OK) { - return NGX_HTTP_INTERNAL_SERVER_ERROR; - } - } - - if (ctx->last_complete_chunk) { - pending_chunk = ctx->last_complete_chunk->next; - /* add ctx->chunks ~ ctx->last_complete_chunk - * into ctx->free_bufs */ - ctx->last_complete_chunk->next = ctx->free_bufs; - ctx->free_bufs = ctx->chunks; - ctx->last_complete_chunk = NULL; - } else { - pending_chunk = ctx->chunks; - } - - if (pending_chunk) { - ctx->next_chunk = &pending_chunk->next; - ctx->chunks = pending_chunk; - ctx->chunk = pending_chunk; - - ctx->chunk->buf->pos = rb->buf->start; - ctx->chunk->buf->last = rb->buf->start; - ctx->chunks_count = 1; - - ctx->chunks_written_size = ctx->chunks_total_size - - ngx_buf_size(pending_chunk->buf); - } else { - ctx->next_chunk = NULL; - - ctx->chunks = NULL; - ctx->chunk = NULL; - - ctx->chunks_count = 0; - - ctx->chunks_written_size = ctx->chunks_total_size; - } - - dd("reset rb->buf"); - - rb->buf->last = rb->buf->start; - -#if 0 - /* XXX just for debugging... */ - ngx_memzero(rb->buf->start, rb->buf->end - rb->buf->start); -#endif - } - - size = rb->buf->end - rb->buf->last; - - n = c->recv(c, rb->buf->last, size); - ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0, - "chunkin: http chunked client request body recv %z", - n); - - if (n == NGX_AGAIN) { - dd("NGX_AGAIN caught"); - break; - } - - if (n == 0) { - ngx_log_error(NGX_LOG_INFO, c->log, 0, - "chunkin: client closed prematurely connection"); - } - - if (n == 0 || n == NGX_ERROR) { - c->error = 1; - return NGX_HTTP_BAD_REQUEST; - } - - /* save the original pos */ - p = rb->buf->last; - - rc = ngx_http_chunkin_run_chunked_parser(r, ctx, - &rb->buf->last, rb->buf->last + n, "main handler"); - - if (rc >= NGX_HTTP_SPECIAL_RESPONSE) { - return rc; - } - - if (rc == NGX_ERROR) { - /* chunked body parsefail */ - return NGX_HTTP_BAD_REQUEST; - } - - /* rb->buf->last += n; */ - - r->request_length += n; - - ctx->raw_body_size += n; - - if (rc == NGX_OK) { - dd("successfully done the parsing"); - - dd("keepalive? %s", r->keepalive ? "yes" : "no"); - - if (r->keepalive) { - dd("cleaning the buffers for pipelined reqeusts (if any)"); - size = p + n - rb->buf->last; - if (size) { - dd("found remaining data for pipelined requests"); - if (size > (size_t) (r->header_in->end - - ctx->saved_header_in_pos)) - { - /* XXX enlarge the r->header_in buffer... */ - r->keepalive = 0; - } else { - r->header_in->pos = ctx->saved_header_in_pos; - r->header_in->last = ngx_copy(r->header_in->pos, - rb->buf->last, size); - - } - } - } - - done = 1; - break; - } - - /* rc == NGX_AGAIN */ - - if (rb->buf->last < rb->buf->end) { - break; - } - } - - if (done) { - break; - } - - if (!c->read->ready) { - ngx_add_timer(c->read, clcf->client_body_timeout); - - if (ngx_handle_read_event(c->read, 0) != NGX_OK) { - return NGX_HTTP_INTERNAL_SERVER_ERROR; - } - - return NGX_AGAIN; - } - } - - if (!done) { - return NGX_HTTP_BAD_REQUEST; - } - - if (c->read->timer_set) { - ngx_del_timer(c->read); - } - - if (rb->temp_file || r->request_body_in_file_only) { - size = ctx->chunks_total_size - ctx->chunks_written_size; - dd("save the last part to disk...(%d bytes left)", size); - if (size == 0) { - ctx->chunks = NULL; - } - -#if 0 - n = 0; - for (cl = ctx->chunks; cl != NULL; cl = cl->next) { - /* dd("chunks %d found buf %c", n, *cl->buf->start); */ - n++; - } -#endif - - dd("for total %d chunks found", n); - - /* save the last part */ - rc = ngx_http_write_request_body(r, ctx->chunks, ctx->chunks_count); - if (rc != NGX_OK) { - return NGX_HTTP_INTERNAL_SERVER_ERROR; - } - - b = ngx_calloc_buf(r->pool); - if (b == NULL) { - return NGX_HTTP_INTERNAL_SERVER_ERROR; - } - - b->in_file = 1; - b->file_pos = 0; - b->file_last = rb->temp_file->file.offset; - b->file = &rb->temp_file->file; - - rb->bufs = ngx_http_chunkin_get_buf(r->pool, ctx); - - if (rb->bufs == NULL) { - return NGX_HTTP_INTERNAL_SERVER_ERROR; - } - - rb->bufs->buf = b; - - } else if ( r->request_body_in_single_buf ) { - dd("request body in single buf"); - - /* XXX we may not have to allocate a big buffer here */ - - size = 0; - for (cl = ctx->chunks; cl != NULL; cl = cl->next) { - size += ngx_buf_size(cl->buf); - } - - rb->buf = ngx_create_temp_buf(r->pool, size); - - if (rb->buf == NULL) { - return NGX_HTTP_INTERNAL_SERVER_ERROR; - } - - for (cl = ctx->chunks; cl != NULL; cl = cl->next) { - size = ngx_buf_size(cl->buf); - - dd("copy buf ...(size %d)", size); - - rb->buf->last = - ngx_cpymem(rb->buf->last, cl->buf->pos, size); - } - - rb->bufs = ngx_http_chunkin_get_buf(r->pool, ctx); - - if (rb->bufs == NULL) { - return NGX_HTTP_INTERNAL_SERVER_ERROR; - } - - rb->bufs->buf = rb->buf; - - } else { - rb->bufs = ctx->chunks; - } - -#if 0 - if (rb->bufs) { - int i; - for (i = 0, cl = rb->bufs; cl; cl = cl->next, i++) { - if (cl->buf->memory && cl->buf->pos == cl->buf->last) { - dd("Found zero size buf in chain pos %d", i); - } - } - } -#endif - - dd("last minute, chunks count: %d, chunks_total_size: %d", - ctx->chunks_count, ctx->chunks_total_size); - -#if 0 - size = 0; - for (cl = rb->bufs; cl; cl = cl->next) { - size += ngx_buf_size(cl->buf); - } - dd("data size: %d", size); -#endif - - rc = ngx_http_chunkin_set_content_length_header(r, ctx->chunks_total_size); - - if (rc >= NGX_HTTP_SPECIAL_RESPONSE) { - return rc; - } - - rb->post_handler(r); - - return NGX_OK; -} - - -/* mostly an exact clone of the ngx_http_test_expect - * function in ngx_http_request_body.c of nginx 0.8.20. - * copyrighted by Igor Sysoev. */ -static ngx_int_t -ngx_http_test_expect(ngx_http_request_t *r) -{ - ngx_int_t n; - ngx_str_t *expect; - - if (r->expect_tested - || r->headers_in.expect == NULL - || r->http_version < NGX_HTTP_VERSION_11) - { - return NGX_OK; - } - - r->expect_tested = 1; - - expect = &r->headers_in.expect->value; - - if (expect->len != sizeof("100-continue") - 1 - || ngx_strncasecmp(expect->data, (u_char *) "100-continue", - sizeof("100-continue") - 1) - != 0) - { - return NGX_OK; - } - - ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "send 100 Continue"); - - n = r->connection->send(r->connection, - (u_char *) "HTTP/1.1 100 Continue" CRLF CRLF, - sizeof("HTTP/1.1 100 Continue" CRLF CRLF) - 1); - - if (n == sizeof("HTTP/1.1 100 Continue" CRLF CRLF) - 1) { - return NGX_OK; - } - - /* we assume that such small packet should be send successfully */ - - return NGX_ERROR; -} - - -/* mostly an exact clone of the ngx_http_write_request_body - * function in ngx_http_request_body.c of nginx 0.8.20. - * copyrighted by Igor Sysoev. */ -static ngx_int_t -ngx_http_write_request_body(ngx_http_request_t *r, ngx_chain_t *body, - int chain_count) -{ - ssize_t n; - ngx_temp_file_t *tf; - ngx_http_request_body_t *rb; - ngx_http_core_loc_conf_t *clcf; - int i; - ngx_chain_t *cl, *saved_next; - - rb = r->request_body; - - if (rb->temp_file == NULL) { - tf = ngx_pcalloc(r->pool, sizeof(ngx_temp_file_t)); - if (tf == NULL) { - return NGX_ERROR; - } - - clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module); - - tf->file.fd = NGX_INVALID_FILE; - tf->file.log = r->connection->log; - tf->path = clcf->client_body_temp_path; - tf->pool = r->pool; - - if (rb->buf && rb->buf->last == rb->buf->end) { - tf->warn = "a client request body is buffered to a temporary file " - "(exceeding client_body_buffer_size)"; - } else { - tf->warn = "a client request body is buffered to a temporary file " - "(exceeding chunkin_max_chunks_per_buf)"; - } - - tf->log_level = r->request_body_file_log_level; - tf->persistent = r->request_body_in_persistent_file; - tf->clean = r->request_body_in_clean_file; - - if (r->request_body_file_group_access) { - tf->access = 0660; - } - - rb->temp_file = tf; - } - - if (body == NULL) { - return NGX_OK; - } - - /* we need this hack to work around a bug in - * ngx_write_chain_to_temp_file when the chain - * link is longer than 1024, we'll receive - * random alert like this: - * [alert] 13493#0: *1 pread() read only 1024 - * of 3603 from - * "/opt/nginx/client_body_temp/0000000001" */ - if (chain_count > MAX_CHUNKS_PER_DISK_WRITE) { - i = 0; - for (cl = body; cl; cl = cl->next) { - if (i >= MAX_CHUNKS_PER_DISK_WRITE) { - /* dd("wrote %d links first...", i+1); */ - - saved_next = cl->next; - cl->next = NULL; - n = ngx_write_chain_to_temp_file(rb->temp_file, body); - /* TODO: n == 0 or not complete and level event */ - - if (n == NGX_ERROR) { - return NGX_ERROR; - } - - rb->temp_file->offset += n; - - cl->next = saved_next; - body = cl->next; - i = 0; - } else { - i++; - } - } - } - - if (body) { - n = ngx_write_chain_to_temp_file(rb->temp_file, body); - /* TODO: n == 0 or not complete and level event */ - - if (n == NGX_ERROR) { - return NGX_ERROR; - } - - rb->temp_file->offset += n; - } - - return NGX_OK; -} - diff --git a/debian/modules/chunkin-nginx-module/src/ngx_http_chunkin_request_body.h b/debian/modules/chunkin-nginx-module/src/ngx_http_chunkin_request_body.h deleted file mode 100644 index 744bad1..0000000 --- a/debian/modules/chunkin-nginx-module/src/ngx_http_chunkin_request_body.h +++ /dev/null @@ -1,10 +0,0 @@ -#ifndef NGX_HTTP_CHUNKIN_REQUEST_BODY_H -#define NGX_HTTP_CHUNKIN_REQUEST_BODY_H - -#include - -ngx_int_t ngx_http_chunkin_read_chunked_request_body(ngx_http_request_t *r, - ngx_http_client_body_handler_pt post_handler); - -#endif /* NGX_HTTP_CHUNKIN_REQUEST_BODY_H */ - diff --git a/debian/modules/chunkin-nginx-module/src/ngx_http_chunkin_util.c b/debian/modules/chunkin-nginx-module/src/ngx_http_chunkin_util.c deleted file mode 100644 index 0098c8e..0000000 --- a/debian/modules/chunkin-nginx-module/src/ngx_http_chunkin_util.c +++ /dev/null @@ -1,550 +0,0 @@ -/* Copyright (C) agentzh */ - -#ifndef DDEBUG -#define DDEBUG 0 -#endif -#include "ddebug.h" - -#include "ngx_http_chunkin_util.h" - - -static ngx_int_t ngx_http_chunkin_rm_header(ngx_list_t *l, ngx_table_elt_t *h); -static ngx_int_t ngx_http_chunkin_rm_header_helper(ngx_list_t *l, - ngx_list_part_t *cur, ngx_uint_t i); - - -static ngx_str_t ngx_http_chunkin_content_length_header_key = - ngx_string("Content-Length"); - - -void -ngx_http_chunkin_clear_transfer_encoding(ngx_http_request_t *r) -{ - ngx_int_t rc; - - if (r->headers_in.transfer_encoding) { - rc = ngx_http_chunkin_rm_header(&r->headers_in.headers, - r->headers_in.transfer_encoding); - - if (rc == NGX_OK) { - r->headers_in.transfer_encoding = NULL; - } else { - /* not found */ - - r->headers_in.transfer_encoding->value.len = 0; - r->headers_in.transfer_encoding->value.data = (u_char *) ""; - r->headers_in.transfer_encoding->hash = 0; - r->headers_in.transfer_encoding = NULL; - } - } -} - - -ngx_int_t -ngx_http_chunkin_set_content_length_header(ngx_http_request_t *r, size_t len) { - ngx_table_elt_t *h; - ngx_list_part_t *part; - ngx_uint_t i; - - r->headers_in.content_length_n = len; - - part = &r->headers_in.headers.part; - h = part->elts; - - for (i = 0; /* void */; i++) { - - if (i >= part->nelts) { - if (part->next == NULL) { - break; - } - - part = part->next; - h = part->elts; - i = 0; - } - - /* - ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "header value [%V]", &h[i].value); - dd("header value (raw): [%s]", h[i].value.data); - */ - - if (h[i].key.len == ngx_http_chunkin_content_length_header_key.len - && ngx_strncasecmp(h[i].key.data, - ngx_http_chunkin_content_length_header_key.data, - h[i].key.len) == 0) - { - dd("Found existing content-length header."); - - h[i].value.data = ngx_palloc(r->pool, NGX_OFF_T_LEN); - - if (h[i].value.data == NULL) { - return NGX_HTTP_INTERNAL_SERVER_ERROR; - } - - h[i].value.len = ngx_sprintf(h[i].value.data, "%O", - r->headers_in.content_length_n) - h[i].value.data; - - return NGX_OK; - } - } - - h = ngx_list_push(&r->headers_in.headers); - - if (h == NULL) { - return NGX_HTTP_INTERNAL_SERVER_ERROR; - } - - h->hash = r->header_hash; - - h->key = ngx_http_chunkin_content_length_header_key; - - h->value.data = ngx_palloc(r->pool, NGX_OFF_T_LEN); - - if (h->value.data == NULL) { - return NGX_HTTP_INTERNAL_SERVER_ERROR; - } - - h->value.len = ngx_sprintf(h->value.data, "%O", - r->headers_in.content_length_n) - h->value.data; - - h->lowcase_key = ngx_pnalloc(r->pool, h->key.len); - if (h->lowcase_key == NULL) { - return NGX_HTTP_INTERNAL_SERVER_ERROR; - } - - ngx_strlow(h->lowcase_key, h->key.data, h->key.len); - - r->headers_in.content_length = h; - - return NGX_OK; -} - - -ngx_chain_t * -ngx_http_chunkin_get_buf(ngx_pool_t *pool, ngx_http_chunkin_ctx_t *ctx) -{ - ngx_chain_t *cl; - ngx_chain_t **ll; - ngx_uint_t i; - - cl = ctx->free_bufs; - - if (cl == NULL) { - ll = &ctx->free_bufs; - for (i = 0; i < 4; i++) { - cl = ngx_alloc_chain_link(pool); - if (cl == NULL) { - return NULL; - } - - cl->buf = ngx_calloc_buf(pool); - if (cl->buf == NULL) { - return NULL; - } - - cl->next = NULL; - *ll = cl; - ll = &cl->next; - } - cl = ctx->free_bufs; - } - - if (cl) { - ctx->free_bufs = cl->next; - - cl->buf->shadow = NULL; - cl->next = NULL; - - dd("returned free buf"); - return cl; - } - - dd("allocate new buf"); - - cl = ngx_alloc_chain_link(pool); - if (cl == NULL) { - return NULL; - } - - cl->buf = ngx_calloc_buf(pool); - if (cl->buf == NULL) { - return NULL; - } - - cl->next = NULL; - - /* cl->buf->tag = (ngx_buf_tag_t) &ngx_http_chunkin_filter_module; */ - - return cl; -} - - -/* modified from the ngx_http_internal_redirect function - * in ngx_http_core_module.c of nginx 0.8.29. - * copyrighted by Igor Sysoev. */ -ngx_int_t -ngx_http_chunkin_restart_request(ngx_http_request_t *r, - ngx_http_chunkin_ctx_t *ctx) -{ - ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "chunkin: restart request: \"%V?%V\"", - &r->uri, &r->args); - - ngx_memzero(r->ctx, sizeof(void *) * ngx_http_max_module); - - ngx_http_set_ctx(r, ctx, ngx_http_chunkin_filter_module); - - r->internal = 0; - /* r->phase_handler = 0; */ - - ngx_http_handler(r); - -#if defined(nginx_version) && nginx_version >= 8011 - - dd("DISCARD BODY: %d", (int)r->discard_body); - - if ( ! ctx->r_discard_body ) { - r->main->count++; - } - -#endif - - return NGX_DONE; -} - - -/* mostly a clone of the ngx_http_process_request_header function - * in ngx_http_request.c of nginx 0.8.29. - * copyrighted by Igor Sysoev. */ -ngx_int_t -ngx_http_chunkin_process_request_header(ngx_http_request_t *r) -{ - dd("entered process_request_header"); - - if (r->headers_in.host == NULL && r->http_version > NGX_HTTP_VERSION_10) { - ngx_log_error(NGX_LOG_INFO, r->connection->log, 0, - "client sent HTTP/1.1 request without \"Host\" header"); - return NGX_HTTP_BAD_REQUEST; - } - - if (r->headers_in.content_length) { - r->headers_in.content_length_n = - ngx_atoof(r->headers_in.content_length->value.data, - r->headers_in.content_length->value.len); - - if (r->headers_in.content_length_n == NGX_ERROR) { - ngx_log_error(NGX_LOG_INFO, r->connection->log, 0, - "client sent invalid \"Content-Length\" header"); - return NGX_HTTP_LENGTH_REQUIRED; - } - } - - dd("method: %d (%d)", (int)r->method, (int)NGX_HTTP_PUT); - dd("content_length_n: %d (%d)", (int)r->headers_in.content_length_n, -1); - - if (r->method & NGX_HTTP_PUT && r->headers_in.content_length_n == -1) { - ngx_log_error(NGX_LOG_INFO, r->connection->log, 0, - "client sent %V method without \"Content-Length\" header", - &r->method_name); - return NGX_HTTP_LENGTH_REQUIRED; - } - - if (r->method & NGX_HTTP_TRACE) { - ngx_log_error(NGX_LOG_INFO, r->connection->log, 0, - "client sent TRACE method"); - return NGX_HTTP_NOT_ALLOWED; - } - - if (r->headers_in.transfer_encoding - && ngx_strcasestrn(r->headers_in.transfer_encoding->value.data, - "chunked", 7 - 1)) - { - ngx_log_error(NGX_LOG_INFO, r->connection->log, 0, - "client sent \"Transfer-Encoding: chunked\" header"); - return NGX_HTTP_LENGTH_REQUIRED; - } - - if (r->headers_in.connection_type == NGX_HTTP_CONNECTION_KEEP_ALIVE) { - if (r->headers_in.keep_alive) { - r->headers_in.keep_alive_n = - ngx_atotm(r->headers_in.keep_alive->value.data, - r->headers_in.keep_alive->value.len); - } - } - - return NGX_OK; -} - - -/* mostly a clone of the ngx_http_process_request function - * in ngx_http_request.c of nginx 0.8.29. - * copyrighted by Igor Sysoev. */ -ngx_int_t -ngx_http_chunkin_process_request(ngx_http_request_t *r) -{ - ngx_connection_t *c; - - c = r->connection; - - if (r->plain_http) { - ngx_log_error(NGX_LOG_INFO, c->log, 0, - "client sent plain HTTP request to HTTPS port"); - /* ngx_http_finalize_request(r, NGX_HTTP_TO_HTTPS); */ - return NGX_HTTP_TO_HTTPS; - } - -#if (NGX_HTTP_SSL) - - if (c->ssl) { - long rc; - X509 *cert; - ngx_http_ssl_srv_conf_t *sscf; - - sscf = ngx_http_get_module_srv_conf(r, ngx_http_ssl_module); - - if (sscf->verify) { - rc = SSL_get_verify_result(c->ssl->connection); - - if (rc != X509_V_OK) { - ngx_log_error(NGX_LOG_INFO, c->log, 0, - "client SSL certificate verify error: (%l:%s)", - rc, X509_verify_cert_error_string(rc)); - - ngx_ssl_remove_cached_session(sscf->ssl.ctx, - (SSL_get0_session(c->ssl->connection))); - - /* ngx_http_finalize_request(r, NGX_HTTPS_CERT_ERROR); */ - return NGX_HTTPS_CERT_ERROR; - } - - if (sscf->verify == 1) { - cert = SSL_get_peer_certificate(c->ssl->connection); - - if (cert == NULL) { - ngx_log_error(NGX_LOG_INFO, c->log, 0, - "client sent no required SSL certificate"); - - ngx_ssl_remove_cached_session(sscf->ssl.ctx, - (SSL_get0_session(c->ssl->connection))); - - /* ngx_http_finalize_request(r, NGX_HTTPS_NO_CERT); */ - return NGX_HTTPS_NO_CERT; - } - - X509_free(cert); - } - } - } - -#endif - - if (c->read->timer_set) { - ngx_del_timer(c->read); - } - -#if (NGX_STAT_STUB) - (void) ngx_atomic_fetch_add(ngx_stat_reading, -1); - r->stat_reading = 0; - (void) ngx_atomic_fetch_add(ngx_stat_writing, 1); - r->stat_writing = 1; -#endif - - return NGX_OK; -} - - -ngx_int_t -ngx_http_chunkin_internal_redirect(ngx_http_request_t *r, - ngx_str_t *uri, ngx_str_t *args, ngx_http_chunkin_ctx_t *ctx) -{ - ngx_http_core_srv_conf_t *cscf; - - r->uri_changes--; - - if (r->uri_changes == 0) { - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - "rewrite or internal redirection cycle " - "while internal redirect to \"%V\"", uri); - -#if defined(nginx_version) && nginx_version >= 8011 - - r->main->count++; - -#endif - - ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR); - return NGX_DONE; - } - - r->uri = *uri; - - if (args) { - r->args = *args; - - } else { - r->args.len = 0; - r->args.data = NULL; - } - - ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "internal redirect: \"%V?%V\"", uri, &r->args); - - ngx_http_set_exten(r); - - /* clear the modules contexts */ - ngx_memzero(r->ctx, sizeof(void *) * ngx_http_max_module); - - ngx_http_set_ctx(r, ctx, ngx_http_chunkin_filter_module); - - cscf = ngx_http_get_module_srv_conf(r, ngx_http_core_module); - r->loc_conf = cscf->ctx->loc_conf; - - ngx_http_update_location_config(r); - -#if (NGX_HTTP_CACHE) - r->cache = NULL; -#endif - - r->internal = 0; - -#if defined(nginx_version) && nginx_version >= 8011 - - dd("DISCARD BODY: %d", (int)r->discard_body); - - if ( ! ctx->r_discard_body ) { - r->main->count++; - } - -#endif - - ngx_http_handler(r); - - return NGX_DONE; -} - - -static ngx_int_t -ngx_http_chunkin_rm_header(ngx_list_t *l, ngx_table_elt_t *h) -{ - ngx_uint_t i; - ngx_list_part_t *part; - ngx_table_elt_t *data; - - part = &l->part; - data = part->elts; - - for (i = 0; /* void */; i++) { - dd("i: %d, part: %p", (int) i, part); - - if (i >= part->nelts) { - if (part->next == NULL) { - break; - } - - part = part->next; - h = part->elts; - i = 0; - } - - if (&data[i] == h) { - dd("found header"); - - return ngx_http_chunkin_rm_header_helper(l, part, i); - } - } - - return NGX_ERROR; -} - - -static ngx_int_t -ngx_http_chunkin_rm_header_helper(ngx_list_t *l, ngx_list_part_t *cur, - ngx_uint_t i) -{ - ngx_table_elt_t *data; - ngx_list_part_t *new, *part; - - dd("list rm item: part %p, i %d, nalloc %d", cur, (int) i, - (int) l->nalloc); - - data = cur->elts; - - dd("cur: nelts %d, nalloc %d", (int) cur->nelts, - (int) l->nalloc); - - if (i == 0) { - cur->elts = (char *) cur->elts + l->size; - cur->nelts--; - - if (cur == l->last) { - if (l->nalloc > 1) { - l->nalloc--; - return NGX_OK; - } - - /* l->nalloc == 1 */ - - part = &l->part; - while (part->next != cur) { - if (part->next == NULL) { - return NGX_ERROR; - } - part = part->next; - } - - part->next = NULL; - l->last = part; - - return NGX_OK; - } - - if (cur->nelts == 0) { - part = &l->part; - while (part->next != cur) { - if (part->next == NULL) { - return NGX_ERROR; - } - part = part->next; - } - - part->next = cur->next; - - return NGX_OK; - } - - return NGX_OK; - } - - if (i == cur->nelts - 1) { - cur->nelts--; - - if (cur == l->last) { - l->nalloc--; - } - - return NGX_OK; - } - - new = ngx_palloc(l->pool, sizeof(ngx_list_part_t)); - if (new == NULL) { - return NGX_ERROR; - } - - new->elts = &data[i + 1]; - new->nelts = cur->nelts - i - 1; - new->next = cur->next; - - l->nalloc = new->nelts; - - cur->nelts = i; - cur->next = new; - if (cur == l->last) { - l->last = new; - } - - cur = new; - - return NGX_OK; -} - diff --git a/debian/modules/chunkin-nginx-module/src/ngx_http_chunkin_util.h b/debian/modules/chunkin-nginx-module/src/ngx_http_chunkin_util.h deleted file mode 100644 index d4b28b1..0000000 --- a/debian/modules/chunkin-nginx-module/src/ngx_http_chunkin_util.h +++ /dev/null @@ -1,26 +0,0 @@ -#ifndef NGX_HTTP_CHUNKIN_UTIL_H -#define NGX_HTTP_CHUNKIN_UTIL_H - -#include -#include "ngx_http_chunkin_filter_module.h" - -void ngx_http_chunkin_clear_transfer_encoding(ngx_http_request_t *r); - -ngx_int_t ngx_http_chunkin_set_content_length_header(ngx_http_request_t *r, - size_t len); - -ngx_chain_t * ngx_http_chunkin_get_buf(ngx_pool_t *pool, - ngx_http_chunkin_ctx_t *ctx); - -ngx_int_t ngx_http_chunkin_restart_request(ngx_http_request_t *r, - ngx_http_chunkin_ctx_t *ctx); - -ngx_int_t ngx_http_chunkin_process_request_header(ngx_http_request_t *r); - -ngx_int_t ngx_http_chunkin_process_request(ngx_http_request_t *r); - -ngx_int_t ngx_http_chunkin_internal_redirect(ngx_http_request_t *r, - ngx_str_t *uri, ngx_str_t *args, ngx_http_chunkin_ctx_t *ctx); - -#endif /* NGX_HTTP_CHUNKIN_UTIL_H */ - diff --git a/debian/modules/chunkin-nginx-module/t/bug.t b/debian/modules/chunkin-nginx-module/t/bug.t deleted file mode 100644 index e1fdeac..0000000 --- a/debian/modules/chunkin-nginx-module/t/bug.t +++ /dev/null @@ -1,600 +0,0 @@ -# vi:filetype= - -use lib 't/lib'; -use Test::Nginx::Socket::Chunkin; - -repeat_each(3); -#warn 'repeat each: ', repeat_each, "\n"; - -plan tests => repeat_each() * 2 * blocks(); - -no_diff; - -run_tests(); - -__DATA__ - -=== TEST 1: binary in data ---- config - chunkin on; - location /ar.do { - echo_request_body; - } ---- more_headers -Transfer-Encoding: chunked ---- request eval -"POST /ar.do -1b9\r -".'%Q`3�BBT0123456789AF%Q_�k%Q_�kwtk-emulatorSunMicrosystems_wtk AX7`encoding=pcm encoding=pcm&rate=8000&bits=8&channels=1 encoding=pcm&rate=22050&bits=16&chanZach-Laptop-W1.01.0en-US1.01.11.11.0SunMicrosystems_wtMIDP-2.11.0.10H,1Haudio/x-wavtruetruetruetruenencoding=rgb565&width=160&height=120 encoding=rgb565&width=320&height=240 encoding=rgb565&width=120&height=160encoding=jpeg encoding=png+12345678900http://mmsc.127.0.0.01'."\r -0\r -\r -" ---- response_body eval -'%Q`3�BBT0123456789AF%Q_�k%Q_�kwtk-emulatorSunMicrosystems_wtk AX7`encoding=pcm encoding=pcm&rate=8000&bits=8&channels=1 encoding=pcm&rate=22050&bits=16&chanZach-Laptop-W1.01.0en-US1.01.11.11.0SunMicrosystems_wtMIDP-2.11.0.10H,1Haudio/x-wavtruetruetruetruenencoding=rgb565&width=160&height=120 encoding=rgb565&width=320&height=240 encoding=rgb565&width=120&height=160encoding=jpeg encoding=png+12345678900http://mmsc.127.0.0.01' - - - -=== TEST 2: CRLF in data (missing trailing CRLF) ---- config - chunkin on; - location /ar.do { - echo_request_body; - } ---- more_headers -Transfer-Encoding: chunked ---- request eval -"POST /ar.do -2\r -\r -0\r -\r -" ---- response_body_like: 400 Bad Request ---- error_code: 400 - - - -=== TEST 3: CRLF in data ---- config - chunkin on; - location /ar.do { - echo_request_body; - } ---- more_headers -Transfer-Encoding: chunked ---- request eval -"POST /ar.do -2\r -\r -\r -0\r -\r -" ---- response_body eval -"\r\n" - - - -=== TEST 4: leading CRLF in data ---- config - chunkin on; - location /ar.do { - echo_request_body; - } ---- more_headers -Transfer-Encoding: chunked ---- request eval -"POST /ar.do -4\r -\r -ab\r -0\r -\r -" ---- response_body eval -"\r\nab" - - - -=== TEST 5: trailing CRLF in data ---- config - chunkin on; - location /ar.do { - echo_request_body; - } ---- more_headers -Transfer-Encoding: chunked ---- request eval -"POST /ar.do -4\r -ab\r -\r -0\r -\r -" ---- response_body eval -"ab\r\n" - - - -=== TEST 6: embedded CRLF in data ---- config - chunkin on; - location /ar.do { - echo_request_body; - } ---- more_headers -Transfer-Encoding: chunked ---- request eval -"POST /ar.do -6\r -ab\r -cd\r -0\r -\r -" ---- response_body eval -"ab\r\ncd" - - - -=== TEST 7: 413 in proxy ---- config - chunkin on; - location /main { - proxy_pass $scheme://127.0.0.1:$server_port/proxy; - } - location /proxy { - return 411; - } ---- more_headers -Transfer-Encoding: chunked ---- request eval -"POST /main -2\r -ab\r -0\r -\r -" ---- response_body_like: 411 Length Required ---- error_code: 411 - - - -=== TEST 8: padding spaces ---- config - chunkin on; - location /ar.do { - echo_request_body; - } ---- more_headers -Transfer-Encoding: chunked ---- request eval -"POST /ar.do -6 \r -ab\r -cd\r -0\r -\r -" ---- response_body eval -"ab\r\ncd" - - - -=== TEST 9: padding spaces (using HT) ---- config - chunkin on; - location /ar.do { - echo_request_body; - } ---- more_headers -Transfer-Encoding: chunked ---- request eval -"POST /ar.do -6 \t\r -ab\r -cd\r -0\r -\r -" ---- response_body eval -"ab\r\ncd" - - - -=== TEST 10: padding spaces (using \t and ' ' in last chunk) ---- config - chunkin on; - location /ar.do { - echo_request_body; - } ---- more_headers -Transfer-Encoding: chunked ---- request eval -"POST /ar.do -6 \t\r -ab\r -cd\r -0\t \r -\r -" ---- response_body eval -"ab\r\ncd" - - - -=== TEST 11: padding LWS (using \t and ' ' with a leading CRLF in last chunk) ---- config - chunkin on; - location /ar.do { - echo_request_body; - } ---- more_headers -Transfer-Encoding: chunked ---- request eval -"POST /ar.do -6\r -\r -\t\r -ab\r -cd\r -0\t\r -\r -\r -\r -" ---- response_body_like: 400 Bad Request ---- error_code: 400 - - - -=== TEST 12: leading CRLF ---- config - chunkin on; - location /ar.do { - echo_request_body; - } ---- more_headers -Transfer-Encoding: chunked ---- request eval -"POST /ar.do -\r -6\r -ab\r -cd\r -0\r -\r -" ---- response_body_like: 400 Bad Request ---- error_code: 400 - - - -=== TEST 13: zero-padding ---- config - chunkin on; - location /ar.do { - echo_request_body; - } ---- more_headers -Transfer-Encoding: chunked ---- request eval -"POST /ar.do -0006\r -ab\r -cd\r -0\r -\r -" ---- response_body eval -"ab\r\ncd" - - - -=== TEST 14: leading new lines ---- config - chunkin on; - location /ar.do { - echo_request_body; - } ---- more_headers -Transfer-Encoding: chunked ---- request eval -"POST /ar.do -\n \11\r -0006\r -ab\r -cd\r -0\r -\r -" ---- response_body_like: 400 Bad Request ---- error_code: 400 - - - -=== TEST 15: internal guard ---- config - chunkin on; - location /ar.do { - internal; - echo_request_body; - } ---- more_headers -Transfer-Encoding: chunked ---- request eval -"POST /ar.do -\n \11\r -0006\r -ab\r -cd\r -0\r -\r -" ---- response_body_like: 404 Not Found ---- error_code: 404 - - - -=== TEST 16: phase issue ---- config - chunkin on; - location /ar.do { - deny all; - echo_request_body; - } ---- more_headers -Transfer-Encoding: chunked ---- request eval -"POST /ar.do -1\r -a\r -0\r -\r -" ---- response_body_like: 403 Forbidden ---- error_code: 403 - - - -=== TEST 17: contenth-length AND chunked ---- config - chunkin on; - location /aar.do { - echo_request_body; - } ---- more_headers -Transfer-Encoding: chunked ---- raw_request eval -"POST /aar.do HTTP/1.1\r -Host: data.test.com\r -Content-Type:application/octet-stream\r -transfer-encoding:chunked\r -User-Agent: SEC-SGHD840/1.0 NetFront/3.2 Profile/MIDP-2.0 Configuration/CLDC-1.1 UNTRUSTED/1.0\r -Content-Length: 6263\r -Via: ZXWAP GateWay,ZTE Technologies\r -x-up-calling-line-id: 841223657459\r -Connection: close\r -\r -5\r -hello\r -0\r -\r -" ---- response_body: hello ---- timeout: 1 - - - -=== TEST 18: Content-length AND chunked ---- config - chunkin on; - location /aar.do { - echo_request_body; - } ---- raw_request eval -["POST /aar.do HTTP/1.1\r -Host: data.test.com\r -Content-Type:application/octet-stream\r -transfer-encoding:chunked\r -User-Agent: SEC-SGHD840/1.0 NetFront/3.2 Profile/MIDP-2.0 Configuration/CLDC-1.1 UNTRUSTED/1.0\r -Content-Length: 6263\r -Via: ZXWAP GateWay,ZTE Technologies\r -x-up-calling-line-id: 841223657459\r -Connection: close\r -\r -5\r -", "hell","o\r -", "0\r -\r -"] ---- raw_request_middle_delay: 0.001 ---- response_body: hello ---- timeout: 4 - - - -=== TEST 19: Content-length AND chunked (ready for the read_discard_request_body to work) ---- config - chunkin on; - location /aar.do { - echo_request_body; - } ---- raw_request eval -["POST /aar.do HTTP/1.1\r -Host: data.test.com\r -Content-Type:application/octet-stream\r -transfer-encoding:chunked\r -User-Agent: SEC-SGHD840/1.0 NetFront/3.2 Profile/MIDP-2.0 Configuration/CLDC-1.1 UNTRUSTED/1.0\r -Content-Length: 6263\r -Via: ZXWAP GateWay,ZTE Technologies\r -x-up-calling-line-id: 841223657459\r -Connection: close\r -\r -5\r -", "hell","o\r -", "0\r -\r -"] ---- raw_request_middle_delay: 0 ---- response_body: hello ---- timeout: 1 - - - -=== TEST 20: packets in a single buf ---- config - chunkin on; - location /aar.do { - client_body_buffer_size 1m; - echo_request_body; - } ---- raw_request eval -["POST /aar.do HTTP/1.1\r -Content-Type: application/octet-stream\r -Connection: close\r -Host: data.test.com\r -Transfer-Encoding: chunked\r -User-Agent: SonyEricssonW395/R1BA010 Profile/MIDP-2.1 Configuration/CLDC-1.1 UNTRUSTED/1.0\r -\r -", -"535\r -".('a' x 1228), -('a' x 107), "\r -", "0\r -\r -"] ---- raw_request_middle_delay: 0.002 ---- response_body: hello ---- timeout: 2 ---- SKIP - - - -=== TEST 21: packets in a single buf ---- config - chunkin on; - location /aar.do { - client_body_buffer_size 1m; - echo_request_body; - } ---- raw_request eval -["POST /aar.do HTTP/1.1\r -Content-Type: application/octet-stream\r -Connection: close\r -Host: data.test.com\r -Transfer-Encoding: chunked\r -User-Agent: SonyEricssonW395/R1BA010 Profile/MIDP-2.1 Configuration/CLDC-1.1 UNTRUSTED/1.0\r -\r -", -"535\r -".('a' x 1228), -('a' x 105) . "\r -", "0\r -\r -"] ---- raw_request_middle_delay: 0.002 ---- response_body eval -'a' x 0x535 ---- timeout: 5 - - - -=== TEST 22: packets in a single buf ---- config - chunkin on; - location /aar.do { - client_body_buffer_size 1m; - echo_request_body; - } ---- raw_request eval -["POST /aar.do HTTP/1.1\r -Content-Type: application/octet-stream\r -Connection: close\r -Host: data.test.com\r -Transfer-Encoding: chunked\r -User-Agent: SonyEricssonW395/R1BA010 Profile/MIDP-2.1 Configuration/CLDC-1.1 UNTRUSTED/1.0\r -\r -", -"7e0\r -".('a' x 2016)."\r", -"aaaa -", "0\r -\r -"] ---- raw_request_middle_delay: 0.002 ---- response_body eval -'a' x 0x7e0 ---- timeout: 2 ---- SKIP - - - -=== TEST 23: not exceeding max body limit (chunk spanning preread and rb->buf) ---- config - chunkin on; - location /main { - client_body_buffer_size 10m; - client_max_body_size 10m; - chunkin_max_chunks_per_buf 2048; - - echo_read_request_body; - - echo_request_body; - echo; - } ---- more_headers -#Transfer-Encoding: chunked ---- request eval -"POST /main -".("a" x (1 * 1024 * 1024)) ---- response_body eval -"a" x (1 * 1024 * 1024) ---- timeout: 60 ---- SKIP - - - -=== TEST 24: binary in data ---- config - chunkin on; - location /ar.do { - echo $request_method; - echo_request_body; - } ---- more_headers -Transfer-Encoding: chunked ---- request eval -"DELETE /ar.do -5\r -hello\r -0\r -\r -" ---- response_body chop -DELETE -hello - - - -=== TEST 25: CR LF across the boundary ---- config - chunkin on; - location /ar.do { - echo $request_method; - echo_request_body; - } ---- more_headers -Transfer-Encoding: chunked ---- request eval -"DELETE /ar.do -5\r -hell\r\r -0\r -\r -" ---- response_body eval -"DELETE -hell\r" - diff --git a/debian/modules/chunkin-nginx-module/t/error.t b/debian/modules/chunkin-nginx-module/t/error.t deleted file mode 100644 index 8e6dfd4..0000000 --- a/debian/modules/chunkin-nginx-module/t/error.t +++ /dev/null @@ -1,305 +0,0 @@ -# vi:filetype= - -use lib 't/lib'; -use Test::Nginx::Socket::Chunkin; - -plan tests => repeat_each() * 2 * blocks(); - -no_diff; - -run_tests(); - -__DATA__ - -=== TEST 1: sanity ---- config - location /main { - echo hi; - } ---- request -GET /main ---- response_body -hi - - - -=== TEST 2: good chunked body ---- config - chunkin on; - location /main { - echo_request_body; - } ---- more_headers -Transfer-Encoding: chunked ---- request eval -"POST /main -5\r -hello\r -0\r -\r -" ---- response_body chomp -hello - - - -=== TEST 3: chunk size too small ---- config - chunkin on; - location /main { - echo_request_body; - } ---- more_headers -Transfer-Encoding: chunked ---- request eval -"POST /main -4\r -hello\r -0\r -\r -" ---- error_code: 400 ---- response_body_like: 400 Bad Request - - - -=== TEST 4: chunk size too big ---- config - chunkin on; - location /main { - echo_request_body; - } ---- more_headers -Transfer-Encoding: chunked ---- request eval -"POST /main -6\r -hello\r -0\r -\r -" ---- response_body_like: 400 Bad Request ---- error_code: 400 - - - -=== TEST 5: chunk size even bigger ---- config - chunkin on; - location /main { - echo_request_body; - } ---- more_headers -Transfer-Encoding: chunked ---- request eval -"POST /main -7\r -hello\r -0\r -\r -" ---- response_body_like: 400 Bad Request ---- error_code: 400 - - - -=== TEST 6: chunk size WAY too big and rejected by ragel DFA ---- config - chunkin on; - location /main { - echo_request_body; - } ---- more_headers -Transfer-Encoding: chunked ---- request eval -"POST /main -8\r -hello\r -0\r -\r -" ---- error_code: 400 ---- response_body_like: 400 Bad Request - - - -=== TEST 7: missing LF after data chunk ---- config - chunkin on; - location /main { - echo_request_body; - } ---- more_headers -Transfer-Encoding: chunked ---- request eval -"POST /main -5\r -hello\r0\r -\r -" ---- error_code: 400 ---- response_body_like: 400 Bad Request - - - -=== TEST 8: missing CR after data chunk ---- config - chunkin on; - location /main { - echo_request_body; - } ---- more_headers -Transfer-Encoding: chunked ---- request eval -"POST /main -5\r -hello -0\r -\r -" ---- error_code: 400 ---- response_body_like: 400 Bad Request - - - -=== TEST 9: missing CRLF after data chunk ---- config - chunkin on; - location /main { - echo_request_body; - } ---- more_headers -Transfer-Encoding: chunked ---- request eval -"POST /main -5\r -hello0\r -\r -" ---- error_code: 400 ---- response_body_like: 400 Bad Request - - - -=== TEST 10: 2 zero chunks ---- config - chunkin on; - location /main { - echo_request_body; - } ---- more_headers -Transfer-Encoding: chunked ---- request eval -"POST /main -0\r -\r -0\r -\r -" ---- response_body - - - -=== TEST 11: 1 00 chunk and 1 zero chunk ---- config - chunkin on; - location /main { - #echo "length: $http_content_length"; - echo_request_body; - } ---- more_headers -Transfer-Encoding: chunked ---- request eval -"POST /main -00\r -\r -0\r -\r -" ---- response_body - - - -=== TEST 12: 1 00 chunk and 1 zero chunk ---- config - chunkin on; - location /main { - echo_request_body; - } ---- more_headers -Transfer-Encoding: chunked ---- request eval -"POST /main -10\r -helloworld,hello\r -00\r -\r -0\r -\r -" ---- response_body: helloworld,hello - - - -=== TEST 13: bad chunk size ---- config - chunkin on; - location /main { - echo_request_body; - } ---- more_headers -Transfer-Encoding: chunked ---- request eval -"POST /main -zc\r -hello\r -0\r -\r -" ---- response_body_like: 400 Bad Request ---- error_code: 400 - - - -=== TEST 14: bad chunk size in the 2nd chunk ---- config - chunkin on; - location /main { - echo_request_body; - } ---- more_headers -Transfer-Encoding: chunked -User-Agent: Java Browser ---- request eval -"POST /main -1\r -a\r -zc\r -hello\r -0\r -\r -" ---- response_body_like: 400 Bad Request ---- error_code: 400 - - - -=== TEST 15: error near the end of big chunks ---- config - chunkin on; - location /main { - echo_request_body; - } ---- more_headers -Transfer-Encoding: chunked ---- request eval -"POST /main -800\r -".('a'x2047)."\r -0\r -\r -" ---- response_body_like: 400 Bad Request ---- error_code: 400 ---- timeout: 10 - diff --git a/debian/modules/chunkin-nginx-module/t/ext.t b/debian/modules/chunkin-nginx-module/t/ext.t deleted file mode 100644 index 18420d2..0000000 --- a/debian/modules/chunkin-nginx-module/t/ext.t +++ /dev/null @@ -1,107 +0,0 @@ -# vi:filetype= - -use lib 't/lib'; -use Test::Nginx::Socket::Chunkin; - -plan tests => repeat_each() * 2 * blocks(); - -#no_diff; - -run_tests(); - -__DATA__ - -=== TEST 1: bad ext (missing leading ;) ---- config - chunkin on; - location /main { - echo_request_body; - } ---- more_headers -Transfer-Encoding: chunked ---- request eval -"POST /main -3 a=b\r -abc\r -0\r -\r -" ---- response_body_like: 400 Bad Request ---- error_code: 400 - - - -=== TEST 2: sanity ---- config - chunkin on; - location /main { - echo_request_body; - } ---- more_headers -Transfer-Encoding: chunked ---- request eval -"POST /main -3;a=b\r -abc\r -0\r -\r -" ---- response_body: abc - - - -=== TEST 3: with spaces ---- config - chunkin on; - location /main { - echo_request_body; - } ---- more_headers -Transfer-Encoding: chunked ---- request eval -"POST /main -3 ;\t a\t = b\r -abc\r -0\r -\r -" ---- response_body: abc - - - -=== TEST 4: ext with out val ---- config - chunkin on; - location /main { - echo_request_body; - } ---- more_headers -Transfer-Encoding: chunked ---- request eval -"POST /main -3 ;\t foo\t \r -abc\r -0\r -\r -" ---- response_body: abc - - - -=== TEST 5: multiple exts ---- config - chunkin on; - location /main { - echo_request_body; - } ---- more_headers -Transfer-Encoding: chunked ---- request eval -"POST /main -3 ;\t foo = bar; blah = ".'"hello\\\"!"'."\t \r -abc\r -0\r -\r -" ---- response_body: abc - diff --git a/debian/modules/chunkin-nginx-module/t/lib/Test/Nginx/LWP/Chunkin.pm b/debian/modules/chunkin-nginx-module/t/lib/Test/Nginx/LWP/Chunkin.pm deleted file mode 100644 index abbd9f3..0000000 --- a/debian/modules/chunkin-nginx-module/t/lib/Test/Nginx/LWP/Chunkin.pm +++ /dev/null @@ -1,14 +0,0 @@ -package Test::Nginx::LWP::Chunkin; - -use lib 'lib'; -use lib 'inc'; -use Test::Nginx::LWP -Base; - -config_preamble(<<'_EOC_'); - error_page 411 = @chunkin_error; - location @chunkin_error { - chunkin_resume; - } -_EOC_ - -1; diff --git a/debian/modules/chunkin-nginx-module/t/lib/Test/Nginx/Socket/Chunkin.pm b/debian/modules/chunkin-nginx-module/t/lib/Test/Nginx/Socket/Chunkin.pm deleted file mode 100644 index b1601e7..0000000 --- a/debian/modules/chunkin-nginx-module/t/lib/Test/Nginx/Socket/Chunkin.pm +++ /dev/null @@ -1,14 +0,0 @@ -package Test::Nginx::Socket::Chunkin; - -use lib 'lib'; -use lib 'inc'; -use Test::Nginx::Socket -Base; - -config_preamble(<<'_EOC_'); - error_page 411 = @chunkin_error; - location @chunkin_error { - chunkin_resume; - } -_EOC_ - -1; diff --git a/debian/modules/chunkin-nginx-module/t/max_chunks.t b/debian/modules/chunkin-nginx-module/t/max_chunks.t deleted file mode 100644 index 2288246..0000000 --- a/debian/modules/chunkin-nginx-module/t/max_chunks.t +++ /dev/null @@ -1,61 +0,0 @@ -# vi:filetype= - -use lib 't/lib'; -use Test::Nginx::LWP::Chunkin; - -plan tests => repeat_each() * 2 * blocks(); - -no_diff; - -run_tests(); - -__DATA__ - -=== TEST 1: exceeding the default max chunks per buf setting (512) ---- config - chunkin on; - location /main { - client_body_buffer_size 1m; - echo_request_body; - } ---- request -POST /main ---- chunked_body eval -[split //, 'a' x 1024] ---- response_body eval -'a' x 1024 - - - -=== TEST 2: NOT exceeding the custom max chunks per buf setting ---- config - chunkin on; - location /main { - client_body_buffer_size 1m; - chunkin_max_chunks_per_buf 1024; - echo_request_body; - } ---- request -POST /main ---- chunked_body eval -[split //, 'a' x 1024] ---- response_body eval -'a' x 1024 - - - -=== TEST 3: JUST exceeding the custom max chunks per buf setting ---- config - chunkin on; - location /main { - client_body_buffer_size 1m; - chunkin_max_chunks_per_buf 1024; - echo_request_body; - } ---- request -POST /main ---- chunked_body eval -[split //, 'a' x 1025] ---- response_body eval -'a' x 1025 - diff --git a/debian/modules/chunkin-nginx-module/t/pipelined.t b/debian/modules/chunkin-nginx-module/t/pipelined.t deleted file mode 100644 index 3ffa80e..0000000 --- a/debian/modules/chunkin-nginx-module/t/pipelined.t +++ /dev/null @@ -1,73 +0,0 @@ -# vi:filetype= - -use lib 't/lib'; - -my $skip_all; - -BEGIN { $skip_all = 1; } - -use Test::Nginx::Socket::Chunkin $skip_all ? - (skip_all => 'too experimental to run the tests properly :P') - : (); - -plan tests => repeat_each() * 2 * blocks(); - -no_diff; - -run_tests(); - -__DATA__ - -=== TEST 1: sanity ---- config - chunkin on; - location /main { - chunkin_keepalive on; - client_body_buffer_size 4; - echo_request_body; - } - location /main2 { - chunkin_keepalive on; - client_body_buffer_size 4; - echo_request_body; - } - ---- more_headers -Transfer-Encoding: chunked ---- pipelined_requests eval -[ -"POST /main -5\r -hello\r -0\r -\r -", -"POST /main2 -6\r -,world\r -0\r -\r -"] ---- response_body: hello,world ---- ONLY - - - -=== TEST 2: standard body read ---- config - chunkin on; - location /main { - client_body_buffer_size 4; - echo_read_request_body; - echo_request_body; - } ---- more_headers -Content-Length: 5 ---- pipelined_requests eval -[ -"POST /main -hello", -"POST /main -world"] ---- response_body: helloworld - diff --git a/debian/modules/chunkin-nginx-module/t/pressure.t b/debian/modules/chunkin-nginx-module/t/pressure.t deleted file mode 100644 index 7723e99..0000000 --- a/debian/modules/chunkin-nginx-module/t/pressure.t +++ /dev/null @@ -1,180 +0,0 @@ -# vi:filetype= - -use lib 't/lib'; -use Test::Nginx::LWP::Chunkin; - -plan tests => repeat_each() * 2 * blocks(); - -#no_diff; - -run_tests(); - -__DATA__ - -=== TEST 1: many little chunks ---- config - chunkin on; - location /main { - client_body_buffer_size 4; - echo_request_body; - } ---- request -POST /main ---- chunked_body eval -[split //, - "hello world blah blah blah! oh, yay! end"] ---- response_body eval -"hello world blah blah blah! oh, yay! end" - - - -=== TEST 2: many little chunks (more!) ---- config - chunkin on; - location /main { - client_body_buffer_size 1k; - #echo_sleep 500; - echo_request_body; - } ---- request -POST /main ---- chunked_body eval -[split //, - ("hello world blah blah blah! o, yah!" x 4) . 'end'] ---- response_body eval -("hello world blah blah blah! o, yah!" x 4) . 'end' - - - -=== TEST 3: many little chunks (more!) ---- config - chunkin on; - location /main { - client_body_buffer_size 60; - #echo_sleep 500; - echo_request_body; - } ---- request -POST /main ---- chunked_body eval -[split //, - ("hello world blah blah blah! oh, yah!" x 100) . 'end'] ---- response_body eval -("hello world blah blah blah! oh, yah!" x 100) . 'end' - - - -=== TEST 4: exceeding max body limit (this test may fail randomly with the error "500 write failed: Connection reset by peer", which is considered OK). ---- config - chunkin on; - location /main { - client_body_buffer_size 512; - client_max_body_size 1024; - - echo_request_body; - } ---- request -POST /main ---- chunked_body eval -[split //, - ("a" x 1024) . 'e'] ---- response_body_like: 413 Request Entity Too Large ---- error_code: 413 - - - -=== TEST 5: not exceeding max body limit (chunk spanning preread and rb->buf) ---- config - chunkin on; - location /main { - client_body_buffer_size 512; - client_max_body_size 1048; - - echo_request_body; - } ---- request -POST /main ---- chunked_body eval -["a" x 1024] ---- response_body eval -"a" x 1024 - - - -=== TEST 6: next chunk reset bug ---- config - chunkin on; - location /main { - client_body_buffer_size 600; - client_max_body_size 8k; - - echo_request_body; - } ---- request -POST /main ---- middle_chunk_delay: 0.001 ---- chunked_body eval -[split //, - ("a" x 700) . 'e'] ---- response_body eval -"a" x 700 . 'e' - - - -=== TEST 7: next chunk reset bug (too many chunks) ---- config - chunkin on; - location /main { - client_body_buffer_size 8k; - client_max_body_size 8k; - - echo_request_body; - } ---- request -POST /main ---- chunked_body eval -[split //, - ("a" x 700) . 'e'] ---- response_body eval -"a" x 700 . 'e' - - - -=== TEST 8: normal POST with chunkin on ---- config - chunkin on; - location /main { - client_body_buffer_size 600; - client_max_body_size 8k; - - echo_read_request_body; - echo_request_body; - } ---- request -POST /main -hello, world ---- response_body chomp -hello, world - - - -=== TEST 9: not exceeding max body limit (chunk spanning preread and rb->buf) ---- config - chunkin on; - location /main { - client_body_buffer_size 10m; - client_max_body_size 10m; - - echo_request_body; - echo; - } ---- request -POST /main ---- chunked_body eval -[split //, "a" x (500 * 1024)] ---- middle_chunk_delay: 0 ---- response_body eval -"a" x (500 * 1024) ---- quit ---- SKIP - diff --git a/debian/modules/chunkin-nginx-module/t/random.t b/debian/modules/chunkin-nginx-module/t/random.t deleted file mode 100644 index 9eee6a3..0000000 --- a/debian/modules/chunkin-nginx-module/t/random.t +++ /dev/null @@ -1,90 +0,0 @@ -# vi:filetype= - -use lib 't/lib'; -use Test::Nginx::Socket::Chunkin; - -#worker_connections(1024); -master_process_enabled(1); - -our $data; - -repeat_each(500); - -plan tests => repeat_each() * 2 * blocks(); - -no_diff; - -run_tests(); - -__DATA__ - -=== TEST 1: single chunk ---- config - chunkin on; - location /ar.do { - client_max_body_size 1m; - client_body_buffer_size 512; - echo_request_body; - } ---- more_headers -Transfer-Encoding: chunked ---- request eval -$::data = ''; -my $count = (int rand 32766) + 1; -for (my $i = 0; $i < $count; $i++) { - my $c = chr int rand 128; - $::data .= $c; -} -#warn $::data; -my $s = "POST /ar.do -". -sprintf("%x\r\n", length $::data). -$::data -."\r -0\r -\r -"; -open my $out, '>/tmp/out.txt' or die $!; -print $out $s; -close $out; -$s ---- response_body eval -$::data ---- timeout: 10 - - - -=== TEST 2: single chunk ---- config - chunkin on; - location /ar.do { - client_max_body_size 1m; - client_body_buffer_size 1k; - echo_request_body; - } ---- more_headers -Transfer-Encoding: chunked ---- request eval -$::data = ''; -my $count = 32766; -for (my $i = 0; $i < $count; $i++) { - my $c = chr int rand 256; - $::data .= $c; -} -#warn $::data; -my $s = "POST /ar.do -". -sprintf("%x\r\n", length $::data). -$::data -."\r -0\r -\r -"; -open my $out, '>/tmp/out.txt' or die $!; -print $out $s; -close $out; -$s ---- response_body eval -$::data ---- timeout: 10 - diff --git a/debian/modules/chunkin-nginx-module/t/sanity.t b/debian/modules/chunkin-nginx-module/t/sanity.t deleted file mode 100644 index d2b63e2..0000000 --- a/debian/modules/chunkin-nginx-module/t/sanity.t +++ /dev/null @@ -1,452 +0,0 @@ -# vi:ft= - -use lib 't/lib'; -use Test::Nginx::LWP::Chunkin; - -plan tests => repeat_each() * 2 * blocks(); - -no_diff; - -run_tests(); - -__DATA__ - -=== TEST 1: off & POST ---- config - chunkin off; - location /main { - echo hi; - } ---- request -POST /main ---- chunked_body eval -["hello", "world"] ---- error_code: 411 ---- response_body_like: 411 Length Required - - - -=== TEST 2: default (off) & POST ---- config - location /main { - } ---- request -POST /main ---- chunked_body eval -["hello", "world"] ---- error_code: 411 ---- response_body_like: 411 Length Required - - - -=== TEST 3: off & GET ---- config - chunkin off; - location /main { - echo hi; - } ---- request -GET /main ---- response_body -hi ---- error_code: 200 - - - -=== TEST 4: on & GET ---- config - chunkin on; - location /main { - echo hi; - } ---- request -GET /main ---- response_body -hi ---- error_code: 200 - - - -=== TEST 5: on & POST ---- config - chunkin on; - location /main { - echo $request_method; - #echo $echo_request_body; - } ---- request -POST /main ---- chunked_body eval -["hello", "world"] ---- error_code: 200 ---- response_body -POST - - - -=== TEST 6: raw request headers (indeed chunked) ---- config - chunkin on; - location /main { - echo 'headers:'; - echo $echo_client_request_headers; - } ---- request -POST /main ---- chunked_body eval -["hello", "world"] ---- error_code: 200 ---- response_body eval -"headers: -POST /main HTTP/1.1\r -Host: localhost:\$ServerPortForClient\r -User-Agent: Test::Nginx::LWP\r -Content-Type: text/plain\r -Transfer-Encoding: chunked\r - -" - - - -=== TEST 7: request headers filtered by chunkin -This test passes only for nginx versions -* 0.7.x >= 0.7.21 -* 0.8.x >= 0.8.10 ---- config - chunkin on; - location /main { - proxy_pass_request_headers on; - proxy_pass $scheme://127.0.0.1:$server_port/proxy; - } - - location /proxy { - echo $echo_client_request_headers; - } ---- request -POST /main ---- chunked_body eval -["hello", "world"] ---- error_code: 200 ---- response_body eval -"POST /proxy HTTP/1.0\r -Host: 127.0.0.1:\$ServerPort\r -Connection: close\r -User-Agent: Test::Nginx::LWP\r -Content-Type: text/plain\r -Content-Length: 10\r - -" - - - -=== TEST 8: 0 chunk body ---- config - chunkin on; - location /main { - echo "body:"; - echo $echo_request_body; - } ---- request -POST /main ---- chunked_body eval -[""] ---- error_code: 200 ---- response_body eval -"body: - -" - - - -=== TEST 9: 0 chunk body via proxy (header okay) ---- config - chunkin on; - location /main { - proxy_pass $scheme://127.0.0.1:$server_port/proxy; - } - location /proxy { - echo $echo_client_request_headers; - } ---- request -POST /main ---- chunked_body eval -[""] ---- error_code: 200 ---- response_body eval -"POST /proxy HTTP/1.0\r -Host: 127.0.0.1:\$ServerPort\r -Connection: close\r -User-Agent: Test::Nginx::LWP\r -Content-Type: text/plain\r -Content-Length: 0\r - -" - - - -=== TEST 10: single char in preread ---- config - chunkin on; - location /main { - proxy_pass $scheme://127.0.0.1:$server_port/proxy; - } - location /proxy { - echo $echo_client_request_headers; - } ---- request -POST /main ---- chunked_body eval -["a"] ---- error_code: 200 ---- response_body eval -"POST /proxy HTTP/1.0\r -Host: 127.0.0.1:\$ServerPort\r -Connection: close\r -User-Agent: Test::Nginx::LWP\r -Content-Type: text/plain\r -Content-Length: 1\r - -" - - - -=== TEST 11: single char in preread (headers okay) ---- config - chunkin on; - location /main { - echo "body:"; - echo $echo_request_body; - } ---- request -POST /main ---- chunked_body eval -["a"] ---- error_code: 200 ---- response_body -body: -a - - - -=== TEST 12: on & POST & read body & no single buf ---- config - chunkin on; - location /main { - echo "body:"; - echo $echo_request_body; - } ---- request -POST /main ---- middle_chunk_delay: 0.01 ---- chunked_body eval -["hello", "world"] ---- error_code: 200 ---- response_body -body: -helloworld - - - -=== TEST 13: on & POST & read body & single buf ---- config - chunkin on; - location /main { - client_body_in_single_buffer on; - echo "body:"; - echo $echo_request_body; - } ---- request -POST /main ---- middle_chunk_delay: 0.01 ---- chunked_body eval -["hello", "world"] ---- error_code: 200 ---- response_body -body: -helloworld ---- skip_nginx: 2: < 0.7.58 - - - -=== TEST 14: on & POST & read body & no single buf & echo_request_body ---- config - chunkin on; - location /main { - client_body_in_single_buffer on; - echo "body:"; - echo_request_body; - echo; - } ---- request -POST /main ---- middle_chunk_delay: 0.01 ---- chunked_body eval -["hello", "world"] ---- error_code: 200 ---- response_body -body: -helloworld ---- skip_nginx: 2: < 0.7.58 - - - -=== TEST 15: request headers filtered by chunkin (with delay) -This test passes only for nginx versions -* 0.7.x >= 0.7.21 -* 0.8.x >= 0.8.10 ---- middle_chunk_delay: 0.01 ---- config - chunkin on; - location /main { - proxy_pass_request_headers on; - proxy_pass $scheme://127.0.0.1:$server_port/proxy; - } - - location /proxy { - echo $echo_client_request_headers; - } ---- request -POST /main ---- chunked_body eval -["hello", "world"] ---- error_code: 200 ---- response_body eval -"POST /proxy HTTP/1.0\r -Host: 127.0.0.1:\$ServerPort\r -Connection: close\r -User-Agent: Test::Nginx::LWP\r -Content-Type: text/plain\r -Content-Length: 10\r - -" - - - -=== TEST 16: small buf (using 2-byte buf) ---- config - chunkin on; - location /main { - client_body_buffer_size 2; - echo "body:"; - echo $echo_request_body; - echo_request_body; - } ---- request -POST /main ---- start_chunk_delay: 0.01 ---- middle_chunk_delay: 0.01 ---- chunked_body eval -["hello", "world"] ---- error_code: 200 ---- response_body eval -"body: - -helloworld" - - - -=== TEST 17: small buf (using 1-byte buf) ---- config - chunkin on; - location /main { - client_body_buffer_size 1; - echo "body:"; - echo $echo_request_body; - echo_request_body; - } ---- request -POST /main ---- start_chunk_delay: 0.01 ---- middle_chunk_delay: 0.01 ---- chunked_body eval -["hello", "world"] ---- error_code: 200 ---- response_body eval -"body: - -helloworld" - - - -=== TEST 18: small buf (using 3-byte buf) ---- config - chunkin on; - location /main { - client_body_buffer_size 3; - echo "body:"; - echo $echo_request_body; - echo_request_body; - } ---- request -POST /main ---- start_chunk_delay: 0.01 ---- middle_chunk_delay: 0.01 ---- chunked_body eval -["hello", "world"] ---- error_code: 200 ---- response_body eval -"body: - -helloworld" - - - -=== TEST 19: big chunk ---- config - chunkin on; - location /main { - client_body_buffer_size 3; - echo "body:"; - echo $echo_request_body; - echo_request_body; - } ---- request -POST /main ---- start_chunk_delay: 0.01 ---- middle_chunk_delay: 0.01 ---- chunked_body eval -["hello", "world" x 1024, "!" x 1024] ---- error_code: 200 ---- response_body eval -"body: - -hello" . ("world" x 1024) . ('!' x 1024) - - - -=== TEST 20: in memory ---- config - chunkin on; - location /main { - client_body_buffer_size 4k; - echo "body:"; - echo $echo_request_body; - } ---- request -POST /main ---- start_chunk_delay: 0.01 ---- middle_chunk_delay: 0.01 ---- chunked_body eval -["hello", "world"] ---- error_code: 200 ---- response_body -body: -helloworld - - - -=== TEST 21: on & PUT ---- config - chunkin on; - location /main { - #echo_read_request_body; - echo_request_body; - } ---- request -PUT /main ---- chunked_body eval -["hello", "world"] ---- response_body chomp -helloworld ---- error_code: 200 - diff --git a/debian/modules/chunkin-nginx-module/t/timeout.t b/debian/modules/chunkin-nginx-module/t/timeout.t deleted file mode 100644 index 0e0efc6..0000000 --- a/debian/modules/chunkin-nginx-module/t/timeout.t +++ /dev/null @@ -1,52 +0,0 @@ -# vi:filetype= - -use lib 't/lib'; -use Test::Nginx::Socket::Chunkin; - -plan tests => repeat_each() * 2 * blocks(); - -no_diff; - -run_tests(); - -__DATA__ - -=== TEST 1: bad chunk size in the 2nd chunk ---- config - chunkin on; - location /main { - client_body_timeout 1; - echo_read_request_body; - echo_request_body; - } ---- more_headers -Transfer-Encoding: chunked -User-Agent: Java Browser ---- timeout: 2 ---- request eval -"POST /main -0\r -" ---- response_body: ---- error_code: - - - -=== TEST 2: bad chunk size in the 2nd chunk (using standard client body reader) ---- config - chunkin on; - location /main { - client_body_timeout 1; - echo_read_request_body; - echo_request_body; - } ---- more_headers -Content-Length: 5 ---- timeout: 3 ---- request eval -"POST /main -he" ---- response_body: ---- error_code: ---- SKIP - diff --git a/debian/modules/chunkin-nginx-module/util/build.sh b/debian/modules/chunkin-nginx-module/util/build.sh deleted file mode 100755 index fed2322..0000000 --- a/debian/modules/chunkin-nginx-module/util/build.sh +++ /dev/null @@ -1,24 +0,0 @@ -#!/bin/bash - -# this file is mostly meant to be used by the author himself. - -ragel -G2 src/chunked_parser.rl -if [ $? != 0 ]; then - echo 'Failed to generate the chunked parser.' 1>&2 - exit 1; -fi - -root=`pwd` -version=$1 -force=$2 - -ngx-build $force $version \ - --with-cc-opt="-funsigned-char" \ - --add-module=$root/../echo-nginx-module \ - --add-module=$root $opts \ - --with-debug - #\ - #--with-http_ssl_module #\ - #--with-cc-opt="-pg" --with-ld-opt="-pg" \ - #--without-http_ssi_module # we cannot disable ssi because echo_location_async depends on it (i dunno why?!) - diff --git a/debian/modules/chunkin-nginx-module/util/releng b/debian/modules/chunkin-nginx-module/util/releng deleted file mode 100755 index 638ff11..0000000 --- a/debian/modules/chunkin-nginx-module/util/releng +++ /dev/null @@ -1,6 +0,0 @@ -#!/bin/bash - -./update-readme -ack '(?<=\#define)\s*DDEBUG\s*1' src -ack '(?<=This document describes chunkin-nginx-module v)\d+\.\d+' README - diff --git a/debian/modules/chunkin-nginx-module/util/update-readme.sh b/debian/modules/chunkin-nginx-module/util/update-readme.sh deleted file mode 100755 index e21d5b6..0000000 --- a/debian/modules/chunkin-nginx-module/util/update-readme.sh +++ /dev/null @@ -1,4 +0,0 @@ -#!/bin/bash - -perl util/wiki2pod.pl doc/readme.wiki > /tmp/a.pod && pod2text /tmp/a.pod > README - diff --git a/debian/modules/headers-more-nginx-module/README b/debian/modules/headers-more-nginx-module/README deleted file mode 100644 index 61579d0..0000000 --- a/debian/modules/headers-more-nginx-module/README +++ /dev/null @@ -1,520 +0,0 @@ -Name - ngx_headers_more - Set and clear input and output headers...more than - "add"! - - *This module is not distributed with the Nginx source.* See the - installation instructions. - -Version - This document describes headers-more-nginx-module v0.16 - () released on - 16 January 2012. - -Synopsis - # set the Server output header - more_set_headers 'Server: my-server'; - - # set and clear output headers - location /bar { - more_set_headers 'X-MyHeader: blah' 'X-MyHeader2: foo'; - more_set_headers -t 'text/plain text/css' 'Content-Type: text/foo'; - more_set_headers -s '400 404 500 503' -s 413 'Foo: Bar'; - more_clear_headers 'Transfer-Encoding' 'Content-Type'; - - # your proxy_pass/memcached_pass/or any other config goes here... - } - - # set output headers - location /type { - more_set_headers 'Content-Type: text/plain'; - # ... - } - - # set input headers - location /foo { - set $my_host 'my dog'; - more_set_input_headers 'Host: $my_host'; - more_set_input_headers -t 'text/plain' 'X-Foo: bah'; - - # now $host and $http_host have their new values... - # ... - } - - # replace input header X-Foo *only* if it already exists - more_set_input_headers -r 'X-Foo: howdy'; - -Description - This 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". - - It also allows you to specify an optional HTTP status code criteria - using the "-s" option and an optional content type criteria using the - "-t" option while modifying the output headers with the more_set_headers - and more_clear_headers directives. For example, - - more_set_headers -s 404 -t 'text/html' 'X-Foo: Bar'; - - Input headers can be modified as well. For example - - location /foo { - more_set_input_headers 'Host: foo' 'User-Agent: faked'; - # now $host, $http_host, $user_agent, and - # $http_user_agent all have their new values. - } - - The option "-t" is also available in the more_set_input_headers and - more_clear_input_headers directives (for request header filtering) while - the "-s" option is not allowed. - - Unlike the standard headers module, this module's directives will by - default apply to all the status codes, including "4xx" and "5xx". - -Directives - more_set_headers - syntax: *more_set_headers [-t ]... [-s ]... ...* - - default: *no* - - context: *http, server, location, location if* - - phase: *output-header-filter* - - Adds or replaces the specified output headers when the response status - code matches the codes specified by the "-s" option *AND* the response - content type matches the types specified by the "-t" option. - - If either "-s" or "-t" is not specified or has an empty list value, then - no match is required. Therefore, the following directive set the - "Server" output header to the custom value for *any* status code and - *any* content type: - - more_set_headers "Server: my_server"; - - A single directive can set/add multiple output headers. For example - - more_set_headers 'Foo: bar' 'Baz: bah'; - - Multiple occurrences of the options are allowed in a single directive. - Their values will be merged together. For instance - - more_set_headers -s 404 -s '500 503' 'Foo: bar'; - - is equivalent to - - more_set_headers -s '404 500 503' 'Foo: bar'; - - The new header should be the one of the forms: - - 1. "Name: Value" - - 2. "Name: " - - 3. "Name" - - The last two effectively clear the value of the header "Name". - - Nginx variables are allowed in header values. For example: - - set $my_var "dog"; - more_set_headers "Server: $my_var"; - - But variables won't work in header keys due to performance - considerations. - - Multiple set/clear header directives are allowed in a single location, - and they're executed sequentially. - - Directives inherited from an upper level scope (say, http block or - server blocks) are executed before the directives in the location block. - - Note that although "more_set_headers" is allowed in *location* if - blocks, it is *not* allowed in the *server* if blocks, as in - - ? # This is NOT allowed! - ? server { - ? if ($args ~ 'download') { - ? more_set_headers 'Foo: Bar'; - ? } - ? ... - ? } - - Behind the scene, use of this directive and its friend - more_clear_headers will (lazily) register an ouput header filter that - modifies "r->headers_out" the way you specify. - - more_clear_headers - syntax: *more_clear_headers [-t ]... [-s ]... ...* - - default: *no* - - context: *http, server, location, location if* - - phase: *output-header-filter* - - Clears the specified output headers. - - In fact, - - more_clear_headers -s 404 -t 'text/plain' Foo Baz; - - is exactly equivalent to - - more_set_headers -s 404 -t 'text/plain' "Foo: " "Baz: "; - - or - - more_set_headers -s 404 -t 'text/plain' Foo Baz - - See more_set_headers for more details. - - Wildcard "*" can also be used to specify a header name pattern. For - example, the following directive effectively clears *any* output headers - starting by ""X-Hidden-"": - - more_clear_headers 'X-Hidden-*'; - - The "*" wildcard support was first introduced in v0.09. - - more_set_input_headers - syntax: *more_set_input_headers [-r] [-t ]... - ...* - - default: *no* - - context: *http, server, location, location if* - - phase: *rewrite tail* - - Very much like more_set_headers except that it operates on input headers - (or request headers) and it only supports the "-t" option. - - Behind the scene, use of this directive and its friend - more_clear_input_headers will (lazily) register a "rewrite phase" - handler that modifies "r->headers_in" the way you specify. Note that it - always run at the *end* of the "rewrite" so that it runs *after* the - standard [module (HttpRewriteModule)] and works in subrequests as well. - - If the "-r" option is specified, then the headers will be replaced to - the new values *only if* they already exist. - - more_clear_input_headers - syntax: *more_clear_input_headers [-t ]... - ...* - - default: *no* - - context: *http, server, location, location if* - - phase: *rewrite tail* - - Clears the specified input headers. - - In fact, - - more_clear_input_headers -s 404 -t 'text/plain' Foo Baz; - - is exactly equivalent to - - more_set_input_headers -s 404 -t 'text/plain' "Foo: " "Baz: "; - - or - - more_set_input_headers -s 404 -t 'text/plain' Foo Baz - - See more_set_input_headers for more details. - -Limitations - * Unlike the standard headers module, this module does not - automatically take care of the constraint among the "Expires", - "Cache-Control", and "Last-Modified" headers. You have to get them - right yourself or use the headers module together with this module. - -Installation - Grab the nginx source code from nginx.org (), for - example, the version 1.0.11 (see nginx compatibility), and then build - the source with this module: - - wget 'http://nginx.org/download/nginx-1.0.11.tar.gz' - tar -xzvf nginx-1.0.11.tar.gz - cd nginx-1.0.11/ - - # Here we assume you would install you nginx under /opt/nginx/. - ./configure --prefix=/opt/nginx \ - --add-module=/path/to/headers-more-nginx-module - - make - make install - - Download the latest version of the release tarball of this module from - headers-more-nginx-module file list - (). - - Also, this module is included and enabled by default in the - ngx_openresty bundle (). - -Compatibility - The following versions of Nginx should work with this module: - - * 1.1.x (last tested: 1.1.5) - - * 1.0.x (last tested: 1.0.11) - - * 0.9.x (last tested: 0.9.4) - - * 0.8.x (last tested: 0.8.54) - - * 0.7.x >= 0.7.44 (last tested: 0.7.68) - - Earlier versions of Nginx like 0.6.x and 0.5.x will *not* work. - - If you find that any particular version of Nginx above 0.7.44 does not - work with this module, please consider reporting a bug. - -Report Bugs - Although a lot of effort has been put into testing and code tuning, - there must be some serious bugs lurking somewhere in this module. So - whenever you are bitten by any quirks, please don't hesitate to - - 1. send a bug report or even patches to , - - 2. or create a ticket on the issue tracking interface - () - provided by GitHub. - -Source Repository - Available on github at agentzh/headers-more-nginx-module - (). - -ChangeLog - v0.16 - January 16, 2012 - - * bugfix: the on-demand handler/filter registration mechanism did not - work fully for config reload via the "HUP" signal. - - * bugfix: when setting a multi-value response header to a single - value, the single value might be repeated on each old value. - - * feature: added some debugging outputs that can be enabled by the - "--with-debug" option when building nginx or ngx_openresty - (). - - * bugfix: we should set header hash using "ngx_hash_key_lc", not - simply to 1. - - * bugfix: Setting "Cache-Control" response headers might not work with - other nginx output filter modules because we did not properly - prepare the "r->cache_control" array at the same time. - - * bugfix: more_set_input_headers and more_clear_input_headers did not - handle the "Accept-Encoding" request headers properly. thanks 天街夜色. - - * bugfix: the more_set_input_headers directive might cause invalid - memory reads because Nginx request header values must be null - terminated. thanks Maxim Dounin. - - * bugfix: removing builtin headers in huge request headers with 20+ - entries could result in data loss. thanks Chris Dumoulin for the - patch in github issue #6 - (). - - v0.15 - July 06, 2011 - - * now more_set_headers supports overriding charset in Content-Type. - thanks ML. - - * fixed an issue in more_clear_headers: we should remove all the - instances of the headers specified, not only the first occurrence. - thanks Li Yang. - - * back-ported a bugfix from ngx_lua: in output header set, we should - always set the header->hash to 1. thanks moodydeath for reporting - it. - - * fixed a bug when clearing the Accept-Ranges header. thanks Bo - Blangstrup. - - v0.14 - January 25, 2011 - - * now we postpone the rewrite phase handler only once rather than on - every main request previously. this will save some CPU cycles on - every request if more_set_input_headers or more_clear_input_headers - are used. - - * fixed two spots where we did not check against null pointers when - out of memory. - - * now we use the 2-clause bsd license instead. - - * various coding style fixes. - - v0.13 - July 07, 2010 - - * fixed a bug in rewrite phase postponing algorithm which may cause - ngx_eval ()'s eval block - running *after* ngx_rewrite - ()'s directives. thanks - Liseen Wan (xunxin). - - v0.12 - June 22, 2010 - - * fixed a bug in the Content-Type output header setting handler. we - should always clear "r->headers_out.content_type_lowcase", or it'll - confuse output filters like that of the gzip module. - - v0.11 - June 08, 2010 - - * fixed the variables-in-Range-header issue in more_set_input_headers - reported by Alexander Vetrin. - - v0.10 - June 06, 2010 - - * now we can remove an input and output header *completely*, including - both custom and builtin headers. - - v0.09 - June 02, 2010 - - * fixed a memory initialization issue for more_set_input_headers - without the "-r" option, we should always initialize "hv.replace" - even when replace == 0. This may result in server segfaults and was - introduced in v0.08. - - * implemented wildcard support in more_clear_headers. Thanks Bernd - Dorn. - - v0.08 - March 12, 2010 - - * applied the patch from Bernd Dorn to add the "-r" option to the - more_set_input_headers directive. - - v0.07 - December 24, 2009 - - * fixed the more_clear_headers directive for builtin headers like - "Server" and "Last-Modified" by always inserting an empty header - when absent. Thanks Sebastiaan Deckers for reporting it. - - v0.06 - December 15, 2009 - - * now the input header handler runs at the *end* of the "rewrite - phase" such that it works in subrequests by default. - - v0.05 - November 18, 2009 - - * fixed variables in more_set_input_headers by registering the handler - in the "access phase" instead of the "rewrite" phase. - -Test Suite - This module comes with a Perl-driven test suite. The test cases - () - are declarative - () too. Thanks to the Test::Nginx - () module in the Perl world. - - To run it on your side: - - $ PATH=/path/to/your/nginx-with-headers-more-module:$PATH prove -r t - - To run the test suite with valgrind's memcheck, use the following - commands: - - $ export PATH=/path/to/your/nginx-with-headers-more-module:$PATH - $ TEST_NGINX_USE_VALGRIND=1 prove -r t - - You need to terminate any Nginx processes before running the test suite - if you have changed the Nginx server binary. - - Because a single nginx server (by default, "localhost:1984") is used - across all the test scripts (".t" files), it's meaningless to run the - test suite in parallel by specifying "-jN" when invoking the "prove" - utility. - - Some parts of the test suite requires modules proxy, rewrite, and echo - to be enabled as well when building Nginx. - -TODO - * Support variables in new headers' keys. - -Getting involved - You'll be very welcomed to submit patches to the author or just ask for - a commit bit to the source repository on GitHub. - -Authors - * Zhang "agentzh" Yichun (章亦春) ** - - * Bernd Dorn ( http://www.lovelysystems.com/ ) - - This wiki page is also maintained by the author himself, and everybody - is encouraged to improve this page as well. - -Copyright & License - The code base is borrowed directly from the standard headers module in - Nginx 0.8.24. This part of code is copyrighted by Igor Sysoev. - - Copyright (c) 2009, 2010, 2011, Taobao Inc., Alibaba Group ( - http://www.taobao.com ). - - Copyright (c) 2009, 2010, 2011, Zhang "agentzh" Yichun (章亦春) - . - - Copyright (c) 2010, 2011, Bernd Dorn. - - This module is licensed under the terms of the BSD license. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are - met: - - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - - * 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 - HOLDER 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 - * The original thread on the Nginx mailing list that inspires this - module's development: "A question about add_header replication" - (). - - * The orginal announcement thread on the Nginx mailing list: "The - "headers_more" module: Set and clear output headers...more than - 'add'!" (). - - * The original blog post - () about this module's initial development. - - * The [module (HttpEchoModule)] for Nginx module's automated testing. - - * The standard headers module. - diff --git a/debian/modules/headers-more-nginx-module/README.markdown b/debian/modules/headers-more-nginx-module/README.markdown deleted file mode 100644 index ca192e6..0000000 --- a/debian/modules/headers-more-nginx-module/README.markdown +++ /dev/null @@ -1,491 +0,0 @@ -Name -==== - -**ngx_headers_more** - Set and clear input and output headers...more than "add"! - -*This module is not distributed with the Nginx source.* See [the installation instructions](http://wiki.nginx.org/HttpHeadersMoreModule#Installation). - -Version -======= - -This document describes headers-more-nginx-module [v0.16](http://github.com/agentzh/headers-more-nginx-module/tags) released on 16 January 2012. - -Synopsis -======== - - - # set the Server output header - more_set_headers 'Server: my-server'; - - # set and clear output headers - location /bar { - more_set_headers 'X-MyHeader: blah' 'X-MyHeader2: foo'; - more_set_headers -t 'text/plain text/css' 'Content-Type: text/foo'; - more_set_headers -s '400 404 500 503' -s 413 'Foo: Bar'; - more_clear_headers 'Transfer-Encoding' 'Content-Type'; - - # your proxy_pass/memcached_pass/or any other config goes here... - } - - # set output headers - location /type { - more_set_headers 'Content-Type: text/plain'; - # ... - } - - # set input headers - location /foo { - set $my_host 'my dog'; - more_set_input_headers 'Host: $my_host'; - more_set_input_headers -t 'text/plain' 'X-Foo: bah'; - - # now $host and $http_host have their new values... - # ... - } - - # replace input header X-Foo *only* if it already exists - more_set_input_headers -r 'X-Foo: howdy'; - - -Description -=========== - -This 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](http://wiki.nginx.org/HttpHeadersModule) module because it provides more utilities like -resetting or clearing "builtin headers" like `Content-Type`, -`Content-Length`, and `Server`. - -It also allows you to specify an optional HTTP status code -criteria using the `-s` option and an optional content -type criteria using the `-t` option while modifying the -output headers with the [more_set_headers](http://wiki.nginx.org/HttpHeadersMoreModule#more_set_headers) and -[more_clear_headers](http://wiki.nginx.org/HttpHeadersMoreModule#more_clear_headers) directives. For example, - - - more_set_headers -s 404 -t 'text/html' 'X-Foo: Bar'; - - -Input headers can be modified as well. For example - - - location /foo { - more_set_input_headers 'Host: foo' 'User-Agent: faked'; - # now $host, $http_host, $user_agent, and - # $http_user_agent all have their new values. - } - - -The option `-t` is also available in the -[more_set_input_headers](http://wiki.nginx.org/HttpHeadersMoreModule#more_set_input_headers) and -[more_clear_input_headers](http://wiki.nginx.org/HttpHeadersMoreModule#more_clear_input_headers) directives (for request header filtering) while the `-s` option -is not allowed. - -Unlike the standard [headers](http://wiki.nginx.org/HttpHeadersModule) module, this module's directives will by -default apply to all the status codes, including `4xx` and `5xx`. - -Directives -========== - -more_set_headers ----------------- -**syntax:** *more_set_headers [-t <content-type list>]... [-s <status-code list>]... <new-header>...* - -**default:** *no* - -**context:** *http, server, location, location if* - -**phase:** *output-header-filter* - -Adds or replaces the specified output headers when the response status code matches the codes specified by the `-s` option *AND* the response content type matches the types specified by the `-t` option. - -If either `-s` or `-t` is not specified or has an empty list value, then no match is required. Therefore, the following directive set the `Server` output header to the custom value for *any* status code and *any* content type: - - - more_set_headers "Server: my_server"; - - -A single directive can set/add multiple output headers. For example - - - more_set_headers 'Foo: bar' 'Baz: bah'; - - -Multiple occurrences of the options are allowed in a single directive. Their values will be merged together. For instance - - - more_set_headers -s 404 -s '500 503' 'Foo: bar'; - - -is equivalent to - - - more_set_headers -s '404 500 503' 'Foo: bar'; - - -The new header should be the one of the forms: - -1. `Name: Value` -1. `Name: ` -1. `Name` - -The last two effectively clear the value of the header `Name`. - -Nginx variables are allowed in header values. For example: - - - set $my_var "dog"; - more_set_headers "Server: $my_var"; - - -But variables won't work in header keys due to performance considerations. - -Multiple set/clear header directives are allowed in a single location, and they're executed sequentially. - -Directives inherited from an upper level scope (say, http block or server blocks) are executed before the directives in the location block. - -Note that although `more_set_headers` is allowed in *location* if blocks, it is *not* allowed in the *server* if blocks, as in - - - ? # This is NOT allowed! - ? server { - ? if ($args ~ 'download') { - ? more_set_headers 'Foo: Bar'; - ? } - ? ... - ? } - - -Behind the scene, use of this directive and its friend [more_clear_headers](http://wiki.nginx.org/HttpHeadersMoreModule#more_clear_headers) will (lazily) register an ouput header filter that modifies `r->headers_out` the way you specify. - -more_clear_headers ------------------- -**syntax:** *more_clear_headers [-t <content-type list>]... [-s <status-code list>]... <new-header>...* - -**default:** *no* - -**context:** *http, server, location, location if* - -**phase:** *output-header-filter* - -Clears the specified output headers. - -In fact, - - - more_clear_headers -s 404 -t 'text/plain' Foo Baz; - - -is exactly equivalent to - - - more_set_headers -s 404 -t 'text/plain' "Foo: " "Baz: "; - - -or - - - more_set_headers -s 404 -t 'text/plain' Foo Baz - - -See [more_set_headers](http://wiki.nginx.org/HttpHeadersMoreModule#more_set_headers) for more details. - -Wildcard `*` can also be used to specify a header name pattern. For example, the following directive effectively clears *any* output headers starting by "`X-Hidden-`": - - - more_clear_headers 'X-Hidden-*'; - - -The `*` wildcard support was first introduced in [v0.09](http://wiki.nginx.org/HttpHeadersMoreModule#v0.09). - -more_set_input_headers ----------------------- -**syntax:** *more_set_input_headers [-r] [-t <content-type list>]... <new-header>...* - -**default:** *no* - -**context:** *http, server, location, location if* - -**phase:** *rewrite tail* - -Very much like [more_set_headers](http://wiki.nginx.org/HttpHeadersMoreModule#more_set_headers) except that it operates on input headers (or request headers) and it only supports the `-t` option. - -Behind the scene, use of this directive and its friend [more_clear_input_headers](http://wiki.nginx.org/HttpHeadersMoreModule#more_clear_input_headers) will (lazily) register a `rewrite phase` handler that modifies `r->headers_in` the way you specify. Note that it always run at the *end* of the `rewrite` so that it runs *after* the standard [rewrite module](http://wiki.nginx.org/HttpRewriteModule) and works in subrequests as well. - -If the `-r` option is specified, then the headers will be replaced to the new values *only if* they already exist. - -more_clear_input_headers ------------------------- -**syntax:** *more_clear_input_headers [-t <content-type list>]... <new-header>...* - -**default:** *no* - -**context:** *http, server, location, location if* - -**phase:** *rewrite tail* - -Clears the specified input headers. - -In fact, - - - more_clear_input_headers -s 404 -t 'text/plain' Foo Baz; - - -is exactly equivalent to - - - more_set_input_headers -s 404 -t 'text/plain' "Foo: " "Baz: "; - - -or - - - more_set_input_headers -s 404 -t 'text/plain' Foo Baz - - -See [more_set_input_headers](http://wiki.nginx.org/HttpHeadersMoreModule#more_set_input_headers) for more details. - -Limitations -=========== - -* Unlike the standard [headers](http://wiki.nginx.org/HttpHeadersModule) module, this module does not automatically take care of the constraint among the `Expires`, `Cache-Control`, and `Last-Modified` headers. You have to get them right yourself or use the [headers](http://wiki.nginx.org/HttpHeadersModule) module together with this module. - -Installation -============ - -Grab the nginx source code from [nginx.org](http://nginx.org/), for example, -the version 1.0.11 (see [nginx compatibility](http://wiki.nginx.org/HttpHeadersMoreModule#Compatibility)), and then build the source with this module: - - - wget 'http://nginx.org/download/nginx-1.0.11.tar.gz' - tar -xzvf nginx-1.0.11.tar.gz - cd nginx-1.0.11/ - - # Here we assume you would install you nginx under /opt/nginx/. - ./configure --prefix=/opt/nginx \ - --add-module=/path/to/headers-more-nginx-module - - make - make install - - -Download the latest version of the release tarball of this module from [headers-more-nginx-module file list](http://github.com/agentzh/headers-more-nginx-module/tags). - -Also, this module is included and enabled by default in the [ngx_openresty bundle](http://openresty.org). - -Compatibility -============= - -The following versions of Nginx should work with this module: - -* **1.1.x** (last tested: 1.1.5) -* **1.0.x** (last tested: 1.0.11) -* **0.9.x** (last tested: 0.9.4) -* **0.8.x** (last tested: 0.8.54) -* **0.7.x >= 0.7.44** (last tested: 0.7.68) - -Earlier versions of Nginx like 0.6.x and 0.5.x will *not* work. - -If you find that any particular version of Nginx above 0.7.44 does not work with this module, please consider [reporting a bug](http://wiki.nginx.org/HttpHeadersMoreModule#Report_Bugs). - -Report Bugs -=========== - -Although a lot of effort has been put into testing and code tuning, there must be some serious bugs lurking somewhere in this module. So whenever you are bitten by any quirks, please don't hesitate to - -1. send a bug report or even patches to , -1. or create a ticket on the [issue tracking interface](http://github.com/agentzh/headers-more-nginx-module/issues) provided by GitHub. - -Source Repository -================= - -Available on github at [agentzh/headers-more-nginx-module](http://github.com/agentzh/headers-more-nginx-module). - -ChangeLog -========= - -v0.16 ------ - -January 16, 2012 - -* bugfix: the on-demand handler/filter registration mechanism did not work fully for config reload via the `HUP` signal. -* bugfix: when setting a multi-value response header to a single value, the single value might be repeated on each old value. -* feature: added some debugging outputs that can be enabled by the `--with-debug` option when building nginx or [ngx_openresty](http://openresty.org). -* bugfix: we should set header hash using `ngx_hash_key_lc`, not simply to `1`. -* bugfix: Setting `Cache-Control` response headers might not work with other nginx output filter modules because we did not properly prepare the `r->cache_control` array at the same time. -* bugfix: [more_set_input_headers](http://wiki.nginx.org/HttpHeadersMoreModule#more_set_input_headers) and [more_clear_input_headers](http://wiki.nginx.org/HttpHeadersMoreModule#more_clear_input_headers) did not handle the `Accept-Encoding` request headers properly. thanks 天街夜色. -* bugfix: the [more_set_input_headers](http://wiki.nginx.org/HttpHeadersMoreModule#more_set_input_headers) directive might cause invalid memory reads because Nginx request header values must be null terminated. thanks Maxim Dounin. -* bugfix: removing builtin headers in huge request headers with 20+ entries could result in data loss. thanks Chris Dumoulin for the patch in [github issue #6](https://github.com/agentzh/headers-more-nginx-module/issues/6). - -v0.15 ------ - -July 06, 2011 - -* now more_set_headers supports overriding charset in Content-Type. thanks ML. -* fixed an issue in more_clear_headers: we should remove all the instances of the headers specified, not only the first occurrence. thanks Li Yang. -* back-ported a bugfix from ngx_lua: in output header set, we should always set the header->hash to 1. thanks moodydeath for reporting it. -* fixed a bug when clearing the Accept-Ranges header. thanks Bo Blangstrup. - -v0.14 ------ - -January 25, 2011 - -* now we postpone the rewrite phase handler only once rather than on every main request previously. this will save some CPU cycles on every request if [more_set_input_headers](http://wiki.nginx.org/HttpHeadersMoreModule#more_set_input_headers) or [more_clear_input_headers](http://wiki.nginx.org/HttpHeadersMoreModule#more_clear_input_headers) are used. -* fixed two spots where we did not check against null pointers when out of memory. -* now we use the 2-clause bsd license instead. -* various coding style fixes. - -v0.13 ------ - -July 07, 2010 - -* fixed a bug in rewrite phase postponing algorithm which may cause [ngx_eval](http://www.grid.net.ru/nginx/eval.en.html)'s eval block running *after* [ngx_rewrite](http://wiki.nginx.org/HttpRewriteModule)'s directives. thanks Liseen Wan (xunxin). - -v0.12 ------ - -June 22, 2010 - -* fixed a bug in the Content-Type output header setting handler. we should always clear `r->headers_out.content_type_lowcase`, or it'll confuse output filters like that of the gzip module. - -v0.11 ------ - -June 08, 2010 - -* fixed the variables-in-Range-header issue in [more_set_input_headers](http://wiki.nginx.org/HttpHeadersMoreModule#more_set_input_headers) reported by Alexander Vetrin. - -v0.10 ------ - -June 06, 2010 - -* now we can remove an input and output header *completely*, including both custom and builtin headers. - -v0.09 ------ - -June 02, 2010 - -* fixed a memory initialization issue for [more_set_input_headers](http://wiki.nginx.org/HttpHeadersMoreModule#more_set_input_headers) without the `-r` option, we should always initialize `hv.replace` even when replace == 0. This may result in server segfaults and was introduced in [v0.08](http://wiki.nginx.org/HttpHeadersMoreModule#v0.08). -* implemented wildcard support in [more_clear_headers](http://wiki.nginx.org/HttpHeadersMoreModule#more_clear_headers). Thanks Bernd Dorn. - -v0.08 ------ - -March 12, 2010 - -* applied the patch from Bernd Dorn to add the `-r` option to the [more_set_input_headers](http://wiki.nginx.org/HttpHeadersMoreModule#more_set_input_headers) directive. - -v0.07 ------ - -December 24, 2009 - -* fixed the [more_clear_headers](http://wiki.nginx.org/HttpHeadersMoreModule#more_clear_headers) directive for builtin headers like `Server` and `Last-Modified` by always inserting an empty header when absent. Thanks Sebastiaan Deckers for reporting it. - -v0.06 ------ - -December 15, 2009 - -* now the input header handler runs at the *end* of the `rewrite phase` such that it works in subrequests by default. - -v0.05 ------ - -November 18, 2009 - -* fixed variables in [more_set_input_headers](http://wiki.nginx.org/HttpHeadersMoreModule#more_set_input_headers) by registering the handler in the `access phase` instead of the `rewrite` phase. - -Test Suite -========== - -This module comes with a Perl-driven test suite. The [test cases](http://github.com/agentzh/headers-more-nginx-module/tree/master/t/) are -[declarative](http://github.com/agentzh/headers-more-nginx-module/blob/master/t/sanity.t) too. Thanks to the [Test::Nginx](http://search.cpan.org/perldoc?Test::Nginx) module in the Perl world. - -To run it on your side: - - - $ PATH=/path/to/your/nginx-with-headers-more-module:$PATH prove -r t - - -To run the test suite with valgrind's memcheck, use the following commands: - - - $ export PATH=/path/to/your/nginx-with-headers-more-module:$PATH - $ TEST_NGINX_USE_VALGRIND=1 prove -r t - - -You need to terminate any Nginx processes before running the test suite if you have changed the Nginx server binary. - -Because a single nginx server (by default, `localhost:1984`) is used across all the test scripts (`.t` files), it's meaningless to run the test suite in parallel by specifying `-jN` when invoking the `prove` utility. - -Some parts of the test suite requires modules [proxy](http://wiki.nginx.org/HttpProxyModule), [rewrite](http://wiki.nginx.org/HttpRewriteModule), and [echo](http://wiki.nginx.org/HttpEchoModule) to be enabled as well when building Nginx. - -TODO -==== - -* Support variables in new headers' keys. - -Getting involved -================ - -You'll be very welcomed to submit patches to the [author](http://wiki.nginx.org/HttpHeadersMoreModule#Author) or just ask for a commit bit to the [source repository](http://wiki.nginx.org/HttpHeadersMoreModule#Source_Repository) on GitHub. - -Authors -======= - -* Zhang "agentzh" Yichun (章亦春) *<agentzh@gmail.com>* -* Bernd Dorn ( ) - -This wiki page is also maintained by the author himself, and everybody is encouraged to improve this page as well. - -Copyright & License -=================== - -The code base is borrowed directly from the standard [headers](http://wiki.nginx.org/HttpHeadersModule) module in Nginx 0.8.24. This part of code is copyrighted by Igor Sysoev. - -Copyright (c) 2009, 2010, 2011, Taobao Inc., Alibaba Group ( ). - -Copyright (c) 2009, 2010, 2011, Zhang "agentzh" Yichun (章亦春) . - -Copyright (c) 2010, 2011, Bernd Dorn. - -This module is licensed under the terms of the BSD license. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions -are met: - -* Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. -* 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 -HOLDER 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 -======== - -* The original thread on the Nginx mailing list that inspires this module's development: ["A question about add_header replication"](http://forum.nginx.org/read.php?2,11206,11738). -* The orginal announcement thread on the Nginx mailing list: ["The "headers_more" module: Set and clear output headers...more than 'add'!"](http://forum.nginx.org/read.php?2,23460). -* The original [blog post](http://agentzh.blogspot.com/2009/11/headers-more-module-scripting-input-and.html) about this module's initial development. -* The [echo module](http://wiki.nginx.org/HttpEchoModule) for Nginx module's automated testing. -* The standard [headers](http://wiki.nginx.org/HttpHeadersModule) module. - diff --git a/debian/modules/headers-more-nginx-module/config b/debian/modules/headers-more-nginx-module/config deleted file mode 100644 index d92baea..0000000 --- a/debian/modules/headers-more-nginx-module/config +++ /dev/null @@ -1,5 +0,0 @@ -ngx_addon_name=ngx_http_headers_more_filter_module -HTTP_AUX_FILTER_MODULES="$HTTP_AUX_FILTER_MODULES ngx_http_headers_more_filter_module" -NGX_ADDON_SRCS="$NGX_ADDON_SRCS $ngx_addon_dir/src/ngx_http_headers_more_filter_module.c $ngx_addon_dir/src/ngx_http_headers_more_headers_out.c $ngx_addon_dir/src/ngx_http_headers_more_headers_in.c $ngx_addon_dir/src/ngx_http_headers_more_util.c" -NGX_ADDON_DEPS="$NGX_ADDON_DEPS $ngx_addon_dir/src/ddebug.h $ngx_addon_dir/src/ngx_http_headers_more_filter_module.h $ngx_addon_dir/src/ngx_http_headers_more_headers_in.h $ngx_addon_dir/src/ngx_http_headers_more_headers_out.h $ngx_addon_dir/src/ngx_http_headers_more_headers_in.h $ngx_addon_dir/src/ngx_http_headers_more_util.h" - diff --git a/debian/modules/headers-more-nginx-module/doc/HttpHeadersMoreModule.wiki b/debian/modules/headers-more-nginx-module/doc/HttpHeadersMoreModule.wiki deleted file mode 100644 index a636b2c..0000000 --- a/debian/modules/headers-more-nginx-module/doc/HttpHeadersMoreModule.wiki +++ /dev/null @@ -1,458 +0,0 @@ -= Name = - -'''ngx_headers_more''' - Set and clear input and output headers...more than "add"! - -''This module is not distributed with the Nginx source.'' See [[#Installation|the installation instructions]]. - -= Version = - -This document describes headers-more-nginx-module [http://github.com/agentzh/headers-more-nginx-module/tags v0.16] released on 16 January 2012. - -= Synopsis = - - - # set the Server output header - more_set_headers 'Server: my-server'; - - # set and clear output headers - location /bar { - more_set_headers 'X-MyHeader: blah' 'X-MyHeader2: foo'; - more_set_headers -t 'text/plain text/css' 'Content-Type: text/foo'; - more_set_headers -s '400 404 500 503' -s 413 'Foo: Bar'; - more_clear_headers 'Transfer-Encoding' 'Content-Type'; - - # your proxy_pass/memcached_pass/or any other config goes here... - } - - # set output headers - location /type { - more_set_headers 'Content-Type: text/plain'; - # ... - } - - # set input headers - location /foo { - set $my_host 'my dog'; - more_set_input_headers 'Host: $my_host'; - more_set_input_headers -t 'text/plain' 'X-Foo: bah'; - - # now $host and $http_host have their new values... - # ... - } - - # replace input header X-Foo *only* if it already exists - more_set_input_headers -r 'X-Foo: howdy'; - - -= Description = - -This module allows you to add, set, or clear any output -or input header that you specify. - -This is an enhanced version of the standard -[[HttpHeadersModule|headers]] module because it provides more utilities like -resetting or clearing "builtin headers" like Content-Type, -Content-Length, and Server. - -It also allows you to specify an optional HTTP status code -criteria using the -s option and an optional content -type criteria using the -t option while modifying the -output headers with the [[#more_set_headers|more_set_headers]] and -[[#more_clear_headers|more_clear_headers]] directives. For example, - - - more_set_headers -s 404 -t 'text/html' 'X-Foo: Bar'; - - -Input headers can be modified as well. For example - - - location /foo { - more_set_input_headers 'Host: foo' 'User-Agent: faked'; - # now $host, $http_host, $user_agent, and - # $http_user_agent all have their new values. - } - - -The option -t is also available in the -[[#more_set_input_headers|more_set_input_headers]] and -[[#more_clear_input_headers|more_clear_input_headers]] directives (for request header filtering) while the -s option -is not allowed. - -Unlike the standard [[HttpHeadersModule|headers]] module, this module's directives will by -default apply to all the status codes, including 4xx and 5xx. - -= Directives = - -== more_set_headers == -'''syntax:''' ''more_set_headers [-t ]... [-s ]... ...'' - -'''default:''' ''no'' - -'''context:''' ''http, server, location, location if'' - -'''phase:''' ''output-header-filter'' - -Adds or replaces the specified output headers when the response status code matches the codes specified by the -s option ''AND'' the response content type matches the types specified by the -t option. - -If either -s or -t is not specified or has an empty list value, then no match is required. Therefore, the following directive set the Server output header to the custom value for ''any'' status code and ''any'' content type: - - - more_set_headers "Server: my_server"; - - -A single directive can set/add multiple output headers. For example - - - more_set_headers 'Foo: bar' 'Baz: bah'; - - -Multiple occurrences of the options are allowed in a single directive. Their values will be merged together. For instance - - - more_set_headers -s 404 -s '500 503' 'Foo: bar'; - - -is equivalent to - - - more_set_headers -s '404 500 503' 'Foo: bar'; - - -The new header should be the one of the forms: - -# Name: Value -# Name: -# Name - -The last two effectively clear the value of the header Name. - -Nginx variables are allowed in header values. For example: - - - set $my_var "dog"; - more_set_headers "Server: $my_var"; - - -But variables won't work in header keys due to performance considerations. - -Multiple set/clear header directives are allowed in a single location, and they're executed sequentially. - -Directives inherited from an upper level scope (say, http block or server blocks) are executed before the directives in the location block. - -Note that although more_set_headers is allowed in ''location'' if blocks, it is ''not'' allowed in the ''server'' if blocks, as in - - - ? # This is NOT allowed! - ? server { - ? if ($args ~ 'download') { - ? more_set_headers 'Foo: Bar'; - ? } - ? ... - ? } - - -Behind the scene, use of this directive and its friend [[#more_clear_headers|more_clear_headers]] will (lazily) register an ouput header filter that modifies r->headers_out the way you specify. - -== more_clear_headers == -'''syntax:''' ''more_clear_headers [-t ]... [-s ]... ...'' - -'''default:''' ''no'' - -'''context:''' ''http, server, location, location if'' - -'''phase:''' ''output-header-filter'' - -Clears the specified output headers. - -In fact, - - - more_clear_headers -s 404 -t 'text/plain' Foo Baz; - - -is exactly equivalent to - - - more_set_headers -s 404 -t 'text/plain' "Foo: " "Baz: "; - - -or - - - more_set_headers -s 404 -t 'text/plain' Foo Baz - - -See [[#more_set_headers|more_set_headers]] for more details. - -Wildcard * can also be used to specify a header name pattern. For example, the following directive effectively clears ''any'' output headers starting by "X-Hidden-": - - - more_clear_headers 'X-Hidden-*'; - - -The * wildcard support was first introduced in [[#v0.09|v0.09]]. - -== more_set_input_headers == -'''syntax:''' ''more_set_input_headers [-r] [-t ]... ...'' - -'''default:''' ''no'' - -'''context:''' ''http, server, location, location if'' - -'''phase:''' ''rewrite tail'' - -Very much like [[#more_set_headers|more_set_headers]] except that it operates on input headers (or request headers) and it only supports the -t option. - -Behind the scene, use of this directive and its friend [[#more_clear_input_headers|more_clear_input_headers]] will (lazily) register a rewrite phase handler that modifies r->headers_in the way you specify. Note that it always run at the ''end'' of the rewrite so that it runs ''after'' the standard [[HttpRewriteModule|rewrite module]] and works in subrequests as well. - -If the -r option is specified, then the headers will be replaced to the new values ''only if'' they already exist. - -== more_clear_input_headers == -'''syntax:''' ''more_clear_input_headers [-t ]... ...'' - -'''default:''' ''no'' - -'''context:''' ''http, server, location, location if'' - -'''phase:''' ''rewrite tail'' - -Clears the specified input headers. - -In fact, - - - more_clear_input_headers -s 404 -t 'text/plain' Foo Baz; - - -is exactly equivalent to - - - more_set_input_headers -s 404 -t 'text/plain' "Foo: " "Baz: "; - - -or - - - more_set_input_headers -s 404 -t 'text/plain' Foo Baz - - -See [[#more_set_input_headers|more_set_input_headers]] for more details. - -= Limitations = - -* Unlike the standard [[HttpHeadersModule|headers]] module, this module does not automatically take care of the constraint among the Expires, Cache-Control, and Last-Modified headers. You have to get them right yourself or use the [[HttpHeadersModule|headers]] module together with this module. - -= Installation = - -Grab the nginx source code from [http://nginx.org/ nginx.org], for example, -the version 1.0.11 (see [[#Compatibility|nginx compatibility]]), and then build the source with this module: - - - wget 'http://nginx.org/download/nginx-1.0.11.tar.gz' - tar -xzvf nginx-1.0.11.tar.gz - cd nginx-1.0.11/ - - # Here we assume you would install you nginx under /opt/nginx/. - ./configure --prefix=/opt/nginx \ - --add-module=/path/to/headers-more-nginx-module - - make - make install - - -Download the latest version of the release tarball of this module from [http://github.com/agentzh/headers-more-nginx-module/tags headers-more-nginx-module file list]. - -Also, this module is included and enabled by default in the [http://openresty.org ngx_openresty bundle]. - -= Compatibility = - -The following versions of Nginx should work with this module: - -* '''1.1.x''' (last tested: 1.1.5) -* '''1.0.x''' (last tested: 1.0.11) -* '''0.9.x''' (last tested: 0.9.4) -* '''0.8.x''' (last tested: 0.8.54) -* '''0.7.x >= 0.7.44''' (last tested: 0.7.68) - -Earlier versions of Nginx like 0.6.x and 0.5.x will ''not'' work. - -If you find that any particular version of Nginx above 0.7.44 does not work with this module, please consider [[#Report Bugs|reporting a bug]]. - -= Report Bugs = - -Although a lot of effort has been put into testing and code tuning, there must be some serious bugs lurking somewhere in this module. So whenever you are bitten by any quirks, please don't hesitate to - -# send a bug report or even patches to , -# or create a ticket on the [http://github.com/agentzh/headers-more-nginx-module/issues issue tracking interface] provided by GitHub. - -= Source Repository = - -Available on github at [http://github.com/agentzh/headers-more-nginx-module agentzh/headers-more-nginx-module]. - -= ChangeLog = - -== v0.16 == - -January 16, 2012 - -* bugfix: the on-demand handler/filter registration mechanism did not work fully for config reload via the HUP signal. -* bugfix: when setting a multi-value response header to a single value, the single value might be repeated on each old value. -* feature: added some debugging outputs that can be enabled by the --with-debug option when building nginx or [http://openresty.org ngx_openresty]. -* bugfix: we should set header hash using ngx_hash_key_lc, not simply to 1. -* bugfix: Setting Cache-Control response headers might not work with other nginx output filter modules because we did not properly prepare the r->cache_control array at the same time. -* bugfix: [[#more_set_input_headers|more_set_input_headers]] and [[#more_clear_input_headers|more_clear_input_headers]] did not handle the Accept-Encoding request headers properly. thanks 天街夜色. -* bugfix: the [[#more_set_input_headers|more_set_input_headers]] directive might cause invalid memory reads because Nginx request header values must be null terminated. thanks Maxim Dounin. -* bugfix: removing builtin headers in huge request headers with 20+ entries could result in data loss. thanks Chris Dumoulin for the patch in [https://github.com/agentzh/headers-more-nginx-module/issues/6 github issue #6]. - -== v0.15 == - -July 06, 2011 - -* now more_set_headers supports overriding charset in Content-Type. thanks ML. -* fixed an issue in more_clear_headers: we should remove all the instances of the headers specified, not only the first occurrence. thanks Li Yang. -* back-ported a bugfix from ngx_lua: in output header set, we should always set the header->hash to 1. thanks moodydeath for reporting it. -* fixed a bug when clearing the Accept-Ranges header. thanks Bo Blangstrup. - -== v0.14 == - -January 25, 2011 - -* now we postpone the rewrite phase handler only once rather than on every main request previously. this will save some CPU cycles on every request if [[#more_set_input_headers|more_set_input_headers]] or [[#more_clear_input_headers|more_clear_input_headers]] are used. -* fixed two spots where we did not check against null pointers when out of memory. -* now we use the 2-clause bsd license instead. -* various coding style fixes. - -== v0.13 == - -July 07, 2010 - -* fixed a bug in rewrite phase postponing algorithm which may cause [http://www.grid.net.ru/nginx/eval.en.html ngx_eval]'s eval block running ''after'' [http://wiki.nginx.org/HttpRewriteModule ngx_rewrite]'s directives. thanks Liseen Wan (xunxin). - -== v0.12 == - -June 22, 2010 - -* fixed a bug in the Content-Type output header setting handler. we should always clear r->headers_out.content_type_lowcase, or it'll confuse output filters like that of the gzip module. - -== v0.11 == - -June 08, 2010 - -* fixed the variables-in-Range-header issue in [[#more_set_input_headers|more_set_input_headers]] reported by Alexander Vetrin. - -== v0.10 == - -June 06, 2010 - -* now we can remove an input and output header ''completely'', including both custom and builtin headers. - -== v0.09 == - -June 02, 2010 - -* fixed a memory initialization issue for [[#more_set_input_headers|more_set_input_headers]] without the -r option, we should always initialize hv.replace even when replace == 0. This may result in server segfaults and was introduced in [[#v0.08|v0.08]]. -* implemented wildcard support in [[#more_clear_headers|more_clear_headers]]. Thanks Bernd Dorn. - -== v0.08 == - -March 12, 2010 - -* applied the patch from Bernd Dorn to add the -r option to the [[#more_set_input_headers|more_set_input_headers]] directive. - -== v0.07 == - -December 24, 2009 - -* fixed the [[#more_clear_headers|more_clear_headers]] directive for builtin headers like Server and Last-Modified by always inserting an empty header when absent. Thanks Sebastiaan Deckers for reporting it. - -== v0.06 == - -December 15, 2009 - -* now the input header handler runs at the ''end'' of the rewrite phase such that it works in subrequests by default. - -== v0.05 == - -November 18, 2009 - -* fixed variables in [[#more_set_input_headers|more_set_input_headers]] by registering the handler in the access phase instead of the rewrite phase. - -= Test Suite = - -This module comes with a Perl-driven test suite. The [http://github.com/agentzh/headers-more-nginx-module/tree/master/t/ test cases] are -[http://github.com/agentzh/headers-more-nginx-module/blob/master/t/sanity.t declarative] too. Thanks to the [http://search.cpan.org/perldoc?Test::Nginx Test::Nginx] module in the Perl world. - -To run it on your side: - - - $ PATH=/path/to/your/nginx-with-headers-more-module:$PATH prove -r t - - -To run the test suite with valgrind's memcheck, use the following commands: - - - $ export PATH=/path/to/your/nginx-with-headers-more-module:$PATH - $ TEST_NGINX_USE_VALGRIND=1 prove -r t - - -You need to terminate any Nginx processes before running the test suite if you have changed the Nginx server binary. - -Because a single nginx server (by default, localhost:1984) is used across all the test scripts (.t files), it's meaningless to run the test suite in parallel by specifying -jN when invoking the prove utility. - -Some parts of the test suite requires modules [[HttpProxyModule|proxy]], [[HttpRewriteModule|rewrite]], and [[HttpEchoModule|echo]] to be enabled as well when building Nginx. - -= TODO = - -* Support variables in new headers' keys. - -= Getting involved = - -You'll be very welcomed to submit patches to the [[#Author|author]] or just ask for a commit bit to the [[#Source Repository|source repository]] on GitHub. - -= Authors = - -* Zhang "agentzh" Yichun (章亦春) '''' -* Bernd Dorn ( http://www.lovelysystems.com/ ) - -This wiki page is also maintained by the author himself, and everybody is encouraged to improve this page as well. - -= Copyright & License = - -The code base is borrowed directly from the standard [[HttpHeadersModule|headers]] module in Nginx 0.8.24. This part of code is copyrighted by Igor Sysoev. - -Copyright (c) 2009, 2010, 2011, Taobao Inc., Alibaba Group ( http://www.taobao.com ). - -Copyright (c) 2009, 2010, 2011, Zhang "agentzh" Yichun (章亦春) . - -Copyright (c) 2010, 2011, Bernd Dorn. - -This module is licensed under the terms of the BSD license. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions -are met: - -* Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. -* 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 -HOLDER 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 = - -* The original thread on the Nginx mailing list that inspires this module's development: [http://forum.nginx.org/read.php?2,11206,11738 "A question about add_header replication"]. -* The orginal announcement thread on the Nginx mailing list: [http://forum.nginx.org/read.php?2,23460 "The "headers_more" module: Set and clear output headers...more than 'add'!"]. -* The original [http://agentzh.blogspot.com/2009/11/headers-more-module-scripting-input-and.html blog post] about this module's initial development. -* The [[HttpEchoModule|echo module]] for Nginx module's automated testing. -* The standard [[HttpHeadersModule|headers]] module. - diff --git a/debian/modules/headers-more-nginx-module/src/ngx_http_headers_more_headers_in.c b/debian/modules/headers-more-nginx-module/src/ngx_http_headers_more_headers_in.c deleted file mode 100644 index 424bedf..0000000 --- a/debian/modules/headers-more-nginx-module/src/ngx_http_headers_more_headers_in.c +++ /dev/null @@ -1,543 +0,0 @@ -/* Copyright (C) agentzh */ - -#ifndef DDEBUG -#define DDEBUG 0 -#endif -#include "ddebug.h" - -#include "ngx_http_headers_more_headers_in.h" -#include "ngx_http_headers_more_util.h" -#include - -/* config time */ - -static char * -ngx_http_headers_more_parse_directive(ngx_conf_t *cf, ngx_command_t *ngx_cmd, - void *conf, ngx_http_headers_more_opcode_t opcode); - -/* request time */ - -static ngx_flag_t ngx_http_headers_more_check_type(ngx_http_request_t *r, - ngx_array_t *types); - -static ngx_int_t ngx_http_set_header(ngx_http_request_t *r, - ngx_http_headers_more_header_val_t *hv, ngx_str_t *value); - -static ngx_int_t ngx_http_set_header_helper(ngx_http_request_t *r, - ngx_http_headers_more_header_val_t *hv, ngx_str_t *value, - ngx_table_elt_t **output_header); - -static ngx_int_t ngx_http_set_builtin_header(ngx_http_request_t *r, - ngx_http_headers_more_header_val_t *hv, ngx_str_t *value); - -static ngx_int_t ngx_http_set_content_length_header(ngx_http_request_t *r, - ngx_http_headers_more_header_val_t *hv, ngx_str_t *value); - -static ngx_int_t ngx_http_clear_builtin_header(ngx_http_request_t *r, - ngx_http_headers_more_header_val_t *hv, ngx_str_t *value); - -static ngx_int_t ngx_http_clear_content_length_header(ngx_http_request_t *r, - ngx_http_headers_more_header_val_t *hv, ngx_str_t *value); - -static ngx_int_t ngx_http_set_host_header(ngx_http_request_t *r, - ngx_http_headers_more_header_val_t *hv, ngx_str_t *value); - - -static ngx_http_headers_more_set_header_t ngx_http_headers_more_set_handlers[] - = { - -#if (NGX_HTTP_GZIP) - { ngx_string("Accept-Encoding"), - offsetof(ngx_http_headers_in_t, accept_encoding), - ngx_http_set_builtin_header }, -#endif - - { ngx_string("Host"), - offsetof(ngx_http_headers_in_t, host), - ngx_http_set_host_header }, - - { ngx_string("Connection"), - offsetof(ngx_http_headers_in_t, connection), - ngx_http_set_builtin_header }, - - { ngx_string("If-Modified-Since"), - offsetof(ngx_http_headers_in_t, if_modified_since), - ngx_http_set_builtin_header }, - - { ngx_string("User-Agent"), - offsetof(ngx_http_headers_in_t, user_agent), - ngx_http_set_builtin_header }, - - { ngx_string("Referer"), - offsetof(ngx_http_headers_in_t, referer), - ngx_http_set_builtin_header }, - - { ngx_string("Content-Type"), - offsetof(ngx_http_headers_in_t, content_type), - ngx_http_set_builtin_header }, - - { ngx_string("Range"), - offsetof(ngx_http_headers_in_t, range), - ngx_http_set_builtin_header }, - - { ngx_string("If-Range"), - offsetof(ngx_http_headers_in_t, if_range), - ngx_http_set_builtin_header }, - - { ngx_string("Transfer-Encoding"), - offsetof(ngx_http_headers_in_t, transfer_encoding), - ngx_http_set_builtin_header }, - - { ngx_string("Expect"), - offsetof(ngx_http_headers_in_t, expect), - ngx_http_set_builtin_header }, - - { ngx_string("Authorization"), - offsetof(ngx_http_headers_in_t, authorization), - ngx_http_set_builtin_header }, - - { ngx_string("Keep-Alive"), - offsetof(ngx_http_headers_in_t, keep_alive), - ngx_http_set_builtin_header }, - - { ngx_string("Content-Length"), - offsetof(ngx_http_headers_in_t, content_length), - ngx_http_set_content_length_header }, - - { ngx_null_string, 0, ngx_http_set_header } -}; - - -/* request time implementation */ - -ngx_int_t -ngx_http_headers_more_exec_input_cmd(ngx_http_request_t *r, - ngx_http_headers_more_cmd_t *cmd) -{ - ngx_str_t value; - ngx_http_headers_more_header_val_t *h; - ngx_uint_t i; - - if (!cmd->headers) { - return NGX_OK; - } - - if (cmd->types) { - if ( ! ngx_http_headers_more_check_type(r, cmd->types) ) { - return NGX_OK; - } - } - - h = cmd->headers->elts; - for (i = 0; i < cmd->headers->nelts; i++) { - - if (ngx_http_complex_value(r, &h[i].value, &value) != NGX_OK) { - return NGX_ERROR; - } - - if (value.len) { - value.len--; /* remove the trailing '\0' added by - ngx_http_headers_more_parse_header */ - } - - if (h[i].handler(r, &h[i], &value) != NGX_OK) { - return NGX_ERROR; - } - } - - return NGX_OK; -} - - -static ngx_int_t -ngx_http_set_header(ngx_http_request_t *r, - ngx_http_headers_more_header_val_t *hv, ngx_str_t *value) -{ - return ngx_http_set_header_helper(r, hv, value, NULL); -} - - -static ngx_int_t -ngx_http_set_header_helper(ngx_http_request_t *r, - ngx_http_headers_more_header_val_t *hv, ngx_str_t *value, - ngx_table_elt_t **output_header) -{ - ngx_table_elt_t *h; - ngx_list_part_t *part; - ngx_uint_t i; - ngx_uint_t rc; - - dd_enter(); - - part = &r->headers_in.headers.part; - h = part->elts; - - for (i = 0; /* void */; i++) { - dd("i: %d, part: %p", (int) i, part); - - if (i >= part->nelts) { - if (part->next == NULL) { - break; - } - - part = part->next; - h = part->elts; - i = 0; - } - - if (h[i].key.len == hv->key.len - && ngx_strncasecmp(h[i].key.data, - hv->key.data, - h[i].key.len) == 0) - { - if (value->len == 0) { - h[i].hash = 0; - - rc = ngx_http_headers_more_rm_header_helper( - &r->headers_in.headers, part, i); - - if (rc == NGX_OK) { - if (output_header) { - *output_header = NULL; - } - - return NGX_OK; - } - } - - h[i].value = *value; - - if (output_header) { - *output_header = &h[i]; - dd("setting existing builtin input header"); - } - - return NGX_OK; - } - } - - if (value->len == 0 || hv->replace) { - return NGX_OK; - } - - h = ngx_list_push(&r->headers_in.headers); - - if (h == NULL) { - return NGX_HTTP_INTERNAL_SERVER_ERROR; - } - - dd("created new header for %.*s", (int) hv->key.len, hv->key.data); - - if (value->len == 0) { - h->hash = 0; - } else { - h->hash = hv->hash; - } - - h->key = hv->key; - h->value = *value; - - h->lowcase_key = ngx_pnalloc(r->pool, h->key.len); - if (h->lowcase_key == NULL) { - return NGX_HTTP_INTERNAL_SERVER_ERROR; - } - - ngx_strlow(h->lowcase_key, h->key.data, h->key.len); - - if (output_header) { - *output_header = h; - - while (r != r->main) { - r->parent->headers_in = r->headers_in; - r = r->parent; - } - } - - return NGX_OK; -} - -static ngx_int_t -ngx_http_set_builtin_header(ngx_http_request_t *r, - ngx_http_headers_more_header_val_t *hv, ngx_str_t *value) -{ - ngx_table_elt_t *h, **old; - ngx_int_t rc; - - dd("entered set_builtin_header (input)"); - - if (hv->offset) { - old = (ngx_table_elt_t **) ((char *) &r->headers_in + hv->offset); - - } else { - old = NULL; - } - - dd("old builtin ptr ptr: %p", old); - if (old) { - dd("old builtin ptr: %p", *old); - } - - if (old == NULL || *old == NULL) { - dd("set normal header"); - return ngx_http_set_header_helper(r, hv, value, old); - } - - h = *old; - - if (value->len == 0) { - h->hash = 0; - h->value = *value; - - rc = ngx_http_headers_more_rm_header(&r->headers_in.headers, h); - - dd("rm header: %d", (int) rc); - - if (rc == NGX_OK) { - *old = NULL; - } - - return rc; - } - - h->hash = hv->hash; - h->value = *value; - - return NGX_OK; -} - -static ngx_int_t -ngx_http_set_host_header(ngx_http_request_t *r, - ngx_http_headers_more_header_val_t *hv, ngx_str_t *value) -{ - dd("server new value len: %d", (int) value->len); - - r->headers_in.server = *value; - - return ngx_http_set_builtin_header(r, hv, value); -} - -static ngx_int_t -ngx_http_set_content_length_header(ngx_http_request_t *r, - ngx_http_headers_more_header_val_t *hv, ngx_str_t *value) -{ - off_t len; - - if (value->len == 0) { - return ngx_http_clear_content_length_header(r, hv, value); - } - - len = ngx_atosz(value->data, value->len); - if (len == NGX_ERROR) { - return NGX_ERROR; - } - - dd("reset headers_in.content_length_n to %d", (int)len); - - r->headers_in.content_length_n = len; - - return ngx_http_set_builtin_header(r, hv, value); -} - -static ngx_int_t -ngx_http_clear_content_length_header(ngx_http_request_t *r, - ngx_http_headers_more_header_val_t *hv, ngx_str_t *value) -{ - r->headers_in.content_length_n = -1; - - return ngx_http_clear_builtin_header(r, hv, value); -} - -static ngx_int_t -ngx_http_clear_builtin_header(ngx_http_request_t *r, - ngx_http_headers_more_header_val_t *hv, ngx_str_t *value) -{ - value->len = 0; - return ngx_http_set_builtin_header(r, hv, value); -} - -char * -ngx_http_headers_more_set_input_headers(ngx_conf_t *cf, - ngx_command_t *cmd, void *conf) -{ - return ngx_http_headers_more_parse_directive(cf, cmd, conf, - ngx_http_headers_more_opcode_set); -} - -char * -ngx_http_headers_more_clear_input_headers(ngx_conf_t *cf, - ngx_command_t *cmd, void *conf) -{ - return ngx_http_headers_more_parse_directive(cf, cmd, conf, - ngx_http_headers_more_opcode_clear); -} - -static ngx_flag_t -ngx_http_headers_more_check_type(ngx_http_request_t *r, ngx_array_t *types) -{ - ngx_uint_t i; - ngx_str_t *t; - ngx_str_t actual_type; - - if (r->headers_in.content_type == NULL) { - return 0; - } - - actual_type = r->headers_in.content_type->value; - if (actual_type.len == 0) { - return 0; - } - - dd("headers_in->content_type: %.*s", - (int) actual_type.len, - actual_type.data); - - t = types->elts; - for (i = 0; i < types->nelts; i++) { - dd("...comparing with type [%.*s]", (int) t[i].len, t[i].data); - - if (actual_type.len == t[i].len - && ngx_strncmp(actual_type.data, - t[i].data, t[i].len) == 0) - { - return 1; - } - } - - return 0; -} - -/* config time implementation */ - -static char * -ngx_http_headers_more_parse_directive(ngx_conf_t *cf, ngx_command_t *ngx_cmd, - void *conf, ngx_http_headers_more_opcode_t opcode) -{ - ngx_http_headers_more_loc_conf_t *hcf = conf; - - ngx_uint_t i; - ngx_http_headers_more_cmd_t *cmd; - ngx_str_t *arg; - ngx_flag_t ignore_next_arg; - ngx_str_t *cmd_name; - ngx_int_t rc; - ngx_flag_t replace = 0; - ngx_http_headers_more_header_val_t *h; - - if (hcf->cmds == NULL) { - hcf->cmds = ngx_array_create(cf->pool, 1, - sizeof(ngx_http_headers_more_cmd_t)); - - if (hcf->cmds == NULL) { - return NGX_CONF_ERROR; - } - } - - cmd = ngx_array_push(hcf->cmds); - - if (cmd == NULL) { - return NGX_CONF_ERROR; - } - - cmd->headers = ngx_array_create(cf->pool, 1, - sizeof(ngx_http_headers_more_header_val_t)); - - if (cmd->headers == NULL) { - return NGX_CONF_ERROR; - } - - cmd->types = ngx_array_create(cf->pool, 1, - sizeof(ngx_str_t)); - if (cmd->types == NULL) { - return NGX_CONF_ERROR; - } - - cmd->statuses = NULL; - - arg = cf->args->elts; - - cmd_name = &arg[0]; - - ignore_next_arg = 0; - - for (i = 1; i < cf->args->nelts; i++) { - if (ignore_next_arg) { - ignore_next_arg = 0; - continue; - } - - if (arg[i].len == 0) { - continue; - } - - if (arg[i].data[0] != '-') { - rc = ngx_http_headers_more_parse_header(cf, cmd_name, - &arg[i], cmd->headers, opcode, - ngx_http_headers_more_set_handlers); - - if (rc != NGX_OK) { - return NGX_CONF_ERROR; - } - - continue; - } - - if (arg[i].len == 2) { - if (arg[i].data[1] == 't') { - if (i == cf->args->nelts - 1) { - ngx_log_error(NGX_LOG_ERR, cf->log, 0, - "%V: option -t takes an argument.", - cmd_name); - - return NGX_CONF_ERROR; - } - - rc = ngx_http_headers_more_parse_types(cf->log, cmd_name, - &arg[i + 1], cmd->types); - - if (rc != NGX_OK) { - return NGX_CONF_ERROR; - } - - ignore_next_arg = 1; - - continue; - } else if (arg[i].data[1] == 'r') { - dd("Found replace flag"); - replace = 1; - continue; - } - } - - ngx_log_error(NGX_LOG_ERR, cf->log, 0, - "%V: invalid option name: \"%V\"", cmd_name, &arg[i]); - - return NGX_CONF_ERROR; - } - - dd("Found %d types, and %d headers", - (int) cmd->types->nelts, - (int) cmd->headers->nelts); - - if (cmd->headers->nelts == 0) { - ngx_pfree(cf->pool, cmd->headers); - cmd->headers = NULL; - - } else { - h = cmd->headers->elts; - for (i = 0; i < cmd->headers->nelts; i++) { - h[i].replace = replace; - } - } - - if (cmd->types->nelts == 0) { - ngx_pfree(cf->pool, cmd->types); - cmd->types = NULL; - } - - cmd->is_input = 1; - - ngx_http_headers_more_handler_used = 1; - - return NGX_CONF_OK; -} - diff --git a/debian/modules/headers-more-nginx-module/src/ngx_http_headers_more_util.h b/debian/modules/headers-more-nginx-module/src/ngx_http_headers_more_util.h deleted file mode 100644 index 9e8f0dd..0000000 --- a/debian/modules/headers-more-nginx-module/src/ngx_http_headers_more_util.h +++ /dev/null @@ -1,28 +0,0 @@ -#ifndef NGX_HTTP_HEADERS_MORE_UTIL_H -#define NGX_HTTP_HEADERS_MORE_UTIL_H - - -#include "ngx_http_headers_more_filter_module.h" - - -ngx_int_t -ngx_http_headers_more_parse_header(ngx_conf_t *cf, ngx_str_t *cmd_name, - ngx_str_t *raw_header, ngx_array_t *headers, - ngx_http_headers_more_opcode_t opcode, - ngx_http_headers_more_set_header_t *handlers); - -ngx_int_t ngx_http_headers_more_parse_statuses(ngx_log_t *log, - ngx_str_t *cmd_name, ngx_str_t *value, ngx_array_t *statuses); - -ngx_int_t ngx_http_headers_more_parse_types(ngx_log_t *log, - ngx_str_t *cmd_name, ngx_str_t *value, ngx_array_t *types); - -ngx_int_t ngx_http_headers_more_rm_header_helper(ngx_list_t *l, - ngx_list_part_t *cur, ngx_uint_t i); - -ngx_int_t ngx_http_headers_more_rm_header(ngx_list_t *l, - ngx_table_elt_t *h); - - -#endif /* NGX_HTTP_HEADERS_MORE_UTIL_H */ - diff --git a/debian/modules/headers-more-nginx-module/t/input.t b/debian/modules/headers-more-nginx-module/t/input.t deleted file mode 100644 index a6b60a8..0000000 --- a/debian/modules/headers-more-nginx-module/t/input.t +++ /dev/null @@ -1,448 +0,0 @@ -# vi:filetype= - -use lib 'lib'; -use Test::Nginx::Socket; # 'no_plan'; - -repeat_each(2); - -plan tests => 53 * repeat_each(); - -no_long_string(); -#no_diff; - -run_tests(); - -__DATA__ - -=== TEST 1: set request header at client side ---- config - location /foo { - #more_set_input_headers 'X-Foo: howdy'; - echo $http_x_foo; - } ---- request - GET /foo ---- more_headers -X-Foo: blah ---- response_headers -! X-Foo ---- response_body -blah - - - -=== TEST 2: set request header at client side and rewrite it ---- config - location /foo { - more_set_input_headers 'X-Foo: howdy'; - echo $http_x_foo; - } ---- request - GET /foo ---- more_headers -X-Foo: blah ---- response_headers -! X-Foo ---- response_body -howdy - - - -=== TEST 3: rewrite content length ---- config - location /bar { - more_set_input_headers 'Content-Length: 2048'; - echo_read_request_body; - echo_request_body; - } ---- request eval -"POST /bar\n" . -"a" x 4096 ---- response_body eval -"a" x 2048 ---- timeout: 15 - - - -=== TEST 4: try to rewrite content length using the rewrite module -Thisshould not take effect ;) ---- config - location /bar { - set $http_content_length 2048; - echo_read_request_body; - echo_request_body; - } ---- request eval -"POST /bar\n" . -"a" x 4096 ---- response_body eval -"a" x 4096 - - - -=== TEST 5: rewrite host and user-agent ---- config - location /bar { - more_set_input_headers 'Host: foo' 'User-Agent: blah'; - echo "Host: $host"; - echo "User-Agent: $http_user_agent"; - } ---- request -GET /bar ---- response_body -Host: foo -User-Agent: blah - - - -=== TEST 6: clear host and user-agent -$host always has a default value and cannot be really cleared. ---- config - location /bar { - more_clear_input_headers 'Host: foo' 'User-Agent: blah'; - echo "Host: $host"; - echo "Host (2): $http_host"; - echo "User-Agent: $http_user_agent"; - } ---- request -GET /bar ---- response_body -Host: localhost -Host (2): -User-Agent: - - - -=== TEST 7: clear host and user-agent (the other way) ---- config - location /bar { - more_set_input_headers 'Host:' 'User-Agent:' 'X-Foo:'; - echo "Host: $host"; - echo "User-Agent: $http_user_agent"; - echo "X-Foo: $http_x_foo"; - } ---- request -GET /bar ---- more_headers -X-Foo: bar ---- response_body -Host: localhost -User-Agent: -X-Foo: - - - -=== TEST 8: clear content-length ---- config - location /bar { - more_set_input_headers 'Content-Length: '; - echo "Content-Length: $http_content_length"; - } ---- request -POST /bar -hello ---- more_headers ---- response_body -Content-Length: - - - -=== TEST 9: clear content-length (the other way) ---- config - location /bar { - more_clear_input_headers 'Content-Length: '; - echo "Content-Length: $http_content_length"; - } ---- request -POST /bar -hello ---- more_headers ---- response_body -Content-Length: - - - -=== TEST 10: rewrite type ---- config - location /bar { - more_set_input_headers 'Content-Type: text/css'; - echo "Content-Type: $content_type"; - } ---- request -POST /bar -hello ---- more_headers -Content-Type: text/plain ---- response_body -Content-Type: text/css - - - -=== TEST 11: clear type ---- config - location /bar { - more_set_input_headers 'Content-Type:'; - echo "Content-Type: $content_type"; - } ---- request -POST /bar -hello ---- more_headers -Content-Type: text/plain ---- response_body -Content-Type: - - - -=== TEST 12: clear type (the other way) ---- config - location /bar { - more_clear_input_headers 'Content-Type:foo'; - echo "Content-Type: $content_type"; - } ---- request -POST /bar -hello ---- more_headers -Content-Type: text/plain ---- response_body -Content-Type: - - - -=== TEST 13: add type constraints ---- config - location /bar { - more_set_input_headers -t 'text/plain' 'X-Blah:yay'; - echo $http_x_blah; - } ---- request -POST /bar -hello ---- more_headers -Content-Type: text/plain ---- response_body -yay - - - -=== TEST 14: add type constraints (not matched) ---- config - location /bar { - more_set_input_headers -t 'text/plain' 'X-Blah:yay'; - echo $http_x_blah; - } ---- request -POST /bar -hello ---- more_headers -Content-Type: text/css ---- response_body eval: "\n" - - - -=== TEST 15: add type constraints (OR'd) ---- config - location /bar { - more_set_input_headers -t 'text/plain text/css' 'X-Blah:yay'; - echo $http_x_blah; - } ---- request -POST /bar -hello ---- more_headers -Content-Type: text/css ---- response_body -yay - - - -=== TEST 16: add type constraints (OR'd) ---- config - location /bar { - more_set_input_headers -t 'text/plain text/css' 'X-Blah:yay'; - echo $http_x_blah; - } ---- request -POST /bar -hello ---- more_headers -Content-Type: text/plain ---- response_body -yay - - - -=== TEST 17: add type constraints (OR'd) (not matched) ---- config - location /bar { - more_set_input_headers -t 'text/plain text/css' 'X-Blah:yay'; - echo $http_x_blah; - } ---- request -POST /bar -hello ---- more_headers -Content-Type: text/html ---- response_body eval: "\n" - - - -=== TEST 18: mix input and output cmds ---- config - location /bar { - more_set_input_headers 'X-Blah:yay'; - more_set_headers 'X-Blah:hiya'; - echo $http_x_blah; - } ---- request -GET /bar ---- response_headers -X-Blah: hiya ---- response -yay - - - -=== TEST 19: set request header at client side and replace ---- config - location /foo { - more_set_input_headers -r 'X-Foo: howdy'; - echo $http_x_foo; - } ---- request - GET /foo ---- more_headers -X-Foo: blah ---- response_headers -! X-Foo ---- response_body -howdy - - - -=== TEST 20: do no set request header at client, so no replace with -r option ---- config - location /foo { - more_set_input_headers -r 'X-Foo: howdy'; - echo "empty_header:" $http_x_foo; - } ---- request - GET /foo ---- response_headers -! X-Foo ---- response_body -empty_header: - - - -=== TEST 21: clear input headers ---- config - location /foo { - set $val 'dog'; - - more_clear_input_headers 'User-Agent'; - - proxy_pass http://127.0.0.1:$server_port/proxy; - } - location /proxy { - echo -n $echo_client_request_headers; - } ---- request - GET /foo ---- more_headers -User-Agent: my-sock ---- response_body eval -"GET /proxy HTTP/1.0\r -Host: 127.0.0.1:\$ServerPort\r -Connection: close\r -" ---- skip_nginx: 3: < 0.7.46 - - - -=== TEST 22: clear input headers ---- config - location /foo { - more_clear_input_headers 'User-Agent'; - - proxy_pass http://127.0.0.1:$server_port/proxy; - } - location /proxy { - echo -n $echo_client_request_headers; - } ---- request - GET /foo ---- response_body eval -"GET /proxy HTTP/1.0\r -Host: 127.0.0.1:\$ServerPort\r -Connection: close\r -" ---- skip_nginx: 3: < 0.7.46 - - - -=== TEST 23: clear input headers ---- config - location /foo { - more_clear_input_headers 'X-Foo19'; - more_clear_input_headers 'X-Foo20'; - more_clear_input_headers 'X-Foo21'; - - proxy_pass http://127.0.0.1:$server_port/proxy; - } - location /proxy { - echo -n $echo_client_request_headers; - } ---- request - GET /foo ---- more_headers eval -my $s; -for my $i (3..21) { - $s .= "X-Foo$i: $i\n"; -} -$s; ---- response_body eval -"GET /proxy HTTP/1.0\r -Host: 127.0.0.1:\$ServerPort\r -Connection: close\r -X-Foo3: 3\r -X-Foo4: 4\r -X-Foo5: 5\r -X-Foo6: 6\r -X-Foo7: 7\r -X-Foo8: 8\r -X-Foo9: 9\r -X-Foo10: 10\r -X-Foo11: 11\r -X-Foo12: 12\r -X-Foo13: 13\r -X-Foo14: 14\r -X-Foo15: 15\r -X-Foo16: 16\r -X-Foo17: 17\r -X-Foo18: 18\r -" ---- skip_nginx: 3: < 0.7.46 - - - -=== TEST 24: Accept-Encoding ---- config - location /bar { - default_type 'text/plain'; - more_set_input_headers 'Accept-Encoding: gzip'; - gzip on; - gzip_min_length 1; - gzip_buffers 4 8k; - gzip_types text/plain; - } ---- user_files -">>> bar -" . ("hello" x 512) ---- request -GET /bar ---- response_headers -Content-Encoding: gzip ---- response_body_like: . - diff --git a/debian/modules/headers-more-nginx-module/valgrind.suppress b/debian/modules/headers-more-nginx-module/valgrind.suppress deleted file mode 100644 index 6fe2a51..0000000 --- a/debian/modules/headers-more-nginx-module/valgrind.suppress +++ /dev/null @@ -1,188 +0,0 @@ -{ - -Memcheck:Leak -fun:malloc -fun:ngx_alloc -fun:ngx_palloc_large -fun:ngx_palloc -} -{ - - Memcheck:Leak - fun:malloc - fun:ngx_alloc - fun:ngx_calloc - fun:ngx_event_process_init - fun:ngx_single_process_cycle -} -{ - -Memcheck:Addr4 -fun:lj_str_new -fun:lua_pushlstring -fun:ngx_http_lua_get_output_header -} -{ - - Memcheck:Addr4 - fun:lj_str_new - fun:lua_getfield - fun:ngx_http_lua_cache_load_code -} -{ - - Memcheck:Addr4 - fun:lj_str_new - fun:lua_setfield - fun:ngx_http_lua_cache_store_code -} -{ - - Memcheck:Leak - fun:malloc - fun:ngx_alloc - fun:ngx_event_process_init -} -{ - - Memcheck:Leak - fun:malloc - fun:ngx_alloc - fun:(below main) -} -{ - - Memcheck:Param - epoll_ctl(event) - fun:epoll_ctl -} -{ - - Memcheck:Leak - fun:malloc - fun:ngx_alloc - fun:ngx_create_pool -} -{ - - Memcheck:Leak - fun:malloc - fun:ngx_alloc - fun:ngx_malloc - fun:ngx_palloc_large -} -{ - - Memcheck:Cond - fun:memcpy - fun:ngx_vslprintf - fun:ngx_log_error_core - fun:ngx_http_charset_header_filter -} -{ - - Memcheck:Leak - fun:malloc - fun:ngx_alloc - fun:ngx_malloc - fun:ngx_pnalloc -} -{ - - Memcheck:Leak - fun:malloc - fun:ngx_alloc - fun:ngx_malloc - fun:ngx_palloc -} -{ - nginx-core-process-init - Memcheck:Leak - fun:malloc - fun:ngx_alloc - fun:ngx_event_process_init - fun:ngx_single_process_cycle - fun:main -} -{ - nginx-core-crc32-init - Memcheck:Leak - fun:malloc - fun:ngx_alloc - fun:ngx_crc32_table_init - fun:main -} -{ - palloc_large_for_init_request - Memcheck:Leak - fun:malloc - fun:ngx_alloc - fun:ngx_palloc_large - fun:ngx_palloc - fun:ngx_pcalloc - fun:ngx_http_init_request - fun:ngx_epoll_process_events - fun:ngx_process_events_and_timers - fun:ngx_single_process_cycle - fun:main -} -{ - palloc_large_for_create_temp_buf - Memcheck:Leak - fun:malloc - fun:ngx_alloc - fun:ngx_palloc_large - fun:ngx_palloc - fun:ngx_create_temp_buf - fun:ngx_http_init_request - fun:ngx_epoll_process_events - fun:ngx_process_events_and_timers - fun:ngx_single_process_cycle - fun:main -} -{ - accept_create_pool - Memcheck:Leak - fun:memalign - fun:posix_memalign - fun:ngx_memalign - fun:ngx_create_pool - fun:ngx_event_accept - fun:ngx_epoll_process_events - fun:ngx_process_events_and_timers - fun:ngx_single_process_cycle - fun:main -} -{ - create_pool_for_init_req - Memcheck:Leak - fun:memalign - fun:posix_memalign - fun:ngx_memalign - fun:ngx_create_pool - fun:ngx_http_init_request - fun:ngx_epoll_process_events - fun:ngx_process_events_and_timers - fun:ngx_single_process_cycle - fun:main -} -{ - - Memcheck:Leak - fun:memalign - fun:posix_memalign - fun:ngx_memalign - fun:ngx_palloc_block - fun:ngx_palloc -} -{ - - Memcheck:Addr8 - fun:getenv - fun:gcov_exit - fun:exit - fun:ngx_master_process_exit - fun:ngx_single_process_cycle - fun:main -} - diff --git a/debian/modules/naxsi/COPYING b/debian/modules/naxsi/COPYING deleted file mode 100644 index 2f638d3..0000000 --- a/debian/modules/naxsi/COPYING +++ /dev/null @@ -1,29 +0,0 @@ -NAXSI, a web application firewall for NGINX -Copyright (C) 2011, Thibault 'bui' Koechlin - -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, either version 2 of the License, or -(at your option) any later version. - -In addition, as a special exception, the copyright holders give -permission to link the code of portions of this program with the -OpenSSL library under certain conditions as described in each -individual source file, and distribute linked combinations -including the two. - -You must obey the GNU General Public License in all respects -for all of the code used other than OpenSSL. If you modify -file(s) with this exception, you may extend this exception to your -version of the file(s), but you are not obligated to do so. If you -do not wish to do so, delete this exception statement from your -version. If you delete this exception statement from all source -files in the program, then also delete it here. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program. If not, see . diff --git a/debian/modules/naxsi/README.txt b/debian/modules/naxsi/README.txt deleted file mode 100644 index 053a2f1..0000000 --- a/debian/modules/naxsi/README.txt +++ /dev/null @@ -1,370 +0,0 @@ - _ _ _ - | \ | | __ ___ _____(_) - | \| |/ _` \ \/ / __| | - | |\ | (_| |> <\__ \ | - |_| \_|\__,_/_/\_\___/_| - v0.1 alpha - -[[[!!! PLEASE REFER TO THE WIKI INSTEAD !!!]]] -Yes, this readme is for v0.1 alpha, now is 0.45 - - -|--{ Introduction }------------------------------------------------------------| - - -NAXSI is a module for nginx, the famous webserver/reverse-proxy/... -Its goal is to help people to secure their web application against attacks -such as SQL Injection, Cross Site Scripting, Cross Site Request Forgery, -Local & Remote file inclusions and such. -The difference with most WAF (Web Applicative Firewalls) out there is that -it does not rely on signatures to detect attacks. It is using a simpler model, -where instead of trying to detect "known" attacks, it will detect unexpected -characters in the HTTP request/arguments. Each kind of unusual character will -increase the score of the request. If the request reaches a score that's -considered "too high", the request will be denied, and the user will be -redirected to a "forbidden" page. Yes, it works a bit like a spam system. - - -|--{ Why is it different ? }--------------------------------------------------| - -NAXSI is different, because it works on a learning mode (read whitelist). -Set the module in learning mode, scroll your site, and it will generate the -necessaries whitelists to avoid false positives ! -NAXSI doesn't relies on signatures, so it should be capable of defeating -complex/unknown/obfuscated attack -patterns. - - -|--{ How does it work }------------------------------------------------------| - - -NAXSI relies on two separate configuration parts. - * Core Rules : Located at HTTP server level configuration. - * WhiteLists & Specific Rules : Located at the HTTP location - level configuration. - -The first one is what we called 'core rules'. -It's a set of rules that will contain all characters or regular expression -that will increase the score of the request, for exemple : - -MainRule "rx:<|>" "msg:html tag ?" "mz:ARGS|URL|BODY" "s:$XSS:8" id:1302; - -This rule, will match on both < and > characters (rx:<|>), and will increase -the score associated to the XSS threat (s:$XSS:8). This pattern will be matched - against various zones of the request : ARGS (GET arguments), -URL (the full URI), and BODY (POST arguments). Each rule is associated to -unique ID (here, 1302), that is used for whitelisting. -There is not "many" core rules (34 at the time of writting), and this set -should normally not evolve. - - -On the other hand, we have a "local" configuration, which is to be defined -"per site" (as NAXSI main goal is to work with NGINX as a RP), and which will -define "how strict" the security policy of the site will be, as well as -putting exceptions (whitelists) according the site specificities : - ------------------------------------8<------------------------------------------- -# Define to which "location" the user will be redirected when a request is -# denied. -DeniedUrl "/RequestDenied"; - -# Whitelist '|', as it's used on the /report/ page, in argument 'd' -BasicRule wl:1005 "mz:$URL:/report/|$ARGS_VAR:d"; -# Whitelist ',' on URL zone as it's massively used for URL rewritting ! -BasicRule wl:1008 "mz:URL"; - -# Check rules -CheckRule "$SQL >= 8" BLOCK; -CheckRule "$RFI >= 8" BLOCK; -CheckRule "$TRAVERSAL >= 4" BLOCK; -CheckRule "$XSS >= 8" BLOCK; ------------------------------------8<------------------------------------------- - -Let's see this configuration again to clarify things : - -* 'BasicRule' : This directive is used here to whitelist some rules. - As you can see (and expect !) you can be more or less laxist. - For exemple, there is a directive (BasicRule wl:1008 ...) that will totally - disable the rule 1008 checking against URL. This rule is normally matching - the ',' character. - -On the other hand, you can make extremly precise rules, as this one : - BasicRule wl:1005 "mz:$URL:/report/|$ARGS_VAR:d"; - In the last exemple, we are whitelisting a rule, but only on one specific - argument of one specific webpage (the argument named 'd' of the page - '/report/'). - -As stated earlier, "local" configuration is also used to decide how -"strict" one site (or one part of one site) will be, that is, what is -the maximal tolerated page score before a request is denied : - -CheckRule "$SQL >= 8" BLOCK; - -This directive tells NAXSI that every request that has a 'SQL' score superior -or equal to 8 will be denied. - - -|--{ Denied requests and whitelist generation }------------------------------| - -When a user's request is denied, he will be (internally) redirected to the page -defined in the configuration : -DeniedUrl "/RequestDenied"; -This page will receive detailed informations on the rules that matched -(it's logued in log files too), as well as both the request and the user -context, without giving information to the user (thanks to nginx internal -redirects). Actually the page at /RequestDenied will be called with arguments, -like : - -server=xxxx&uri=/vulnerable.php&ip=127.0.0.1&zone0=ARGS&id0=1010&var_name0=foo1&zone1=ARGS&id1=1011&... - -If you have a closer look to the URL above, you will understand that the -following information will be transmitted to the forbidden page : - - Which rule matched on which argument, in which part of the request (ARGS, - BODY, URL, HEADERS ...) - - Original URL and hostname - - Client IP adress - -Those information are given for both statistics generation purpose, as well as -for whitelist generation purposes. - -Yes, actually that's a very important aspect of NAXSI : As it is heavily -relying on whitelist for configuration, the easiest the whitelist generation is -, the easier the configuration is ! The thing being that the DeniedUrl page -receives enough information to generate a set of whitelisting rules that will -allow the request that was blocked to be allowed in the future. - -To make it clear : you can generate the whole NAXSI configuration, only by -naviguating to the site, or even better, by using a clever crawler ! -When you will do a navigation session on the website you want to create rules -for, if you are in "LearningMode", some requests might be (and will be) tagued - as blocked. They should be blocked, because, for example, the developpers -(damn!) decided to massively use '|' for URL rewritting, and NAXSI -will dislike this. - -So, as you are in learning mode (but the idea is the same when LearningMode is -disabled), NAXSI will log the fact that the request was blocked because of the -presence of multiples '|' in the URL. Then, with a simple script (a python -script is provided), you can parse the log files and generate the appropriate -whiterules to allow legitimate (false positive) requests. - -The more tricky part when talking about NAXSI and its whitelist, is when we -come to sites that allows a LOT of wide user input : Comments, Registration -forms and things like this. For this, either a carefull navigation, submitting -real content is required (so that NAXSI will trigger every plausible rule on -each kind of form field) or the usage of a clever crawler is required. -In the worst, case, it will require to do a real navigation session to generate -the appropriate whitelists. - -|--{ Statistics, Reporting and so on ... }-----------------------------------| - -This is a crucial part of any WAF, and this is not done yet ! -But the good point is that, thanks to the principle of calling an external page - that receives all the informations about every denied request, it is fairly -simple to write your custom webpage to -take care of the statistics / reporting. - - -|--{ 3 .. 2 .. 1 .. practice ! }---------------------------------------------| - -Ok, now, let's have a look at the practice ! Let's admit we want to create a -setup for a website. I won't cover the basics of setting up nginx as a reverse -proxy, but rather focus on NAXSI configuration. If you have a "normal" web -site, with no fancy URL rewritting or strange things, the default configuration -should do the work, but let's have a look at website with fancy rewritting, -and complex user forms. - - -To make things easier, a good point is that we can 'fool' nginx and the OS into - thinking that he is already the reverse proxy for the website, so that we can -setup the configuration without any risk of impacting the production servers, -so here we go : - - -/etc/nginx/site-enabled/default: ------------------------------------8<------------------------------------------- -server { -proxy_set_header Proxy-Connection ""; -resolver X.Y.Z; -listen *:80; -access_log /tmp/nginx_access.log; -error_log /tmp/nginx_error.log debug; - -location / { -# specific site config - LearningMode; - SecRulesEnabled; - DeniedUrl "/RequestDenied"; - - ## check rules - CheckRule "$SQL >= 8" BLOCK; - CheckRule "$RFI >= 8" BLOCK; - CheckRule "$TRAVERSAL >= 4" BLOCK; - CheckRule "$XSS >= 8" BLOCK; -# /specific site config - proxy_pass http://xx.xx.xx.xx; - proxy_set_header Host "www.xxx.com"; -} - -location /RequestDenied { - proxy_pass http://127.0.0.1:4242/denied_page.php; - } -} ------------------------------------8<------------------------------------------- - - -Our configuration file is extremly similar to any nginx configuration, except: -- We defined a NAXSI "per site" configuration. This is what will determine how - NAXSI will behave for this site. -- We define a location that will be used to redirect fobidden pages. Here, - I have an apache instance listening on lo:4242 - -The NAXSI "per location" configuration, simply defines : -- CheckRule : The maximum score for each kind of "threat" -- The "LearningMode" directive is here to make the learning easier. By default, - NAXSI will stop processing a request as soon as it hits one of the 'BLOCK' - scores. With this directive, it will go through every rules, making - whitelist generation easier, while allowing the request to pass, even if - tagued as "BLOCKED", to make learning easier. - -- The 'SecRulesEnabled' directives tells that NAXSI should be activated for - this location. In this way, you can decide to active / desactivate it easily - for location X or Y. (For exemple, you might not want a WAF on your - back-office ?) -- DeniedUrl : We tell NAXSI were to redirect the user when a request is blocked. - -and we need to add this line in the http section of nginx.conf : ---------------------------------8<-------------------------------------- -include /etc/nginx/sec-rules/core.rules; ---------------------------------8<-------------------------------------- -The "core.rules" file is provided with NAXSI, and contains all the "patterns". - -So, here we go ! Let's start - -We can now fool the OS into thinking that xxx.com is on 127.0.0.1, edit /etc/hosts. We are ready for configuration ! Fire up your favorite browser at xxx.com and start navigation. - - - -As you should be in "learningmode", NAXSI will allow all the request, even if -they reach a blocking score. As well as letting them pass, it will, as well, -"forward" the request (like nginx's post_action directive) to your DeniedUrl, -as well as the original blocked URL (in headers) and the generated blocking -details. In this way, the web backend is abble to generate the white-lists, -and reload nginx 'on the fly' with the new generated whitelist rules ;) - -The 'web' part is not written yet (I suck at html), but you can yet proceed -in a different way : - - -In your nginx's log file (if set as debug), you will see a lot of lines like -this one appear : ------------------------------------8<------------------------------------------- -2011/07/11 17:12:27 [debug] 18653#0: *7 NAXSI_FMT: server=&uri=/skin/frontend/default/xxx/images/interface/fleche-grise.gif&ip=127.0.0.1&zone0=HEADERS&id0=1005&var_name0=cookie&zone1=HEADERS&id1=1008&var_name1=cookie&zone2=HEADERS&id2=1009&var_name2=cookie&zone3=HEADERS&id3=1010&var_name3=cookie&zone4=HEADERS&id4=1011&var_name4=cookie&zone5=HEADERS&id5=1308&var_name5=cookie&zone6=HEADERS&id6=1309&var_name6=cookie&zone7=HEADERS&id7=1313&var_name7=cookie ------------------------------------8<------------------------------------------- - -So, once you think you've done a reasonable crawling on your site, you can -launch the "rules generator" [destination rules file] [nginx's log file]: ------------------------------------8<------------------------------------------- -bui@zeroed:~$ ./rules_generator.py -RANGE for ID=1000,ZONE=URL, range=0-4 -# for rule 1000, we have 4 elements in zone URL -#duplicate for id 1000, delete (4 elems) -RANGE for ID=1002,ZONE=URL, range=1-89 -... -{'id': '1313', 'uri': '', 'var_name': 'cookie', 'zone': 'HEADERS'}] ------------------------------------8<------------------------------------------- - -Rules generator default output file is /tmp/RT_naxsi.tmp, and looks like : ------------------------------------8<------------------------------------------- -bui@zeroed:/home/bui/secdev/nginx/web: cat /tmp/RT_naxsi.tmp | grep ^Basic -BasicRule wl:1000 "mz:$URL:/skin/frontend/default/lepape/images/titre_notre_selection2.gif|URL"; -BasicRule wl:1002 "mz:URL"; -BasicRule wl:1008 "mz:URL"; -BasicRule wl:1005 "mz:$HEADERS_VAR:cookie"; -BasicRule wl:1008 "mz:$HEADERS_VAR:cookie"; -BasicRule wl:1009 "mz:$HEADERS_VAR:cookie"; -BasicRule wl:1010 "mz:$HEADERS_VAR:cookie"; -BasicRule wl:1011 "mz:$HEADERS_VAR:cookie"; -BasicRule wl:1308 "mz:$HEADERS_VAR:cookie"; -BasicRule wl:1309 "mz:$HEADERS_VAR:cookie"; -BasicRule wl:1313 "mz:$HEADERS_VAR:cookie"; ------------------------------------8<------------------------------------------- - -What happened just here ? The Rule Generator parsed nginx log file, -extracted all the "denied urls", and generated (and then factorized) -whitelist rules from your session ! If you did an exhaustive enough -crawling / browsing session, your ruleset might be complete enough and -ready for production ! - - -|--{ Detail configuration }--------------------------------------------------| - -Here, I will go through all the directives supported by NAXSI. - -|--{ Location configuration }------------------------------------------------| - -LearningMode : By default, NAXSI will stop parsing a request as soon - as it reaches a score that will block the request. When - LearningMode is enabled, the request will be matched - against every possible rules. This directive should be - used when configuring NAXSI ONLY (a.k.a : generating - whitelists) - -SecRulesEnabled : If the directive is not present, NAXSI will not -inspect anything. SecRulesDisabled : If the directive is present, -NAXSI will not inspect anything. (The two rules above are here for -easier usage in production environnment, when you want to be abble to -simply enable / disable the module) - - - -DeniedUrl "/location" : This directive is used to tell NAXSI where the - user should be redirected when a request is - blocked. The location should be present in - NGINX configuration for this to work, as we - are relying on nginx's internal redirect - feature. - - -BasicRule : The 'main' thing you should care about. This can be used, - either to add some whitelist, or to create some specific - rules for a location (might be usefull if you have super - crappy websites). Here are some examples of possible - BasicRule syntaxes : - -- BasicRule wl:1005 "mz:$URL:/bar/|$ARGS_VAR:foo" : Whitelist rule 1005 on - the GET "foo" arg of page /bar/ -- BasicRule wl:1005 "mz:$URL:/bar/|ARGS" : Whitelist rule 1005 on the every - GET arg of page /bar/ -- BasicRule wl:1005 : Globally disable rule 1005 on the location -- BasicRule wl:1005 "mz:HEADERS" : Whitelist rule 1005 for all HEADERS -- mz supports keywords like ARGS (global GET args), BODY (global POST args), - URL (url, rly), $ARGS_VAR (named GET arg), $BODY_VAR (named POST arg), - HEADERS (HTTP headers), $HEADERS_VAR (named header var) - - -CheckRule : Used to determine when the request should be blocked, for -example : CheckRule "$SQL >= 8" BLOCK : If the $SQL score is superior -or equal to 8, the request will be blocked. - - -|--{ Main configuration }----------------------------------------------------| - - -In main configuration, a.k.a core rules, there is only one directive : - -MainRule "str:/*" "msg:mysql comment (/*)" "mz:BODY|URL|ARGS" "s:$SQL:8" id:1003; -This specific rule for example, will be matched against GET,POST -arguments, as well as the URL. If the '/*' string is found, the $SQL -score will be increased by 8. Sounds pretty simple right ? But you -can as well do some tricky things ! - -MainRule negative "rx:application/x-www-form-urlencoded|multipart/form-data" "msg:foobar test pattern" "mz:$HEADER_VAR:Content-type" "s:$SQL:42" id:1999; -This one is a negative rule (means that the score will be applied if the rule -DOES NOT match). This one is used to prevent strange content types on POSTs. -To litteraly translate it, it means : If a "Content-type" HTTP header is -present, check weither it's 'application/x-www-form-urlencoded' or -'multipart/form-data' (you noticed the rx: keyword, yes it means that it's a -regular expression). If the content-type is different, then increase $SQL score -by 42. - - diff --git a/debian/modules/naxsi/contrib/fp-reporter/README b/debian/modules/naxsi/contrib/fp-reporter/README deleted file mode 100644 index b667406..0000000 --- a/debian/modules/naxsi/contrib/fp-reporter/README +++ /dev/null @@ -1,17 +0,0 @@ -Fp-reporter 0.1 README - -0) Description - -Fp-reporter is a raw php script which is supposed to be called on DeniedUrl call when a user request is blocked. -Using this page allow this end user to submit a false positive request to the email address configured within the fp-reporter. -To avoid spaming the contact, a CATPCHA using Google ReCAPTCHA API is requested to the user. - -1) Installation - -- Copy forbidden.php somewhere in your webroot -- Get recaptchalib.php lib from ReCAPTCHA and put it in the same directory (http://code.google.com/p/recaptcha/downloads/list?q=label:phplib-Latest) -- Configure variables according to your setup: $public_key, $private_key, MAIL_DST email address - -2) Bug report - -Please submit bug using Naxsi GoogleCode issue tracker. diff --git a/debian/modules/naxsi/contrib/fp-reporter/fp-reporter.php b/debian/modules/naxsi/contrib/fp-reporter/fp-reporter.php deleted file mode 100644 index e4d0322..0000000 --- a/debian/modules/naxsi/contrib/fp-reporter/fp-reporter.php +++ /dev/null @@ -1,136 +0,0 @@ -. - */ - -// Original lib fropm ReCAPTCHA -require_once('recaptchalib.php'); -$public_key="YourReCAPTCHAPublicKeyHere"; -$private_key="YourReCAPTCHAPrivateKeyHere"; - -// You might customize your own error message here -define ("CUSTOM_ERROR_PAGE", "

Request Denied !


". - "Your request has been denied, but please don't panick.
". - "If you are not a hacker, please fill the CAPTCHA bellow,
". - "So that administrators can have a look at this error.
". - "Thanks !
"); -define ("CORE_RULES_FILE", "/etc/nginx/naxsi_core.rules"); -define ("MAIL_DST", "foo@bar.com"); -define ("MAIL_SUBJECT", "[NAXSI] A request has been from on your site."); - -session_start(); - -if (isset($_SERVER["HTTP_NAXSI_SIG"])) - { - echo "".CUSTOM_ERROR_PAGE."
"; - echo recaptcha_get_html($public_key); - echo "
"; - parse_str($_SERVER["HTTP_NAXSI_SIG"], $nsig); - $include_body = 0; - $msg = ""; - $msg .= "The request emited from ".$nsig["ip"]." IP address has been blocked.\n"; - $msg .= "While access page :\n"; - $msg .= $_SERVER["HTTP_ORIG_URL"]."\n"; - $msg .= "With arguments :\n"; - $msg .= $_SERVER["HTTP_ORIG_ARGS"]."\n"; - $msg .= "This request has been blocked for the following reasons :\n"; - - - for ($i = 0; ; $i++) - { - if (isset($nsig["id".$i])) - { - if ($nsig["zone".$i] == "BODY") - $include_body = 1; - $pattern = get_forbidden_pattern($nsig["id".$i]); - if (isset($nsig["var_name".$i]) && strlen($nsig["var_name".$i]) > 0) - { - $rulematch = "The forbidden caracter '".$pattern."' has been detected on '".$nsig["var_name".$i]."' variable"; - $rulematch .= " in zone '".$nsig["zone".$i]."'\n"; - $msg .= $rulematch; - } - else - { - $rulematch = "The forbidden caracter '".$pattern."' has been detected within '".$nsig["zone".$i]."' zone\n"; - $msg .= $rulematch; - } - } - else - break; - } - - if ($include_body == 1) - { - ob_start(); - print_r($_POST); - $output = ob_get_clean(); - $msg .= "------- BODY DUMP ------\n".$output."\n-------------\n"; - } - - $msg .= "-------- ORIG NAXSI SIG --------\n".$_SERVER['HTTP_NAXSI_SIG']."\n--------\n"; - $_SESSION["msg"] = $msg; - } -else - { - $resp = recaptcha_check_answer ($private_key, - $_SERVER["REMOTE_ADDR"], - $_POST["recaptcha_challenge_field"], - $_POST["recaptcha_response_field"]); - - if (!$resp->is_valid) { - die ("The reCAPTCHA wasn't entered correctly. Go back and try it again." . - "(reCAPTCHA said: " . $resp->error . ")"); - } else { - echo "Hey, here is your message :
".$_SESSION["msg"]."
"; - destroy_session(); - } - } - function get_forbidden_pattern($sig_id) - { - if (!file_exists(CORE_RULES_FILE)) - die ("Cannot open ".CORE_RULES_FILE); - $fd = fopen(CORE_RULES_FILE, "r"); - while(($line = fgets($fd))) - { - if (($idx = strpos($line, "id:"))) - { - $rid = intval(substr($line, $idx+3)); - if ($rid == $sig_id) - { - return (extract_pattern_from_line($line)); - break; - } - } - } - fclose($fd); - } - - function extract_pattern_from_line($line) - { - if (($rid = strpos($line, "rx:"))) - $len = 3; - else if (($rid = strpos($line, "str:"))) - $len = 4; - else - return ("unable to extract pattern"); - $tok_id = strpos(substr($line, $rid+$len), '"'); - return (substr($line, $rid+$len, $tok_id)); - } - - ?> diff --git a/debian/modules/naxsi/contrib/naxsi-ui/MySQLConnector.py b/debian/modules/naxsi/contrib/naxsi-ui/MySQLConnector.py deleted file mode 100644 index c18ef62..0000000 --- a/debian/modules/naxsi/contrib/naxsi-ui/MySQLConnector.py +++ /dev/null @@ -1,26 +0,0 @@ -import MySQLdb - -from ConfigParser import ConfigParser - -class MySQLConnectorException(Exception): - pass - -class MySQLConnector(object): - section_name = 'mysql' - def __init__(self, filename = 'naxsi-ui.conf'): - try: - fd = open(filename, 'r') - except: - raise MySQLConnectorException('Cannot open file %s' % filename) - self.conf = ConfigParser() - self.conf.readfp(fd) - self.user = self.get_config('username') - self.host = self.get_config('hostname') - self.password = self.get_config('password') - self.dbname = self.get_config('dbname') - - def get_config(self, key): - return self.conf.get(self.__class__.section_name, key) - - def connect(self): - return MySQLdb.connect(self.host, self.user, self.password, self.dbname) diff --git a/debian/modules/naxsi/contrib/naxsi-ui/README.txt b/debian/modules/naxsi/contrib/naxsi-ui/README.txt deleted file mode 100644 index 15e887f..0000000 --- a/debian/modules/naxsi/contrib/naxsi-ui/README.txt +++ /dev/null @@ -1,8 +0,0 @@ - -nx_intercept.py and nx_extract.py are new naxsi's learning daemons. - - -nx_intercept.py should be pointed by your /RequestDenied. -nx_extract.py should be launched after nx_intercept.py, and accessed with - a browser (ie: lynx) to obtain generated whitelists. - diff --git a/debian/modules/naxsi/contrib/naxsi-ui/bootstrap/css/bootstrap-responsive.css b/debian/modules/naxsi/contrib/naxsi-ui/bootstrap/css/bootstrap-responsive.css deleted file mode 100644 index 7f669d5..0000000 --- a/debian/modules/naxsi/contrib/naxsi-ui/bootstrap/css/bootstrap-responsive.css +++ /dev/null @@ -1,808 +0,0 @@ -/*! - * Bootstrap Responsive v2.0.3 - * - * Copyright 2012 Twitter, Inc - * Licensed under the Apache License v2.0 - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Designed and built with all the love in the world @twitter by @mdo and @fat. - */ - -.clearfix { - *zoom: 1; -} - -.clearfix:before, -.clearfix:after { - display: table; - content: ""; -} - -.clearfix:after { - clear: both; -} - -.hide-text { - font: 0/0 a; - color: transparent; - text-shadow: none; - background-color: transparent; - border: 0; -} - -.input-block-level { - display: block; - width: 100%; - min-height: 28px; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - -ms-box-sizing: border-box; - box-sizing: border-box; -} - -.hidden { - display: none; - visibility: hidden; -} - -.visible-phone { - display: none !important; -} - -.visible-tablet { - display: none !important; -} - -.hidden-desktop { - display: none !important; -} - -@media (max-width: 767px) { - .visible-phone { - display: inherit !important; - } - .hidden-phone { - display: none !important; - } - .hidden-desktop { - display: inherit !important; - } - .visible-desktop { - display: none !important; - } -} - -@media (min-width: 768px) and (max-width: 979px) { - .visible-tablet { - display: inherit !important; - } - .hidden-tablet { - display: none !important; - } - .hidden-desktop { - display: inherit !important; - } - .visible-desktop { - display: none !important ; - } -} - -@media (max-width: 480px) { - .nav-collapse { - -webkit-transform: translate3d(0, 0, 0); - } - .page-header h1 small { - display: block; - line-height: 18px; - } - input[type="checkbox"], - input[type="radio"] { - border: 1px solid #ccc; - } - .form-horizontal .control-group > label { - float: none; - width: auto; - padding-top: 0; - text-align: left; - } - .form-horizontal .controls { - margin-left: 0; - } - .form-horizontal .control-list { - padding-top: 0; - } - .form-horizontal .form-actions { - padding-right: 10px; - padding-left: 10px; - } - .modal { - position: absolute; - top: 10px; - right: 10px; - left: 10px; - width: auto; - margin: 0; - } - .modal.fade.in { - top: auto; - } - .modal-header .close { - padding: 10px; - margin: -10px; - } - .carousel-caption { - position: static; - } -} - -@media (max-width: 767px) { - body { - padding-right: 20px; - padding-left: 20px; - } - .navbar-fixed-top, - .navbar-fixed-bottom { - margin-right: -20px; - margin-left: -20px; - } - .container-fluid { - padding: 0; - } - .dl-horizontal dt { - float: none; - width: auto; - clear: none; - text-align: left; - } - .dl-horizontal dd { - margin-left: 0; - } - .container { - width: auto; - } - .row-fluid { - width: 100%; - } - .row, - .thumbnails { - margin-left: 0; - } - [class*="span"], - .row-fluid [class*="span"] { - display: block; - float: none; - width: auto; - margin-left: 0; - } - .input-large, - .input-xlarge, - .input-xxlarge, - input[class*="span"], - select[class*="span"], - textarea[class*="span"], - .uneditable-input { - display: block; - width: 100%; - min-height: 28px; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - -ms-box-sizing: border-box; - box-sizing: border-box; - } - .input-prepend input, - .input-append input, - .input-prepend input[class*="span"], - .input-append input[class*="span"] { - display: inline-block; - width: auto; - } -} - -@media (min-width: 768px) and (max-width: 979px) { - .row { - margin-left: -20px; - *zoom: 1; - } - .row:before, - .row:after { - display: table; - content: ""; - } - .row:after { - clear: both; - } - [class*="span"] { - float: left; - margin-left: 20px; - } - .container, - .navbar-fixed-top .container, - .navbar-fixed-bottom .container { - width: 724px; - } - .span12 { - width: 724px; - } - .span11 { - width: 662px; - } - .span10 { - width: 600px; - } - .span9 { - width: 538px; - } - .span8 { - width: 476px; - } - .span7 { - width: 414px; - } - .span6 { - width: 352px; - } - .span5 { - width: 290px; - } - .span4 { - width: 228px; - } - .span3 { - width: 166px; - } - .span2 { - width: 104px; - } - .span1 { - width: 42px; - } - .offset12 { - margin-left: 764px; - } - .offset11 { - margin-left: 702px; - } - .offset10 { - margin-left: 640px; - } - .offset9 { - margin-left: 578px; - } - .offset8 { - margin-left: 516px; - } - .offset7 { - margin-left: 454px; - } - .offset6 { - margin-left: 392px; - } - .offset5 { - margin-left: 330px; - } - .offset4 { - margin-left: 268px; - } - .offset3 { - margin-left: 206px; - } - .offset2 { - margin-left: 144px; - } - .offset1 { - margin-left: 82px; - } - .row-fluid { - width: 100%; - *zoom: 1; - } - .row-fluid:before, - .row-fluid:after { - display: table; - content: ""; - } - .row-fluid:after { - clear: both; - } - .row-fluid [class*="span"] { - display: block; - float: left; - width: 100%; - min-height: 28px; - margin-left: 2.762430939%; - *margin-left: 2.709239449638298%; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - -ms-box-sizing: border-box; - box-sizing: border-box; - } - .row-fluid [class*="span"]:first-child { - margin-left: 0; - } - .row-fluid .span12 { - width: 99.999999993%; - *width: 99.9468085036383%; - } - .row-fluid .span11 { - width: 91.436464082%; - *width: 91.38327259263829%; - } - .row-fluid .span10 { - width: 82.87292817100001%; - *width: 82.8197366816383%; - } - .row-fluid .span9 { - width: 74.30939226%; - *width: 74.25620077063829%; - } - .row-fluid .span8 { - width: 65.74585634900001%; - *width: 65.6926648596383%; - } - .row-fluid .span7 { - width: 57.182320438000005%; - *width: 57.129128948638304%; - } - .row-fluid .span6 { - width: 48.618784527%; - *width: 48.5655930376383%; - } - .row-fluid .span5 { - width: 40.055248616%; - *width: 40.0020571266383%; - } - .row-fluid .span4 { - width: 31.491712705%; - *width: 31.4385212156383%; - } - .row-fluid .span3 { - width: 22.928176794%; - *width: 22.874985304638297%; - } - .row-fluid .span2 { - width: 14.364640883%; - *width: 14.311449393638298%; - } - .row-fluid .span1 { - width: 5.801104972%; - *width: 5.747913482638298%; - } - input, - textarea, - .uneditable-input { - margin-left: 0; - } - input.span12, - textarea.span12, - .uneditable-input.span12 { - width: 714px; - } - input.span11, - textarea.span11, - .uneditable-input.span11 { - width: 652px; - } - input.span10, - textarea.span10, - .uneditable-input.span10 { - width: 590px; - } - input.span9, - textarea.span9, - .uneditable-input.span9 { - width: 528px; - } - input.span8, - textarea.span8, - .uneditable-input.span8 { - width: 466px; - } - input.span7, - textarea.span7, - .uneditable-input.span7 { - width: 404px; - } - input.span6, - textarea.span6, - .uneditable-input.span6 { - width: 342px; - } - input.span5, - textarea.span5, - .uneditable-input.span5 { - width: 280px; - } - input.span4, - textarea.span4, - .uneditable-input.span4 { - width: 218px; - } - input.span3, - textarea.span3, - .uneditable-input.span3 { - width: 156px; - } - input.span2, - textarea.span2, - .uneditable-input.span2 { - width: 94px; - } - input.span1, - textarea.span1, - .uneditable-input.span1 { - width: 32px; - } -} - -@media (min-width: 1200px) { - .row { - margin-left: -30px; - *zoom: 1; - } - .row:before, - .row:after { - display: table; - content: ""; - } - .row:after { - clear: both; - } - [class*="span"] { - float: left; - margin-left: 30px; - } - .container, - .navbar-fixed-top .container, - .navbar-fixed-bottom .container { - width: 1170px; - } - .span12 { - width: 1170px; - } - .span11 { - width: 1070px; - } - .span10 { - width: 970px; - } - .span9 { - width: 870px; - } - .span8 { - width: 770px; - } - .span7 { - width: 670px; - } - .span6 { - width: 570px; - } - .span5 { - width: 470px; - } - .span4 { - width: 370px; - } - .span3 { - width: 270px; - } - .span2 { - width: 170px; - } - .span1 { - width: 70px; - } - .offset12 { - margin-left: 1230px; - } - .offset11 { - margin-left: 1130px; - } - .offset10 { - margin-left: 1030px; - } - .offset9 { - margin-left: 930px; - } - .offset8 { - margin-left: 830px; - } - .offset7 { - margin-left: 730px; - } - .offset6 { - margin-left: 630px; - } - .offset5 { - margin-left: 530px; - } - .offset4 { - margin-left: 430px; - } - .offset3 { - margin-left: 330px; - } - .offset2 { - margin-left: 230px; - } - .offset1 { - margin-left: 130px; - } - .row-fluid { - width: 100%; - *zoom: 1; - } - .row-fluid:before, - .row-fluid:after { - display: table; - content: ""; - } - .row-fluid:after { - clear: both; - } - .row-fluid [class*="span"] { - display: block; - float: left; - width: 100%; - min-height: 28px; - margin-left: 2.564102564%; - *margin-left: 2.510911074638298%; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - -ms-box-sizing: border-box; - box-sizing: border-box; - } - .row-fluid [class*="span"]:first-child { - margin-left: 0; - } - .row-fluid .span12 { - width: 100%; - *width: 99.94680851063829%; - } - .row-fluid .span11 { - width: 91.45299145300001%; - *width: 91.3997999636383%; - } - .row-fluid .span10 { - width: 82.905982906%; - *width: 82.8527914166383%; - } - .row-fluid .span9 { - width: 74.358974359%; - *width: 74.30578286963829%; - } - .row-fluid .span8 { - width: 65.81196581200001%; - *width: 65.7587743226383%; - } - .row-fluid .span7 { - width: 57.264957265%; - *width: 57.2117657756383%; - } - .row-fluid .span6 { - width: 48.717948718%; - *width: 48.6647572286383%; - } - .row-fluid .span5 { - width: 40.170940171000005%; - *width: 40.117748681638304%; - } - .row-fluid .span4 { - width: 31.623931624%; - *width: 31.5707401346383%; - } - .row-fluid .span3 { - width: 23.076923077%; - *width: 23.0237315876383%; - } - .row-fluid .span2 { - width: 14.529914530000001%; - *width: 14.4767230406383%; - } - .row-fluid .span1 { - width: 5.982905983%; - *width: 5.929714493638298%; - } - input, - textarea, - .uneditable-input { - margin-left: 0; - } - input.span12, - textarea.span12, - .uneditable-input.span12 { - width: 1160px; - } - input.span11, - textarea.span11, - .uneditable-input.span11 { - width: 1060px; - } - input.span10, - textarea.span10, - .uneditable-input.span10 { - width: 960px; - } - input.span9, - textarea.span9, - .uneditable-input.span9 { - width: 860px; - } - input.span8, - textarea.span8, - .uneditable-input.span8 { - width: 760px; - } - input.span7, - textarea.span7, - .uneditable-input.span7 { - width: 660px; - } - input.span6, - textarea.span6, - .uneditable-input.span6 { - width: 560px; - } - input.span5, - textarea.span5, - .uneditable-input.span5 { - width: 460px; - } - input.span4, - textarea.span4, - .uneditable-input.span4 { - width: 360px; - } - input.span3, - textarea.span3, - .uneditable-input.span3 { - width: 260px; - } - input.span2, - textarea.span2, - .uneditable-input.span2 { - width: 160px; - } - input.span1, - textarea.span1, - .uneditable-input.span1 { - width: 60px; - } - .thumbnails { - margin-left: -30px; - } - .thumbnails > li { - margin-left: 30px; - } - .row-fluid .thumbnails { - margin-left: 0; - } -} - -@media (max-width: 979px) { - body { - padding-top: 0; - } - .navbar-fixed-top { - position: static; - margin-bottom: 18px; - } - .navbar-fixed-top .navbar-inner { - padding: 5px; - } - .navbar .container { - width: auto; - padding: 0; - } - .navbar .brand { - padding-right: 10px; - padding-left: 10px; - margin: 0 0 0 -5px; - } - .nav-collapse { - clear: both; - } - .nav-collapse .nav { - float: none; - margin: 0 0 9px; - } - .nav-collapse .nav > li { - float: none; - } - .nav-collapse .nav > li > a { - margin-bottom: 2px; - } - .nav-collapse .nav > .divider-vertical { - display: none; - } - .nav-collapse .nav .nav-header { - color: #999999; - text-shadow: none; - } - .nav-collapse .nav > li > a, - .nav-collapse .dropdown-menu a { - padding: 6px 15px; - font-weight: bold; - color: #999999; - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - border-radius: 3px; - } - .nav-collapse .btn { - padding: 4px 10px 4px; - font-weight: normal; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; - } - .nav-collapse .dropdown-menu li + li a { - margin-bottom: 2px; - } - .nav-collapse .nav > li > a:hover, - .nav-collapse .dropdown-menu a:hover { - background-color: #222222; - } - .nav-collapse.in .btn-group { - padding: 0; - margin-top: 5px; - } - .nav-collapse .dropdown-menu { - position: static; - top: auto; - left: auto; - display: block; - float: none; - max-width: none; - padding: 0; - margin: 0 15px; - background-color: transparent; - border: none; - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; - -webkit-box-shadow: none; - -moz-box-shadow: none; - box-shadow: none; - } - .nav-collapse .dropdown-menu:before, - .nav-collapse .dropdown-menu:after { - display: none; - } - .nav-collapse .dropdown-menu .divider { - display: none; - } - .nav-collapse .navbar-form, - .nav-collapse .navbar-search { - float: none; - padding: 9px 15px; - margin: 9px 0; - border-top: 1px solid #222222; - border-bottom: 1px solid #222222; - -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); - -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); - box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); - } - .navbar .nav-collapse .nav.pull-right { - float: none; - margin-left: 0; - } - .nav-collapse, - .nav-collapse.collapse { - height: 0; - overflow: hidden; - } - .navbar .btn-navbar { - display: block; - } - .navbar-static .navbar-inner { - padding-right: 10px; - padding-left: 10px; - } -} - -@media (min-width: 980px) { - .nav-collapse.collapse { - height: auto !important; - overflow: visible !important; - } -} diff --git a/debian/modules/naxsi/contrib/naxsi-ui/bootstrap/css/bootstrap-responsive.min.css b/debian/modules/naxsi/contrib/naxsi-ui/bootstrap/css/bootstrap-responsive.min.css deleted file mode 100644 index dd134a1..0000000 --- a/debian/modules/naxsi/contrib/naxsi-ui/bootstrap/css/bootstrap-responsive.min.css +++ /dev/null @@ -1,9 +0,0 @@ -/*! - * Bootstrap Responsive v2.0.3 - * - * Copyright 2012 Twitter, Inc - * Licensed under the Apache License v2.0 - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Designed and built with all the love in the world @twitter by @mdo and @fat. - */.clearfix{*zoom:1}.clearfix:before,.clearfix:after{display:table;content:""}.clearfix:after{clear:both}.hide-text{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.input-block-level{display:block;width:100%;min-height:28px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;-ms-box-sizing:border-box;box-sizing:border-box}.hidden{display:none;visibility:hidden}.visible-phone{display:none!important}.visible-tablet{display:none!important}.hidden-desktop{display:none!important}@media(max-width:767px){.visible-phone{display:inherit!important}.hidden-phone{display:none!important}.hidden-desktop{display:inherit!important}.visible-desktop{display:none!important}}@media(min-width:768px) and (max-width:979px){.visible-tablet{display:inherit!important}.hidden-tablet{display:none!important}.hidden-desktop{display:inherit!important}.visible-desktop{display:none!important}}@media(max-width:480px){.nav-collapse{-webkit-transform:translate3d(0,0,0)}.page-header h1 small{display:block;line-height:18px}input[type="checkbox"],input[type="radio"]{border:1px solid #ccc}.form-horizontal .control-group>label{float:none;width:auto;padding-top:0;text-align:left}.form-horizontal .controls{margin-left:0}.form-horizontal .control-list{padding-top:0}.form-horizontal .form-actions{padding-right:10px;padding-left:10px}.modal{position:absolute;top:10px;right:10px;left:10px;width:auto;margin:0}.modal.fade.in{top:auto}.modal-header .close{padding:10px;margin:-10px}.carousel-caption{position:static}}@media(max-width:767px){body{padding-right:20px;padding-left:20px}.navbar-fixed-top,.navbar-fixed-bottom{margin-right:-20px;margin-left:-20px}.container-fluid{padding:0}.dl-horizontal dt{float:none;width:auto;clear:none;text-align:left}.dl-horizontal dd{margin-left:0}.container{width:auto}.row-fluid{width:100%}.row,.thumbnails{margin-left:0}[class*="span"],.row-fluid [class*="span"]{display:block;float:none;width:auto;margin-left:0}.input-large,.input-xlarge,.input-xxlarge,input[class*="span"],select[class*="span"],textarea[class*="span"],.uneditable-input{display:block;width:100%;min-height:28px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;-ms-box-sizing:border-box;box-sizing:border-box}.input-prepend input,.input-append input,.input-prepend input[class*="span"],.input-append input[class*="span"]{display:inline-block;width:auto}}@media(min-width:768px) and (max-width:979px){.row{margin-left:-20px;*zoom:1}.row:before,.row:after{display:table;content:""}.row:after{clear:both}[class*="span"]{float:left;margin-left:20px}.container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:724px}.span12{width:724px}.span11{width:662px}.span10{width:600px}.span9{width:538px}.span8{width:476px}.span7{width:414px}.span6{width:352px}.span5{width:290px}.span4{width:228px}.span3{width:166px}.span2{width:104px}.span1{width:42px}.offset12{margin-left:764px}.offset11{margin-left:702px}.offset10{margin-left:640px}.offset9{margin-left:578px}.offset8{margin-left:516px}.offset7{margin-left:454px}.offset6{margin-left:392px}.offset5{margin-left:330px}.offset4{margin-left:268px}.offset3{margin-left:206px}.offset2{margin-left:144px}.offset1{margin-left:82px}.row-fluid{width:100%;*zoom:1}.row-fluid:before,.row-fluid:after{display:table;content:""}.row-fluid:after{clear:both}.row-fluid [class*="span"]{display:block;float:left;width:100%;min-height:28px;margin-left:2.762430939%;*margin-left:2.709239449638298%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;-ms-box-sizing:border-box;box-sizing:border-box}.row-fluid [class*="span"]:first-child{margin-left:0}.row-fluid .span12{width:99.999999993%;*width:99.9468085036383%}.row-fluid .span11{width:91.436464082%;*width:91.38327259263829%}.row-fluid .span10{width:82.87292817100001%;*width:82.8197366816383%}.row-fluid .span9{width:74.30939226%;*width:74.25620077063829%}.row-fluid .span8{width:65.74585634900001%;*width:65.6926648596383%}.row-fluid .span7{width:57.182320438000005%;*width:57.129128948638304%}.row-fluid .span6{width:48.618784527%;*width:48.5655930376383%}.row-fluid .span5{width:40.055248616%;*width:40.0020571266383%}.row-fluid .span4{width:31.491712705%;*width:31.4385212156383%}.row-fluid .span3{width:22.928176794%;*width:22.874985304638297%}.row-fluid .span2{width:14.364640883%;*width:14.311449393638298%}.row-fluid .span1{width:5.801104972%;*width:5.747913482638298%}input,textarea,.uneditable-input{margin-left:0}input.span12,textarea.span12,.uneditable-input.span12{width:714px}input.span11,textarea.span11,.uneditable-input.span11{width:652px}input.span10,textarea.span10,.uneditable-input.span10{width:590px}input.span9,textarea.span9,.uneditable-input.span9{width:528px}input.span8,textarea.span8,.uneditable-input.span8{width:466px}input.span7,textarea.span7,.uneditable-input.span7{width:404px}input.span6,textarea.span6,.uneditable-input.span6{width:342px}input.span5,textarea.span5,.uneditable-input.span5{width:280px}input.span4,textarea.span4,.uneditable-input.span4{width:218px}input.span3,textarea.span3,.uneditable-input.span3{width:156px}input.span2,textarea.span2,.uneditable-input.span2{width:94px}input.span1,textarea.span1,.uneditable-input.span1{width:32px}}@media(min-width:1200px){.row{margin-left:-30px;*zoom:1}.row:before,.row:after{display:table;content:""}.row:after{clear:both}[class*="span"]{float:left;margin-left:30px}.container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:1170px}.span12{width:1170px}.span11{width:1070px}.span10{width:970px}.span9{width:870px}.span8{width:770px}.span7{width:670px}.span6{width:570px}.span5{width:470px}.span4{width:370px}.span3{width:270px}.span2{width:170px}.span1{width:70px}.offset12{margin-left:1230px}.offset11{margin-left:1130px}.offset10{margin-left:1030px}.offset9{margin-left:930px}.offset8{margin-left:830px}.offset7{margin-left:730px}.offset6{margin-left:630px}.offset5{margin-left:530px}.offset4{margin-left:430px}.offset3{margin-left:330px}.offset2{margin-left:230px}.offset1{margin-left:130px}.row-fluid{width:100%;*zoom:1}.row-fluid:before,.row-fluid:after{display:table;content:""}.row-fluid:after{clear:both}.row-fluid [class*="span"]{display:block;float:left;width:100%;min-height:28px;margin-left:2.564102564%;*margin-left:2.510911074638298%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;-ms-box-sizing:border-box;box-sizing:border-box}.row-fluid [class*="span"]:first-child{margin-left:0}.row-fluid .span12{width:100%;*width:99.94680851063829%}.row-fluid .span11{width:91.45299145300001%;*width:91.3997999636383%}.row-fluid .span10{width:82.905982906%;*width:82.8527914166383%}.row-fluid .span9{width:74.358974359%;*width:74.30578286963829%}.row-fluid .span8{width:65.81196581200001%;*width:65.7587743226383%}.row-fluid .span7{width:57.264957265%;*width:57.2117657756383%}.row-fluid .span6{width:48.717948718%;*width:48.6647572286383%}.row-fluid .span5{width:40.170940171000005%;*width:40.117748681638304%}.row-fluid .span4{width:31.623931624%;*width:31.5707401346383%}.row-fluid .span3{width:23.076923077%;*width:23.0237315876383%}.row-fluid .span2{width:14.529914530000001%;*width:14.4767230406383%}.row-fluid .span1{width:5.982905983%;*width:5.929714493638298%}input,textarea,.uneditable-input{margin-left:0}input.span12,textarea.span12,.uneditable-input.span12{width:1160px}input.span11,textarea.span11,.uneditable-input.span11{width:1060px}input.span10,textarea.span10,.uneditable-input.span10{width:960px}input.span9,textarea.span9,.uneditable-input.span9{width:860px}input.span8,textarea.span8,.uneditable-input.span8{width:760px}input.span7,textarea.span7,.uneditable-input.span7{width:660px}input.span6,textarea.span6,.uneditable-input.span6{width:560px}input.span5,textarea.span5,.uneditable-input.span5{width:460px}input.span4,textarea.span4,.uneditable-input.span4{width:360px}input.span3,textarea.span3,.uneditable-input.span3{width:260px}input.span2,textarea.span2,.uneditable-input.span2{width:160px}input.span1,textarea.span1,.uneditable-input.span1{width:60px}.thumbnails{margin-left:-30px}.thumbnails>li{margin-left:30px}.row-fluid .thumbnails{margin-left:0}}@media(max-width:979px){body{padding-top:0}.navbar-fixed-top{position:static;margin-bottom:18px}.navbar-fixed-top .navbar-inner{padding:5px}.navbar .container{width:auto;padding:0}.navbar .brand{padding-right:10px;padding-left:10px;margin:0 0 0 -5px}.nav-collapse{clear:both}.nav-collapse .nav{float:none;margin:0 0 9px}.nav-collapse .nav>li{float:none}.nav-collapse .nav>li>a{margin-bottom:2px}.nav-collapse .nav>.divider-vertical{display:none}.nav-collapse .nav .nav-header{color:#999;text-shadow:none}.nav-collapse .nav>li>a,.nav-collapse .dropdown-menu a{padding:6px 15px;font-weight:bold;color:#999;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.nav-collapse .btn{padding:4px 10px 4px;font-weight:normal;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.nav-collapse .dropdown-menu li+li a{margin-bottom:2px}.nav-collapse .nav>li>a:hover,.nav-collapse .dropdown-menu a:hover{background-color:#222}.nav-collapse.in .btn-group{padding:0;margin-top:5px}.nav-collapse .dropdown-menu{position:static;top:auto;left:auto;display:block;float:none;max-width:none;padding:0;margin:0 15px;background-color:transparent;border:0;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.nav-collapse .dropdown-menu:before,.nav-collapse .dropdown-menu:after{display:none}.nav-collapse .dropdown-menu .divider{display:none}.nav-collapse .navbar-form,.nav-collapse .navbar-search{float:none;padding:9px 15px;margin:9px 0;border-top:1px solid #222;border-bottom:1px solid #222;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1);box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1)}.navbar .nav-collapse .nav.pull-right{float:none;margin-left:0}.nav-collapse,.nav-collapse.collapse{height:0;overflow:hidden}.navbar .btn-navbar{display:block}.navbar-static .navbar-inner{padding-right:10px;padding-left:10px}}@media(min-width:980px){.nav-collapse.collapse{height:auto!important;overflow:visible!important}} diff --git a/debian/modules/naxsi/contrib/naxsi-ui/bootstrap/css/bootstrap.css b/debian/modules/naxsi/contrib/naxsi-ui/bootstrap/css/bootstrap.css deleted file mode 100644 index 09e2833..0000000 --- a/debian/modules/naxsi/contrib/naxsi-ui/bootstrap/css/bootstrap.css +++ /dev/null @@ -1,4960 +0,0 @@ -/*! - * Bootstrap v2.0.3 - * - * Copyright 2012 Twitter, Inc - * Licensed under the Apache License v2.0 - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Designed and built with all the love in the world @twitter by @mdo and @fat. - */ - -article, -aside, -details, -figcaption, -figure, -footer, -header, -hgroup, -nav, -section { - display: block; -} - -audio, -canvas, -video { - display: inline-block; - *display: inline; - *zoom: 1; -} - -audio:not([controls]) { - display: none; -} - -html { - font-size: 100%; - -webkit-text-size-adjust: 100%; - -ms-text-size-adjust: 100%; -} - -a:focus { - outline: thin dotted #333; - outline: 5px auto -webkit-focus-ring-color; - outline-offset: -2px; -} - -a:hover, -a:active { - outline: 0; -} - -sub, -sup { - position: relative; - font-size: 75%; - line-height: 0; - vertical-align: baseline; -} - -sup { - top: -0.5em; -} - -sub { - bottom: -0.25em; -} - -img { - max-width: 100%; - vertical-align: middle; - border: 0; - -ms-interpolation-mode: bicubic; -} - -button, -input, -select, -textarea { - margin: 0; - font-size: 100%; - vertical-align: middle; -} - -button, -input { - *overflow: visible; - line-height: normal; -} - -button::-moz-focus-inner, -input::-moz-focus-inner { - padding: 0; - border: 0; -} - -button, -input[type="button"], -input[type="reset"], -input[type="submit"] { - cursor: pointer; - -webkit-appearance: button; -} - -input[type="search"] { - -webkit-box-sizing: content-box; - -moz-box-sizing: content-box; - box-sizing: content-box; - -webkit-appearance: textfield; -} - -input[type="search"]::-webkit-search-decoration, -input[type="search"]::-webkit-search-cancel-button { - -webkit-appearance: none; -} - -textarea { - overflow: auto; - vertical-align: top; -} - -.clearfix { - *zoom: 1; -} - -.clearfix:before, -.clearfix:after { - display: table; - content: ""; -} - -.clearfix:after { - clear: both; -} - -.hide-text { - font: 0/0 a; - color: transparent; - text-shadow: none; - background-color: transparent; - border: 0; -} - -.input-block-level { - display: block; - width: 100%; - min-height: 28px; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - -ms-box-sizing: border-box; - box-sizing: border-box; -} - -body { - margin: 0; - font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; - font-size: 13px; - line-height: 18px; - color: #333333; - background-color: #ffffff; -} - -a { - color: #0088cc; - text-decoration: none; -} - -a:hover { - color: #005580; - text-decoration: underline; -} - -.row { - margin-left: -20px; - *zoom: 1; -} - -.row:before, -.row:after { - display: table; - content: ""; -} - -.row:after { - clear: both; -} - -[class*="span"] { - float: left; - margin-left: 20px; -} - -.container, -.navbar-fixed-top .container, -.navbar-fixed-bottom .container { - width: 940px; -} - -.span12 { - width: 940px; -} - -.span11 { - width: 860px; -} - -.span10 { - width: 780px; -} - -.span9 { - width: 700px; -} - -.span8 { - width: 620px; -} - -.span7 { - width: 540px; -} - -.span6 { - width: 460px; -} - -.span5 { - width: 380px; -} - -.span4 { - width: 300px; -} - -.span3 { - width: 220px; -} - -.span2 { - width: 140px; -} - -.span1 { - width: 60px; -} - -.offset12 { - margin-left: 980px; -} - -.offset11 { - margin-left: 900px; -} - -.offset10 { - margin-left: 820px; -} - -.offset9 { - margin-left: 740px; -} - -.offset8 { - margin-left: 660px; -} - -.offset7 { - margin-left: 580px; -} - -.offset6 { - margin-left: 500px; -} - -.offset5 { - margin-left: 420px; -} - -.offset4 { - margin-left: 340px; -} - -.offset3 { - margin-left: 260px; -} - -.offset2 { - margin-left: 180px; -} - -.offset1 { - margin-left: 100px; -} - -.row-fluid { - width: 100%; - *zoom: 1; -} - -.row-fluid:before, -.row-fluid:after { - display: table; - content: ""; -} - -.row-fluid:after { - clear: both; -} - -.row-fluid [class*="span"] { - display: block; - float: left; - width: 100%; - min-height: 28px; - margin-left: 2.127659574%; - *margin-left: 2.0744680846382977%; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - -ms-box-sizing: border-box; - box-sizing: border-box; -} - -.row-fluid [class*="span"]:first-child { - margin-left: 0; -} - -.row-fluid .span12 { - width: 99.99999998999999%; - *width: 99.94680850063828%; -} - -.row-fluid .span11 { - width: 91.489361693%; - *width: 91.4361702036383%; -} - -.row-fluid .span10 { - width: 82.97872339599999%; - *width: 82.92553190663828%; -} - -.row-fluid .span9 { - width: 74.468085099%; - *width: 74.4148936096383%; -} - -.row-fluid .span8 { - width: 65.95744680199999%; - *width: 65.90425531263828%; -} - -.row-fluid .span7 { - width: 57.446808505%; - *width: 57.3936170156383%; -} - -.row-fluid .span6 { - width: 48.93617020799999%; - *width: 48.88297871863829%; -} - -.row-fluid .span5 { - width: 40.425531911%; - *width: 40.3723404216383%; -} - -.row-fluid .span4 { - width: 31.914893614%; - *width: 31.8617021246383%; -} - -.row-fluid .span3 { - width: 23.404255317%; - *width: 23.3510638276383%; -} - -.row-fluid .span2 { - width: 14.89361702%; - *width: 14.8404255306383%; -} - -.row-fluid .span1 { - width: 6.382978723%; - *width: 6.329787233638298%; -} - -.container { - margin-right: auto; - margin-left: auto; - *zoom: 1; -} - -.container:before, -.container:after { - display: table; - content: ""; -} - -.container:after { - clear: both; -} - -.container-fluid { - padding-right: 20px; - padding-left: 20px; - *zoom: 1; -} - -.container-fluid:before, -.container-fluid:after { - display: table; - content: ""; -} - -.container-fluid:after { - clear: both; -} - -p { - margin: 0 0 9px; - font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; - font-size: 13px; - line-height: 18px; -} - -p small { - font-size: 11px; - color: #999999; -} - -.lead { - margin-bottom: 18px; - font-size: 20px; - font-weight: 200; - line-height: 27px; -} - -h1, -h2, -h3, -h4, -h5, -h6 { - margin: 0; - font-family: inherit; - font-weight: bold; - color: inherit; - text-rendering: optimizelegibility; -} - -h1 small, -h2 small, -h3 small, -h4 small, -h5 small, -h6 small { - font-weight: normal; - color: #999999; -} - -h1 { - font-size: 30px; - line-height: 36px; -} - -h1 small { - font-size: 18px; -} - -h2 { - font-size: 24px; - line-height: 36px; -} - -h2 small { - font-size: 18px; -} - -h3 { - font-size: 18px; - line-height: 27px; -} - -h3 small { - font-size: 14px; -} - -h4, -h5, -h6 { - line-height: 18px; -} - -h4 { - font-size: 14px; -} - -h4 small { - font-size: 12px; -} - -h5 { - font-size: 12px; -} - -h6 { - font-size: 11px; - color: #999999; - text-transform: uppercase; -} - -.page-header { - padding-bottom: 17px; - margin: 18px 0; - border-bottom: 1px solid #eeeeee; -} - -.page-header h1 { - line-height: 1; -} - -ul, -ol { - padding: 0; - margin: 0 0 9px 25px; -} - -ul ul, -ul ol, -ol ol, -ol ul { - margin-bottom: 0; -} - -ul { - list-style: disc; -} - -ol { - list-style: decimal; -} - -li { - line-height: 18px; -} - -ul.unstyled, -ol.unstyled { - margin-left: 0; - list-style: none; -} - -dl { - margin-bottom: 18px; -} - -dt, -dd { - line-height: 18px; -} - -dt { - font-weight: bold; - line-height: 17px; -} - -dd { - margin-left: 9px; -} - -.dl-horizontal dt { - float: left; - width: 120px; - overflow: hidden; - clear: left; - text-align: right; - text-overflow: ellipsis; - white-space: nowrap; -} - -.dl-horizontal dd { - margin-left: 130px; -} - -hr { - margin: 18px 0; - border: 0; - border-top: 1px solid #eeeeee; - border-bottom: 1px solid #ffffff; -} - -strong { - font-weight: bold; -} - -em { - font-style: italic; -} - -.muted { - color: #999999; -} - -abbr[title] { - cursor: help; - border-bottom: 1px dotted #ddd; -} - -abbr.initialism { - font-size: 90%; - text-transform: uppercase; -} - -blockquote { - padding: 0 0 0 15px; - margin: 0 0 18px; - border-left: 5px solid #eeeeee; -} - -blockquote p { - margin-bottom: 0; - font-size: 16px; - font-weight: 300; - line-height: 22.5px; -} - -blockquote small { - display: block; - line-height: 18px; - color: #999999; -} - -blockquote small:before { - content: '\2014 \00A0'; -} - -blockquote.pull-right { - float: right; - padding-right: 15px; - padding-left: 0; - border-right: 5px solid #eeeeee; - border-left: 0; -} - -blockquote.pull-right p, -blockquote.pull-right small { - text-align: right; -} - -q:before, -q:after, -blockquote:before, -blockquote:after { - content: ""; -} - -address { - display: block; - margin-bottom: 18px; - font-style: normal; - line-height: 18px; -} - -small { - font-size: 100%; -} - -cite { - font-style: normal; -} - -code, -pre { - padding: 0 3px 2px; - font-family: Menlo, Monaco, Consolas, "Courier New", monospace; - font-size: 12px; - color: #333333; - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - border-radius: 3px; -} - -code { - padding: 2px 4px; - color: #d14; - background-color: #f7f7f9; - border: 1px solid #e1e1e8; -} - -pre { - display: block; - padding: 8.5px; - margin: 0 0 9px; - font-size: 12.025px; - line-height: 18px; - word-break: break-all; - word-wrap: break-word; - white-space: pre; - white-space: pre-wrap; - background-color: #f5f5f5; - border: 1px solid #ccc; - border: 1px solid rgba(0, 0, 0, 0.15); - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; -} - -pre.prettyprint { - margin-bottom: 18px; -} - -pre code { - padding: 0; - color: inherit; - background-color: transparent; - border: 0; -} - -.pre-scrollable { - max-height: 340px; - overflow-y: scroll; -} - -form { - margin: 0 0 18px; -} - -fieldset { - padding: 0; - margin: 0; - border: 0; -} - -legend { - display: block; - width: 100%; - padding: 0; - margin-bottom: 27px; - font-size: 19.5px; - line-height: 36px; - color: #333333; - border: 0; - border-bottom: 1px solid #eee; -} - -legend small { - font-size: 13.5px; - color: #999999; -} - -label, -input, -button, -select, -textarea { - font-size: 13px; - font-weight: normal; - line-height: 18px; -} - -input, -button, -select, -textarea { - font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; -} - -label { - display: block; - margin-bottom: 5px; - color: #333333; -} - -input, -textarea, -select, -.uneditable-input { - display: inline-block; - width: 210px; - height: 18px; - padding: 4px; - margin-bottom: 9px; - font-size: 13px; - line-height: 18px; - color: #555555; - background-color: #ffffff; - border: 1px solid #cccccc; - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - border-radius: 3px; -} - -.uneditable-textarea { - width: auto; - height: auto; -} - -label input, -label textarea, -label select { - display: block; -} - -input[type="image"], -input[type="checkbox"], -input[type="radio"] { - width: auto; - height: auto; - padding: 0; - margin: 3px 0; - *margin-top: 0; - /* IE7 */ - - line-height: normal; - cursor: pointer; - background-color: transparent; - border: 0 \9; - /* IE9 and down */ - - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} - -input[type="image"] { - border: 0; -} - -input[type="file"] { - width: auto; - padding: initial; - line-height: initial; - background-color: #ffffff; - background-color: initial; - border: initial; - -webkit-box-shadow: none; - -moz-box-shadow: none; - box-shadow: none; -} - -input[type="button"], -input[type="reset"], -input[type="submit"] { - width: auto; - height: auto; -} - -select, -input[type="file"] { - height: 28px; - /* In IE7, the height of the select element cannot be changed by height, only font-size */ - - *margin-top: 4px; - /* For IE7, add top margin to align select with labels */ - - line-height: 28px; -} - -input[type="file"] { - line-height: 18px \9; -} - -select { - width: 220px; - background-color: #ffffff; -} - -select[multiple], -select[size] { - height: auto; -} - -input[type="image"] { - -webkit-box-shadow: none; - -moz-box-shadow: none; - box-shadow: none; -} - -textarea { - height: auto; -} - -input[type="hidden"] { - display: none; -} - -.radio, -.checkbox { - min-height: 18px; - padding-left: 18px; -} - -.radio input[type="radio"], -.checkbox input[type="checkbox"] { - float: left; - margin-left: -18px; -} - -.controls > .radio:first-child, -.controls > .checkbox:first-child { - padding-top: 5px; -} - -.radio.inline, -.checkbox.inline { - display: inline-block; - padding-top: 5px; - margin-bottom: 0; - vertical-align: middle; -} - -.radio.inline + .radio.inline, -.checkbox.inline + .checkbox.inline { - margin-left: 10px; -} - -input, -textarea { - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - -webkit-transition: border linear 0.2s, box-shadow linear 0.2s; - -moz-transition: border linear 0.2s, box-shadow linear 0.2s; - -ms-transition: border linear 0.2s, box-shadow linear 0.2s; - -o-transition: border linear 0.2s, box-shadow linear 0.2s; - transition: border linear 0.2s, box-shadow linear 0.2s; -} - -input:focus, -textarea:focus { - border-color: rgba(82, 168, 236, 0.8); - outline: 0; - outline: thin dotted \9; - /* IE6-9 */ - - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6); - -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6); -} - -input[type="file"]:focus, -input[type="radio"]:focus, -input[type="checkbox"]:focus, -select:focus { - outline: thin dotted #333; - outline: 5px auto -webkit-focus-ring-color; - outline-offset: -2px; - -webkit-box-shadow: none; - -moz-box-shadow: none; - box-shadow: none; -} - -.input-mini { - width: 60px; -} - -.input-small { - width: 90px; -} - -.input-medium { - width: 150px; -} - -.input-large { - width: 210px; -} - -.input-xlarge { - width: 270px; -} - -.input-xxlarge { - width: 530px; -} - -input[class*="span"], -select[class*="span"], -textarea[class*="span"], -.uneditable-input[class*="span"], -.row-fluid input[class*="span"], -.row-fluid select[class*="span"], -.row-fluid textarea[class*="span"], -.row-fluid .uneditable-input[class*="span"] { - float: none; - margin-left: 0; -} - -input, -textarea, -.uneditable-input { - margin-left: 0; -} - -input.span12, -textarea.span12, -.uneditable-input.span12 { - width: 930px; -} - -input.span11, -textarea.span11, -.uneditable-input.span11 { - width: 850px; -} - -input.span10, -textarea.span10, -.uneditable-input.span10 { - width: 770px; -} - -input.span9, -textarea.span9, -.uneditable-input.span9 { - width: 690px; -} - -input.span8, -textarea.span8, -.uneditable-input.span8 { - width: 610px; -} - -input.span7, -textarea.span7, -.uneditable-input.span7 { - width: 530px; -} - -input.span6, -textarea.span6, -.uneditable-input.span6 { - width: 450px; -} - -input.span5, -textarea.span5, -.uneditable-input.span5 { - width: 370px; -} - -input.span4, -textarea.span4, -.uneditable-input.span4 { - width: 290px; -} - -input.span3, -textarea.span3, -.uneditable-input.span3 { - width: 210px; -} - -input.span2, -textarea.span2, -.uneditable-input.span2 { - width: 130px; -} - -input.span1, -textarea.span1, -.uneditable-input.span1 { - width: 50px; -} - -input[disabled], -select[disabled], -textarea[disabled], -input[readonly], -select[readonly], -textarea[readonly] { - cursor: not-allowed; - background-color: #eeeeee; - border-color: #ddd; -} - -input[type="radio"][disabled], -input[type="checkbox"][disabled], -input[type="radio"][readonly], -input[type="checkbox"][readonly] { - background-color: transparent; -} - -.control-group.warning > label, -.control-group.warning .help-block, -.control-group.warning .help-inline { - color: #c09853; -} - -.control-group.warning input, -.control-group.warning select, -.control-group.warning textarea { - color: #c09853; - border-color: #c09853; -} - -.control-group.warning input:focus, -.control-group.warning select:focus, -.control-group.warning textarea:focus { - border-color: #a47e3c; - -webkit-box-shadow: 0 0 6px #dbc59e; - -moz-box-shadow: 0 0 6px #dbc59e; - box-shadow: 0 0 6px #dbc59e; -} - -.control-group.warning .input-prepend .add-on, -.control-group.warning .input-append .add-on { - color: #c09853; - background-color: #fcf8e3; - border-color: #c09853; -} - -.control-group.error > label, -.control-group.error .help-block, -.control-group.error .help-inline { - color: #b94a48; -} - -.control-group.error input, -.control-group.error select, -.control-group.error textarea { - color: #b94a48; - border-color: #b94a48; -} - -.control-group.error input:focus, -.control-group.error select:focus, -.control-group.error textarea:focus { - border-color: #953b39; - -webkit-box-shadow: 0 0 6px #d59392; - -moz-box-shadow: 0 0 6px #d59392; - box-shadow: 0 0 6px #d59392; -} - -.control-group.error .input-prepend .add-on, -.control-group.error .input-append .add-on { - color: #b94a48; - background-color: #f2dede; - border-color: #b94a48; -} - -.control-group.success > label, -.control-group.success .help-block, -.control-group.success .help-inline { - color: #468847; -} - -.control-group.success input, -.control-group.success select, -.control-group.success textarea { - color: #468847; - border-color: #468847; -} - -.control-group.success input:focus, -.control-group.success select:focus, -.control-group.success textarea:focus { - border-color: #356635; - -webkit-box-shadow: 0 0 6px #7aba7b; - -moz-box-shadow: 0 0 6px #7aba7b; - box-shadow: 0 0 6px #7aba7b; -} - -.control-group.success .input-prepend .add-on, -.control-group.success .input-append .add-on { - color: #468847; - background-color: #dff0d8; - border-color: #468847; -} - -input:focus:required:invalid, -textarea:focus:required:invalid, -select:focus:required:invalid { - color: #b94a48; - border-color: #ee5f5b; -} - -input:focus:required:invalid:focus, -textarea:focus:required:invalid:focus, -select:focus:required:invalid:focus { - border-color: #e9322d; - -webkit-box-shadow: 0 0 6px #f8b9b7; - -moz-box-shadow: 0 0 6px #f8b9b7; - box-shadow: 0 0 6px #f8b9b7; -} - -.form-actions { - padding: 17px 20px 18px; - margin-top: 18px; - margin-bottom: 18px; - background-color: #f5f5f5; - border-top: 1px solid #ddd; - *zoom: 1; -} - -.form-actions:before, -.form-actions:after { - display: table; - content: ""; -} - -.form-actions:after { - clear: both; -} - -.uneditable-input { - overflow: hidden; - white-space: nowrap; - cursor: not-allowed; - background-color: #ffffff; - border-color: #eee; - -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025); - -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025); - box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025); -} - -:-moz-placeholder { - color: #999999; -} - -::-webkit-input-placeholder { - color: #999999; -} - -.help-block, -.help-inline { - color: #555555; -} - -.help-block { - display: block; - margin-bottom: 9px; -} - -.help-inline { - display: inline-block; - *display: inline; - padding-left: 5px; - vertical-align: middle; - *zoom: 1; -} - -.input-prepend, -.input-append { - margin-bottom: 5px; -} - -.input-prepend input, -.input-append input, -.input-prepend select, -.input-append select, -.input-prepend .uneditable-input, -.input-append .uneditable-input { - position: relative; - margin-bottom: 0; - *margin-left: 0; - vertical-align: middle; - -webkit-border-radius: 0 3px 3px 0; - -moz-border-radius: 0 3px 3px 0; - border-radius: 0 3px 3px 0; -} - -.input-prepend input:focus, -.input-append input:focus, -.input-prepend select:focus, -.input-append select:focus, -.input-prepend .uneditable-input:focus, -.input-append .uneditable-input:focus { - z-index: 2; -} - -.input-prepend .uneditable-input, -.input-append .uneditable-input { - border-left-color: #ccc; -} - -.input-prepend .add-on, -.input-append .add-on { - display: inline-block; - width: auto; - height: 18px; - min-width: 16px; - padding: 4px 5px; - font-weight: normal; - line-height: 18px; - text-align: center; - text-shadow: 0 1px 0 #ffffff; - vertical-align: middle; - background-color: #eeeeee; - border: 1px solid #ccc; -} - -.input-prepend .add-on, -.input-append .add-on, -.input-prepend .btn, -.input-append .btn { - margin-left: -1px; - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} - -.input-prepend .active, -.input-append .active { - background-color: #a9dba9; - border-color: #46a546; -} - -.input-prepend .add-on, -.input-prepend .btn { - margin-right: -1px; -} - -.input-prepend .add-on:first-child, -.input-prepend .btn:first-child { - -webkit-border-radius: 3px 0 0 3px; - -moz-border-radius: 3px 0 0 3px; - border-radius: 3px 0 0 3px; -} - -.input-append input, -.input-append select, -.input-append .uneditable-input { - -webkit-border-radius: 3px 0 0 3px; - -moz-border-radius: 3px 0 0 3px; - border-radius: 3px 0 0 3px; -} - -.input-append .uneditable-input { - border-right-color: #ccc; - border-left-color: #eee; -} - -.input-append .add-on:last-child, -.input-append .btn:last-child { - -webkit-border-radius: 0 3px 3px 0; - -moz-border-radius: 0 3px 3px 0; - border-radius: 0 3px 3px 0; -} - -.input-prepend.input-append input, -.input-prepend.input-append select, -.input-prepend.input-append .uneditable-input { - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} - -.input-prepend.input-append .add-on:first-child, -.input-prepend.input-append .btn:first-child { - margin-right: -1px; - -webkit-border-radius: 3px 0 0 3px; - -moz-border-radius: 3px 0 0 3px; - border-radius: 3px 0 0 3px; -} - -.input-prepend.input-append .add-on:last-child, -.input-prepend.input-append .btn:last-child { - margin-left: -1px; - -webkit-border-radius: 0 3px 3px 0; - -moz-border-radius: 0 3px 3px 0; - border-radius: 0 3px 3px 0; -} - -.search-query { - padding-right: 14px; - padding-right: 4px \9; - padding-left: 14px; - padding-left: 4px \9; - /* IE7-8 doesn't have border-radius, so don't indent the padding */ - - margin-bottom: 0; - -webkit-border-radius: 14px; - -moz-border-radius: 14px; - border-radius: 14px; -} - -.form-search input, -.form-inline input, -.form-horizontal input, -.form-search textarea, -.form-inline textarea, -.form-horizontal textarea, -.form-search select, -.form-inline select, -.form-horizontal select, -.form-search .help-inline, -.form-inline .help-inline, -.form-horizontal .help-inline, -.form-search .uneditable-input, -.form-inline .uneditable-input, -.form-horizontal .uneditable-input, -.form-search .input-prepend, -.form-inline .input-prepend, -.form-horizontal .input-prepend, -.form-search .input-append, -.form-inline .input-append, -.form-horizontal .input-append { - display: inline-block; - *display: inline; - margin-bottom: 0; - *zoom: 1; -} - -.form-search .hide, -.form-inline .hide, -.form-horizontal .hide { - display: none; -} - -.form-search label, -.form-inline label { - display: inline-block; -} - -.form-search .input-append, -.form-inline .input-append, -.form-search .input-prepend, -.form-inline .input-prepend { - margin-bottom: 0; -} - -.form-search .radio, -.form-search .checkbox, -.form-inline .radio, -.form-inline .checkbox { - padding-left: 0; - margin-bottom: 0; - vertical-align: middle; -} - -.form-search .radio input[type="radio"], -.form-search .checkbox input[type="checkbox"], -.form-inline .radio input[type="radio"], -.form-inline .checkbox input[type="checkbox"] { - float: left; - margin-right: 3px; - margin-left: 0; -} - -.control-group { - margin-bottom: 9px; -} - -legend + .control-group { - margin-top: 18px; - -webkit-margin-top-collapse: separate; -} - -.form-horizontal .control-group { - margin-bottom: 18px; - *zoom: 1; -} - -.form-horizontal .control-group:before, -.form-horizontal .control-group:after { - display: table; - content: ""; -} - -.form-horizontal .control-group:after { - clear: both; -} - -.form-horizontal .control-label { - float: left; - width: 140px; - padding-top: 5px; - text-align: right; -} - -.form-horizontal .controls { - *display: inline-block; - *padding-left: 20px; - margin-left: 160px; - *margin-left: 0; -} - -.form-horizontal .controls:first-child { - *padding-left: 160px; -} - -.form-horizontal .help-block { - margin-top: 9px; - margin-bottom: 0; -} - -.form-horizontal .form-actions { - padding-left: 160px; -} - -table { - max-width: 100%; - background-color: transparent; - border-collapse: collapse; - border-spacing: 0; -} - -.table { - width: 100%; - margin-bottom: 18px; -} - -.table th, -.table td { - padding: 8px; - line-height: 18px; - text-align: left; - vertical-align: top; - border-top: 1px solid #dddddd; -} - -.table th { - font-weight: bold; -} - -.table thead th { - vertical-align: bottom; -} - -.table caption + thead tr:first-child th, -.table caption + thead tr:first-child td, -.table colgroup + thead tr:first-child th, -.table colgroup + thead tr:first-child td, -.table thead:first-child tr:first-child th, -.table thead:first-child tr:first-child td { - border-top: 0; -} - -.table tbody + tbody { - border-top: 2px solid #dddddd; -} - -.table-condensed th, -.table-condensed td { - padding: 4px 5px; -} - -.table-bordered { - border: 1px solid #dddddd; - border-collapse: separate; - *border-collapse: collapsed; - border-left: 0; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; -} - -.table-bordered th, -.table-bordered td { - border-left: 1px solid #dddddd; -} - -.table-bordered caption + thead tr:first-child th, -.table-bordered caption + tbody tr:first-child th, -.table-bordered caption + tbody tr:first-child td, -.table-bordered colgroup + thead tr:first-child th, -.table-bordered colgroup + tbody tr:first-child th, -.table-bordered colgroup + tbody tr:first-child td, -.table-bordered thead:first-child tr:first-child th, -.table-bordered tbody:first-child tr:first-child th, -.table-bordered tbody:first-child tr:first-child td { - border-top: 0; -} - -.table-bordered thead:first-child tr:first-child th:first-child, -.table-bordered tbody:first-child tr:first-child td:first-child { - -webkit-border-top-left-radius: 4px; - border-top-left-radius: 4px; - -moz-border-radius-topleft: 4px; -} - -.table-bordered thead:first-child tr:first-child th:last-child, -.table-bordered tbody:first-child tr:first-child td:last-child { - -webkit-border-top-right-radius: 4px; - border-top-right-radius: 4px; - -moz-border-radius-topright: 4px; -} - -.table-bordered thead:last-child tr:last-child th:first-child, -.table-bordered tbody:last-child tr:last-child td:first-child { - -webkit-border-radius: 0 0 0 4px; - -moz-border-radius: 0 0 0 4px; - border-radius: 0 0 0 4px; - -webkit-border-bottom-left-radius: 4px; - border-bottom-left-radius: 4px; - -moz-border-radius-bottomleft: 4px; -} - -.table-bordered thead:last-child tr:last-child th:last-child, -.table-bordered tbody:last-child tr:last-child td:last-child { - -webkit-border-bottom-right-radius: 4px; - border-bottom-right-radius: 4px; - -moz-border-radius-bottomright: 4px; -} - -.table-striped tbody tr:nth-child(odd) td, -.table-striped tbody tr:nth-child(odd) th { - background-color: #f9f9f9; -} - -.table tbody tr:hover td, -.table tbody tr:hover th { - background-color: #f5f5f5; -} - -table .span1 { - float: none; - width: 44px; - margin-left: 0; -} - -table .span2 { - float: none; - width: 124px; - margin-left: 0; -} - -table .span3 { - float: none; - width: 204px; - margin-left: 0; -} - -table .span4 { - float: none; - width: 284px; - margin-left: 0; -} - -table .span5 { - float: none; - width: 364px; - margin-left: 0; -} - -table .span6 { - float: none; - width: 444px; - margin-left: 0; -} - -table .span7 { - float: none; - width: 524px; - margin-left: 0; -} - -table .span8 { - float: none; - width: 604px; - margin-left: 0; -} - -table .span9 { - float: none; - width: 684px; - margin-left: 0; -} - -table .span10 { - float: none; - width: 764px; - margin-left: 0; -} - -table .span11 { - float: none; - width: 844px; - margin-left: 0; -} - -table .span12 { - float: none; - width: 924px; - margin-left: 0; -} - -table .span13 { - float: none; - width: 1004px; - margin-left: 0; -} - -table .span14 { - float: none; - width: 1084px; - margin-left: 0; -} - -table .span15 { - float: none; - width: 1164px; - margin-left: 0; -} - -table .span16 { - float: none; - width: 1244px; - margin-left: 0; -} - -table .span17 { - float: none; - width: 1324px; - margin-left: 0; -} - -table .span18 { - float: none; - width: 1404px; - margin-left: 0; -} - -table .span19 { - float: none; - width: 1484px; - margin-left: 0; -} - -table .span20 { - float: none; - width: 1564px; - margin-left: 0; -} - -table .span21 { - float: none; - width: 1644px; - margin-left: 0; -} - -table .span22 { - float: none; - width: 1724px; - margin-left: 0; -} - -table .span23 { - float: none; - width: 1804px; - margin-left: 0; -} - -table .span24 { - float: none; - width: 1884px; - margin-left: 0; -} - -[class^="icon-"], -[class*=" icon-"] { - display: inline-block; - width: 14px; - height: 14px; - *margin-right: .3em; - line-height: 14px; - vertical-align: text-top; - background-image: url("../img/glyphicons-halflings.png"); - background-position: 14px 14px; - background-repeat: no-repeat; -} - -[class^="icon-"]:last-child, -[class*=" icon-"]:last-child { - *margin-left: 0; -} - -.icon-white { - background-image: url("../img/glyphicons-halflings-white.png"); -} - -.icon-glass { - background-position: 0 0; -} - -.icon-music { - background-position: -24px 0; -} - -.icon-search { - background-position: -48px 0; -} - -.icon-envelope { - background-position: -72px 0; -} - -.icon-heart { - background-position: -96px 0; -} - -.icon-star { - background-position: -120px 0; -} - -.icon-star-empty { - background-position: -144px 0; -} - -.icon-user { - background-position: -168px 0; -} - -.icon-film { - background-position: -192px 0; -} - -.icon-th-large { - background-position: -216px 0; -} - -.icon-th { - background-position: -240px 0; -} - -.icon-th-list { - background-position: -264px 0; -} - -.icon-ok { - background-position: -288px 0; -} - -.icon-remove { - background-position: -312px 0; -} - -.icon-zoom-in { - background-position: -336px 0; -} - -.icon-zoom-out { - background-position: -360px 0; -} - -.icon-off { - background-position: -384px 0; -} - -.icon-signal { - background-position: -408px 0; -} - -.icon-cog { - background-position: -432px 0; -} - -.icon-trash { - background-position: -456px 0; -} - -.icon-home { - background-position: 0 -24px; -} - -.icon-file { - background-position: -24px -24px; -} - -.icon-time { - background-position: -48px -24px; -} - -.icon-road { - background-position: -72px -24px; -} - -.icon-download-alt { - background-position: -96px -24px; -} - -.icon-download { - background-position: -120px -24px; -} - -.icon-upload { - background-position: -144px -24px; -} - -.icon-inbox { - background-position: -168px -24px; -} - -.icon-play-circle { - background-position: -192px -24px; -} - -.icon-repeat { - background-position: -216px -24px; -} - -.icon-refresh { - background-position: -240px -24px; -} - -.icon-list-alt { - background-position: -264px -24px; -} - -.icon-lock { - background-position: -287px -24px; -} - -.icon-flag { - background-position: -312px -24px; -} - -.icon-headphones { - background-position: -336px -24px; -} - -.icon-volume-off { - background-position: -360px -24px; -} - -.icon-volume-down { - background-position: -384px -24px; -} - -.icon-volume-up { - background-position: -408px -24px; -} - -.icon-qrcode { - background-position: -432px -24px; -} - -.icon-barcode { - background-position: -456px -24px; -} - -.icon-tag { - background-position: 0 -48px; -} - -.icon-tags { - background-position: -25px -48px; -} - -.icon-book { - background-position: -48px -48px; -} - -.icon-bookmark { - background-position: -72px -48px; -} - -.icon-print { - background-position: -96px -48px; -} - -.icon-camera { - background-position: -120px -48px; -} - -.icon-font { - background-position: -144px -48px; -} - -.icon-bold { - background-position: -167px -48px; -} - -.icon-italic { - background-position: -192px -48px; -} - -.icon-text-height { - background-position: -216px -48px; -} - -.icon-text-width { - background-position: -240px -48px; -} - -.icon-align-left { - background-position: -264px -48px; -} - -.icon-align-center { - background-position: -288px -48px; -} - -.icon-align-right { - background-position: -312px -48px; -} - -.icon-align-justify { - background-position: -336px -48px; -} - -.icon-list { - background-position: -360px -48px; -} - -.icon-indent-left { - background-position: -384px -48px; -} - -.icon-indent-right { - background-position: -408px -48px; -} - -.icon-facetime-video { - background-position: -432px -48px; -} - -.icon-picture { - background-position: -456px -48px; -} - -.icon-pencil { - background-position: 0 -72px; -} - -.icon-map-marker { - background-position: -24px -72px; -} - -.icon-adjust { - background-position: -48px -72px; -} - -.icon-tint { - background-position: -72px -72px; -} - -.icon-edit { - background-position: -96px -72px; -} - -.icon-share { - background-position: -120px -72px; -} - -.icon-check { - background-position: -144px -72px; -} - -.icon-move { - background-position: -168px -72px; -} - -.icon-step-backward { - background-position: -192px -72px; -} - -.icon-fast-backward { - background-position: -216px -72px; -} - -.icon-backward { - background-position: -240px -72px; -} - -.icon-play { - background-position: -264px -72px; -} - -.icon-pause { - background-position: -288px -72px; -} - -.icon-stop { - background-position: -312px -72px; -} - -.icon-forward { - background-position: -336px -72px; -} - -.icon-fast-forward { - background-position: -360px -72px; -} - -.icon-step-forward { - background-position: -384px -72px; -} - -.icon-eject { - background-position: -408px -72px; -} - -.icon-chevron-left { - background-position: -432px -72px; -} - -.icon-chevron-right { - background-position: -456px -72px; -} - -.icon-plus-sign { - background-position: 0 -96px; -} - -.icon-minus-sign { - background-position: -24px -96px; -} - -.icon-remove-sign { - background-position: -48px -96px; -} - -.icon-ok-sign { - background-position: -72px -96px; -} - -.icon-question-sign { - background-position: -96px -96px; -} - -.icon-info-sign { - background-position: -120px -96px; -} - -.icon-screenshot { - background-position: -144px -96px; -} - -.icon-remove-circle { - background-position: -168px -96px; -} - -.icon-ok-circle { - background-position: -192px -96px; -} - -.icon-ban-circle { - background-position: -216px -96px; -} - -.icon-arrow-left { - background-position: -240px -96px; -} - -.icon-arrow-right { - background-position: -264px -96px; -} - -.icon-arrow-up { - background-position: -289px -96px; -} - -.icon-arrow-down { - background-position: -312px -96px; -} - -.icon-share-alt { - background-position: -336px -96px; -} - -.icon-resize-full { - background-position: -360px -96px; -} - -.icon-resize-small { - background-position: -384px -96px; -} - -.icon-plus { - background-position: -408px -96px; -} - -.icon-minus { - background-position: -433px -96px; -} - -.icon-asterisk { - background-position: -456px -96px; -} - -.icon-exclamation-sign { - background-position: 0 -120px; -} - -.icon-gift { - background-position: -24px -120px; -} - -.icon-leaf { - background-position: -48px -120px; -} - -.icon-fire { - background-position: -72px -120px; -} - -.icon-eye-open { - background-position: -96px -120px; -} - -.icon-eye-close { - background-position: -120px -120px; -} - -.icon-warning-sign { - background-position: -144px -120px; -} - -.icon-plane { - background-position: -168px -120px; -} - -.icon-calendar { - background-position: -192px -120px; -} - -.icon-random { - background-position: -216px -120px; -} - -.icon-comment { - background-position: -240px -120px; -} - -.icon-magnet { - background-position: -264px -120px; -} - -.icon-chevron-up { - background-position: -288px -120px; -} - -.icon-chevron-down { - background-position: -313px -119px; -} - -.icon-retweet { - background-position: -336px -120px; -} - -.icon-shopping-cart { - background-position: -360px -120px; -} - -.icon-folder-close { - background-position: -384px -120px; -} - -.icon-folder-open { - background-position: -408px -120px; -} - -.icon-resize-vertical { - background-position: -432px -119px; -} - -.icon-resize-horizontal { - background-position: -456px -118px; -} - -.icon-hdd { - background-position: 0 -144px; -} - -.icon-bullhorn { - background-position: -24px -144px; -} - -.icon-bell { - background-position: -48px -144px; -} - -.icon-certificate { - background-position: -72px -144px; -} - -.icon-thumbs-up { - background-position: -96px -144px; -} - -.icon-thumbs-down { - background-position: -120px -144px; -} - -.icon-hand-right { - background-position: -144px -144px; -} - -.icon-hand-left { - background-position: -168px -144px; -} - -.icon-hand-up { - background-position: -192px -144px; -} - -.icon-hand-down { - background-position: -216px -144px; -} - -.icon-circle-arrow-right { - background-position: -240px -144px; -} - -.icon-circle-arrow-left { - background-position: -264px -144px; -} - -.icon-circle-arrow-up { - background-position: -288px -144px; -} - -.icon-circle-arrow-down { - background-position: -312px -144px; -} - -.icon-globe { - background-position: -336px -144px; -} - -.icon-wrench { - background-position: -360px -144px; -} - -.icon-tasks { - background-position: -384px -144px; -} - -.icon-filter { - background-position: -408px -144px; -} - -.icon-briefcase { - background-position: -432px -144px; -} - -.icon-fullscreen { - background-position: -456px -144px; -} - -.dropup, -.dropdown { - position: relative; -} - -.dropdown-toggle { - *margin-bottom: -3px; -} - -.dropdown-toggle:active, -.open .dropdown-toggle { - outline: 0; -} - -.caret { - display: inline-block; - width: 0; - height: 0; - vertical-align: top; - border-top: 4px solid #000000; - border-right: 4px solid transparent; - border-left: 4px solid transparent; - content: ""; - opacity: 0.3; - filter: alpha(opacity=30); -} - -.dropdown .caret { - margin-top: 8px; - margin-left: 2px; -} - -.dropdown:hover .caret, -.open .caret { - opacity: 1; - filter: alpha(opacity=100); -} - -.dropdown-menu { - position: absolute; - top: 100%; - left: 0; - z-index: 1000; - display: none; - float: left; - min-width: 160px; - padding: 4px 0; - margin: 1px 0 0; - list-style: none; - background-color: #ffffff; - border: 1px solid #ccc; - border: 1px solid rgba(0, 0, 0, 0.2); - *border-right-width: 2px; - *border-bottom-width: 2px; - -webkit-border-radius: 5px; - -moz-border-radius: 5px; - border-radius: 5px; - -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); - -moz-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); - box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); - -webkit-background-clip: padding-box; - -moz-background-clip: padding; - background-clip: padding-box; -} - -.dropdown-menu.pull-right { - right: 0; - left: auto; -} - -.dropdown-menu .divider { - *width: 100%; - height: 1px; - margin: 8px 1px; - *margin: -5px 0 5px; - overflow: hidden; - background-color: #e5e5e5; - border-bottom: 1px solid #ffffff; -} - -.dropdown-menu a { - display: block; - padding: 3px 15px; - clear: both; - font-weight: normal; - line-height: 18px; - color: #333333; - white-space: nowrap; -} - -.dropdown-menu li > a:hover, -.dropdown-menu .active > a, -.dropdown-menu .active > a:hover { - color: #ffffff; - text-decoration: none; - background-color: #0088cc; -} - -.open { - *z-index: 1000; -} - -.open .dropdown-menu { - display: block; -} - -.pull-right .dropdown-menu { - right: 0; - left: auto; -} - -.dropup .caret, -.navbar-fixed-bottom .dropdown .caret { - border-top: 0; - border-bottom: 4px solid #000000; - content: "\2191"; -} - -.dropup .dropdown-menu, -.navbar-fixed-bottom .dropdown .dropdown-menu { - top: auto; - bottom: 100%; - margin-bottom: 1px; -} - -.typeahead { - margin-top: 2px; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; -} - -.well { - min-height: 20px; - padding: 19px; - margin-bottom: 20px; - background-color: #f5f5f5; - border: 1px solid #eee; - border: 1px solid rgba(0, 0, 0, 0.05); - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); - -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); -} - -.well blockquote { - border-color: #ddd; - border-color: rgba(0, 0, 0, 0.15); -} - -.well-large { - padding: 24px; - -webkit-border-radius: 6px; - -moz-border-radius: 6px; - border-radius: 6px; -} - -.well-small { - padding: 9px; - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - border-radius: 3px; -} - -.fade { - opacity: 0; - filter: alpha(opacity=0); - -webkit-transition: opacity 0.15s linear; - -moz-transition: opacity 0.15s linear; - -ms-transition: opacity 0.15s linear; - -o-transition: opacity 0.15s linear; - transition: opacity 0.15s linear; -} - -.fade.in { - opacity: 1; - filter: alpha(opacity=100); -} - -.collapse { - position: relative; - height: 0; - overflow: hidden; - -webkit-transition: height 0.35s ease; - -moz-transition: height 0.35s ease; - -ms-transition: height 0.35s ease; - -o-transition: height 0.35s ease; - transition: height 0.35s ease; -} - -.collapse.in { - height: auto; -} - -.close { - float: right; - font-size: 20px; - font-weight: bold; - line-height: 18px; - color: #000000; - text-shadow: 0 1px 0 #ffffff; - opacity: 0.2; - filter: alpha(opacity=20); -} - -.close:hover { - color: #000000; - text-decoration: none; - cursor: pointer; - opacity: 0.4; - filter: alpha(opacity=40); -} - -button.close { - padding: 0; - cursor: pointer; - background: transparent; - border: 0; - -webkit-appearance: none; -} - -.btn { - display: inline-block; - *display: inline; - padding: 4px 10px 4px; - margin-bottom: 0; - *margin-left: .3em; - font-size: 13px; - line-height: 18px; - *line-height: 20px; - color: #333333; - text-align: center; - text-shadow: 0 1px 1px rgba(255, 255, 255, 0.75); - vertical-align: middle; - cursor: pointer; - background-color: #f5f5f5; - *background-color: #e6e6e6; - background-image: -ms-linear-gradient(top, #ffffff, #e6e6e6); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#e6e6e6)); - background-image: -webkit-linear-gradient(top, #ffffff, #e6e6e6); - background-image: -o-linear-gradient(top, #ffffff, #e6e6e6); - background-image: linear-gradient(top, #ffffff, #e6e6e6); - background-image: -moz-linear-gradient(top, #ffffff, #e6e6e6); - background-repeat: repeat-x; - border: 1px solid #cccccc; - *border: 0; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - border-color: #e6e6e6 #e6e6e6 #bfbfbf; - border-bottom-color: #b3b3b3; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; - filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ffffff', endColorstr='#e6e6e6', GradientType=0); - filter: progid:dximagetransform.microsoft.gradient(enabled=false); - *zoom: 1; - -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); - -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); - box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); -} - -.btn:hover, -.btn:active, -.btn.active, -.btn.disabled, -.btn[disabled] { - background-color: #e6e6e6; - *background-color: #d9d9d9; -} - -.btn:active, -.btn.active { - background-color: #cccccc \9; -} - -.btn:first-child { - *margin-left: 0; -} - -.btn:hover { - color: #333333; - text-decoration: none; - background-color: #e6e6e6; - *background-color: #d9d9d9; - /* Buttons in IE7 don't get borders, so darken on hover */ - - background-position: 0 -15px; - -webkit-transition: background-position 0.1s linear; - -moz-transition: background-position 0.1s linear; - -ms-transition: background-position 0.1s linear; - -o-transition: background-position 0.1s linear; - transition: background-position 0.1s linear; -} - -.btn:focus { - outline: thin dotted #333; - outline: 5px auto -webkit-focus-ring-color; - outline-offset: -2px; -} - -.btn.active, -.btn:active { - background-color: #e6e6e6; - background-color: #d9d9d9 \9; - background-image: none; - outline: 0; - -webkit-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); - -moz-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); - box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); -} - -.btn.disabled, -.btn[disabled] { - cursor: default; - background-color: #e6e6e6; - background-image: none; - opacity: 0.65; - filter: alpha(opacity=65); - -webkit-box-shadow: none; - -moz-box-shadow: none; - box-shadow: none; -} - -.btn-large { - padding: 9px 14px; - font-size: 15px; - line-height: normal; - -webkit-border-radius: 5px; - -moz-border-radius: 5px; - border-radius: 5px; -} - -.btn-large [class^="icon-"] { - margin-top: 1px; -} - -.btn-small { - padding: 5px 9px; - font-size: 11px; - line-height: 16px; -} - -.btn-small [class^="icon-"] { - margin-top: -1px; -} - -.btn-mini { - padding: 2px 6px; - font-size: 11px; - line-height: 14px; -} - -.btn-primary, -.btn-primary:hover, -.btn-warning, -.btn-warning:hover, -.btn-danger, -.btn-danger:hover, -.btn-success, -.btn-success:hover, -.btn-info, -.btn-info:hover, -.btn-inverse, -.btn-inverse:hover { - color: #ffffff; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); -} - -.btn-primary.active, -.btn-warning.active, -.btn-danger.active, -.btn-success.active, -.btn-info.active, -.btn-inverse.active { - color: rgba(255, 255, 255, 0.75); -} - -.btn { - border-color: #ccc; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); -} - -.btn-primary { - background-color: #0074cc; - *background-color: #0055cc; - background-image: -ms-linear-gradient(top, #0088cc, #0055cc); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0055cc)); - background-image: -webkit-linear-gradient(top, #0088cc, #0055cc); - background-image: -o-linear-gradient(top, #0088cc, #0055cc); - background-image: -moz-linear-gradient(top, #0088cc, #0055cc); - background-image: linear-gradient(top, #0088cc, #0055cc); - background-repeat: repeat-x; - border-color: #0055cc #0055cc #003580; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - filter: progid:dximagetransform.microsoft.gradient(startColorstr='#0088cc', endColorstr='#0055cc', GradientType=0); - filter: progid:dximagetransform.microsoft.gradient(enabled=false); -} - -.btn-primary:hover, -.btn-primary:active, -.btn-primary.active, -.btn-primary.disabled, -.btn-primary[disabled] { - background-color: #0055cc; - *background-color: #004ab3; -} - -.btn-primary:active, -.btn-primary.active { - background-color: #004099 \9; -} - -.btn-warning { - background-color: #faa732; - *background-color: #f89406; - background-image: -ms-linear-gradient(top, #fbb450, #f89406); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406)); - background-image: -webkit-linear-gradient(top, #fbb450, #f89406); - background-image: -o-linear-gradient(top, #fbb450, #f89406); - background-image: -moz-linear-gradient(top, #fbb450, #f89406); - background-image: linear-gradient(top, #fbb450, #f89406); - background-repeat: repeat-x; - border-color: #f89406 #f89406 #ad6704; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - filter: progid:dximagetransform.microsoft.gradient(startColorstr='#fbb450', endColorstr='#f89406', GradientType=0); - filter: progid:dximagetransform.microsoft.gradient(enabled=false); -} - -.btn-warning:hover, -.btn-warning:active, -.btn-warning.active, -.btn-warning.disabled, -.btn-warning[disabled] { - background-color: #f89406; - *background-color: #df8505; -} - -.btn-warning:active, -.btn-warning.active { - background-color: #c67605 \9; -} - -.btn-danger { - background-color: #da4f49; - *background-color: #bd362f; - background-image: -ms-linear-gradient(top, #ee5f5b, #bd362f); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#bd362f)); - background-image: -webkit-linear-gradient(top, #ee5f5b, #bd362f); - background-image: -o-linear-gradient(top, #ee5f5b, #bd362f); - background-image: -moz-linear-gradient(top, #ee5f5b, #bd362f); - background-image: linear-gradient(top, #ee5f5b, #bd362f); - background-repeat: repeat-x; - border-color: #bd362f #bd362f #802420; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ee5f5b', endColorstr='#bd362f', GradientType=0); - filter: progid:dximagetransform.microsoft.gradient(enabled=false); -} - -.btn-danger:hover, -.btn-danger:active, -.btn-danger.active, -.btn-danger.disabled, -.btn-danger[disabled] { - background-color: #bd362f; - *background-color: #a9302a; -} - -.btn-danger:active, -.btn-danger.active { - background-color: #942a25 \9; -} - -.btn-success { - background-color: #5bb75b; - *background-color: #51a351; - background-image: -ms-linear-gradient(top, #62c462, #51a351); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#51a351)); - background-image: -webkit-linear-gradient(top, #62c462, #51a351); - background-image: -o-linear-gradient(top, #62c462, #51a351); - background-image: -moz-linear-gradient(top, #62c462, #51a351); - background-image: linear-gradient(top, #62c462, #51a351); - background-repeat: repeat-x; - border-color: #51a351 #51a351 #387038; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - filter: progid:dximagetransform.microsoft.gradient(startColorstr='#62c462', endColorstr='#51a351', GradientType=0); - filter: progid:dximagetransform.microsoft.gradient(enabled=false); -} - -.btn-success:hover, -.btn-success:active, -.btn-success.active, -.btn-success.disabled, -.btn-success[disabled] { - background-color: #51a351; - *background-color: #499249; -} - -.btn-success:active, -.btn-success.active { - background-color: #408140 \9; -} - -.btn-info { - background-color: #49afcd; - *background-color: #2f96b4; - background-image: -ms-linear-gradient(top, #5bc0de, #2f96b4); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#2f96b4)); - background-image: -webkit-linear-gradient(top, #5bc0de, #2f96b4); - background-image: -o-linear-gradient(top, #5bc0de, #2f96b4); - background-image: -moz-linear-gradient(top, #5bc0de, #2f96b4); - background-image: linear-gradient(top, #5bc0de, #2f96b4); - background-repeat: repeat-x; - border-color: #2f96b4 #2f96b4 #1f6377; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - filter: progid:dximagetransform.microsoft.gradient(startColorstr='#5bc0de', endColorstr='#2f96b4', GradientType=0); - filter: progid:dximagetransform.microsoft.gradient(enabled=false); -} - -.btn-info:hover, -.btn-info:active, -.btn-info.active, -.btn-info.disabled, -.btn-info[disabled] { - background-color: #2f96b4; - *background-color: #2a85a0; -} - -.btn-info:active, -.btn-info.active { - background-color: #24748c \9; -} - -.btn-inverse { - background-color: #414141; - *background-color: #222222; - background-image: -ms-linear-gradient(top, #555555, #222222); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#555555), to(#222222)); - background-image: -webkit-linear-gradient(top, #555555, #222222); - background-image: -o-linear-gradient(top, #555555, #222222); - background-image: -moz-linear-gradient(top, #555555, #222222); - background-image: linear-gradient(top, #555555, #222222); - background-repeat: repeat-x; - border-color: #222222 #222222 #000000; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - filter: progid:dximagetransform.microsoft.gradient(startColorstr='#555555', endColorstr='#222222', GradientType=0); - filter: progid:dximagetransform.microsoft.gradient(enabled=false); -} - -.btn-inverse:hover, -.btn-inverse:active, -.btn-inverse.active, -.btn-inverse.disabled, -.btn-inverse[disabled] { - background-color: #222222; - *background-color: #151515; -} - -.btn-inverse:active, -.btn-inverse.active { - background-color: #080808 \9; -} - -button.btn, -input[type="submit"].btn { - *padding-top: 2px; - *padding-bottom: 2px; -} - -button.btn::-moz-focus-inner, -input[type="submit"].btn::-moz-focus-inner { - padding: 0; - border: 0; -} - -button.btn.btn-large, -input[type="submit"].btn.btn-large { - *padding-top: 7px; - *padding-bottom: 7px; -} - -button.btn.btn-small, -input[type="submit"].btn.btn-small { - *padding-top: 3px; - *padding-bottom: 3px; -} - -button.btn.btn-mini, -input[type="submit"].btn.btn-mini { - *padding-top: 1px; - *padding-bottom: 1px; -} - -.btn-group { - position: relative; - *margin-left: .3em; - *zoom: 1; -} - -.btn-group:before, -.btn-group:after { - display: table; - content: ""; -} - -.btn-group:after { - clear: both; -} - -.btn-group:first-child { - *margin-left: 0; -} - -.btn-group + .btn-group { - margin-left: 5px; -} - -.btn-toolbar { - margin-top: 9px; - margin-bottom: 9px; -} - -.btn-toolbar .btn-group { - display: inline-block; - *display: inline; - /* IE7 inline-block hack */ - - *zoom: 1; -} - -.btn-group > .btn { - position: relative; - float: left; - margin-left: -1px; - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} - -.btn-group > .btn:first-child { - margin-left: 0; - -webkit-border-bottom-left-radius: 4px; - border-bottom-left-radius: 4px; - -webkit-border-top-left-radius: 4px; - border-top-left-radius: 4px; - -moz-border-radius-bottomleft: 4px; - -moz-border-radius-topleft: 4px; -} - -.btn-group > .btn:last-child, -.btn-group > .dropdown-toggle { - -webkit-border-top-right-radius: 4px; - border-top-right-radius: 4px; - -webkit-border-bottom-right-radius: 4px; - border-bottom-right-radius: 4px; - -moz-border-radius-topright: 4px; - -moz-border-radius-bottomright: 4px; -} - -.btn-group > .btn.large:first-child { - margin-left: 0; - -webkit-border-bottom-left-radius: 6px; - border-bottom-left-radius: 6px; - -webkit-border-top-left-radius: 6px; - border-top-left-radius: 6px; - -moz-border-radius-bottomleft: 6px; - -moz-border-radius-topleft: 6px; -} - -.btn-group > .btn.large:last-child, -.btn-group > .large.dropdown-toggle { - -webkit-border-top-right-radius: 6px; - border-top-right-radius: 6px; - -webkit-border-bottom-right-radius: 6px; - border-bottom-right-radius: 6px; - -moz-border-radius-topright: 6px; - -moz-border-radius-bottomright: 6px; -} - -.btn-group > .btn:hover, -.btn-group > .btn:focus, -.btn-group > .btn:active, -.btn-group > .btn.active { - z-index: 2; -} - -.btn-group .dropdown-toggle:active, -.btn-group.open .dropdown-toggle { - outline: 0; -} - -.btn-group > .dropdown-toggle { - *padding-top: 4px; - padding-right: 8px; - *padding-bottom: 4px; - padding-left: 8px; - -webkit-box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.125), inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); - -moz-box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.125), inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); - box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.125), inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); -} - -.btn-group > .btn-mini.dropdown-toggle { - padding-right: 5px; - padding-left: 5px; -} - -.btn-group > .btn-small.dropdown-toggle { - *padding-top: 4px; - *padding-bottom: 4px; -} - -.btn-group > .btn-large.dropdown-toggle { - padding-right: 12px; - padding-left: 12px; -} - -.btn-group.open .dropdown-toggle { - background-image: none; - -webkit-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); - -moz-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); - box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); -} - -.btn-group.open .btn.dropdown-toggle { - background-color: #e6e6e6; -} - -.btn-group.open .btn-primary.dropdown-toggle { - background-color: #0055cc; -} - -.btn-group.open .btn-warning.dropdown-toggle { - background-color: #f89406; -} - -.btn-group.open .btn-danger.dropdown-toggle { - background-color: #bd362f; -} - -.btn-group.open .btn-success.dropdown-toggle { - background-color: #51a351; -} - -.btn-group.open .btn-info.dropdown-toggle { - background-color: #2f96b4; -} - -.btn-group.open .btn-inverse.dropdown-toggle { - background-color: #222222; -} - -.btn .caret { - margin-top: 7px; - margin-left: 0; -} - -.btn:hover .caret, -.open.btn-group .caret { - opacity: 1; - filter: alpha(opacity=100); -} - -.btn-mini .caret { - margin-top: 5px; -} - -.btn-small .caret { - margin-top: 6px; -} - -.btn-large .caret { - margin-top: 6px; - border-top-width: 5px; - border-right-width: 5px; - border-left-width: 5px; -} - -.dropup .btn-large .caret { - border-top: 0; - border-bottom: 5px solid #000000; -} - -.btn-primary .caret, -.btn-warning .caret, -.btn-danger .caret, -.btn-info .caret, -.btn-success .caret, -.btn-inverse .caret { - border-top-color: #ffffff; - border-bottom-color: #ffffff; - opacity: 0.75; - filter: alpha(opacity=75); -} - -.alert { - padding: 8px 35px 8px 14px; - margin-bottom: 18px; - color: #c09853; - text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5); - background-color: #fcf8e3; - border: 1px solid #fbeed5; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; -} - -.alert-heading { - color: inherit; -} - -.alert .close { - position: relative; - top: -2px; - right: -21px; - line-height: 18px; -} - -.alert-success { - color: #468847; - background-color: #dff0d8; - border-color: #d6e9c6; -} - -.alert-danger, -.alert-error { - color: #b94a48; - background-color: #f2dede; - border-color: #eed3d7; -} - -.alert-info { - color: #3a87ad; - background-color: #d9edf7; - border-color: #bce8f1; -} - -.alert-block { - padding-top: 14px; - padding-bottom: 14px; -} - -.alert-block > p, -.alert-block > ul { - margin-bottom: 0; -} - -.alert-block p + p { - margin-top: 5px; -} - -.nav { - margin-bottom: 18px; - margin-left: 0; - list-style: none; -} - -.nav > li > a { - display: block; -} - -.nav > li > a:hover { - text-decoration: none; - background-color: #eeeeee; -} - -.nav > .pull-right { - float: right; -} - -.nav .nav-header { - display: block; - padding: 3px 15px; - font-size: 11px; - font-weight: bold; - line-height: 18px; - color: #999999; - text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5); - text-transform: uppercase; -} - -.nav li + .nav-header { - margin-top: 9px; -} - -.nav-list { - padding-right: 15px; - padding-left: 15px; - margin-bottom: 0; -} - -.nav-list > li > a, -.nav-list .nav-header { - margin-right: -15px; - margin-left: -15px; - text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5); -} - -.nav-list > li > a { - padding: 3px 15px; -} - -.nav-list > .active > a, -.nav-list > .active > a:hover { - color: #ffffff; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.2); - background-color: #0088cc; -} - -.nav-list [class^="icon-"] { - margin-right: 2px; -} - -.nav-list .divider { - *width: 100%; - height: 1px; - margin: 8px 1px; - *margin: -5px 0 5px; - overflow: hidden; - background-color: #e5e5e5; - border-bottom: 1px solid #ffffff; -} - -.nav-tabs, -.nav-pills { - *zoom: 1; -} - -.nav-tabs:before, -.nav-pills:before, -.nav-tabs:after, -.nav-pills:after { - display: table; - content: ""; -} - -.nav-tabs:after, -.nav-pills:after { - clear: both; -} - -.nav-tabs > li, -.nav-pills > li { - float: left; -} - -.nav-tabs > li > a, -.nav-pills > li > a { - padding-right: 12px; - padding-left: 12px; - margin-right: 2px; - line-height: 14px; -} - -.nav-tabs { - border-bottom: 1px solid #ddd; -} - -.nav-tabs > li { - margin-bottom: -1px; -} - -.nav-tabs > li > a { - padding-top: 8px; - padding-bottom: 8px; - line-height: 18px; - border: 1px solid transparent; - -webkit-border-radius: 4px 4px 0 0; - -moz-border-radius: 4px 4px 0 0; - border-radius: 4px 4px 0 0; -} - -.nav-tabs > li > a:hover { - border-color: #eeeeee #eeeeee #dddddd; -} - -.nav-tabs > .active > a, -.nav-tabs > .active > a:hover { - color: #555555; - cursor: default; - background-color: #ffffff; - border: 1px solid #ddd; - border-bottom-color: transparent; -} - -.nav-pills > li > a { - padding-top: 8px; - padding-bottom: 8px; - margin-top: 2px; - margin-bottom: 2px; - -webkit-border-radius: 5px; - -moz-border-radius: 5px; - border-radius: 5px; -} - -.nav-pills > .active > a, -.nav-pills > .active > a:hover { - color: #ffffff; - background-color: #0088cc; -} - -.nav-stacked > li { - float: none; -} - -.nav-stacked > li > a { - margin-right: 0; -} - -.nav-tabs.nav-stacked { - border-bottom: 0; -} - -.nav-tabs.nav-stacked > li > a { - border: 1px solid #ddd; - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} - -.nav-tabs.nav-stacked > li:first-child > a { - -webkit-border-radius: 4px 4px 0 0; - -moz-border-radius: 4px 4px 0 0; - border-radius: 4px 4px 0 0; -} - -.nav-tabs.nav-stacked > li:last-child > a { - -webkit-border-radius: 0 0 4px 4px; - -moz-border-radius: 0 0 4px 4px; - border-radius: 0 0 4px 4px; -} - -.nav-tabs.nav-stacked > li > a:hover { - z-index: 2; - border-color: #ddd; -} - -.nav-pills.nav-stacked > li > a { - margin-bottom: 3px; -} - -.nav-pills.nav-stacked > li:last-child > a { - margin-bottom: 1px; -} - -.nav-tabs .dropdown-menu { - -webkit-border-radius: 0 0 5px 5px; - -moz-border-radius: 0 0 5px 5px; - border-radius: 0 0 5px 5px; -} - -.nav-pills .dropdown-menu { - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; -} - -.nav-tabs .dropdown-toggle .caret, -.nav-pills .dropdown-toggle .caret { - margin-top: 6px; - border-top-color: #0088cc; - border-bottom-color: #0088cc; -} - -.nav-tabs .dropdown-toggle:hover .caret, -.nav-pills .dropdown-toggle:hover .caret { - border-top-color: #005580; - border-bottom-color: #005580; -} - -.nav-tabs .active .dropdown-toggle .caret, -.nav-pills .active .dropdown-toggle .caret { - border-top-color: #333333; - border-bottom-color: #333333; -} - -.nav > .dropdown.active > a:hover { - color: #000000; - cursor: pointer; -} - -.nav-tabs .open .dropdown-toggle, -.nav-pills .open .dropdown-toggle, -.nav > li.dropdown.open.active > a:hover { - color: #ffffff; - background-color: #999999; - border-color: #999999; -} - -.nav li.dropdown.open .caret, -.nav li.dropdown.open.active .caret, -.nav li.dropdown.open a:hover .caret { - border-top-color: #ffffff; - border-bottom-color: #ffffff; - opacity: 1; - filter: alpha(opacity=100); -} - -.tabs-stacked .open > a:hover { - border-color: #999999; -} - -.tabbable { - *zoom: 1; -} - -.tabbable:before, -.tabbable:after { - display: table; - content: ""; -} - -.tabbable:after { - clear: both; -} - -.tab-content { - overflow: auto; -} - -.tabs-below > .nav-tabs, -.tabs-right > .nav-tabs, -.tabs-left > .nav-tabs { - border-bottom: 0; -} - -.tab-content > .tab-pane, -.pill-content > .pill-pane { - display: none; -} - -.tab-content > .active, -.pill-content > .active { - display: block; -} - -.tabs-below > .nav-tabs { - border-top: 1px solid #ddd; -} - -.tabs-below > .nav-tabs > li { - margin-top: -1px; - margin-bottom: 0; -} - -.tabs-below > .nav-tabs > li > a { - -webkit-border-radius: 0 0 4px 4px; - -moz-border-radius: 0 0 4px 4px; - border-radius: 0 0 4px 4px; -} - -.tabs-below > .nav-tabs > li > a:hover { - border-top-color: #ddd; - border-bottom-color: transparent; -} - -.tabs-below > .nav-tabs > .active > a, -.tabs-below > .nav-tabs > .active > a:hover { - border-color: transparent #ddd #ddd #ddd; -} - -.tabs-left > .nav-tabs > li, -.tabs-right > .nav-tabs > li { - float: none; -} - -.tabs-left > .nav-tabs > li > a, -.tabs-right > .nav-tabs > li > a { - min-width: 74px; - margin-right: 0; - margin-bottom: 3px; -} - -.tabs-left > .nav-tabs { - float: left; - margin-right: 19px; - border-right: 1px solid #ddd; -} - -.tabs-left > .nav-tabs > li > a { - margin-right: -1px; - -webkit-border-radius: 4px 0 0 4px; - -moz-border-radius: 4px 0 0 4px; - border-radius: 4px 0 0 4px; -} - -.tabs-left > .nav-tabs > li > a:hover { - border-color: #eeeeee #dddddd #eeeeee #eeeeee; -} - -.tabs-left > .nav-tabs .active > a, -.tabs-left > .nav-tabs .active > a:hover { - border-color: #ddd transparent #ddd #ddd; - *border-right-color: #ffffff; -} - -.tabs-right > .nav-tabs { - float: right; - margin-left: 19px; - border-left: 1px solid #ddd; -} - -.tabs-right > .nav-tabs > li > a { - margin-left: -1px; - -webkit-border-radius: 0 4px 4px 0; - -moz-border-radius: 0 4px 4px 0; - border-radius: 0 4px 4px 0; -} - -.tabs-right > .nav-tabs > li > a:hover { - border-color: #eeeeee #eeeeee #eeeeee #dddddd; -} - -.tabs-right > .nav-tabs .active > a, -.tabs-right > .nav-tabs .active > a:hover { - border-color: #ddd #ddd #ddd transparent; - *border-left-color: #ffffff; -} - -.navbar { - *position: relative; - *z-index: 2; - margin-bottom: 18px; - overflow: visible; -} - -.navbar-inner { - min-height: 40px; - padding-right: 20px; - padding-left: 20px; - background-color: #2c2c2c; - background-image: -moz-linear-gradient(top, #333333, #222222); - background-image: -ms-linear-gradient(top, #333333, #222222); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#333333), to(#222222)); - background-image: -webkit-linear-gradient(top, #333333, #222222); - background-image: -o-linear-gradient(top, #333333, #222222); - background-image: linear-gradient(top, #333333, #222222); - background-repeat: repeat-x; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; - filter: progid:dximagetransform.microsoft.gradient(startColorstr='#333333', endColorstr='#222222', GradientType=0); - -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.25), inset 0 -1px 0 rgba(0, 0, 0, 0.1); - -moz-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.25), inset 0 -1px 0 rgba(0, 0, 0, 0.1); - box-shadow: 0 1px 3px rgba(0, 0, 0, 0.25), inset 0 -1px 0 rgba(0, 0, 0, 0.1); -} - -.navbar .container { - width: auto; -} - -.nav-collapse.collapse { - height: auto; -} - -.navbar { - color: #999999; -} - -.navbar .brand:hover { - text-decoration: none; -} - -.navbar .brand { - display: block; - float: left; - padding: 8px 20px 12px; - margin-left: -20px; - font-size: 20px; - font-weight: 200; - line-height: 1; - color: #999999; -} - -.navbar .navbar-text { - margin-bottom: 0; - line-height: 40px; -} - -.navbar .navbar-link { - color: #999999; -} - -.navbar .navbar-link:hover { - color: #ffffff; -} - -.navbar .btn, -.navbar .btn-group { - margin-top: 5px; -} - -.navbar .btn-group .btn { - margin: 0; -} - -.navbar-form { - margin-bottom: 0; - *zoom: 1; -} - -.navbar-form:before, -.navbar-form:after { - display: table; - content: ""; -} - -.navbar-form:after { - clear: both; -} - -.navbar-form input, -.navbar-form select, -.navbar-form .radio, -.navbar-form .checkbox { - margin-top: 5px; -} - -.navbar-form input, -.navbar-form select { - display: inline-block; - margin-bottom: 0; -} - -.navbar-form input[type="image"], -.navbar-form input[type="checkbox"], -.navbar-form input[type="radio"] { - margin-top: 3px; -} - -.navbar-form .input-append, -.navbar-form .input-prepend { - margin-top: 6px; - white-space: nowrap; -} - -.navbar-form .input-append input, -.navbar-form .input-prepend input { - margin-top: 0; -} - -.navbar-search { - position: relative; - float: left; - margin-top: 6px; - margin-bottom: 0; -} - -.navbar-search .search-query { - padding: 4px 9px; - font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; - font-size: 13px; - font-weight: normal; - line-height: 1; - color: #ffffff; - background-color: #626262; - border: 1px solid #151515; - -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0 rgba(255, 255, 255, 0.15); - -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0 rgba(255, 255, 255, 0.15); - box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0 rgba(255, 255, 255, 0.15); - -webkit-transition: none; - -moz-transition: none; - -ms-transition: none; - -o-transition: none; - transition: none; -} - -.navbar-search .search-query:-moz-placeholder { - color: #cccccc; -} - -.navbar-search .search-query::-webkit-input-placeholder { - color: #cccccc; -} - -.navbar-search .search-query:focus, -.navbar-search .search-query.focused { - padding: 5px 10px; - color: #333333; - text-shadow: 0 1px 0 #ffffff; - background-color: #ffffff; - border: 0; - outline: 0; - -webkit-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15); - -moz-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15); - box-shadow: 0 0 3px rgba(0, 0, 0, 0.15); -} - -.navbar-fixed-top, -.navbar-fixed-bottom { - position: fixed; - right: 0; - left: 0; - z-index: 1030; - margin-bottom: 0; -} - -.navbar-fixed-top .navbar-inner, -.navbar-fixed-bottom .navbar-inner { - padding-right: 0; - padding-left: 0; - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} - -.navbar-fixed-top .container, -.navbar-fixed-bottom .container { - width: 940px; -} - -.navbar-fixed-top { - top: 0; -} - -.navbar-fixed-bottom { - bottom: 0; -} - -.navbar .nav { - position: relative; - left: 0; - display: block; - float: left; - margin: 0 10px 0 0; -} - -.navbar .nav.pull-right { - float: right; -} - -.navbar .nav > li { - display: block; - float: left; -} - -.navbar .nav > li > a { - float: none; - padding: 9px 10px 11px; - line-height: 19px; - color: #999999; - text-decoration: none; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); -} - -.navbar .btn { - display: inline-block; - padding: 4px 10px 4px; - margin: 5px 5px 6px; - line-height: 18px; -} - -.navbar .btn-group { - padding: 5px 5px 6px; - margin: 0; -} - -.navbar .nav > li > a:hover { - color: #ffffff; - text-decoration: none; - background-color: transparent; -} - -.navbar .nav .active > a, -.navbar .nav .active > a:hover { - color: #ffffff; - text-decoration: none; - background-color: #222222; -} - -.navbar .divider-vertical { - width: 1px; - height: 40px; - margin: 0 9px; - overflow: hidden; - background-color: #222222; - border-right: 1px solid #333333; -} - -.navbar .nav.pull-right { - margin-right: 0; - margin-left: 10px; -} - -.navbar .btn-navbar { - display: none; - float: right; - padding: 7px 10px; - margin-right: 5px; - margin-left: 5px; - background-color: #2c2c2c; - *background-color: #222222; - background-image: -ms-linear-gradient(top, #333333, #222222); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#333333), to(#222222)); - background-image: -webkit-linear-gradient(top, #333333, #222222); - background-image: -o-linear-gradient(top, #333333, #222222); - background-image: linear-gradient(top, #333333, #222222); - background-image: -moz-linear-gradient(top, #333333, #222222); - background-repeat: repeat-x; - border-color: #222222 #222222 #000000; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - filter: progid:dximagetransform.microsoft.gradient(startColorstr='#333333', endColorstr='#222222', GradientType=0); - filter: progid:dximagetransform.microsoft.gradient(enabled=false); - -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.075); - -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.075); - box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.075); -} - -.navbar .btn-navbar:hover, -.navbar .btn-navbar:active, -.navbar .btn-navbar.active, -.navbar .btn-navbar.disabled, -.navbar .btn-navbar[disabled] { - background-color: #222222; - *background-color: #151515; -} - -.navbar .btn-navbar:active, -.navbar .btn-navbar.active { - background-color: #080808 \9; -} - -.navbar .btn-navbar .icon-bar { - display: block; - width: 18px; - height: 2px; - background-color: #f5f5f5; - -webkit-border-radius: 1px; - -moz-border-radius: 1px; - border-radius: 1px; - -webkit-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25); - -moz-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25); - box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25); -} - -.btn-navbar .icon-bar + .icon-bar { - margin-top: 3px; -} - -.navbar .dropdown-menu:before { - position: absolute; - top: -7px; - left: 9px; - display: inline-block; - border-right: 7px solid transparent; - border-bottom: 7px solid #ccc; - border-left: 7px solid transparent; - border-bottom-color: rgba(0, 0, 0, 0.2); - content: ''; -} - -.navbar .dropdown-menu:after { - position: absolute; - top: -6px; - left: 10px; - display: inline-block; - border-right: 6px solid transparent; - border-bottom: 6px solid #ffffff; - border-left: 6px solid transparent; - content: ''; -} - -.navbar-fixed-bottom .dropdown-menu:before { - top: auto; - bottom: -7px; - border-top: 7px solid #ccc; - border-bottom: 0; - border-top-color: rgba(0, 0, 0, 0.2); -} - -.navbar-fixed-bottom .dropdown-menu:after { - top: auto; - bottom: -6px; - border-top: 6px solid #ffffff; - border-bottom: 0; -} - -.navbar .nav li.dropdown .dropdown-toggle .caret, -.navbar .nav li.dropdown.open .caret { - border-top-color: #ffffff; - border-bottom-color: #ffffff; -} - -.navbar .nav li.dropdown.active .caret { - opacity: 1; - filter: alpha(opacity=100); -} - -.navbar .nav li.dropdown.open > .dropdown-toggle, -.navbar .nav li.dropdown.active > .dropdown-toggle, -.navbar .nav li.dropdown.open.active > .dropdown-toggle { - background-color: transparent; -} - -.navbar .nav li.dropdown.active > .dropdown-toggle:hover { - color: #ffffff; -} - -.navbar .pull-right .dropdown-menu, -.navbar .dropdown-menu.pull-right { - right: 0; - left: auto; -} - -.navbar .pull-right .dropdown-menu:before, -.navbar .dropdown-menu.pull-right:before { - right: 12px; - left: auto; -} - -.navbar .pull-right .dropdown-menu:after, -.navbar .dropdown-menu.pull-right:after { - right: 13px; - left: auto; -} - -.breadcrumb { - padding: 7px 14px; - margin: 0 0 18px; - list-style: none; - background-color: #fbfbfb; - background-image: -moz-linear-gradient(top, #ffffff, #f5f5f5); - background-image: -ms-linear-gradient(top, #ffffff, #f5f5f5); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#f5f5f5)); - background-image: -webkit-linear-gradient(top, #ffffff, #f5f5f5); - background-image: -o-linear-gradient(top, #ffffff, #f5f5f5); - background-image: linear-gradient(top, #ffffff, #f5f5f5); - background-repeat: repeat-x; - border: 1px solid #ddd; - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - border-radius: 3px; - filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ffffff', endColorstr='#f5f5f5', GradientType=0); - -webkit-box-shadow: inset 0 1px 0 #ffffff; - -moz-box-shadow: inset 0 1px 0 #ffffff; - box-shadow: inset 0 1px 0 #ffffff; -} - -.breadcrumb li { - display: inline-block; - *display: inline; - text-shadow: 0 1px 0 #ffffff; - *zoom: 1; -} - -.breadcrumb .divider { - padding: 0 5px; - color: #999999; -} - -.breadcrumb .active a { - color: #333333; -} - -.pagination { - height: 36px; - margin: 18px 0; -} - -.pagination ul { - display: inline-block; - *display: inline; - margin-bottom: 0; - margin-left: 0; - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - border-radius: 3px; - *zoom: 1; - -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); - -moz-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); - box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); -} - -.pagination li { - display: inline; -} - -.pagination a { - float: left; - padding: 0 14px; - line-height: 34px; - text-decoration: none; - border: 1px solid #ddd; - border-left-width: 0; -} - -.pagination a:hover, -.pagination .active a { - background-color: #f5f5f5; -} - -.pagination .active a { - color: #999999; - cursor: default; -} - -.pagination .disabled span, -.pagination .disabled a, -.pagination .disabled a:hover { - color: #999999; - cursor: default; - background-color: transparent; -} - -.pagination li:first-child a { - border-left-width: 1px; - -webkit-border-radius: 3px 0 0 3px; - -moz-border-radius: 3px 0 0 3px; - border-radius: 3px 0 0 3px; -} - -.pagination li:last-child a { - -webkit-border-radius: 0 3px 3px 0; - -moz-border-radius: 0 3px 3px 0; - border-radius: 0 3px 3px 0; -} - -.pagination-centered { - text-align: center; -} - -.pagination-right { - text-align: right; -} - -.pager { - margin-bottom: 18px; - margin-left: 0; - text-align: center; - list-style: none; - *zoom: 1; -} - -.pager:before, -.pager:after { - display: table; - content: ""; -} - -.pager:after { - clear: both; -} - -.pager li { - display: inline; -} - -.pager a { - display: inline-block; - padding: 5px 14px; - background-color: #fff; - border: 1px solid #ddd; - -webkit-border-radius: 15px; - -moz-border-radius: 15px; - border-radius: 15px; -} - -.pager a:hover { - text-decoration: none; - background-color: #f5f5f5; -} - -.pager .next a { - float: right; -} - -.pager .previous a { - float: left; -} - -.pager .disabled a, -.pager .disabled a:hover { - color: #999999; - cursor: default; - background-color: #fff; -} - -.modal-open .dropdown-menu { - z-index: 2050; -} - -.modal-open .dropdown.open { - *z-index: 2050; -} - -.modal-open .popover { - z-index: 2060; -} - -.modal-open .tooltip { - z-index: 2070; -} - -.modal-backdrop { - position: fixed; - top: 0; - right: 0; - bottom: 0; - left: 0; - z-index: 1040; - background-color: #000000; -} - -.modal-backdrop.fade { - opacity: 0; -} - -.modal-backdrop, -.modal-backdrop.fade.in { - opacity: 0.8; - filter: alpha(opacity=80); -} - -.modal { - position: fixed; - top: 50%; - left: 50%; - z-index: 1050; - width: 560px; - margin: -250px 0 0 -280px; - overflow: auto; - background-color: #ffffff; - border: 1px solid #999; - border: 1px solid rgba(0, 0, 0, 0.3); - *border: 1px solid #999; - -webkit-border-radius: 6px; - -moz-border-radius: 6px; - border-radius: 6px; - -webkit-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); - -moz-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); - box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); - -webkit-background-clip: padding-box; - -moz-background-clip: padding-box; - background-clip: padding-box; -} - -.modal.fade { - top: -25%; - -webkit-transition: opacity 0.3s linear, top 0.3s ease-out; - -moz-transition: opacity 0.3s linear, top 0.3s ease-out; - -ms-transition: opacity 0.3s linear, top 0.3s ease-out; - -o-transition: opacity 0.3s linear, top 0.3s ease-out; - transition: opacity 0.3s linear, top 0.3s ease-out; -} - -.modal.fade.in { - top: 50%; -} - -.modal-header { - padding: 9px 15px; - border-bottom: 1px solid #eee; -} - -.modal-header .close { - margin-top: 2px; -} - -.modal-body { - max-height: 400px; - padding: 15px; - overflow-y: auto; -} - -.modal-form { - margin-bottom: 0; -} - -.modal-footer { - padding: 14px 15px 15px; - margin-bottom: 0; - text-align: right; - background-color: #f5f5f5; - border-top: 1px solid #ddd; - -webkit-border-radius: 0 0 6px 6px; - -moz-border-radius: 0 0 6px 6px; - border-radius: 0 0 6px 6px; - *zoom: 1; - -webkit-box-shadow: inset 0 1px 0 #ffffff; - -moz-box-shadow: inset 0 1px 0 #ffffff; - box-shadow: inset 0 1px 0 #ffffff; -} - -.modal-footer:before, -.modal-footer:after { - display: table; - content: ""; -} - -.modal-footer:after { - clear: both; -} - -.modal-footer .btn + .btn { - margin-bottom: 0; - margin-left: 5px; -} - -.modal-footer .btn-group .btn + .btn { - margin-left: -1px; -} - -.tooltip { - position: absolute; - z-index: 1020; - display: block; - padding: 5px; - font-size: 11px; - opacity: 0; - filter: alpha(opacity=0); - visibility: visible; -} - -.tooltip.in { - opacity: 0.8; - filter: alpha(opacity=80); -} - -.tooltip.top { - margin-top: -2px; -} - -.tooltip.right { - margin-left: 2px; -} - -.tooltip.bottom { - margin-top: 2px; -} - -.tooltip.left { - margin-left: -2px; -} - -.tooltip.top .tooltip-arrow { - bottom: 0; - left: 50%; - margin-left: -5px; - border-top: 5px solid #000000; - border-right: 5px solid transparent; - border-left: 5px solid transparent; -} - -.tooltip.left .tooltip-arrow { - top: 50%; - right: 0; - margin-top: -5px; - border-top: 5px solid transparent; - border-bottom: 5px solid transparent; - border-left: 5px solid #000000; -} - -.tooltip.bottom .tooltip-arrow { - top: 0; - left: 50%; - margin-left: -5px; - border-right: 5px solid transparent; - border-bottom: 5px solid #000000; - border-left: 5px solid transparent; -} - -.tooltip.right .tooltip-arrow { - top: 50%; - left: 0; - margin-top: -5px; - border-top: 5px solid transparent; - border-right: 5px solid #000000; - border-bottom: 5px solid transparent; -} - -.tooltip-inner { - max-width: 200px; - padding: 3px 8px; - color: #ffffff; - text-align: center; - text-decoration: none; - background-color: #000000; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; -} - -.tooltip-arrow { - position: absolute; - width: 0; - height: 0; -} - -.popover { - position: absolute; - top: 0; - left: 0; - z-index: 1010; - display: none; - padding: 5px; -} - -.popover.top { - margin-top: -5px; -} - -.popover.right { - margin-left: 5px; -} - -.popover.bottom { - margin-top: 5px; -} - -.popover.left { - margin-left: -5px; -} - -.popover.top .arrow { - bottom: 0; - left: 50%; - margin-left: -5px; - border-top: 5px solid #000000; - border-right: 5px solid transparent; - border-left: 5px solid transparent; -} - -.popover.right .arrow { - top: 50%; - left: 0; - margin-top: -5px; - border-top: 5px solid transparent; - border-right: 5px solid #000000; - border-bottom: 5px solid transparent; -} - -.popover.bottom .arrow { - top: 0; - left: 50%; - margin-left: -5px; - border-right: 5px solid transparent; - border-bottom: 5px solid #000000; - border-left: 5px solid transparent; -} - -.popover.left .arrow { - top: 50%; - right: 0; - margin-top: -5px; - border-top: 5px solid transparent; - border-bottom: 5px solid transparent; - border-left: 5px solid #000000; -} - -.popover .arrow { - position: absolute; - width: 0; - height: 0; -} - -.popover-inner { - width: 280px; - padding: 3px; - overflow: hidden; - background: #000000; - background: rgba(0, 0, 0, 0.8); - -webkit-border-radius: 6px; - -moz-border-radius: 6px; - border-radius: 6px; - -webkit-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); - -moz-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); - box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); -} - -.popover-title { - padding: 9px 15px; - line-height: 1; - background-color: #f5f5f5; - border-bottom: 1px solid #eee; - -webkit-border-radius: 3px 3px 0 0; - -moz-border-radius: 3px 3px 0 0; - border-radius: 3px 3px 0 0; -} - -.popover-content { - padding: 14px; - background-color: #ffffff; - -webkit-border-radius: 0 0 3px 3px; - -moz-border-radius: 0 0 3px 3px; - border-radius: 0 0 3px 3px; - -webkit-background-clip: padding-box; - -moz-background-clip: padding-box; - background-clip: padding-box; -} - -.popover-content p, -.popover-content ul, -.popover-content ol { - margin-bottom: 0; -} - -.thumbnails { - margin-left: -20px; - list-style: none; - *zoom: 1; -} - -.thumbnails:before, -.thumbnails:after { - display: table; - content: ""; -} - -.thumbnails:after { - clear: both; -} - -.row-fluid .thumbnails { - margin-left: 0; -} - -.thumbnails > li { - float: left; - margin-bottom: 18px; - margin-left: 20px; -} - -.thumbnail { - display: block; - padding: 4px; - line-height: 1; - border: 1px solid #ddd; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; - -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.075); - -moz-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.075); - box-shadow: 0 1px 1px rgba(0, 0, 0, 0.075); -} - -a.thumbnail:hover { - border-color: #0088cc; - -webkit-box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25); - -moz-box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25); - box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25); -} - -.thumbnail > img { - display: block; - max-width: 100%; - margin-right: auto; - margin-left: auto; -} - -.thumbnail .caption { - padding: 9px; -} - -.label, -.badge { - font-size: 10.998px; - font-weight: bold; - line-height: 14px; - color: #ffffff; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); - white-space: nowrap; - vertical-align: baseline; - background-color: #999999; -} - -.label { - padding: 1px 4px 2px; - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - border-radius: 3px; -} - -.badge { - padding: 1px 9px 2px; - -webkit-border-radius: 9px; - -moz-border-radius: 9px; - border-radius: 9px; -} - -a.label:hover, -a.badge:hover { - color: #ffffff; - text-decoration: none; - cursor: pointer; -} - -.label-important, -.badge-important { - background-color: #b94a48; -} - -.label-important[href], -.badge-important[href] { - background-color: #953b39; -} - -.label-warning, -.badge-warning { - background-color: #f89406; -} - -.label-warning[href], -.badge-warning[href] { - background-color: #c67605; -} - -.label-success, -.badge-success { - background-color: #468847; -} - -.label-success[href], -.badge-success[href] { - background-color: #356635; -} - -.label-info, -.badge-info { - background-color: #3a87ad; -} - -.label-info[href], -.badge-info[href] { - background-color: #2d6987; -} - -.label-inverse, -.badge-inverse { - background-color: #333333; -} - -.label-inverse[href], -.badge-inverse[href] { - background-color: #1a1a1a; -} - -@-webkit-keyframes progress-bar-stripes { - from { - background-position: 40px 0; - } - to { - background-position: 0 0; - } -} - -@-moz-keyframes progress-bar-stripes { - from { - background-position: 40px 0; - } - to { - background-position: 0 0; - } -} - -@-ms-keyframes progress-bar-stripes { - from { - background-position: 40px 0; - } - to { - background-position: 0 0; - } -} - -@-o-keyframes progress-bar-stripes { - from { - background-position: 0 0; - } - to { - background-position: 40px 0; - } -} - -@keyframes progress-bar-stripes { - from { - background-position: 40px 0; - } - to { - background-position: 0 0; - } -} - -.progress { - height: 18px; - margin-bottom: 18px; - overflow: hidden; - background-color: #f7f7f7; - background-image: -moz-linear-gradient(top, #f5f5f5, #f9f9f9); - background-image: -ms-linear-gradient(top, #f5f5f5, #f9f9f9); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f5f5f5), to(#f9f9f9)); - background-image: -webkit-linear-gradient(top, #f5f5f5, #f9f9f9); - background-image: -o-linear-gradient(top, #f5f5f5, #f9f9f9); - background-image: linear-gradient(top, #f5f5f5, #f9f9f9); - background-repeat: repeat-x; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; - filter: progid:dximagetransform.microsoft.gradient(startColorstr='#f5f5f5', endColorstr='#f9f9f9', GradientType=0); - -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); - -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); - box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); -} - -.progress .bar { - width: 0; - height: 18px; - font-size: 12px; - color: #ffffff; - text-align: center; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); - background-color: #0e90d2; - background-image: -moz-linear-gradient(top, #149bdf, #0480be); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#149bdf), to(#0480be)); - background-image: -webkit-linear-gradient(top, #149bdf, #0480be); - background-image: -o-linear-gradient(top, #149bdf, #0480be); - background-image: linear-gradient(top, #149bdf, #0480be); - background-image: -ms-linear-gradient(top, #149bdf, #0480be); - background-repeat: repeat-x; - filter: progid:dximagetransform.microsoft.gradient(startColorstr='#149bdf', endColorstr='#0480be', GradientType=0); - -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); - -moz-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); - box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - -ms-box-sizing: border-box; - box-sizing: border-box; - -webkit-transition: width 0.6s ease; - -moz-transition: width 0.6s ease; - -ms-transition: width 0.6s ease; - -o-transition: width 0.6s ease; - transition: width 0.6s ease; -} - -.progress-striped .bar { - background-color: #149bdf; - background-image: -o-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -webkit-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -moz-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -ms-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); - background-image: linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - -webkit-background-size: 40px 40px; - -moz-background-size: 40px 40px; - -o-background-size: 40px 40px; - background-size: 40px 40px; -} - -.progress.active .bar { - -webkit-animation: progress-bar-stripes 2s linear infinite; - -moz-animation: progress-bar-stripes 2s linear infinite; - -ms-animation: progress-bar-stripes 2s linear infinite; - -o-animation: progress-bar-stripes 2s linear infinite; - animation: progress-bar-stripes 2s linear infinite; -} - -.progress-danger .bar { - background-color: #dd514c; - background-image: -moz-linear-gradient(top, #ee5f5b, #c43c35); - background-image: -ms-linear-gradient(top, #ee5f5b, #c43c35); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#c43c35)); - background-image: -webkit-linear-gradient(top, #ee5f5b, #c43c35); - background-image: -o-linear-gradient(top, #ee5f5b, #c43c35); - background-image: linear-gradient(top, #ee5f5b, #c43c35); - background-repeat: repeat-x; - filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ee5f5b', endColorstr='#c43c35', GradientType=0); -} - -.progress-danger.progress-striped .bar { - background-color: #ee5f5b; - background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); - background-image: -webkit-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -moz-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -ms-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -o-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); -} - -.progress-success .bar { - background-color: #5eb95e; - background-image: -moz-linear-gradient(top, #62c462, #57a957); - background-image: -ms-linear-gradient(top, #62c462, #57a957); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#57a957)); - background-image: -webkit-linear-gradient(top, #62c462, #57a957); - background-image: -o-linear-gradient(top, #62c462, #57a957); - background-image: linear-gradient(top, #62c462, #57a957); - background-repeat: repeat-x; - filter: progid:dximagetransform.microsoft.gradient(startColorstr='#62c462', endColorstr='#57a957', GradientType=0); -} - -.progress-success.progress-striped .bar { - background-color: #62c462; - background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); - background-image: -webkit-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -moz-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -ms-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -o-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); -} - -.progress-info .bar { - background-color: #4bb1cf; - background-image: -moz-linear-gradient(top, #5bc0de, #339bb9); - background-image: -ms-linear-gradient(top, #5bc0de, #339bb9); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#339bb9)); - background-image: -webkit-linear-gradient(top, #5bc0de, #339bb9); - background-image: -o-linear-gradient(top, #5bc0de, #339bb9); - background-image: linear-gradient(top, #5bc0de, #339bb9); - background-repeat: repeat-x; - filter: progid:dximagetransform.microsoft.gradient(startColorstr='#5bc0de', endColorstr='#339bb9', GradientType=0); -} - -.progress-info.progress-striped .bar { - background-color: #5bc0de; - background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); - background-image: -webkit-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -moz-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -ms-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -o-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); -} - -.progress-warning .bar { - background-color: #faa732; - background-image: -moz-linear-gradient(top, #fbb450, #f89406); - background-image: -ms-linear-gradient(top, #fbb450, #f89406); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406)); - background-image: -webkit-linear-gradient(top, #fbb450, #f89406); - background-image: -o-linear-gradient(top, #fbb450, #f89406); - background-image: linear-gradient(top, #fbb450, #f89406); - background-repeat: repeat-x; - filter: progid:dximagetransform.microsoft.gradient(startColorstr='#fbb450', endColorstr='#f89406', GradientType=0); -} - -.progress-warning.progress-striped .bar { - background-color: #fbb450; - background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); - background-image: -webkit-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -moz-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -ms-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -o-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); -} - -.accordion { - margin-bottom: 18px; -} - -.accordion-group { - margin-bottom: 2px; - border: 1px solid #e5e5e5; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; -} - -.accordion-heading { - border-bottom: 0; -} - -.accordion-heading .accordion-toggle { - display: block; - padding: 8px 15px; -} - -.accordion-toggle { - cursor: pointer; -} - -.accordion-inner { - padding: 9px 15px; - border-top: 1px solid #e5e5e5; -} - -.carousel { - position: relative; - margin-bottom: 18px; - line-height: 1; -} - -.carousel-inner { - position: relative; - width: 100%; - overflow: hidden; -} - -.carousel .item { - position: relative; - display: none; - -webkit-transition: 0.6s ease-in-out left; - -moz-transition: 0.6s ease-in-out left; - -ms-transition: 0.6s ease-in-out left; - -o-transition: 0.6s ease-in-out left; - transition: 0.6s ease-in-out left; -} - -.carousel .item > img { - display: block; - line-height: 1; -} - -.carousel .active, -.carousel .next, -.carousel .prev { - display: block; -} - -.carousel .active { - left: 0; -} - -.carousel .next, -.carousel .prev { - position: absolute; - top: 0; - width: 100%; -} - -.carousel .next { - left: 100%; -} - -.carousel .prev { - left: -100%; -} - -.carousel .next.left, -.carousel .prev.right { - left: 0; -} - -.carousel .active.left { - left: -100%; -} - -.carousel .active.right { - left: 100%; -} - -.carousel-control { - position: absolute; - top: 40%; - left: 15px; - width: 40px; - height: 40px; - margin-top: -20px; - font-size: 60px; - font-weight: 100; - line-height: 30px; - color: #ffffff; - text-align: center; - background: #222222; - border: 3px solid #ffffff; - -webkit-border-radius: 23px; - -moz-border-radius: 23px; - border-radius: 23px; - opacity: 0.5; - filter: alpha(opacity=50); -} - -.carousel-control.right { - right: 15px; - left: auto; -} - -.carousel-control:hover { - color: #ffffff; - text-decoration: none; - opacity: 0.9; - filter: alpha(opacity=90); -} - -.carousel-caption { - position: absolute; - right: 0; - bottom: 0; - left: 0; - padding: 10px 15px 5px; - background: #333333; - background: rgba(0, 0, 0, 0.75); -} - -.carousel-caption h4, -.carousel-caption p { - color: #ffffff; -} - -.hero-unit { - padding: 60px; - margin-bottom: 30px; - background-color: #eeeeee; - -webkit-border-radius: 6px; - -moz-border-radius: 6px; - border-radius: 6px; -} - -.hero-unit h1 { - margin-bottom: 0; - font-size: 60px; - line-height: 1; - letter-spacing: -1px; - color: inherit; -} - -.hero-unit p { - font-size: 18px; - font-weight: 200; - line-height: 27px; - color: inherit; -} - -.pull-right { - float: right; -} - -.pull-left { - float: left; -} - -.hide { - display: none; -} - -.show { - display: block; -} - -.invisible { - visibility: hidden; -} diff --git a/debian/modules/naxsi/contrib/naxsi-ui/bootstrap/css/bootstrap.min.css b/debian/modules/naxsi/contrib/naxsi-ui/bootstrap/css/bootstrap.min.css deleted file mode 100644 index 1c75d0c..0000000 --- a/debian/modules/naxsi/contrib/naxsi-ui/bootstrap/css/bootstrap.min.css +++ /dev/null @@ -1,9 +0,0 @@ -/*! - * Bootstrap v2.0.3 - * - * Copyright 2012 Twitter, Inc - * Licensed under the Apache License v2.0 - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Designed and built with all the love in the world @twitter by @mdo and @fat. - */article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block}audio,canvas,video{display:inline-block;*display:inline;*zoom:1}audio:not([controls]){display:none}html{font-size:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}a:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}a:hover,a:active{outline:0}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}img{max-width:100%;vertical-align:middle;border:0;-ms-interpolation-mode:bicubic}button,input,select,textarea{margin:0;font-size:100%;vertical-align:middle}button,input{*overflow:visible;line-height:normal}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}button,input[type="button"],input[type="reset"],input[type="submit"]{cursor:pointer;-webkit-appearance:button}input[type="search"]{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield}input[type="search"]::-webkit-search-decoration,input[type="search"]::-webkit-search-cancel-button{-webkit-appearance:none}textarea{overflow:auto;vertical-align:top}.clearfix{*zoom:1}.clearfix:before,.clearfix:after{display:table;content:""}.clearfix:after{clear:both}.hide-text{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.input-block-level{display:block;width:100%;min-height:28px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;-ms-box-sizing:border-box;box-sizing:border-box}body{margin:0;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;line-height:18px;color:#333;background-color:#fff}a{color:#08c;text-decoration:none}a:hover{color:#005580;text-decoration:underline}.row{margin-left:-20px;*zoom:1}.row:before,.row:after{display:table;content:""}.row:after{clear:both}[class*="span"]{float:left;margin-left:20px}.container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:940px}.span12{width:940px}.span11{width:860px}.span10{width:780px}.span9{width:700px}.span8{width:620px}.span7{width:540px}.span6{width:460px}.span5{width:380px}.span4{width:300px}.span3{width:220px}.span2{width:140px}.span1{width:60px}.offset12{margin-left:980px}.offset11{margin-left:900px}.offset10{margin-left:820px}.offset9{margin-left:740px}.offset8{margin-left:660px}.offset7{margin-left:580px}.offset6{margin-left:500px}.offset5{margin-left:420px}.offset4{margin-left:340px}.offset3{margin-left:260px}.offset2{margin-left:180px}.offset1{margin-left:100px}.row-fluid{width:100%;*zoom:1}.row-fluid:before,.row-fluid:after{display:table;content:""}.row-fluid:after{clear:both}.row-fluid [class*="span"]{display:block;float:left;width:100%;min-height:28px;margin-left:2.127659574%;*margin-left:2.0744680846382977%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;-ms-box-sizing:border-box;box-sizing:border-box}.row-fluid [class*="span"]:first-child{margin-left:0}.row-fluid .span12{width:99.99999998999999%;*width:99.94680850063828%}.row-fluid .span11{width:91.489361693%;*width:91.4361702036383%}.row-fluid .span10{width:82.97872339599999%;*width:82.92553190663828%}.row-fluid .span9{width:74.468085099%;*width:74.4148936096383%}.row-fluid .span8{width:65.95744680199999%;*width:65.90425531263828%}.row-fluid .span7{width:57.446808505%;*width:57.3936170156383%}.row-fluid .span6{width:48.93617020799999%;*width:48.88297871863829%}.row-fluid .span5{width:40.425531911%;*width:40.3723404216383%}.row-fluid .span4{width:31.914893614%;*width:31.8617021246383%}.row-fluid .span3{width:23.404255317%;*width:23.3510638276383%}.row-fluid .span2{width:14.89361702%;*width:14.8404255306383%}.row-fluid .span1{width:6.382978723%;*width:6.329787233638298%}.container{margin-right:auto;margin-left:auto;*zoom:1}.container:before,.container:after{display:table;content:""}.container:after{clear:both}.container-fluid{padding-right:20px;padding-left:20px;*zoom:1}.container-fluid:before,.container-fluid:after{display:table;content:""}.container-fluid:after{clear:both}p{margin:0 0 9px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;line-height:18px}p small{font-size:11px;color:#999}.lead{margin-bottom:18px;font-size:20px;font-weight:200;line-height:27px}h1,h2,h3,h4,h5,h6{margin:0;font-family:inherit;font-weight:bold;color:inherit;text-rendering:optimizelegibility}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small{font-weight:normal;color:#999}h1{font-size:30px;line-height:36px}h1 small{font-size:18px}h2{font-size:24px;line-height:36px}h2 small{font-size:18px}h3{font-size:18px;line-height:27px}h3 small{font-size:14px}h4,h5,h6{line-height:18px}h4{font-size:14px}h4 small{font-size:12px}h5{font-size:12px}h6{font-size:11px;color:#999;text-transform:uppercase}.page-header{padding-bottom:17px;margin:18px 0;border-bottom:1px solid #eee}.page-header h1{line-height:1}ul,ol{padding:0;margin:0 0 9px 25px}ul ul,ul ol,ol ol,ol ul{margin-bottom:0}ul{list-style:disc}ol{list-style:decimal}li{line-height:18px}ul.unstyled,ol.unstyled{margin-left:0;list-style:none}dl{margin-bottom:18px}dt,dd{line-height:18px}dt{font-weight:bold;line-height:17px}dd{margin-left:9px}.dl-horizontal dt{float:left;width:120px;overflow:hidden;clear:left;text-align:right;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:130px}hr{margin:18px 0;border:0;border-top:1px solid #eee;border-bottom:1px solid #fff}strong{font-weight:bold}em{font-style:italic}.muted{color:#999}abbr[title]{cursor:help;border-bottom:1px dotted #ddd}abbr.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:0 0 0 15px;margin:0 0 18px;border-left:5px solid #eee}blockquote p{margin-bottom:0;font-size:16px;font-weight:300;line-height:22.5px}blockquote small{display:block;line-height:18px;color:#999}blockquote small:before{content:'\2014 \00A0'}blockquote.pull-right{float:right;padding-right:15px;padding-left:0;border-right:5px solid #eee;border-left:0}blockquote.pull-right p,blockquote.pull-right small{text-align:right}q:before,q:after,blockquote:before,blockquote:after{content:""}address{display:block;margin-bottom:18px;font-style:normal;line-height:18px}small{font-size:100%}cite{font-style:normal}code,pre{padding:0 3px 2px;font-family:Menlo,Monaco,Consolas,"Courier New",monospace;font-size:12px;color:#333;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}code{padding:2px 4px;color:#d14;background-color:#f7f7f9;border:1px solid #e1e1e8}pre{display:block;padding:8.5px;margin:0 0 9px;font-size:12.025px;line-height:18px;word-break:break-all;word-wrap:break-word;white-space:pre;white-space:pre-wrap;background-color:#f5f5f5;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.15);-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}pre.prettyprint{margin-bottom:18px}pre code{padding:0;color:inherit;background-color:transparent;border:0}.pre-scrollable{max-height:340px;overflow-y:scroll}form{margin:0 0 18px}fieldset{padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:27px;font-size:19.5px;line-height:36px;color:#333;border:0;border-bottom:1px solid #eee}legend small{font-size:13.5px;color:#999}label,input,button,select,textarea{font-size:13px;font-weight:normal;line-height:18px}input,button,select,textarea{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif}label{display:block;margin-bottom:5px;color:#333}input,textarea,select,.uneditable-input{display:inline-block;width:210px;height:18px;padding:4px;margin-bottom:9px;font-size:13px;line-height:18px;color:#555;background-color:#fff;border:1px solid #ccc;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.uneditable-textarea{width:auto;height:auto}label input,label textarea,label select{display:block}input[type="image"],input[type="checkbox"],input[type="radio"]{width:auto;height:auto;padding:0;margin:3px 0;*margin-top:0;line-height:normal;cursor:pointer;background-color:transparent;border:0 \9;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}input[type="image"]{border:0}input[type="file"]{width:auto;padding:initial;line-height:initial;background-color:#fff;background-color:initial;border:initial;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}input[type="button"],input[type="reset"],input[type="submit"]{width:auto;height:auto}select,input[type="file"]{height:28px;*margin-top:4px;line-height:28px}input[type="file"]{line-height:18px \9}select{width:220px;background-color:#fff}select[multiple],select[size]{height:auto}input[type="image"]{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}textarea{height:auto}input[type="hidden"]{display:none}.radio,.checkbox{min-height:18px;padding-left:18px}.radio input[type="radio"],.checkbox input[type="checkbox"]{float:left;margin-left:-18px}.controls>.radio:first-child,.controls>.checkbox:first-child{padding-top:5px}.radio.inline,.checkbox.inline{display:inline-block;padding-top:5px;margin-bottom:0;vertical-align:middle}.radio.inline+.radio.inline,.checkbox.inline+.checkbox.inline{margin-left:10px}input,textarea{-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-webkit-transition:border linear .2s,box-shadow linear .2s;-moz-transition:border linear .2s,box-shadow linear .2s;-ms-transition:border linear .2s,box-shadow linear .2s;-o-transition:border linear .2s,box-shadow linear .2s;transition:border linear .2s,box-shadow linear .2s}input:focus,textarea:focus{border-color:rgba(82,168,236,0.8);outline:0;outline:thin dotted \9;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(82,168,236,0.6);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(82,168,236,0.6);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(82,168,236,0.6)}input[type="file"]:focus,input[type="radio"]:focus,input[type="checkbox"]:focus,select:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.input-mini{width:60px}.input-small{width:90px}.input-medium{width:150px}.input-large{width:210px}.input-xlarge{width:270px}.input-xxlarge{width:530px}input[class*="span"],select[class*="span"],textarea[class*="span"],.uneditable-input[class*="span"],.row-fluid input[class*="span"],.row-fluid select[class*="span"],.row-fluid textarea[class*="span"],.row-fluid .uneditable-input[class*="span"]{float:none;margin-left:0}input,textarea,.uneditable-input{margin-left:0}input.span12,textarea.span12,.uneditable-input.span12{width:930px}input.span11,textarea.span11,.uneditable-input.span11{width:850px}input.span10,textarea.span10,.uneditable-input.span10{width:770px}input.span9,textarea.span9,.uneditable-input.span9{width:690px}input.span8,textarea.span8,.uneditable-input.span8{width:610px}input.span7,textarea.span7,.uneditable-input.span7{width:530px}input.span6,textarea.span6,.uneditable-input.span6{width:450px}input.span5,textarea.span5,.uneditable-input.span5{width:370px}input.span4,textarea.span4,.uneditable-input.span4{width:290px}input.span3,textarea.span3,.uneditable-input.span3{width:210px}input.span2,textarea.span2,.uneditable-input.span2{width:130px}input.span1,textarea.span1,.uneditable-input.span1{width:50px}input[disabled],select[disabled],textarea[disabled],input[readonly],select[readonly],textarea[readonly]{cursor:not-allowed;background-color:#eee;border-color:#ddd}input[type="radio"][disabled],input[type="checkbox"][disabled],input[type="radio"][readonly],input[type="checkbox"][readonly]{background-color:transparent}.control-group.warning>label,.control-group.warning .help-block,.control-group.warning .help-inline{color:#c09853}.control-group.warning input,.control-group.warning select,.control-group.warning textarea{color:#c09853;border-color:#c09853}.control-group.warning input:focus,.control-group.warning select:focus,.control-group.warning textarea:focus{border-color:#a47e3c;-webkit-box-shadow:0 0 6px #dbc59e;-moz-box-shadow:0 0 6px #dbc59e;box-shadow:0 0 6px #dbc59e}.control-group.warning .input-prepend .add-on,.control-group.warning .input-append .add-on{color:#c09853;background-color:#fcf8e3;border-color:#c09853}.control-group.error>label,.control-group.error .help-block,.control-group.error .help-inline{color:#b94a48}.control-group.error input,.control-group.error select,.control-group.error textarea{color:#b94a48;border-color:#b94a48}.control-group.error input:focus,.control-group.error select:focus,.control-group.error textarea:focus{border-color:#953b39;-webkit-box-shadow:0 0 6px #d59392;-moz-box-shadow:0 0 6px #d59392;box-shadow:0 0 6px #d59392}.control-group.error .input-prepend .add-on,.control-group.error .input-append .add-on{color:#b94a48;background-color:#f2dede;border-color:#b94a48}.control-group.success>label,.control-group.success .help-block,.control-group.success .help-inline{color:#468847}.control-group.success input,.control-group.success select,.control-group.success textarea{color:#468847;border-color:#468847}.control-group.success input:focus,.control-group.success select:focus,.control-group.success textarea:focus{border-color:#356635;-webkit-box-shadow:0 0 6px #7aba7b;-moz-box-shadow:0 0 6px #7aba7b;box-shadow:0 0 6px #7aba7b}.control-group.success .input-prepend .add-on,.control-group.success .input-append .add-on{color:#468847;background-color:#dff0d8;border-color:#468847}input:focus:required:invalid,textarea:focus:required:invalid,select:focus:required:invalid{color:#b94a48;border-color:#ee5f5b}input:focus:required:invalid:focus,textarea:focus:required:invalid:focus,select:focus:required:invalid:focus{border-color:#e9322d;-webkit-box-shadow:0 0 6px #f8b9b7;-moz-box-shadow:0 0 6px #f8b9b7;box-shadow:0 0 6px #f8b9b7}.form-actions{padding:17px 20px 18px;margin-top:18px;margin-bottom:18px;background-color:#f5f5f5;border-top:1px solid #ddd;*zoom:1}.form-actions:before,.form-actions:after{display:table;content:""}.form-actions:after{clear:both}.uneditable-input{overflow:hidden;white-space:nowrap;cursor:not-allowed;background-color:#fff;border-color:#eee;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.025);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,0.025);box-shadow:inset 0 1px 2px rgba(0,0,0,0.025)}:-moz-placeholder{color:#999}::-webkit-input-placeholder{color:#999}.help-block,.help-inline{color:#555}.help-block{display:block;margin-bottom:9px}.help-inline{display:inline-block;*display:inline;padding-left:5px;vertical-align:middle;*zoom:1}.input-prepend,.input-append{margin-bottom:5px}.input-prepend input,.input-append input,.input-prepend select,.input-append select,.input-prepend .uneditable-input,.input-append .uneditable-input{position:relative;margin-bottom:0;*margin-left:0;vertical-align:middle;-webkit-border-radius:0 3px 3px 0;-moz-border-radius:0 3px 3px 0;border-radius:0 3px 3px 0}.input-prepend input:focus,.input-append input:focus,.input-prepend select:focus,.input-append select:focus,.input-prepend .uneditable-input:focus,.input-append .uneditable-input:focus{z-index:2}.input-prepend .uneditable-input,.input-append .uneditable-input{border-left-color:#ccc}.input-prepend .add-on,.input-append .add-on{display:inline-block;width:auto;height:18px;min-width:16px;padding:4px 5px;font-weight:normal;line-height:18px;text-align:center;text-shadow:0 1px 0 #fff;vertical-align:middle;background-color:#eee;border:1px solid #ccc}.input-prepend .add-on,.input-append .add-on,.input-prepend .btn,.input-append .btn{margin-left:-1px;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.input-prepend .active,.input-append .active{background-color:#a9dba9;border-color:#46a546}.input-prepend .add-on,.input-prepend .btn{margin-right:-1px}.input-prepend .add-on:first-child,.input-prepend .btn:first-child{-webkit-border-radius:3px 0 0 3px;-moz-border-radius:3px 0 0 3px;border-radius:3px 0 0 3px}.input-append input,.input-append select,.input-append .uneditable-input{-webkit-border-radius:3px 0 0 3px;-moz-border-radius:3px 0 0 3px;border-radius:3px 0 0 3px}.input-append .uneditable-input{border-right-color:#ccc;border-left-color:#eee}.input-append .add-on:last-child,.input-append .btn:last-child{-webkit-border-radius:0 3px 3px 0;-moz-border-radius:0 3px 3px 0;border-radius:0 3px 3px 0}.input-prepend.input-append input,.input-prepend.input-append select,.input-prepend.input-append .uneditable-input{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.input-prepend.input-append .add-on:first-child,.input-prepend.input-append .btn:first-child{margin-right:-1px;-webkit-border-radius:3px 0 0 3px;-moz-border-radius:3px 0 0 3px;border-radius:3px 0 0 3px}.input-prepend.input-append .add-on:last-child,.input-prepend.input-append .btn:last-child{margin-left:-1px;-webkit-border-radius:0 3px 3px 0;-moz-border-radius:0 3px 3px 0;border-radius:0 3px 3px 0}.search-query{padding-right:14px;padding-right:4px \9;padding-left:14px;padding-left:4px \9;margin-bottom:0;-webkit-border-radius:14px;-moz-border-radius:14px;border-radius:14px}.form-search input,.form-inline input,.form-horizontal input,.form-search textarea,.form-inline textarea,.form-horizontal textarea,.form-search select,.form-inline select,.form-horizontal select,.form-search .help-inline,.form-inline .help-inline,.form-horizontal .help-inline,.form-search .uneditable-input,.form-inline .uneditable-input,.form-horizontal .uneditable-input,.form-search .input-prepend,.form-inline .input-prepend,.form-horizontal .input-prepend,.form-search .input-append,.form-inline .input-append,.form-horizontal .input-append{display:inline-block;*display:inline;margin-bottom:0;*zoom:1}.form-search .hide,.form-inline .hide,.form-horizontal .hide{display:none}.form-search label,.form-inline label{display:inline-block}.form-search .input-append,.form-inline .input-append,.form-search .input-prepend,.form-inline .input-prepend{margin-bottom:0}.form-search .radio,.form-search .checkbox,.form-inline .radio,.form-inline .checkbox{padding-left:0;margin-bottom:0;vertical-align:middle}.form-search .radio input[type="radio"],.form-search .checkbox input[type="checkbox"],.form-inline .radio input[type="radio"],.form-inline .checkbox input[type="checkbox"]{float:left;margin-right:3px;margin-left:0}.control-group{margin-bottom:9px}legend+.control-group{margin-top:18px;-webkit-margin-top-collapse:separate}.form-horizontal .control-group{margin-bottom:18px;*zoom:1}.form-horizontal .control-group:before,.form-horizontal .control-group:after{display:table;content:""}.form-horizontal .control-group:after{clear:both}.form-horizontal .control-label{float:left;width:140px;padding-top:5px;text-align:right}.form-horizontal .controls{*display:inline-block;*padding-left:20px;margin-left:160px;*margin-left:0}.form-horizontal .controls:first-child{*padding-left:160px}.form-horizontal .help-block{margin-top:9px;margin-bottom:0}.form-horizontal .form-actions{padding-left:160px}table{max-width:100%;background-color:transparent;border-collapse:collapse;border-spacing:0}.table{width:100%;margin-bottom:18px}.table th,.table td{padding:8px;line-height:18px;text-align:left;vertical-align:top;border-top:1px solid #ddd}.table th{font-weight:bold}.table thead th{vertical-align:bottom}.table caption+thead tr:first-child th,.table caption+thead tr:first-child td,.table colgroup+thead tr:first-child th,.table colgroup+thead tr:first-child td,.table thead:first-child tr:first-child th,.table thead:first-child tr:first-child td{border-top:0}.table tbody+tbody{border-top:2px solid #ddd}.table-condensed th,.table-condensed td{padding:4px 5px}.table-bordered{border:1px solid #ddd;border-collapse:separate;*border-collapse:collapsed;border-left:0;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.table-bordered th,.table-bordered td{border-left:1px solid #ddd}.table-bordered caption+thead tr:first-child th,.table-bordered caption+tbody tr:first-child th,.table-bordered caption+tbody tr:first-child td,.table-bordered colgroup+thead tr:first-child th,.table-bordered colgroup+tbody tr:first-child th,.table-bordered colgroup+tbody tr:first-child td,.table-bordered thead:first-child tr:first-child th,.table-bordered tbody:first-child tr:first-child th,.table-bordered tbody:first-child tr:first-child td{border-top:0}.table-bordered thead:first-child tr:first-child th:first-child,.table-bordered tbody:first-child tr:first-child td:first-child{-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topleft:4px}.table-bordered thead:first-child tr:first-child th:last-child,.table-bordered tbody:first-child tr:first-child td:last-child{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-moz-border-radius-topright:4px}.table-bordered thead:last-child tr:last-child th:first-child,.table-bordered tbody:last-child tr:last-child td:first-child{-webkit-border-radius:0 0 0 4px;-moz-border-radius:0 0 0 4px;border-radius:0 0 0 4px;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-moz-border-radius-bottomleft:4px}.table-bordered thead:last-child tr:last-child th:last-child,.table-bordered tbody:last-child tr:last-child td:last-child{-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-bottomright:4px}.table-striped tbody tr:nth-child(odd) td,.table-striped tbody tr:nth-child(odd) th{background-color:#f9f9f9}.table tbody tr:hover td,.table tbody tr:hover th{background-color:#f5f5f5}table .span1{float:none;width:44px;margin-left:0}table .span2{float:none;width:124px;margin-left:0}table .span3{float:none;width:204px;margin-left:0}table .span4{float:none;width:284px;margin-left:0}table .span5{float:none;width:364px;margin-left:0}table .span6{float:none;width:444px;margin-left:0}table .span7{float:none;width:524px;margin-left:0}table .span8{float:none;width:604px;margin-left:0}table .span9{float:none;width:684px;margin-left:0}table .span10{float:none;width:764px;margin-left:0}table .span11{float:none;width:844px;margin-left:0}table .span12{float:none;width:924px;margin-left:0}table .span13{float:none;width:1004px;margin-left:0}table .span14{float:none;width:1084px;margin-left:0}table .span15{float:none;width:1164px;margin-left:0}table .span16{float:none;width:1244px;margin-left:0}table .span17{float:none;width:1324px;margin-left:0}table .span18{float:none;width:1404px;margin-left:0}table .span19{float:none;width:1484px;margin-left:0}table .span20{float:none;width:1564px;margin-left:0}table .span21{float:none;width:1644px;margin-left:0}table .span22{float:none;width:1724px;margin-left:0}table .span23{float:none;width:1804px;margin-left:0}table .span24{float:none;width:1884px;margin-left:0}[class^="icon-"],[class*=" icon-"]{display:inline-block;width:14px;height:14px;*margin-right:.3em;line-height:14px;vertical-align:text-top;background-image:url("../img/glyphicons-halflings.png");background-position:14px 14px;background-repeat:no-repeat}[class^="icon-"]:last-child,[class*=" icon-"]:last-child{*margin-left:0}.icon-white{background-image:url("../img/glyphicons-halflings-white.png")}.icon-glass{background-position:0 0}.icon-music{background-position:-24px 0}.icon-search{background-position:-48px 0}.icon-envelope{background-position:-72px 0}.icon-heart{background-position:-96px 0}.icon-star{background-position:-120px 0}.icon-star-empty{background-position:-144px 0}.icon-user{background-position:-168px 0}.icon-film{background-position:-192px 0}.icon-th-large{background-position:-216px 0}.icon-th{background-position:-240px 0}.icon-th-list{background-position:-264px 0}.icon-ok{background-position:-288px 0}.icon-remove{background-position:-312px 0}.icon-zoom-in{background-position:-336px 0}.icon-zoom-out{background-position:-360px 0}.icon-off{background-position:-384px 0}.icon-signal{background-position:-408px 0}.icon-cog{background-position:-432px 0}.icon-trash{background-position:-456px 0}.icon-home{background-position:0 -24px}.icon-file{background-position:-24px -24px}.icon-time{background-position:-48px -24px}.icon-road{background-position:-72px -24px}.icon-download-alt{background-position:-96px -24px}.icon-download{background-position:-120px -24px}.icon-upload{background-position:-144px -24px}.icon-inbox{background-position:-168px -24px}.icon-play-circle{background-position:-192px -24px}.icon-repeat{background-position:-216px -24px}.icon-refresh{background-position:-240px -24px}.icon-list-alt{background-position:-264px -24px}.icon-lock{background-position:-287px -24px}.icon-flag{background-position:-312px -24px}.icon-headphones{background-position:-336px -24px}.icon-volume-off{background-position:-360px -24px}.icon-volume-down{background-position:-384px -24px}.icon-volume-up{background-position:-408px -24px}.icon-qrcode{background-position:-432px -24px}.icon-barcode{background-position:-456px -24px}.icon-tag{background-position:0 -48px}.icon-tags{background-position:-25px -48px}.icon-book{background-position:-48px -48px}.icon-bookmark{background-position:-72px -48px}.icon-print{background-position:-96px -48px}.icon-camera{background-position:-120px -48px}.icon-font{background-position:-144px -48px}.icon-bold{background-position:-167px -48px}.icon-italic{background-position:-192px -48px}.icon-text-height{background-position:-216px -48px}.icon-text-width{background-position:-240px -48px}.icon-align-left{background-position:-264px -48px}.icon-align-center{background-position:-288px -48px}.icon-align-right{background-position:-312px -48px}.icon-align-justify{background-position:-336px -48px}.icon-list{background-position:-360px -48px}.icon-indent-left{background-position:-384px -48px}.icon-indent-right{background-position:-408px -48px}.icon-facetime-video{background-position:-432px -48px}.icon-picture{background-position:-456px -48px}.icon-pencil{background-position:0 -72px}.icon-map-marker{background-position:-24px -72px}.icon-adjust{background-position:-48px -72px}.icon-tint{background-position:-72px -72px}.icon-edit{background-position:-96px -72px}.icon-share{background-position:-120px -72px}.icon-check{background-position:-144px -72px}.icon-move{background-position:-168px -72px}.icon-step-backward{background-position:-192px -72px}.icon-fast-backward{background-position:-216px -72px}.icon-backward{background-position:-240px -72px}.icon-play{background-position:-264px -72px}.icon-pause{background-position:-288px -72px}.icon-stop{background-position:-312px -72px}.icon-forward{background-position:-336px -72px}.icon-fast-forward{background-position:-360px -72px}.icon-step-forward{background-position:-384px -72px}.icon-eject{background-position:-408px -72px}.icon-chevron-left{background-position:-432px -72px}.icon-chevron-right{background-position:-456px -72px}.icon-plus-sign{background-position:0 -96px}.icon-minus-sign{background-position:-24px -96px}.icon-remove-sign{background-position:-48px -96px}.icon-ok-sign{background-position:-72px -96px}.icon-question-sign{background-position:-96px -96px}.icon-info-sign{background-position:-120px -96px}.icon-screenshot{background-position:-144px -96px}.icon-remove-circle{background-position:-168px -96px}.icon-ok-circle{background-position:-192px -96px}.icon-ban-circle{background-position:-216px -96px}.icon-arrow-left{background-position:-240px -96px}.icon-arrow-right{background-position:-264px -96px}.icon-arrow-up{background-position:-289px -96px}.icon-arrow-down{background-position:-312px -96px}.icon-share-alt{background-position:-336px -96px}.icon-resize-full{background-position:-360px -96px}.icon-resize-small{background-position:-384px -96px}.icon-plus{background-position:-408px -96px}.icon-minus{background-position:-433px -96px}.icon-asterisk{background-position:-456px -96px}.icon-exclamation-sign{background-position:0 -120px}.icon-gift{background-position:-24px -120px}.icon-leaf{background-position:-48px -120px}.icon-fire{background-position:-72px -120px}.icon-eye-open{background-position:-96px -120px}.icon-eye-close{background-position:-120px -120px}.icon-warning-sign{background-position:-144px -120px}.icon-plane{background-position:-168px -120px}.icon-calendar{background-position:-192px -120px}.icon-random{background-position:-216px -120px}.icon-comment{background-position:-240px -120px}.icon-magnet{background-position:-264px -120px}.icon-chevron-up{background-position:-288px -120px}.icon-chevron-down{background-position:-313px -119px}.icon-retweet{background-position:-336px -120px}.icon-shopping-cart{background-position:-360px -120px}.icon-folder-close{background-position:-384px -120px}.icon-folder-open{background-position:-408px -120px}.icon-resize-vertical{background-position:-432px -119px}.icon-resize-horizontal{background-position:-456px -118px}.icon-hdd{background-position:0 -144px}.icon-bullhorn{background-position:-24px -144px}.icon-bell{background-position:-48px -144px}.icon-certificate{background-position:-72px -144px}.icon-thumbs-up{background-position:-96px -144px}.icon-thumbs-down{background-position:-120px -144px}.icon-hand-right{background-position:-144px -144px}.icon-hand-left{background-position:-168px -144px}.icon-hand-up{background-position:-192px -144px}.icon-hand-down{background-position:-216px -144px}.icon-circle-arrow-right{background-position:-240px -144px}.icon-circle-arrow-left{background-position:-264px -144px}.icon-circle-arrow-up{background-position:-288px -144px}.icon-circle-arrow-down{background-position:-312px -144px}.icon-globe{background-position:-336px -144px}.icon-wrench{background-position:-360px -144px}.icon-tasks{background-position:-384px -144px}.icon-filter{background-position:-408px -144px}.icon-briefcase{background-position:-432px -144px}.icon-fullscreen{background-position:-456px -144px}.dropup,.dropdown{position:relative}.dropdown-toggle{*margin-bottom:-3px}.dropdown-toggle:active,.open .dropdown-toggle{outline:0}.caret{display:inline-block;width:0;height:0;vertical-align:top;border-top:4px solid #000;border-right:4px solid transparent;border-left:4px solid transparent;content:"";opacity:.3;filter:alpha(opacity=30)}.dropdown .caret{margin-top:8px;margin-left:2px}.dropdown:hover .caret,.open .caret{opacity:1;filter:alpha(opacity=100)}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:4px 0;margin:1px 0 0;list-style:none;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);*border-right-width:2px;*border-bottom-width:2px;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,0.2);-moz-box-shadow:0 5px 10px rgba(0,0,0,0.2);box-shadow:0 5px 10px rgba(0,0,0,0.2);-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{*width:100%;height:1px;margin:8px 1px;*margin:-5px 0 5px;overflow:hidden;background-color:#e5e5e5;border-bottom:1px solid #fff}.dropdown-menu a{display:block;padding:3px 15px;clear:both;font-weight:normal;line-height:18px;color:#333;white-space:nowrap}.dropdown-menu li>a:hover,.dropdown-menu .active>a,.dropdown-menu .active>a:hover{color:#fff;text-decoration:none;background-color:#08c}.open{*z-index:1000}.open .dropdown-menu{display:block}.pull-right .dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px solid #000;content:"\2191"}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:1px}.typeahead{margin-top:2px;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #eee;border:1px solid rgba(0,0,0,0.05);-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);box-shadow:inset 0 1px 1px rgba(0,0,0,0.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,0.15)}.well-large{padding:24px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.well-small{padding:9px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.fade{opacity:0;filter:alpha(opacity=0);-webkit-transition:opacity .15s linear;-moz-transition:opacity .15s linear;-ms-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1;filter:alpha(opacity=100)}.collapse{position:relative;height:0;overflow:hidden;-webkit-transition:height .35s ease;-moz-transition:height .35s ease;-ms-transition:height .35s ease;-o-transition:height .35s ease;transition:height .35s ease}.collapse.in{height:auto}.close{float:right;font-size:20px;font-weight:bold;line-height:18px;color:#000;text-shadow:0 1px 0 #fff;opacity:.2;filter:alpha(opacity=20)}.close:hover{color:#000;text-decoration:none;cursor:pointer;opacity:.4;filter:alpha(opacity=40)}button.close{padding:0;cursor:pointer;background:transparent;border:0;-webkit-appearance:none}.btn{display:inline-block;*display:inline;padding:4px 10px 4px;margin-bottom:0;*margin-left:.3em;font-size:13px;line-height:18px;*line-height:20px;color:#333;text-align:center;text-shadow:0 1px 1px rgba(255,255,255,0.75);vertical-align:middle;cursor:pointer;background-color:#f5f5f5;*background-color:#e6e6e6;background-image:-ms-linear-gradient(top,#fff,#e6e6e6);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fff),to(#e6e6e6));background-image:-webkit-linear-gradient(top,#fff,#e6e6e6);background-image:-o-linear-gradient(top,#fff,#e6e6e6);background-image:linear-gradient(top,#fff,#e6e6e6);background-image:-moz-linear-gradient(top,#fff,#e6e6e6);background-repeat:repeat-x;border:1px solid #ccc;*border:0;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);border-color:#e6e6e6 #e6e6e6 #bfbfbf;border-bottom-color:#b3b3b3;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;filter:progid:dximagetransform.microsoft.gradient(startColorstr='#ffffff',endColorstr='#e6e6e6',GradientType=0);filter:progid:dximagetransform.microsoft.gradient(enabled=false);*zoom:1;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05)}.btn:hover,.btn:active,.btn.active,.btn.disabled,.btn[disabled]{background-color:#e6e6e6;*background-color:#d9d9d9}.btn:active,.btn.active{background-color:#ccc \9}.btn:first-child{*margin-left:0}.btn:hover{color:#333;text-decoration:none;background-color:#e6e6e6;*background-color:#d9d9d9;background-position:0 -15px;-webkit-transition:background-position .1s linear;-moz-transition:background-position .1s linear;-ms-transition:background-position .1s linear;-o-transition:background-position .1s linear;transition:background-position .1s linear}.btn:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn.active,.btn:active{background-color:#e6e6e6;background-color:#d9d9d9 \9;background-image:none;outline:0;-webkit-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05)}.btn.disabled,.btn[disabled]{cursor:default;background-color:#e6e6e6;background-image:none;opacity:.65;filter:alpha(opacity=65);-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.btn-large{padding:9px 14px;font-size:15px;line-height:normal;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px}.btn-large [class^="icon-"]{margin-top:1px}.btn-small{padding:5px 9px;font-size:11px;line-height:16px}.btn-small [class^="icon-"]{margin-top:-1px}.btn-mini{padding:2px 6px;font-size:11px;line-height:14px}.btn-primary,.btn-primary:hover,.btn-warning,.btn-warning:hover,.btn-danger,.btn-danger:hover,.btn-success,.btn-success:hover,.btn-info,.btn-info:hover,.btn-inverse,.btn-inverse:hover{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25)}.btn-primary.active,.btn-warning.active,.btn-danger.active,.btn-success.active,.btn-info.active,.btn-inverse.active{color:rgba(255,255,255,0.75)}.btn{border-color:#ccc;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25)}.btn-primary{background-color:#0074cc;*background-color:#05c;background-image:-ms-linear-gradient(top,#08c,#05c);background-image:-webkit-gradient(linear,0 0,0 100%,from(#08c),to(#05c));background-image:-webkit-linear-gradient(top,#08c,#05c);background-image:-o-linear-gradient(top,#08c,#05c);background-image:-moz-linear-gradient(top,#08c,#05c);background-image:linear-gradient(top,#08c,#05c);background-repeat:repeat-x;border-color:#05c #05c #003580;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:dximagetransform.microsoft.gradient(startColorstr='#0088cc',endColorstr='#0055cc',GradientType=0);filter:progid:dximagetransform.microsoft.gradient(enabled=false)}.btn-primary:hover,.btn-primary:active,.btn-primary.active,.btn-primary.disabled,.btn-primary[disabled]{background-color:#05c;*background-color:#004ab3}.btn-primary:active,.btn-primary.active{background-color:#004099 \9}.btn-warning{background-color:#faa732;*background-color:#f89406;background-image:-ms-linear-gradient(top,#fbb450,#f89406);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fbb450),to(#f89406));background-image:-webkit-linear-gradient(top,#fbb450,#f89406);background-image:-o-linear-gradient(top,#fbb450,#f89406);background-image:-moz-linear-gradient(top,#fbb450,#f89406);background-image:linear-gradient(top,#fbb450,#f89406);background-repeat:repeat-x;border-color:#f89406 #f89406 #ad6704;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:dximagetransform.microsoft.gradient(startColorstr='#fbb450',endColorstr='#f89406',GradientType=0);filter:progid:dximagetransform.microsoft.gradient(enabled=false)}.btn-warning:hover,.btn-warning:active,.btn-warning.active,.btn-warning.disabled,.btn-warning[disabled]{background-color:#f89406;*background-color:#df8505}.btn-warning:active,.btn-warning.active{background-color:#c67605 \9}.btn-danger{background-color:#da4f49;*background-color:#bd362f;background-image:-ms-linear-gradient(top,#ee5f5b,#bd362f);background-image:-webkit-gradient(linear,0 0,0 100%,from(#ee5f5b),to(#bd362f));background-image:-webkit-linear-gradient(top,#ee5f5b,#bd362f);background-image:-o-linear-gradient(top,#ee5f5b,#bd362f);background-image:-moz-linear-gradient(top,#ee5f5b,#bd362f);background-image:linear-gradient(top,#ee5f5b,#bd362f);background-repeat:repeat-x;border-color:#bd362f #bd362f #802420;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:dximagetransform.microsoft.gradient(startColorstr='#ee5f5b',endColorstr='#bd362f',GradientType=0);filter:progid:dximagetransform.microsoft.gradient(enabled=false)}.btn-danger:hover,.btn-danger:active,.btn-danger.active,.btn-danger.disabled,.btn-danger[disabled]{background-color:#bd362f;*background-color:#a9302a}.btn-danger:active,.btn-danger.active{background-color:#942a25 \9}.btn-success{background-color:#5bb75b;*background-color:#51a351;background-image:-ms-linear-gradient(top,#62c462,#51a351);background-image:-webkit-gradient(linear,0 0,0 100%,from(#62c462),to(#51a351));background-image:-webkit-linear-gradient(top,#62c462,#51a351);background-image:-o-linear-gradient(top,#62c462,#51a351);background-image:-moz-linear-gradient(top,#62c462,#51a351);background-image:linear-gradient(top,#62c462,#51a351);background-repeat:repeat-x;border-color:#51a351 #51a351 #387038;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:dximagetransform.microsoft.gradient(startColorstr='#62c462',endColorstr='#51a351',GradientType=0);filter:progid:dximagetransform.microsoft.gradient(enabled=false)}.btn-success:hover,.btn-success:active,.btn-success.active,.btn-success.disabled,.btn-success[disabled]{background-color:#51a351;*background-color:#499249}.btn-success:active,.btn-success.active{background-color:#408140 \9}.btn-info{background-color:#49afcd;*background-color:#2f96b4;background-image:-ms-linear-gradient(top,#5bc0de,#2f96b4);background-image:-webkit-gradient(linear,0 0,0 100%,from(#5bc0de),to(#2f96b4));background-image:-webkit-linear-gradient(top,#5bc0de,#2f96b4);background-image:-o-linear-gradient(top,#5bc0de,#2f96b4);background-image:-moz-linear-gradient(top,#5bc0de,#2f96b4);background-image:linear-gradient(top,#5bc0de,#2f96b4);background-repeat:repeat-x;border-color:#2f96b4 #2f96b4 #1f6377;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:dximagetransform.microsoft.gradient(startColorstr='#5bc0de',endColorstr='#2f96b4',GradientType=0);filter:progid:dximagetransform.microsoft.gradient(enabled=false)}.btn-info:hover,.btn-info:active,.btn-info.active,.btn-info.disabled,.btn-info[disabled]{background-color:#2f96b4;*background-color:#2a85a0}.btn-info:active,.btn-info.active{background-color:#24748c \9}.btn-inverse{background-color:#414141;*background-color:#222;background-image:-ms-linear-gradient(top,#555,#222);background-image:-webkit-gradient(linear,0 0,0 100%,from(#555),to(#222));background-image:-webkit-linear-gradient(top,#555,#222);background-image:-o-linear-gradient(top,#555,#222);background-image:-moz-linear-gradient(top,#555,#222);background-image:linear-gradient(top,#555,#222);background-repeat:repeat-x;border-color:#222 #222 #000;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:dximagetransform.microsoft.gradient(startColorstr='#555555',endColorstr='#222222',GradientType=0);filter:progid:dximagetransform.microsoft.gradient(enabled=false)}.btn-inverse:hover,.btn-inverse:active,.btn-inverse.active,.btn-inverse.disabled,.btn-inverse[disabled]{background-color:#222;*background-color:#151515}.btn-inverse:active,.btn-inverse.active{background-color:#080808 \9}button.btn,input[type="submit"].btn{*padding-top:2px;*padding-bottom:2px}button.btn::-moz-focus-inner,input[type="submit"].btn::-moz-focus-inner{padding:0;border:0}button.btn.btn-large,input[type="submit"].btn.btn-large{*padding-top:7px;*padding-bottom:7px}button.btn.btn-small,input[type="submit"].btn.btn-small{*padding-top:3px;*padding-bottom:3px}button.btn.btn-mini,input[type="submit"].btn.btn-mini{*padding-top:1px;*padding-bottom:1px}.btn-group{position:relative;*margin-left:.3em;*zoom:1}.btn-group:before,.btn-group:after{display:table;content:""}.btn-group:after{clear:both}.btn-group:first-child{*margin-left:0}.btn-group+.btn-group{margin-left:5px}.btn-toolbar{margin-top:9px;margin-bottom:9px}.btn-toolbar .btn-group{display:inline-block;*display:inline;*zoom:1}.btn-group>.btn{position:relative;float:left;margin-left:-1px;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-group>.btn:first-child{margin-left:0;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-bottomleft:4px;-moz-border-radius-topleft:4px}.btn-group>.btn:last-child,.btn-group>.dropdown-toggle{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-topright:4px;-moz-border-radius-bottomright:4px}.btn-group>.btn.large:first-child{margin-left:0;-webkit-border-bottom-left-radius:6px;border-bottom-left-radius:6px;-webkit-border-top-left-radius:6px;border-top-left-radius:6px;-moz-border-radius-bottomleft:6px;-moz-border-radius-topleft:6px}.btn-group>.btn.large:last-child,.btn-group>.large.dropdown-toggle{-webkit-border-top-right-radius:6px;border-top-right-radius:6px;-webkit-border-bottom-right-radius:6px;border-bottom-right-radius:6px;-moz-border-radius-topright:6px;-moz-border-radius-bottomright:6px}.btn-group>.btn:hover,.btn-group>.btn:focus,.btn-group>.btn:active,.btn-group>.btn.active{z-index:2}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.dropdown-toggle{*padding-top:4px;padding-right:8px;*padding-bottom:4px;padding-left:8px;-webkit-box-shadow:inset 1px 0 0 rgba(255,255,255,0.125),inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 1px 0 0 rgba(255,255,255,0.125),inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 1px 0 0 rgba(255,255,255,0.125),inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05)}.btn-group>.btn-mini.dropdown-toggle{padding-right:5px;padding-left:5px}.btn-group>.btn-small.dropdown-toggle{*padding-top:4px;*padding-bottom:4px}.btn-group>.btn-large.dropdown-toggle{padding-right:12px;padding-left:12px}.btn-group.open .dropdown-toggle{background-image:none;-webkit-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05)}.btn-group.open .btn.dropdown-toggle{background-color:#e6e6e6}.btn-group.open .btn-primary.dropdown-toggle{background-color:#05c}.btn-group.open .btn-warning.dropdown-toggle{background-color:#f89406}.btn-group.open .btn-danger.dropdown-toggle{background-color:#bd362f}.btn-group.open .btn-success.dropdown-toggle{background-color:#51a351}.btn-group.open .btn-info.dropdown-toggle{background-color:#2f96b4}.btn-group.open .btn-inverse.dropdown-toggle{background-color:#222}.btn .caret{margin-top:7px;margin-left:0}.btn:hover .caret,.open.btn-group .caret{opacity:1;filter:alpha(opacity=100)}.btn-mini .caret{margin-top:5px}.btn-small .caret{margin-top:6px}.btn-large .caret{margin-top:6px;border-top-width:5px;border-right-width:5px;border-left-width:5px}.dropup .btn-large .caret{border-top:0;border-bottom:5px solid #000}.btn-primary .caret,.btn-warning .caret,.btn-danger .caret,.btn-info .caret,.btn-success .caret,.btn-inverse .caret{border-top-color:#fff;border-bottom-color:#fff;opacity:.75;filter:alpha(opacity=75)}.alert{padding:8px 35px 8px 14px;margin-bottom:18px;color:#c09853;text-shadow:0 1px 0 rgba(255,255,255,0.5);background-color:#fcf8e3;border:1px solid #fbeed5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.alert-heading{color:inherit}.alert .close{position:relative;top:-2px;right:-21px;line-height:18px}.alert-success{color:#468847;background-color:#dff0d8;border-color:#d6e9c6}.alert-danger,.alert-error{color:#b94a48;background-color:#f2dede;border-color:#eed3d7}.alert-info{color:#3a87ad;background-color:#d9edf7;border-color:#bce8f1}.alert-block{padding-top:14px;padding-bottom:14px}.alert-block>p,.alert-block>ul{margin-bottom:0}.alert-block p+p{margin-top:5px}.nav{margin-bottom:18px;margin-left:0;list-style:none}.nav>li>a{display:block}.nav>li>a:hover{text-decoration:none;background-color:#eee}.nav>.pull-right{float:right}.nav .nav-header{display:block;padding:3px 15px;font-size:11px;font-weight:bold;line-height:18px;color:#999;text-shadow:0 1px 0 rgba(255,255,255,0.5);text-transform:uppercase}.nav li+.nav-header{margin-top:9px}.nav-list{padding-right:15px;padding-left:15px;margin-bottom:0}.nav-list>li>a,.nav-list .nav-header{margin-right:-15px;margin-left:-15px;text-shadow:0 1px 0 rgba(255,255,255,0.5)}.nav-list>li>a{padding:3px 15px}.nav-list>.active>a,.nav-list>.active>a:hover{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.2);background-color:#08c}.nav-list [class^="icon-"]{margin-right:2px}.nav-list .divider{*width:100%;height:1px;margin:8px 1px;*margin:-5px 0 5px;overflow:hidden;background-color:#e5e5e5;border-bottom:1px solid #fff}.nav-tabs,.nav-pills{*zoom:1}.nav-tabs:before,.nav-pills:before,.nav-tabs:after,.nav-pills:after{display:table;content:""}.nav-tabs:after,.nav-pills:after{clear:both}.nav-tabs>li,.nav-pills>li{float:left}.nav-tabs>li>a,.nav-pills>li>a{padding-right:12px;padding-left:12px;margin-right:2px;line-height:14px}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{margin-bottom:-1px}.nav-tabs>li>a{padding-top:8px;padding-bottom:8px;line-height:18px;border:1px solid transparent;-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.nav-tabs>.active>a,.nav-tabs>.active>a:hover{color:#555;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}.nav-pills>li>a{padding-top:8px;padding-bottom:8px;margin-top:2px;margin-bottom:2px;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px}.nav-pills>.active>a,.nav-pills>.active>a:hover{color:#fff;background-color:#08c}.nav-stacked>li{float:none}.nav-stacked>li>a{margin-right:0}.nav-tabs.nav-stacked{border-bottom:0}.nav-tabs.nav-stacked>li>a{border:1px solid #ddd;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.nav-tabs.nav-stacked>li:first-child>a{-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0}.nav-tabs.nav-stacked>li:last-child>a{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px}.nav-tabs.nav-stacked>li>a:hover{z-index:2;border-color:#ddd}.nav-pills.nav-stacked>li>a{margin-bottom:3px}.nav-pills.nav-stacked>li:last-child>a{margin-bottom:1px}.nav-tabs .dropdown-menu{-webkit-border-radius:0 0 5px 5px;-moz-border-radius:0 0 5px 5px;border-radius:0 0 5px 5px}.nav-pills .dropdown-menu{-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.nav-tabs .dropdown-toggle .caret,.nav-pills .dropdown-toggle .caret{margin-top:6px;border-top-color:#08c;border-bottom-color:#08c}.nav-tabs .dropdown-toggle:hover .caret,.nav-pills .dropdown-toggle:hover .caret{border-top-color:#005580;border-bottom-color:#005580}.nav-tabs .active .dropdown-toggle .caret,.nav-pills .active .dropdown-toggle .caret{border-top-color:#333;border-bottom-color:#333}.nav>.dropdown.active>a:hover{color:#000;cursor:pointer}.nav-tabs .open .dropdown-toggle,.nav-pills .open .dropdown-toggle,.nav>li.dropdown.open.active>a:hover{color:#fff;background-color:#999;border-color:#999}.nav li.dropdown.open .caret,.nav li.dropdown.open.active .caret,.nav li.dropdown.open a:hover .caret{border-top-color:#fff;border-bottom-color:#fff;opacity:1;filter:alpha(opacity=100)}.tabs-stacked .open>a:hover{border-color:#999}.tabbable{*zoom:1}.tabbable:before,.tabbable:after{display:table;content:""}.tabbable:after{clear:both}.tab-content{overflow:auto}.tabs-below>.nav-tabs,.tabs-right>.nav-tabs,.tabs-left>.nav-tabs{border-bottom:0}.tab-content>.tab-pane,.pill-content>.pill-pane{display:none}.tab-content>.active,.pill-content>.active{display:block}.tabs-below>.nav-tabs{border-top:1px solid #ddd}.tabs-below>.nav-tabs>li{margin-top:-1px;margin-bottom:0}.tabs-below>.nav-tabs>li>a{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px}.tabs-below>.nav-tabs>li>a:hover{border-top-color:#ddd;border-bottom-color:transparent}.tabs-below>.nav-tabs>.active>a,.tabs-below>.nav-tabs>.active>a:hover{border-color:transparent #ddd #ddd #ddd}.tabs-left>.nav-tabs>li,.tabs-right>.nav-tabs>li{float:none}.tabs-left>.nav-tabs>li>a,.tabs-right>.nav-tabs>li>a{min-width:74px;margin-right:0;margin-bottom:3px}.tabs-left>.nav-tabs{float:left;margin-right:19px;border-right:1px solid #ddd}.tabs-left>.nav-tabs>li>a{margin-right:-1px;-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.tabs-left>.nav-tabs>li>a:hover{border-color:#eee #ddd #eee #eee}.tabs-left>.nav-tabs .active>a,.tabs-left>.nav-tabs .active>a:hover{border-color:#ddd transparent #ddd #ddd;*border-right-color:#fff}.tabs-right>.nav-tabs{float:right;margin-left:19px;border-left:1px solid #ddd}.tabs-right>.nav-tabs>li>a{margin-left:-1px;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.tabs-right>.nav-tabs>li>a:hover{border-color:#eee #eee #eee #ddd}.tabs-right>.nav-tabs .active>a,.tabs-right>.nav-tabs .active>a:hover{border-color:#ddd #ddd #ddd transparent;*border-left-color:#fff}.navbar{*position:relative;*z-index:2;margin-bottom:18px;overflow:visible}.navbar-inner{min-height:40px;padding-right:20px;padding-left:20px;background-color:#2c2c2c;background-image:-moz-linear-gradient(top,#333,#222);background-image:-ms-linear-gradient(top,#333,#222);background-image:-webkit-gradient(linear,0 0,0 100%,from(#333),to(#222));background-image:-webkit-linear-gradient(top,#333,#222);background-image:-o-linear-gradient(top,#333,#222);background-image:linear-gradient(top,#333,#222);background-repeat:repeat-x;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;filter:progid:dximagetransform.microsoft.gradient(startColorstr='#333333',endColorstr='#222222',GradientType=0);-webkit-box-shadow:0 1px 3px rgba(0,0,0,0.25),inset 0 -1px 0 rgba(0,0,0,0.1);-moz-box-shadow:0 1px 3px rgba(0,0,0,0.25),inset 0 -1px 0 rgba(0,0,0,0.1);box-shadow:0 1px 3px rgba(0,0,0,0.25),inset 0 -1px 0 rgba(0,0,0,0.1)}.navbar .container{width:auto}.nav-collapse.collapse{height:auto}.navbar{color:#999}.navbar .brand:hover{text-decoration:none}.navbar .brand{display:block;float:left;padding:8px 20px 12px;margin-left:-20px;font-size:20px;font-weight:200;line-height:1;color:#999}.navbar .navbar-text{margin-bottom:0;line-height:40px}.navbar .navbar-link{color:#999}.navbar .navbar-link:hover{color:#fff}.navbar .btn,.navbar .btn-group{margin-top:5px}.navbar .btn-group .btn{margin:0}.navbar-form{margin-bottom:0;*zoom:1}.navbar-form:before,.navbar-form:after{display:table;content:""}.navbar-form:after{clear:both}.navbar-form input,.navbar-form select,.navbar-form .radio,.navbar-form .checkbox{margin-top:5px}.navbar-form input,.navbar-form select{display:inline-block;margin-bottom:0}.navbar-form input[type="image"],.navbar-form input[type="checkbox"],.navbar-form input[type="radio"]{margin-top:3px}.navbar-form .input-append,.navbar-form .input-prepend{margin-top:6px;white-space:nowrap}.navbar-form .input-append input,.navbar-form .input-prepend input{margin-top:0}.navbar-search{position:relative;float:left;margin-top:6px;margin-bottom:0}.navbar-search .search-query{padding:4px 9px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;font-weight:normal;line-height:1;color:#fff;background-color:#626262;border:1px solid #151515;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1),0 1px 0 rgba(255,255,255,0.15);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1),0 1px 0 rgba(255,255,255,0.15);box-shadow:inset 0 1px 2px rgba(0,0,0,0.1),0 1px 0 rgba(255,255,255,0.15);-webkit-transition:none;-moz-transition:none;-ms-transition:none;-o-transition:none;transition:none}.navbar-search .search-query:-moz-placeholder{color:#ccc}.navbar-search .search-query::-webkit-input-placeholder{color:#ccc}.navbar-search .search-query:focus,.navbar-search .search-query.focused{padding:5px 10px;color:#333;text-shadow:0 1px 0 #fff;background-color:#fff;border:0;outline:0;-webkit-box-shadow:0 0 3px rgba(0,0,0,0.15);-moz-box-shadow:0 0 3px rgba(0,0,0,0.15);box-shadow:0 0 3px rgba(0,0,0,0.15)}.navbar-fixed-top,.navbar-fixed-bottom{position:fixed;right:0;left:0;z-index:1030;margin-bottom:0}.navbar-fixed-top .navbar-inner,.navbar-fixed-bottom .navbar-inner{padding-right:0;padding-left:0;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:940px}.navbar-fixed-top{top:0}.navbar-fixed-bottom{bottom:0}.navbar .nav{position:relative;left:0;display:block;float:left;margin:0 10px 0 0}.navbar .nav.pull-right{float:right}.navbar .nav>li{display:block;float:left}.navbar .nav>li>a{float:none;padding:9px 10px 11px;line-height:19px;color:#999;text-decoration:none;text-shadow:0 -1px 0 rgba(0,0,0,0.25)}.navbar .btn{display:inline-block;padding:4px 10px 4px;margin:5px 5px 6px;line-height:18px}.navbar .btn-group{padding:5px 5px 6px;margin:0}.navbar .nav>li>a:hover{color:#fff;text-decoration:none;background-color:transparent}.navbar .nav .active>a,.navbar .nav .active>a:hover{color:#fff;text-decoration:none;background-color:#222}.navbar .divider-vertical{width:1px;height:40px;margin:0 9px;overflow:hidden;background-color:#222;border-right:1px solid #333}.navbar .nav.pull-right{margin-right:0;margin-left:10px}.navbar .btn-navbar{display:none;float:right;padding:7px 10px;margin-right:5px;margin-left:5px;background-color:#2c2c2c;*background-color:#222;background-image:-ms-linear-gradient(top,#333,#222);background-image:-webkit-gradient(linear,0 0,0 100%,from(#333),to(#222));background-image:-webkit-linear-gradient(top,#333,#222);background-image:-o-linear-gradient(top,#333,#222);background-image:linear-gradient(top,#333,#222);background-image:-moz-linear-gradient(top,#333,#222);background-repeat:repeat-x;border-color:#222 #222 #000;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:dximagetransform.microsoft.gradient(startColorstr='#333333',endColorstr='#222222',GradientType=0);filter:progid:dximagetransform.microsoft.gradient(enabled=false);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.075);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.075);box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.075)}.navbar .btn-navbar:hover,.navbar .btn-navbar:active,.navbar .btn-navbar.active,.navbar .btn-navbar.disabled,.navbar .btn-navbar[disabled]{background-color:#222;*background-color:#151515}.navbar .btn-navbar:active,.navbar .btn-navbar.active{background-color:#080808 \9}.navbar .btn-navbar .icon-bar{display:block;width:18px;height:2px;background-color:#f5f5f5;-webkit-border-radius:1px;-moz-border-radius:1px;border-radius:1px;-webkit-box-shadow:0 1px 0 rgba(0,0,0,0.25);-moz-box-shadow:0 1px 0 rgba(0,0,0,0.25);box-shadow:0 1px 0 rgba(0,0,0,0.25)}.btn-navbar .icon-bar+.icon-bar{margin-top:3px}.navbar .dropdown-menu:before{position:absolute;top:-7px;left:9px;display:inline-block;border-right:7px solid transparent;border-bottom:7px solid #ccc;border-left:7px solid transparent;border-bottom-color:rgba(0,0,0,0.2);content:''}.navbar .dropdown-menu:after{position:absolute;top:-6px;left:10px;display:inline-block;border-right:6px solid transparent;border-bottom:6px solid #fff;border-left:6px solid transparent;content:''}.navbar-fixed-bottom .dropdown-menu:before{top:auto;bottom:-7px;border-top:7px solid #ccc;border-bottom:0;border-top-color:rgba(0,0,0,0.2)}.navbar-fixed-bottom .dropdown-menu:after{top:auto;bottom:-6px;border-top:6px solid #fff;border-bottom:0}.navbar .nav li.dropdown .dropdown-toggle .caret,.navbar .nav li.dropdown.open .caret{border-top-color:#fff;border-bottom-color:#fff}.navbar .nav li.dropdown.active .caret{opacity:1;filter:alpha(opacity=100)}.navbar .nav li.dropdown.open>.dropdown-toggle,.navbar .nav li.dropdown.active>.dropdown-toggle,.navbar .nav li.dropdown.open.active>.dropdown-toggle{background-color:transparent}.navbar .nav li.dropdown.active>.dropdown-toggle:hover{color:#fff}.navbar .pull-right .dropdown-menu,.navbar .dropdown-menu.pull-right{right:0;left:auto}.navbar .pull-right .dropdown-menu:before,.navbar .dropdown-menu.pull-right:before{right:12px;left:auto}.navbar .pull-right .dropdown-menu:after,.navbar .dropdown-menu.pull-right:after{right:13px;left:auto}.breadcrumb{padding:7px 14px;margin:0 0 18px;list-style:none;background-color:#fbfbfb;background-image:-moz-linear-gradient(top,#fff,#f5f5f5);background-image:-ms-linear-gradient(top,#fff,#f5f5f5);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fff),to(#f5f5f5));background-image:-webkit-linear-gradient(top,#fff,#f5f5f5);background-image:-o-linear-gradient(top,#fff,#f5f5f5);background-image:linear-gradient(top,#fff,#f5f5f5);background-repeat:repeat-x;border:1px solid #ddd;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;filter:progid:dximagetransform.microsoft.gradient(startColorstr='#ffffff',endColorstr='#f5f5f5',GradientType=0);-webkit-box-shadow:inset 0 1px 0 #fff;-moz-box-shadow:inset 0 1px 0 #fff;box-shadow:inset 0 1px 0 #fff}.breadcrumb li{display:inline-block;*display:inline;text-shadow:0 1px 0 #fff;*zoom:1}.breadcrumb .divider{padding:0 5px;color:#999}.breadcrumb .active a{color:#333}.pagination{height:36px;margin:18px 0}.pagination ul{display:inline-block;*display:inline;margin-bottom:0;margin-left:0;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;*zoom:1;-webkit-box-shadow:0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:0 1px 2px rgba(0,0,0,0.05);box-shadow:0 1px 2px rgba(0,0,0,0.05)}.pagination li{display:inline}.pagination a{float:left;padding:0 14px;line-height:34px;text-decoration:none;border:1px solid #ddd;border-left-width:0}.pagination a:hover,.pagination .active a{background-color:#f5f5f5}.pagination .active a{color:#999;cursor:default}.pagination .disabled span,.pagination .disabled a,.pagination .disabled a:hover{color:#999;cursor:default;background-color:transparent}.pagination li:first-child a{border-left-width:1px;-webkit-border-radius:3px 0 0 3px;-moz-border-radius:3px 0 0 3px;border-radius:3px 0 0 3px}.pagination li:last-child a{-webkit-border-radius:0 3px 3px 0;-moz-border-radius:0 3px 3px 0;border-radius:0 3px 3px 0}.pagination-centered{text-align:center}.pagination-right{text-align:right}.pager{margin-bottom:18px;margin-left:0;text-align:center;list-style:none;*zoom:1}.pager:before,.pager:after{display:table;content:""}.pager:after{clear:both}.pager li{display:inline}.pager a{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px}.pager a:hover{text-decoration:none;background-color:#f5f5f5}.pager .next a{float:right}.pager .previous a{float:left}.pager .disabled a,.pager .disabled a:hover{color:#999;cursor:default;background-color:#fff}.modal-open .dropdown-menu{z-index:2050}.modal-open .dropdown.open{*z-index:2050}.modal-open .popover{z-index:2060}.modal-open .tooltip{z-index:2070}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{opacity:0}.modal-backdrop,.modal-backdrop.fade.in{opacity:.8;filter:alpha(opacity=80)}.modal{position:fixed;top:50%;left:50%;z-index:1050;width:560px;margin:-250px 0 0 -280px;overflow:auto;background-color:#fff;border:1px solid #999;border:1px solid rgba(0,0,0,0.3);*border:1px solid #999;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 3px 7px rgba(0,0,0,0.3);-moz-box-shadow:0 3px 7px rgba(0,0,0,0.3);box-shadow:0 3px 7px rgba(0,0,0,0.3);-webkit-background-clip:padding-box;-moz-background-clip:padding-box;background-clip:padding-box}.modal.fade{top:-25%;-webkit-transition:opacity .3s linear,top .3s ease-out;-moz-transition:opacity .3s linear,top .3s ease-out;-ms-transition:opacity .3s linear,top .3s ease-out;-o-transition:opacity .3s linear,top .3s ease-out;transition:opacity .3s linear,top .3s ease-out}.modal.fade.in{top:50%}.modal-header{padding:9px 15px;border-bottom:1px solid #eee}.modal-header .close{margin-top:2px}.modal-body{max-height:400px;padding:15px;overflow-y:auto}.modal-form{margin-bottom:0}.modal-footer{padding:14px 15px 15px;margin-bottom:0;text-align:right;background-color:#f5f5f5;border-top:1px solid #ddd;-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px;*zoom:1;-webkit-box-shadow:inset 0 1px 0 #fff;-moz-box-shadow:inset 0 1px 0 #fff;box-shadow:inset 0 1px 0 #fff}.modal-footer:before,.modal-footer:after{display:table;content:""}.modal-footer:after{clear:both}.modal-footer .btn+.btn{margin-bottom:0;margin-left:5px}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.tooltip{position:absolute;z-index:1020;display:block;padding:5px;font-size:11px;opacity:0;filter:alpha(opacity=0);visibility:visible}.tooltip.in{opacity:.8;filter:alpha(opacity=80)}.tooltip.top{margin-top:-2px}.tooltip.right{margin-left:2px}.tooltip.bottom{margin-top:2px}.tooltip.left{margin-left:-2px}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-top:5px solid #000;border-right:5px solid transparent;border-left:5px solid transparent}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-top:5px solid transparent;border-bottom:5px solid transparent;border-left:5px solid #000}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-right:5px solid transparent;border-bottom:5px solid #000;border-left:5px solid transparent}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-top:5px solid transparent;border-right:5px solid #000;border-bottom:5px solid transparent}.tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;text-decoration:none;background-color:#000;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0}.popover{position:absolute;top:0;left:0;z-index:1010;display:none;padding:5px}.popover.top{margin-top:-5px}.popover.right{margin-left:5px}.popover.bottom{margin-top:5px}.popover.left{margin-left:-5px}.popover.top .arrow{bottom:0;left:50%;margin-left:-5px;border-top:5px solid #000;border-right:5px solid transparent;border-left:5px solid transparent}.popover.right .arrow{top:50%;left:0;margin-top:-5px;border-top:5px solid transparent;border-right:5px solid #000;border-bottom:5px solid transparent}.popover.bottom .arrow{top:0;left:50%;margin-left:-5px;border-right:5px solid transparent;border-bottom:5px solid #000;border-left:5px solid transparent}.popover.left .arrow{top:50%;right:0;margin-top:-5px;border-top:5px solid transparent;border-bottom:5px solid transparent;border-left:5px solid #000}.popover .arrow{position:absolute;width:0;height:0}.popover-inner{width:280px;padding:3px;overflow:hidden;background:#000;background:rgba(0,0,0,0.8);-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 3px 7px rgba(0,0,0,0.3);-moz-box-shadow:0 3px 7px rgba(0,0,0,0.3);box-shadow:0 3px 7px rgba(0,0,0,0.3)}.popover-title{padding:9px 15px;line-height:1;background-color:#f5f5f5;border-bottom:1px solid #eee;-webkit-border-radius:3px 3px 0 0;-moz-border-radius:3px 3px 0 0;border-radius:3px 3px 0 0}.popover-content{padding:14px;background-color:#fff;-webkit-border-radius:0 0 3px 3px;-moz-border-radius:0 0 3px 3px;border-radius:0 0 3px 3px;-webkit-background-clip:padding-box;-moz-background-clip:padding-box;background-clip:padding-box}.popover-content p,.popover-content ul,.popover-content ol{margin-bottom:0}.thumbnails{margin-left:-20px;list-style:none;*zoom:1}.thumbnails:before,.thumbnails:after{display:table;content:""}.thumbnails:after{clear:both}.row-fluid .thumbnails{margin-left:0}.thumbnails>li{float:left;margin-bottom:18px;margin-left:20px}.thumbnail{display:block;padding:4px;line-height:1;border:1px solid #ddd;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:0 1px 1px rgba(0,0,0,0.075);box-shadow:0 1px 1px rgba(0,0,0,0.075)}a.thumbnail:hover{border-color:#08c;-webkit-box-shadow:0 1px 4px rgba(0,105,214,0.25);-moz-box-shadow:0 1px 4px rgba(0,105,214,0.25);box-shadow:0 1px 4px rgba(0,105,214,0.25)}.thumbnail>img{display:block;max-width:100%;margin-right:auto;margin-left:auto}.thumbnail .caption{padding:9px}.label,.badge{font-size:10.998px;font-weight:bold;line-height:14px;color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);white-space:nowrap;vertical-align:baseline;background-color:#999}.label{padding:1px 4px 2px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.badge{padding:1px 9px 2px;-webkit-border-radius:9px;-moz-border-radius:9px;border-radius:9px}a.label:hover,a.badge:hover{color:#fff;text-decoration:none;cursor:pointer}.label-important,.badge-important{background-color:#b94a48}.label-important[href],.badge-important[href]{background-color:#953b39}.label-warning,.badge-warning{background-color:#f89406}.label-warning[href],.badge-warning[href]{background-color:#c67605}.label-success,.badge-success{background-color:#468847}.label-success[href],.badge-success[href]{background-color:#356635}.label-info,.badge-info{background-color:#3a87ad}.label-info[href],.badge-info[href]{background-color:#2d6987}.label-inverse,.badge-inverse{background-color:#333}.label-inverse[href],.badge-inverse[href]{background-color:#1a1a1a}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-moz-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-ms-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:0 0}to{background-position:40px 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{height:18px;margin-bottom:18px;overflow:hidden;background-color:#f7f7f7;background-image:-moz-linear-gradient(top,#f5f5f5,#f9f9f9);background-image:-ms-linear-gradient(top,#f5f5f5,#f9f9f9);background-image:-webkit-gradient(linear,0 0,0 100%,from(#f5f5f5),to(#f9f9f9));background-image:-webkit-linear-gradient(top,#f5f5f5,#f9f9f9);background-image:-o-linear-gradient(top,#f5f5f5,#f9f9f9);background-image:linear-gradient(top,#f5f5f5,#f9f9f9);background-repeat:repeat-x;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;filter:progid:dximagetransform.microsoft.gradient(startColorstr='#f5f5f5',endColorstr='#f9f9f9',GradientType=0);-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);box-shadow:inset 0 1px 2px rgba(0,0,0,0.1)}.progress .bar{width:0;height:18px;font-size:12px;color:#fff;text-align:center;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#0e90d2;background-image:-moz-linear-gradient(top,#149bdf,#0480be);background-image:-webkit-gradient(linear,0 0,0 100%,from(#149bdf),to(#0480be));background-image:-webkit-linear-gradient(top,#149bdf,#0480be);background-image:-o-linear-gradient(top,#149bdf,#0480be);background-image:linear-gradient(top,#149bdf,#0480be);background-image:-ms-linear-gradient(top,#149bdf,#0480be);background-repeat:repeat-x;filter:progid:dximagetransform.microsoft.gradient(startColorstr='#149bdf',endColorstr='#0480be',GradientType=0);-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);-moz-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);-webkit-box-sizing:border-box;-moz-box-sizing:border-box;-ms-box-sizing:border-box;box-sizing:border-box;-webkit-transition:width .6s ease;-moz-transition:width .6s ease;-ms-transition:width .6s ease;-o-transition:width .6s ease;transition:width .6s ease}.progress-striped .bar{background-color:#149bdf;background-image:-o-linear-gradient(-45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-webkit-linear-gradient(-45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(-45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-ms-linear-gradient(-45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:linear-gradient(-45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);-webkit-background-size:40px 40px;-moz-background-size:40px 40px;-o-background-size:40px 40px;background-size:40px 40px}.progress.active .bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-moz-animation:progress-bar-stripes 2s linear infinite;-ms-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-danger .bar{background-color:#dd514c;background-image:-moz-linear-gradient(top,#ee5f5b,#c43c35);background-image:-ms-linear-gradient(top,#ee5f5b,#c43c35);background-image:-webkit-gradient(linear,0 0,0 100%,from(#ee5f5b),to(#c43c35));background-image:-webkit-linear-gradient(top,#ee5f5b,#c43c35);background-image:-o-linear-gradient(top,#ee5f5b,#c43c35);background-image:linear-gradient(top,#ee5f5b,#c43c35);background-repeat:repeat-x;filter:progid:dximagetransform.microsoft.gradient(startColorstr='#ee5f5b',endColorstr='#c43c35',GradientType=0)}.progress-danger.progress-striped .bar{background-color:#ee5f5b;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(-45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(-45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-ms-linear-gradient(-45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(-45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(-45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-success .bar{background-color:#5eb95e;background-image:-moz-linear-gradient(top,#62c462,#57a957);background-image:-ms-linear-gradient(top,#62c462,#57a957);background-image:-webkit-gradient(linear,0 0,0 100%,from(#62c462),to(#57a957));background-image:-webkit-linear-gradient(top,#62c462,#57a957);background-image:-o-linear-gradient(top,#62c462,#57a957);background-image:linear-gradient(top,#62c462,#57a957);background-repeat:repeat-x;filter:progid:dximagetransform.microsoft.gradient(startColorstr='#62c462',endColorstr='#57a957',GradientType=0)}.progress-success.progress-striped .bar{background-color:#62c462;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(-45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(-45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-ms-linear-gradient(-45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(-45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(-45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-info .bar{background-color:#4bb1cf;background-image:-moz-linear-gradient(top,#5bc0de,#339bb9);background-image:-ms-linear-gradient(top,#5bc0de,#339bb9);background-image:-webkit-gradient(linear,0 0,0 100%,from(#5bc0de),to(#339bb9));background-image:-webkit-linear-gradient(top,#5bc0de,#339bb9);background-image:-o-linear-gradient(top,#5bc0de,#339bb9);background-image:linear-gradient(top,#5bc0de,#339bb9);background-repeat:repeat-x;filter:progid:dximagetransform.microsoft.gradient(startColorstr='#5bc0de',endColorstr='#339bb9',GradientType=0)}.progress-info.progress-striped .bar{background-color:#5bc0de;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(-45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(-45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-ms-linear-gradient(-45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(-45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(-45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-warning .bar{background-color:#faa732;background-image:-moz-linear-gradient(top,#fbb450,#f89406);background-image:-ms-linear-gradient(top,#fbb450,#f89406);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fbb450),to(#f89406));background-image:-webkit-linear-gradient(top,#fbb450,#f89406);background-image:-o-linear-gradient(top,#fbb450,#f89406);background-image:linear-gradient(top,#fbb450,#f89406);background-repeat:repeat-x;filter:progid:dximagetransform.microsoft.gradient(startColorstr='#fbb450',endColorstr='#f89406',GradientType=0)}.progress-warning.progress-striped .bar{background-color:#fbb450;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(-45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(-45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-ms-linear-gradient(-45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(-45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(-45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.accordion{margin-bottom:18px}.accordion-group{margin-bottom:2px;border:1px solid #e5e5e5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.accordion-heading{border-bottom:0}.accordion-heading .accordion-toggle{display:block;padding:8px 15px}.accordion-toggle{cursor:pointer}.accordion-inner{padding:9px 15px;border-top:1px solid #e5e5e5}.carousel{position:relative;margin-bottom:18px;line-height:1}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel .item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;-moz-transition:.6s ease-in-out left;-ms-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel .item>img{display:block;line-height:1}.carousel .active,.carousel .next,.carousel .prev{display:block}.carousel .active{left:0}.carousel .next,.carousel .prev{position:absolute;top:0;width:100%}.carousel .next{left:100%}.carousel .prev{left:-100%}.carousel .next.left,.carousel .prev.right{left:0}.carousel .active.left{left:-100%}.carousel .active.right{left:100%}.carousel-control{position:absolute;top:40%;left:15px;width:40px;height:40px;margin-top:-20px;font-size:60px;font-weight:100;line-height:30px;color:#fff;text-align:center;background:#222;border:3px solid #fff;-webkit-border-radius:23px;-moz-border-radius:23px;border-radius:23px;opacity:.5;filter:alpha(opacity=50)}.carousel-control.right{right:15px;left:auto}.carousel-control:hover{color:#fff;text-decoration:none;opacity:.9;filter:alpha(opacity=90)}.carousel-caption{position:absolute;right:0;bottom:0;left:0;padding:10px 15px 5px;background:#333;background:rgba(0,0,0,0.75)}.carousel-caption h4,.carousel-caption p{color:#fff}.hero-unit{padding:60px;margin-bottom:30px;background-color:#eee;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.hero-unit h1{margin-bottom:0;font-size:60px;line-height:1;letter-spacing:-1px;color:inherit}.hero-unit p{font-size:18px;font-weight:200;line-height:27px;color:inherit}.pull-right{float:right}.pull-left{float:left}.hide{display:none}.show{display:block}.invisible{visibility:hidden} diff --git a/debian/modules/naxsi/contrib/naxsi-ui/bootstrap/img/glyphicons-halflings-white.png b/debian/modules/naxsi/contrib/naxsi-ui/bootstrap/img/glyphicons-halflings-white.png deleted file mode 100644 index 3bf6484..0000000 Binary files a/debian/modules/naxsi/contrib/naxsi-ui/bootstrap/img/glyphicons-halflings-white.png and /dev/null differ diff --git a/debian/modules/naxsi/contrib/naxsi-ui/bootstrap/img/glyphicons-halflings.png b/debian/modules/naxsi/contrib/naxsi-ui/bootstrap/img/glyphicons-halflings.png deleted file mode 100644 index 79bc568..0000000 Binary files a/debian/modules/naxsi/contrib/naxsi-ui/bootstrap/img/glyphicons-halflings.png and /dev/null differ diff --git a/debian/modules/naxsi/contrib/naxsi-ui/bootstrap/js/bootstrap.js b/debian/modules/naxsi/contrib/naxsi-ui/bootstrap/js/bootstrap.js deleted file mode 100644 index 7244954..0000000 --- a/debian/modules/naxsi/contrib/naxsi-ui/bootstrap/js/bootstrap.js +++ /dev/null @@ -1,1824 +0,0 @@ -/* =================================================== - * bootstrap-transition.js v2.0.3 - * http://twitter.github.com/bootstrap/javascript.html#transitions - * =================================================== - * Copyright 2012 Twitter, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ========================================================== */ - - -!function ($) { - - $(function () { - - "use strict"; // jshint ;_; - - - /* CSS TRANSITION SUPPORT (http://www.modernizr.com/) - * ======================================================= */ - - $.support.transition = (function () { - - var transitionEnd = (function () { - - var el = document.createElement('bootstrap') - , transEndEventNames = { - 'WebkitTransition' : 'webkitTransitionEnd' - , 'MozTransition' : 'transitionend' - , 'OTransition' : 'oTransitionEnd' - , 'msTransition' : 'MSTransitionEnd' - , 'transition' : 'transitionend' - } - , name - - for (name in transEndEventNames){ - if (el.style[name] !== undefined) { - return transEndEventNames[name] - } - } - - }()) - - return transitionEnd && { - end: transitionEnd - } - - })() - - }) - -}(window.jQuery);/* ========================================================== - * bootstrap-alert.js v2.0.3 - * http://twitter.github.com/bootstrap/javascript.html#alerts - * ========================================================== - * Copyright 2012 Twitter, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ========================================================== */ - - -!function ($) { - - "use strict"; // jshint ;_; - - - /* ALERT CLASS DEFINITION - * ====================== */ - - var dismiss = '[data-dismiss="alert"]' - , Alert = function (el) { - $(el).on('click', dismiss, this.close) - } - - Alert.prototype.close = function (e) { - var $this = $(this) - , selector = $this.attr('data-target') - , $parent - - if (!selector) { - selector = $this.attr('href') - selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7 - } - - $parent = $(selector) - - e && e.preventDefault() - - $parent.length || ($parent = $this.hasClass('alert') ? $this : $this.parent()) - - $parent.trigger(e = $.Event('close')) - - if (e.isDefaultPrevented()) return - - $parent.removeClass('in') - - function removeElement() { - $parent - .trigger('closed') - .remove() - } - - $.support.transition && $parent.hasClass('fade') ? - $parent.on($.support.transition.end, removeElement) : - removeElement() - } - - - /* ALERT PLUGIN DEFINITION - * ======================= */ - - $.fn.alert = function (option) { - return this.each(function () { - var $this = $(this) - , data = $this.data('alert') - if (!data) $this.data('alert', (data = new Alert(this))) - if (typeof option == 'string') data[option].call($this) - }) - } - - $.fn.alert.Constructor = Alert - - - /* ALERT DATA-API - * ============== */ - - $(function () { - $('body').on('click.alert.data-api', dismiss, Alert.prototype.close) - }) - -}(window.jQuery);/* ============================================================ - * bootstrap-button.js v2.0.3 - * http://twitter.github.com/bootstrap/javascript.html#buttons - * ============================================================ - * Copyright 2012 Twitter, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================================================ */ - - -!function ($) { - - "use strict"; // jshint ;_; - - - /* BUTTON PUBLIC CLASS DEFINITION - * ============================== */ - - var Button = function (element, options) { - this.$element = $(element) - this.options = $.extend({}, $.fn.button.defaults, options) - } - - Button.prototype.setState = function (state) { - var d = 'disabled' - , $el = this.$element - , data = $el.data() - , val = $el.is('input') ? 'val' : 'html' - - state = state + 'Text' - data.resetText || $el.data('resetText', $el[val]()) - - $el[val](data[state] || this.options[state]) - - // push to event loop to allow forms to submit - setTimeout(function () { - state == 'loadingText' ? - $el.addClass(d).attr(d, d) : - $el.removeClass(d).removeAttr(d) - }, 0) - } - - Button.prototype.toggle = function () { - var $parent = this.$element.parent('[data-toggle="buttons-radio"]') - - $parent && $parent - .find('.active') - .removeClass('active') - - this.$element.toggleClass('active') - } - - - /* BUTTON PLUGIN DEFINITION - * ======================== */ - - $.fn.button = function (option) { - return this.each(function () { - var $this = $(this) - , data = $this.data('button') - , options = typeof option == 'object' && option - if (!data) $this.data('button', (data = new Button(this, options))) - if (option == 'toggle') data.toggle() - else if (option) data.setState(option) - }) - } - - $.fn.button.defaults = { - loadingText: 'loading...' - } - - $.fn.button.Constructor = Button - - - /* BUTTON DATA-API - * =============== */ - - $(function () { - $('body').on('click.button.data-api', '[data-toggle^=button]', function ( e ) { - var $btn = $(e.target) - if (!$btn.hasClass('btn')) $btn = $btn.closest('.btn') - $btn.button('toggle') - }) - }) - -}(window.jQuery);/* ========================================================== - * bootstrap-carousel.js v2.0.3 - * http://twitter.github.com/bootstrap/javascript.html#carousel - * ========================================================== - * Copyright 2012 Twitter, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ========================================================== */ - - -!function ($) { - - "use strict"; // jshint ;_; - - - /* CAROUSEL CLASS DEFINITION - * ========================= */ - - var Carousel = function (element, options) { - this.$element = $(element) - this.options = options - this.options.slide && this.slide(this.options.slide) - this.options.pause == 'hover' && this.$element - .on('mouseenter', $.proxy(this.pause, this)) - .on('mouseleave', $.proxy(this.cycle, this)) - } - - Carousel.prototype = { - - cycle: function (e) { - if (!e) this.paused = false - this.options.interval - && !this.paused - && (this.interval = setInterval($.proxy(this.next, this), this.options.interval)) - return this - } - - , to: function (pos) { - var $active = this.$element.find('.active') - , children = $active.parent().children() - , activePos = children.index($active) - , that = this - - if (pos > (children.length - 1) || pos < 0) return - - if (this.sliding) { - return this.$element.one('slid', function () { - that.to(pos) - }) - } - - if (activePos == pos) { - return this.pause().cycle() - } - - return this.slide(pos > activePos ? 'next' : 'prev', $(children[pos])) - } - - , pause: function (e) { - if (!e) this.paused = true - clearInterval(this.interval) - this.interval = null - return this - } - - , next: function () { - if (this.sliding) return - return this.slide('next') - } - - , prev: function () { - if (this.sliding) return - return this.slide('prev') - } - - , slide: function (type, next) { - var $active = this.$element.find('.active') - , $next = next || $active[type]() - , isCycling = this.interval - , direction = type == 'next' ? 'left' : 'right' - , fallback = type == 'next' ? 'first' : 'last' - , that = this - , e = $.Event('slide') - - this.sliding = true - - isCycling && this.pause() - - $next = $next.length ? $next : this.$element.find('.item')[fallback]() - - if ($next.hasClass('active')) return - - if ($.support.transition && this.$element.hasClass('slide')) { - this.$element.trigger(e) - if (e.isDefaultPrevented()) return - $next.addClass(type) - $next[0].offsetWidth // force reflow - $active.addClass(direction) - $next.addClass(direction) - this.$element.one($.support.transition.end, function () { - $next.removeClass([type, direction].join(' ')).addClass('active') - $active.removeClass(['active', direction].join(' ')) - that.sliding = false - setTimeout(function () { that.$element.trigger('slid') }, 0) - }) - } else { - this.$element.trigger(e) - if (e.isDefaultPrevented()) return - $active.removeClass('active') - $next.addClass('active') - this.sliding = false - this.$element.trigger('slid') - } - - isCycling && this.cycle() - - return this - } - - } - - - /* CAROUSEL PLUGIN DEFINITION - * ========================== */ - - $.fn.carousel = function (option) { - return this.each(function () { - var $this = $(this) - , data = $this.data('carousel') - , options = $.extend({}, $.fn.carousel.defaults, typeof option == 'object' && option) - if (!data) $this.data('carousel', (data = new Carousel(this, options))) - if (typeof option == 'number') data.to(option) - else if (typeof option == 'string' || (option = options.slide)) data[option]() - else if (options.interval) data.cycle() - }) - } - - $.fn.carousel.defaults = { - interval: 5000 - , pause: 'hover' - } - - $.fn.carousel.Constructor = Carousel - - - /* CAROUSEL DATA-API - * ================= */ - - $(function () { - $('body').on('click.carousel.data-api', '[data-slide]', function ( e ) { - var $this = $(this), href - , $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) //strip for ie7 - , options = !$target.data('modal') && $.extend({}, $target.data(), $this.data()) - $target.carousel(options) - e.preventDefault() - }) - }) - -}(window.jQuery);/* ============================================================= - * bootstrap-collapse.js v2.0.3 - * http://twitter.github.com/bootstrap/javascript.html#collapse - * ============================================================= - * Copyright 2012 Twitter, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================================================ */ - - -!function ($) { - - "use strict"; // jshint ;_; - - - /* COLLAPSE PUBLIC CLASS DEFINITION - * ================================ */ - - var Collapse = function (element, options) { - this.$element = $(element) - this.options = $.extend({}, $.fn.collapse.defaults, options) - - if (this.options.parent) { - this.$parent = $(this.options.parent) - } - - this.options.toggle && this.toggle() - } - - Collapse.prototype = { - - constructor: Collapse - - , dimension: function () { - var hasWidth = this.$element.hasClass('width') - return hasWidth ? 'width' : 'height' - } - - , show: function () { - var dimension - , scroll - , actives - , hasData - - if (this.transitioning) return - - dimension = this.dimension() - scroll = $.camelCase(['scroll', dimension].join('-')) - actives = this.$parent && this.$parent.find('> .accordion-group > .in') - - if (actives && actives.length) { - hasData = actives.data('collapse') - if (hasData && hasData.transitioning) return - actives.collapse('hide') - hasData || actives.data('collapse', null) - } - - this.$element[dimension](0) - this.transition('addClass', $.Event('show'), 'shown') - this.$element[dimension](this.$element[0][scroll]) - } - - , hide: function () { - var dimension - if (this.transitioning) return - dimension = this.dimension() - this.reset(this.$element[dimension]()) - this.transition('removeClass', $.Event('hide'), 'hidden') - this.$element[dimension](0) - } - - , reset: function (size) { - var dimension = this.dimension() - - this.$element - .removeClass('collapse') - [dimension](size || 'auto') - [0].offsetWidth - - this.$element[size !== null ? 'addClass' : 'removeClass']('collapse') - - return this - } - - , transition: function (method, startEvent, completeEvent) { - var that = this - , complete = function () { - if (startEvent.type == 'show') that.reset() - that.transitioning = 0 - that.$element.trigger(completeEvent) - } - - this.$element.trigger(startEvent) - - if (startEvent.isDefaultPrevented()) return - - this.transitioning = 1 - - this.$element[method]('in') - - $.support.transition && this.$element.hasClass('collapse') ? - this.$element.one($.support.transition.end, complete) : - complete() - } - - , toggle: function () { - this[this.$element.hasClass('in') ? 'hide' : 'show']() - } - - } - - - /* COLLAPSIBLE PLUGIN DEFINITION - * ============================== */ - - $.fn.collapse = function (option) { - return this.each(function () { - var $this = $(this) - , data = $this.data('collapse') - , options = typeof option == 'object' && option - if (!data) $this.data('collapse', (data = new Collapse(this, options))) - if (typeof option == 'string') data[option]() - }) - } - - $.fn.collapse.defaults = { - toggle: true - } - - $.fn.collapse.Constructor = Collapse - - - /* COLLAPSIBLE DATA-API - * ==================== */ - - $(function () { - $('body').on('click.collapse.data-api', '[data-toggle=collapse]', function ( e ) { - var $this = $(this), href - , target = $this.attr('data-target') - || e.preventDefault() - || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '') //strip for ie7 - , option = $(target).data('collapse') ? 'toggle' : $this.data() - $(target).collapse(option) - }) - }) - -}(window.jQuery);/* ============================================================ - * bootstrap-dropdown.js v2.0.3 - * http://twitter.github.com/bootstrap/javascript.html#dropdowns - * ============================================================ - * Copyright 2012 Twitter, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================================================ */ - - -!function ($) { - - "use strict"; // jshint ;_; - - - /* DROPDOWN CLASS DEFINITION - * ========================= */ - - var toggle = '[data-toggle="dropdown"]' - , Dropdown = function (element) { - var $el = $(element).on('click.dropdown.data-api', this.toggle) - $('html').on('click.dropdown.data-api', function () { - $el.parent().removeClass('open') - }) - } - - Dropdown.prototype = { - - constructor: Dropdown - - , toggle: function (e) { - var $this = $(this) - , $parent - , selector - , isActive - - if ($this.is('.disabled, :disabled')) return - - selector = $this.attr('data-target') - - if (!selector) { - selector = $this.attr('href') - selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7 - } - - $parent = $(selector) - $parent.length || ($parent = $this.parent()) - - isActive = $parent.hasClass('open') - - clearMenus() - - if (!isActive) $parent.toggleClass('open') - - return false - } - - } - - function clearMenus() { - $(toggle).parent().removeClass('open') - } - - - /* DROPDOWN PLUGIN DEFINITION - * ========================== */ - - $.fn.dropdown = function (option) { - return this.each(function () { - var $this = $(this) - , data = $this.data('dropdown') - if (!data) $this.data('dropdown', (data = new Dropdown(this))) - if (typeof option == 'string') data[option].call($this) - }) - } - - $.fn.dropdown.Constructor = Dropdown - - - /* APPLY TO STANDARD DROPDOWN ELEMENTS - * =================================== */ - - $(function () { - $('html').on('click.dropdown.data-api', clearMenus) - $('body') - .on('click.dropdown', '.dropdown form', function (e) { e.stopPropagation() }) - .on('click.dropdown.data-api', toggle, Dropdown.prototype.toggle) - }) - -}(window.jQuery);/* ========================================================= - * bootstrap-modal.js v2.0.3 - * http://twitter.github.com/bootstrap/javascript.html#modals - * ========================================================= - * Copyright 2012 Twitter, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ========================================================= */ - - -!function ($) { - - "use strict"; // jshint ;_; - - - /* MODAL CLASS DEFINITION - * ====================== */ - - var Modal = function (content, options) { - this.options = options - this.$element = $(content) - .delegate('[data-dismiss="modal"]', 'click.dismiss.modal', $.proxy(this.hide, this)) - } - - Modal.prototype = { - - constructor: Modal - - , toggle: function () { - return this[!this.isShown ? 'show' : 'hide']() - } - - , show: function () { - var that = this - , e = $.Event('show') - - this.$element.trigger(e) - - if (this.isShown || e.isDefaultPrevented()) return - - $('body').addClass('modal-open') - - this.isShown = true - - escape.call(this) - backdrop.call(this, function () { - var transition = $.support.transition && that.$element.hasClass('fade') - - if (!that.$element.parent().length) { - that.$element.appendTo(document.body) //don't move modals dom position - } - - that.$element - .show() - - if (transition) { - that.$element[0].offsetWidth // force reflow - } - - that.$element.addClass('in') - - transition ? - that.$element.one($.support.transition.end, function () { that.$element.trigger('shown') }) : - that.$element.trigger('shown') - - }) - } - - , hide: function (e) { - e && e.preventDefault() - - var that = this - - e = $.Event('hide') - - this.$element.trigger(e) - - if (!this.isShown || e.isDefaultPrevented()) return - - this.isShown = false - - $('body').removeClass('modal-open') - - escape.call(this) - - this.$element.removeClass('in') - - $.support.transition && this.$element.hasClass('fade') ? - hideWithTransition.call(this) : - hideModal.call(this) - } - - } - - - /* MODAL PRIVATE METHODS - * ===================== */ - - function hideWithTransition() { - var that = this - , timeout = setTimeout(function () { - that.$element.off($.support.transition.end) - hideModal.call(that) - }, 500) - - this.$element.one($.support.transition.end, function () { - clearTimeout(timeout) - hideModal.call(that) - }) - } - - function hideModal(that) { - this.$element - .hide() - .trigger('hidden') - - backdrop.call(this) - } - - function backdrop(callback) { - var that = this - , animate = this.$element.hasClass('fade') ? 'fade' : '' - - if (this.isShown && this.options.backdrop) { - var doAnimate = $.support.transition && animate - - this.$backdrop = $('