diff --git a/webmagic-core/src/main/java/us/codecraft/webmagic/Request.java b/webmagic-core/src/main/java/us/codecraft/webmagic/Request.java
index 9fc2861..a59b206 100644
--- a/webmagic-core/src/main/java/us/codecraft/webmagic/Request.java
+++ b/webmagic-core/src/main/java/us/codecraft/webmagic/Request.java
@@ -1,13 +1,14 @@
package us.codecraft.webmagic;
+import java.io.Serializable;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+
import us.codecraft.webmagic.downloader.Downloader;
import us.codecraft.webmagic.model.HttpRequestBody;
import us.codecraft.webmagic.utils.Experimental;
-import java.io.Serializable;
-import java.util.HashMap;
-import java.util.Map;
-
/**
* Object contains url to crawl.
* It contains some additional information.
@@ -35,7 +36,7 @@ public class Request implements Serializable {
/**
* Store additional information in extras.
*/
- private Map extras;
+ private Map extras = new HashMap<>();
/**
* cookies for current url, if not set use Site's cookies
@@ -93,9 +94,6 @@ public class Request implements Serializable {
}
public Request putExtra(String key, T value) {
- if (extras == null) {
- extras = new HashMap();
- }
extras.put(key, value);
return this;
}
@@ -105,11 +103,11 @@ public class Request implements Serializable {
}
public Map getExtras() {
- return extras;
+ return Collections.unmodifiableMap(extras);
}
public Request setExtras(Map extras) {
- this.extras = extras;
+ this.extras.putAll(extras);
return this;
}
diff --git a/webmagic-core/src/test/java/us/codecraft/webmagic/RequestTest.java b/webmagic-core/src/test/java/us/codecraft/webmagic/RequestTest.java
index c7e4943..b8f699a 100644
--- a/webmagic-core/src/test/java/us/codecraft/webmagic/RequestTest.java
+++ b/webmagic-core/src/test/java/us/codecraft/webmagic/RequestTest.java
@@ -1,10 +1,14 @@
package us.codecraft.webmagic;
-import org.junit.Test;
-import us.codecraft.webmagic.utils.HttpConstant;
-
import static org.assertj.core.api.Assertions.assertThat;
+import java.util.Collections;
+import java.util.Map;
+
+import org.junit.Test;
+
+import us.codecraft.webmagic.utils.HttpConstant;
+
/**
* @author code4crafter@gmail.com
* Date: 17/3/11
@@ -22,4 +26,28 @@ public class RequestTest {
assertThat(requestA).isNotEqualTo(requestB);
assertThat(requestA.hashCode()).isNotEqualTo(requestB.hashCode());
}
+
+ @Test
+ public void testSetExtras() {
+ Request request = new Request();
+ Map extras = Collections.singletonMap("a", "1");
+ request.setExtras(extras);
+ request.putExtra("b", "2");
+ assertThat(request.getExtra("a")).isEqualTo("1");
+ assertThat(request.getExtra("b")).isEqualTo("2");
+ }
+
+ @Test
+ public void testGetExtras() {
+ Request request = new Request();
+ request.putExtra("a", "1");
+ assertThat(request.getExtras()).containsEntry("a", "1");
+ }
+
+ @Test(expected = UnsupportedOperationException.class)
+ public void testGetExtrasShouldBeUnmodifiable() {
+ Request request = new Request();
+ request.getExtras().put("a", "1");
+ }
+
}