+ p = z_get_HTTP_Response(o, 200);
+ hres = p->u.HTTP_Response;
+
+ ret = z_soap_codec_enc(assoc->encode, &soap_package,
+ &hres->content_buf, &hres->content_len,
+ soap_handlers, charset);
+ if (!charset)
+ z_HTTP_header_add(o, &hres->headers, "Content-Type", "text/xml");
+ else
+ {
+ char ctype[60];
+ strcpy(ctype, "text/xml; charset=");
+ strcat(ctype, charset);
+ z_HTTP_header_add(o, &hres->headers, "Content-Type", ctype);
+ }
+
+ }
+ else
+ {
+ Z_SRW_PDU *res = yaz_srw_get(o, Z_SRW_explain_response);
+ Z_SRW_PDU *sr = yaz_srw_get(o, Z_SRW_explain_request);
+
+ srw_bend_explain(assoc, req, sr->u.explain_request,
+ res->u.explain_response);
+
+ if (res->u.explain_response->explainData_buf)
+ {
+ soap_package = odr_malloc(o, sizeof(*soap_package));
+ soap_package->which = Z_SOAP_generic;
+
+ soap_package->u.generic =
+ odr_malloc(o, sizeof(*soap_package->u.generic));
+
+ soap_package->u.generic->p = res;
+ soap_package->u.generic->ns = soap_handlers[0].ns;
+ soap_package->u.generic->no = 0;
+
+ soap_package->ns = "SRU";
+
+ p = z_get_HTTP_Response(o, 200);
+ hres = p->u.HTTP_Response;
+
+ ret = z_soap_codec_enc(assoc->encode, &soap_package,
+ &hres->content_buf, &hres->content_len,
+ soap_handlers, charset);
+ if (!charset)
+ z_HTTP_header_add(o, &hres->headers, "Content-Type", "text/xml");
+ else
+ {
+ char ctype[60];
+ strcpy(ctype, "text/xml; charset=");
+ strcat(ctype, charset);
+ z_HTTP_header_add(o, &hres->headers, "Content-Type",
+ ctype);
+ }
+ }
+ }
+#endif
+#ifdef DOCDIR
+ if (strlen(hreq->path) >= 5 && strlen(hreq->path) < 80 &&
+ !memcmp(hreq->path, "/doc/", 5))
+ {
+ FILE *f;
+ char fpath[120];
+
+ strcpy(fpath, DOCDIR);
+ strcat(fpath, hreq->path+4);
+ f = fopen(fpath, "rb");
+ if (f) {
+ struct stat sbuf;
+ if (fstat(fileno(f), &sbuf) || !S_ISREG(sbuf.st_mode))
+ {
+ fclose(f);
+ f = 0;
+ }
+ }
+ if (f)
+ {
+ long sz;
+ fseek(f, 0L, SEEK_END);
+ sz = ftell(f);
+ if (sz >= 0 && sz < 500000)
+ {
+ const char *ctype = "application/octet-stream";
+ const char *cp;
+
+ p = z_get_HTTP_Response(o, 200);
+ hres = p->u.HTTP_Response;
+ hres->content_buf = (char *) odr_malloc(o, sz + 1);
+ hres->content_len = sz;
+ fseek(f, 0L, SEEK_SET);
+ fread(hres->content_buf, 1, sz, f);
+ if ((cp = strrchr(fpath, '.'))) {
+ cp++;
+ if (!strcmp(cp, "png"))
+ ctype = "image/png";
+ else if (!strcmp(cp, "gif"))
+ ctype = "image/gif";
+ else if (!strcmp(cp, "xml"))
+ ctype = "text/xml";
+ else if (!strcmp(cp, "html"))
+ ctype = "text/html";
+ }
+ z_HTTP_header_add(o, &hres->headers, "Content-Type", ctype);
+ }
+ fclose(f);
+ }
+ }