static int glite_gsplugin_connect(struct soap *, const char *, const char *, int);
static int glite_gsplugin_close(struct soap *);
static int glite_gsplugin_accept(struct soap *, int, struct sockaddr *, int *);
+static int glite_gsplugin_posthdr(struct soap *soap, const char *key, const char *val);
int
soap->faccept = glite_gsplugin_accept;
soap->fsend = glite_gsplugin_send;
soap->frecv = glite_gsplugin_recv;
-
+ soap->fposthdr = glite_gsplugin_posthdr;
return SOAP_OK;
}
goto err;
}
+ return 0;
err:
pdprintf(("GSLITE_GSPLUGIN: glite_gsplugin_connect() error!\n"));
return SOAP_OK;
}
+
+static int http_send_header(struct soap *soap, const char *s) {
+ const char *t;
+
+ do {
+ t = strchr(s, '\n'); /* disallow \n in HTTP headers */
+ if (!t) t = s + strlen(s);
+ if (soap_send_raw(soap, s, t - s)) return soap->error;
+ s = t + 1;
+ } while (*t);
+
+ return SOAP_OK;
+}
+
+
+static int glite_gsplugin_posthdr(struct soap *soap, const char *key, const char *val) {
+ if (key) {
+ if (strcmp(key, "Status") == 0) {
+ snprintf(soap->tmpbuf, sizeof(soap->tmpbuf), "HTTP/%s", soap->http_version);
+ if (http_send_header(soap, soap->tmpbuf)) return soap->error;
+ if (val && (soap_send_raw(soap, " ", 1) || http_send_header(soap, val)))
+ return soap->error;
+ } else {
+ if (http_send_header(soap, key)) return soap->error;
+ if (val && (soap_send_raw(soap, ": ", 2) || http_send_header(soap, val)))
+ return soap->error;
+ }
+ }
+
+ return soap_send_raw(soap, "\r\n", 2);
+}
goto end;
}
}
- if (count == 0 && tl == 0 && errno == 0)
- return EDG_WLL_GSS_ERROR_EOF;
+
+ if (count==0) {
+ if (tl==0)
+ return EDG_WLL_GSS_ERROR_EOF;
+ else goto end;
+ }
tmp=realloc(t, tl + count);
if (tmp == NULL) {
errno = ENOMEM;
int retry = _EXPIRED_ALERT_RETRY_COUNT;
maj_stat = min_stat = min_stat2 = req_flags = 0;
+ memset(connection, 0, sizeof(*connection));
/* GSI specific */
req_flags = GSS_C_GLOBUS_SSL_COMPATIBLE;
} while (retry);
- memset(connection, 0, sizeof(*connection));
connection->sock = sock;
connection->context = context;
servername = NULL;
int ret;
maj_stat = min_stat = min_stat2 = 0;
+ memset(connection, 0, sizeof(*connection));
/* GSI specific */
ret_flags = GSS_C_GLOBUS_SSL_COMPATIBLE;
goto end;
}
- memset(connection, 0, sizeof(*connection));
connection->sock = sock;
connection->context = context;
memset(&output_token, 0, sizeof(output_token.value));
/* XXX cleanup */
return ret;
+
maj_stat = gss_unwrap(&min_stat, connection->context, &input_token,
&output_token, NULL, NULL);
gss_release_buffer(&min_stat, &input_token);