001/* 002 * ==================================================================== 003 * Licensed to the Apache Software Foundation (ASF) under one 004 * or more contributor license agreements. See the NOTICE file 005 * distributed with this work for additional information 006 * regarding copyright ownership. The ASF licenses this file 007 * to you under the Apache License, Version 2.0 (the 008 * "License"); you may not use this file except in compliance 009 * with the License. You may obtain a copy of the License at 010 * 011 * http://www.apache.org/licenses/LICENSE-2.0 012 * 013 * Unless required by applicable law or agreed to in writing, 014 * software distributed under the License is distributed on an 015 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 016 * KIND, either express or implied. See the License for the 017 * specific language governing permissions and limitations 018 * under the License. 019 * ==================================================================== 020 * 021 * This software consists of voluntary contributions made by many 022 * individuals on behalf of the Apache Software Foundation. For more 023 * information on the Apache Software Foundation, please see 024 * <http://www.apache.org/>. 025 * 026 */ 027 028package org.apache.http.impl.cookie; 029 030import org.apache.http.annotation.Contract; 031import org.apache.http.annotation.ThreadingBehavior; 032import org.apache.http.cookie.ClientCookie; 033import org.apache.http.cookie.CommonCookieAttributeHandler; 034import org.apache.http.cookie.Cookie; 035import org.apache.http.cookie.CookieOrigin; 036import org.apache.http.cookie.CookieRestrictionViolationException; 037import org.apache.http.cookie.MalformedCookieException; 038import org.apache.http.cookie.SetCookie; 039import org.apache.http.cookie.SetCookie2; 040import org.apache.http.util.Args; 041 042/** 043 * {@code "Version"} cookie attribute handler for RFC 2965 cookie spec. 044 * 045 * @since 4.0 046 */ 047@Contract(threading = ThreadingBehavior.IMMUTABLE) 048public class RFC2965VersionAttributeHandler implements CommonCookieAttributeHandler { 049 050 public RFC2965VersionAttributeHandler() { 051 super(); 052 } 053 054 /** 055 * Parse cookie version attribute. 056 */ 057 @Override 058 public void parse(final SetCookie cookie, final String value) 059 throws MalformedCookieException { 060 Args.notNull(cookie, "Cookie"); 061 if (value == null) { 062 throw new MalformedCookieException( 063 "Missing value for version attribute"); 064 } 065 int version = -1; 066 try { 067 version = Integer.parseInt(value); 068 } catch (final NumberFormatException e) { 069 version = -1; 070 } 071 if (version < 0) { 072 throw new MalformedCookieException("Invalid cookie version."); 073 } 074 cookie.setVersion(version); 075 } 076 077 /** 078 * validate cookie version attribute. Version attribute is REQUIRED. 079 */ 080 @Override 081 public void validate(final Cookie cookie, final CookieOrigin origin) 082 throws MalformedCookieException { 083 Args.notNull(cookie, "Cookie"); 084 if (cookie instanceof SetCookie2) { 085 if (cookie instanceof ClientCookie 086 && !((ClientCookie) cookie).containsAttribute(ClientCookie.VERSION_ATTR)) { 087 throw new CookieRestrictionViolationException( 088 "Violates RFC 2965. Version attribute is required."); 089 } 090 } 091 } 092 093 @Override 094 public boolean match(final Cookie cookie, final CookieOrigin origin) { 095 return true; 096 } 097 098 @Override 099 public String getAttributeName() { 100 return ClientCookie.VERSION_ATTR; 101 } 102 103}