diff --git a/httpchannel-api/pom.xml b/httpchannel-api/pom.xml
index ccaad59..8c15270 100644
--- a/httpchannel-api/pom.xml
+++ b/httpchannel-api/pom.xml
@@ -8,6 +8,9 @@
..
httpchannel-api
+ jar
+
+
HttpChannel/API
Module that defines the HttpChannel API. HttpChannels abstract complex download and upload steps into a simple and easy to use NIO Channel. NIO Channels can be wrapped into an InputStream or OutputStream and used in any way you may find possible to. Aside from that, Channels can be used natively in most next-gen libraries, meaning that you don't even need to wrap anything, just start writing or reading data to or from the channel wth a ByteBuffer.
diff --git a/httpchannel-api/src/main/java/com/rogiel/httpchannel/service/helper/AuthenticationServices.java b/httpchannel-api/src/main/java/com/rogiel/httpchannel/service/helper/AuthenticationServices.java
index 58a737f..7f40cbe 100644
--- a/httpchannel-api/src/main/java/com/rogiel/httpchannel/service/helper/AuthenticationServices.java
+++ b/httpchannel-api/src/main/java/com/rogiel/httpchannel/service/helper/AuthenticationServices.java
@@ -20,8 +20,8 @@ package com.rogiel.httpchannel.service.helper;
import com.rogiel.httpchannel.service.AuthenticationService;
import com.rogiel.httpchannel.service.Authenticator;
-import com.rogiel.httpchannel.service.Authenticator.AuthenticatorConfiguration;
import com.rogiel.httpchannel.service.Credential;
+import com.rogiel.httpchannel.service.Authenticator.AuthenticatorConfiguration;
/**
* @author Rogiel
diff --git a/httpchannel-api/src/main/resources/META-INF/MANIFEST.MF b/httpchannel-api/src/main/resources/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..3aa50d1
--- /dev/null
+++ b/httpchannel-api/src/main/resources/META-INF/MANIFEST.MF
@@ -0,0 +1,23 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: HttpChannel API
+Bundle-SymbolicName: com.rogiel.httpchannel;singleton:=true
+Bundle-Version: 1.0.0
+Export-Package: com.rogiel.httpchannel.captcha,
+ com.rogiel.httpchannel.captcha.exception;uses:="com.rogiel.httpchannel.service.exception",
+ com.rogiel.httpchannel.channel;uses:="com.rogiel.httpchannel.service",
+ com.rogiel.httpchannel.osgi;uses:="org.osgi.framework",
+ com.rogiel.httpchannel.service;uses:="com.rogiel.httpchannel.captcha,org.slf4j",
+ com.rogiel.httpchannel.service.config;uses:="com.rogiel.httpchannel.service",
+ com.rogiel.httpchannel.service.exception,
+ com.rogiel.httpchannel.service.helper;uses:="com.rogiel.httpchannel.service"
+Bundle-Activator: com.rogiel.httpchannel.osgi.Activator
+Import-Package: com.rogiel.httpchannel.captcha,
+ com.rogiel.httpchannel.captcha.exception,
+ com.rogiel.httpchannel.channel,
+ com.rogiel.httpchannel.osgi,
+ com.rogiel.httpchannel.service,
+ com.rogiel.httpchannel.service.config,
+ com.rogiel.httpchannel.service.exception,
+ com.rogiel.httpchannel.service.helper, org.osgi.framework
+
diff --git a/httpchannel-captcha/bin/httpchannel-captcha-captchatrader/src/main/java/com/captchatrader/CaptchaTrader.class b/httpchannel-captcha/bin/httpchannel-captcha-captchatrader/src/main/java/com/captchatrader/CaptchaTrader.class
new file mode 100644
index 0000000..c9ec1f5
Binary files /dev/null and b/httpchannel-captcha/bin/httpchannel-captcha-captchatrader/src/main/java/com/captchatrader/CaptchaTrader.class differ
diff --git a/httpchannel-captcha/bin/httpchannel-captcha-captchatrader/src/main/java/com/captchatrader/ResolvedCaptcha.class b/httpchannel-captcha/bin/httpchannel-captcha-captchatrader/src/main/java/com/captchatrader/ResolvedCaptcha.class
new file mode 100644
index 0000000..b8688a2
Binary files /dev/null and b/httpchannel-captcha/bin/httpchannel-captcha-captchatrader/src/main/java/com/captchatrader/ResolvedCaptcha.class differ
diff --git a/httpchannel-captcha/bin/httpchannel-captcha-captchatrader/src/main/java/com/captchatrader/exception/ApplicationKeyDisabledException.class b/httpchannel-captcha/bin/httpchannel-captcha-captchatrader/src/main/java/com/captchatrader/exception/ApplicationKeyDisabledException.class
new file mode 100644
index 0000000..7120654
Binary files /dev/null and b/httpchannel-captcha/bin/httpchannel-captcha-captchatrader/src/main/java/com/captchatrader/exception/ApplicationKeyDisabledException.class differ
diff --git a/httpchannel-captcha/bin/httpchannel-captcha-captchatrader/src/main/java/com/captchatrader/exception/CaptchaTraderException.class b/httpchannel-captcha/bin/httpchannel-captcha-captchatrader/src/main/java/com/captchatrader/exception/CaptchaTraderException.class
new file mode 100644
index 0000000..92a631d
Binary files /dev/null and b/httpchannel-captcha/bin/httpchannel-captcha-captchatrader/src/main/java/com/captchatrader/exception/CaptchaTraderException.class differ
diff --git a/httpchannel-captcha/bin/httpchannel-captcha-captchatrader/src/main/java/com/captchatrader/exception/ConnectionLimitException.class b/httpchannel-captcha/bin/httpchannel-captcha-captchatrader/src/main/java/com/captchatrader/exception/ConnectionLimitException.class
new file mode 100644
index 0000000..b580519
Binary files /dev/null and b/httpchannel-captcha/bin/httpchannel-captcha-captchatrader/src/main/java/com/captchatrader/exception/ConnectionLimitException.class differ
diff --git a/httpchannel-captcha/bin/httpchannel-captcha-captchatrader/src/main/java/com/captchatrader/exception/DailyLimitException.class b/httpchannel-captcha/bin/httpchannel-captcha-captchatrader/src/main/java/com/captchatrader/exception/DailyLimitException.class
new file mode 100644
index 0000000..fa1a98d
Binary files /dev/null and b/httpchannel-captcha/bin/httpchannel-captcha-captchatrader/src/main/java/com/captchatrader/exception/DailyLimitException.class differ
diff --git a/httpchannel-captcha/bin/httpchannel-captcha-captchatrader/src/main/java/com/captchatrader/exception/ImageTooLargeException.class b/httpchannel-captcha/bin/httpchannel-captcha-captchatrader/src/main/java/com/captchatrader/exception/ImageTooLargeException.class
new file mode 100644
index 0000000..f885c33
Binary files /dev/null and b/httpchannel-captcha/bin/httpchannel-captcha-captchatrader/src/main/java/com/captchatrader/exception/ImageTooLargeException.class differ
diff --git a/httpchannel-captcha/bin/httpchannel-captcha-captchatrader/src/main/java/com/captchatrader/exception/IncorrectRespondsException.class b/httpchannel-captcha/bin/httpchannel-captcha-captchatrader/src/main/java/com/captchatrader/exception/IncorrectRespondsException.class
new file mode 100644
index 0000000..93dd78e
Binary files /dev/null and b/httpchannel-captcha/bin/httpchannel-captcha-captchatrader/src/main/java/com/captchatrader/exception/IncorrectRespondsException.class differ
diff --git a/httpchannel-captcha/bin/httpchannel-captcha-captchatrader/src/main/java/com/captchatrader/exception/InsuficientCreditsException.class b/httpchannel-captcha/bin/httpchannel-captcha-captchatrader/src/main/java/com/captchatrader/exception/InsuficientCreditsException.class
new file mode 100644
index 0000000..8f47796
Binary files /dev/null and b/httpchannel-captcha/bin/httpchannel-captcha-captchatrader/src/main/java/com/captchatrader/exception/InsuficientCreditsException.class differ
diff --git a/httpchannel-captcha/bin/httpchannel-captcha-captchatrader/src/main/java/com/captchatrader/exception/InternalErrorException.class b/httpchannel-captcha/bin/httpchannel-captcha-captchatrader/src/main/java/com/captchatrader/exception/InternalErrorException.class
new file mode 100644
index 0000000..17030c9
Binary files /dev/null and b/httpchannel-captcha/bin/httpchannel-captcha-captchatrader/src/main/java/com/captchatrader/exception/InternalErrorException.class differ
diff --git a/httpchannel-captcha/bin/httpchannel-captcha-captchatrader/src/main/java/com/captchatrader/exception/InvalidApplicationKeyException.class b/httpchannel-captcha/bin/httpchannel-captcha-captchatrader/src/main/java/com/captchatrader/exception/InvalidApplicationKeyException.class
new file mode 100644
index 0000000..14a7556
Binary files /dev/null and b/httpchannel-captcha/bin/httpchannel-captcha-captchatrader/src/main/java/com/captchatrader/exception/InvalidApplicationKeyException.class differ
diff --git a/httpchannel-captcha/bin/httpchannel-captcha-captchatrader/src/main/java/com/captchatrader/exception/InvalidParametersException.class b/httpchannel-captcha/bin/httpchannel-captcha-captchatrader/src/main/java/com/captchatrader/exception/InvalidParametersException.class
new file mode 100644
index 0000000..68e3bba
Binary files /dev/null and b/httpchannel-captcha/bin/httpchannel-captcha-captchatrader/src/main/java/com/captchatrader/exception/InvalidParametersException.class differ
diff --git a/httpchannel-captcha/bin/httpchannel-captcha-captchatrader/src/main/java/com/captchatrader/exception/InvalidTicketException.class b/httpchannel-captcha/bin/httpchannel-captcha-captchatrader/src/main/java/com/captchatrader/exception/InvalidTicketException.class
new file mode 100644
index 0000000..4577f70
Binary files /dev/null and b/httpchannel-captcha/bin/httpchannel-captcha-captchatrader/src/main/java/com/captchatrader/exception/InvalidTicketException.class differ
diff --git a/httpchannel-captcha/bin/httpchannel-captcha-captchatrader/src/main/java/com/captchatrader/exception/InvalidURLException.class b/httpchannel-captcha/bin/httpchannel-captcha-captchatrader/src/main/java/com/captchatrader/exception/InvalidURLException.class
new file mode 100644
index 0000000..783c1cf
Binary files /dev/null and b/httpchannel-captcha/bin/httpchannel-captcha-captchatrader/src/main/java/com/captchatrader/exception/InvalidURLException.class differ
diff --git a/httpchannel-captcha/bin/httpchannel-captcha-captchatrader/src/main/java/com/captchatrader/exception/InvalidUserException.class b/httpchannel-captcha/bin/httpchannel-captcha-captchatrader/src/main/java/com/captchatrader/exception/InvalidUserException.class
new file mode 100644
index 0000000..e435b1a
Binary files /dev/null and b/httpchannel-captcha/bin/httpchannel-captcha-captchatrader/src/main/java/com/captchatrader/exception/InvalidUserException.class differ
diff --git a/httpchannel-captcha/bin/httpchannel-captcha-captchatrader/src/main/java/com/captchatrader/exception/NotAnImageException.class b/httpchannel-captcha/bin/httpchannel-captcha-captchatrader/src/main/java/com/captchatrader/exception/NotAnImageException.class
new file mode 100644
index 0000000..4ef3849
Binary files /dev/null and b/httpchannel-captcha/bin/httpchannel-captcha-captchatrader/src/main/java/com/captchatrader/exception/NotAnImageException.class differ
diff --git a/httpchannel-captcha/bin/httpchannel-captcha-captchatrader/src/main/java/com/captchatrader/exception/SubmissionErrorException.class b/httpchannel-captcha/bin/httpchannel-captcha-captchatrader/src/main/java/com/captchatrader/exception/SubmissionErrorException.class
new file mode 100644
index 0000000..7dddad8
Binary files /dev/null and b/httpchannel-captcha/bin/httpchannel-captcha-captchatrader/src/main/java/com/captchatrader/exception/SubmissionErrorException.class differ
diff --git a/httpchannel-captcha/bin/httpchannel-captcha-captchatrader/src/main/java/com/captchatrader/exception/UserNotValidatedException.class b/httpchannel-captcha/bin/httpchannel-captcha-captchatrader/src/main/java/com/captchatrader/exception/UserNotValidatedException.class
new file mode 100644
index 0000000..31a81b1
Binary files /dev/null and b/httpchannel-captcha/bin/httpchannel-captcha-captchatrader/src/main/java/com/captchatrader/exception/UserNotValidatedException.class differ
diff --git a/httpchannel-captcha/bin/httpchannel-captcha-captchatrader/src/main/java/com/rogiel/httpchannel/captcha/impl/CaptchaTraderService.class b/httpchannel-captcha/bin/httpchannel-captcha-captchatrader/src/main/java/com/rogiel/httpchannel/captcha/impl/CaptchaTraderService.class
new file mode 100644
index 0000000..2a3a7f8
Binary files /dev/null and b/httpchannel-captcha/bin/httpchannel-captcha-captchatrader/src/main/java/com/rogiel/httpchannel/captcha/impl/CaptchaTraderService.class differ
diff --git a/httpchannel-captcha/bin/httpchannel-captcha-captchatrader/src/test/java/com/captchatrader/CaptchaTraderTest.class b/httpchannel-captcha/bin/httpchannel-captcha-captchatrader/src/test/java/com/captchatrader/CaptchaTraderTest.class
new file mode 100644
index 0000000..03ffe53
Binary files /dev/null and b/httpchannel-captcha/bin/httpchannel-captcha-captchatrader/src/test/java/com/captchatrader/CaptchaTraderTest.class differ
diff --git a/httpchannel-service/httpchannel-service-4shared/src/main/java/com/rogiel/httpchannel/service/fourshared/FourSharedService.java b/httpchannel-service/httpchannel-service-4shared/src/main/java/com/rogiel/httpchannel/service/fourshared/FourSharedService.java
index 21cb9be..23106a8 100644
--- a/httpchannel-service/httpchannel-service-4shared/src/main/java/com/rogiel/httpchannel/service/fourshared/FourSharedService.java
+++ b/httpchannel-service/httpchannel-service-4shared/src/main/java/com/rogiel/httpchannel/service/fourshared/FourSharedService.java
@@ -30,9 +30,6 @@ import com.rogiel.httpchannel.service.AbstractAuthenticator;
import com.rogiel.httpchannel.service.AbstractHttpService;
import com.rogiel.httpchannel.service.AbstractUploader;
import com.rogiel.httpchannel.service.AccountDetails;
-import com.rogiel.httpchannel.service.AccountDetails.DiskQuotaAccountDetails;
-import com.rogiel.httpchannel.service.AccountDetails.FilesizeLimitAccountDetails;
-import com.rogiel.httpchannel.service.AccountDetails.PremiumAccountDetails;
import com.rogiel.httpchannel.service.AuthenticationService;
import com.rogiel.httpchannel.service.Authenticator;
import com.rogiel.httpchannel.service.AuthenticatorCapability;
@@ -45,6 +42,9 @@ import com.rogiel.httpchannel.service.UploadChannel;
import com.rogiel.httpchannel.service.UploadService;
import com.rogiel.httpchannel.service.Uploader;
import com.rogiel.httpchannel.service.UploaderCapability;
+import com.rogiel.httpchannel.service.AccountDetails.DiskQuotaAccountDetails;
+import com.rogiel.httpchannel.service.AccountDetails.FilesizeLimitAccountDetails;
+import com.rogiel.httpchannel.service.AccountDetails.PremiumAccountDetails;
import com.rogiel.httpchannel.service.channel.LinkedUploadChannel;
import com.rogiel.httpchannel.service.channel.LinkedUploadChannel.LinkedUploadChannelCloseCallback;
import com.rogiel.httpchannel.service.config.NullAuthenticatorConfiguration;
diff --git a/httpchannel-service/httpchannel-service-filesonic/src/main/java/com/rogiel/httpchannel/service/filesonic/FileSonicService.java b/httpchannel-service/httpchannel-service-filesonic/src/main/java/com/rogiel/httpchannel/service/filesonic/FileSonicService.java
index 338afae..92bbb7e 100644
--- a/httpchannel-service/httpchannel-service-filesonic/src/main/java/com/rogiel/httpchannel/service/filesonic/FileSonicService.java
+++ b/httpchannel-service/httpchannel-service-filesonic/src/main/java/com/rogiel/httpchannel/service/filesonic/FileSonicService.java
@@ -28,7 +28,6 @@ import com.rogiel.httpchannel.service.AbstractAuthenticator;
import com.rogiel.httpchannel.service.AbstractHttpService;
import com.rogiel.httpchannel.service.AbstractUploader;
import com.rogiel.httpchannel.service.AccountDetails;
-import com.rogiel.httpchannel.service.AccountDetails.PremiumAccountDetails;
import com.rogiel.httpchannel.service.AuthenticationService;
import com.rogiel.httpchannel.service.Authenticator;
import com.rogiel.httpchannel.service.AuthenticatorCapability;
@@ -41,6 +40,7 @@ import com.rogiel.httpchannel.service.UploadChannel;
import com.rogiel.httpchannel.service.UploadService;
import com.rogiel.httpchannel.service.Uploader;
import com.rogiel.httpchannel.service.UploaderCapability;
+import com.rogiel.httpchannel.service.AccountDetails.PremiumAccountDetails;
import com.rogiel.httpchannel.service.channel.LinkedUploadChannel;
import com.rogiel.httpchannel.service.channel.LinkedUploadChannel.LinkedUploadChannelCloseCallback;
import com.rogiel.httpchannel.service.config.NullAuthenticatorConfiguration;
diff --git a/httpchannel-service/httpchannel-service-hotfile/pom.xml b/httpchannel-service/httpchannel-service-hotfile/pom.xml
index c537bf8..0d13291 100644
--- a/httpchannel-service/httpchannel-service-hotfile/pom.xml
+++ b/httpchannel-service/httpchannel-service-hotfile/pom.xml
@@ -1,13 +1,14 @@
-
- 4.0.0
-
- httpchannel-service
- com.rogiel.httpchannel
- 1.0.1-SNAPSHOT
- ..
-
- httpchannel-service-hotfile
- com.rogiel.httpchannel.services
- HttpChannel/Service/HotFile
- Provides download and upload access to hotfile.com
+
+ 4.0.0
+
+ httpchannel-service
+ com.rogiel.httpchannel
+ 1.0.1-SNAPSHOT
+ ..
+
+ httpchannel-service-hotfile
+ com.rogiel.httpchannel.services
+ HttpChannel/Service/HotFile
+ Provides download and upload access to hotfile.com
\ No newline at end of file
diff --git a/httpchannel-service/httpchannel-service-hotfile/src/main/java/com/rogiel/httpchannel/service/hotfile/HotFileService.java b/httpchannel-service/httpchannel-service-hotfile/src/main/java/com/rogiel/httpchannel/service/hotfile/HotFileService.java
index 2ae9da6..ef68ca9 100644
--- a/httpchannel-service/httpchannel-service-hotfile/src/main/java/com/rogiel/httpchannel/service/hotfile/HotFileService.java
+++ b/httpchannel-service/httpchannel-service-hotfile/src/main/java/com/rogiel/httpchannel/service/hotfile/HotFileService.java
@@ -33,7 +33,6 @@ import com.rogiel.httpchannel.service.AbstractHttpDownloader;
import com.rogiel.httpchannel.service.AbstractHttpService;
import com.rogiel.httpchannel.service.AbstractUploader;
import com.rogiel.httpchannel.service.AccountDetails;
-import com.rogiel.httpchannel.service.AccountDetails.PremiumAccountDetails;
import com.rogiel.httpchannel.service.AuthenticationService;
import com.rogiel.httpchannel.service.Authenticator;
import com.rogiel.httpchannel.service.AuthenticatorCapability;
@@ -51,6 +50,7 @@ import com.rogiel.httpchannel.service.UploadChannel;
import com.rogiel.httpchannel.service.UploadService;
import com.rogiel.httpchannel.service.Uploader;
import com.rogiel.httpchannel.service.UploaderCapability;
+import com.rogiel.httpchannel.service.AccountDetails.PremiumAccountDetails;
import com.rogiel.httpchannel.service.channel.LinkedUploadChannel;
import com.rogiel.httpchannel.service.channel.LinkedUploadChannel.LinkedUploadChannelCloseCallback;
import com.rogiel.httpchannel.service.config.NullAuthenticatorConfiguration;
diff --git a/httpchannel-service/httpchannel-service-ifileit/pom.xml b/httpchannel-service/httpchannel-service-ifileit/pom.xml
new file mode 100644
index 0000000..299fb68
--- /dev/null
+++ b/httpchannel-service/httpchannel-service-ifileit/pom.xml
@@ -0,0 +1,14 @@
+
+ 4.0.0
+
+ httpchannel-service
+ com.rogiel.httpchannel
+ 1.0.1-SNAPSHOT
+ ..
+
+ httpchannel-service-ifileit
+ com.rogiel.httpchannel.services
+ HttpChannel/Service/iFileIt
+ Provides download and upload access to ifile.it
+
\ No newline at end of file
diff --git a/httpchannel-service/httpchannel-service-ifileit/src/main/java/com/rogiel/httpchannel/service/ifile/IFileService.java b/httpchannel-service/httpchannel-service-ifileit/src/main/java/com/rogiel/httpchannel/service/ifile/IFileService.java
new file mode 100644
index 0000000..6834159
--- /dev/null
+++ b/httpchannel-service/httpchannel-service-ifileit/src/main/java/com/rogiel/httpchannel/service/ifile/IFileService.java
@@ -0,0 +1,160 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package com.rogiel.httpchannel.service.ifile;
+
+import java.io.IOException;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.Future;
+import java.util.regex.Pattern;
+
+import com.rogiel.httpchannel.service.AbstractHttpService;
+import com.rogiel.httpchannel.service.AbstractUploader;
+import com.rogiel.httpchannel.service.CapabilityMatrix;
+import com.rogiel.httpchannel.service.Service;
+import com.rogiel.httpchannel.service.ServiceID;
+import com.rogiel.httpchannel.service.ServiceMode;
+import com.rogiel.httpchannel.service.UploadChannel;
+import com.rogiel.httpchannel.service.UploadService;
+import com.rogiel.httpchannel.service.Uploader;
+import com.rogiel.httpchannel.service.UploaderCapability;
+import com.rogiel.httpchannel.service.channel.LinkedUploadChannel;
+import com.rogiel.httpchannel.service.channel.LinkedUploadChannel.LinkedUploadChannelCloseCallback;
+import com.rogiel.httpchannel.service.config.NullUploaderConfiguration;
+import com.rogiel.httpchannel.util.htmlparser.HTMLPage;
+
+/**
+ * This service handles login, upload and download to HotFile.com.
+ *
+ * @author Rogiel
+ * @since 1.0
+ */
+public class IFileService extends AbstractHttpService implements Service,
+ UploadService {
+ /**
+ * This service ID
+ */
+ public static final ServiceID SERVICE_ID = ServiceID.create("ifileit");
+
+ private static final Pattern UPLOAD_URI_PATTERN = Pattern
+ .compile("http://i[0-9]+\\.ifile\\.it/upload\\?response=redirect");
+
+ private static final Pattern DOWNLOAD_URI_PATTERN = Pattern
+ .compile("http://ifile\\.it/[a-z0-9]{7}/.*");
+
+ @Override
+ public ServiceID getServiceID() {
+ return SERVICE_ID;
+ }
+
+ @Override
+ public int getMajorVersion() {
+ return 1;
+ }
+
+ @Override
+ public int getMinorVersion() {
+ return 0;
+ }
+
+ @Override
+ public CapabilityMatrix getPossibleServiceModes() {
+ return new CapabilityMatrix(ServiceMode.UNAUTHENTICATED,
+ ServiceMode.NON_PREMIUM, ServiceMode.PREMIUM);
+ }
+
+ @Override
+ public Uploader getUploader(String filename,
+ long filesize, NullUploaderConfiguration configuration) {
+ return new UploaderImpl(filename, filesize, configuration);
+ }
+
+ @Override
+ public Uploader getUploader(String filename,
+ long filesize) {
+ return getUploader(filename, filesize, newUploaderConfiguration());
+ }
+
+ @Override
+ public NullUploaderConfiguration newUploaderConfiguration() {
+ return NullUploaderConfiguration.SHARED_INSTANCE;
+ }
+
+ @Override
+ public long getMaximumFilesize() {
+ return 1 * 1024 * 1024 * 1024;
+ }
+
+ @Override
+ public String[] getSupportedExtensions() {
+ return null;
+ }
+
+ @Override
+ public CapabilityMatrix getUploadCapabilities() {
+ return new CapabilityMatrix(
+ UploaderCapability.UNAUTHENTICATED_UPLOAD,
+ UploaderCapability.NON_PREMIUM_ACCOUNT_UPLOAD,
+ UploaderCapability.PREMIUM_ACCOUNT_UPLOAD);
+ }
+
+ protected class UploaderImpl extends
+ AbstractUploader implements
+ Uploader,
+ LinkedUploadChannelCloseCallback {
+ private Future uploadFuture;
+
+ public UploaderImpl(String filename, long filesize,
+ NullUploaderConfiguration configuration) {
+ super(IFileService.this, filename, filesize, configuration);
+ }
+
+ @Override
+ public UploadChannel openChannel() throws IOException {
+ logger.debug("Starting upload to ifile.it");
+ final HTMLPage page = get("http://ifile.it/upload-classic.html")
+ .asPage();
+ final String action = page.findFormAction(UPLOAD_URI_PATTERN);
+
+ logger.debug("Upload URI is {}", action);
+
+ final LinkedUploadChannel channel = createLinkedChannel(this);
+
+ uploadFuture = multipartPost(action).parameter("Filedata", channel)
+ .asPageAsync();
+ return waitChannelLink(channel);
+ }
+
+ @Override
+ public String finish() throws IOException {
+ try {
+ return uploadFuture.get().getInputValue(DOWNLOAD_URI_PATTERN);
+ } catch (InterruptedException e) {
+ return null;
+ } catch (ExecutionException e) {
+ throw (IOException) e.getCause();
+ }
+ }
+ }
+
+ @Override
+ public String toString() {
+ return this.getClass().getSimpleName() + " " + getMajorVersion() + "."
+ + getMinorVersion();
+ }
+}
diff --git a/httpchannel-service/httpchannel-service-ifileit/src/test/java/com/rogiel/httpchannel/service/ifile/IFileServiceTest.java b/httpchannel-service/httpchannel-service-ifileit/src/test/java/com/rogiel/httpchannel/service/ifile/IFileServiceTest.java
new file mode 100644
index 0000000..ff02e73
--- /dev/null
+++ b/httpchannel-service/httpchannel-service-ifileit/src/test/java/com/rogiel/httpchannel/service/ifile/IFileServiceTest.java
@@ -0,0 +1,70 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package com.rogiel.httpchannel.service.ifile;
+
+import static org.junit.Assert.assertEquals;
+
+import java.io.IOException;
+import java.nio.channels.SeekableByteChannel;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+
+import junit.framework.Assert;
+
+import org.junit.Before;
+import org.junit.Test;
+
+import com.rogiel.httpchannel.service.ServiceID;
+import com.rogiel.httpchannel.service.UploadChannel;
+import com.rogiel.httpchannel.service.helper.UploadServices;
+import com.rogiel.httpchannel.util.ChannelUtils;
+
+public class IFileServiceTest {
+ private IFileService service;
+
+ @Before
+ public void setUp() throws Exception {
+ service = new IFileService();
+ }
+
+ @Test
+ public void testServiceId() {
+ assertEquals(ServiceID.create("hotfile"), service.getServiceID());
+ }
+
+ @Test
+ public void testNonLoguedInUploader() throws IOException {
+ final Path path = Paths
+ .get("../src/test/resources/upload-test-file.txt");
+ final UploadChannel channel = UploadServices.upload(service, path)
+ .openChannel();
+ final SeekableByteChannel inChannel = Files.newByteChannel(path);
+
+ try {
+ ChannelUtils.copy(inChannel, channel);
+ } finally {
+ inChannel.close();
+ channel.close();
+ }
+
+ System.out.println(channel.getDownloadLink());
+ Assert.assertNotNull(channel.getDownloadLink());
+ }
+}
diff --git a/httpchannel-service/httpchannel-service-megaupload/src/main/java/com/rogiel/httpchannel/service/megaupload/MegaUploadService.java b/httpchannel-service/httpchannel-service-megaupload/src/main/java/com/rogiel/httpchannel/service/megaupload/MegaUploadService.java
index bdef075..a5b8433 100644
--- a/httpchannel-service/httpchannel-service-megaupload/src/main/java/com/rogiel/httpchannel/service/megaupload/MegaUploadService.java
+++ b/httpchannel-service/httpchannel-service-megaupload/src/main/java/com/rogiel/httpchannel/service/megaupload/MegaUploadService.java
@@ -34,7 +34,6 @@ import com.rogiel.httpchannel.service.AbstractHttpDownloader;
import com.rogiel.httpchannel.service.AbstractHttpService;
import com.rogiel.httpchannel.service.AbstractUploader;
import com.rogiel.httpchannel.service.AccountDetails;
-import com.rogiel.httpchannel.service.AccountDetails.PremiumAccountDetails;
import com.rogiel.httpchannel.service.AuthenticationService;
import com.rogiel.httpchannel.service.Authenticator;
import com.rogiel.httpchannel.service.AuthenticatorCapability;
@@ -52,6 +51,7 @@ import com.rogiel.httpchannel.service.UploadChannel;
import com.rogiel.httpchannel.service.UploadService;
import com.rogiel.httpchannel.service.Uploader;
import com.rogiel.httpchannel.service.UploaderCapability;
+import com.rogiel.httpchannel.service.AccountDetails.PremiumAccountDetails;
import com.rogiel.httpchannel.service.channel.LinkedUploadChannel;
import com.rogiel.httpchannel.service.channel.LinkedUploadChannel.LinkedUploadChannelCloseCallback;
import com.rogiel.httpchannel.service.config.NullAuthenticatorConfiguration;
diff --git a/httpchannel-service/httpchannel-service-multiupload/src/main/java/com/rogiel/httpchannel/service/multiupload/MultiUploadService.java b/httpchannel-service/httpchannel-service-multiupload/src/main/java/com/rogiel/httpchannel/service/multiupload/MultiUploadService.java
index 943e46e..cb709a6 100644
--- a/httpchannel-service/httpchannel-service-multiupload/src/main/java/com/rogiel/httpchannel/service/multiupload/MultiUploadService.java
+++ b/httpchannel-service/httpchannel-service-multiupload/src/main/java/com/rogiel/httpchannel/service/multiupload/MultiUploadService.java
@@ -31,7 +31,6 @@ import com.rogiel.httpchannel.service.AbstractHttpDownloader;
import com.rogiel.httpchannel.service.AbstractHttpService;
import com.rogiel.httpchannel.service.AbstractUploader;
import com.rogiel.httpchannel.service.AccountDetails;
-import com.rogiel.httpchannel.service.AccountDetails.PremiumAccountDetails;
import com.rogiel.httpchannel.service.AuthenticationService;
import com.rogiel.httpchannel.service.Authenticator;
import com.rogiel.httpchannel.service.AuthenticatorCapability;
@@ -49,15 +48,16 @@ import com.rogiel.httpchannel.service.UploadChannel;
import com.rogiel.httpchannel.service.UploadService;
import com.rogiel.httpchannel.service.Uploader;
import com.rogiel.httpchannel.service.UploaderCapability;
+import com.rogiel.httpchannel.service.AccountDetails.PremiumAccountDetails;
import com.rogiel.httpchannel.service.channel.LinkedUploadChannel;
import com.rogiel.httpchannel.service.channel.LinkedUploadChannel.LinkedUploadChannelCloseCallback;
import com.rogiel.httpchannel.service.config.NullAuthenticatorConfiguration;
import com.rogiel.httpchannel.service.config.NullDownloaderConfiguration;
+import com.rogiel.httpchannel.service.exception.AuthenticationInvalidCredentialException;
import com.rogiel.httpchannel.service.exception.DownloadLimitExceededException;
import com.rogiel.httpchannel.service.exception.DownloadLinkNotFoundException;
import com.rogiel.httpchannel.service.exception.DownloadNotAuthorizedException;
import com.rogiel.httpchannel.service.exception.DownloadNotResumableException;
-import com.rogiel.httpchannel.service.exception.AuthenticationInvalidCredentialException;
import com.rogiel.httpchannel.service.multiupload.MultiUploadUploaderConfiguration.MultiUploadMirrorService;
import com.rogiel.httpchannel.util.PatternUtils;
import com.rogiel.httpchannel.util.htmlparser.HTMLPage;
diff --git a/httpchannel-service/httpchannel-service-uploadhere/src/main/java/com/rogiel/httpchannel/service/uploadhere/UploadHereService.java b/httpchannel-service/httpchannel-service-uploadhere/src/main/java/com/rogiel/httpchannel/service/uploadhere/UploadHereService.java
index 3e886c6..7a25a82 100644
--- a/httpchannel-service/httpchannel-service-uploadhere/src/main/java/com/rogiel/httpchannel/service/uploadhere/UploadHereService.java
+++ b/httpchannel-service/httpchannel-service-uploadhere/src/main/java/com/rogiel/httpchannel/service/uploadhere/UploadHereService.java
@@ -32,7 +32,6 @@ import com.rogiel.httpchannel.service.AbstractHttpDownloader;
import com.rogiel.httpchannel.service.AbstractHttpService;
import com.rogiel.httpchannel.service.AbstractUploader;
import com.rogiel.httpchannel.service.AccountDetails;
-import com.rogiel.httpchannel.service.AccountDetails.PremiumAccountDetails;
import com.rogiel.httpchannel.service.AuthenticationService;
import com.rogiel.httpchannel.service.Authenticator;
import com.rogiel.httpchannel.service.AuthenticatorCapability;
@@ -50,6 +49,7 @@ import com.rogiel.httpchannel.service.UploadChannel;
import com.rogiel.httpchannel.service.UploadService;
import com.rogiel.httpchannel.service.Uploader;
import com.rogiel.httpchannel.service.UploaderCapability;
+import com.rogiel.httpchannel.service.AccountDetails.PremiumAccountDetails;
import com.rogiel.httpchannel.service.channel.LinkedUploadChannel;
import com.rogiel.httpchannel.service.channel.LinkedUploadChannel.LinkedUploadChannelCloseCallback;
import com.rogiel.httpchannel.service.config.NullAuthenticatorConfiguration;
diff --git a/httpchannel-service/httpchannel-service-uploadking/src/main/java/com/rogiel/httpchannel/service/uploadking/UploadKingService.java b/httpchannel-service/httpchannel-service-uploadking/src/main/java/com/rogiel/httpchannel/service/uploadking/UploadKingService.java
index 8753cfb..79aa16d 100644
--- a/httpchannel-service/httpchannel-service-uploadking/src/main/java/com/rogiel/httpchannel/service/uploadking/UploadKingService.java
+++ b/httpchannel-service/httpchannel-service-uploadking/src/main/java/com/rogiel/httpchannel/service/uploadking/UploadKingService.java
@@ -32,7 +32,6 @@ import com.rogiel.httpchannel.service.AbstractHttpDownloader;
import com.rogiel.httpchannel.service.AbstractHttpService;
import com.rogiel.httpchannel.service.AbstractUploader;
import com.rogiel.httpchannel.service.AccountDetails;
-import com.rogiel.httpchannel.service.AccountDetails.PremiumAccountDetails;
import com.rogiel.httpchannel.service.AuthenticationService;
import com.rogiel.httpchannel.service.Authenticator;
import com.rogiel.httpchannel.service.AuthenticatorCapability;
@@ -50,6 +49,7 @@ import com.rogiel.httpchannel.service.UploadChannel;
import com.rogiel.httpchannel.service.UploadService;
import com.rogiel.httpchannel.service.Uploader;
import com.rogiel.httpchannel.service.UploaderCapability;
+import com.rogiel.httpchannel.service.AccountDetails.PremiumAccountDetails;
import com.rogiel.httpchannel.service.channel.LinkedUploadChannel;
import com.rogiel.httpchannel.service.channel.LinkedUploadChannel.LinkedUploadChannelCloseCallback;
import com.rogiel.httpchannel.service.config.NullAuthenticatorConfiguration;
diff --git a/httpchannel-service/httpchannel-service-wupload/src/main/java/com/rogiel/httpchannel/service/wupload/WUploadService.java b/httpchannel-service/httpchannel-service-wupload/src/main/java/com/rogiel/httpchannel/service/wupload/WUploadService.java
index c8ae1f5..5181c91 100644
--- a/httpchannel-service/httpchannel-service-wupload/src/main/java/com/rogiel/httpchannel/service/wupload/WUploadService.java
+++ b/httpchannel-service/httpchannel-service-wupload/src/main/java/com/rogiel/httpchannel/service/wupload/WUploadService.java
@@ -28,7 +28,6 @@ import com.rogiel.httpchannel.service.AbstractAuthenticator;
import com.rogiel.httpchannel.service.AbstractHttpService;
import com.rogiel.httpchannel.service.AbstractUploader;
import com.rogiel.httpchannel.service.AccountDetails;
-import com.rogiel.httpchannel.service.AccountDetails.PremiumAccountDetails;
import com.rogiel.httpchannel.service.AuthenticationService;
import com.rogiel.httpchannel.service.Authenticator;
import com.rogiel.httpchannel.service.AuthenticatorCapability;
@@ -41,6 +40,7 @@ import com.rogiel.httpchannel.service.UploadChannel;
import com.rogiel.httpchannel.service.UploadService;
import com.rogiel.httpchannel.service.Uploader;
import com.rogiel.httpchannel.service.UploaderCapability;
+import com.rogiel.httpchannel.service.AccountDetails.PremiumAccountDetails;
import com.rogiel.httpchannel.service.channel.LinkedUploadChannel;
import com.rogiel.httpchannel.service.channel.LinkedUploadChannel.LinkedUploadChannelCloseCallback;
import com.rogiel.httpchannel.service.config.NullAuthenticatorConfiguration;
diff --git a/httpchannel-service/pom.xml b/httpchannel-service/pom.xml
index a8467de..4ab50c8 100644
--- a/httpchannel-service/pom.xml
+++ b/httpchannel-service/pom.xml
@@ -24,6 +24,7 @@
httpchannel-service-zshare
httpchannel-service-4shared
httpchannel-service-2shared
+ httpchannel-service-ifile
diff --git a/httpchannel-util/src/main/java/com/rogiel/httpchannel/captcha/ReCaptchaExtractor.java b/httpchannel-util/src/main/java/com/rogiel/httpchannel/captcha/ReCaptchaExtractor.java
index b59534d..fd2e0a1 100644
--- a/httpchannel-util/src/main/java/com/rogiel/httpchannel/captcha/ReCaptchaExtractor.java
+++ b/httpchannel-util/src/main/java/com/rogiel/httpchannel/captcha/ReCaptchaExtractor.java
@@ -22,6 +22,7 @@ import java.io.IOException;
import java.net.URI;
import java.util.regex.Pattern;
+import com.rogiel.httpchannel.captcha.ImageCaptcha;
import com.rogiel.httpchannel.http.HttpContext;
import com.rogiel.httpchannel.util.PatternUtils;
import com.rogiel.httpchannel.util.htmlparser.HTMLPage;
diff --git a/httpchannel-util/src/main/java/com/rogiel/httpchannel/http/HttpContext.java b/httpchannel-util/src/main/java/com/rogiel/httpchannel/http/HttpContext.java
index b86a22c..d266f88 100644
--- a/httpchannel-util/src/main/java/com/rogiel/httpchannel/http/HttpContext.java
+++ b/httpchannel-util/src/main/java/com/rogiel/httpchannel/http/HttpContext.java
@@ -22,8 +22,13 @@ import java.net.URI;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
+import org.apache.http.HttpRequest;
+import org.apache.http.HttpResponse;
+import org.apache.http.ProtocolException;
import org.apache.http.client.HttpClient;
+import org.apache.http.client.params.ClientParamBean;
import org.apache.http.impl.client.DefaultHttpClient;
+import org.apache.http.impl.client.DefaultRedirectStrategy;
/**
* @author Rogiel
@@ -35,7 +40,29 @@ public class HttpContext {
/**
* The {@link HttpClient} instance for this service
*/
- protected DefaultHttpClient client = new DefaultHttpClient();
+ protected final DefaultHttpClient client = new DefaultHttpClient();
+
+ protected final ClientParamBean params;
+
+ public HttpContext() {
+ // default configuration
+ params = new ClientParamBean(client.getParams());
+ params.setHandleRedirects(true);
+ params.setAllowCircularRedirects(true);
+ params.setRejectRelativeRedirect(false);
+ params.setMaxRedirects(10);
+
+ // browser behavior
+ client.setRedirectStrategy(new DefaultRedirectStrategy() {
+ @Override
+ public boolean isRedirected(HttpRequest request,
+ HttpResponse response,
+ org.apache.http.protocol.HttpContext context)
+ throws ProtocolException {
+ return response.containsHeader("Location");
+ }
+ });
+ }
public GetRequest get(String uri) {
return new GetRequest(this, uri);
diff --git a/httpchannel-util/src/main/java/com/rogiel/httpchannel/http/PostMultipartRequest.java b/httpchannel-util/src/main/java/com/rogiel/httpchannel/http/PostMultipartRequest.java
index 123018d..6220347 100644
--- a/httpchannel-util/src/main/java/com/rogiel/httpchannel/http/PostMultipartRequest.java
+++ b/httpchannel-util/src/main/java/com/rogiel/httpchannel/http/PostMultipartRequest.java
@@ -21,6 +21,7 @@ package com.rogiel.httpchannel.http;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
+import org.apache.http.Header;
import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.mime.MultipartEntity;
@@ -35,12 +36,20 @@ public class PostMultipartRequest extends PostRequest {
public PostMultipartRequest(HttpContext ctx, String uri) {
super(ctx, uri);
- this.entity = new MultipartEntity();
+ this.entity = new MultipartEntity() {
+ @Override
+ protected String generateBoundary() {
+ return "---------------------------9849436581144108930470211272";
+ }
+ };
}
@Override
public HttpResponse request() throws IOException {
final HttpPost post = new HttpPost(uri);
+ for (final Header header : headers) {
+ post.addHeader(header);
+ }
post.setEntity(entity);
return ctx.client.execute(post);
}
diff --git a/httpchannel-util/src/main/java/com/rogiel/httpchannel/http/PostRequest.java b/httpchannel-util/src/main/java/com/rogiel/httpchannel/http/PostRequest.java
index 1c8b002..973f89d 100644
--- a/httpchannel-util/src/main/java/com/rogiel/httpchannel/http/PostRequest.java
+++ b/httpchannel-util/src/main/java/com/rogiel/httpchannel/http/PostRequest.java
@@ -23,6 +23,7 @@ import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.List;
+import org.apache.http.Header;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.entity.UrlEncodedFormEntity;
@@ -39,6 +40,9 @@ public class PostRequest extends Request {
@Override
public HttpResponse request() throws IOException {
final HttpPost post = new HttpPost(uri);
+ for(final Header header : headers) {
+ post.addHeader(header);
+ }
post.setEntity(new UrlEncodedFormEntity(params));
return ctx.client.execute(post);
}
diff --git a/httpchannel-util/src/main/java/com/rogiel/httpchannel/http/Request.java b/httpchannel-util/src/main/java/com/rogiel/httpchannel/http/Request.java
index 5581bce..95016bf 100644
--- a/httpchannel-util/src/main/java/com/rogiel/httpchannel/http/Request.java
+++ b/httpchannel-util/src/main/java/com/rogiel/httpchannel/http/Request.java
@@ -20,11 +20,15 @@ package com.rogiel.httpchannel.http;
import java.io.IOException;
import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.List;
import java.util.concurrent.Callable;
import java.util.concurrent.Future;
+import org.apache.http.Header;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
+import org.apache.http.message.BasicHeader;
import org.json.simple.parser.JSONParser;
import org.json.simple.parser.ParseException;
@@ -34,6 +38,8 @@ import com.rogiel.httpchannel.util.htmlparser.HTMLPage;
public abstract class Request {
private static final JSONParser jsonParser = new JSONParser();
+ protected final List headers = new ArrayList<>();
+
protected final HttpContext ctx;
protected final String uri;
@@ -41,6 +47,11 @@ public abstract class Request {
this.ctx = ctx;
this.uri = uri;
}
+
+ public Request header(String name, String value) {
+ headers.add(new BasicHeader(name, value));
+ return this;
+ }
public abstract HttpResponse request() throws IOException;
diff --git a/httpchannel-util/src/main/java/com/rogiel/httpchannel/service/AbstractAccountDetails.java b/httpchannel-util/src/main/java/com/rogiel/httpchannel/service/AbstractAccountDetails.java
index 664d539..32cb187 100644
--- a/httpchannel-util/src/main/java/com/rogiel/httpchannel/service/AbstractAccountDetails.java
+++ b/httpchannel-util/src/main/java/com/rogiel/httpchannel/service/AbstractAccountDetails.java
@@ -3,6 +3,9 @@
*/
package com.rogiel.httpchannel.service;
+import com.rogiel.httpchannel.service.AccountDetails;
+import com.rogiel.httpchannel.service.AuthenticationService;
+
/**
* @author Rogiel
*
diff --git a/httpchannel-util/src/main/java/com/rogiel/httpchannel/service/AbstractAuthenticator.java b/httpchannel-util/src/main/java/com/rogiel/httpchannel/service/AbstractAuthenticator.java
index 5e3b020..90cae07 100644
--- a/httpchannel-util/src/main/java/com/rogiel/httpchannel/service/AbstractAuthenticator.java
+++ b/httpchannel-util/src/main/java/com/rogiel/httpchannel/service/AbstractAuthenticator.java
@@ -18,6 +18,8 @@
*/
package com.rogiel.httpchannel.service;
+import com.rogiel.httpchannel.service.Authenticator;
+import com.rogiel.httpchannel.service.Credential;
import com.rogiel.httpchannel.service.Authenticator.AuthenticatorConfiguration;
/**
diff --git a/httpchannel-util/src/main/java/com/rogiel/httpchannel/service/AbstractDownloader.java b/httpchannel-util/src/main/java/com/rogiel/httpchannel/service/AbstractDownloader.java
index d64e905..7e3c659 100644
--- a/httpchannel-util/src/main/java/com/rogiel/httpchannel/service/AbstractDownloader.java
+++ b/httpchannel-util/src/main/java/com/rogiel/httpchannel/service/AbstractDownloader.java
@@ -22,6 +22,10 @@ import java.io.IOException;
import java.io.InputStream;
import java.net.URI;
+import com.rogiel.httpchannel.service.DownloadChannel;
+import com.rogiel.httpchannel.service.DownloadListener;
+import com.rogiel.httpchannel.service.DownloadService;
+import com.rogiel.httpchannel.service.Downloader;
import com.rogiel.httpchannel.service.Downloader.DownloaderConfiguration;
import com.rogiel.httpchannel.service.channel.InputStreamDownloadChannel;
import com.rogiel.httpchannel.service.exception.DownloadLimitExceededException;
diff --git a/httpchannel-util/src/main/java/com/rogiel/httpchannel/service/AbstractHttpDownloader.java b/httpchannel-util/src/main/java/com/rogiel/httpchannel/service/AbstractHttpDownloader.java
index dcfb8f9..92ce12d 100644
--- a/httpchannel-util/src/main/java/com/rogiel/httpchannel/service/AbstractHttpDownloader.java
+++ b/httpchannel-util/src/main/java/com/rogiel/httpchannel/service/AbstractHttpDownloader.java
@@ -29,6 +29,9 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.rogiel.httpchannel.http.Request;
+import com.rogiel.httpchannel.service.DownloadListener;
+import com.rogiel.httpchannel.service.DownloadService;
+import com.rogiel.httpchannel.service.Downloader;
import com.rogiel.httpchannel.service.Downloader.DownloaderConfiguration;
import com.rogiel.httpchannel.service.channel.InputStreamDownloadChannel;
import com.rogiel.httpchannel.service.exception.DownloadLinkNotFoundException;
diff --git a/httpchannel-util/src/main/java/com/rogiel/httpchannel/service/AbstractHttpService.java b/httpchannel-util/src/main/java/com/rogiel/httpchannel/service/AbstractHttpService.java
index d3d275a..2416c00 100644
--- a/httpchannel-util/src/main/java/com/rogiel/httpchannel/service/AbstractHttpService.java
+++ b/httpchannel-util/src/main/java/com/rogiel/httpchannel/service/AbstractHttpService.java
@@ -25,6 +25,8 @@ import com.rogiel.httpchannel.http.GetRequest;
import com.rogiel.httpchannel.http.HttpContext;
import com.rogiel.httpchannel.http.PostMultipartRequest;
import com.rogiel.httpchannel.http.PostRequest;
+import com.rogiel.httpchannel.service.AbstractService;
+import com.rogiel.httpchannel.service.Service;
import com.rogiel.httpchannel.service.channel.LinkedUploadChannel;
import com.rogiel.httpchannel.service.exception.UploadServiceException;
diff --git a/httpchannel-util/src/main/java/com/rogiel/httpchannel/service/AbstractUploader.java b/httpchannel-util/src/main/java/com/rogiel/httpchannel/service/AbstractUploader.java
index 8cdd085..a87959d 100644
--- a/httpchannel-util/src/main/java/com/rogiel/httpchannel/service/AbstractUploader.java
+++ b/httpchannel-util/src/main/java/com/rogiel/httpchannel/service/AbstractUploader.java
@@ -18,6 +18,8 @@
*/
package com.rogiel.httpchannel.service;
+import com.rogiel.httpchannel.service.UploadService;
+import com.rogiel.httpchannel.service.Uploader;
import com.rogiel.httpchannel.service.Uploader.UploaderConfiguration;
import com.rogiel.httpchannel.service.channel.LinkedUploadChannel;
import com.rogiel.httpchannel.service.channel.LinkedUploadChannel.LinkedUploadChannelCloseCallback;