138 Commits
0.2 ... 0.7.0

Author SHA1 Message Date
Matthieu Gautier
cbe8f1df87 Merge pull request #234 from kiwix/new_version
New version 0.7.0
2018-10-31 15:30:03 +01:00
Matthieu Gautier
2fe5ec1d7c New version 0.7.0 2018-10-31 14:45:05 +01:00
Matthieu Gautier
eba80b92ef Merge pull request #229 from kiwix/new_kiwix-lib_api
WIP New kiwix lib api
2018-10-26 13:28:59 +02:00
Matthieu Gautier
c1e635bd4e [kiwix-manage] Add a download command to kiwix-manage.
With the download command, it is possible to download a zim corresponding
to a remote book in the library.
2018-10-26 13:26:04 +02:00
Matthieu Gautier
c8be8fbad8 [kiwix-manage] Update to last API of kiwix-lib.
`kiwix::Manager` cannot set the book index. We have to modify the book
itself.

We remove the `backend` option as the only supported xapian was and always
was xapian.
2018-10-24 15:24:27 +02:00
Matthieu Gautier
640f907fb2 Avoid recopy of books 2018-10-24 15:05:33 +02:00
Matthieu Gautier
eb407956b9 The index path must be absolute. 2018-10-24 15:05:14 +02:00
Matthieu Gautier
422dde9ff2 Allow the opds feed to filtered by the language and "paged". 2018-10-24 15:03:14 +02:00
Matthieu Gautier
f691f85724 Correctly get the bookIds to the opdsfeed.
We want to have LOCAL and REMOTE and VALID files.
2018-10-24 15:01:46 +02:00
Matthieu Gautier
fd4f228a41 Use the to_string function in kiwix lib instead of redefine it. 2018-10-24 14:53:25 +02:00
Matthieu Gautier
bf40d4ff91 Adapt kiwix-manage to new kiwix-lib API.
- Books are identified by Id, not by index.
- No more current option.
2018-09-06 18:59:51 +02:00
Matthieu Gautier
74fecd34e6 Adapt kiwix-serve to new API.
We also change the welcome page to link to icon url instead of
embeded them as base64 data.
2018-09-06 18:58:54 +02:00
Matthieu Gautier
881fe9f41d Merge pull request #224 from kiwix/new_version
New version 0.6.1
2018-08-30 16:02:33 +02:00
Matthieu Gautier
c23e0bc38a New version 0.6.1 2018-08-30 15:50:12 +02:00
Matthieu Gautier
d4d32aa2e8 Merge pull request #218 from int19h/217
Fix #217: RequestContext::connection is unused
2018-08-03 11:52:54 +02:00
Pavel Minaev
4a88c44626 Fix #217: RequestContext::connection is unused 2018-08-03 02:46:31 -07:00
Matthieu Gautier
0cc5b18488 Merge pull request #214 from int19h/213
Fix #213: sockaddr_in is undefined when compiling on FreeBSD
2018-08-03 11:37:28 +02:00
Pavel Minaev
88a32a152f Fix #213: sockaddr_in is undefined when compiling on FreeBSD
Make sure that <netinet/in.h> is included as per POSIX spec.
2018-08-03 02:32:16 -07:00
Matthieu Gautier
4b8c8c5f6f Merge pull request #216 from int19h/215
Fix #215: istringstream used without #include <sstream>
2018-08-03 11:17:56 +02:00
Pavel Minaev
f0568ff4a7 Fix #215: istringstream used without #include <sstream> 2018-08-03 02:12:53 -07:00
Kelson
ccdfe9839d Merge pull request #212 from int19h/211
Fix #211: getMimeTypeForFile does not handle files without extensions correctly
2018-08-03 07:57:51 +00:00
Pavel Minaev
221f3ef340 Fix #211: getMimeTypeForFile does not handle files without extensions correctly
Use `auto` instead of `unsigned int` to ensure proper size on 64-bit platforms
2018-08-03 00:48:08 -07:00
Matthieu Gautier
0785636ca5 Merge pull request #219 from kiwix/new_dep_archive_root
New deps archives now contains the BUILD_ directory
2018-08-03 08:54:12 +02:00
Matthieu Gautier
a3429fdc88 New deps archives now contains the BUILD_ directory 2018-08-03 08:38:56 +02:00
Kelson
f99b6965e9 Merge pull request #210 from cyrillemoureaux/fix-141
Fix crash when --library is provided but no actual library path is.
2018-06-29 15:12:17 +02:00
cyrillemoureaux
228402b505 Fix crash when --library is provided but no actual library path is, by
avoiding going over argc.
2018-06-29 14:26:38 +02:00
Kelson
a9f8364333 Merge pull request #206 from kiwix/update_readme
Updated README
2018-06-24 16:18:49 +02:00
Emmanuel Engelhart
9f06c9c5eb Updated README 2018-06-24 16:08:56 +02:00
Matthieu Gautier
0efbb2461d Merge pull request #203 from kiwix/version_0.6.0
New version 0.6.0
2018-06-15 19:29:59 +02:00
Matthieu Gautier
b251e18af1 New version 0.6.0 2018-06-15 18:34:09 +02:00
Matthieu Gautier
5c040d3ee6 Merge pull request #200 from kiwix/improved_kiwix_serve_taskbar
Improved taskbar #160 #59
2018-06-15 18:32:06 +02:00
Matthieu Gautier
bb1afb5120 Also set magnify glass in the global taskbar. 2018-06-15 18:28:04 +02:00
Kelson
8fccbc4c99 Improved taskbar #160 #59 2018-06-15 18:08:48 +02:00
Matthieu Gautier
d0dc9ac81b Merge pull request #202 from kiwix/gcc4.8
[TRAVIS] Compile using default gcc (4.8)
2018-06-15 18:03:49 +02:00
Matthieu Gautier
f9edd75f6c [TRAVIS] Compile using default gcc (4.8) 2018-06-15 08:50:13 +02:00
Matthieu Gautier
9571148375 Merge pull request #201 from kiwix/compile_gcc4.8
Compile gcc4.8
2018-06-14 18:20:19 +02:00
Matthieu Gautier
282b85c341 Do not use std::sto[fi] or std::to_string. 2018-06-14 18:01:15 +02:00
Matthieu Gautier
4c3acd06de Add missing include.
Needed by printf.
2018-06-14 17:35:40 +02:00
Kelson
4cd9d78d21 Merge pull request #199 from kiwix/kiwix_server_404
return 404 for missing resources
2018-06-09 16:21:17 +02:00
Philip Munaawa
efd4a1434e return 404 for missing resources 2018-06-09 15:29:40 +02:00
Matthieu Gautier
dfc601dacf Merge pull request #196 from kiwix/no_install
Remove kiwix-install tool.
2018-05-21 12:18:30 +02:00
Matthieu Gautier
7c254544ca Remove kiwix-install tool.
Fix #189
2018-05-21 12:09:13 +02:00
Kelson
b22ee94f10 Merge pull request #195 from kiwix/proper_exit_code
Proper exit code
2018-05-20 08:34:41 +02:00
Kelson
3766c4882b Proper exit code #194 2018-05-19 20:59:18 +02:00
Matthieu Gautier
26da54f9c3 Merge pull request #187 from swiftugandan/kiwix_serve-fix-global_page_static_resources-1
fix static resources on home page when using --nosearchbar
2018-04-24 14:16:12 +02:00
Philip Munaawa
4433421c48 also replace __CONTENT_ESCAPED__ for --nosearchbar 2018-04-24 13:06:46 +01:00
Philip Munaawa
c00f0be7ef fix static resources on home page when using --nosearchbar 2018-04-24 11:29:41 +01:00
Matthieu Gautier
773b9e5443 Merge pull request #185 from kiwix/0.5.0
0.5.0
2018-04-23 20:49:57 +02:00
Matthieu Gautier
fbddabb10f New version 0.5.0 2018-04-23 19:22:18 +02:00
Matthieu Gautier
3ad50ccf17 Update depenedency version of kiwix-lib. 2018-04-23 19:22:06 +02:00
Matthieu Gautier
c265eb8b24 Merge pull request #182 from kiwix/new_api
Update kiwix-serve to the new kiwix-lib API.
2018-04-23 18:42:52 +02:00
Matthieu Gautier
6f49e78eb4 Update kiwix-serve to the new kiwix-lib API.
Related to kiwix/kiwix-lib#123
2018-04-23 15:26:24 +02:00
Matthieu Gautier
d25329ecb4 Merge pull request #178 from kiwix/opds
Opds
2018-04-23 15:24:15 +02:00
Matthieu Gautier
bd8d0c3805 Get the dependencies archive using the correct new name scheme.
Now that we are compiling to ios, deendencies archive names have
TRAVIS_OS_NAME included.
2018-04-23 10:31:22 +02:00
Matthieu Gautier
a01906d273 [manage] Move handling of action in separated function. 2018-04-19 18:05:41 +02:00
Matthieu Gautier
4bd18ce466 Add open search support to search in the catalog. 2018-04-19 18:05:41 +02:00
Matthieu Gautier
fb8c14a1e4 Make kiwix-serve serve an opds stream of all zims. 2018-04-19 18:05:41 +02:00
Matthieu Gautier
2acd276753 [KIWIX-SERVE] Serve a zim metadata on the '/meta' url.
This can be used to get some metadata about a zim with a simple http
request.
2018-04-19 18:05:41 +02:00
Matthieu Gautier
53b2dadfce Compile without warning. 2018-04-19 18:05:41 +02:00
Matthieu Gautier
eccf5e194c Merge pull request #177 from kiwix/rpath
Set rpath of the installed binaries.
2018-04-17 17:14:53 +02:00
Matthieu Gautier
8356277562 Set rpath of the installed binaries.
Let's set RPATH of installed binaries, this way, we will be able to
run dynamically linked binaries without changing LD_LIBRARY_PATH.
2018-04-17 16:29:41 +02:00
Matthieu Gautier
c6ace1eafc Merge pull request #171 from kiwix/new_version
New version 0.4.0
2018-03-27 12:03:21 +02:00
Matthieu Gautier
8552985cd4 New version 0.4.0 2018-03-27 11:20:21 +02:00
Matthieu Gautier
9997a6ec18 Merge pull request #169 from kiwix/infinit_redirect
Correctly pre-increment the loopCounter.
2018-03-26 10:04:28 +02:00
Matthieu Gautier
8b6abc0e35 Correctly pre-increment the loopCounter.
In case of infinit redirection, if we post-increment the loop counter,
we will exit the loop when loopCounter will be 42 and increment it.
So loop counter will be 43.

Let's pre-increment the counter to still compare with 42 (more consistancy)

