Class: AMQ::Protocol::Basic

Inherits:
Class
  • Object
show all
Defined in:
lib/amq/protocol/client.rb

Defined Under Namespace

Classes: Ack, Cancel, CancelOk, Consume, ConsumeOk, Deliver, Get, GetEmpty, GetOk, Nack, Publish, Qos, QosOk, Recover, RecoverAsync, RecoverOk, Reject, Return

Constant Summary collapse

PROPERTIES =
[
  :content_type, # shortstr
  :content_encoding, # shortstr
  :headers, # table
  :delivery_mode, # octet
  :priority, # octet
  :correlation_id, # shortstr
  :reply_to, # shortstr
  :expiration, # shortstr
  :message_id, # shortstr
  :timestamp, # timestamp
  :type, # shortstr
  :user_id, # shortstr
  :app_id, # shortstr
  :cluster_id, # shortstr
]
DECODE_PROPERTIES =

THIS DECODES ONLY FLAGS

{
  0x8000 => :content_type,
  0x4000 => :content_encoding,
  0x2000 => :headers,
  0x1000 => :delivery_mode,
  0x0800 => :priority,
  0x0400 => :correlation_id,
  0x0200 => :reply_to,
  0x0100 => :expiration,
  0x0080 => :message_id,
  0x0040 => :timestamp,
  0x0020 => :type,
  0x0010 => :user_id,
  0x0008 => :app_id,
  0x0004 => :cluster_id,
}
DECODE_PROPERTIES_TYPE =
{
  0x8000 => :shortstr,
  0x4000 => :shortstr,
  0x2000 => :table,
  0x1000 => :octet,
  0x0800 => :octet,
  0x0400 => :shortstr,
  0x0200 => :shortstr,
  0x0100 => :shortstr,
  0x0080 => :shortstr,
  0x0040 => :timestamp,
  0x0020 => :shortstr,
  0x0010 => :shortstr,
  0x0008 => :shortstr,
  0x0004 => :shortstr,
}
DECODE_PROPERTIES_KEYS =

Hash doesn“t give any guarantees on keys order, we will do it in a straightforward way

[
  0x8000,
  0x4000,
  0x2000,
  0x1000,
  0x0800,
  0x0400,
  0x0200,
  0x0100,
  0x0080,
  0x0040,
  0x0020,
  0x0010,
  0x0008,
  0x0004,
]

Class Method Summary collapse

Methods inherited from Class

classes, inherited, method_id, name

Class Method Details

.decode_properties(data) ⇒ Object



1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
# File 'lib/amq/protocol/client.rb', line 1459

def self.decode_properties(data)
  offset, data_length, properties = 0, data.bytesize, {}

  compressed_index = data[offset, 2].unpack(PACK_UINT16)[0]
  offset += 2
  while data_length > offset
    DECODE_PROPERTIES_KEYS.each do |key|
      next unless compressed_index >= key
      compressed_index -= key
      name = DECODE_PROPERTIES[key] || raise(RuntimeError.new("No property found for index #{index.inspect}!"))
      case DECODE_PROPERTIES_TYPE[key]
      when :shortstr
        size = data[offset, 1].unpack(PACK_CHAR)[0]
        offset += 1
        result = data[offset, size]
      when :octet
        size = 1
        result = data[offset, size].unpack(PACK_CHAR).first
      when :timestamp
        size = 8
        result = Time.at(data[offset, size].unpack(PACK_UINT32_X2).last)
      when :table
        size = 4 + data[offset, 4].unpack(PACK_UINT32)[0]
        result = Table.decode(data[offset, size])
      end
      properties[name] = result
      offset += size
    end
  end

  properties
end

.encode_app_id(value) ⇒ Object

1 << 3



1374
1375
1376
1377
1378
1379
# File 'lib/amq/protocol/client.rb', line 1374

def self.encode_app_id(value)
  buffer = ""
  buffer << value.bytesize.chr
  buffer << value
  [12, 0x0008, buffer]
end

.encode_cluster_id(value) ⇒ Object

1 << 2



1382
1383
1384
1385
1386
1387
# File 'lib/amq/protocol/client.rb', line 1382

def self.encode_cluster_id(value)
  buffer = ""
  buffer << value.bytesize.chr
  buffer << value
  [13, 0x0004, buffer]
end

.encode_content_encoding(value) ⇒ Object

1 << 14



