This file is indexed.

/usr/share/common-lisp/source/drakma/encoding.lisp is in cl-drakma 1.3.10-2.

This file is owned by root:root, with mode 0o644.

The actual contents of the file can be viewed below.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
;;; -*- Mode: LISP; Syntax: COMMON-LISP; Package: DRAKMA; Base: 10 -*-
;;; $Header: /usr/local/cvsrep/drakma/read.lisp,v 1.17 2008/05/25 11:35:20 edi Exp $

;;; Copyright (c) 2006-2012, Dr. Edmund Weitz.  All rights reserved.

;;; Redistribution and use in source and binary forms, with or without
;;; modification, are permitted provided that the following conditions
;;; are met:

;;;   * Redistributions of source code must retain the above copyright
;;;     notice, this list of conditions and the following disclaimer.

;;;   * Redistributions in binary form must reproduce the above
;;;     copyright notice, this list of conditions and the following
;;;     disclaimer in the documentation and/or other materials
;;;     provided with the distribution.

;;; THIS SOFTWARE IS PROVIDED BY THE AUTHOR 'AS IS' AND ANY EXPRESSED
;;; OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
;;; WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
;;; ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
;;; DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
;;; DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
;;; GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
;;; INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
;;; WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
;;; NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
;;; SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

(in-package :drakma)

(defgeneric decode-stream (encoding-type stream)
  (:documentation "Generic function to decode a stream.
This is a generic function which decodes the stream based on the encoding-type.
If a response contains one or more transfer or content encodings, then decode-stream
is called for each encoding type in the correct order to properly decode the stream to its
original content.

ENCODING-TYPE will be a keyword created by upcasing and interning the encoding type from the header.
STREAM will be the stream that needs to be decoded. decode-stream returns a new stream from
which you can read the decoded data."))

(defmethod decode-stream ((encoding-type t) stream)
  "Default handler, just return the stream."
  stream)

#-:drakma-no-chipz
(defmethod decode-stream ((encoding-type (eql :gzip)) stream)
  "Decode stream using gzip compression."
  (chipz:make-decompressing-stream 'chipz:gzip stream))

#-:drakma-no-chipz
(defmethod decode-stream ((encoding-type (eql :deflate)) stream)
  "Decode stream using deflate compression in zlib container."
  (chipz:make-decompressing-stream 'chipz:zlib stream))

(defmethod decode-stream ((encoding-type (eql :chunked)) (stream chunked-input-stream))
  "Decode a chunked stream.
Special method for chunked-input-stream that just turns chunking on."
  (setf (chunked-stream-input-chunking-p stream) t)
  stream)

(defmethod decode-stream ((encoding-type (eql :chunked)) stream)
  "General decode method for chunked stream.
Creates new chunked-stream."
  (let ((chunk-stream (make-chunked-stream stream)))
    (decode-stream :chunked chunk-stream)))

(defun decode-response-stream (headers stream)
  "Perform all necessary decodings on stream, from the Transfer-Encoding and Content-Encoding headers."
  (let ((transfer-encodings (header-value :transfer-encoding headers))
        (content-encodings (header-value :content-encoding headers)))
    (when transfer-encodings
      (setq transfer-encodings (split-tokens transfer-encodings)))
    (when content-encodings
      (setq content-encodings (split-tokens content-encodings)))
    ; Reverse, because we need to run decodings in the opposite order they were applied
    (let* ((encodings (nreverse (nconc content-encodings transfer-encodings))))
      (loop for s = stream then (decode-stream encoding s)
         for encoding-str in encodings
         for encoding = (intern (string-upcase encoding-str) 'keyword)
         finally (return s)))))

(defun decode-flexi-stream (headers stream)
  (declare (flexi-input-stream stream))
  "Perform all necessary decodings on the internal stream of a flexi-stream.
Wrapper arround decode-response-stream which preserverves the external format of the
flexi-stsream."
  (let ((raw-stream (flexi-stream-stream stream))
        (external-format (flexi-stream-external-format stream)))
    (let ((result (decode-response-stream headers raw-stream)))
      (setq result (make-flexi-stream result))
      (setf (flexi-stream-external-format result) external-format)
      result)))