class Gemini {
- function __construct() {
+ function __construct($config) {
+ if(empty($config['certificate_file']))
+ die("Missing certificate file. Edit config.php");
+ $this->ip = "0";
+ $this->port = "1965";
$this->data_dir = "hosts/";
$this->default_host_dir = "default/";
+ $this->default_index_file = "index.gemini";
+ $this->logging = 1;
+ $this->log_file = "logs/gemini-php.log";
+ $this->log_sep = "\t";
+ $settings = array('ip', 'port', 'data_dir', 'default_host_dir', 'default_index_file',
+ 'certificate_file', 'certificate_passphrase');
+ foreach($settings as $setting_key) {
+ if(!empty($config[$setting_key]))
+ $this->$setting_key = $config[$setting_key];
+ }
+ // append the required filepath slashes if they're missing
+ if(substr($this->data_dir, -1) != "/")
+ $this->data_dir .= "/";
+ if(substr($this->default_host_dir, -1) != "/")
+ $this->default_host_dir .= "/";
+ if($this->logging) {
+ if(!file_exists($this->log_file)) {
+ $this->log_to_file("New log file created");
+ }
+ if(!is_writable($this->log_file)) {
+ die("{$this->log_file} is not writable.");
+ }
+ }
}
function parse_request($request) {
return $dirs;
}
- function get_dir($parsed_url) {
- }
-
function get_host_url($host) {
if(empty($host))
return 'default';
}
function get_mime_type($filepath) {
- return "text/gemini";
+ $type = mime_content_type($filepath);
+ // we need a way to detect gemini file types, which PHP doesn't
+ // so.. if it ends with gemini (or if it has no extension), assume
+ $path_parts = pathinfo($filepath);
+ if(empty($path_parts['extension']) or $path_parts['extension'] == "gemini")
+ $type = "text/gemini";
+ return $type;
}
/**
// Kristall Browser is adding "__" to the end of the filenames
// wtf am I missing?
$url['path'] = str_replace("__", "", $url['path']);
+ if($url['path'] == "" or $url['path'] == "/")
+ $url['path'] = "/".$this->default_index_file;
return $this->data_dir.$hostname.$url['path'];
}
+
+ function log_to_file($ip, $status_code, $meta, $filepath, $filesize) {
+ $ts = date("Y-m-d H:i:s", strtotime('now'));
+ $this->log_sep;
+ $str = $ts.$this->log_sep.$ip.$this->log_sep.$status_code.$this->log_sep.
+ $meta.$this->log_sep.$filepath.$this->log_sep.$filesize."\n";
+ file_put_contents($this->log_file, $str, FILE_APPEND);
+ }
}
?>