Skip to content

Commit 06be66d

Browse files
Fix to read response data using size when meta (petergoldstein#1007)
1 parent f2a46a7 commit 06be66d

File tree

3 files changed

+23
-2
lines changed

3 files changed

+23
-2
lines changed

CHANGELOG.md

+2
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ Dalli Changelog
44
Unreleased
55
==========
66

7+
- Fix cannot read response data included terminator `\r\n` when use meta protocol (matsubara0507)
8+
79
3.2.8
810
==========
911

lib/dalli/protocol/meta/response_processor.rb

+6-2
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ def meta_get_with_value(cache_nils: false)
3232
return cache_nils ? ::Dalli::NOT_FOUND : nil if tokens.first == EN
3333
return true unless tokens.first == VA
3434

35-
@value_marshaller.retrieve(read_line, bitflags_from_tokens(tokens))
35+
@value_marshaller.retrieve(read_data(tokens[1].to_i), bitflags_from_tokens(tokens))
3636
end
3737

3838
def meta_get_with_value_and_cas
@@ -42,7 +42,7 @@ def meta_get_with_value_and_cas
4242
cas = cas_from_tokens(tokens)
4343
return [nil, cas] unless tokens.first == VA
4444

45-
[@value_marshaller.retrieve(read_line, bitflags_from_tokens(tokens)), cas]
45+
[@value_marshaller.retrieve(read_data(tokens[1].to_i), bitflags_from_tokens(tokens)), cas]
4646
end
4747

4848
def meta_get_without_value
@@ -205,6 +205,10 @@ def next_line_to_tokens
205205
line = read_line
206206
line&.split || []
207207
end
208+
209+
def read_data(data_size)
210+
@io_source.read(data_size + TERMINATOR.bytesize)&.chomp!(TERMINATOR)
211+
end
208212
end
209213
end
210214
end

test/integration/test_operations.rb

+15
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,21 @@
2323
end
2424
end
2525

26+
it 'return the value that include TERMINATOR on a hit' do
27+
memcached_persistent(p) do |dc|
28+
dc.flush
29+
30+
val1 = "12345#{Dalli::Protocol::Meta::TERMINATOR}67890"
31+
dc.set('a', val1)
32+
val2 = dc.get('a')
33+
34+
assert_equal val1, val2
35+
36+
assert op_addset_succeeds(dc.set('a', nil))
37+
assert_nil dc.get('a')
38+
end
39+
end
40+
2641
it 'returns nil on a miss' do
2742
memcached_persistent(p) do |dc|
2843
assert_nil dc.get('notexist')

0 commit comments

Comments
 (0)