/* * Copyright (c) 2021-2024 joshua stein * * Permission to use, copy, modify, and distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include #include #include #include "detritus.h" #ifndef __GEMINI_H__ #define __GEMINI_H__ #define GEMINI_PORT 1965 extern struct request_handler gemini_handler; enum { REQ_STATE_NEGOTIATING = 1, REQ_STATE_SENDING_REQUEST, REQ_STATE_PARSING_RESPONSE }; enum { GEM_STATE_HEADER, GEM_STATE_GEMTEXT, GEM_STATE_REDIRECT, GEM_STATE_DOWNLOAD }; struct gemini_request { struct browser *browser; struct URI *uri; uint8_t tls_id; unsigned char tcp_buf[(4 * 1500) + 2048]; /* 4*MTU + tcp_input */ unsigned char tcp_input[2048]; size_t tcp_input_len; short state; TCPiopb tcp_iopb; StreamPtr tcp_stream; wdsEntry tcp_wds[2]; TCPStatusPB tcp_status_pb; bool tcp_done_reading; char message[1024 + 3]; size_t message_len; short gem_state; char response[1024]; size_t response_len; size_t total_response_len; char mime_type[64]; unsigned long style; }; struct URI * gemini_parse_uri(char *uristr); void * gemini_init_request(struct browser *browser, struct URI *uri); bool gemini_process_request(void *cookie); void gemini_free(void *cookie); #endif