mongrel 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (74) hide show
  1. data/COPYING +504 -0
  2. data/LICENSE +504 -0
  3. data/README +117 -0
  4. data/Rakefile +30 -0
  5. data/doc/rdoc/classes/Mongrel.html +144 -0
  6. data/doc/rdoc/classes/Mongrel/Error404Handler.html +171 -0
  7. data/doc/rdoc/classes/Mongrel/Error404Handler.src/M000023.html +18 -0
  8. data/doc/rdoc/classes/Mongrel/Error404Handler.src/M000024.html +18 -0
  9. data/doc/rdoc/classes/Mongrel/HeaderOut.html +167 -0
  10. data/doc/rdoc/classes/Mongrel/HeaderOut.src/M000013.html +18 -0
  11. data/doc/rdoc/classes/Mongrel/HeaderOut.src/M000014.html +21 -0
  12. data/doc/rdoc/classes/Mongrel/HttpHandler.html +159 -0
  13. data/doc/rdoc/classes/Mongrel/HttpHandler.src/M000019.html +17 -0
  14. data/doc/rdoc/classes/Mongrel/HttpParser.html +271 -0
  15. data/doc/rdoc/classes/Mongrel/HttpParser.src/M000001.html +28 -0
  16. data/doc/rdoc/classes/Mongrel/HttpParser.src/M000002.html +29 -0
  17. data/doc/rdoc/classes/Mongrel/HttpParser.src/M000003.html +29 -0
  18. data/doc/rdoc/classes/Mongrel/HttpParser.src/M000004.html +41 -0
  19. data/doc/rdoc/classes/Mongrel/HttpParser.src/M000005.html +27 -0
  20. data/doc/rdoc/classes/Mongrel/HttpParser.src/M000006.html +27 -0
  21. data/doc/rdoc/classes/Mongrel/HttpParser.src/M000007.html +28 -0
  22. data/doc/rdoc/classes/Mongrel/HttpRequest.html +177 -0
  23. data/doc/rdoc/classes/Mongrel/HttpRequest.src/M000025.html +30 -0
  24. data/doc/rdoc/classes/Mongrel/HttpResponse.html +202 -0
  25. data/doc/rdoc/classes/Mongrel/HttpResponse.src/M000020.html +21 -0
  26. data/doc/rdoc/classes/Mongrel/HttpResponse.src/M000021.html +20 -0
  27. data/doc/rdoc/classes/Mongrel/HttpResponse.src/M000022.html +25 -0
  28. data/doc/rdoc/classes/Mongrel/HttpServer.html +336 -0
  29. data/doc/rdoc/classes/Mongrel/HttpServer.src/M000008.html +26 -0
  30. data/doc/rdoc/classes/Mongrel/HttpServer.src/M000009.html +58 -0
  31. data/doc/rdoc/classes/Mongrel/HttpServer.src/M000010.html +22 -0
  32. data/doc/rdoc/classes/Mongrel/HttpServer.src/M000011.html +18 -0
  33. data/doc/rdoc/classes/Mongrel/HttpServer.src/M000012.html +18 -0
  34. data/doc/rdoc/classes/Mongrel/URIClassifier.html +257 -0
  35. data/doc/rdoc/classes/Mongrel/URIClassifier.src/M000015.html +54 -0
  36. data/doc/rdoc/classes/Mongrel/URIClassifier.src/M000016.html +50 -0
  37. data/doc/rdoc/classes/Mongrel/URIClassifier.src/M000017.html +36 -0
  38. data/doc/rdoc/classes/Mongrel/URIClassifier.src/M000018.html +73 -0
  39. data/doc/rdoc/created.rid +1 -0
  40. data/doc/rdoc/files/COPYING.html +756 -0
  41. data/doc/rdoc/files/LICENSE.html +756 -0
  42. data/doc/rdoc/files/README.html +273 -0
  43. data/doc/rdoc/files/ext/http11/http11_c.html +101 -0
  44. data/doc/rdoc/files/lib/mongrel_rb.html +111 -0
  45. data/doc/rdoc/fr_class_index.html +35 -0
  46. data/doc/rdoc/fr_file_index.html +31 -0
  47. data/doc/rdoc/fr_method_index.html +51 -0
  48. data/doc/rdoc/index.html +24 -0
  49. data/doc/rdoc/rdoc-style.css +208 -0
  50. data/examples/camping/blog.rb +300 -0
  51. data/examples/camping/tepee.rb +168 -0
  52. data/examples/simpletest.rb +16 -0
  53. data/examples/webrick_compare.rb +20 -0
  54. data/ext/http11/MANIFEST +0 -0
  55. data/ext/http11/ext_help.h +14 -0
  56. data/ext/http11/extconf.rb +6 -0
  57. data/ext/http11/http11.c +436 -0
  58. data/ext/http11/http11_parser.c +918 -0
  59. data/ext/http11/http11_parser.h +37 -0
  60. data/ext/http11/tst.h +40 -0
  61. data/ext/http11/tst_cleanup.c +24 -0
  62. data/ext/http11/tst_delete.c +146 -0
  63. data/ext/http11/tst_grow_node_free_list.c +38 -0
  64. data/ext/http11/tst_init.c +41 -0
  65. data/ext/http11/tst_insert.c +192 -0
  66. data/ext/http11/tst_search.c +54 -0
  67. data/lib/mongrel.rb +298 -0
  68. data/setup.rb +1360 -0
  69. data/test/test_http11.rb +38 -0
  70. data/test/test_response.rb +44 -0
  71. data/test/test_uriclassifier.rb +104 -0
  72. data/test/test_ws.rb +33 -0
  73. data/tools/rakehelp.rb +99 -0
  74. metadata +132 -0
