0

I'm using Camel-http4 because I simply need a producer, not expose a webservice. I simply need to push files up to an HTTP server, so this is a client implementation. the problem I am facing is the attempt to post returns an error.

CamelHttpResponseCode=403, CamelHttpResponseText=Forbidden

{"timestamp":"2018-05-03T20:36:20.571","traceId":"","path":"[POST] https://apm-query-svc-prod.apm-api.com/v2/t_series/upload%2520?throwExceptionOnFailure=false","errors":[{"httpStatusCode":"FORBIDDEN","code":"FORBIDDEN","message":"Failed to parse multipart servlet request; nested exception is java.io.IOException: org.apache.tomcat.util.http.fileupload.FileUploadException: the request was rejected because no multipart boundary was found","detail":null,"requestId":null}]}

Question, is there a way to do this with Camel-HTTP4 ? how is / can this be done? and thank you !!!

here is the route

<route 
    id="core.pr.upload.route"
    autoStartup="false" >
    <from uri="{{uploadEntranceEndpoint}}" />
    <process ref="customerEntitesProcessor" />
    <process ref="customerTokenProcessor" />
    <process ref="uploadProcessor" />
    <setHeader headerName="CamelHttpUri">
        <simple>${header.UPLOADURL}?throwExceptionOnFailure=false</simple>
    </setHeader>
    <setHeader headerName="CamelHttpMethod">
        <constant>POST</constant>
    </setHeader>
    <to uri="http4://apm-query-svc-prod.app-api.aws-usw02-pr.io:443/v2/t_series/upload?throwExceptionOnFailure=false" />
    <log message="After POSTING FILE: ${body}" loggingLevel="INFO"/>    
    <to uri="{{afteruploadLocation}}" />
</route>

here is the class, I simply set the headers up and the URI is overridden with the one provided by Exchange.HTTP_URI.

public class UploadProcessor implements Processor {

private static final Logger LOG = LoggerFactory.getLogger(UploadProcessor.class);

@Override
public void process(Exchange exchange) throws Exception {

    LOG.info("Entering Upload Processor ..." );

        final String tenant = (String)exchange.getIn().getHeader("TENANT");
        final String token = (String)exchange.getIn().getHeader("TOKEN");
        final String uploadUrl = (String)exchange.getIn().getHeader("UPLOADURL");
        final String custKey = (String)exchange.getIn().getHeader("CUSTKEY");

        LOG.info("TENANT: " + tenant);
        LOG.info("TOKEN: " + token);
        LOG.info("UPLOADURL: " + uploadUrl);
        LOG.info("CUSTKEY: " + custKey);

        LOG.info("Uploading File for CustKey: " + custKey + " and Tenant: " + tenant);          

        StringBuilder authHeader = new StringBuilder("Bearer "); 
        authHeader.append(token);           
        LOG.info("Authorization: " + authHeader.toString());

        exchange.setProperty("CamelCharsetName", "UTF-8");  //"CamelCharsetName" Exchange.CHARSET_NAME
        exchange.getIn().setHeader("CamelHttpCharacterEncoding", "UTF-8");   //"CamelHttpCharacterEncoding" Exchange.HTTP_CHARACTER_ENCODING
        exchange.getIn().setHeader("CamelAcceptContentType", "application/json");  //"CamelAcceptContentType" Exchange.ACCEPT_CONTENT_TYPE
        exchange.getIn().setHeader("CamelHttpUri", uploadUrl);  //"CamelHttpUri" Exchange.HTTP_URI
        exchange.getIn().setHeader("CamelHttpMethod", "POST");  //"CamelHttpMethod" Exchange.HTTP_METHOD
        exchange.getIn().setHeader("x-ge-csvformat", "ODB");
        exchange.getIn().setHeader("Tenant", tenant);
        exchange.getIn().setHeader("Content-Type", "multipart/form-data");  //"Content-Type" ; boundary=
        exchange.getIn().setHeader("Authorization", authHeader.toString());
        LOG.info("Exiting Upload Processor: Finish " );
    }

}

this is my first HTTP introduction, not familiar with the multipart boundary, I'm hoping there is a kind a simple solution to this. :) thank you !!!

The solution wasn't that difficult at all, here is the final based on Ralf's answer. thanks all! the hard part was finding the import packages and that it has a dependency. add to POM

