WebPreferencesRequestAbstract.java
4.77 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
package com.mumfrey.webprefs.framework;
import java.net.URI;
import java.util.HashMap;
import java.util.Map;
import java.util.regex.Pattern;
import net.minecraft.util.Session;
import com.google.gson.Gson;
import com.mumfrey.webprefs.exceptions.InvalidRequestException;
import com.mumfrey.webprefs.exceptions.InvalidRequestKeyException;
import com.mumfrey.webprefs.exceptions.InvalidRequestValueException;
import com.mumfrey.webprefs.exceptions.InvalidResponseException;
import com.mumfrey.webprefs.interfaces.IWebPreferencesRequest;
import com.mumfrey.webprefs.interfaces.IWebPreferencesResponse;
import com.mumfrey.webprefs.interfaces.IWebPreferencesServiceDelegate;
abstract class WebPreferencesRequestAbstract implements IWebPreferencesRequest
{
private static final long serialVersionUID = 1L;
private static final Pattern keyPattern = Pattern.compile("^[a-z0-9_\\-\\.]{1,32}$");
private static final Gson gson = new Gson();
private final transient URI uri;
private final transient IWebPreferencesServiceDelegate delegate;
private final transient String uuid;
public WebPreferencesRequestAbstract(IWebPreferencesServiceDelegate delegate, String uuid)
{
if (delegate == null)
{
throw new IllegalArgumentException("Attempted to create a request with no delegate");
}
this.uri = URI.create(String.format("http://%s%s", delegate.getHostName(), this.getPath()));
this.delegate = delegate;
this.uuid = uuid;
}
protected abstract String getPath();
@Override
public IWebPreferencesServiceDelegate getDelegate()
{
return this.delegate;
}
@Override
public URI getRequestURI()
{
return this.uri;
}
@Override
public String getUUID()
{
return this.uuid;
}
@Override
public Map<String, String> getPostVars()
{
Map<String, String> params = new HashMap<String, String>();
this.addParams(params);
return params;
}
protected void addParams(Map<String, String> params)
{
if (this.isValidationRequired())
{
Session session = this.getDelegate().getSession();
if (session == null)
{
throw new InvalidRequestException(RequestFailureReason.NO_SESSION, "Request has no session");
}
params.put("u", session.getUsername());
}
params.put("i", this.uuid);
params.put("j", this.toJson());
}
@Override
public final void onReceivedResponse(IWebPreferencesResponse response)
{
if (response == null)
{
throw new InvalidResponseException(null, "Error reading server response");
}
if (response.getResponse().startsWith("500"))
{
throw new InvalidResponseException(RequestFailureReason.SERVER_ERROR,
"The server returned an invalid resonse: " + response.getResponse(), response.getThrowable());
}
if (!response.getResponse().startsWith("200"))
{
RequestFailureReason reason = RequestFailureReason.UNKNOWN;
if (response.getResponse().startsWith("429")) reason = RequestFailureReason.THROTTLED;
if (response.getResponse().startsWith("401")) reason = RequestFailureReason.UNAUTHORISED;
String message = response.getMessage();
throw new InvalidResponseException(reason,
"The server responsed with " + response.getResponse() + (message != null ? " \"" + message + "\"" : ""));
}
if (!this.getUUID().equals(response.getUUID()))
{
throw new InvalidResponseException(RequestFailureReason.UUID_MISMATCH, "The response UUID did not match the request");
}
this.validateResponse(response);
}
protected abstract void validateResponse(IWebPreferencesResponse response);
protected final void validateKey(String key)
{
if (key == null || !WebPreferencesRequestAbstract.keyPattern.matcher(key).matches())
{
throw new InvalidRequestKeyException("The specified key [" + key + "] is not valid");
}
}
protected final void validateValue(String key, String value)
{
if (value == null || value.length() > 255)
{
throw new InvalidRequestValueException("The specified value [" + value + "] for key [" + key + "] is not valid");
}
}
public String toJson()
{
return WebPreferencesRequestAbstract.gson.toJson(this);
}
@Override
public String toString()
{
try
{
return WebPreferencesRequestAbstract.gson.toJson(this);
}
catch (Throwable th)
{
return "{\"Invalid JSON\"}";
}
}
}