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;