60 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			Ruby
		
	
	
	
			
		
		
	
	
			60 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			Ruby
		
	
	
	
| # Copyright 2010 Google Inc.
 | |
| #
 | |
| # Licensed under the Apache License, Version 2.0 (the "License");
 | |
| # you may not use this file except in compliance with the License.
 | |
| # You may obtain a copy of the License at
 | |
| #
 | |
| #      http://www.apache.org/licenses/LICENSE-2.0
 | |
| #
 | |
| # Unless required by applicable law or agreed to in writing, software
 | |
| # distributed under the License is distributed on an "AS IS" BASIS,
 | |
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | |
| # See the License for the specific language governing permissions and
 | |
| # limitations under the License.
 | |
| 
 | |
| 
 | |
| require 'json'
 | |
| 
 | |
| module Google
 | |
|   class APIClient
 | |
|     module Parser
 | |
|       def content_type(content_type)
 | |
|         @@content_type_mapping ||= {}
 | |
|         @@content_type_mapping[content_type] = self
 | |
|       end
 | |
| 
 | |
|       def self.match_content_type(content_type)
 | |
|         # TODO(bobaman): Do this more efficiently.
 | |
|         mime_type_regexp = /^([^\/]+)(?:\/([^+]+\+)?([^;]+))?(?:;.*)?$/
 | |
|         if @@content_type_mapping[content_type]
 | |
|           # Exact match
 | |
|           return @@content_type_mapping[content_type]
 | |
|         else
 | |
|           media_type, extension, sub_type =
 | |
|             content_type.scan(mime_type_regexp)[0]
 | |
|           for pattern, parser in @@content_type_mapping
 | |
|             # We want to match on subtype first
 | |
|             pattern_media_type, pattern_extension, pattern_sub_type =
 | |
|               pattern.scan(mime_type_regexp)[0]
 | |
|             next if pattern_extension != nil
 | |
|             if media_type == pattern_media_type && sub_type == pattern_sub_type
 | |
|               return parser
 | |
|             end
 | |
|           end
 | |
|           for pattern, parser in @@content_type_mapping
 | |
|             # We failed to match on the subtype
 | |
|             # Try to match only on the media type
 | |
|             pattern_media_type, pattern_extension, pattern_sub_type =
 | |
|               pattern.scan(mime_type_regexp)[0]
 | |
|             next if pattern_extension != nil || pattern_sub_type != nil
 | |
|             if media_type == pattern_media_type
 | |
|               return parser
 | |
|             end
 | |
|           end
 | |
|         end
 | |
|         return nil
 | |
|       end
 | |
|     end
 | |
|   end
 | |
| end
 |