1 /*
2  * ====================================================================
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  * ====================================================================
20  *
21  * This software consists of voluntary contributions made by many
22  * individuals on behalf of the Apache Software Foundation.  For more
23  * information on the Apache Software Foundation, please see
24  * <http://www.apache.org/>.
25  *
26  */

27 package org.apache.http.impl.cookie;
28
29 import org.apache.http.annotation.Contract;
30 import org.apache.http.annotation.ThreadingBehavior;
31 import org.apache.http.cookie.ClientCookie;
32 import org.apache.http.cookie.CommonCookieAttributeHandler;
33 import org.apache.http.cookie.Cookie;
34 import org.apache.http.cookie.CookieOrigin;
35 import org.apache.http.cookie.MalformedCookieException;
36 import org.apache.http.cookie.SetCookie;
37 import org.apache.http.util.Args;
38 import org.apache.http.util.TextUtils;
39
40 /**
41  *
42  * @since 4.0
43  */

44 @Contract(threading = ThreadingBehavior.IMMUTABLE)
45 public class BasicPathHandler implements CommonCookieAttributeHandler {
46
47     public BasicPathHandler() {
48         super();
49     }
50
51     @Override
52     public void parse(
53             final SetCookie cookie, final String value) throws MalformedCookieException {
54         Args.notNull(cookie, "Cookie");
55         cookie.setPath(!TextUtils.isBlank(value) ? value : "/");
56     }
57
58     @Override
59     public void validate(final Cookie cookie, final CookieOrigin origin)
60             throws MalformedCookieException {
61     }
62
63     static boolean pathMatch(final String uriPath, final String cookiePath) {
64         String normalizedCookiePath = cookiePath;
65         if (normalizedCookiePath == null) {
66             normalizedCookiePath = "/";
67         }
68         if (normalizedCookiePath.length() > 1 && normalizedCookiePath.endsWith("/")) {
69             normalizedCookiePath = normalizedCookiePath.substring(0, normalizedCookiePath.length() - 1);
70         }
71         if (uriPath.startsWith(normalizedCookiePath)) {
72             if (normalizedCookiePath.equals("/")) {
73                 return true;
74             }
75             if (uriPath.length() == normalizedCookiePath.length()) {
76                 return true;
77             }
78             if (uriPath.charAt(normalizedCookiePath.length()) == '/') {
79                 return true;
80             }
81         }
82         return false;
83     }
84
85     @Override
86     public boolean match(final Cookie cookie, final CookieOrigin origin) {
87         Args.notNull(cookie, "Cookie");
88         Args.notNull(origin, "Cookie origin");
89         return pathMatch(origin.getPath(), cookie.getPath());
90     }
91
92     @Override
93     public String getAttributeName() {
94         return ClientCookie.PATH_ATTR;
95     }
96
97 }
98