sidekick-client 0.2.1 → 0.2.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (162) hide show
  1. data/VERSION +1 -1
  2. data/lib/sidekick/client/sidekick_client.rb +0 -3
  3. data/lib/sidekick/shared/sidekick_queue_publisher.rb +1 -1
  4. data/sidekick-client.gemspec +1 -158
  5. metadata +1 -158
  6. data/lib/ext/eventmachine-0.12.10/.gitignore +0 -14
  7. data/lib/ext/eventmachine-0.12.10/README +0 -82
  8. data/lib/ext/eventmachine-0.12.10/Rakefile +0 -374
  9. data/lib/ext/eventmachine-0.12.10/docs/COPYING +0 -60
  10. data/lib/ext/eventmachine-0.12.10/docs/ChangeLog +0 -211
  11. data/lib/ext/eventmachine-0.12.10/docs/DEFERRABLES +0 -133
  12. data/lib/ext/eventmachine-0.12.10/docs/EPOLL +0 -141
  13. data/lib/ext/eventmachine-0.12.10/docs/GNU +0 -281
  14. data/lib/ext/eventmachine-0.12.10/docs/INSTALL +0 -13
  15. data/lib/ext/eventmachine-0.12.10/docs/KEYBOARD +0 -38
  16. data/lib/ext/eventmachine-0.12.10/docs/LEGAL +0 -25
  17. data/lib/ext/eventmachine-0.12.10/docs/LIGHTWEIGHT_CONCURRENCY +0 -70
  18. data/lib/ext/eventmachine-0.12.10/docs/PURE_RUBY +0 -75
  19. data/lib/ext/eventmachine-0.12.10/docs/RELEASE_NOTES +0 -94
  20. data/lib/ext/eventmachine-0.12.10/docs/SMTP +0 -2
  21. data/lib/ext/eventmachine-0.12.10/docs/SPAWNED_PROCESSES +0 -89
  22. data/lib/ext/eventmachine-0.12.10/docs/TODO +0 -8
  23. data/lib/ext/eventmachine-0.12.10/eventmachine.gemspec +0 -40
  24. data/lib/ext/eventmachine-0.12.10/examples/ex_channel.rb +0 -43
  25. data/lib/ext/eventmachine-0.12.10/examples/ex_queue.rb +0 -2
  26. data/lib/ext/eventmachine-0.12.10/examples/helper.rb +0 -2
  27. data/lib/ext/eventmachine-0.12.10/ext/binder.cpp +0 -125
  28. data/lib/ext/eventmachine-0.12.10/ext/binder.h +0 -46
  29. data/lib/ext/eventmachine-0.12.10/ext/cmain.cpp +0 -827
  30. data/lib/ext/eventmachine-0.12.10/ext/cplusplus.cpp +0 -202
  31. data/lib/ext/eventmachine-0.12.10/ext/ed.cpp +0 -1893
  32. data/lib/ext/eventmachine-0.12.10/ext/ed.h +0 -424
  33. data/lib/ext/eventmachine-0.12.10/ext/em.cpp +0 -2282
  34. data/lib/ext/eventmachine-0.12.10/ext/em.h +0 -232
  35. data/lib/ext/eventmachine-0.12.10/ext/emwin.cpp +0 -300
  36. data/lib/ext/eventmachine-0.12.10/ext/emwin.h +0 -94
  37. data/lib/ext/eventmachine-0.12.10/ext/epoll.cpp +0 -26
  38. data/lib/ext/eventmachine-0.12.10/ext/epoll.h +0 -25
  39. data/lib/ext/eventmachine-0.12.10/ext/eventmachine.h +0 -122
  40. data/lib/ext/eventmachine-0.12.10/ext/eventmachine_cpp.h +0 -96
  41. data/lib/ext/eventmachine-0.12.10/ext/extconf.rb +0 -148
  42. data/lib/ext/eventmachine-0.12.10/ext/fastfilereader/extconf.rb +0 -83
  43. data/lib/ext/eventmachine-0.12.10/ext/fastfilereader/mapper.cpp +0 -214
  44. data/lib/ext/eventmachine-0.12.10/ext/fastfilereader/mapper.h +0 -59
  45. data/lib/ext/eventmachine-0.12.10/ext/fastfilereader/rubymain.cpp +0 -127
  46. data/lib/ext/eventmachine-0.12.10/ext/files.cpp +0 -94
  47. data/lib/ext/eventmachine-0.12.10/ext/files.h +0 -65
  48. data/lib/ext/eventmachine-0.12.10/ext/kb.cpp +0 -81
  49. data/lib/ext/eventmachine-0.12.10/ext/page.cpp +0 -107
  50. data/lib/ext/eventmachine-0.12.10/ext/page.h +0 -51
  51. data/lib/ext/eventmachine-0.12.10/ext/pipe.cpp +0 -349
  52. data/lib/ext/eventmachine-0.12.10/ext/project.h +0 -151
  53. data/lib/ext/eventmachine-0.12.10/ext/rubymain.cpp +0 -1166
  54. data/lib/ext/eventmachine-0.12.10/ext/sigs.cpp +0 -89
  55. data/lib/ext/eventmachine-0.12.10/ext/sigs.h +0 -32
  56. data/lib/ext/eventmachine-0.12.10/ext/ssl.cpp +0 -460
  57. data/lib/ext/eventmachine-0.12.10/ext/ssl.h +0 -94
  58. data/lib/ext/eventmachine-0.12.10/java/.classpath +0 -8
  59. data/lib/ext/eventmachine-0.12.10/java/.project +0 -17
  60. data/lib/ext/eventmachine-0.12.10/java/src/com/rubyeventmachine/EmReactor.java +0 -570
  61. data/lib/ext/eventmachine-0.12.10/java/src/com/rubyeventmachine/EmReactorException.java +0 -40
  62. data/lib/ext/eventmachine-0.12.10/java/src/com/rubyeventmachine/EventableChannel.java +0 -69
  63. data/lib/ext/eventmachine-0.12.10/java/src/com/rubyeventmachine/EventableDatagramChannel.java +0 -189
  64. data/lib/ext/eventmachine-0.12.10/java/src/com/rubyeventmachine/EventableSocketChannel.java +0 -364
  65. data/lib/ext/eventmachine-0.12.10/java/src/com/rubyeventmachine/application/Application.java +0 -194
  66. data/lib/ext/eventmachine-0.12.10/java/src/com/rubyeventmachine/application/Connection.java +0 -74
  67. data/lib/ext/eventmachine-0.12.10/java/src/com/rubyeventmachine/application/ConnectionFactory.java +0 -37
  68. data/lib/ext/eventmachine-0.12.10/java/src/com/rubyeventmachine/application/DefaultConnectionFactory.java +0 -46
  69. data/lib/ext/eventmachine-0.12.10/java/src/com/rubyeventmachine/application/PeriodicTimer.java +0 -38
  70. data/lib/ext/eventmachine-0.12.10/java/src/com/rubyeventmachine/application/Timer.java +0 -54
  71. data/lib/ext/eventmachine-0.12.10/java/src/com/rubyeventmachine/tests/ApplicationTest.java +0 -109
  72. data/lib/ext/eventmachine-0.12.10/java/src/com/rubyeventmachine/tests/ConnectTest.java +0 -148
  73. data/lib/ext/eventmachine-0.12.10/java/src/com/rubyeventmachine/tests/EMTest.java +0 -80
  74. data/lib/ext/eventmachine-0.12.10/java/src/com/rubyeventmachine/tests/TestDatagrams.java +0 -53
  75. data/lib/ext/eventmachine-0.12.10/java/src/com/rubyeventmachine/tests/TestServers.java +0 -75
  76. data/lib/ext/eventmachine-0.12.10/java/src/com/rubyeventmachine/tests/TestTimers.java +0 -90
  77. data/lib/ext/eventmachine-0.12.10/lib/em/buftok.rb +0 -138
  78. data/lib/ext/eventmachine-0.12.10/lib/em/callback.rb +0 -26
  79. data/lib/ext/eventmachine-0.12.10/lib/em/channel.rb +0 -57
  80. data/lib/ext/eventmachine-0.12.10/lib/em/connection.rb +0 -564
  81. data/lib/ext/eventmachine-0.12.10/lib/em/deferrable.rb +0 -192
  82. data/lib/ext/eventmachine-0.12.10/lib/em/file_watch.rb +0 -54
  83. data/lib/ext/eventmachine-0.12.10/lib/em/future.rb +0 -61
  84. data/lib/ext/eventmachine-0.12.10/lib/em/messages.rb +0 -66
  85. data/lib/ext/eventmachine-0.12.10/lib/em/process_watch.rb +0 -44
  86. data/lib/ext/eventmachine-0.12.10/lib/em/processes.rb +0 -119
  87. data/lib/ext/eventmachine-0.12.10/lib/em/protocols/header_and_content.rb +0 -138
  88. data/lib/ext/eventmachine-0.12.10/lib/em/protocols/httpclient.rb +0 -263
  89. data/lib/ext/eventmachine-0.12.10/lib/em/protocols/httpclient2.rb +0 -590
  90. data/lib/ext/eventmachine-0.12.10/lib/em/protocols/line_and_text.rb +0 -125
  91. data/lib/ext/eventmachine-0.12.10/lib/em/protocols/linetext2.rb +0 -161
  92. data/lib/ext/eventmachine-0.12.10/lib/em/protocols/memcache.rb +0 -323
  93. data/lib/ext/eventmachine-0.12.10/lib/em/protocols/object_protocol.rb +0 -45
  94. data/lib/ext/eventmachine-0.12.10/lib/em/protocols/postgres3.rb +0 -247
  95. data/lib/ext/eventmachine-0.12.10/lib/em/protocols/saslauth.rb +0 -175
  96. data/lib/ext/eventmachine-0.12.10/lib/em/protocols/smtpclient.rb +0 -357
  97. data/lib/ext/eventmachine-0.12.10/lib/em/protocols/smtpserver.rb +0 -547
  98. data/lib/ext/eventmachine-0.12.10/lib/em/protocols/socks4.rb +0 -66
  99. data/lib/ext/eventmachine-0.12.10/lib/em/protocols/stomp.rb +0 -200
  100. data/lib/ext/eventmachine-0.12.10/lib/em/protocols/tcptest.rb +0 -53
  101. data/lib/ext/eventmachine-0.12.10/lib/em/protocols.rb +0 -36
  102. data/lib/ext/eventmachine-0.12.10/lib/em/queue.rb +0 -61
  103. data/lib/ext/eventmachine-0.12.10/lib/em/spawnable.rb +0 -85
  104. data/lib/ext/eventmachine-0.12.10/lib/em/streamer.rb +0 -130
  105. data/lib/ext/eventmachine-0.12.10/lib/em/timers.rb +0 -56
  106. data/lib/ext/eventmachine-0.12.10/lib/em/version.rb +0 -3
  107. data/lib/ext/eventmachine-0.12.10/lib/eventmachine.rb +0 -1592
  108. data/lib/ext/eventmachine-0.12.10/lib/evma/callback.rb +0 -32
  109. data/lib/ext/eventmachine-0.12.10/lib/evma/container.rb +0 -75
  110. data/lib/ext/eventmachine-0.12.10/lib/evma/factory.rb +0 -77
  111. data/lib/ext/eventmachine-0.12.10/lib/evma/protocol.rb +0 -87
  112. data/lib/ext/eventmachine-0.12.10/lib/evma/reactor.rb +0 -48
  113. data/lib/ext/eventmachine-0.12.10/lib/evma.rb +0 -32
  114. data/lib/ext/eventmachine-0.12.10/lib/jeventmachine.rb +0 -257
  115. data/lib/ext/eventmachine-0.12.10/lib/pr_eventmachine.rb +0 -1022
  116. data/lib/ext/eventmachine-0.12.10/setup.rb +0 -1585
  117. data/lib/ext/eventmachine-0.12.10/tasks/cpp.rake_example +0 -77
  118. data/lib/ext/eventmachine-0.12.10/tests/client.crt +0 -31
  119. data/lib/ext/eventmachine-0.12.10/tests/client.key +0 -51
  120. data/lib/ext/eventmachine-0.12.10/tests/test_attach.rb +0 -126
  121. data/lib/ext/eventmachine-0.12.10/tests/test_basic.rb +0 -284
  122. data/lib/ext/eventmachine-0.12.10/tests/test_channel.rb +0 -63
  123. data/lib/ext/eventmachine-0.12.10/tests/test_connection_count.rb +0 -35
  124. data/lib/ext/eventmachine-0.12.10/tests/test_defer.rb +0 -47
  125. data/lib/ext/eventmachine-0.12.10/tests/test_epoll.rb +0 -160
  126. data/lib/ext/eventmachine-0.12.10/tests/test_error_handler.rb +0 -35
  127. data/lib/ext/eventmachine-0.12.10/tests/test_errors.rb +0 -82
  128. data/lib/ext/eventmachine-0.12.10/tests/test_exc.rb +0 -55
  129. data/lib/ext/eventmachine-0.12.10/tests/test_file_watch.rb +0 -49
  130. data/lib/ext/eventmachine-0.12.10/tests/test_futures.rb +0 -198
  131. data/lib/ext/eventmachine-0.12.10/tests/test_get_sock_opt.rb +0 -30
  132. data/lib/ext/eventmachine-0.12.10/tests/test_handler_check.rb +0 -37
  133. data/lib/ext/eventmachine-0.12.10/tests/test_hc.rb +0 -218
  134. data/lib/ext/eventmachine-0.12.10/tests/test_httpclient.rb +0 -218
  135. data/lib/ext/eventmachine-0.12.10/tests/test_httpclient2.rb +0 -153
  136. data/lib/ext/eventmachine-0.12.10/tests/test_inactivity_timeout.rb +0 -50
  137. data/lib/ext/eventmachine-0.12.10/tests/test_kb.rb +0 -60
  138. data/lib/ext/eventmachine-0.12.10/tests/test_ltp.rb +0 -182
  139. data/lib/ext/eventmachine-0.12.10/tests/test_ltp2.rb +0 -317
  140. data/lib/ext/eventmachine-0.12.10/tests/test_next_tick.rb +0 -133
  141. data/lib/ext/eventmachine-0.12.10/tests/test_object_protocol.rb +0 -37
  142. data/lib/ext/eventmachine-0.12.10/tests/test_pause.rb +0 -70
  143. data/lib/ext/eventmachine-0.12.10/tests/test_pending_connect_timeout.rb +0 -48
  144. data/lib/ext/eventmachine-0.12.10/tests/test_process_watch.rb +0 -48
  145. data/lib/ext/eventmachine-0.12.10/tests/test_processes.rb +0 -128
  146. data/lib/ext/eventmachine-0.12.10/tests/test_proxy_connection.rb +0 -92
  147. data/lib/ext/eventmachine-0.12.10/tests/test_pure.rb +0 -125
  148. data/lib/ext/eventmachine-0.12.10/tests/test_queue.rb +0 -44
  149. data/lib/ext/eventmachine-0.12.10/tests/test_running.rb +0 -42
  150. data/lib/ext/eventmachine-0.12.10/tests/test_sasl.rb +0 -72
  151. data/lib/ext/eventmachine-0.12.10/tests/test_send_file.rb +0 -242
  152. data/lib/ext/eventmachine-0.12.10/tests/test_servers.rb +0 -76
  153. data/lib/ext/eventmachine-0.12.10/tests/test_smtpclient.rb +0 -83
  154. data/lib/ext/eventmachine-0.12.10/tests/test_smtpserver.rb +0 -85
  155. data/lib/ext/eventmachine-0.12.10/tests/test_spawn.rb +0 -322
  156. data/lib/ext/eventmachine-0.12.10/tests/test_ssl_args.rb +0 -79
  157. data/lib/ext/eventmachine-0.12.10/tests/test_ssl_methods.rb +0 -50
  158. data/lib/ext/eventmachine-0.12.10/tests/test_ssl_verify.rb +0 -82
  159. data/lib/ext/eventmachine-0.12.10/tests/test_timers.rb +0 -162
  160. data/lib/ext/eventmachine-0.12.10/tests/test_ud.rb +0 -36
  161. data/lib/ext/eventmachine-0.12.10/tests/testem.rb +0 -31
  162. data/lib/ext/eventmachine-0.12.10/web/whatis +0 -7
