ebb 0.1.0 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
data/src/parser.h CHANGED
@@ -12,14 +12,24 @@
12
12
  #include <stddef.h>
13
13
  #endif
14
14
 
15
- typedef void (*element_cb)(void *data, const char *at, size_t length);
15
+ enum { MONGREL_CONTENT_LENGTH
16
+ , MONGREL_CONTENT_TYPE
17
+ , MONGREL_FRAGMENT
18
+ , MONGREL_HTTP_VERSION
19
+ , MONGREL_QUERY_STRING
20
+ , MONGREL_REQUEST_PATH
21
+ , MONGREL_REQUEST_METHOD
22
+ , MONGREL_REQUEST_URI
23
+ };
24
+
16
25
  typedef void (*field_cb)(void *data, const char *field, size_t flen, const char *value, size_t vlen);
26
+ typedef void (*element_cb)(void *data, int type, const char *at, size_t length);
17
27
 
18
28
  typedef struct http_parser {
19
29
  int cs;
20
30
  int overflow_error;
21
31
  size_t body_start;
22
- int content_len;
32
+ size_t content_length;
23
33
  size_t nread;
24
34
  size_t mark;
25
35
  size_t field_start;
@@ -29,14 +39,7 @@ typedef struct http_parser {
29
39
  void *data;
30
40
 
31
41
  field_cb http_field;
32
- element_cb request_method;
33
- element_cb request_uri;
34
- element_cb fragment;
35
- element_cb request_path;
36
- element_cb query_string;
37
- element_cb http_version;
38
- element_cb header_done;
39
- element_cb content_length;
42
+ element_cb on_element;
40
43
  } http_parser;
41
44
 
42
45
  void http_parser_init(http_parser *parser);
data/test/basic_test.rb CHANGED
@@ -1,6 +1,6 @@
1
1
  require File.dirname(__FILE__) + '/helper'
2
2
 
3
- class BasicTest < ServerTest
3
+ module BasicTests
4
4
  def test_get_bytes
5
5
  [1,10,1000].each do |i|
6
6
  response = get("/bytes/#{i}")
@@ -27,3 +27,20 @@ class BasicTest < ServerTest
27
27
  end
28
28
  end
29
29
  end
30
+
31
+ class BasicTest < ServerTest
32
+ include BasicTests
33
+ end
34
+
35
+ class BasicTestFD < ServerTestFD
36
+ include BasicTests
37
+ end
38
+
39
+ class BasicTestUnixSocket < ServerTestSocket
40
+ include BasicTests
41
+
42
+ def test_socket_file_exists
43
+ assert File.exists?(@socketfile)
44
+ assert File.readable?(@socketfile)
45
+ end
46
+ end
data/test/env_test.rb CHANGED
@@ -35,20 +35,21 @@ end
35
35
  class HttpParserTest < ServerTest
36
36
 
37
37
  def test_parse_simple
38
- env = send_request("GET / HTTP/1.1\r\n\r\n")
38
+ env = send_request("GET / HTTP/1.0\r\n\r\n")
39
39
 
40
40
  assert_equal 'HTTP/1.1', env['SERVER_PROTOCOL']
41
41
  assert_equal '/', env['REQUEST_PATH']
42
- assert_equal 'HTTP/1.1', env['HTTP_VERSION']
42
+ assert_equal 'HTTP/1.0', env['HTTP_VERSION']
43
43
  assert_equal '/', env['REQUEST_URI']
44
44
  assert_equal 'GET', env['REQUEST_METHOD']
45
45
  assert_nil env['FRAGMENT']
46
46
  assert_nil env['QUERY_STRING']
47
47
  assert_equal "", env['rack.input']
48
+ assert_equal '127.0.0.1', env['HTTP_CLIENT_IP']
48
49
  end
49
50
 
50
51
  def test_parse_dumbfuck_headers
51
- should_be_good = "GET / HTTP/1.1\r\naaaaaaaaaaaaa:++++++++++\r\n\r\n"
52
+ should_be_good = "GET / HTTP/1.0\r\naaaaaaaaaaaaa:++++++++++\r\n\r\n"
52
53
  env = send_request(should_be_good)
53
54
  assert_equal "++++++++++", env["HTTP_AAAAAAAAAAAAA"]
54
55
  assert_equal "", env['rack.input']
@@ -62,7 +63,7 @@ class HttpParserTest < ServerTest
62
63
  end
63
64
 
64
65
  def test_fragment_in_uri
65
- env = send_request("GET /forums/1/topics/2375?page=1#posts-17408 HTTP/1.1\r\n\r\n")
66
+ env = send_request("GET /forums/1/topics/2375?page=1#posts-17408 HTTP/1.0\r\n\r\n")
66
67
  assert_equal '/forums/1/topics/2375?page=1', env['REQUEST_URI']
67
68
  assert_equal 'posts-17408', env['FRAGMENT']
68
69
  assert_equal "", env['rack.input']
@@ -91,7 +92,7 @@ class HttpParserTest < ServerTest
91
92
  # then that large mangled field values are caught
92
93
  10.times do |c|
93
94
  req = "GET /#{rand_data(10,120)} HTTP/1.1\r\nX-Test: #{rand_data(1024, 1024+(c*1024), false)}\r\n\r\n"
94
- #assert drops_request?(req), "large mangled field values are caught"
95
+ assert drops_request?(req), "large mangled field values are caught"
95
96
  ### XXX this is broken! fix me. this test should drop the request.
96
97
  end
97
98
 
data/test/helper.rb CHANGED
@@ -25,7 +25,7 @@ class HelperApp
25
25
  elsif commands.include?('test_post_length')
26
26
  input_body = env['rack.input'].read
27
27
 
28
- content_length_header = env['HTTP_CONTENT_LENGTH'].to_i
28
+ content_length_header = env['CONTENT_LENGTH'].to_i
29
29
 
30
30
  if content_length_header == input_body.length
31
31
  body = "Content-Length matches input length"
@@ -84,3 +84,55 @@ class ServerTest < Test::Unit::TestCase
84
84
  assert true
85
85
  end
86
86
  end
87
+
88
+ class ServerTestFD < ServerTest
89
+ def setup
90
+ @tcp_server = TCPServer.new('0.0.0.0', TEST_PORT);
91
+ Thread.new { Ebb.start_server(HelperApp.new, :fileno => @tcp_server.fileno) }
92
+ sleep 0.1 until Ebb.running?
93
+ end
94
+
95
+ def teardown
96
+ super
97
+ @tcp_server = nil
98
+ end
99
+ end
100
+
101
+ class ServerTestSocket < ServerTest
102
+ def get(path)
103
+ socket = UNIXSocket.open(@socketfile)
104
+ socket.write("GET #{path} HTTP/1.0\r\n\r\n")
105
+ response = ""
106
+ while chunk = socket.read(100)
107
+ response << chunk
108
+ end
109
+ body = response.split("\r\n\r\n")[1]
110
+ env = JSON.parse(body)
111
+ ensure
112
+ socket.close if socket
113
+ end
114
+
115
+ def post(path, data)
116
+ socket = UNIXSocket.open(@socketfile)
117
+ socket.write("POST #{path} HTTP/1.0\r\nContent-Length: #{data.length}\r\n\r\n#{data}")
118
+ response = ""
119
+ while chunk = socket.read(100)
120
+ response << chunk
121
+ end
122
+ body = response.split("\r\n\r\n")[1]
123
+ env = JSON.parse(body)
124
+ ensure
125
+ socket.close if socket
126
+ end
127
+
128
+ def setup
129
+ @socketfile = '/tmp/ebb_unittest.sock'
130
+ Thread.new { Ebb.start_server(HelperApp.new, :unix_socket => @socketfile) }
131
+ sleep 0.1 until Ebb.running?
132
+ end
133
+
134
+ def teardown
135
+ super
136
+ end
137
+ end
138
+
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.1.0
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - ry dahl
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2008-03-18 00:00:00 +01:00
12
+ date: 2008-04-19 00:00:00 +02:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
@@ -56,7 +56,6 @@ files:
56
56
  - ruby_lib/rack/adapter
57
57
  - ruby_lib/rack/adapter/rails.rb
58
58
  - benchmark/application.rb
59
- - benchmark/bench_results.rb
60
59
  - benchmark/server_test.rb
61
60
  - bin/ebb_rails
62
61
  - test/basic_test.rb
@@ -85,7 +84,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
85
84
  requirements: []
86
85
 
87
86
  rubyforge_project: ebb
88
- rubygems_version: 1.0.1
87
+ rubygems_version: 1.1.0
89
88
  signing_key:
90
89
  specification_version: 2
91
90
  summary: A Web Server
@@ -1,58 +0,0 @@
1
- # supply the benchmark dump file as an argumetn to this program
2
- require 'rubygems'
3
- require 'google_chart'
4
- require 'server_test'
5
-
6
- class Array
7
- def max
8
- inject(first) { |m, i| i > m ? i : m }
9
- end
10
-
11
- def min
12
- inject(first) { |m, i| i < m ? i : m }
13
- end
14
- end
15
-
16
-
17
-
18
- colors = %w{F74343 444130 7DA478 E4AC3D 1F479E}
19
- data_x = []
20
- data_y = []
21
- results = ServerTestResults.open(ARGV[0])
22
-
23
- response_chart = GoogleChart::LineChart.new('500x300', Time.now.strftime('%Y.%m.%d'), true)
24
- servers = results.servers.sort_by do |x,y|
25
- results.data(x).map { |d| d[1] }.mean
26
- end.reverse
27
-
28
- cmap = {}
29
- results.servers.sort.each { |x| cmap[x] = colors.shift }
30
-
31
- servers.each do |server|
32
- data = results.data(server).sort
33
- data_x += data.map { |d| d[0] }
34
- data_y += data.map { |d| d[1] }
35
- end
36
-
37
- servers.each do |server|
38
- data = results.data(server).sort
39
- data.map! { |d| [d[0]-data_x.min, d[1]-data_y.min]}
40
- response_chart.data(server, data, cmap[server])
41
- end
42
-
43
- label = case results.benchmark
44
- when "response_size"
45
- "kilobytes served"
46
- when "wait_fib", "concurrency"
47
- "concurrency"
48
- when "post_size"
49
- "kilobytes uploaded"
50
- when "wait", "wait_fib"
51
- "seconds waited every 10 requests"
52
- end
53
-
54
- response_chart.axis(:y, :range => [data_y.min,data_y.max])
55
- response_chart.axis(:y, :labels => ['req/s'], :positions => [50])
56
- response_chart.axis(:x, :range => [data_x.min,data_x.max])
57
- response_chart.axis(:x, :labels => [label], :positions => [50])
58
- puts response_chart.to_url