| # -*- coding: utf-8 -*- # |
| |
| module Rouge |
| module Lexers |
| class HTTP < RegexLexer |
| tag 'http' |
| title "HTTP" |
| desc 'http requests and responses' |
| |
| def self.http_methods |
| @http_methods ||= %w(GET POST PUT DELETE HEAD OPTIONS TRACE PATCH) |
| end |
| |
| def content_lexer |
| return Lexers::PlainText unless @content_type |
| |
| @content_lexer ||= Lexer.guess_by_mimetype(@content_type) |
| rescue Lexer::AmbiguousGuess |
| @content_lexer = Lexers::PlainText |
| end |
| |
| start { @content_type = 'text/plain' } |
| |
| state :root do |
| # request |
| rule %r( |
| (#{HTTP.http_methods.join('|')})([ ]+) # method |
| ([^ ]+)([ ]+) # path |
| (HTTPS?)(/)(1[.][01])(\r?\n|$) # http version |
| )ox do |
| groups( |
| Name::Function, Text, |
| Name::Namespace, Text, |
| Keyword, Operator, Num, Text |
| ) |
| |
| push :headers |
| end |
| |
| # response |
| rule %r( |
| (HTTPS?)(/)(1[.][01])([ ]+) # http version |
| (\d{3})([ ]+) # status |
| ([^\r\n]+)(\r?\n|$) # status message |
| )x do |
| groups( |
| Keyword, Operator, Num, Text, |
| Num, Text, |
| Name::Exception, Text |
| ) |
| push :headers |
| end |
| end |
| |
| state :headers do |
| rule /([^\s:]+)( *)(:)( *)([^\r\n]+)(\r?\n|$)/ do |m| |
| key = m[1] |
| value = m[5] |
| if key.strip.downcase == 'content-type' |
| @content_type = value.split(';')[0].downcase |
| end |
| |
| groups Name::Attribute, Text, Punctuation, Text, Str, Text |
| end |
| |
| rule /([^\r\n]+)(\r?\n|$)/ do |
| groups Str, Text |
| end |
| |
| rule /\r?\n/, Text, :content |
| end |
| |
| state :content do |
| rule /.+/m do |m| |
| delegate(content_lexer) |
| end |
| end |
| end |
| end |
| end |