summaryrefslogtreecommitdiff
path: root/kafka/protocol.py
diff options
context:
space:
mode:
Diffstat (limited to 'kafka/protocol.py')
-rw-r--r--kafka/protocol.py42
1 files changed, 30 insertions, 12 deletions
diff --git a/kafka/protocol.py b/kafka/protocol.py
index 7ec7946..58661c7 100644
--- a/kafka/protocol.py
+++ b/kafka/protocol.py
@@ -9,7 +9,8 @@ from kafka.common import (
BrokerMetadata, PartitionMetadata, Message, OffsetAndMessage,
ProduceResponse, FetchResponse, OffsetResponse,
OffsetCommitResponse, OffsetFetchResponse, ProtocolError,
- BufferUnderflowError, ChecksumError, ConsumerFetchSizeTooSmall
+ BufferUnderflowError, ChecksumError, ConsumerFetchSizeTooSmall,
+ UnsupportedCodecError
)
from kafka.util import (
read_short_string, read_int_string, relative_unpack,
@@ -18,6 +19,12 @@ from kafka.util import (
log = logging.getLogger("kafka")
+ATTRIBUTE_CODEC_MASK = 0x03
+CODEC_NONE = 0x00
+CODEC_GZIP = 0x01
+CODEC_SNAPPY = 0x02
+ALL_CODECS = (CODEC_NONE, CODEC_GZIP, CODEC_SNAPPY)
+
class KafkaProtocol(object):
"""
@@ -32,11 +39,6 @@ class KafkaProtocol(object):
OFFSET_COMMIT_KEY = 8
OFFSET_FETCH_KEY = 9
- ATTRIBUTE_CODEC_MASK = 0x03
- CODEC_NONE = 0x00
- CODEC_GZIP = 0x01
- CODEC_SNAPPY = 0x02
-
###################
# Private API #
###################
@@ -150,17 +152,17 @@ class KafkaProtocol(object):
(key, cur) = read_int_string(data, cur)
(value, cur) = read_int_string(data, cur)
- codec = att & KafkaProtocol.ATTRIBUTE_CODEC_MASK
+ codec = att & ATTRIBUTE_CODEC_MASK
- if codec == KafkaProtocol.CODEC_NONE:
+ if codec == CODEC_NONE:
yield (offset, Message(magic, att, key, value))
- elif codec == KafkaProtocol.CODEC_GZIP:
+ elif codec == CODEC_GZIP:
gz = gzip_decode(value)
for (offset, msg) in KafkaProtocol._decode_message_set_iter(gz):
yield (offset, msg)
- elif codec == KafkaProtocol.CODEC_SNAPPY:
+ elif codec == CODEC_SNAPPY:
snp = snappy_decode(value)
for (offset, msg) in KafkaProtocol._decode_message_set_iter(snp):
yield (offset, msg)
@@ -543,7 +545,7 @@ def create_gzip_message(payloads, key=None):
[create_message(payload) for payload in payloads])
gzipped = gzip_encode(message_set)
- codec = KafkaProtocol.ATTRIBUTE_CODEC_MASK & KafkaProtocol.CODEC_GZIP
+ codec = ATTRIBUTE_CODEC_MASK & CODEC_GZIP
return Message(0, 0x00 | codec, key, gzipped)
@@ -564,6 +566,22 @@ def create_snappy_message(payloads, key=None):
[create_message(payload) for payload in payloads])
snapped = snappy_encode(message_set)
- codec = KafkaProtocol.ATTRIBUTE_CODEC_MASK & KafkaProtocol.CODEC_SNAPPY
+ codec = ATTRIBUTE_CODEC_MASK & CODEC_SNAPPY
return Message(0, 0x00 | codec, key, snapped)
+
+
+def create_message_set(messages, codec=CODEC_NONE):
+ """Create a message set using the given codec.
+
+ If codec is CODEC_NONE, return a list of raw Kafka messages. Otherwise,
+ return a list containing a single codec-encoded message.
+ """
+ if codec == CODEC_NONE:
+ return [create_message(m) for m in messages]
+ elif codec == CODEC_GZIP:
+ return [create_gzip_message(messages)]
+ elif codec == CODEC_SNAPPY:
+ return [create_snappy_message(messages)]
+ else:
+ raise UnsupportedCodecError("Codec 0x%02x unsupported" % codec)