@@ -0,0 +1,37 @@
1
+ #ifndef http11_parser_h
2
+ #define http11_parser_h
3
+
4
+ #include <sys/types.h>
5
+
6
+ typedef void (*element_cb)(void *data, const char *at, size_t length);
7
+ typedef void (*field_cb)(void *data, const char *field, size_t flen, const char *value, size_t vlen);
8
+
9
+ typedef struct http_parser {
10
+ int cs;
11
+ const char *body_start;
12
+ int content_len;
13
+ size_t nread;
14
+ const char *mark;
15
+ const char *field_start;
16
+ size_t field_len;
17
+
18
+ void *data;
19
+
20
+ field_cb http_field;
21
+ element_cb request_method;
22
+ element_cb path_info;
23
+ element_cb query_string;
24
+ element_cb http_version;
25
+
26
+ } http_parser;
27
+
28
+ int http_parser_init(http_parser *parser);
29
+ int http_parser_finish(http_parser *parser);
30
+ size_t http_parser_execute(http_parser *parser, const char *data, size_t len );
31
+ int http_parser_has_error(http_parser *parser);
32
+ int http_parser_is_finished(http_parser *parser);
33
+ void http_parser_destroy(http_parser *parser);
34
+
35
+ #define http_parser_nread(parser) (parser)->nread
36
+
37
+ #endif
@@ -0,0 +1,40 @@
1
+
2
+
3
+ struct node
4
+ {
5
+ unsigned char value;
6
+ struct node *left;
7
+ struct node *middle;
8
+ struct node *right;
9
+ };
10
+
11
+ struct tst
12
+ {
13
+ int node_line_width;
14
+ struct node_lines *node_lines;
15
+ struct node *free_list;
16
+ struct node *head[127];
17
+ };
18
+
19
+ struct node_lines
20
+ {
21
+ struct node *node_line;
22
+ struct node_lines *next;
23
+ };
24
+
25
+ enum tst_constants
26
+ {
27
+ TST_OK, TST_ERROR, TST_NULL_KEY, TST_DUPLICATE_KEY, TST_REPLACE
28
+ };
29
+
30
+ struct tst *tst_init(int node_line_width);
31
+
32
+ int tst_insert(unsigned char *key, void *data, struct tst *tst, int option, void **exist_ptr);
33
+
34
+ void *tst_search(unsigned char *key, struct tst *tst, int *prefix_len);
35
+
36
+ void *tst_delete(unsigned char *key, struct tst *tst);
37
+
38
+ void tst_cleanup(struct tst *tst);
39
+
40
+
@@ -0,0 +1,24 @@
1
+
2
+ #include "tst.h"
3
+ #include <stdio.h>
4
+ #include <stdlib.h>
5
+
6
+ void tst_cleanup(struct tst *tst)
7
+ {
8
+ struct node_lines *current_line;
9
+ struct node_lines *next_line;
10
+
11
+ next_line = tst->node_lines;
12
+
13
+ do
14
+ {
15
+ current_line = next_line;
16
+ next_line = current_line->next;
17
+ free(current_line->node_line);
18
+ free(current_line);
19
+ }
20
+ while(next_line != NULL);
21
+
22
+ free(tst);
23
+ }
24
+
@@ -0,0 +1,146 @@
1
+
2
+ #include "tst.h"
3
+ #include <stdio.h>
4
+ #include <stdlib.h>
5
+
6
+ void *tst_delete(unsigned char *key, struct tst *tst)
7
+ {
8
+ struct node *current_node;
9
+ struct node *current_node_parent;
10
+ struct node *last_branch;
11
+ struct node *last_branch_parent;
12
+ struct node *next_node;
13
+ struct node *last_branch_replacement;
14
+ struct node *last_branch_dangling_child;
15
+ int key_index;
16
+
17
+
18
+ if(key[0] == 0)
19
+ return NULL;
20
+ if(tst->head[(int)key[0]] == NULL)
21
+ return NULL;
22
+
23
+ last_branch = NULL;
24
+ last_branch_parent = NULL;
25
+ current_node = tst->head[(int)key[0]];
26
+ current_node_parent = NULL;
27
+ key_index = 1;
28
+ while(current_node != NULL)
29
+ {
30
+ if(key[key_index] == current_node->value)
31
+ {
32
+
33
+ if( (current_node->left != NULL) || (current_node->right != NULL) )
34
+ {
35
+ last_branch = current_node;
36
+ last_branch_parent = current_node_parent;
37
+ }
38
+ if(key[key_index] == 0)
39
+ break;
40
+ else
41
+ {
42
+ current_node_parent = current_node;
43
+ current_node = current_node->middle;
44
+ key_index++;
45
+ continue;
46
+ }
47
+ }
48
+ else if( ((current_node->value == 0) && (key[key_index] < 64)) ||
49
+ ((current_node->value != 0) && (key[key_index] <
50
+ current_node->value)) )
51
+ {
52
+ last_branch_parent = current_node;
53
+ current_node_parent = current_node;
54
+ current_node = current_node->left;
55
+ last_branch = current_node;
56
+ continue;
57
+ }
58
+ else
59
+ {
60
+ last_branch_parent = current_node;
61
+ current_node_parent = current_node;
62
+ current_node = current_node->right;
63
+ last_branch = current_node;
64
+ continue;
65
+ }
66
+
67
+ }
68
+ if(current_node == NULL)
69
+ return NULL;
70
+
71
+ if(last_branch == NULL)
72
+ {
73
+
74
+ next_node = tst->head[(int)key[0]];
75
+ tst->head[(int)key[0]] = NULL;
76
+ }
77
+ else if( (last_branch->left == NULL) && (last_branch->right == NULL) )
78
+ {
79
+
80
+ if(last_branch_parent->left == last_branch)
81
+ last_branch_parent->left = NULL;
82
+ else
83
+ last_branch_parent->right = NULL;
84
+
85
+ next_node = last_branch;
86
+ }
87
+ else
88
+ {
89
+
90
+ if( (last_branch->left != NULL) && (last_branch->right != NULL) )
91
+ {
92
+ last_branch_replacement = last_branch->right;
93
+ last_branch_dangling_child = last_branch->left;
94
+ }
95
+ else if(last_branch->right != NULL)
96
+ {
97
+ last_branch_replacement = last_branch->right;
98
+ last_branch_dangling_child = NULL;
99
+ }
100
+ else
101
+ {
102
+ last_branch_replacement = last_branch->left;
103
+ last_branch_dangling_child = NULL;
104
+ }
105
+
106
+ if(last_branch_parent == NULL)
107
+ tst->head[(int)key[0]]=last_branch_replacement;
108
+ else
109
+ {
110
+ if (last_branch_parent->left == last_branch)
111
+ last_branch_parent->left = last_branch_replacement;
112
+ else if (last_branch_parent->right == last_branch)
113
+ last_branch_parent->right = last_branch_replacement;
114
+ else
115
+ last_branch_parent->middle = last_branch_replacement;
116
+ }
117
+
118
+ if(last_branch_dangling_child != NULL)
119
+ {
120
+ current_node = last_branch_replacement;
121
+
122
+ while (current_node->left != NULL)
123
+ current_node = current_node->left;
124
+
125
+ current_node->left = last_branch_dangling_child;
126
+ }
127
+
128
+ next_node = last_branch;
129
+ }
130
+
131
+ do
132
+ {
133
+ current_node = next_node;
134
+ next_node = current_node->middle;
135
+
136
+ current_node->left = NULL;
137
+ current_node->right = NULL;
138
+ current_node->middle = tst->free_list;
139
+ tst->free_list = current_node;
140
+ }
141
+ while(current_node->value != 0);
142
+
143
+ return next_node;
144
+
145
+ }
146
+
@@ -0,0 +1,38 @@
1
+
2
+ #include "tst.h"
3
+ #include <stdio.h>
4
+ #include <stdlib.h>
5
+
6
+ int tst_grow_node_free_list(struct tst *tst)
7
+ {
8
+ struct node *current_node;
9
+ struct node_lines *new_line;
10
+ int i;
11
+
12
+
13
+ if((new_line = (struct node_lines *) malloc(sizeof(struct node_lines))) == NULL)
14
+ return TST_ERROR;
15
+
16
+ if((new_line->node_line = (struct node *)
17
+ calloc(tst->node_line_width, sizeof(struct node))) == NULL)
18
+ {
19
+ free(new_line);
20
+ return TST_ERROR;
21
+ }
22
+ else
23
+ {
24
+ new_line->next = tst->node_lines;
25
+ tst->node_lines = new_line;
26
+ }
27
+
28
+ current_node = tst->node_lines->node_line;
29
+ tst->free_list = current_node;
30
+ for (i = 1; i < tst->node_line_width; i++)
31
+ {
32
+ current_node->middle = &(tst->node_lines->node_line[i]);
33
+ current_node = current_node->middle;
34
+ }
35
+ current_node->middle = NULL;
36
+ return 1;
37
+ }
38
+
@@ -0,0 +1,41 @@
1
+
2
+ #include "tst.h"
3
+ #include <stdio.h>
4
+ #include <stdlib.h>
5
+
6
+ struct tst *tst_init(int width)
7
+ {
8
+ struct tst *tst;
9
+ struct node *current_node;
10
+ int i;
11
+
12
+
13
+ if((tst = (struct tst *) calloc(1, sizeof(struct tst))) == NULL)
14
+ return NULL;
15
+
16
+ if ((tst->node_lines = (struct node_lines *) calloc(1, sizeof(struct node_lines))) == NULL)
17
+ {
18
+ free(tst);
19
+ return NULL;
20
+ }
21
+
22
+ tst->node_line_width = width;
23
+ tst->node_lines->next = NULL;
24
+ if ((tst->node_lines->node_line = (struct node *) calloc(width, sizeof(struct node))) == NULL)
25
+ {
26
+ free(tst->node_lines);
27
+ free(tst);
28
+ return NULL;
29
+ }
30
+
31
+ current_node = tst->node_lines->node_line;
32
+ tst->free_list = current_node;
33
+ for (i = 1; i < width; i++)
34
+ {
35
+ current_node->middle = &(tst->node_lines->node_line[i]);
36
+ current_node = current_node->middle;
37
+ }
38
+ current_node->middle = NULL;
39
+ return tst;
40
+ }
41
+
@@ -0,0 +1,192 @@
1
+
2
+ #include "tst.h"
3
+ #include <stdio.h>
4
+ #include <stdlib.h>
5
+
6
+
7
+ int tst_grow_node_free_list(struct tst *tst);
8
+ int tst_insert(unsigned char *key, void *data, struct tst *tst, int option, void **exist_ptr)
9
+ {
10
+ struct node *current_node;
11
+ struct node *new_node_tree_begin = NULL;
12
+ int key_index;
13
+ int perform_loop = 1;
14
+
15
+
16
+ if (key == NULL)
17
+ return TST_NULL_KEY;
18
+
19
+ if(key[0] == 0)
20
+ return TST_NULL_KEY;
21
+
22
+ if(tst->head[(int)key[0]] == NULL)
23
+ {
24
+
25
+ if(tst->free_list == NULL)
26
+ {
27
+ if(tst_grow_node_free_list(tst) != 1)
28
+ return TST_ERROR;
29
+ }
30
+ tst->head[(int)key[0]] = tst->free_list;
31
+
32
+ tst->free_list = tst->free_list->middle;
33
+ current_node = tst->head[(int)key[0]];
34
+ current_node->value = key[1];
35
+ if(key[1] == 0)
36
+ {
37
+ current_node->middle = data;
38
+ return TST_OK;
39
+ }
40
+ else
41
+ perform_loop = 0;
42
+ }
43
+
44
+ current_node = tst->head[(int)key[0]];
45
+ key_index = 1;
46
+ while(perform_loop == 1)
47
+ {
48
+ if(key[key_index] == current_node->value)
49
+ {
50
+
51
+ if(key[key_index] == 0)
52
+ {
53
+ if (option == TST_REPLACE)
54
+ {
55
+ if (exist_ptr != NULL)
56
+ *exist_ptr = current_node->middle;
57
+
58
+ current_node->middle = data;
59
+ return TST_OK;
60
+ }
61
+ else
62
+ {
63
+ if (exist_ptr != NULL)
64
+ *exist_ptr = current_node->middle;
65
+ return TST_DUPLICATE_KEY;
66
+ }
67
+ }
68
+ else
69
+ {
70
+ if(current_node->middle == NULL)
71
+ {
72
+
73
+ if(tst->free_list == NULL)
74
+ {
75
+ if(tst_grow_node_free_list(tst) != 1)
76
+ return TST_ERROR;
77
+ }
78
+ current_node->middle = tst->free_list;
79
+
80
+ tst->free_list = tst->free_list->middle;
81
+ new_node_tree_begin = current_node;
82
+ current_node = current_node->middle;
83
+ current_node->value = key[key_index];
84
+ break;
85
+ }
86
+ else
87
+ {
88
+ current_node = current_node->middle;
89
+ key_index++;
90
+ continue;
91
+ }
92
+ }
93
+ }
94
+
95
+ if( ((current_node->value == 0) && (key[key_index] < 64)) ||
96
+ ((current_node->value != 0) && (key[key_index] <
97
+ current_node->value)) )
98
+ {
99
+
100
+ if (current_node->left == NULL)
101
+ {
102
+
103
+ if(tst->free_list == NULL)
104
+ {
105
+ if(tst_grow_node_free_list(tst) != 1)
106
+ return TST_ERROR;
107
+ }
108
+ current_node->left = tst->free_list;
109
+
110
+ tst->free_list = tst->free_list->middle;
111
+ new_node_tree_begin = current_node;
112
+ current_node = current_node->left;
113
+ current_node->value = key[key_index];
114
+ if(key[key_index] == 0)
115
+ {
116
+ current_node->middle = data;
117
+ return TST_OK;
118
+ }
119
+ else
120
+ break;
121
+ }
122
+ else
123
+ {
124
+ current_node = current_node->left;
125
+ continue;
126
+ }
127
+ }
128
+ else
129
+ {
130
+
131
+ if (current_node->right == NULL)
132
+ {
133
+
134
+ if(tst->free_list == NULL)
135
+ {
136
+ if(tst_grow_node_free_list(tst) != 1)
137
+ return TST_ERROR;
138
+ }
139
+ current_node->right = tst->free_list;
140
+
141
+ tst->free_list = tst->free_list->middle;
142
+ new_node_tree_begin = current_node;
143
+ current_node = current_node->right;
144
+ current_node->value = key[key_index];
145
+ break;
146
+ }
147
+ else
148
+ {
149
+ current_node = current_node->right;
150
+ continue;
151
+ }
152
+ }
153
+ }
154
+
155
+ do
156
+ {
157
+ key_index++;
158
+
159
+ if(tst->free_list == NULL)
160
+ {
161
+ if(tst_grow_node_free_list(tst) != 1)
162
+ {
163
+ current_node = new_node_tree_begin->middle;
164
+
165
+ while (current_node->middle != NULL)
166
+ current_node = current_node->middle;
167
+
168
+ current_node->middle = tst->free_list;
169
+ tst->free_list = new_node_tree_begin->middle;
170
+ new_node_tree_begin->middle = NULL;
171
+
172
+ return TST_ERROR;
173
+ }
174
+ }
175
+
176
+
177
+ if(tst->free_list == NULL)
178
+ {
179
+ if(tst_grow_node_free_list(tst) != 1)
180
+ return TST_ERROR;
181
+ }
182
+ current_node->middle = tst->free_list;
183
+
184
+ tst->free_list = tst->free_list->middle;
185
+ current_node = current_node->middle;
186
+ current_node->value = key[key_index];
187
+ } while(key[key_index] !=0);
188
+
189
+ current_node->middle = data;
190
+ return TST_OK;
191
+ }
192
+