mirror of
https://github.com/openresty/openresty.git
synced 2024-10-13 00:29:41 +00:00
Compare commits
774 Commits
Author | SHA1 | Date | |
---|---|---|---|
753ef7074b | |||
8c6b0f77af | |||
52962f3fc9 | |||
0e31ce1662 | |||
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 |
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
|
5
.gitignore
vendored
5
.gitignore
vendored
@ -2,6 +2,7 @@
|
||||
bin/openresty.fcgi
|
||||
demo/Admin/.rsync
|
||||
*~
|
||||
*.swo
|
||||
*.json
|
||||
*.o
|
||||
*.hi
|
||||
@ -65,7 +66,11 @@ util/blog-rows.sql
|
||||
util/comments.sql
|
||||
util/posts.sql
|
||||
ngx_openresty-*
|
||||
openresty-*
|
||||
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
|
4
Makefile
4
Makefile
@ -7,8 +7,8 @@ test: all
|
||||
prove -r t
|
||||
|
||||
try-luajit: all
|
||||
cd ngx_openresty-`./util/ver` && ./configure --with-luajit
|
||||
cd openresty-`./util/ver` && ./configure --with-luajit
|
||||
|
||||
try-lua: all
|
||||
cd ngx_openresty-`./util/ver` && ./configure && $(MAKE)
|
||||
cd openresty-`./util/ver` && ./configure && $(MAKE)
|
||||
|
||||
|
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 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
|
||||
====
|
||||
|
||||
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
|
||||
===========
|
||||
|
||||
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/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/openresty/openresty/issues
|
||||
|
||||
[Back to TOC](#table-of-contents)
|
||||
|
||||
Copyright & License
|
||||
===================
|
||||
|
||||
The bundle itself is licensed under the 2-clause BSD license.
|
||||
|
||||
Copyright (c) 2011-2016, 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)
|
||||
|
@ -73,7 +73,7 @@
|
||||
<a href="site-binary.tar.gz">Compiled form (.tar.gz)</a>
|
||||
</li>
|
||||
<li class="module-list-item">
|
||||
<a target="_blank" href="http://github.com/agentzh/ngx_openresty/tree/master/demo/[% blog_owner == 'agentzh' ? "Blog" : "Blog2" %]/">
|
||||
<a target="_blank" href="http://github.com/openresty/openresty/tree/master/demo/[% blog_owner == 'agentzh' ? "Blog" : "Blog2" %]/">
|
||||
Source code (Git)
|
||||
</a>
|
||||
</li>
|
||||
|
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/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/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.
|
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
|
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!
|
@ -1,21 +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-07 18:07:04.764111952 +0800
|
||||
@@ -681,6 +681,18 @@
|
||||
|
||||
+++ 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 (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 ((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;
|
||||
|
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) {
|
||||
|
32
patches/nginx-1.0.15-upstream_pipelining.patch
Normal file
32
patches/nginx-1.0.15-upstream_pipelining.patch
Normal file
@ -0,0 +1,32 @@
|
||||
diff -ur nginx-1.0.15/src/http/ngx_http_upstream.c nginx-1.0.15-patched/src/http/ngx_http_upstream.c
|
||||
--- nginx-1.0.15/src/http/ngx_http_upstream.c 2011-12-14 02:34:34.000000000 +0800
|
||||
+++ nginx-1.0.15-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.15/src/http/ngx_http_upstream.h nginx-1.0.15-patched/src/http/ngx_http_upstream.h
|
||||
--- nginx-1.0.15/src/http/ngx_http_upstream.h 2011-11-01 22:18:10.000000000 +0800
|
||||
+++ nginx-1.0.15-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.15-variable_header_ignore_no_hash.patch
Normal file
73
patches/nginx-1.0.15-variable_header_ignore_no_hash.patch
Normal file
@ -0,0 +1,73 @@
|
||||
--- nginx-1.0.15/src/http/ngx_http_variables.c 2011-05-30 20:36:17.000000000 +0800
|
||||
+++ nginx-1.0.15-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.1.15-allow_request_body_updating.patch
Normal file
117
patches/nginx-1.1.15-allow_request_body_updating.patch
Normal file
@ -0,0 +1,117 @@
|
||||
diff -ur nginx-1.1.15/src/http/ngx_http_request_body.c nginx-1.1.15-patched/src/http/ngx_http_request_body.c
|
||||
--- nginx-1.1.15/src/http/ngx_http_request_body.c 2011-09-30 22:36:19.000000000 +0800
|
||||
+++ nginx-1.1.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;
|
||||
}
|
||||
}
|
||||
|
||||
Only in nginx-1.1.15-patched/src/http: ngx_http_request_body.c~
|
||||
diff -ur nginx-1.1.15/src/http/ngx_http_request.c nginx-1.1.15-patched/src/http/ngx_http_request.c
|
||||
--- nginx-1.1.15/src/http/ngx_http_request.c 2011-09-30 22:36:19.000000000 +0800
|
||||
+++ nginx-1.1.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;
|
||||
}
|
||||
|
||||
Only in nginx-1.1.15-patched/src/http: ngx_http_request.c~
|
||||
diff -ur nginx-1.1.15/src/http/ngx_http_request.h nginx-1.1.15-patched/src/http/ngx_http_request.h
|
||||
--- nginx-1.1.15/src/http/ngx_http_request.h 2011-08-29 18:39:23.000000000 +0800
|
||||
+++ nginx-1.1.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;
|
||||
|
||||
Only in nginx-1.1.15-patched/src/http: ngx_http_request.h~
|
||||
Only in nginx-1.1.15-patched/src/http: tags
|
69
patches/nginx-1.1.15-gzip_empty_flush_buf.patch
Normal file
69
patches/nginx-1.1.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.1.15-log_escape_non_ascii.patch
Normal file
115
patches/nginx-1.1.15-log_escape_non_ascii.patch
Normal file
@ -0,0 +1,115 @@
|
||||
--- nginx-1.1.15/src/http/modules/ngx_http_log_module.c 2011-11-01 21:24:50.000000000 +0800
|
||||
+++ nginx-1.1.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;
|
12
patches/nginx-1.1.15-named_location_clear_mods_ctx.patch
Normal file
12
patches/nginx-1.1.15-named_location_clear_mods_ctx.patch
Normal file
@ -0,0 +1,12 @@
|
||||
--- nginx-1.1.15/src/http/ngx_http_core_module.c 2011-09-27 19:14:02.000000000 +0800
|
||||
+++ nginx-1.1.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.1.15-no_Werror.patch
Normal file
24
patches/nginx-1.1.15-no_Werror.patch
Normal file
@ -0,0 +1,24 @@
|
||||
diff -ur nginx-1.1.15/auto/cc/gcc nginx-1.1.15-patched/auto/cc/gcc
|
||||
--- nginx-1.1.15/auto/cc/gcc 2011-06-27 19:53:00.205737804 +0800
|
||||
+++ nginx-1.1.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.1.15/auto/cc/icc nginx-1.1.15-patched/auto/cc/icc
|
||||
--- nginx-1.1.15/auto/cc/icc 2011-06-27 19:52:56.370157068 +0800
|
||||
+++ nginx-1.1.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.1.15-no_error_pages.patch
Normal file
90
patches/nginx-1.1.15-no_error_pages.patch
Normal file
@ -0,0 +1,90 @@
|
||||
--- nginx-1.1.15/src/http/ngx_http_core_module.c 2010-12-14 18:38:42.000000000 +0800
|
||||
+++ nginx-1.1.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;
|
504
patches/nginx-1.1.15-no_pool.patch
Normal file
504
patches/nginx-1.1.15-no_pool.patch
Normal file
@ -0,0 +1,504 @@
|
||||
diff -ur nginx-1.1.15/src/core/nginx.h nginx-1.1.15-patched/src/core/nginx.h
|
||||
--- nginx-1.1.15/src/core/nginx.h 2011-08-29 17:30:22.000000000 +0800
|
||||
+++ nginx-1.1.15-patched/src/core/nginx.h 2011-09-13 12:11:03.135622101 +0800
|
||||
@@ -10,7 +10,7 @@
|
||||
|
||||
|
||||
#define nginx_version 1001015
|
||||
#define NGINX_VERSION "1.1.15"
|
||||
-#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.1.15/src/core/ngx_array.c nginx-1.1.15-patched/src/core/ngx_array.c
|
||||
--- nginx-1.1.15/src/core/ngx_array.c 2008-06-17 23:00:30.000000000 +0800
|
||||
+++ nginx-1.1.15-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.1.15/src/core/ngx_palloc.c nginx-1.1.15-patched/src/core/ngx_palloc.c
|
||||
--- nginx-1.1.15/src/core/ngx_palloc.c 2009-12-17 20:25:46.000000000 +0800
|
||||
+++ nginx-1.1.15-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.1.15/src/core/ngx_palloc.h nginx-1.1.15-patched/src/core/ngx_palloc.h
|
||||
--- nginx-1.1.15/src/core/ngx_palloc.h 2009-12-17 20:25:46.000000000 +0800
|
||||
+++ nginx-1.1.15-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;
|
26
patches/nginx-1.1.15-server_header.patch
Normal file
26
patches/nginx-1.1.15-server_header.patch
Normal file
@ -0,0 +1,26 @@
|
||||
diff -ur lz-nginx-1.1.15/nginx-1.1.15/src/core/nginx.h lz-nginx-1.1.15-patched/nginx-1.1.15/src/core/nginx.h
|
||||
--- lz-nginx-1.1.15/nginx-1.1.15/src/core/nginx.h 2010-02-12 17:31:01.000000000 +0800
|
||||
+++ lz-nginx-1.1.15-patched/nginx-1.1.15/src/core/nginx.h 2010-03-30 10:52:13.240702627 +0800
|
||||
@@ -10,7 +10,7 @@
|
||||
|
||||
#define nginx_version 1001015
|
||||
#define NGINX_VERSION "1.1.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.1.15-patched/nginx-1.1.15/src/core: nginx.h.orig
|
||||
Only in lz-nginx-1.1.15-patched/nginx-1.1.15/src/core: nginx.h.rej
|
||||
diff -ur lz-nginx-1.1.15/nginx-1.1.15/src/http/ngx_http_header_filter_module.c lz-nginx-1.1.15-patched/nginx-1.1.15/src/http/ngx_http_header_filter_module.c
|
||||
--- lz-nginx-1.1.15/nginx-1.1.15/src/http/ngx_http_header_filter_module.c 2010-03-03 23:14:04.000000000 +0800
|
||||
+++ lz-nginx-1.1.15-patched/nginx-1.1.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.1.15-subrequest_loop.patch
Normal file
40
patches/nginx-1.1.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) {
|
||||
|
26
patches/nginx-1.2.1-add_core_vars_polluting_globals.patch
Normal file
26
patches/nginx-1.2.1-add_core_vars_polluting_globals.patch
Normal file
@ -0,0 +1,26 @@
|
||||
--- nginx-1.2.1/src/http/ngx_http_variables.c 2012-03-05 20:36:51.000000000 +0800
|
||||
+++ nginx-1.2.1-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) {
|
128
patches/nginx-1.2.1-allow_request_body_updating.patch
Normal file
128
patches/nginx-1.2.1-allow_request_body_updating.patch
Normal file
@ -0,0 +1,128 @@
|
||||
diff '--exclude=*~' -ur nginx-1.2.1/src/http/ngx_http_core_module.c nginx-1.2.1-patched/src/http/ngx_http_core_module.c
|
||||
--- nginx-1.2.1/src/http/ngx_http_core_module.c 2012-06-04 04:58:12.000000000 -0700
|
||||
+++ nginx-1.2.1-patched/src/http/ngx_http_core_module.c 2012-07-21 12:09:17.468576485 -0700
|
||||
@@ -2420,6 +2420,8 @@
|
||||
|
||||
sr->request_body = r->request_body;
|
||||
|
||||
+ sr->content_length_n = -1;
|
||||
+
|
||||
sr->method = NGX_HTTP_GET;
|
||||
sr->http_version = r->http_version;
|
||||
|
||||
diff '--exclude=*~' -ur nginx-1.2.1/src/http/ngx_http_request_body.c nginx-1.2.1-patched/src/http/ngx_http_request_body.c
|
||||
--- nginx-1.2.1/src/http/ngx_http_request_body.c 2012-04-12 12:35:41.000000000 -0700
|
||||
+++ nginx-1.2.1-patched/src/http/ngx_http_request_body.c 2012-07-21 12:08:30.655376967 -0700
|
||||
@@ -39,7 +39,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;
|
||||
}
|
||||
@@ -441,7 +441,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;
|
||||
}
|
||||
|
||||
@@ -457,20 +457,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;
|
||||
}
|
||||
}
|
||||
@@ -569,7 +571,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;
|
||||
}
|
||||
@@ -578,9 +580,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);
|
||||
|
||||
@@ -597,7 +599,7 @@
|
||||
return NGX_OK;
|
||||
}
|
||||
|
||||
- r->headers_in.content_length_n -= n;
|
||||
+ r->content_length_n -= n;
|
||||
}
|
||||
}
|
||||
|
||||
Only in nginx-1.2.1-patched/src/http: ngx_http_request_body.c.orig
|
||||
diff '--exclude=*~' -ur nginx-1.2.1/src/http/ngx_http_request.c nginx-1.2.1-patched/src/http/ngx_http_request.c
|
||||
--- nginx-1.2.1/src/http/ngx_http_request.c 2012-06-05 06:52:37.000000000 -0700
|
||||
+++ nginx-1.2.1-patched/src/http/ngx_http_request.c 2012-07-21 12:08:30.656376973 -0700
|
||||
@@ -287,6 +287,8 @@
|
||||
|
||||
r->pipeline = hc->pipeline;
|
||||
|
||||
+ r->content_length_n = -1;
|
||||
+
|
||||
if (hc->nbusy) {
|
||||
r->header_in = hc->busy[0];
|
||||
}
|
||||
@@ -298,6 +300,8 @@
|
||||
return;
|
||||
}
|
||||
|
||||
+ r->content_length_n = -1;
|
||||
+
|
||||
hc->request = r;
|
||||
}
|
||||
|
||||
Only in nginx-1.2.1-patched/src/http: ngx_http_request.c.orig
|
||||
diff '--exclude=*~' -ur nginx-1.2.1/src/http/ngx_http_request.h nginx-1.2.1-patched/src/http/ngx_http_request.h
|
||||
--- nginx-1.2.1/src/http/ngx_http_request.h 2012-02-28 06:54:23.000000000 -0800
|
||||
+++ nginx-1.2.1-patched/src/http/ngx_http_request.h 2012-07-21 12:08:30.657376978 -0700
|
||||
@@ -368,6 +368,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.2.1-patched/src/http: ngx_http_request.h.orig
|
904
patches/nginx-1.2.1-dtrace.patch
Normal file
904
patches/nginx-1.2.1-dtrace.patch
Normal file
@ -0,0 +1,904 @@
|
||||
diff --git a/README b/README
|
||||
index 2f68e14..4f2c4a7 100644
|
||||
--- a/README
|
||||
+++ b/README
|
||||
@@ -1,3 +1,40 @@
|
||||
+This is an Nginx fork that adds dtrace USDT probes.
|
||||
|
||||
-Documentation is available at http://nginx.org
|
||||
+This is still under development and not usable yet.
|
||||
+
|
||||
+Installation:
|
||||
+
|
||||
+ ./configure --with-dtrace-probes \
|
||||
+ --with-dtrace=/usr/sbin/dtrace \
|
||||
+ ...
|
||||
+ make
|
||||
+ make install
|
||||
+
|
||||
+Usage on Linux (with systemtap):
|
||||
+
|
||||
+ # make the stap-nginx script visiable in your PATH
|
||||
+ export PATH=/usr/local/nginx/sbin:$PATH
|
||||
+
|
||||
+ # list all the static probes available in your nginx
|
||||
+ stap-nginx -L 'process("nginx").mark("*")'
|
||||
+
|
||||
+ # run the test.stp file
|
||||
+ stap-nginx test.stp
|
||||
+
|
||||
+Sample test.stp file:
|
||||
+
|
||||
+ probe begin
|
||||
+ {
|
||||
+ print("Tracing. Hit CTRL-C to stop.\n")
|
||||
+ }
|
||||
+
|
||||
+ probe process("nginx").mark("http-subrequest-start")
|
||||
+ {
|
||||
+ printf("uri: %s?%s\n", ngx_http_req_uri($arg1),
|
||||
+ ngx_http_req_args($arg1))
|
||||
+ }
|
||||
+
|
||||
+For now, only tested on Solaris 11 Express and Fedora Linux 17.
|
||||
+
|
||||
+The original Nginx documentation is available at http://nginx.org
|
||||
|
||||
diff --git a/auto/install b/auto/install
|
||||
index c2c0ade..fe2a2dd 100644
|
||||
--- a/auto/install
|
||||
+++ b/auto/install
|
||||
@@ -16,6 +16,20 @@ END
|
||||
fi
|
||||
|
||||
|
||||
+case ".$NGX_STAP_NGX_PATH" in
|
||||
+ ./*)
|
||||
+ ;;
|
||||
+
|
||||
+ .)
|
||||
+ NGX_STAP_NGX_PATH=$NGX_PREFIX/sbin/stap-nginx
|
||||
+ ;;
|
||||
+
|
||||
+ *)
|
||||
+ NGX_STAP_NGX_PATH=$NGX_PREFIX/$NGX_STAP_NGX_PATH
|
||||
+ ;;
|
||||
+esac
|
||||
+
|
||||
+
|
||||
case ".$NGX_SBIN_PATH" in
|
||||
./*)
|
||||
;;
|
||||
@@ -53,6 +67,16 @@ case ".$NGX_PID_PATH" in
|
||||
esac
|
||||
|
||||
|
||||
+case ".$NGX_TAPSET_PREFIX" in
|
||||
+ ./* | .)
|
||||
+ ;;
|
||||
+
|
||||
+ *)
|
||||
+ NGX_TAPSET_PREFIX=$NGX_PREFIX/$NGX_TAPSET_PREFIX
|
||||
+ ;;
|
||||
+esac
|
||||
+
|
||||
+
|
||||
case ".$NGX_ERROR_LOG_PATH" in
|
||||
./* | .)
|
||||
;;
|
||||
@@ -151,6 +175,36 @@ install: $NGX_OBJS${ngx_dirsep}nginx${ngx_binext} \
|
||||
|| cp -R $NGX_HTML '\$(DESTDIR)$NGX_PREFIX'
|
||||
END
|
||||
|
||||
+if [ $NGX_DTRACE = YES -a $DTRACE_FROM_SYSTEMTAP = YES ]; then
|
||||
+
|
||||
+ ngx_tapset_srcs="$NGX_TAPSET_SRCS"
|
||||
+
|
||||
+ cat << END >> $NGX_MAKEFILE
|
||||
+ test -d '\$(DESTDIR)$NGX_TAPSET_PREFIX' || \
|
||||
+ mkdir -p '\$(DESTDIR)$NGX_TAPSET_PREFIX'
|
||||
+END
|
||||
+
|
||||
+ for ngx_tapset_src in $ngx_tapset_srcs
|
||||
+ do
|
||||
+ ngx_tapset_file=`basename $ngx_tapset_src`
|
||||
+
|
||||
+ cat << END >> $NGX_MAKEFILE
|
||||
+
|
||||
+ sed -e "s|NGX_SBIN_PATH|$NGX_SBIN_PATH|g" $ngx_long_cont \
|
||||
+ $ngx_tapset_src > '\$(DESTDIR)$NGX_TAPSET_PREFIX/$ngx_tapset_file'
|
||||
+END
|
||||
+
|
||||
+ done
|
||||
+
|
||||
+ cat << END >> $NGX_MAKEFILE
|
||||
+
|
||||
+ test -d '\$(DESTDIR)`dirname "$NGX_STAP_NGX_PATH"`' || \
|
||||
+ mkdir -p '\$(DESTDIR)`dirname "$NGX_STAP_NGX_PATH"`'
|
||||
+ cp $NGX_OBJS/stap-nginx '\$(DESTDIR)$NGX_STAP_NGX_PATH'
|
||||
+ chmod 0755 '\$(DESTDIR)$NGX_STAP_NGX_PATH'
|
||||
+END
|
||||
+
|
||||
+fi
|
||||
|
||||
if test -n "$NGX_ERROR_LOG_PATH"; then
|
||||
cat << END >> $NGX_MAKEFILE
|
||||
@@ -162,6 +216,18 @@ END
|
||||
fi
|
||||
|
||||
|
||||
+if [ $NGX_DTRACE = YES ]; then
|
||||
+ cat << END >> $NGX_MAKEFILE
|
||||
+
|
||||
+$NGX_OBJS${ngx_dirsep}stap-nginx: src/dtrace/stap-nginx
|
||||
+ sed -e "s|NGX_TAPSET_PREFIX|$NGX_TAPSET_PREFIX|g" $ngx_long_cont \
|
||||
+ -e "s|NGX_SBIN_DIR|`dirname $NGX_SBIN_PATH`|g" $ngx_long_cont \
|
||||
+ -e "s|NGX_SBIN_PATH|$NGX_SBIN_PATH|g" $ngx_long_cont \
|
||||
+ src/dtrace/stap-nginx > $NGX_OBJS${ngx_dirsep}stap-nginx
|
||||
+END
|
||||
+fi
|
||||
+
|
||||
+
|
||||
# create Makefile
|
||||
|
||||
cat << END >> Makefile
|
||||
diff --git a/auto/make b/auto/make
|
||||
index e7f5490..e1cb37e 100644
|
||||
--- a/auto/make
|
||||
+++ b/auto/make
|
||||
@@ -26,6 +26,9 @@ LINK = $LINK
|
||||
|
||||
END
|
||||
|
||||
+if [ $NGX_DTRACE = YES ]; then
|
||||
+ echo DTRACE = $DTRACE >> $NGX_MAKEFILE
|
||||
+fi
|
||||
|
||||
if test -n "$NGX_PERL_CFLAGS"; then
|
||||
echo NGX_PERL_CFLAGS = $NGX_PERL_CFLAGS >> $NGX_MAKEFILE
|
||||
@@ -177,6 +180,44 @@ ngx_objs=`echo $ngx_all_objs $ngx_modules_obj \
|
||||
| sed -e "s/ *\([^ ][^ ]*\)/$ngx_long_regex_cont\1/g" \
|
||||
-e "s/\//$ngx_regex_dirsep/g"`
|
||||
|
||||
+if [ $NGX_DTRACE = YES ]; then
|
||||
+
|
||||
+ ngx_dtrace_obj=$NGX_OBJS${ngx_dirsep}ngx_dtrace_provider.$ngx_objext
|
||||
+
|
||||
+ ngx_dtrace_h=$NGX_OBJS${ngx_dirsep}ngx_dtrace_provider.h
|
||||
+
|
||||
+ ngx_dtrace_d=$NGX_OBJS${ngx_dirsep}dtrace_providers.d
|
||||
+
|
||||
+ ngx_dtrace_providers=`echo $NGX_DTRACE_PROVIDERS \
|
||||
+ | sed -e "s/ *\([^ ][^ ]*\)/$ngx_long_regex_cont\1/g" \
|
||||
+ -e "s/\//$ngx_regex_dirsep/g"`
|
||||
+
|
||||
+ cat << END >> $NGX_MAKEFILE
|
||||
+
|
||||
+all: $NGX_OBJS${ngx_dirsep}nginx${ngx_binext}
|
||||
+
|
||||
+$ngx_dtrace_d: $ngx_dtrace_providers
|
||||
+ cat $ngx_dtrace_providers > $ngx_dtrace_d
|
||||
+
|
||||
+$ngx_dtrace_h: $ngx_dtrace_d
|
||||
+ \$(DTRACE) -xnolibs -h -o $ngx_dtrace_h -s $ngx_dtrace_d
|
||||
+END
|
||||
+
|
||||
+ if [ $DTRACE_PROBE_OBJ = YES ]; then
|
||||
+ cat << END >> $NGX_MAKEFILE
|
||||
+$ngx_dtrace_obj: $ngx_dtrace_d $ngx_deps$ngx_spacer
|
||||
+ \$(DTRACE) -xnolibs -G -o $ngx_dtrace_obj -s $ngx_dtrace_d $ngx_objs
|
||||
+END
|
||||
+
|
||||
+ ngx_deps="$ngx_deps$ngx_long_cont$ngx_dtrace_obj"
|
||||
+ ngx_objs="$ngx_objs$ngx_long_cont$ngx_dtrace_obj"
|
||||
+
|
||||
+ if [ "$DTRACE_FROM_SYSTEMTAP" = YES ]; then
|
||||
+ ngx_deps="$ngx_deps$ngx_long_cont$NGX_OBJS${ngx_dirsep}stap-nginx"
|
||||
+ fi
|
||||
+ fi
|
||||
+fi
|
||||
+
|
||||
if test -n "$NGX_LD_OPT$CORE_LIBS"; then
|
||||
ngx_libs=`echo $NGX_LD_OPT $CORE_LIBS \
|
||||
| sed -e "s/\//$ngx_regex_dirsep/g" -e "s/^/$ngx_long_regex_cont/"`
|
||||
diff --git a/auto/options b/auto/options
|
||||
index 393be40..9b7494f 100644
|
||||
--- a/auto/options
|
||||
+++ b/auto/options
|
||||
@@ -12,6 +12,8 @@ NGX_CONF_PATH=
|
||||
NGX_ERROR_LOG_PATH=
|
||||
NGX_PID_PATH=
|
||||
NGX_LOCK_PATH=
|
||||
+NGX_TAPSET_PREFIX=
|
||||
+NGX_STAP_NGX_PATH=
|
||||
NGX_USER=
|
||||
NGX_GROUP=
|
||||
|
||||
@@ -20,6 +22,12 @@ CPP=
|
||||
NGX_OBJS=objs
|
||||
|
||||
NGX_DEBUG=NO
|
||||
+NGX_DTRACE=NO
|
||||
+DTRACE=dtrace
|
||||
+
|
||||
+DTRACE_PROBE_OBJ=YES
|
||||
+DTRACE_FROM_SYSTEMTAP=NO
|
||||
+
|
||||
NGX_CC_OPT=
|
||||
NGX_LD_OPT=
|
||||
CPU=NO
|
||||
@@ -169,6 +177,8 @@ do
|
||||
--error-log-path=*) NGX_ERROR_LOG_PATH="$value";;
|
||||
--pid-path=*) NGX_PID_PATH="$value" ;;
|
||||
--lock-path=*) NGX_LOCK_PATH="$value" ;;
|
||||
+ --tapset-prefix=*) NGX_TAPSET_PREFIX="$value" ;;
|
||||
+ --stap-nginx-path=*) NGX_STAP_NGX_PATH="$value" ;;
|
||||
--user=*) NGX_USER="$value" ;;
|
||||
--group=*) NGX_GROUP="$value" ;;
|
||||
|
||||
@@ -272,7 +282,8 @@ use the \"--without-http_limit_conn_module\" option instead"
|
||||
--with-ld-opt=*) NGX_LD_OPT="$value" ;;
|
||||
--with-cpu-opt=*) CPU="$value" ;;
|
||||
--with-debug) NGX_DEBUG=YES ;;
|
||||
-
|
||||
+ --with-dtrace=*) DTRACE="$value" ;;
|
||||
+ --with-dtrace-probes) NGX_DTRACE=YES ;;
|
||||
--without-pcre) USE_PCRE=DISABLED ;;
|
||||
--with-pcre) USE_PCRE=YES ;;
|
||||
--with-pcre=*) PCRE="$value" ;;
|
||||
@@ -326,6 +337,8 @@ cat << END
|
||||
--error-log-path=PATH set error log pathname
|
||||
--pid-path=PATH set nginx.pid pathname
|
||||
--lock-path=PATH set nginx.lock pathname
|
||||
+ --tapset-prefix=PATH set systemtap tapset directory prefix
|
||||
+ --stap-nginx-path=PATH set stap-nginx pathname
|
||||
|
||||
--user=USER set non-privileged user for
|
||||
worker processes
|
||||
@@ -448,6 +461,8 @@ cat << END
|
||||
--with-openssl-opt=OPTIONS set additional build options for OpenSSL
|
||||
|
||||
--with-debug enable debug logging
|
||||
+ --with-dtrace-probes enable dtrace USDT probes
|
||||
+ --with-dtrace=PATH set dtrace utility pathname
|
||||
|
||||
END
|
||||
|
||||
@@ -477,6 +492,7 @@ NGX_CONF_PATH=${NGX_CONF_PATH:-conf/nginx.conf}
|
||||
NGX_CONF_PREFIX=`dirname $NGX_CONF_PATH`
|
||||
NGX_PID_PATH=${NGX_PID_PATH:-logs/nginx.pid}
|
||||
NGX_LOCK_PATH=${NGX_LOCK_PATH:-logs/nginx.lock}
|
||||
+NGX_TAPSET_PREFIX=${NGX_TAPSET_PREFIX:-tapset}
|
||||
|
||||
if [ ".$NGX_ERROR_LOG_PATH" = ".stderr" ]; then
|
||||
NGX_ERROR_LOG_PATH=
|
||||
diff --git a/auto/os/darwin b/auto/os/darwin
|
||||
index 590e036..af33cf3 100644
|
||||
--- a/auto/os/darwin
|
||||
+++ b/auto/os/darwin
|
||||
@@ -114,3 +114,6 @@ ngx_feature_libs=
|
||||
ngx_feature_test="int32_t lock, n;
|
||||
n = OSAtomicCompareAndSwap32Barrier(0, 1, lock)"
|
||||
. auto/feature
|
||||
+
|
||||
+DTRACE_PROBE_OBJ=NO
|
||||
+
|
||||
diff --git a/auto/os/freebsd b/auto/os/freebsd
|
||||
index 6aa823f..ee15166 100644
|
||||
--- a/auto/os/freebsd
|
||||
+++ b/auto/os/freebsd
|
||||
@@ -142,3 +142,8 @@ if [ $version -ge 701000 ]; then
|
||||
echo " + cpuset_setaffinity() found"
|
||||
have=NGX_HAVE_CPUSET_SETAFFINITY . auto/have
|
||||
fi
|
||||
+
|
||||
+if [ $NGX_DTRACE = YES ]; then
|
||||
+ NGX_LD_OPT="$NGX_LD_OPT -lelf"
|
||||
+fi
|
||||
+
|
||||
diff --git a/auto/os/linux b/auto/os/linux
|
||||
index c506d3d..cbbfbf1 100644
|
||||
--- a/auto/os/linux
|
||||
+++ b/auto/os/linux
|
||||
@@ -151,3 +151,5 @@ ngx_include="sys/vfs.h"; . auto/include
|
||||
|
||||
|
||||
CC_AUX_FLAGS="$cc_aux_flags -D_GNU_SOURCE -D_FILE_OFFSET_BITS=64"
|
||||
+
|
||||
+DTRACE_FROM_SYSTEMTAP=YES
|
||||
diff --git a/auto/sources b/auto/sources
|
||||
index 374ad66..72bb1b0 100644
|
||||
--- a/auto/sources
|
||||
+++ b/auto/sources
|
||||
@@ -39,6 +39,11 @@ CORE_DEPS="src/core/nginx.h \
|
||||
src/core/ngx_crypt.h"
|
||||
|
||||
|
||||
+if [ $NGX_DTRACE = YES ]; then
|
||||
+ CORE_DEPS="$CORE_DEPS objs/ngx_dtrace_provider.h"
|
||||
+fi
|
||||
+
|
||||
+
|
||||
CORE_SRCS="src/core/nginx.c \
|
||||
src/core/ngx_log.c \
|
||||
src/core/ngx_palloc.c \
|
||||
@@ -291,7 +296,8 @@ HTTP_DEPS="src/http/ngx_http.h \
|
||||
src/http/ngx_http_script.h \
|
||||
src/http/ngx_http_upstream.h \
|
||||
src/http/ngx_http_upstream_round_robin.h \
|
||||
- src/http/ngx_http_busy_lock.h"
|
||||
+ src/http/ngx_http_busy_lock.h \
|
||||
+ src/http/ngx_http_probe.h"
|
||||
|
||||
HTTP_SRCS="src/http/ngx_http.c \
|
||||
src/http/ngx_http_core_module.c \
|
||||
@@ -524,3 +530,8 @@ NGX_GOOGLE_PERFTOOLS_MODULE=ngx_google_perftools_module
|
||||
NGX_GOOGLE_PERFTOOLS_SRCS=src/misc/ngx_google_perftools_module.c
|
||||
|
||||
NGX_CPP_TEST_SRCS=src/misc/ngx_cpp_test_module.cpp
|
||||
+
|
||||
+NGX_DTRACE_PROVIDERS=src/dtrace/nginx_provider.d
|
||||
+
|
||||
+NGX_TAPSET_SRCS=src/dtrace/nginx.stp
|
||||
+
|
||||
diff --git a/auto/summary b/auto/summary
|
||||
index dcebec9..3cb269e 100644
|
||||
--- a/auto/summary
|
||||
+++ b/auto/summary
|
||||
@@ -92,6 +92,19 @@ else
|
||||
echo " nginx logs errors to stderr"
|
||||
fi
|
||||
|
||||
+if [ $NGX_DTRACE = YES ]; then
|
||||
+ cat << END
|
||||
+ nginx dtrace static probes enabled
|
||||
+END
|
||||
+
|
||||
+ if [ $DTRACE_FROM_SYSTEMTAP = YES ]; then
|
||||
+ cat << END
|
||||
+ nginx systemtap tapset prefix: "$NGX_TAPSET_PREFIX"
|
||||
+ nginx systemtap wrapper script: "$NGX_STAP_NGX_PATH"
|
||||
+END
|
||||
+ fi
|
||||
+fi
|
||||
+
|
||||
cat << END
|
||||
nginx http access log file: "$NGX_HTTP_LOG_PATH"
|
||||
nginx http client request body temporary files: "$NGX_HTTP_CLIENT_TEMP_PATH"
|
||||
diff --git a/configure b/configure
|
||||
index 45ea154..332c011 100755
|
||||
--- a/configure
|
||||
+++ b/configure
|
||||
@@ -20,6 +20,9 @@ if [ $NGX_DEBUG = YES ]; then
|
||||
have=NGX_DEBUG . auto/have
|
||||
fi
|
||||
|
||||
+if [ $NGX_DTRACE = YES ]; then
|
||||
+ have=NGX_DTRACE . auto/have
|
||||
+fi
|
||||
|
||||
if test -z "$NGX_PLATFORM"; then
|
||||
echo "checking for OS"
|
||||
diff --git a/src/dtrace/nginx.stp b/src/dtrace/nginx.stp
|
||||
new file mode 100644
|
||||
index 0000000..fccea2b
|
||||
--- /dev/null
|
||||
+++ b/src/dtrace/nginx.stp
|
||||
@@ -0,0 +1,152 @@
|
||||
+/* tapset for nginx */
|
||||
+
|
||||
+/* retrieve the request uri string from the ngx_http_request_t pointer */
|
||||
+function ngx_http_req_uri(r)
|
||||
+{
|
||||
+ len = @cast(r, "ngx_http_request_s", "NGX_SBIN_PATH")->uri->len
|
||||
+
|
||||
+ if (len == 0) {
|
||||
+ return ""
|
||||
+ }
|
||||
+
|
||||
+ return user_string_n(@cast(r, "ngx_http_request_s", "NGX_SBIN_PATH")->uri->data, len)
|
||||
+}
|
||||
+
|
||||
+
|
||||
+/* retrieve the request query string from the ngx_http_request_t pointer */
|
||||
+function ngx_http_req_args(r)
|
||||
+{
|
||||
+ len = @cast(r, "ngx_http_request_s", "NGX_SBIN_PATH")->args->len
|
||||
+
|
||||
+ if (len == 0) {
|
||||
+ return ""
|
||||
+ }
|
||||
+
|
||||
+ return user_string_n(@cast(r, "ngx_http_request_s", "NGX_SBIN_PATH")->args->data, len)
|
||||
+}
|
||||
+
|
||||
+
|
||||
+/* retrieve the first command name (or directive name) from
|
||||
+ * the ngx_module_t pointer */
|
||||
+function ngx_http_module_cmd(m)
|
||||
+{
|
||||
+ cmds = @cast(m, "ngx_module_t", "NGX_SBIN_PATH")->commands
|
||||
+ if (cmds == 0) {
|
||||
+ return ""
|
||||
+ }
|
||||
+
|
||||
+ len = @cast(cmds, "ngx_command_t", "NGX_SBIN_PATH")->name->len
|
||||
+
|
||||
+ if (len == 0) {
|
||||
+ return ""
|
||||
+ }
|
||||
+
|
||||
+ return user_string_n(@cast(cmds, "ngx_command_t", "NGX_SBIN_PATH")->name->data, len)
|
||||
+}
|
||||
+
|
||||
+
|
||||
+function ngx_chain_buf(cl)
|
||||
+{
|
||||
+ return @cast(cl, "ngx_chain_t", "NGX_SBIN_PATH")->buf
|
||||
+}
|
||||
+
|
||||
+
|
||||
+function ngx_buf_in_memory(b)
|
||||
+{
|
||||
+ return @cast(b, "ngx_buf_t", "NGX_SBIN_PATH")->temporary
|
||||
+ || @cast(b, "ngx_buf_t", "NGX_SBIN_PATH")->memory
|
||||
+ || @cast(b, "ngx_buf_t", "NGX_SBIN_PATH")->mmap
|
||||
+}
|
||||
+
|
||||
+
|
||||
+function ngx_buf_pos(b)
|
||||
+{
|
||||
+ return @cast(b, "ngx_buf_t", "NGX_SBIN_PATH")->pos
|
||||
+}
|
||||
+
|
||||
+
|
||||
+function ngx_buf_file_pos(b)
|
||||
+{
|
||||
+ return @cast(b, "ngx_buf_t", "NGX_SBIN_PATH")->file_pos
|
||||
+}
|
||||
+
|
||||
+
|
||||
+function ngx_buf_last(b)
|
||||
+{
|
||||
+ return @cast(b, "ngx_buf_t", "NGX_SBIN_PATH")->last
|
||||
+}
|
||||
+
|
||||
+
|
||||
+function ngx_buf_file_last(b)
|
||||
+{
|
||||
+ return @cast(b, "ngx_buf_t", "NGX_SBIN_PATH")->file_last
|
||||
+}
|
||||
+
|
||||
+
|
||||
+function ngx_buf_end(b)
|
||||
+{
|
||||
+ return @cast(b, "ngx_buf_t", "NGX_SBIN_PATH")->end
|
||||
+}
|
||||
+
|
||||
+
|
||||
+function ngx_buf_size(b)
|
||||
+{
|
||||
+ if (ngx_buf_in_memory(b)) {
|
||||
+ return ngx_buf_last(b) - ngx_buf_pos(b)
|
||||
+ }
|
||||
+
|
||||
+ return ngx_buf_file_last(b) - ngx_buf_file_pos(b)
|
||||
+}
|
||||
+
|
||||
+
|
||||
+function ngx_buf_data(b)
|
||||
+{
|
||||
+ return user_string_n(ngx_buf_pos(b), ngx_buf_last(b) - ngx_buf_pos(b))
|
||||
+}
|
||||
+
|
||||
+
|
||||
+function ngx_pool_cleanup_file_name(c)
|
||||
+{
|
||||
+ return user_string(@cast(c, "ngx_pool_cleanup_file_t", "NGX_SBIN_PATH")->name)
|
||||
+}
|
||||
+
|
||||
+
|
||||
+function ngx_http_req_content_length(r)
|
||||
+{
|
||||
+ return @cast(r, "ngx_http_request_t", "NGX_SBIN_PATH")->headers_in->content_length_n
|
||||
+}
|
||||
+
|
||||
+
|
||||
+function ngx_http_req_body_temp_file_name(r)
|
||||
+{
|
||||
+ rb = @cast(r, "ngx_http_request_t", "NGX_SBIN_PATH")->request_body
|
||||
+ if (!rb) {
|
||||
+ return ""
|
||||
+ }
|
||||
+
|
||||
+ tf = @cast(rb, "ngx_http_request_body_t", "NGX_SBIN_PATH")->temp_file
|
||||
+ if (!tf) {
|
||||
+ return ""
|
||||
+ }
|
||||
+
|
||||
+ len = @cast(tf, "ngx_temp_file_t", "NGX_SBIN_PATH")->file->name->len
|
||||
+
|
||||
+ return user_string_n(@cast(tf, "ngx_temp_file_t", "NGX_SBIN_PATH")->file->name->data, len)
|
||||
+}
|
||||
+
|
||||
+
|
||||
+function ngx_table_elt_key(e)
|
||||
+{
|
||||
+ len = @cast(e, "ngx_table_elt_t", "NGX_SBIN_PATH")->key->len
|
||||
+
|
||||
+ return user_string_n(@cast(e, "ngx_table_elt_t", "NGX_SBIN_PATH")->key->data, len)
|
||||
+}
|
||||
+
|
||||
+
|
||||
+function ngx_table_elt_value(e)
|
||||
+{
|
||||
+ len = @cast(e, "ngx_table_elt_t", "NGX_SBIN_PATH")->value->len
|
||||
+
|
||||
+ return user_string_n(@cast(e, "ngx_table_elt_t", "NGX_SBIN_PATH")->value->data, len)
|
||||
+}
|
||||
+
|
||||
diff --git a/src/dtrace/nginx_provider.d b/src/dtrace/nginx_provider.d
|
||||
new file mode 100644
|
||||
index 0000000..483ac69
|
||||
--- /dev/null
|
||||
+++ b/src/dtrace/nginx_provider.d
|
||||
@@ -0,0 +1,32 @@
|
||||
+typedef struct { int dummy; } ngx_http_request_t;
|
||||
+typedef struct { int dummy; } ngx_str_t;
|
||||
+typedef int64_t ngx_int_t;
|
||||
+typedef struct { int dummy; } ngx_module_t;
|
||||
+typedef struct { int dummy; } ngx_http_module_t;
|
||||
+typedef struct { int dummy; } ngx_table_elt_t;
|
||||
+
|
||||
+
|
||||
+provider nginx {
|
||||
+ /* probes for subrequests */
|
||||
+ probe http__subrequest__cycle(ngx_http_request_t *pr, ngx_str_t *uri, ngx_str_t *args);
|
||||
+ probe http__subrequest__start(ngx_http_request_t *r);
|
||||
+ probe http__subrequest__finalize_writing(ngx_http_request_t *r);
|
||||
+ probe http__subrequest__finalize_nonactive(ngx_http_request_t *r);
|
||||
+ probe http__subrequest__wake__parent(ngx_http_request_t *r);
|
||||
+ probe http__subrequest__done(ngx_http_request_t *r);
|
||||
+ probe http__subrequest__post__start(ngx_http_request_t *r, ngx_int_t rc);
|
||||
+ probe http__subrequest__post__done(ngx_http_request_t *r, ngx_int_t rc);
|
||||
+ probe http__module__post__config(ngx_module_t *m);
|
||||
+ probe http__read__body__abort(ngx_http_request_t *r, char *reason);
|
||||
+ probe http__read__body__done(ngx_http_request_t *r);
|
||||
+ probe http__read__req__line__done(ngx_http_request_t *r);
|
||||
+ probe http__read__req__header__done(ngx_http_request_t *r, ngx_table_elt_t *h);
|
||||
+};
|
||||
+
|
||||
+
|
||||
+#pragma D attributes Evolving/Evolving/Common provider nginx provider
|
||||
+#pragma D attributes Private/Private/Unknown provider nginx module
|
||||
+#pragma D attributes Private/Private/Unknown provider nginx function
|
||||
+#pragma D attributes Private/Private/Common provider nginx name
|
||||
+#pragma D attributes Evolving/Evolving/Common provider nginx args
|
||||
+
|
||||
diff --git a/src/dtrace/stap-nginx b/src/dtrace/stap-nginx
|
||||
new file mode 100755
|
||||
index 0000000..5127fbe
|
||||
--- /dev/null
|
||||
+++ b/src/dtrace/stap-nginx
|
||||
@@ -0,0 +1,6 @@
|
||||
+#!/bin/sh
|
||||
+
|
||||
+PATH="NGX_SBIN_DIR:$PATH"
|
||||
+export PATH
|
||||
+exec stap -d "NGX_SBIN_PATH" --ldd -I "NGX_TAPSET_PREFIX" "$@"
|
||||
+
|
||||
diff --git a/src/http/ngx_http.c b/src/http/ngx_http.c
|
||||
index 3e077fb..b7edb7b 100644
|
||||
--- a/src/http/ngx_http.c
|
||||
+++ b/src/http/ngx_http.c
|
||||
@@ -8,6 +8,7 @@
|
||||
#include <ngx_config.h>
|
||||
#include <ngx_core.h>
|
||||
#include <ngx_http.h>
|
||||
+#include <ngx_http_probe.h>
|
||||
|
||||
|
||||
static char *ngx_http_block(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);
|
||||
@@ -307,6 +308,9 @@ ngx_http_block(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
|
||||
module = ngx_modules[m]->ctx;
|
||||
|
||||
if (module->postconfiguration) {
|
||||
+
|
||||
+ ngx_http_probe_module_post_config(ngx_modules[m]);
|
||||
+
|
||||
if (module->postconfiguration(cf) != NGX_OK) {
|
||||
return NGX_CONF_ERROR;
|
||||
}
|
||||
diff --git a/src/http/ngx_http_core_module.c b/src/http/ngx_http_core_module.c
|
||||
index c5db18f..f23ba51 100644
|
||||
--- a/src/http/ngx_http_core_module.c
|
||||
+++ b/src/http/ngx_http_core_module.c
|
||||
@@ -8,6 +8,7 @@
|
||||
#include <ngx_config.h>
|
||||
#include <ngx_core.h>
|
||||
#include <ngx_http.h>
|
||||
+#include <ngx_http_probe.h>
|
||||
|
||||
|
||||
typedef struct {
|
||||
@@ -2377,6 +2378,8 @@ ngx_http_subrequest(ngx_http_request_t *r,
|
||||
r->main->subrequests--;
|
||||
|
||||
if (r->main->subrequests == 0) {
|
||||
+ ngx_http_probe_subrequest_cycle(r, &uri, &args);
|
||||
+
|
||||
ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
|
||||
"subrequests cycle while processing \"%V\"", uri);
|
||||
r->main->subrequests = 1;
|
||||
@@ -2491,6 +2494,8 @@ ngx_http_subrequest(ngx_http_request_t *r,
|
||||
|
||||
*psr = sr;
|
||||
|
||||
+ ngx_http_probe_subrequest_start(sr);
|
||||
+
|
||||
return ngx_http_post_request(sr, NULL);
|
||||
}
|
||||
|
||||
diff --git a/src/http/ngx_http_probe.h b/src/http/ngx_http_probe.h
|
||||
new file mode 100644
|
||||
index 0000000..d7d2d45
|
||||
--- /dev/null
|
||||
+++ b/src/http/ngx_http_probe.h
|
||||
@@ -0,0 +1,75 @@
|
||||
+#ifndef _NGX_HTTP_PROBE_H_INCLUDED_
|
||||
+#define _NGX_HTTP_PROBE_H_INCLUDED_
|
||||
+
|
||||
+
|
||||
+#include <ngx_config.h>
|
||||
+#include <ngx_core.h>
|
||||
+#include <ngx_http.h>
|
||||
+
|
||||
+
|
||||
+#if (NGX_DTRACE)
|
||||
+
|
||||
+#include <ngx_dtrace_provider.h>
|
||||
+
|
||||
+#define ngx_http_probe_subrequest_cycle(pr, uri, args) \
|
||||
+ NGINX_HTTP_SUBREQUEST_CYCLE(pr, uri, args)
|
||||
+
|
||||
+#define ngx_http_probe_subrequest_start(r) \
|
||||
+ NGINX_HTTP_SUBREQUEST_START(r)
|
||||
+
|
||||
+#define ngx_http_probe_subrequest_finalize_writing(r) \
|
||||
+ NGINX_HTTP_SUBREQUEST_FINALIZE_WRITING(r)
|
||||
+
|
||||
+#define ngx_http_probe_subrequest_finalize_nonactive(r) \
|
||||
+ NGINX_HTTP_SUBREQUEST_FINALIZE_NONACTIVE(r)
|
||||
+
|
||||
+#define ngx_http_probe_subrequest_finalize_nonactive(r) \
|
||||
+ NGINX_HTTP_SUBREQUEST_FINALIZE_NONACTIVE(r)
|
||||
+
|
||||
+#define ngx_http_probe_subrequest_wake_parent(r) \
|
||||
+ NGINX_HTTP_SUBREQUEST_WAKE_PARENT(r)
|
||||
+
|
||||
+#define ngx_http_probe_subrequest_done(r) \
|
||||
+ NGINX_HTTP_SUBREQUEST_DONE(r)
|
||||
+
|
||||
+#define ngx_http_probe_subrequest_post_start(r, rc) \
|
||||
+ NGINX_HTTP_SUBREQUEST_POST_START(r, rc)
|
||||
+
|
||||
+#define ngx_http_probe_subrequest_post_done(r, rc) \
|
||||
+ NGINX_HTTP_SUBREQUEST_POST_DONE(r, rc)
|
||||
+
|
||||
+#define ngx_http_probe_module_post_config(m) \
|
||||
+ NGINX_HTTP_MODULE_POST_CONFIG(m)
|
||||
+
|
||||
+#define ngx_http_probe_read_body_abort(r, reason) \
|
||||
+ NGINX_HTTP_READ_BODY_ABORT(r, reason)
|
||||
+
|
||||
+#define ngx_http_probe_read_body_done(r) \
|
||||
+ NGINX_HTTP_READ_BODY_DONE(r)
|
||||
+
|
||||
+#define ngx_http_probe_read_req_line_done(r) \
|
||||
+ NGINX_HTTP_READ_REQ_LINE_DONE(r)
|
||||
+
|
||||
+#define ngx_http_probe_read_req_header_done(r, h) \
|
||||
+ NGINX_HTTP_READ_REQ_HEADER_DONE(r, h)
|
||||
+
|
||||
+#else /* !(NGX_DTRACE) */
|
||||
+
|
||||
+#define ngx_http_probe_subrequest_cycle(pr, uri, args)
|
||||
+#define ngx_http_probe_subrequest_start(r)
|
||||
+#define ngx_http_probe_subrequest_finalize_writing(r)
|
||||
+#define ngx_http_probe_subrequest_finalize_nonactive(r)
|
||||
+#define ngx_http_probe_subrequest_wake_parent(r)
|
||||
+#define ngx_http_probe_subrequest_done(r)
|
||||
+#define ngx_http_probe_subrequest_post_start(r, rc)
|
||||
+#define ngx_http_probe_subrequest_post_done(r, rc)
|
||||
+#define ngx_http_probe_module_post_config(m)
|
||||
+#define ngx_http_probe_read_body_abort(r, reason)
|
||||
+#define ngx_http_probe_read_body_done(r)
|
||||
+#define ngx_http_probe_read_req_line_done(r)
|
||||
+#define ngx_http_probe_read_req_header_done(r, h)
|
||||
+
|
||||
+#endif /* NGX_DTRACE */
|
||||
+
|
||||
+
|
||||
+#endif /* _NGX_HTTP_PROBE_H_INCLUDED_ */
|
||||
diff --git a/src/http/ngx_http_request.c b/src/http/ngx_http_request.c
|
||||
index 436e17d..6dc5cb2 100644
|
||||
--- a/src/http/ngx_http_request.c
|
||||
+++ b/src/http/ngx_http_request.c
|
||||
@@ -8,6 +8,7 @@
|
||||
#include <ngx_config.h>
|
||||
#include <ngx_core.h>
|
||||
#include <ngx_http.h>
|
||||
+#include <ngx_http_probe.h>
|
||||
|
||||
|
||||
static void ngx_http_init_request(ngx_event_t *ev);
|
||||
@@ -864,6 +865,8 @@ ngx_http_process_request_line(ngx_event_t *rev)
|
||||
}
|
||||
#endif
|
||||
|
||||
+ ngx_http_probe_read_req_line_done(r);
|
||||
+
|
||||
ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0,
|
||||
"http request line: \"%V\"", &r->request_line);
|
||||
|
||||
@@ -1109,6 +1112,8 @@ ngx_http_process_request_headers(ngx_event_t *rev)
|
||||
return;
|
||||
}
|
||||
|
||||
+ ngx_http_probe_read_req_header_done(r, h);
|
||||
+
|
||||
ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
|
||||
"http header: \"%V: %V\"",
|
||||
&h->key, &h->value);
|
||||
@@ -1963,7 +1968,11 @@ ngx_http_finalize_request(ngx_http_request_t *r, ngx_int_t rc)
|
||||
}
|
||||
|
||||
if (r != r->main && r->post_subrequest) {
|
||||
+ ngx_http_probe_subrequest_post_start(r, rc);
|
||||
+
|
||||
rc = r->post_subrequest->handler(r, r->post_subrequest->data, rc);
|
||||
+
|
||||
+ ngx_http_probe_subrequest_post_done(r, rc);
|
||||
}
|
||||
|
||||
if (rc == NGX_ERROR
|
||||
@@ -2013,6 +2022,8 @@ ngx_http_finalize_request(ngx_http_request_t *r, ngx_int_t rc)
|
||||
|
||||
if (r->buffered || r->postponed) {
|
||||
|
||||
+ ngx_http_probe_subrequest_finalize_writing(r);
|
||||
+
|
||||
if (ngx_http_set_write_handler(r) != NGX_OK) {
|
||||
ngx_http_terminate_request(r, 0);
|
||||
}
|
||||
@@ -2049,10 +2060,14 @@ ngx_http_finalize_request(ngx_http_request_t *r, ngx_int_t rc)
|
||||
pr->postponed = pr->postponed->next;
|
||||
}
|
||||
|
||||
+ ngx_http_probe_subrequest_done(r);
|
||||
+
|
||||
c->data = pr;
|
||||
|
||||
} else {
|
||||
|
||||
+ ngx_http_probe_subrequest_finalize_nonactive(r);
|
||||
+
|
||||
ngx_log_debug2(NGX_LOG_DEBUG_HTTP, c->log, 0,
|
||||
"http finalize non-active request: \"%V?%V\"",
|
||||
&r->uri, &r->args);
|
||||
@@ -2064,6 +2079,8 @@ ngx_http_finalize_request(ngx_http_request_t *r, ngx_int_t rc)
|
||||
}
|
||||
}
|
||||
|
||||
+ ngx_http_probe_subrequest_wake_parent(r);
|
||||
+
|
||||
if (ngx_http_post_request(pr, NULL) != NGX_OK) {
|
||||
r->main->count++;
|
||||
ngx_http_terminate_request(r, 0);
|
||||
diff --git a/src/http/ngx_http_request_body.c b/src/http/ngx_http_request_body.c
|
||||
index f0e671a..37ec5d2 100644
|
||||
--- a/src/http/ngx_http_request_body.c
|
||||
+++ b/src/http/ngx_http_request_body.c
|
||||
@@ -8,6 +8,7 @@
|
||||
#include <ngx_config.h>
|
||||
#include <ngx_core.h>
|
||||
#include <ngx_http.h>
|
||||
+#include <ngx_http_probe.h>
|
||||
|
||||
|
||||
static void ngx_http_read_client_request_body_handler(ngx_http_request_t *r);
|
||||
@@ -40,11 +41,15 @@ ngx_http_read_client_request_body(ngx_http_request_t *r,
|
||||
r->main->count++;
|
||||
|
||||
if (r->request_body || r->discard_body || r->content_length_n == 0) {
|
||||
+ ngx_http_probe_read_body_abort(r,
|
||||
+ r->request_body ? "body exists"
|
||||
+ : "body discarded");
|
||||
post_handler(r);
|
||||
return NGX_OK;
|
||||
}
|
||||
|
||||
if (ngx_http_test_expect(r) != NGX_OK) {
|
||||
+ ngx_http_probe_read_body_abort(r, "test expect failed");
|
||||
return NGX_HTTP_INTERNAL_SERVER_ERROR;
|
||||
}
|
||||
|
||||
@@ -56,6 +61,7 @@ ngx_http_read_client_request_body(ngx_http_request_t *r,
|
||||
r->request_body = rb;
|
||||
|
||||
if (r->headers_in.content_length_n < 0) {
|
||||
+ ngx_http_probe_read_body_abort(r, "no content length");
|
||||
post_handler(r);
|
||||
return NGX_OK;
|
||||
}
|
||||
@@ -89,10 +95,13 @@ ngx_http_read_client_request_body(ngx_http_request_t *r,
|
||||
tf->persistent, tf->clean, tf->access)
|
||||
!= NGX_OK)
|
||||
{
|
||||
+ ngx_http_probe_read_body_abort(r, "create temp file failed");
|
||||
return NGX_HTTP_INTERNAL_SERVER_ERROR;
|
||||
}
|
||||
}
|
||||
|
||||
+ ngx_http_probe_read_body_done(r);
|
||||
+
|
||||
post_handler(r);
|
||||
|
||||
return NGX_OK;
|
||||
@@ -148,10 +157,13 @@ ngx_http_read_client_request_body(ngx_http_request_t *r,
|
||||
|
||||
if (r->request_body_in_file_only) {
|
||||
if (ngx_http_write_request_body(r, rb->bufs) != NGX_OK) {
|
||||
+ ngx_http_probe_read_body_abort(r, "write temp file failed");
|
||||
return NGX_HTTP_INTERNAL_SERVER_ERROR;
|
||||
}
|
||||
}
|
||||
|
||||
+ ngx_http_probe_read_body_done(r);
|
||||
+
|
||||
post_handler(r);
|
||||
|
||||
return NGX_OK;
|
||||
@@ -245,6 +257,7 @@ ngx_http_read_client_request_body_handler(ngx_http_request_t *r)
|
||||
ngx_int_t rc;
|
||||
|
||||
if (r->connection->read->timedout) {
|
||||
+ ngx_http_probe_read_body_abort(r, "timed out");
|
||||
r->connection->timedout = 1;
|
||||
ngx_http_finalize_request(r, NGX_HTTP_REQUEST_TIME_OUT);
|
||||
return;
|
||||
@@ -279,6 +292,7 @@ ngx_http_do_read_client_request_body(ngx_http_request_t *r)
|
||||
if (rb->buf->last == rb->buf->end) {
|
||||
|
||||
if (ngx_http_write_request_body(r, rb->to_write) != NGX_OK) {
|
||||
+ ngx_http_probe_read_body_abort(r, "write temp file failed");
|
||||
return NGX_HTTP_INTERNAL_SERVER_ERROR;
|
||||
}
|
||||
|
||||
@@ -302,6 +316,9 @@ ngx_http_do_read_client_request_body(ngx_http_request_t *r)
|
||||
}
|
||||
|
||||
if (n == 0) {
|
||||
+
|
||||
+ ngx_http_probe_read_body_abort(r, "connection closed");
|
||||
+
|
||||
ngx_log_error(NGX_LOG_INFO, c->log, 0,
|
||||
"client prematurely closed connection");
|
||||
}
|
||||
@@ -352,6 +369,7 @@ ngx_http_do_read_client_request_body(ngx_http_request_t *r)
|
||||
/* save the last part */
|
||||
|
||||
if (ngx_http_write_request_body(r, rb->to_write) != NGX_OK) {
|
||||
+ ngx_http_probe_read_body_abort(r, "write temp file failed");
|
||||
return NGX_HTTP_INTERNAL_SERVER_ERROR;
|
||||
}
|
||||
|
||||
@@ -381,6 +399,8 @@ ngx_http_do_read_client_request_body(ngx_http_request_t *r)
|
||||
|
||||
r->read_event_handler = ngx_http_block_reading;
|
||||
|
||||
+ ngx_http_probe_read_body_done(r);
|
||||
+
|
||||
rb->post_handler(r);
|
||||
|
||||
return NGX_OK;
|
15
patches/nginx-1.2.1-location_if_inherits_proxy.patch
Normal file
15
patches/nginx-1.2.1-location_if_inherits_proxy.patch
Normal file
@ -0,0 +1,15 @@
|
||||
--- nginx-1.2.1/src/http/modules/ngx_http_proxy_module.c 2012-04-23 18:40:01.000000000 +0800
|
||||
+++ nginx-1.2.1-patched/src/http/modules/ngx_http_proxy_module.c 2012-06-24 12:48:57.289834450 +0800
|
||||
@@ -3023,8 +3023,10 @@
|
||||
|
||||
if (conf->upstream.upstream || conf->proxy_lengths) {
|
||||
clcf = ngx_http_conf_get_module_loc_conf(cf, ngx_http_core_module);
|
||||
- if (clcf->handler == NULL && clcf->lmt_excpt) {
|
||||
- clcf->handler = ngx_http_proxy_handler;
|
||||
+ if (clcf->handler == NULL) {
|
||||
+ if (clcf->lmt_excpt) {
|
||||
+ clcf->handler = ngx_http_proxy_handler;
|
||||
+ }
|
||||
conf->location = prev->location;
|
||||
}
|
||||
}
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user