Fix #168
2018-03-25 17:07:38 +02:00
Kelson
426796dc37 Merge pull request #135 from kiwix/search_suggestions
Update usage() with --suggestion
2017-12-20 19:54:22 +01:00
kelson42
712cdf5e7b Update usage() with --suggestion 2017-12-20 19:07:38 +01:00
Matthieu Gautier
74cc1d0708 Merge pull request #133 from kiwix/better_search_tool
Better search tool
2017-12-19 15:24:29 +01:00
Matthieu Gautier
3ce668af66 Add a suggestion option to search in suggestion.
There are two kinds of search system :
- Suggestion (search in title only)
- "Classical" search (search in whole content)

The option `--suggestion` allow `kiwix-search` to search for suggestion.
Without the option, a "classical" search is made.

Fix #132.
2017-12-19 14:17:15 +01:00
Matthieu Gautier
2b69cc8ffc Pass verboseFlag to underlying kiwix::Searcher. 2017-12-19 14:13:36 +01:00
Matthieu Gautier
71ffaaa05a Merge pull request #127 from kiwix/compilation_fixes
Compilation fixes
2017-12-13 16:26:57 +00:00
Matthieu Gautier
f3fb5d61cc Use correct option to compile a static binary in travis.
We must use custom option `static-linkage` instead of meson's
`default-library`.
2017-12-13 17:17:28 +01:00
Matthieu Gautier
05c63536de Force usage of meson 0.43.0.
Static compilation is broken with meson 0.44.0.
2017-12-13 16:43:42 +01:00
Matthieu Gautier
16e12ad463 Stop workaround xapian-core.pc
`xapian-core.pc` is now correct stop workaround it adding extra
link args.
The workaround is broken with meson 0.44.0 and static compilation.

However, libmicrohttpd is using `librt` if present but doesn't declare
it in its `libmicrohttpd.pc` file so we must add it manually if we found
it.
2017-12-13 16:43:08 +01:00
Matthieu Gautier
c91285fc29 Merge pull request #123 from kiwix/fix_crash
Fix crash
2017-12-04 16:04:08 +00:00
Matthieu Gautier
5c11ff1a30 Correctly cast to int in debug message.
A `class enum` is not implicitly cast to an `int`.
It is better to explicitly cast it to avoid future error with different
versions of compiler.
2017-12-04 15:12:27 +00:00
Matthieu Gautier
9eaf512bf9 Correctly handle NULL string for request arguments.
When iterating over arguments of a request, the value can be a null pointer
if the argument is provided without a `=`.
https://www.gnu.org/software/libmicrohttpd/manual/html_node/microhttpd_002drequests.html

We have to handle this correctly.

Should fix #116.
2017-12-04 15:10:45 +00:00
Matthieu Gautier
9a29874f9f Better verbose message.
The parsing of the request in the `RequestContext` constructor may be
buggy and make kiwix-serve crash.

If we print debug information only after the request is parsed, we will
never print the debug information if the parsing crash.

It is better to, at least, write that we've got a new request to avoid
us to try to debug previous request where everything were ok.
2017-12-04 15:08:18 +00:00
Matthieu Gautier
aa9647e88c Merge pull request #122 from kiwix/gcc5
Compile using gcc-5 on native ubuntu.
2017-12-04 12:29:59 +00:00
Matthieu Gautier
da0c697963 Compile using gcc-5 on native ubuntu.
As dependencies prepared by kiwix-build are build using gcc-5
(kiwix/kiwix-build@7fc557d), we need to also compile libzim using gcc-5.
2017-12-04 11:15:50 +00:00
Matthieu Gautier
77d25686cb Merge pull request #115 from kiwix/better_search_handling
Better search handling
2017-11-29 16:21:45 +00:00
Matthieu Gautier
3df2fa708b Set the global humanReadableId.
This is needed by kiwix-lib to generate correct "next page" links.
2017-11-27 12:45:41 +00:00
Matthieu Gautier
9021f87715 Handle search with no content and empty query string.
We need to handle :

 - No content because it is how we do multisearch.
 - No query string because it is how we can do geosearch.
2017-11-27 12:44:25 +00:00
Matthieu Gautier
04b05b7902 Merge pull request #111 from kiwix/better_request_parsing
Better request parsing
2017-11-27 11:39:10 +00:00
Matthieu Gautier
a8e73aab98 Move the request context out of kiwix-serve.cpp.
RequestContext is now a "complex" class that handle a lot of thing for
the handlers :
- The rootLocation is correctly handle and remove from the url.
  So a handler doesn't have to care about it (when parsing the url)
- Request arguments and header are stored in a map and there are access
  methods to get it.
- Request arguments can be automatically convert to other type than string.
- Better parsing of the `byte` header. Related to #91.
2017-11-27 11:20:02 +00:00
Matthieu Gautier
234a9d9719 Let the different handlers look for the reader/searcher.
It is to the handlers to get the right reader/searcher they want and
create correct error/default page if the name doesn't correspond to a
zim file.

