166
166
PayloadRaw* outpayload = new PayloadRaw;
167
167
if(desc) outpayload->Insert(desc,0);
168
168
outmsg.Payload(outpayload);
169
if(desc) return MCC_Status(GENERIC_ERROR,"HTTP",desc);
170
return MCC_Status(GENERIC_ERROR,"HTTP");
173
static MCC_Status make_raw_fault(Message& outmsg,const MCC_Status& desc) {
174
PayloadRaw* outpayload = new PayloadRaw;
175
std::string errstr = (std::string)desc;
176
if(!errstr.empty()) outpayload->Insert(errstr.c_str(),0);
172
180
static void parse_http_range(PayloadHTTP& http,Message& msg) {
365
373
// generate new Raw payload to pass further through chain.
366
374
// TODO: do not create new object - use or acqure same one.
367
375
// Extracting payload
368
if(!inmsg.Payload()) return make_raw_fault(outmsg);
376
if(!inmsg.Payload()) return make_raw_fault(outmsg,"Notihing to send");
369
377
PayloadRawInterface* inpayload = NULL;
371
379
inpayload = dynamic_cast<PayloadRawInterface*>(inmsg.Payload());
372
380
} catch(std::exception& e) { };
373
if(!inpayload) return make_raw_fault(outmsg);
381
if(!inpayload) return make_raw_fault(outmsg,"Notihing to send");
374
382
// Making HTTP request
375
383
// Use attributes which higher level MCC may have produced for HTTP
376
384
std::string http_method = inmsg.Attributes()->get("HTTP:METHOD");
399
407
MCCInterface* next = Next();
400
if(!next) return make_raw_fault(outmsg);
408
if(!next) return make_raw_fault(outmsg,"Chain has no continuation");
401
409
Message nextoutmsg = outmsg; nextoutmsg.Payload(NULL);
402
410
MCC_Status ret = next->process(nextinmsg,nextoutmsg);
403
411
// Do checks and process response - supported response so far is stream
404
412
// Generated result is HTTP payload with Raw and Stream interfaces
406
414
if(nextoutmsg.Payload()) delete nextoutmsg.Payload();
407
return make_raw_fault(outmsg);
415
return make_raw_fault(outmsg,ret);
409
if(!nextoutmsg.Payload()) return make_raw_fault(outmsg);
417
if(!nextoutmsg.Payload()) return make_raw_fault(outmsg,"No response received by HTTP layer");
410
418
PayloadStreamInterface* retpayload = NULL;
412
420
retpayload = dynamic_cast<PayloadStreamInterface*>(nextoutmsg.Payload());
413
421
} catch(std::exception& e) { };
414
if(!retpayload) { delete nextoutmsg.Payload(); return make_raw_fault(outmsg); };
422
if(!retpayload) { delete nextoutmsg.Payload(); return make_raw_fault(outmsg,"HTTP layer got something that is not stream"); };
415
423
// Stream retpayload becomes owned by outpayload. This is needed because
416
424
// HTTP payload may postpone extracting information from stream till demanded.
417
425
PayloadHTTP* outpayload = new PayloadHTTP(*retpayload,true);
418
if(!outpayload) { delete retpayload; return make_raw_fault(outmsg); };
419
if(!(*outpayload)) { delete outpayload; return make_raw_fault(outmsg); };
428
return make_raw_fault(outmsg,"Returned payload is not recognized as HTTP");
431
std::string errstr = "Returned payload is not recognized as HTTP: "+outpayload->GetError();
433
return make_raw_fault(outmsg,errstr.c_str());
420
435
// Check for closed connection during response - not suitable in client mode
421
if(outpayload->Method() == "END") { delete outpayload; return make_raw_fault(outmsg); };
436
if(outpayload->Method() == "END") {
437
delete outpayload; return make_raw_fault(outmsg,"Connection was closed");
422
439
outmsg = nextoutmsg;
423
440
// Payload returned by next.process is not destroyed here because
424
441
// it is now owned by outpayload.