Compare commits
419 Commits
Author | SHA1 | Date |
---|---|---|
George Sokianos | c2a039f23f | |
Tatsuhiro Tsujikawa | 05b7929019 | |
Tatsuhiro Tsujikawa | 5b665b3e48 | |
Tatsuhiro Tsujikawa | 5089dcd3f2 | |
Tatsuhiro Tsujikawa | b52f96d38a | |
Tatsuhiro Tsujikawa | 2ca0bb0a2f | |
Tatsuhiro Tsujikawa | fa3d1bfc8f | |
Tatsuhiro Tsujikawa | 30bb4eb8f2 | |
Tatsuhiro Tsujikawa | b4cb3b0090 | |
Tatsuhiro Tsujikawa | 2c62572ae1 | |
Tatsuhiro Tsujikawa | 42904a586c | |
Tatsuhiro Tsujikawa | 8538e1ec42 | |
Tatsuhiro Tsujikawa | e6d608b522 | |
Tatsuhiro Tsujikawa | 00a33281be | |
Tatsuhiro Tsujikawa | 7c7ba0586e | |
Tatsuhiro Tsujikawa | 252c425ea6 | |
Fred Sundvik | 525630ae7a | |
Tatsuhiro Tsujikawa | 5195e8be6a | |
Tatsuhiro Tsujikawa | 358c15e015 | |
Tatsuhiro Tsujikawa | b5b18699cb | |
Tatsuhiro Tsujikawa | 44e4475a31 | |
Tatsuhiro Tsujikawa | a945c057c5 | |
Tatsuhiro Tsujikawa | babeddb649 | |
Tatsuhiro Tsujikawa | 2d790edac5 | |
Tatsuhiro Tsujikawa | 2bef60a6f4 | |
Tatsuhiro Tsujikawa | 17e3bb4ec5 | |
Tatsuhiro Tsujikawa | 5e1b1a0883 | |
Tatsuhiro Tsujikawa | 5b0cbb4892 | |
Tatsuhiro Tsujikawa | 17a5ba4969 | |
Tatsuhiro Tsujikawa | 20d95edc57 | |
Tatsuhiro Tsujikawa | 126b5f9d2b | |
Tatsuhiro Tsujikawa | 46602a961d | |
Tatsuhiro Tsujikawa | 00399695cb | |
Tatsuhiro Tsujikawa | f8e014de40 | |
Tatsuhiro Tsujikawa | 172159305c | |
Tatsuhiro Tsujikawa | aa607875b0 | |
Tatsuhiro Tsujikawa | 954d49f7a0 | |
Tatsuhiro Tsujikawa | 5929aeb47c | |
Tatsuhiro Tsujikawa | b990df49d6 | |
Tatsuhiro Tsujikawa | 2aa9d61ae2 | |
Tatsuhiro Tsujikawa | 0fb2c6f4f4 | |
Tatsuhiro Tsujikawa | 1c9817af0d | |
Tatsuhiro Tsujikawa | bea6cae0d5 | |
Tatsuhiro Tsujikawa | 804ce364bf | |
Tatsuhiro Tsujikawa | 83d7fb7fdd | |
Tatsuhiro Tsujikawa | 266a3d84e4 | |
Tatsuhiro Tsujikawa | e91de24be6 | |
Tatsuhiro Tsujikawa | b062e9f66c | |
Tatsuhiro Tsujikawa | f56448be60 | |
Tatsuhiro Tsujikawa | 17aa7b6a61 | |
Tatsuhiro Tsujikawa | 971d3552c7 | |
Tatsuhiro Tsujikawa | ddd40bae06 | |
Tatsuhiro Tsujikawa | cb11cfcd2c | |
Viktor Szakats | 5eed83ee17 | |
Tatsuhiro Tsujikawa | 11632d3c2c | |
Tatsuhiro Tsujikawa | 8c70d9c2e1 | |
Tatsuhiro Tsujikawa | 3b21fbaf03 | |
Tatsuhiro Tsujikawa | 5abafb4268 | |
Tatsuhiro Tsujikawa | 2f71f5c3c9 | |
Tatsuhiro Tsujikawa | 3f65ab7871 | |
Tatsuhiro Tsujikawa | 8e120de5bd | |
Tatsuhiro Tsujikawa | 8a355db8d9 | |
Tatsuhiro Tsujikawa | 93f1096de3 | |
Tatsuhiro Tsujikawa | f190afd0c0 | |
Tatsuhiro Tsujikawa | ebef6b5ced | |
Tatsuhiro Tsujikawa | 6c45e943b0 | |
Tatsuhiro Tsujikawa | 61caf66f1b | |
Tatsuhiro Tsujikawa | c56cda058e | |
Tatsuhiro Tsujikawa | b63705384a | |
Tatsuhiro Tsujikawa | 7380ff3551 | |
Tatsuhiro Tsujikawa | bfba6764e0 | |
Tatsuhiro Tsujikawa | 634e65df64 | |
Tatsuhiro Tsujikawa | 011fbf7f10 | |
Tatsuhiro Tsujikawa | 0363606924 | |
Tatsuhiro Tsujikawa | 40c7922386 | |
Tatsuhiro Tsujikawa | 958d9ac63b | |
Tatsuhiro Tsujikawa | c06f1e9974 | |
Tatsuhiro Tsujikawa | d3381233b1 | |
Tatsuhiro Tsujikawa | 6d88da58f1 | |
Tatsuhiro Tsujikawa | 77449a9477 | |
Tatsuhiro Tsujikawa | 116feb4a8c | |
Tatsuhiro Tsujikawa | dd63d1df42 | |
PufferOverflow | c47fa08b40 | |
Tatsuhiro Tsujikawa | 4bfd802937 | |
Tatsuhiro Tsujikawa | 87fef4ab71 | |
Tatsuhiro Tsujikawa | 844af88dc1 | |
Tatsuhiro Tsujikawa | 2f6ebfdf8c | |
Tatsuhiro Tsujikawa | 25858d8ada | |
Tatsuhiro Tsujikawa | 11d1f95412 | |
Tatsuhiro Tsujikawa | 931adb146b | |
Tatsuhiro Tsujikawa | 6a513dc9fd | |
Tatsuhiro Tsujikawa | f13cff01bb | |
Tatsuhiro Tsujikawa | 2608333ce5 | |
Tatsuhiro Tsujikawa | 9f5bf5c7dd | |
Tatsuhiro Tsujikawa | eb06e33e38 | |
Tatsuhiro Tsujikawa | a94d2de89a | |
Tatsuhiro Tsujikawa | 921b4d027a | |
Tatsuhiro Tsujikawa | 026ff48edb | |
Tatsuhiro Tsujikawa | 1340b296dd | |
Rudi Heitbaum | fc5a020bc6 | |
Tatsuhiro Tsujikawa | f919cf1a8e | |
Tatsuhiro Tsujikawa | 08676d23f9 | |
Tatsuhiro Tsujikawa | 28fa90811c | |
Tatsuhiro Tsujikawa | 56f39b30ce | |
Tatsuhiro Tsujikawa | df000cd01b | |
Tatsuhiro Tsujikawa | 47b990f508 | |
Tatsuhiro Tsujikawa | 68ea085535 | |
Tatsuhiro Tsujikawa | eb397721be | |
Tatsuhiro Tsujikawa | c3fa77158a | |
Tatsuhiro Tsujikawa | 7c0649d466 | |
Tatsuhiro Tsujikawa | f02f9ff50c | |
Tatsuhiro Tsujikawa | 31be334660 | |
Tatsuhiro Tsujikawa | 9d265e8bb8 | |
Tatsuhiro Tsujikawa | 1aa97d5d2c | |
Tatsuhiro Tsujikawa | 42394e3342 | |
Tatsuhiro Tsujikawa | 1bc1374d0c | |
Tatsuhiro Tsujikawa | f2c793c75b | |
Tatsuhiro Tsujikawa | 1bb4877976 | |
David Korczynski | 651f3bfce2 | |
Tatsuhiro Tsujikawa | 8a026e18f5 | |
Tatsuhiro Tsujikawa | 5164745ff9 | |
Tatsuhiro Tsujikawa | 179ecf7ccd | |
Tatsuhiro Tsujikawa | a4d12f2a71 | |
David Korczynski | 0ade040a68 | |
David Korczynski | 59be24be32 | |
Tatsuhiro Tsujikawa | 092014d5af | |
Tatsuhiro Tsujikawa | 39d9efe4bd | |
Tatsuhiro Tsujikawa | a3be763650 | |
Tatsuhiro Tsujikawa | b4cf6358d4 | |
Tatsuhiro Tsujikawa | a80df35b39 | |
Paweł Wegner | ff48a84a86 | |
Tatsuhiro Tsujikawa | 75a0d090df | |
Tatsuhiro Tsujikawa | 6418a86504 | |
Tatsuhiro Tsujikawa | 2916208eb3 | |
Tatsuhiro Tsujikawa | 22c88548b9 | |
Tatsuhiro Tsujikawa | c642a9f856 | |
Tatsuhiro Tsujikawa | 05f8d4e8c9 | |
Tatsuhiro Tsujikawa | 9d389e8744 | |
Tatsuhiro Tsujikawa | d51647f37e | |
Tatsuhiro Tsujikawa | c011105124 | |
Tatsuhiro Tsujikawa | bc909d6157 | |
Tatsuhiro Tsujikawa | 5cf678cf5e | |
Tatsuhiro Tsujikawa | f11be7df09 | |
Viktor Szakats | 7113970ff0 | |
Tatsuhiro Tsujikawa | 33974fbcd7 | |
Tatsuhiro Tsujikawa | 6eb90570f0 | |
Tatsuhiro Tsujikawa | 014f1c510d | |
Tatsuhiro Tsujikawa | db770a815a | |
Tatsuhiro Tsujikawa | aedb01a1a4 | |
Tatsuhiro Tsujikawa | 3d35558f0e | |
Tatsuhiro Tsujikawa | 02a3a15b82 | |
Tatsuhiro Tsujikawa | ffe1519366 | |
Tatsuhiro Tsujikawa | 97a5ca584b | |
Tatsuhiro Tsujikawa | 78cb0008d3 | |
Tatsuhiro Tsujikawa | d38cf2d11c | |
Tatsuhiro Tsujikawa | b7b09acb81 | |
Tatsuhiro Tsujikawa | 83ea8e5ba5 | |
Tatsuhiro Tsujikawa | 9a16e73813 | |
Tatsuhiro Tsujikawa | 2da1713200 | |
Tatsuhiro Tsujikawa | 118648ff17 | |
Tatsuhiro Tsujikawa | d9acf873ed | |
Tatsuhiro Tsujikawa | e065cbccb6 | |
Tatsuhiro Tsujikawa | cad6f6c3f0 | |
Tatsuhiro Tsujikawa | fc6d064371 | |
Tatsuhiro Tsujikawa | 501b1d4dcf | |
Tatsuhiro Tsujikawa | 54848210a9 | |
Tatsuhiro Tsujikawa | 7f4c2f9ec3 | |
Tatsuhiro Tsujikawa | af30e57c5e | |
Tatsuhiro Tsujikawa | b5c4ba8322 | |
Tatsuhiro Tsujikawa | d115f580e2 | |
Tatsuhiro Tsujikawa | 511fea418a | |
Tatsuhiro Tsujikawa | 711fb1d3c3 | |
Tatsuhiro Tsujikawa | 31b39ebc4c | |
Tatsuhiro Tsujikawa | f214519321 | |
Tatsuhiro Tsujikawa | 5dfd6d22fa | |
Tatsuhiro Tsujikawa | 146ca52f26 | |
Tatsuhiro Tsujikawa | 65e7c24df7 | |
Tatsuhiro Tsujikawa | 5ecd1372c3 | |
Tatsuhiro Tsujikawa | 6596cce8fb | |
Tatsuhiro Tsujikawa | ad7fc183d1 | |
Tatsuhiro Tsujikawa | 22f8cc687f | |
Tatsuhiro Tsujikawa | 294fb07750 | |
Tatsuhiro Tsujikawa | 71f8971dde | |
Tatsuhiro Tsujikawa | 7077096162 | |
Tatsuhiro Tsujikawa | 9800934e19 | |
Tatsuhiro Tsujikawa | 075142ab08 | |
Tatsuhiro Tsujikawa | ab3f86ab36 | |
Tatsuhiro Tsujikawa | ce66ac88c8 | |
Tatsuhiro Tsujikawa | 3849337b42 | |
Tatsuhiro Tsujikawa | e6cf62664d | |
Tatsuhiro Tsujikawa | 56ae4124b1 | |
Tatsuhiro Tsujikawa | 41aaa47fd0 | |
Tatsuhiro Tsujikawa | ffa50c12b1 | |
Tatsuhiro Tsujikawa | 41955b3878 | |
Tatsuhiro Tsujikawa | 534284477e | |
Tatsuhiro Tsujikawa | b646c0a351 | |
Tatsuhiro Tsujikawa | 6429551272 | |
Tatsuhiro Tsujikawa | ae2a9695f0 | |
Tatsuhiro Tsujikawa | 9698bd530b | |
Tatsuhiro Tsujikawa | 8c2386c221 | |
Tatsuhiro Tsujikawa | d1e07ab6b7 | |
Tatsuhiro Tsujikawa | b0fbb93022 | |
Tatsuhiro Tsujikawa | c44caa0580 | |
Tatsuhiro Tsujikawa | c10a55588b | |
Tatsuhiro Tsujikawa | 4ffb63a737 | |
Tatsuhiro Tsujikawa | ac3f846f29 | |
Tatsuhiro Tsujikawa | 73b5daddbc | |
Tatsuhiro Tsujikawa | a26bad3324 | |
Tatsuhiro Tsujikawa | 2c73de5292 | |
Tatsuhiro Tsujikawa | 9812a0bc81 | |
Tatsuhiro Tsujikawa | 8d48686cec | |
Tatsuhiro Tsujikawa | f38d9f8cf6 | |
Tatsuhiro Tsujikawa | 0d1894ecbb | |
Tatsuhiro Tsujikawa | d801a23f91 | |
Tatsuhiro Tsujikawa | 24d27977bd | |
Tatsuhiro Tsujikawa | 8bbd0363e9 | |
Tatsuhiro Tsujikawa | c67dc7ff1d | |
Tatsuhiro Tsujikawa | 0287024e85 | |
Tatsuhiro Tsujikawa | 31b5eb597d | |
Tatsuhiro Tsujikawa | 26ef62d613 | |
Tatsuhiro Tsujikawa | 3977be938f | |
Tatsuhiro Tsujikawa | fac4dcfc31 | |
Tatsuhiro Tsujikawa | 4cd95470d6 | |
Tatsuhiro Tsujikawa | e224ef45a4 | |
Tatsuhiro Tsujikawa | aacc48662a | |
Tatsuhiro Tsujikawa | 0c77d6b943 | |
Tatsuhiro Tsujikawa | 9d159596a4 | |
Tatsuhiro Tsujikawa | de8eaf6468 | |
Tatsuhiro Tsujikawa | 205e956883 | |
Tatsuhiro Tsujikawa | d5733b6beb | |
Tatsuhiro Tsujikawa | 4cbe74235d | |
Tatsuhiro Tsujikawa | 974a614020 | |
Tatsuhiro Tsujikawa | 267ce93a7e | |
Tatsuhiro Tsujikawa | ae1de00c91 | |
Tatsuhiro Tsujikawa | a144dc0e59 | |
Tatsuhiro Tsujikawa | 516cf851c3 | |
Tatsuhiro Tsujikawa | 59d6828848 | |
Tatsuhiro Tsujikawa | 76ffd6bf96 | |
Tatsuhiro Tsujikawa | 8ad8d70f62 | |
Tatsuhiro Tsujikawa | 9da4449025 | |
Tatsuhiro Tsujikawa | 0a3e55031d | |
Tatsuhiro Tsujikawa | be9bcdf36e | |
Tatsuhiro Tsujikawa | c8a032b6f4 | |
Tatsuhiro Tsujikawa | 55cf5ff3da | |
Tatsuhiro Tsujikawa | a93cac525e | |
Tatsuhiro Tsujikawa | a20cc23a78 | |
Tatsuhiro Tsujikawa | 854ef0e839 | |
Tatsuhiro Tsujikawa | 317e80c239 | |
Tatsuhiro Tsujikawa | 6f3ba6940e | |
Tatsuhiro Tsujikawa | 7858997c8f | |
Tatsuhiro Tsujikawa | 1ce55d23a3 | |
Tatsuhiro Tsujikawa | c13a66d26f | |
Tatsuhiro Tsujikawa | 992181a0de | |
Tatsuhiro Tsujikawa | 09344eb1ad | |
Tatsuhiro Tsujikawa | 0f1cba2af5 | |
Tatsuhiro Tsujikawa | cf78f476b8 | |
Tatsuhiro Tsujikawa | 846b0c076f | |
Tatsuhiro Tsujikawa | f5757aa18d | |
Tatsuhiro Tsujikawa | 80c09ea4db | |
Tatsuhiro Tsujikawa | 6b33fa3417 | |
Tatsuhiro Tsujikawa | 9ba95c9706 | |
Tatsuhiro Tsujikawa | 7b14706f03 | |
Tatsuhiro Tsujikawa | bfd08a46ec | |
Tatsuhiro Tsujikawa | 3b84147f45 | |
Tatsuhiro Tsujikawa | f277dafe1e | |
Tatsuhiro Tsujikawa | aca0573bed | |
Tatsuhiro Tsujikawa | 8d4c9e4345 | |
Tatsuhiro Tsujikawa | 80a93ddaf8 | |
Tatsuhiro Tsujikawa | 3ab7cf375c | |
Tatsuhiro Tsujikawa | a3fbd5ad73 | |
Tatsuhiro Tsujikawa | f2d1cc1a7a | |
Tatsuhiro Tsujikawa | 5ded01e288 | |
Tatsuhiro Tsujikawa | 3ec588bb54 | |
Tatsuhiro Tsujikawa | 470f06e5f6 | |
Tatsuhiro Tsujikawa | a10bb832fd | |
Tatsuhiro Tsujikawa | be16a24fcc | |
Tatsuhiro Tsujikawa | 2f5ec66a65 | |
Tatsuhiro Tsujikawa | 7c3e9152ce | |
Tatsuhiro Tsujikawa | 37ad3462d2 | |
Tatsuhiro Tsujikawa | 129daeff6f | |
Tatsuhiro Tsujikawa | 072784c9ee | |
Tatsuhiro Tsujikawa | 89431f1727 | |
Tatsuhiro Tsujikawa | d9f580c3cb | |
Tatsuhiro Tsujikawa | f6b05a0111 | |
Tatsuhiro Tsujikawa | 0353da4605 | |
Tatsuhiro Tsujikawa | 039ff29a2f | |
Tatsuhiro Tsujikawa | 385a28c7f1 | |
Tatsuhiro Tsujikawa | 89e49f1066 | |
Tatsuhiro Tsujikawa | abd6bb6818 | |
Tatsuhiro Tsujikawa | ad2fbea087 | |
Tatsuhiro Tsujikawa | 47cc36969a | |
Tatsuhiro Tsujikawa | 830cf1e294 | |
Tatsuhiro Tsujikawa | a22f2cfcc8 | |
Tatsuhiro Tsujikawa | f3d4b4f846 | |
Tatsuhiro Tsujikawa | a6537cb9ce | |
Tatsuhiro Tsujikawa | 79524471b4 | |
Tatsuhiro Tsujikawa | a67822b382 | |
Tatsuhiro Tsujikawa | 79da3fdedc | |
Tatsuhiro Tsujikawa | b5d74d7c9d | |
Tatsuhiro Tsujikawa | 385abf10f7 | |
Tatsuhiro Tsujikawa | f3206b12d5 | |
Tatsuhiro Tsujikawa | b70fdca9ac | |
Tatsuhiro Tsujikawa | bd3cc94a36 | |
Tatsuhiro Tsujikawa | 02f2336ab1 | |
Tatsuhiro Tsujikawa | 832d811982 | |
Tatsuhiro Tsujikawa | 637f3d7b33 | |
Tatsuhiro Tsujikawa | 254f2b3c42 | |
Tatsuhiro Tsujikawa | 633691e164 | |
Tatsuhiro Tsujikawa | 01bcc72f66 | |
Tatsuhiro Tsujikawa | 7ca255ff54 | |
Tatsuhiro Tsujikawa | 6430c98e86 | |
Tatsuhiro Tsujikawa | 32c2557bb7 | |
Tatsuhiro Tsujikawa | 3122a83900 | |
Tatsuhiro Tsujikawa | 75272a817e | |
Tatsuhiro Tsujikawa | 809d5af43e | |
Tatsuhiro Tsujikawa | 3b549caf90 | |
Tatsuhiro Tsujikawa | 42b659354d | |
Tatsuhiro Tsujikawa | 2275327794 | |
Tatsuhiro Tsujikawa | 02a5649343 | |
Tatsuhiro Tsujikawa | 3b0b9a458c | |
Tatsuhiro Tsujikawa | 6e6388e7c2 | |
Tatsuhiro Tsujikawa | ea6f0c641d | |
Tatsuhiro Tsujikawa | c883b18f2d | |
Tatsuhiro Tsujikawa | 97e69f7416 | |
Dimitris Apostolou | ad0c9eebf7 | |
Tatsuhiro Tsujikawa | 8a552631b4 | |
Tatsuhiro Tsujikawa | cff8106908 | |
Tatsuhiro Tsujikawa | 4eb49ac28e | |
Tatsuhiro Tsujikawa | deb390cf85 | |
Tatsuhiro Tsujikawa | d91ae6987d | |
Marcelo Trylesinski | 8ddb2273b9 | |
Renaud | e1446fd57a | |
Tatsuhiro Tsujikawa | 02e6cad121 | |
Tatsuhiro Tsujikawa | 0b053e06d8 | |
Ryo Ota | c3c0403dfa | |
Ryo Ota | abc15c696d | |
Tatsuhiro Tsujikawa | 344d300cf9 | |
Tatsuhiro Tsujikawa | dec233b9ef | |
Tatsuhiro Tsujikawa | f695dc999b | |
robaho | f92f81c05a | |
Tatsuhiro Tsujikawa | 3c4449c046 | |
Tatsuhiro Tsujikawa | 918e4ea46b | |
Tatsuhiro Tsujikawa | d14d97ab68 | |
Tatsuhiro Tsujikawa | 2aed077761 | |
Tatsuhiro Tsujikawa | 68b2295f4e | |
Tatsuhiro Tsujikawa | 528d177847 | |
Tatsuhiro Tsujikawa | deae6c95b1 | |
Tatsuhiro Tsujikawa | 7eb179069d | |
Tatsuhiro Tsujikawa | 47c33b8d03 | |
Tatsuhiro Tsujikawa | 94372fbe2a | |
Daniel Stenberg | 9e154297ff | |
Tatsuhiro Tsujikawa | c4828dbd7c | |
Tatsuhiro Tsujikawa | 0d16db2c65 | |
Tatsuhiro Tsujikawa | fb63ef305d | |
Tatsuhiro Tsujikawa | 089fc81d72 | |
Tatsuhiro Tsujikawa | c20d175ff2 | |
Tatsuhiro Tsujikawa | 3985957c4d | |
Tatsuhiro Tsujikawa | 845a20b582 | |
Tatsuhiro Tsujikawa | 7af0c508be | |
Tatsuhiro Tsujikawa | f8474b25f0 | |
Tatsuhiro Tsujikawa | 15a8d913ea | |
Tatsuhiro Tsujikawa | 65d3c9047f | |
Tatsuhiro Tsujikawa | 8c36971ea9 | |
Tatsuhiro Tsujikawa | ba1dff187b | |
Tatsuhiro Tsujikawa | 8ecacc8ed2 | |
Tatsuhiro Tsujikawa | 9d41896663 | |
Tatsuhiro Tsujikawa | 18d4a9e4ff | |
Tatsuhiro Tsujikawa | 1745a30644 | |
Tatsuhiro Tsujikawa | 0cc7c598ff | |
Tatsuhiro Tsujikawa | 8c4fbb86d8 | |
Tatsuhiro Tsujikawa | 693431312c | |
Tatsuhiro Tsujikawa | f3fca2a19a | |
Tatsuhiro Tsujikawa | 1ce9efc644 | |
Tatsuhiro Tsujikawa | 7055501efd | |
Tatsuhiro Tsujikawa | c790ee64a4 | |
Tatsuhiro Tsujikawa | 9fb05d5ea2 | |
Tatsuhiro Tsujikawa | 3742acaf39 | |
Tatsuhiro Tsujikawa | d8282de229 | |
Tatsuhiro Tsujikawa | 3a721a9dd5 | |
Tatsuhiro Tsujikawa | 0b6092446b | |
Shelley Vohr | 59a76c6d39 | |
Tatsuhiro Tsujikawa | fa7a916ef3 | |
Tatsuhiro Tsujikawa | 69c4187100 | |
Tatsuhiro Tsujikawa | 07128719c4 | |
Tatsuhiro Tsujikawa | 7471fa627d | |
Tatsuhiro Tsujikawa | d7af5924ff | |
Tatsuhiro Tsujikawa | a48e9d3d80 | |
Tatsuhiro Tsujikawa | 474a6db00c | |
Tatsuhiro Tsujikawa | cb6aea9aa9 | |
Tatsuhiro Tsujikawa | f4290c6497 | |
Tatsuhiro Tsujikawa | 086b85b8f9 | |
Tatsuhiro Tsujikawa | abee658a60 | |
Tatsuhiro Tsujikawa | 87bdc21667 | |
Tatsuhiro Tsujikawa | 3e25ee8181 | |
Tatsuhiro Tsujikawa | 0266c458a3 | |
Tatsuhiro Tsujikawa | d9c7631dcb | |
Tatsuhiro Tsujikawa | df064fa2ba | |
Tatsuhiro Tsujikawa | 318e0c8447 | |
Tatsuhiro Tsujikawa | 17d5503bf2 | |
Tatsuhiro Tsujikawa | 19b4da6401 | |
Tatsuhiro Tsujikawa | 886dc93f18 | |
Tatsuhiro Tsujikawa | 407df2822e | |
Tatsuhiro Tsujikawa | f6da0d342a | |
Tatsuhiro Tsujikawa | 7271537a15 | |
Tatsuhiro Tsujikawa | d0e8efac4d | |
Tatsuhiro Tsujikawa | 27e6d56d83 | |
Tatsuhiro Tsujikawa | c5122c12cb | |
Tatsuhiro Tsujikawa | 282050c596 | |
Tatsuhiro Tsujikawa | 308c73bfa2 | |
Tatsuhiro Tsujikawa | c40309ae8e | |
Tatsuhiro Tsujikawa | 1c7a4ecc7f | |
Tatsuhiro Tsujikawa | 80cc623eb2 | |
Tatsuhiro Tsujikawa | 89457fd991 | |
Tatsuhiro Tsujikawa | 257043b8fb | |
Tatsuhiro Tsujikawa | 657d94b992 | |
Tatsuhiro Tsujikawa | 06dc7d5964 | |
Tatsuhiro Tsujikawa | b50079524b | |
Tatsuhiro Tsujikawa | cdf1f269ff | |
Tatsuhiro Tsujikawa | 738b562f39 |
|
@ -2,6 +2,7 @@
|
||||||
Language: Cpp
|
Language: Cpp
|
||||||
AccessModifierOffset: -2
|
AccessModifierOffset: -2
|
||||||
AlignAfterOpenBracket: Align
|
AlignAfterOpenBracket: Align
|
||||||
|
AlignArrayOfStructures: None
|
||||||
AlignConsecutiveMacros: None
|
AlignConsecutiveMacros: None
|
||||||
AlignConsecutiveAssignments: None
|
AlignConsecutiveAssignments: None
|
||||||
AlignConsecutiveBitFields: None
|
AlignConsecutiveBitFields: None
|
||||||
|
@ -10,7 +11,6 @@ AlignEscapedNewlines: Right
|
||||||
AlignOperands: Align
|
AlignOperands: Align
|
||||||
AlignTrailingComments: true
|
AlignTrailingComments: true
|
||||||
AllowAllArgumentsOnNextLine: true
|
AllowAllArgumentsOnNextLine: true
|
||||||
AllowAllConstructorInitializersOnNextLine: true
|
|
||||||
AllowAllParametersOfDeclarationOnNextLine: true
|
AllowAllParametersOfDeclarationOnNextLine: true
|
||||||
AllowShortEnumsOnASingleLine: true
|
AllowShortEnumsOnASingleLine: true
|
||||||
AllowShortBlocksOnASingleLine: Never
|
AllowShortBlocksOnASingleLine: Never
|
||||||
|
@ -58,23 +58,28 @@ BreakAfterJavaFieldAnnotations: false
|
||||||
BreakStringLiterals: true
|
BreakStringLiterals: true
|
||||||
ColumnLimit: 80
|
ColumnLimit: 80
|
||||||
CommentPragmas: '^ IWYU pragma:'
|
CommentPragmas: '^ IWYU pragma:'
|
||||||
|
QualifierAlignment: Leave
|
||||||
CompactNamespaces: false
|
CompactNamespaces: false
|
||||||
ConstructorInitializerAllOnOneLineOrOnePerLine: true
|
|
||||||
ConstructorInitializerIndentWidth: 4
|
ConstructorInitializerIndentWidth: 4
|
||||||
ContinuationIndentWidth: 4
|
ContinuationIndentWidth: 4
|
||||||
Cpp11BracedListStyle: true
|
Cpp11BracedListStyle: true
|
||||||
DeriveLineEnding: true
|
DeriveLineEnding: true
|
||||||
DerivePointerAlignment: false
|
DerivePointerAlignment: false
|
||||||
DisableFormat: false
|
DisableFormat: false
|
||||||
|
EmptyLineAfterAccessModifier: Never
|
||||||
EmptyLineBeforeAccessModifier: LogicalBlock
|
EmptyLineBeforeAccessModifier: LogicalBlock
|
||||||
ExperimentalAutoDetectBinPacking: false
|
ExperimentalAutoDetectBinPacking: false
|
||||||
|
PackConstructorInitializers: NextLine
|
||||||
|
BasedOnStyle: ''
|
||||||
|
ConstructorInitializerAllOnOneLineOrOnePerLine: false
|
||||||
|
AllowAllConstructorInitializersOnNextLine: true
|
||||||
FixNamespaceComments: true
|
FixNamespaceComments: true
|
||||||
ForEachMacros:
|
ForEachMacros:
|
||||||
- foreach
|
- foreach
|
||||||
- Q_FOREACH
|
- Q_FOREACH
|
||||||
- BOOST_FOREACH
|
- BOOST_FOREACH
|
||||||
StatementAttributeLikeMacros:
|
IfMacros:
|
||||||
- Q_EMIT
|
- KJ_IF_MAYBE
|
||||||
IncludeBlocks: Preserve
|
IncludeBlocks: Preserve
|
||||||
IncludeCategories:
|
IncludeCategories:
|
||||||
- Regex: '^"(llvm|llvm-c|clang|clang-c)/'
|
- Regex: '^"(llvm|llvm-c|clang|clang-c)/'
|
||||||
|
@ -91,6 +96,7 @@ IncludeCategories:
|
||||||
CaseSensitive: false
|
CaseSensitive: false
|
||||||
IncludeIsMainRegex: '$'
|
IncludeIsMainRegex: '$'
|
||||||
IncludeIsMainSourceRegex: ''
|
IncludeIsMainSourceRegex: ''
|
||||||
|
IndentAccessModifiers: false
|
||||||
IndentCaseLabels: false
|
IndentCaseLabels: false
|
||||||
IndentCaseBlocks: false
|
IndentCaseBlocks: false
|
||||||
IndentGotoLabels: true
|
IndentGotoLabels: true
|
||||||
|
@ -103,6 +109,7 @@ InsertTrailingCommas: None
|
||||||
JavaScriptQuotes: Leave
|
JavaScriptQuotes: Leave
|
||||||
JavaScriptWrapImports: true
|
JavaScriptWrapImports: true
|
||||||
KeepEmptyLinesAtTheStartOfBlocks: true
|
KeepEmptyLinesAtTheStartOfBlocks: true
|
||||||
|
LambdaBodyIndentation: Signature
|
||||||
MacroBlockBegin: ''
|
MacroBlockBegin: ''
|
||||||
MacroBlockEnd: ''
|
MacroBlockEnd: ''
|
||||||
MaxEmptyLinesToKeep: 1
|
MaxEmptyLinesToKeep: 1
|
||||||
|
@ -116,14 +123,20 @@ PenaltyBreakAssignment: 2
|
||||||
PenaltyBreakBeforeFirstCallParameter: 19
|
PenaltyBreakBeforeFirstCallParameter: 19
|
||||||
PenaltyBreakComment: 300
|
PenaltyBreakComment: 300
|
||||||
PenaltyBreakFirstLessLess: 120
|
PenaltyBreakFirstLessLess: 120
|
||||||
|
PenaltyBreakOpenParenthesis: 0
|
||||||
PenaltyBreakString: 1000
|
PenaltyBreakString: 1000
|
||||||
PenaltyBreakTemplateDeclaration: 10
|
PenaltyBreakTemplateDeclaration: 10
|
||||||
PenaltyExcessCharacter: 1000000
|
PenaltyExcessCharacter: 1000000
|
||||||
PenaltyReturnTypeOnItsOwnLine: 60
|
PenaltyReturnTypeOnItsOwnLine: 60
|
||||||
PenaltyIndentedWhitespace: 0
|
PenaltyIndentedWhitespace: 0
|
||||||
PointerAlignment: Right
|
PointerAlignment: Right
|
||||||
|
PPIndentWidth: -1
|
||||||
|
ReferenceAlignment: Pointer
|
||||||
ReflowComments: true
|
ReflowComments: true
|
||||||
SortIncludes: false
|
RemoveBracesLLVM: false
|
||||||
|
SeparateDefinitionBlocks: Leave
|
||||||
|
ShortNamespaceLines: 1
|
||||||
|
SortIncludes: Never
|
||||||
SortJavaStaticImport: Before
|
SortJavaStaticImport: Before
|
||||||
SortUsingDeclarations: true
|
SortUsingDeclarations: true
|
||||||
SpaceAfterCStyleCast: false
|
SpaceAfterCStyleCast: false
|
||||||
|
@ -135,20 +148,33 @@ SpaceBeforeCpp11BracedList: false
|
||||||
SpaceBeforeCtorInitializerColon: true
|
SpaceBeforeCtorInitializerColon: true
|
||||||
SpaceBeforeInheritanceColon: true
|
SpaceBeforeInheritanceColon: true
|
||||||
SpaceBeforeParens: ControlStatements
|
SpaceBeforeParens: ControlStatements
|
||||||
|
SpaceBeforeParensOptions:
|
||||||
|
AfterControlStatements: true
|
||||||
|
AfterForeachMacros: true
|
||||||
|
AfterFunctionDefinitionName: false
|
||||||
|
AfterFunctionDeclarationName: false
|
||||||
|
AfterIfMacros: true
|
||||||
|
AfterOverloadedOperator: false
|
||||||
|
BeforeNonEmptyParentheses: false
|
||||||
SpaceAroundPointerQualifiers: Default
|
SpaceAroundPointerQualifiers: Default
|
||||||
SpaceBeforeRangeBasedForLoopColon: true
|
SpaceBeforeRangeBasedForLoopColon: true
|
||||||
SpaceInEmptyBlock: false
|
SpaceInEmptyBlock: false
|
||||||
SpaceInEmptyParentheses: false
|
SpaceInEmptyParentheses: false
|
||||||
SpacesBeforeTrailingComments: 1
|
SpacesBeforeTrailingComments: 1
|
||||||
SpacesInAngles: false
|
SpacesInAngles: Never
|
||||||
SpacesInConditionalStatement: false
|
SpacesInConditionalStatement: false
|
||||||
SpacesInContainerLiterals: true
|
SpacesInContainerLiterals: true
|
||||||
SpacesInCStyleCastParentheses: false
|
SpacesInCStyleCastParentheses: false
|
||||||
|
SpacesInLineCommentPrefix:
|
||||||
|
Minimum: 1
|
||||||
|
Maximum: -1
|
||||||
SpacesInParentheses: false
|
SpacesInParentheses: false
|
||||||
SpacesInSquareBrackets: false
|
SpacesInSquareBrackets: false
|
||||||
SpaceBeforeSquareBrackets: false
|
SpaceBeforeSquareBrackets: false
|
||||||
BitFieldColonSpacing: Both
|
BitFieldColonSpacing: Both
|
||||||
Standard: Latest
|
Standard: Latest
|
||||||
|
StatementAttributeLikeMacros:
|
||||||
|
- Q_EMIT
|
||||||
StatementMacros:
|
StatementMacros:
|
||||||
- Q_UNUSED
|
- Q_UNUSED
|
||||||
- QT_REQUIRE_VERSION
|
- QT_REQUIRE_VERSION
|
||||||
|
|
|
@ -1,32 +1,43 @@
|
||||||
name: build
|
name: build
|
||||||
|
|
||||||
on: push
|
on: [push, pull_request]
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
build:
|
build:
|
||||||
runs-on: ${{ matrix.os }}
|
|
||||||
|
|
||||||
strategy:
|
strategy:
|
||||||
matrix:
|
matrix:
|
||||||
os: [ubuntu-20.04, macos-10.15]
|
os: [ubuntu-22.04, macos-11]
|
||||||
compiler: [gcc, clang]
|
compiler: [gcc, clang]
|
||||||
buildtool: [autotools, cmake]
|
buildtool: [autotools, cmake]
|
||||||
http3: [http3, no-http3]
|
http3: [http3, no-http3]
|
||||||
openssl: [openssl1, openssl3]
|
openssl: [openssl1, openssl3, boringssl]
|
||||||
exclude:
|
exclude:
|
||||||
- os: macos-10.15
|
- os: macos-11
|
||||||
openssl: openssl3
|
openssl: openssl3
|
||||||
- http3: no-http3
|
- http3: no-http3
|
||||||
openssl: openssl3
|
openssl: openssl3
|
||||||
|
- os: macos-11
|
||||||
|
compiler: gcc
|
||||||
|
- # disable macos cmake because of include path issue
|
||||||
|
os: macos-11
|
||||||
|
buildtool: cmake
|
||||||
|
- os: macos-11
|
||||||
|
openssl: boringssl
|
||||||
|
- openssl: boringssl
|
||||||
|
buildtool: cmake
|
||||||
|
- openssl: boringssl
|
||||||
|
compiler: gcc
|
||||||
|
|
||||||
|
runs-on: ${{ matrix.os }}
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v2
|
- uses: actions/checkout@v3
|
||||||
- name: Linux setup
|
- name: Linux setup
|
||||||
if: runner.os == 'Linux'
|
if: runner.os == 'Linux'
|
||||||
run: |
|
run: |
|
||||||
sudo apt-get install \
|
sudo apt-get install \
|
||||||
g++-8 \
|
g++-12 \
|
||||||
clang-10 \
|
clang-14 \
|
||||||
autoconf \
|
autoconf \
|
||||||
automake \
|
automake \
|
||||||
autotools-dev \
|
autotools-dev \
|
||||||
|
@ -60,13 +71,11 @@ jobs:
|
||||||
pkg-config \
|
pkg-config \
|
||||||
libtool
|
libtool
|
||||||
echo 'PKG_CONFIG_PATH=/usr/local/opt/libressl/lib/pkgconfig:/usr/local/opt/libxml2/lib/pkgconfig' >> $GITHUB_ENV
|
echo 'PKG_CONFIG_PATH=/usr/local/opt/libressl/lib/pkgconfig:/usr/local/opt/libxml2/lib/pkgconfig' >> $GITHUB_ENV
|
||||||
# This fixes infamous 'stdio.h not found' error.
|
|
||||||
echo 'SDKROOT='"$(xcrun --sdk macosx --show-sdk-path)" >> $GITHUB_ENV
|
|
||||||
- name: Setup clang (Linux)
|
- name: Setup clang (Linux)
|
||||||
if: runner.os == 'Linux' && matrix.compiler == 'clang'
|
if: runner.os == 'Linux' && matrix.compiler == 'clang'
|
||||||
run: |
|
run: |
|
||||||
echo 'CC=clang-10' >> $GITHUB_ENV
|
echo 'CC=clang-14' >> $GITHUB_ENV
|
||||||
echo 'CXX=clang++-10' >> $GITHUB_ENV
|
echo 'CXX=clang++-14' >> $GITHUB_ENV
|
||||||
- name: Setup clang (MacOS)
|
- name: Setup clang (MacOS)
|
||||||
if: runner.os == 'macOS' && matrix.compiler == 'clang'
|
if: runner.os == 'macOS' && matrix.compiler == 'clang'
|
||||||
run: |
|
run: |
|
||||||
|
@ -75,8 +84,8 @@ jobs:
|
||||||
- name: Setup gcc (Linux)
|
- name: Setup gcc (Linux)
|
||||||
if: runner.os == 'Linux' && matrix.compiler == 'gcc'
|
if: runner.os == 'Linux' && matrix.compiler == 'gcc'
|
||||||
run: |
|
run: |
|
||||||
echo 'CC=gcc-8' >> $GITHUB_ENV
|
echo 'CC=gcc-12' >> $GITHUB_ENV
|
||||||
echo 'CXX=g++-8' >> $GITHUB_ENV
|
echo 'CXX=g++-12' >> $GITHUB_ENV
|
||||||
- name: Setup gcc (MacOS)
|
- name: Setup gcc (MacOS)
|
||||||
if: runner.os == 'macOS' && matrix.compiler == 'gcc'
|
if: runner.os == 'macOS' && matrix.compiler == 'gcc'
|
||||||
run: |
|
run: |
|
||||||
|
@ -85,49 +94,74 @@ jobs:
|
||||||
- name: Build libbpf
|
- name: Build libbpf
|
||||||
if: matrix.http3 == 'http3' && matrix.compiler == 'clang' && runner.os == 'Linux'
|
if: matrix.http3 == 'http3' && matrix.compiler == 'clang' && runner.os == 'Linux'
|
||||||
run: |
|
run: |
|
||||||
git clone -b v0.4.0 https://github.com/libbpf/libbpf
|
git clone -b v1.0.1 https://github.com/libbpf/libbpf
|
||||||
cd libbpf
|
cd libbpf
|
||||||
PREFIX=$PWD/build make -C src install
|
PREFIX=$PWD/build make -C src install
|
||||||
|
|
||||||
EXTRA_AUTOTOOLS_OPTS="--with-libbpf"
|
EXTRA_AUTOTOOLS_OPTS="--with-libbpf"
|
||||||
|
EXTRA_CMAKE_OPTS="-DWITH_LIBBPF=1"
|
||||||
|
|
||||||
echo 'EXTRA_AUTOTOOLS_OPTS='"$EXTRA_AUTOTOOLS_OPTS" >> $GITHUB_ENV
|
echo 'EXTRA_AUTOTOOLS_OPTS='"$EXTRA_AUTOTOOLS_OPTS" >> $GITHUB_ENV
|
||||||
|
echo 'EXTRA_CMAKE_OPTS='"$EXTRA_CMAKE_OPTS" >> $GITHUB_ENV
|
||||||
- name: Build quictls/openssl v1.1.1
|
- name: Build quictls/openssl v1.1.1
|
||||||
if: matrix.http3 == 'http3' && matrix.openssl == 'openssl1'
|
if: matrix.http3 == 'http3' && matrix.openssl == 'openssl1'
|
||||||
run: |
|
run: |
|
||||||
git clone --depth 1 -b OpenSSL_1_1_1l+quic https://github.com/quictls/openssl
|
git clone --depth 1 -b OpenSSL_1_1_1s+quic https://github.com/quictls/openssl
|
||||||
cd openssl
|
cd openssl
|
||||||
./config enable-tls1_3 --prefix=$PWD/build
|
./config --prefix=$PWD/build
|
||||||
make -j$(nproc)
|
make -j"$(nproc 2> /dev/null || sysctl -n hw.ncpu)"
|
||||||
make install_sw
|
make install_sw
|
||||||
- name: Build quictls/openssl v3.0.0
|
- name: Build quictls/openssl v3.0.x
|
||||||
if: matrix.http3 == 'http3' && matrix.openssl == 'openssl3'
|
if: matrix.http3 == 'http3' && matrix.openssl == 'openssl3'
|
||||||
run: |
|
run: |
|
||||||
unset CPPFLAGS
|
unset CPPFLAGS
|
||||||
unset LDFLAGS
|
unset LDFLAGS
|
||||||
|
|
||||||
git clone --depth 1 -b openssl-3.0.0+quic https://github.com/quictls/openssl
|
git clone --depth 1 -b openssl-3.0.7+quic https://github.com/quictls/openssl
|
||||||
cd openssl
|
cd openssl
|
||||||
./config enable-tls1_3 --prefix=$PWD/build --libdir=$PWD/build/lib
|
./config enable-ktls --prefix=$PWD/build --libdir=$PWD/build/lib
|
||||||
make -j$(nproc)
|
make -j"$(nproc 2> /dev/null || sysctl -n hw.ncpu)"
|
||||||
make install_sw
|
make install_sw
|
||||||
|
- name: Build BoringSSL
|
||||||
|
if: matrix.openssl == 'boringssl'
|
||||||
|
run: |
|
||||||
|
git clone https://boringssl.googlesource.com/boringssl
|
||||||
|
cd boringssl
|
||||||
|
git checkout 31bad2514d21f6207f3925ba56754611c462a873
|
||||||
|
mkdir build
|
||||||
|
cd build
|
||||||
|
cmake -DCMAKE_POSITION_INDEPENDENT_CODE=ON ..
|
||||||
|
make -j"$(nproc 2> /dev/null || sysctl -n hw.ncpu)"
|
||||||
|
cd ..
|
||||||
|
|
||||||
|
OPENSSL_CFLAGS="-I$PWD/include/"
|
||||||
|
OPENSSL_LIBS="-L$PWD/build/ssl -lssl -L$PWD/build/crypto -lcrypto -pthread"
|
||||||
|
EXTRA_NGTCP2_OPTS="$EXTRA_NGTCP2_OPTS --without-openssl --with-boringssl"
|
||||||
|
EXTRA_AUTOTOOLS_OPTS="$EXTRA_AUTOTOOLS_OPTS --without-neverbleed --without-jemalloc"
|
||||||
|
|
||||||
|
echo 'OPENSSL_CFLAGS='"$OPENSSL_CFLAGS" >> $GITHUB_ENV
|
||||||
|
echo 'OPENSSL_LIBS='"$OPENSSL_LIBS" >> $GITHUB_ENV
|
||||||
|
echo 'BORINGSSL_CFLAGS='"$OPENSSL_CFLAGS" >> $GITHUB_ENV
|
||||||
|
echo 'BORINGSSL_LIBS='"$OPENSSL_LIBS" >> $GITHUB_ENV
|
||||||
|
echo 'EXTRA_NGTCP2_OPTS='"$EXTRA_NGTCP2_OPTS" >> "$GITHUB_ENV"
|
||||||
|
echo 'EXTRA_AUTOTOOLS_OPTS='"$EXTRA_AUTOTOOLS_OPTS" >> $GITHUB_ENV
|
||||||
- name: Build nghttp3
|
- name: Build nghttp3
|
||||||
if: matrix.http3 == 'http3'
|
if: matrix.http3 == 'http3'
|
||||||
run: |
|
run: |
|
||||||
git clone https://github.com/ngtcp2/nghttp3
|
git clone --depth 1 -b v0.8.0 https://github.com/ngtcp2/nghttp3
|
||||||
cd nghttp3
|
cd nghttp3
|
||||||
autoreconf -i
|
autoreconf -i
|
||||||
./configure --prefix=$PWD/build --enable-lib-only
|
./configure --prefix=$PWD/build --enable-lib-only
|
||||||
make -j$(nproc) check
|
make -j"$(nproc 2> /dev/null || sysctl -n hw.ncpu)" check
|
||||||
make install
|
make install
|
||||||
- name: Build ngtcp2
|
- name: Build ngtcp2
|
||||||
if: matrix.http3 == 'http3'
|
if: matrix.http3 == 'http3'
|
||||||
run: |
|
run: |
|
||||||
git clone https://github.com/ngtcp2/ngtcp2
|
git clone --depth 1 -b v0.12.0 https://github.com/ngtcp2/ngtcp2
|
||||||
cd ngtcp2
|
cd ngtcp2
|
||||||
autoreconf -i
|
autoreconf -i
|
||||||
./configure --prefix=$PWD/build --enable-lib-only PKG_CONFIG_PATH="../openssl/build/lib/pkgconfig"
|
./configure --prefix=$PWD/build --enable-lib-only PKG_CONFIG_PATH="../openssl/build/lib/pkgconfig" $EXTRA_NGTCP2_OPTS
|
||||||
make -j$(nproc) check
|
make -j"$(nproc 2> /dev/null || sysctl -n hw.ncpu)" check
|
||||||
make install
|
make install
|
||||||
- name: Setup extra environment variables for HTTP/3
|
- name: Setup extra environment variables for HTTP/3
|
||||||
if: matrix.http3 == 'http3'
|
if: matrix.http3 == 'http3'
|
||||||
|
@ -135,37 +169,123 @@ jobs:
|
||||||
PKG_CONFIG_PATH="$PWD/openssl/build/lib/pkgconfig:$PWD/nghttp3/build/lib/pkgconfig:$PWD/ngtcp2/build/lib/pkgconfig:$PWD/libbpf/build/lib64/pkgconfig:$PKG_CONFIG_PATH"
|
PKG_CONFIG_PATH="$PWD/openssl/build/lib/pkgconfig:$PWD/nghttp3/build/lib/pkgconfig:$PWD/ngtcp2/build/lib/pkgconfig:$PWD/libbpf/build/lib64/pkgconfig:$PKG_CONFIG_PATH"
|
||||||
LDFLAGS="$LDFLAGS -Wl,-rpath,$PWD/openssl/build/lib -Wl,-rpath,$PWD/libbpf/build/lib64"
|
LDFLAGS="$LDFLAGS -Wl,-rpath,$PWD/openssl/build/lib -Wl,-rpath,$PWD/libbpf/build/lib64"
|
||||||
EXTRA_AUTOTOOLS_OPTS="--enable-http3 $EXTRA_AUTOTOOLS_OPTS"
|
EXTRA_AUTOTOOLS_OPTS="--enable-http3 $EXTRA_AUTOTOOLS_OPTS"
|
||||||
|
EXTRA_CMAKE_OPTS="-DENABLE_HTTP3=1 $EXTRA_CMAKE_OPTS"
|
||||||
|
|
||||||
echo 'PKG_CONFIG_PATH='"$PKG_CONFIG_PATH" >> $GITHUB_ENV
|
echo 'PKG_CONFIG_PATH='"$PKG_CONFIG_PATH" >> $GITHUB_ENV
|
||||||
echo 'LDFLAGS='"$LDFLAGS" >> $GITHUB_ENV
|
echo 'LDFLAGS='"$LDFLAGS" >> $GITHUB_ENV
|
||||||
echo 'EXTRA_AUTOTOOLS_OPTS='"$EXTRA_AUTOTOOLS_OPTS" >> $GITHUB_ENV
|
echo 'EXTRA_AUTOTOOLS_OPTS='"$EXTRA_AUTOTOOLS_OPTS" >> $GITHUB_ENV
|
||||||
echo 'EXTRA_CMAKE_OPTS=-DENABLE_HTTP3=ON' >> $GITHUB_ENV
|
echo 'EXTRA_CMAKE_OPTS='"$EXTRA_CMAKE_OPTS" >> $GITHUB_ENV
|
||||||
- name: Setup git submodules
|
- name: Setup git submodules
|
||||||
run: |
|
run: |
|
||||||
git submodule update --init
|
git submodule update --init
|
||||||
- name: Configure autotools
|
- name: Configure autotools
|
||||||
if: matrix.buildtool == 'autotools'
|
|
||||||
run: |
|
run: |
|
||||||
autoreconf -i
|
autoreconf -i
|
||||||
./configure --enable-werror --with-mruby $EXTRA_AUTOTOOLS_OPTS
|
./configure
|
||||||
- name: Configure cmake
|
- name: Configure cmake (Linux)
|
||||||
if: matrix.buildtool == 'cmake'
|
if: matrix.buildtool == 'cmake' && runner.os == 'Linux'
|
||||||
run: |
|
run: |
|
||||||
cmake -DENABLE_WERROR=1 -DWITH_MRUBY=1 -DWITH_NEVERBLEED=1 $EXTRA_CMAKE_OPTS -DCPPFLAGS="$CPPFLAGS" -DLDFLAGS="$LDFLAGS" .
|
make dist
|
||||||
- name: Build nghttp2 with autotools
|
VERSION=$(grep PACKAGE_VERSION config.h | cut -d' ' -f3 | tr -d '"')
|
||||||
if: matrix.buildtool == 'autotools'
|
tar xf nghttp2-$VERSION.tar.gz
|
||||||
|
cd nghttp2-$VERSION
|
||||||
|
echo 'NGHTTP2_CMAKE_DIR='"$PWD" >> $GITHUB_ENV
|
||||||
|
|
||||||
|
cmake -DENABLE_WERROR=1 -DWITH_MRUBY=1 -DWITH_NEVERBLEED=1 -DENABLE_APP=1 $EXTRA_CMAKE_OPTS -DCPPFLAGS="$CPPFLAGS" -DLDFLAGS="$LDFLAGS" .
|
||||||
|
- name: Configure cmake (MacOS)
|
||||||
|
if: matrix.buildtool == 'cmake' && runner.os == 'macOS'
|
||||||
run: |
|
run: |
|
||||||
make distcheck \
|
make dist
|
||||||
DISTCHECK_CONFIGURE_FLAGS="--with-mruby --with-neverbleed --enable-werror $EXTRA_AUTOTOOLS_OPTS CPPFLAGS=\"$CPPFLAGS\" LDFLAGS=\"$LDFLAGS\""
|
VERSION=$(grep PACKAGE_VERSION config.h | cut -d' ' -f3 | tr -d '"')
|
||||||
|
tar xf nghttp2-$VERSION.tar.gz
|
||||||
|
cd nghttp2-$VERSION
|
||||||
|
echo 'NGHTTP2_CMAKE_DIR='"$PWD" >> $GITHUB_ENV
|
||||||
|
|
||||||
|
# This fixes infamous 'stdio.h not found' error.
|
||||||
|
echo 'SDKROOT='"$(xcrun --sdk macosx --show-sdk-path)" >> $GITHUB_ENV
|
||||||
|
|
||||||
|
cmake -DENABLE_WERROR=1 -DWITH_MRUBY=1 -DENABLE_APP=1 $EXTRA_CMAKE_OPTS -DCPPFLAGS="$CPPFLAGS" -DLDFLAGS="$LDFLAGS" .
|
||||||
|
- name: Build nghttp2 with autotools (Linux)
|
||||||
|
if: matrix.buildtool == 'autotools' && runner.os == 'Linux'
|
||||||
|
run: |
|
||||||
|
make -j"$(nproc)" distcheck \
|
||||||
|
DISTCHECK_CONFIGURE_FLAGS="--with-mruby --with-neverbleed --with-libev --enable-werror $EXTRA_AUTOTOOLS_OPTS CPPFLAGS=\"$CPPFLAGS\" LDFLAGS=\"$LDFLAGS\""
|
||||||
|
- name: Build nghttp2 with autotools (MacOS)
|
||||||
|
if: matrix.buildtool == 'autotools' && runner.os == 'macOS'
|
||||||
|
run: |
|
||||||
|
make -j"$(sysctl -n hw.ncpu)" distcheck \
|
||||||
|
DISTCHECK_CONFIGURE_FLAGS="--with-mruby --with-libev --enable-werror $EXTRA_AUTOTOOLS_OPTS CPPFLAGS=\"$CPPFLAGS\" LDFLAGS=\"$LDFLAGS\""
|
||||||
- name: Build nghttp2 with cmake
|
- name: Build nghttp2 with cmake
|
||||||
if: matrix.buildtool == 'cmake'
|
if: matrix.buildtool == 'cmake'
|
||||||
run: |
|
run: |
|
||||||
make
|
cd $NGHTTP2_CMAKE_DIR
|
||||||
make check
|
make -j"$(nproc 2> /dev/null || sysctl -n hw.ncpu)"
|
||||||
|
make -j"$(nproc 2> /dev/null || sysctl -n hw.ncpu)" check
|
||||||
- name: Integration test
|
- name: Integration test
|
||||||
# Integration tests for nghttpx; autotools erases build
|
# Integration tests for nghttpx; autotools erases build
|
||||||
# artifacts.
|
# artifacts.
|
||||||
if: matrix.buildtool == 'cmake'
|
if: matrix.buildtool == 'cmake'
|
||||||
run: |
|
run: |
|
||||||
cd integration-tests
|
cd $NGHTTP2_CMAKE_DIR/integration-tests
|
||||||
make itprep it
|
make itprep it
|
||||||
|
|
||||||
|
build-cross:
|
||||||
|
strategy:
|
||||||
|
matrix:
|
||||||
|
host: [x86_64-w64-mingw32, i686-w64-mingw32]
|
||||||
|
|
||||||
|
runs-on: ubuntu-22.04
|
||||||
|
|
||||||
|
env:
|
||||||
|
HOST: ${{ matrix.host }}
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v3
|
||||||
|
- name: Linux setup
|
||||||
|
run: |
|
||||||
|
sudo dpkg --add-architecture i386
|
||||||
|
sudo apt-get update
|
||||||
|
sudo apt-get install \
|
||||||
|
gcc-mingw-w64 \
|
||||||
|
autoconf \
|
||||||
|
automake \
|
||||||
|
autotools-dev \
|
||||||
|
libtool \
|
||||||
|
pkg-config \
|
||||||
|
wine
|
||||||
|
- name: Build CUnit
|
||||||
|
run: |
|
||||||
|
curl -LO https://jaist.dl.sourceforge.net/project/cunit/CUnit/2.1-3/CUnit-2.1-3.tar.bz2
|
||||||
|
tar xf CUnit-2.1-3.tar.bz2
|
||||||
|
cd CUnit-2.1-3
|
||||||
|
./bootstrap
|
||||||
|
./configure --disable-shared --host="$HOST" --prefix="$PWD/build"
|
||||||
|
make -j$(nproc) install
|
||||||
|
- name: Configure autotools
|
||||||
|
run: |
|
||||||
|
autoreconf -i && \
|
||||||
|
./configure --enable-werror --enable-lib-only --with-cunit \
|
||||||
|
--host="$HOST" PKG_CONFIG_PATH="$PWD/CUnit-2.1-3/build/lib/pkgconfig"
|
||||||
|
- name: Build nghttp2
|
||||||
|
run: |
|
||||||
|
make -j$(nproc)
|
||||||
|
make -j$(nproc) check TESTS=""
|
||||||
|
- name: Run tests
|
||||||
|
if: matrix.host == 'x86_64-w64-mingw32'
|
||||||
|
run: |
|
||||||
|
cd tests
|
||||||
|
wine main.exe
|
||||||
|
|
||||||
|
build-windows:
|
||||||
|
runs-on: windows-latest
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v3
|
||||||
|
- name: Configure cmake
|
||||||
|
run: |
|
||||||
|
mkdir build
|
||||||
|
cd build
|
||||||
|
cmake ..
|
||||||
|
- name: Build nghttp2
|
||||||
|
run: |
|
||||||
|
cmake --build build
|
||||||
|
|
|
@ -54,4 +54,6 @@ _VC_ROOT/
|
||||||
.depend.MSVC
|
.depend.MSVC
|
||||||
*.pyd
|
*.pyd
|
||||||
*.egg-info/
|
*.egg-info/
|
||||||
python/nghttp2.c
|
|
||||||
|
release
|
||||||
|
libnghttp2.lha
|
89
.travis.yml
89
.travis.yml
|
@ -1,89 +0,0 @@
|
||||||
dist: xenial
|
|
||||||
os:
|
|
||||||
- linux
|
|
||||||
compiler:
|
|
||||||
- clang
|
|
||||||
- gcc
|
|
||||||
env:
|
|
||||||
matrix:
|
|
||||||
- CI_BUILD=cmake
|
|
||||||
- CI_BUILD=autotools
|
|
||||||
matrix:
|
|
||||||
include:
|
|
||||||
- os: osx
|
|
||||||
compiler: clang
|
|
||||||
osx_image: xcode10.2
|
|
||||||
env: CI_BUILD=autotools
|
|
||||||
language: cpp
|
|
||||||
sudo: required
|
|
||||||
addons:
|
|
||||||
apt:
|
|
||||||
sources:
|
|
||||||
- ubuntu-toolchain-r-test
|
|
||||||
packages:
|
|
||||||
- g++-8
|
|
||||||
- autoconf
|
|
||||||
- automake
|
|
||||||
- autotools-dev
|
|
||||||
- libtool
|
|
||||||
- pkg-config
|
|
||||||
- zlib1g-dev
|
|
||||||
- libcunit1-dev
|
|
||||||
- libssl-dev
|
|
||||||
- libxml2-dev
|
|
||||||
- libev-dev
|
|
||||||
- libevent-dev
|
|
||||||
- libjansson-dev
|
|
||||||
- libjemalloc-dev
|
|
||||||
- libc-ares-dev
|
|
||||||
- cmake
|
|
||||||
- cmake-data
|
|
||||||
homebrew:
|
|
||||||
packages:
|
|
||||||
- libev
|
|
||||||
- libevent
|
|
||||||
- c-ares
|
|
||||||
- cunit
|
|
||||||
- libressl
|
|
||||||
before_install:
|
|
||||||
- $CC --version
|
|
||||||
- if [ "$CXX" = "g++" ]; then export CXX="g++-8" CC="gcc-8"; fi
|
|
||||||
- $CC --version
|
|
||||||
- go version
|
|
||||||
- cmake --version
|
|
||||||
before_script:
|
|
||||||
- |
|
|
||||||
if [ "$TRAVIS_OS_NAME" = "linux" ]; then
|
|
||||||
CPPFLAGS="-fsanitize=address" LDFLAGS="-fsanitize=address -fuse-ld=gold"
|
|
||||||
fi
|
|
||||||
- |
|
|
||||||
if [ "$TRAVIS_OS_NAME" = "osx" ]; then
|
|
||||||
PKG_CONFIG_PATH="/usr/local/opt/libressl/lib/pkgconfig:/usr/local/opt/libxml2/lib/pkgconfig"
|
|
||||||
fi
|
|
||||||
# Now build nghttp2
|
|
||||||
- git submodule update --init
|
|
||||||
- |
|
|
||||||
if [ "$CI_BUILD" = "autotools" ]; then
|
|
||||||
autoreconf -i && ./configure --with-mruby PKG_CONFIG_PATH=$PKG_CONFIG_PATH
|
|
||||||
fi
|
|
||||||
- |
|
|
||||||
if [ "$CI_BUILD" = "cmake" ]; then
|
|
||||||
cmake -DENABLE_WERROR=1 -DWITH_MRUBY=1 -DWITH_NEVERBLEED=1
|
|
||||||
fi
|
|
||||||
script:
|
|
||||||
- |
|
|
||||||
if [ "$CI_BUILD" = "autotools" ]; then
|
|
||||||
make distcheck DISTCHECK_CONFIGURE_FLAGS="--with-mruby --with-neverbleed --enable-werror CPPFLAGS=$CPPFLAGS LDFLAGS=\"$LDFLAGS\" PKG_CONFIG_PATH=$PKG_CONFIG_PATH"
|
|
||||||
fi
|
|
||||||
- |
|
|
||||||
if [ "$CI_BUILD" = "cmake" ]; then
|
|
||||||
make && make check
|
|
||||||
fi
|
|
||||||
- |
|
|
||||||
if [ "$CI_BUILD" = "cmake" ]; then
|
|
||||||
# Integration tests for nghttpx; autotools build erases build
|
|
||||||
# for packaging test.
|
|
||||||
cd integration-tests
|
|
||||||
export GO111MODULE=on
|
|
||||||
make it
|
|
||||||
fi
|
|
10
AUTHORS
10
AUTHORS
|
@ -40,7 +40,9 @@ Daniel Evers
|
||||||
Daniel Stenberg
|
Daniel Stenberg
|
||||||
Dave Reisner
|
Dave Reisner
|
||||||
David Beitey
|
David Beitey
|
||||||
|
David Korczynski
|
||||||
David Weekly
|
David Weekly
|
||||||
|
Dimitris Apostolou
|
||||||
Dmitri Tikhonov
|
Dmitri Tikhonov
|
||||||
Dmitriy Vetutnev
|
Dmitriy Vetutnev
|
||||||
Don
|
Don
|
||||||
|
@ -80,6 +82,7 @@ Lorenz Nickel
|
||||||
Lucas Pardue
|
Lucas Pardue
|
||||||
MATSUMOTO Ryosuke
|
MATSUMOTO Ryosuke
|
||||||
Marc Bachmann
|
Marc Bachmann
|
||||||
|
Marcelo Trylesinski
|
||||||
Matt Rudary
|
Matt Rudary
|
||||||
Matt Way
|
Matt Way
|
||||||
Michael Kaufmann
|
Michael Kaufmann
|
||||||
|
@ -88,18 +91,24 @@ Mike Frysinger
|
||||||
Mike Lothian
|
Mike Lothian
|
||||||
Nicholas Hurley
|
Nicholas Hurley
|
||||||
Nora Shoemaker
|
Nora Shoemaker
|
||||||
|
Paweł Wegner
|
||||||
Pedro Santos
|
Pedro Santos
|
||||||
Peeyush Aggarwal
|
Peeyush Aggarwal
|
||||||
Peter Wu
|
Peter Wu
|
||||||
Piotr Sikora
|
Piotr Sikora
|
||||||
|
PufferOverflow
|
||||||
Raul Gutierrez Segales
|
Raul Gutierrez Segales
|
||||||
Remo E
|
Remo E
|
||||||
|
Renaud
|
||||||
Reza Tavakoli
|
Reza Tavakoli
|
||||||
Richard Wolfert
|
Richard Wolfert
|
||||||
Rick Lei
|
Rick Lei
|
||||||
Ross Smith II
|
Ross Smith II
|
||||||
|
Rudi Heitbaum
|
||||||
|
Ryo Ota
|
||||||
Scott Mitchell
|
Scott Mitchell
|
||||||
Sebastiaan Deckers
|
Sebastiaan Deckers
|
||||||
|
Shelley Vohr
|
||||||
Simon Frankenberger
|
Simon Frankenberger
|
||||||
Simone Basso
|
Simone Basso
|
||||||
Soham Sinha
|
Soham Sinha
|
||||||
|
@ -139,5 +148,6 @@ lstefani
|
||||||
makovich
|
makovich
|
||||||
mod-h2-dev
|
mod-h2-dev
|
||||||
moparisthebest
|
moparisthebest
|
||||||
|
robaho
|
||||||
snnn
|
snnn
|
||||||
yuuki-kodama
|
yuuki-kodama
|
||||||
|
|
|
@ -24,13 +24,13 @@
|
||||||
|
|
||||||
cmake_minimum_required(VERSION 3.0)
|
cmake_minimum_required(VERSION 3.0)
|
||||||
# XXX using 1.8.90 instead of 1.9.0-DEV
|
# XXX using 1.8.90 instead of 1.9.0-DEV
|
||||||
project(nghttp2 VERSION 1.45.0)
|
project(nghttp2 VERSION 1.51.90)
|
||||||
|
|
||||||
# See versioning rule:
|
# See versioning rule:
|
||||||
# http://www.gnu.org/software/libtool/manual/html_node/Updating-version-info.html
|
# https://www.gnu.org/software/libtool/manual/html_node/Updating-version-info.html
|
||||||
set(LT_CURRENT 35)
|
set(LT_CURRENT 38)
|
||||||
set(LT_REVISION 0)
|
set(LT_REVISION 1)
|
||||||
set(LT_AGE 21)
|
set(LT_AGE 24)
|
||||||
|
|
||||||
set(CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake" ${CMAKE_MODULE_PATH})
|
set(CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake" ${CMAKE_MODULE_PATH})
|
||||||
include(Version)
|
include(Version)
|
||||||
|
@ -52,9 +52,8 @@ endif()
|
||||||
|
|
||||||
include(GNUInstallDirs)
|
include(GNUInstallDirs)
|
||||||
|
|
||||||
# For Python bindings and documentation
|
# For documentation
|
||||||
# (Must be called before PythonLibs for matching versions.)
|
find_package(Python3 COMPONENTS Interpreter)
|
||||||
find_package(PythonInterp)
|
|
||||||
|
|
||||||
# Auto-detection of features that can be toggled
|
# Auto-detection of features that can be toggled
|
||||||
find_package(OpenSSL 1.0.1)
|
find_package(OpenSSL 1.0.1)
|
||||||
|
@ -63,8 +62,16 @@ find_package(Libcares 1.7.5)
|
||||||
find_package(ZLIB 1.2.3)
|
find_package(ZLIB 1.2.3)
|
||||||
find_package(Libngtcp2 0.0.0)
|
find_package(Libngtcp2 0.0.0)
|
||||||
find_package(Libngtcp2_crypto_openssl 0.0.0)
|
find_package(Libngtcp2_crypto_openssl 0.0.0)
|
||||||
|
if(LIBNGTCP2_CRYPTO_OPENSSL_FOUND)
|
||||||
|
set(HAVE_LIBNGTCP2_CRYPTO_OPENSSL 1)
|
||||||
|
endif()
|
||||||
find_package(Libnghttp3 0.0.0)
|
find_package(Libnghttp3 0.0.0)
|
||||||
find_package(Libbpf 0.4.0)
|
if(WITH_LIBBPF)
|
||||||
|
find_package(Libbpf 0.4.0)
|
||||||
|
if(NOT LIBBPF_FOUND)
|
||||||
|
message(FATAL_ERROR "libbpf was requested (WITH_LIBBPF=1) but not found.")
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
if(OPENSSL_FOUND AND LIBEV_FOUND AND ZLIB_FOUND)
|
if(OPENSSL_FOUND AND LIBEV_FOUND AND ZLIB_FOUND)
|
||||||
set(ENABLE_APP_DEFAULT ON)
|
set(ENABLE_APP_DEFAULT ON)
|
||||||
else()
|
else()
|
||||||
|
@ -74,15 +81,8 @@ find_package(Systemd 209)
|
||||||
find_package(Jansson 2.5)
|
find_package(Jansson 2.5)
|
||||||
set(ENABLE_HPACK_TOOLS_DEFAULT ${JANSSON_FOUND})
|
set(ENABLE_HPACK_TOOLS_DEFAULT ${JANSSON_FOUND})
|
||||||
# 2.0.8 is required because we use evconnlistener_set_error_cb()
|
# 2.0.8 is required because we use evconnlistener_set_error_cb()
|
||||||
find_package(Libevent 2.0.8 COMPONENTS libevent openssl)
|
find_package(Libevent 2.0.8 COMPONENTS core extra openssl)
|
||||||
set(ENABLE_EXAMPLES_DEFAULT ${LIBEVENT_OPENSSL_FOUND})
|
set(ENABLE_EXAMPLES_DEFAULT ${LIBEVENT_OPENSSL_FOUND})
|
||||||
find_package(Cython)
|
|
||||||
find_package(PythonLibs)
|
|
||||||
if(CYTHON_FOUND AND PYTHONLIBS_FOUND)
|
|
||||||
set(ENABLE_PYTHON_BINDINGS_DEFAULT ON)
|
|
||||||
else()
|
|
||||||
set(ENABLE_PYTHON_BINDINGS_DEFAULT OFF)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
find_package(LibXml2 2.6.26)
|
find_package(LibXml2 2.6.26)
|
||||||
set(WITH_LIBXML2_DEFAULT ${LIBXML2_FOUND})
|
set(WITH_LIBXML2_DEFAULT ${LIBXML2_FOUND})
|
||||||
|
@ -91,8 +91,7 @@ set(WITH_JEMALLOC_DEFAULT ${JEMALLOC_FOUND})
|
||||||
|
|
||||||
include(CMakeOptions.txt)
|
include(CMakeOptions.txt)
|
||||||
|
|
||||||
if(ENABLE_LIB_ONLY AND (ENABLE_APP OR ENABLE_HPACK_TOOLS OR ENABLE_EXAMPLES OR
|
if(ENABLE_LIB_ONLY AND (ENABLE_APP OR ENABLE_HPACK_TOOLS OR ENABLE_EXAMPLES))
|
||||||
ENABLE_PYTHON_BINDINGS))
|
|
||||||
# Remember when disabled options are disabled for later diagnostics.
|
# Remember when disabled options are disabled for later diagnostics.
|
||||||
set(ENABLE_LIB_ONLY_DISABLED_OTHERS 1)
|
set(ENABLE_LIB_ONLY_DISABLED_OTHERS 1)
|
||||||
else()
|
else()
|
||||||
|
@ -102,7 +101,6 @@ if(ENABLE_LIB_ONLY)
|
||||||
set(ENABLE_APP OFF)
|
set(ENABLE_APP OFF)
|
||||||
set(ENABLE_HPACK_TOOLS OFF)
|
set(ENABLE_HPACK_TOOLS OFF)
|
||||||
set(ENABLE_EXAMPLES OFF)
|
set(ENABLE_EXAMPLES OFF)
|
||||||
set(ENABLE_PYTHON_BINDINGS OFF)
|
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
# Do not disable assertions based on CMAKE_BUILD_TYPE.
|
# Do not disable assertions based on CMAKE_BUILD_TYPE.
|
||||||
|
@ -148,20 +146,6 @@ cmake_pop_check_state()
|
||||||
# Additional libraries required for programs under src directory.
|
# Additional libraries required for programs under src directory.
|
||||||
set(APP_LIBRARIES)
|
set(APP_LIBRARIES)
|
||||||
|
|
||||||
if(ENABLE_PYTHON_BINDINGS)
|
|
||||||
if(NOT (CYTHON_FOUND AND PYTHONLIBS_FOUND))
|
|
||||||
message(FATAL_ERROR "python bindings were requested "
|
|
||||||
"(ENABLE_PYTHON_BINDINGS=1) but dependencies are not met.")
|
|
||||||
endif()
|
|
||||||
if(NOT PYTHON_VERSION_STRING STREQUAL PYTHONLIBS_VERSION_STRING)
|
|
||||||
message(FATAL_ERROR
|
|
||||||
"Python executable and library must have the same version!"
|
|
||||||
" Found Python ${PYTHON_VERSION_STRING} and"
|
|
||||||
" PythonLibs ${PYTHONLIBS_VERSION_STRING}"
|
|
||||||
)
|
|
||||||
endif()
|
|
||||||
endif()
|
|
||||||
|
|
||||||
set(CMAKE_THREAD_PREFER_PTHREAD 1)
|
set(CMAKE_THREAD_PREFER_PTHREAD 1)
|
||||||
find_package(Threads)
|
find_package(Threads)
|
||||||
if(CMAKE_USE_PTHREADS_INIT)
|
if(CMAKE_USE_PTHREADS_INIT)
|
||||||
|
@ -171,7 +155,7 @@ endif()
|
||||||
# case "$host" in
|
# case "$host" in
|
||||||
# *android*)
|
# *android*)
|
||||||
# android_build=yes
|
# android_build=yes
|
||||||
# # android does not need -pthread, but needs followng 3 libs for C++
|
# # android does not need -pthread, but needs following 3 libs for C++
|
||||||
# APPLDFLAGS="$APPLDFLAGS -lstdc++ -latomic -lsupc++"
|
# APPLDFLAGS="$APPLDFLAGS -lstdc++ -latomic -lsupc++"
|
||||||
|
|
||||||
# dl: openssl requires libdl when it is statically linked.
|
# dl: openssl requires libdl when it is statically linked.
|
||||||
|
@ -193,9 +177,12 @@ if(OPENSSL_FOUND)
|
||||||
cmake_push_check_state()
|
cmake_push_check_state()
|
||||||
set(CMAKE_REQUIRED_INCLUDES "${OPENSSL_INCLUDE_DIR}")
|
set(CMAKE_REQUIRED_INCLUDES "${OPENSSL_INCLUDE_DIR}")
|
||||||
set(CMAKE_REQUIRED_LIBRARIES "${OPENSSL_LIBRARIES}")
|
set(CMAKE_REQUIRED_LIBRARIES "${OPENSSL_LIBRARIES}")
|
||||||
|
if(WIN32)
|
||||||
|
set(CMAKE_REQUIRED_LIBRARIES "${CMAKE_REQUIRED_LIBRARIES}" "ws2_32" "bcrypt")
|
||||||
|
endif()
|
||||||
check_symbol_exists(SSL_is_quic "openssl/ssl.h" HAVE_SSL_IS_QUIC)
|
check_symbol_exists(SSL_is_quic "openssl/ssl.h" HAVE_SSL_IS_QUIC)
|
||||||
if(NOT HAVE_SSL_IS_QUIC)
|
if(NOT HAVE_SSL_IS_QUIC)
|
||||||
message(WARNING "OpenSSL in ${OPENSSL_LIBRARIES} dose not have SSL_is_quic. HTTP/3 support cannot be enabled")
|
message(WARNING "OpenSSL in ${OPENSSL_LIBRARIES} does not have SSL_is_quic. HTTP/3 support cannot be enabled")
|
||||||
endif()
|
endif()
|
||||||
cmake_pop_check_state()
|
cmake_pop_check_state()
|
||||||
else()
|
else()
|
||||||
|
@ -232,10 +219,6 @@ endif()
|
||||||
# jemalloc
|
# jemalloc
|
||||||
set(HAVE_JEMALLOC ${JEMALLOC_FOUND})
|
set(HAVE_JEMALLOC ${JEMALLOC_FOUND})
|
||||||
|
|
||||||
if(ENABLE_ASIO_LIB)
|
|
||||||
find_package(Boost 1.54.0 REQUIRED system thread)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# libbpf (for bpf)
|
# libbpf (for bpf)
|
||||||
set(HAVE_LIBBPF ${LIBBPF_FOUND})
|
set(HAVE_LIBBPF ${LIBBPF_FOUND})
|
||||||
if(LIBBPF_FOUND)
|
if(LIBBPF_FOUND)
|
||||||
|
@ -266,13 +249,13 @@ if(ENABLE_HPACK_TOOLS AND NOT HAVE_JANSSON)
|
||||||
message(FATAL_ERROR "HPACK tools were requested (ENABLE_HPACK_TOOLS=1) but dependencies are not met.")
|
message(FATAL_ERROR "HPACK tools were requested (ENABLE_HPACK_TOOLS=1) but dependencies are not met.")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
# C++ library libnghttp2_asio
|
# examples
|
||||||
if(ENABLE_EXAMPLES AND NOT (OPENSSL_FOUND AND LIBEVENT_OPENSSL_FOUND))
|
if(ENABLE_EXAMPLES AND NOT (OPENSSL_FOUND AND LIBEVENT_OPENSSL_FOUND))
|
||||||
message(FATAL_ERROR "examples were requested (ENABLE_EXAMPLES=1) but dependencies are not met.")
|
message(FATAL_ERROR "examples were requested (ENABLE_EXAMPLES=1) but dependencies are not met.")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
# third-party http-parser only be built when needed
|
# third-party http-parser only be built when needed
|
||||||
if(ENABLE_EXAMPLES OR ENABLE_APP OR ENABLE_HPACK_TOOLS OR ENABLE_ASIO_LIB)
|
if(ENABLE_EXAMPLES OR ENABLE_APP OR ENABLE_HPACK_TOOLS)
|
||||||
set(ENABLE_THIRD_PARTY 1)
|
set(ENABLE_THIRD_PARTY 1)
|
||||||
# mruby (for src/nghttpx)
|
# mruby (for src/nghttpx)
|
||||||
set(HAVE_MRUBY ${WITH_MRUBY})
|
set(HAVE_MRUBY ${WITH_MRUBY})
|
||||||
|
@ -456,8 +439,6 @@ set(sbindir "${CMAKE_INSTALL_FULL_SBINDIR}")
|
||||||
foreach(name
|
foreach(name
|
||||||
lib/libnghttp2.pc
|
lib/libnghttp2.pc
|
||||||
lib/includes/nghttp2/nghttp2ver.h
|
lib/includes/nghttp2/nghttp2ver.h
|
||||||
src/libnghttp2_asio.pc
|
|
||||||
python/setup.py
|
|
||||||
integration-tests/config.go
|
integration-tests/config.go
|
||||||
integration-tests/setenv
|
integration-tests/setenv
|
||||||
doc/conf.py
|
doc/conf.py
|
||||||
|
@ -468,14 +449,9 @@ foreach(name
|
||||||
doc/tutorial-hpack.rst
|
doc/tutorial-hpack.rst
|
||||||
doc/nghttpx-howto.rst
|
doc/nghttpx-howto.rst
|
||||||
doc/h2load-howto.rst
|
doc/h2load-howto.rst
|
||||||
doc/libnghttp2_asio.rst
|
|
||||||
doc/python-apiref.rst
|
|
||||||
doc/building-android-binary.rst
|
doc/building-android-binary.rst
|
||||||
doc/nghttp2.h.rst
|
doc/nghttp2.h.rst
|
||||||
doc/nghttp2ver.h.rst
|
doc/nghttp2ver.h.rst
|
||||||
doc/asio_http2.h.rst
|
|
||||||
doc/asio_http2_server.h.rst
|
|
||||||
doc/asio_http2_client.h.rst
|
|
||||||
doc/contribute.rst
|
doc/contribute.rst
|
||||||
)
|
)
|
||||||
configure_file("${name}.in" "${name}" @ONLY)
|
configure_file("${name}.in" "${name}" @ONLY)
|
||||||
|
@ -498,13 +474,13 @@ add_subdirectory(lib)
|
||||||
#add_subdirectory(lib/includes)
|
#add_subdirectory(lib/includes)
|
||||||
add_subdirectory(third-party)
|
add_subdirectory(third-party)
|
||||||
add_subdirectory(src)
|
add_subdirectory(src)
|
||||||
#add_subdirectory(src/includes)
|
|
||||||
add_subdirectory(examples)
|
add_subdirectory(examples)
|
||||||
add_subdirectory(python)
|
|
||||||
add_subdirectory(tests)
|
add_subdirectory(tests)
|
||||||
#add_subdirectory(tests/testdata)
|
#add_subdirectory(tests/testdata)
|
||||||
add_subdirectory(integration-tests)
|
add_subdirectory(integration-tests)
|
||||||
add_subdirectory(doc)
|
if(ENABLE_DOC)
|
||||||
|
add_subdirectory(doc)
|
||||||
|
endif()
|
||||||
add_subdirectory(contrib)
|
add_subdirectory(contrib)
|
||||||
add_subdirectory(script)
|
add_subdirectory(script)
|
||||||
add_subdirectory(bpf)
|
add_subdirectory(bpf)
|
||||||
|
@ -526,10 +502,8 @@ message(STATUS "summary of build options:
|
||||||
WARNCFLAGS: ${WARNCFLAGS}
|
WARNCFLAGS: ${WARNCFLAGS}
|
||||||
CXX1XCXXFLAGS: ${CXX1XCXXFLAGS}
|
CXX1XCXXFLAGS: ${CXX1XCXXFLAGS}
|
||||||
Python:
|
Python:
|
||||||
Python: ${PYTHON_EXECUTABLE}
|
Python: ${Python3_EXECUTABLE}
|
||||||
PYTHON_VERSION: ${PYTHON_VERSION_STRING}
|
Python3_VERSION: ${Python3_VERSION}
|
||||||
Library version:${PYTHONLIBS_VERSION_STRING}
|
|
||||||
Cython: ${CYTHON_EXECUTABLE}
|
|
||||||
Test:
|
Test:
|
||||||
CUnit: ${HAVE_CUNIT} (LIBS='${CUNIT_LIBRARIES}')
|
CUnit: ${HAVE_CUNIT} (LIBS='${CUNIT_LIBRARIES}')
|
||||||
Failmalloc: ${ENABLE_FAILMALLOC}
|
Failmalloc: ${ENABLE_FAILMALLOC}
|
||||||
|
@ -547,8 +521,6 @@ message(STATUS "summary of build options:
|
||||||
Jemalloc: ${HAVE_JEMALLOC} (LIBS='${JEMALLOC_LIBRARIES}')
|
Jemalloc: ${HAVE_JEMALLOC} (LIBS='${JEMALLOC_LIBRARIES}')
|
||||||
Zlib: ${HAVE_ZLIB} (LIBS='${ZLIB_LIBRARIES}')
|
Zlib: ${HAVE_ZLIB} (LIBS='${ZLIB_LIBRARIES}')
|
||||||
Systemd: ${HAVE_SYSTEMD} (LIBS='${SYSTEMD_LIBRARIES}')
|
Systemd: ${HAVE_SYSTEMD} (LIBS='${SYSTEMD_LIBRARIES}')
|
||||||
Boost::System: ${Boost_SYSTEM_LIBRARY}
|
|
||||||
Boost::Thread: ${Boost_THREAD_LIBRARY}
|
|
||||||
Third-party:
|
Third-party:
|
||||||
http-parser: ${ENABLE_THIRD_PARTY}
|
http-parser: ${ENABLE_THIRD_PARTY}
|
||||||
MRuby: ${HAVE_MRUBY}
|
MRuby: ${HAVE_MRUBY}
|
||||||
|
@ -556,9 +528,7 @@ message(STATUS "summary of build options:
|
||||||
Features:
|
Features:
|
||||||
Applications: ${ENABLE_APP}
|
Applications: ${ENABLE_APP}
|
||||||
HPACK tools: ${ENABLE_HPACK_TOOLS}
|
HPACK tools: ${ENABLE_HPACK_TOOLS}
|
||||||
Libnghttp2_asio:${ENABLE_ASIO_LIB}
|
|
||||||
Examples: ${ENABLE_EXAMPLES}
|
Examples: ${ENABLE_EXAMPLES}
|
||||||
Python bindings:${ENABLE_PYTHON_BINDINGS}
|
|
||||||
Threading: ${ENABLE_THREADS}
|
Threading: ${ENABLE_THREADS}
|
||||||
HTTP/3(EXPERIMENTAL): ${ENABLE_HTTP3}
|
HTTP/3(EXPERIMENTAL): ${ENABLE_HTTP3}
|
||||||
")
|
")
|
||||||
|
|
|
@ -7,25 +7,22 @@ option(ENABLE_APP "Build applications (nghttp, nghttpd, nghttpx and h2load
|
||||||
${ENABLE_APP_DEFAULT})
|
${ENABLE_APP_DEFAULT})
|
||||||
option(ENABLE_HPACK_TOOLS "Build HPACK tools"
|
option(ENABLE_HPACK_TOOLS "Build HPACK tools"
|
||||||
${ENABLE_HPACK_TOOLS_DEFAULT})
|
${ENABLE_HPACK_TOOLS_DEFAULT})
|
||||||
option(ENABLE_ASIO_LIB "Build C++ libnghttp2_asio library")
|
|
||||||
option(ENABLE_EXAMPLES "Build examples"
|
option(ENABLE_EXAMPLES "Build examples"
|
||||||
${ENABLE_EXAMPLES_DEFAULT})
|
${ENABLE_EXAMPLES_DEFAULT})
|
||||||
option(ENABLE_PYTHON_BINDINGS "Build Python bindings"
|
|
||||||
${ENABLE_PYTHON_BINDINGS_DEFAULT})
|
|
||||||
option(ENABLE_FAILMALLOC "Build failmalloc test program" ON)
|
option(ENABLE_FAILMALLOC "Build failmalloc test program" ON)
|
||||||
option(ENABLE_LIB_ONLY "Build libnghttp2 only. This is a short hand for -DENABLE_APP=0 -DENABLE_EXAMPLES=0 -DENABLE_HPACK_TOOLS=0 -DENABLE_PYTHON_BINDINGS=0")
|
option(ENABLE_LIB_ONLY "Build libnghttp2 only. This is a short hand for -DENABLE_APP=0 -DENABLE_EXAMPLES=0 -DENABLE_HPACK_TOOLS=0")
|
||||||
option(ENABLE_STATIC_LIB "Build libnghttp2 in static mode also")
|
option(ENABLE_STATIC_LIB "Build libnghttp2 in static mode also")
|
||||||
option(ENABLE_SHARED_LIB "Build libnghttp2 as a shared library" ON)
|
option(ENABLE_SHARED_LIB "Build libnghttp2 as a shared library" ON)
|
||||||
option(ENABLE_STATIC_CRT "Build libnghttp2 against the MS LIBCMT[d]")
|
option(ENABLE_STATIC_CRT "Build libnghttp2 against the MS LIBCMT[d]")
|
||||||
option(ENABLE_HTTP3 "Enable HTTP/3 support" OFF)
|
option(ENABLE_HTTP3 "Enable HTTP/3 support" OFF)
|
||||||
|
option(ENABLE_DOC "Build documentation" ON)
|
||||||
|
|
||||||
option(WITH_LIBXML2 "Use libxml2"
|
option(WITH_LIBXML2 "Use libxml2"
|
||||||
${WITH_LIBXML2_DEFAULT})
|
${WITH_LIBXML2_DEFAULT})
|
||||||
option(WITH_JEMALLOC "Use jemalloc"
|
option(WITH_JEMALLOC "Use jemalloc"
|
||||||
${WITH_JEMALLOC_DEFAULT})
|
${WITH_JEMALLOC_DEFAULT})
|
||||||
option(WITH_SPDYLAY "Use spdylay"
|
|
||||||
${WITH_SPDYLAY_DEFAULT})
|
|
||||||
option(WITH_MRUBY "Use mruby")
|
option(WITH_MRUBY "Use mruby")
|
||||||
option(WITH_NEVERBLEED "Use neverbleed")
|
option(WITH_NEVERBLEED "Use neverbleed")
|
||||||
|
option(WITH_LIBBPF "Use libbpf")
|
||||||
|
|
||||||
# vim: ft=cmake:
|
# vim: ft=cmake:
|
||||||
|
|
|
@ -12,59 +12,41 @@
|
||||||
|
|
||||||
|
|
||||||
# Only use standalone-toolchain for reduce size
|
# Only use standalone-toolchain for reduce size
|
||||||
FROM ubuntu:xenial
|
FROM ubuntu:22.04
|
||||||
MAINTAINER Tatsuhiro Tsujikawa
|
MAINTAINER Tatsuhiro Tsujikawa
|
||||||
ENV ANDROID_HOME /root
|
|
||||||
ENV TOOLCHAIN $ANDROID_HOME/toolchain
|
|
||||||
ENV PATH $TOOLCHAIN/bin:$PATH
|
|
||||||
|
|
||||||
ENV NDK_VERSION r14b
|
ENV NDK_VERSION r25b
|
||||||
|
ENV NDK /root/android-ndk-$NDK_VERSION
|
||||||
|
ENV TOOLCHAIN $NDK/toolchains/llvm/prebuilt/linux-x86_64
|
||||||
|
ENV TARGET aarch64-linux-android
|
||||||
|
ENV API 33
|
||||||
|
ENV AR $TOOLCHAIN/bin/llvm-ar
|
||||||
|
ENV CC $TOOLCHAIN/bin/$TARGET$API-clang
|
||||||
|
ENV CXX $TOOLCHAIN/bin/$TARGET$API-clang++
|
||||||
|
ENV LD $TOOLCHAIN/bin/ld
|
||||||
|
ENV RANDLIB $TOOLCHAIN/bin/llvm-ranlib
|
||||||
|
ENV STRIP $TOOLCHAIN/bin/llvm-strip
|
||||||
|
ENV PREFIX /root/usr/local
|
||||||
|
|
||||||
WORKDIR /root
|
WORKDIR /root
|
||||||
RUN apt-get update && \
|
RUN apt-get update && \
|
||||||
apt-get install -y unzip make binutils autoconf \
|
apt-get install -y unzip make binutils autoconf \
|
||||||
automake autotools-dev libtool pkg-config git \
|
automake autotools-dev libtool pkg-config git \
|
||||||
curl dpkg-dev libxml2-dev genisoimage libc6-i386 \
|
curl dpkg-dev libxml2-dev genisoimage libc6-i386 \
|
||||||
lib32stdc++6 python&& \
|
lib32stdc++6 && \
|
||||||
rm -rf /var/cache/apk/*
|
rm -rf /var/cache/apt/*
|
||||||
|
|
||||||
# Install toolchain
|
# Download NDK
|
||||||
RUN curl -L -O https://dl.google.com/android/repository/android-ndk-$NDK_VERSION-linux-x86_64.zip && \
|
RUN curl -L -O https://dl.google.com/android/repository/android-ndk-$NDK_VERSION-linux.zip && \
|
||||||
unzip -q android-ndk-$NDK_VERSION-linux-x86_64.zip && \
|
unzip -q android-ndk-$NDK_VERSION-linux.zip && \
|
||||||
rm android-ndk-$NDK_VERSION-linux-x86_64.zip && \
|
rm android-ndk-$NDK_VERSION-linux.zip
|
||||||
mkdir -p $ANDROID_HOME/toolchain && \
|
|
||||||
$ANDROID_HOME/android-ndk-$NDK_VERSION/build/tools/make-standalone-toolchain.sh \
|
|
||||||
--install-dir=$ANDROID_HOME/toolchain \
|
|
||||||
--toolchain=arm-linux-androideabi-4.9 \
|
|
||||||
--force && \
|
|
||||||
rm -r android-ndk-$NDK_VERSION
|
|
||||||
|
|
||||||
ENV PREFIX /root/usr/local
|
|
||||||
|
|
||||||
# Setup version of libraries
|
# Setup version of libraries
|
||||||
ENV OPENSSL_VERSION 1.0.2d
|
ENV OPENSSL_VERSION 1.1.1q
|
||||||
ENV SPDYLAY_VERSION v1.4.0
|
ENV LIBEV_VERSION 4.33
|
||||||
ENV LIBEV_VERSION 4.19
|
ENV ZLIB_VERSION 1.2.13
|
||||||
ENV ZLIB_VERSION 1.2.8
|
ENV CARES_VERSION 1.18.1
|
||||||
ENV CARES_VERSION 1.13.0
|
ENV NGHTTP2_VERSION master
|
||||||
ENV NGHTTP2_VERSION v1.24.0
|
|
||||||
|
|
||||||
WORKDIR /root/build
|
|
||||||
RUN git clone https://github.com/tatsuhiro-t/spdylay -b $SPDYLAY_VERSION --depth 1
|
|
||||||
WORKDIR /root/build/spdylay
|
|
||||||
RUN autoreconf -i && \
|
|
||||||
./configure \
|
|
||||||
--disable-shared \
|
|
||||||
--host=arm-linux-androideabi \
|
|
||||||
--build=`dpkg-architecture -qDEB_BUILD_GNU_TYPE` \
|
|
||||||
--prefix=$PREFIX \
|
|
||||||
--without-libxml2 \
|
|
||||||
--disable-src \
|
|
||||||
--disable-examples \
|
|
||||||
CPPFLAGS="-I$PREFIX/include" \
|
|
||||||
PKG_CONFIG_LIBDIR="$PREFIX/lib/pkgconfig" \
|
|
||||||
LDFLAGS="-L$PREFIX/lib" && \
|
|
||||||
make install
|
|
||||||
|
|
||||||
WORKDIR /root/build
|
WORKDIR /root/build
|
||||||
RUN curl -L -O https://www.openssl.org/source/openssl-$OPENSSL_VERSION.tar.gz && \
|
RUN curl -L -O https://www.openssl.org/source/openssl-$OPENSSL_VERSION.tar.gz && \
|
||||||
|
@ -72,20 +54,18 @@ RUN curl -L -O https://www.openssl.org/source/openssl-$OPENSSL_VERSION.tar.gz &&
|
||||||
rm openssl-$OPENSSL_VERSION.tar.gz
|
rm openssl-$OPENSSL_VERSION.tar.gz
|
||||||
|
|
||||||
WORKDIR /root/build/openssl-$OPENSSL_VERSION
|
WORKDIR /root/build/openssl-$OPENSSL_VERSION
|
||||||
RUN export CROSS_COMPILE=$TOOLCHAIN/bin/arm-linux-androideabi- && \
|
RUN export ANDROID_NDK_HOME=$NDK PATH=$TOOLCHAIN/bin:$PATH && \
|
||||||
./Configure --prefix=$PREFIX android && \
|
./Configure no-shared --prefix=$PREFIX android-arm64 && \
|
||||||
make && make install_sw
|
make && make install_sw
|
||||||
|
|
||||||
WORKDIR /root/build
|
WORKDIR /root/build
|
||||||
RUN curl -L -O http://dist.schmorp.de/libev/Attic/libev-$LIBEV_VERSION.tar.gz && \
|
RUN curl -L -O http://dist.schmorp.de/libev/Attic/libev-$LIBEV_VERSION.tar.gz && \
|
||||||
curl -L -O https://gist.github.com/tatsuhiro-t/48c45f08950f587180ed/raw/80a8f003b5d1091eae497c5995bbaa68096e739b/libev-4.19-android.patch && \
|
|
||||||
tar xf libev-$LIBEV_VERSION.tar.gz && \
|
tar xf libev-$LIBEV_VERSION.tar.gz && \
|
||||||
rm libev-$LIBEV_VERSION.tar.gz
|
rm libev-$LIBEV_VERSION.tar.gz
|
||||||
|
|
||||||
WORKDIR /root/build/libev-$LIBEV_VERSION
|
WORKDIR /root/build/libev-$LIBEV_VERSION
|
||||||
RUN patch -p1 < ../libev-4.19-android.patch && \
|
RUN ./configure \
|
||||||
./configure \
|
--host=$TARGET \
|
||||||
--host=arm-linux-androideabi \
|
|
||||||
--build=`dpkg-architecture -qDEB_BUILD_GNU_TYPE` \
|
--build=`dpkg-architecture -qDEB_BUILD_GNU_TYPE` \
|
||||||
--prefix=$PREFIX \
|
--prefix=$PREFIX \
|
||||||
--disable-shared \
|
--disable-shared \
|
||||||
|
@ -95,17 +75,12 @@ RUN patch -p1 < ../libev-4.19-android.patch && \
|
||||||
make install
|
make install
|
||||||
|
|
||||||
WORKDIR /root/build
|
WORKDIR /root/build
|
||||||
RUN curl -L -O https://downloads.sourceforge.net/project/libpng/zlib/$ZLIB_VERSION/zlib-$ZLIB_VERSION.tar.gz && \
|
RUN curl -L -O https://zlib.net/zlib-$ZLIB_VERSION.tar.gz && \
|
||||||
tar xf zlib-$ZLIB_VERSION.tar.gz && \
|
tar xf zlib-$ZLIB_VERSION.tar.gz && \
|
||||||
rm zlib-$ZLIB_VERSION.tar.gz
|
rm zlib-$ZLIB_VERSION.tar.gz
|
||||||
|
|
||||||
WORKDIR /root/build/zlib-$ZLIB_VERSION
|
WORKDIR /root/build/zlib-$ZLIB_VERSION
|
||||||
RUN HOST=arm-linux-androideabi \
|
RUN HOST=$TARGET \
|
||||||
CC=$HOST-gcc \
|
|
||||||
AR=$HOST-ar \
|
|
||||||
LD=$HOST-ld \
|
|
||||||
RANLIB=$HOST-ranlib \
|
|
||||||
STRIP=$HOST-strip \
|
|
||||||
./configure \
|
./configure \
|
||||||
--prefix=$PREFIX \
|
--prefix=$PREFIX \
|
||||||
--libdir=$PREFIX/lib \
|
--libdir=$PREFIX/lib \
|
||||||
|
@ -121,7 +96,7 @@ RUN curl -L -O https://c-ares.haxx.se/download/c-ares-$CARES_VERSION.tar.gz && \
|
||||||
|
|
||||||
WORKDIR /root/build/c-ares-$CARES_VERSION
|
WORKDIR /root/build/c-ares-$CARES_VERSION
|
||||||
RUN ./configure \
|
RUN ./configure \
|
||||||
--host=arm-linux-androideabi \
|
--host=$TARGET \
|
||||||
--build=`dpkg-architecture -qDEB_BUILD_GNU_TYPE` \
|
--build=`dpkg-architecture -qDEB_BUILD_GNU_TYPE` \
|
||||||
--prefix=$PREFIX \
|
--prefix=$PREFIX \
|
||||||
--disable-shared && \
|
--disable-shared && \
|
||||||
|
@ -134,17 +109,13 @@ RUN autoreconf -i && \
|
||||||
./configure \
|
./configure \
|
||||||
--enable-app \
|
--enable-app \
|
||||||
--disable-shared \
|
--disable-shared \
|
||||||
--host=arm-linux-androideabi \
|
--host=$TARGET \
|
||||||
--build=`dpkg-architecture -qDEB_BUILD_GNU_TYPE` \
|
--build=`dpkg-architecture -qDEB_BUILD_GNU_TYPE` \
|
||||||
--with-xml-prefix="$PREFIX" \
|
|
||||||
--without-libxml2 \
|
--without-libxml2 \
|
||||||
--disable-python-bindings \
|
|
||||||
--disable-examples \
|
--disable-examples \
|
||||||
--disable-threads \
|
--disable-threads \
|
||||||
CC="$TOOLCHAIN"/bin/arm-linux-androideabi-clang \
|
|
||||||
CXX="$TOOLCHAIN"/bin/arm-linux-androideabi-clang++ \
|
|
||||||
CPPFLAGS="-fPIE -I$PREFIX/include" \
|
CPPFLAGS="-fPIE -I$PREFIX/include" \
|
||||||
PKG_CONFIG_LIBDIR="$PREFIX/lib/pkgconfig" \
|
PKG_CONFIG_LIBDIR="$PREFIX/lib/pkgconfig" \
|
||||||
LDFLAGS="-fPIE -pie -L$PREFIX/lib" && \
|
LDFLAGS="-fPIE -pie -L$PREFIX/lib" && \
|
||||||
make && \
|
make && \
|
||||||
arm-linux-androideabi-strip src/nghttpx src/nghttpd src/nghttp
|
$STRIP src/nghttpx src/nghttpd src/nghttp
|
||||||
|
|
22
Makefile.am
22
Makefile.am
|
@ -20,19 +20,14 @@
|
||||||
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||||
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||||
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
SUBDIRS = lib third-party src bpf examples python tests integration-tests \
|
SUBDIRS = lib third-party src bpf examples tests integration-tests \
|
||||||
doc contrib script
|
doc contrib script
|
||||||
|
|
||||||
# Now with python setuptools, make uninstall will leave many files we
|
|
||||||
# cannot easily remove (e.g., easy-install.pth). Disable it for
|
|
||||||
# distcheck rule.
|
|
||||||
AM_DISTCHECK_CONFIGURE_FLAGS = --disable-python-bindings
|
|
||||||
|
|
||||||
ACLOCAL_AMFLAGS = -I m4
|
ACLOCAL_AMFLAGS = -I m4
|
||||||
|
|
||||||
dist_doc_DATA = README.rst
|
dist_doc_DATA = README.rst
|
||||||
|
|
||||||
EXTRA_DIST = nghttpx.conf.sample proxy.pac.sample android-config android-make \
|
EXTRA_DIST = nghttpx.conf.sample proxy.pac.sample android-config android-env \
|
||||||
Dockerfile.android \
|
Dockerfile.android \
|
||||||
cmakeconfig.h.in \
|
cmakeconfig.h.in \
|
||||||
CMakeLists.txt \
|
CMakeLists.txt \
|
||||||
|
@ -42,20 +37,23 @@ EXTRA_DIST = nghttpx.conf.sample proxy.pac.sample android-config android-make \
|
||||||
cmake/FindLibev.cmake \
|
cmake/FindLibev.cmake \
|
||||||
cmake/FindCUnit.cmake \
|
cmake/FindCUnit.cmake \
|
||||||
cmake/Version.cmake \
|
cmake/Version.cmake \
|
||||||
cmake/FindCython.cmake \
|
|
||||||
cmake/FindLibevent.cmake \
|
cmake/FindLibevent.cmake \
|
||||||
cmake/FindJansson.cmake \
|
cmake/FindJansson.cmake \
|
||||||
cmake/FindLibcares.cmake \
|
cmake/FindLibcares.cmake \
|
||||||
cmake/FindSystemd.cmake
|
cmake/FindSystemd.cmake \
|
||||||
|
cmake/FindLibbpf.cmake \
|
||||||
|
cmake/FindLibnghttp3.cmake \
|
||||||
|
cmake/FindLibngtcp2.cmake \
|
||||||
|
cmake/FindLibngtcp2_crypto_openssl.cmake
|
||||||
|
|
||||||
.PHONY: clang-format
|
.PHONY: clang-format
|
||||||
|
|
||||||
# Format source files using clang-format. Don't format source files
|
# Format source files using clang-format. Don't format source files
|
||||||
# under third-party directory since we are not responsible for thier
|
# under third-party directory since we are not responsible for their
|
||||||
# coding style.
|
# coding style.
|
||||||
clang-format:
|
clang-format:
|
||||||
CLANGFORMAT=`git config --get clangformat.binary`; \
|
CLANGFORMAT=`git config --get clangformat.binary`; \
|
||||||
test -z $${CLANGFORMAT} && CLANGFORMAT="clang-format"; \
|
test -z $${CLANGFORMAT} && CLANGFORMAT="clang-format"; \
|
||||||
$${CLANGFORMAT} -i lib/*.{c,h} lib/includes/nghttp2/*.h \
|
$${CLANGFORMAT} -i lib/*.{c,h} lib/includes/nghttp2/*.h \
|
||||||
src/*.{c,cc,h} src/includes/nghttp2/*.h examples/*.{c,cc} \
|
src/*.{c,cc,h} examples/*.{c,cc} \
|
||||||
tests/*.{c,h}
|
tests/*.{c,h} bpf/*.c fuzz/*.cc
|
||||||
|
|
|
@ -0,0 +1,36 @@
|
||||||
|
|
||||||
|
USE_CLIB2=YES
|
||||||
|
ifeq ($(USE_CLIB2), YES)
|
||||||
|
LIBC=clib2
|
||||||
|
else
|
||||||
|
LIBC=newlib
|
||||||
|
endif
|
||||||
|
|
||||||
|
all: build
|
||||||
|
|
||||||
|
init:
|
||||||
|
git submodule update --init
|
||||||
|
autoreconf -i
|
||||||
|
automake
|
||||||
|
autoconf
|
||||||
|
|
||||||
|
build: init
|
||||||
|
CC="ppc-amigaos-gcc" CFLAGS="-mcrt=${LIBC} -fPIC" LDFLAGS="-mcrt=${LIBC}" CXXFLAGS="-mcrt=${LIBC} -fPIC" ./configure --host=ppc-amigaos && \
|
||||||
|
make -j$(shell nproc)
|
||||||
|
|
||||||
|
clean:
|
||||||
|
make -f Makefile clean
|
||||||
|
rm -rf autom4te.cache
|
||||||
|
rm compile config.guess config.h config.h.in config.log config.status config.sub configure depcomp install-sh libtool ltmain.sh missing stamp-h1 test-driver INSTALL Makefile Makefile.in *.m4
|
||||||
|
|
||||||
|
release:
|
||||||
|
mkdir -p release/local/common/include/nghttp2
|
||||||
|
mkdir -p release/local/clib2/lib
|
||||||
|
mkdir -p release/local/newlib/lib
|
||||||
|
make -f Makefile.os4 USE_CLIB2=YES
|
||||||
|
cp ./lib/.libs/libnghttp2.a ./lib/.libs/libnghttp2.la release/local/clib2/lib/
|
||||||
|
cp ./lib/includes/nghttp2/* release/local/common/include/nghttp2/
|
||||||
|
make -f Makefile.os4 clean
|
||||||
|
make -f Makefile.os4 USE_CLIB2=NO
|
||||||
|
cp ./lib/.libs/libnghttp2.a ./lib/.libs/libnghttp2.la ./lib/.libs/libnghttp2.so release/local/newlib/lib/
|
||||||
|
lha -aeq libnghttp2.lha release/
|
294
README.rst
294
README.rst
|
@ -11,17 +11,14 @@ HTTP/2.
|
||||||
|
|
||||||
An HPACK encoder and decoder are available as a public API.
|
An HPACK encoder and decoder are available as a public API.
|
||||||
|
|
||||||
An experimental high level C++ library is also available.
|
|
||||||
|
|
||||||
We have Python bindings of this library, but we do not have full
|
|
||||||
code coverage yet.
|
|
||||||
|
|
||||||
Development Status
|
Development Status
|
||||||
------------------
|
------------------
|
||||||
|
|
||||||
We have implemented `RFC 7540 <https://tools.ietf.org/html/rfc7540>`_
|
nghttp2 was originally developed based on `RFC 7540
|
||||||
HTTP/2 and `RFC 7541 <https://tools.ietf.org/html/rfc7541>`_ HPACK -
|
<https://tools.ietf.org/html/rfc7540>`_ HTTP/2 and `RFC 7541
|
||||||
Header Compression for HTTP/2
|
<https://tools.ietf.org/html/rfc7541>`_ HPACK - Header Compression for
|
||||||
|
HTTP/2. Now we are updating our code to implement `RFC 9113
|
||||||
|
<https://datatracker.ietf.org/doc/html/rfc9113>`_.
|
||||||
|
|
||||||
The nghttp2 code base was forked from the spdylay
|
The nghttp2 code base was forked from the spdylay
|
||||||
(https://github.com/tatsuhiro-t/spdylay) project.
|
(https://github.com/tatsuhiro-t/spdylay) project.
|
||||||
|
@ -32,12 +29,14 @@ Public Test Server
|
||||||
The following endpoints are available to try out our nghttp2
|
The following endpoints are available to try out our nghttp2
|
||||||
implementation.
|
implementation.
|
||||||
|
|
||||||
* https://nghttp2.org/ (TLS + ALPN/NPN)
|
* https://nghttp2.org/ (TLS + ALPN/NPN and HTTP/3)
|
||||||
|
|
||||||
This endpoint supports ``h2``, ``h2-16``, ``h2-14``, and
|
This endpoint supports ``h2``, ``h2-16``, ``h2-14``, and
|
||||||
``http/1.1`` via ALPN/NPN and requires TLSv1.2 for HTTP/2
|
``http/1.1`` via ALPN/NPN and requires TLSv1.2 for HTTP/2
|
||||||
connection.
|
connection.
|
||||||
|
|
||||||
|
It also supports HTTP/3.
|
||||||
|
|
||||||
* http://nghttp2.org/ (HTTP Upgrade and HTTP/2 Direct)
|
* http://nghttp2.org/ (HTTP Upgrade and HTTP/2 Direct)
|
||||||
|
|
||||||
``h2c`` and ``http/1.1``.
|
``h2c`` and ``http/1.1``.
|
||||||
|
@ -104,27 +103,6 @@ To mitigate heap fragmentation in long running server programs
|
||||||
Alpine Linux currently does not support malloc replacement
|
Alpine Linux currently does not support malloc replacement
|
||||||
due to musl limitations. See details in issue `#762 <https://github.com/nghttp2/nghttp2/issues/762>`_.
|
due to musl limitations. See details in issue `#762 <https://github.com/nghttp2/nghttp2/issues/762>`_.
|
||||||
|
|
||||||
libnghttp2_asio C++ library requires the following packages:
|
|
||||||
|
|
||||||
* libboost-dev >= 1.54.0
|
|
||||||
* libboost-thread-dev >= 1.54.0
|
|
||||||
|
|
||||||
The Python bindings require the following packages:
|
|
||||||
|
|
||||||
* cython >= 0.19
|
|
||||||
* python >= 3.8
|
|
||||||
* python-setuptools
|
|
||||||
|
|
||||||
If you are using Ubuntu 16.04 LTS (Xenial Xerus) or Debian 8 (jessie)
|
|
||||||
and above, run the following to install the required packages:
|
|
||||||
|
|
||||||
.. code-block:: text
|
|
||||||
|
|
||||||
sudo apt-get install g++ make binutils autoconf automake autotools-dev libtool pkg-config \
|
|
||||||
zlib1g-dev libcunit1-dev libssl-dev libxml2-dev libev-dev libevent-dev libjansson-dev \
|
|
||||||
libc-ares-dev libjemalloc-dev libsystemd-dev \
|
|
||||||
cython python3-dev python-setuptools
|
|
||||||
|
|
||||||
To enable mruby support for nghttpx, `mruby
|
To enable mruby support for nghttpx, `mruby
|
||||||
<https://github.com/mruby/mruby>`_ is required. We need to build
|
<https://github.com/mruby/mruby>`_ is required. We need to build
|
||||||
mruby with C++ ABI explicitly turned on, and probably need other
|
mruby with C++ ABI explicitly turned on, and probably need other
|
||||||
|
@ -149,9 +127,11 @@ To enable the experimental HTTP/3 support for h2load and nghttpx, the
|
||||||
following libraries are required:
|
following libraries are required:
|
||||||
|
|
||||||
* `OpenSSL with QUIC support
|
* `OpenSSL with QUIC support
|
||||||
<https://github.com/quictls/openssl/tree/OpenSSL_1_1_1k+quic>`_
|
<https://github.com/quictls/openssl/tree/OpenSSL_1_1_1s+quic>`_; or
|
||||||
* `ngtcp2 <https://github.com/ngtcp2/ngtcp2>`_
|
`BoringSSL <https://boringssl.googlesource.com/boringssl/>`_ (commit
|
||||||
* `nghttp3 <https://github.com/ngtcp2/nghttp3>`_
|
31bad2514d21f6207f3925ba56754611c462a873)
|
||||||
|
* `ngtcp2 <https://github.com/ngtcp2/ngtcp2>`_ >= 0.10.0
|
||||||
|
* `nghttp3 <https://github.com/ngtcp2/nghttp3>`_ >= 0.7.0
|
||||||
|
|
||||||
Use ``--enable-http3`` configure option to enable HTTP/3 feature for
|
Use ``--enable-http3`` configure option to enable HTTP/3 feature for
|
||||||
h2load and nghttpx.
|
h2load and nghttpx.
|
||||||
|
@ -160,13 +140,13 @@ In order to build optional eBPF program to direct an incoming QUIC UDP
|
||||||
datagram to a correct socket for nghttpx, the following libraries are
|
datagram to a correct socket for nghttpx, the following libraries are
|
||||||
required:
|
required:
|
||||||
|
|
||||||
* libbpf-dev >= 0.4.0
|
* libbpf-dev >= 0.7.0
|
||||||
|
|
||||||
Use ``--with-libbpf`` configure option to build eBPF program.
|
Use ``--with-libbpf`` configure option to build eBPF program.
|
||||||
libelf-dev is needed to build libbpf.
|
libelf-dev is needed to build libbpf.
|
||||||
|
|
||||||
For Ubuntu 20.04, you can build libbpf from `the source code
|
For Ubuntu 20.04, you can build libbpf from `the source code
|
||||||
<https://github.com/libbpf/libbpf/releases/tag/v0.4.0>`_. nghttpx
|
<https://github.com/libbpf/libbpf/releases/tag/v1.0.1>`_. nghttpx
|
||||||
requires eBPF program for reloading its configuration and hot swapping
|
requires eBPF program for reloading its configuration and hot swapping
|
||||||
its executable.
|
its executable.
|
||||||
|
|
||||||
|
@ -220,6 +200,18 @@ language features.
|
||||||
responsible to specify the correct values to these variables. For
|
responsible to specify the correct values to these variables. For
|
||||||
complete list of these variables, run ``./configure -h``.
|
complete list of these variables, run ``./configure -h``.
|
||||||
|
|
||||||
|
If you are using Ubuntu 22.04 LTS, run the following to install the
|
||||||
|
required packages:
|
||||||
|
|
||||||
|
.. code-block:: text
|
||||||
|
|
||||||
|
sudo apt-get install g++ clang make binutils autoconf automake \
|
||||||
|
autotools-dev libtool pkg-config \
|
||||||
|
zlib1g-dev libcunit1-dev libssl-dev libxml2-dev libev-dev \
|
||||||
|
libevent-dev libjansson-dev \
|
||||||
|
libc-ares-dev libjemalloc-dev libsystemd-dev \
|
||||||
|
ruby-dev bison libelf-dev
|
||||||
|
|
||||||
Building nghttp2 from release tar archive
|
Building nghttp2 from release tar archive
|
||||||
-----------------------------------------
|
-----------------------------------------
|
||||||
|
|
||||||
|
@ -341,9 +333,9 @@ configure script with ``--enable-http3``.
|
||||||
For nghttpx to reload configurations and swapping its executable while
|
For nghttpx to reload configurations and swapping its executable while
|
||||||
gracefully terminating old worker processes, eBPF is required. Run
|
gracefully terminating old worker processes, eBPF is required. Run
|
||||||
the configure script with ``--enable-http3 --with-libbpf`` to build
|
the configure script with ``--enable-http3 --with-libbpf`` to build
|
||||||
eBPF program. The Connection ID encryption key must be set with
|
eBPF program. The QUIC keying material must be set with
|
||||||
``--frontend-quic-connection-id-encryption-key`` and must not change
|
``--frontend-quic-secret-file`` in order to keep the existing
|
||||||
in order to keep the existing connections alive during reload.
|
connections alive during reload.
|
||||||
|
|
||||||
The detailed steps to build HTTP/3 enabled h2load and nghttpx follow.
|
The detailed steps to build HTTP/3 enabled h2load and nghttpx follow.
|
||||||
|
|
||||||
|
@ -351,7 +343,7 @@ Build custom OpenSSL:
|
||||||
|
|
||||||
.. code-block:: text
|
.. code-block:: text
|
||||||
|
|
||||||
$ git clone --depth 1 -b OpenSSL_1_1_1l+quic https://github.com/quictls/openssl
|
$ git clone --depth 1 -b OpenSSL_1_1_1s+quic https://github.com/quictls/openssl
|
||||||
$ cd openssl
|
$ cd openssl
|
||||||
$ ./config --prefix=$PWD/build --openssldir=/etc/ssl
|
$ ./config --prefix=$PWD/build --openssldir=/etc/ssl
|
||||||
$ make -j$(nproc)
|
$ make -j$(nproc)
|
||||||
|
@ -362,7 +354,7 @@ Build nghttp3:
|
||||||
|
|
||||||
.. code-block:: text
|
.. code-block:: text
|
||||||
|
|
||||||
$ git clone --depth 1 https://github.com/ngtcp2/nghttp3
|
$ git clone --depth 1 -b v0.8.0 https://github.com/ngtcp2/nghttp3
|
||||||
$ cd nghttp3
|
$ cd nghttp3
|
||||||
$ autoreconf -i
|
$ autoreconf -i
|
||||||
$ ./configure --prefix=$PWD/build --enable-lib-only
|
$ ./configure --prefix=$PWD/build --enable-lib-only
|
||||||
|
@ -374,7 +366,7 @@ Build ngtcp2:
|
||||||
|
|
||||||
.. code-block:: text
|
.. code-block:: text
|
||||||
|
|
||||||
$ git clone --depth 1 https://github.com/ngtcp2/ngtcp2
|
$ git clone --depth 1 -b v0.12.0 https://github.com/ngtcp2/ngtcp2
|
||||||
$ cd ngtcp2
|
$ cd ngtcp2
|
||||||
$ autoreconf -i
|
$ autoreconf -i
|
||||||
$ ./configure --prefix=$PWD/build --enable-lib-only \
|
$ ./configure --prefix=$PWD/build --enable-lib-only \
|
||||||
|
@ -383,12 +375,12 @@ Build ngtcp2:
|
||||||
$ make install
|
$ make install
|
||||||
$ cd ..
|
$ cd ..
|
||||||
|
|
||||||
If your Linux distribution does not have libbpf-dev >= 0.4.0, build
|
If your Linux distribution does not have libbpf-dev >= 0.7.0, build
|
||||||
from source:
|
from source:
|
||||||
|
|
||||||
.. code-block:: text
|
.. code-block:: text
|
||||||
|
|
||||||
$ git clone --depth 1 -b v0.4.0 https://github.com/libbpf/libbpf
|
$ git clone --depth 1 -b v1.0.1 https://github.com/libbpf/libbpf
|
||||||
$ cd libbpf
|
$ cd libbpf
|
||||||
$ PREFIX=$PWD/build make -C src install
|
$ PREFIX=$PWD/build make -C src install
|
||||||
$ cd ..
|
$ cd ..
|
||||||
|
@ -402,8 +394,7 @@ Build nghttp2:
|
||||||
$ git submodule update --init
|
$ git submodule update --init
|
||||||
$ autoreconf -i
|
$ autoreconf -i
|
||||||
$ ./configure --with-mruby --with-neverbleed --enable-http3 --with-libbpf \
|
$ ./configure --with-mruby --with-neverbleed --enable-http3 --with-libbpf \
|
||||||
--disable-python-bindings \
|
CC=clang-14 CXX=clang++-14 \
|
||||||
CC=clang-12 CXX=clang++-12 \
|
|
||||||
PKG_CONFIG_PATH="$PWD/../openssl/build/lib/pkgconfig:$PWD/../nghttp3/build/lib/pkgconfig:$PWD/../ngtcp2/build/lib/pkgconfig:$PWD/../libbpf/build/lib64/pkgconfig" \
|
PKG_CONFIG_PATH="$PWD/../openssl/build/lib/pkgconfig:$PWD/../nghttp3/build/lib/pkgconfig:$PWD/../ngtcp2/build/lib/pkgconfig:$PWD/../libbpf/build/lib64/pkgconfig" \
|
||||||
LDFLAGS="$LDFLAGS -Wl,-rpath,$PWD/../openssl/build/lib -Wl,-rpath,$PWD/../libbpf/build/lib64"
|
LDFLAGS="$LDFLAGS -Wl,-rpath,$PWD/../openssl/build/lib -Wl,-rpath,$PWD/../libbpf/build/lib64"
|
||||||
$ make -j$(nproc)
|
$ make -j$(nproc)
|
||||||
|
@ -1427,219 +1418,6 @@ associated value includes the state of the dynamic header table after the
|
||||||
corresponding header set was processed. The format is the same as
|
corresponding header set was processed. The format is the same as
|
||||||
``deflatehd``.
|
``deflatehd``.
|
||||||
|
|
||||||
libnghttp2_asio: High level HTTP/2 C++ library
|
|
||||||
----------------------------------------------
|
|
||||||
|
|
||||||
libnghttp2_asio is C++ library built on top of libnghttp2 and provides
|
|
||||||
high level abstraction API to build HTTP/2 applications. It depends
|
|
||||||
on the Boost::ASIO library and OpenSSL. Currently libnghttp2_asio
|
|
||||||
provides both client and server APIs.
|
|
||||||
|
|
||||||
libnghttp2_asio is not built by default. Use the ``--enable-asio-lib``
|
|
||||||
configure flag to build libnghttp2_asio. The required Boost libraries
|
|
||||||
are:
|
|
||||||
|
|
||||||
* Boost::Asio
|
|
||||||
* Boost::System
|
|
||||||
* Boost::Thread
|
|
||||||
|
|
||||||
The server API is designed to build an HTTP/2 server very easily to utilize
|
|
||||||
C++14 anonymous functions and closures. The bare minimum example of
|
|
||||||
an HTTP/2 server looks like this:
|
|
||||||
|
|
||||||
.. code-block:: cpp
|
|
||||||
|
|
||||||
#include <iostream>
|
|
||||||
|
|
||||||
#include <nghttp2/asio_http2_server.h>
|
|
||||||
|
|
||||||
using namespace nghttp2::asio_http2;
|
|
||||||
using namespace nghttp2::asio_http2::server;
|
|
||||||
|
|
||||||
int main(int argc, char *argv[]) {
|
|
||||||
boost::system::error_code ec;
|
|
||||||
http2 server;
|
|
||||||
|
|
||||||
server.handle("/", [](const request &req, const response &res) {
|
|
||||||
res.write_head(200);
|
|
||||||
res.end("hello, world\n");
|
|
||||||
});
|
|
||||||
|
|
||||||
if (server.listen_and_serve(ec, "localhost", "3000")) {
|
|
||||||
std::cerr << "error: " << ec.message() << std::endl;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Here is sample code to use the client API:
|
|
||||||
|
|
||||||
.. code-block:: cpp
|
|
||||||
|
|
||||||
#include <iostream>
|
|
||||||
|
|
||||||
#include <nghttp2/asio_http2_client.h>
|
|
||||||
|
|
||||||
using boost::asio::ip::tcp;
|
|
||||||
|
|
||||||
using namespace nghttp2::asio_http2;
|
|
||||||
using namespace nghttp2::asio_http2::client;
|
|
||||||
|
|
||||||
int main(int argc, char *argv[]) {
|
|
||||||
boost::system::error_code ec;
|
|
||||||
boost::asio::io_service io_service;
|
|
||||||
|
|
||||||
// connect to localhost:3000
|
|
||||||
session sess(io_service, "localhost", "3000");
|
|
||||||
|
|
||||||
sess.on_connect([&sess](tcp::resolver::iterator endpoint_it) {
|
|
||||||
boost::system::error_code ec;
|
|
||||||
|
|
||||||
auto req = sess.submit(ec, "GET", "http://localhost:3000/");
|
|
||||||
|
|
||||||
req->on_response([](const response &res) {
|
|
||||||
// print status code and response header fields.
|
|
||||||
std::cerr << "HTTP/2 " << res.status_code() << std::endl;
|
|
||||||
for (auto &kv : res.header()) {
|
|
||||||
std::cerr << kv.first << ": " << kv.second.value << "\n";
|
|
||||||
}
|
|
||||||
std::cerr << std::endl;
|
|
||||||
|
|
||||||
res.on_data([](const uint8_t *data, std::size_t len) {
|
|
||||||
std::cerr.write(reinterpret_cast<const char *>(data), len);
|
|
||||||
std::cerr << std::endl;
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
req->on_close([&sess](uint32_t error_code) {
|
|
||||||
// shutdown session after first request was done.
|
|
||||||
sess.shutdown();
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
sess.on_error([](const boost::system::error_code &ec) {
|
|
||||||
std::cerr << "error: " << ec.message() << std::endl;
|
|
||||||
});
|
|
||||||
|
|
||||||
io_service.run();
|
|
||||||
}
|
|
||||||
|
|
||||||
For more details, see the documentation of libnghttp2_asio.
|
|
||||||
|
|
||||||
Python bindings
|
|
||||||
---------------
|
|
||||||
|
|
||||||
The ``python`` directory contains nghttp2 Python bindings. The
|
|
||||||
bindings currently provide HPACK compressor and decompressor classes
|
|
||||||
and an HTTP/2 server.
|
|
||||||
|
|
||||||
The extension module is called ``nghttp2``.
|
|
||||||
|
|
||||||
``make`` will build the bindings and target Python version is
|
|
||||||
determined by the ``configure`` script. If the detected Python version is not
|
|
||||||
what you expect, specify a path to Python executable in a ``PYTHON``
|
|
||||||
variable as an argument to configure script (e.g., ``./configure
|
|
||||||
PYTHON=/usr/bin/python3.8``).
|
|
||||||
|
|
||||||
The following example code illustrates basic usage of the HPACK compressor
|
|
||||||
and decompressor in Python:
|
|
||||||
|
|
||||||
.. code-block:: python
|
|
||||||
|
|
||||||
import binascii
|
|
||||||
import nghttp2
|
|
||||||
|
|
||||||
deflater = nghttp2.HDDeflater()
|
|
||||||
inflater = nghttp2.HDInflater()
|
|
||||||
|
|
||||||
data = deflater.deflate([(b'foo', b'bar'),
|
|
||||||
(b'baz', b'buz')])
|
|
||||||
print(binascii.b2a_hex(data))
|
|
||||||
|
|
||||||
hdrs = inflater.inflate(data)
|
|
||||||
print(hdrs)
|
|
||||||
|
|
||||||
The ``nghttp2.HTTP2Server`` class builds on top of the asyncio event
|
|
||||||
loop. On construction, *RequestHandlerClass* must be given, which
|
|
||||||
must be a subclass of ``nghttp2.BaseRequestHandler`` class.
|
|
||||||
|
|
||||||
The ``BaseRequestHandler`` class is used to handle the HTTP/2 stream.
|
|
||||||
By default, it does nothing. It must be subclassed to handle each
|
|
||||||
event callback method.
|
|
||||||
|
|
||||||
The first callback method invoked is ``on_headers()``. It is called
|
|
||||||
when HEADERS frame, which includes the request header fields, has arrived.
|
|
||||||
|
|
||||||
If the request has a request body, ``on_data(data)`` is invoked for each
|
|
||||||
chunk of received data.
|
|
||||||
|
|
||||||
Once the entire request is received, ``on_request_done()`` is invoked.
|
|
||||||
|
|
||||||
When the stream is closed, ``on_close(error_code)`` is called.
|
|
||||||
|
|
||||||
The application can send a response using ``send_response()`` method.
|
|
||||||
It can be used in ``on_headers()``, ``on_data()`` or
|
|
||||||
``on_request_done()``.
|
|
||||||
|
|
||||||
The application can push resources using the ``push()`` method. It must be
|
|
||||||
used before the ``send_response()`` call.
|
|
||||||
|
|
||||||
The following instance variables are available:
|
|
||||||
|
|
||||||
client_address
|
|
||||||
Contains a tuple of the form (host, port) referring to the
|
|
||||||
client's address.
|
|
||||||
|
|
||||||
stream_id
|
|
||||||
Stream ID of this stream.
|
|
||||||
|
|
||||||
scheme
|
|
||||||
Scheme of the request URI. This is a value of :scheme header
|
|
||||||
field.
|
|
||||||
|
|
||||||
method
|
|
||||||
Method of this stream. This is a value of :method header field.
|
|
||||||
|
|
||||||
host
|
|
||||||
This is a value of :authority or host header field.
|
|
||||||
|
|
||||||
path
|
|
||||||
This is a value of :path header field.
|
|
||||||
|
|
||||||
The following example illustrates the HTTP2Server and
|
|
||||||
BaseRequestHandler usage:
|
|
||||||
|
|
||||||
.. code-block:: python
|
|
||||||
|
|
||||||
#!/usr/bin/env python3
|
|
||||||
|
|
||||||
import io, ssl
|
|
||||||
import nghttp2
|
|
||||||
|
|
||||||
class Handler(nghttp2.BaseRequestHandler):
|
|
||||||
|
|
||||||
def on_headers(self):
|
|
||||||
self.push(path='/css/bootstrap.css',
|
|
||||||
request_headers = [('content-length', '3')],
|
|
||||||
status=200,
|
|
||||||
body='foo')
|
|
||||||
|
|
||||||
self.push(path='/js/bootstrap.js',
|
|
||||||
method='GET',
|
|
||||||
request_headers = [('content-length', '10')],
|
|
||||||
status=200,
|
|
||||||
body='foobarbuzz')
|
|
||||||
|
|
||||||
self.send_response(status=200,
|
|
||||||
headers = [('content-type', 'text/plain')],
|
|
||||||
body=io.BytesIO(b'nghttp2-python FTW'))
|
|
||||||
|
|
||||||
ctx = ssl.SSLContext(ssl.PROTOCOL_SSLv23)
|
|
||||||
ctx.options = ssl.OP_ALL | ssl.OP_NO_SSLv2
|
|
||||||
ctx.load_cert_chain('server.crt', 'server.key')
|
|
||||||
|
|
||||||
# give None to ssl to make the server non-SSL/TLS
|
|
||||||
server = nghttp2.HTTP2Server(('127.0.0.1', 8443), Handler, ssl=ctx)
|
|
||||||
server.serve_forever()
|
|
||||||
|
|
||||||
Contribution
|
Contribution
|
||||||
------------
|
------------
|
||||||
|
|
||||||
|
|
|
@ -23,25 +23,15 @@
|
||||||
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||||
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
|
||||||
if [ -z "$ANDROID_HOME" ]; then
|
. ./android-env
|
||||||
echo 'No $ANDROID_HOME specified.'
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
PREFIX="$ANDROID_HOME"/usr/local
|
|
||||||
TOOLCHAIN="$ANDROID_HOME"/toolchain
|
|
||||||
PATH="$TOOLCHAIN"/bin:"$PATH"
|
|
||||||
|
|
||||||
./configure \
|
./configure \
|
||||||
--disable-shared \
|
--disable-shared \
|
||||||
--host=arm-linux-androideabi \
|
--host=$TARGET \
|
||||||
--build=`dpkg-architecture -qDEB_BUILD_GNU_TYPE` \
|
--build=`dpkg-architecture -qDEB_BUILD_GNU_TYPE` \
|
||||||
--with-xml-prefix="$PREFIX" \
|
|
||||||
--without-libxml2 \
|
--without-libxml2 \
|
||||||
--disable-python-bindings \
|
|
||||||
--disable-examples \
|
--disable-examples \
|
||||||
--disable-threads \
|
--disable-threads \
|
||||||
CC="$TOOLCHAIN"/bin/arm-linux-androideabi-clang \
|
|
||||||
CXX="$TOOLCHAIN"/bin/arm-linux-androideabi-clang++ \
|
|
||||||
CPPFLAGS="-fPIE -I$PREFIX/include" \
|
CPPFLAGS="-fPIE -I$PREFIX/include" \
|
||||||
PKG_CONFIG_LIBDIR="$PREFIX/lib/pkgconfig" \
|
PKG_CONFIG_LIBDIR="$PREFIX/lib/pkgconfig" \
|
||||||
LDFLAGS="-fPIE -pie -L$PREFIX/lib"
|
LDFLAGS="-fPIE -pie -L$PREFIX/lib"
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
#
|
#
|
||||||
# nghttp2 - HTTP/2 C Library
|
# nghttp2 - HTTP/2 C Library
|
||||||
#
|
#
|
||||||
# Copyright (c) 2013 Tatsuhiro Tsujikawa
|
# Copyright (c) 2022 nghttp2 contributors
|
||||||
#
|
#
|
||||||
# Permission is hereby granted, free of charge, to any person obtaining
|
# Permission is hereby granted, free of charge, to any person obtaining
|
||||||
# a copy of this software and associated documentation files (the
|
# a copy of this software and associated documentation files (the
|
||||||
|
@ -23,11 +23,18 @@
|
||||||
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||||
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
|
||||||
if [ -z "$ANDROID_HOME" ]; then
|
if [ -z "$NDK" ]; then
|
||||||
echo 'No $ANDROID_HOME specified.'
|
echo 'No $NDK specified.'
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
TOOLCHAIN=$ANDROID_HOME/toolchain
|
|
||||||
PATH=$TOOLCHAIN/bin:$PATH
|
|
||||||
|
|
||||||
make "$@"
|
export TOOLCHAIN=$NDK/toolchains/llvm/prebuilt/linux-x86_64
|
||||||
|
export TARGET=aarch64-linux-android
|
||||||
|
export API=33
|
||||||
|
export AR=$TOOLCHAIN/bin/llvm-ar
|
||||||
|
export CC=$TOOLCHAIN/bin/$TARGET$API-clang
|
||||||
|
export CXX=$TOOLCHAIN/bin/$TARGET$API-clang++
|
||||||
|
export LD=$TOOLCHAIN/bin/ld
|
||||||
|
export RANDLIB=$TOOLCHAIN/bin/llvm-ranlib
|
||||||
|
export STRIP=$TOOLCHAIN/bin/llvm-strip
|
||||||
|
export PREFIX=$NDK/usr/local
|
53
appveyor.yml
53
appveyor.yml
|
@ -1,53 +0,0 @@
|
||||||
# Notes:
|
|
||||||
# - Minimal appveyor.yml file is an empty file. All sections are optional.
|
|
||||||
# - Indent each level of configuration with 2 spaces. Do not use tabs!
|
|
||||||
# - All section names are case-sensitive.
|
|
||||||
# - Section names should be unique on each level.
|
|
||||||
|
|
||||||
#---------------------------------#
|
|
||||||
# general configuration #
|
|
||||||
#---------------------------------#
|
|
||||||
|
|
||||||
# version format
|
|
||||||
#version: 0.10.{build}
|
|
||||||
|
|
||||||
# branches to build
|
|
||||||
branches:
|
|
||||||
# blacklist
|
|
||||||
except:
|
|
||||||
- gh-pages
|
|
||||||
|
|
||||||
# Do not build on tags (GitHub only)
|
|
||||||
skip_tags: true
|
|
||||||
|
|
||||||
#---------------------------------#
|
|
||||||
# environment configuration #
|
|
||||||
#---------------------------------#
|
|
||||||
|
|
||||||
os: Windows Server 2012
|
|
||||||
|
|
||||||
# scripts that run after cloning repository
|
|
||||||
install:
|
|
||||||
# install Win-Flex-Bison
|
|
||||||
#- cmd: cinst winflexbison -y
|
|
||||||
|
|
||||||
#---------------------------------#
|
|
||||||
# build configuration #
|
|
||||||
#---------------------------------#
|
|
||||||
|
|
||||||
# scripts to run before build
|
|
||||||
before_build:
|
|
||||||
- cmd: cmake .
|
|
||||||
|
|
||||||
# scripts to run *after* solution is built and *before* automatic packaging occurs (web apps, NuGet packages, Azure Cloud Services)
|
|
||||||
# before_package:
|
|
||||||
|
|
||||||
# scripts to run after build
|
|
||||||
# after_build:
|
|
||||||
|
|
||||||
# to run your custom scripts instead of automatic MSBuild
|
|
||||||
build_script:
|
|
||||||
- cmd: cmake --build .
|
|
||||||
|
|
||||||
# to disable automatic builds
|
|
||||||
# build: off
|
|
|
@ -21,9 +21,9 @@
|
||||||
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||||
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
|
||||||
if HAVE_LIBBPF
|
EXTRA_DIST = CMakeLists.txt reuseport_kern.c
|
||||||
|
|
||||||
EXTRA_DIST = reuseport_kern.c
|
if HAVE_LIBBPF
|
||||||
|
|
||||||
bpf_pkglibdir = $(pkglibdir)
|
bpf_pkglibdir = $(pkglibdir)
|
||||||
bpf_pkglib_DATA = reuseport_kern.o
|
bpf_pkglib_DATA = reuseport_kern.o
|
||||||
|
|
|
@ -423,26 +423,26 @@ static inline __u32 jhash_2words(__u32 a, __u32 b, __u32 initval) {
|
||||||
return __jhash_nwords(a, b, 0, initval + JHASH_INITVAL + (2 << 2));
|
return __jhash_nwords(a, b, 0, initval + JHASH_INITVAL + (2 << 2));
|
||||||
}
|
}
|
||||||
|
|
||||||
struct bpf_map_def SEC("maps") cid_prefix_map = {
|
struct {
|
||||||
.type = BPF_MAP_TYPE_HASH,
|
__uint(type, BPF_MAP_TYPE_HASH);
|
||||||
.max_entries = 255,
|
__uint(max_entries, 255);
|
||||||
.key_size = sizeof(__u64),
|
__type(key, __u64);
|
||||||
.value_size = sizeof(__u32),
|
__type(value, __u32);
|
||||||
};
|
} cid_prefix_map SEC(".maps");
|
||||||
|
|
||||||
struct bpf_map_def SEC("maps") reuseport_array = {
|
struct {
|
||||||
.type = BPF_MAP_TYPE_REUSEPORT_SOCKARRAY,
|
__uint(type, BPF_MAP_TYPE_REUSEPORT_SOCKARRAY);
|
||||||
.max_entries = 255,
|
__uint(max_entries, 255);
|
||||||
.key_size = sizeof(__u32),
|
__type(key, __u32);
|
||||||
.value_size = sizeof(__u32),
|
__type(value, __u32);
|
||||||
};
|
} reuseport_array SEC(".maps");
|
||||||
|
|
||||||
struct bpf_map_def SEC("maps") sk_info = {
|
struct {
|
||||||
.type = BPF_MAP_TYPE_ARRAY,
|
__uint(type, BPF_MAP_TYPE_ARRAY);
|
||||||
.max_entries = 3,
|
__uint(max_entries, 3);
|
||||||
.key_size = sizeof(__u32),
|
__type(key, __u32);
|
||||||
.value_size = sizeof(__u64),
|
__type(value, __u64);
|
||||||
};
|
} sk_info SEC(".maps");
|
||||||
|
|
||||||
typedef struct quic_hd {
|
typedef struct quic_hd {
|
||||||
__u8 *dcid;
|
__u8 *dcid;
|
||||||
|
@ -455,6 +455,7 @@ typedef struct quic_hd {
|
||||||
#define MAX_DCIDLEN 20
|
#define MAX_DCIDLEN 20
|
||||||
#define MIN_DCIDLEN 8
|
#define MIN_DCIDLEN 8
|
||||||
#define CID_PREFIXLEN 8
|
#define CID_PREFIXLEN 8
|
||||||
|
#define CID_PREFIX_OFFSET 1
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
NGTCP2_PKT_INITIAL = 0x0,
|
NGTCP2_PKT_INITIAL = 0x0,
|
||||||
|
@ -579,6 +580,7 @@ int select_reuseport(struct sk_reuseport_md *reuse_md) {
|
||||||
__u8 qpktbuf[6 + MAX_DCIDLEN];
|
__u8 qpktbuf[6 + MAX_DCIDLEN];
|
||||||
struct AES_ctx aes_ctx;
|
struct AES_ctx aes_ctx;
|
||||||
__u8 key[AES_KEYLEN];
|
__u8 key[AES_KEYLEN];
|
||||||
|
__u8 *cid_prefix;
|
||||||
|
|
||||||
if (bpf_skb_load_bytes(reuse_md, sizeof(struct udphdr), qpktbuf,
|
if (bpf_skb_load_bytes(reuse_md, sizeof(struct udphdr), qpktbuf,
|
||||||
sizeof(qpktbuf)) != 0) {
|
sizeof(qpktbuf)) != 0) {
|
||||||
|
@ -615,9 +617,10 @@ int select_reuseport(struct sk_reuseport_md *reuse_md) {
|
||||||
case NGTCP2_PKT_INITIAL:
|
case NGTCP2_PKT_INITIAL:
|
||||||
case NGTCP2_PKT_0RTT:
|
case NGTCP2_PKT_0RTT:
|
||||||
if (qhd.dcidlen == SV_DCIDLEN) {
|
if (qhd.dcidlen == SV_DCIDLEN) {
|
||||||
AES_ECB_decrypt(&aes_ctx, qhd.dcid);
|
cid_prefix = qhd.dcid + CID_PREFIX_OFFSET;
|
||||||
|
AES_ECB_decrypt(&aes_ctx, cid_prefix);
|
||||||
|
|
||||||
psk_index = bpf_map_lookup_elem(&cid_prefix_map, qhd.dcid);
|
psk_index = bpf_map_lookup_elem(&cid_prefix_map, cid_prefix);
|
||||||
if (psk_index != NULL) {
|
if (psk_index != NULL) {
|
||||||
sk_index = *psk_index;
|
sk_index = *psk_index;
|
||||||
|
|
||||||
|
@ -634,9 +637,10 @@ int select_reuseport(struct sk_reuseport_md *reuse_md) {
|
||||||
return SK_DROP;
|
return SK_DROP;
|
||||||
}
|
}
|
||||||
|
|
||||||
AES_ECB_decrypt(&aes_ctx, qhd.dcid);
|
cid_prefix = qhd.dcid + CID_PREFIX_OFFSET;
|
||||||
|
AES_ECB_decrypt(&aes_ctx, cid_prefix);
|
||||||
|
|
||||||
psk_index = bpf_map_lookup_elem(&cid_prefix_map, qhd.dcid);
|
psk_index = bpf_map_lookup_elem(&cid_prefix_map, cid_prefix);
|
||||||
if (psk_index == NULL) {
|
if (psk_index == NULL) {
|
||||||
sk_index = sk_index_from_dcid(&qhd, reuse_md, *pnum_socks);
|
sk_index = sk_index_from_dcid(&qhd, reuse_md, *pnum_socks);
|
||||||
|
|
||||||
|
|
|
@ -1,44 +0,0 @@
|
||||||
# Find the Cython compiler.
|
|
||||||
#
|
|
||||||
# This code sets the following variables:
|
|
||||||
#
|
|
||||||
# CYTHON_EXECUTABLE
|
|
||||||
#
|
|
||||||
# See also UseCython.cmake
|
|
||||||
|
|
||||||
#=============================================================================
|
|
||||||
# Copyright 2011 Kitware, 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.
|
|
||||||
#=============================================================================
|
|
||||||
|
|
||||||
# Use the Cython executable that lives next to the Python executable
|
|
||||||
# if it is a local installation.
|
|
||||||
find_package( PythonInterp )
|
|
||||||
if( PYTHONINTERP_FOUND )
|
|
||||||
get_filename_component( _python_path ${PYTHON_EXECUTABLE} PATH )
|
|
||||||
find_program( CYTHON_EXECUTABLE
|
|
||||||
NAMES cython cython.bat cython3
|
|
||||||
HINTS ${_python_path}
|
|
||||||
)
|
|
||||||
else()
|
|
||||||
find_program( CYTHON_EXECUTABLE
|
|
||||||
NAMES cython cython.bat cython3
|
|
||||||
)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
|
|
||||||
include( FindPackageHandleStandardArgs )
|
|
||||||
FIND_PACKAGE_HANDLE_STANDARD_ARGS( Cython REQUIRED_VARS CYTHON_EXECUTABLE )
|
|
||||||
|
|
||||||
mark_as_advanced( CYTHON_EXECUTABLE )
|
|
|
@ -87,3 +87,6 @@
|
||||||
|
|
||||||
/* Define to 1 if you have enum bpf_stats_type in linux/bpf.h. */
|
/* Define to 1 if you have enum bpf_stats_type in linux/bpf.h. */
|
||||||
#cmakedefine HAVE_BPF_STATS_TYPE 1
|
#cmakedefine HAVE_BPF_STATS_TYPE 1
|
||||||
|
|
||||||
|
/* Define to 1 if you have `libngtcp2_crypto_openssl` library. */
|
||||||
|
#cmakedefine HAVE_LIBNGTCP2_CRYPTO_OPENSSL
|
||||||
|
|
219
configure.ac
219
configure.ac
|
@ -22,10 +22,10 @@ dnl OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||||
dnl WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
dnl WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
|
||||||
dnl Do not change user variables!
|
dnl Do not change user variables!
|
||||||
dnl http://www.gnu.org/software/automake/manual/html_node/Flag-Variables-Ordering.html
|
dnl https://www.gnu.org/software/automake/manual/html_node/Flag-Variables-Ordering.html
|
||||||
|
|
||||||
AC_PREREQ(2.61)
|
AC_PREREQ(2.61)
|
||||||
AC_INIT([nghttp2], [1.45.0], [t-tujikawa@users.sourceforge.net])
|
AC_INIT([nghttp2], [1.52.0-DEV], [t-tujikawa@users.sourceforge.net])
|
||||||
AC_CONFIG_AUX_DIR([.])
|
AC_CONFIG_AUX_DIR([.])
|
||||||
AC_CONFIG_MACRO_DIR([m4])
|
AC_CONFIG_MACRO_DIR([m4])
|
||||||
AC_CONFIG_HEADERS([config.h])
|
AC_CONFIG_HEADERS([config.h])
|
||||||
|
@ -44,9 +44,9 @@ m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])])
|
||||||
|
|
||||||
dnl See versioning rule:
|
dnl See versioning rule:
|
||||||
dnl https://www.gnu.org/software/libtool/manual/html_node/Updating-version-info.html
|
dnl https://www.gnu.org/software/libtool/manual/html_node/Updating-version-info.html
|
||||||
AC_SUBST(LT_CURRENT, 35)
|
AC_SUBST(LT_CURRENT, 38)
|
||||||
AC_SUBST(LT_REVISION, 0)
|
AC_SUBST(LT_REVISION, 1)
|
||||||
AC_SUBST(LT_AGE, 21)
|
AC_SUBST(LT_AGE, 24)
|
||||||
|
|
||||||
major=`echo $PACKAGE_VERSION |cut -d. -f1 | sed -e "s/[^0-9]//g"`
|
major=`echo $PACKAGE_VERSION |cut -d. -f1 | sed -e "s/[^0-9]//g"`
|
||||||
minor=`echo $PACKAGE_VERSION |cut -d. -f2 | sed -e "s/[^0-9]//g"`
|
minor=`echo $PACKAGE_VERSION |cut -d. -f2 | sed -e "s/[^0-9]//g"`
|
||||||
|
@ -82,21 +82,11 @@ AC_ARG_ENABLE([hpack-tools],
|
||||||
[Build HPACK tools [default=check]])],
|
[Build HPACK tools [default=check]])],
|
||||||
[request_hpack_tools=$enableval], [request_hpack_tools=check])
|
[request_hpack_tools=$enableval], [request_hpack_tools=check])
|
||||||
|
|
||||||
AC_ARG_ENABLE([asio-lib],
|
|
||||||
[AS_HELP_STRING([--enable-asio-lib],
|
|
||||||
[Build C++ libnghttp2_asio library [default=no]])],
|
|
||||||
[request_asio_lib=$enableval], [request_asio_lib=no])
|
|
||||||
|
|
||||||
AC_ARG_ENABLE([examples],
|
AC_ARG_ENABLE([examples],
|
||||||
[AS_HELP_STRING([--enable-examples],
|
[AS_HELP_STRING([--enable-examples],
|
||||||
[Build examples [default=check]])],
|
[Build examples [default=check]])],
|
||||||
[request_examples=$enableval], [request_examples=check])
|
[request_examples=$enableval], [request_examples=check])
|
||||||
|
|
||||||
AC_ARG_ENABLE([python-bindings],
|
|
||||||
[AS_HELP_STRING([--enable-python-bindings],
|
|
||||||
[Build Python bindings [default=check]])],
|
|
||||||
[request_python_bindings=$enableval], [request_python_bindings=check])
|
|
||||||
|
|
||||||
AC_ARG_ENABLE([failmalloc],
|
AC_ARG_ENABLE([failmalloc],
|
||||||
[AS_HELP_STRING([--disable-failmalloc],
|
[AS_HELP_STRING([--disable-failmalloc],
|
||||||
[Do not build failmalloc test program])],
|
[Do not build failmalloc test program])],
|
||||||
|
@ -104,7 +94,7 @@ AC_ARG_ENABLE([failmalloc],
|
||||||
|
|
||||||
AC_ARG_ENABLE([lib-only],
|
AC_ARG_ENABLE([lib-only],
|
||||||
[AS_HELP_STRING([--enable-lib-only],
|
[AS_HELP_STRING([--enable-lib-only],
|
||||||
[Build libnghttp2 only. This is a short hand for --disable-app --disable-examples --disable-hpack-tools --disable-python-bindings])],
|
[Build libnghttp2 only. This is a short hand for --disable-app --disable-examples --disable-hpack-tools])],
|
||||||
[request_lib_only=$enableval], [request_lib_only=no])
|
[request_lib_only=$enableval], [request_lib_only=no])
|
||||||
|
|
||||||
AC_ARG_ENABLE([http3],
|
AC_ARG_ENABLE([http3],
|
||||||
|
@ -172,11 +162,6 @@ AC_ARG_WITH([neverbleed],
|
||||||
[Use neverbleed [default=no]])],
|
[Use neverbleed [default=no]])],
|
||||||
[request_neverbleed=$withval], [request_neverbleed=no])
|
[request_neverbleed=$withval], [request_neverbleed=no])
|
||||||
|
|
||||||
AC_ARG_WITH([cython],
|
|
||||||
[AS_HELP_STRING([--with-cython=PATH],
|
|
||||||
[Use cython in given PATH])],
|
|
||||||
[cython_path=$withval], [])
|
|
||||||
|
|
||||||
AC_ARG_WITH([libngtcp2],
|
AC_ARG_WITH([libngtcp2],
|
||||||
[AS_HELP_STRING([--with-libngtcp2],
|
[AS_HELP_STRING([--with-libngtcp2],
|
||||||
[Use libngtcp2 [default=check]])],
|
[Use libngtcp2 [default=check]])],
|
||||||
|
@ -193,8 +178,6 @@ AC_ARG_WITH([libbpf],
|
||||||
[request_libbpf=$withval], [request_libbpf=no])
|
[request_libbpf=$withval], [request_libbpf=no])
|
||||||
|
|
||||||
dnl Define variables
|
dnl Define variables
|
||||||
AC_ARG_VAR([CYTHON], [the Cython executable])
|
|
||||||
|
|
||||||
AC_ARG_VAR([LIBEV_CFLAGS], [C compiler flags for libev, skipping any checks])
|
AC_ARG_VAR([LIBEV_CFLAGS], [C compiler flags for libev, skipping any checks])
|
||||||
AC_ARG_VAR([LIBEV_LIBS], [linker flags for libev, skipping any checks])
|
AC_ARG_VAR([LIBEV_LIBS], [linker flags for libev, skipping any checks])
|
||||||
|
|
||||||
|
@ -224,18 +207,21 @@ if [test "x$request_lib_only" = "xyes"]; then
|
||||||
request_app=no
|
request_app=no
|
||||||
request_hpack_tools=no
|
request_hpack_tools=no
|
||||||
request_examples=no
|
request_examples=no
|
||||||
request_python_bindings=no
|
request_http3=no
|
||||||
fi
|
request_libxml2=no
|
||||||
|
request_jansson=no
|
||||||
if [test "x$request_python_bindings" != "xno"]; then
|
request_zlib=no
|
||||||
AX_PYTHON_DEVEL([>= '3.8'])
|
request_libevent_openssl=no
|
||||||
fi
|
request_libcares=no
|
||||||
|
request_openssl=no
|
||||||
if test "x${cython_path}" = "x"; then
|
request_libev=no
|
||||||
AC_CHECK_PROGS([CYTHON], [cython.py cython])
|
request_jemalloc=no
|
||||||
else
|
request_systemd=no
|
||||||
CYTHON=${cython_path}
|
request_mruby=no
|
||||||
AC_SUBST([CYTHON])
|
request_neverbleed=no
|
||||||
|
request_libngtcp2=no
|
||||||
|
request_libnghttp3=no
|
||||||
|
request_libbpf=no
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if test "x$GCC" = "xyes" -o "x$CC" = "xclang" ; then
|
if test "x$GCC" = "xyes" -o "x$CC" = "xclang" ; then
|
||||||
|
@ -342,8 +328,8 @@ APPLDFLAGS=
|
||||||
case "$host_os" in
|
case "$host_os" in
|
||||||
*android*)
|
*android*)
|
||||||
android_build=yes
|
android_build=yes
|
||||||
# android does not need -pthread, but needs followng 3 libs for C++
|
# android does not need -pthread, but needs following 2 libs for C++
|
||||||
APPLDFLAGS="$APPLDFLAGS -lstdc++ -latomic -lsupc++"
|
APPLDFLAGS="$APPLDFLAGS -lstdc++ -latomic"
|
||||||
;;
|
;;
|
||||||
*)
|
*)
|
||||||
PTHREAD_LDFLAGS="-pthread"
|
PTHREAD_LDFLAGS="-pthread"
|
||||||
|
@ -467,6 +453,7 @@ if test "x${request_openssl}" != "xno"; then
|
||||||
CFLAGS="$OPENSSL_CFLAGS $CFLAGS"
|
CFLAGS="$OPENSSL_CFLAGS $CFLAGS"
|
||||||
LIBS="$OPENSSL_LIBS $LIBS"
|
LIBS="$OPENSSL_LIBS $LIBS"
|
||||||
|
|
||||||
|
# quictls/openssl has SSL_is_quic.
|
||||||
have_ssl_is_quic=no
|
have_ssl_is_quic=no
|
||||||
AC_MSG_CHECKING([for SSL_is_quic])
|
AC_MSG_CHECKING([for SSL_is_quic])
|
||||||
AC_LINK_IFELSE([AC_LANG_PROGRAM([[
|
AC_LINK_IFELSE([AC_LANG_PROGRAM([[
|
||||||
|
@ -478,6 +465,17 @@ if test "x${request_openssl}" != "xno"; then
|
||||||
[AC_MSG_RESULT([yes]); have_ssl_is_quic=yes],
|
[AC_MSG_RESULT([yes]); have_ssl_is_quic=yes],
|
||||||
[AC_MSG_RESULT([no]); have_ssl_is_quic=no])
|
[AC_MSG_RESULT([no]); have_ssl_is_quic=no])
|
||||||
|
|
||||||
|
# boringssl has SSL_set_quic_early_data_context.
|
||||||
|
AC_MSG_CHECKING([for SSL_set_quic_early_data_context])
|
||||||
|
AC_LINK_IFELSE([AC_LANG_PROGRAM([[
|
||||||
|
#include <openssl/ssl.h>
|
||||||
|
]], [[
|
||||||
|
SSL *ssl = NULL;
|
||||||
|
SSL_set_quic_early_data_context(ssl, NULL, 0);
|
||||||
|
]])],
|
||||||
|
[AC_MSG_RESULT([yes]); have_boringssl_quic=yes],
|
||||||
|
[AC_MSG_RESULT([no]); have_boringssl_quic=no])
|
||||||
|
|
||||||
CFLAGS="$save_CFLAGS"
|
CFLAGS="$save_CFLAGS"
|
||||||
LIBS="$save_LIBS"
|
LIBS="$save_LIBS"
|
||||||
fi
|
fi
|
||||||
|
@ -506,7 +504,7 @@ fi
|
||||||
# ngtcp2 (for src)
|
# ngtcp2 (for src)
|
||||||
have_libngtcp2=no
|
have_libngtcp2=no
|
||||||
if test "x${request_libngtcp2}" != "xno"; then
|
if test "x${request_libngtcp2}" != "xno"; then
|
||||||
PKG_CHECK_MODULES([LIBNGTCP2], [libngtcp2 >= 0.0.0], [have_libngtcp2=yes],
|
PKG_CHECK_MODULES([LIBNGTCP2], [libngtcp2 >= 0.10.0], [have_libngtcp2=yes],
|
||||||
[have_libngtcp2=no])
|
[have_libngtcp2=no])
|
||||||
if test "x${have_libngtcp2}" = "xno"; then
|
if test "x${have_libngtcp2}" = "xno"; then
|
||||||
AC_MSG_NOTICE($LIBNGTCP2_PKG_ERRORS)
|
AC_MSG_NOTICE($LIBNGTCP2_PKG_ERRORS)
|
||||||
|
@ -520,25 +518,52 @@ fi
|
||||||
|
|
||||||
# ngtcp2_crypto_openssl (for src)
|
# ngtcp2_crypto_openssl (for src)
|
||||||
have_libngtcp2_crypto_openssl=no
|
have_libngtcp2_crypto_openssl=no
|
||||||
if test "x${request_libngtcp2}" != "xno"; then
|
if test "x${have_ssl_is_quic}" = "xyes" &&
|
||||||
|
test "x${request_libngtcp2}" != "xno"; then
|
||||||
PKG_CHECK_MODULES([LIBNGTCP2_CRYPTO_OPENSSL],
|
PKG_CHECK_MODULES([LIBNGTCP2_CRYPTO_OPENSSL],
|
||||||
[libngtcp2_crypto_openssl >= 0.0.0],
|
[libngtcp2_crypto_openssl >= 0.10.0],
|
||||||
[have_libngtcp2_crypto_openssl=yes],
|
[have_libngtcp2_crypto_openssl=yes],
|
||||||
[have_libngtcp2_crypto_openssl=no])
|
[have_libngtcp2_crypto_openssl=no])
|
||||||
if test "x${have_libngtcp2_crypto_openssl}" = "xno"; then
|
if test "x${have_libngtcp2_crypto_openssl}" = "xno"; then
|
||||||
AC_MSG_NOTICE($LIBNGTCP2_CRYPTO_OPENSSL_PKG_ERRORS)
|
AC_MSG_NOTICE($LIBNGTCP2_CRYPTO_OPENSSL_PKG_ERRORS)
|
||||||
|
else
|
||||||
|
AC_DEFINE([HAVE_LIBNGTCP2_CRYPTO_OPENSSL], [1],
|
||||||
|
[Define to 1 if you have `libngtcp2_crypto_openssl` library.])
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if test "x${request_libngtcp2}" = "xyes" &&
|
if test "x${have_ssl_is_quic}" = "xyes" &&
|
||||||
|
test "x${request_libngtcp2}" = "xyes" &&
|
||||||
test "x${have_libngtcp2_crypto_openssl}" != "xyes"; then
|
test "x${have_libngtcp2_crypto_openssl}" != "xyes"; then
|
||||||
AC_MSG_ERROR([libngtcp2_crypto_openssl was requested (--with-libngtcp2) but not found])
|
AC_MSG_ERROR([libngtcp2_crypto_openssl was requested (--with-libngtcp2) but not found])
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
# ngtcp2_crypto_boringssl (for src)
|
||||||
|
have_libngtcp2_crypto_boringssl=no
|
||||||
|
if test "x${have_boringssl_quic}" = "xyes" &&
|
||||||
|
test "x${request_libngtcp2}" != "xno"; then
|
||||||
|
PKG_CHECK_MODULES([LIBNGTCP2_CRYPTO_BORINGSSL],
|
||||||
|
[libngtcp2_crypto_boringssl >= 0.0.0],
|
||||||
|
[have_libngtcp2_crypto_boringssl=yes],
|
||||||
|
[have_libngtcp2_crypto_boringssl=no])
|
||||||
|
if test "x${have_libngtcp2_crypto_boringssl}" = "xno"; then
|
||||||
|
AC_MSG_NOTICE($LIBNGTCP2_CRYPTO_BORINGSSL_PKG_ERRORS)
|
||||||
|
else
|
||||||
|
AC_DEFINE([HAVE_LIBNGTCP2_CRYPTO_BORINGSSL], [1],
|
||||||
|
[Define to 1 if you have `libngtcp2_crypto_boringssl` library.])
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
if test "x${have_boringssl_quic}" = "xyes" &&
|
||||||
|
test "x${request_libngtcp2}" = "xyes" &&
|
||||||
|
test "x${have_libngtcp2_crypto_boringssl}" != "xyes"; then
|
||||||
|
AC_MSG_ERROR([libngtcp2_crypto_boringssl was requested (--with-libngtcp2) but not found])
|
||||||
|
fi
|
||||||
|
|
||||||
# nghttp3 (for src)
|
# nghttp3 (for src)
|
||||||
have_libnghttp3=no
|
have_libnghttp3=no
|
||||||
if test "x${request_libnghttp3}" != "xno"; then
|
if test "x${request_libnghttp3}" != "xno"; then
|
||||||
PKG_CHECK_MODULES([LIBNGHTTP3], [libnghttp3 >= 0.0.0], [have_libnghttp3=yes],
|
PKG_CHECK_MODULES([LIBNGHTTP3], [libnghttp3 >= 0.7.0], [have_libnghttp3=yes],
|
||||||
[have_libnghttp3=no])
|
[have_libnghttp3=no])
|
||||||
if test "x${have_libnghttp3}" = "xno"; then
|
if test "x${have_libnghttp3}" = "xno"; then
|
||||||
AC_MSG_NOTICE($LIBNGHTTP3_PKG_ERRORS)
|
AC_MSG_NOTICE($LIBNGHTTP3_PKG_ERRORS)
|
||||||
|
@ -553,7 +578,7 @@ fi
|
||||||
# libbpf (for src)
|
# libbpf (for src)
|
||||||
have_libbpf=no
|
have_libbpf=no
|
||||||
if test "x${request_libbpf}" != "xno"; then
|
if test "x${request_libbpf}" != "xno"; then
|
||||||
PKG_CHECK_MODULES([LIBBPF], [libbpf >= 0.4.0], [have_libbpf=yes],
|
PKG_CHECK_MODULES([LIBBPF], [libbpf >= 0.7.0], [have_libbpf=yes],
|
||||||
[have_libbpf=no])
|
[have_libbpf=no])
|
||||||
if test "x${have_libbpf}" = "xyes"; then
|
if test "x${have_libbpf}" = "xyes"; then
|
||||||
AC_DEFINE([HAVE_LIBBPF], [1], [Define to 1 if you have `libbpf` library.])
|
AC_DEFINE([HAVE_LIBBPF], [1], [Define to 1 if you have `libbpf` library.])
|
||||||
|
@ -702,25 +727,6 @@ if test "x${request_jemalloc}" = "xyes" &&
|
||||||
AC_MSG_ERROR([jemalloc was requested (--with-jemalloc) but not found])
|
AC_MSG_ERROR([jemalloc was requested (--with-jemalloc) but not found])
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Check Boost Asio library
|
|
||||||
have_asio_lib=no
|
|
||||||
|
|
||||||
if test "x${request_asio_lib}" = "xyes"; then
|
|
||||||
AX_BOOST_BASE([1.54.0], [have_boost_base=yes], [have_boost_base=no])
|
|
||||||
|
|
||||||
if test "x${have_boost_base}" = "xyes"; then
|
|
||||||
AX_BOOST_ASIO()
|
|
||||||
AX_BOOST_SYSTEM()
|
|
||||||
AX_BOOST_THREAD()
|
|
||||||
|
|
||||||
if test "x${ax_cv_boost_asio}" = "xyes" &&
|
|
||||||
test "x${ax_cv_boost_system}" = "xyes" &&
|
|
||||||
test "x${ax_cv_boost_thread}" = "xyes"; then
|
|
||||||
have_asio_lib=yes
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
# The nghttp, nghttpd and nghttpx under src depend on zlib, OpenSSL,
|
# The nghttp, nghttpd and nghttpx under src depend on zlib, OpenSSL,
|
||||||
# libev, and libc-ares.
|
# libev, and libc-ares.
|
||||||
enable_app=no
|
enable_app=no
|
||||||
|
@ -742,9 +748,11 @@ AM_CONDITIONAL([ENABLE_APP], [ test "x${enable_app}" = "xyes" ])
|
||||||
# Check HTTP/3 support
|
# Check HTTP/3 support
|
||||||
enable_http3=no
|
enable_http3=no
|
||||||
if test "x${request_http3}" != "xno" &&
|
if test "x${request_http3}" != "xno" &&
|
||||||
test "x${have_ssl_is_quic}" = "xyes" &&
|
(test "x${have_ssl_is_quic}" = "xyes" ||
|
||||||
|
test "x${have_boringssl_quic}" = "xyes") &&
|
||||||
test "x${have_libngtcp2}" = "xyes" &&
|
test "x${have_libngtcp2}" = "xyes" &&
|
||||||
test "x${have_libngtcp2_crypto_openssl}" = "xyes" &&
|
(test "x${have_libngtcp2_crypto_openssl}" = "xyes" ||
|
||||||
|
test "x${have_libngtcp2_crypto_boringssl}" = "xyes") &&
|
||||||
test "x${have_libnghttp3}" = "xyes"; then
|
test "x${have_libnghttp3}" = "xyes"; then
|
||||||
enable_http3=yes
|
enable_http3=yes
|
||||||
AC_DEFINE([ENABLE_HTTP3], [1], [Define to 1 if HTTP/3 is enabled.])
|
AC_DEFINE([ENABLE_HTTP3], [1], [Define to 1 if HTTP/3 is enabled.])
|
||||||
|
@ -771,16 +779,6 @@ fi
|
||||||
|
|
||||||
AM_CONDITIONAL([ENABLE_HPACK_TOOLS], [ test "x${enable_hpack_tools}" = "xyes" ])
|
AM_CONDITIONAL([ENABLE_HPACK_TOOLS], [ test "x${enable_hpack_tools}" = "xyes" ])
|
||||||
|
|
||||||
# C++ library libnghttp2_asio
|
|
||||||
|
|
||||||
enable_asio_lib=no
|
|
||||||
if test "x${request_asio_lib}" != "xno" &&
|
|
||||||
test "x${have_asio_lib}" = "xyes"; then
|
|
||||||
enable_asio_lib=yes
|
|
||||||
fi
|
|
||||||
|
|
||||||
AM_CONDITIONAL([ENABLE_ASIO_LIB], [ test "x${enable_asio_lib}" = "xyes" ])
|
|
||||||
|
|
||||||
# The example programs depend on OpenSSL and libevent_openssl
|
# The example programs depend on OpenSSL and libevent_openssl
|
||||||
enable_examples=no
|
enable_examples=no
|
||||||
if test "x${request_examples}" != "xno" &&
|
if test "x${request_examples}" != "xno" &&
|
||||||
|
@ -803,8 +801,7 @@ have_mruby=no
|
||||||
have_neverbleed=no
|
have_neverbleed=no
|
||||||
if test "x${enable_examples}" = "xyes" ||
|
if test "x${enable_examples}" = "xyes" ||
|
||||||
test "x${enable_app}" = "xyes" ||
|
test "x${enable_app}" = "xyes" ||
|
||||||
test "x${enable_hpack_tools}" = "xyes" ||
|
test "x${enable_hpack_tools}" = "xyes"; then
|
||||||
test "x${enable_asio_lib}" = "xyes"; then
|
|
||||||
enable_third_party=yes
|
enable_third_party=yes
|
||||||
|
|
||||||
# mruby (for src/nghttpx)
|
# mruby (for src/nghttpx)
|
||||||
|
@ -829,27 +826,6 @@ AM_CONDITIONAL([ENABLE_THIRD_PARTY], [ test "x${enable_third_party}" = "xyes" ])
|
||||||
AM_CONDITIONAL([HAVE_MRUBY], [test "x${have_mruby}" = "xyes"])
|
AM_CONDITIONAL([HAVE_MRUBY], [test "x${have_mruby}" = "xyes"])
|
||||||
AM_CONDITIONAL([HAVE_NEVERBLEED], [test "x${have_neverbleed}" = "xyes"])
|
AM_CONDITIONAL([HAVE_NEVERBLEED], [test "x${have_neverbleed}" = "xyes"])
|
||||||
|
|
||||||
# Python bindings
|
|
||||||
enable_python_bindings=no
|
|
||||||
if test "x${request_python_bindings}" != "xno" &&
|
|
||||||
test "x${CYTHON}" != "x" &&
|
|
||||||
test "x${PYTHON}" != "x:" &&
|
|
||||||
test "x${PYTHON_VERSION}" != "x"; then
|
|
||||||
enable_python_bindings=yes
|
|
||||||
fi
|
|
||||||
|
|
||||||
if test "x${request_python_bindings}" = "xyes" &&
|
|
||||||
test "x${enable_python_bindings}" != "xyes"; then
|
|
||||||
AC_MSG_ERROR([python bindings were requested (--enable-python-bindings) but dependencies are not met.])
|
|
||||||
fi
|
|
||||||
|
|
||||||
AM_CONDITIONAL([ENABLE_PYTHON_BINDINGS],
|
|
||||||
[test "x${enable_python_bindings}" = "xyes"])
|
|
||||||
|
|
||||||
# Produce cython conditional, so that we can distribute generated C
|
|
||||||
# source
|
|
||||||
AM_CONDITIONAL([HAVE_CYTHON], [test "x${CYTHON}" != "x"])
|
|
||||||
|
|
||||||
# failmalloc tests
|
# failmalloc tests
|
||||||
enable_failmalloc=no
|
enable_failmalloc=no
|
||||||
if test "x${request_failmalloc}" = "xyes"; then
|
if test "x${request_failmalloc}" = "xyes"; then
|
||||||
|
@ -983,34 +959,6 @@ AC_CHECK_DECLS([initgroups], [], [], [[
|
||||||
#include <grp.h>
|
#include <grp.h>
|
||||||
]])
|
]])
|
||||||
|
|
||||||
have_netinet_udp_h_udp_segment=no
|
|
||||||
AC_CHECK_DECL([UDP_SEGMENT], [have_netinet_udp_h_udp_segment=yes],
|
|
||||||
[have_netinet_udp_h_udp_segment=no], [[
|
|
||||||
#include <netinet/udp.h>
|
|
||||||
]])
|
|
||||||
|
|
||||||
if test "x$have_netinet_udp_h_udp_segment" = "xno"; then
|
|
||||||
have_linux_udp_h_udp_segment=no
|
|
||||||
AC_MSG_CHECKING([whether UDP_SEGMENT is defined as 103 in linux/udp.h])
|
|
||||||
AC_RUN_IFELSE([AC_LANG_PROGRAM(
|
|
||||||
[[
|
|
||||||
#include <linux/udp.h>
|
|
||||||
]],
|
|
||||||
[[
|
|
||||||
#if UDP_SEGMENT != 103
|
|
||||||
exit(1)
|
|
||||||
#endif
|
|
||||||
]])],
|
|
||||||
[have_linux_udp_h_udp_segment=yes
|
|
||||||
AC_MSG_RESULT([yes])],
|
|
||||||
[have_linux_udp_h_udp_segment=no
|
|
||||||
AC_MSG_RESULT([no])])
|
|
||||||
|
|
||||||
if test "x$have_linux_udp_h_udp_segment" = "xyes"; then
|
|
||||||
EXTRA_DEFS="$EXTRA_DEFS -DUDP_SEGMENT=103"
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
save_CFLAGS=$CFLAGS
|
save_CFLAGS=$CFLAGS
|
||||||
save_CXXFLAGS=$CXXFLAGS
|
save_CXXFLAGS=$CXXFLAGS
|
||||||
|
|
||||||
|
@ -1124,12 +1072,8 @@ AC_CONFIG_FILES([
|
||||||
tests/testdata/Makefile
|
tests/testdata/Makefile
|
||||||
third-party/Makefile
|
third-party/Makefile
|
||||||
src/Makefile
|
src/Makefile
|
||||||
src/includes/Makefile
|
|
||||||
src/libnghttp2_asio.pc
|
|
||||||
bpf/Makefile
|
bpf/Makefile
|
||||||
examples/Makefile
|
examples/Makefile
|
||||||
python/Makefile
|
|
||||||
python/setup.py
|
|
||||||
integration-tests/Makefile
|
integration-tests/Makefile
|
||||||
integration-tests/config.go
|
integration-tests/config.go
|
||||||
integration-tests/setenv
|
integration-tests/setenv
|
||||||
|
@ -1142,14 +1086,9 @@ AC_CONFIG_FILES([
|
||||||
doc/tutorial-hpack.rst
|
doc/tutorial-hpack.rst
|
||||||
doc/nghttpx-howto.rst
|
doc/nghttpx-howto.rst
|
||||||
doc/h2load-howto.rst
|
doc/h2load-howto.rst
|
||||||
doc/libnghttp2_asio.rst
|
|
||||||
doc/python-apiref.rst
|
|
||||||
doc/building-android-binary.rst
|
doc/building-android-binary.rst
|
||||||
doc/nghttp2.h.rst
|
doc/nghttp2.h.rst
|
||||||
doc/nghttp2ver.h.rst
|
doc/nghttp2ver.h.rst
|
||||||
doc/asio_http2.h.rst
|
|
||||||
doc/asio_http2_server.h.rst
|
|
||||||
doc/asio_http2_client.h.rst
|
|
||||||
doc/contribute.rst
|
doc/contribute.rst
|
||||||
contrib/Makefile
|
contrib/Makefile
|
||||||
script/Makefile
|
script/Makefile
|
||||||
|
@ -1191,10 +1130,6 @@ AC_MSG_NOTICE([summary of build options:
|
||||||
Python:
|
Python:
|
||||||
Python: ${PYTHON}
|
Python: ${PYTHON}
|
||||||
PYTHON_VERSION: ${PYTHON_VERSION}
|
PYTHON_VERSION: ${PYTHON_VERSION}
|
||||||
pyexecdir: ${pyexecdir}
|
|
||||||
PYTHON_CPPFLAGS:${PYTHON_CPPFLAGS}
|
|
||||||
PYTHON_LIBS: ${PYTHON_LIBS}
|
|
||||||
Cython: ${CYTHON}
|
|
||||||
Test:
|
Test:
|
||||||
CUnit: ${have_cunit} (CFLAGS='${CUNIT_CFLAGS}' LIBS='${CUNIT_LIBS}')
|
CUnit: ${have_cunit} (CFLAGS='${CUNIT_CFLAGS}' LIBS='${CUNIT_LIBS}')
|
||||||
Failmalloc: ${enable_failmalloc}
|
Failmalloc: ${enable_failmalloc}
|
||||||
|
@ -1205,6 +1140,7 @@ AC_MSG_NOTICE([summary of build options:
|
||||||
Libc-ares: ${have_libcares} (CFLAGS='${LIBCARES_CFLAGS}' LIBS='${LIBCARES_LIBS}')
|
Libc-ares: ${have_libcares} (CFLAGS='${LIBCARES_CFLAGS}' LIBS='${LIBCARES_LIBS}')
|
||||||
libngtcp2: ${have_libngtcp2} (CFLAGS='${LIBNGTCP2_CFLAGS}' LIBS='${LIBNGTCP2_LIBS}')
|
libngtcp2: ${have_libngtcp2} (CFLAGS='${LIBNGTCP2_CFLAGS}' LIBS='${LIBNGTCP2_LIBS}')
|
||||||
libngtcp2_crypto_openssl: ${have_libngtcp2_crypto_openssl} (CFLAGS='${LIBNGTCP2_CRYPTO_OPENSSL_CFLAGS}' LIBS='${LIBNGTCP2_CRYPTO_OPENSSL_LIBS}')
|
libngtcp2_crypto_openssl: ${have_libngtcp2_crypto_openssl} (CFLAGS='${LIBNGTCP2_CRYPTO_OPENSSL_CFLAGS}' LIBS='${LIBNGTCP2_CRYPTO_OPENSSL_LIBS}')
|
||||||
|
libngtcp2_crypto_boringssl: ${have_libngtcp2_crypto_boringssl} (CFLAGS='${LIBNGTCP2_CRYPTO_BORINGSSL_CFLAGS}' LIBS='${LIBNGTCP2_CRYPTO_BORINGSSL_LIBS}')
|
||||||
libnghttp3: ${have_libnghttp3} (CFLAGS='${LIBNGHTTP3_CFLAGS}' LIBS='${LIBNGHTTP3_LIBS}')
|
libnghttp3: ${have_libnghttp3} (CFLAGS='${LIBNGHTTP3_CFLAGS}' LIBS='${LIBNGHTTP3_LIBS}')
|
||||||
libbpf: ${have_libbpf} (CFLAGS='${LIBBPF_CFLAGS}' LIBS='${LIBBPF_LIBS}')
|
libbpf: ${have_libbpf} (CFLAGS='${LIBBPF_CFLAGS}' LIBS='${LIBBPF_LIBS}')
|
||||||
Libevent(SSL): ${have_libevent_openssl} (CFLAGS='${LIBEVENT_OPENSSL_CFLAGS}' LIBS='${LIBEVENT_OPENSSL_LIBS}')
|
Libevent(SSL): ${have_libevent_openssl} (CFLAGS='${LIBEVENT_OPENSSL_CFLAGS}' LIBS='${LIBEVENT_OPENSSL_LIBS}')
|
||||||
|
@ -1212,11 +1148,6 @@ AC_MSG_NOTICE([summary of build options:
|
||||||
Jemalloc: ${have_jemalloc} (CFLAGS='${JEMALLOC_CFLAGS}' LIBS='${JEMALLOC_LIBS}')
|
Jemalloc: ${have_jemalloc} (CFLAGS='${JEMALLOC_CFLAGS}' LIBS='${JEMALLOC_LIBS}')
|
||||||
Zlib: ${have_zlib} (CFLAGS='${ZLIB_CFLAGS}' LIBS='${ZLIB_LIBS}')
|
Zlib: ${have_zlib} (CFLAGS='${ZLIB_CFLAGS}' LIBS='${ZLIB_LIBS}')
|
||||||
Systemd: ${have_libsystemd} (CFLAGS='${SYSTEMD_CFLAGS}' LIBS='${SYSTEMD_LIBS}')
|
Systemd: ${have_libsystemd} (CFLAGS='${SYSTEMD_CFLAGS}' LIBS='${SYSTEMD_LIBS}')
|
||||||
Boost CPPFLAGS: ${BOOST_CPPFLAGS}
|
|
||||||
Boost LDFLAGS: ${BOOST_LDFLAGS}
|
|
||||||
Boost::ASIO: ${BOOST_ASIO_LIB}
|
|
||||||
Boost::System: ${BOOST_SYSTEM_LIB}
|
|
||||||
Boost::Thread: ${BOOST_THREAD_LIB}
|
|
||||||
Third-party:
|
Third-party:
|
||||||
http-parser: ${enable_third_party}
|
http-parser: ${enable_third_party}
|
||||||
MRuby: ${have_mruby} (CFLAGS='${LIBMRUBY_CFLAGS}' LIBS='${LIBMRUBY_LIBS}')
|
MRuby: ${have_mruby} (CFLAGS='${LIBMRUBY_CFLAGS}' LIBS='${LIBMRUBY_LIBS}')
|
||||||
|
@ -1224,9 +1155,7 @@ AC_MSG_NOTICE([summary of build options:
|
||||||
Features:
|
Features:
|
||||||
Applications: ${enable_app}
|
Applications: ${enable_app}
|
||||||
HPACK tools: ${enable_hpack_tools}
|
HPACK tools: ${enable_hpack_tools}
|
||||||
Libnghttp2_asio:${enable_asio_lib}
|
|
||||||
Examples: ${enable_examples}
|
Examples: ${enable_examples}
|
||||||
Python bindings:${enable_python_bindings}
|
|
||||||
Threading: ${enable_threads}
|
Threading: ${enable_threads}
|
||||||
HTTP/3 (EXPERIMENTAL): ${enable_http3}
|
HTTP/3 (EXPERIMENTAL): ${enable_http3}
|
||||||
])
|
])
|
||||||
|
|
|
@ -30,9 +30,10 @@ import (
|
||||||
"encoding/binary"
|
"encoding/binary"
|
||||||
"flag"
|
"flag"
|
||||||
"fmt"
|
"fmt"
|
||||||
"github.com/bradfitz/gomemcache/memcache"
|
|
||||||
"log"
|
"log"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
"github.com/bradfitz/gomemcache/memcache"
|
||||||
)
|
)
|
||||||
|
|
||||||
func makeKey(len int) []byte {
|
func makeKey(len int) []byte {
|
||||||
|
@ -89,9 +90,7 @@ func main() {
|
||||||
Expiration: int32((*interval) + 300),
|
Expiration: int32((*interval) + 300),
|
||||||
})
|
})
|
||||||
|
|
||||||
select {
|
<-time.After(time.Duration(*interval) * time.Second)
|
||||||
case <-time.After(time.Duration(*interval) * time.Second):
|
|
||||||
}
|
|
||||||
|
|
||||||
// rotate keys. the last key is now encryption key.
|
// rotate keys. the last key is now encryption key.
|
||||||
// generate new key and append it to the last, so that
|
// generate new key and append it to the last, so that
|
||||||
|
|
|
@ -1,15 +1,11 @@
|
||||||
# generated files
|
# generated files
|
||||||
apiref.rst
|
apiref.rst
|
||||||
asio_http2.h.rst
|
|
||||||
asio_http2_client.h.rst
|
|
||||||
asio_http2_server.h.rst
|
|
||||||
building-android-binary.rst
|
building-android-binary.rst
|
||||||
conf.py
|
conf.py
|
||||||
contribute.rst
|
contribute.rst
|
||||||
enums.rst
|
enums.rst
|
||||||
h2load-howto.rst
|
h2load-howto.rst
|
||||||
index.rst
|
index.rst
|
||||||
libnghttp2_asio.rst
|
|
||||||
macros.rst
|
macros.rst
|
||||||
manual/
|
manual/
|
||||||
nghttp2.h.rst
|
nghttp2.h.rst
|
||||||
|
@ -17,7 +13,6 @@ nghttp2_*.rst
|
||||||
nghttp2ver.h.rst
|
nghttp2ver.h.rst
|
||||||
nghttpx-howto.rst
|
nghttpx-howto.rst
|
||||||
package_README.rst
|
package_README.rst
|
||||||
python-apiref.rst
|
|
||||||
tutorial-client.rst
|
tutorial-client.rst
|
||||||
tutorial-hpack.rst
|
tutorial-hpack.rst
|
||||||
tutorial-server.rst
|
tutorial-server.rst
|
||||||
|
|
|
@ -180,8 +180,6 @@ set(EXTRA_DIST
|
||||||
sources/tutorial-hpack.rst
|
sources/tutorial-hpack.rst
|
||||||
sources/nghttpx-howto.rst
|
sources/nghttpx-howto.rst
|
||||||
sources/h2load-howto.rst
|
sources/h2load-howto.rst
|
||||||
sources/libnghttp2_asio.rst
|
|
||||||
sources/python-apiref.rst
|
|
||||||
sources/building-android-binary.rst
|
sources/building-android-binary.rst
|
||||||
sources/contribute.rst
|
sources/contribute.rst
|
||||||
_exts/rubydomain/LICENSE.rubydomain
|
_exts/rubydomain/LICENSE.rubydomain
|
||||||
|
@ -269,7 +267,7 @@ add_custom_command(
|
||||||
apiref.rst
|
apiref.rst
|
||||||
${APIDOCS}
|
${APIDOCS}
|
||||||
COMMAND
|
COMMAND
|
||||||
"${PYTHON_EXECUTABLE}" "${CMAKE_CURRENT_SOURCE_DIR}/mkapiref.py"
|
"${Python3_EXECUTABLE}" "${CMAKE_CURRENT_SOURCE_DIR}/mkapiref.py"
|
||||||
apiref.rst macros.rst enums.rst types.rst .
|
apiref.rst macros.rst enums.rst types.rst .
|
||||||
${apiref_SOURCES}
|
${apiref_SOURCES}
|
||||||
DEPENDS
|
DEPENDS
|
||||||
|
|
|
@ -30,6 +30,7 @@ APIDOCS= \
|
||||||
nghttp2_check_authority.rst \
|
nghttp2_check_authority.rst \
|
||||||
nghttp2_check_header_name.rst \
|
nghttp2_check_header_name.rst \
|
||||||
nghttp2_check_header_value.rst \
|
nghttp2_check_header_value.rst \
|
||||||
|
nghttp2_check_header_value_rfc9113.rst \
|
||||||
nghttp2_check_method.rst \
|
nghttp2_check_method.rst \
|
||||||
nghttp2_check_path.rst \
|
nghttp2_check_path.rst \
|
||||||
nghttp2_hd_deflate_bound.rst \
|
nghttp2_hd_deflate_bound.rst \
|
||||||
|
@ -68,7 +69,9 @@ APIDOCS= \
|
||||||
nghttp2_option_set_no_closed_streams.rst \
|
nghttp2_option_set_no_closed_streams.rst \
|
||||||
nghttp2_option_set_no_http_messaging.rst \
|
nghttp2_option_set_no_http_messaging.rst \
|
||||||
nghttp2_option_set_no_recv_client_magic.rst \
|
nghttp2_option_set_no_recv_client_magic.rst \
|
||||||
|
nghttp2_option_set_no_rfc9113_leading_and_trailing_ws_validation.rst \
|
||||||
nghttp2_option_set_peer_max_concurrent_streams.rst \
|
nghttp2_option_set_peer_max_concurrent_streams.rst \
|
||||||
|
nghttp2_option_set_server_fallback_rfc7540_priorities.rst \
|
||||||
nghttp2_option_set_user_recv_extension_type.rst \
|
nghttp2_option_set_user_recv_extension_type.rst \
|
||||||
nghttp2_option_set_max_outbound_ack.rst \
|
nghttp2_option_set_max_outbound_ack.rst \
|
||||||
nghttp2_option_set_max_settings.rst \
|
nghttp2_option_set_max_settings.rst \
|
||||||
|
@ -106,6 +109,7 @@ APIDOCS= \
|
||||||
nghttp2_session_callbacks_set_send_callback.rst \
|
nghttp2_session_callbacks_set_send_callback.rst \
|
||||||
nghttp2_session_callbacks_set_send_data_callback.rst \
|
nghttp2_session_callbacks_set_send_data_callback.rst \
|
||||||
nghttp2_session_callbacks_set_unpack_extension_callback.rst \
|
nghttp2_session_callbacks_set_unpack_extension_callback.rst \
|
||||||
|
nghttp2_session_change_extpri_stream_priority.rst \
|
||||||
nghttp2_session_change_stream_priority.rst \
|
nghttp2_session_change_stream_priority.rst \
|
||||||
nghttp2_session_check_request_allowed.rst \
|
nghttp2_session_check_request_allowed.rst \
|
||||||
nghttp2_session_check_server_session.rst \
|
nghttp2_session_check_server_session.rst \
|
||||||
|
@ -172,6 +176,7 @@ APIDOCS= \
|
||||||
nghttp2_submit_origin.rst \
|
nghttp2_submit_origin.rst \
|
||||||
nghttp2_submit_ping.rst \
|
nghttp2_submit_ping.rst \
|
||||||
nghttp2_submit_priority.rst \
|
nghttp2_submit_priority.rst \
|
||||||
|
nghttp2_submit_priority_update.rst \
|
||||||
nghttp2_submit_push_promise.rst \
|
nghttp2_submit_push_promise.rst \
|
||||||
nghttp2_submit_request.rst \
|
nghttp2_submit_request.rst \
|
||||||
nghttp2_submit_response.rst \
|
nghttp2_submit_response.rst \
|
||||||
|
@ -201,8 +206,6 @@ EXTRA_DIST = \
|
||||||
sources/tutorial-hpack.rst \
|
sources/tutorial-hpack.rst \
|
||||||
sources/nghttpx-howto.rst \
|
sources/nghttpx-howto.rst \
|
||||||
sources/h2load-howto.rst \
|
sources/h2load-howto.rst \
|
||||||
sources/libnghttp2_asio.rst \
|
|
||||||
sources/python-apiref.rst \
|
|
||||||
sources/building-android-binary.rst \
|
sources/building-android-binary.rst \
|
||||||
sources/contribute.rst \
|
sources/contribute.rst \
|
||||||
sources/security.rst \
|
sources/security.rst \
|
||||||
|
|
|
@ -493,7 +493,7 @@ class RubyModuleIndex(Index):
|
||||||
# list of all modules, sorted by module name
|
# list of all modules, sorted by module name
|
||||||
modules = sorted(_iteritems(self.domain.data['modules']),
|
modules = sorted(_iteritems(self.domain.data['modules']),
|
||||||
key=lambda x: x[0].lower())
|
key=lambda x: x[0].lower())
|
||||||
# sort out collapsable modules
|
# sort out collapsible modules
|
||||||
prev_modname = ''
|
prev_modname = ''
|
||||||
num_toplevels = 0
|
num_toplevels = 0
|
||||||
for modname, (docname, synopsis, platforms, deprecated) in modules:
|
for modname, (docname, synopsis, platforms, deprecated) in modules:
|
||||||
|
|
|
@ -5,13 +5,18 @@ From https://github.com/ryan-roemer/sphinx-bootstrap-theme.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
from os import path
|
from os import path
|
||||||
|
from sys import version_info as python_version
|
||||||
|
|
||||||
import sphinx
|
from sphinx import version_info as sphinx_version
|
||||||
|
from sphinx.locale import _
|
||||||
|
from sphinx.util.logging import getLogger
|
||||||
|
|
||||||
|
|
||||||
__version__ = '0.5.0'
|
__version__ = '1.0.1alpha1'
|
||||||
__version_full__ = __version__
|
__version_full__ = __version__
|
||||||
|
|
||||||
|
logger = getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
def get_html_theme_path():
|
def get_html_theme_path():
|
||||||
"""Return list of HTML theme paths."""
|
"""Return list of HTML theme paths."""
|
||||||
|
@ -19,16 +24,40 @@ def get_html_theme_path():
|
||||||
return cur_dir
|
return cur_dir
|
||||||
|
|
||||||
|
|
||||||
|
def config_initiated(app, config):
|
||||||
|
theme_options = config.html_theme_options or {}
|
||||||
|
if theme_options.get('canonical_url'):
|
||||||
|
logger.warning(
|
||||||
|
_('The canonical_url option is deprecated, use the html_baseurl option from Sphinx instead.')
|
||||||
|
)
|
||||||
|
|
||||||
# See http://www.sphinx-doc.org/en/stable/theming.html#distribute-your-theme-as-a-python-package
|
# See http://www.sphinx-doc.org/en/stable/theming.html#distribute-your-theme-as-a-python-package
|
||||||
def setup(app):
|
def setup(app):
|
||||||
if sphinx.version_info >= (1, 6, 0):
|
if python_version[0] < 3:
|
||||||
# Register the theme that can be referenced without adding a theme path
|
logger.warning("Python 2 is deprecated with sphinx_rtd_theme, update to Python 3")
|
||||||
app.add_html_theme('sphinx_rtd_theme', path.abspath(path.dirname(__file__)))
|
app.require_sphinx('1.6')
|
||||||
|
if sphinx_version <= (2, 0, 0):
|
||||||
|
logger.warning("Sphinx 1.x is deprecated with sphinx_rtd_theme, update to Sphinx 2.x or greater")
|
||||||
|
if not app.config.html_experimental_html5_writer:
|
||||||
|
logger.warning("'html4_writer' is deprecated with sphinx_rtd_theme")
|
||||||
|
else:
|
||||||
|
if app.config.html4_writer:
|
||||||
|
logger.warning("'html4_writer' is deprecated with sphinx_rtd_theme")
|
||||||
|
|
||||||
if sphinx.version_info >= (1, 8, 0):
|
# Register the theme that can be referenced without adding a theme path
|
||||||
|
app.add_html_theme('sphinx_rtd_theme', path.abspath(path.dirname(__file__)))
|
||||||
|
|
||||||
|
if sphinx_version >= (1, 8, 0):
|
||||||
# Add Sphinx message catalog for newer versions of Sphinx
|
# Add Sphinx message catalog for newer versions of Sphinx
|
||||||
# See http://www.sphinx-doc.org/en/master/extdev/appapi.html#sphinx.application.Sphinx.add_message_catalog
|
# See http://www.sphinx-doc.org/en/master/extdev/appapi.html#sphinx.application.Sphinx.add_message_catalog
|
||||||
rtd_locale_path = path.join(path.abspath(path.dirname(__file__)), 'locale')
|
rtd_locale_path = path.join(path.abspath(path.dirname(__file__)), 'locale')
|
||||||
app.add_message_catalog('sphinx', rtd_locale_path)
|
app.add_message_catalog('sphinx', rtd_locale_path)
|
||||||
|
app.connect('config-inited', config_initiated)
|
||||||
|
|
||||||
|
# sphinx emits the permalink icon for headers, so choose one more in keeping with our theme
|
||||||
|
if sphinx_version >= (3, 5, 0):
|
||||||
|
app.config.html_permalinks_icon = "\uf0c1"
|
||||||
|
else:
|
||||||
|
app.config.html_add_permalinks = "\uf0c1"
|
||||||
|
|
||||||
return {'parallel_read_safe': True, 'parallel_write_safe': True}
|
return {'parallel_read_safe': True, 'parallel_write_safe': True}
|
||||||
|
|
|
@ -1,84 +1,77 @@
|
||||||
{# Support for Sphinx 1.3+ page_source_suffix, but don't break old builds. #}
|
{%- if meta is defined and meta is not none %}
|
||||||
|
{%- set check_meta = True %}
|
||||||
|
{%- else %}
|
||||||
|
{%- set check_meta = False %}
|
||||||
|
{%- endif %}
|
||||||
|
|
||||||
{% if page_source_suffix %}
|
{%- if check_meta and 'github_url' in meta %}
|
||||||
{% set suffix = page_source_suffix %}
|
{%- set display_github = True %}
|
||||||
{% else %}
|
{%- endif %}
|
||||||
{% set suffix = source_suffix %}
|
|
||||||
{% endif %}
|
|
||||||
|
|
||||||
{% if meta is defined and meta is not none %}
|
{%- if check_meta and 'bitbucket_url' in meta %}
|
||||||
{% set check_meta = True %}
|
{%- set display_bitbucket = True %}
|
||||||
{% else %}
|
{%- endif %}
|
||||||
{% set check_meta = False %}
|
|
||||||
{% endif %}
|
|
||||||
|
|
||||||
{% if check_meta and 'github_url' in meta %}
|
{%- if check_meta and 'gitlab_url' in meta %}
|
||||||
{% set display_github = True %}
|
{%- set display_gitlab = True %}
|
||||||
{% endif %}
|
{%- endif %}
|
||||||
|
|
||||||
{% if check_meta and 'bitbucket_url' in meta %}
|
{%- set display_vcs_links = display_vcs_links if display_vcs_links is defined else True %}
|
||||||
{% set display_bitbucket = True %}
|
|
||||||
{% endif %}
|
|
||||||
|
|
||||||
{% if check_meta and 'gitlab_url' in meta %}
|
|
||||||
{% set display_gitlab = True %}
|
|
||||||
{% endif %}
|
|
||||||
|
|
||||||
{% set display_vcs_links = display_vcs_links if display_vcs_links is defined else True %}
|
|
||||||
|
|
||||||
<div role="navigation" aria-label="breadcrumbs navigation">
|
|
||||||
|
|
||||||
|
{#- Translators: This is an ARIA section label for page links, including previous/next page link and links to GitHub/GitLab/etc. -#}
|
||||||
|
<div role="navigation" aria-label="{{ _('Page navigation') }}">
|
||||||
<ul class="wy-breadcrumbs">
|
<ul class="wy-breadcrumbs">
|
||||||
{% block breadcrumbs %}
|
{%- block breadcrumbs %}
|
||||||
<li><a href="{{ pathto(master_doc) }}" class="icon icon-home"></a> »</li>
|
<li><a href="{{ pathto(master_doc) }}" class="icon icon-home"></a> »</li>
|
||||||
{% for doc in parents %}
|
{%- for doc in parents %}
|
||||||
<li><a href="{{ doc.link|e }}">{{ doc.title }}</a> »</li>
|
<li><a href="{{ doc.link|e }}">{{ doc.title }}</a> »</li>
|
||||||
{% endfor %}
|
{%- endfor %}
|
||||||
<li>{{ title }}</li>
|
<li>{{ title }}</li>
|
||||||
{% endblock %}
|
{%- endblock %}
|
||||||
{% block breadcrumbs_aside %}
|
{%- block breadcrumbs_aside %}
|
||||||
<li class="wy-breadcrumbs-aside">
|
<li class="wy-breadcrumbs-aside">
|
||||||
{% if hasdoc(pagename) and display_vcs_links %}
|
{%- if hasdoc(pagename) and display_vcs_links %}
|
||||||
{% if display_github %}
|
{%- if display_github %}
|
||||||
{% if check_meta and 'github_url' in meta %}
|
{%- if check_meta and 'github_url' in meta %}
|
||||||
<!-- User defined GitHub URL -->
|
<!-- User defined GitHub URL -->
|
||||||
<a href="{{ meta['github_url'] }}" class="fa fa-github"> {{ _('Edit on GitHub') }}</a>
|
<a href="{{ meta['github_url'] }}" class="fa fa-github"> {{ _('Edit on GitHub') }}</a>
|
||||||
{% else %}
|
{%- else %}
|
||||||
<a href="https://{{ github_host|default("github.com") }}/{{ github_user }}/{{ github_repo }}/{{ theme_vcs_pageview_mode|default("blob") }}/{{ github_version }}{{ conf_py_path }}{{ pagename }}{{ suffix }}" class="fa fa-github"> {{ _('Edit on GitHub') }}</a>
|
<a href="https://{{ github_host|default("github.com") }}/{{ github_user }}/{{ github_repo }}/{{ theme_vcs_pageview_mode or "blob" }}/{{ github_version }}{{ conf_py_path }}{{ pagename }}{{ page_source_suffix }}" class="fa fa-github"> {{ _('Edit on GitHub') }}</a>
|
||||||
{% endif %}
|
{%- endif %}
|
||||||
{% elif display_bitbucket %}
|
{%- elif display_bitbucket %}
|
||||||
{% if check_meta and 'bitbucket_url' in meta %}
|
{%- if check_meta and 'bitbucket_url' in meta %}
|
||||||
<!-- User defined Bitbucket URL -->
|
<!-- User defined Bitbucket URL -->
|
||||||
<a href="{{ meta['bitbucket_url'] }}" class="fa fa-bitbucket"> {{ _('Edit on Bitbucket') }}</a>
|
<a href="{{ meta['bitbucket_url'] }}" class="fa fa-bitbucket"> {{ _('Edit on Bitbucket') }}</a>
|
||||||
{% else %}
|
{%- else %}
|
||||||
<a href="https://bitbucket.org/{{ bitbucket_user }}/{{ bitbucket_repo }}/src/{{ bitbucket_version}}{{ conf_py_path }}{{ pagename }}{{ suffix }}?mode={{ theme_vcs_pageview_mode|default("view") }}" class="fa fa-bitbucket"> {{ _('Edit on Bitbucket') }}</a>
|
<a href="https://bitbucket.org/{{ bitbucket_user }}/{{ bitbucket_repo }}/src/{{ bitbucket_version}}{{ conf_py_path }}{{ pagename }}{{ page_source_suffix }}?mode={{ theme_vcs_pageview_mode or "view" }}" class="fa fa-bitbucket"> {{ _('Edit on Bitbucket') }}</a>
|
||||||
{% endif %}
|
{%- endif %}
|
||||||
{% elif display_gitlab %}
|
{%- elif display_gitlab %}
|
||||||
{% if check_meta and 'gitlab_url' in meta %}
|
{%- if check_meta and 'gitlab_url' in meta %}
|
||||||
<!-- User defined GitLab URL -->
|
<!-- User defined GitLab URL -->
|
||||||
<a href="{{ meta['gitlab_url'] }}" class="fa fa-gitlab"> {{ _('Edit on GitLab') }}</a>
|
<a href="{{ meta['gitlab_url'] }}" class="fa fa-gitlab"> {{ _('Edit on GitLab') }}</a>
|
||||||
{% else %}
|
{%- else %}
|
||||||
<a href="https://{{ gitlab_host|default("gitlab.com") }}/{{ gitlab_user }}/{{ gitlab_repo }}/{{ theme_vcs_pageview_mode|default("blob") }}/{{ gitlab_version }}{{ conf_py_path }}{{ pagename }}{{ suffix }}" class="fa fa-gitlab"> {{ _('Edit on GitLab') }}</a>
|
<a href="https://{{ gitlab_host|default("gitlab.com") }}/{{ gitlab_user }}/{{ gitlab_repo }}/{{ theme_vcs_pageview_mode or "blob" }}/{{ gitlab_version }}{{ conf_py_path }}{{ pagename }}{{ page_source_suffix }}" class="fa fa-gitlab"> {{ _('Edit on GitLab') }}</a>
|
||||||
{% endif %}
|
{%- endif %}
|
||||||
{% elif show_source and source_url_prefix %}
|
{%- elif show_source and source_url_prefix %}
|
||||||
<a href="{{ source_url_prefix }}{{ pagename }}{{ suffix }}">{{ _('View page source') }}</a>
|
<a href="{{ source_url_prefix }}{{ pagename }}{{ page_source_suffix }}">{{ _('View page source') }}</a>
|
||||||
{% elif show_source and has_source and sourcename %}
|
{%- elif show_source and has_source and sourcename %}
|
||||||
<a href="{{ pathto('_sources/' + sourcename, true)|e }}" rel="nofollow"> {{ _('View page source') }}</a>
|
<a href="{{ pathto('_sources/' + sourcename, true)|e }}" rel="nofollow"> {{ _('View page source') }}</a>
|
||||||
{% endif %}
|
{%- endif %}
|
||||||
{% endif %}
|
{%- endif %}
|
||||||
</li>
|
</li>
|
||||||
{% endblock %}
|
{%- endblock %}
|
||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
{% if (theme_prev_next_buttons_location == 'top' or theme_prev_next_buttons_location == 'both') and (next or prev) %}
|
{%- if (theme_prev_next_buttons_location == 'top' or theme_prev_next_buttons_location == 'both') and (next or prev) %}
|
||||||
<div class="rst-breadcrumbs-buttons" role="navigation" aria-label="breadcrumb navigation">
|
{#- Translators: This is an ARIA section label for sequential page links, such as previous and next page links. -#}
|
||||||
{% if next %}
|
<div class="rst-breadcrumbs-buttons" role="navigation" aria-label="{{ _('Sequential page navigation') }}">
|
||||||
<a href="{{ next.link|e }}" class="btn btn-neutral float-right" title="{{ next.title|striptags|e }}" accesskey="n">{{ _('Next') }} <span class="fa fa-arrow-circle-right"></span></a>
|
{%- if prev %}
|
||||||
{% endif %}
|
<a href="{{ prev.link|e }}" class="btn btn-neutral float-left" title="{{ prev.title|striptags|e }}" accesskey="p"><span class="fa fa-arrow-circle-left" aria-hidden="true"></span> {{ _('Previous') }}</a>
|
||||||
{% if prev %}
|
{%- endif %}
|
||||||
<a href="{{ prev.link|e }}" class="btn btn-neutral float-left" title="{{ prev.title|striptags|e }}" accesskey="p"><span class="fa fa-arrow-circle-left"></span> {{ _('Previous') }}</a>
|
{%- if next %}
|
||||||
{% endif %}
|
<a href="{{ next.link|e }}" class="btn btn-neutral float-right" title="{{ next.title|striptags|e }}" accesskey="n">{{ _('Next') }} <span class="fa fa-arrow-circle-right" aria-hidden="true"></span></a>
|
||||||
|
{%- endif %}
|
||||||
</div>
|
</div>
|
||||||
{% endif %}
|
{%- endif %}
|
||||||
<hr/>
|
<hr/>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -1,63 +1,62 @@
|
||||||
<footer>
|
<footer>
|
||||||
{% if (theme_prev_next_buttons_location == 'bottom' or theme_prev_next_buttons_location == 'both') and (next or prev) %}
|
{%- if (theme_prev_next_buttons_location == 'bottom' or theme_prev_next_buttons_location == 'both') and (next or prev) %}
|
||||||
<div class="rst-footer-buttons" role="navigation" aria-label="footer navigation">
|
{#- Translators: This is an ARIA section label for the footer section of the page. -#}
|
||||||
{% if next %}
|
<div class="rst-footer-buttons" role="navigation" aria-label="{{ _('Footer') }}">
|
||||||
<a href="{{ next.link|e }}" class="btn btn-neutral float-right" title="{{ next.title|striptags|e }}" accesskey="n" rel="next">{{ _('Next') }} <span class="fa fa-arrow-circle-right"></span></a>
|
{%- if prev %}
|
||||||
{% endif %}
|
<a href="{{ prev.link|e }}" class="btn btn-neutral float-left" title="{{ prev.title|striptags|e }}" accesskey="p" rel="prev"><span class="fa fa-arrow-circle-left" aria-hidden="true"></span> {{ _('Previous') }}</a>
|
||||||
{% if prev %}
|
{%- endif %}
|
||||||
<a href="{{ prev.link|e }}" class="btn btn-neutral float-left" title="{{ prev.title|striptags|e }}" accesskey="p" rel="prev"><span class="fa fa-arrow-circle-left"></span> {{ _('Previous') }}</a>
|
{%- if next %}
|
||||||
{% endif %}
|
<a href="{{ next.link|e }}" class="btn btn-neutral float-right" title="{{ next.title|striptags|e }}" accesskey="n" rel="next">{{ _('Next') }} <span class="fa fa-arrow-circle-right" aria-hidden="true"></span></a>
|
||||||
|
{%- endif %}
|
||||||
</div>
|
</div>
|
||||||
{% endif %}
|
{%- endif %}
|
||||||
|
|
||||||
<hr/>
|
<hr/>
|
||||||
|
|
||||||
<div role="contentinfo">
|
<div role="contentinfo">
|
||||||
|
{%- block contentinfo %}
|
||||||
<p>
|
<p>
|
||||||
{%- if show_copyright %}
|
{%- if show_copyright %}
|
||||||
{%- if hasdoc('copyright') %}
|
{%- if hasdoc('copyright') %}
|
||||||
{% set path = pathto('copyright') %}
|
{%- trans path=pathto('copyright'), copyright=copyright|e %}© <a href="{{ path }}">Copyright</a> {{ copyright }}.{% endtrans %}
|
||||||
{% set copyright = copyright|e %}
|
|
||||||
© <a href="{{ path }}">{% trans %}Copyright{% endtrans %}</a> {{ copyright }}
|
|
||||||
{%- else %}
|
{%- else %}
|
||||||
{% set copyright = copyright|e %}
|
{%- trans copyright=copyright|e %}© Copyright {{ copyright }}.{% endtrans %}
|
||||||
© {% trans %}Copyright{% endtrans %} {{ copyright }}
|
|
||||||
{%- endif %}
|
{%- endif %}
|
||||||
{%- endif %}
|
{%- endif %}
|
||||||
|
|
||||||
{%- if build_id and build_url %}
|
{%- if build_id and build_url %}
|
||||||
<span class="build">
|
<span class="build">
|
||||||
{# Translators: Build is a noun, not a verb #}
|
{#- Translators: Build is a noun, not a verb -#}
|
||||||
{% trans %}Build{% endtrans %}
|
{%- trans %}Build{% endtrans -%}
|
||||||
<a href="{{ build_url }}">{{ build_id }}</a>.
|
<a href="{{ build_url }}">{{ build_id }}</a>.
|
||||||
</span>
|
</span>
|
||||||
{%- elif commit %}
|
{%- elif commit %}
|
||||||
<span class="commit">
|
<span class="commit">
|
||||||
{# Translators: the phrase "revision" comes from Git, referring to a commit #}
|
{#- Translators: the phrase "revision" comes from Git, referring to a commit #}
|
||||||
{% trans %}Revision{% endtrans %} <code>{{ commit }}</code>.
|
{%- trans %}Revision{% endtrans %} <code>{{ commit }}</code>.
|
||||||
</span>
|
</span>
|
||||||
{%- endif %}
|
{%- endif %}
|
||||||
{%- if last_updated %}
|
{%- if last_updated %}
|
||||||
<span class="lastupdated">
|
<span class="lastupdated">
|
||||||
{% trans last_updated=last_updated|e %}Last updated on {{ last_updated }}.{% endtrans %}
|
{%- trans last_updated=last_updated|e %}Last updated on {{ last_updated }}.{% endtrans %}
|
||||||
</span>
|
</span>
|
||||||
{%- endif %}
|
{%- endif -%}
|
||||||
|
|
||||||
</p>
|
</p>
|
||||||
|
{%- endblock %}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{%- if show_sphinx %}
|
{% if show_sphinx %}
|
||||||
{% set sphinx_web = '<a href="https://www.sphinx-doc.org/">Sphinx</a>' %}
|
{%- set sphinx_web = '<a href="https://www.sphinx-doc.org/">Sphinx</a>' %}
|
||||||
{% set readthedocs_web = '<a href="https://readthedocs.org">Read the Docs</a>' %}
|
{%- set readthedocs_web = '<a href="https://readthedocs.org">Read the Docs</a>' %}
|
||||||
{# Translators: the variable "sphinx_web" is a link to the Sphinx project documentation with the text "Sphinx" #}
|
{#- Translators: the variable "sphinx_web" is a link to the Sphinx project documentation with the text "Sphinx" #}
|
||||||
{% trans sphinx_web=sphinx_web, readthedocs_web=readthedocs_web %}Built with {{ sphinx_web }} using a{% endtrans %}
|
{%- trans sphinx_web=sphinx_web, readthedocs_web=readthedocs_web %}Built with {{ sphinx_web }} using a{% endtrans %}
|
||||||
{# Translators: "theme" refers to a theme for Sphinx, which alters the appearance of the generated documenation #}
|
{#- Translators: "theme" refers to a theme for Sphinx, which alters the appearance of the generated documentation #}
|
||||||
<a href="https://github.com/readthedocs/sphinx_rtd_theme">{% trans %}theme{% endtrans %}</a>
|
<a href="https://github.com/readthedocs/sphinx_rtd_theme">{% trans %}theme{% endtrans %}</a>
|
||||||
{# Translators: this is always used as "provided by Read the Docs", and should not imply Read the Docs is an author of the generated documentation. #}
|
{#- Translators: this is always used as "provided by Read the Docs", and should not imply Read the Docs is an author of the generated documentation. #}
|
||||||
{% trans %}provided by {{ readthedocs_web }}{% endtrans %}.
|
{% trans %}provided by {{ readthedocs_web }}{% endtrans %}.
|
||||||
{%- endif %}
|
{% endif %}
|
||||||
|
|
||||||
{%- block extrafooter %} {% endblock %}
|
{%- block extrafooter %} {% endblock %}
|
||||||
|
|
||||||
</footer>
|
</footer>
|
||||||
|
|
||||||
|
|
|
@ -7,56 +7,74 @@
|
||||||
{%- set titlesuffix = "" %}
|
{%- set titlesuffix = "" %}
|
||||||
{%- endif %}
|
{%- endif %}
|
||||||
{%- set lang_attr = 'en' if language == None else (language | replace('_', '-')) %}
|
{%- set lang_attr = 'en' if language == None else (language | replace('_', '-')) %}
|
||||||
{%- set sphinx_writer = 'writer-html5' if html5_doctype else 'writer-html4' %}
|
{%- set sphinx_writer = 'writer-html5' if html5_doctype else 'writer-html4' -%}
|
||||||
|
|
||||||
|
{# Build sphinx_version_info tuple from sphinx_version string in pure Jinja #}
|
||||||
|
{%- set (_ver_major, _ver_minor, _ver_bugfix) = sphinx_version.split('.') | map('int') -%}
|
||||||
|
{%- set sphinx_version_info = (_ver_major, _ver_minor, _ver_bugfix) -%}
|
||||||
|
|
||||||
<!DOCTYPE html>
|
<!DOCTYPE html>
|
||||||
<html class="{{ sphinx_writer }}" lang="{{ lang_attr }}" >
|
<html class="{{ sphinx_writer }}" lang="{{ lang_attr }}" >
|
||||||
<head>
|
<head>
|
||||||
<meta charset="utf-8">
|
<meta charset="utf-8" />
|
||||||
{{ metatags }}
|
{{- metatags }}
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||||
{% block htmltitle %}
|
{%- block htmltitle %}
|
||||||
<title>{{ title|striptags|e }}{{ titlesuffix }}</title>
|
<title>{{ title|striptags|e }}{{ titlesuffix }}</title>
|
||||||
{% endblock %}
|
{%- endblock -%}
|
||||||
|
|
||||||
{# CSS #}
|
{#- CSS #}
|
||||||
<link rel="stylesheet" href="{{ pathto('_static/' + style, 1) }}" type="text/css" />
|
{%- if sphinx_version_info < (4, 0) -%}
|
||||||
<link rel="stylesheet" href="{{ pathto('_static/pygments.css', 1) }}" type="text/css" />
|
<link rel="stylesheet" href="{{ pathto('_static/' + style, 1) }}" type="text/css" />
|
||||||
|
<link rel="stylesheet" href="{{ pathto('_static/pygments.css', 1) }}" type="text/css" />
|
||||||
|
{%- endif %}
|
||||||
{%- for css in css_files %}
|
{%- for css in css_files %}
|
||||||
{%- if css|attr("rel") %}
|
{%- if css|attr("rel") %}
|
||||||
<link rel="{{ css.rel }}" href="{{ pathto(css.filename, 1) }}" type="text/css"{% if css.title is not none %} title="{{ css.title }}"{% endif %} />
|
<link rel="{{ css.rel }}" href="{{ pathto(css.filename, 1) }}" type="text/css"{% if css.title is not none %} title="{{ css.title }}"{% endif %} />
|
||||||
{%- else %}
|
{%- else %}
|
||||||
<link rel="stylesheet" href="{{ pathto(css, 1) }}" type="text/css" />
|
<link rel="stylesheet" href="{{ pathto(css, 1) }}" type="text/css" />
|
||||||
{%- endif %}
|
{%- endif %}
|
||||||
{%- endfor %}
|
{%- endfor %}
|
||||||
|
|
||||||
{%- for cssfile in extra_css_files %}
|
{%- for cssfile in extra_css_files %}
|
||||||
<link rel="stylesheet" href="{{ pathto(cssfile, 1) }}" type="text/css" />
|
<link rel="stylesheet" href="{{ pathto(cssfile, 1) }}" type="text/css" />
|
||||||
{%- endfor %}
|
{%- endfor -%}
|
||||||
|
|
||||||
{# FAVICON #}
|
{#- FAVICON #}
|
||||||
{% if favicon %}
|
{%- if favicon %}
|
||||||
|
{%- if sphinx_version_info < (4, 0) -%}
|
||||||
<link rel="shortcut icon" href="{{ pathto('_static/' + favicon, 1) }}"/>
|
<link rel="shortcut icon" href="{{ pathto('_static/' + favicon, 1) }}"/>
|
||||||
{% endif %}
|
{%- else %}
|
||||||
{# CANONICAL URL #}
|
<link rel="shortcut icon" href="{{ favicon_url }}"/>
|
||||||
{% if theme_canonical_url %}
|
{%- endif %}
|
||||||
<link rel="canonical" href="{{ theme_canonical_url }}{{ pagename }}.html"/>
|
{%- endif -%}
|
||||||
{% endif %}
|
|
||||||
|
|
||||||
{# JAVASCRIPTS #}
|
{#- CANONICAL URL (deprecated) #}
|
||||||
|
{%- if theme_canonical_url and not pageurl %}
|
||||||
|
<link rel="canonical" href="{{ theme_canonical_url }}{{ pagename }}.html"/>
|
||||||
|
{%- endif -%}
|
||||||
|
|
||||||
|
{#- CANONICAL URL #}
|
||||||
|
{%- if pageurl %}
|
||||||
|
<link rel="canonical" href="{{ pageurl|e }}" />
|
||||||
|
{%- endif -%}
|
||||||
|
|
||||||
|
{#- JAVASCRIPTS #}
|
||||||
{%- block scripts %}
|
{%- block scripts %}
|
||||||
<!--[if lt IE 9]>
|
<!--[if lt IE 9]>
|
||||||
<script src="{{ pathto('_static/js/html5shiv.min.js', 1) }}"></script>
|
<script src="{{ pathto('_static/js/html5shiv.min.js', 1) }}"></script>
|
||||||
<![endif]-->
|
<![endif]-->
|
||||||
{%- if not embedded %}
|
{%- if not embedded %}
|
||||||
{# XXX Sphinx 1.8.0 made this an external js-file, quick fix until we refactor the template to inherert more blocks directly from sphinx #}
|
{# XXX Sphinx 1.8.0 made this an external js-file, quick fix until we refactor the template to inherert more blocks directly from sphinx #}
|
||||||
{% if sphinx_version >= "1.8.0" %}
|
{%- if sphinx_version_info >= (1, 8) -%}
|
||||||
<script type="text/javascript" id="documentation_options" data-url_root="{{ pathto('', 1) }}" src="{{ pathto('_static/documentation_options.js', 1) }}"></script>
|
{%- if sphinx_version_info < (4, 0) -%}
|
||||||
|
<script id="documentation_options" data-url_root="{{ url_root }}" src="{{ pathto('_static/documentation_options.js', 1) }}"></script>
|
||||||
|
{%- endif -%}
|
||||||
{%- for scriptfile in script_files %}
|
{%- for scriptfile in script_files %}
|
||||||
{{ js_tag(scriptfile) }}
|
{{ js_tag(scriptfile) }}
|
||||||
{%- endfor %}
|
{%- endfor %}
|
||||||
{% else %}
|
{%- else %}
|
||||||
<script type="text/javascript">
|
<script>
|
||||||
var DOCUMENTATION_OPTIONS = {
|
var DOCUMENTATION_OPTIONS = {
|
||||||
URL_ROOT:'{{ url_root }}',
|
URL_ROOT:'{{ url_root }}',
|
||||||
VERSION:'{{ release|e }}',
|
VERSION:'{{ release|e }}',
|
||||||
|
@ -68,12 +86,12 @@
|
||||||
};
|
};
|
||||||
</script>
|
</script>
|
||||||
{%- for scriptfile in script_files %}
|
{%- for scriptfile in script_files %}
|
||||||
<script type="text/javascript" src="{{ pathto(scriptfile, 1) }}"></script>
|
<script src="{{ pathto(scriptfile, 1) }}"></script>
|
||||||
{%- endfor %}
|
{%- endfor %}
|
||||||
{% endif %}
|
{%- endif %}
|
||||||
<script type="text/javascript" src="{{ pathto('_static/js/theme.js', 1) }}"></script>
|
<script src="{{ pathto('_static/js/theme.js', 1) }}"></script>
|
||||||
|
|
||||||
{# OPENSEARCH #}
|
{#- OPENSEARCH #}
|
||||||
{%- if use_opensearch %}
|
{%- if use_opensearch %}
|
||||||
<link rel="search" type="application/opensearchdescription+xml"
|
<link rel="search" type="application/opensearchdescription+xml"
|
||||||
title="{% trans docstitle=docstitle|e %}Search within {{ docstitle }}{% endtrans %}"
|
title="{% trans docstitle=docstitle|e %}Search within {{ docstitle }}{% endtrans %}"
|
||||||
|
@ -107,133 +125,131 @@
|
||||||
|
|
||||||
<body class="wy-body-for-nav">
|
<body class="wy-body-for-nav">
|
||||||
|
|
||||||
{% block extrabody %} {% endblock %}
|
{%- block extrabody %} {% endblock %}
|
||||||
<div class="wy-grid-for-nav">
|
<div class="wy-grid-for-nav">
|
||||||
{# SIDE NAV, TOGGLES ON MOBILE #}
|
{#- SIDE NAV, TOGGLES ON MOBILE #}
|
||||||
<nav data-toggle="wy-nav-shift" class="wy-nav-side">
|
<nav data-toggle="wy-nav-shift" class="wy-nav-side">
|
||||||
<div class="wy-side-scroll">
|
<div class="wy-side-scroll">
|
||||||
<div class="wy-side-nav-search" {% if theme_style_nav_header_background %} style="background: {{theme_style_nav_header_background}}" {% endif %}>
|
<div class="wy-side-nav-search" {% if theme_style_nav_header_background %} style="background: {{theme_style_nav_header_background}}" {% endif %}>
|
||||||
{% block sidebartitle %}
|
{%- block sidebartitle %}
|
||||||
|
|
||||||
{% if logo and theme_logo_only %}
|
{%- if logo and theme_logo_only %}
|
||||||
<a href="{{ pathto(master_doc) }}">
|
<a href="{{ pathto(master_doc) }}">
|
||||||
{% else %}
|
{%- else %}
|
||||||
<a href="{{ pathto(master_doc) }}" class="icon icon-home"> {{ project }}
|
<a href="{{ pathto(master_doc) }}" class="icon icon-home"> {{ project }}
|
||||||
{% endif %}
|
{%- endif %}
|
||||||
|
|
||||||
{% if logo %}
|
{%- if logo %}
|
||||||
{# Not strictly valid HTML, but it's the only way to display/scale
|
{#- Not strictly valid HTML, but it's the only way to display/scale
|
||||||
it properly, without weird scripting or heaps of work
|
it properly, without weird scripting or heaps of work
|
||||||
#}
|
#}
|
||||||
|
{%- if sphinx_version_info < (4, 0) -%}
|
||||||
<img src="{{ pathto('_static/' + logo, 1) }}" class="logo" alt="{{ _('Logo') }}"/>
|
<img src="{{ pathto('_static/' + logo, 1) }}" class="logo" alt="{{ _('Logo') }}"/>
|
||||||
{% endif %}
|
{%- else %}
|
||||||
|
<img src="{{ logo_url }}" class="logo" alt="{{ _('Logo') }}"/>
|
||||||
|
{%- endif %}
|
||||||
|
{%- endif %}
|
||||||
</a>
|
</a>
|
||||||
|
|
||||||
{% if theme_display_version %}
|
{%- if theme_display_version %}
|
||||||
{%- set nav_version = version %}
|
{%- set nav_version = version %}
|
||||||
{% if READTHEDOCS and current_version %}
|
{%- if READTHEDOCS and current_version %}
|
||||||
{%- set nav_version = current_version %}
|
{%- set nav_version = current_version %}
|
||||||
{% endif %}
|
{%- endif %}
|
||||||
{% if nav_version %}
|
{%- if nav_version %}
|
||||||
<div class="version">
|
<div class="version">
|
||||||
{{ nav_version }}
|
{{ nav_version }}
|
||||||
</div>
|
</div>
|
||||||
{% endif %}
|
{%- endif %}
|
||||||
{% endif %}
|
{%- endif %}
|
||||||
|
|
||||||
{% include "searchbox.html" %}
|
{%- include "searchbox.html" %}
|
||||||
|
|
||||||
{% endblock %}
|
{%- endblock %}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{% block navigation %}
|
{%- block navigation %}
|
||||||
<div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="main navigation">
|
{#- Translators: This is an ARIA section label for the main navigation menu -#}
|
||||||
{% block menu %}
|
<div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="{{ _('Navigation menu') }}">
|
||||||
{#
|
{%- block menu %}
|
||||||
The singlehtml builder doesn't handle this toctree call when the
|
{%- set toctree = toctree(maxdepth=theme_navigation_depth|int,
|
||||||
toctree is empty. Skip building this for now.
|
collapse=theme_collapse_navigation|tobool,
|
||||||
#}
|
includehidden=theme_includehidden|tobool,
|
||||||
{% if 'singlehtml' not in builder %}
|
titles_only=theme_titles_only|tobool) %}
|
||||||
{% set global_toc = toctree(maxdepth=theme_navigation_depth|int,
|
{%- if toctree %}
|
||||||
collapse=theme_collapse_navigation|tobool,
|
{{ toctree }}
|
||||||
includehidden=theme_includehidden|tobool,
|
{%- else %}
|
||||||
titles_only=theme_titles_only|tobool) %}
|
|
||||||
{% endif %}
|
|
||||||
{% if global_toc %}
|
|
||||||
{{ global_toc }}
|
|
||||||
{% else %}
|
|
||||||
<!-- Local TOC -->
|
<!-- Local TOC -->
|
||||||
<div class="local-toc">{{ toc }}</div>
|
<div class="local-toc">{{ toc }}</div>
|
||||||
{% endif %}
|
{%- endif %}
|
||||||
{% endblock %}
|
{%- endblock %}
|
||||||
</div>
|
</div>
|
||||||
{% endblock %}
|
{%- endblock %}
|
||||||
</div>
|
</div>
|
||||||
</nav>
|
</nav>
|
||||||
|
|
||||||
<section data-toggle="wy-nav-shift" class="wy-nav-content-wrap">
|
<section data-toggle="wy-nav-shift" class="wy-nav-content-wrap">
|
||||||
|
|
||||||
{# MOBILE NAV, TRIGGLES SIDE NAV ON TOGGLE #}
|
{#- MOBILE NAV, TRIGGLES SIDE NAV ON TOGGLE #}
|
||||||
<nav class="wy-nav-top" aria-label="top navigation">
|
{#- Translators: This is an ARIA section label for the navigation menu that is visible when viewing the page on mobile devices -#}
|
||||||
{% block mobile_nav %}
|
<nav class="wy-nav-top" aria-label="{{ _('Mobile navigation menu') }}" {% if theme_style_nav_header_background %} style="background: {{theme_style_nav_header_background}}" {% endif %}>
|
||||||
|
{%- block mobile_nav %}
|
||||||
<i data-toggle="wy-nav-top" class="fa fa-bars"></i>
|
<i data-toggle="wy-nav-top" class="fa fa-bars"></i>
|
||||||
<a href="{{ pathto(master_doc) }}">{{ project }}</a>
|
<a href="{{ pathto(master_doc) }}">{{ project }}</a>
|
||||||
{% endblock %}
|
{%- endblock %}
|
||||||
</nav>
|
</nav>
|
||||||
|
|
||||||
|
|
||||||
<div class="wy-nav-content">
|
<div class="wy-nav-content">
|
||||||
{%- block content %}
|
{%- block content %}
|
||||||
{% if theme_style_external_links|tobool %}
|
{%- if theme_style_external_links|tobool %}
|
||||||
<div class="rst-content style-external-links">
|
<div class="rst-content style-external-links">
|
||||||
{% else %}
|
{%- else %}
|
||||||
<div class="rst-content">
|
<div class="rst-content">
|
||||||
{% endif %}
|
{%- endif %}
|
||||||
{% include "breadcrumbs.html" %}
|
{% include "breadcrumbs.html" %}
|
||||||
<div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article">
|
<div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article">
|
||||||
{%- block document %}
|
{%- block document %}
|
||||||
<div itemprop="articleBody">
|
<div itemprop="articleBody">
|
||||||
{% block body %}{% endblock %}
|
{% block body %}{% endblock %}
|
||||||
</div>
|
</div>
|
||||||
{% if self.comments()|trim %}
|
{%- if self.comments()|trim %}
|
||||||
<div class="articleComments">
|
<div class="articleComments">
|
||||||
{% block comments %}{% endblock %}
|
{%- block comments %}{% endblock %}
|
||||||
</div>
|
</div>
|
||||||
{% endif%}
|
{%- endif%}
|
||||||
</div>
|
</div>
|
||||||
{%- endblock %}
|
{%- endblock %}
|
||||||
{% include "footer.html" %}
|
{% include "footer.html" %}
|
||||||
</div>
|
</div>
|
||||||
{%- endblock %}
|
{%- endblock %}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
{% include "versions.html" %}
|
{% include "versions.html" -%}
|
||||||
|
|
||||||
<script type="text/javascript">
|
<script>
|
||||||
jQuery(function () {
|
jQuery(function () {
|
||||||
SphinxRtdTheme.Navigation.enable({{ 'true' if theme_sticky_navigation|tobool else 'false' }});
|
SphinxRtdTheme.Navigation.enable({{ 'true' if theme_sticky_navigation|tobool else 'false' }});
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
{# Do not conflict with RTD insertion of analytics script #}
|
{#- Do not conflict with RTD insertion of analytics script #}
|
||||||
{% if not READTHEDOCS %}
|
{%- if not READTHEDOCS %}
|
||||||
{% if theme_analytics_id %}
|
{%- if theme_analytics_id %}
|
||||||
<!-- Theme Analytics -->
|
<!-- Theme Analytics -->
|
||||||
|
<script async src="https://www.googletagmanager.com/gtag/js?id={{ theme_analytics_id }}"></script>
|
||||||
<script>
|
<script>
|
||||||
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
|
window.dataLayer = window.dataLayer || [];
|
||||||
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
|
function gtag(){dataLayer.push(arguments);}
|
||||||
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
|
gtag('js', new Date());
|
||||||
})(window,document,'script','https://www.google-analytics.com/analytics.js','ga');
|
|
||||||
|
|
||||||
ga('create', '{{ theme_analytics_id }}', 'auto');
|
gtag('config', '{{ theme_analytics_id }}', {
|
||||||
ga('send', 'pageview');
|
'anonymize_ip': {{ 'true' if theme_analytics_anonymize_ip|tobool else 'false' }},
|
||||||
|
});
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
{% endif %}
|
{%- endif %}
|
||||||
{% endif %}
|
{%- endif %}
|
||||||
|
|
||||||
{%- block footer %} {% endblock %}
|
{%- block footer %} {% endblock %}
|
||||||
|
|
||||||
|
|
Binary file not shown.
|
@ -11,7 +11,7 @@ msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: sphinx_rtd_theme 0.4.3.dev0\n"
|
"Project-Id-Version: sphinx_rtd_theme 0.4.3.dev0\n"
|
||||||
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
|
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
|
||||||
"POT-Creation-Date: 2020-05-06 13:38-0600\n"
|
"POT-Creation-Date: 2021-09-13 13:35-0600\n"
|
||||||
"PO-Revision-Date: 2019-07-16 21:44+0000\n"
|
"PO-Revision-Date: 2019-07-16 21:44+0000\n"
|
||||||
"Last-Translator: Tom Kunze <transifex.com@tomabrafix.de>, 2019\n"
|
"Last-Translator: Tom Kunze <transifex.com@tomabrafix.de>, 2019\n"
|
||||||
"Language-Team: German (https://www.transifex.com/readthedocs/teams/101354/de/)\n"
|
"Language-Team: German (https://www.transifex.com/readthedocs/teams/101354/de/)\n"
|
||||||
|
@ -22,37 +22,32 @@ msgstr ""
|
||||||
"Language: de\n"
|
"Language: de\n"
|
||||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||||
|
|
||||||
#: sphinx_rtd_theme/breadcrumbs.html:43 sphinx_rtd_theme/breadcrumbs.html:45
|
#: sphinx_rtd_theme/breadcrumbs.html:37 sphinx_rtd_theme/breadcrumbs.html:39
|
||||||
msgid "Edit on GitHub"
|
msgid "Edit on GitHub"
|
||||||
msgstr "Auf GitHub bearbeiten"
|
msgstr "Auf GitHub bearbeiten"
|
||||||
|
|
||||||
#: sphinx_rtd_theme/breadcrumbs.html:50 sphinx_rtd_theme/breadcrumbs.html:52
|
#: sphinx_rtd_theme/breadcrumbs.html:44 sphinx_rtd_theme/breadcrumbs.html:46
|
||||||
msgid "Edit on Bitbucket"
|
msgid "Edit on Bitbucket"
|
||||||
msgstr "Auf Bitbucket bearbeiten"
|
msgstr "Auf Bitbucket bearbeiten"
|
||||||
|
|
||||||
#: sphinx_rtd_theme/breadcrumbs.html:57 sphinx_rtd_theme/breadcrumbs.html:59
|
#: sphinx_rtd_theme/breadcrumbs.html:51 sphinx_rtd_theme/breadcrumbs.html:53
|
||||||
msgid "Edit on GitLab"
|
msgid "Edit on GitLab"
|
||||||
msgstr "Auf GitLab bearbeiten"
|
msgstr "Auf GitLab bearbeiten"
|
||||||
|
|
||||||
#: sphinx_rtd_theme/breadcrumbs.html:62 sphinx_rtd_theme/breadcrumbs.html:64
|
#: sphinx_rtd_theme/breadcrumbs.html:56 sphinx_rtd_theme/breadcrumbs.html:58
|
||||||
msgid "View page source"
|
msgid "View page source"
|
||||||
msgstr "Quelltext anzeigen"
|
msgstr "Quelltext anzeigen"
|
||||||
|
|
||||||
#: sphinx_rtd_theme/breadcrumbs.html:74 sphinx_rtd_theme/footer.html:5
|
#: sphinx_rtd_theme/breadcrumbs.html:69 sphinx_rtd_theme/footer.html:6
|
||||||
msgid "Next"
|
|
||||||
msgstr "Weiter"
|
|
||||||
|
|
||||||
#: sphinx_rtd_theme/breadcrumbs.html:77 sphinx_rtd_theme/footer.html:8
|
|
||||||
msgid "Previous"
|
msgid "Previous"
|
||||||
msgstr "Zurück"
|
msgstr "Zurück"
|
||||||
|
|
||||||
#: sphinx_rtd_theme/footer.html:21 sphinx_rtd_theme/footer.html:24
|
#: sphinx_rtd_theme/breadcrumbs.html:72 sphinx_rtd_theme/footer.html:9
|
||||||
#: sphinx_rtd_theme/layout.html:96
|
msgid "Next"
|
||||||
msgid "Copyright"
|
msgstr "Weiter"
|
||||||
msgstr "Copyright"
|
|
||||||
|
|
||||||
#. Build is a noun, not a verb
|
#. Build is a noun, not a verb
|
||||||
#: sphinx_rtd_theme/footer.html:31
|
#: sphinx_rtd_theme/footer.html:30
|
||||||
msgid "Build"
|
msgid "Build"
|
||||||
msgstr "Build"
|
msgstr "Build"
|
||||||
|
|
||||||
|
@ -64,49 +59,53 @@ msgstr "Zuletzt aktualisiert am %(last_updated)s."
|
||||||
#. the variable "sphinx_web" is a link to the Sphinx project documentation
|
#. the variable "sphinx_web" is a link to the Sphinx project documentation
|
||||||
#. with
|
#. with
|
||||||
#. the text "Sphinx"
|
#. the text "Sphinx"
|
||||||
#: sphinx_rtd_theme/footer.html:52
|
#: sphinx_rtd_theme/footer.html:53
|
||||||
#, python-format
|
#, python-format
|
||||||
msgid "Built with %(sphinx_web)s using a"
|
msgid "Built with %(sphinx_web)s using a"
|
||||||
msgstr "Erstellt mit %(sphinx_web)s mit einem"
|
msgstr "Erstellt mit %(sphinx_web)s mit einem"
|
||||||
|
|
||||||
#. this is always used as "provided by Read the Docs", and should not imply
|
#. this is always used as "provided by Read the Docs", and should not imply
|
||||||
#. Read the Docs is an author of the generated documentation.
|
#. Read the Docs is an author of the generated documentation.
|
||||||
#: sphinx_rtd_theme/footer.html:56
|
#: sphinx_rtd_theme/footer.html:57
|
||||||
#, python-format
|
#, python-format
|
||||||
msgid "provided by %(readthedocs_web)s"
|
msgid "provided by %(readthedocs_web)s"
|
||||||
msgstr "bereitgestellt von %(readthedocs_web)s"
|
msgstr "bereitgestellt von %(readthedocs_web)s"
|
||||||
|
|
||||||
#: sphinx_rtd_theme/layout.html:79
|
#: sphinx_rtd_theme/layout.html:97
|
||||||
#, python-format
|
#, python-format
|
||||||
msgid "Search within %(docstitle)s"
|
msgid "Search within %(docstitle)s"
|
||||||
msgstr "%(docstitle)s durchsuchen"
|
msgstr "%(docstitle)s durchsuchen"
|
||||||
|
|
||||||
#: sphinx_rtd_theme/layout.html:87
|
#: sphinx_rtd_theme/layout.html:105
|
||||||
msgid "About these documents"
|
msgid "About these documents"
|
||||||
msgstr "Über diese Dokumentation"
|
msgstr "Über diese Dokumentation"
|
||||||
|
|
||||||
#: sphinx_rtd_theme/layout.html:90
|
#: sphinx_rtd_theme/layout.html:108
|
||||||
msgid "Index"
|
msgid "Index"
|
||||||
msgstr "Index"
|
msgstr "Index"
|
||||||
|
|
||||||
#: sphinx_rtd_theme/layout.html:93 sphinx_rtd_theme/search.html:11
|
#: sphinx_rtd_theme/layout.html:111 sphinx_rtd_theme/search.html:11
|
||||||
msgid "Search"
|
msgid "Search"
|
||||||
msgstr "Suche"
|
msgstr "Suche"
|
||||||
|
|
||||||
#: sphinx_rtd_theme/layout.html:128
|
#: sphinx_rtd_theme/layout.html:114
|
||||||
|
msgid "Copyright"
|
||||||
|
msgstr "Copyright"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/layout.html:147 sphinx_rtd_theme/layout.html:149
|
||||||
msgid "Logo"
|
msgid "Logo"
|
||||||
msgstr "Logo"
|
msgstr "Logo"
|
||||||
|
|
||||||
#: sphinx_rtd_theme/search.html:29
|
#: sphinx_rtd_theme/search.html:31
|
||||||
msgid "Please activate JavaScript to enable the search functionality."
|
msgid "Please activate JavaScript to enable the search functionality."
|
||||||
msgstr "Bitte aktiviere JavaScript, um die Suchfunktion zu nutzen."
|
msgstr "Bitte aktiviere JavaScript, um die Suchfunktion zu nutzen."
|
||||||
|
|
||||||
#. Search is a noun, not a verb
|
#. Search is a noun, not a verb
|
||||||
#: sphinx_rtd_theme/search.html:37
|
#: sphinx_rtd_theme/search.html:39
|
||||||
msgid "Search Results"
|
msgid "Search Results"
|
||||||
msgstr "Suchergebnisse"
|
msgstr "Suchergebnisse"
|
||||||
|
|
||||||
#: sphinx_rtd_theme/search.html:39
|
#: sphinx_rtd_theme/search.html:41
|
||||||
msgid ""
|
msgid ""
|
||||||
"Your search did not match any documents. Please make sure that all words are"
|
"Your search did not match any documents. Please make sure that all words are"
|
||||||
" spelled correctly and that you've selected enough categories."
|
" spelled correctly and that you've selected enough categories."
|
||||||
|
@ -119,7 +118,7 @@ msgstr ""
|
||||||
msgid "Search docs"
|
msgid "Search docs"
|
||||||
msgstr "Dokumentation durchsuchen"
|
msgstr "Dokumentation durchsuchen"
|
||||||
|
|
||||||
#: sphinx_rtd_theme/versions.html:11
|
#: sphinx_rtd_theme/versions.html:3 sphinx_rtd_theme/versions.html:11
|
||||||
msgid "Versions"
|
msgid "Versions"
|
||||||
msgstr "Versionen"
|
msgstr "Versionen"
|
||||||
|
|
||||||
|
@ -135,9 +134,3 @@ msgstr "Projektübersicht"
|
||||||
#: sphinx_rtd_theme/versions.html:29
|
#: sphinx_rtd_theme/versions.html:29
|
||||||
msgid "Builds"
|
msgid "Builds"
|
||||||
msgstr "Builds"
|
msgstr "Builds"
|
||||||
|
|
||||||
#~ msgid "Docs"
|
|
||||||
#~ msgstr "Dokumentation"
|
|
||||||
|
|
||||||
#~ msgid "Free document hosting provided by"
|
|
||||||
#~ msgstr "Kostenloses Dokumentationen-Hosting zur Verfügung gestellt von"
|
|
||||||
|
|
Binary file not shown.
|
@ -8,7 +8,7 @@ msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: sphinx_rtd_theme 0.4.3.dev0\n"
|
"Project-Id-Version: sphinx_rtd_theme 0.4.3.dev0\n"
|
||||||
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
|
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
|
||||||
"POT-Creation-Date: 2020-05-06 13:38-0600\n"
|
"POT-Creation-Date: 2021-09-13 13:35-0600\n"
|
||||||
"PO-Revision-Date: 2019-07-16 15:43-0600\n"
|
"PO-Revision-Date: 2019-07-16 15:43-0600\n"
|
||||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||||
"Language: en\n"
|
"Language: en\n"
|
||||||
|
@ -19,42 +19,64 @@ msgstr ""
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
"Generated-By: Babel 2.8.0\n"
|
"Generated-By: Babel 2.8.0\n"
|
||||||
|
|
||||||
#: sphinx_rtd_theme/breadcrumbs.html:43 sphinx_rtd_theme/breadcrumbs.html:45
|
#. This is an ARIA section label for page links, including previous/next page
|
||||||
|
#. link and links to GitHub/GitLab/etc.
|
||||||
|
#: sphinx_rtd_theme/breadcrumbs.html:22
|
||||||
|
msgid "Page navigation"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/breadcrumbs.html:37 sphinx_rtd_theme/breadcrumbs.html:39
|
||||||
msgid "Edit on GitHub"
|
msgid "Edit on GitHub"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: sphinx_rtd_theme/breadcrumbs.html:50 sphinx_rtd_theme/breadcrumbs.html:52
|
#: sphinx_rtd_theme/breadcrumbs.html:44 sphinx_rtd_theme/breadcrumbs.html:46
|
||||||
msgid "Edit on Bitbucket"
|
msgid "Edit on Bitbucket"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: sphinx_rtd_theme/breadcrumbs.html:57 sphinx_rtd_theme/breadcrumbs.html:59
|
#: sphinx_rtd_theme/breadcrumbs.html:51 sphinx_rtd_theme/breadcrumbs.html:53
|
||||||
msgid "Edit on GitLab"
|
msgid "Edit on GitLab"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: sphinx_rtd_theme/breadcrumbs.html:62 sphinx_rtd_theme/breadcrumbs.html:64
|
#: sphinx_rtd_theme/breadcrumbs.html:56 sphinx_rtd_theme/breadcrumbs.html:58
|
||||||
msgid "View page source"
|
msgid "View page source"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: sphinx_rtd_theme/breadcrumbs.html:74 sphinx_rtd_theme/footer.html:5
|
#. This is an ARIA section label for sequential page links, such as previous
|
||||||
msgid "Next"
|
#. and next page links.
|
||||||
|
#: sphinx_rtd_theme/breadcrumbs.html:67
|
||||||
|
msgid "Sequential page navigation"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: sphinx_rtd_theme/breadcrumbs.html:77 sphinx_rtd_theme/footer.html:8
|
#: sphinx_rtd_theme/breadcrumbs.html:69 sphinx_rtd_theme/footer.html:6
|
||||||
msgid "Previous"
|
msgid "Previous"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: sphinx_rtd_theme/footer.html:21 sphinx_rtd_theme/footer.html:24
|
#: sphinx_rtd_theme/breadcrumbs.html:72 sphinx_rtd_theme/footer.html:9
|
||||||
#: sphinx_rtd_theme/layout.html:96
|
msgid "Next"
|
||||||
msgid "Copyright"
|
msgstr ""
|
||||||
|
|
||||||
|
#. This is an ARIA section label for the footer section of the page.
|
||||||
|
#: sphinx_rtd_theme/footer.html:4
|
||||||
|
msgid "Footer"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/footer.html:21
|
||||||
|
#, python-format
|
||||||
|
msgid "© <a href=\"%(path)s\">Copyright</a> %(copyright)s."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/footer.html:23
|
||||||
|
#, python-format
|
||||||
|
msgid "© Copyright %(copyright)s."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#. Build is a noun, not a verb
|
#. Build is a noun, not a verb
|
||||||
#: sphinx_rtd_theme/footer.html:31
|
#: sphinx_rtd_theme/footer.html:30
|
||||||
msgid "Build"
|
msgid "Build"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#. the phrase "revision" comes from Git, referring to a commit
|
#. the phrase "revision" comes from Git, referring to a commit
|
||||||
#: sphinx_rtd_theme/footer.html:37
|
#: sphinx_rtd_theme/footer.html:36
|
||||||
msgid "Revision"
|
msgid "Revision"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
@ -65,59 +87,70 @@ msgstr ""
|
||||||
|
|
||||||
#. the variable "sphinx_web" is a link to the Sphinx project documentation with
|
#. the variable "sphinx_web" is a link to the Sphinx project documentation with
|
||||||
#. the text "Sphinx"
|
#. the text "Sphinx"
|
||||||
#: sphinx_rtd_theme/footer.html:52
|
#: sphinx_rtd_theme/footer.html:53
|
||||||
#, python-format
|
#, python-format
|
||||||
msgid "Built with %(sphinx_web)s using a"
|
msgid "Built with %(sphinx_web)s using a"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#. "theme" refers to a theme for Sphinx, which alters the appearance of the
|
#. "theme" refers to a theme for Sphinx, which alters the appearance of the
|
||||||
#. generated documenation
|
#. generated documentation
|
||||||
#: sphinx_rtd_theme/footer.html:54
|
#: sphinx_rtd_theme/footer.html:55
|
||||||
msgid "theme"
|
msgid "theme"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#. this is always used as "provided by Read the Docs", and should not imply
|
#. this is always used as "provided by Read the Docs", and should not imply
|
||||||
#. Read the Docs is an author of the generated documentation.
|
#. Read the Docs is an author of the generated documentation.
|
||||||
#: sphinx_rtd_theme/footer.html:56
|
#: sphinx_rtd_theme/footer.html:57
|
||||||
#, python-format
|
#, python-format
|
||||||
msgid "provided by %(readthedocs_web)s"
|
msgid "provided by %(readthedocs_web)s"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: sphinx_rtd_theme/layout.html:79
|
#: sphinx_rtd_theme/layout.html:97
|
||||||
#, python-format
|
#, python-format
|
||||||
msgid "Search within %(docstitle)s"
|
msgid "Search within %(docstitle)s"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: sphinx_rtd_theme/layout.html:87
|
#: sphinx_rtd_theme/layout.html:105
|
||||||
msgid "About these documents"
|
msgid "About these documents"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: sphinx_rtd_theme/layout.html:90
|
#: sphinx_rtd_theme/layout.html:108
|
||||||
msgid "Index"
|
msgid "Index"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: sphinx_rtd_theme/layout.html:93 sphinx_rtd_theme/search.html:11
|
#: sphinx_rtd_theme/layout.html:111 sphinx_rtd_theme/search.html:11
|
||||||
msgid "Search"
|
msgid "Search"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: sphinx_rtd_theme/layout.html:121
|
#: sphinx_rtd_theme/layout.html:114
|
||||||
msgid "Documentation Home"
|
msgid "Copyright"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: sphinx_rtd_theme/layout.html:128
|
#: sphinx_rtd_theme/layout.html:147 sphinx_rtd_theme/layout.html:149
|
||||||
msgid "Logo"
|
msgid "Logo"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: sphinx_rtd_theme/search.html:29
|
#. This is an ARIA section label for the main navigation menu
|
||||||
|
#: sphinx_rtd_theme/layout.html:173
|
||||||
|
msgid "Navigation menu"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. This is an ARIA section label for the navigation menu that is visible when
|
||||||
|
#. viewing the page on mobile devices
|
||||||
|
#: sphinx_rtd_theme/layout.html:195
|
||||||
|
msgid "Mobile navigation menu"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/search.html:31
|
||||||
msgid "Please activate JavaScript to enable the search functionality."
|
msgid "Please activate JavaScript to enable the search functionality."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#. Search is a noun, not a verb
|
#. Search is a noun, not a verb
|
||||||
#: sphinx_rtd_theme/search.html:37
|
#: sphinx_rtd_theme/search.html:39
|
||||||
msgid "Search Results"
|
msgid "Search Results"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: sphinx_rtd_theme/search.html:39
|
#: sphinx_rtd_theme/search.html:41
|
||||||
msgid ""
|
msgid ""
|
||||||
"Your search did not match any documents. Please make sure that all words "
|
"Your search did not match any documents. Please make sure that all words "
|
||||||
"are spelled correctly and that you've selected enough categories."
|
"are spelled correctly and that you've selected enough categories."
|
||||||
|
@ -127,7 +160,7 @@ msgstr ""
|
||||||
msgid "Search docs"
|
msgid "Search docs"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: sphinx_rtd_theme/versions.html:11
|
#: sphinx_rtd_theme/versions.html:3 sphinx_rtd_theme/versions.html:11
|
||||||
msgid "Versions"
|
msgid "Versions"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
@ -154,3 +187,15 @@ msgstr ""
|
||||||
#~ msgid "Free document hosting provided by"
|
#~ msgid "Free document hosting provided by"
|
||||||
#~ msgstr ""
|
#~ msgstr ""
|
||||||
|
|
||||||
|
#~ msgid "Documentation Home"
|
||||||
|
#~ msgstr ""
|
||||||
|
|
||||||
|
#~ msgid "Breadcrumbs"
|
||||||
|
#~ msgstr ""
|
||||||
|
|
||||||
|
#~ msgid "Main"
|
||||||
|
#~ msgstr ""
|
||||||
|
|
||||||
|
#~ msgid "Top"
|
||||||
|
#~ msgstr ""
|
||||||
|
|
||||||
|
|
Binary file not shown.
|
@ -6,15 +6,15 @@
|
||||||
#
|
#
|
||||||
# Translators:
|
# Translators:
|
||||||
# Anthony <aj@ohess.org>, 2019
|
# Anthony <aj@ohess.org>, 2019
|
||||||
# Leonardo J. Caballero G. <leonardocaballero@gmail.com>, 2020
|
# Radina Matic <radina.matic@gmail.com>, 2021
|
||||||
#
|
#
|
||||||
msgid ""
|
msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: sphinx_rtd_theme 0.4.3.dev0\n"
|
"Project-Id-Version: sphinx_rtd_theme 0.4.3.dev0\n"
|
||||||
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
|
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
|
||||||
"POT-Creation-Date: 2020-05-06 13:38-0600\n"
|
"POT-Creation-Date: 2021-09-13 13:35-0600\n"
|
||||||
"PO-Revision-Date: 2019-07-16 21:44+0000\n"
|
"PO-Revision-Date: 2019-07-16 21:44+0000\n"
|
||||||
"Last-Translator: Leonardo J. Caballero G. <leonardocaballero@gmail.com>, 2020\n"
|
"Last-Translator: Radina Matic <radina.matic@gmail.com>, 2021\n"
|
||||||
"Language-Team: Spanish (https://www.transifex.com/readthedocs/teams/101354/es/)\n"
|
"Language-Team: Spanish (https://www.transifex.com/readthedocs/teams/101354/es/)\n"
|
||||||
"MIME-Version: 1.0\n"
|
"MIME-Version: 1.0\n"
|
||||||
"Content-Type: text/plain; charset=UTF-8\n"
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
|
@ -23,107 +23,117 @@ msgstr ""
|
||||||
"Language: es\n"
|
"Language: es\n"
|
||||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||||
|
|
||||||
#: sphinx_rtd_theme/breadcrumbs.html:43 sphinx_rtd_theme/breadcrumbs.html:45
|
#: sphinx_rtd_theme/breadcrumbs.html:37 sphinx_rtd_theme/breadcrumbs.html:39
|
||||||
msgid "Edit on GitHub"
|
msgid "Edit on GitHub"
|
||||||
msgstr "Editar en GitHub"
|
msgstr "Editar en GitHub"
|
||||||
|
|
||||||
#: sphinx_rtd_theme/breadcrumbs.html:50 sphinx_rtd_theme/breadcrumbs.html:52
|
#: sphinx_rtd_theme/breadcrumbs.html:44 sphinx_rtd_theme/breadcrumbs.html:46
|
||||||
msgid "Edit on Bitbucket"
|
msgid "Edit on Bitbucket"
|
||||||
msgstr "Editar en Bitbucket"
|
msgstr "Editar en Bitbucket"
|
||||||
|
|
||||||
#: sphinx_rtd_theme/breadcrumbs.html:57 sphinx_rtd_theme/breadcrumbs.html:59
|
#: sphinx_rtd_theme/breadcrumbs.html:51 sphinx_rtd_theme/breadcrumbs.html:53
|
||||||
msgid "Edit on GitLab"
|
msgid "Edit on GitLab"
|
||||||
msgstr "Editar en GitLab"
|
msgstr "Editar en GitLab"
|
||||||
|
|
||||||
#: sphinx_rtd_theme/breadcrumbs.html:62 sphinx_rtd_theme/breadcrumbs.html:64
|
#: sphinx_rtd_theme/breadcrumbs.html:56 sphinx_rtd_theme/breadcrumbs.html:58
|
||||||
msgid "View page source"
|
msgid "View page source"
|
||||||
msgstr "Ver código fuente de la página"
|
msgstr "Ver código fuente de la página"
|
||||||
|
|
||||||
#: sphinx_rtd_theme/breadcrumbs.html:74 sphinx_rtd_theme/footer.html:5
|
#: sphinx_rtd_theme/breadcrumbs.html:69 sphinx_rtd_theme/footer.html:6
|
||||||
msgid "Next"
|
|
||||||
msgstr "Siguiente"
|
|
||||||
|
|
||||||
#: sphinx_rtd_theme/breadcrumbs.html:77 sphinx_rtd_theme/footer.html:8
|
|
||||||
msgid "Previous"
|
msgid "Previous"
|
||||||
msgstr "Anterior"
|
msgstr "Anterior"
|
||||||
|
|
||||||
#: sphinx_rtd_theme/footer.html:21 sphinx_rtd_theme/footer.html:24
|
#: sphinx_rtd_theme/breadcrumbs.html:72 sphinx_rtd_theme/footer.html:9
|
||||||
#: sphinx_rtd_theme/layout.html:96
|
msgid "Next"
|
||||||
msgid "Copyright"
|
msgstr "Siguiente"
|
||||||
msgstr "Derechos de autor"
|
|
||||||
|
#. This is an ARIA section label for the footer section of the page.
|
||||||
|
#: sphinx_rtd_theme/footer.html:4
|
||||||
|
msgid "Footer"
|
||||||
|
msgstr "Pie de página"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/footer.html:21
|
||||||
|
#, python-format
|
||||||
|
msgid "© <a href=\"%(path)s\">Copyright</a> %(copyright)s."
|
||||||
|
msgstr "© <a href=\"%(path)s\">Derechos de autor</a> %(copyright)s."
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/footer.html:23
|
||||||
|
#, python-format
|
||||||
|
msgid "© Copyright %(copyright)s."
|
||||||
|
msgstr "© Derechos de autor %(copyright)s."
|
||||||
|
|
||||||
#. Build is a noun, not a verb
|
#. Build is a noun, not a verb
|
||||||
#: sphinx_rtd_theme/footer.html:31
|
#: sphinx_rtd_theme/footer.html:30
|
||||||
msgid "Build"
|
msgid "Build"
|
||||||
msgstr "Construido"
|
msgstr "Compilación"
|
||||||
|
|
||||||
#. the phrase "revision" comes from Git, referring to a commit
|
#. the phrase "revision" comes from Git, referring to a commit
|
||||||
#: sphinx_rtd_theme/footer.html:37
|
#: sphinx_rtd_theme/footer.html:36
|
||||||
msgid "Revision"
|
msgid "Revision"
|
||||||
msgstr "Revisión"
|
msgstr "Revisión"
|
||||||
|
|
||||||
#: sphinx_rtd_theme/footer.html:41
|
#: sphinx_rtd_theme/footer.html:41
|
||||||
#, python-format
|
#, python-format
|
||||||
msgid "Last updated on %(last_updated)s."
|
msgid "Last updated on %(last_updated)s."
|
||||||
msgstr "Actualizado por última vez en %(last_updated)s."
|
msgstr "Actualizado por última vez el %(last_updated)s."
|
||||||
|
|
||||||
#. the variable "sphinx_web" is a link to the Sphinx project documentation
|
#. the variable "sphinx_web" is a link to the Sphinx project documentation
|
||||||
#. with
|
#. with
|
||||||
#. the text "Sphinx"
|
#. the text "Sphinx"
|
||||||
#: sphinx_rtd_theme/footer.html:52
|
#: sphinx_rtd_theme/footer.html:53
|
||||||
#, python-format
|
#, python-format
|
||||||
msgid "Built with %(sphinx_web)s using a"
|
msgid "Built with %(sphinx_web)s using a"
|
||||||
msgstr "Construido con %(sphinx_web)s usando un"
|
msgstr "Compilado con %(sphinx_web)s usando un"
|
||||||
|
|
||||||
#. "theme" refers to a theme for Sphinx, which alters the appearance of the
|
#. "theme" refers to a theme for Sphinx, which alters the appearance of the
|
||||||
#. generated documenation
|
#. generated documentation
|
||||||
#: sphinx_rtd_theme/footer.html:54
|
#: sphinx_rtd_theme/footer.html:55
|
||||||
msgid "theme"
|
msgid "theme"
|
||||||
msgstr "tema"
|
msgstr "tema"
|
||||||
|
|
||||||
#. this is always used as "provided by Read the Docs", and should not imply
|
#. this is always used as "provided by Read the Docs", and should not imply
|
||||||
#. Read the Docs is an author of the generated documentation.
|
#. Read the Docs is an author of the generated documentation.
|
||||||
#: sphinx_rtd_theme/footer.html:56
|
#: sphinx_rtd_theme/footer.html:57
|
||||||
#, python-format
|
#, python-format
|
||||||
msgid "provided by %(readthedocs_web)s"
|
msgid "provided by %(readthedocs_web)s"
|
||||||
msgstr "proporcionado por %(readthedocs_web)s"
|
msgstr "proporcionado por %(readthedocs_web)s"
|
||||||
|
|
||||||
#: sphinx_rtd_theme/layout.html:79
|
#: sphinx_rtd_theme/layout.html:97
|
||||||
#, python-format
|
#, python-format
|
||||||
msgid "Search within %(docstitle)s"
|
msgid "Search within %(docstitle)s"
|
||||||
msgstr "Buscar en %(docstitle)s"
|
msgstr "Buscar en %(docstitle)s"
|
||||||
|
|
||||||
#: sphinx_rtd_theme/layout.html:87
|
#: sphinx_rtd_theme/layout.html:105
|
||||||
msgid "About these documents"
|
msgid "About these documents"
|
||||||
msgstr "Sobre esta documentación"
|
msgstr "Sobre esta documentación"
|
||||||
|
|
||||||
#: sphinx_rtd_theme/layout.html:90
|
#: sphinx_rtd_theme/layout.html:108
|
||||||
msgid "Index"
|
msgid "Index"
|
||||||
msgstr "Índice"
|
msgstr "Índice"
|
||||||
|
|
||||||
#: sphinx_rtd_theme/layout.html:93 sphinx_rtd_theme/search.html:11
|
#: sphinx_rtd_theme/layout.html:111 sphinx_rtd_theme/search.html:11
|
||||||
msgid "Search"
|
msgid "Search"
|
||||||
msgstr "Búsqueda"
|
msgstr "Búsqueda"
|
||||||
|
|
||||||
#: sphinx_rtd_theme/layout.html:121
|
#: sphinx_rtd_theme/layout.html:114
|
||||||
msgid "Documentation Home"
|
msgid "Copyright"
|
||||||
msgstr "Inicio de Documentación"
|
msgstr "Derechos de autor"
|
||||||
|
|
||||||
#: sphinx_rtd_theme/layout.html:128
|
#: sphinx_rtd_theme/layout.html:147 sphinx_rtd_theme/layout.html:149
|
||||||
msgid "Logo"
|
msgid "Logo"
|
||||||
msgstr "Logotipo"
|
msgstr "Logotipo"
|
||||||
|
|
||||||
#: sphinx_rtd_theme/search.html:29
|
#: sphinx_rtd_theme/search.html:31
|
||||||
msgid "Please activate JavaScript to enable the search functionality."
|
msgid "Please activate JavaScript to enable the search functionality."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Por favor, active JavaScript para habilitar la funcionalidad de búsqueda."
|
"Por favor, active JavaScript para habilitar la funcionalidad de búsqueda."
|
||||||
|
|
||||||
#. Search is a noun, not a verb
|
#. Search is a noun, not a verb
|
||||||
#: sphinx_rtd_theme/search.html:37
|
#: sphinx_rtd_theme/search.html:39
|
||||||
msgid "Search Results"
|
msgid "Search Results"
|
||||||
msgstr "Resultados de la búsqueda"
|
msgstr "Resultados de la búsqueda"
|
||||||
|
|
||||||
#: sphinx_rtd_theme/search.html:39
|
#: sphinx_rtd_theme/search.html:41
|
||||||
msgid ""
|
msgid ""
|
||||||
"Your search did not match any documents. Please make sure that all words are"
|
"Your search did not match any documents. Please make sure that all words are"
|
||||||
" spelled correctly and that you've selected enough categories."
|
" spelled correctly and that you've selected enough categories."
|
||||||
|
@ -136,7 +146,7 @@ msgstr ""
|
||||||
msgid "Search docs"
|
msgid "Search docs"
|
||||||
msgstr "Buscar documentos"
|
msgstr "Buscar documentos"
|
||||||
|
|
||||||
#: sphinx_rtd_theme/versions.html:11
|
#: sphinx_rtd_theme/versions.html:3 sphinx_rtd_theme/versions.html:11
|
||||||
msgid "Versions"
|
msgid "Versions"
|
||||||
msgstr "Versiones"
|
msgstr "Versiones"
|
||||||
|
|
||||||
|
@ -155,10 +165,4 @@ msgstr "Página de Proyecto"
|
||||||
|
|
||||||
#: sphinx_rtd_theme/versions.html:29
|
#: sphinx_rtd_theme/versions.html:29
|
||||||
msgid "Builds"
|
msgid "Builds"
|
||||||
msgstr "Construcciones"
|
msgstr "Compilaciones"
|
||||||
|
|
||||||
#~ msgid "Docs"
|
|
||||||
#~ msgstr "Documentos"
|
|
||||||
|
|
||||||
#~ msgid "Free document hosting provided by"
|
|
||||||
#~ msgstr "Alojamiento gratuito de documentos proporcionado por"
|
|
||||||
|
|
Binary file not shown.
|
@ -6,15 +6,15 @@
|
||||||
#
|
#
|
||||||
# Translators:
|
# Translators:
|
||||||
# Anthony <aj@ohess.org>, 2020
|
# Anthony <aj@ohess.org>, 2020
|
||||||
# Ivar Smolin <okul@linux.ee>, 2020
|
# Ivar Smolin <okul@linux.ee>, 2021
|
||||||
#
|
#
|
||||||
msgid ""
|
msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: sphinx_rtd_theme 0.4.3.dev0\n"
|
"Project-Id-Version: sphinx_rtd_theme 0.4.3.dev0\n"
|
||||||
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
|
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
|
||||||
"POT-Creation-Date: 2020-05-06 13:38-0600\n"
|
"POT-Creation-Date: 2021-09-13 13:35-0600\n"
|
||||||
"PO-Revision-Date: 2019-07-16 21:44+0000\n"
|
"PO-Revision-Date: 2019-07-16 21:44+0000\n"
|
||||||
"Last-Translator: Ivar Smolin <okul@linux.ee>, 2020\n"
|
"Last-Translator: Ivar Smolin <okul@linux.ee>, 2021\n"
|
||||||
"Language-Team: Estonian (https://www.transifex.com/readthedocs/teams/101354/et/)\n"
|
"Language-Team: Estonian (https://www.transifex.com/readthedocs/teams/101354/et/)\n"
|
||||||
"MIME-Version: 1.0\n"
|
"MIME-Version: 1.0\n"
|
||||||
"Content-Type: text/plain; charset=UTF-8\n"
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
|
@ -23,42 +23,52 @@ msgstr ""
|
||||||
"Language: et\n"
|
"Language: et\n"
|
||||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||||
|
|
||||||
#: sphinx_rtd_theme/breadcrumbs.html:43 sphinx_rtd_theme/breadcrumbs.html:45
|
#: sphinx_rtd_theme/breadcrumbs.html:37 sphinx_rtd_theme/breadcrumbs.html:39
|
||||||
msgid "Edit on GitHub"
|
msgid "Edit on GitHub"
|
||||||
msgstr "Muuda GitHubis"
|
msgstr "Muuda GitHubis"
|
||||||
|
|
||||||
#: sphinx_rtd_theme/breadcrumbs.html:50 sphinx_rtd_theme/breadcrumbs.html:52
|
#: sphinx_rtd_theme/breadcrumbs.html:44 sphinx_rtd_theme/breadcrumbs.html:46
|
||||||
msgid "Edit on Bitbucket"
|
msgid "Edit on Bitbucket"
|
||||||
msgstr "Muuda Bitbucketis"
|
msgstr "Muuda Bitbucketis"
|
||||||
|
|
||||||
#: sphinx_rtd_theme/breadcrumbs.html:57 sphinx_rtd_theme/breadcrumbs.html:59
|
#: sphinx_rtd_theme/breadcrumbs.html:51 sphinx_rtd_theme/breadcrumbs.html:53
|
||||||
msgid "Edit on GitLab"
|
msgid "Edit on GitLab"
|
||||||
msgstr "Muuda GitLabis"
|
msgstr "Muuda GitLabis"
|
||||||
|
|
||||||
#: sphinx_rtd_theme/breadcrumbs.html:62 sphinx_rtd_theme/breadcrumbs.html:64
|
#: sphinx_rtd_theme/breadcrumbs.html:56 sphinx_rtd_theme/breadcrumbs.html:58
|
||||||
msgid "View page source"
|
msgid "View page source"
|
||||||
msgstr "Vaata lehe lähtekoodi"
|
msgstr "Vaata lehe lähtekoodi"
|
||||||
|
|
||||||
#: sphinx_rtd_theme/breadcrumbs.html:74 sphinx_rtd_theme/footer.html:5
|
#: sphinx_rtd_theme/breadcrumbs.html:69 sphinx_rtd_theme/footer.html:6
|
||||||
msgid "Next"
|
|
||||||
msgstr "Järgmine"
|
|
||||||
|
|
||||||
#: sphinx_rtd_theme/breadcrumbs.html:77 sphinx_rtd_theme/footer.html:8
|
|
||||||
msgid "Previous"
|
msgid "Previous"
|
||||||
msgstr "Eelmine"
|
msgstr "Eelmine"
|
||||||
|
|
||||||
#: sphinx_rtd_theme/footer.html:21 sphinx_rtd_theme/footer.html:24
|
#: sphinx_rtd_theme/breadcrumbs.html:72 sphinx_rtd_theme/footer.html:9
|
||||||
#: sphinx_rtd_theme/layout.html:96
|
msgid "Next"
|
||||||
msgid "Copyright"
|
msgstr "Järgmine"
|
||||||
msgstr "Autoriõigus"
|
|
||||||
|
#. This is an ARIA section label for the footer section of the page.
|
||||||
|
#: sphinx_rtd_theme/footer.html:4
|
||||||
|
msgid "Footer"
|
||||||
|
msgstr "Jalus"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/footer.html:21
|
||||||
|
#, python-format
|
||||||
|
msgid "© <a href=\"%(path)s\">Copyright</a> %(copyright)s."
|
||||||
|
msgstr "© <a href=\"%(path)s\">Autoriõigus</a> %(copyright)s."
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/footer.html:23
|
||||||
|
#, python-format
|
||||||
|
msgid "© Copyright %(copyright)s."
|
||||||
|
msgstr "© Autoriõigus %(copyright)s."
|
||||||
|
|
||||||
#. Build is a noun, not a verb
|
#. Build is a noun, not a verb
|
||||||
#: sphinx_rtd_theme/footer.html:31
|
#: sphinx_rtd_theme/footer.html:30
|
||||||
msgid "Build"
|
msgid "Build"
|
||||||
msgstr "Ehitus"
|
msgstr "Ehitus"
|
||||||
|
|
||||||
#. the phrase "revision" comes from Git, referring to a commit
|
#. the phrase "revision" comes from Git, referring to a commit
|
||||||
#: sphinx_rtd_theme/footer.html:37
|
#: sphinx_rtd_theme/footer.html:36
|
||||||
msgid "Revision"
|
msgid "Revision"
|
||||||
msgstr "Redaktsioon"
|
msgstr "Redaktsioon"
|
||||||
|
|
||||||
|
@ -70,52 +80,59 @@ msgstr "Viimati uuendatud %(last_updated)s."
|
||||||
#. the variable "sphinx_web" is a link to the Sphinx project documentation
|
#. the variable "sphinx_web" is a link to the Sphinx project documentation
|
||||||
#. with
|
#. with
|
||||||
#. the text "Sphinx"
|
#. the text "Sphinx"
|
||||||
#: sphinx_rtd_theme/footer.html:52
|
#: sphinx_rtd_theme/footer.html:53
|
||||||
#, python-format
|
#, python-format
|
||||||
msgid "Built with %(sphinx_web)s using a"
|
msgid "Built with %(sphinx_web)s using a"
|
||||||
msgstr "Ehitatud %(sphinx_web)s'iga,"
|
msgstr "Ehitatud %(sphinx_web)s'iga,"
|
||||||
|
|
||||||
#. "theme" refers to a theme for Sphinx, which alters the appearance of the
|
#. "theme" refers to a theme for Sphinx, which alters the appearance of the
|
||||||
#. generated documenation
|
#. generated documenation
|
||||||
#: sphinx_rtd_theme/footer.html:54
|
#: sphinx_rtd_theme/footer.html:55
|
||||||
msgid "theme"
|
msgid "theme"
|
||||||
msgstr "kujundusteema"
|
msgstr "kujundusteema"
|
||||||
|
|
||||||
#: sphinx_rtd_theme/layout.html:79
|
#. this is always used as "provided by Read the Docs", and should not imply
|
||||||
|
#. Read the Docs is an author of the generated documentation.
|
||||||
|
#: sphinx_rtd_theme/footer.html:57
|
||||||
|
#, python-format
|
||||||
|
msgid "provided by %(readthedocs_web)s"
|
||||||
|
msgstr "on loonud %(readthedocs_web)s"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/layout.html:97
|
||||||
#, python-format
|
#, python-format
|
||||||
msgid "Search within %(docstitle)s"
|
msgid "Search within %(docstitle)s"
|
||||||
msgstr "Otsi dokumendist %(docstitle)s"
|
msgstr "Otsi dokumendist %(docstitle)s"
|
||||||
|
|
||||||
#: sphinx_rtd_theme/layout.html:87
|
#: sphinx_rtd_theme/layout.html:105
|
||||||
msgid "About these documents"
|
msgid "About these documents"
|
||||||
msgstr "Nende dokumentide kirjeldused"
|
msgstr "Nende dokumentide kirjeldused"
|
||||||
|
|
||||||
#: sphinx_rtd_theme/layout.html:90
|
#: sphinx_rtd_theme/layout.html:108
|
||||||
msgid "Index"
|
msgid "Index"
|
||||||
msgstr "Indeks"
|
msgstr "Indeks"
|
||||||
|
|
||||||
#: sphinx_rtd_theme/layout.html:93 sphinx_rtd_theme/search.html:11
|
#: sphinx_rtd_theme/layout.html:111 sphinx_rtd_theme/search.html:11
|
||||||
msgid "Search"
|
msgid "Search"
|
||||||
msgstr "Otsing"
|
msgstr "Otsing"
|
||||||
|
|
||||||
#: sphinx_rtd_theme/layout.html:121
|
#: sphinx_rtd_theme/layout.html:114
|
||||||
msgid "Documentation Home"
|
msgid "Copyright"
|
||||||
msgstr "Dokumentatsiooni kodu"
|
msgstr "Autoriõigus"
|
||||||
|
|
||||||
#: sphinx_rtd_theme/layout.html:128
|
#: sphinx_rtd_theme/layout.html:147 sphinx_rtd_theme/layout.html:149
|
||||||
msgid "Logo"
|
msgid "Logo"
|
||||||
msgstr "Logo"
|
msgstr "Logo"
|
||||||
|
|
||||||
#: sphinx_rtd_theme/search.html:29
|
#: sphinx_rtd_theme/search.html:31
|
||||||
msgid "Please activate JavaScript to enable the search functionality."
|
msgid "Please activate JavaScript to enable the search functionality."
|
||||||
msgstr "Otsimisfunktsiooni lubamiseks aktiveeri palun JavaScript"
|
msgstr "Otsimisfunktsiooni lubamiseks aktiveeri palun JavaScript"
|
||||||
|
|
||||||
#. Search is a noun, not a verb
|
#. Search is a noun, not a verb
|
||||||
#: sphinx_rtd_theme/search.html:37
|
#: sphinx_rtd_theme/search.html:39
|
||||||
msgid "Search Results"
|
msgid "Search Results"
|
||||||
msgstr "Otsingu tulemused"
|
msgstr "Otsingu tulemused"
|
||||||
|
|
||||||
#: sphinx_rtd_theme/search.html:39
|
#: sphinx_rtd_theme/search.html:41
|
||||||
msgid ""
|
msgid ""
|
||||||
"Your search did not match any documents. Please make sure that all words are"
|
"Your search did not match any documents. Please make sure that all words are"
|
||||||
" spelled correctly and that you've selected enough categories."
|
" spelled correctly and that you've selected enough categories."
|
||||||
|
@ -127,7 +144,7 @@ msgstr ""
|
||||||
msgid "Search docs"
|
msgid "Search docs"
|
||||||
msgstr "Otsi dokumente"
|
msgstr "Otsi dokumente"
|
||||||
|
|
||||||
#: sphinx_rtd_theme/versions.html:11
|
#: sphinx_rtd_theme/versions.html:3 sphinx_rtd_theme/versions.html:11
|
||||||
msgid "Versions"
|
msgid "Versions"
|
||||||
msgstr "Versioonid"
|
msgstr "Versioonid"
|
||||||
|
|
||||||
|
@ -147,9 +164,3 @@ msgstr "Projekti kodu"
|
||||||
#: sphinx_rtd_theme/versions.html:29
|
#: sphinx_rtd_theme/versions.html:29
|
||||||
msgid "Builds"
|
msgid "Builds"
|
||||||
msgstr "Ehitused"
|
msgstr "Ehitused"
|
||||||
|
|
||||||
#~ msgid "Docs"
|
|
||||||
#~ msgstr "Dokumendid"
|
|
||||||
|
|
||||||
#~ msgid "Free document hosting provided by"
|
|
||||||
#~ msgstr "Dokumentatsiooni majutab tasuta"
|
|
||||||
|
|
Binary file not shown.
|
@ -0,0 +1,160 @@
|
||||||
|
# English translations for sphinx_rtd_theme.
|
||||||
|
# Copyright (C) 2019 ORGANIZATION
|
||||||
|
# This file is distributed under the same license as the sphinx_rtd_theme
|
||||||
|
# project.
|
||||||
|
# FIRST AUTHOR <EMAIL@ADDRESS>, 2019.
|
||||||
|
#
|
||||||
|
# Translators:
|
||||||
|
# Anthony <aj@ohess.org>, 2021
|
||||||
|
#
|
||||||
|
msgid ""
|
||||||
|
msgstr ""
|
||||||
|
"Project-Id-Version: sphinx_rtd_theme 0.4.3.dev0\n"
|
||||||
|
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
|
||||||
|
"POT-Creation-Date: 2021-09-13 13:35-0600\n"
|
||||||
|
"PO-Revision-Date: 2019-07-16 21:44+0000\n"
|
||||||
|
"Last-Translator: Anthony <aj@ohess.org>, 2021\n"
|
||||||
|
"Language-Team: Persian (Iran) (https://www.transifex.com/readthedocs/teams/101354/fa_IR/)\n"
|
||||||
|
"MIME-Version: 1.0\n"
|
||||||
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
|
"Generated-By: Babel 2.8.0\n"
|
||||||
|
"Language: fa_IR\n"
|
||||||
|
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/breadcrumbs.html:37 sphinx_rtd_theme/breadcrumbs.html:39
|
||||||
|
msgid "Edit on GitHub"
|
||||||
|
msgstr "ویرایش در GitHub"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/breadcrumbs.html:44 sphinx_rtd_theme/breadcrumbs.html:46
|
||||||
|
msgid "Edit on Bitbucket"
|
||||||
|
msgstr "ویرایش در Bitbucket"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/breadcrumbs.html:51 sphinx_rtd_theme/breadcrumbs.html:53
|
||||||
|
msgid "Edit on GitLab"
|
||||||
|
msgstr "ویرایش در GitLab"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/breadcrumbs.html:56 sphinx_rtd_theme/breadcrumbs.html:58
|
||||||
|
msgid "View page source"
|
||||||
|
msgstr "نمایش متن منبع صفحه"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/breadcrumbs.html:69 sphinx_rtd_theme/footer.html:6
|
||||||
|
msgid "Previous"
|
||||||
|
msgstr "پیشین"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/breadcrumbs.html:72 sphinx_rtd_theme/footer.html:9
|
||||||
|
msgid "Next"
|
||||||
|
msgstr "بعدی"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/footer.html:21
|
||||||
|
#, python-format
|
||||||
|
msgid "© <a href=\"%(path)s\">Copyright</a> %(copyright)s."
|
||||||
|
msgstr "© <a href=\"%(path)s\">حق انتشار</a> %(copyright)s."
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/footer.html:23
|
||||||
|
#, python-format
|
||||||
|
msgid "© Copyright %(copyright)s."
|
||||||
|
msgstr "© حق انتشار%(copyright)s."
|
||||||
|
|
||||||
|
#. Build is a noun, not a verb
|
||||||
|
#: sphinx_rtd_theme/footer.html:30
|
||||||
|
msgid "Build"
|
||||||
|
msgstr "ساخت"
|
||||||
|
|
||||||
|
#. the phrase "revision" comes from Git, referring to a commit
|
||||||
|
#: sphinx_rtd_theme/footer.html:36
|
||||||
|
msgid "Revision"
|
||||||
|
msgstr "بازبینی"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/footer.html:41
|
||||||
|
#, python-format
|
||||||
|
msgid "Last updated on %(last_updated)s."
|
||||||
|
msgstr "آخرین بروز رسانی در %(last_updated)s ."
|
||||||
|
|
||||||
|
#. the variable "sphinx_web" is a link to the Sphinx project documentation
|
||||||
|
#. with
|
||||||
|
#. the text "Sphinx"
|
||||||
|
#: sphinx_rtd_theme/footer.html:53
|
||||||
|
#, python-format
|
||||||
|
msgid "Built with %(sphinx_web)s using a"
|
||||||
|
msgstr "ساخته شده با %(sphinx_web)s"
|
||||||
|
|
||||||
|
#. "theme" refers to a theme for Sphinx, which alters the appearance of the
|
||||||
|
#. generated documentation
|
||||||
|
#: sphinx_rtd_theme/footer.html:55
|
||||||
|
msgid "theme"
|
||||||
|
msgstr "پوسته"
|
||||||
|
|
||||||
|
#. this is always used as "provided by Read the Docs", and should not imply
|
||||||
|
#. Read the Docs is an author of the generated documentation.
|
||||||
|
#: sphinx_rtd_theme/footer.html:57
|
||||||
|
#, python-format
|
||||||
|
msgid "provided by %(readthedocs_web)s"
|
||||||
|
msgstr "تهیّه شده با %(readthedocs_web)s"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/layout.html:97
|
||||||
|
#, python-format
|
||||||
|
msgid "Search within %(docstitle)s"
|
||||||
|
msgstr "جستجو در %(docstitle)s"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/layout.html:105
|
||||||
|
msgid "About these documents"
|
||||||
|
msgstr "درباره این مستندات"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/layout.html:108
|
||||||
|
msgid "Index"
|
||||||
|
msgstr "فهرست"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/layout.html:111 sphinx_rtd_theme/search.html:11
|
||||||
|
msgid "Search"
|
||||||
|
msgstr "جستجوی"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/layout.html:114
|
||||||
|
msgid "Copyright"
|
||||||
|
msgstr "کپی رایت"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/layout.html:147 sphinx_rtd_theme/layout.html:149
|
||||||
|
msgid "Logo"
|
||||||
|
msgstr "آرم"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/search.html:31
|
||||||
|
msgid "Please activate JavaScript to enable the search functionality."
|
||||||
|
msgstr "لطفاً جاوا اسکریپت را فعّال کنید تا قابلیّت جستجو فعّال شود."
|
||||||
|
|
||||||
|
#. Search is a noun, not a verb
|
||||||
|
#: sphinx_rtd_theme/search.html:39
|
||||||
|
msgid "Search Results"
|
||||||
|
msgstr "نتایج جستجو"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/search.html:41
|
||||||
|
msgid ""
|
||||||
|
"Your search did not match any documents. Please make sure that all words are"
|
||||||
|
" spelled correctly and that you've selected enough categories."
|
||||||
|
msgstr ""
|
||||||
|
"جستجوی شما با هیچ سندی مطابقت نداشت. لطفاً از درستی املای واژگان مطمئن شوید."
|
||||||
|
" همچنین بررسی کنید آیا به اندازه کافی دسته بندی انتخاب کردهاید."
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/searchbox.html:4
|
||||||
|
msgid "Search docs"
|
||||||
|
msgstr "جستجوی مستندات"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/versions.html:3 sphinx_rtd_theme/versions.html:11
|
||||||
|
msgid "Versions"
|
||||||
|
msgstr "نگارشها"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/versions.html:17
|
||||||
|
msgid "Downloads"
|
||||||
|
msgstr "بارگیریها"
|
||||||
|
|
||||||
|
#. The phrase "Read the Docs" is not translated
|
||||||
|
#: sphinx_rtd_theme/versions.html:24
|
||||||
|
msgid "On Read the Docs"
|
||||||
|
msgstr "دربارهی خواندن مستندات"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/versions.html:26
|
||||||
|
msgid "Project Home"
|
||||||
|
msgstr "صفحه خانگی پروژه"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/versions.html:29
|
||||||
|
msgid "Builds"
|
||||||
|
msgstr "ساختها"
|
Binary file not shown.
|
@ -5,16 +5,16 @@
|
||||||
# FIRST AUTHOR <EMAIL@ADDRESS>, 2019.
|
# FIRST AUTHOR <EMAIL@ADDRESS>, 2019.
|
||||||
#
|
#
|
||||||
# Translators:
|
# Translators:
|
||||||
# Radina Matic <radina.matic@gmail.com>, 2020
|
|
||||||
# Anthony <aj@ohess.org>, 2020
|
# Anthony <aj@ohess.org>, 2020
|
||||||
|
# Radina Matic <radina.matic@gmail.com>, 2021
|
||||||
#
|
#
|
||||||
msgid ""
|
msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: sphinx_rtd_theme 0.4.3.dev0\n"
|
"Project-Id-Version: sphinx_rtd_theme 0.4.3.dev0\n"
|
||||||
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
|
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
|
||||||
"POT-Creation-Date: 2020-05-06 13:38-0600\n"
|
"POT-Creation-Date: 2021-09-13 13:35-0600\n"
|
||||||
"PO-Revision-Date: 2019-07-16 21:44+0000\n"
|
"PO-Revision-Date: 2019-07-16 21:44+0000\n"
|
||||||
"Last-Translator: Anthony <aj@ohess.org>, 2020\n"
|
"Last-Translator: Radina Matic <radina.matic@gmail.com>, 2021\n"
|
||||||
"Language-Team: French (https://www.transifex.com/readthedocs/teams/101354/fr/)\n"
|
"Language-Team: French (https://www.transifex.com/readthedocs/teams/101354/fr/)\n"
|
||||||
"MIME-Version: 1.0\n"
|
"MIME-Version: 1.0\n"
|
||||||
"Content-Type: text/plain; charset=UTF-8\n"
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
|
@ -23,42 +23,52 @@ msgstr ""
|
||||||
"Language: fr\n"
|
"Language: fr\n"
|
||||||
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
|
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
|
||||||
|
|
||||||
#: sphinx_rtd_theme/breadcrumbs.html:43 sphinx_rtd_theme/breadcrumbs.html:45
|
#: sphinx_rtd_theme/breadcrumbs.html:37 sphinx_rtd_theme/breadcrumbs.html:39
|
||||||
msgid "Edit on GitHub"
|
msgid "Edit on GitHub"
|
||||||
msgstr "Éditer sur GitHub"
|
msgstr "Éditer sur GitHub"
|
||||||
|
|
||||||
#: sphinx_rtd_theme/breadcrumbs.html:50 sphinx_rtd_theme/breadcrumbs.html:52
|
#: sphinx_rtd_theme/breadcrumbs.html:44 sphinx_rtd_theme/breadcrumbs.html:46
|
||||||
msgid "Edit on Bitbucket"
|
msgid "Edit on Bitbucket"
|
||||||
msgstr "Éditer sur Bitbucket"
|
msgstr "Éditer sur Bitbucket"
|
||||||
|
|
||||||
#: sphinx_rtd_theme/breadcrumbs.html:57 sphinx_rtd_theme/breadcrumbs.html:59
|
#: sphinx_rtd_theme/breadcrumbs.html:51 sphinx_rtd_theme/breadcrumbs.html:53
|
||||||
msgid "Edit on GitLab"
|
msgid "Edit on GitLab"
|
||||||
msgstr "Éditer sur GitLab"
|
msgstr "Éditer sur GitLab"
|
||||||
|
|
||||||
#: sphinx_rtd_theme/breadcrumbs.html:62 sphinx_rtd_theme/breadcrumbs.html:64
|
#: sphinx_rtd_theme/breadcrumbs.html:56 sphinx_rtd_theme/breadcrumbs.html:58
|
||||||
msgid "View page source"
|
msgid "View page source"
|
||||||
msgstr "Afficher la source de la page"
|
msgstr "Afficher la source de la page"
|
||||||
|
|
||||||
#: sphinx_rtd_theme/breadcrumbs.html:74 sphinx_rtd_theme/footer.html:5
|
#: sphinx_rtd_theme/breadcrumbs.html:69 sphinx_rtd_theme/footer.html:6
|
||||||
msgid "Next"
|
|
||||||
msgstr "Suivant"
|
|
||||||
|
|
||||||
#: sphinx_rtd_theme/breadcrumbs.html:77 sphinx_rtd_theme/footer.html:8
|
|
||||||
msgid "Previous"
|
msgid "Previous"
|
||||||
msgstr "Précédent"
|
msgstr "Précédent"
|
||||||
|
|
||||||
#: sphinx_rtd_theme/footer.html:21 sphinx_rtd_theme/footer.html:24
|
#: sphinx_rtd_theme/breadcrumbs.html:72 sphinx_rtd_theme/footer.html:9
|
||||||
#: sphinx_rtd_theme/layout.html:96
|
msgid "Next"
|
||||||
msgid "Copyright"
|
msgstr "Suivant"
|
||||||
msgstr "Droits d'auteur"
|
|
||||||
|
#. This is an ARIA section label for the footer section of the page.
|
||||||
|
#: sphinx_rtd_theme/footer.html:4
|
||||||
|
msgid "Footer"
|
||||||
|
msgstr "Pied de page"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/footer.html:21
|
||||||
|
#, python-format
|
||||||
|
msgid "© <a href=\"%(path)s\">Copyright</a> %(copyright)s."
|
||||||
|
msgstr "© <a href=\"%(path)s\">Droits d'auteur</a> %(copyright)s."
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/footer.html:23
|
||||||
|
#, python-format
|
||||||
|
msgid "© Copyright %(copyright)s."
|
||||||
|
msgstr "© Droits d'auteur %(copyright)s."
|
||||||
|
|
||||||
#. Build is a noun, not a verb
|
#. Build is a noun, not a verb
|
||||||
#: sphinx_rtd_theme/footer.html:31
|
#: sphinx_rtd_theme/footer.html:30
|
||||||
msgid "Build"
|
msgid "Build"
|
||||||
msgstr "Compilation"
|
msgstr "Compilation"
|
||||||
|
|
||||||
#. the phrase "revision" comes from Git, referring to a commit
|
#. the phrase "revision" comes from Git, referring to a commit
|
||||||
#: sphinx_rtd_theme/footer.html:37
|
#: sphinx_rtd_theme/footer.html:36
|
||||||
msgid "Revision"
|
msgid "Revision"
|
||||||
msgstr "Révision"
|
msgstr "Révision"
|
||||||
|
|
||||||
|
@ -70,55 +80,59 @@ msgstr "Dernière mise à jour le %(last_updated)s."
|
||||||
#. the variable "sphinx_web" is a link to the Sphinx project documentation
|
#. the variable "sphinx_web" is a link to the Sphinx project documentation
|
||||||
#. with
|
#. with
|
||||||
#. the text "Sphinx"
|
#. the text "Sphinx"
|
||||||
#: sphinx_rtd_theme/footer.html:52
|
#: sphinx_rtd_theme/footer.html:53
|
||||||
#, python-format
|
#, python-format
|
||||||
msgid "Built with %(sphinx_web)s using a"
|
msgid "Built with %(sphinx_web)s using a"
|
||||||
msgstr "Compilé avec %(sphinx_web)s en utilisant un"
|
msgstr "Compilé avec %(sphinx_web)s en utilisant un"
|
||||||
|
|
||||||
#. "theme" refers to a theme for Sphinx, which alters the appearance of the
|
#. "theme" refers to a theme for Sphinx, which alters the appearance of the
|
||||||
#. generated documenation
|
#. generated documenation
|
||||||
#: sphinx_rtd_theme/footer.html:54
|
#: sphinx_rtd_theme/footer.html:55
|
||||||
msgid "theme"
|
msgid "theme"
|
||||||
msgstr "thème"
|
msgstr "thème"
|
||||||
|
|
||||||
#. this is always used as "provided by Read the Docs", and should not imply
|
#. this is always used as "provided by Read the Docs", and should not imply
|
||||||
#. Read the Docs is an author of the generated documentation.
|
#. Read the Docs is an author of the generated documentation.
|
||||||
#: sphinx_rtd_theme/footer.html:56
|
#: sphinx_rtd_theme/footer.html:57
|
||||||
#, python-format
|
#, python-format
|
||||||
msgid "provided by %(readthedocs_web)s"
|
msgid "provided by %(readthedocs_web)s"
|
||||||
msgstr "fourni par %(readthedocs_web)s"
|
msgstr "fourni par %(readthedocs_web)s"
|
||||||
|
|
||||||
#: sphinx_rtd_theme/layout.html:79
|
#: sphinx_rtd_theme/layout.html:97
|
||||||
#, python-format
|
#, python-format
|
||||||
msgid "Search within %(docstitle)s"
|
msgid "Search within %(docstitle)s"
|
||||||
msgstr "Rechercher dans %(docstitle)s"
|
msgstr "Rechercher dans %(docstitle)s"
|
||||||
|
|
||||||
#: sphinx_rtd_theme/layout.html:87
|
#: sphinx_rtd_theme/layout.html:105
|
||||||
msgid "About these documents"
|
msgid "About these documents"
|
||||||
msgstr "À propos de cette documentation"
|
msgstr "À propos de cette documentation"
|
||||||
|
|
||||||
#: sphinx_rtd_theme/layout.html:90
|
#: sphinx_rtd_theme/layout.html:108
|
||||||
msgid "Index"
|
msgid "Index"
|
||||||
msgstr "Index"
|
msgstr "Index"
|
||||||
|
|
||||||
#: sphinx_rtd_theme/layout.html:93 sphinx_rtd_theme/search.html:11
|
#: sphinx_rtd_theme/layout.html:111 sphinx_rtd_theme/search.html:11
|
||||||
msgid "Search"
|
msgid "Search"
|
||||||
msgstr "Rechercher"
|
msgstr "Rechercher"
|
||||||
|
|
||||||
#: sphinx_rtd_theme/layout.html:128
|
#: sphinx_rtd_theme/layout.html:114
|
||||||
|
msgid "Copyright"
|
||||||
|
msgstr "Droits d'auteur"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/layout.html:147 sphinx_rtd_theme/layout.html:149
|
||||||
msgid "Logo"
|
msgid "Logo"
|
||||||
msgstr "Logo"
|
msgstr "Logo"
|
||||||
|
|
||||||
#: sphinx_rtd_theme/search.html:29
|
#: sphinx_rtd_theme/search.html:31
|
||||||
msgid "Please activate JavaScript to enable the search functionality."
|
msgid "Please activate JavaScript to enable the search functionality."
|
||||||
msgstr "Activez JavaScript pour accéder à la fonction de recherche."
|
msgstr "Activez JavaScript pour accéder à la fonction de recherche."
|
||||||
|
|
||||||
#. Search is a noun, not a verb
|
#. Search is a noun, not a verb
|
||||||
#: sphinx_rtd_theme/search.html:37
|
#: sphinx_rtd_theme/search.html:39
|
||||||
msgid "Search Results"
|
msgid "Search Results"
|
||||||
msgstr "Résultats de la recherche"
|
msgstr "Résultats de la recherche"
|
||||||
|
|
||||||
#: sphinx_rtd_theme/search.html:39
|
#: sphinx_rtd_theme/search.html:41
|
||||||
msgid ""
|
msgid ""
|
||||||
"Your search did not match any documents. Please make sure that all words are"
|
"Your search did not match any documents. Please make sure that all words are"
|
||||||
" spelled correctly and that you've selected enough categories."
|
" spelled correctly and that you've selected enough categories."
|
||||||
|
@ -131,7 +145,7 @@ msgstr ""
|
||||||
msgid "Search docs"
|
msgid "Search docs"
|
||||||
msgstr "Rechercher docs"
|
msgstr "Rechercher docs"
|
||||||
|
|
||||||
#: sphinx_rtd_theme/versions.html:11
|
#: sphinx_rtd_theme/versions.html:3 sphinx_rtd_theme/versions.html:11
|
||||||
msgid "Versions"
|
msgid "Versions"
|
||||||
msgstr "Versions"
|
msgstr "Versions"
|
||||||
|
|
||||||
|
@ -139,6 +153,11 @@ msgstr "Versions"
|
||||||
msgid "Downloads"
|
msgid "Downloads"
|
||||||
msgstr "Téléchargements"
|
msgstr "Téléchargements"
|
||||||
|
|
||||||
|
#. The phrase "Read the Docs" is not translated
|
||||||
|
#: sphinx_rtd_theme/versions.html:24
|
||||||
|
msgid "On Read the Docs"
|
||||||
|
msgstr "À propos de Read the Docs"
|
||||||
|
|
||||||
#: sphinx_rtd_theme/versions.html:26
|
#: sphinx_rtd_theme/versions.html:26
|
||||||
msgid "Project Home"
|
msgid "Project Home"
|
||||||
msgstr "Accueil du projet"
|
msgstr "Accueil du projet"
|
||||||
|
@ -146,9 +165,3 @@ msgstr "Accueil du projet"
|
||||||
#: sphinx_rtd_theme/versions.html:29
|
#: sphinx_rtd_theme/versions.html:29
|
||||||
msgid "Builds"
|
msgid "Builds"
|
||||||
msgstr "Compilations"
|
msgstr "Compilations"
|
||||||
|
|
||||||
#~ msgid "Docs"
|
|
||||||
#~ msgstr "Docs"
|
|
||||||
|
|
||||||
#~ msgid "Free document hosting provided by"
|
|
||||||
#~ msgstr "Hébergement gratuit de documents fourni par"
|
|
||||||
|
|
Binary file not shown.
|
@ -0,0 +1,190 @@
|
||||||
|
# English translations for sphinx_rtd_theme.
|
||||||
|
# Copyright (C) 2019 ORGANIZATION
|
||||||
|
# This file is distributed under the same license as the sphinx_rtd_theme
|
||||||
|
# project.
|
||||||
|
# FIRST AUTHOR <EMAIL@ADDRESS>, 2019.
|
||||||
|
#
|
||||||
|
# Translators:
|
||||||
|
# Anthony <aj@ohess.org>, 2021
|
||||||
|
# Maurizio Paglia <mpaglia0@gmail.com>, 2021
|
||||||
|
#
|
||||||
|
msgid ""
|
||||||
|
msgstr ""
|
||||||
|
"Project-Id-Version: sphinx_rtd_theme 0.4.3.dev0\n"
|
||||||
|
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
|
||||||
|
"POT-Creation-Date: 2021-09-13 13:35-0600\n"
|
||||||
|
"PO-Revision-Date: 2019-07-16 21:44+0000\n"
|
||||||
|
"Last-Translator: Maurizio Paglia <mpaglia0@gmail.com>, 2021\n"
|
||||||
|
"Language-Team: Italian (https://www.transifex.com/readthedocs/teams/101354/it/)\n"
|
||||||
|
"MIME-Version: 1.0\n"
|
||||||
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
|
"Generated-By: Babel 2.8.0\n"
|
||||||
|
"Language: it\n"
|
||||||
|
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||||
|
|
||||||
|
#. This is an ARIA section label for page links, including previous/next page
|
||||||
|
#. link and links to GitHub/GitLab/etc.
|
||||||
|
#: sphinx_rtd_theme/breadcrumbs.html:22
|
||||||
|
msgid "Page navigation"
|
||||||
|
msgstr "Naviga tra le pagine"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/breadcrumbs.html:37 sphinx_rtd_theme/breadcrumbs.html:39
|
||||||
|
msgid "Edit on GitHub"
|
||||||
|
msgstr "Modifica su GitHub"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/breadcrumbs.html:44 sphinx_rtd_theme/breadcrumbs.html:46
|
||||||
|
msgid "Edit on Bitbucket"
|
||||||
|
msgstr "Modifica su Bitbucket"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/breadcrumbs.html:51 sphinx_rtd_theme/breadcrumbs.html:53
|
||||||
|
msgid "Edit on GitLab"
|
||||||
|
msgstr "Modifica su GitLab"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/breadcrumbs.html:56 sphinx_rtd_theme/breadcrumbs.html:58
|
||||||
|
msgid "View page source"
|
||||||
|
msgstr "Visualizza sorgente pagina"
|
||||||
|
|
||||||
|
#. This is an ARIA section label for sequential page links, such as previous
|
||||||
|
#. and next page links.
|
||||||
|
#: sphinx_rtd_theme/breadcrumbs.html:67
|
||||||
|
msgid "Sequential page navigation"
|
||||||
|
msgstr "Naviga sequenzialmente tra le pagine"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/breadcrumbs.html:69 sphinx_rtd_theme/footer.html:6
|
||||||
|
msgid "Previous"
|
||||||
|
msgstr "Precedente"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/breadcrumbs.html:72 sphinx_rtd_theme/footer.html:9
|
||||||
|
msgid "Next"
|
||||||
|
msgstr "Prossimo"
|
||||||
|
|
||||||
|
#. This is an ARIA section label for the footer section of the page.
|
||||||
|
#: sphinx_rtd_theme/footer.html:4
|
||||||
|
msgid "Footer"
|
||||||
|
msgstr "Piè di pagina"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/footer.html:21
|
||||||
|
#, python-format
|
||||||
|
msgid "© <a href=\"%(path)s\">Copyright</a> %(copyright)s."
|
||||||
|
msgstr "© <a href=\"%(path)s\">Copyright</a> %(copyright)s."
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/footer.html:23
|
||||||
|
#, python-format
|
||||||
|
msgid "© Copyright %(copyright)s."
|
||||||
|
msgstr "© Copyright %(copyright)s."
|
||||||
|
|
||||||
|
#. Build is a noun, not a verb
|
||||||
|
#: sphinx_rtd_theme/footer.html:30
|
||||||
|
msgid "Build"
|
||||||
|
msgstr "Rev."
|
||||||
|
|
||||||
|
#. the phrase "revision" comes from Git, referring to a commit
|
||||||
|
#: sphinx_rtd_theme/footer.html:36
|
||||||
|
msgid "Revision"
|
||||||
|
msgstr "Revisione"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/footer.html:41
|
||||||
|
#, python-format
|
||||||
|
msgid "Last updated on %(last_updated)s."
|
||||||
|
msgstr "Ultimo aggiornamento il %(last_updated)s."
|
||||||
|
|
||||||
|
#. the variable "sphinx_web" is a link to the Sphinx project documentation
|
||||||
|
#. with
|
||||||
|
#. the text "Sphinx"
|
||||||
|
#: sphinx_rtd_theme/footer.html:53
|
||||||
|
#, python-format
|
||||||
|
msgid "Built with %(sphinx_web)s using a"
|
||||||
|
msgstr "Realizzato con %(sphinx_web)s e il tema"
|
||||||
|
|
||||||
|
#. "theme" refers to a theme for Sphinx, which alters the appearance of the
|
||||||
|
#. generated documentation
|
||||||
|
#: sphinx_rtd_theme/footer.html:55
|
||||||
|
msgid "theme"
|
||||||
|
msgstr "tema"
|
||||||
|
|
||||||
|
#. this is always used as "provided by Read the Docs", and should not imply
|
||||||
|
#. Read the Docs is an author of the generated documentation.
|
||||||
|
#: sphinx_rtd_theme/footer.html:57
|
||||||
|
#, python-format
|
||||||
|
msgid "provided by %(readthedocs_web)s"
|
||||||
|
msgstr "fornito da %(readthedocs_web)s"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/layout.html:97
|
||||||
|
#, python-format
|
||||||
|
msgid "Search within %(docstitle)s"
|
||||||
|
msgstr "Cerca in %(docstitle)s"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/layout.html:105
|
||||||
|
msgid "About these documents"
|
||||||
|
msgstr "Nota sulla documentazione"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/layout.html:108
|
||||||
|
msgid "Index"
|
||||||
|
msgstr "Indice"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/layout.html:111 sphinx_rtd_theme/search.html:11
|
||||||
|
msgid "Search"
|
||||||
|
msgstr "Ricerca"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/layout.html:114
|
||||||
|
msgid "Copyright"
|
||||||
|
msgstr "Copyright"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/layout.html:147 sphinx_rtd_theme/layout.html:149
|
||||||
|
msgid "Logo"
|
||||||
|
msgstr "Logo"
|
||||||
|
|
||||||
|
#. This is an ARIA section label for the main navigation menu
|
||||||
|
#: sphinx_rtd_theme/layout.html:173
|
||||||
|
msgid "Navigation menu"
|
||||||
|
msgstr "Menu di navigazione"
|
||||||
|
|
||||||
|
#. This is an ARIA section label for the navigation menu that is visible when
|
||||||
|
#. viewing the page on mobile devices
|
||||||
|
#: sphinx_rtd_theme/layout.html:195
|
||||||
|
msgid "Mobile navigation menu"
|
||||||
|
msgstr "Menu navigazione dispositivi mobili"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/search.html:31
|
||||||
|
msgid "Please activate JavaScript to enable the search functionality."
|
||||||
|
msgstr "Devi attivare JavaScript per attivare la funzione di ricerca."
|
||||||
|
|
||||||
|
#. Search is a noun, not a verb
|
||||||
|
#: sphinx_rtd_theme/search.html:39
|
||||||
|
msgid "Search Results"
|
||||||
|
msgstr "Risultati della ricerca"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/search.html:41
|
||||||
|
msgid ""
|
||||||
|
"Your search did not match any documents. Please make sure that all words are"
|
||||||
|
" spelled correctly and that you've selected enough categories."
|
||||||
|
msgstr ""
|
||||||
|
"La tua ricerca non ha prodotto nessun risultato. Assicurati di aver scritto "
|
||||||
|
"correttamente tutti i termini cercati e di aver selezionato sufficienti "
|
||||||
|
"categorie."
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/searchbox.html:4
|
||||||
|
msgid "Search docs"
|
||||||
|
msgstr "Cerca documenti"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/versions.html:3 sphinx_rtd_theme/versions.html:11
|
||||||
|
msgid "Versions"
|
||||||
|
msgstr "Versioni"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/versions.html:17
|
||||||
|
msgid "Downloads"
|
||||||
|
msgstr "Downloads"
|
||||||
|
|
||||||
|
#. The phrase "Read the Docs" is not translated
|
||||||
|
#: sphinx_rtd_theme/versions.html:24
|
||||||
|
msgid "On Read the Docs"
|
||||||
|
msgstr "Riguardo Read the Docs"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/versions.html:26
|
||||||
|
msgid "Project Home"
|
||||||
|
msgstr "Home progetto"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/versions.html:29
|
||||||
|
msgid "Builds"
|
||||||
|
msgstr "Rev."
|
Binary file not shown.
|
@ -0,0 +1,188 @@
|
||||||
|
# English translations for sphinx_rtd_theme.
|
||||||
|
# Copyright (C) 2019 ORGANIZATION
|
||||||
|
# This file is distributed under the same license as the sphinx_rtd_theme
|
||||||
|
# project.
|
||||||
|
# FIRST AUTHOR <EMAIL@ADDRESS>, 2019.
|
||||||
|
#
|
||||||
|
# Translators:
|
||||||
|
# Tomas Straupis, 2021
|
||||||
|
#
|
||||||
|
msgid ""
|
||||||
|
msgstr ""
|
||||||
|
"Project-Id-Version: sphinx_rtd_theme 0.4.3.dev0\n"
|
||||||
|
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
|
||||||
|
"POT-Creation-Date: 2021-09-13 13:35-0600\n"
|
||||||
|
"PO-Revision-Date: 2019-07-16 21:44+0000\n"
|
||||||
|
"Last-Translator: Tomas Straupis, 2021\n"
|
||||||
|
"Language-Team: Lithuanian (https://www.transifex.com/readthedocs/teams/101354/lt/)\n"
|
||||||
|
"MIME-Version: 1.0\n"
|
||||||
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
|
"Generated-By: Babel 2.8.0\n"
|
||||||
|
"Language: lt\n"
|
||||||
|
"Plural-Forms: nplurals=4; plural=(n % 10 == 1 && (n % 100 > 19 || n % 100 < 11) ? 0 : (n % 10 >= 2 && n % 10 <=9) && (n % 100 > 19 || n % 100 < 11) ? 1 : n % 1 != 0 ? 2: 3);\n"
|
||||||
|
|
||||||
|
#. This is an ARIA section label for page links, including previous/next page
|
||||||
|
#. link and links to GitHub/GitLab/etc.
|
||||||
|
#: sphinx_rtd_theme/breadcrumbs.html:22
|
||||||
|
msgid "Page navigation"
|
||||||
|
msgstr "Puslapių navigacija"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/breadcrumbs.html:37 sphinx_rtd_theme/breadcrumbs.html:39
|
||||||
|
msgid "Edit on GitHub"
|
||||||
|
msgstr "Keisti GitHub'e"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/breadcrumbs.html:44 sphinx_rtd_theme/breadcrumbs.html:46
|
||||||
|
msgid "Edit on Bitbucket"
|
||||||
|
msgstr "Keisti Bitbucket'e"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/breadcrumbs.html:51 sphinx_rtd_theme/breadcrumbs.html:53
|
||||||
|
msgid "Edit on GitLab"
|
||||||
|
msgstr "Keisti GitLab'e"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/breadcrumbs.html:56 sphinx_rtd_theme/breadcrumbs.html:58
|
||||||
|
msgid "View page source"
|
||||||
|
msgstr "Žiūrėti puslapio šaltinį"
|
||||||
|
|
||||||
|
#. This is an ARIA section label for sequential page links, such as previous
|
||||||
|
#. and next page links.
|
||||||
|
#: sphinx_rtd_theme/breadcrumbs.html:67
|
||||||
|
msgid "Sequential page navigation"
|
||||||
|
msgstr "Puslapių navigacija iš eilės"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/breadcrumbs.html:69 sphinx_rtd_theme/footer.html:6
|
||||||
|
msgid "Previous"
|
||||||
|
msgstr "Ankstesnis"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/breadcrumbs.html:72 sphinx_rtd_theme/footer.html:9
|
||||||
|
msgid "Next"
|
||||||
|
msgstr "Kitas"
|
||||||
|
|
||||||
|
#. This is an ARIA section label for the footer section of the page.
|
||||||
|
#: sphinx_rtd_theme/footer.html:4
|
||||||
|
msgid "Footer"
|
||||||
|
msgstr "Poraštė"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/footer.html:21
|
||||||
|
#, python-format
|
||||||
|
msgid "© <a href=\"%(path)s\">Copyright</a> %(copyright)s."
|
||||||
|
msgstr "© <a href=\"%(path)s\">Copyright</a> %(copyright)s."
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/footer.html:23
|
||||||
|
#, python-format
|
||||||
|
msgid "© Copyright %(copyright)s."
|
||||||
|
msgstr "© Copyright %(copyright)s."
|
||||||
|
|
||||||
|
#. Build is a noun, not a verb
|
||||||
|
#: sphinx_rtd_theme/footer.html:30
|
||||||
|
msgid "Build"
|
||||||
|
msgstr "Surinkimas"
|
||||||
|
|
||||||
|
#. the phrase "revision" comes from Git, referring to a commit
|
||||||
|
#: sphinx_rtd_theme/footer.html:36
|
||||||
|
msgid "Revision"
|
||||||
|
msgstr "Versija"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/footer.html:41
|
||||||
|
#, python-format
|
||||||
|
msgid "Last updated on %(last_updated)s."
|
||||||
|
msgstr "Atnaujinta %(last_updated)s."
|
||||||
|
|
||||||
|
#. the variable "sphinx_web" is a link to the Sphinx project documentation
|
||||||
|
#. with
|
||||||
|
#. the text "Sphinx"
|
||||||
|
#: sphinx_rtd_theme/footer.html:53
|
||||||
|
#, python-format
|
||||||
|
msgid "Built with %(sphinx_web)s using a"
|
||||||
|
msgstr "Surinkta su %(sphinx_web)s naudojant"
|
||||||
|
|
||||||
|
#. "theme" refers to a theme for Sphinx, which alters the appearance of the
|
||||||
|
#. generated documentation
|
||||||
|
#: sphinx_rtd_theme/footer.html:55
|
||||||
|
msgid "theme"
|
||||||
|
msgstr "temą"
|
||||||
|
|
||||||
|
#. this is always used as "provided by Read the Docs", and should not imply
|
||||||
|
#. Read the Docs is an author of the generated documentation.
|
||||||
|
#: sphinx_rtd_theme/footer.html:57
|
||||||
|
#, python-format
|
||||||
|
msgid "provided by %(readthedocs_web)s"
|
||||||
|
msgstr "pateiktą %(readthedocs_web)s"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/layout.html:97
|
||||||
|
#, python-format
|
||||||
|
msgid "Search within %(docstitle)s"
|
||||||
|
msgstr "Ieškoti %(docstitle)s"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/layout.html:105
|
||||||
|
msgid "About these documents"
|
||||||
|
msgstr "Apie šiuos dokumentus"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/layout.html:108
|
||||||
|
msgid "Index"
|
||||||
|
msgstr "Indeksas"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/layout.html:111 sphinx_rtd_theme/search.html:11
|
||||||
|
msgid "Search"
|
||||||
|
msgstr "Paieška"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/layout.html:114
|
||||||
|
msgid "Copyright"
|
||||||
|
msgstr "Autorių teisės"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/layout.html:147 sphinx_rtd_theme/layout.html:149
|
||||||
|
msgid "Logo"
|
||||||
|
msgstr "Logo"
|
||||||
|
|
||||||
|
#. This is an ARIA section label for the main navigation menu
|
||||||
|
#: sphinx_rtd_theme/layout.html:173
|
||||||
|
msgid "Navigation menu"
|
||||||
|
msgstr "Navigacijos meniu"
|
||||||
|
|
||||||
|
#. This is an ARIA section label for the navigation menu that is visible when
|
||||||
|
#. viewing the page on mobile devices
|
||||||
|
#: sphinx_rtd_theme/layout.html:195
|
||||||
|
msgid "Mobile navigation menu"
|
||||||
|
msgstr "Mobilios navigacijos meniu"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/search.html:31
|
||||||
|
msgid "Please activate JavaScript to enable the search functionality."
|
||||||
|
msgstr "Prašome įjungti JavaScript, kad veiktų paieškos funkcionalumas."
|
||||||
|
|
||||||
|
#. Search is a noun, not a verb
|
||||||
|
#: sphinx_rtd_theme/search.html:39
|
||||||
|
msgid "Search Results"
|
||||||
|
msgstr "Paieškos rezultatai"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/search.html:41
|
||||||
|
msgid ""
|
||||||
|
"Your search did not match any documents. Please make sure that all words are"
|
||||||
|
" spelled correctly and that you've selected enough categories."
|
||||||
|
msgstr ""
|
||||||
|
"Jūsų paieškai neatitiko nei vienas dokumentas. Prašome įsitikinti, kad visi "
|
||||||
|
"žodžiai parašyti teisingai ir kad parinkote pakankamai kategorijų."
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/searchbox.html:4
|
||||||
|
msgid "Search docs"
|
||||||
|
msgstr "Ieškoti dokumentuose"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/versions.html:3 sphinx_rtd_theme/versions.html:11
|
||||||
|
msgid "Versions"
|
||||||
|
msgstr "Versijos"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/versions.html:17
|
||||||
|
msgid "Downloads"
|
||||||
|
msgstr "Atsisiuntimai"
|
||||||
|
|
||||||
|
#. The phrase "Read the Docs" is not translated
|
||||||
|
#: sphinx_rtd_theme/versions.html:24
|
||||||
|
msgid "On Read the Docs"
|
||||||
|
msgstr "Apie Read the Docs"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/versions.html:26
|
||||||
|
msgid "Project Home"
|
||||||
|
msgstr "Projekto namai"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/versions.html:29
|
||||||
|
msgid "Builds"
|
||||||
|
msgstr "Surinkimai"
|
Binary file not shown.
|
@ -5,15 +5,15 @@
|
||||||
# FIRST AUTHOR <EMAIL@ADDRESS>, 2019.
|
# FIRST AUTHOR <EMAIL@ADDRESS>, 2019.
|
||||||
#
|
#
|
||||||
# Translators:
|
# Translators:
|
||||||
# Jesse Tan, 2019
|
# Jesse Tan, 2021
|
||||||
#
|
#
|
||||||
msgid ""
|
msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: sphinx_rtd_theme 0.4.3.dev0\n"
|
"Project-Id-Version: sphinx_rtd_theme 0.4.3.dev0\n"
|
||||||
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
|
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
|
||||||
"POT-Creation-Date: 2020-05-06 13:38-0600\n"
|
"POT-Creation-Date: 2021-09-13 13:35-0600\n"
|
||||||
"PO-Revision-Date: 2019-07-16 21:44+0000\n"
|
"PO-Revision-Date: 2019-07-16 21:44+0000\n"
|
||||||
"Last-Translator: Jesse Tan, 2019\n"
|
"Last-Translator: Jesse Tan, 2021\n"
|
||||||
"Language-Team: Dutch (https://www.transifex.com/readthedocs/teams/101354/nl/)\n"
|
"Language-Team: Dutch (https://www.transifex.com/readthedocs/teams/101354/nl/)\n"
|
||||||
"MIME-Version: 1.0\n"
|
"MIME-Version: 1.0\n"
|
||||||
"Content-Type: text/plain; charset=UTF-8\n"
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
|
@ -22,42 +22,64 @@ msgstr ""
|
||||||
"Language: nl\n"
|
"Language: nl\n"
|
||||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||||
|
|
||||||
#: sphinx_rtd_theme/breadcrumbs.html:43 sphinx_rtd_theme/breadcrumbs.html:45
|
#. This is an ARIA section label for page links, including previous/next page
|
||||||
|
#. link and links to GitHub/GitLab/etc.
|
||||||
|
#: sphinx_rtd_theme/breadcrumbs.html:22
|
||||||
|
msgid "Page navigation"
|
||||||
|
msgstr "Paginanavigatie"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/breadcrumbs.html:37 sphinx_rtd_theme/breadcrumbs.html:39
|
||||||
msgid "Edit on GitHub"
|
msgid "Edit on GitHub"
|
||||||
msgstr "Bewerk op GitHub"
|
msgstr "Bewerk op GitHub"
|
||||||
|
|
||||||
#: sphinx_rtd_theme/breadcrumbs.html:50 sphinx_rtd_theme/breadcrumbs.html:52
|
#: sphinx_rtd_theme/breadcrumbs.html:44 sphinx_rtd_theme/breadcrumbs.html:46
|
||||||
msgid "Edit on Bitbucket"
|
msgid "Edit on Bitbucket"
|
||||||
msgstr "Bewerk op BitBucket"
|
msgstr "Bewerk op BitBucket"
|
||||||
|
|
||||||
#: sphinx_rtd_theme/breadcrumbs.html:57 sphinx_rtd_theme/breadcrumbs.html:59
|
#: sphinx_rtd_theme/breadcrumbs.html:51 sphinx_rtd_theme/breadcrumbs.html:53
|
||||||
msgid "Edit on GitLab"
|
msgid "Edit on GitLab"
|
||||||
msgstr "Bewerk op GitLab"
|
msgstr "Bewerk op GitLab"
|
||||||
|
|
||||||
#: sphinx_rtd_theme/breadcrumbs.html:62 sphinx_rtd_theme/breadcrumbs.html:64
|
#: sphinx_rtd_theme/breadcrumbs.html:56 sphinx_rtd_theme/breadcrumbs.html:58
|
||||||
msgid "View page source"
|
msgid "View page source"
|
||||||
msgstr "Bekijk paginabron"
|
msgstr "Bekijk paginabron"
|
||||||
|
|
||||||
#: sphinx_rtd_theme/breadcrumbs.html:74 sphinx_rtd_theme/footer.html:5
|
#. This is an ARIA section label for sequential page links, such as previous
|
||||||
msgid "Next"
|
#. and next page links.
|
||||||
msgstr "Volgende"
|
#: sphinx_rtd_theme/breadcrumbs.html:67
|
||||||
|
msgid "Sequential page navigation"
|
||||||
|
msgstr "Navigatie voor gerelateerde pagina's"
|
||||||
|
|
||||||
#: sphinx_rtd_theme/breadcrumbs.html:77 sphinx_rtd_theme/footer.html:8
|
#: sphinx_rtd_theme/breadcrumbs.html:69 sphinx_rtd_theme/footer.html:6
|
||||||
msgid "Previous"
|
msgid "Previous"
|
||||||
msgstr "Vorige"
|
msgstr "Vorige"
|
||||||
|
|
||||||
#: sphinx_rtd_theme/footer.html:21 sphinx_rtd_theme/footer.html:24
|
#: sphinx_rtd_theme/breadcrumbs.html:72 sphinx_rtd_theme/footer.html:9
|
||||||
#: sphinx_rtd_theme/layout.html:96
|
msgid "Next"
|
||||||
msgid "Copyright"
|
msgstr "Volgende"
|
||||||
msgstr "Copyright"
|
|
||||||
|
#. This is an ARIA section label for the footer section of the page.
|
||||||
|
#: sphinx_rtd_theme/footer.html:4
|
||||||
|
msgid "Footer"
|
||||||
|
msgstr "Voettekst"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/footer.html:21
|
||||||
|
#, python-format
|
||||||
|
msgid "© <a href=\"%(path)s\">Copyright</a> %(copyright)s."
|
||||||
|
msgstr "© <a href=\"%(path)s\">Copyright</a> %(copyright)s."
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/footer.html:23
|
||||||
|
#, python-format
|
||||||
|
msgid "© Copyright %(copyright)s."
|
||||||
|
msgstr "© Copyright %(copyright)s."
|
||||||
|
|
||||||
#. Build is a noun, not a verb
|
#. Build is a noun, not a verb
|
||||||
#: sphinx_rtd_theme/footer.html:31
|
#: sphinx_rtd_theme/footer.html:30
|
||||||
msgid "Build"
|
msgid "Build"
|
||||||
msgstr "Bouwresultaat"
|
msgstr "Bouwresultaat"
|
||||||
|
|
||||||
#. the phrase "revision" comes from Git, referring to a commit
|
#. the phrase "revision" comes from Git, referring to a commit
|
||||||
#: sphinx_rtd_theme/footer.html:37
|
#: sphinx_rtd_theme/footer.html:36
|
||||||
msgid "Revision"
|
msgid "Revision"
|
||||||
msgstr "Revisie"
|
msgstr "Revisie"
|
||||||
|
|
||||||
|
@ -69,55 +91,70 @@ msgstr "Laatste update op %(last_updated)s."
|
||||||
#. the variable "sphinx_web" is a link to the Sphinx project documentation
|
#. the variable "sphinx_web" is a link to the Sphinx project documentation
|
||||||
#. with
|
#. with
|
||||||
#. the text "Sphinx"
|
#. the text "Sphinx"
|
||||||
#: sphinx_rtd_theme/footer.html:52
|
#: sphinx_rtd_theme/footer.html:53
|
||||||
#, python-format
|
#, python-format
|
||||||
msgid "Built with %(sphinx_web)s using a"
|
msgid "Built with %(sphinx_web)s using a"
|
||||||
msgstr "Gebouwd met %(sphinx_web)s met een"
|
msgstr "Gebouwd met %(sphinx_web)s met een"
|
||||||
|
|
||||||
#. "theme" refers to a theme for Sphinx, which alters the appearance of the
|
#. "theme" refers to a theme for Sphinx, which alters the appearance of the
|
||||||
#. generated documenation
|
#. generated documentation
|
||||||
#: sphinx_rtd_theme/footer.html:54
|
#: sphinx_rtd_theme/footer.html:55
|
||||||
msgid "theme"
|
msgid "theme"
|
||||||
msgstr "thema"
|
msgstr "thema"
|
||||||
|
|
||||||
#. this is always used as "provided by Read the Docs", and should not imply
|
#. this is always used as "provided by Read the Docs", and should not imply
|
||||||
#. Read the Docs is an author of the generated documentation.
|
#. Read the Docs is an author of the generated documentation.
|
||||||
#: sphinx_rtd_theme/footer.html:56
|
#: sphinx_rtd_theme/footer.html:57
|
||||||
#, python-format
|
#, python-format
|
||||||
msgid "provided by %(readthedocs_web)s"
|
msgid "provided by %(readthedocs_web)s"
|
||||||
msgstr "geleverd door %(readthedocs_web)s"
|
msgstr "geleverd door %(readthedocs_web)s"
|
||||||
|
|
||||||
#: sphinx_rtd_theme/layout.html:79
|
#: sphinx_rtd_theme/layout.html:97
|
||||||
#, python-format
|
#, python-format
|
||||||
msgid "Search within %(docstitle)s"
|
msgid "Search within %(docstitle)s"
|
||||||
msgstr "Zoek binnen %(docstitle)s"
|
msgstr "Zoek binnen %(docstitle)s"
|
||||||
|
|
||||||
#: sphinx_rtd_theme/layout.html:87
|
#: sphinx_rtd_theme/layout.html:105
|
||||||
msgid "About these documents"
|
msgid "About these documents"
|
||||||
msgstr "Over deze documenten"
|
msgstr "Over deze documenten"
|
||||||
|
|
||||||
#: sphinx_rtd_theme/layout.html:90
|
#: sphinx_rtd_theme/layout.html:108
|
||||||
msgid "Index"
|
msgid "Index"
|
||||||
msgstr "Index"
|
msgstr "Index"
|
||||||
|
|
||||||
#: sphinx_rtd_theme/layout.html:93 sphinx_rtd_theme/search.html:11
|
#: sphinx_rtd_theme/layout.html:111 sphinx_rtd_theme/search.html:11
|
||||||
msgid "Search"
|
msgid "Search"
|
||||||
msgstr "Zoek"
|
msgstr "Zoek"
|
||||||
|
|
||||||
#: sphinx_rtd_theme/layout.html:128
|
#: sphinx_rtd_theme/layout.html:114
|
||||||
|
msgid "Copyright"
|
||||||
|
msgstr "Copyright"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/layout.html:147 sphinx_rtd_theme/layout.html:149
|
||||||
msgid "Logo"
|
msgid "Logo"
|
||||||
msgstr "Logo"
|
msgstr "Logo"
|
||||||
|
|
||||||
#: sphinx_rtd_theme/search.html:29
|
#. This is an ARIA section label for the main navigation menu
|
||||||
|
#: sphinx_rtd_theme/layout.html:173
|
||||||
|
msgid "Navigation menu"
|
||||||
|
msgstr "Navigatiemenu"
|
||||||
|
|
||||||
|
#. This is an ARIA section label for the navigation menu that is visible when
|
||||||
|
#. viewing the page on mobile devices
|
||||||
|
#: sphinx_rtd_theme/layout.html:195
|
||||||
|
msgid "Mobile navigation menu"
|
||||||
|
msgstr "Navigatiemenu voor mobiel"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/search.html:31
|
||||||
msgid "Please activate JavaScript to enable the search functionality."
|
msgid "Please activate JavaScript to enable the search functionality."
|
||||||
msgstr "Zet JavaScript aan om de zoekfunctie mogelijk te maken."
|
msgstr "Zet JavaScript aan om de zoekfunctie mogelijk te maken."
|
||||||
|
|
||||||
#. Search is a noun, not a verb
|
#. Search is a noun, not a verb
|
||||||
#: sphinx_rtd_theme/search.html:37
|
#: sphinx_rtd_theme/search.html:39
|
||||||
msgid "Search Results"
|
msgid "Search Results"
|
||||||
msgstr "Zoekresultaten"
|
msgstr "Zoekresultaten"
|
||||||
|
|
||||||
#: sphinx_rtd_theme/search.html:39
|
#: sphinx_rtd_theme/search.html:41
|
||||||
msgid ""
|
msgid ""
|
||||||
"Your search did not match any documents. Please make sure that all words are"
|
"Your search did not match any documents. Please make sure that all words are"
|
||||||
" spelled correctly and that you've selected enough categories."
|
" spelled correctly and that you've selected enough categories."
|
||||||
|
@ -129,7 +166,7 @@ msgstr ""
|
||||||
msgid "Search docs"
|
msgid "Search docs"
|
||||||
msgstr "Zoek in documentatie"
|
msgstr "Zoek in documentatie"
|
||||||
|
|
||||||
#: sphinx_rtd_theme/versions.html:11
|
#: sphinx_rtd_theme/versions.html:3 sphinx_rtd_theme/versions.html:11
|
||||||
msgid "Versions"
|
msgid "Versions"
|
||||||
msgstr "Versies"
|
msgstr "Versies"
|
||||||
|
|
||||||
|
@ -149,9 +186,3 @@ msgstr "Project Home"
|
||||||
#: sphinx_rtd_theme/versions.html:29
|
#: sphinx_rtd_theme/versions.html:29
|
||||||
msgid "Builds"
|
msgid "Builds"
|
||||||
msgstr "Bouwresultaten"
|
msgstr "Bouwresultaten"
|
||||||
|
|
||||||
#~ msgid "Docs"
|
|
||||||
#~ msgstr "Documentatie"
|
|
||||||
|
|
||||||
#~ msgid "Free document hosting provided by"
|
|
||||||
#~ msgstr "Gratis hosting voor documentatie verzorgd door"
|
|
||||||
|
|
Binary file not shown.
|
@ -0,0 +1,137 @@
|
||||||
|
# English translations for sphinx_rtd_theme.
|
||||||
|
# Copyright (C) 2019 ORGANIZATION
|
||||||
|
# This file is distributed under the same license as the sphinx_rtd_theme
|
||||||
|
# project.
|
||||||
|
# FIRST AUTHOR <EMAIL@ADDRESS>, 2019.
|
||||||
|
#
|
||||||
|
# Translators:
|
||||||
|
# Michal Sniatala, 2021
|
||||||
|
#
|
||||||
|
msgid ""
|
||||||
|
msgstr ""
|
||||||
|
"Project-Id-Version: sphinx_rtd_theme 0.4.3.dev0\n"
|
||||||
|
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
|
||||||
|
"POT-Creation-Date: 2021-09-13 13:35-0600\n"
|
||||||
|
"PO-Revision-Date: 2019-07-16 21:44+0000\n"
|
||||||
|
"Last-Translator: Michal Sniatala, 2021\n"
|
||||||
|
"Language-Team: Polish (https://www.transifex.com/readthedocs/teams/101354/pl/)\n"
|
||||||
|
"MIME-Version: 1.0\n"
|
||||||
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
|
"Generated-By: Babel 2.8.0\n"
|
||||||
|
"Language: pl\n"
|
||||||
|
"Plural-Forms: nplurals=4; plural=(n==1 ? 0 : (n%10>=2 && n%10<=4) && (n%100<12 || n%100>14) ? 1 : n!=1 && (n%10>=0 && n%10<=1) || (n%10>=5 && n%10<=9) || (n%100>=12 && n%100<=14) ? 2 : 3);\n"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/breadcrumbs.html:37 sphinx_rtd_theme/breadcrumbs.html:39
|
||||||
|
msgid "Edit on GitHub"
|
||||||
|
msgstr "Edytuj na GitHub"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/breadcrumbs.html:44 sphinx_rtd_theme/breadcrumbs.html:46
|
||||||
|
msgid "Edit on Bitbucket"
|
||||||
|
msgstr "Edytuj na Bitbucket"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/breadcrumbs.html:51 sphinx_rtd_theme/breadcrumbs.html:53
|
||||||
|
msgid "Edit on GitLab"
|
||||||
|
msgstr "Edytuj na GitLab"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/breadcrumbs.html:56 sphinx_rtd_theme/breadcrumbs.html:58
|
||||||
|
msgid "View page source"
|
||||||
|
msgstr "Zobacz źródło strony"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/breadcrumbs.html:69 sphinx_rtd_theme/footer.html:6
|
||||||
|
msgid "Previous"
|
||||||
|
msgstr "Poprzedni"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/breadcrumbs.html:72 sphinx_rtd_theme/footer.html:9
|
||||||
|
msgid "Next"
|
||||||
|
msgstr "Następny"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/footer.html:21
|
||||||
|
#, python-format
|
||||||
|
msgid "© <a href=\"%(path)s\">Copyright</a> %(copyright)s."
|
||||||
|
msgstr "© <a href=\"%(path)s\">Prawa zastrzeżone</a> %(copyright)s."
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/footer.html:23
|
||||||
|
#, python-format
|
||||||
|
msgid "© Copyright %(copyright)s."
|
||||||
|
msgstr "© Prawa zastrzeżone %(copyright)s."
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/footer.html:41
|
||||||
|
#, python-format
|
||||||
|
msgid "Last updated on %(last_updated)s."
|
||||||
|
msgstr "Ostatnia aktualizacja %(last_updated)s."
|
||||||
|
|
||||||
|
#. the variable "sphinx_web" is a link to the Sphinx project documentation
|
||||||
|
#. with
|
||||||
|
#. the text "Sphinx"
|
||||||
|
#: sphinx_rtd_theme/footer.html:53
|
||||||
|
#, python-format
|
||||||
|
msgid "Built with %(sphinx_web)s using a"
|
||||||
|
msgstr "Zbudowano w %(sphinx_web)s używając"
|
||||||
|
|
||||||
|
#. this is always used as "provided by Read the Docs", and should not imply
|
||||||
|
#. Read the Docs is an author of the generated documentation.
|
||||||
|
#: sphinx_rtd_theme/footer.html:57
|
||||||
|
#, python-format
|
||||||
|
msgid "provided by %(readthedocs_web)s"
|
||||||
|
msgstr "dostarczone przez %(readthedocs_web)s"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/layout.html:97
|
||||||
|
#, python-format
|
||||||
|
msgid "Search within %(docstitle)s"
|
||||||
|
msgstr "Szukaj w %(docstitle)s"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/layout.html:105
|
||||||
|
msgid "About these documents"
|
||||||
|
msgstr "O tych dokumentach"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/layout.html:108
|
||||||
|
msgid "Index"
|
||||||
|
msgstr "Indeks"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/layout.html:111 sphinx_rtd_theme/search.html:11
|
||||||
|
msgid "Search"
|
||||||
|
msgstr "Szukaj"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/layout.html:114
|
||||||
|
msgid "Copyright"
|
||||||
|
msgstr "Prawa zastrzeżone"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/search.html:31
|
||||||
|
msgid "Please activate JavaScript to enable the search functionality."
|
||||||
|
msgstr ""
|
||||||
|
"Proszę aktywować obsługę JavaScript, aby włączyć funkcję wyszukiwania."
|
||||||
|
|
||||||
|
#. Search is a noun, not a verb
|
||||||
|
#: sphinx_rtd_theme/search.html:39
|
||||||
|
msgid "Search Results"
|
||||||
|
msgstr "Wyniki wyszukiwania"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/search.html:41
|
||||||
|
msgid ""
|
||||||
|
"Your search did not match any documents. Please make sure that all words are"
|
||||||
|
" spelled correctly and that you've selected enough categories."
|
||||||
|
msgstr ""
|
||||||
|
"Nie znaleziono szukanej frazy. Upewnij się, że wszystkie słowa są napisane "
|
||||||
|
"poprawnie i że wybrałeś wystarczającą liczbę kategorii."
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/searchbox.html:4
|
||||||
|
msgid "Search docs"
|
||||||
|
msgstr "Szukaj"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/versions.html:3 sphinx_rtd_theme/versions.html:11
|
||||||
|
msgid "Versions"
|
||||||
|
msgstr "Wersje"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/versions.html:17
|
||||||
|
msgid "Downloads"
|
||||||
|
msgstr "Pobrania"
|
||||||
|
|
||||||
|
#. The phrase "Read the Docs" is not translated
|
||||||
|
#: sphinx_rtd_theme/versions.html:24
|
||||||
|
msgid "On Read the Docs"
|
||||||
|
msgstr "Na Read the Docs"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/versions.html:26
|
||||||
|
msgid "Project Home"
|
||||||
|
msgstr "Strona projektu"
|
Binary file not shown.
|
@ -0,0 +1,161 @@
|
||||||
|
# English translations for sphinx_rtd_theme.
|
||||||
|
# Copyright (C) 2019 ORGANIZATION
|
||||||
|
# This file is distributed under the same license as the sphinx_rtd_theme
|
||||||
|
# project.
|
||||||
|
# FIRST AUTHOR <EMAIL@ADDRESS>, 2019.
|
||||||
|
#
|
||||||
|
# Translators:
|
||||||
|
# Ana Costa <anacosta.xl@gmail.com>, 2021
|
||||||
|
#
|
||||||
|
msgid ""
|
||||||
|
msgstr ""
|
||||||
|
"Project-Id-Version: sphinx_rtd_theme 0.4.3.dev0\n"
|
||||||
|
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
|
||||||
|
"POT-Creation-Date: 2021-09-13 13:35-0600\n"
|
||||||
|
"PO-Revision-Date: 2019-07-16 21:44+0000\n"
|
||||||
|
"Last-Translator: Ana Costa <anacosta.xl@gmail.com>, 2021\n"
|
||||||
|
"Language-Team: Portuguese (https://www.transifex.com/readthedocs/teams/101354/pt/)\n"
|
||||||
|
"MIME-Version: 1.0\n"
|
||||||
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
|
"Generated-By: Babel 2.8.0\n"
|
||||||
|
"Language: pt\n"
|
||||||
|
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||||
|
|
||||||
|
#. This is an ARIA section label for page links, including previous/next page
|
||||||
|
#. link and links to GitHub/GitLab/etc.
|
||||||
|
#: sphinx_rtd_theme/breadcrumbs.html:22
|
||||||
|
msgid "Page navigation"
|
||||||
|
msgstr "Navegação da página"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/breadcrumbs.html:37 sphinx_rtd_theme/breadcrumbs.html:39
|
||||||
|
msgid "Edit on GitHub"
|
||||||
|
msgstr "Editar no GitHub"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/breadcrumbs.html:44 sphinx_rtd_theme/breadcrumbs.html:46
|
||||||
|
msgid "Edit on Bitbucket"
|
||||||
|
msgstr "Editar no Bitbucket"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/breadcrumbs.html:51 sphinx_rtd_theme/breadcrumbs.html:53
|
||||||
|
msgid "Edit on GitLab"
|
||||||
|
msgstr "Editar no GitLab"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/breadcrumbs.html:56 sphinx_rtd_theme/breadcrumbs.html:58
|
||||||
|
msgid "View page source"
|
||||||
|
msgstr "Ver código-fonte da página"
|
||||||
|
|
||||||
|
#. This is an ARIA section label for sequential page links, such as previous
|
||||||
|
#. and next page links.
|
||||||
|
#: sphinx_rtd_theme/breadcrumbs.html:67
|
||||||
|
msgid "Sequential page navigation"
|
||||||
|
msgstr "Navegação sequencial da página"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/breadcrumbs.html:69 sphinx_rtd_theme/footer.html:6
|
||||||
|
msgid "Previous"
|
||||||
|
msgstr "Anterior"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/breadcrumbs.html:72 sphinx_rtd_theme/footer.html:9
|
||||||
|
msgid "Next"
|
||||||
|
msgstr "Seguinte"
|
||||||
|
|
||||||
|
#. This is an ARIA section label for the footer section of the page.
|
||||||
|
#: sphinx_rtd_theme/footer.html:4
|
||||||
|
msgid "Footer"
|
||||||
|
msgstr "Rodapé"
|
||||||
|
|
||||||
|
#. the phrase "revision" comes from Git, referring to a commit
|
||||||
|
#: sphinx_rtd_theme/footer.html:36
|
||||||
|
msgid "Revision"
|
||||||
|
msgstr "Revisão"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/footer.html:41
|
||||||
|
#, python-format
|
||||||
|
msgid "Last updated on %(last_updated)s."
|
||||||
|
msgstr "Última actualização em %(last_updated)s."
|
||||||
|
|
||||||
|
#. the variable "sphinx_web" is a link to the Sphinx project documentation
|
||||||
|
#. with
|
||||||
|
#. the text "Sphinx"
|
||||||
|
#: sphinx_rtd_theme/footer.html:53
|
||||||
|
#, python-format
|
||||||
|
msgid "Built with %(sphinx_web)s using a"
|
||||||
|
msgstr "Compilado com %(sphinx_web)s usando um"
|
||||||
|
|
||||||
|
#. "theme" refers to a theme for Sphinx, which alters the appearance of the
|
||||||
|
#. generated documentation
|
||||||
|
#: sphinx_rtd_theme/footer.html:55
|
||||||
|
msgid "theme"
|
||||||
|
msgstr "tema"
|
||||||
|
|
||||||
|
#. this is always used as "provided by Read the Docs", and should not imply
|
||||||
|
#. Read the Docs is an author of the generated documentation.
|
||||||
|
#: sphinx_rtd_theme/footer.html:57
|
||||||
|
#, python-format
|
||||||
|
msgid "provided by %(readthedocs_web)s"
|
||||||
|
msgstr "fornecido por %(readthedocs_web)s"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/layout.html:97
|
||||||
|
#, python-format
|
||||||
|
msgid "Search within %(docstitle)s"
|
||||||
|
msgstr "Procurar em %(docstitle)s"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/layout.html:105
|
||||||
|
msgid "About these documents"
|
||||||
|
msgstr "Sobre estes documentos"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/layout.html:108
|
||||||
|
msgid "Index"
|
||||||
|
msgstr "Índice"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/layout.html:111 sphinx_rtd_theme/search.html:11
|
||||||
|
msgid "Search"
|
||||||
|
msgstr "Pesquisar"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/layout.html:147 sphinx_rtd_theme/layout.html:149
|
||||||
|
msgid "Logo"
|
||||||
|
msgstr "Logo"
|
||||||
|
|
||||||
|
#. This is an ARIA section label for the main navigation menu
|
||||||
|
#: sphinx_rtd_theme/layout.html:173
|
||||||
|
msgid "Navigation menu"
|
||||||
|
msgstr "Menu de navegação"
|
||||||
|
|
||||||
|
#. This is an ARIA section label for the navigation menu that is visible when
|
||||||
|
#. viewing the page on mobile devices
|
||||||
|
#: sphinx_rtd_theme/layout.html:195
|
||||||
|
msgid "Mobile navigation menu"
|
||||||
|
msgstr "Menu de navegação móvel"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/search.html:31
|
||||||
|
msgid "Please activate JavaScript to enable the search functionality."
|
||||||
|
msgstr "Por favor, active o JavaScript para permitir a função de pesquisa."
|
||||||
|
|
||||||
|
#. Search is a noun, not a verb
|
||||||
|
#: sphinx_rtd_theme/search.html:39
|
||||||
|
msgid "Search Results"
|
||||||
|
msgstr "Resultados de Pesquisa"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/search.html:41
|
||||||
|
msgid ""
|
||||||
|
"Your search did not match any documents. Please make sure that all words are"
|
||||||
|
" spelled correctly and that you've selected enough categories."
|
||||||
|
msgstr ""
|
||||||
|
"A sua pesquisa não encontrou nenhum documento. Por favor confirme que todas "
|
||||||
|
"as palavras estão bem escritas e que selecionou categorias suficientes."
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/searchbox.html:4
|
||||||
|
msgid "Search docs"
|
||||||
|
msgstr "Pesquisar docs"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/versions.html:3 sphinx_rtd_theme/versions.html:11
|
||||||
|
msgid "Versions"
|
||||||
|
msgstr "Versões"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/versions.html:17
|
||||||
|
msgid "Downloads"
|
||||||
|
msgstr "Transferências"
|
||||||
|
|
||||||
|
#. The phrase "Read the Docs" is not translated
|
||||||
|
#: sphinx_rtd_theme/versions.html:24
|
||||||
|
msgid "On Read the Docs"
|
||||||
|
msgstr "No Read the Docs"
|
Binary file not shown.
|
@ -5,15 +5,16 @@
|
||||||
# FIRST AUTHOR <EMAIL@ADDRESS>, 2019.
|
# FIRST AUTHOR <EMAIL@ADDRESS>, 2019.
|
||||||
#
|
#
|
||||||
# Translators:
|
# Translators:
|
||||||
# Rafael Fontenelle <rffontenelle@gmail.com>, 2020
|
# Rafael Fontenelle <rffontenelle@gmail.com>, 2021
|
||||||
|
# Wellington Uemura <wellingtonuemura@gmail.com>, 2021
|
||||||
#
|
#
|
||||||
msgid ""
|
msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: sphinx_rtd_theme 0.4.3.dev0\n"
|
"Project-Id-Version: sphinx_rtd_theme 0.4.3.dev0\n"
|
||||||
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
|
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
|
||||||
"POT-Creation-Date: 2020-05-06 13:38-0600\n"
|
"POT-Creation-Date: 2021-09-13 13:35-0600\n"
|
||||||
"PO-Revision-Date: 2019-07-16 21:44+0000\n"
|
"PO-Revision-Date: 2019-07-16 21:44+0000\n"
|
||||||
"Last-Translator: Rafael Fontenelle <rffontenelle@gmail.com>, 2020\n"
|
"Last-Translator: Wellington Uemura <wellingtonuemura@gmail.com>, 2021\n"
|
||||||
"Language-Team: Portuguese (Brazil) (https://www.transifex.com/readthedocs/teams/101354/pt_BR/)\n"
|
"Language-Team: Portuguese (Brazil) (https://www.transifex.com/readthedocs/teams/101354/pt_BR/)\n"
|
||||||
"MIME-Version: 1.0\n"
|
"MIME-Version: 1.0\n"
|
||||||
"Content-Type: text/plain; charset=UTF-8\n"
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
|
@ -22,42 +23,64 @@ msgstr ""
|
||||||
"Language: pt_BR\n"
|
"Language: pt_BR\n"
|
||||||
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
|
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
|
||||||
|
|
||||||
#: sphinx_rtd_theme/breadcrumbs.html:43 sphinx_rtd_theme/breadcrumbs.html:45
|
#. This is an ARIA section label for page links, including previous/next page
|
||||||
|
#. link and links to GitHub/GitLab/etc.
|
||||||
|
#: sphinx_rtd_theme/breadcrumbs.html:22
|
||||||
|
msgid "Page navigation"
|
||||||
|
msgstr "Navegação da página"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/breadcrumbs.html:37 sphinx_rtd_theme/breadcrumbs.html:39
|
||||||
msgid "Edit on GitHub"
|
msgid "Edit on GitHub"
|
||||||
msgstr "Editar no GitHub"
|
msgstr "Editar no GitHub"
|
||||||
|
|
||||||
#: sphinx_rtd_theme/breadcrumbs.html:50 sphinx_rtd_theme/breadcrumbs.html:52
|
#: sphinx_rtd_theme/breadcrumbs.html:44 sphinx_rtd_theme/breadcrumbs.html:46
|
||||||
msgid "Edit on Bitbucket"
|
msgid "Edit on Bitbucket"
|
||||||
msgstr "Editar no Bitbucket"
|
msgstr "Editar no Bitbucket"
|
||||||
|
|
||||||
#: sphinx_rtd_theme/breadcrumbs.html:57 sphinx_rtd_theme/breadcrumbs.html:59
|
#: sphinx_rtd_theme/breadcrumbs.html:51 sphinx_rtd_theme/breadcrumbs.html:53
|
||||||
msgid "Edit on GitLab"
|
msgid "Edit on GitLab"
|
||||||
msgstr "Editar no GitLab"
|
msgstr "Editar no GitLab"
|
||||||
|
|
||||||
#: sphinx_rtd_theme/breadcrumbs.html:62 sphinx_rtd_theme/breadcrumbs.html:64
|
#: sphinx_rtd_theme/breadcrumbs.html:56 sphinx_rtd_theme/breadcrumbs.html:58
|
||||||
msgid "View page source"
|
msgid "View page source"
|
||||||
msgstr "Ver código-fonte da página"
|
msgstr "Ver código-fonte da página"
|
||||||
|
|
||||||
#: sphinx_rtd_theme/breadcrumbs.html:74 sphinx_rtd_theme/footer.html:5
|
#. This is an ARIA section label for sequential page links, such as previous
|
||||||
msgid "Next"
|
#. and next page links.
|
||||||
msgstr "Próximo"
|
#: sphinx_rtd_theme/breadcrumbs.html:67
|
||||||
|
msgid "Sequential page navigation"
|
||||||
|
msgstr "Navegação sequencial da página"
|
||||||
|
|
||||||
#: sphinx_rtd_theme/breadcrumbs.html:77 sphinx_rtd_theme/footer.html:8
|
#: sphinx_rtd_theme/breadcrumbs.html:69 sphinx_rtd_theme/footer.html:6
|
||||||
msgid "Previous"
|
msgid "Previous"
|
||||||
msgstr "Anterior"
|
msgstr "Anterior"
|
||||||
|
|
||||||
#: sphinx_rtd_theme/footer.html:21 sphinx_rtd_theme/footer.html:24
|
#: sphinx_rtd_theme/breadcrumbs.html:72 sphinx_rtd_theme/footer.html:9
|
||||||
#: sphinx_rtd_theme/layout.html:96
|
msgid "Next"
|
||||||
msgid "Copyright"
|
msgstr "Próximo"
|
||||||
msgstr "Copyright"
|
|
||||||
|
#. This is an ARIA section label for the footer section of the page.
|
||||||
|
#: sphinx_rtd_theme/footer.html:4
|
||||||
|
msgid "Footer"
|
||||||
|
msgstr "Rodapé"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/footer.html:21
|
||||||
|
#, python-format
|
||||||
|
msgid "© <a href=\"%(path)s\">Copyright</a> %(copyright)s."
|
||||||
|
msgstr "© <a href=\"%(path)s\">Direitos autorais</a> %(copyright)s."
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/footer.html:23
|
||||||
|
#, python-format
|
||||||
|
msgid "© Copyright %(copyright)s."
|
||||||
|
msgstr "© Direitos autorais %(copyright)s."
|
||||||
|
|
||||||
#. Build is a noun, not a verb
|
#. Build is a noun, not a verb
|
||||||
#: sphinx_rtd_theme/footer.html:31
|
#: sphinx_rtd_theme/footer.html:30
|
||||||
msgid "Build"
|
msgid "Build"
|
||||||
msgstr "Compilação"
|
msgstr "Compilação"
|
||||||
|
|
||||||
#. the phrase "revision" comes from Git, referring to a commit
|
#. the phrase "revision" comes from Git, referring to a commit
|
||||||
#: sphinx_rtd_theme/footer.html:37
|
#: sphinx_rtd_theme/footer.html:36
|
||||||
msgid "Revision"
|
msgid "Revision"
|
||||||
msgstr "Revisão"
|
msgstr "Revisão"
|
||||||
|
|
||||||
|
@ -69,56 +92,71 @@ msgstr "Última atualização em %(last_updated)s."
|
||||||
#. the variable "sphinx_web" is a link to the Sphinx project documentation
|
#. the variable "sphinx_web" is a link to the Sphinx project documentation
|
||||||
#. with
|
#. with
|
||||||
#. the text "Sphinx"
|
#. the text "Sphinx"
|
||||||
#: sphinx_rtd_theme/footer.html:52
|
#: sphinx_rtd_theme/footer.html:53
|
||||||
#, python-format
|
#, python-format
|
||||||
msgid "Built with %(sphinx_web)s using a"
|
msgid "Built with %(sphinx_web)s using a"
|
||||||
msgstr "Compilado com %(sphinx_web)s usando um"
|
msgstr "Compilado com %(sphinx_web)s usando um"
|
||||||
|
|
||||||
#. "theme" refers to a theme for Sphinx, which alters the appearance of the
|
#. "theme" refers to a theme for Sphinx, which alters the appearance of the
|
||||||
#. generated documenation
|
#. generated documentation
|
||||||
#: sphinx_rtd_theme/footer.html:54
|
#: sphinx_rtd_theme/footer.html:55
|
||||||
msgid "theme"
|
msgid "theme"
|
||||||
msgstr "tema"
|
msgstr "tema"
|
||||||
|
|
||||||
#. this is always used as "provided by Read the Docs", and should not imply
|
#. this is always used as "provided by Read the Docs", and should not imply
|
||||||
#. Read the Docs is an author of the generated documentation.
|
#. Read the Docs is an author of the generated documentation.
|
||||||
#: sphinx_rtd_theme/footer.html:56
|
#: sphinx_rtd_theme/footer.html:57
|
||||||
#, python-format
|
#, python-format
|
||||||
msgid "provided by %(readthedocs_web)s"
|
msgid "provided by %(readthedocs_web)s"
|
||||||
msgstr "fornecido por %(readthedocs_web)s"
|
msgstr "fornecido por %(readthedocs_web)s"
|
||||||
|
|
||||||
#: sphinx_rtd_theme/layout.html:79
|
#: sphinx_rtd_theme/layout.html:97
|
||||||
#, python-format
|
#, python-format
|
||||||
msgid "Search within %(docstitle)s"
|
msgid "Search within %(docstitle)s"
|
||||||
msgstr "Pesquisar em %(docstitle)s"
|
msgstr "Pesquisar em %(docstitle)s"
|
||||||
|
|
||||||
#: sphinx_rtd_theme/layout.html:87
|
#: sphinx_rtd_theme/layout.html:105
|
||||||
msgid "About these documents"
|
msgid "About these documents"
|
||||||
msgstr "Sobre esses documentos"
|
msgstr "Sobre esses documentos"
|
||||||
|
|
||||||
#: sphinx_rtd_theme/layout.html:90
|
#: sphinx_rtd_theme/layout.html:108
|
||||||
msgid "Index"
|
msgid "Index"
|
||||||
msgstr "Índice"
|
msgstr "Índice"
|
||||||
|
|
||||||
#: sphinx_rtd_theme/layout.html:93 sphinx_rtd_theme/search.html:11
|
#: sphinx_rtd_theme/layout.html:111 sphinx_rtd_theme/search.html:11
|
||||||
msgid "Search"
|
msgid "Search"
|
||||||
msgstr "Pesquisar"
|
msgstr "Pesquisar"
|
||||||
|
|
||||||
#: sphinx_rtd_theme/layout.html:128
|
#: sphinx_rtd_theme/layout.html:114
|
||||||
|
msgid "Copyright"
|
||||||
|
msgstr "Copyright"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/layout.html:147 sphinx_rtd_theme/layout.html:149
|
||||||
msgid "Logo"
|
msgid "Logo"
|
||||||
msgstr "Logo"
|
msgstr "Logo"
|
||||||
|
|
||||||
#: sphinx_rtd_theme/search.html:29
|
#. This is an ARIA section label for the main navigation menu
|
||||||
|
#: sphinx_rtd_theme/layout.html:173
|
||||||
|
msgid "Navigation menu"
|
||||||
|
msgstr "Menu de navegação"
|
||||||
|
|
||||||
|
#. This is an ARIA section label for the navigation menu that is visible when
|
||||||
|
#. viewing the page on mobile devices
|
||||||
|
#: sphinx_rtd_theme/layout.html:195
|
||||||
|
msgid "Mobile navigation menu"
|
||||||
|
msgstr "Menu de navegação móvel"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/search.html:31
|
||||||
msgid "Please activate JavaScript to enable the search functionality."
|
msgid "Please activate JavaScript to enable the search functionality."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Por favor, ative JavaScript para habilitar a funcionalidade de pesquisa."
|
"Por favor, ative JavaScript para habilitar a funcionalidade de pesquisa."
|
||||||
|
|
||||||
#. Search is a noun, not a verb
|
#. Search is a noun, not a verb
|
||||||
#: sphinx_rtd_theme/search.html:37
|
#: sphinx_rtd_theme/search.html:39
|
||||||
msgid "Search Results"
|
msgid "Search Results"
|
||||||
msgstr "Resultados da pesquisa"
|
msgstr "Resultados da pesquisa"
|
||||||
|
|
||||||
#: sphinx_rtd_theme/search.html:39
|
#: sphinx_rtd_theme/search.html:41
|
||||||
msgid ""
|
msgid ""
|
||||||
"Your search did not match any documents. Please make sure that all words are"
|
"Your search did not match any documents. Please make sure that all words are"
|
||||||
" spelled correctly and that you've selected enough categories."
|
" spelled correctly and that you've selected enough categories."
|
||||||
|
@ -131,7 +169,7 @@ msgstr ""
|
||||||
msgid "Search docs"
|
msgid "Search docs"
|
||||||
msgstr "Pesquisar documentos"
|
msgstr "Pesquisar documentos"
|
||||||
|
|
||||||
#: sphinx_rtd_theme/versions.html:11
|
#: sphinx_rtd_theme/versions.html:3 sphinx_rtd_theme/versions.html:11
|
||||||
msgid "Versions"
|
msgid "Versions"
|
||||||
msgstr "Versões"
|
msgstr "Versões"
|
||||||
|
|
||||||
|
@ -151,9 +189,3 @@ msgstr "Página inicial"
|
||||||
#: sphinx_rtd_theme/versions.html:29
|
#: sphinx_rtd_theme/versions.html:29
|
||||||
msgid "Builds"
|
msgid "Builds"
|
||||||
msgstr "Compilações"
|
msgstr "Compilações"
|
||||||
|
|
||||||
#~ msgid "Docs"
|
|
||||||
#~ msgstr "Docs"
|
|
||||||
|
|
||||||
#~ msgid "Free document hosting provided by"
|
|
||||||
#~ msgstr "Hospedagem de documentos livres fornecida por"
|
|
||||||
|
|
Binary file not shown.
|
@ -5,16 +5,16 @@
|
||||||
# FIRST AUTHOR <EMAIL@ADDRESS>, 2019.
|
# FIRST AUTHOR <EMAIL@ADDRESS>, 2019.
|
||||||
#
|
#
|
||||||
# Translators:
|
# Translators:
|
||||||
# Dmitry Shachnev <mitya57@gmail.com>, 2019
|
|
||||||
# lvv83 <vlozhkin83@gmail.com>, 2019
|
# lvv83 <vlozhkin83@gmail.com>, 2019
|
||||||
|
# Dmitry Shachnev <mitya57@gmail.com>, 2021
|
||||||
#
|
#
|
||||||
msgid ""
|
msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: sphinx_rtd_theme 0.4.3.dev0\n"
|
"Project-Id-Version: sphinx_rtd_theme 0.4.3.dev0\n"
|
||||||
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
|
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
|
||||||
"POT-Creation-Date: 2020-05-06 13:38-0600\n"
|
"POT-Creation-Date: 2021-09-13 13:35-0600\n"
|
||||||
"PO-Revision-Date: 2019-07-16 21:44+0000\n"
|
"PO-Revision-Date: 2019-07-16 21:44+0000\n"
|
||||||
"Last-Translator: lvv83 <vlozhkin83@gmail.com>, 2019\n"
|
"Last-Translator: Dmitry Shachnev <mitya57@gmail.com>, 2021\n"
|
||||||
"Language-Team: Russian (https://www.transifex.com/readthedocs/teams/101354/ru/)\n"
|
"Language-Team: Russian (https://www.transifex.com/readthedocs/teams/101354/ru/)\n"
|
||||||
"MIME-Version: 1.0\n"
|
"MIME-Version: 1.0\n"
|
||||||
"Content-Type: text/plain; charset=UTF-8\n"
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
|
@ -23,42 +23,64 @@ msgstr ""
|
||||||
"Language: ru\n"
|
"Language: ru\n"
|
||||||
"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);\n"
|
"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);\n"
|
||||||
|
|
||||||
#: sphinx_rtd_theme/breadcrumbs.html:43 sphinx_rtd_theme/breadcrumbs.html:45
|
#. This is an ARIA section label for page links, including previous/next page
|
||||||
|
#. link and links to GitHub/GitLab/etc.
|
||||||
|
#: sphinx_rtd_theme/breadcrumbs.html:22
|
||||||
|
msgid "Page navigation"
|
||||||
|
msgstr "Навигация по страницам"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/breadcrumbs.html:37 sphinx_rtd_theme/breadcrumbs.html:39
|
||||||
msgid "Edit on GitHub"
|
msgid "Edit on GitHub"
|
||||||
msgstr "Редактировать на GitHub"
|
msgstr "Редактировать на GitHub"
|
||||||
|
|
||||||
#: sphinx_rtd_theme/breadcrumbs.html:50 sphinx_rtd_theme/breadcrumbs.html:52
|
#: sphinx_rtd_theme/breadcrumbs.html:44 sphinx_rtd_theme/breadcrumbs.html:46
|
||||||
msgid "Edit on Bitbucket"
|
msgid "Edit on Bitbucket"
|
||||||
msgstr "Редактировать на BitBucket"
|
msgstr "Редактировать на BitBucket"
|
||||||
|
|
||||||
#: sphinx_rtd_theme/breadcrumbs.html:57 sphinx_rtd_theme/breadcrumbs.html:59
|
#: sphinx_rtd_theme/breadcrumbs.html:51 sphinx_rtd_theme/breadcrumbs.html:53
|
||||||
msgid "Edit on GitLab"
|
msgid "Edit on GitLab"
|
||||||
msgstr "Редактировать на GitLab"
|
msgstr "Редактировать на GitLab"
|
||||||
|
|
||||||
#: sphinx_rtd_theme/breadcrumbs.html:62 sphinx_rtd_theme/breadcrumbs.html:64
|
#: sphinx_rtd_theme/breadcrumbs.html:56 sphinx_rtd_theme/breadcrumbs.html:58
|
||||||
msgid "View page source"
|
msgid "View page source"
|
||||||
msgstr "Просмотреть исходный код страницы"
|
msgstr "Просмотреть исходный код страницы"
|
||||||
|
|
||||||
#: sphinx_rtd_theme/breadcrumbs.html:74 sphinx_rtd_theme/footer.html:5
|
#. This is an ARIA section label for sequential page links, such as previous
|
||||||
msgid "Next"
|
#. and next page links.
|
||||||
msgstr "Следующая"
|
#: sphinx_rtd_theme/breadcrumbs.html:67
|
||||||
|
msgid "Sequential page navigation"
|
||||||
|
msgstr "Навигация по соседним страницам"
|
||||||
|
|
||||||
#: sphinx_rtd_theme/breadcrumbs.html:77 sphinx_rtd_theme/footer.html:8
|
#: sphinx_rtd_theme/breadcrumbs.html:69 sphinx_rtd_theme/footer.html:6
|
||||||
msgid "Previous"
|
msgid "Previous"
|
||||||
msgstr "Предыдущая"
|
msgstr "Предыдущая"
|
||||||
|
|
||||||
#: sphinx_rtd_theme/footer.html:21 sphinx_rtd_theme/footer.html:24
|
#: sphinx_rtd_theme/breadcrumbs.html:72 sphinx_rtd_theme/footer.html:9
|
||||||
#: sphinx_rtd_theme/layout.html:96
|
msgid "Next"
|
||||||
msgid "Copyright"
|
msgstr "Следующая"
|
||||||
msgstr "Авторские права"
|
|
||||||
|
#. This is an ARIA section label for the footer section of the page.
|
||||||
|
#: sphinx_rtd_theme/footer.html:4
|
||||||
|
msgid "Footer"
|
||||||
|
msgstr "Нижняя область"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/footer.html:21
|
||||||
|
#, python-format
|
||||||
|
msgid "© <a href=\"%(path)s\">Copyright</a> %(copyright)s."
|
||||||
|
msgstr "© <a href=\"%(path)s\">Авторские права</a> %(copyright)s. "
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/footer.html:23
|
||||||
|
#, python-format
|
||||||
|
msgid "© Copyright %(copyright)s."
|
||||||
|
msgstr "© Авторские права %(copyright)s. "
|
||||||
|
|
||||||
#. Build is a noun, not a verb
|
#. Build is a noun, not a verb
|
||||||
#: sphinx_rtd_theme/footer.html:31
|
#: sphinx_rtd_theme/footer.html:30
|
||||||
msgid "Build"
|
msgid "Build"
|
||||||
msgstr "Сборка"
|
msgstr "Сборка"
|
||||||
|
|
||||||
#. the phrase "revision" comes from Git, referring to a commit
|
#. the phrase "revision" comes from Git, referring to a commit
|
||||||
#: sphinx_rtd_theme/footer.html:37
|
#: sphinx_rtd_theme/footer.html:36
|
||||||
msgid "Revision"
|
msgid "Revision"
|
||||||
msgstr "Ревизия"
|
msgstr "Ревизия"
|
||||||
|
|
||||||
|
@ -70,55 +92,70 @@ msgstr "Последний раз обновлено %(last_updated)s."
|
||||||
#. the variable "sphinx_web" is a link to the Sphinx project documentation
|
#. the variable "sphinx_web" is a link to the Sphinx project documentation
|
||||||
#. with
|
#. with
|
||||||
#. the text "Sphinx"
|
#. the text "Sphinx"
|
||||||
#: sphinx_rtd_theme/footer.html:52
|
#: sphinx_rtd_theme/footer.html:53
|
||||||
#, python-format
|
#, python-format
|
||||||
msgid "Built with %(sphinx_web)s using a"
|
msgid "Built with %(sphinx_web)s using a"
|
||||||
msgstr "Собрано при помощи %(sphinx_web)s с использованием"
|
msgstr "Собрано при помощи %(sphinx_web)s с использованием"
|
||||||
|
|
||||||
#. "theme" refers to a theme for Sphinx, which alters the appearance of the
|
#. "theme" refers to a theme for Sphinx, which alters the appearance of the
|
||||||
#. generated documenation
|
#. generated documentation
|
||||||
#: sphinx_rtd_theme/footer.html:54
|
#: sphinx_rtd_theme/footer.html:55
|
||||||
msgid "theme"
|
msgid "theme"
|
||||||
msgstr "темы,"
|
msgstr "темы,"
|
||||||
|
|
||||||
#. this is always used as "provided by Read the Docs", and should not imply
|
#. this is always used as "provided by Read the Docs", and should not imply
|
||||||
#. Read the Docs is an author of the generated documentation.
|
#. Read the Docs is an author of the generated documentation.
|
||||||
#: sphinx_rtd_theme/footer.html:56
|
#: sphinx_rtd_theme/footer.html:57
|
||||||
#, python-format
|
#, python-format
|
||||||
msgid "provided by %(readthedocs_web)s"
|
msgid "provided by %(readthedocs_web)s"
|
||||||
msgstr "предоставленной %(readthedocs_web)s"
|
msgstr "предоставленной %(readthedocs_web)s"
|
||||||
|
|
||||||
#: sphinx_rtd_theme/layout.html:79
|
#: sphinx_rtd_theme/layout.html:97
|
||||||
#, python-format
|
#, python-format
|
||||||
msgid "Search within %(docstitle)s"
|
msgid "Search within %(docstitle)s"
|
||||||
msgstr "Поиск в %(docstitle)s"
|
msgstr "Поиск в %(docstitle)s"
|
||||||
|
|
||||||
#: sphinx_rtd_theme/layout.html:87
|
#: sphinx_rtd_theme/layout.html:105
|
||||||
msgid "About these documents"
|
msgid "About these documents"
|
||||||
msgstr "Об этих документах"
|
msgstr "Об этих документах"
|
||||||
|
|
||||||
#: sphinx_rtd_theme/layout.html:90
|
#: sphinx_rtd_theme/layout.html:108
|
||||||
msgid "Index"
|
msgid "Index"
|
||||||
msgstr "Алфавитный указатель"
|
msgstr "Алфавитный указатель"
|
||||||
|
|
||||||
#: sphinx_rtd_theme/layout.html:93 sphinx_rtd_theme/search.html:11
|
#: sphinx_rtd_theme/layout.html:111 sphinx_rtd_theme/search.html:11
|
||||||
msgid "Search"
|
msgid "Search"
|
||||||
msgstr "Поиск"
|
msgstr "Поиск"
|
||||||
|
|
||||||
#: sphinx_rtd_theme/layout.html:128
|
#: sphinx_rtd_theme/layout.html:114
|
||||||
|
msgid "Copyright"
|
||||||
|
msgstr "Авторские права"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/layout.html:147 sphinx_rtd_theme/layout.html:149
|
||||||
msgid "Logo"
|
msgid "Logo"
|
||||||
msgstr "Логотип"
|
msgstr "Логотип"
|
||||||
|
|
||||||
#: sphinx_rtd_theme/search.html:29
|
#. This is an ARIA section label for the main navigation menu
|
||||||
|
#: sphinx_rtd_theme/layout.html:173
|
||||||
|
msgid "Navigation menu"
|
||||||
|
msgstr "Меню навигации"
|
||||||
|
|
||||||
|
#. This is an ARIA section label for the navigation menu that is visible when
|
||||||
|
#. viewing the page on mobile devices
|
||||||
|
#: sphinx_rtd_theme/layout.html:195
|
||||||
|
msgid "Mobile navigation menu"
|
||||||
|
msgstr "Меню навигации для мобильных устройств"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/search.html:31
|
||||||
msgid "Please activate JavaScript to enable the search functionality."
|
msgid "Please activate JavaScript to enable the search functionality."
|
||||||
msgstr "Активируйте JavaScript, чтобы использовать функционал поиска."
|
msgstr "Активируйте JavaScript, чтобы использовать функционал поиска."
|
||||||
|
|
||||||
#. Search is a noun, not a verb
|
#. Search is a noun, not a verb
|
||||||
#: sphinx_rtd_theme/search.html:37
|
#: sphinx_rtd_theme/search.html:39
|
||||||
msgid "Search Results"
|
msgid "Search Results"
|
||||||
msgstr "Результаты поиска"
|
msgstr "Результаты поиска"
|
||||||
|
|
||||||
#: sphinx_rtd_theme/search.html:39
|
#: sphinx_rtd_theme/search.html:41
|
||||||
msgid ""
|
msgid ""
|
||||||
"Your search did not match any documents. Please make sure that all words are"
|
"Your search did not match any documents. Please make sure that all words are"
|
||||||
" spelled correctly and that you've selected enough categories."
|
" spelled correctly and that you've selected enough categories."
|
||||||
|
@ -130,7 +167,7 @@ msgstr ""
|
||||||
msgid "Search docs"
|
msgid "Search docs"
|
||||||
msgstr "Поиск в документации"
|
msgstr "Поиск в документации"
|
||||||
|
|
||||||
#: sphinx_rtd_theme/versions.html:11
|
#: sphinx_rtd_theme/versions.html:3 sphinx_rtd_theme/versions.html:11
|
||||||
msgid "Versions"
|
msgid "Versions"
|
||||||
msgstr "Версии"
|
msgstr "Версии"
|
||||||
|
|
||||||
|
@ -150,9 +187,3 @@ msgstr "Домашняя страница проекта"
|
||||||
#: sphinx_rtd_theme/versions.html:29
|
#: sphinx_rtd_theme/versions.html:29
|
||||||
msgid "Builds"
|
msgid "Builds"
|
||||||
msgstr "Сборки"
|
msgstr "Сборки"
|
||||||
|
|
||||||
#~ msgid "Docs"
|
|
||||||
#~ msgstr "Документация"
|
|
||||||
|
|
||||||
#~ msgid "Free document hosting provided by"
|
|
||||||
#~ msgstr "Бесплатный хостинг документов, предоставленный"
|
|
||||||
|
|
|
@ -1,15 +1,15 @@
|
||||||
# Translations template for sphinx_rtd_theme.
|
# Translations template for sphinx_rtd_theme.
|
||||||
# Copyright (C) 2020 ORGANIZATION
|
# Copyright (C) 2021 ORGANIZATION
|
||||||
# This file is distributed under the same license as the sphinx_rtd_theme
|
# This file is distributed under the same license as the sphinx_rtd_theme
|
||||||
# project.
|
# project.
|
||||||
# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
|
# FIRST AUTHOR <EMAIL@ADDRESS>, 2021.
|
||||||
#
|
#
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
msgid ""
|
msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: sphinx_rtd_theme 0.4.3.dev0\n"
|
"Project-Id-Version: sphinx_rtd_theme 1.0.0\n"
|
||||||
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
|
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
|
||||||
"POT-Creation-Date: 2020-05-06 13:38-0600\n"
|
"POT-Creation-Date: 2021-09-13 13:35-0600\n"
|
||||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||||
"Language-Team: LANGUAGE <LL@li.org>\n"
|
"Language-Team: LANGUAGE <LL@li.org>\n"
|
||||||
|
@ -18,42 +18,64 @@ msgstr ""
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
"Generated-By: Babel 2.8.0\n"
|
"Generated-By: Babel 2.8.0\n"
|
||||||
|
|
||||||
#: sphinx_rtd_theme/breadcrumbs.html:43 sphinx_rtd_theme/breadcrumbs.html:45
|
#. This is an ARIA section label for page links, including previous/next page
|
||||||
|
#. link and links to GitHub/GitLab/etc.
|
||||||
|
#: sphinx_rtd_theme/breadcrumbs.html:22
|
||||||
|
msgid "Page navigation"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/breadcrumbs.html:37 sphinx_rtd_theme/breadcrumbs.html:39
|
||||||
msgid "Edit on GitHub"
|
msgid "Edit on GitHub"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: sphinx_rtd_theme/breadcrumbs.html:50 sphinx_rtd_theme/breadcrumbs.html:52
|
#: sphinx_rtd_theme/breadcrumbs.html:44 sphinx_rtd_theme/breadcrumbs.html:46
|
||||||
msgid "Edit on Bitbucket"
|
msgid "Edit on Bitbucket"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: sphinx_rtd_theme/breadcrumbs.html:57 sphinx_rtd_theme/breadcrumbs.html:59
|
#: sphinx_rtd_theme/breadcrumbs.html:51 sphinx_rtd_theme/breadcrumbs.html:53
|
||||||
msgid "Edit on GitLab"
|
msgid "Edit on GitLab"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: sphinx_rtd_theme/breadcrumbs.html:62 sphinx_rtd_theme/breadcrumbs.html:64
|
#: sphinx_rtd_theme/breadcrumbs.html:56 sphinx_rtd_theme/breadcrumbs.html:58
|
||||||
msgid "View page source"
|
msgid "View page source"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: sphinx_rtd_theme/breadcrumbs.html:74 sphinx_rtd_theme/footer.html:5
|
#. This is an ARIA section label for sequential page links, such as previous
|
||||||
msgid "Next"
|
#. and next page links.
|
||||||
|
#: sphinx_rtd_theme/breadcrumbs.html:67
|
||||||
|
msgid "Sequential page navigation"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: sphinx_rtd_theme/breadcrumbs.html:77 sphinx_rtd_theme/footer.html:8
|
#: sphinx_rtd_theme/breadcrumbs.html:69 sphinx_rtd_theme/footer.html:6
|
||||||
msgid "Previous"
|
msgid "Previous"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: sphinx_rtd_theme/footer.html:21 sphinx_rtd_theme/footer.html:24
|
#: sphinx_rtd_theme/breadcrumbs.html:72 sphinx_rtd_theme/footer.html:9
|
||||||
#: sphinx_rtd_theme/layout.html:96
|
msgid "Next"
|
||||||
msgid "Copyright"
|
msgstr ""
|
||||||
|
|
||||||
|
#. This is an ARIA section label for the footer section of the page.
|
||||||
|
#: sphinx_rtd_theme/footer.html:4
|
||||||
|
msgid "Footer"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/footer.html:21
|
||||||
|
#, python-format
|
||||||
|
msgid "© <a href=\"%(path)s\">Copyright</a> %(copyright)s."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/footer.html:23
|
||||||
|
#, python-format
|
||||||
|
msgid "© Copyright %(copyright)s."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#. Build is a noun, not a verb
|
#. Build is a noun, not a verb
|
||||||
#: sphinx_rtd_theme/footer.html:31
|
#: sphinx_rtd_theme/footer.html:30
|
||||||
msgid "Build"
|
msgid "Build"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#. the phrase "revision" comes from Git, referring to a commit
|
#. the phrase "revision" comes from Git, referring to a commit
|
||||||
#: sphinx_rtd_theme/footer.html:37
|
#: sphinx_rtd_theme/footer.html:36
|
||||||
msgid "Revision"
|
msgid "Revision"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
@ -64,59 +86,70 @@ msgstr ""
|
||||||
|
|
||||||
#. the variable "sphinx_web" is a link to the Sphinx project documentation with
|
#. the variable "sphinx_web" is a link to the Sphinx project documentation with
|
||||||
#. the text "Sphinx"
|
#. the text "Sphinx"
|
||||||
#: sphinx_rtd_theme/footer.html:52
|
#: sphinx_rtd_theme/footer.html:53
|
||||||
#, python-format
|
#, python-format
|
||||||
msgid "Built with %(sphinx_web)s using a"
|
msgid "Built with %(sphinx_web)s using a"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#. "theme" refers to a theme for Sphinx, which alters the appearance of the
|
#. "theme" refers to a theme for Sphinx, which alters the appearance of the
|
||||||
#. generated documenation
|
#. generated documentation
|
||||||
#: sphinx_rtd_theme/footer.html:54
|
#: sphinx_rtd_theme/footer.html:55
|
||||||
msgid "theme"
|
msgid "theme"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#. this is always used as "provided by Read the Docs", and should not imply
|
#. this is always used as "provided by Read the Docs", and should not imply
|
||||||
#. Read the Docs is an author of the generated documentation.
|
#. Read the Docs is an author of the generated documentation.
|
||||||
#: sphinx_rtd_theme/footer.html:56
|
#: sphinx_rtd_theme/footer.html:57
|
||||||
#, python-format
|
#, python-format
|
||||||
msgid "provided by %(readthedocs_web)s"
|
msgid "provided by %(readthedocs_web)s"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: sphinx_rtd_theme/layout.html:79
|
#: sphinx_rtd_theme/layout.html:97
|
||||||
#, python-format
|
#, python-format
|
||||||
msgid "Search within %(docstitle)s"
|
msgid "Search within %(docstitle)s"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: sphinx_rtd_theme/layout.html:87
|
#: sphinx_rtd_theme/layout.html:105
|
||||||
msgid "About these documents"
|
msgid "About these documents"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: sphinx_rtd_theme/layout.html:90
|
#: sphinx_rtd_theme/layout.html:108
|
||||||
msgid "Index"
|
msgid "Index"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: sphinx_rtd_theme/layout.html:93 sphinx_rtd_theme/search.html:11
|
#: sphinx_rtd_theme/layout.html:111 sphinx_rtd_theme/search.html:11
|
||||||
msgid "Search"
|
msgid "Search"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: sphinx_rtd_theme/layout.html:121
|
#: sphinx_rtd_theme/layout.html:114
|
||||||
msgid "Documentation Home"
|
msgid "Copyright"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: sphinx_rtd_theme/layout.html:128
|
#: sphinx_rtd_theme/layout.html:147 sphinx_rtd_theme/layout.html:149
|
||||||
msgid "Logo"
|
msgid "Logo"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: sphinx_rtd_theme/search.html:29
|
#. This is an ARIA section label for the main navigation menu
|
||||||
|
#: sphinx_rtd_theme/layout.html:173
|
||||||
|
msgid "Navigation menu"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. This is an ARIA section label for the navigation menu that is visible when
|
||||||
|
#. viewing the page on mobile devices
|
||||||
|
#: sphinx_rtd_theme/layout.html:195
|
||||||
|
msgid "Mobile navigation menu"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/search.html:31
|
||||||
msgid "Please activate JavaScript to enable the search functionality."
|
msgid "Please activate JavaScript to enable the search functionality."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#. Search is a noun, not a verb
|
#. Search is a noun, not a verb
|
||||||
#: sphinx_rtd_theme/search.html:37
|
#: sphinx_rtd_theme/search.html:39
|
||||||
msgid "Search Results"
|
msgid "Search Results"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: sphinx_rtd_theme/search.html:39
|
#: sphinx_rtd_theme/search.html:41
|
||||||
msgid ""
|
msgid ""
|
||||||
"Your search did not match any documents. Please make sure that all words "
|
"Your search did not match any documents. Please make sure that all words "
|
||||||
"are spelled correctly and that you've selected enough categories."
|
"are spelled correctly and that you've selected enough categories."
|
||||||
|
@ -126,7 +159,7 @@ msgstr ""
|
||||||
msgid "Search docs"
|
msgid "Search docs"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: sphinx_rtd_theme/versions.html:11
|
#: sphinx_rtd_theme/versions.html:3 sphinx_rtd_theme/versions.html:11
|
||||||
msgid "Versions"
|
msgid "Versions"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
|
Binary file not shown.
|
@ -11,7 +11,7 @@ msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: sphinx_rtd_theme 0.4.3.dev0\n"
|
"Project-Id-Version: sphinx_rtd_theme 0.4.3.dev0\n"
|
||||||
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
|
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
|
||||||
"POT-Creation-Date: 2020-05-06 13:38-0600\n"
|
"POT-Creation-Date: 2021-09-13 13:35-0600\n"
|
||||||
"PO-Revision-Date: 2019-07-16 21:44+0000\n"
|
"PO-Revision-Date: 2019-07-16 21:44+0000\n"
|
||||||
"Last-Translator: Daniel Holmberg <daniel.holmberg97@gmail.com>, 2020\n"
|
"Last-Translator: Daniel Holmberg <daniel.holmberg97@gmail.com>, 2020\n"
|
||||||
"Language-Team: Swedish (https://www.transifex.com/readthedocs/teams/101354/sv/)\n"
|
"Language-Team: Swedish (https://www.transifex.com/readthedocs/teams/101354/sv/)\n"
|
||||||
|
@ -22,42 +22,37 @@ msgstr ""
|
||||||
"Language: sv\n"
|
"Language: sv\n"
|
||||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||||
|
|
||||||
#: sphinx_rtd_theme/breadcrumbs.html:43 sphinx_rtd_theme/breadcrumbs.html:45
|
#: sphinx_rtd_theme/breadcrumbs.html:37 sphinx_rtd_theme/breadcrumbs.html:39
|
||||||
msgid "Edit on GitHub"
|
msgid "Edit on GitHub"
|
||||||
msgstr "Editera på GitHub"
|
msgstr "Editera på GitHub"
|
||||||
|
|
||||||
#: sphinx_rtd_theme/breadcrumbs.html:50 sphinx_rtd_theme/breadcrumbs.html:52
|
#: sphinx_rtd_theme/breadcrumbs.html:44 sphinx_rtd_theme/breadcrumbs.html:46
|
||||||
msgid "Edit on Bitbucket"
|
msgid "Edit on Bitbucket"
|
||||||
msgstr "Editera på Bitbucket"
|
msgstr "Editera på Bitbucket"
|
||||||
|
|
||||||
#: sphinx_rtd_theme/breadcrumbs.html:57 sphinx_rtd_theme/breadcrumbs.html:59
|
#: sphinx_rtd_theme/breadcrumbs.html:51 sphinx_rtd_theme/breadcrumbs.html:53
|
||||||
msgid "Edit on GitLab"
|
msgid "Edit on GitLab"
|
||||||
msgstr "Editera på GitLab"
|
msgstr "Editera på GitLab"
|
||||||
|
|
||||||
#: sphinx_rtd_theme/breadcrumbs.html:62 sphinx_rtd_theme/breadcrumbs.html:64
|
#: sphinx_rtd_theme/breadcrumbs.html:56 sphinx_rtd_theme/breadcrumbs.html:58
|
||||||
msgid "View page source"
|
msgid "View page source"
|
||||||
msgstr "Visa sidkälla"
|
msgstr "Visa sidkälla"
|
||||||
|
|
||||||
#: sphinx_rtd_theme/breadcrumbs.html:74 sphinx_rtd_theme/footer.html:5
|
#: sphinx_rtd_theme/breadcrumbs.html:69 sphinx_rtd_theme/footer.html:6
|
||||||
msgid "Next"
|
|
||||||
msgstr "Nästa"
|
|
||||||
|
|
||||||
#: sphinx_rtd_theme/breadcrumbs.html:77 sphinx_rtd_theme/footer.html:8
|
|
||||||
msgid "Previous"
|
msgid "Previous"
|
||||||
msgstr "Tillbaka"
|
msgstr "Tillbaka"
|
||||||
|
|
||||||
#: sphinx_rtd_theme/footer.html:21 sphinx_rtd_theme/footer.html:24
|
#: sphinx_rtd_theme/breadcrumbs.html:72 sphinx_rtd_theme/footer.html:9
|
||||||
#: sphinx_rtd_theme/layout.html:96
|
msgid "Next"
|
||||||
msgid "Copyright"
|
msgstr "Nästa"
|
||||||
msgstr "Upphovsrätt"
|
|
||||||
|
|
||||||
#. Build is a noun, not a verb
|
#. Build is a noun, not a verb
|
||||||
#: sphinx_rtd_theme/footer.html:31
|
#: sphinx_rtd_theme/footer.html:30
|
||||||
msgid "Build"
|
msgid "Build"
|
||||||
msgstr "Bygg"
|
msgstr "Bygg"
|
||||||
|
|
||||||
#. the phrase "revision" comes from Git, referring to a commit
|
#. the phrase "revision" comes from Git, referring to a commit
|
||||||
#: sphinx_rtd_theme/footer.html:37
|
#: sphinx_rtd_theme/footer.html:36
|
||||||
msgid "Revision"
|
msgid "Revision"
|
||||||
msgstr "Ändra"
|
msgstr "Ändra"
|
||||||
|
|
||||||
|
@ -69,60 +64,60 @@ msgstr "Senast uppdaterad %(last_updated)s."
|
||||||
#. the variable "sphinx_web" is a link to the Sphinx project documentation
|
#. the variable "sphinx_web" is a link to the Sphinx project documentation
|
||||||
#. with
|
#. with
|
||||||
#. the text "Sphinx"
|
#. the text "Sphinx"
|
||||||
#: sphinx_rtd_theme/footer.html:52
|
#: sphinx_rtd_theme/footer.html:53
|
||||||
#, python-format
|
#, python-format
|
||||||
msgid "Built with %(sphinx_web)s using a"
|
msgid "Built with %(sphinx_web)s using a"
|
||||||
msgstr "Gjord med %(sphinx_web)s med hjälp av"
|
msgstr "Gjord med %(sphinx_web)s med hjälp av"
|
||||||
|
|
||||||
#. "theme" refers to a theme for Sphinx, which alters the appearance of the
|
#. "theme" refers to a theme for Sphinx, which alters the appearance of the
|
||||||
#. generated documenation
|
#. generated documenation
|
||||||
#: sphinx_rtd_theme/footer.html:54
|
#: sphinx_rtd_theme/footer.html:55
|
||||||
msgid "theme"
|
msgid "theme"
|
||||||
msgstr "tema"
|
msgstr "tema"
|
||||||
|
|
||||||
#. this is always used as "provided by Read the Docs", and should not imply
|
#. this is always used as "provided by Read the Docs", and should not imply
|
||||||
#. Read the Docs is an author of the generated documentation.
|
#. Read the Docs is an author of the generated documentation.
|
||||||
#: sphinx_rtd_theme/footer.html:56
|
#: sphinx_rtd_theme/footer.html:57
|
||||||
#, python-format
|
#, python-format
|
||||||
msgid "provided by %(readthedocs_web)s"
|
msgid "provided by %(readthedocs_web)s"
|
||||||
msgstr "erhållet av %(readthedocs_web)s"
|
msgstr "erhållet av %(readthedocs_web)s"
|
||||||
|
|
||||||
#: sphinx_rtd_theme/layout.html:79
|
#: sphinx_rtd_theme/layout.html:97
|
||||||
#, python-format
|
#, python-format
|
||||||
msgid "Search within %(docstitle)s"
|
msgid "Search within %(docstitle)s"
|
||||||
msgstr "Sök i %(docstitle)s"
|
msgstr "Sök i %(docstitle)s"
|
||||||
|
|
||||||
#: sphinx_rtd_theme/layout.html:87
|
#: sphinx_rtd_theme/layout.html:105
|
||||||
msgid "About these documents"
|
msgid "About these documents"
|
||||||
msgstr "Om dessa dokument"
|
msgstr "Om dessa dokument"
|
||||||
|
|
||||||
#: sphinx_rtd_theme/layout.html:90
|
#: sphinx_rtd_theme/layout.html:108
|
||||||
msgid "Index"
|
msgid "Index"
|
||||||
msgstr "Index"
|
msgstr "Index"
|
||||||
|
|
||||||
#: sphinx_rtd_theme/layout.html:93 sphinx_rtd_theme/search.html:11
|
#: sphinx_rtd_theme/layout.html:111 sphinx_rtd_theme/search.html:11
|
||||||
msgid "Search"
|
msgid "Search"
|
||||||
msgstr "Sök"
|
msgstr "Sök"
|
||||||
|
|
||||||
#: sphinx_rtd_theme/layout.html:121
|
#: sphinx_rtd_theme/layout.html:114
|
||||||
msgid "Documentation Home"
|
msgid "Copyright"
|
||||||
msgstr "Dokumentation Hem"
|
msgstr "Upphovsrätt"
|
||||||
|
|
||||||
#: sphinx_rtd_theme/layout.html:128
|
#: sphinx_rtd_theme/layout.html:147 sphinx_rtd_theme/layout.html:149
|
||||||
msgid "Logo"
|
msgid "Logo"
|
||||||
msgstr "Logo"
|
msgstr "Logo"
|
||||||
|
|
||||||
#: sphinx_rtd_theme/search.html:29
|
#: sphinx_rtd_theme/search.html:31
|
||||||
msgid "Please activate JavaScript to enable the search functionality."
|
msgid "Please activate JavaScript to enable the search functionality."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Var vänlig och aktivera JavaScript för att möjliggöra sökfunktionaliteten."
|
"Var vänlig och aktivera JavaScript för att möjliggöra sökfunktionaliteten."
|
||||||
|
|
||||||
#. Search is a noun, not a verb
|
#. Search is a noun, not a verb
|
||||||
#: sphinx_rtd_theme/search.html:37
|
#: sphinx_rtd_theme/search.html:39
|
||||||
msgid "Search Results"
|
msgid "Search Results"
|
||||||
msgstr "Sökresultat"
|
msgstr "Sökresultat"
|
||||||
|
|
||||||
#: sphinx_rtd_theme/search.html:39
|
#: sphinx_rtd_theme/search.html:41
|
||||||
msgid ""
|
msgid ""
|
||||||
"Your search did not match any documents. Please make sure that all words are"
|
"Your search did not match any documents. Please make sure that all words are"
|
||||||
" spelled correctly and that you've selected enough categories."
|
" spelled correctly and that you've selected enough categories."
|
||||||
|
@ -134,7 +129,7 @@ msgstr ""
|
||||||
msgid "Search docs"
|
msgid "Search docs"
|
||||||
msgstr "Sök i dokumentationen"
|
msgstr "Sök i dokumentationen"
|
||||||
|
|
||||||
#: sphinx_rtd_theme/versions.html:11
|
#: sphinx_rtd_theme/versions.html:3 sphinx_rtd_theme/versions.html:11
|
||||||
msgid "Versions"
|
msgid "Versions"
|
||||||
msgstr "Versioner"
|
msgstr "Versioner"
|
||||||
|
|
||||||
|
@ -151,8 +146,6 @@ msgstr "På Read the Docs"
|
||||||
msgid "Project Home"
|
msgid "Project Home"
|
||||||
msgstr "Projekt Hem"
|
msgstr "Projekt Hem"
|
||||||
|
|
||||||
#~ msgid "Docs"
|
#: sphinx_rtd_theme/versions.html:29
|
||||||
#~ msgstr "Dokumentation"
|
msgid "Builds"
|
||||||
|
msgstr "Versioner"
|
||||||
#~ msgid "Free document hosting provided by"
|
|
||||||
#~ msgstr "Gratis dokumentations hysning erhållen av"
|
|
||||||
|
|
Binary file not shown.
|
@ -11,7 +11,7 @@ msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: sphinx_rtd_theme 0.4.3.dev0\n"
|
"Project-Id-Version: sphinx_rtd_theme 0.4.3.dev0\n"
|
||||||
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
|
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
|
||||||
"POT-Creation-Date: 2020-05-06 13:38-0600\n"
|
"POT-Creation-Date: 2021-09-13 13:35-0600\n"
|
||||||
"PO-Revision-Date: 2019-07-16 21:44+0000\n"
|
"PO-Revision-Date: 2019-07-16 21:44+0000\n"
|
||||||
"Last-Translator: BouRock, 2020\n"
|
"Last-Translator: BouRock, 2020\n"
|
||||||
"Language-Team: Turkish (https://www.transifex.com/readthedocs/teams/101354/tr/)\n"
|
"Language-Team: Turkish (https://www.transifex.com/readthedocs/teams/101354/tr/)\n"
|
||||||
|
@ -22,42 +22,37 @@ msgstr ""
|
||||||
"Language: tr\n"
|
"Language: tr\n"
|
||||||
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
|
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
|
||||||
|
|
||||||
#: sphinx_rtd_theme/breadcrumbs.html:43 sphinx_rtd_theme/breadcrumbs.html:45
|
#: sphinx_rtd_theme/breadcrumbs.html:37 sphinx_rtd_theme/breadcrumbs.html:39
|
||||||
msgid "Edit on GitHub"
|
msgid "Edit on GitHub"
|
||||||
msgstr "GitHub'da Düzenle"
|
msgstr "GitHub'da Düzenle"
|
||||||
|
|
||||||
#: sphinx_rtd_theme/breadcrumbs.html:50 sphinx_rtd_theme/breadcrumbs.html:52
|
#: sphinx_rtd_theme/breadcrumbs.html:44 sphinx_rtd_theme/breadcrumbs.html:46
|
||||||
msgid "Edit on Bitbucket"
|
msgid "Edit on Bitbucket"
|
||||||
msgstr "Bitbucket'ta Düzenle"
|
msgstr "Bitbucket'ta Düzenle"
|
||||||
|
|
||||||
#: sphinx_rtd_theme/breadcrumbs.html:57 sphinx_rtd_theme/breadcrumbs.html:59
|
#: sphinx_rtd_theme/breadcrumbs.html:51 sphinx_rtd_theme/breadcrumbs.html:53
|
||||||
msgid "Edit on GitLab"
|
msgid "Edit on GitLab"
|
||||||
msgstr "GitLab'ta Düzenle"
|
msgstr "GitLab'ta Düzenle"
|
||||||
|
|
||||||
#: sphinx_rtd_theme/breadcrumbs.html:62 sphinx_rtd_theme/breadcrumbs.html:64
|
#: sphinx_rtd_theme/breadcrumbs.html:56 sphinx_rtd_theme/breadcrumbs.html:58
|
||||||
msgid "View page source"
|
msgid "View page source"
|
||||||
msgstr "Sayfa kaynağını görüntüle"
|
msgstr "Sayfa kaynağını görüntüle"
|
||||||
|
|
||||||
#: sphinx_rtd_theme/breadcrumbs.html:74 sphinx_rtd_theme/footer.html:5
|
#: sphinx_rtd_theme/breadcrumbs.html:69 sphinx_rtd_theme/footer.html:6
|
||||||
msgid "Next"
|
|
||||||
msgstr "Sonraki"
|
|
||||||
|
|
||||||
#: sphinx_rtd_theme/breadcrumbs.html:77 sphinx_rtd_theme/footer.html:8
|
|
||||||
msgid "Previous"
|
msgid "Previous"
|
||||||
msgstr "Önceki"
|
msgstr "Önceki"
|
||||||
|
|
||||||
#: sphinx_rtd_theme/footer.html:21 sphinx_rtd_theme/footer.html:24
|
#: sphinx_rtd_theme/breadcrumbs.html:72 sphinx_rtd_theme/footer.html:9
|
||||||
#: sphinx_rtd_theme/layout.html:96
|
msgid "Next"
|
||||||
msgid "Copyright"
|
msgstr "Sonraki"
|
||||||
msgstr "Telif hakkı"
|
|
||||||
|
|
||||||
#. Build is a noun, not a verb
|
#. Build is a noun, not a verb
|
||||||
#: sphinx_rtd_theme/footer.html:31
|
#: sphinx_rtd_theme/footer.html:30
|
||||||
msgid "Build"
|
msgid "Build"
|
||||||
msgstr "Oluşturma"
|
msgstr "Oluşturma"
|
||||||
|
|
||||||
#. the phrase "revision" comes from Git, referring to a commit
|
#. the phrase "revision" comes from Git, referring to a commit
|
||||||
#: sphinx_rtd_theme/footer.html:37
|
#: sphinx_rtd_theme/footer.html:36
|
||||||
msgid "Revision"
|
msgid "Revision"
|
||||||
msgstr "Gözden geçirme"
|
msgstr "Gözden geçirme"
|
||||||
|
|
||||||
|
@ -67,50 +62,54 @@ msgid "Last updated on %(last_updated)s."
|
||||||
msgstr "Son olarak %(last_updated)s tarihinde güncellendi."
|
msgstr "Son olarak %(last_updated)s tarihinde güncellendi."
|
||||||
|
|
||||||
#. "theme" refers to a theme for Sphinx, which alters the appearance of the
|
#. "theme" refers to a theme for Sphinx, which alters the appearance of the
|
||||||
#. generated documenation
|
#. generated documentation
|
||||||
#: sphinx_rtd_theme/footer.html:54
|
#: sphinx_rtd_theme/footer.html:55
|
||||||
msgid "theme"
|
msgid "theme"
|
||||||
msgstr "tema"
|
msgstr "tema"
|
||||||
|
|
||||||
#. this is always used as "provided by Read the Docs", and should not imply
|
#. this is always used as "provided by Read the Docs", and should not imply
|
||||||
#. Read the Docs is an author of the generated documentation.
|
#. Read the Docs is an author of the generated documentation.
|
||||||
#: sphinx_rtd_theme/footer.html:56
|
#: sphinx_rtd_theme/footer.html:57
|
||||||
#, python-format
|
#, python-format
|
||||||
msgid "provided by %(readthedocs_web)s"
|
msgid "provided by %(readthedocs_web)s"
|
||||||
msgstr "kullanılarak %(readthedocs_web)s tarafından sağlanmasıyla oluşturuldu"
|
msgstr "kullanılarak %(readthedocs_web)s tarafından sağlanmasıyla oluşturuldu"
|
||||||
|
|
||||||
#: sphinx_rtd_theme/layout.html:79
|
#: sphinx_rtd_theme/layout.html:97
|
||||||
#, python-format
|
#, python-format
|
||||||
msgid "Search within %(docstitle)s"
|
msgid "Search within %(docstitle)s"
|
||||||
msgstr "%(docstitle)s içinde ara"
|
msgstr "%(docstitle)s içinde ara"
|
||||||
|
|
||||||
#: sphinx_rtd_theme/layout.html:87
|
#: sphinx_rtd_theme/layout.html:105
|
||||||
msgid "About these documents"
|
msgid "About these documents"
|
||||||
msgstr "Bu belgeler hakkında"
|
msgstr "Bu belgeler hakkında"
|
||||||
|
|
||||||
#: sphinx_rtd_theme/layout.html:90
|
#: sphinx_rtd_theme/layout.html:108
|
||||||
msgid "Index"
|
msgid "Index"
|
||||||
msgstr "Dizin"
|
msgstr "Dizin"
|
||||||
|
|
||||||
#: sphinx_rtd_theme/layout.html:93 sphinx_rtd_theme/search.html:11
|
#: sphinx_rtd_theme/layout.html:111 sphinx_rtd_theme/search.html:11
|
||||||
msgid "Search"
|
msgid "Search"
|
||||||
msgstr "Arama"
|
msgstr "Arama"
|
||||||
|
|
||||||
#: sphinx_rtd_theme/layout.html:128
|
#: sphinx_rtd_theme/layout.html:114
|
||||||
|
msgid "Copyright"
|
||||||
|
msgstr "Telif hakkı"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/layout.html:147 sphinx_rtd_theme/layout.html:149
|
||||||
msgid "Logo"
|
msgid "Logo"
|
||||||
msgstr "Logo"
|
msgstr "Logo"
|
||||||
|
|
||||||
#: sphinx_rtd_theme/search.html:29
|
#: sphinx_rtd_theme/search.html:31
|
||||||
msgid "Please activate JavaScript to enable the search functionality."
|
msgid "Please activate JavaScript to enable the search functionality."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Arama işlevselliğini etkinleştirmek için lütfen JavaScript'i etkinleştirin."
|
"Arama işlevselliğini etkinleştirmek için lütfen JavaScript'i etkinleştirin."
|
||||||
|
|
||||||
#. Search is a noun, not a verb
|
#. Search is a noun, not a verb
|
||||||
#: sphinx_rtd_theme/search.html:37
|
#: sphinx_rtd_theme/search.html:39
|
||||||
msgid "Search Results"
|
msgid "Search Results"
|
||||||
msgstr "Arama Sonuçları"
|
msgstr "Arama Sonuçları"
|
||||||
|
|
||||||
#: sphinx_rtd_theme/search.html:39
|
#: sphinx_rtd_theme/search.html:41
|
||||||
msgid ""
|
msgid ""
|
||||||
"Your search did not match any documents. Please make sure that all words are"
|
"Your search did not match any documents. Please make sure that all words are"
|
||||||
" spelled correctly and that you've selected enough categories."
|
" spelled correctly and that you've selected enough categories."
|
||||||
|
@ -122,7 +121,7 @@ msgstr ""
|
||||||
msgid "Search docs"
|
msgid "Search docs"
|
||||||
msgstr "Belgeleri arayın"
|
msgstr "Belgeleri arayın"
|
||||||
|
|
||||||
#: sphinx_rtd_theme/versions.html:11
|
#: sphinx_rtd_theme/versions.html:3 sphinx_rtd_theme/versions.html:11
|
||||||
msgid "Versions"
|
msgid "Versions"
|
||||||
msgstr "Sürümler"
|
msgstr "Sürümler"
|
||||||
|
|
||||||
|
@ -142,6 +141,3 @@ msgstr "Proje Ana Sayfa"
|
||||||
#: sphinx_rtd_theme/versions.html:29
|
#: sphinx_rtd_theme/versions.html:29
|
||||||
msgid "Builds"
|
msgid "Builds"
|
||||||
msgstr "Oluşturmalar"
|
msgstr "Oluşturmalar"
|
||||||
|
|
||||||
#~ msgid "Free document hosting provided by"
|
|
||||||
#~ msgstr "Ücretsiz belge barındırmayı sağlayan"
|
|
||||||
|
|
Binary file not shown.
|
@ -12,7 +12,7 @@ msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: sphinx_rtd_theme 0.4.3.dev0\n"
|
"Project-Id-Version: sphinx_rtd_theme 0.4.3.dev0\n"
|
||||||
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
|
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
|
||||||
"POT-Creation-Date: 2020-05-06 13:38-0600\n"
|
"POT-Creation-Date: 2021-09-13 13:35-0600\n"
|
||||||
"PO-Revision-Date: 2019-07-16 21:44+0000\n"
|
"PO-Revision-Date: 2019-07-16 21:44+0000\n"
|
||||||
"Last-Translator: Anthony <aj@ohess.org>, 2020\n"
|
"Last-Translator: Anthony <aj@ohess.org>, 2020\n"
|
||||||
"Language-Team: Chinese (China) (https://www.transifex.com/readthedocs/teams/101354/zh_CN/)\n"
|
"Language-Team: Chinese (China) (https://www.transifex.com/readthedocs/teams/101354/zh_CN/)\n"
|
||||||
|
@ -23,40 +23,40 @@ msgstr ""
|
||||||
"Language: zh_CN\n"
|
"Language: zh_CN\n"
|
||||||
"Plural-Forms: nplurals=1; plural=0;\n"
|
"Plural-Forms: nplurals=1; plural=0;\n"
|
||||||
|
|
||||||
#: sphinx_rtd_theme/breadcrumbs.html:43 sphinx_rtd_theme/breadcrumbs.html:45
|
#: sphinx_rtd_theme/breadcrumbs.html:37 sphinx_rtd_theme/breadcrumbs.html:39
|
||||||
msgid "Edit on GitHub"
|
msgid "Edit on GitHub"
|
||||||
msgstr "在 GitHub 上修改"
|
msgstr "在 GitHub 上修改"
|
||||||
|
|
||||||
#: sphinx_rtd_theme/breadcrumbs.html:50 sphinx_rtd_theme/breadcrumbs.html:52
|
#: sphinx_rtd_theme/breadcrumbs.html:44 sphinx_rtd_theme/breadcrumbs.html:46
|
||||||
msgid "Edit on Bitbucket"
|
msgid "Edit on Bitbucket"
|
||||||
msgstr "在 Bitbucket 上修改"
|
msgstr "在 Bitbucket 上修改"
|
||||||
|
|
||||||
#: sphinx_rtd_theme/breadcrumbs.html:57 sphinx_rtd_theme/breadcrumbs.html:59
|
#: sphinx_rtd_theme/breadcrumbs.html:51 sphinx_rtd_theme/breadcrumbs.html:53
|
||||||
msgid "Edit on GitLab"
|
msgid "Edit on GitLab"
|
||||||
msgstr "在 GitLab 上修改"
|
msgstr "在 GitLab 上修改"
|
||||||
|
|
||||||
#: sphinx_rtd_theme/breadcrumbs.html:62 sphinx_rtd_theme/breadcrumbs.html:64
|
#: sphinx_rtd_theme/breadcrumbs.html:56 sphinx_rtd_theme/breadcrumbs.html:58
|
||||||
msgid "View page source"
|
msgid "View page source"
|
||||||
msgstr "查看页面源码"
|
msgstr "查看页面源码"
|
||||||
|
|
||||||
#: sphinx_rtd_theme/breadcrumbs.html:74 sphinx_rtd_theme/footer.html:5
|
#: sphinx_rtd_theme/breadcrumbs.html:69 sphinx_rtd_theme/footer.html:6
|
||||||
msgid "Next"
|
|
||||||
msgstr "下一页"
|
|
||||||
|
|
||||||
#: sphinx_rtd_theme/breadcrumbs.html:77 sphinx_rtd_theme/footer.html:8
|
|
||||||
msgid "Previous"
|
msgid "Previous"
|
||||||
msgstr "上一页"
|
msgstr "上一页"
|
||||||
|
|
||||||
#: sphinx_rtd_theme/footer.html:21 sphinx_rtd_theme/footer.html:24
|
#: sphinx_rtd_theme/breadcrumbs.html:72 sphinx_rtd_theme/footer.html:9
|
||||||
#: sphinx_rtd_theme/layout.html:96
|
msgid "Next"
|
||||||
msgid "Copyright"
|
msgstr "下一页"
|
||||||
msgstr "版权所有"
|
|
||||||
|
|
||||||
#. Build is a noun, not a verb
|
#. Build is a noun, not a verb
|
||||||
#: sphinx_rtd_theme/footer.html:31
|
#: sphinx_rtd_theme/footer.html:30
|
||||||
msgid "Build"
|
msgid "Build"
|
||||||
msgstr "构建"
|
msgstr "构建"
|
||||||
|
|
||||||
|
#. the phrase "revision" comes from Git, referring to a commit
|
||||||
|
#: sphinx_rtd_theme/footer.html:36
|
||||||
|
msgid "Revision"
|
||||||
|
msgstr "修订"
|
||||||
|
|
||||||
#: sphinx_rtd_theme/footer.html:41
|
#: sphinx_rtd_theme/footer.html:41
|
||||||
#, python-format
|
#, python-format
|
||||||
msgid "Last updated on %(last_updated)s."
|
msgid "Last updated on %(last_updated)s."
|
||||||
|
@ -65,55 +65,59 @@ msgstr "最后更新时间 %(last_updated)s。"
|
||||||
#. the variable "sphinx_web" is a link to the Sphinx project documentation
|
#. the variable "sphinx_web" is a link to the Sphinx project documentation
|
||||||
#. with
|
#. with
|
||||||
#. the text "Sphinx"
|
#. the text "Sphinx"
|
||||||
#: sphinx_rtd_theme/footer.html:52
|
#: sphinx_rtd_theme/footer.html:53
|
||||||
#, python-format
|
#, python-format
|
||||||
msgid "Built with %(sphinx_web)s using a"
|
msgid "Built with %(sphinx_web)s using a"
|
||||||
msgstr "利用 %(sphinx_web)s 构建,使用了 "
|
msgstr "利用 %(sphinx_web)s 构建,使用了 "
|
||||||
|
|
||||||
#. "theme" refers to a theme for Sphinx, which alters the appearance of the
|
#. "theme" refers to a theme for Sphinx, which alters the appearance of the
|
||||||
#. generated documenation
|
#. generated documentation
|
||||||
#: sphinx_rtd_theme/footer.html:54
|
#: sphinx_rtd_theme/footer.html:55
|
||||||
msgid "theme"
|
msgid "theme"
|
||||||
msgstr "主题"
|
msgstr "主题"
|
||||||
|
|
||||||
#. this is always used as "provided by Read the Docs", and should not imply
|
#. this is always used as "provided by Read the Docs", and should not imply
|
||||||
#. Read the Docs is an author of the generated documentation.
|
#. Read the Docs is an author of the generated documentation.
|
||||||
#: sphinx_rtd_theme/footer.html:56
|
#: sphinx_rtd_theme/footer.html:57
|
||||||
#, python-format
|
#, python-format
|
||||||
msgid "provided by %(readthedocs_web)s"
|
msgid "provided by %(readthedocs_web)s"
|
||||||
msgstr "由 %(readthedocs_web)s开发"
|
msgstr "由 %(readthedocs_web)s开发"
|
||||||
|
|
||||||
#: sphinx_rtd_theme/layout.html:79
|
#: sphinx_rtd_theme/layout.html:97
|
||||||
#, python-format
|
#, python-format
|
||||||
msgid "Search within %(docstitle)s"
|
msgid "Search within %(docstitle)s"
|
||||||
msgstr "在 %(docstitle)s中搜索"
|
msgstr "在 %(docstitle)s中搜索"
|
||||||
|
|
||||||
#: sphinx_rtd_theme/layout.html:87
|
#: sphinx_rtd_theme/layout.html:105
|
||||||
msgid "About these documents"
|
msgid "About these documents"
|
||||||
msgstr "关于此文档"
|
msgstr "关于此文档"
|
||||||
|
|
||||||
#: sphinx_rtd_theme/layout.html:90
|
#: sphinx_rtd_theme/layout.html:108
|
||||||
msgid "Index"
|
msgid "Index"
|
||||||
msgstr "索引"
|
msgstr "索引"
|
||||||
|
|
||||||
#: sphinx_rtd_theme/layout.html:93 sphinx_rtd_theme/search.html:11
|
#: sphinx_rtd_theme/layout.html:111 sphinx_rtd_theme/search.html:11
|
||||||
msgid "Search"
|
msgid "Search"
|
||||||
msgstr "搜索"
|
msgstr "搜索"
|
||||||
|
|
||||||
#: sphinx_rtd_theme/layout.html:128
|
#: sphinx_rtd_theme/layout.html:114
|
||||||
|
msgid "Copyright"
|
||||||
|
msgstr "版权所有"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/layout.html:147 sphinx_rtd_theme/layout.html:149
|
||||||
msgid "Logo"
|
msgid "Logo"
|
||||||
msgstr "Logo"
|
msgstr "Logo"
|
||||||
|
|
||||||
#: sphinx_rtd_theme/search.html:29
|
#: sphinx_rtd_theme/search.html:31
|
||||||
msgid "Please activate JavaScript to enable the search functionality."
|
msgid "Please activate JavaScript to enable the search functionality."
|
||||||
msgstr "请启用 JavaScript 以便使用搜索功能"
|
msgstr "请启用 JavaScript 以便使用搜索功能"
|
||||||
|
|
||||||
#. Search is a noun, not a verb
|
#. Search is a noun, not a verb
|
||||||
#: sphinx_rtd_theme/search.html:37
|
#: sphinx_rtd_theme/search.html:39
|
||||||
msgid "Search Results"
|
msgid "Search Results"
|
||||||
msgstr "搜索结果"
|
msgstr "搜索结果"
|
||||||
|
|
||||||
#: sphinx_rtd_theme/search.html:39
|
#: sphinx_rtd_theme/search.html:41
|
||||||
msgid ""
|
msgid ""
|
||||||
"Your search did not match any documents. Please make sure that all words are"
|
"Your search did not match any documents. Please make sure that all words are"
|
||||||
" spelled correctly and that you've selected enough categories."
|
" spelled correctly and that you've selected enough categories."
|
||||||
|
@ -123,7 +127,7 @@ msgstr "您的搜索没有匹配到任何文档。请确保所有单词拼写正
|
||||||
msgid "Search docs"
|
msgid "Search docs"
|
||||||
msgstr "在文档中搜索"
|
msgstr "在文档中搜索"
|
||||||
|
|
||||||
#: sphinx_rtd_theme/versions.html:11
|
#: sphinx_rtd_theme/versions.html:3 sphinx_rtd_theme/versions.html:11
|
||||||
msgid "Versions"
|
msgid "Versions"
|
||||||
msgstr "版本列表"
|
msgstr "版本列表"
|
||||||
|
|
||||||
|
@ -143,9 +147,3 @@ msgstr "项目首页"
|
||||||
#: sphinx_rtd_theme/versions.html:29
|
#: sphinx_rtd_theme/versions.html:29
|
||||||
msgid "Builds"
|
msgid "Builds"
|
||||||
msgstr "构建"
|
msgstr "构建"
|
||||||
|
|
||||||
#~ msgid "Docs"
|
|
||||||
#~ msgstr "文档"
|
|
||||||
|
|
||||||
#~ msgid "Free document hosting provided by"
|
|
||||||
#~ msgstr "此文档免费托管于"
|
|
||||||
|
|
|
@ -5,22 +5,23 @@
|
||||||
Template for the search page.
|
Template for the search page.
|
||||||
|
|
||||||
:copyright: Copyright 2007-2013 by the Sphinx team, see AUTHORS.
|
:copyright: Copyright 2007-2013 by the Sphinx team, see AUTHORS.
|
||||||
:license: BSD, see LICENSE for details.
|
:license: BSD, see https://github.com/sphinx-doc/sphinx/blob/master/LICENSE for details.
|
||||||
#}
|
#}
|
||||||
{%- extends "layout.html" %}
|
{%- extends "layout.html" %}
|
||||||
{% set title = _('Search') %}
|
{% set title = _('Search') %}
|
||||||
{% set display_vcs_links = False %}
|
{% set display_vcs_links = False %}
|
||||||
{%- block scripts %}
|
{%- block scripts %}
|
||||||
{{ super() }}
|
{{ super() }}
|
||||||
<script type="text/javascript" src="{{ pathto('_static/searchtools.js', 1) }}"></script>
|
<script src="{{ pathto('_static/searchtools.js', 1) }}"></script>
|
||||||
|
<script src="{{ pathto('_static/language_data.js', 1) }}"></script>
|
||||||
{%- endblock %}
|
{%- endblock %}
|
||||||
{% block footer %}
|
{% block footer %}
|
||||||
<script type="text/javascript">
|
<script>
|
||||||
jQuery(function() { Search.loadIndex("{{ pathto('searchindex.js', 1) }}"); });
|
jQuery(function() { Search.loadIndex("{{ pathto('searchindex.js', 1) }}"); });
|
||||||
</script>
|
</script>
|
||||||
{# this is used when loading the search index using $.ajax fails,
|
{# this is used when loading the search index using $.ajax fails,
|
||||||
such as on Chrome for documents on localhost #}
|
such as on Chrome for documents on localhost #}
|
||||||
<script type="text/javascript" id="searchindexloader"></script>
|
<script id="searchindexloader"></script>
|
||||||
{{ super() }}
|
{{ super() }}
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
{% block body %}
|
{% block body %}
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
{%- if builder != 'singlehtml' %}
|
{%- if 'singlehtml' not in builder %}
|
||||||
<div role="search">
|
<div role="search">
|
||||||
<form id="rtd-search-form" class="wy-form" action="{{ pathto('search') }}" method="get">
|
<form id="rtd-search-form" class="wy-form" action="{{ pathto('search') }}" method="get">
|
||||||
<input type="text" name="q" placeholder="{{ _('Search docs') }}" />
|
<input type="text" name="q" placeholder="{{ _('Search docs') }}" />
|
||||||
|
|
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
@ -6,6 +6,7 @@ pygments_style = default
|
||||||
[options]
|
[options]
|
||||||
canonical_url =
|
canonical_url =
|
||||||
analytics_id =
|
analytics_id =
|
||||||
|
analytics_anonymize_ip = False
|
||||||
collapse_navigation = True
|
collapse_navigation = True
|
||||||
sticky_navigation = True
|
sticky_navigation = True
|
||||||
navigation_depth = 4
|
navigation_depth = 4
|
||||||
|
@ -15,4 +16,5 @@ logo_only =
|
||||||
display_version = True
|
display_version = True
|
||||||
prev_next_buttons_location = bottom
|
prev_next_buttons_location = bottom
|
||||||
style_external_links = False
|
style_external_links = False
|
||||||
style_nav_header_background =
|
style_nav_header_background =
|
||||||
|
vcs_pageview_mode =
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
{% if READTHEDOCS %}
|
{% if READTHEDOCS %}
|
||||||
{# Add rst-badge after rst-versions for small badge style. #}
|
{# Add rst-badge after rst-versions for small badge style. #}
|
||||||
<div class="rst-versions" data-toggle="rst-versions" role="note" aria-label="versions">
|
<div class="rst-versions" data-toggle="rst-versions" role="note" aria-label="{{ _('Versions') }}">
|
||||||
<span class="rst-current-version" data-toggle="rst-current-version">
|
<span class="rst-current-version" data-toggle="rst-current-version">
|
||||||
<span class="fa fa-book"> Read the Docs</span>
|
<span class="fa fa-book"> Read the Docs</span>
|
||||||
v: {{ current_version }}
|
v: {{ current_version }}
|
||||||
|
|
|
@ -1,5 +0,0 @@
|
||||||
asio_http2.h
|
|
||||||
============
|
|
||||||
|
|
||||||
.. literalinclude:: @top_srcdir@/src/includes/nghttp2/asio_http2.h
|
|
||||||
:language: cpp
|
|
|
@ -1,5 +0,0 @@
|
||||||
asio_http2_client.h
|
|
||||||
===================
|
|
||||||
|
|
||||||
.. literalinclude:: @top_srcdir@/src/includes/nghttp2/asio_http2_client.h
|
|
||||||
:language: cpp
|
|
|
@ -1,5 +0,0 @@
|
||||||
asio_http2_server.h
|
|
||||||
===================
|
|
||||||
|
|
||||||
.. literalinclude:: @top_srcdir@/src/includes/nghttp2/asio_http2_server.h
|
|
||||||
:language: cpp
|
|
|
@ -8,7 +8,7 @@ _h2load()
|
||||||
_get_comp_words_by_ref cur prev
|
_get_comp_words_by_ref cur prev
|
||||||
case $cur in
|
case $cur in
|
||||||
-*)
|
-*)
|
||||||
COMPREPLY=( $( compgen -W '--requests --clients --threads --input-file --max-concurrent-streams --window-bits --connection-window-bits --header --ciphers --tls13-ciphers --no-tls-proto --data --rate --rate-period --duration --warm-up-time --connection-active-timeout --connection-inactivity-timeout --timing-script-file --base-uri --npn-list --h1 --header-table-size --encoder-header-table-size --log-file --qlog-file-base --connect-to --rps --groups --no-udp-gso --max-udp-payload-size --verbose --version --help ' -- "$cur" ) )
|
COMPREPLY=( $( compgen -W '--requests --clients --threads --input-file --max-concurrent-streams --max-frame-size --window-bits --connection-window-bits --header --ciphers --tls13-ciphers --no-tls-proto --data --rate --rate-period --duration --warm-up-time --connection-active-timeout --connection-inactivity-timeout --timing-script-file --base-uri --npn-list --h1 --header-table-size --encoder-header-table-size --log-file --qlog-file-base --connect-to --rps --groups --no-udp-gso --max-udp-payload-size --ktls --verbose --version --help ' -- "$cur" ) )
|
||||||
;;
|
;;
|
||||||
*)
|
*)
|
||||||
_filedir
|
_filedir
|
||||||
|
|
|
@ -8,7 +8,7 @@ _nghttp()
|
||||||
_get_comp_words_by_ref cur prev
|
_get_comp_words_by_ref cur prev
|
||||||
case $cur in
|
case $cur in
|
||||||
-*)
|
-*)
|
||||||
COMPREPLY=( $( compgen -W '--verbose --null-out --remote-name --timeout --window-bits --connection-window-bits --get-assets --stat --header --trailer --cert --key --data --multiply --upgrade --weight --peer-max-concurrent-streams --header-table-size --encoder-header-table-size --padding --har --color --continuation --no-content-length --no-dep --hexdump --no-push --max-concurrent-streams --expect-continue --no-verify-peer --version --help ' -- "$cur" ) )
|
COMPREPLY=( $( compgen -W '--verbose --null-out --remote-name --timeout --window-bits --connection-window-bits --get-assets --stat --header --trailer --cert --key --data --multiply --upgrade --weight --peer-max-concurrent-streams --header-table-size --encoder-header-table-size --padding --har --color --continuation --no-content-length --no-dep --hexdump --no-push --max-concurrent-streams --expect-continue --no-verify-peer --ktls --no-rfc7540-pri --version --help ' -- "$cur" ) )
|
||||||
;;
|
;;
|
||||||
*)
|
*)
|
||||||
_filedir
|
_filedir
|
||||||
|
|
|
@ -8,7 +8,7 @@ _nghttpd()
|
||||||
_get_comp_words_by_ref cur prev
|
_get_comp_words_by_ref cur prev
|
||||||
case $cur in
|
case $cur in
|
||||||
-*)
|
-*)
|
||||||
COMPREPLY=( $( compgen -W '--address --daemon --verify-client --htdocs --verbose --no-tls --header-table-size --encoder-header-table-size --color --push --padding --max-concurrent-streams --workers --error-gzip --window-bits --connection-window-bits --dh-param-file --early-response --trailer --hexdump --echo-upload --mime-types-file --no-content-length --version --help ' -- "$cur" ) )
|
COMPREPLY=( $( compgen -W '--address --daemon --verify-client --htdocs --verbose --no-tls --header-table-size --encoder-header-table-size --color --push --padding --max-concurrent-streams --workers --error-gzip --window-bits --connection-window-bits --dh-param-file --early-response --trailer --hexdump --echo-upload --mime-types-file --no-content-length --ktls --no-rfc7540-pri --version --help ' -- "$cur" ) )
|
||||||
;;
|
;;
|
||||||
*)
|
*)
|
||||||
_filedir
|
_filedir
|
||||||
|
|
|
@ -8,7 +8,7 @@ _nghttpx()
|
||||||
_get_comp_words_by_ref cur prev
|
_get_comp_words_by_ref cur prev
|
||||||
case $cur in
|
case $cur in
|
||||||
-*)
|
-*)
|
||||||
COMPREPLY=( $( compgen -W '--backend --frontend --backlog --backend-address-family --backend-http-proxy-uri --workers --single-thread --read-rate --read-burst --write-rate --write-burst --worker-read-rate --worker-read-burst --worker-write-rate --worker-write-burst --worker-frontend-connections --backend-connections-per-host --backend-connections-per-frontend --rlimit-nofile --backend-request-buffer --backend-response-buffer --fastopen --no-kqueue --frontend-http2-read-timeout --frontend-http3-read-timeout --frontend-read-timeout --frontend-write-timeout --frontend-keep-alive-timeout --stream-read-timeout --stream-write-timeout --backend-read-timeout --backend-write-timeout --backend-connect-timeout --backend-keep-alive-timeout --listener-disable-timeout --frontend-http2-setting-timeout --backend-http2-settings-timeout --backend-max-backoff --ciphers --tls13-ciphers --client-ciphers --tls13-client-ciphers --ecdh-curves --insecure --cacert --private-key-passwd-file --subcert --dh-param-file --npn-list --verify-client --verify-client-cacert --verify-client-tolerate-expired --client-private-key-file --client-cert-file --tls-min-proto-version --tls-max-proto-version --tls-ticket-key-file --tls-ticket-key-memcached --tls-ticket-key-memcached-address-family --tls-ticket-key-memcached-interval --tls-ticket-key-memcached-max-retry --tls-ticket-key-memcached-max-fail --tls-ticket-key-cipher --tls-ticket-key-memcached-cert-file --tls-ticket-key-memcached-private-key-file --fetch-ocsp-response-file --ocsp-update-interval --ocsp-startup --no-verify-ocsp --no-ocsp --tls-session-cache-memcached --tls-session-cache-memcached-address-family --tls-session-cache-memcached-cert-file --tls-session-cache-memcached-private-key-file --tls-dyn-rec-warmup-threshold --tls-dyn-rec-idle-timeout --no-http2-cipher-block-list --client-no-http2-cipher-block-list --tls-sct-dir --psk-secrets --client-psk-secrets --tls-no-postpone-early-data --tls-max-early-data --frontend-http2-max-concurrent-streams --backend-http2-max-concurrent-streams --frontend-http2-window-size --frontend-http2-connection-window-size --backend-http2-window-size --backend-http2-connection-window-size --http2-no-cookie-crumbling --padding --no-server-push --frontend-http2-optimize-write-buffer-size --frontend-http2-optimize-window-size --frontend-http2-encoder-dynamic-table-size --frontend-http2-decoder-dynamic-table-size --backend-http2-encoder-dynamic-table-size --backend-http2-decoder-dynamic-table-size --http2-proxy --log-level --accesslog-file --accesslog-syslog --accesslog-format --accesslog-write-early --errorlog-file --errorlog-syslog --syslog-facility --add-x-forwarded-for --strip-incoming-x-forwarded-for --no-add-x-forwarded-proto --no-strip-incoming-x-forwarded-proto --add-forwarded --strip-incoming-forwarded --forwarded-by --forwarded-for --no-via --no-strip-incoming-early-data --no-location-rewrite --host-rewrite --altsvc --http2-altsvc --add-request-header --add-response-header --request-header-field-buffer --max-request-header-fields --response-header-field-buffer --max-response-header-fields --error-page --server-name --no-server-rewrite --redirect-https-port --api-max-request-body --dns-cache-timeout --dns-lookup-timeout --dns-max-try --frontend-max-requests --frontend-http2-dump-request-header --frontend-http2-dump-response-header --frontend-frame-debug --daemon --pid-file --user --single-process --mruby-file --ignore-per-pattern-mruby-error --frontend-quic-idle-timeout --frontend-quic-debug-log --quic-bpf-program-file --frontend-quic-early-data --frontend-quic-qlog-dir --frontend-quic-require-token --frontend-quic-congestion-controller --frontend-quic-connection-id-encryption-key --no-quic-bpf --frontend-http3-window-size --frontend-http3-connection-window-size --frontend-http3-max-window-size --frontend-http3-max-connection-window-size --frontend-http3-max-concurrent-streams --conf --include --version --help ' -- "$cur" ) )
|
COMPREPLY=( $( compgen -W '--backend --frontend --backlog --backend-address-family --backend-http-proxy-uri --workers --single-thread --read-rate --read-burst --write-rate --write-burst --worker-read-rate --worker-read-burst --worker-write-rate --worker-write-burst --worker-frontend-connections --backend-connections-per-host --backend-connections-per-frontend --rlimit-nofile --rlimit-memlock --backend-request-buffer --backend-response-buffer --fastopen --no-kqueue --frontend-http2-read-timeout --frontend-http3-read-timeout --frontend-read-timeout --frontend-write-timeout --frontend-keep-alive-timeout --stream-read-timeout --stream-write-timeout --backend-read-timeout --backend-write-timeout --backend-connect-timeout --backend-keep-alive-timeout --listener-disable-timeout --frontend-http2-setting-timeout --backend-http2-settings-timeout --backend-max-backoff --ciphers --tls13-ciphers --client-ciphers --tls13-client-ciphers --ecdh-curves --insecure --cacert --private-key-passwd-file --subcert --dh-param-file --npn-list --verify-client --verify-client-cacert --verify-client-tolerate-expired --client-private-key-file --client-cert-file --tls-min-proto-version --tls-max-proto-version --tls-ticket-key-file --tls-ticket-key-memcached --tls-ticket-key-memcached-address-family --tls-ticket-key-memcached-interval --tls-ticket-key-memcached-max-retry --tls-ticket-key-memcached-max-fail --tls-ticket-key-cipher --tls-ticket-key-memcached-cert-file --tls-ticket-key-memcached-private-key-file --fetch-ocsp-response-file --ocsp-update-interval --ocsp-startup --no-verify-ocsp --no-ocsp --tls-session-cache-memcached --tls-session-cache-memcached-address-family --tls-session-cache-memcached-cert-file --tls-session-cache-memcached-private-key-file --tls-dyn-rec-warmup-threshold --tls-dyn-rec-idle-timeout --no-http2-cipher-block-list --client-no-http2-cipher-block-list --tls-sct-dir --psk-secrets --client-psk-secrets --tls-no-postpone-early-data --tls-max-early-data --tls-ktls --frontend-http2-max-concurrent-streams --backend-http2-max-concurrent-streams --frontend-http2-window-size --frontend-http2-connection-window-size --backend-http2-window-size --backend-http2-connection-window-size --http2-no-cookie-crumbling --padding --no-server-push --frontend-http2-optimize-write-buffer-size --frontend-http2-optimize-window-size --frontend-http2-encoder-dynamic-table-size --frontend-http2-decoder-dynamic-table-size --backend-http2-encoder-dynamic-table-size --backend-http2-decoder-dynamic-table-size --http2-proxy --log-level --accesslog-file --accesslog-syslog --accesslog-format --accesslog-write-early --errorlog-file --errorlog-syslog --syslog-facility --add-x-forwarded-for --strip-incoming-x-forwarded-for --no-add-x-forwarded-proto --no-strip-incoming-x-forwarded-proto --add-forwarded --strip-incoming-forwarded --forwarded-by --forwarded-for --no-via --no-strip-incoming-early-data --no-location-rewrite --host-rewrite --altsvc --http2-altsvc --add-request-header --add-response-header --request-header-field-buffer --max-request-header-fields --response-header-field-buffer --max-response-header-fields --error-page --server-name --no-server-rewrite --redirect-https-port --require-http-scheme --api-max-request-body --dns-cache-timeout --dns-lookup-timeout --dns-max-try --frontend-max-requests --frontend-http2-dump-request-header --frontend-http2-dump-response-header --frontend-frame-debug --daemon --pid-file --user --single-process --max-worker-processes --worker-process-grace-shutdown-period --mruby-file --ignore-per-pattern-mruby-error --frontend-quic-idle-timeout --frontend-quic-debug-log --quic-bpf-program-file --frontend-quic-early-data --frontend-quic-qlog-dir --frontend-quic-require-token --frontend-quic-congestion-controller --frontend-quic-secret-file --quic-server-id --frontend-quic-initial-rtt --no-quic-bpf --frontend-http3-window-size --frontend-http3-connection-window-size --frontend-http3-max-window-size --frontend-http3-max-connection-window-size --frontend-http3-max-concurrent-streams --conf --include --version --help ' -- "$cur" ) )
|
||||||
;;
|
;;
|
||||||
*)
|
*)
|
||||||
_filedir
|
_filedir
|
||||||
|
|
32
doc/h2load.1
32
doc/h2load.1
|
@ -1,8 +1,5 @@
|
||||||
.\" Man page generated from reStructuredText.
|
.\" Man page generated from reStructuredText.
|
||||||
.
|
.
|
||||||
.TH "H2LOAD" "1" "Sep 20, 2021" "1.45.0" "nghttp2"
|
|
||||||
.SH NAME
|
|
||||||
h2load \- HTTP/2 benchmarking tool
|
|
||||||
.
|
.
|
||||||
.nr rst2man-indent-level 0
|
.nr rst2man-indent-level 0
|
||||||
.
|
.
|
||||||
|
@ -30,6 +27,9 @@ level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
|
||||||
.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
|
.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
|
||||||
.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
|
.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
|
||||||
..
|
..
|
||||||
|
.TH "H2LOAD" "1" "Nov 13, 2022" "1.51.0" "nghttp2"
|
||||||
|
.SH NAME
|
||||||
|
h2load \- HTTP/2 benchmarking tool
|
||||||
.SH SYNOPSIS
|
.SH SYNOPSIS
|
||||||
.sp
|
.sp
|
||||||
\fBh2load\fP [OPTIONS]... [URI]...
|
\fBh2load\fP [OPTIONS]... [URI]...
|
||||||
|
@ -99,6 +99,14 @@ Default: \fB1\fP
|
||||||
.UNINDENT
|
.UNINDENT
|
||||||
.INDENT 0.0
|
.INDENT 0.0
|
||||||
.TP
|
.TP
|
||||||
|
.B \-f, \-\-max\-frame\-size=<SIZE>
|
||||||
|
Maximum frame size that the local endpoint is willing to
|
||||||
|
receive.
|
||||||
|
.sp
|
||||||
|
Default: \fB16K\fP
|
||||||
|
.UNINDENT
|
||||||
|
.INDENT 0.0
|
||||||
|
.TP
|
||||||
.B \-w, \-\-window\-bits=<N>
|
.B \-w, \-\-window\-bits=<N>
|
||||||
Sets the stream level initial window size to (2**<N>)\-1.
|
Sets the stream level initial window size to (2**<N>)\-1.
|
||||||
For QUIC, <N> is capped to 26 (roughly 64MiB).
|
For QUIC, <N> is capped to 26 (roughly 64MiB).
|
||||||
|
@ -121,10 +129,10 @@ Add/Override a header to the requests.
|
||||||
.INDENT 0.0
|
.INDENT 0.0
|
||||||
.TP
|
.TP
|
||||||
.B \-\-ciphers=<SUITE>
|
.B \-\-ciphers=<SUITE>
|
||||||
Set allowed cipher list for TLSv1.2 or ealier. The
|
Set allowed cipher list for TLSv1.2 or earlier. The
|
||||||
format of the string is described in OpenSSL ciphers(1).
|
format of the string is described in OpenSSL ciphers(1).
|
||||||
.sp
|
.sp
|
||||||
Default: \fBECDHE\-ECDSA\-AES256\-GCM\-SHA384:ECDHE\-RSA\-AES256\-GCM\-SHA384:ECDHE\-ECDSA\-CHACHA20\-POLY1305:ECDHE\-RSA\-CHACHA20\-POLY1305:ECDHE\-ECDSA\-AES128\-GCM\-SHA256:ECDHE\-RSA\-AES128\-GCM\-SHA256:ECDHE\-ECDSA\-AES256\-SHA384:ECDHE\-RSA\-AES256\-SHA384:ECDHE\-ECDSA\-AES128\-SHA256:ECDHE\-RSA\-AES128\-SHA256\fP
|
Default: \fBECDHE\-ECDSA\-AES128\-GCM\-SHA256:ECDHE\-RSA\-AES128\-GCM\-SHA256:ECDHE\-ECDSA\-AES256\-GCM\-SHA384:ECDHE\-RSA\-AES256\-GCM\-SHA384:ECDHE\-ECDSA\-CHACHA20\-POLY1305:ECDHE\-RSA\-CHACHA20\-POLY1305:DHE\-RSA\-AES128\-GCM\-SHA256:DHE\-RSA\-AES256\-GCM\-SHA384\fP
|
||||||
.UNINDENT
|
.UNINDENT
|
||||||
.INDENT 0.0
|
.INDENT 0.0
|
||||||
.TP
|
.TP
|
||||||
|
@ -296,11 +304,10 @@ to buffering. Status code is \-1 for failed streams.
|
||||||
.TP
|
.TP
|
||||||
.B \-\-qlog\-file\-base=<PATH>
|
.B \-\-qlog\-file\-base=<PATH>
|
||||||
Enable qlog output and specify base file name for qlogs.
|
Enable qlog output and specify base file name for qlogs.
|
||||||
Qlog is emitted for each connection.
|
Qlog is emitted for each connection. For a given base
|
||||||
For a given base name "base", each output file name
|
name "base", each output file name becomes
|
||||||
becomes "base.M.N.qlog" where M is worker ID and N is
|
"base.M.N.sqlog" where M is worker ID and N is client ID
|
||||||
client ID (e.g. "base.0.3.qlog").
|
(e.g. "base.0.3.sqlog"). Only effective in QUIC runs.
|
||||||
Only effective in QUIC runs.
|
|
||||||
.UNINDENT
|
.UNINDENT
|
||||||
.INDENT 0.0
|
.INDENT 0.0
|
||||||
.TP
|
.TP
|
||||||
|
@ -333,6 +340,11 @@ Specify the maximum outgoing UDP datagram payload size.
|
||||||
.UNINDENT
|
.UNINDENT
|
||||||
.INDENT 0.0
|
.INDENT 0.0
|
||||||
.TP
|
.TP
|
||||||
|
.B \-\-ktls
|
||||||
|
Enable ktls.
|
||||||
|
.UNINDENT
|
||||||
|
.INDENT 0.0
|
||||||
|
.TP
|
||||||
.B \-v, \-\-verbose
|
.B \-v, \-\-verbose
|
||||||
Output debug information.
|
Output debug information.
|
||||||
.UNINDENT
|
.UNINDENT
|
||||||
|
|
|
@ -73,6 +73,13 @@ OPTIONS
|
||||||
|
|
||||||
Default: ``1``
|
Default: ``1``
|
||||||
|
|
||||||
|
.. option:: -f, --max-frame-size=<SIZE>
|
||||||
|
|
||||||
|
Maximum frame size that the local endpoint is willing to
|
||||||
|
receive.
|
||||||
|
|
||||||
|
Default: ``16K``
|
||||||
|
|
||||||
.. option:: -w, --window-bits=<N>
|
.. option:: -w, --window-bits=<N>
|
||||||
|
|
||||||
Sets the stream level initial window size to (2\*\*<N>)-1.
|
Sets the stream level initial window size to (2\*\*<N>)-1.
|
||||||
|
@ -93,10 +100,10 @@ OPTIONS
|
||||||
|
|
||||||
.. option:: --ciphers=<SUITE>
|
.. option:: --ciphers=<SUITE>
|
||||||
|
|
||||||
Set allowed cipher list for TLSv1.2 or ealier. The
|
Set allowed cipher list for TLSv1.2 or earlier. The
|
||||||
format of the string is described in OpenSSL ciphers(1).
|
format of the string is described in OpenSSL ciphers(1).
|
||||||
|
|
||||||
Default: ``ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256``
|
Default: ``ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384``
|
||||||
|
|
||||||
.. option:: --tls13-ciphers=<SUITE>
|
.. option:: --tls13-ciphers=<SUITE>
|
||||||
|
|
||||||
|
@ -251,11 +258,10 @@ OPTIONS
|
||||||
.. option:: --qlog-file-base=<PATH>
|
.. option:: --qlog-file-base=<PATH>
|
||||||
|
|
||||||
Enable qlog output and specify base file name for qlogs.
|
Enable qlog output and specify base file name for qlogs.
|
||||||
Qlog is emitted for each connection.
|
Qlog is emitted for each connection. For a given base
|
||||||
For a given base name "base", each output file name
|
name "base", each output file name becomes
|
||||||
becomes "base.M.N.qlog" where M is worker ID and N is
|
"base.M.N.sqlog" where M is worker ID and N is client ID
|
||||||
client ID (e.g. "base.0.3.qlog").
|
(e.g. "base.0.3.sqlog"). Only effective in QUIC runs.
|
||||||
Only effective in QUIC runs.
|
|
||||||
|
|
||||||
.. option:: --connect-to=<HOST>[:<PORT>]
|
.. option:: --connect-to=<HOST>[:<PORT>]
|
||||||
|
|
||||||
|
@ -281,6 +287,10 @@ OPTIONS
|
||||||
|
|
||||||
Specify the maximum outgoing UDP datagram payload size.
|
Specify the maximum outgoing UDP datagram payload size.
|
||||||
|
|
||||||
|
.. option:: --ktls
|
||||||
|
|
||||||
|
Enable ktls.
|
||||||
|
|
||||||
.. option:: -v, --verbose
|
.. option:: -v, --verbose
|
||||||
|
|
||||||
Output debug information.
|
Output debug information.
|
||||||
|
|
|
@ -1 +0,0 @@
|
||||||
.. include:: @top_srcdir@/doc/sources/libnghttp2_asio.rst
|
|
16
doc/nghttp.1
16
doc/nghttp.1
|
@ -1,8 +1,5 @@
|
||||||
.\" Man page generated from reStructuredText.
|
.\" Man page generated from reStructuredText.
|
||||||
.
|
.
|
||||||
.TH "NGHTTP" "1" "Sep 20, 2021" "1.45.0" "nghttp2"
|
|
||||||
.SH NAME
|
|
||||||
nghttp \- HTTP/2 client
|
|
||||||
.
|
.
|
||||||
.nr rst2man-indent-level 0
|
.nr rst2man-indent-level 0
|
||||||
.
|
.
|
||||||
|
@ -30,6 +27,9 @@ level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
|
||||||
.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
|
.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
|
||||||
.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
|
.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
|
||||||
..
|
..
|
||||||
|
.TH "NGHTTP" "1" "Nov 13, 2022" "1.51.0" "nghttp2"
|
||||||
|
.SH NAME
|
||||||
|
nghttp \- HTTP/2 client
|
||||||
.SH SYNOPSIS
|
.SH SYNOPSIS
|
||||||
.sp
|
.sp
|
||||||
\fBnghttp\fP [OPTIONS]... <URI>...
|
\fBnghttp\fP [OPTIONS]... <URI>...
|
||||||
|
@ -242,6 +242,16 @@ failure.
|
||||||
.UNINDENT
|
.UNINDENT
|
||||||
.INDENT 0.0
|
.INDENT 0.0
|
||||||
.TP
|
.TP
|
||||||
|
.B \-\-ktls
|
||||||
|
Enable ktls.
|
||||||
|
.UNINDENT
|
||||||
|
.INDENT 0.0
|
||||||
|
.TP
|
||||||
|
.B \-\-no\-rfc7540\-pri
|
||||||
|
Disable RFC7540 priorities.
|
||||||
|
.UNINDENT
|
||||||
|
.INDENT 0.0
|
||||||
|
.TP
|
||||||
.B \-\-version
|
.B \-\-version
|
||||||
Display version information and exit.
|
Display version information and exit.
|
||||||
.UNINDENT
|
.UNINDENT
|
||||||
|
|
|
@ -191,6 +191,14 @@ OPTIONS
|
||||||
Suppress warning on server certificate verification
|
Suppress warning on server certificate verification
|
||||||
failure.
|
failure.
|
||||||
|
|
||||||
|
.. option:: --ktls
|
||||||
|
|
||||||
|
Enable ktls.
|
||||||
|
|
||||||
|
.. option:: --no-rfc7540-pri
|
||||||
|
|
||||||
|
Disable RFC7540 priorities.
|
||||||
|
|
||||||
.. option:: --version
|
.. option:: --version
|
||||||
|
|
||||||
Display version information and exit.
|
Display version information and exit.
|
||||||
|
|
|
@ -1,8 +1,5 @@
|
||||||
.\" Man page generated from reStructuredText.
|
.\" Man page generated from reStructuredText.
|
||||||
.
|
.
|
||||||
.TH "NGHTTPD" "1" "Sep 20, 2021" "1.45.0" "nghttp2"
|
|
||||||
.SH NAME
|
|
||||||
nghttpd \- HTTP/2 server
|
|
||||||
.
|
.
|
||||||
.nr rst2man-indent-level 0
|
.nr rst2man-indent-level 0
|
||||||
.
|
.
|
||||||
|
@ -30,6 +27,9 @@ level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
|
||||||
.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
|
.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
|
||||||
.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
|
.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
|
||||||
..
|
..
|
||||||
|
.TH "NGHTTPD" "1" "Nov 13, 2022" "1.51.0" "nghttp2"
|
||||||
|
.SH NAME
|
||||||
|
nghttpd \- HTTP/2 server
|
||||||
.SH SYNOPSIS
|
.SH SYNOPSIS
|
||||||
.sp
|
.sp
|
||||||
\fBnghttpd\fP [OPTION]... <PORT> [<PRIVATE_KEY> <CERT>]
|
\fBnghttpd\fP [OPTION]... <PORT> [<PRIVATE_KEY> <CERT>]
|
||||||
|
@ -204,6 +204,16 @@ Don\(aqt send content\-length header field.
|
||||||
.UNINDENT
|
.UNINDENT
|
||||||
.INDENT 0.0
|
.INDENT 0.0
|
||||||
.TP
|
.TP
|
||||||
|
.B \-\-ktls
|
||||||
|
Enable ktls.
|
||||||
|
.UNINDENT
|
||||||
|
.INDENT 0.0
|
||||||
|
.TP
|
||||||
|
.B \-\-no\-rfc7540\-pri
|
||||||
|
Disable RFC7540 priorities.
|
||||||
|
.UNINDENT
|
||||||
|
.INDENT 0.0
|
||||||
|
.TP
|
||||||
.B \-\-version
|
.B \-\-version
|
||||||
Display version information and exit.
|
Display version information and exit.
|
||||||
.UNINDENT
|
.UNINDENT
|
||||||
|
|
|
@ -159,6 +159,14 @@ OPTIONS
|
||||||
|
|
||||||
Don't send content-length header field.
|
Don't send content-length header field.
|
||||||
|
|
||||||
|
.. option:: --ktls
|
||||||
|
|
||||||
|
Enable ktls.
|
||||||
|
|
||||||
|
.. option:: --no-rfc7540-pri
|
||||||
|
|
||||||
|
Disable RFC7540 priorities.
|
||||||
|
|
||||||
.. option:: --version
|
.. option:: --version
|
||||||
|
|
||||||
Display version information and exit.
|
Display version information and exit.
|
||||||
|
|
138
doc/nghttpx.1
138
doc/nghttpx.1
|
@ -1,8 +1,5 @@
|
||||||
.\" Man page generated from reStructuredText.
|
.\" Man page generated from reStructuredText.
|
||||||
.
|
.
|
||||||
.TH "NGHTTPX" "1" "Sep 20, 2021" "1.45.0" "nghttp2"
|
|
||||||
.SH NAME
|
|
||||||
nghttpx \- HTTP/2 proxy
|
|
||||||
.
|
.
|
||||||
.nr rst2man-indent-level 0
|
.nr rst2man-indent-level 0
|
||||||
.
|
.
|
||||||
|
@ -30,6 +27,9 @@ level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
|
||||||
.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
|
.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
|
||||||
.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
|
.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
|
||||||
..
|
..
|
||||||
|
.TH "NGHTTPX" "1" "Nov 13, 2022" "1.51.0" "nghttp2"
|
||||||
|
.SH NAME
|
||||||
|
nghttpx \- HTTP/2 proxy
|
||||||
.SH SYNOPSIS
|
.SH SYNOPSIS
|
||||||
.sp
|
.sp
|
||||||
\fBnghttpx\fP [OPTIONS]... [<PRIVATE_KEY> <CERT>]
|
\fBnghttpx\fP [OPTIONS]... [<PRIVATE_KEY> <CERT>]
|
||||||
|
@ -209,7 +209,18 @@ the Secure attribute is determined by a request scheme.
|
||||||
If a request scheme is "https", then Secure attribute is
|
If a request scheme is "https", then Secure attribute is
|
||||||
set. Otherwise, it is not set. If <SECURE> is "yes",
|
set. Otherwise, it is not set. If <SECURE> is "yes",
|
||||||
the Secure attribute is always set. If <SECURE> is
|
the Secure attribute is always set. If <SECURE> is
|
||||||
"no", the Secure attribute is always omitted.
|
"no", the Secure attribute is always omitted.
|
||||||
|
"affinity\-cookie\-stickiness=<STICKINESS>" controls
|
||||||
|
stickiness of this affinity. If <STICKINESS> is
|
||||||
|
"loose", removing or adding a backend server might break
|
||||||
|
the affinity and the request might be forwarded to a
|
||||||
|
different backend server. If <STICKINESS> is "strict",
|
||||||
|
removing the designated backend server breaks affinity,
|
||||||
|
but adding new backend server does not cause breakage.
|
||||||
|
If the designated backend server becomes unavailable,
|
||||||
|
new backend server is chosen as if the request does not
|
||||||
|
have an affinity cookie. <STICKINESS> defaults to
|
||||||
|
"loose".
|
||||||
.sp
|
.sp
|
||||||
By default, name resolution of backend host name is done
|
By default, name resolution of backend host name is done
|
||||||
at start up, or reloading configuration. If "dns"
|
at start up, or reloading configuration. If "dns"
|
||||||
|
@ -503,6 +514,15 @@ Default: \fB0\fP
|
||||||
.UNINDENT
|
.UNINDENT
|
||||||
.INDENT 0.0
|
.INDENT 0.0
|
||||||
.TP
|
.TP
|
||||||
|
.B \-\-rlimit\-memlock=<N>
|
||||||
|
Set maximum number of bytes of memory that may be locked
|
||||||
|
into RAM. If 0 is given, nghttpx does not set the
|
||||||
|
limit.
|
||||||
|
.sp
|
||||||
|
Default: \fB0\fP
|
||||||
|
.UNINDENT
|
||||||
|
.INDENT 0.0
|
||||||
|
.TP
|
||||||
.B \-\-backend\-request\-buffer=<SIZE>
|
.B \-\-backend\-request\-buffer=<SIZE>
|
||||||
Set buffer size used to store backend request.
|
Set buffer size used to store backend request.
|
||||||
.sp
|
.sp
|
||||||
|
@ -663,7 +683,7 @@ format of the string is described in OpenSSL ciphers(1).
|
||||||
This option sets cipher suites for TLSv1.2 or earlier.
|
This option sets cipher suites for TLSv1.2 or earlier.
|
||||||
Use \fI\%\-\-tls13\-ciphers\fP for TLSv1.3.
|
Use \fI\%\-\-tls13\-ciphers\fP for TLSv1.3.
|
||||||
.sp
|
.sp
|
||||||
Default: \fBECDHE\-ECDSA\-AES256\-GCM\-SHA384:ECDHE\-RSA\-AES256\-GCM\-SHA384:ECDHE\-ECDSA\-CHACHA20\-POLY1305:ECDHE\-RSA\-CHACHA20\-POLY1305:ECDHE\-ECDSA\-AES128\-GCM\-SHA256:ECDHE\-RSA\-AES128\-GCM\-SHA256:ECDHE\-ECDSA\-AES256\-SHA384:ECDHE\-RSA\-AES256\-SHA384:ECDHE\-ECDSA\-AES128\-SHA256:ECDHE\-RSA\-AES128\-SHA256\fP
|
Default: \fBECDHE\-ECDSA\-AES128\-GCM\-SHA256:ECDHE\-RSA\-AES128\-GCM\-SHA256:ECDHE\-ECDSA\-AES256\-GCM\-SHA384:ECDHE\-RSA\-AES256\-GCM\-SHA384:ECDHE\-ECDSA\-CHACHA20\-POLY1305:ECDHE\-RSA\-CHACHA20\-POLY1305:DHE\-RSA\-AES128\-GCM\-SHA256:DHE\-RSA\-AES256\-GCM\-SHA384\fP
|
||||||
.UNINDENT
|
.UNINDENT
|
||||||
.INDENT 0.0
|
.INDENT 0.0
|
||||||
.TP
|
.TP
|
||||||
|
@ -673,7 +693,7 @@ format of the string is described in OpenSSL ciphers(1).
|
||||||
This option sets cipher suites for TLSv1.3. Use
|
This option sets cipher suites for TLSv1.3. Use
|
||||||
\fI\%\-\-ciphers\fP for TLSv1.2 or earlier.
|
\fI\%\-\-ciphers\fP for TLSv1.2 or earlier.
|
||||||
.sp
|
.sp
|
||||||
Default: \fBTLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:TLS_AES_128_GCM_SHA256\fP
|
Default: \fBTLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256\fP
|
||||||
.UNINDENT
|
.UNINDENT
|
||||||
.INDENT 0.0
|
.INDENT 0.0
|
||||||
.TP
|
.TP
|
||||||
|
@ -683,7 +703,7 @@ format of the string is described in OpenSSL ciphers(1).
|
||||||
This option sets cipher suites for TLSv1.2 or earlier.
|
This option sets cipher suites for TLSv1.2 or earlier.
|
||||||
Use \fI\%\-\-tls13\-client\-ciphers\fP for TLSv1.3.
|
Use \fI\%\-\-tls13\-client\-ciphers\fP for TLSv1.3.
|
||||||
.sp
|
.sp
|
||||||
Default: \fBECDHE\-ECDSA\-AES256\-GCM\-SHA384:ECDHE\-RSA\-AES256\-GCM\-SHA384:ECDHE\-ECDSA\-CHACHA20\-POLY1305:ECDHE\-RSA\-CHACHA20\-POLY1305:ECDHE\-ECDSA\-AES128\-GCM\-SHA256:ECDHE\-RSA\-AES128\-GCM\-SHA256:ECDHE\-ECDSA\-AES256\-SHA384:ECDHE\-RSA\-AES256\-SHA384:ECDHE\-ECDSA\-AES128\-SHA256:ECDHE\-RSA\-AES128\-SHA256\fP
|
Default: \fBECDHE\-ECDSA\-AES128\-GCM\-SHA256:ECDHE\-RSA\-AES128\-GCM\-SHA256:ECDHE\-ECDSA\-AES256\-GCM\-SHA384:ECDHE\-RSA\-AES256\-GCM\-SHA384:ECDHE\-ECDSA\-CHACHA20\-POLY1305:ECDHE\-RSA\-CHACHA20\-POLY1305:DHE\-RSA\-AES128\-GCM\-SHA256:DHE\-RSA\-AES256\-GCM\-SHA384\fP
|
||||||
.UNINDENT
|
.UNINDENT
|
||||||
.INDENT 0.0
|
.INDENT 0.0
|
||||||
.TP
|
.TP
|
||||||
|
@ -693,7 +713,7 @@ format of the string is described in OpenSSL ciphers(1).
|
||||||
This option sets cipher suites for TLSv1.3. Use
|
This option sets cipher suites for TLSv1.3. Use
|
||||||
\fI\%\-\-tls13\-client\-ciphers\fP for TLSv1.2 or earlier.
|
\fI\%\-\-tls13\-client\-ciphers\fP for TLSv1.2 or earlier.
|
||||||
.sp
|
.sp
|
||||||
Default: \fBTLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:TLS_AES_128_GCM_SHA256\fP
|
Default: \fBTLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256\fP
|
||||||
.UNINDENT
|
.UNINDENT
|
||||||
.INDENT 0.0
|
.INDENT 0.0
|
||||||
.TP
|
.TP
|
||||||
|
@ -1105,6 +1125,12 @@ accepts.
|
||||||
.sp
|
.sp
|
||||||
Default: \fB16K\fP
|
Default: \fB16K\fP
|
||||||
.UNINDENT
|
.UNINDENT
|
||||||
|
.INDENT 0.0
|
||||||
|
.TP
|
||||||
|
.B \-\-tls\-ktls
|
||||||
|
Enable ktls. For server, ktls is enable if
|
||||||
|
\fI\%\-\-tls\-session\-cache\-memcached\fP is not configured.
|
||||||
|
.UNINDENT
|
||||||
.SS HTTP/2
|
.SS HTTP/2
|
||||||
.INDENT 0.0
|
.INDENT 0.0
|
||||||
.TP
|
.TP
|
||||||
|
@ -1508,7 +1534,7 @@ they are treated as nothing is specified. They are
|
||||||
advertised in alt\-svc header field only in HTTP/1.1
|
advertised in alt\-svc header field only in HTTP/1.1
|
||||||
frontend. This option can be used multiple times to
|
frontend. This option can be used multiple times to
|
||||||
specify multiple alternative services.
|
specify multiple alternative services.
|
||||||
Example: \fI\%\-\-altsvc\fP="h2,443,,,ma=3600; persist=1\(aq
|
Example: \fI\%\-\-altsvc\fP="h2,443,,,ma=3600; persist=1"
|
||||||
.UNINDENT
|
.UNINDENT
|
||||||
.INDENT 0.0
|
.INDENT 0.0
|
||||||
.TP
|
.TP
|
||||||
|
@ -1605,6 +1631,16 @@ field when redirect to HTTPS URI is made due to
|
||||||
.sp
|
.sp
|
||||||
Default: \fB443\fP
|
Default: \fB443\fP
|
||||||
.UNINDENT
|
.UNINDENT
|
||||||
|
.INDENT 0.0
|
||||||
|
.TP
|
||||||
|
.B \-\-require\-http\-scheme
|
||||||
|
Always require http or https scheme in HTTP request. It
|
||||||
|
also requires that https scheme must be used for an
|
||||||
|
encrypted connection. Otherwise, http scheme must be
|
||||||
|
used. This option is recommended for a server
|
||||||
|
deployment which directly faces clients and the services
|
||||||
|
it provides only require http or https scheme.
|
||||||
|
.UNINDENT
|
||||||
.SS API
|
.SS API
|
||||||
.INDENT 0.0
|
.INDENT 0.0
|
||||||
.TP
|
.TP
|
||||||
|
@ -1705,6 +1741,33 @@ process. nghttpx still spawns additional process if
|
||||||
neverbleed is used. In the single process mode, the
|
neverbleed is used. In the single process mode, the
|
||||||
signal handling feature is disabled.
|
signal handling feature is disabled.
|
||||||
.UNINDENT
|
.UNINDENT
|
||||||
|
.INDENT 0.0
|
||||||
|
.TP
|
||||||
|
.B \-\-max\-worker\-processes=<N>
|
||||||
|
The maximum number of worker processes. nghttpx spawns
|
||||||
|
new worker process when it reloads its configuration.
|
||||||
|
The previous worker process enters graceful termination
|
||||||
|
period and will terminate when it finishes handling the
|
||||||
|
existing connections. However, if reloading
|
||||||
|
configurations happen very frequently, the worker
|
||||||
|
processes might be piled up if they take a bit long time
|
||||||
|
to finish the existing connections. With this option,
|
||||||
|
if the number of worker processes exceeds the given
|
||||||
|
value, the oldest worker process is terminated
|
||||||
|
immediately. Specifying 0 means no limit and it is the
|
||||||
|
default behaviour.
|
||||||
|
.UNINDENT
|
||||||
|
.INDENT 0.0
|
||||||
|
.TP
|
||||||
|
.B \-\-worker\-process\-grace\-shutdown\-period=<DURATION>
|
||||||
|
Maximum period for a worker process to terminate
|
||||||
|
gracefully. When a worker process enters in graceful
|
||||||
|
shutdown period (e.g., when nghttpx reloads its
|
||||||
|
configuration) and it does not finish handling the
|
||||||
|
existing connections in the given period of time, it is
|
||||||
|
immediately terminated. Specifying 0 means no limit and
|
||||||
|
it is the default behaviour.
|
||||||
|
.UNINDENT
|
||||||
.SS Scripting
|
.SS Scripting
|
||||||
.INDENT 0.0
|
.INDENT 0.0
|
||||||
.TP
|
.TP
|
||||||
|
@ -1756,7 +1819,7 @@ Specify a directory where a qlog file is written for
|
||||||
frontend QUIC connections. A qlog file is created per
|
frontend QUIC connections. A qlog file is created per
|
||||||
each QUIC connection. The file name is ISO8601 basic
|
each QUIC connection. The file name is ISO8601 basic
|
||||||
format, followed by "\-", server Source Connection ID and
|
format, followed by "\-", server Source Connection ID and
|
||||||
".qlog".
|
".sqlog".
|
||||||
.UNINDENT
|
.UNINDENT
|
||||||
.INDENT 0.0
|
.INDENT 0.0
|
||||||
.TP
|
.TP
|
||||||
|
@ -1769,21 +1832,56 @@ NEW_TOKEN frame in the previous connection.
|
||||||
.TP
|
.TP
|
||||||
.B \-\-frontend\-quic\-congestion\-controller=<CC>
|
.B \-\-frontend\-quic\-congestion\-controller=<CC>
|
||||||
Specify a congestion controller algorithm for a frontend
|
Specify a congestion controller algorithm for a frontend
|
||||||
QUIC connection. <CC> should be either "cubic" or
|
QUIC connection. <CC> should be one of "cubic", "bbr",
|
||||||
"bbr".
|
and "bbr2".
|
||||||
.sp
|
.sp
|
||||||
Default: \fBcubic\fP
|
Default: \fBcubic\fP
|
||||||
.UNINDENT
|
.UNINDENT
|
||||||
.INDENT 0.0
|
.INDENT 0.0
|
||||||
.TP
|
.TP
|
||||||
.B \-\-frontend\-quic\-connection\-id\-encryption\-key=<HEXSTRING>
|
.B \-\-frontend\-quic\-secret\-file=<PATH>
|
||||||
Specify Connection ID encryption key. The encryption
|
Path to file that contains secure random data to be used
|
||||||
key must be 16 bytes, and it must be encoded in hex
|
as QUIC keying materials. It is used to derive keys for
|
||||||
string (which is 32 bytes long). If this option is
|
encrypting tokens and Connection IDs. It is not used to
|
||||||
omitted, new key is generated. In order to survive QUIC
|
encrypt QUIC packets. Each line of this file must
|
||||||
connection in a configuration reload event, old and new
|
contain exactly 136 bytes hex\-encoded string (when
|
||||||
configuration must have this option and share the same
|
decoded the byte string is 68 bytes long). The first 2
|
||||||
key.
|
bits of decoded byte string are used to identify the
|
||||||
|
keying material. An empty line or a line which starts
|
||||||
|
\(aq#\(aq is ignored. The file can contain more than one
|
||||||
|
keying materials. Because the identifier is 2 bits, at
|
||||||
|
most 4 keying materials are read and the remaining data
|
||||||
|
is discarded. The first keying material in the file is
|
||||||
|
primarily used for encryption and decryption for new
|
||||||
|
connection. The other ones are used to decrypt data for
|
||||||
|
the existing connections. Specifying multiple keying
|
||||||
|
materials enables key rotation. Please note that key
|
||||||
|
rotation does not occur automatically. User should
|
||||||
|
update files or change options values and restart
|
||||||
|
nghttpx gracefully. If opening or reading given file
|
||||||
|
fails, all loaded keying materials are discarded and it
|
||||||
|
is treated as if none of this option is given. If this
|
||||||
|
option is not given or an error occurred while opening
|
||||||
|
or reading a file, a keying material is generated
|
||||||
|
internally on startup and reload.
|
||||||
|
.UNINDENT
|
||||||
|
.INDENT 0.0
|
||||||
|
.TP
|
||||||
|
.B \-\-quic\-server\-id=<HEXSTRING>
|
||||||
|
Specify server ID encoded in Connection ID to identify
|
||||||
|
this particular server instance. Connection ID is
|
||||||
|
encrypted and this part is not visible in public. It
|
||||||
|
must be 4 bytes long and must be encoded in hex string
|
||||||
|
(which is 8 bytes long). If this option is omitted, a
|
||||||
|
random server ID is generated on startup and
|
||||||
|
configuration reload.
|
||||||
|
.UNINDENT
|
||||||
|
.INDENT 0.0
|
||||||
|
.TP
|
||||||
|
.B \-\-frontend\-quic\-initial\-rtt=<DURATION>
|
||||||
|
Specify the initial RTT of the frontend QUIC connection.
|
||||||
|
.sp
|
||||||
|
Default: \fB333ms\fP
|
||||||
.UNINDENT
|
.UNINDENT
|
||||||
.INDENT 0.0
|
.INDENT 0.0
|
||||||
.TP
|
.TP
|
||||||
|
|
|
@ -193,7 +193,18 @@ Connections
|
||||||
If a request scheme is "https", then Secure attribute is
|
If a request scheme is "https", then Secure attribute is
|
||||||
set. Otherwise, it is not set. If <SECURE> is "yes",
|
set. Otherwise, it is not set. If <SECURE> is "yes",
|
||||||
the Secure attribute is always set. If <SECURE> is
|
the Secure attribute is always set. If <SECURE> is
|
||||||
"no", the Secure attribute is always omitted.
|
"no", the Secure attribute is always omitted.
|
||||||
|
"affinity-cookie-stickiness=<STICKINESS>" controls
|
||||||
|
stickiness of this affinity. If <STICKINESS> is
|
||||||
|
"loose", removing or adding a backend server might break
|
||||||
|
the affinity and the request might be forwarded to a
|
||||||
|
different backend server. If <STICKINESS> is "strict",
|
||||||
|
removing the designated backend server breaks affinity,
|
||||||
|
but adding new backend server does not cause breakage.
|
||||||
|
If the designated backend server becomes unavailable,
|
||||||
|
new backend server is chosen as if the request does not
|
||||||
|
have an affinity cookie. <STICKINESS> defaults to
|
||||||
|
"loose".
|
||||||
|
|
||||||
By default, name resolution of backend host name is done
|
By default, name resolution of backend host name is done
|
||||||
at start up, or reloading configuration. If "dns"
|
at start up, or reloading configuration. If "dns"
|
||||||
|
@ -472,6 +483,14 @@ Performance
|
||||||
|
|
||||||
Default: ``0``
|
Default: ``0``
|
||||||
|
|
||||||
|
.. option:: --rlimit-memlock=<N>
|
||||||
|
|
||||||
|
Set maximum number of bytes of memory that may be locked
|
||||||
|
into RAM. If 0 is given, nghttpx does not set the
|
||||||
|
limit.
|
||||||
|
|
||||||
|
Default: ``0``
|
||||||
|
|
||||||
.. option:: --backend-request-buffer=<SIZE>
|
.. option:: --backend-request-buffer=<SIZE>
|
||||||
|
|
||||||
Set buffer size used to store backend request.
|
Set buffer size used to store backend request.
|
||||||
|
@ -620,7 +639,7 @@ SSL/TLS
|
||||||
This option sets cipher suites for TLSv1.2 or earlier.
|
This option sets cipher suites for TLSv1.2 or earlier.
|
||||||
Use :option:`--tls13-ciphers` for TLSv1.3.
|
Use :option:`--tls13-ciphers` for TLSv1.3.
|
||||||
|
|
||||||
Default: ``ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256``
|
Default: ``ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384``
|
||||||
|
|
||||||
.. option:: --tls13-ciphers=<SUITE>
|
.. option:: --tls13-ciphers=<SUITE>
|
||||||
|
|
||||||
|
@ -629,7 +648,7 @@ SSL/TLS
|
||||||
This option sets cipher suites for TLSv1.3. Use
|
This option sets cipher suites for TLSv1.3. Use
|
||||||
:option:`--ciphers` for TLSv1.2 or earlier.
|
:option:`--ciphers` for TLSv1.2 or earlier.
|
||||||
|
|
||||||
Default: ``TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:TLS_AES_128_GCM_SHA256``
|
Default: ``TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256``
|
||||||
|
|
||||||
.. option:: --client-ciphers=<SUITE>
|
.. option:: --client-ciphers=<SUITE>
|
||||||
|
|
||||||
|
@ -638,7 +657,7 @@ SSL/TLS
|
||||||
This option sets cipher suites for TLSv1.2 or earlier.
|
This option sets cipher suites for TLSv1.2 or earlier.
|
||||||
Use :option:`--tls13-client-ciphers` for TLSv1.3.
|
Use :option:`--tls13-client-ciphers` for TLSv1.3.
|
||||||
|
|
||||||
Default: ``ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256``
|
Default: ``ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384``
|
||||||
|
|
||||||
.. option:: --tls13-client-ciphers=<SUITE>
|
.. option:: --tls13-client-ciphers=<SUITE>
|
||||||
|
|
||||||
|
@ -647,7 +666,7 @@ SSL/TLS
|
||||||
This option sets cipher suites for TLSv1.3. Use
|
This option sets cipher suites for TLSv1.3. Use
|
||||||
:option:`--tls13-client-ciphers` for TLSv1.2 or earlier.
|
:option:`--tls13-client-ciphers` for TLSv1.2 or earlier.
|
||||||
|
|
||||||
Default: ``TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:TLS_AES_128_GCM_SHA256``
|
Default: ``TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256``
|
||||||
|
|
||||||
.. option:: --ecdh-curves=<LIST>
|
.. option:: --ecdh-curves=<LIST>
|
||||||
|
|
||||||
|
@ -1018,6 +1037,11 @@ SSL/TLS
|
||||||
|
|
||||||
Default: ``16K``
|
Default: ``16K``
|
||||||
|
|
||||||
|
.. option:: --tls-ktls
|
||||||
|
|
||||||
|
Enable ktls. For server, ktls is enable if
|
||||||
|
:option:`--tls-session-cache-memcached` is not configured.
|
||||||
|
|
||||||
|
|
||||||
HTTP/2
|
HTTP/2
|
||||||
~~~~~~
|
~~~~~~
|
||||||
|
@ -1368,7 +1392,7 @@ HTTP
|
||||||
advertised in alt-svc header field only in HTTP/1.1
|
advertised in alt-svc header field only in HTTP/1.1
|
||||||
frontend. This option can be used multiple times to
|
frontend. This option can be used multiple times to
|
||||||
specify multiple alternative services.
|
specify multiple alternative services.
|
||||||
Example: :option:`--altsvc`\="h2,443,,,ma=3600; persist=1'
|
Example: :option:`--altsvc`\="h2,443,,,ma=3600; persist=1"
|
||||||
|
|
||||||
.. option:: --http2-altsvc=<PROTOID,PORT[,HOST,[ORIGIN[,PARAMS]]]>
|
.. option:: --http2-altsvc=<PROTOID,PORT[,HOST,[ORIGIN[,PARAMS]]]>
|
||||||
|
|
||||||
|
@ -1454,6 +1478,15 @@ HTTP
|
||||||
|
|
||||||
Default: ``443``
|
Default: ``443``
|
||||||
|
|
||||||
|
.. option:: --require-http-scheme
|
||||||
|
|
||||||
|
Always require http or https scheme in HTTP request. It
|
||||||
|
also requires that https scheme must be used for an
|
||||||
|
encrypted connection. Otherwise, http scheme must be
|
||||||
|
used. This option is recommended for a server
|
||||||
|
deployment which directly faces clients and the services
|
||||||
|
it provides only require http or https scheme.
|
||||||
|
|
||||||
|
|
||||||
API
|
API
|
||||||
~~~
|
~~~
|
||||||
|
@ -1554,6 +1587,31 @@ Process
|
||||||
neverbleed is used. In the single process mode, the
|
neverbleed is used. In the single process mode, the
|
||||||
signal handling feature is disabled.
|
signal handling feature is disabled.
|
||||||
|
|
||||||
|
.. option:: --max-worker-processes=<N>
|
||||||
|
|
||||||
|
The maximum number of worker processes. nghttpx spawns
|
||||||
|
new worker process when it reloads its configuration.
|
||||||
|
The previous worker process enters graceful termination
|
||||||
|
period and will terminate when it finishes handling the
|
||||||
|
existing connections. However, if reloading
|
||||||
|
configurations happen very frequently, the worker
|
||||||
|
processes might be piled up if they take a bit long time
|
||||||
|
to finish the existing connections. With this option,
|
||||||
|
if the number of worker processes exceeds the given
|
||||||
|
value, the oldest worker process is terminated
|
||||||
|
immediately. Specifying 0 means no limit and it is the
|
||||||
|
default behaviour.
|
||||||
|
|
||||||
|
.. option:: --worker-process-grace-shutdown-period=<DURATION>
|
||||||
|
|
||||||
|
Maximum period for a worker process to terminate
|
||||||
|
gracefully. When a worker process enters in graceful
|
||||||
|
shutdown period (e.g., when nghttpx reloads its
|
||||||
|
configuration) and it does not finish handling the
|
||||||
|
existing connections in the given period of time, it is
|
||||||
|
immediately terminated. Specifying 0 means no limit and
|
||||||
|
it is the default behaviour.
|
||||||
|
|
||||||
|
|
||||||
Scripting
|
Scripting
|
||||||
~~~~~~~~~
|
~~~~~~~~~
|
||||||
|
@ -1604,7 +1662,7 @@ HTTP/3 and QUIC
|
||||||
frontend QUIC connections. A qlog file is created per
|
frontend QUIC connections. A qlog file is created per
|
||||||
each QUIC connection. The file name is ISO8601 basic
|
each QUIC connection. The file name is ISO8601 basic
|
||||||
format, followed by "-", server Source Connection ID and
|
format, followed by "-", server Source Connection ID and
|
||||||
".qlog".
|
".sqlog".
|
||||||
|
|
||||||
.. option:: --frontend-quic-require-token
|
.. option:: --frontend-quic-require-token
|
||||||
|
|
||||||
|
@ -1615,20 +1673,53 @@ HTTP/3 and QUIC
|
||||||
.. option:: --frontend-quic-congestion-controller=<CC>
|
.. option:: --frontend-quic-congestion-controller=<CC>
|
||||||
|
|
||||||
Specify a congestion controller algorithm for a frontend
|
Specify a congestion controller algorithm for a frontend
|
||||||
QUIC connection. <CC> should be either "cubic" or
|
QUIC connection. <CC> should be one of "cubic", "bbr",
|
||||||
"bbr".
|
and "bbr2".
|
||||||
|
|
||||||
Default: ``cubic``
|
Default: ``cubic``
|
||||||
|
|
||||||
.. option:: --frontend-quic-connection-id-encryption-key=<HEXSTRING>
|
.. option:: --frontend-quic-secret-file=<PATH>
|
||||||
|
|
||||||
Specify Connection ID encryption key. The encryption
|
Path to file that contains secure random data to be used
|
||||||
key must be 16 bytes, and it must be encoded in hex
|
as QUIC keying materials. It is used to derive keys for
|
||||||
string (which is 32 bytes long). If this option is
|
encrypting tokens and Connection IDs. It is not used to
|
||||||
omitted, new key is generated. In order to survive QUIC
|
encrypt QUIC packets. Each line of this file must
|
||||||
connection in a configuration reload event, old and new
|
contain exactly 136 bytes hex-encoded string (when
|
||||||
configuration must have this option and share the same
|
decoded the byte string is 68 bytes long). The first 2
|
||||||
key.
|
bits of decoded byte string are used to identify the
|
||||||
|
keying material. An empty line or a line which starts
|
||||||
|
'#' is ignored. The file can contain more than one
|
||||||
|
keying materials. Because the identifier is 2 bits, at
|
||||||
|
most 4 keying materials are read and the remaining data
|
||||||
|
is discarded. The first keying material in the file is
|
||||||
|
primarily used for encryption and decryption for new
|
||||||
|
connection. The other ones are used to decrypt data for
|
||||||
|
the existing connections. Specifying multiple keying
|
||||||
|
materials enables key rotation. Please note that key
|
||||||
|
rotation does not occur automatically. User should
|
||||||
|
update files or change options values and restart
|
||||||
|
nghttpx gracefully. If opening or reading given file
|
||||||
|
fails, all loaded keying materials are discarded and it
|
||||||
|
is treated as if none of this option is given. If this
|
||||||
|
option is not given or an error occurred while opening
|
||||||
|
or reading a file, a keying material is generated
|
||||||
|
internally on startup and reload.
|
||||||
|
|
||||||
|
.. option:: --quic-server-id=<HEXSTRING>
|
||||||
|
|
||||||
|
Specify server ID encoded in Connection ID to identify
|
||||||
|
this particular server instance. Connection ID is
|
||||||
|
encrypted and this part is not visible in public. It
|
||||||
|
must be 4 bytes long and must be encoded in hex string
|
||||||
|
(which is 8 bytes long). If this option is omitted, a
|
||||||
|
random server ID is generated on startup and
|
||||||
|
configuration reload.
|
||||||
|
|
||||||
|
.. option:: --frontend-quic-initial-rtt=<DURATION>
|
||||||
|
|
||||||
|
Specify the initial RTT of the frontend QUIC connection.
|
||||||
|
|
||||||
|
Default: ``333ms``
|
||||||
|
|
||||||
.. option:: --no-quic-bpf
|
.. option:: --no-quic-bpf
|
||||||
|
|
||||||
|
|
|
@ -479,3 +479,48 @@ its creation, like so:
|
||||||
When ALTSVC is received, :type:`nghttp2_on_frame_recv_callback` will
|
When ALTSVC is received, :type:`nghttp2_on_frame_recv_callback` will
|
||||||
be called as usual.
|
be called as usual.
|
||||||
|
|
||||||
|
Stream priorities
|
||||||
|
-----------------
|
||||||
|
|
||||||
|
By default, the stream prioritization scheme described in :rfc:`7540`
|
||||||
|
is used. This scheme has been formally deprecated by :rfc:`9113`. In
|
||||||
|
order to disable it, send
|
||||||
|
:enum:`nghttp2_settings_id.NGHTTP2_SETTINGS_NO_RFC7540_PRIORITIES` of
|
||||||
|
value of 1 via `nghttp2_submit_settings()`. This settings ID is
|
||||||
|
defined by :rfc:`9218`. The sender of this settings value disables
|
||||||
|
RFC 7540 priorities, and instead it enables RFC 9218 Extensible
|
||||||
|
Prioritization Scheme. This new prioritization scheme has 2 methods
|
||||||
|
to convey the stream priorities to a remote endpoint: Priority header
|
||||||
|
field and PRIORITY_UPDATE frame. nghttp2 supports both methods. In
|
||||||
|
order to receive and process PRIORITY_UPDATE frame, server has to call
|
||||||
|
``nghttp2_option_set_builtin_recv_extension_type(option,
|
||||||
|
NGHTTP2_PRIORITY_UPDATE)`` (see the above section), and pass the
|
||||||
|
option to `nghttp2_session_server_new2()` or
|
||||||
|
`nghttp2_session_server_new3()` to create a server session. Client
|
||||||
|
can send Priority header field via `nghttp2_submit_request()`. It can
|
||||||
|
also send PRIORITY_UPDATE frame via
|
||||||
|
`nghttp2_submit_priority_update()`. Server processes Priority header
|
||||||
|
field in a request header field and updates the stream priority unless
|
||||||
|
HTTP messaging rule enforcement is disabled (see
|
||||||
|
`nghttp2_option_set_no_http_messaging()`).
|
||||||
|
|
||||||
|
For the purpose of smooth migration from RFC 7540 priorities, client
|
||||||
|
is advised to send
|
||||||
|
:enum:`nghttp2_settings_id.NGHTTP2_SETTINGS_NO_RFC7540_PRIORITIES` of
|
||||||
|
value of 1. Until it receives the first server SETTINGS frame, it can
|
||||||
|
send both RFC 7540 and RFC 9128 priority signals. If client receives
|
||||||
|
SETTINGS_NO_RFC7540_PRIORITIES of value of 0, or it is omitted ,
|
||||||
|
client stops sending PRIORITY_UPDATE frame. Priority header field
|
||||||
|
will be sent in anyway since it is an end-to-end signal. If
|
||||||
|
SETTINGS_NO_RFC7540_PRIORITIES of value of 1 is received, client stops
|
||||||
|
sending RFC 7540 priority signals. This is the advice described in
|
||||||
|
:rfc:`9218#section-2.1.1`.
|
||||||
|
|
||||||
|
Server has an optional mechanism to fallback to RFC 7540 priorities.
|
||||||
|
By default, if server sends SETTINGS_NO_RFC7540_PRIORITIES of value of
|
||||||
|
1, it completely disables RFC 7540 priorities and no fallback. By
|
||||||
|
setting nonzero value to
|
||||||
|
`nghttp2_option_set_server_fallback_rfc7540_priorities()`, server
|
||||||
|
falls back to RFC 7540 priorities if it sends
|
||||||
|
SETTINGS_NO_RFC7540_PRIORITIES value of value of 1, and client omits
|
||||||
|
SETTINGS_NO_RFC7540_PRIORITIES in its SETTINGS frame.
|
||||||
|
|
|
@ -1 +0,0 @@
|
||||||
.. include:: @top_srcdir@/doc/sources/python-apiref.rst
|
|
|
@ -2,49 +2,39 @@ Building Android binary
|
||||||
=======================
|
=======================
|
||||||
|
|
||||||
In this article, we briefly describe how to build Android binary using
|
In this article, we briefly describe how to build Android binary using
|
||||||
`Android NDK <https://developer.android.com/ndk/index.html>`_
|
`Android NDK <https://developer.android.com/ndk>`_ cross-compiler on
|
||||||
cross-compiler on Debian Linux.
|
Debian Linux.
|
||||||
|
|
||||||
The easiest way to build android binary is use Dockerfile.android.
|
The easiest way to build android binary is use Dockerfile.android.
|
||||||
See Dockerfile.android for more details. If you cannot use
|
See Dockerfile.android for more details. If you cannot use
|
||||||
Dockerfile.android for whatever reason, continue to read the rest of
|
Dockerfile.android for whatever reason, continue to read the rest of
|
||||||
this article.
|
this article.
|
||||||
|
|
||||||
We offer ``android-config`` and ``android-make`` scripts to make the
|
We offer ``android-config`` script to make the build easier. To make
|
||||||
build easier. To make these script work, NDK toolchain must be
|
the script work, NDK directory must be set to ``NDK`` environment
|
||||||
installed in the following way. First, let us introduce
|
variable. NDK directory is the directory where NDK is unpacked:
|
||||||
``ANDROID_HOME`` environment variable. We need to install toolchain
|
|
||||||
under ``$ANDROID_HOME/toolchain``. An user can freely choose the path
|
|
||||||
for ``ANDROID_HOME``. For example, to install toolchain under
|
|
||||||
``$ANDROID_HOME/toolchain``, do this in the the directory where NDK is
|
|
||||||
unpacked:
|
|
||||||
|
|
||||||
.. code-block:: text
|
.. code-block:: text
|
||||||
|
|
||||||
$ build/tools/make_standalone_toolchain.py \
|
$ unzip android-ndk-$NDK_VERSION-linux.zip
|
||||||
--arch arm --api 16 --stl gnustl \
|
$ cd android-ndk-$NDK_VERSION
|
||||||
--install-dir $ANDROID_HOME/toolchain
|
$ export NDK=$PWD
|
||||||
|
|
||||||
The API level (``--api``) is not important here because we don't use
|
|
||||||
Android specific C/C++ API.
|
|
||||||
|
|
||||||
The dependent libraries, such as OpenSSL, libev, and c-ares should be
|
The dependent libraries, such as OpenSSL, libev, and c-ares should be
|
||||||
built with the toolchain and installed under
|
built with the same NDK toolchain and installed under
|
||||||
``$ANDROID_HOME/usr/local``. We recommend to build these libraries as
|
``$NDK/usr/local``. We recommend to build these libraries as static
|
||||||
static library to make the deployment easier. libxml2 support is
|
library to make the deployment easier. libxml2 support is currently
|
||||||
currently disabled.
|
disabled.
|
||||||
|
|
||||||
Although zlib comes with Android NDK, it seems not to be a part of
|
Although zlib comes with Android NDK, it seems not to be a part of
|
||||||
public API, so we have to built it for our own. That also provides us
|
public API, so we have to built it for our own. That also provides us
|
||||||
proper .pc file as a bonus.
|
proper .pc file as a bonus.
|
||||||
|
|
||||||
Before running ``android-config`` and ``android-make``,
|
Before running ``android-config``, ``NDK`` environment variable must
|
||||||
``ANDROID_HOME`` environment variable must be set to point to the
|
be set to point to the correct path.
|
||||||
correct path. Also add ``$ANDROID_HOME/toolchain/bin`` to ``PATH``:
|
|
||||||
|
|
||||||
.. code-block:: text
|
You need to set ``NGHTTP2`` environment variable to the absolute path
|
||||||
|
to the source directory of nghttp2.
|
||||||
$ export PATH=$PATH:$ANDROID_HOME/toolchain/bin
|
|
||||||
|
|
||||||
To configure OpenSSL, use the following script:
|
To configure OpenSSL, use the following script:
|
||||||
|
|
||||||
|
@ -52,39 +42,36 @@ To configure OpenSSL, use the following script:
|
||||||
|
|
||||||
#!/bin/sh
|
#!/bin/sh
|
||||||
|
|
||||||
if [ -z "$ANDROID_HOME" ]; then
|
. $NGHTTP2/android-env
|
||||||
echo 'No $ANDROID_HOME specified.'
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
PREFIX=$ANDROID_HOME/usr/local
|
|
||||||
TOOLCHAIN=$ANDROID_HOME/toolchain
|
|
||||||
PATH=$TOOLCHAIN/bin:$PATH
|
|
||||||
|
|
||||||
export CROSS_COMPILE=$TOOLCHAIN/bin/arm-linux-androideabi-
|
export ANDROID_NDK_HOME=$NDK
|
||||||
./Configure --prefix=$PREFIX android
|
export PATH=$TOOLCHAIN/bin:$PATH
|
||||||
|
|
||||||
And run ``make install_sw`` to build and install without
|
./Configure no-shared --prefix=$PREFIX android-arm64
|
||||||
documentation.
|
|
||||||
|
|
||||||
We cannot compile libev without modification. Apply `this patch
|
And run the following script to build and install without
|
||||||
<https://gist.github.com/tatsuhiro-t/48c45f08950f587180ed>`_ before
|
documentation:
|
||||||
configuring libev. This patch is for libev-4.19. After applying the
|
|
||||||
patch, to configure libev, use the following script:
|
|
||||||
|
|
||||||
.. code-block:: sh
|
.. code-block:: sh
|
||||||
|
|
||||||
#!/bin/sh
|
#!/bin/sh
|
||||||
|
|
||||||
if [ -z "$ANDROID_HOME" ]; then
|
. $NGHTTP2/android-env
|
||||||
echo 'No $ANDROID_HOME specified.'
|
|
||||||
exit 1
|
export PATH=$TOOLCHAIN/bin:$PATH
|
||||||
fi
|
|
||||||
PREFIX=$ANDROID_HOME/usr/local
|
make install_sw
|
||||||
TOOLCHAIN=$ANDROID_HOME/toolchain
|
|
||||||
PATH=$TOOLCHAIN/bin:$PATH
|
To configure libev, use the following script:
|
||||||
|
|
||||||
|
.. code-block:: sh
|
||||||
|
|
||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
. $NGHTTP2/android-env
|
||||||
|
|
||||||
./configure \
|
./configure \
|
||||||
--host=arm-linux-androideabi \
|
--host=$TARGET \
|
||||||
--build=`dpkg-architecture -qDEB_BUILD_GNU_TYPE` \
|
--build=`dpkg-architecture -qDEB_BUILD_GNU_TYPE` \
|
||||||
--prefix=$PREFIX \
|
--prefix=$PREFIX \
|
||||||
--disable-shared \
|
--disable-shared \
|
||||||
|
@ -100,41 +87,26 @@ To configure c-ares, use the following script:
|
||||||
|
|
||||||
#!/bin/sh -e
|
#!/bin/sh -e
|
||||||
|
|
||||||
if [ -z "$ANDROID_HOME" ]; then
|
. $NGHTTP2/android-env
|
||||||
echo 'No $ANDROID_HOME specified.'
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
PREFIX=$ANDROID_HOME/usr/local
|
|
||||||
TOOLCHAIN=$ANDROID_HOME/toolchain
|
|
||||||
PATH=$TOOLCHAIN/bin:$PATH
|
|
||||||
|
|
||||||
./configure \
|
./configure \
|
||||||
--host=arm-linux-androideabi \
|
--host=$TARGET \
|
||||||
--build=`dpkg-architecture -qDEB_BUILD_GNU_TYPE` \
|
--build=`dpkg-architecture -qDEB_BUILD_GNU_TYPE` \
|
||||||
--prefix=$PREFIX \
|
--prefix=$PREFIX \
|
||||||
--disable-shared
|
--disable-shared
|
||||||
|
|
||||||
|
And run ``make install`` to build and install.
|
||||||
|
|
||||||
To configure zlib, use the following script:
|
To configure zlib, use the following script:
|
||||||
|
|
||||||
.. code-block:: sh
|
.. code-block:: sh
|
||||||
|
|
||||||
#!/bin/sh -e
|
#!/bin/sh -e
|
||||||
|
|
||||||
if [ -z "$ANDROID_HOME" ]; then
|
. $NGHTTP2/android-env
|
||||||
echo 'No $ANDROID_HOME specified.'
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
PREFIX=$ANDROID_HOME/usr/local
|
|
||||||
TOOLCHAIN=$ANDROID_HOME/toolchain
|
|
||||||
PATH=$TOOLCHAIN/bin:$PATH
|
|
||||||
|
|
||||||
HOST=arm-linux-androideabi
|
export HOST=$TARGET
|
||||||
|
|
||||||
CC=$HOST-gcc \
|
|
||||||
AR=$HOST-ar \
|
|
||||||
LD=$HOST-ld \
|
|
||||||
RANLIB=$HOST-ranlib \
|
|
||||||
STRIP=$HOST-strip \
|
|
||||||
./configure \
|
./configure \
|
||||||
--prefix=$PREFIX \
|
--prefix=$PREFIX \
|
||||||
--libdir=$PREFIX/lib \
|
--libdir=$PREFIX/lib \
|
||||||
|
@ -144,7 +116,7 @@ To configure zlib, use the following script:
|
||||||
And run ``make install`` to build and install.
|
And run ``make install`` to build and install.
|
||||||
|
|
||||||
After prerequisite libraries are prepared, run ``android-config`` and
|
After prerequisite libraries are prepared, run ``android-config`` and
|
||||||
then ``android-make`` to compile nghttp2 source files.
|
then ``make`` to compile nghttp2 source files.
|
||||||
|
|
||||||
If all went well, application binaries, such as nghttpx, are created
|
If all went well, application binaries, such as nghttpx, are created
|
||||||
under src directory. Strip debugging information from the binary
|
under src directory. Strip debugging information from the binary
|
||||||
|
@ -152,4 +124,4 @@ using the following command:
|
||||||
|
|
||||||
.. code-block:: text
|
.. code-block:: text
|
||||||
|
|
||||||
$ arm-linux-androideabi-strip src/nghttpx
|
$ $NDK/toolchains/llvm/prebuilt/linux-x86_64/bin/llvm-strip src/nghttpx
|
||||||
|
|
|
@ -26,7 +26,7 @@ Coding style
|
||||||
We use clang-format to format source code consistently. The
|
We use clang-format to format source code consistently. The
|
||||||
clang-format configuration file .clang-format is located at the root
|
clang-format configuration file .clang-format is located at the root
|
||||||
directory. Since clang-format produces slightly different results
|
directory. Since clang-format produces slightly different results
|
||||||
between versions, we currently use clang-format-12.
|
between versions, we currently use clang-format-14.
|
||||||
|
|
||||||
To detect any violation to the coding style, we recommend to setup git
|
To detect any violation to the coding style, we recommend to setup git
|
||||||
pre-commit hook to check coding style of the changes you introduced.
|
pre-commit hook to check coding style of the changes you introduced.
|
||||||
|
@ -34,13 +34,13 @@ The pre-commit file is located at the root directory. Copy it under
|
||||||
.git/hooks and make sure that it is executable. The pre-commit script
|
.git/hooks and make sure that it is executable. The pre-commit script
|
||||||
uses clang-format-diff.py to detect any style errors. If it is not in
|
uses clang-format-diff.py to detect any style errors. If it is not in
|
||||||
your PATH or it exists under different name (e.g.,
|
your PATH or it exists under different name (e.g.,
|
||||||
clang-format-diff-12 in debian), either add it to PATH variable or add
|
clang-format-diff-14 in debian), either add it to PATH variable or add
|
||||||
git option ``clangformatdiff.binary`` to point to the script.
|
git option ``clangformatdiff.binary`` to point to the script.
|
||||||
|
|
||||||
For emacs users, integrating clang-format to emacs is very easy.
|
For emacs users, integrating clang-format to emacs is very easy.
|
||||||
clang-format.el should come with clang distribution. If it is not
|
clang-format.el should come with clang distribution. If it is not
|
||||||
found, download it from `here
|
found, download it from `here
|
||||||
<https://llvm.org/svn/llvm-project/cfe/trunk/tools/clang-format/clang-format.el>`_.
|
<https://github.com/llvm/llvm-project/blob/main/clang/tools/clang-format/clang-format.el>`_.
|
||||||
And add these lines to your .emacs file:
|
And add these lines to your .emacs file:
|
||||||
|
|
||||||
.. code-block:: lisp
|
.. code-block:: lisp
|
||||||
|
|
|
@ -31,13 +31,8 @@ Contents:
|
||||||
h2load-howto
|
h2load-howto
|
||||||
programmers-guide
|
programmers-guide
|
||||||
apiref
|
apiref
|
||||||
libnghttp2_asio
|
|
||||||
python-apiref
|
|
||||||
nghttp2.h
|
nghttp2.h
|
||||||
nghttp2ver.h
|
nghttp2ver.h
|
||||||
asio_http2_server.h
|
|
||||||
asio_http2_client.h
|
|
||||||
asio_http2.h
|
|
||||||
Source <https://github.com/nghttp2/nghttp2>
|
Source <https://github.com/nghttp2/nghttp2>
|
||||||
Issues <https://github.com/nghttp2/nghttp2/issues>
|
Issues <https://github.com/nghttp2/nghttp2/issues>
|
||||||
nghttp2.org <https://nghttp2.org/>
|
nghttp2.org <https://nghttp2.org/>
|
||||||
|
|
|
@ -1,433 +0,0 @@
|
||||||
libnghttp2_asio: High level HTTP/2 C++ library
|
|
||||||
==============================================
|
|
||||||
|
|
||||||
libnghttp2_asio is C++ library built on top of libnghttp2 and provides
|
|
||||||
high level abstraction API to build HTTP/2 applications. It depends
|
|
||||||
on Boost::ASIO library and OpenSSL. Currently libnghttp2_asio
|
|
||||||
provides server and client side API.
|
|
||||||
|
|
||||||
libnghttp2_asio is not built by default. Use ``--enable-asio-lib``
|
|
||||||
configure flag to build libnghttp2_asio. The required Boost libraries
|
|
||||||
are:
|
|
||||||
|
|
||||||
* Boost::Asio
|
|
||||||
* Boost::System
|
|
||||||
* Boost::Thread
|
|
||||||
|
|
||||||
We have 3 header files for this library:
|
|
||||||
|
|
||||||
* :doc:`asio_http2_server.h`
|
|
||||||
* :doc:`asio_http2_client.h`
|
|
||||||
* :doc:`asio_http2.h`
|
|
||||||
|
|
||||||
asio_http2.h is included from the other two files.
|
|
||||||
|
|
||||||
To build a program with libnghttp2_asio, link to the following
|
|
||||||
libraries::
|
|
||||||
|
|
||||||
-lnghttp2_asio -lboost_system
|
|
||||||
|
|
||||||
If ``boost::asio::ssl`` is used in application code, OpenSSL is also
|
|
||||||
required in link line::
|
|
||||||
|
|
||||||
-lnghttp2_asio -lboost_system -lssl -lcrypto
|
|
||||||
|
|
||||||
Server API
|
|
||||||
----------
|
|
||||||
|
|
||||||
To use server API, first include following header file:
|
|
||||||
|
|
||||||
.. code-block:: cpp
|
|
||||||
|
|
||||||
#include <nghttp2/asio_http2_server.h>
|
|
||||||
|
|
||||||
Also take a look at that header file :doc:`asio_http2_server.h`.
|
|
||||||
|
|
||||||
Server API is designed to build HTTP/2 server very easily to utilize
|
|
||||||
C++11 anonymous function and closure. The bare minimum example of
|
|
||||||
HTTP/2 server looks like this:
|
|
||||||
|
|
||||||
.. code-block:: cpp
|
|
||||||
|
|
||||||
using namespace nghttp2::asio_http2;
|
|
||||||
using namespace nghttp2::asio_http2::server;
|
|
||||||
|
|
||||||
int main(int argc, char *argv[]) {
|
|
||||||
boost::system::error_code ec;
|
|
||||||
http2 server;
|
|
||||||
|
|
||||||
server.handle("/", [](const request &req, const response &res) {
|
|
||||||
res.write_head(200);
|
|
||||||
res.end("hello, world\n");
|
|
||||||
});
|
|
||||||
|
|
||||||
if (server.listen_and_serve(ec, "localhost", "3000")) {
|
|
||||||
std::cerr << "error: " << ec.message() << std::endl;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
First we instantiate ``nghttp2::asio_http2::server::http2`` object.
|
|
||||||
``nghttp2::asio_http2::server::http2::handle`` function registers
|
|
||||||
pattern and its handler function. In this example, we register "/" as
|
|
||||||
pattern, which matches all requests. Then call
|
|
||||||
``nghttp2::asio_http2::server::http2::listen_and_serve`` function with
|
|
||||||
address and port to listen to.
|
|
||||||
|
|
||||||
The ``req`` and ``res`` represent HTTP request and response
|
|
||||||
respectively. ``nghttp2::asio_http2_::server::response::write_head``
|
|
||||||
constructs HTTP response header fields. The first argument is HTTP
|
|
||||||
status code, in the above example, which is 200. The second argument,
|
|
||||||
which is omitted in the above example, is additional header fields to
|
|
||||||
send.
|
|
||||||
|
|
||||||
``nghttp2::asio_http2::server::response::end`` sends response body.
|
|
||||||
In the above example, we send string "hello, world".
|
|
||||||
|
|
||||||
The life time of req and res object ends after the callback set by
|
|
||||||
``nghttp2::asio_http2::server::response::on_close`` function.
|
|
||||||
Application must not use those objects after this call.
|
|
||||||
|
|
||||||
Serving static files and enabling SSL/TLS
|
|
||||||
+++++++++++++++++++++++++++++++++++++++++
|
|
||||||
|
|
||||||
In this example, we serve a couple of static files and also enable
|
|
||||||
SSL/TLS.
|
|
||||||
|
|
||||||
.. code-block:: cpp
|
|
||||||
|
|
||||||
#include <nghttp2/asio_http2_server.h>
|
|
||||||
|
|
||||||
using namespace nghttp2::asio_http2;
|
|
||||||
using namespace nghttp2::asio_http2::server;
|
|
||||||
|
|
||||||
int main(int argc, char *argv[]) {
|
|
||||||
boost::system::error_code ec;
|
|
||||||
boost::asio::ssl::context tls(boost::asio::ssl::context::sslv23);
|
|
||||||
|
|
||||||
tls.use_private_key_file("server.key", boost::asio::ssl::context::pem);
|
|
||||||
tls.use_certificate_chain_file("server.crt");
|
|
||||||
|
|
||||||
configure_tls_context_easy(ec, tls);
|
|
||||||
|
|
||||||
http2 server;
|
|
||||||
|
|
||||||
server.handle("/index.html", [](const request &req, const response &res) {
|
|
||||||
res.write_head(200);
|
|
||||||
res.end(file_generator("index.html"));
|
|
||||||
});
|
|
||||||
|
|
||||||
if (server.listen_and_serve(ec, tls, "localhost", "3000")) {
|
|
||||||
std::cerr << "error: " << ec.message() << std::endl;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
We first create ``boost::asio::ssl::context`` object and set path to
|
|
||||||
private key file and certificate file.
|
|
||||||
``nghttp2::asio_http2::server::configure_tls_context_easy`` function
|
|
||||||
configures SSL/TLS context object for HTTP/2 server use, including NPN
|
|
||||||
callbacks.
|
|
||||||
|
|
||||||
In the above example, if request path is "/index.html", we serve
|
|
||||||
index.html file in the current working directory.
|
|
||||||
``nghttp2::asio_http2::server::response::end`` has overload to take
|
|
||||||
function of type ``nghttp2::asio_http2::generator_cb`` and application
|
|
||||||
pass its implementation to generate response body. For the
|
|
||||||
convenience, libnghttp2_asio library provides
|
|
||||||
``nghttp2::asio_http2::file_generator`` function to generate function
|
|
||||||
to server static file. If other resource is requested, server
|
|
||||||
automatically responds with 404 status code.
|
|
||||||
|
|
||||||
Server push
|
|
||||||
+++++++++++
|
|
||||||
|
|
||||||
Server push is also supported.
|
|
||||||
|
|
||||||
.. code-block:: cpp
|
|
||||||
|
|
||||||
#include <nghttp2/asio_http2_server.h>
|
|
||||||
|
|
||||||
using namespace nghttp2::asio_http2;
|
|
||||||
using namespace nghttp2::asio_http2::server;
|
|
||||||
|
|
||||||
int main(int argc, char *argv[]) {
|
|
||||||
boost::system::error_code ec;
|
|
||||||
boost::asio::ssl::context tls(boost::asio::ssl::context::sslv23);
|
|
||||||
|
|
||||||
tls.use_private_key_file("server.key", boost::asio::ssl::context::pem);
|
|
||||||
tls.use_certificate_chain_file("server.crt");
|
|
||||||
|
|
||||||
configure_tls_context_easy(ec, tls);
|
|
||||||
|
|
||||||
http2 server;
|
|
||||||
|
|
||||||
std::string style_css = "h1 { color: green; }";
|
|
||||||
|
|
||||||
server.handle("/", [&style_css](const request &req, const response &res) {
|
|
||||||
boost::system::error_code ec;
|
|
||||||
auto push = res.push(ec, "GET", "/style.css");
|
|
||||||
push->write_head(200);
|
|
||||||
push->end(style_css);
|
|
||||||
|
|
||||||
res.write_head(200);
|
|
||||||
res.end(R"(
|
|
||||||
<!DOCTYPE html><html lang="en">
|
|
||||||
<title>HTTP/2 FTW</title><body>
|
|
||||||
<link href="/style.css" rel="stylesheet" type="text/css">
|
|
||||||
<h1>This should be green</h1>
|
|
||||||
</body></html>
|
|
||||||
)");
|
|
||||||
});
|
|
||||||
|
|
||||||
server.handle("/style.css",
|
|
||||||
[&style_css](const request &req, const response &res) {
|
|
||||||
res.write_head(200);
|
|
||||||
res.end(style_css);
|
|
||||||
});
|
|
||||||
|
|
||||||
if (server.listen_and_serve(ec, tls, "localhost", "3000")) {
|
|
||||||
std::cerr << "error: " << ec.message() << std::endl;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
When client requested any resource other than "/style.css", we push
|
|
||||||
"/style.css". To push resource, call
|
|
||||||
``nghttp2::asio_http2::server::response::push`` function with desired
|
|
||||||
method and path. It returns another response object and use its
|
|
||||||
functions to send push response.
|
|
||||||
|
|
||||||
Enable multi-threading
|
|
||||||
++++++++++++++++++++++
|
|
||||||
|
|
||||||
Enabling multi-threading is very easy. Just call
|
|
||||||
``nghttp2::asio_http2::server::http2::num_threads`` function with the
|
|
||||||
desired number of threads:
|
|
||||||
|
|
||||||
.. code-block:: cpp
|
|
||||||
|
|
||||||
http2 server;
|
|
||||||
|
|
||||||
// Use 4 native threads
|
|
||||||
server.num_threads(4);
|
|
||||||
|
|
||||||
Client API
|
|
||||||
----------
|
|
||||||
|
|
||||||
To use client API, first include following header file:
|
|
||||||
|
|
||||||
.. code-block:: cpp
|
|
||||||
|
|
||||||
#include <nghttp2/asio_http2_client.h>
|
|
||||||
|
|
||||||
Also take a look at that header file :doc:`asio_http2_client.h`.
|
|
||||||
|
|
||||||
Here is the sample client code to access HTTP/2 server and print out
|
|
||||||
response header fields and response body to the console screen:
|
|
||||||
|
|
||||||
.. code-block:: cpp
|
|
||||||
|
|
||||||
#include <iostream>
|
|
||||||
|
|
||||||
#include <nghttp2/asio_http2_client.h>
|
|
||||||
|
|
||||||
using boost::asio::ip::tcp;
|
|
||||||
|
|
||||||
using namespace nghttp2::asio_http2;
|
|
||||||
using namespace nghttp2::asio_http2::client;
|
|
||||||
|
|
||||||
int main(int argc, char *argv[]) {
|
|
||||||
boost::system::error_code ec;
|
|
||||||
boost::asio::io_service io_service;
|
|
||||||
|
|
||||||
// connect to localhost:3000
|
|
||||||
session sess(io_service, "localhost", "3000");
|
|
||||||
|
|
||||||
sess.on_connect([&sess](tcp::resolver::iterator endpoint_it) {
|
|
||||||
boost::system::error_code ec;
|
|
||||||
|
|
||||||
auto req = sess.submit(ec, "GET", "http://localhost:3000/");
|
|
||||||
|
|
||||||
req->on_response([](const response &res) {
|
|
||||||
// print status code and response header fields.
|
|
||||||
std::cerr << "HTTP/2 " << res.status_code() << std::endl;
|
|
||||||
for (auto &kv : res.header()) {
|
|
||||||
std::cerr << kv.first << ": " << kv.second.value << "\n";
|
|
||||||
}
|
|
||||||
std::cerr << std::endl;
|
|
||||||
|
|
||||||
res.on_data([](const uint8_t *data, std::size_t len) {
|
|
||||||
std::cerr.write(reinterpret_cast<const char *>(data), len);
|
|
||||||
std::cerr << std::endl;
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
req->on_close([&sess](uint32_t error_code) {
|
|
||||||
// shutdown session after first request was done.
|
|
||||||
sess.shutdown();
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
sess.on_error([](const boost::system::error_code &ec) {
|
|
||||||
std::cerr << "error: " << ec.message() << std::endl;
|
|
||||||
});
|
|
||||||
|
|
||||||
io_service.run();
|
|
||||||
}
|
|
||||||
|
|
||||||
``nghttp2::asio_http2::client::session`` object takes
|
|
||||||
``boost::asio::io_service`` object and remote server address. When
|
|
||||||
connection is made, the callback function passed to
|
|
||||||
``nghttp2::asio_http2::client::on_connect`` is invoked with connected
|
|
||||||
address as its parameter. After this callback call, use
|
|
||||||
``nghttp2::asio_http2::session::submit`` to send request to the
|
|
||||||
server. You can submit multiple requests at once without waiting for
|
|
||||||
the completion of previous request.
|
|
||||||
|
|
||||||
The life time of req and res object ends after the callback set by
|
|
||||||
``nghttp2::asio_http2::server::request::on_close`` function.
|
|
||||||
Application must not use those objects after this call.
|
|
||||||
|
|
||||||
Normally, client does not stop even after all requests are done unless
|
|
||||||
connection is lost. To stop client, call
|
|
||||||
``nghttp2::asio_http2::server::session::shutdown()``.
|
|
||||||
|
|
||||||
Receive server push and enable SSL/TLS
|
|
||||||
++++++++++++++++++++++++++++++++++++++
|
|
||||||
|
|
||||||
.. code-block:: cpp
|
|
||||||
|
|
||||||
#include <iostream>
|
|
||||||
|
|
||||||
#include <nghttp2/asio_http2_client.h>
|
|
||||||
|
|
||||||
using boost::asio::ip::tcp;
|
|
||||||
|
|
||||||
using namespace nghttp2::asio_http2;
|
|
||||||
using namespace nghttp2::asio_http2::client;
|
|
||||||
|
|
||||||
int main(int argc, char *argv[]) {
|
|
||||||
boost::system::error_code ec;
|
|
||||||
boost::asio::io_service io_service;
|
|
||||||
|
|
||||||
boost::asio::ssl::context tls(boost::asio::ssl::context::sslv23);
|
|
||||||
tls.set_default_verify_paths();
|
|
||||||
// disabled to make development easier...
|
|
||||||
// tls_ctx.set_verify_mode(boost::asio::ssl::verify_peer);
|
|
||||||
configure_tls_context(ec, tls);
|
|
||||||
|
|
||||||
// connect to localhost:3000
|
|
||||||
session sess(io_service, tls, "localhost", "3000");
|
|
||||||
|
|
||||||
sess.on_connect([&sess](tcp::resolver::iterator endpoint_it) {
|
|
||||||
boost::system::error_code ec;
|
|
||||||
|
|
||||||
auto req = sess.submit(ec, "GET", "http://localhost:3000/");
|
|
||||||
|
|
||||||
req->on_response([&sess](const response &res) {
|
|
||||||
std::cerr << "response received!" << std::endl;
|
|
||||||
res.on_data([&sess](const uint8_t *data, std::size_t len) {
|
|
||||||
std::cerr.write(reinterpret_cast<const char *>(data), len);
|
|
||||||
std::cerr << std::endl;
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
req->on_push([](const request &push) {
|
|
||||||
std::cerr << "push request received!" << std::endl;
|
|
||||||
push.on_response([](const response &res) {
|
|
||||||
std::cerr << "push response received!" << std::endl;
|
|
||||||
res.on_data([](const uint8_t *data, std::size_t len) {
|
|
||||||
std::cerr.write(reinterpret_cast<const char *>(data), len);
|
|
||||||
std::cerr << std::endl;
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
sess.on_error([](const boost::system::error_code &ec) {
|
|
||||||
std::cerr << "error: " << ec.message() << std::endl;
|
|
||||||
});
|
|
||||||
|
|
||||||
io_service.run();
|
|
||||||
}
|
|
||||||
|
|
||||||
The above sample code demonstrates how to enable SSL/TLS and receive
|
|
||||||
server push. Currently,
|
|
||||||
``nghttp2::asio_http2::client::configure_tls_context`` function setups
|
|
||||||
NPN callbacks for SSL/TLS context for HTTP/2 use.
|
|
||||||
|
|
||||||
To receive server push, use
|
|
||||||
``nghttp2::asio_http2::client::request::on_push`` function to set
|
|
||||||
callback function which is invoked when server push request is
|
|
||||||
arrived. The callback function takes
|
|
||||||
``nghttp2::asio_http2::client::request`` object, which contains the
|
|
||||||
pushed request. To get server push response, set callback using
|
|
||||||
``nghttp2::asio_http2::client::request::on_response``.
|
|
||||||
|
|
||||||
As stated in the previous section, client does not stop automatically
|
|
||||||
as long as HTTP/2 session is fine and connection is alive. We don't
|
|
||||||
call ``nghttp2::asio_http2::client::session::shutdown`` in this
|
|
||||||
example, so the program does not terminate after all responses are
|
|
||||||
received. Hit Ctrl-C to terminate the program.
|
|
||||||
|
|
||||||
Multiple concurrent requests
|
|
||||||
++++++++++++++++++++++++++++
|
|
||||||
|
|
||||||
.. code-block:: cpp
|
|
||||||
|
|
||||||
#include <iostream>
|
|
||||||
|
|
||||||
#include <nghttp2/asio_http2_client.h>
|
|
||||||
|
|
||||||
using boost::asio::ip::tcp;
|
|
||||||
|
|
||||||
using namespace nghttp2::asio_http2;
|
|
||||||
using namespace nghttp2::asio_http2::client;
|
|
||||||
|
|
||||||
int main(int argc, char *argv[]) {
|
|
||||||
boost::system::error_code ec;
|
|
||||||
boost::asio::io_service io_service;
|
|
||||||
|
|
||||||
// connect to localhost:3000
|
|
||||||
session sess(io_service, "localhost", "3000");
|
|
||||||
|
|
||||||
sess.on_connect([&sess](tcp::resolver::iterator endpoint_it) {
|
|
||||||
boost::system::error_code ec;
|
|
||||||
|
|
||||||
auto printer = [](const response &res) {
|
|
||||||
res.on_data([](const uint8_t *data, std::size_t len) {
|
|
||||||
std::cerr.write(reinterpret_cast<const char *>(data), len);
|
|
||||||
std::cerr << std::endl;
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
std::size_t num = 3;
|
|
||||||
auto count = std::make_shared<int>(num);
|
|
||||||
|
|
||||||
for (std::size_t i = 0; i < num; ++i) {
|
|
||||||
auto req = sess.submit(ec, "GET",
|
|
||||||
"http://localhost:3000/" + std::to_string(i + 1));
|
|
||||||
|
|
||||||
req->on_response(printer);
|
|
||||||
req->on_close([&sess, count](uint32_t error_code) {
|
|
||||||
if (--*count == 0) {
|
|
||||||
// shutdown session after |num| requests were done.
|
|
||||||
sess.shutdown();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
sess.on_error([](const boost::system::error_code &ec) {
|
|
||||||
std::cerr << "error: " << ec.message() << std::endl;
|
|
||||||
});
|
|
||||||
|
|
||||||
io_service.run();
|
|
||||||
}
|
|
||||||
|
|
||||||
Here is the sample to send 3 requests at once. Depending on the
|
|
||||||
server settings, these requests are processed out-of-order. In this
|
|
||||||
example, we have a trick to shutdown session after all requests were
|
|
||||||
done. We made ``count`` object which is shared pointer to int and is
|
|
||||||
initialized to 3. On each request closure (the invocation of the
|
|
||||||
callback set by ``nghttp2::asio_http2::client::request::on_close``),
|
|
||||||
we decrement the count. If count becomes 0, we are sure that all
|
|
||||||
requests have been done and initiate shutdown.
|
|
|
@ -427,7 +427,11 @@ parameter. Optionally, a Path attribute can be specified in
|
||||||
backend=127.0.0.1,3000;;affinity=cookie;affinity-cookie-name=nghttpxlb;affinity-cookie-path=/
|
backend=127.0.0.1,3000;;affinity=cookie;affinity-cookie-name=nghttpxlb;affinity-cookie-path=/
|
||||||
|
|
||||||
Secure attribute of cookie is set if client connection is protected by
|
Secure attribute of cookie is set if client connection is protected by
|
||||||
TLS.
|
TLS. ``affinity-cookie-stickiness`` specifies the stickiness of this
|
||||||
|
affinity. If ``loose`` is given, which is the default, removing or
|
||||||
|
adding a backend server might break affinity. While ``strict`` is
|
||||||
|
given, removing the designated backend server breaks affinity, but
|
||||||
|
adding new backend server does not cause breakage.
|
||||||
|
|
||||||
PSK cipher suites
|
PSK cipher suites
|
||||||
-----------------
|
-----------------
|
||||||
|
@ -534,10 +538,28 @@ nghttpx does not support HTTP/3 on backend connection.
|
||||||
|
|
||||||
Hot swapping (SIGUSR2) or configuration reload (SIGHUP) require eBPF
|
Hot swapping (SIGUSR2) or configuration reload (SIGHUP) require eBPF
|
||||||
program. Without eBPF, old worker processes keep getting HTTP/3
|
program. Without eBPF, old worker processes keep getting HTTP/3
|
||||||
traffic and do not work as intended. Connection ID encryption key
|
traffic and do not work as intended. The QUIC keying material to
|
||||||
must be set with
|
encrypt Connection ID must be set with
|
||||||
:option:`--frontend-quic-connection-id-encryption-key` and must not
|
:option:`--frontend-quic-secret-file` and must provide the existing
|
||||||
change in order to keep the existing connections alive during reload.
|
keys in order to keep the existing connections alive during reload.
|
||||||
|
|
||||||
|
The construction of Connection ID closely follows Block Cipher CID
|
||||||
|
Algorithm described in `QUIC-LB draft
|
||||||
|
<https://datatracker.ietf.org/doc/html/draft-ietf-quic-load-balancers>`_.
|
||||||
|
A Connection ID that nghttpx generates is always 20 bytes long. It
|
||||||
|
uses first 2 bits as a configuration ID. The remaining bits in the
|
||||||
|
first byte are reserved and random. The next 4 bytes are server ID.
|
||||||
|
The next 4 bytes are used to route UDP datagram to a correct
|
||||||
|
``SO_REUSEPORT`` socket. The remaining bytes are randomly generated.
|
||||||
|
The server ID and the next 12 bytes are encrypted with AES-ECB. The
|
||||||
|
key is derived from the keying materials stored in a file specified by
|
||||||
|
:option:`--frontend-quic-secret-file`. The first 2 bits of keying
|
||||||
|
material in the file is used as a configuration ID. The remaining
|
||||||
|
bits and following 3 bytes are reserved and unused. The next 32 bytes
|
||||||
|
are used as an initial secret. The remaining 32 bytes are used as a
|
||||||
|
salt. The encryption key is generated by `HKDF
|
||||||
|
<https://datatracker.ietf.org/doc/html/rfc5869>`_ with SHA256 and
|
||||||
|
these keying materials and ``connection id encryption key`` as info.
|
||||||
|
|
||||||
In order announce that HTTP/3 endpoint is available, you should
|
In order announce that HTTP/3 endpoint is available, you should
|
||||||
specify alt-svc header field. For example, the following options send
|
specify alt-svc header field. For example, the following options send
|
||||||
|
|
|
@ -1,439 +0,0 @@
|
||||||
Python API Reference
|
|
||||||
====================
|
|
||||||
|
|
||||||
.. py:module:: nghttp2
|
|
||||||
|
|
||||||
nghttp2 offers some high level Python API to C library. The bindings
|
|
||||||
currently provide HPACK compressor and decompressor classes and HTTP/2
|
|
||||||
server class.
|
|
||||||
|
|
||||||
The extension module is called ``nghttp2``.
|
|
||||||
|
|
||||||
``make`` will build the bindings. The target Python version is
|
|
||||||
determined by configure script. If the detected Python version is not
|
|
||||||
what you expect, specify a path to Python executable in ``PYTHON``
|
|
||||||
variable as an argument to configure script (e.g., ``./configure
|
|
||||||
PYTHON=/usr/bin/python3.8``).
|
|
||||||
|
|
||||||
HPACK API
|
|
||||||
---------
|
|
||||||
|
|
||||||
.. py:class:: HDDeflater(hd_table_bufsize_max=DEFLATE_MAX_HEADER_TABLE_SIZE)
|
|
||||||
|
|
||||||
This class is used to perform header compression. The
|
|
||||||
*hd_table_bufsize_max* limits the usage of header table in the
|
|
||||||
given amount of bytes. The default value is
|
|
||||||
:py:data:`DEFLATE_MAX_HEADER_TABLE_SIZE`. This is necessary
|
|
||||||
because the deflater and inflater share the same amount of header
|
|
||||||
table and the inflater decides that number. The deflater may not
|
|
||||||
want to use all header table size because of limited memory
|
|
||||||
availability. In that case, *hd_table_bufsize_max* can be used to
|
|
||||||
cap the upper limit of table size whatever the header table size is
|
|
||||||
chosen by the inflater.
|
|
||||||
|
|
||||||
.. py:method:: deflate(headers)
|
|
||||||
|
|
||||||
Deflates the *headers*. The *headers* must be sequence of tuple
|
|
||||||
of name/value pair, which are byte strings (not unicode string).
|
|
||||||
|
|
||||||
This method returns the deflated header block in byte string.
|
|
||||||
Raises the exception if any error occurs.
|
|
||||||
|
|
||||||
.. py:method:: set_no_refset(no_refset)
|
|
||||||
|
|
||||||
Tells the deflater not to use reference set if *no_refset* is
|
|
||||||
evaluated to ``True``. If that happens, on each subsequent
|
|
||||||
invocation of :py:meth:`deflate()`, deflater will clear up
|
|
||||||
refersent set.
|
|
||||||
|
|
||||||
.. py:method:: change_table_size(hd_table_bufsize_max)
|
|
||||||
|
|
||||||
Changes header table size to *hd_table_bufsize_max* byte. if
|
|
||||||
*hd_table_bufsize_max* is strictly larger than
|
|
||||||
``hd_table_bufsize_max`` given in constructor,
|
|
||||||
``hd_table_bufsize_max`` is used as header table size instead.
|
|
||||||
|
|
||||||
Raises the exception if any error occurs.
|
|
||||||
|
|
||||||
.. py:method:: get_hd_table()
|
|
||||||
|
|
||||||
Returns copy of current dynamic header table.
|
|
||||||
|
|
||||||
The following example shows how to deflate header name/value pairs:
|
|
||||||
|
|
||||||
.. code-block:: python
|
|
||||||
|
|
||||||
import binascii, nghttp2
|
|
||||||
|
|
||||||
deflater = nghttp2.HDDeflater()
|
|
||||||
|
|
||||||
res = deflater.deflate([(b'foo', b'bar'),
|
|
||||||
(b'baz', b'buz')])
|
|
||||||
|
|
||||||
print(binascii.b2a_hex(res))
|
|
||||||
|
|
||||||
|
|
||||||
.. py:class:: HDInflater()
|
|
||||||
|
|
||||||
This class is used to perform header decompression.
|
|
||||||
|
|
||||||
.. py:method:: inflate(data)
|
|
||||||
|
|
||||||
Inflates the deflated header block *data*. The *data* must be
|
|
||||||
byte string.
|
|
||||||
|
|
||||||
Raises the exception if any error occurs.
|
|
||||||
|
|
||||||
.. py:method:: change_table_size(hd_table_bufsize_max)
|
|
||||||
|
|
||||||
Changes header table size to *hd_table_bufsize_max* byte.
|
|
||||||
|
|
||||||
Raises the exception if any error occurs.
|
|
||||||
|
|
||||||
.. py:method:: get_hd_table()
|
|
||||||
|
|
||||||
Returns copy of current dynamic header table.
|
|
||||||
|
|
||||||
The following example shows how to inflate deflated header block:
|
|
||||||
|
|
||||||
.. code-block:: python
|
|
||||||
|
|
||||||
deflater = nghttp2.HDDeflater()
|
|
||||||
|
|
||||||
data = deflater.deflate([(b'foo', b'bar'),
|
|
||||||
(b'baz', b'buz')])
|
|
||||||
|
|
||||||
inflater = nghttp2.HDInflater()
|
|
||||||
|
|
||||||
hdrs = inflater.inflate(data)
|
|
||||||
|
|
||||||
print(hdrs)
|
|
||||||
|
|
||||||
|
|
||||||
.. py:function:: print_hd_table(hdtable)
|
|
||||||
|
|
||||||
Convenient function to print *hdtable* to the standard output. The
|
|
||||||
*hdtable* is the one retrieved by
|
|
||||||
:py:meth:`HDDeflater.get_hd_table()` or
|
|
||||||
:py:meth:`HDInflater.get_hd_table()`. This function does not work
|
|
||||||
if header name/value cannot be decoded using UTF-8 encoding.
|
|
||||||
|
|
||||||
In output, ``s=N`` means the entry occupies ``N`` bytes in header
|
|
||||||
table. If ``r=y``, then the entry is in the reference set.
|
|
||||||
|
|
||||||
.. py:data:: DEFAULT_HEADER_TABLE_SIZE
|
|
||||||
|
|
||||||
The default header table size, which is 4096 as per HTTP/2
|
|
||||||
specification.
|
|
||||||
|
|
||||||
.. py:data:: DEFLATE_MAX_HEADER_TABLE_SIZE
|
|
||||||
|
|
||||||
The default header table size for deflater. The initial value
|
|
||||||
is 4096.
|
|
||||||
|
|
||||||
HTTP/2 servers
|
|
||||||
--------------
|
|
||||||
|
|
||||||
.. note::
|
|
||||||
|
|
||||||
We use :py:mod:`asyncio` for HTTP/2 server classes, and ALPN.
|
|
||||||
Therefore, Python 3.8 or later is required to use these objects.
|
|
||||||
To explicitly configure nghttp2 build to use Python 3.8, specify
|
|
||||||
the ``PYTHON`` variable to the path to Python 3.8 executable when
|
|
||||||
invoking configure script like this:
|
|
||||||
|
|
||||||
.. code-block:: text
|
|
||||||
|
|
||||||
$ ./configure PYTHON=/usr/bin/python3.8
|
|
||||||
|
|
||||||
.. py:class:: HTTP2Server(address, RequestHandlerClass, ssl=None)
|
|
||||||
|
|
||||||
This class builds on top of the :py:mod:`asyncio` event loop. On
|
|
||||||
construction, *RequestHandlerClass* must be given, which must be a
|
|
||||||
subclass of :py:class:`BaseRequestHandler` class.
|
|
||||||
|
|
||||||
The *address* must be a tuple of hostname/IP address and port to
|
|
||||||
bind. If hostname/IP address is ``None``, all interfaces are
|
|
||||||
assumed.
|
|
||||||
|
|
||||||
To enable SSL/TLS, specify instance of :py:class:`ssl.SSLContext`
|
|
||||||
in *ssl*. Before passing *ssl* to
|
|
||||||
:py:func:`BaseEventLoop.create_server`, ALPN protocol identifiers
|
|
||||||
are set using :py:meth:`ssl.SSLContext.set_npn_protocols`.
|
|
||||||
|
|
||||||
To disable SSL/TLS, omit *ssl* or specify ``None``.
|
|
||||||
|
|
||||||
.. py:method:: serve_forever()
|
|
||||||
|
|
||||||
Runs server and processes incoming requests forever.
|
|
||||||
|
|
||||||
.. py:class:: BaseRequestHandler(http2, stream_id)
|
|
||||||
|
|
||||||
The class is used to handle the single HTTP/2 stream. By default,
|
|
||||||
it does not nothing. It must be subclassed to handle each event
|
|
||||||
callback method.
|
|
||||||
|
|
||||||
The first callback method invoked is :py:meth:`on_headers()`. It is
|
|
||||||
called when HEADERS frame, which includes request header fields, is
|
|
||||||
arrived.
|
|
||||||
|
|
||||||
If request has request body, :py:meth:`on_data()` is invoked for
|
|
||||||
each chunk of received data chunk.
|
|
||||||
|
|
||||||
When whole request is received, :py:meth:`on_request_done()` is
|
|
||||||
invoked.
|
|
||||||
|
|
||||||
When stream is closed, :py:meth:`on_close()` is called.
|
|
||||||
|
|
||||||
The application can send response using :py:meth:`send_response()`
|
|
||||||
method. It can be used in :py:meth:`on_headers()`,
|
|
||||||
:py:meth:`on_data()` or :py:meth:`on_request_done()`.
|
|
||||||
|
|
||||||
The application can push resource using :py:meth:`push()` method.
|
|
||||||
It must be used before :py:meth:`send_response()` call.
|
|
||||||
|
|
||||||
A :py:class:`BaseRequestHandler` has the following instance
|
|
||||||
variables:
|
|
||||||
|
|
||||||
.. py:attribute:: client_address
|
|
||||||
|
|
||||||
Contains a tuple of the form ``(host, port)`` referring to the
|
|
||||||
client's address.
|
|
||||||
|
|
||||||
.. py:attribute:: stream_id
|
|
||||||
|
|
||||||
Stream ID of this stream
|
|
||||||
|
|
||||||
.. py:attribute:: scheme
|
|
||||||
|
|
||||||
Scheme of the request URI. This is a value of ``:scheme``
|
|
||||||
header field.
|
|
||||||
|
|
||||||
.. py:attribute:: method
|
|
||||||
|
|
||||||
Method of this stream. This is a value of ``:method`` header
|
|
||||||
field.
|
|
||||||
|
|
||||||
.. py:attribute:: host
|
|
||||||
|
|
||||||
This is a value of ``:authority`` or ``host`` header field.
|
|
||||||
|
|
||||||
.. py:attribute:: path
|
|
||||||
|
|
||||||
This is a value of ``:path`` header field.
|
|
||||||
|
|
||||||
.. py:attribute:: headers
|
|
||||||
|
|
||||||
Request header fields.
|
|
||||||
|
|
||||||
A :py:class:`BaseRequestHandler` has the following methods:
|
|
||||||
|
|
||||||
.. py:method:: on_headers()
|
|
||||||
|
|
||||||
Called when request HEADERS is arrived. By default, this method
|
|
||||||
does nothing.
|
|
||||||
|
|
||||||
.. py:method:: on_data(data)
|
|
||||||
|
|
||||||
Called when a chunk of request body *data* is arrived. This
|
|
||||||
method will be called multiple times until all data are
|
|
||||||
received. By default, this method does nothing.
|
|
||||||
|
|
||||||
.. py:method:: on_request_done()
|
|
||||||
|
|
||||||
Called when whole request was received. By default, this method
|
|
||||||
does nothing.
|
|
||||||
|
|
||||||
.. py:method:: on_close(error_code)
|
|
||||||
|
|
||||||
Called when stream is about to close. The *error_code*
|
|
||||||
indicates the reason of closure. If it is ``0``, the stream is
|
|
||||||
going to close without error.
|
|
||||||
|
|
||||||
.. py:method:: send_response(status=200, headers=None, body=None)
|
|
||||||
|
|
||||||
Send response. The *status* is HTTP status code. The *headers*
|
|
||||||
is additional response headers. The *:status* header field will
|
|
||||||
be appended by the library. The *body* is the response body.
|
|
||||||
It could be ``None`` if response body is empty. Or it must be
|
|
||||||
instance of either ``str``, ``bytes``, :py:class:`io.IOBase` or
|
|
||||||
callable, called body generator, which takes one parameter,
|
|
||||||
size. The body generator generates response body. It can pause
|
|
||||||
generation of response so that it can wait for slow backend data
|
|
||||||
generation. When invoked, it should return tuple, byte string
|
|
||||||
at most size length and flag. The flag is either
|
|
||||||
:py:data:`DATA_OK`, :py:data:`DATA_EOF` or
|
|
||||||
:py:data:`DATA_DEFERRED`. For non-empty byte string and it is
|
|
||||||
not the last chunk of response, :py:data:`DATA_OK` must be
|
|
||||||
returned as flag. If this is the last chunk of the response
|
|
||||||
(byte string could be ``None``), :py:data:`DATA_EOF` must be
|
|
||||||
returned as flag. If there is no data available right now, but
|
|
||||||
additional data are anticipated, return tuple (``None``,
|
|
||||||
:py:data:`DATA_DEFERRED`). When data arrived, call
|
|
||||||
:py:meth:`resume()` and restart response body transmission.
|
|
||||||
|
|
||||||
Only the body generator can pause response body generation;
|
|
||||||
instance of :py:class:`io.IOBase` must not block.
|
|
||||||
|
|
||||||
If instance of ``str`` is specified as *body*, it will be
|
|
||||||
encoded using UTF-8.
|
|
||||||
|
|
||||||
The *headers* is a list of tuple of the form ``(name,
|
|
||||||
value)``. The ``name`` and ``value`` can be either byte string
|
|
||||||
or unicode string. In the latter case, they will be encoded
|
|
||||||
using UTF-8.
|
|
||||||
|
|
||||||
Raises the exception if any error occurs.
|
|
||||||
|
|
||||||
.. py:method:: push(path, method='GET', request_headers=None, status=200, headers=None, body=None)
|
|
||||||
|
|
||||||
Push a specified resource. The *path* is a path portion of
|
|
||||||
request URI for this resource. The *method* is a method to
|
|
||||||
access this resource. The *request_headers* is additional
|
|
||||||
request headers to access this resource. The ``:scheme``,
|
|
||||||
``:method``, ``:authority`` and ``:path`` are appended by the
|
|
||||||
library. The ``:scheme`` and ``:authority`` are inherited from
|
|
||||||
request header fields of the associated stream.
|
|
||||||
|
|
||||||
The *status* is HTTP status code. The *headers* is additional
|
|
||||||
response headers. The ``:status`` header field is appended by
|
|
||||||
the library. The *body* is the response body. It has the same
|
|
||||||
semantics of *body* parameter of :py:meth:`send_response()`.
|
|
||||||
|
|
||||||
The headers and request_headers are a list of tuple of the form
|
|
||||||
``(name, value)``. The ``name`` and ``value`` can be either byte
|
|
||||||
string or unicode string. In the latter case, they will be
|
|
||||||
encoded using UTF-8.
|
|
||||||
|
|
||||||
Returns an instance of ``RequestHandlerClass`` specified in
|
|
||||||
:py:class:`HTTP2Server` constructor for the pushed resource.
|
|
||||||
|
|
||||||
Raises the exception if any error occurs.
|
|
||||||
|
|
||||||
.. py:method:: resume()
|
|
||||||
|
|
||||||
Signals the restarting of response body transmission paused by
|
|
||||||
``DATA_DEFERRED`` from the body generator (see
|
|
||||||
:py:meth:`send_response()` about the body generator). It is not
|
|
||||||
an error calling this method while response body transmission is
|
|
||||||
not paused.
|
|
||||||
|
|
||||||
.. py:data:: DATA_OK
|
|
||||||
|
|
||||||
``DATA_OK`` indicates non empty data is generated from body generator.
|
|
||||||
|
|
||||||
.. py:data:: DATA_EOF
|
|
||||||
|
|
||||||
``DATA_EOF`` indicates the end of response body.
|
|
||||||
|
|
||||||
.. py:data:: DATA_DEFERRED
|
|
||||||
|
|
||||||
``DATA_DEFERRED`` indicates that data are not available right now
|
|
||||||
and response should be paused.
|
|
||||||
|
|
||||||
The following example illustrates :py:class:`HTTP2Server` and
|
|
||||||
:py:class:`BaseRequestHandler` usage:
|
|
||||||
|
|
||||||
.. code-block:: python
|
|
||||||
|
|
||||||
#!/usr/bin/env python3
|
|
||||||
|
|
||||||
import io, ssl
|
|
||||||
|
|
||||||
import nghttp2
|
|
||||||
|
|
||||||
class Handler(nghttp2.BaseRequestHandler):
|
|
||||||
|
|
||||||
def on_headers(self):
|
|
||||||
self.push(path='/css/style.css',
|
|
||||||
request_headers = [('content-type', 'text/css')],
|
|
||||||
status=200,
|
|
||||||
body='body{margin:0;}')
|
|
||||||
|
|
||||||
self.send_response(status=200,
|
|
||||||
headers = [('content-type', 'text/plain')],
|
|
||||||
body=io.BytesIO(b'nghttp2-python FTW'))
|
|
||||||
|
|
||||||
ctx = ssl.SSLContext(ssl.PROTOCOL_SSLv23)
|
|
||||||
ctx.options = ssl.OP_ALL | ssl.OP_NO_SSLv2 | ssl.OP_NO_SSLv3
|
|
||||||
ctx.load_cert_chain('server.crt', 'server.key')
|
|
||||||
|
|
||||||
# give None to ssl to make the server non-SSL/TLS
|
|
||||||
server = nghttp2.HTTP2Server(('127.0.0.1', 8443), Handler, ssl=ctx)
|
|
||||||
server.serve_forever()
|
|
||||||
|
|
||||||
The following example illustrates HTTP/2 server using asynchronous
|
|
||||||
response body generation. This is simplified reverse proxy:
|
|
||||||
|
|
||||||
.. code-block:: python
|
|
||||||
|
|
||||||
#!/usr/bin/env python3
|
|
||||||
|
|
||||||
import ssl
|
|
||||||
import os
|
|
||||||
import urllib
|
|
||||||
import asyncio
|
|
||||||
import io
|
|
||||||
|
|
||||||
import nghttp2
|
|
||||||
|
|
||||||
@asyncio.coroutine
|
|
||||||
def get_http_header(handler, url):
|
|
||||||
url = urllib.parse.urlsplit(url)
|
|
||||||
ssl = url.scheme == 'https'
|
|
||||||
if url.port == None:
|
|
||||||
if url.scheme == 'https':
|
|
||||||
port = 443
|
|
||||||
else:
|
|
||||||
port = 80
|
|
||||||
else:
|
|
||||||
port = url.port
|
|
||||||
|
|
||||||
connect = asyncio.open_connection(url.hostname, port, ssl=ssl)
|
|
||||||
reader, writer = yield from connect
|
|
||||||
req = 'GET {path} HTTP/1.0\r\n\r\n'.format(path=url.path or '/')
|
|
||||||
writer.write(req.encode('utf-8'))
|
|
||||||
# skip response header fields
|
|
||||||
while True:
|
|
||||||
line = yield from reader.readline()
|
|
||||||
line = line.rstrip()
|
|
||||||
if not line:
|
|
||||||
break
|
|
||||||
# read body
|
|
||||||
while True:
|
|
||||||
b = yield from reader.read(4096)
|
|
||||||
if not b:
|
|
||||||
break
|
|
||||||
handler.buf.write(b)
|
|
||||||
writer.close()
|
|
||||||
handler.buf.seek(0)
|
|
||||||
handler.eof = True
|
|
||||||
handler.resume()
|
|
||||||
|
|
||||||
class Body:
|
|
||||||
def __init__(self, handler):
|
|
||||||
self.handler = handler
|
|
||||||
self.handler.eof = False
|
|
||||||
self.handler.buf = io.BytesIO()
|
|
||||||
|
|
||||||
def generate(self, n):
|
|
||||||
buf = self.handler.buf
|
|
||||||
data = buf.read1(n)
|
|
||||||
if not data and not self.handler.eof:
|
|
||||||
return None, nghttp2.DATA_DEFERRED
|
|
||||||
return data, nghttp2.DATA_EOF if self.handler.eof else nghttp2.DATA_OK
|
|
||||||
|
|
||||||
class Handler(nghttp2.BaseRequestHandler):
|
|
||||||
|
|
||||||
def on_headers(self):
|
|
||||||
body = Body(self)
|
|
||||||
asyncio.async(get_http_header(
|
|
||||||
self, 'http://localhost' + self.path.decode('utf-8')))
|
|
||||||
self.send_response(status=200, body=body.generate)
|
|
||||||
|
|
||||||
ctx = ssl.SSLContext(ssl.PROTOCOL_SSLv23)
|
|
||||||
ctx.options = ssl.OP_ALL | ssl.OP_NO_SSLv2 | ssl.OP_NO_SSLv3
|
|
||||||
ctx.load_cert_chain('server.crt', 'server.key')
|
|
||||||
|
|
||||||
server = nghttp2.HTTP2Server(('127.0.0.1', 8443), Handler, ssl=ctx)
|
|
||||||
server.serve_forever()
|
|
|
@ -7,7 +7,7 @@ RUN apt-get update && \
|
||||||
zlib1g-dev libev-dev libjemalloc-dev ruby-dev libc-ares-dev bison \
|
zlib1g-dev libev-dev libjemalloc-dev ruby-dev libc-ares-dev bison \
|
||||||
libelf-dev
|
libelf-dev
|
||||||
|
|
||||||
RUN git clone --depth 1 -b openssl-3.0.0+quic https://github.com/quictls/openssl && \
|
RUN git clone --depth 1 -b OpenSSL_1_1_1s+quic https://github.com/quictls/openssl && \
|
||||||
cd openssl && \
|
cd openssl && \
|
||||||
./config --openssldir=/etc/ssl && \
|
./config --openssldir=/etc/ssl && \
|
||||||
make -j$(nproc) && \
|
make -j$(nproc) && \
|
||||||
|
@ -15,7 +15,7 @@ RUN git clone --depth 1 -b openssl-3.0.0+quic https://github.com/quictls/openssl
|
||||||
cd .. && \
|
cd .. && \
|
||||||
rm -rf openssl
|
rm -rf openssl
|
||||||
|
|
||||||
RUN git clone --depth 1 https://github.com/ngtcp2/nghttp3 && \
|
RUN git clone --depth 1 -b v0.8.0 https://github.com/ngtcp2/nghttp3 && \
|
||||||
cd nghttp3 && \
|
cd nghttp3 && \
|
||||||
autoreconf -i && \
|
autoreconf -i && \
|
||||||
./configure --enable-lib-only && \
|
./configure --enable-lib-only && \
|
||||||
|
@ -24,7 +24,7 @@ RUN git clone --depth 1 https://github.com/ngtcp2/nghttp3 && \
|
||||||
cd .. && \
|
cd .. && \
|
||||||
rm -rf nghttp3
|
rm -rf nghttp3
|
||||||
|
|
||||||
RUN git clone --depth 1 https://github.com/ngtcp2/ngtcp2 && \
|
RUN git clone --depth 1 -b v0.12.0 https://github.com/ngtcp2/ngtcp2 && \
|
||||||
cd ngtcp2 && \
|
cd ngtcp2 && \
|
||||||
autoreconf -i && \
|
autoreconf -i && \
|
||||||
./configure --enable-lib-only \
|
./configure --enable-lib-only \
|
||||||
|
@ -36,7 +36,7 @@ RUN git clone --depth 1 https://github.com/ngtcp2/ngtcp2 && \
|
||||||
cd .. && \
|
cd .. && \
|
||||||
rm -rf ngtcp2
|
rm -rf ngtcp2
|
||||||
|
|
||||||
RUN git clone --depth 1 -b v0.4.0 https://github.com/libbpf/libbpf && \
|
RUN git clone --depth 1 -b v1.0.1 https://github.com/libbpf/libbpf && \
|
||||||
cd libbpf && \
|
cd libbpf && \
|
||||||
PREFIX=/usr/local make -C src install && \
|
PREFIX=/usr/local make -C src install && \
|
||||||
cd .. && \
|
cd .. && \
|
||||||
|
@ -47,7 +47,7 @@ RUN git clone --depth 1 https://github.com/nghttp2/nghttp2.git && \
|
||||||
git submodule update --init && \
|
git submodule update --init && \
|
||||||
autoreconf -i && \
|
autoreconf -i && \
|
||||||
./configure --disable-examples --disable-hpack-tools \
|
./configure --disable-examples --disable-hpack-tools \
|
||||||
--disable-python-bindings --with-mruby --with-neverbleed \
|
--with-mruby --with-neverbleed \
|
||||||
--enable-http3 --with-libbpf \
|
--enable-http3 --with-libbpf \
|
||||||
CC=clang CXX=clang++ \
|
CC=clang CXX=clang++ \
|
||||||
LIBTOOL_LDFLAGS="-static-libtool-libs" \
|
LIBTOOL_LDFLAGS="-static-libtool-libs" \
|
||||||
|
@ -65,6 +65,9 @@ RUN git clone --depth 1 https://github.com/nghttp2/nghttp2.git && \
|
||||||
|
|
||||||
FROM gcr.io/distroless/base-debian11
|
FROM gcr.io/distroless/base-debian11
|
||||||
|
|
||||||
|
COPY --from=build \
|
||||||
|
/usr/local/share/nghttp2/ \
|
||||||
|
/usr/local/share/nghttp2/
|
||||||
COPY --from=build \
|
COPY --from=build \
|
||||||
/usr/local/bin/h2load \
|
/usr/local/bin/h2load \
|
||||||
/usr/local/bin/nghttpx \
|
/usr/local/bin/nghttpx \
|
||||||
|
|
|
@ -12,14 +12,14 @@ These applications are:
|
||||||
HTTP/3 and eBPF features are enabled.
|
HTTP/3 and eBPF features are enabled.
|
||||||
|
|
||||||
In order to run nghttpx with HTTP/3 endpoint, you need to run the
|
In order to run nghttpx with HTTP/3 endpoint, you need to run the
|
||||||
image with the escalated privilege and higher memlock value. Here is
|
image with the escalated privilege. Here is the example command-line
|
||||||
the example command-line to run nghttpx to listen to HTTP/3 on port
|
to run nghttpx to listen to HTTP/3 on port 443, assuming that the
|
||||||
443, assuming that the current directory contains a private key and a
|
current directory contains a private key and a certificate in
|
||||||
certificate in server.key and server.crt respectively :
|
server.key and server.crt respectively:
|
||||||
|
|
||||||
.. code-block:: text
|
.. code-block:: text
|
||||||
|
|
||||||
$ docker run --rm -it -v $PWD:/shared --net=host --privileged \
|
$ docker run --rm -it -v /path/to/certs:/shared --net=host --privileged \
|
||||||
--ulimit memlock=2048000 nghttp2 nghttpx \
|
nghttp2 nghttpx \
|
||||||
/shared/server.key /shared/server.crt \
|
/shared/server.key /shared/server.crt \
|
||||||
-f'*,443;quic'
|
-f'*,443;quic'
|
||||||
|
|
|
@ -3,7 +3,3 @@ libevent-client
|
||||||
libevent-server
|
libevent-server
|
||||||
deflate
|
deflate
|
||||||
tiny-nghttpd
|
tiny-nghttpd
|
||||||
asio-sv
|
|
||||||
asio-sv2
|
|
||||||
asio-cl
|
|
||||||
asio-cl2
|
|
||||||
|
|
|
@ -34,24 +34,4 @@ if(ENABLE_EXAMPLES)
|
||||||
add_executable(deflate deflate.c $<TARGET_OBJECTS:llhttp>
|
add_executable(deflate deflate.c $<TARGET_OBJECTS:llhttp>
|
||||||
$<TARGET_OBJECTS:url-parser>
|
$<TARGET_OBJECTS:url-parser>
|
||||||
)
|
)
|
||||||
|
|
||||||
if(ENABLE_ASIO_LIB)
|
|
||||||
foreach(name asio-sv asio-sv2 asio-cl asio-cl2)
|
|
||||||
add_executable(${name} ${name}.cc $<TARGET_OBJECTS:llhttp>
|
|
||||||
$<TARGET_OBJECTS:url-parser>
|
|
||||||
)
|
|
||||||
target_include_directories(${name} PRIVATE
|
|
||||||
${OPENSSL_INCLUDE_DIRS}
|
|
||||||
${Boost_INCLUDE_DIRS}
|
|
||||||
)
|
|
||||||
target_link_libraries(${name}
|
|
||||||
nghttp2
|
|
||||||
nghttp2_asio
|
|
||||||
${JEMALLOC_LIBRARIES}
|
|
||||||
${OPENSSL_LIBRARIES}
|
|
||||||
${Boost_LIBRARIES}
|
|
||||||
${APP_LIBRARIES}
|
|
||||||
)
|
|
||||||
endforeach()
|
|
||||||
endif()
|
|
||||||
endif()
|
endif()
|
||||||
|
|
|
@ -30,7 +30,6 @@ AM_CXXFLAGS = $(WARNCXXFLAGS) $(CXX1XCXXFLAGS)
|
||||||
AM_CPPFLAGS = \
|
AM_CPPFLAGS = \
|
||||||
-I$(top_srcdir)/lib/includes \
|
-I$(top_srcdir)/lib/includes \
|
||||||
-I$(top_builddir)/lib/includes \
|
-I$(top_builddir)/lib/includes \
|
||||||
-I$(top_srcdir)/src/includes \
|
|
||||||
-I$(top_srcdir)/third-party \
|
-I$(top_srcdir)/third-party \
|
||||||
@LIBEVENT_OPENSSL_CFLAGS@ \
|
@LIBEVENT_OPENSSL_CFLAGS@ \
|
||||||
@OPENSSL_CFLAGS@ \
|
@OPENSSL_CFLAGS@ \
|
||||||
|
@ -52,40 +51,4 @@ libevent_server_SOURCES = libevent-server.c
|
||||||
|
|
||||||
deflate_SOURCES = deflate.c
|
deflate_SOURCES = deflate.c
|
||||||
|
|
||||||
if ENABLE_ASIO_LIB
|
|
||||||
|
|
||||||
noinst_PROGRAMS += asio-sv asio-sv2 asio-cl asio-cl2
|
|
||||||
|
|
||||||
# AM_CPPFLAGS must be placed first, so that header file (e.g.,
|
|
||||||
# nghttp2/nghttp2.h) in this package is used rather than installed
|
|
||||||
# one.
|
|
||||||
ASIOCPPFLAGS = ${AM_CPPFLAGS} ${BOOST_CPPFLAGS}
|
|
||||||
ASIOLDADD = $(top_builddir)/lib/libnghttp2.la \
|
|
||||||
$(top_builddir)/src/libnghttp2_asio.la @JEMALLOC_LIBS@ \
|
|
||||||
$(top_builddir)/third-party/liburl-parser.la \
|
|
||||||
@OPENSSL_LIBS@ \
|
|
||||||
${BOOST_LDFLAGS} \
|
|
||||||
${BOOST_ASIO_LIB} \
|
|
||||||
${BOOST_THREAD_LIB} \
|
|
||||||
${BOOST_SYSTEM_LIB} \
|
|
||||||
@APPLDFLAGS@
|
|
||||||
|
|
||||||
asio_sv_SOURCES = asio-sv.cc
|
|
||||||
asio_sv_CPPFLAGS = ${ASIOCPPFLAGS}
|
|
||||||
asio_sv_LDADD = ${ASIOLDADD}
|
|
||||||
|
|
||||||
asio_sv2_SOURCES = asio-sv2.cc
|
|
||||||
asio_sv2_CPPFLAGS = ${ASIOCPPFLAGS}
|
|
||||||
asio_sv2_LDADD = ${ASIOLDADD}
|
|
||||||
|
|
||||||
asio_cl_SOURCES = asio-cl.cc
|
|
||||||
asio_cl_CPPFLAGS = ${ASIOCPPFLAGS}
|
|
||||||
asio_cl_LDADD = ${ASIOLDADD}
|
|
||||||
|
|
||||||
asio_cl2_SOURCES = asio-cl2.cc
|
|
||||||
asio_cl2_CPPFLAGS = ${ASIOCPPFLAGS}
|
|
||||||
asio_cl2_LDADD = ${ASIOLDADD}
|
|
||||||
|
|
||||||
endif # ENABLE_ASIO_LIB
|
|
||||||
|
|
||||||
endif # ENABLE_EXAMPLES
|
endif # ENABLE_EXAMPLES
|
||||||
|
|
|
@ -1,96 +0,0 @@
|
||||||
/*
|
|
||||||
* nghttp2 - HTTP/2 C Library
|
|
||||||
*
|
|
||||||
* Copyright (c) 2015 Tatsuhiro Tsujikawa
|
|
||||||
*
|
|
||||||
* 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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <iostream>
|
|
||||||
|
|
||||||
#include <nghttp2/asio_http2_client.h>
|
|
||||||
|
|
||||||
using boost::asio::ip::tcp;
|
|
||||||
|
|
||||||
using namespace nghttp2::asio_http2;
|
|
||||||
using namespace nghttp2::asio_http2::client;
|
|
||||||
|
|
||||||
int main(int argc, char *argv[]) {
|
|
||||||
try {
|
|
||||||
if (argc < 2) {
|
|
||||||
std::cerr << "Usage: asio-cl URI" << std::endl;
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
boost::system::error_code ec;
|
|
||||||
boost::asio::io_service io_service;
|
|
||||||
|
|
||||||
std::string uri = argv[1];
|
|
||||||
std::string scheme, host, service;
|
|
||||||
|
|
||||||
if (host_service_from_uri(ec, scheme, host, service, uri)) {
|
|
||||||
std::cerr << "error: bad URI: " << ec.message() << std::endl;
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
boost::asio::ssl::context tls_ctx(boost::asio::ssl::context::sslv23);
|
|
||||||
tls_ctx.set_default_verify_paths();
|
|
||||||
// disabled to make development easier...
|
|
||||||
// tls_ctx.set_verify_mode(boost::asio::ssl::verify_peer);
|
|
||||||
configure_tls_context(ec, tls_ctx);
|
|
||||||
|
|
||||||
auto sess = scheme == "https" ? session(io_service, tls_ctx, host, service)
|
|
||||||
: session(io_service, host, service);
|
|
||||||
|
|
||||||
sess.on_connect([&sess, &uri](tcp::resolver::iterator endpoint_it) {
|
|
||||||
boost::system::error_code ec;
|
|
||||||
auto req = sess.submit(ec, "GET", uri);
|
|
||||||
|
|
||||||
if (ec) {
|
|
||||||
std::cerr << "error: " << ec.message() << std::endl;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
req->on_response([](const response &res) {
|
|
||||||
std::cerr << "HTTP/2 " << res.status_code() << std::endl;
|
|
||||||
for (auto &kv : res.header()) {
|
|
||||||
std::cerr << kv.first << ": " << kv.second.value << "\n";
|
|
||||||
}
|
|
||||||
std::cerr << std::endl;
|
|
||||||
|
|
||||||
res.on_data([](const uint8_t *data, std::size_t len) {
|
|
||||||
std::cerr.write(reinterpret_cast<const char *>(data), len);
|
|
||||||
std::cerr << std::endl;
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
req->on_close([&sess](uint32_t error_code) { sess.shutdown(); });
|
|
||||||
});
|
|
||||||
|
|
||||||
sess.on_error([](const boost::system::error_code &ec) {
|
|
||||||
std::cerr << "error: " << ec.message() << std::endl;
|
|
||||||
});
|
|
||||||
|
|
||||||
io_service.run();
|
|
||||||
} catch (std::exception &e) {
|
|
||||||
std::cerr << "exception: " << e.what() << "\n";
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
|
@ -1,134 +0,0 @@
|
||||||
/*
|
|
||||||
* nghttp2 - HTTP/2 C Library
|
|
||||||
*
|
|
||||||
* Copyright (c) 2015 Tatsuhiro Tsujikawa
|
|
||||||
*
|
|
||||||
* 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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <iostream>
|
|
||||||
#include <string>
|
|
||||||
|
|
||||||
#include <nghttp2/asio_http2_client.h>
|
|
||||||
|
|
||||||
using boost::asio::ip::tcp;
|
|
||||||
|
|
||||||
using namespace nghttp2::asio_http2;
|
|
||||||
using namespace nghttp2::asio_http2::client;
|
|
||||||
|
|
||||||
void print_header(const header_map &h) {
|
|
||||||
for (auto &kv : h) {
|
|
||||||
std::cerr << kv.first << ": " << kv.second.value << "\n";
|
|
||||||
}
|
|
||||||
std::cerr << std::endl;
|
|
||||||
}
|
|
||||||
|
|
||||||
void print_header(const response &res) {
|
|
||||||
std::cerr << "HTTP/2 " << res.status_code() << "\n";
|
|
||||||
print_header(res.header());
|
|
||||||
}
|
|
||||||
|
|
||||||
void print_header(const request &req) {
|
|
||||||
auto &uri = req.uri();
|
|
||||||
std::cerr << req.method() << " " << uri.scheme << "://" << uri.host
|
|
||||||
<< uri.path;
|
|
||||||
if (!uri.raw_query.empty()) {
|
|
||||||
std::cerr << "?" << uri.raw_query;
|
|
||||||
}
|
|
||||||
std::cerr << " HTTP/2\n";
|
|
||||||
print_header(req.header());
|
|
||||||
}
|
|
||||||
|
|
||||||
int main(int argc, char *argv[]) {
|
|
||||||
try {
|
|
||||||
if (argc < 2) {
|
|
||||||
std::cerr << "Usage: asio-cl URI" << std::endl;
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
boost::system::error_code ec;
|
|
||||||
boost::asio::io_service io_service;
|
|
||||||
|
|
||||||
std::string uri = argv[1];
|
|
||||||
std::string scheme, host, service;
|
|
||||||
|
|
||||||
if (host_service_from_uri(ec, scheme, host, service, uri)) {
|
|
||||||
std::cerr << "error: bad URI: " << ec.message() << std::endl;
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
boost::asio::ssl::context tls_ctx(boost::asio::ssl::context::sslv23);
|
|
||||||
tls_ctx.set_default_verify_paths();
|
|
||||||
// disabled to make development easier...
|
|
||||||
// tls_ctx.set_verify_mode(boost::asio::ssl::verify_peer);
|
|
||||||
configure_tls_context(ec, tls_ctx);
|
|
||||||
|
|
||||||
auto sess = scheme == "https" ? session(io_service, tls_ctx, host, service)
|
|
||||||
: session(io_service, host, service);
|
|
||||||
|
|
||||||
sess.on_connect([&sess, &uri](tcp::resolver::iterator endpoint_it) {
|
|
||||||
std::cerr << "connected to " << (*endpoint_it).endpoint() << std::endl;
|
|
||||||
boost::system::error_code ec;
|
|
||||||
auto req = sess.submit(ec, "GET", uri, {{"cookie", {"foo=bar", true}}});
|
|
||||||
if (ec) {
|
|
||||||
std::cerr << "error: " << ec.message() << std::endl;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
req->on_response([](const response &res) {
|
|
||||||
std::cerr << "response header was received" << std::endl;
|
|
||||||
print_header(res);
|
|
||||||
|
|
||||||
res.on_data([](const uint8_t *data, std::size_t len) {
|
|
||||||
std::cerr.write(reinterpret_cast<const char *>(data), len);
|
|
||||||
std::cerr << std::endl;
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
req->on_close([](uint32_t error_code) {
|
|
||||||
std::cerr << "request done with error_code=" << error_code << std::endl;
|
|
||||||
});
|
|
||||||
|
|
||||||
req->on_push([](const request &push_req) {
|
|
||||||
std::cerr << "push request was received" << std::endl;
|
|
||||||
|
|
||||||
print_header(push_req);
|
|
||||||
|
|
||||||
push_req.on_response([](const response &res) {
|
|
||||||
std::cerr << "push response header was received" << std::endl;
|
|
||||||
|
|
||||||
res.on_data([](const uint8_t *data, std::size_t len) {
|
|
||||||
std::cerr.write(reinterpret_cast<const char *>(data), len);
|
|
||||||
std::cerr << std::endl;
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
sess.on_error([](const boost::system::error_code &ec) {
|
|
||||||
std::cerr << "error: " << ec.message() << std::endl;
|
|
||||||
});
|
|
||||||
|
|
||||||
io_service.run();
|
|
||||||
} catch (std::exception &e) {
|
|
||||||
std::cerr << "exception: " << e.what() << "\n";
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
|
@ -1,149 +0,0 @@
|
||||||
/*
|
|
||||||
* nghttp2 - HTTP/2 C Library
|
|
||||||
*
|
|
||||||
* Copyright (c) 2014 Tatsuhiro Tsujikawa
|
|
||||||
*
|
|
||||||
* 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.
|
|
||||||
*/
|
|
||||||
// We wrote this code based on the original code which has the
|
|
||||||
// following license:
|
|
||||||
//
|
|
||||||
// main.cpp
|
|
||||||
// ~~~~~~~~
|
|
||||||
//
|
|
||||||
// Copyright (c) 2003-2013 Christopher M. Kohlhoff (chris at kohlhoff dot com)
|
|
||||||
//
|
|
||||||
// Distributed under the Boost Software License, Version 1.0. (See accompanying
|
|
||||||
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
|
||||||
//
|
|
||||||
|
|
||||||
#include <iostream>
|
|
||||||
#include <string>
|
|
||||||
|
|
||||||
#include <nghttp2/asio_http2_server.h>
|
|
||||||
|
|
||||||
using namespace nghttp2::asio_http2;
|
|
||||||
using namespace nghttp2::asio_http2::server;
|
|
||||||
|
|
||||||
int main(int argc, char *argv[]) {
|
|
||||||
try {
|
|
||||||
// Check command line arguments.
|
|
||||||
if (argc < 4) {
|
|
||||||
std::cerr
|
|
||||||
<< "Usage: asio-sv <address> <port> <threads> [<private-key-file> "
|
|
||||||
<< "<cert-file>]\n";
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
boost::system::error_code ec;
|
|
||||||
|
|
||||||
std::string addr = argv[1];
|
|
||||||
std::string port = argv[2];
|
|
||||||
std::size_t num_threads = std::stoi(argv[3]);
|
|
||||||
|
|
||||||
http2 server;
|
|
||||||
|
|
||||||
server.num_threads(num_threads);
|
|
||||||
|
|
||||||
server.handle("/", [](const request &req, const response &res) {
|
|
||||||
res.write_head(200, {{"foo", {"bar"}}});
|
|
||||||
res.end("hello, world\n");
|
|
||||||
});
|
|
||||||
server.handle("/secret/", [](const request &req, const response &res) {
|
|
||||||
res.write_head(200);
|
|
||||||
res.end("under construction!\n");
|
|
||||||
});
|
|
||||||
server.handle("/push", [](const request &req, const response &res) {
|
|
||||||
boost::system::error_code ec;
|
|
||||||
auto push = res.push(ec, "GET", "/push/1");
|
|
||||||
if (!ec) {
|
|
||||||
push->write_head(200);
|
|
||||||
push->end("server push FTW!\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
res.write_head(200);
|
|
||||||
res.end("you'll receive server push!\n");
|
|
||||||
});
|
|
||||||
server.handle("/delay", [](const request &req, const response &res) {
|
|
||||||
res.write_head(200);
|
|
||||||
|
|
||||||
auto timer = std::make_shared<boost::asio::deadline_timer>(
|
|
||||||
res.io_service(), boost::posix_time::seconds(3));
|
|
||||||
auto closed = std::make_shared<bool>();
|
|
||||||
|
|
||||||
res.on_close([timer, closed](uint32_t error_code) {
|
|
||||||
timer->cancel();
|
|
||||||
*closed = true;
|
|
||||||
});
|
|
||||||
|
|
||||||
timer->async_wait([&res, closed](const boost::system::error_code &ec) {
|
|
||||||
if (ec || *closed) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
res.end("finally!\n");
|
|
||||||
});
|
|
||||||
});
|
|
||||||
server.handle("/trailer", [](const request &req, const response &res) {
|
|
||||||
// send trailer part.
|
|
||||||
res.write_head(200, {{"trailers", {"digest"}}});
|
|
||||||
|
|
||||||
std::string body = "nghttp2 FTW!\n";
|
|
||||||
auto left = std::make_shared<size_t>(body.size());
|
|
||||||
|
|
||||||
res.end([&res, body, left](uint8_t *dst, std::size_t len,
|
|
||||||
uint32_t *data_flags) {
|
|
||||||
auto n = std::min(len, *left);
|
|
||||||
std::copy_n(body.c_str() + (body.size() - *left), n, dst);
|
|
||||||
*left -= n;
|
|
||||||
if (*left == 0) {
|
|
||||||
*data_flags |=
|
|
||||||
NGHTTP2_DATA_FLAG_EOF | NGHTTP2_DATA_FLAG_NO_END_STREAM;
|
|
||||||
// RFC 3230 Instance Digests in HTTP. The digest value is
|
|
||||||
// SHA-256 message digest of body.
|
|
||||||
res.write_trailer(
|
|
||||||
{{"digest",
|
|
||||||
{"SHA-256=qqXqskW7F3ueBSvmZRCiSwl2ym4HRO0M/pvQCBlSDis="}}});
|
|
||||||
}
|
|
||||||
return n;
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
if (argc >= 6) {
|
|
||||||
boost::asio::ssl::context tls(boost::asio::ssl::context::sslv23);
|
|
||||||
tls.use_private_key_file(argv[4], boost::asio::ssl::context::pem);
|
|
||||||
tls.use_certificate_chain_file(argv[5]);
|
|
||||||
|
|
||||||
configure_tls_context_easy(ec, tls);
|
|
||||||
|
|
||||||
if (server.listen_and_serve(ec, tls, addr, port)) {
|
|
||||||
std::cerr << "error: " << ec.message() << std::endl;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if (server.listen_and_serve(ec, addr, port)) {
|
|
||||||
std::cerr << "error: " << ec.message() << std::endl;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} catch (std::exception &e) {
|
|
||||||
std::cerr << "exception: " << e.what() << "\n";
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
|
@ -1,125 +0,0 @@
|
||||||
/*
|
|
||||||
* nghttp2 - HTTP/2 C Library
|
|
||||||
*
|
|
||||||
* Copyright (c) 2014 Tatsuhiro Tsujikawa
|
|
||||||
*
|
|
||||||
* 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.
|
|
||||||
*/
|
|
||||||
// We wrote this code based on the original code which has the
|
|
||||||
// following license:
|
|
||||||
//
|
|
||||||
// main.cpp
|
|
||||||
// ~~~~~~~~
|
|
||||||
//
|
|
||||||
// Copyright (c) 2003-2013 Christopher M. Kohlhoff (chris at kohlhoff dot com)
|
|
||||||
//
|
|
||||||
// Distributed under the Boost Software License, Version 1.0. (See accompanying
|
|
||||||
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
|
||||||
//
|
|
||||||
#include <sys/types.h>
|
|
||||||
#include <sys/stat.h>
|
|
||||||
#ifdef HAVE_UNISTD_H
|
|
||||||
# include <unistd.h>
|
|
||||||
#endif // HAVE_UNISTD_H
|
|
||||||
#ifdef HAVE_FCNTL_H
|
|
||||||
# include <fcntl.h>
|
|
||||||
#endif // HAVE_FCNTL_H
|
|
||||||
#include <iostream>
|
|
||||||
#include <string>
|
|
||||||
|
|
||||||
#include <nghttp2/asio_http2_server.h>
|
|
||||||
|
|
||||||
using namespace nghttp2::asio_http2;
|
|
||||||
using namespace nghttp2::asio_http2::server;
|
|
||||||
|
|
||||||
int main(int argc, char *argv[]) {
|
|
||||||
try {
|
|
||||||
// Check command line arguments.
|
|
||||||
if (argc < 5) {
|
|
||||||
std::cerr << "Usage: asio-sv2 <address> <port> <threads> <doc-root> "
|
|
||||||
<< "[<private-key-file> <cert-file>]\n";
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
boost::system::error_code ec;
|
|
||||||
|
|
||||||
std::string addr = argv[1];
|
|
||||||
std::string port = argv[2];
|
|
||||||
std::size_t num_threads = std::stoi(argv[3]);
|
|
||||||
std::string docroot = argv[4];
|
|
||||||
|
|
||||||
http2 server;
|
|
||||||
|
|
||||||
server.num_threads(num_threads);
|
|
||||||
|
|
||||||
server.handle("/", [&docroot](const request &req, const response &res) {
|
|
||||||
auto path = percent_decode(req.uri().path);
|
|
||||||
if (!check_path(path)) {
|
|
||||||
res.write_head(404);
|
|
||||||
res.end();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (path == "/") {
|
|
||||||
path = "/index.html";
|
|
||||||
}
|
|
||||||
|
|
||||||
path = docroot + path;
|
|
||||||
auto fd = open(path.c_str(), O_RDONLY);
|
|
||||||
if (fd == -1) {
|
|
||||||
res.write_head(404);
|
|
||||||
res.end();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
auto header = header_map();
|
|
||||||
|
|
||||||
struct stat stbuf;
|
|
||||||
if (stat(path.c_str(), &stbuf) == 0) {
|
|
||||||
header.emplace("content-length",
|
|
||||||
header_value{std::to_string(stbuf.st_size)});
|
|
||||||
header.emplace("last-modified",
|
|
||||||
header_value{http_date(stbuf.st_mtime)});
|
|
||||||
}
|
|
||||||
res.write_head(200, std::move(header));
|
|
||||||
res.end(file_generator_from_fd(fd));
|
|
||||||
});
|
|
||||||
|
|
||||||
if (argc >= 7) {
|
|
||||||
boost::asio::ssl::context tls(boost::asio::ssl::context::sslv23);
|
|
||||||
tls.use_private_key_file(argv[5], boost::asio::ssl::context::pem);
|
|
||||||
tls.use_certificate_chain_file(argv[6]);
|
|
||||||
|
|
||||||
configure_tls_context_easy(ec, tls);
|
|
||||||
|
|
||||||
if (server.listen_and_serve(ec, tls, addr, port)) {
|
|
||||||
std::cerr << "error: " << ec.message() << std::endl;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if (server.listen_and_serve(ec, addr, port)) {
|
|
||||||
std::cerr << "error: " << ec.message() << std::endl;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} catch (std::exception &e) {
|
|
||||||
std::cerr << "exception: " << e.what() << "\n";
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue