cloud_events 0.3.1 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 7449de71a0d20b1c7fa726bbb850080c977299ebb92c3c52ecc04c3acaa65a0c
4
- data.tar.gz: 60c0bfa47f39b3c4a10d12122c57d2ee2b26e75f4a82bc0622033275a5866946
3
+ metadata.gz: ae042efe6c2ccd066620bf2e4f548d6f0470fff3426e92442e5f403c8e06273a
4
+ data.tar.gz: f8d1fbbb00faa1d2b72db8c1e9ac016580951884e78cc6129eeec7fb8d844d5a
5
5
  SHA512:
6
- metadata.gz: ba15c5d5fd8fd432b39a861297c57f04c659f0329783ad8a02f30c60f839836438df4371937d4d063f14bef326e45741140690be854dc2f8865c3defbb948074
7
- data.tar.gz: 05cca16a9b8436a8cf7e7a23189d6873fbc322dbd177cd5d71886081a2a116d75ccb2215bc8c112a013976d769691ab0be96ab41b2d16e4acb57948c9aa7b8fc
6
+ metadata.gz: 06a156c8448d1c7b59ef683e90ecba1d22dfbe4564574a9355ee110c31f91240137295c437933ed6038fe8e1a9e9e5b19067ef82ee11affd38c6c2f41dac2b50
7
+ data.tar.gz: 9d8b7c3745261e6addd427b9b4d24b3873014f998f0f0844889315a6ea59ab3c11e44cbc25abfdffdb758357545c8c62eeca4f5d5138e6bd2179d700e1dd60c6
data/CHANGELOG.md CHANGED
@@ -1,5 +1,11 @@
1
1
  # Changelog
2
2
 
3
+ ### v0.4.0 / 2021-05-26
4
+
5
+ * ADDED: ContentType can take an optional default charset
6
+ * FIXED: Binary HTTP format parses quoted tokens according to RFC 7230 section 3.2.6
7
+ * FIXED: When encoding structured events for HTTP transport, the content-type now includes the charset
8
+
3
9
  ### v0.3.1 / 2021-04-25
4
10
 
5
11
  * FIXED: Fixed exception when decoding from a rack source that uses InputWrapper
@@ -21,14 +21,16 @@ module CloudEvents
21
21
  # Parse the given header value.
22
22
  #
23
23
  # @param string [String] Content-Type header value in RFC 2045 format
24
+ # @param default_charset [String] Optional. The charset to use if none is
25
+ # specified. Defaults to `us-ascii`.
24
26
  #
25
- def initialize string
27
+ def initialize string, default_charset: nil
26
28
  @string = string
27
29
  @media_type = "text"
28
30
  @subtype_base = @subtype = "plain"
29
31
  @subtype_format = nil
30
32
  @params = []
31
- @charset = "us-ascii"
33
+ @charset = default_charset || "us-ascii"
32
34
  @error_message = nil
33
35
  parse consume_comments string.strip
34
36
  @canonical_string = "#{@media_type}/#{@subtype}" +
@@ -183,7 +183,10 @@ module CloudEvents
183
183
  handlers = @structured_formatters[format] || []
184
184
  handlers.reverse_each do |handler|
185
185
  content = handler.encode event, **format_args
186
- return [{ "Content-Type" => "application/cloudevents+#{format}" }, content] if content
186
+ if content
187
+ content_type = "application/cloudevents+#{format}; charset=#{charset_of content}"
188
+ return [{ "Content-Type" => content_type }, content]
189
+ end
187
190
  end
188
191
  raise HttpContentError, "Unknown cloudevents format: #{format.inspect}"
189
192
  end
@@ -206,7 +209,10 @@ module CloudEvents
206
209
  handlers = @batched_formatters[format] || []
207
210
  handlers.reverse_each do |handler|
208
211
  content = handler.encode_batch events, **format_args
