mirror of https://codeberg.org/cage/tinmop/
- removed link header parser.
This commit is contained in:
parent
ef034729e8
commit
88b6857a2e
|
@ -1,108 +0,0 @@
|
||||||
;; tinmop: an humble gemini and pleroma client
|
|
||||||
;; Copyright (C) 2020 cage
|
|
||||||
|
|
||||||
;; This program is free software: you can redistribute it and/or modify
|
|
||||||
;; it under the terms of the GNU General Public License as published by
|
|
||||||
;; the Free Software Foundation, either version 3 of the License, or
|
|
||||||
;; (at your option) any later version.
|
|
||||||
|
|
||||||
;; This program is distributed in the hope that it will be useful,
|
|
||||||
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
;; GNU General Public License for more details.
|
|
||||||
|
|
||||||
;; You should have received a copy of the GNU General Public License
|
|
||||||
;; along with this program.
|
|
||||||
;; If not, see [[http://www.gnu.org/licenses/][http://www.gnu.org/licenses/]].
|
|
||||||
|
|
||||||
(in-package :link-header-parser)
|
|
||||||
|
|
||||||
(defrule link-start #\<
|
|
||||||
(:text t))
|
|
||||||
|
|
||||||
(defrule link-end #\>
|
|
||||||
(:text t))
|
|
||||||
|
|
||||||
(defrule field-separator #\;
|
|
||||||
(:text t))
|
|
||||||
|
|
||||||
(defrule parameter-separator #\=
|
|
||||||
(:text t))
|
|
||||||
|
|
||||||
(defrule parameter-value-quoting #\"
|
|
||||||
(:text t))
|
|
||||||
|
|
||||||
(defrule links-separator #\,
|
|
||||||
(:text t))
|
|
||||||
|
|
||||||
(defrule alpha (character-ranges (#\a #\z) (#\A #\Z))
|
|
||||||
(:text t))
|
|
||||||
|
|
||||||
(defrule digit (character-ranges (#\0 #\9))
|
|
||||||
(:text t))
|
|
||||||
|
|
||||||
(defrule iri-chars (not link-end)
|
|
||||||
(:text t))
|
|
||||||
|
|
||||||
(defrule blank (or #\space #\Newline #\Tab)
|
|
||||||
(:constant nil))
|
|
||||||
|
|
||||||
(defrule blanks (* blank)
|
|
||||||
(:constant nil))
|
|
||||||
|
|
||||||
(defrule parameter-key-chars (or alpha digit #\_ #\- #\.))
|
|
||||||
|
|
||||||
(defrule parameter-value-chars (not (or blank field-separator links-separator parameter-value-quoting)))
|
|
||||||
|
|
||||||
(defrule parameter (and (+ parameter-key-chars)
|
|
||||||
blanks
|
|
||||||
parameter-separator
|
|
||||||
blanks
|
|
||||||
(? parameter-value-quoting)
|
|
||||||
(+ parameter-value-chars)
|
|
||||||
(? parameter-value-quoting)
|
|
||||||
(? field-separator))
|
|
||||||
(:function (lambda (a) (cons (text (first a))
|
|
||||||
(text (sixth a))))))
|
|
||||||
|
|
||||||
(defrule parameters-list (+ (and parameter blanks))
|
|
||||||
(:function (lambda (a) (mapcar #'first a))))
|
|
||||||
|
|
||||||
(defrule link-block (and link-start (+ iri-chars) link-end)
|
|
||||||
(:function (lambda (a) (iri:iri-parse (text (second a)) :null-on-error t))))
|
|
||||||
|
|
||||||
(defrule link-record (and link-block (? field-separator) blanks (* parameters-list))
|
|
||||||
(:function (lambda (a) (append (list (first a)) (fourth a)))))
|
|
||||||
|
|
||||||
(defrule link-header-value (and link-record blanks
|
|
||||||
(? links-separator)
|
|
||||||
blanks
|
|
||||||
(* link-record))
|
|
||||||
(:function (lambda (a) (append (list (first a)) (fifth a)))))
|
|
||||||
|
|
||||||
(defun parse-header (header)
|
|
||||||
(parse 'link-header-value header))
|
|
||||||
|
|
||||||
(define-constant +link-parameter-relation+ "rel" :test #'string=)
|
|
||||||
|
|
||||||
(defun extract-pagination-id (header direction query-key)
|
|
||||||
(when-let ((parsed (ignore-errors (parse-header header))))
|
|
||||||
(loop for field in parsed do
|
|
||||||
(let* ((iri (first field))
|
|
||||||
(params (second field))
|
|
||||||
(relation (assoc +link-parameter-relation+ params :test #'string=))
|
|
||||||
(query (uri:query iri)))
|
|
||||||
(when (string= (cdr relation) direction)
|
|
||||||
(multiple-value-bind (matched registers)
|
|
||||||
(cl-ppcre:scan-to-strings (strcat query-key "=([^&]+)") query)
|
|
||||||
(when matched
|
|
||||||
(return-from extract-pagination-id (elt registers 0)))))))))
|
|
||||||
|
|
||||||
(define-constant +link-pagination-query-param-max-id+ "max_id" :test #'string=)
|
|
||||||
|
|
||||||
(define-constant +link-pagination-relation-next+ "next" :test #'string=)
|
|
||||||
|
|
||||||
(defun extract-pagination-current-max-id (header)
|
|
||||||
(extract-pagination-id header
|
|
||||||
+link-pagination-relation-next+
|
|
||||||
+link-pagination-query-param-max-id+))
|
|
|
@ -775,17 +775,6 @@
|
||||||
:ipv6-address-p
|
:ipv6-address-p
|
||||||
:iri-to-parent-path))
|
:iri-to-parent-path))
|
||||||
|
|
||||||
;; (defpackage :link-header-parser
|
|
||||||
;; (:use
|
|
||||||
;; :cl
|
|
||||||
;; :alexandria
|
|
||||||
;; :esrap
|
|
||||||
;; :cl-ppcre
|
|
||||||
;; :text-utils)
|
|
||||||
;; (:export
|
|
||||||
;; :parse-header
|
|
||||||
;; :extract-pagination-current-max-id))
|
|
||||||
|
|
||||||
(defpackage :tour-mode-parser
|
(defpackage :tour-mode-parser
|
||||||
(:use
|
(:use
|
||||||
:cl
|
:cl
|
||||||
|
|
|
@ -1,43 +0,0 @@
|
||||||
;; tinmop: an humble gemini and pleroma client
|
|
||||||
;; Copyright (C) 2020 cage
|
|
||||||
|
|
||||||
;; This program is free software: you can redistribute it and/or modify
|
|
||||||
;; it under the terms of the GNU General Public License as published by
|
|
||||||
;; the Free Software Foundation, either version 3 of the License, or
|
|
||||||
;; (at your option) any later version.
|
|
||||||
|
|
||||||
;; This program is distributed in the hope that it will be useful,
|
|
||||||
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
;; GNU General Public License for more details.
|
|
||||||
|
|
||||||
;; You should have received a copy of the GNU General Public License
|
|
||||||
;; along with this program.
|
|
||||||
;; If not, see [[http://www.gnu.org/licenses/][http://www.gnu.org/licenses/]].
|
|
||||||
|
|
||||||
(in-package :link-header-tests)
|
|
||||||
|
|
||||||
(defsuite link-header-suite (all-suite))
|
|
||||||
|
|
||||||
(defun test-link-header (link-header results)
|
|
||||||
(let ((parsed (parse-header link-header)))
|
|
||||||
(loop for field in parsed
|
|
||||||
for original-field in results do
|
|
||||||
(when (not (and (iri= (first field) (first original-field))
|
|
||||||
(equalp (second field) (second original-field))))
|
|
||||||
(return-from test-link-header nil)))
|
|
||||||
t))
|
|
||||||
|
|
||||||
(defparameter *test-cases* `(("<http://invalid/a/b?p=5>; rel=\"f\"" .
|
|
||||||
(("http://invalid/a/b?p=5" (("rel" . "f")))))
|
|
||||||
,(cons (format nil "<https://example.org/>; rel=\"start\",~%<https://example.org/index>; rel=\"index\"")
|
|
||||||
'(("https://example.org/" (("rel" . "start")))
|
|
||||||
("https://example.org/index" (("rel" . "index")))))))
|
|
||||||
|
|
||||||
(deftest test-parsing (link-header-suite)
|
|
||||||
(loop for (a . b) in *test-cases* do
|
|
||||||
(assert-true (test-link-header a b) b)))
|
|
||||||
|
|
||||||
(deftest test-extraction-next-pagination-id (link-header-suite)
|
|
||||||
(let ((link-pagination "<https://invalid/api/v1/accounts/111013574088566395/following?max_id=123456>; rel=\"next\", <https://invalid/api/v1/accounts/111013574088566395/following?since_id=654321>; rel=\"prev\""))
|
|
||||||
(assert-equalp "123456" (extract-pagination-current-max-id link-pagination))))
|
|
|
@ -55,15 +55,6 @@
|
||||||
:all-tests)
|
:all-tests)
|
||||||
(:export))
|
(:export))
|
||||||
|
|
||||||
(defpackage :link-header-tests
|
|
||||||
(:use :cl
|
|
||||||
:alexandria
|
|
||||||
:clunit
|
|
||||||
:link-header-parser
|
|
||||||
:iri
|
|
||||||
:all-tests)
|
|
||||||
(:export))
|
|
||||||
|
|
||||||
(defpackage :numeric-tests
|
(defpackage :numeric-tests
|
||||||
(:use :cl
|
(:use :cl
|
||||||
:clunit
|
:clunit
|
||||||
|
|
Loading…
Reference in New Issue