1290
1291
1292
1293
1294
1295
# File 'lib/amq/protocol/client.rb', line 1290

def self.encode_content_encoding(value)
  buffer = ""
  buffer << value.bytesize.chr
  buffer << value
  [1, 0x4000, buffer]
end

.encode_content_type(value) ⇒ Object

1 << 15



1282
1283
1284
1285
1286
1287
# File 'lib/amq/protocol/client.rb', line 1282

def self.encode_content_type(value)
  buffer = ""
  buffer << value.bytesize.chr
  buffer << value
  [0, 0x8000, buffer]
end

.encode_correlation_id(value) ⇒ Object

1 << 10



1319
1320
1321
1322
1323
1324
# File 'lib/amq/protocol/client.rb', line 1319

def self.encode_correlation_id(value)
  buffer = ""
  buffer << value.bytesize.chr
  buffer << value
  [5, 0x0400, buffer]
end

.encode_delivery_mode(value) ⇒ Object

1 << 12



1305
1306
1307
1308
1309
# File 'lib/amq/protocol/client.rb', line 1305

def self.encode_delivery_mode(value)
  buffer = ""
  buffer << [value].pack(PACK_CHAR)
  [3, 0x1000, buffer]
end

.encode_expiration(value) ⇒ Object

1 << 8



1335
1336
1337
1338
1339
1340
# File 'lib/amq/protocol/client.rb', line 1335

def self.encode_expiration(value)
  buffer = ""
  buffer << value.bytesize.chr
  buffer << value
  [7, 0x0100, buffer]
end

.encode_headers(value) ⇒ Object

1 << 13



1298
1299
1300
1301
1302
# File 'lib/amq/protocol/client.rb', line 1298

def self.encode_headers(value)
  buffer = ""
  buffer << AMQ::Protocol::Table.encode(value)
  [2, 0x2000, buffer]
end

.encode_message_id(value) ⇒ Object

1 << 7



1343
1344
1345
1346
1347
1348
# File 'lib/amq/protocol/client.rb', line 1343

def self.encode_message_id(value)
  buffer = ""
  buffer << value.bytesize.chr
  buffer << value
  [8, 0x0080, buffer]
end

.encode_priority(value) ⇒ Object

1 << 11



1312
1313
1314
1315
1316
# File 'lib/amq/protocol/client.rb', line 1312

def self.encode_priority(value)
  buffer = ""
  buffer << [value].pack(PACK_CHAR)
  [4, 0x0800, buffer]
end

.encode_properties(body_size, properties) ⇒ Object



1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
# File 'lib/amq/protocol/client.rb', line 1389

def self.encode_properties(body_size, properties)
  pieces, flags = [], 0

  properties.each do |key, value|
    i, f, result = self.send(:"encode_#{key}", value)
    flags |= f
    pieces[i] = result
  end

  # result = [60, 0, body_size, flags].pack("n2Qn")
  result = [60, 0].pack(PACK_UINT16_X2)
  result += AMQ::Hacks.pack_64_big_endian(body_size)
  result += [flags].pack(PACK_UINT16)
  result + pieces.join(EMPTY_STRING)
end

.encode_reply_to(value) ⇒ Object

1 << 9



1327
1328
1329
1330
1331
1332
# File 'lib/amq/protocol/client.rb', line 1327

def self.encode_reply_to(value)
  buffer = ""
  buffer << value.bytesize.chr
  buffer << value
  [6, 0x0200, buffer]
end

.encode_timestamp(value) ⇒ Object

1 << 6



1351
1352
1353
1354
1355
# File 'lib/amq/protocol/client.rb', line 1351

def self.encode_timestamp(value)
  buffer = ""
  buffer << AMQ::Hacks.pack_64_big_endian(value)
  [9, 0x0040, buffer]
end

.encode_type(value) ⇒ Object

1 << 5



1358
1359
1360
1361
1362
1363
# File 'lib/amq/protocol/client.rb', line 1358

def self.encode_type(value)
  buffer = ""
  buffer << value.bytesize.chr
  buffer << value
  [10, 0x0020, buffer]
end

.encode_user_id(value) ⇒ Object

1 << 4



1366
1367
1368
1369
1370
1371
# File 'lib/amq/protocol/client.rb', line 1366

def self.encode_user_id(value)
  buffer = ""
  buffer << value.bytesize.chr
  buffer << value
  [11, 0x0010, buffer]
end