mirror of
https://github.com/openresty/openresty.git
synced 2024-10-13 00:29:41 +00:00
Compare commits
909 Commits
Author | SHA1 | Date | |
---|---|---|---|
da90bd7671 | |||
4a80309873 | |||
383901b193 | |||
9bd838251f | |||
e5fd373848 | |||
db38504310 | |||
2351c7c7aa | |||
f3d36df365 | |||
220b940e66 | |||
c0c2f883e9 | |||
9cf02ba0c0 | |||
5760ca8dee | |||
e1b492fc18 | |||
cada794d74 | |||
ec162777c3 | |||
a9a8ebee7a | |||
ac4d52423c | |||
c0a85e7e3e | |||
c64ff34957 | |||
54b824d1f4 | |||
cdedd89613 | |||
8ebc5c5b16 | |||
e12c526577 | |||
a78f6e3741 | |||
62cc6b3758 | |||
e60f9030ab | |||
eb33b0b08f | |||
83eeb14f6c | |||
d996a90c14 | |||
584c1a7e12 | |||
3882d2572e | |||
ce64259d66 | |||
9b439dde0e | |||
ed8b6996e9 | |||
5fc5745de0 | |||
d55f45c7ff | |||
cba6fbd864 | |||
caea3438eb | |||
cde439a55a | |||
38abb277b5 | |||
1c106bf487 | |||
3cacb62a10 | |||
4374e25548 | |||
0e95be39c1 | |||
d68403407d | |||
f5329c7781 | |||
3ac11ef73c | |||
5db4e19482 | |||
fa3af6cdf8 | |||
828a7eec41 | |||
1f4045ef2c | |||
6a17d2c784 | |||
6624c48881 | |||
7f15701e76 | |||
1220e284aa | |||
d831e27995 | |||
033b2d88ff | |||
622ddd7bb0 | |||
3e94b37750 | |||
2d0119084e | |||
b19b53d6cc | |||
04da1876f0 | |||
e82486be60 | |||
f84e035e45 | |||
c02caa3587 | |||
24eed036c5 | |||
87c988e4ba | |||
46881fd2dc | |||
4907d14700 | |||
60e72cbf82 | |||
97a05513eb | |||
7d0443d5d7 | |||
ce65738299 | |||
2871ccb9ac | |||
aab5001ffc | |||
53952e347e | |||
19de4329b8 | |||
af48ac42d5 | |||
126786276b | |||
ffb5acf592 | |||
9bcdd4b62f | |||
b0a74456ba | |||
357bb4a977 | |||
3ddbf6f8d4 | |||
e1b680f985 | |||
389f3a8041 | |||
2d6112943f | |||
99d5e37f3b | |||
f57f48f6ce | |||
d332766a3f | |||
2e5d8d5179 | |||
9295450eb8 | |||
73db05ca54 | |||
a7f1816ba1 | |||
613241d40d | |||
fc386017f3 | |||
b1f99a6156 | |||
fec2e0249c | |||
d225abe6d1 | |||
5df64b4e63 | |||
78dd9dbc23 | |||
ca9a9824d5 | |||
42d53db5b9 | |||
441cee68b1 | |||
58c89f206d | |||
1f7f6a31b2 | |||
795f52d06c | |||
c01de73e41 | |||
387089ca11 | |||
d66f8b699f | |||
b75e8490c2 | |||
30c2d1bde6 | |||
dc2cd9b9e5 | |||
c04635fbd7 | |||
667802cee6 | |||
ee28a12949 | |||
99ca550104 | |||
6be51e769a | |||
6142b6936f | |||
86ba1e09f4 | |||
2519cd7dd3 | |||
3ae5c4d93e | |||
e82793361b | |||
55909727dd | |||
6b052c8fca | |||
fab852190b | |||
dc007ebcb9 | |||
f46cfc667d | |||
5f6a50cacc | |||
16d0b04e1c | |||
076f2bd45e | |||
b1a852b27e | |||
fdcdc15436 | |||
916245656b | |||
03b25469c8 | |||
b70fdea626 | |||
8a5b1bb328 | |||
47bf7e9349 | |||
3b6bfca045 | |||
11b10b4e7b | |||
a953967d88 | |||
ab169da35b | |||
b06e150af4 | |||
706823455a | |||
1d15d9e393 | |||
3d674b8635 | |||
94d38e3ff7 | |||
80bc3c3549 | |||
5cb6e4f591 | |||
b6d3a5cf7b | |||
46a5fd3bba | |||
c474f54723 | |||
f318ad5c7e | |||
065fb6db35 | |||
0aeef4f31a | |||
640108c6f5 | |||
445ca90f06 | |||
dde4c94fd0 | |||
6facf67420 | |||
8dae181c24 | |||
2a2c1269b0 | |||
b2cc655554 | |||
07913609c6 | |||
c7eea80684 | |||
9a26a0452d | |||
4fed7a2d05 | |||
e2a964d124 | |||
0bfb73764e | |||
85f9313252 | |||
cf8c075e79 | |||
bb71a30a68 | |||
af058d15db | |||
59e6665224 | |||
fae163cc70 | |||
fd1f99ff52 | |||
1140a2fa67 | |||
6f26127d9b | |||
96fc664875 | |||
f7e34420c0 | |||
399bdecaef | |||
aa33a9e752 | |||
c8b64f9fd4 | |||
1429569342 | |||
88f0bdb2ae | |||
526c35ce2f | |||
5b6c063ae7 | |||
34f66f5343 | |||
471940c09b | |||
c9c42f0fee | |||
1b20094c21 | |||
fed9b15524 | |||
51a7b54c60 | |||
a90eb927f5 | |||
8da3363507 | |||
9d3aa49228 | |||
1266a2933e | |||
e225c37731 | |||
b7f6be5a2f | |||
c23007bcce | |||
867328aa81 | |||
cd89141e48 | |||
43ae08a6c4 | |||
f26ae39115 | |||
cc4a307f0e | |||
315279079f | |||
6d854671b7 | |||
88500d7328 | |||
da19bb5a49 | |||
58b1cf3443 | |||
a485e40fb8 | |||
b92c497d19 | |||
e6985ae696 | |||
98d4b7ef1f | |||
b1f221b066 | |||
217b21e928 | |||
9b656b9c5e | |||
ee61517201 | |||
6eaf60aa1c | |||
3dfbe11054 | |||
185f8cacfa | |||
e4a932b5cb | |||
ca534abb8f | |||
bfc6b755b0 | |||
c08b4a0493 | |||
9e5299a0d2 | |||
b824a3cb59 | |||
6e41bcd018 | |||
62633cfa8d | |||
cd74a45f39 | |||
bc3cb9243f | |||
20ace16258 | |||
b54113f517 | |||
39407386ea | |||
f1f3ba8ec6 | |||
e37973502e | |||
4085b21eb8 | |||
91484d0e11 | |||
f5d5e5a2fa | |||
1e7d38d479 | |||
52e622a26c | |||
20e69718ce | |||
05334f1b5b | |||
91549c16b4 | |||
1dbd0b24d2 | |||
9c3a123035 | |||
2ee8fe558a | |||
6ab944ebc4 | |||
332a42f57f | |||
60bc64a72a | |||
e3b7de9b23 | |||
c2fb3c9dac | |||
84f0092a6c | |||
8cd9200a0f | |||
5d4854f3e9 | |||
b6661ea47c | |||
c9b0947bbb | |||
77104b6cdf | |||
e932c8a136 | |||
10fd3ea365 | |||
303601ef8c | |||
7f377fd354 | |||
fdad0c63ce | |||
b0f1e786c1 | |||
d001d17d0c | |||
37ba2b1015 | |||
d21cc33749 | |||
2ba03387fd | |||
03eae9e632 | |||
965bd0fba0 | |||
f8783f35b1 | |||
e36d505d80 | |||
3ddc73ac43 | |||
35934abdb1 | |||
5836469559 | |||
925156bb2b | |||
1a8bffaf7a | |||
df3547fccd | |||
3b078c75ae | |||
227e4e0da2 | |||
676150c81b | |||
5c14faf444 | |||
84f46c7be5 | |||
65367a71cd | |||
5e9a5cdc95 | |||
85d38c49a2 | |||
486b212269 | |||
c1fb5194ef | |||
87e5f34a9d | |||
e85568e044 | |||
d093c84c8e | |||
613d5ad058 | |||
0794f667d6 | |||
c9d9e4a8dd | |||
f830a55d2d | |||
2904556700 | |||
1c9f799fa6 | |||
9a3e9dbffd | |||
793c541c45 | |||
b7348233e8 | |||
6dc6ba72d5 | |||
1eb135cc6a | |||
4bab759ea3 | |||
8cec47f755 | |||
02614af5ed | |||
163432a678 | |||
c338e4d0e2 | |||
374f575dfa | |||
b53c539f7e | |||
a16a33d417 | |||
e3e60a3a68 | |||
71a675f4fb | |||
adb00e91e7 | |||
c6aad4deba | |||
b8bf7bbb4c | |||
0528788543 | |||
378f94fb58 | |||
5be3b51678 | |||
2fb9ed5c1d | |||
1728ca8c66 | |||
157febe350 | |||
633abb71bf | |||
8b86c72ea2 | |||
97622943d2 | |||
383ed9a47d | |||
bd81be02ee | |||
fa917e6620 | |||
b694456ef3 | |||
95d727fd8f | |||
a860e4192c | |||
68d1241d12 | |||
73201a29f7 | |||
6522b3420c | |||
360aaab086 | |||
78cca18fef | |||
a06c2308e1 | |||
d919948850 | |||
cd3b7f3bfb | |||
d846011a3e | |||
e4ff7dbfac | |||
f35f66a487 | |||
aac5d5e49e | |||
8bc4bf391a | |||
1df484be52 | |||
4308a5ca45 | |||
274b1b6778 | |||
2d3ff6af97 | |||
5f7b64e17a | |||
4513cad926 | |||
a7c39891c6 | |||
35e053cb6c | |||
ae74836236 | |||
b0d3505b31 | |||
9d2ae2e217 | |||
6bb19476b4 | |||
f0a2f6543e | |||
937985fc03 | |||
457d0526ea | |||
f0243eb2aa | |||
76a803640a | |||
5fe07d1df5 | |||
2c23a0859e | |||
8012da1f61 | |||
e0d777bb5d | |||
37737082dd | |||
5c77ae9d4a | |||
2d2132d232 | |||
559f187c3c | |||
609e375e66 | |||
e84b9d0175 | |||
221130defc | |||
921fd6d675 | |||
c36f990f10 | |||
b3ed109998 | |||
3d547529fd | |||
d0834f8cd9 | |||
5f2ede4fd2 | |||
0222649b03 | |||
320c5008e4 | |||
a4006329a7 | |||
2890410b68 | |||
197399d1b6 | |||
54f86fd361 | |||
110c8fe4ce | |||
a825570875 | |||
2bfd01ed14 | |||
49599affe9 | |||
96abf202e4 | |||
6f31d3b261 | |||
cee1aca97f | |||
b9325c34d8 | |||
a169416e71 | |||
cef62e1aa8 | |||
bb367bc9e6 | |||
3a7529d7d0 | |||
4cdd11476b | |||
c312ba38b3 | |||
5328f0113f | |||
b9eb443da6 | |||
72da5ad7ba | |||
ac3b864532 | |||
6c14ea5c56 | |||
b68ec13a71 | |||
76f2f6c2f3 | |||
a5c4d85835 | |||
24d8c2265e | |||
d9a491a88c | |||
6ce2a28c23 | |||
07fbdad118 | |||
ca9f8d0622 | |||
090060c907 | |||
b156d2db62 | |||
dbb9c98bee | |||
4c300f618d | |||
62bbc5c4c5 | |||
529f4c854c | |||
3a873d7874 | |||
aadd93ff24 | |||
bae91cc5c4 | |||
ea1d378e84 | |||
ed2f8de61a | |||
1d096c047e | |||
1bfc510257 | |||
9f0143b14f | |||
05ae54a092 | |||
09598a3e19 | |||
977c5b1d51 | |||
6063956a1a | |||
e91766c012 | |||
a2ed0a0403 | |||
8e57e2541b | |||
f5f2d672e7 | |||
49d9d9b778 | |||
13efb24106 | |||
3be0b7f0e1 | |||
5fb8647d23 | |||
e7053c9ca9 | |||
042e2fd27b | |||
1d909539a8 | |||
d54e2dcc69 | |||
009db177df | |||
7e359ff049 | |||
9f52ad4a45 | |||
a925be09c9 | |||
d91993fc38 | |||
0a9a7012dc | |||
c9f5ca8566 | |||
7495a32ec2 | |||
9e944b8c53 | |||
b259f33198 | |||
db978031d2 | |||
1ca5fb8597 | |||
8496c99def | |||
f1083d82d4 | |||
dd4620afaf | |||
45c5114e9d | |||
a553009af0 | |||
ed74e3d767 | |||
c0208b8c40 | |||
2681361df1 | |||
0a2dcd7c50 | |||
3e5b0eeee3 | |||
42d640985e | |||
8e35463045 | |||
fc1929f37d | |||
6d0cbed3f7 | |||
9e4d2c03cf | |||
1faf158381 | |||
a820d40858 | |||
7569b78aeb | |||
1da1181ba1 | |||
06d3586e95 | |||
309f0cf7ad | |||
a31b1d0118 | |||
f2b37bbcc7 | |||
a841caaff8 | |||
1b425e82b6 | |||
d0d058410b | |||
3f212924cf | |||
f936d06933 | |||
bdc3c5e077 | |||
5e881d7591 | |||
eabcfb4369 | |||
300b788e88 | |||
1f83898d01 | |||
31e4baf6ca | |||
bb4d9b26fe | |||
2696c9f161 | |||
f8eda5d0f4 | |||
2ad093b4fa | |||
774a60c8eb | |||
9e9a6616c1 | |||
46cc366250 | |||
611b828d12 | |||
0ae14ee78a | |||
35b5f534cf | |||
9bd2c1fbc5 | |||
d4e5d9967d | |||
def1331dea | |||
b447ec474e | |||
7265b0920d | |||
67745bc16b | |||
8e724d481b | |||
eac1071088 | |||
86a935befc | |||
8950d4655d | |||
7be71ca17b | |||
0e72914300 | |||
6ca011f192 | |||
0602a38652 | |||
2c38f847b9 | |||
c0c25af648 | |||
ce23e95741 | |||
c6f3705301 | |||
3482cb3e20 | |||
500a2053bc | |||
8ead3bebb4 | |||
b19a7dfba7 | |||
b8bdf87799 | |||
1dd6b50740 | |||
07a3959dd2 | |||
00621a168b | |||
676d24e9d2 | |||
25a4bc42a6 | |||
ab224cbfaa | |||
eaf795624e | |||
8f25d8997e | |||
4304116026 | |||
72f9765050 | |||
af4fb37670 | |||
48b0eac804 | |||
82f6eaa0f4 | |||
c381151ce7 | |||
e76578edfc | |||
e5ba4d313a | |||
a5e7da198b | |||
b83fb77107 | |||
9e9cf9630c | |||
02153fd2c8 | |||
5ddb48afc3 | |||
6a37c9bfdc | |||
3001c7a52e | |||
0780186565 | |||
84917b7821 | |||
1a90e3fc91 | |||
ac3efbbea8 | |||
2629184a0e | |||
62d4082c79 | |||
6c962fb0fb | |||
b201032d1e | |||
dceae9e8f9 | |||
61ae4da522 | |||
8f9b404c29 | |||
ea820f5c9f | |||
23ebcbc77a | |||
3e932d8aa8 | |||
01984bab7c | |||
248189c74e | |||
9a7ee9edc5 | |||
81a9a29994 | |||
6f71631c4b | |||
2726586caa | |||
654bd20277 | |||
afcd9fea37 | |||
6fe95fbbe4 | |||
89bdbc7cca | |||
e1c0786358 | |||
2584e135ed | |||
9e49dee28a | |||
5e4d755aad | |||
52cf79ee28 | |||
8faebfd44f | |||
655bf32451 | |||
cef05fbb4b | |||
85b5caf105 | |||
01a7c536a3 | |||
65237ea02f | |||
6a805a1e28 | |||
51fff05213 | |||
772dc15121 | |||
4a24efa64f | |||
c885306e32 | |||
dcc95a3b33 | |||
4367838ae4 | |||
4b236d13b0 | |||
b7ffa0d0e5 | |||
93a68930aa | |||
abc99a3610 | |||
e5d8803af6 | |||
c21b63ea3f | |||
e17fa45a12 | |||
c1d79abf0e | |||
0a1195e7a9 | |||
0409ce05b8 | |||
14167b6890 | |||
ecc5816593 | |||
1aae4c3350 | |||
d5fb61765f | |||
fdfd34ccfd | |||
db1a5fce34 | |||
4ae742cb70 | |||
77f94345d1 | |||
85b7fca736 | |||
969d1d14ed | |||
efbc3cc213 | |||
5b91b67796 | |||
ebed2ed1c2 | |||
37bbfd4378 | |||
4118c23f95 | |||
2d7a4ad019 | |||
28e127dd92 | |||
21a9b100a1 | |||
78e850f1b6 | |||
3373388062 | |||
1921477c18 | |||
8e363e3493 | |||
c74b535bb2 | |||
e800242da6 | |||
07a2a8d1c3 | |||
2a871e5740 | |||
139b2911ea | |||
1de4bb9338 | |||
baefa9126e | |||
2ad1408ba9 | |||
82a58c989f | |||
3d4784c731 | |||
a8a9c9577a | |||
950eafe167 | |||
d93314a122 | |||
585a62afa6 | |||
03451f5037 | |||
bfe8fda504 | |||
914c4c5ac4 | |||
938d3731c8 | |||
99e1bd7079 | |||
ba199714bc | |||
281c06b2ed | |||
921603b036 | |||
140c431a59 | |||
0a0f70f4e8 | |||
21f8910725 | |||
1b11b4840f | |||
668c00fdb8 | |||
3f8ad8af58 | |||
eecc5010eb | |||
2ee1f58571 | |||
4145db0b35 | |||
88c1439437 | |||
e8990b7d03 | |||
41d48ab573 | |||
ba7a3d6c44 | |||
8c5f23d79a | |||
a3cd675f1e | |||
a56bd55dac | |||
7c0c2cb944 | |||
9b1da949a3 | |||
b76f452233 | |||
94f1718e8d | |||
8294e9b37a | |||
558cbf12fc | |||
8439b517f3 | |||
2762f39fc4 | |||
74d66c1027 | |||
de5e5e25de | |||
479fa188f0 | |||
7231e95996 | |||
8b66f41ea3 | |||
deeea162c7 | |||
06c8b65a8c | |||
74c48651b9 | |||
ce803e8a94 | |||
843fd34df6 | |||
39cea1cbb3 | |||
b4f3bd982f | |||
fcb85fb288 | |||
9a756394cc | |||
922f49f734 | |||
99c37ea419 | |||
767863f552 | |||
45eb5fd21d | |||
926f75812b | |||
0fed5de57c | |||
deff21617c | |||
2d3383ee54 | |||
f2f8a02aa9 | |||
d10a7ece5c | |||
b01704d715 | |||
fa6683d2d0 | |||
746320740a | |||
627f55d5d0 | |||
4579111c27 | |||
c9d5094560 | |||
de51f31cda | |||
a4a3c09c76 | |||
ec23d93c0d | |||
f459d71013 | |||
367a5d8c5f | |||
dfe629a607 | |||
d41cb7132c | |||
7c210171d1 | |||
51c12f72d6 | |||
e95dc58c6e | |||
bb0af04df3 | |||
c528989ead | |||
71a3060051 | |||
3ba6ac3224 | |||
cc460be049 | |||
134e901166 | |||
fda2e1e693 | |||
e9a14f843d | |||
475d430fd6 | |||
ac6b83aff8 | |||
c93802bfed | |||
e67456cc26 | |||
966222feef | |||
67d50a58bf | |||
3b79af7b99 | |||
60d348d651 | |||
2d2fabc6cd | |||
f6b914d594 | |||
5ee253a0e6 | |||
fc78d0290f | |||
9670d80bc1 | |||
91fc8d50ef | |||
d27c62e35f | |||
cc574137a0 | |||
a6814b92ea | |||
64da4f2081 | |||
a05b74863b | |||
722e2e26c3 | |||
5712e9bfdf | |||
f589bfc4f0 | |||
b76b9903de | |||
fb89742f47 | |||
487eb2e40a | |||
6e9ed6fa71 | |||
9afd5ad5f7 | |||
bfdd9471fc | |||
5ef81b5aab | |||
6dd8f079dd | |||
06312e656b | |||
1bc8f9b8be | |||
6d1405ceaa | |||
af701e5b64 | |||
5fb3e869e5 | |||
35afee967e | |||
1a91ab941c | |||
2b7c8182d9 | |||
6081a9b032 | |||
5fd1a15da2 | |||
0e98bb399f | |||
041652a80d | |||
74c6036eb1 | |||
68fe4b0a84 | |||
85a80e83b2 | |||
d0fc49168d | |||
893262d13a | |||
89d675fa91 | |||
0e42b1d9ef | |||
16b594b22c | |||
fbb918187e | |||
1eb06f1ef3 | |||
f4745c3d28 | |||
99f0e9f829 | |||
96c2c3559a | |||
650f75a1f9 | |||
c629e237b3 | |||
d5d36acbfc | |||
e4cddbf6dc | |||
8b2352549c | |||
69eabd6677 | |||
48e6ec6682 | |||
658ead207e | |||
10d70ab81a | |||
7215210bb4 | |||
091add62d7 | |||
a5ac948dfe | |||
099c040870 | |||
d33c4824f6 | |||
26d1d6a05e | |||
8120ad81a7 | |||
88b6157313 | |||
8630761254 | |||
98893fe49c | |||
a78b404789 | |||
95c11ee297 | |||
ce8b462f06 | |||
4a54fb0814 | |||
02ecfd11b5 | |||
d36afc91dd | |||
e6ce800327 | |||
93f9f0762d | |||
3e2b93c19d | |||
1161f83de3 | |||
95d24296ee | |||
266f623e22 | |||
bd9c04d74f | |||
91140f3f06 | |||
b8be9ddfa7 | |||
b0cfa8da4f | |||
246333133a | |||
5063f4f8d1 | |||
b76e2f4c9a | |||
b626ebf54b | |||
479d89e951 | |||
429ff5b3b5 | |||
f42b061473 | |||
876b1eca48 | |||
25d7c1e91b | |||
c239151bf7 | |||
67879a5fbb | |||
170cc51fe2 | |||
7c22476c97 | |||
39f926d7d6 | |||
2aeb6c6bd4 | |||
b3cd026920 | |||
839f490bc3 | |||
c2c1460995 | |||
ec63a3d57e | |||
ba6e18d2c0 | |||
97ba2da970 | |||
f2389052ca | |||
f71188ba53 | |||
7a7fb5f4e5 | |||
23506e8328 | |||
ee9cf6c407 | |||
5136657315 | |||
b5e945fb9f | |||
b8217145ed | |||
c2dc7e3b69 | |||
4730dea151 | |||
a13135e34e | |||
beb32b132f | |||
48635d83e3 | |||
a3eea311e9 | |||
06091efe32 | |||
b11711a509 | |||
733e37e053 | |||
1bac07b50c | |||
b371fdf602 | |||
98d6ac88ae | |||
f616ce37da | |||
058842eac3 | |||
974c82a8ae | |||
eb28777e10 | |||
aefb91544b | |||
39f8be8a07 | |||
36e95ce62e | |||
3afa06f29d | |||
da9a356adc | |||
a979e3eaab | |||
907bf9f19e | |||
78674fd211 | |||
08d54b1eb8 | |||
5c7d2b3823 | |||
c07cf89ac4 | |||
cd83ed0590 | |||
60798ca728 | |||
baa293d434 | |||
b7c7c6e64e | |||
0140c1130a | |||
b44ceb748a | |||
7f45ae0f10 | |||
50f13caa09 | |||
26d6e9a6b5 | |||
ba41f86c02 | |||
83280c1280 | |||
5c92a4a240 | |||
85dab85e31 | |||
041548dad9 | |||
1d9549b812 | |||
1510009c10 | |||
5d875abbf7 | |||
3a3bcf1cfc | |||
030ffab7d2 | |||
a3dfc21c1a | |||
d283e90962 | |||
3aedf4d8e5 | |||
32ef993e05 | |||
6a75ebc5b0 | |||
636ef91bed | |||
458b8f5456 | |||
239d3e4109 | |||
95e12baff4 | |||
843cb73393 | |||
1276fbdf48 | |||
5aa4947cb1 | |||
dd2d1d04b8 | |||
b255299212 | |||
a50e578d0e | |||
23d0222ed3 | |||
6e5f3ce9b5 | |||
6431074de4 | |||
2654f60c1b | |||
da11207dea | |||
5c208328e2 | |||
5e2df4bb9a | |||
106f9751e5 | |||
77e510abdc | |||
88272c5503 | |||
4004360b4c | |||
177e1bfcdf | |||
0bf8bbe040 | |||
8ba0a37a42 | |||
557f52794c | |||
b7e7398fc9 | |||
68aac430ae | |||
d2c3802134 | |||
918e884175 | |||
cbce5daa05 |
4
.gitattributes
vendored
Normal file
4
.gitattributes
vendored
Normal file
@ -0,0 +1,4 @@
|
||||
*.t linguist-language=Text
|
||||
demo/* linguist-language=Text
|
||||
clients/* linguist-language=Text
|
||||
* linguist-language=C
|
4
.gitignore
vendored
4
.gitignore
vendored
@ -2,6 +2,7 @@
|
||||
bin/openresty.fcgi
|
||||
demo/Admin/.rsync
|
||||
*~
|
||||
*.swo
|
||||
*.json
|
||||
*.o
|
||||
*.hi
|
||||
@ -69,3 +70,6 @@ work/
|
||||
reindex
|
||||
t/*.t_
|
||||
upload
|
||||
upload-win32
|
||||
html_out/
|
||||
TODO
|
||||
|
237
COPYRIGHT
Normal file
237
COPYRIGHT
Normal file
@ -0,0 +1,237 @@
|
||||
Copyright (C) 2009-2015, by Yichun "agentzh" Zhang, CloudFlare Inc.
|
||||
|
||||
Copyright (C) 2009-2014, by Xiaozhe Wang (chaoslawful) <chaoslawful@gmail.com>.
|
||||
|
||||
Copyright (C) 2010-2014, by FRiCKLE Piotr Sikora <info@frickle.com>.
|
||||
|
||||
Copyright (C) 2015, by Shuxin Yang.
|
||||
|
||||
Copyright (c) 2010, 2011, Jiale "calio" Zhi <vipcalio@gmail.com>.
|
||||
|
||||
Copyright (C) Guanlan Dai
|
||||
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
|
||||
|
||||
* Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
|
||||
|
||||
* Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
Copyright (c) 2010, Marcus Clyne, Simpl (simpl.it)
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are met:
|
||||
|
||||
* Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
* Redistributions in binary form must reproduce the above copyright
|
||||
notice, this list of conditions and the following disclaimer in the
|
||||
documentation and/or other materials provided with the distribution.
|
||||
* Neither the name of the organization (Simpl) nor the
|
||||
names of its contributors may be used to endorse or promote products
|
||||
derived from this software without specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
DISCLAIMED. IN NO EVENT SHALL MARCUS CLYNE OR SIMPL BE LIABLE FOR ANY
|
||||
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
-----------------------------------------------------------------------------
|
||||
|
||||
Copyright (C) 2002-2015 Igor Sysoev
|
||||
Copyright (C) 2011-2015 Nginx, Inc.
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions
|
||||
are met:
|
||||
1. Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
2. Redistributions in binary form must reproduce the above copyright
|
||||
notice, this list of conditions and the following disclaimer in the
|
||||
documentation and/or other materials provided with the distribution.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
||||
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
||||
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
SUCH DAMAGE.
|
||||
|
||||
-----------------------------------------------------------------------------
|
||||
|
||||
NGINX License
|
||||
|
||||
Copyright (C) 2002-2009 Igor Sysoev
|
||||
Copyright (C) 2009-2013 Sergey A. Osokin
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions
|
||||
are met:
|
||||
1. Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
2. Redistributions in binary form must reproduce the above copyright
|
||||
notice, this list of conditions and the following disclaimer in the
|
||||
documentation and/or other materials provided with the distribution.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
||||
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
ARE DISCLAIMED. IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE
|
||||
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
SUCH DAMAGE.
|
||||
|
||||
-----------------------------------------------------------------------------
|
||||
|
||||
LuaJIT -- a Just-In-Time Compiler for Lua. http://luajit.org/
|
||||
|
||||
Copyright (C) 2005-2015 Mike Pall. All rights reserved.
|
||||
|
||||
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.
|
||||
|
||||
[ MIT license: http://www.opensource.org/licenses/mit-license.php ]
|
||||
|
||||
-----------------------------------------------------------------------------
|
||||
|
||||
Lua License
|
||||
|
||||
Copyright (C) 1994-2012 Lua.org, PUC-Rio.
|
||||
|
||||
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.
|
||||
|
||||
-----------------------------------------------------------------------------
|
||||
|
||||
Lua-cjson License
|
||||
|
||||
Copyright (c) 2010-2012 Mark Pulford <mark@kyne.com.au>
|
||||
|
||||
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.
|
||||
|
||||
-----------------------------------------------------------------------------
|
||||
|
||||
SHA-1 implementation in NDK
|
||||
|
||||
Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
|
||||
All rights reserved.
|
||||
|
||||
This package is an SSL implementation written
|
||||
by Eric Young (eay@cryptsoft.com).
|
||||
The implementation was written so as to conform with Netscapes SSL.
|
||||
|
||||
This library is free for commercial and non-commercial use as long as
|
||||
the following conditions are aheared to. The following conditions
|
||||
apply to all code found in this distribution, be it the RC4, RSA,
|
||||
lhash, DES, etc., code; not just the SSL code. The SSL documentation
|
||||
included with this distribution is covered by the same copyright terms
|
||||
except that the holder is Tim Hudson (tjh@cryptsoft.com).
|
||||
|
||||
Copyright remains Eric Young's, and as such any Copyright notices in
|
||||
the code are not to be removed.
|
||||
If this package is used in a product, Eric Young should be given attribution
|
||||
as the author of the parts of the library used.
|
||||
This can be in the form of a textual message at program startup or
|
||||
in documentation (online or textual) provided with the package.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions
|
||||
are met:
|
||||
|
||||
1. Redistributions of source code must retain the copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
2. Redistributions in binary form must reproduce the above copyright
|
||||
notice, this list of conditions and the following disclaimer in the
|
||||
documentation and/or other materials provided with the distribution.
|
||||
3. All advertising materials mentioning features or use of this software
|
||||
must display the following acknowledgement:
|
||||
"This product includes cryptographic software written by
|
||||
Eric Young (eay@cryptsoft.com)"
|
||||
The word 'cryptographic' can be left out if the rouines from the library
|
||||
being used are not cryptographic related :-).
|
||||
4. If you include any Windows specific code (or a derivative thereof) from
|
||||
the apps directory (application code) you must include an acknowledgement:
|
||||
"This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
|
||||
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
||||
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
SUCH DAMAGE.
|
||||
|
||||
The licence and distribution terms for any publically available version or
|
||||
derivative of this code cannot be changed. i.e. this code cannot simply be
|
||||
copied and put under another distribution licence
|
233
FreeBSD/www/openresty/Makefile
Normal file
233
FreeBSD/www/openresty/Makefile
Normal file
@ -0,0 +1,233 @@
|
||||
# New ports collection makefile for: openresty
|
||||
# Date created: 2012-08-07
|
||||
# Whom: Gvozdikov Veniamin <g.veniamin@googlemail.com>
|
||||
#
|
||||
# $FreeBSD$
|
||||
#
|
||||
|
||||
PORTNAME= openresty
|
||||
PORTVERSION= 1.2.1.11
|
||||
CATEGORIES= www
|
||||
MASTER_SITES= http://agentzh.org/misc/nginx/
|
||||
DISTNAME= ngx_${PORTNAME}-${PORTVERSION}
|
||||
|
||||
MAINTAINER= g.veniamin@googlemail.com
|
||||
COMMENT= OpenResty a powerful web app server by extending nginx
|
||||
|
||||
LICENSE= BSD
|
||||
|
||||
LIB_DEPENDS= pcre:${PORTSDIR}/devel/pcre
|
||||
|
||||
HAS_CONFIGURE= yes
|
||||
USE_GMAKE= yes
|
||||
USE_PERL5= yes
|
||||
|
||||
CONFIGURE_ARGS= --prefix=${PREFIX}\
|
||||
--with-cc-opt="-I ${LOCALBASE}/include" \
|
||||
--with-ld-opt="-L ${LOCALBASE}/lib" \
|
||||
--user=${WWWOWN} --group=${WWWGRP}
|
||||
|
||||
OPTIONS_DEFINE= LUACJSON LUAREDISPARS LUARDS LUARESTYDNS LUARESTYMEM \
|
||||
LUARESTYREDIS LUARESTYMYSQL LUARESTYUPLOAD LUARESTYSTRING \
|
||||
ECHO XSS COOLKIT MISC ENCSESSION HEADERSMORE SRCACHE \
|
||||
ARRAYVAR MEMC REDIS REDIS2 AUTHREQ RDSJSON RDSCVS \
|
||||
ICONV NDK DRIZZLE POSTGRES
|
||||
OPTIONS_SINGLE= GLUA
|
||||
OPTIONS_SINGLE_GLUA= LUA LUAJIT DLUA
|
||||
|
||||
LUACJSON_DESC= Lua cjson library
|
||||
LUAREDISPARS_DESC= Lua redis parser library
|
||||
LUARDS_DESC= Lua rds library
|
||||
LUARESTYDNS_DESC= Lua resty dns library
|
||||
LUARESTYMEM_DESC= Lua resty memcached library
|
||||
LUARESTYREDIS_DESC= Lua resty redis library
|
||||
LUARESTYMYSQL_DESC= Lua resty mysql library
|
||||
LUARESTYUPLOAD_DESC= Lua resty upload library
|
||||
LUARESTYSTRING_DESC= Lua resty string library
|
||||
|
||||
ECHO_DESC= Brings echo/sleep/time and more shell-style
|
||||
XSS_DESC= Native cross-site scripting support in nginx
|
||||
COOLKIT_DESC= Collection of small and useful nginx add-ons
|
||||
MISC_DESC= Various set_xxx directives added
|
||||
ENCSESSION_DESC= Encrypt and decrypt nginx variable values
|
||||
HEADERSMORE_DESC= Set and clear input and output headers
|
||||
SRCACHE_DESC= Transparent subrequest-based caching layout
|
||||
ARRAYVAR_DESC= Add support for array variables to config
|
||||
MEMC_DESC= An extended memcached module
|
||||
REDIS_DESC= HTTP redis module
|
||||
REDIS2_DESC= Module for the Redis 2.0 protocol
|
||||
AUTHREQ_DESC= Auth request module
|
||||
RDSJSON_DESC= An output filter that formats Resty
|
||||
RDSCVS_DESC= Output filter module to convert CVS
|
||||
NDK_DESC= Nginx Development Kit
|
||||
ICONV_DESC= Iconv support
|
||||
DRIZZLE_DESC= Module for talking to MySQL and Drizzle
|
||||
POSTGRES_DESC= Module for talking to Postgeres
|
||||
|
||||
DLUA_DESC= Disable Lua
|
||||
LUA_DESC= Use LUA 5.1
|
||||
LUAJIT_DESC= Use LuaJIT 2.0
|
||||
|
||||
OPTIONS_DEFAULT= MISC XSS ECHO COOLKIT ENCSESSION HEADERMORE LUA \
|
||||
SRCACHE ARRAYVAR MEMC REDIS REDIS2 AUTHREQ RDSJSON \
|
||||
RDSCVS NDK ICONV PORTGRES
|
||||
|
||||
.include <bsd.port.options.mk>
|
||||
|
||||
.if empty(${PORT_OPTIONS:MAUTHREQ})
|
||||
CONFIGURE_ARGS+= --without-http_auth_request_module
|
||||
.endif
|
||||
|
||||
.if empty(${PORT_OPTIONS:MRDSJSON})
|
||||
CONFIGURE_ARGS+= --without-http_rds_json_module
|
||||
.endif
|
||||
|
||||
.if empty(${PORT_OPTIONS:MRDSCVS})
|
||||
CONFIGURE_ARGS+= --without-http_rds_csv_module
|
||||
.endif
|
||||
|
||||
.if ${PORT_OPTIONS:MICONV}
|
||||
CONFIGURE_ARGS+= --with-http_iconv_module
|
||||
.endif
|
||||
|
||||
.if ${PORT_OPTIONS:MNDK}
|
||||
.else
|
||||
CONFIGURE_ARGS+= --without-ngx_devel_kit_module
|
||||
.endif
|
||||
|
||||
.if ${PORT_OPTIONS:MDRIZZLE}
|
||||
CONFIGURE_ARGS+= --with-http_drizzle_module \
|
||||
--with-libdrizzle=${LOCALBASE}
|
||||
LIB_DEPENDS+= drizzle:${PORTSDIR}/databases/libdrizzle
|
||||
.endif
|
||||
|
||||
.if ${PORT_OPTIONS:MPOSTGRES}
|
||||
CONFIGURE_ARGS+= --with-http_postgres_module
|
||||
.endif
|
||||
|
||||
.if empty(${PORT_OPTIONS:MREDIS})
|
||||
CONFIGURE_ARGS+= --without-http_redis_module
|
||||
.endif
|
||||
|
||||
.if empty(${PORT_OPTIONS:MREDIS2})
|
||||
CONFIGURE_ARGS+= --without-http_redis2_module
|
||||
.endif
|
||||
|
||||
.if empty(${PORT_OPTIONS:MMEMC})
|
||||
CONFIGURE_ARGS+= --without-http_memc_module
|
||||
.endif
|
||||
|
||||
.if empty(${PORT_OPTIONS:MARRAYVAR})
|
||||
CONFIGURE_ARGS+= --without-http_array_var_module
|
||||
.endif
|
||||
|
||||
.if empty(${PORT_OPTIONS:MSRCACHE})
|
||||
CONFIGURE_ARGS+= --without-http_srcache_module
|
||||
.endif
|
||||
|
||||
.if empty(${PORT_OPTIONS:MENCSESSION})
|
||||
CONFIGURE_ARGS+= --without-http_encrypted_session_module
|
||||
.endif
|
||||
|
||||
.if empty(${PORT_OPTIONS:MHEADERSMORE})
|
||||
CONFIGURE_ARGS+= --without-http_headers_more_module
|
||||
.endif
|
||||
|
||||
.if empty(${PORT_OPTIONS:MMISC})
|
||||
CONFIGURE_ARGS+= --without-http_set_misc_module
|
||||
.endif
|
||||
|
||||
.if empty(${PORT_OPTIONS:MXSS})
|
||||
CONFIGURE_ARGS+= --without-http_xss_module
|
||||
.endif
|
||||
|
||||
.if empty(${PORT_OPTIONS:MCOOLKIT})
|
||||
CONFIGURE_ARGS+= --without-http_coolkit_module
|
||||
.endif
|
||||
|
||||
.if empty(${PORT_OPTIONS:MECHO})
|
||||
CONFIGURE_ARGS+= --without-http_echo_module
|
||||
.endif
|
||||
|
||||
.if ${PORT_OPTIONS:MLUAJIT}
|
||||
CONFIGURE_ARGS+= --with-luajit
|
||||
PLIST_SUB+= LUAJIT=""
|
||||
.else
|
||||
PLIST_SUB+= LUAJIT="@comment "
|
||||
.endif
|
||||
|
||||
.if ${PORT_OPTIONS:MLUA}
|
||||
PLIST_SUB+= LUA=""
|
||||
.else
|
||||
CONFIGURE_ARGS+= --without-lua51
|
||||
PLIST_SUB+= LUA="@comment "
|
||||
.endif
|
||||
|
||||
.if ${PORT_OPTIONS:MDLUA}
|
||||
CONFIGURE_ARGS+= --without-http_lua_module
|
||||
.endif
|
||||
|
||||
.if ${PORT_OPTIONS:MLUACJSON}
|
||||
PLIST_SUB+= LUACJSON=""
|
||||
.else
|
||||
CONFIGURE_ARGS+= --without-lua_cjson
|
||||
PLIST_SUB+= LUACJSON="@comment "
|
||||
.endif
|
||||
|
||||
.if ${PORT_OPTIONS:MLUAREDISPARS}
|
||||
PLIST_SUB+= LUAREDISPARS=""
|
||||
.else
|
||||
CONFIGURE_ARGS+= --without-lua_redis_parser
|
||||
PLIST_SUB+= LUAREDISPARS="@comment "
|
||||
.endif
|
||||
|
||||
.if ${PORT_OPTIONS:MLUARDS}
|
||||
PLIST_SUB+= LUARDS=""
|
||||
.else
|
||||
CONFIGURE_ARGS+= --without-lua_rds_parser
|
||||
PLIST_SUB+= LUARDS="@comment "
|
||||
.endif
|
||||
|
||||
.if ${PORT_OPTIONS:MLUARESTYDNS}
|
||||
PLIST_SUB+= LUARESTYDNS=""
|
||||
.else
|
||||
PLIST_SUB+= LUARESTYDNS="@comment "
|
||||
CONFIGURE_ARGS+= --without-lua_resty_dns
|
||||
.endif
|
||||
|
||||
.if ${PORT_OPTIONS:MLUARESTYMEM}
|
||||
PLIST_SUB+= LUARESTYMEM=""
|
||||
.else
|
||||
PLIST_SUB+= LUARESTYMEM="@comment "
|
||||
CONFIGURE_ARGS+= --without-lua_resty_memcached
|
||||
.endif
|
||||
|
||||
.if ${PORT_OPTIONS:MLUARESTYREDIS}
|
||||
PLIST_SUB+= LUARESTYREDIS=""
|
||||
.else
|
||||
CONFIGURE_ARGS+= --without-lua_resty_redis
|
||||
PLIST_SUB+= LUARESTYREDIS="@comment "
|
||||
.endif
|
||||
|
||||
.if ${PORT_OPTIONS:MLUARESTYMYSQL}
|
||||
PLIST_SUB+= LUARESTYMYSQL=""
|
||||
.else
|
||||
CONFIGURE_ARGS+= --without-lua_resty_mysql
|
||||
PLIST_SUB+= LUARESTYMYSQL="@comment "
|
||||
.endif
|
||||
|
||||
.if ${PORT_OPTIONS:MLUARESTYUPLOAD}
|
||||
PLIST_SUB+= LUARESTYUPLOAD=""
|
||||
.else
|
||||
CONFIGURE_ARGS+= --without-lua_resty_upload
|
||||
PLIST_SUB+= LUARESTYUPLOAD="@comment "
|
||||
.endif
|
||||
|
||||
.if ${PORT_OPTIONS:MLUARESTYSTRING}
|
||||
PLIST_SUB+= LUARESTYSTRING=""
|
||||
.else
|
||||
CONFIGURE_ARGS+= --without-lua_resty_string
|
||||
PLIST_SUB+= LUARESTYSTRING="@comment "
|
||||
.endif
|
||||
|
||||
.include <bsd.port.mk>
|
2
FreeBSD/www/openresty/distinfo
Normal file
2
FreeBSD/www/openresty/distinfo
Normal file
@ -0,0 +1,2 @@
|
||||
SHA256 (ngx_openresty-1.2.1.11.tar.gz) = 212c3ba07d94b17fcbd4d60054bd8457fa18de3264381e8449074c78aa05f9f5
|
||||
SIZE (ngx_openresty-1.2.1.11.tar.gz) = 2950664
|
@ -0,0 +1,36 @@
|
||||
--- bundle/LuaJIT-2.0.0-beta10/Makefile.orig 2012-05-09 20:00:00.000000000 +0400
|
||||
+++ bundle/LuaJIT-2.0.0-beta10/Makefile 2012-08-07 23:26:28.853477336 +0400
|
||||
@@ -38,8 +38,6 @@
|
||||
INSTALL_JITLIB= $(INSTALL_SHARE)/luajit-$(VERSION)/jit
|
||||
INSTALL_LMOD= $(INSTALL_SHARE)/lua/$(ABIVER)
|
||||
INSTALL_CMOD= $(INSTALL_LIB)/lua/$(ABIVER)
|
||||
-INSTALL_MAN= $(INSTALL_SHARE)/man/man1
|
||||
-INSTALL_PKGCONFIG= $(INSTALL_LIB)/pkgconfig
|
||||
|
||||
INSTALL_TNAME= luajit-$(VERSION)
|
||||
INSTALL_TSYMNAME= luajit
|
||||
@@ -59,7 +57,7 @@
|
||||
INSTALL_TSYM= $(INSTALL_BIN)/$(INSTALL_TSYMNAME)
|
||||
INSTALL_PC= $(INSTALL_PKGCONFIG)/$(INSTALL_PCNAME)
|
||||
|
||||
-INSTALL_DIRS= $(INSTALL_BIN) $(INSTALL_LIB) $(INSTALL_INC) $(INSTALL_MAN) \
|
||||
+INSTALL_DIRS= $(INSTALL_BIN) $(INSTALL_LIB) $(INSTALL_INC) \
|
||||
$(INSTALL_PKGCONFIG) $(INSTALL_JITLIB) $(INSTALL_LMOD) $(INSTALL_CMOD)
|
||||
|
||||
RM= rm -f
|
||||
@@ -73,7 +71,6 @@
|
||||
FILE_T= luajit
|
||||
FILE_A= libluajit.a
|
||||
FILE_SO= libluajit.so
|
||||
-FILE_MAN= luajit.1
|
||||
FILE_PC= luajit.pc
|
||||
FILES_INC= lua.h lualib.h lauxlib.h luaconf.h lua.hpp luajit.h
|
||||
FILES_JITLIB= bc.lua v.lua dump.lua dis_x86.lua dis_x64.lua dis_arm.lua \
|
||||
@@ -108,7 +105,6 @@
|
||||
$(LDCONFIG) $(INSTALL_LIB) && \
|
||||
$(SYMLINK) $(INSTALL_SONAME) $(INSTALL_SHORT1) && \
|
||||
$(SYMLINK) $(INSTALL_SONAME) $(INSTALL_SHORT2) || :
|
||||
- cd etc && $(INSTALL_F) $(FILE_MAN) $(INSTALL_MAN)
|
||||
cd etc && $(SED_PC) $(FILE_PC) > $(FILE_PC).tmp && \
|
||||
$(INSTALL_F) $(FILE_PC).tmp $(INSTALL_PC) && \
|
||||
$(RM) $(FILE_PC).tmp
|
@ -0,0 +1,47 @@
|
||||
--- bundle/lua-5.1.5/Makefile.orig 2012-08-07 14:56:49.606517458 +0400
|
||||
+++ bundle/lua-5.1.5/Makefile 2012-08-07 14:57:31.325545994 +0400
|
||||
@@ -13,7 +13,6 @@
|
||||
INSTALL_BIN= $(INSTALL_TOP)/bin
|
||||
INSTALL_INC= $(INSTALL_TOP)/include
|
||||
INSTALL_LIB= $(INSTALL_TOP)/lib
|
||||
-INSTALL_MAN= $(INSTALL_TOP)/man/man1
|
||||
#
|
||||
# You probably want to make INSTALL_LMOD and INSTALL_CMOD consistent with
|
||||
# LUA_ROOT, LUA_LDIR, and LUA_CDIR in luaconf.h (and also with etc/lua.pc).
|
||||
@@ -44,7 +43,6 @@
|
||||
TO_BIN= lua luac
|
||||
TO_INC= lua.h luaconf.h lualib.h lauxlib.h ../etc/lua.hpp
|
||||
TO_LIB= liblua.a
|
||||
-TO_MAN= lua.1 luac.1
|
||||
|
||||
# Lua version and release.
|
||||
V= 5.1
|
||||
@@ -59,11 +57,10 @@
|
||||
src/lua test/hello.lua
|
||||
|
||||
install: dummy
|
||||
- cd src && $(MKDIR) $(INSTALL_BIN) $(INSTALL_INC) $(INSTALL_LIB) $(INSTALL_MAN) $(INSTALL_LMOD) $(INSTALL_CMOD)
|
||||
+ cd src && $(MKDIR) $(INSTALL_BIN) $(INSTALL_INC) $(INSTALL_LIB) $(INSTALL_LMOD) $(INSTALL_CMOD)
|
||||
cd src && $(INSTALL_EXEC) $(TO_BIN) $(INSTALL_BIN)
|
||||
cd src && $(INSTALL_DATA) $(TO_INC) $(INSTALL_INC)
|
||||
cd src && $(INSTALL_DATA) $(TO_LIB) $(INSTALL_LIB)
|
||||
- cd doc && $(INSTALL_DATA) $(TO_MAN) $(INSTALL_MAN)
|
||||
|
||||
ranlib:
|
||||
cd src && cd $(INSTALL_LIB) && $(RANLIB) $(TO_LIB)
|
||||
@@ -95,7 +92,6 @@
|
||||
@echo "INSTALL_BIN = $(INSTALL_BIN)"
|
||||
@echo "INSTALL_INC = $(INSTALL_INC)"
|
||||
@echo "INSTALL_LIB = $(INSTALL_LIB)"
|
||||
- @echo "INSTALL_MAN = $(INSTALL_MAN)"
|
||||
@echo "INSTALL_LMOD = $(INSTALL_LMOD)"
|
||||
@echo "INSTALL_CMOD = $(INSTALL_CMOD)"
|
||||
@echo "INSTALL_EXEC = $(INSTALL_EXEC)"
|
||||
@@ -111,7 +107,6 @@
|
||||
@echo "TO_BIN = $(TO_BIN)"
|
||||
@echo "TO_INC = $(TO_INC)"
|
||||
@echo "TO_LIB = $(TO_LIB)"
|
||||
- @echo "TO_MAN = $(TO_MAN)"
|
||||
|
||||
# echo config parameters as Lua code
|
||||
# uncomment the last sed expression if you want nil instead of empty strings
|
12
FreeBSD/www/openresty/files/patch-configure
Normal file
12
FreeBSD/www/openresty/files/patch-configure
Normal file
@ -0,0 +1,12 @@
|
||||
--- configure.orig 2012-08-08 11:10:58.575960219 +0400
|
||||
+++ configure 2012-08-08 11:11:38.950486311 +0400
|
||||
@@ -157,6 +157,9 @@
|
||||
} elsif ($opt eq '--without-lua_redis_parser') {
|
||||
$resty_opts{no_lua_redis_parser} = 1;
|
||||
|
||||
+ } elsif ($opt eq '--without-lua_resty_dns') {
|
||||
+ $resty_opts{no_lua_resty_dns} = 1;
|
||||
+
|
||||
} elsif ($opt eq '--without-lua_resty_memcached') {
|
||||
$resty_opts{no_lua_resty_memcached} = 1;
|
||||
|
6
FreeBSD/www/openresty/pkg-descr
Normal file
6
FreeBSD/www/openresty/pkg-descr
Normal file
@ -0,0 +1,6 @@
|
||||
ngx_openresty is a full-fledged web application server by bundling
|
||||
the standard nginx core, lots of 3rd-party nginx modules, as well
|
||||
as most of their external dependencies.
|
||||
|
||||
|
||||
WWW: http://openresty.org
|
95
FreeBSD/www/openresty/pkg-plist
Normal file
95
FreeBSD/www/openresty/pkg-plist
Normal file
@ -0,0 +1,95 @@
|
||||
%%LUA%%lua/bin/luac
|
||||
%%LUA%%lua/bin/lua
|
||||
%%LUA%%lua/lib/liblua.a
|
||||
%%LUA%%lua/include/luaconf.h
|
||||
%%LUA%%lua/include/lauxlib.h
|
||||
%%LUA%%lua/include/lua.h
|
||||
%%LUA%%lua/include/lua.hpp
|
||||
%%LUA%%lua/include/lualib.h
|
||||
%%LUAJIT%%luajit/include/luajit-2.0/luaconf.h
|
||||
%%LUAJIT%%luajit/include/luajit-2.0/lua.hpp
|
||||
%%LUAJIT%%luajit/include/luajit-2.0/lualib.h
|
||||
%%LUAJIT%%luajit/include/luajit-2.0/luajit.h
|
||||
%%LUAJIT%%luajit/include/luajit-2.0/lauxlib.h
|
||||
%%LUAJIT%%luajit/include/luajit-2.0/lua.h
|
||||
%%LUAJIT%%luajit/lib/libluajit-5.1.a
|
||||
%%LUAJIT%%luajit/lib/libluajit-5.1.so.2.0.0
|
||||
%%LUAJIT%%luajit/share/luajit-2.0.0-beta10/jit/dump.lua
|
||||
%%LUAJIT%%luajit/share/luajit-2.0.0-beta10/jit/dis_mipsel.lua
|
||||
%%LUAJIT%%luajit/share/luajit-2.0.0-beta10/jit/bc.lua
|
||||
%%LUAJIT%%luajit/share/luajit-2.0.0-beta10/jit/dis_mips.lua
|
||||
%%LUAJIT%%luajit/share/luajit-2.0.0-beta10/jit/dis_x64.lua
|
||||
%%LUAJIT%%luajit/share/luajit-2.0.0-beta10/jit/v.lua
|
||||
%%LUAJIT%%luajit/share/luajit-2.0.0-beta10/jit/dis_ppc.lua
|
||||
%%LUAJIT%%luajit/share/luajit-2.0.0-beta10/jit/dis_arm.lua
|
||||
%%LUAJIT%%luajit/share/luajit-2.0.0-beta10/jit/vmdef.lua
|
||||
%%LUAJIT%%luajit/share/luajit-2.0.0-beta10/jit/dis_x86.lua
|
||||
%%LUAJIT%%luajit/share/luajit-2.0.0-beta10/jit/bcsave.lua
|
||||
%%LUAJIT%%luajit/bin/luajit-2.0.0-beta10
|
||||
nginx/html/index.html
|
||||
nginx/html/50x.html
|
||||
nginx/conf/koi-win
|
||||
nginx/conf/koi-utf
|
||||
nginx/conf/fastcgi_params
|
||||
nginx/conf/nginx.conf.default
|
||||
nginx/conf/fastcgi.conf
|
||||
nginx/conf/win-utf
|
||||
nginx/conf/fastcgi.conf.default
|
||||
nginx/conf/scgi_params
|
||||
nginx/conf/uwsgi_params
|
||||
nginx/conf/mime.types
|
||||
nginx/conf/scgi_params.default
|
||||
nginx/conf/nginx.conf
|
||||
nginx/conf/uwsgi_params.default
|
||||
nginx/conf/mime.types.default
|
||||
nginx/conf/fastcgi_params.default
|
||||
nginx/sbin/nginx
|
||||
%%LUARESTYDNS%%lualib/resty/dns/resolver.lua
|
||||
%%LUARESTYUPLOAD%%lualib/resty/upload.lua
|
||||
%%LUARESTYSTRING%%lualib/resty/sha1.lua
|
||||
%%LUARESTYSTRING%%lualib/resty/random.lua
|
||||
%%LUARESTYSTRING%%lualib/resty/md5.lua
|
||||
%%LUARESTYSTRING%%lualib/resty/aes.lua
|
||||
%%LUARESTYSTRING%%lualib/resty/sha384.lua
|
||||
%%LUARESTYMYSQL%%lualib/resty/mysql.lua
|
||||
%%LUARESTYMEM%%lualib/resty/memcached.lua
|
||||
%%LUARESTYREDIS%%lualib/resty/redis.lua
|
||||
%%LUARESTYSTRING%%lualib/resty/sha512.lua
|
||||
%%LUARESTYSTRING%%lualib/resty/sha256.lua
|
||||
%%LUARESTYSTRING%%lualib/resty/string.lua
|
||||
%%LUARESTYSTRING%%lualib/resty/sha224.lua
|
||||
%%LUARESTYSTRING%%lualib/resty/sha.lua
|
||||
%%LUARDS%%lualib/rds/parser.so
|
||||
%%LUACJSON%%lualib/cjson.so
|
||||
%%LUAREDISPARS%%lualib/redis/parser.so
|
||||
@dirrmtry nginx/sbin
|
||||
@dirrmtry nginx/logs
|
||||
@dirrmtry nginx/html
|
||||
@dirrmtry nginx/conf
|
||||
@dirrmtry nginx
|
||||
%%LUARESTYDNS%%@dirrm lualib/resty/dns
|
||||
@dirrmtry lualib/resty
|
||||
%%LUAREDISPARS%%@dirrmtry lualib/redis
|
||||
%%LUARDS%%@dirrmtry lualib/rds
|
||||
@dirrmtry lualib
|
||||
%%LUA%%@dirrm lua/share/lua/5.1
|
||||
%%LUA%%@dirrm lua/share/lua
|
||||
%%LUA%%@dirrm lua/share
|
||||
%%LUA%%@dirrm lua/lib/lua/5.1
|
||||
%%LUA%%@dirrm lua/lib/lua
|
||||
%%LUA%%@dirrm lua/lib
|
||||
%%LUA%%@dirrm lua/include
|
||||
%%LUA%%@dirrm lua/bin
|
||||
%%LUA%%@dirrm lua
|
||||
%%LUAJIT%%@dirrm luajit/share/luajit-2.0.0-beta10/jit
|
||||
%%LUAJIT%%@dirrm luajit/share/luajit-2.0.0-beta10
|
||||
%%LUAJIT%%@dirrm luajit/include/luajit-2.0
|
||||
%%LUAJIT%%@dirrm luajit/include
|
||||
%%LUAJIT%%@dirrm luajit/share/lua/5.1
|
||||
%%LUAJIT%%@dirrm luajit/share/lua
|
||||
%%LUAJIT%%@dirrm luajit/share
|
||||
%%LUAJIT%%@dirrm luajit/lib/lua/5.1
|
||||
%%LUAJIT%%@dirrm luajit/lib/lua
|
||||
%%LUAJIT%%@dirrm luajit/lib
|
||||
%%LUAJIT%%@dirrm luajit/bin
|
||||
%%LUAJIT%%@dirrm luajit
|
73
README
73
README
@ -1,73 +0,0 @@
|
||||
ngx_openresty is a full-fledged web application server by bundling the standard nginx core,
|
||||
lots of 3rd-party nginx modules, as well as most of their external dependencies.
|
||||
|
||||
This bundle is maintained by us, agentzh and chaoslawful, and sponsored by
|
||||
Taobao.com, Alibaba Group.
|
||||
|
||||
Because most of the nginx modules are developed by the bundle maintainers, it can ensure
|
||||
that all these modules are played well together.
|
||||
|
||||
The bundled software components are copyrighted by the respective copyright holders.
|
||||
|
||||
The homepage for this project is http://openresty.org.
|
||||
|
||||
For the users:
|
||||
Visit http://openresty.org/#Download to download the latest bundle tarball, and
|
||||
follow the installation instructions in the page http://openresty.org/#Installation.
|
||||
|
||||
For bundle maintainers:
|
||||
|
||||
The bundle's source is at the following git repository:
|
||||
|
||||
https://github.com/agentzh/ngx_openresty
|
||||
|
||||
To reproduce the bundle tarball, just do
|
||||
|
||||
make
|
||||
|
||||
at the top of the bundle source tree.
|
||||
|
||||
REPORT BUGS
|
||||
|
||||
You're very welcome to report issues on GitHub:
|
||||
|
||||
https://github.com/agentzh/ngx_openresty/issues
|
||||
|
||||
COPYRIGHT & LICENSE
|
||||
|
||||
The bundle itself is licensed under the 2-clause BSD license.
|
||||
|
||||
Copyright (c) 2011, Taobao Inc., Alibaba Group (
|
||||
http://www.taobao.com ).
|
||||
|
||||
Copyright (c) 2011, Yichun "agentzh" Zhang (章亦春)
|
||||
<agentzh@gmail.com>.
|
||||
|
||||
Copyright (c) 2011, Xiaozhe "chaoslawful" Wang (王晓哲)
|
||||
<chaoslawful@gmail.com>.
|
||||
|
||||
This module is licensed under the terms of the BSD license.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are
|
||||
met:
|
||||
|
||||
* Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
|
||||
* Redistributions in binary form must reproduce the above copyright
|
||||
notice, this list of conditions and the following disclaimer in the
|
||||
documentation and/or other materials provided with the distribution.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
|
||||
IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
|
||||
TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
|
||||
PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
|
||||
TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
115
README.markdown
Normal file
115
README.markdown
Normal file
@ -0,0 +1,115 @@
|
||||
Name
|
||||
====
|
||||
|
||||
ngx_openresty - Turning Nginx into a Full-Fledged Scriptable Web Platform
|
||||
|
||||
Table of Contents
|
||||
=================
|
||||
|
||||
* [Name](#name)
|
||||
* [Description](#description)
|
||||
* [For Users](#for-users)
|
||||
* [For Bundle Maintainers](#for-bundle-maintainers)
|
||||
* [Mailing List](#mailing-list)
|
||||
* [Report Bugs](#report-bugs)
|
||||
* [Copyright & License](#copyright--license)
|
||||
|
||||
Description
|
||||
===========
|
||||
|
||||
ngx_openresty is a full-fledged web application server by bundling the standard nginx core,
|
||||
lots of 3rd-party nginx modules, as well as most of their external dependencies.
|
||||
|
||||
This bundle is maintained Yichun Zhang (agentzh).
|
||||
|
||||
Because most of the nginx modules are developed by the bundle maintainers, it can ensure
|
||||
that all these modules are played well together.
|
||||
|
||||
The bundled software components are copyrighted by the respective copyright holders.
|
||||
|
||||
The homepage for this project is http://openresty.org.
|
||||
|
||||
For Users
|
||||
---------
|
||||
|
||||
Visit http://openresty.org/#Download to download the latest bundle tarball, and
|
||||
follow the installation instructions in the page http://openresty.org/#Installation.
|
||||
|
||||
For Bundle Maintainers
|
||||
----------------------
|
||||
|
||||
The bundle's source is at the following git repository:
|
||||
|
||||
https://github.com/openresty/ngx_openresty
|
||||
|
||||
To reproduce the bundle tarball, just do
|
||||
|
||||
```bash
|
||||
make
|
||||
```
|
||||
|
||||
at the top of the bundle source tree.
|
||||
|
||||
Please note that you may need to install some extra dependencies, like `perl`, `dos2unix` and
|
||||
the Perl CPAN mdoule `Markdown::Pod`. On Fedora 22, for example, installing the dependencies
|
||||
is as simple as running the following commands:
|
||||
|
||||
```bash
|
||||
sudo dnf install perl dos2unix
|
||||
sudo cpan Markdown::Pod
|
||||
```
|
||||
|
||||
[Back to TOC](#table-of-contents)
|
||||
|
||||
Mailing List
|
||||
============
|
||||
|
||||
You're very welcome to join the English OpenResty mailing list hosted on Google Groups:
|
||||
|
||||
https://groups.google.com/group/openresty-en
|
||||
|
||||
The Chinese mailing list is here:
|
||||
|
||||
https://groups.google.com/group/openresty
|
||||
|
||||
[Back to TOC](#table-of-contents)
|
||||
|
||||
Report Bugs
|
||||
===========
|
||||
|
||||
You're very welcome to report issues on GitHub:
|
||||
|
||||
https://github.com/agentzh/ngx_openresty/issues
|
||||
|
||||
[Back to TOC](#table-of-contents)
|
||||
|
||||
Copyright & License
|
||||
===================
|
||||
|
||||
The bundle itself is licensed under the 2-clause BSD license.
|
||||
|
||||
Copyright (c) 2011-2015, Yichun "agentzh" Zhang (章亦春) <agentzh@gmail.com>, CloudFlare Inc.
|
||||
|
||||
This module is licensed under the terms of the BSD license.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are
|
||||
met:
|
||||
|
||||
* Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
|
||||
* Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
|
||||
IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
|
||||
TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
|
||||
PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
|
||||
TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
[Back to TOC](#table-of-contents)
|
||||
|
182
doc/README-win32.md
Normal file
182
doc/README-win32.md
Normal file
@ -0,0 +1,182 @@
|
||||
Name
|
||||
====
|
||||
|
||||
README-win32 - README for the Windows 32-bit build of OpenResty
|
||||
|
||||
Description
|
||||
===========
|
||||
|
||||
The binary distributions of OpenResty can be downloaded from the following web page:
|
||||
|
||||
https://openresty.org/#Download
|
||||
|
||||
To start the NGINX server of the nginx server of the Win32 binary distribution of OpenResty:
|
||||
|
||||
```bash
|
||||
start nginx
|
||||
```
|
||||
|
||||
You can also specify the `-p PATH/` option to override the default server prefix, as in
|
||||
|
||||
```bash
|
||||
cd /path/to/my/openresty/app/
|
||||
start nginx -p $PWD
|
||||
```
|
||||
|
||||
Then you can use the `tasklist` command to check the nginx processes running in the background:
|
||||
|
||||
```console
|
||||
C:\> tasklist /fi "imagename eq nginx.exe"
|
||||
|
||||
Image Name PID Session Name Session# Mem Usage
|
||||
========================= ======== ================ =========== ============
|
||||
nginx.exe 4616 Console 1 7,412 K
|
||||
nginx.exe 5836 Console 1 7,800 K
|
||||
|
||||
```
|
||||
|
||||
One of the two processes is the master process while the other is the worker.
|
||||
|
||||
If you are using the MSYS bash instead of the `cmd.exe` console, then you should replace the `/fi` option
|
||||
with `-fi` in the command above instead.
|
||||
|
||||
You can quickly shut down the server like this:
|
||||
|
||||
```bash
|
||||
nginx -s stop
|
||||
```
|
||||
|
||||
or gracefully shut it down like this:
|
||||
|
||||
```bash
|
||||
nginx -s quit
|
||||
```
|
||||
|
||||
You can also forcibly kill the nginx processes via their PIDs with `taskkill`, as in
|
||||
|
||||
```console
|
||||
C:\> taskkill /pid 5488 /F
|
||||
```
|
||||
|
||||
where the PID (5488 in this example) can be found via the aforementioned `tasklist` command.
|
||||
|
||||
Again, you should use the form `-pid` and `-F` for the options if you are in an MSYS bash
|
||||
session.
|
||||
|
||||
Similarly, you can use the `nginx -s reload` command to reload nginx configurations without
|
||||
stopping the server. And you can use `nginx -s reopen` to instruct nginx to re-open
|
||||
all the log files.
|
||||
|
||||
You can run the `resty` script like this:
|
||||
|
||||
```console
|
||||
C:\> resty -e "ngx.say('Hello, OpenResty!')"
|
||||
Hello, OpenResty!
|
||||
```
|
||||
|
||||
The `resty` command-line utility requires a Perl interpreter installed in your
|
||||
system and visible to your PATH environment. Any perl distributions should
|
||||
work, including StrawberryPerl, ActivePerl, and MSYS perl (the former two are
|
||||
recommended though).
|
||||
|
||||
Debugging
|
||||
=========
|
||||
|
||||
Debug symbosl are enabled even in release builds. So that when things go very wrong,
|
||||
one can still debug things with tools like MSYS GDB.
|
||||
|
||||
Inclusion of debug symbols make the binary files (`.exe` and `.dll` files) much larger,
|
||||
but it generally will not load into memory during normal execution on a modern operating
|
||||
system.
|
||||
|
||||
Caveats
|
||||
=======
|
||||
|
||||
The Win32 port of the NGINX core supports the good old `select` IO multiplexing mechanism
|
||||
only.
|
||||
The I/O Completion Ports (IOCP) feature is *not* supported (yet). So do not use this build
|
||||
for production environments with very high concurrency levels.
|
||||
|
||||
This Win32 build of OpenResty is mainly for developers who want to develop their applications
|
||||
in native Windows environment (though they eventually push the finished work onto a Linux or *BSD box, most of the time).
|
||||
|
||||
TODO
|
||||
====
|
||||
|
||||
* Add support for more than one NGINX worker processes.
|
||||
* Add support for concurrent connections more than 1024.
|
||||
* Switch to the Microsoft Visual Studio compiler toolchain for better performance and easier binary
|
||||
package redistribution.
|
||||
* Bundle StrawberryPerl to make command-line utilities like `resty` work out of the box (without
|
||||
manually installing a Perl).
|
||||
* Deliver an alternative Win32 binary package built with best debuggin capabilities (like enabling
|
||||
NGINX debugging logs, disabling C compiler optimizations, and enabling all the assertions and checks).
|
||||
* Deliver binary packages for 64-bit Windows (Win64).
|
||||
|
||||
Details About The Building Process
|
||||
==================================
|
||||
|
||||
Usually you do not need to worry about how the Win32 binaries were built on the maintainers''
|
||||
side. But if you do, please read on.
|
||||
|
||||
The Win32 build of OpenResty is currently built via the MinGW/MSYS toolchain, including
|
||||
MinGW gcc 4.8.1, MSYS perl, MSYS bash, MSYS make, and etc. Basically, it is currently built via
|
||||
the following cmmands:
|
||||
|
||||
```bash
|
||||
mkdir -p objs/lib || exit 1
|
||||
cd objs/lib || exit 1
|
||||
ls ../../..
|
||||
tar -xf ../../../openssl-1.0.2d.tar.gz
|
||||
tar -xf ../../../zlib-1.2.8.tar.gz
|
||||
tar -xf ../../../pcre-8.37.tar.gz
|
||||
cd ../..
|
||||
./configure --with-cc=gcc \
|
||||
--prefix= \
|
||||
--with-cc-opt='-DFD_SETSIZE=1024' \
|
||||
--with-select_module \
|
||||
--with-ipv6 \
|
||||
--sbin-path=nginx.exe \
|
||||
--with-pcre-jit \
|
||||
--with-luajit-xcflags="-DLUAJIT_NUMMODE=2 -DLUAJIT_ENABLE_LUA52COMPAT" \
|
||||
--with-pcre=objs/lib/pcre-8.37 \
|
||||
--with-zlib=objs/lib/zlib-1.2.8 \
|
||||
--with-openssl=objs/lib/openssl-1.0.2d \
|
||||
-j5
|
||||
make
|
||||
make install
|
||||
```
|
||||
|
||||
where the dependency library source tarballs for OpenSSL, Zlib, and PCRE are downloaded
|
||||
from their official sites, respectively.
|
||||
|
||||
We automate these commands in a dedicated shell script named [build-win32.sh](https://github.com/openresty/ngx_openresty/blob/master/util/build-win32.sh).
|
||||
|
||||
Furthermore, we automate the packaging process of the resulting binaries and supporting files
|
||||
with this [package-win32.sh](https://github.com/openresty/ngx_openresty/blob/master/util/package-win32.sh)
|
||||
script.
|
||||
|
||||
Usually you can just download and use the binary distribution of OpenResty without
|
||||
installing the build toolchain.
|
||||
|
||||
Author
|
||||
======
|
||||
|
||||
Yichun "agentzh" Zhang <agentzh@gmail.com>, CloudFlare Inc.
|
||||
|
||||
Copyright & License
|
||||
===================
|
||||
|
||||
This module is licensed under the BSD license.
|
||||
|
||||
Copyright (C) 2015, by Yichun "agentzh" Zhang (章亦春) <agentzh@gmail.com>, CloudFlare Inc.
|
||||
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
|
||||
|
||||
* Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
|
||||
|
||||
* Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
241
misc/unwind-generic.h
Normal file
241
misc/unwind-generic.h
Normal file
@ -0,0 +1,241 @@
|
||||
/* Exception handling and frame unwind runtime interface routines.
|
||||
Copyright (C) 2001, 2003, 2004, 2006 Free Software Foundation, Inc.
|
||||
|
||||
This file is part of GCC.
|
||||
|
||||
GCC is free software; you can redistribute it and/or modify it
|
||||
under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2, or (at your option)
|
||||
any later version.
|
||||
|
||||
GCC is distributed in the hope that it will be useful, but WITHOUT
|
||||
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||
or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
|
||||
License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with GCC; see the file COPYING. If not, write to the Free
|
||||
Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
|
||||
02110-1301, USA. */
|
||||
|
||||
/* As a special exception, if you include this header file into source
|
||||
files compiled by GCC, this header file does not by itself cause
|
||||
the resulting executable to be covered by the GNU General Public
|
||||
License. This exception does not however invalidate any other
|
||||
reasons why the executable file might be covered by the GNU General
|
||||
Public License. */
|
||||
|
||||
/* This is derived from the C++ ABI for IA-64. Where we diverge
|
||||
for cross-architecture compatibility are noted with "@@@". */
|
||||
|
||||
#ifndef _UNWIND_H
|
||||
#define _UNWIND_H
|
||||
|
||||
#ifndef HIDE_EXPORTS
|
||||
#pragma GCC visibility push(default)
|
||||
#endif
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/* Level 1: Base ABI */
|
||||
|
||||
/* @@@ The IA-64 ABI uses uint64 throughout. Most places this is
|
||||
inefficient for 32-bit and smaller machines. */
|
||||
typedef unsigned _Unwind_Word __attribute__((__mode__(__word__)));
|
||||
typedef signed _Unwind_Sword __attribute__((__mode__(__word__)));
|
||||
#if defined(__ia64__) && defined(__hpux__)
|
||||
typedef unsigned _Unwind_Ptr __attribute__((__mode__(__word__)));
|
||||
#else
|
||||
typedef unsigned _Unwind_Ptr __attribute__((__mode__(__pointer__)));
|
||||
#endif
|
||||
typedef unsigned _Unwind_Internal_Ptr __attribute__((__mode__(__pointer__)));
|
||||
|
||||
/* @@@ The IA-64 ABI uses a 64-bit word to identify the producer and
|
||||
consumer of an exception. We'll go along with this for now even on
|
||||
32-bit machines. We'll need to provide some other option for
|
||||
16-bit machines and for machines with > 8 bits per byte. */
|
||||
typedef unsigned _Unwind_Exception_Class __attribute__((__mode__(__DI__)));
|
||||
|
||||
/* The unwind interface uses reason codes in several contexts to
|
||||
identify the reasons for failures or other actions. */
|
||||
typedef enum
|
||||
{
|
||||
_URC_NO_REASON = 0,
|
||||
_URC_FOREIGN_EXCEPTION_CAUGHT = 1,
|
||||
_URC_FATAL_PHASE2_ERROR = 2,
|
||||
_URC_FATAL_PHASE1_ERROR = 3,
|
||||
_URC_NORMAL_STOP = 4,
|
||||
_URC_END_OF_STACK = 5,
|
||||
_URC_HANDLER_FOUND = 6,
|
||||
_URC_INSTALL_CONTEXT = 7,
|
||||
_URC_CONTINUE_UNWIND = 8
|
||||
} _Unwind_Reason_Code;
|
||||
|
||||
|
||||
/* The unwind interface uses a pointer to an exception header object
|
||||
as its representation of an exception being thrown. In general, the
|
||||
full representation of an exception object is language- and
|
||||
implementation-specific, but it will be prefixed by a header
|
||||
understood by the unwind interface. */
|
||||
|
||||
struct _Unwind_Exception;
|
||||
|
||||
typedef void (*_Unwind_Exception_Cleanup_Fn) (_Unwind_Reason_Code,
|
||||
struct _Unwind_Exception *);
|
||||
|
||||
struct _Unwind_Exception
|
||||
{
|
||||
_Unwind_Exception_Class exception_class;
|
||||
_Unwind_Exception_Cleanup_Fn exception_cleanup;
|
||||
_Unwind_Word private_1;
|
||||
_Unwind_Word private_2;
|
||||
|
||||
/* @@@ The IA-64 ABI says that this structure must be double-word aligned.
|
||||
Taking that literally does not make much sense generically. Instead we
|
||||
provide the maximum alignment required by any type for the machine. */
|
||||
} __attribute__((__aligned__));
|
||||
|
||||
|
||||
/* The ACTIONS argument to the personality routine is a bitwise OR of one
|
||||
or more of the following constants. */
|
||||
typedef int _Unwind_Action;
|
||||
|
||||
#define _UA_SEARCH_PHASE 1
|
||||
#define _UA_CLEANUP_PHASE 2
|
||||
#define _UA_HANDLER_FRAME 4
|
||||
#define _UA_FORCE_UNWIND 8
|
||||
#define _UA_END_OF_STACK 16
|
||||
|
||||
/* This is an opaque type used to refer to a system-specific data
|
||||
structure used by the system unwinder. This context is created and
|
||||
destroyed by the system, and passed to the personality routine
|
||||
during unwinding. */
|
||||
struct _Unwind_Context;
|
||||
|
||||
/* Raise an exception, passing along the given exception object. */
|
||||
extern _Unwind_Reason_Code _Unwind_RaiseException (struct _Unwind_Exception *);
|
||||
|
||||
/* Raise an exception for forced unwinding. */
|
||||
|
||||
typedef _Unwind_Reason_Code (*_Unwind_Stop_Fn)
|
||||
(int, _Unwind_Action, _Unwind_Exception_Class,
|
||||
struct _Unwind_Exception *, struct _Unwind_Context *, void *);
|
||||
|
||||
extern _Unwind_Reason_Code _Unwind_ForcedUnwind (struct _Unwind_Exception *,
|
||||
_Unwind_Stop_Fn,
|
||||
void *);
|
||||
|
||||
/* Helper to invoke the exception_cleanup routine. */
|
||||
extern void _Unwind_DeleteException (struct _Unwind_Exception *);
|
||||
|
||||
/* Resume propagation of an existing exception. This is used after
|
||||
e.g. executing cleanup code, and not to implement rethrowing. */
|
||||
extern void _Unwind_Resume (struct _Unwind_Exception *);
|
||||
|
||||
/* @@@ Resume propagation of an FORCE_UNWIND exception, or to rethrow
|
||||
a normal exception that was handled. */
|
||||
extern _Unwind_Reason_Code _Unwind_Resume_or_Rethrow (struct _Unwind_Exception *);
|
||||
|
||||
/* @@@ Use unwind data to perform a stack backtrace. The trace callback
|
||||
is called for every stack frame in the call chain, but no cleanup
|
||||
actions are performed. */
|
||||
typedef _Unwind_Reason_Code (*_Unwind_Trace_Fn)
|
||||
(struct _Unwind_Context *, void *);
|
||||
|
||||
extern _Unwind_Reason_Code _Unwind_Backtrace (_Unwind_Trace_Fn, void *);
|
||||
|
||||
/* These functions are used for communicating information about the unwind
|
||||
context (i.e. the unwind descriptors and the user register state) between
|
||||
the unwind library and the personality routine and landing pad. Only
|
||||
selected registers maybe manipulated. */
|
||||
|
||||
extern _Unwind_Word _Unwind_GetGR (struct _Unwind_Context *, int);
|
||||
extern void _Unwind_SetGR (struct _Unwind_Context *, int, _Unwind_Word);
|
||||
|
||||
extern _Unwind_Ptr _Unwind_GetIP (struct _Unwind_Context *);
|
||||
extern _Unwind_Ptr _Unwind_GetIPInfo (struct _Unwind_Context *, int *);
|
||||
extern void _Unwind_SetIP (struct _Unwind_Context *, _Unwind_Ptr);
|
||||
|
||||
/* @@@ Retrieve the CFA of the given context. */
|
||||
extern _Unwind_Word _Unwind_GetCFA (struct _Unwind_Context *);
|
||||
|
||||
extern void *_Unwind_GetLanguageSpecificData (struct _Unwind_Context *);
|
||||
|
||||
extern _Unwind_Ptr _Unwind_GetRegionStart (struct _Unwind_Context *);
|
||||
|
||||
|
||||
/* The personality routine is the function in the C++ (or other language)
|
||||
runtime library which serves as an interface between the system unwind
|
||||
library and language-specific exception handling semantics. It is
|
||||
specific to the code fragment described by an unwind info block, and
|
||||
it is always referenced via the pointer in the unwind info block, and
|
||||
hence it has no ABI-specified name.
|
||||
|
||||
Note that this implies that two different C++ implementations can
|
||||
use different names, and have different contents in the language
|
||||
specific data area. Moreover, that the language specific data
|
||||
area contains no version info because name of the function invoked
|
||||
provides more effective versioning by detecting at link time the
|
||||
lack of code to handle the different data format. */
|
||||
|
||||
typedef _Unwind_Reason_Code (*_Unwind_Personality_Fn)
|
||||
(int, _Unwind_Action, _Unwind_Exception_Class,
|
||||
struct _Unwind_Exception *, struct _Unwind_Context *);
|
||||
|
||||
/* @@@ The following alternate entry points are for setjmp/longjmp
|
||||
based unwinding. */
|
||||
|
||||
struct SjLj_Function_Context;
|
||||
extern void _Unwind_SjLj_Register (struct SjLj_Function_Context *);
|
||||
extern void _Unwind_SjLj_Unregister (struct SjLj_Function_Context *);
|
||||
|
||||
extern _Unwind_Reason_Code _Unwind_SjLj_RaiseException
|
||||
(struct _Unwind_Exception *);
|
||||
extern _Unwind_Reason_Code _Unwind_SjLj_ForcedUnwind
|
||||
(struct _Unwind_Exception *, _Unwind_Stop_Fn, void *);
|
||||
extern void _Unwind_SjLj_Resume (struct _Unwind_Exception *);
|
||||
extern _Unwind_Reason_Code _Unwind_SjLj_Resume_or_Rethrow (struct _Unwind_Exception *);
|
||||
|
||||
/* @@@ The following provide access to the base addresses for text
|
||||
and data-relative addressing in the LDSA. In order to stay link
|
||||
compatible with the standard ABI for IA-64, we inline these. */
|
||||
|
||||
#ifdef __ia64__
|
||||
#include <stdlib.h>
|
||||
|
||||
static inline _Unwind_Ptr
|
||||
_Unwind_GetDataRelBase (struct _Unwind_Context *_C)
|
||||
{
|
||||
/* The GP is stored in R1. */
|
||||
return _Unwind_GetGR (_C, 1);
|
||||
}
|
||||
|
||||
static inline _Unwind_Ptr
|
||||
_Unwind_GetTextRelBase (struct _Unwind_Context *_C __attribute__ ((__unused__)))
|
||||
{
|
||||
abort ();
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* @@@ Retrieve the Backing Store Pointer of the given context. */
|
||||
extern _Unwind_Word _Unwind_GetBSP (struct _Unwind_Context *);
|
||||
#else
|
||||
extern _Unwind_Ptr _Unwind_GetDataRelBase (struct _Unwind_Context *);
|
||||
extern _Unwind_Ptr _Unwind_GetTextRelBase (struct _Unwind_Context *);
|
||||
#endif
|
||||
|
||||
/* @@@ Given an address, return the entry point of the function that
|
||||
contains it. */
|
||||
extern void * _Unwind_FindEnclosingFunction (void *pc);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifndef HIDE_EXPORTS
|
||||
#pragma GCC visibility pop
|
||||
#endif
|
||||
|
||||
#endif /* unwind.h */
|
14
patches/lua-5.1.5-disable_lua50_compat.patch
Normal file
14
patches/lua-5.1.5-disable_lua50_compat.patch
Normal file
@ -0,0 +1,14 @@
|
||||
--- lua-5.1.5/src/luaconf.h 2008-02-11 08:25:08.000000000 -0800
|
||||
+++ lua-5.1.5-patched/src/luaconf.h 2012-07-04 18:36:05.700067698 -0700
|
||||
@@ -757,6 +757,11 @@
|
||||
** without modifying the main part of the file.
|
||||
*/
|
||||
|
||||
+#undef LUA_COMPAT_VARARG
|
||||
+#undef LUA_COMPAT_MOD
|
||||
+#undef LUA_COMPAT_LSTR
|
||||
+#undef LUA_COMPAT_GFIND
|
||||
+#undef LUA_COMPAT_OPENLIB
|
||||
|
||||
|
||||
#endif
|
11
patches/lua-5.1.5-enable_debug_info.patch
Normal file
11
patches/lua-5.1.5-enable_debug_info.patch
Normal file
@ -0,0 +1,11 @@
|
||||
--- lua-5.1.5/src/Makefile 2012-02-13 12:41:22.000000000 -0800
|
||||
+++ lua-5.1.5-patched/src/Makefile 2013-04-20 22:56:42.921286886 -0700
|
||||
@@ -8,7 +8,7 @@
|
||||
PLAT= none
|
||||
|
||||
CC= gcc
|
||||
-CFLAGS= -O2 -Wall $(MYCFLAGS)
|
||||
+CFLAGS= -g -O2 -Wall $(MYCFLAGS)
|
||||
AR= ar rcu
|
||||
RANLIB= ranlib
|
||||
RM= rm -f
|
23
patches/lua-5.1.5-makefile_install_fix.patch
Normal file
23
patches/lua-5.1.5-makefile_install_fix.patch
Normal file
@ -0,0 +1,23 @@
|
||||
--- lua-5.1.5/Makefile 2008-08-12 08:40:48.000000000 +0800
|
||||
+++ lua-5.1.5-patched/Makefile 2011-03-09 20:56:47.603422483 +0800
|
||||
@@ -22,14 +22,14 @@
|
||||
|
||||
# How to install. If your install program does not support "-p", then you
|
||||
# may have to run ranlib on the installed liblua.a (do "make ranlib").
|
||||
-INSTALL= install -p
|
||||
-INSTALL_EXEC= $(INSTALL) -m 0755
|
||||
-INSTALL_DATA= $(INSTALL) -m 0644
|
||||
+#INSTALL= install -p
|
||||
+#INSTALL_EXEC= $(INSTALL) -m 0755
|
||||
+#INSTALL_DATA= $(INSTALL) -m 0644
|
||||
#
|
||||
# If you don't have install you can use cp instead.
|
||||
-# INSTALL= cp -p
|
||||
-# INSTALL_EXEC= $(INSTALL)
|
||||
-# INSTALL_DATA= $(INSTALL)
|
||||
+INSTALL= cp -p
|
||||
+INSTALL_EXEC= $(INSTALL)
|
||||
+INSTALL_DATA= $(INSTALL)
|
||||
|
||||
# Utilities.
|
||||
MKDIR= mkdir -p
|
13
patches/lua_cjson-1.0.2-array_detection_fix.patch
Normal file
13
patches/lua_cjson-1.0.2-array_detection_fix.patch
Normal file
@ -0,0 +1,13 @@
|
||||
diff --git a/lua_cjson.c b/lua_cjson.c
|
||||
index 4b1915a..b46e915 100644
|
||||
--- a/lua_cjson.c
|
||||
+++ b/lua_cjson.c
|
||||
@@ -501,7 +501,7 @@ static int lua_array_length(lua_State *l, json_config_t *cfg)
|
||||
/* table, startkey */
|
||||
while (lua_next(l, -2) != 0) {
|
||||
/* table, key, value */
|
||||
- if (lua_isnumber(l, -2) &&
|
||||
+ if (lua_type(l, -2) == LUA_TNUMBER &&
|
||||
(k = lua_tonumber(l, -2))) {
|
||||
/* Integer >= 1 ? */
|
||||
if (floor(k) == k && k >= 1) {
|
202
patches/luajit-2.0.0-2ad9834d.patch
Normal file
202
patches/luajit-2.0.0-2ad9834d.patch
Normal file
@ -0,0 +1,202 @@
|
||||
diff --git a/doc/ext_ffi_semantics.html b/doc/ext_ffi_semantics.html
|
||||
index bf9f9be..30aa964 100644
|
||||
--- a/doc/ext_ffi_semantics.html
|
||||
+++ b/doc/ext_ffi_semantics.html
|
||||
@@ -517,17 +517,17 @@ A VLA is only initialized with the element(s) given in the table.
|
||||
Depending on the use case, you may need to explicitly add a
|
||||
<tt>NULL</tt> or <tt>0</tt> terminator to a VLA.</li>
|
||||
|
||||
-<li>If the table has a non-empty hash part, a
|
||||
-<tt>struct</tt>/<tt>union</tt> is initialized by looking up each field
|
||||
-name (as a string key) in the table. Each non-<tt>nil</tt> value is
|
||||
-used to initialize the corresponding field.</li>
|
||||
-
|
||||
-<li>Otherwise a <tt>struct</tt>/<tt>union</tt> is initialized in the
|
||||
+<li>A <tt>struct</tt>/<tt>union</tt> can be initialized in the
|
||||
order of the declaration of its fields. Each field is initialized with
|
||||
-the consecutive table elements, starting at either index <tt>[0]</tt>
|
||||
+consecutive table elements, starting at either index <tt>[0]</tt>
|
||||
or <tt>[1]</tt>. This process stops at the first <tt>nil</tt> table
|
||||
element.</li>
|
||||
|
||||
+<li>Otherwise, if neither index <tt>[0]</tt> nor <tt>[1]</tt> is present,
|
||||
+a <tt>struct</tt>/<tt>union</tt> is initialized by looking up each field
|
||||
+name (as a string key) in the table. Each non-<tt>nil</tt> value is
|
||||
+used to initialize the corresponding field.</li>
|
||||
+
|
||||
<li>Uninitialized fields of a <tt>struct</tt> are filled with zero
|
||||
bytes, except for the trailing VLA of a VLS.</li>
|
||||
|
||||
diff --git a/doc/running.html b/doc/running.html
|
||||
index 7870a5d..97c5c03 100644
|
||||
--- a/doc/running.html
|
||||
+++ b/doc/running.html
|
||||
@@ -250,6 +250,8 @@ are enabled:
|
||||
<tr class="even">
|
||||
<td class="flag_name">abc</td><td class="flag_level"> </td><td class="flag_level"> </td><td class="flag_level">•</td><td class="flag_desc">Array Bounds Check Elimination</td></tr>
|
||||
<tr class="odd">
|
||||
+<td class="flag_name">sink</td><td class="flag_level"> </td><td class="flag_level"> </td><td class="flag_level">•</td><td class="flag_desc">Allocation/Store Sinking</td></tr>
|
||||
+<tr class="even">
|
||||
<td class="flag_name">fuse</td><td class="flag_level"> </td><td class="flag_level"> </td><td class="flag_level">•</td><td class="flag_desc">Fusion of operands into instructions</td></tr>
|
||||
</table>
|
||||
<p>
|
||||
diff --git a/src/lj_arch.h b/src/lj_arch.h
|
||||
index 25c2cff..220f3df 100644
|
||||
--- a/src/lj_arch.h
|
||||
+++ b/src/lj_arch.h
|
||||
@@ -300,7 +300,11 @@
|
||||
|
||||
/* Check target-specific constraints. */
|
||||
#ifndef _BUILDVM_H
|
||||
-#if LJ_TARGET_ARM
|
||||
+#if LJ_TARGET_X64
|
||||
+#if __USING_SJLJ_EXCEPTIONS__
|
||||
+#error "Need a C compiler with native exception handling on x64"
|
||||
+#endif
|
||||
+#elif LJ_TARGET_ARM
|
||||
#if defined(__ARMEB__)
|
||||
#error "No support for big-endian ARM"
|
||||
#endif
|
||||
diff --git a/src/lj_asm_x86.h b/src/lj_asm_x86.h
|
||||
index 6d7dd5a..241da5a 100644
|
||||
--- a/src/lj_asm_x86.h
|
||||
+++ b/src/lj_asm_x86.h
|
||||
@@ -367,6 +367,18 @@ static Reg asm_fuseload(ASMState *as, IRRef ref, RegSet allow)
|
||||
return ra_allocref(as, ref, allow);
|
||||
}
|
||||
|
||||
+#if LJ_64
|
||||
+/* Don't fuse a 32 bit load into a 64 bit operation. */
|
||||
+static Reg asm_fuseloadm(ASMState *as, IRRef ref, RegSet allow, int is64)
|
||||
+{
|
||||
+ if (is64 && !irt_is64(IR(ref)->t))
|
||||
+ return ra_alloc1(as, ref, allow);
|
||||
+ return asm_fuseload(as, ref, allow);
|
||||
+}
|
||||
+#else
|
||||
+#define asm_fuseloadm(as, ref, allow, is64) asm_fuseload(as, (ref), (allow))
|
||||
+#endif
|
||||
+
|
||||
/* -- Calls --------------------------------------------------------------- */
|
||||
|
||||
/* Count the required number of stack slots for a call. */
|
||||
@@ -696,7 +708,7 @@ static void asm_conv(ASMState *as, IRIns *ir)
|
||||
} else { /* Integer to FP conversion. */
|
||||
Reg left = (LJ_64 && (st == IRT_U32 || st == IRT_U64)) ?
|
||||
ra_alloc1(as, lref, RSET_GPR) :
|
||||
- asm_fuseload(as, lref, RSET_GPR);
|
||||
+ asm_fuseloadm(as, lref, RSET_GPR, st64);
|
||||
if (LJ_64 && st == IRT_U64) {
|
||||
MCLabel l_end = emit_label(as);
|
||||
const void *k = lj_ir_k64_find(as->J, U64x(43f00000,00000000));
|
||||
@@ -1829,7 +1841,7 @@ static void asm_intarith(ASMState *as, IRIns *ir, x86Arith xa)
|
||||
if (asm_swapops(as, ir)) {
|
||||
IRRef tmp = lref; lref = rref; rref = tmp;
|
||||
}
|
||||
- right = asm_fuseload(as, rref, rset_clear(allow, dest));
|
||||
+ right = asm_fuseloadm(as, rref, rset_clear(allow, dest), irt_is64(ir->t));
|
||||
}
|
||||
if (irt_isguard(ir->t)) /* For IR_ADDOV etc. */
|
||||
asm_guardcc(as, CC_O);
|
||||
@@ -1842,7 +1854,7 @@ static void asm_intarith(ASMState *as, IRIns *ir, x86Arith xa)
|
||||
emit_mrm(as, XO_IMUL, REX_64IR(ir, dest), right);
|
||||
} else { /* IMUL r, r, k. */
|
||||
/* NYI: use lea/shl/add/sub (FOLD only does 2^k) depending on CPU. */
|
||||
- Reg left = asm_fuseload(as, lref, RSET_GPR);
|
||||
+ Reg left = asm_fuseloadm(as, lref, RSET_GPR, irt_is64(ir->t));
|
||||
x86Op xo;
|
||||
if (checki8(k)) { emit_i8(as, k); xo = XO_IMULi8;
|
||||
} else { emit_i32(as, k); xo = XO_IMULi; }
|
||||
@@ -2072,7 +2084,7 @@ static void asm_comp(ASMState *as, IRIns *ir, uint32_t cc)
|
||||
Reg r64 = REX_64IR(ir, 0);
|
||||
int32_t imm = 0;
|
||||
lua_assert(irt_is64(ir->t) || irt_isint(ir->t) ||
|
||||
- irt_isu32(ir->t) || irt_isaddr(ir->t));
|
||||
+ irt_isu32(ir->t) || irt_isaddr(ir->t) || irt_isu8(ir->t));
|
||||
/* Swap constants (only for ABC) and fusable loads to the right. */
|
||||
if (irref_isk(lref) || (!irref_isk(rref) && opisfusableload(leftop))) {
|
||||
if ((cc & 0xc) == 0xc) cc ^= 0x53; /* L <-> G, LE <-> GE */
|
||||
@@ -2109,7 +2121,7 @@ static void asm_comp(ASMState *as, IRIns *ir, uint32_t cc)
|
||||
}
|
||||
}
|
||||
as->curins--; /* Skip to BAND to avoid failing in noconflict(). */
|
||||
- right = asm_fuseload(as, irl->op1, allow);
|
||||
+ right = asm_fuseloadm(as, irl->op1, allow, r64);
|
||||
as->curins++; /* Undo the above. */
|
||||
test_nofuse:
|
||||
asm_guardcc(as, cc);
|
||||
@@ -2146,7 +2158,7 @@ static void asm_comp(ASMState *as, IRIns *ir, uint32_t cc)
|
||||
return;
|
||||
} /* Otherwise handle register case as usual. */
|
||||
} else {
|
||||
- left = asm_fuseload(as, lref, RSET_GPR);
|
||||
+ left = asm_fuseloadm(as, lref, RSET_GPR, r64);
|
||||
}
|
||||
asm_guardcc(as, cc);
|
||||
if (usetest && left != RID_MRM) {
|
||||
@@ -2160,7 +2172,7 @@ static void asm_comp(ASMState *as, IRIns *ir, uint32_t cc)
|
||||
}
|
||||
} else {
|
||||
Reg left = ra_alloc1(as, lref, RSET_GPR);
|
||||
- Reg right = asm_fuseload(as, rref, rset_exclude(RSET_GPR, left));
|
||||
+ Reg right = asm_fuseloadm(as, rref, rset_exclude(RSET_GPR, left), r64);
|
||||
asm_guardcc(as, cc);
|
||||
emit_mrm(as, XO_CMP, r64 + left, right);
|
||||
}
|
||||
diff --git a/src/lj_cconv.c b/src/lj_cconv.c
|
||||
index b81b4e9..7b32e35 100644
|
||||
--- a/src/lj_cconv.c
|
||||
+++ b/src/lj_cconv.c
|
||||
@@ -493,17 +493,19 @@ static void cconv_substruct_tab(CTState *cts, CType *d, uint8_t *dp,
|
||||
id = df->sib;
|
||||
if (ctype_isfield(df->info) || ctype_isbitfield(df->info)) {
|
||||
TValue *tv;
|
||||
- int32_t i = *ip;
|
||||
+ int32_t i = *ip, iz = i;
|
||||
if (!gcref(df->name)) continue; /* Ignore unnamed fields. */
|
||||
if (i >= 0) {
|
||||
retry:
|
||||
tv = (TValue *)lj_tab_getint(t, i);
|
||||
if (!tv || tvisnil(tv)) {
|
||||
if (i == 0) { i = 1; goto retry; } /* 1-based tables. */
|
||||
+ if (iz == 0) { *ip = i = -1; goto tryname; } /* Init named fields. */
|
||||
break; /* Stop at first nil. */
|
||||
}
|
||||
*ip = i + 1;
|
||||
} else {
|
||||
+ tryname:
|
||||
tv = (TValue *)lj_tab_getstr(t, gco2str(gcref(df->name)));
|
||||
if (!tv || tvisnil(tv)) continue;
|
||||
}
|
||||
@@ -524,7 +526,6 @@ static void cconv_struct_tab(CTState *cts, CType *d,
|
||||
{
|
||||
int32_t i = 0;
|
||||
memset(dp, 0, d->size); /* Much simpler to clear the struct first. */
|
||||
- if (t->hmask) i = -1; else if (t->asize == 0) return; /* Fast exit. */
|
||||
cconv_substruct_tab(cts, d, dp, t, &i, flags);
|
||||
}
|
||||
|
||||
diff --git a/src/lj_err.c b/src/lj_err.c
|
||||
index 60d8fe1..fd3545e 100644
|
||||
--- a/src/lj_err.c
|
||||
+++ b/src/lj_err.c
|
||||
@@ -485,7 +485,6 @@ LJ_NOINLINE void lj_err_mem(lua_State *L)
|
||||
{
|
||||
if (L->status == LUA_ERRERR+1) /* Don't touch the stack during lua_open. */
|
||||
lj_vm_unwind_c(L->cframe, LUA_ERRMEM);
|
||||
- L->top = L->base;
|
||||
setstrV(L, L->top++, lj_err_str(L, LJ_ERR_ERRMEM));
|
||||
lj_err_throw(L, LUA_ERRMEM);
|
||||
}
|
||||
diff --git a/src/lj_parse.c b/src/lj_parse.c
|
||||
index 2fecaef..92ebc04 100644
|
||||
--- a/src/lj_parse.c
|
||||
+++ b/src/lj_parse.c
|
||||
@@ -1825,6 +1825,7 @@ static void expr_table(LexState *ls, ExpDesc *e)
|
||||
}
|
||||
}
|
||||
}
|
||||
+ lj_gc_check(fs->L);
|
||||
}
|
||||
}
|
||||
|
14
patches/luajit-win32-default-paths.patch
Normal file
14
patches/luajit-win32-default-paths.patch
Normal file
@ -0,0 +1,14 @@
|
||||
--- LuaJIT-2.1-20151028/src/luaconf.h 2015-10-12 20:28:56.000000000 +0800
|
||||
+++ LuaJIT-2.1-20151028.patched/src/luaconf.h 2015-11-01 20:31:28.358507706 +0800
|
||||
@@ -21,9 +21,9 @@
|
||||
#define LUA_LDIR "!\\lua\\"
|
||||
#define LUA_CDIR "!\\"
|
||||
#define LUA_PATH_DEFAULT \
|
||||
- ".\\?.lua;" LUA_LDIR"?.lua;" LUA_LDIR"?\\init.lua;"
|
||||
+ ".\\?.lua;" "!\\lualib\\?.lua;" LUA_LDIR"?.lua;" LUA_LDIR"?\\init.lua;"
|
||||
#define LUA_CPATH_DEFAULT \
|
||||
- ".\\?.dll;" LUA_CDIR"?.dll;" LUA_CDIR"loadall.dll"
|
||||
+ ".\\?.dll;" "!\\lualib\\?.so;" LUA_CDIR"?.dll;" LUA_CDIR"loadall.dll"
|
||||
#else
|
||||
/*
|
||||
** Note to distribution maintainers: do NOT patch the following lines!
|
117
patches/nginx-0.8.54-allow_request_body_updating.patch
Normal file
117
patches/nginx-0.8.54-allow_request_body_updating.patch
Normal file
@ -0,0 +1,117 @@
|
||||
diff -ur nginx-0.8.54/src/http/ngx_http_request_body.c nginx-0.8.54-patched/src/http/ngx_http_request_body.c
|
||||
--- nginx-0.8.54/src/http/ngx_http_request_body.c 2011-09-30 22:36:19.000000000 +0800
|
||||
+++ nginx-0.8.54-patched/src/http/ngx_http_request_body.c 2011-10-21 21:54:08.460350482 +0800
|
||||
@@ -38,7 +38,7 @@
|
||||
|
||||
r->main->count++;
|
||||
|
||||
- if (r->request_body || r->discard_body) {
|
||||
+ if (r->request_body || r->discard_body || r->content_length_n == 0) {
|
||||
post_handler(r);
|
||||
return NGX_OK;
|
||||
}
|
||||
@@ -440,7 +440,7 @@
|
||||
ssize_t size;
|
||||
ngx_event_t *rev;
|
||||
|
||||
- if (r != r->main || r->discard_body) {
|
||||
+ if (r != r->main || r->discard_body || r->content_length_n == 0) {
|
||||
return NGX_OK;
|
||||
}
|
||||
|
||||
@@ -456,20 +456,22 @@
|
||||
ngx_del_timer(rev);
|
||||
}
|
||||
|
||||
- if (r->headers_in.content_length_n <= 0 || r->request_body) {
|
||||
+ r->content_length_n = r->headers_in.content_length_n;
|
||||
+
|
||||
+ if (r->content_length_n <= 0 || r->request_body) {
|
||||
return NGX_OK;
|
||||
}
|
||||
|
||||
size = r->header_in->last - r->header_in->pos;
|
||||
|
||||
if (size) {
|
||||
- if (r->headers_in.content_length_n > size) {
|
||||
+ if (r->content_length_n > size) {
|
||||
r->header_in->pos += size;
|
||||
- r->headers_in.content_length_n -= size;
|
||||
+ r->content_length_n -= size;
|
||||
|
||||
} else {
|
||||
- r->header_in->pos += (size_t) r->headers_in.content_length_n;
|
||||
- r->headers_in.content_length_n = 0;
|
||||
+ r->header_in->pos += (size_t) r->content_length_n;
|
||||
+ r->content_length_n = 0;
|
||||
return NGX_OK;
|
||||
}
|
||||
}
|
||||
@@ -568,7 +570,7 @@
|
||||
"http read discarded body");
|
||||
|
||||
for ( ;; ) {
|
||||
- if (r->headers_in.content_length_n == 0) {
|
||||
+ if (r->content_length_n == 0) {
|
||||
r->read_event_handler = ngx_http_block_reading;
|
||||
return NGX_OK;
|
||||
}
|
||||
@@ -577,9 +579,9 @@
|
||||
return NGX_AGAIN;
|
||||
}
|
||||
|
||||
- size = (r->headers_in.content_length_n > NGX_HTTP_DISCARD_BUFFER_SIZE) ?
|
||||
+ size = (r->content_length_n > NGX_HTTP_DISCARD_BUFFER_SIZE) ?
|
||||
NGX_HTTP_DISCARD_BUFFER_SIZE:
|
||||
- (size_t) r->headers_in.content_length_n;
|
||||
+ (size_t) r->content_length_n;
|
||||
|
||||
n = r->connection->recv(r->connection, buffer, size);
|
||||
|
||||
@@ -596,7 +598,7 @@
|
||||
return NGX_OK;
|
||||
}
|
||||
|
||||
- r->headers_in.content_length_n -= n;
|
||||
+ r->content_length_n -= n;
|
||||
}
|
||||
}
|
||||
|
||||
Only in nginx-0.8.54-patched/src/http: ngx_http_request_body.c~
|
||||
diff -ur nginx-0.8.54/src/http/ngx_http_request.c nginx-0.8.54-patched/src/http/ngx_http_request.c
|
||||
--- nginx-0.8.54/src/http/ngx_http_request.c 2011-09-30 22:36:19.000000000 +0800
|
||||
+++ nginx-0.8.54-patched/src/http/ngx_http_request.c 2011-10-21 19:06:38.404350692 +0800
|
||||
@@ -286,6 +286,8 @@
|
||||
|
||||
r->pipeline = hc->pipeline;
|
||||
|
||||
+ r->content_length_n = -1;
|
||||
+
|
||||
if (hc->nbusy) {
|
||||
r->header_in = hc->busy[0];
|
||||
}
|
||||
@@ -297,6 +299,8 @@
|
||||
return;
|
||||
}
|
||||
|
||||
+ r->content_length_n = -1;
|
||||
+
|
||||
hc->request = r;
|
||||
}
|
||||
|
||||
Only in nginx-0.8.54-patched/src/http: ngx_http_request.c~
|
||||
diff -ur nginx-0.8.54/src/http/ngx_http_request.h nginx-0.8.54-patched/src/http/ngx_http_request.h
|
||||
--- nginx-0.8.54/src/http/ngx_http_request.h 2011-08-29 18:39:23.000000000 +0800
|
||||
+++ nginx-0.8.54-patched/src/http/ngx_http_request.h 2011-10-21 17:26:13.203807584 +0800
|
||||
@@ -366,6 +366,9 @@
|
||||
ngx_pool_t *pool;
|
||||
ngx_buf_t *header_in;
|
||||
|
||||
+ off_t content_length_n;
|
||||
+ /* for discarding request body */
|
||||
+
|
||||
ngx_http_headers_in_t headers_in;
|
||||
ngx_http_headers_out_t headers_out;
|
||||
|
||||
Only in nginx-0.8.54-patched/src/http: ngx_http_request.h~
|
||||
Only in nginx-0.8.54-patched/src/http: tags
|
12
patches/nginx-0.8.54-named_location_clear_mods_ctx.patch
Normal file
12
patches/nginx-0.8.54-named_location_clear_mods_ctx.patch
Normal file
@ -0,0 +1,12 @@
|
||||
--- nginx-0.8.54/src/http/ngx_http_core_module.c 2011-09-27 19:14:02.000000000 +0800
|
||||
+++ nginx-0.8.54-patched/src/http/ngx_http_core_module.c 2011-10-13 15:02:24.414550532 +0800
|
||||
@@ -2542,6 +2542,9 @@
|
||||
r->content_handler = NULL;
|
||||
r->loc_conf = (*clcfp)->loc_conf;
|
||||
|
||||
+ /* clear the modules contexts */
|
||||
+ ngx_memzero(r->ctx, sizeof(void *) * ngx_http_max_module);
|
||||
+
|
||||
ngx_http_update_location_config(r);
|
||||
|
||||
cmcf = ngx_http_get_module_main_conf(r, ngx_http_core_module);
|
69
patches/nginx-0.8.54-variable_header_ignore_no_hash.patch
Normal file
69
patches/nginx-0.8.54-variable_header_ignore_no_hash.patch
Normal file
@ -0,0 +1,69 @@
|
||||
--- nginx-0.8.54/src/http/ngx_http_variables.c 2011-05-30 05:36:17.000000000 -0700
|
||||
+++ nginx-0.8.54-patched/src/http/ngx_http_variables.c 2011-09-30 10:59:05.000000000 -0700
|
||||
@@ -648,7 +648,17 @@
|
||||
|
||||
a = (ngx_array_t *) ((char *) r + data);
|
||||
|
||||
- n = a->nelts;
|
||||
+ h = a->elts;
|
||||
+ n = 0;
|
||||
+
|
||||
+ for (i = 0; i < a->nelts; i++) {
|
||||
+
|
||||
+ if (h[i]->hash == 0) {
|
||||
+ continue;
|
||||
+ }
|
||||
+
|
||||
+ n++;
|
||||
+ }
|
||||
|
||||
if (n == 0) {
|
||||
v->not_found = 1;
|
||||
@@ -659,9 +669,7 @@
|
||||
v->no_cacheable = 0;
|
||||
v->not_found = 0;
|
||||
|
||||
- h = a->elts;
|
||||
-
|
||||
- if (n == 1) {
|
||||
+ if (n == 1 && a->nelts == 1) {
|
||||
v->len = (*h)->value.len;
|
||||
v->data = (*h)->value.data;
|
||||
|
||||
@@ -670,7 +678,12 @@
|
||||
|
||||
len = - (ssize_t) (sizeof("; ") - 1);
|
||||
|
||||
- for (i = 0; i < n; i++) {
|
||||
+ for (i = 0; i < a->nelts; i++) {
|
||||
+
|
||||
+ if (h[i]->hash == 0) {
|
||||
+ continue;
|
||||
+ }
|
||||
+
|
||||
len += h[i]->value.len + sizeof("; ") - 1;
|
||||
}
|
||||
|
||||
@@ -683,6 +696,11 @@
|
||||
v->data = p;
|
||||
|
||||
for (i = 0; /* void */ ; i++) {
|
||||
+
|
||||
+ if (h[i]->hash == 0) {
|
||||
+ continue;
|
||||
+ }
|
||||
+
|
||||
p = ngx_copy(p, h[i]->value.data, h[i]->value.len);
|
||||
|
||||
if (i == n - 1) {
|
||||
@@ -738,6 +756,10 @@
|
||||
i = 0;
|
||||
}
|
||||
|
||||
+ if (header[i].hash == 0) {
|
||||
+ continue;
|
||||
+ }
|
||||
+
|
||||
for (n = 0; n + prefix < var->len && n < header[i].key.len; n++) {
|
||||
ch = header[i].key.data[n];
|
||||
|
117
patches/nginx-1.0.10-allow_request_body_updating.patch
Normal file
117
patches/nginx-1.0.10-allow_request_body_updating.patch
Normal file
@ -0,0 +1,117 @@
|
||||
diff -ur nginx-1.0.10/src/http/ngx_http_request_body.c nginx-1.0.10-patched/src/http/ngx_http_request_body.c
|
||||
--- nginx-1.0.10/src/http/ngx_http_request_body.c 2011-09-30 22:36:19.000000000 +0800
|
||||
+++ nginx-1.0.10-patched/src/http/ngx_http_request_body.c 2011-10-21 21:54:08.460350482 +0800
|
||||
@@ -38,7 +38,7 @@
|
||||
|
||||
r->main->count++;
|
||||
|
||||
- if (r->request_body || r->discard_body) {
|
||||
+ if (r->request_body || r->discard_body || r->content_length_n == 0) {
|
||||
post_handler(r);
|
||||
return NGX_OK;
|
||||
}
|
||||
@@ -440,7 +440,7 @@
|
||||
ssize_t size;
|
||||
ngx_event_t *rev;
|
||||
|
||||
- if (r != r->main || r->discard_body) {
|
||||
+ if (r != r->main || r->discard_body || r->content_length_n == 0) {
|
||||
return NGX_OK;
|
||||
}
|
||||
|
||||
@@ -456,20 +456,22 @@
|
||||
ngx_del_timer(rev);
|
||||
}
|
||||
|
||||
- if (r->headers_in.content_length_n <= 0 || r->request_body) {
|
||||
+ r->content_length_n = r->headers_in.content_length_n;
|
||||
+
|
||||
+ if (r->content_length_n <= 0 || r->request_body) {
|
||||
return NGX_OK;
|
||||
}
|
||||
|
||||
size = r->header_in->last - r->header_in->pos;
|
||||
|
||||
if (size) {
|
||||
- if (r->headers_in.content_length_n > size) {
|
||||
+ if (r->content_length_n > size) {
|
||||
r->header_in->pos += size;
|
||||
- r->headers_in.content_length_n -= size;
|
||||
+ r->content_length_n -= size;
|
||||
|
||||
} else {
|
||||
- r->header_in->pos += (size_t) r->headers_in.content_length_n;
|
||||
- r->headers_in.content_length_n = 0;
|
||||
+ r->header_in->pos += (size_t) r->content_length_n;
|
||||
+ r->content_length_n = 0;
|
||||
return NGX_OK;
|
||||
}
|
||||
}
|
||||
@@ -568,7 +570,7 @@
|
||||
"http read discarded body");
|
||||
|
||||
for ( ;; ) {
|
||||
- if (r->headers_in.content_length_n == 0) {
|
||||
+ if (r->content_length_n == 0) {
|
||||
r->read_event_handler = ngx_http_block_reading;
|
||||
return NGX_OK;
|
||||
}
|
||||
@@ -577,9 +579,9 @@
|
||||
return NGX_AGAIN;
|
||||
}
|
||||
|
||||
- size = (r->headers_in.content_length_n > NGX_HTTP_DISCARD_BUFFER_SIZE) ?
|
||||
+ size = (r->content_length_n > NGX_HTTP_DISCARD_BUFFER_SIZE) ?
|
||||
NGX_HTTP_DISCARD_BUFFER_SIZE:
|
||||
- (size_t) r->headers_in.content_length_n;
|
||||
+ (size_t) r->content_length_n;
|
||||
|
||||
n = r->connection->recv(r->connection, buffer, size);
|
||||
|
||||
@@ -596,7 +598,7 @@
|
||||
return NGX_OK;
|
||||
}
|
||||
|
||||
- r->headers_in.content_length_n -= n;
|
||||
+ r->content_length_n -= n;
|
||||
}
|
||||
}
|
||||
|
||||
Only in nginx-1.0.10-patched/src/http: ngx_http_request_body.c~
|
||||
diff -ur nginx-1.0.10/src/http/ngx_http_request.c nginx-1.0.10-patched/src/http/ngx_http_request.c
|
||||
--- nginx-1.0.10/src/http/ngx_http_request.c 2011-09-30 22:36:19.000000000 +0800
|
||||
+++ nginx-1.0.10-patched/src/http/ngx_http_request.c 2011-10-21 19:06:38.404350692 +0800
|
||||
@@ -286,6 +286,8 @@
|
||||
|
||||
r->pipeline = hc->pipeline;
|
||||
|
||||
+ r->content_length_n = -1;
|
||||
+
|
||||
if (hc->nbusy) {
|
||||
r->header_in = hc->busy[0];
|
||||
}
|
||||
@@ -297,6 +299,8 @@
|
||||
return;
|
||||
}
|
||||
|
||||
+ r->content_length_n = -1;
|
||||
+
|
||||
hc->request = r;
|
||||
}
|
||||
|
||||
Only in nginx-1.0.10-patched/src/http: ngx_http_request.c~
|
||||
diff -ur nginx-1.0.10/src/http/ngx_http_request.h nginx-1.0.10-patched/src/http/ngx_http_request.h
|
||||
--- nginx-1.0.10/src/http/ngx_http_request.h 2011-08-29 18:39:23.000000000 +0800
|
||||
+++ nginx-1.0.10-patched/src/http/ngx_http_request.h 2011-10-21 17:26:13.203807584 +0800
|
||||
@@ -366,6 +366,9 @@
|
||||
ngx_pool_t *pool;
|
||||
ngx_buf_t *header_in;
|
||||
|
||||
+ off_t content_length_n;
|
||||
+ /* for discarding request body */
|
||||
+
|
||||
ngx_http_headers_in_t headers_in;
|
||||
ngx_http_headers_out_t headers_out;
|
||||
|
||||
Only in nginx-1.0.10-patched/src/http: ngx_http_request.h~
|
||||
Only in nginx-1.0.10-patched/src/http: tags
|
20
patches/nginx-1.0.10-epoll_check_stale_wev.patch
Normal file
20
patches/nginx-1.0.10-epoll_check_stale_wev.patch
Normal file
@ -0,0 +1,20 @@
|
||||
--- nginx-1.0.10/src/event/modules/ngx_epoll_module.c 2011-09-30 22:12:53.000000000 +0800
|
||||
+++ nginx-1.0.10-patched/src/event/modules/ngx_epoll_module.c 2011-11-30 11:08:46.775817019 +0800
|
||||
@@ -682,6 +682,17 @@
|
||||
wev = c->write;
|
||||
|
||||
if ((revents & EPOLLOUT) && wev->active) {
|
||||
+ if (c->fd == -1 || wev->instance != instance) {
|
||||
+
|
||||
+ /*
|
||||
+ * the stale event from a file descriptor
|
||||
+ * that was just closed in this iteration
|
||||
+ */
|
||||
+
|
||||
+ ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0,
|
||||
+ "epoll: stale event %p", c);
|
||||
+ continue;
|
||||
+ }
|
||||
|
||||
if (flags & NGX_POST_THREAD_EVENTS) {
|
||||
wev->posted_ready = 1;
|
69
patches/nginx-1.0.10-gzip_empty_flush_buf.patch
Normal file
69
patches/nginx-1.0.10-gzip_empty_flush_buf.patch
Normal file
@ -0,0 +1,69 @@
|
||||
# HG changeset patch
|
||||
# User Maxim Dounin <mdounin@mdounin.ru>
|
||||
# Date 1315324342 -14400
|
||||
# Node ID 4cf0af103bc382a78f894302d1706929a79df4bb
|
||||
# Parent d603ce98fada855f0100b422b7b5672fd22fabea
|
||||
Gzip filter: handle empty flush buffers.
|
||||
|
||||
Empty flush buffers are legitimate and may happen e.g. due to $r->flush()
|
||||
calls in embedded perl. If there are no data buffered in zlib deflate()
|
||||
will return Z_BUF_ERROR (i.e. no progress possible) without adding anything
|
||||
to output. Don't treat Z_BUF_ERROR as fatal and correctly send empty flush
|
||||
buffer if we have no data in output at all.
|
||||
|
||||
See this thread for details:
|
||||
http://mailman.nginx.org/pipermail/nginx/2010-November/023693.html
|
||||
|
||||
diff --git a/src/http/modules/ngx_http_gzip_filter_module.c b/src/http/modules/ngx_http_gzip_filter_module.c
|
||||
--- a/src/http/modules/ngx_http_gzip_filter_module.c
|
||||
+++ b/src/http/modules/ngx_http_gzip_filter_module.c
|
||||
@@ -758,6 +758,7 @@ static ngx_int_t
|
||||
ngx_http_gzip_filter_deflate(ngx_http_request_t *r, ngx_http_gzip_ctx_t *ctx)
|
||||
{
|
||||
int rc;
|
||||
+ ngx_buf_t *b;
|
||||
ngx_chain_t *cl;
|
||||
ngx_http_gzip_conf_t *conf;
|
||||
|
||||
@@ -769,7 +770,7 @@ ngx_http_gzip_filter_deflate(ngx_http_re
|
||||
|
||||
rc = deflate(&ctx->zstream, ctx->flush);
|
||||
|
||||
- if (rc != Z_OK && rc != Z_STREAM_END) {
|
||||
+ if (rc != Z_OK && rc != Z_STREAM_END && rc != Z_BUF_ERROR) {
|
||||
ngx_log_error(NGX_LOG_ALERT, r->connection->log, 0,
|
||||
"deflate() failed: %d, %d", ctx->flush, rc);
|
||||
return NGX_ERROR;
|
||||
@@ -818,8 +819,6 @@ ngx_http_gzip_filter_deflate(ngx_http_re
|
||||
|
||||
if (ctx->flush == Z_SYNC_FLUSH) {
|
||||
|
||||
- ctx->zstream.avail_out = 0;
|
||||
- ctx->out_buf->flush = 1;
|
||||
ctx->flush = Z_NO_FLUSH;
|
||||
|
||||
cl = ngx_alloc_chain_link(r->pool);
|
||||
@@ -827,7 +826,22 @@ ngx_http_gzip_filter_deflate(ngx_http_re
|
||||
return NGX_ERROR;
|
||||
}
|
||||
|
||||
- cl->buf = ctx->out_buf;
|
||||
+ b = ctx->out_buf;
|
||||
+
|
||||
+ if (ngx_buf_size(b) == 0) {
|
||||
+
|
||||
+ b = ngx_calloc_buf(ctx->request->pool);
|
||||
+ if (b == NULL) {
|
||||
+ return NGX_ERROR;
|
||||
+ }
|
||||
+
|
||||
+ } else {
|
||||
+ ctx->zstream.avail_out = 0;
|
||||
+ }
|
||||
+
|
||||
+ b->flush = 1;
|
||||
+
|
||||
+ cl->buf = b;
|
||||
cl->next = NULL;
|
||||
*ctx->last_out = cl;
|
||||
ctx->last_out = &cl->next;
|
115
patches/nginx-1.0.10-log_escape_non_ascii.patch
Normal file
115
patches/nginx-1.0.10-log_escape_non_ascii.patch
Normal file
@ -0,0 +1,115 @@
|
||||
--- nginx-1.0.10/src/http/modules/ngx_http_log_module.c 2011-11-01 21:24:50.000000000 +0800
|
||||
+++ nginx-1.0.10-patched/src/http/modules/ngx_http_log_module.c 2011-11-10 16:17:29.599039534 +0800
|
||||
@@ -61,6 +61,8 @@
|
||||
time_t open_file_cache_valid;
|
||||
ngx_uint_t open_file_cache_min_uses;
|
||||
|
||||
+ ngx_flag_t escape_non_ascii;
|
||||
+
|
||||
ngx_uint_t off; /* unsigned off:1 */
|
||||
} ngx_http_log_loc_conf_t;
|
||||
|
||||
@@ -104,7 +106,8 @@
|
||||
uintptr_t data);
|
||||
static u_char *ngx_http_log_variable(ngx_http_request_t *r, u_char *buf,
|
||||
ngx_http_log_op_t *op);
|
||||
-static uintptr_t ngx_http_log_escape(u_char *dst, u_char *src, size_t size);
|
||||
+static uintptr_t ngx_http_log_escape(ngx_http_log_loc_conf_t *lcf, u_char *dst,
|
||||
+ u_char *src, size_t size);
|
||||
|
||||
|
||||
static void *ngx_http_log_create_main_conf(ngx_conf_t *cf);
|
||||
@@ -146,6 +149,13 @@
|
||||
0,
|
||||
NULL },
|
||||
|
||||
+ { ngx_string("log_escape_non_ascii"),
|
||||
+ NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,
|
||||
+ ngx_conf_set_flag_slot,
|
||||
+ NGX_HTTP_LOC_CONF_OFFSET,
|
||||
+ offsetof(ngx_http_log_loc_conf_t, escape_non_ascii),
|
||||
+ NULL },
|
||||
+
|
||||
ngx_null_command
|
||||
};
|
||||
|
||||
@@ -637,6 +647,7 @@
|
||||
ngx_http_log_variable_getlen(ngx_http_request_t *r, uintptr_t data)
|
||||
{
|
||||
uintptr_t len;
|
||||
+ ngx_http_log_loc_conf_t *lcf;
|
||||
ngx_http_variable_value_t *value;
|
||||
|
||||
value = ngx_http_get_indexed_variable(r, data);
|
||||
@@ -645,7 +656,9 @@
|
||||
return 1;
|
||||
}
|
||||
|
||||
- len = ngx_http_log_escape(NULL, value->data, value->len);
|
||||
+ lcf = ngx_http_get_module_loc_conf(r, ngx_http_log_module);
|
||||
+
|
||||
+ len = ngx_http_log_escape(lcf, NULL, value->data, value->len);
|
||||
|
||||
value->escape = len ? 1 : 0;
|
||||
|
||||
@@ -656,6 +669,7 @@
|
||||
static u_char *
|
||||
ngx_http_log_variable(ngx_http_request_t *r, u_char *buf, ngx_http_log_op_t *op)
|
||||
{
|
||||
+ ngx_http_log_loc_conf_t *lcf;
|
||||
ngx_http_variable_value_t *value;
|
||||
|
||||
value = ngx_http_get_indexed_variable(r, op->data);
|
||||
@@ -669,16 +683,18 @@
|
||||
return ngx_cpymem(buf, value->data, value->len);
|
||||
|
||||
} else {
|
||||
- return (u_char *) ngx_http_log_escape(buf, value->data, value->len);
|
||||
+ lcf = ngx_http_get_module_loc_conf(r, ngx_http_log_module);
|
||||
+ return (u_char *) ngx_http_log_escape(lcf, buf, value->data, value->len);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static uintptr_t
|
||||
-ngx_http_log_escape(u_char *dst, u_char *src, size_t size)
|
||||
+ngx_http_log_escape(ngx_http_log_loc_conf_t *lcf, u_char *dst, u_char *src,
|
||||
+ size_t size)
|
||||
{
|
||||
- ngx_uint_t n;
|
||||
- static u_char hex[] = "0123456789ABCDEF";
|
||||
+ ngx_uint_t n;
|
||||
+ static u_char hex[] = "0123456789ABCDEF";
|
||||
|
||||
static uint32_t escape[] = {
|
||||
0xffffffff, /* 1111 1111 1111 1111 1111 1111 1111 1111 */
|
||||
@@ -698,6 +714,12 @@
|
||||
0xffffffff, /* 1111 1111 1111 1111 1111 1111 1111 1111 */
|
||||
};
|
||||
|
||||
+ if (lcf->escape_non_ascii) {
|
||||
+ ngx_memset(&escape[4], 0xff, sizeof(uint32_t) * 4);
|
||||
+
|
||||
+ } else {
|
||||
+ ngx_memzero(&escape[4], sizeof(uint32_t) * 4);
|
||||
+ }
|
||||
|
||||
if (dst == NULL) {
|
||||
|
||||
@@ -781,6 +803,7 @@
|
||||
}
|
||||
|
||||
conf->open_file_cache = NGX_CONF_UNSET_PTR;
|
||||
+ conf->escape_non_ascii = NGX_CONF_UNSET;
|
||||
|
||||
return conf;
|
||||
}
|
||||
@@ -796,6 +819,8 @@
|
||||
ngx_http_log_fmt_t *fmt;
|
||||
ngx_http_log_main_conf_t *lmcf;
|
||||
|
||||
+ ngx_conf_merge_value(conf->escape_non_ascii, prev->escape_non_ascii, 1);
|
||||
+
|
||||
if (conf->open_file_cache == NGX_CONF_UNSET_PTR) {
|
||||
|
||||
conf->open_file_cache = prev->open_file_cache;
|
12
patches/nginx-1.0.10-named_location_clear_mods_ctx.patch
Normal file
12
patches/nginx-1.0.10-named_location_clear_mods_ctx.patch
Normal file
@ -0,0 +1,12 @@
|
||||
--- nginx-1.0.10/src/http/ngx_http_core_module.c 2011-09-27 19:14:02.000000000 +0800
|
||||
+++ nginx-1.0.10-patched/src/http/ngx_http_core_module.c 2011-10-13 15:02:24.414550532 +0800
|
||||
@@ -2542,6 +2542,9 @@
|
||||
r->content_handler = NULL;
|
||||
r->loc_conf = (*clcfp)->loc_conf;
|
||||
|
||||
+ /* clear the modules contexts */
|
||||
+ ngx_memzero(r->ctx, sizeof(void *) * ngx_http_max_module);
|
||||
+
|
||||
ngx_http_update_location_config(r);
|
||||
|
||||
cmcf = ngx_http_get_module_main_conf(r, ngx_http_core_module);
|
24
patches/nginx-1.0.10-no_Werror.patch
Normal file
24
patches/nginx-1.0.10-no_Werror.patch
Normal file
@ -0,0 +1,24 @@
|
||||
diff -ur nginx-1.0.10/auto/cc/gcc nginx-1.0.10-patched/auto/cc/gcc
|
||||
--- nginx-1.0.10/auto/cc/gcc 2011-06-27 19:53:00.205737804 +0800
|
||||
+++ nginx-1.0.10-patched/auto/cc/gcc 2011-06-27 19:53:13.837741087 +0800
|
||||
@@ -169,7 +169,7 @@
|
||||
|
||||
|
||||
# stop on warning
|
||||
-CFLAGS="$CFLAGS -Werror"
|
||||
+#CFLAGS="$CFLAGS -Werror"
|
||||
|
||||
# debug
|
||||
CFLAGS="$CFLAGS -g"
|
||||
diff -ur nginx-1.0.10/auto/cc/icc nginx-1.0.10-patched/auto/cc/icc
|
||||
--- nginx-1.0.10/auto/cc/icc 2011-06-27 19:52:56.370157068 +0800
|
||||
+++ nginx-1.0.10-patched/auto/cc/icc 2011-06-27 19:53:19.508916811 +0800
|
||||
@@ -139,7 +139,7 @@
|
||||
esac
|
||||
|
||||
# stop on warning
|
||||
-CFLAGS="$CFLAGS -Werror"
|
||||
+#CFLAGS="$CFLAGS -Werror"
|
||||
|
||||
# debug
|
||||
CFLAGS="$CFLAGS -g"
|
90
patches/nginx-1.0.10-no_error_pages.patch
Normal file
90
patches/nginx-1.0.10-no_error_pages.patch
Normal file
@ -0,0 +1,90 @@
|
||||
--- nginx-1.0.10/src/http/ngx_http_core_module.c 2010-12-14 18:38:42.000000000 +0800
|
||||
+++ nginx-1.0.10-patched/src/http/ngx_http_core_module.c 2011-01-30 19:24:34.956354518 +0800
|
||||
@@ -57,6 +57,8 @@
|
||||
void *conf);
|
||||
static char *ngx_http_core_error_page(ngx_conf_t *cf, ngx_command_t *cmd,
|
||||
void *conf);
|
||||
+static char *ngx_http_core_no_error_pages(ngx_conf_t *cf, ngx_command_t *cmd,
|
||||
+ void *conf);
|
||||
static char *ngx_http_core_try_files(ngx_conf_t *cf, ngx_command_t *cmd,
|
||||
void *conf);
|
||||
static char *ngx_http_core_open_file_cache(ngx_conf_t *cf, ngx_command_t *cmd,
|
||||
@@ -614,6 +616,14 @@
|
||||
0,
|
||||
NULL },
|
||||
|
||||
+ { ngx_string("no_error_pages"),
|
||||
+ NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF
|
||||
+ |NGX_CONF_NOARGS,
|
||||
+ ngx_http_core_no_error_pages,
|
||||
+ NGX_HTTP_LOC_CONF_OFFSET,
|
||||
+ 0,
|
||||
+ NULL },
|
||||
+
|
||||
{ ngx_string("try_files"),
|
||||
NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_2MORE,
|
||||
ngx_http_core_try_files,
|
||||
@@ -3052,7 +3062,6 @@
|
||||
* clcf->types = NULL;
|
||||
* clcf->default_type = { 0, NULL };
|
||||
* clcf->error_log = NULL;
|
||||
- * clcf->error_pages = NULL;
|
||||
* clcf->try_files = NULL;
|
||||
* clcf->client_body_path = NULL;
|
||||
* clcf->regex = NULL;
|
||||
@@ -3062,6 +3071,7 @@
|
||||
* clcf->gzip_proxied = 0;
|
||||
*/
|
||||
|
||||
+ clcf->error_pages = NGX_CONF_UNSET_PTR;
|
||||
clcf->client_max_body_size = NGX_CONF_UNSET;
|
||||
clcf->client_body_buffer_size = NGX_CONF_UNSET_SIZE;
|
||||
clcf->client_body_timeout = NGX_CONF_UNSET_MSEC;
|
||||
@@ -3250,9 +3260,7 @@
|
||||
}
|
||||
}
|
||||
|
||||
- if (conf->error_pages == NULL && prev->error_pages) {
|
||||
- conf->error_pages = prev->error_pages;
|
||||
- }
|
||||
+ ngx_conf_merge_ptr_value(conf->error_pages, prev->error_pages, NULL);
|
||||
|
||||
ngx_conf_merge_str_value(conf->default_type,
|
||||
prev->default_type, "text/plain");
|
||||
@@ -3988,6 +3996,10 @@
|
||||
ngx_http_compile_complex_value_t ccv;
|
||||
|
||||
if (clcf->error_pages == NULL) {
|
||||
+ return "conflicts with \"no_error_pages\"";
|
||||
+ }
|
||||
+
|
||||
+ if (clcf->error_pages == NGX_CONF_UNSET_PTR) {
|
||||
clcf->error_pages = ngx_array_create(cf->pool, 4,
|
||||
sizeof(ngx_http_err_page_t));
|
||||
if (clcf->error_pages == NULL) {
|
||||
@@ -4095,6 +4107,25 @@
|
||||
|
||||
|
||||
static char *
|
||||
+ngx_http_core_no_error_pages(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
|
||||
+{
|
||||
+ ngx_http_core_loc_conf_t *clcf = conf;
|
||||
+
|
||||
+ if (clcf->error_pages == NULL) {
|
||||
+ return "is duplicate";
|
||||
+ }
|
||||
+
|
||||
+ if (clcf->error_pages != NGX_CONF_UNSET_PTR) {
|
||||
+ return "conflicts with \"error_page\"";
|
||||
+ }
|
||||
+
|
||||
+ clcf->error_pages = NULL;
|
||||
+
|
||||
+ return NGX_CONF_OK;
|
||||
+}
|
||||
+
|
||||
+
|
||||
+static char *
|
||||
ngx_http_core_try_files(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
|
||||
{
|
||||
ngx_http_core_loc_conf_t *clcf = conf;
|
504
patches/nginx-1.0.10-no_pool.patch
Normal file
504
patches/nginx-1.0.10-no_pool.patch
Normal file
@ -0,0 +1,504 @@
|
||||
diff -ur nginx-1.0.10/src/core/nginx.h nginx-1.0.10-patched/src/core/nginx.h
|
||||
--- nginx-1.0.10/src/core/nginx.h 2011-08-29 17:30:22.000000000 +0800
|
||||
+++ nginx-1.0.10-patched/src/core/nginx.h 2011-09-13 12:11:03.135622101 +0800
|
||||
@@ -10,7 +10,7 @@
|
||||
|
||||
|
||||
#define nginx_version 1000010
|
||||
#define NGINX_VERSION "1.0.10"
|
||||
-#define NGINX_VER "ngx_openresty/" NGINX_VERSION ".unknown"
|
||||
+#define NGINX_VER "ngx_openresty/" NGINX_VERSION ".unknown (no pool)"
|
||||
|
||||
#define NGINX_VAR "NGINX"
|
||||
diff -ur nginx-1.0.10/src/core/ngx_array.c nginx-1.0.10-patched/src/core/ngx_array.c
|
||||
--- nginx-1.0.10/src/core/ngx_array.c 2008-06-17 23:00:30.000000000 +0800
|
||||
+++ nginx-1.0.10-patched/src/core/ngx_array.c 2011-09-14 12:02:56.263128538 +0800
|
||||
@@ -39,13 +39,7 @@
|
||||
|
||||
p = a->pool;
|
||||
|
||||
- if ((u_char *) a->elts + a->size * a->nalloc == p->d.last) {
|
||||
- p->d.last -= a->size * a->nalloc;
|
||||
- }
|
||||
-
|
||||
- if ((u_char *) a + sizeof(ngx_array_t) == p->d.last) {
|
||||
- p->d.last = (u_char *) a;
|
||||
- }
|
||||
+ ngx_pfree(p, a);
|
||||
}
|
||||
|
||||
|
||||
@@ -64,29 +58,17 @@
|
||||
|
||||
p = a->pool;
|
||||
|
||||
- if ((u_char *) a->elts + size == p->d.last
|
||||
- && p->d.last + a->size <= p->d.end)
|
||||
- {
|
||||
- /*
|
||||
- * the array allocation is the last in the pool
|
||||
- * and there is space for new allocation
|
||||
- */
|
||||
-
|
||||
- p->d.last += a->size;
|
||||
- a->nalloc++;
|
||||
-
|
||||
- } else {
|
||||
- /* allocate a new array */
|
||||
-
|
||||
- new = ngx_palloc(p, 2 * size);
|
||||
- if (new == NULL) {
|
||||
- return NULL;
|
||||
- }
|
||||
-
|
||||
- ngx_memcpy(new, a->elts, size);
|
||||
- a->elts = new;
|
||||
- a->nalloc *= 2;
|
||||
+ /* allocate a new array */
|
||||
+
|
||||
+ new = ngx_palloc(p, 2 * size);
|
||||
+ if (new == NULL) {
|
||||
+ return NULL;
|
||||
}
|
||||
+
|
||||
+ ngx_memcpy(new, a->elts, size);
|
||||
+ a->elts = new;
|
||||
+ a->nalloc *= 2;
|
||||
+
|
||||
}
|
||||
|
||||
elt = (u_char *) a->elts + a->size * a->nelts;
|
||||
@@ -100,43 +82,25 @@
|
||||
ngx_array_push_n(ngx_array_t *a, ngx_uint_t n)
|
||||
{
|
||||
void *elt, *new;
|
||||
- size_t size;
|
||||
ngx_uint_t nalloc;
|
||||
ngx_pool_t *p;
|
||||
|
||||
- size = n * a->size;
|
||||
-
|
||||
if (a->nelts + n > a->nalloc) {
|
||||
|
||||
/* the array is full */
|
||||
|
||||
p = a->pool;
|
||||
|
||||
- if ((u_char *) a->elts + a->size * a->nalloc == p->d.last
|
||||
- && p->d.last + size <= p->d.end)
|
||||
- {
|
||||
- /*
|
||||
- * the array allocation is the last in the pool
|
||||
- * and there is space for new allocation
|
||||
- */
|
||||
-
|
||||
- p->d.last += size;
|
||||
- a->nalloc += n;
|
||||
-
|
||||
- } else {
|
||||
- /* allocate a new array */
|
||||
-
|
||||
- nalloc = 2 * ((n >= a->nalloc) ? n : a->nalloc);
|
||||
-
|
||||
- new = ngx_palloc(p, nalloc * a->size);
|
||||
- if (new == NULL) {
|
||||
- return NULL;
|
||||
- }
|
||||
-
|
||||
- ngx_memcpy(new, a->elts, a->nelts * a->size);
|
||||
- a->elts = new;
|
||||
- a->nalloc = nalloc;
|
||||
+ nalloc = 2 * ((n >= a->nalloc) ? n : a->nalloc);
|
||||
+
|
||||
+ new = ngx_palloc(p, nalloc * a->size);
|
||||
+ if (new == NULL) {
|
||||
+ return NULL;
|
||||
}
|
||||
+
|
||||
+ ngx_memcpy(new, a->elts, a->nelts * a->size);
|
||||
+ a->elts = new;
|
||||
+ a->nalloc = nalloc;
|
||||
}
|
||||
|
||||
elt = (u_char *) a->elts + a->size * a->nelts;
|
||||
diff -ur nginx-1.0.10/src/core/ngx_palloc.c nginx-1.0.10-patched/src/core/ngx_palloc.c
|
||||
--- nginx-1.0.10/src/core/ngx_palloc.c 2009-12-17 20:25:46.000000000 +0800
|
||||
+++ nginx-1.0.10-patched/src/core/ngx_palloc.c 2011-09-14 12:03:41.663126519 +0800
|
||||
@@ -8,24 +8,31 @@
|
||||
#include <ngx_core.h>
|
||||
|
||||
|
||||
-static void *ngx_palloc_block(ngx_pool_t *pool, size_t size);
|
||||
static void *ngx_palloc_large(ngx_pool_t *pool, size_t size);
|
||||
|
||||
|
||||
ngx_pool_t *
|
||||
ngx_create_pool(size_t size, ngx_log_t *log)
|
||||
{
|
||||
- ngx_pool_t *p;
|
||||
+ ngx_pool_t *p;
|
||||
+ ngx_pool_data_t *d;
|
||||
|
||||
- p = ngx_memalign(NGX_POOL_ALIGNMENT, size, log);
|
||||
+ size = sizeof(ngx_pool_t);
|
||||
+ p = ngx_alloc(size, log);
|
||||
if (p == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
- p->d.last = (u_char *) p + sizeof(ngx_pool_t);
|
||||
- p->d.end = (u_char *) p + size;
|
||||
- p->d.next = NULL;
|
||||
- p->d.failed = 0;
|
||||
+ d = ngx_alloc(sizeof(ngx_pool_data_t), log);
|
||||
+
|
||||
+ if (d == NULL) {
|
||||
+ return NULL;
|
||||
+ }
|
||||
+
|
||||
+ d->next = d;
|
||||
+ d->prev = d;
|
||||
+ d->alloc = NULL;
|
||||
+ p->d = d;
|
||||
|
||||
size = size - sizeof(ngx_pool_t);
|
||||
p->max = (size < NGX_MAX_ALLOC_FROM_POOL) ? size : NGX_MAX_ALLOC_FROM_POOL;
|
||||
@@ -43,7 +50,7 @@
|
||||
void
|
||||
ngx_destroy_pool(ngx_pool_t *pool)
|
||||
{
|
||||
- ngx_pool_t *p, *n;
|
||||
+ ngx_pool_data_t *d, *n;
|
||||
ngx_pool_large_t *l;
|
||||
ngx_pool_cleanup_t *c;
|
||||
|
||||
@@ -55,7 +62,7 @@
|
||||
}
|
||||
}
|
||||
|
||||
- for (l = pool->large; l; l = l->next) {
|
||||
+ for (l = pool->large; l ; l = l->next) {
|
||||
|
||||
ngx_log_debug1(NGX_LOG_DEBUG_ALLOC, pool->log, 0, "free: %p", l->alloc);
|
||||
|
||||
@@ -71,34 +78,45 @@
|
||||
* so we can not use this log while the free()ing the pool
|
||||
*/
|
||||
|
||||
- for (p = pool, n = pool->d.next; /* void */; p = n, n = n->d.next) {
|
||||
+ for (d = pool->d, n = d->next; ; d = n, n = n->next) {
|
||||
ngx_log_debug2(NGX_LOG_DEBUG_ALLOC, pool->log, 0,
|
||||
- "free: %p, unused: %uz", p, p->d.end - p->d.last);
|
||||
+ "free: %p", d);
|
||||
|
||||
- if (n == NULL) {
|
||||
+ if (n == pool->d) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
+ if (pool->d->next == pool->d) {
|
||||
+ ngx_free(pool->d);
|
||||
+ } else {
|
||||
+ for (d = pool->d, n = d->next; ; d = n, n = n->next) {
|
||||
+ if (d->alloc) {
|
||||
+ ngx_free(d->alloc);
|
||||
+ }
|
||||
+ ngx_free(d);
|
||||
|
||||
- for (p = pool, n = pool->d.next; /* void */; p = n, n = n->d.next) {
|
||||
- ngx_free(p);
|
||||
-
|
||||
- if (n == NULL) {
|
||||
- break;
|
||||
+ if (n == pool->d) {
|
||||
+ break;
|
||||
+ }
|
||||
}
|
||||
}
|
||||
+
|
||||
+ ngx_free(pool);
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
ngx_reset_pool(ngx_pool_t *pool)
|
||||
{
|
||||
- ngx_pool_t *p;
|
||||
- ngx_pool_large_t *l;
|
||||
+ ngx_pool_data_t *p, *tmp;
|
||||
+ ngx_pool_large_t *l;
|
||||
+
|
||||
+ for (l = pool->large; l ; l = l->next) {
|
||||
+
|
||||
+ ngx_log_debug1(NGX_LOG_DEBUG_ALLOC, pool->log, 0, "free: %p", l->alloc);
|
||||
|
||||
- for (l = pool->large; l; l = l->next) {
|
||||
if (l->alloc) {
|
||||
ngx_free(l->alloc);
|
||||
}
|
||||
@@ -106,109 +124,65 @@
|
||||
|
||||
pool->large = NULL;
|
||||
|
||||
- for (p = pool; p; p = p->d.next) {
|
||||
- p->d.last = (u_char *) p + sizeof(ngx_pool_t);
|
||||
+ p = pool->d->next;
|
||||
+ while (p != pool->d) {
|
||||
+ tmp = p;
|
||||
+ ngx_free(p->alloc);
|
||||
+ p->prev->next = p->next;
|
||||
+ p->next->prev = p->prev;
|
||||
+ p = p->next;
|
||||
+ ngx_free(tmp);
|
||||
}
|
||||
-}
|
||||
|
||||
+ ngx_free(pool->d->alloc);
|
||||
+ pool->d->alloc = NULL;
|
||||
+
|
||||
+}
|
||||
|
||||
void *
|
||||
-ngx_palloc(ngx_pool_t *pool, size_t size)
|
||||
+ngx_malloc(ngx_pool_t *pool, size_t size)
|
||||
{
|
||||
- u_char *m;
|
||||
- ngx_pool_t *p;
|
||||
-
|
||||
- if (size <= pool->max) {
|
||||
+ ngx_pool_data_t *new;
|
||||
+ void *m;
|
||||
|
||||
- p = pool->current;
|
||||
-
|
||||
- do {
|
||||
- m = ngx_align_ptr(p->d.last, NGX_ALIGNMENT);
|
||||
-
|
||||
- if ((size_t) (p->d.end - m) >= size) {
|
||||
- p->d.last = m + size;
|
||||
-
|
||||
- return m;
|
||||
- }
|
||||
-
|
||||
- p = p->d.next;
|
||||
-
|
||||
- } while (p);
|
||||
+ m = ngx_alloc(size, pool->log);
|
||||
+ if (m == NULL) {
|
||||
+ return NULL;
|
||||
+ }
|
||||
|
||||
- return ngx_palloc_block(pool, size);
|
||||
+ new = ngx_alloc(sizeof(ngx_pool_data_t), pool->log);
|
||||
+ if (new == NULL){
|
||||
+ ngx_free(m);
|
||||
+ return NULL;
|
||||
}
|
||||
|
||||
- return ngx_palloc_large(pool, size);
|
||||
+ new->alloc = m;
|
||||
+ new->next = pool->d;
|
||||
+ new->prev = pool->d->prev;
|
||||
+ pool->d->prev->next = new;
|
||||
+ pool->d->prev = new;
|
||||
+ return m;
|
||||
}
|
||||
|
||||
-
|
||||
void *
|
||||
-ngx_pnalloc(ngx_pool_t *pool, size_t size)
|
||||
+ngx_palloc(ngx_pool_t *pool, size_t size)
|
||||
{
|
||||
- u_char *m;
|
||||
- ngx_pool_t *p;
|
||||
-
|
||||
- if (size <= pool->max) {
|
||||
-
|
||||
- p = pool->current;
|
||||
-
|
||||
- do {
|
||||
- m = p->d.last;
|
||||
-
|
||||
- if ((size_t) (p->d.end - m) >= size) {
|
||||
- p->d.last = m + size;
|
||||
-
|
||||
- return m;
|
||||
- }
|
||||
-
|
||||
- p = p->d.next;
|
||||
-
|
||||
- } while (p);
|
||||
-
|
||||
- return ngx_palloc_block(pool, size);
|
||||
+ if (size <= 1024) {
|
||||
+ return ngx_malloc(pool, size);
|
||||
}
|
||||
|
||||
return ngx_palloc_large(pool, size);
|
||||
}
|
||||
|
||||
|
||||
-static void *
|
||||
-ngx_palloc_block(ngx_pool_t *pool, size_t size)
|
||||
+void *
|
||||
+ngx_pnalloc(ngx_pool_t *pool, size_t size)
|
||||
{
|
||||
- u_char *m;
|
||||
- size_t psize;
|
||||
- ngx_pool_t *p, *new, *current;
|
||||
-
|
||||
- psize = (size_t) (pool->d.end - (u_char *) pool);
|
||||
-
|
||||
- m = ngx_memalign(NGX_POOL_ALIGNMENT, psize, pool->log);
|
||||
- if (m == NULL) {
|
||||
- return NULL;
|
||||
- }
|
||||
-
|
||||
- new = (ngx_pool_t *) m;
|
||||
-
|
||||
- new->d.end = m + psize;
|
||||
- new->d.next = NULL;
|
||||
- new->d.failed = 0;
|
||||
-
|
||||
- m += sizeof(ngx_pool_data_t);
|
||||
- m = ngx_align_ptr(m, NGX_ALIGNMENT);
|
||||
- new->d.last = m + size;
|
||||
-
|
||||
- current = pool->current;
|
||||
-
|
||||
- for (p = current; p->d.next; p = p->d.next) {
|
||||
- if (p->d.failed++ > 4) {
|
||||
- current = p->d.next;
|
||||
- }
|
||||
+ if (size <= 1024) {
|
||||
+ return ngx_malloc(pool, size);
|
||||
}
|
||||
|
||||
- p->d.next = new;
|
||||
-
|
||||
- pool->current = current ? current : new;
|
||||
-
|
||||
- return m;
|
||||
+ return ngx_palloc_large(pool, size);
|
||||
}
|
||||
|
||||
|
||||
@@ -216,7 +190,6 @@
|
||||
ngx_palloc_large(ngx_pool_t *pool, size_t size)
|
||||
{
|
||||
void *p;
|
||||
- ngx_uint_t n;
|
||||
ngx_pool_large_t *large;
|
||||
|
||||
p = ngx_alloc(size, pool->log);
|
||||
@@ -224,20 +197,7 @@
|
||||
return NULL;
|
||||
}
|
||||
|
||||
- n = 0;
|
||||
-
|
||||
- for (large = pool->large; large; large = large->next) {
|
||||
- if (large->alloc == NULL) {
|
||||
- large->alloc = p;
|
||||
- return p;
|
||||
- }
|
||||
-
|
||||
- if (n++ > 3) {
|
||||
- break;
|
||||
- }
|
||||
- }
|
||||
-
|
||||
- large = ngx_palloc(pool, sizeof(ngx_pool_large_t));
|
||||
+ large = ngx_malloc(pool, sizeof(ngx_pool_large_t));
|
||||
if (large == NULL) {
|
||||
ngx_free(p);
|
||||
return NULL;
|
||||
@@ -262,7 +222,7 @@
|
||||
return NULL;
|
||||
}
|
||||
|
||||
- large = ngx_palloc(pool, sizeof(ngx_pool_large_t));
|
||||
+ large = ngx_malloc(pool, sizeof(ngx_pool_large_t));
|
||||
if (large == NULL) {
|
||||
ngx_free(p);
|
||||
return NULL;
|
||||
@@ -279,17 +239,41 @@
|
||||
ngx_int_t
|
||||
ngx_pfree(ngx_pool_t *pool, void *p)
|
||||
{
|
||||
- ngx_pool_large_t *l;
|
||||
+ ngx_pool_large_t *l;
|
||||
+ ngx_pool_large_t *ll;
|
||||
+ ngx_pool_data_t *d, *n;
|
||||
|
||||
- for (l = pool->large; l; l = l->next) {
|
||||
+ for (l = pool->large, ll = l; l; ll = l, l = l->next) {
|
||||
if (p == l->alloc) {
|
||||
ngx_log_debug1(NGX_LOG_DEBUG_ALLOC, pool->log, 0,
|
||||
"free: %p", l->alloc);
|
||||
ngx_free(l->alloc);
|
||||
l->alloc = NULL;
|
||||
+ if (l == pool->large) {
|
||||
+ pool->large = NULL;
|
||||
+ }
|
||||
+
|
||||
+ ll->next = l->next;
|
||||
+ p = l;
|
||||
+ break;
|
||||
+ }
|
||||
+ }
|
||||
|
||||
+ for (d = pool->d, n = d->next; ; d = n, n = d->next) {
|
||||
+ if (p == d->alloc) {
|
||||
+ ngx_log_debug1(NGX_LOG_DEBUG_ALLOC, pool->log, 0, "free: %p", d->alloc);
|
||||
+ if (d->alloc) {
|
||||
+ ngx_free(d->alloc);
|
||||
+ }
|
||||
+ d->alloc = NULL;
|
||||
+ d->prev->next = d->next;
|
||||
+ d->next->prev = d->prev;
|
||||
+ ngx_free(d);
|
||||
return NGX_OK;
|
||||
}
|
||||
+ if (d->next == pool->d) {
|
||||
+ break;
|
||||
+ }
|
||||
}
|
||||
|
||||
return NGX_DECLINED;
|
||||
diff -ur nginx-1.0.10/src/core/ngx_palloc.h nginx-1.0.10-patched/src/core/ngx_palloc.h
|
||||
--- nginx-1.0.10/src/core/ngx_palloc.h 2009-12-17 20:25:46.000000000 +0800
|
||||
+++ nginx-1.0.10-patched/src/core/ngx_palloc.h 2011-09-13 12:11:03.155622101 +0800
|
||||
@@ -38,6 +38,7 @@
|
||||
|
||||
|
||||
typedef struct ngx_pool_large_s ngx_pool_large_t;
|
||||
+typedef struct ngx_pool_data_s ngx_pool_data_t;
|
||||
|
||||
struct ngx_pool_large_s {
|
||||
ngx_pool_large_t *next;
|
||||
@@ -45,16 +46,15 @@
|
||||
};
|
||||
|
||||
|
||||
-typedef struct {
|
||||
- u_char *last;
|
||||
- u_char *end;
|
||||
- ngx_pool_t *next;
|
||||
- ngx_uint_t failed;
|
||||
-} ngx_pool_data_t;
|
||||
+struct ngx_pool_data_s{
|
||||
+ ngx_pool_data_t *next;
|
||||
+ ngx_pool_data_t *prev;
|
||||
+ void *alloc;
|
||||
+};
|
||||
|
||||
|
||||
struct ngx_pool_s {
|
||||
- ngx_pool_data_t d;
|
||||
+ ngx_pool_data_t *d;
|
||||
size_t max;
|
||||
ngx_pool_t *current;
|
||||
ngx_chain_t *chain;
|
27
patches/nginx-1.0.10-request_body_in_single_buf.patch
Normal file
27
patches/nginx-1.0.10-request_body_in_single_buf.patch
Normal file
@ -0,0 +1,27 @@
|
||||
# HG changeset patch
|
||||
# User Maxim Dounin <mdounin@mdounin.ru>
|
||||
# Date 1309799136 -14400
|
||||
# Node ID 99e276bba8596bc4df9e638482ee413f4c6bf700
|
||||
# Parent e7b2f945d55ae44a2295facf9e3336dc4633e5b5
|
||||
Core: fix body with request_body_in_single_buf.
|
||||
|
||||
If there were preread data and request body was big enough first part
|
||||
of request body was duplicated.
|
||||
|
||||
See report here:
|
||||
http://nginx.org/pipermail/nginx/2011-July/027756.html
|
||||
|
||||
diff --git a/src/http/ngx_http_request_body.c b/src/http/ngx_http_request_body.c
|
||||
--- a/src/http/ngx_http_request_body.c
|
||||
+++ b/src/http/ngx_http_request_body.c
|
||||
@@ -372,7 +372,9 @@ ngx_http_do_read_client_request_body(ngx
|
||||
}
|
||||
}
|
||||
|
||||
- if (r->request_body_in_file_only && rb->bufs->next) {
|
||||
+ if (rb->bufs->next
|
||||
+ && (r->request_body_in_file_only || r->request_body_in_single_buf))
|
||||
+ {
|
||||
rb->bufs = rb->bufs->next;
|
||||
}
|
||||
|
17
patches/nginx-1.0.10-request_body_preread_fix.patch
Normal file
17
patches/nginx-1.0.10-request_body_preread_fix.patch
Normal file
@ -0,0 +1,17 @@
|
||||
# HG changeset patch
|
||||
# User Maxim Dounin <mdounin@mdounin.ru>
|
||||
# Date 1309776931 -14400
|
||||
# Node ID e7b2f945d55ae44a2295facf9e3336dc4633e5b5
|
||||
# Parent 610e909bb9e29766188aa86fae3abe0bd3432940
|
||||
Core: fix body if it's preread and there are extra data.
|
||||
|
||||
--- nginx-1.0.10/src/http/ngx_http_request_body.c 2011-07-05 12:11:21.619264633 +0800
|
||||
+++ nginx-1.0.10-patched/src/http/ngx_http_request_body.c 2011-07-05 12:14:30.694321554 +0800
|
||||
@@ -141,6 +141,7 @@
|
||||
|
||||
/* the whole request body was pre-read */
|
||||
|
||||
+ b->last = b->pos + r->headers_in.content_length_n;
|
||||
r->header_in->pos += (size_t) r->headers_in.content_length_n;
|
||||
r->request_length += r->headers_in.content_length_n;
|
||||
|
26
patches/nginx-1.0.10-server_header.patch
Normal file
26
patches/nginx-1.0.10-server_header.patch
Normal file
@ -0,0 +1,26 @@
|
||||
diff -ur lz-nginx-1.0.10/nginx-1.0.10/src/core/nginx.h lz-nginx-1.0.10-patched/nginx-1.0.10/src/core/nginx.h
|
||||
--- lz-nginx-1.0.10/nginx-1.0.10/src/core/nginx.h 2010-02-12 17:31:01.000000000 +0800
|
||||
+++ lz-nginx-1.0.10-patched/nginx-1.0.10/src/core/nginx.h 2010-03-30 10:52:13.240702627 +0800
|
||||
@@ -10,7 +10,7 @@
|
||||
|
||||
#define nginx_version 1000010
|
||||
#define NGINX_VERSION "1.0.10"
|
||||
-#define NGINX_VER "nginx/" NGINX_VERSION
|
||||
+#define NGINX_VER "ngx_openresty/" NGINX_VERSION ".unknown"
|
||||
|
||||
#define NGINX_VAR "NGINX"
|
||||
#define NGX_OLDPID_EXT ".oldbin"
|
||||
Only in lz-nginx-1.0.10-patched/nginx-1.0.10/src/core: nginx.h.orig
|
||||
Only in lz-nginx-1.0.10-patched/nginx-1.0.10/src/core: nginx.h.rej
|
||||
diff -ur lz-nginx-1.0.10/nginx-1.0.10/src/http/ngx_http_header_filter_module.c lz-nginx-1.0.10-patched/nginx-1.0.10/src/http/ngx_http_header_filter_module.c
|
||||
--- lz-nginx-1.0.10/nginx-1.0.10/src/http/ngx_http_header_filter_module.c 2010-03-03 23:14:04.000000000 +0800
|
||||
+++ lz-nginx-1.0.10-patched/nginx-1.0.10/src/http/ngx_http_header_filter_module.c 2010-03-30 10:52:53.670909405 +0800
|
||||
@@ -45,7 +45,7 @@
|
||||
};
|
||||
|
||||
|
||||
-static char ngx_http_server_string[] = "Server: nginx" CRLF;
|
||||
+static char ngx_http_server_string[] = "Server: ngx_openresty" CRLF;
|
||||
static char ngx_http_server_full_string[] = "Server: " NGINX_VER CRLF;
|
||||
|
||||
|
40
patches/nginx-1.0.10-subrequest_loop.patch
Normal file
40
patches/nginx-1.0.10-subrequest_loop.patch
Normal file
@ -0,0 +1,40 @@
|
||||
# HG changeset patch
|
||||
# User Maxim Dounin <mdounin@mdounin.ru>
|
||||
# Date 1309187571 -14400
|
||||
# Node ID 283a416b2235d5383c12a975edc8866f007fb628
|
||||
# Parent f5fc40783ddcbf4db33859ee2a9bce54cf32c350
|
||||
Core: protect from subrequest loops.
|
||||
|
||||
Without protection subrequest loop results in r->count overflow and
|
||||
SIGSEGV. Protection was broken in 0.7.25.
|
||||
|
||||
Note that this also limits number of parallel subrequests. This
|
||||
wasn't exactly the case before 0.7.25 as local subrequests were
|
||||
completed directly.
|
||||
|
||||
See here for details:
|
||||
|
||||
http://nginx.org/pipermail/nginx-ru/2010-February/032184.html
|
||||
|
||||
diff --git a/src/http/ngx_http_core_module.c b/src/http/ngx_http_core_module.c
|
||||
--- a/src/http/ngx_http_core_module.c
|
||||
+++ b/src/http/ngx_http_core_module.c
|
||||
@@ -2287,7 +2287,6 @@ ngx_http_subrequest(ngx_http_request_t *
|
||||
sr->start_sec = tp->sec;
|
||||
sr->start_msec = tp->msec;
|
||||
|
||||
- r->main->subrequests++;
|
||||
r->main->count++;
|
||||
|
||||
*psr = sr;
|
||||
diff --git a/src/http/ngx_http_request.c b/src/http/ngx_http_request.c
|
||||
--- a/src/http/ngx_http_request.c
|
||||
+++ b/src/http/ngx_http_request.c
|
||||
@@ -1981,6 +1981,7 @@ ngx_http_finalize_request(ngx_http_reque
|
||||
if (r == c->data) {
|
||||
|
||||
r->main->count--;
|
||||
+ r->main->subrequests++;
|
||||
|
||||
if (!r->logged) {
|
||||
|
73
patches/nginx-1.0.10-variable_header_ignore_no_hash.patch
Normal file
73
patches/nginx-1.0.10-variable_header_ignore_no_hash.patch
Normal file
@ -0,0 +1,73 @@
|
||||
--- nginx-1.0.10/src/http/ngx_http_variables.c 2011-05-30 20:36:17.000000000 +0800
|
||||
+++ nginx-1.0.10-patched/src/http/ngx_http_variables.c 2011-11-08 22:21:55.229247198 +0800
|
||||
@@ -648,7 +648,17 @@
|
||||
|
||||
a = (ngx_array_t *) ((char *) r + data);
|
||||
|
||||
- n = a->nelts;
|
||||
+ h = a->elts;
|
||||
+ n = 0;
|
||||
+
|
||||
+ for (i = 0; i < a->nelts; i++) {
|
||||
+
|
||||
+ if (h[i]->hash == 0) {
|
||||
+ continue;
|
||||
+ }
|
||||
+
|
||||
+ n++;
|
||||
+ }
|
||||
|
||||
if (n == 0) {
|
||||
v->not_found = 1;
|
||||
@@ -659,9 +669,7 @@
|
||||
v->no_cacheable = 0;
|
||||
v->not_found = 0;
|
||||
|
||||
- h = a->elts;
|
||||
-
|
||||
- if (n == 1) {
|
||||
+ if (n == 1 && a->nelts == 1) {
|
||||
v->len = (*h)->value.len;
|
||||
v->data = (*h)->value.data;
|
||||
|
||||
@@ -670,7 +678,12 @@
|
||||
|
||||
len = - (ssize_t) (sizeof("; ") - 1);
|
||||
|
||||
- for (i = 0; i < n; i++) {
|
||||
+ for (i = 0; i < a->nelts; i++) {
|
||||
+
|
||||
+ if (h[i]->hash == 0) {
|
||||
+ continue;
|
||||
+ }
|
||||
+
|
||||
len += h[i]->value.len + sizeof("; ") - 1;
|
||||
}
|
||||
|
||||
@@ -683,9 +696,14 @@
|
||||
v->data = p;
|
||||
|
||||
for (i = 0; /* void */ ; i++) {
|
||||
+
|
||||
+ if (h[i]->hash == 0) {
|
||||
+ continue;
|
||||
+ }
|
||||
+
|
||||
p = ngx_copy(p, h[i]->value.data, h[i]->value.len);
|
||||
|
||||
- if (i == n - 1) {
|
||||
+ if (--n == 0) {
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -738,6 +756,10 @@
|
||||
i = 0;
|
||||
}
|
||||
|
||||
+ if (header[i].hash == 0) {
|
||||
+ continue;
|
||||
+ }
|
||||
+
|
||||
for (n = 0; n + prefix < var->len && n < header[i].key.len; n++) {
|
||||
ch = header[i].key.data[n];
|
||||
|
117
patches/nginx-1.0.11-allow_request_body_updating.patch
Normal file
117
patches/nginx-1.0.11-allow_request_body_updating.patch
Normal file
@ -0,0 +1,117 @@
|
||||
diff -ur nginx-1.0.11/src/http/ngx_http_request_body.c nginx-1.0.11-patched/src/http/ngx_http_request_body.c
|
||||
--- nginx-1.0.11/src/http/ngx_http_request_body.c 2011-09-30 22:36:19.000000000 +0800
|
||||
+++ nginx-1.0.11-patched/src/http/ngx_http_request_body.c 2011-10-21 21:54:08.460350482 +0800
|
||||
@@ -38,7 +38,7 @@
|
||||
|
||||
r->main->count++;
|
||||
|
||||
- if (r->request_body || r->discard_body) {
|
||||
+ if (r->request_body || r->discard_body || r->content_length_n == 0) {
|
||||
post_handler(r);
|
||||
return NGX_OK;
|
||||
}
|
||||
@@ -440,7 +440,7 @@
|
||||
ssize_t size;
|
||||
ngx_event_t *rev;
|
||||
|
||||
- if (r != r->main || r->discard_body) {
|
||||
+ if (r != r->main || r->discard_body || r->content_length_n == 0) {
|
||||
return NGX_OK;
|
||||
}
|
||||
|
||||
@@ -456,20 +456,22 @@
|
||||
ngx_del_timer(rev);
|
||||
}
|
||||
|
||||
- if (r->headers_in.content_length_n <= 0 || r->request_body) {
|
||||
+ r->content_length_n = r->headers_in.content_length_n;
|
||||
+
|
||||
+ if (r->content_length_n <= 0 || r->request_body) {
|
||||
return NGX_OK;
|
||||
}
|
||||
|
||||
size = r->header_in->last - r->header_in->pos;
|
||||
|
||||
if (size) {
|
||||
- if (r->headers_in.content_length_n > size) {
|
||||
+ if (r->content_length_n > size) {
|
||||
r->header_in->pos += size;
|
||||
- r->headers_in.content_length_n -= size;
|
||||
+ r->content_length_n -= size;
|
||||
|
||||
} else {
|
||||
- r->header_in->pos += (size_t) r->headers_in.content_length_n;
|
||||
- r->headers_in.content_length_n = 0;
|
||||
+ r->header_in->pos += (size_t) r->content_length_n;
|
||||
+ r->content_length_n = 0;
|
||||
return NGX_OK;
|
||||
}
|
||||
}
|
||||
@@ -568,7 +570,7 @@
|
||||
"http read discarded body");
|
||||
|
||||
for ( ;; ) {
|
||||
- if (r->headers_in.content_length_n == 0) {
|
||||
+ if (r->content_length_n == 0) {
|
||||
r->read_event_handler = ngx_http_block_reading;
|
||||
return NGX_OK;
|
||||
}
|
||||
@@ -577,9 +579,9 @@
|
||||
return NGX_AGAIN;
|
||||
}
|
||||
|
||||
- size = (r->headers_in.content_length_n > NGX_HTTP_DISCARD_BUFFER_SIZE) ?
|
||||
+ size = (r->content_length_n > NGX_HTTP_DISCARD_BUFFER_SIZE) ?
|
||||
NGX_HTTP_DISCARD_BUFFER_SIZE:
|
||||
- (size_t) r->headers_in.content_length_n;
|
||||
+ (size_t) r->content_length_n;
|
||||
|
||||
n = r->connection->recv(r->connection, buffer, size);
|
||||
|
||||
@@ -596,7 +598,7 @@
|
||||
return NGX_OK;
|
||||
}
|
||||
|
||||
- r->headers_in.content_length_n -= n;
|
||||
+ r->content_length_n -= n;
|
||||
}
|
||||
}
|
||||
|
||||
Only in nginx-1.0.11-patched/src/http: ngx_http_request_body.c~
|
||||
diff -ur nginx-1.0.11/src/http/ngx_http_request.c nginx-1.0.11-patched/src/http/ngx_http_request.c
|
||||
--- nginx-1.0.11/src/http/ngx_http_request.c 2011-09-30 22:36:19.000000000 +0800
|
||||
+++ nginx-1.0.11-patched/src/http/ngx_http_request.c 2011-10-21 19:06:38.404350692 +0800
|
||||
@@ -286,6 +286,8 @@
|
||||
|
||||
r->pipeline = hc->pipeline;
|
||||
|
||||
+ r->content_length_n = -1;
|
||||
+
|
||||
if (hc->nbusy) {
|
||||
r->header_in = hc->busy[0];
|
||||
}
|
||||
@@ -297,6 +299,8 @@
|
||||
return;
|
||||
}
|
||||
|
||||
+ r->content_length_n = -1;
|
||||
+
|
||||
hc->request = r;
|
||||
}
|
||||
|
||||
Only in nginx-1.0.11-patched/src/http: ngx_http_request.c~
|
||||
diff -ur nginx-1.0.11/src/http/ngx_http_request.h nginx-1.0.11-patched/src/http/ngx_http_request.h
|
||||
--- nginx-1.0.11/src/http/ngx_http_request.h 2011-08-29 18:39:23.000000000 +0800
|
||||
+++ nginx-1.0.11-patched/src/http/ngx_http_request.h 2011-10-21 17:26:13.203807584 +0800
|
||||
@@ -366,6 +366,9 @@
|
||||
ngx_pool_t *pool;
|
||||
ngx_buf_t *header_in;
|
||||
|
||||
+ off_t content_length_n;
|
||||
+ /* for discarding request body */
|
||||
+
|
||||
ngx_http_headers_in_t headers_in;
|
||||
ngx_http_headers_out_t headers_out;
|
||||
|
||||
Only in nginx-1.0.11-patched/src/http: ngx_http_request.h~
|
||||
Only in nginx-1.0.11-patched/src/http: tags
|
20
patches/nginx-1.0.11-epoll_check_stale_wev.patch
Normal file
20
patches/nginx-1.0.11-epoll_check_stale_wev.patch
Normal file
@ -0,0 +1,20 @@
|
||||
--- nginx-1.0.11/src/event/modules/ngx_epoll_module.c 2011-09-30 22:12:53.000000000 +0800
|
||||
+++ nginx-1.0.11-patched/src/event/modules/ngx_epoll_module.c 2011-11-30 11:08:46.775817019 +0800
|
||||
@@ -682,6 +682,17 @@
|
||||
wev = c->write;
|
||||
|
||||
if ((revents & EPOLLOUT) && wev->active) {
|
||||
+ if (c->fd == -1 || wev->instance != instance) {
|
||||
+
|
||||
+ /*
|
||||
+ * the stale event from a file descriptor
|
||||
+ * that was just closed in this iteration
|
||||
+ */
|
||||
+
|
||||
+ ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0,
|
||||
+ "epoll: stale event %p", c);
|
||||
+ continue;
|
||||
+ }
|
||||
|
||||
if (flags & NGX_POST_THREAD_EVENTS) {
|
||||
wev->posted_ready = 1;
|
69
patches/nginx-1.0.11-gzip_empty_flush_buf.patch
Normal file
69
patches/nginx-1.0.11-gzip_empty_flush_buf.patch
Normal file
@ -0,0 +1,69 @@
|
||||
# HG changeset patch
|
||||
# User Maxim Dounin <mdounin@mdounin.ru>
|
||||
# Date 1315324342 -14400
|
||||
# Node ID 4cf0af103bc382a78f894302d1706929a79df4bb
|
||||
# Parent d603ce98fada855f0100b422b7b5672fd22fabea
|
||||
Gzip filter: handle empty flush buffers.
|
||||
|
||||
Empty flush buffers are legitimate and may happen e.g. due to $r->flush()
|
||||
calls in embedded perl. If there are no data buffered in zlib deflate()
|
||||
will return Z_BUF_ERROR (i.e. no progress possible) without adding anything
|
||||
to output. Don't treat Z_BUF_ERROR as fatal and correctly send empty flush
|
||||
buffer if we have no data in output at all.
|
||||
|
||||
See this thread for details:
|
||||
http://mailman.nginx.org/pipermail/nginx/2010-November/023693.html
|
||||
|
||||
diff --git a/src/http/modules/ngx_http_gzip_filter_module.c b/src/http/modules/ngx_http_gzip_filter_module.c
|
||||
--- a/src/http/modules/ngx_http_gzip_filter_module.c
|
||||
+++ b/src/http/modules/ngx_http_gzip_filter_module.c
|
||||
@@ -758,6 +758,7 @@ static ngx_int_t
|
||||
ngx_http_gzip_filter_deflate(ngx_http_request_t *r, ngx_http_gzip_ctx_t *ctx)
|
||||
{
|
||||
int rc;
|
||||
+ ngx_buf_t *b;
|
||||
ngx_chain_t *cl;
|
||||
ngx_http_gzip_conf_t *conf;
|
||||
|
||||
@@ -769,7 +770,7 @@ ngx_http_gzip_filter_deflate(ngx_http_re
|
||||
|
||||
rc = deflate(&ctx->zstream, ctx->flush);
|
||||
|
||||
- if (rc != Z_OK && rc != Z_STREAM_END) {
|
||||
+ if (rc != Z_OK && rc != Z_STREAM_END && rc != Z_BUF_ERROR) {
|
||||
ngx_log_error(NGX_LOG_ALERT, r->connection->log, 0,
|
||||
"deflate() failed: %d, %d", ctx->flush, rc);
|
||||
return NGX_ERROR;
|
||||
@@ -818,8 +819,6 @@ ngx_http_gzip_filter_deflate(ngx_http_re
|
||||
|
||||
if (ctx->flush == Z_SYNC_FLUSH) {
|
||||
|
||||
- ctx->zstream.avail_out = 0;
|
||||
- ctx->out_buf->flush = 1;
|
||||
ctx->flush = Z_NO_FLUSH;
|
||||
|
||||
cl = ngx_alloc_chain_link(r->pool);
|
||||
@@ -827,7 +826,22 @@ ngx_http_gzip_filter_deflate(ngx_http_re
|
||||
return NGX_ERROR;
|
||||
}
|
||||
|
||||
- cl->buf = ctx->out_buf;
|
||||
+ b = ctx->out_buf;
|
||||
+
|
||||
+ if (ngx_buf_size(b) == 0) {
|
||||
+
|
||||
+ b = ngx_calloc_buf(ctx->request->pool);
|
||||
+ if (b == NULL) {
|
||||
+ return NGX_ERROR;
|
||||
+ }
|
||||
+
|
||||
+ } else {
|
||||
+ ctx->zstream.avail_out = 0;
|
||||
+ }
|
||||
+
|
||||
+ b->flush = 1;
|
||||
+
|
||||
+ cl->buf = b;
|
||||
cl->next = NULL;
|
||||
*ctx->last_out = cl;
|
||||
ctx->last_out = &cl->next;
|
115
patches/nginx-1.0.11-log_escape_non_ascii.patch
Normal file
115
patches/nginx-1.0.11-log_escape_non_ascii.patch
Normal file
@ -0,0 +1,115 @@
|
||||
--- nginx-1.0.11/src/http/modules/ngx_http_log_module.c 2011-11-01 21:24:50.000000000 +0800
|
||||
+++ nginx-1.0.11-patched/src/http/modules/ngx_http_log_module.c 2011-11-10 16:17:29.599039534 +0800
|
||||
@@ -61,6 +61,8 @@
|
||||
time_t open_file_cache_valid;
|
||||
ngx_uint_t open_file_cache_min_uses;
|
||||
|
||||
+ ngx_flag_t escape_non_ascii;
|
||||
+
|
||||
ngx_uint_t off; /* unsigned off:1 */
|
||||
} ngx_http_log_loc_conf_t;
|
||||
|
||||
@@ -104,7 +106,8 @@
|
||||
uintptr_t data);
|
||||
static u_char *ngx_http_log_variable(ngx_http_request_t *r, u_char *buf,
|
||||
ngx_http_log_op_t *op);
|
||||
-static uintptr_t ngx_http_log_escape(u_char *dst, u_char *src, size_t size);
|
||||
+static uintptr_t ngx_http_log_escape(ngx_http_log_loc_conf_t *lcf, u_char *dst,
|
||||
+ u_char *src, size_t size);
|
||||
|
||||
|
||||
static void *ngx_http_log_create_main_conf(ngx_conf_t *cf);
|
||||
@@ -146,6 +149,13 @@
|
||||
0,
|
||||
NULL },
|
||||
|
||||
+ { ngx_string("log_escape_non_ascii"),
|
||||
+ NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,
|
||||
+ ngx_conf_set_flag_slot,
|
||||
+ NGX_HTTP_LOC_CONF_OFFSET,
|
||||
+ offsetof(ngx_http_log_loc_conf_t, escape_non_ascii),
|
||||
+ NULL },
|
||||
+
|
||||
ngx_null_command
|
||||
};
|
||||
|
||||
@@ -637,6 +647,7 @@
|
||||
ngx_http_log_variable_getlen(ngx_http_request_t *r, uintptr_t data)
|
||||
{
|
||||
uintptr_t len;
|
||||
+ ngx_http_log_loc_conf_t *lcf;
|
||||
ngx_http_variable_value_t *value;
|
||||
|
||||
value = ngx_http_get_indexed_variable(r, data);
|
||||
@@ -645,7 +656,9 @@
|
||||
return 1;
|
||||
}
|
||||
|
||||
- len = ngx_http_log_escape(NULL, value->data, value->len);
|
||||
+ lcf = ngx_http_get_module_loc_conf(r, ngx_http_log_module);
|
||||
+
|
||||
+ len = ngx_http_log_escape(lcf, NULL, value->data, value->len);
|
||||
|
||||
value->escape = len ? 1 : 0;
|
||||
|
||||
@@ -656,6 +669,7 @@
|
||||
static u_char *
|
||||
ngx_http_log_variable(ngx_http_request_t *r, u_char *buf, ngx_http_log_op_t *op)
|
||||
{
|
||||
+ ngx_http_log_loc_conf_t *lcf;
|
||||
ngx_http_variable_value_t *value;
|
||||
|
||||
value = ngx_http_get_indexed_variable(r, op->data);
|
||||
@@ -669,16 +683,18 @@
|
||||
return ngx_cpymem(buf, value->data, value->len);
|
||||
|
||||
} else {
|
||||
- return (u_char *) ngx_http_log_escape(buf, value->data, value->len);
|
||||
+ lcf = ngx_http_get_module_loc_conf(r, ngx_http_log_module);
|
||||
+ return (u_char *) ngx_http_log_escape(lcf, buf, value->data, value->len);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static uintptr_t
|
||||
-ngx_http_log_escape(u_char *dst, u_char *src, size_t size)
|
||||
+ngx_http_log_escape(ngx_http_log_loc_conf_t *lcf, u_char *dst, u_char *src,
|
||||
+ size_t size)
|
||||
{
|
||||
- ngx_uint_t n;
|
||||
- static u_char hex[] = "0123456789ABCDEF";
|
||||
+ ngx_uint_t n;
|
||||
+ static u_char hex[] = "0123456789ABCDEF";
|
||||
|
||||
static uint32_t escape[] = {
|
||||
0xffffffff, /* 1111 1111 1111 1111 1111 1111 1111 1111 */
|
||||
@@ -698,6 +714,12 @@
|
||||
0xffffffff, /* 1111 1111 1111 1111 1111 1111 1111 1111 */
|
||||
};
|
||||
|
||||
+ if (lcf->escape_non_ascii) {
|
||||
+ ngx_memset(&escape[4], 0xff, sizeof(uint32_t) * 4);
|
||||
+
|
||||
+ } else {
|
||||
+ ngx_memzero(&escape[4], sizeof(uint32_t) * 4);
|
||||
+ }
|
||||
|
||||
if (dst == NULL) {
|
||||
|
||||
@@ -781,6 +803,7 @@
|
||||
}
|
||||
|
||||
conf->open_file_cache = NGX_CONF_UNSET_PTR;
|
||||
+ conf->escape_non_ascii = NGX_CONF_UNSET;
|
||||
|
||||
return conf;
|
||||
}
|
||||
@@ -796,6 +819,8 @@
|
||||
ngx_http_log_fmt_t *fmt;
|
||||
ngx_http_log_main_conf_t *lmcf;
|
||||
|
||||
+ ngx_conf_merge_value(conf->escape_non_ascii, prev->escape_non_ascii, 1);
|
||||
+
|
||||
if (conf->open_file_cache == NGX_CONF_UNSET_PTR) {
|
||||
|
||||
conf->open_file_cache = prev->open_file_cache;
|
14
patches/nginx-1.0.11-max_subrequests.patch
Normal file
14
patches/nginx-1.0.11-max_subrequests.patch
Normal file
@ -0,0 +1,14 @@
|
||||
--- nginx-1.0.11/src/http/ngx_http_request.h 2011-08-29 18:39:23.000000000 +0800
|
||||
+++ nginx-1.0.11-patched/src/http/ngx_http_request.h 2012-02-20 15:50:43.540762756 +0800
|
||||
@@ -9,7 +9,10 @@
|
||||
|
||||
|
||||
#define NGX_HTTP_MAX_URI_CHANGES 10
|
||||
-#define NGX_HTTP_MAX_SUBREQUESTS 50
|
||||
+
|
||||
+#ifndef NGX_HTTP_MAX_SUBREQUESTS
|
||||
+#define NGX_HTTP_MAX_SUBREQUESTS 200
|
||||
+#endif
|
||||
|
||||
/* must be 2^n */
|
||||
#define NGX_HTTP_LC_HEADER_LEN 32
|
12
patches/nginx-1.0.11-named_location_clear_mods_ctx.patch
Normal file
12
patches/nginx-1.0.11-named_location_clear_mods_ctx.patch
Normal file
@ -0,0 +1,12 @@
|
||||
--- nginx-1.0.11/src/http/ngx_http_core_module.c 2011-09-27 19:14:02.000000000 +0800
|
||||
+++ nginx-1.0.11-patched/src/http/ngx_http_core_module.c 2011-10-13 15:02:24.414550532 +0800
|
||||
@@ -2542,6 +2542,9 @@
|
||||
r->content_handler = NULL;
|
||||
r->loc_conf = (*clcfp)->loc_conf;
|
||||
|
||||
+ /* clear the modules contexts */
|
||||
+ ngx_memzero(r->ctx, sizeof(void *) * ngx_http_max_module);
|
||||
+
|
||||
ngx_http_update_location_config(r);
|
||||
|
||||
cmcf = ngx_http_get_module_main_conf(r, ngx_http_core_module);
|
24
patches/nginx-1.0.11-no_Werror.patch
Normal file
24
patches/nginx-1.0.11-no_Werror.patch
Normal file
@ -0,0 +1,24 @@
|
||||
diff -ur nginx-1.0.11/auto/cc/gcc nginx-1.0.11-patched/auto/cc/gcc
|
||||
--- nginx-1.0.11/auto/cc/gcc 2011-06-27 19:53:00.205737804 +0800
|
||||
+++ nginx-1.0.11-patched/auto/cc/gcc 2011-06-27 19:53:13.837741087 +0800
|
||||
@@ -169,7 +169,7 @@
|
||||
|
||||
|
||||
# stop on warning
|
||||
-CFLAGS="$CFLAGS -Werror"
|
||||
+#CFLAGS="$CFLAGS -Werror"
|
||||
|
||||
# debug
|
||||
CFLAGS="$CFLAGS -g"
|
||||
diff -ur nginx-1.0.11/auto/cc/icc nginx-1.0.11-patched/auto/cc/icc
|
||||
--- nginx-1.0.11/auto/cc/icc 2011-06-27 19:52:56.370157068 +0800
|
||||
+++ nginx-1.0.11-patched/auto/cc/icc 2011-06-27 19:53:19.508916811 +0800
|
||||
@@ -139,7 +139,7 @@
|
||||
esac
|
||||
|
||||
# stop on warning
|
||||
-CFLAGS="$CFLAGS -Werror"
|
||||
+#CFLAGS="$CFLAGS -Werror"
|
||||
|
||||
# debug
|
||||
CFLAGS="$CFLAGS -g"
|
90
patches/nginx-1.0.11-no_error_pages.patch
Normal file
90
patches/nginx-1.0.11-no_error_pages.patch
Normal file
@ -0,0 +1,90 @@
|
||||
--- nginx-1.0.11/src/http/ngx_http_core_module.c 2010-12-14 18:38:42.000000000 +0800
|
||||
+++ nginx-1.0.11-patched/src/http/ngx_http_core_module.c 2011-01-30 19:24:34.956354518 +0800
|
||||
@@ -57,6 +57,8 @@
|
||||
void *conf);
|
||||
static char *ngx_http_core_error_page(ngx_conf_t *cf, ngx_command_t *cmd,
|
||||
void *conf);
|
||||
+static char *ngx_http_core_no_error_pages(ngx_conf_t *cf, ngx_command_t *cmd,
|
||||
+ void *conf);
|
||||
static char *ngx_http_core_try_files(ngx_conf_t *cf, ngx_command_t *cmd,
|
||||
void *conf);
|
||||
static char *ngx_http_core_open_file_cache(ngx_conf_t *cf, ngx_command_t *cmd,
|
||||
@@ -614,6 +616,14 @@
|
||||
0,
|
||||
NULL },
|
||||
|
||||
+ { ngx_string("no_error_pages"),
|
||||
+ NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF
|
||||
+ |NGX_CONF_NOARGS,
|
||||
+ ngx_http_core_no_error_pages,
|
||||
+ NGX_HTTP_LOC_CONF_OFFSET,
|
||||
+ 0,
|
||||
+ NULL },
|
||||
+
|
||||
{ ngx_string("try_files"),
|
||||
NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_2MORE,
|
||||
ngx_http_core_try_files,
|
||||
@@ -3052,7 +3062,6 @@
|
||||
* clcf->types = NULL;
|
||||
* clcf->default_type = { 0, NULL };
|
||||
* clcf->error_log = NULL;
|
||||
- * clcf->error_pages = NULL;
|
||||
* clcf->try_files = NULL;
|
||||
* clcf->client_body_path = NULL;
|
||||
* clcf->regex = NULL;
|
||||
@@ -3062,6 +3071,7 @@
|
||||
* clcf->gzip_proxied = 0;
|
||||
*/
|
||||
|
||||
+ clcf->error_pages = NGX_CONF_UNSET_PTR;
|
||||
clcf->client_max_body_size = NGX_CONF_UNSET;
|
||||
clcf->client_body_buffer_size = NGX_CONF_UNSET_SIZE;
|
||||
clcf->client_body_timeout = NGX_CONF_UNSET_MSEC;
|
||||
@@ -3250,9 +3260,7 @@
|
||||
}
|
||||
}
|
||||
|
||||
- if (conf->error_pages == NULL && prev->error_pages) {
|
||||
- conf->error_pages = prev->error_pages;
|
||||
- }
|
||||
+ ngx_conf_merge_ptr_value(conf->error_pages, prev->error_pages, NULL);
|
||||
|
||||
ngx_conf_merge_str_value(conf->default_type,
|
||||
prev->default_type, "text/plain");
|
||||
@@ -3988,6 +3996,10 @@
|
||||
ngx_http_compile_complex_value_t ccv;
|
||||
|
||||
if (clcf->error_pages == NULL) {
|
||||
+ return "conflicts with \"no_error_pages\"";
|
||||
+ }
|
||||
+
|
||||
+ if (clcf->error_pages == NGX_CONF_UNSET_PTR) {
|
||||
clcf->error_pages = ngx_array_create(cf->pool, 4,
|
||||
sizeof(ngx_http_err_page_t));
|
||||
if (clcf->error_pages == NULL) {
|
||||
@@ -4095,6 +4107,25 @@
|
||||
|
||||
|
||||
static char *
|
||||
+ngx_http_core_no_error_pages(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
|
||||
+{
|
||||
+ ngx_http_core_loc_conf_t *clcf = conf;
|
||||
+
|
||||
+ if (clcf->error_pages == NULL) {
|
||||
+ return "is duplicate";
|
||||
+ }
|
||||
+
|
||||
+ if (clcf->error_pages != NGX_CONF_UNSET_PTR) {
|
||||
+ return "conflicts with \"error_page\"";
|
||||
+ }
|
||||
+
|
||||
+ clcf->error_pages = NULL;
|
||||
+
|
||||
+ return NGX_CONF_OK;
|
||||
+}
|
||||
+
|
||||
+
|
||||
+static char *
|
||||
ngx_http_core_try_files(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
|
||||
{
|
||||
ngx_http_core_loc_conf_t *clcf = conf;
|
504
patches/nginx-1.0.11-no_pool.patch
Normal file
504
patches/nginx-1.0.11-no_pool.patch
Normal file
@ -0,0 +1,504 @@
|
||||
diff -ur nginx-1.0.11/src/core/nginx.h nginx-1.0.11-patched/src/core/nginx.h
|
||||
--- nginx-1.0.11/src/core/nginx.h 2011-08-29 17:30:22.000000000 +0800
|
||||
+++ nginx-1.0.11-patched/src/core/nginx.h 2011-09-13 12:11:03.135622101 +0800
|
||||
@@ -10,7 +10,7 @@
|
||||
|
||||
|
||||
#define nginx_version 1000011
|
||||
#define NGINX_VERSION "1.0.11"
|
||||
-#define NGINX_VER "ngx_openresty/" NGINX_VERSION ".unknown"
|
||||
+#define NGINX_VER "ngx_openresty/" NGINX_VERSION ".unknown (no pool)"
|
||||
|
||||
#define NGINX_VAR "NGINX"
|
||||
diff -ur nginx-1.0.11/src/core/ngx_array.c nginx-1.0.11-patched/src/core/ngx_array.c
|
||||
--- nginx-1.0.11/src/core/ngx_array.c 2008-06-17 23:00:30.000000000 +0800
|
||||
+++ nginx-1.0.11-patched/src/core/ngx_array.c 2011-09-14 12:02:56.263128538 +0800
|
||||
@@ -39,13 +39,7 @@
|
||||
|
||||
p = a->pool;
|
||||
|
||||
- if ((u_char *) a->elts + a->size * a->nalloc == p->d.last) {
|
||||
- p->d.last -= a->size * a->nalloc;
|
||||
- }
|
||||
-
|
||||
- if ((u_char *) a + sizeof(ngx_array_t) == p->d.last) {
|
||||
- p->d.last = (u_char *) a;
|
||||
- }
|
||||
+ ngx_pfree(p, a);
|
||||
}
|
||||
|
||||
|
||||
@@ -64,29 +58,17 @@
|
||||
|
||||
p = a->pool;
|
||||
|
||||
- if ((u_char *) a->elts + size == p->d.last
|
||||
- && p->d.last + a->size <= p->d.end)
|
||||
- {
|
||||
- /*
|
||||
- * the array allocation is the last in the pool
|
||||
- * and there is space for new allocation
|
||||
- */
|
||||
-
|
||||
- p->d.last += a->size;
|
||||
- a->nalloc++;
|
||||
-
|
||||
- } else {
|
||||
- /* allocate a new array */
|
||||
-
|
||||
- new = ngx_palloc(p, 2 * size);
|
||||
- if (new == NULL) {
|
||||
- return NULL;
|
||||
- }
|
||||
-
|
||||
- ngx_memcpy(new, a->elts, size);
|
||||
- a->elts = new;
|
||||
- a->nalloc *= 2;
|
||||
+ /* allocate a new array */
|
||||
+
|
||||
+ new = ngx_palloc(p, 2 * size);
|
||||
+ if (new == NULL) {
|
||||
+ return NULL;
|
||||
}
|
||||
+
|
||||
+ ngx_memcpy(new, a->elts, size);
|
||||
+ a->elts = new;
|
||||
+ a->nalloc *= 2;
|
||||
+
|
||||
}
|
||||
|
||||
elt = (u_char *) a->elts + a->size * a->nelts;
|
||||
@@ -100,43 +82,25 @@
|
||||
ngx_array_push_n(ngx_array_t *a, ngx_uint_t n)
|
||||
{
|
||||
void *elt, *new;
|
||||
- size_t size;
|
||||
ngx_uint_t nalloc;
|
||||
ngx_pool_t *p;
|
||||
|
||||
- size = n * a->size;
|
||||
-
|
||||
if (a->nelts + n > a->nalloc) {
|
||||
|
||||
/* the array is full */
|
||||
|
||||
p = a->pool;
|
||||
|
||||
- if ((u_char *) a->elts + a->size * a->nalloc == p->d.last
|
||||
- && p->d.last + size <= p->d.end)
|
||||
- {
|
||||
- /*
|
||||
- * the array allocation is the last in the pool
|
||||
- * and there is space for new allocation
|
||||
- */
|
||||
-
|
||||
- p->d.last += size;
|
||||
- a->nalloc += n;
|
||||
-
|
||||
- } else {
|
||||
- /* allocate a new array */
|
||||
-
|
||||
- nalloc = 2 * ((n >= a->nalloc) ? n : a->nalloc);
|
||||
-
|
||||
- new = ngx_palloc(p, nalloc * a->size);
|
||||
- if (new == NULL) {
|
||||
- return NULL;
|
||||
- }
|
||||
-
|
||||
- ngx_memcpy(new, a->elts, a->nelts * a->size);
|
||||
- a->elts = new;
|
||||
- a->nalloc = nalloc;
|
||||
+ nalloc = 2 * ((n >= a->nalloc) ? n : a->nalloc);
|
||||
+
|
||||
+ new = ngx_palloc(p, nalloc * a->size);
|
||||
+ if (new == NULL) {
|
||||
+ return NULL;
|
||||
}
|
||||
+
|
||||
+ ngx_memcpy(new, a->elts, a->nelts * a->size);
|
||||
+ a->elts = new;
|
||||
+ a->nalloc = nalloc;
|
||||
}
|
||||
|
||||
elt = (u_char *) a->elts + a->size * a->nelts;
|
||||
diff -ur nginx-1.0.11/src/core/ngx_palloc.c nginx-1.0.11-patched/src/core/ngx_palloc.c
|
||||
--- nginx-1.0.11/src/core/ngx_palloc.c 2009-12-17 20:25:46.000000000 +0800
|
||||
+++ nginx-1.0.11-patched/src/core/ngx_palloc.c 2011-09-14 12:03:41.663126519 +0800
|
||||
@@ -8,24 +8,31 @@
|
||||
#include <ngx_core.h>
|
||||
|
||||
|
||||
-static void *ngx_palloc_block(ngx_pool_t *pool, size_t size);
|
||||
static void *ngx_palloc_large(ngx_pool_t *pool, size_t size);
|
||||
|
||||
|
||||
ngx_pool_t *
|
||||
ngx_create_pool(size_t size, ngx_log_t *log)
|
||||
{
|
||||
- ngx_pool_t *p;
|
||||
+ ngx_pool_t *p;
|
||||
+ ngx_pool_data_t *d;
|
||||
|
||||
- p = ngx_memalign(NGX_POOL_ALIGNMENT, size, log);
|
||||
+ size = sizeof(ngx_pool_t);
|
||||
+ p = ngx_alloc(size, log);
|
||||
if (p == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
- p->d.last = (u_char *) p + sizeof(ngx_pool_t);
|
||||
- p->d.end = (u_char *) p + size;
|
||||
- p->d.next = NULL;
|
||||
- p->d.failed = 0;
|
||||
+ d = ngx_alloc(sizeof(ngx_pool_data_t), log);
|
||||
+
|
||||
+ if (d == NULL) {
|
||||
+ return NULL;
|
||||
+ }
|
||||
+
|
||||
+ d->next = d;
|
||||
+ d->prev = d;
|
||||
+ d->alloc = NULL;
|
||||
+ p->d = d;
|
||||
|
||||
size = size - sizeof(ngx_pool_t);
|
||||
p->max = (size < NGX_MAX_ALLOC_FROM_POOL) ? size : NGX_MAX_ALLOC_FROM_POOL;
|
||||
@@ -43,7 +50,7 @@
|
||||
void
|
||||
ngx_destroy_pool(ngx_pool_t *pool)
|
||||
{
|
||||
- ngx_pool_t *p, *n;
|
||||
+ ngx_pool_data_t *d, *n;
|
||||
ngx_pool_large_t *l;
|
||||
ngx_pool_cleanup_t *c;
|
||||
|
||||
@@ -55,7 +62,7 @@
|
||||
}
|
||||
}
|
||||
|
||||
- for (l = pool->large; l; l = l->next) {
|
||||
+ for (l = pool->large; l ; l = l->next) {
|
||||
|
||||
ngx_log_debug1(NGX_LOG_DEBUG_ALLOC, pool->log, 0, "free: %p", l->alloc);
|
||||
|
||||
@@ -71,34 +78,45 @@
|
||||
* so we can not use this log while the free()ing the pool
|
||||
*/
|
||||
|
||||
- for (p = pool, n = pool->d.next; /* void */; p = n, n = n->d.next) {
|
||||
+ for (d = pool->d, n = d->next; ; d = n, n = n->next) {
|
||||
ngx_log_debug2(NGX_LOG_DEBUG_ALLOC, pool->log, 0,
|
||||
- "free: %p, unused: %uz", p, p->d.end - p->d.last);
|
||||
+ "free: %p", d);
|
||||
|
||||
- if (n == NULL) {
|
||||
+ if (n == pool->d) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
+ if (pool->d->next == pool->d) {
|
||||
+ ngx_free(pool->d);
|
||||
+ } else {
|
||||
+ for (d = pool->d, n = d->next; ; d = n, n = n->next) {
|
||||
+ if (d->alloc) {
|
||||
+ ngx_free(d->alloc);
|
||||
+ }
|
||||
+ ngx_free(d);
|
||||
|
||||
- for (p = pool, n = pool->d.next; /* void */; p = n, n = n->d.next) {
|
||||
- ngx_free(p);
|
||||
-
|
||||
- if (n == NULL) {
|
||||
- break;
|
||||
+ if (n == pool->d) {
|
||||
+ break;
|
||||
+ }
|
||||
}
|
||||
}
|
||||
+
|
||||
+ ngx_free(pool);
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
ngx_reset_pool(ngx_pool_t *pool)
|
||||
{
|
||||
- ngx_pool_t *p;
|
||||
- ngx_pool_large_t *l;
|
||||
+ ngx_pool_data_t *p, *tmp;
|
||||
+ ngx_pool_large_t *l;
|
||||
+
|
||||
+ for (l = pool->large; l ; l = l->next) {
|
||||
+
|
||||
+ ngx_log_debug1(NGX_LOG_DEBUG_ALLOC, pool->log, 0, "free: %p", l->alloc);
|
||||
|
||||
- for (l = pool->large; l; l = l->next) {
|
||||
if (l->alloc) {
|
||||
ngx_free(l->alloc);
|
||||
}
|
||||
@@ -106,109 +124,65 @@
|
||||
|
||||
pool->large = NULL;
|
||||
|
||||
- for (p = pool; p; p = p->d.next) {
|
||||
- p->d.last = (u_char *) p + sizeof(ngx_pool_t);
|
||||
+ p = pool->d->next;
|
||||
+ while (p != pool->d) {
|
||||
+ tmp = p;
|
||||
+ ngx_free(p->alloc);
|
||||
+ p->prev->next = p->next;
|
||||
+ p->next->prev = p->prev;
|
||||
+ p = p->next;
|
||||
+ ngx_free(tmp);
|
||||
}
|
||||
-}
|
||||
|
||||
+ ngx_free(pool->d->alloc);
|
||||
+ pool->d->alloc = NULL;
|
||||
+
|
||||
+}
|
||||
|
||||
void *
|
||||
-ngx_palloc(ngx_pool_t *pool, size_t size)
|
||||
+ngx_malloc(ngx_pool_t *pool, size_t size)
|
||||
{
|
||||
- u_char *m;
|
||||
- ngx_pool_t *p;
|
||||
-
|
||||
- if (size <= pool->max) {
|
||||
+ ngx_pool_data_t *new;
|
||||
+ void *m;
|
||||
|
||||
- p = pool->current;
|
||||
-
|
||||
- do {
|
||||
- m = ngx_align_ptr(p->d.last, NGX_ALIGNMENT);
|
||||
-
|
||||
- if ((size_t) (p->d.end - m) >= size) {
|
||||
- p->d.last = m + size;
|
||||
-
|
||||
- return m;
|
||||
- }
|
||||
-
|
||||
- p = p->d.next;
|
||||
-
|
||||
- } while (p);
|
||||
+ m = ngx_alloc(size, pool->log);
|
||||
+ if (m == NULL) {
|
||||
+ return NULL;
|
||||
+ }
|
||||
|
||||
- return ngx_palloc_block(pool, size);
|
||||
+ new = ngx_alloc(sizeof(ngx_pool_data_t), pool->log);
|
||||
+ if (new == NULL){
|
||||
+ ngx_free(m);
|
||||
+ return NULL;
|
||||
}
|
||||
|
||||
- return ngx_palloc_large(pool, size);
|
||||
+ new->alloc = m;
|
||||
+ new->next = pool->d;
|
||||
+ new->prev = pool->d->prev;
|
||||
+ pool->d->prev->next = new;
|
||||
+ pool->d->prev = new;
|
||||
+ return m;
|
||||
}
|
||||
|
||||
-
|
||||
void *
|
||||
-ngx_pnalloc(ngx_pool_t *pool, size_t size)
|
||||
+ngx_palloc(ngx_pool_t *pool, size_t size)
|
||||
{
|
||||
- u_char *m;
|
||||
- ngx_pool_t *p;
|
||||
-
|
||||
- if (size <= pool->max) {
|
||||
-
|
||||
- p = pool->current;
|
||||
-
|
||||
- do {
|
||||
- m = p->d.last;
|
||||
-
|
||||
- if ((size_t) (p->d.end - m) >= size) {
|
||||
- p->d.last = m + size;
|
||||
-
|
||||
- return m;
|
||||
- }
|
||||
-
|
||||
- p = p->d.next;
|
||||
-
|
||||
- } while (p);
|
||||
-
|
||||
- return ngx_palloc_block(pool, size);
|
||||
+ if (size <= 1024) {
|
||||
+ return ngx_malloc(pool, size);
|
||||
}
|
||||
|
||||
return ngx_palloc_large(pool, size);
|
||||
}
|
||||
|
||||
|
||||
-static void *
|
||||
-ngx_palloc_block(ngx_pool_t *pool, size_t size)
|
||||
+void *
|
||||
+ngx_pnalloc(ngx_pool_t *pool, size_t size)
|
||||
{
|
||||
- u_char *m;
|
||||
- size_t psize;
|
||||
- ngx_pool_t *p, *new, *current;
|
||||
-
|
||||
- psize = (size_t) (pool->d.end - (u_char *) pool);
|
||||
-
|
||||
- m = ngx_memalign(NGX_POOL_ALIGNMENT, psize, pool->log);
|
||||
- if (m == NULL) {
|
||||
- return NULL;
|
||||
- }
|
||||
-
|
||||
- new = (ngx_pool_t *) m;
|
||||
-
|
||||
- new->d.end = m + psize;
|
||||
- new->d.next = NULL;
|
||||
- new->d.failed = 0;
|
||||
-
|
||||
- m += sizeof(ngx_pool_data_t);
|
||||
- m = ngx_align_ptr(m, NGX_ALIGNMENT);
|
||||
- new->d.last = m + size;
|
||||
-
|
||||
- current = pool->current;
|
||||
-
|
||||
- for (p = current; p->d.next; p = p->d.next) {
|
||||
- if (p->d.failed++ > 4) {
|
||||
- current = p->d.next;
|
||||
- }
|
||||
+ if (size <= 1024) {
|
||||
+ return ngx_malloc(pool, size);
|
||||
}
|
||||
|
||||
- p->d.next = new;
|
||||
-
|
||||
- pool->current = current ? current : new;
|
||||
-
|
||||
- return m;
|
||||
+ return ngx_palloc_large(pool, size);
|
||||
}
|
||||
|
||||
|
||||
@@ -216,7 +190,6 @@
|
||||
ngx_palloc_large(ngx_pool_t *pool, size_t size)
|
||||
{
|
||||
void *p;
|
||||
- ngx_uint_t n;
|
||||
ngx_pool_large_t *large;
|
||||
|
||||
p = ngx_alloc(size, pool->log);
|
||||
@@ -224,20 +197,7 @@
|
||||
return NULL;
|
||||
}
|
||||
|
||||
- n = 0;
|
||||
-
|
||||
- for (large = pool->large; large; large = large->next) {
|
||||
- if (large->alloc == NULL) {
|
||||
- large->alloc = p;
|
||||
- return p;
|
||||
- }
|
||||
-
|
||||
- if (n++ > 3) {
|
||||
- break;
|
||||
- }
|
||||
- }
|
||||
-
|
||||
- large = ngx_palloc(pool, sizeof(ngx_pool_large_t));
|
||||
+ large = ngx_malloc(pool, sizeof(ngx_pool_large_t));
|
||||
if (large == NULL) {
|
||||
ngx_free(p);
|
||||
return NULL;
|
||||
@@ -262,7 +222,7 @@
|
||||
return NULL;
|
||||
}
|
||||
|
||||
- large = ngx_palloc(pool, sizeof(ngx_pool_large_t));
|
||||
+ large = ngx_malloc(pool, sizeof(ngx_pool_large_t));
|
||||
if (large == NULL) {
|
||||
ngx_free(p);
|
||||
return NULL;
|
||||
@@ -279,17 +239,41 @@
|
||||
ngx_int_t
|
||||
ngx_pfree(ngx_pool_t *pool, void *p)
|
||||
{
|
||||
- ngx_pool_large_t *l;
|
||||
+ ngx_pool_large_t *l;
|
||||
+ ngx_pool_large_t *ll;
|
||||
+ ngx_pool_data_t *d, *n;
|
||||
|
||||
- for (l = pool->large; l; l = l->next) {
|
||||
+ for (l = pool->large, ll = l; l; ll = l, l = l->next) {
|
||||
if (p == l->alloc) {
|
||||
ngx_log_debug1(NGX_LOG_DEBUG_ALLOC, pool->log, 0,
|
||||
"free: %p", l->alloc);
|
||||
ngx_free(l->alloc);
|
||||
l->alloc = NULL;
|
||||
+ if (l == pool->large) {
|
||||
+ pool->large = NULL;
|
||||
+ }
|
||||
+
|
||||
+ ll->next = l->next;
|
||||
+ p = l;
|
||||
+ break;
|
||||
+ }
|
||||
+ }
|
||||
|
||||
+ for (d = pool->d, n = d->next; ; d = n, n = d->next) {
|
||||
+ if (p == d->alloc) {
|
||||
+ ngx_log_debug1(NGX_LOG_DEBUG_ALLOC, pool->log, 0, "free: %p", d->alloc);
|
||||
+ if (d->alloc) {
|
||||
+ ngx_free(d->alloc);
|
||||
+ }
|
||||
+ d->alloc = NULL;
|
||||
+ d->prev->next = d->next;
|
||||
+ d->next->prev = d->prev;
|
||||
+ ngx_free(d);
|
||||
return NGX_OK;
|
||||
}
|
||||
+ if (d->next == pool->d) {
|
||||
+ break;
|
||||
+ }
|
||||
}
|
||||
|
||||
return NGX_DECLINED;
|
||||
diff -ur nginx-1.0.11/src/core/ngx_palloc.h nginx-1.0.11-patched/src/core/ngx_palloc.h
|
||||
--- nginx-1.0.11/src/core/ngx_palloc.h 2009-12-17 20:25:46.000000000 +0800
|
||||
+++ nginx-1.0.11-patched/src/core/ngx_palloc.h 2011-09-13 12:11:03.155622101 +0800
|
||||
@@ -38,6 +38,7 @@
|
||||
|
||||
|
||||
typedef struct ngx_pool_large_s ngx_pool_large_t;
|
||||
+typedef struct ngx_pool_data_s ngx_pool_data_t;
|
||||
|
||||
struct ngx_pool_large_s {
|
||||
ngx_pool_large_t *next;
|
||||
@@ -45,16 +46,15 @@
|
||||
};
|
||||
|
||||
|
||||
-typedef struct {
|
||||
- u_char *last;
|
||||
- u_char *end;
|
||||
- ngx_pool_t *next;
|
||||
- ngx_uint_t failed;
|
||||
-} ngx_pool_data_t;
|
||||
+struct ngx_pool_data_s{
|
||||
+ ngx_pool_data_t *next;
|
||||
+ ngx_pool_data_t *prev;
|
||||
+ void *alloc;
|
||||
+};
|
||||
|
||||
|
||||
struct ngx_pool_s {
|
||||
- ngx_pool_data_t d;
|
||||
+ ngx_pool_data_t *d;
|
||||
size_t max;
|
||||
ngx_pool_t *current;
|
||||
ngx_chain_t *chain;
|
113
patches/nginx-1.0.11-null_character_fixes.patch
Normal file
113
patches/nginx-1.0.11-null_character_fixes.patch
Normal file
@ -0,0 +1,113 @@
|
||||
--- src/http/modules/ngx_http_fastcgi_module.c
|
||||
+++ src/http/modules/ngx_http_fastcgi_module.c
|
||||
@@ -1501,10 +1501,10 @@ ngx_http_fastcgi_process_header(ngx_http
|
||||
h->lowcase_key = h->key.data + h->key.len + 1
|
||||
+ h->value.len + 1;
|
||||
|
||||
- ngx_cpystrn(h->key.data, r->header_name_start,
|
||||
- h->key.len + 1);
|
||||
- ngx_cpystrn(h->value.data, r->header_start,
|
||||
- h->value.len + 1);
|
||||
+ ngx_memcpy(h->key.data, r->header_name_start, h->key.len);
|
||||
+ h->key.data[h->key.len] = '\0';
|
||||
+ ngx_memcpy(h->value.data, r->header_start, h->value.len);
|
||||
+ h->value.data[h->value.len] = '\0';
|
||||
}
|
||||
|
||||
h->hash = r->header_hash;
|
||||
--- src/http/modules/ngx_http_proxy_module.c
|
||||
+++ src/http/modules/ngx_http_proxy_module.c
|
||||
@@ -1381,8 +1381,10 @@ ngx_http_proxy_process_header(ngx_http_r
|
||||
h->value.data = h->key.data + h->key.len + 1;
|
||||
h->lowcase_key = h->key.data + h->key.len + 1 + h->value.len + 1;
|
||||
|
||||
- ngx_cpystrn(h->key.data, r->header_name_start, h->key.len + 1);
|
||||
- ngx_cpystrn(h->value.data, r->header_start, h->value.len + 1);
|
||||
+ ngx_memcpy(h->key.data, r->header_name_start, h->key.len);
|
||||
+ h->key.data[h->key.len] = '\0';
|
||||
+ ngx_memcpy(h->value.data, r->header_start, h->value.len);
|
||||
+ h->value.data[h->value.len] = '\0';
|
||||
|
||||
if (h->key.len == r->lowcase_index) {
|
||||
ngx_memcpy(h->lowcase_key, r->lowcase_header, h->key.len);
|
||||
--- src/http/modules/ngx_http_scgi_module.c
|
||||
+++ src/http/modules/ngx_http_scgi_module.c
|
||||
@@ -941,8 +941,10 @@ ngx_http_scgi_process_header(ngx_http_re
|
||||
h->value.data = h->key.data + h->key.len + 1;
|
||||
h->lowcase_key = h->key.data + h->key.len + 1 + h->value.len + 1;
|
||||
|
||||
- ngx_cpystrn(h->key.data, r->header_name_start, h->key.len + 1);
|
||||
- ngx_cpystrn(h->value.data, r->header_start, h->value.len + 1);
|
||||
+ ngx_memcpy(h->key.data, r->header_name_start, h->key.len);
|
||||
+ h->key.data[h->key.len] = '\0';
|
||||
+ ngx_memcpy(h->value.data, r->header_start, h->value.len);
|
||||
+ h->value.data[h->value.len] = '\0';
|
||||
|
||||
if (h->key.len == r->lowcase_index) {
|
||||
ngx_memcpy(h->lowcase_key, r->lowcase_header, h->key.len);
|
||||
--- src/http/modules/ngx_http_uwsgi_module.c
|
||||
+++ src/http/modules/ngx_http_uwsgi_module.c
|
||||
@@ -985,8 +985,10 @@ ngx_http_uwsgi_process_header(ngx_http_r
|
||||
h->value.data = h->key.data + h->key.len + 1;
|
||||
h->lowcase_key = h->key.data + h->key.len + 1 + h->value.len + 1;
|
||||
|
||||
- ngx_cpystrn(h->key.data, r->header_name_start, h->key.len + 1);
|
||||
- ngx_cpystrn(h->value.data, r->header_start, h->value.len + 1);
|
||||
+ ngx_memcpy(h->key.data, r->header_name_start, h->key.len);
|
||||
+ h->key.data[h->key.len] = '\0';
|
||||
+ ngx_memcpy(h->value.data, r->header_start, h->value.len);
|
||||
+ h->value.data[h->value.len] = '\0';
|
||||
|
||||
if (h->key.len == r->lowcase_index) {
|
||||
ngx_memcpy(h->lowcase_key, r->lowcase_header, h->key.len);
|
||||
--- src/http/ngx_http_parse.c
|
||||
+++ src/http/ngx_http_parse.c
|
||||
@@ -874,6 +874,10 @@ ngx_http_parse_header_line(ngx_http_requ
|
||||
break;
|
||||
}
|
||||
|
||||
+ if (ch == '\0') {
|
||||
+ return NGX_HTTP_PARSE_INVALID_HEADER;
|
||||
+ }
|
||||
+
|
||||
r->invalid_header = 1;
|
||||
|
||||
break;
|
||||
@@ -936,6 +940,10 @@ ngx_http_parse_header_line(ngx_http_requ
|
||||
break;
|
||||
}
|
||||
|
||||
+ if (ch == '\0') {
|
||||
+ return NGX_HTTP_PARSE_INVALID_HEADER;
|
||||
+ }
|
||||
+
|
||||
r->invalid_header = 1;
|
||||
|
||||
break;
|
||||
@@ -954,6 +962,8 @@ ngx_http_parse_header_line(ngx_http_requ
|
||||
r->header_start = p;
|
||||
r->header_end = p;
|
||||
goto done;
|
||||
+ case '\0':
|
||||
+ return NGX_HTTP_PARSE_INVALID_HEADER;
|
||||
default:
|
||||
r->header_start = p;
|
||||
state = sw_value;
|
||||
@@ -975,6 +985,8 @@ ngx_http_parse_header_line(ngx_http_requ
|
||||
case LF:
|
||||
r->header_end = p;
|
||||
goto done;
|
||||
+ case '\0':
|
||||
+ return NGX_HTTP_PARSE_INVALID_HEADER;
|
||||
}
|
||||
break;
|
||||
|
||||
@@ -988,6 +1000,8 @@ ngx_http_parse_header_line(ngx_http_requ
|
||||
break;
|
||||
case LF:
|
||||
goto done;
|
||||
+ case '\0':
|
||||
+ return NGX_HTTP_PARSE_INVALID_HEADER;
|
||||
default:
|
||||
state = sw_value;
|
||||
break;
|
27
patches/nginx-1.0.11-request_body_in_single_buf.patch
Normal file
27
patches/nginx-1.0.11-request_body_in_single_buf.patch
Normal file
@ -0,0 +1,27 @@
|
||||
# HG changeset patch
|
||||
# User Maxim Dounin <mdounin@mdounin.ru>
|
||||
# Date 1309799136 -14400
|
||||
# Node ID 99e276bba8596bc4df9e638482ee413f4c6bf700
|
||||
# Parent e7b2f945d55ae44a2295facf9e3336dc4633e5b5
|
||||
Core: fix body with request_body_in_single_buf.
|
||||
|
||||
If there were preread data and request body was big enough first part
|
||||
of request body was duplicated.
|
||||
|
||||
See report here:
|
||||
http://nginx.org/pipermail/nginx/2011-July/027756.html
|
||||
|
||||
diff --git a/src/http/ngx_http_request_body.c b/src/http/ngx_http_request_body.c
|
||||
--- a/src/http/ngx_http_request_body.c
|
||||
+++ b/src/http/ngx_http_request_body.c
|
||||
@@ -372,7 +372,9 @@ ngx_http_do_read_client_request_body(ngx
|
||||
}
|
||||
}
|
||||
|
||||
- if (r->request_body_in_file_only && rb->bufs->next) {
|
||||
+ if (rb->bufs->next
|
||||
+ && (r->request_body_in_file_only || r->request_body_in_single_buf))
|
||||
+ {
|
||||
rb->bufs = rb->bufs->next;
|
||||
}
|
||||
|
17
patches/nginx-1.0.11-request_body_preread_fix.patch
Normal file
17
patches/nginx-1.0.11-request_body_preread_fix.patch
Normal file
@ -0,0 +1,17 @@
|
||||
# HG changeset patch
|
||||
# User Maxim Dounin <mdounin@mdounin.ru>
|
||||
# Date 1309776931 -14400
|
||||
# Node ID e7b2f945d55ae44a2295facf9e3336dc4633e5b5
|
||||
# Parent 610e909bb9e29766188aa86fae3abe0bd3432940
|
||||
Core: fix body if it's preread and there are extra data.
|
||||
|
||||
--- nginx-1.0.11/src/http/ngx_http_request_body.c 2011-07-05 12:11:21.619264633 +0800
|
||||
+++ nginx-1.0.11-patched/src/http/ngx_http_request_body.c 2011-07-05 12:14:30.694321554 +0800
|
||||
@@ -141,6 +141,7 @@
|
||||
|
||||
/* the whole request body was pre-read */
|
||||
|
||||
+ b->last = b->pos + r->headers_in.content_length_n;
|
||||
r->header_in->pos += (size_t) r->headers_in.content_length_n;
|
||||
r->request_length += r->headers_in.content_length_n;
|
||||
|
26
patches/nginx-1.0.11-server_header.patch
Normal file
26
patches/nginx-1.0.11-server_header.patch
Normal file
@ -0,0 +1,26 @@
|
||||
diff -ur lz-nginx-1.0.11/nginx-1.0.11/src/core/nginx.h lz-nginx-1.0.11-patched/nginx-1.0.11/src/core/nginx.h
|
||||
--- lz-nginx-1.0.11/nginx-1.0.11/src/core/nginx.h 2010-02-12 17:31:01.000000000 +0800
|
||||
+++ lz-nginx-1.0.11-patched/nginx-1.0.11/src/core/nginx.h 2010-03-30 10:52:13.240702627 +0800
|
||||
@@ -10,7 +10,7 @@
|
||||
|
||||
#define nginx_version 1000011
|
||||
#define NGINX_VERSION "1.0.11"
|
||||
-#define NGINX_VER "nginx/" NGINX_VERSION
|
||||
+#define NGINX_VER "ngx_openresty/" NGINX_VERSION ".unknown"
|
||||
|
||||
#define NGINX_VAR "NGINX"
|
||||
#define NGX_OLDPID_EXT ".oldbin"
|
||||
Only in lz-nginx-1.0.11-patched/nginx-1.0.11/src/core: nginx.h.orig
|
||||
Only in lz-nginx-1.0.11-patched/nginx-1.0.11/src/core: nginx.h.rej
|
||||
diff -ur lz-nginx-1.0.11/nginx-1.0.11/src/http/ngx_http_header_filter_module.c lz-nginx-1.0.11-patched/nginx-1.0.11/src/http/ngx_http_header_filter_module.c
|
||||
--- lz-nginx-1.0.11/nginx-1.0.11/src/http/ngx_http_header_filter_module.c 2010-03-03 23:14:04.000000000 +0800
|
||||
+++ lz-nginx-1.0.11-patched/nginx-1.0.11/src/http/ngx_http_header_filter_module.c 2010-03-30 10:52:53.670909405 +0800
|
||||
@@ -45,7 +45,7 @@
|
||||
};
|
||||
|
||||
|
||||
-static char ngx_http_server_string[] = "Server: nginx" CRLF;
|
||||
+static char ngx_http_server_string[] = "Server: ngx_openresty" CRLF;
|
||||
static char ngx_http_server_full_string[] = "Server: " NGINX_VER CRLF;
|
||||
|
||||
|
40
patches/nginx-1.0.11-subrequest_loop.patch
Normal file
40
patches/nginx-1.0.11-subrequest_loop.patch
Normal file
@ -0,0 +1,40 @@
|
||||
# HG changeset patch
|
||||
# User Maxim Dounin <mdounin@mdounin.ru>
|
||||
# Date 1309187571 -14400
|
||||
# Node ID 283a416b2235d5383c12a975edc8866f007fb628
|
||||
# Parent f5fc40783ddcbf4db33859ee2a9bce54cf32c350
|
||||
Core: protect from subrequest loops.
|
||||
|
||||
Without protection subrequest loop results in r->count overflow and
|
||||
SIGSEGV. Protection was broken in 0.7.25.
|
||||
|
||||
Note that this also limits number of parallel subrequests. This
|
||||
wasn't exactly the case before 0.7.25 as local subrequests were
|
||||
completed directly.
|
||||
|
||||
See here for details:
|
||||
|
||||
http://nginx.org/pipermail/nginx-ru/2010-February/032184.html
|
||||
|
||||
diff --git a/src/http/ngx_http_core_module.c b/src/http/ngx_http_core_module.c
|
||||
--- a/src/http/ngx_http_core_module.c
|
||||
+++ b/src/http/ngx_http_core_module.c
|
||||
@@ -2287,7 +2287,6 @@ ngx_http_subrequest(ngx_http_request_t *
|
||||
sr->start_sec = tp->sec;
|
||||
sr->start_msec = tp->msec;
|
||||
|
||||
- r->main->subrequests++;
|
||||
r->main->count++;
|
||||
|
||||
*psr = sr;
|
||||
diff --git a/src/http/ngx_http_request.c b/src/http/ngx_http_request.c
|
||||
--- a/src/http/ngx_http_request.c
|
||||
+++ b/src/http/ngx_http_request.c
|
||||
@@ -1981,6 +1981,7 @@ ngx_http_finalize_request(ngx_http_reque
|
||||
if (r == c->data) {
|
||||
|
||||
r->main->count--;
|
||||
+ r->main->subrequests++;
|
||||
|
||||
if (!r->logged) {
|
||||
|
32
patches/nginx-1.0.11-upstream_pipelining.patch
Normal file
32
patches/nginx-1.0.11-upstream_pipelining.patch
Normal file
@ -0,0 +1,32 @@
|
||||
diff -ur nginx-1.0.11/src/http/ngx_http_upstream.c nginx-1.0.11-patched/src/http/ngx_http_upstream.c
|
||||
--- nginx-1.0.11/src/http/ngx_http_upstream.c 2011-12-14 02:34:34.000000000 +0800
|
||||
+++ nginx-1.0.11-patched/src/http/ngx_http_upstream.c 2012-03-21 21:20:17.333111806 +0800
|
||||
@@ -1385,6 +1385,8 @@
|
||||
|
||||
/* rc == NGX_OK */
|
||||
|
||||
+ u->request_all_sent = 1;
|
||||
+
|
||||
if (c->tcp_nopush == NGX_TCP_NOPUSH_SET) {
|
||||
if (ngx_tcp_push(c->fd) == NGX_ERROR) {
|
||||
ngx_log_error(NGX_LOG_CRIT, c->log, ngx_socket_errno,
|
||||
@@ -1451,7 +1453,7 @@
|
||||
|
||||
#endif
|
||||
|
||||
- if (u->header_sent) {
|
||||
+ if (u->request_all_sent) {
|
||||
u->write_event_handler = ngx_http_upstream_dummy_handler;
|
||||
|
||||
(void) ngx_handle_write_event(c->write, 0);
|
||||
diff -ur nginx-1.0.11/src/http/ngx_http_upstream.h nginx-1.0.11-patched/src/http/ngx_http_upstream.h
|
||||
--- nginx-1.0.11/src/http/ngx_http_upstream.h 2011-11-01 22:18:10.000000000 +0800
|
||||
+++ nginx-1.0.11-patched/src/http/ngx_http_upstream.h 2012-03-21 21:18:21.041237173 +0800
|
||||
@@ -313,6 +313,7 @@
|
||||
unsigned buffering:1;
|
||||
|
||||
unsigned request_sent:1;
|
||||
+ unsigned request_all_sent:1;
|
||||
unsigned header_sent:1;
|
||||
};
|
||||
|
73
patches/nginx-1.0.11-variable_header_ignore_no_hash.patch
Normal file
73
patches/nginx-1.0.11-variable_header_ignore_no_hash.patch
Normal file
@ -0,0 +1,73 @@
|
||||
--- nginx-1.0.11/src/http/ngx_http_variables.c 2011-05-30 20:36:17.000000000 +0800
|
||||
+++ nginx-1.0.11-patched/src/http/ngx_http_variables.c 2011-11-08 22:21:55.229247198 +0800
|
||||
@@ -648,7 +648,17 @@
|
||||
|
||||
a = (ngx_array_t *) ((char *) r + data);
|
||||
|
||||
- n = a->nelts;
|
||||
+ h = a->elts;
|
||||
+ n = 0;
|
||||
+
|
||||
+ for (i = 0; i < a->nelts; i++) {
|
||||
+
|
||||
+ if (h[i]->hash == 0) {
|
||||
+ continue;
|
||||
+ }
|
||||
+
|
||||
+ n++;
|
||||
+ }
|
||||
|
||||
if (n == 0) {
|
||||
v->not_found = 1;
|
||||
@@ -659,9 +669,7 @@
|
||||
v->no_cacheable = 0;
|
||||
v->not_found = 0;
|
||||
|
||||
- h = a->elts;
|
||||
-
|
||||
- if (n == 1) {
|
||||
+ if (n == 1 && a->nelts == 1) {
|
||||
v->len = (*h)->value.len;
|
||||
v->data = (*h)->value.data;
|
||||
|
||||
@@ -670,7 +678,12 @@
|
||||
|
||||
len = - (ssize_t) (sizeof("; ") - 1);
|
||||
|
||||
- for (i = 0; i < n; i++) {
|
||||
+ for (i = 0; i < a->nelts; i++) {
|
||||
+
|
||||
+ if (h[i]->hash == 0) {
|
||||
+ continue;
|
||||
+ }
|
||||
+
|
||||
len += h[i]->value.len + sizeof("; ") - 1;
|
||||
}
|
||||
|
||||
@@ -683,9 +696,14 @@
|
||||
v->data = p;
|
||||
|
||||
for (i = 0; /* void */ ; i++) {
|
||||
+
|
||||
+ if (h[i]->hash == 0) {
|
||||
+ continue;
|
||||
+ }
|
||||
+
|
||||
p = ngx_copy(p, h[i]->value.data, h[i]->value.len);
|
||||
|
||||
- if (i == n - 1) {
|
||||
+ if (--n == 0) {
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -738,6 +756,10 @@
|
||||
i = 0;
|
||||
}
|
||||
|
||||
+ if (header[i].hash == 0) {
|
||||
+ continue;
|
||||
+ }
|
||||
+
|
||||
for (n = 0; n + prefix < var->len && n < header[i].key.len; n++) {
|
||||
ch = header[i].key.data[n];
|
||||
|
117
patches/nginx-1.0.12-allow_request_body_updating.patch
Normal file
117
patches/nginx-1.0.12-allow_request_body_updating.patch
Normal file
@ -0,0 +1,117 @@
|
||||
diff -ur nginx-1.0.12/src/http/ngx_http_request_body.c nginx-1.0.12-patched/src/http/ngx_http_request_body.c
|
||||
--- nginx-1.0.12/src/http/ngx_http_request_body.c 2011-09-30 22:36:19.000000000 +0800
|
||||
+++ nginx-1.0.12-patched/src/http/ngx_http_request_body.c 2011-10-21 21:54:08.460350482 +0800
|
||||
@@ -38,7 +38,7 @@
|
||||
|
||||
r->main->count++;
|
||||
|
||||
- if (r->request_body || r->discard_body) {
|
||||
+ if (r->request_body || r->discard_body || r->content_length_n == 0) {
|
||||
post_handler(r);
|
||||
return NGX_OK;
|
||||
}
|
||||
@@ -440,7 +440,7 @@
|
||||
ssize_t size;
|
||||
ngx_event_t *rev;
|
||||
|
||||
- if (r != r->main || r->discard_body) {
|
||||
+ if (r != r->main || r->discard_body || r->content_length_n == 0) {
|
||||
return NGX_OK;
|
||||
}
|
||||
|
||||
@@ -456,20 +456,22 @@
|
||||
ngx_del_timer(rev);
|
||||
}
|
||||
|
||||
- if (r->headers_in.content_length_n <= 0 || r->request_body) {
|
||||
+ r->content_length_n = r->headers_in.content_length_n;
|
||||
+
|
||||
+ if (r->content_length_n <= 0 || r->request_body) {
|
||||
return NGX_OK;
|
||||
}
|
||||
|
||||
size = r->header_in->last - r->header_in->pos;
|
||||
|
||||
if (size) {
|
||||
- if (r->headers_in.content_length_n > size) {
|
||||
+ if (r->content_length_n > size) {
|
||||
r->header_in->pos += size;
|
||||
- r->headers_in.content_length_n -= size;
|
||||
+ r->content_length_n -= size;
|
||||
|
||||
} else {
|
||||
- r->header_in->pos += (size_t) r->headers_in.content_length_n;
|
||||
- r->headers_in.content_length_n = 0;
|
||||
+ r->header_in->pos += (size_t) r->content_length_n;
|
||||
+ r->content_length_n = 0;
|
||||
return NGX_OK;
|
||||
}
|
||||
}
|
||||
@@ -568,7 +570,7 @@
|
||||
"http read discarded body");
|
||||
|
||||
for ( ;; ) {
|
||||
- if (r->headers_in.content_length_n == 0) {
|
||||
+ if (r->content_length_n == 0) {
|
||||
r->read_event_handler = ngx_http_block_reading;
|
||||
return NGX_OK;
|
||||
}
|
||||
@@ -577,9 +579,9 @@
|
||||
return NGX_AGAIN;
|
||||
}
|
||||
|
||||
- size = (r->headers_in.content_length_n > NGX_HTTP_DISCARD_BUFFER_SIZE) ?
|
||||
+ size = (r->content_length_n > NGX_HTTP_DISCARD_BUFFER_SIZE) ?
|
||||
NGX_HTTP_DISCARD_BUFFER_SIZE:
|
||||
- (size_t) r->headers_in.content_length_n;
|
||||
+ (size_t) r->content_length_n;
|
||||
|
||||
n = r->connection->recv(r->connection, buffer, size);
|
||||
|
||||
@@ -596,7 +598,7 @@
|
||||
return NGX_OK;
|
||||
}
|
||||
|
||||
- r->headers_in.content_length_n -= n;
|
||||
+ r->content_length_n -= n;
|
||||
}
|
||||
}
|
||||
|
||||
Only in nginx-1.0.12-patched/src/http: ngx_http_request_body.c~
|
||||
diff -ur nginx-1.0.12/src/http/ngx_http_request.c nginx-1.0.12-patched/src/http/ngx_http_request.c
|
||||
--- nginx-1.0.12/src/http/ngx_http_request.c 2011-09-30 22:36:19.000000000 +0800
|
||||
+++ nginx-1.0.12-patched/src/http/ngx_http_request.c 2011-10-21 19:06:38.404350692 +0800
|
||||
@@ -286,6 +286,8 @@
|
||||
|
||||
r->pipeline = hc->pipeline;
|
||||
|
||||
+ r->content_length_n = -1;
|
||||
+
|
||||
if (hc->nbusy) {
|
||||
r->header_in = hc->busy[0];
|
||||
}
|
||||
@@ -297,6 +299,8 @@
|
||||
return;
|
||||
}
|
||||
|
||||
+ r->content_length_n = -1;
|
||||
+
|
||||
hc->request = r;
|
||||
}
|
||||
|
||||
Only in nginx-1.0.12-patched/src/http: ngx_http_request.c~
|
||||
diff -ur nginx-1.0.12/src/http/ngx_http_request.h nginx-1.0.12-patched/src/http/ngx_http_request.h
|
||||
--- nginx-1.0.12/src/http/ngx_http_request.h 2011-08-29 18:39:23.000000000 +0800
|
||||
+++ nginx-1.0.12-patched/src/http/ngx_http_request.h 2011-10-21 17:26:13.203807584 +0800
|
||||
@@ -366,6 +366,9 @@
|
||||
ngx_pool_t *pool;
|
||||
ngx_buf_t *header_in;
|
||||
|
||||
+ off_t content_length_n;
|
||||
+ /* for discarding request body */
|
||||
+
|
||||
ngx_http_headers_in_t headers_in;
|
||||
ngx_http_headers_out_t headers_out;
|
||||
|
||||
Only in nginx-1.0.12-patched/src/http: ngx_http_request.h~
|
||||
Only in nginx-1.0.12-patched/src/http: tags
|
20
patches/nginx-1.0.12-epoll_check_stale_wev.patch
Normal file
20
patches/nginx-1.0.12-epoll_check_stale_wev.patch
Normal file
@ -0,0 +1,20 @@
|
||||
--- nginx-1.0.12/src/event/modules/ngx_epoll_module.c 2011-09-30 22:12:53.000000000 +0800
|
||||
+++ nginx-1.0.12-patched/src/event/modules/ngx_epoll_module.c 2011-11-30 11:08:46.775817019 +0800
|
||||
@@ -682,6 +682,17 @@
|
||||
wev = c->write;
|
||||
|
||||
if ((revents & EPOLLOUT) && wev->active) {
|
||||
+ if (c->fd == -1 || wev->instance != instance) {
|
||||
+
|
||||
+ /*
|
||||
+ * the stale event from a file descriptor
|
||||
+ * that was just closed in this iteration
|
||||
+ */
|
||||
+
|
||||
+ ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0,
|
||||
+ "epoll: stale event %p", c);
|
||||
+ continue;
|
||||
+ }
|
||||
|
||||
if (flags & NGX_POST_THREAD_EVENTS) {
|
||||
wev->posted_ready = 1;
|
69
patches/nginx-1.0.12-gzip_empty_flush_buf.patch
Normal file
69
patches/nginx-1.0.12-gzip_empty_flush_buf.patch
Normal file
@ -0,0 +1,69 @@
|
||||
# HG changeset patch
|
||||
# User Maxim Dounin <mdounin@mdounin.ru>
|
||||
# Date 1315324342 -14400
|
||||
# Node ID 4cf0af103bc382a78f894302d1706929a79df4bb
|
||||
# Parent d603ce98fada855f0100b422b7b5672fd22fabea
|
||||
Gzip filter: handle empty flush buffers.
|
||||
|
||||
Empty flush buffers are legitimate and may happen e.g. due to $r->flush()
|
||||
calls in embedded perl. If there are no data buffered in zlib deflate()
|
||||
will return Z_BUF_ERROR (i.e. no progress possible) without adding anything
|
||||
to output. Don't treat Z_BUF_ERROR as fatal and correctly send empty flush
|
||||
buffer if we have no data in output at all.
|
||||
|
||||
See this thread for details:
|
||||
http://mailman.nginx.org/pipermail/nginx/2010-November/023693.html
|
||||
|
||||
diff --git a/src/http/modules/ngx_http_gzip_filter_module.c b/src/http/modules/ngx_http_gzip_filter_module.c
|
||||
--- a/src/http/modules/ngx_http_gzip_filter_module.c
|
||||
+++ b/src/http/modules/ngx_http_gzip_filter_module.c
|
||||
@@ -758,6 +758,7 @@ static ngx_int_t
|
||||
ngx_http_gzip_filter_deflate(ngx_http_request_t *r, ngx_http_gzip_ctx_t *ctx)
|
||||
{
|
||||
int rc;
|
||||
+ ngx_buf_t *b;
|
||||
ngx_chain_t *cl;
|
||||
ngx_http_gzip_conf_t *conf;
|
||||
|
||||
@@ -769,7 +770,7 @@ ngx_http_gzip_filter_deflate(ngx_http_re
|
||||
|
||||
rc = deflate(&ctx->zstream, ctx->flush);
|
||||
|
||||
- if (rc != Z_OK && rc != Z_STREAM_END) {
|
||||
+ if (rc != Z_OK && rc != Z_STREAM_END && rc != Z_BUF_ERROR) {
|
||||
ngx_log_error(NGX_LOG_ALERT, r->connection->log, 0,
|
||||
"deflate() failed: %d, %d", ctx->flush, rc);
|
||||
return NGX_ERROR;
|
||||
@@ -818,8 +819,6 @@ ngx_http_gzip_filter_deflate(ngx_http_re
|
||||
|
||||
if (ctx->flush == Z_SYNC_FLUSH) {
|
||||
|
||||
- ctx->zstream.avail_out = 0;
|
||||
- ctx->out_buf->flush = 1;
|
||||
ctx->flush = Z_NO_FLUSH;
|
||||
|
||||
cl = ngx_alloc_chain_link(r->pool);
|
||||
@@ -827,7 +826,22 @@ ngx_http_gzip_filter_deflate(ngx_http_re
|
||||
return NGX_ERROR;
|
||||
}
|
||||
|
||||
- cl->buf = ctx->out_buf;
|
||||
+ b = ctx->out_buf;
|
||||
+
|
||||
+ if (ngx_buf_size(b) == 0) {
|
||||
+
|
||||
+ b = ngx_calloc_buf(ctx->request->pool);
|
||||
+ if (b == NULL) {
|
||||
+ return NGX_ERROR;
|
||||
+ }
|
||||
+
|
||||
+ } else {
|
||||
+ ctx->zstream.avail_out = 0;
|
||||
+ }
|
||||
+
|
||||
+ b->flush = 1;
|
||||
+
|
||||
+ cl->buf = b;
|
||||
cl->next = NULL;
|
||||
*ctx->last_out = cl;
|
||||
ctx->last_out = &cl->next;
|
115
patches/nginx-1.0.12-log_escape_non_ascii.patch
Normal file
115
patches/nginx-1.0.12-log_escape_non_ascii.patch
Normal file
@ -0,0 +1,115 @@
|
||||
--- nginx-1.0.12/src/http/modules/ngx_http_log_module.c 2011-11-01 21:24:50.000000000 +0800
|
||||
+++ nginx-1.0.12-patched/src/http/modules/ngx_http_log_module.c 2011-11-10 16:17:29.599039534 +0800
|
||||
@@ -61,6 +61,8 @@
|
||||
time_t open_file_cache_valid;
|
||||
ngx_uint_t open_file_cache_min_uses;
|
||||
|
||||
+ ngx_flag_t escape_non_ascii;
|
||||
+
|
||||
ngx_uint_t off; /* unsigned off:1 */
|
||||
} ngx_http_log_loc_conf_t;
|
||||
|
||||
@@ -104,7 +106,8 @@
|
||||
uintptr_t data);
|
||||
static u_char *ngx_http_log_variable(ngx_http_request_t *r, u_char *buf,
|
||||
ngx_http_log_op_t *op);
|
||||
-static uintptr_t ngx_http_log_escape(u_char *dst, u_char *src, size_t size);
|
||||
+static uintptr_t ngx_http_log_escape(ngx_http_log_loc_conf_t *lcf, u_char *dst,
|
||||
+ u_char *src, size_t size);
|
||||
|
||||
|
||||
static void *ngx_http_log_create_main_conf(ngx_conf_t *cf);
|
||||
@@ -146,6 +149,13 @@
|
||||
0,
|
||||
NULL },
|
||||
|
||||
+ { ngx_string("log_escape_non_ascii"),
|
||||
+ NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,
|
||||
+ ngx_conf_set_flag_slot,
|
||||
+ NGX_HTTP_LOC_CONF_OFFSET,
|
||||
+ offsetof(ngx_http_log_loc_conf_t, escape_non_ascii),
|
||||
+ NULL },
|
||||
+
|
||||
ngx_null_command
|
||||
};
|
||||
|
||||
@@ -637,6 +647,7 @@
|
||||
ngx_http_log_variable_getlen(ngx_http_request_t *r, uintptr_t data)
|
||||
{
|
||||
uintptr_t len;
|
||||
+ ngx_http_log_loc_conf_t *lcf;
|
||||
ngx_http_variable_value_t *value;
|
||||
|
||||
value = ngx_http_get_indexed_variable(r, data);
|
||||
@@ -645,7 +656,9 @@
|
||||
return 1;
|
||||
}
|
||||
|
||||
- len = ngx_http_log_escape(NULL, value->data, value->len);
|
||||
+ lcf = ngx_http_get_module_loc_conf(r, ngx_http_log_module);
|
||||
+
|
||||
+ len = ngx_http_log_escape(lcf, NULL, value->data, value->len);
|
||||
|
||||
value->escape = len ? 1 : 0;
|
||||
|
||||
@@ -656,6 +669,7 @@
|
||||
static u_char *
|
||||
ngx_http_log_variable(ngx_http_request_t *r, u_char *buf, ngx_http_log_op_t *op)
|
||||
{
|
||||
+ ngx_http_log_loc_conf_t *lcf;
|
||||
ngx_http_variable_value_t *value;
|
||||
|
||||
value = ngx_http_get_indexed_variable(r, op->data);
|
||||
@@ -669,16 +683,18 @@
|
||||
return ngx_cpymem(buf, value->data, value->len);
|
||||
|
||||
} else {
|
||||
- return (u_char *) ngx_http_log_escape(buf, value->data, value->len);
|
||||
+ lcf = ngx_http_get_module_loc_conf(r, ngx_http_log_module);
|
||||
+ return (u_char *) ngx_http_log_escape(lcf, buf, value->data, value->len);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static uintptr_t
|
||||
-ngx_http_log_escape(u_char *dst, u_char *src, size_t size)
|
||||
+ngx_http_log_escape(ngx_http_log_loc_conf_t *lcf, u_char *dst, u_char *src,
|
||||
+ size_t size)
|
||||
{
|
||||
- ngx_uint_t n;
|
||||
- static u_char hex[] = "0123456789ABCDEF";
|
||||
+ ngx_uint_t n;
|
||||
+ static u_char hex[] = "0123456789ABCDEF";
|
||||
|
||||
static uint32_t escape[] = {
|
||||
0xffffffff, /* 1111 1111 1111 1111 1111 1111 1111 1111 */
|
||||
@@ -698,6 +714,12 @@
|
||||
0xffffffff, /* 1111 1111 1111 1111 1111 1111 1111 1111 */
|
||||
};
|
||||
|
||||
+ if (lcf->escape_non_ascii) {
|
||||
+ ngx_memset(&escape[4], 0xff, sizeof(uint32_t) * 4);
|
||||
+
|
||||
+ } else {
|
||||
+ ngx_memzero(&escape[4], sizeof(uint32_t) * 4);
|
||||
+ }
|
||||
|
||||
if (dst == NULL) {
|
||||
|
||||
@@ -781,6 +803,7 @@
|
||||
}
|
||||
|
||||
conf->open_file_cache = NGX_CONF_UNSET_PTR;
|
||||
+ conf->escape_non_ascii = NGX_CONF_UNSET;
|
||||
|
||||
return conf;
|
||||
}
|
||||
@@ -796,6 +819,8 @@
|
||||
ngx_http_log_fmt_t *fmt;
|
||||
ngx_http_log_main_conf_t *lmcf;
|
||||
|
||||
+ ngx_conf_merge_value(conf->escape_non_ascii, prev->escape_non_ascii, 1);
|
||||
+
|
||||
if (conf->open_file_cache == NGX_CONF_UNSET_PTR) {
|
||||
|
||||
conf->open_file_cache = prev->open_file_cache;
|
14
patches/nginx-1.0.12-max_subrequests.patch
Normal file
14
patches/nginx-1.0.12-max_subrequests.patch
Normal file
@ -0,0 +1,14 @@
|
||||
--- nginx-1.0.12/src/http/ngx_http_request.h 2011-08-29 18:39:23.000000000 +0800
|
||||
+++ nginx-1.0.12-patched/src/http/ngx_http_request.h 2012-02-20 15:50:43.540762756 +0800
|
||||
@@ -9,7 +9,10 @@
|
||||
|
||||
|
||||
#define NGX_HTTP_MAX_URI_CHANGES 10
|
||||
-#define NGX_HTTP_MAX_SUBREQUESTS 50
|
||||
+
|
||||
+#ifndef NGX_HTTP_MAX_SUBREQUESTS
|
||||
+#define NGX_HTTP_MAX_SUBREQUESTS 200
|
||||
+#endif
|
||||
|
||||
/* must be 2^n */
|
||||
#define NGX_HTTP_LC_HEADER_LEN 32
|
12
patches/nginx-1.0.12-named_location_clear_mods_ctx.patch
Normal file
12
patches/nginx-1.0.12-named_location_clear_mods_ctx.patch
Normal file
@ -0,0 +1,12 @@
|
||||
--- nginx-1.0.12/src/http/ngx_http_core_module.c 2011-09-27 19:14:02.000000000 +0800
|
||||
+++ nginx-1.0.12-patched/src/http/ngx_http_core_module.c 2011-10-13 15:02:24.414550532 +0800
|
||||
@@ -2542,6 +2542,9 @@
|
||||
r->content_handler = NULL;
|
||||
r->loc_conf = (*clcfp)->loc_conf;
|
||||
|
||||
+ /* clear the modules contexts */
|
||||
+ ngx_memzero(r->ctx, sizeof(void *) * ngx_http_max_module);
|
||||
+
|
||||
ngx_http_update_location_config(r);
|
||||
|
||||
cmcf = ngx_http_get_module_main_conf(r, ngx_http_core_module);
|
24
patches/nginx-1.0.12-no_Werror.patch
Normal file
24
patches/nginx-1.0.12-no_Werror.patch
Normal file
@ -0,0 +1,24 @@
|
||||
diff -ur nginx-1.0.12/auto/cc/gcc nginx-1.0.12-patched/auto/cc/gcc
|
||||
--- nginx-1.0.12/auto/cc/gcc 2011-06-27 19:53:00.205737804 +0800
|
||||
+++ nginx-1.0.12-patched/auto/cc/gcc 2011-06-27 19:53:13.837741087 +0800
|
||||
@@ -169,7 +169,7 @@
|
||||
|
||||
|
||||
# stop on warning
|
||||
-CFLAGS="$CFLAGS -Werror"
|
||||
+#CFLAGS="$CFLAGS -Werror"
|
||||
|
||||
# debug
|
||||
CFLAGS="$CFLAGS -g"
|
||||
diff -ur nginx-1.0.12/auto/cc/icc nginx-1.0.12-patched/auto/cc/icc
|
||||
--- nginx-1.0.12/auto/cc/icc 2011-06-27 19:52:56.370157068 +0800
|
||||
+++ nginx-1.0.12-patched/auto/cc/icc 2011-06-27 19:53:19.508916811 +0800
|
||||
@@ -139,7 +139,7 @@
|
||||
esac
|
||||
|
||||
# stop on warning
|
||||
-CFLAGS="$CFLAGS -Werror"
|
||||
+#CFLAGS="$CFLAGS -Werror"
|
||||
|
||||
# debug
|
||||
CFLAGS="$CFLAGS -g"
|
90
patches/nginx-1.0.12-no_error_pages.patch
Normal file
90
patches/nginx-1.0.12-no_error_pages.patch
Normal file
@ -0,0 +1,90 @@
|
||||
--- nginx-1.0.12/src/http/ngx_http_core_module.c 2010-12-14 18:38:42.000000000 +0800
|
||||
+++ nginx-1.0.12-patched/src/http/ngx_http_core_module.c 2011-01-30 19:24:34.956354518 +0800
|
||||
@@ -57,6 +57,8 @@
|
||||
void *conf);
|
||||
static char *ngx_http_core_error_page(ngx_conf_t *cf, ngx_command_t *cmd,
|
||||
void *conf);
|
||||
+static char *ngx_http_core_no_error_pages(ngx_conf_t *cf, ngx_command_t *cmd,
|
||||
+ void *conf);
|
||||
static char *ngx_http_core_try_files(ngx_conf_t *cf, ngx_command_t *cmd,
|
||||
void *conf);
|
||||
static char *ngx_http_core_open_file_cache(ngx_conf_t *cf, ngx_command_t *cmd,
|
||||
@@ -614,6 +616,14 @@
|
||||
0,
|
||||
NULL },
|
||||
|
||||
+ { ngx_string("no_error_pages"),
|
||||
+ NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF
|
||||
+ |NGX_CONF_NOARGS,
|
||||
+ ngx_http_core_no_error_pages,
|
||||
+ NGX_HTTP_LOC_CONF_OFFSET,
|
||||
+ 0,
|
||||
+ NULL },
|
||||
+
|
||||
{ ngx_string("try_files"),
|
||||
NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_2MORE,
|
||||
ngx_http_core_try_files,
|
||||
@@ -3052,7 +3062,6 @@
|
||||
* clcf->types = NULL;
|
||||
* clcf->default_type = { 0, NULL };
|
||||
* clcf->error_log = NULL;
|
||||
- * clcf->error_pages = NULL;
|
||||
* clcf->try_files = NULL;
|
||||
* clcf->client_body_path = NULL;
|
||||
* clcf->regex = NULL;
|
||||
@@ -3062,6 +3071,7 @@
|
||||
* clcf->gzip_proxied = 0;
|
||||
*/
|
||||
|
||||
+ clcf->error_pages = NGX_CONF_UNSET_PTR;
|
||||
clcf->client_max_body_size = NGX_CONF_UNSET;
|
||||
clcf->client_body_buffer_size = NGX_CONF_UNSET_SIZE;
|
||||
clcf->client_body_timeout = NGX_CONF_UNSET_MSEC;
|
||||
@@ -3250,9 +3260,7 @@
|
||||
}
|
||||
}
|
||||
|
||||
- if (conf->error_pages == NULL && prev->error_pages) {
|
||||
- conf->error_pages = prev->error_pages;
|
||||
- }
|
||||
+ ngx_conf_merge_ptr_value(conf->error_pages, prev->error_pages, NULL);
|
||||
|
||||
ngx_conf_merge_str_value(conf->default_type,
|
||||
prev->default_type, "text/plain");
|
||||
@@ -3988,6 +3996,10 @@
|
||||
ngx_http_compile_complex_value_t ccv;
|
||||
|
||||
if (clcf->error_pages == NULL) {
|
||||
+ return "conflicts with \"no_error_pages\"";
|
||||
+ }
|
||||
+
|
||||
+ if (clcf->error_pages == NGX_CONF_UNSET_PTR) {
|
||||
clcf->error_pages = ngx_array_create(cf->pool, 4,
|
||||
sizeof(ngx_http_err_page_t));
|
||||
if (clcf->error_pages == NULL) {
|
||||
@@ -4095,6 +4107,25 @@
|
||||
|
||||
|
||||
static char *
|
||||
+ngx_http_core_no_error_pages(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
|
||||
+{
|
||||
+ ngx_http_core_loc_conf_t *clcf = conf;
|
||||
+
|
||||
+ if (clcf->error_pages == NULL) {
|
||||
+ return "is duplicate";
|
||||
+ }
|
||||
+
|
||||
+ if (clcf->error_pages != NGX_CONF_UNSET_PTR) {
|
||||
+ return "conflicts with \"error_page\"";
|
||||
+ }
|
||||
+
|
||||
+ clcf->error_pages = NULL;
|
||||
+
|
||||
+ return NGX_CONF_OK;
|
||||
+}
|
||||
+
|
||||
+
|
||||
+static char *
|
||||
ngx_http_core_try_files(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
|
||||
{
|
||||
ngx_http_core_loc_conf_t *clcf = conf;
|
504
patches/nginx-1.0.12-no_pool.patch
Normal file
504
patches/nginx-1.0.12-no_pool.patch
Normal file
@ -0,0 +1,504 @@
|
||||
diff -ur nginx-1.0.12/src/core/nginx.h nginx-1.0.12-patched/src/core/nginx.h
|
||||
--- nginx-1.0.12/src/core/nginx.h 2011-08-29 17:30:22.000000000 +0800
|
||||
+++ nginx-1.0.12-patched/src/core/nginx.h 2011-09-13 12:11:03.135622101 +0800
|
||||
@@ -10,7 +10,7 @@
|
||||
|
||||
|
||||
#define nginx_version 1000012
|
||||
#define NGINX_VERSION "1.0.12"
|
||||
-#define NGINX_VER "ngx_openresty/" NGINX_VERSION ".unknown"
|
||||
+#define NGINX_VER "ngx_openresty/" NGINX_VERSION ".unknown (no pool)"
|
||||
|
||||
#define NGINX_VAR "NGINX"
|
||||
diff -ur nginx-1.0.12/src/core/ngx_array.c nginx-1.0.12-patched/src/core/ngx_array.c
|
||||
--- nginx-1.0.12/src/core/ngx_array.c 2008-06-17 23:00:30.000000000 +0800
|
||||
+++ nginx-1.0.12-patched/src/core/ngx_array.c 2011-09-14 12:02:56.263128538 +0800
|
||||
@@ -39,13 +39,7 @@
|
||||
|
||||
p = a->pool;
|
||||
|
||||
- if ((u_char *) a->elts + a->size * a->nalloc == p->d.last) {
|
||||
- p->d.last -= a->size * a->nalloc;
|
||||
- }
|
||||
-
|
||||
- if ((u_char *) a + sizeof(ngx_array_t) == p->d.last) {
|
||||
- p->d.last = (u_char *) a;
|
||||
- }
|
||||
+ ngx_pfree(p, a);
|
||||
}
|
||||
|
||||
|
||||
@@ -64,29 +58,17 @@
|
||||
|
||||
p = a->pool;
|
||||
|
||||
- if ((u_char *) a->elts + size == p->d.last
|
||||
- && p->d.last + a->size <= p->d.end)
|
||||
- {
|
||||
- /*
|
||||
- * the array allocation is the last in the pool
|
||||
- * and there is space for new allocation
|
||||
- */
|
||||
-
|
||||
- p->d.last += a->size;
|
||||
- a->nalloc++;
|
||||
-
|
||||
- } else {
|
||||
- /* allocate a new array */
|
||||
-
|
||||
- new = ngx_palloc(p, 2 * size);
|
||||
- if (new == NULL) {
|
||||
- return NULL;
|
||||
- }
|
||||
-
|
||||
- ngx_memcpy(new, a->elts, size);
|
||||
- a->elts = new;
|
||||
- a->nalloc *= 2;
|
||||
+ /* allocate a new array */
|
||||
+
|
||||
+ new = ngx_palloc(p, 2 * size);
|
||||
+ if (new == NULL) {
|
||||
+ return NULL;
|
||||
}
|
||||
+
|
||||
+ ngx_memcpy(new, a->elts, size);
|
||||
+ a->elts = new;
|
||||
+ a->nalloc *= 2;
|
||||
+
|
||||
}
|
||||
|
||||
elt = (u_char *) a->elts + a->size * a->nelts;
|
||||
@@ -100,43 +82,25 @@
|
||||
ngx_array_push_n(ngx_array_t *a, ngx_uint_t n)
|
||||
{
|
||||
void *elt, *new;
|
||||
- size_t size;
|
||||
ngx_uint_t nalloc;
|
||||
ngx_pool_t *p;
|
||||
|
||||
- size = n * a->size;
|
||||
-
|
||||
if (a->nelts + n > a->nalloc) {
|
||||
|
||||
/* the array is full */
|
||||
|
||||
p = a->pool;
|
||||
|
||||
- if ((u_char *) a->elts + a->size * a->nalloc == p->d.last
|
||||
- && p->d.last + size <= p->d.end)
|
||||
- {
|
||||
- /*
|
||||
- * the array allocation is the last in the pool
|
||||
- * and there is space for new allocation
|
||||
- */
|
||||
-
|
||||
- p->d.last += size;
|
||||
- a->nalloc += n;
|
||||
-
|
||||
- } else {
|
||||
- /* allocate a new array */
|
||||
-
|
||||
- nalloc = 2 * ((n >= a->nalloc) ? n : a->nalloc);
|
||||
-
|
||||
- new = ngx_palloc(p, nalloc * a->size);
|
||||
- if (new == NULL) {
|
||||
- return NULL;
|
||||
- }
|
||||
-
|
||||
- ngx_memcpy(new, a->elts, a->nelts * a->size);
|
||||
- a->elts = new;
|
||||
- a->nalloc = nalloc;
|
||||
+ nalloc = 2 * ((n >= a->nalloc) ? n : a->nalloc);
|
||||
+
|
||||
+ new = ngx_palloc(p, nalloc * a->size);
|
||||
+ if (new == NULL) {
|
||||
+ return NULL;
|
||||
}
|
||||
+
|
||||
+ ngx_memcpy(new, a->elts, a->nelts * a->size);
|
||||
+ a->elts = new;
|
||||
+ a->nalloc = nalloc;
|
||||
}
|
||||
|
||||
elt = (u_char *) a->elts + a->size * a->nelts;
|
||||
diff -ur nginx-1.0.12/src/core/ngx_palloc.c nginx-1.0.12-patched/src/core/ngx_palloc.c
|
||||
--- nginx-1.0.12/src/core/ngx_palloc.c 2009-12-17 20:25:46.000000000 +0800
|
||||
+++ nginx-1.0.12-patched/src/core/ngx_palloc.c 2011-09-14 12:03:41.663126519 +0800
|
||||
@@ -8,24 +8,31 @@
|
||||
#include <ngx_core.h>
|
||||
|
||||
|
||||
-static void *ngx_palloc_block(ngx_pool_t *pool, size_t size);
|
||||
static void *ngx_palloc_large(ngx_pool_t *pool, size_t size);
|
||||
|
||||
|
||||
ngx_pool_t *
|
||||
ngx_create_pool(size_t size, ngx_log_t *log)
|
||||
{
|
||||
- ngx_pool_t *p;
|
||||
+ ngx_pool_t *p;
|
||||
+ ngx_pool_data_t *d;
|
||||
|
||||
- p = ngx_memalign(NGX_POOL_ALIGNMENT, size, log);
|
||||
+ size = sizeof(ngx_pool_t);
|
||||
+ p = ngx_alloc(size, log);
|
||||
if (p == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
- p->d.last = (u_char *) p + sizeof(ngx_pool_t);
|
||||
- p->d.end = (u_char *) p + size;
|
||||
- p->d.next = NULL;
|
||||
- p->d.failed = 0;
|
||||
+ d = ngx_alloc(sizeof(ngx_pool_data_t), log);
|
||||
+
|
||||
+ if (d == NULL) {
|
||||
+ return NULL;
|
||||
+ }
|
||||
+
|
||||
+ d->next = d;
|
||||
+ d->prev = d;
|
||||
+ d->alloc = NULL;
|
||||
+ p->d = d;
|
||||
|
||||
size = size - sizeof(ngx_pool_t);
|
||||
p->max = (size < NGX_MAX_ALLOC_FROM_POOL) ? size : NGX_MAX_ALLOC_FROM_POOL;
|
||||
@@ -43,7 +50,7 @@
|
||||
void
|
||||
ngx_destroy_pool(ngx_pool_t *pool)
|
||||
{
|
||||
- ngx_pool_t *p, *n;
|
||||
+ ngx_pool_data_t *d, *n;
|
||||
ngx_pool_large_t *l;
|
||||
ngx_pool_cleanup_t *c;
|
||||
|
||||
@@ -55,7 +62,7 @@
|
||||
}
|
||||
}
|
||||
|
||||
- for (l = pool->large; l; l = l->next) {
|
||||
+ for (l = pool->large; l ; l = l->next) {
|
||||
|
||||
ngx_log_debug1(NGX_LOG_DEBUG_ALLOC, pool->log, 0, "free: %p", l->alloc);
|
||||
|
||||
@@ -71,34 +78,45 @@
|
||||
* so we can not use this log while the free()ing the pool
|
||||
*/
|
||||
|
||||
- for (p = pool, n = pool->d.next; /* void */; p = n, n = n->d.next) {
|
||||
+ for (d = pool->d, n = d->next; ; d = n, n = n->next) {
|
||||
ngx_log_debug2(NGX_LOG_DEBUG_ALLOC, pool->log, 0,
|
||||
- "free: %p, unused: %uz", p, p->d.end - p->d.last);
|
||||
+ "free: %p", d);
|
||||
|
||||
- if (n == NULL) {
|
||||
+ if (n == pool->d) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
+ if (pool->d->next == pool->d) {
|
||||
+ ngx_free(pool->d);
|
||||
+ } else {
|
||||
+ for (d = pool->d, n = d->next; ; d = n, n = n->next) {
|
||||
+ if (d->alloc) {
|
||||
+ ngx_free(d->alloc);
|
||||
+ }
|
||||
+ ngx_free(d);
|
||||
|
||||
- for (p = pool, n = pool->d.next; /* void */; p = n, n = n->d.next) {
|
||||
- ngx_free(p);
|
||||
-
|
||||
- if (n == NULL) {
|
||||
- break;
|
||||
+ if (n == pool->d) {
|
||||
+ break;
|
||||
+ }
|
||||
}
|
||||
}
|
||||
+
|
||||
+ ngx_free(pool);
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
ngx_reset_pool(ngx_pool_t *pool)
|
||||
{
|
||||
- ngx_pool_t *p;
|
||||
- ngx_pool_large_t *l;
|
||||
+ ngx_pool_data_t *p, *tmp;
|
||||
+ ngx_pool_large_t *l;
|
||||
+
|
||||
+ for (l = pool->large; l ; l = l->next) {
|
||||
+
|
||||
+ ngx_log_debug1(NGX_LOG_DEBUG_ALLOC, pool->log, 0, "free: %p", l->alloc);
|
||||
|
||||
- for (l = pool->large; l; l = l->next) {
|
||||
if (l->alloc) {
|
||||
ngx_free(l->alloc);
|
||||
}
|
||||
@@ -106,109 +124,65 @@
|
||||
|
||||
pool->large = NULL;
|
||||
|
||||
- for (p = pool; p; p = p->d.next) {
|
||||
- p->d.last = (u_char *) p + sizeof(ngx_pool_t);
|
||||
+ p = pool->d->next;
|
||||
+ while (p != pool->d) {
|
||||
+ tmp = p;
|
||||
+ ngx_free(p->alloc);
|
||||
+ p->prev->next = p->next;
|
||||
+ p->next->prev = p->prev;
|
||||
+ p = p->next;
|
||||
+ ngx_free(tmp);
|
||||
}
|
||||
-}
|
||||
|
||||
+ ngx_free(pool->d->alloc);
|
||||
+ pool->d->alloc = NULL;
|
||||
+
|
||||
+}
|
||||
|
||||
void *
|
||||
-ngx_palloc(ngx_pool_t *pool, size_t size)
|
||||
+ngx_malloc(ngx_pool_t *pool, size_t size)
|
||||
{
|
||||
- u_char *m;
|
||||
- ngx_pool_t *p;
|
||||
-
|
||||
- if (size <= pool->max) {
|
||||
+ ngx_pool_data_t *new;
|
||||
+ void *m;
|
||||
|
||||
- p = pool->current;
|
||||
-
|
||||
- do {
|
||||
- m = ngx_align_ptr(p->d.last, NGX_ALIGNMENT);
|
||||
-
|
||||
- if ((size_t) (p->d.end - m) >= size) {
|
||||
- p->d.last = m + size;
|
||||
-
|
||||
- return m;
|
||||
- }
|
||||
-
|
||||
- p = p->d.next;
|
||||
-
|
||||
- } while (p);
|
||||
+ m = ngx_alloc(size, pool->log);
|
||||
+ if (m == NULL) {
|
||||
+ return NULL;
|
||||
+ }
|
||||
|
||||
- return ngx_palloc_block(pool, size);
|
||||
+ new = ngx_alloc(sizeof(ngx_pool_data_t), pool->log);
|
||||
+ if (new == NULL){
|
||||
+ ngx_free(m);
|
||||
+ return NULL;
|
||||
}
|
||||
|
||||
- return ngx_palloc_large(pool, size);
|
||||
+ new->alloc = m;
|
||||
+ new->next = pool->d;
|
||||
+ new->prev = pool->d->prev;
|
||||
+ pool->d->prev->next = new;
|
||||
+ pool->d->prev = new;
|
||||
+ return m;
|
||||
}
|
||||
|
||||
-
|
||||
void *
|
||||
-ngx_pnalloc(ngx_pool_t *pool, size_t size)
|
||||
+ngx_palloc(ngx_pool_t *pool, size_t size)
|
||||
{
|
||||
- u_char *m;
|
||||
- ngx_pool_t *p;
|
||||
-
|
||||
- if (size <= pool->max) {
|
||||
-
|
||||
- p = pool->current;
|
||||
-
|
||||
- do {
|
||||
- m = p->d.last;
|
||||
-
|
||||
- if ((size_t) (p->d.end - m) >= size) {
|
||||
- p->d.last = m + size;
|
||||
-
|
||||
- return m;
|
||||
- }
|
||||
-
|
||||
- p = p->d.next;
|
||||
-
|
||||
- } while (p);
|
||||
-
|
||||
- return ngx_palloc_block(pool, size);
|
||||
+ if (size <= 1024) {
|
||||
+ return ngx_malloc(pool, size);
|
||||
}
|
||||
|
||||
return ngx_palloc_large(pool, size);
|
||||
}
|
||||
|
||||
|
||||
-static void *
|
||||
-ngx_palloc_block(ngx_pool_t *pool, size_t size)
|
||||
+void *
|
||||
+ngx_pnalloc(ngx_pool_t *pool, size_t size)
|
||||
{
|
||||
- u_char *m;
|
||||
- size_t psize;
|
||||
- ngx_pool_t *p, *new, *current;
|
||||
-
|
||||
- psize = (size_t) (pool->d.end - (u_char *) pool);
|
||||
-
|
||||
- m = ngx_memalign(NGX_POOL_ALIGNMENT, psize, pool->log);
|
||||
- if (m == NULL) {
|
||||
- return NULL;
|
||||
- }
|
||||
-
|
||||
- new = (ngx_pool_t *) m;
|
||||
-
|
||||
- new->d.end = m + psize;
|
||||
- new->d.next = NULL;
|
||||
- new->d.failed = 0;
|
||||
-
|
||||
- m += sizeof(ngx_pool_data_t);
|
||||
- m = ngx_align_ptr(m, NGX_ALIGNMENT);
|
||||
- new->d.last = m + size;
|
||||
-
|
||||
- current = pool->current;
|
||||
-
|
||||
- for (p = current; p->d.next; p = p->d.next) {
|
||||
- if (p->d.failed++ > 4) {
|
||||
- current = p->d.next;
|
||||
- }
|
||||
+ if (size <= 1024) {
|
||||
+ return ngx_malloc(pool, size);
|
||||
}
|
||||
|
||||
- p->d.next = new;
|
||||
-
|
||||
- pool->current = current ? current : new;
|
||||
-
|
||||
- return m;
|
||||
+ return ngx_palloc_large(pool, size);
|
||||
}
|
||||
|
||||
|
||||
@@ -216,7 +190,6 @@
|
||||
ngx_palloc_large(ngx_pool_t *pool, size_t size)
|
||||
{
|
||||
void *p;
|
||||
- ngx_uint_t n;
|
||||
ngx_pool_large_t *large;
|
||||
|
||||
p = ngx_alloc(size, pool->log);
|
||||
@@ -224,20 +197,7 @@
|
||||
return NULL;
|
||||
}
|
||||
|
||||
- n = 0;
|
||||
-
|
||||
- for (large = pool->large; large; large = large->next) {
|
||||
- if (large->alloc == NULL) {
|
||||
- large->alloc = p;
|
||||
- return p;
|
||||
- }
|
||||
-
|
||||
- if (n++ > 3) {
|
||||
- break;
|
||||
- }
|
||||
- }
|
||||
-
|
||||
- large = ngx_palloc(pool, sizeof(ngx_pool_large_t));
|
||||
+ large = ngx_malloc(pool, sizeof(ngx_pool_large_t));
|
||||
if (large == NULL) {
|
||||
ngx_free(p);
|
||||
return NULL;
|
||||
@@ -262,7 +222,7 @@
|
||||
return NULL;
|
||||
}
|
||||
|
||||
- large = ngx_palloc(pool, sizeof(ngx_pool_large_t));
|
||||
+ large = ngx_malloc(pool, sizeof(ngx_pool_large_t));
|
||||
if (large == NULL) {
|
||||
ngx_free(p);
|
||||
return NULL;
|
||||
@@ -279,17 +239,41 @@
|
||||
ngx_int_t
|
||||
ngx_pfree(ngx_pool_t *pool, void *p)
|
||||
{
|
||||
- ngx_pool_large_t *l;
|
||||
+ ngx_pool_large_t *l;
|
||||
+ ngx_pool_large_t *ll;
|
||||
+ ngx_pool_data_t *d, *n;
|
||||
|
||||
- for (l = pool->large; l; l = l->next) {
|
||||
+ for (l = pool->large, ll = l; l; ll = l, l = l->next) {
|
||||
if (p == l->alloc) {
|
||||
ngx_log_debug1(NGX_LOG_DEBUG_ALLOC, pool->log, 0,
|
||||
"free: %p", l->alloc);
|
||||
ngx_free(l->alloc);
|
||||
l->alloc = NULL;
|
||||
+ if (l == pool->large) {
|
||||
+ pool->large = NULL;
|
||||
+ }
|
||||
+
|
||||
+ ll->next = l->next;
|
||||
+ p = l;
|
||||
+ break;
|
||||
+ }
|
||||
+ }
|
||||
|
||||
+ for (d = pool->d, n = d->next; ; d = n, n = d->next) {
|
||||
+ if (p == d->alloc) {
|
||||
+ ngx_log_debug1(NGX_LOG_DEBUG_ALLOC, pool->log, 0, "free: %p", d->alloc);
|
||||
+ if (d->alloc) {
|
||||
+ ngx_free(d->alloc);
|
||||
+ }
|
||||
+ d->alloc = NULL;
|
||||
+ d->prev->next = d->next;
|
||||
+ d->next->prev = d->prev;
|
||||
+ ngx_free(d);
|
||||
return NGX_OK;
|
||||
}
|
||||
+ if (d->next == pool->d) {
|
||||
+ break;
|
||||
+ }
|
||||
}
|
||||
|
||||
return NGX_DECLINED;
|
||||
diff -ur nginx-1.0.12/src/core/ngx_palloc.h nginx-1.0.12-patched/src/core/ngx_palloc.h
|
||||
--- nginx-1.0.12/src/core/ngx_palloc.h 2009-12-17 20:25:46.000000000 +0800
|
||||
+++ nginx-1.0.12-patched/src/core/ngx_palloc.h 2011-09-13 12:11:03.155622101 +0800
|
||||
@@ -38,6 +38,7 @@
|
||||
|
||||
|
||||
typedef struct ngx_pool_large_s ngx_pool_large_t;
|
||||
+typedef struct ngx_pool_data_s ngx_pool_data_t;
|
||||
|
||||
struct ngx_pool_large_s {
|
||||
ngx_pool_large_t *next;
|
||||
@@ -45,16 +46,15 @@
|
||||
};
|
||||
|
||||
|
||||
-typedef struct {
|
||||
- u_char *last;
|
||||
- u_char *end;
|
||||
- ngx_pool_t *next;
|
||||
- ngx_uint_t failed;
|
||||
-} ngx_pool_data_t;
|
||||
+struct ngx_pool_data_s{
|
||||
+ ngx_pool_data_t *next;
|
||||
+ ngx_pool_data_t *prev;
|
||||
+ void *alloc;
|
||||
+};
|
||||
|
||||
|
||||
struct ngx_pool_s {
|
||||
- ngx_pool_data_t d;
|
||||
+ ngx_pool_data_t *d;
|
||||
size_t max;
|
||||
ngx_pool_t *current;
|
||||
ngx_chain_t *chain;
|
27
patches/nginx-1.0.12-request_body_in_single_buf.patch
Normal file
27
patches/nginx-1.0.12-request_body_in_single_buf.patch
Normal file
@ -0,0 +1,27 @@
|
||||
# HG changeset patch
|
||||
# User Maxim Dounin <mdounin@mdounin.ru>
|
||||
# Date 1309799136 -14400
|
||||
# Node ID 99e276bba8596bc4df9e638482ee413f4c6bf700
|
||||
# Parent e7b2f945d55ae44a2295facf9e3336dc4633e5b5
|
||||
Core: fix body with request_body_in_single_buf.
|
||||
|
||||
If there were preread data and request body was big enough first part
|
||||
of request body was duplicated.
|
||||
|
||||
See report here:
|
||||
http://nginx.org/pipermail/nginx/2011-July/027756.html
|
||||
|
||||
diff --git a/src/http/ngx_http_request_body.c b/src/http/ngx_http_request_body.c
|
||||
--- a/src/http/ngx_http_request_body.c
|
||||
+++ b/src/http/ngx_http_request_body.c
|
||||
@@ -372,7 +372,9 @@ ngx_http_do_read_client_request_body(ngx
|
||||
}
|
||||
}
|
||||
|
||||
- if (r->request_body_in_file_only && rb->bufs->next) {
|
||||
+ if (rb->bufs->next
|
||||
+ && (r->request_body_in_file_only || r->request_body_in_single_buf))
|
||||
+ {
|
||||
rb->bufs = rb->bufs->next;
|
||||
}
|
||||
|
17
patches/nginx-1.0.12-request_body_preread_fix.patch
Normal file
17
patches/nginx-1.0.12-request_body_preread_fix.patch
Normal file
@ -0,0 +1,17 @@
|
||||
# HG changeset patch
|
||||
# User Maxim Dounin <mdounin@mdounin.ru>
|
||||
# Date 1309776931 -14400
|
||||
# Node ID e7b2f945d55ae44a2295facf9e3336dc4633e5b5
|
||||
# Parent 610e909bb9e29766188aa86fae3abe0bd3432940
|
||||
Core: fix body if it's preread and there are extra data.
|
||||
|
||||
--- nginx-1.0.12/src/http/ngx_http_request_body.c 2011-07-05 12:11:21.619264633 +0800
|
||||
+++ nginx-1.0.12-patched/src/http/ngx_http_request_body.c 2011-07-05 12:14:30.694321554 +0800
|
||||
@@ -141,6 +141,7 @@
|
||||
|
||||
/* the whole request body was pre-read */
|
||||
|
||||
+ b->last = b->pos + r->headers_in.content_length_n;
|
||||
r->header_in->pos += (size_t) r->headers_in.content_length_n;
|
||||
r->request_length += r->headers_in.content_length_n;
|
||||
|
26
patches/nginx-1.0.12-server_header.patch
Normal file
26
patches/nginx-1.0.12-server_header.patch
Normal file
@ -0,0 +1,26 @@
|
||||
diff -ur lz-nginx-1.0.12/nginx-1.0.12/src/core/nginx.h lz-nginx-1.0.12-patched/nginx-1.0.12/src/core/nginx.h
|
||||
--- lz-nginx-1.0.12/nginx-1.0.12/src/core/nginx.h 2010-02-12 17:31:01.000000000 +0800
|
||||
+++ lz-nginx-1.0.12-patched/nginx-1.0.12/src/core/nginx.h 2010-03-30 10:52:13.240702627 +0800
|
||||
@@ -10,7 +10,7 @@
|
||||
|
||||
#define nginx_version 1000012
|
||||
#define NGINX_VERSION "1.0.12"
|
||||
-#define NGINX_VER "nginx/" NGINX_VERSION
|
||||
+#define NGINX_VER "ngx_openresty/" NGINX_VERSION ".unknown"
|
||||
|
||||
#define NGINX_VAR "NGINX"
|
||||
#define NGX_OLDPID_EXT ".oldbin"
|
||||
Only in lz-nginx-1.0.12-patched/nginx-1.0.12/src/core: nginx.h.orig
|
||||
Only in lz-nginx-1.0.12-patched/nginx-1.0.12/src/core: nginx.h.rej
|
||||
diff -ur lz-nginx-1.0.12/nginx-1.0.12/src/http/ngx_http_header_filter_module.c lz-nginx-1.0.12-patched/nginx-1.0.12/src/http/ngx_http_header_filter_module.c
|
||||
--- lz-nginx-1.0.12/nginx-1.0.12/src/http/ngx_http_header_filter_module.c 2010-03-03 23:14:04.000000000 +0800
|
||||
+++ lz-nginx-1.0.12-patched/nginx-1.0.12/src/http/ngx_http_header_filter_module.c 2010-03-30 10:52:53.670909405 +0800
|
||||
@@ -45,7 +45,7 @@
|
||||
};
|
||||
|
||||
|
||||
-static char ngx_http_server_string[] = "Server: nginx" CRLF;
|
||||
+static char ngx_http_server_string[] = "Server: ngx_openresty" CRLF;
|
||||
static char ngx_http_server_full_string[] = "Server: " NGINX_VER CRLF;
|
||||
|
||||
|
40
patches/nginx-1.0.12-subrequest_loop.patch
Normal file
40
patches/nginx-1.0.12-subrequest_loop.patch
Normal file
@ -0,0 +1,40 @@
|
||||
# HG changeset patch
|
||||
# User Maxim Dounin <mdounin@mdounin.ru>
|
||||
# Date 1309187571 -14400
|
||||
# Node ID 283a416b2235d5383c12a975edc8866f007fb628
|
||||
# Parent f5fc40783ddcbf4db33859ee2a9bce54cf32c350
|
||||
Core: protect from subrequest loops.
|
||||
|
||||
Without protection subrequest loop results in r->count overflow and
|
||||
SIGSEGV. Protection was broken in 0.7.25.
|
||||
|
||||
Note that this also limits number of parallel subrequests. This
|
||||
wasn't exactly the case before 0.7.25 as local subrequests were
|
||||
completed directly.
|
||||
|
||||
See here for details:
|
||||
|
||||
http://nginx.org/pipermail/nginx-ru/2010-February/032184.html
|
||||
|
||||
diff --git a/src/http/ngx_http_core_module.c b/src/http/ngx_http_core_module.c
|
||||
--- a/src/http/ngx_http_core_module.c
|
||||
+++ b/src/http/ngx_http_core_module.c
|
||||
@@ -2287,7 +2287,6 @@ ngx_http_subrequest(ngx_http_request_t *
|
||||
sr->start_sec = tp->sec;
|
||||
sr->start_msec = tp->msec;
|
||||
|
||||
- r->main->subrequests++;
|
||||
r->main->count++;
|
||||
|
||||
*psr = sr;
|
||||
diff --git a/src/http/ngx_http_request.c b/src/http/ngx_http_request.c
|
||||
--- a/src/http/ngx_http_request.c
|
||||
+++ b/src/http/ngx_http_request.c
|
||||
@@ -1981,6 +1981,7 @@ ngx_http_finalize_request(ngx_http_reque
|
||||
if (r == c->data) {
|
||||
|
||||
r->main->count--;
|
||||
+ r->main->subrequests++;
|
||||
|
||||
if (!r->logged) {
|
||||
|
73
patches/nginx-1.0.12-variable_header_ignore_no_hash.patch
Normal file
73
patches/nginx-1.0.12-variable_header_ignore_no_hash.patch
Normal file
@ -0,0 +1,73 @@
|
||||
--- nginx-1.0.12/src/http/ngx_http_variables.c 2011-05-30 20:36:17.000000000 +0800
|
||||
+++ nginx-1.0.12-patched/src/http/ngx_http_variables.c 2011-11-08 22:21:55.229247198 +0800
|
||||
@@ -648,7 +648,17 @@
|
||||
|
||||
a = (ngx_array_t *) ((char *) r + data);
|
||||
|
||||
- n = a->nelts;
|
||||
+ h = a->elts;
|
||||
+ n = 0;
|
||||
+
|
||||
+ for (i = 0; i < a->nelts; i++) {
|
||||
+
|
||||
+ if (h[i]->hash == 0) {
|
||||
+ continue;
|
||||
+ }
|
||||
+
|
||||
+ n++;
|
||||
+ }
|
||||
|
||||
if (n == 0) {
|
||||
v->not_found = 1;
|
||||
@@ -659,9 +669,7 @@
|
||||
v->no_cacheable = 0;
|
||||
v->not_found = 0;
|
||||
|
||||
- h = a->elts;
|
||||
-
|
||||
- if (n == 1) {
|
||||
+ if (n == 1 && a->nelts == 1) {
|
||||
v->len = (*h)->value.len;
|
||||
v->data = (*h)->value.data;
|
||||
|
||||
@@ -670,7 +678,12 @@
|
||||
|
||||
len = - (ssize_t) (sizeof("; ") - 1);
|
||||
|
||||
- for (i = 0; i < n; i++) {
|
||||
+ for (i = 0; i < a->nelts; i++) {
|
||||
+
|
||||
+ if (h[i]->hash == 0) {
|
||||
+ continue;
|
||||
+ }
|
||||
+
|
||||
len += h[i]->value.len + sizeof("; ") - 1;
|
||||
}
|
||||
|
||||
@@ -683,9 +696,14 @@
|
||||
v->data = p;
|
||||
|
||||
for (i = 0; /* void */ ; i++) {
|
||||
+
|
||||
+ if (h[i]->hash == 0) {
|
||||
+ continue;
|
||||
+ }
|
||||
+
|
||||
p = ngx_copy(p, h[i]->value.data, h[i]->value.len);
|
||||
|
||||
- if (i == n - 1) {
|
||||
+ if (--n == 0) {
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -738,6 +756,10 @@
|
||||
i = 0;
|
||||
}
|
||||
|
||||
+ if (header[i].hash == 0) {
|
||||
+ continue;
|
||||
+ }
|
||||
+
|
||||
for (n = 0; n + prefix < var->len && n < header[i].key.len; n++) {
|
||||
ch = header[i].key.data[n];
|
||||
|
113
patches/nginx-1.0.14-allow_request_body_updating.patch
Normal file
113
patches/nginx-1.0.14-allow_request_body_updating.patch
Normal file
@ -0,0 +1,113 @@
|
||||
diff -ur nginx-1.0.14/src/http/ngx_http_request_body.c nginx-1.0.14-patched/src/http/ngx_http_request_body.c
|
||||
--- nginx-1.0.14/src/http/ngx_http_request_body.c 2011-09-30 22:36:19.000000000 +0800
|
||||
+++ nginx-1.0.14-patched/src/http/ngx_http_request_body.c 2011-10-21 21:54:08.460350482 +0800
|
||||
@@ -38,7 +38,7 @@
|
||||
|
||||
r->main->count++;
|
||||
|
||||
- if (r->request_body || r->discard_body) {
|
||||
+ if (r->request_body || r->discard_body || r->content_length_n == 0) {
|
||||
post_handler(r);
|
||||
return NGX_OK;
|
||||
}
|
||||
@@ -440,7 +440,7 @@
|
||||
ssize_t size;
|
||||
ngx_event_t *rev;
|
||||
|
||||
- if (r != r->main || r->discard_body) {
|
||||
+ if (r != r->main || r->discard_body || r->content_length_n == 0) {
|
||||
return NGX_OK;
|
||||
}
|
||||
|
||||
@@ -456,20 +456,22 @@
|
||||
ngx_del_timer(rev);
|
||||
}
|
||||
|
||||
- if (r->headers_in.content_length_n <= 0 || r->request_body) {
|
||||
+ r->content_length_n = r->headers_in.content_length_n;
|
||||
+
|
||||
+ if (r->content_length_n <= 0 || r->request_body) {
|
||||
return NGX_OK;
|
||||
}
|
||||
|
||||
size = r->header_in->last - r->header_in->pos;
|
||||
|
||||
if (size) {
|
||||
- if (r->headers_in.content_length_n > size) {
|
||||
+ if (r->content_length_n > size) {
|
||||
r->header_in->pos += size;
|
||||
- r->headers_in.content_length_n -= size;
|
||||
+ r->content_length_n -= size;
|
||||
|
||||
} else {
|
||||
- r->header_in->pos += (size_t) r->headers_in.content_length_n;
|
||||
- r->headers_in.content_length_n = 0;
|
||||
+ r->header_in->pos += (size_t) r->content_length_n;
|
||||
+ r->content_length_n = 0;
|
||||
return NGX_OK;
|
||||
}
|
||||
}
|
||||
@@ -568,7 +570,7 @@
|
||||
"http read discarded body");
|
||||
|
||||
for ( ;; ) {
|
||||
- if (r->headers_in.content_length_n == 0) {
|
||||
+ if (r->content_length_n == 0) {
|
||||
r->read_event_handler = ngx_http_block_reading;
|
||||
return NGX_OK;
|
||||
}
|
||||
@@ -577,9 +579,9 @@
|
||||
return NGX_AGAIN;
|
||||
}
|
||||
|
||||
- size = (r->headers_in.content_length_n > NGX_HTTP_DISCARD_BUFFER_SIZE) ?
|
||||
+ size = (r->content_length_n > NGX_HTTP_DISCARD_BUFFER_SIZE) ?
|
||||
NGX_HTTP_DISCARD_BUFFER_SIZE:
|
||||
- (size_t) r->headers_in.content_length_n;
|
||||
+ (size_t) r->content_length_n;
|
||||
|
||||
n = r->connection->recv(r->connection, buffer, size);
|
||||
|
||||
@@ -596,7 +598,7 @@
|
||||
return NGX_OK;
|
||||
}
|
||||
|
||||
- r->headers_in.content_length_n -= n;
|
||||
+ r->content_length_n -= n;
|
||||
}
|
||||
}
|
||||
|
||||
diff -ur nginx-1.0.14/src/http/ngx_http_request.c nginx-1.0.14-patched/src/http/ngx_http_request.c
|
||||
--- nginx-1.0.14/src/http/ngx_http_request.c 2011-09-30 22:36:19.000000000 +0800
|
||||
+++ nginx-1.0.14-patched/src/http/ngx_http_request.c 2011-10-21 19:06:38.404350692 +0800
|
||||
@@ -286,6 +286,8 @@
|
||||
|
||||
r->pipeline = hc->pipeline;
|
||||
|
||||
+ r->content_length_n = -1;
|
||||
+
|
||||
if (hc->nbusy) {
|
||||
r->header_in = hc->busy[0];
|
||||
}
|
||||
@@ -297,6 +299,8 @@
|
||||
return;
|
||||
}
|
||||
|
||||
+ r->content_length_n = -1;
|
||||
+
|
||||
hc->request = r;
|
||||
}
|
||||
|
||||
diff -ur nginx-1.0.14/src/http/ngx_http_request.h nginx-1.0.14-patched/src/http/ngx_http_request.h
|
||||
--- nginx-1.0.14/src/http/ngx_http_request.h 2011-08-29 18:39:23.000000000 +0800
|
||||
+++ nginx-1.0.14-patched/src/http/ngx_http_request.h 2011-10-21 17:26:13.203807584 +0800
|
||||
@@ -366,6 +366,9 @@
|
||||
ngx_pool_t *pool;
|
||||
ngx_buf_t *header_in;
|
||||
|
||||
+ off_t content_length_n;
|
||||
+ /* for discarding request body */
|
||||
+
|
||||
ngx_http_headers_in_t headers_in;
|
||||
ngx_http_headers_out_t headers_out;
|
||||
|
20
patches/nginx-1.0.14-epoll_check_stale_wev.patch
Normal file
20
patches/nginx-1.0.14-epoll_check_stale_wev.patch
Normal file
@ -0,0 +1,20 @@
|
||||
--- nginx-1.0.14/src/event/modules/ngx_epoll_module.c 2011-09-30 22:12:53.000000000 +0800
|
||||
+++ nginx-1.0.14-patched/src/event/modules/ngx_epoll_module.c 2011-11-30 11:08:46.775817019 +0800
|
||||
@@ -682,6 +682,17 @@
|
||||
wev = c->write;
|
||||
|
||||
if ((revents & EPOLLOUT) && wev->active) {
|
||||
+ if (c->fd == -1 || wev->instance != instance) {
|
||||
+
|
||||
+ /*
|
||||
+ * the stale event from a file descriptor
|
||||
+ * that was just closed in this iteration
|
||||
+ */
|
||||
+
|
||||
+ ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0,
|
||||
+ "epoll: stale event %p", c);
|
||||
+ continue;
|
||||
+ }
|
||||
|
||||
if (flags & NGX_POST_THREAD_EVENTS) {
|
||||
wev->posted_ready = 1;
|
69
patches/nginx-1.0.14-gzip_empty_flush_buf.patch
Normal file
69
patches/nginx-1.0.14-gzip_empty_flush_buf.patch
Normal file
@ -0,0 +1,69 @@
|
||||
# HG changeset patch
|
||||
# User Maxim Dounin <mdounin@mdounin.ru>
|
||||
# Date 1315324342 -14400
|
||||
# Node ID 4cf0af103bc382a78f894302d1706929a79df4bb
|
||||
# Parent d603ce98fada855f0100b422b7b5672fd22fabea
|
||||
Gzip filter: handle empty flush buffers.
|
||||
|
||||
Empty flush buffers are legitimate and may happen e.g. due to $r->flush()
|
||||
calls in embedded perl. If there are no data buffered in zlib deflate()
|
||||
will return Z_BUF_ERROR (i.e. no progress possible) without adding anything
|
||||
to output. Don't treat Z_BUF_ERROR as fatal and correctly send empty flush
|
||||
buffer if we have no data in output at all.
|
||||
|
||||
See this thread for details:
|
||||
http://mailman.nginx.org/pipermail/nginx/2010-November/023693.html
|
||||
|
||||
diff --git a/src/http/modules/ngx_http_gzip_filter_module.c b/src/http/modules/ngx_http_gzip_filter_module.c
|
||||
--- a/src/http/modules/ngx_http_gzip_filter_module.c
|
||||
+++ b/src/http/modules/ngx_http_gzip_filter_module.c
|
||||
@@ -758,6 +758,7 @@ static ngx_int_t
|
||||
ngx_http_gzip_filter_deflate(ngx_http_request_t *r, ngx_http_gzip_ctx_t *ctx)
|
||||
{
|
||||
int rc;
|
||||
+ ngx_buf_t *b;
|
||||
ngx_chain_t *cl;
|
||||
ngx_http_gzip_conf_t *conf;
|
||||
|
||||
@@ -769,7 +770,7 @@ ngx_http_gzip_filter_deflate(ngx_http_re
|
||||
|
||||
rc = deflate(&ctx->zstream, ctx->flush);
|
||||
|
||||
- if (rc != Z_OK && rc != Z_STREAM_END) {
|
||||
+ if (rc != Z_OK && rc != Z_STREAM_END && rc != Z_BUF_ERROR) {
|
||||
ngx_log_error(NGX_LOG_ALERT, r->connection->log, 0,
|
||||
"deflate() failed: %d, %d", ctx->flush, rc);
|
||||
return NGX_ERROR;
|
||||
@@ -818,8 +819,6 @@ ngx_http_gzip_filter_deflate(ngx_http_re
|
||||
|
||||
if (ctx->flush == Z_SYNC_FLUSH) {
|
||||
|
||||
- ctx->zstream.avail_out = 0;
|
||||
- ctx->out_buf->flush = 1;
|
||||
ctx->flush = Z_NO_FLUSH;
|
||||
|
||||
cl = ngx_alloc_chain_link(r->pool);
|
||||
@@ -827,7 +826,22 @@ ngx_http_gzip_filter_deflate(ngx_http_re
|
||||
return NGX_ERROR;
|
||||
}
|
||||
|
||||
- cl->buf = ctx->out_buf;
|
||||
+ b = ctx->out_buf;
|
||||
+
|
||||
+ if (ngx_buf_size(b) == 0) {
|
||||
+
|
||||
+ b = ngx_calloc_buf(ctx->request->pool);
|
||||
+ if (b == NULL) {
|
||||
+ return NGX_ERROR;
|
||||
+ }
|
||||
+
|
||||
+ } else {
|
||||
+ ctx->zstream.avail_out = 0;
|
||||
+ }
|
||||
+
|
||||
+ b->flush = 1;
|
||||
+
|
||||
+ cl->buf = b;
|
||||
cl->next = NULL;
|
||||
*ctx->last_out = cl;
|
||||
ctx->last_out = &cl->next;
|
115
patches/nginx-1.0.14-log_escape_non_ascii.patch
Normal file
115
patches/nginx-1.0.14-log_escape_non_ascii.patch
Normal file
@ -0,0 +1,115 @@
|
||||
--- nginx-1.0.14/src/http/modules/ngx_http_log_module.c 2011-11-01 21:24:50.000000000 +0800
|
||||
+++ nginx-1.0.14-patched/src/http/modules/ngx_http_log_module.c 2011-11-10 16:17:29.599039534 +0800
|
||||
@@ -61,6 +61,8 @@
|
||||
time_t open_file_cache_valid;
|
||||
ngx_uint_t open_file_cache_min_uses;
|
||||
|
||||
+ ngx_flag_t escape_non_ascii;
|
||||
+
|
||||
ngx_uint_t off; /* unsigned off:1 */
|
||||
} ngx_http_log_loc_conf_t;
|
||||
|
||||
@@ -104,7 +106,8 @@
|
||||
uintptr_t data);
|
||||
static u_char *ngx_http_log_variable(ngx_http_request_t *r, u_char *buf,
|
||||
ngx_http_log_op_t *op);
|
||||
-static uintptr_t ngx_http_log_escape(u_char *dst, u_char *src, size_t size);
|
||||
+static uintptr_t ngx_http_log_escape(ngx_http_log_loc_conf_t *lcf, u_char *dst,
|
||||
+ u_char *src, size_t size);
|
||||
|
||||
|
||||
static void *ngx_http_log_create_main_conf(ngx_conf_t *cf);
|
||||
@@ -146,6 +149,13 @@
|
||||
0,
|
||||
NULL },
|
||||
|
||||
+ { ngx_string("log_escape_non_ascii"),
|
||||
+ NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,
|
||||
+ ngx_conf_set_flag_slot,
|
||||
+ NGX_HTTP_LOC_CONF_OFFSET,
|
||||
+ offsetof(ngx_http_log_loc_conf_t, escape_non_ascii),
|
||||
+ NULL },
|
||||
+
|
||||
ngx_null_command
|
||||
};
|
||||
|
||||
@@ -637,6 +647,7 @@
|
||||
ngx_http_log_variable_getlen(ngx_http_request_t *r, uintptr_t data)
|
||||
{
|
||||
uintptr_t len;
|
||||
+ ngx_http_log_loc_conf_t *lcf;
|
||||
ngx_http_variable_value_t *value;
|
||||
|
||||
value = ngx_http_get_indexed_variable(r, data);
|
||||
@@ -645,7 +656,9 @@
|
||||
return 1;
|
||||
}
|
||||
|
||||
- len = ngx_http_log_escape(NULL, value->data, value->len);
|
||||
+ lcf = ngx_http_get_module_loc_conf(r, ngx_http_log_module);
|
||||
+
|
||||
+ len = ngx_http_log_escape(lcf, NULL, value->data, value->len);
|
||||
|
||||
value->escape = len ? 1 : 0;
|
||||
|
||||
@@ -656,6 +669,7 @@
|
||||
static u_char *
|
||||
ngx_http_log_variable(ngx_http_request_t *r, u_char *buf, ngx_http_log_op_t *op)
|
||||
{
|
||||
+ ngx_http_log_loc_conf_t *lcf;
|
||||
ngx_http_variable_value_t *value;
|
||||
|
||||
value = ngx_http_get_indexed_variable(r, op->data);
|
||||
@@ -669,16 +683,18 @@
|
||||
return ngx_cpymem(buf, value->data, value->len);
|
||||
|
||||
} else {
|
||||
- return (u_char *) ngx_http_log_escape(buf, value->data, value->len);
|
||||
+ lcf = ngx_http_get_module_loc_conf(r, ngx_http_log_module);
|
||||
+ return (u_char *) ngx_http_log_escape(lcf, buf, value->data, value->len);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static uintptr_t
|
||||
-ngx_http_log_escape(u_char *dst, u_char *src, size_t size)
|
||||
+ngx_http_log_escape(ngx_http_log_loc_conf_t *lcf, u_char *dst, u_char *src,
|
||||
+ size_t size)
|
||||
{
|
||||
- ngx_uint_t n;
|
||||
- static u_char hex[] = "0123456789ABCDEF";
|
||||
+ ngx_uint_t n;
|
||||
+ static u_char hex[] = "0123456789ABCDEF";
|
||||
|
||||
static uint32_t escape[] = {
|
||||
0xffffffff, /* 1111 1111 1111 1111 1111 1111 1111 1111 */
|
||||
@@ -698,6 +714,12 @@
|
||||
0xffffffff, /* 1111 1111 1111 1111 1111 1111 1111 1111 */
|
||||
};
|
||||
|
||||
+ if (lcf->escape_non_ascii) {
|
||||
+ ngx_memset(&escape[4], 0xff, sizeof(uint32_t) * 4);
|
||||
+
|
||||
+ } else {
|
||||
+ ngx_memzero(&escape[4], sizeof(uint32_t) * 4);
|
||||
+ }
|
||||
|
||||
if (dst == NULL) {
|
||||
|
||||
@@ -781,6 +803,7 @@
|
||||
}
|
||||
|
||||
conf->open_file_cache = NGX_CONF_UNSET_PTR;
|
||||
+ conf->escape_non_ascii = NGX_CONF_UNSET;
|
||||
|
||||
return conf;
|
||||
}
|
||||
@@ -796,6 +819,8 @@
|
||||
ngx_http_log_fmt_t *fmt;
|
||||
ngx_http_log_main_conf_t *lmcf;
|
||||
|
||||
+ ngx_conf_merge_value(conf->escape_non_ascii, prev->escape_non_ascii, 1);
|
||||
+
|
||||
if (conf->open_file_cache == NGX_CONF_UNSET_PTR) {
|
||||
|
||||
conf->open_file_cache = prev->open_file_cache;
|
14
patches/nginx-1.0.14-max_subrequests.patch
Normal file
14
patches/nginx-1.0.14-max_subrequests.patch
Normal file
@ -0,0 +1,14 @@
|
||||
--- nginx-1.0.14/src/http/ngx_http_request.h 2011-08-29 18:39:23.000000000 +0800
|
||||
+++ nginx-1.0.14-patched/src/http/ngx_http_request.h 2012-02-20 15:50:43.540762756 +0800
|
||||
@@ -9,7 +9,10 @@
|
||||
|
||||
|
||||
#define NGX_HTTP_MAX_URI_CHANGES 10
|
||||
-#define NGX_HTTP_MAX_SUBREQUESTS 50
|
||||
+
|
||||
+#ifndef NGX_HTTP_MAX_SUBREQUESTS
|
||||
+#define NGX_HTTP_MAX_SUBREQUESTS 200
|
||||
+#endif
|
||||
|
||||
/* must be 2^n */
|
||||
#define NGX_HTTP_LC_HEADER_LEN 32
|
12
patches/nginx-1.0.14-named_location_clear_mods_ctx.patch
Normal file
12
patches/nginx-1.0.14-named_location_clear_mods_ctx.patch
Normal file
@ -0,0 +1,12 @@
|
||||
--- nginx-1.0.14/src/http/ngx_http_core_module.c 2011-09-27 19:14:02.000000000 +0800
|
||||
+++ nginx-1.0.14-patched/src/http/ngx_http_core_module.c 2011-10-13 15:02:24.414550532 +0800
|
||||
@@ -2542,6 +2542,9 @@
|
||||
r->content_handler = NULL;
|
||||
r->loc_conf = (*clcfp)->loc_conf;
|
||||
|
||||
+ /* clear the modules contexts */
|
||||
+ ngx_memzero(r->ctx, sizeof(void *) * ngx_http_max_module);
|
||||
+
|
||||
ngx_http_update_location_config(r);
|
||||
|
||||
cmcf = ngx_http_get_module_main_conf(r, ngx_http_core_module);
|
24
patches/nginx-1.0.14-no_Werror.patch
Normal file
24
patches/nginx-1.0.14-no_Werror.patch
Normal file
@ -0,0 +1,24 @@
|
||||
diff -ur nginx-1.0.14/auto/cc/gcc nginx-1.0.14-patched/auto/cc/gcc
|
||||
--- nginx-1.0.14/auto/cc/gcc 2011-06-27 19:53:00.205737804 +0800
|
||||
+++ nginx-1.0.14-patched/auto/cc/gcc 2011-06-27 19:53:13.837741087 +0800
|
||||
@@ -169,7 +169,7 @@
|
||||
|
||||
|
||||
# stop on warning
|
||||
-CFLAGS="$CFLAGS -Werror"
|
||||
+#CFLAGS="$CFLAGS -Werror"
|
||||
|
||||
# debug
|
||||
CFLAGS="$CFLAGS -g"
|
||||
diff -ur nginx-1.0.14/auto/cc/icc nginx-1.0.14-patched/auto/cc/icc
|
||||
--- nginx-1.0.14/auto/cc/icc 2011-06-27 19:52:56.370157068 +0800
|
||||
+++ nginx-1.0.14-patched/auto/cc/icc 2011-06-27 19:53:19.508916811 +0800
|
||||
@@ -139,7 +139,7 @@
|
||||
esac
|
||||
|
||||
# stop on warning
|
||||
-CFLAGS="$CFLAGS -Werror"
|
||||
+#CFLAGS="$CFLAGS -Werror"
|
||||
|
||||
# debug
|
||||
CFLAGS="$CFLAGS -g"
|
90
patches/nginx-1.0.14-no_error_pages.patch
Normal file
90
patches/nginx-1.0.14-no_error_pages.patch
Normal file
@ -0,0 +1,90 @@
|
||||
--- nginx-1.0.14/src/http/ngx_http_core_module.c 2010-12-14 18:38:42.000000000 +0800
|
||||
+++ nginx-1.0.14-patched/src/http/ngx_http_core_module.c 2011-01-30 19:24:34.956354518 +0800
|
||||
@@ -57,6 +57,8 @@
|
||||
void *conf);
|
||||
static char *ngx_http_core_error_page(ngx_conf_t *cf, ngx_command_t *cmd,
|
||||
void *conf);
|
||||
+static char *ngx_http_core_no_error_pages(ngx_conf_t *cf, ngx_command_t *cmd,
|
||||
+ void *conf);
|
||||
static char *ngx_http_core_try_files(ngx_conf_t *cf, ngx_command_t *cmd,
|
||||
void *conf);
|
||||
static char *ngx_http_core_open_file_cache(ngx_conf_t *cf, ngx_command_t *cmd,
|
||||
@@ -614,6 +616,14 @@
|
||||
0,
|
||||
NULL },
|
||||
|
||||
+ { ngx_string("no_error_pages"),
|
||||
+ NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF
|
||||
+ |NGX_CONF_NOARGS,
|
||||
+ ngx_http_core_no_error_pages,
|
||||
+ NGX_HTTP_LOC_CONF_OFFSET,
|
||||
+ 0,
|
||||
+ NULL },
|
||||
+
|
||||
{ ngx_string("try_files"),
|
||||
NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_2MORE,
|
||||
ngx_http_core_try_files,
|
||||
@@ -3052,7 +3062,6 @@
|
||||
* clcf->types = NULL;
|
||||
* clcf->default_type = { 0, NULL };
|
||||
* clcf->error_log = NULL;
|
||||
- * clcf->error_pages = NULL;
|
||||
* clcf->try_files = NULL;
|
||||
* clcf->client_body_path = NULL;
|
||||
* clcf->regex = NULL;
|
||||
@@ -3062,6 +3071,7 @@
|
||||
* clcf->gzip_proxied = 0;
|
||||
*/
|
||||
|
||||
+ clcf->error_pages = NGX_CONF_UNSET_PTR;
|
||||
clcf->client_max_body_size = NGX_CONF_UNSET;
|
||||
clcf->client_body_buffer_size = NGX_CONF_UNSET_SIZE;
|
||||
clcf->client_body_timeout = NGX_CONF_UNSET_MSEC;
|
||||
@@ -3250,9 +3260,7 @@
|
||||
}
|
||||
}
|
||||
|
||||
- if (conf->error_pages == NULL && prev->error_pages) {
|
||||
- conf->error_pages = prev->error_pages;
|
||||
- }
|
||||
+ ngx_conf_merge_ptr_value(conf->error_pages, prev->error_pages, NULL);
|
||||
|
||||
ngx_conf_merge_str_value(conf->default_type,
|
||||
prev->default_type, "text/plain");
|
||||
@@ -3988,6 +3996,10 @@
|
||||
ngx_http_compile_complex_value_t ccv;
|
||||
|
||||
if (clcf->error_pages == NULL) {
|
||||
+ return "conflicts with \"no_error_pages\"";
|
||||
+ }
|
||||
+
|
||||
+ if (clcf->error_pages == NGX_CONF_UNSET_PTR) {
|
||||
clcf->error_pages = ngx_array_create(cf->pool, 4,
|
||||
sizeof(ngx_http_err_page_t));
|
||||
if (clcf->error_pages == NULL) {
|
||||
@@ -4095,6 +4107,25 @@
|
||||
|
||||
|
||||
static char *
|
||||
+ngx_http_core_no_error_pages(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
|
||||
+{
|
||||
+ ngx_http_core_loc_conf_t *clcf = conf;
|
||||
+
|
||||
+ if (clcf->error_pages == NULL) {
|
||||
+ return "is duplicate";
|
||||
+ }
|
||||
+
|
||||
+ if (clcf->error_pages != NGX_CONF_UNSET_PTR) {
|
||||
+ return "conflicts with \"error_page\"";
|
||||
+ }
|
||||
+
|
||||
+ clcf->error_pages = NULL;
|
||||
+
|
||||
+ return NGX_CONF_OK;
|
||||
+}
|
||||
+
|
||||
+
|
||||
+static char *
|
||||
ngx_http_core_try_files(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
|
||||
{
|
||||
ngx_http_core_loc_conf_t *clcf = conf;
|
504
patches/nginx-1.0.14-no_pool.patch
Normal file
504
patches/nginx-1.0.14-no_pool.patch
Normal file
@ -0,0 +1,504 @@
|
||||
diff -ur nginx-1.0.14/src/core/nginx.h nginx-1.0.14-patched/src/core/nginx.h
|
||||
--- nginx-1.0.14/src/core/nginx.h 2011-08-29 17:30:22.000000000 +0800
|
||||
+++ nginx-1.0.14-patched/src/core/nginx.h 2011-09-13 12:11:03.135622101 +0800
|
||||
@@ -10,7 +10,7 @@
|
||||
|
||||
|
||||
#define nginx_version 1000014
|
||||
#define NGINX_VERSION "1.0.14"
|
||||
-#define NGINX_VER "ngx_openresty/" NGINX_VERSION ".unknown"
|
||||
+#define NGINX_VER "ngx_openresty/" NGINX_VERSION ".unknown (no pool)"
|
||||
|
||||
#define NGINX_VAR "NGINX"
|
||||
diff -ur nginx-1.0.14/src/core/ngx_array.c nginx-1.0.14-patched/src/core/ngx_array.c
|
||||
--- nginx-1.0.14/src/core/ngx_array.c 2008-06-17 23:00:30.000000000 +0800
|
||||
+++ nginx-1.0.14-patched/src/core/ngx_array.c 2011-09-14 12:02:56.263128538 +0800
|
||||
@@ -39,13 +39,7 @@
|
||||
|
||||
p = a->pool;
|
||||
|
||||
- if ((u_char *) a->elts + a->size * a->nalloc == p->d.last) {
|
||||
- p->d.last -= a->size * a->nalloc;
|
||||
- }
|
||||
-
|
||||
- if ((u_char *) a + sizeof(ngx_array_t) == p->d.last) {
|
||||
- p->d.last = (u_char *) a;
|
||||
- }
|
||||
+ ngx_pfree(p, a);
|
||||
}
|
||||
|
||||
|
||||
@@ -64,29 +58,17 @@
|
||||
|
||||
p = a->pool;
|
||||
|
||||
- if ((u_char *) a->elts + size == p->d.last
|
||||
- && p->d.last + a->size <= p->d.end)
|
||||
- {
|
||||
- /*
|
||||
- * the array allocation is the last in the pool
|
||||
- * and there is space for new allocation
|
||||
- */
|
||||
-
|
||||
- p->d.last += a->size;
|
||||
- a->nalloc++;
|
||||
-
|
||||
- } else {
|
||||
- /* allocate a new array */
|
||||
-
|
||||
- new = ngx_palloc(p, 2 * size);
|
||||
- if (new == NULL) {
|
||||
- return NULL;
|
||||
- }
|
||||
-
|
||||
- ngx_memcpy(new, a->elts, size);
|
||||
- a->elts = new;
|
||||
- a->nalloc *= 2;
|
||||
+ /* allocate a new array */
|
||||
+
|
||||
+ new = ngx_palloc(p, 2 * size);
|
||||
+ if (new == NULL) {
|
||||
+ return NULL;
|
||||
}
|
||||
+
|
||||
+ ngx_memcpy(new, a->elts, size);
|
||||
+ a->elts = new;
|
||||
+ a->nalloc *= 2;
|
||||
+
|
||||
}
|
||||
|
||||
elt = (u_char *) a->elts + a->size * a->nelts;
|
||||
@@ -100,43 +82,25 @@
|
||||
ngx_array_push_n(ngx_array_t *a, ngx_uint_t n)
|
||||
{
|
||||
void *elt, *new;
|
||||
- size_t size;
|
||||
ngx_uint_t nalloc;
|
||||
ngx_pool_t *p;
|
||||
|
||||
- size = n * a->size;
|
||||
-
|
||||
if (a->nelts + n > a->nalloc) {
|
||||
|
||||
/* the array is full */
|
||||
|
||||
p = a->pool;
|
||||
|
||||
- if ((u_char *) a->elts + a->size * a->nalloc == p->d.last
|
||||
- && p->d.last + size <= p->d.end)
|
||||
- {
|
||||
- /*
|
||||
- * the array allocation is the last in the pool
|
||||
- * and there is space for new allocation
|
||||
- */
|
||||
-
|
||||
- p->d.last += size;
|
||||
- a->nalloc += n;
|
||||
-
|
||||
- } else {
|
||||
- /* allocate a new array */
|
||||
-
|
||||
- nalloc = 2 * ((n >= a->nalloc) ? n : a->nalloc);
|
||||
-
|
||||
- new = ngx_palloc(p, nalloc * a->size);
|
||||
- if (new == NULL) {
|
||||
- return NULL;
|
||||
- }
|
||||
-
|
||||
- ngx_memcpy(new, a->elts, a->nelts * a->size);
|
||||
- a->elts = new;
|
||||
- a->nalloc = nalloc;
|
||||
+ nalloc = 2 * ((n >= a->nalloc) ? n : a->nalloc);
|
||||
+
|
||||
+ new = ngx_palloc(p, nalloc * a->size);
|
||||
+ if (new == NULL) {
|
||||
+ return NULL;
|
||||
}
|
||||
+
|
||||
+ ngx_memcpy(new, a->elts, a->nelts * a->size);
|
||||
+ a->elts = new;
|
||||
+ a->nalloc = nalloc;
|
||||
}
|
||||
|
||||
elt = (u_char *) a->elts + a->size * a->nelts;
|
||||
diff -ur nginx-1.0.14/src/core/ngx_palloc.c nginx-1.0.14-patched/src/core/ngx_palloc.c
|
||||
--- nginx-1.0.14/src/core/ngx_palloc.c 2009-12-17 20:25:46.000000000 +0800
|
||||
+++ nginx-1.0.14-patched/src/core/ngx_palloc.c 2011-09-14 12:03:41.663126519 +0800
|
||||
@@ -8,24 +8,31 @@
|
||||
#include <ngx_core.h>
|
||||
|
||||
|
||||
-static void *ngx_palloc_block(ngx_pool_t *pool, size_t size);
|
||||
static void *ngx_palloc_large(ngx_pool_t *pool, size_t size);
|
||||
|
||||
|
||||
ngx_pool_t *
|
||||
ngx_create_pool(size_t size, ngx_log_t *log)
|
||||
{
|
||||
- ngx_pool_t *p;
|
||||
+ ngx_pool_t *p;
|
||||
+ ngx_pool_data_t *d;
|
||||
|
||||
- p = ngx_memalign(NGX_POOL_ALIGNMENT, size, log);
|
||||
+ size = sizeof(ngx_pool_t);
|
||||
+ p = ngx_alloc(size, log);
|
||||
if (p == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
- p->d.last = (u_char *) p + sizeof(ngx_pool_t);
|
||||
- p->d.end = (u_char *) p + size;
|
||||
- p->d.next = NULL;
|
||||
- p->d.failed = 0;
|
||||
+ d = ngx_alloc(sizeof(ngx_pool_data_t), log);
|
||||
+
|
||||
+ if (d == NULL) {
|
||||
+ return NULL;
|
||||
+ }
|
||||
+
|
||||
+ d->next = d;
|
||||
+ d->prev = d;
|
||||
+ d->alloc = NULL;
|
||||
+ p->d = d;
|
||||
|
||||
size = size - sizeof(ngx_pool_t);
|
||||
p->max = (size < NGX_MAX_ALLOC_FROM_POOL) ? size : NGX_MAX_ALLOC_FROM_POOL;
|
||||
@@ -43,7 +50,7 @@
|
||||
void
|
||||
ngx_destroy_pool(ngx_pool_t *pool)
|
||||
{
|
||||
- ngx_pool_t *p, *n;
|
||||
+ ngx_pool_data_t *d, *n;
|
||||
ngx_pool_large_t *l;
|
||||
ngx_pool_cleanup_t *c;
|
||||
|
||||
@@ -55,7 +62,7 @@
|
||||
}
|
||||
}
|
||||
|
||||
- for (l = pool->large; l; l = l->next) {
|
||||
+ for (l = pool->large; l ; l = l->next) {
|
||||
|
||||
ngx_log_debug1(NGX_LOG_DEBUG_ALLOC, pool->log, 0, "free: %p", l->alloc);
|
||||
|
||||
@@ -71,34 +78,45 @@
|
||||
* so we can not use this log while the free()ing the pool
|
||||
*/
|
||||
|
||||
- for (p = pool, n = pool->d.next; /* void */; p = n, n = n->d.next) {
|
||||
+ for (d = pool->d, n = d->next; ; d = n, n = n->next) {
|
||||
ngx_log_debug2(NGX_LOG_DEBUG_ALLOC, pool->log, 0,
|
||||
- "free: %p, unused: %uz", p, p->d.end - p->d.last);
|
||||
+ "free: %p", d);
|
||||
|
||||
- if (n == NULL) {
|
||||
+ if (n == pool->d) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
+ if (pool->d->next == pool->d) {
|
||||
+ ngx_free(pool->d);
|
||||
+ } else {
|
||||
+ for (d = pool->d, n = d->next; ; d = n, n = n->next) {
|
||||
+ if (d->alloc) {
|
||||
+ ngx_free(d->alloc);
|
||||
+ }
|
||||
+ ngx_free(d);
|
||||
|
||||
- for (p = pool, n = pool->d.next; /* void */; p = n, n = n->d.next) {
|
||||
- ngx_free(p);
|
||||
-
|
||||
- if (n == NULL) {
|
||||
- break;
|
||||
+ if (n == pool->d) {
|
||||
+ break;
|
||||
+ }
|
||||
}
|
||||
}
|
||||
+
|
||||
+ ngx_free(pool);
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
ngx_reset_pool(ngx_pool_t *pool)
|
||||
{
|
||||
- ngx_pool_t *p;
|
||||
- ngx_pool_large_t *l;
|
||||
+ ngx_pool_data_t *p, *tmp;
|
||||
+ ngx_pool_large_t *l;
|
||||
+
|
||||
+ for (l = pool->large; l ; l = l->next) {
|
||||
+
|
||||
+ ngx_log_debug1(NGX_LOG_DEBUG_ALLOC, pool->log, 0, "free: %p", l->alloc);
|
||||
|
||||
- for (l = pool->large; l; l = l->next) {
|
||||
if (l->alloc) {
|
||||
ngx_free(l->alloc);
|
||||
}
|
||||
@@ -106,109 +124,65 @@
|
||||
|
||||
pool->large = NULL;
|
||||
|
||||
- for (p = pool; p; p = p->d.next) {
|
||||
- p->d.last = (u_char *) p + sizeof(ngx_pool_t);
|
||||
+ p = pool->d->next;
|
||||
+ while (p != pool->d) {
|
||||
+ tmp = p;
|
||||
+ ngx_free(p->alloc);
|
||||
+ p->prev->next = p->next;
|
||||
+ p->next->prev = p->prev;
|
||||
+ p = p->next;
|
||||
+ ngx_free(tmp);
|
||||
}
|
||||
-}
|
||||
|
||||
+ ngx_free(pool->d->alloc);
|
||||
+ pool->d->alloc = NULL;
|
||||
+
|
||||
+}
|
||||
|
||||
void *
|
||||
-ngx_palloc(ngx_pool_t *pool, size_t size)
|
||||
+ngx_malloc(ngx_pool_t *pool, size_t size)
|
||||
{
|
||||
- u_char *m;
|
||||
- ngx_pool_t *p;
|
||||
-
|
||||
- if (size <= pool->max) {
|
||||
+ ngx_pool_data_t *new;
|
||||
+ void *m;
|
||||
|
||||
- p = pool->current;
|
||||
-
|
||||
- do {
|
||||
- m = ngx_align_ptr(p->d.last, NGX_ALIGNMENT);
|
||||
-
|
||||
- if ((size_t) (p->d.end - m) >= size) {
|
||||
- p->d.last = m + size;
|
||||
-
|
||||
- return m;
|
||||
- }
|
||||
-
|
||||
- p = p->d.next;
|
||||
-
|
||||
- } while (p);
|
||||
+ m = ngx_alloc(size, pool->log);
|
||||
+ if (m == NULL) {
|
||||
+ return NULL;
|
||||
+ }
|
||||
|
||||
- return ngx_palloc_block(pool, size);
|
||||
+ new = ngx_alloc(sizeof(ngx_pool_data_t), pool->log);
|
||||
+ if (new == NULL){
|
||||
+ ngx_free(m);
|
||||
+ return NULL;
|
||||
}
|
||||
|
||||
- return ngx_palloc_large(pool, size);
|
||||
+ new->alloc = m;
|
||||
+ new->next = pool->d;
|
||||
+ new->prev = pool->d->prev;
|
||||
+ pool->d->prev->next = new;
|
||||
+ pool->d->prev = new;
|
||||
+ return m;
|
||||
}
|
||||
|
||||
-
|
||||
void *
|
||||
-ngx_pnalloc(ngx_pool_t *pool, size_t size)
|
||||
+ngx_palloc(ngx_pool_t *pool, size_t size)
|
||||
{
|
||||
- u_char *m;
|
||||
- ngx_pool_t *p;
|
||||
-
|
||||
- if (size <= pool->max) {
|
||||
-
|
||||
- p = pool->current;
|
||||
-
|
||||
- do {
|
||||
- m = p->d.last;
|
||||
-
|
||||
- if ((size_t) (p->d.end - m) >= size) {
|
||||
- p->d.last = m + size;
|
||||
-
|
||||
- return m;
|
||||
- }
|
||||
-
|
||||
- p = p->d.next;
|
||||
-
|
||||
- } while (p);
|
||||
-
|
||||
- return ngx_palloc_block(pool, size);
|
||||
+ if (size <= 1024) {
|
||||
+ return ngx_malloc(pool, size);
|
||||
}
|
||||
|
||||
return ngx_palloc_large(pool, size);
|
||||
}
|
||||
|
||||
|
||||
-static void *
|
||||
-ngx_palloc_block(ngx_pool_t *pool, size_t size)
|
||||
+void *
|
||||
+ngx_pnalloc(ngx_pool_t *pool, size_t size)
|
||||
{
|
||||
- u_char *m;
|
||||
- size_t psize;
|
||||
- ngx_pool_t *p, *new, *current;
|
||||
-
|
||||
- psize = (size_t) (pool->d.end - (u_char *) pool);
|
||||
-
|
||||
- m = ngx_memalign(NGX_POOL_ALIGNMENT, psize, pool->log);
|
||||
- if (m == NULL) {
|
||||
- return NULL;
|
||||
- }
|
||||
-
|
||||
- new = (ngx_pool_t *) m;
|
||||
-
|
||||
- new->d.end = m + psize;
|
||||
- new->d.next = NULL;
|
||||
- new->d.failed = 0;
|
||||
-
|
||||
- m += sizeof(ngx_pool_data_t);
|
||||
- m = ngx_align_ptr(m, NGX_ALIGNMENT);
|
||||
- new->d.last = m + size;
|
||||
-
|
||||
- current = pool->current;
|
||||
-
|
||||
- for (p = current; p->d.next; p = p->d.next) {
|
||||
- if (p->d.failed++ > 4) {
|
||||
- current = p->d.next;
|
||||
- }
|
||||
+ if (size <= 1024) {
|
||||
+ return ngx_malloc(pool, size);
|
||||
}
|
||||
|
||||
- p->d.next = new;
|
||||
-
|
||||
- pool->current = current ? current : new;
|
||||
-
|
||||
- return m;
|
||||
+ return ngx_palloc_large(pool, size);
|
||||
}
|
||||
|
||||
|
||||
@@ -216,7 +190,6 @@
|
||||
ngx_palloc_large(ngx_pool_t *pool, size_t size)
|
||||
{
|
||||
void *p;
|
||||
- ngx_uint_t n;
|
||||
ngx_pool_large_t *large;
|
||||
|
||||
p = ngx_alloc(size, pool->log);
|
||||
@@ -224,20 +197,7 @@
|
||||
return NULL;
|
||||
}
|
||||
|
||||
- n = 0;
|
||||
-
|
||||
- for (large = pool->large; large; large = large->next) {
|
||||
- if (large->alloc == NULL) {
|
||||
- large->alloc = p;
|
||||
- return p;
|
||||
- }
|
||||
-
|
||||
- if (n++ > 3) {
|
||||
- break;
|
||||
- }
|
||||
- }
|
||||
-
|
||||
- large = ngx_palloc(pool, sizeof(ngx_pool_large_t));
|
||||
+ large = ngx_malloc(pool, sizeof(ngx_pool_large_t));
|
||||
if (large == NULL) {
|
||||
ngx_free(p);
|
||||
return NULL;
|
||||
@@ -262,7 +222,7 @@
|
||||
return NULL;
|
||||
}
|
||||
|
||||
- large = ngx_palloc(pool, sizeof(ngx_pool_large_t));
|
||||
+ large = ngx_malloc(pool, sizeof(ngx_pool_large_t));
|
||||
if (large == NULL) {
|
||||
ngx_free(p);
|
||||
return NULL;
|
||||
@@ -279,17 +239,41 @@
|
||||
ngx_int_t
|
||||
ngx_pfree(ngx_pool_t *pool, void *p)
|
||||
{
|
||||
- ngx_pool_large_t *l;
|
||||
+ ngx_pool_large_t *l;
|
||||
+ ngx_pool_large_t *ll;
|
||||
+ ngx_pool_data_t *d, *n;
|
||||
|
||||
- for (l = pool->large; l; l = l->next) {
|
||||
+ for (l = pool->large, ll = l; l; ll = l, l = l->next) {
|
||||
if (p == l->alloc) {
|
||||
ngx_log_debug1(NGX_LOG_DEBUG_ALLOC, pool->log, 0,
|
||||
"free: %p", l->alloc);
|
||||
ngx_free(l->alloc);
|
||||
l->alloc = NULL;
|
||||
+ if (l == pool->large) {
|
||||
+ pool->large = NULL;
|
||||
+ }
|
||||
+
|
||||
+ ll->next = l->next;
|
||||
+ p = l;
|
||||
+ break;
|
||||
+ }
|
||||
+ }
|
||||
|
||||
+ for (d = pool->d, n = d->next; ; d = n, n = d->next) {
|
||||
+ if (p == d->alloc) {
|
||||
+ ngx_log_debug1(NGX_LOG_DEBUG_ALLOC, pool->log, 0, "free: %p", d->alloc);
|
||||
+ if (d->alloc) {
|
||||
+ ngx_free(d->alloc);
|
||||
+ }
|
||||
+ d->alloc = NULL;
|
||||
+ d->prev->next = d->next;
|
||||
+ d->next->prev = d->prev;
|
||||
+ ngx_free(d);
|
||||
return NGX_OK;
|
||||
}
|
||||
+ if (d->next == pool->d) {
|
||||
+ break;
|
||||
+ }
|
||||
}
|
||||
|
||||
return NGX_DECLINED;
|
||||
diff -ur nginx-1.0.14/src/core/ngx_palloc.h nginx-1.0.14-patched/src/core/ngx_palloc.h
|
||||
--- nginx-1.0.14/src/core/ngx_palloc.h 2009-12-17 20:25:46.000000000 +0800
|
||||
+++ nginx-1.0.14-patched/src/core/ngx_palloc.h 2011-09-13 12:11:03.155622101 +0800
|
||||
@@ -38,6 +38,7 @@
|
||||
|
||||
|
||||
typedef struct ngx_pool_large_s ngx_pool_large_t;
|
||||
+typedef struct ngx_pool_data_s ngx_pool_data_t;
|
||||
|
||||
struct ngx_pool_large_s {
|
||||
ngx_pool_large_t *next;
|
||||
@@ -45,16 +46,15 @@
|
||||
};
|
||||
|
||||
|
||||
-typedef struct {
|
||||
- u_char *last;
|
||||
- u_char *end;
|
||||
- ngx_pool_t *next;
|
||||
- ngx_uint_t failed;
|
||||
-} ngx_pool_data_t;
|
||||
+struct ngx_pool_data_s{
|
||||
+ ngx_pool_data_t *next;
|
||||
+ ngx_pool_data_t *prev;
|
||||
+ void *alloc;
|
||||
+};
|
||||
|
||||
|
||||
struct ngx_pool_s {
|
||||
- ngx_pool_data_t d;
|
||||
+ ngx_pool_data_t *d;
|
||||
size_t max;
|
||||
ngx_pool_t *current;
|
||||
ngx_chain_t *chain;
|
113
patches/nginx-1.0.14-null_character_fixes.patch
Normal file
113
patches/nginx-1.0.14-null_character_fixes.patch
Normal file
@ -0,0 +1,113 @@
|
||||
--- src/http/modules/ngx_http_fastcgi_module.c
|
||||
+++ src/http/modules/ngx_http_fastcgi_module.c
|
||||
@@ -1501,10 +1501,10 @@ ngx_http_fastcgi_process_header(ngx_http
|
||||
h->lowcase_key = h->key.data + h->key.len + 1
|
||||
+ h->value.len + 1;
|
||||
|
||||
- ngx_cpystrn(h->key.data, r->header_name_start,
|
||||
- h->key.len + 1);
|
||||
- ngx_cpystrn(h->value.data, r->header_start,
|
||||
- h->value.len + 1);
|
||||
+ ngx_memcpy(h->key.data, r->header_name_start, h->key.len);
|
||||
+ h->key.data[h->key.len] = '\0';
|
||||
+ ngx_memcpy(h->value.data, r->header_start, h->value.len);
|
||||
+ h->value.data[h->value.len] = '\0';
|
||||
}
|
||||
|
||||
h->hash = r->header_hash;
|
||||
--- src/http/modules/ngx_http_proxy_module.c
|
||||
+++ src/http/modules/ngx_http_proxy_module.c
|
||||
@@ -1381,8 +1381,10 @@ ngx_http_proxy_process_header(ngx_http_r
|
||||
h->value.data = h->key.data + h->key.len + 1;
|
||||
h->lowcase_key = h->key.data + h->key.len + 1 + h->value.len + 1;
|
||||
|
||||
- ngx_cpystrn(h->key.data, r->header_name_start, h->key.len + 1);
|
||||
- ngx_cpystrn(h->value.data, r->header_start, h->value.len + 1);
|
||||
+ ngx_memcpy(h->key.data, r->header_name_start, h->key.len);
|
||||
+ h->key.data[h->key.len] = '\0';
|
||||
+ ngx_memcpy(h->value.data, r->header_start, h->value.len);
|
||||
+ h->value.data[h->value.len] = '\0';
|
||||
|
||||
if (h->key.len == r->lowcase_index) {
|
||||
ngx_memcpy(h->lowcase_key, r->lowcase_header, h->key.len);
|
||||
--- src/http/modules/ngx_http_scgi_module.c
|
||||
+++ src/http/modules/ngx_http_scgi_module.c
|
||||
@@ -941,8 +941,10 @@ ngx_http_scgi_process_header(ngx_http_re
|
||||
h->value.data = h->key.data + h->key.len + 1;
|
||||
h->lowcase_key = h->key.data + h->key.len + 1 + h->value.len + 1;
|
||||
|
||||
- ngx_cpystrn(h->key.data, r->header_name_start, h->key.len + 1);
|
||||
- ngx_cpystrn(h->value.data, r->header_start, h->value.len + 1);
|
||||
+ ngx_memcpy(h->key.data, r->header_name_start, h->key.len);
|
||||
+ h->key.data[h->key.len] = '\0';
|
||||
+ ngx_memcpy(h->value.data, r->header_start, h->value.len);
|
||||
+ h->value.data[h->value.len] = '\0';
|
||||
|
||||
if (h->key.len == r->lowcase_index) {
|
||||
ngx_memcpy(h->lowcase_key, r->lowcase_header, h->key.len);
|
||||
--- src/http/modules/ngx_http_uwsgi_module.c
|
||||
+++ src/http/modules/ngx_http_uwsgi_module.c
|
||||
@@ -985,8 +985,10 @@ ngx_http_uwsgi_process_header(ngx_http_r
|
||||
h->value.data = h->key.data + h->key.len + 1;
|
||||
h->lowcase_key = h->key.data + h->key.len + 1 + h->value.len + 1;
|
||||
|
||||
- ngx_cpystrn(h->key.data, r->header_name_start, h->key.len + 1);
|
||||
- ngx_cpystrn(h->value.data, r->header_start, h->value.len + 1);
|
||||
+ ngx_memcpy(h->key.data, r->header_name_start, h->key.len);
|
||||
+ h->key.data[h->key.len] = '\0';
|
||||
+ ngx_memcpy(h->value.data, r->header_start, h->value.len);
|
||||
+ h->value.data[h->value.len] = '\0';
|
||||
|
||||
if (h->key.len == r->lowcase_index) {
|
||||
ngx_memcpy(h->lowcase_key, r->lowcase_header, h->key.len);
|
||||
--- src/http/ngx_http_parse.c
|
||||
+++ src/http/ngx_http_parse.c
|
||||
@@ -874,6 +874,10 @@ ngx_http_parse_header_line(ngx_http_requ
|
||||
break;
|
||||
}
|
||||
|
||||
+ if (ch == '\0') {
|
||||
+ return NGX_HTTP_PARSE_INVALID_HEADER;
|
||||
+ }
|
||||
+
|
||||
r->invalid_header = 1;
|
||||
|
||||
break;
|
||||
@@ -936,6 +940,10 @@ ngx_http_parse_header_line(ngx_http_requ
|
||||
break;
|
||||
}
|
||||
|
||||
+ if (ch == '\0') {
|
||||
+ return NGX_HTTP_PARSE_INVALID_HEADER;
|
||||
+ }
|
||||
+
|
||||
r->invalid_header = 1;
|
||||
|
||||
break;
|
||||
@@ -954,6 +962,8 @@ ngx_http_parse_header_line(ngx_http_requ
|
||||
r->header_start = p;
|
||||
r->header_end = p;
|
||||
goto done;
|
||||
+ case '\0':
|
||||
+ return NGX_HTTP_PARSE_INVALID_HEADER;
|
||||
default:
|
||||
r->header_start = p;
|
||||
state = sw_value;
|
||||
@@ -975,6 +985,8 @@ ngx_http_parse_header_line(ngx_http_requ
|
||||
case LF:
|
||||
r->header_end = p;
|
||||
goto done;
|
||||
+ case '\0':
|
||||
+ return NGX_HTTP_PARSE_INVALID_HEADER;
|
||||
}
|
||||
break;
|
||||
|
||||
@@ -988,6 +1000,8 @@ ngx_http_parse_header_line(ngx_http_requ
|
||||
break;
|
||||
case LF:
|
||||
goto done;
|
||||
+ case '\0':
|
||||
+ return NGX_HTTP_PARSE_INVALID_HEADER;
|
||||
default:
|
||||
state = sw_value;
|
||||
break;
|
27
patches/nginx-1.0.14-request_body_in_single_buf.patch
Normal file
27
patches/nginx-1.0.14-request_body_in_single_buf.patch
Normal file
@ -0,0 +1,27 @@
|
||||
# HG changeset patch
|
||||
# User Maxim Dounin <mdounin@mdounin.ru>
|
||||
# Date 1309799136 -14400
|
||||
# Node ID 99e276bba8596bc4df9e638482ee413f4c6bf700
|
||||
# Parent e7b2f945d55ae44a2295facf9e3336dc4633e5b5
|
||||
Core: fix body with request_body_in_single_buf.
|
||||
|
||||
If there were preread data and request body was big enough first part
|
||||
of request body was duplicated.
|
||||
|
||||
See report here:
|
||||
http://nginx.org/pipermail/nginx/2011-July/027756.html
|
||||
|
||||
diff --git a/src/http/ngx_http_request_body.c b/src/http/ngx_http_request_body.c
|
||||
--- a/src/http/ngx_http_request_body.c
|
||||
+++ b/src/http/ngx_http_request_body.c
|
||||
@@ -372,7 +372,9 @@ ngx_http_do_read_client_request_body(ngx
|
||||
}
|
||||
}
|
||||
|
||||
- if (r->request_body_in_file_only && rb->bufs->next) {
|
||||
+ if (rb->bufs->next
|
||||
+ && (r->request_body_in_file_only || r->request_body_in_single_buf))
|
||||
+ {
|
||||
rb->bufs = rb->bufs->next;
|
||||
}
|
||||
|
17
patches/nginx-1.0.14-request_body_preread_fix.patch
Normal file
17
patches/nginx-1.0.14-request_body_preread_fix.patch
Normal file
@ -0,0 +1,17 @@
|
||||
# HG changeset patch
|
||||
# User Maxim Dounin <mdounin@mdounin.ru>
|
||||
# Date 1309776931 -14400
|
||||
# Node ID e7b2f945d55ae44a2295facf9e3336dc4633e5b5
|
||||
# Parent 610e909bb9e29766188aa86fae3abe0bd3432940
|
||||
Core: fix body if it's preread and there are extra data.
|
||||
|
||||
--- nginx-1.0.14/src/http/ngx_http_request_body.c 2011-07-05 12:11:21.619264633 +0800
|
||||
+++ nginx-1.0.14-patched/src/http/ngx_http_request_body.c 2011-07-05 12:14:30.694321554 +0800
|
||||
@@ -141,6 +141,7 @@
|
||||
|
||||
/* the whole request body was pre-read */
|
||||
|
||||
+ b->last = b->pos + r->headers_in.content_length_n;
|
||||
r->header_in->pos += (size_t) r->headers_in.content_length_n;
|
||||
r->request_length += r->headers_in.content_length_n;
|
||||
|
26
patches/nginx-1.0.14-server_header.patch
Normal file
26
patches/nginx-1.0.14-server_header.patch
Normal file
@ -0,0 +1,26 @@
|
||||
diff -ur lz-nginx-1.0.14/nginx-1.0.14/src/core/nginx.h lz-nginx-1.0.14-patched/nginx-1.0.14/src/core/nginx.h
|
||||
--- lz-nginx-1.0.14/nginx-1.0.14/src/core/nginx.h 2010-02-12 17:31:01.000000000 +0800
|
||||
+++ lz-nginx-1.0.14-patched/nginx-1.0.14/src/core/nginx.h 2010-03-30 10:52:13.240702627 +0800
|
||||
@@ -10,7 +10,7 @@
|
||||
|
||||
#define nginx_version 1000014
|
||||
#define NGINX_VERSION "1.0.14"
|
||||
-#define NGINX_VER "nginx/" NGINX_VERSION
|
||||
+#define NGINX_VER "ngx_openresty/" NGINX_VERSION ".unknown"
|
||||
|
||||
#define NGINX_VAR "NGINX"
|
||||
#define NGX_OLDPID_EXT ".oldbin"
|
||||
Only in lz-nginx-1.0.14-patched/nginx-1.0.14/src/core: nginx.h.orig
|
||||
Only in lz-nginx-1.0.14-patched/nginx-1.0.14/src/core: nginx.h.rej
|
||||
diff -ur lz-nginx-1.0.14/nginx-1.0.14/src/http/ngx_http_header_filter_module.c lz-nginx-1.0.14-patched/nginx-1.0.14/src/http/ngx_http_header_filter_module.c
|
||||
--- lz-nginx-1.0.14/nginx-1.0.14/src/http/ngx_http_header_filter_module.c 2010-03-03 23:14:04.000000000 +0800
|
||||
+++ lz-nginx-1.0.14-patched/nginx-1.0.14/src/http/ngx_http_header_filter_module.c 2010-03-30 10:52:53.670909405 +0800
|
||||
@@ -45,7 +45,7 @@
|
||||
};
|
||||
|
||||
|
||||
-static char ngx_http_server_string[] = "Server: nginx" CRLF;
|
||||
+static char ngx_http_server_string[] = "Server: ngx_openresty" CRLF;
|
||||
static char ngx_http_server_full_string[] = "Server: " NGINX_VER CRLF;
|
||||
|
||||
|
40
patches/nginx-1.0.14-subrequest_loop.patch
Normal file
40
patches/nginx-1.0.14-subrequest_loop.patch
Normal file
@ -0,0 +1,40 @@
|
||||
# HG changeset patch
|
||||
# User Maxim Dounin <mdounin@mdounin.ru>
|
||||
# Date 1309187571 -14400
|
||||
# Node ID 283a416b2235d5383c12a975edc8866f007fb628
|
||||
# Parent f5fc40783ddcbf4db33859ee2a9bce54cf32c350
|
||||
Core: protect from subrequest loops.
|
||||
|
||||
Without protection subrequest loop results in r->count overflow and
|
||||
SIGSEGV. Protection was broken in 0.7.25.
|
||||
|
||||
Note that this also limits number of parallel subrequests. This
|
||||
wasn't exactly the case before 0.7.25 as local subrequests were
|
||||
completed directly.
|
||||
|
||||
See here for details:
|
||||
|
||||
http://nginx.org/pipermail/nginx-ru/2010-February/032184.html
|
||||
|
||||
diff --git a/src/http/ngx_http_core_module.c b/src/http/ngx_http_core_module.c
|
||||
--- a/src/http/ngx_http_core_module.c
|
||||
+++ b/src/http/ngx_http_core_module.c
|
||||
@@ -2287,7 +2287,6 @@ ngx_http_subrequest(ngx_http_request_t *
|
||||
sr->start_sec = tp->sec;
|
||||
sr->start_msec = tp->msec;
|
||||
|
||||
- r->main->subrequests++;
|
||||
r->main->count++;
|
||||
|
||||
*psr = sr;
|
||||
diff --git a/src/http/ngx_http_request.c b/src/http/ngx_http_request.c
|
||||
--- a/src/http/ngx_http_request.c
|
||||
+++ b/src/http/ngx_http_request.c
|
||||
@@ -1981,6 +1981,7 @@ ngx_http_finalize_request(ngx_http_reque
|
||||
if (r == c->data) {
|
||||
|
||||
r->main->count--;
|
||||
+ r->main->subrequests++;
|
||||
|
||||
if (!r->logged) {
|
||||
|
32
patches/nginx-1.0.14-upstream_pipelining.patch
Normal file
32
patches/nginx-1.0.14-upstream_pipelining.patch
Normal file
@ -0,0 +1,32 @@
|
||||
diff -ur nginx-1.0.14/src/http/ngx_http_upstream.c nginx-1.0.14-patched/src/http/ngx_http_upstream.c
|
||||
--- nginx-1.0.14/src/http/ngx_http_upstream.c 2011-12-14 02:34:34.000000000 +0800
|
||||
+++ nginx-1.0.14-patched/src/http/ngx_http_upstream.c 2012-03-21 21:20:17.333111806 +0800
|
||||
@@ -1385,6 +1385,8 @@
|
||||
|
||||
/* rc == NGX_OK */
|
||||
|
||||
+ u->request_all_sent = 1;
|
||||
+
|
||||
if (c->tcp_nopush == NGX_TCP_NOPUSH_SET) {
|
||||
if (ngx_tcp_push(c->fd) == NGX_ERROR) {
|
||||
ngx_log_error(NGX_LOG_CRIT, c->log, ngx_socket_errno,
|
||||
@@ -1451,7 +1453,7 @@
|
||||
|
||||
#endif
|
||||
|
||||
- if (u->header_sent) {
|
||||
+ if (u->request_all_sent) {
|
||||
u->write_event_handler = ngx_http_upstream_dummy_handler;
|
||||
|
||||
(void) ngx_handle_write_event(c->write, 0);
|
||||
diff -ur nginx-1.0.14/src/http/ngx_http_upstream.h nginx-1.0.14-patched/src/http/ngx_http_upstream.h
|
||||
--- nginx-1.0.14/src/http/ngx_http_upstream.h 2011-11-01 22:18:10.000000000 +0800
|
||||
+++ nginx-1.0.14-patched/src/http/ngx_http_upstream.h 2012-03-21 21:18:21.041237173 +0800
|
||||
@@ -313,6 +313,7 @@
|
||||
unsigned buffering:1;
|
||||
|
||||
unsigned request_sent:1;
|
||||
+ unsigned request_all_sent:1;
|
||||
unsigned header_sent:1;
|
||||
};
|
||||
|
73
patches/nginx-1.0.14-variable_header_ignore_no_hash.patch
Normal file
73
patches/nginx-1.0.14-variable_header_ignore_no_hash.patch
Normal file
@ -0,0 +1,73 @@
|
||||
--- nginx-1.0.14/src/http/ngx_http_variables.c 2011-05-30 20:36:17.000000000 +0800
|
||||
+++ nginx-1.0.14-patched/src/http/ngx_http_variables.c 2011-11-08 22:21:55.229247198 +0800
|
||||
@@ -648,7 +648,17 @@
|
||||
|
||||
a = (ngx_array_t *) ((char *) r + data);
|
||||
|
||||
- n = a->nelts;
|
||||
+ h = a->elts;
|
||||
+ n = 0;
|
||||
+
|
||||
+ for (i = 0; i < a->nelts; i++) {
|
||||
+
|
||||
+ if (h[i]->hash == 0) {
|
||||
+ continue;
|
||||
+ }
|
||||
+
|
||||
+ n++;
|
||||
+ }
|
||||
|
||||
if (n == 0) {
|
||||
v->not_found = 1;
|
||||
@@ -659,9 +669,7 @@
|
||||
v->no_cacheable = 0;
|
||||
v->not_found = 0;
|
||||
|
||||
- h = a->elts;
|
||||
-
|
||||
- if (n == 1) {
|
||||
+ if (n == 1 && a->nelts == 1) {
|
||||
v->len = (*h)->value.len;
|
||||
v->data = (*h)->value.data;
|
||||
|
||||
@@ -670,7 +678,12 @@
|
||||
|
||||
len = - (ssize_t) (sizeof("; ") - 1);
|
||||
|
||||
- for (i = 0; i < n; i++) {
|
||||
+ for (i = 0; i < a->nelts; i++) {
|
||||
+
|
||||
+ if (h[i]->hash == 0) {
|
||||
+ continue;
|
||||
+ }
|
||||
+
|
||||
len += h[i]->value.len + sizeof("; ") - 1;
|
||||
}
|
||||
|
||||
@@ -683,9 +696,14 @@
|
||||
v->data = p;
|
||||
|
||||
for (i = 0; /* void */ ; i++) {
|
||||
+
|
||||
+ if (h[i]->hash == 0) {
|
||||
+ continue;
|
||||
+ }
|
||||
+
|
||||
p = ngx_copy(p, h[i]->value.data, h[i]->value.len);
|
||||
|
||||
- if (i == n - 1) {
|
||||
+ if (--n == 0) {
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -738,6 +756,10 @@
|
||||
i = 0;
|
||||
}
|
||||
|
||||
+ if (header[i].hash == 0) {
|
||||
+ continue;
|
||||
+ }
|
||||
+
|
||||
for (n = 0; n + prefix < var->len && n < header[i].key.len; n++) {
|
||||
ch = header[i].key.data[n];
|
||||
|
26
patches/nginx-1.0.15-add_core_vars_polluting_globals.patch
Normal file
26
patches/nginx-1.0.15-add_core_vars_polluting_globals.patch
Normal file
@ -0,0 +1,26 @@
|
||||
--- nginx-1.0.15/src/http/ngx_http_variables.c 2012-03-05 20:36:51.000000000 +0800
|
||||
+++ nginx-1.0.15-patched/src/http/ngx_http_variables.c 2012-05-17 16:21:42.120968722 +0800
|
||||
@@ -1898,6 +1898,7 @@
|
||||
{
|
||||
ngx_int_t rc;
|
||||
ngx_http_variable_t *v;
|
||||
+ ngx_http_variable_t *value;
|
||||
ngx_http_core_main_conf_t *cmcf;
|
||||
|
||||
cmcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_core_module);
|
||||
@@ -1918,7 +1919,14 @@
|
||||
}
|
||||
|
||||
for (v = ngx_http_core_variables; v->name.len; v++) {
|
||||
- rc = ngx_hash_add_key(cmcf->variables_keys, &v->name, v,
|
||||
+ value = ngx_palloc(cf->pool, sizeof(ngx_http_variable_t));
|
||||
+ if (value == NULL) {
|
||||
+ return NGX_ERROR;
|
||||
+ }
|
||||
+
|
||||
+ *value = *v;
|
||||
+
|
||||
+ rc = ngx_hash_add_key(cmcf->variables_keys, &value->name, value,
|
||||
NGX_HASH_READONLY_KEY);
|
||||
|
||||
if (rc == NGX_OK) {
|
113
patches/nginx-1.0.15-allow_request_body_updating.patch
Normal file
113
patches/nginx-1.0.15-allow_request_body_updating.patch
Normal file
@ -0,0 +1,113 @@
|
||||
diff -ur nginx-1.0.15/src/http/ngx_http_request_body.c nginx-1.0.15-patched/src/http/ngx_http_request_body.c
|
||||
--- nginx-1.0.15/src/http/ngx_http_request_body.c 2011-09-30 22:36:19.000000000 +0800
|
||||
+++ nginx-1.0.15-patched/src/http/ngx_http_request_body.c 2011-10-21 21:54:08.460350482 +0800
|
||||
@@ -38,7 +38,7 @@
|
||||
|
||||
r->main->count++;
|
||||
|
||||
- if (r->request_body || r->discard_body) {
|
||||
+ if (r->request_body || r->discard_body || r->content_length_n == 0) {
|
||||
post_handler(r);
|
||||
return NGX_OK;
|
||||
}
|
||||
@@ -440,7 +440,7 @@
|
||||
ssize_t size;
|
||||
ngx_event_t *rev;
|
||||
|
||||
- if (r != r->main || r->discard_body) {
|
||||
+ if (r != r->main || r->discard_body || r->content_length_n == 0) {
|
||||
return NGX_OK;
|
||||
}
|
||||
|
||||
@@ -456,20 +456,22 @@
|
||||
ngx_del_timer(rev);
|
||||
}
|
||||
|
||||
- if (r->headers_in.content_length_n <= 0 || r->request_body) {
|
||||
+ r->content_length_n = r->headers_in.content_length_n;
|
||||
+
|
||||
+ if (r->content_length_n <= 0 || r->request_body) {
|
||||
return NGX_OK;
|
||||
}
|
||||
|
||||
size = r->header_in->last - r->header_in->pos;
|
||||
|
||||
if (size) {
|
||||
- if (r->headers_in.content_length_n > size) {
|
||||
+ if (r->content_length_n > size) {
|
||||
r->header_in->pos += size;
|
||||
- r->headers_in.content_length_n -= size;
|
||||
+ r->content_length_n -= size;
|
||||
|
||||
} else {
|
||||
- r->header_in->pos += (size_t) r->headers_in.content_length_n;
|
||||
- r->headers_in.content_length_n = 0;
|
||||
+ r->header_in->pos += (size_t) r->content_length_n;
|
||||
+ r->content_length_n = 0;
|
||||
return NGX_OK;
|
||||
}
|
||||
}
|
||||
@@ -568,7 +570,7 @@
|
||||
"http read discarded body");
|
||||
|
||||
for ( ;; ) {
|
||||
- if (r->headers_in.content_length_n == 0) {
|
||||
+ if (r->content_length_n == 0) {
|
||||
r->read_event_handler = ngx_http_block_reading;
|
||||
return NGX_OK;
|
||||
}
|
||||
@@ -577,9 +579,9 @@
|
||||
return NGX_AGAIN;
|
||||
}
|
||||
|
||||
- size = (r->headers_in.content_length_n > NGX_HTTP_DISCARD_BUFFER_SIZE) ?
|
||||
+ size = (r->content_length_n > NGX_HTTP_DISCARD_BUFFER_SIZE) ?
|
||||
NGX_HTTP_DISCARD_BUFFER_SIZE:
|
||||
- (size_t) r->headers_in.content_length_n;
|
||||
+ (size_t) r->content_length_n;
|
||||
|
||||
n = r->connection->recv(r->connection, buffer, size);
|
||||
|
||||
@@ -596,7 +598,7 @@
|
||||
return NGX_OK;
|
||||
}
|
||||
|
||||
- r->headers_in.content_length_n -= n;
|
||||
+ r->content_length_n -= n;
|
||||
}
|
||||
}
|
||||
|
||||
diff -ur nginx-1.0.15/src/http/ngx_http_request.c nginx-1.0.15-patched/src/http/ngx_http_request.c
|
||||
--- nginx-1.0.15/src/http/ngx_http_request.c 2011-09-30 22:36:19.000000000 +0800
|
||||
+++ nginx-1.0.15-patched/src/http/ngx_http_request.c 2011-10-21 19:06:38.404350692 +0800
|
||||
@@ -286,6 +286,8 @@
|
||||
|
||||
r->pipeline = hc->pipeline;
|
||||
|
||||
+ r->content_length_n = -1;
|
||||
+
|
||||
if (hc->nbusy) {
|
||||
r->header_in = hc->busy[0];
|
||||
}
|
||||
@@ -297,6 +299,8 @@
|
||||
return;
|
||||
}
|
||||
|
||||
+ r->content_length_n = -1;
|
||||
+
|
||||
hc->request = r;
|
||||
}
|
||||
|
||||
diff -ur nginx-1.0.15/src/http/ngx_http_request.h nginx-1.0.15-patched/src/http/ngx_http_request.h
|
||||
--- nginx-1.0.15/src/http/ngx_http_request.h 2011-08-29 18:39:23.000000000 +0800
|
||||
+++ nginx-1.0.15-patched/src/http/ngx_http_request.h 2011-10-21 17:26:13.203807584 +0800
|
||||
@@ -366,6 +366,9 @@
|
||||
ngx_pool_t *pool;
|
||||
ngx_buf_t *header_in;
|
||||
|
||||
+ off_t content_length_n;
|
||||
+ /* for discarding request body */
|
||||
+
|
||||
ngx_http_headers_in_t headers_in;
|
||||
ngx_http_headers_out_t headers_out;
|
||||
|
10
patches/nginx-1.0.15-filter_finalize_hang.patch
Normal file
10
patches/nginx-1.0.15-filter_finalize_hang.patch
Normal file
@ -0,0 +1,10 @@
|
||||
--- nginx-1.0.15/src/http/ngx_http_request.c 2012-03-05 20:49:32.000000000 +0800
|
||||
+++ nginx-1.0.15-patched/src/http/ngx_http_request.c 2012-05-22 20:46:57.000000000 +0800
|
||||
@@ -1900,7 +1900,6 @@
|
||||
|
||||
if (rc == NGX_OK && r->filter_finalize) {
|
||||
c->error = 1;
|
||||
- return;
|
||||
}
|
||||
|
||||
if (rc == NGX_DECLINED) {
|
69
patches/nginx-1.0.15-gzip_empty_flush_buf.patch
Normal file
69
patches/nginx-1.0.15-gzip_empty_flush_buf.patch
Normal file
@ -0,0 +1,69 @@
|
||||
# HG changeset patch
|
||||
# User Maxim Dounin <mdounin@mdounin.ru>
|
||||
# Date 1315324342 -14400
|
||||
# Node ID 4cf0af103bc382a78f894302d1706929a79df4bb
|
||||
# Parent d603ce98fada855f0100b422b7b5672fd22fabea
|
||||
Gzip filter: handle empty flush buffers.
|
||||
|
||||
Empty flush buffers are legitimate and may happen e.g. due to $r->flush()
|
||||
calls in embedded perl. If there are no data buffered in zlib deflate()
|
||||
will return Z_BUF_ERROR (i.e. no progress possible) without adding anything
|
||||
to output. Don't treat Z_BUF_ERROR as fatal and correctly send empty flush
|
||||
buffer if we have no data in output at all.
|
||||
|
||||
See this thread for details:
|
||||
http://mailman.nginx.org/pipermail/nginx/2010-November/023693.html
|
||||
|
||||
diff --git a/src/http/modules/ngx_http_gzip_filter_module.c b/src/http/modules/ngx_http_gzip_filter_module.c
|
||||
--- a/src/http/modules/ngx_http_gzip_filter_module.c
|
||||
+++ b/src/http/modules/ngx_http_gzip_filter_module.c
|
||||
@@ -758,6 +758,7 @@ static ngx_int_t
|
||||
ngx_http_gzip_filter_deflate(ngx_http_request_t *r, ngx_http_gzip_ctx_t *ctx)
|
||||
{
|
||||
int rc;
|
||||
+ ngx_buf_t *b;
|
||||
ngx_chain_t *cl;
|
||||
ngx_http_gzip_conf_t *conf;
|
||||
|
||||
@@ -769,7 +770,7 @@ ngx_http_gzip_filter_deflate(ngx_http_re
|
||||
|
||||
rc = deflate(&ctx->zstream, ctx->flush);
|
||||
|
||||
- if (rc != Z_OK && rc != Z_STREAM_END) {
|
||||
+ if (rc != Z_OK && rc != Z_STREAM_END && rc != Z_BUF_ERROR) {
|
||||
ngx_log_error(NGX_LOG_ALERT, r->connection->log, 0,
|
||||
"deflate() failed: %d, %d", ctx->flush, rc);
|
||||
return NGX_ERROR;
|
||||
@@ -818,8 +819,6 @@ ngx_http_gzip_filter_deflate(ngx_http_re
|
||||
|
||||
if (ctx->flush == Z_SYNC_FLUSH) {
|
||||
|
||||
- ctx->zstream.avail_out = 0;
|
||||
- ctx->out_buf->flush = 1;
|
||||
ctx->flush = Z_NO_FLUSH;
|
||||
|
||||
cl = ngx_alloc_chain_link(r->pool);
|
||||
@@ -827,7 +826,22 @@ ngx_http_gzip_filter_deflate(ngx_http_re
|
||||
return NGX_ERROR;
|
||||
}
|
||||
|
||||
- cl->buf = ctx->out_buf;
|
||||
+ b = ctx->out_buf;
|
||||
+
|
||||
+ if (ngx_buf_size(b) == 0) {
|
||||
+
|
||||
+ b = ngx_calloc_buf(ctx->request->pool);
|
||||
+ if (b == NULL) {
|
||||
+ return NGX_ERROR;
|
||||
+ }
|
||||
+
|
||||
+ } else {
|
||||
+ ctx->zstream.avail_out = 0;
|
||||
+ }
|
||||
+
|
||||
+ b->flush = 1;
|
||||
+
|
||||
+ cl->buf = b;
|
||||
cl->next = NULL;
|
||||
*ctx->last_out = cl;
|
||||
ctx->last_out = &cl->next;
|
115
patches/nginx-1.0.15-log_escape_non_ascii.patch
Normal file
115
patches/nginx-1.0.15-log_escape_non_ascii.patch
Normal file
@ -0,0 +1,115 @@
|
||||
--- nginx-1.0.15/src/http/modules/ngx_http_log_module.c 2011-11-01 21:24:50.000000000 +0800
|
||||
+++ nginx-1.0.15-patched/src/http/modules/ngx_http_log_module.c 2011-11-10 16:17:29.599039534 +0800
|
||||
@@ -61,6 +61,8 @@
|
||||
time_t open_file_cache_valid;
|
||||
ngx_uint_t open_file_cache_min_uses;
|
||||
|
||||
+ ngx_flag_t escape_non_ascii;
|
||||
+
|
||||
ngx_uint_t off; /* unsigned off:1 */
|
||||
} ngx_http_log_loc_conf_t;
|
||||
|
||||
@@ -104,7 +106,8 @@
|
||||
uintptr_t data);
|
||||
static u_char *ngx_http_log_variable(ngx_http_request_t *r, u_char *buf,
|
||||
ngx_http_log_op_t *op);
|
||||
-static uintptr_t ngx_http_log_escape(u_char *dst, u_char *src, size_t size);
|
||||
+static uintptr_t ngx_http_log_escape(ngx_http_log_loc_conf_t *lcf, u_char *dst,
|
||||
+ u_char *src, size_t size);
|
||||
|
||||
|
||||
static void *ngx_http_log_create_main_conf(ngx_conf_t *cf);
|
||||
@@ -146,6 +149,13 @@
|
||||
0,
|
||||
NULL },
|
||||
|
||||
+ { ngx_string("log_escape_non_ascii"),
|
||||
+ NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,
|
||||
+ ngx_conf_set_flag_slot,
|
||||
+ NGX_HTTP_LOC_CONF_OFFSET,
|
||||
+ offsetof(ngx_http_log_loc_conf_t, escape_non_ascii),
|
||||
+ NULL },
|
||||
+
|
||||
ngx_null_command
|
||||
};
|
||||
|
||||
@@ -637,6 +647,7 @@
|
||||
ngx_http_log_variable_getlen(ngx_http_request_t *r, uintptr_t data)
|
||||
{
|
||||
uintptr_t len;
|
||||
+ ngx_http_log_loc_conf_t *lcf;
|
||||
ngx_http_variable_value_t *value;
|
||||
|
||||
value = ngx_http_get_indexed_variable(r, data);
|
||||
@@ -645,7 +656,9 @@
|
||||
return 1;
|
||||
}
|
||||
|
||||
- len = ngx_http_log_escape(NULL, value->data, value->len);
|
||||
+ lcf = ngx_http_get_module_loc_conf(r, ngx_http_log_module);
|
||||
+
|
||||
+ len = ngx_http_log_escape(lcf, NULL, value->data, value->len);
|
||||
|
||||
value->escape = len ? 1 : 0;
|
||||
|
||||
@@ -656,6 +669,7 @@
|
||||
static u_char *
|
||||
ngx_http_log_variable(ngx_http_request_t *r, u_char *buf, ngx_http_log_op_t *op)
|
||||
{
|
||||
+ ngx_http_log_loc_conf_t *lcf;
|
||||
ngx_http_variable_value_t *value;
|
||||
|
||||
value = ngx_http_get_indexed_variable(r, op->data);
|
||||
@@ -669,16 +683,18 @@
|
||||
return ngx_cpymem(buf, value->data, value->len);
|
||||
|
||||
} else {
|
||||
- return (u_char *) ngx_http_log_escape(buf, value->data, value->len);
|
||||
+ lcf = ngx_http_get_module_loc_conf(r, ngx_http_log_module);
|
||||
+ return (u_char *) ngx_http_log_escape(lcf, buf, value->data, value->len);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static uintptr_t
|
||||
-ngx_http_log_escape(u_char *dst, u_char *src, size_t size)
|
||||
+ngx_http_log_escape(ngx_http_log_loc_conf_t *lcf, u_char *dst, u_char *src,
|
||||
+ size_t size)
|
||||
{
|
||||
- ngx_uint_t n;
|
||||
- static u_char hex[] = "0123456789ABCDEF";
|
||||
+ ngx_uint_t n;
|
||||
+ static u_char hex[] = "0123456789ABCDEF";
|
||||
|
||||
static uint32_t escape[] = {
|
||||
0xffffffff, /* 1111 1111 1111 1111 1111 1111 1111 1111 */
|
||||
@@ -698,6 +714,12 @@
|
||||
0xffffffff, /* 1111 1111 1111 1111 1111 1111 1111 1111 */
|
||||
};
|
||||
|
||||
+ if (lcf->escape_non_ascii) {
|
||||
+ ngx_memset(&escape[4], 0xff, sizeof(uint32_t) * 4);
|
||||
+
|
||||
+ } else {
|
||||
+ ngx_memzero(&escape[4], sizeof(uint32_t) * 4);
|
||||
+ }
|
||||
|
||||
if (dst == NULL) {
|
||||
|
||||
@@ -781,6 +803,7 @@
|
||||
}
|
||||
|
||||
conf->open_file_cache = NGX_CONF_UNSET_PTR;
|
||||
+ conf->escape_non_ascii = NGX_CONF_UNSET;
|
||||
|
||||
return conf;
|
||||
}
|
||||
@@ -796,6 +819,8 @@
|
||||
ngx_http_log_fmt_t *fmt;
|
||||
ngx_http_log_main_conf_t *lmcf;
|
||||
|
||||
+ ngx_conf_merge_value(conf->escape_non_ascii, prev->escape_non_ascii, 1);
|
||||
+
|
||||
if (conf->open_file_cache == NGX_CONF_UNSET_PTR) {
|
||||
|
||||
conf->open_file_cache = prev->open_file_cache;
|
14
patches/nginx-1.0.15-max_subrequests.patch
Normal file
14
patches/nginx-1.0.15-max_subrequests.patch
Normal file
@ -0,0 +1,14 @@
|
||||
--- nginx-1.0.15/src/http/ngx_http_request.h 2011-08-29 18:39:23.000000000 +0800
|
||||
+++ nginx-1.0.15-patched/src/http/ngx_http_request.h 2012-02-20 15:50:43.540762756 +0800
|
||||
@@ -9,7 +9,10 @@
|
||||
|
||||
|
||||
#define NGX_HTTP_MAX_URI_CHANGES 10
|
||||
-#define NGX_HTTP_MAX_SUBREQUESTS 50
|
||||
+
|
||||
+#ifndef NGX_HTTP_MAX_SUBREQUESTS
|
||||
+#define NGX_HTTP_MAX_SUBREQUESTS 200
|
||||
+#endif
|
||||
|
||||
/* must be 2^n */
|
||||
#define NGX_HTTP_LC_HEADER_LEN 32
|
12
patches/nginx-1.0.15-named_location_clear_mods_ctx.patch
Normal file
12
patches/nginx-1.0.15-named_location_clear_mods_ctx.patch
Normal file
@ -0,0 +1,12 @@
|
||||
--- nginx-1.0.15/src/http/ngx_http_core_module.c 2011-09-27 19:14:02.000000000 +0800
|
||||
+++ nginx-1.0.15-patched/src/http/ngx_http_core_module.c 2011-10-13 15:02:24.414550532 +0800
|
||||
@@ -2542,6 +2542,9 @@
|
||||
r->content_handler = NULL;
|
||||
r->loc_conf = (*clcfp)->loc_conf;
|
||||
|
||||
+ /* clear the modules contexts */
|
||||
+ ngx_memzero(r->ctx, sizeof(void *) * ngx_http_max_module);
|
||||
+
|
||||
ngx_http_update_location_config(r);
|
||||
|
||||
cmcf = ngx_http_get_module_main_conf(r, ngx_http_core_module);
|
24
patches/nginx-1.0.15-no_Werror.patch
Normal file
24
patches/nginx-1.0.15-no_Werror.patch
Normal file
@ -0,0 +1,24 @@
|
||||
diff -ur nginx-1.0.15/auto/cc/gcc nginx-1.0.15-patched/auto/cc/gcc
|
||||
--- nginx-1.0.15/auto/cc/gcc 2011-06-27 19:53:00.205737804 +0800
|
||||
+++ nginx-1.0.15-patched/auto/cc/gcc 2011-06-27 19:53:13.837741087 +0800
|
||||
@@ -169,7 +169,7 @@
|
||||
|
||||
|
||||
# stop on warning
|
||||
-CFLAGS="$CFLAGS -Werror"
|
||||
+#CFLAGS="$CFLAGS -Werror"
|
||||
|
||||
# debug
|
||||
CFLAGS="$CFLAGS -g"
|
||||
diff -ur nginx-1.0.15/auto/cc/icc nginx-1.0.15-patched/auto/cc/icc
|
||||
--- nginx-1.0.15/auto/cc/icc 2011-06-27 19:52:56.370157068 +0800
|
||||
+++ nginx-1.0.15-patched/auto/cc/icc 2011-06-27 19:53:19.508916811 +0800
|
||||
@@ -139,7 +139,7 @@
|
||||
esac
|
||||
|
||||
# stop on warning
|
||||
-CFLAGS="$CFLAGS -Werror"
|
||||
+#CFLAGS="$CFLAGS -Werror"
|
||||
|
||||
# debug
|
||||
CFLAGS="$CFLAGS -g"
|
90
patches/nginx-1.0.15-no_error_pages.patch
Normal file
90
patches/nginx-1.0.15-no_error_pages.patch
Normal file
@ -0,0 +1,90 @@
|
||||
--- nginx-1.0.15/src/http/ngx_http_core_module.c 2010-12-14 18:38:42.000000000 +0800
|
||||
+++ nginx-1.0.15-patched/src/http/ngx_http_core_module.c 2011-01-30 19:24:34.956354518 +0800
|
||||
@@ -57,6 +57,8 @@
|
||||
void *conf);
|
||||
static char *ngx_http_core_error_page(ngx_conf_t *cf, ngx_command_t *cmd,
|
||||
void *conf);
|
||||
+static char *ngx_http_core_no_error_pages(ngx_conf_t *cf, ngx_command_t *cmd,
|
||||
+ void *conf);
|
||||
static char *ngx_http_core_try_files(ngx_conf_t *cf, ngx_command_t *cmd,
|
||||
void *conf);
|
||||
static char *ngx_http_core_open_file_cache(ngx_conf_t *cf, ngx_command_t *cmd,
|
||||
@@ -614,6 +616,14 @@
|
||||
0,
|
||||
NULL },
|
||||
|
||||
+ { ngx_string("no_error_pages"),
|
||||
+ NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF
|
||||
+ |NGX_CONF_NOARGS,
|
||||
+ ngx_http_core_no_error_pages,
|
||||
+ NGX_HTTP_LOC_CONF_OFFSET,
|
||||
+ 0,
|
||||
+ NULL },
|
||||
+
|
||||
{ ngx_string("try_files"),
|
||||
NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_2MORE,
|
||||
ngx_http_core_try_files,
|
||||
@@ -3052,7 +3062,6 @@
|
||||
* clcf->types = NULL;
|
||||
* clcf->default_type = { 0, NULL };
|
||||
* clcf->error_log = NULL;
|
||||
- * clcf->error_pages = NULL;
|
||||
* clcf->try_files = NULL;
|
||||
* clcf->client_body_path = NULL;
|
||||
* clcf->regex = NULL;
|
||||
@@ -3062,6 +3071,7 @@
|
||||
* clcf->gzip_proxied = 0;
|
||||
*/
|
||||
|
||||
+ clcf->error_pages = NGX_CONF_UNSET_PTR;
|
||||
clcf->client_max_body_size = NGX_CONF_UNSET;
|
||||
clcf->client_body_buffer_size = NGX_CONF_UNSET_SIZE;
|
||||
clcf->client_body_timeout = NGX_CONF_UNSET_MSEC;
|
||||
@@ -3250,9 +3260,7 @@
|
||||
}
|
||||
}
|
||||
|
||||
- if (conf->error_pages == NULL && prev->error_pages) {
|
||||
- conf->error_pages = prev->error_pages;
|
||||
- }
|
||||
+ ngx_conf_merge_ptr_value(conf->error_pages, prev->error_pages, NULL);
|
||||
|
||||
ngx_conf_merge_str_value(conf->default_type,
|
||||
prev->default_type, "text/plain");
|
||||
@@ -3988,6 +3996,10 @@
|
||||
ngx_http_compile_complex_value_t ccv;
|
||||
|
||||
if (clcf->error_pages == NULL) {
|
||||
+ return "conflicts with \"no_error_pages\"";
|
||||
+ }
|
||||
+
|
||||
+ if (clcf->error_pages == NGX_CONF_UNSET_PTR) {
|
||||
clcf->error_pages = ngx_array_create(cf->pool, 4,
|
||||
sizeof(ngx_http_err_page_t));
|
||||
if (clcf->error_pages == NULL) {
|
||||
@@ -4095,6 +4107,25 @@
|
||||
|
||||
|
||||
static char *
|
||||
+ngx_http_core_no_error_pages(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
|
||||
+{
|
||||
+ ngx_http_core_loc_conf_t *clcf = conf;
|
||||
+
|
||||
+ if (clcf->error_pages == NULL) {
|
||||
+ return "is duplicate";
|
||||
+ }
|
||||
+
|
||||
+ if (clcf->error_pages != NGX_CONF_UNSET_PTR) {
|
||||
+ return "conflicts with \"error_page\"";
|
||||
+ }
|
||||
+
|
||||
+ clcf->error_pages = NULL;
|
||||
+
|
||||
+ return NGX_CONF_OK;
|
||||
+}
|
||||
+
|
||||
+
|
||||
+static char *
|
||||
ngx_http_core_try_files(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
|
||||
{
|
||||
ngx_http_core_loc_conf_t *clcf = conf;
|
501
patches/nginx-1.0.15-no_pool.patch
Normal file
501
patches/nginx-1.0.15-no_pool.patch
Normal file
@ -0,0 +1,501 @@
|
||||
diff -ur nginx-1.0.15/src/core/nginx.h nginx-1.0.15-patched/src/core/nginx.h
|
||||
--- nginx-1.0.15/src/core/nginx.h 2011-08-29 17:30:22.000000000 +0800
|
||||
+++ nginx-1.0.15-patched/src/core/nginx.h 2011-09-13 12:11:03.135622101 +0800
|
||||
@@ -10,7 +10,7 @@
|
||||
|
||||
|
||||
#define nginx_version 1000015
|
||||
#define NGINX_VERSION "1.0.15"
|
||||
-#define NGINX_VER "ngx_openresty/" NGINX_VERSION ".unknown"
|
||||
+#define NGINX_VER "ngx_openresty/" NGINX_VERSION ".unknown (no pool)"
|
||||
|
||||
#define NGINX_VAR "NGINX"
|
||||
diff -urx '*~' -x '*.swp' nginx-1.0.15/src/core/ngx_array.c nginx-1.0.15-patched/src/core/ngx_array.c
|
||||
--- nginx-1.0.15/src/core/ngx_array.c 2012-02-06 04:02:59.000000000 +0800
|
||||
+++ nginx-1.0.15-patched/src/core/ngx_array.c 2012-06-04 20:11:32.494144287 +0800
|
||||
@@ -40,13 +40,11 @@
|
||||
|
||||
p = a->pool;
|
||||
|
||||
- if ((u_char *) a->elts + a->size * a->nalloc == p->d.last) {
|
||||
- p->d.last -= a->size * a->nalloc;
|
||||
+ if (a->elts) {
|
||||
+ ngx_pfree(p, a->elts);
|
||||
}
|
||||
|
||||
- if ((u_char *) a + sizeof(ngx_array_t) == p->d.last) {
|
||||
- p->d.last = (u_char *) a;
|
||||
- }
|
||||
+ ngx_pfree(p, a);
|
||||
}
|
||||
|
||||
|
||||
@@ -65,29 +63,19 @@
|
||||
|
||||
p = a->pool;
|
||||
|
||||
- if ((u_char *) a->elts + size == p->d.last
|
||||
- && p->d.last + a->size <= p->d.end)
|
||||
- {
|
||||
- /*
|
||||
- * the array allocation is the last in the pool
|
||||
- * and there is space for new allocation
|
||||
- */
|
||||
-
|
||||
- p->d.last += a->size;
|
||||
- a->nalloc++;
|
||||
-
|
||||
- } else {
|
||||
- /* allocate a new array */
|
||||
-
|
||||
- new = ngx_palloc(p, 2 * size);
|
||||
- if (new == NULL) {
|
||||
- return NULL;
|
||||
- }
|
||||
-
|
||||
- ngx_memcpy(new, a->elts, size);
|
||||
- a->elts = new;
|
||||
- a->nalloc *= 2;
|
||||
+ /* allocate a new array */
|
||||
+
|
||||
+ new = ngx_palloc(p, 2 * size);
|
||||
+ if (new == NULL) {
|
||||
+ return NULL;
|
||||
}
|
||||
+
|
||||
+ ngx_memcpy(new, a->elts, size);
|
||||
+
|
||||
+ ngx_pfree(p, a->elts);
|
||||
+
|
||||
+ a->elts = new;
|
||||
+ a->nalloc *= 2;
|
||||
}
|
||||
|
||||
elt = (u_char *) a->elts + a->size * a->nelts;
|
||||
@@ -101,43 +89,28 @@
|
||||
ngx_array_push_n(ngx_array_t *a, ngx_uint_t n)
|
||||
{
|
||||
void *elt, *new;
|
||||
- size_t size;
|
||||
ngx_uint_t nalloc;
|
||||
ngx_pool_t *p;
|
||||
|
||||
- size = n * a->size;
|
||||
-
|
||||
if (a->nelts + n > a->nalloc) {
|
||||
|
||||
/* the array is full */
|
||||
|
||||
p = a->pool;
|
||||
|
||||
- if ((u_char *) a->elts + a->size * a->nalloc == p->d.last
|
||||
- && p->d.last + size <= p->d.end)
|
||||
- {
|
||||
- /*
|
||||
- * the array allocation is the last in the pool
|
||||
- * and there is space for new allocation
|
||||
- */
|
||||
-
|
||||
- p->d.last += size;
|
||||
- a->nalloc += n;
|
||||
-
|
||||
- } else {
|
||||
- /* allocate a new array */
|
||||
-
|
||||
- nalloc = 2 * ((n >= a->nalloc) ? n : a->nalloc);
|
||||
-
|
||||
- new = ngx_palloc(p, nalloc * a->size);
|
||||
- if (new == NULL) {
|
||||
- return NULL;
|
||||
- }
|
||||
-
|
||||
- ngx_memcpy(new, a->elts, a->nelts * a->size);
|
||||
- a->elts = new;
|
||||
- a->nalloc = nalloc;
|
||||
+ nalloc = 2 * ((n >= a->nalloc) ? n : a->nalloc);
|
||||
+
|
||||
+ new = ngx_palloc(p, nalloc * a->size);
|
||||
+ if (new == NULL) {
|
||||
+ return NULL;
|
||||
}
|
||||
+
|
||||
+ ngx_memcpy(new, a->elts, a->nelts * a->size);
|
||||
+
|
||||
+ ngx_pfree(p, a->elts);
|
||||
+
|
||||
+ a->elts = new;
|
||||
+ a->nalloc = nalloc;
|
||||
}
|
||||
|
||||
elt = (u_char *) a->elts + a->size * a->nelts;
|
||||
diff -urx '*~' -x '*.swp' nginx-1.0.15/src/core/ngx_palloc.c nginx-1.0.15-patched/src/core/ngx_palloc.c
|
||||
--- nginx-1.0.15/src/core/ngx_palloc.c 2012-02-06 04:02:59.000000000 +0800
|
||||
+++ nginx-1.0.15-patched/src/core/ngx_palloc.c 2012-06-04 20:02:26.667925891 +0800
|
||||
@@ -9,32 +9,23 @@
|
||||
#include <ngx_core.h>
|
||||
|
||||
|
||||
-static void *ngx_palloc_block(ngx_pool_t *pool, size_t size);
|
||||
-static void *ngx_palloc_large(ngx_pool_t *pool, size_t size);
|
||||
-
|
||||
-
|
||||
ngx_pool_t *
|
||||
ngx_create_pool(size_t size, ngx_log_t *log)
|
||||
{
|
||||
- ngx_pool_t *p;
|
||||
+ ngx_pool_t *p;
|
||||
|
||||
- p = ngx_memalign(NGX_POOL_ALIGNMENT, size, log);
|
||||
+ size = sizeof(ngx_pool_t);
|
||||
+ p = ngx_alloc(size, log);
|
||||
if (p == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
- p->d.last = (u_char *) p + sizeof(ngx_pool_t);
|
||||
- p->d.end = (u_char *) p + size;
|
||||
- p->d.next = NULL;
|
||||
- p->d.failed = 0;
|
||||
+ ngx_memzero(p, size);
|
||||
|
||||
size = size - sizeof(ngx_pool_t);
|
||||
p->max = (size < NGX_MAX_ALLOC_FROM_POOL) ? size : NGX_MAX_ALLOC_FROM_POOL;
|
||||
|
||||
p->current = p;
|
||||
- p->chain = NULL;
|
||||
- p->large = NULL;
|
||||
- p->cleanup = NULL;
|
||||
p->log = log;
|
||||
|
||||
return p;
|
||||
@@ -44,8 +35,7 @@
|
||||
void
|
||||
ngx_destroy_pool(ngx_pool_t *pool)
|
||||
{
|
||||
- ngx_pool_t *p, *n;
|
||||
- ngx_pool_large_t *l;
|
||||
+ ngx_pool_data_t *d, *n;
|
||||
ngx_pool_cleanup_t *c;
|
||||
|
||||
for (c = pool->cleanup; c; c = c->next) {
|
||||
@@ -56,13 +46,9 @@
|
||||
}
|
||||
}
|
||||
|
||||
- for (l = pool->large; l; l = l->next) {
|
||||
-
|
||||
- ngx_log_debug1(NGX_LOG_DEBUG_ALLOC, pool->log, 0, "free: %p", l->alloc);
|
||||
-
|
||||
- if (l->alloc) {
|
||||
- ngx_free(l->alloc);
|
||||
- }
|
||||
+ if (pool->d == NULL) {
|
||||
+ ngx_free(pool);
|
||||
+ return;
|
||||
}
|
||||
|
||||
#if (NGX_DEBUG)
|
||||
@@ -72,9 +58,9 @@
|
||||
* so we cannot use this log while free()ing the pool
|
||||
*/
|
||||
|
||||
- for (p = pool, n = pool->d.next; /* void */; p = n, n = n->d.next) {
|
||||
+ for (d = pool->d, n = d->next; ; d = n, n = n->next) {
|
||||
ngx_log_debug2(NGX_LOG_DEBUG_ALLOC, pool->log, 0,
|
||||
- "free: %p, unused: %uz", p, p->d.end - p->d.last);
|
||||
+ "free: %p, unused: %d", d, 0);
|
||||
|
||||
if (n == NULL) {
|
||||
break;
|
||||
@@ -83,172 +69,82 @@
|
||||
|
||||
#endif
|
||||
|
||||
- for (p = pool, n = pool->d.next; /* void */; p = n, n = n->d.next) {
|
||||
- ngx_free(p);
|
||||
+ for (d = pool->d, n = d->next; ; d = n, n = n->next) {
|
||||
+ ngx_free(d->alloc);
|
||||
+ ngx_free(d);
|
||||
|
||||
if (n == NULL) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
-}
|
||||
|
||||
+ pool->d = NULL;
|
||||
|
||||
-void
|
||||
-ngx_reset_pool(ngx_pool_t *pool)
|
||||
-{
|
||||
- ngx_pool_t *p;
|
||||
- ngx_pool_large_t *l;
|
||||
-
|
||||
- for (l = pool->large; l; l = l->next) {
|
||||
- if (l->alloc) {
|
||||
- ngx_free(l->alloc);
|
||||
- }
|
||||
- }
|
||||
-
|
||||
- pool->large = NULL;
|
||||
-
|
||||
- for (p = pool; p; p = p->d.next) {
|
||||
- p->d.last = (u_char *) p + sizeof(ngx_pool_t);
|
||||
- }
|
||||
+ ngx_free(pool);
|
||||
}
|
||||
|
||||
|
||||
-void *
|
||||
-ngx_palloc(ngx_pool_t *pool, size_t size)
|
||||
+void
|
||||
+ngx_reset_pool(ngx_pool_t *pool)
|
||||
{
|
||||
- u_char *m;
|
||||
- ngx_pool_t *p;
|
||||
-
|
||||
- if (size <= pool->max) {
|
||||
+ ngx_pool_data_t *d, *n;
|
||||
+ ngx_pool_data_t *saved = NULL;
|
||||
|
||||
- p = pool->current;
|
||||
-
|
||||
- do {
|
||||
- m = ngx_align_ptr(p->d.last, NGX_ALIGNMENT);
|
||||
-
|
||||
- if ((size_t) (p->d.end - m) >= size) {
|
||||
- p->d.last = m + size;
|
||||
-
|
||||
- return m;
|
||||
+ if (pool->d) {
|
||||
+ for (d = pool->d, n = d->next; ; d = n, n = n->next) {
|
||||
+ if (d->alloc == pool->log) {
|
||||
+ saved = d;
|
||||
+ continue;
|
||||
}
|
||||
|
||||
- p = p->d.next;
|
||||
-
|
||||
- } while (p);
|
||||
-
|
||||
- return ngx_palloc_block(pool, size);
|
||||
- }
|
||||
-
|
||||
- return ngx_palloc_large(pool, size);
|
||||
-}
|
||||
-
|
||||
+ ngx_free(d->alloc);
|
||||
+ ngx_free(d);
|
||||
|
||||
-void *
|
||||
-ngx_pnalloc(ngx_pool_t *pool, size_t size)
|
||||
-{
|
||||
- u_char *m;
|
||||
- ngx_pool_t *p;
|
||||
-
|
||||
- if (size <= pool->max) {
|
||||
-
|
||||
- p = pool->current;
|
||||
-
|
||||
- do {
|
||||
- m = p->d.last;
|
||||
-
|
||||
- if ((size_t) (p->d.end - m) >= size) {
|
||||
- p->d.last = m + size;
|
||||
-
|
||||
- return m;
|
||||
+ if (n == NULL) {
|
||||
+ break;
|
||||
}
|
||||
+ }
|
||||
|
||||
- p = p->d.next;
|
||||
-
|
||||
- } while (p);
|
||||
-
|
||||
- return ngx_palloc_block(pool, size);
|
||||
+ pool->d = saved;
|
||||
}
|
||||
-
|
||||
- return ngx_palloc_large(pool, size);
|
||||
}
|
||||
|
||||
|
||||
-static void *
|
||||
-ngx_palloc_block(ngx_pool_t *pool, size_t size)
|
||||
+void *
|
||||
+ngx_malloc(ngx_pool_t *pool, size_t size)
|
||||
{
|
||||
- u_char *m;
|
||||
- size_t psize;
|
||||
- ngx_pool_t *p, *new, *current;
|
||||
+ ngx_pool_data_t *new;
|
||||
+ void *m;
|
||||
|
||||
- psize = (size_t) (pool->d.end - (u_char *) pool);
|
||||
-
|
||||
- m = ngx_memalign(NGX_POOL_ALIGNMENT, psize, pool->log);
|
||||
+ m = ngx_alloc(size, pool->log);
|
||||
if (m == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
- new = (ngx_pool_t *) m;
|
||||
-
|
||||
- new->d.end = m + psize;
|
||||
- new->d.next = NULL;
|
||||
- new->d.failed = 0;
|
||||
-
|
||||
- m += sizeof(ngx_pool_data_t);
|
||||
- m = ngx_align_ptr(m, NGX_ALIGNMENT);
|
||||
- new->d.last = m + size;
|
||||
-
|
||||
- current = pool->current;
|
||||
-
|
||||
- for (p = current; p->d.next; p = p->d.next) {
|
||||
- if (p->d.failed++ > 4) {
|
||||
- current = p->d.next;
|
||||
- }
|
||||
+ new = ngx_alloc(sizeof(ngx_pool_data_t), pool->log);
|
||||
+ if (new == NULL){
|
||||
+ ngx_free(m);
|
||||
+ return NULL;
|
||||
}
|
||||
|
||||
- p->d.next = new;
|
||||
-
|
||||
- pool->current = current ? current : new;
|
||||
-
|
||||
+ new->alloc = m;
|
||||
+ new->next = pool->d;
|
||||
+ pool->d = new;
|
||||
return m;
|
||||
}
|
||||
|
||||
|
||||
-static void *
|
||||
-ngx_palloc_large(ngx_pool_t *pool, size_t size)
|
||||
+void *
|
||||
+ngx_palloc(ngx_pool_t *pool, size_t size)
|
||||
{
|
||||
- void *p;
|
||||
- ngx_uint_t n;
|
||||
- ngx_pool_large_t *large;
|
||||
-
|
||||
- p = ngx_alloc(size, pool->log);
|
||||
- if (p == NULL) {
|
||||
- return NULL;
|
||||
- }
|
||||
-
|
||||
- n = 0;
|
||||
-
|
||||
- for (large = pool->large; large; large = large->next) {
|
||||
- if (large->alloc == NULL) {
|
||||
- large->alloc = p;
|
||||
- return p;
|
||||
- }
|
||||
-
|
||||
- if (n++ > 3) {
|
||||
- break;
|
||||
- }
|
||||
- }
|
||||
-
|
||||
- large = ngx_palloc(pool, sizeof(ngx_pool_large_t));
|
||||
- if (large == NULL) {
|
||||
- ngx_free(p);
|
||||
- return NULL;
|
||||
- }
|
||||
+ return ngx_malloc(pool, size);
|
||||
+}
|
||||
|
||||
- large->alloc = p;
|
||||
- large->next = pool->large;
|
||||
- pool->large = large;
|
||||
|
||||
- return p;
|
||||
+void *
|
||||
+ngx_pnalloc(ngx_pool_t *pool, size_t size)
|
||||
+{
|
||||
+ return ngx_malloc(pool, size);
|
||||
}
|
||||
|
||||
|
||||
@@ -263,7 +159,7 @@
|
||||
return NULL;
|
||||
}
|
||||
|
||||
- large = ngx_palloc(pool, sizeof(ngx_pool_large_t));
|
||||
+ large = ngx_malloc(pool, sizeof(ngx_pool_large_t));
|
||||
if (large == NULL) {
|
||||
ngx_free(p);
|
||||
return NULL;
|
||||
@@ -278,16 +174,27 @@
|
||||
|
||||
|
||||
ngx_int_t
|
||||
-ngx_pfree(ngx_pool_t *pool, void *p)
|
||||
+ngx_pfree(ngx_pool_t *pool, void *data)
|
||||
{
|
||||
- ngx_pool_large_t *l;
|
||||
+ ngx_pool_data_t *p, *d;
|
||||
|
||||
- for (l = pool->large; l; l = l->next) {
|
||||
- if (p == l->alloc) {
|
||||
- ngx_log_debug1(NGX_LOG_DEBUG_ALLOC, pool->log, 0,
|
||||
- "free: %p", l->alloc);
|
||||
- ngx_free(l->alloc);
|
||||
- l->alloc = NULL;
|
||||
+ p = NULL;
|
||||
+ for (d = pool->d; d; p = d, d = d->next) {
|
||||
+ if (data == d->alloc) {
|
||||
+
|
||||
+ ngx_log_debug1(NGX_LOG_DEBUG_ALLOC, pool->log, 0, "free: %p", d->alloc);
|
||||
+
|
||||
+ ngx_free(d->alloc);
|
||||
+ d->alloc = NULL;
|
||||
+
|
||||
+ if (p) {
|
||||
+ p->next = d->next;
|
||||
+
|
||||
+ } else {
|
||||
+ pool->d = d->next;
|
||||
+ }
|
||||
+
|
||||
+ ngx_free(d);
|
||||
|
||||
return NGX_OK;
|
||||
}
|
||||
diff -urx '*~' -x '*.swp' nginx-1.0.15/src/core/ngx_palloc.h nginx-1.0.15-patched/src/core/ngx_palloc.h
|
||||
--- nginx-1.0.15/src/core/ngx_palloc.h 2012-02-06 04:02:59.000000000 +0800
|
||||
+++ nginx-1.0.15-patched/src/core/ngx_palloc.h 2012-06-04 19:39:32.803578356 +0800
|
||||
@@ -39,6 +39,8 @@
|
||||
|
||||
|
||||
typedef struct ngx_pool_large_s ngx_pool_large_t;
|
||||
+typedef struct ngx_pool_data_s ngx_pool_data_t;
|
||||
+
|
||||
|
||||
struct ngx_pool_large_s {
|
||||
ngx_pool_large_t *next;
|
||||
@@ -46,16 +48,14 @@
|
||||
};
|
||||
|
||||
|
||||
-typedef struct {
|
||||
- u_char *last;
|
||||
- u_char *end;
|
||||
- ngx_pool_t *next;
|
||||
- ngx_uint_t failed;
|
||||
-} ngx_pool_data_t;
|
||||
+struct ngx_pool_data_s {
|
||||
+ ngx_pool_data_t *next;
|
||||
+ void *alloc;
|
||||
+};
|
||||
|
||||
|
||||
struct ngx_pool_s {
|
||||
- ngx_pool_data_t d;
|
||||
+ ngx_pool_data_t *d;
|
||||
size_t max;
|
||||
ngx_pool_t *current;
|
||||
ngx_chain_t *chain;
|
113
patches/nginx-1.0.15-null_character_fixes.patch
Normal file
113
patches/nginx-1.0.15-null_character_fixes.patch
Normal file
@ -0,0 +1,113 @@
|
||||
--- src/http/modules/ngx_http_fastcgi_module.c
|
||||
+++ src/http/modules/ngx_http_fastcgi_module.c
|
||||
@@ -1501,10 +1501,10 @@ ngx_http_fastcgi_process_header(ngx_http
|
||||
h->lowcase_key = h->key.data + h->key.len + 1
|
||||
+ h->value.len + 1;
|
||||
|
||||
- ngx_cpystrn(h->key.data, r->header_name_start,
|
||||
- h->key.len + 1);
|
||||
- ngx_cpystrn(h->value.data, r->header_start,
|
||||
- h->value.len + 1);
|
||||
+ ngx_memcpy(h->key.data, r->header_name_start, h->key.len);
|
||||
+ h->key.data[h->key.len] = '\0';
|
||||
+ ngx_memcpy(h->value.data, r->header_start, h->value.len);
|
||||
+ h->value.data[h->value.len] = '\0';
|
||||
}
|
||||
|
||||
h->hash = r->header_hash;
|
||||
--- src/http/modules/ngx_http_proxy_module.c
|
||||
+++ src/http/modules/ngx_http_proxy_module.c
|
||||
@@ -1381,8 +1381,10 @@ ngx_http_proxy_process_header(ngx_http_r
|
||||
h->value.data = h->key.data + h->key.len + 1;
|
||||
h->lowcase_key = h->key.data + h->key.len + 1 + h->value.len + 1;
|
||||
|
||||
- ngx_cpystrn(h->key.data, r->header_name_start, h->key.len + 1);
|
||||
- ngx_cpystrn(h->value.data, r->header_start, h->value.len + 1);
|
||||
+ ngx_memcpy(h->key.data, r->header_name_start, h->key.len);
|
||||
+ h->key.data[h->key.len] = '\0';
|
||||
+ ngx_memcpy(h->value.data, r->header_start, h->value.len);
|
||||
+ h->value.data[h->value.len] = '\0';
|
||||
|
||||
if (h->key.len == r->lowcase_index) {
|
||||
ngx_memcpy(h->lowcase_key, r->lowcase_header, h->key.len);
|
||||
--- src/http/modules/ngx_http_scgi_module.c
|
||||
+++ src/http/modules/ngx_http_scgi_module.c
|
||||
@@ -941,8 +941,10 @@ ngx_http_scgi_process_header(ngx_http_re
|
||||
h->value.data = h->key.data + h->key.len + 1;
|
||||
h->lowcase_key = h->key.data + h->key.len + 1 + h->value.len + 1;
|
||||
|
||||
- ngx_cpystrn(h->key.data, r->header_name_start, h->key.len + 1);
|
||||
- ngx_cpystrn(h->value.data, r->header_start, h->value.len + 1);
|
||||
+ ngx_memcpy(h->key.data, r->header_name_start, h->key.len);
|
||||
+ h->key.data[h->key.len] = '\0';
|
||||
+ ngx_memcpy(h->value.data, r->header_start, h->value.len);
|
||||
+ h->value.data[h->value.len] = '\0';
|
||||
|
||||
if (h->key.len == r->lowcase_index) {
|
||||
ngx_memcpy(h->lowcase_key, r->lowcase_header, h->key.len);
|
||||
--- src/http/modules/ngx_http_uwsgi_module.c
|
||||
+++ src/http/modules/ngx_http_uwsgi_module.c
|
||||
@@ -985,8 +985,10 @@ ngx_http_uwsgi_process_header(ngx_http_r
|
||||
h->value.data = h->key.data + h->key.len + 1;
|
||||
h->lowcase_key = h->key.data + h->key.len + 1 + h->value.len + 1;
|
||||
|
||||
- ngx_cpystrn(h->key.data, r->header_name_start, h->key.len + 1);
|
||||
- ngx_cpystrn(h->value.data, r->header_start, h->value.len + 1);
|
||||
+ ngx_memcpy(h->key.data, r->header_name_start, h->key.len);
|
||||
+ h->key.data[h->key.len] = '\0';
|
||||
+ ngx_memcpy(h->value.data, r->header_start, h->value.len);
|
||||
+ h->value.data[h->value.len] = '\0';
|
||||
|
||||
if (h->key.len == r->lowcase_index) {
|
||||
ngx_memcpy(h->lowcase_key, r->lowcase_header, h->key.len);
|
||||
--- src/http/ngx_http_parse.c
|
||||
+++ src/http/ngx_http_parse.c
|
||||
@@ -874,6 +874,10 @@ ngx_http_parse_header_line(ngx_http_requ
|
||||
break;
|
||||
}
|
||||
|
||||
+ if (ch == '\0') {
|
||||
+ return NGX_HTTP_PARSE_INVALID_HEADER;
|
||||
+ }
|
||||
+
|
||||
r->invalid_header = 1;
|
||||
|
||||
break;
|
||||
@@ -936,6 +940,10 @@ ngx_http_parse_header_line(ngx_http_requ
|
||||
break;
|
||||
}
|
||||
|
||||
+ if (ch == '\0') {
|
||||
+ return NGX_HTTP_PARSE_INVALID_HEADER;
|
||||
+ }
|
||||
+
|
||||
r->invalid_header = 1;
|
||||
|
||||
break;
|
||||
@@ -954,6 +962,8 @@ ngx_http_parse_header_line(ngx_http_requ
|
||||
r->header_start = p;
|
||||
r->header_end = p;
|
||||
goto done;
|
||||
+ case '\0':
|
||||
+ return NGX_HTTP_PARSE_INVALID_HEADER;
|
||||
default:
|
||||
r->header_start = p;
|
||||
state = sw_value;
|
||||
@@ -975,6 +985,8 @@ ngx_http_parse_header_line(ngx_http_requ
|
||||
case LF:
|
||||
r->header_end = p;
|
||||
goto done;
|
||||
+ case '\0':
|
||||
+ return NGX_HTTP_PARSE_INVALID_HEADER;
|
||||
}
|
||||
break;
|
||||
|
||||
@@ -988,6 +1000,8 @@ ngx_http_parse_header_line(ngx_http_requ
|
||||
break;
|
||||
case LF:
|
||||
goto done;
|
||||
+ case '\0':
|
||||
+ return NGX_HTTP_PARSE_INVALID_HEADER;
|
||||
default:
|
||||
state = sw_value;
|
||||
break;
|
20
patches/nginx-1.0.15-poll_del_event_at_exit.patch
Normal file
20
patches/nginx-1.0.15-poll_del_event_at_exit.patch
Normal file
@ -0,0 +1,20 @@
|
||||
--- nginx-1.0.15/src/os/unix/ngx_process_cycle.c 2012-02-06 04:02:59.000000000 +0800
|
||||
+++ nginx-1.0.15-patched/src/os/unix/ngx_process_cycle.c 2012-06-15 11:39:11.234286287 +0800
|
||||
@@ -707,6 +707,8 @@
|
||||
ngx_exit_log.file = &ngx_exit_log_file;
|
||||
|
||||
ngx_exit_cycle.log = &ngx_exit_log;
|
||||
+ ngx_exit_cycle.files = ngx_cycle->files;
|
||||
+ ngx_exit_cycle.files_n = ngx_cycle->files_n;
|
||||
ngx_cycle = &ngx_exit_cycle;
|
||||
|
||||
ngx_destroy_pool(cycle->pool);
|
||||
@@ -1063,6 +1065,8 @@
|
||||
ngx_exit_log.file = &ngx_exit_log_file;
|
||||
|
||||
ngx_exit_cycle.log = &ngx_exit_log;
|
||||
+ ngx_exit_cycle.files = ngx_cycle->files;
|
||||
+ ngx_exit_cycle.files_n = ngx_cycle->files_n;
|
||||
ngx_cycle = &ngx_exit_cycle;
|
||||
|
||||
ngx_destroy_pool(cycle->pool);
|
27
patches/nginx-1.0.15-request_body_in_single_buf.patch
Normal file
27
patches/nginx-1.0.15-request_body_in_single_buf.patch
Normal file
@ -0,0 +1,27 @@
|
||||
# HG changeset patch
|
||||
# User Maxim Dounin <mdounin@mdounin.ru>
|
||||
# Date 1309799136 -14400
|
||||
# Node ID 99e276bba8596bc4df9e638482ee413f4c6bf700
|
||||
# Parent e7b2f945d55ae44a2295facf9e3336dc4633e5b5
|
||||
Core: fix body with request_body_in_single_buf.
|
||||
|
||||
If there were preread data and request body was big enough first part
|
||||
of request body was duplicated.
|
||||
|
||||
See report here:
|
||||
http://nginx.org/pipermail/nginx/2011-July/027756.html
|
||||
|
||||
diff --git a/src/http/ngx_http_request_body.c b/src/http/ngx_http_request_body.c
|
||||
--- a/src/http/ngx_http_request_body.c
|
||||
+++ b/src/http/ngx_http_request_body.c
|
||||
@@ -372,7 +372,9 @@ ngx_http_do_read_client_request_body(ngx
|
||||
}
|
||||
}
|
||||
|
||||
- if (r->request_body_in_file_only && rb->bufs->next) {
|
||||
+ if (rb->bufs->next
|
||||
+ && (r->request_body_in_file_only || r->request_body_in_single_buf))
|
||||
+ {
|
||||
rb->bufs = rb->bufs->next;
|
||||
}
|
||||
|
17
patches/nginx-1.0.15-request_body_preread_fix.patch
Normal file
17
patches/nginx-1.0.15-request_body_preread_fix.patch
Normal file
@ -0,0 +1,17 @@
|
||||
# HG changeset patch
|
||||
# User Maxim Dounin <mdounin@mdounin.ru>
|
||||
# Date 1309776931 -14400
|
||||
# Node ID e7b2f945d55ae44a2295facf9e3336dc4633e5b5
|
||||
# Parent 610e909bb9e29766188aa86fae3abe0bd3432940
|
||||
Core: fix body if it's preread and there are extra data.
|
||||
|
||||
--- nginx-1.0.15/src/http/ngx_http_request_body.c 2011-07-05 12:11:21.619264633 +0800
|
||||
+++ nginx-1.0.15-patched/src/http/ngx_http_request_body.c 2011-07-05 12:14:30.694321554 +0800
|
||||
@@ -141,6 +141,7 @@
|
||||
|
||||
/* the whole request body was pre-read */
|
||||
|
||||
+ b->last = b->pos + r->headers_in.content_length_n;
|
||||
r->header_in->pos += (size_t) r->headers_in.content_length_n;
|
||||
r->request_length += r->headers_in.content_length_n;
|
||||
|
@ -0,0 +1,11 @@
|
||||
--- nginx-1.0.15/src/http/ngx_http_core_module.c 2012-03-05 21:03:39.000000000 +0800
|
||||
+++ nginx-1.0.15-patched/src/http/ngx_http_core_module.c 2012-05-02 21:57:40.624937882 +0800
|
||||
@@ -2567,6 +2567,8 @@
|
||||
|
||||
r->phase_handler = cmcf->phase_engine.location_rewrite_index;
|
||||
|
||||
+ r->write_event_handler = ngx_http_core_run_phases;
|
||||
+
|
||||
ngx_http_core_run_phases(r);
|
||||
|
||||
return NGX_DONE;
|
11
patches/nginx-1.0.15-resolver_debug_log_overflow.patch
Normal file
11
patches/nginx-1.0.15-resolver_debug_log_overflow.patch
Normal file
@ -0,0 +1,11 @@
|
||||
--- nginx-1.0.15/src/core/ngx_resolver.c 2012-03-05 21:17:56.000000000 +0800
|
||||
+++ nginx-1.0.15-patched/src/core/ngx_resolver.c 2012-06-01 17:55:55.861130605 +0800
|
||||
@@ -987,7 +987,7 @@
|
||||
nan = (query->nan_hi << 8) + query->nan_lo;
|
||||
|
||||
ngx_log_debug6(NGX_LOG_DEBUG_CORE, r->log, 0,
|
||||
- "resolver DNS response %ui fl:%04Xui %ui/%ui/%ui/%ui",
|
||||
+ "resolver DNS response %ui fl:%04Xui %ui/%ui/%ud/%ud",
|
||||
ident, flags, nqs, nan,
|
||||
(query->nns_hi << 8) + query->nns_lo,
|
||||
(query->nar_hi << 8) + query->nar_lo);
|
26
patches/nginx-1.0.15-server_header.patch
Normal file
26
patches/nginx-1.0.15-server_header.patch
Normal file
@ -0,0 +1,26 @@
|
||||
diff -ur lz-nginx-1.0.15/nginx-1.0.15/src/core/nginx.h lz-nginx-1.0.15-patched/nginx-1.0.15/src/core/nginx.h
|
||||
--- lz-nginx-1.0.15/nginx-1.0.15/src/core/nginx.h 2010-02-12 17:31:01.000000000 +0800
|
||||
+++ lz-nginx-1.0.15-patched/nginx-1.0.15/src/core/nginx.h 2010-03-30 10:52:13.240702627 +0800
|
||||
@@ -10,7 +10,7 @@
|
||||
|
||||
#define nginx_version 1000015
|
||||
#define NGINX_VERSION "1.0.15"
|
||||
-#define NGINX_VER "nginx/" NGINX_VERSION
|
||||
+#define NGINX_VER "ngx_openresty/" NGINX_VERSION ".unknown"
|
||||
|
||||
#define NGINX_VAR "NGINX"
|
||||
#define NGX_OLDPID_EXT ".oldbin"
|
||||
Only in lz-nginx-1.0.15-patched/nginx-1.0.15/src/core: nginx.h.orig
|
||||
Only in lz-nginx-1.0.15-patched/nginx-1.0.15/src/core: nginx.h.rej
|
||||
diff -ur lz-nginx-1.0.15/nginx-1.0.15/src/http/ngx_http_header_filter_module.c lz-nginx-1.0.15-patched/nginx-1.0.15/src/http/ngx_http_header_filter_module.c
|
||||
--- lz-nginx-1.0.15/nginx-1.0.15/src/http/ngx_http_header_filter_module.c 2010-03-03 23:14:04.000000000 +0800
|
||||
+++ lz-nginx-1.0.15-patched/nginx-1.0.15/src/http/ngx_http_header_filter_module.c 2010-03-30 10:52:53.670909405 +0800
|
||||
@@ -45,7 +45,7 @@
|
||||
};
|
||||
|
||||
|
||||
-static char ngx_http_server_string[] = "Server: nginx" CRLF;
|
||||
+static char ngx_http_server_string[] = "Server: ngx_openresty" CRLF;
|
||||
static char ngx_http_server_full_string[] = "Server: " NGINX_VER CRLF;
|
||||
|
||||
|
40
patches/nginx-1.0.15-subrequest_loop.patch
Normal file
40
patches/nginx-1.0.15-subrequest_loop.patch
Normal file
@ -0,0 +1,40 @@
|
||||
# HG changeset patch
|
||||
# User Maxim Dounin <mdounin@mdounin.ru>
|
||||
# Date 1309187571 -14400
|
||||
# Node ID 283a416b2235d5383c12a975edc8866f007fb628
|
||||
# Parent f5fc40783ddcbf4db33859ee2a9bce54cf32c350
|
||||
Core: protect from subrequest loops.
|
||||
|
||||
Without protection subrequest loop results in r->count overflow and
|
||||
SIGSEGV. Protection was broken in 0.7.25.
|
||||
|
||||
Note that this also limits number of parallel subrequests. This
|
||||
wasn't exactly the case before 0.7.25 as local subrequests were
|
||||
completed directly.
|
||||
|
||||
See here for details:
|
||||
|
||||
http://nginx.org/pipermail/nginx-ru/2010-February/032184.html
|
||||
|
||||
diff --git a/src/http/ngx_http_core_module.c b/src/http/ngx_http_core_module.c
|
||||
--- a/src/http/ngx_http_core_module.c
|
||||
+++ b/src/http/ngx_http_core_module.c
|
||||
@@ -2287,7 +2287,6 @@ ngx_http_subrequest(ngx_http_request_t *
|
||||
sr->start_sec = tp->sec;
|
||||
sr->start_msec = tp->msec;
|
||||
|
||||
- r->main->subrequests++;
|
||||
r->main->count++;
|
||||
|
||||
*psr = sr;
|
||||
diff --git a/src/http/ngx_http_request.c b/src/http/ngx_http_request.c
|
||||
--- a/src/http/ngx_http_request.c
|
||||
+++ b/src/http/ngx_http_request.c
|
||||
@@ -1981,6 +1981,7 @@ ngx_http_finalize_request(ngx_http_reque
|
||||
if (r == c->data) {
|
||||
|
||||
r->main->count--;
|
||||
+ r->main->subrequests++;
|
||||
|
||||
if (!r->logged) {
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user