15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/*
25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2008 Apple Inc. All Rights Reserved.
35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Redistribution and use in source and binary forms, with or without
55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * modification, are permitted provided that the following conditions
65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * are met:
75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 1. Redistributions of source code must retain the above copyright
85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *    notice, this list of conditions and the following disclaimer.
95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 2. Redistributions in binary form must reproduce the above copyright
105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *    notice, this list of conditions and the following disclaimer in the
115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *    documentation and/or other materials provided with the distribution.
125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
2302772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */
265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#ifndef CrossOriginPreflightResultCache_h
285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#define CrossOriginPreflightResultCache_h
295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
30e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)#include "core/fetch/ResourceLoaderOptions.h"
3151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)#include "platform/weborigin/KURLHash.h"
32521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)#include "wtf/HashMap.h"
33521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)#include "wtf/HashSet.h"
34521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)#include "wtf/PassOwnPtr.h"
35521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)#include "wtf/text/StringHash.h"
365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
37c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)namespace blink {
385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    class HTTPHeaderMap;
405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    class ResourceResponse;
415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    class CrossOriginPreflightResultCacheItem {
435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        WTF_MAKE_NONCOPYABLE(CrossOriginPreflightResultCacheItem); WTF_MAKE_FAST_ALLOCATED;
445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    public:
455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        CrossOriginPreflightResultCacheItem(StoredCredentials credentials)
465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            : m_absoluteExpiryTime(0)
475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            , m_credentials(credentials)
485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        {
495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        bool parse(const ResourceResponse&, String& errorDescription);
525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        bool allowsCrossOriginMethod(const String&, String& errorDescription) const;
535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        bool allowsCrossOriginHeaders(const HTTPHeaderMap&, String& errorDescription) const;
545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        bool allowsRequest(StoredCredentials, const String& method, const HTTPHeaderMap& requestHeaders) const;
555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    private:
575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        typedef HashSet<String, CaseFoldingHash> HeadersSet;
585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // FIXME: A better solution to holding onto the absolute expiration time might be
605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // to start a timer for the expiration delta that removes this from the cache when
615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // it fires.
625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        double m_absoluteExpiryTime;
635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        StoredCredentials m_credentials;
645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        HashSet<String> m_methods;
655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        HeadersSet m_headers;
665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    };
675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    class CrossOriginPreflightResultCache {
695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        WTF_MAKE_NONCOPYABLE(CrossOriginPreflightResultCache); WTF_MAKE_FAST_ALLOCATED;
705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    public:
715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        static CrossOriginPreflightResultCache& shared();
725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        void appendEntry(const String& origin, const KURL&, PassOwnPtr<CrossOriginPreflightResultCacheItem>);
745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        bool canSkipPreflight(const String& origin, const KURL&, StoredCredentials, const String& method, const HTTPHeaderMap& requestHeaders);
755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    private:
775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        CrossOriginPreflightResultCache() { }
785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        typedef HashMap<std::pair<String, KURL>, OwnPtr<CrossOriginPreflightResultCacheItem> > CrossOriginPreflightResultHashMap;
805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        CrossOriginPreflightResultHashMap m_preflightHashMap;
825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    };
835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
84c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)} // namespace blink
855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif
87