209
- return [{ "Content-Type" => "application/cloudevents-batch+#{format}" }, content] if content
212
+ if content
213
+ content_type = "application/cloudevents-batch+#{format}; charset=#{charset_of content}"
214
+ return [{ "Content-Type" => content_type }, content]
215
+ end
210
216
  end
211
217
  raise HttpContentError, "Unknown cloudevents format: #{format.inspect}"
212
218
  end
@@ -254,6 +260,7 @@ module CloudEvents
254
260
  # @return [String] Resulting decoded string in UTF-8.
255
261
  #
256
262
  def percent_decode str
263
+ str = str.gsub(/"((?:[^"\\]|\\.)*)"/) { ::Regexp.last_match(1).gsub(/\\(.)/, '\1') }
257
264
  decoded_str = str.gsub(/%[0-9a-fA-F]{2}/) { |m| [m[1..-1].to_i(16)].pack "C" }
258
265
  decoded_str.force_encoding ::Encoding::UTF_8
259
266
  end
@@ -271,7 +278,7 @@ module CloudEvents
271
278
  arr = []
272
279
  utf_str = str.to_s.encode ::Encoding::UTF_8
273
280
  utf_str.each_byte do |byte|
274
- if byte >= 33 && byte <= 126 && byte != 37
281
+ if byte >= 33 && byte <= 126 && byte != 34 && byte != 37
275
282
  arr << byte
276
283
  else
277
284
  hi = byte / 16
@@ -292,18 +299,28 @@ module CloudEvents
292
299
  begin
293
300
  str.force_encoding charset
294
301
  rescue ::ArgumentError
295
- # Do nothing for now if the charset is unrecognized
302
+ # Use binary for now if the charset is unrecognized
303
+ str.force_encoding ::Encoding::ASCII_8BIT
296
304
  end
297
305
  end
298
306
  str
299
307
  end
300
308
 
301
309
  def string_content_type str
302
- if str.encoding == ::Encoding.ASCII_8BIT
310
+ if str.encoding == ::Encoding::ASCII_8BIT
303
311
  "application/octet-stream"
304
312
  else
305
313
  "text/plain; charset=#{str.encoding.name.downcase}"
306
314
  end
307
315
  end
316
+
317
+ def charset_of str
318
+ encoding = str.encoding
319
+ if encoding == ::Encoding::ASCII_8BIT
320
+ "binary"
321
+ else
322
+ encoding.name.downcase
323
+ end
324
+ end
308
325
  end
309
326
  end
@@ -5,5 +5,5 @@ module CloudEvents
5
5
  # Version of the Ruby CloudEvents SDK
6
6
  # @return [String]
7
7
  #
8
- VERSION = "0.3.1"
8
+ VERSION = "0.4.0"
9
9
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cloud_events
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.1
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Daniel Azuma
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-04-25 00:00:00.000000000 Z
11
+ date: 2021-05-26 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: The official Ruby implementation of the CloudEvents Specification. Provides
14
14
  data types for events, and HTTP/JSON bindings for marshalling and unmarshalling
@@ -38,10 +38,10 @@ homepage: https://github.com/cloudevents/sdk-ruby
38
38
  licenses:
39
39
  - Apache-2.0
40
40
  metadata:
41
- changelog_uri: https://cloudevents.github.io/sdk-ruby/v0.3.1/file.CHANGELOG.html
41
+ changelog_uri: https://cloudevents.github.io/sdk-ruby/v0.4.0/file.CHANGELOG.html
42
42
  source_code_uri: https://github.com/cloudevents/sdk-ruby
43
43
  bug_tracker_uri: https://github.com/cloudevents/sdk-ruby/issues
44
- documentation_uri: https://cloudevents.github.io/sdk-ruby/v0.3.1
44
+ documentation_uri: https://cloudevents.github.io/sdk-ruby/v0.4.0
45
45
  post_install_message:
46
46
  rdoc_options: []
47
47
  require_paths: