Brushing off enough dust to be able to initiate HTTP requests from the server.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4345 ed5197a5-7fde-0310-b194-c3ffbd925b24
This commit is contained in:
		
							
								
								
									
										60
									
								
								core/http.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										60
									
								
								core/http.js
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,60 @@
 | 
			
		||||
function parseUrl(url) {
 | 
			
		||||
	// XXX: Hack.
 | 
			
		||||
	let match = url.match(new RegExp("(\\w+)://([^/]+)?(.*)"));
 | 
			
		||||
	return {
 | 
			
		||||
		protocol: match[1],
 | 
			
		||||
		host: match[2],
 | 
			
		||||
		path: match[3],
 | 
			
		||||
		port: match[1] == "http" ? 80 : 443,
 | 
			
		||||
	};
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function parseResponse(data) {
 | 
			
		||||
	let firstLine;
 | 
			
		||||
	let headers = {};
 | 
			
		||||
 | 
			
		||||
	while (true) {
 | 
			
		||||
		let endLine = data.indexOf('\r\n');
 | 
			
		||||
		let line = data.substring(0, endLine);
 | 
			
		||||
		if (!firstLine) {
 | 
			
		||||
			firstLine = line;
 | 
			
		||||
		} else if (!line.length) {
 | 
			
		||||
			break;
 | 
			
		||||
		} else {
 | 
			
		||||
			let colon = line.indexOf(":");
 | 
			
		||||
			headers[line.substring(colon)] = line.substring(colon + 1);
 | 
			
		||||
		}
 | 
			
		||||
		data = data.substring(endLine + 2);
 | 
			
		||||
	}
 | 
			
		||||
	return {body: data};
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export function fetch(url, options) {
 | 
			
		||||
	let parsed = parseUrl(url);
 | 
			
		||||
	return new Promise(function(resolve, reject) {
 | 
			
		||||
		let socket = new Socket();
 | 
			
		||||
		let buffer = new Uint8Array(0)
 | 
			
		||||
 | 
			
		||||
		return socket.connect(parsed.host, parsed.port).then(function() {
 | 
			
		||||
			socket.read(function(data) {
 | 
			
		||||
				if (data) {
 | 
			
		||||
					let newBuffer = new Uint8Array(buffer.length + data.length);
 | 
			
		||||
					newBuffer.set(buffer, 0);
 | 
			
		||||
					newBuffer.set(data, buffer.length);
 | 
			
		||||
					buffer = newBuffer;
 | 
			
		||||
				} else {
 | 
			
		||||
					resolve(parseResponse(utf8Decode(buffer)));
 | 
			
		||||
				}
 | 
			
		||||
			});
 | 
			
		||||
 | 
			
		||||
			if (parsed.port == 443) {
 | 
			
		||||
				return socket.startTls();
 | 
			
		||||
			}
 | 
			
		||||
		}).then(function() {
 | 
			
		||||
			socket.write(`${options?.method ?? 'GET'} ${parsed.path} HTTP/1.0\r\nHost: ${parsed.host}\r\nConnection: close\r\n\r\n`);
 | 
			
		||||
			socket.shutdown();
 | 
			
		||||
		}).catch(function(error) {
 | 
			
		||||
			reject(error);
 | 
			
		||||
		});
 | 
			
		||||
	});
 | 
			
		||||
}
 | 
			
		||||
@@ -2,7 +2,7 @@
 | 
			
		||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
 | 
			
		||||
	package="com.unprompted.tildefriends"
 | 
			
		||||
	versionCode="9"
 | 
			
		||||
	versionName="0.0.9">
 | 
			
		||||
	versionName="0.0.9-wip">
 | 
			
		||||
	<uses-sdk android:minSdkVersion="26"/>
 | 
			
		||||
	<uses-permission android:name="android.permission.INTERNET"/>
 | 
			
		||||
	<application android:label="Tilde Friends" android:usesCleartextTraffic="true" android:debuggable="true">
 | 
			
		||||
 
 | 
			
		||||
@@ -154,6 +154,7 @@ void tf_tls_session_start_connect(tf_tls_session_t* session)
 | 
			
		||||
	X509_VERIFY_PARAM* param = SSL_get0_param(session->ssl);
 | 
			
		||||
	X509_VERIFY_PARAM_set_hostflags(param, X509_CHECK_FLAG_NO_PARTIAL_WILDCARDS);
 | 
			
		||||
	X509_VERIFY_PARAM_set1_host(param, session->hostname, 0);
 | 
			
		||||
	SSL_set_tlsext_host_name(session->ssl, session->hostname);
 | 
			
		||||
	SSL_set_bio(session->ssl, session->bio_in, session->bio_out);
 | 
			
		||||
	SSL_connect(session->ssl);
 | 
			
		||||
	tf_tls_session_handshake(session);
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user