The `handle_default` function has also be renamed to `build_homepage`
because it is what is done. (And it doesn't handle a request).
2017-11-22 16:16:54 +00:00
Matthieu Gautier
c93617473d Move some variable out of the request's context.
`humanReadableBookId`, `reader` and `searcher` are not so global that
it seems.

Let's move it out of the request object as handler may or not use them.
2017-11-22 15:53:34 +00:00
Matthieu Gautier
09e2039aff Rename variable request_context to request. 2017-11-22 15:47:23 +00:00
Matthieu Gautier
5c6a1870b9 Merge pull request #107 from kiwix/geo_loc
Add a small (private) support for geo query.
2017-11-22 12:46:47 +01:00
Matthieu Gautier
4fffaf41b6 Add a small (private) support for geo query.
This use the small API of kiwix-lib and so, cannot search a text query
and filter around a geo position in the same time.

There is no way to do a search but than write directly the search url
by hand.

If the request is wrongly formatted, the search is simply not done without
error message.
2017-11-14 17:42:01 +01:00
Matthieu Gautier
05c734fc31 Merge pull request #104 from kiwix/library_relative_path
Relative paths are relative to current directory not executable.
2017-11-13 15:14:42 +01:00
Matthieu Gautier
fa9b027a39 Relative paths are relative to current directory not executable.
Almost nothing should be relative to the executable directory.
Content coming from the user should be relative to where the user
is (its working directory).

Fixes #70.
2017-11-13 14:42:52 +01:00
Matthieu Gautier
1fcc1ad9d4 Merge pull request #98 from kiwix/http_byte_range_fix
Fix HTTP request byte range handling #91
2017-11-13 14:42:16 +01:00
kelson42
5fd8dd3c36 Fix HTTP request byte range handling #91 2017-11-13 12:01:45 +01:00
Matthieu Gautier
f03ed85972 Merge pull request #87 from swiftugandan/master
do not cache results for searches from the welcome page
2017-11-09 15:48:15 +01:00
Philip Munaawa
52308b764d do not cache results for searches from the welcome page 2017-11-09 14:24:03 +00:00
Kelson
03bac00019 Merge pull request #99 from kiwix/dattaz-patch_issue_19_good
Dattaz patch issue 19 good
2017-11-08 20:19:57 +01:00
kelson42
905b83b3b1 Small beautification of the code 2017-11-08 20:11:55 +01:00
dattaz
894ed12f37 escape the & character of humanReadableBookId to not be interpreted in urls as a new argument 2017-11-08 19:50:23 +01:00
Kelson
573b826861 Merge pull request #62 from kiwix/julianharty-patch-1
Update kiwix-serve.cpp
2017-11-07 20:01:28 +01:00
Julian Harty
8051773124 Fixed a typo in an error message 2017-11-07 19:10:23 +01:00
Matthieu Gautier
69dd6cd869 Merge pull request #94 from kiwix/man_cleaning
Remove kiwix-index and kiiwx-compact man pages
2017-11-06 15:45:11 +01:00
kelson42
8d32bfd16e Remove kiwix-index and kiiwx-compact man pages 2017-11-06 15:31:06 +01:00
Matthieu Gautier
b1d2a1378b Merge pull request #90 from kiwix/new_release
Release of kiwix-tools 0.3.0.
2017-10-24 11:29:34 +02:00
Matthieu Gautier
df7d44128c Release of kiwix-tools 0.3.0. 2017-10-23 11:40:00 +02:00
Matthieu Gautier
ee5333bb91 Merge pull request #86 from kiwix/swiftugandan_root
Swiftugandan root
2017-10-17 16:21:04 +02:00
Philip Munaawa
871d8f4a51 disable caching for the welcome page 2017-10-17 15:46:55 +02:00
Philip Munaawa
9280d519f5 Adding support for relative url location 2017-10-17 15:46:11 +02:00
Matthieu Gautier
540fcd3be9 Merge pull request #84 from kiwix/byte_range
Byte range
2017-10-11 17:14:01 +02:00
Matthieu Gautier
ad7238b0c9 Stop refusing the first connection.
I don't know why we are refusing the first connection.

It seems to work without this.
Moreover, this is not thread safe and it would be pretty complex to
make it thread safe.
2017-10-11 17:00:55 +02:00
Matthieu Gautier
b5c91417ff Better debug information of each request. 2017-10-11 17:00:55 +02:00
Matthieu Gautier
b638df81fa Implement response to bytes range request.
Handle bytes range request http header.
Do not read the full buffer but try to stream it as far as possible.
2017-10-11 17:00:55 +02:00
Matthieu Gautier
58f0a716a6 Correctly return 404 if asked skin is not existing.
Fix #83
2017-10-10 17:02:15 +02:00
Matthieu Gautier
a2324b5e8b Use a structure RequestContext to pass all the context of a request.
This simplifies the code and avoid to pass a lot of arguments to
each function.
2017-10-10 16:59:45 +02:00
Matthieu Gautier
c2ac40d4f5 Merge pull request #82 from kiwix/multi_thread
Make kiwix-server multi-threaded.
2017-10-10 14:43:50 +02:00
Matthieu Gautier
4534b51f5e Use printf instead of cout.
`std::cout` stream is not thread safe at all.
Printing from different threads can lead to corrupted stream (and no
output working).

Using `printf` may still lead to interleaved output but nothing will broke.
2017-10-10 14:39:42 +02:00
Matthieu Gautier
0364951f75 Make kiwix-server multi-threaded. 2017-10-03 16:35:03 +02:00
Matthieu Gautier
a2627e81c4 Merge pull request #78 from kiwix/patch-1
Look for renamed kiwix-compile-resources script as well
2017-09-27 19:15:57 +02:00
Kunal Mehta
cd72a2d73c Look for renamed kiwix-compile-resources script as well
See https://github.com/kiwix/kiwix-lib/pull/76
2017-09-27 19:10:57 +02:00
Matthieu Gautier
fa3f33d3c7 Use sudo to install pip dependencies in travis 2017-09-27 19:03:11 +02:00
Matthieu Gautier
a210cb3a4b Merge pull request #68 from kiwix/css_taskbar
Css taskbar
2017-08-15 15:51:09 -04:00
Matthieu Gautier
63cb47247b Serve the taskbar css as separated file.
For firefox, the file encoding must be specified in the first 1024 bytes.
If it is not, firefox will reload the page when it founds it.

By inserting the taskbar's css directly in the html, we are "moving" down
the encoding of the page, and the encoding is not inside the first 1024
bytes.

This also improve a bit the performance as the browser can cache the css
file and it's avoid us to send the css in earch html file.
2017-08-15 15:15:26 -04:00
Matthieu Gautier
3220ee1276 Move <link> tag in <head> tag.
In html, the link tag should be in head tag, not in the body tag.
2017-08-15 15:08:56 -04:00
Matthieu Gautier
4a1b9cbfa9 Merge pull request #67 from kiwix/no_globalsearch_on_zim
Do not do globalSearch if the zim file has no full text index.
2017-08-15 14:54:35 -04:00
Matthieu Gautier
f2b5904221 Do not do globalSearch if the zim file has no full text index.
Global search is made only on the global task bar.
Task bar display in the article should provide full text search only
if the zim file has associated full text index.

This is done by having a `NULL` searcher. However, commit `558a0375`
return the globalSearcher if no searcher is associated to a zim.

This commit associate a `NULL` searcher to the zim, so we will not use
the globalSearcher.
2017-08-13 11:35:57 -04:00
Matthieu Gautier
f44722fbbc Merge pull request #64 from kiwix/fix_protocol
Correctly set ProtocolPrefix and SearchProtocolPrefix for searcher.
2017-08-11 00:44:28 -04:00
Matthieu Gautier
0cfcc59437 Update to new kiwix-lib API about Searcher instantiation.
`kiwix-lib` remove `setContentHumanReadableId` method in favour of
specifying directly it in the constructor.
2017-08-10 09:45:08 -04:00
Matthieu Gautier
7776eafbfc Correctly set ProtocolPrefix and SearchProtocolPrefix for searcher.
Default `protocolPrefix` for the kiwix-lib searcher is `zim:://`.
We have to change it to `/` for all searcher we create else the search's
results will have a `zim://...` url, which will obviously won't work.
2017-08-09 20:20:56 -04:00
Matthieu Gautier
5989146931 Merge pull request #49 from kiwix/globalSearch
Global search
2017-07-19 09:54:31 +02:00
Matthieu Gautier
ea088b21a4 Introduce a global taskbar on the welcomeHTML page to allow global search.
Global search is a search on all zims.
2017-07-17 18:24:27 +02:00
Matthieu Gautier
558a0375b0 Use a globalSearcher to do multi search on all zims. 2017-07-17 18:23:12 +02:00
Matthieu Gautier
5f0a05e8d8 Add a global_taskbar.html.part file to be use as taskbar in library home.
This is a simplified version of taskbar.html.part without the buttons
(specific to the current read zim)
2017-07-17 18:20:55 +02:00
Matthieu Gautier
4b9dc39c49 Use only one lock to acces zim library.
Search can now use reader. So there is no need to have to different locks.
2017-07-17 18:17:33 +02:00
Matthieu Gautier
08f2373360 Merge pull request #48 from kiwix/no_use_of_tree_h
Remove use of tree.h
2017-07-12 14:45:38 +02:00
Matthieu Gautier
82fb6bc4d0 Remove use of tree.h
All code using tree.h where commented.
As tree.h where install by kiwix-lib and we removed it there, let's remove
its use here.
2017-07-12 10:28:40 +02:00
Matthieu Gautier
17eceeff5b Merge pull request #46 from kiwix/format_code
Format code
2017-07-12 10:06:46 +02:00
Matthieu Gautier
aef20d6c96 Move to C++11.
Code and kiwix-lib are C++11. So compile using C++11.
2017-07-12 10:01:25 +02:00
Matthieu Gautier
4e3ff03059 Format all the code using clang-format.
Add a script `format_code.sh` to easily format the code.
2017-07-05 15:52:32 +02:00
41 changed files with 1791 additions and 1364 deletions

12
.clang-format Normal file
View File

@@ -0,0 +1,12 @@
BasedOnStyle: Google
BinPackArguments: false
BinPackParameters: false
BreakBeforeBinaryOperators: All
BreakBeforeBraces: Linux
DerivePointerAlignment: false
SpacesInContainerLiterals: false
Standard: Cpp11
AllowShortFunctionsOnASingleLine: Inline
AllowShortIfStatementsOnASingleLine: false
AllowShortLoopsOnASingleLine: false

View File

@@ -5,7 +5,8 @@ cache: ccache
install: travis/install_deps.sh
script: travis/compile.sh
env:
- PLATFORM="native_static"
- PLATFORM="native_dyn"
- PLATFORM="win32_static"
- PLATFORM="win32_dyn"
matrix:
- PLATFORM="native_static"
- PLATFORM="native_dyn"
- PLATFORM="win32_static"
- PLATFORM="win32_dyn"

113
Changelog
View File

@@ -1,10 +1,121 @@
kiwix-tools 0.7.0
=================
* Adapt to kiwix-lib new API
kiwix-serve
-----------
* Dumps only valid books in the opdsfeed.
* Allow the opds feed to be filtered by lang and paginated.
kiwix-manage
------------
* Add a download command to download a remote book locally
* Book are referenced by bookId not index.
* No more indexType option as it is always XAPIAN.
kiwix-tools 0.6.1
=================
kiwix-serve
-----------
* Update README.
* Fix crash when `--library` flag is provided without value.
* Correctly handle mimetype of file without extension on 64bits.
* Minor fixes
kiwix-tools 0.6.0
=================
* remove kiwix-install tool.
kiwix-serve
-----------
* Improved taskbar #160
* Fix global page when using the option `--nosearchbar`
* Return 404 for missing resources
* Fix compilation for gcc 4.8.
kiwix-manage
------------
* Returns proper exit code (not always 0)
kiwix-tools 0.5.0
=================
* Build kiwix-tools setting the RPATH
* Compile without warning.
kiwix-serve
------------
* Serve metadata information using the "/meta" url.
* Serve an OPDS stream of all zim handled by kiwix-serve
All informations cannot be infer from the zim file itself,
you should use a library.xml to provide needed information (url, ...)
* Update kiwix-serve to use the new API of kiwix-lib
kiwix-tools 0.4.0
=================
* Use gcc-5 on travis.
kiwix-serve
-----------
* Accept zim file with `&` in the name
* Do not cache (on client side) global search (as it can depends on the zim
files handled)
* Fix HTTP byte range handling. (#91)
* Fix opening of relative path (#70)
* Add a small (and hidden) API to do geo search.
* Better request parsing. (#91)
* Better handling of invalid request (#116)
* Various bug fixes (#146, #150, #153, #165, #168, #165)
kiwix-search
------------
* Add an option `--suggestion` to do suggestion search with
kiwix-search.(#132)
kiwix-tools 0.3.0
=================
* Move to C++11
kiwix-serve
-----------
* Add a global taskbar in the welcome page to search in all zims (#49)
* Serve the taskbar as css file instead of including it in the html (#68):
* Better client caching
* The html encoding is now in the first 1024 bytes and firefox correctly
detect the encoding
* Make kiwix-server multi-threaded (#82)
* Correctly return 404 instead of crashing when request inexistant skin file
(#83)
* Correctly respond to bytes-range requests.(#84)
* Directly respond to first request for a url instead of refusing the first
connexion
* Add support to relative url location. (#86)
* Remove caching (on client side) for the welcome page. (#86)
kiwix-tools 0.2.0
=================
* Remove indexer tools
kiwix-serve
----------
-----------
* Correctly fix the deflate data we send over http. (#15)
* Update in the taskbar (or topbar):

100
README.md
View File

@@ -1,14 +1,14 @@
Kiwix tools
===========
The Kiwix tools gathers kiwix command line tools.
The Kiwix tools is a collection of Kiwix related command line tools.
Disclaimer
----------
This document assumes you have a little knowledge about software
compilation. If you experience difficulties with the dependencies or
with the Kiwix libary compilation itself, we recommend to have a look
with the Kiwix tools compilation itself, we recommend to have a look
to [kiwix-build](https://github.com/kiwix/kiwix-build).
Preamble
@@ -22,12 +22,12 @@ on recent releases of Ubuntu and Fedora.
Dependencies
------------
The Kiwix tools rely on a few third parts software libraries. They
are prerequisites to the Kiwix library compilation. Following
The Kiwix tools rely on a few third party software libraries. They are
prerequisites to the Kiwix tools compilation. Therefore, following
libraries need to be available:
* Kiwix lib ....................... https://github.com/kiwix/kiwix-lib
(no package for now)
(no package so far)
* Libmicrohttpd .......... https://www.gnu.org/software/libmicrohttpd/
(package libmicrohttpd-dev on Ubuntu)
* CTPP2 ..................................... http://ctpp.havoc.ru/en/
@@ -53,47 +53,26 @@ If you compile manually Libmicrohttpd, you might need to compile it
without GNU TLS, a bug here will empeach further compilation of Kiwix
tools otherwise.
Environnement
Environment
-------------
The Kiwix library builds using [Meson](http://mesonbuild.com/) version
0.34 or higher. Meson relies itself on Ninja, pkg-config and few other
compilation tools.
Install first the few common compilation tools:
* Automake
* Libtool
* Virtualenv
The Kiwix tools build using [Meson](http://mesonbuild.com/) version
0.39 or higher. Meson relies itself on Ninja, pkg-config and few other
compilation tools. Install them first:
* Meson
* Ninja
* Pkg-config
Then install Meson itself:
```
virtualenv -p python3 ./ # Create virtualenv
source bin/activate # Activate the virtualenv
pip install meson # Install Meson
hash -r # Refresh bash paths
```
Finally download and build Ninja locally:
```
git clone git://github.com/ninja-build/ninja.git
cd ninja
git checkout release
./configure.py --bootstrap
mkdir ../bin
cp ninja ../bin
cd ..
```
These tools should be packaged if you use a cutting edge operating
system. If not, have a look to the "Troubleshooting" section.
Compilation
-----------
Once all dependencies are installed, you can compile kiwix-lib with:
Once all dependencies are installed, you can compile Kiwix tools with:
```
mkdir build
meson . build
cd build
ninja
ninja -C build
```
By default, it will compile dynamic linked libraries. If you want
@@ -105,16 +84,55 @@ Depending of you system, `ninja` may be called `ninja-build`.
Installation
------------
If you want to install the Kiwix tools you just have compiled on your
system, here we go:
If you want to install the Kiwix tools, here we go:
```
ninja install
ninja -C build install
```
You might need to run the command as root (or using 'sudo'), depending
where you want to install the Kiwix tools. After the installation
succeeded, you may need to run ldconfig (as root).
Uninstallation
------------
If you want to uninstall the Kiwix tools:
```
ninja -C build uninstall
```
Like for the installation, you might need to run the command as root
(or using 'sudo').
Troubleshooting
---------------
If you need to install Meson "manually":
```
virtualenv -p python3 ./ # Create virtualenv
source bin/activate # Activate the virtualenv
pip3 install meson # Install Meson
hash -r # Refresh bash paths
```
If you need to install Ninja "manually":
```
git clone git://github.com/ninja-build/ninja.git
cd ninja
git checkout release
./configure.py --bootstrap
mkdir ../bin
cp ninja ../bin
cd ..
```
You might need to run the command as root, depending where you want to
install the libraries.
If the compilation still fails, you might need to get a more recent
version of a dependency than the one packaged by your Linux
distribution. Try then with a source tarball distributed by the
problematic upstream project or even directly from the source code
repository.
License
-------

15
format_code.sh Executable file
View File

@@ -0,0 +1,15 @@
#!/usr/bin/bash
files=(
"src/installer/kiwix-install.cpp"
"src/searcher/kiwix-search.cpp"
"src/reader/kiwix-read.cpp"
"src/manager/kiwix-manage.cpp"
"src/server/kiwix-serve.cpp"
)
for i in "${files[@]}"
do
echo $i
clang-format -i -style=file $i
done

View File

@@ -1,6 +1,7 @@
project('kiwix-tools', 'cpp',
version : '0.2.0',
license : 'GPL')
version : '0.7.0',
license : 'GPL',
default_options: ['c_std=c11', 'cpp_std=c++11', 'werror=true'])
compiler = meson.get_compiler('cpp')
@@ -10,26 +11,18 @@ if static_linkage
endif
thread_dep = dependency('threads')
kiwixlib_dep = dependency('kiwix', static:static_linkage)
kiwixlib_dep = dependency('kiwix', version:'>=3.0.0', static:static_linkage)
microhttpd_dep = dependency('libmicrohttpd', static:static_linkage)
z_dep = dependency('zlib', static:static_linkage)
# This is a temporary workaround until xapian fix it's xapian-core.pc
# For a correct dependency checking we should test if uuid is really installed
# but for a workaround, we assume that in xapian is installed, uuid also.
if meson.is_cross_build() and host_machine.system() == 'windows'
# xapian doesn't use uuid on windows.
uuid_dep = declare_dependency()
else
xapian_dep = dependency('xapian-core', required : false)
if xapian_dep.found()
uuid_dep = declare_dependency(link_args:['-luuid', '-lrt'])
else
uuid_dep = declare_dependency()
endif
endif
all_deps = [thread_dep, kiwixlib_dep, microhttpd_dep, z_dep]
all_deps = [thread_dep, kiwixlib_dep, microhttpd_dep, z_dep, uuid_dep]
if static_linkage
librt = compiler.find_library('rt', required:false)
if librt.found()
all_deps += librt
endif
endif
#subdir('include')
subdir('static')

View File

@@ -1,155 +0,0 @@
/*
* Copyright 2011-2014 Emmanuel Engelhart <kelson@kiwix.org>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or
* any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
* MA 02110-1301, USA.
*/
#include <getopt.h>
#include <kiwix/common/pathTools.h>
#include <kiwix/reader.h>
#include <kiwix/manager.h>
enum supportedAction { NONE, ADDCONTENT };
void usage() {
cout << "Usage: kiwix-install [--verbose] addcontent ZIM_PATH KIWIX_PATH" << endl;
exit(1);
}
int main(int argc, char **argv) {
/* Init the variables */
const char *contentPath = NULL;
const char *kiwixPath = NULL;
supportedAction action = NONE;
bool verboseFlag = false;
int option_index = 0;
int c = 0;
/* Argument parsing */
while (42) {
static struct option long_options[] = {
{"verbose", no_argument, 0, 'v'},
{0, 0, 0, 0}
};
if (c != -1) {
c = getopt_long(argc, argv, "vi", long_options, &option_index);
switch (c) {
case 'v':
verboseFlag = true;
break;
}
} else {
if (optind < argc) {
if (action == NONE) {
string actionString = argv[optind++];
if (actionString == "addcontent" || actionString == "ADDCONTENT") {
action = ADDCONTENT;
}
} else if (contentPath == NULL) {
contentPath = argv[optind++];
} else if (kiwixPath == NULL) {
kiwixPath = argv[optind++];
} else {
usage();
}
} else {
break;
}
}
}
/* Check if we have enough arguments */
if (contentPath == NULL || kiwixPath == NULL) {
usage();
}
/* Make the action */
if (action == ADDCONTENT) {
/* Check if the content path exists and is readable */
if (verboseFlag) { std::cout << "Check if the ZIM file exists..." << std::endl; }
if (!fileExists(contentPath)) {
cerr << "The content path '" << contentPath << "' does not exist or is not readable." << endl;
exit(1);
}
/* Check if this is a ZIM file */
try {
if (verboseFlag) { std::cout << "Check if the ZIM file is valid..." << std::endl; }
kiwix::Reader *reader = new kiwix::Reader(contentPath);
delete reader;
} catch (exception &e) {
cerr << "The content available at '" << contentPath << "' is not a ZIM file." << endl;
exit(1);
}
string contentFilename = getLastPathElement(contentPath);
/* Check if kiwixPath/kiwix/kiwix.exe exists */
if (verboseFlag) { std::cout << "Check if the Kiwix path is valid..." << std::endl; }
string kiwixBinaryPath = computeAbsolutePath(kiwixPath, "kiwix/kiwix.exe");
if (!fileExists(kiwixBinaryPath)) {
kiwixBinaryPath = computeAbsolutePath(kiwixPath, "kiwix/kiwix");
if (!fileExists(kiwixBinaryPath)) {
cerr << "Unable to find the Kiwix binary at '" << kiwixBinaryPath << "[.exe]'." << endl;
exit(1);
}
}
/* Check if the directory "data" structure exists */
if (verboseFlag) { std::cout << "Check the target data directory structure..." << std::endl; }
string dataPath = computeAbsolutePath(kiwixPath, "data/");
if (!fileExists(dataPath)) {
makeDirectory(dataPath);
}
/* Check if the directory "data/content" structure exists */
string dataContentPath = computeAbsolutePath(kiwixPath, "data/content/");
if (!fileExists(dataContentPath)) {
makeDirectory(dataContentPath);
}
/* Check if the directory "data/library" structure exists */
string dataLibraryPath = computeAbsolutePath(kiwixPath, "data/library/");
if (!fileExists(dataLibraryPath)) {
makeDirectory(dataLibraryPath);
}
/* Copy the file to the data/content directory */
if (verboseFlag) { std::cout << "Copy ZIM file to the target directory..." << std::endl; }
string newContentPath = computeAbsolutePath(dataContentPath, contentFilename);
if (!fileExists(newContentPath) || getFileSize(contentPath) != getFileSize(newContentPath)) {
copyFile(contentPath, newContentPath);
}
/* Add the file to the library.xml */
if (verboseFlag) { std::cout << "Create the library XML file..." << std::endl; }
kiwix::Manager libraryManager;
string libraryPath = computeAbsolutePath(dataLibraryPath, contentFilename + ".xml");
string bookId = libraryManager.addBookFromPathAndGetId(newContentPath, "../content/" + contentFilename, "", false);
if (!bookId.empty()) {
libraryManager.setCurrentBookId(bookId);
libraryManager.writeFile(libraryPath);
} else {
cerr << "Unable to build or save library file '" << libraryPath << "'" << endl;
}
}
exit(0);
}

View File

@@ -1,3 +0,0 @@
executable('kiwix-install', ['kiwix-install.cpp'],
dependencies:all_deps,
install:true)

View File

@@ -1,23 +0,0 @@
.TH KIWIX 1 "21 May 2012"
.SH NAME
kiwix-compact \- Compacteur d'index pour fichier ZIM
.SH SYNOPSIS
.IX Header SYNOPSIS
kiwix-compact INDEX_PATH
.SH DESCRIPTION
.PP
Compacte les fichiers d'index des ZIM à l'aide de xapian-compact.
.TP
\fBINDEX_PATH\fR
Chemin de l'index plein texte à compacter.
.SH SEE ALSO
kiwix(1) kiwix-index(1) kiwix-manage(1) xapian-compact(1)
.br
kiwix-install(1) kiwix-serve(1)
.SH AUTHOR
Emmanuel Engelhart <kelson@kiwix.org>
.br
Vasudev Kamath <kamathvasudev@gmail.com> (Manual)

View File

@@ -1,31 +0,0 @@
.TH KIWIX 1 "21 May 2012"
.SH NAME
kiwix\-index \- Indexeur de fichiers ZIM
.SH SYNOPSIS
.IX Header SYNOPSIS
kiwix\-index [\-\-backend|\-b=xapian|clucene] ZIM_PATH INDEX_PATH
.SH DESCRIPTION
.PP
Génère un index plein texte xapian ou cLucene pour un fichier ZIM.
.TP
\fB\-\-backend=xapian|clucene\fR
Séléctionne un moteur d'indexation.
.TP
\fBZIM_PATH\fR
Chemin du fichier ZIM à indexer.
.TP
\fBINDEX_PATH\fR
Chemin où enregistrer l'index plein texte.
.SH SEE ALSO
kiwix\-compact(1) kiwix\-manage(1) kiwix\-serve(1)
.br
kiwix(1) kiwix\-install(1)
.SH AUTHOR
Emmanuel Engelhart <kelson@kiwix.org>
.br
Vasudev Kamath <kamathvasudev@gmail.com> (Manual)

View File

@@ -1,40 +0,0 @@
.TH KIWIX 1 "21 May 2012"
.SH NAME
kiwix\-install \- Installeur de fichiers ZIM
.SH SYNOPSIS
.IX Header SYNOPSIS
kiwix\-install [\-\-verbose|-v] [\-\-backend|\-b=xapian|clucene] [\-\-buildIndex|\-i] addcontent ZIM_PATH KIWIX_PATH
.SH DESCRIPTION
.PP
Créé une arborescence contenant Kiwix et des données pour redistribution.
.br
Si demandé, créé aussi un index plein texte.
.TP
\fB\-\-verbose\fR
Active le mode verbeux de la sortie.
.TP
\fB\-\-backend=xapian|clucene\fR
Séléctionne un moteur d'indexation.
.TP
\fB\-\-buildIndex\fR
Créer un index plein texte pour le fichier ZIM.
.TP
\fBZIM_PATH\fR
Chemin du fichier de contenu ZIM.
.TP
\fBKIWIX_PATH\fR
Chemin d'accès dossier kiwix/.
.br
Le chemin doit contenit le binaire statique de Kiwix.
.SH SEE ALSO
kiwix(1) kiwix\-index(1) kiwix\-serve(1) kiwix\-compact(1) kiwix\-manage(1)
.SH AUTHOR
Emmanuel Engelhart <kelson@kiwix.org>
.br
Vasudev Kamath <kamathvasudev@gmail.com> (Manual)

View File

@@ -57,8 +57,8 @@ Chemin vers l'index plein texte correspondant au fichier ZIM.
Définit l'adresse URL corresponsant au fichier ZIM pour pouvoir être téléchargé depuis Kiwix.
.SH SEE ALSO
kiwix(1) kiwix\-index(1) kiwix\-install(1) kiwix\-serve(1) kiwix\-compact(1)
kiwix(1) kiwix\-install(1) kiwix\-serve(1)
.SH AUTHOR
Emmanuel Engelhart <kelson@kiwix.org>
.br
Vasudev Kamath <kamathvasudev@gmail.com> (Manual)
Vasudev Kamath <kamathvasudev@gmail.com> (Manual)

View File

@@ -52,10 +52,10 @@ Chemin vers le fichier bibliothèque de Kiwix.
Le fichier bibliothèque est un fichier XML créé avec \fBkiwix-manage\fB.
.SH SEE ALSO
kiwix(1) kiwix\-index(1) kiwix\-manage(1)
kiwix(1) kiwix\-manage(1)
.br
kiwix\-install(1) kiwix\-compact(1)
kiwix\-install(1)
.SH AUTHOR
Emmanuel Engelhart <kelson@kiwix.org>
.br
Vasudev Kamath <kamathvasudev@gmail.com> (Manual)
Vasudev Kamath <kamathvasudev@gmail.com> (Manual)

View File

@@ -1,52 +0,0 @@
.TH KIWIX 1 "12 juin 2012"
.SH NAME
Kiwix \- Lecteur hors-ligne de fichiers ZIM
.SH SYNOPSIS
.B kiwix [-jsconsole] [-articleByUrl] [-articleByTitle] [FILE]
.SH DESCRIPTION
.PP
Kiwix est un lecteur de content au format ZIM.
.br
Les fichiers ZIM sont des archives de contenus compressés (généralement HTML)
.br
Les fichiers ZIM les plus populaires sont ceux de Wikipédia et Wikileaks.
.TP
\fB\-jsconsole\fR
Active la console de debogage JavaScript de Xulrunner.
\fB\-articleByUrl url\fR
Ouvre un article en particulier en renseignant son url. FILE doit être donné.
.TP
\fB\-articleByTitle title\fR
Ouvre un article en particulier en renseignant son titre. FILE doit être donné.
.PP
Fonctionnalités:
* Lecteur de ZIM natif
* Moteur de recherche plein texte
* Signets et Notes
* Serveur Web pour diffuser les fichiers ZIM sur le réseau
* Export HTML et PDF
* Traduits dans de nombreuses langues
* Suggestions de recherche
* Indexation des fichiers ZIM
* Onglets de navigation
* Bibliothèque de contenus intégrée
.SH SEE ALSO
kiwix-index(1) kiwix-install(1) kiwix-serve(1)
.br
kiwix-compact(1) kiwix-manage(1)
.SH TROUBLESHOOTING
Aller à http://reportabug.kiwix.org pour plus de détails sur comment rapporter un bogue.
.SH AUTHORS
Emmanuel Engelhart <kelson@kiwix.org>
Guillaume Duhamel <gduhamel@linterweb.com>
Fabien Coullon <fcoulon@linterweb.com>
Renaud Gaudin <rgaudin@gmail.com>
Wilfredo Rodriguez <wilfredor@kiwix.org>
.br
Vasudev Kamath <kamathvasudev@gmail.com> (Manual)

View File

@@ -1,5 +1,3 @@
install_man('kiwix-index.1',
'kiwix-install.1',
'kiwix-manage.1',
install_man('kiwix-manage.1',
'kiwix-serve.1',
install_dir:get_option('mandir')+'/fr/man1')
install_dir:get_option('mandir')+'/fr/man1')

View File

@@ -1,23 +0,0 @@
.TH KIWIX 1 "21 May 2012"
.SH NAME
kiwix-compact \- ZIM index compacter
.SH SYNOPSIS
.IX Header SYNOPSIS
kiwix-compact INDEX_PATH
.SH DESCRIPTION
.PP
Compacts ZIM index files used by Kiwix using xapian-compact
.TP
\fBINDEX_PATH\fR
Full-text index path to compact.
.SH SEE ALSO
kiwix(1) kiwix-index(1) kiwix-manage(1) xapian-compact(1)
.br
kiwix-install(1) kiwix-serve(1)
.SH AUTHOR
Emmanuel Engelhart <kelson@kiwix.org>
.br
Vasudev Kamath <kamathvasudev@gmail.com> (Manual)

View File

@@ -1,31 +0,0 @@
.TH KIWIX 1 "21 May 2012"
.SH NAME
kiwix\-index \- Kiwix ZIM Indexer
.SH SYNOPSIS
.IX Header SYNOPSIS
kiwix\-index [\-\-backend|\-b=xapian|clucene] ZIM_PATH INDEX_PATH
.SH DESCRIPTION
.PP
Generates a xapian or clucene full-text index for a ZIM file.
.TP
\fB\-\-backend=xapian|clucene\fR
Select an indexing backend.
.TP
\fBZIM_PATH\fR
ZIM file path to index.
.TP
\fBINDEX_PATH\fR
Path to save the full\-text index to.
.SH SEE ALSO
kiwix\-compact(1) kiwix\-manage(1) kiwix\-serve(1)
.br
kiwix(1) kiwix\-install(1)
.SH AUTHOR
Emmanuel Engelhart <kelson@kiwix.org>
.br
Vasudev Kamath <kamathvasudev@gmail.com> (Manual)

View File

@@ -1,40 +0,0 @@
.TH KIWIX 1 "21 May 2012"
.SH NAME
kiwix\-install \- Kiwix ZIM Installer
.SH SYNOPSIS
.IX Header SYNOPSIS
kiwix\-install [\-\-verbose|-v] [\-\-backend|\-b=xapian|clucene] [\-\-buildIndex|\-i] addcontent ZIM_PATH KIWIX_PATH
.SH DESCRIPTION
.PP
Creates a standalone Kiwix + data hierarchy.
.br
If specified, also creates a full\-text index.
.TP
\fB\-\-verbose\fR
Enable verbose output.
.TP
\fB\-\-backend=xapian|clucene\fR
Select an indexing backend.
.TP
\fB\-\-buildIndex\fR
Build an index for the ZIM file.
.TP
\fBZIM_PATH\fR
ZIM content file path.
.TP
\fBKIWIX_PATH\fR
Path to the kiwix/ folder.
.br
The path must contain the kiwix standalone binary.
.SH SEE ALSO
kiwix(1) kiwix\-index(1) kiwix\-serve(1) kiwix\-compact(1) kiwix\-manage(1)
.SH AUTHOR
Emmanuel Engelhart <kelson@kiwix.org>
.br
Vasudev Kamath <kamathvasudev@gmail.com> (Manual)

View File

@@ -55,8 +55,8 @@ Path to full-text index for that ZIM file.
Set the content location of the ZIM file over the network for in\-kiwix download.
.SH SEE ALSO
kiwix(1) kiwix\-index(1) kiwix\-install(1) kiwix\-serve(1) kiwix\-compact(1)
kiwix(1) kiwix\-install(1) kiwix\-serve(1)
.SH AUTHOR
Emmanuel Engelhart <kelson@kiwix.org>
.br
Vasudev Kamath <kamathvasudev@gmail.com> (Manual)
Vasudev Kamath <kamathvasudev@gmail.com> (Manual)

View File

@@ -13,7 +13,7 @@ Stand\-alone HTTP server for serving ZIM content over the network.
.TP
\fB\-\-index=INDEX_PATH\fR
Path to index folder created using \fBkiwix-index\fB.
Path to index folder created using \fBkiwix-install\fB.
.TP
\fB\-\-port=PORT\fR
@@ -52,10 +52,10 @@ Kiwix library file path.
Library is XML file created using \fBkiwix-manage\fB.
.SH SEE ALSO
kiwix(1) kiwix\-index(1) kiwix\-manage(1)
kiwix(1) kiwix\-manage(1)
.br
kiwix\-install(1) kiwix\-compact(1)
kiwix\-install(1)
.SH AUTHOR
Emmanuel Engelhart <kelson@kiwix.org>
.br
Vasudev Kamath <kamathvasudev@gmail.com> (Manual)
Vasudev Kamath <kamathvasudev@gmail.com> (Manual)

View File

@@ -1,5 +1,3 @@
install_man('kiwix-index.1',
'kiwix-install.1',
'kiwix-manage.1',
install_man('kiwix-manage.1',
'kiwix-serve.1')
subdir('fr')

View File

@@ -21,53 +21,231 @@
#include <unistd.h>
#endif
#include <getopt.h>
#include <iostream>
#include <cstdlib>
#include <kiwix/common/pathTools.h>
#include <kiwix/common/stringTools.h>
#include <kiwix/manager.h>
#include <kiwix/downloader.h>
#include <cstdlib>
#include <iostream>
#include <thread>
#include <chrono>
using namespace std;
enum supportedAction { NONE, ADD, SHOW, REMOVE };
enum supportedAction { NONE, ADD, SHOW, REMOVE, DOWNLOAD };
void show(kiwix::Library library) {
std::vector<kiwix::Book>::iterator itr;
unsigned int inc = 1;
for ( itr = library.books.begin(); itr != library.books.end(); ++itr ) {
std::cout << "#" << inc++
<< std::endl << "id:\t\t" << itr->id
<< std::endl << "path:\t\t" << itr->path
<< std::endl << "indexpath:\t" << itr->indexPath
<< std::endl << "url:\t\t" << itr->url
<< std::endl << "title:\t\t" << itr->title
<< std::endl << "name:\t\t" << itr->name
<< std::endl << "tags:\t\t" << itr->tags
<< std::endl << "description:\t" << itr->description
<< std::endl << "creator:\t" << itr->creator
<< std::endl << "date:\t\t" << itr->date
<< std::endl << "articleCount:\t" << itr->articleCount
<< std::endl << "mediaCount:\t" << itr->mediaCount
<< std::endl << "size:\t\t" << itr->size << " KB"
<< std::endl << std::endl;
}
void show(kiwix::Library* library)
{
auto booksIds = library->getBooksIds();
unsigned int inc = 1;
for(auto& id: booksIds) {
auto& book = library->getBookById(id);
std::cout << "#" << inc++ << std::endl
<< "id:\t\t" << book.getId() << std::endl
<< "path:\t\t" << book.getPath() << std::endl
<< "indexpath:\t" << book.getIndexPath() << std::endl
<< "url:\t\t" << book.getUrl() << std::endl
<< "title:\t\t" << book.getTitle() << std::endl
<< "name:\t\t" << book.getName() << std::endl
<< "tags:\t\t" << book.getTags() << std::endl
<< "description:\t" << book.getDescription() << std::endl
<< "creator:\t" << book.getCreator() << std::endl
<< "date:\t\t" << book.getDate() << std::endl
<< "articleCount:\t" << book.getArticleCount() << std::endl
<< "mediaCount:\t" << book.getMediaCount() << std::endl
<< "size:\t\t" << book.getSize() << " KB" << std::endl
<< std::endl;
}
}
void usage() {
cerr << "Usage:" << endl;
cerr << "\tkiwix-manage LIBRARY_PATH add ZIM_PATH [--zimPathToSave=../content/foobar.zim] [--current] [--indexBackend=xapian] [--indexPath=FULLTEXT_IDX_PATH] [--url=http://...metalink]" << endl;
cerr << "\tkiwix-manage LIBRARY_PATH show [CONTENTID1] [CONTENTID2] ... (show everything if no param.)" << endl;
cerr << "\tkiwix-manage LIBRARY_PATH remove CONTENTID1 [CONTENTID2]" << endl;
void usage()
{
cerr << "Usage:" << endl;
cerr << "\tkiwix-manage LIBRARY_PATH add ZIM_PATH "
"[--zimPathToSave=../content/foobar.zim] [--current] "
"[--indexBackend=xapian] [--indexPath=FULLTEXT_IDX_PATH] "
"[--url=http://...metalink]"
<< endl;
cerr << "\tkiwix-manage LIBRARY_PATH show [CONTENTID1] [CONTENTID2] ... "
"(show everything if no param.)"
<< endl;
cerr << "\tkiwix-manage LIBRARY_PATH remove CONTENTID1 [CONTENTID2]" << endl;
}
int main(int argc, char **argv) {
string libraryPath = "";
supportedAction action = NONE;
string zimPath = "";
kiwix::Manager libraryManager;
bool handle_show(kiwix::Library* library, const std::string& libraryPath,
int argc, char* argv[])
{
show(library);
return(0);
}
bool handle_add(kiwix::Library* library, const std::string& libraryPath,
int argc, char* argv[])
{
string zimPath;
string zimPathToSave = ".";
string indexPath;
string url;
string origID = "";
int option_index = 0;
int c = 0;
bool resultCode = 0;
if (argc > 3) {
zimPath = argv[3];
}
/* Options parsing */
optind = 2;
while (42) {
static struct option long_options[]
= {{"url", required_argument, 0, 'u'},
{"origId", required_argument, 0, 'o'},
{"indexPath", required_argument, 0, 'i'},
{"zimPathToSave", required_argument, 0, 'z'},
{0, 0, 0, 0}};
c = getopt_long(argc, argv, "cz:u:i:", long_options, &option_index);
if (c != -1) {
switch (c) {
case 'u':
url = optarg;
break;
case 'o':
origID = optarg;
break;
case 'i':
indexPath = optarg;
break;
case 'z':
zimPathToSave = optarg;
break;
}
} else {
break;
}
}
if (!zimPath.empty()) {
kiwix::Manager manager(library);
zimPathToSave = zimPathToSave == "." ? zimPath : zimPathToSave;
string bookId = manager.addBookFromPathAndGetId(
zimPath, zimPathToSave, url, false);
if (!bookId.empty()) {
/* Save the index infos if necessary */
if (!indexPath.empty()) {
if (isRelativePath(indexPath)) {
indexPath = computeAbsolutePath(indexPath, getCurrentDirectory());
}
library->getBookById(bookId).setIndexPath(indexPath);
}
} else {
cerr << "Unable to build or save library file '" << libraryPath << "'"
<< endl;
resultCode = 1;
}
} else {
std::cerr << "Invalid zim file path" << std::endl;
resultCode = 1;
}
return(resultCode);
}
bool handle_remove(kiwix::Library* library, const std::string& libraryPath,
int argc, char* argv[])
{
std::string bookId;
const unsigned int totalBookCount = library->getBookCount(true, true);
bool exitCode = 0;
if (argc > 3) {
bookId = argv[3];
}
if (!library->removeBookById(bookId)) {
if (totalBookCount > 0) {
std::cerr
<< "Invalid book id." << std::endl;
exitCode = 1;
} else {
std::cerr
<< "Invalid book id. Library is empty, no book to delete."
<< std::endl;
exitCode = 1;
}
}
return(exitCode);
}
bool handle_download(kiwix::Library* library, const std::string& libraryPath,
int argc, char* argv[])
{
std::string bookId;
bool exitCode = false;
if (argc > 3) {
bookId = argv[3];
}
auto& book = library->getBookById(bookId);
auto did = book.getDownloadId();
kiwix::Downloader downloader;
kiwix::Download* download = nullptr;
if (!did.empty()) {
std::cout << "try resume " << did << std::endl;
try {
download = downloader.getDownload(did);
} catch(...) {}
}
if (nullptr == download || download->getStatus() == kiwix::Download::K_UNKNOWN) {
download = downloader.startDownload(book.getUrl());
book.setDownloadId(download->getDid());
}
int step = 60*5;
while (step--) {
download->updateStatus();
if (download->getStatus() == kiwix::Download::K_COMPLETE) {
auto followingId = download->getFollowedBy();
if (followingId.empty()) {
book.setPath(download->getPath());
book.setDownloadId("");
std::cout << "File downloaded to " << book.getPath() << std::endl;
break;
} else {
download = downloader.getDownload(followingId);
}
} else if (download->getStatus() == kiwix::Download::K_ACTIVE) {
std::cout << download->getDid() << " : "
<< kiwix::beautifyFileSize(download->getCompletedLength()) << "/"
<< kiwix::beautifyFileSize(download->getTotalLength())
<< " (" << kiwix::beautifyFileSize(download->getDownloadSpeed()) << "/s) "
<< " [" << kiwix::beautifyFileSize(download->getVerifiedLength()) << "]"
<< "[" << step << "] \n" << std::flush;
} else if (download->getStatus() == kiwix::Download::K_ERROR) {
std::cout << "File Error" << std::endl;
exitCode = true;
break;
}
std::this_thread::sleep_for(std::chrono::seconds(1));
}
downloader.close();
return exitCode;
}
int main(int argc, char** argv)
{
string libraryPath = "";
supportedAction action = NONE;
kiwix::Library library;
/* Argument parsing */
if (argc > 2) {
@@ -80,6 +258,8 @@ int main(int argc, char **argv) {
action = SHOW;
else if (actionString == "remove" || actionString == "delete")
action = REMOVE;
else if (actionString == "download")
action = DOWNLOAD;
}
/* Print usage)) if necessary */
@@ -89,123 +269,35 @@ int main(int argc, char **argv) {
}
/* Try to read the file */
libraryPath = isRelativePath(libraryPath) ?
computeAbsolutePath(getCurrentDirectory(), libraryPath) :
libraryPath;
libraryManager.readFile(libraryPath, false);
libraryPath = isRelativePath(libraryPath)
? computeAbsolutePath(getCurrentDirectory(), libraryPath)
: libraryPath;
kiwix::Manager manager(&library);
manager.readFile(libraryPath, false);
/* SHOW */
if (action == SHOW) {
show(libraryManager.cloneLibrary());
} else if (action == ADD) {
string zimPath;
string zimPathToSave = ".";
string indexPath;
kiwix::supportedIndexType indexBackend = kiwix::XAPIAN;
string url;
string origID="";
bool setCurrent = false;
if (argc>3) {
zimPath = argv[3];
}
/* Options parsing */
optind = 2;
while (42) {
static struct option long_options[] = {
{"url", required_argument, 0, 'u'},
{"origId", required_argument, 0, 'o'},
{"indexPath", required_argument, 0, 'i'},
{"indexBackend", required_argument, 0, 'b'},
{"zimPathToSave", required_argument, 0, 'z'},
{"current", no_argument, 0, 'c'},
{0, 0, 0, 0}
};
c = getopt_long(argc, argv, "cz:u:i:b:", long_options, &option_index);
if (c != -1) {
switch (c) {
case 'u':
url = optarg;
break;
case 'o':
origID = optarg;
break;
case 'c':
setCurrent = true;
break;
case 'i':
indexPath = optarg;
break;
case 'b':
if (!strcmp(optarg, "xapian")) {
indexBackend = kiwix::XAPIAN;
} else {
usage();
}
break;
case 'z':
zimPathToSave = optarg;
break;
}
} else {
break;
}
}
if (!zimPath.empty()) {
zimPathToSave = zimPathToSave == "." ? zimPath : zimPathToSave;
string bookId = libraryManager.addBookFromPathAndGetId(zimPath, zimPathToSave, url, false);
if (!bookId.empty()) {
if (setCurrent)
libraryManager.setCurrentBookId(bookId);
/* Save the index infos if necessary */
if (!indexPath.empty())
libraryManager.setBookIndex(bookId, indexPath, indexBackend);
} else {
cerr << "Unable to build or save library file '" << libraryPath << "'" << endl;
}
} else {
std::cerr << "Invalid zim file path" << std::endl;
}
} else if (action == REMOVE) {
unsigned int bookIndex = 0;
const unsigned int totalBookCount = libraryManager.getBookCount(true, true);
if (argc>3) {
bookIndex = atoi(argv[3]);
}
if (bookIndex > 0 && bookIndex <= totalBookCount) {
libraryManager.removeBookByIndex(bookIndex - 1);
} else {
if (totalBookCount > 0) {
std::cerr << "Invalid book index number. Please give a number between 1 and " << totalBookCount << std::endl;
} else {
std::cerr << "Invalid book index number. Library is empty, no book to delete." << std::endl;
}
}
bool exitCode = 0;
switch (action) {
case SHOW:
exitCode = handle_show(&library, libraryPath, argc, argv);
break;
case ADD:
exitCode = handle_add(&library, libraryPath, argc, argv);
break;
case REMOVE:
exitCode = handle_remove(&library, libraryPath, argc, argv);
break;
case DOWNLOAD:
exitCode = handle_download(&library, libraryPath, argc, argv);
break;
case NONE:
break;
}
/* Rewrite the library file */
if (action == REMOVE || action == ADD) {
libraryManager.writeFile(libraryPath);
if (action == REMOVE || action == ADD || action == DOWNLOAD) {
library.writeToFile(libraryPath);
}
exit(0);
exit(exitCode);
}

View File

@@ -1,3 +1,4 @@
executable('kiwix-manage', ['kiwix-manage.cpp'],
dependencies:all_deps,
install:true)
install:true,
install_rpath: join_paths(get_option('prefix'), get_option('libdir')))

View File

@@ -1,5 +1,4 @@
subdir('installer')
subdir('manager')
subdir('reader')
subdir('searcher')

View File

@@ -18,59 +18,53 @@
*/
#include <getopt.h>
#include <unistd.h>
#include <string>
#include <map>
#include <kiwix/common/tree.h>
#include <kiwix/reader.h>
#include <unistd.h>
#include <map>
#include <string>
void usage() {
cout << "Usage: kiwix-read --suggest=<PATTERN> ZIM_FILE_PATH" << endl;
exit(1);
void usage()
{
cout << "Usage: kiwix-read --suggest=<PATTERN> ZIM_FILE_PATH" << endl;
exit(1);
}
void updateSuggestionTree(tree< pair<string, unsigned> > &suggestionTree, string suggestion) {
return;
}
int main(int argc, char **argv) {
int main(int argc, char** argv)
{
/* Init the variables */
const char *filePath = NULL;
const char *pattern = NULL;
const char* filePath = NULL;
const char* pattern = NULL;
int option_index = 0;
int c = 0;
kiwix::Reader *reader = NULL;
kiwix::Reader* reader = NULL;
/* Argument parsing */
while (42) {
static struct option long_options[]
= {{"verbose", no_argument, 0, 'v'},
{"suggest", required_argument, 0, 's'},
{0, 0, 0, 0}};
static struct option long_options[] = {
{"verbose", no_argument, 0, 'v'},
{"suggest", required_argument, 0, 's'},
{0, 0, 0, 0}
};
if (c != -1) {
c = getopt_long(argc, argv, "vs:", long_options, &option_index);
switch (c) {
case 'v':
break;
case 's':
pattern = optarg;
break;
case 'v':
break;
case 's':
pattern = optarg;
break;
}
} else {
if (optind < argc) {
if (filePath == NULL) {
filePath = argv[optind++];
} else {
usage();
}
if (filePath == NULL) {
filePath = argv[optind++];
} else {
usage();
}
} else {
break;
break;
}
}
}
@@ -85,30 +79,19 @@ int main(int argc, char **argv) {
/* Start to read an article */
if (reader != NULL) {
string mainPageUrl = reader->getMainPageUrl();
string content;
string contentType;
unsigned int contentLength = 0;
string suggestion;
if (pattern != NULL) {
std::cout << "Searching suggestions for: " << pattern << std::endl;
reader->searchSuggestionsSmart(pattern, 10);
while (reader->getNextSuggestion(suggestion)) {
std::cout << suggestion << std::endl;
std::cout << suggestion << std::endl;
}
}
/*
if (reader->getContentByUrl(mainPageUrl, content, contentLength, contentType)) {
cout << content << endl;
}
*/
// tree< pair<string, unsigned> > tree;
//updateSuggestionTree(tree, string(suggestion));
delete reader;
} else {
cerr << "Unable instanciate the Kiwix reader." << endl;

View File

@@ -1,3 +1,4 @@
executable('kiwix-read', ['kiwix-read.cpp'],
dependencies:all_deps,
install:true)
install:true,
install_rpath: join_paths(get_option('prefix'), get_option('libdir')))

View File

@@ -18,57 +18,69 @@
*/
#include <getopt.h>
#include <unistd.h>
#include <kiwix/reader.h>
#include <kiwix/searcher.h>
#include <unistd.h>
void usage() {
cout << "Usage: kiwix-search [--verbose|-v] ZIM_PATH SEARCH" << endl;
exit(1);
void usage()
{
cout << "Usage: kiwix-search [OPTIONS] ZIM PATTERN" << endl << endl
<< " kiwix-search allows to find articles based on the a fulltext search pattern." << endl << endl
<< " ZIM is the full path of the ZIM file. This can also be a disctinct fulltext" << endl
<< " index directory (usually distributed with the *.idx extension)." << endl
<< " PATTERN is/are word(s) - or part of - to search in the ZIM." << endl << endl
<< " -s, --suggestion\tSuggest article titles based on the few letters of the PATTERN instead of making a fulltext search. Work a bit like a completion solution." << endl
<< " -v, --verbose\t\tGive details about the search process" << endl;
exit(1);
}
int main(int argc, char **argv) {
int main(int argc, char** argv)
{
/* Init the variables */
//const char *indexPath = "/home/itamar/.www.kiwix.org/kiwix/43k0i1j4.default/6d2e587b-d586-dc6a-dc6a-e4ef035a1495d15c.index";
//const char *indexPath = "/home/itamar/testindex";
const char *zimPath = NULL;
const char *search = NULL;
// const char *indexPath =
// "/home/itamar/.www.kiwix.org/kiwix/43k0i1j4.default/6d2e587b-d586-dc6a-dc6a-e4ef035a1495d15c.index";
// const char *indexPath = "/home/itamar/testindex";
const char* zimPath = NULL;
const char* search = NULL;
bool verboseFlag = false;
bool suggestionFlag = false;
int option_index = 0;
int c = 0;
kiwix::Searcher *searcher = NULL;
kiwix::Reader *reader = NULL;
kiwix::Searcher* searcher = NULL;
kiwix::Reader* reader = NULL;
/* Argument parsing */
while (42) {
static struct option long_options[] = {
{"verbose", no_argument, 0, 'v'},
{0, 0, 0, 0}
};
static struct option long_options[]
= {{"verbose", no_argument, 0, 'v'},
{"suggestion", no_argument, 0, 's'},
{0, 0, 0, 0}};
if (c != -1) {
c = getopt_long(argc, argv, "vb:", long_options, &option_index);
c = getopt_long(argc, argv, "vsb:", long_options, &option_index);
switch (c) {
case 'v':
verboseFlag = true;
break;
case 'v':
verboseFlag = true;
break;
case 's':
suggestionFlag = true;
break;
}
} else {
if (optind < argc) {
if (zimPath == NULL) {
zimPath = argv[optind++];
} else if (search == NULL) {
search = argv[optind++];
} else {
cout << zimPath << endl;
usage();
}
if (zimPath == NULL) {
zimPath = argv[optind++];
} else if (search == NULL) {
search = argv[optind++];
} else {
cout << zimPath << endl;
usage();
}
} else {
break;
break;
}
}
}
@@ -80,28 +92,34 @@ int main(int argc, char **argv) {
/* Try to prepare the indexing */
try {
reader = new kiwix::Reader(zimPath);
reader = new kiwix::Reader(zimPath);
} catch (...) {
/* Cannot open the zimPath, maybe it is a plain old xapian database directory */
/* Cannot open the zimPath, maybe it is a plain old xapian database
* directory */
}
if ( reader ) {
searcher = new kiwix::Searcher("", reader);
if (reader) {
searcher = new kiwix::Searcher();
searcher->add_reader(reader, "");
} else {
try {
searcher = new kiwix::Searcher(zimPath, NULL);
} catch (...) {
cerr << "Unable to search through zim '" << zimPath << "'." << endl;
exit(1);
}
try {
searcher = new kiwix::Searcher(zimPath, NULL, "");
} catch (...) {
cerr << "Unable to search through zim '" << zimPath << "'." << endl;
exit(1);
}
}
/* Start the indexing */
if (searcher != NULL) {
string searchString(search);
searcher->search(searchString, 0, 10);
if (suggestionFlag) {
searcher->suggestions(searchString, verboseFlag);
} else {
searcher->search(searchString, 0, 10, verboseFlag);
}
kiwix::Result* p_result;
while ( (p_result = searcher->getNextResult()) ) {
while ((p_result = searcher->getNextResult())) {
cout << p_result->get_title() << endl;
delete p_result;
}

View File

@@ -1,3 +1,4 @@
executable('kiwix-search', ['kiwix-search.cpp'],
dependencies:all_deps,
install:true)
install:true,
install_rpath: join_paths(get_option('prefix'), get_option('libdir')))

View File

File diff suppressed because it is too large Load Diff

View File

@@ -1,7 +1,8 @@
sources = ['kiwix-serve.cpp']
sources = ['kiwix-serve.cpp', 'request_context.cpp']
sources += server_resources
executable('kiwix-serve', sources,
dependencies:all_deps,
install:true)
install:true,
install_rpath: join_paths(get_option('prefix'), get_option('libdir')))

View File

@@ -0,0 +1,201 @@
/*
* Copyright 2009-2016 Emmanuel Engelhart <kelson@kiwix.org>
* Copyright 2017 Matthieu Gautier<mgautier@kymeria.fr>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or
* any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
* MA 02110-1301, USA.
*/
#include "request_context.h"
#include <string.h>
#include <stdexcept>
#include <sstream>
#include <cstdio>
RequestContext::RequestContext(struct MHD_Connection* connection,
std::string rootLocation,
const std::string& _url,
const std::string& method,
const std::string& version) :
full_url(_url),
url(_url),
valid_url(true),
version(version),
acceptEncodingDeflate(false),
accept_range(false),
range_pair(0, -1)
{
if (method == "GET") {
this->method = RequestMethod::GET;
} else if (method == "HEAD") {
this->method = RequestMethod::HEAD;
} else if (method == "POST") {
this->method = RequestMethod::POST;
} else if (method == "PUT") {
this->method = RequestMethod::PUT;
} else if (method == "DELETE") {
this->method = RequestMethod::DELETE_;
} else if (method == "CONNECT") {
this->method = RequestMethod::CONNECT;
} else if (method == "OPTIONS") {
this->method = RequestMethod::OPTIONS;
} else if (method == "TRACE") {
this->method = RequestMethod::TRACE;
} else if (method == "PATCH") {
this->method = RequestMethod::PATCH;
} else {
this->method = RequestMethod::OTHER;
}
MHD_get_connection_values(connection, MHD_HEADER_KIND, &RequestContext::fill_header, this);
MHD_get_connection_values(connection, MHD_GET_ARGUMENT_KIND, &RequestContext::fill_argument, this);
valid_url = true;
if (rootLocation.empty()) {
// nothing special to handle.
url = full_url;
} else {
if (full_url.size() > rootLocation.size() &&
full_url.substr(0, rootLocation.size()+1) == rootLocation + "/") {
url = full_url.substr(rootLocation.size());
} else {
valid_url = false;
}
}
try {
acceptEncodingDeflate =
(get_header(MHD_HTTP_HEADER_ACCEPT_ENCODING).find("deflate") != std::string::npos);
} catch (const std::out_of_range&) {}
/*Check if range is requested. */
try {
auto range = get_header(MHD_HTTP_HEADER_RANGE);
int start = 0;
int end = -1;
std::istringstream iss(range);
char c;
iss >> start >> c;
if (iss.good() && c=='-') {
iss >> end;
if (iss.fail()) {
// Something went wrong will extracting.
end = -1;
}
if (iss.eof()) {
accept_range = true;
range_pair = std::pair<int, int>(start, end);
}
}
} catch (const std::out_of_range&) {}
}
RequestContext::~RequestContext()
{}
int RequestContext::fill_header(void *__this, enum MHD_ValueKind kind,
const char *key, const char *value)
{
RequestContext *_this = static_cast<RequestContext*>(__this);
_this->headers[key] = value;
return MHD_YES;
}
int RequestContext::fill_argument(void *__this, enum MHD_ValueKind kind,
const char *key, const char* value)
{
RequestContext *_this = static_cast<RequestContext*>(__this);
_this->arguments[key] = value == nullptr ? "" : value;
return MHD_YES;
}
void RequestContext::print_debug_info() {
printf("method : %s (%d)\n", method==RequestMethod::GET ? "GET" :
method==RequestMethod::POST ? "POST" :
"OTHER", (int)method);
printf("version : %s\n", version.c_str());
printf("headers :\n");
for (auto it=headers.begin(); it!=headers.end(); it++) {
printf(" - %s : '%s'\n", it->first.c_str(), it->second.c_str());
}
printf("arguments :\n");
for (auto it=arguments.begin(); it!=arguments.end(); it++) {
printf(" - %s : '%s'\n", it->first.c_str(), it->second.c_str());
}
printf("Parsed : \n");
printf("url : %s\n", url.c_str());
printf("acceptEncodingDeflate : %d\n", acceptEncodingDeflate);
printf("has_range : %d\n", accept_range);
printf(".............\n");
}
RequestMethod RequestContext::get_method() {
return method;
}
std::string RequestContext::get_url() {
return url;
}
std::string RequestContext::get_url_part(int number) {
size_t start = 1;
while(true) {
auto found = url.find('/', start);
if (number == 0) {
if (found == std::string::npos) {
return url.substr(start);
} else {
return url.substr(start, found-start);
}
} else {
if (found == std::string::npos) {
throw std::out_of_range("No parts");
}
start = found + 1;
number -= 1;
}
}
}
std::string RequestContext::get_full_url() {
return full_url;
}
bool RequestContext::is_valid_url() {
return valid_url;
}
bool RequestContext::has_range() {
return accept_range;
}
std::pair<int, int> RequestContext::get_range() {
return range_pair;
}
template<>
std::string RequestContext::get_argument(const std::string& name) {
return arguments.at(name);
}
std::string RequestContext::get_header(const std::string& name) {
return headers.at(name);
}

View File

@@ -0,0 +1,108 @@
/*
* Copyright 2009-2016 Emmanuel Engelhart <kelson@kiwix.org>
* Copyright 2017 Matthieu Gautier<mgautier@kymeria.fr>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or
* any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
* MA 02110-1301, USA.
*/
#ifndef REQUEST_CONTEXT_H
#define REQUEST_CONTEXT_H
#include <string>
#include <sstream>
#include <map>
#include <stdexcept>
extern "C" {
#include <microhttpd.h>
}
enum class RequestMethod {
GET,
HEAD,
POST,
PUT,
DELETE_,
CONNECT,
OPTIONS,
TRACE,
PATCH,
OTHER
};
class KeyError : public std::runtime_error {};
class IndexError: public std::runtime_error {};
class RequestContext {
public:
RequestContext(struct MHD_Connection* connection,
std::string rootLocation,
const std::string& url,
const std::string& method,
const std::string& version);
~RequestContext();
void print_debug_info();
bool is_valid_url();
std::string get_header(const std::string& name);
template<typename T=std::string>
T get_argument(const std::string& name) {
std::istringstream stream(arguments.at(name));
T v;
stream >> v;
return v;
}
RequestMethod get_method();
std::string get_url();
std::string get_url_part(int part);
std::string get_full_url();
bool has_range();
std::pair<int, int> get_range();
bool can_compress() { return acceptEncodingDeflate; }
// [TODO] Move this to the response builder
int httpResponseCode;
private:
std::string full_url;
std::string url;
bool valid_url;
RequestMethod method;
std::string version;
bool acceptEncodingDeflate;
bool accept_range;
std::pair<int, int> range_pair;
std::map<std::string, std::string> headers;
std::map<std::string, std::string> arguments;
static int fill_header(void *, enum MHD_ValueKind, const char*, const char*);
static int fill_argument(void *, enum MHD_ValueKind, const char*, const char*);
};
template<> std::string RequestContext::get_argument(const std::string& name);
#endif //REQUEST_CONTEXT_H

View File

@@ -1,4 +1,4 @@
res_compiler = find_program('compile_resources.py')
res_compiler = find_program('kiwix-compile-resources', 'compile_resources.py')
subdir('server')

View File

@@ -0,0 +1,13 @@
<span class="kiwix">
<span id="kiwixtoolbar" class="ui-widget-header">
<div class="kiwix_centered">
<div class="kiwix_searchform">
<form class="kiwixsearch" method="GET" action="__ROOT_LOCATION__/search" id="kiwixsearchform">
<input autocomplete="off" class="ui-autocomplete-input" id="kiwixsearchbox" name="pattern" type="text">
<input type="submit" value="&#x1f50d;">
</form>
</div>
</div>
</span>
</span>
<div style="display: block; height: 5em;"></div>

View File

@@ -3,10 +3,10 @@
<head>
<meta charset="UTF-8" />
<title>Welcome to Kiwix Server</title>
<script type="text/javascript" src="/skin/jquery-ui/external/jquery/jquery.js"></script>
<script type="text/javascript" src="/skin/jquery-ui/jquery-ui.min.js"></script>
<link type="text/css" href="/skin/jquery-ui/jquery-ui.min.css" rel="Stylesheet" />
<link type="text/css" href="/skin/jquery-ui/jquery-ui.theme.min.css" rel="Stylesheet" />
<script type="text/javascript" src="__ROOT_LOCATION__/skin/jquery-ui/external/jquery/jquery.js"></script>
<script type="text/javascript" src="__ROOT_LOCATION__/skin/jquery-ui/jquery-ui.min.js"></script>
<link type="text/css" href="__ROOT_LOCATION__/skin/jquery-ui/jquery-ui.min.css" rel="Stylesheet" />
<link type="text/css" href="__ROOT_LOCATION__/skin/jquery-ui/jquery-ui.theme.min.css" rel="Stylesheet" />
<style>
body {
background:

View File

@@ -1,11 +1,14 @@
<script type="text/javascript" src="/skin/jquery-ui/external/jquery/jquery.js"></script>
<script type="text/javascript" src="/skin/jquery-ui/jquery-ui.min.js"></script>
<link type="text/css" href="__ROOT_LOCATION__/skin/jquery-ui/jquery-ui.min.css" rel="Stylesheet" />
<link type="text/css" href="__ROOT_LOCATION__/skin/jquery-ui/jquery-ui.theme.min.css" rel="Stylesheet" />
<link type="text/css" href="__ROOT_LOCATION__/skin/taskbar.css" rel="Stylesheet" />
<script type="text/javascript" src="__ROOT_LOCATION__/skin/jquery-ui/external/jquery/jquery.js"></script>
<script type="text/javascript" src="__ROOT_LOCATION__/skin/jquery-ui/jquery-ui.min.js"></script>
<script>
var jk = jQuery.noConflict();
jk(function() {
jk( "#kiwixsearchbox" ).autocomplete({
source: "/suggest?content=__CONTENT__",
source: "__ROOT_LOCATION__/suggest?content=__CONTENT_ESCAPED__",
dataType: "json",
cache: false,

View File

@@ -0,0 +1,9 @@
<?xml version="1.0" encoding="UTF-8"?>
<OpenSearchDescription xmlns="http://a9.com/-/spec/opensearch/1.1/">
<ShortName>Zim catalog search</ShortName>
<Description>Search zim files in the catalog.</Description>
<Url type="application/atom+xml;profile=opds-catalog"
xmlns:atom="http://www.w3.org/2005/Atom"
indexOffset="0"
template="/__ROOT_LOCATION__/catalog/search?q={searchTerms}&lang={language}&count={count}&start={startIndex}"/>
</OpenSearchDescription>

View File

@@ -21,3 +21,5 @@ home.html.tmpl
include.html.part
taskbar.css
taskbar.html.part
global_taskbar.html.part
opensearchdescription.xml

View File

@@ -1,18 +1,16 @@
<link type="text/css" href="/skin/jquery-ui/jquery-ui.min.css" rel="Stylesheet" />
<link type="text/css" href="/skin/jquery-ui/jquery-ui.theme.min.css" rel="Stylesheet" />
<span class="kiwix">
<span id="kiwixtoolbar" class="ui-widget-header">
<div class="kiwix_centered">
<div class="kiwix_button_wrapper">
<a id="kiwix_serve_taskbar_library_button" href="/"><button>Library</button></a>
<a id="kiwix_serve_taskbar_home_button" href="/__CONTENT__/"><button>Home</button></a>
<a id="kiwix_serve_taskbar_random_button" href="/random?content=__CONTENT__"><button>Random</button></a>
<a id="kiwix_serve_taskbar_library_button" href="__ROOT_LOCATION__/"><button>&#x1f3e0;</button></a>
<a id="kiwix_serve_taskbar_home_button" href="__ROOT_LOCATION__/__CONTENT__/"><button>__ZIM_TITLE__</button></a>
<a id="kiwix_serve_taskbar_random_button" href="__ROOT_LOCATION__/random?content=__CONTENT_ESCAPED__"><button>&#x1F3B2;</button></a>
</div>
<div class="kiwix_searchform">
<form class="kiwixsearch" method="GET" action="/search" id="kiwixsearchform">
<form class="kiwixsearch" method="GET" action="__ROOT_LOCATION__/search" id="kiwixsearchform">
<input type="hidden" name="content" value="__CONTENT__" />
<input autocomplete="off" class="ui-autocomplete-input" id="kiwixsearchbox" name="pattern" type="text">
<input type="submit" value="Search">
<input type="submit" value="&#x1f50d;">
</form>
</div>
</div>

View File

@@ -8,24 +8,17 @@ INSTALL_DIR=${BUILD_DIR}/INSTALL
case ${PLATFORM} in
"native_static")
MESON_OPTION="--default-library=static"
MESON_OPTION="-Dstatic-linkage=true"
;;
"native_dyn")
MESON_OPTION="--default-library=shared"
MESON_OPTION=""
;;
"win32_static")
MESON_OPTION="--default-library=static --cross-file ${BUILD_DIR}/meson_cross_file.txt"
MESON_OPTION="-Dstatic-linkage=true --cross-file ${BUILD_DIR}/meson_cross_file.txt"
;;
"win32_dyn")
MESON_OPTION="--default-library=shared --cross-file ${BUILD_DIR}/meson_cross_file.txt"
MESON_OPTION="--cross-file ${BUILD_DIR}/meson_cross_file.txt"
;;
"android_arm")
MESON_OPTION="-Dandroid=true --default-library=shared --cross-file ${BUILD_DIR}/meson_cross_file.txt"
;;
"android_arm64")
MESON_OPTION="-Dandroid=true --default-library=shared --cross-file ${BUILD_DIR}/meson_cross_file.txt"
;;
esac
cd ${TRAVIS_BUILD_DIR}

View File

@@ -3,7 +3,7 @@
set -e
REPO_NAME=${TRAVIS_REPO_SLUG#*/}
ARCHIVE_NAME=deps_${PLATFORM}_${REPO_NAME}.tar.gz
ARCHIVE_NAME=deps_${TRAVIS_OS_NAME}_${PLATFORM}_${REPO_NAME}.tar.gz
# Packages.
case ${PLATFORM} in
@@ -29,7 +29,7 @@ esac
sudo apt-get update -qq
sudo apt-get install -qq python3-pip ${PACKAGES}
pip3 install meson
sudo pip3 install meson==0.43.0
# Ninja
cd $HOME
@@ -42,6 +42,4 @@ sudo cp ninja /bin
# Dependencies comming from kiwix-build.
cd ${HOME}
wget http://tmp.kiwix.org/ci/${ARCHIVE_NAME}
mkdir -p BUILD_${PLATFORM}
cd BUILD_${PLATFORM}
tar xf ${HOME}/${ARCHIVE_NAME}