Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
111 changes: 111 additions & 0 deletions src/main/java/io/ipinfo/spring/IPinfoPlusSpring.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,111 @@
package io.ipinfo.spring;

import io.ipinfo.api.IPinfoPlus;
import io.ipinfo.api.model.IPResponsePlus;
import io.ipinfo.spring.strategies.attribute.AttributeStrategy;
import io.ipinfo.spring.strategies.attribute.SessionAttributeStrategy;
import io.ipinfo.spring.strategies.interceptor.BotInterceptorStrategy;
import io.ipinfo.spring.strategies.interceptor.InterceptorStrategy;
import io.ipinfo.spring.strategies.ip.IPStrategy;
import io.ipinfo.spring.strategies.ip.SimpleIPStrategy;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.HandlerInterceptor;

public class IPinfoPlusSpring implements HandlerInterceptor {

public static final String ATTRIBUTE_KEY =
"IPinfoOfficialSparkWrapper.IPResponsePlus";
private final IPinfoPlus ii;
private final AttributeStrategy attributeStrategy;
private final IPStrategy ipStrategy;
private final InterceptorStrategy interceptorStrategy;

IPinfoPlusSpring(
IPinfoPlus ii,
AttributeStrategy attributeStrategy,
IPStrategy ipStrategy,
InterceptorStrategy interceptorStrategy
) {
this.ii = ii;
this.attributeStrategy = attributeStrategy;
this.ipStrategy = ipStrategy;
this.interceptorStrategy = interceptorStrategy;
}

public static void main(String... args) {
System.out.println(
"This library is not meant to be run as a standalone jar."
);
System.exit(0);
}

@Override
public boolean preHandle(
HttpServletRequest request,
HttpServletResponse response,
Object handler
) throws Exception {
if (!interceptorStrategy.shouldRun(request)) {
return true;
}

// Don't waste an API call if we already have it.
// This should only happen for RequestAttributeStrategy and potentially
// other implementations.
if (attributeStrategy.hasPlusAttribute(request)) {
return true;
}

String ip = ipStrategy.getIPAddress(request);
if (ip == null) {
return true;
}

IPResponsePlus ipResponse = ii.lookupIP(ip);
attributeStrategy.storePlusAttribute(request, ipResponse);

return true;
}

public static class Builder {

private IPinfoPlus ii = new IPinfoPlus.Builder().build();
private AttributeStrategy attributeStrategy =
new SessionAttributeStrategy();
private IPStrategy ipStrategy = new SimpleIPStrategy();
private InterceptorStrategy interceptorStrategy =
new BotInterceptorStrategy();

public Builder setIPinfo(IPinfoPlus ii) {
this.ii = ii;
return this;
}

public Builder attributeStrategy(AttributeStrategy attributeStrategy) {
this.attributeStrategy = attributeStrategy;
return this;
}

public Builder ipStrategy(IPStrategy ipStrategy) {
this.ipStrategy = ipStrategy;
return this;
}

public Builder interceptorStrategy(
InterceptorStrategy interceptorStrategy
) {
this.interceptorStrategy = interceptorStrategy;
return this;
}

public IPinfoPlusSpring build() {
return new IPinfoPlusSpring(
ii,
attributeStrategy,
ipStrategy,
interceptorStrategy
);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import io.ipinfo.api.model.IPResponse;
import io.ipinfo.api.model.IPResponseCore;
import io.ipinfo.api.model.IPResponseLite;
import io.ipinfo.api.model.IPResponsePlus;
import jakarta.servlet.http.HttpServletRequest;

public interface AttributeStrategy {
Expand Down Expand Up @@ -55,4 +56,23 @@ default IPResponseCore getCoreAttribute(HttpServletRequest request) {
default boolean hasCoreAttribute(HttpServletRequest request) {
return getCoreAttribute(request) != null;
}

default void storePlusAttribute(
HttpServletRequest request,
IPResponsePlus response
) {
throw new UnsupportedOperationException(
"This strategy does not support IPResponsePlus."
);
}

default IPResponsePlus getPlusAttribute(HttpServletRequest request) {
throw new UnsupportedOperationException(
"This strategy does not support IPResponsePlus."
);
}

default boolean hasPlusAttribute(HttpServletRequest request) {
return getPlusAttribute(request) != null;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,10 @@
import io.ipinfo.api.model.IPResponse;
import io.ipinfo.api.model.IPResponseCore;
import io.ipinfo.api.model.IPResponseLite;
import io.ipinfo.api.model.IPResponsePlus;
import io.ipinfo.spring.IPinfoCoreSpring;
import io.ipinfo.spring.IPinfoLiteSpring;
import io.ipinfo.spring.IPinfoPlusSpring;
import io.ipinfo.spring.IPinfoSpring;
import jakarta.servlet.http.HttpServletRequest;

Expand Down Expand Up @@ -52,4 +54,19 @@ public IPResponseCore getCoreAttribute(HttpServletRequest request) {
IPinfoCoreSpring.ATTRIBUTE_KEY
);
}

@Override
public void storePlusAttribute(
HttpServletRequest request,
IPResponsePlus response
) {
request.setAttribute(IPinfoPlusSpring.ATTRIBUTE_KEY, response);
}

@Override
public IPResponsePlus getPlusAttribute(HttpServletRequest request) {
return (IPResponsePlus) request.getAttribute(
IPinfoPlusSpring.ATTRIBUTE_KEY
);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,10 @@
import io.ipinfo.api.model.IPResponse;
import io.ipinfo.api.model.IPResponseCore;
import io.ipinfo.api.model.IPResponseLite;
import io.ipinfo.api.model.IPResponsePlus;
import io.ipinfo.spring.IPinfoCoreSpring;
import io.ipinfo.spring.IPinfoLiteSpring;
import io.ipinfo.spring.IPinfoPlusSpring;
import io.ipinfo.spring.IPinfoSpring;
import jakarta.servlet.http.HttpServletRequest;

Expand Down Expand Up @@ -58,4 +60,21 @@ public IPResponseCore getCoreAttribute(HttpServletRequest request) {
.getSession()
.getAttribute(IPinfoCoreSpring.ATTRIBUTE_KEY);
}

@Override
public void storePlusAttribute(
HttpServletRequest request,
IPResponsePlus response
) {
request
.getSession()
.setAttribute(IPinfoPlusSpring.ATTRIBUTE_KEY, response);
}

@Override
public IPResponsePlus getPlusAttribute(HttpServletRequest request) {
return (IPResponsePlus) request
.getSession()
.getAttribute(IPinfoPlusSpring.ATTRIBUTE_KEY);
}
}
Loading