in apm-agent-core/src/main/java/co/elastic/apm/agent/impl/baggage/otel/Parser.java [66:141]
public void parseInto(BaggageImpl.Builder baggageBuilder) {
for (int i = 0, n = baggageHeader.length(); i < n; i++) {
char current = baggageHeader.charAt(i);
if (skipToNext) {
if (current == ',') {
reset(i + 1);
}
continue;
}
switch (current) {
case '=': {
if (state == State.KEY) {
if (key.tryTerminating(i, baggageHeader)) {
setState(State.VALUE, i + 1);
} else {
skipToNext = true;
}
} else if (state == State.VALUE) {
skipToNext = !value.tryNextChar(current, i);
}
break;
}
case ';': {
if (state == State.VALUE) {
skipToNext = !value.tryTerminating(i, baggageHeader);
setState(State.META, i + 1);
}
break;
}
case ',': {
switch (state) {
case VALUE:
value.tryTerminating(i, baggageHeader);
break;
case META:
meta = baggageHeader.substring(metaStart, i).trim();
break;
case KEY: // none
}
putBaggage(baggageBuilder, key.getValue(), value.getValue(), meta);
reset(i + 1);
break;
}
default: {
switch (state) {
case KEY:
skipToNext = !key.tryNextChar(current, i);
break;
case VALUE:
skipToNext = !value.tryNextChar(current, i);
break;
case META: // none
}
}
}
}
// need to finish parsing if there was no list element termination comma
switch (state) {
case KEY:
break;
case META: {
String rest = baggageHeader.substring(metaStart).trim();
putBaggage(baggageBuilder, key.getValue(), value.getValue(), rest);
break;
}
case VALUE: {
if (!skipToNext) {
value.tryTerminating(baggageHeader.length(), baggageHeader);
putBaggage(baggageBuilder, key.getValue(), value.getValue(), null);
break;
}
}
}
}