summaryrefslogtreecommitdiff
path: root/src/http.lisp
blob: 891f730ec819a310d07dfeb2073d93673cdcab85 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
;;; -*- Mode: Lisp; Syntax: ANSI-Common-Lisp; Base: 10 -*-
(declaim (optimize (speed 0) (safety 3) (debug 3)))

(in-package #:org-ckons-http)

(defmacro with-cookie-jar (&rest body)
  `(let ((cookie-jar (make-instance 'drakma:cookie-jar)))
     ,@body))

(defun drakma-request (url
                       cookie-jar
                       &key
                         (method :get)
                         (content-type "application/x-www-form-urlencoded")
                         (content nil)
                         (user-agent :firefox)
                         (redirect t)
                         (auto-referer t)
                         (additional-headers nil)
                         (connection-timeout 20)
                         (proxy nil)
                         (proxy-basic-authorization nil)
                         (basic-authorization nil))
  (drakma:http-request url
                       :cookie-jar cookie-jar
                       :method method
                       :content-type content-type
                       :content content
                       :user-agent user-agent
                       :redirect redirect
                       :auto-referer auto-referer
                       :connection-timeout connection-timeout
                       :additional-headers additional-headers
                       :proxy proxy
                       :proxy-basic-authorization proxy-basic-authorization
                       :basic-authorization basic-authorization
                       :close t))

(defun escape-url (url)
  (let ((escaped-url url))
    (setf escaped-url (ppcre:regex-replace-all "%" escaped-url "%25"))
    (setf escaped-url (ppcre:regex-replace-all "\\?" escaped-url "%3F"))
    (setf escaped-url (ppcre:regex-replace-all "#" escaped-url "%23"))
    (setf escaped-url (ppcre:regex-replace-all "/" escaped-url "%2F"))
    (setf escaped-url (ppcre:regex-replace-all "'" escaped-url "%27"))
    (setf escaped-url (ppcre:regex-replace-all " " escaped-url "%20"))
    (setf escaped-url (ppcre:regex-replace-all "\\(" escaped-url "%28"))
    (setf escaped-url (ppcre:regex-replace-all "\\)" escaped-url "%29"))
    (setf escaped-url (ppcre:regex-replace-all ":" escaped-url "%3A"))
    escaped-url))

(defun unescape-url (url)
  (let ((unescaped-url url))
    (setf unescaped-url (ppcre:regex-replace-all "%25" unescaped-url "%"))
    (setf unescaped-url (ppcre:regex-replace-all "%3F" unescaped-url "?"))
    (setf unescaped-url (ppcre:regex-replace-all "%23" unescaped-url "#"))
    (setf unescaped-url (ppcre:regex-replace-all "%2F" unescaped-url "/"))
    (setf unescaped-url (ppcre:regex-replace-all "%27" unescaped-url "'"))
    (setf unescaped-url (ppcre:regex-replace-all "%20" unescaped-url " "))
    (setf unescaped-url (ppcre:regex-replace-all "%28" unescaped-url "("))
    (setf unescaped-url (ppcre:regex-replace-all "%29" unescaped-url ")"))
    (setf unescaped-url (ppcre:regex-replace-all "%3A" unescaped-url ":"))
    unescaped-url))

(defun newlines-to-backslash-n (body)
  (cl-ppcre:regex-replace-all #\Newline body "\\\\n"))