5 (require web-server/formlets)
6 (require web-server/servlet)
7 (require web-server/servlet-env)
8 (require web-server/templates)
10 (require "blacklist.rkt")
12 (define (member-match? itm lst)
13 (ormap (lambda (i) (regexp-match? (regexp i) itm)) lst))
15 (define-values (dispatch generate-url)
18 [("search") do-search]
21 (define (do-index req)
22 (http-response (include-template "index.html")))
24 (define (search query)
25 (define engine (string->url
27 "https://search.trom.tf/search?format=json&q=" query)))
28 (define response (get-pure-port engine))
29 (define json-raw (port->string response))
30 (close-input-port response)
31 (with-input-from-string json-raw (lambda () (read-json))))
33 (define (http-response content) ; The 'content' parameter should be a string.
35 200 ; HTTP response code.
36 #"OK" ; HTTP response message.
37 (current-seconds) ; Timestamp.
38 TEXT/HTML-MIME-TYPE ; MIME type for content.
39 '() ; Additional HTTP headers.
40 (list ; Content (in bytes) to send to the browser.
41 (string->bytes/utf-8 content))))
43 (define (do-search req)
44 (define binds (request-bindings req))
45 (define query (if (exists-binding? 'q binds)
46 (extract-binding/single 'q binds)
49 (if (non-empty-string? query)
56 (url-host (string->url
57 (hash-ref i 'url ""))))
58 (define result-url (hash-ref i 'url ""))
59 (define result-title (hash-ref i 'title ""))
60 (define result-content (hash-ref i 'content ""))
61 (define ht (make-hash))
62 (unless (member-match? result-host blacklist)
64 (hash-set! ht "title" result-title)
65 (hash-set! ht "url" result-url)
66 (hash-set! ht "content" result-content)
70 (hash-ref (search query) 'results)))))
71 (http-response (include-template "search.html")))
74 (serve/servlet dispatch
76 #:servlet-regexp #rx""
77 #:extra-files-paths (list (build-path "./static")))