From d9deb8dfc99341c7f70ffb1f2258c4ad80378bf4 Mon Sep 17 00:00:00 2001 From: Kevin Lynx Date: Sat, 20 Jul 2013 10:57:27 +0800 Subject: [PATCH] add simple `get' json api, fix http search space decode --- ebin/api.beam | Bin 0 -> 4364 bytes ebin/crawler_http.beam | Bin 4460 -> 4824 bytes ebin/dhtcrawler.app | 25 +++++++++++++------------ ebin/http_handler.beam | Bin 9280 -> 8996 bytes 4 files changed, 13 insertions(+), 12 deletions(-) create mode 100644 ebin/api.beam diff --git a/ebin/api.beam b/ebin/api.beam new file mode 100644 index 0000000000000000000000000000000000000000..916006e3459a815a11e179b970acdbe18030611d GIT binary patch literal 4364 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 E0GZT2r~m)} delta 2832 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 diff --git a/ebin/dhtcrawler.app b/ebin/dhtcrawler.app index 267afdf..0d57ad6 100644 --- a/ebin/dhtcrawler.app +++ b/ebin/dhtcrawler.app @@ -1,18 +1,19 @@ {application,dhtcrawler, [{description,"A DHT crawler to index magnet hash to torrent"}, - {vsn,"37ccb19"}, + {vsn,"54a3012"}, {registered,[dht_crawler_sup]}, {applications,[kernel,stdlib,crypto,public_key,ssl,inets,bson, mongodb]}, {mod,{crawler_app,[]}}, - {modules,[bt_conn,bt_message,config,crawler_app,crawler_http, - crawler_stats,crawler_sup,db_daterange,db_frontend, - db_hash,db_hash_index,db_loc_torrent,db_store_mongo, - db_system,dht_monitor,hash_cache_writer,hash_reader, - hash_reader_stats,hash_reader_sup,http_cache, - http_handler,index_builder,index_download,index_file, - loc_torrent,loc_torrent_cache,loc_torrent_sup, - name_seger,rmmseg,string_split,time_util,tor_builder, - tor_download,tor_download_stats,tor_location, - tor_location_reader,tor_location_writer,tor_name_seg, - torrent_file,transfer,urldecode,vlog]}]}. + {modules,[api,bt_conn,bt_message,config,crawler_app, + crawler_http,crawler_stats,crawler_sup,db_daterange, + db_frontend,db_hash,db_hash_index,db_loc_torrent, + db_store_mongo,db_system,dht_monitor, + hash_cache_writer,hash_reader,hash_reader_stats, + hash_reader_sup,http_cache,http_handler,index_builder, + index_download,index_file,loc_torrent, + loc_torrent_cache,loc_torrent_sup,name_seger,rmmseg, + string_split,time_util,tor_builder,tor_download, + tor_download_stats,tor_location,tor_location_reader, + tor_location_writer,tor_name_seg,torrent_file, + transfer,urldecode,vlog]}]}. diff --git a/ebin/http_handler.beam b/ebin/http_handler.beam index b32582b6a942255d3f2ef3f2b5858bf63e1067ae..017a56436fb687f5d97e6fc59cd87a7d211a9d07 100644 GIT binary patch delta 7136 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