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
57 changes: 57 additions & 0 deletions .classpath
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
<classpathentry kind="src" output="target/classes" path="src/main/java">
<attributes>
<attribute name="optional" value="true"/>
<attribute name="maven.pomderived" value="true"/>
</attributes>
</classpathentry>
<classpathentry excluding="**" kind="src" output="target/classes" path="src/main/resources">
<attributes>
<attribute name="maven.pomderived" value="true"/>
<attribute name="optional" value="true"/>
</attributes>
</classpathentry>
<classpathentry kind="src" output="target/test-classes" path="src/test/java">
<attributes>
<attribute name="optional" value="true"/>
<attribute name="maven.pomderived" value="true"/>
<attribute name="test" value="true"/>
</attributes>
</classpathentry>
<classpathentry excluding="**" kind="src" output="target/test-classes" path="src/test/resources">
<attributes>
<attribute name="maven.pomderived" value="true"/>
<attribute name="test" value="true"/>
<attribute name="optional" value="true"/>
</attributes>
</classpathentry>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8">
<attributes>
<attribute name="maven.pomderived" value="true"/>
</attributes>
</classpathentry>
<classpathentry kind="con" path="org.eclipse.m2e.MAVEN2_CLASSPATH_CONTAINER">
<attributes>
<attribute name="maven.pomderived" value="true"/>
</attributes>
</classpathentry>
<classpathentry kind="src" path="target/generated-sources/annotations">
<attributes>
<attribute name="optional" value="true"/>
<attribute name="maven.pomderived" value="true"/>
<attribute name="ignore_optional_problems" value="true"/>
<attribute name="m2e-apt" value="true"/>
</attributes>
</classpathentry>
<classpathentry kind="src" output="target/test-classes" path="target/generated-test-sources/test-annotations">
<attributes>
<attribute name="optional" value="true"/>
<attribute name="maven.pomderived" value="true"/>
<attribute name="ignore_optional_problems" value="true"/>
<attribute name="m2e-apt" value="true"/>
<attribute name="test" value="true"/>
</attributes>
</classpathentry>
<classpathentry kind="output" path="target/classes"/>
</classpath>
34 changes: 34 additions & 0 deletions .project
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
<name>ipinfo-spring</name>
<comment></comment>
<projects>
</projects>
<buildSpec>
<buildCommand>
<name>org.eclipse.jdt.core.javabuilder</name>
<arguments>
</arguments>
</buildCommand>
<buildCommand>
<name>org.eclipse.m2e.core.maven2Builder</name>
<arguments>
</arguments>
</buildCommand>
</buildSpec>
<natures>
<nature>org.eclipse.jdt.core.javanature</nature>
<nature>org.eclipse.m2e.core.maven2Nature</nature>
</natures>
<filteredResources>
<filter>
<id>1768577910667</id>
<name></name>
<type>30</type>
<matcher>
<id>org.eclipse.core.resources.regexFilterMatcher</id>
<arguments>node_modules|\.git|__CREATED_BY_JAVA_LANGUAGE_SERVER__</arguments>
</matcher>
</filter>
</filteredResources>
</projectDescription>
4 changes: 4 additions & 0 deletions .settings/org.eclipse.core.resources.prefs
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
eclipse.preferences.version=1
encoding//src/main/java=UTF-8
encoding//src/test/java=UTF-8
encoding/<project>=UTF-8
2 changes: 2 additions & 0 deletions .settings/org.eclipse.jdt.apt.core.prefs
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
eclipse.preferences.version=1
org.eclipse.jdt.apt.aptEnabled=false
9 changes: 9 additions & 0 deletions .settings/org.eclipse.jdt.core.prefs
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
eclipse.preferences.version=1
org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
org.eclipse.jdt.core.compiler.compliance=1.8
org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled
org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning
org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=ignore
org.eclipse.jdt.core.compiler.processAnnotations=disabled
org.eclipse.jdt.core.compiler.release=disabled
org.eclipse.jdt.core.compiler.source=1.8
4 changes: 4 additions & 0 deletions .settings/org.eclipse.m2e.core.prefs
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
activeProfiles=
eclipse.preferences.version=1
resolveWorkspaceProjects=true
version=1
2 changes: 1 addition & 1 deletion pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@
<dependency>
<groupId>io.ipinfo</groupId>
<artifactId>ipinfo-api</artifactId>
<version>3.2.0</version>
<version>3.3.0</version>
<scope>compile</scope>
</dependency>
<dependency>
Expand Down
111 changes: 111 additions & 0 deletions src/main/java/io/ipinfo/spring/IPinfoResproxySpring.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,111 @@
package io.ipinfo.spring;

import io.ipinfo.api.IPinfo;
import io.ipinfo.api.model.ResproxyResponse;
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 IPinfoResproxySpring implements HandlerInterceptor {

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

IPinfoResproxySpring(
IPinfo 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.hasResproxyAttribute(request)) {
return true;
}

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

ResproxyResponse resproxyResponse = ii.lookupResproxy(ip);
attributeStrategy.storeResproxyAttribute(request, resproxyResponse);

return true;
}

public static class Builder {

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

public Builder setIPinfo(IPinfo 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 IPinfoResproxySpring build() {
return new IPinfoResproxySpring(
ii,
attributeStrategy,
ipStrategy,
interceptorStrategy
);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
import io.ipinfo.api.model.IPResponseCore;
import io.ipinfo.api.model.IPResponseLite;
import io.ipinfo.api.model.IPResponsePlus;
import io.ipinfo.api.model.ResproxyResponse;
import jakarta.servlet.http.HttpServletRequest;

public interface AttributeStrategy {
Expand Down Expand Up @@ -75,4 +76,23 @@ default IPResponsePlus getPlusAttribute(HttpServletRequest request) {
default boolean hasPlusAttribute(HttpServletRequest request) {
return getPlusAttribute(request) != null;
}

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

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

default boolean hasResproxyAttribute(HttpServletRequest request) {
return getResproxyAttribute(request) != null;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,11 @@
import io.ipinfo.api.model.IPResponseCore;
import io.ipinfo.api.model.IPResponseLite;
import io.ipinfo.api.model.IPResponsePlus;
import io.ipinfo.api.model.ResproxyResponse;
import io.ipinfo.spring.IPinfoCoreSpring;
import io.ipinfo.spring.IPinfoLiteSpring;
import io.ipinfo.spring.IPinfoPlusSpring;
import io.ipinfo.spring.IPinfoResproxySpring;
import io.ipinfo.spring.IPinfoSpring;
import jakarta.servlet.http.HttpServletRequest;

Expand Down Expand Up @@ -77,4 +79,21 @@ public IPResponsePlus getPlusAttribute(HttpServletRequest request) {
.getSession()
.getAttribute(IPinfoPlusSpring.ATTRIBUTE_KEY);
}

@Override
public void storeResproxyAttribute(
HttpServletRequest request,
ResproxyResponse response
) {
request
.getSession()
.setAttribute(IPinfoResproxySpring.ATTRIBUTE_KEY, response);
}

@Override
public ResproxyResponse getResproxyAttribute(HttpServletRequest request) {
return (ResproxyResponse) request
.getSession()
.getAttribute(IPinfoResproxySpring.ATTRIBUTE_KEY);
}
}
Loading