Last active
December 15, 2017 02:46
-
-
Save vincentius15/bc06163e09e1f3e65bd456971b4efe8d to your computer and use it in GitHub Desktop.
Fileserver
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import asyncore | |
import socket | |
import os | |
import shutil | |
import sys | |
import threading | |
def response_listdir(param): | |
param = param.split("/listdir/") | |
if(len(param)>1): | |
try : | |
l = "\n".join(str(x) for x in os.listdir(param[1])) | |
except : | |
l = "Not found" | |
else: | |
l = "\n".join(str(x) for x in os.listdir(os.curdir)) | |
print l | |
hasil = "HTTP/1.1 200 OK\r\n" \ | |
"Content-Type: text/plain\r\n" \ | |
"Content-Length: "+str(len(l))+"\r\n" \ | |
"\r\n" \ | |
+ l | |
return hasil | |
def response_download(param): | |
url, filename = param.split('=') | |
print filename | |
file = open(filename, 'rb').read() | |
panjang = len(file) | |
hasil = "HTTP/1.1 200 OK\r\n" \ | |
"Content-Type: multipart/form-data\r\n" \ | |
"Content-Length: {}\r\n" \ | |
"\r\n" \ | |
"{}".format(panjang, file) | |
return hasil | |
def response_delete(param): | |
url, filename = param.split('=') | |
try: | |
os.system('rm ' + filename) | |
hasil = "HTTP/1.1 200 OK\r\n" \ | |
"Content-Type: text/plain\r\n" \ | |
"Content-Length: 7\r\n" \ | |
"\r\n" \ | |
"Deleted" | |
except: | |
hasil = "HTTP/1.1 200 OK\r\n" \ | |
"Content-Type: text/plain\r\n" \ | |
"Content-Length: 13\r\n" \ | |
"\r\n" \ | |
"Cannot delete" | |
return hasil | |
def response_deletedir(param): | |
url, filename = param.split('=') | |
try : | |
shutil.rmtree(filename) | |
hasil = "HTTP/1.1 200 OK\r\n" \ | |
"Content-Type: text/plain\r\n" \ | |
"Content-Length: 7\r\n" \ | |
"\r\n" \ | |
"Deleted" | |
except : | |
hasil = "HTTP/1.1 200 OK\r\n" \ | |
"Content-Type: text/plain\r\n" \ | |
"Content-Length: 13\r\n" \ | |
"\r\n" \ | |
"Cannot delete" | |
return hasil | |
def response_move(param): | |
url, source, dest = param.split('=') | |
try: | |
os.system('mv ' + source + ' ' + dest) | |
hasil = "HTTP/1.1 200 OK\r\n" \ | |
"Content-Type: text/plain\r\n" \ | |
"Content-Length: 5\r\n" \ | |
"\r\n" \ | |
"Moved" | |
except: | |
hasil = "HTTP/1.1 200 OK\r\n" \ | |
"Content-Type: text/plain\r\n" \ | |
"Content-Length: 11\r\n" \ | |
"\r\n" \ | |
"Cannot move" | |
return hasil | |
def response_createdir(param): | |
url, dirname = param.split('=') | |
try: | |
os.system('mkdir ' + dirname) | |
hasil = "HTTP/1.1 200 OK\r\n" \ | |
"Content-Type: text/plain\r\n" \ | |
"Content-Length: 17\r\n" \ | |
"\r\n" \ | |
"directory created" | |
except: | |
hasil = "HTTP/1.1 200 OK\r\n" \ | |
"Content-Type: text/plain\r\n" \ | |
"Content-Length: 23\r\n" \ | |
"\r\n" \ | |
"Cannot create directory" | |
return hasil | |
def uploader(): | |
file = open('page.html', 'r').read() | |
panjang = len(file) | |
hasil = "HTTP/1.1 200 OK\r\n" \ | |
"Content-Type: text/html\r\n" \ | |
"Content-Length: {}\r\n" \ | |
"\r\n" \ | |
"{}".format(panjang, file) | |
return hasil | |
class ClientHandler(asyncore.dispatcher): | |
def __init__(self, sock): | |
asyncore.dispatcher.__init__(self, sock=sock) | |
self.request_message = "" | |
self.reply_message = "" | |
return | |
def handle_write(self): | |
pass | |
def handle_close(self): | |
pass | |
# fungsi melayani client | |
def handle_read(self): | |
data = self.recv(64) | |
#data = bytes.decode(data) | |
self.request_message = self.request_message + data | |
if (len(data)<64): | |
if self.request_message.startswith("POST") : | |
filename = self.request_message.split('filename="') | |
filename = filename[1] | |
index = filename.find('"') | |
filename = filename[:index:] | |
f = open(filename, "wb") | |
request_message = self.request_message.split("Content-Type: ") | |
request_message = request_message[2] | |
print request_message[-60::] | |
index = request_message.find("\r\n\r\n") | |
request_message = request_message[index + 4::] | |
request_message = request_message.split("\n\r\n------WebKitForm") | |
f.write(request_message[0]) | |
f.close() | |
baris = self.request_message.split("\r\n") | |
baris_request = baris[0] | |
print baris_request | |
a, url, c = baris_request.split(" ") | |
if (url.startswith("/download")): | |
respon = response_download(url) | |
elif (url.startswith("/deletedir")): | |
respon = response_deletedir(url) | |
elif (url.startswith("/delete")): | |
respon = response_delete(url) | |
elif (url.startswith("/createdir")): | |
respon = response_createdir(url) | |
elif (url.startswith("/move")): | |
respon = response_move(url) | |
elif (url.startswith('/listdir')): | |
respon = response_listdir(url) | |
elif (url == '/upload'): | |
respon = uploader() | |
elif (url == '/submit'): | |
respon = "HTTP/1.1 200 OK\r\n" \ | |
"Content-Type: text/plain\r\n" \ | |
"Content-Length: 13\r\n" \ | |
"\r\n" \ | |
"File uploaded" | |
elif (url == '/'): | |
respon = "HTTP/1.1 200 OK\r\n" \ | |
"Content-Type: text/plain\r\n" \ | |
"Content-Length: 19\r\n" \ | |
"\r\n" \ | |
"Connected to server" | |
else: | |
respon = "HTTP/1.1 200 OK\r\n" \ | |
"Content-Type: text/plain\r\n" \ | |
"Content-Length: 9\r\n" \ | |
"\r\n" \ | |
"Not found" | |
self.request_message = "" | |
self.send(respon) | |
self.close() | |
class WebServer(asyncore.dispatcher): | |
def __init__(self, host, port): | |
asyncore.dispatcher.__init__(self) | |
self.create_socket(socket.AF_INET, socket.SOCK_STREAM) | |
self.set_reuse_addr() | |
self.bind((host, port)) | |
self.listen(5) | |
def handle_connect(self): | |
pass | |
def handle_expt(self): | |
self.close() | |
def handle_read(self): | |
pass | |
def handle_write(self): | |
pass | |
def handle_close(self): | |
pass | |
def handle_accept(self): | |
pair = self.accept() | |
if pair is not None: | |
koneksi_client, alamat_client = pair | |
print 'Incoming connection from %s' % repr(alamat_client) | |
ClientHandler(koneksi_client) | |
# koneksi_client.send('haha') | |
# koneksi_client.close() | |
# s = threading.Thread(target=layani_client, args=(koneksi_client,alamat_client)) | |
# s.start() | |
server = WebServer('localhost', 13000) | |
asyncore.loop() |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<html><body> | |
<form enctype="multipart/form-data" action="http://localhost:13000/submit" method="post"> | |
<p>File: <input type="file" name="file"></p> | |
<p><input type="submit" value="Upload"></p> | |
</form> | |
</body></html> |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import os | |
import socket | |
import sys | |
import threading | |
import shutil | |
# inisialisasi | |
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) | |
# proses binding | |
server_address = ('localhost', 13000) | |
print >>sys.stderr, 'starting up on %s port %s' % server_address | |
sock.bind(server_address) | |
# listening | |
sock.listen(1) | |
def response_listdir(param): | |
param = param.split("/listdir/") | |
if(len(param)>1): | |
try : | |
l = "\n".join(str(x) for x in os.listdir(param[1])) | |
except : | |
l = "Not found" | |
else: | |
l = "\n".join(str(x) for x in os.listdir(os.curdir)) | |
print l | |
hasil = "HTTP/1.1 200 OK\r\n" \ | |
"Content-Type: text/plain\r\n" \ | |
"Content-Length: "+str(len(l))+"\r\n" \ | |
"\r\n" \ | |
+ l | |
return hasil | |
def response_download(param): | |
url, filename = param.split('=') | |
print filename | |
file = open(filename, 'rb').read() | |
panjang = len(file) | |
hasil = "HTTP/1.1 200 OK\r\n" \ | |
"Content-Type: multipart/form-data\r\n" \ | |
"Content-Length: {}\r\n" \ | |
"\r\n" \ | |
"{}".format(panjang, file) | |
return hasil | |
def response_delete(param): | |
url, filename = param.split('=') | |
try: | |
os.system('rm ' + filename) | |
hasil = "HTTP/1.1 200 OK\r\n" \ | |
"Content-Type: text/plain\r\n" \ | |
"Content-Length: 7\r\n" \ | |
"\r\n" \ | |
"Deleted" | |
except: | |
hasil = "HTTP/1.1 200 OK\r\n" \ | |
"Content-Type: text/plain\r\n" \ | |
"Content-Length: 13\r\n" \ | |
"\r\n" \ | |
"Cannot delete" | |
return hasil | |
def response_deletedir(param): | |
url, filename = param.split('=') | |
try : | |
shutil.rmtree(filename) | |
hasil = "HTTP/1.1 200 OK\r\n" \ | |
"Content-Type: text/plain\r\n" \ | |
"Content-Length: 7\r\n" \ | |
"\r\n" \ | |
"Deleted" | |
except : | |
hasil = "HTTP/1.1 200 OK\r\n" \ | |
"Content-Type: text/plain\r\n" \ | |
"Content-Length: 13\r\n" \ | |
"\r\n" \ | |
"Cannot delete" | |
return hasil | |
def response_move(param): | |
url, source, dest = param.split('=') | |
try: | |
os.system('mv ' + source + ' ' + dest) | |
hasil = "HTTP/1.1 200 OK\r\n" \ | |
"Content-Type: text/plain\r\n" \ | |
"Content-Length: 5\r\n" \ | |
"\r\n" \ | |
"Moved" | |
except: | |
hasil = "HTTP/1.1 200 OK\r\n" \ | |
"Content-Type: text/plain\r\n" \ | |
"Content-Length: 11\r\n" \ | |
"\r\n" \ | |
"Cannot move" | |
return hasil | |
def response_createdir(param): | |
url, dirname = param.split('=') | |
try: | |
os.system('mkdir ' + dirname) | |
hasil = "HTTP/1.1 200 OK\r\n" \ | |
"Content-Type: text/plain\r\n" \ | |
"Content-Length: 17\r\n" \ | |
"\r\n" \ | |
"directory created" | |
except: | |
hasil = "HTTP/1.1 200 OK\r\n" \ | |
"Content-Type: text/plain\r\n" \ | |
"Content-Length: 23\r\n" \ | |
"\r\n" \ | |
"Cannot create directory" | |
return hasil | |
def uploader(): | |
file = open('page.html', 'r').read() | |
panjang = len(file) | |
hasil = "HTTP/1.1 200 OK\r\n" \ | |
"Content-Type: text/html\r\n" \ | |
"Content-Length: {}\r\n" \ | |
"\r\n" \ | |
"{}".format(panjang, file) | |
return hasil | |
def post_receiver(): | |
#m = open("metadata", "wb") | |
request_message = '' | |
while True: | |
data = koneksi_client.recv(64) | |
request_message = request_message+data | |
if (len(data) < 64): | |
#m.write(request_message) | |
filename = request_message.split('filename="') | |
filename = filename[1] | |
index = filename.find('"') | |
filename = filename[:index:] | |
f = open(filename, "wb") | |
request_message = request_message.split("Content-Type: ") | |
request_message = request_message[2] | |
print request_message[-60::] | |
index = request_message.find("\r\n\r\n") | |
request_message = request_message[index+4::] | |
request_message = request_message.split("\n\r\n------WebKitForm") | |
break | |
f.write(request_message[0]) | |
f.close() | |
# fungsi melayani client | |
def layani_client(koneksi_client, alamat_client): | |
try: | |
print >> sys.stderr, 'ada koneksi dari ', alamat_client | |
request_message = '' | |
while True: | |
data = koneksi_client.recv(64) | |
#data = bytes.decode(data) | |
request_message = request_message + data | |
if request_message.startswith("POST") : | |
post_receiver() | |
break | |
if (request_message[-4:] == "\r\n\r\n"): | |
break | |
print request_message | |
baris = request_message.split("\r\n") | |
baris_request = baris[0] | |
print baris_request | |
a, url, c = baris_request.split(" ") | |
if (url.startswith("/download")): | |
respon = response_download(url) | |
elif (url.startswith("/deletedir")): | |
respon = response_deletedir(url) | |
elif (url.startswith("/delete")): | |
respon = response_delete(url) | |
elif (url.startswith("/createdir")): | |
respon = response_createdir(url) | |
elif (url.startswith("/move")): | |
respon = response_move(url) | |
elif (url.startswith('/listdir')): | |
respon = response_listdir(url) | |
elif (url == '/upload'): | |
respon = uploader() | |
elif (url == '/submit') : | |
respon = "HTTP/1.1 200 OK\r\n" \ | |
"Content-Type: text/plain\r\n" \ | |
"Content-Length: 13\r\n" \ | |
"\r\n" \ | |
"File uploaded" | |
elif (url == '/') : | |
respon = "HTTP/1.1 200 OK\r\n" \ | |
"Content-Type: text/plain\r\n" \ | |
"Content-Length: 19\r\n" \ | |
"\r\n" \ | |
"Connected to server" | |
else: | |
respon = "HTTP/1.1 200 OK\r\n" \ | |
"Content-Type: text/plain\r\n" \ | |
"Content-Length: 9\r\n" \ | |
"\r\n" \ | |
"Not found" | |
koneksi_client.send(respon) | |
finally: | |
# Clean up the connection | |
koneksi_client.close() | |
while True: | |
# Wait for a connection | |
print >> sys.stderr, 'waiting for a connection' | |
koneksi_client, alamat_client = sock.accept() | |
s = threading.Thread(target=layani_client, args=(koneksi_client, alamat_client)) | |
s.start() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
/download=filepath untuk download file
/deletedir=directoryname untuk hapus directory
/delete=filepath untuk hapus file
/createdir=directoryname untuk membuat directory baru
/move=sourcedirectory=destinationdirectory untuk memindahkan file atau directory
/listdir/directorypath untuk melihat isi directory
/upload untuk membuka form upload file