ebb 0.0.1 → 0.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/README +1 -1
- data/VERSION +1 -1
- data/src/parser.rl +200 -0
- metadata +2 -1
data/README
CHANGED
@@ -42,7 +42,7 @@ The Ruby binding is available as a Ruby Gem. It can be install by executing
|
|
42
42
|
`gem install ebb`
|
43
43
|
|
44
44
|
Ebb depends on having glib2 headers and libraries installed. (Easily available
|
45
|
-
on any UNIX system.)
|
45
|
+
on any UNIX system.) Manual download can be done at
|
46
46
|
the [RubyForge project page](http://rubyforge.org/frs/?group_id=5640).
|
47
47
|
|
48
48
|
## Why?
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.0.
|
1
|
+
0.0.2
|
data/src/parser.rl
ADDED
@@ -0,0 +1,200 @@
|
|
1
|
+
/**
|
2
|
+
* Copyright (c) 2005 Zed A. Shaw
|
3
|
+
* You can redistribute it and/or modify it under the same terms as Ruby.
|
4
|
+
*/
|
5
|
+
#include "parser.h"
|
6
|
+
#include <stdio.h>
|
7
|
+
#include <assert.h>
|
8
|
+
#include <stdlib.h>
|
9
|
+
#include <ctype.h>
|
10
|
+
#include <string.h>
|
11
|
+
|
12
|
+
#define LEN(AT, FPC) (FPC - buffer - parser->AT)
|
13
|
+
#define MARK(M,FPC) (parser->M = (FPC) - buffer)
|
14
|
+
#define PTR_TO(F) (buffer + parser->F)
|
15
|
+
|
16
|
+
/** machine **/
|
17
|
+
%%{
|
18
|
+
machine http_parser;
|
19
|
+
|
20
|
+
action mark {MARK(mark, fpc); }
|
21
|
+
|
22
|
+
|
23
|
+
action start_field { MARK(field_start, fpc); }
|
24
|
+
action write_field {
|
25
|
+
parser->field_len = LEN(field_start, fpc);
|
26
|
+
}
|
27
|
+
|
28
|
+
action start_value { MARK(mark, fpc); }
|
29
|
+
action write_value {
|
30
|
+
if(parser->http_field != NULL) {
|
31
|
+
parser->http_field(parser->data, PTR_TO(field_start), parser->field_len, PTR_TO(mark), LEN(mark, fpc));
|
32
|
+
}
|
33
|
+
}
|
34
|
+
|
35
|
+
action content_length {
|
36
|
+
if(parser->content_length != NULL) {
|
37
|
+
parser->content_length(parser->data, PTR_TO(mark), LEN(mark, fpc));
|
38
|
+
}
|
39
|
+
}
|
40
|
+
|
41
|
+
action request_method {
|
42
|
+
if(parser->request_method != NULL)
|
43
|
+
parser->request_method(parser->data, PTR_TO(mark), LEN(mark, fpc));
|
44
|
+
}
|
45
|
+
action request_uri {
|
46
|
+
if(parser->request_uri != NULL)
|
47
|
+
parser->request_uri(parser->data, PTR_TO(mark), LEN(mark, fpc));
|
48
|
+
}
|
49
|
+
|
50
|
+
action start_query {MARK(query_start, fpc); }
|
51
|
+
action query_string {
|
52
|
+
if(parser->query_string != NULL)
|
53
|
+
parser->query_string(parser->data, PTR_TO(query_start), LEN(query_start, fpc));
|
54
|
+
}
|
55
|
+
|
56
|
+
action http_version {
|
57
|
+
if(parser->http_version != NULL)
|
58
|
+
parser->http_version(parser->data, PTR_TO(mark), LEN(mark, fpc));
|
59
|
+
}
|
60
|
+
|
61
|
+
action request_path {
|
62
|
+
if(parser->request_path != NULL)
|
63
|
+
parser->request_path(parser->data, PTR_TO(mark), LEN(mark,fpc));
|
64
|
+
}
|
65
|
+
|
66
|
+
action done {
|
67
|
+
parser->body_start = fpc - buffer + 1;
|
68
|
+
if(parser->header_done != NULL)
|
69
|
+
parser->header_done(parser->data, fpc + 1, pe - fpc - 1);
|
70
|
+
fbreak;
|
71
|
+
}
|
72
|
+
|
73
|
+
|
74
|
+
#### HTTP PROTOCOL GRAMMAR
|
75
|
+
# line endings
|
76
|
+
CRLF = "\r\n";
|
77
|
+
|
78
|
+
# character types
|
79
|
+
CTL = (cntrl | 127);
|
80
|
+
safe = ("$" | "-" | "_" | ".");
|
81
|
+
extra = ("!" | "*" | "'" | "(" | ")" | ",");
|
82
|
+
reserved = (";" | "/" | "?" | ":" | "@" | "&" | "=" | "+");
|
83
|
+
unsafe = (CTL | " " | "\"" | "#" | "%" | "<" | ">");
|
84
|
+
national = any -- (alpha | digit | reserved | extra | safe | unsafe);
|
85
|
+
unreserved = (alpha | digit | safe | extra | national);
|
86
|
+
escape = ("%" xdigit xdigit);
|
87
|
+
uchar = (unreserved | escape);
|
88
|
+
pchar = (uchar | ":" | "@" | "&" | "=" | "+");
|
89
|
+
tspecials = ("(" | ")" | "<" | ">" | "@" | "," | ";" | ":" | "\\" | "\"" | "/" | "[" | "]" | "?" | "=" | "{" | "}" | " " | "\t");
|
90
|
+
|
91
|
+
# elements
|
92
|
+
token = (ascii -- (CTL | tspecials));
|
93
|
+
|
94
|
+
# URI schemes and absolute paths
|
95
|
+
scheme = ( alpha | digit | "+" | "-" | "." )* ;
|
96
|
+
absolute_uri = (scheme ":" (uchar | reserved )*);
|
97
|
+
|
98
|
+
path = (pchar+ ( "/" pchar* )*) ;
|
99
|
+
query = ( uchar | reserved )* %query_string ;
|
100
|
+
param = ( pchar | "/" )* ;
|
101
|
+
params = (param ( ";" param )*) ;
|
102
|
+
rel_path = (path? %request_path (";" params)?) ("?" %start_query query)?;
|
103
|
+
absolute_path = ("/"+ rel_path);
|
104
|
+
|
105
|
+
Request_URI = ("*" | absolute_uri | absolute_path) >mark %request_uri;
|
106
|
+
Method = (upper | digit | safe){1,20} >mark %request_method;
|
107
|
+
|
108
|
+
http_number = (digit+ "." digit+) ;
|
109
|
+
HTTP_Version = ("HTTP/" http_number) >mark %http_version ;
|
110
|
+
Request_Line = (Method " " Request_URI " " HTTP_Version CRLF) ;
|
111
|
+
|
112
|
+
field_name = (token -- ":")+ >start_field %write_field;
|
113
|
+
|
114
|
+
field_value = any* >start_value %write_value;
|
115
|
+
|
116
|
+
message_header = field_name ":" " "* field_value :> CRLF;
|
117
|
+
content_length = "Content-Length:"i " "* (field_value >mark %content_length) :> CRLF;
|
118
|
+
|
119
|
+
Request = Request_Line (content_length | message_header)* ( CRLF @done);
|
120
|
+
|
121
|
+
main := Request;
|
122
|
+
}%%
|
123
|
+
|
124
|
+
/** Data **/
|
125
|
+
%% write data;
|
126
|
+
|
127
|
+
int http_parser_init(http_parser *parser) {
|
128
|
+
int cs = 0;
|
129
|
+
%% write init;
|
130
|
+
parser->cs = cs;
|
131
|
+
parser->body_start = 0;
|
132
|
+
parser->content_len = 0;
|
133
|
+
parser->mark = 0;
|
134
|
+
parser->nread = 0;
|
135
|
+
parser->field_len = 0;
|
136
|
+
parser->field_start = 0;
|
137
|
+
|
138
|
+
return(1);
|
139
|
+
}
|
140
|
+
|
141
|
+
|
142
|
+
/** exec **/
|
143
|
+
size_t http_parser_execute(http_parser *parser, const char *buffer, size_t len, size_t off) {
|
144
|
+
const char *p, *pe;
|
145
|
+
int cs = parser->cs;
|
146
|
+
|
147
|
+
assert(off <= len && "offset past end of buffer");
|
148
|
+
|
149
|
+
p = buffer+off;
|
150
|
+
pe = buffer+len;
|
151
|
+
|
152
|
+
assert(*pe == '\0' && "pointer does not end on NUL");
|
153
|
+
assert(pe - p == len - off && "pointers aren't same distance");
|
154
|
+
|
155
|
+
|
156
|
+
%% write exec;
|
157
|
+
|
158
|
+
parser->cs = cs;
|
159
|
+
parser->nread += p - (buffer + off);
|
160
|
+
|
161
|
+
assert(p <= pe && "buffer overflow after parsing execute");
|
162
|
+
assert(parser->nread <= len && "nread longer than length");
|
163
|
+
assert(parser->body_start <= len && "body starts after buffer end");
|
164
|
+
assert(parser->mark < len && "mark is after buffer end");
|
165
|
+
assert(parser->field_len <= len && "field has length longer than whole buffer");
|
166
|
+
assert(parser->field_start < len && "field starts after buffer end");
|
167
|
+
|
168
|
+
if(parser->body_start) {
|
169
|
+
/* final \r\n combo encountered so stop right here */
|
170
|
+
%%write eof;
|
171
|
+
parser->nread++;
|
172
|
+
}
|
173
|
+
|
174
|
+
return(parser->nread);
|
175
|
+
}
|
176
|
+
|
177
|
+
int http_parser_finish(http_parser *parser)
|
178
|
+
{
|
179
|
+
int cs = parser->cs;
|
180
|
+
|
181
|
+
%%write eof;
|
182
|
+
|
183
|
+
parser->cs = cs;
|
184
|
+
|
185
|
+
if (http_parser_has_error(parser) ) {
|
186
|
+
return -1;
|
187
|
+
} else if (http_parser_is_finished(parser) ) {
|
188
|
+
return 1;
|
189
|
+
} else {
|
190
|
+
return 0;
|
191
|
+
}
|
192
|
+
}
|
193
|
+
|
194
|
+
int http_parser_has_error(http_parser *parser) {
|
195
|
+
return parser->cs == http_parser_error;
|
196
|
+
}
|
197
|
+
|
198
|
+
int http_parser_is_finished(http_parser *parser) {
|
199
|
+
return parser->cs == http_parser_first_final;
|
200
|
+
}
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ebb
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- ry dahl
|
@@ -22,6 +22,7 @@ extensions:
|
|
22
22
|
extra_rdoc_files: []
|
23
23
|
|
24
24
|
files:
|
25
|
+
- src/parser.rl
|
25
26
|
- src/ebb.c
|
26
27
|
- src/ebb_ruby.c
|
27
28
|
- src/parser.c
|