Optimize Request#extras, fix #1148.

master
Sutra Zhou 2024-03-03 18:33:00 +08:00
parent 7ededbea1a
commit 95d1f44150
2 changed files with 39 additions and 13 deletions

View File

@ -1,13 +1,14 @@
package us.codecraft.webmagic; 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.downloader.Downloader;
import us.codecraft.webmagic.model.HttpRequestBody; import us.codecraft.webmagic.model.HttpRequestBody;
import us.codecraft.webmagic.utils.Experimental; import us.codecraft.webmagic.utils.Experimental;
import java.io.Serializable;
import java.util.HashMap;
import java.util.Map;
/** /**
* Object contains url to crawl.<br> * Object contains url to crawl.<br>
* It contains some additional information.<br> * It contains some additional information.<br>
@ -35,7 +36,7 @@ public class Request implements Serializable {
/** /**
* Store additional information in extras. * Store additional information in extras.
*/ */
private Map<String, Object> extras; private Map<String, Object> extras = new HashMap<>();
/** /**
* cookies for current url, if not set use Site's cookies * cookies for current url, if not set use Site's cookies
@ -93,9 +94,6 @@ public class Request implements Serializable {
} }
public <T> Request putExtra(String key, T value) { public <T> Request putExtra(String key, T value) {
if (extras == null) {
extras = new HashMap<String, Object>();
}
extras.put(key, value); extras.put(key, value);
return this; return this;
} }
@ -105,11 +103,11 @@ public class Request implements Serializable {
} }
public Map<String, Object> getExtras() { public Map<String, Object> getExtras() {
return extras; return Collections.unmodifiableMap(extras);
} }
public Request setExtras(Map<String, Object> extras) { public Request setExtras(Map<String, Object> extras) {
this.extras = extras; this.extras.putAll(extras);
return this; return this;
} }

View File

@ -1,10 +1,14 @@
package us.codecraft.webmagic; package us.codecraft.webmagic;
import org.junit.Test;
import us.codecraft.webmagic.utils.HttpConstant;
import static org.assertj.core.api.Assertions.assertThat; 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 * @author code4crafter@gmail.com
* Date: 17/3/11 * Date: 17/3/11
@ -22,4 +26,28 @@ public class RequestTest {
assertThat(requestA).isNotEqualTo(requestB); assertThat(requestA).isNotEqualTo(requestB);
assertThat(requestA.hashCode()).isNotEqualTo(requestB.hashCode()); assertThat(requestA.hashCode()).isNotEqualTo(requestB.hashCode());
} }
@Test
public void testSetExtras() {
Request request = new Request();
Map<String, Object> extras = Collections.singletonMap("a", "1");
request.setExtras(extras);
request.putExtra("b", "2");
assertThat(request.<String>getExtra("a")).isEqualTo("1");
assertThat(request.<String>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");
}
} }