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
							 |