A working proxy exists.
This commit is contained in:
69
proxy/handleprintjob.go
Normal file
69
proxy/handleprintjob.go
Normal file
@@ -0,0 +1,69 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"fmt"
|
||||
"io"
|
||||
"ippserver/packages/ipp"
|
||||
"net/http"
|
||||
"net/url"
|
||||
"strings"
|
||||
|
||||
log "github.com/sirupsen/logrus"
|
||||
)
|
||||
|
||||
const printerURI = "brn30055cb5e3ae.local:631/ipp/print"
|
||||
|
||||
func handlePrintJob(r *ipp.Request, byteStream io.Reader, requestID uint32) *ipp.Response {
|
||||
|
||||
// This request is what will be sent to the real printer
|
||||
request := ipp.NewRequest(ipp.PrintJob, requestID)
|
||||
request.AddOperatonAttribute(ipp.NewCharSetValue("attributes-charset", "utf-8"))
|
||||
request.AddOperatonAttribute(ipp.NewNaturalLanguage("attributes-natural-language", "en"))
|
||||
request.AddOperatonAttribute(ipp.NewURIValue("printer-uri", "ipp://"+printerURI))
|
||||
request.AddOperatonAttribute(r.GetAttribute("requesting-user-name"))
|
||||
request.AddOperatonAttribute(r.GetAttribute("job-name"))
|
||||
request.AddOperatonAttribute(ipp.NewMimeMediaType("document-format", "image/pwg-raster"))
|
||||
|
||||
request.AddJobAttribute(r.GetAttribute("sides"))
|
||||
request.AddJobAttribute(r.GetAttribute("media"))
|
||||
request.AddJobAttribute(r.GetAttribute("print-color-mode"))
|
||||
request.AddJobAttribute(r.GetAttribute("printer-resolution"))
|
||||
request.AddJobAttribute(r.GetAttribute("output-bin"))
|
||||
log.Infof("Downstream request\n%v\n", request)
|
||||
|
||||
downStreamRequest := request.Marshal()
|
||||
b := bytes.NewBuffer(downStreamRequest)
|
||||
|
||||
mr := io.MultiReader(b, byteStream)
|
||||
downStreamResponse, err := http.Post("http://"+"brn30055cb5e3ae.local:631/ipp/print", "application/ipp", mr)
|
||||
if err != nil {
|
||||
fmt.Print(err)
|
||||
}
|
||||
|
||||
rb := ipp.NewResponse(0, 0)
|
||||
rb.UnMarshal(downStreamResponse.Body)
|
||||
log.Infof("Downstream response\n%v\n", rb)
|
||||
|
||||
response := ipp.NewResponse(ipp.SuccessfulOk, r.RequestID())
|
||||
response.AddOperatonAttribute(ipp.NewCharSetValue("attributes-charset", "utf-8"))
|
||||
response.AddOperatonAttribute(ipp.NewNaturalLanguage("attributes-natural-language", "en"))
|
||||
jua := rb.GetAttribute("job-uri").(*ipp.URIValue)
|
||||
if jua != nil {
|
||||
u, err := url.Parse(jua.Value())
|
||||
if err != nil {
|
||||
log.Error("could not parse job-uri")
|
||||
}
|
||||
l := strings.Split(u.Path, "/")
|
||||
j := l[len(l)-1]
|
||||
|
||||
joburi := r.GetAttribute("printer-uri").(*ipp.URIValue).Value() + "/" + j
|
||||
log.Infof(">>>>>>>>>>>>>>>>>>>>>>joburi: %v", joburi)
|
||||
response.AddJobAttribute(ipp.NewURIValue("job-uri", joburi))
|
||||
}
|
||||
response.AddJobAttribute(rb.GetAttribute("job-id"))
|
||||
response.AddJobAttribute(rb.GetAttribute("job-state"))
|
||||
response.AddJobAttribute(rb.GetAttribute("job-state-reasons"))
|
||||
|
||||
return response
|
||||
}
|
||||
Reference in New Issue
Block a user