A working proxy exists.
This commit is contained in:
10
proxy/handleValidateJob.go
Normal file
10
proxy/handleValidateJob.go
Normal file
@@ -0,0 +1,10 @@
|
||||
package main
|
||||
|
||||
import "ippserver/packages/ipp"
|
||||
|
||||
func handleValidateJob(r *ipp.Request) *ipp.Response {
|
||||
response := ipp.NewResponse(ipp.SuccessfulOk, r.RequestID())
|
||||
response.AddOperatonAttribute(ipp.NewCharSetValue("attributes-charset", "utf-8"))
|
||||
response.AddOperatonAttribute(ipp.NewNaturalLanguage("attributes-natural-language", "en"))
|
||||
return response
|
||||
}
|
||||
46
proxy/handlegetjobattributes.go
Normal file
46
proxy/handlegetjobattributes.go
Normal file
@@ -0,0 +1,46 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"fmt"
|
||||
"ippserver/packages/ipp"
|
||||
"net/http"
|
||||
|
||||
log "github.com/sirupsen/logrus"
|
||||
)
|
||||
|
||||
func handleGetJobAttributes(r *ipp.Request, requestID uint32) *ipp.Response {
|
||||
|
||||
request := ipp.NewRequest(ipp.GetJobAttributes, 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("job-id"))
|
||||
request.AddOperatonAttribute(r.GetAttribute("requesting-user-name"))
|
||||
request.AddOperatonAttribute(r.GetAttribute("requested-attributes"))
|
||||
|
||||
log.Infof("Downstream request\n%v\n", request)
|
||||
|
||||
downStreamRequest := request.Marshal()
|
||||
b := bytes.NewBuffer(downStreamRequest)
|
||||
|
||||
downStreamResponse, err := http.Post("http://"+"brn30055cb5e3ae.local:631/ipp/print", "application/ipp", b)
|
||||
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"))
|
||||
response.AddJobAttribute(rb.GetAttribute("job-id"))
|
||||
response.AddJobAttribute(rb.GetAttribute("job-name"))
|
||||
response.AddJobAttribute(rb.GetAttribute("job-originating-user-name"))
|
||||
response.AddJobAttribute(rb.GetAttribute("job-state"))
|
||||
response.AddJobAttribute(rb.GetAttribute("job-state-reasons"))
|
||||
|
||||
return response
|
||||
}
|
||||
47
proxy/handlegetjobs.go
Normal file
47
proxy/handlegetjobs.go
Normal file
@@ -0,0 +1,47 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"fmt"
|
||||
"ippserver/packages/ipp"
|
||||
"net/http"
|
||||
|
||||
log "github.com/sirupsen/logrus"
|
||||
)
|
||||
|
||||
func handleGetJobs(r *ipp.Request, requestID uint32) *ipp.Response {
|
||||
|
||||
request := ipp.NewRequest(ipp.GetJobs, 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("requested-attributes"))
|
||||
|
||||
log.Infof("Downstream request\n%v\n", request)
|
||||
|
||||
downStreamRequest := request.Marshal()
|
||||
b := bytes.NewBuffer(downStreamRequest)
|
||||
|
||||
downStreamResponse, err := http.Post("http://"+"brn30055cb5e3ae.local:631/ipp/print", "application/ipp", b)
|
||||
if err != nil {
|
||||
fmt.Print(err)
|
||||
}
|
||||
|
||||
//log.Printf("response HTTP status: %v %v", downStreamResponse.StatusCode, downStreamResponse.Status)
|
||||
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"))
|
||||
a := rb.GetAttribute("job-id")
|
||||
response.AddJobAttribute(a)
|
||||
response.AddJobAttribute(rb.GetAttribute("job-name"))
|
||||
response.AddJobAttribute(rb.GetAttribute("job-originating-user-name"))
|
||||
response.AddJobAttribute(rb.GetAttribute("job-state"))
|
||||
response.AddJobAttribute(rb.GetAttribute("job-state-reasons"))
|
||||
|
||||
return response
|
||||
}
|
||||
36
proxy/handlegetprinterattributes.go
Normal file
36
proxy/handlegetprinterattributes.go
Normal file
@@ -0,0 +1,36 @@
|
||||
package main
|
||||
|
||||
import "ippserver/packages/ipp"
|
||||
|
||||
func handleGetPrinterAttributes(r *ipp.Request) *ipp.Response {
|
||||
response := ipp.NewResponse(ipp.SuccessfulOk, r.RequestID())
|
||||
|
||||
response.AddOperatonAttribute(ipp.NewCharSetValue("attributes-charset", "utf-8"))
|
||||
response.AddOperatonAttribute(ipp.NewNaturalLanguage("attributes-natural-language", "en"))
|
||||
|
||||
response.AddPrinterAttribute(ipp.NewURIValue("printer-uri", "ipp://drpork:1234/ipp/print"))
|
||||
response.AddPrinterAttribute(ipp.NewtextWithoutLanguage("printer-make-and-model", "ChroBroPrint"))
|
||||
response.AddPrinterAttribute(ipp.NewEnum("printer-state", int32(ipp.Idle)))
|
||||
response.AddPrinterAttribute(ipp.NewEnum("operations-supported", int32(ipp.PrintJob), int32(ipp.ValidateJob), int32(ipp.CancelJob), int32(ipp.GetJobAttributes), int32(ipp.GetJobs), int32(ipp.GetPrinterAttributes)))
|
||||
response.AddPrinterAttribute(ipp.NewKeyWord("printer-state-reasons", "none"))
|
||||
response.AddPrinterAttribute(ipp.NewKeyWord("ipp-versions-supported", "1.0", "1.1", "2.0"))
|
||||
response.AddPrinterAttribute(ipp.NewKeyWord("ipp-features-supported", "wfds-print-1.0"))
|
||||
response.AddPrinterAttribute(ipp.NewMimeMediaType("document-format-supported", "image/pwg-raster"))
|
||||
response.AddPrinterAttribute(ipp.NewKeyWord("media-supported", "iso_a4_210x297mm"))
|
||||
response.AddPrinterAttribute(ipp.NewKeyWord("media-default", "iso_a4_210x297mm"))
|
||||
response.AddPrinterAttribute(ipp.NewKeyWord("output-mode-supported", "color", "auto", "monochrome"))
|
||||
response.AddPrinterAttribute(ipp.NewKeyWord("output-mode-default", "color"))
|
||||
response.AddPrinterAttribute(ipp.NewBoolean("color-supported", true))
|
||||
response.AddPrinterAttribute(ipp.NewKeyWord("sides-supported", "one-sided", "two-sided-long-edge", "two-sided-short-edge"))
|
||||
response.AddPrinterAttribute(ipp.NewKeyWord("print-color-mode-supported", "auto", "color", "monochrome"))
|
||||
response.AddPrinterAttribute(ipp.NewKeyWord("job-creation-attributes-supported", "copies", "finishings", "ipp-attribute-fidelity",
|
||||
"job-name", "media", "media-col", "orientation-requested", "output-bin", "output-mode", "print-quality", "printer-resolution",
|
||||
"requesting-user-name", "sides", "print-color-mode"))
|
||||
response.AddPrinterAttribute(ipp.NewEnum("print-quality-supported", int32(4), int32(5))) //normal,high
|
||||
res1 := ipp.Resolution{CrossFeedResolution: 600, FeedResolution: 600, Unit: 3}
|
||||
res2 := ipp.Resolution{CrossFeedResolution: 2400, FeedResolution: 600, Unit: 3}
|
||||
response.AddPrinterAttribute(ipp.NewSetOfResolution("printer-resolution-default", res1))
|
||||
response.AddPrinterAttribute(ipp.NewSetOfResolution("printer-resolution-supported", res1, res2))
|
||||
response.AddPrinterAttribute(ipp.NewBoolean("printer-is-accepting-jobs", true))
|
||||
return response
|
||||
}
|
||||
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
|
||||
}
|
||||
79
proxy/main.go
Normal file
79
proxy/main.go
Normal file
@@ -0,0 +1,79 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"context"
|
||||
"ippserver/packages/ipp"
|
||||
"ippserver/packages/mdnsserver"
|
||||
"net/http"
|
||||
"sync"
|
||||
|
||||
log "github.com/sirupsen/logrus"
|
||||
)
|
||||
|
||||
func main() {
|
||||
customFormatter := new(log.TextFormatter)
|
||||
customFormatter.TimestampFormat = "2006-01-02 15:04:05"
|
||||
log.SetFormatter(customFormatter)
|
||||
customFormatter.FullTimestamp = true
|
||||
log.SetLevel(log.InfoLevel)
|
||||
|
||||
ctx, cancel := context.WithCancel(context.Background())
|
||||
defer cancel()
|
||||
go mdnsserver.Run(ctx)
|
||||
|
||||
http.HandleFunc("/ipp/print", handle)
|
||||
|
||||
log.Info("http server started on :1234")
|
||||
err := http.ListenAndServe(":1234", nil)
|
||||
if err != nil {
|
||||
log.Fatal("ListenAndServe: " + err.Error())
|
||||
}
|
||||
}
|
||||
|
||||
var mut sync.Mutex
|
||||
var requestID uint32
|
||||
|
||||
func handle(w http.ResponseWriter, r *http.Request) {
|
||||
mut.Lock()
|
||||
requestID++
|
||||
mut.Unlock()
|
||||
if r.Method != http.MethodPost {
|
||||
http.Error(w, "Unsupported method", http.StatusMethodNotAllowed)
|
||||
|
||||
}
|
||||
//log.Info(r.Header)
|
||||
//body := make([]byte, r.ContentLength)
|
||||
//io.ReadFull(r.Body, body)
|
||||
//log.Infof("Body %x", body)
|
||||
|
||||
request := ipp.NewRequest(0, 0)
|
||||
//rdata := make([]byte, r.ContentLength)
|
||||
//io.ReadFull(r.Body, rdata)
|
||||
//log.Printf("Data %x", rdata)
|
||||
//fmt.Printf("data % #0x", rdata)
|
||||
//buf := bytes.NewBuffer(rdata)
|
||||
request.UnMarshal(r.Body)
|
||||
log.Infof("Upstream Request: \n%v\n", request)
|
||||
var response *ipp.Response
|
||||
switch request.Operation() {
|
||||
case ipp.GetPrinterAttributes:
|
||||
response = handleGetPrinterAttributes(request)
|
||||
case ipp.PrintJob:
|
||||
response = handlePrintJob(request, r.Body, requestID)
|
||||
case ipp.GetJobs:
|
||||
response = handleGetJobs(request, requestID)
|
||||
case ipp.ValidateJob:
|
||||
response = handleValidateJob(request)
|
||||
case ipp.GetJobAttributes:
|
||||
response = handleGetJobAttributes(request, requestID)
|
||||
default:
|
||||
response = ipp.NewResponse(ipp.ClientErrorBadRequest, request.RequestID())
|
||||
}
|
||||
|
||||
log.Infof("Upstream Response:\n%v\n", response)
|
||||
data := response.Marshal()
|
||||
|
||||
//log.Debugf("% x", data)
|
||||
w.Write(data)
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user