@@ -1,590 +0,0 @@
1
- #--
2
- #
3
- # Author:: Francis Cianfrocca (gmail: blackhedd)
4
- # Homepage:: http://rubyeventmachine.com
5
- # Date:: 16 July 2006
6
- #
7
- # See EventMachine and EventMachine::Connection for documentation and
8
- # usage examples.
9
- #
10
- #----------------------------------------------------------------------------
11
- #
12
- # Copyright (C) 2006-07 by Francis Cianfrocca. All Rights Reserved.
13
- # Gmail: blackhedd
14
- #
15
- # This program is free software; you can redistribute it and/or modify
16
- # it under the terms of either: 1) the GNU General Public License
17
- # as published by the Free Software Foundation; either version 2 of the
18
- # License, or (at your option) any later version; or 2) Ruby's License.
19
- #
20
- # See the file COPYING for complete licensing information.
21
- #
22
- #---------------------------------------------------------------------------
23
- #
24
- #
25
-
26
- module EventMachine
27
- module Protocols
28
-
29
- # === Usage
30
- #
31
- # EM.run{
32
- # conn = EM::Protocols::HttpClient2.connect 'google.com', 80
33
- #
34
- # req = conn.get('/')
35
- # req.callback{ |response|
36
- # p(response.status)
37
- # p(response.headers)
38
- # p(response.content)
39
- # }
40
- # }
41
- class HttpClient2 < Connection
42
- include LineText2
43
-
44
- def initialize
45
- @authorization = nil
46
- @closed = nil
47
- @requests = nil
48
- end
49
-
50
- class Request # :nodoc:
51
- include Deferrable
52
-
53
- attr_reader :version
54
- attr_reader :status
55
- attr_reader :header_lines
56
- attr_reader :headers
57
- attr_reader :content
58
- attr_reader :internal_error
59
-
60
- def initialize conn, args
61
- @conn = conn
62
- @args = args
63
- @header_lines = []
64
- @headers = {}
65
- @blanks = 0
66
- @chunk_trailer = nil
67
- @chunking = nil
68
- end
69
-
70
- def send_request
71
- az = @args[:authorization] and az = "Authorization: #{az}\r\n"
72
-
73
- r = [
74
- "#{@args[:verb]} #{@args[:uri]} HTTP/#{@args[:version] || "1.1"}\r\n",
75
- "Host: #{@args[:host_header] || "_"}\r\n",
76
- az || "",
77
- "\r\n"
78
- ]
79
- @conn.send_data r.join
80
- end
81
-
82
-
83
- #--
84
- #
85
- def receive_line ln
86
- if @chunk_trailer
87
- receive_chunk_trailer(ln)
88
- elsif @chunking
89
- receive_chunk_header(ln)
90
- else
91
- receive_header_line(ln)
92
- end
93
- end
94
-
95
- #--
96
- #
97
- def receive_chunk_trailer ln
98
- if ln.length == 0
99
- @conn.pop_request
100
- succeed(self)
101
- else
102
- p "Received chunk trailer line"
103
- end
104
- end
105
-
106
- #--
107
- # Allow up to ten blank lines before we get a real response line.
108
- # Allow no more than 100 lines in the header.
109
- #
110
- def receive_header_line ln
111
- if ln.length == 0
112
- if @header_lines.length > 0
113
- process_header
114
- else
115
- @blanks += 1
116
- if @blanks > 10
117
- @conn.close_connection
118
- end
119
- end
120
- else
121
- @header_lines << ln
122
- if @header_lines.length > 100
123
- @internal_error = :bad_header
124
- @conn.close_connection
125
- end
126
- end
127
- end
128
-
129
- #--
130
- # Cf RFC 2616 pgh 3.6.1 for the format of HTTP chunks.
131
- #
132
- def receive_chunk_header ln
133
- if ln.length > 0
134
- chunksize = ln.to_i(16)
135
- if chunksize > 0
136
- @conn.set_text_mode(ln.to_i(16))
137
- else
138
- @content = @content ? @content.join : ''
139
- @chunk_trailer = true
140
- end
141
- else
142
- # We correctly come here after each chunk gets read.
143
- # p "Got A BLANK chunk line"
144
- end
145
-
146
- end
147
-
148
-
149
- #--
150
- # We get a single chunk. Append it to the incoming content and switch back to line mode.
151
- #
152
- def receive_chunked_text text
153
- # p "RECEIVED #{text.length} CHUNK"
154
- (@content ||= []) << text
155
- end
156
-
157
-
158
- #--
159
- # TODO, inefficient how we're handling this. Part of it is done so as to
160
- # make sure we don't have problems in detecting chunked-encoding, content-length,
161
- # etc.
162
- #
163
- HttpResponseRE = /\AHTTP\/(1.[01]) ([\d]{3})/i
164
- ClenRE = /\AContent-length:\s*(\d+)/i
165
- ChunkedRE = /\ATransfer-encoding:\s*chunked/i
166
- ColonRE = /\:\s*/
167
-
168
- def process_header
169
- unless @header_lines.first =~ HttpResponseRE
170
- @conn.close_connection
171
- @internal_error = :bad_request
172
- end
173
- @version = $1.dup
174
- @status = $2.dup.to_i
175
-
176
- clen = nil
177
- chunks = nil
178
- @header_lines.each_with_index do |e,ix|
179
- if ix > 0
180
- hdr,val = e.split(ColonRE,2)
181
- (@headers[hdr.downcase] ||= []) << val
182
- end
183
-
184
- if clen == nil and e =~ ClenRE
185
- clen = $1.dup.to_i
186
- end
187
- if e =~ ChunkedRE
188
- chunks = true
189
- end
190
- end
191
-
192
- if clen
193
- # If the content length is zero we should not call set_text_mode,
194
- # because a value of zero will make it wait forever, hanging the
195
- # connection. Just return success instead, with empty content.
196
- if clen == 0 then
197
- @content = ""
198
- @conn.pop_request
199
- succeed(self)
200
- else
201
- @conn.set_text_mode clen
202
- end
203
- elsif chunks
204
- @chunking = true
205
- else
206
- # Chunked transfer, multipart, or end-of-connection.
207
- # For end-of-connection, we need to go the unbind
208
- # method and suppress its desire to fail us.
209
- p "NO CLEN"
210
- p @args[:uri]
211
- p @header_lines
212
- @internal_error = :unsupported_clen
213
- @conn.close_connection
214
- end
215
- end
216
- private :process_header
217
-
218
-
219
- def receive_text text
220
- @chunking ? receive_chunked_text(text) : receive_sized_text(text)
221
- end
222
-
223
- #--
224
- # At the present time, we only handle contents that have a length
225
- # specified by the content-length header.
226
- #
227
- def receive_sized_text text
228
- @content = text
229
- @conn.pop_request
230
- succeed(self)
231
- end
232
- end
233
-
234
- # Make a connection to a remote HTTP server.
235
- # Can take either a pair of arguments (which will be interpreted as
236
- # a hostname/ip-address and a port), or a hash.
237
- # If the arguments are a hash, then supported values include:
238
- # :host => a hostname or ip-address
239
- # :port => a port number
240
- # :ssl => true to enable ssl
241
- def self.connect *args
242
- if args.length == 2
243
- args = {:host=>args[0], :port=>args[1]}
244
- else
245
- args = args.first
246
- end
247
-
248
- h,prt,ssl = args[:host], Integer(args[:port]), (args[:tls] || args[:ssl])
249
- conn = EM.connect( h, prt, self )
250
- conn.start_tls if ssl
251
- conn.set_default_host_header( h, prt, ssl )
252
- conn
253
- end
254
-
255
- # Get a url
256
- #
257
- # req = conn.get(:uri => '/')
258
- # req.callback{|response| puts response.content }
259
- #
260
- def get args
261
- if args.is_a?(String)
262
- args = {:uri=>args}
263
- end
264
- args[:verb] = "GET"
265
- request args
266
- end
267
-
268
- # Post to a url
269
- #
270
- # req = conn.post('/data')
271
- # req.callback{|response| puts response.content }
272
- #--
273
- # XXX there's no way to supply a POST body.. wtf?
274
- def post args
275
- if args.is_a?(String)
276
- args = {:uri=>args}
277
- end
278
- args[:verb] = "POST"
279
- request args
280
- end
281
-
282
- # :stopdoc:
283
-
284
- #--
285
- # Compute and remember a string to be used as the host header in HTTP requests
286
- # unless the user overrides it with an argument to #request.
287
- #
288
- def set_default_host_header host, port, ssl
289
- if (ssl and port != 443) or (!ssl and port != 80)
290
- @host_header = "#{host}:#{port}"
291
- else
292
- @host_header = host
293
- end
294
- end
295
-
296
-
297
- def post_init
298
- super
299
- @connected = EM::DefaultDeferrable.new
300
- end
301
-
302
- def connection_completed
303
- super
304
- @connected.succeed
305
- end
306
-
307
- #--
308
- # All pending requests, if any, must fail.
309
- # We might come here without ever passing through connection_completed
310
- # in case we can't connect to the server. We'll also get here when the
311
- # connection closes (either because the server closes it, or we close it
312
- # due to detecting an internal error or security violation).
313
- # In either case, run down all pending requests, if any, and signal failure
314
- # on them.
315
- #
316
- # Set and remember a flag (@closed) so we can immediately fail any
317
- # subsequent requests.
318
- #
319
- def unbind
320
- super
321
- @closed = true
322
- (@requests || []).each {|r| r.fail}
323
- end
324
-
325
- def request args
326
- args[:host_header] = @host_header unless args.has_key?(:host_header)
327
- args[:authorization] = @authorization unless args.has_key?(:authorization)
328
- r = Request.new self, args
329
- if @closed
330
- r.fail
331
- else
332
- (@requests ||= []).unshift r
333
- @connected.callback {r.send_request}
334
- end
335
- r
336
- end
337
-
338
- def receive_line ln
339
- if req = @requests.last
340
- req.receive_line ln
341
- else
342
- p "??????????"
343
- p ln
344
- end
345
-
346
- end
347
- def receive_binary_data text
348
- @requests.last.receive_text text
349
- end
350
-
351
- #--
352
- # Called by a Request object when it completes.
353
- #
354
- def pop_request
355
- @requests.pop
356
- end
357
-
358
- # :startdoc:
359
- end
360
-
361
-
362
- =begin
363
- class HttpClient2x < Connection
364
- include LineText2
365
-
366
- # TODO: Make this behave appropriate in case a #connect fails.
367
- # Currently, this produces no errors.
368
-
369
- # Make a connection to a remote HTTP server.
370
- # Can take either a pair of arguments (which will be interpreted as
371
- # a hostname/ip-address and a port), or a hash.
372
- # If the arguments are a hash, then supported values include:
373
- # :host => a hostname or ip-address;
374
- # :port => a port number
375
- #--
376
- # TODO, support optional encryption arguments like :ssl
377
- def self.connect *args
378
- if args.length == 2
379
- args = {:host=>args[0], :port=>args[1]}
380
- else
381
- args = args.first
382
- end
383
-
384
- h,prt = args[:host],Integer(args[:port])
385
- EM.connect( h, prt, self, h, prt )
386
- end
387
-
388
-
389
- #--
390
- # Sugars a connection that makes a single request and then
391
- # closes the connection. Matches the behavior and the arguments
392
- # of the original implementation of class HttpClient.
393
- #
394
- # Intended primarily for back compatibility, but the idiom
395
- # is probably useful so it's not deprecated.
396
- # We return a Deferrable, as did the original implementation.
397
- #
398
- # Because we're improving the way we deal with errors and exceptions
399
- # (specifically, HTTP response codes other than 2xx will trigger the
400
- # errback rather than the callback), this may break some existing code.
401
- #
402
- def self.request args
403
- c = connect args
404
- end
405
-
406
- #--
407
- # Requests can be pipelined. When we get a request, add it to the
408
- # front of a queue as an array. The last element of the @requests
409
- # array is always the oldest request received. Each element of the
410
- # @requests array is a two-element array consisting of a hash with
411
- # the original caller's arguments, and an initially-empty Ostruct
412
- # containing the data we retrieve from the server's response.
413
- # Maintain the instance variable @current_response, which is the response
414
- # of the oldest pending request. That's just to make other code a little
415
- # easier. If the variable doesn't exist when we come here, we're
416
- # obviously the first request being made on the connection.
417
- #
418
- # The reason for keeping this method private (and requiring use of the
419
- # convenience methods #get, #post, #head, etc) is to avoid the small
420
- # performance penalty of canonicalizing the verb.
421
- #
422
- def request args
423
- d = EventMachine::DefaultDeferrable.new
424
-
425
- if @closed
426
- d.fail
427
- return d
428
- end
429
-
430
- o = OpenStruct.new
431
- o.deferrable = d
432
- (@requests ||= []).unshift [args, o]
433
- @current_response ||= @requests.last.last
434
- @connected.callback {
435
- az = args[:authorization] and az = "Authorization: #{az}\r\n"
436
-
437
- r = [
438
- "#{args[:verb]} #{args[:uri]} HTTP/#{args[:version] || "1.1"}\r\n",
439
- "Host: #{args[:host_header] || @host_header}\r\n",
440
- az || "",
441
- "\r\n"
442
- ]
443
- p r
444
- send_data r.join
445
- }
446
- o.deferrable
447
- end
448
- private :request
449
-
450
- def get args
451
- if args.is_a?(String)
452
- args = {:uri=>args}
453
- end
454
- args[:verb] = "GET"
455
- request args
456
- end
457
-
458
- def initialize host, port
459
- super
460
- @host_header = "#{host}:#{port}"
461
- end
462
- def post_init
463
- super
464
- @connected = EM::DefaultDeferrable.new
465
- end
466
-
467
-
468
- def connection_completed
469
- super
470
- @connected.succeed
471
- end
472
-
473
- #--
474
- # Make sure to throw away any leftover incoming data if we've
475
- # been closed due to recognizing an error.
476
- #
477
- # Generate an internal error if we get an unreasonable number of
478
- # header lines. It could be malicious.
479
- #
480
- def receive_line ln
481
- p ln
482
- return if @closed
483
-
484
- if ln.length > 0
485
- (@current_response.headers ||= []).push ln
486
- abort_connection if @current_response.headers.length > 100
487
- else
488
- process_received_headers
489
- end
490
- end
491
-
492
- #--
493
- # We come here when we've seen all the headers for a particular request.
494
- # What we do next depends on the response line (which should be the
495
- # first line in the header set), and whether there is content to read.
496
- # We may transition into a text-reading state to read content, or
497
- # we may abort the connection, or we may go right back into parsing
498
- # responses for the next response in the chain.
499
- #
500
- # We make an ASSUMPTION that the first line is an HTTP response.
501
- # Anything else produces an error that aborts the connection.
502
- # This may not be enough, because it may be that responses to pipelined
503
- # requests will come with a blank-line delimiter.
504
- #
505
- # Any non-2xx response will be treated as a fatal error, and abort the
506
- # connection. We will set up the status and other response parameters.
507
- # TODO: we will want to properly support 1xx responses, which some versions
508
- # of IIS copiously generate.
509
- # TODO: We need to give the option of not aborting the connection with certain
510
- # non-200 responses, in order to work with NTLM and other authentication
511
- # schemes that work at the level of individual connections.
512
- #
513
- # Some error responses will get sugarings. For example, we'll return the
514
- # Location header in the response in case of a 301/302 response.
515
- #
516
- # Possible dispositions here:
517
- # 1) No content to read (either content-length is zero or it's a HEAD request);
518
- # 2) Switch to text mode to read a specific number of bytes;
519
- # 3) Read a chunked or multipart response;
520
- # 4) Read till the server closes the connection.
521
- #
522
- # Our reponse to the client can be either to wait till all the content
523
- # has been read and then to signal caller's deferrable, or else to signal
524
- # it when we finish the processing the headers and then expect the caller
525
- # to have given us a block to call as the content comes in. And of course
526
- # the latter gets stickier with chunks and multiparts.
527
- #
528
- HttpResponseRE = /\AHTTP\/(1.[01]) ([\d]{3})/i
529
- ClenRE = /\AContent-length:\s*(\d+)/i
530
- def process_received_headers
531
- abort_connection unless @current_response.headers.first =~ HttpResponseRE
532
- @current_response.version = $1.dup
533
- st = $2.dup
534
- @current_response.status = st.to_i
535
- abort_connection unless st[0,1] == "2"
536
-
537
- clen = nil
538
- @current_response.headers.each do |e|
539
- if clen == nil and e =~ ClenRE
540
- clen = $1.dup.to_i
541
- end
542
- end
543
-
544
- if clen
545
- set_text_mode clen
546
- end
547
- end
548
- private :process_received_headers
549
-
550
-
551
- def receive_binary_data text
552
- @current_response.content = text
553
- @current_response.deferrable.succeed @current_response
554
- @requests.pop
555
- @current_response = (@requests.last || []).last
556
- set_line_mode
557
- end
558
-
559
-
560
-
561
- # We've received either a server error or an internal error.
562
- # Close the connection and abort any pending requests.
563
- #--
564
- # When should we call close_connection? It will cause #unbind
565
- # to be fired. Should the user expect to see #unbind before
566
- # we call #receive_http_error, or the other way around?
567
- #
568
- # Set instance variable @closed. That's used to inhibit further
569
- # processing of any inbound data after an error has been recognized.
570
- #
571
- # We shouldn't have to worry about any leftover outbound data,
572
- # because we call close_connection (not close_connection_after_writing).
573
- # That ensures that any pipelined requests received after an error
574
- # DO NOT get streamed out to the server on this connection.
575
- # Very important. TODO, write a unit-test to establish that behavior.
576
- #
577
- def abort_connection
578
- close_connection
579
- @closed = true
580
- @current_response.deferrable.fail( @current_response )
581
- end
582
-
583
-
584
- #------------------------
585
- # Below here are user-overridable methods.
586
-
587
- end
588
- =end
589
- end
590
- end
@@ -1,125 +0,0 @@
1
- #--
2
- #
3
- # Author:: Francis Cianfrocca (gmail: blackhedd)
4
- # Homepage:: http://rubyeventmachine.com
5
- # Date:: 15 November 2006
6
- #
7
- # See EventMachine and EventMachine::Connection for documentation and
8
- # usage examples.
9
- #
10
- #----------------------------------------------------------------------------
11
- #
12
- # Copyright (C) 2006-07 by Francis Cianfrocca. All Rights Reserved.
13
- # Gmail: blackhedd
14
- #
15
- # This program is free software; you can redistribute it and/or modify
16
- # it under the terms of either: 1) the GNU General Public License
17
- # as published by the Free Software Foundation; either version 2 of the
18
- # License, or (at your option) any later version; or 2) Ruby's License.
19
- #
20
- # See the file COPYING for complete licensing information.
21
- #
22
- #---------------------------------------------------------------------------
23
- #
24
- #
25
- #
26
-
27
- module EventMachine
28
- module Protocols
29
- # A protocol that handles line-oriented data with interspersed binary text.
30
- #
31
- # This version is optimized for performance. See EventMachine::Protocols::LineText2
32
- # for a version which is optimized for correctness with regard to binary text blocks
33
- # that can switch back to line mode.
34
- class LineAndTextProtocol < Connection
35
- MaxLineLength = 16*1024
36
- MaxBinaryLength = 32*1024*1024
37
-
38
- def initialize *args
39
- super
40
- lbp_init_line_state
41
- end
42
- def receive_data data
43
- if @lbp_mode == :lines
44
- begin
45
- @lpb_buffer.extract(data).each do |line|
46
- receive_line(line.chomp) if respond_to?(:receive_line)
47
- end
48
- rescue Exception
49
- receive_error('overlength line') if respond_to?(:receive_error)
50
- close_connection
51
- return
52
- end
53
- else
54
- if @lbp_binary_limit > 0
55
- wanted = @lbp_binary_limit - @lbp_binary_bytes_received
56
- chunk = nil
57
- if data.length > wanted
58
- chunk = data.slice!(0...wanted)
59
- else
60
- chunk = data
61
- data = ""
62
- end
63
- @lbp_binary_buffer[@lbp_binary_bytes_received...(@lbp_binary_bytes_received+chunk.length)] = chunk
64
- @lbp_binary_bytes_received += chunk.length
65
- if @lbp_binary_bytes_received == @lbp_binary_limit
66
- receive_binary_data(@lbp_binary_buffer) if respond_to?(:receive_binary_data)
67
- lbp_init_line_state
68
- end
69
- receive_data(data) if data.length > 0
70
- else
71
- receive_binary_data(data) if respond_to?(:receive_binary_data)
72
- data = ""
73
- end
74
- end
75
- end
76
-
77
- def unbind
78
- if @lbp_mode == :binary and @lbp_binary_limit > 0
79
- if respond_to?(:receive_binary_data)
80
- receive_binary_data( @lbp_binary_buffer[0...@lbp_binary_bytes_received] )
81
- end
82
- end
83
- end
84
-
85
- # Set up to read the supplied number of binary bytes.
86
- # This recycles all the data currently waiting in the line buffer, if any.
87
- # If the limit is nil, then ALL subsequent data will be treated as binary
88
- # data and passed to the upstream protocol handler as we receive it.
89
- # If a limit is given, we'll hold the incoming binary data and not
90
- # pass it upstream until we've seen it all, or until there is an unbind
91
- # (in which case we'll pass up a partial).
92
- # Specifying nil for the limit (the default) means there is no limit.
93
- # Specifiyng zero for the limit will cause an immediate transition back to line mode.
94
- #
95
- def set_binary_mode size = nil
96
- if @lbp_mode == :lines
97
- if size == 0
98
- receive_binary_data("") if respond_to?(:receive_binary_data)
99
- # Do no more work here. Stay in line mode and keep consuming data.
100
- else
101
- @lbp_binary_limit = size.to_i # (nil will be stored as zero)
102
- if @lbp_binary_limit > 0
103
- raise "Overlength" if @lbp_binary_limit > MaxBinaryLength # arbitrary sanity check
104
- @lbp_binary_buffer = "\0" * @lbp_binary_limit
105
- @lbp_binary_bytes_received = 0
106
- end
107
-
108
- @lbp_mode = :binary
109
- receive_data @lpb_buffer.flush
110
- end
111
- else
112
- raise "invalid operation"
113
- end
114
- end
115
-
116
- #--
117
- # For internal use, establish protocol baseline for handling lines.
118
- def lbp_init_line_state
119
- @lpb_buffer = BufferedTokenizer.new("\n", MaxLineLength)
120
- @lbp_mode = :lines
121
- end
122
- private :lbp_init_line_state
123
- end
124
- end
125
- end