Skip to content

Commit eb77e26

Browse files
authored
Merge pull request #28 from ipinfo/silvano/eng-513-add-plus-bundle-support-in-ipinfospring-library
Add support for Plus bundle
2 parents 6cd04d0 + 98515c3 commit eb77e26

File tree

5 files changed

+368
-0
lines changed

5 files changed

+368
-0
lines changed
Lines changed: 111 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,111 @@
1+
package io.ipinfo.spring;
2+
3+
import io.ipinfo.api.IPinfoPlus;
4+
import io.ipinfo.api.model.IPResponsePlus;
5+
import io.ipinfo.spring.strategies.attribute.AttributeStrategy;
6+
import io.ipinfo.spring.strategies.attribute.SessionAttributeStrategy;
7+
import io.ipinfo.spring.strategies.interceptor.BotInterceptorStrategy;
8+
import io.ipinfo.spring.strategies.interceptor.InterceptorStrategy;
9+
import io.ipinfo.spring.strategies.ip.IPStrategy;
10+
import io.ipinfo.spring.strategies.ip.SimpleIPStrategy;
11+
import jakarta.servlet.http.HttpServletRequest;
12+
import jakarta.servlet.http.HttpServletResponse;
13+
import org.springframework.web.servlet.HandlerInterceptor;
14+
15+
public class IPinfoPlusSpring implements HandlerInterceptor {
16+
17+
public static final String ATTRIBUTE_KEY =
18+
"IPinfoOfficialSparkWrapper.IPResponsePlus";
19+
private final IPinfoPlus ii;
20+
private final AttributeStrategy attributeStrategy;
21+
private final IPStrategy ipStrategy;
22+
private final InterceptorStrategy interceptorStrategy;
23+
24+
IPinfoPlusSpring(
25+
IPinfoPlus ii,
26+
AttributeStrategy attributeStrategy,
27+
IPStrategy ipStrategy,
28+
InterceptorStrategy interceptorStrategy
29+
) {
30+
this.ii = ii;
31+
this.attributeStrategy = attributeStrategy;
32+
this.ipStrategy = ipStrategy;
33+
this.interceptorStrategy = interceptorStrategy;
34+
}
35+
36+
public static void main(String... args) {
37+
System.out.println(
38+
"This library is not meant to be run as a standalone jar."
39+
);
40+
System.exit(0);
41+
}
42+
43+
@Override
44+
public boolean preHandle(
45+
HttpServletRequest request,
46+
HttpServletResponse response,
47+
Object handler
48+
) throws Exception {
49+
if (!interceptorStrategy.shouldRun(request)) {
50+
return true;
51+
}
52+
53+
// Don't waste an API call if we already have it.
54+
// This should only happen for RequestAttributeStrategy and potentially
55+
// other implementations.
56+
if (attributeStrategy.hasPlusAttribute(request)) {
57+
return true;
58+
}
59+
60+
String ip = ipStrategy.getIPAddress(request);
61+
if (ip == null) {
62+
return true;
63+
}
64+
65+
IPResponsePlus ipResponse = ii.lookupIP(ip);
66+
attributeStrategy.storePlusAttribute(request, ipResponse);
67+
68+
return true;
69+
}
70+
71+
public static class Builder {
72+
73+
private IPinfoPlus ii = new IPinfoPlus.Builder().build();
74+
private AttributeStrategy attributeStrategy =
75+
new SessionAttributeStrategy();
76+
private IPStrategy ipStrategy = new SimpleIPStrategy();
77+
private InterceptorStrategy interceptorStrategy =
78+
new BotInterceptorStrategy();
79+
80+
public Builder setIPinfo(IPinfoPlus ii) {
81+
this.ii = ii;
82+
return this;
83+
}
84+
85+
public Builder attributeStrategy(AttributeStrategy attributeStrategy) {
86+
this.attributeStrategy = attributeStrategy;
87+
return this;
88+
}
89+
90+
public Builder ipStrategy(IPStrategy ipStrategy) {
91+
this.ipStrategy = ipStrategy;
92+
return this;
93+
}
94+
95+
public Builder interceptorStrategy(
96+
InterceptorStrategy interceptorStrategy
97+
) {
98+
this.interceptorStrategy = interceptorStrategy;
99+
return this;
100+
}
101+
102+
public IPinfoPlusSpring build() {
103+
return new IPinfoPlusSpring(
104+
ii,
105+
attributeStrategy,
106+
ipStrategy,
107+
interceptorStrategy
108+
);
109+
}
110+
}
111+
}

