-
Notifications
You must be signed in to change notification settings - Fork 41
/
Metadata.java
99 lines (72 loc) · 2.98 KB
/
Metadata.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
package io.rsocket.rpc.frames;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.ByteBufAllocator;
import io.netty.buffer.ByteBufUtil;
import io.netty.buffer.Unpooled;
import io.rsocket.util.NumberUtils;
import java.nio.charset.StandardCharsets;
@Deprecated
public class Metadata {
// Version
public static final short VERSION = 1;
public static ByteBuf encode(
ByteBufAllocator allocator, String service, String method, ByteBuf metadata) {
return encode(allocator, service, method, Unpooled.EMPTY_BUFFER, metadata);
}
public static ByteBuf encode(
ByteBufAllocator allocator,
String service,
String method,
ByteBuf tracing,
ByteBuf metadata) {
ByteBuf byteBuf = allocator.buffer().writeShort(VERSION);
int serviceLength = NumberUtils.requireUnsignedShort(ByteBufUtil.utf8Bytes(service));
byteBuf.writeShort(serviceLength);
ByteBufUtil.reserveAndWriteUtf8(byteBuf, service, serviceLength);
int methodLength = NumberUtils.requireUnsignedShort(ByteBufUtil.utf8Bytes(method));
byteBuf.writeShort(methodLength);
ByteBufUtil.reserveAndWriteUtf8(byteBuf, method, methodLength);
byteBuf.writeShort(tracing.readableBytes());
byteBuf.writeBytes(tracing, tracing.readerIndex(), tracing.readableBytes());
byteBuf.writeBytes(metadata, metadata.readerIndex(), metadata.readableBytes());
return byteBuf;
}
public static int getVersion(ByteBuf byteBuf) {
return byteBuf.getShort(0) & 0x7FFF;
}
public static String getService(ByteBuf byteBuf) {
int offset = Short.BYTES;
int serviceLength = byteBuf.getShort(offset);
offset += Short.BYTES;
return byteBuf.toString(offset, serviceLength, StandardCharsets.UTF_8);
}
public static String getMethod(ByteBuf byteBuf) {
int offset = Short.BYTES;
int serviceLength = byteBuf.getShort(offset);
offset += Short.BYTES + serviceLength;
int methodLength = byteBuf.getShort(offset);
offset += Short.BYTES;
return byteBuf.toString(offset, methodLength, StandardCharsets.UTF_8);
}
public static ByteBuf getTracing(ByteBuf byteBuf) {
int offset = Short.BYTES;
int serviceLength = byteBuf.getShort(offset);
offset += Short.BYTES + serviceLength;
int methodLength = byteBuf.getShort(offset);
offset += Short.BYTES + methodLength;
int tracingLength = byteBuf.getShort(offset);
offset += Short.BYTES;
return tracingLength > 0 ? byteBuf.slice(offset, tracingLength) : Unpooled.EMPTY_BUFFER;
}
public static ByteBuf getMetadata(ByteBuf byteBuf) {
int offset = Short.BYTES;
int serviceLength = byteBuf.getShort(offset);
offset += Short.BYTES + serviceLength;
int methodLength = byteBuf.getShort(offset);
offset += Short.BYTES + methodLength;
int tracingLength = byteBuf.getShort(offset);
offset += Short.BYTES + tracingLength;
int metadataLength = byteBuf.readableBytes() - offset;
return metadataLength > 0 ? byteBuf.slice(offset, metadataLength) : Unpooled.EMPTY_BUFFER;
}
}