1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package org.esigate.url;
17
18 import org.apache.http.cookie.Cookie;
19 import org.apache.http.impl.cookie.BasicClientCookie;
20 import org.esigate.api.BaseUrlRetrieveStrategy;
21 import org.esigate.http.IncomingRequest;
22
23 public class StickySessionBaseUrlRetrieveStrategy implements BaseUrlRetrieveStrategy {
24 public static final String ESI_SESSION_COOKIE_NAME = "_esigate_session_cookie";
25 private final String[] urls;
26
27 public StickySessionBaseUrlRetrieveStrategy(String[] urls) {
28 super();
29 this.urls = urls;
30 }
31
32 private int generateIndex() {
33 return (int) (Math.random() * this.urls.length);
34 }
35
36 @Override
37 public String getBaseURL(IncomingRequest originalRequest) {
38 Cookie sessionCookie = getEsiSessionCookie(originalRequest.getCookies());
39 int index = 0;
40 boolean toGenerate = true;
41
42 if (null != sessionCookie) {
43 toGenerate = false;
44 String indexStr = sessionCookie.getValue();
45
46 if (null != indexStr) {
47 try {
48 index = Integer.parseInt(indexStr);
49 } catch (Exception e) {
50 index = -1;
51 }
52 if (index < 0 || index >= this.urls.length) {
53 toGenerate = true;
54 }
55 } else {
56 toGenerate = true;
57 }
58 }
59 if (toGenerate) {
60 index = generateIndex();
61 Cookie cookie = new BasicClientCookie(ESI_SESSION_COOKIE_NAME, Integer.toString(index));
62 originalRequest.addNewCookie(cookie);
63 }
64
65 return this.urls[index];
66 }
67
68 private Cookie getEsiSessionCookie(Cookie[] cookies) {
69 Cookie ret = null;
70 if (null != cookies && cookies.length > 0) {
71 for (Cookie cookie : cookies) {
72 if (ESI_SESSION_COOKIE_NAME.equals(cookie.getName())) {
73 ret = cookie;
74 break;
75 }
76 }
77 }
78 return ret;
79 }
80
81 }