src/main/java/io/ipinfo/spring/strategies/attribute/AttributeStrategy.java

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import io.ipinfo.api.model.IPResponse;
44
import io.ipinfo.api.model.IPResponseCore;
55
import io.ipinfo.api.model.IPResponseLite;
6+
import io.ipinfo.api.model.IPResponsePlus;
67
import jakarta.servlet.http.HttpServletRequest;
78

89
public interface AttributeStrategy {
@@ -55,4 +56,23 @@ default IPResponseCore getCoreAttribute(HttpServletRequest request) {
5556
default boolean hasCoreAttribute(HttpServletRequest request) {
5657
return getCoreAttribute(request) != null;
5758
}
59+
60+
default void storePlusAttribute(
61+
HttpServletRequest request,
62+
IPResponsePlus response
63+
) {
64+
throw new UnsupportedOperationException(
65+
"This strategy does not support IPResponsePlus."
66+
);
67+
}
68+
69+
default IPResponsePlus getPlusAttribute(HttpServletRequest request) {
70+
throw new UnsupportedOperationException(
71+
"This strategy does not support IPResponsePlus."
72+
);
73+
}
74+
75+
default boolean hasPlusAttribute(HttpServletRequest request) {
76+
return getPlusAttribute(request) != null;
77+
}
5878
}

src/main/java/io/ipinfo/spring/strategies/attribute/RequestAttributeStrategy.java

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,10 @@
33
import io.ipinfo.api.model.IPResponse;
44
import io.ipinfo.api.model.IPResponseCore;
55
import io.ipinfo.api.model.IPResponseLite;
6+
import io.ipinfo.api.model.IPResponsePlus;
67
import io.ipinfo.spring.IPinfoCoreSpring;
78
import io.ipinfo.spring.IPinfoLiteSpring;
9+
import io.ipinfo.spring.IPinfoPlusSpring;
810
import io.ipinfo.spring.IPinfoSpring;
911
import jakarta.servlet.http.HttpServletRequest;
1012

@@ -52,4 +54,19 @@ public IPResponseCore getCoreAttribute(HttpServletRequest request) {
5254
IPinfoCoreSpring.ATTRIBUTE_KEY
5355
);
5456
}
57+
58+
@Override
59+
public void storePlusAttribute(
60+
HttpServletRequest request,
61+
IPResponsePlus response
62+
) {
63+
request.setAttribute(IPinfoPlusSpring.ATTRIBUTE_KEY, response);
64+
}
65+
66+
@Override
67+
public IPResponsePlus getPlusAttribute(HttpServletRequest request) {
68+
return (IPResponsePlus) request.getAttribute(
69+
IPinfoPlusSpring.ATTRIBUTE_KEY
70+
);
71+
}
5572
}

src/main/java/io/ipinfo/spring/strategies/attribute/SessionAttributeStrategy.java

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,10 @@
33
import io.ipinfo.api.model.IPResponse;
44
import io.ipinfo.api.model.IPResponseCore;
55
import io.ipinfo.api.model.IPResponseLite;
6+
import io.ipinfo.api.model.IPResponsePlus;
67
import io.ipinfo.spring.IPinfoCoreSpring;
78
import io.ipinfo.spring.IPinfoLiteSpring;
9+
import io.ipinfo.spring.IPinfoPlusSpring;
810
import io.ipinfo.spring.IPinfoSpring;
911
import jakarta.servlet.http.HttpServletRequest;
1012

@@ -58,4 +60,21 @@ public IPResponseCore getCoreAttribute(HttpServletRequest request) {
5860
.getSession()
5961
.getAttribute(IPinfoCoreSpring.ATTRIBUTE_KEY);
6062
}
63+
64+
@Override
65+
public void storePlusAttribute(
66+
HttpServletRequest request,
67+
IPResponsePlus response
68+
) {
69+
request
70+
.getSession()
71+
.setAttribute(IPinfoPlusSpring.ATTRIBUTE_KEY, response);
72+
}
73+
74+
@Override
75+
public IPResponsePlus getPlusAttribute(HttpServletRequest request) {
76+
return (IPResponsePlus) request
77+
.getSession()
78+
.getAttribute(IPinfoPlusSpring.ATTRIBUTE_KEY);
79+
}
6180
}

0 commit comments

Comments
 (0)