Prism.languages.http = {
  'request-line': {
    pattern: /^(?:POST|GET|PUT|DELETE|OPTIONS|PATCH|TRACE|CONNECT)\shttps?:\/\/\S+\sHTTP\/[0-9.]+/m,
    inside: {
      // HTTP Verb
      property: /^(?:POST|GET|PUT|DELETE|OPTIONS|PATCH|TRACE|CONNECT)\b/,
      // Path or query argument
      'attr-name': /:\w+/,
    },
  },
  'response-status': {
    pattern: /^HTTP\/1.[01] \d+.*/m,
    inside: {
      // Status, e.g. 200 OK
      property: {
        pattern: /(^HTTP\/1.[01] )\d+.*/i,
        lookbehind: true,
      },
    },
  },
  // HTTP header name
  'header-name': {
    pattern: /^[\w-]+:(?=.)/m,
    alias: 'keyword',
  },
};

// Create a mapping of Content-Type headers to language definitions
var httpLanguages = {
  'application/json': Prism.languages.javascript,
  'application/xml': Prism.languages.markup,
  'text/xml': Prism.languages.markup,
  'text/html': Prism.languages.markup,
};

// Insert each content type parser that has its associated language
// currently loaded.
for (var contentType in httpLanguages) {
  if (httpLanguages[contentType]) {
    var options = {};
    options[contentType] = {
      pattern: new RegExp(
        '(content-type:\\s*' +
          contentType +
          '[\\w\\W]*?)(?:\\r?\\n|\\r){2}[\\w\\W]*',
        'i'
      ),
      lookbehind: true,
      inside: {
        rest: httpLanguages[contentType],
      },
    };
    Prism.languages.insertBefore('http', 'header-name', options);
  }
}