<!-- https://mvnrepository.com/artifact/org.apache.httpcomponents/httpmime -->
<dependency>
    <groupId>org.apache.httpcomponents</groupId>
    <artifactId>httpmime</artifactId>
    <version>4.3.1</version>
</dependency>


import java.lang.StringBuilder;
import java.net.URLEncoder;
import java.util.Base64;
import java.io.File;

import org.apache.camel.Exchange;
import org.apache.camel.Message;
import org.apache.camel.Processor;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.apache.camel.LoggingLevel;
import org.apache.http.HttpEntity;
import org.apache.http.entity.mime.MultipartEntityBuilder;
public class UploadProcessor implements Processor {

    private static final Logger LOG = LoggerFactory.getLogger(UploadProcessor.class);

    @Override
    public void process(Exchange exchange) throws Exception {

        LOG.info("Entering Upload Processor ..." );

            final String tenant = (String)exchange.getIn().getHeader("TENANT");
            final String token = (String)exchange.getIn().getHeader("TOKEN");
            final String uploadUrl = (String)exchange.getIn().getHeader("UPLOADURL");
            final String custKey = (String)exchange.getIn().getHeader("CUSTKEY");

            LOG.info("TENANT: " + tenant);
            LOG.info("TOKEN: " + token);
            LOG.info("UPLOADURL: " + uploadUrl);
            LOG.info("CUSTKEY: " + custKey);

            LOG.info("Uploading File for CustKey: " + custKey + " and Tenant: " + tenant);          

            StringBuilder authHeader = new StringBuilder("Bearer "); 
            authHeader.append(token);           
            LOG.info("Authorization: " + authHeader.toString());

            exchange.setProperty("CamelCharsetName", "UTF-8");  //"CamelCharsetName" Exchange.CHARSET_NAME
            exchange.getIn().setHeader("CamelHttpCharacterEncoding", "UTF-8");   //"CamelHttpCharacterEncoding" Exchange.HTTP_CHARACTER_ENCODING
            exchange.getIn().setHeader("CamelAcceptContentType", "application/json");  //"CamelAcceptContentType" Exchange.ACCEPT_CONTENT_TYPE
            exchange.getIn().setHeader("CamelHttpUri", uploadUrl);  //"CamelHttpUri" Exchange.HTTP_URI
            exchange.getIn().setHeader("CamelHttpMethod", "POST");  //"CamelHttpMethod" Exchange.HTTP_METHOD
            exchange.getIn().setHeader("x-ge-csvformat", "ODB");
            exchange.getIn().setHeader("Tenant", tenant);
            exchange.getIn().setHeader("Authorization", authHeader.toString());

            // Process the file in the exchange body
            File file = exchange.getIn().getBody(File.class);
            String fileName = (String) exchange.getIn().getHeader(Exchange.FILE_NAME);
            LOG.info("fileName: " + fileName);

            MultipartEntityBuilder entity = MultipartEntityBuilder.create();
            entity.addBinaryBody("file", file);
            entity.addTextBody("name", fileName);

            exchange.getIn().setBody(entity.build());
            LOG.info("Exiting Upload Processor: Finish " );

        }
}
GLMills
  • 558
  • 1
  • 12
  • 37
  • You are setting the content type to `multipart/form-data` but what you are sending appears not to be a multipart message. You either need to adjust the content-type header or send the content according to the header. – Ralf May 04 '18 at 07:25
  • This [post](http://hilton.org.uk/blog/camel-multipart-form-data) might help you build the multipart message body. – Ralf May 04 '18 at 07:31
  • thank you Ralf, greatly appreciate your help. I'm trying to use the MultipartEntityBuilder but I cannot seem to locate the package anywhere, when I compile it give me,package org.apache.http.entity.mime does not exist - do you know anything about this? – GLMills May 04 '18 at 16:13
  • Ralf, found that I needed a maven dependency - this worked !!! thank you so much! – GLMills May 04 '18 at 19:13
  • FYI, `http4s` is a Scala web framework - it doesn't refer to http4 or https. Since your question doesn't seem to have anything to do with that library, I've removed that tag from the question (pending review). – Astrid May 07 '18 at 06:08
  • thanks Astrid, sorry, I'm still maturing, will get there. Ralf's answer solved my issue. thanks !!! – GLMills May 07 '18 at 13:02

0 Answers0