• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

zalando / logbook / 5242

09 Jan 2026 05:56PM UTC coverage: 98.199% (-1.8%) from 100.0%
5242

push

github

web-flow
Fix coveral on main builds (#2201)

* Switch to com.github.hazendaz.maven:coveralls-maven-plugin as org.eluder.coveralls is deprecated

* tmp allow coveral on PRs

* revert the tmp allow coveral on PRs

* use ${project.artifactId} instaed of ${artifactId} in pom.xml

754 of 768 branches covered (98.18%)

3871 of 3942 relevant lines covered (98.2%)

0.98 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

85.71
/logbook-json/src/main/java/org/zalando/logbook/json/FastJsonHttpLogFormatter.java
1
package org.zalando.logbook.json;
2

3
import tools.jackson.core.JsonGenerator;
4
import tools.jackson.core.ObjectWriteContext;
5
import tools.jackson.core.json.JsonFactory;
6
import tools.jackson.databind.json.JsonMapper;
7
import lombok.AllArgsConstructor;
8
import org.apiguardian.api.API;
9
import org.zalando.logbook.ContentType;
10
import org.zalando.logbook.Correlation;
11
import org.zalando.logbook.HttpLogFormatter;
12
import org.zalando.logbook.HttpMessage;
13
import org.zalando.logbook.HttpRequest;
14
import org.zalando.logbook.HttpResponse;
15
import org.zalando.logbook.Precorrelation;
16

17
import java.io.IOException;
18
import java.io.StringWriter;
19
import java.util.List;
20
import java.util.Map;
21

22
import static org.apiguardian.api.API.Status.STABLE;
23

24
/**
25
 * A custom {@link HttpLogFormatter} that produces JSON objects.
26
 */
27
@API(status = STABLE)
28
@AllArgsConstructor
29
public final class FastJsonHttpLogFormatter implements HttpLogFormatter {
30

31
    private final JsonFactory factory;
32

33
    private final JsonFieldWriter delegate;
34

35
    public FastJsonHttpLogFormatter() {
36
        this(new JsonMapper());
×
37
    }
×
38

39
    public FastJsonHttpLogFormatter(final JsonMapper mapper) {
40
        this(mapper, new DefaultJsonFieldWriter());
1✔
41
    }
1✔
42

43
    public FastJsonHttpLogFormatter(final JsonMapper mapper, final JsonFieldWriter writer) {
44
        this(mapper.tokenStreamFactory(), writer);
1✔
45
    }
1✔
46

47
    @FunctionalInterface
48
    private interface Formatter<C extends Precorrelation, H extends HttpMessage> {
49
        void format(C correlation, H message, JsonGenerator generator) throws IOException;
50
    }
51

52
    @Override
53
    public String format(
54
            final Precorrelation precorrelation,
55
            final HttpRequest request) throws IOException {
56

57
        return format(precorrelation, request, delegate::write);
1✔
58
    }
59

60
    @Override
61
    public String format(
62
            final Correlation correlation,
63
            final HttpResponse response) throws IOException {
64

65
        return format(correlation, response, delegate::write);
×
66
    }
67

68
    private <C extends Precorrelation, H extends HttpMessage> String format(
69
            final C correlation,
70
            final H message,
71
            final Formatter<C, H> formatter) throws IOException {
72

73
        final StringWriter writer = new StringWriter(message.getBody().length + 2048);
1✔
74

75
        try (final JsonGenerator generator = factory.createGenerator(ObjectWriteContext.empty(), writer)) {
1✔
76
            generator.writeStartObject();
1✔
77
            formatter.format(correlation, message, generator);
1✔
78
            delegate.write(message, generator);
1✔
79
            generator.writeEndObject();
1✔
80
        }
81

82
        return writer.toString();
1✔
83
    }
84

85
    private static class DefaultJsonFieldWriter implements JsonFieldWriter {
86

87
        @Override
88
        public <M extends HttpMessage> void write(M message, JsonGenerator generator) throws IOException {
89
            writeHeaders(message, generator);
1✔
90
            writeBody(message, generator);
1✔
91
        }
1✔
92

93
        private void writeHeaders(
94
                final HttpMessage message,
95
                final JsonGenerator generator) {
96

97
            final Map<String, List<String>> headers = message.getHeaders();
1✔
98

99
            if (headers.isEmpty()) {
1!
100
                return;
×
101
            }
102

103
            generator.writeName("headers");
1✔
104
            generator.writeStartObject();
1✔
105
            for (Map.Entry<String, List<String>> entry : headers.entrySet()) {
1✔
106
                generator.writeName(entry.getKey());
1✔
107
                generator.writeStartArray();
1✔
108
                for (String value : entry.getValue()) {
1✔
109
                    generator.writeString(value);
1✔
110
                }
1✔
111
                generator.writeEndArray();
1✔
112
            }
1✔
113
            generator.writeEndObject();
1✔
114
        }
1✔
115

116
        private void writeBody(
117
                final HttpMessage message,
118
                final JsonGenerator generator) throws IOException {
119

120
            final String body = message.getBodyAsString();
1✔
121

122
            if (body.isEmpty()) {
1!
123
                return;
×
124
            }
125
            generator.writeName("body");
1✔
126

127
            final String contentType = message.getContentType();
1✔
128

129
            if (ContentType.isJsonMediaType(contentType)) {
1!
130
                generator.writeRawValue(body);
1✔
131
            } else {
132
                generator.writeString(body);
×
133
            }
134
        }
1✔
135
    }
136

137
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc