LilyPond-Ruby 0.1.1 → 0.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1109) hide show
  1. checksums.yaml +4 -4
  2. data/etc/fonts/conf.d/10-hinting-slight.conf +15 -0
  3. data/etc/fonts/conf.d/10-scale-bitmap-fonts.conf +83 -0
  4. data/etc/fonts/conf.d/11-lcdfilter-default.conf +17 -0
  5. data/etc/fonts/conf.d/20-unhint-small-vera.conf +49 -0
  6. data/etc/fonts/conf.d/30-metric-aliases.conf +637 -0
  7. data/etc/fonts/conf.d/40-nonlatin.conf +332 -0
  8. data/etc/fonts/conf.d/45-generic.conf +136 -0
  9. data/etc/fonts/conf.d/45-latin.conf +301 -0
  10. data/etc/fonts/conf.d/48-spacing.conf +16 -0
  11. data/etc/fonts/conf.d/49-sansserif.conf +22 -0
  12. data/etc/fonts/conf.d/50-user.conf +16 -0
  13. data/etc/fonts/conf.d/51-local.conf +7 -0
  14. data/etc/fonts/conf.d/60-generic.conf +64 -0
  15. data/etc/fonts/conf.d/60-latin.conf +88 -0
  16. data/etc/fonts/conf.d/65-fonts-persian.conf +418 -0
  17. data/etc/fonts/conf.d/65-nonlatin.conf +228 -0
  18. data/etc/fonts/conf.d/69-unifont.conf +28 -0
  19. data/etc/fonts/conf.d/80-delicious.conf +19 -0
  20. data/etc/fonts/conf.d/90-synthetic.conf +64 -0
  21. data/etc/fonts/conf.d/README +23 -0
  22. data/etc/fonts/fonts.conf +101 -0
  23. data/etc/relocate/fontconfig.reloc +2 -0
  24. data/etc/relocate/guile.reloc +2 -0
  25. data/etc/relocate/libexec.reloc +1 -0
  26. data/lib/guile/2.2/ccache/ice-9/and-let-star.go +0 -0
  27. data/lib/guile/2.2/ccache/ice-9/arrays.go +0 -0
  28. data/lib/guile/2.2/ccache/ice-9/atomic.go +0 -0
  29. data/lib/guile/2.2/ccache/ice-9/binary-ports.go +0 -0
  30. data/lib/guile/2.2/ccache/ice-9/boot-9.go +0 -0
  31. data/lib/guile/2.2/ccache/ice-9/buffered-input.go +0 -0
  32. data/lib/guile/2.2/ccache/ice-9/calling.go +0 -0
  33. data/lib/guile/2.2/ccache/ice-9/channel.go +0 -0
  34. data/lib/guile/2.2/ccache/ice-9/command-line.go +0 -0
  35. data/lib/guile/2.2/ccache/ice-9/common-list.go +0 -0
  36. data/lib/guile/2.2/ccache/ice-9/control.go +0 -0
  37. data/lib/guile/2.2/ccache/ice-9/curried-definitions.go +0 -0
  38. data/lib/guile/2.2/ccache/ice-9/debug.go +0 -0
  39. data/lib/guile/2.2/ccache/ice-9/deprecated.go +0 -0
  40. data/lib/guile/2.2/ccache/ice-9/documentation.go +0 -0
  41. data/lib/guile/2.2/ccache/ice-9/eval-string.go +0 -0
  42. data/lib/guile/2.2/ccache/ice-9/eval.go +0 -0
  43. data/lib/guile/2.2/ccache/ice-9/expect.go +0 -0
  44. data/lib/guile/2.2/ccache/ice-9/fdes-finalizers.go +0 -0
  45. data/lib/guile/2.2/ccache/ice-9/format.go +0 -0
  46. data/lib/guile/2.2/ccache/ice-9/ftw.go +0 -0
  47. data/lib/guile/2.2/ccache/ice-9/futures.go +0 -0
  48. data/lib/guile/2.2/ccache/ice-9/gap-buffer.go +0 -0
  49. data/lib/guile/2.2/ccache/ice-9/getopt-long.go +0 -0
  50. data/lib/guile/2.2/ccache/ice-9/hash-table.go +0 -0
  51. data/lib/guile/2.2/ccache/ice-9/hcons.go +0 -0
  52. data/lib/guile/2.2/ccache/ice-9/history.go +0 -0
  53. data/lib/guile/2.2/ccache/ice-9/i18n.go +0 -0
  54. data/lib/guile/2.2/ccache/ice-9/iconv.go +0 -0
  55. data/lib/guile/2.2/ccache/ice-9/lineio.go +0 -0
  56. data/lib/guile/2.2/ccache/ice-9/list.go +0 -0
  57. data/lib/guile/2.2/ccache/ice-9/local-eval.go +0 -0
  58. data/lib/guile/2.2/ccache/ice-9/ls.go +0 -0
  59. data/lib/guile/2.2/ccache/ice-9/mapping.go +0 -0
  60. data/lib/guile/2.2/ccache/ice-9/match.go +0 -0
  61. data/lib/guile/2.2/ccache/ice-9/networking.go +0 -0
  62. data/lib/guile/2.2/ccache/ice-9/null.go +0 -0
  63. data/lib/guile/2.2/ccache/ice-9/occam-channel.go +0 -0
  64. data/lib/guile/2.2/ccache/ice-9/optargs.go +0 -0
  65. data/lib/guile/2.2/ccache/ice-9/peg/cache.go +0 -0
  66. data/lib/guile/2.2/ccache/ice-9/peg/codegen.go +0 -0
  67. data/lib/guile/2.2/ccache/ice-9/peg/simplify-tree.go +0 -0
  68. data/lib/guile/2.2/ccache/ice-9/peg/string-peg.go +0 -0
  69. data/lib/guile/2.2/ccache/ice-9/peg/using-parsers.go +0 -0
  70. data/lib/guile/2.2/ccache/ice-9/peg.go +0 -0
  71. data/lib/guile/2.2/ccache/ice-9/poe.go +0 -0
  72. data/lib/guile/2.2/ccache/ice-9/poll.go +0 -0
  73. data/lib/guile/2.2/ccache/ice-9/popen.go +0 -0
  74. data/lib/guile/2.2/ccache/ice-9/ports.go +0 -0
  75. data/lib/guile/2.2/ccache/ice-9/posix.go +0 -0
  76. data/lib/guile/2.2/ccache/ice-9/pretty-print.go +0 -0
  77. data/lib/guile/2.2/ccache/ice-9/psyntax-pp.go +0 -0
  78. data/lib/guile/2.2/ccache/ice-9/q.go +0 -0
  79. data/lib/guile/2.2/ccache/ice-9/r5rs.go +0 -0
  80. data/lib/guile/2.2/ccache/ice-9/rdelim.go +0 -0
  81. data/lib/guile/2.2/ccache/ice-9/receive.go +0 -0
  82. data/lib/guile/2.2/ccache/ice-9/regex.go +0 -0
  83. data/lib/guile/2.2/ccache/ice-9/runq.go +0 -0
  84. data/lib/guile/2.2/ccache/ice-9/rw.go +0 -0
  85. data/lib/guile/2.2/ccache/ice-9/safe-r5rs.go +0 -0
  86. data/lib/guile/2.2/ccache/ice-9/safe.go +0 -0
  87. data/lib/guile/2.2/ccache/ice-9/sandbox.go +0 -0
  88. data/lib/guile/2.2/ccache/ice-9/save-stack.go +0 -0
  89. data/lib/guile/2.2/ccache/ice-9/scm-style-repl.go +0 -0
  90. data/lib/guile/2.2/ccache/ice-9/serialize.go +0 -0
  91. data/lib/guile/2.2/ccache/ice-9/session.go +0 -0
  92. data/lib/guile/2.2/ccache/ice-9/slib.go +0 -0
  93. data/lib/guile/2.2/ccache/ice-9/stack-catch.go +0 -0
  94. data/lib/guile/2.2/ccache/ice-9/streams.go +0 -0
  95. data/lib/guile/2.2/ccache/ice-9/string-fun.go +0 -0
  96. data/lib/guile/2.2/ccache/ice-9/suspendable-ports.go +0 -0
  97. data/lib/guile/2.2/ccache/ice-9/syncase.go +0 -0
  98. data/lib/guile/2.2/ccache/ice-9/textual-ports.go +0 -0
  99. data/lib/guile/2.2/ccache/ice-9/threads.go +0 -0
  100. data/lib/guile/2.2/ccache/ice-9/time.go +0 -0
  101. data/lib/guile/2.2/ccache/ice-9/top-repl.go +0 -0
  102. data/lib/guile/2.2/ccache/ice-9/unicode.go +0 -0
  103. data/lib/guile/2.2/ccache/ice-9/vlist.go +0 -0
  104. data/lib/guile/2.2/ccache/ice-9/weak-vector.go +0 -0
  105. data/lib/guile/2.2/ccache/language/brainfuck/compile-scheme.go +0 -0
  106. data/lib/guile/2.2/ccache/language/brainfuck/compile-tree-il.go +0 -0
  107. data/lib/guile/2.2/ccache/language/brainfuck/parse.go +0 -0
  108. data/lib/guile/2.2/ccache/language/brainfuck/spec.go +0 -0
  109. data/lib/guile/2.2/ccache/language/bytecode/spec.go +0 -0
  110. data/lib/guile/2.2/ccache/language/bytecode.go +0 -0
  111. data/lib/guile/2.2/ccache/language/cps/closure-conversion.go +0 -0
  112. data/lib/guile/2.2/ccache/language/cps/compile-bytecode.go +0 -0
  113. data/lib/guile/2.2/ccache/language/cps/constructors.go +0 -0
  114. data/lib/guile/2.2/ccache/language/cps/contification.go +0 -0
  115. data/lib/guile/2.2/ccache/language/cps/cse.go +0 -0
  116. data/lib/guile/2.2/ccache/language/cps/dce.go +0 -0
  117. data/lib/guile/2.2/ccache/language/cps/effects-analysis.go +0 -0
  118. data/lib/guile/2.2/ccache/language/cps/elide-values.go +0 -0
  119. data/lib/guile/2.2/ccache/language/cps/handle-interrupts.go +0 -0
  120. data/lib/guile/2.2/ccache/language/cps/intmap.go +0 -0
  121. data/lib/guile/2.2/ccache/language/cps/intset.go +0 -0
  122. data/lib/guile/2.2/ccache/language/cps/licm.go +0 -0
  123. data/lib/guile/2.2/ccache/language/cps/optimize.go +0 -0
  124. data/lib/guile/2.2/ccache/language/cps/peel-loops.go +0 -0
  125. data/lib/guile/2.2/ccache/language/cps/primitives.go +0 -0
  126. data/lib/guile/2.2/ccache/language/cps/prune-bailouts.go +0 -0
  127. data/lib/guile/2.2/ccache/language/cps/prune-top-level-scopes.go +0 -0
  128. data/lib/guile/2.2/ccache/language/cps/reify-primitives.go +0 -0
  129. data/lib/guile/2.2/ccache/language/cps/renumber.go +0 -0
  130. data/lib/guile/2.2/ccache/language/cps/rotate-loops.go +0 -0
  131. data/lib/guile/2.2/ccache/language/cps/self-references.go +0 -0
  132. data/lib/guile/2.2/ccache/language/cps/simplify.go +0 -0
  133. data/lib/guile/2.2/ccache/language/cps/slot-allocation.go +0 -0
  134. data/lib/guile/2.2/ccache/language/cps/spec.go +0 -0
  135. data/lib/guile/2.2/ccache/language/cps/specialize-numbers.go +0 -0
  136. data/lib/guile/2.2/ccache/language/cps/specialize-primcalls.go +0 -0
  137. data/lib/guile/2.2/ccache/language/cps/split-rec.go +0 -0
  138. data/lib/guile/2.2/ccache/language/cps/type-checks.go +0 -0
  139. data/lib/guile/2.2/ccache/language/cps/type-fold.go +0 -0
  140. data/lib/guile/2.2/ccache/language/cps/types.go +0 -0
  141. data/lib/guile/2.2/ccache/language/cps/utils.go +0 -0
  142. data/lib/guile/2.2/ccache/language/cps/verify.go +0 -0
  143. data/lib/guile/2.2/ccache/language/cps/with-cps.go +0 -0
  144. data/lib/guile/2.2/ccache/language/cps.go +0 -0
  145. data/lib/guile/2.2/ccache/language/ecmascript/array.go +0 -0
  146. data/lib/guile/2.2/ccache/language/ecmascript/base.go +0 -0
  147. data/lib/guile/2.2/ccache/language/ecmascript/compile-tree-il.go +0 -0
  148. data/lib/guile/2.2/ccache/language/ecmascript/function.go +0 -0
  149. data/lib/guile/2.2/ccache/language/ecmascript/impl.go +0 -0
  150. data/lib/guile/2.2/ccache/language/ecmascript/parse.go +0 -0
  151. data/lib/guile/2.2/ccache/language/ecmascript/spec.go +0 -0
  152. data/lib/guile/2.2/ccache/language/ecmascript/tokenize.go +0 -0
  153. data/lib/guile/2.2/ccache/language/elisp/bindings.go +0 -0
  154. data/lib/guile/2.2/ccache/language/elisp/boot.go +0 -0
  155. data/lib/guile/2.2/ccache/language/elisp/compile-tree-il.go +0 -0
  156. data/lib/guile/2.2/ccache/language/elisp/falias.go +0 -0
  157. data/lib/guile/2.2/ccache/language/elisp/lexer.go +0 -0
  158. data/lib/guile/2.2/ccache/language/elisp/parser.go +0 -0
  159. data/lib/guile/2.2/ccache/language/elisp/runtime/function-slot.go +0 -0
  160. data/lib/guile/2.2/ccache/language/elisp/runtime/value-slot.go +0 -0
  161. data/lib/guile/2.2/ccache/language/elisp/runtime.go +0 -0
  162. data/lib/guile/2.2/ccache/language/elisp/spec.go +0 -0
  163. data/lib/guile/2.2/ccache/language/scheme/compile-tree-il.go +0 -0
  164. data/lib/guile/2.2/ccache/language/scheme/decompile-tree-il.go +0 -0
  165. data/lib/guile/2.2/ccache/language/scheme/spec.go +0 -0
  166. data/lib/guile/2.2/ccache/language/tree-il/analyze.go +0 -0
  167. data/lib/guile/2.2/ccache/language/tree-il/canonicalize.go +0 -0
  168. data/lib/guile/2.2/ccache/language/tree-il/compile-cps.go +0 -0
  169. data/lib/guile/2.2/ccache/language/tree-il/debug.go +0 -0
  170. data/lib/guile/2.2/ccache/language/tree-il/effects.go +0 -0
  171. data/lib/guile/2.2/ccache/language/tree-il/fix-letrec.go +0 -0
  172. data/lib/guile/2.2/ccache/language/tree-il/optimize.go +0 -0
  173. data/lib/guile/2.2/ccache/language/tree-il/peval.go +0 -0
  174. data/lib/guile/2.2/ccache/language/tree-il/primitives.go +0 -0
  175. data/lib/guile/2.2/ccache/language/tree-il/spec.go +0 -0
  176. data/lib/guile/2.2/ccache/language/tree-il.go +0 -0
  177. data/lib/guile/2.2/ccache/language/value/spec.go +0 -0
  178. data/lib/guile/2.2/ccache/oop/goops/accessors.go +0 -0
  179. data/lib/guile/2.2/ccache/oop/goops/active-slot.go +0 -0
  180. data/lib/guile/2.2/ccache/oop/goops/composite-slot.go +0 -0
  181. data/lib/guile/2.2/ccache/oop/goops/describe.go +0 -0
  182. data/lib/guile/2.2/ccache/oop/goops/internal.go +0 -0
  183. data/lib/guile/2.2/ccache/oop/goops/save.go +0 -0
  184. data/lib/guile/2.2/ccache/oop/goops/simple.go +0 -0
  185. data/lib/guile/2.2/ccache/oop/goops/stklos.go +0 -0
  186. data/lib/guile/2.2/ccache/oop/goops.go +0 -0
  187. data/lib/guile/2.2/ccache/rnrs/arithmetic/bitwise.go +0 -0
  188. data/lib/guile/2.2/ccache/rnrs/arithmetic/fixnums.go +0 -0
  189. data/lib/guile/2.2/ccache/rnrs/arithmetic/flonums.go +0 -0
  190. data/lib/guile/2.2/ccache/rnrs/base.go +0 -0
  191. data/lib/guile/2.2/ccache/rnrs/bytevectors.go +0 -0
  192. data/lib/guile/2.2/ccache/rnrs/conditions.go +0 -0
  193. data/lib/guile/2.2/ccache/rnrs/control.go +0 -0
  194. data/lib/guile/2.2/ccache/rnrs/enums.go +0 -0
  195. data/lib/guile/2.2/ccache/rnrs/eval.go +0 -0
  196. data/lib/guile/2.2/ccache/rnrs/exceptions.go +0 -0
  197. data/lib/guile/2.2/ccache/rnrs/files.go +0 -0
  198. data/lib/guile/2.2/ccache/rnrs/hashtables.go +0 -0
  199. data/lib/guile/2.2/ccache/rnrs/io/ports.go +0 -0
  200. data/lib/guile/2.2/ccache/rnrs/io/simple.go +0 -0
  201. data/lib/guile/2.2/ccache/rnrs/lists.go +0 -0
  202. data/lib/guile/2.2/ccache/rnrs/mutable-pairs.go +0 -0
  203. data/lib/guile/2.2/ccache/rnrs/mutable-strings.go +0 -0
  204. data/lib/guile/2.2/ccache/rnrs/programs.go +0 -0
  205. data/lib/guile/2.2/ccache/rnrs/r5rs.go +0 -0
  206. data/lib/guile/2.2/ccache/rnrs/records/inspection.go +0 -0
  207. data/lib/guile/2.2/ccache/rnrs/records/procedural.go +0 -0
  208. data/lib/guile/2.2/ccache/rnrs/records/syntactic.go +0 -0
  209. data/lib/guile/2.2/ccache/rnrs/sorting.go +0 -0
  210. data/lib/guile/2.2/ccache/rnrs/syntax-case.go +0 -0
  211. data/lib/guile/2.2/ccache/rnrs/unicode.go +0 -0
  212. data/lib/guile/2.2/ccache/rnrs.go +0 -0
  213. data/lib/guile/2.2/ccache/scripts/api-diff.go +0 -0
  214. data/lib/guile/2.2/ccache/scripts/autofrisk.go +0 -0
  215. data/lib/guile/2.2/ccache/scripts/compile.go +0 -0
  216. data/lib/guile/2.2/ccache/scripts/disassemble.go +0 -0
  217. data/lib/guile/2.2/ccache/scripts/display-commentary.go +0 -0
  218. data/lib/guile/2.2/ccache/scripts/doc-snarf.go +0 -0
  219. data/lib/guile/2.2/ccache/scripts/frisk.go +0 -0
  220. data/lib/guile/2.2/ccache/scripts/generate-autoload.go +0 -0
  221. data/lib/guile/2.2/ccache/scripts/help.go +0 -0
  222. data/lib/guile/2.2/ccache/scripts/lint.go +0 -0
  223. data/lib/guile/2.2/ccache/scripts/list.go +0 -0
  224. data/lib/guile/2.2/ccache/scripts/punify.go +0 -0
  225. data/lib/guile/2.2/ccache/scripts/read-rfc822.go +0 -0
  226. data/lib/guile/2.2/ccache/scripts/read-scheme-source.go +0 -0
  227. data/lib/guile/2.2/ccache/scripts/read-text-outline.go +0 -0
  228. data/lib/guile/2.2/ccache/scripts/scan-api.go +0 -0
  229. data/lib/guile/2.2/ccache/scripts/snarf-check-and-output-texi.go +0 -0
  230. data/lib/guile/2.2/ccache/scripts/snarf-guile-m4-docs.go +0 -0
  231. data/lib/guile/2.2/ccache/scripts/summarize-guile-TODO.go +0 -0
  232. data/lib/guile/2.2/ccache/scripts/use2dot.go +0 -0
  233. data/lib/guile/2.2/ccache/srfi/srfi-1.go +0 -0
  234. data/lib/guile/2.2/ccache/srfi/srfi-10.go +0 -0
  235. data/lib/guile/2.2/ccache/srfi/srfi-11.go +0 -0
  236. data/lib/guile/2.2/ccache/srfi/srfi-111.go +0 -0
  237. data/lib/guile/2.2/ccache/srfi/srfi-13.go +0 -0
  238. data/lib/guile/2.2/ccache/srfi/srfi-14.go +0 -0
  239. data/lib/guile/2.2/ccache/srfi/srfi-16.go +0 -0
  240. data/lib/guile/2.2/ccache/srfi/srfi-17.go +0 -0
  241. data/lib/guile/2.2/ccache/srfi/srfi-18.go +0 -0
  242. data/lib/guile/2.2/ccache/srfi/srfi-19.go +0 -0
  243. data/lib/guile/2.2/ccache/srfi/srfi-2.go +0 -0
  244. data/lib/guile/2.2/ccache/srfi/srfi-26.go +0 -0
  245. data/lib/guile/2.2/ccache/srfi/srfi-27.go +0 -0
  246. data/lib/guile/2.2/ccache/srfi/srfi-28.go +0 -0
  247. data/lib/guile/2.2/ccache/srfi/srfi-31.go +0 -0
  248. data/lib/guile/2.2/ccache/srfi/srfi-34.go +0 -0
  249. data/lib/guile/2.2/ccache/srfi/srfi-35.go +0 -0
  250. data/lib/guile/2.2/ccache/srfi/srfi-37.go +0 -0
  251. data/lib/guile/2.2/ccache/srfi/srfi-38.go +0 -0
  252. data/lib/guile/2.2/ccache/srfi/srfi-39.go +0 -0
  253. data/lib/guile/2.2/ccache/srfi/srfi-4/gnu.go +0 -0
  254. data/lib/guile/2.2/ccache/srfi/srfi-4.go +0 -0
  255. data/lib/guile/2.2/ccache/srfi/srfi-41.go +0 -0
  256. data/lib/guile/2.2/ccache/srfi/srfi-42.go +0 -0
  257. data/lib/guile/2.2/ccache/srfi/srfi-43.go +0 -0
  258. data/lib/guile/2.2/ccache/srfi/srfi-45.go +0 -0
  259. data/lib/guile/2.2/ccache/srfi/srfi-6.go +0 -0
  260. data/lib/guile/2.2/ccache/srfi/srfi-60.go +0 -0
  261. data/lib/guile/2.2/ccache/srfi/srfi-64.go +0 -0
  262. data/lib/guile/2.2/ccache/srfi/srfi-67.go +0 -0
  263. data/lib/guile/2.2/ccache/srfi/srfi-69.go +0 -0
  264. data/lib/guile/2.2/ccache/srfi/srfi-71.go +0 -0
  265. data/lib/guile/2.2/ccache/srfi/srfi-8.go +0 -0
  266. data/lib/guile/2.2/ccache/srfi/srfi-88.go +0 -0
  267. data/lib/guile/2.2/ccache/srfi/srfi-9/gnu.go +0 -0
  268. data/lib/guile/2.2/ccache/srfi/srfi-9.go +0 -0
  269. data/lib/guile/2.2/ccache/srfi/srfi-98.go +0 -0
  270. data/lib/guile/2.2/ccache/statprof.go +0 -0
  271. data/lib/guile/2.2/ccache/sxml/apply-templates.go +0 -0
  272. data/lib/guile/2.2/ccache/sxml/fold.go +0 -0
  273. data/lib/guile/2.2/ccache/sxml/match.go +0 -0
  274. data/lib/guile/2.2/ccache/sxml/simple.go +0 -0
  275. data/lib/guile/2.2/ccache/sxml/ssax/input-parse.go +0 -0
  276. data/lib/guile/2.2/ccache/sxml/ssax.go +0 -0
  277. data/lib/guile/2.2/ccache/sxml/transform.go +0 -0
  278. data/lib/guile/2.2/ccache/sxml/xpath.go +0 -0
  279. data/lib/guile/2.2/ccache/system/base/ck.go +0 -0
  280. data/lib/guile/2.2/ccache/system/base/compile.go +0 -0
  281. data/lib/guile/2.2/ccache/system/base/lalr.go +0 -0
  282. data/lib/guile/2.2/ccache/system/base/language.go +0 -0
  283. data/lib/guile/2.2/ccache/system/base/message.go +0 -0
  284. data/lib/guile/2.2/ccache/system/base/pmatch.go +0 -0
  285. data/lib/guile/2.2/ccache/system/base/syntax.go +0 -0
  286. data/lib/guile/2.2/ccache/system/base/target.go +0 -0
  287. data/lib/guile/2.2/ccache/system/base/types.go +0 -0
  288. data/lib/guile/2.2/ccache/system/foreign-object.go +0 -0
  289. data/lib/guile/2.2/ccache/system/foreign.go +0 -0
  290. data/lib/guile/2.2/ccache/system/repl/command.go +0 -0
  291. data/lib/guile/2.2/ccache/system/repl/common.go +0 -0
  292. data/lib/guile/2.2/ccache/system/repl/coop-server.go +0 -0
  293. data/lib/guile/2.2/ccache/system/repl/debug.go +0 -0
  294. data/lib/guile/2.2/ccache/system/repl/error-handling.go +0 -0
  295. data/lib/guile/2.2/ccache/system/repl/repl.go +0 -0
  296. data/lib/guile/2.2/ccache/system/repl/server.go +0 -0
  297. data/lib/guile/2.2/ccache/system/syntax.go +0 -0
  298. data/lib/guile/2.2/ccache/system/vm/assembler.go +0 -0
  299. data/lib/guile/2.2/ccache/system/vm/coverage.go +0 -0
  300. data/lib/guile/2.2/ccache/system/vm/debug.go +0 -0
  301. data/lib/guile/2.2/ccache/system/vm/disassembler.go +0 -0
  302. data/lib/guile/2.2/ccache/system/vm/dwarf.go +0 -0
  303. data/lib/guile/2.2/ccache/system/vm/elf.go +0 -0
  304. data/lib/guile/2.2/ccache/system/vm/frame.go +0 -0
  305. data/lib/guile/2.2/ccache/system/vm/inspect.go +0 -0
  306. data/lib/guile/2.2/ccache/system/vm/linker.go +0 -0
  307. data/lib/guile/2.2/ccache/system/vm/loader.go +0 -0
  308. data/lib/guile/2.2/ccache/system/vm/program.go +0 -0
  309. data/lib/guile/2.2/ccache/system/vm/trace.go +0 -0
  310. data/lib/guile/2.2/ccache/system/vm/trap-state.go +0 -0
  311. data/lib/guile/2.2/ccache/system/vm/traps.go +0 -0
  312. data/lib/guile/2.2/ccache/system/vm/vm.go +0 -0
  313. data/lib/guile/2.2/ccache/system/xref.go +0 -0
  314. data/lib/guile/2.2/ccache/texinfo/docbook.go +0 -0
  315. data/lib/guile/2.2/ccache/texinfo/html.go +0 -0
  316. data/lib/guile/2.2/ccache/texinfo/indexing.go +0 -0
  317. data/lib/guile/2.2/ccache/texinfo/plain-text.go +0 -0
  318. data/lib/guile/2.2/ccache/texinfo/reflection.go +0 -0
  319. data/lib/guile/2.2/ccache/texinfo/serialize.go +0 -0
  320. data/lib/guile/2.2/ccache/texinfo/string-utils.go +0 -0
  321. data/lib/guile/2.2/ccache/texinfo.go +0 -0
  322. data/lib/guile/2.2/ccache/web/client.go +0 -0
  323. data/lib/guile/2.2/ccache/web/http.go +0 -0
  324. data/lib/guile/2.2/ccache/web/request.go +0 -0
  325. data/lib/guile/2.2/ccache/web/response.go +0 -0
  326. data/lib/guile/2.2/ccache/web/server/http.go +0 -0
  327. data/lib/guile/2.2/ccache/web/server.go +0 -0
  328. data/lib/guile/2.2/ccache/web/uri.go +0 -0
  329. data/lib/lilypond/2.24.1/ccache/lily/accreg.go +0 -0
  330. data/lib/lilypond/2.24.1/ccache/lily/auto-beam.go +0 -0
  331. data/lib/lilypond/2.24.1/ccache/lily/autochange.go +0 -0
  332. data/lib/lilypond/2.24.1/ccache/lily/backend-library.go +0 -0
  333. data/lib/lilypond/2.24.1/ccache/lily/bar-line.go +0 -0
  334. data/lib/lilypond/2.24.1/ccache/lily/breath.go +0 -0
  335. data/lib/lilypond/2.24.1/ccache/lily/c++.go +0 -0
  336. data/lib/lilypond/2.24.1/ccache/lily/chord-entry.go +0 -0
  337. data/lib/lilypond/2.24.1/ccache/lily/chord-ignatzek-names.go +0 -0
  338. data/lib/lilypond/2.24.1/ccache/lily/chord-name.go +0 -0
  339. data/lib/lilypond/2.24.1/ccache/lily/clip-region.go +0 -0
  340. data/lib/lilypond/2.24.1/ccache/lily/color.go +0 -0
  341. data/lib/lilypond/2.24.1/ccache/lily/curried-definitions.go +0 -0
  342. data/lib/lilypond/2.24.1/ccache/lily/define-context-properties.go +0 -0
  343. data/lib/lilypond/2.24.1/ccache/lily/define-event-classes.go +0 -0
  344. data/lib/lilypond/2.24.1/ccache/lily/define-grob-interfaces.go +0 -0
  345. data/lib/lilypond/2.24.1/ccache/lily/define-grob-properties.go +0 -0
  346. data/lib/lilypond/2.24.1/ccache/lily/define-grobs.go +0 -0
  347. data/lib/lilypond/2.24.1/ccache/lily/define-markup-commands.go +0 -0
  348. data/lib/lilypond/2.24.1/ccache/lily/define-music-callbacks.go +0 -0
  349. data/lib/lilypond/2.24.1/ccache/lily/define-music-display-methods.go +0 -0
  350. data/lib/lilypond/2.24.1/ccache/lily/define-music-properties.go +0 -0
  351. data/lib/lilypond/2.24.1/ccache/lily/define-music-types.go +0 -0
  352. data/lib/lilypond/2.24.1/ccache/lily/define-note-names.go +0 -0
  353. data/lib/lilypond/2.24.1/ccache/lily/define-stencil-commands.go +0 -0
  354. data/lib/lilypond/2.24.1/ccache/lily/define-woodwind-diagrams.go +0 -0
  355. data/lib/lilypond/2.24.1/ccache/lily/display-lily.go +0 -0
  356. data/lib/lilypond/2.24.1/ccache/lily/display-woodwind-diagrams.go +0 -0
  357. data/lib/lilypond/2.24.1/ccache/lily/file-cache.go +0 -0
  358. data/lib/lilypond/2.24.1/ccache/lily/flag-styles.go +0 -0
  359. data/lib/lilypond/2.24.1/ccache/lily/font-encodings.go +0 -0
  360. data/lib/lilypond/2.24.1/ccache/lily/font.go +0 -0
  361. data/lib/lilypond/2.24.1/ccache/lily/framework-cairo.go +0 -0
  362. data/lib/lilypond/2.24.1/ccache/lily/framework-ps.go +0 -0
  363. data/lib/lilypond/2.24.1/ccache/lily/framework-svg.go +0 -0
  364. data/lib/lilypond/2.24.1/ccache/lily/fret-diagrams.go +0 -0
  365. data/lib/lilypond/2.24.1/ccache/lily/graphviz.go +0 -0
  366. data/lib/lilypond/2.24.1/ccache/lily/harp-pedals.go +0 -0
  367. data/lib/lilypond/2.24.1/ccache/lily/layout-beam.go +0 -0
  368. data/lib/lilypond/2.24.1/ccache/lily/layout-slur.go +0 -0
  369. data/lib/lilypond/2.24.1/ccache/lily/lily-library.go +0 -0
  370. data/lib/lilypond/2.24.1/ccache/lily/lily.go +0 -0
  371. data/lib/lilypond/2.24.1/ccache/lily/ly-syntax-constructors.go +0 -0
  372. data/lib/lilypond/2.24.1/ccache/lily/markup-macros.go +0 -0
  373. data/lib/lilypond/2.24.1/ccache/lily/markup.go +0 -0
  374. data/lib/lilypond/2.24.1/ccache/lily/midi.go +0 -0
  375. data/lib/lilypond/2.24.1/ccache/lily/modal-transforms.go +0 -0
  376. data/lib/lilypond/2.24.1/ccache/lily/music-functions.go +0 -0
  377. data/lib/lilypond/2.24.1/ccache/lily/output-lib.go +0 -0
  378. data/lib/lilypond/2.24.1/ccache/lily/output-ps.go +0 -0
  379. data/lib/lilypond/2.24.1/ccache/lily/output-svg.go +0 -0
  380. data/lib/lilypond/2.24.1/ccache/lily/page.go +0 -0
  381. data/lib/lilypond/2.24.1/ccache/lily/paper-system.go +0 -0
  382. data/lib/lilypond/2.24.1/ccache/lily/paper.go +0 -0
  383. data/lib/lilypond/2.24.1/ccache/lily/parser-clef.go +0 -0
  384. data/lib/lilypond/2.24.1/ccache/lily/parser-ly-from-scheme.go +0 -0
  385. data/lib/lilypond/2.24.1/ccache/lily/part-combiner.go +0 -0
  386. data/lib/lilypond/2.24.1/ccache/lily/predefined-fretboards.go +0 -0
  387. data/lib/lilypond/2.24.1/ccache/lily/ps-to-png.go +0 -0
  388. data/lib/lilypond/2.24.1/ccache/lily/scheme-engravers.go +0 -0
  389. data/lib/lilypond/2.24.1/ccache/lily/scheme-performers.go +0 -0
  390. data/lib/lilypond/2.24.1/ccache/lily/script.go +0 -0
  391. data/lib/lilypond/2.24.1/ccache/lily/skyline.go +0 -0
  392. data/lib/lilypond/2.24.1/ccache/lily/song-util.go +0 -0
  393. data/lib/lilypond/2.24.1/ccache/lily/song.go +0 -0
  394. data/lib/lilypond/2.24.1/ccache/lily/stencil.go +0 -0
  395. data/lib/lilypond/2.24.1/ccache/lily/tablature.go +0 -0
  396. data/lib/lilypond/2.24.1/ccache/lily/time-signature-settings.go +0 -0
  397. data/lib/lilypond/2.24.1/ccache/lily/time-signature.go +0 -0
  398. data/lib/lilypond/2.24.1/ccache/lily/titling.go +0 -0
  399. data/lib/lilypond/2.24.1/ccache/lily/to-xml.go +0 -0
  400. data/lib/lilypond/2.24.1/ccache/lily/translation-functions.go +0 -0
  401. data/share/emacs/site-lisp/lilypond-font-lock.el +208 -0
  402. data/share/emacs/site-lisp/lilypond-indent.el +605 -0
  403. data/share/emacs/site-lisp/lilypond-init.el +21 -0
  404. data/share/emacs/site-lisp/lilypond-mode.el +1204 -0
  405. data/share/emacs/site-lisp/lilypond-song.el +556 -0
  406. data/share/emacs/site-lisp/lilypond-what-beat.el +279 -0
  407. data/share/emacs/site-lisp/lilypond-words.el +1428 -0
  408. data/share/guile/2.2/guile-procedures.txt +8860 -0
  409. data/share/guile/2.2/ice-9/and-let-star.scm +73 -0
  410. data/share/guile/2.2/ice-9/arrays.scm +70 -0
  411. data/share/guile/2.2/ice-9/atomic.scm +38 -0
  412. data/share/guile/2.2/ice-9/binary-ports.scm +53 -0
  413. data/share/guile/2.2/ice-9/boot-9.scm +4131 -0
  414. data/share/guile/2.2/ice-9/buffered-input.scm +109 -0
  415. data/share/guile/2.2/ice-9/calling.scm +326 -0
  416. data/share/guile/2.2/ice-9/channel.scm +170 -0
  417. data/share/guile/2.2/ice-9/command-line.scm +477 -0
  418. data/share/guile/2.2/ice-9/common-list.scm +278 -0
  419. data/share/guile/2.2/ice-9/control.scm +110 -0
  420. data/share/guile/2.2/ice-9/curried-definitions.scm +57 -0
  421. data/share/guile/2.2/ice-9/debug.scm +25 -0
  422. data/share/guile/2.2/ice-9/deprecated.scm +93 -0
  423. data/share/guile/2.2/ice-9/documentation.scm +203 -0
  424. data/share/guile/2.2/ice-9/eval-string.scm +90 -0
  425. data/share/guile/2.2/ice-9/eval.scm +723 -0
  426. data/share/guile/2.2/ice-9/expect.scm +171 -0
  427. data/share/guile/2.2/ice-9/fdes-finalizers.scm +25 -0
  428. data/share/guile/2.2/ice-9/format.scm +1626 -0
  429. data/share/guile/2.2/ice-9/ftw.scm +564 -0
  430. data/share/guile/2.2/ice-9/futures.scm +308 -0
  431. data/share/guile/2.2/ice-9/gap-buffer.scm +283 -0
  432. data/share/guile/2.2/ice-9/getopt-long.scm +371 -0
  433. data/share/guile/2.2/ice-9/hash-table.scm +45 -0
  434. data/share/guile/2.2/ice-9/hcons.scm +80 -0
  435. data/share/guile/2.2/ice-9/history.scm +65 -0
  436. data/share/guile/2.2/ice-9/i18n.scm +531 -0
  437. data/share/guile/2.2/ice-9/iconv.scm +95 -0
  438. data/share/guile/2.2/ice-9/lineio.scm +115 -0
  439. data/share/guile/2.2/ice-9/list.scm +36 -0
  440. data/share/guile/2.2/ice-9/local-eval.scm +261 -0
  441. data/share/guile/2.2/ice-9/ls.scm +94 -0
  442. data/share/guile/2.2/ice-9/mapping.scm +118 -0
  443. data/share/guile/2.2/ice-9/match.scm +59 -0
  444. data/share/guile/2.2/ice-9/match.upstream.scm +917 -0
  445. data/share/guile/2.2/ice-9/networking.scm +94 -0
  446. data/share/guile/2.2/ice-9/null.scm +34 -0
  447. data/share/guile/2.2/ice-9/occam-channel.scm +261 -0
  448. data/share/guile/2.2/ice-9/optargs.scm +381 -0
  449. data/share/guile/2.2/ice-9/peg/cache.scm +45 -0
  450. data/share/guile/2.2/ice-9/peg/codegen.scm +359 -0
  451. data/share/guile/2.2/ice-9/peg/simplify-tree.scm +97 -0
  452. data/share/guile/2.2/ice-9/peg/string-peg.scm +273 -0
  453. data/share/guile/2.2/ice-9/peg/using-parsers.scm +116 -0
  454. data/share/guile/2.2/ice-9/peg.scm +42 -0
  455. data/share/guile/2.2/ice-9/poe.scm +116 -0
  456. data/share/guile/2.2/ice-9/poll.scm +172 -0
  457. data/share/guile/2.2/ice-9/popen.scm +178 -0
  458. data/share/guile/2.2/ice-9/ports.scm +566 -0
  459. data/share/guile/2.2/ice-9/posix.scm +75 -0
  460. data/share/guile/2.2/ice-9/pretty-print.scm +483 -0
  461. data/share/guile/2.2/ice-9/psyntax-pp.scm +3542 -0
  462. data/share/guile/2.2/ice-9/psyntax.scm +3326 -0
  463. data/share/guile/2.2/ice-9/q.scm +153 -0
  464. data/share/guile/2.2/ice-9/quasisyntax.scm +136 -0
  465. data/share/guile/2.2/ice-9/r5rs.scm +45 -0
  466. data/share/guile/2.2/ice-9/r6rs-libraries.scm +242 -0
  467. data/share/guile/2.2/ice-9/rdelim.scm +208 -0
  468. data/share/guile/2.2/ice-9/receive.scm +26 -0
  469. data/share/guile/2.2/ice-9/regex.scm +229 -0
  470. data/share/guile/2.2/ice-9/runq.scm +241 -0
  471. data/share/guile/2.2/ice-9/rw.scm +27 -0
  472. data/share/guile/2.2/ice-9/safe-r5rs.scm +145 -0
  473. data/share/guile/2.2/ice-9/safe.scm +34 -0
  474. data/share/guile/2.2/ice-9/sandbox.scm +1399 -0
  475. data/share/guile/2.2/ice-9/save-stack.scm +58 -0
  476. data/share/guile/2.2/ice-9/scm-style-repl.scm +279 -0
  477. data/share/guile/2.2/ice-9/serialize.scm +114 -0
  478. data/share/guile/2.2/ice-9/session.scm +530 -0
  479. data/share/guile/2.2/ice-9/slib.scm +33 -0
  480. data/share/guile/2.2/ice-9/stack-catch.scm +47 -0
  481. data/share/guile/2.2/ice-9/streams.scm +168 -0
  482. data/share/guile/2.2/ice-9/string-fun.scm +280 -0
  483. data/share/guile/2.2/ice-9/suspendable-ports.scm +788 -0
  484. data/share/guile/2.2/ice-9/syncase.scm +37 -0
  485. data/share/guile/2.2/ice-9/textual-ports.scm +70 -0
  486. data/share/guile/2.2/ice-9/threads.scm +392 -0
  487. data/share/guile/2.2/ice-9/time.scm +58 -0
  488. data/share/guile/2.2/ice-9/top-repl.scm +78 -0
  489. data/share/guile/2.2/ice-9/unicode.scm +26 -0
  490. data/share/guile/2.2/ice-9/vlist.scm +595 -0
  491. data/share/guile/2.2/ice-9/weak-vector.scm +31 -0
  492. data/share/guile/2.2/language/brainfuck/compile-scheme.scm +123 -0
  493. data/share/guile/2.2/language/brainfuck/compile-tree-il.scm +184 -0
  494. data/share/guile/2.2/language/brainfuck/parse.scm +95 -0
  495. data/share/guile/2.2/language/brainfuck/spec.scm +43 -0
  496. data/share/guile/2.2/language/bytecode/spec.scm +42 -0
  497. data/share/guile/2.2/language/bytecode.scm +104 -0
  498. data/share/guile/2.2/language/cps/closure-conversion.scm +848 -0
  499. data/share/guile/2.2/language/cps/compile-bytecode.scm +610 -0
  500. data/share/guile/2.2/language/cps/constructors.scm +106 -0
  501. data/share/guile/2.2/language/cps/contification.scm +448 -0
  502. data/share/guile/2.2/language/cps/cse.scm +414 -0
  503. data/share/guile/2.2/language/cps/dce.scm +363 -0
  504. data/share/guile/2.2/language/cps/effects-analysis.scm +597 -0
  505. data/share/guile/2.2/language/cps/elide-values.scm +88 -0
  506. data/share/guile/2.2/language/cps/handle-interrupts.scm +69 -0
  507. data/share/guile/2.2/language/cps/intmap.scm +765 -0
  508. data/share/guile/2.2/language/cps/intset.scm +830 -0
  509. data/share/guile/2.2/language/cps/licm.scm +308 -0
  510. data/share/guile/2.2/language/cps/optimize.scm +135 -0
  511. data/share/guile/2.2/language/cps/peel-loops.scm +287 -0
  512. data/share/guile/2.2/language/cps/primitives.scm +141 -0
  513. data/share/guile/2.2/language/cps/prune-bailouts.scm +86 -0
  514. data/share/guile/2.2/language/cps/prune-top-level-scopes.scm +63 -0
  515. data/share/guile/2.2/language/cps/reify-primitives.scm +179 -0
  516. data/share/guile/2.2/language/cps/renumber.scm +217 -0
  517. data/share/guile/2.2/language/cps/rotate-loops.scm +239 -0
  518. data/share/guile/2.2/language/cps/self-references.scm +79 -0
  519. data/share/guile/2.2/language/cps/simplify.scm +274 -0
  520. data/share/guile/2.2/language/cps/slot-allocation.scm +1058 -0
  521. data/share/guile/2.2/language/cps/spec.scm +51 -0
  522. data/share/guile/2.2/language/cps/specialize-numbers.scm +724 -0
  523. data/share/guile/2.2/language/cps/specialize-primcalls.scm +87 -0
  524. data/share/guile/2.2/language/cps/split-rec.scm +174 -0
  525. data/share/guile/2.2/language/cps/type-checks.scm +72 -0
  526. data/share/guile/2.2/language/cps/type-fold.scm +455 -0
  527. data/share/guile/2.2/language/cps/types.scm +1826 -0
  528. data/share/guile/2.2/language/cps/utils.scm +550 -0
  529. data/share/guile/2.2/language/cps/verify.scm +304 -0
  530. data/share/guile/2.2/language/cps/with-cps.scm +145 -0
  531. data/share/guile/2.2/language/cps.scm +358 -0
  532. data/share/guile/2.2/language/ecmascript/array.scm +121 -0
  533. data/share/guile/2.2/language/ecmascript/base.scm +251 -0
  534. data/share/guile/2.2/language/ecmascript/compile-tree-il.scm +576 -0
  535. data/share/guile/2.2/language/ecmascript/function.scm +78 -0
  536. data/share/guile/2.2/language/ecmascript/impl.scm +169 -0
  537. data/share/guile/2.2/language/ecmascript/parse.scm +352 -0
  538. data/share/guile/2.2/language/ecmascript/spec.scm +37 -0
  539. data/share/guile/2.2/language/ecmascript/tokenize.scm +513 -0
  540. data/share/guile/2.2/language/elisp/bindings.scm +107 -0
  541. data/share/guile/2.2/language/elisp/boot.el +617 -0
  542. data/share/guile/2.2/language/elisp/compile-tree-il.scm +812 -0
  543. data/share/guile/2.2/language/elisp/falias.scm +47 -0
  544. data/share/guile/2.2/language/elisp/lexer.scm +430 -0
  545. data/share/guile/2.2/language/elisp/parser.scm +222 -0
  546. data/share/guile/2.2/language/elisp/runtime/function-slot.scm +63 -0
  547. data/share/guile/2.2/language/elisp/runtime/value-slot.scm +24 -0
  548. data/share/guile/2.2/language/elisp/runtime.scm +153 -0
  549. data/share/guile/2.2/language/elisp/spec.scm +43 -0
  550. data/share/guile/2.2/language/scheme/compile-tree-il.scm +33 -0
  551. data/share/guile/2.2/language/scheme/decompile-tree-il.scm +796 -0
  552. data/share/guile/2.2/language/scheme/spec.scm +63 -0
  553. data/share/guile/2.2/language/tree-il/analyze.scm +1568 -0
  554. data/share/guile/2.2/language/tree-il/canonicalize.scm +82 -0
  555. data/share/guile/2.2/language/tree-il/compile-cps.scm +1149 -0
  556. data/share/guile/2.2/language/tree-il/debug.scm +246 -0
  557. data/share/guile/2.2/language/tree-il/effects.scm +591 -0
  558. data/share/guile/2.2/language/tree-il/fix-letrec.scm +314 -0
  559. data/share/guile/2.2/language/tree-il/optimize.scm +43 -0
  560. data/share/guile/2.2/language/tree-il/peval.scm +1669 -0
  561. data/share/guile/2.2/language/tree-il/primitives.scm +630 -0
  562. data/share/guile/2.2/language/tree-il/spec.scm +46 -0
  563. data/share/guile/2.2/language/tree-il.scm +630 -0
  564. data/share/guile/2.2/language/value/spec.scm +30 -0
  565. data/share/guile/2.2/oop/goops/accessors.scm +72 -0
  566. data/share/guile/2.2/oop/goops/active-slot.scm +63 -0
  567. data/share/guile/2.2/oop/goops/composite-slot.scm +83 -0
  568. data/share/guile/2.2/oop/goops/describe.scm +189 -0
  569. data/share/guile/2.2/oop/goops/internal.scm +30 -0
  570. data/share/guile/2.2/oop/goops/save.scm +874 -0
  571. data/share/guile/2.2/oop/goops/simple.scm +30 -0
  572. data/share/guile/2.2/oop/goops/stklos.scm +74 -0
  573. data/share/guile/2.2/oop/goops.scm +3176 -0
  574. data/share/guile/2.2/rnrs/arithmetic/bitwise.scm +92 -0
  575. data/share/guile/2.2/rnrs/arithmetic/fixnums.scm +291 -0
  576. data/share/guile/2.2/rnrs/arithmetic/flonums.scm +203 -0
  577. data/share/guile/2.2/rnrs/base.scm +291 -0
  578. data/share/guile/2.2/rnrs/bytevectors.scm +83 -0
  579. data/share/guile/2.2/rnrs/conditions.scm +225 -0
  580. data/share/guile/2.2/rnrs/control.scm +22 -0
  581. data/share/guile/2.2/rnrs/enums.scm +152 -0
  582. data/share/guile/2.2/rnrs/eval.scm +39 -0
  583. data/share/guile/2.2/rnrs/exceptions.scm +276 -0
  584. data/share/guile/2.2/rnrs/files.scm +96 -0
  585. data/share/guile/2.2/rnrs/hashtables.scm +190 -0
  586. data/share/guile/2.2/rnrs/io/ports.scm +554 -0
  587. data/share/guile/2.2/rnrs/io/simple.scm +167 -0
  588. data/share/guile/2.2/rnrs/lists.scm +55 -0
  589. data/share/guile/2.2/rnrs/mutable-pairs.scm +23 -0
  590. data/share/guile/2.2/rnrs/mutable-strings.scm +23 -0
  591. data/share/guile/2.2/rnrs/programs.scm +22 -0
  592. data/share/guile/2.2/rnrs/r5rs.scm +34 -0
  593. data/share/guile/2.2/rnrs/records/inspection.scm +81 -0
  594. data/share/guile/2.2/rnrs/records/procedural.scm +289 -0
  595. data/share/guile/2.2/rnrs/records/syntactic.scm +248 -0
  596. data/share/guile/2.2/rnrs/sorting.scm +27 -0
  597. data/share/guile/2.2/rnrs/syntax-case.scm +68 -0
  598. data/share/guile/2.2/rnrs/unicode.scm +104 -0
  599. data/share/guile/2.2/rnrs.scm +289 -0
  600. data/share/guile/2.2/scripts/api-diff.scm +179 -0
  601. data/share/guile/2.2/scripts/autofrisk.scm +218 -0
  602. data/share/guile/2.2/scripts/compile.scm +273 -0
  603. data/share/guile/2.2/scripts/disassemble.scm +38 -0
  604. data/share/guile/2.2/scripts/display-commentary.scm +67 -0
  605. data/share/guile/2.2/scripts/doc-snarf.scm +439 -0
  606. data/share/guile/2.2/scripts/frisk.scm +290 -0
  607. data/share/guile/2.2/scripts/generate-autoload.scm +144 -0
  608. data/share/guile/2.2/scripts/help.scm +188 -0
  609. data/share/guile/2.2/scripts/lint.scm +318 -0
  610. data/share/guile/2.2/scripts/list.scm +91 -0
  611. data/share/guile/2.2/scripts/punify.scm +87 -0
  612. data/share/guile/2.2/scripts/read-rfc822.scm +131 -0
  613. data/share/guile/2.2/scripts/read-scheme-source.scm +282 -0
  614. data/share/guile/2.2/scripts/read-text-outline.scm +253 -0
  615. data/share/guile/2.2/scripts/scan-api.scm +223 -0
  616. data/share/guile/2.2/scripts/snarf-check-and-output-texi.scm +303 -0
  617. data/share/guile/2.2/scripts/snarf-guile-m4-docs.scm +86 -0
  618. data/share/guile/2.2/scripts/summarize-guile-TODO.scm +213 -0
  619. data/share/guile/2.2/scripts/use2dot.scm +110 -0
  620. data/share/guile/2.2/srfi/srfi-1.scm +1061 -0
  621. data/share/guile/2.2/srfi/srfi-10.scm +89 -0
  622. data/share/guile/2.2/srfi/srfi-11.scm +146 -0
  623. data/share/guile/2.2/srfi/srfi-111.scm +37 -0
  624. data/share/guile/2.2/srfi/srfi-13.scm +132 -0
  625. data/share/guile/2.2/srfi/srfi-14.scm +99 -0
  626. data/share/guile/2.2/srfi/srfi-16.scm +51 -0
  627. data/share/guile/2.2/srfi/srfi-17.scm +174 -0
  628. data/share/guile/2.2/srfi/srfi-18.scm +382 -0
  629. data/share/guile/2.2/srfi/srfi-19.scm +1470 -0
  630. data/share/guile/2.2/srfi/srfi-2.scm +31 -0
  631. data/share/guile/2.2/srfi/srfi-26.scm +66 -0
  632. data/share/guile/2.2/srfi/srfi-27.scm +96 -0
  633. data/share/guile/2.2/srfi/srfi-28.scm +34 -0
  634. data/share/guile/2.2/srfi/srfi-31.scm +35 -0
  635. data/share/guile/2.2/srfi/srfi-34.scm +84 -0
  636. data/share/guile/2.2/srfi/srfi-35.scm +351 -0
  637. data/share/guile/2.2/srfi/srfi-37.scm +234 -0
  638. data/share/guile/2.2/srfi/srfi-38.scm +207 -0
  639. data/share/guile/2.2/srfi/srfi-39.scm +55 -0
  640. data/share/guile/2.2/srfi/srfi-4/gnu.scm +80 -0
  641. data/share/guile/2.2/srfi/srfi-4.scm +118 -0
  642. data/share/guile/2.2/srfi/srfi-41.scm +505 -0
  643. data/share/guile/2.2/srfi/srfi-42/ec.scm +1053 -0
  644. data/share/guile/2.2/srfi/srfi-42.scm +66 -0
  645. data/share/guile/2.2/srfi/srfi-43.scm +1077 -0
  646. data/share/guile/2.2/srfi/srfi-45.scm +93 -0
  647. data/share/guile/2.2/srfi/srfi-6.scm +29 -0
  648. data/share/guile/2.2/srfi/srfi-60.scm +73 -0
  649. data/share/guile/2.2/srfi/srfi-64/testing.scm +1040 -0
  650. data/share/guile/2.2/srfi/srfi-64.scm +55 -0
  651. data/share/guile/2.2/srfi/srfi-67/compare.scm +686 -0
  652. data/share/guile/2.2/srfi/srfi-67.scm +88 -0
  653. data/share/guile/2.2/srfi/srfi-69.scm +336 -0
  654. data/share/guile/2.2/srfi/srfi-71.scm +267 -0
  655. data/share/guile/2.2/srfi/srfi-8.scm +31 -0
  656. data/share/guile/2.2/srfi/srfi-88.scm +53 -0
  657. data/share/guile/2.2/srfi/srfi-9/gnu.scm +168 -0
  658. data/share/guile/2.2/srfi/srfi-9.scm +351 -0
  659. data/share/guile/2.2/srfi/srfi-98.scm +44 -0
  660. data/share/guile/2.2/statprof.scm +988 -0
  661. data/share/guile/2.2/sxml/apply-templates.scm +102 -0
  662. data/share/guile/2.2/sxml/fold.scm +250 -0
  663. data/share/guile/2.2/sxml/match.scm +75 -0
  664. data/share/guile/2.2/sxml/simple.scm +408 -0
  665. data/share/guile/2.2/sxml/ssax/input-parse.scm +180 -0
  666. data/share/guile/2.2/sxml/ssax.scm +265 -0
  667. data/share/guile/2.2/sxml/sxml-match.ss +1181 -0
  668. data/share/guile/2.2/sxml/transform.scm +298 -0
  669. data/share/guile/2.2/sxml/upstream/SSAX.scm +3235 -0
  670. data/share/guile/2.2/sxml/upstream/SXML-tree-trans.scm +249 -0
  671. data/share/guile/2.2/sxml/upstream/SXPath-old.scm +1216 -0
  672. data/share/guile/2.2/sxml/upstream/assert.scm +35 -0
  673. data/share/guile/2.2/sxml/upstream/input-parse.scm +326 -0
  674. data/share/guile/2.2/sxml/xpath.scm +493 -0
  675. data/share/guile/2.2/system/base/ck.scm +55 -0
  676. data/share/guile/2.2/system/base/compile.scm +282 -0
  677. data/share/guile/2.2/system/base/lalr.scm +51 -0
  678. data/share/guile/2.2/system/base/lalr.upstream.scm +2096 -0
  679. data/share/guile/2.2/system/base/language.scm +119 -0
  680. data/share/guile/2.2/system/base/message.scm +238 -0
  681. data/share/guile/2.2/system/base/pmatch.scm +68 -0
  682. data/share/guile/2.2/system/base/syntax.scm +299 -0
  683. data/share/guile/2.2/system/base/target.scm +152 -0
  684. data/share/guile/2.2/system/base/types.scm +561 -0
  685. data/share/guile/2.2/system/foreign-object.scm +91 -0
  686. data/share/guile/2.2/system/foreign.scm +200 -0
  687. data/share/guile/2.2/system/repl/command.scm +946 -0
  688. data/share/guile/2.2/system/repl/common.scm +263 -0
  689. data/share/guile/2.2/system/repl/coop-server.scm +200 -0
  690. data/share/guile/2.2/system/repl/debug.scm +210 -0
  691. data/share/guile/2.2/system/repl/describe.scm +347 -0
  692. data/share/guile/2.2/system/repl/error-handling.scm +183 -0
  693. data/share/guile/2.2/system/repl/repl.scm +233 -0
  694. data/share/guile/2.2/system/repl/server.scm +332 -0
  695. data/share/guile/2.2/system/syntax.scm +33 -0
  696. data/share/guile/2.2/system/vm/assembler.scm +2614 -0
  697. data/share/guile/2.2/system/vm/coverage.scm +351 -0
  698. data/share/guile/2.2/system/vm/debug.scm +766 -0
  699. data/share/guile/2.2/system/vm/disassembler.scm +658 -0
  700. data/share/guile/2.2/system/vm/dwarf.scm +1852 -0
  701. data/share/guile/2.2/system/vm/elf.scm +1042 -0
  702. data/share/guile/2.2/system/vm/frame.scm +485 -0
  703. data/share/guile/2.2/system/vm/inspect.scm +188 -0
  704. data/share/guile/2.2/system/vm/linker.scm +732 -0
  705. data/share/guile/2.2/system/vm/loader.scm +27 -0
  706. data/share/guile/2.2/system/vm/program.scm +312 -0
  707. data/share/guile/2.2/system/vm/trace.scm +121 -0
  708. data/share/guile/2.2/system/vm/trap-state.scm +302 -0
  709. data/share/guile/2.2/system/vm/traps.scm +608 -0
  710. data/share/guile/2.2/system/vm/vm.scm +32 -0
  711. data/share/guile/2.2/system/xref.scm +369 -0
  712. data/share/guile/2.2/texinfo/docbook.scm +240 -0
  713. data/share/guile/2.2/texinfo/html.scm +279 -0
  714. data/share/guile/2.2/texinfo/indexing.scm +75 -0
  715. data/share/guile/2.2/texinfo/plain-text.scm +322 -0
  716. data/share/guile/2.2/texinfo/reflection.scm +585 -0
  717. data/share/guile/2.2/texinfo/serialize.scm +300 -0
  718. data/share/guile/2.2/texinfo/string-utils.scm +410 -0
  719. data/share/guile/2.2/texinfo.scm +1263 -0
  720. data/share/guile/2.2/web/client.scm +513 -0
  721. data/share/guile/2.2/web/http.scm +2043 -0
  722. data/share/guile/2.2/web/request.scm +326 -0
  723. data/share/guile/2.2/web/response.scm +379 -0
  724. data/share/guile/2.2/web/server/http.scm +183 -0
  725. data/share/guile/2.2/web/server.scm +397 -0
  726. data/share/guile/2.2/web/uri.scm +552 -0
  727. data/share/lilypond/2.24.1/fontconfig/0bd3dc0958fa2205aaaa8ebb13e2872b-le64.cache-8 +0 -0
  728. data/share/lilypond/2.24.1/fontconfig/188ac73a183f12857f63bb60a4a6d603-le64.cache-8 +0 -0
  729. data/share/lilypond/2.24.1/fontconfig/32b6488e5b8292a2e95c79d947e009e8-le64.cache-8 +0 -0
  730. data/share/lilypond/2.24.1/fontconfig/3830d5c3ddfd5cd38a049b759396e72e-le64.cache-8 +0 -0
  731. data/share/lilypond/2.24.1/fontconfig/3f7329c5293ffd510edef78f73874cfd-le64.cache-8 +0 -0
  732. data/share/lilypond/2.24.1/fontconfig/4c599c202bc5c08e2d34565a40eac3b2-le64.cache-8 +0 -0
  733. data/share/lilypond/2.24.1/fontconfig/57e423e26b20ab21d0f2f29c145174c3-le64.cache-8 +0 -0
  734. data/share/lilypond/2.24.1/fontconfig/7ef2298fde41cc6eeb7af42e48b7d293-le64.cache-8 +0 -0
  735. data/share/lilypond/2.24.1/fontconfig/826f6b6ef79022e2eac8af26bf4b62f2-le64.cache-8 +0 -0
  736. data/share/lilypond/2.24.1/fontconfig/945677eb7aeaf62f1d50efc3fb3ec7d8-le64.cache-8 +0 -0
  737. data/share/lilypond/2.24.1/fontconfig/95530828ff6c81d309f8258d8d02a23e-le64.cache-8 +0 -0
  738. data/share/lilypond/2.24.1/fontconfig/CACHEDIR.TAG +4 -0
  739. data/share/lilypond/2.24.1/fontconfig/bf3b770c553c462765856025a94f1ce6-le64.cache-8 +0 -0
  740. data/share/lilypond/2.24.1/fontconfig/c855463f699352c367813e37f3f70ea7-le64.cache-8 +0 -0
  741. data/share/lilypond/2.24.1/fontconfig/d3e5c4ee2ceb1fc347f91d4cefc53bc0-le64.cache-8 +0 -0
  742. data/share/lilypond/2.24.1/fontconfig/d589a48862398ed80a3d6066f4f56f4c-le64.cache-8 +0 -0
  743. data/share/lilypond/2.24.1/fontconfig/d82eb4fd963d448e2fcb7d7b793b5df3-le64.cache-8 +0 -0
  744. data/share/lilypond/2.24.1/fontconfig/e13b20fdb08344e0e664864cc2ede53d-le64.cache-8 +0 -0
  745. data/share/lilypond/2.24.1/fontconfig/e52a45a1c8c8fe895fc0fc8c4e6999b8-le64.cache-8 +0 -0
  746. data/share/lilypond/2.24.1/fontconfig/f1f2465696798768e9653f19e17ccdc8-le64.cache-8 +0 -0
  747. data/share/lilypond/2.24.1/fonts/00-lilypond-fonts.conf +99 -0
  748. data/share/lilypond/2.24.1/fonts/99-lilypond-fonts.conf +28 -0
  749. data/share/lilypond/2.24.1/fonts/otf/C059-BdIta.otf +0 -0
  750. data/share/lilypond/2.24.1/fonts/otf/C059-Bold.otf +0 -0
  751. data/share/lilypond/2.24.1/fonts/otf/C059-Italic.otf +0 -0
  752. data/share/lilypond/2.24.1/fonts/otf/C059-Roman.otf +0 -0
  753. data/share/lilypond/2.24.1/fonts/otf/NimbusMonoPS-Bold.otf +0 -0
  754. data/share/lilypond/2.24.1/fonts/otf/NimbusMonoPS-BoldItalic.otf +0 -0
  755. data/share/lilypond/2.24.1/fonts/otf/NimbusMonoPS-Italic.otf +0 -0
  756. data/share/lilypond/2.24.1/fonts/otf/NimbusMonoPS-Regular.otf +0 -0
  757. data/share/lilypond/2.24.1/fonts/otf/NimbusSans-Bold.otf +0 -0
  758. data/share/lilypond/2.24.1/fonts/otf/NimbusSans-BoldItalic.otf +0 -0
  759. data/share/lilypond/2.24.1/fonts/otf/NimbusSans-Italic.otf +0 -0
  760. data/share/lilypond/2.24.1/fonts/otf/NimbusSans-Regular.otf +0 -0
  761. data/share/lilypond/2.24.1/fonts/otf/emmentaler-11.otf +0 -0
  762. data/share/lilypond/2.24.1/fonts/otf/emmentaler-13.otf +0 -0
  763. data/share/lilypond/2.24.1/fonts/otf/emmentaler-14.otf +0 -0
  764. data/share/lilypond/2.24.1/fonts/otf/emmentaler-16.otf +0 -0
  765. data/share/lilypond/2.24.1/fonts/otf/emmentaler-18.otf +0 -0
  766. data/share/lilypond/2.24.1/fonts/otf/emmentaler-20.otf +0 -0
  767. data/share/lilypond/2.24.1/fonts/otf/emmentaler-23.otf +0 -0
  768. data/share/lilypond/2.24.1/fonts/otf/emmentaler-26.otf +0 -0
  769. data/share/lilypond/2.24.1/fonts/otf/emmentaler-brace.otf +0 -0
  770. data/share/lilypond/2.24.1/fonts/otf/texgyrecursor-bold.otf +0 -0
  771. data/share/lilypond/2.24.1/fonts/otf/texgyrecursor-bolditalic.otf +0 -0
  772. data/share/lilypond/2.24.1/fonts/otf/texgyrecursor-italic.otf +0 -0
  773. data/share/lilypond/2.24.1/fonts/otf/texgyrecursor-regular.otf +0 -0
  774. data/share/lilypond/2.24.1/fonts/otf/texgyreheros-bold.otf +0 -0
  775. data/share/lilypond/2.24.1/fonts/otf/texgyreheros-bolditalic.otf +0 -0
  776. data/share/lilypond/2.24.1/fonts/otf/texgyreheros-italic.otf +0 -0
  777. data/share/lilypond/2.24.1/fonts/otf/texgyreheros-regular.otf +0 -0
  778. data/share/lilypond/2.24.1/fonts/otf/texgyreschola-bold.otf +0 -0
  779. data/share/lilypond/2.24.1/fonts/otf/texgyreschola-bolditalic.otf +0 -0
  780. data/share/lilypond/2.24.1/fonts/otf/texgyreschola-italic.otf +0 -0
  781. data/share/lilypond/2.24.1/fonts/otf/texgyreschola-regular.otf +0 -0
  782. data/share/lilypond/2.24.1/fonts/source/common-modules-and-initialization.mf +26 -0
  783. data/share/lilypond/2.24.1/fonts/source/debugging-settings.mf +14 -0
  784. data/share/lilypond/2.24.1/fonts/source/declare-autometric-parameters.mf +9 -0
  785. data/share/lilypond/2.24.1/fonts/source/feta-accidentals.mf +58 -0
  786. data/share/lilypond/2.24.1/fonts/source/feta-accordion.mf +575 -0
  787. data/share/lilypond/2.24.1/fonts/source/feta-alphabet-generic.mf +16 -0
  788. data/share/lilypond/2.24.1/fonts/source/feta-alphabet11.mf +6 -0
  789. data/share/lilypond/2.24.1/fonts/source/feta-alphabet13.mf +6 -0
  790. data/share/lilypond/2.24.1/fonts/source/feta-alphabet14.mf +6 -0
  791. data/share/lilypond/2.24.1/fonts/source/feta-alphabet16.mf +6 -0
  792. data/share/lilypond/2.24.1/fonts/source/feta-alphabet18.mf +6 -0
  793. data/share/lilypond/2.24.1/fonts/source/feta-alphabet20.mf +6 -0
  794. data/share/lilypond/2.24.1/fonts/source/feta-alphabet23.mf +6 -0
  795. data/share/lilypond/2.24.1/fonts/source/feta-alphabet26.mf +6 -0
  796. data/share/lilypond/2.24.1/fonts/source/feta-arrow.mf +114 -0
  797. data/share/lilypond/2.24.1/fonts/source/feta-arrowheads.mf +171 -0
  798. data/share/lilypond/2.24.1/fonts/source/feta-autometric.mf +303 -0
  799. data/share/lilypond/2.24.1/fonts/source/feta-braces-a.mf +6 -0
  800. data/share/lilypond/2.24.1/fonts/source/feta-braces-b.mf +6 -0
  801. data/share/lilypond/2.24.1/fonts/source/feta-braces-c.mf +6 -0
  802. data/share/lilypond/2.24.1/fonts/source/feta-braces-d.mf +6 -0
  803. data/share/lilypond/2.24.1/fonts/source/feta-braces-e.mf +6 -0
  804. data/share/lilypond/2.24.1/fonts/source/feta-braces-f.mf +6 -0
  805. data/share/lilypond/2.24.1/fonts/source/feta-braces-g.mf +6 -0
  806. data/share/lilypond/2.24.1/fonts/source/feta-braces-generic.mf +47 -0
  807. data/share/lilypond/2.24.1/fonts/source/feta-braces-h.mf +6 -0
  808. data/share/lilypond/2.24.1/fonts/source/feta-braces-i.mf +6 -0
  809. data/share/lilypond/2.24.1/fonts/source/feta-braces.mf +125 -0
  810. data/share/lilypond/2.24.1/fonts/source/feta-brackettips.mf +100 -0
  811. data/share/lilypond/2.24.1/fonts/source/feta-clefs.mf +963 -0
  812. data/share/lilypond/2.24.1/fonts/source/feta-dots.mf +37 -0
  813. data/share/lilypond/2.24.1/fonts/source/feta-dynamics.mf +891 -0
  814. data/share/lilypond/2.24.1/fonts/source/feta-flags-generic.mf +17 -0
  815. data/share/lilypond/2.24.1/fonts/source/feta-flags.mf +926 -0
  816. data/share/lilypond/2.24.1/fonts/source/feta-flags11.mf +6 -0
  817. data/share/lilypond/2.24.1/fonts/source/feta-flags13.mf +6 -0
  818. data/share/lilypond/2.24.1/fonts/source/feta-flags14.mf +6 -0
  819. data/share/lilypond/2.24.1/fonts/source/feta-flags16.mf +6 -0
  820. data/share/lilypond/2.24.1/fonts/source/feta-flags18.mf +6 -0
  821. data/share/lilypond/2.24.1/fonts/source/feta-flags20.mf +6 -0
  822. data/share/lilypond/2.24.1/fonts/source/feta-flags23.mf +6 -0
  823. data/share/lilypond/2.24.1/fonts/source/feta-flags26.mf +6 -0
  824. data/share/lilypond/2.24.1/fonts/source/feta-flats.mf +668 -0
  825. data/share/lilypond/2.24.1/fonts/source/feta-macros.mf +506 -0
  826. data/share/lilypond/2.24.1/fonts/source/feta-naturals.mf +223 -0
  827. data/share/lilypond/2.24.1/fonts/source/feta-noteheads-generic.mf +17 -0
  828. data/share/lilypond/2.24.1/fonts/source/feta-noteheads.mf +2642 -0
  829. data/share/lilypond/2.24.1/fonts/source/feta-noteheads11.mf +6 -0
  830. data/share/lilypond/2.24.1/fonts/source/feta-noteheads13.mf +6 -0
  831. data/share/lilypond/2.24.1/fonts/source/feta-noteheads14.mf +6 -0
  832. data/share/lilypond/2.24.1/fonts/source/feta-noteheads16.mf +6 -0
  833. data/share/lilypond/2.24.1/fonts/source/feta-noteheads18.mf +6 -0
  834. data/share/lilypond/2.24.1/fonts/source/feta-noteheads20.mf +6 -0
  835. data/share/lilypond/2.24.1/fonts/source/feta-noteheads23.mf +6 -0
  836. data/share/lilypond/2.24.1/fonts/source/feta-noteheads26.mf +6 -0
  837. data/share/lilypond/2.24.1/fonts/source/feta-numbers.mf +1677 -0
  838. data/share/lilypond/2.24.1/fonts/source/feta-other-generic.mf +27 -0
  839. data/share/lilypond/2.24.1/fonts/source/feta-params.mf +323 -0
  840. data/share/lilypond/2.24.1/fonts/source/feta-parenthesis.mf +63 -0
  841. data/share/lilypond/2.24.1/fonts/source/feta-pedals.mf +355 -0
  842. data/share/lilypond/2.24.1/fonts/source/feta-rests.mf +890 -0
  843. data/share/lilypond/2.24.1/fonts/source/feta-scripts.mf +2206 -0
  844. data/share/lilypond/2.24.1/fonts/source/feta-sharps.mf +524 -0
  845. data/share/lilypond/2.24.1/fonts/source/feta-sori-koron.mf +325 -0
  846. data/share/lilypond/2.24.1/fonts/source/feta-ties.mf +72 -0
  847. data/share/lilypond/2.24.1/fonts/source/feta-timesignatures.mf +119 -0
  848. data/share/lilypond/2.24.1/fonts/source/feta-trills.mf +321 -0
  849. data/share/lilypond/2.24.1/fonts/source/feta11.mf +6 -0
  850. data/share/lilypond/2.24.1/fonts/source/feta13.mf +6 -0
  851. data/share/lilypond/2.24.1/fonts/source/feta14.mf +6 -0
  852. data/share/lilypond/2.24.1/fonts/source/feta16.mf +6 -0
  853. data/share/lilypond/2.24.1/fonts/source/feta18.mf +6 -0
  854. data/share/lilypond/2.24.1/fonts/source/feta20.mf +7 -0
  855. data/share/lilypond/2.24.1/fonts/source/feta23.mf +6 -0
  856. data/share/lilypond/2.24.1/fonts/source/feta26.mf +6 -0
  857. data/share/lilypond/2.24.1/fonts/source/parmesan-accidentals.mf +483 -0
  858. data/share/lilypond/2.24.1/fonts/source/parmesan-clefs.mf +1636 -0
  859. data/share/lilypond/2.24.1/fonts/source/parmesan-custodes.mf +503 -0
  860. data/share/lilypond/2.24.1/fonts/source/parmesan-dots.mf +62 -0
  861. data/share/lilypond/2.24.1/fonts/source/parmesan-flags.mf +319 -0
  862. data/share/lilypond/2.24.1/fonts/source/parmesan-macros.mf +225 -0
  863. data/share/lilypond/2.24.1/fonts/source/parmesan-noteheads-generic.mf +16 -0
  864. data/share/lilypond/2.24.1/fonts/source/parmesan-noteheads.mf +2191 -0
  865. data/share/lilypond/2.24.1/fonts/source/parmesan-noteheads11.mf +6 -0
  866. data/share/lilypond/2.24.1/fonts/source/parmesan-noteheads13.mf +6 -0
  867. data/share/lilypond/2.24.1/fonts/source/parmesan-noteheads14.mf +6 -0
  868. data/share/lilypond/2.24.1/fonts/source/parmesan-noteheads16.mf +6 -0
  869. data/share/lilypond/2.24.1/fonts/source/parmesan-noteheads18.mf +6 -0
  870. data/share/lilypond/2.24.1/fonts/source/parmesan-noteheads20.mf +6 -0
  871. data/share/lilypond/2.24.1/fonts/source/parmesan-noteheads23.mf +6 -0
  872. data/share/lilypond/2.24.1/fonts/source/parmesan-noteheads26.mf +6 -0
  873. data/share/lilypond/2.24.1/fonts/source/parmesan-other-generic.mf +24 -0
  874. data/share/lilypond/2.24.1/fonts/source/parmesan-rests.mf +428 -0
  875. data/share/lilypond/2.24.1/fonts/source/parmesan-scripts.mf +284 -0
  876. data/share/lilypond/2.24.1/fonts/source/parmesan-timesignatures.mf +402 -0
  877. data/share/lilypond/2.24.1/fonts/source/parmesan11.mf +6 -0
  878. data/share/lilypond/2.24.1/fonts/source/parmesan13.mf +6 -0
  879. data/share/lilypond/2.24.1/fonts/source/parmesan14.mf +6 -0
  880. data/share/lilypond/2.24.1/fonts/source/parmesan16.mf +6 -0
  881. data/share/lilypond/2.24.1/fonts/source/parmesan18.mf +6 -0
  882. data/share/lilypond/2.24.1/fonts/source/parmesan20.mf +6 -0
  883. data/share/lilypond/2.24.1/fonts/source/parmesan23.mf +6 -0
  884. data/share/lilypond/2.24.1/fonts/source/parmesan26.mf +6 -0
  885. data/share/lilypond/2.24.1/fonts/svg/emmentaler-11.svg +2525 -0
  886. data/share/lilypond/2.24.1/fonts/svg/emmentaler-11.woff +0 -0
  887. data/share/lilypond/2.24.1/fonts/svg/emmentaler-13.svg +2530 -0
  888. data/share/lilypond/2.24.1/fonts/svg/emmentaler-13.woff +0 -0
  889. data/share/lilypond/2.24.1/fonts/svg/emmentaler-14.svg +2526 -0
  890. data/share/lilypond/2.24.1/fonts/svg/emmentaler-14.woff +0 -0
  891. data/share/lilypond/2.24.1/fonts/svg/emmentaler-16.svg +2523 -0
  892. data/share/lilypond/2.24.1/fonts/svg/emmentaler-16.woff +0 -0
  893. data/share/lilypond/2.24.1/fonts/svg/emmentaler-18.svg +2519 -0
  894. data/share/lilypond/2.24.1/fonts/svg/emmentaler-18.woff +0 -0
  895. data/share/lilypond/2.24.1/fonts/svg/emmentaler-20.svg +2512 -0
  896. data/share/lilypond/2.24.1/fonts/svg/emmentaler-20.woff +0 -0
  897. data/share/lilypond/2.24.1/fonts/svg/emmentaler-23.svg +2506 -0
  898. data/share/lilypond/2.24.1/fonts/svg/emmentaler-23.woff +0 -0
  899. data/share/lilypond/2.24.1/fonts/svg/emmentaler-26.svg +2510 -0
  900. data/share/lilypond/2.24.1/fonts/svg/emmentaler-26.woff +0 -0
  901. data/share/lilypond/2.24.1/fonts/svg/emmentaler-brace.svg +1757 -0
  902. data/share/lilypond/2.24.1/fonts/svg/emmentaler-brace.woff +0 -0
  903. data/share/lilypond/2.24.1/ly/Welcome_to_LilyPond.ly +45 -0
  904. data/share/lilypond/2.24.1/ly/arabic.ly +185 -0
  905. data/share/lilypond/2.24.1/ly/articulate.ly +1013 -0
  906. data/share/lilypond/2.24.1/ly/bagpipe.ly +368 -0
  907. data/share/lilypond/2.24.1/ly/base-tkit.ly +135 -0
  908. data/share/lilypond/2.24.1/ly/catalan.ly +23 -0
  909. data/share/lilypond/2.24.1/ly/chord-modifiers-init.ly +63 -0
  910. data/share/lilypond/2.24.1/ly/chord-repetition-init.ly +60 -0
  911. data/share/lilypond/2.24.1/ly/context-mods-init.ly +119 -0
  912. data/share/lilypond/2.24.1/ly/declarations-init.ly +167 -0
  913. data/share/lilypond/2.24.1/ly/deutsch.ly +23 -0
  914. data/share/lilypond/2.24.1/ly/drumpitch-init.ly +366 -0
  915. data/share/lilypond/2.24.1/ly/dynamic-scripts-init.ly +54 -0
  916. data/share/lilypond/2.24.1/ly/english.ly +23 -0
  917. data/share/lilypond/2.24.1/ly/engraver-init.ly +1619 -0
  918. data/share/lilypond/2.24.1/ly/espanol.ly +23 -0
  919. data/share/lilypond/2.24.1/ly/event-listener.ly +241 -0
  920. data/share/lilypond/2.24.1/ly/festival.ly +38 -0
  921. data/share/lilypond/2.24.1/ly/generate-documentation.ly +7 -0
  922. data/share/lilypond/2.24.1/ly/grace-init.ly +56 -0
  923. data/share/lilypond/2.24.1/ly/graphviz-init.ly +174 -0
  924. data/share/lilypond/2.24.1/ly/gregorian.ly +268 -0
  925. data/share/lilypond/2.24.1/ly/guile-debugger.ly +55 -0
  926. data/share/lilypond/2.24.1/ly/hel-arabic.ly +307 -0
  927. data/share/lilypond/2.24.1/ly/init.ly +96 -0
  928. data/share/lilypond/2.24.1/ly/italiano.ly +23 -0
  929. data/share/lilypond/2.24.1/ly/lilypond-book-preamble.ly +47 -0
  930. data/share/lilypond/2.24.1/ly/lyrics-tkit.ly +68 -0
  931. data/share/lilypond/2.24.1/ly/makam.ly +166 -0
  932. data/share/lilypond/2.24.1/ly/midi-init.ly +59 -0
  933. data/share/lilypond/2.24.1/ly/music-functions-init.ly +2254 -0
  934. data/share/lilypond/2.24.1/ly/nederlands.ly +23 -0
  935. data/share/lilypond/2.24.1/ly/norsk.ly +23 -0
  936. data/share/lilypond/2.24.1/ly/paper-defaults-init.ly +188 -0
  937. data/share/lilypond/2.24.1/ly/performer-init.ly +398 -0
  938. data/share/lilypond/2.24.1/ly/persian.ly +335 -0
  939. data/share/lilypond/2.24.1/ly/piano-tkit.ly +61 -0
  940. data/share/lilypond/2.24.1/ly/portugues.ly +23 -0
  941. data/share/lilypond/2.24.1/ly/predefined-fretboards-init.ly +78 -0
  942. data/share/lilypond/2.24.1/ly/predefined-guitar-fretboards.ly +506 -0
  943. data/share/lilypond/2.24.1/ly/predefined-guitar-ninth-fretboards.ly +75 -0
  944. data/share/lilypond/2.24.1/ly/predefined-mandolin-fretboards.ly +876 -0
  945. data/share/lilypond/2.24.1/ly/predefined-ukulele-fretboards.ly +1285 -0
  946. data/share/lilypond/2.24.1/ly/property-init.ly +858 -0
  947. data/share/lilypond/2.24.1/ly/satb.ly +214 -0
  948. data/share/lilypond/2.24.1/ly/scale-definitions-init.ly +117 -0
  949. data/share/lilypond/2.24.1/ly/scheme-sandbox.ly +39 -0
  950. data/share/lilypond/2.24.1/ly/script-init.ly +94 -0
  951. data/share/lilypond/2.24.1/ly/spanners-init.ly +146 -0
  952. data/share/lilypond/2.24.1/ly/ssaattbb.ly +335 -0
  953. data/share/lilypond/2.24.1/ly/staff-tkit.ly +182 -0
  954. data/share/lilypond/2.24.1/ly/string-tunings-init.ly +94 -0
  955. data/share/lilypond/2.24.1/ly/suomi.ly +23 -0
  956. data/share/lilypond/2.24.1/ly/svenska.ly +23 -0
  957. data/share/lilypond/2.24.1/ly/swing.ly +362 -0
  958. data/share/lilypond/2.24.1/ly/text-replacements.ly +150 -0
  959. data/share/lilypond/2.24.1/ly/titling-init.ly +150 -0
  960. data/share/lilypond/2.24.1/ly/toc-init.ly +182 -0
  961. data/share/lilypond/2.24.1/ly/turkish-makam.ly +609 -0
  962. data/share/lilypond/2.24.1/ly/vlaams.ly +23 -0
  963. data/share/lilypond/2.24.1/ly/vocal-tkit.ly +103 -0
  964. data/share/lilypond/2.24.1/ly/voice-tkit.ly +34 -0
  965. data/share/lilypond/2.24.1/ps/encodingdefs.ps +2611 -0
  966. data/share/lilypond/2.24.1/ps/lilyponddefs.ps +49 -0
  967. data/share/lilypond/2.24.1/ps/music-drawing-routines.ps +329 -0
  968. data/share/lilypond/2.24.1/python/__pycache__/book_base.cpython-310.pyc +0 -0
  969. data/share/lilypond/2.24.1/python/__pycache__/book_docbook.cpython-310.pyc +0 -0
  970. data/share/lilypond/2.24.1/python/__pycache__/book_html.cpython-310.pyc +0 -0
  971. data/share/lilypond/2.24.1/python/__pycache__/book_latex.cpython-310.pyc +0 -0
  972. data/share/lilypond/2.24.1/python/__pycache__/book_snippets.cpython-310.pyc +0 -0
  973. data/share/lilypond/2.24.1/python/__pycache__/book_texinfo.cpython-310.pyc +0 -0
  974. data/share/lilypond/2.24.1/python/__pycache__/convertrules.cpython-310.pyc +0 -0
  975. data/share/lilypond/2.24.1/python/__pycache__/langdefs.cpython-310.pyc +0 -0
  976. data/share/lilypond/2.24.1/python/__pycache__/lilylib.cpython-310.pyc +0 -0
  977. data/share/lilypond/2.24.1/python/__pycache__/midi.cpython-310.pyc +0 -0
  978. data/share/lilypond/2.24.1/python/__pycache__/musicexp.cpython-310.pyc +0 -0
  979. data/share/lilypond/2.24.1/python/__pycache__/musicxml.cpython-310.pyc +0 -0
  980. data/share/lilypond/2.24.1/python/__pycache__/musicxml2ly_conversion.cpython-310.pyc +0 -0
  981. data/share/lilypond/2.24.1/python/__pycache__/utilities.cpython-310.pyc +0 -0
  982. data/share/lilypond/2.24.1/python/book_base.py +331 -0
  983. data/share/lilypond/2.24.1/python/book_docbook.py +154 -0
  984. data/share/lilypond/2.24.1/python/book_html.py +178 -0
  985. data/share/lilypond/2.24.1/python/book_latex.py +373 -0
  986. data/share/lilypond/2.24.1/python/book_snippets.py +1052 -0
  987. data/share/lilypond/2.24.1/python/book_texinfo.py +437 -0
  988. data/share/lilypond/2.24.1/python/convertrules.py +4764 -0
  989. data/share/lilypond/2.24.1/python/langdefs.py +131 -0
  990. data/share/lilypond/2.24.1/python/lilylib.py +141 -0
  991. data/share/lilypond/2.24.1/python/midi.py +212 -0
  992. data/share/lilypond/2.24.1/python/musicexp.py +2781 -0
  993. data/share/lilypond/2.24.1/python/musicxml.py +1905 -0
  994. data/share/lilypond/2.24.1/python/musicxml2ly_conversion.py +80 -0
  995. data/share/lilypond/2.24.1/python/utilities.py +280 -0
  996. data/share/lilypond/2.24.1/scm/lily/accreg.scm +579 -0
  997. data/share/lilypond/2.24.1/scm/lily/auto-beam.scm +163 -0
  998. data/share/lilypond/2.24.1/scm/lily/autochange.scm +100 -0
  999. data/share/lilypond/2.24.1/scm/lily/backend-library.scm +593 -0
  1000. data/share/lilypond/2.24.1/scm/lily/bar-line.scm +1281 -0
  1001. data/share/lilypond/2.24.1/scm/lily/breath.scm +74 -0
  1002. data/share/lilypond/2.24.1/scm/lily/c++.scm +174 -0
  1003. data/share/lilypond/2.24.1/scm/lily/chord-entry.scm +278 -0
  1004. data/share/lilypond/2.24.1/scm/lily/chord-ignatzek-names.scm +304 -0
  1005. data/share/lilypond/2.24.1/scm/lily/chord-name.scm +217 -0
  1006. data/share/lilypond/2.24.1/scm/lily/clip-region.scm +87 -0
  1007. data/share/lilypond/2.24.1/scm/lily/color.scm +757 -0
  1008. data/share/lilypond/2.24.1/scm/lily/curried-definitions.scm +68 -0
  1009. data/share/lilypond/2.24.1/scm/lily/define-context-properties.scm +939 -0
  1010. data/share/lilypond/2.24.1/scm/lily/define-event-classes.scm +142 -0
  1011. data/share/lilypond/2.24.1/scm/lily/define-grob-interfaces.scm +640 -0
  1012. data/share/lilypond/2.24.1/scm/lily/define-grob-properties.scm +1647 -0
  1013. data/share/lilypond/2.24.1/scm/lily/define-grobs.scm +4027 -0
  1014. data/share/lilypond/2.24.1/scm/lily/define-markup-commands.scm +5737 -0
  1015. data/share/lilypond/2.24.1/scm/lily/define-music-callbacks.scm +257 -0
  1016. data/share/lilypond/2.24.1/scm/lily/define-music-display-methods.scm +1350 -0
  1017. data/share/lilypond/2.24.1/scm/lily/define-music-properties.scm +242 -0
  1018. data/share/lilypond/2.24.1/scm/lily/define-music-types.scm +983 -0
  1019. data/share/lilypond/2.24.1/scm/lily/define-note-names.scm +1421 -0
  1020. data/share/lilypond/2.24.1/scm/lily/define-stencil-commands.scm +71 -0
  1021. data/share/lilypond/2.24.1/scm/lily/define-woodwind-diagrams.scm +1215 -0
  1022. data/share/lilypond/2.24.1/scm/lily/display-lily.scm +315 -0
  1023. data/share/lilypond/2.24.1/scm/lily/display-woodwind-diagrams.scm +1985 -0
  1024. data/share/lilypond/2.24.1/scm/lily/document-backend.scm +307 -0
  1025. data/share/lilypond/2.24.1/scm/lily/document-context-mods.scm +98 -0
  1026. data/share/lilypond/2.24.1/scm/lily/document-functions.scm +169 -0
  1027. data/share/lilypond/2.24.1/scm/lily/document-identifiers.scm +76 -0
  1028. data/share/lilypond/2.24.1/scm/lily/document-markup.scm +158 -0
  1029. data/share/lilypond/2.24.1/scm/lily/document-music.scm +146 -0
  1030. data/share/lilypond/2.24.1/scm/lily/document-outside-staff-priorities.scm +40 -0
  1031. data/share/lilypond/2.24.1/scm/lily/document-paper-sizes.scm +71 -0
  1032. data/share/lilypond/2.24.1/scm/lily/document-translation.scm +318 -0
  1033. data/share/lilypond/2.24.1/scm/lily/document-type-predicates.scm +85 -0
  1034. data/share/lilypond/2.24.1/scm/lily/documentation-generate.scm +259 -0
  1035. data/share/lilypond/2.24.1/scm/lily/documentation-lib.scm +207 -0
  1036. data/share/lilypond/2.24.1/scm/lily/file-cache.scm +28 -0
  1037. data/share/lilypond/2.24.1/scm/lily/flag-styles.scm +249 -0
  1038. data/share/lilypond/2.24.1/scm/lily/font-encodings.scm +1242 -0
  1039. data/share/lilypond/2.24.1/scm/lily/font.scm +303 -0
  1040. data/share/lilypond/2.24.1/scm/lily/framework-cairo.scm +26 -0
  1041. data/share/lilypond/2.24.1/scm/lily/framework-ps.scm +896 -0
  1042. data/share/lilypond/2.24.1/scm/lily/framework-svg.scm +172 -0
  1043. data/share/lilypond/2.24.1/scm/lily/fret-diagrams.scm +1261 -0
  1044. data/share/lilypond/2.24.1/scm/lily/graphviz.scm +78 -0
  1045. data/share/lilypond/2.24.1/scm/lily/guile-debugger.scm +90 -0
  1046. data/share/lilypond/2.24.1/scm/lily/harp-pedals.scm +172 -0
  1047. data/share/lilypond/2.24.1/scm/lily/hyphenate-internal-words.scm +51 -0
  1048. data/share/lilypond/2.24.1/scm/lily/layout-beam.scm +73 -0
  1049. data/share/lilypond/2.24.1/scm/lily/layout-slur.scm +45 -0
  1050. data/share/lilypond/2.24.1/scm/lily/lily-library.scm +1446 -0
  1051. data/share/lilypond/2.24.1/scm/lily/lily-sort.scm +116 -0
  1052. data/share/lilypond/2.24.1/scm/lily/lily.scm +929 -0
  1053. data/share/lilypond/2.24.1/scm/lily/ly-syntax-constructors.scm +374 -0
  1054. data/share/lilypond/2.24.1/scm/lily/markup-macros.scm +493 -0
  1055. data/share/lilypond/2.24.1/scm/lily/markup.scm +126 -0
  1056. data/share/lilypond/2.24.1/scm/lily/midi.scm +258 -0
  1057. data/share/lilypond/2.24.1/scm/lily/modal-transforms.scm +337 -0
  1058. data/share/lilypond/2.24.1/scm/lily/music-functions.scm +2878 -0
  1059. data/share/lilypond/2.24.1/scm/lily/output-lib.scm +3377 -0
  1060. data/share/lilypond/2.24.1/scm/lily/output-ps.scm +335 -0
  1061. data/share/lilypond/2.24.1/scm/lily/output-svg.scm +684 -0
  1062. data/share/lilypond/2.24.1/scm/lily/page.scm +321 -0
  1063. data/share/lilypond/2.24.1/scm/lily/paper-system.scm +271 -0
  1064. data/share/lilypond/2.24.1/scm/lily/paper.scm +376 -0
  1065. data/share/lilypond/2.24.1/scm/lily/parser-clef.scm +205 -0
  1066. data/share/lilypond/2.24.1/scm/lily/parser-ly-from-scheme.scm +170 -0
  1067. data/share/lilypond/2.24.1/scm/lily/part-combiner.scm +998 -0
  1068. data/share/lilypond/2.24.1/scm/lily/predefined-fretboards.scm +54 -0
  1069. data/share/lilypond/2.24.1/scm/lily/ps-to-png.scm +182 -0
  1070. data/share/lilypond/2.24.1/scm/lily/scheme-engravers.scm +1813 -0
  1071. data/share/lilypond/2.24.1/scm/lily/scheme-performers.scm +126 -0
  1072. data/share/lilypond/2.24.1/scm/lily/script.scm +416 -0
  1073. data/share/lilypond/2.24.1/scm/lily/skyline.scm +25 -0
  1074. data/share/lilypond/2.24.1/scm/lily/song-util.scm +191 -0
  1075. data/share/lilypond/2.24.1/scm/lily/song.scm +853 -0
  1076. data/share/lilypond/2.24.1/scm/lily/stencil.scm +998 -0
  1077. data/share/lilypond/2.24.1/scm/lily/tablature.scm +392 -0
  1078. data/share/lilypond/2.24.1/scm/lily/time-signature-settings.scm +473 -0
  1079. data/share/lilypond/2.24.1/scm/lily/time-signature.scm +35 -0
  1080. data/share/lilypond/2.24.1/scm/lily/titling.scm +99 -0
  1081. data/share/lilypond/2.24.1/scm/lily/to-xml.scm +254 -0
  1082. data/share/lilypond/2.24.1/scm/lily/translation-functions.scm +1169 -0
  1083. data/share/lilypond/2.24.1/vim/compiler/lilypond.vim +36 -0
  1084. data/share/lilypond/2.24.1/vim/ftdetect/lilypond.vim +4 -0
  1085. data/share/lilypond/2.24.1/vim/ftplugin/lilypond.vim +91 -0
  1086. data/share/lilypond/2.24.1/vim/indent/lilypond.vim +79 -0
  1087. data/share/lilypond/2.24.1/vim/syntax/lilypond-words +1408 -0
  1088. data/share/lilypond/2.24.1/vim/syntax/lilypond-words.vim +3 -0
  1089. data/share/lilypond/2.24.1/vim/syntax/lilypond.vim +104 -0
  1090. data/share/locale/ca/LC_MESSAGES/lilypond.mo +0 -0
  1091. data/share/locale/cs/LC_MESSAGES/lilypond.mo +0 -0
  1092. data/share/locale/da/LC_MESSAGES/lilypond.mo +0 -0
  1093. data/share/locale/de/LC_MESSAGES/lilypond.mo +0 -0
  1094. data/share/locale/el/LC_MESSAGES/lilypond.mo +0 -0
  1095. data/share/locale/eo/LC_MESSAGES/lilypond.mo +0 -0
  1096. data/share/locale/es/LC_MESSAGES/lilypond.mo +0 -0
  1097. data/share/locale/fi/LC_MESSAGES/lilypond.mo +0 -0
  1098. data/share/locale/fr/LC_MESSAGES/lilypond.mo +0 -0
  1099. data/share/locale/it/LC_MESSAGES/lilypond.mo +0 -0
  1100. data/share/locale/ja/LC_MESSAGES/lilypond.mo +0 -0
  1101. data/share/locale/nl/LC_MESSAGES/lilypond.mo +0 -0
  1102. data/share/locale/ru/LC_MESSAGES/lilypond.mo +0 -0
  1103. data/share/locale/sv/LC_MESSAGES/lilypond.mo +0 -0
  1104. data/share/locale/tr/LC_MESSAGES/lilypond.mo +0 -0
  1105. data/share/locale/uk/LC_MESSAGES/lilypond.mo +0 -0
  1106. data/share/locale/vi/LC_MESSAGES/lilypond.mo +0 -0
  1107. data/share/locale/zh_CN/LC_MESSAGES/lilypond.mo +0 -0
  1108. data/share/locale/zh_TW/LC_MESSAGES/lilypond.mo +0 -0
  1109. metadata +1108 -1
@@ -0,0 +1,2043 @@
1
+ ;;; HTTP messages
2
+
3
+ ;; Copyright (C) 2010-2017 Free Software Foundation, Inc.
4
+
5
+ ;; This library is free software; you can redistribute it and/or
6
+ ;; modify it under the terms of the GNU Lesser General Public
7
+ ;; License as published by the Free Software Foundation; either
8
+ ;; version 3 of the License, or (at your option) any later version.
9
+ ;;
10
+ ;; This library is distributed in the hope that it will be useful,
11
+ ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13
+ ;; Lesser General Public License for more details.
14
+ ;;
15
+ ;; You should have received a copy of the GNU Lesser General Public
16
+ ;; License along with this library; if not, write to the Free Software
17
+ ;; Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
18
+ ;; 02110-1301 USA
19
+
20
+ ;;; Commentary:
21
+ ;;;
22
+ ;;; This module has a number of routines to parse textual
23
+ ;;; representations of HTTP data into native Scheme data structures.
24
+ ;;;
25
+ ;;; It tries to follow RFCs fairly strictly---the road to perdition
26
+ ;;; being paved with compatibility hacks---though some allowances are
27
+ ;;; made for not-too-divergent texts (like a quality of .2 which should
28
+ ;;; be 0.2, etc).
29
+ ;;;
30
+ ;;; Code:
31
+
32
+ (define-module (web http)
33
+ #:use-module ((srfi srfi-1) #:select (append-map! map!))
34
+ #:use-module (srfi srfi-9)
35
+ #:use-module (srfi srfi-19)
36
+ #:use-module (ice-9 rdelim)
37
+ #:use-module (ice-9 match)
38
+ #:use-module (ice-9 q)
39
+ #:use-module (ice-9 binary-ports)
40
+ #:use-module (ice-9 textual-ports)
41
+ #:use-module (rnrs bytevectors)
42
+ #:use-module (web uri)
43
+ #:export (string->header
44
+ header->string
45
+
46
+ declare-header!
47
+ declare-opaque-header!
48
+ known-header?
49
+ header-parser
50
+ header-validator
51
+ header-writer
52
+
53
+ read-header
54
+ parse-header
55
+ valid-header?
56
+ write-header
57
+
58
+ read-headers
59
+ write-headers
60
+
61
+ parse-http-method
62
+ parse-http-version
63
+ parse-request-uri
64
+
65
+ read-request-line
66
+ write-request-line
67
+ read-response-line
68
+ write-response-line
69
+
70
+ make-chunked-input-port
71
+ make-chunked-output-port
72
+
73
+ http-proxy-port?
74
+ set-http-proxy-port?!))
75
+
76
+
77
+ (define (put-symbol port sym)
78
+ (put-string port (symbol->string sym)))
79
+
80
+ (define (put-non-negative-integer port i)
81
+ (put-string port (number->string i)))
82
+
83
+ (define (string->header name)
84
+ "Parse NAME to a symbolic header name."
85
+ (string->symbol (string-downcase name)))
86
+
87
+ (define-record-type <header-decl>
88
+ (make-header-decl name parser validator writer multiple?)
89
+ header-decl?
90
+ (name header-decl-name)
91
+ (parser header-decl-parser)
92
+ (validator header-decl-validator)
93
+ (writer header-decl-writer)
94
+ (multiple? header-decl-multiple?))
95
+
96
+ ;; sym -> header
97
+ (define *declared-headers* (make-hash-table))
98
+
99
+ (define (lookup-header-decl sym)
100
+ (hashq-ref *declared-headers* sym))
101
+
102
+ (define* (declare-header! name
103
+ parser
104
+ validator
105
+ writer
106
+ #:key multiple?)
107
+ "Declare a parser, validator, and writer for a given header."
108
+ (unless (and (string? name) parser validator writer)
109
+ (error "bad header decl" name parser validator writer multiple?))
110
+ (let ((decl (make-header-decl name parser validator writer multiple?)))
111
+ (hashq-set! *declared-headers* (string->header name) decl)
112
+ decl))
113
+
114
+ (define (header->string sym)
115
+ "Return the string form for the header named SYM."
116
+ (let ((decl (lookup-header-decl sym)))
117
+ (if decl
118
+ (header-decl-name decl)
119
+ (string-titlecase (symbol->string sym)))))
120
+
121
+ (define (known-header? sym)
122
+ "Return ‘#t’ iff SYM is a known header, with associated
123
+ parsers and serialization procedures."
124
+ (and (lookup-header-decl sym) #t))
125
+
126
+ (define (header-parser sym)
127
+ "Return the value parser for headers named SYM. The result is a
128
+ procedure that takes one argument, a string, and returns the parsed
129
+ value. If the header isn't known to Guile, a default parser is returned
130
+ that passes through the string unchanged."
131
+ (let ((decl (lookup-header-decl sym)))
132
+ (if decl
133
+ (header-decl-parser decl)
134
+ (lambda (x) x))))
135
+
136
+ (define (header-validator sym)
137
+ "Return a predicate which returns ‘#t’ if the given value is valid
138
+ for headers named SYM. The default validator for unknown headers
139
+ is ‘string?’."
140
+ (let ((decl (lookup-header-decl sym)))
141
+ (if decl
142
+ (header-decl-validator decl)
143
+ string?)))
144
+
145
+ (define (header-writer sym)
146
+ "Return a procedure that writes values for headers named SYM to a
147
+ port. The resulting procedure takes two arguments: a value and a port.
148
+ The default writer will call ‘put-string’."
149
+ (let ((decl (lookup-header-decl sym)))
150
+ (if decl
151
+ (header-decl-writer decl)
152
+ (lambda (val port)
153
+ (put-string port val)))))
154
+
155
+ (define (read-header-line port)
156
+ "Read an HTTP header line and return it without its final CRLF or LF.
157
+ Raise a 'bad-header' exception if the line does not end in CRLF or LF,
158
+ or if EOF is reached."
159
+ (match (%read-line port)
160
+ (((? string? line) . #\newline)
161
+ ;; '%read-line' does not consider #\return a delimiter; so if it's
162
+ ;; there, remove it. We are more tolerant than the RFC in that we
163
+ ;; tolerate LF-only endings.
164
+ (if (string-suffix? "\r" line)
165
+ (string-drop-right line 1)
166
+ line))
167
+ ((line . _) ;EOF or missing delimiter
168
+ (bad-header 'read-header-line line))))
169
+
170
+ (define (read-continuation-line port val)
171
+ (match (peek-char port)
172
+ ((or #\space #\tab)
173
+ (read-continuation-line port
174
+ (string-append val (read-header-line port))))
175
+ (_ val)))
176
+
177
+ (define *eof* (call-with-input-string "" read))
178
+
179
+ (define (read-header port)
180
+ "Read one HTTP header from PORT. Return two values: the header
181
+ name and the parsed Scheme value. May raise an exception if the header
182
+ was known but the value was invalid.
183
+
184
+ Returns the end-of-file object for both values if the end of the message
185
+ body was reached (i.e., a blank line)."
186
+ (let ((line (read-header-line port)))
187
+ (if (or (string-null? line)
188
+ (string=? line "\r"))
189
+ (values *eof* *eof*)
190
+ (let* ((delim (or (string-index line #\:)
191
+ (bad-header '%read line)))
192
+ (sym (string->header (substring line 0 delim))))
193
+ (values
194
+ sym
195
+ (parse-header
196
+ sym
197
+ (read-continuation-line
198
+ port
199
+ (string-trim-both line char-set:whitespace (1+ delim)))))))))
200
+
201
+ (define (parse-header sym val)
202
+ "Parse VAL, a string, with the parser registered for the header
203
+ named SYM. Returns the parsed value."
204
+ ((header-parser sym) val))
205
+
206
+ (define (valid-header? sym val)
207
+ "Returns a true value iff VAL is a valid Scheme value for the
208
+ header with name SYM."
209
+ (unless (symbol? sym)
210
+ (error "header name not a symbol" sym))
211
+ ((header-validator sym) val))
212
+
213
+ (define (write-header sym val port)
214
+ "Write the given header name and value to PORT, using the writer
215
+ from ‘header-writer’."
216
+ (put-string port (header->string sym))
217
+ (put-string port ": ")
218
+ ((header-writer sym) val port)
219
+ (put-string port "\r\n"))
220
+
221
+ (define (read-headers port)
222
+ "Read the headers of an HTTP message from PORT, returning them
223
+ as an ordered alist."
224
+ (let lp ((headers '()))
225
+ (call-with-values (lambda () (read-header port))
226
+ (lambda (k v)
227
+ (if (eof-object? k)
228
+ (reverse! headers)
229
+ (lp (acons k v headers)))))))
230
+
231
+ (define (write-headers headers port)
232
+ "Write the given header alist to PORT. Doesn't write the final
233
+ ‘\\r\\n’, as the user might want to add another header."
234
+ (let lp ((headers headers))
235
+ (match headers
236
+ (((k . v) . headers)
237
+ (write-header k v port)
238
+ (lp headers))
239
+ (()
240
+ (values)))))
241
+
242
+
243
+
244
+
245
+ ;;;
246
+ ;;; Utilities
247
+ ;;;
248
+
249
+ (define (bad-header sym val)
250
+ (throw 'bad-header sym val))
251
+ (define (bad-header-component sym val)
252
+ (throw 'bad-header-component sym val))
253
+
254
+ (define (bad-header-printer port key args default-printer)
255
+ (apply (case-lambda
256
+ ((sym val)
257
+ (format port "Bad ~a header: ~a\n" (header->string sym) val))
258
+ (_ (default-printer)))
259
+ args))
260
+ (define (bad-header-component-printer port key args default-printer)
261
+ (apply (case-lambda
262
+ ((sym val)
263
+ (format port "Bad ~a header component: ~a\n" sym val))
264
+ (_ (default-printer)))
265
+ args))
266
+ (set-exception-printer! 'bad-header bad-header-printer)
267
+ (set-exception-printer! 'bad-header-component bad-header-component-printer)
268
+
269
+ (define (parse-opaque-string str)
270
+ str)
271
+ (define (validate-opaque-string val)
272
+ (string? val))
273
+ (define (write-opaque-string val port)
274
+ (put-string port val))
275
+
276
+ (define separators-without-slash
277
+ (string->char-set "[^][()<>@,;:\\\"?= \t]"))
278
+ (define (validate-media-type str)
279
+ (let ((idx (string-index str #\/)))
280
+ (and idx (= idx (string-rindex str #\/))
281
+ (not (string-index str separators-without-slash)))))
282
+ (define (parse-media-type str)
283
+ (unless (validate-media-type str)
284
+ (bad-header-component 'media-type str))
285
+ (string->symbol str))
286
+
287
+ (define* (skip-whitespace str #:optional (start 0) (end (string-length str)))
288
+ (let lp ((i start))
289
+ (if (and (< i end) (char-whitespace? (string-ref str i)))
290
+ (lp (1+ i))
291
+ i)))
292
+
293
+ (define* (trim-whitespace str #:optional (start 0) (end (string-length str)))
294
+ (let lp ((i end))
295
+ (if (and (< start i) (char-whitespace? (string-ref str (1- i))))
296
+ (lp (1- i))
297
+ i)))
298
+
299
+ (define* (split-and-trim str #:optional (delim #\,)
300
+ (start 0) (end (string-length str)))
301
+ (let lp ((i start))
302
+ (if (< i end)
303
+ (let* ((idx (string-index str delim i end))
304
+ (tok (string-trim-both str char-set:whitespace i (or idx end))))
305
+ (cons tok (split-and-trim str delim (if idx (1+ idx) end) end)))
306
+ '())))
307
+
308
+ (define (list-of-strings? val)
309
+ (list-of? val string?))
310
+
311
+ (define (write-list-of-strings val port)
312
+ (put-list port val put-string ", "))
313
+
314
+ (define (split-header-names str)
315
+ (map string->header (split-and-trim str)))
316
+
317
+ (define (list-of-header-names? val)
318
+ (list-of? val symbol?))
319
+
320
+ (define (write-header-list val port)
321
+ (put-list port val
322
+ (lambda (port x)
323
+ (put-string port (header->string x)))
324
+ ", "))
325
+
326
+ (define (collect-escaped-string from start len escapes)
327
+ (let ((to (make-string len)))
328
+ (let lp ((start start) (i 0) (escapes escapes))
329
+ (match escapes
330
+ (()
331
+ (substring-move! from start (+ start (- len i)) to i)
332
+ to)
333
+ ((e . escapes)
334
+ (let ((next-start (+ start (- e i) 2)))
335
+ (substring-move! from start (- next-start 2) to i)
336
+ (string-set! to e (string-ref from (- next-start 1)))
337
+ (lp next-start (1+ e) escapes)))))))
338
+
339
+ ;; in incremental mode, returns two values: the string, and the index at
340
+ ;; which the string ended
341
+ (define* (parse-qstring str #:optional
342
+ (start 0) (end (trim-whitespace str start))
343
+ #:key incremental?)
344
+ (unless (and (< start end) (eqv? (string-ref str start) #\"))
345
+ (bad-header-component 'qstring str))
346
+ (let lp ((i (1+ start)) (qi 0) (escapes '()))
347
+ (if (< i end)
348
+ (case (string-ref str i)
349
+ ((#\\)
350
+ (lp (+ i 2) (1+ qi) (cons qi escapes)))
351
+ ((#\")
352
+ (let ((out (collect-escaped-string str (1+ start) qi escapes)))
353
+ (cond
354
+ (incremental? (values out (1+ i)))
355
+ ((= (1+ i) end) out)
356
+ (else (bad-header-component 'qstring str)))))
357
+ (else
358
+ (lp (1+ i) (1+ qi) escapes)))
359
+ (bad-header-component 'qstring str))))
360
+
361
+ (define (put-list port items put-item delim)
362
+ (match items
363
+ (() (values))
364
+ ((item . items)
365
+ (put-item port item)
366
+ (let lp ((items items))
367
+ (match items
368
+ (() (values))
369
+ ((item . items)
370
+ (put-string port delim)
371
+ (put-item port item)
372
+ (lp items)))))))
373
+
374
+ (define (write-qstring str port)
375
+ (put-char port #\")
376
+ (if (string-index str #\")
377
+ ;; optimize me
378
+ (put-list port (string-split str #\") put-string "\\\"")
379
+ (put-string port str))
380
+ (put-char port #\"))
381
+
382
+ (define* (parse-quality str #:optional (start 0) (end (string-length str)))
383
+ (define (char->decimal c)
384
+ (let ((i (- (char->integer c) (char->integer #\0))))
385
+ (unless (and (<= 0 i) (< i 10))
386
+ (bad-header-component 'quality str))
387
+ i))
388
+ (cond
389
+ ((not (< start end))
390
+ (bad-header-component 'quality str))
391
+ ((eqv? (string-ref str start) #\1)
392
+ (unless (or (string= str "1" start end)
393
+ (string= str "1." start end)
394
+ (string= str "1.0" start end)
395
+ (string= str "1.00" start end)
396
+ (string= str "1.000" start end))
397
+ (bad-header-component 'quality str))
398
+ 1000)
399
+ ((eqv? (string-ref str start) #\0)
400
+ (if (or (string= str "0" start end)
401
+ (string= str "0." start end))
402
+ 0
403
+ (if (< 2 (- end start) 6)
404
+ (let lp ((place 1) (i (+ start 4)) (q 0))
405
+ (if (= i (1+ start))
406
+ (if (eqv? (string-ref str (1+ start)) #\.)
407
+ q
408
+ (bad-header-component 'quality str))
409
+ (lp (* 10 place) (1- i)
410
+ (if (< i end)
411
+ (+ q (* place (char->decimal (string-ref str i))))
412
+ q))))
413
+ (bad-header-component 'quality str))))
414
+ ;; Allow the nonstandard .2 instead of 0.2.
415
+ ((and (eqv? (string-ref str start) #\.)
416
+ (< 1 (- end start) 5))
417
+ (let lp ((place 1) (i (+ start 3)) (q 0))
418
+ (if (= i start)
419
+ q
420
+ (lp (* 10 place) (1- i)
421
+ (if (< i end)
422
+ (+ q (* place (char->decimal (string-ref str i))))
423
+ q)))))
424
+ (else
425
+ (bad-header-component 'quality str))))
426
+
427
+ (define (valid-quality? q)
428
+ (and (non-negative-integer? q) (<= q 1000)))
429
+
430
+ (define (write-quality q port)
431
+ (define (digit->char d)
432
+ (integer->char (+ (char->integer #\0) d)))
433
+ (put-char port (digit->char (modulo (quotient q 1000) 10)))
434
+ (put-char port #\.)
435
+ (put-char port (digit->char (modulo (quotient q 100) 10)))
436
+ (put-char port (digit->char (modulo (quotient q 10) 10)))
437
+ (put-char port (digit->char (modulo q 10))))
438
+
439
+ (define (list-of? val pred)
440
+ (match val
441
+ (((? pred) ...) #t)
442
+ (_ #f)))
443
+
444
+ (define* (parse-quality-list str)
445
+ (map (lambda (part)
446
+ (cond
447
+ ((string-rindex part #\;)
448
+ => (lambda (idx)
449
+ (let ((qpart (string-trim-both part char-set:whitespace (1+ idx))))
450
+ (unless (string-prefix? "q=" qpart)
451
+ (bad-header-component 'quality qpart))
452
+ (cons (parse-quality qpart 2)
453
+ (string-trim-both part char-set:whitespace 0 idx)))))
454
+ (else
455
+ (cons 1000 (string-trim-both part char-set:whitespace)))))
456
+ (string-split str #\,)))
457
+
458
+ (define (validate-quality-list l)
459
+ (match l
460
+ ((((? valid-quality?) . (? string?)) ...) #t)
461
+ (_ #f)))
462
+
463
+ (define (write-quality-list l port)
464
+ (put-list port l
465
+ (lambda (port x)
466
+ (let ((q (car x))
467
+ (str (cdr x)))
468
+ (put-string port str)
469
+ (when (< q 1000)
470
+ (put-string port ";q=")
471
+ (write-quality q port))))
472
+ ","))
473
+
474
+ (define* (parse-non-negative-integer val #:optional (start 0)
475
+ (end (string-length val)))
476
+ (define (char->decimal c)
477
+ (let ((i (- (char->integer c) (char->integer #\0))))
478
+ (unless (and (<= 0 i) (< i 10))
479
+ (bad-header-component 'non-negative-integer val))
480
+ i))
481
+ (unless (< start end)
482
+ (bad-header-component 'non-negative-integer val))
483
+ (let lp ((i start) (out 0))
484
+ (if (< i end)
485
+ (lp (1+ i)
486
+ (+ (* out 10) (char->decimal (string-ref val i))))
487
+ out)))
488
+
489
+ (define (non-negative-integer? code)
490
+ (and (number? code) (>= code 0) (exact? code) (integer? code)))
491
+
492
+ (define (default-val-parser k val)
493
+ val)
494
+
495
+ (define (default-val-validator k val)
496
+ (or (not val) (string? val)))
497
+
498
+ (define (default-val-writer k val port)
499
+ (if (or (string-index val #\;)
500
+ (string-index val #\,)
501
+ (string-index val #\"))
502
+ (write-qstring val port)
503
+ (put-string port val)))
504
+
505
+ (define* (parse-key-value-list str #:optional
506
+ (val-parser default-val-parser)
507
+ (start 0) (end (string-length str)))
508
+ (let lp ((i start))
509
+ (if (not (< i end))
510
+ '()
511
+ (let* ((i (skip-whitespace str i end))
512
+ (eq (string-index str #\= i end))
513
+ (comma (string-index str #\, i end))
514
+ (delim (min (or eq end) (or comma end)))
515
+ (k (string->symbol
516
+ (substring str i (trim-whitespace str i delim)))))
517
+ (call-with-values
518
+ (lambda ()
519
+ (if (and eq (or (not comma) (< eq comma)))
520
+ (let ((i (skip-whitespace str (1+ eq) end)))
521
+ (if (and (< i end) (eqv? (string-ref str i) #\"))
522
+ (parse-qstring str i end #:incremental? #t)
523
+ (values (substring str i
524
+ (trim-whitespace str i
525
+ (or comma end)))
526
+ (or comma end))))
527
+ (values #f delim)))
528
+ (lambda (v-str next-i)
529
+ (let ((v (val-parser k v-str))
530
+ (i (skip-whitespace str next-i end)))
531
+ (unless (or (= i end) (eqv? (string-ref str i) #\,))
532
+ (bad-header-component 'key-value-list
533
+ (substring str start end)))
534
+ (cons (if v (cons k v) k)
535
+ (lp (1+ i))))))))))
536
+
537
+ (define* (key-value-list? list #:optional
538
+ (valid? default-val-validator))
539
+ (list-of? list
540
+ (lambda (elt)
541
+ (match elt
542
+ (((? symbol? k) . v) (valid? k v))
543
+ ((? symbol? k) (valid? k #f))
544
+ (_ #f)))))
545
+
546
+ (define* (write-key-value-list list port #:optional
547
+ (val-writer default-val-writer) (delim ", "))
548
+ (put-list
549
+ port list
550
+ (lambda (port x)
551
+ (match x
552
+ ((k . #f)
553
+ (put-symbol port k))
554
+ ((k . v)
555
+ (put-symbol port k)
556
+ (put-char port #\=)
557
+ (val-writer k v port))
558
+ (k
559
+ (put-symbol port k))))
560
+ delim))
561
+
562
+ ;; param-component = token [ "=" (token | quoted-string) ] \
563
+ ;; *(";" token [ "=" (token | quoted-string) ])
564
+ ;;
565
+ (define param-delimiters (char-set #\, #\; #\=))
566
+ (define param-value-delimiters (char-set-adjoin char-set:whitespace #\, #\;))
567
+ (define* (parse-param-component str #:optional
568
+ (val-parser default-val-parser)
569
+ (start 0) (end (string-length str)))
570
+ (let lp ((i start) (out '()))
571
+ (if (not (< i end))
572
+ (values (reverse! out) end)
573
+ (let ((delim (string-index str param-delimiters i)))
574
+ (let ((k (string->symbol
575
+ (substring str i (trim-whitespace str i (or delim end)))))
576
+ (delimc (and delim (string-ref str delim))))
577
+ (case delimc
578
+ ((#\=)
579
+ (call-with-values
580
+ (lambda ()
581
+ (let ((i (skip-whitespace str (1+ delim) end)))
582
+ (if (and (< i end) (eqv? (string-ref str i) #\"))
583
+ (parse-qstring str i end #:incremental? #t)
584
+ (let ((delim
585
+ (or (string-index str param-value-delimiters
586
+ i end)
587
+ end)))
588
+ (values (substring str i delim)
589
+ delim)))))
590
+ (lambda (v-str next-i)
591
+ (let* ((v (val-parser k v-str))
592
+ (x (if v (cons k v) k))
593
+ (i (skip-whitespace str next-i end)))
594
+ (case (and (< i end) (string-ref str i))
595
+ ((#f)
596
+ (values (reverse! (cons x out)) end))
597
+ ((#\;)
598
+ (lp (skip-whitespace str (1+ i) end)
599
+ (cons x out)))
600
+ (else ; including #\,
601
+ (values (reverse! (cons x out)) i)))))))
602
+ ((#\;)
603
+ (let ((v (val-parser k #f)))
604
+ (lp (skip-whitespace str (1+ delim) end)
605
+ (cons (if v (cons k v) k) out))))
606
+
607
+ (else ;; either the end of the string or a #\,
608
+ (let ((v (val-parser k #f)))
609
+ (values (reverse! (cons (if v (cons k v) k) out))
610
+ (or delim end))))))))))
611
+
612
+ (define* (parse-param-list str #:optional
613
+ (val-parser default-val-parser)
614
+ (start 0) (end (string-length str)))
615
+ (let lp ((i start) (out '()))
616
+ (call-with-values
617
+ (lambda () (parse-param-component str val-parser i end))
618
+ (lambda (item i)
619
+ (if (< i end)
620
+ (if (eqv? (string-ref str i) #\,)
621
+ (lp (skip-whitespace str (1+ i) end)
622
+ (cons item out))
623
+ (bad-header-component 'param-list str))
624
+ (reverse! (cons item out)))))))
625
+
626
+ (define* (validate-param-list list #:optional
627
+ (valid? default-val-validator))
628
+ (list-of? list
629
+ (lambda (elt)
630
+ (key-value-list? elt valid?))))
631
+
632
+ (define* (write-param-list list port #:optional
633
+ (val-writer default-val-writer))
634
+ (put-list
635
+ port list
636
+ (lambda (port item)
637
+ (write-key-value-list item port val-writer ";"))
638
+ ","))
639
+
640
+ (define-syntax string-match?
641
+ (lambda (x)
642
+ (syntax-case x ()
643
+ ((_ str pat) (string? (syntax->datum #'pat))
644
+ (let ((p (syntax->datum #'pat)))
645
+ #`(let ((s str))
646
+ (and
647
+ (= (string-length s) #,(string-length p))
648
+ #,@(let lp ((i 0) (tests '()))
649
+ (if (< i (string-length p))
650
+ (let ((c (string-ref p i)))
651
+ (lp (1+ i)
652
+ (case c
653
+ ((#\.) ; Whatever.
654
+ tests)
655
+ ((#\d) ; Digit.
656
+ (cons #`(char-numeric? (string-ref s #,i))
657
+ tests))
658
+ ((#\a) ; Alphabetic.
659
+ (cons #`(char-alphabetic? (string-ref s #,i))
660
+ tests))
661
+ (else ; Literal.
662
+ (cons #`(eqv? (string-ref s #,i) #,c)
663
+ tests)))))
664
+ tests)))))))))
665
+
666
+ ;; "Jan" | "Feb" | "Mar" | "Apr" | "May" | "Jun"
667
+ ;; "Jul" | "Aug" | "Sep" | "Oct" | "Nov" | "Dec"
668
+
669
+ (define (parse-month str start end)
670
+ (define (bad)
671
+ (bad-header-component 'month (substring str start end)))
672
+ (if (not (= (- end start) 3))
673
+ (bad)
674
+ (let ((a (string-ref str (+ start 0)))
675
+ (b (string-ref str (+ start 1)))
676
+ (c (string-ref str (+ start 2))))
677
+ (case a
678
+ ((#\J)
679
+ (case b
680
+ ((#\a) (case c ((#\n) 1) (else (bad))))
681
+ ((#\u) (case c ((#\n) 6) ((#\l) 7) (else (bad))))
682
+ (else (bad))))
683
+ ((#\F)
684
+ (case b
685
+ ((#\e) (case c ((#\b) 2) (else (bad))))
686
+ (else (bad))))
687
+ ((#\M)
688
+ (case b
689
+ ((#\a) (case c ((#\r) 3) ((#\y) 5) (else (bad))))
690
+ (else (bad))))
691
+ ((#\A)
692
+ (case b
693
+ ((#\p) (case c ((#\r) 4) (else (bad))))
694
+ ((#\u) (case c ((#\g) 8) (else (bad))))
695
+ (else (bad))))
696
+ ((#\S)
697
+ (case b
698
+ ((#\e) (case c ((#\p) 9) (else (bad))))
699
+ (else (bad))))
700
+ ((#\O)
701
+ (case b
702
+ ((#\c) (case c ((#\t) 10) (else (bad))))
703
+ (else (bad))))
704
+ ((#\N)
705
+ (case b
706
+ ((#\o) (case c ((#\v) 11) (else (bad))))
707
+ (else (bad))))
708
+ ((#\D)
709
+ (case b
710
+ ((#\e) (case c ((#\c) 12) (else (bad))))
711
+ (else (bad))))
712
+ (else (bad))))))
713
+
714
+ ;; "GMT" | "+" 4DIGIT | "-" 4DIGIT
715
+ ;;
716
+ ;; RFC 2616 requires date values to use "GMT", but recommends accepting
717
+ ;; the others as they are commonly generated by e.g. RFC 822 sources.
718
+ (define (parse-zone-offset str start)
719
+ (let ((s (substring str start)))
720
+ (define (bad)
721
+ (bad-header-component 'zone-offset s))
722
+ (cond
723
+ ((string=? s "GMT")
724
+ 0)
725
+ ((string=? s "UTC")
726
+ 0)
727
+ ((string-match? s ".dddd")
728
+ (let ((sign (case (string-ref s 0)
729
+ ((#\+) +1)
730
+ ((#\-) -1)
731
+ (else (bad))))
732
+ (hours (parse-non-negative-integer s 1 3))
733
+ (minutes (parse-non-negative-integer s 3 5)))
734
+ (* sign 60 (+ (* 60 hours) minutes)))) ; seconds east of Greenwich
735
+ (else (bad)))))
736
+
737
+ ;; RFC 822, updated by RFC 1123
738
+ ;;
739
+ ;; Sun, 06 Nov 1994 08:49:37 GMT
740
+ ;; 01234567890123456789012345678
741
+ ;; 0 1 2
742
+ (define (parse-rfc-822-date str space zone-offset)
743
+ ;; We could verify the day of the week but we don't.
744
+ (cond ((string-match? (substring str 0 space) "aaa, dd aaa dddd dd:dd:dd")
745
+ (let ((date (parse-non-negative-integer str 5 7))
746
+ (month (parse-month str 8 11))
747
+ (year (parse-non-negative-integer str 12 16))
748
+ (hour (parse-non-negative-integer str 17 19))
749
+ (minute (parse-non-negative-integer str 20 22))
750
+ (second (parse-non-negative-integer str 23 25)))
751
+ (make-date 0 second minute hour date month year zone-offset)))
752
+ ((string-match? (substring str 0 space) "aaa, d aaa dddd dd:dd:dd")
753
+ (let ((date (parse-non-negative-integer str 5 6))
754
+ (month (parse-month str 7 10))
755
+ (year (parse-non-negative-integer str 11 15))
756
+ (hour (parse-non-negative-integer str 16 18))
757
+ (minute (parse-non-negative-integer str 19 21))
758
+ (second (parse-non-negative-integer str 22 24)))
759
+ (make-date 0 second minute hour date month year zone-offset)))
760
+
761
+ ;; The next two clauses match dates that have a space instead of
762
+ ;; a leading zero for hours, like " 8:49:37".
763
+ ((string-match? (substring str 0 space) "aaa, dd aaa dddd d:dd:dd")
764
+ (let ((date (parse-non-negative-integer str 5 7))
765
+ (month (parse-month str 8 11))
766
+ (year (parse-non-negative-integer str 12 16))
767
+ (hour (parse-non-negative-integer str 18 19))
768
+ (minute (parse-non-negative-integer str 20 22))
769
+ (second (parse-non-negative-integer str 23 25)))
770
+ (make-date 0 second minute hour date month year zone-offset)))
771
+ ((string-match? (substring str 0 space) "aaa, d aaa dddd d:dd:dd")
772
+ (let ((date (parse-non-negative-integer str 5 6))
773
+ (month (parse-month str 7 10))
774
+ (year (parse-non-negative-integer str 11 15))
775
+ (hour (parse-non-negative-integer str 17 18))
776
+ (minute (parse-non-negative-integer str 19 21))
777
+ (second (parse-non-negative-integer str 22 24)))
778
+ (make-date 0 second minute hour date month year zone-offset)))
779
+
780
+ (else
781
+ (bad-header 'date str) ; prevent tail call
782
+ #f)))
783
+
784
+ ;; RFC 850, updated by RFC 1036
785
+ ;; Sunday, 06-Nov-94 08:49:37 GMT
786
+ ;; 0123456789012345678901
787
+ ;; 0 1 2
788
+ (define (parse-rfc-850-date str comma space zone-offset)
789
+ ;; We could verify the day of the week but we don't.
790
+ (let ((tail (substring str (1+ comma) space)))
791
+ (unless (string-match? tail " dd-aaa-dd dd:dd:dd")
792
+ (bad-header 'date str))
793
+ (let ((date (parse-non-negative-integer tail 1 3))
794
+ (month (parse-month tail 4 7))
795
+ (year (parse-non-negative-integer tail 8 10))
796
+ (hour (parse-non-negative-integer tail 11 13))
797
+ (minute (parse-non-negative-integer tail 14 16))
798
+ (second (parse-non-negative-integer tail 17 19)))
799
+ (make-date 0 second minute hour date month
800
+ (let* ((now (date-year (current-date)))
801
+ (then (+ now year (- (modulo now 100)))))
802
+ (cond ((< (+ then 50) now) (+ then 100))
803
+ ((< (+ now 50) then) (- then 100))
804
+ (else then)))
805
+ zone-offset))))
806
+
807
+ ;; ANSI C's asctime() format
808
+ ;; Sun Nov 6 08:49:37 1994
809
+ ;; 012345678901234567890123
810
+ ;; 0 1 2
811
+ (define (parse-asctime-date str)
812
+ (unless (string-match? str "aaa aaa .d dd:dd:dd dddd")
813
+ (bad-header 'date str))
814
+ (let ((date (parse-non-negative-integer
815
+ str
816
+ (if (eqv? (string-ref str 8) #\space) 9 8)
817
+ 10))
818
+ (month (parse-month str 4 7))
819
+ (year (parse-non-negative-integer str 20 24))
820
+ (hour (parse-non-negative-integer str 11 13))
821
+ (minute (parse-non-negative-integer str 14 16))
822
+ (second (parse-non-negative-integer str 17 19)))
823
+ (make-date 0 second minute hour date month year 0)))
824
+
825
+ ;; Convert all date values to GMT time zone, as per RFC 2616 appendix C.
826
+ (define (normalize-date date)
827
+ (if (zero? (date-zone-offset date))
828
+ date
829
+ (time-utc->date (date->time-utc date) 0)))
830
+
831
+ (define (parse-date str)
832
+ (let* ((space (string-rindex str #\space))
833
+ (zone-offset (and space (false-if-exception
834
+ (parse-zone-offset str (1+ space))))))
835
+ (normalize-date
836
+ (if zone-offset
837
+ (let ((comma (string-index str #\,)))
838
+ (cond ((not comma) (bad-header 'date str))
839
+ ((= comma 3) (parse-rfc-822-date str space zone-offset))
840
+ (else (parse-rfc-850-date str comma space zone-offset))))
841
+ (parse-asctime-date str)))))
842
+
843
+ (define (write-date date port)
844
+ (define (put-digits port n digits)
845
+ (define zero (char->integer #\0))
846
+ (let lp ((tens (expt 10 (1- digits))))
847
+ (when (> tens 0)
848
+ (put-char port
849
+ (integer->char (+ zero (modulo (truncate/ n tens) 10))))
850
+ (lp (floor/ tens 10)))))
851
+ (let ((date (if (zero? (date-zone-offset date))
852
+ date
853
+ (time-tai->date (date->time-tai date) 0))))
854
+ (put-string port
855
+ (case (date-week-day date)
856
+ ((0) "Sun, ") ((1) "Mon, ") ((2) "Tue, ")
857
+ ((3) "Wed, ") ((4) "Thu, ") ((5) "Fri, ")
858
+ ((6) "Sat, ") (else (error "bad date" date))))
859
+ (put-digits port (date-day date) 2)
860
+ (put-string port
861
+ (case (date-month date)
862
+ ((1) " Jan ") ((2) " Feb ") ((3) " Mar ")
863
+ ((4) " Apr ") ((5) " May ") ((6) " Jun ")
864
+ ((7) " Jul ") ((8) " Aug ") ((9) " Sep ")
865
+ ((10) " Oct ") ((11) " Nov ") ((12) " Dec ")
866
+ (else (error "bad date" date))))
867
+ (put-digits port (date-year date) 4)
868
+ (put-char port #\space)
869
+ (put-digits port (date-hour date) 2)
870
+ (put-char port #\:)
871
+ (put-digits port (date-minute date) 2)
872
+ (put-char port #\:)
873
+ (put-digits port (date-second date) 2)
874
+ (put-string port " GMT")))
875
+
876
+ ;; Following https://tools.ietf.org/html/rfc7232#section-2.3, an entity
877
+ ;; tag should really be a qstring. However there are a number of
878
+ ;; servers that emit etags as unquoted strings. Assume that if the
879
+ ;; value doesn't start with a quote, it's an unquoted strong etag.
880
+ (define* (parse-entity-tag val #:optional (start 0) (end (string-length val))
881
+ #:key sloppy-delimiters)
882
+ (define (parse-proper-etag-at start strong?)
883
+ (cond
884
+ (sloppy-delimiters
885
+ (call-with-values (lambda ()
886
+ (parse-qstring val start end #:incremental? #t))
887
+ (lambda (tag next)
888
+ (values (cons tag strong?) next))))
889
+ (else
890
+ (values (cons (parse-qstring val start end) strong?) end))))
891
+ (cond
892
+ ((string-prefix? "W/" val 0 2 start end)
893
+ (parse-proper-etag-at (+ start 2) #f))
894
+ ((string-prefix? "\"" val 0 1 start end)
895
+ (parse-proper-etag-at start #t))
896
+ (else
897
+ (let ((delim (or (and sloppy-delimiters
898
+ (string-index val sloppy-delimiters start end))
899
+ end)))
900
+ (values (cons (substring val start delim) #t) delim)))))
901
+
902
+ (define (entity-tag? val)
903
+ (match val
904
+ (((? string?) . _) #t)
905
+ (_ #f)))
906
+
907
+ (define (put-entity-tag port val)
908
+ (match val
909
+ ((tag . strong?)
910
+ (unless strong? (put-string port "W/"))
911
+ (write-qstring tag port))))
912
+
913
+ (define* (parse-entity-tag-list val #:optional
914
+ (start 0) (end (string-length val)))
915
+ (call-with-values (lambda ()
916
+ (parse-entity-tag val start end #:sloppy-delimiters #\,))
917
+ (lambda (etag next)
918
+ (cons etag
919
+ (let ((next (skip-whitespace val next end)))
920
+ (if (< next end)
921
+ (if (eqv? (string-ref val next) #\,)
922
+ (parse-entity-tag-list
923
+ val
924
+ (skip-whitespace val (1+ next) end)
925
+ end)
926
+ (bad-header-component 'entity-tag-list val))
927
+ '()))))))
928
+
929
+ (define (entity-tag-list? val)
930
+ (list-of? val entity-tag?))
931
+
932
+ (define (put-entity-tag-list port val)
933
+ (put-list port val put-entity-tag ", "))
934
+
935
+ ;; credentials = auth-scheme #auth-param
936
+ ;; auth-scheme = token
937
+ ;; auth-param = token "=" ( token | quoted-string )
938
+ ;;
939
+ ;; That's what the spec says. In reality the Basic scheme doesn't have
940
+ ;; k-v pairs, just one auth token, so we give that token as a string.
941
+ ;;
942
+ (define* (parse-credentials str #:optional (val-parser default-val-parser)
943
+ (start 0) (end (string-length str)))
944
+ (let* ((start (skip-whitespace str start end))
945
+ (delim (or (string-index str char-set:whitespace start end) end)))
946
+ (when (= start end)
947
+ (bad-header-component 'authorization str))
948
+ (let ((scheme (string->symbol
949
+ (string-downcase (substring str start (or delim end))))))
950
+ (case scheme
951
+ ((basic)
952
+ (let* ((start (skip-whitespace str delim end)))
953
+ (unless (< start end)
954
+ (bad-header-component 'credentials str))
955
+ (cons scheme (substring str start end))))
956
+ (else
957
+ (cons scheme (parse-key-value-list str default-val-parser delim end)))))))
958
+
959
+ (define (validate-credentials val)
960
+ (match val
961
+ (('basic . (? string?)) #t)
962
+ (((? symbol?) . (? key-value-list?)) #t)
963
+ (_ #f)))
964
+
965
+ (define (write-credentials val port)
966
+ (match val
967
+ (('basic . cred)
968
+ (put-string port "basic ")
969
+ (put-string port cred))
970
+ ((scheme . params)
971
+ (put-symbol port scheme)
972
+ (put-char port #\space)
973
+ (write-key-value-list params port))))
974
+
975
+ ;; challenges = 1#challenge
976
+ ;; challenge = auth-scheme 1*SP 1#auth-param
977
+ ;;
978
+ ;; A pain to parse, as both challenges and auth params are delimited by
979
+ ;; commas, and qstrings can contain anything. We rely on auth params
980
+ ;; necessarily having "=" in them.
981
+ ;;
982
+ (define* (parse-challenge str #:optional
983
+ (start 0) (end (string-length str)))
984
+ (let* ((start (skip-whitespace str start end))
985
+ (sp (string-index str #\space start end))
986
+ (scheme (if sp
987
+ (string->symbol (string-downcase (substring str start sp)))
988
+ (bad-header-component 'challenge str))))
989
+ (let lp ((i sp) (out (list scheme)))
990
+ (if (not (< i end))
991
+ (values (reverse! out) end)
992
+ (let* ((i (skip-whitespace str i end))
993
+ (eq (string-index str #\= i end))
994
+ (comma (string-index str #\, i end))
995
+ (delim (min (or eq end) (or comma end)))
996
+ (token-end (trim-whitespace str i delim)))
997
+ (if (string-index str #\space i token-end)
998
+ (values (reverse! out) i)
999
+ (let ((k (string->symbol (substring str i token-end))))
1000
+ (call-with-values
1001
+ (lambda ()
1002
+ (if (and eq (or (not comma) (< eq comma)))
1003
+ (let ((i (skip-whitespace str (1+ eq) end)))
1004
+ (if (and (< i end) (eqv? (string-ref str i) #\"))
1005
+ (parse-qstring str i end #:incremental? #t)
1006
+ (values (substring
1007
+ str i
1008
+ (trim-whitespace str i
1009
+ (or comma end)))
1010
+ (or comma end))))
1011
+ (values #f delim)))
1012
+ (lambda (v next-i)
1013
+ (let ((i (skip-whitespace str next-i end)))
1014
+ (unless (or (= i end) (eqv? (string-ref str i) #\,))
1015
+ (bad-header-component 'challenge
1016
+ (substring str start end)))
1017
+ (lp (1+ i) (cons (if v (cons k v) k) out))))))))))))
1018
+
1019
+ (define* (parse-challenges str #:optional (val-parser default-val-parser)
1020
+ (start 0) (end (string-length str)))
1021
+ (let lp ((i start))
1022
+ (let ((i (skip-whitespace str i end)))
1023
+ (if (< i end)
1024
+ (call-with-values (lambda () (parse-challenge str i end))
1025
+ (lambda (challenge i)
1026
+ (cons challenge (lp i))))
1027
+ '()))))
1028
+
1029
+ (define (validate-challenges val)
1030
+ (match val
1031
+ ((((? symbol?) . (? key-value-list?)) ...) #t)
1032
+ (_ #f)))
1033
+
1034
+ (define (put-challenge port val)
1035
+ (match val
1036
+ ((scheme . params)
1037
+ (put-symbol port scheme)
1038
+ (put-char port #\space)
1039
+ (write-key-value-list params port))))
1040
+
1041
+ (define (write-challenges val port)
1042
+ (put-list port val put-challenge ", "))
1043
+
1044
+
1045
+
1046
+
1047
+ ;;;
1048
+ ;;; Request-Line and Response-Line
1049
+ ;;;
1050
+
1051
+ ;; Hmm.
1052
+ (define (bad-request message . args)
1053
+ (throw 'bad-request message args))
1054
+ (define (bad-response message . args)
1055
+ (throw 'bad-response message args))
1056
+
1057
+ (define *known-versions* '())
1058
+
1059
+ (define* (parse-http-version str #:optional (start 0) (end (string-length str)))
1060
+ "Parse an HTTP version from STR, returning it as a major–minor
1061
+ pair. For example, ‘HTTP/1.1’ parses as the pair of integers,
1062
+ ‘(1 . 1)’."
1063
+ (let lp ((known *known-versions*))
1064
+ (match known
1065
+ (((version-str . version-val) . known)
1066
+ (if (string= str version-str start end)
1067
+ version-val
1068
+ (lp known)))
1069
+ (()
1070
+ (let ((dot-idx (string-index str #\. start end)))
1071
+ (unless (and (string-prefix? "HTTP/" str 0 5 start end)
1072
+ dot-idx
1073
+ (= dot-idx (string-rindex str #\. start end)))
1074
+
1075
+ (bad-header-component 'http-version (substring str start end)))
1076
+ (cons (parse-non-negative-integer str (+ start 5) dot-idx)
1077
+ (parse-non-negative-integer str (1+ dot-idx) end)))))))
1078
+
1079
+ (define (write-http-version val port)
1080
+ "Write the given major-minor version pair to PORT."
1081
+ (put-string port "HTTP/")
1082
+ (put-non-negative-integer port (car val))
1083
+ (put-char port #\.)
1084
+ (put-non-negative-integer port (cdr val)))
1085
+
1086
+ (for-each
1087
+ (lambda (v)
1088
+ (set! *known-versions*
1089
+ (acons v (parse-http-version v 0 (string-length v))
1090
+ *known-versions*)))
1091
+ '("HTTP/1.0" "HTTP/1.1"))
1092
+
1093
+
1094
+ ;; Request-URI = "*" | absoluteURI | abs_path | authority
1095
+ ;;
1096
+ ;; The `authority' form is only permissible for the CONNECT method, so
1097
+ ;; because we don't expect people to implement CONNECT, we save
1098
+ ;; ourselves the trouble of that case, and disallow the CONNECT method.
1099
+ ;;
1100
+ (define* (parse-http-method str #:optional (start 0) (end (string-length str)))
1101
+ "Parse an HTTP method from STR. The result is an upper-case
1102
+ symbol, like ‘GET’."
1103
+ (cond
1104
+ ((string= str "GET" start end) 'GET)
1105
+ ((string= str "HEAD" start end) 'HEAD)
1106
+ ((string= str "POST" start end) 'POST)
1107
+ ((string= str "PUT" start end) 'PUT)
1108
+ ((string= str "DELETE" start end) 'DELETE)
1109
+ ((string= str "OPTIONS" start end) 'OPTIONS)
1110
+ ((string= str "TRACE" start end) 'TRACE)
1111
+ (else (bad-request "Invalid method: ~a" (substring str start end)))))
1112
+
1113
+ (define* (parse-request-uri str #:optional (start 0) (end (string-length str)))
1114
+ "Parse a URI from an HTTP request line. Note that URIs in requests do
1115
+ not have to have a scheme or host name. The result is a URI-reference
1116
+ object."
1117
+ (cond
1118
+ ((= start end)
1119
+ (bad-request "Missing Request-URI"))
1120
+ ((string= str "*" start end)
1121
+ #f)
1122
+ ((eqv? (string-ref str start) #\/)
1123
+ (let* ((q (string-index str #\? start end))
1124
+ (f (string-index str #\# start end))
1125
+ (q (and q (or (not f) (< q f)) q)))
1126
+ (build-uri-reference
1127
+ #:path (substring str start (or q f end))
1128
+ #:query (and q (substring str (1+ q) (or f end)))
1129
+ #:fragment (and f (substring str (1+ f) end)))))
1130
+ (else
1131
+ (or (string->uri (substring str start end))
1132
+ (bad-request "Invalid URI: ~a" (substring str start end))))))
1133
+
1134
+ (define (read-request-line port)
1135
+ "Read the first line of an HTTP request from PORT, returning
1136
+ three values: the method, the URI, and the version."
1137
+ (let* ((line (read-header-line port))
1138
+ (d0 (string-index line char-set:whitespace)) ; "delimiter zero"
1139
+ (d1 (string-rindex line char-set:whitespace)))
1140
+ (unless (and d0 d1 (< d0 d1))
1141
+ (bad-request "Bad Request-Line: ~s" line))
1142
+ (values (parse-http-method line 0 d0)
1143
+ (parse-request-uri line (skip-whitespace line (1+ d0) d1) d1)
1144
+ (parse-http-version line (1+ d1) (string-length line)))))
1145
+
1146
+ (define (write-uri uri port)
1147
+ (put-string port (uri->string uri #:include-fragment? #f)))
1148
+
1149
+ (define (write-request-line method uri version port)
1150
+ "Write the first line of an HTTP request to PORT."
1151
+ (put-symbol port method)
1152
+ (put-char port #\space)
1153
+ (when (http-proxy-port? port)
1154
+ (let ((scheme (uri-scheme uri))
1155
+ (host (uri-host uri))
1156
+ (host-port (uri-port uri)))
1157
+ (when (and scheme host)
1158
+ (put-symbol port scheme)
1159
+ (put-string port "://")
1160
+ (cond
1161
+ ((string-index host #\:)
1162
+ (put-char port #\[)
1163
+ (put-string port host)
1164
+ (put-char port #\]))
1165
+ (else
1166
+ (put-string port host)))
1167
+ (unless ((@@ (web uri) default-port?) scheme host-port)
1168
+ (put-char port #\:)
1169
+ (put-non-negative-integer port host-port)))))
1170
+ (let ((path (uri-path uri))
1171
+ (query (uri-query uri)))
1172
+ (if (string-null? path)
1173
+ (put-string port "/")
1174
+ (put-string port path))
1175
+ (when query
1176
+ (put-string port "?")
1177
+ (put-string port query)))
1178
+ (put-char port #\space)
1179
+ (write-http-version version port)
1180
+ (put-string port "\r\n"))
1181
+
1182
+ (define (read-response-line port)
1183
+ "Read the first line of an HTTP response from PORT, returning three
1184
+ values: the HTTP version, the response code, and the (possibly empty)
1185
+ \"reason phrase\"."
1186
+ (let* ((line (read-header-line port))
1187
+ (d0 (string-index line char-set:whitespace)) ; "delimiter zero"
1188
+ (d1 (and d0 (string-index line char-set:whitespace
1189
+ (skip-whitespace line d0)))))
1190
+ (unless (and d0 d1)
1191
+ (bad-response "Bad Response-Line: ~s" line))
1192
+ (values (parse-http-version line 0 d0)
1193
+ (parse-non-negative-integer line (skip-whitespace line d0 d1)
1194
+ d1)
1195
+ (string-trim-both line char-set:whitespace d1))))
1196
+
1197
+ (define (write-response-line version code reason-phrase port)
1198
+ "Write the first line of an HTTP response to PORT."
1199
+ (write-http-version version port)
1200
+ (put-char port #\space)
1201
+ (put-non-negative-integer port code)
1202
+ (put-char port #\space)
1203
+ (put-string port reason-phrase)
1204
+ (put-string port "\r\n"))
1205
+
1206
+
1207
+
1208
+
1209
+ ;;;
1210
+ ;;; Helpers for declaring headers
1211
+ ;;;
1212
+
1213
+ ;; emacs: (put 'declare-header! 'scheme-indent-function 1)
1214
+ ;; emacs: (put 'declare-opaque!-header 'scheme-indent-function 1)
1215
+ (define (declare-opaque-header! name)
1216
+ "Declares a given header as \"opaque\", meaning that its value is not
1217
+ treated specially, and is just returned as a plain string."
1218
+ (declare-header! name
1219
+ parse-opaque-string validate-opaque-string write-opaque-string))
1220
+
1221
+ ;; emacs: (put 'declare-date-header! 'scheme-indent-function 1)
1222
+ (define (declare-date-header! name)
1223
+ (declare-header! name
1224
+ parse-date date? write-date))
1225
+
1226
+ ;; emacs: (put 'declare-string-list-header! 'scheme-indent-function 1)
1227
+ (define (declare-string-list-header! name)
1228
+ (declare-header! name
1229
+ split-and-trim list-of-strings? write-list-of-strings))
1230
+
1231
+ ;; emacs: (put 'declare-symbol-list-header! 'scheme-indent-function 1)
1232
+ (define (declare-symbol-list-header! name)
1233
+ (declare-header! name
1234
+ (lambda (str)
1235
+ (map string->symbol (split-and-trim str)))
1236
+ (lambda (v)
1237
+ (list-of? v symbol?))
1238
+ (lambda (v port)
1239
+ (put-list port v put-symbol ", "))))
1240
+
1241
+ ;; emacs: (put 'declare-header-list-header! 'scheme-indent-function 1)
1242
+ (define (declare-header-list-header! name)
1243
+ (declare-header! name
1244
+ split-header-names list-of-header-names? write-header-list))
1245
+
1246
+ ;; emacs: (put 'declare-integer-header! 'scheme-indent-function 1)
1247
+ (define (declare-integer-header! name)
1248
+ (declare-header! name
1249
+ parse-non-negative-integer non-negative-integer?
1250
+ (lambda (val port) (put-non-negative-integer port val))))
1251
+
1252
+ ;; emacs: (put 'declare-uri-reference-header! 'scheme-indent-function 1)
1253
+ (define (declare-uri-reference-header! name)
1254
+ (declare-header! name
1255
+ (lambda (str)
1256
+ (or (string->uri-reference str)
1257
+ (bad-header-component 'uri-reference str)))
1258
+ uri-reference?
1259
+ write-uri))
1260
+
1261
+ ;; emacs: (put 'declare-quality-list-header! 'scheme-indent-function 1)
1262
+ (define (declare-quality-list-header! name)
1263
+ (declare-header! name
1264
+ parse-quality-list validate-quality-list write-quality-list))
1265
+
1266
+ ;; emacs: (put 'declare-param-list-header! 'scheme-indent-function 1)
1267
+ (define* (declare-param-list-header! name #:optional
1268
+ (val-parser default-val-parser)
1269
+ (val-validator default-val-validator)
1270
+ (val-writer default-val-writer))
1271
+ (declare-header! name
1272
+ (lambda (str) (parse-param-list str val-parser))
1273
+ (lambda (val) (validate-param-list val val-validator))
1274
+ (lambda (val port) (write-param-list val port val-writer))))
1275
+
1276
+ ;; emacs: (put 'declare-key-value-list-header! 'scheme-indent-function 1)
1277
+ (define* (declare-key-value-list-header! name #:optional
1278
+ (val-parser default-val-parser)
1279
+ (val-validator default-val-validator)
1280
+ (val-writer default-val-writer))
1281
+ (declare-header! name
1282
+ (lambda (str) (parse-key-value-list str val-parser))
1283
+ (lambda (val) (key-value-list? val val-validator))
1284
+ (lambda (val port) (write-key-value-list val port val-writer))))
1285
+
1286
+ ;; emacs: (put 'declare-entity-tag-list-header! 'scheme-indent-function 1)
1287
+ (define (declare-entity-tag-list-header! name)
1288
+ (declare-header! name
1289
+ (lambda (str) (if (string=? str "*") '* (parse-entity-tag-list str)))
1290
+ (lambda (val) (or (eq? val '*) (entity-tag-list? val)))
1291
+ (lambda (val port)
1292
+ (if (eq? val '*)
1293
+ (put-string port "*")
1294
+ (put-entity-tag-list port val)))))
1295
+
1296
+ ;; emacs: (put 'declare-credentials-header! 'scheme-indent-function 1)
1297
+ (define (declare-credentials-header! name)
1298
+ (declare-header! name
1299
+ parse-credentials validate-credentials write-credentials))
1300
+
1301
+ ;; emacs: (put 'declare-challenge-list-header! 'scheme-indent-function 1)
1302
+ (define (declare-challenge-list-header! name)
1303
+ (declare-header! name
1304
+ parse-challenges validate-challenges write-challenges))
1305
+
1306
+
1307
+
1308
+
1309
+ ;;;
1310
+ ;;; General headers
1311
+ ;;;
1312
+
1313
+ ;; Cache-Control = 1#(cache-directive)
1314
+ ;; cache-directive = cache-request-directive | cache-response-directive
1315
+ ;; cache-request-directive =
1316
+ ;; "no-cache" ; Section 14.9.1
1317
+ ;; | "no-store" ; Section 14.9.2
1318
+ ;; | "max-age" "=" delta-seconds ; Section 14.9.3, 14.9.4
1319
+ ;; | "max-stale" [ "=" delta-seconds ] ; Section 14.9.3
1320
+ ;; | "min-fresh" "=" delta-seconds ; Section 14.9.3
1321
+ ;; | "no-transform" ; Section 14.9.5
1322
+ ;; | "only-if-cached" ; Section 14.9.4
1323
+ ;; | cache-extension ; Section 14.9.6
1324
+ ;; cache-response-directive =
1325
+ ;; "public" ; Section 14.9.1
1326
+ ;; | "private" [ "=" <"> 1#field-name <"> ] ; Section 14.9.1
1327
+ ;; | "no-cache" [ "=" <"> 1#field-name <"> ]; Section 14.9.1
1328
+ ;; | "no-store" ; Section 14.9.2
1329
+ ;; | "no-transform" ; Section 14.9.5
1330
+ ;; | "must-revalidate" ; Section 14.9.4
1331
+ ;; | "proxy-revalidate" ; Section 14.9.4
1332
+ ;; | "max-age" "=" delta-seconds ; Section 14.9.3
1333
+ ;; | "s-maxage" "=" delta-seconds ; Section 14.9.3
1334
+ ;; | cache-extension ; Section 14.9.6
1335
+ ;; cache-extension = token [ "=" ( token | quoted-string ) ]
1336
+ ;;
1337
+ (declare-key-value-list-header! "Cache-Control"
1338
+ (lambda (k v-str)
1339
+ (case k
1340
+ ((max-age min-fresh s-maxage)
1341
+ (parse-non-negative-integer v-str))
1342
+ ((max-stale)
1343
+ (and v-str (parse-non-negative-integer v-str)))
1344
+ ((private no-cache)
1345
+ (and v-str (split-header-names v-str)))
1346
+ (else v-str)))
1347
+ (lambda (k v)
1348
+ (case k
1349
+ ((max-age min-fresh s-maxage)
1350
+ (non-negative-integer? v))
1351
+ ((max-stale)
1352
+ (or (not v) (non-negative-integer? v)))
1353
+ ((private no-cache)
1354
+ (or (not v) (list-of-header-names? v)))
1355
+ ((no-store no-transform only-if-cache must-revalidate proxy-revalidate)
1356
+ (not v))
1357
+ (else
1358
+ (or (not v) (string? v)))))
1359
+ (lambda (k v port)
1360
+ (cond
1361
+ ((string? v) (default-val-writer k v port))
1362
+ ((pair? v)
1363
+ (put-char port #\")
1364
+ (write-header-list v port)
1365
+ (put-char port #\"))
1366
+ ((integer? v)
1367
+ (put-non-negative-integer port v))
1368
+ (else
1369
+ (bad-header-component 'cache-control v)))))
1370
+
1371
+ ;; Connection = "Connection" ":" 1#(connection-token)
1372
+ ;; connection-token = token
1373
+ ;; e.g.
1374
+ ;; Connection: close, Foo-Header
1375
+ ;;
1376
+ (declare-header! "Connection"
1377
+ split-header-names
1378
+ list-of-header-names?
1379
+ (lambda (val port)
1380
+ (put-list port val
1381
+ (lambda (port x)
1382
+ (put-string port
1383
+ (if (eq? x 'close)
1384
+ "close"
1385
+ (header->string x))))
1386
+ ", ")))
1387
+
1388
+ ;; Date = "Date" ":" HTTP-date
1389
+ ;; e.g.
1390
+ ;; Date: Tue, 15 Nov 1994 08:12:31 GMT
1391
+ ;;
1392
+ (declare-date-header! "Date")
1393
+
1394
+ ;; Pragma = "Pragma" ":" 1#pragma-directive
1395
+ ;; pragma-directive = "no-cache" | extension-pragma
1396
+ ;; extension-pragma = token [ "=" ( token | quoted-string ) ]
1397
+ ;;
1398
+ (declare-key-value-list-header! "Pragma")
1399
+
1400
+ ;; Trailer = "Trailer" ":" 1#field-name
1401
+ ;;
1402
+ (declare-header-list-header! "Trailer")
1403
+
1404
+ ;; Transfer-Encoding = "Transfer-Encoding" ":" 1#transfer-coding
1405
+ ;;
1406
+ (declare-param-list-header! "Transfer-Encoding")
1407
+
1408
+ ;; Upgrade = "Upgrade" ":" 1#product
1409
+ ;;
1410
+ (declare-string-list-header! "Upgrade")
1411
+
1412
+ ;; Via = "Via" ":" 1#( received-protocol received-by [ comment ] )
1413
+ ;; received-protocol = [ protocol-name "/" ] protocol-version
1414
+ ;; protocol-name = token
1415
+ ;; protocol-version = token
1416
+ ;; received-by = ( host [ ":" port ] ) | pseudonym
1417
+ ;; pseudonym = token
1418
+ ;;
1419
+ (declare-header! "Via"
1420
+ split-and-trim
1421
+ list-of-strings?
1422
+ write-list-of-strings
1423
+ #:multiple? #t)
1424
+
1425
+ ;; Warning = "Warning" ":" 1#warning-value
1426
+ ;;
1427
+ ;; warning-value = warn-code SP warn-agent SP warn-text
1428
+ ;; [SP warn-date]
1429
+ ;;
1430
+ ;; warn-code = 3DIGIT
1431
+ ;; warn-agent = ( host [ ":" port ] ) | pseudonym
1432
+ ;; ; the name or pseudonym of the server adding
1433
+ ;; ; the Warning header, for use in debugging
1434
+ ;; warn-text = quoted-string
1435
+ ;; warn-date = <"> HTTP-date <">
1436
+ (declare-header! "Warning"
1437
+ (lambda (str)
1438
+ (let ((len (string-length str)))
1439
+ (let lp ((i (skip-whitespace str 0)))
1440
+ (let* ((idx1 (string-index str #\space i))
1441
+ (idx2 (string-index str #\space (1+ idx1))))
1442
+ (when (and idx1 idx2)
1443
+ (let ((code (parse-non-negative-integer str i idx1))
1444
+ (agent (substring str (1+ idx1) idx2)))
1445
+ (call-with-values
1446
+ (lambda () (parse-qstring str (1+ idx2) #:incremental? #t))
1447
+ (lambda (text i)
1448
+ (call-with-values
1449
+ (lambda ()
1450
+ (let ((c (and (< i len) (string-ref str i))))
1451
+ (case c
1452
+ ((#\space)
1453
+ ;; we have a date.
1454
+ (call-with-values
1455
+ (lambda () (parse-qstring str (1+ i)
1456
+ #:incremental? #t))
1457
+ (lambda (date i)
1458
+ (values text (parse-date date) i))))
1459
+ (else
1460
+ (values text #f i)))))
1461
+ (lambda (text date i)
1462
+ (let ((w (list code agent text date))
1463
+ (c (and (< i len) (string-ref str i))))
1464
+ (case c
1465
+ ((#f) (list w))
1466
+ ((#\,) (cons w (lp (skip-whitespace str (1+ i)))))
1467
+ (else (bad-header 'warning str))))))))))))))
1468
+ (lambda (val)
1469
+ (list-of? val
1470
+ (lambda (elt)
1471
+ (match elt
1472
+ ((code host text date)
1473
+ (and (non-negative-integer? code) (< code 1000)
1474
+ (string? host)
1475
+ (string? text)
1476
+ (or (not date) (date? date))))
1477
+ (_ #f)))))
1478
+ (lambda (val port)
1479
+ (put-list
1480
+ port val
1481
+ (lambda (port w)
1482
+ (match w
1483
+ ((code host text date)
1484
+ (put-non-negative-integer port code)
1485
+ (put-char port #\space)
1486
+ (put-string port host)
1487
+ (put-char port #\space)
1488
+ (write-qstring text port)
1489
+ (when date
1490
+ (put-char port #\space)
1491
+ (put-char port #\")
1492
+ (write-date date port)
1493
+ (put-char port #\")))))
1494
+ ", "))
1495
+ #:multiple? #t)
1496
+
1497
+
1498
+
1499
+
1500
+ ;;;
1501
+ ;;; Entity headers
1502
+ ;;;
1503
+
1504
+ ;; Allow = #Method
1505
+ ;;
1506
+ (declare-symbol-list-header! "Allow")
1507
+
1508
+ ;; Content-Disposition = disposition-type *( ";" disposition-parm )
1509
+ ;; disposition-type = "attachment" | disp-extension-token
1510
+ ;; disposition-parm = filename-parm | disp-extension-parm
1511
+ ;; filename-parm = "filename" "=" quoted-string
1512
+ ;; disp-extension-token = token
1513
+ ;; disp-extension-parm = token "=" ( token | quoted-string )
1514
+ ;;
1515
+ (declare-header! "Content-Disposition"
1516
+ (lambda (str)
1517
+ ;; Lazily reuse the param list parser.
1518
+ (match (parse-param-list str default-val-parser)
1519
+ ((disposition) disposition)
1520
+ (_ (bad-header-component 'content-disposition str))))
1521
+ (lambda (val)
1522
+ (match val
1523
+ (((? symbol?) ((? symbol?) . (? string?)) ...) #t)
1524
+ (_ #f)))
1525
+ (lambda (val port)
1526
+ (write-param-list (list val) port)))
1527
+
1528
+ ;; Content-Encoding = 1#content-coding
1529
+ ;;
1530
+ (declare-symbol-list-header! "Content-Encoding")
1531
+
1532
+ ;; Content-Language = 1#language-tag
1533
+ ;;
1534
+ (declare-string-list-header! "Content-Language")
1535
+
1536
+ ;; Content-Length = 1*DIGIT
1537
+ ;;
1538
+ (declare-integer-header! "Content-Length")
1539
+
1540
+ ;; Content-Location = URI-reference
1541
+ ;;
1542
+ (declare-uri-reference-header! "Content-Location")
1543
+
1544
+ ;; Content-MD5 = <base64 of 128 bit MD5 digest as per RFC 1864>
1545
+ ;;
1546
+ (declare-opaque-header! "Content-MD5")
1547
+
1548
+ ;; Content-Range = content-range-spec
1549
+ ;; content-range-spec = byte-content-range-spec
1550
+ ;; byte-content-range-spec = bytes-unit SP
1551
+ ;; byte-range-resp-spec "/"
1552
+ ;; ( instance-length | "*" )
1553
+ ;; byte-range-resp-spec = (first-byte-pos "-" last-byte-pos)
1554
+ ;; | "*"
1555
+ ;; instance-length = 1*DIGIT
1556
+ ;;
1557
+ (declare-header! "Content-Range"
1558
+ (lambda (str)
1559
+ (let ((dash (string-index str #\-))
1560
+ (slash (string-index str #\/)))
1561
+ (unless (and (string-prefix? "bytes " str) slash)
1562
+ (bad-header 'content-range str))
1563
+ (list 'bytes
1564
+ (cond
1565
+ (dash
1566
+ (cons
1567
+ (parse-non-negative-integer str 6 dash)
1568
+ (parse-non-negative-integer str (1+ dash) slash)))
1569
+ ((string= str "*" 6 slash)
1570
+ '*)
1571
+ (else
1572
+ (bad-header 'content-range str)))
1573
+ (if (string= str "*" (1+ slash))
1574
+ '*
1575
+ (parse-non-negative-integer str (1+ slash))))))
1576
+ (lambda (val)
1577
+ (match val
1578
+ (((? symbol?)
1579
+ (or '* ((? non-negative-integer?) . (? non-negative-integer?)))
1580
+ (or '* (? non-negative-integer?)))
1581
+ #t)
1582
+ (_ #f)))
1583
+ (lambda (val port)
1584
+ (match val
1585
+ ((unit range instance-length)
1586
+ (put-symbol port unit)
1587
+ (put-char port #\space)
1588
+ (match range
1589
+ ('*
1590
+ (put-char port #\*))
1591
+ ((start . end)
1592
+ (put-non-negative-integer port start)
1593
+ (put-char port #\-)
1594
+ (put-non-negative-integer port end)))
1595
+ (put-char port #\/)
1596
+ (match instance-length
1597
+ ('* (put-char port #\*))
1598
+ (len (put-non-negative-integer port len)))))))
1599
+
1600
+ ;; Content-Type = media-type
1601
+ ;;
1602
+ (declare-header! "Content-Type"
1603
+ (lambda (str)
1604
+ (let ((parts (string-split str #\;)))
1605
+ (cons (parse-media-type (car parts))
1606
+ (map (lambda (x)
1607
+ (let ((eq (string-index x #\=)))
1608
+ (unless (and eq (= eq (string-rindex x #\=)))
1609
+ (bad-header 'content-type str))
1610
+ (cons
1611
+ (string->symbol
1612
+ (string-trim x char-set:whitespace 0 eq))
1613
+ (string-trim-right x char-set:whitespace (1+ eq)))))
1614
+ (cdr parts)))))
1615
+ (lambda (val)
1616
+ (match val
1617
+ (((? symbol?) ((? symbol?) . (? string?)) ...) #t)
1618
+ (_ #f)))
1619
+ (lambda (val port)
1620
+ (match val
1621
+ ((type . args)
1622
+ (put-symbol port type)
1623
+ (match args
1624
+ (() (values))
1625
+ (args
1626
+ (put-string port ";")
1627
+ (put-list
1628
+ port args
1629
+ (lambda (port pair)
1630
+ (match pair
1631
+ ((k . v)
1632
+ (put-symbol port k)
1633
+ (put-char port #\=)
1634
+ (put-string port v))))
1635
+ ";")))))))
1636
+
1637
+ ;; Expires = HTTP-date
1638
+ ;;
1639
+ (define *date-in-the-past* (parse-date "Thu, 01 Jan 1970 00:00:00 GMT"))
1640
+
1641
+ (declare-header! "Expires"
1642
+ (lambda (str)
1643
+ (if (member str '("0" "-1"))
1644
+ *date-in-the-past*
1645
+ (parse-date str)))
1646
+ date?
1647
+ write-date)
1648
+
1649
+ ;; Last-Modified = HTTP-date
1650
+ ;;
1651
+ (declare-date-header! "Last-Modified")
1652
+
1653
+
1654
+
1655
+
1656
+ ;;;
1657
+ ;;; Request headers
1658
+ ;;;
1659
+
1660
+ ;; Accept = #( media-range [ accept-params ] )
1661
+ ;; media-range = ( "*/*" | ( type "/" "*" ) | ( type "/" subtype ) )
1662
+ ;; *( ";" parameter )
1663
+ ;; accept-params = ";" "q" "=" qvalue *( accept-extension )
1664
+ ;; accept-extension = ";" token [ "=" ( token | quoted-string ) ]
1665
+ ;;
1666
+ (declare-param-list-header! "Accept"
1667
+ ;; -> (type/subtype (sym-prop . str-val) ...) ...)
1668
+ ;;
1669
+ ;; with the exception of prop `q', in which case the val will be a
1670
+ ;; valid quality value
1671
+ ;;
1672
+ (lambda (k v)
1673
+ (if (eq? k 'q)
1674
+ (parse-quality v)
1675
+ v))
1676
+ (lambda (k v)
1677
+ (if (eq? k 'q)
1678
+ (valid-quality? v)
1679
+ (or (not v) (string? v))))
1680
+ (lambda (k v port)
1681
+ (if (eq? k 'q)
1682
+ (write-quality v port)
1683
+ (default-val-writer k v port))))
1684
+
1685
+ ;; Accept-Charset = 1#( ( charset | "*" )[ ";" "q" "=" qvalue ] )
1686
+ ;;
1687
+ (declare-quality-list-header! "Accept-Charset")
1688
+
1689
+ ;; Accept-Encoding = 1#( codings [ ";" "q" "=" qvalue ] )
1690
+ ;; codings = ( content-coding | "*" )
1691
+ ;;
1692
+ (declare-quality-list-header! "Accept-Encoding")
1693
+
1694
+ ;; Accept-Language = 1#( language-range [ ";" "q" "=" qvalue ] )
1695
+ ;; language-range = ( ( 1*8ALPHA *( "-" 1*8ALPHA ) ) | "*" )
1696
+ ;;
1697
+ (declare-quality-list-header! "Accept-Language")
1698
+
1699
+ ;; Authorization = credentials
1700
+ ;; credentials = auth-scheme #auth-param
1701
+ ;; auth-scheme = token
1702
+ ;; auth-param = token "=" ( token | quoted-string )
1703
+ ;;
1704
+ (declare-credentials-header! "Authorization")
1705
+
1706
+ ;; Expect = 1#expectation
1707
+ ;; expectation = "100-continue" | expectation-extension
1708
+ ;; expectation-extension = token [ "=" ( token | quoted-string )
1709
+ ;; *expect-params ]
1710
+ ;; expect-params = ";" token [ "=" ( token | quoted-string ) ]
1711
+ ;;
1712
+ (declare-param-list-header! "Expect")
1713
+
1714
+ ;; From = mailbox
1715
+ ;;
1716
+ ;; Should be an email address; we just pass on the string as-is.
1717
+ ;;
1718
+ (declare-opaque-header! "From")
1719
+
1720
+ ;; Host = host [ ":" port ]
1721
+ ;;
1722
+ (declare-header! "Host"
1723
+ (lambda (str)
1724
+ (let* ((rbracket (string-index str #\]))
1725
+ (colon (string-index str #\: (or rbracket 0)))
1726
+ (host (cond
1727
+ (rbracket
1728
+ (unless (eqv? (string-ref str 0) #\[)
1729
+ (bad-header 'host str))
1730
+ (substring str 1 rbracket))
1731
+ (colon
1732
+ (substring str 0 colon))
1733
+ (else
1734
+ str)))
1735
+ (port (and colon
1736
+ (parse-non-negative-integer str (1+ colon)))))
1737
+ (cons host port)))
1738
+ (lambda (val)
1739
+ (match val
1740
+ (((? string?) . (or #f (? non-negative-integer?))) #t)
1741
+ (_ #f)))
1742
+ (lambda (val port)
1743
+ (match val
1744
+ ((host-name . host-port)
1745
+ (cond
1746
+ ((string-index host-name #\:)
1747
+ (put-char port #\[)
1748
+ (put-string port host-name)
1749
+ (put-char port #\]))
1750
+ (else
1751
+ (put-string port host-name)))
1752
+ (when host-port
1753
+ (put-char port #\:)
1754
+ (put-non-negative-integer port host-port))))))
1755
+
1756
+ ;; If-Match = ( "*" | 1#entity-tag )
1757
+ ;;
1758
+ (declare-entity-tag-list-header! "If-Match")
1759
+
1760
+ ;; If-Modified-Since = HTTP-date
1761
+ ;;
1762
+ (declare-date-header! "If-Modified-Since")
1763
+
1764
+ ;; If-None-Match = ( "*" | 1#entity-tag )
1765
+ ;;
1766
+ (declare-entity-tag-list-header! "If-None-Match")
1767
+
1768
+ ;; If-Range = ( entity-tag | HTTP-date )
1769
+ ;;
1770
+ (declare-header! "If-Range"
1771
+ (lambda (str)
1772
+ (if (or (string-prefix? "\"" str)
1773
+ (string-prefix? "W/" str))
1774
+ (parse-entity-tag str)
1775
+ (parse-date str)))
1776
+ (lambda (val)
1777
+ (or (date? val) (entity-tag? val)))
1778
+ (lambda (val port)
1779
+ (if (date? val)
1780
+ (write-date val port)
1781
+ (put-entity-tag port val))))
1782
+
1783
+ ;; If-Unmodified-Since = HTTP-date
1784
+ ;;
1785
+ (declare-date-header! "If-Unmodified-Since")
1786
+
1787
+ ;; Max-Forwards = 1*DIGIT
1788
+ ;;
1789
+ (declare-integer-header! "Max-Forwards")
1790
+
1791
+ ;; Proxy-Authorization = credentials
1792
+ ;;
1793
+ (declare-credentials-header! "Proxy-Authorization")
1794
+
1795
+ ;; Range = "Range" ":" ranges-specifier
1796
+ ;; ranges-specifier = byte-ranges-specifier
1797
+ ;; byte-ranges-specifier = bytes-unit "=" byte-range-set
1798
+ ;; byte-range-set = 1#( byte-range-spec | suffix-byte-range-spec )
1799
+ ;; byte-range-spec = first-byte-pos "-" [last-byte-pos]
1800
+ ;; first-byte-pos = 1*DIGIT
1801
+ ;; last-byte-pos = 1*DIGIT
1802
+ ;; suffix-byte-range-spec = "-" suffix-length
1803
+ ;; suffix-length = 1*DIGIT
1804
+ ;;
1805
+ (declare-header! "Range"
1806
+ (lambda (str)
1807
+ (unless (string-prefix? "bytes=" str)
1808
+ (bad-header 'range str))
1809
+ (cons
1810
+ 'bytes
1811
+ (map (lambda (x)
1812
+ (let ((dash (string-index x #\-)))
1813
+ (cond
1814
+ ((not dash)
1815
+ (bad-header 'range str))
1816
+ ((zero? dash)
1817
+ (cons #f (parse-non-negative-integer x 1)))
1818
+ ((= dash (1- (string-length x)))
1819
+ (cons (parse-non-negative-integer x 0 dash) #f))
1820
+ (else
1821
+ (cons (parse-non-negative-integer x 0 dash)
1822
+ (parse-non-negative-integer x (1+ dash)))))))
1823
+ (string-split (substring str 6) #\,))))
1824
+ (lambda (val)
1825
+ (match val
1826
+ (((? symbol?)
1827
+ (or (#f . (? non-negative-integer?))
1828
+ ((? non-negative-integer?) . (? non-negative-integer?))
1829
+ ((? non-negative-integer?) . #f))
1830
+ ...) #t)
1831
+ (_ #f)))
1832
+ (lambda (val port)
1833
+ (match val
1834
+ ((unit . ranges)
1835
+ (put-symbol port unit)
1836
+ (put-char port #\=)
1837
+ (put-list
1838
+ port ranges
1839
+ (lambda (port range)
1840
+ (match range
1841
+ ((start . end)
1842
+ (when start (put-non-negative-integer port start))
1843
+ (put-char port #\-)
1844
+ (when end (put-non-negative-integer port end)))))
1845
+ ",")))))
1846
+
1847
+ ;; Referer = URI-reference
1848
+ ;;
1849
+ (declare-uri-reference-header! "Referer")
1850
+
1851
+ ;; TE = #( t-codings )
1852
+ ;; t-codings = "trailers" | ( transfer-extension [ accept-params ] )
1853
+ ;;
1854
+ (declare-param-list-header! "TE")
1855
+
1856
+ ;; User-Agent = 1*( product | comment )
1857
+ ;;
1858
+ (declare-opaque-header! "User-Agent")
1859
+
1860
+
1861
+
1862
+
1863
+ ;;;
1864
+ ;;; Reponse headers
1865
+ ;;;
1866
+
1867
+ ;; Accept-Ranges = acceptable-ranges
1868
+ ;; acceptable-ranges = 1#range-unit | "none"
1869
+ ;;
1870
+ (declare-symbol-list-header! "Accept-Ranges")
1871
+
1872
+ ;; Age = age-value
1873
+ ;; age-value = delta-seconds
1874
+ ;;
1875
+ (declare-integer-header! "Age")
1876
+
1877
+ ;; ETag = entity-tag
1878
+ ;;
1879
+ (declare-header! "ETag"
1880
+ parse-entity-tag
1881
+ entity-tag?
1882
+ (lambda (val port)
1883
+ (put-entity-tag port val)))
1884
+
1885
+ ;; Location = URI-reference
1886
+ ;;
1887
+ ;; In RFC 2616, Location was specified as being an absolute URI. This
1888
+ ;; was changed in RFC 7231 to permit URI references generally, which
1889
+ ;; matches web reality.
1890
+ ;;
1891
+ (declare-uri-reference-header! "Location")
1892
+
1893
+ ;; Proxy-Authenticate = 1#challenge
1894
+ ;;
1895
+ (declare-challenge-list-header! "Proxy-Authenticate")
1896
+
1897
+ ;; Retry-After = ( HTTP-date | delta-seconds )
1898
+ ;;
1899
+ (declare-header! "Retry-After"
1900
+ (lambda (str)
1901
+ (if (and (not (string-null? str))
1902
+ (char-numeric? (string-ref str 0)))
1903
+ (parse-non-negative-integer str)
1904
+ (parse-date str)))
1905
+ (lambda (val)
1906
+ (or (date? val) (non-negative-integer? val)))
1907
+ (lambda (val port)
1908
+ (if (date? val)
1909
+ (write-date val port)
1910
+ (put-non-negative-integer port val))))
1911
+
1912
+ ;; Server = 1*( product | comment )
1913
+ ;;
1914
+ (declare-opaque-header! "Server")
1915
+
1916
+ ;; Vary = ( "*" | 1#field-name )
1917
+ ;;
1918
+ (declare-header! "Vary"
1919
+ (lambda (str)
1920
+ (if (equal? str "*")
1921
+ '*
1922
+ (split-header-names str)))
1923
+ (lambda (val)
1924
+ (or (eq? val '*) (list-of-header-names? val)))
1925
+ (lambda (val port)
1926
+ (if (eq? val '*)
1927
+ (put-string port "*")
1928
+ (write-header-list val port))))
1929
+
1930
+ ;; WWW-Authenticate = 1#challenge
1931
+ ;;
1932
+ (declare-challenge-list-header! "WWW-Authenticate")
1933
+
1934
+
1935
+ ;; Chunked Responses
1936
+ (define (read-chunk-header port)
1937
+ "Read a chunk header from PORT and return the size in bytes of the
1938
+ upcoming chunk."
1939
+ (match (read-line port)
1940
+ ((? eof-object?)
1941
+ ;; Connection closed prematurely: there's nothing left to read.
1942
+ 0)
1943
+ (str
1944
+ (let ((extension-start (string-index str
1945
+ (lambda (c)
1946
+ (or (char=? c #\;)
1947
+ (char=? c #\return))))))
1948
+ (string->number (if extension-start ; unnecessary?
1949
+ (substring str 0 extension-start)
1950
+ str)
1951
+ 16)))))
1952
+
1953
+ (define* (make-chunked-input-port port #:key (keep-alive? #f))
1954
+ "Returns a new port which translates HTTP chunked transfer encoded
1955
+ data from PORT into a non-encoded format. Returns eof when it has
1956
+ read the final chunk from PORT. This does not necessarily mean
1957
+ that there is no more data on PORT. When the returned port is
1958
+ closed it will also close PORT, unless the KEEP-ALIVE? is true."
1959
+ (define (close)
1960
+ (unless keep-alive?
1961
+ (close-port port)))
1962
+
1963
+ (define chunk-size 0) ;size of the current chunk
1964
+ (define remaining 0) ;number of bytes left from the current chunk
1965
+ (define finished? #f) ;did we get all the chunks?
1966
+
1967
+ (define (read! bv idx to-read)
1968
+ (define (loop to-read num-read)
1969
+ (cond ((or finished? (zero? to-read))
1970
+ num-read)
1971
+ ((zero? remaining) ;get a new chunk
1972
+ (let ((size (read-chunk-header port)))
1973
+ (set! chunk-size size)
1974
+ (set! remaining size)
1975
+ (cond
1976
+ ((zero? size)
1977
+ (set! finished? #t)
1978
+ num-read)
1979
+ (else
1980
+ (loop to-read num-read)))))
1981
+ (else ;read from the current chunk
1982
+ (let* ((ask-for (min to-read remaining))
1983
+ (read (get-bytevector-n! port bv (+ idx num-read)
1984
+ ask-for)))
1985
+ (cond
1986
+ ((eof-object? read) ;premature termination
1987
+ (set! finished? #t)
1988
+ num-read)
1989
+ (else
1990
+ (let ((left (- remaining read)))
1991
+ (set! remaining left)
1992
+ (when (zero? left)
1993
+ ;; We're done with this chunk; read CR and LF.
1994
+ (get-u8 port) (get-u8 port))
1995
+ (loop (- to-read read)
1996
+ (+ num-read read)))))))))
1997
+ (loop to-read 0))
1998
+
1999
+ (make-custom-binary-input-port "chunked input port" read! #f #f close))
2000
+
2001
+ (define* (make-chunked-output-port port #:key (keep-alive? #f)
2002
+ (buffering 1200))
2003
+ "Returns a new port which translates non-encoded data into a HTTP
2004
+ chunked transfer encoded data and writes this to PORT. Data written to
2005
+ this port is buffered until the port is flushed, at which point it is
2006
+ all sent as one chunk. The port will otherwise be flushed every
2007
+ BUFFERING bytes, which defaults to 1200. Take care to close the port
2008
+ when done, as it will output the remaining data, and encode the final
2009
+ zero chunk. When the port is closed it will also close PORT, unless
2010
+ KEEP-ALIVE? is true."
2011
+ (define (q-for-each f q)
2012
+ (while (not (q-empty? q))
2013
+ (f (deq! q))))
2014
+ (define queue (make-q))
2015
+ (define (%put-char c)
2016
+ (enq! queue c))
2017
+ (define (%put-string s)
2018
+ (string-for-each (lambda (c) (enq! queue c))
2019
+ s))
2020
+ (define (flush)
2021
+ ;; It is important that we do _not_ write a chunk if the queue is
2022
+ ;; empty, since it will be treated as the final chunk.
2023
+ (unless (q-empty? queue)
2024
+ (let ((len (q-length queue)))
2025
+ (put-string port (number->string len 16))
2026
+ (put-string port "\r\n")
2027
+ (q-for-each (lambda (elem) (put-char port elem))
2028
+ queue)
2029
+ (put-string port "\r\n"))))
2030
+ (define (close)
2031
+ (flush)
2032
+ (put-string port "0\r\n")
2033
+ (force-output port)
2034
+ (unless keep-alive?
2035
+ (close-port port)))
2036
+ (let ((ret (make-soft-port (vector %put-char %put-string flush #f close) "w")))
2037
+ (setvbuf ret 'block buffering)
2038
+ ret))
2039
+
2040
+ (define %http-proxy-port? (make-object-property))
2041
+ (define (http-proxy-port? port) (%http-proxy-port? port))
2042
+ (define (set-http-proxy-port?! port flag)
2043
+ (set! (%http-proxy-port? port) flag))