Github user ijokarumawak commented on a diff in the pull request:

    https://github.com/apache/nifi/pull/2991#discussion_r224003310
  
    --- Diff: 
nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/main/java/org/apache/nifi/processors/standard/HandleHttpRequest.java
 ---
    @@ -521,161 +565,223 @@ public void onTrigger(final ProcessContext context, 
final ProcessSession session
     
             final long start = System.nanoTime();
             final HttpServletRequest request = container.getRequest();
    -        FlowFile flowFile = session.create();
    -        try (OutputStream flowFileOut = session.write(flowFile)) {
    -            StreamUtils.copy(request.getInputStream(), flowFileOut);
    -        } catch (final IOException e) {
    -            // There may be many reasons which can produce an IOException 
on the HTTP stream and in some of them, eg.
    -            // bad requests, the connection to the client is not closed. 
In order to address also these cases, we try
    -            // and answer with a BAD_REQUEST, which lets the client know 
that the request has not been correctly
    -            // processed and makes it aware that the connection can be 
closed.
    -            getLogger().error("Failed to receive content from HTTP Request 
from {} due to {}",
    -                    new Object[]{request.getRemoteAddr(), e});
    -            session.remove(flowFile);
     
    -            try {
    -                HttpServletResponse response = container.getResponse();
    -                response.sendError(Status.BAD_REQUEST.getStatusCode());
    -                response.flushBuffer();
    -                container.getContext().complete();
    -            } catch (final IOException ioe) {
    -                getLogger().warn("Failed to send HTTP response to {} due 
to {}",
    -                        new Object[]{request.getRemoteAddr(), ioe});
    +        if (!Strings.isNullOrEmpty(request.getContentType()) && 
request.getContentType().contains(MIME_TYPE__MULTIPART_FORM_DATA)) {
    +          final long requestMaxSize = 
context.getProperty(MULTIPART_REQUEST_MAX_SIZE).asDataSize(DataUnit.B).longValue();
    +          final int readBufferSize = 
context.getProperty(MULTIPART_READ_BUFFER_SIZE).asDataSize(DataUnit.B).intValue();
    +          String tempDir = System.getProperty("java.io.tmpdir");
    +          request.setAttribute(Request.__MULTIPART_CONFIG_ELEMENT, new 
MultipartConfigElement(tempDir, requestMaxSize, requestMaxSize, 
readBufferSize));
    +          try {
    +            List<Part> parts = ImmutableList.copyOf(request.getParts());
    +            int allPartsCount = parts.size();
    +            final String contextIdentifier = UUID.randomUUID().toString();
    +            for (int i = 0; i < allPartsCount; i++) {
    +              Part part = parts.get(i);
    +              FlowFile flowFile = session.create();
    +              try (OutputStream flowFileOut = session.write(flowFile)) {
    +                StreamUtils.copy(part.getInputStream(), flowFileOut);
    +              } catch (IOException e) {
    +                handleFlowContentStreamingError(session, container, 
request, Optional.of(flowFile), e);
    +                return;
    +              }
    +              flowFile = savePartAttributes(context, session, part, 
flowFile, i, allPartsCount);
    +              flowFile = saveRequestAttributes(context, session, request, 
flowFile, contextIdentifier);
    +              forwardFlowFile(context, session, container, start, request, 
flowFile, i == 0);
    --- End diff --
    
    What if `contextMap.register()` method returns `false`? I haven't test 
that, but current code seems to keep processing remaining multi-part. The 
register part should be a separated method and return if the request is 
successfully registered, so that this `allPartsCount` loop can break.
    
    Adding a unit test case to confirm that situation would be helpful.


---

Reply via email to