|
|
|
@ -65,6 +65,9 @@ func httpUpload(client *xmpp.Client, iqc chan xmpp.IQ,
|
|
|
|
|
log.Fatal(err)
|
|
|
|
|
}
|
|
|
|
|
iqDiscoItemsXMLQuery := iqDiscoItemsXML.SelectElement("query")
|
|
|
|
|
if iqDiscoItemsXMLQuery == nil {
|
|
|
|
|
log.Fatal("no query element in disco items reply")
|
|
|
|
|
}
|
|
|
|
|
iqDiscoItemsXMLItems := iqDiscoItemsXMLQuery.SelectElements("item")
|
|
|
|
|
|
|
|
|
|
// Check the services reported by disco#items for the http upload service
|
|
|
|
@ -90,10 +93,21 @@ func httpUpload(client *xmpp.Client, iqc chan xmpp.IQ,
|
|
|
|
|
log.Fatal(err)
|
|
|
|
|
}
|
|
|
|
|
iqDiscoInfoXMLQuery := iqDiscoInfoXML.SelectElement("query")
|
|
|
|
|
if iqDiscoInfoXMLQuery == nil {
|
|
|
|
|
continue
|
|
|
|
|
}
|
|
|
|
|
iqDiscoInfoXMLIdentity := iqDiscoInfoXMLQuery.SelectElement("identity")
|
|
|
|
|
if iqDiscoInfoXMLIdentity == nil {
|
|
|
|
|
continue
|
|
|
|
|
}
|
|
|
|
|
iqDiscoInfoXMLType := iqDiscoInfoXMLIdentity.SelectAttr("type")
|
|
|
|
|
if iqDiscoInfoXMLType == nil {
|
|
|
|
|
continue
|
|
|
|
|
}
|
|
|
|
|
iqDiscoInfoXMLCategory := iqDiscoInfoXMLIdentity.SelectAttr("category")
|
|
|
|
|
|
|
|
|
|
if iqDiscoInfoXMLCategory == nil {
|
|
|
|
|
continue
|
|
|
|
|
}
|
|
|
|
|
if iqDiscoInfoXMLType.Value == "file" &&
|
|
|
|
|
iqDiscoInfoXMLCategory.Value == "store" {
|
|
|
|
|
uploadComponent = jid.Value
|
|
|
|
@ -108,8 +122,17 @@ func httpUpload(client *xmpp.Client, iqc chan xmpp.IQ,
|
|
|
|
|
field := r.SelectElements("field")
|
|
|
|
|
for i, t := range field {
|
|
|
|
|
varAttr := t.SelectAttr("var")
|
|
|
|
|
if varAttr == nil {
|
|
|
|
|
continue
|
|
|
|
|
}
|
|
|
|
|
prevFieldVal := field[i-1].SelectElement("value")
|
|
|
|
|
if prevFieldVal == nil {
|
|
|
|
|
continue
|
|
|
|
|
}
|
|
|
|
|
curFieldVal := t.SelectElement("value")
|
|
|
|
|
if curFieldVal == nil {
|
|
|
|
|
continue
|
|
|
|
|
}
|
|
|
|
|
if varAttr.Value == "max-file-size" && prevFieldVal.Text() == nsHTTPUpload {
|
|
|
|
|
maxFileSize, err = strconv.ParseInt(curFieldVal.Text(), 10, 64)
|
|
|
|
|
if err != nil {
|
|
|
|
@ -154,8 +177,17 @@ func httpUpload(client *xmpp.Client, iqc chan xmpp.IQ,
|
|
|
|
|
log.Fatal(err)
|
|
|
|
|
}
|
|
|
|
|
iqHTTPUploadSlotXMLSlot := iqHTTPUploadSlotXML.SelectElement("slot")
|
|
|
|
|
if iqHTTPUploadSlotXMLSlot == nil {
|
|
|
|
|
log.Fatal("http-upload: no slot element")
|
|
|
|
|
}
|
|
|
|
|
iqHTTPUploadSlotXMLPut := iqHTTPUploadSlotXMLSlot.SelectElement("put")
|
|
|
|
|
if iqHTTPUploadSlotXMLPut == nil {
|
|
|
|
|
log.Fatal("http-upload: no put element")
|
|
|
|
|
}
|
|
|
|
|
iqHTTPUploadSlotXMLPutURL := iqHTTPUploadSlotXMLPut.SelectAttr("url")
|
|
|
|
|
if iqHTTPUploadSlotXMLPutURL == nil {
|
|
|
|
|
log.Fatal("http-upload: no url attribute")
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Upload file
|
|
|
|
|
httpClient := &http.Client{}
|
|
|
|
@ -168,6 +200,9 @@ func httpUpload(client *xmpp.Client, iqc chan xmpp.IQ,
|
|
|
|
|
iqHTTPUploadSlotXMLPutHeaders := iqHTTPUploadSlotXMLPut.SelectElements("header")
|
|
|
|
|
for _, h := range iqHTTPUploadSlotXMLPutHeaders {
|
|
|
|
|
name := h.SelectAttr("name")
|
|
|
|
|
if name == nil {
|
|
|
|
|
continue
|
|
|
|
|
}
|
|
|
|
|
switch name.Value {
|
|
|
|
|
case "Authorization", "Cookie", "Expires":
|
|
|
|
|
req.Header.Set(name.Value, h.Text())
|
|
|
|
@ -184,6 +219,12 @@ func httpUpload(client *xmpp.Client, iqc chan xmpp.IQ,
|
|
|
|
|
|
|
|
|
|
// Return http link
|
|
|
|
|
iqHTTPUploadSlotXMLGet := iqHTTPUploadSlotXMLSlot.SelectElement("get")
|
|
|
|
|
if iqHTTPUploadSlotXMLGet == nil {
|
|
|
|
|
log.Fatal("http-upload: no get element")
|
|
|
|
|
}
|
|
|
|
|
iqHTTPUploadSlotXMLGetURL := iqHTTPUploadSlotXMLGet.SelectAttr("url")
|
|
|
|
|
if iqHTTPUploadSlotXMLGetURL == nil {
|
|
|
|
|
log.Fatal("http-upload: no url attribute")
|
|
|
|
|
}
|
|
|
|
|
return iqHTTPUploadSlotXMLGetURL.Value
|
|
|
|
|
}
|
|
|
|
|