commit - c7b163126c640f439a8cca24ec4ea916c47db419
commit + 5dd19adec63e216b659aa60ea7af57f678a657ba
blob - b3890fc326491cafe5f119eb9bce756c494acd20 (mode 644)
blob + /dev/null
--- Makefile
+++ /dev/null
-JAVAC = javac
-
-CLASSES = java/com/omarpolo/gemini/Request.class
-
-.PHONY: all clean
-
-all: ${CLASSES}
-
-clean:
- find java -type f -iname '*.class' -exec rm {} +
-
-.SUFFIXES: .java .class
-.java.class:
- ${JAVAC} $<
blob - 4707374513c2755776e8ee2f9a520d283ce92555
blob + 134a53705de48cb6333ae8fb121ca8a8832e04e0
--- README.md
+++ README.md
# blog
-## How to build
-
-Issue
-
- make
-
-then do the usual clojure stuff.
+just another random tech blog
blob - 88dd338d51d66669a13af58ddebe22d7ef4542fa
blob + 08cbbae20f3cc79c3a2356f4ac265945cc09fbd5
--- deps.edn
+++ deps.edn
ring {:mvn/version "1.8.0"}
commonmark-hiccup {:mvn/version "0.1.0"}
org.clojure/data.xml {:mvn/version "0.2.0-alpha6"}
- com.omarpolo/gemtext {:mvn/version "0.1.5"}}
+ com.omarpolo/gemtext {:mvn/version "0.1.5"}
+ com.omarpolo/gemini {:mvn/version "0.2.0"}}
- :paths ["classes" "src" "resources" "java"]
+ :paths ["classes" "src" "resources"]
:aliases
{:act {:main-opts ["-m" "blog.core"]}}}
blob - 195ef9647afca4eccc7f8d34f99c6d95aea998a6 (mode 644)
blob + /dev/null
--- java/com/omarpolo/gemini/Request.java
+++ /dev/null
-package com.omarpolo.gemini;
-
-import javax.net.ssl.*;
-import java.io.*;
-import java.net.*;
-import java.security.KeyManagementException;
-import java.security.NoSuchAlgorithmException;
-import java.security.SecureRandom;
-import java.security.cert.X509Certificate;
-import java.util.Collections;
-import java.util.NoSuchElementException;
-import java.util.Scanner;
-
-public class Request implements AutoCloseable {
-
- private final BufferedReader in;
- private final PrintWriter out;
- private final SSLSocket sock;
-
- private final int code;
- private final String meta;
-
- public static class DummyManager extends X509ExtendedTrustManager {
-
- @Override
- public void checkClientTrusted(X509Certificate[] chain, String authType, Socket socket) {
- }
-
- @Override
- public void checkServerTrusted(X509Certificate[] chain, String authType, Socket socket) {
- }
-
- @Override
- public void checkClientTrusted(X509Certificate[] chain, String authType, SSLEngine engine) {
- }
-
- @Override
- public void checkServerTrusted(X509Certificate[] chain, String authType, SSLEngine engine) {
- }
-
- @Override
- public void checkClientTrusted(X509Certificate[] chain, String authType) {
- }
-
- @Override
- public void checkServerTrusted(X509Certificate[] chain, String authType) {
- }
-
- @Override
- public X509Certificate[] getAcceptedIssuers() {
- return null;
- }
- }
-
- public static class MalformedResponse extends Exception {}
-
- public Request(String uri) throws IOException, MalformedResponse, URISyntaxException {
- this(new URI(uri));
- }
-
- public Request(URI url) throws IOException, MalformedResponse {
- this(url.getHost(), url.getPort(), url.toString() + "\r\n");
- }
-
- public Request(String host, int port, String req) throws IOException, MalformedResponse {
- if (port == -1) {
- port = 1965;
- }
-
- sock = connect(host, port);
-
- var outStream = sock.getOutputStream();
- out = new PrintWriter(
- new BufferedWriter(new OutputStreamWriter(outStream)));
-
- out.print(req);
- out.flush();
-
- var inStream = sock.getInputStream();
- in = new BufferedReader(new InputStreamReader(inStream));
-
- var reply = in.readLine();
-
- if (reply.length() > 1027) {
- throw new MalformedResponse();
- }
-
- var s = new Scanner(new StringReader(reply));
- try {
- code = s.nextInt();
- s.skip(" ");
- meta = s.nextLine();
- } catch (NoSuchElementException e) {
- throw new MalformedResponse();
- }
- }
-
- public SSLSocket connect(String host, int port) throws IOException {
- try {
- var params = new SSLParameters();
- params.setServerNames(Collections.singletonList(new SNIHostName(host)));
-
- var ctx = SSLContext.getInstance("TLS");
- ctx.init(null, new DummyManager[]{new DummyManager()}, new SecureRandom());
- var factory = (SSLSocketFactory) ctx.getSocketFactory();
-
- var socket = (SSLSocket) factory.createSocket(host, port);
- socket.setSSLParameters(params);
- socket.startHandshake();
- return socket;
- }
- catch (NoSuchAlgorithmException | KeyManagementException e) {
- throw new RuntimeException("Unexpected failure", e);
- }
- }
-
- public int getCode() {
- return code;
- }
-
- public String getMeta() {
- return meta;
- }
-
- public BufferedReader body() {
- return in;
- }
-
- public void close() throws IOException {
- in.close();
- out.close();
- sock.close();
- }
-}
blob - 4cb2fa898d7ff0d5655872a37d9e76215d70b46e
blob + 50cc57fe3b4b5c475b1cb8c3aee7bbf41637c25d
--- src/blog/core.clj
+++ src/blog/core.clj
(defn antenna
"Ping antenna"
[]
- (net-gemini/head "warmedal.se" 1965
- (str "gemini://warmedal.se/~antenna/submit?gemini://gemini.omarpolo.com")))
+ (net-gemini/ping-antenna "gemini://gemini.omarpolo.com"))
(defn stop-jetty []
(.stop @j)
blob - 758ee354614329ac319d96cd0b8c6a0c97636e55
blob + 466daedcbb0582cc46bc1d36c63bf33740d6b487
--- src/blog/net_gemini.clj
+++ src/blog/net_gemini.clj
(ns blog.net-gemini
- (:import (com.omarpolo.gemini Request)))
+ (:require [gemini.core :as gemini]))
-(defn head [host port req]
- (with-open [res (Request. host port (str req "\r\n"))]
- {:code (.getCode res)
- :meta (.getMeta res)}))
+(def antenna-uri "gemini://warmedal.se/~antenna")
+(defn ping-antenna
+ "Sends the given `url` to antenna."
+ [url]
+ (gemini/with-request [req {:request (str antenna-uri "/submit?" url)
+ :follow-redirects? true}]
+ (gemini/body-as-string! req)))
+
(comment
- (with-open [res (Request. "gemini://localhost/index.gmi")]
- {:code (.getCode res)
- :meta (.getMeta res)})
+ (ping-antenna "gemini://gemini.omarpolo.com")
)