Compare commits

..

No commits in common. "master" and "48c95a8370234afb2cb31e1844a0f8d0facf9d8d" have entirely different histories.

View file

@ -14,66 +14,35 @@
;; You should have received a copy of the GNU General Public License along with ;; You should have received a copy of the GNU General Public License along with
;; this program. If not, see <https://www.gnu.org/licenses/>. ;; this program. If not, see <https://www.gnu.org/licenses/>.
;;(use-modules (gnutls)) ;;( use-modules (gnutls) )
(use-modules (ice-9 binary-ports) (ice-9 iconv) (rnrs bytevectors) (web uri) (ice-9 textual-ports)) (use-modules (ice-9 binary-ports) (ice-9 iconv) (rnrs bytevectors))
(define port 8080) ;; 1965)
(define nom "localhost")
(define chaussette (socket PF_INET SOCK_STREAM 0)) (define chaussette (socket PF_INET SOCK_STREAM 0))
(bind chaussette AF_INET INADDR_ANY 8081) (bind chaussette AF_INET INADDR_ANY 8082)
(listen chaussette 1) (listen chaussette 1)
(display "Chaussette en place") (display "Chaussette en place")
(newline) (newline)
(while #t (while #t
(let (( rep (accept chaussette ))) (let (( rep (accept chaussette )))
(let ((out (car rep)) (in (cdr rep))) (let ((out (car rep)) (in (cdr rep)))
(define byte-buff (make-bytevector 1024)) (define text (make-bytevector 1024))
(define pos #f) (define pos #f)
(define url "") (recvfrom! out text)
(recvfrom! out byte-buff)
(set! url (bytevector->string byte-buff "UTF-8"))
;; position du CRLF dans l'url demandé
(set! pos (string-contains url (string #\return #\nl)))
;; si ya pas de \cr\nl, buffer trop grand ou url mal formatée (set! pos (string-contains (bytevector->string text "UTF-8")
(if (not pos) (string #\return #\nl)))
;; TODO message about error
(display (string-append "59 Bad Request" (string #\return #\nl)) out))
;; on parse l'url
(begin (let ((url-parse (string->uri (substring url 0 pos))))
(if (not url-parse)
(display (string-append "59 Bad Request" (string #\return #\nl)) out))
(begin
;; on vérifie que c'est bien le protocole gemini
(if (eq? (quote gemini) (uri-scheme url-parse))
(begin (let ((path (uri-path url-parse)))
(if (string=? path "") ;; si ya pas de \cr\nl, buffer trop grand ou mal formaté
;; si ya pas de chemin, on redirige vers / (l'index) (when (not pos) (begin
(display (string-append "31 gemini://" nom "/" (string #\return #\nl)) out) (display (string-append "59 Bad Request" (string #\return #\nl)) out))
(begin
(if (string=? path "/") (set! path "/index.gmi"))
;; on rajoute le chemin du dossier contenant les fichiers
(set! path (string-append "www" path))
;; si on a accès au fichier, on l'envoie, sinon pas trouvé
(if (access? path R_OK)
(display (string-append "20 text/gemini" (string #\return #\nl)
(get-string-all (open-file path "r"))) out)
(display (string-append "51 Not Found" (string #\return #\nl)) out)
)
)
)
))
(display (string-append "53 Proxy Request Refused" (string #\return #\nl)) out)
) )
)
))
(shutdown out 2) (unless (not pos) (begin
) (display "all ok")
)) ))
(shutdown out 2)
)))
(close chaussette) (close chaussette)
(display "Atterissage réussi") (display "Atterissage réussi")