~ubuntu-branches/ubuntu/trusty/nordugrid-arc/trusty

« back to all changes in this revision

Viewing changes to src/hed/mcc/http/MCCHTTP.cpp

  • Committer: Package Import Robot
  • Author(s): Mattias Ellert
  • Date: 2012-12-13 16:41:31 UTC
  • mfrom: (3.1.11 sid)
  • Revision ID: package-import@ubuntu.com-20121213164131-wii0p2fcv7e3en93
Tags: 2.0.1-1
* 2.0.1 Release
* Drop patches accepted upstream

Show diffs side-by-side

added added

removed removed

Lines of Context:
166
166
  PayloadRaw* outpayload = new PayloadRaw;
167
167
  if(desc) outpayload->Insert(desc,0);
168
168
  outmsg.Payload(outpayload);
169
 
  return MCC_Status();
 
169
  if(desc) return MCC_Status(GENERIC_ERROR,"HTTP",desc);
 
170
  return MCC_Status(GENERIC_ERROR,"HTTP");
 
171
}
 
172
 
 
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);
 
177
  return desc;
170
178
}
171
179
 
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;
370
378
  try {
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");
397
405
 
398
406
  // Call next MCC
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
405
413
  if(!ret) {
406
414
    if(nextoutmsg.Payload()) delete nextoutmsg.Payload();
407
 
    return make_raw_fault(outmsg);
 
415
    return make_raw_fault(outmsg,ret);
408
416
  };
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;
411
419
  try {
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); };
 
426
  if(!outpayload) {
 
427
    delete retpayload;
 
428
    return make_raw_fault(outmsg,"Returned payload is not recognized as HTTP");
 
429
  };
 
430
  if(!(*outpayload)) {
 
431
    std::string errstr = "Returned payload is not recognized as HTTP: "+outpayload->GetError();
 
432
    delete outpayload;
 
433
    return make_raw_fault(outmsg,errstr.c_str());
 
434
  };
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");
 
438
  };
422
439
  outmsg = nextoutmsg;
423
440
  // Payload returned by next.process is not destroyed here because
424
441
  // it is now owned by outpayload.