-
Notifications
You must be signed in to change notification settings - Fork 17
Expand file tree
/
Copy pathResponseUtil.java
More file actions
190 lines (168 loc) · 8.79 KB
/
ResponseUtil.java
File metadata and controls
190 lines (168 loc) · 8.79 KB
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
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
package com.uid2.operator.service;
import com.uid2.operator.monitoring.TokenResponseStatsCollector;
import com.uid2.shared.model.TokenVersion;
import com.uid2.shared.store.ISiteStore;
import io.vertx.core.http.HttpHeaders;
import io.vertx.core.json.JsonObject;
import io.vertx.ext.web.RoutingContext;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.HashMap;
public class ResponseUtil {
private static final Logger LOGGER = LoggerFactory.getLogger(ResponseUtil.class);
public static void SuccessNoBody(String status, RoutingContext rc) {
final JsonObject json = new JsonObject(new HashMap<>() {
{
put("status", status);
}
});
rc.response().putHeader(HttpHeaders.CONTENT_TYPE, "application/json")
.end(json.encode());
}
public static void Success(RoutingContext rc, Object body) {
final JsonObject json = new JsonObject(new HashMap<>() {
{
put("status", ResponseStatus.Success);
put("body", body);
}
});
rc.response().putHeader(HttpHeaders.CONTENT_TYPE, "application/json")
.end(json.encode());
}
public static JsonObject SuccessNoBodyV2(String status) {
final JsonObject json = new JsonObject(new HashMap<>() {
{
put("status", status);
}
});
return json;
}
public static void SuccessNoBodyV2(String status, RoutingContext rc) {
final JsonObject json = SuccessNoBodyV2(status);
rc.data().put("response", json);
}
public static JsonObject SuccessV2(Object body) {
return new JsonObject(new HashMap<>() {
{
put("status", ResponseStatus.Success);
put("body", body);
}
});
}
public static void SuccessV2(RoutingContext rc, Object body) {
final JsonObject json = SuccessV2(body);
rc.data().put("response", json);
}
public static void LogInfoAndSend400Response(RoutingContext rc, String message) {
LogInfoAndSendResponse(ResponseStatus.ClientError, 400, rc, message);
}
public static void SendClientErrorResponseAndRecordStats(String errorStatus, int statusCode, RoutingContext rc, String message, Integer siteId, TokenResponseStatsCollector.Endpoint endpoint, TokenResponseStatsCollector.ResponseStatus responseStatus, ISiteStore siteProvider, TokenResponseStatsCollector.PlatformType platformType)
{
if (ResponseStatus.ClientError.equals(errorStatus) ||
ResponseStatus.InvalidAppName.equals(errorStatus) ||
ResponseStatus.InvalidHttpOrigin.equals(errorStatus))
{
LogInfoAndSendResponse(errorStatus, statusCode, rc, message);
}
else {
LogWarningAndSendResponse(errorStatus, statusCode, rc, message);
}
recordTokenResponseStats(siteId, endpoint, responseStatus, siteProvider, null, platformType);
}
public static void SendServerErrorResponseAndRecordStats(RoutingContext rc, String message, Integer siteId, TokenResponseStatsCollector.Endpoint endpoint, TokenResponseStatsCollector.ResponseStatus responseStatus, ISiteStore siteProvider, Exception exception, TokenResponseStatsCollector.PlatformType platformType)
{
LogErrorAndSendResponse(ResponseStatus.UnknownError, 500, rc, message, exception);
rc.fail(500);
recordTokenResponseStats(siteId, endpoint, responseStatus, siteProvider, null, platformType);
}
public static void recordTokenResponseStats(Integer siteId, TokenResponseStatsCollector.Endpoint endpoint, TokenResponseStatsCollector.ResponseStatus responseStatus, ISiteStore siteProvider, TokenVersion advertisingTokenVersion, TokenResponseStatsCollector.PlatformType platformType) {
TokenResponseStatsCollector.record(siteProvider, siteId, endpoint, advertisingTokenVersion, responseStatus, platformType);
}
public static JsonObject Response(String status, String message) {
final JsonObject json = new JsonObject(new HashMap<>() {
{
put("status", status);
}
});
if (message != null) {
json.put("message", message);
}
return json;
}
public static void LogErrorAndSendResponse(String errorStatus, int statusCode, RoutingContext rc, String message) {
String msg = ComposeMessage(errorStatus, statusCode, message, new RoutingContextReader(rc), rc.request().remoteAddress().hostAddress());
LOGGER.error(msg);
final JsonObject json = Response(errorStatus, message);
rc.response().setStatusCode(statusCode).putHeader(HttpHeaders.CONTENT_TYPE, "application/json")
.end(json.encode());
}
public static void LogErrorAndSendResponse(String errorStatus, int statusCode, RoutingContext rc, String message, Exception exception) {
String msg = ComposeMessage(errorStatus, statusCode, message, new RoutingContextReader(rc), rc.request().remoteAddress().hostAddress());
LOGGER.error(msg, exception);
final JsonObject json = Response(errorStatus, message);
rc.response().setStatusCode(statusCode).putHeader(HttpHeaders.CONTENT_TYPE, "application/json")
.end(json.encode());
}
public static void LogInfoAndSendResponse(String status, int statusCode, RoutingContext rc, String message) {
String msg = ComposeMessage(status, statusCode, message, new RoutingContextReader(rc), rc.request().remoteAddress().hostAddress());
String contentType = rc.request().getHeader(HttpHeaders.CONTENT_TYPE);
String contentTypeStr = " Content-Type: " + (contentType != null ? contentType : "null");
LOGGER.warn(msg + contentTypeStr);
final JsonObject json = Response(status, message);
rc.response().setStatusCode(statusCode).putHeader(HttpHeaders.CONTENT_TYPE, "application/json")
.end(json.encode());
}
public static void LogWarningAndSendResponse(String status, int statusCode, RoutingContext rc, String message) {
String msg = ComposeMessage(status, statusCode, message, new RoutingContextReader(rc), rc.request().remoteAddress().hostAddress());
String contentType = rc.request().getHeader(HttpHeaders.CONTENT_TYPE);
String contentTypeStr = " Content-Type: " + (contentType != null ? contentType : "null");
LOGGER.warn(msg + contentTypeStr);
final JsonObject json = Response(status, message);
rc.response().setStatusCode(statusCode).putHeader(HttpHeaders.CONTENT_TYPE, "application/json")
.end(json.encode());
}
private static String ComposeMessage(String status, int statusCode, String message, RoutingContextReader contextReader, String clientAddress) {
JsonObject msgJsonObject = JsonObject.of(
"errorStatus", status,
"contact", contextReader.getContact(),
"siteId", contextReader.getSiteId(),
"path", contextReader.getPath(),
"statusCode", statusCode,
"clientAddress", clientAddress,
"message", message
);
final String referer = contextReader.getReferer();
final String origin = contextReader.getOrigin();
if (statusCode >= 400 && statusCode < 500) {
if (referer != null) {
msgJsonObject.put("referer", referer);
}
if (origin != null) {
msgJsonObject.put("origin", origin);
}
}
final String linkName = contextReader.getLinkName();
if (!linkName.isBlank()) {
msgJsonObject.put(SecureLinkValidatorService.SERVICE_LINK_NAME, linkName);
}
final String serviceName = contextReader.getServiceName();
if (!serviceName.isBlank()) {
msgJsonObject.put(SecureLinkValidatorService.SERVICE_NAME, serviceName);
}
return "Response to http request. " + msgJsonObject.encode();
}
public static class ResponseStatus {
public static final String Success = "success";
public static final String Unauthorized = "unauthorized";
public static final String ClientError = "client_error";
public static final String OptOut = "optout";
public static final String InvalidToken = "invalid_token";
public static final String ExpiredToken = "expired_token";
public static final String GenericError = "error";
public static final String InvalidClient = "invalid_client";
public static final String UnknownError = "unknown";
public static final String InsufficientUserConsent = "insufficient_user_consent";
public static final String InvalidHttpOrigin = "invalid_http_origin";
public static final String InvalidAppName = "invalid_app_name";
}
}